{"version":3,"file":"app.68d4ec6f2b597324b87f.js","mappings":"sPAAO,MACMA,EAAW,yBACXC,EAAgB,qDAChBC,EAA2B,iDAe3BC,EAAW,wBACXC,EAAa,0B,+ICjBnB,MAAMC,EAAe,CAC3BC,WAAY,aACZC,OAAQ,SACRC,OAAQ,SACRC,UAAW,YACXC,eAAgB,iBAChBC,uBAAwB,yBACxBC,YAAa,UACbC,+BAAgC,6BAGnBC,EAA0B,qBAG3BC,EAAO,OACPC,EAAqB,qBAE3B,MAAMC,EACW,gBAACC,GAA+D,IAAxBC,EAAwB,uDAAN,KAC5EC,EAASC,eAAeC,QAAQJ,GACpC,GAAIE,EACH,IACC,OAAOG,KAAKC,MAAMJ,EAGlB,CAFC,MAAOK,GACRC,QAAQC,IAAIF,EACZ,CAGF,OAAON,CACP,CACsB,gBAAID,EAAaU,GAEvC,OADAP,eAAeQ,QAAQX,EAAKK,KAAKO,UAAUF,IACpCA,CACP,CACyB,mBAAIV,GAC7BG,eAAeU,WAAWb,EAC1B,E,EAnBWD,EAAAA,8BAqB+B,KAC1C,IAAK,IAAIe,KAAQ3B,EACZA,EAAa4B,eAAeD,IAC/BX,eAAeU,WAAW1B,EAAa2B,GAExC,I,EA1BUf,EAAAA,WA+BY,eAACiB,EAAD,+DAA+DjB,EAAoBkB,SAASpB,EAAMmB,EAAlG,I,EA/BZjB,EAAAA,WAgCamB,GAAoBnB,EAAoBoB,SAAStB,EAAMqB,K,EAhCpEnB,EAAAA,cAkCe,KAC1BA,EAAoBqB,YAAYvB,GAChCE,EAAoBqB,YAAYtB,EAAhC,I,EApCWC,EAAAA,mBAuCoB,IAAMA,EAAoBoB,SAAShC,EAAaO,YAAa,K,EAvCjFK,EAAAA,uBAwCwB,KACnC,IAAIsB,EAAUtB,EAAoBkB,SAAS9B,EAAaO,aAAa,EAAO,GAC5EK,EAAoBoB,SAAShC,EAAaO,YAAa2B,EAAU,EAAjE,I,EA1CWtB,EAAAA,wBA4CyB,IAAgBA,EAAoBkB,SAAS9B,EAAaO,aAAa,EAAO,IAhD/E,I,EAIxBK,EAAAA,yBA8C0B,eAACiB,EAAD,+DAA8BjB,EAAoBkB,SAASnB,EAAoBkB,EAA/E,I,EA9C1BjB,EAAAA,yBA+C2BuB,GAAuBvB,EAAoBoB,SAASrB,EAAoBwB,K,EA/CnGvB,EAAAA,iBAiDkB,eAACiB,EAAD,+DAA8BjB,EAAoBkB,SAAS9B,EAAaC,WAAY4B,EAApF,I,EAjDlBjB,EAAAA,iBAkDmBwB,GAAyBxB,EAAoBoB,SAAShC,EAAaC,WAAYmC,K,EAlDlGxB,EAAAA,0BAoD2B,SAACyB,GAAD,IAAkBR,EAAlB,+DAA+CjB,EAAoBkB,SAApB,UAAgC9B,EAAaC,WAA7C,YAA2DoC,GAAWR,EAArH,I,EApD3BjB,EAAAA,0BAqD2B,CAACyB,EAAiBD,IAAyBxB,EAAoBoB,SAApB,UAAgChC,EAAaC,WAA7C,YAA2DoC,GAAWD,K,EArD5IxB,EAAAA,aAuDc,eAACiB,EAAD,+DAA8BjB,EAAoBkB,SAAS9B,EAAaE,OAAQ2B,EAAhF,I,EAvDdjB,EAAAA,aAwDe0B,GAAqB1B,EAAoBoB,SAAShC,EAAaE,OAAQoC,K,EAxDtF1B,EAAAA,gCA0DiC,eAACiB,EAAD,+DAA8BjB,EAAoBkB,SAAS9B,EAAaQ,+BAAgCqB,EAAxG,I,EA1DjCjB,EAAAA,gCA2DkC2B,GAAkB3B,EAAoBoB,SAAShC,EAAaQ,+BAAgC+B,K,EA3D9H3B,EAAAA,aA6Dc,eAACiB,EAAD,+DAA8BjB,EAAoBkB,SAAS9B,EAAaG,OAAQ0B,EAAhF,I,EA7DdjB,EAAAA,aA8De4B,GAAqB5B,EAAoBoB,SAAShC,EAAaG,OAAQqC,K,EA9DtF5B,EAAAA,gBAgEiB,eAACiB,EAAD,+DAA8BjB,EAAoBkB,SAAS9B,EAAaI,UAAWyB,EAAnF,I,EAhEjBjB,EAAAA,gBAiEkB6B,GAAwB7B,EAAoBoB,SAAShC,EAAaI,UAAWqC,K,EAjE/F7B,EAAAA,qBAmEsB,eAACiB,EAAD,+DAA8BjB,EAAoBkB,SAAS9B,EAAaK,eAAgBwB,EAAxF,I,EAnEtBjB,EAAAA,qBAoEuB8B,GAAwB9B,EAAoBoB,SAAShC,EAAaK,eAAgBqC,K,EApEzG9B,EAAAA,6BAsE8B,eAACiB,EAAD,+DAA8BjB,EAAoBkB,SAAS9B,EAAaM,uBAAwBuB,EAAhG,I,EAtE9BjB,EAAAA,6BAuE+B+B,GAAgC/B,EAAoBoB,SAAShC,EAAaM,uBAAwBqC,K,EAvEjI/B,EAAAA,gCAyEiC,IAAMA,EAAoBgC,gCAA2BC,K,EAzEtFjC,EAAAA,8BA0EgCW,GAAeX,EAAoBoB,SAASvB,EAAgBc,K,EA1E5FX,EAAAA,8BA2EkC,IAAMA,EAAoBkB,SAASrB,K,+ICtF3E,MAsBDqC,EAAa,oBAOnBC,IAAAA,aAAAA,QAAAA,KAAgCC,IAG3BC,EAAWC,mBAAsBD,EAAWC,kBAAkBC,UAEjEH,EAAOI,QAAQC,uBAA0BnC,KAAKO,UAC7C,CACC6B,MAAOC,EAAO,IAAIC,MAAQC,MAAMC,OAAOZ,MAInCE,KACF5B,GACKuC,QAAQC,OAAOxC,KAI1B2B,IAAAA,aAAAA,SAAAA,KAAiCc,IAEhC,GAAIZ,EAAWC,mBAAsBD,EAAWC,kBAAkBC,QAAQ,CAEzE,GAAIU,EAASb,OAAOc,IAAIC,WAAWC,SA3BF,kBA2BwC,OAAOH,EAEhF,IAAMA,EAASb,OAAOI,QAAQC,yBAA4BQ,EAAST,QAAQa,wBAC1E,OAAOJ,EAGR,MAAMK,EAAiBX,EAAO,IAAIC,MAAQC,MAAMC,OAAOZ,GACjDqB,EAAiBvD,EAAAA,gCAAsD2C,GAAO,IAAIC,MAAOY,YAAY,OAAOX,MAAMC,OAAOZ,GAG/H,GAF8BuB,KAAKC,IAAIf,EAAOW,EAAgBpB,GAAYyB,KAAKhB,EAAOY,EAAgBrB,GAAY,YAEtFG,EAAWC,kBAAkBsB,qBAAsB,OAAOX,EAGtF,IAAIY,EACAC,EACJ,IACCD,EAAqBvD,KAAKC,MAAM0C,EAAST,QAAQa,yBACjDS,EAAoBxD,KAAKC,MAAO0C,EAAiBb,OAAOI,QAAQC,uBAIhE,CAHC,MAAOsB,GAER,OAAOd,CACP,CAGD,MAAMe,EAAqBH,EAAkBnB,MACvCuB,EAAmBJ,EAAkBK,IACrCC,EAAiBL,EAAiBpB,MAClC0B,EAAed,EAIrB,GAH6BG,KAAKC,IAAIf,EAAOyB,EAAclC,GAAYyB,KAAKhB,EAAOwB,EAAgBjC,KAGtEG,EAAWC,kBAAkB+B,iBAAiB,CAC1E,IAAIC,EAAoC,CACvCC,GAAIC,EAAAA,IACJtB,IAAKD,EAASb,OAAOc,IACrBuB,WAAY9B,EAAOwB,EAAgBjC,GAAYwC,cAC/CC,YAAahC,EAAOyB,EAAclC,GAAYwC,cAC9CE,eAAgBjC,EAAOqB,EAAoB9B,GAAYwC,cACvDG,gBAAiBlC,EAAOsB,EAAkB/B,GAAYwC,cACtDI,QAAS,CAACC,KAAMzE,KAAKO,UAAUoC,EAASb,OAAO4C,OAC/C/B,SAAU3C,KAAKO,UAAUoC,EAAS+B,OAGnCC,EAAuBX,EACvB,CACD,CAGD,OAAOrB,CAAP,IACMzC,GACIuC,QAAQC,OAAOxC,KAG1B,MAAMyE,EAA0BC,IAC/B,MAAMC,EAAa,IAAI9C,EAAW,CAAC+C,OAAQ/C,EAAWgD,kBAAmBC,SAAU,KAGnF,OAFAtF,EAAAA,6BAAiD2C,EAAO,IAAIC,MAAQC,MAAMC,OAAOZ,IAE1E,IAAIa,SAAQ,CAACwC,EAASvC,KAC5BmC,EAAWK,KApFkB,+BAoFWN,GAAKO,MAAMxC,IAClDxC,QAAQC,IAAI,uCACZ6E,EAAQtC,EAAR,IAEAyC,OAAOlF,IACPC,QAAQC,IAAI,+BAAgCF,EAA5C,GALD,GADD,EAiBM,MAAM6B,EAIZsD,YAAYvD,GAAiB,uFAoKA,KAC5BpC,EAAAA,aACAA,EAAAA,kBACA4F,OAAOC,SAASC,KAAOC,KAAKC,QAAQV,QAApC,IAtKAS,KAAKC,QAAU5D,CACf,CAKMoD,KAAKS,GAAiE,IAA/CjB,EAA+C,uDAAnC,CAAC,EAAGkB,EAA+B,uDAAN,KAClEC,EAAUJ,KACVK,EAAcL,KAAKM,4BAEnBH,GACHI,OAAOC,KAAKL,GAAmBM,KAAIC,IAClCL,EAAY5D,QAAQiE,GAAKP,EAAkBO,EAA3C,IAIF,IAAIrB,EAASW,KAAKC,QAAQZ,OAE1B,OAAO,IAAIrC,SAAQ,CAACwC,EAASvC,KAC5Bb,IAAAA,KAAW4D,KAAKW,WAAWtB,EAAQa,GAAWjB,EAAMoB,GAClDX,MAAK,SAAUxC,GACfkD,EAAQQ,8BAA8B1D,EAAUD,EAAQmD,EAAQO,WAAWtB,EAAQa,GAAWG,GAC9FpG,EAAAA,kBACAuF,EAAQtC,EAAS+B,KACjB,IACAU,OAAM,SAAUlF,GAChBC,QAAQC,IAAI,wBAAyBF,GACrC,IAAIoG,EAAuBT,EAAQU,eAAerG,GAClD2F,EAAQW,4BAA4B9D,EAAQxC,EAAOoG,EACnD,GAVF,GAYD,CAEMG,IAAId,GAA6C,IAA3Be,EAA2B,uDAAJ,GAC/Cb,EAAUJ,KACVkB,EAAYlB,KAAKmB,aAAaF,GAC9B9D,EAAM6C,KAAKW,WAAWX,KAAKC,QAAQZ,OAAQa,GAAYgB,EACvDb,EAAcL,KAAKM,4BAEvB,OAAO,IAAItD,SAAQ,CAACwC,EAASvC,KAC5Bb,IAAAA,IAAUe,EAAKkD,GACbX,MAAK,SAAUxC,GACfkD,EAAQQ,8BAA8B1D,EAAUD,EAAQE,EAAKkD,GAC7DpG,EAAAA,kBACAuF,EAAQtC,EAAS+B,KACjB,IACAU,OAAM,SAAUlF,GAChBC,QAAQC,IAAI,uBAAwBF,GACpC,IAAIoG,EAAuBT,EAAQU,eAAerG,GAClD2F,EAAQW,4BAA4B9D,EAAQxC,EAAOoG,EACnD,GAVF,GAYD,CAEOD,8BAA8B1D,EAAUD,EAAQmE,EAAYf,GAC/DL,KAAKqB,0BAA0BnE,KAElC8C,KAAKsB,gCAAgCF,EAAYf,GACjDpD,EAAO,CAAEsE,QAAS,oBAEnB,CAEOF,0BAA0BnE,GACjC,IAAKA,EAASsE,SAAWtE,EAAS+B,KACjC,OAAO,EAER,MAAMwC,EAAevE,EAAS+B,KAAK7B,WAEnC,QAAwB,MAApBF,EAASsE,SAAkBC,IAAgBA,EAAaC,WAAW,sDAMvE,CAEOJ,gCAAgCK,EAAmBtB,GACtDL,KAAKC,QAAQ2B,0BAChBxF,IAAAA,KACC4D,KAAKW,WAAWX,KAAKC,QAAQZ,OAAQW,KAAKC,QAAQ2B,0BAClD,CACCzE,IAAKwE,GAENtB,EAGF,CAEOU,4BAA4B9D,EAAQxC,EAAOoG,GAClD,GAAIpG,EAAMyC,UAAYzC,EAAMyC,SAAS+B,KAAM,CAC1C,IAAIwC,EAAehH,EAAMyC,SAAS+B,KAClChC,EAAO,CACNsE,QAASE,EAAaF,QACtBM,OAAQJ,EAAaI,QAEtB,MAEA5E,EAAO,CACNsE,QAASV,EAnO2B,eACL,wCAmO/BgB,OAAQ,CAAC,GAGX,CAEOlB,WAAWtB,EAAQa,GAC1B,OAAOb,EAASa,CAChB,CAEOiB,aAAaF,GACpB,IAAIC,EAAY,GAWhB,OAVAD,EAAOa,SAAQC,IAEbb,GADiB,KAAdA,EACU,IAGA,IAGdA,GAAaa,EAAQC,KAAO,IAAMD,EAAQnH,KAA1C,IAEMsG,CACP,CAEOZ,4BACP,MAAQ,CACP7D,QAAS,CAAE,cAAiB,UAAYuD,KAAKiC,YAE9C,CAEOA,WACP,IAAI7G,EAAOnB,EAAAA,UACX,OAAQmB,GAAQA,EAAK8G,YAAc9G,EAAK8G,WAAWC,aAChD/G,EAAK8G,WAAWC,aAChB,EACH,CAEOrB,eAAerG,GACtB,IAAIoG,GAAuB,EAuB3B,OAtBIpG,EAAMyC,UAAYzC,EAAMyC,SAASsE,SACN,MAA1B/G,EAAMyC,SAASsE,OAClBxB,KAAKoC,qBAE6B,MAA1B3H,EAAMyC,SAASsE,SAET,KADFxB,KAAKiC,WAEhBjC,KAAKoC,sBAGLvB,GAAuB,EACvB5G,EAAAA,sBAEIA,EAAAA,uBACH+F,KAAKoC,qBAGLvC,OAAOwC,QAAQC,UAKZzB,CACP,E,0HAtKWvE,EAAAA,yBAAAA,G,EAAAA,EAAAA,yBAAAA,GChIN,MAAMiG,EAGZ3C,YAAYR,GAAwB,6CAIpBhE,GACR4E,KAAKwC,YAAY/C,KAAK,iBAAkB,CAAEgD,SAAUrH,EAAKsH,SAAUC,SAAUvH,EAAKwH,aALtD,iBAQpB,IACR5C,KAAKwC,YAAY/C,KAAK,wBATM,qBAYfrE,GACb4E,KAAKwC,YAAY/C,KAAK,sBAAuBrE,KAbjB,iCAmBJ,IACxB4E,KAAKwC,YAAYxB,IAAjB,qCApB4B,yBA0BX6B,GAAoC7C,KAAKwC,YAAY/C,KAAK,0BAA2BoD,KA1B1E,wBA+BZA,GAAmC7C,KAAKwC,YAAY/C,KAAK,yBAA0BoD,KA/BvE,uBAoCbA,GAAkC7C,KAAKwC,YAAY/C,KAAK,wBAAyBoD,KApCpE,+BAyCLC,GAAkB9C,KAAKwC,YAAYxB,IAAI,gCAAkC8B,KAzCpE,uBAyDbC,IACtB,IAAI9B,EAAS,CAAE,CAAEe,KAAM,IAAKpH,MAAOoI,mBAAmBD,KACtD,OAAO/C,KAAKwC,YAAYxB,IAAI,gBAAiBC,EAA7C,IA3DmC,iCA8DJ,IACxBjB,KAAKwC,YAAYxB,IAAI,gBAAiB,MA9D7ChB,KAAKwC,YAAcpD,CACnB,CA4CM6D,sBAAsBC,EAAsBC,EAAuB5D,GAEzE,OADyB,IAAIjD,EAAY,CAAE+C,OAAQ6D,EAAsB3D,SAAUA,IACzDyB,IAAI,6BAA8B,IACvDtB,MAAKxC,IACL2C,OAAOC,SAASC,KAAOoD,EAAwB,QAAgBjG,EAAU6F,YAAzE,IAEApD,OAAMlF,IACN,MAAMA,CAAN,GAEL,E,oBC/CF,SAAS2I,EAAT,GAA6G,IAA/F,aAAEL,EAAF,WAAgB3D,EAAhB,cAA4BiE,EAA5B,iBAA2CC,EAA3C,uBAA6DC,GAAkC,EAExGC,EAAsBC,mBAAmBV,GACzCW,EAAU,IAAInB,EAAQnD,GACtBuE,GAAWC,EAAAA,EAAAA,MAEf,MAAOrC,EAASsC,GAAcC,EAAAA,SAAe,qBAoB7C,OAlBAA,EAAAA,WAAgB,KACMC,WAEpB,IACC,MAAMC,QAAiBN,EAAQO,aAAaT,GAC5CD,EAAuBS,GACvBL,EAASL,EAAkB,CAAEY,SAAS,GAKtC,CAJC,MAAOzJ,GACRC,QAAQD,MAAMA,GACdoJ,EAAW,0CAAD,OAA2CpJ,EAAM8G,SAE3D,GAGF0C,EAAc,IAKd,gCACE1C,EAIH,C,EC5C8B4C,IAC7B,IAAI/I,EAAOnB,EAAAA,UACX,QAAQmB,GAAQA,EAAKA,KAAKgJ,OAAOC,QAAQF,IAAU,CAAnD,G,EAHWG,kB,EAAN,S,sFCQP,IAAIC,EAAcT,EAAAA,cAAqC,MAsBvD,SAASU,IACR,OAAOV,EAAAA,WAAiBS,EACxB,CAGD,QAzBA,YAAmE,IAA7C,SAAEE,GAA2C,EAC9DC,EAAczK,EAAAA,WACbmB,EAAMuJ,GAAWb,EAAAA,SAAoBY,GAatC9J,EAAQ,CAAEQ,OAAMwJ,OAXNZ,IACb/J,EAAAA,QAA4B+J,GAC5BW,EAAQX,EAAR,EAS2Ba,QANd,KACb5K,EAAAA,aACA0K,EAAQ,MACR9E,OAAOC,SAASC,KAAO/G,CAAvB,GAKD,OAAO,gBAACuL,EAAYO,SAAb,CAAsBlK,MAAOA,GAAQ6J,EAC5C,EC9BD,EAAe,IAA0B,gB,wHCElC,MAAMM,EAAsB,IACtBC,EAAyB,MA+B/B,MAAMC,EAGTrF,cAAkC,eAAtBsF,EAAsB,uDAAJ,GAAI,2CAYtB,IAAelF,KAAKkF,MAAMC,OAAS,IAZb,iBAmBzB,KACL,GAAInF,KAAKoF,YACL,OAAO,IAAIH,ECsDhB,SAAsBI,EAAYC,GACxC,IAAKD,EACJ,MAAO,GAER,MAAME,EAAOF,EAAMF,OD1DmD,EC2DtE,OAAII,EAAO,EACH,GAEDF,EAAMG,MAAM,EAAGD,EACtB,CD/DoCE,CAAsBzF,KAAKkF,OAGxD,IAxB8B,mBAsDtBQ,IACR,MAAMC,EAAWD,EAAQ,EACzB,OAAIC,EAAW,EACJ,IAAIV,EAER,IAAIA,EAAcjF,KAAKkF,MAAMM,MAAM,EAAGG,GAA7C,IA3D8B,eAwE1BC,IACkB,IAAlBA,EAAOT,QAGXnF,KAAKkF,MAAMW,KACY,IAAlBD,EAAOT,OACFS,EAAO,GACN,IAAMA,EAAOE,KAhHI,MAgHyB,IAHrD,IA5E8B,iBAwFzB,KACL,IAAIC,EAAO,GACX,IAAK,IAAIC,EAAI,EAAGA,EAAIhG,KAAKkF,MAAMC,OAAQa,IACnCD,GAAQhB,EAAsB/E,KAAKkF,MAAMc,GAG7C,OAAOD,CAAP,IA9F8B,oBAwGtB,WAAoC,IAAnCE,EAAmC,uDAAf,GACxBA,GAA2B,KAAdA,IACdA,EAAYjB,GAEhB,MAAMkB,EAAS,EAAKA,SACdH,EAAOG,GAAUA,EAAOC,UAAY,GAC1C,IAAIC,EAAQ,EAAKC,cAQjB,OANAD,EAAQL,EAAOhB,EAAsBqB,EACjCA,EAAM1E,WAAWqD,KACjBqB,EAAQA,EAAME,UAAU,IAIrBF,EAAMlC,QAAQ,IAAIqC,OAAJ,YAAgBxB,GAAuB,MAAOkB,EACtE,IAvHiC,iBAkIzB,IACqB,IAAtBjG,KAAKkF,MAAMC,OACJ,GAEJF,EAAcuB,eCvGA,SAAInB,GAAwE,IAA7DoB,EAA6D,uDAAjC,KAAMC,EAA2B,uDAAT,KAC/F,GAAIrB,GAASsB,MAAMC,QAAQvB,GAC1B,IAAK,IAAIwB,EAAIxB,EAAMF,OAAS,EAAG0B,GAAK,EAAGA,IACtC,IAAKJ,GAAaA,EAAUpB,EAAMwB,IACjC,OAAOxB,EAAMwB,GAEhB,OAAOH,CACP,CDgG2CjB,CAA0BzF,KAAKkF,MAAO,KAAM,OAtIlD,sBAmKpB,KACV,MAAMU,EAAS5F,KAAK4F,SACpB,OAAsB,IAAlBA,EAAOT,OACA,GAEe,IAAlBS,EAAOT,OACTS,EAAO,GACN,IAAMA,EAAOE,KAAK,MAAQ,GAFjC,IAvKA9F,KAAKkF,MAAQ,IAAIA,EACpB,CAgJoB,sBAAC4B,GAClB,OAAIA,EAAKpF,WAAW,MAAQoF,EAAKC,SAAS,KAC/BD,EAAKR,UAAU,EAAGQ,EAAK3B,OAAS,GAAG6B,MArLlB,MAwLrB,CAACF,EACX,E,EA3JQ7B,EAAAA,YAkCUc,IACf,MAAMb,GAASa,GAAQ,IAAIiB,MAAMjC,GAAqBkC,QAAOC,GAAW,KAANA,IAClE,OAAO,IAAIjC,EAAcC,EAAzB,I,EApCKD,EAAAA,eA4CY,CAAmDkC,EAAkBC,KACtF,MAAMH,EAAkBE,EAAQC,GAChC,OAAOH,GAAU,IAAIhC,EAAcgC,EAAO/B,QAAU,IAAID,CAAxD,I,uBEhFR,QAAe,IAA0B,gBC4LlC,SAASoC,EAAwFC,GACpG,MAAO,CAACC,EAAgBC,KACpB,MAAMtN,EAAMoN,EAAaC,GAER,MAAbC,EAAKtN,KACJsN,EAAatN,GAAO,GAExBsN,EAAatN,IAAQ,CAAtB,CAGP,CAGD,MAEauN,GAAc,CACvBC,QAHkB,UAIlBC,QAAS,CAAC,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,UAAW,YAYpH,SAASC,GAASC,GACtB,MAAO,CACHC,UAAWD,EACXE,UAAWF,EACXA,OAAQA,EACRG,QAAS,EAEhB,CACO,MAAMC,GAAgB,CAC1BC,eAAgBN,GAAS,KACzBO,IAAKP,GACLQ,WAAYR,GAAS,KACrBS,QAAST,GAAS,KAClBU,UAAW,CACPC,MAAO,UACPV,OAAQ,YAIFW,GAAwC,CAClDC,KAAM,CAAEC,KAAM,IACdC,OAAQ,CACJC,EAAG,GACHC,EAAG,GACHC,EAAG,GACHC,EAAG,GACHC,IAAK,GAETC,SAAU,SACVC,SAAUzB,GAAYE,SAGnB,SAASwB,KAAiC,IAAtBtB,EAAsB,uDAAL,IAExC,MAAME,EAAYF,EAAS,GACrBuB,EAAS7I,OAAO8I,OAAO,CAAC,EAAGb,IAEjC,MAAO,CACHc,WAAY,CAACxB,UAAWC,EAAWA,UAAWA,EAAWF,OAAQE,GACjEqB,SAEP,CAKM,MAAMG,GAAwC,CACjDC,aAAa,EACbC,gBAAgB,EAChBC,YAAY,GAkBR,SAASC,GAAgBxM,EAAKyM,GAE9B,IAAIC,EAAMC,SAASC,cAAc,KACjCF,EAAI9J,KAAO5C,EACX0M,EAAIG,aAAa,WAAYJ,GAC7BC,EAAII,OACL,CC3PK5C,GAAgBE,IAAD,uBAA6BA,EAAG2C,WAAhC,aAA6B,EAAQC,eAArC,ICAf9C,GAAgBE,IAAD,uBAA6BA,EAAG2C,WAAhC,aAA6B,EAAQC,eAArC,ICAf9C,GAAgBE,IAAD,uBAA6BA,EAAG2C,WAAhC,aAA6B,EAAQC,eAArC,ICsDf9C,GAAgBE,IAAD,uBAA6BA,EAAG6C,yBAAhC,aAA6B,EAAsBpI,IAAnD,ICtDfqF,GAAgBE,IAAD,uBAA6BA,EAAG8C,kBAAhC,aAA6B,EAAerI,IAA5C,ICCJqF,GAAgBE,GAAkCA,EAAG+C,WAAWtI,OCDhEqF,GAAgBE,GAAkCA,EAAGgD,eAAevI,OCAxEqF,GAAgBE,IAAD,uBAA6BA,EAAGiD,sBAAhC,aAA6B,EAAmBxI,IAAhD,ICAtBqF,GAAgBE,IAAD,uBAA6BA,EAAGkD,4BAAhC,aAA6B,EAAyBzI,IAAtD,ICkCJqF,GAAgBE,GAAkCA,EAAGmD,iBAAiB1I,OCDtEqF,GAAgBE,GAAkCA,EAAGoD,IAAI3I,OCRzDqF,GAAgBE,GAAkCA,EAAGqD,SAAS5I,OCpB9DqF,GAAgBE,GAAkCA,EAAGsD,IAAI7I,OCuBzDqF,GAAgBE,GAAkCA,EAAGuD,SAAS9I,OCH9DqF,GAAgBE,GAAkCA,EAAGwD,gBAAgB/I,OCFrEqF,GAAgBE,GAAkCA,EAAGyD,UAAUhJ,OA/B/E,MCiBMiJ,GAAwC,CACjDC,IAAK,CAAChR,IAAK,MAAOkM,MAAO,OACzB+E,KAAM,CAACjR,IAAK,OAAQkM,MAAO,UAC3BgF,IAAK,CAAClR,IAAK,MAAOkM,MAAO,OACzBiF,iBAAkB,CAACnR,IAAK,mBAAoBkM,MAAO,qBACnDkF,SAAU,CAACpR,IAAK,WAAYkM,MAAO,SACnCmF,SAAU,CAACrR,IAAK,WAAYkM,MAAO,YACnCoF,IAAK,CAACtR,IAAK,MAAOkM,MAAO,yBACzBqF,SAAU,CAACvR,IAAK,WAAYkM,MAAO,oBACnCsF,gBAAiB,CAACxR,IAAK,kBAAmBkM,MAAO,uBACjDuF,UAAW,CAACzR,IAAK,YAAakM,MAAO,QACrCwF,IAAK,CAAC1R,IAAK,MAAOkM,MAAOjN,ICqDhB0S,GAAmC,IACzCZ,GAbHa,kBAAmB,CAAE5R,IAAK,oBAAqBkM,MAAO,uBACtD2F,eAAgB,CAAE7R,IAAK,iBAAkBkM,MAAO,oBAChD4F,oBAAqB,CAAE9R,IAAK,sBAAuBkM,MAAO,yBAC1D6F,YAAa,CAAE/R,IAAK,cAAekM,MAAO,gBAC1C8F,WAAY,CAAEhS,IAAK,aAAckM,MAAO,cACxC+F,WAAY,CAAEjS,IAAK,aAAckM,MAAO,YACxCgG,eAAgB,CAAElS,IAAK,iBAAkBkM,MAAO,mBAChDiG,qBAAsB,CAAEnS,IAAK,uBAAwBkM,MAAO,2BAC5DkG,UAAW,CAAEpS,IAAK,YAAakM,MAAO,mBACtCmG,SAAU,CAAErS,IAAK,WAAYkM,MAAO,mBC3GjC,SAASoG,KACf,IAAIC,EAAI5P,KAAK6P,MACb,MAAO,uCAAuCxI,QAAQ,SAAS,SAAUyI,GACxE,IAAI9D,GAAK4D,EAAoB,GAAhB/O,KAAKkP,UAAiB,GAAK,EAExC,OADAH,EAAI/O,KAAKmP,MAAMJ,EAAI,KACL,MAANE,EAAY9D,EAAS,EAAJA,EAAU,GAAMzL,SAAS,GAClD,GACD,CCNM,MAAM0P,GAAsB,IAAIxQ,EAAY,CAAE+C,OAAQpG,EAAesG,SAAUvG,EAAU4I,yBAA0B1I,ICCpH6T,GAGY,gCAHZA,GAIsB,0CAJtBA,GAKiC,qDALjCA,GAMkC,sDANlCA,GAOoB,wCAPpBA,GAQsB,0CARtBA,GASc,kCATdA,GAUwB,4CAVxBA,GAWsB,0CAXtBA,GAYwB,4CAZxBA,GAae,oCAbfA,GAcyB,6CAdzBA,GAeY,iCAfZA,GAgBsB,0CAhBtBA,GAiBa,iCAjBbA,GAkBuB,2CAlBvBA,GAmBc,kCAnBdA,GAoBwB,4CApBxBA,GAqBoB,wCArBpBA,GAsB8B,kDAtB9BA,GAuBoB,wCAvBpBA,GAwB8B,kDAxB9BA,GAyBY,gCAzBZA,GA0BsB,0CA1BtBA,GA4B+B,mDAMrC,IAAIC,GAAgD,KAE7C,MAAMC,GAA8BlJ,MAAOmJ,EAAoBC,KAC1C,MAAvBH,KACHA,SAA6BF,GAAAA,IApCD,8CA2CF,MAAvBE,GAEczM,OAAO8I,OAAO,CAAC,KAAM2D,GAAoB/F,QAAO3B,GAAKA,EAAE8H,OAAOC,cAAchQ,SAAS6P,KAAgB5H,EAAEgI,SAAWH,IAASA,KAAO1M,KAAI6E,GACrI,OAAhBA,EAAEiI,UAAsB,CAAE,CAACjI,EAAEkI,WAAH,UAAkBlI,EAAEmI,UAApB,aAAkCnI,EAAEiI,YAAkB,CAAE,CAACjI,EAAEkI,WAAH,UAAkBlI,EAAEmI,eAOlG,CAAC,GAIIC,GAAkB,eAACC,EAAD,+DAC9Bb,GAAAA,KAAyBC,GAAwB,CAAEY,WADrB,EAGlBC,GAA4B,eAACD,EAAD,+DACxCb,GAAAA,KAAyBC,GAAkC,CAAEY,WADrB,EAG5BE,GAAuC,eAACF,EAAD,+DACnDb,GAAAA,KAAyBC,GAA6C,CAAEY,WADrB,EAGvCG,GAAwC,eAACH,EAAD,+DACpDb,GAAAA,KAAyBC,GAA8C,CAAEY,WADrB,EAGxCI,GAAqC,eAACJ,EAAD,+DACjDb,GAAAA,KAAyBC,GAA2C,CAAEY,WADrB,EAGrCK,GAA0B,eAACL,EAAD,wDAA2BvN,EAA3B,uCAAyC6N,EAAzC,8CACtCnB,GAAAA,KAAyBC,GAAgC,CAAEY,UAASvN,UAAS6N,eADvC,EAG1BC,GAA4B,eAACP,EAAD,wDAA2BvN,EAA3B,uCAAyC6N,EAAzC,8CACxCnB,GAAAA,KAAyBC,GAAkC,CAAEY,UAASvN,UAAS6N,eADvC,EAG5BE,GAAoB,eAACR,EAAD,+DAChCb,GAAAA,KAAyBC,GAA0B,CAAEY,WADrB,EAGpBS,GAA8B,eAACT,EAAD,+DAC1Cb,GAAAA,KAAyBC,GAAoC,CAAEY,WADrB,EAG9BU,GAA4B,eAACV,EAAD,wDAA2BvN,EAA3B,uCAAyC6N,EAAzC,8CACxCnB,GAAAA,KAAyBC,GAAkC,CAAEY,UAASvN,UAAS6N,eADvC,EAG5BK,GAA8B,eAACX,EAAD,wDAA2BvN,EAA3B,uCAAyC6N,EAAzC,8CAC1CnB,GAAAA,KAAyBC,GAAoC,CAAEY,UAASvN,UAAS6N,eADvC,EAG9BM,GAAqB,eAACZ,EAAD,+DACjCb,GAAAA,KAAyBC,GAA2B,CAAEY,WADrB,EAGrBa,GAA+B,eAACb,EAAD,+DAC3Cb,GAAAA,KAAyBC,GAAqC,CAAEY,WADrB,EAG/Bc,GAAkB,eAACd,EAAD,+DAC9Bb,GAAAA,KAAyBC,GAAwB,CAAEY,WADrB,EAGlBe,GAA4B,eAACf,EAAD,+DACxCb,GAAAA,KAAyBC,GAAkC,CAAEY,WADrB,EAG5BgB,GAAmB,eAAChB,EAAD,+DAC/Bb,GAAAA,KAAyBC,GAAyB,CAAEY,WADrB,EAGnBiB,GAA6B,eAACjB,EAAD,+DACzCb,GAAAA,KAAyBC,GAAmC,CAAEY,WADrB,EAG7BkB,GAAoB,eAAClB,EAAD,+DAChCb,GAAAA,KAAyBC,GAA0B,CAAEY,WADrB,EAGpBmB,GAA8B,eAACnB,EAAD,+DAC1Cb,GAAAA,KAAyBC,GAAoC,CAAEY,WADrB,EAG9BoB,GAA0B,eAACpB,EAAD,+DACtCb,GAAAA,KAAyBC,GAAgC,CAAEY,WADrB,EAG1BqB,GAAoC,eAACrB,EAAD,+DAChDb,GAAAA,KAAyBC,GAA0C,CAAEY,WADrB,EAGpCsB,GAA0B,eAACtB,EAAD,+DACtCb,GAAAA,KAAyBC,GAAgC,CAAEY,WADrB,EAG1BuB,GAAoC,eAACvB,EAAD,+DAChDb,GAAAA,KAAyBC,GAA0C,CAAEY,WADrB,EAEpCwB,GAAkB,eAACxB,EAAD,+DAC9Bb,GAAAA,KAAyBC,GAAwB,CAAEY,WADrB,EAGlByB,GAA4B,eAACzB,EAAD,+DACxCb,GAAAA,KAAyBC,GAAkC,CAAEY,WADrB,ECnIlC,IAAK0B,GAWAC,GCdG,SAASC,KACtB,OAAO,IAAIC,OAAO,IAA0B,6CAC9C,E,SDCYH,GAAAA,EAAAA,EAAAA,KAAAA,GAAAA,OAAAA,EAAAA,EAAAA,MAAAA,GAAAA,QAAAA,EAAAA,EAAAA,UAAAA,GAAAA,YAAAA,EAAAA,EAAAA,cAAAA,GAAAA,e,EAAAA,KAAAA,GAAAA,CAAAA,I,SAWAC,GAAAA,EAAAA,EAAAA,KAAAA,GAAAA,OAAAA,EAAAA,EAAAA,MAAAA,GAAAA,QAAAA,EAAAA,EAAAA,UAAAA,GAAAA,YAAAA,EAAAA,EAAAA,YAAAA,GAAAA,a,EAAAA,KAAAA,GAAAA,CAAAA,IEXL,MAAMG,GAAiB,IAAInT,EAAY,CAAE+C,OAAQpG,EAAesG,SAAUvG,EAAU4I,yBAA0B1I,ICsDrH,GAtCO,MAC2B,kCAACwW,EAA4BC,GAC7D,OAAOF,GAAehQ,KAjBK,wCAiBmC,CAAEiQ,qBAAoBC,WACpF,CAEwC,0CAACC,EAA+BD,GACxE,OAAOF,GAAehQ,KApBa,gDAoBmC,CAAEmQ,wBAAuBD,WAC/F,CAEmC,qCAACD,EAA4BC,EAAkBE,GAClF,OAAOJ,GAAehQ,KAvBQ,2CAuBmC,CAAEiQ,qBAAoBC,UAASE,iBAChG,CAEiC,mCAACH,EAA4BC,EAAkBE,GAChF,OAAOJ,GAAehQ,KA1BM,yCA0BmC,CAAEiQ,qBAAoBC,UAASE,iBAC9F,CAEgC,kCAACH,EAA4BC,EAAkBE,GAC/E,OAAOJ,GAAehQ,KA7BK,wCA6BmC,CAAEiQ,qBAAoBC,UAASE,iBAC7F,CAEkC,oCAACH,EAA4BC,EAAkBE,GACjF,OAAOJ,GAAehQ,KAhCO,0CAgCmC,CAAEiQ,qBAAoBC,UAASE,iBAC/F,CAEwC,0CAACH,EAA4BC,EAAkBE,GACvF,OAAOJ,GAAehQ,KAnCa,gDAmCmC,CAAEiQ,qBAAoBC,UAASE,iBACrG,CAEwC,0CAACH,EAA4BC,EAAkBE,GACvF,OAAOJ,GAAehQ,KAtCa,gDAsCmC,CAAEiQ,qBAAoBC,UAASE,iBACrG,CAEgC,kCAACH,EAA4BC,EAAkBE,GAC/E,OAAOJ,GAAehQ,KAzCK,wCAyCmC,CAAEiQ,qBAAoBC,UAASE,iBAC7F,GC3CF,IAAIC,GAAqB,KACrBC,GAAW,CAAC,EAwEhB,SAASC,GAAyBC,EAAyBC,GACvD,MAAM1R,EAAKgO,KASX,OARAuD,GAASvR,GAAM,CAAC,EAChBuR,GAASvR,GAAI2R,QAAU,IAAInT,SAAQ,CAACwC,EAASvC,KAZjD,IAAc8B,IAaD,CAAEP,KAAIyR,OAAMC,WAZrBJ,GAAOM,YAAYrR,GAcfgR,GAASvR,GAAIgB,QAAUA,EACvBuQ,GAASvR,GAAIvB,OAASA,CAAtB,IAGG8S,GAASvR,GAAI2R,OACvB,CAEM,SAASE,KACZ,OAAOL,GAAuCX,GAAkBiB,KAAM,KACzE,CC5EM,MAaMC,GAAmBxM,UDlBvBlE,OAAM,QAKPnF,QAAQC,IAAI,sBAEZmV,GAASA,IAAU,IAAIU,GAKvBV,GAAOW,iBAAiB,WAAYC,IAChC,MAAQzR,MAAM,GAAET,EAAF,KAAMyR,EAAN,QAAYC,IAAcQ,EAM3B,MAEL,UAAAX,GAASvR,UAAT,SAAcgB,QAAQ0Q,GAK9BH,GAASvR,QAAMtC,CAAf,IAMJ4T,GAAOW,iBAAiB,gBAAiBC,IACrC,MAAQzR,MAAM,GAAET,EAAF,KAAMyR,EAAN,QAAYC,IAAcQ,EAOhChW,QAAQD,MAAM,oBAAqByV,GACnCH,GAASvR,GAAIvB,OAAOiT,GAK5BH,GAASvR,QAAMtC,CAAf,KA7CJxB,QAAQC,IAAI,2BCmBnB,IAGC,aAFMgW,KACNjW,QAAQC,IAAI,8BACCiW,GAAUC,EAAOA,EAAMlB,QAGpC,CAFC,MACDjV,QAAQD,MAAM,qBACd,GAaWqW,GAAgBD,IAC5B,MAAME,EAAwB,CAAC3J,EAAmB4J,KACjD,IAAKA,GAAoC,IAAtBA,EAAW7L,OAC7B,OAAQ,IAAI8L,IAEb,GAAIJ,EAAMlB,QACT,OAAQ,IAAIsB,IAEb,IAAIC,EAAY,IAAID,IAIpB,OAHAC,EAAUC,IAAIH,EAAW,GAAGhP,MAE5B6O,EAAQO,GAAUP,EAAVO,CAAiBhK,EAAW,CAAC4J,EAAW,GAAGhP,OAC5CkP,CAAP,EAOD,OAJAL,EAAM1J,QAAU,CAAC,EACjB0J,EAAMQ,cAAiBN,EAAsBlF,GAAAA,IAAAA,IAA6BgF,EAAMS,UAAUC,OAC1FV,EAAMW,mBAAqBT,EAAsBlF,GAAAA,SAAAA,IAAkCgF,EAAMS,UAAU7V,YAE5F,IAAMoV,EAAb,EASKD,GAAY7M,MAAO8M,EAAsBY,KAC9C,IACC,MAAMxS,QDmBD,SAAewS,GAGlB,OAAOzU,QAAQyU,IAAI,CACrB/D,GAAgB+D,GAChB7D,GAA0B6D,GAC1B5D,GAAqC4D,GAC/B3D,GAAsC2D,GAC5C1D,GAAmC0D,KAE5B/R,MAAKgS,GACK1B,GAAuDX,GAAkBsC,MAAO,CACnFF,MACAG,QAASF,EAAQ,GACjBG,QAASH,EAAQ,GACjBI,WAAYJ,EAAQ,GACpBK,eAAgBL,EAAQ,GACpCM,iBAAkBN,EAAQ,MAI7B,CCxCoBf,CAAiBc,GAE9BV,EAAwB,CAAC3J,EAAmB4J,KACjD,IAAKA,GAAoC,IAAtBA,EAAW7L,OAC7B,OAAQ,IAAI8L,IAEb,GAAIQ,EACH,OAAQ,IAAIR,IAEb,IAAIC,EAAY,IAAID,IAIpB,OAHAC,EAAUC,IAAIH,EAAW,GAAGhP,MAE5B6O,EAAQO,GAAUP,EAAVO,CAAiBhK,EAAW,CAAC4J,EAAW,GAAGhP,OAC5CkP,CAAP,EASD,OANAL,EAAMQ,cAAiBN,EAAsBlF,GAAAA,IAAAA,IAA6B5M,EAAKqS,UAAUC,OACnFV,EAAMW,mBAAqBT,EAAsBlF,GAAAA,SAAAA,IAAkC5M,EAAKqS,UAAU7V,YACxGoV,EAAMlB,QAAU8B,EAChBZ,EAAMoB,WAAahT,EAAKgT,WACxBpB,EAAMS,UAAYrS,EAAKqS,UAEhBT,CAIP,CAHC,MAED,OADAnW,QAAQD,MAAM,2BACPoW,CACP,GAeWqB,GAAmBnO,UAC/B,IACC,MAAM9E,QD8BkBkT,EC9BgBtB,EAAM1J,QD+BrC6I,GAA+DX,GAAkB+C,UAAW,CAC/FD,oBC9BN,OADAtB,EAAMS,UAAYrS,EACX,IAAI4R,EAIX,CAHC,MAED,OADAnW,QAAQD,MAAM,kCACPoW,CACP,CDwBK,IAAmBsB,CCxBxB,EAGWf,GAAaP,GAAyB,CAAC3W,EAAuCU,EAA0ByX,EAAyBC,KAC7I,MAAMnL,EAAmB5G,OAAO8I,OAAO,CAAC,EAAGwH,EAAM1J,SAC3CvB,EAA2B,iBAAVhL,EACpB,CAACA,GACDA,EAIG2X,EAA6BF,IAAaA,EAAQzM,SAAST,OAAS,EAAKkN,EAAQnM,SAAWmM,IAAY,IAAIpN,EAMlH,OALAsN,EAAY1M,KAAKD,GAEjBuB,EAAQjN,GAAQ,CAAEU,MAAOgL,EAAQ0M,gBAAepN,MAAOqN,EAAYrN,OAEnE2L,EAAM1J,QAAUA,EACT,IAAI0J,EAAX,EAKY2B,GAAe,CAAC3B,EAAsB3W,EAAuCU,EAAgB0X,KACzG,MAAMnL,EAAmB5G,OAAO8I,OAAO,CAAC,EAAGwH,EAAM1J,SAC3CsL,EAAwB7X,GAAS,KACjCyX,EAAUpN,EAAAA,YAA0BkC,EAASjN,GAC7C0L,EAASyM,EAAQzM,SACjB8M,EAAYD,EAAgB7M,EAAOqB,QAAOC,GAAKA,GAAKuL,IAAgB,KAEpEE,EAAIN,EAAQnM,UAAY,IAAIjB,EAWlC,OAVIyN,GACHC,EAAE9M,KAAK6M,GAERvL,EAAQjN,GAAQ,CAACU,MAAO+X,EAAE/M,SAAU0M,gBAAgBpN,MAAOyN,EAAEzN,OAEtC,IAAnByN,EAAEzN,MAAMC,eACJgC,EAAQjN,GAGhB2W,EAAM1J,QAAUA,EACT,IAAI0J,EAAX,EAQM,SAAS+B,GAAmBC,EAAcC,GAEjD,IAAI3L,EAAU,GAEd,IAAK,MAAMjN,KAAO2R,GACbtL,OAAOwS,UAAU9X,eAAe+X,KAAKnH,GAAqB3R,IAC7DiN,EAAQtB,KAAK,CAAC,IAAO3L,EAAK,MAAS2R,GAAoB3R,GAAKkM,QAI9D,IAAI6M,EAAe,GAClB,GAAIJ,EACJ,IAAK,IAAI3Y,KAAOqG,OAAOC,KAAKqS,GAC1BA,EAAa3Y,GAAKgL,MAAMpD,SAAQoF,IAC/B+L,GAAkB9L,EAAQ+L,MAAK1U,GAAMA,EAAGtE,KAAOA,IAAKkM,MAAlCe,KAAqDD,EAAI4L,CAA3E,IAMJ,OAAOG,EAAa3M,UAAU,EAAG2M,EAAa9N,OAAQ,EACrD,CCzMM,MAAMgO,GAAe,KACpB,CACNC,KAAM,CACLC,UDiBK,CACN1D,SAAS,EACTsC,WAAY,CAAC,EACbX,UAAW,KACXnK,QAAS,CAAC,EACVqK,mBAAoB,IAAIP,IACxBI,cAAe,IAAIJ,IACnBqC,yBAAyB,GCvBxBC,SAAS,EACTC,WAAW,GAEZC,aAAc,CACbC,SAAS,EACTC,SAAU,KACVC,SAAU,MAEXC,YAAa,CACZC,mBAAmB,KCNf,IAAKC,I,SAAAA,GAAAA,EAAAA,EAAAA,4BAAAA,GAAAA,8BAAAA,EAAAA,EAAAA,uBAAAA,GAAAA,yBAAAA,EAAAA,EAAAA,mBAAAA,GAAAA,qBAAAA,EAAAA,EAAAA,mBAAAA,GAAAA,qBAAAA,EAAAA,EAAAA,kBAAAA,GAAAA,oBAAAA,EAAAA,EAAAA,mBAAAA,GAAAA,qBAAAA,EAAAA,EAAAA,mBAAAA,GAAAA,qBAAAA,EAAAA,EAAAA,oBAAAA,GAAAA,qB,EAAAA,KAAAA,GAAAA,CAAAA,ICRL,MAAMC,GAAqB,CAACnD,EAAD,KAAkF,IAA5D,QAAEX,EAAF,KAAWD,GAAiD,EAChH,OAAQA,IACL8D,GAAYE,mBAChBpD,EAAMiD,kBAAoB5D,EACnB,IAAKW,IAGIA,CANf,ECQSqD,GAAc,CAACrD,EAAmOsD,KAC9P,OAAQA,EAAOlE,MACd,KAAK8D,GAAYK,uBAGhB,OAFAvD,EAAMwC,UAAYc,EAAOjE,QACzBW,EAAM0C,SAAU,EACT,IAAK1C,GAEb,KAAKkD,GAAYM,4BAEhB,OADAxD,EAAM0C,SAAU,EACT,IAAK1C,GAEb,KAAKkD,GAAYO,oBAEhB,OADkBnB,KACDC,KAElB,KAAKW,GAAYQ,mBACjB,KAAKR,GAAYS,mBAGhB,OAFA3D,EAAMwC,UAAYc,EAAOjE,QACzBW,EAAM2C,WAAY,EACX,IAAK3C,GAEb,KAAKkD,GAAYU,mBAEhB,OADA5D,EAAM2C,WAAY,EACX,IAAK3C,GAIb,QACC,OAAOA,EA3BT,ECVY6D,GAAsB,CAAC7D,EAAD,KAAmF,IAA5D,QAAEX,EAAF,KAAWD,GAAiD,EAClH,OAAQA,IACL8D,GAAYY,mBACTzE,EAGSW,CALf,ECES+D,GAAa,CAACC,EAAgBV,KAAjB,CACzBf,KAAMc,GAAYW,EAAIzB,KAAMe,GAC5BV,aAAciB,GAAoBG,EAAIpB,aAAcU,GACpDN,YAAaG,GAAmBa,EAAIhB,YAAaM,KCA5CW,IAAaC,EAAAA,EAAAA,eACf,CACIlE,MAAOsC,KACP6B,SAAU,IAAM,OAIlBC,GAAc,IAAkB,IAAjB,SAAExQ,GAAe,EAClC,MAAOoM,EAAOmE,IAAYE,EAAAA,EAAAA,YAAWN,GAAYzB,MAEjD,OACI,gBAAC2B,GAAWhQ,SAAZ,CAAqBlK,MAAO,CAAEiW,QAAOmE,aAChCvQ,EAFT,EC2IJ,SAAS0Q,KACR,MAAOC,EAAUC,GAAevR,EAAAA,SAAmC,MAC7DwR,EAAOC,QAAQH,GASrB,IAAII,EAAOhR,IAEX,OAAKgR,EAAKpa,KAIT,gCACC,gBAACqa,EAAA,EAAD,CAAYC,QAdOC,IACpBN,EAAYM,EAAMC,cAAlB,GAcE,gBAACC,EAAA,EAAD,CAAYC,GAAI,CAAEC,MAAOC,EAAAA,EAAAA,UAE1B,gBAACC,EAAA,EAAD,CACCX,KAAMA,EACNY,QAhBiB,KACnBb,EAAY,KAAZ,EAgBED,SAAUA,EACVe,aAAc,CACbC,SAAU,MACVC,WAAY,UAEbC,gBAAiB,CAChBF,SAAU,MACVC,WAAY,WAGb,gBAACE,EAAA,EAAD,CAAUb,QAASF,EAAK3Q,SAAxB,YApBK,IAwBR,CAID,SAAS2R,GAASC,GACjB,MAAOrB,EAAUC,GAAevR,EAAAA,SAAmC,MAC7DwR,EAAOC,QAAQH,GASfsB,EAAYC,IACjB9W,OAAOyV,KAAKqB,EAAM,UAAUC,OAA5B,EAGD,OACC,gCACC,gBAACnB,EAAA,EAAD,CAAYC,QAbOC,IACpBN,EAAYM,EAAMC,cAAlB,GAaE,gBAACiB,EAAA,EAAD,CAAcf,GAAI,CAAEC,MAAOC,EAAAA,EAAAA,UAE5B,gBAACC,EAAA,EAAD,CACCX,KAAMA,EACNY,QAfiB,KACnBb,EAAY,KAAZ,EAeEyB,MAAO,CAAEC,UAAW,GACpB3B,SAAUA,EACVe,aAAc,CACbC,SAAU,MACVC,WAAY,QAEbC,gBAAiB,CAChBF,SAAU,MACVC,WAAY,SAGZI,EAAM9C,UAAY,gBAAC4C,EAAA,EAAD,CAAUb,QAAS,IAAMgB,EAASD,EAAM9C,WAAxC,aAClB8C,EAAM3C,mBAAqB2C,EAAM7C,UAAY,gBAAC2C,EAAA,EAAD,CAAUb,QAAS,IAAMgB,EAASD,EAAM7C,WAAxC,mBAIjD,CAED,SAjOA,WACC,IAAIjQ,GAAWC,EAAAA,EAAAA,MACX9D,GAAWkX,EAAAA,EAAAA,MA0Bf,MAAM,MAAEnG,EAAF,SAASmE,GAAalR,EAAAA,WAAiBgR,IAKvCmC,E9C5B4B1c,KAAKC,MAAM,gC8C8BvC0c,EAAmC,iBAArBpX,EAASqX,UAAoD,KAArBrX,EAASqX,SAG/DC,EAAY,CAACld,EAAakM,EAAeiR,KAC9C,MAAMC,EAAgBL,EAAW/c,GAEjC,GAAYgC,MAARob,IAAsBA,EACzB,OAED,IAAIR,EAAQ,CACXf,MAAO,QACPgB,UAAW,GACXQ,WAAY,GAGb,MAAMC,EAAeH,GAAoBvX,EAASqX,UAAiC,iBAApBE,GAA4D,KAArBvX,EAASqX,SAK/G,OAHIK,IACHV,EAAQvW,OAAO8I,OAAO,CAAC,EAAGyN,EAAO,CAAEW,eAAgB,YAAaC,oBAAqB,UAGrF,gBAACC,EAAA,EAAD,CACC5B,MAAM,UACN7b,IAAG,oBAAemd,GAClBP,MAAOA,EACPpB,QAAS,KACH8B,GACC3G,EAAMuC,KAAKG,UACfyB,EAAS,CAAE/E,KAAM8D,GAAYO,sBAC7B3Q,EAAS0T,GAEV,GAKDjR,EAhBH,EAuBD,OACC,gBAACwR,EAAA,EAAD,KACC,gBAACC,EAAA,EAAD,CAAQC,SAAS,QAAQhC,GAAI,CAAEiC,OAASC,GAAUA,EAAMD,OAAOE,OAAS,IACvE,gBAACC,EAAA,EAAD,CAASpC,GAAI,CAAEqC,eAAgB,kBAC9B,gBAACP,EAAA,EAAD,CAAK9B,GAAI,CAAEsC,QAAS,OAAQC,WAAY,WACvC,uBACCC,IAAKC,EACLC,IAAI,6BACJjQ,MAAO,IACPmN,QAAS,KACHwB,GACCrG,EAAMuC,KAAKG,UACfyB,EAAS,CAAE/E,KAAM8D,GAAYO,sBAC7B3Q,EAAS,KAEV,IAGH,gBAACiU,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,CAAY3C,GAAI,CAAEyB,WAAY,GAAKmB,QAAQ,aAC1C,gCACEtB,EAAU,MAAO,eAAgB,iBACjCA,EAAU,QAAS,qBAAsB,uBACzCA,EAAU,SAAU,SAAU,sBAC9BA,EAAU,MAAO,aAAc,mBAC/BA,EAAU,OAAQ,OAAQ,oBAC1BA,EAAU,QAAS,QAAS,qBAC5BA,EAAU,cAAe,gBAAiB,2BAC1CA,EAAU,MAAO,MAAO,mBACxBA,EAAU,cAAe,eAAgB,+BAK9C,gBAACQ,EAAA,EAAD,KACwB,iBAArB9X,EAASqX,UAAoD,oBAArBrX,EAASqX,UAAuD,KAArBrX,EAASqX,SAAkB,iCAAQ,gBAACQ,EAAA,EAAD,CACvH5B,MAAM,UACN7b,IAAG,oBAAe4F,EAASqX,SAAxB,sBACHL,MAAO,CACNf,MAAO,SAIRL,QAAS,KArHciD,KAC5B,IAAIC,EAAQ9Y,EAASqX,SAEC,sBAAlBwB,EACHC,E9CpBuC,gC8CqBX,mBAAlBD,EACVC,E9CpBoC,6B8CyBV,qBAAlBD,EACRC,E9ClBsC,+B8CoBZ,2BAAlBD,EACRC,E9CnB4C,6B8CqBlB,mBAAlBD,IACRC,E9CzBoC,8B8C4BrC/Y,OAAOyV,KAAKsD,EAAO,SAAnB,EAiGMC,CAAsB/Y,EAASqX,SAA/B,GATsH,sBAexH,gBAACX,GAAD,CACC1C,kBAAmBjD,EAAMgD,YAAYC,kBACrCF,SAAU/C,EAAM4C,aAAaG,SAC7BD,SAAU9C,EAAM4C,aAAaE,WAE9B,gBAACwB,GAAD,SAML,ECxJY2D,GAAiB,IAAIxc,EAAY,CAAE+C,OAAQpG,EAAesG,SAAUvG,ICoBjF,GAhBA,WACC,MAAMiI,GAAS8X,EAAAA,EAAAA,MACf,IAAIvD,EAAOhR,IACX,OACC,gCACC,gBAAC,EAAD,CACCzB,aAAc9B,EAAO8B,aACrBQ,uBAAwBiS,EAAK5Q,OAC7BvB,cAAerK,EACfsK,iBAAiB,IACjBlE,WAAY0Z,KAIf,ECND,GAXA,YAA8D,IAAzC,SAAErU,GAAuC,EAQ7D,OAPWD,IAEDpJ,OAETyE,OAAOC,SAASC,KAAO/G,sCAGjByL,CACP,E,ICMIuU,G,uFAAAA,GAAAA,EAAAA,EAAAA,aAAAA,GAAAA,eAAAA,EAAAA,EAAAA,QAAAA,GAAAA,UAAAA,EAAAA,EAAAA,kBAAAA,GAAAA,oBAAAA,EAAAA,EAAAA,YAAAA,GAAAA,a,EAAAA,KAAAA,GAAAA,CAAAA,IA6JL,SAtJA,SAAcvC,GAAwM,MACrN,MAAOwC,EAAkBC,GAAuBpV,EAAAA,UAAe,IACxDqV,EAAqBC,GAA0BtV,EAAAA,SAAoCkV,GAAoBK,UAExG,MAAExI,EAAF,SAASmE,GAAalR,EAAAA,WAAiBgR,IAEvCwE,EAAe/Y,OAAOC,KAAKqQ,EAAMuC,KAAKC,UAAUlM,SAAShC,OAE/DrB,EAAAA,WAAgB,MpBlBV,SAAsB3G,EAAaoc,GAIzC,IAAK1Z,OAAO2Z,eACX,OAAOD,GAAS,GAEjB,IACC,MAAME,EAAM,IAAID,eAChBC,EAAInE,KAAK,MAAOnY,GAChBsc,EAAIC,QAAU,IACdD,EAAIE,mBAAqB,WACxB,GAAuB,IAAnBF,EAAIG,WAAkB,CACzB,MAAMpY,EAASiY,EAAIjY,OACnB,GAAIA,GAAU,KAAOA,EAAS,IAC7B+X,GAAS,OACH,CAEN,MAAMM,EAAS/P,SAASC,cAAc,OACtC8P,EAAOC,QAAU,WAEhBP,GAAS,EACT,EACDM,EAAOE,OAAS,KAEfR,GAAS,EAAT,EAED,MAAMS,EAAI,IAAIC,IAAI9c,GAClB0c,EAAOvB,IAAM0B,EAAEE,OAAS,cACxB,CACD,CACD,EAEDT,EAAIU,MAIJ,CAHC,MAAO1f,GACRC,QAAQD,MAAMA,GACd8e,GAAS,EACT,CACD,CoBRCa,CAAa,mCAAmCC,GACxCrF,EAAS,CAAE/E,KAAM8D,GAAYE,kBAAmB/D,QAASmK,MAXtCtW,WAC1B,IACC,MAAMuW,QlBoGTxN,GAAAA,IA3GiB,8BkBQPkI,EAAS,CAAE/E,KAAM8D,GAAYY,mBAAoBzE,QAASoK,GAIjE,CAFD,MAAO7f,GACNC,QAAQD,MAAMA,EACd,GAOF8f,EAAoB,GAElB,IAEHzW,EAAAA,WAAgB,KACfsV,EAAuBJ,GAAoBK,QAA3C,GACE,CAAC5C,EAAM+D,OAEV,MAAMC,EACmB,OAAxB5J,SAAA,UAAAA,EAAOuC,YAAP,eAAaG,UAAkB1C,EAAMuC,KAAKG,QAuD3C,OACC,gCACC,gBAACqE,EAAA,EAAD,CAAK9B,GAAI,CAAEsC,QAAS,SACnB,gBAACR,EAAA,EAAD,CAAK9B,GAAI,CAAEvN,MAAO,GAAImS,UAAW,WAChC,gBAACC,GAAA,EAAD,CAASC,MAAM,gBACd,gBAACnF,EAAA,EAAD,CAAYK,GAAI,CAAEgC,SAAU,SAAU+C,IAAK,QAASC,KAAM,GAAKpF,QAAS,KAAO+E,GAAiBvB,GAAoB,IACnH,gBAAC6B,GAAA,EAAD,CAAkBC,SAAS,QAAQlF,GAAI,CAAEC,MAAOC,EAAAA,EAAAA,WAIlD,gBAACiF,GAAA,EAAD,CAAOC,aAAc5B,EAAcvD,MAAM,UAAUD,GAAI,CAAEiB,UAAW,EAAGgB,OAAQ,EAAGD,SAAU,SAAU+C,IAAK,QAASC,KAAM,IACzH,gBAACH,GAAA,EAAD,CAASC,MAAM,iBACd,gBAACnF,EAAA,EAAD,CAAYC,QAAS,KACf+E,IACJzF,EAAS,CAAE/E,KAAM8D,GAAYU,qBAC7BgC,EAAMvE,iBAAiBuE,EAAM3F,aAAaD,EAAMuC,KAAKC,YACnD3T,MAAK2T,GAAa2B,EAAS,CAAE/E,KAAM8D,GAAYS,mBAAoBtE,QAASmD,MAC9E,GAGD,gBAAC8H,GAAA,EAAD,CAAcH,SAAS,QAAQlF,GAAI,CAAEC,MAAOC,EAAAA,EAAAA,aAMhD,gBAAC4B,EAAA,EAAD,CAAK9B,GAAI,CAAEsF,SAAU,IACnB3E,EAAM+D,OAIT,gBAACa,GAAA,GAAD,CACCC,OAAO,OACP5C,QAAQ,YACRpD,KAAM2D,EACNsC,WAAY,CAAEzE,MAAO,CAAEvO,MAAO,IAAKiT,YAAa,GAAI1D,SAAU,WAAYC,OAAQ,OAElF,gBAAC0D,GAAA,EAAD,CAAO3F,GAAI,CAAEiB,UAAW,GAAI/O,QAAS,GAAK0T,QAAS,GAClD,uBAAK5E,MAAO,CAAEvO,MAAO,SACpB,gBAACkQ,EAAA,EAAD,CAAY3B,MAAO,CAAEkE,SAAU,QAAS5C,QAAS,WAAjD,WACA,gBAACR,EAAA,EAAD,CAAK9B,GAAI,CAAE4E,UAAW,QAAStC,QAAS,SAAUb,WAAY,UAC7D,gBAACoD,GAAA,EAAD,CAASC,MAAM,iBACd,gBAACnF,EAAA,EAAD,CAAYC,QAAS,KAAO+E,GAAiBvB,GAAoB,IAChE,gBAACyC,GAAA,EAAD,CAAc7F,GAAI,CAAEC,MAAOC,EAAAA,EAAAA,WAI5BS,EAAMmF,UAAY/K,EAAM4C,aAAaC,SApGpB,MACvB,MAAMmI,EAAW,CAChBzD,QAAS,QAAS4C,SAAU,QAASN,UAAW,OAAQ3D,UAAW,EAAG+E,UAAW,UAGlF,OAAQ3C,GACP,KAAKH,GAAoBK,QACxB,OACC,gBAACsB,GAAA,EAAD,CAASC,MAAM,iBACd,gCACC,gBAACjD,EAAA,EAAD,CAAQjC,QAAS,KAChB,IAAI+E,EAIJ,OAFArB,EAAuBJ,GAAoB+C,cAC3C/G,EAAS,CAAE/E,KAAM8D,GAAYM,8BACtBoC,EAAMmF,SAASrb,OAAO8I,OAAO,CAAC,EAAGwH,EAAMuC,KAAKC,UAAW,CAAE1D,SAAS,KACvEjQ,MAAM9E,IACNwe,EAAuBJ,GAAoBgD,aAC3ChH,EAAS,CAAE/E,KAAM8D,GAAYK,uBAAwBlE,QAAStV,GAA9D,IACE+E,OAAM3B,IACRob,EAAuBJ,GAAoBiD,mBAC3CvhB,QAAQD,MAAMuD,EAAd,GANF,EASA8Y,MAAO,CACNoF,gBAAiBzB,EAAiB,UAAc,UAChD1E,MAAO,QACPoG,OAAQ1B,EAAgB,cAAgB,YAjB1C,iBAqBA,wBAAM3D,MAAO+E,GAAb,wFAIJ,KAAK7C,GAAoBiD,kBACxB,OACC,wBAAMnF,MAAO+E,GAAb,uEAGF,KAAK7C,GAAoB+C,aACxB,OACC,wBAAMjF,MAAO+E,GAAb,0FAGF,KAAK7C,GAAoBgD,YACxB,OACC,wBAAMlF,MAAO+E,GAAb,6CA1CH,EAgGMO,KAMF3F,EAAM4F,eAMX,E,IC5KIC,G,iCC+CE,SAAS1U,GAASC,GACrB,MAAO,CACHC,UAAWD,EACXE,UAAWF,EACXA,OAAQA,EACRG,QAAS,EAEhB,CAsJM,SAASuU,GAAiBnL,EAAmChK,EAAmBoV,EAAqDnK,GACxI,OAAQrU,IACJ,IAAKoJ,IAAcpJ,IAAMA,EAAEye,QAA8B,IAApBze,EAAEye,OAAOtX,OAC1C,OAGJ,MAAMuX,EAAU,IAAIzL,IAAYjT,EAAEye,OAAOhc,KAAIyG,GAAKsV,EAAetV,MACjEkK,EAAUhK,EAAW,IAAIsV,GAASC,OAAQtK,EAA1C,CAEP,CAyBM,SAASuK,GAA0BxL,EAAmChK,EAAmByV,EAAoCC,GAChI,MAAM,KAAE/W,EAAF,WAAQgX,GAAeF,EAE7B,OAAKE,EAIER,GAAiBnL,EAAWhK,EAAW0V,EAD9B/W,GAAQd,EAAAA,SAAuBc,IAAS,IAAId,GAFjD,IAId,CA1LmB2C,GAnDa,KAqDjBA,GAtDa,KAuDhBA,GArDa,K,SDVrB0U,GAAAA,EAAAA,EAAAA,KAAAA,GAAAA,OAAAA,EAAAA,EAAAA,WAAAA,GAAAA,Y,EAAAA,KAAAA,GAAAA,CAAAA,IAkBE,MAAMU,WAA8BlZ,EAAAA,UAEvClE,YAAY6W,EAAOpE,GACf4K,MAAMxG,EAAOpE,EAChB,CAED6K,SACI,MAAM,MAAE9W,EAAF,SAAS+W,EAAT,UAAmBC,EAAnB,SAA8BC,GAAard,KAAKyW,MACtD,OAAIrQ,QACO,KAGP,uBAAKkX,UAAW,iBACZ,sBAAIxG,MAAO,CAAEyG,WAAY,MACpBnX,GAKhB,EEXE,SAASoX,GAAe/G,GAC3B,MAAM,KAAEgH,EAAF,QAAQlc,EAAR,SAAiBkD,GAAagS,EACpC,OAtB0EiH,EAsBpCnc,GAAW,UAA3Bkc,EAAMhZ,EAfrB,uBAAK6Y,UAAU,YAAYI,GAPtC,IAA8EA,CAuB7E,C,eCjBM,SAASC,GAAUlH,GACtB,MAAM,SAAEhS,EAAF,SAAYmZ,EAAZ,SAAsBC,EAAtB,MAAgC/G,EAAhC,gBAAuCgH,GAAoBrH,EAEjE,OACI,gBAACsH,GAAA,EAAD,CAAOC,UAAW,EAAG9jB,IAAK0jB,EAAUN,UAAW,6BAA8BxG,MAAOA,GAChF,uBAAKA,MAAO,CAAE9O,QAAS8V,GAAmB,IAAMtf,GAAIqf,GAAY,KAAMP,UAAW,iBAC5E7Y,GAIf,CClBK,SAASwZ,GAAWxH,GACvB,MAAM,KAAEyH,GAASzH,EACjB,OAAKyH,EAID,uBAAKZ,UAAU,mBAAmBY,GAH3B,IAKd,CCEM,SAASC,GAAU1H,GACtB,MAAM,SAAEhS,EAAF,MAAYqS,EAAZ,QAAmBsH,EAAnB,WAA4BC,EAA5B,WAAwCC,EAAxC,SAAoDC,GAAa9H,EAEvE,OACI,gBAACkH,GAAD,CAAWC,SAAUW,EAAUzH,MAAOA,GAClC,2BACI,gBAACkG,GAAD,CAAuB5W,MAAOgY,IAC9B,gBAACH,GAAD,CAAYC,KAAMG,IACjBC,EACD,gBAACd,GAAD,CAAgBC,KAAkB,MAAZhZ,GACjBA,IAKpB,C,uHCQM,MAAM+Z,WAAmB1a,EAAAA,UAE5BlE,YAAY6W,EAAOpE,GACf4K,MAAMxG,EAAOpE,EAChB,CAED6K,SACI,MAAM,KAAEuB,EAAF,KACEC,EADF,MAEEC,EAFF,QAGEC,EAHF,IAIEC,EAJF,OAKEC,EALF,cAMEC,EANF,cAOEC,EAPF,iBAQEC,EARF,aASEC,EATF,YAUEC,EAVF,YAWEC,EAXF,iBAYEC,EAZF,UAaEC,EAbF,OAcEC,EAdF,OAeEC,EAfF,OAgBEC,EAhBF,MAiBE7E,EAjBF,aAkBE8E,EAlBF,oBAmBEC,EAnBF,cAoBEC,EApBF,eAqBEC,GAAmB7f,KAAKyW,MA2ChC,OACI,uBAAKK,MAAO,CAACgJ,WAAY,MAAOC,aAAc,MAAOC,MAAO,UAElDvB,EAAO,gBAAC9D,GAAA,EAAD,CAASC,MAAM,sBACpB,gBAACqF,GAAA,EAAD,CACIvK,QAASwK,IAvCzBR,EAAa,YAAQC,EAAoB,MAwCrB7I,MAAO,CAAEqF,OAAQ,UACTpG,MAAqB,OAAbuJ,GAAyC,KAAnBD,EAAyB,UAAW,OAClErX,QAAS,MACTgT,SAAU,OAGjB,KAEX0D,EAAO,gBAAC/D,GAAA,EAAD,CAASC,MAAM,wBACpB,gBAACuF,GAAA,EAAD,CACIzK,QAASwK,IA7CzBR,EAAa,YAAQC,EAAoB,MA8CrB7I,MAAO,CAAEqF,OAAQ,UACTpG,MAAqB,OAAbuJ,GAAyC,KAAnBD,EAAyB,UAAW,OAClErX,QAAS,MACTgT,SAAU,OAGjB,KAEX2D,EAAQ,gBAAChE,GAAA,EAAD,CAASC,MAAM,SACrB,gBAACwF,GAAA,EAAD,CACQ1K,QAASwK,IAlE7BR,EAAa,cAAUC,EAAoB,MAmEvB7I,MAAO,CAAEqF,OAAQ,UACTpG,MAAqB,SAAbuJ,EAAuB,UAAW,OAC1CtX,QAAS,MACTgT,SAAU,OAGjB,KAEX4D,EAAU,gBAACjE,GAAA,EAAD,CAASC,MAAM,cACvB,gBAACyF,GAAA,EAAD,CACQ3K,QAASwK,IAzD7BR,EAAa,gBAAYC,EAAoB,MA0DzB7I,MAAO,CAAEqF,OAAQ,UACTpG,MAAqB,WAAbuJ,EAAyB,UAAW,OAC5CtX,QAAS,MACTgT,SAAU,OAGjB,KAEX6D,EAAM,gBAAClE,GAAA,EAAD,CAASC,MAAM,aACnB,gBAAC0F,GAAA,EAAD,CACQ5K,QAASwK,IAzE7BR,EAAa,YAAQC,EAAoB,MA0ErB7I,MAAO,CAAEqF,OAAQ,UACTpG,MAAqB,OAAbuJ,EAAqB,UAAW,OACxCtX,QAAS,MACTgT,SAAU,OAGjB,KAEX8D,EAAS,gBAACnE,GAAA,EAAD,CAASC,MAAM,gBACtB,gBAAC,KAAD,CACIlF,QAASwK,IA1EzBR,EAAa,eAAWC,EAAoB,MA2E5B7I,MAAO,CACHqF,OAAQ,UACRpG,MAAqB,UAAbuJ,EAAwB,UAAW,OAC3CtX,QAAS,UAGR,KAEX+W,EACE,gBAACpE,GAAA,EAAD,CAASC,MAAM,mBACX,gBAAC2F,GAAA,EAAD,CACQ7K,QAASwK,IAAKM,O9C2FpBC,E+C7QvB,SAAmBlB,EACAD,EACAD,EACAqB,EACAC,EACAC,EACAf,GAIxB,IAAIgB,EAAc,IAAI5P,IACtBsO,SAAAA,EAAQzd,SAAQgf,GAAKD,EAAY1P,IAAI2P,EAAE9e,QAIvC,IAAI+e,EAAc,GAKC,OAAbzB,EACFC,EAAOzd,SAAQgf,IACbA,EAAEE,OAAOlf,SAASoF,KACS,IAArB6Z,EAAK1c,QAAQ6C,IACf6Z,EAAKlb,KAAKqB,EAAE+Z,WAAF,UACX,GAHH,IAM2B,KAApB5B,EACTE,EAAOzd,SAAQgf,IACbA,EAAExb,EAAExD,SAASoF,KACc,IAArB6Z,EAAK1c,QAAQ6C,IACf6Z,EAAKlb,KAAKqB,EAAE+Z,WAAF,UACX,GAHH,IAOF1B,EAAOzd,SAAQgf,IACbA,EAAEI,EAAEpf,SAAQoF,KACe,IAArB6Z,EAAK1c,QAAQ6C,IACf6Z,EAAKlb,KAAKqB,EAAE+Z,WAAF,UACX,GAHH,IASoB,KAApB5B,GACF0B,EAAKI,UAMP,IAAIC,EAAOza,MAAM0a,KAAK1a,MAAMka,EAAYnY,OAAO,IAAM,IAAI/B,MAAMoa,EAAK5b,UAEpE,IAAK0B,EAAE,EAAGA,EAAEga,EAAYnY,KAAM7B,IAC7B,GAAiB,OAAbyY,EACH,IAAK,IAAIwB,EAAE,EAAGA,EAAEC,EAAK5b,OAAQ2b,IAC3BM,EAAKva,GAAGia,GAAKvB,EAAO1Y,GAAGjB,OAAO2Z,EAAO1Y,GAAGma,OAAO3c,QAAS0c,EAAKD,GAAGG,WAAR,iBAEpD,GAAwB,KAApB5B,EACR,IAASyB,EAAE,EAAGA,EAAEC,EAAK5b,OAAQ2b,IAAK,CAChC,IAAIQ,EAAuB/B,EAAO1Y,GAAGqX,KAAmBqB,EAAO1Y,GAAGqX,KAAmBqB,EAAO1Y,GAAGqa,EAC/FE,EAAKva,GAAGia,GAAKQ,EAAU/B,EAAO1Y,GAAGvB,EAAEjB,QAAS0c,EAAKD,GAAGG,WAAR,WAC7C,MAEG,IAASH,EAAE,EAAGA,EAAEC,EAAK5b,OAAQ2b,IAAK,CAChC,IAAIQ,EAAuB/B,EAAO1Y,GAAGqX,KAAmBqB,EAAO1Y,GAAGqX,KAAmBqB,EAAO1Y,GAAGvB,EAC7F8b,EAAKva,GAAGia,GAAKQ,EAAU/B,EAAO1Y,GAAGqa,EAAE7c,QAAS0c,EAAKD,GAAGG,WAAR,WACnD,CASL,GAHAF,EAAKQ,QAAQb,GAAcE,GAGH,GAApBC,EAAYnY,KACd0Y,EAAK,GAAGG,QAAQZ,QAEd,IAAK9Z,EAAE,EAAGA,EAAIga,EAAYnY,KAAM7B,IAC5Bua,EAAKva,GAAG0a,QAAQhC,EAAO1Y,GAAG7E,MAKlC,IAAIwf,EAAwB7a,MAAM0a,KAAK1a,MAAMoa,EAAK5b,SAAS,IAAM,IAAIwB,MAAMka,EAAYnY,KAAO,KAC9F,IAAK,IAAI7B,EAAE,EAAGA,EAAIka,EAAK5b,OAAQ0B,IAAM,CACjC2a,EAAe3a,GAAG,GAAKka,EAAKla,GAC5B,IAAK,IAAIvB,EAAE,EAAGA,EAAIub,EAAYnY,KAAK,EAAGpD,IACpCkc,EAAe3a,GAAGvB,GAAK8b,EAAK9b,EAAE,GAAGuB,EAEpC,CAGH,IAAI4a,EAAoB,GACyB,KAA7C7O,GAAmBiN,EAAgB,QACnC2B,EAAe3b,KAAK,CAAC,GAAI,KACzB2b,EAAe3b,KAAK,CAAC,mBAAoB,KACzC4b,EAAc7O,GAAmBiN,EAAgB,QAErD2B,EAAe3b,KAAK,CAAC4b,EAAYR,WAAZ,UAAmC,KAGxD,MAAMS,EAAS,uCAAyC7hB,OAAOC,SAASC,KAAO,IACzE4hB,EAAY,gBAAiB,IAAI9kB,MAAOO,WAK9C,OAJAokB,EAAe3b,KAAK,CAAC,GAAI,KACzB2b,EAAe3b,KAAK,CAAC6b,EAAQ,KAC7BF,EAAe3b,KAAK,CAAC8b,EAAW,KAG5BH,EAAe/gB,KAAImhB,GACfA,EACCnhB,IAAIohB,QACJphB,KAAKqhB,GAA4DA,EAAEb,WAAW,IAAK,QACnFxgB,KAAKqhB,GAAD,WAAgBA,EAAhB,OACJrhB,KAAKqhB,GAAW,IAAMA,IACtBhc,KAAK,OACJA,KAAK,OAElB,CDwD8Dic,CAAUxC,EACGD,EACAD,EACAG,EACAC,EACA7E,EACAiF,G9CqFrCjW,E8CnFiCgR,EAAM,O9CqFtEoH,EAAO,IAAIC,KAAK,CAACxB,GAAU,CAAExQ,K8CpFmC,iC9CsFpEtG,GADUsQ,IAAIiI,gBAAgBF,GACTpY,GAJjB,IAAsB6W,EAAS7W,EAE/BoY,C8C9FoB,EAYQlL,MAAO,CAAEqF,OAAQ,UACTpG,MAAO,OACP/N,QAAS,MACTgT,SAAU,OAGjB,KAEXgE,EACF,gBAACrE,GAAA,EAAD,CAASC,MAAM,mBACX,gBAACuH,GAAA,EAAD,CACQzM,QAASwK,G9C2FlC,SAAyBkC,EAAkBxY,EAAkBsV,EAAuBmD,GAGvF,MAAM9J,EAAOzO,SAASC,cAAc,OAChCwO,EAAKD,IAAMgK,EACX/J,EAAK1Q,OAAS,GACd0Q,EAAKhQ,MAAQ,IACbgQ,EAAKzB,MAAMyL,QAAU,MACrBhK,EAAKzB,MAAMgB,SAAW,WACtBS,EAAKzB,MAAMiB,OAAS,OACpBQ,EAAKzB,MAAM+D,IAAM,MACjBtC,EAAKzB,MAAM0L,MAAQ,KAEvB,MAAMC,EAAQL,EAAIM,WAAU,GAC5BD,EAAMjkB,GAAK,QACXikB,EAAM3L,MAAMvO,MAAU2W,EAAwB,OAAT,OACrCuD,EAAMnF,UAAY,GAElB,MAAMqF,EAAY7Y,SAASC,cAAc,MAInC8V,EAAiB/V,SAASC,cAAc,OAC1C8V,EAAe+C,OAAO,qBAAuBP,GAC7CxC,EAAe+C,OAAO9Y,SAASC,cAAc,OAC7C8V,EAAe+C,OAAO9Y,SAASC,cAAc,OAEjD,MAAM2X,EAAS5X,SAASC,cAAc,OAClC2X,EAAOkB,OAAO,uCAAyC/iB,OAAOC,SAASC,KAAO,KAC9E2hB,EAAOkB,OAAO9Y,SAASC,cAAc,OACrC2X,EAAOkB,OAAO,gBAAiB,IAAI/lB,MAAOO,YAC1CskB,EAAO5K,MAAMgF,UAAY,SACzB4F,EAAO5K,MAAMkE,SAAW,SAE5B,MAAM6H,EAAc/Y,SAASC,cAAc,OACvC8Y,EAAY/L,MAAMvO,MAASua,OAAOC,iBAAiBX,GAAK7Z,MAAM/C,MAAM,GAAG,IAAO,KAC9Eqd,EAAYrkB,GAAK,kBACjBqkB,EAAY/L,MAAMgB,SAAW,WAE7B+K,EAAYD,OAAOrK,GACnBsK,EAAYD,OAAOD,GAGnBE,EAAYD,OAAOH,GAEF,IAAjBJ,GACAQ,EAAYD,OAAO/C,GAEvBgD,EAAYD,OAAOlB,GAInB5X,SAAS9K,KAAK4jB,OAAOC,GAGrBG,IAAYH,EAAa,CAACI,MAAO,MAAMvjB,MAAKwjB,IACpBvZ,GADkDuZ,EAAOC,YACpCvZ,EAArB,IACDlK,MAAKwgB,GAAK2C,EAAYO,UAChD,C8CpJmCC,CAAgBnD,EAAEtK,cAAc0N,cAAcA,cAAcA,cAAcA,cAC1D1I,EAAM,OACNsE,EACAtM,GAAmBiN,EAAgB,QAEvD/I,MAAO,CAAEqF,OAAQ,UACTpG,MAAO,OACP/N,QAAS,MACTgT,SAAU,OAGjB,KAEfiE,GAAoBpf,OAAO0jB,WAAa,MAAQrE,EAC9C,gBAACvE,GAAA,EAAD,CAASC,MAAM,uBACX,gBAAC4I,GAAA,EAAD,CACQ9N,QAASwK,IAxHjCN,GAAc,EAuHE,EAEQ9I,MAAO,CAAEqF,OAAQ,UACTpG,MAAO,OACP/N,QAAS,MACTgT,SAAU,OAGjB,KAEfiE,GAAoBpf,OAAO0jB,WAAa,KAAOrE,EAC7C,gBAACvE,GAAA,EAAD,CAASC,MAAM,qBACX,gBAAC6I,GAAA,EAAD,CACQ/N,QAASwK,IA/HjCN,GAAc,EA8HE,EAEQ9I,MAAO,CAAEqF,OAAQ,UACTpG,MAAO,OACP/N,QAAS,MACTgT,SAAU,OAGjB,KAEfmE,EACE,gBAACxE,GAAA,EAAD,CAASC,MACL,gBAAC,WAAD,KACKwE,EAAY3e,KAAIqgB,GACjB,gBAACrI,EAAA,EAAD,CAAY1C,MAAM,UAAU7b,IAAK4mB,GAAIA,EAArC,IAAwC,2BAAxC,SAIJ,gBAAC4C,GAAA,EAAD,CAAM5M,MAAO,CAAEqF,OAAQ,UACfnB,SAAU,GACVhT,QAAS,MACT+N,MAAO,WAEN,KAIhC,EEtPE,MAAM4N,WAAyB7f,EAAAA,UAElClE,YAAY6W,GACRwG,MAAMxG,G,6GADS,gBAUV,KACJ,MAAM,eAAEmN,EAAF,UAAkBxc,EAAlB,aAA6BoL,GAAiBxS,KAAKyW,MACpDpQ,EAAcud,aAAH,EAAGA,EAAgBhpB,MAEpC,OAAIyL,EAEI,uBAAKiX,UAAU,mBAEX,4BAAM,qBAAG5H,QAASwK,GAAK1N,EAAapL,IAA9B,OAAN,OACCf,EAAY5F,KAAI,CAACyG,EAAGL,IACbA,IAAMR,EAAYlB,OAAS,EACnB,wBAAMjL,IAAKkN,EAAUF,GAAIA,EAAI,MAE9B,wBAAMhN,IAAKkN,EAAUF,GAAIA,MAO5C,uBAAKoW,UAAU,mBAAf,IAAR,GA5BH,E,+LCKE,MAAMuG,WAAkB/f,EAAAA,UAI3BlE,YAAY6W,EAAOpE,GACf4K,MAAMxG,EAAOpE,GADW,gBAHpB,CACNyR,SAAU,IAAI7S,IAAIjR,KAAKyW,MAAMsN,aAAe,QAElB,uBAKhB,CAACpO,EAAOnX,KAClB,MAAM,SAAEslB,GAAa9jB,KAAK6Q,MAC1B,IAAImT,EAAyBF,EAExBA,EAASG,IAAIzlB,GAGhBwlB,EAAYE,OAAO1lB,GAFnBwlB,EAAY7S,IAAI3S,GAKrB,IAAIie,EAAsC,CAAC,CAC5CyE,EAAG1iB,EACH8G,EAAG9G,IAGCwB,KAAKyW,MAAM0N,UAAU,CAAE1H,UAAvB,IApB0B,sBAuBjBje,GAAMwB,KAAK6Q,MAAMiT,SAASG,IAAIzlB,KAvBb,kBAyBrB,KACP,MAAM,OAAE+gB,EAAF,iBAAUF,EAAV,YAA4B+E,EAA5B,WAAyC1D,EAAzC,WAAqDC,EAArD,iBAAiE0D,GAAqBrkB,KAAKyW,MACjG,IAAIoK,EAAc,IAAI5P,IACtBsO,SAAAA,EAAQzd,SAAQgf,GAAKD,EAAY1P,IAAI2P,EAAE9e,QAGvC,IAAIwf,EAAiB,GACjBT,EAAO,GAKa,KAApB1B,EACFE,EAAOzd,SAAQgf,IACbA,EAAExb,EAAExD,SAAQoF,KACe,IAArB6Z,EAAK1c,QAAQ6C,IACf6Z,EAAKlb,KAAKqB,EACX,GAHH,IAOFqY,EAAOzd,SAAQgf,IACbA,EAAEI,EAAEpf,SAAQoF,KACe,IAArB6Z,EAAK1c,QAAQ6C,IACf6Z,EAAKlb,KAAKqB,EACX,GAHH,IAYJ,IAAIka,EAAOza,MAAM0a,KAAK1a,MAAMoa,EAAK5b,SAAS,IAAM,IAAIwB,MAAMka,EAAYnY,QAEtE,IAAK7B,EAAE,EAAGA,EAAEga,EAAYnY,KAAM7B,IAC5B,GAAwB,KAApBwY,EACF,IAAK,IAAI/Z,EAAE,EAAGA,EAAEyb,EAAK5b,OAAQG,IAAK,CAChC,IAAIgc,EAAuB/B,EAAO1Y,GAAGqX,KAAmBqB,EAAO1Y,GAAGqX,KAAmBqB,EAAO1Y,GAAGqa,EAC/FE,EAAK9b,GAAGuB,GAAKya,EAAU/B,EAAO1Y,GAAGvB,EAAEjB,QAAQ0c,EAAKzb,MAAQ,SACzD,MAED,IAASA,EAAE,EAAGA,EAAEyb,EAAK5b,OAAQG,IAAK,CAC9B,IAAIgc,EAAuB/B,EAAO1Y,GAAGqX,KAAmBqB,EAAO1Y,GAAGqX,KAAmBqB,EAAO1Y,GAAGvB,EAC/F8b,EAAK9b,GAAGuB,GAAKya,EAAU/B,EAAO1Y,GAAGqa,EAAE7c,QAAQ0c,EAAKzb,MAAQ,SAC3D,CAKL,IAAK,IAAIuB,EAAE,EAAGA,EAAIka,EAAK5b,OAAQ0B,IAC3B2a,EAAe3b,KAAK,CAACD,OAAQwb,EAAKva,GAAIma,OAAQD,EAAKla,GAAIrI,GAAI,CAACqI,KAMhE,OACE,gBAACyd,GAAA,EAAD,CAAOxN,MAAO,CAAChP,UAAWsc,IACxB,gBAACG,GAAA,EAAD,KACE,gBAACC,GAAA,EAAD,KACE,gBAACC,GAAA,EAAD,CAAWvqB,IAAKwmB,EAAY5J,MAAO,CAC3BoF,gBAAiB,QACjBnG,MAAO,QACP2E,UAAW,OACXM,SAAU,KAEP0F,GAEQ,GAAjBnB,EAAOpa,OAAc,gBAACsf,GAAA,EAAD,CAAWvqB,IAAKymB,EAAY7J,MAAO,CACtBoF,gBAAiB,QACjBnG,MAAO,QACP2E,UAAW,OACXM,SAAU,KAET2F,GAEnCpB,EAAO9e,KAAIqgB,GAET,gBAAC2D,GAAA,EAAD,CAAWvqB,IAAKwmB,EAAWI,EAAE9e,KAAM8U,MAAO,CACtCoF,gBAAiB,QACjBnG,MAAO,QACP2E,UAAW,OACXM,SAAU,KAEP8F,EAAE9e,UAOjB,gBAAC0iB,GAAA,EAAD,KACGlD,EAAe/gB,KAAImhB,IAAO,MACzB,OACE,gBAAC4C,GAAA,EAAD,CACRtqB,IAAK0nB,EAAIpjB,GACXkX,QAASC,IAAW3V,KAAK2kB,YAAYhP,EAAOiM,EAAIZ,OAA5B,EACpB8C,SAAU9jB,KAAK4kB,WAAWhD,EAAIZ,QAC9B6D,MAAOR,GACK,gBAACI,GAAA,EAAD,CAAWvqB,IAAK0nB,EAAIpjB,GAAIsY,MAAO,CAACkE,SAAU,GACdN,UAAW,SAEVkH,EAAIZ,QARnC,UAUGY,EAAIhc,cAVP,aAUG,EAAYnF,KAAI,CAACqkB,EAAKje,IAEnB,gBAAC4d,GAAA,EAAD,CAAWvqB,IAAK0nB,EAAIZ,OAAO8D,EAAIje,EAAGiQ,MAAO,CAACkE,SAAU,GACZN,UAAW,SAEVoK,EAAIC,oBAhBrD,KArCR,GAjFC,ECnBE,SAASC,GAAYnd,EACAU,EACA0c,EACA5F,EACAC,EACA4F,EACAC,EACAC,EACApE,EACApb,EACA2Z,EACA8F,EACrBC,EACAC,EACAC,GAMN,IAAIC,EAAqB,KACrB5E,EAAc,GAIjBA,EAActB,EAOd,MACMmG,EAAKvc,GADGlB,GAAcG,WACAP,QAC5B6d,EAAGtc,OAAOuc,UAAW,EACfD,EAAGtc,OAAOwc,UAAY,UACtBF,EAAGtc,OAAOyc,gBAAsC,KAAnBxG,EAAyB,IAAM,IAClEqG,EAAGtc,OAAO0c,QAAU,QACpBJ,EAAGtc,OAAOT,OAAS,CAAEC,EAAG,GAAIC,EAAG,GAAIC,EAAG,GAAIC,EAAG,GAAIC,IAAK,GACtD0c,EAAGtc,OAAO2c,MAAQ,CAAEC,YAAW,EAC9BC,UAAU,EACVC,MAAO,EAAGtL,MAAOuK,EACjBgB,YAAY,EACZC,gBAAiB,UAElBV,EAAGtc,OAAOid,MAAQ,CAAEL,YAAW,EAC9BC,UAAU,EACVC,MAAO,EAAGtL,MAAOwK,EACjBe,YAAY,EACZG,gBAAgB,EAChBF,gBAAiB,UAKlB,MAAMG,EAA0D,iBAAbvF,EAAO,GAAiBA,EAASA,EAAOvgB,KAAIqgB,GC5CvD,SAAC5C,GAAyC,IAA3BsI,EAA2B,uDAAP,GAC5E,OAAKtI,EAGDA,EAAK/Y,QAAUqhB,EACXtI,EAEDA,EAAK5X,UAAU,EAAGkgB,GAAa,MAL9B,EAMR,CDoCqGC,CAA2B3F,EAAG,MA8BnI,GA5BmB,OAAbxB,IACJoG,EAAGtc,OAAOT,OAAS,CAAEC,EAAG,GAAIC,EAAG,GAAIC,EAAG,GAAIC,EAAG,GAAIC,IAAK,IAG/B,KAApBqW,IACHqG,EAAGtc,OAAO2c,MAAMW,MAAQ,CAAC,EAAGhpB,KAAKipB,OAAO/gB,IAAW,IAAyB,KAAnB/F,OAAO0jB,WAAkB,IAAI,MACtFmC,EAAGtc,OAAOid,MAAMO,WAAY,EAC5BlB,EAAGtc,OAAOid,MAAMQ,UAAY,SAC5BnB,EAAGtc,OAAOid,MAAMS,SAAW,QAC3BpB,EAAGtc,OAAOid,MAAMU,SAAWR,EAC3Bb,EAAGtc,OAAOid,MAAMW,SAAW,CAACte,KAAM,IAClCgd,EAAGtc,OAAOid,MAAMY,SAAWjG,EAC3B0E,EAAGtc,OAAOid,MAAMa,WAAa,MAGN,KAApB7H,IACMqG,EAAGtc,OAAOid,MAAMK,MAAQ,CAAC,EAAwB,KAArBhpB,KAAKipB,OAAO/gB,IACjD8f,EAAGtc,OAAO2c,MAAMa,WAAY,EAC5BlB,EAAGtc,OAAO2c,MAAMc,UAAY,SAC5BnB,EAAGtc,OAAO2c,MAAMe,SAAW,QAC3BpB,EAAGtc,OAAO2c,MAAMgB,SAAWR,EAC3Bb,EAAGtc,OAAO2c,MAAMkB,SAAWjG,EAC3B0E,EAAGtc,OAAO2c,MAAMiB,SAAW,CAACte,KAAM,IAClCgd,EAAGtc,OAAO2c,MAAMmB,WAAa,MAKhB,OAAX5H,EAAkB,CACrB,IAAI6H,EAAc7B,SAAAA,EAASQ,SAA8B,WAAnBR,EAAQQ,QAAuB,EAAIjF,EAAY1b,OAC1D,gBAGpB,YAHe,KAAlBka,GACHqG,EAAGtc,OAAOb,MAAsC,IAA7B,UAAAsY,EAAY,UAAZ,mBAAgBvb,SAAhB,eAAmBH,QAAoB,GAANoD,EAAaA,EAAkC,IAA1B,UAAAsY,EAAY,UAAZ,mBAAgBvb,SAAhB,eAAmBH,QAAUgiB,EAAa5e,EAAkC,IAA1B,UAAAsY,EAAY,UAAZ,mBAAgBvb,SAAhB,eAAmBH,QAAUgiB,EACxJzB,EAAGtc,OAAOvB,OAASA,IAEnB6d,EAAGtc,OAAOvB,OAAuC,IAA7B,UAAAgZ,EAAY,UAAZ,mBAAgBK,SAAhB,eAAmB/b,QAAqB,GAAP0C,EAAcA,EAAmC,IAA1B,UAAAgZ,EAAY,UAAZ,mBAAgBK,SAAhB,eAAmB/b,QAAUgiB,EAAatf,EAAmC,IAA1B,UAAAgZ,EAAY,UAAZ,mBAAgBK,SAAhB,eAAmB/b,QAAUgiB,EAC5JzB,EAAGtc,OAAOb,MAAQA,EAEnB,MACAmd,EAAGtc,OAAOvB,OAASA,EACnB6d,EAAGtc,OAAOb,MAAQA,EAIf+c,IACHI,EAAGtc,OAAS7I,OAAO8I,OAAO,CAAC,EAAGqc,EAAGtc,OAAQkc,IAK1C,IAAI8B,EAAoB,GAoCxB,GAhC0B,GAAtBvG,EAAY1b,QAAmC,KAApBka,GAAwC,OAAbC,GACzDuB,EAAYpgB,KAAI,CAACqgB,EAAGja,KAAM,MACzBia,SAAA,UAAAA,EAAGxb,SAAH,SAAM7E,KAAI6E,GACH8hB,EAASvhB,KAAKwhB,GAAchjB,QAAQiB,IAAM,EAAImC,GAAYC,QAAUD,GAAAA,QAAoBZ,MAGhGga,EAAYha,GAAGygB,OAAOvR,MAAQqR,CAA9B,IAIyB,GAAtBvG,EAAY1b,QAAmC,KAApBka,GAAwC,OAAbC,GACzDuB,EAAYpgB,KAAI,CAACqgB,EAAGja,KAAM,MACzBia,SAAA,UAAAA,EAAGI,SAAH,SAAMzgB,KAAIygB,GACHkG,EAASvhB,KAAKwhB,GAAchjB,QAAQ6c,IAAM,EAC9CzZ,GAAYC,QAAUD,GAAAA,QAAoBZ,MAG9Cga,EAAYha,GAAGygB,OAAOvR,MAAQqR,CAA9B,IAIgB,OAAb9H,GACHuB,EAAYpgB,KAAI,CAACqgB,EAAGja,KAAM,MACzBia,SAAA,UAAAA,EAAGE,cAAH,SAAWvgB,KAAI,CAACygB,EAAGlb,IACZohB,EAASvhB,KAAKwhB,GAAchjB,QAAQ6c,IAAM,EAC9CzZ,GAAYC,QAAUD,GAAAA,WAG1BoZ,EAAYha,GAAGygB,OAAOC,OAASH,CAA/B,IAIgB,UAAb9H,EAAuB,OAC1B,IAAIkI,EAAY,UAAG3G,EAAY3N,MAAK4N,IAAC,aAAI,UAAAA,EAAEI,SAAF,eAAK/b,QAAS,CAAlB,IAAqB+b,SAA1C,QAA+C,GAC/DuE,EAAS+B,EAAa/mB,KAAI,CAACqgB,EAAG2G,IAE5B,uBAAKvtB,IAAK8mB,EAAOyG,GAAQ3G,EAAGhK,MAAO,CAACsB,QAAQ,eAAgB7P,MAAO,QAClE,gBAAC,KAAD,CAAQrO,IAAK8mB,EAAOyG,GAClB3Q,MAAO,CAACjP,OAAQ,MAAOU,MAAO,MAAOwN,MAAO,UAAWwM,QAAWzB,EAAE0G,EAAaE,QAAO,CAACpiB,EAAG4b,IAAM5b,EAAI4b,GAAG,GAAI,IAAI,GAAI,OAEvH,2BACCF,EAAOyG,GACR,2BACC/pB,KAAKiqB,MAAO7G,EAAE0G,EAAaE,QAAO,CAACpiB,EAAG4b,IAAM5b,EAAI4b,GAAG,GAAI,KAAK,IAC7D,2BACC,IAAIsG,EAAaC,GAAO,MAI5B,CA4CD,OAzCIvC,GAA2B,UAAd5F,GAAuC,WAAdA,IACzCmG,EACE,gBAAC,KAAD,CACCxmB,KAAM4hB,EACNzX,OAAQsc,EAAGtc,OACX0N,MAAO,CAAC8Q,UAAgC,KAApBvI,EAA0B,OAAS,SACrDwI,UAAgC,KAApBxI,EAA0B,OAAQ,SAC9CxX,OAAQ,OACRE,UAAWF,EAAO,KAClBigB,SAAU,UACZzrB,OAASkN,GACTmM,QAAS2P,EACT0C,WAAY1C,KAMZH,GAA0B,SAAb5F,IACVmG,EACL,2BACiB,uBAAK3O,MAAO,CAAC+Q,UAAW,OACZD,UAAW,OACX7f,UAAWF,EAAO,KAClBsU,OAAQ,UACR5E,WAAY,QACZyQ,YAAa,UACzB,gBAACnE,GAAD,CACdtE,OAAQsB,EACRxB,iBAAkBA,EAClB+E,YAAavc,EAAS,KACtB6Y,WAAYyE,EACMxE,WAAYyE,EAC9Bf,kBAAkB,EAClBF,UAAWkB,OAOTI,CACN,CEvMK,SAASwC,GAAmBC,EAA+BC,EAA0BC,GAE3F,MACMC,EAAiB,GAAKD,GADH,GAAKD,IACkC,EAEhE,MAAO,CAENlD,YAAcplB,OAAO0jB,WAAa,IAAM,IAAM,IAC9C+E,WAAY5qB,KAAKiqB,MAAO9nB,OAAO0jB,WAAa,IAAM1jB,OAAO0jB,YAA8B,IAAhB8E,GAAmD,KAA3BxoB,OAAO0jB,WAAa,MACnHgF,WAAY7qB,KAAKiqB,MAAO9nB,OAAO0jB,WAAa,IAAM1jB,OAAO0jB,YAA8B,IAAhB8E,GAAuB,IAAmC,KAA3BxoB,OAAO0jB,WAAa,MAE1Ha,YAAcvkB,OAAO0jB,WAAa,IAAM,IAAM,IAC9CiF,YAAa9qB,KAAKiqB,OAAQ9nB,OAAO4oB,YAAc,MAAQ,IAAMP,GAA0B,KAEvFQ,gBAAkB7oB,OAAO0jB,WAAa,IAAM,IAAM,IAClDoF,sBAAuBjrB,KAAKiqB,MAAM9nB,OAAO4oB,YAAc,KACvDG,sBAAuBlrB,KAAKiqB,MAAmC,KAA5B9nB,OAAO4oB,YAAc,MACxDI,qBAAsBnrB,KAAKiqB,MAAkC,IAA3B9nB,OAAO0jB,WAAa,MACtDuF,mBAAoBprB,KAAKiqB,MAAM9nB,OAAO0jB,WAAa,IAAO1jB,OAAO0jB,WAAc,GAAK,IACpFwF,SAAUrrB,KAAKiqB,MAAM9nB,OAAO0jB,WAAa,IAAO1jB,OAAO0jB,WAAc,IAAM,IAE5E,CAgFD,MAsCMyF,GAAe,CAACC,EAAsBC,IACnCD,IACFE,GAAiBC,WACdF,EAAKG,sBAAsBjjB,MAG3B8iB,EAAKI,oBAAoBljB,MAK5B,IAAKmjB,I,SAAAA,GAAAA,EAAAA,EAAAA,IAAAA,GAAAA,MAAAA,EAAAA,EAAAA,IAAAA,GAAAA,MAAAA,EAAAA,EAAAA,MAAAA,GAAAA,QAAAA,EAAAA,EAAAA,KAAAA,GAAAA,OAAAA,EAAAA,EAAAA,OAAAA,GAAAA,Q,EAAAA,KAAAA,GAAAA,CAAAA,IAQZ,MAAMC,GAAgBC,IACrB,OAAQA,GACP,KAAKF,GAAUG,IACd,MAAO,MACR,KAAKH,GAAUI,IACd,MAAO,MACR,KAAKJ,GAAUjF,MACd,MAAO,QACR,KAAKiF,GAAUK,KACd,MAAO,UACR,KAAKL,GAAU1T,OACd,MAAO,SACR,QACC,MAAO,MAZT,EAkCM,IAAKsT,I,SAAAA,GAAAA,EAAAA,EAAAA,WAAAA,GAAAA,aAAAA,EAAAA,EAAAA,SAAAA,GAAAA,U,EAAAA,KAAAA,GAAAA,CAAAA,IAKZ,MAaMU,GAAuBZ,IAC5B,OAAQA,GACP,KAAKE,GAAiBC,WACrB,MAAO,IACR,KAAKD,GAAiBW,SAEtB,QACC,MAAO,IANT,EAUYC,GAAe,CAACzK,EAAsBD,KAClD,IAAI/E,EAAS,UAKb,OAHIgF,GAAaiK,GAAUI,MAC1BrP,GAAkB,gBAEZA,CAAP,EAGY+M,GAAgB,CAC5B,MACA,UACA,iBACA,mBACA,YACA,mBACA,aAGYnJ,GAAO,CAACoB,EAAsBD,EAAoCzZ,KAC9E,GAAI0Z,GAAaiK,GAAUK,KAC1B,OAAOhkB,EAAOnF,KAAIqgB,GAAK,GAAJ,OAAOA,EAAP,OAEpB,MAAMrU,EAAI7G,EAAO8hB,QAAO,CAAC5G,EAAGhY,KAAOgY,GAAK,IAAMhY,GAAK,IAAI,GAEvD,OAAIkhB,MAAMvd,GACF,GAGK7G,EAAOnF,KAAI6E,IACvB,GAASpJ,MAALoJ,GAAuBpJ,MAALuQ,EACrB,MAAO,SAER,GAAS,GAALA,EACH,MAAO,GAAP,OAAUnH,EAAV,SAED,MAAMqH,EAAKrH,EAAImH,EAAI,IAEnB,OAAIud,MAAMrd,GACF,GAAP,OAAUrH,EAAV,aAAgBmH,EAAhB,KAGG6S,GAAaiK,GAAUI,IACnB,GAAP,OAAUrkB,EAAV,kBAAqBqH,EAAEsd,QAAQ,GAA/B,MAEM,GAAP,OAAU3kB,EAAV,aAAgBqH,EAAEsd,QAAQ,GAA1B,QAGD,EAyBYC,GAAiBzT,IAAuB,kDACpD,MAAO6I,EAAWI,GAAgB5b,EAAAA,SAAe2S,EAAM0T,mBAChD9K,EAAkBM,GAAuB7b,EAAAA,SAAe2S,EAAM2T,0BAC9DC,EAAgBC,GAAqBxmB,EAAAA,UAAe,IAErD,MAAE+M,EAAF,SAASmE,GAAalR,EAAAA,WAAiBgR,KAEvC,OAAEyV,EAAF,SAAUC,EAAV,cAAoBnI,EAApB,YAAmCoI,EAAnC,eAAgDC,EAAhD,UAAgEtjB,EAAhE,WAA2EwZ,EAA3E,MAAuF+J,EAAvF,MAA8FC,EAA9F,WAAqGC,EAArG,gBAAiHC,EAAjH,UAAkIC,GAActU,EAEtJ,IAAI6H,EAAa,KAEhBA,EADG7H,EAAM6H,WACI7H,EAAM6H,WAEN,gBAACqF,GAAD,CAAkBC,eAAgBvB,EAAcjb,GAAYA,UAAWA,EAAWoL,aAAckY,IAG9G,MAAMM,EAAa,CAAEhjB,QAAS,EAAGW,OAAQ,GAAId,OAAQ,OAAQC,UAAW,KAClEmjB,EAA0B,CAAE7S,QAAS,OAAiBC,WAAY,SAAmBF,eAAgB,SAAmBuC,UAAW,UAEnI1J,EAAaiX,GAAkB,UAAC6C,aAAD,EAACA,EAAiB5C,6BAAlB,QAA2C,GAA3C,UAA+C4C,aAA/C,EAA+CA,EAAiB3C,uBAAhE,QAAmF,GAAnF,UAAuF2C,aAAvF,EAAuFA,EAAiB1C,oBAAxG,QAAwH,GAG7J,GAAIvX,EAAMuC,KAAKI,UAEd,OACC,uBAAK8J,UAAW,QAASxG,MAAO,CAC/BkJ,MAAO,QACPzX,MAAO,OACPV,OAAQ,OACRG,QAAS,SAET,gBAACmW,GAAD,CAAWI,SAAUqC,EAAYxC,QAASwC,EAAYtC,WAAYA,EAAYxH,MAAOkU,GACpF,uBAAKlU,MAAO,CAAEjP,OAAQmJ,EAAWoT,YAAa1J,UAAW,SAAU5C,SAAU,WAAY+C,IAAK,MAAO,gBAACqQ,GAAA,EAAD,OACpGzU,EAAM0U,QAAU1U,EAAM0U,OAAO7L,KAOlC,MAAM8L,EACL3U,EAAM4U,+BAAiCb,EAASrlB,OAASsR,EAAM4U,8BAC5D5U,EAAM4U,8BACN,EAEEhG,EACL5O,EAAM4O,UAAY5O,EAAM4O,SAAS/F,EAAWD,IAC5C9C,GAAiBkO,EAAarjB,EAC5BkY,GAAaiK,GAAUI,IACrBziB,GAAKA,EAAEjI,KAAK+hB,OAAO9Z,EAAEokB,aAAaluB,WAClCiiB,GAAoB8J,GAAiBC,WACpCliB,GAAKA,EAAEga,EAAE9jB,WACT8J,GAAKA,EAAE5B,EAAElI,YAGTmiB,EAA8B,GAC9BhH,EAAO+J,EAEPhR,GAAY,CACjBia,aAAc1B,GAAoBxK,GAClCG,OAAQwJ,GAAa3J,EAAkBsL,GACvClL,OAAQuJ,GAAa3J,EAAkBuL,GACvC3a,KAAMuZ,GAAalK,GACnB8E,YAAaiG,EAAiBrZ,EAAW4X,sBAAwB5X,EAAWoT,YAC5EmE,WAAY8B,EAAiBrZ,EAAW6X,qBAAuB7X,EAAWuX,WAC1EtD,YAAaoF,EAAiBrZ,EAAW2X,sBAAwB3X,EAAWiU,YAC5EqD,WAAY+B,EAAiBrZ,EAAW6X,qBAAuB7X,EAAWsX,WAC1ES,SAAUsB,EAAiBrZ,EAAW8X,mBAAqB9X,EAAW+X,SACtEyC,UAAY1J,GApPQ,EAACmH,EAAsB4B,EAAyBjlB,KACrE,OAAQqjB,GACP,KAAKE,GAAiBC,WACrB,OAAIyB,EAAWxB,sBAAsBoC,SAC7B7lB,EAAOJ,QAAQ2b,UAEfvb,EAIT,KAAKujB,GAAiBW,SACrB,OAAIe,EAAWvB,oBAAoBmC,SAC3B7lB,EAAOJ,QAAQ2b,UAEfvb,EAbV,EAmP6B8lB,CAAcrM,EAAkBwL,EAAY/I,GACxE6J,UAAY/iB,GAvQQ,EAACqgB,EAAsB4B,EAAyB7J,KACrE,OAAQiI,GACP,KAAKE,GAAiBC,WACrB,OAAIyB,EAAWxB,sBAAsBoC,SAC7BzK,EAAOxb,QAAQ2b,UAEfH,EAIT,KAAKmI,GAAiBW,SACrB,OAAIe,EAAWvB,oBAAoBmC,SAC3BzK,EAAOxb,QAAQ2b,UAEfH,EAbV,EAsQ6B4K,CAAcvM,EAAkBwL,EAAYjiB,IAKnEoY,GAAS1P,GAAUqa,UAAUnB,EAASY,GAASpK,SAEpDwJ,GAAY,IAAI1oB,SAASgf,IACzB,IAAI7hB,EAAkB6hB,EAClBrK,EAAMoV,mBACT5sB,EArG8BurB,KAChC,MAAMsB,EAAWtB,EAASxJ,OAAO+K,WAAUjL,GAAKuG,GAAchjB,QAAQyc,IAAM,IAE5E,IAAiB,GAAbgL,EACH,OAAOtB,EAER,MAAMwB,EAAWxB,EAASxJ,OAAO8K,GAC3BG,EAAWzB,EAAS5kB,OAAOkmB,GAQjC,OANAtB,EAAS5kB,OAAOsmB,OAAOJ,EAAU,GACjCtB,EAASxJ,OAAOkL,OAAOJ,EAAU,GAEjCtB,EAAS5kB,OAAO2b,QAAQ0K,GACxBzB,EAASxJ,OAAOO,QAAQyK,GAEjB,CACNpmB,OAAQ4kB,EAAS5kB,OACjBob,OAAQwJ,EAASxJ,OACjBhf,KAAMwoB,EAASxoB,KAHhB,EAsFSmqB,CAAiBrL,IAIzB,MAAMlb,EAAS0L,GAAUka,UAAUvsB,EAAK2G,QAIpC0Z,GAAaiK,GAAUI,IAC1BpK,EAAO1Z,KAAK,CACXD,OAAQA,EACR5D,KAAM/C,EAAK+C,KACXgf,OAAQA,GACR9C,KAAMqM,GAAUA,EAAO3kB,IAAWsY,GAAKoB,EAAWD,EAAkBzZ,GACpEwmB,aAAcrC,GAAazK,GAC3B+M,UAAW,OACXC,KAAM,GACNrc,KAAMqB,GAAUrB,KAChBsc,YAAY,EACZC,UAAW,YACXC,sBAAuB,aACvBC,aAAc,OACdC,WAAgCzwB,MAApBua,EAAMmW,YAA0BnW,EAAMmW,WAClDtF,OAAQ,CAAC,EACT3K,MAAM,IAGC0C,GAAoB8J,GAAiBW,SAC7CvK,EAAO1Z,KAAK,CACXP,EAAG0b,GACHE,EAAGtb,EACH5D,KAAM/C,EAAK+C,KACXuqB,YAAY,EACZrO,KAAMqM,GAAUA,EAAO3kB,IAAWsY,GAAKoB,EAAWD,EAAkBzZ,GACpEwmB,aAAcrC,GAAazK,GAC3BoN,aAAc,aACdC,WAAgCzwB,MAApBua,EAAMmW,YAA0BnW,EAAMmW,WAClDC,SAAU,CACTnkB,KAAM,IAEPokB,UAAWrW,EAAMsW,cAAgB/L,GACjCgM,cAAevW,EAAMuW,eAAN,0BAA0CjC,EAA1C,gCACf9a,KAAMqB,GAAUrB,KAChBgd,YAAa3b,GAAUia,aACvBjE,OAAQ,CAAC,IAIFjI,GAAoB8J,GAAiBC,YAC7C7J,EAAO1Z,KAAK,CACXP,EAAGM,EACHsb,EAAGF,GACHhf,KAAM/C,EAAK+C,KACXuqB,YAAY,EACZrO,KAAMqM,GAAUA,EAAO3kB,IAAWsY,GAAKoB,EAAWD,EAAkBzZ,GACpEwmB,aAAcrC,GAAazK,GAC3BoN,aAAc,aACdC,WAAgCzwB,MAApBua,EAAMmW,YAA0BnW,EAAMmW,WAClDC,SAAU,CACTnkB,KAAM,IAEPokB,UAAWrW,EAAMsW,cAAgB/L,GACjCgM,cAAevW,EAAMuW,eAAN,0BAA0CjC,EAA1C,gCACf9a,KAAMqB,GAAUrB,KAChBgd,YAAa3b,GAAUia,aACvBjE,OAAQ,CAAC,GAGV,IAMF,IAAIle,GAAiC,CAAC,EAIlCwhB,EAAMvB,sBAAsBvS,OAASqS,GAAiBC,YAAc/J,IACvEjW,GAAOid,MAAQ9lB,OAAO8I,OAAO,CAAC,EAAGD,GAAOid,MAAOuE,EAAMvB,sBAAsBvS,QAGxE8T,EAAMtB,oBAAoBxS,OAASqS,GAAiBW,UAAYzK,IACnEjW,GAAOid,MAAQ9lB,OAAO8I,OAAO,CAAC,EAAGD,GAAOid,MAAOuE,EAAMtB,oBAAoBxS,QAGtE6T,EAAMtB,sBAAsBvS,OAASqS,GAAiBC,YAAc/J,IACvEjW,GAAO2c,MAAQxlB,OAAO8I,OAAO,CAAC,EAAGD,GAAO2c,MAAO4E,EAAMtB,sBAAsBvS,QAGxE6T,EAAMrB,oBAAoBxS,OAASqS,GAAiBW,UAAYzK,IACnEjW,GAAO2c,MAAQxlB,OAAO8I,OAAO,CAAC,EAAGD,GAAO2c,MAAO4E,EAAMrB,oBAAoBxS,QAGtEwI,GAAaiK,GAAUI,MAC1BvgB,GAAOT,OAAS,CAAEC,EAAG,GAAIC,EAAG,GAAIC,EAAG,GAAIC,EAAG,GAAIC,IAAK,IAGpD,MAAMkc,GAAYsF,EAASY,GAASxlB,OAAOT,OAAS,EAE9CsgB,GAASld,GACdyc,GAAY1T,GAAU8S,YACrB7b,EACA+I,EACAA,GAAUia,aACVja,GAAUrB,KACViV,GACA5T,GAAUkO,OACVlO,GAAUmO,OACV+K,EAASY,GAASpK,OAClBwJ,EAASY,GAASxlB,OAClB2Z,EACA8F,EACAjc,GACAqN,EAAM8O,OAGF2H,GACL,gBAAC1O,GAAD,CACCC,KAAI,oBAAEhI,EAAMyW,kBAAR,aAAE,EAAkBC,mBAApB,SACJzO,KAAI,oBAAEjI,EAAMyW,kBAAR,aAAE,EAAkBE,qBAApB,SACJzO,MAAK,oBAAElI,EAAMyW,kBAAR,aAAE,EAAkBvO,aAApB,SACLC,QAAO,oBAAEnI,EAAMyW,kBAAR,aAAE,EAAkBG,YAApB,SACPxO,IAAG,oBAAEpI,EAAMyW,kBAAR,aAAE,EAAkBrO,WAApB,SACHC,OAAM,oBAAErI,EAAMyW,kBAAR,aAAE,EAAkBpO,cAApB,SACNC,cAAa,oBAAEtI,EAAMyW,kBAAR,aAAE,EAAkBnO,qBAApB,SACbC,cAAa,oBAAEvI,EAAMyW,kBAAR,aAAE,EAAkBlO,qBAApB,SACbE,aAAcmL,EACdpL,iBAAgB,oBAAExI,EAAMyW,kBAAR,aAAE,EAAkBI,kBAApB,SAChBnO,YAAuCjjB,OAA1B,UAAAua,EAAMyW,kBAAN,eAAkBK,MAC/BnO,YAAuCljB,OAA1B,UAAAua,EAAMyW,kBAAN,eAAkBK,MAAoB9W,EAAMyW,WAAWK,KAAO,CAAC,IAC5ElO,iBAAkB/N,GAAUia,aAC5BjM,UAAWhO,GAAUrB,KACrBsP,OAAQA,EACRC,OAAQlO,GAAUkO,OAClBC,OAAQnO,GAAUmO,OAClB7E,MAAOgG,EACPjB,oBAAsBmB,GAAcnB,EAzTXsJ,KAC3B,OAAQA,GACP,IAAK,IAML,QACC,OAAOE,GAAiBC,WAJzB,IAAK,IACJ,OAAOD,GAAiBW,SAL1B,EAwT0D0D,CAAmB1M,IAC3EpB,aAAeoB,GAAcpB,EAjVX+J,KACpB,OAAQA,GACP,IAAK,MACJ,OAAOF,GAAUI,IAClB,IAAK,MAQL,QACC,OAAOJ,GAAUG,IAPlB,IAAK,QACJ,OAAOH,GAAUjF,MAClB,IAAK,UACJ,OAAOiF,GAAUK,KAClB,IAAK,SACJ,OAAOL,GAAU1T,OAVnB,EAgV4C4X,CAAY3M,IACtDlB,cAAe0K,EACfzK,eAAgBwC,IAKlB,IAAIqL,GAAY,KAgBhB,OAdCA,GADGjX,EAAMkX,QAER,gBAACC,GAAA,GAAD,CAAMC,WAAS,GACd,gBAACD,GAAA,GAAD,CAAME,MAAI,EAACC,GAAI,EAAGjX,MAAO,CAAEkE,SAA+B,GAArB1J,GAAUyX,SAAgBhS,UAAW,KAAON,EAAMkX,SACvF,gBAACC,GAAA,GAAD,CAAME,MAAI,EAACC,GAAI,GAAItI,GAA6B,GAAvBnU,GAAUiX,cAKpC,gBAACqF,GAAA,GAAD,CAAMC,WAAS,GACd,gBAACD,GAAA,GAAD,CAAME,MAAI,EAACC,GAAI,IAAKtI,GAAMnU,GAAUiX,cAKnC8B,EAEF,gBAAC2D,GAAA,EAAD,CACC1Y,KAAM+U,EACN4D,WAAW,EACXnG,UAAU,EACVhR,MAAO,CACNvO,MAAQ1I,OAAO0jB,WAAa,IAC5B1b,OAAkC,IAAxByJ,GAAU8S,YACpB7M,WAAY,GACZyQ,YAAa,KAGd,gBAAC7J,GAAD,CAAWrH,MAAOkU,EAAY5M,QAASwC,EAAYrC,SAAUqC,GAC5D,uBAAK9J,MAAO,CAAEC,UAAW,QAASiJ,MAAO,QAAS5H,QAAS,WACzD8U,GACD,2BACC,uBAAK5U,IAAKC,EAAMC,IAAI,6BAA6BjQ,MAAO,IAAKuO,MAAO,CAAEC,UAAW,WAEnF,uBAAKD,MAAO,CAAES,WAAY,SACzB,uBAAKT,MAAOmU,GACVyC,GACD,uBAAK5W,MAAO,CAAEoX,SAAU,QAASnX,UAAWuI,GAAaiK,GAAUG,IAAM,GAAK,IAAMjT,EAAM0U,QAAU1U,EAAM0U,OAAO7L,QAStH,2BACC,uBAAKhC,UAAW,QAASpjB,IAAK0mB,EAAY9J,MAAO,CAAEkJ,MAAO,QAASzX,MAAO,OAAQV,OAAQ,OAAQG,QAAS,SACzGklB,IAEF,gBAAC/O,GAAD,CAAWI,SAAUqC,EAAYxC,QAASwC,EAAYtC,WAAYA,EAAYxH,MAAOkU,GAEnF,uBAAKlU,MAAOmU,GACX,2BACEyC,GAED,uBAAK5W,MAAO,CAAEC,UAAWuI,GAAaiK,GAAUG,IAAM,GAAK,IAAMjT,EAAM0U,QAAU1U,EAAM0U,OAAO7L,KAE5F4F,IAAazO,EAAM0X,eACpB,uBAAKrX,MAAO,CAAEvO,MAAO,OAAQ6lB,MAAO,OAAQtW,SAAU,WAAY+C,IAAK,GAAIH,UAAW,WACpFjE,EAAM0X,kBAff,ECjiBM,SAASE,GAAsB5X,GAErC,MAAM,gBAAE6X,EAAF,iBAAmBC,EAAnB,kBAAqCC,EAArC,cAAwDnM,EAAxD,YAAuEoI,EAAvE,eAAoFC,GAAmBjU,EACvGoG,EAAYyR,EAElB,IAAIG,EAAkB,GAClBC,EAAkB,GAClBC,EAAkB,GAClBC,EAAkB,GAClBC,EAAkB,GAClBC,EAAkB,GAElBC,EAAkB,GAClBC,EAAkB,GAClBC,EAAkB,GAClBC,EAAkB,GAClBC,EAAkB,GAClBC,EAAkB,GAElBC,EAAU,CAAC,EACXC,EAAW,CAAC,EACZC,EAAY,CAAC,EAGjBd,EAAkB5R,EAAUjX,OAC5B8oB,EAAkB7R,EAAUmE,OAC5B+N,EAAkBlS,EAAUjX,OAAOJ,QAAQ2b,UAC3C6N,EAAkBnS,EAAUmE,OAAOxb,QAAQ2b,UAC3CkO,EAAU,CAAE,KAAQ,gBAAiB,OAAUX,EAAiB,eAAkBM,EAAiB,OAAUP,EAAiB,eAAkBM,GAEhJJ,EAAkBJ,EAAiB3oB,OACnCgpB,EAAkBL,EAAiBvN,OACnCiO,EAAkBV,EAAiB3oB,OAAOJ,QAAQ2b,UAClD+N,EAAkBX,EAAiBvN,OAAOxb,QAAQ2b,UAClDmO,EAAW,CAAE,KAAQ,WAAY,OAAUV,EAAiB,eAAkBM,EAAiB,OAAUP,EAAiB,eAAkBM,GAE5IJ,EAAkBL,EAAkB5oB,OACpCkpB,EAAkBN,EAAkBxN,OACpCmO,EAAkBX,EAAkB5oB,OAAOJ,QAAQ2b,UACnDiO,EAAkBZ,EAAkBxN,OAAOxb,QAAQ2b,UACnDoO,EAAY,CAAE,KAAQ,YAAa,OAAUT,EAAiB,eAAkBM,EAAiB,OAAUP,EAAiB,eAAkBM,GAE9I,MAAMK,EAAqB,GAoC3B,OAlCAA,EAAY3pB,KAAKypB,GACjBE,EAAY3pB,KAAK0pB,GACjBC,EAAY3pB,KAAKwpB,GAiChB,gBAACnF,GAAD,CACCS,MAAO,CAAEtB,sBAAuB,CAAEjjB,MAAO,IAAMkjB,oBAAqB,CAAEljB,MAAO,KAC7EwkB,MAAO,CAAEvB,sBAAuB,CAAEjjB,MAAO,IAAMkjB,oBAAqB,CAAEljB,MAAO,KAC7EykB,WAAY,CAAExB,sBAAuB,CAAEoC,UAAU,GAASnC,oBAAqB,CAAEmC,UAAU,IAC3FrB,wBAAyBjB,GAAiBC,WAC1Ce,iBAAkBZ,GAAUG,IAC5B9I,WAAW,YACXxZ,UAAWyE,GAAAA,IAAAA,IACX2e,SAAUgF,EACVnN,cAAe5L,EAAM4L,cACrBoI,YAAahU,EAAMgU,YACnBC,eAAgBjU,EAAMiU,eACtBK,UAAU,mBACVmC,WAAY,CACXG,MAAM,EACNxO,KAAK,EACL0O,KAxBiB,CAAC,YAAa,iDACjC,aAAc,6DACd,iBAAkB,qFAClB,GAAI,4GAuBHzC,gBAAiB,CAChB5C,sBAAuB,GACvBC,gBAAiB,GACjBC,aAAc,GAEf+C,OAtDc7L,GACXA,GAAaiK,GAAUjF,MACnB,KAGP,uBAAKhH,UAAU,eACd,2BACC,uBAAKA,UAAU,MAAMxG,MAAO,CAAEoF,gBAAiBzU,GAAAA,QAAAA,MAC/C,uBAAK6V,UAAU,SAAf,aAED,2BACC,uBAAKA,UAAU,MAAMxG,MAAO,CAAEoF,gBAAiBzU,GAAAA,QAAAA,MAC/C,uBAAK6V,UAAU,SAAf,cAED,2BACC,uBAAKA,UAAU,MAAMxG,MAAO,CAAEoF,gBAAiBzU,GAAAA,QAAAA,MAC/C,uBAAK6V,UAAU,SAAf,oBA2CJ,C,mJC7HM,MAAMmS,WAA4B3rB,EAAAA,UAErClE,YAAY6W,GACRwG,MAAMxG,GADS,qCASiB,CAACvP,EAAWwoB,KAC5C,MAAM,KAAEzwB,EAAF,UAAQmI,EAAR,UAAmBgK,GAAcpR,KAAKyW,OACtC,KAAE1Q,GAAS9G,EAKjB,OAAOmS,EAAUhK,EAAW,CAACF,IAHbnB,GAAQd,EAAAA,SAAuBc,IAAS,IAAId,GACnC0qB,SAASD,EAAY,IAAM,IAAIzqB,EAExD,IAhBe,kBAmBV,KACL,MAAM,KAAEhG,EAAF,UAAQmI,EAAR,aAAmBoL,GAAiBxS,KAAKyW,MACzCpE,EAAUpN,EAAAA,SAAuBhG,EAAK8G,MACtCb,EAAQmN,EAAQnN,MAChBmB,EAAcgM,EAAQhM,cAAcnC,QAAtB,QAAuCA,QAAvC,QAEpB,OAAIjF,GAAQA,EAAK8G,KAET,uBAAKuX,UAAU,mBACX,4BAAM,qBAAG5H,QAASwK,GAAK1N,EAAapL,IAA9B,OAAN,OACClC,EAAMzE,KAAI,CAACyG,EAAGL,IACPA,IAAM3B,EAAMC,OAAS,EACd,wBAAMjL,IAAK2M,GAAG,qBAAG6O,QAASwK,GAAKlgB,KAAK4c,0BAA0B1V,EAAGL,IAAMK,GAAOlC,GAE9E,wBAAM9K,IAAK2M,GAAIR,MAOlC,uBAAKiX,UAAU,mBAAf,IAAR,GAtCH,ECWE,SAASsS,GAAsBnZ,GACrC,MAAM,gBAAE6X,EAAF,iBAAmBC,EAAnB,kBAAqCC,EAArC,cAAwDnM,EAAxD,YAAuEoI,EAAvE,eAAoFC,GAAmBjU,EACvGoG,EAAYyR,EAElB,IAAIG,EAAkB,GAClBC,EAAkB,GAClBC,EAAkB,GAClBC,EAAkB,GAClBC,EAAkB,GAClBC,EAAkB,GAElBC,EAAkB,GAClBC,EAAkB,GAClBC,EAAkB,GAClBC,EAAkB,GAClBC,EAAkB,GAClBC,EAAkB,GAElBC,EAAU,CAAC,EACXC,EAAW,CAAC,EACZC,EAAY,CAAC,EAGjBd,EAAkB5R,EAAUjX,OAC5B8oB,EAAkB7R,EAAUmE,OAC5B+N,EAAkBlS,EAAUjX,OAAOJ,QAAQ2b,UAC3C6N,EAAkBnS,EAAUmE,OAAOxb,QAAQ2b,UAC3CkO,EAAU,CAAE,KAAQ,gBAAiB,OAAUX,EAAiB,eAAkBM,EAAiB,OAAUP,EAAiB,eAAkBM,GAEhJJ,EAAkBJ,EAAiB3oB,OACnCgpB,EAAkBL,EAAiBvN,OACnCiO,EAAkBV,EAAiB3oB,OAAOJ,QAAQ2b,UAClD+N,EAAkBX,EAAiBvN,OAAOxb,QAAQ2b,UAClDmO,EAAW,CAAE,KAAQ,WAAY,OAAUV,EAAiB,eAAkBM,EAAiB,OAAUP,EAAiB,eAAkBM,GAE5IJ,EAAkBL,EAAkB5oB,OACpCkpB,EAAkBN,EAAkBxN,OACpCmO,EAAkBX,EAAkB5oB,OAAOJ,QAAQ2b,UACnDiO,EAAkBZ,EAAkBxN,OAAOxb,QAAQ2b,UACnDoO,EAAY,CAAE,KAAQ,YAAa,OAAUT,EAAiB,eAAkBM,EAAiB,OAAUP,EAAiB,eAAkBM,GAE9I,MAAMK,EAAqB,GAE3BA,EAAY3pB,KAAKypB,GACjBE,EAAY3pB,KAAK0pB,GACjBC,EAAY3pB,KAAKwpB,GAIjB,MAAMQ,EAAgBpB,EAAgB/G,QAAO,CAAC5G,EAAGhY,IAAMgY,EAAIhY,GAAG,GACxDgnB,EAAYjB,EAAgBnH,QAAO,CAAC5G,EAAGhY,IAAMgY,EAAIhY,GAAG,GACpDinB,EAAWpB,EAAgBjH,QAAO,CAAC5G,EAAGhY,IAAMgY,EAAIhY,GAAG,GACnDknB,IAAuBH,EAAgBC,GAAaA,EAAY,KAAK7F,QAAQ,GAsE7E3L,EACL,gBAACmR,GAAD,CAAqBxwB,KAAM4d,EAAWzV,UAAWyE,GAAAA,KAAAA,IAA8BuF,UAAWqZ,EAAajY,aAAckY,IAItH,OACC,gBAACR,GAAD,CACCS,MAAO,CAAEtB,sBAAuB,CAAEjjB,MAAO,IAAMkjB,oBAAqB,CAAEljB,MAAO,KAC7EwkB,MAAO,CAAEvB,sBAAuB,CAAEjjB,MAAO,IAAMkjB,oBAAqB,CAAEljB,MAAO,KAC7EykB,WAAY,CAAExB,sBAAuB,CAAEoC,UAAU,GAASnC,oBAAqB,CAAEmC,UAAU,IAC3FrB,wBAAyBjB,GAAiBW,SAC1CK,iBAAkBZ,GAAUK,KAC5BhJ,WAAW,wBACXxZ,UAAW,GACXojB,SAAUgF,EACVnE,8BAA+B,EAC/BhJ,cAAe5L,EAAM4L,cACrBoI,YAAahU,EAAMgU,YACnBC,eAAgBjU,EAAMiU,eACtBrF,SAvBe,CAAC/F,EAAsBD,IACvCzC,GAA0BnG,EAAMgU,YAAa5e,GAAAA,KAAAA,IAA8BgR,EAAYyC,GAAaiK,GAAUI,IAAMziB,GAAKA,EAAEjI,KAAK+hB,OAAO9Z,EAAEokB,aAAaluB,WAAciiB,GAAoB8J,GAAiBC,WAAaliB,GAAKA,EAAEga,EAAE9jB,WAAa8J,GAAKA,EAAE5B,EAAElI,YAuBpP2tB,UAAU,mBACVR,OAASzI,GAAMA,EAAErhB,IAAIohB,QACrBvD,WAAYA,EACZ4O,WAAY,CACXrO,KAAK,EACLsO,aAAa,EACbC,eAAe,EACfG,KAjEiB,CAAC,YAAa,iDACjC,aAAc,6DACd,iBAAkB,qFAClB,uBAAwB,0JACxB,GAAI,4GA+DHzC,gBAAiB,CAChB5C,sBAAuB,GACvBC,gBAAiB,GACjBC,aAAc,GAEfuF,QApGA,gBAACC,GAAA,GAAD,CAAMC,WAAS,EAACnS,QAAS,GACxB,gBAACkS,GAAA,GAAD,CAAME,MAAI,EAACC,GAAI,GACbgC,EAAShL,iBACV,2BACC+K,EAAU/K,iBACX,2BACC8K,EAAc9K,iBACf,2BACCiL,EAPF,IAQC,2BACCvZ,EAAMwZ,gBAER,gBAACrC,GAAA,GAAD,CAAME,MAAI,EAACC,GAAI,GAAf,WAEC,2BAFD,YAIC,2BAJD,gBAMC,2BAND,sBAQC,2BARD,wCAyFD5C,OAjEc7L,GAEXA,GAAaiK,GAAUjF,MACnB,KAIP,uBAAKhH,UAAU,eACd,2BACC,uBAAKA,UAAU,MAAMxG,MAAO,CAAEoF,gBAAiBzU,GAAAA,QAAAA,MAC/C,uBAAK6V,UAAU,SAAf,aAED,2BACC,uBAAKA,UAAU,MAAMxG,MAAO,CAAEoF,gBAAiBzU,GAAAA,QAAAA,MAC/C,uBAAK6V,UAAU,SAAf,cAED,2BACC,uBAAKA,UAAU,MAAMxG,MAAO,CAAEoF,gBAAiBzU,GAAAA,QAAAA,MAC/C,uBAAK6V,UAAU,SAAf,oBAkDJ,CC9KM,SAAS4S,GAAoBzZ,GAKnC,OACC,gBAACyT,GAAD,CACCS,MAAO,CAAEtB,sBAAuB,CAAEjjB,MAAO,uBAAyBkjB,oBAAqB,CAAEljB,MAAO,KAChGwkB,MAAO,CAAEvB,sBAAuB,CAAEjjB,MAAO,IAAMkjB,oBAAqB,CAAEljB,MAAO,wBAC7EykB,WAAY,CAAExB,sBAAuB,CAAEoC,UAAU,GAASnC,oBAAqB,CAAEmC,UAAU,IAC3FrB,wBAAyBjB,GAAiBC,WAC1Ce,iBAAkBZ,GAAUG,IAC5B9I,WAAW,cACXxZ,UAAW,GACXojB,SAAU,CAAC/T,EAAM+T,UACjBlM,WAAY,gBAACmR,GAAD,CAAqBxwB,KAAMwX,EAAM+T,SAAUpjB,UAAWyE,GAAAA,YAAAA,IAAqCuF,UAAWqF,EAAMgU,YAAajY,aAAciE,EAAMiU,iBACzJrI,cAAe5L,EAAM4L,cACrBgD,SAfe,CAAC/F,EAAsBD,IACvCzC,GAA0BnG,EAAMgU,YAAa5e,GAAAA,YAAAA,IAAqC4K,EAAM+T,SAAWlL,GAAaiK,GAAUI,IAAMziB,GAAKA,EAAEjI,KAAK+hB,OAAO9Z,EAAEokB,aAAaluB,WAAciiB,GAAoB8J,GAAiBC,WAAaliB,GAAKA,EAAEga,EAAE9jB,WAAa8J,GAAKA,EAAE5B,EAAElI,YAehQqtB,YAAahU,EAAMgU,YACnBC,eAAgBjU,EAAMiU,eACtBK,UAAU,YACVc,kBAAkB,EAClBqB,WAAY,CACXG,MAAM,GAEPvC,gBAAiB,CAChB5C,sBAAuB,GACvBC,gBAAiB,GACjBC,aAAc,IAKjB,CCrBM,SAAS+H,GAAqB1Z,GAEpC,OACC,gBAACyT,GAAD,CACCS,MAAO,CAAEtB,sBAAuB,CAAEjjB,MAAO,uBAAyBkjB,oBAAqB,CAAEljB,MAAO,eAChGwkB,MAAO,CAAEvB,sBAAuB,CAAEjjB,MAAO,cAAgBkjB,oBAAqB,CAAEljB,MAAO,wBACvFykB,WAAY,CAAExB,sBAAuB,CAAEoC,UAAU,GAASnC,oBAAqB,CAAEmC,UAAU,IAC3FrB,wBAAyBjB,GAAiBC,WAC1Ce,iBAAkBZ,GAAUG,IAC5B9I,WAAW,aACXxZ,UAAWyE,GAAAA,WAAAA,IACX2e,SAAU,CAAC/T,EAAM+T,UACjBnI,cAAe5L,EAAM4L,cACrBoI,YAAahU,EAAMgU,YACnBC,eAAgBjU,EAAMiU,eACtBK,UAAU,YACVmC,WAAY,CACXG,MAAM,GAEPvC,gBAAiB,CAChB5C,sBAAuB,GACvBC,gBAAiB,GACjBC,aAAc,GAEfyD,kBAAkB,GAIpB,CC9BM,SAASuE,GAA0B3Z,GAEzC,OACC,gBAACyT,GAAD,CACCS,MAAO,CAAEtB,sBAAuB,CAAEjjB,MAAO,uBAAyBkjB,oBAAqB,CAAEljB,MAAO,GAAF,OAAKjN,EAAL,sBAC9FyxB,MAAO,CAAEvB,sBAAuB,CAAEjjB,MAAO,GAAF,OAAKjN,EAAL,qBAAmCmwB,oBAAqB,CAAEljB,MAAO,wBACxGykB,WAAY,CAAExB,sBAAuB,CAAEoC,UAAU,GAAQnC,oBAAqB,CAAEmC,UAAU,IAC1FrB,wBAAyBjB,GAAiBW,SAC1CK,iBAAkBZ,GAAUI,IAC5B/I,WAAU,uCAAkCznB,EAAlC,KACViO,UAAWyE,GAAAA,kBAAAA,IACX2e,SAAU,CAAC/T,EAAM+T,UACjBnI,cAAe5L,EAAM4L,cACrBoI,YAAahU,EAAMgU,YACnBC,eAAgBjU,EAAMiU,eACtBK,UAAU,YACVmC,WAAY,CACXG,MAAM,GAEPvC,gBAAiB,CAChB5C,sBAAuB,GACvBC,gBAAiB,GACjBC,aAAc,IAIjB,CCxCM,SAASiI,GAAiB5Z,GAEhC,OACC,gBAACyT,GAAD,CACCS,MAAO,CAAEtB,sBAAuB,CAAEjjB,MAAO,uBAAyBkjB,oBAAqB,CAAEljB,MAAO,UAChGwkB,MAAO,CAAEvB,sBAAuB,CAAEjjB,MAAO,SAAWkjB,oBAAqB,CAAEljB,MAAO,wBAClFykB,WAAY,CAAExB,sBAAuB,CAAEoC,UAAU,GAASnC,oBAAqB,CAAEmC,UAAU,IAC3FrB,wBAAyBjB,GAAiBW,SAC1CK,iBAAkBZ,GAAUG,IAC5B9I,WAAW,gBACXxZ,UAAWyE,GAAAA,SAAAA,IACX2e,SAAU,CAAC/T,EAAM+T,UACjBnI,cAAe5L,EAAM4L,cACrBoI,YAAahU,EAAMgU,YACnBC,eAAgBjU,EAAMiU,eACtBK,UAAU,YACVc,kBAAkB,EAClBqB,WAAY,CACXG,MAAM,GAEPvC,gBAAiB,CAChB5C,sBAAuB,GACvBC,gBAAiB,GACjBC,aAAc,IAIjB,CC3BM,SAASkI,GAAoB7Z,GAEnC,OACC,gBAACyT,GAAD,CACCS,MAAO,CAAEtB,sBAAuB,CAAEjjB,MAAO,uBAAyBkjB,oBAAqB,CAAEljB,MAAO,KAChGwkB,MAAO,CAAEvB,sBAAuB,CAAEjjB,MAAO,IAAMkjB,oBAAqB,CAAEljB,MAAO,wBAC7EykB,WAAY,CAAExB,sBAAuB,CAAEoC,UAAU,GAASnC,oBAAqB,CAAEmC,UAAU,IAC3FrB,wBAAyBjB,GAAiBC,WAC1Ce,iBAAkBZ,GAAUG,IAC5B9I,WAAW,mBACXxZ,UAAWyE,GAAAA,SAAAA,IACX2e,SAAU,CAAC/T,EAAM+T,UACjBnI,cAAe5L,EAAM4L,cACrBoI,YAAahU,EAAMgU,YACnBC,eAAgBjU,EAAMiU,eACtBmB,kBAAkB,EAClBd,UAAU,YACVmC,WAAY,CACXG,MAAM,IAKT,CCvBM,SAASkD,GAAS9Z,GAExB,OACC,gBAACyT,GAAD,CACCS,MAAO,CAAEtB,sBAAuB,CAAEjjB,MAAO,uBAAyBkjB,oBAAqB,CAAEljB,MAAO,KAChGwkB,MAAO,CAAEvB,sBAAuB,CAAEjjB,MAAO,IAAMkjB,oBAAqB,CAAEljB,MAAO,wBAC7EykB,WAAY,CAAExB,sBAAuB,CAAEoC,UAAU,GAASnC,oBAAqB,CAAEmC,UAAU,IAC3FrB,wBAAyBjB,GAAiBW,SAC1CK,iBAAkBZ,GAAUI,IAC5B/I,WAAW,MACXxZ,UAAWyE,GAAAA,IAAAA,IACX2e,SAAU,CAAC/T,EAAM+T,UACjBnI,cAAe5L,EAAM4L,cACrBoI,YAAahU,EAAMgU,YACnBC,eAAgBjU,EAAMiU,eACtBK,UAAU,YACVmC,WAAY,CACXG,MAAM,IAKT,CCVM,SAASmD,GAAU/Z,GAEzB,OACC,gBAACyT,GAAD,CACCS,MAAO,CAAEtB,sBAAuB,CAAEjjB,MAAO,uBAAyBkjB,oBAAqB,CAAEljB,MAAO,KAChGwkB,MAAO,CAAEvB,sBAAuB,CAAEjjB,MAAO,IAAMkjB,oBAAqB,CAAEljB,MAAO,wBAC7EykB,WAAY,CAAExB,sBAAuB,CAAEoC,UAAU,GAAQnC,oBAAqB,CAAEmC,UAAU,IAC1FrB,wBAAyBjB,GAAiBW,SAC1CK,iBAAkBZ,GAAUG,IAC5B9I,WAAW,OACXxZ,UAAWyE,GAAAA,UAAAA,IACX2e,SAAU,CAAC/T,EAAM+T,UACjBnI,cAAe5L,EAAM4L,cACrBoI,YAAahU,EAAMgU,YACnBC,eAAgBjU,EAAMiU,eACtBK,UAAU,YACVmC,WAAY,CACXG,MAAM,IAKT,CCtBM,SAASoD,GAAmBha,GAClC,OACC,gBAACyT,GAAD,CACCS,MAAO,CAAEtB,sBAAuB,CAAEjjB,MAAO,uBAAyBkjB,oBAAqB,CAAEljB,MAAO,kBAChGwkB,MAAO,CAAEvB,sBAAuB,CAAEjjB,MAAO,iBAAmBkjB,oBAAqB,CAAEljB,MAAO,wBAC1FykB,WAAY,CAAExB,sBAAuB,CAACoC,UAAU,GAAOnC,oBAAqB,CAAEmC,UAAU,IACxFrB,wBAAyBjB,GAAiBW,SAC1CK,iBAAkBZ,GAAUI,IAC5B/I,WAAW,gBACXxZ,UAAWyE,GAAAA,iBAAAA,IACX2e,SAAU,CAAC/T,EAAM+T,UACjBnI,cAAe5L,EAAM4L,cACrBoI,YAAahU,EAAMgU,YACnBC,eAAgBjU,EAAMiU,eACtBK,UAAU,aAGZ,CC7BM,SAAS2F,GAAwBja,GACvC,OACC,gBAACyT,GAAD,CACCS,MAAO,CAAEtB,sBAAuB,CAAEjjB,MAAO,uBAAyBkjB,oBAAqB,CAAEljB,MAAO,KAChGwkB,MAAO,CAAEvB,sBAAuB,CAAEjjB,MAAO,IAAMkjB,oBAAqB,CAAEljB,MAAO,wBAC7EykB,WAAY,CAAExB,sBAAuB,CAAEoC,UAAU,GAASnC,oBAAqB,CAAEmC,UAAU,IAC3FrB,wBAAyBjB,GAAiBC,WAC1Ce,iBAAkBZ,GAAUI,IAC5B/I,WAAW,uBACXxZ,UAAWyE,GAAAA,gBAAAA,IACX2e,SAAU,CAAC/T,EAAM+T,UACjBnI,cAAe5L,EAAM4L,cACrBoI,YAAahU,EAAMgU,YACnBC,eAAgBjU,EAAMiU,eACtBK,UAAU,aAGZ,CCjBM,SAAS4F,GAASla,GAExB,OACC,gBAACyT,GAAD,CACCS,MAAO,CAAEtB,sBAAuB,CAAEjjB,MAAO,uBAAyBkjB,oBAAqB,CAAEljB,MAAO,KAChGwkB,MAAO,CAAEvB,sBAAuB,CAAEjjB,MAAO,IAAMkjB,oBAAqB,CAAEljB,MAAO,wBAC7EykB,WAAY,CAAExB,sBAAuB,CAAEoC,UAAU,GAASnC,oBAAqB,CAAEmC,UAAU,IAC3FrB,wBAAyBjB,GAAiBW,SAC1CK,iBAAkBZ,GAAUG,IAC5B9I,WAAW,wBACXxZ,UAAWyE,GAAAA,IAAAA,IACX2e,SAAU,CAAC/T,EAAM+T,UACjBnI,cAAe5L,EAAM4L,cACrBoI,YAAahU,EAAMgU,YACnBC,eAAgBjU,EAAMiU,eACtBK,UAAU,aAGZ,CClBM,SAAS6F,GAAgBna,GAC/B,OACC,gBAACyT,GAAD,CACCS,MAAO,CAAEtB,sBAAuB,CAAEjjB,MAAO,uBAAyBkjB,oBAAqB,CAAEljB,MAAO,KAChGwkB,MAAO,CAAEvB,sBAAuB,CAAEjjB,MAAO,IAAMkjB,oBAAqB,CAAEljB,MAAO,wBAC7EykB,WAAY,CAAExB,sBAAuB,CAAEoC,UAAU,GAAQnC,oBAAqB,CAAEmC,UAAU,IAC1FrB,wBAAyBjB,GAAiBW,SAC1CK,iBAAkBZ,GAAUG,IAC5B9I,WAAW,WACXxZ,UAAWyE,GAAAA,WAAAA,IACX2e,SAAU,CAAC/T,EAAM+T,UACjBnI,cAAe5L,EAAM4L,cACrBoI,YAAahU,EAAMgU,YACnBC,eAAgBjU,EAAMiU,eACtBK,UAAU,aAGZ,CCZM,SAAS8F,GAA4Bpa,GAC3C,MAAM,SAAE+T,GAAa/T,EACfxX,EAAOurB,EAEPxJ,EAAS,GACT8P,EAAY,GACZC,EAAW,GACXC,EAAe,CAAC,EAGtB,IAAK,IAAInqB,EAAI,EAAGA,EAAI5H,EAAK+hB,OAAO7b,OAAQ0B,IAAK,CAC5C,MAAM3M,EAAM+E,EAAK+hB,OAAOna,GAAGP,UAAU,EAAGrH,EAAK+hB,OAAOna,GAAG1B,OAAS,GAC1DvK,EAAQqE,EAAK2G,OAAOiB,IAAM,EAC5BA,EAAI,GAAM,GACbma,EAAOnb,KAAK3L,GACZ42B,EAAUjrB,KAAKjL,IAEfm2B,EAASlrB,KAAKjL,QAEWsB,IAAtB80B,EAAa92B,KAChB82B,EAAa92B,GAAO,GAErB82B,EAAa92B,IAAQU,CACrB,CAGD,MACMq2B,EAAcH,EAAUrwB,KADP,CAACyG,EAAGL,KAAMqqB,O1BgHLC,E0BhHkBjqB,GAAK,E1BiH5B,KADwBkqB,E0BhHOJ,EAAahQ,EAAOna,K1BkH5D,EAEHsqB,EAAYC,EAAc,IAJ/B,IAAsBD,EAAmBC,C0BhH/C,IAGMC,EAAiB,CAAC,KAAQ,WAAY,OAAUrQ,EAAQ,OAAUiQ,GAElEzB,EAAqB,GAG3B,OAFAA,EAAY3pB,KAAKwrB,GAGhB,gBAACnH,GAAD,CACCS,MAAO,CAAEtB,sBAAuB,CAAEjjB,MAAO,GAAI0Q,MAAQ,CAAE4P,MAAO,CAAC,EAAE,KAAME,WAAW,IAAU0C,oBAAqB,CAAEljB,MAAO,KAC1HwkB,MAAO,CAAEvB,sBAAuB,CAAEjjB,MAAO,IAAMkjB,oBAAqB,CAAEljB,MAAO,GAAI0Q,MAAQ,CAAE4P,MAAO,CAAC,EAAE,KAAME,WAAW,KACtHiE,WAAY,CAAExB,sBAAuB,CAAEoC,UAAU,GAASnC,oBAAqB,CAAEmC,UAAU,IAC3FrB,wBAAyBjB,GAAiBC,WAC1Ce,iBAAkBZ,GAAUG,IAC5B9I,WAAW,eACXxZ,UAAW,GACXojB,SAAUgF,EACVnN,cAAe5L,EAAM4L,cACrBoI,YAAahU,EAAMgU,YACnBC,eAAgBjU,EAAMiU,eACtBK,UAAU,eACVmC,WAAY,CACXG,MAAM,GAEPvC,gBAAiB,CAChB5C,sBAAuB,GACvBC,gBAAiB,GACjBC,aAAc,GAEf/C,SAAU,IAAM,KAChBkF,OAASzI,GAAgBA,EAAErhB,KAAIyG,G1B0G3B,SAAiBtM,EAAe02B,GACnC,GAAI12B,QACA,MAAO,GAGX,QAAWsB,IAAPo1B,EACA,MAAO,GAAP,OAAU12B,EAAMqvB,QAAQqH,IAG5B,IAAIxP,EAAIlnB,EAAMqvB,QAAQ,GACtB,KAAOnI,EAAE/a,SAAS,MACd+a,EAAIA,EAAEyP,OAAO,EAAGzP,EAAE3c,OAAS,GAK/B,OAHI2c,EAAE/a,SAAS,OACX+a,EAAIA,EAAEyP,OAAO,EAAGzP,EAAE3c,OAAS,IAExB2c,CACV,C0B3H+CmI,CAAQ/iB,EAAG,GAAK,OAI/D,CCxDM,SAASsqB,GAAyB/a,GAAe,QACvD,MAAM,SAAE+T,EAAF,iBAAYiH,EAAZ,cAA8BC,EAA9B,eAA6CC,EAA7C,cAA6DtP,GAAkB5L,EAC/EoG,EAAY2N,GACZ,OAAExJ,GAAWnE,EACbjX,EAASiX,EAAUjX,OAAOnF,KAAIyG,GAAe,IAAVA,EAAE0qB,IAAY,EAAIl0B,KAAKiqB,MAAOzgB,EAAE2qB,OAAS3qB,EAAE0qB,IAAO,OAIrFE,EAAUzP,SAAH,UAAGA,EAAenX,WAAlB,aAAG,EAAoBtQ,MAAM,GAE1C,IAAIm3B,EAAmC,CAAE/Q,OAAQ,GAAIpb,OAAQ,IACzDosB,EAAgC,CAAEhR,OAAQ,GAAIpb,OAAQ,IAkB1D,GAPAob,EAAOlf,SAAQgf,IACV4Q,EAAc5Q,EAAI,OACrBkR,EAAmBhR,OAAOnb,KAAKib,GAC/BkR,EAAmBpsB,OAAOC,KAAKnI,KAAKiqB,MAAM+J,EAAc5Q,EAAI,OAC5D,IAGsC,IAApCuB,SAAA,UAAAA,EAAenX,WAAf,eAAoBtQ,MAAMuK,QAAa,OAE1C,IAAI8sB,EAAU,UAAGN,EAAeze,MAAK5N,GAAKA,EAAE6E,iBAAmB2nB,WAAjD,aAAG,EAAwDG,WAGzEjR,EAAOlf,SAAQgf,IACV4Q,EAAc5Q,EAAImR,KACrBF,EAAsB/Q,OAAOnb,KAAKib,GAClCiR,EAAsBnsB,OAAOC,KAAKnI,KAAKiqB,MAAM8J,EAAiB3Q,EAAImR,KAClE,GAEF,CAGD,MAEM/nB,EAAM,CAAE,KAAQ,YAAa,OADjB8W,EACsC,OAFtCpb,GAIZssB,EAAiBH,aAAH,EAAGA,EAAuBnsB,OAExCusB,EAAW,CAAE,KAAQ,cAAe,OADnBJ,aAAH,EAAGA,EAAuB/Q,OACsB,OAAUkR,GAExEE,EAAcJ,aAAH,EAAGA,EAAoBpsB,OAClCysB,EAAcL,aAAH,EAAGA,EAAoBhR,OAElCnQ,EAAQ,CACb7O,KAAM5I,EACN4nB,OAAQqR,EACRzsB,OAAQwsB,GAGH5C,EAA2B,GAyCjC,OAxCAA,EAAY3pB,KAAKqE,GAEb2G,EAAMjL,OAAOT,OAAS,GACzBqqB,EAAY3pB,KAAKgL,GAGdshB,EAASvsB,OAAOT,OAAS,GAC5BqqB,EAAY3pB,KAAKssB,GAkCjB,gBAACjI,GAAD,CACCS,MAAO,CAAEtB,sBAAuB,CAAEjjB,MAAO,GAAI0Q,MAAQ,CAAE4P,MAAO,CAAC,EAAE,KAAME,WAAW,IAAU0C,oBAAqB,CAAEljB,MAAO,KAC1HwkB,MAAO,CAAEvB,sBAAuB,CAAEjjB,MAAO,IAAMkjB,oBAAqB,CAAEljB,MAAO,GAAI0Q,MAAQ,CAAE4P,MAAO,CAAC,EAAE,KAAME,WAAW,KACtHiE,WAAY,CAAExB,sBAAuB,CAAEoC,UAAU,GAAQnC,oBAAqB,CAAEmC,UAAU,IAC1FrB,wBAAyBjB,GAAiBW,SAC1CK,iBAAkBZ,GAAUK,KAC5BhJ,WAAW,yBACXxZ,UAAW,GACXojB,SAAUgF,EACVnN,cAAe5L,EAAM4L,cACrB/D,WAAY,gBAACmR,GAAD,CAAqBxwB,KAAMwX,EAAM+T,SAAUpjB,UAAWyE,GAAAA,KAAAA,IAA8BuF,UAAWqF,EAAMgU,YAAajY,aAAciE,EAAMiU,iBAClJD,YAAahU,EAAMgU,YACnBpF,SAlBe,CAAC/F,EAAsBD,IACvCzC,GAA0BnG,EAAMgU,YAAa5e,GAAAA,KAAAA,IAA8B4K,EAAM+T,SAAWlL,GAAaiK,GAAUI,IAAMziB,GAAKA,EAAEjI,KAAK+hB,OAAO9Z,EAAEokB,aAAaluB,WAAciiB,GAAoB8J,GAAiBC,WAAaliB,GAAKA,EAAEga,EAAE9jB,WAAa8J,GAAKA,EAAE5B,EAAElI,YAkBzPstB,eAAgBjU,EAAMiU,eACtBK,UAAU,mBACVmC,WAAY,CACXrO,KAAK,EACLsO,aAAa,EACbC,eAAe,GAEhBtC,gBAAiB,CAChB5C,sBAAuB,GACvBC,gBAAiB,GACjBC,aAAc,GAEfmC,OAASzI,GAAMA,EAAErhB,KAAIyG,GAAKA,EAAI,MAC9BikB,OAzDc7L,GAEXA,GAAaiK,GAAUjF,MACnB,KAIP,uBAAKhH,UAAU,eACd,2BACC,uBAAKA,UAAU,MAAMxG,MAAO,CAAEoF,gBAAiBzU,GAAAA,QAAAA,MAC/C,uBAAK6V,UAAU,SAAf,WAEAzM,EAAMjL,OAAOT,OAAS,GAAK,2BAC3B,uBAAKmY,UAAU,MAAMxG,MAAO,CAAEoF,gBAAiBzU,GAAAA,QAAAA,MAC/C,uBAAK6V,UAAU,SAASlkB,IAExB+4B,EAASvsB,OAAOT,OAAS,GAAK,2BAC9B,uBAAKmY,UAAU,MAAMxG,MAAO,CAAEoF,gBAAiBzU,GAAAA,QAAAA,MAC/C,uBAAK6V,UAAU,SAAf,kBA4CJ,C,yBC1IM,SAASgV,GAAS7b,GACrB,MAAM,WAAE8b,EAAF,YAAcC,EAAd,eAA2B9H,EAA3B,SAA2C+H,EAA3C,aAAqDC,GAAiBjc,EAE5E,IAAImE,EAAS8X,EAAeH,EAAa,KAAOG,EAAe,MAAQF,EAAcD,EAAa,KAAOC,EAIzG,OAAO,gBAACG,GAAA,EAAD,CACCC,SAAU,IAAMlI,GAAkBA,EAAe+H,EAAUD,GAC3DpsB,MAAOwU,EACPA,MAAOA,GAGlB,CCXM,SAASiY,GAAqBpc,GAAe,MACnD,MAAM,SAAE+T,EAAF,eAAYmH,EAAZ,WAA4BzkB,GAAeuJ,EAOjD,IAAIqc,EAAyB,CAAE9R,OAAQ,GAAIpb,OAAQ,IAC/CmtB,EAA2B,CAAE/R,OAAQ,GAAIpb,OAAQ,IAGjDotB,EAAK,UAAGrB,EAAeze,MAAK5N,GAAKA,EAAE6E,iBAAmBsM,EAAMqb,iBAAvD,aAAG,EAA8DmB,UAT3D,CAAC,YAAa,YAAa,YAAa,aAchDnxB,SAAQgf,IAEV0J,EAASwI,EAAQlS,EAdA,EAcoB5T,KACxC4lB,EAAY9R,OAAOnb,KAAKib,IACqC,GAAzD0J,EAASwI,EAAQlS,EAhBD,EAgBqB5T,GAAYgmB,IACpDJ,EAAYltB,OAAOC,KAAK,GAExBitB,EAAYltB,OAAOC,KAAK2kB,EAASwI,EAAQlS,EAnBtB,EAmB0C5T,GAAYgmB,KAE1EH,EAAc/R,OAAOnb,KAAKib,GAC1BiS,EAAcntB,OAAOC,KAAK2kB,EAASwI,EAAQlS,EAtBvB,EAsB2C5T,GAAYimB,OAC3E,IAIF,MAAMC,EAAYN,EAAYltB,OAExBsE,EAAM,CAAE,KAAQ,SAAU,OADd4oB,EAAY9R,OACuB,OAAUoS,GAEzDhB,EAAcW,EAAcntB,OAE5BiL,EAAQ,CAAE,KAAQ,aAAc,OADlBkiB,EAAc/R,OAC2B,OAAUoR,GAEjE5C,EAAqB,GAyB3B,OAxBAA,EAAY3pB,KAAKqE,GACjBslB,EAAY3pB,KAAKgL,GAwBhB,gBAACqZ,GAAD,CACCS,MAAO,CAAEtB,sBAAuB,CAAEjjB,MAAO,GAAI0Q,MAAO,CAAE4P,MAAO,CAAC,EAAG,KAAME,WAAW,IAAW0C,oBAAqB,CAAEljB,MAAO,KAC3HwkB,MAAO,CAAEvB,sBAAuB,CAAEjjB,MAAO,IAAMkjB,oBAAqB,CAAEljB,MAAO,GAAI0Q,MAAO,CAAE4P,MAAO,CAAC,EAAG,KAAME,WAAW,KACtHiE,WAAY,CAAExB,sBAAuB,CAAEoC,UAAU,GAASnC,oBAAqB,CAAEmC,UAAU,IAC3FrB,wBAAyBjB,GAAiBW,SAC1CK,iBAAkBZ,GAAUG,IAC5B9I,WAAW,4BACXxZ,UAAW,GACXojB,SAAUgF,EACVnE,8BAA+B,EAC/BhJ,cAAe5L,EAAM4L,cACrBoI,YAAahU,EAAMgU,YACnBC,eAAgBjU,EAAMiU,eACtBrF,SAAU,KACV0F,UAAU,mBACVR,OAASzI,GAAMA,EAAErhB,KAAIyG,GAAW,GAALA,EAAS,KAAOA,EAAE9J,WAAa,MAC1DkhB,WAAY,KACZ4O,WAAY,CACXrO,KAAK,EACLwO,MAAM,EACNE,KAAM,CAAC,+GACL,GACA,sCACA,GACA,2BACA,oEACA,6DAEHzC,gBAAiB,CAChB5C,sBAAuB,GACvBC,gBAAiB,GACjBC,aAAc,GAEf+C,OAvDc7L,GAEXA,GAAaiK,GAAUjF,MACnB,KAGP,uBAAKhH,UAAU,eACd,2BACC,uBAAKA,UAAU,MAAMxG,MAAO,CAAEoF,gBAAiBzU,GAAAA,QAAAA,MAC/C,uBAAK6V,UAAU,SAAf,WAED,2BACC,uBAAKA,UAAU,MAAMxG,MAAO,CAAEoF,gBAAiBzU,GAAAA,QAAAA,MAC/C,uBAAK6V,UAAU,SAAf,gBA2CF6Q,cAAe,0DAIjB,CC1GM,SAASkF,GAAuB5c,GAAe,MACrD,MAAM,SAAE+T,EAAF,eAAYmH,EAAZ,cAA4BtP,EAA5B,QAA2CyP,EAA3C,WAAoD5kB,GAAeuJ,EAOzE,IAAIqc,EAAyB,CAAE9R,OAAQ,GAAIpb,OAAQ,IAC/CmtB,EAA2B,CAAE/R,OAAQ,GAAIpb,OAAQ,IAIjDotB,EAAK,UAAGrB,EAAeze,MAAK5N,GAAKA,EAAE6E,iBAAmB2nB,WAAjD,aAAG,EAAwDmB,UAVrD,CAAC,YAAa,YAAa,YAAa,aAWhDnxB,SAAQgf,IACV0J,EAASwI,EAAQlS,EAVA,EAUoB5T,KACxC4lB,EAAY9R,OAAOnb,KAAKib,IACsC,GAA1D0J,EAASwI,EAAQlS,EAZD,EAYsB5T,GAAYgmB,IACrDJ,EAAYltB,OAAOC,KAAK,GAExBitB,EAAYltB,OAAOC,KAAK2kB,EAASwI,EAAQlS,EAftB,EAe2C5T,GAAYgmB,KAE3EH,EAAc/R,OAAOnb,KAAKib,GAC1BiS,EAAcntB,OAAOC,KAAK2kB,EAASwI,EAAQlS,EAlBvB,EAkB4C5T,GAAYimB,OAC5E,IAKF,MAAMC,EAAYN,EAAYltB,OAExBsE,EAAM,CAAE,KAAQ,SAAU,OADd4oB,EAAY9R,OACuB,OAAUoS,GAEzDhB,EAAcW,EAAcntB,OAE5BiL,EAAQ,CAAE,KAAQ,aAAc,OADlBkiB,EAAc/R,OAC2B,OAAUoR,GAEjE5C,EAAqB,GAwB3B,OAvBAA,EAAY3pB,KAAKqE,GACjBslB,EAAY3pB,KAAKgL,GAuBhB,gBAACqZ,GAAD,CACCS,MAAO,CAAEtB,sBAAuB,CAAEjjB,MAAO,GAAI0Q,MAAO,CAAE4P,MAAO,CAAC,EAAG,KAAME,WAAW,IAAW0C,oBAAqB,CAAEljB,MAAO,KAC3HwkB,MAAO,CAAEvB,sBAAuB,CAAEjjB,MAAO,IAAMkjB,oBAAqB,CAAEljB,MAAO,GAAI0Q,MAAO,CAAE4P,MAAO,CAAC,EAAG,KAAME,WAAW,KACtHiE,WAAY,CAAExB,sBAAuB,CAAEoC,UAAU,GAASnC,oBAAqB,CAAEmC,UAAU,IAC3FrB,wBAAyBjB,GAAiBW,SAC1CK,iBAAkBZ,GAAUG,IAC5B9I,WAAW,8BACXxZ,UAAW,GACXojB,SAAUgF,EACVnE,8BAA+B,EAC/BhJ,cAAe5L,EAAM4L,cACrBoI,YAAahU,EAAMgU,YACnBC,eAAgBjU,EAAMiU,eACtBrF,SAAU,KACV0F,UAAU,mBACVR,OAASzI,GAAMA,EAAErhB,KAAIyG,GAAW,GAALA,EAAS,KAAOA,EAAE9J,WAAa,MAC1DkhB,WAAY,KACZ4O,WAAY,CACXrO,KAAK,EACLwO,MAAM,EACNE,KAAM,CAAC,+GACL,GACC,sCACD,GACA,2BACA,oEACA,6DAEHzC,gBAAiB,CAChB5C,sBAAuB,GACvBC,gBAAiB,GACjBC,aAAc,GAEf+C,OAtDc7L,GAEXA,GAAaiK,GAAUjF,MACnB,KAGP,uBAAKhH,UAAU,eACd,2BACC,uBAAKA,UAAU,MAAMxG,MAAO,CAAEoF,gBAAiBzU,GAAAA,QAAAA,MAC/C,uBAAK6V,UAAU,SAAf,WAED,2BACC,uBAAKA,UAAU,MAAMxG,MAAO,CAAEoF,gBAAiBzU,GAAAA,QAAAA,MAC/C,uBAAK6V,UAAU,SAAf,gBA0CF6Q,cAAe,0DAGjB,CCnGM,SAASmF,GAAsB7c,GAAe,MACpD,MAAM,SAAE+T,EAAF,eAAYmH,EAAZ,cAA4BtP,EAA5B,WAA2CnV,EAA3C,QAAuD4kB,GAAYrb,EAMzE,IAAIqc,EAAyB,CAAE9R,OAAQ,GAAIpb,OAAQ,IAC/CmtB,EAA2B,CAAE/R,OAAQ,GAAIpb,OAAQ,IAIjDotB,EAAK,UAAGrB,EAAeze,MAAK5N,GAAKA,EAAE6E,iBAAmB2nB,WAAjD,aAAG,EAAwDmB,UATrD,CAAC,YAAa,YAAa,aAUnCnxB,SAAQgf,IACV0J,EAASwI,EAAQlS,EATA,EASoB5T,KACxC4lB,EAAY9R,OAAOnb,KAAKib,IACqC,GAAzD0J,EAASwI,EAAQlS,EAXD,EAWqB5T,GAAYgmB,IACpDJ,EAAYltB,OAAOC,KAAK,GAExBitB,EAAYltB,OAAOC,KAAK2kB,EAASwI,EAAQlS,EAdtB,EAc0C5T,GAAYgmB,KAE1EH,EAAc/R,OAAOnb,KAAKib,GAC1BiS,EAAcntB,OAAOC,KAAK2kB,EAASwI,EAAQlS,EAjBvB,EAiB2C5T,GAAYimB,OAC3E,IAKF,MAAMC,EAAYN,EAAYltB,OAExBsE,EAAM,CAAE,KAAQ,SAAU,OADd4oB,EAAY9R,OACuB,OAAUoS,GAEzDhB,EAAcW,EAAcntB,OAE5BiL,EAAQ,CAAE,KAAQ,aAAc,OADlBkiB,EAAc/R,OAC2B,OAAUoR,GAEjE5C,EAAqB,GAwB3B,OAvBAA,EAAY3pB,KAAKqE,GACjBslB,EAAY3pB,KAAKgL,GAuBhB,gBAACqZ,GAAD,CACCS,MAAO,CAAEtB,sBAAuB,CAAEjjB,MAAO,GAAI0Q,MAAO,CAAE4P,MAAO,CAAC,EAAG,KAAME,WAAW,IAAW0C,oBAAqB,CAAEljB,MAAO,KAC3HwkB,MAAO,CAAEvB,sBAAuB,CAAEjjB,MAAO,IAAMkjB,oBAAqB,CAAEljB,MAAO,GAAI0Q,MAAO,CAAE4P,MAAO,CAAC,EAAG,KAAME,WAAW,KACtHiE,WAAY,CAAExB,sBAAuB,CAAEoC,UAAU,GAASnC,oBAAqB,CAAEmC,UAAU,IAC3FrB,wBAAyBjB,GAAiBW,SAC1CK,iBAAkBZ,GAAUG,IAC5B9I,WAAW,6BACXxZ,UAAW,GACXojB,SAAUgF,EACVnE,8BAA+B,EAC/BhJ,cAAe5L,EAAM4L,cACrBoI,YAAahU,EAAMgU,YACnBC,eAAgBjU,EAAMiU,eACtBrF,SAAU,KACV0F,UAAU,mBACVR,OAASzI,GAAMA,EAAErhB,KAAIyG,GAAW,GAALA,EAAS,KAAOA,EAAE9J,WAAa,MAC1DkhB,WAAY,KACZ4O,WAAY,CACXrO,KAAK,EACLwO,MAAM,EACNE,KAAM,CAAC,+GACL,GACA,sCACA,GACA,2BACA,oEACA,6DAEHzC,gBAAiB,CAChB5C,sBAAuB,GACvBC,gBAAiB,GACjBC,aAAc,GAEf+C,OAtDc7L,GAEXA,GAAaiK,GAAUjF,MACnB,KAGP,uBAAKhH,UAAU,eACd,2BACC,uBAAKA,UAAU,MAAMxG,MAAO,CAAEoF,gBAAiBzU,GAAAA,QAAAA,MAC/C,uBAAK6V,UAAU,SAAf,WAED,2BACC,uBAAKA,UAAU,MAAMxG,MAAO,CAAEoF,gBAAiBzU,GAAAA,QAAAA,MAC/C,uBAAK6V,UAAU,SAAf,gBA0CF6Q,cAAe,0DAGjB,CClGM,SAASoF,GAAoB9c,GAEnC,OACC,gBAACyT,GAAD,CACCS,MAAO,CAAEtB,sBAAuB,CAAEjjB,MAAO,uBAAyBkjB,oBAAqB,CAAEljB,MAAO,KAChGwkB,MAAO,CAAEvB,sBAAuB,CAAEjjB,MAAO,IAAMkjB,oBAAqB,CAAEljB,MAAO,wBAC7EykB,WAAY,CAAExB,sBAAuB,CAAEoC,UAAU,GAASnC,oBAAqB,CAAEmC,UAAU,IAC3FrB,wBAAyBjB,GAAiBC,WAC1Ce,iBAAkBZ,GAAUG,IAC5B9I,WAAU,UAAKznB,EAAL,iBACViO,UAAWyE,GAAAA,eAAAA,IACX2e,SAAU,CAAC/T,EAAM+T,UACjBnI,cAAe5L,EAAM4L,cACrBoI,YAAahU,EAAMgU,YACnBC,eAAgBjU,EAAMiU,eACtBmB,kBAAkB,EAClBd,UAAU,YACVmC,WAAY,CACXG,MAAM,IAIT,CCdM,SAASmG,GAAgB/c,GAAe,MAC9C,MAAM,SAAE+T,EAAF,eAAYmH,EAAZ,QAA4BG,EAA5B,WAAqC5kB,GAAeuJ,EAK1D,IAAIqc,EAAyB,CAAE9R,OAAQ,GAAIpb,OAAQ,IAC/CmtB,EAA2B,CAAE/R,OAAQ,GAAIpb,OAAQ,IAIjDotB,EAAK,UAAGrB,EAAeze,MAAK5N,GAAKA,EAAE6E,iBAAmB2nB,WAAjD,aAAG,EAAwDmB,UACpE,MAAMQ,EAAST,EAAQ9lB,EAAa,IAGpC,IAAI8T,EAAmB,GACvB,IAAK,MAAM9mB,KAAOswB,EACbjqB,OAAOwS,UAAU9X,eAAe+X,KAAKwX,EAAUtwB,IAC9CA,EAAIwH,WAAW+xB,IAClBzS,EAAOnb,KAAK3L,EAAIoM,UAAWpM,EAAImK,QAAQ,KAAO,IAMjD2c,EAAOlf,SAAQgf,IACV0J,EAASwI,EAAQ9lB,EAAa,IAAM4T,KACvCgS,EAAY9R,OAAOnb,KAAKib,GACxBgS,EAAYltB,OAAOC,KAAK2kB,EAASwI,EAAQ9lB,EAAa,IAAM4T,GAAG4S,eAE/DX,EAAc/R,OAAOnb,KAAKib,GAC1BiS,EAAcntB,OAAOC,KAAK2kB,EAASwI,EAAQ9lB,EAAa,IAAM4T,GAAG6S,iBACjE,IAGF,MAAMP,EAAYN,EAAYltB,OAExBsE,EAAM,CAAE,KAAQ,SAAU,OADd4oB,EAAY9R,OACuB,OAAUoS,GAEzDhB,EAAcW,EAAcntB,OAC5BysB,EAAcU,EAAc/R,OAC5BnQ,EAAQ,CAAE,KAAQzX,EAAY,OAAUi5B,EAAa,OAAUD,GAG/D5C,EAAqB,GAC3BA,EAAY3pB,KAAKqE,GACjBslB,EAAY3pB,KAAKgL,GAGjB,IAAI+iB,EAA0B,GAyC9B,OAvCApE,SAAAA,EAAa1tB,SAAQ,CAACgf,EAAGja,KAGxB,IAAIknB,EAAejN,EAAEE,OAAOvgB,KAAI6E,GACxBwd,OAAOxd,KAEfyoB,EAAGpR,MAAK,CAACmE,EAAGhY,IAAMgY,EAAIhY,IAEtBilB,EAAGjsB,SAAQwD,IACV,IAAIuuB,EAAQn2B,KAAKmP,MAAMvH,GACnBwuB,EAASp2B,KAAKiqB,MAAOriB,EAAI,EAAK,IAElCsuB,EAAc/tB,KAAKguB,EAAQ,WAAaC,EAAS,UAAjD,GAJD,IAgCA,gBAAC5J,GAAD,CACCS,MAAO,CAAEtB,sBAAuB,CAAEjjB,MAAO,QAAS0Q,MAAO,CAAE+P,UAAW,SAAUH,MAAO,CAAC,EAAG,OAAU4C,oBAAqB,CAAEljB,MAAO,oBAAqB0Q,MAAO,CAAE+P,UAAW,SAAUb,YAAY,EAAMC,UAAU,EAAOC,MAAO,EAAGtL,MAAO,WAC1OgQ,MAAO,CAAEvB,sBAAuB,CAAEjjB,MAAO,oBAAqB0Q,MAAO,CAAEoP,MAAO,EAAGD,UAAU,IAAWqD,oBAAqB,CAAEljB,MAAO,QAAS0Q,MAAO,CAAE+P,UAAW,SAAUH,MAAO,CAAC,EAAG,QACtLmE,WAAY,CAAExB,sBAAuB,CAAEoC,UAAU,GAASnC,oBAAqB,CAAEmC,UAAU,IAC3FrB,wBAAyBjB,GAAiBW,SAC1CK,iBAAkBZ,GAAUK,KAC5BhJ,WA9FiB,wBA+FjBxZ,UAAW,GACXojB,SAAUgF,EACVnE,8BAA+B,EAC/BhJ,cAAe5L,EAAM4L,cACrBoI,YAAahU,EAAMgU,YACnBC,eAAgBjU,EAAMiU,eACtBrF,SAAU,KACV0F,UAAU,mBACViC,cAAe,+DAGfD,aAAc6G,EACdtV,WAAY,KACZ4O,WAAY,CACXrO,KAAK,EACLwO,MAAM,EACND,eAAe,EACfD,aAAa,EACbI,KAAM,CAAC,2EAERzC,gBAAiB,CAChB5C,sBAAuB,GACvBC,gBAAiB,GACjBC,aAAc,GAEf+C,OAvDc7L,GAEXA,GAAaiK,GAAUjF,MACnB,KAIP,uBAAKhH,UAAU,eACd,2BACC,uBAAKA,UAAU,MAAMxG,MAAO,CAAEoF,gBAAiBzU,GAAAA,QAAAA,MAC/C,uBAAK6V,UAAU,SAAf,WAEAzM,EAAMjL,OAAOT,OAAS,GAAK,2BAC3B,uBAAKmY,UAAU,MAAMxG,MAAO,CAAEoF,gBAAiBzU,GAAAA,QAAAA,MAC/C,uBAAK6V,UAAU,SAASzM,EAAM7O,QA0ChCmsB,cAAe,0DAIjB,C,0BCtJD,MAUA,GAVmB,IAEjB,uBAAKrX,MAAO,CAAEsB,QAAS,OAAQD,eAAgB,eAAgBpB,UAAW,MACzE,gBAAC,KAAD,OC8BI,SAASgd,KACf,MAAM,MAAEljB,EAAF,SAASmE,GAAalR,EAAAA,WAAiBgR,KAEtCkf,EAAiBC,GAAkBnwB,EAAAA,UAAe,GAEnDsN,EAA+BrN,MAAO7J,EAA2CU,EAA0ByX,EAAyBC,KACzI0C,EAAS,CAAE/E,KAAM8D,GAAYU,qBAC7B,MAAMyf,QAA0BhB,GAAqBA,GAAcriB,EAAMuC,KAAKC,UAAzB6f,CAAyDh5B,EAAKU,EAAOyX,EAASC,IACnI0C,EAAS,CAAE/E,KAAM8D,GAAYQ,mBAAoBrE,QAASgkB,GAA1D,EAGK1hB,EAAqCzO,MAAO7J,EAA2CU,KAC5Foa,EAAS,CAAE/E,KAAM8D,GAAYU,qBAC7B,MAAMyf,QAA0BhB,GAAqBA,GAAiBriB,EAAMuC,KAAKC,UAAgCnZ,EAAKU,IACtHoa,EAAS,CAAE/E,KAAM8D,GAAYQ,mBAAoBrE,QAASgkB,GAA1D,EAGDpwB,EAAAA,WAAgB,KACfkR,EAAS,CAAE/E,KAAM8D,GAAYM,8BAC7B6e,GAAqBriB,EAAMuC,KAAKC,WAC9B3T,MAAM9E,IACNoa,EAAS,CAAE/E,KAAM8D,GAAYK,uBAAwBlE,QAAStV,GAA9D,IAEK,KlD4GLkV,IAAUA,GAAOqkB,YACjBrkB,GAAS,KACTpV,QAAQC,IAAI,uBkD7Gb,IAEC,IAGH,MAAMy5B,EAAUvjB,EAAMuC,KAAKC,UAAU/B,UAgE/B+iB,EA5DoB,MAAsE,cAC/F,IAAIA,EAAe,CAClBvC,QAAS,GACT5kB,WAAY,GACZonB,cAAe,IAGhB,GAAIzjB,EAAMuC,KAAKG,SAAW1C,EAAMuC,KAAKI,UACpC,OAAO6gB,EAER,MAAMhS,EAAa,UAAGxR,EAAMuC,YAAT,iBAAG,EAAYC,iBAAf,aAAG,EAAuBlM,QAE7CktB,EAAavC,QAAb,UACCzP,SADD,UACCA,EAAenX,WADhB,aACC,EAAoBtQ,MAAM,UAD3B,QACiCw5B,aADjC,EACiCA,EAASG,kBAAkBvT,QAAOoT,SAAA,UAAAA,EAASG,yBAAT,eAA4BvT,OAAO7b,QAAS,GAG/G,MAAMqvB,EAAiB,KACtB,GAAIJ,SAAAA,EAASnmB,YAEZ,IAAK,IAAIpH,EAAIutB,EAAQnmB,YAAY+S,OAAO7b,OAAS,EAAG0B,GAAK,EAAGA,IAC3D,GAAqC,kBAAjCutB,EAAQnmB,YAAY+S,OAAOna,GAC9B,OAAOutB,EAAQnmB,YAAY+S,OAAOna,GAIrC,MAAO,EAAP,EAGiC,IAAM,EACA,MACc,EA2BtD,OAPAwtB,EAAannB,YArBRmV,SAAJ,UAAIA,EAAepW,mBAAnB,OAAI,EAA4B/G,MACkB,IAA7Cmd,SAAA,UAAAA,EAAepW,mBAAf,mBAA4B/G,aAA5B,eAAmCC,QAC/Bkd,SAAP,UAAOA,EAAeoS,kBAAtB,aAAO,EAA2BvvB,MAAM,GAElCmd,SAAP,UAAOA,EAAepW,mBAAtB,aAAO,EAA4B/G,MAAM,GAGnC,KAeJsvB,IAEJH,EAAaC,cAdwB,MACpC,IAAIp6B,EAAM,GACsB,UAEqB,EAIrD,OANImoB,SAAAA,EAAepW,cAClB/R,EAAMmoB,SAAH,UAAGA,EAAepW,mBAAlB,aAAG,EAA4B/G,MAAM,GACS,IAA7Cmd,SAAA,UAAAA,EAAepW,mBAAf,mBAA4B/G,aAA5B,eAAmCC,UACtCjL,GAAOmoB,SAAJ,UAAIA,EAAepW,mBAAnB,aAAI,EAA4B/G,MAAM,KAGpChL,CAAP,EAM4Bw6B,IACzBF,IAGGH,CAAP,EAGoBM,GAarB,GAXA7wB,EAAAA,WAAgB,KACXuwB,EAAannB,YAAcmnB,EAAavC,SjDrFT/tB,OAAO8M,EAAsBzQ,EAAc6N,EAAkBoU,KACjG,IAEC,aADM1R,UAmEkB5M,OAAO8M,EAAsBY,EAAcrR,EAAc6N,EAAkBoU,KACpG,IACC,MAAMpjB,QDUD,SAAuBwS,EAAcrR,EAAc6N,EAAkBoU,GAIxE,OAAOrlB,QAAQyU,IAAI,CACfzD,GAAwByD,EAAKrR,EAAS6N,GACtCC,GAA0BuD,EAAKrR,EAAS6N,KAEvCvO,MAAKgS,GACK1B,GAA+DX,GAAkBulB,cAAe,CACnGnjB,MACAojB,gBAAiBnjB,EAAQ,GACzBojB,kBAAmBpjB,EAAQ,GAC3B2Q,mBAIf,CC3BoB1R,CAAyBc,EAAKrR,EAAS6N,EAAaoU,GAEvE,OADAxR,EAAMS,UAAYrS,EAAKqS,UAChBT,CAIP,CAHC,MAED,OADAnW,QAAQD,MAAM,2BACPoW,CACP,GA1EakkB,CAAkBlkB,GAAO,EAAOzQ,EAAS6N,EAAaoU,EAGnE,CAFC,MACD3nB,QAAQD,MAAM,+BACd,GiDgFCy4B,CAA0BriB,EAAMuC,KAAKC,UAAgCghB,EAAavC,QAASuC,EAAannB,WAAY2D,EAAMuC,KAAKC,UAAUlM,SACvIzH,MAAM9E,IACNoa,EAAS,CAAE/E,KAAM8D,GAAYQ,mBAAoBrE,QAAStV,GAA1D,GAEF,GAEC,CAACiW,EAAMuC,KAAKG,SAAW1C,EAAMuC,KAAKI,YAGjC3C,EAAMuC,KAAKG,UAAY1C,EAAMuC,KAAKC,UAAU/B,UAC/C,OAAO,gBAAC,GAAD,MAWR,IAAI0jB,EAAqB,GACrBC,EAAc,GACdC,EAAQ,GAEZ,IAAK,MAAMh7B,KAAO2W,EAAMuC,KAAKC,UAAUlM,QAClC5G,OAAOwS,UAAU9X,eAAe+X,KAAKnC,EAAMuC,KAAKC,UAAUlM,QAASjN,IACtE86B,EAAmBnvB,KAAK,CAAE,IAAO3L,EAAK,OAAU2W,EAAMuC,KAAKC,UAAUlM,QAAQjN,GAAKU,MAAO,MAASiW,EAAMuC,KAAKC,UAAUlM,QAAQjN,GAAKgL,QAItI,IAAK,MAAMhL,KAAOg5B,GACb3yB,OAAOwS,UAAU9X,eAAe+X,KAAKkgB,GAAyBh5B,IACjE+6B,EAAYpvB,KAAK,CAAE,IAAO3L,EAAK,MAASg5B,GAAwBh5B,GAAKkM,QAqYvE,OAjYA4uB,EAAmBlzB,SAAQgf,IAC1BA,EAAElb,OAAO9D,SAAQgH,IAChBosB,EAAMrvB,KAAK,gBAACysB,GAAD,CAAUp4B,IAAK4mB,EAAE5mB,IAAM4O,EACjC4hB,eAAgBlY,EAChB+f,WAAY0C,EAAY/hB,MAAK1U,GAAMA,EAAGtE,KAAO4mB,EAAE5mB,MAAKkM,MACpDosB,YAAa1pB,EACb2pB,SAAU3R,EAAE5mB,IACZw4B,aAAe5R,EAAE5b,MAAMC,OAAS,EAAI2b,EAAE5b,MAAM,GAAK,OALlD,GADD,IAqCA,gCACC,uBAAK4R,MAAO,CAAEgB,SAAU,SAAU+C,IAAK,OAAQC,KAAM,OAAQ/C,OAAQ,IACpE,gBAACgG,GAAA,EAAD,CAAOT,UAAU,eAGhB,2BACC,gBAAC,MAAD,CAAM6X,YAAY,SAASC,QAAM,EAACC,KAAG,EAACC,GAAG,WAAWxe,MAAO,CAAEiJ,aAAc,OAAQhK,MAAO,UAA1F,YAGA,gBAAC,MAAD,CAAMof,YAAY,SAASC,QAAM,EAACC,KAAG,EAACC,GAAG,WAAWxe,MAAO,CAAEiJ,aAAc,OAAQhK,MAAO,UAA1F,0BAGA,gBAAC,MAAD,CAAMof,YAAY,SAASC,QAAM,EAACC,KAAG,EAACC,GAAG,YAAYxe,MAAO,CAAEiJ,aAAc,OAAQhK,MAAO,UAA3F,2BAGA,gBAAC,MAAD,CAAMof,YAAY,SAASC,QAAM,EAACC,KAAG,EAACC,GAAG,UAAUxe,MAAO,CAAEiJ,aAAc,OAAQhK,MAAO,UAAzF,oBAGA,gBAAC,MAAD,CAAMof,YAAY,SAASC,QAAM,EAACC,KAAG,EAACC,GAAG,UAAUxe,MAAO,CAAEiJ,aAAc,OAAQhK,MAAO,UAAzF,aAKD,2BACC,gBAACwf,GAAA,EAAD,CACCC,QACC,gBAACC,GAAA,EAAD,CACCC,QAAS1B,EACT2B,SAAUzV,IAxFhB+T,GADGD,EAuFE,IAKD5tB,MAAM,6BASP4tB,EACD,uBAAKld,MAAO,CAAEnO,OAAQ,KACpBusB,GACO,6BAOX,gBAACtH,GAAA,GAAD,CAAMC,WAAS,EAACnS,QAAS,GAExB,gBAACkS,GAAA,GAAD,CAAMC,WAAS,EAACrvB,GAAG,YAClB,gBAACovB,GAAA,GAAD,CAAME,MAAI,EAACC,GAAIluB,OAAO0jB,WAAa,IAAM,EAAI,IAC5C,gBAACqM,GAAD,CACCtB,gBAAiB8F,EAAQwB,gBACzBrH,iBAAkB6F,EAAQyB,iBAC1BrH,kBAAmB4F,EAAQ0B,kBAC3BzT,cAAexR,EAAMuC,KAAKC,UAAUlM,QACpC8oB,eAAgBmE,EAAQ2B,gBACxBtL,YAAarZ,EACbsZ,eAAgBlY,KAIlB,gBAACob,GAAA,GAAD,CAAME,MAAI,EAACC,GAAIluB,OAAO0jB,WAAa,IAAM,EAAI,IAC5C,gBAAC8K,GAAD,CACCC,gBAAiB8F,EAAQ4B,iBACzBzH,iBAAkB6F,EAAQG,kBAC1B/F,kBAAmB4F,EAAQ6B,mBAC3B5T,cAAexR,EAAMuC,KAAKC,UAAUlM,QACpCsjB,YAAarZ,EACbsZ,eAAgBlY,KAIlB,gBAACob,GAAA,GAAD,CAAME,MAAI,EAACC,GAAIluB,OAAO0jB,WAAa,IAAM,EAAI,IAC5C,gBAAC6M,GAAD,CACC5F,SAAU4J,EAAQhqB,kBAClBiY,cAAexR,EAAMuC,KAAKC,UAAUlM,QACpCsjB,YAAarZ,EACbsZ,eAAgBlY,MAgBnB,gBAACob,GAAA,GAAD,CAAMC,WAAS,EAACrvB,GAAG,YAClB,gBAACovB,GAAA,GAAD,CAAME,MAAI,EAACC,GAAI,IACd,sBAAIjX,MAAO,CAAES,WAAY,OAAQ2e,aAAc,SAA/C,2BAGD,gBAACtI,GAAA,GAAD,CAAME,MAAI,EAACC,GAAIluB,OAAO0jB,WAAa,IAAM,EAAI,IAC5C,gBAAC2M,GAAD,CACC1F,SAAU4J,EAAQnmB,YAClBoU,cAAexR,EAAMuC,KAAKC,UAAUlM,QACpCsjB,YAAarZ,EACbsZ,eAAgBlY,KAIlB,gBAACob,GAAA,GAAD,CAAME,MAAI,EAACC,GAAIluB,OAAO0jB,WAAa,IAAM,EAAI,IAC5C,gBAAC4M,GAAD,CACC3F,SAAU4J,EAAQ/pB,WAClBgY,cAAexR,EAAMuC,KAAKC,UAAUlM,QACpCsjB,YAAarZ,EACbsZ,eAAgBlY,KAIlB,gBAACob,GAAA,GAAD,CAAME,MAAI,EAACC,GAAIluB,OAAO0jB,WAAa,IAAM,EAAI,IAC5C,gBAAC8M,GAAD,CACC7F,SAAU4J,EAAQxpB,SAClByX,cAAexR,EAAMuC,KAAKC,UAAUlM,QACpCsjB,YAAarZ,EACbsZ,eAAgBlY,MAgBnB,gBAACob,GAAA,GAAD,CAAMC,WAAS,EAACrvB,GAAG,aAClB,gBAACovB,GAAA,GAAD,CAAME,MAAI,EAACC,GAAI,IACd,sBAAIjX,MAAO,CAAES,WAAY,OAAQ2e,aAAc,SAA/C,4BAGD,gBAACtI,GAAA,GAAD,CAAME,MAAI,EAACC,GAAIluB,OAAO0jB,WAAa,IAAM,EAAI,IAC5C,gBAAC+M,GAAD,CACC9F,SAAU4J,EAAQtpB,SAClBuX,cAAexR,EAAMuC,KAAKC,UAAUlM,QACpCsjB,YAAarZ,EACbsZ,eAAgBlY,KAIlB,gBAACob,GAAA,GAAD,CAAME,MAAI,EAACC,GAAIluB,OAAO0jB,WAAa,IAAM,EAAI,IAC5C,gBAACgN,GAAD,CACC/F,SAAU4J,EAAQzpB,IAClB0X,cAAexR,EAAMuC,KAAKC,UAAUlM,QACpCsjB,YAAarZ,EACbsZ,eAAgBlY,KAIlB,gBAACob,GAAA,GAAD,CAAME,MAAI,EAACC,GAAIluB,OAAO0jB,WAAa,IAAM,EAAI,IAC5C,gBAACiN,GAAD,CACChG,SAAU4J,EAAQppB,UAClBqX,cAAexR,EAAMuC,KAAKC,UAAUlM,QACpCsjB,YAAarZ,EACbsZ,eAAgBlY,KAIlB,gBAACob,GAAA,GAAD,CAAME,MAAI,EAACC,GAAIluB,OAAO0jB,WAAa,IAAM,EAAI,IAC5C,gBAACkN,GAAD,CACCjG,SAAU4J,EAAQ+B,cAClB9T,cAAexR,EAAMuC,KAAKC,UAAUlM,QACpCsjB,YAAarZ,EACbsZ,eAAgBlY,KAIlB,gBAACob,GAAA,GAAD,CAAME,MAAI,EAACC,GAAIluB,OAAO0jB,WAAa,IAAM,EAAI,IAC5C,gBAACmN,GAAD,CACClG,SAAU4J,EAAQrpB,gBAClBsX,cAAexR,EAAMuC,KAAKC,UAAUlM,QACpCsjB,YAAarZ,EACbsZ,eAAgBlY,KAIlB,gBAACob,GAAA,GAAD,CAAME,MAAI,EAACC,GAAIluB,OAAO0jB,WAAa,IAAM,EAAI,IAC5C,gBAACoN,GAAD,CACCnG,SAAU4J,EAAQvpB,IAClBwX,cAAexR,EAAMuC,KAAKC,UAAUlM,QACpCsjB,YAAarZ,EACbsZ,eAAgBlY,KAIlB,gBAACob,GAAA,GAAD,CAAME,MAAI,EAACC,GAAIluB,OAAO0jB,WAAa,IAAM,EAAI,IAC5C,gBAACqN,GAAD,CACCpG,SAAU4J,EAAQ9pB,WAClB+X,cAAexR,EAAMuC,KAAKC,UAAUlM,QACpCsjB,YAAarZ,EACbsZ,eAAgBlY,KAIlB,gBAACob,GAAA,GAAD,CAAME,MAAI,EAACC,GAAIluB,OAAO0jB,WAAa,IAAM,EAAI,IAC5C,gBAACgQ,GAAD,CACC/I,SAAU4J,EAAQgC,eAClB/T,cAAexR,EAAMuC,KAAKC,UAAUlM,QACpCsjB,YAAarZ,EACbsZ,eAAgBlY,MAOnB,gBAACob,GAAA,GAAD,CAAMC,WAAS,EAACrvB,GAAG,WAClB,gBAACovB,GAAA,GAAD,CAAME,MAAI,EAACC,GAAI,IACd,sBAAIjX,MAAO,CAAES,WAAY,OAAQ2e,aAAc,SAA/C,qBAGD,gBAACtI,GAAA,GAAD,CAAME,MAAI,EAACC,GAAIluB,OAAO0jB,WAAa,IAAM,EAAI,IAC5C,gBAACsN,GAAD,CACCrG,SAAU4J,EAAQiC,uBAClBhU,cAAexR,EAAMuC,KAAKC,UAAUlM,QACpCsjB,YAAarZ,EACbsZ,eAAgBlY,KAIlB,gBAACob,GAAA,GAAD,CAAME,MAAI,EAACC,GAAIluB,OAAO0jB,WAAa,IAAM,EAAI,IAC5C,gBAACiO,GAAD,CACChH,SAAU4J,EAAQkC,oBAClB7E,iBAAkB2C,EAAQmC,eAC1B7E,cAAe0C,EAAQoC,YACvB7E,eAAgByC,EAAQqC,KACxBpU,cAAexR,EAAMuC,KAAKC,UAAUlM,QACpCsjB,YAAarZ,EACbsZ,eAAgBlY,MA0BnB,gBAACob,GAAA,GAAD,CAAMC,WAAS,EAACrvB,GAAG,YAClB,gBAACovB,GAAA,GAAD,CAAME,MAAI,EAACC,GAAI,IACd,sBAAIjX,MAAO,CAAES,WAAY,OAAQ2e,aAAc,UAA/C,aAGD,gBAACtI,GAAA,GAAD,CAAME,MAAI,EAACC,GAAI,IACd,sBAAIjX,MAAO,CAAES,WAAY,OAAQ2e,aAAc,OAAQlb,SAAU,UAAjE,qHAEC,2BAFD,kGAKA,uBAAKlE,MAAO,CAAES,WAAY,GAAIa,QAAS,SAhTb,MAC9B,MAAMlO,EACLmqB,EAAavC,QACZ,gCAAE,gBAAC4E,GAAA,EAAD,CAAO3gB,MAAO,YAAhB,SAAoCse,EAAavC,SAC/C,gCAAE,gBAAC6E,GAAA,EAAD,CAAO5gB,MAAO,YAAhB,6BAEE3I,EACLinB,EAAannB,WACZ,gCAAE,gBAACwpB,GAAA,EAAD,CAAO3gB,MAAO,YAAhB,YAAuCse,EAAannB,YAClD,gCAAE,gBAACypB,GAAA,EAAD,CAAO5gB,MAAO,YAAhB,wCAEJ,OACC,gCACE7L,EACD,wBAAM4M,MAAO,CAAE9O,QAAS,IAAxB,KACCoF,EAJH,EAsSMwpB,KAIH,gBAAChJ,GAAA,GAAD,CAAME,MAAI,EAACC,GAAIluB,OAAO0jB,WAAa,IAAM,EAAI,IAC5C,gBAACsP,GAAD,CACCrI,SAAU4J,EAAQyC,mBAClBlF,eAAgByC,EAAQqC,KACxBpU,cAAexR,EAAMuC,KAAKC,UAAUlM,QACpCsjB,YAAarZ,EACbsZ,eAAgBlY,EAChBsf,QAASuC,EAAavC,QACtB5kB,WAAYmnB,EAAaC,iBAI3B,gBAAC1G,GAAA,GAAD,CAAME,MAAI,EAACC,GAAIluB,OAAO0jB,WAAa,IAAM,EAAI,IAC5C,gBAAC8P,GAAD,CACC7I,SAAU4J,EAAQ0C,qBAClBnF,eAAgByC,EAAQqC,KACxBpU,cAAexR,EAAMuC,KAAKC,UAAUlM,QACpCsjB,YAAarZ,EACbsZ,eAAgBlY,EAChBsf,QAASuC,EAAavC,QACtB5kB,WAAYmnB,EAAaC,iBAI3B,gBAAC1G,GAAA,GAAD,CAAME,MAAI,EAACC,GAAIluB,OAAO0jB,WAAa,IAAM,EAAI,IAC5C,gBAAC+P,GAAD,CACC9I,SAAU4J,EAAQ2C,oBAClBpF,eAAgByC,EAAQqC,KACxBpU,cAAexR,EAAMuC,KAAKC,UAAUlM,QACpCsjB,YAAarZ,EACbsZ,eAAgBlY,EAChBsf,QAASuC,EAAavC,QACtB5kB,WAAYmnB,EAAaC,iBAc3B,gBAAC1G,GAAA,GAAD,CAAME,MAAI,EAACC,GAAIluB,OAAO0jB,WAAa,IAAM,EAAI,IAC5C,gBAACiQ,GAAD,CACChJ,SAAU4J,EAAQ4C,cAClBrF,eAAgByC,EAAQqC,KACxBpU,cAAexR,EAAMuC,KAAKC,UAAUlM,QACpCsjB,YAAarZ,EACbsZ,eAAgBlY,EAChBsf,QAASuC,EAAavC,QACtB5kB,WAAYmnB,EAAaC,mBAa/B,C,wICpiBM,MAAM2C,WAAyBnzB,EAAAA,UAClClE,YAAY6W,EAAOpE,GACf4K,MAAMxG,EAAOpE,GADW,qBAYfnL,IACTlH,KAAKyW,MAAM0N,UAAUjd,EAArB,IAbwB,kBAgBnB,KACL,MAAM,YAAEgwB,EAAF,aAAeC,EAAf,kBAA6BC,GAAsBp3B,KAAKyW,MACxD4gB,EAAc,GAAGH,EAAY/xB,OAKnC,OACY,uBAAK2R,MAAO,CAACsB,QAAQ,OAAQkf,SAAU,OAAQ5c,UAAiC,QAAoBrC,WAAkC,QAAgBF,eAAsC,QAAgB5P,MAAO,OAAQP,QAAS,QAC/NkvB,EAAYz2B,KAAIqgB,GAAK,gBAACnJ,EAAA,EAAD,CAAQzd,IAAK4mB,EAAGhK,MAAO,CAACsB,QAAS,cACH8D,gBAAkB4E,GAAKqW,EAAe,UAAY,UAClD5uB,MAAQ8uB,GAAe,GAAMA,EAAa,IAAM,MAChDtvB,UAAW,OACXiT,SAAWnb,OAAO0jB,WAAa,IAAM,GAAK,KAC1CxN,MAAO,QACPpN,OAAQ,OAExD+M,QAASwK,GAAKlgB,KAAKmkB,UAAUrD,IARX,IASfA,EATe,OAFtC,GArBH,CAEDyW,sBAAsBC,GAClB,OAAOA,EAAUC,MAAQz3B,KAAKyW,MAAM0gB,YACvC,CAEDO,mBAAmBjhB,GAElB,ECvBE,MAAMkhB,GACH,CAAE1nB,KAAM,mBAAoB2nB,IAAK,OAAQ98B,WAAW,GADjD68B,GAEJ,CAAE1nB,KAAM,kBAAmB2nB,IAAK,OAF5BD,GAGJ,CAAE1nB,KAAM,kBAAmB2nB,IAAK,OAH5BD,GAIJ,CAAE1nB,KAAM,kBAAmB2nB,IAAK,OAJ5BD,GAKH,CAAE1nB,KAAM,0EAA2E2nB,IAAK,QALrFD,GAMH,CAAE1nB,KAAM,oEAAqE2nB,IAAK,QAN/ED,GAOH,CAAE1nB,KAAM,mBAAoB2nB,IAAK,QAe9BC,GAAsBC,IAC/B,QAASA,GAAY,IAAIzqB,eACrB,IAAK,OACD,OAAOsqB,GACX,IAAK,MACD,OAAOA,GACX,IAAK,MACD,OAAOA,GACX,IAAK,OAML,IAAK,MACD,OAAOA,GALX,IAAK,OAML,IAAK,MAIL,QACI,OAAOA,GATX,IAAK,OACD,OAAOA,GAKjB,IAAK,MACJ,OAAOA,GAlBN,EAwBSI,GAAW,SAAC/V,EAAWpY,EAAkB+tB,GAAwD,IAAhCK,EAAgC,uDAAT,KAG7FC,EAAQ,KAKRA,EAHCN,EAAS78B,UAGFknB,EAFAkW,GAAoBlW,GAIhC,MAAMmW,EAAU,IAAIlW,KAAK,CAACgW,GAAQ,CAAChoB,KAAM0nB,EAAS1nB,OAI5CmoB,EAAiBv4B,OAAOu4B,UAC9B,GAAIA,GAAaA,EAAUC,iBAEvB,YADAD,EAAUC,iBAAiBF,GAM/B,MAAMl5B,EAAOY,OAAOoa,IAAIiI,gBAAgBiW,GAClCG,EAAW,GAAH,OAAM1uB,EAAN,YAAkB+tB,EAASC,KAEzC,GAAII,EAAc,CACd,MAAMO,EAAazuB,SAAS0uB,eAAeR,GAC3CO,EAAWvuB,aAAa,OAAQ/K,GAChCs5B,EAAWvuB,aAAa,WAAYsuB,GACpCC,EAAWtuB,OACd,KAAM,CACH,IAAI0M,EAAO7M,SAASC,cAAc,KAClCD,SAAS9K,KAAKy5B,YAAY9hB,GAC1BA,EAAK5W,KAAOd,EACZ0X,EAAK2hB,SAAWA,EAChB3hB,EAAK1M,OACR,CAEDyuB,YAAW,KAEP74B,OAAOoa,IAAI0e,gBAAgB15B,EAA3B,GACD,EACN,EAEKi5B,GAAuBj5B,IACzB,IAAI25B,EAAe/4B,OAAOg5B,KAAK55B,GAC3B65B,EAAYF,EAAazzB,OACzB4zB,EAAQ,IAAIC,WAAWF,GAC3B,IAAK,IAAIjyB,EAAI,EAAGA,EAAIiyB,EAAWjyB,IAAK,CAChC,IAAIoyB,EAAQL,EAAaM,WAAWryB,GACpCkyB,EAAMlyB,GAAKoyB,CACd,CACD,OAAOF,CAAP,ECtFJ,GAVqB,IAEnB,uBAAKjiB,MAAO,CAAEsB,QAAS,OAAQD,eAAgB,iBAC9C,gBAAC,KAAD,OCKI,SAASghB,KAAa,sCAC5B,MAAM,MAAEtoB,EAAF,SAASmE,GAAalR,EAAAA,WAAiBgR,IAEvC1D,EAA+BrN,MAAO7J,EAA2CU,EAA0ByX,EAAyBC,KACzI,MAAM4hB,QAA0BhB,GAAqBA,GAAcriB,EAAMuC,KAAKC,UAAzB6f,CAAyDh5B,EAAKU,EAAOyX,EAASC,IACnI0C,EAAS,CAAE/E,KAAM8D,GAAYQ,mBAAoBrE,QAASgkB,GAA1D,EAGK1hB,EAAqCzO,UAE1C,MAAMmwB,QAA0BhB,GAAqBA,GAAiBriB,EAAMuC,KAAKC,UAAgCnZ,IACjH8a,EAAS,CAAE/E,KAAM8D,GAAYQ,mBAAoBrE,QAASgkB,GAA1D,EAGD,GAAIrjB,EAAMuC,KAAKG,QACd,OAAO,gBAAC,GAAD,MAER,MAAM6gB,EAAUvjB,SAAH,UAAGA,EAAOuC,YAAV,iBAAG,EAAaC,iBAAhB,aAAG,EAAwB/B,UAIlC8nB,EAAoB,GAC1BhF,SAAAA,EAAS7iB,MAAM9Q,KAAIyG,IAClBkyB,EAAWvzB,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE1I,IAA1C,IAID,IAAI66B,EAAuB,GAC3B,UAAAxoB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8ByE,WAA9B,mBAAmChR,aAAnC,SAA0C6F,KAAIyG,IAC7CmyB,EAAcxzB,KAAK,CAAEO,MAAOc,EAAGtM,MAAOw+B,EAAWlmB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAzE,IAID,IAAI0+B,EAAiB,GACjBD,EAAcl0B,OAAS,IAC1Bm0B,EAAiBD,EAAc54B,KAAIqgB,GAClCA,EAAElmB,SAKJ,MAAM2+B,EAAyB,GAC3BF,EAAcl0B,OAAS,EAC1BivB,SAAAA,EAAS34B,WAAWwL,QAAO6Z,GAAKwY,EAAej8B,SAASyjB,EAAE0Y,SAAQ/4B,KAAIyG,IACrEqyB,EAAgB1zB,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE+qB,YAA/C,IAGDmC,SAAAA,EAAS34B,WAAWgF,KAAIyG,IACvBqyB,EAAgB1zB,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE+qB,YAA/C,IAKF,IAAIwH,EAA4B,GAChC,UAAA5oB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8BoE,gBAA9B,mBAAwC3Q,aAAxC,SAA+C6F,KAAIyG,IAClDuyB,EAAmB5zB,KAAK,CAAEO,MAAOc,EAAGtM,MAAO2+B,EAAgBrmB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAnF,IAID,IAAI8+B,EAAsB,GACtBD,EAAmBt0B,OAAS,IAC/Bu0B,EAAsBD,EAAmBh5B,KAAIqgB,GAC5CA,EAAElmB,SAKJ,MAAM++B,EAAoB,GACtBF,EAAmBt0B,OAAS,EAC/BivB,SAAAA,EAASqC,KAAKxvB,QAAO6Z,GAAK4Y,EAAoBr8B,SAASyjB,EAAEmR,cAAaxxB,KAAIyG,IACzEyyB,EAAW9zB,KAAK,CAAEO,MAAOc,EAAEiD,gBAAiBvP,MAAOsM,EAAE+rB,WAArD,IAGDmB,SAAAA,EAASqC,KAAKh2B,KAAIyG,IACjByyB,EAAW9zB,KAAK,CAAEO,MAAOc,EAAEiD,gBAAiBvP,MAAOsM,EAAE+rB,WAArD,IAKF,IAAI2G,EAAuB,GAC3B,UAAA/oB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8B+D,WAA9B,mBAAmCtQ,aAAnC,SAA0C6F,KAAIyG,IAC7C0yB,EAAc/zB,KAAK,CAAEO,MAAOc,EAAGtM,MAAO++B,EAAWzmB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAzE,IAGD,IAAI,KAAEmL,GAASquB,EAAQwB,gBACnB1wB,EAAQD,EAAAA,SAAuBc,GAAMb,MAIzC,MAAM20B,EAAsB,GAC5BzF,SAAAA,EAAS0F,MAAMr5B,KAAIyG,IAClB2yB,EAAah0B,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE1I,IAA5C,IAID,IAAIu7B,EAA4B,GAC5B70B,EAAMC,OAAS,GAClBD,EAAM,GAAGhB,QAAT,QAA0BA,QAA1B,QAA2C8C,MAAM,MAAMvG,KAAIyG,IAAK,QAC/D6yB,EAAmBl0B,KAAK,CACvBO,MAAK,UAAEyzB,EAAa3mB,MAAK4N,GAAKA,EAAE1a,MAAME,UAAU,EAAG,IAAMY,EAAEhD,QAAQ,IAAK,aAAnE,aAAE,EAAuEkC,MAC9ExL,MAAK,UAAEi/B,EAAa3mB,MAAK4N,GAAKA,EAAE1a,MAAME,UAAU,EAAG,IAAMY,EAAEhD,QAAQ,IAAK,aAAnE,aAAE,EAAuEtJ,OAF/E,IAQF,IAAIo/B,EAA6B,GACjC,UAAAnpB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8BmF,iBAA9B,mBAAyC1R,aAAzC,SAAgD6F,KAAIyG,IACnD8yB,EAAoBn0B,KAAK,CAAEO,MAAOc,EAAGtM,MAAOi/B,EAAa3mB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAjF,IAKD,MAAMq/B,EAAwB,GAC9B7F,SAAAA,EAASjnB,KAAK1M,KAAIyG,IACbA,EAAE1I,IAAM,MAAkB,WAAV0I,EAAElF,MACrBi4B,EAAep0B,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE1I,IAC9C,IAIF,IAAI07B,EAA2B,GAC3Bh1B,EAAMC,OAAS,GAClBD,EAAM,GAAGhB,QAAT,QAA0BA,QAA1B,QAA2C8C,MAAM,KAAKvG,KAAIyG,IAAK,MAC9DgzB,EAAkBr0B,KAAK,CACtBO,MAAOc,EAAEhD,QAAQ,IAAK,IACtBtJ,MAAOw5B,SAAF,UAAEA,EAASjnB,KAAK+F,MAAK4N,GAAKA,EAAE9e,MAAQkF,EAAEhD,QAAQ,IAAK,aAAnD,aAAE,EAAuD1F,IAF/D,IAQF,MAAM27B,EAAyB,GAC/B/F,SAAAA,EAASjnB,KAAK1M,KAAIyG,IACH,WAAVA,EAAElF,MACLm4B,EAAgBt0B,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE1I,IAC/C,IAIF,IAAI47B,EAA4B,GAChC,UAAAvpB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8BoF,gBAA9B,mBAAwC3R,aAAxC,SAA+C6F,KAAIyG,IAClDkzB,EAAmBv0B,KAAK,CAAEO,MAAOc,EAAGtM,MAAOu/B,EAAgBjnB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAnF,IAID,MAAOy/B,EAAQC,GAAax2B,EAAAA,SAAes2B,EAAmBj1B,OAAS,EAAI,iBAAmB,YAE9F,OACC,gCACC,gBAACyS,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,YACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOy+B,EACPmB,QAASpB,EACTzD,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAa0gB,GAAAA,IAAAA,KAEb9hB,EAAU8hB,GAAAA,IAAAA,IAAiCrgB,EAC3C,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAOX,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,iBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAO6+B,EACPe,QAASjB,EACT5D,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAa0gB,GAAAA,SAAAA,KAEb9hB,EAAU8hB,GAAAA,SAAAA,IAAsCrgB,EAChD,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAOX,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,YACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOg/B,EACPY,QAASb,EACThE,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAa0gB,GAAAA,IAAAA,KAEb9hB,EAAU8hB,GAAAA,IAAAA,IAAiCrgB,EAC3C,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAMX,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,gBACA,gBAACwe,GAAD,CACCC,YAAa,CAAC,WAAY,kBAC1BC,aAAckD,EACdlW,UAAWjd,IACVozB,EAAUpzB,EAAV,KAMS,YAAVmzB,EACD,gCACC,gBAACziB,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,iBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOs/B,EACPM,QAASP,EAAe9Y,UACxBwU,SAAUzuB,IAET,IAAI2L,EAAyB,GAI7B,GALsB3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAC1CyM,EAAa8J,OAETud,EAAkB/0B,OAAS,EAAG,CACjC,IAAIkN,EAAUtM,GAAQd,EAAAA,SAAuBc,IAAS,IAAId,EAC1DoN,EAAQnN,MAAQ,GAEW,GAAvB2N,EAAa1N,OAChBqN,EAAa0gB,GAAAA,KAAAA,KAEb9hB,EAAU8hB,GAAAA,KAAAA,IAAkCrgB,EAAcR,EAE3D,KAAM,CACN,MAAMA,EAAUtM,GAAQd,EAAAA,SAAuBc,IAAS,IAAId,EAC5DmM,EAAU8hB,GAAAA,KAAAA,IAAkCrgB,EAAcR,EAC1D,GAEFooB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAMTmkB,GAAiD,GAA5BA,EAAkB/0B,OACxC,gBAACyS,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,kBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOm/B,EACPS,QAASX,EACTlE,SAAUzuB,IAET,IAAI2L,EAAyB,GAG7B,GAJsB3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,MAAME,UAAU,EAAG,MAEzDpB,EAAMC,OAAS,EAAG,CACrB,IAAIkN,EAAUtM,GAAQd,EAAAA,SAAuBc,IAAS,IAAId,EAG1D,GAFAoN,EAAQnN,MAAQ,CAACmN,EAAQnN,MAAM,IAEJ,GAAvB2N,EAAa1N,OAAa,CAC7B,IAAIkN,EAAUtM,GAAQd,EAAAA,SAAuBc,IAAS,IAAId,EAC1DoN,EAAQnN,MAAQ,CAACmN,EAAQnN,MAAM,IAC/BkM,EAAU8hB,GAAAA,KAAAA,IAAkC,GAAI7gB,EAChD,MACAjB,EAAU8hB,GAAAA,KAAAA,IAAkCrgB,EAAcR,EAE3D,KAAM,CACN,MAAMA,EAAUtM,GAAQd,EAAAA,SAAuBc,IAAS,IAAId,EAC5DmM,EAAU8hB,GAAAA,KAAAA,IAAkCrgB,EAAcR,EAC1D,GAEFooB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAMT,MAGJ,gCACC,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,uBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOw/B,EACPI,QAASL,EAAgBhZ,UACzBwU,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAa0gB,GAAAA,SAAAA,KAEb9hB,EAAU8hB,GAAAA,SAAAA,IAAsCrgB,EAChD,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAMX,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,wBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOo/B,EACPQ,QAASX,EACTlE,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAa0gB,GAAAA,UAAAA,KAEb9hB,EAAU8hB,GAAAA,UAAAA,IAAuCrgB,EACjD,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,eAWb,gBAAC6B,EAAA,EAAD,KACwD,IAArDrX,OAAOC,KAAKqQ,EAAMuC,KAAKC,UAAUlM,SAAShC,OAC3C,2BACC,gBAACwS,EAAA,EAAD,CACCjC,QAAS,KACRmlB,OtDpQ0BC,EsDoQR1G,EAAQ2G,uBAAuB,EtDnQ9CC,GAAAA,2BAAqCF,EsDmQS,QAC/Cp7B,MAAKT,IACL,GAAIA,EAAKg8B,aACR,MAAMh8B,EAAKg8B,aAEZ,OAAOC,GAAoBj8B,EAAK85B,MAAO95B,EAAK2K,SAAUsxB,GAA8Bj8B,EAAK64B,UAAW,wBAApG,IAEAn4B,OAAMw7B,IACNzgC,QAAQC,IAAIwgC,EAAZ,ItD5QH,IAA2BL,CsDkQ5B,4BAeA,gBAACnjB,EAAA,EAAD,CACCjC,QAAS,KACR0lB,OtD/QkCC,EsD+QRjH,EAAQxkB,uBAAuB,EtD9QtDorB,GAAAA,mCAA6CK,EsD8QS,QACvD37B,MAAKT,IACL,GAAIA,EAAKg8B,aACR,MAAMh8B,EAAKg8B,aAEZ,OAAOC,GAAoBj8B,EAAK85B,MAAO95B,EAAK2K,SAAUsxB,GAA8Bj8B,EAAK64B,UAAW,wBAApG,IAEAn4B,OAAMw7B,IACNzgC,QAAQC,IAAIwgC,EAAZ,ItDvRH,IAAmCE,CsD6QpC,uCAiBD,yFAGF,qBAAG78B,GAAG,wBAAwBsY,MAAO,CAAEsB,QAAS,UAGlD,C,yHCrbM,MAAMkjB,WAAyBx3B,EAAAA,UAElClE,YAAY6W,GACRwG,MAAMxG,GADS,4BAUQ,KACvBzW,KAAKu7B,SAAS,CAAEhzB,MAAO1I,OAAO0jB,WAAY1b,OAAQhI,OAAO4oB,aAAzD,IAXe,kBAsBV,IAED,gCACI,gBAACsL,GAAD,SAtBR/zB,KAAK6Q,MAAQ,CACTtI,MAAO,EACPV,OAAQ,EAGf,CAMM2zB,uBACH37B,OAAO47B,oBAAoB,SAAUz7B,KAAK07B,iBAC7C,CAEMC,oBACH97B,OAAO4Q,iBAAiB,SAAUzQ,KAAK07B,iBAC1C,ECUkBr0B,GAAgBE,GAA4BA,EAAG+C,WAAWtI,OCA9DqF,GAAgBE,GAA4BA,EAAGiD,eAAexI,OCyBjF,MAUa6J,GAAmC,IACzCZ,GAVHgB,YAAa,CAAE/R,IAAK,cAAekM,MAAO,gBAC1C+F,WAAY,CAAEjS,IAAK,aAAckM,MAAO,YACxCgG,eAAgB,CAAElS,IAAK,iBAAkBkM,MAAO,mBAChDkG,UAAW,CAAEpS,IAAK,YAAakM,MAAO,mBACtCmG,SAAU,CAAErS,IAAK,WAAYkM,MAAO,kBACpCw1B,SAAU,CAAE1hC,IAAK,WAAYkM,MAAO,mBACpCy1B,QAAS,CAAE3hC,IAAK,UAAWkM,MAAO,mBCpE/B,IAAKiJ,GAWAC,GCdG,SAAS,KACtB,OAAO,IAAIE,OAAO,IAA0B,6CAC9C,E,SDCYH,GAAAA,EAAAA,EAAAA,KAAAA,GAAAA,OAAAA,EAAAA,EAAAA,MAAAA,GAAAA,QAAAA,EAAAA,EAAAA,UAAAA,GAAAA,YAAAA,EAAAA,EAAAA,cAAAA,GAAAA,e,EAAAA,KAAAA,GAAAA,CAAAA,I,SAWAC,GAAAA,EAAAA,EAAAA,KAAAA,GAAAA,OAAAA,EAAAA,EAAAA,MAAAA,GAAAA,QAAAA,EAAAA,EAAAA,UAAAA,GAAAA,YAAAA,EAAAA,EAAAA,YAAAA,GAAAA,a,EAAAA,KAAAA,GAAAA,CAAAA,IEHZ,IAAIQ,GAAqB,KACrBC,GAAW,CAAC,EAwEhB,SAASC,GAAyBC,EAAyBC,GACvD,MAAM1R,EAAKgO,KASX,OARAuD,GAASvR,GAAM,CAAC,EAChBuR,GAASvR,GAAI2R,QAAU,IAAInT,SAAQ,CAACwC,EAASvC,KAZjD,IAAc8B,IAaD,CAAEP,KAAIyR,OAAMC,WAZrBJ,GAAOM,YAAYrR,GAcfgR,GAASvR,GAAIgB,QAAUA,EACvBuQ,GAASvR,GAAIvB,OAASA,CAAtB,IAGG8S,GAASvR,GAAI2R,OACvB,CAEM,SAASE,KACZ,OAAOL,GAAuCX,GAAAA,KAAwB,KACzE,CCjFM,MAYMkB,GAAmBxM,UDZvBlE,OAAM,QAKPnF,QAAQC,IAAI,sBAEZmV,GAASA,IAAU,IAAIU,GAKvBV,GAAOW,iBAAiB,WAAYC,IAChC,MAAQzR,MAAM,GAAET,EAAF,KAAMyR,EAAN,QAAYC,IAAcQ,EAQhCX,GAASvR,GAAIgB,QAAQ0Q,GAK7BH,GAASvR,QAAMtC,CAAf,IAMJ4T,GAAOW,iBAAiB,gBAAiBC,IACrC,MAAQzR,MAAM,GAAET,EAAF,KAAMyR,EAAN,QAAYC,IAAcQ,EAOhChW,QAAQD,MAAM,oBAAqByV,GACnCH,GAASvR,GAAIvB,OAAOiT,GAK5BH,GAASvR,QAAMtC,CAAf,KA7CJxB,QAAQC,IAAI,2BCanB,IAGC,aAFMgW,KACNjW,QAAQC,IAAI,8BACCiW,GAAUC,EAAOA,EAAMlB,QAGpC,CAFC,MACDjV,QAAQD,MAAM,qBACd,GAYWqW,GAAgBD,IAC5B,MAAME,EAAwB,CAAC3J,EAAmB4J,KACjD,IAAKA,GAAoC,IAAtBA,EAAW7L,OAC7B,OAAQ,IAAI8L,IAEb,GAAIJ,EAAMlB,QACT,OAAQ,IAAIsB,IAEb,IAAIC,EAAY,IAAID,IAIpB,OAHAC,EAAUC,IAAIH,EAAW,GAAGhP,MAE5B6O,EAAQO,GAAUP,EAAVO,CAAiBhK,EAAW,CAAC4J,EAAW,GAAGhP,OAC5CkP,CAAP,EAOD,OAJAL,EAAM1J,QAAU,CAAC,EACjB0J,EAAMQ,cAAiBN,EAAsBlF,GAAAA,IAAAA,IAA6BgF,EAAMS,UAAUC,OAC1FV,EAAMW,mBAAqBT,EAAsBlF,GAAAA,SAAAA,IAAkCgF,EAAMS,UAAU7V,YAE5F,IAAMoV,EAAb,EASKD,GAAY7M,MAAO8M,EAAsBY,KAC9C,IACC,MAAMxS,QD0BD,SAAewS,GAGlB,OAAOzU,QAAQyU,IAAI,CACrBtD,GAAkBsD,GAClBrD,GAA4BqD,KAErB/R,MAAKgS,GACK1B,GAAuDX,GAAAA,MAAyB,CACnFoC,MACAG,QAASF,EAAQ,GACjBG,QAASH,EAAQ,MAIhC,CCzCoBf,CAAiBc,GAE9BV,EAAwB,CAAC3J,EAAmB4J,KACjD,IAAKA,GAAoC,IAAtBA,EAAW7L,OAC7B,OAAQ,IAAI8L,IAEb,GAAIQ,EACH,OAAQ,IAAIR,IAEb,IAAIC,EAAY,IAAID,IAIpB,OAHAC,EAAUC,IAAIH,EAAW,GAAGhP,MAE5B6O,EAAQO,GAAUP,EAAVO,CAAiBhK,EAAW,CAAC4J,EAAW,GAAGhP,OAC5CkP,CAAP,EASD,OANAL,EAAMQ,cAAiBN,EAAsBlF,GAAAA,IAAAA,IAA6B5M,EAAKqS,UAAUC,OACnFV,EAAMW,mBAAqBT,EAAsBlF,GAAAA,SAAAA,IAAkC5M,EAAKqS,UAAU7V,YACxGoV,EAAMlB,QAAU8B,EAChBZ,EAAMoB,WAAahT,EAAKgT,WACxBpB,EAAMS,UAAYrS,EAAKqS,UAEhBT,CAIP,CAHC,MAED,OADAnW,QAAQD,MAAM,2BACPoW,CACP,GAcWqB,GAAmBnO,UAC/B,IACC,MAAM9E,QD2BkBkT,EC3BgBtB,EAAM1J,QD4BrC6I,GAA+DX,GAAAA,UAA6B,CAC/F8C,oBC3BN,OADAtB,EAAMS,UAAYrS,EACX,IAAI4R,EAIX,CAHC,MAED,OADAnW,QAAQD,MAAM,kCACPoW,CACP,CDqBK,IAAmBsB,CCrBxB,EAGWf,GAAaP,GAAyB,CAAC3W,EAAuCU,EAA0ByX,EAAyBC,KAC7I,MAAMnL,EAAmB5G,OAAO8I,OAAO,CAAC,EAAGwH,EAAM1J,SAC3CvB,EAA2B,iBAAVhL,EACpB,CAACA,GACDA,EAIG2X,EAA6BF,IAAaA,EAAQzM,SAAST,OAAS,EAAKkN,EAAQnM,SAAWmM,IAAY,IAAIpN,EAOlH,OANAsN,EAAY1M,KAAKD,GAEjBuB,EAAQjN,GAAQ,CAAEU,MAAOgL,EAAQ0M,gBAAepN,MAAOqN,EAAYrN,OAEnE2L,EAAM1J,QAAUA,EAET,IAAI0J,EAAX,EAIY2B,GAAe,CAAC3B,EAAsB3W,EAAuCU,KACzF,MAAMuM,EAAmB5G,OAAO8I,OAAO,CAAC,EAAGwH,EAAM1J,SAQjD,OAPIA,EAAQjN,GAAKU,MAAMuK,OAAS,GAAKvK,EACpCuM,EAAQjN,GAAKU,MAAMsxB,OAAO/kB,EAAQjN,GAAKU,MAAMmxB,WAAUjL,GAAKA,GAAKlmB,IAAQ,UAElEuM,EAAQjN,GAGhB2W,EAAM1J,QAAUA,EACT,IAAI0J,EAAX,ECvIM,SAASirB,GAAoBrlB,GACnC,MAAM,SAAE+T,EAAF,cAAYnI,EAAZ,YAA2BoI,EAA3B,eAAwCC,GAAmBjU,GACzD6I,EAAWI,IAAiBqc,EAAAA,EAAAA,UAAS,QAClC1c,EAAkBM,IAAwBoc,EAAAA,EAAAA,UAAS,MACtD1R,EAAgB2R,IAAuBD,EAAAA,EAAAA,WAAS,IAC/C,OAAEn2B,EAAF,OAAUob,GAAWwJ,EAExBtF,EAAYtf,EAAOT,OAAS,EAC5BiC,EAAYyE,GAAAA,eAAAA,IACZwZ,EAAW9I,GAAiBkO,EAAarjB,EAAyB,OAAbkY,EAAqBpY,GAAKA,EAAEjI,KAAK+hB,OAAO9Z,EAAEokB,aAAaluB,WAAiC,KAAnBiiB,EAAyBnY,GAAKA,EAAEga,EAAE9jB,WAAa8J,GAAKA,EAAE5B,EAAElI,YAElL0tB,EAAkB7C,GAAmB,GAAI,GAAI,GAC7CrH,EAAa,2BACbuE,EAA8B,KAApB9F,EAA0B,sBAAwB,GAC5D+F,EAA8B,KAApB/F,EAA0B,GAAK,sBACzCkL,EAAS1I,OAIToa,EAAazR,EAASxJ,OAAO+K,WAAUzmB,GAAU,oBAALA,IAE5C42B,EAAiB1R,EAASxJ,OAAOxb,SACnB,IAAhBy2B,GACHC,EAAehQ,OAAO+P,EAAY,GAGnC,MAAME,EAAiBD,EAAe12B,QAAQ2b,WAC1B,IAAhB8a,IACHC,EAAe3a,QAAQiJ,EAASxJ,OAAOib,IACvCE,EAAet2B,KAAK2kB,EAASxJ,OAAOib,KAGrC,MAAMG,EAAiB5R,EAAS5kB,OAAOJ,SACnB,IAAhBy2B,GACHG,EAAelQ,OAAO+P,EAAY,GAGnC,MAAMI,EAAiBD,EAAe52B,QAAQ2b,WAC1B,IAAhB8a,IACHG,EAAe7a,QAAQiJ,EAAS5kB,OAAOq2B,IACvCI,EAAex2B,KAAK2kB,EAAS5kB,OAAOq2B,KAGrC,MAAM1c,EAA8B,GAElC,QAAQ,GACP,IAAmB,OAAbD,EACLC,EAAO1Z,KAAK,CACXD,OAAQy2B,EACRrb,OAAQmb,EACRje,KAAMme,EAAe57B,KAAI6E,IAAOA,EAAI+2B,EAAe3U,QAAO,CAAC5G,EAAGhY,IAAMgY,EAAIhY,GAAG,GAAI,KAAKmhB,QAAQ,GAAK,MACjGmC,aAAc,0BAEdC,UAAW,OACXC,KAAM,GACNrc,KAAMqP,EACNiN,YAAY,EACZC,UAAW,YACXC,sBAAuB,aACvBC,aAAc,UACdpF,OAAQ,CAAC,EACT3K,MAAM,IAER,MAEA,IAAyB,KAApB0C,EACJE,EAAO1Z,KAAK,CACXP,EAAG62B,EACHjb,EAAGmb,EACHne,KAAMme,EAAe57B,IAAI8pB,GACzBmC,aAAc,UACdG,SAAU,CACTnkB,KAAM,IAEPokB,UAAWqP,EACXnP,cAAe,uDAGf/c,KAAMqP,EACN2N,YAAa5N,EACbiI,OAAQ,CAAC,IAEX,MAEA,QACC/H,EAAO1Z,KAAK,CACXP,EACA4b,EAAGgb,EACHhe,KAAMke,EAAe37B,IAAI8pB,GACzBmC,aAAc,UACdG,SAAU,CACTnkB,KAAM,IAEPokB,UAAWoP,EACXlP,cAAe,uDAGf/c,KAAMqP,EACN2N,YAAa5N,EACbiI,OAAQ,CAAC,IAMd,MAAMhJ,EACL,gBAACqF,GAAD,CAAkBC,eAAgBvB,EAAcjb,GAAYA,UAAWA,EAAWoL,aAAckY,IAK3FhF,EAAKvc,GADGlB,GAAcG,WACAP,QACtByd,EAAU/kB,OAAO8I,OAAO,CAAC,EAAGqc,EAAGtc,QACrCkc,EAAQ3c,OAAS,CAAEC,EAAG,GAAIC,EAAG,GAAIC,EAAG,GAAIC,EAAG,GAAIC,IAAK,GAGpD,MAAMuP,EAAO+J,EACNga,EACN,gBAACtO,GAAA,EAAD,CACC1Y,KAAM+U,IAAkB,EACxB4D,WAAW,EACXnG,UAAU,EACVhR,MAAO,CAACvO,MAAQ1I,OAAO0jB,WAAa,IAClC1b,OAAgD,IAAtCijB,EAAgBnC,sBAA6B,KACvDpR,WAAY,GACZyQ,YAAa,KAEd,gBAAC7J,GAAD,CAAWrH,MAAO,CAACjP,OAASijB,EAAgBnC,sBAAyB,MAClEvK,QAAUwC,EACVrC,SAAYqC,EAAW,cAEzB,uBAAK9J,MAAO,CAACC,UAAW,QAASiJ,MAAO,QAAS5H,QAAS,WAC1D,gBAACoG,GAAD,CAAYC,MAAO,EAAMC,MAAO,EAC/BC,OAAO,EACPC,SAAS,EACTC,KAAK,EACLE,eAAe,EACfC,eAAe,EACfE,aAAcmL,EACdpL,kBAAkB,EAClBE,aAAa,EACbE,iBAAkBA,EAClBC,UAAWA,EACXC,OAAUA,EACVC,OAA6B,KAAlBH,EAAwB+F,EAASD,EAC5C1F,OAA6B,KAAlBJ,EAAwB8F,EAASC,EAC5CxK,MAAQgG,EACRjB,oBAAuBA,EACvBD,aAAgBA,EAChBE,cAAiBoc,EACjBnc,eAAkBwC,IAEnB,2BACC,uBACD/J,IAAKC,EACLC,IAAI,6BACJjQ,MAAO,IACPuO,MAAO,CAACC,UAAW,WAGlBiO,GAAY8F,EAAgBlC,sBACzBkC,EAAgBjC,qBAChBiC,EAAgBnC,sBAChBtJ,EACAC,EACA4F,EACAC,EACAC,EACApE,EACApb,EACA2Z,EACA8F,EACY,OAAX/F,EAAmBgG,EAAU,QAMtC,OACC,uBAAKhI,UAAW,QAASpjB,IAAK0mB,EACxB9J,MAAO,CACHkJ,MAAO,QACPzX,MAAO,OAChBP,QAAS,SAGV,gBAACwW,GAAD,CAAYC,MAAO,EAAMC,MAAO,EAC/BC,OAAO,EACPC,SAAS,EACTC,KAAK,EACLE,eAAe,EACfC,eAAe,EACfE,aAAcmL,EACdpL,kBAAkB,EAClBE,aAAa,EACbE,iBAAkBA,EAClBC,UAAWA,EACXC,OAAUA,EACVC,OAA6B,KAAlBH,EAAwB+F,EAASD,EAC5C1F,OAA6B,KAAlBJ,EAAwB8F,EAASC,EAC5CxK,MAAQgG,EACRjB,oBAAuBA,EACdD,aAAgBA,EACzBE,cAAiBoc,EACjBnc,eAAkBwC,IAEnB,gBAAClE,GAAD,CAAWI,SAAUqC,EAAW,QAASxC,QAAUwC,EAAYtC,WAAYA,EAAYxH,MAAQ,CAACjP,OAAQijB,EAAgB7F,YAAc,KAC9G1c,MAAOuiB,EAAgBxC,aAC7CtD,GAAY8F,EAAgB1G,YACvB0G,EAAgBvC,WAChBuC,EAAgB7F,YAChB5F,EACAC,EACA4F,EACAC,EACAC,EACApE,EACApb,EACA2Z,EACA8F,EACY,OAAX/F,EAAmBgG,EAAU,MAEnCgX,GAIH,CCnOM,SAASzJ,GAAqBpc,GAAe,oBACnD,MAAM,SAAE+T,EAAF,eAAYmH,EAAZ,cAA4BtP,GAAkB5L,GAC5C6I,EAAWI,IAAiBqc,EAAAA,EAAAA,UAAS,QAClC1c,EAAkBM,IAAwBoc,EAAAA,EAAAA,UAAS,MACtD1R,EAAgB2R,IAAuBD,EAAAA,EAAAA,WAAS,GAElDjR,EAAkB7C,GAAmB,GAAI,GAAI,GAC7CrH,EAAa,oBACbuE,EAA8B,KAApB9F,EAA0B,GAAK,kBACzC+F,EAA8B,KAApB/F,EAA0B,kBAAoB,GAGxDkd,EAAUla,SAAH,UAAGA,EAAe9W,gBAAlB,aAAG,EAAyB3Q,MAAM,GAE/C,IAAIsS,EAAqBmV,SAAH,UAAGA,EAAepW,mBAAlB,aAAG,EAA4B/G,MAAM,GACP,MAAH,IAA7Cmd,SAAA,UAAAA,EAAepW,mBAAf,mBAA4B/G,aAA5B,eAAmCC,UACtC+H,GAAcmV,SAAJ,UAAIA,EAAepW,mBAAnB,aAAI,EAA4B/G,MAAM,IAG9C,MAAM8b,EAAS,CAA2C,YAAa,aAE1E,IAAI8R,EAAyB,CAAC9R,OAAQ,GAAIpb,OAAQ,IAC3CmtB,EAA2B,CAAC/R,OAAQ,GAAIpb,OAAQ,IACvD,GAA6C,IAAzCyc,SAAA,UAAAA,EAAe9W,gBAAf,eAAyB3Q,MAAMuK,SAA2D,IAA5Ckd,SAAA,UAAAA,EAAepW,mBAAf,eAA4BrR,MAAMuK,QAAa,OAChG,IAAIq3B,EAAK,UAAG7K,EAAeze,MAAK5N,GAAKA,EAAEtD,MAAQu6B,WAAtC,aAAG,EAA6CtK,WACzDjR,EAAOlf,SAAQgf,IACV0J,EAASgS,EAAM1b,EAAE5T,KACR4lB,EAAY9R,OAAOnb,KAAKib,GACxBgS,EAAYltB,OAAOC,KAAK2kB,EAASgS,EAAM1b,EAAE5T,GAAY3B,UAErDwnB,EAAc/R,OAAOnb,KAAKib,GAC1BiS,EAAcntB,OAAOC,KAAK2kB,EAASgS,EAAM1b,EAAE5T,GAAYimB,OACnE,GAEF,CAED,MAAMC,EAAYN,EAAYltB,OAExBsE,EAAM,CAAC,KAAQ,cAAe,OADlB4oB,EAAY9R,OAC2B,OAAUoS,GAE1DhB,EAAcW,EAAcntB,OAE/BiL,EAAQ,CAAC,KAAQ,aAAc,OADjBkiB,EAAc/R,OAC0B,OAAUoR,GAE7DlN,GAA4D,IAAhD4N,EAAYltB,OAAOmmB,WAAU7kB,GAAW,IAANA,IAEjDsoB,EAAqB,GAC3BA,EAAY3pB,KAAKqE,GACdslB,EAAY3pB,KAAKgL,GAEpB,MAAM0O,EAA8B,GAI9BmG,EAAKvc,GADMlB,GAAcG,WACHP,QACnByd,EAAU/kB,OAAO8I,OAAO,CAAC,EAAGqc,EAAGtc,QAChB,KAApBiW,IACAiG,EAAQe,MAAQ,CAAEK,MAAO,CAAC,EAAG,OAGT,KAApBrH,IACAiG,EAAQS,MAAQ,CAAEW,MAAO,CAAC,EAAG,OAG9B8I,SAAAA,EAAa1tB,SAAQ,CAACgf,EAAGja,KACpB,IACoB,KAApBwY,GACJE,EAAO1Z,KAAK,CACXP,EAAGwb,EAAEE,OACLE,EAAGJ,EAAElb,OACL5D,KAAM8e,EAAE9e,KACRkc,KAAM4C,EAAElb,OAAOnF,KAAIyG,GAAKA,EAAE9J,WAAa,MACvCsvB,aAAc,UACdG,SAAU,CACTnkB,KAAM,IAEWokB,UAAWhM,EAAEE,OAC/BgM,cAAe,uDAGf/c,KAAMqP,EACN2N,YAAa5N,EACbiI,OAAQ,CAAC,EACTiF,YAAY,IAKbhN,EAAO1Z,KAAK,CACXP,EAAGwb,EAAElb,OACLsb,EAAGJ,EAAEE,OACLhf,KAAM8e,EAAE9e,KACRkc,KAAM4C,EAAElb,OAAOnF,KAAIyG,GAAKA,EAAE9J,WAAa,MACvCsvB,aAAc,UACdG,SAAU,CACTnkB,KAAM,IAEWokB,UAAWhM,EAAEE,OACbgM,cAAe,uDAGjC/c,KAAMqP,EACN2N,YAAa5N,EACbiI,OAAQ,CAAC,EACTiF,YAAY,GAvCjB,IA6CA,MAAMhU,EAAO+J,EACNga,EACN,gBAACtO,GAAA,EAAD,CACC1Y,KAAM+U,IAAkB,EACxB4D,WAAW,EACXnG,UAAU,EACVhR,MAAO,CAACvO,MAAQ1I,OAAO0jB,WAAa,IAClC1b,OAAgD,IAAtCijB,EAAgBnC,sBAA6B,KACvDpR,WAAY,GACZyQ,YAAa,KAEd,gBAAC7J,GAAD,CAAWrH,MAAO,CAACjP,OAASijB,EAAgBnC,sBAAyB,MAClEvK,QAAUwC,EACVrC,SAAYqC,EAAW,cAEzB,uBAAK9J,MAAO,CAACC,UAAW,QAASiJ,MAAO,QAAS5H,QAAS,WAC1D,gBAACoG,GAAD,CAAYC,MAAO,EAAMC,MAAO,EAC/BC,OAAO,EACPC,SAAS,EACTC,KAAK,EACLE,eAAe,EACfC,eAAe,EACfE,aAAcmL,EACdpL,kBAAkB,EAClBE,aAAa,EACbE,iBAAkBA,EAClBC,UAAWA,EACXC,OAAUA,EACVC,OAA6B,KAAlBH,EAAwB+F,EAASD,EAC5C1F,OAA6B,KAAlBJ,EAAwB8F,EAASC,EAC5CxK,MAAQgG,EACRjB,oBAAuBA,EACvBD,aAAgBA,EAChBE,cAAiBoc,EACjBnc,eAAkBwC,IAEnB,2BACC,uBACD/J,IAAKC,EACLC,IAAI,6BACJjQ,MAAO,IACPuO,MAAO,CAACC,UAAW,WAGlBiO,GAAoD,IAAxC8F,EAAgBlC,sBACzBkC,EAAgBjC,qBAChBiC,EAAgBnC,sBAChBtJ,EACAC,EACA4F,EACAC,EACAC,EACA0N,EAAY9R,OACZ8R,EAAYltB,OACZ2Z,EACwB,KACA+F,GACG,UAAdhG,EAAwB,uBAAKhC,UAAU,cAAcxG,MAAO,CAACC,UAAW,QAC1E,2BACI,uBAAKuG,UAAU,MAAMxG,MAAO,CAACoF,gBAAiBzU,GAAAA,QAAAA,MAC9C,uBAAK6V,UAAU,SAAf,gBAEJ,2BACI,uBAAKA,UAAU,MAAKxG,MAAO,CAACoF,gBAAiBzU,GAAAA,QAAAA,MAC7C,uBAAK6V,UAAU,SAAf,gBAEE,OAKzB,OACC,uBAAKA,UAAW,QAASpjB,IAAK0mB,EACxB9J,MAAO,CACHkJ,MAAO,QACPzX,MAAO,OAChBP,QAAS,SAGV,gBAACwW,GAAD,CAAYC,MAAO,EAAMC,MAAO,EAC/BC,OAAO,EACPC,SAAS,EACTC,KAAK,EACLE,eAAe,EACfC,eAAe,EACfE,aAAcmL,EACdpL,kBAAkB,EAClBE,aAAa,EACbE,iBAAkBA,EAClBC,UAAWA,EACXC,OAAUA,EACVC,OAA6B,KAAlBH,EAAwB+F,EAASD,EAC5C1F,OAA6B,KAAlBJ,EAAwB8F,EAASC,EAC5CxK,MAAQgG,EACRjB,oBAAuBA,EACdD,aAAgBA,EACzBE,cAAiBoc,EACjBnc,eAAkBwC,IAEnB,gBAAClE,GAAD,CAAWI,SAAUqC,EAAW,QAASxC,QAAUwC,EAAY9J,MAAQ,CAACjP,OAAQijB,EAAgB7F,YAAc,KACtF1c,MAAOuiB,EAAgBxC,aAC7CtD,GAAwC,KAA5B8F,EAAgB1G,YACvB0G,EAAgBvC,WAChBuC,EAAgB7F,YAChB5F,EACAC,EACA4F,EACAC,EACAC,EACA0N,EAAY9R,OACZ8R,EAAYltB,OACZ2Z,EACwB,KACA+F,GAC7BgX,EACwB,UAAdhd,EAAwB,uBAAKhC,UAAU,cAAcxG,MAAO,CAACC,UAAW,QAClE,2BACI,uBAAKuG,UAAU,MAAMxG,MAAO,CAACoF,gBAAiBzU,GAAAA,QAAAA,MAC9C,uBAAK6V,UAAU,SAAf,gBAEJ,2BACI,uBAAKA,UAAU,MAAKxG,MAAO,CAACoF,gBAAiBzU,GAAAA,QAAAA,MAC7C,uBAAK6V,UAAU,SAAf,gBAEE,KACX4H,GAAuD,KAA1C7C,SAAA,UAAAA,EAAe9W,gBAAf,eAAyB3Q,MAAMuK,SAA6D,KAA7Ckd,SAAA,UAAAA,EAAepW,mBAAf,eAA4BrR,MAAMuK,QACiC,KAA9H,uBAAK2R,MAAO,CAACC,UAAW+T,EAAgBpC,kBAAxC,gEAIf,CCjPM,SAAS2K,GAAuB5c,GAAe,oBACrD,MAAM,SAAE+T,EAAF,eAAYmH,EAAZ,cAA4BtP,GAAkB5L,GAC5C6I,EAAWI,IAAiBqc,EAAAA,EAAAA,UAAS,QAClC1c,EAAkBM,IAAwBoc,EAAAA,EAAAA,UAAS,MACtD1R,EAAgB2R,IAAuBD,EAAAA,EAAAA,WAAS,GAElDjR,EAAkB7C,GAAmB,GAAI,GAAI,GAC7CrH,EAAa,sBACbuE,EAA8B,KAApB9F,EAA0B,GAAK,kBACzC+F,EAA8B,KAApB/F,EAA0B,kBAAoB,GAGxDkd,EAAUla,SAAH,UAAGA,EAAe9W,gBAAlB,aAAG,EAAyB3Q,MAAM,GAE/C,IAAIsS,EAAqBmV,SAAH,UAAGA,EAAepW,mBAAlB,aAAG,EAA4B/G,MAAM,GACP,MAAH,IAA7Cmd,SAAA,UAAAA,EAAepW,mBAAf,mBAA4B/G,aAA5B,eAAmCC,UACtC+H,GAAcmV,SAAJ,UAAIA,EAAepW,mBAAnB,aAAI,EAA4B/G,MAAM,IAG9C,MAAM8b,EAAS,CAA2C,aAE7D,IAAI8R,EAAyB,CAAC9R,OAAQ,GAAIpb,OAAQ,IAC3CmtB,EAA2B,CAAC/R,OAAQ,GAAIpb,OAAQ,IACvD,GAA6C,IAAzCyc,SAAA,UAAAA,EAAe9W,gBAAf,eAAyB3Q,MAAMuK,SAA2D,IAA5Ckd,SAAA,UAAAA,EAAepW,mBAAf,eAA4BrR,MAAMuK,QAAa,OAChG,IAAIq3B,EAAK,UAAG7K,EAAeze,MAAK5N,GAAKA,EAAEtD,MAAQu6B,WAAtC,aAAG,EAA6CtK,WACzDjR,EAAOlf,SAAQgf,IACV0J,EAASgS,EAAM1b,EAAE5T,KACR4lB,EAAY9R,OAAOnb,KAAKib,GACxBgS,EAAYltB,OAAOC,KAAK2kB,EAASgS,EAAM1b,EAAE5T,GAAY3B,UAErDwnB,EAAc/R,OAAOnb,KAAKib,GAC1BiS,EAAcntB,OAAOC,KAAK2kB,EAASgS,EAAM1b,EAAE5T,GAAYimB,OACnE,GAEF,CAED,MAAMC,EAAYN,EAAYltB,OAExBsE,EAAM,CAAC,KAAQ,cAAe,OADlB4oB,EAAY9R,OAC2B,OAAUoS,GAE1DhB,EAAcW,EAAcntB,OAE/BiL,EAAQ,CAAC,KAAQ,aAAc,OADjBkiB,EAAc/R,OAC0B,OAAUoR,GAE7DlN,GAA4D,IAAhD4N,EAAYltB,OAAOmmB,WAAU7kB,GAAW,IAANA,IAEjDsoB,EAAqB,GAC3BA,EAAY3pB,KAAKqE,GACdslB,EAAY3pB,KAAKgL,GAEpB,MAAM0O,EAA8B,GAI9BmG,EAAKvc,GADMlB,GAAcG,WACHP,QACnByd,EAAU/kB,OAAO8I,OAAO,CAAC,EAAGqc,EAAGtc,QAChB,KAApBiW,IACAiG,EAAQe,MAAQ,CAAEK,MAAO,CAAC,EAAG,OAGT,KAApBrH,IACAiG,EAAQS,MAAQ,CAAEW,MAAO,CAAC,EAAG,OAG9B8I,SAAAA,EAAa1tB,SAAQ,CAACgf,EAAGja,KACpB,IACoB,KAApBwY,GACJE,EAAO1Z,KAAK,CACXP,EAAGwb,EAAEE,OACLE,EAAGJ,EAAElb,OACL5D,KAAM8e,EAAE9e,KACRkc,KAAM4C,EAAElb,OAAOnF,KAAIyG,GAAKA,EAAE9J,WAAa,MACvCsvB,aAAc,UACdG,SAAU,CACTnkB,KAAM,IAEWokB,UAAWhM,EAAEE,OAC/BgM,cAAe,uDAGf/c,KAAMqP,EACN2N,YAAa5N,EACbiI,OAAQ,CAAC,EACTiF,YAAY,IAKbhN,EAAO1Z,KAAK,CACXP,EAAGwb,EAAElb,OACLsb,EAAGJ,EAAEE,OACLhf,KAAM8e,EAAE9e,KACRkc,KAAM4C,EAAElb,OAAOnF,KAAIyG,GAAKA,EAAE9J,WAAa,MACvCsvB,aAAc,UACdG,SAAU,CACTnkB,KAAM,IAEWokB,UAAWhM,EAAEE,OACbgM,cAAe,uDAGjC/c,KAAMqP,EACN2N,YAAa5N,EACbiI,OAAQ,CAAC,EACTiF,YAAY,GAvCjB,IA6CA,MAAMhU,EAAO+J,EACNga,EACN,gBAACtO,GAAA,EAAD,CACC1Y,KAAM+U,IAAkB,EACxB4D,WAAW,EACXnG,UAAU,EACVhR,MAAO,CAACvO,MAAQ1I,OAAO0jB,WAAa,IAClC1b,OAAgD,IAAtCijB,EAAgBnC,sBAA6B,KACvDpR,WAAY,GACZyQ,YAAa,KAEd,gBAAC7J,GAAD,CAAWrH,MAAO,CAACjP,OAASijB,EAAgBnC,sBAAyB,MAClEvK,QAAUwC,EACVrC,SAAYqC,EAAW,cAEzB,uBAAK9J,MAAO,CAACC,UAAW,QAASiJ,MAAO,QAAS5H,QAAS,WAC1D,gBAACoG,GAAD,CAAYC,MAAO,EAAMC,MAAO,EAC/BC,OAAO,EACPC,SAAS,EACTC,KAAK,EACLE,eAAe,EACfC,eAAe,EACfE,aAAcmL,EACdpL,kBAAkB,EAClBE,aAAa,EACbE,iBAAkBA,EAClBC,UAAWA,EACXC,OAAUA,EACVC,OAA6B,KAAlBH,EAAwB+F,EAASD,EAC5C1F,OAA6B,KAAlBJ,EAAwB8F,EAASC,EAC5CxK,MAAQgG,EACRjB,oBAAuBA,EACvBD,aAAgBA,EAChBE,cAAiBoc,EACjBnc,eAAkBwC,IAEnB,2BACC,uBACD/J,IAAKC,EACLC,IAAI,6BACJjQ,MAAO,IACPuO,MAAO,CAACC,UAAW,WAGlBiO,GAAoD,IAAxC8F,EAAgBlC,sBACzBkC,EAAgBjC,qBAChBiC,EAAgBnC,sBAChBtJ,EACAC,EACA4F,EACAC,EACAC,EACA0N,EAAY9R,OACZ8R,EAAYltB,OACZ2Z,EACwB,KACA+F,GACG,UAAdhG,EAAwB,uBAAKhC,UAAU,cAAcxG,MAAO,CAACC,UAAW,QAC1E,2BACI,uBAAKuG,UAAU,MAAMxG,MAAO,CAACoF,gBAAiBzU,GAAAA,QAAAA,MAC9C,uBAAK6V,UAAU,SAAf,gBAEJ,2BACI,uBAAKA,UAAU,MAAKxG,MAAO,CAACoF,gBAAiBzU,GAAAA,QAAAA,MAC7C,uBAAK6V,UAAU,SAAf,gBAEE,OAKzB,OACC,uBAAKA,UAAW,QAASpjB,IAAK0mB,EACxB9J,MAAO,CACHkJ,MAAO,QACPzX,MAAO,OAChBP,QAAS,SAGV,gBAACwW,GAAD,CAAYC,MAAO,EAAMC,MAAO,EAC/BC,OAAO,EACPC,SAAS,EACTC,KAAK,EACLE,eAAe,EACfC,eAAe,EACfE,aAAcmL,EACdpL,kBAAkB,EAClBE,aAAa,EACbE,iBAAkBA,EAClBC,UAAWA,EACXC,OAAUA,EACVC,OAA6B,KAAlBH,EAAwB+F,EAASD,EAC5C1F,OAA6B,KAAlBJ,EAAwB8F,EAASC,EAC5CxK,MAAQgG,EACRjB,oBAAuBA,EACdD,aAAgBA,EACzBE,cAAiBoc,EACjBnc,eAAkBwC,IAEnB,gBAAClE,GAAD,CAAWI,SAAUqC,EAAW,QAASxC,QAAUwC,EAAY9J,MAAQ,CAACjP,OAAQijB,EAAgB7F,YAAc,KACtF1c,MAAOuiB,EAAgBxC,aAC7CtD,GAAwC,KAA5B8F,EAAgB1G,YACvB0G,EAAgBvC,WAChBuC,EAAgB7F,YAChB5F,EACAC,EACA4F,EACAC,EACAC,EACA0N,EAAY9R,OACZ8R,EAAYltB,OACZ2Z,EACwB,KACA+F,GAC7BgX,EACwB,UAAdhd,EAAwB,uBAAKhC,UAAU,cAAcxG,MAAO,CAACC,UAAW,QAClE,2BACI,uBAAKuG,UAAU,MAAMxG,MAAO,CAACoF,gBAAiBzU,GAAAA,QAAAA,MAC9C,uBAAK6V,UAAU,SAAf,gBAEJ,2BACI,uBAAKA,UAAU,MAAKxG,MAAO,CAACoF,gBAAiBzU,GAAAA,QAAAA,MAC7C,uBAAK6V,UAAU,SAAf,gBAEE,KACX4H,GAAuD,KAA1C7C,SAAA,UAAAA,EAAe9W,gBAAf,eAAyB3Q,MAAMuK,SAA6D,KAA7Ckd,SAAA,UAAAA,EAAepW,mBAAf,eAA4BrR,MAAMuK,QACiC,KAA9H,uBAAK2R,MAAO,CAACC,UAAW+T,EAAgBpC,kBAAxC,gEAIf,CChPM,SAAS8K,GAAgB/c,GAAe,oBAC9C,MAAM,SAAE+T,EAAF,eAAYmH,EAAZ,cAA4BtP,GAAkB5L,GAC5C6I,EAAWI,IAAiBqc,EAAAA,EAAAA,UAAS,YAClC1c,EAAkBM,IAAwBoc,EAAAA,EAAAA,UAAS,MACtD1R,EAAgB2R,IAAuBD,EAAAA,EAAAA,WAAS,GAElDjR,EAAkB7C,GAAmB,GAAI,GAAI,IAC7CrH,EAAa,cACbuE,EAA8B,KAApB9F,EAA0B,oBAAsB,QAC1D+F,EAA8B,KAApB/F,EAA0B,QAAU,oBAI9Ckd,EAAUla,SAAH,UAAGA,EAAe9W,gBAAlB,aAAG,EAAyB3Q,MAAM,GAG/C,IAAIsS,EAAqBmV,SAAH,UAAGA,EAAepW,mBAAlB,aAAG,EAA4B/G,MAAM,GAEP,MAAH,IAA7Cmd,SAAA,UAAAA,EAAepW,mBAAf,mBAA4B/G,aAA5B,eAAmCC,UACtC+H,GAAcmV,SAAJ,UAAIA,EAAepW,mBAAnB,aAAI,EAA4B/G,MAAM,IAGjD,IAAI4tB,EAAyB,CAAC9R,OAAQ,GAAIpb,OAAQ,IAC3CmtB,EAA2B,CAAC/R,OAAQ,GAAIpb,OAAQ,IAGvD,GAA6C,IAAzCyc,SAAA,UAAAA,EAAe9W,gBAAf,eAAyB3Q,MAAMuK,SAA2D,IAA5Ckd,SAAA,UAAAA,EAAepW,mBAAf,eAA4BrR,MAAMuK,QAAa,OAGhG,IAAIq3B,EAAK,UAAG7K,EAAeze,MAAK5N,GAAKA,EAAEtD,MAAQu6B,WAAtC,aAAG,EAA6CtK,WACnD,MAAMwB,EAAS+I,EAAMtvB,EAAW,IAGhC,IAAI8T,EAAmB,GACvB,IAAK,MAAM9mB,KAAOswB,EACVjqB,OAAOwS,UAAU9X,eAAe+X,KAAKwX,EAAUtwB,IAC3CA,EAAIwH,WAAW+xB,IACfzS,EAAOnb,KAAK3L,EAAIoM,UAAWpM,EAAImK,QAAQ,KAAK,IAMxD2c,EAAOlf,SAAQgf,IAChB0J,EAASgS,EAAMtvB,EAAW,IAAI4T,KACrBgS,EAAY9R,OAAOnb,KAAKib,GACxBgS,EAAYltB,OAAOC,KAAK2kB,EAASgS,EAAMtvB,EAAW,IAAI4T,GAAG2b,iBAEzD1J,EAAc/R,OAAOnb,KAAKib,GAC1BiS,EAAcntB,OAAOC,KAAK2kB,EAASgS,EAAMtvB,EAAW,IAAI4T,GAAG6S,iBACvE,GAEC,CAEJ,MAAMP,EAAYN,EAAYltB,OAExBsE,EAAM,CAAC,KAAQ,cAAe,OADlB4oB,EAAY9R,OAC2B,OAAUoS,GAE1DhB,EAAcW,EAAcntB,OAE/BiL,EAAQ,CAAC,KAAQ,aAAc,OADjBkiB,EAAc/R,OAC0B,OAAUoR,GAE7DlN,EAAY4N,EAAYltB,OAAOT,OAAS,EAE3CqqB,EAAqB,GAC3BA,EAAY3pB,KAAKqE,GACdslB,EAAY3pB,KAAKgL,GAEpB,MAAM0O,EAA8B,GAEjCiQ,SAAAA,EAAa1tB,SAAQ,CAACgf,EAAGja,KAGrB,IAAIknB,EAAejN,EAAEE,OAAOvgB,KAAI6E,GACrBwd,OAAOxd,KAElByoB,EAAGpR,MAAK,CAACmE,EAAEhY,IAAIgY,EAAEhY,IAGjB,IAAI4zB,EAAe,IAAI/1B,MAAMonB,EAAG5oB,QAChC,IAAK,IAAIG,EAAE,EAAGA,EAAEyoB,EAAG5oB,OAAQG,IACvBo3B,EAAGp3B,GAAKwb,EAAElb,OAAOkb,EAAEE,OAAO3c,QAAQ0pB,EAAGzoB,GAAGlI,aAI5C,IAAIw2B,EAA0B,GAE9B7F,EAAGjsB,SAAQwD,IACP,IAAIuuB,EAAQn2B,KAAKmP,MAAMvH,GACnBwuB,EAASp2B,KAAKiqB,MAAOriB,EAAI,EAAG,IAEhCsuB,EAAc/tB,KAAKguB,EAAQ,WAAaC,EAAS,UAAjD,IAGJvU,EAAO1Z,KAAK,CACR7D,KAAM8e,EAAE9e,KACR26B,KAAM,aACNr3B,EAAGyoB,EACH7M,EAAGwb,EACH5P,UAAW8G,EAAcnzB,KAAI6E,GAAKA,IAClC0nB,cAAe,+DAGf/c,KAAMqP,EACN2N,YAAa,IACb3F,OAAQ,CAAC,GAXb,IAgBJ,MACG5B,EAAKvc,GADMlB,GAAcG,WACHP,QACnByd,EAAU/kB,OAAO8I,OAAO,CAAC,EAAGqc,EAAGtc,QAChB,KAApBiW,IACAiG,EAAQe,MAAQ,CAAEK,MAAO,CAAC,EAAG,OAGT,KAApBrH,IACAiG,EAAQS,MAAQ,CAAEW,MAAO,CAAC,EAAG,OAG9BpB,EAAQS,MAAQ,CAAEC,YAAW,EAAM4W,KAAM,EAAG3W,UAAU,EAAOC,MAAO,EAAGE,gBAAiB,SAAUxL,MAAO,QACrEuL,YAAY,EAAM0W,UAAU,EAAOhW,UAAW,UAKrF,MAAMtO,EAAO+J,EACNga,EACN,gBAACtO,GAAA,EAAD,CACC1Y,KAAM+U,IAAkB,EACxB4D,WAAW,EACXnG,UAAU,EACVhR,MAAO,CAACvO,MAAQ1I,OAAO0jB,WAAa,IAClC1b,OAAgD,IAAtCijB,EAAgBnC,sBAA6B,KACvDpR,WAAY,GACZyQ,YAAa,KAEd,gBAAC7J,GAAD,CAAWrH,MAAO,CAACjP,OAASijB,EAAgBnC,sBAAyB,MAClEvK,QAAUwC,EACVrC,SAAYqC,yBAEd,uBAAK9J,MAAO,CAACC,UAAW,QAASiJ,MAAO,QAAS5H,QAAS,WAC1D,gBAACoG,GAAD,CAAYC,MAAO,EAAOC,MAAO,EAChCC,OAAO,EACPC,SAAS,EACTC,KAAK,EACLE,eAAe,EACfC,eAAe,EACfE,aAAcmL,EACdpL,kBAAkB,EAClBE,aAAa,EACbE,iBAAkBA,EAClBC,UAAWA,EACXC,OAAUA,EACVC,OAA6B,KAAlBH,EAAwB+F,EAASD,EAC5C1F,OAA6B,KAAlBJ,EAAwB8F,EAASC,EAC5CxK,MAAQgG,EACRjB,oBAAuBA,EACvBD,aAAgBA,EAChBE,cAAiBoc,EACjBnc,eAAkBwC,IAEnB,2BACC,uBACD/J,IAAKC,EACLC,IAAI,6BACJjQ,MAAO,IACPuO,MAAO,CAACC,UAAW,WAGlBiO,GAAoD,IAAxC8F,EAAgBlC,sBACzBkC,EAAgBjC,qBAChBiC,EAAgBnC,sBAChBtJ,EACAC,EACA4F,EACAC,EACAC,EACA0N,EAAY9R,OACZ8R,EAAYltB,OACZ2Z,EACwB,KACA+F,KAKhC,OACC,uBAAKhI,UAAW,QAASpjB,IAAK0mB,EACxB9J,MAAO,CACHkJ,MAAO,QACPzX,MAAO,OAChBP,QAAS,SAGT,gBAACwW,GAAD,CAAYC,MAAO,EAAMC,MAAO,EAChCC,OAAO,EACPC,SAAS,EACTC,KAAK,EACLE,eAAe,EACfC,eAAe,EACfE,aAAcmL,EACdpL,kBAAkB,EAClBE,aAAa,EACbE,iBAAkBA,EAClBC,UAAWA,EACXC,OAAUA,EACVC,OAA6B,KAAlBH,EAAwB+F,EAASD,EAC5C1F,OAA6B,KAAlBJ,EAAwB8F,EAASC,EAC5CxK,MAAQgG,EACRjB,oBAAuBA,EACdD,aAAgBA,EACzBE,cAAiBoc,EACjBnc,eAAkBwC,IAEnB,gBAAClE,GAAD,CAAWI,SAAUqC,mBAAoBxC,QAAUwC,EAAY9J,MAAQ,CAACjP,OAAQijB,EAAgB7F,YAAc,KACtF1c,MAAOuiB,EAAgBxC,aAC7CtD,GAAwC,KAA5B8F,EAAgB1G,YACvB0G,EAAgBvC,WAChBuC,EAAgB7F,YAChB5F,EACAC,EACA4F,EACAC,EACAC,EACA0N,EAAY9R,OACZ8R,EAAYltB,OACZ2Z,EACwB,KACA+F,GAC7BgX,EACWpX,GAAuD,KAA1C7C,SAAA,UAAAA,EAAe9W,gBAAf,eAAyB3Q,MAAMuK,SAA6D,KAA7Ckd,SAAA,UAAAA,EAAepW,mBAAf,eAA4BrR,MAAMuK,QACiC,KAA9H,uBAAK2R,MAAO,CAACC,UAAW+T,EAAgBpC,kBAAxC,gEAIf,CCvOM,SAASoU,GAAwBrmB,GAAe,QACtD,MAAM,iBAAE8X,EAAF,cAAoBlM,EAApB,YAAmCoI,EAAnC,eAAgDC,GAAmBjU,EACnEoG,EAAY0R,EAElB,IAAII,EAAkB,GAClBC,EAAiB,GAEjBK,EAAkB,GAClBC,EAAiB,GAEjBI,EAAW,CAAC,EAGhB,GAAI,UAAAjN,EAAc9V,gBAAd,SAAwB3R,QAAS,UAACynB,EAAclX,YAAf,QAAC,EAAoBvQ,QAASkoB,OAAOT,EAAc9V,SAAS3R,MAAM+hB,OAAO,KAAO,KAAM,CAE1H,MAAMogB,EAAclgB,EAAUmE,OAAO+K,WAAUjL,GAAKA,GAAKuB,EAAc9V,SAAS3R,MAAM+hB,OAAO,KAE7FgS,EAAkB9R,EAAUjX,OAAOJ,MAAMu3B,GACzCnO,EAAkB/R,EAAUmE,OAAOxb,MAAMu3B,GACzC9N,EAAkBpS,EAAUjX,OAAOJ,MAAMu3B,GAAav3B,QAAQ2b,UAC9D+N,EAAkBrS,EAAUmE,OAAOxb,MAAMu3B,GAAav3B,QAAQ2b,UAC9DmO,EAAW,CAAC,KAAQ,WAAY,OAAUV,EAAiB,eAAkBM,EAAiB,OAAUP,EAAiB,eAAkBM,EAE3I,MAEAN,EAAkB9R,EAAUjX,OAC5BgpB,EAAkB/R,EAAUmE,OAC5BiO,EAAkBpS,EAAUjX,OAAOJ,QAAQ2b,UAC3C+N,EAAkBrS,EAAUmE,OAAOxb,QAAQ2b,UAC3CmO,EAAW,CAAC,KAAQ,WAAY,OAAUV,EAAiB,eAAkBM,EAAiB,OAAUP,EAAiB,eAAkBM,GAG5I,MAAMO,EAAqB,GAC3BA,EAAY3pB,KAAKypB,GAEd,MAAQhQ,EAAWI,IAAiBqc,EAAAA,EAAAA,UAAS,YACrC1c,EAAkBM,IAAwBoc,EAAAA,EAAAA,UAAS,MACnD1R,EAAgB2R,IAAuBD,EAAAA,EAAAA,WAAS,GAErD7W,EAAYyJ,EAAgBxpB,OAAS,EACrCiC,EAAYyE,GAAAA,KAAAA,IACZwZ,EAAWzI,GAA0B6N,EAAarjB,EAAWyV,EAA+B,KAAnBwC,EAAyBnY,GAAKA,EAAEga,EAAE9jB,WAAa8J,GAAKA,EAAE5B,EAAElI,YACjI0tB,EAAkB7C,GAAmB,GAAI,GAAI,GAC7CsC,EAAS1I,OAETsD,EAA8B,KAApB9F,EAA0B,iBAAmB,qBACvD+F,EAA6B,KAAnB/F,EAAyB,qBAAuB,iBAC1DuB,EAAa,uEAEbrB,EAA8B,GAEnCiQ,SAAAA,EAAa1tB,SAAQ,CAACgf,EAAGja,KACxB,QAAQ,GACP,IAAyB,KAApBwY,EACJE,EAAO1Z,KAAK,CACXP,EAAGwb,EAAEE,OACLE,EAAGJ,EAAElb,OACL5D,KAAM8e,EAAE9e,KACRkc,KAAM4C,EAAElb,OAAOnF,IAAI8pB,GACnBmC,aAA4B,OAAbpN,EAAqB,UAAY,OAChDuN,SAAU,CACTnkB,KAAM,IAEPokB,UAAWhM,EAAEE,OACbgM,cAAe,wHAMf/c,KAAMqP,EACN2N,YAAa5N,EACbiI,OAAQ,CAAC,EACTiF,YAAY,IAEd,MAEA,IAAyB,KAApBlN,EACJE,EAAO1Z,KAAK,CACXP,EAAGwb,EAAEkc,eACL9b,EAAGJ,EAAEmc,eACLj7B,KAAM8e,EAAE9e,KACRkc,KAAM4C,EAAEkc,eAAev8B,IAAI8pB,GAC3BmC,aAA4B,OAAbpN,EAAqB,UAAY,OAChDuN,SAAU,CACTnkB,KAAM,IAEPokB,UAAWhM,EAAEmc,eACbjQ,cAAe,wHAMf/c,KAAMqP,EACN2N,YAAa5N,EACbiI,OAAQ,CAAC,EACTiF,YAAY,IA7Cf,IAoDF,MAAM2Q,EAAc,CAAC,iBAAkB,6EACjC,YAAa,8CACb,wBAAyB,uDAGzB3kB,EAAO+J,EACNga,EACN,gBAACtO,GAAA,EAAD,CACC1Y,KAAM+U,IAAkB,EACxB4D,WAAW,EACXnG,UAAU,EACVhR,MAAO,CAACvO,MAAQ1I,OAAO0jB,WAAa,IAClC1b,OAAgD,IAAtCijB,EAAgBnC,sBAA6B,KACvDpR,WAAY,GACZyQ,YAAa,KAEd,gBAAC7J,GAAD,CAAWrH,MAAO,CAACjP,OAASijB,EAAgBnC,sBAAyB,MAClEvK,QAAUwC,EACVrC,SAAYqC,EAAW,cAEzB,uBAAK9J,MAAO,CAACC,UAAW,QAASiJ,MAAO,QAAS5H,QAAS,WAC1D,gBAACoG,GAAD,CAAYC,MAAO,EAAMC,MAAO,EAC/BC,OAAO,EACPC,SAAS,EACTC,KAAK,EACLE,eAAe,EACfC,eAAe,EACfE,aAAcmL,EACdpL,kBAAkB,EAClBE,aAAa,EACbC,YAAa8d,EACb7d,iBAAkBA,EAClBC,UAAWA,EACXC,OAAUA,EACVC,OAA6B,KAAlBH,EAAwB+F,EAASD,EAC5C1F,OAA6B,KAAlBJ,EAAwB8F,EAASC,EAC5CxK,MAAQgG,EACRjB,oBAAuBA,EACvBD,aAAgBA,EAChBE,cAAiBoc,EACjBnc,eAAkBwC,IAEnB,2BACC,uBACD/J,IAAKC,EACLC,IAAI,6BACJjQ,MAAO,IACPuO,MAAO,CAACC,UAAW,WAGlBiO,GAAY8F,EAAgBlC,sBACzBkC,EAAgBjC,qBAChBiC,EAAgBnC,sBAChBtJ,EACAC,EACA4F,EACAC,EACAC,EACAwJ,EACAD,EACApP,EACA8F,KAKF/G,EACL,gBAACmR,GAAD,CAAqBxwB,KAAM4d,EAAWzV,UAAWA,EAAWgK,UAAWqZ,EAAajY,aAAckY,IAGnG,OACC,uBAAKpN,UAAW,QAASpjB,IAAK0mB,EACxB9J,MAAO,CACHkJ,MAAO,QACPzX,MAAO,OAChBP,QAAS,OACTD,UAAW,UAGZ,gBAACyW,GAAD,CAAYC,MAAO,EAAMC,MAAO,EAC/BC,OAAO,EACPC,SAAS,EACTC,KAAK,EACLE,eAAe,EACfC,eAAe,EACfE,aAAcmL,EACdpL,kBAAkB,EAClBE,aAAa,EACbC,YAAa8d,EACb7d,iBAAkBA,EAClBC,UAAWA,EACXC,OAAUA,EACVC,OAA6B,KAAlBH,EAAwB+F,EAASD,EAC5C1F,OAA6B,KAAlBJ,EAAwB8F,EAASC,EAC5CxK,MAAQgG,EACCjB,oBAAuBA,EACvBD,aAAgBA,EACzBE,cAAiBoc,EACRnc,eAAkBwC,IAG5B,gBAAClE,GAAD,CAAWI,SAAUqC,EAAW,QAASxC,QAAUwC,EAAYtC,WAAYA,EAAYxH,MAAQ,CAACjP,OAAQijB,EAAgB7F,YAAc,OAEpID,GAAY8F,EAAgB1G,YACvB0G,EAAgBvC,WAChBuC,EAAgB7F,YAChB5F,EACAC,EACA4F,EACAC,EACAC,EACAwJ,EACAD,EACApP,EACA8F,GAEIiX,GAIZ,CCnOM,SAASa,KACf,MAAM,MAAEtsB,EAAF,SAASmE,GAAalR,EAAAA,WAAiBgR,KAEtCkf,EAAiBC,GAAkBnwB,EAAAA,UAAe,GAEnDsN,EAA+BrN,MAAO7J,EAA2CU,EAA0ByX,EAAyBC,KACzI,MAAM4hB,QAA0BhB,GAAqBA,GAAcriB,EAAMuC,KAAKC,UAAzB6f,CAAyDh5B,EAAKU,EAAOyX,EAASC,IACnI0C,EAAS,CAAE/E,KAAM8D,GAAYQ,mBAAoBrE,QAASgkB,GAA1D,EAGK1hB,EAAqCzO,MAAO7J,EAA2CU,KAE5F,MAAMs5B,QAA0BhB,GAAqBA,GAAiBriB,EAAMuC,KAAKC,UAAgCnZ,EAAKU,IACtHoa,EAAS,CAAE/E,KAAM8D,GAAYQ,mBAAoBrE,QAASgkB,GAA1D,EAmCD,GAhCApwB,EAAAA,WAAgB,KACfkR,EAAS,CAAE/E,KAAM8D,GAAYM,8BAC7B6e,GAAqBriB,EAAMuC,KAAKC,WAC9B3T,MAAM9E,IACNoa,EAAS,CAAE/E,KAAM8D,GAAYK,uBAAwBlE,QAAStV,GAA9D,IAEK,KP8GLkV,IAAUA,GAAOqkB,YACjBrkB,GAAS,KACTpV,QAAQC,IAAI,uBO/Gb,IAEC,IAEHmJ,EAAAA,WAAgB,KAEf,MAAMquB,EAAWthB,EAAMuC,KAAKC,UAAUlM,QAArB,SACX8G,EAAc4C,EAAMuC,KAAKC,UAAUlM,QAArB,YAEfgrB,GAAalkB,GAGW,GAAzBkkB,EAASv3B,MAAMuK,QAA2C,GAA5B8I,EAAYrT,MAAMuK,QNnBjBpB,OAAO8M,EAAsBzQ,EAAc6N,EAAkBoU,KACjG,IAEC,aADM1R,UAkEkB5M,OAAO8M,EAAsBY,EAAcrR,EAAc6N,EAAkBoU,KACpG,IACC,MAAMpjB,QDYD,SAAuBwS,EAAcrR,EAAc6N,EAAkBoU,GAGxE,OAAOrlB,QAAQyU,IAAI,CACfpD,GAA0BoD,EAAKrR,EAAS6N,GACxCK,GAA4BmD,EAAKrR,EAAS6N,KAEzCvO,MAAKgS,GACK1B,GAA+DX,GAAAA,cAAiC,CACnGoC,MACAojB,gBAAiBnjB,EAAQ,GACzBojB,kBAAmBpjB,EAAQ,GAC3B2Q,mBAIf,CC5BoB1R,CAAyBc,EAAKrR,EAAS6N,EAAaoU,GAEvE,OADAxR,EAAMS,UAAYrS,EAAKqS,UAChBT,CAIP,CAHC,MAED,OADAnW,QAAQD,MAAM,2BACPoW,CACP,GAzEakkB,CAAkBlkB,GAAO,EAAOzQ,EAAS6N,EAAaoU,EAGnE,CAFC,MACD3nB,QAAQD,MAAM,+BACd,GMgBAy4B,CAA0BriB,EAAMuC,KAAKC,UAAgC8e,EAASv3B,MAAM,GAAIqT,EAAYrT,MAAM,GAAIiW,EAAMuC,KAAKC,UAAUlM,SACjIzH,MAAM9E,IAENoa,EAAS,CAAE/E,KAAM8D,GAAYQ,mBAAoBrE,QAAStV,GAA1D,GAHF,GAOE,CAACiW,EAAMuC,KAAKC,UAAUlM,UAGrB0J,EAAMuC,KAAKG,UAAY1C,EAAMuC,KAAKC,UAAU/B,UAC/C,OAAO,gBAAC,GAAD,MAWR,IAAI0jB,EAAqB,GACrBC,EAAc,GACdC,EAAQ,GAEZ,IAAK,MAAMh7B,KAAO2W,EAAMuC,KAAKC,UAAUlM,QAClC5G,OAAOwS,UAAU9X,eAAe+X,KAAKnC,EAAMuC,KAAKC,UAAUlM,QAASjN,IACtE86B,EAAmBnvB,KAAK,CAAE,IAAO3L,EAAK,OAAU2W,EAAMuC,KAAKC,UAAUlM,QAAQjN,GAAKU,MAAO,MAASiW,EAAMuC,KAAKC,UAAUlM,QAAQjN,GAAKgL,QAItI,IAAK,MAAMhL,KAAOg5B,GACb3yB,OAAOwS,UAAU9X,eAAe+X,KAAKkgB,GAAyBh5B,IACjE+6B,EAAYpvB,KAAK,CAAE,IAAO3L,EAAK,MAASg5B,GAAwBh5B,GAAKkM,QAIvE4uB,EAAmBlzB,SAAQgf,IAC1BA,EAAElb,OAAO9D,SAAQgH,IAChBosB,EAAMrvB,KAAK,gBAACysB,GAAD,CAAUp4B,IAAK4mB,EAAE5mB,IAAM4O,EACjC4hB,eAAgBlY,EAChB+f,WAAY0C,EAAY/hB,MAAK1U,GAAMA,EAAGtE,KAAO4mB,EAAE5mB,MAAKkM,MACpDosB,YAAa1pB,EACb2pB,SAAU3R,EAAE5mB,IACZw4B,aAAe5R,EAAE5b,MAAMC,OAAS,EAAI2b,EAAE5b,MAAM,GAAK,OALlD,GADD,IAYD,MAAMkvB,EAAUvjB,EAAMuC,KAAKC,UAAU/B,UAmNrC,OAhNC,gCACC,uBAAKwF,MAAO,CACXgB,SAAU,SACV+C,IAAK,OACLC,KAAM,OACN/C,OAAQ,EACRmE,gBAAiB,UAEjB,2BACC,gBAAC,MAAD,CAAMiZ,YAAY,SAASC,QAAM,EAACC,KAAG,EAACC,GAAG,WAAWxe,MAAO,CAAEiJ,aAAc,OAAQhK,MAAO,UAA1F,YAGA,gBAAC,MAAD,CAAMof,YAAY,SAASC,QAAM,EAACC,KAAG,EAACC,GAAG,WAAWxe,MAAO,CAAEiJ,aAAc,OAAQhK,MAAO,UAA1F,0BAGA,gBAAC,MAAD,CAAMof,YAAY,SAASC,QAAM,EAACC,KAAG,EAACC,GAAG,YAAYxe,MAAO,CAAEiJ,aAAc,OAAQhK,MAAO,UAA3F,2BAGA,gBAAC,MAAD,CAAMof,YAAY,SAASC,QAAM,EAACC,KAAG,EAACC,GAAG,UAAUxe,MAAO,CAAEiJ,aAAc,OAAQhK,MAAO,UAAzF,oBAGA,gBAAC,MAAD,CAAMof,YAAY,SAASC,QAAM,EAACC,KAAG,EAACC,GAAG,UAAUxe,MAAO,CAAEiJ,aAAc,OAAQhK,MAAO,UAAzF,aAKD,uBAAKuH,UAAU,aAAaxG,MAAO,CAAEgB,SAAU,WAAY0K,MAAO,EAAG3H,IAAK,SACzE,gBAAC0a,GAAA,EAAD,CACCC,QACC,gBAACC,GAAA,EAAD,CACCC,QAAS1B,EACT2B,SAAUzV,IArEf+T,GADGD,EAoEC,IAKD5tB,MAAM,4BAIN4tB,EAAkB,uBAAKld,MAAO,CAAES,WAAY,OAAQ6lB,cAAe,OAAQ70B,MAAO,QAClF2sB,GACO,MAGV,gBAACtH,GAAA,GAAD,CAAMC,WAAS,EAACnS,QAAS,GAExB,gBAACkS,GAAA,GAAD,CAAMC,WAAS,EAACrvB,GAAG,YAClB,gBAACovB,GAAA,GAAD,CAAME,MAAI,EAACC,GAAIluB,OAAO0jB,WAAa,IAAM,EAAI,IAC5C,gBAACuZ,GAAD,CACCvO,iBAAkB6F,EAAQyB,iBAC1BxT,cAAexR,EAAMuC,KAAKC,UAAUlM,QACpCsjB,YAAarZ,EACbsZ,eAAgBlY,KAIlB,gBAACob,GAAA,GAAD,CAAME,MAAI,EAACC,GAAIluB,OAAO0jB,WAAa,IAAM,EAAI,IAC5C,gBAAC2M,GAAD,CACC1F,SAAU4J,EAAQnmB,YAClBoU,cAAexR,EAAMuC,KAAKC,UAAUlM,QACpCsjB,YAAarZ,EACbsZ,eAAgBlY,KAIlB,gBAACob,GAAA,GAAD,CAAME,MAAI,EAACC,GAAIluB,OAAO0jB,WAAa,IAAM,EAAI,IAC5C,gBAACuY,GAAD,CACCtR,SAAU4J,EAAQ5pB,eAClB6X,cAAexR,EAAMuC,KAAKC,UAAUlM,QACpCsjB,YAAarZ,EACbsZ,eAAgBlY,MASnB,gBAACob,GAAA,GAAD,CAAMC,WAAS,EAACrvB,GAAG,aAClB,gBAACovB,GAAA,GAAD,CAAME,MAAI,EAACC,GAAI,IACd,sBAAIjX,MAAO,CAAES,WAAY,SAAzB,4BAGD,gBAACqW,GAAA,GAAD,CAAME,MAAI,EAACC,GAAIluB,OAAO0jB,WAAa,IAAM,EAAI,IAC5C,gBAAC+M,GAAD,CACC9F,SAAU4J,EAAQtpB,SAClBuX,cAAexR,EAAMuC,KAAKC,UAAUlM,QACpCsjB,YAAarZ,EACbsZ,eAAgBlY,KAIlB,gBAACob,GAAA,GAAD,CAAME,MAAI,EAACC,GAAIluB,OAAO0jB,WAAa,IAAM,EAAI,IAC5C,gBAACgN,GAAD,CACC/F,SAAU4J,EAAQzpB,IAClB0X,cAAexR,EAAMuC,KAAKC,UAAUlM,QACpCsjB,YAAarZ,EACbsZ,eAAgBlY,KAIlB,gBAACob,GAAA,GAAD,CAAME,MAAI,EAACC,GAAIluB,OAAO0jB,WAAa,IAAM,EAAI,IAC5C,gBAACiN,GAAD,CACChG,SAAU4J,EAAQppB,UAClBqX,cAAexR,EAAMuC,KAAKC,UAAUlM,QACpCsjB,YAAarZ,EACbsZ,eAAgBlY,KAIlB,gBAACob,GAAA,GAAD,CAAME,MAAI,EAACC,GAAIluB,OAAO0jB,WAAa,IAAM,EAAI,IAC5C,gBAACkN,GAAD,CACCjG,SAAU4J,EAAQ+B,cAClB9T,cAAexR,EAAMuC,KAAKC,UAAUlM,QACpCsjB,YAAarZ,EACbsZ,eAAgBlY,KAIlB,gBAACob,GAAA,GAAD,CAAME,MAAI,EAACC,GAAIluB,OAAO0jB,WAAa,IAAM,EAAI,IAC5C,gBAACmN,GAAD,CACClG,SAAU4J,EAAQrpB,gBAClBsX,cAAexR,EAAMuC,KAAKC,UAAUlM,QACpCsjB,YAAarZ,EACbsZ,eAAgBlY,KAIlB,gBAACob,GAAA,GAAD,CAAME,MAAI,EAACC,GAAIluB,OAAO0jB,WAAa,IAAM,EAAI,IAC5C,gBAACoN,GAAD,CACCnG,SAAU4J,EAAQvpB,IAClBwX,cAAexR,EAAMuC,KAAKC,UAAUlM,QACpCsjB,YAAarZ,EACbsZ,eAAgBlY,KAIlB,gBAACob,GAAA,GAAD,CAAME,MAAI,EAACC,GAAIluB,OAAO0jB,WAAa,IAAM,EAAI,IAC5C,gBAACqN,GAAD,CACCpG,SAAU4J,EAAQ9pB,WAClB+X,cAAexR,EAAMuC,KAAKC,UAAUlM,QACpCsjB,YAAarZ,EACbsZ,eAAgBlY,MAiBnB,gBAACob,GAAA,GAAD,CAAMC,WAAS,EAACrvB,GAAG,YAClB,gBAACovB,GAAA,GAAD,CAAME,MAAI,EAACC,GAAI,IACd,sBAAIjX,MAAO,CAAES,WAAY,SAAzB,aAGD,gBAACqW,GAAA,GAAD,CAAME,MAAI,EAACC,GAAIluB,OAAO0jB,WAAa,IAAM,EAAI,IAC5C,gBAAC,GAAD,CACCiH,SAAU4J,EAAQiJ,gBAClB1L,eAAgByC,EAAQ34B,WACxB4mB,cAAexR,EAAMuC,KAAKC,UAAUlM,QACpCsjB,YAAarZ,EACbsZ,eAAgBlY,KAIlB,gBAACob,GAAA,GAAD,CAAME,MAAI,EAACC,GAAIluB,OAAO0jB,WAAa,IAAM,EAAI,IAC5C,gBAAC,GAAD,CACCiH,SAAU4J,EAAQkJ,kBAClB3L,eAAgByC,EAAQ34B,WACxB4mB,cAAexR,EAAMuC,KAAKC,UAAUlM,QACpCsjB,YAAarZ,EACbsZ,eAAgBlY,KAclB,gBAACob,GAAA,GAAD,CAAME,MAAI,EAACC,GAAIluB,OAAO0jB,WAAa,IAAM,GAAK,IAC7C,gBAAC,GAAD,CACCiH,SAAU4J,EAAQmJ,WAClB5L,eAAgByC,EAAQ34B,WACxB4mB,cAAexR,EAAMuC,KAAKC,UAAUlM,QACpCsjB,YAAarZ,EACbsZ,eAAgBlY,OAatB,CC/TM,SAASgrB,KAAe,gBAC9B,MAAM,MAAE3sB,EAAF,SAASmE,GAAalR,EAAAA,WAAiBgR,IAEvC1D,EAAiCrN,MAAO7J,EAA6CU,EAA0ByX,EAAyBC,KAC7I,MAAM4hB,QAA0BuJ,GAAuBA,GAAgB5sB,EAAMuC,KAAKC,UAA3BoqB,CAA6DvjC,EAAKU,EAAOyX,EAASC,IACzI0C,EAAS,CAAE/E,KAAM8D,GAAYQ,mBAAoBrE,QAASgkB,GAA1D,EAGK1hB,EAAuCzO,UAE5C,MAAMmwB,QAA0BuJ,GAAuBA,GAAmB5sB,EAAMuC,KAAKC,UAAkCnZ,IACvH8a,EAAS,CAAE/E,KAAM8D,GAAYQ,mBAAoBrE,QAASgkB,GAA1D,EAGD,GAAIrjB,EAAMuC,KAAKG,QACd,OAAO,gBAAC,GAAD,MAER,MAAMmqB,EAAY7sB,EAAMuC,KAAKC,UAAU/B,UAIjC8nB,EAAoB,GAC1BsE,SAAAA,EAAWnsB,MAAM9Q,KAAIyG,IACpBkyB,EAAWvzB,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE1I,IAA1C,IAID,IAAI66B,EAAuB,GAC3B,UAAAxoB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8ByE,WAA9B,mBAAmChR,aAAnC,SAA0C6F,KAAIyG,IAC7CmyB,EAAcxzB,KAAK,CAAEO,MAAOc,EAAGtM,MAAOw+B,EAAWlmB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAzE,IAID,IAAI0+B,EAAiB,GACjBD,EAAcl0B,OAAS,IAC1Bm0B,EAAiBD,EAAc54B,KAAIqgB,GAClCA,EAAElmB,SAKJ,MAAM2+B,EAAyB,GAC3BF,EAAcl0B,OAAS,EAC1Bu4B,SAAAA,EAAWjiC,WAAWwL,QAAO6Z,GAAKwY,EAAej8B,SAASyjB,EAAE0Y,SAAQ/4B,KAAIyG,IACvEqyB,EAAgB1zB,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE+qB,YAA/C,IAGDyL,SAAAA,EAAWjiC,WAAWgF,KAAIyG,IACzBqyB,EAAgB1zB,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE+qB,YAA/C,IAKF,IAAIwH,EAA4B,GAChC,UAAA5oB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8BoE,gBAA9B,mBAAwC3Q,aAAxC,SAA+C6F,KAAIyG,IAClDuyB,EAAmB5zB,KAAK,CAAEO,MAAOc,EAAGtM,MAAO2+B,EAAgBrmB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAnF,IAGD,IAAI,KAAEmL,GAAS23B,EAAU7H,iBACrB3wB,EAAQD,EAAAA,SAAuBc,GAAMb,MAIzC,MAAM20B,EAAsB,GAC5B6D,SAAAA,EAAW5D,MAAMr5B,KAAIyG,IACpB2yB,EAAah0B,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE1I,IAA5C,IAID,IAAIm/B,EAA4B,GAC5Bz4B,EAAMC,OAAS,GAClBD,EAAM,GAAGhB,QAAT,QAA0BA,QAA1B,QAA2C8C,MAAM,MAAMvG,KAAIyG,IAAK,QAC/Dy2B,EAAmB93B,KAAK,CACvBO,MAAK,UAAEyzB,EAAa3mB,MAAK4N,GAAKA,EAAE1a,MAAME,UAAU,EAAG,IAAMY,EAAEhD,QAAQ,IAAK,aAAnE,aAAE,EAAuEkC,MAC9ExL,MAAK,UAAEi/B,EAAa3mB,MAAK4N,GAAKA,EAAE1a,MAAME,UAAU,EAAG,IAAMY,EAAEhD,QAAQ,IAAK,aAAnE,aAAE,EAAuEtJ,OAF/E,IASF,MAAMgjC,EAAwB,GAC9BF,SAAAA,EAAWvwB,KAAK1M,KAAIyG,IACfA,EAAE1I,IAAM,MAAkB,WAAV0I,EAAElF,MACrB47B,EAAe/3B,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE1I,IAC9C,IAIF,IAAIq/B,EAA2B,GAU/B,OATI34B,EAAMC,OAAS,GAClBD,EAAM,GAAGhB,QAAT,QAA0BA,QAA1B,QAA2C8C,MAAM,KAAKvG,KAAIyG,IAAK,MAC9D22B,EAAkBh4B,KAAK,CACtBO,MAAOc,EAAEhD,QAAQ,IAAK,IACtBtJ,MAAO8iC,SAAF,UAAEA,EAAWvwB,KAAK+F,MAAK4N,GAAKA,EAAE9e,MAAQkF,EAAEhD,QAAQ,IAAK,aAArD,aAAE,EAAyD1F,IAFjE,IAQD,gCACC,gBAACoZ,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,YACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOy+B,EACPmB,QAASpB,EACTzD,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAairB,GAAAA,IAAAA,KAEbrsB,EAAUqsB,GAAAA,IAAAA,IAAmC5qB,EAC7C,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAOX,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,iBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAO6+B,EACPe,QAASjB,EACT5D,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAairB,GAAAA,SAAAA,KAEbrsB,EAAUqsB,GAAAA,SAAAA,IAAwC5qB,EAClD,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAMX,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,uBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOijC,EACPrD,QAASoD,EAAezc,UACxBwU,SAAUzuB,IAET,IAAI2L,EAAyB,GAI7B,GALsB3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAC1CyM,EAAa8J,OAETkhB,EAAkB14B,OAAS,EAAG,CACjC,IAAIkN,EAAUtM,GAAQd,EAAAA,SAAuBc,IAAS,IAAId,EAC1DoN,EAAQnN,MAAQ,GAEW,GAAvB2N,EAAa1N,OAChBqN,EAAairB,GAAAA,KAAAA,KAEbrsB,EAAUqsB,GAAAA,KAAAA,IAAoC5qB,EAAcR,EAE7D,KAAM,CACN,MAAMA,EAAUtM,GAAQd,EAAAA,SAAuBc,IAAS,IAAId,EAC5DmM,EAAUqsB,GAAAA,KAAAA,IAAoC5qB,EAAcR,EAC5D,GAEFooB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAMT8nB,GAAiD,GAA5BA,EAAkB14B,OACxC,gBAACyS,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,wBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAO+iC,EACPnD,QAASX,EACTlE,SAAUzuB,IAET,IAAI2L,EAAyB,GAG7B,GAJsB3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,MAAME,UAAU,EAAG,MAEzDpB,EAAMC,OAAS,EAAG,CACrB,IAAIkN,EAAUtM,GAAQd,EAAAA,SAAuBc,IAAS,IAAId,EAG1D,GAFAoN,EAAQnN,MAAQ,CAACmN,EAAQnN,MAAM,IAEJ,GAAvB2N,EAAa1N,OAAa,CAC7B,IAAIkN,EAAUtM,GAAQd,EAAAA,SAAuBc,IAAS,IAAId,EAC1DoN,EAAQnN,MAAQ,CAACmN,EAAQnN,MAAM,IAC/BkM,EAAUqsB,GAAAA,KAAAA,IAAoC,GAAIprB,EAClD,MACAjB,EAAUqsB,GAAAA,KAAAA,IAAoC5qB,EAAcR,EAE7D,KAAM,CACN,MAAMA,EAAUtM,GAAQd,EAAAA,SAAuBc,IAAS,IAAId,EAC5DmM,EAAUqsB,GAAAA,KAAAA,IAAoC5qB,EAAcR,EAC5D,GAEFooB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAKT,KAGH,gBAAC6B,EAAA,EAAD,KACwD,IAArDrX,OAAOC,KAAKqQ,EAAMuC,KAAKC,UAAUlM,SAAShC,OAC3C,gBAACwS,EAAA,EAAD,CACCjC,QAAS,KACRmlB,OR9G2BC,EQ8GT4C,EAAU3C,uBAAuB,ER7G/CC,GAAAA,2BAAqCF,EQ6GU,QACjDp7B,MAAKT,IACL,GAAIA,EAAKg8B,aACR,MAAMh8B,EAAKg8B,aAGZ,OAAOC,GAAoBj8B,EAAK85B,MAAO95B,EAAK2K,SAAUsxB,GAA8Bj8B,EAAK64B,UAAW,wBAApG,IAEAn4B,OAAMw7B,IACNzgC,QAAQC,IAAIwgC,EAAZ,IRvHF,IAA2BL,CQ4G7B,4BAiBA,yFAGF,qBAAGt8B,GAAG,wBAAwBsY,MAAO,CAAEsB,QAAS,UAGlD,C,yHCzQM,MAAM0lB,WAA2Bh6B,EAAAA,UAEpClE,YAAY6W,GACRwG,MAAMxG,GADS,4BAUQ,KACvBzW,KAAKu7B,SAAS,CAAEhzB,MAAO1I,OAAO0jB,WAAY1b,OAAQhI,OAAO4oB,aAAzD,IAXe,kBAsBV,IAED,gCACI,gBAAC0U,GAAD,SAtBRn9B,KAAK6Q,MAAQ,CACTtI,MAAO,EACPV,OAAQ,EAGf,CAMM2zB,uBACH37B,OAAO47B,oBAAoB,SAAUz7B,KAAK07B,iBAC7C,CAEMC,oBACH97B,OAAO4Q,iBAAiB,SAAUzQ,KAAK07B,iBAC1C,ECUOr0B,GAAgBE,GAA4BA,EAAG8C,WAAWrI,OCyCtE,MAca6J,GAAmC,IAC5CZ,GAbH8yB,cAAe,CAAE7jC,IAAK,gBAAiBkM,MAAO,kBAC9C43B,eAAgB,CAAE9jC,IAAK,iBAAkBkM,MAAO,mBAChD63B,QAAS,CAAE/jC,IAAK,UAAWkM,MAAO,YAClC83B,SAAU,CAAEhkC,IAAK,WAAYkM,MAAO,aACpC+3B,SAAU,CAAEjkC,IAAK,WAAYkM,MAAO,sBACpC6F,YAAa,CAAE/R,IAAK,cAAekM,MAAO,gBAC1C8F,WAAY,CAAEhS,IAAK,aAAckM,MAAO,cACxC+F,WAAY,CAAEjS,IAAK,aAAckM,MAAO,YACxCg4B,qBAAsB,CAAElkC,IAAK,uBAAwBkM,MAAO,yBAC5D2F,eAAgB,CAAE7R,IAAK,iBAAkBkM,MAAO,qBCxF1C,IAAKiJ,GAUAC,GCbG,SAAS,KACtB,OAAO,IAAIE,OAAO,IAA0B,6CAC9C,E,SDCYH,GAAAA,EAAAA,EAAAA,KAAAA,GAAAA,OAAAA,EAAAA,EAAAA,MAAAA,GAAAA,QAAAA,EAAAA,EAAAA,UAAAA,GAAAA,W,EAAAA,KAAAA,GAAAA,CAAAA,I,SAUAC,GAAAA,EAAAA,EAAAA,KAAAA,GAAAA,OAAAA,EAAAA,EAAAA,MAAAA,GAAAA,QAAAA,EAAAA,EAAAA,UAAAA,GAAAA,YAAAA,EAAAA,EAAAA,YAAAA,GAAAA,a,EAAAA,KAAAA,GAAAA,CAAAA,IEJZ,IAAIQ,GAAqB,KACrBC,GAAW,CAAC,EACZ9Q,GAAO,CACPo/B,QAAS,GA2Eb,SAASruB,GAAyBC,EAAyBC,GACvD,MAAM1R,EAAKgO,KASX,OARAuD,GAASvR,GAAM,CAAC,EAChBuR,GAASvR,GAAI2R,QAAU,IAAInT,SAAQ,CAACwC,EAASvC,KAZjD,IAAc8B,IAaD,CAAEP,KAAIyR,OAAMC,WAZrBJ,GAAOM,YAAYrR,GAcfgR,GAASvR,GAAIgB,QAAUA,EACvBuQ,GAASvR,GAAIvB,OAASA,CAAtB,IAGG8S,GAASvR,GAAI2R,OACvB,CAUM,SAASmuB,GAAM7sB,GAGlB,OAAOzU,QAAQyU,IAAI,CACflD,GAAmBkD,GACnBjD,GAA6BiD,KAE5B/R,MAAKgS,GACK1B,GAAuDX,GAAAA,MAAyB,CACnFoC,MACAG,QAASF,EAAQ,GACjBG,QAASH,EAAQ,GACjB2sB,QAASp/B,GAAKo/B,WAI7B,CAMM,SAAS/sB,GAAUa,GACtB,OAAOnC,GAA+DX,GAAAA,UAA6B,CAC/F8C,iBACAksB,QAASp/B,GAAKo/B,SAErB,CCjHM,MAaME,GAAsBx6B,UDhB/B9E,GAAKo/B,QCiBS,KDfTx+B,OAAM,QAKPnF,QAAQC,IAAI,sBAEZmV,GAASA,IAAU,IAAIU,GAKvBV,GAAOW,iBAAiB,WAAYC,IAChC,MAAQzR,MAAM,GAAET,EAAF,KAAMyR,EAAN,QAAYC,IAAcQ,EAM3B,MAEL,UAAAX,GAASvR,UAAT,SAAcgB,QAAQ0Q,GAK9BH,GAASvR,QAAMtC,CAAf,IAMJ4T,GAAOW,iBAAiB,gBAAiBC,IACrC,MAAQzR,MAAM,GAAET,EAAF,KAAMyR,EAAN,QAAYC,IAAcQ,EAOhChW,QAAQD,MAAM,oBAAqByV,GACnCH,GAASvR,GAAIvB,OAAOiT,GAK5BH,GAASvR,QAAMtC,CAAf,KA7CJxB,QAAQC,IAAI,2BCenB,IAGC,aD6DSqV,GAAuCX,GAAAA,KAAwB,MC9DxE3U,QAAQC,IAAI,8BACCiW,GAAUC,EAAOA,EAAMlB,QAGpC,CAFC,MACDjV,QAAQD,MAAM,qBACd,GAGWqW,GAAgBD,IAC5B,MAAME,EAAwB,CAAC3J,EAAmB4J,KACjD,IAAKA,GAAoC,IAAtBA,EAAW7L,OAC7B,OAAQ,IAAI8L,IAEb,GAAIJ,EAAMlB,QACT,OAAQ,IAAIsB,IAEb,IAAIC,EAAY,IAAID,IAIpB,OAHAC,EAAUC,IAAIH,EAAW,GAAGhP,MAE5B6O,EAAQO,GAAUP,EAAVO,CAAiBhK,EAAW,CAAC4J,EAAW,GAAGhP,OAC5CkP,CAAP,EAOD,OAJAL,EAAM1J,QAAU,CAAC,EACjB0J,EAAMQ,cAAiBN,EAAsBlF,GAAAA,IAAAA,IAA6BgF,EAAMS,UAAUktB,OAAOjtB,OACjGV,EAAMW,mBAAqBT,EAAsBlF,GAAAA,SAAAA,IAAkCgF,EAAMS,UAAUktB,OAAO/iC,YAEnG,IAAMoV,EAAb,EASKD,GAAY7M,MAAO8M,EAAyBY,KACjD,IACC,MAAMxS,QAAa0R,GAAiBc,GAE9BV,EAAwB,CAAC3J,EAAmB4J,KACjD,IAAKA,GAAoC,IAAtBA,EAAW7L,OAC7B,OAAQ,IAAI8L,IAEb,GAAIQ,EACH,OAAQ,IAAIR,IAEb,IAAIC,EAAY,IAAID,IAIpB,OAHAC,EAAUC,IAAIH,EAAW,GAAGhP,MAE5B6O,EAAQO,GAAUP,EAAVO,CAAiBhK,EAAW,CAAC4J,EAAW,GAAGhP,OAC5CkP,CAAP,EASD,OANAL,EAAMQ,cAAiBN,EAAsBlF,GAAAA,IAAAA,IAA6B5M,EAAKqS,UAAUktB,OAAOjtB,OAC1FV,EAAMW,mBAAqBT,EAAsBlF,GAAAA,SAAAA,IAAkC5M,EAAKqS,UAAUktB,OAAO/iC,YAC/GoV,EAAMlB,QAAU8B,EAChBZ,EAAMoB,WAAahT,EAAKgT,WACxBpB,EAAMS,UAAYrS,EAAKqS,UAEhBT,CAIP,CAHC,MAED,OADAnW,QAAQD,MAAM,2BACPoW,CACP,GAGWqB,GAAmBnO,UAC/B,IACC,MAAM9E,QAAa0R,GAAqBE,EAAM1J,SAE9C,OADA0J,EAAMS,UAAYrS,EACX,IAAI4R,EAIX,CAHC,MAED,OADAnW,QAAQD,MAAM,kCACPoW,CACP,GAGWO,GAAaP,GAA4B,CAAC3W,EAAuCU,EAA0ByX,EAAyBC,KAChJ,MAAMnL,EAAmB5G,OAAO8I,OAAO,CAAC,EAAGwH,EAAM1J,SAC3CvB,EAA2B,iBAAVhL,EACpB,CAACA,GACDA,EAIG2X,EAA6BF,IAAaA,EAAQzM,SAAST,OAAS,EAAKkN,EAAQnM,SAAWmM,IAAY,IAAIpN,EAOlH,OANAsN,EAAY1M,KAAKD,GAEjBuB,EAAQjN,GAAQ,CAAEU,MAAOgL,EAAQ0M,gBAAepN,MAAOqN,EAAYrN,OAEnE2L,EAAM1J,QAAUA,EAET,IAAI0J,EAAX,EAIY2B,GAAe,CAAC3B,EAAyB3W,EAAuCU,EAAgB0X,KAC5G,MAAMnL,EAAmB5G,OAAO8I,OAAO,CAAC,EAAGwH,EAAM1J,SAC3CsL,EAAwB7X,GAAS,KACjCyX,EAAUpN,EAAAA,YAA0BkC,EAASjN,GAC7C0L,EAASyM,EAAQzM,SACjB8M,EAAYD,EAAgB7M,EAAOqB,QAAOC,GAAKA,GAAKuL,IAAgB,KAEpEE,EAAIN,EAAQnM,UAAY,IAAIjB,EAWlC,OAVIyN,GACHC,EAAE9M,KAAK6M,GAERvL,EAAQjN,GAAQ,CAACU,MAAO+X,EAAE/M,SAAU0M,gBAAgBpN,MAAOyN,EAAEzN,OAEtC,IAAnByN,EAAEzN,MAAMC,eACJgC,EAAQjN,GAGhB2W,EAAM1J,QAAUA,EACT,IAAI0J,EAAX,E,IC1II4tB,G,oCAAAA,GAAAA,EAAAA,EAAAA,6BAAAA,GAAAA,+BAAAA,EAAAA,EAAAA,yBAAAA,GAAAA,2BAAAA,EAAAA,EAAAA,sBAAAA,GAAAA,uB,EAAAA,KAAAA,GAAAA,CAAAA,IAiBL,MAAMtrB,GAAsB,CAC3B3F,UAAW,EACXkxB,aAAa,GAKRC,GAAU,CAAC9tB,EAAcsD,KAC9B,MAAM,KAAElE,GAASkE,EAEjB,OAAQlE,GACP,KAAKwuB,GAAsBG,6BAC1B,MAAO,IAAK/tB,EAAYrD,UAAW2G,EAAOjE,QAASwuB,aAAa,GAEjE,KAAKD,GAAsBI,yBAC3B,KAAKJ,GAAsBK,sBAC1B,MAAO,IAAKjuB,EAAYrD,UAAW,EAAGkxB,aAAa,GAEpD,QACC,OAAO7tB,EATT,EAaD,IAAIkuB,GAoBA,CAAC,EAEE,SAASC,KACf,MAAOC,EAAYC,GAAiBp7B,EAAAA,WAAiB66B,GAASxrB,KACxD,MAAEtC,EAAF,SAASmE,GAAalR,EAAAA,WAAiBgR,KAEtCkf,EAAiBC,GAAkBnwB,EAAAA,UAAe,GAQlD0O,EAAwCzO,MAAO7J,EAA8CU,KAClG,MAAMs5B,QAA0BiL,GAAwBA,GAAoBtuB,EAAMuC,KAAKC,UAAsCnZ,EAAKU,IAClIoa,EAAS,CAAE/E,KAAM8D,GAAYQ,mBAAoBrE,QAASgkB,GAA1D,EAkDD,GA/CApwB,EAAAA,WAAgB,KACfkR,EAAS,CAAE/E,KAAM8D,GAAYM,8BAW7BrX,QAAQyU,IAAI,CAToB1N,WAC/Bg7B,SAAsB9xB,GAA4B,SAAU,KAA5D,EAQYmyB,GALSr7B,WACrB,MAAMnJ,QAAcukC,GAA2BtuB,EAAMuC,KAAKC,WAC1D2B,EAAS,CAAE/E,KAAM8D,GAAYK,uBAAwBlE,QAAStV,GAA9D,EAGuCykC,KAEjC,KF+BNvvB,IAAUA,GAAOqkB,YACjBrkB,GAAS,KACTpV,QAAQC,IAAI,uBEhCZ,IAEC,IAEHmJ,EAAAA,WAAgB,KACf,GAA4B,GAAxBm7B,EAAWzxB,UACd,OAED,IAAI8xB,EAAMC,EAAgBf,OAAOzD,sBAIKh3B,WACrC,IACC,MAAM9E,QAAa+7B,GAAAA,8BAAwCsE,GAL/C,EAK6DL,EAAWzxB,WAChFvO,EAAKg8B,eACRvgC,QAAQD,MAAMwE,EAAKg8B,cACnBiE,EAAc,CAAEjvB,KAAMwuB,GAAsBK,yBAE7CI,EAAc,CAAEjvB,KAAMwuB,GAAsBI,2BACrC3D,GAAoBj8B,EAAK85B,MAAO95B,EAAK2K,SAAUsxB,GAA8Bj8B,EAAK64B,UAAW,qBAGpG,CAFC,MACDoH,EAAc,CAAEjvB,KAAMwuB,GAAsBK,uBAC5C,GAGFU,EAA+B,GAG7B,CAACP,EAAWzxB,YAGXqD,EAAMuC,KAAKG,UAAY1C,EAAMuC,KAAKC,UAAU/B,UAC/C,OAAO,gBAAC,GAAD,MAYR,IAAI0jB,EAAqB,GACrBC,EAAc,GACdC,EAAQ,GAEZ,IAAK,MAAMh7B,KAAO2W,EAAMuC,KAAKC,UAAUlM,QAClC5G,OAAOwS,UAAU9X,eAAe+X,KAAKnC,EAAMuC,KAAKC,UAAUlM,QAASjN,IACtE86B,EAAmBnvB,KAAK,CAAE,IAAO3L,EAAK,OAAU2W,EAAMuC,KAAKC,UAAUlM,QAAQjN,GAAKU,MAAO,MAASiW,EAAMuC,KAAKC,UAAUlM,QAAQjN,GAAKgL,QAItI,IAAK,MAAMhL,KAAOilC,GACb5+B,OAAOwS,UAAU9X,eAAe+X,KAAKmsB,GAA4BjlC,IACpE+6B,EAAYpvB,KAAK,CAAE,IAAO3L,EAAK,MAASilC,GAA2BjlC,GAAKkM,QAI1E4uB,EAAmBlzB,SAAQgf,IAC1BA,EAAElb,OAAO9D,SAAQgH,IAChBosB,EAAMrvB,KAAK,gBAACysB,GAAD,CAAUp4B,IAAK4mB,EAAE5mB,IAAM4O,EACjC4hB,eAAgBlY,EAChB+f,WAAY0C,EAAY/hB,MAAK1U,GAAMA,EAAGtE,KAAO4mB,EAAE5mB,MAAKkM,MACpDosB,YAAa1pB,EACb2pB,SAAU3R,EAAE5mB,IACZw4B,aAAe5R,EAAE5b,MAAMC,OAAS,EAAI2b,EAAE5b,MAAM,GAAK,OALlD,GADD,IAYD,MAAMq6B,EAAkB1uB,EAAMuC,KAAKC,UAAU/B,UAcvCmuB,EAAO,CACZtO,UAAW,EACXC,YAAa,EACbsO,WAAY,GAGPC,EAAQ,CACbxO,UAAW,EACXC,YAAa,EACbsO,WAAY,GAyNd,OAtNKH,EAAgBf,OAAOoB,eAAiB,IAC3CH,EAAKtO,UAAYoO,EAAgBf,OAAOoB,gBAAkBL,EAAgBM,OAAO70B,UAAUpF,OAAO25B,EAAgBM,OAAO70B,UAAUgW,OAAO3c,QAAQ,SAAW,GAC7Jo7B,EAAKrO,YAAcmO,EAAgBf,OAAOoB,eAC1CH,EAAKC,WAAaD,EAAKtO,UAAYsO,EAAKrO,YAAc,IAEtDuO,EAAMxO,UAAYoO,EAAgBf,OAAOoB,gBAAkBL,EAAgBM,OAAOj1B,SAAShF,OAAO25B,EAAgBM,OAAOj1B,SAASoW,OAAO3c,QAAQ,SAAW,GAC5Js7B,EAAMvO,YAAcmO,EAAgBf,OAAOoB,eAC3CD,EAAMD,WAAaC,EAAMxO,UAAYwO,EAAMvO,YAAc,KAIxC,gCACjB,uBAAKta,MAAO,CACXgB,SAAU,SACV+C,IAAK,OACLC,KAAM,OACN/C,OAAQ,EACRmE,gBAAiB,UAIf8X,EAAkB,uBAAKld,MAAO,CAAES,WAAY,OAAQ2e,aAAc,OAAQnf,UAAW,OAAQxO,MAAO,QACpG2sB,GACO,MAGV,uBAAKpe,MAAO,CACXgR,SAAU,IACVnf,OAAQ,WAGR,uBAAKmO,MAAO,CACX4D,UAAW,QACX0iB,cAAe,OACftd,WAAY,OACZhI,SAAU,SACVC,OAAQ,EACR8C,IAAK,OACLqB,gBAAiB,UAEjB,gBAACvE,EAAA,EAAD,CAAQjC,QAAS,IAAMwpB,EAAc,CAAEjvB,KAAMwuB,GAAsBG,6BAA8B1uB,QAAS,KACzG4G,MAAQmoB,EAAWP,aAAe,CAACxiB,gBAAiB,OAAQnG,MAAO,UAAY,CAC9EmG,gBAAkBqjB,EAAgBf,OAAOoB,eAAiB,EAAK,UAAc,UAC7E7pB,MAAO,QACPsC,WAAY,UAJd,6BAUF,gBAACynB,GAAA,EAAD,CAAgBC,UAAWhiB,GAAAA,GAC1B,gBAACuG,GAAA,EAAD,CAAO5b,KAAK,SACX,gBAAC6b,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,kBACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,cACA,gBAACvb,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcnkB,SAGzE,gBAAC8J,GAAA,EAAD,KACC,gBAACF,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,gDACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAUT,EAAgBf,OAAO0B,eAClD,gBAACzb,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcoB,WAExE,gBAAC3b,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,6EACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BP,EAAKC,WAAWzV,QAAQ,GAAtD,SAA6D,2BAA7D,eAAyEwV,EAAKtO,UAA9E,YAA2FsO,EAAKrO,YAAhG,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,UAAjB,MAED,gBAACxb,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,8EACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BL,EAAMD,WAAWzV,QAAQ,GAAvD,SAA8D,2BAA9D,eAA0E0V,EAAMxO,UAAhF,YAA6FwO,EAAMvO,YAAnG,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,UAAjB,MAGD,gBAACxb,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,sFACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BT,EAAgBf,OAAO4B,WAAWV,WAAWzV,QAAQ,GAAnF,SAA0F,2BAA1F,eAAsGsV,EAAgBf,OAAO4B,WAAWjP,UAAxI,YAAqJoO,EAAgBf,OAAO4B,WAAWhP,YAAvL,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcqB,aAIxE,gBAAC5b,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,CAAW4b,QAAS,GAAG,2HAExB,gBAAC7b,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,2CACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BT,EAAgBf,OAAO8B,4BAA4BZ,WAAWzV,QAAQ,GAApG,SAA2G,2BAA3G,eAAuHsV,EAAgBf,OAAO8B,4BAA4BnP,UAA1K,YAAuLoO,EAAgBf,OAAO8B,4BAA4BlP,YAA1O,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcuB,8BAExE,gBAAC9b,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,uDACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BT,EAAgBf,OAAO+B,mCAAmCb,WAAWzV,QAAQ,GAA3G,SAAkH,2BAAlH,eAA8HsV,EAAgBf,OAAO+B,mCAAmCpP,UAAxL,YAAqMoO,EAAgBf,OAAO+B,mCAAmCnP,YAA/P,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcwB,qCAExE,gBAAC/b,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,8CACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BT,EAAgBf,OAAOgC,4BAA4Bd,WAAWzV,QAAQ,GAApG,SAA2G,2BAA3G,eAAuHsV,EAAgBf,OAAOgC,4BAA4BrP,UAA1K,YAAuLoO,EAAgBf,OAAOgC,4BAA4BpP,YAA1O,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAc0B,+BAIxE,gBAACjc,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,CAAW4b,QAAS,GACnB,mIAGF,gBAAC7b,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,8BACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BT,EAAgBf,OAAOkC,qBAAqBhB,WAAWzV,QAAQ,GAA7F,SAAoG,2BAApG,eAAgHsV,EAAgBf,OAAOkC,qBAAqBvP,UAA5J,YAAyKoO,EAAgBf,OAAOkC,qBAAqBtP,YAArN,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAc2B,uBAExE,gBAAClc,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,kCACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BT,EAAgBf,OAAOmC,sBAAsBjB,WAAWzV,QAAQ,GAA9F,SAAqG,2BAArG,eAAiHsV,EAAgBf,OAAOmC,sBAAsBxP,UAA9J,YAA2KoO,EAAgBf,OAAOmC,sBAAsBvP,YAAxN,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAc6B,yBAExE,gBAACpc,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,0EACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BT,EAAgBf,OAAOqC,wBAAwBnB,WAAWzV,QAAQ,GAAhG,SAAuG,2BAAvG,eAAmHsV,EAAgBf,OAAOqC,wBAAwB1P,UAAlK,YAA+KoO,EAAgBf,OAAOqC,wBAAwBzP,YAA9N,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAc+B,kCAExE,gBAACtc,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,0EACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BT,EAAgBf,OAAOuC,iCAAiCrB,WAAWzV,QAAQ,GAAzG,SAAgH,2BAAhH,eAA4HsV,EAAgBf,OAAOuC,iCAAiC5P,UAApL,YAAiMoO,EAAgBf,OAAOuC,iCAAiC3P,YAAzP,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAciC,mCAExE,gBAACxc,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,oEACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BT,EAAgBf,OAAOyC,kDAAkDvB,WAAWzV,QAAQ,GAA1H,SAAiI,2BAAjI,eAA6IsV,EAAgBf,OAAOyC,kDAAkD9P,UAAtN,YAAmOoO,EAAgBf,OAAOyC,kDAAkD7P,YAA5S,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAckC,oDAIxE,gBAACzc,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,CAAW4b,QAAS,GACnB,wHAGF,gBAAC7b,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,iFACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BT,EAAgBf,OAAO0C,gDAAgDxB,WAAWzV,QAAQ,GAAxH,SAA+H,2BAA/H,eAA2IsV,EAAgBf,OAAO0C,gDAAgD/P,UAAlN,YAA+NoO,EAAgBf,OAAO0C,gDAAgD9P,YAAtS,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcoC,0DAExE,gBAAC3c,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,4BACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BT,EAAgBf,OAAO4C,gBAAgB1B,WAAWzV,QAAQ,GAAxF,SAA+F,2BAA/F,eAA2GsV,EAAgBf,OAAO4C,gBAAgBjQ,UAAlJ,YAA+JoO,EAAgBf,OAAO4C,gBAAgBhQ,YAAtM,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcsC,qBAExE,gBAAC7c,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,6DACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BT,EAAgBf,OAAO8C,2CAA2C5B,WAAWzV,QAAQ,GAAnH,SAA0H,2BAA1H,eAAsIsV,EAAgBf,OAAO8C,2CAA2CnQ,UAAxM,YAAqNoO,EAAgBf,OAAO8C,2CAA2ClQ,YAAvR,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcwC,wCAIxE,gBAAC/c,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,CAAW4b,QAAS,GACnB,mHAGF,gBAAC7b,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,+EACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BT,EAAgBf,OAAOgD,0BAA0B9B,WAAWzV,QAAQ,GAAlG,SAAyG,2BAAzG,eAAqHsV,EAAgBf,OAAOgD,0BAA0BrQ,UAAtK,YAAmLoO,EAAgBf,OAAOgD,0BAA0BpQ,YAApO,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcyC,4BAExE,gBAAChd,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,0EACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BT,EAAgBf,OAAOiD,wCAAwC/B,WAAWzV,QAAQ,GAAhH,SAAuH,2BAAvH,eAAmIsV,EAAgBf,OAAOiD,wCAAwCtQ,UAAlM,YAA+MoO,EAAgBf,OAAOiD,wCAAwCrQ,YAA9Q,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAc2C,uCAIxE,gBAACld,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,CAAW4b,QAAS,GACnB,4GAGF,gBAAC7b,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,gDACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BT,EAAgBf,OAAOmD,2BAA2BjC,WAAWzV,QAAQ,GAAnG,SAA0G,2BAA1G,eAAsHsV,EAAgBf,OAAOmD,2BAA2BxQ,UAAxK,YAAqLoO,EAAgBf,OAAOmD,2BAA2BvQ,YAAvO,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAc6C,uCAExE,gBAACpd,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,8CACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BT,EAAgBf,OAAOqD,8BAA8BnC,WAAWzV,QAAQ,GAAtG,SAA6G,2BAA7G,eAAyHsV,EAAgBf,OAAOqD,8BAA8B1Q,UAA9K,YAA2LoO,EAAgBf,OAAOqD,8BAA8BzQ,YAAhP,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAc+C,qCAExE,gBAACtd,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,iFACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BT,EAAgBf,OAAOuD,8BAA8BrC,WAAWzV,QAAQ,GAAtG,SAA6G,2BAA7G,eAAyHsV,EAAgBf,OAAOuD,8BAA8B5Q,UAA9K,YAA2LoO,EAAgBf,OAAOuD,8BAA8B3Q,YAAhP,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAciD,sCAO3E,uBAAKlrB,MAAO,CAAEkE,SAAU,QAASN,UAAW,SAC3C,yBAAG,2DAAH,KACA,yBAAG,0NAAH,MAGD,uBAAK5D,MAAO,CAAE4D,UAAW,WACxB,wDAA+B,qBAAG3a,KlHzZO,kDkHyZ8BkiC,OAAO,UAA/C,iEAAyH,2BAAxJ,gEAKF,qBAAGzjC,GAAG,qBAAqBsY,MAAO,CAAEsB,QAAS,UAS9C,CChaM,SAAS8pB,KAAgB,kDAC/B,MAAM,MAAErxB,EAAF,SAASmE,GAAalR,EAAAA,WAAiBgR,IAEvC1D,EAAkCrN,MAAO7J,EAA8CU,EAA0ByX,EAAyBC,KAC/I,MAAM4hB,QAA0BiL,GAAwBA,GAAiBtuB,EAAMuC,KAAKC,UAA5B8rB,CAAkEjlC,EAAKU,EAAOyX,EAASC,IAC/I0C,EAAS,CAAE/E,KAAM8D,GAAYQ,mBAAoBrE,QAASgkB,GAA1D,EAGK1hB,EAAwCzO,UAE7C,MAAMmwB,QAA0BiL,GAAwBA,GAAoBtuB,EAAMuC,KAAKC,UAAsCnZ,IAC7H8a,EAAS,CAAE/E,KAAM8D,GAAYQ,mBAAoBrE,QAASgkB,GAA1D,EAID,GAAIrjB,EAAMuC,KAAKG,QACd,OAAO,gBAAC,GAAD,MAER,MAAM4uB,EAAiBtxB,SAAH,UAAGA,EAAOuC,YAAV,iBAAG,EAAaC,iBAAhB,aAAG,EAAwB/B,UAKzC8nB,EAAoB,GAC1B+I,SAAAA,EAAgB3D,OAAOjtB,MAAM9Q,KAAIyG,IAChCkyB,EAAWvzB,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE1I,IAA1C,IAID,IAAI66B,EAAuB,GAC3B,UAAAxoB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8ByE,WAA9B,mBAAmChR,aAAnC,SAA0C6F,KAAIyG,IAC7CmyB,EAAcxzB,KAAK,CAAEO,MAAOc,EAAGtM,MAAOw+B,EAAWlmB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAzE,IAID,IAAI0+B,EAAiB,GACjBD,EAAcl0B,OAAS,IAC1Bm0B,EAAiBD,EAAc54B,KAAIqgB,GAClCA,EAAElmB,SAKJ,MAAM2+B,EAAyB,GAC3BF,EAAcl0B,OAAS,EAC1Bg9B,SAAAA,EAAgB3D,OAAO/iC,WAAWwL,QAAO6Z,GAAKwY,EAAej8B,SAASyjB,EAAE0Y,SAAQ/4B,KAAIyG,IACnFqyB,EAAgB1zB,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE+qB,YAA/C,IAGDkQ,SAAAA,EAAgB3D,OAAO/iC,WAAWgF,KAAIyG,IACrCqyB,EAAgB1zB,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE+qB,YAA/C,IAKF,IAAIwH,EAA4B,GAChC,UAAA5oB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8BoE,gBAA9B,mBAAwC3Q,aAAxC,SAA+C6F,KAAIyG,IAClDuyB,EAAmB5zB,KAAK,CAAEO,MAAOc,EAAGtM,MAAO2+B,EAAgBrmB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAnF,IAID,IAAI8+B,EAAsB,GACtBD,EAAmBt0B,OAAS,IAC/Bu0B,EAAsBD,EAAmBh5B,KAAIqgB,GAC5CA,EAAElmB,SAKJ,MAAM++B,EAAoB,GACtBF,EAAmBt0B,OAAS,EAC/Bg9B,SAAAA,EAAgB3D,OAAO/H,KAAKxvB,QAAO6Z,GAAK4Y,EAAoBr8B,SAASyjB,EAAEmR,cAAaxxB,KAAIyG,IACvFyyB,EAAW9zB,KAAK,CAAEO,MAAOc,EAAEiD,gBAAiBvP,MAAOsM,EAAE+rB,WAArD,IAGDkP,SAAAA,EAAgB3D,OAAO/H,KAAKh2B,KAAIyG,IAC/ByyB,EAAW9zB,KAAK,CAAEO,MAAOc,EAAEiD,gBAAiBvP,MAAOsM,EAAE+rB,WAArD,IAKF,IAAI2G,EAAuB,GAC3B,UAAA/oB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8B+D,WAA9B,mBAAmCtQ,aAAnC,SAA0C6F,KAAIyG,IAC7C0yB,EAAc/zB,KAAK,CAAEO,MAAOc,EAAGtM,MAAO++B,EAAWzmB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAzE,IAQD,MAAMi/B,EAAsB,GAC5BsI,SAAAA,EAAgB3D,OAAO1E,MAAMr5B,KAAIyG,IAChC2yB,EAAah0B,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE1I,IAA5C,IAID,IAAIu7B,EAA4B,GAChC,UAAAlpB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8B+2B,gBAA9B,mBAAwCtjC,aAAxC,SAA+C6F,KAAIyG,IAAK,MACvD6yB,EAAmBl0B,KAAK,CACvBO,MAAOc,EACPtM,MAAK,UAAEi/B,EAAa3mB,MAAK4N,GAAKA,EAAE1a,OAASc,WAApC,aAAE,EAAsCtM,OAF9C,IAOD,IAAIo/B,EAA6B,GACjC,UAAAnpB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8B62B,sBAA9B,mBAA8CpjC,aAA9C,SAAqD6F,KAAIyG,IACxD8yB,EAAoBn0B,KAAK,CAAEO,MAAOc,EAAGtM,MAAOi/B,EAAa3mB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAjF,IAKD,MAAMq/B,EAAwB,GAC9BkI,SAAAA,EAAgB3D,OAAOrxB,KAAK1M,KAAIyG,IAC3BA,EAAE1I,IAAM,MACXy7B,EAAep0B,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE1I,IAC9C,IAIF,MAAM27B,EAAyB,GAC/BgI,SAAAA,EAAgB3D,OAAOrxB,KAAK1M,KAAIyG,IAC/BizB,EAAgBt0B,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE1I,IAA/C,IAID,IAAI07B,EAA2B,GAC/B,UAAArpB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8B82B,eAA9B,mBAAuCrjC,aAAvC,SAA8C6F,KAAIyG,IAAK,MACtDgzB,EAAkBr0B,KAAK,CACtBO,MAAOc,EACPtM,MAAK,UAAEq/B,EAAe/mB,MAAK4N,GAAKA,EAAE1a,OAASc,WAAtC,aAAE,EAAwCtM,OAFhD,IAOD,IAAIw/B,EAA4B,GAChC,UAAAvpB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8B42B,qBAA9B,mBAA6CnjC,aAA7C,SAAoD6F,KAAIyG,IACvDkzB,EAAmBv0B,KAAK,CAAEO,MAAOc,EAAGtM,MAAOu/B,EAAgBjnB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAnF,IAID,MAAOy/B,EAAQC,GAAax2B,EAAAA,SAAes2B,EAAmBj1B,OAAS,EAAI,iBAAmB,YAE9F,OACC,gCACC,gBAACyS,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,YACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOy+B,EACPmB,QAASpB,EACTzD,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAa2sB,GAAAA,IAAAA,KAEb/tB,EAAU+tB,GAAAA,IAAAA,IAAoCtsB,EAC9C,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAOX,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,iBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAO6+B,EACPe,QAASjB,EACT5D,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAa2sB,GAAAA,SAAAA,KAEb/tB,EAAU+tB,GAAAA,SAAAA,IAAyCtsB,EACnD,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAOX,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,YACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOg/B,EACPY,QAASb,EACThE,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAa2sB,GAAAA,IAAAA,KAEb/tB,EAAU+tB,GAAAA,IAAAA,IAAoCtsB,EAC9C,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAMX,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,gBACA,gBAACwe,GAAD,CACCC,YAAa,CAAC,WAAY,kBAC1BC,aAAckD,EACdlW,UAAWjd,IACVozB,EAAUpzB,EAAV,KAMS,YAAVmzB,EACD,gCACC,gBAACziB,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,iBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOs/B,EACPM,QAASP,EAAe9Y,UACxBwU,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAa2sB,GAAAA,QAAAA,KAEb/tB,EAAU+tB,GAAAA,QAAAA,IAAwCtsB,EAClD,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAMX,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,kBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOm/B,EACPS,QAASX,EACTlE,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAa2sB,GAAAA,SAAAA,KAEb/tB,EAAU+tB,GAAAA,SAAAA,IAAyCtsB,EACnD,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,eAOZ,gCACC,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,uBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOw/B,EACPI,QAASL,EAAgBhZ,UACzBwU,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAa2sB,GAAAA,cAAAA,KAEb/tB,EAAU+tB,GAAAA,cAAAA,IAA8CtsB,EACxD,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAMX,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,wBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOo/B,EACPQ,QAASX,EACTlE,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAa2sB,GAAAA,eAAAA,KAEb/tB,EAAU+tB,GAAAA,eAAAA,IAA+CtsB,EACzD,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,eAkCf,C,yHCzYM,MAAMqsB,WAA4Bt+B,EAAAA,UAErClE,YAAY6W,GACRwG,MAAMxG,GADS,4BAUQ,KACvBzW,KAAKu7B,SAAS,CAAEhzB,MAAO1I,OAAO0jB,WAAY1b,OAAQhI,OAAO4oB,aAAzD,IAXe,kBAsBV,IAED,gCACI,gBAACuW,GAAD,SAtBRh/B,KAAK6Q,MAAQ,CACTtI,MAAO,EACPV,OAAQ,EAGf,CAMM2zB,uBACH37B,OAAO47B,oBAAoB,SAAUz7B,KAAK07B,iBAC7C,CAEMC,oBACH97B,OAAO4Q,iBAAiB,SAAUzQ,KAAK07B,iBAC1C,ECUOr0B,GAAgBE,GAAoD,oBAAvBA,EAAG0G,YAAYjM,KAA6BuF,EAAG86B,qBAAqBrgC,KAAO,UCAxHqF,GAAgBE,GAA4BA,EAAG8C,WAAWrI,OCkDtE,MAsBa6J,GAAmC,IACzCZ,GAtBHa,kBAAmB,CAAE5R,IAAK,oBAAqBkM,MAAO,uBACtD2F,eAAgB,CAAE7R,IAAK,iBAAkBkM,MAAO,oBAChD4F,oBAAqB,CAAE9R,IAAK,sBAAuBkM,MAAO,yBAC1D6F,YAAa,CAAE/R,IAAK,cAAekM,MAAO,gBAC1C8F,WAAY,CAAEhS,IAAK,aAAckM,MAAO,cACxC+F,WAAY,CAAEjS,IAAK,aAAckM,MAAO,YACxCgG,eAAgB,CAAElS,IAAK,iBAAkBkM,MAAO,mBAChDiG,qBAAsB,CAAEnS,IAAK,uBAAwBkM,MAAO,2BAC5DkG,UAAW,CAAEpS,IAAK,YAAakM,MAAO,mBACtCmG,SAAU,CAAErS,IAAK,WAAYkM,MAAO,kBACpC83B,SAAU,CAAEhkC,IAAK,WAAYkM,MAAO,cCjGjC,IAAKiJ,GAUAC,GCbG,SAAS,KACtB,OAAO,IAAIE,OAAO,IAA0B,6CAC9C,E,SDCYH,GAAAA,EAAAA,EAAAA,KAAAA,GAAAA,OAAAA,EAAAA,EAAAA,MAAAA,GAAAA,QAAAA,EAAAA,EAAAA,UAAAA,GAAAA,W,EAAAA,KAAAA,GAAAA,CAAAA,I,SAUAC,GAAAA,EAAAA,EAAAA,KAAAA,GAAAA,OAAAA,EAAAA,EAAAA,MAAAA,GAAAA,QAAAA,EAAAA,EAAAA,UAAAA,GAAAA,YAAAA,EAAAA,EAAAA,YAAAA,GAAAA,a,EAAAA,KAAAA,GAAAA,CAAAA,IEJZ,IAAIQ,GAAqB,KACrBC,GAAW,CAAC,EACZ9Q,GAAO,CACPo/B,QAAS,GA2Eb,SAASruB,GAAyBC,EAAyBC,GACvD,MAAM1R,EAAKgO,KASX,OARAuD,GAASvR,GAAM,CAAC,EAChBuR,GAASvR,GAAI2R,QAAU,IAAInT,SAAQ,CAACwC,EAASvC,KAZjD,IAAc8B,IAaD,CAAEP,KAAIyR,OAAMC,WAZrBJ,GAAOM,YAAYrR,GAcfgR,GAASvR,GAAIgB,QAAUA,EACvBuQ,GAASvR,GAAIvB,OAASA,CAAtB,IAGG8S,GAASvR,GAAI2R,OACvB,CC7EM,MAaMI,GAAmBxM,UDf5B9E,GAAKo/B,QCgBS,KDdTx+B,OAAM,QAKPnF,QAAQC,IAAI,sBAEZmV,GAASA,IAAU,IAAIU,GAKvBV,GAAOW,iBAAiB,WAAYC,IAChC,MAAQzR,MAAM,GAAET,EAAF,KAAMyR,EAAN,QAAYC,IAAcQ,EAM3B,MAEL,UAAAX,GAASvR,UAAT,SAAcgB,QAAQ0Q,GAK9BH,GAASvR,QAAMtC,CAAf,IAMJ4T,GAAOW,iBAAiB,gBAAiBC,IACrC,MAAQzR,MAAM,GAAET,EAAF,KAAMyR,EAAN,QAAYC,IAAcQ,EAOhChW,QAAQD,MAAM,oBAAqByV,GACnCH,GAASvR,GAAIvB,OAAOiT,GAK5BH,GAASvR,QAAMtC,CAAf,KA7CJxB,QAAQC,IAAI,2BCcnB,IAGC,aD8DSqV,GAAuCX,GAAAA,KAAwB,MC/DxE3U,QAAQC,IAAI,8BACCiW,GAAUC,EAAOA,EAAMlB,QAGpC,CAFC,MACDjV,QAAQD,MAAM,qBACd,GAGWqW,GAAgBD,IAC5B,MAAME,EAAwB,CAAC3J,EAAmB4J,KACjD,IAAKA,GAAoC,IAAtBA,EAAW7L,OAC7B,OAAQ,IAAI8L,IAEb,GAAIJ,EAAMlB,QACT,OAAQ,IAAIsB,IAEb,IAAIC,EAAY,IAAID,IAIpB,OAHAC,EAAUC,IAAIH,EAAW,GAAGhP,MAE5B6O,EAAQO,GAAUP,EAAVO,CAAiBhK,EAAW,CAAC4J,EAAW,GAAGhP,OAC5CkP,CAAP,EAOD,OAJAL,EAAM1J,QAAU,CAAC,EACjB0J,EAAMQ,cAAiBN,EAAsBlF,GAAAA,IAAAA,IAA6BgF,EAAMS,UAAUktB,OAAOjtB,OACjGV,EAAMW,mBAAqBT,EAAsBlF,GAAAA,SAAAA,IAAkCgF,EAAMS,UAAUktB,OAAO/iC,YAEnG,IAAMoV,EAAb,EASKD,GAAY7M,MAAO8M,EAAsBY,KAC9C,IACC,MAAMxS,QDiCD,SAAewS,GAIlB,OAAOzU,QAAQyU,IAAI,CACfhD,GAAgBgD,GAChB/C,GAA0B+C,KAEzB/R,MAAKgS,GACK1B,GAAuDX,GAAAA,MAAyB,CACnFoC,MACAG,QAASF,EAAQ,GACjBG,QAASH,EAAQ,GACjB2sB,QAASp/B,GAAKo/B,WAI7B,CClDoB1tB,CAAiBc,GAE9BV,EAAwB,CAAC3J,EAAmB4J,KACjD,IAAKA,GAAoC,IAAtBA,EAAW7L,OAC7B,OAAQ,IAAI8L,IAEb,GAAIQ,EACH,OAAQ,IAAIR,IAEb,IAAIC,EAAY,IAAID,IAIpB,OAHAC,EAAUC,IAAIH,EAAW,GAAGhP,MAE5B6O,EAAQO,GAAUP,EAAVO,CAAiBhK,EAAW,CAAC4J,EAAW,GAAGhP,OAC5CkP,CAAP,EASD,OANAL,EAAMQ,cAAiBN,EAAsBlF,GAAAA,IAAAA,IAA6B5M,EAAKqS,UAAUktB,OAAOjtB,OAC1FV,EAAMW,mBAAqBT,EAAsBlF,GAAAA,SAAAA,IAAkC5M,EAAKqS,UAAUktB,OAAO/iC,YAC/GoV,EAAMlB,QAAU8B,EAChBZ,EAAMoB,WAAahT,EAAKgT,WACxBpB,EAAMS,UAAYrS,EAAKqS,UAEhBT,CAIP,CAHC,MAED,OADAnW,QAAQD,MAAM,2BACPoW,CACP,GAGWqB,GAAmBnO,UAC/B,IACC,MAAM9E,QDyBkBkT,ECzBgBtB,EAAM1J,QD0BrC6I,GAA+DX,GAAAA,UAA6B,CAC/F8C,iBACAksB,QAASp/B,GAAKo/B,WC1BpB,OADAxtB,EAAMS,UAAYrS,EACX,IAAI4R,EAIX,CAHC,MAED,OADAnW,QAAQD,MAAM,kCACPoW,CACP,CDmBK,IAAmBsB,CCnBxB,EAGWf,GAAaP,GAAyB,CAAC3W,EAAuCU,EAA0ByX,EAAyBC,KAC7I,MAAMnL,EAAmB5G,OAAO8I,OAAO,CAAC,EAAGwH,EAAM1J,SAC3CvB,EAA2B,iBAAVhL,EACpB,CAACA,GACDA,EAIG2X,EAA6BF,IAAaA,EAAQzM,SAAST,OAAS,EAAKkN,EAAQnM,SAAWmM,IAAY,IAAIpN,EAMlH,OALAsN,EAAY1M,KAAKD,GAEjBuB,EAAQjN,GAAQ,CAAEU,MAAOgL,EAAQ0M,gBAAepN,MAAOqN,EAAYrN,OAEnE2L,EAAM1J,QAAUA,EACT,IAAI0J,EAAX,EAKY2B,GAAe,CAAC3B,EAAsB3W,EAAuCU,EAAgB0X,KACzG,MAAMnL,EAAmB5G,OAAO8I,OAAO,CAAC,EAAGwH,EAAM1J,SAC3CsL,EAAwB7X,GAAS,KACjCyX,EAAUpN,EAAAA,YAA0BkC,EAASjN,GAC7C0L,EAASyM,EAAQzM,SACjB8M,EAAYD,EAAgB7M,EAAOqB,QAAOC,GAAKA,GAAKuL,IAAgB,KAEpEE,EAAIN,EAAQnM,UAAY,IAAIjB,EAWlC,OAVIyN,GACHC,EAAE9M,KAAK6M,GAERvL,EAAQjN,GAAQ,CAACU,MAAO+X,EAAE/M,SAAU0M,gBAAgBpN,MAAOyN,EAAEzN,OAEtC,IAAnByN,EAAEzN,MAAMC,eACJgC,EAAQjN,GAGhB2W,EAAM1J,QAAUA,EACT,IAAI0J,EAAX,E,IC1IIyxB,I,SAAAA,GAAAA,EAAAA,EAAAA,6BAAAA,GAAAA,+BAAAA,EAAAA,EAAAA,yBAAAA,GAAAA,2BAAAA,EAAAA,EAAAA,sBAAAA,GAAAA,uB,EAAAA,KAAAA,GAAAA,CAAAA,IAgBL,MAAMnvB,GAAsB,CAC3B3F,UAAW,GAKNmxB,GAAU,CAAC9tB,EAAcsD,KAC9B,MAAM,KAAElE,GAASkE,EAEjB,OAAQlE,GACP,KAAKqyB,GAAmB1D,6BACvB,MAAO,IAAK/tB,EAAYrD,UAAW2G,EAAOjE,SAE3C,KAAKoyB,GAAmBzD,yBACxB,KAAKyD,GAAmBxD,sBACvB,MAAO,IAAKjuB,EAAYrD,UAAW,GAEpC,QACC,OAAOqD,EATT,EAaD,IAAIkuB,GAsCA,CAAC,EAEE,SAASwD,KACf,MAAM,MAAE1xB,EAAF,SAASmE,GAAalR,EAAAA,WAAiBgR,KACtCmqB,EAAYC,GAAiBp7B,EAAAA,WAAiB66B,GAASxrB,KAEvD6gB,EAAiBC,GAAkBnwB,EAAAA,UAAe,IAGlDu2B,EAAQC,GAAax2B,EAAAA,SAAe,OACpC0+B,EAAuBC,GAA4B3+B,EAAAA,SAAe,IAClE4+B,EAAwBC,GAA6B7+B,EAAAA,SAAe,IACpE8+B,EAAuBC,GAA4B/+B,EAAAA,SAAe,IAClEg/B,EAAuBC,GAA4Bj/B,EAAAA,SAAe,IAClEk/B,EAAoBC,GAAyBn/B,EAAAA,SAAe,IAC5Do/B,EAAoBC,GAAyBr/B,EAAAA,SAAe,IAC5Ds/B,EAAqBC,GAA0Bv/B,EAAAA,SAAe,IAC9Dw/B,EAAmBC,GAAwBz/B,EAAAA,SAAe,GAO3D0O,EAAqCzO,MAAO7J,EAA2CU,KAE5F,MAAMs5B,QAA0BsP,GAAqBA,GAAiB3yB,EAAMuC,KAAKC,UAAgCnZ,EAAKU,IACtHoa,EAAS,CAAE/E,KAAM8D,GAAYQ,mBAAoBrE,QAASgkB,GAA1D,EA+CD,GA5CApwB,EAAAA,WAAgB,KACfkR,EAAS,CAAE/E,KAAM8D,GAAYM,8BAU7BrX,QAAQyU,IAAI,CAToB1N,WAC/Bg7B,SAAsB9xB,GAA4B,aAAlD,EAQYmyB,GALSr7B,WACrB,MAAMnJ,QAAc4oC,GAAqB3yB,EAAMuC,KAAKC,WACpD2B,EAAS,CAAE/E,KAAM8D,GAAYK,uBAAwBlE,QAAStV,GAA9D,EAGuCykC,KACjC,KFQLvvB,IAAUA,GAAOqkB,YACjBrkB,GAAS,KACTpV,QAAQC,IAAI,uBETb,IAEC,IAEHmJ,EAAAA,WAAgB,KACf,GAA4B,GAAxBm7B,EAAWzxB,UACd,OAED,IAAI8xB,EAAMmE,EAAQjF,OAAOzD,sBAIUh3B,WAClC,IACC,MAAM9E,QAAa+7B,GAAAA,2BAAqCsE,GAL5C,EAK0DL,EAAWzxB,WAC7EvO,EAAKg8B,eACRvgC,QAAQD,MAAMwE,EAAKg8B,cACnBiE,EAAc,CAAEjvB,KAAMqyB,GAAmBxD,yBAE1CI,EAAc,CAAEjvB,KAAMqyB,GAAmBzD,2BAClC3D,GAAoBj8B,EAAK85B,MAAO95B,EAAK2K,SAAUsxB,GAA8Bj8B,EAAK64B,UAAW,qBAGpG,CAFC,MACDoH,EAAc,CAAEjvB,KAAMqyB,GAAmBxD,uBACzC,GAGF4E,EAA4B,GAG1B,CAACzE,EAAWzxB,YAEXqD,EAAMuC,KAAKG,UAAY1C,EAAMuC,KAAKC,UAAU/B,UAC/C,OAAO,gBAAC,GAAD,MAWR,IAAI0jB,EAAqB,GACrBC,EAAc,GACdC,EAAQ,GAEZ,IAAK,MAAMh7B,KAAO2W,EAAMuC,KAAKC,UAAUlM,QAClC5G,OAAOwS,UAAU9X,eAAe+X,KAAKnC,EAAMuC,KAAKC,UAAUlM,QAASjN,IACtE86B,EAAmBnvB,KAAK,CAAE,IAAO3L,EAAK,OAAU2W,EAAMuC,KAAKC,UAAUlM,QAAQjN,GAAKU,MAAO,MAASiW,EAAMuC,KAAKC,UAAUlM,QAAQjN,GAAKgL,QAItI,IAAK,MAAMhL,KAAOspC,GACbjjC,OAAOwS,UAAU9X,eAAe+X,KAAKwwB,GAAyBtpC,IACjE+6B,EAAYpvB,KAAK,CAAE,IAAO3L,EAAK,MAASspC,GAAwBtpC,GAAKkM,QAIvE4uB,EAAmBlzB,SAAQgf,IAC1BA,EAAElb,OAAO9D,SAAQgH,IAChBosB,EAAMrvB,KAAK,gBAACysB,GAAD,CAAUp4B,IAAK4mB,EAAE5mB,IAAM4O,EACjC4hB,eAAgBlY,EAChB+f,WAAY0C,EAAY/hB,MAAK1U,GAAMA,EAAGtE,KAAO4mB,EAAE5mB,MAAKkM,MACpDosB,YAAa1pB,EACb2pB,SAAU3R,EAAE5mB,IACZw4B,aAAe5R,EAAE5b,MAAMC,OAAS,EAAI2b,EAAE5b,MAAM,GAAK,OALlD,GADD,IAYD,MAAMu+B,EAAU5yB,EAAMuC,KAAKC,UAAU/B,UAgB/BmuB,EAAO,CACZkE,MAAO,CACNxS,UAAW,EACXC,YAAa,EACbsO,WAAY,GAEbkE,OAAQ,CACPzS,UAAW,EACXC,YAAa,EACbsO,WAAY,IAKRC,EAAQ,CACbgE,MAAO,CACNxS,UAAW,EACXC,YAAa,EACbsO,WAAY,GAEbkE,OAAQ,CACPzS,UAAW,EACXC,YAAa,EACbsO,WAAY,IAqSd,OAhSI+D,EAAQjF,OAAOoB,eAAe+D,MAAQ,IAEzClE,EAAKkE,MAAMxS,UAAYsS,EAAQjF,OAAOoB,eAAe+D,OAASF,EAAQ5D,OAAO70B,UAAU24B,MAAM/9B,OAAO69B,EAAQ5D,OAAO70B,UAAU24B,MAAM3iB,OAAO3c,QAAQ,SAAW,GAC7Jo7B,EAAKkE,MAAMvS,YAAcqS,EAAQjF,OAAOoB,eAAe+D,MACvDlE,EAAKkE,MAAMjE,WAAaD,EAAKkE,MAAMxS,UAAYsO,EAAKkE,MAAMvS,YAAc,IAExEuO,EAAMgE,MAAMxS,UAAYsS,EAAQjF,OAAOoB,eAAe+D,OAASF,EAAQ5D,OAAOj1B,SAAS+4B,MAAM/9B,OAAO69B,EAAQ5D,OAAOj1B,SAAS+4B,MAAM3iB,OAAO3c,QAAQ,SAAW,GAC5Js7B,EAAMgE,MAAMvS,YAAcqS,EAAQjF,OAAOoB,eAAe+D,MACxDhE,EAAMgE,MAAMjE,WAAaC,EAAMgE,MAAMxS,UAAYwO,EAAMgE,MAAMvS,YAAc,KAGxEqS,EAAQjF,OAAOoB,eAAegE,OAAS,IAE1CnE,EAAKmE,OAAOzS,UAAYsS,EAAQjF,OAAOoB,eAAegE,QAAUH,EAAQ5D,OAAO70B,UAAU44B,OAAOh+B,OAAO69B,EAAQ5D,OAAO70B,UAAU44B,OAAO5iB,OAAO3c,QAAQ,SAAW,GACjKo7B,EAAKmE,OAAOxS,YAAcqS,EAAQjF,OAAOoB,eAAegE,OACxDnE,EAAKmE,OAAOlE,WAAaD,EAAKmE,OAAOzS,UAAYsO,EAAKmE,OAAOxS,YAAc,IAE3EuO,EAAMiE,OAAOzS,UAAYsS,EAAQjF,OAAOoB,eAAegE,QAAUH,EAAQ5D,OAAOj1B,SAASg5B,OAAOh+B,OAAO69B,EAAQ5D,OAAOj1B,SAASg5B,OAAO5iB,OAAO3c,QAAQ,SAAW,GAChKs7B,EAAMiE,OAAOxS,YAAcqS,EAAQjF,OAAOoB,eAAegE,OACzDjE,EAAMiE,OAAOlE,WAAaC,EAAMiE,OAAOzS,UAAYwO,EAAMiE,OAAOxS,YAAc,KAG7D,gCACjB,uBAAKta,MAAO,CACXgB,SAAU,SACV+C,IAAK,OACLC,KAAM,OACN/C,OAAQ,EACRmE,gBAAiB,UAIf8X,EAAkB,uBAAKld,MAAO,CAAES,WAAY,OAAQ2e,aAAc,OAAQnf,UAAW,OAAQxO,MAAO,QACpG2sB,GACO,MAGV,uBAAKpe,MAAO,CACXgR,SAAU,IACVnf,OAAQ,WAGR,uBAAKmO,MAAO,CACX4D,UAAW,QACX0iB,cAAe,OACftd,WAAY,OACZhI,SAAU,SACVC,OAAQ,EACR8C,IAAK,OACLqB,gBAAiB,UAEjB,gBAACvE,EAAA,EAAD,CAAQjC,QAAS,IAAMwpB,EAAc,CAAEjvB,KAAMqyB,GAAmB1D,6BAA8B1uB,QAAS,IACtG4G,MAAO,CACNoF,gBAAmBunB,EAAQjF,OAAOoB,eAAe+D,MAAQ,GAAKF,EAAQjF,OAAOoB,eAAegE,OAAS,EAAM,UAAc,UACzH7tB,MAAO,QACPsC,WAAY,UAJd,6BAUD,gBAACynB,GAAA,EAAD,CAAgBC,UAAWhiB,GAAAA,GAC1B,gBAACuG,GAAA,EAAD,CAAO5b,KAAK,SACX,gBAAC6b,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,kBACA,gBAACA,GAAA,EAAD,CAAW4b,QAAS,EAAGL,MAAM,UAA7B,cACA,gBAACvb,GAAA,EAAD,CAAW4b,QAAS,EAAGL,MAAM,UAAUjB,GAAcnkB,MAArD,MAGD,gBAAC4J,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,UACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,SACA,gBAACvb,GAAA,EAAD,CAAWub,MAAM,UAAjB,UACA,gBAACvb,GAAA,EAAD,CAAWub,MAAM,UAAjB,SACA,gBAACvb,GAAA,EAAD,CAAWub,MAAM,UAAjB,YAIF,gBAACtb,GAAA,EAAD,KACC,gBAACF,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,qCACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAUyD,EAAQjF,OAAOoB,eAAe+D,OACzD,gBAAClf,GAAA,EAAD,CAAWub,MAAM,UAAUyD,EAAQjF,OAAOoB,eAAegE,QACzD,gBAACnf,GAAA,EAAD,CAAWub,MAAM,UAAUjB,GAAc8E,eACzC,gBAACpf,GAAA,EAAD,CAAWub,MAAM,UAAUjB,GAAc+E,iBAG1C,gBAACtf,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,yCACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BP,EAAKkE,MAAMjE,WAAWzV,QAAQ,GAA5D,SAAmE,2BAAnE,eAA+EwV,EAAKkE,MAAMxS,UAA1F,YAAuGsO,EAAKkE,MAAMvS,YAAlH,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BP,EAAKmE,OAAOlE,WAAWzV,QAAQ,GAA7D,SAAoE,2BAApE,eAAgFwV,EAAKmE,OAAOzS,UAA5F,YAAyGsO,EAAKmE,OAAOxS,YAArH,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,UAAjB,KACA,gBAACvb,GAAA,EAAD,CAAWub,MAAM,UAAjB,MAGD,gBAACxb,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,0CACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BL,EAAMgE,MAAMjE,WAAWzV,QAAQ,GAA7D,SAAoE,2BAApE,eAAgF0V,EAAMgE,MAAMxS,UAA5F,YAAyGwO,EAAMgE,MAAMvS,YAArH,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BL,EAAMiE,OAAOlE,WAAWzV,QAAQ,GAA9D,SAAqE,2BAArE,eAAiF0V,EAAMiE,OAAOzS,UAA9F,YAA2GwO,EAAMiE,OAAOxS,YAAxH,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,UAAjB,KACA,gBAACvb,GAAA,EAAD,CAAWub,MAAM,UAAjB,MAGD,gBAACxb,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,gDACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8ByD,EAAQjF,OAAOuF,2BAA2BJ,MAAMjE,WAAWzV,QAAQ,GAAjG,SAAwG,2BAAxG,eAAoHwZ,EAAQjF,OAAOuF,2BAA2BJ,MAAMxS,UAApK,YAAiLsS,EAAQjF,OAAOuF,2BAA2BJ,MAAMvS,YAAjO,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8ByD,EAAQjF,OAAOuF,2BAA2BH,OAAOlE,WAAWzV,QAAQ,GAAlG,SAAyG,2BAAzG,eAAqHwZ,EAAQjF,OAAOuF,2BAA2BH,OAAOzS,UAAtK,YAAmLsS,EAAQjF,OAAOuF,2BAA2BH,OAAOxS,YAApO,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAciF,gCACvE,gBAACvf,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAckF,kCAIxE,gBAACzf,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,CAAW4b,QAAS,GAAG,uCAGxB,gBAAC7b,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,qFACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8ByD,EAAQjF,OAAO0F,iBAAiBP,MAAMjE,WAAWzV,QAAQ,GAAvF,SAA8F,2BAA9F,eAA0GwZ,EAAQjF,OAAO0F,iBAAiBP,MAAMxS,UAAhJ,YAA6JsS,EAAQjF,OAAO0F,iBAAiBP,MAAMvS,YAAnM,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8ByD,EAAQjF,OAAO0F,iBAAiBN,OAAOlE,WAAWzV,QAAQ,GAAxF,SAA+F,2BAA/F,eAA2GwZ,EAAQjF,OAAO0F,iBAAiBN,OAAOzS,UAAlJ,YAA+JsS,EAAQjF,OAAO0F,iBAAiBN,OAAOxS,YAAtM,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcoF,6BACvE,gBAAC1f,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcqF,+BAWxE,gBAAC5f,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,iCACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8ByD,EAAQjF,OAAO6F,aAAaV,MAAMjE,WAAWzV,QAAQ,GAAnF,SAA0F,2BAA1F,eAAsGwZ,EAAQjF,OAAO6F,aAAaV,MAAMxS,UAAxI,YAAqJsS,EAAQjF,OAAO6F,aAAaV,MAAMvS,YAAvL,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8ByD,EAAQjF,OAAO6F,aAAaT,OAAOlE,WAAWzV,QAAQ,GAApF,SAA2F,2BAA3F,eAAuGwZ,EAAQjF,OAAO6F,aAAaT,OAAOzS,UAA1I,YAAuJsS,EAAQjF,OAAO6F,aAAaT,OAAOxS,YAA1L,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcuF,2BACvE,gBAAC7f,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcwF,6BAoBxE,gBAAC/f,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,4CACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8ByD,EAAQjF,OAAOgG,eAAeb,MAAMjE,WAAWzV,QAAQ,GAArF,SAA4F,2BAA5F,eAAwGwZ,EAAQjF,OAAOgG,eAAeb,MAAMxS,UAA5I,YAAyJsS,EAAQjF,OAAOgG,eAAeb,MAAMvS,YAA7L,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8ByD,EAAQjF,OAAOgG,eAAeZ,OAAOlE,WAAWzV,QAAQ,GAAtF,SAA6F,2BAA7F,eAAyGwZ,EAAQjF,OAAOgG,eAAeZ,OAAOzS,UAA9I,YAA2JsS,EAAQjF,OAAOgG,eAAeZ,OAAOxS,YAAhM,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAc0F,qBACvE,gBAAChgB,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAc2F,uBAGxE,gBAAClgB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,4DACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,KACA,gBAACvb,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8ByD,EAAQjF,OAAOmG,6BAA6Bf,OAAOlE,WAAWzV,QAAQ,GAApG,SAA2G,2BAA3G,eAAuHwZ,EAAQjF,OAAOmG,6BAA6Bf,OAAOzS,UAA1K,YAAuLsS,EAAQjF,OAAOmG,6BAA6Bf,OAAOxS,YAA1O,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,UAAjB,KACA,gBAACvb,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAc6F,qCAYxE,gBAACpgB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,8BACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8ByD,EAAQjF,OAAOqG,eAAelB,MAAMjE,WAAWzV,QAAQ,GAArF,SAA4F,2BAA5F,eAAwGwZ,EAAQjF,OAAOqG,eAAelB,MAAMxS,UAA5I,YAAyJsS,EAAQjF,OAAOqG,eAAelB,MAAMvS,YAA7L,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8ByD,EAAQjF,OAAOqG,eAAejB,OAAOlE,WAAWzV,QAAQ,GAAtF,SAA6F,2BAA7F,eAAyGwZ,EAAQjF,OAAOqG,eAAejB,OAAOzS,UAA9I,YAA2JsS,EAAQjF,OAAOqG,eAAejB,OAAOxS,YAAhM,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAc+F,0BACvE,gBAACrgB,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcgG,4BAExE,gBAACvgB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,0BACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8ByD,EAAQjF,OAAOwG,YAAYrB,MAAMjE,WAAWzV,QAAQ,GAAlF,SAAyF,2BAAzF,eAAqGwZ,EAAQjF,OAAOwG,YAAYrB,MAAMxS,UAAtI,YAAmJsS,EAAQjF,OAAOwG,YAAYrB,MAAMvS,YAApL,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8ByD,EAAQjF,OAAOwG,YAAYpB,OAAOlE,WAAWzV,QAAQ,GAAnF,SAA0F,2BAA1F,eAAsGwZ,EAAQjF,OAAOwG,YAAYpB,OAAOzS,UAAxI,YAAqJsS,EAAQjF,OAAOwG,YAAYpB,OAAOxS,YAAvL,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAckG,sBACvE,gBAACxgB,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcmG,wBAExE,gBAAC1gB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,0BACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8ByD,EAAQjF,OAAO2G,YAAYxB,MAAMjE,WAAWzV,QAAQ,GAAlF,SAAyF,2BAAzF,eAAqGwZ,EAAQjF,OAAO2G,YAAYxB,MAAMxS,UAAtI,YAAmJsS,EAAQjF,OAAO2G,YAAYxB,MAAMvS,YAApL,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8ByD,EAAQjF,OAAO2G,YAAYvB,OAAOlE,WAAWzV,QAAQ,GAAnF,SAA0F,2BAA1F,eAAsGwZ,EAAQjF,OAAO2G,YAAYvB,OAAOzS,UAAxI,YAAqJsS,EAAQjF,OAAO2G,YAAYvB,OAAOxS,YAAvL,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcqG,sBACvE,gBAAC3gB,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcsG,wBAGxE,gBAAC7gB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,kCACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8ByD,EAAQjF,OAAO8G,gBAAgB3B,MAAMjE,WAAWzV,QAAQ,GAAtF,SAA6F,2BAA7F,eAAyGwZ,EAAQjF,OAAO8G,gBAAgB3B,MAAMxS,UAA9I,YAA2JsS,EAAQjF,OAAO8G,gBAAgB3B,MAAMvS,YAAhM,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8ByD,EAAQjF,OAAO8G,gBAAgB1B,OAAOlE,WAAWzV,QAAQ,GAAvF,SAA8F,2BAA9F,eAA0GwZ,EAAQjF,OAAO8G,gBAAgB1B,OAAOzS,UAAhJ,YAA6JsS,EAAQjF,OAAO8G,gBAAgB1B,OAAOxS,YAAnM,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcwG,sBACvE,gBAAC9gB,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcyG,wBAExE,gBAAChhB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,kCACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8ByD,EAAQjF,OAAOiH,gBAAgB9B,MAAMjE,WAAWzV,QAAQ,GAAtF,SAA6F,2BAA7F,eAAyGwZ,EAAQjF,OAAOiH,gBAAgB9B,MAAMxS,UAA9I,YAA2JsS,EAAQjF,OAAOiH,gBAAgB9B,MAAMvS,YAAhM,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8ByD,EAAQjF,OAAOiH,gBAAgB7B,OAAOlE,WAAWzV,QAAQ,GAAvF,SAA8F,2BAA9F,eAA0GwZ,EAAQjF,OAAOiH,gBAAgB7B,OAAOzS,UAAhJ,YAA6JsS,EAAQjF,OAAOiH,gBAAgB7B,OAAOxS,YAAnM,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAc2G,sBACvE,gBAACjhB,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAc4G,wBAGxE,gBAACnhB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,CAAW4b,QAAS,GAApB,IAAwB,mLAazB,gBAAC7b,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,CAAW4b,QAAS,GAAG,+CAGxB,gBAAC7b,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,oFACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8ByD,EAAQjF,OAAOoH,oBAAoBjC,MAAMjE,WAAWzV,QAAQ,GAA1F,SAAiG,2BAAjG,eAA6GwZ,EAAQjF,OAAOoH,oBAAoBjC,MAAMxS,UAAtJ,YAAmKsS,EAAQjF,OAAOoH,oBAAoBjC,MAAMvS,YAA5M,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8ByD,EAAQjF,OAAOoH,oBAAoBhC,OAAOlE,WAAWzV,QAAQ,GAA3F,SAAkG,2BAAlG,eAA8GwZ,EAAQjF,OAAOoH,oBAAoBhC,OAAOzS,UAAxJ,YAAqKsS,EAAQjF,OAAOoH,oBAAoBhC,OAAOxS,YAA/M,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAc8G,2BACvE,gBAACphB,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAc+G,6BAGxE,gBAACthB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,4DACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8ByD,EAAQjF,OAAOuH,eAAepC,MAAMjE,WAAWzV,QAAQ,GAArF,SAA4F,2BAA5F,eAAwGwZ,EAAQjF,OAAOuH,eAAepC,MAAMxS,UAA5I,YAAyJsS,EAAQjF,OAAOuH,eAAepC,MAAMvS,YAA7L,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8ByD,EAAQjF,OAAOuH,eAAenC,OAAOlE,WAAWzV,QAAQ,GAAtF,SAA6F,2BAA7F,eAAyGwZ,EAAQjF,OAAOuH,eAAenC,OAAOzS,UAA9I,YAA2JsS,EAAQjF,OAAOuH,eAAenC,OAAOxS,YAAhM,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAciH,uBACvE,gBAACvhB,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAckH,yBAGxE,gBAACzhB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,CAAW4b,QAAS,GAAG,gDAGxB,gBAAC7b,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,gEACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,KACA,gBAACvb,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8ByD,EAAQjF,OAAO0H,eAAetC,OAAOlE,WAAWzV,QAAQ,GAAtF,SAA6F,2BAA7F,eAAyGwZ,EAAQjF,OAAO0H,eAAetC,OAAOzS,UAA9I,YAA2JsS,EAAQjF,OAAO0H,eAAetC,OAAOxS,YAAhM,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,UAAjB,KACA,gBAACvb,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcoH,0BAO3E,uBAAKrvB,MAAO,CAAEkE,SAAU,QAASN,UAAW,SAC3C,yBAAG,2DAAH,MAGD,uBAAK5D,MAAO,CAAEkE,SAAU,QAASN,UAAW,SAC3C,yBAAG,0NAAH,MAGD,uBAAK5D,MAAO,CAAE4D,UAAW,SACxB,wDAA+B,qBAAG3a,K5HzgBM,iD4HygB8BkiC,OAAO,UAA9C,oDAA/B,OACK,qBAAGliC,K5HzgBiC,kD4HygBIkiC,OAAO,UAA/C,qDADL,gFAKF,qBAAGzjC,GAAG,qBAAqBsY,MAAO,CAAEsB,QAAS,UAQ9C,CCjhBM,SAASguB,KAAa,8CAC5B,MAAM,MAAEv1B,EAAF,SAASmE,GAAalR,EAAAA,WAAiBgR,IAEvC1D,EAA+BrN,MAAO7J,EAA2CU,EAA0ByX,EAAyBC,KACzI,MAAM4hB,QAA0BsP,GAAqBA,GAAc3yB,EAAMuC,KAAKC,UAAzBmwB,CAAyDtpC,EAAKU,EAAOyX,EAASC,IACnI0C,EAAS,CAAE/E,KAAM8D,GAAYQ,mBAAoBrE,QAASgkB,GAA1D,EAGK1hB,EAAqCzO,UAE1C,MAAMmwB,QAA0BsP,GAAqBA,GAAiB3yB,EAAMuC,KAAKC,UAAgCnZ,IACjH8a,EAAS,CAAE/E,KAAM8D,GAAYQ,mBAAoBrE,QAASgkB,GAA1D,EAID,GAAIrjB,EAAMuC,KAAKG,QACd,OAAO,gBAAC,GAAD,MAER,MAAM4uB,EAAiBtxB,EAAMuC,KAAKC,UAAU/B,UAGtC8nB,EAAoB,GAC1B+I,SAAAA,EAAgB3D,OAAOjtB,MAAM9Q,KAAIyG,IAChCkyB,EAAWvzB,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE1I,IAA1C,IAID,IAAI66B,EAAuB,GAC3B,UAAAxoB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8ByE,WAA9B,mBAAmChR,aAAnC,SAA0C6F,KAAIyG,IAC7CmyB,EAAcxzB,KAAK,CAAEO,MAAOc,EAAGtM,MAAOw+B,EAAWlmB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAzE,IAID,IAAI0+B,EAAiB,GACjBD,EAAcl0B,OAAS,IAC1Bm0B,EAAiBD,EAAc54B,KAAIqgB,GAClCA,EAAElmB,SAKJ,MAAM2+B,EAAyB,GAC3BF,EAAcl0B,OAAS,EAC1Bg9B,SAAAA,EAAgB3D,OAAO/iC,WAAWwL,QAAO6Z,GAAKwY,EAAej8B,SAASyjB,EAAE0Y,SAAQ/4B,KAAIyG,IACnFqyB,EAAgB1zB,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE+qB,YAA/C,IAGDkQ,SAAAA,EAAgB3D,OAAO/iC,WAAWgF,KAAIyG,IACrCqyB,EAAgB1zB,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE+qB,YAA/C,IAKF,IAAIwH,EAA4B,GAChC,UAAA5oB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8BoE,gBAA9B,mBAAwC3Q,aAAxC,SAA+C6F,KAAIyG,IAClDuyB,EAAmB5zB,KAAK,CAAEO,MAAOc,EAAGtM,MAAO2+B,EAAgBrmB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAnF,IAID,IAAI8+B,EAAsB,GACtBD,EAAmBt0B,OAAS,IAC/Bu0B,EAAsBD,EAAmBh5B,KAAIqgB,GAC5CA,EAAElmB,SAKJ,MAAM++B,EAAoB,GACtBF,EAAmBt0B,OAAS,EAC/Bg9B,SAAAA,EAAgB3D,OAAO/H,KAAKxvB,QAAO6Z,GAAK4Y,EAAoBr8B,SAASyjB,EAAEmR,cAAaxxB,KAAIyG,IACvFyyB,EAAW9zB,KAAK,CAAEO,MAAOc,EAAEiD,gBAAiBvP,MAAOsM,EAAE+rB,WAArD,IAGDkP,SAAAA,EAAgB3D,OAAO/H,KAAKh2B,KAAIyG,IAC/ByyB,EAAW9zB,KAAK,CAAEO,MAAOc,EAAEiD,gBAAiBvP,MAAOsM,EAAE+rB,WAArD,IAKF,IAAI2G,EAAuB,GAC3B,UAAA/oB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8B+D,WAA9B,mBAAmCtQ,aAAnC,SAA0C6F,KAAIyG,IAC7C0yB,EAAc/zB,KAAK,CAAEO,MAAOc,EAAGtM,MAAO++B,EAAWzmB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAzE,IAQD,MAAMi/B,EAAsB,GAC5BsI,SAAAA,EAAgB3D,OAAO1E,MAAMr5B,KAAIyG,IAChC2yB,EAAah0B,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE1I,IAA5C,IAID,IAAIu7B,EAA4B,GAChC,UAAAlpB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8B+2B,gBAA9B,mBAAwCtjC,aAAxC,SAA+C6F,KAAIyG,IAAK,MACvD6yB,EAAmBl0B,KAAK,CACvBO,MAAOc,EACPtM,MAAK,UAAEi/B,EAAa3mB,MAAK4N,GAAKA,EAAE1a,OAASc,WAApC,aAAE,EAAsCtM,OAF9C,IAOD,IAAIo/B,EAA6B,GACjC,UAAAnpB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8BmF,iBAA9B,mBAAyC1R,aAAzC,SAAgD6F,KAAIyG,IACnD8yB,EAAoBn0B,KAAK,CAAEO,MAAOc,EAAGtM,MAAOi/B,EAAa3mB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAjF,IAKD,MAAMq/B,EAAwB,GAC9BkI,SAAAA,EAAgB3D,OAAOrxB,KAAK1M,KAAIyG,IAC3BA,EAAE1I,IAAM,MACXy7B,EAAep0B,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE1I,IAC9C,IAIF,MAAM27B,EAAyB,GAC/BgI,SAAAA,EAAgB3D,OAAOrxB,KAAK1M,KAAIyG,IAC/BizB,EAAgBt0B,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE1I,IAA/C,IAID,IAAI07B,EAA2B,GAC/B,UAAArpB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8BgE,YAA9B,mBAAoCvQ,aAApC,SAA2C6F,KAAIyG,IAAK,MACnDgzB,EAAkBr0B,KAAK,CACtBO,MAAOc,EACPtM,MAAK,UAAEq/B,EAAe/mB,MAAK4N,GAAKA,EAAE1a,OAASc,WAAtC,aAAE,EAAwCtM,OAFhD,IAOD,IAAIw/B,EAA4B,GAChC,UAAAvpB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8BoF,gBAA9B,mBAAwC3R,aAAxC,SAA+C6F,KAAIyG,IAClDkzB,EAAmBv0B,KAAK,CAAEO,MAAOc,EAAGtM,MAAOu/B,EAAgBjnB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAnF,IAID,MAAOy/B,EAAQC,GAAax2B,EAAAA,SAAes2B,EAAmBj1B,OAAS,EAAI,iBAAmB,YAE9F,OACC,gCACC,gBAACyS,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,YACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOy+B,EACPmB,QAASpB,EACTzD,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAagxB,GAAAA,IAAAA,KAEbpyB,EAAUoyB,GAAAA,IAAAA,IAAiC3wB,EAC3C,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAOX,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,iBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAO6+B,EACPe,QAASjB,EACT5D,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAagxB,GAAAA,SAAAA,KAEbpyB,EAAUoyB,GAAAA,SAAAA,IAAsC3wB,EAChD,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAOX,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,YACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOg/B,EACPY,QAASb,EACThE,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAagxB,GAAAA,IAAAA,KAEbpyB,EAAUoyB,GAAAA,IAAAA,IAAiC3wB,EAC3C,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAMX,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,gBACA,gBAACwe,GAAD,CACCC,YAAa,CAAC,WAAY,kBAC1BC,aAAckD,EACdlW,UAAWjd,IACVozB,EAAUpzB,EAAV,KAMS,YAAVmzB,EACD,gCACC,gBAACziB,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,iBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOs/B,EACPM,QAASP,EAAe9Y,UACxBwU,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAagxB,GAAAA,KAAAA,KAEbpyB,EAAUoyB,GAAAA,KAAAA,IAAkC3wB,EAC5C,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAMX,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,kBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOm/B,EACPS,QAASX,EACTlE,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAagxB,GAAAA,SAAAA,KAEbpyB,EAAUoyB,GAAAA,SAAAA,IAAsC3wB,EAChD,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,eAOZ,gCACC,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,uBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOw/B,EACPI,QAASL,EAAgBhZ,UACzBwU,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAagxB,GAAAA,SAAAA,KAEbpyB,EAAUoyB,GAAAA,SAAAA,IAAsC3wB,EAChD,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAMX,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,wBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOo/B,EACPQ,QAASX,EACTlE,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAagxB,GAAAA,UAAAA,KAEbpyB,EAAUoyB,GAAAA,UAAAA,IAAuC3wB,EACjD,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,eAkCf,C,yHCvYM,MAAMswB,WAAyBviC,EAAAA,UAElClE,YAAY6W,GACRwG,MAAMxG,GADS,4BAUQ,KACvBzW,KAAKu7B,SAAS,CAAEhzB,MAAO1I,OAAO0jB,WAAY1b,OAAQhI,OAAO4oB,aAAzD,IAXe,kBAsBV,IAED,gCACI,gBAAC8Z,GAAD,SAtBRviC,KAAK6Q,MAAQ,CACTtI,MAAO,EACPV,OAAQ,EAGf,CAMM2zB,uBACH37B,OAAO47B,oBAAoB,SAAUz7B,KAAK07B,iBAC7C,CAEMC,oBACH97B,OAAO4Q,iBAAiB,SAAUzQ,KAAK07B,iBAC1C,ECUOr0B,GAAgBE,GAA4BA,EAAG8C,WAAWrI,OCyCtE,MAca6J,GAAmC,IAC5CZ,GAbH8yB,cAAe,CAAE7jC,IAAK,gBAAiBkM,MAAO,kBAC9C43B,eAAgB,CAAE9jC,IAAK,iBAAkBkM,MAAO,mBAChD63B,QAAS,CAAE/jC,IAAK,UAAWkM,MAAO,YAClC83B,SAAU,CAAEhkC,IAAK,WAAYkM,MAAO,aACpC+3B,SAAU,CAAEjkC,IAAK,WAAYkM,MAAO,sBACpC6F,YAAa,CAAE/R,IAAK,cAAekM,MAAO,gBAC1C8F,WAAY,CAAEhS,IAAK,aAAckM,MAAO,cACxC+F,WAAY,CAAEjS,IAAK,aAAckM,MAAO,YACxCg4B,qBAAsB,CAAElkC,IAAK,uBAAwBkM,MAAO,yBAC5D2F,eAAgB,CAAE7R,IAAK,iBAAkBkM,MAAO,qBCxF1C,IAAKiJ,GAUAC,GCbG,SAAS,KACtB,OAAO,IAAIE,OAAO,IAA0B,6CAC9C,E,SDCYH,GAAAA,EAAAA,EAAAA,KAAAA,GAAAA,OAAAA,EAAAA,EAAAA,MAAAA,GAAAA,QAAAA,EAAAA,EAAAA,UAAAA,GAAAA,W,EAAAA,KAAAA,GAAAA,CAAAA,I,SAUAC,GAAAA,EAAAA,EAAAA,KAAAA,GAAAA,OAAAA,EAAAA,EAAAA,MAAAA,GAAAA,QAAAA,EAAAA,EAAAA,UAAAA,GAAAA,YAAAA,EAAAA,EAAAA,YAAAA,GAAAA,a,EAAAA,KAAAA,GAAAA,CAAAA,IEJZ,IAAIQ,GAAqB,KACrBC,GAAW,CAAC,EACZ9Q,GAAO,CACPo/B,QAAS,GA2Eb,SAASruB,GAAyBC,EAAyBC,GACvD,MAAM1R,EAAKgO,KASX,OARAuD,GAASvR,GAAM,CAAC,EAChBuR,GAASvR,GAAI2R,QAAU,IAAInT,SAAQ,CAACwC,EAASvC,KAZjD,IAAc8B,IAaD,CAAEP,KAAIyR,OAAMC,WAZrBJ,GAAOM,YAAYrR,GAcfgR,GAASvR,GAAIgB,QAAUA,EACvBuQ,GAASvR,GAAIvB,OAASA,CAAtB,IAGG8S,GAASvR,GAAI2R,OACvB,CC5EM,MAaMm2B,GAAqBviC,UDhB9B9E,GAAKo/B,QCiBS,KDfTx+B,OAAM,QAKPnF,QAAQC,IAAI,sBAEZmV,GAASA,IAAU,IAAIU,GAKvBV,GAAOW,iBAAiB,WAAYC,IAChC,MAAQzR,MAAM,GAAET,EAAF,KAAMyR,EAAN,QAAYC,IAAcQ,EAM3B,MAEL,UAAAX,GAASvR,UAAT,SAAcgB,QAAQ0Q,GAK9BH,GAASvR,QAAMtC,CAAf,IAMJ4T,GAAOW,iBAAiB,gBAAiBC,IACrC,MAAQzR,MAAM,GAAET,EAAF,KAAMyR,EAAN,QAAYC,IAAcQ,EAOhChW,QAAQD,MAAM,oBAAqByV,GACnCH,GAASvR,GAAIvB,OAAOiT,GAK5BH,GAASvR,QAAMtC,CAAf,KA7CJxB,QAAQC,IAAI,2BCenB,IAGC,aD6DSqV,GAAuCX,GAAAA,KAAwB,MC9DxE3U,QAAQC,IAAI,8BACCiW,GAAUC,EAAOA,EAAMlB,QAGpC,CAFC,MACDjV,QAAQD,MAAM,qBACd,GAGWqW,GAAgBD,IAC5B,MAAME,EAAwB,CAAC3J,EAAmB4J,KACjD,IAAKA,GAAoC,IAAtBA,EAAW7L,OAC7B,OAAQ,IAAI8L,IAEb,GAAIJ,EAAMlB,QACT,OAAQ,IAAIsB,IAEb,IAAIC,EAAY,IAAID,IAIpB,OAHAC,EAAUC,IAAIH,EAAW,GAAGhP,MAE5B6O,EAAQO,GAAUP,EAAVO,CAAiBhK,EAAW,CAAC4J,EAAW,GAAGhP,OAC5CkP,CAAP,EAOD,OAJAL,EAAM1J,QAAU,CAAC,EACjB0J,EAAMQ,cAAiBN,EAAsBlF,GAAAA,IAAAA,IAA6BgF,EAAMS,UAAUktB,OAAOjtB,OACjGV,EAAMW,mBAAqBT,EAAsBlF,GAAAA,SAAAA,IAAkCgF,EAAMS,UAAUktB,OAAO/iC,YAEnG,IAAMoV,EAAb,EASKD,GAAY7M,MAAO8M,EAAwBY,KAChD,IACC,MAAMxS,QDgCD,SAAewS,GAGlB,OAAOzU,QAAQyU,IAAI,CACf5C,GAAkB4C,GAClB3C,GAA4B2C,KAE3B/R,MAAKgS,GACK1B,GAAuDX,GAAAA,MAAyB,CACnFoC,MACAG,QAASF,EAAQ,GACjBG,QAASH,EAAQ,GACjB2sB,QAASp/B,GAAKo/B,WAI7B,CChDoB1tB,CAAiBc,GAE9BV,EAAwB,CAAC3J,EAAmB4J,KACjD,IAAKA,GAAoC,IAAtBA,EAAW7L,OAC7B,OAAQ,IAAI8L,IAEb,GAAIQ,EACH,OAAQ,IAAIR,IAEb,IAAIC,EAAY,IAAID,IAIpB,OAHAC,EAAUC,IAAIH,EAAW,GAAGhP,MAE5B6O,EAAQO,GAAUP,EAAVO,CAAiBhK,EAAW,CAAC4J,EAAW,GAAGhP,OAC5CkP,CAAP,EASD,OANAL,EAAMQ,cAAiBN,EAAsBlF,GAAAA,IAAAA,IAA6B5M,EAAKqS,UAAUktB,OAAOjtB,OAC1FV,EAAMW,mBAAqBT,EAAsBlF,GAAAA,SAAAA,IAAkC5M,EAAKqS,UAAUktB,OAAO/iC,YAC/GoV,EAAMlB,QAAU8B,EAChBZ,EAAMoB,WAAahT,EAAKgT,WACxBpB,EAAMS,UAAYrS,EAAKqS,UAEhBT,CAIP,CAHC,MAED,OADAnW,QAAQD,MAAM,2BACPoW,CACP,GAGWqB,GAAmBnO,UAC/B,IACC,MAAM9E,QDuBkBkT,ECvBgBtB,EAAM1J,QDwBrC6I,GAA+DX,GAAAA,UAA6B,CAC/F8C,iBACAksB,QAASp/B,GAAKo/B,WCxBpB,OADAxtB,EAAMS,UAAYrS,EACX,IAAI4R,EAIX,CAHC,MAED,OADAnW,QAAQD,MAAM,kCACPoW,CACP,CDiBK,IAAmBsB,CCjBxB,EAGWf,GAAaP,GAA2B,CAAC3W,EAAuCU,EAA0ByX,EAAyBC,KAC/I,MAAMnL,EAAmB5G,OAAO8I,OAAO,CAAC,EAAGwH,EAAM1J,SAC3CvB,EAA2B,iBAAVhL,EACpB,CAACA,GACDA,EAIG2X,EAA6BF,IAAaA,EAAQzM,SAAST,OAAS,EAAKkN,EAAQnM,SAAWmM,IAAY,IAAIpN,EAOlH,OANAsN,EAAY1M,KAAKD,GAEjBuB,EAAQjN,GAAQ,CAAEU,MAAOgL,EAAQ0M,gBAAepN,MAAOqN,EAAYrN,OAEnE2L,EAAM1J,QAAUA,EAET,IAAI0J,EAAX,EAIY2B,GAAe,CAAC3B,EAAwB3W,EAAuCU,EAAgB0X,KAC3G,MAAMnL,EAAmB5G,OAAO8I,OAAO,CAAC,EAAGwH,EAAM1J,SAC3CsL,EAAwB7X,GAAS,KACjCyX,EAAUpN,EAAAA,YAA0BkC,EAASjN,GAC7C0L,EAASyM,EAAQzM,SACjB8M,EAAYD,EAAgB7M,EAAOqB,QAAOC,GAAKA,GAAKuL,IAAgB,KAEpEE,EAAIN,EAAQnM,UAAY,IAAIjB,EAWlC,OAVIyN,GACHC,EAAE9M,KAAK6M,GAERvL,EAAQjN,GAAQ,CAACU,MAAO+X,EAAE/M,SAAU0M,gBAAgBpN,MAAOyN,EAAEzN,OAEtC,IAAnByN,EAAEzN,MAAMC,eACJgC,EAAQjN,GAGhB2W,EAAM1J,QAAUA,EACT,IAAI0J,EAAX,E,IC1II01B,I,SAAAA,GAAAA,EAAAA,EAAAA,6BAAAA,GAAAA,+BAAAA,EAAAA,EAAAA,yBAAAA,GAAAA,2BAAAA,EAAAA,EAAAA,sBAAAA,GAAAA,uB,EAAAA,KAAAA,GAAAA,CAAAA,IAgBL,MAAMpzB,GAAsB,CAC3B3F,UAAW,GAKNmxB,GAAU,CAAC9tB,EAAcsD,KAC9B,MAAM,KAAElE,GAASkE,EAEjB,OAAQlE,GACP,KAAKs2B,GAAqB3H,6BACzB,MAAO,IAAK/tB,EAAYrD,UAAW2G,EAAOjE,SAE3C,KAAKq2B,GAAqB1H,yBAC1B,KAAK0H,GAAqBzH,sBACzB,MAAO,IAAKjuB,EAAYrD,UAAW,GAEpC,QACC,OAAOqD,EATT,EAaD,IAAIkuB,GAmBA,CAAC,EAGE,SAASyH,KACf,MAAOvH,EAAYC,GAAiBp7B,EAAAA,WAAiB66B,GAASxrB,KACxD,MAAEtC,EAAF,SAASmE,GAAalR,EAAAA,WAAiBgR,KAGtCkf,EAAiBC,GAAkBnwB,EAAAA,UAAe,GAOnD0O,EAAuCzO,MAAO7J,EAA6CU,KAChG,MAAMs5B,QAA0BuS,GAAuBA,GAAmB51B,EAAMuC,KAAKC,UAAoCnZ,EAAKU,IAC9Hoa,EAAS,CAAE/E,KAAM8D,GAAYQ,mBAAoBrE,QAASgkB,GAA1D,EAkDD,GA/CApwB,EAAAA,WAAgB,KACfkR,EAAS,CAAE/E,KAAM8D,GAAYM,8BAW7BrX,QAAQyU,IAAI,CAToB1N,WAC/Bg7B,SAAsB9xB,GAA4B,QAAlD,EAQYmyB,GALSr7B,WACrB,MAAMnJ,QAAc6rC,GAAyB51B,EAAMuC,KAAKC,WACxD2B,EAAS,CAAE/E,KAAM8D,GAAYK,uBAAwBlE,QAAStV,GAA9D,EAGuCykC,KAEjC,KFiCLvvB,IAAUA,GAAOqkB,YACjBrkB,GAAS,KACTpV,QAAQC,IAAI,uBElCb,IAEC,IAEHmJ,EAAAA,WAAgB,KACf,GAA4B,GAAxBm7B,EAAWzxB,UACd,OAED,IAAI8xB,EAAMoH,EAAelI,OAAOzD,sBAIKh3B,WACpC,IACC,MAAM9E,QAAa+7B,GAAAA,6BAAuCsE,GAL9C,EAK4DL,EAAWzxB,WAC/EvO,EAAKg8B,eACRvgC,QAAQD,MAAMwE,EAAKg8B,cACnBiE,EAAc,CAAEjvB,KAAMs2B,GAAqBzH,yBAE5CI,EAAc,CAAEjvB,KAAMs2B,GAAqB1H,2BACpC3D,GAAoBj8B,EAAK85B,MAAO95B,EAAK2K,SAAUsxB,GAA8Bj8B,EAAK64B,UAAW,qBAGpG,CAFC,MACDoH,EAAc,CAAEjvB,KAAMs2B,GAAqBzH,uBAC3C,GAGF6H,EAA8B,GAG5B,CAAC1H,EAAWzxB,YAGXqD,EAAMuC,KAAKG,UAAY1C,EAAMuC,KAAKC,UAAU/B,UAC/C,OAAO,gBAAC,GAAD,MAWR,IAAI0jB,EAAqB,GACrBC,EAAc,GACdC,EAAQ,GAEZ,IAAK,MAAMh7B,KAAO2W,EAAMuC,KAAKC,UAAUlM,QAClC5G,OAAOwS,UAAU9X,eAAe+X,KAAKnC,EAAMuC,KAAKC,UAAUlM,QAASjN,IACtE86B,EAAmBnvB,KAAK,CAAE,IAAO3L,EAAK,OAAU2W,EAAMuC,KAAKC,UAAUlM,QAAQjN,GAAKU,MAAO,MAASiW,EAAMuC,KAAKC,UAAUlM,QAAQjN,GAAKgL,QAItI,IAAK,MAAMhL,KAAOusC,GACblmC,OAAOwS,UAAU9X,eAAe+X,KAAKyzB,GAA2BvsC,IACnE+6B,EAAYpvB,KAAK,CAAE,IAAO3L,EAAK,MAASusC,GAA0BvsC,GAAKkM,QAIzE4uB,EAAmBlzB,SAAQgf,IAC1BA,EAAElb,OAAO9D,SAAQgH,IAChBosB,EAAMrvB,KAAK,gBAACysB,GAAD,CAAUp4B,IAAK4mB,EAAE5mB,IAAM4O,EACjC4hB,eAAgBlY,EAChB+f,WAAY0C,EAAY/hB,MAAK1U,GAAMA,EAAGtE,KAAO4mB,EAAE5mB,MAAKkM,MACpDosB,YAAa1pB,EACb2pB,SAAU3R,EAAE5mB,IACZw4B,aAAe5R,EAAE5b,MAAMC,OAAS,EAAI2b,EAAE5b,MAAM,GAAK,OALlD,GADD,IAYD,MAAMwhC,EAAiB71B,EAAMuC,KAAKC,UAAU/B,UAetCmuB,EAAO,CACZtO,UAAW,EACXC,YAAa,EACbsO,WAAY,GAGPC,EAAQ,CACbxO,UAAW,EACXC,YAAa,EACbsO,WAAY,GAoNb,OAjNIgH,EAAelI,OAAOoB,eAAiB,IAC1CH,EAAKtO,UAAYuV,EAAelI,OAAOoB,gBAAkB8G,EAAe7G,OAAO70B,UAAUpF,OAAO8gC,EAAe7G,OAAO70B,UAAUgW,OAAO3c,QAAQ,SAAW,GAC1Jo7B,EAAKrO,YAAcsV,EAAelI,OAAOoB,eACzCH,EAAKC,WAAaD,EAAKtO,UAAYsO,EAAKrO,YAAc,IAEtDuO,EAAMxO,UAAYuV,EAAelI,OAAOoB,gBAAkB8G,EAAe7G,OAAOj1B,SAAShF,OAAO8gC,EAAe7G,OAAOj1B,SAASoW,OAAO3c,QAAQ,SAAW,GACzJs7B,EAAMvO,YAAcsV,EAAelI,OAAOoB,eAC1CD,EAAMD,WAAaC,EAAMxO,UAAYwO,EAAMvO,YAAc,KAIxC,gCACjB,uBAAKta,MAAO,CACXgB,SAAU,SACV+C,IAAK,OACLC,KAAM,OACN/C,OAAQ,EACRmE,gBAAiB,UAIf8X,EAAkB,uBAAKld,MAAO,CAAES,WAAY,OAAQ2e,aAAc,OAAQnf,UAAW,OAAQxO,MAAO,QACpG2sB,GACO,MAKV,uBAAKpe,MAAO,CACXgR,SAAU,IACVnf,OAAQ,WAGR,uBAAKmO,MAAO,CACX4D,UAAW,QACX0iB,cAAe,OACftd,WAAY,OACZhI,SAAU,SACVC,OAAQ,EACR8C,IAAK,OACLqB,gBAAiB,UAEjB,gBAACvE,EAAA,EAAD,CAAQjC,QAAS,IAAMwpB,EAAc,CAAEjvB,KAAMs2B,GAAqB3H,6BAA8B1uB,QAAS,IACxG4G,MAAO,CACNoF,gBAAkBwqB,EAAelI,OAAOoB,eAAiB,EAAK,UAAc,UAC5E7pB,MAAO,QACPsC,WAAY,UAJd,6BASD,gBAACynB,GAAA,EAAD,CAAgBC,UAAWhiB,GAAAA,GAC1B,gBAACuG,GAAA,EAAD,CAAO5b,KAAK,SACX,gBAAC6b,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,kBACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,cACA,gBAACvb,GAAA,EAAD,CAAWub,MAAM,UAAUjB,GAAcnkB,MAAzC,OAGF,gBAAC8J,GAAA,EAAD,KACC,gBAACF,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,wCACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8B0G,EAAelI,OAAOoB,iBACpD,gBAACnb,GAAA,EAAD,CAAWub,MAAM,UAAUjB,GAAchP,WAG1C,gBAACvL,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,yCACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BP,EAAKC,WAAWzV,QAAQ,GAAtD,SAA6D,2BAA7D,eAAyEwV,EAAKtO,UAA9E,YAA2FsO,EAAKrO,YAAhG,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,UAAjB,MAGD,gBAACxb,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,CAAW4b,QAAS,GACnB,wCAIF,gBAAC7b,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,2DACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8B0G,EAAelI,OAAOoI,SAASlH,WAAWzV,QAAQ,GAAhF,SAAuF,2BAAvF,eAAmGyc,EAAelI,OAAOoI,SAASzV,UAAlI,YAA+IuV,EAAelI,OAAOoI,SAASxV,YAA9K,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAc6H,WAGxE,gBAACpiB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,CAAW4b,QAAS,GACnB,uCAGF,gBAAC7b,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,4EACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8B0G,EAAelI,OAAOqI,0BAA0BnH,WAAWzV,QAAQ,GAAjG,SAAwG,2BAAxG,eAAoHyc,EAAelI,OAAOqI,0BAA0B1V,UAApK,YAAiLuV,EAAelI,OAAOqI,0BAA0BzV,YAAjO,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAc8H,4BAGxE,gBAACriB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,sHACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8B0G,EAAelI,OAAOsI,0CAA0CpH,WAAWzV,QAAQ,GAAjH,SAAwH,2BAAxH,eAAoIyc,EAAelI,OAAOsI,0CAA0C3V,UAApM,YAAiNuV,EAAelI,OAAOsI,0CAA0C1V,YAAjR,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAc+H,4CAGxE,gBAACtiB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,2DACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8B0G,EAAelI,OAAOuI,mBAAmBrH,WAAWzV,QAAQ,GAA1F,SAAiG,2BAAjG,eAA6Gyc,EAAelI,OAAOuI,mBAAmB5V,UAAtJ,YAAmKuV,EAAelI,OAAOuI,mBAAmB3V,YAA5M,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcgI,qBAGxE,gBAACviB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,8CACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8B0G,EAAelI,OAAOwI,oBAAoBtH,WAAWzV,QAAQ,GAA3F,SAAkG,2BAAlG,eAA8Gyc,EAAelI,OAAOwI,oBAAoB7V,UAAxJ,YAAqKuV,EAAelI,OAAOwI,oBAAoB5V,YAA/M,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAciI,sBAGxE,gBAACxiB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,0CACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8B0G,EAAelI,OAAOyI,gBAAgBvH,WAAWzV,QAAQ,GAAvF,SAA8F,2BAA9F,eAA0Gyc,EAAelI,OAAOyI,gBAAgB9V,UAAhJ,YAA6JuV,EAAelI,OAAOyI,gBAAgB7V,YAAnM,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAckI,kBAGxE,gBAACziB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,0CACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8B0G,EAAelI,OAAO0I,gBAAgBxH,WAAWzV,QAAQ,GAAvF,SAA8F,2BAA9F,eAA0Gyc,EAAelI,OAAO0I,gBAAgB/V,UAAhJ,YAA6JuV,EAAelI,OAAO0I,gBAAgB9V,YAAnM,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcmI,kBAExE,gBAAC1iB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,6CACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8B0G,EAAelI,OAAOnB,gBAAgBqC,WAAWzV,QAAQ,GAAvF,SAA8F,2BAA9F,eAA0Gyc,EAAelI,OAAOnB,gBAAgBlM,UAAhJ,YAA6JuV,EAAelI,OAAOnB,gBAAgBjM,YAAnM,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAc1B,kBAExE,gBAAC7Y,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,6CACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8B0G,EAAelI,OAAO2I,gBAAgBzH,WAAWzV,QAAQ,GAAvF,SAA8F,2BAA9F,eAA0Gyc,EAAelI,OAAO2I,gBAAgBhW,UAAhJ,YAA6JuV,EAAelI,OAAO2I,gBAAgB/V,YAAnM,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcoI,kBAGxE,gBAAC3iB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,CAAW4b,QAAS,GAApB,IAAwB,mLAGzB,gBAAC7b,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,CAAW4b,QAAS,GACnB,gDAIF,gBAAC7b,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,qEACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8B0G,EAAelI,OAAO4I,iBAAiB1H,WAAWzV,QAAQ,GAAxF,SAA+F,2BAA/F,eAA2Gyc,EAAelI,OAAO4I,iBAAiBjW,UAAlJ,YAA+JuV,EAAelI,OAAO4I,iBAAiBhW,YAAtM,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcqI,mBAGxE,gBAAC5iB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,8FACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8B0G,EAAelI,OAAO6I,sBAAsB3H,WAAWzV,QAAQ,GAA7F,SAAoG,2BAApG,eAAgHyc,EAAelI,OAAO6I,sBAAsBlW,UAA5J,YAAyKuV,EAAelI,OAAO6I,sBAAsBjW,YAArN,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcsI,wBAGxE,gBAAC7iB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,mFACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8B0G,EAAelI,OAAO8I,mBAAmB5H,WAAWzV,QAAQ,GAA1F,SAAiG,2BAAjG,eAA6Gyc,EAAelI,OAAO8I,mBAAmBnW,UAAtJ,YAAmKuV,EAAelI,OAAO8I,mBAAmBlW,YAA5M,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcuI,qBAGxE,gBAAC9iB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,+EACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8B0G,EAAelI,OAAO+I,kBAAkB7H,WAAWzV,QAAQ,GAAzF,SAAgG,2BAAhG,eAA4Gyc,EAAelI,OAAO+I,kBAAkBpW,UAApJ,YAAiKuV,EAAelI,OAAO+I,kBAAkBnW,YAAzM,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcwI,oBAGxE,gBAAC/iB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,2DACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8B0G,EAAelI,OAAOgJ,WAAW9H,WAAWzV,QAAQ,GAAlF,SAAyF,2BAAzF,eAAqGyc,EAAelI,OAAOgJ,WAAWrW,UAAtI,YAAmJuV,EAAelI,OAAOgJ,WAAWpW,YAApL,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcyI,aAExE,gBAAChjB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,sDACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8B0G,EAAelI,OAAOiJ,WAAW/H,WAAWzV,QAAQ,GAAlF,SAAyF,2BAAzF,eAAqGyc,EAAelI,OAAOiJ,WAAWtW,UAAtI,YAAmJuV,EAAelI,OAAOiJ,WAAWrW,YAApL,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAc0I,aAGxE,gBAACjjB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,kHACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8B0G,EAAelI,OAAOkJ,0BAA0BhI,WAAWzV,QAAQ,GAAjG,SAAwG,2BAAxG,eAAoHyc,EAAelI,OAAOkJ,0BAA0BvW,UAApK,YAAiLuV,EAAelI,OAAOkJ,0BAA0BtW,YAAjO,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAc2I,+BAO3E,uBAAK5wB,MAAO,CAAEkE,SAAU,QAASN,UAAW,SAC3C,yBAAG,2DAAH,MAGD,uBAAK5D,MAAO,CAAEkE,SAAU,QAASN,UAAW,SAC3C,yBAAG,0NAAH,MAGD,uBAAK5D,MAAO,CAAE4D,UAAW,SACxB,wDAA+B,qBAAG3a,KrIxYM,iDqIwY8BkiC,OAAO,UAA9C,oDAA/B,gEAKF,qBAAGzjC,GAAG,qBAAqBsY,MAAO,CAAEsB,QAAS,UAS9C,CCzZM,SAASuvB,KAAe,8CAC9B,MAAM,MAAE92B,EAAF,SAASmE,GAAalR,EAAAA,WAAiBgR,IAEvC1D,EAAiCrN,MAAO7J,EAA6CU,EAA0ByX,EAAyBC,KAC7I,MAAM4hB,QAA0BuS,GAAuBA,GAAgB51B,EAAMuC,KAAKC,UAA3BozB,CAA+DvsC,EAAKU,EAAOyX,EAASC,IAC3I0C,EAAS,CAAE/E,KAAM8D,GAAYQ,mBAAoBrE,QAASgkB,GAA1D,EAGK1hB,EAAuCzO,UAE5C,MAAMmwB,QAA0BuS,GAAuBA,GAAmB51B,EAAMuC,KAAKC,UAAoCnZ,IACzH8a,EAAS,CAAE/E,KAAM8D,GAAYQ,mBAAoBrE,QAASgkB,GAA1D,EAGD,GAAIrjB,EAAMuC,KAAKG,QACd,OAAO,gBAAC,GAAD,MAER,MAAM4uB,EAAiBtxB,EAAMuC,KAAKC,UAAU/B,UAGtC8nB,EAAoB,GAC1B+I,SAAAA,EAAgB3D,OAAOjtB,MAAM9Q,KAAIyG,IAChCkyB,EAAWvzB,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE1I,IAA1C,IAID,IAAI66B,EAAuB,GAC3B,UAAAxoB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8ByE,WAA9B,mBAAmChR,aAAnC,SAA0C6F,KAAIyG,IAC7CmyB,EAAcxzB,KAAK,CAAEO,MAAOc,EAAGtM,MAAOw+B,EAAWlmB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAzE,IAID,IAAI0+B,EAAiB,GACjBD,EAAcl0B,OAAS,IAC1Bm0B,EAAiBD,EAAc54B,KAAIqgB,GAClCA,EAAElmB,SAKJ,MAAM2+B,EAAyB,GAC3BF,EAAcl0B,OAAS,EAC1Bg9B,SAAAA,EAAgB3D,OAAO/iC,WAAWwL,QAAO6Z,GAAKwY,EAAej8B,SAASyjB,EAAE0Y,SAAQ/4B,KAAIyG,IACnFqyB,EAAgB1zB,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE+qB,YAA/C,IAGDkQ,SAAAA,EAAgB3D,OAAO/iC,WAAWgF,KAAIyG,IACrCqyB,EAAgB1zB,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE+qB,YAA/C,IAKF,IAAIwH,EAA4B,GAChC,UAAA5oB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8BoE,gBAA9B,mBAAwC3Q,aAAxC,SAA+C6F,KAAIyG,IAClDuyB,EAAmB5zB,KAAK,CAAEO,MAAOc,EAAGtM,MAAO2+B,EAAgBrmB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAnF,IAID,IAAI8+B,EAAsB,GACtBD,EAAmBt0B,OAAS,IAC/Bu0B,EAAsBD,EAAmBh5B,KAAIqgB,GAC5CA,EAAElmB,SAKJ,MAAM++B,EAAoB,GACtBF,EAAmBt0B,OAAS,EAC/Bg9B,SAAAA,EAAgB3D,OAAO/H,KAAKxvB,QAAO6Z,GAAK4Y,EAAoBr8B,SAASyjB,EAAEmR,cAAaxxB,KAAIyG,IACvFyyB,EAAW9zB,KAAK,CAAEO,MAAOc,EAAEiD,gBAAiBvP,MAAOsM,EAAE+rB,WAArD,IAGDkP,SAAAA,EAAgB3D,OAAO/H,KAAKh2B,KAAIyG,IAC/ByyB,EAAW9zB,KAAK,CAAEO,MAAOc,EAAEiD,gBAAiBvP,MAAOsM,EAAE+rB,WAArD,IAKF,IAAI2G,EAAuB,GAC3B,UAAA/oB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8B+D,WAA9B,mBAAmCtQ,aAAnC,SAA0C6F,KAAIyG,IAC7C0yB,EAAc/zB,KAAK,CAAEO,MAAOc,EAAGtM,MAAO++B,EAAWzmB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAzE,IAQD,MAAMi/B,EAAsB,GAC5BsI,SAAAA,EAAgB3D,OAAO1E,MAAMr5B,KAAIyG,IAChC2yB,EAAah0B,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE1I,IAA5C,IAID,IAAIu7B,EAA4B,GAChC,UAAAlpB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8B+2B,gBAA9B,mBAAwCtjC,aAAxC,SAA+C6F,KAAIyG,IAAK,MACvD6yB,EAAmBl0B,KAAK,CACvBO,MAAOc,EACPtM,MAAK,UAAEi/B,EAAa3mB,MAAK4N,GAAKA,EAAE1a,OAASc,WAApC,aAAE,EAAsCtM,OAF9C,IAOD,IAAIo/B,EAA6B,GACjC,UAAAnpB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8B62B,sBAA9B,mBAA8CpjC,aAA9C,SAAqD6F,KAAIyG,IACxD8yB,EAAoBn0B,KAAK,CAAEO,MAAOc,EAAGtM,MAAOi/B,EAAa3mB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAjF,IAKD,MAAMq/B,EAAwB,GAC9BkI,SAAAA,EAAgB3D,OAAOrxB,KAAK1M,KAAIyG,IAC3BA,EAAE1I,IAAM,MACXy7B,EAAep0B,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE1I,IAC9C,IAIF,MAAM27B,EAAyB,GAC/BgI,SAAAA,EAAgB3D,OAAOrxB,KAAK1M,KAAIyG,IAC/BizB,EAAgBt0B,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE1I,IAA/C,IAID,IAAI07B,EAA2B,GAC/B,UAAArpB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8B82B,eAA9B,mBAAuCrjC,aAAvC,SAA8C6F,KAAIyG,IAAK,MACtDgzB,EAAkBr0B,KAAK,CACtBO,MAAOc,EACPtM,MAAK,UAAEq/B,EAAe/mB,MAAK4N,GAAKA,EAAE1a,OAASc,WAAtC,aAAE,EAAwCtM,OAFhD,IAOD,IAAIw/B,EAA4B,GAChC,UAAAvpB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8B42B,qBAA9B,mBAA6CnjC,aAA7C,SAAoD6F,KAAIyG,IACvDkzB,EAAmBv0B,KAAK,CAAEO,MAAOc,EAAGtM,MAAOu/B,EAAgBjnB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAnF,IAID,MAAOy/B,EAAQC,GAAax2B,EAAAA,SAAes2B,EAAmBj1B,OAAS,EAAI,iBAAmB,YAE9F,OACC,gCACC,gBAACyS,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,YACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOy+B,EACPmB,QAASpB,EACTzD,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAai0B,GAAAA,IAAAA,KAEbr1B,EAAUq1B,GAAAA,IAAAA,IAAmC5zB,EAC7C,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAOX,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,iBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAO6+B,EACPe,QAASjB,EACT5D,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAai0B,GAAAA,SAAAA,KAEbr1B,EAAUq1B,GAAAA,SAAAA,IAAwC5zB,EAClD,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAOX,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,YACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOg/B,EACPY,QAASb,EACThE,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAai0B,GAAAA,IAAAA,KAEbr1B,EAAUq1B,GAAAA,IAAAA,IAAmC5zB,EAC7C,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAMX,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,gBACA,gBAACwe,GAAD,CACCC,YAAa,CAAC,WAAY,kBAC1BC,aAAckD,EACdlW,UAAWjd,IACVozB,EAAUpzB,EAAV,KAMS,YAAVmzB,EACD,gCACC,gBAACziB,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,iBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOs/B,EACPM,QAASP,EAAe9Y,UACxBwU,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAai0B,GAAAA,QAAAA,KAEbr1B,EAAUq1B,GAAAA,QAAAA,IAAuC5zB,EACjD,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAMX,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,kBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOm/B,EACPS,QAASX,EACTlE,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAai0B,GAAAA,SAAAA,KAEbr1B,EAAUq1B,GAAAA,SAAAA,IAAwC5zB,EAClD,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,eAOZ,gCACC,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,uBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOw/B,EACPI,QAASL,EAAgBhZ,UACzBwU,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAai0B,GAAAA,cAAAA,KAEbr1B,EAAUq1B,GAAAA,cAAAA,IAA6C5zB,EACvD,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAMX,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,wBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOo/B,EACPQ,QAASX,EACTlE,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAai0B,GAAAA,eAAAA,KAEbr1B,EAAUq1B,GAAAA,eAAAA,IAA8C5zB,EACxD,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,eAkCf,C,yHCtYM,MAAO6xB,WAA2B9jC,EAAAA,UAErClE,YAAY6W,GACRwG,MAAMxG,GADS,4BAUQ,KACvBzW,KAAKu7B,SAAS,CAAEhzB,MAAO1I,OAAO0jB,WAAY1b,OAAQhI,OAAO4oB,aAAzD,IAXe,kBAsBV,IAED,gCACI,gBAAC+d,GAAD,SAtBRxmC,KAAK6Q,MAAQ,CACTtI,MAAO,EACPV,OAAQ,EAGf,CAMM2zB,uBACH37B,OAAO47B,oBAAoB,SAAUz7B,KAAK07B,iBAC7C,CAEMC,oBACH97B,OAAO4Q,iBAAiB,SAAUzQ,KAAK07B,iBAC1C,ECUOr0B,GAAgBE,GAA4BA,EAAG8C,WAAWrI,OC8CtE,MAYa6J,GAAmC,IAC5CZ,GAXH8yB,cAAe,CAAE7jC,IAAK,gBAAiBkM,MAAO,kBAC9C43B,eAAgB,CAAE9jC,IAAK,iBAAkBkM,MAAO,mBAChD63B,QAAS,CAAE/jC,IAAK,UAAWkM,MAAO,YAClC83B,SAAU,CAAEhkC,IAAK,WAAYkM,MAAO,aACpC6F,YAAa,CAAE/R,IAAK,cAAekM,MAAO,gBAC1C8F,WAAY,CAAEhS,IAAK,aAAckM,MAAO,cACxC+F,WAAY,CAAEjS,IAAK,aAAckM,MAAO,YACxC2F,eAAgB,CAAE7R,IAAK,iBAAkBkM,MAAO,qBC3F1C,IAAKiJ,GAUAC,GCbG,SAAS,KACtB,OAAO,IAAIE,OAAO,IAA0B,6CAC9C,E,SDCYH,GAAAA,EAAAA,EAAAA,KAAAA,GAAAA,OAAAA,EAAAA,EAAAA,MAAAA,GAAAA,QAAAA,EAAAA,EAAAA,UAAAA,GAAAA,W,EAAAA,KAAAA,GAAAA,CAAAA,I,SAUAC,GAAAA,EAAAA,EAAAA,KAAAA,GAAAA,OAAAA,EAAAA,EAAAA,MAAAA,GAAAA,QAAAA,EAAAA,EAAAA,UAAAA,GAAAA,YAAAA,EAAAA,EAAAA,YAAAA,GAAAA,a,EAAAA,KAAAA,GAAAA,CAAAA,IEJZ,IAAIQ,GAAqB,KACrBC,GAAW,CAAC,EACZ9Q,GAAO,CACPo/B,QAAS,GA2Eb,SAASruB,GAAyBC,EAAyBC,GACvD,MAAM1R,EAAKgO,KASX,OARAuD,GAASvR,GAAM,CAAC,EAChBuR,GAASvR,GAAI2R,QAAU,IAAInT,SAAQ,CAACwC,EAASvC,KAZjD,IAAc8B,IAaD,CAAEP,KAAIyR,OAAMC,WAZrBJ,GAAOM,YAAYrR,GAcfgR,GAASvR,GAAIgB,QAAUA,EACvBuQ,GAASvR,GAAIvB,OAASA,CAAtB,IAGG8S,GAASvR,GAAI2R,OACvB,CC5EM,MAaM03B,GAAoB9jC,UDhB7B9E,GAAKo/B,QCiBS,KDfTx+B,OAAM,QAKPnF,QAAQC,IAAI,sBAEZmV,GAASA,IAAU,IAAIU,GAKvBV,GAAOW,iBAAiB,WAAYC,IAChC,MAAQzR,MAAM,GAAET,EAAF,KAAMyR,EAAN,QAAYC,IAAcQ,EAM3B,MAEL,UAAAX,GAASvR,UAAT,SAAcgB,QAAQ0Q,GAK9BH,GAASvR,QAAMtC,CAAf,IAMJ4T,GAAOW,iBAAiB,gBAAiBC,IACrC,MAAQzR,MAAM,GAAET,EAAF,KAAMyR,EAAN,QAAYC,IAAcQ,EAOhChW,QAAQD,MAAM,oBAAqByV,GACnCH,GAASvR,GAAIvB,OAAOiT,GAK5BH,GAASvR,QAAMtC,CAAf,KA7CJxB,QAAQC,IAAI,2BCenB,IAGC,aD6DSqV,GAAuCX,GAAAA,KAAwB,MC9DxE3U,QAAQC,IAAI,8BACCiW,GAAUC,EAAOA,EAAMlB,QAGpC,CAFC,MACDjV,QAAQD,MAAM,qBACd,GAGWqW,GAAgBD,IAC5B,MAAME,EAAwB,CAAC3J,EAAmB4J,KACjD,IAAKA,GAAoC,IAAtBA,EAAW7L,OAC7B,OAAQ,IAAI8L,IAEb,GAAIJ,EAAMlB,QACT,OAAQ,IAAIsB,IAEb,IAAIC,EAAY,IAAID,IAIpB,OAHAC,EAAUC,IAAIH,EAAW,GAAGhP,MAE5B6O,EAAQO,GAAUP,EAAVO,CAAiBhK,EAAW,CAAC4J,EAAW,GAAGhP,OAC5CkP,CAAP,EAOD,OAJAL,EAAM1J,QAAU,CAAC,EACjB0J,EAAMQ,cAAiBN,EAAsBlF,GAAAA,IAAAA,IAA6BgF,EAAMS,UAAUktB,OAAOjtB,OACjGV,EAAMW,mBAAqBT,EAAsBlF,GAAAA,SAAAA,IAAkCgF,EAAMS,UAAUktB,OAAO/iC,YAEnG,IAAMoV,EAAb,EASKD,GAAY7M,MAAO8M,EAAuBY,KAC/C,IACC,MAAMxS,QDgCD,SAAewS,GAGlB,OAAOzU,QAAQyU,IAAI,CACf9C,GAAiB8C,GACjB7C,GAA2B6C,KAE1B/R,MAAKgS,GACK1B,GAAuDX,GAAAA,MAAyB,CACnFoC,MACAG,QAASF,EAAQ,GACjBG,QAASH,EAAQ,GACjB2sB,QAASp/B,GAAKo/B,WAI7B,CChDoB1tB,CAAiBc,GAE9BV,EAAwB,CAAC3J,EAAmB4J,KACjD,IAAKA,GAAoC,IAAtBA,EAAW7L,OAC7B,OAAQ,IAAI8L,IAEb,GAAIQ,EACH,OAAQ,IAAIR,IAEb,IAAIC,EAAY,IAAID,IAIpB,OAHAC,EAAUC,IAAIH,EAAW,GAAGhP,MAE5B6O,EAAQO,GAAUP,EAAVO,CAAiBhK,EAAW,CAAC4J,EAAW,GAAGhP,OAC5CkP,CAAP,EASD,OANAL,EAAMQ,cAAiBN,EAAsBlF,GAAAA,IAAAA,IAA6B5M,EAAKqS,UAAUktB,OAAOjtB,OAC1FV,EAAMW,mBAAqBT,EAAsBlF,GAAAA,SAAAA,IAAkC5M,EAAKqS,UAAUktB,OAAO/iC,YAC/GoV,EAAMlB,QAAU8B,EAChBZ,EAAMoB,WAAahT,EAAKgT,WACxBpB,EAAMS,UAAYrS,EAAKqS,UAEhBT,CAIP,CAHC,MAED,OADAnW,QAAQD,MAAM,2BACPoW,CACP,GAGWqB,GAAmBnO,UAC/B,IACC,MAAM9E,QDuBkBkT,ECvBgBtB,EAAM1J,QDwBrC6I,GAA+DX,GAAAA,UAA6B,CAC/F8C,iBACAksB,QAASp/B,GAAKo/B,WCxBpB,OADAxtB,EAAMS,UAAYrS,EACX,IAAI4R,EAIX,CAHC,MAED,OADAnW,QAAQD,MAAM,kCACPoW,CACP,CDiBK,IAAmBsB,CCjBxB,EAGWf,GAAaP,GAA0B,CAAC3W,EAAuCU,EAA0ByX,EAAyBC,KAC9I,MAAMnL,EAAmB5G,OAAO8I,OAAO,CAAC,EAAGwH,EAAM1J,SAC3CvB,EAA2B,iBAAVhL,EACpB,CAACA,GACDA,EAIG2X,EAA6BF,IAAaA,EAAQzM,SAAST,OAAS,EAAKkN,EAAQnM,SAAWmM,IAAY,IAAIpN,EAOlH,OANAsN,EAAY1M,KAAKD,GAEjBuB,EAAQjN,GAAQ,CAAEU,MAAOgL,EAAQ0M,gBAAepN,MAAOqN,EAAYrN,OAEnE2L,EAAM1J,QAAUA,EAET,IAAI0J,EAAX,EAIY2B,GAAe,CAAC3B,EAAuB3W,EAAuCU,EAAgB0X,KAC1G,MAAMnL,EAAmB5G,OAAO8I,OAAO,CAAC,EAAGwH,EAAM1J,SAC3CsL,EAAwB7X,GAAS,KACjCyX,EAAUpN,EAAAA,YAA0BkC,EAASjN,GAC7C0L,EAASyM,EAAQzM,SACjB8M,EAAYD,EAAgB7M,EAAOqB,QAAOC,GAAKA,GAAKuL,IAAgB,KAEpEE,EAAIN,EAAQnM,UAAY,IAAIjB,EAWlC,OAVIyN,GACHC,EAAE9M,KAAK6M,GAERvL,EAAQjN,GAAQ,CAACU,MAAO+X,EAAE/M,SAAU0M,gBAAgBpN,MAAOyN,EAAEzN,OAEtC,IAAnByN,EAAEzN,MAAMC,eACJgC,EAAQjN,GAGhB2W,EAAM1J,QAAUA,EACT,IAAI0J,EAAX,E,IC3IIi3B,I,SAAAA,GAAAA,EAAAA,EAAAA,6BAAAA,GAAAA,+BAAAA,EAAAA,EAAAA,yBAAAA,GAAAA,2BAAAA,EAAAA,EAAAA,sBAAAA,GAAAA,uB,EAAAA,KAAAA,GAAAA,CAAAA,IAiBL,MAAM30B,GAAsB,CAC3B3F,UAAW,EACXkxB,aAAa,GAKRC,GAAU,CAAC9tB,EAAcsD,KAC9B,MAAM,KAAElE,GAASkE,EAEjB,OAAQlE,GACP,KAAK63B,GAAoBlJ,6BACxB,MAAO,IAAK/tB,EAAYrD,UAAW2G,EAAOjE,QAASwuB,aAAa,GAEjE,KAAKoJ,GAAoBjJ,yBACzB,KAAKiJ,GAAoBhJ,sBACxB,MAAO,IAAKjuB,EAAYrD,UAAW,EAAGkxB,aAAa,GAEpD,QACC,OAAO7tB,EATT,EAaD,IAAIkuB,GAuCA,CAAC,EAEE,SAASgJ,KACf,MAAO9I,EAAYC,GAAiBp7B,EAAAA,WAAiB66B,GAASxrB,KACxD,MAAEtC,EAAF,SAASmE,GAAalR,EAAAA,WAAiBgR,KAGtCkf,EAAiBC,GAAkBnwB,EAAAA,UAAe,GASnD0O,EAAsCzO,MAAO7J,EAA4CU,KAC9F,MAAMs5B,QAA0B8T,GAAsBA,GAAkBn3B,EAAMuC,KAAKC,UAAkCnZ,EAAKU,IAC1Hoa,EAAS,CAAE/E,KAAM8D,GAAYQ,mBAAoBrE,QAASgkB,GAA1D,EAkDD,GA/CApwB,EAAAA,WAAgB,KACfkR,EAAS,CAAE/E,KAAM8D,GAAYM,8BAW7BrX,QAAQyU,IAAI,CAToB1N,WAC/Bg7B,SAAsB9xB,GAA4B,OAAQ,KAA1D,EAQYmyB,GALSr7B,WACrB,MAAMnJ,QAAcotC,GAAuBn3B,EAAMuC,KAAKC,WACtD2B,EAAS,CAAE/E,KAAM8D,GAAYK,uBAAwBlE,QAAStV,GAA9D,EAGuCykC,KAEjC,KFWLvvB,IAAUA,GAAOqkB,YACjBrkB,GAAS,KACTpV,QAAQC,IAAI,uBEZb,IAEC,IAEHmJ,EAAAA,WAAgB,KACf,GAA4B,GAAxBm7B,EAAWzxB,UACd,OAED,IAAI8xB,EAAM2I,EAAczJ,OAAOzD,sBAIKh3B,WACnC,IACC,MAAM9E,QAAa+7B,GAAAA,4BAAsCsE,GAL7C,EAK2DL,EAAWzxB,WAC9EvO,EAAKg8B,eACRvgC,QAAQD,MAAMwE,EAAKg8B,cACnBiE,EAAc,CAAEjvB,KAAM63B,GAAoBhJ,yBAE3CI,EAAc,CAAEjvB,KAAM63B,GAAoBjJ,2BACnC3D,GAAoBj8B,EAAK85B,MAAO95B,EAAK2K,SAAUsxB,GAA8Bj8B,EAAK64B,UAAW,qBAGpG,CAFC,MACDoH,EAAc,CAAEjvB,KAAM63B,GAAoBhJ,uBAC1C,GAGFoJ,EAA6B,GAG3B,CAACjJ,EAAWzxB,YAGXqD,EAAMuC,KAAKG,UAAY1C,EAAMuC,KAAKC,UAAU/B,UAC/C,OAAO,gBAAC,GAAD,MAYR,IAAI0jB,EAAqB,GACrBC,EAAc,GACdC,EAAQ,GAEZ,IAAK,MAAMh7B,KAAO2W,EAAMuC,KAAKC,UAAUlM,QAClC5G,OAAOwS,UAAU9X,eAAe+X,KAAKnC,EAAMuC,KAAKC,UAAUlM,QAASjN,IACtE86B,EAAmBnvB,KAAK,CAAE,IAAO3L,EAAK,OAAU2W,EAAMuC,KAAKC,UAAUlM,QAAQjN,GAAKU,MAAO,MAASiW,EAAMuC,KAAKC,UAAUlM,QAAQjN,GAAKgL,QAItI,IAAK,MAAMhL,KAAO8tC,GACbznC,OAAOwS,UAAU9X,eAAe+X,KAAKg1B,GAA0B9tC,IAClE+6B,EAAYpvB,KAAK,CAAE,IAAO3L,EAAK,MAAS8tC,GAAyB9tC,GAAKkM,QAIxE4uB,EAAmBlzB,SAAQgf,IAC1BA,EAAElb,OAAO9D,SAAQgH,IAChBosB,EAAMrvB,KAAK,gBAACysB,GAAD,CAAUp4B,IAAK4mB,EAAE5mB,IAAM4O,EACjC4hB,eAAgBlY,EAChB+f,WAAY0C,EAAY/hB,MAAK1U,GAAMA,EAAGtE,KAAO4mB,EAAE5mB,MAAKkM,MACpDosB,YAAa1pB,EACb2pB,SAAU3R,EAAE5mB,IACZw4B,aAAe5R,EAAE5b,MAAMC,OAAS,EAAI2b,EAAE5b,MAAM,GAAK,OALlD,GADD,IAYD,MAAM+iC,EAAgBp3B,EAAMuC,KAAKC,UAAU/B,UAcrCmuB,EAAO,CACZtO,UAAW,EACXC,YAAa,EACbsO,WAAY,GAGPC,EAAQ,CACbxO,UAAW,EACXC,YAAa,EACbsO,WAAY,GAsSb,OAnSIuI,EAAczJ,OAAOoB,eAAiB,IACzCH,EAAKtO,UAAY8W,EAAczJ,OAAOoB,gBAAkBqI,EAAcpI,OAAO70B,UAAUpF,OAAOqiC,EAAcpI,OAAO70B,UAAUgW,OAAO3c,QAAQ,SAAW,GACvJo7B,EAAKrO,YAAc6W,EAAczJ,OAAOoB,eACxCH,EAAKC,WAAaD,EAAKtO,UAAYsO,EAAKrO,YAAc,IAEtDuO,EAAMxO,UAAY8W,EAAczJ,OAAOoB,gBAAkBqI,EAAcpI,OAAOj1B,SAAShF,OAAOqiC,EAAcpI,OAAOj1B,SAASoW,OAAO3c,QAAQ,SAAW,GACtJs7B,EAAMvO,YAAc6W,EAAczJ,OAAOoB,eACzCD,EAAMD,WAAaC,EAAMxO,UAAYwO,EAAMvO,YAAc,KAIxC,gCACjB,uBAAKta,MAAO,CACXgB,SAAU,SACV+C,IAAK,OACLC,KAAM,OACN/C,OAAQ,EACRmE,gBAAiB,UAIf8X,EAAkB,uBAAKld,MAAO,CAAES,WAAY,OAAQ2e,aAAc,OAAQnf,UAAW,OAAQxO,MAAO,QACpG2sB,GACO,MAKV,uBAAKpe,MAAO,CACXgR,SAAU,IACVnf,OAAQ,WAGR,uBAAKmO,MAAO,CACX4D,UAAW,QACX0iB,cAAe,OACftd,WAAY,OACZhI,SAAU,SACVC,OAAQ,EACR8C,IAAK,OACLqB,gBAAiB,UAEjB,gBAACvE,EAAA,EAAD,CAAQjC,QAAS,IAAMwpB,EAAc,CAAEjvB,KAAM63B,GAAoBlJ,6BAA8B1uB,QAAS,KACvG4G,MAAQmoB,EAAWP,aAAe,CAACxiB,gBAAiB,OAAQnG,MAAO,UAAY,CAC9EmG,gBAAkB+rB,EAAczJ,OAAOoB,eAAiB,EAAK,UAAc,UAC3E7pB,MAAO,QACPsC,WAAY,UAJd,6BAUD,gBAACynB,GAAA,EAAD,CAAgBC,UAAWhiB,GAAAA,GAC1B,gBAACuG,GAAA,EAAD,CAAO5b,KAAK,SACX,gBAAC6b,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,kBACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,cACA,gBAACvb,GAAA,EAAD,CAAWub,MAAM,UAAUjB,GAAcnkB,MAAzC,KACA,gBAAC6J,GAAA,EAAD,CAAWub,MAAM,UAAjB,sBAGF,gBAACtb,GAAA,EAAD,KAEC,gBAACF,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,CAAW4b,QAAS,GACnB,oDAGF,gBAAC7b,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,yBACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BiI,EAAczJ,OAAOoB,iBACnD,gBAACnb,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcoJ,eACvE,gBAAC1jB,GAAA,EAAD,CAAWub,MAAM,YAGlB,gBAACxb,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,0CACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BiI,EAAczJ,OAAO4J,iBAAiB1I,WAAWzV,QAAQ,GAAvF,SAA8F,2BAA9F,eAA0Gge,EAAczJ,OAAO4J,iBAAiBjX,UAAhJ,YAA6J8W,EAAczJ,OAAO4J,iBAAiBhX,YAAnM,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcqJ,kBACvE,gBAAC3jB,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAA/C,IAAgElB,GAAcsJ,wBAG/E,gBAAC7jB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,2CACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BP,EAAKC,WAAWzV,QAAQ,GAAtD,SAA6D,2BAA7D,eAAyEwV,EAAKtO,UAA9E,YAA2FsO,EAAKrO,YAAhG,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcuJ,SACvE,gBAAC7jB,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAA/C,IAAgElB,GAAcwJ,eAG/E,gBAAC/jB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,6BACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BL,EAAMD,WAAWzV,QAAQ,GAAvD,SAA8D,2BAA9D,eAA0E0V,EAAMxO,UAAhF,YAA6FwO,EAAMvO,YAAnG,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcyJ,UACvE,gBAAC/jB,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAA/C,IAAgElB,GAAc0J,gBAG/E,gBAACjkB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,CAAW4b,QAAS,GACnB,qCAMF,gBAAC7b,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,6DACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BiI,EAAczJ,OAAOkK,6BAA6BhJ,WAAWzV,QAAQ,GAAnG,SAA0G,2BAA1G,eAAsHge,EAAczJ,OAAOkK,6BAA6BvX,UAAxK,YAAqL8W,EAAczJ,OAAOkK,6BAA6BtX,YAAvO,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAc2J,8BACvE,gBAACjkB,GAAA,EAAD,CAAWub,MAAM,UAAjB,MAID,gBAACxb,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,2DACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BiI,EAAczJ,OAAOmK,2BAA2BjJ,WAAWzV,QAAQ,GAAjG,SAAwG,2BAAxG,eAAoHge,EAAczJ,OAAOmK,2BAA2BxX,UAApK,YAAiL8W,EAAczJ,OAAOmK,2BAA2BvX,YAAjO,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAc4J,4BACvE,gBAAClkB,GAAA,EAAD,CAAWub,MAAM,UAAjB,MAID,gBAACxb,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,qEACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BiI,EAAczJ,OAAOoK,sBAAsBlJ,WAAWzV,QAAQ,GAA5F,SAAmG,2BAAnG,eAA+Gge,EAAczJ,OAAOoK,sBAAsBzX,UAA1J,YAAuK8W,EAAczJ,OAAOoK,sBAAsBxX,YAAlN,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAc6J,uBACvE,gBAACnkB,GAAA,EAAD,CAAWub,MAAM,UAAjB,MAGD,gBAACxb,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,uEACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BiI,EAAczJ,OAAOqK,wBAAwBnJ,WAAWzV,QAAQ,GAA9F,SAAqG,2BAArG,eAAiHge,EAAczJ,OAAOqK,wBAAwB1X,UAA9J,YAA2K8W,EAAczJ,OAAOqK,wBAAwBzX,YAAxN,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAc8J,yBACvE,gBAACpkB,GAAA,EAAD,CAAWub,MAAM,UAAjB,MAID,gBAACxb,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,CAAW4b,QAAS,GACnB,wCAGF,gBAAC7b,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,uBACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BiI,EAAczJ,OAAOsK,cAAcpJ,WAAWzV,QAAQ,GAApF,SAA2F,2BAA3F,eAAuGge,EAAczJ,OAAOsK,cAAc3X,UAA1I,YAAuJ8W,EAAczJ,OAAOsK,cAAc1X,YAA1L,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAc+J,eACvE,gBAACrkB,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAA/C,IAAgElB,GAAcgK,qBAI/E,gBAACvkB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,gDACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BiI,EAAczJ,OAAO4B,WAAWV,WAAWzV,QAAQ,GAAjF,SAAwF,2BAAxF,eAAoGge,EAAczJ,OAAO4B,WAAWjP,UAApI,YAAiJ8W,EAAczJ,OAAO4B,WAAWhP,YAAjL,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcqB,YACvE,gBAAC3b,GAAA,EAAD,CAAWub,MAAM,UAAjB,MAGD,gBAACxb,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,8CACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BiI,EAAczJ,OAAOwK,wBAAwBtJ,WAAWzV,QAAQ,GAA9F,SAAqG,2BAArG,eAAiHge,EAAczJ,OAAOwK,wBAAwB7X,UAA9J,YAA2K8W,EAAczJ,OAAOwK,wBAAwB5X,YAAxN,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAckK,0BACvE,gBAACxkB,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAA/C,IAAgElB,GAAcmK,gCAG/E,gBAAC1kB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,sFACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BiI,EAAczJ,OAAO2K,0BAA0BzJ,WAAWzV,QAAQ,GAAhG,SAAuG,2BAAvG,eAAmHge,EAAczJ,OAAO2K,0BAA0BhY,UAAlK,YAA+K8W,EAAczJ,OAAO2K,0BAA0B/X,YAA9N,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcoK,2BACvE,gBAAC1kB,GAAA,EAAD,CAAWub,MAAM,UAAjB,MAGD,gBAACxb,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,2FACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BiI,EAAczJ,OAAO4K,yBAAyB1J,WAAWzV,QAAQ,GAA/F,SAAsG,2BAAtG,eAAkHge,EAAczJ,OAAO4K,yBAAyBjY,UAAhK,YAA6K8W,EAAczJ,OAAO4K,yBAAyBhY,YAA3N,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcsK,gCACvE,gBAAC5kB,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAA/C,IAAgElB,GAAcuK,sCAI/E,gBAAC9kB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,iFACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BiI,EAAczJ,OAAO+K,uBAAuB7J,WAAWzV,QAAQ,GAA7F,SAAoG,2BAApG,eAAgHge,EAAczJ,OAAO+K,uBAAuBpY,UAA5J,YAAyK8W,EAAczJ,OAAO+K,uBAAuBnY,YAArN,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcwK,wBACvE,gBAAC9kB,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAA/C,IAAgElB,GAAcyK,8BAG/E,gBAAChlB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,4FACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BiI,EAAczJ,OAAOiL,kCAAkC/J,WAAWzV,QAAQ,GAAxG,SAA+G,2BAA/G,eAA2Hge,EAAczJ,OAAOiL,kCAAkCtY,UAAlL,YAA+L8W,EAAczJ,OAAOiL,kCAAkCrY,YAAtP,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAc0K,mCACvE,gBAAChlB,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAA/C,IAAgElB,GAAc2K,yCAI/E,gBAACllB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,kCACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BiI,EAAczJ,OAAOmL,iBAAiBjK,WAAWzV,QAAQ,GAAvF,SAA8F,2BAA9F,eAA0Gge,EAAczJ,OAAOmL,iBAAiBxY,UAAhJ,YAA6J8W,EAAczJ,OAAOmL,iBAAiBvY,YAAnM,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAc4K,kBACvE,gBAACllB,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAA/C,IAAgElB,GAAc6K,wBAG/E,gBAACplB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,CAAW4b,QAAS,GACnB,uCAIF,gBAAC7b,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,gCACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BiI,EAAczJ,OAAO6F,aAAa3E,WAAWzV,QAAQ,GAAnF,SAA0F,2BAA1F,eAAsGge,EAAczJ,OAAO6F,aAAalT,UAAxI,YAAqJ8W,EAAczJ,OAAO6F,aAAajT,YAAvL,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcsF,cACvE,gBAAC5f,GAAA,EAAD,CAAWub,MAAM,UAAjB,MAGD,gBAACxb,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,uCACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BiI,EAAczJ,OAAOwI,oBAAoBtH,WAAWzV,QAAQ,GAA1F,SAAiG,2BAAjG,eAA6Gge,EAAczJ,OAAOwI,oBAAoB7V,UAAtJ,YAAmK8W,EAAczJ,OAAOwI,oBAAoB5V,YAA5M,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAciI,qBACvE,gBAACviB,GAAA,EAAD,CAAWub,MAAM,UAAjB,MAED,gBAACxb,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,kCACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BiI,EAAczJ,OAAOqL,eAAenK,WAAWzV,QAAQ,GAArF,SAA4F,2BAA5F,eAAwGge,EAAczJ,OAAOqL,eAAe1Y,UAA5I,YAAyJ8W,EAAczJ,OAAOqL,eAAezY,YAA7L,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAc8K,gBACvE,gBAACplB,GAAA,EAAD,CAAWub,MAAM,UAAjB,MAED,gBAACxb,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,kCACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BiI,EAAczJ,OAAOsL,eAAepK,WAAWzV,QAAQ,GAArF,SAA4F,2BAA5F,eAAwGge,EAAczJ,OAAOsL,eAAe3Y,UAA5I,YAAyJ8W,EAAczJ,OAAOsL,eAAe1Y,YAA7L,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAc+K,gBACvE,gBAACrlB,GAAA,EAAD,CAAWub,MAAM,UAAjB,MAGD,gBAACxb,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,kCACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BiI,EAAczJ,OAAOuL,4BAA4BrK,WAAWzV,QAAQ,GAAlG,SAAyG,2BAAzG,eAAqHge,EAAczJ,OAAOuL,4BAA4B5Y,UAAtK,YAAmL8W,EAAczJ,OAAOuL,4BAA4B3Y,YAApO,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcgL,6BACvE,gBAACtlB,GAAA,EAAD,CAAWub,MAAM,UAAjB,MAGD,gBAACxb,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,kCACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BiI,EAAczJ,OAAOwL,4BAA4BtK,WAAWzV,QAAQ,GAAlG,SAAyG,2BAAzG,eAAqHge,EAAczJ,OAAOwL,4BAA4B7Y,UAAtK,YAAmL8W,EAAczJ,OAAOwL,4BAA4B5Y,YAApO,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAciL,6BACvE,gBAACvlB,GAAA,EAAD,CAAWub,MAAM,UAAjB,MAID,gBAACxb,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,uDACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BiI,EAAczJ,OAAOyL,mBAAmBvK,WAAWzV,QAAQ,GAAzF,SAAgG,2BAAhG,eAA4Gge,EAAczJ,OAAOyL,mBAAmB9Y,UAApJ,YAAiK8W,EAAczJ,OAAOyL,mBAAmB7Y,YAAzM,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAckL,oBACvE,gBAACxlB,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcmL,0BAGxE,gBAAC1lB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,8DACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BiI,EAAczJ,OAAO2L,iBAAiBzK,WAAWzV,QAAQ,GAAvF,SAA8F,2BAA9F,eAA0Gge,EAAczJ,OAAO2L,iBAAiBhZ,UAAhJ,YAA6J8W,EAAczJ,OAAO2L,iBAAiB/Y,YAAnM,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcoL,kBACvE,gBAAC1lB,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcqL,wBAGxE,gBAAC5lB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,CAAW3N,MAAO,CAACkE,SAAU,SAAUqlB,QAAS,GAAhD,IAAoD,sLAOxD,uBAAKvpB,MAAO,CAAEkE,SAAU,QAASN,UAAW,SAC3C,yBAAG,2DAAH,MAGD,uBAAK5D,MAAO,CAAEkE,SAAU,QAASN,UAAW,SAC3C,yBAAG,0NAAH,MAGD,uBAAK5D,MAAO,CAAEkE,SAAU,QAASN,UAAW,SAC3C,yBAAG,+MAAH,IAA6L,qBAAG3a,K9Ihf5K,6B8Igf4LkiC,OAAO,UAA1B,qCAA7L,MAGD,uBAAKnrB,MAAO,CAAEkE,SAAU,WAAYN,UAAW,SAC9C,wDAA+B,qBAAG3a,K9IrfI,gD8Iqf8BkiC,OAAO,UAA5C,mDAA/B,gFAKF,qBAAGzjC,GAAG,qBAAqBsY,MAAO,CAAEsB,QAAS,UAS9C,CCjgBM,SAASiyB,KAAc,8CAC7B,MAAM,MAAEx5B,EAAF,SAASmE,GAAalR,EAAAA,WAAiBgR,IAEvC1D,EAAgCrN,MAAO7J,EAA4CU,EAA0ByX,EAAyBC,KAC3I,MAAM4hB,QAA0B8T,GAAsBA,GAAen3B,EAAMuC,KAAKC,UAA1B20B,CAA4D9tC,EAAKU,EAAOyX,EAASC,IACvI0C,EAAS,CAAE/E,KAAM8D,GAAYQ,mBAAoBrE,QAASgkB,GAA1D,EAGK1hB,EAAsCzO,UAE3C,MAAMmwB,QAA0B8T,GAAsBA,GAAkBn3B,EAAMuC,KAAKC,UAAkCnZ,IACrH8a,EAAS,CAAE/E,KAAM8D,GAAYQ,mBAAoBrE,QAASgkB,GAA1D,EAGD,GAAIrjB,EAAMuC,KAAKG,QACd,OAAO,gBAAC,GAAD,MAER,MAAM4uB,EAAiBtxB,EAAMuC,KAAKC,UAAU/B,UAGtC8nB,EAAoB,GAC1B+I,SAAAA,EAAgB3D,OAAOjtB,MAAM9Q,KAAIyG,IAChCkyB,EAAWvzB,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE1I,IAA1C,IAID,IAAI66B,EAAuB,GAC3B,UAAAxoB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8ByE,WAA9B,mBAAmChR,aAAnC,SAA0C6F,KAAIyG,IAC7CmyB,EAAcxzB,KAAK,CAAEO,MAAOc,EAAGtM,MAAOw+B,EAAWlmB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAzE,IAID,IAAI0+B,EAAiB,GACjBD,EAAcl0B,OAAS,IAC1Bm0B,EAAiBD,EAAc54B,KAAIqgB,GAClCA,EAAElmB,SAKJ,MAAM2+B,EAAyB,GAC3BF,EAAcl0B,OAAS,EAC1Bg9B,SAAAA,EAAgB3D,OAAO/iC,WAAWwL,QAAO6Z,GAAKwY,EAAej8B,SAASyjB,EAAE0Y,SAAQ/4B,KAAIyG,IACnFqyB,EAAgB1zB,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE+qB,YAA/C,IAGDkQ,SAAAA,EAAgB3D,OAAO/iC,WAAWgF,KAAIyG,IACrCqyB,EAAgB1zB,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE+qB,YAA/C,IAKF,IAAIwH,EAA4B,GAChC,UAAA5oB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8BoE,gBAA9B,mBAAwC3Q,aAAxC,SAA+C6F,KAAIyG,IAClDuyB,EAAmB5zB,KAAK,CAAEO,MAAOc,EAAGtM,MAAO2+B,EAAgBrmB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAnF,IAID,IAAI8+B,EAAsB,GACtBD,EAAmBt0B,OAAS,IAC/Bu0B,EAAsBD,EAAmBh5B,KAAIqgB,GAC5CA,EAAElmB,SAKJ,MAAM++B,EAAoB,GACtBF,EAAmBt0B,OAAS,EAC/Bg9B,SAAAA,EAAgB3D,OAAO/H,KAAKxvB,QAAO6Z,GAAK4Y,EAAoBr8B,SAASyjB,EAAEmR,cAAaxxB,KAAIyG,IACvFyyB,EAAW9zB,KAAK,CAAEO,MAAOc,EAAEiD,gBAAiBvP,MAAOsM,EAAE+rB,WAArD,IAGDkP,SAAAA,EAAgB3D,OAAO/H,KAAKh2B,KAAIyG,IAC/ByyB,EAAW9zB,KAAK,CAAEO,MAAOc,EAAEiD,gBAAiBvP,MAAOsM,EAAE+rB,WAArD,IAKF,IAAI2G,EAAuB,GAC3B,UAAA/oB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8B+D,WAA9B,mBAAmCtQ,aAAnC,SAA0C6F,KAAIyG,IAC7C0yB,EAAc/zB,KAAK,CAAEO,MAAOc,EAAGtM,MAAO++B,EAAWzmB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAzE,IAQD,MAAMi/B,EAAsB,GAC5BsI,SAAAA,EAAgB3D,OAAO1E,MAAMr5B,KAAIyG,IAChC2yB,EAAah0B,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE1I,IAA5C,IAID,IAAIu7B,EAA4B,GAChC,UAAAlpB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8B+2B,gBAA9B,mBAAwCtjC,aAAxC,SAA+C6F,KAAIyG,IAAK,MACvD6yB,EAAmBl0B,KAAK,CACvBO,MAAOc,EACPtM,MAAK,UAAEi/B,EAAa3mB,MAAK4N,GAAKA,EAAE1a,OAASc,WAApC,aAAE,EAAsCtM,OAF9C,IAOD,IAAIo/B,EAA6B,GACjC,UAAAnpB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8B62B,sBAA9B,mBAA8CpjC,aAA9C,SAAqD6F,KAAIyG,IACxD8yB,EAAoBn0B,KAAK,CAAEO,MAAOc,EAAGtM,MAAOi/B,EAAa3mB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAjF,IAKD,MAAMq/B,EAAwB,GAC9BkI,SAAAA,EAAgB3D,OAAOrxB,KAAK1M,KAAIyG,IAC3BA,EAAE1I,IAAM,MACXy7B,EAAep0B,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE1I,IAC9C,IAIF,MAAM27B,EAAyB,GAC/BgI,SAAAA,EAAgB3D,OAAOrxB,KAAK1M,KAAIyG,IAC/BizB,EAAgBt0B,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE1I,IAA/C,IAID,IAAI07B,EAA2B,GAC/B,UAAArpB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8B82B,eAA9B,mBAAuCrjC,aAAvC,SAA8C6F,KAAIyG,IAAK,MACtDgzB,EAAkBr0B,KAAK,CACtBO,MAAOc,EACPtM,MAAK,UAAEq/B,EAAe/mB,MAAK4N,GAAKA,EAAE1a,OAASc,WAAtC,aAAE,EAAwCtM,OAFhD,IAOD,IAAIw/B,EAA4B,GAChC,UAAAvpB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8B42B,qBAA9B,mBAA6CnjC,aAA7C,SAAoD6F,KAAIyG,IACvDkzB,EAAmBv0B,KAAK,CAAEO,MAAOc,EAAGtM,MAAOu/B,EAAgBjnB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAnF,IAID,MAAOy/B,EAAQC,GAAax2B,EAAAA,SAAes2B,EAAmBj1B,OAAS,EAAI,iBAAmB,YAE9F,OACC,gCACC,gBAACyS,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,YACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOy+B,EACPmB,QAASpB,EACTzD,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAaw1B,GAAAA,IAAAA,KAEb52B,EAAU42B,GAAAA,IAAAA,IAAkCn1B,EAC5C,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAOX,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,iBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAO6+B,EACPe,QAASjB,EACT5D,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAaw1B,GAAAA,SAAAA,KAEb52B,EAAU42B,GAAAA,SAAAA,IAAuCn1B,EACjD,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAOX,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,YACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOg/B,EACPY,QAASb,EACThE,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAaw1B,GAAAA,IAAAA,KAEb52B,EAAU42B,GAAAA,IAAAA,IAAkCn1B,EAC5C,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAMX,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,gBACA,gBAACwe,GAAD,CACCC,YAAa,CAAC,WAAY,kBAC1BC,aAAckD,EACdlW,UAAWjd,IACVozB,EAAUpzB,EAAV,KAMS,YAAVmzB,EACD,gCACC,gBAACziB,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,iBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOs/B,EACPM,QAASP,EAAe9Y,UACxBwU,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAaw1B,GAAAA,QAAAA,KAEb52B,EAAU42B,GAAAA,QAAAA,IAAsCn1B,EAChD,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAMX,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,kBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOm/B,EACPS,QAASX,EACTlE,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAaw1B,GAAAA,SAAAA,KAEb52B,EAAU42B,GAAAA,SAAAA,IAAuCn1B,EACjD,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,eAOZ,gCACC,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,uBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOw/B,EACPI,QAASL,EAAgBhZ,UACzBwU,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAaw1B,GAAAA,cAAAA,KAEb52B,EAAU42B,GAAAA,cAAAA,IAA4Cn1B,EACtD,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAMX,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,wBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOo/B,EACPQ,QAASX,EACTlE,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAaw1B,GAAAA,eAAAA,KAEb52B,EAAU42B,GAAAA,eAAAA,IAA6Cn1B,EACvD,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,eAwBf,C,yHC5XM,MAAMu0B,WAA0BxmC,EAAAA,UAEnClE,YAAY6W,GACRwG,MAAMxG,GADS,4BAUQ,KACvBzW,KAAKu7B,SAAS,CAAEhzB,MAAO1I,OAAO0jB,WAAY1b,OAAQhI,OAAO4oB,aAAzD,IAXe,kBAsBV,IAED,gCACI,gBAACsf,GAAD,SAtBR/nC,KAAK6Q,MAAQ,CACTtI,MAAO,EACPV,OAAQ,EAGf,CAMM2zB,uBACH37B,OAAO47B,oBAAoB,SAAUz7B,KAAK07B,iBAC7C,CAEMC,oBACH97B,OAAO4Q,iBAAiB,SAAUzQ,KAAK07B,iBAC1C,ECUOr0B,GAAgBE,GAA4BA,EAAG8C,WAAWrI,OCiFtE,MAca6J,GAAmC,IAC5CZ,GAbH8yB,cAAe,CAAE7jC,IAAK,gBAAiBkM,MAAO,kBAC9C43B,eAAgB,CAAE9jC,IAAK,iBAAkBkM,MAAO,mBAChD63B,QAAS,CAAE/jC,IAAK,UAAWkM,MAAO,YAClC83B,SAAU,CAAEhkC,IAAK,WAAYkM,MAAO,aACpC+3B,SAAU,CAAEjkC,IAAK,WAAYkM,MAAO,sBACpC6F,YAAa,CAAE/R,IAAK,cAAekM,MAAO,gBAC1C8F,WAAY,CAAEhS,IAAK,aAAckM,MAAO,cACxC+F,WAAY,CAAEjS,IAAK,aAAckM,MAAO,YACxCg4B,qBAAsB,CAAElkC,IAAK,uBAAwBkM,MAAO,yBAC5D2F,eAAgB,CAAE7R,IAAK,iBAAkBkM,MAAO,qBChI1C,IAAKiJ,GAUAC,GCbG,SAAS,KACtB,OAAO,IAAIE,OAAO,IAA0B,6CAC9C,E,SDCYH,GAAAA,EAAAA,EAAAA,KAAAA,GAAAA,OAAAA,EAAAA,EAAAA,MAAAA,GAAAA,QAAAA,EAAAA,EAAAA,UAAAA,GAAAA,W,EAAAA,KAAAA,GAAAA,CAAAA,I,SAUAC,GAAAA,EAAAA,EAAAA,KAAAA,GAAAA,OAAAA,EAAAA,EAAAA,MAAAA,GAAAA,QAAAA,EAAAA,EAAAA,UAAAA,GAAAA,YAAAA,EAAAA,EAAAA,YAAAA,GAAAA,a,EAAAA,KAAAA,GAAAA,CAAAA,IEJZ,IAAIQ,GAAqB,KACrBC,GAAW,CAAC,EACZ9Q,GAAO,CACPo/B,QAAS,GA2Eb,SAASruB,GAAyBC,EAAyBC,GACvD,MAAM1R,EAAKgO,KASX,OARAuD,GAASvR,GAAM,CAAC,EAChBuR,GAASvR,GAAI2R,QAAU,IAAInT,SAAQ,CAACwC,EAASvC,KAZjD,IAAc8B,IAaD,CAAEP,KAAIyR,OAAMC,WAZrBJ,GAAOM,YAAYrR,GAcfgR,GAASvR,GAAIgB,QAAUA,EACvBuQ,GAASvR,GAAIvB,OAASA,CAAtB,IAGG8S,GAASvR,GAAI2R,OACvB,CC5EM,MAaMo6B,GAA2BxmC,UDhBpC9E,GAAKo/B,QCiBS,KDfTx+B,OAAM,QAKPnF,QAAQC,IAAI,sBAEZmV,GAASA,IAAU,IAAIU,GAKvBV,GAAOW,iBAAiB,WAAYC,IAChC,MAAQzR,MAAM,GAAET,EAAF,KAAMyR,EAAN,QAAYC,IAAcQ,EAM3B,MAEL,UAAAX,GAASvR,UAAT,SAAcgB,QAAQ0Q,GAK9BH,GAASvR,QAAMtC,CAAf,IAMJ4T,GAAOW,iBAAiB,gBAAiBC,IACrC,MAAQzR,MAAM,GAAET,EAAF,KAAMyR,EAAN,QAAYC,IAAcQ,EAOhChW,QAAQD,MAAM,oBAAqByV,GACnCH,GAASvR,GAAIvB,OAAOiT,GAK5BH,GAASvR,QAAMtC,CAAf,KA7CJxB,QAAQC,IAAI,2BCenB,IAGC,aD6DSqV,GAAuCX,GAAAA,KAAwB,MC9DxE3U,QAAQC,IAAI,8BACCiW,GAAUC,EAAOA,EAAMlB,QAGpC,CAFC,MACDjV,QAAQD,MAAM,qBACd,GAGWqW,GAAgBD,IAC5B,MAAME,EAAwB,CAAC3J,EAAmB4J,KACjD,IAAKA,GAAoC,IAAtBA,EAAW7L,OAC7B,OAAQ,IAAI8L,IAEb,GAAIJ,EAAMlB,QACT,OAAQ,IAAIsB,IAEb,IAAIC,EAAY,IAAID,IAIpB,OAHAC,EAAUC,IAAIH,EAAW,GAAGhP,MAE5B6O,EAAQO,GAAUP,EAAVO,CAAiBhK,EAAW,CAAC4J,EAAW,GAAGhP,OAC5CkP,CAAP,EAOD,OAJAL,EAAM1J,QAAU,CAAC,EACjB0J,EAAMQ,cAAiBN,EAAsBlF,GAAAA,IAAAA,IAA6BgF,EAAMS,UAAUk5B,QAAQhM,OAAOjtB,OACzGV,EAAMW,mBAAqBT,EAAsBlF,GAAAA,SAAAA,IAAkCgF,EAAMS,UAAUk5B,QAAQhM,OAAO/iC,YAE3G,IAAMoV,EAAb,EASKD,GAAY7M,MAAO8M,EAA8BY,KACtD,IACC,MAAMxS,QDgCD,SAAewS,GAGlB,OAAOzU,QAAQyU,IAAI,CACf1C,GAAwB0C,GACxBzC,GAAkCyC,KAEjC/R,MAAKgS,GACK1B,GAAuDX,GAAAA,MAAyB,CACnFoC,MACAG,QAASF,EAAQ,GACjBG,QAASH,EAAQ,GACjB2sB,QAASp/B,GAAKo/B,WAI7B,CChDoB1tB,CAAiBc,GAE9BV,EAAwB,CAAC3J,EAAmB4J,KACjD,IAAKA,GAAoC,IAAtBA,EAAW7L,OAC7B,OAAQ,IAAI8L,IAEb,GAAIQ,EACH,OAAQ,IAAIR,IAEb,IAAIC,EAAY,IAAID,IAIpB,OAHAC,EAAUC,IAAIH,EAAW,GAAGhP,MAE5B6O,EAAQO,GAAUP,EAAVO,CAAiBhK,EAAW,CAAC4J,EAAW,GAAGhP,OAC5CkP,CAAP,EASD,OANAL,EAAMQ,cAAiBN,EAAsBlF,GAAAA,IAAAA,IAA6B5M,EAAKqS,UAAUk5B,QAAQhM,OAAOjtB,OAClGV,EAAMW,mBAAqBT,EAAsBlF,GAAAA,SAAAA,IAAkC5M,EAAKqS,UAAUk5B,QAAQhM,OAAO/iC,YACvHoV,EAAMlB,QAAU8B,EAChBZ,EAAMoB,WAAahT,EAAKgT,WACxBpB,EAAMS,UAAYrS,EAAKqS,UAEhBT,CAIP,CAHC,MAED,OADAnW,QAAQD,MAAM,2BACPoW,CACP,GAGWqB,GAAmBnO,UAC/B,IACC,MAAM9E,QDuBkBkT,ECvBgBtB,EAAM1J,QDwBrC6I,GAA+DX,GAAAA,UAA6B,CAC/F8C,iBACAksB,QAASp/B,GAAKo/B,WCxBpB,OADAxtB,EAAMS,UAAYrS,EACX,IAAI4R,EAIX,CAHC,MAED,OADAnW,QAAQD,MAAM,kCACPoW,CACP,CDiBK,IAAmBsB,CCjBxB,EAGWf,GAAaP,GAAiC,CAAC3W,EAAuCU,EAA0ByX,EAAyBC,KACrJ,MAAMnL,EAAmB5G,OAAO8I,OAAO,CAAC,EAAGwH,EAAM1J,SAC3CvB,EAA2B,iBAAVhL,EACpB,CAACA,GACDA,EAIG2X,EAA6BF,IAAaA,EAAQzM,SAAST,OAAS,EAAKkN,EAAQnM,SAAWmM,IAAY,IAAIpN,EAOlH,OANAsN,EAAY1M,KAAKD,GAEjBuB,EAAQjN,GAAQ,CAAEU,MAAOgL,EAAQ0M,gBAAepN,MAAOqN,EAAYrN,OAEnE2L,EAAM1J,QAAUA,EAET,IAAI0J,EAAX,EAIY2B,GAAe,CAAC3B,EAA8B3W,EAAuCU,EAAgB0X,KACjH,MAAMnL,EAAmB5G,OAAO8I,OAAO,CAAC,EAAGwH,EAAM1J,SAC3CsL,EAAwB7X,GAAS,KACjCyX,EAAUpN,EAAAA,YAA0BkC,EAASjN,GAC7C0L,EAASyM,EAAQzM,SACjB8M,EAAYD,EAAgB7M,EAAOqB,QAAOC,GAAKA,GAAKuL,IAAgB,KAEpEE,EAAIN,EAAQnM,UAAY,IAAIjB,EAWlC,OAVIyN,GACHC,EAAE9M,KAAK6M,GAERvL,EAAQjN,GAAQ,CAACU,MAAO+X,EAAE/M,SAAU0M,gBAAgBpN,MAAOyN,EAAEzN,OAEtC,IAAnByN,EAAEzN,MAAMC,eACJgC,EAAQjN,GAGhB2W,EAAM1J,QAAUA,EACT,IAAI0J,EAAX,E,IC1II45B,I,SAAAA,GAAAA,EAAAA,EAAAA,6BAAAA,GAAAA,+BAAAA,EAAAA,EAAAA,yBAAAA,GAAAA,2BAAAA,EAAAA,EAAAA,sBAAAA,GAAAA,uB,EAAAA,KAAAA,GAAAA,CAAAA,IAgBL,MAAMt3B,GAAsB,CAC3B3F,UAAW,GAGNmxB,GAAU,CAAC9tB,EAAcsD,KAC9B,MAAM,KAAElE,GAASkE,EAEjB,OAAQlE,GACP,KAAKw6B,GAAmB7L,6BACvB,MAAO,IAAK/tB,EAAYrD,UAAW2G,EAAOjE,SAE3C,KAAKu6B,GAAmB5L,yBACxB,KAAK4L,GAAmB3L,sBACvB,MAAO,IAAKjuB,EAAYrD,UAAW,GAEpC,QACC,OAAOqD,EATT,EAaD,IAAIkuB,GAwIA,CAAC,EAEE,SAAS2L,KACf,MAAM,MAAE75B,EAAF,SAASmE,GAAalR,EAAAA,WAAiBgR,KACtCmqB,EAAYC,GAAiBp7B,EAAAA,WAAiB66B,GAASxrB,KAEvD6gB,EAAiBC,GAAkBnwB,EAAAA,UAAe,IAGlDu2B,EAAQC,GAAax2B,EAAAA,SAAe,OACpC0+B,EAAuBC,GAA4B3+B,EAAAA,SAAe,IAClE4+B,EAAwBC,GAA6B7+B,EAAAA,SAAe,IACpE8+B,EAAuBC,GAA4B/+B,EAAAA,SAAe,IAClEg/B,EAAuBC,GAA4Bj/B,EAAAA,SAAe,IAClEk/B,EAAoBC,GAAyBn/B,EAAAA,SAAe,IAC5Do/B,EAAoBC,GAAyBr/B,EAAAA,SAAe,IAC5Ds/B,EAAqBC,GAA0Bv/B,EAAAA,SAAe,IAC9Dw/B,EAAmBC,GAAwBz/B,EAAAA,SAAe,GAO3D0O,EAAqCzO,MAAO7J,EAA2CU,KAE5F,MAAMs5B,QAA0ByW,GAAqBA,GAAiB95B,EAAMuC,KAAKC,UAAwCnZ,EAAKU,IAC9Hoa,EAAS,CAAE/E,KAAM8D,GAAYQ,mBAAoBrE,QAASgkB,GAA1D,EAuDD,GApDApwB,EAAAA,WAAgB,KACfkR,EAAS,CAAE/E,KAAM8D,GAAYM,8BAkB7BrX,QAAQyU,IAAI,CAjBoB1N,WAC/Bg7B,GAAcyL,cAAgBv9B,GAA4B,2BAC1D8xB,GAAc6L,iBAAmB39B,GAA4B,+BAC7D8xB,GAAc8L,iBAAmB59B,GAA4B,8BAC7D8xB,GAAc+L,0BAA4B79B,GAA4B,yCACtE8xB,GAAcgM,kBAAoB99B,GAA4B,+BAC9D8xB,GAAciM,kBAAoB/9B,GAA4B,+BAC9D8xB,GAAckM,qCAAuCh+B,GAA4B,sDACjF8xB,GAAcmM,aAAej+B,GAA4B,0BACzD8xB,GAAcoM,mBAAqBl+B,GAA4B,gCAA/D,EAQYmyB,GALSr7B,WACrB,MAAMnJ,QAAc+vC,GAA6B95B,EAAMuC,KAAKC,WAC5D2B,EAAS,CAAE/E,KAAM8D,GAAYK,uBAAwBlE,QAAStV,GAA9D,EAGuCykC,KACjC,KFlGLvvB,IAAUA,GAAOqkB,YACjBrkB,GAAS,KACTpV,QAAQC,IAAI,uBEiGb,IAEC,IAEHmJ,EAAAA,WAAgB,KACf,GAA4B,GAAxBm7B,EAAWzxB,UACd,OAED,IAAI8xB,EAAM8L,EAAO,QAAY5M,OAAOzD,sBAIOh3B,WAC1C,IACC,MAAM9E,QAAa+7B,GAAAA,mCAA6CsE,GALpD,EAKkEL,EAAWzxB,WACrFvO,EAAKg8B,eACRvgC,QAAQD,MAAMwE,EAAKg8B,cACnBiE,EAAc,CAAEjvB,KAAMw6B,GAAmB3L,yBAE1CI,EAAc,CAAEjvB,KAAMw6B,GAAmB5L,2BAClC3D,GAAoBj8B,EAAK85B,MAAO95B,EAAK2K,SAAUsxB,GAA8Bj8B,EAAK64B,UAAW,qBAGpG,CAFC,MACDoH,EAAc,CAAEjvB,KAAMw6B,GAAmB3L,uBACzC,GAGFuM,EAAoC,GAGlC,CAACpM,EAAWzxB,YAEXqD,EAAMuC,KAAKG,UAAY1C,EAAMuC,KAAKC,UAAU/B,UAC/C,OAAO,gBAAC,GAAD,MAWR,IAAI0jB,EAAqB,GACrBC,EAAc,GACdC,EAAQ,GAEZ,IAAK,MAAMh7B,KAAO2W,EAAMuC,KAAKC,UAAUlM,QAClC5G,OAAOwS,UAAU9X,eAAe+X,KAAKnC,EAAMuC,KAAKC,UAAUlM,QAASjN,IACtE86B,EAAmBnvB,KAAK,CAAE,IAAO3L,EAAK,OAAU2W,EAAMuC,KAAKC,UAAUlM,QAAQjN,GAAKU,MAAO,MAASiW,EAAMuC,KAAKC,UAAUlM,QAAQjN,GAAKgL,QAItI,IAAK,MAAMhL,KAAOywC,GACbpqC,OAAOwS,UAAU9X,eAAe+X,KAAK23B,GAAyBzwC,IACjE+6B,EAAYpvB,KAAK,CAAE,IAAO3L,EAAK,MAASywC,GAAwBzwC,GAAKkM,QAIvE4uB,EAAmBlzB,SAAQgf,IAC1BA,EAAElb,OAAO9D,SAAQgH,IAChBosB,EAAMrvB,KAAK,gBAACysB,GAAD,CAAUp4B,IAAK4mB,EAAE5mB,IAAM4O,EACjC4hB,eAAgBlY,EAChB+f,WAAY0C,EAAY/hB,MAAK1U,GAAMA,EAAGtE,KAAO4mB,EAAE5mB,MAAKkM,MACpDosB,YAAa1pB,EACb2pB,SAAU3R,EAAE5mB,IACZw4B,aAAe5R,EAAE5b,MAAMC,OAAS,EAAI2b,EAAE5b,MAAM,GAAK,OALlD,GADD,IAYD,MAAMkmC,EAAUv6B,EAAMuC,KAAKC,UAAU/B,UA0B/BmuB,EAAO,CACZtO,UAAW,EACXC,YAAa,EACbsO,WAAY,GAGPC,EAAQ,CACbxO,UAAW,EACXC,YAAa,EACbsO,WAAY,GAIb,IAYIrsB,EAAY,GAGZi4B,EACH,uBAAKpxC,IAAI,SACR4c,MAAO,CACNgB,SAAU,SACV+C,IAAK,OACLC,KAAM,OACN/C,OAAQ,EACRmE,gBAAiB,UAElB,gBAAC6B,GAAA,EAAD,CAAOT,UAAU,eAEhB,2BACC,gBAAC,MAAD,CAAM6X,YAAY,SAASC,QAAM,EAACC,KAAK,EAAMC,GAAG,UAAUiW,QAAS,IAAKz0B,MAAO,CAAEiJ,aAAc,OAAQhK,MAAO,UAA9G,WAGA,gBAAC,MAAD,CAAMof,YAAY,SAASC,QAAM,EAACC,KAAK,EAAMC,GAAG,aAAaiW,QAAS,IAAKz0B,MAAO,CAAEiJ,aAAc,OAAQhK,MAAO,UAAjH,eAGA,gBAAC,MAAD,CAAMof,YAAY,SAASC,QAAM,EAACC,KAAK,EAAMC,GAAG,aAAaiW,QAAS,IAAKz0B,MAAO,CAAEiJ,aAAc,OAAQhK,MAAO,UAAjH,cAGA,gBAAC,MAAD,CAAMof,YAAY,SAASC,QAAM,EAACC,KAAK,EAAMC,GAAG,sBAAsBiW,QAAS,IAAKz0B,MAAO,CAAEiJ,aAAc,OAAQhK,MAAO,UAA1H,yBAGA,gBAAC,MAAD,CAAMof,YAAY,SAASC,QAAM,EAACC,KAAK,EAAMC,GAAG,cAAciW,QAAS,IAAKz0B,MAAO,CAAEiJ,aAAc,OAAQhK,MAAO,UAAlH,eAGA,gBAAC,MAAD,CAAMof,YAAY,SAASC,QAAM,EAACC,KAAK,EAAMC,GAAG,cAAciW,QAAS,IAAKz0B,MAAO,CAAEiJ,aAAc,OAAQhK,MAAO,UAAlH,eAGA,gBAAC,MAAD,CAAMof,YAAY,SAASC,QAAM,EAACC,KAAK,EAAMC,GAAG,iCAAiCiW,QAAS,IAAKz0B,MAAO,CAAEiJ,aAAc,OAAQhK,MAAO,UAArI,sCAGA,gBAAC,MAAD,CAAMof,YAAY,SAASC,QAAM,EAACC,KAAK,EAAMC,GAAG,SAASiW,QAAS,IAAKz0B,MAAO,CAAEiJ,aAAc,OAAQhK,MAAO,UAA7G,UAGA,gBAAC,MAAD,CAAMof,YAAY,SAASC,QAAM,EAACC,KAAK,EAAMC,GAAG,eAAeiW,QAAS,IAAKz0B,MAAO,CAAEiJ,aAAc,OAAQhK,MAAO,UAAnH,mBAQAie,EAAkB,uBAAKld,MAAO,CAAES,WAAY,OAAQ2e,aAAc,OAAQnf,UAAW,OAAQxO,MAAO,QACpG2sB,GACO,MA4MX,OAzMA7hB,EAAUxN,KAAKylC,GAhEG,CACjB,UACA,aACA,aACA,sBACA,cACA,cACA,iCACA,SACA,gBA0DWxpC,SAAQ,CAAC0pC,EAAS3kC,KAGzBukC,EAAQI,IAAYJ,EAAQI,GAAShN,OAAOoB,eAAiB,GAEhEH,EAAKtO,UAAYia,EAAQI,GAAShN,OAAOoB,gBAAkBwL,EAAQI,GAAS3L,OAAO70B,UAAUpF,OAAOwlC,EAAQI,GAAS3L,OAAO70B,UAAUgW,OAAO3c,QAAQ,SAAW,GAChKo7B,EAAKrO,YAAcga,EAAQI,GAAShN,OAAOoB,eAC3CH,EAAKC,WAAaD,EAAKtO,UAAYsO,EAAKrO,YAAc,IAEtDuO,EAAMxO,UAAYia,EAAQI,GAAShN,OAAOoB,gBAAkBwL,EAAQI,GAAS3L,OAAOj1B,SAAShF,OAAOwlC,EAAQI,GAAS3L,OAAOj1B,SAASoW,OAAO3c,QAAQ,SAAW,GAC/Js7B,EAAMvO,YAAcga,EAAQI,GAAShN,OAAOoB,eAC5CD,EAAMD,WAAaC,EAAMxO,UAAYwO,EAAMvO,YAAc,MAEzDqO,EAAKtO,UAAY,EACjBsO,EAAKrO,YAAc,EACnBqO,EAAKC,WAAa,EAElBC,EAAMxO,UAAY,EAClBwO,EAAMvO,YAAc,EACpBuO,EAAMD,WAAa,GAGpB,IAAI+L,EAAc,iCAhHnB,IAA4BC,EAkH3BD,EAAc,uBAAKvxC,IAAK2M,EAAGrI,GAAIgtC,GAiB9B,uBAAK10B,MAAO,CACXgR,SAAU,IACVnf,OAAQ,WAER,uBAAKmO,MAAO,CACX4D,UAAW,QACX0iB,cAAe,OACftd,WAAY,OAGZjF,IAAK,OACLqB,gBAAiB,UAEjB,gBAACvE,EAAA,EAAD,CAAQjC,QAAS,IAAMwpB,EAAc,CAAEjvB,KAAMw6B,GAAmB7L,6BAA8B1uB,QAASrJ,EAAI,IAC1GiQ,MAAO,CACNoF,gBAAkBkvB,EAAQI,GAAShN,OAAOoB,eAAiB,EAAK,UAAc,UAC9E7pB,MAAO,QACPsC,WAAY,UAJd,6BAUD,gBAACynB,GAAA,EAAD,CAAgBC,UAAWhiB,GAAAA,GAC1B,gBAACuG,GAAA,EAAD,CAAO5b,KAAK,SACX,gBAAC6b,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,CAAW4b,QAAS,GACnB,0BA/JoBqL,EA+JGF,GA3JfE,EAAI1kC,MAAM,aACFlB,KAAK,KACbuH,cAAcnJ,QAAQ,SAASynC,GAAKA,EAAEC,gBAJ7C,MAgKH,gBAACpnB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,kBACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,cACA,gBAACvb,GAAA,EAAD,CAAWub,MAAM,UAAUjB,GAAcyM,GAAS5wB,MAAlD,OAGF,gBAAC8J,GAAA,EAAD,KACC,gBAACF,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,wCACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BoL,EAAQI,GAAShN,OAAOoB,iBACtD,gBAACnb,GAAA,EAAD,CAAWub,MAAM,UAAUjB,GAAcyM,GAASzb,WAGnD,gBAACvL,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,yCACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BP,EAAKC,WAAWzV,QAAQ,GAAtD,SAA6D,2BAA7D,eAAyEwV,EAAKtO,UAA9E,YAA2FsO,EAAKrO,YAAhG,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,UAAjB,MAGD,gBAACxb,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,0CACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BL,EAAMD,WAAWzV,QAAQ,GAAvD,SAA8D,2BAA9D,eAA0E0V,EAAMxO,UAAhF,YAA6FwO,EAAMvO,YAAnG,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,UAAjB,MAGD,gBAACxb,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,CAAW4b,QAAS,GACnB,uCAIF,gBAAC7b,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,yBACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BoL,EAAQI,GAAShN,OAAO4B,WAAWV,WAAWzV,QAAQ,GAApF,SAA2F,2BAA3F,eAAuGmhB,EAAQI,GAAShN,OAAO4B,WAAWjP,UAA1I,YAAuJia,EAAQI,GAAShN,OAAO4B,WAAWhP,YAA1L,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcyM,GAASpL,aAGjF,gBAAC5b,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,yEACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BoL,EAAQI,GAAShN,OAAOqN,2BAA2BnM,WAAWzV,QAAQ,GAApG,SAA2G,2BAA3G,eAAuHmhB,EAAQI,GAAShN,OAAOqN,2BAA2B1a,UAA1K,YAAuLia,EAAQI,GAAShN,OAAOqN,2BAA2Bza,YAA1O,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcyM,GAASK,6BAEjF,gBAACrnB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,gCACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BoL,EAAQI,GAAShN,OAAOsN,aAAaC,QAAnE,IAA6E,2BAA7E,eAAyFX,EAAQI,GAAShN,OAAOsN,aAAarU,IAA9H,cAAuI2T,EAAQI,GAAShN,OAAOsN,aAAanlB,IAA5K,MACA,gBAAClC,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcyM,GAASM,eAEjF,gBAACtnB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,sCACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BoL,EAAQI,GAAShN,OAAO0I,gBAAgBxH,WAAWzV,QAAQ,GAAzF,SAAgG,2BAAhG,eAA4GmhB,EAAQI,GAAShN,OAAO0I,gBAAgB/V,UAApJ,YAAiKia,EAAQI,GAAShN,OAAO0I,gBAAgB9V,YAAzM,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcyM,GAAStE,kBAGjF,gBAAC1iB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,iCACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BoL,EAAQI,GAAShN,OAAO2I,gBAAgBzH,WAAWzV,QAAQ,GAAzF,SAAgG,2BAAhG,eAA4GmhB,EAAQI,GAAShN,OAAO2I,gBAAgBhW,UAApJ,YAAiKia,EAAQI,GAAShN,OAAO2I,gBAAgB/V,YAAzM,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcyM,GAASrE,kBAGjF,gBAAC3iB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,CAAW4b,QAAS,GACnB,+CAIF,gBAAC7b,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,qCACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BoL,EAAQI,GAAShN,OAAOwN,QAAQtM,WAAWzV,QAAQ,GAAjF,SAAwF,2BAAxF,eAAoGmhB,EAAQI,GAAShN,OAAOwN,QAAQ7a,UAApI,YAAiJia,EAAQI,GAAShN,OAAOwN,QAAQ5a,YAAjL,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcyM,GAASQ,UAGjF,gBAACxnB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,wEACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BoL,EAAQI,GAAShN,OAAOyN,wBAAwBvM,WAAWzV,QAAQ,GAAjG,SAAwG,2BAAxG,eAAoHmhB,EAAQI,GAAShN,OAAOyN,wBAAwB9a,UAApK,YAAiLia,EAAQI,GAAShN,OAAOyN,wBAAwB7a,YAAjO,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcyM,GAASS,0BAGjF,gBAACznB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,mEACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BoL,EAAQI,GAAShN,OAAO0N,iCAAiCxM,WAAWzV,QAAQ,GAA1G,SAAiH,2BAAjH,eAA6HmhB,EAAQI,GAAShN,OAAO0N,iCAAiC/a,UAAtL,YAAmMia,EAAQI,GAAShN,OAAO0N,iCAAiC9a,YAA5P,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcyM,GAASU,mCAGjF,gBAAC1nB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,CAAW4b,QAAS,GACnB,gDAIF,gBAAC7b,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,mCACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BoL,EAAQI,GAAShN,OAAO2N,MAAMzM,WAAWzV,QAAQ,GAA/E,SAAsF,2BAAtF,eAAkGmhB,EAAQI,GAAShN,OAAO2N,MAAMhb,UAAhI,YAA6Iia,EAAQI,GAAShN,OAAO2N,MAAM/a,YAA3K,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcyM,GAASW,QAGjF,gBAAC3nB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,sEACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BoL,EAAQI,GAAShN,OAAO4N,sBAAsB1M,WAAWzV,QAAQ,GAA/F,SAAsG,2BAAtG,eAAkHmhB,EAAQI,GAAShN,OAAO4N,sBAAsBjb,UAAhK,YAA6Kia,EAAQI,GAAShN,OAAO4N,sBAAsBhb,YAA3N,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcyM,GAASY,2BAOpF,uBAAKt1B,MAAO,CAAEkE,SAAU,QAASN,UAAW,SAC5C,yBAAG,2DAAH,MAGA,uBAAK5D,MAAO,CAAEkE,SAAU,QAASN,UAAW,SAC3C,yBAAG,0NAAH,MAGD,uBAAK5D,MAAO,CAAE4D,UAAW,WACxB,wDAA+B,qBAAG3a,KvJzkBU,uDuJykB+BkiC,OAAO,UAAnD,4DAAwH,2BAAvJ,+DAIF,qBAAGzjC,GAAG,qBAAqBsY,MAAO,CAAEsB,QAAS,WAI9C/E,EAAUxN,KAAK4lC,EAAf,IAKA,2BAAMp4B,EAIP,CC/lBM,SAASg5B,KAAqB,8CACpC,MAAM,MAAEx7B,EAAF,SAASmE,GAAalR,EAAAA,WAAiBgR,IAEvC1D,EAA+BrN,MAAO7J,EAA2CU,EAA0ByX,EAAyBC,KACzI,MAAM4hB,QAA0ByW,GAAqBA,GAAc95B,EAAMuC,KAAKC,UAAzBs3B,CAAiEzwC,EAAKU,EAAOyX,EAASC,IAC3I0C,EAAS,CAAE/E,KAAM8D,GAAYQ,mBAAoBrE,QAASgkB,GAA1D,EAGK1hB,EAAqCzO,UAE1C,MAAMmwB,QAA0ByW,GAAqBA,GAAiB95B,EAAMuC,KAAKC,UAAwCnZ,IACzH8a,EAAS,CAAE/E,KAAM8D,GAAYQ,mBAAoBrE,QAASgkB,GAA1D,EAGD,GAAIrjB,EAAMuC,KAAKG,QACd,OAAO,gBAAC,GAAD,MAER,MAAM4uB,EAAiBtxB,EAAMuC,KAAKC,UAAU/B,UAGtC8nB,EAAoB,GAC1B+I,SAAAA,EAAgBqI,QAAQhM,OAAOjtB,MAAM9Q,KAAIyG,IACxCkyB,EAAWvzB,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE1I,IAA1C,IAID,IAAI66B,EAAuB,GAC3B,UAAAxoB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8ByE,WAA9B,mBAAmChR,aAAnC,SAA0C6F,KAAIyG,IAC7CmyB,EAAcxzB,KAAK,CAAEO,MAAOc,EAAGtM,MAAOw+B,EAAWlmB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAzE,IAID,IAAI0+B,EAAiB,GACjBD,EAAcl0B,OAAS,IAC1Bm0B,EAAiBD,EAAc54B,KAAIqgB,GAClCA,EAAElmB,SAKJ,MAAM2+B,EAAyB,GAC3BF,EAAcl0B,OAAS,EAC1Bg9B,SAAAA,EAAgBqI,QAAQhM,OAAO/iC,WAAWwL,QAAO6Z,GAAKwY,EAAej8B,SAASyjB,EAAE0Y,SAAQ/4B,KAAIyG,IAC3FqyB,EAAgB1zB,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE+qB,YAA/C,IAGDkQ,SAAAA,EAAgBqI,QAAQhM,OAAO/iC,WAAWgF,KAAIyG,IAC7CqyB,EAAgB1zB,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE+qB,YAA/C,IAKF,IAAIwH,EAA4B,GAChC,UAAA5oB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8BoE,gBAA9B,mBAAwC3Q,aAAxC,SAA+C6F,KAAIyG,IAClDuyB,EAAmB5zB,KAAK,CAAEO,MAAOc,EAAGtM,MAAO2+B,EAAgBrmB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAnF,IAID,IAAI8+B,EAAsB,GACtBD,EAAmBt0B,OAAS,IAC/Bu0B,EAAsBD,EAAmBh5B,KAAIqgB,GAC5CA,EAAElmB,SAKJ,MAAM++B,EAAoB,GACtBF,EAAmBt0B,OAAS,EAC/Bg9B,SAAAA,EAAgBqI,QAAQhM,OAAO/H,KAAKxvB,QAAO6Z,GAAK4Y,EAAoBr8B,SAASyjB,EAAEmR,cAAaxxB,KAAIyG,IAC/FyyB,EAAW9zB,KAAK,CAAEO,MAAOc,EAAEiD,gBAAiBvP,MAAOsM,EAAE+rB,WAArD,IAGDkP,SAAAA,EAAgBqI,QAAQhM,OAAO/H,KAAKh2B,KAAIyG,IACvCyyB,EAAW9zB,KAAK,CAAEO,MAAOc,EAAEiD,gBAAiBvP,MAAOsM,EAAE+rB,WAArD,IAKF,IAAI2G,EAAuB,GAC3B,UAAA/oB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8B+D,WAA9B,mBAAmCtQ,aAAnC,SAA0C6F,KAAIyG,IAC7C0yB,EAAc/zB,KAAK,CAAEO,MAAOc,EAAGtM,MAAO++B,EAAWzmB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAzE,IAQD,MAAMi/B,EAAsB,GAC5BsI,SAAAA,EAAgBqI,QAAQhM,OAAO1E,MAAMr5B,KAAIyG,IACxC2yB,EAAah0B,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE1I,IAA5C,IAID,IAAIu7B,EAA4B,GAChC,UAAAlpB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8B+2B,gBAA9B,mBAAwCtjC,aAAxC,SAA+C6F,KAAIyG,IAAK,MACvD6yB,EAAmBl0B,KAAK,CACvBO,MAAOc,EACPtM,MAAK,UAAEi/B,EAAa3mB,MAAK4N,GAAKA,EAAE1a,OAASc,WAApC,aAAE,EAAsCtM,OAF9C,IAOD,IAAIo/B,EAA6B,GACjC,UAAAnpB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8B62B,sBAA9B,mBAA8CpjC,aAA9C,SAAqD6F,KAAIyG,IACxD8yB,EAAoBn0B,KAAK,CAAEO,MAAOc,EAAGtM,MAAOi/B,EAAa3mB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAjF,IAKD,MAAMq/B,EAAwB,GAC9BkI,SAAAA,EAAgBqI,QAAQhM,OAAOrxB,KAAK1M,KAAIyG,IACnCA,EAAE1I,IAAM,MACXy7B,EAAep0B,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE1I,IAC9C,IAIF,MAAM27B,EAAyB,GAC/BgI,SAAAA,EAAgBqI,QAAQhM,OAAOrxB,KAAK1M,KAAIyG,IACvCizB,EAAgBt0B,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE1I,IAA/C,IAID,IAAI07B,EAA2B,GAC/B,UAAArpB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8B82B,eAA9B,mBAAuCrjC,aAAvC,SAA8C6F,KAAIyG,IAAK,MACtDgzB,EAAkBr0B,KAAK,CACtBO,MAAOc,EACPtM,MAAK,UAAEq/B,EAAe/mB,MAAK4N,GAAKA,EAAE1a,OAASc,WAAtC,aAAE,EAAwCtM,OAFhD,IAOD,IAAIw/B,EAA4B,GAChC,UAAAvpB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8B42B,qBAA9B,mBAA6CnjC,aAA7C,SAAoD6F,KAAIyG,IACvDkzB,EAAmBv0B,KAAK,CAAEO,MAAOc,EAAGtM,MAAOu/B,EAAgBjnB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAnF,IAID,MAAOy/B,EAAQC,GAAax2B,EAAAA,SAAes2B,EAAmBj1B,OAAS,EAAI,iBAAmB,YAE9F,OACC,gCACC,gBAACyS,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,YACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOy+B,EACPmB,QAASpB,EACTzD,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAam4B,GAAAA,IAAAA,KAEbv5B,EAAUu5B,GAAAA,IAAAA,IAAiC93B,EAC3C,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAOX,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,iBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAO6+B,EACPe,QAASjB,EACT5D,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAam4B,GAAAA,SAAAA,KAEbv5B,EAAUu5B,GAAAA,SAAAA,IAAsC93B,EAChD,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAOX,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,YACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOg/B,EACPY,QAASb,EACThE,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAam4B,GAAAA,IAAAA,KAEbv5B,EAAUu5B,GAAAA,IAAAA,IAAiC93B,EAC3C,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAMX,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,gBACA,gBAACwe,GAAD,CACCC,YAAa,CAAC,WAAY,kBAC1BC,aAAckD,EACdlW,UAAWjd,IACVozB,EAAUpzB,EAAV,KAMS,YAAVmzB,EACD,gCACC,gBAACziB,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,iBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOs/B,EACPM,QAASP,EAAe9Y,UACxBwU,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAam4B,GAAAA,QAAAA,KAEbv5B,EAAUu5B,GAAAA,QAAAA,IAAqC93B,EAC/C,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAMX,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,kBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOm/B,EACPS,QAASX,EACTlE,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAam4B,GAAAA,SAAAA,KAEbv5B,EAAUu5B,GAAAA,SAAAA,IAAsC93B,EAChD,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,eAOZ,gCACC,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,uBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOw/B,EACPI,QAASL,EAAgBhZ,UACzBwU,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAam4B,GAAAA,cAAAA,KAEbv5B,EAAUu5B,GAAAA,cAAAA,IAA2C93B,EACrD,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAMX,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,wBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOo/B,EACPQ,QAASX,EACTlE,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAam4B,GAAAA,eAAAA,KAEbv5B,EAAUu5B,GAAAA,eAAAA,IAA4C93B,EACtD,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,eAYf,C,yHChXM,MAAMu2B,WAAiCxoC,EAAAA,UAE1ClE,YAAY6W,GACRwG,MAAMxG,GADS,4BAUQ,KACvBzW,KAAKu7B,SAAS,CAAEhzB,MAAO1I,OAAO0jB,WAAY1b,OAAQhI,OAAO4oB,aAAzD,IAXe,kBAsBV,IAED,gCACI,gBAACiiB,GAAD,SAtBR1qC,KAAK6Q,MAAQ,CACTtI,MAAO,EACPV,OAAQ,EAGf,CAMM2zB,uBACH37B,OAAO47B,oBAAoB,SAAUz7B,KAAK07B,iBAC7C,CAEMC,oBACH97B,OAAO4Q,iBAAiB,SAAUzQ,KAAK07B,iBAC1C,ECUOr0B,GAAgBE,GAA4BA,EAAG8C,WAAWrI,OCA1DqF,GAAgBE,GAA4BA,EAAGglC,wBAAwBvqC,OCAvEqF,GAAgBE,GAA4BA,EAAGilC,sBAAsBxqC,OC2B1DqF,GAAgBE,GAAkCA,EAAGuD,SAAS9I,OCJ9DqF,GAAgBE,GAA4BA,EAAGklC,kBAAkBzqC,OCAjEqF,GAAgBE,GAA4BA,EAAGmlC,kBAAkB1qC,OCtDjF,MCuFM6J,GAAmC,IAC5CZ,GAfH8yB,cAAe,CAAE7jC,IAAK,gBAAiBkM,MAAO,kBAC9C43B,eAAgB,CAAE9jC,IAAK,iBAAkBkM,MAAO,mBAChD63B,QAAS,CAAE/jC,IAAK,UAAWkM,MAAO,YAClC83B,SAAU,CAAEhkC,IAAK,WAAYkM,MAAO,aACpC6F,YAAa,CAAE/R,IAAK,cAAekM,MAAO,gBAC1C8F,WAAY,CAAEhS,IAAK,aAAckM,MAAO,cACxC+F,WAAY,CAAEjS,IAAK,aAAckM,MAAO,YACxC2F,eAAgB,CAAE7R,IAAK,iBAAkBkM,MAAO,oBAChDumC,aAAc,CAAEzyC,IAAK,eAAgBkM,MAAO,iBAC5CwmC,kBAAmB,CAAE1yC,IAAK,oBAAqBkM,MAAO,uBACtDymC,sBAAuB,CAAE3yC,IAAK,wBAAyBkM,MAAO,0BAC9D0mC,oBAAqB,CAAE5yC,IAAK,sBAAuBkM,MAAO,sBCzFpD,IAAKiJ,GAUAC,GCbG,SAAS,KACtB,OAAO,IAAIE,OAAO,IAA0B,6CAC9C,E,SDCYH,GAAAA,EAAAA,EAAAA,KAAAA,GAAAA,OAAAA,EAAAA,EAAAA,MAAAA,GAAAA,QAAAA,EAAAA,EAAAA,UAAAA,GAAAA,W,EAAAA,KAAAA,GAAAA,CAAAA,I,SAUAC,GAAAA,EAAAA,EAAAA,KAAAA,GAAAA,OAAAA,EAAAA,EAAAA,MAAAA,GAAAA,QAAAA,EAAAA,EAAAA,UAAAA,GAAAA,YAAAA,EAAAA,EAAAA,YAAAA,GAAAA,a,EAAAA,KAAAA,GAAAA,CAAAA,IEJZ,IAAIQ,GAAqB,KACrBC,GAAW,CAAC,EACZ9Q,GAAO,CACPo/B,QAAS,GA2Eb,SAASruB,GAAyBC,EAAyBC,GACvD,MAAM1R,EAAKgO,KASX,OARAuD,GAASvR,GAAM,CAAC,EAChBuR,GAASvR,GAAI2R,QAAU,IAAInT,SAAQ,CAACwC,EAASvC,KAZjD,IAAc8B,IAaD,CAAEP,KAAIyR,OAAMC,WAZrBJ,GAAOM,YAAYrR,GAcfgR,GAASvR,GAAIgB,QAAUA,EACvBuQ,GAASvR,GAAIvB,OAASA,CAAtB,IAGG8S,GAASvR,GAAI2R,OACvB,CC5EM,MAaM48B,GAA2BhpC,UDhBpC9E,GAAKo/B,QCiBS,KDfTx+B,OAAM,QAKPnF,QAAQC,IAAI,sBAEZmV,GAASA,IAAU,IAAIU,GAKvBV,GAAOW,iBAAiB,WAAYC,IAChC,MAAQzR,MAAM,GAAET,EAAF,KAAMyR,EAAN,QAAYC,IAAcQ,EAM3B,MAEL,UAAAX,GAASvR,UAAT,SAAcgB,QAAQ0Q,GAK9BH,GAASvR,QAAMtC,CAAf,IAMJ4T,GAAOW,iBAAiB,gBAAiBC,IACrC,MAAQzR,MAAM,GAAET,EAAF,KAAMyR,EAAN,QAAYC,IAAcQ,EAOhChW,QAAQD,MAAM,oBAAqByV,GACnCH,GAASvR,GAAIvB,OAAOiT,GAK5BH,GAASvR,QAAMtC,CAAf,KA7CJxB,QAAQC,IAAI,2BCenB,IAGC,aD6DSqV,GAAuCX,GAAAA,KAAwB,MC9DxE3U,QAAQC,IAAI,8BACCiW,GAAUC,EAAOA,EAAMlB,QAGpC,CAFC,MACDjV,QAAQD,MAAM,qBACd,GAGWqW,GAAgBD,IAC5B,MAAME,EAAwB,CAAC3J,EAAmB4J,KACjD,IAAKA,GAAoC,IAAtBA,EAAW7L,OAC7B,OAAQ,IAAI8L,IAEb,GAAIJ,EAAMlB,QACT,OAAQ,IAAIsB,IAEb,IAAIC,EAAY,IAAID,IAIpB,OAHAC,EAAUC,IAAIH,EAAW,GAAGhP,MAE5B6O,EAAQO,GAAUP,EAAVO,CAAiBhK,EAAW,CAAC4J,EAAW,GAAGhP,OAC5CkP,CAAP,EAOD,OAJAL,EAAM1J,QAAU,CAAC,EACjB0J,EAAMQ,cAAiBN,EAAsBlF,GAAAA,IAAAA,IAA6BgF,EAAMS,UAAUktB,OAAOjtB,OACjGV,EAAMW,mBAAqBT,EAAsBlF,GAAAA,SAAAA,IAAkCgF,EAAMS,UAAUktB,OAAO/iC,YAEnG,IAAMoV,EAAb,EASKD,GAAY7M,MAAO8M,EAA8BY,KACtD,IACC,MAAMxS,QDgCD,SAAewS,GAGlB,OAAOzU,QAAQyU,IAAI,CACfxC,GAAwBwC,GACxBvC,GAAkCuC,KAEjC/R,MAAKgS,GACK1B,GAAuDX,GAAAA,MAAyB,CACnFoC,MACAG,QAASF,EAAQ,GACjBG,QAASH,EAAQ,GACjB2sB,QAASp/B,GAAKo/B,WAI7B,CChDoB1tB,CAAiBc,GAE9BV,EAAwB,CAAC3J,EAAmB4J,KACjD,IAAKA,GAAoC,IAAtBA,EAAW7L,OAC7B,OAAQ,IAAI8L,IAEb,GAAIQ,EACH,OAAQ,IAAIR,IAEb,IAAIC,EAAY,IAAID,IAIpB,OAHAC,EAAUC,IAAIH,EAAW,GAAGhP,MAE5B6O,EAAQO,GAAUP,EAAVO,CAAiBhK,EAAW,CAAC4J,EAAW,GAAGhP,OAC5CkP,CAAP,EASD,OANAL,EAAMQ,cAAiBN,EAAsBlF,GAAAA,IAAAA,IAA6B5M,EAAKqS,UAAUktB,OAAOjtB,OAC1FV,EAAMW,mBAAqBT,EAAsBlF,GAAAA,SAAAA,IAAkC5M,EAAKqS,UAAUktB,OAAO/iC,YAC/GoV,EAAMlB,QAAU8B,EAChBZ,EAAMoB,WAAahT,EAAKgT,WACxBpB,EAAMS,UAAYrS,EAAKqS,UAEhBT,CAIP,CAHC,MAED,OADAnW,QAAQD,MAAM,2BACPoW,CACP,GAGWqB,GAAmBnO,UAC/B,IACC,MAAM9E,QDuBkBkT,ECvBgBtB,EAAM1J,QDwBrC6I,GAA+DX,GAAAA,UAA6B,CAC/F8C,iBACAksB,QAASp/B,GAAKo/B,WCxBpB,OADAxtB,EAAMS,UAAYrS,EACX,IAAI4R,EAIX,CAHC,MAED,OADAnW,QAAQD,MAAM,kCACPoW,CACP,CDiBK,IAAmBsB,CCjBxB,EAGWf,GAAaP,GAAiC,CAAC3W,EAAuCU,EAA0ByX,EAAyBC,KACrJ,MAAMnL,EAAmB5G,OAAO8I,OAAO,CAAC,EAAGwH,EAAM1J,SAC3CvB,EAA2B,iBAAVhL,EACpB,CAACA,GACDA,EAIG2X,EAA6BF,IAAaA,EAAQzM,SAAST,OAAS,EAAKkN,EAAQnM,SAAWmM,IAAY,IAAIpN,EAOlH,OANAsN,EAAY1M,KAAKD,GAEjBuB,EAAQjN,GAAQ,CAAEU,MAAOgL,EAAQ0M,gBAAepN,MAAOqN,EAAYrN,OAEnE2L,EAAM1J,QAAUA,EAET,IAAI0J,EAAX,EAIY2B,GAAe,CAAC3B,EAA8B3W,EAAuCU,EAAgB0X,KACjH,MAAMnL,EAAmB5G,OAAO8I,OAAO,CAAC,EAAGwH,EAAM1J,SAC3CsL,EAAwB7X,GAAS,KACjCyX,EAAUpN,EAAAA,YAA0BkC,EAASjN,GAC7C0L,EAASyM,EAAQzM,SACjB8M,EAAYD,EAAgB7M,EAAOqB,QAAOC,GAAKA,GAAKuL,IAAgB,KAEpEE,EAAIN,EAAQnM,UAAY,IAAIjB,EAWlC,OAVIyN,GACHC,EAAE9M,KAAK6M,GAERvL,EAAQjN,GAAQ,CAACU,MAAO+X,EAAE/M,SAAU0M,gBAAgBpN,MAAOyN,EAAEzN,OAEtC,IAAnByN,EAAEzN,MAAMC,eACJgC,EAAQjN,GAGhB2W,EAAM1J,QAAUA,EACT,IAAI0J,EAAX,ECxIM,SAASqf,GAAoBzZ,GAKnC,OACC,gBAACyT,GAAD,CACCS,MAAO,CAAEtB,sBAAuB,CAAEjjB,MAAO,uBAAyBkjB,oBAAqB,CAAEljB,MAAO,KAChGwkB,MAAO,CAAEvB,sBAAuB,CAAEjjB,MAAO,IAAMkjB,oBAAqB,CAAEljB,MAAO,wBAC7EykB,WAAY,CAAExB,sBAAuB,CAAEoC,UAAU,GAASnC,oBAAqB,CAAEmC,UAAU,IAC3FrB,wBAAyBjB,GAAiBC,WAC1Ce,iBAAkBZ,GAAUG,IAC5B9I,WAAW,cACXxZ,UAAW,GACXojB,SAAU,CAAC/T,EAAM+T,UACjBlM,WAAY,gBAACmR,GAAD,CAAqBxwB,KAAMwX,EAAM+T,SAAUpjB,UAAWyE,GAAAA,YAAAA,IAAqCuF,UAAWqF,EAAMgU,YAAajY,aAAciE,EAAMiU,iBACzJrI,cAAe5L,EAAM4L,cACrBgD,SAfe,CAAC/F,EAAsBD,IACvCzC,GAA0BnG,EAAMgU,YAAa5e,GAAAA,YAAAA,IAAqC4K,EAAM+T,SAAWlL,GAAaiK,GAAUI,IAAMziB,GAAKA,EAAEjI,KAAK+hB,OAAO9Z,EAAEokB,aAAaluB,WAAciiB,GAAoB8J,GAAiBC,WAAaliB,GAAKA,EAAEga,EAAE9jB,WAAa8J,GAAKA,EAAE5B,EAAElI,YAehQqtB,YAAahU,EAAMgU,YACnBC,eAAgBjU,EAAMiU,eACtBK,UAAU,YACVc,kBAAkB,EAClBqB,WAAY,CACXG,MAAM,GAEPvC,gBAAiB,CAChB5C,sBAAuB,GACvBC,gBAAiB,GACjBC,aAAc,IAKjB,CCrCM,SAASwI,GAAgBna,GAC/B,OACC,gBAACyT,GAAD,CACCS,MAAO,CAAEtB,sBAAuB,CAAEjjB,MAAO,uBAAyBkjB,oBAAqB,CAAEljB,MAAO,KAChGwkB,MAAO,CAAEvB,sBAAuB,CAAEjjB,MAAO,IAAMkjB,oBAAqB,CAAEljB,MAAO,wBAC7EykB,WAAY,CAAExB,sBAAuB,CAAEoC,UAAU,GAAQnC,oBAAqB,CAAEmC,UAAU,IAC1FrB,wBAAyBjB,GAAiBW,SAC1CK,iBAAkBZ,GAAUG,IAC5B9I,WAAW,WACXxZ,UAAWyE,GAAAA,WAAAA,IACX2e,SAAU,CAAC/T,EAAM+T,UACjBnI,cAAe5L,EAAM4L,cACrBoI,YAAahU,EAAMgU,YACnBC,eAAgBjU,EAAMiU,eACtBK,UAAU,aAGZ,CCjBM,SAASiiB,GAA2Bv2B,GAE1C,OACC,gBAACyT,GAAD,CACCS,MAAO,CAAEtB,sBAAuB,CAAEjjB,MAAO,uBAAyBkjB,oBAAqB,CAAEljB,MAAO,KAChGwkB,MAAO,CAAEvB,sBAAuB,CAAEjjB,MAAO,IAAMkjB,oBAAqB,CAAEljB,MAAO,wBAC7EykB,WAAY,CAAExB,sBAAuB,CAAEoC,UAAU,GAASnC,oBAAqB,CAAEmC,UAAU,IAC3FrB,wBAAyBjB,GAAiBC,WAC1Ce,iBAAkBZ,GAAUG,IAC5B9I,WAAW,yBACXxZ,UAAWyE,GAAAA,sBAAAA,IACX2e,SAAU,CAAC/T,EAAM+T,UACjBnI,cAAe5L,EAAM4L,cACrBoI,YAAahU,EAAMgU,YACnBC,eAAgBjU,EAAMiU,eACtBK,UAAU,YACVD,gBAAiB,CAChB5C,sBAAuB,GACvBC,gBAAiB,GACjBC,aAAc,GAEfyD,kBAAkB,GAGpB,CCxBM,SAASohB,GAAgBx2B,GAC/B,OACC,gBAACyT,GAAD,CACCS,MAAO,CAAEtB,sBAAuB,CAAEjjB,MAAO,uBAAyBkjB,oBAAqB,CAAEljB,MAAO,KAChGwkB,MAAO,CAAEvB,sBAAuB,CAAEjjB,MAAO,IAAMkjB,oBAAqB,CAAEljB,MAAO,wBAC7EykB,WAAY,CAAExB,sBAAuB,CAAEoC,UAAU,GAAQnC,oBAAqB,CAAEmC,UAAU,IAC1FrB,wBAAyBjB,GAAiBW,SAC1CK,iBAAkBZ,GAAUG,IAC5B9I,WAAW,oBACXxZ,UAAWyE,GAAAA,oBAAAA,IACX2e,SAAU,CAAC/T,EAAM+T,UACjBnI,cAAe5L,EAAM4L,cACrBoI,YAAahU,EAAMgU,YACnBC,eAAgBjU,EAAMiU,eACtBK,UAAU,aAGZ,CCjBM,SAASmiB,GAAkBz2B,GAEjC,OACC,gBAACyT,GAAD,CACCS,MAAO,CAAEtB,sBAAuB,CAAEjjB,MAAO,uBAAyBkjB,oBAAqB,CAAEljB,MAAO,KAChGwkB,MAAO,CAAEvB,sBAAuB,CAAEjjB,MAAO,IAAMkjB,oBAAqB,CAAEljB,MAAO,wBAC7EykB,WAAY,CAAExB,sBAAuB,CAAEoC,UAAU,GAAQnC,oBAAqB,CAAEmC,UAAU,IAC1FrB,wBAAyBjB,GAAiBW,SAC1CK,iBAAkBZ,GAAUG,IAC5B9I,WAAW,gBACXxZ,UAAWyE,GAAAA,aAAAA,IACX2e,SAAU,CAAC/T,EAAM+T,UACjBnI,cAAe5L,EAAM4L,cACrBoI,YAAahU,EAAMgU,YACnBC,eAAgBjU,EAAMiU,eACtBK,UAAU,aAGZ,CClBM,SAASoiB,GAAuB12B,GACtC,OACC,gBAACyT,GAAD,CACCS,MAAO,CAAEtB,sBAAuB,CAAEjjB,MAAO,uBAAyBkjB,oBAAqB,CAAEljB,MAAO,KAChGwkB,MAAO,CAAEvB,sBAAuB,CAAEjjB,MAAO,IAAMkjB,oBAAqB,CAAEljB,MAAO,wBAC7EykB,WAAY,CAAExB,sBAAuB,CAAEoC,UAAU,GAAQnC,oBAAqB,CAAEmC,UAAU,IAC1FrB,wBAAyBjB,GAAiBW,SAC1CK,iBAAkBZ,GAAUG,IAC5B9I,WAAW,sBACXxZ,UAAWyE,GAAAA,kBAAAA,IACX2e,SAAU,CAAC/T,EAAM+T,UACjBnI,cAAe5L,EAAM4L,cACrBoI,YAAahU,EAAMgU,YACnBC,eAAgBjU,EAAMiU,eACtBK,UAAU,aAGZ,C,ICTIqiB,I,SAAAA,GAAAA,EAAAA,EAAAA,6BAAAA,GAAAA,+BAAAA,EAAAA,EAAAA,yBAAAA,GAAAA,2BAAAA,EAAAA,EAAAA,sBAAAA,GAAAA,uB,EAAAA,KAAAA,GAAAA,CAAAA,IAgBL,MAAMj6B,GAAsB,CAC3B3F,UAAW,GAKNmxB,GAAU,CAAC9tB,EAAcsD,KAC9B,MAAM,KAAElE,GAASkE,EAEjB,OAAQlE,GACP,KAAKm9B,GAA2BxO,6BAC/B,MAAO,IAAK/tB,EAAYrD,UAAW2G,EAAOjE,SAE3C,KAAKk9B,GAA2BvO,yBAChC,KAAKuO,GAA2BtO,sBAC/B,MAAO,IAAKjuB,EAAYrD,UAAW,GAEpC,QACC,OAAOqD,EATT,EAcM,SAASw8B,KACf,MAAOpO,EAAYC,GAAiBp7B,EAAAA,WAAiB66B,GAASxrB,KACxD,MAAEtC,EAAF,SAASmE,GAAalR,EAAAA,WAAiBgR,KAGtCkf,EAAiBC,GAAkBnwB,EAAAA,UAAe,GAEnDsN,EAAuCrN,MAAO7J,EAAmDU,EAA0ByX,EAAyBC,KACzJ,MAAM4hB,QAA0BoZ,GAA6BA,GAAsBz8B,EAAMuC,KAAKC,UAAjCi6B,CAAiFpzC,EAAKU,EAAOyX,EAASC,IACnK0C,EAAS,CAAE/E,KAAM8D,GAAYQ,mBAAoBrE,QAASgkB,GAA1D,EAGK1hB,EAA6CzO,MAAO7J,EAAmDU,KAC5G,MAAMs5B,QAA0BoZ,GAA6BA,GAAyBz8B,EAAMuC,KAAKC,UAAgDnZ,EAAKU,IACtJoa,EAAS,CAAE/E,KAAM8D,GAAYQ,mBAAoBrE,QAASgkB,GAA1D,EA0CD,GAvCApwB,EAAAA,WAAgB,KACfkR,EAAS,CAAE/E,KAAM8D,GAAYM,8BAC7Bi5B,GAAqCz8B,EAAMuC,KAAKC,WAC9C3T,MAAM9E,IACNoa,EAAS,CAAE/E,KAAM8D,GAAYK,uBAAwBlE,QAAStV,GAA9D,IAEK,KRwDLkV,IAAUA,GAAOqkB,YACjBrkB,GAAS,KACTpV,QAAQC,IAAI,uBQzDb,IAEC,IAEHmJ,EAAAA,WAAgB,KACf,GAA4B,GAAxBm7B,EAAWzxB,UACd,OAED,IAAI8xB,EAAMiO,EAAqB/O,OAAOzD,sBAIKh3B,WAC1C,IACC,MAAM9E,QAAa+7B,GAAAA,mCAA6CsE,GALpD,EAKkEL,EAAWzxB,WACrFvO,EAAKg8B,eACRvgC,QAAQD,MAAMwE,EAAKg8B,cACnBiE,EAAc,CAAEjvB,KAAMm9B,GAA2BtO,yBAElDI,EAAc,CAAEjvB,KAAMm9B,GAA2BvO,2BAC1C3D,GAAoBj8B,EAAK85B,MAAO95B,EAAK2K,SAAUsxB,GAA8Bj8B,EAAK64B,UAAW,qBAGpG,CAFC,MACDoH,EAAc,CAAEjvB,KAAMm9B,GAA2BtO,uBACjD,GAGF0O,EAAoC,GAGlC,CAACvO,EAAWzxB,YAGXqD,EAAMuC,KAAKG,UAAY1C,EAAMuC,KAAKC,UAAU/B,UAC/C,OAAO,gBAAC,GAAD,MAWR,IAAI0jB,EAAqB,GACrBC,EAAc,GACdC,EAAQ,GAEZ,IAAK,MAAMh7B,KAAO2W,EAAMuC,KAAKC,UAAUlM,QAClC5G,OAAOwS,UAAU9X,eAAe+X,KAAKnC,EAAMuC,KAAKC,UAAUlM,QAASjN,IACtE86B,EAAmBnvB,KAAK,CAAE,IAAO3L,EAAK,OAAU2W,EAAMuC,KAAKC,UAAUlM,QAAQjN,GAAKU,MAAO,MAASiW,EAAMuC,KAAKC,UAAUlM,QAAQjN,GAAKgL,QAItI,IAAK,MAAMhL,KAAOozC,GACb/sC,OAAOwS,UAAU9X,eAAe+X,KAAKs6B,GAAiCpzC,IACzE+6B,EAAYpvB,KAAK,CAAE,IAAO3L,EAAK,MAASozC,GAAgCpzC,GAAKkM,QAI/E4uB,EAAmBlzB,SAAQgf,IAC1BA,EAAElb,OAAO9D,SAAQgH,IAChBosB,EAAMrvB,KAAK,gBAACysB,GAAD,CAAUp4B,IAAK4mB,EAAE5mB,IAAM4O,EACjC4hB,eAAgBlY,EAChB+f,WAAY0C,EAAY/hB,MAAK1U,GAAMA,EAAGtE,KAAO4mB,EAAE5mB,MAAKkM,MACpDosB,YAAa1pB,EACb2pB,SAAU3R,EAAE5mB,IACZw4B,aAAe5R,EAAE5b,MAAMC,OAAS,EAAI2b,EAAE5b,MAAM,GAAK,OALlD,GADD,IAYD,MAAMqoC,EAAuB18B,EAAMuC,KAAKC,UAAU/B,UAuQlD,OAlOkB,gCACjB,uBAAKwF,MAAO,CACXgB,SAAU,SACV+C,IAAK,OACLC,KAAM,OACN/C,OAAQ,EACRmE,gBAAiB,UAIf8X,EAAkB,uBAAKld,MAAO,CAAES,WAAY,OAAQ2e,aAAc,OAAQnf,UAAW,OAAQxO,MAAO,QACpG2sB,GACO,MAKV,uBAAKpe,MAAO,CACXgR,SAAU,IACVnf,OAAQ,WAGR,uBAAKmO,MAAO,CACX4D,UAAW,QACX0iB,cAAe,OACftd,WAAY,OACZhI,SAAU,SACVC,OAAQ,EACR8C,IAAK,OACLqB,gBAAiB,UAEjB,gBAACvE,EAAA,EAAD,CAAQjC,QAAS,IAAMwpB,EAAc,CAAEjvB,KAAMm9B,GAA2BxO,6BAA8B1uB,QAAS,IAC9G4G,MAAO,CACNoF,gBAAkB,UAClBnG,MAAO,QACPsC,WAAY,UAJd,6BASD,gBAACynB,GAAA,EAAD,CAAgBC,UAAWhiB,GAAAA,GAC1B,gBAACuG,GAAA,EAAD,CAAO5b,KAAK,SACX,gBAAC6b,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,kBACA,gBAACA,GAAA,EAAD,CAAW4b,QAAS,EAAGL,MAAM,UAA7B,eAGF,gBAACtb,GAAA,EAAD,KACC,gBAACF,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,wCACA,gBAACA,GAAA,EAAD,CAAW4b,QAAS,EAAGL,MAAM,UAA7B,UAA0CuN,EAAqB1N,OAAOD,kBAevE,gBAACpb,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,yCACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,eAAgCuN,EAAqB1N,OAAO4N,wBAAwBtc,UAApF,YAAiGoc,EAAqB1N,OAAO4N,wBAAwBrc,YAArJ,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAA/C,UAA4DsN,EAAqB1N,OAAO4N,wBAAwB/N,WAAWzV,QAAQ,GAAnI,OAQD,gBAACzF,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,gDACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,WAA+BuN,EAAqB1N,OAAO6N,4BAA4Bvc,UAAvF,YAAoGoc,EAAqB1N,OAAO6N,4BAA4Btc,YAA5J,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAA/C,UAA4DsN,EAAqB1N,OAAO6N,4BAA4BhO,WAAWzV,QAAQ,GAAvI,OAGD,gBAACzF,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,iCACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,WAA+BuN,EAAqB1N,OAAO8N,0BAA0Bxc,UAArF,YAAkGoc,EAAqB1N,OAAO8N,0BAA0Bvc,YAAxJ,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAA/C,UAA4DsN,EAAqB1N,OAAO8N,0BAA0BjO,WAAWzV,QAAQ,GAArI,OAGD,gBAACzF,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,yCACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,WAA+BuN,EAAqB1N,OAAO+N,iCAAiCzc,UAA5F,YAAyGoc,EAAqB1N,OAAO+N,iCAAiCxc,YAAtK,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAA/C,UAA4DsN,EAAqB1N,OAAO+N,iCAAiClO,WAAWzV,QAAQ,GAA5I,OAGD,gBAACzF,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,yCACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,WAA+BuN,EAAqB1N,OAAOgO,yBAAyB1c,UAApF,YAAiGoc,EAAqB1N,OAAOgO,yBAAyBzc,YAAtJ,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAA/C,UAA4DsN,EAAqB1N,OAAOgO,yBAAyBnO,WAAWzV,QAAQ,GAApI,OAGD,gBAACzF,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,kCACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,WAA+BuN,EAAqB1N,OAAOiO,0BAA0B3c,UAArF,YAAkGoc,EAAqB1N,OAAOiO,0BAA0B1c,YAAxJ,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAA/C,UAA4DsN,EAAqB1N,OAAOiO,0BAA0BpO,WAAWzV,QAAQ,GAArI,OAGD,gBAACzF,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,6DACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,WAA+BuN,EAAqB1N,OAAOkO,oCAAoC5c,UAA/F,YAA4Goc,EAAqB1N,OAAOkO,oCAAoC3c,YAA5K,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAA/C,UAA4DsN,EAAqB1N,OAAOkO,oCAAoCrO,WAAWzV,QAAQ,GAA/I,OAED,gBAACzF,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,2CACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,WAA+BuN,EAAqB1N,OAAOmO,4BAA4B7c,UAAvF,YAAoGoc,EAAqB1N,OAAOmO,4BAA4B5c,YAA5J,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAA/C,UAA4DsN,EAAqB1N,OAAOmO,4BAA4BtO,WAAWzV,QAAQ,GAAvI,OAED,gBAACzF,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,oCACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,WAA+BuN,EAAqB1N,OAAOoO,0BAA0B9c,UAArF,YAAkGoc,EAAqB1N,OAAOoO,0BAA0B7c,YAAxJ,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAA/C,UAA4DsN,EAAqB1N,OAAOoO,0BAA0BvO,WAAWzV,QAAQ,GAArI,OAED,gBAACzF,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,mCACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,WAA+BuN,EAAqB1N,OAAOqO,2BAA2B/c,UAAtF,YAAmGoc,EAAqB1N,OAAOqO,2BAA2B9c,YAA1J,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAA/C,UAA4DsN,EAAqB1N,OAAOqO,2BAA2BxO,WAAWzV,QAAQ,GAAtI,OAED,gBAACzF,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,2BACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,WAA+BuN,EAAqB1N,OAAOxC,gBAAgBlM,UAA3E,YAAwFoc,EAAqB1N,OAAOxC,gBAAgBjM,YAApI,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAA/C,UAA4DsN,EAAqB1N,OAAOxC,gBAAgBqC,WAAWzV,QAAQ,GAA3H,OAED,gBAACzF,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,2BACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,WAA+BuN,EAAqB1N,OAAOsH,gBAAgBhW,UAA3E,YAAwFoc,EAAqB1N,OAAOsH,gBAAgB/V,YAApI,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAA/C,UAA4DsN,EAAqB1N,OAAOsH,gBAAgBzH,WAAWzV,QAAQ,GAA3H,OAED,gBAACzF,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,4BACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,WAA+BuN,EAAqB1N,OAAOsO,iBAAiBhd,UAA5E,YAAyFoc,EAAqB1N,OAAOsO,iBAAiB/c,YAAtI,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAA/C,UAA4DsN,EAAqB1N,OAAOsO,iBAAiBzO,WAAWzV,QAAQ,GAA5H,UAOJ,uBAAKnT,MAAO,CAAEkE,SAAU,QAASN,UAAW,SAC3C,yBAAG,wLAKL,gBAACkT,GAAA,GAAD,CAAMC,WAAS,EAACrvB,GAAG,aAClB,gBAACovB,GAAA,GAAD,CAAME,MAAI,EAACC,GAAI,IACd,sBAAIjX,MAAO,CAAES,WAAY,OAAQ2e,aAAc,SAA/C,4BAGD,gBAACtI,GAAA,GAAD,CAAME,MAAI,EAACC,GAAIluB,OAAO0jB,WAAa,IAAM,EAAI,IAC5C,gBAAC,GAAD,CACCiH,SAAU+iB,EAAqB1N,OAAO5xB,YACtCoU,cAAexR,EAAMuC,KAAKC,UAAUlM,QACpCsjB,YAAarZ,EACbsZ,eAAgBlY,KAIlB,gBAACob,GAAA,GAAD,CAAME,MAAI,EAACC,GAAIluB,OAAO0jB,WAAa,IAAM,EAAI,IAC5C,gBAAC2pB,GAAD,CACC1iB,SAAU+iB,EAAqB1N,OAAOuO,aACtC/rB,cAAexR,EAAMuC,KAAKC,UAAUlM,QACpCsjB,YAAarZ,EACbsZ,eAAgBlY,KAIlB,gBAACob,GAAA,GAAD,CAAME,MAAI,EAACC,GAAIluB,OAAO0jB,WAAa,IAAM,EAAI,IAC5C,gBAACypB,GAAD,CACCxiB,SAAU+iB,EAAqB1N,OAAOwO,sBACtChsB,cAAexR,EAAMuC,KAAKC,UAAUlM,QACpCsjB,YAAarZ,EACbsZ,eAAgBlY,KAIlB,gBAACob,GAAA,GAAD,CAAME,MAAI,EAACC,GAAIluB,OAAO0jB,WAAa,IAAM,EAAI,IAC5C,gBAAC0pB,GAAD,CACCziB,SAAU+iB,EAAqB1N,OAAOyO,oBACtCjsB,cAAexR,EAAMuC,KAAKC,UAAUlM,QACpCsjB,YAAarZ,EACbsZ,eAAgBlY,KAIlB,gBAACob,GAAA,GAAD,CAAME,MAAI,EAACC,GAAIluB,OAAO0jB,WAAa,IAAM,EAAI,IAC5C,gBAAC+M,GAAD,CACC9F,SAAU+iB,EAAqB1N,OAAO/0B,SACtCuX,cAAexR,EAAMuC,KAAKC,UAAUlM,QACpCsjB,YAAarZ,EACbsZ,eAAgBlY,KAIlB,gBAACob,GAAA,GAAD,CAAME,MAAI,EAACC,GAAIluB,OAAO0jB,WAAa,IAAM,EAAI,IAC5C,gBAAC,GAAD,CACCiH,SAAU+iB,EAAqB1N,OAAOv1B,WACtC+X,cAAexR,EAAMuC,KAAKC,UAAUlM,QACpCsjB,YAAarZ,EACbsZ,eAAgBlY,KAIlB,gBAACob,GAAA,GAAD,CAAME,MAAI,EAACC,GAAIluB,OAAO0jB,WAAa,IAAM,EAAI,IAC5C,gBAAC4pB,GAAD,CACC3iB,SAAU+iB,EAAqB1N,OAAO0O,kBACtClsB,cAAexR,EAAMuC,KAAKC,UAAUlM,QACpCsjB,YAAarZ,EACbsZ,eAAgBlY,MAKnB,qBAAGhU,GAAG,qBAAqBsY,MAAO,CAAEsB,QAAS,UAS9C,CC7ZM,SAASo2B,KAAqB,8CACpC,MAAM,MAAE39B,EAAF,SAASmE,GAAalR,EAAAA,WAAiBgR,IAEvC1D,EAAuCrN,MAAO7J,EAAmDU,EAA0ByX,EAAyBC,KACzJ,MAAM4hB,QAA0BoZ,GAA6BA,GAAsBz8B,EAAMuC,KAAKC,UAAjCi6B,CAAiFpzC,EAAKU,EAAOyX,EAASC,IACnK0C,EAAS,CAAE/E,KAAM8D,GAAYQ,mBAAoBrE,QAASgkB,GAA1D,EAGK1hB,EAA6CzO,UAElD,MAAMmwB,QAA0BoZ,GAA6BA,GAAyBz8B,EAAMuC,KAAKC,UAAgDnZ,IACjJ8a,EAAS,CAAE/E,KAAM8D,GAAYQ,mBAAoBrE,QAASgkB,GAA1D,EAGD,GAAIrjB,EAAMuC,KAAKG,QACd,OAAO,gBAAC,GAAD,MAER,MAAM4uB,EAAiBtxB,EAAMuC,KAAKC,UAAU/B,UAGtC8nB,EAAoB,GAC1B+I,SAAAA,EAAgB3D,OAAOjtB,MAAM9Q,KAAIyG,IAChCkyB,EAAWvzB,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE1I,IAA1C,IAID,IAAI66B,EAAuB,GAC3B,UAAAxoB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8ByE,WAA9B,mBAAmChR,aAAnC,SAA0C6F,KAAIyG,IAC7CmyB,EAAcxzB,KAAK,CAAEO,MAAOc,EAAGtM,MAAOw+B,EAAWlmB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAzE,IAID,IAAI0+B,EAAiB,GACjBD,EAAcl0B,OAAS,IAC1Bm0B,EAAiBD,EAAc54B,KAAIqgB,GAClCA,EAAElmB,SAKJ,MAAM2+B,EAAyB,GAC3BF,EAAcl0B,OAAS,EAC1Bg9B,SAAAA,EAAgB3D,OAAO/iC,WAAWwL,QAAO6Z,GAAKwY,EAAej8B,SAASyjB,EAAE0Y,SAAQ/4B,KAAIyG,IACnFqyB,EAAgB1zB,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE+qB,YAA/C,IAGDkQ,SAAAA,EAAgB3D,OAAO/iC,WAAWgF,KAAIyG,IACrCqyB,EAAgB1zB,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE+qB,YAA/C,IAKF,IAAIwH,EAA4B,GAChC,UAAA5oB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8BoE,gBAA9B,mBAAwC3Q,aAAxC,SAA+C6F,KAAIyG,IAClDuyB,EAAmB5zB,KAAK,CAAEO,MAAOc,EAAGtM,MAAO2+B,EAAgBrmB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAnF,IAID,IAAI8+B,EAAsB,GACtBD,EAAmBt0B,OAAS,IAC/Bu0B,EAAsBD,EAAmBh5B,KAAIqgB,GAC5CA,EAAElmB,SAKJ,MAAM++B,EAAoB,GACtBF,EAAmBt0B,OAAS,EAC/Bg9B,SAAAA,EAAgB3D,OAAO/H,KAAKxvB,QAAO6Z,GAAK4Y,EAAoBr8B,SAASyjB,EAAEmR,cAAaxxB,KAAIyG,IACvFyyB,EAAW9zB,KAAK,CAAEO,MAAOc,EAAEiD,gBAAiBvP,MAAOsM,EAAE+rB,WAArD,IAGDkP,SAAAA,EAAgB3D,OAAO/H,KAAKh2B,KAAIyG,IAC/ByyB,EAAW9zB,KAAK,CAAEO,MAAOc,EAAEiD,gBAAiBvP,MAAOsM,EAAE+rB,WAArD,IAKF,IAAI2G,EAAuB,GAC3B,UAAA/oB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8B+D,WAA9B,mBAAmCtQ,aAAnC,SAA0C6F,KAAIyG,IAC7C0yB,EAAc/zB,KAAK,CAAEO,MAAOc,EAAGtM,MAAO++B,EAAWzmB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAzE,IAQD,MAAMi/B,EAAsB,GAC5BsI,SAAAA,EAAgB3D,OAAO1E,MAAMr5B,KAAIyG,IAChC2yB,EAAah0B,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE1I,IAA5C,IAID,IAAIu7B,EAA4B,GAChC,UAAAlpB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8B+2B,gBAA9B,mBAAwCtjC,aAAxC,SAA+C6F,KAAIyG,IAAK,MACvD6yB,EAAmBl0B,KAAK,CACvBO,MAAOc,EACPtM,MAAK,UAAEi/B,EAAa3mB,MAAK4N,GAAKA,EAAE1a,OAASc,WAApC,aAAE,EAAsCtM,OAF9C,IAOD,IAAIo/B,EAA6B,GACjC,UAAAnpB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8B62B,sBAA9B,mBAA8CpjC,aAA9C,SAAqD6F,KAAIyG,IACxD8yB,EAAoBn0B,KAAK,CAAEO,MAAOc,EAAGtM,MAAOi/B,EAAa3mB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAjF,IAKD,MAAMq/B,EAAwB,GAC9BkI,SAAAA,EAAgB3D,OAAOrxB,KAAK1M,KAAIyG,IAC3BA,EAAE1I,IAAM,MACXy7B,EAAep0B,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE1I,IAC9C,IAIF,MAAM27B,EAAyB,GAC/BgI,SAAAA,EAAgB3D,OAAOrxB,KAAK1M,KAAIyG,IAC/BizB,EAAgBt0B,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE1I,IAA/C,IAID,IAAI07B,EAA2B,GAC/B,UAAArpB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8B82B,eAA9B,mBAAuCrjC,aAAvC,SAA8C6F,KAAIyG,IAAK,MACtDgzB,EAAkBr0B,KAAK,CACtBO,MAAOc,EACPtM,MAAK,UAAEq/B,EAAe/mB,MAAK4N,GAAKA,EAAE1a,OAASc,WAAtC,aAAE,EAAwCtM,OAFhD,IAOD,IAAIw/B,EAA4B,GAChC,UAAAvpB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8B42B,qBAA9B,mBAA6CnjC,aAA7C,SAAoD6F,KAAIyG,IACvDkzB,EAAmBv0B,KAAK,CAAEO,MAAOc,EAAGtM,MAAOu/B,EAAgBjnB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAnF,IAID,MAAOy/B,EAAQC,GAAax2B,EAAAA,SAAes2B,EAAmBj1B,OAAS,EAAI,iBAAmB,YAE9F,OACC,gCACC,gBAACyS,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,YACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOy+B,EACPmB,QAASpB,EACTzD,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAa86B,GAAAA,IAAAA,KAEbl8B,EAAUk8B,GAAAA,IAAAA,IAAyCz6B,EACnD,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAOX,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,iBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAO6+B,EACPe,QAASjB,EACT5D,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAa86B,GAAAA,SAAAA,KAEbl8B,EAAUk8B,GAAAA,SAAAA,IAA8Cz6B,EACxD,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAOX,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,YACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOg/B,EACPY,QAASb,EACThE,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAa86B,GAAAA,IAAAA,KAEbl8B,EAAUk8B,GAAAA,IAAAA,IAAyCz6B,EACnD,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAMX,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,gBACA,gBAACwe,GAAD,CACCC,YAAa,CAAC,WAAY,kBAC1BC,aAAckD,EACdlW,UAAWjd,IACVozB,EAAUpzB,EAAV,KAMS,YAAVmzB,EACD,gCACC,gBAACziB,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,iBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOs/B,EACPM,QAASP,EAAe9Y,UACxBwU,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAa86B,GAAAA,QAAAA,KAEbl8B,EAAUk8B,GAAAA,QAAAA,IAA6Cz6B,EACvD,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAMX,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,kBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOm/B,EACPS,QAASX,EACTlE,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAa86B,GAAAA,SAAAA,KAEbl8B,EAAUk8B,GAAAA,SAAAA,IAA8Cz6B,EACxD,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,eAOZ,gCACC,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,uBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOw/B,EACPI,QAASL,EAAgBhZ,UACzBwU,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAa86B,GAAAA,cAAAA,KAEbl8B,EAAUk8B,GAAAA,cAAAA,IAAmDz6B,EAC7D,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAMX,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,wBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOo/B,EACPQ,QAASX,EACTlE,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAa86B,GAAAA,eAAAA,KAEbl8B,EAAUk8B,GAAAA,eAAAA,IAAoDz6B,EAC9D,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,eAkCf,C,yHCtYM,MAAO04B,WAAiC3qC,EAAAA,UAE3ClE,YAAY6W,GACRwG,MAAMxG,GADS,4BAUQ,KACvBzW,KAAKu7B,SAAS,CAAEhzB,MAAO1I,OAAO0jB,WAAY1b,OAAQhI,OAAO4oB,aAAzD,IAXe,kBAsBV,IAED,gCACI,gBAAC4kB,GAAD,SAtBRrtC,KAAK6Q,MAAQ,CACTtI,MAAO,EACPV,OAAQ,EAGf,CAMM2zB,uBACH37B,OAAO47B,oBAAoB,SAAUz7B,KAAK07B,iBAC7C,CAEMC,oBACH97B,OAAO4Q,iBAAiB,SAAUzQ,KAAK07B,iBAC1C,ECUOr0B,GAAgBE,GAA4BA,EAAG8C,WAAWrI,OC4CtE,MAca6J,GAAmC,IAC5CZ,GAbH8yB,cAAe,CAAE7jC,IAAK,gBAAiBkM,MAAO,kBAC9C43B,eAAgB,CAAE9jC,IAAK,iBAAkBkM,MAAO,mBAChD63B,QAAS,CAAE/jC,IAAK,UAAWkM,MAAO,YAClC83B,SAAU,CAAEhkC,IAAK,WAAYkM,MAAO,aACpC+3B,SAAU,CAAEjkC,IAAK,WAAYkM,MAAO,sBACpC6F,YAAa,CAAE/R,IAAK,cAAekM,MAAO,gBAC1C8F,WAAY,CAAEhS,IAAK,aAAckM,MAAO,cACxC+F,WAAY,CAAEjS,IAAK,aAAckM,MAAO,YACxCg4B,qBAAsB,CAAElkC,IAAK,uBAAwBkM,MAAO,yBAC5D2F,eAAgB,CAAE7R,IAAK,iBAAkBkM,MAAO,qBC3F1C,IAAKiJ,GAUAC,GCbG,SAAS,KACtB,OAAO,IAAIE,OAAO,IAA0B,6CAC9C,E,SDCYH,GAAAA,EAAAA,EAAAA,KAAAA,GAAAA,OAAAA,EAAAA,EAAAA,MAAAA,GAAAA,QAAAA,EAAAA,EAAAA,UAAAA,GAAAA,W,EAAAA,KAAAA,GAAAA,CAAAA,I,SAUAC,GAAAA,EAAAA,EAAAA,KAAAA,GAAAA,OAAAA,EAAAA,EAAAA,MAAAA,GAAAA,QAAAA,EAAAA,EAAAA,UAAAA,GAAAA,YAAAA,EAAAA,EAAAA,YAAAA,GAAAA,a,EAAAA,KAAAA,GAAAA,CAAAA,IEJZ,IAAIQ,GAAqB,KACrBC,GAAW,CAAC,EACZ9Q,GAAO,CACPo/B,QAAS,GA2Eb,SAASruB,GAAyBC,EAAyBC,GACvD,MAAM1R,EAAKgO,KASX,OARAuD,GAASvR,GAAM,CAAC,EAChBuR,GAASvR,GAAI2R,QAAU,IAAInT,SAAQ,CAACwC,EAASvC,KAZjD,IAAc8B,IAaD,CAAEP,KAAIyR,OAAMC,WAZrBJ,GAAOM,YAAYrR,GAcfgR,GAASvR,GAAIgB,QAAUA,EACvBuQ,GAASvR,GAAIvB,OAASA,CAAtB,IAGG8S,GAASvR,GAAI2R,OACvB,CC5EM,MAaMu+B,GAAmB3qC,UDhB5B9E,GAAKo/B,QCiBS,KDfTx+B,OAAM,QAKPnF,QAAQC,IAAI,sBAEZmV,GAASA,IAAU,IAAIU,GAKvBV,GAAOW,iBAAiB,WAAYC,IAChC,MAAQzR,MAAM,GAAET,EAAF,KAAMyR,EAAN,QAAYC,IAAcQ,EAM3B,MAEL,UAAAX,GAASvR,UAAT,SAAcgB,QAAQ0Q,GAK9BH,GAASvR,QAAMtC,CAAf,IAMJ4T,GAAOW,iBAAiB,gBAAiBC,IACrC,MAAQzR,MAAM,GAAET,EAAF,KAAMyR,EAAN,QAAYC,IAAcQ,EAOhChW,QAAQD,MAAM,oBAAqByV,GACnCH,GAASvR,GAAIvB,OAAOiT,GAK5BH,GAASvR,QAAMtC,CAAf,KA7CJxB,QAAQC,IAAI,2BCenB,IAGC,aD6DSqV,GAAuCX,GAAAA,KAAwB,MC9DxE3U,QAAQC,IAAI,8BACCiW,GAAUC,EAAOA,EAAMlB,QAGpC,CAFC,MACDjV,QAAQD,MAAM,qBACd,GAGWqW,GAAgBD,IAC5B,MAAME,EAAwB,CAAC3J,EAAmB4J,KACjD,IAAKA,GAAoC,IAAtBA,EAAW7L,OAC7B,OAAQ,IAAI8L,IAEb,GAAIJ,EAAMlB,QACT,OAAQ,IAAIsB,IAEb,IAAIC,EAAY,IAAID,IAIpB,OAHAC,EAAUC,IAAIH,EAAW,GAAGhP,MAE5B6O,EAAQO,GAAUP,EAAVO,CAAiBhK,EAAW,CAAC4J,EAAW,GAAGhP,OAC5CkP,CAAP,EAOD,OAJAL,EAAM1J,QAAU,CAAC,EACjB0J,EAAMQ,cAAiBN,EAAsBlF,GAAAA,IAAAA,IAA6BgF,EAAMS,UAAUktB,OAAOjtB,OACjGV,EAAMW,mBAAqBT,EAAsBlF,GAAAA,SAAAA,IAAkCgF,EAAMS,UAAUktB,OAAO/iC,YAEnG,IAAMoV,EAAb,EASKD,GAAY7M,MAAO8M,EAAsBY,KAC9C,IACC,MAAMxS,QDgCD,SAAewS,GAGlB,OAAOzU,QAAQyU,IAAI,CACftC,GAAgBsC,GAChBrC,GAA0BqC,KAEzB/R,MAAKgS,GACK1B,GAAuDX,GAAAA,MAAyB,CACnFoC,MACAG,QAASF,EAAQ,GACjBG,QAASH,EAAQ,GACjB2sB,QAASp/B,GAAKo/B,WAI7B,CChDoB1tB,CAAiBc,GAE9BV,EAAwB,CAAC3J,EAAmB4J,KACjD,IAAKA,GAAoC,IAAtBA,EAAW7L,OAC7B,OAAQ,IAAI8L,IAEb,GAAIQ,EACH,OAAQ,IAAIR,IAEb,IAAIC,EAAY,IAAID,IAIpB,OAHAC,EAAUC,IAAIH,EAAW,GAAGhP,MAE5B6O,EAAQO,GAAUP,EAAVO,CAAiBhK,EAAW,CAAC4J,EAAW,GAAGhP,OAC5CkP,CAAP,EASD,OANAL,EAAMQ,cAAiBN,EAAsBlF,GAAAA,IAAAA,IAA6B5M,EAAKqS,UAAUktB,OAAOjtB,OAC1FV,EAAMW,mBAAqBT,EAAsBlF,GAAAA,SAAAA,IAAkC5M,EAAKqS,UAAUktB,OAAO/iC,YAC/GoV,EAAMlB,QAAU8B,EAChBZ,EAAMoB,WAAahT,EAAKgT,WACxBpB,EAAMS,UAAYrS,EAAKqS,UAEhBT,CAIP,CAHC,MAED,OADAnW,QAAQD,MAAM,2BACPoW,CACP,GAGWqB,GAAmBnO,UAC/B,IACC,MAAM9E,QDuBkBkT,ECvBgBtB,EAAM1J,QDwBrC6I,GAA+DX,GAAAA,UAA6B,CAC/F8C,iBACAksB,QAASp/B,GAAKo/B,WCxBpB,OADAxtB,EAAMS,UAAYrS,EACX,IAAI4R,EAIX,CAHC,MAED,OADAnW,QAAQD,MAAM,kCACPoW,CACP,CDiBK,IAAmBsB,CCjBxB,EAGWf,GAAaP,GAAyB,CAAC3W,EAAuCU,EAA0ByX,EAAyBC,KAC7I,MAAMnL,EAAmB5G,OAAO8I,OAAO,CAAC,EAAGwH,EAAM1J,SAC3CvB,EAA2B,iBAAVhL,EACpB,CAACA,GACDA,EAIG2X,EAA6BF,IAAaA,EAAQzM,SAAST,OAAS,EAAKkN,EAAQnM,SAAWmM,IAAY,IAAIpN,EAOlH,OANAsN,EAAY1M,KAAKD,GAEjBuB,EAAQjN,GAAQ,CAAEU,MAAOgL,EAAQ0M,gBAAepN,MAAOqN,EAAYrN,OAEnE2L,EAAM1J,QAAUA,EAET,IAAI0J,EAAX,EAIY2B,GAAe,CAAC3B,EAAsB3W,EAAuCU,EAAgB0X,KACzG,MAAMnL,EAAmB5G,OAAO8I,OAAO,CAAC,EAAGwH,EAAM1J,SAC3CsL,EAAwB7X,GAAS,KACjCyX,EAAUpN,EAAAA,YAA0BkC,EAASjN,GAC7C0L,EAASyM,EAAQzM,SACjB8M,EAAYD,EAAgB7M,EAAOqB,QAAOC,GAAKA,GAAKuL,IAAgB,KAEpEE,EAAIN,EAAQnM,UAAY,IAAIjB,EAWlC,OAVIyN,GACHC,EAAE9M,KAAK6M,GAERvL,EAAQjN,GAAQ,CAACU,MAAO+X,EAAE/M,SAAU0M,gBAAgBpN,MAAOyN,EAAEzN,OAEtC,IAAnByN,EAAEzN,MAAMC,eACJgC,EAAQjN,GAGhB2W,EAAM1J,QAAUA,EACT,IAAI0J,EAAX,E,IC1II89B,I,SAAAA,GAAAA,EAAAA,EAAAA,6BAAAA,GAAAA,+BAAAA,EAAAA,EAAAA,yBAAAA,GAAAA,2BAAAA,EAAAA,EAAAA,sBAAAA,GAAAA,uB,EAAAA,KAAAA,GAAAA,CAAAA,IAgBL,MAAMx7B,GAAsB,CAC3B3F,UAAW,GAKNmxB,GAAU,CAAC9tB,EAAcsD,KAC9B,MAAM,KAAElE,GAASkE,EAEjB,OAAQlE,GACP,KAAK0+B,GAAmB/P,6BACvB,MAAO,IAAK/tB,EAAYrD,UAAW2G,EAAOjE,SAE3C,KAAKy+B,GAAmB9P,yBACxB,KAAK8P,GAAmB7P,sBACvB,MAAO,IAAKjuB,EAAYrD,UAAW,GAEpC,QACC,OAAOqD,EATT,EAaD,IAAIkuB,GAsBA,CAAC,EAGE,SAAS6P,KACf,MAAO3P,EAAYC,GAAiBp7B,EAAAA,WAAiB66B,GAASxrB,KACxD,MAAEtC,EAAF,SAASmE,GAAalR,EAAAA,WAAiBgR,KAGtCkf,EAAiBC,GAAkBnwB,EAAAA,UAAe,GAOnD0O,EAAqCzO,MAAO7J,EAA2CU,KAC5F,MAAMs5B,QAA0B2a,GAAqBA,GAAiBh+B,EAAMuC,KAAKC,UAAgCnZ,EAAKU,IACtHoa,EAAS,CAAE/E,KAAM8D,GAAYQ,mBAAoBrE,QAASgkB,GAA1D,EAgDD,GA7CApwB,EAAAA,WAAgB,KACfkR,EAAS,CAAE/E,KAAM8D,GAAYM,8BAU7BrX,QAAQyU,IAAI,CAToB1N,WAC/Bg7B,SAAsB9xB,GAA4B,MAAlD,EAQYmyB,GALSr7B,WACrB,MAAMnJ,QAAci0C,GAAqBh+B,EAAMuC,KAAKC,WACpD2B,EAAS,CAAE/E,KAAM8D,GAAYK,uBAAwBlE,QAAStV,GAA9D,EAGuCykC,KACjC,KFgCLvvB,IAAUA,GAAOqkB,YACjBrkB,GAAS,KACTpV,QAAQC,IAAI,uBEjCb,IAEC,IAEHmJ,EAAAA,WAAgB,KACf,GAA4B,GAAxBm7B,EAAWzxB,UACd,OAED,IAAI8xB,EAAMwP,EAAatQ,OAAOzD,sBAIKh3B,WAClC,IACC,MAAM9E,QAAa+7B,GAAAA,2BAAqCsE,GAL5C,EAK0DL,EAAWzxB,WAC7EvO,EAAKg8B,eACRvgC,QAAQD,MAAMwE,EAAKg8B,cACnBiE,EAAc,CAAEjvB,KAAM0+B,GAAmB7P,yBAE1CI,EAAc,CAAEjvB,KAAM0+B,GAAmB9P,2BAClC3D,GAAoBj8B,EAAK85B,MAAO95B,EAAK2K,SAAUsxB,GAA8Bj8B,EAAK64B,UAAW,qBAGpG,CAFC,MACDoH,EAAc,CAAEjvB,KAAM0+B,GAAmB7P,uBACzC,GAGFiQ,EAA4B,GAG1B,CAAC9P,EAAWzxB,YAGXqD,EAAMuC,KAAKG,UAAY1C,EAAMuC,KAAKC,UAAU/B,UAC/C,OAAO,gBAAC,GAAD,MAWR,IAAI0jB,EAAqB,GACrBC,EAAc,GACdC,EAAQ,GAEZ,IAAK,MAAMh7B,KAAO2W,EAAMuC,KAAKC,UAAUlM,QAClC5G,OAAOwS,UAAU9X,eAAe+X,KAAKnC,EAAMuC,KAAKC,UAAUlM,QAASjN,IACtE86B,EAAmBnvB,KAAK,CAAE,IAAO3L,EAAK,OAAU2W,EAAMuC,KAAKC,UAAUlM,QAAQjN,GAAKU,MAAO,MAASiW,EAAMuC,KAAKC,UAAUlM,QAAQjN,GAAKgL,QAItI,IAAK,MAAMhL,KAAO20C,GACbtuC,OAAOwS,UAAU9X,eAAe+X,KAAK67B,GAAyB30C,IACjE+6B,EAAYpvB,KAAK,CAAE,IAAO3L,EAAK,MAAS20C,GAAwB30C,GAAKkM,QAIvE4uB,EAAmBlzB,SAAQgf,IAC1BA,EAAElb,OAAO9D,SAAQgH,IAChBosB,EAAMrvB,KAAK,gBAACysB,GAAD,CAAUp4B,IAAK4mB,EAAE5mB,IAAM4O,EACjC4hB,eAAgBlY,EAChB+f,WAAY0C,EAAY/hB,MAAK1U,GAAMA,EAAGtE,KAAO4mB,EAAE5mB,MAAKkM,MACpDosB,YAAa1pB,EACb2pB,SAAU3R,EAAE5mB,IACZw4B,aAAe5R,EAAE5b,MAAMC,OAAS,EAAI2b,EAAE5b,MAAM,GAAK,OALlD,GADD,IAYD,MAAM4pC,EAAej+B,EAAMuC,KAAKC,UAAU/B,UAgBpCmuB,EAAO,CACZtO,UAAW,EACXC,YAAa,EACbsO,WAAY,GAGPC,EAAQ,CACbxO,UAAW,EACXC,YAAa,EACbsO,WAAY,GAqOb,OAlOIoP,EAAatQ,OAAOoB,eAAiB,IACxCH,EAAKtO,UAAY2d,EAAatQ,OAAOoB,gBAAkBkP,EAAajP,OAAO70B,UAAUpF,OAAOkpC,EAAajP,OAAO70B,UAAUgW,OAAO3c,QAAQ,SAAW,GACpJo7B,EAAKrO,YAAc0d,EAAatQ,OAAOoB,eACvCH,EAAKC,WAAaD,EAAKtO,UAAYsO,EAAKrO,YAAc,IAEtDuO,EAAMxO,UAAY2d,EAAatQ,OAAOoB,gBAAkBkP,EAAajP,OAAOj1B,SAAShF,OAAOkpC,EAAajP,OAAOj1B,SAASoW,OAAO3c,QAAQ,SAAW,GACnJs7B,EAAMvO,YAAc0d,EAAatQ,OAAOoB,eACxCD,EAAMD,WAAaC,EAAMxO,UAAYwO,EAAMvO,YAAc,KAIxC,gCACjB,uBAAKta,MAAO,CACXgB,SAAU,SACV+C,IAAK,OACLC,KAAM,OACN/C,OAAQ,EACRmE,gBAAiB,UAIf8X,EAAkB,uBAAKld,MAAO,CAAES,WAAY,OAAQ2e,aAAc,OAAQnf,UAAW,OAAQxO,MAAO,QACpG2sB,GACO,MAKV,uBAAKpe,MAAO,CACXgR,SAAU,IACVnf,OAAQ,WAGR,uBAAKmO,MAAO,CACX4D,UAAW,QACX0iB,cAAe,OACftd,WAAY,OACZhI,SAAU,SACVC,OAAQ,EACR8C,IAAK,OACLqB,gBAAiB,UAEjB,gBAACvE,EAAA,EAAD,CAAQjC,QAAS,IAAMwpB,EAAc,CAAEjvB,KAAM0+B,GAAmB/P,6BAA8B1uB,QAAS,IACtG4G,MAAO,CACNoF,gBAAkB4yB,EAAatQ,OAAOoB,eAAiB,EAAK,UAAc,UAC1E7pB,MAAO,QACPsC,WAAY,UAJd,6BASD,gBAACynB,GAAA,EAAD,CAAgBC,UAAWhiB,GAAAA,GAC1B,gBAACuG,GAAA,EAAD,CAAO5b,KAAK,SACX,gBAAC6b,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,kBACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,aACA,gBAACvb,GAAA,EAAD,CAAWub,MAAM,UAAUjB,GAAcnkB,MAAzC,OAGF,gBAAC8J,GAAA,EAAD,KACC,gBAACF,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,gDACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8B8O,EAAatQ,OAAOoB,iBAClD,gBAACnb,GAAA,EAAD,CAAWub,MAAM,UAAUjB,GAAchP,WAG1C,gBAACvL,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,wBACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8B8O,EAAatQ,OAAOwQ,UAClD,gBAACvqB,GAAA,EAAD,CAAWub,MAAM,UAAUjB,GAAckQ,eAG1C,gBAACzqB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,yCACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8BP,EAAKC,WAAWzV,QAAQ,GAAtD,SAA6D,2BAA7D,eAAyEwV,EAAKtO,UAA9E,YAA2FsO,EAAKrO,YAAhG,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,UAAjB,MAsBD,gBAACxb,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,CAAW4b,QAAS,GACnB,+CAIF,gBAAC7b,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,gCACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8B8O,EAAatQ,OAAOwN,QAAQtM,WAAWzV,QAAQ,GAA7E,SAAoF,2BAApF,eAAgG6kB,EAAatQ,OAAOwN,QAAQ7a,UAA5H,YAAyI2d,EAAatQ,OAAOwN,QAAQ5a,YAArK,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAciN,UAGxE,gBAACxnB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,4DACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8B8O,EAAatQ,OAAO0Q,mBAAmBxP,WAAWzV,QAAQ,GAAxF,SAA+F,2BAA/F,eAA2G6kB,EAAatQ,OAAO0Q,mBAAmB/d,UAAlJ,YAA+J2d,EAAatQ,OAAO0Q,mBAAmB9d,YAAtM,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcmQ,qBAGxE,gBAAC1qB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,6DACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8B8O,EAAatQ,OAAO2Q,oBAAoBzP,WAAWzV,QAAQ,GAAzF,SAAgG,2BAAhG,eAA4G6kB,EAAatQ,OAAO2Q,oBAAoBhe,UAApJ,YAAiK2d,EAAatQ,OAAO2Q,oBAAoB/d,YAAzM,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcoQ,sBAGxE,gBAAC3qB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,8DACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8B8O,EAAatQ,OAAO4Q,qBAAqB1P,WAAWzV,QAAQ,GAA1F,SAAiG,2BAAjG,eAA6G6kB,EAAatQ,OAAO4Q,qBAAqBje,UAAtJ,YAAmK2d,EAAatQ,OAAO4Q,qBAAqBhe,YAA5M,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcqQ,uBAGxE,gBAAC5qB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,gEACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8B8O,EAAatQ,OAAO6Q,yBAAyB3P,WAAWzV,QAAQ,GAA9F,SAAqG,2BAArG,eAAiH6kB,EAAatQ,OAAO6Q,yBAAyBle,UAA9J,YAA2K2d,EAAatQ,OAAO6Q,yBAAyBje,YAAxN,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcsQ,2BAExE,gBAAC7qB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,wCACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8B8O,EAAatQ,OAAO8Q,OAAO5P,WAAWzV,QAAQ,GAA5E,SAAmF,2BAAnF,eAA+F6kB,EAAatQ,OAAO8Q,OAAOne,UAA1H,YAAuI2d,EAAatQ,OAAO8Q,OAAOle,YAAlK,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcuQ,SAExE,gBAAC9qB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,sDACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8B8O,EAAatQ,OAAO+Q,cAAc7P,WAAWzV,QAAQ,GAAnF,SAA0F,2BAA1F,eAAsG6kB,EAAatQ,OAAO+Q,cAAcpe,UAAxI,YAAqJ2d,EAAatQ,OAAO+Q,cAAcne,YAAvL,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcwQ,gBAGxE,gBAAC/qB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,sDACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8B8O,EAAatQ,OAAOgR,cAAc9P,WAAWzV,QAAQ,GAAnF,SAA0F,2BAA1F,eAAsG6kB,EAAatQ,OAAOgR,cAAcre,UAAxI,YAAqJ2d,EAAatQ,OAAOgR,cAAcpe,YAAvL,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcyQ,gBAGxE,gBAAChrB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,sDACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8B8O,EAAatQ,OAAOiR,cAAc/P,WAAWzV,QAAQ,GAAnF,SAA0F,2BAA1F,eAAsG6kB,EAAatQ,OAAOiR,cAActe,UAAxI,YAAqJ2d,EAAatQ,OAAOiR,cAAcre,YAAvL,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAc0Q,gBAGxE,gBAACjrB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,uDACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8B8O,EAAatQ,OAAOkR,eAAehQ,WAAWzV,QAAQ,GAApF,SAA2F,2BAA3F,eAAuG6kB,EAAatQ,OAAOkR,eAAeve,UAA1I,YAAuJ2d,EAAatQ,OAAOkR,eAAete,YAA1L,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAc2Q,iBAGxE,gBAAClrB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,yDACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8B8O,EAAatQ,OAAOmR,gBAAgB5D,QAAlE,IAA4E,2BAA5E,eAAwF+C,EAAatQ,OAAOmR,gBAAgBlY,IAA5H,cAAqIqX,EAAatQ,OAAOmR,gBAAgBhpB,IAAzK,MACA,gBAAClC,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAc4Q,kBAGxE,gBAACnrB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,2BACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8B8O,EAAatQ,OAAOnB,gBAAgBqC,WAAWzV,QAAQ,GAArF,SAA4F,2BAA5F,eAAwG6kB,EAAatQ,OAAOnB,gBAAgBlM,UAA5I,YAAyJ2d,EAAatQ,OAAOnB,gBAAgBjM,YAA7L,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAc1B,kBAExE,gBAAC7Y,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,2BACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8B8O,EAAatQ,OAAO2I,gBAAgBzH,WAAWzV,QAAQ,GAArF,SAA4F,2BAA5F,eAAwG6kB,EAAatQ,OAAO2I,gBAAgBhW,UAA5I,YAAyJ2d,EAAatQ,OAAO2I,gBAAgB/V,YAA7L,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcoI,kBAGxE,gBAAC3iB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,4BACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8B8O,EAAatQ,OAAO2P,iBAAiBzO,WAAWzV,QAAQ,GAAtF,SAA6F,2BAA7F,eAAyG6kB,EAAatQ,OAAO2P,iBAAiBhd,UAA9I,YAA2J2d,EAAatQ,OAAO2P,iBAAiB/c,YAAhM,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAcoP,mBAGxE,gBAAC3pB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,8CACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8B8O,EAAatQ,OAAOyI,gBAAgBvH,WAAWzV,QAAQ,GAArF,SAA4F,2BAA5F,eAAwG6kB,EAAatQ,OAAOyI,gBAAgB9V,UAA5I,YAAyJ2d,EAAatQ,OAAOyI,gBAAgB7V,YAA7L,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAckI,kBAGxE,gBAACziB,GAAA,EAAD,KACC,gBAACC,GAAA,EAAD,kDACA,gBAACA,GAAA,EAAD,CAAWub,MAAM,UAAjB,UAA8B8O,EAAatQ,OAAOoR,qBAAqBlQ,WAAWzV,QAAQ,GAA1F,SAAiG,2BAAjG,eAA6G6kB,EAAatQ,OAAOoR,qBAAqBze,UAAtJ,YAAmK2d,EAAatQ,OAAOoR,qBAAqBxe,YAA5M,MACA,gBAAC3M,GAAA,EAAD,CAAWub,MAAM,SAASlpB,MAAO,CAAEmpB,WAAY,QAAUlB,GAAc6Q,0BAQ3E,uBAAK94B,MAAO,CAAEkE,SAAU,QAASN,UAAW,SAC3C,yBAAG,wjBAAH,MASD,uBAAK5D,MAAO,CAAEkE,SAAU,QAASN,UAAW,SAC3C,yBAAG,uLAGJ,uBAAK5D,MAAO,CAAE4D,UAAW,SACxB,wDAA+B,qBAAG3a,KrL9ZI,+CqL8Z8BkiC,OAAO,UAA5C,kDAA/B,gEAKF,qBAAGzjC,GAAG,qBAAqBsY,MAAO,CAAEsB,QAAS,UAS9C,CC5aM,SAASy3B,KAAa,8CAC5B,MAAM,MAAEh/B,EAAF,SAASmE,GAAalR,EAAAA,WAAiBgR,IAEvC1D,EAA+BrN,MAAO7J,EAA2CU,EAA0ByX,EAAyBC,KACzI,MAAM4hB,QAA0B2a,GAAqBA,GAAch+B,EAAMuC,KAAKC,UAAzBw7B,CAAyD30C,EAAKU,EAAOyX,EAASC,IACnI0C,EAAS,CAAE/E,KAAM8D,GAAYQ,mBAAoBrE,QAASgkB,GAA1D,EAGK1hB,EAAqCzO,UAE1C,MAAMmwB,QAA0B2a,GAAqBA,GAAiBh+B,EAAMuC,KAAKC,UAAgCnZ,IACjH8a,EAAS,CAAE/E,KAAM8D,GAAYQ,mBAAoBrE,QAASgkB,GAA1D,EAGD,GAAIrjB,EAAMuC,KAAKG,QACd,OAAO,gBAAC,GAAD,MAER,MAAM4uB,EAAiBtxB,EAAMuC,KAAKC,UAAU/B,UAGtC8nB,EAAoB,GAC1B+I,SAAAA,EAAgB3D,OAAOjtB,MAAM9Q,KAAIyG,IAChCkyB,EAAWvzB,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE1I,IAA1C,IAID,IAAI66B,EAAuB,GAC3B,UAAAxoB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8ByE,WAA9B,mBAAmChR,aAAnC,SAA0C6F,KAAIyG,IAC7CmyB,EAAcxzB,KAAK,CAAEO,MAAOc,EAAGtM,MAAOw+B,EAAWlmB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAzE,IAID,IAAI0+B,EAAiB,GACjBD,EAAcl0B,OAAS,IAC1Bm0B,EAAiBD,EAAc54B,KAAIqgB,GAClCA,EAAElmB,SAKJ,MAAM2+B,EAAyB,GAC3BF,EAAcl0B,OAAS,EAC1Bg9B,SAAAA,EAAgB3D,OAAO/iC,WAAWwL,QAAO6Z,GAAKwY,EAAej8B,SAASyjB,EAAE0Y,SAAQ/4B,KAAIyG,IACnFqyB,EAAgB1zB,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE+qB,YAA/C,IAGDkQ,SAAAA,EAAgB3D,OAAO/iC,WAAWgF,KAAIyG,IACrCqyB,EAAgB1zB,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE+qB,YAA/C,IAKF,IAAIwH,EAA4B,GAChC,UAAA5oB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8BoE,gBAA9B,mBAAwC3Q,aAAxC,SAA+C6F,KAAIyG,IAClDuyB,EAAmB5zB,KAAK,CAAEO,MAAOc,EAAGtM,MAAO2+B,EAAgBrmB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAnF,IAID,IAAI8+B,EAAsB,GACtBD,EAAmBt0B,OAAS,IAC/Bu0B,EAAsBD,EAAmBh5B,KAAIqgB,GAC5CA,EAAElmB,SAKJ,MAAM++B,EAAoB,GACtBF,EAAmBt0B,OAAS,EAC/Bg9B,SAAAA,EAAgB3D,OAAO/H,KAAKxvB,QAAO6Z,GAAK4Y,EAAoBr8B,SAASyjB,EAAEmR,cAAaxxB,KAAIyG,IACvFyyB,EAAW9zB,KAAK,CAAEO,MAAOc,EAAEiD,gBAAiBvP,MAAOsM,EAAE+rB,WAArD,IAGDkP,SAAAA,EAAgB3D,OAAO/H,KAAKh2B,KAAIyG,IAC/ByyB,EAAW9zB,KAAK,CAAEO,MAAOc,EAAEiD,gBAAiBvP,MAAOsM,EAAE+rB,WAArD,IAKF,IAAI2G,EAAuB,GAC3B,UAAA/oB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8B+D,WAA9B,mBAAmCtQ,aAAnC,SAA0C6F,KAAIyG,IAC7C0yB,EAAc/zB,KAAK,CAAEO,MAAOc,EAAGtM,MAAO++B,EAAWzmB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAzE,IAQD,MAAMi/B,EAAsB,GAC5BsI,SAAAA,EAAgB3D,OAAO1E,MAAMr5B,KAAIyG,IAChC2yB,EAAah0B,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE1I,IAA5C,IAID,IAAIu7B,EAA4B,GAChC,UAAAlpB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8B+2B,gBAA9B,mBAAwCtjC,aAAxC,SAA+C6F,KAAIyG,IAAK,MACvD6yB,EAAmBl0B,KAAK,CACvBO,MAAOc,EACPtM,MAAK,UAAEi/B,EAAa3mB,MAAK4N,GAAKA,EAAE1a,OAASc,WAApC,aAAE,EAAsCtM,OAF9C,IAOD,IAAIo/B,EAA6B,GACjC,UAAAnpB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8B62B,sBAA9B,mBAA8CpjC,aAA9C,SAAqD6F,KAAIyG,IACxD8yB,EAAoBn0B,KAAK,CAAEO,MAAOc,EAAGtM,MAAOi/B,EAAa3mB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAjF,IAKD,MAAMq/B,EAAwB,GAC9BkI,SAAAA,EAAgB3D,OAAOrxB,KAAK1M,KAAIyG,IAC3BA,EAAE1I,IAAM,MACXy7B,EAAep0B,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE1I,IAC9C,IAIF,MAAM27B,EAAyB,GAC/BgI,SAAAA,EAAgB3D,OAAOrxB,KAAK1M,KAAIyG,IAC/BizB,EAAgBt0B,KAAK,CAAEO,MAAOc,EAAElF,KAAMpH,MAAOsM,EAAE1I,IAA/C,IAID,IAAI07B,EAA2B,GAC/B,UAAArpB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8B82B,eAA9B,mBAAuCrjC,aAAvC,SAA8C6F,KAAIyG,IAAK,MACtDgzB,EAAkBr0B,KAAK,CACtBO,MAAOc,EACPtM,MAAK,UAAEq/B,EAAe/mB,MAAK4N,GAAKA,EAAE1a,OAASc,WAAtC,aAAE,EAAwCtM,OAFhD,IAOD,IAAIw/B,EAA4B,GAChC,UAAAvpB,EAAMuC,KAAKC,UAAUlM,eAArB,mBAA8B42B,qBAA9B,mBAA6CnjC,aAA7C,SAAoD6F,KAAIyG,IACvDkzB,EAAmBv0B,KAAK,CAAEO,MAAOc,EAAGtM,MAAOu/B,EAAgBjnB,MAAK4N,GAAKA,EAAE1a,OAASc,IAAGtM,OAAnF,IAID,MAAOy/B,EAAQC,GAAax2B,EAAAA,SAAes2B,EAAmBj1B,OAAS,EAAI,iBAAmB,YAE9F,OACC,gCACC,gBAACyS,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,YACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOy+B,EACPmB,QAASpB,EACTzD,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAaq8B,GAAAA,IAAAA,KAEbz9B,EAAUy9B,GAAAA,IAAAA,IAAiCh8B,EAC3C,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAOX,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,iBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAO6+B,EACPe,QAASjB,EACT5D,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAaq8B,GAAAA,SAAAA,KAEbz9B,EAAUy9B,GAAAA,SAAAA,IAAsCh8B,EAChD,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAOX,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,YACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOg/B,EACPY,QAASb,EACThE,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAaq8B,GAAAA,IAAAA,KAEbz9B,EAAUy9B,GAAAA,IAAAA,IAAiCh8B,EAC3C,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAMX,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,gBACA,gBAACwe,GAAD,CACCC,YAAa,CAAC,WAAY,kBAC1BC,aAAckD,EACdlW,UAAWjd,IACVozB,EAAUpzB,EAAV,KAMS,YAAVmzB,EACD,gCACC,gBAACziB,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,iBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOs/B,EACPM,QAASP,EAAe9Y,UACxBwU,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAaq8B,GAAAA,QAAAA,KAEbz9B,EAAUy9B,GAAAA,QAAAA,IAAqCh8B,EAC/C,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAMX,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,kBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOm/B,EACPS,QAASX,EACTlE,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAaq8B,GAAAA,SAAAA,KAEbz9B,EAAUy9B,GAAAA,SAAAA,IAAsCh8B,EAChD,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,eAOZ,gCACC,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,uBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOw/B,EACPI,QAASL,EAAgBhZ,UACzBwU,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAaq8B,GAAAA,cAAAA,KAEbz9B,EAAUy9B,GAAAA,cAAAA,IAA2Ch8B,EACrD,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,cAMX,gBAAC6B,EAAA,EAAD,KACC,gBAACa,EAAA,EAAD,wBACA,gBAAC,MAAD,CACC8hB,SAAS,EACT3/B,MAAOo/B,EACPQ,QAASX,EACTlE,SAAUzuB,IAET,IAAI2L,EAAyB,GADP3L,EAEbpF,SAAQgf,GAAKjO,EAAahN,KAAKib,EAAE1a,SAEf,GAAvByM,EAAa1N,OAChBqN,EAAaq8B,GAAAA,eAAAA,KAEbz9B,EAAUy9B,GAAAA,eAAAA,IAA4Ch8B,EACtD,EAEF4nB,YAAa,MACbC,mBAAmB,EACnBC,OAAQ,CACPF,YAAcG,IAAD,IACTA,EACH7kB,MAAO,eAkCf,C,yHCtYM,MAAO+5B,WAAyBhsC,EAAAA,UAEnClE,YAAY6W,GACRwG,MAAMxG,GADS,4BAUQ,KACvBzW,KAAKu7B,SAAS,CAAEhzB,MAAO1I,OAAO0jB,WAAY1b,OAAQhI,OAAO4oB,aAAzD,IAXe,kBAsBV,IAED,gCACI,gBAACmmB,GAAD,SAtBR5uC,KAAK6Q,MAAQ,CACTtI,MAAO,EACPV,OAAQ,EAGf,CAMM2zB,uBACH37B,OAAO47B,oBAAoB,SAAUz7B,KAAK07B,iBAC7C,CAEMC,oBACH97B,OAAO4Q,iBAAiB,SAAUzQ,KAAK07B,iBAC1C,ECoCL,SA3BA,WACI,OACI,gCACL,gBAAC,EAAD,KACC,gBAACzmB,GAAD,KACC,gBAAC,GAAD,MACA,gBAAC2C,EAAA,EAAD,CAAK9B,GAAI,CAAEgC,SAAU,WAAY+C,IAAK,KACrC,gBAAC,KAAD,KACC,gBAAC,KAAD,CAAO9U,KAAK,IAAIhE,QAAS,gBAAC,GAAD,KAAa,gBAAC,GAAD,CAAMyY,KAAM,gBAAC8gB,GAAD,MAAsBxqB,aAAcoiB,GAAkBhhB,iBAAkBghB,GAAsB7W,aAAc,gBAAC8c,GAAD,MAAgBvd,SAAUsX,QACxL,gBAAC,KAAD,CAAOntB,KAAK,gBAAgBhE,QAAS,gBAAC,GAAD,KAAa,gBAAC,GAAD,CAAMyY,KAAM,gBAAC8gB,GAAD,MAAsBxqB,aAAcoiB,GAAkBhhB,iBAAkBghB,GAAsB7W,aAAc,gBAAC8c,GAAD,MAAgBvd,SAAUsX,QACpM,gBAAC,KAAD,CAAOntB,KAAK,sBAAsBhE,QAAS,gBAAC,GAAD,KAAa,gBAAC,GAAD,CAAMyY,KAAM,gBAACsjB,GAAD,MAAwBhtB,aAAc2sB,GAAoBvrB,iBAAkBurB,GAAwBphB,aAAc,gBAACmhB,GAAD,MAAkB5hB,SAAU6hB,QAClN,gBAAC,KAAD,CAAO13B,KAAK,qBAAqBhE,QAAS,gBAAC,GAAD,KAAa,gBAAC,GAAD,CAAMyY,KAAM,gBAAC4nB,GAAD,MAAyBtxB,aAAcquB,GAAqBjtB,iBAAkBitB,GAAyB9iB,aAAc,gBAAC6lB,GAAD,MAAmBtmB,SAAUujB,QACrN,gBAAC,KAAD,CAAOp5B,KAAK,mBAAmBhE,QAAS,gBAAC,GAAD,KAAa,gBAAC,GAAD,CAAMyY,KAAM,gBAAC8vB,GAAD,MAAuBx5B,aAAck3B,GAAmB91B,iBAAkB81B,GAAuB3rB,aAAc,gBAACguB,GAAD,MAAiBzuB,SAAUosB,QAC3M,gBAAC,KAAD,CAAOjiC,KAAK,kBAAkBhE,QAAS,gBAAC,GAAD,KAAa,gBAAC,GAAD,CAAMyY,KAAM,gBAAC6rB,GAAD,MAAsBv1B,aAAc0yB,GAAkBtxB,iBAAkBsxB,GAAsBnnB,aAAc,gBAAC+pB,GAAD,MAAgBxqB,SAAU4nB,QACtM,gBAAC,KAAD,CAAOz9B,KAAK,oBAAoBhE,QAAS,gBAAC,GAAD,KAAa,gBAAC,GAAD,CAAMyY,KAAM,gBAACotB,GAAD,MAAwB92B,aAAc21B,GAAoBv0B,iBAAkBu0B,GAAwBpqB,aAAc,gBAACsrB,GAAD,MAAkB/rB,SAAU6qB,QAChN,gBAAC,KAAD,CAAO1gC,KAAK,0BAA0BhE,QAAS,gBAAC,GAAD,KAAa,gBAAC,GAAD,CAAMyY,KAAM,gBAAC8xB,GAAD,MAA8Bx7B,aAAc65B,GAAkBz4B,iBAAkBy4B,GAAsBtuB,aAAc,gBAACgwB,GAAD,MAAwBzwB,SAAU+uB,QAC9N,gBAAC,KAAD,CAAO5kC,KAAK,0BAA0BhE,QAAS,gBAAC,GAAD,KAAa,gBAAC,GAAD,CAAMyY,KAAM,gBAACi0B,GAAD,MAA8B39B,aAAci/B,GAAiB79B,iBAAkB69B,GAAqB1zB,aAAc,gBAACmyB,GAAD,MAAwB5yB,SAAUm0B,QAC5N,gBAAC,KAAD,CAAOhqC,KAAK,kBAAkBhE,QAAS,gBAAC,GAAD,KAAa,gBAAC,GAAD,CAAMyY,KAAM,gBAACs1B,GAAD,MAAsBh/B,aAAc+9B,GAAkB38B,iBAAkB28B,GAAsBxyB,aAAc,gBAACwzB,GAAD,MAAgBj0B,SAAUizB,QACtM,gBAAC,KAAD,CAAO9oC,KAAK,sBAAsBhE,QAAS,gBAAC,GAAD,YAOjD,E,oCC3DD,MAcA,IAdciuC,EAAAA,GAAAA,GAAY,CACxBC,QAAS,CACPC,QAAS,CACP11B,KAAM21B,GAAAA,EAAAA,MAERC,UAAW,CACT51B,KAAM21B,GAAAA,EAAAA,MAER11C,MAAO,CACL+f,KAAM61B,GAAAA,EAAAA,S,mLCFR7V,GAAU,CAAC,EAEfA,GAAQ8V,kBAAoB,KAC5B9V,GAAQ+V,cAAgB,KAElB/V,GAAQgW,OAAS,UAAc,KAAM,QAE3ChW,GAAQiW,OAAS,KACjBjW,GAAQkW,mBAAqB,KAEhB,KAAI,KAASlW,IAKJ,MAAW,aAAiB,YChBrCmW,EAAAA,EAAoB7mC,SAAS0uB,eAAe,QACpDtb,OACD,gBAAC0zB,GAAA,EAAD,CAAe54B,MAAOA,IAElB,gBAAC64B,GAAA,GAAD,MACN,gBAAC,MAAD,CAAeC,S3LKgB,kC2LJ9B,gBAAC,GAAD,Q,gFCbCC,E,MAA0B,GAA4B,KAE1DA,EAAwBlrC,KAAK,CAACmrC,EAAOxyC,GAAI,qoCAAsoC,GAAG,CAAC,QAAU,EAAE,QAAU,CAAC,sCAAsC,MAAQ,GAAG,SAAW,woBAAwoB,eAAiB,CAAC,+uDAA+uD,WAAa,MAE5pH,S,iBCPA,IAAIiC,EAAM,CACT,OAAQ,KACR,UAAW,KACX,OAAQ,IACR,UAAW,KACX,aAAc,KACd,UAAW,KACX,aAAc,KACd,UAAW,KACX,aAAc,KACd,UAAW,KACX,aAAc,KACd,UAAW,KACX,aAAc,KACd,UAAW,KACX,aAAc,KACd,UAAW,IACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,aAAc,KACd,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,IACR,UAAW,IACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,IACR,UAAW,IACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,IACX,aAAc,IACd,UAAW,IACX,aAAc,IACd,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,IACR,UAAW,IACX,UAAW,KACX,aAAc,KACd,UAAW,KACX,aAAc,KACd,UAAW,KACX,aAAc,KACd,UAAW,KACX,aAAc,KACd,UAAW,KACX,aAAc,KACd,UAAW,KACX,aAAc,KACd,UAAW,KACX,aAAc,KACd,UAAW,KACX,aAAc,KACd,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,aAAc,KACd,UAAW,KACX,aAAc,KACd,UAAW,KACX,aAAc,KACd,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,QAAS,KACT,WAAY,KACZ,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,aAAc,KACd,UAAW,KACX,aAAc,KACd,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,aAAc,KACd,gBAAiB,KACjB,aAAc,KACd,gBAAiB,KACjB,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,GACR,UAAW,GACX,OAAQ,IACR,UAAW,IACX,OAAQ,KACR,UAAW,KACX,UAAW,KACX,aAAc,KACd,OAAQ,KACR,UAAW,KACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,aAAc,IACd,UAAW,IACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,IACR,UAAW,IACX,OAAQ,KACR,UAAW,KACX,aAAc,KACd,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,aAAc,KACd,UAAW,KACX,OAAQ,KACR,UAAW,KACX,WAAY,KACZ,cAAe,KACf,UAAW,KACX,aAAc,KACd,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,aAAc,KACd,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,IACR,UAAW,IACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,YAAa,KACb,eAAgB,KAChB,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,QAAS,KACT,WAAY,KACZ,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,UAAW,KACX,aAAc,KACd,QAAS,KACT,WAAY,KACZ,OAAQ,KACR,UAAW,KACX,QAAS,KACT,WAAY,KACZ,QAAS,KACT,aAAc,IACd,gBAAiB,IACjB,WAAY,KACZ,UAAW,KACX,aAAc,KACd,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,UAAW,KACX,OAAQ,KACR,YAAa,IACb,eAAgB,IAChB,UAAW,KACX,OAAQ,KACR,UAAW,KACX,aAAc,KACd,gBAAiB,KACjB,OAAQ,KACR,UAAW,KACX,UAAW,KACX,aAAc,KACd,UAAW,KACX,aAAc,KACd,UAAW,KACX,aAAc,KACd,UAAW,KACX,aAAc,MAIf,SAASwwC,EAAeC,GACvB,IAAI1yC,EAAK2yC,EAAsBD,GAC/B,OAAOE,EAAoB5yC,EAC5B,CACA,SAAS2yC,EAAsBD,GAC9B,IAAIE,EAAoBC,EAAE5wC,EAAKywC,GAAM,CACpC,IAAIlzC,EAAI,IAAIszC,MAAM,uBAAyBJ,EAAM,KAEjD,MADAlzC,EAAEuzC,KAAO,mBACHvzC,CACP,CACA,OAAOyC,EAAIywC,EACZ,CACAD,EAAezwC,KAAO,WACrB,OAAOD,OAAOC,KAAKC,EACpB,EACAwwC,EAAezxC,QAAU2xC,EACzBH,EAAOQ,QAAUP,EACjBA,EAAezyC,GAAK,I","sources":["webpack://qccat.qool.dash/./src/config/appUrlConfig.js","webpack://qccat.qool.dash/./src/qccat-ui/api/qccatStorage.ts","webpack://qccat.qool.dash/./src/qccat-ui/api/apiService.ts","webpack://qccat.qool.dash/./src/qccat-ui/api/authApi.ts","webpack://qccat.qool.dash/./src/qccat-ui/components/Auth.tsx","webpack://qccat.qool.dash/./src/qccat-ui/api/qccatClaims.ts","webpack://qccat.qool.dash/./src/AuthContext.tsx","webpack://qccat.qool.dash/./src/static/qca-white.png","webpack://qccat.qool.dash/./src/models/core/filter.ts","webpack://qccat.qool.dash/./src/helpers/arrayHelper.ts","webpack://qccat.qool.dash/./src/static/qca-black.png","webpack://qccat.qool.dash/./src/models/core/core.ts","webpack://qccat.qool.dash/./src/models/mdt/plotdata/reviewsByService.ts","webpack://qccat.qool.dash/./src/models/mdt/plotdata/patientsByService.ts","webpack://qccat.qool.dash/./src/models/mdt/plotdata/diagnosesByService.ts","webpack://qccat.qool.dash/./src/models/mdt/plotdata/hhsResidenceGroup.ts","webpack://qccat.qool.dash/./src/models/mdt/plotdata/morphology.ts","webpack://qccat.qool.dash/./src/models/common/plotdata/remoteness.ts","webpack://qccat.qool.dash/./src/models/common/plotdata/hhsOfResidence.ts","webpack://qccat.qool.dash/./src/models/mdt/plotdata/firstTreatment.ts","webpack://qccat.qool.dash/./src/models/mdt/plotdata/timeToFirstTreatment.ts","webpack://qccat.qool.dash/./src/models/common/plotdata/comorbidity.ts","webpack://qccat.qool.dash/./src/models/common/plotdata/sex.ts","webpack://qccat.qool.dash/./src/models/common/plotdata/tnmStage.ts","webpack://qccat.qool.dash/./src/models/common/plotdata/ses.ts","webpack://qccat.qool.dash/./src/models/common/plotdata/ageRange.ts","webpack://qccat.qool.dash/./src/models/common/plotdata/indigenousGroup.ts","webpack://qccat.qool.dash/./src/models/common/plotdata/ecogGroup.ts","webpack://qccat.qool.dash/./src/models/common/index.ts","webpack://qccat.qool.dash/./src/models/mdt/plotdata/core.ts","webpack://qccat.qool.dash/./src/helpers/index.ts","webpack://qccat.qool.dash/./src/api/dashboardApiService.ts","webpack://qccat.qool.dash/./src/api/dashboardApi.ts","webpack://qccat.qool.dash/./src/models/mdt/worker/models.ts","webpack://qccat.qool.dash/./src/models/mdt/worker/data.worker.ts","webpack://qccat.qool.dash/./src/api/qoolApiService.ts","webpack://qccat.qool.dash/./src/api/reportApi.ts","webpack://qccat.qool.dash/./src/models/mdt/worker/index.ts","webpack://qccat.qool.dash/./src/models/mdt/index.ts","webpack://qccat.qool.dash/./src/reducer/initialState.ts","webpack://qccat.qool.dash/./src/reducer/actions.ts","webpack://qccat.qool.dash/./src/reducer/appSettingsReducer.ts","webpack://qccat.qool.dash/./src/reducer/pageReducer.ts","webpack://qccat.qool.dash/./src/reducer/userSettingsReducer.ts","webpack://qccat.qool.dash/./src/reducer/index.ts","webpack://qccat.qool.dash/./src/AppContext.tsx","webpack://qccat.qool.dash/./src/pages/shared/header.tsx","webpack://qccat.qool.dash/./src/api/authApiService.ts","webpack://qccat.qool.dash/./src/pages/authenticate/index.tsx","webpack://qccat.qool.dash/./src/pages/authenticate/requireAuth.tsx","webpack://qccat.qool.dash/./src/pages/shared/page.tsx","webpack://qccat.qool.dash/./src/components/common/BlockHeadingComponent.tsx","webpack://qccat.qool.dash/./src/helpers/filterHelper.ts","webpack://qccat.qool.dash/./src/components/common/ChartOrMessage.tsx","webpack://qccat.qool.dash/./src/components/common/DashPaper.tsx","webpack://qccat.qool.dash/./src/components/common/SubHeading.tsx","webpack://qccat.qool.dash/./src/components/common/DashChart.tsx","webpack://qccat.qool.dash/./src/components/common/ChartIcons.tsx","webpack://qccat.qool.dash/./src/components/common/DataToCSV.tsx","webpack://qccat.qool.dash/./src/components/common/SimpleBreadcrumb.tsx","webpack://qccat.qool.dash/./src/components/common/DashTable.tsx","webpack://qccat.qool.dash/./src/components/common/CreateChart.tsx","webpack://qccat.qool.dash/./src/helpers/stringHelper.ts","webpack://qccat.qool.dash/./src/charts/core.tsx","webpack://qccat.qool.dash/./src/charts/mdt/ReviewsByServiceChart.tsx","webpack://qccat.qool.dash/./src/components/common/HierarchyBreadcrumb.tsx","webpack://qccat.qool.dash/./src/charts/mdt/MDTActivityTrendChart.tsx","webpack://qccat.qool.dash/./src/charts/mdt/PatientsBySiteChart.tsx","webpack://qccat.qool.dash/./src/charts/mdt/PatientsByMorphChart.tsx","webpack://qccat.qool.dash/./src/charts/mdt/HHSResidenceGroupPieChart.tsx","webpack://qccat.qool.dash/./src/charts/mdt/TumourStageChart.tsx","webpack://qccat.qool.dash/./src/charts/common/AgeAtDiagnosisChart.tsx","webpack://qccat.qool.dash/./src/charts/common/SexChart.tsx","webpack://qccat.qool.dash/./src/charts/common/ECOGChart.tsx","webpack://qccat.qool.dash/./src/charts/common/ComorbiditiesChart.tsx","webpack://qccat.qool.dash/./src/charts/common/FirstNationsStatusChart.tsx","webpack://qccat.qool.dash/./src/charts/common/SESChart.tsx","webpack://qccat.qool.dash/./src/charts/mdt/RemotenessChart.tsx","webpack://qccat.qool.dash/./src/charts/mdt/DataQualityByIndicatorChart.tsx","webpack://qccat.qool.dash/./src/charts/mdt/DataQualityByPeriod.tsx","webpack://qccat.qool.dash/./src/components/common/DashChips.tsx","webpack://qccat.qool.dash/./src/charts/mdt/OneYearSurvivalChart.tsx","webpack://qccat.qool.dash/./src/charts/mdt/ThreeYearSurvivalChart.tsx","webpack://qccat.qool.dash/./src/charts/mdt/FiveYearSurvivalChart.tsx","webpack://qccat.qool.dash/./src/charts/common/HHSOfResidenceChart.tsx","webpack://qccat.qool.dash/./src/charts/mdt/KMSurvivalChart.tsx","webpack://qccat.qool.dash/./src/pages/shared/pageloader.tsx","webpack://qccat.qool.dash/./src/pages/mdt/dashboard.tsx","webpack://qccat.qool.dash/./src/components/common/SideBySideOptions.tsx","webpack://qccat.qool.dash/./src/helpers/fileHelper.ts","webpack://qccat.qool.dash/./src/pages/shared/filterloader.tsx","webpack://qccat.qool.dash/./src/pages/mdt/filters.tsx","webpack://qccat.qool.dash/./src/pages/mdt/index.tsx","webpack://qccat.qool.dash/./src/models/noMdt/plotdata/remoteness.ts","webpack://qccat.qool.dash/./src/models/noMdt/plotdata/firstTreatment.ts","webpack://qccat.qool.dash/./src/models/noMdt/plotdata/core.ts","webpack://qccat.qool.dash/./src/models/noMdt/worker/models.ts","webpack://qccat.qool.dash/./src/models/noMdt/worker/data.worker.ts","webpack://qccat.qool.dash/./src/models/noMdt/worker/index.ts","webpack://qccat.qool.dash/./src/models/noMdt/index.ts","webpack://qccat.qool.dash/./src/charts/noMdt/FirstTreatmentChart.tsx","webpack://qccat.qool.dash/./src/charts/noMdt/OneYearSurvivalChart.tsx","webpack://qccat.qool.dash/./src/charts/noMdt/ThreeYearSurvivalChart.tsx","webpack://qccat.qool.dash/./src/charts/noMdt/KMSurvivalChart.tsx","webpack://qccat.qool.dash/./src/charts/noMdt/NoMDTPatientsTrendChart.tsx","webpack://qccat.qool.dash/./src/pages/noMdt/dashboard.tsx","webpack://qccat.qool.dash/./src/pages/noMdt/filters.tsx","webpack://qccat.qool.dash/./src/pages/noMdt/index.tsx","webpack://qccat.qool.dash/./src/models/breast/plotdata/morphology.ts","webpack://qccat.qool.dash/./src/models/breast/plotdata/core.ts","webpack://qccat.qool.dash/./src/models/breast/worker/models.ts","webpack://qccat.qool.dash/./src/models/breast/worker/data.worker.ts","webpack://qccat.qool.dash/./src/models/breast/worker/index.ts","webpack://qccat.qool.dash/./src/models/breast/index.ts","webpack://qccat.qool.dash/./src/pages/breast/dashboard.tsx","webpack://qccat.qool.dash/./src/pages/breast/filters.tsx","webpack://qccat.qool.dash/./src/pages/breast/index.tsx","webpack://qccat.qool.dash/./src/models/crc/plotData/primarySiteSummary.ts","webpack://qccat.qool.dash/./src/models/crc/plotData/morphology.ts","webpack://qccat.qool.dash/./src/models/crc/plotData/core.ts","webpack://qccat.qool.dash/./src/models/crc/worker/models.ts","webpack://qccat.qool.dash/./src/models/crc/worker/data.worker.ts","webpack://qccat.qool.dash/./src/models/crc/worker/index.ts","webpack://qccat.qool.dash/./src/models/crc/index.ts","webpack://qccat.qool.dash/./src/pages/crc/dashboard.tsx","webpack://qccat.qool.dash/./src/pages/crc/filters.tsx","webpack://qccat.qool.dash/./src/pages/crc/index.tsx","webpack://qccat.qool.dash/./src/models/brain/plotdata/morphology.ts","webpack://qccat.qool.dash/./src/models/brain/plotdata/core.ts","webpack://qccat.qool.dash/./src/models/brain/worker/models.ts","webpack://qccat.qool.dash/./src/models/brain/worker/data.worker.ts","webpack://qccat.qool.dash/./src/models/brain/worker/index.ts","webpack://qccat.qool.dash/./src/models/brain/index.ts","webpack://qccat.qool.dash/./src/pages/brain/dashboard.tsx","webpack://qccat.qool.dash/./src/pages/brain/filters.tsx","webpack://qccat.qool.dash/./src/pages/brain/index.tsx","webpack://qccat.qool.dash/./src/models/lung/plotdata/morphology.ts","webpack://qccat.qool.dash/./src/models/lung/plotdata/core.ts","webpack://qccat.qool.dash/./src/models/lung/worker/models.ts","webpack://qccat.qool.dash/./src/models/lung/worker/data.worker.ts","webpack://qccat.qool.dash/./src/models/lung/worker/index.ts","webpack://qccat.qool.dash/./src/models/lung/index.tsx","webpack://qccat.qool.dash/./src/pages/lung/dashboard.tsx","webpack://qccat.qool.dash/./src/pages/lung/filters.tsx","webpack://qccat.qool.dash/./src/pages/lung/index.tsx","webpack://qccat.qool.dash/./src/models/headAndNeck/overall/plotdata/morphology.ts","webpack://qccat.qool.dash/./src/models/headAndNeck/overall/plotdata/core.ts","webpack://qccat.qool.dash/./src/models/headAndNeck/overall/worker/models.ts","webpack://qccat.qool.dash/./src/models/headAndNeck/overall/worker/data.worker.ts","webpack://qccat.qool.dash/./src/models/headAndNeck/overall/worker/index.ts","webpack://qccat.qool.dash/./src/models/headAndNeck/index.ts","webpack://qccat.qool.dash/./src/pages/headAndNeck/dashboard.tsx","webpack://qccat.qool.dash/./src/pages/headAndNeck/filters.tsx","webpack://qccat.qool.dash/./src/pages/headAndNeck/index.tsx","webpack://qccat.qool.dash/./src/models/youthCancer/plotdata/morphology.ts","webpack://qccat.qool.dash/./src/models/youthCancer/plotdata/fertilityPreservation.ts","webpack://qccat.qool.dash/./src/models/youthCancer/plotdata/recurrence.ts","webpack://qccat.qool.dash/./src/models/youthCancer/plotdata/youthAgeRange.ts","webpack://qccat.qool.dash/./src/models/youthCancer/plotdata/gpDetailsProvided.ts","webpack://qccat.qool.dash/./src/models/youthCancer/plotdata/hadTreatment.ts","webpack://qccat.qool.dash/./src/models/youthCancer/plotdata/viewModel.ts","webpack://qccat.qool.dash/./src/models/youthCancer/plotdata/core.ts","webpack://qccat.qool.dash/./src/models/youthCancer/worker/models.ts","webpack://qccat.qool.dash/./src/models/youthCancer/worker/data.worker.ts","webpack://qccat.qool.dash/./src/models/youthCancer/worker/index.ts","webpack://qccat.qool.dash/./src/models/youthCancer/index.ts","webpack://qccat.qool.dash/./src/charts/youthCancer/PatientsBySiteChart.tsx","webpack://qccat.qool.dash/./src/charts/youthCancer/RemotenessChart.tsx","webpack://qccat.qool.dash/./src/charts/youthCancer/FertilityPreservationChart.tsx","webpack://qccat.qool.dash/./src/charts/youthCancer/RecurrenceChart.tsx","webpack://qccat.qool.dash/./src/charts/youthCancer/HadTreatmentChart.tsx","webpack://qccat.qool.dash/./src/charts/youthCancer/GPDetailsProvidedChart.tsx","webpack://qccat.qool.dash/./src/pages/youthCancer/dashboard.tsx","webpack://qccat.qool.dash/./src/pages/youthCancer/filters.tsx","webpack://qccat.qool.dash/./src/pages/youthCancer/index.tsx","webpack://qccat.qool.dash/./src/models/aml/plotdata/morphology.ts","webpack://qccat.qool.dash/./src/models/aml/plotdata/core.ts","webpack://qccat.qool.dash/./src/models/aml/worker/models.ts","webpack://qccat.qool.dash/./src/models/aml/worker/data.worker.ts","webpack://qccat.qool.dash/./src/models/aml/worker/index.ts","webpack://qccat.qool.dash/./src/models/aml/index.ts","webpack://qccat.qool.dash/./src/pages/aml/dashboard.tsx","webpack://qccat.qool.dash/./src/pages/aml/filters.tsx","webpack://qccat.qool.dash/./src/pages/aml/index.tsx","webpack://qccat.qool.dash/./src/App.tsx","webpack://qccat.qool.dash/./src/theme.ts","webpack://qccat.qool.dash/./src/styles/styles.scss?203b","webpack://qccat.qool.dash/./src/index.tsx","webpack://qccat.qool.dash/./src/styles/styles.scss","webpack://qccat.qool.dash/./node_modules/moment/locale/ sync ^\\.\\/.*$"],"sourcesContent":["export const ApplicationId = \"#{qccat.app.applicationId}\";\r\nexport const LoginUrl = \"#{qccat.auth.loginUrl}\";\r\nexport const WebServiceUrl = \"#{qccat.app.urlBase}/#{qccat.app.applicationName}/\";\r\nexport const NotifyRequestRejectedUrl = \"api/RequestIssue/NotifyRequestRejectedResponse\";\r\nexport const BreastTechnicalAppendixUrl = \"#{qccat.dash.www.breastTAUrl}\";\r\nexport const BreastIndicatorDefinitionsUrl = \"#{qccat.dash.www.breastIndicatorDefinitionsUrl}\";\r\nexport const CrcTechnicalAppendixUrl = \"#{qccat.dash.www.crcTAUrl}\";\r\nexport const ColonIndicatorDefinitionsUrl = \"#{qccat.dash.www.colonIndicatorDefinitionsUrl}\";\r\nexport const RectalIndicatorDefinitionsUrl = \"#{qccat.dash.www.rectalIndicatorDefinitionsUrl}\";\r\n//export const LungTechnicalAppendixUrl = \"#{qccat.dash.www.lungTAUrl}\";\r\nexport const LungIndicatorDefintionsUrl = \"#{qccat.dash.www.lungIndicatorDefinitionsUrl}\";\r\nexport const LUCiDUrl = \"#{qccat.dash.www.lucidUrl}\";\r\nexport const AMLIndicatorDefinitionsUrl = \"#{qccat.dash.www.amlIndicatorDefinitionsUrl}\";\r\nexport const AMLTechnicalAppendixUrl = \"#{qccat.dash.www.amlTAUrl}\";\r\nexport const BrainTechnicalAppendixUrl = \"#{qccat.dash.www.brainTAUrl}\";\r\nexport const BrainIndicatorDefinitionsUrl = \"#{qccat.dash.www.brainIndicatorDefinitionsUrl}\";\r\nexport const HeadAndNeckTechnicalAppendixUrl = \"#{qccat.dash.www.hanTAUrl}\";\r\nexport const HeadAndNeckIndicatorDefintionsUrl = \"#{qccat.dash.www.headAndNeckIndicatorDefinitionsUrl}\";\r\nexport const HHSLabel = \"#{qccat.app.hhsLabel}\";\r\nexport const StateLabel = \"#{qccat.app.stateLabel}\";\r\nexport const ServerAppBasename = \"/#{qccat.app.applicationName}/\";\r\nexport const DashboardKeys = () => JSON.parse(\"#{qccat.app.uidashboardkeys}\");\r\nexport const StateWideBreastIndicators = () => JSON.parse(`#{qccat.app.stateWideBreastIndicators}`);\r\nexport const StateWideLungIndicators = () => JSON.parse(`#{qccat.app.stateWideLungIndicators}`);\r\nexport const StateWideCRCIndicators = () => JSON.parse(`#{qccat.app.stateWideCRCIndicators}`);\r\nexport const StateWideBrainIndicators = () => JSON.parse(`#{qccat.app.stateWideBrainIndicators}`);\r\nexport const StateWideHANIndicators = () => JSON.parse(`#{qccat.app.stateWideHeadAndNeckIndicators}`);\r\nexport const StateWideAMLIndicators = () => JSON.parse(`#{qccat.app.stateWideAMLIndicators}`);\r\n","import { ISecurity, IValue, IState, IUserPosition, IMDT, IProject } from \"../models\";\r\n\r\nexport const StorageItems = {\r\n\tFACILITIES: \"facilities\",\r\n\tTITLES: \"titles\",\r\n\tSTATES: \"states\",\r\n\tPOSITIONS: \"positions\",\r\n\tCONTACTDETAILS: \"ContactDetails\",\r\n\tQOOLUSERASSOCIATEDDATA: \"qoolUserAssociatedData\",\r\n\tAPI_RETRIES: \"retries\",\r\n\tAJAX_MONITOR_LAST_PUSH_UP_TIME: \"ajaxMonitorLastPushUpTime\",\r\n};\r\n\r\nexport const acceptTermsKey : string = \"lastAcceptanceDate\"; \r\n\r\nexport const MaxApiRetries: number = 3;\r\nexport const USER = \"user\";\r\nexport const USERACCOUNTDETAILS = \"userAccountDetails\";\r\n\r\nexport class QCCATSessionStorage {\r\n\tprivate static getValue(key: string, refresh: boolean = false, onNotFound: any = null) {\r\n\t\tlet stored = sessionStorage.getItem(key);\r\n\t\tif (stored) {\r\n\t\t\ttry {\r\n\t\t\t\treturn JSON.parse(stored);\r\n\t\t\t} catch (error) {\r\n\t\t\t\tconsole.log(error);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\treturn onNotFound;\r\n\t}\r\n\tprivate static setValue(key: string, value: any): T {\r\n\t\tsessionStorage.setItem(key, JSON.stringify(value));\r\n\t\treturn value;\r\n\t}\r\n\tprivate static removeValue(key: string) {\r\n\t\tsessionStorage.removeItem(key);\r\n\t}\r\n\r\n\tpublic static resetExistingStorageValues = () => {\r\n\t\tfor (let prop in StorageItems) {\r\n\t\t\tif (StorageItems.hasOwnProperty(prop)) {\r\n\t\t\t\tsessionStorage.removeItem(StorageItems[prop]);\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t// Note that sessionStorage is limited in space. We may need to extend if caching is considerable.\r\n\r\n\tpublic static getUser = (refresh: boolean = false, onNotFound: Promise = null) => QCCATSessionStorage.getValue(USER, refresh) as ISecurity;\r\n\tpublic static setUser = (user: ISecurity) => QCCATSessionStorage.setValue(USER, user);\r\n\r\n\tpublic static removeUser = () => {\r\n\t\tQCCATSessionStorage.removeValue(USER);\r\n\t\tQCCATSessionStorage.removeValue(USERACCOUNTDETAILS);\r\n\t}\r\n\r\n\tpublic static resetApiRetries = () => QCCATSessionStorage.setValue(StorageItems.API_RETRIES, 0);\r\n\tpublic static incrementApiRetries = () => {\r\n\t\tlet retries = QCCATSessionStorage.getValue(StorageItems.API_RETRIES, false, 0) as number;\r\n\t\tQCCATSessionStorage.setValue(StorageItems.API_RETRIES, retries + 1);\r\n\t}\r\n\tpublic static reachedMaxApiRetries = (): boolean => (QCCATSessionStorage.getValue(StorageItems.API_RETRIES, false, 0) as number) >= MaxApiRetries;\r\n\r\n\tpublic static getUserAccountDetails = (refresh: boolean = false) => QCCATSessionStorage.getValue(USERACCOUNTDETAILS, refresh);\r\n\tpublic static setUserAccountDetails = (userAccountDetails) => QCCATSessionStorage.setValue(USERACCOUNTDETAILS, userAccountDetails);\r\n\r\n\tpublic static getFacilities = (refresh: boolean = false) => QCCATSessionStorage.getValue(StorageItems.FACILITIES, refresh) as IValue[];\r\n\tpublic static setFacilities = (facilities: IValue[]) => QCCATSessionStorage.setValue(StorageItems.FACILITIES, facilities);\r\n\r\n\tpublic static getFacilitiesByStateId = (stateId: string, refresh: boolean = false) => QCCATSessionStorage.getValue(`${StorageItems.FACILITIES}_${stateId}`, refresh) as IValue[];\r\n\tpublic static setFacilitiesByStateId = (stateId: string, facilities: IValue[]) => QCCATSessionStorage.setValue(`${StorageItems.FACILITIES}_${stateId}`, facilities);\r\n\r\n\tpublic static getTitles = (refresh: boolean = false) => QCCATSessionStorage.getValue(StorageItems.TITLES, refresh) as IValue[];\r\n\tpublic static setTitles = (titles: IValue[]) => QCCATSessionStorage.setValue(StorageItems.TITLES, titles);\r\n\r\n\tpublic static getLastAjaxMonitorPushUpTime = (refresh: boolean = false) => QCCATSessionStorage.getValue(StorageItems.AJAX_MONITOR_LAST_PUSH_UP_TIME, refresh);\r\n\tpublic static setLastAjaxMonitorPushUpTime = (lastTime: any) => QCCATSessionStorage.setValue(StorageItems.AJAX_MONITOR_LAST_PUSH_UP_TIME, lastTime);\r\n\r\n\tpublic static getStates = (refresh: boolean = false) => QCCATSessionStorage.getValue(StorageItems.STATES, refresh) as IState[];\r\n\tpublic static setStates = (states: IState[]) => QCCATSessionStorage.setValue(StorageItems.STATES, states);\r\n\r\n\tpublic static getPositions = (refresh: boolean = false) => QCCATSessionStorage.getValue(StorageItems.POSITIONS, refresh) as IValue[];\r\n\tpublic static setPositions = (positions: IValue[]) => QCCATSessionStorage.setValue(StorageItems.POSITIONS, positions);\r\n\r\n\tpublic static getContactDetails = (refresh: boolean = false) => QCCATSessionStorage.getValue(StorageItems.CONTACTDETAILS, refresh) as any;\r\n\tpublic static setContactDetails = (contactDetails: any) => QCCATSessionStorage.setValue(StorageItems.CONTACTDETAILS, contactDetails) as any;\r\n\r\n\tpublic static getQOOLUserAssociatedData = (refresh: boolean = false) => QCCATSessionStorage.getValue(StorageItems.QOOLUSERASSOCIATEDDATA, refresh) as any;\r\n\tpublic static setQOOLUserAssociatedData = (qoolUserAssociatedData: any) => QCCATSessionStorage.setValue(StorageItems.QOOLUSERASSOCIATEDDATA, qoolUserAssociatedData);\r\n\r\n\tpublic static clearLastTermsAcceptanceDate = () => QCCATSessionStorage.setLastTermsAcceptanceDate(undefined);\r\n\tpublic static setLastTermsAcceptanceDate = (value: any) => QCCATSessionStorage.setValue(acceptTermsKey, value);\r\n public static getLastTermsAcceptanceDate = () => QCCATSessionStorage.getValue(acceptTermsKey);\r\n}","import axios from \"axios\";\r\nimport { QCCATSessionStorage } from \"./qccatStorage\";\r\nimport * as uuid from \"uuid\";\r\nimport * as moment from \"moment\";\r\n\r\nimport { IAjaxMonitorConfig } from \"./../models\";\r\nexport interface INameValue { name: string; value: string; }\r\nexport interface IConfig { apiUrl: string; loginUrl: string; notifyRequestRejectedUrl?: string; }\r\nexport const unauthorizedErrorMessage = \"Unauthorized\";\r\nexport const defaultErrorMessage = \"An error occurred making the request.\";\r\n\r\n/**\r\n * axios interceptors for ajax monitoring begin\r\n */\r\nexport interface IJsMonitorHeader{\r\n\tstart?:\tstring;\r\n\tend?: \tstring;\r\n}\r\n\r\nexport interface IAjaxMonitorLog{\r\n id?: string;\r\n\tjsStartUTC?: string;\r\n\tjsFinishUTC?:string;\r\n\tserverStartUTC?: string;\r\n\tserverFinishUTC?:string;\t\r\n\trequest?: any;\r\n\tresponse?: string;\r\n\turl?: string;\r\n}\r\n\r\nconst DateFormat = \"YYYYMMDDHHmmssSSS\";\r\nconst insertAjaxTimeEndpointName = \"InsertAjaxTime\";\r\nconst insertAjaxTimeEndpoint = \"api/JsMonitor/InsertAjaxTime\";\r\nconst jsMonitorHeaderRequest = \"x-jsMonitor-request\";\r\nconst jsMonitorHeaderResponse = \"x-jsmonitor-response\";\r\n\r\n// Add a request interceptor\r\naxios.interceptors.request.use((config) => {\r\n\r\n\t//Inject js start time to the header of request.\r\n\tif (ApiService.ajaxMonitorConfig && ApiService.ajaxMonitorConfig.enabled)\r\n\t{\t\r\n\t\tconfig.headers[jsMonitorHeaderRequest] = JSON.stringify(\r\n\t\t\t{\r\n\t\t\t\tstart: moment(new Date()).utc().format(DateFormat)\r\n\t\t\t});\r\n\t}\r\n\t//process the original request.\r\n\treturn config;\t\r\n }, (error) => {\r\n return Promise.reject(error);\r\n});\r\n\r\n// Add a response interceptor\r\naxios.interceptors.response.use((response) =>{\r\n\r\n\tif (ApiService.ajaxMonitorConfig && ApiService.ajaxMonitorConfig.enabled){\t\t\r\n\t\t//Skip the request of insertAjaxTimeToServer itself\r\n\t\tif (response.config.url.toString().includes(insertAjaxTimeEndpointName)) return response;\t\r\n\t\t//Skip when x-jsmonitor header is missing.\r\n\t\tif( !response.config.headers[jsMonitorHeaderRequest] || !response.headers[jsMonitorHeaderResponse] ){\r\n\t\t\treturn response;\t\t\t\r\n\t\t}\r\n\r\n\t\tconst currentTimeUTC = moment(new Date()).utc().format(DateFormat);\r\n\t\tconst lastPushUpTime = QCCATSessionStorage.getLastAjaxMonitorPushUpTime() || moment(new Date().setFullYear(1900)).utc().format(DateFormat)\r\n\t\tconst pushUpTimespanSeconds = Math.abs(moment(currentTimeUTC, DateFormat).diff(moment(lastPushUpTime, DateFormat),'seconds'));\r\n\t\t//Skip within PushUpMaxSeconds\r\n\t\tif (pushUpTimespanSeconds < ApiService.ajaxMonitorConfig.ajaxPushUpMaxSeconds) return response;\r\n\r\n\t\t//Deserialize jsMonitor from headers\r\n\t\tlet jsMonitorResponse : IJsMonitorHeader;\r\n\t\tlet jsMonitorRequest : IJsMonitorHeader;\t\t\r\n\t\ttry {\r\n\t\t\tjsMonitorResponse = JSON.parse(response.headers[jsMonitorHeaderResponse]);\t\t\r\n\t\t\tjsMonitorRequest = JSON.parse((response as any).config.headers[jsMonitorHeaderRequest]);\t\t\t\r\n\t\t} catch (e) {\t\t\t\t\r\n\t\t\t//Skip when can not parse pushed objects\r\n\t\t\treturn response;\r\n\t\t}\r\n\r\n\t\t//Collect all times\r\n\t\tconst startTimeUTCServer = jsMonitorResponse.start;\r\n\t\tconst endTimeUTCServer = jsMonitorResponse.end;\r\n\t\tconst startTimeUTCJS = jsMonitorRequest.start;\r\n\t\tconst endTimeUTCJS = currentTimeUTC;\t\t\r\n\t\tlet jSTimespanMilliseconds = Math.abs(moment(endTimeUTCJS, DateFormat).diff(moment(startTimeUTCJS, DateFormat)));\r\n\r\n\t\t//When JS timespan more than configured value, push up to server\r\n\t\tif (jSTimespanMilliseconds > ApiService.ajaxMonitorConfig.ajaxMilliSeconds){\r\n\t\t\tlet ajaxMonitorLog : IAjaxMonitorLog = {\r\n\t\t\t\tid: uuid.v4(),\r\n\t\t\t\turl: response.config.url,\r\n\t\t\t\tjsStartUTC: moment(startTimeUTCJS, DateFormat).toISOString(),\r\n\t\t\t\tjsFinishUTC: moment(endTimeUTCJS, DateFormat).toISOString(),\r\n\t\t\t\tserverStartUTC: moment(startTimeUTCServer, DateFormat).toISOString(),\r\n\t\t\t\tserverFinishUTC: moment(endTimeUTCServer, DateFormat).toISOString(),\r\n\t\t\t\trequest: {body: JSON.stringify(response.config.data)},\r\n\t\t\t\tresponse: JSON.stringify(response.data),\r\n\t\t\t}\r\n\r\n\t\t\tinsertAjaxTimeToServer(ajaxMonitorLog);\r\n\t\t}\r\n\t}\r\n\r\n\t//process the original response.\r\n\treturn response;\t\t\r\n }, (error) => {\r\n return Promise.reject(error);\r\n});\r\n\r\nconst insertAjaxTimeToServer = (res : IAjaxMonitorLog) => {\r\n\tconst apiService = new ApiService({apiUrl: ApiService.ajaxMonitorServer, loginUrl: \"\"});\r\n\tQCCATSessionStorage.setLastAjaxMonitorPushUpTime(moment(new Date()).utc().format(DateFormat));\r\n\r\n\treturn new Promise((resolve, reject) => {\r\n\t\tapiService.post(insertAjaxTimeEndpoint, res).then((response) => {\r\n\t\t\tconsole.log(\"push up Ajax monitor obj to server.\");\r\n\t\t\tresolve(response);\r\n\t\t})\r\n\t\t.catch((error) => {\r\n\t\t\tconsole.log(\"push up Ajax monitor error, \", error);\r\n\t\t}\r\n\t\t);\t \r\n\t});\r\n}\r\n\r\n/**\r\n * axios interceptors for ajax monitoring end\r\n */ \r\n\r\n\r\nexport class ApiService {\r\n\tprivate _config: IConfig;\r\n\tprivate _alternateToken;\r\n\r\n\tconstructor(config: IConfig) {\r\n\t\tthis._config = config;\r\n\t}\r\n\r\n\tpublic static ajaxMonitorConfig;\r\n\tpublic static ajaxMonitorServer;\r\n\r\n\tpublic post(apiRoute: string, data: any = {}, additionalHeaders: any = null) {\r\n\t\tlet service = this;\r\n\t\tlet axiosConfig = this.getDefaultConfigWithToken();\r\n\r\n\t\tif (additionalHeaders) {\r\n\t\t\tObject.keys(additionalHeaders).map(k => {\r\n\t\t\t\taxiosConfig.headers[k] = additionalHeaders[k];\r\n\t\t\t});\t\t\t\r\n\t\t}\r\n\r\n\t\tlet apiUrl = this._config.apiUrl;\r\n\t\t\r\n\t\treturn new Promise((resolve, reject) => {\r\n\t\t\taxios.post(this.getFullUrl(apiUrl, apiRoute), data, axiosConfig)\r\n\t\t\t\t.then(function (response) {\t\t\t\t\t\t\r\n\t\t\t\t\tservice.handleRequestRejectedResponse(response, reject, service.getFullUrl(apiUrl, apiRoute), axiosConfig);\r\n\t\t\t\t\tQCCATSessionStorage.resetApiRetries();\r\n\t\t\t\t\tresolve(response.data);\r\n\t\t\t\t})\r\n\t\t\t\t.catch(function (error) {\r\n\t\t\t\t\tconsole.log(\"ApiService.Post Error\", error);\r\n\t\t\t\t\tlet isAuthorizationError = service.isUnauthorized(error);\r\n\t\t\t\t\tservice.createRejectResultFromError(reject, error, isAuthorizationError);\r\n\t\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n\tpublic get(apiRoute: string, params: INameValue[] = []) {\r\n\t\tlet service = this;\r\n\t\tlet urlParams = this.getUrlParams(params);\r\n\t\tlet url = this.getFullUrl(this._config.apiUrl, apiRoute) + urlParams;\r\n\t\tlet axiosConfig = this.getDefaultConfigWithToken();\r\n\r\n\t\treturn new Promise((resolve, reject) => {\r\n\t\t\taxios.get(url, axiosConfig)\r\n\t\t\t\t.then(function (response) {\r\n\t\t\t\t\tservice.handleRequestRejectedResponse(response, reject, url, axiosConfig);\r\n\t\t\t\t\tQCCATSessionStorage.resetApiRetries();\r\n\t\t\t\t\tresolve(response.data);\r\n\t\t\t\t})\r\n\t\t\t\t.catch(function (error) {\r\n\t\t\t\t\tconsole.log(\"ApiService.Get Error\", error);\r\n\t\t\t\t\tlet isAuthorizationError = service.isUnauthorized(error);\r\n\t\t\t\t\tservice.createRejectResultFromError(reject, error, isAuthorizationError);\r\n\t\t\t\t});\r\n\t\t});\r\n\t}\r\n\r\n\tprivate handleRequestRejectedResponse(response, reject, requestUrl, axiosConfig) {\r\n\t\tif (this.isRequestRejectedResponse(response))\r\n\t\t{\t\t\t\r\n\t\t\tthis.notifyOfRequestRejectedResponse(requestUrl, axiosConfig)\r\n\t\t\treject({ message: \"Invalid request\" });\r\n\t\t}\r\n\t}\r\n\r\n\tprivate isRequestRejectedResponse(response) {\r\n\t\tif (!response.status || !response.data)\r\n\t\t\treturn false;\r\n\t\t\r\n\t\tconst responseData = response.data.toString();\r\n\r\n\t\tif (response.status === 200 && responseData && responseData.startsWith(\"Request Rejected\"))\r\n\t\t{\t\t\t\r\n\t\t\treturn true;\r\n\t\t}\r\n\r\n\t\treturn false;\r\n\t}\r\n\r\n\tprivate notifyOfRequestRejectedResponse(initialRequestUrl, axiosConfig) {\r\n\t\tif (this._config.notifyRequestRejectedUrl) {\t\t\r\n\t\t\taxios.post(\r\n\t\t\t\tthis.getFullUrl(this._config.apiUrl, this._config.notifyRequestRejectedUrl), //\"api/RequestIssue/NotifyRequestRejectedResponse\" \r\n\t\t\t\t{\r\n\t\t\t\t\turl: initialRequestUrl\r\n\t\t\t\t}, \r\n\t\t\t\taxiosConfig\r\n\t\t\t);\r\n\t\t}\r\n\t}\t\r\n\r\n\tprivate createRejectResultFromError(reject, error, isAuthorizationError) {\r\n\t\tif (error.response && error.response.data) {\r\n\t\t\tlet responseData = error.response.data;\r\n\t\t\treject({\r\n\t\t\t\tmessage: responseData.message,\r\n\t\t\t\tfields: responseData.fields\r\n\t\t\t});\r\n\t\t}\r\n\t\telse {\r\n\t\t\treject({\r\n\t\t\t\tmessage: isAuthorizationError ? unauthorizedErrorMessage : defaultErrorMessage,\r\n\t\t\t\tfields: {}\r\n\t\t\t});\r\n\t\t}\r\n\t}\r\n\r\n\tprivate getFullUrl(apiUrl, apiRoute) {\r\n\t\treturn apiUrl + apiRoute;\r\n\t}\r\n\r\n\tprivate getUrlParams(params: INameValue[]): string {\r\n\t\tlet urlParams = \"\";\r\n\t\tparams.forEach(element => {\r\n\t\t\tif (urlParams !== \"\") {\r\n\t\t\t\turlParams += \"&\";\r\n\t\t\t}\r\n\t\t\telse {\r\n\t\t\t\turlParams += \"?\";\r\n\t\t\t}\r\n\r\n\t\t\turlParams += element.name + \"=\" + element.value;\r\n\t\t});\r\n\t\treturn urlParams;\r\n\t}\r\n\r\n\tprivate getDefaultConfigWithToken() {\r\n\t\treturn {\r\n\t\t\theaders: { \"Authorization\": \"Bearer \" + this.getToken() }\r\n\t\t};\r\n\t}\r\n\r\n\tprivate getToken() {\r\n\t\tlet user = QCCATSessionStorage.getUser();\r\n\t\treturn (user && user.userAccess && user.userAccess.access_token)\r\n\t\t\t? user.userAccess.access_token\r\n\t\t\t: \"\";\r\n\t}\r\n\r\n\tprivate isUnauthorized(error: any) {\r\n\t\tlet isAuthorizationError = false;\r\n\t\tif (error.response && error.response.status) {\r\n\t\t\tif (error.response.status === 401) {\r\n\t\t\t\tthis.redirectToLoginUrl();\r\n\t\t\t}\r\n\t\t\telse if (error.response.status === 403) {\r\n\t\t\t\tlet token = this.getToken();\r\n\t\t\t\tif (token === \"\") {\r\n\t\t\t\t\tthis.redirectToLoginUrl();\r\n\t\t\t\t}\r\n\t\t\t\telse {\r\n\t\t\t\t\tisAuthorizationError = true;\r\n\t\t\t\t\tQCCATSessionStorage.incrementApiRetries();\r\n\r\n\t\t\t\t\tif (QCCATSessionStorage.reachedMaxApiRetries()) {\r\n\t\t\t\t\t\tthis.redirectToLoginUrl();\r\n\t\t\t\t\t}\r\n\t\t\t\t\telse {\r\n\t\t\t\t\t\twindow.history.back();\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\treturn isAuthorizationError;\r\n\t}\r\n\r\n\tprivate redirectToLoginUrl = () => {\r\n\t\tQCCATSessionStorage.removeUser();\r\n\t\tQCCATSessionStorage.resetApiRetries();\r\n\t\twindow.location.href = this._config.loginUrl;\r\n\t}\r\n}\r\n","import { ApiService, IConfig, INameValue } from \"./apiService\";\r\nimport { IChangePasswordCommand, IResetPasswordCommand, IConfirmEmailCommand } from \"../models\";\r\nimport { QCCATSessionStorage } from \"./qccatStorage\";\r\n\r\nexport class AuthApi {\r\n\tprivate _apiService: ApiService;\r\n\r\n\tconstructor(apiService: ApiService) {\r\n\t\tthis._apiService = apiService;\r\n\t}\r\n\r\n\tpublic login = (user) => {\r\n\t\treturn this._apiService.post(\"api/Auth/Login\", { userName: user.username, Password: user.password});\r\n\t}\r\n\r\n\tpublic logout = () => {\r\n\t\treturn this._apiService.post(\"api/AppAuth/Logout\");\r\n\t}\r\n\r\n\tpublic createUser = (user) => {\r\n\t\treturn this._apiService.post(\"api/Auth/CreateUser\", user);\r\n\t}\r\n\r\n\t/**\r\n\t * Promise to get users account details\r\n\t */\r\n\tpublic getUsersAccountDetails = () => {\r\n\t\treturn this._apiService.get(`api/Auth/GetUsersAccountDetails`);\r\n\t}\r\n\r\n\t/**\r\n\t * Promise to change the password for the current user.\r\n\t */\r\n\tpublic changePassword = (command: IChangePasswordCommand) => this._apiService.post(\"api/Auth/ChangePassword\", command);\r\n\r\n\t/**\r\n\t * Promise to reset the user's password.\r\n\t */\r\n\tpublic resetPassword = (command: IResetPasswordCommand) => this._apiService.post(\"api/Auth/ResetPassword\", command);\r\n\r\n\t/**\r\n\t * Promise to confirm email.\r\n\t */\r\n\tpublic confirmEmail = (command: IConfirmEmailCommand) => this._apiService.post(\"api/Auth/ConfirmEmail\", command);\r\n\t\r\n\t/**\r\n\t * Promise to request a user's password is reset\r\n\t */\r\n\tpublic resetPasswordRequest = (email: string) => this._apiService.get(\"api/Auth/ResetPassword?email=\" + email);\r\n\r\n\t/**\r\n\t * Redirect the application to the next application url on success.\r\n\t */\r\n\tpublic redirectToApplication(nextAppWebServiceUrl, nextAppApplicationUrl, loginUrl) {\r\n\t\tlet redirectApiService = new ApiService( { apiUrl: nextAppWebServiceUrl, loginUrl: loginUrl });\r\n\t\treturn redirectApiService.get(\"api/AppAuth/GetAccessToken\", [])\r\n\t\t\t\t\t\t.then(response => {\r\n\t\t\t\t\t\t\twindow.location.href = nextAppApplicationUrl + \"Auth/\" + (response).oneTimeToken;\r\n\t\t\t\t\t\t})\r\n\t\t\t\t\t\t.catch(error => {\r\n\t\t\t\t\t\t\tthrow(error);\r\n\t\t\t\t\t\t});\r\n\t}\r\n\r\n\tpublic authenticate = (oneTimeToken) => {\r\n\t\tlet params = [ { name: \"k\", value: encodeURIComponent(oneTimeToken) }];\r\n\t\treturn this._apiService.get(\"api/AppAuth/A\", params);\r\n\t}\r\n\r\n\tpublic resyncAntiforgeryToken = () => {\r\n\t\treturn this._apiService.get(\"api/AppAuth/R\", []);\r\n\t}\r\n}","import * as React from \"react\";\r\nimport { AuthApi } from \"../api/authApi\";\r\nimport { ISecurity } from \"../models\";\r\nimport { ApiService } from \"qccat-ui/api/apiService\";\r\nimport { useNavigate } from \"react-router-dom\";\r\n\r\n\r\ninterface IProps {\r\n\toneTimeToken: string;\r\n\tapiService: ApiService;\r\n\tfailedAuthUrl: string;\r\n\tsuccessAuthRoute: string;\r\n\tstoreAuthenticatedUser: (security: ISecurity) => void;\r\n}\r\n\r\nfunction Auth({ oneTimeToken, apiService, failedAuthUrl, successAuthRoute, storeAuthenticatedUser }: IProps) {\r\n\r\n\tlet decodedOneTimeToken = decodeURIComponent(oneTimeToken);\r\n\tlet authApi = new AuthApi(apiService);\r\n\tlet navigate = useNavigate();\r\n\r\n\tconst [message, setMessage] = React.useState(\"Authenticating...\")\r\n\t\r\n\tReact.useEffect(() => {\r\n\t\tconst authenticate = async () => {\r\n\t\t\t\r\n\t\t\ttry {\r\n\t\t\t\tconst security = await authApi.authenticate(decodedOneTimeToken) as ISecurity;\r\n\t\t\t\tstoreAuthenticatedUser(security);\r\n\t\t\t\tnavigate(successAuthRoute, { replace: true });\r\n\t\t\t} catch (error) {\r\n\t\t\t\tconsole.error(error);\r\n\t\t\t\tsetMessage(`Failed to authenticate! The error was: ${error.message}`);\r\n\t\t\t\t// window.location.href = failedAuthUrl;\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tauthenticate();\r\n\t\r\n\t});\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t{message}\r\n\t\t\r\n\r\n\t)\r\n}\r\n\r\nexport { Auth };","import { QCCATSessionStorage } from \"../api/qccatStorage\";\r\n\r\nexport class QCCATClaims {\r\n\tpublic static userHasClaim = (claim: string) : boolean => {\r\n\t\tlet user = QCCATSessionStorage.getUser();\r\n\t\treturn (user) ? user.user.claims.indexOf(claim) >= 0 : false;\r\n\t}\r\n}","import { LoginUrl } from \"config/appUrlConfig\";\r\nimport { ISecurity, QCCATSessionStorage } from \"qccat-ui\";\r\nimport * as React from \"react\";\r\n\r\ninterface AuthContextType {\r\n\tuser: ISecurity;\r\n\tsignin: (security: ISecurity) => void;\r\n\tsignout: () => void;\r\n}\r\n\r\nlet AuthContext = React.createContext(null!);\r\n\r\nfunction AuthProvider({ children }: { children: React.ReactNode }) {\r\n\tlet hydrateUser = QCCATSessionStorage.getUser();\r\n\tlet [user, setUser] = React.useState(hydrateUser);\r\n\r\n\tlet signin = (security: ISecurity) => {\r\n\t\tQCCATSessionStorage.setUser(security);\r\n\t\tsetUser(security);\r\n\t};\r\n\r\n\tlet signout = () => {\r\n\t\tQCCATSessionStorage.removeUser();\r\n\t\tsetUser(null);\r\n\t\twindow.location.href = LoginUrl;\r\n\t};\r\n\r\n\tlet value = { user, signin, signout };\r\n\r\n\treturn {children};\r\n}\r\n\r\nfunction useAuth() {\r\n\treturn React.useContext(AuthContext);\r\n}\r\n\r\nexport { useAuth }\r\nexport default AuthProvider","export default __webpack_public_path__ + \"qca-white.png\";","import * as ArrayHelper from \"helpers/arrayHelper\";\r\n\r\nexport const DASH_PATH_DELIMITER = \"|\";\r\nexport const DASH_PATH_DELIMITER_UI = \" / \";\r\nexport const DASH_VALUE_DELIMITER = \"; \";\r\n\r\nexport interface IFilterKey { key: string, label: string }\r\nexport interface IFilterKeys { [key: string]: IFilterKey }\r\n\r\nexport type AddFilterBaseFunc = (key: keyof TFilterKey, value: string | string[] | number | number[], context?: FilterContext, labelOverride?: string) => void;\r\nexport type RemoveFilterBaseFunc = (key: keyof TFilterKey) => void;\r\n\r\n/**\r\n * Filter path interface - the path is just an array of parts\r\n */\r\nexport interface IFilterPath {\r\n parts: string[];\r\n}\r\n\r\n/**\r\n * More complex filter\r\n */\r\nexport interface IFilter extends IFilterPath {\r\n labelOverride: string | undefined;\r\n value: string[];\r\n}\r\n\r\n/**\r\n * Generic base for MdtFilters for each dash type\r\n */\r\nexport type IFilters = {\r\n [key in keyof T]?: IFilter\r\n}\r\n\r\nexport class FilterContext implements IFilterPath {\r\n parts: string[];\r\n\r\n constructor(parts: string[] = []) {\r\n this.parts = [...parts];\r\n }\r\n\r\n /**\r\n * Returns true if there's a parent that can be synthesized, false otherwise.\r\n * E.g. Given a filter context: fc with path |a|b\r\n * fc.hasParent() -> true\r\n * \r\n * Given a filter context: fc with an empty path |\r\n * fc.hasParent() -> false\r\n */\r\n hasParent = (): boolean => this.parts.length > 0;\r\n\r\n /**\r\n * Synthesize a parent of the current context using the path.\r\n * E.g. Given a filter context: fc with path |a|b|[c1, c2, c3] \r\n * fc.parent() -> |a|b\r\n */\r\n parent = (): FilterContext | undefined => {\r\n if (this.hasParent()) {\r\n return new FilterContext(ArrayHelper.chopRight(this.parts, 1));\r\n }\r\n\r\n return undefined; \r\n }\r\n\r\n /**\r\n * Returns a new a FilterContext from the path provided.\r\n * @param path The full path to build from (including values) in the form /a/b/c/[val1, val2] or /a/b/val\r\n */\r\n static fromPath = (path: string): FilterContext => {\r\n const parts = (path || \"\").split(DASH_PATH_DELIMITER).filter(p => p !== \"\");\r\n return new FilterContext(parts);\r\n }\r\n \r\n /**\r\n * Returns a new a FilterContext from the filter in the collection. A new empty FilterContext otherwise.\r\n * @param filters filters to search\r\n * @param filterKey key to find\r\n */\r\n static fromFilters = , TFilterKey>(filters: TFilter, filterKey: keyof TFilterKey): FilterContext => {\r\n const filter: IFilter = filters[filterKey];\r\n return filter && new FilterContext(filter.parts) || new FilterContext();\r\n }\r\n\r\n /**\r\n * Synthesize a FilterContext from the position in the path. Zero based index.\r\n * E.g. Given a filter context: fc with path: /a/b/c\r\n * fc.ancestor(0) -> / (new FilterContext) \r\n * fc.ancestor(1) -> /a\r\n * \r\n * @param depth where 0 is the root\r\n */\r\n ancestor = (depth: number): FilterContext => {\r\n const upToExcl = depth - 1;\r\n if (upToExcl < 0)\r\n return new FilterContext();\r\n\r\n return new FilterContext(this.parts.slice(0, upToExcl));\r\n }\r\n\r\n /**\r\n * Push the values to the parts array. If values has more than 1 element, \r\n * it will be formatted as a multi-value.\r\n * \r\n * E.g. Given a filter context: fc with path |a|b\r\n * fc.push([c]) -> |a|b|c\r\n * fc.push([c, d]) -> |a|b|[c, d]\r\n * \r\n * @param values array of values to append to the path\r\n */\r\n push = (values: string[]) => {\r\n if (values.length === 0)\r\n return;\r\n\r\n this.parts.push(\r\n (values.length === 1)\r\n ? values[0]\r\n : (\"[\" + values.join(DASH_VALUE_DELIMITER) + \"]\")\r\n );\r\n }\r\n\r\n /**\r\n * Format the parts into a path string using DASH_PATH_DELIMITER.\r\n * E.g. Given a filter context: fc with parts == [a, b, c] \r\n * fc.toPath() -> |a|b|c\r\n */\r\n toPath = (): string => {\r\n let path = \"\";\r\n for (let j = 0; j < this.parts.length; j++) {\r\n path += DASH_PATH_DELIMITER + this.parts[j];\r\n }\r\n\r\n return path;\r\n }\r\n\r\n /**\r\n * Returns the path formatted for UI use.\r\n * E.g. Given a filter context: fc with the path |a|b|[c1, c2]\r\n * context.pathLabel()\r\n * \r\n * @param delimiter The delimiter to use when formatting the path label\r\n */\r\n pathLabel = (delimiter: string = \"\"): string => {\r\n if (!delimiter || delimiter === \"\") \r\n delimiter = DASH_PATH_DELIMITER_UI;\r\n \r\n const parent = this.parent()\r\n const path = parent && parent.toPath() || \"\";\r\n let label = this.valuesLabel();\r\n \r\n label = path + DASH_PATH_DELIMITER + label;\r\n if (label.startsWith(DASH_PATH_DELIMITER)) {\r\n label = label.substring(1);\r\n }\r\n\r\n //Context might contain / so replace all at the end. Uses regex since string.replace only replaces one... :(\r\n return label.replace(new RegExp(`\\\\${DASH_PATH_DELIMITER}`, \"gm\"), delimiter);\r\n }\r\n\r\n /**\r\n * Returns the last element of the path into an array of one or more values.\r\n * \r\n * E.g. Given a filter context: fc with the path |a|b|[c1, c2]\r\n * fc.values() -> [c1, c2]\r\n * \r\n * Given a filter context: fc with the path |a|b|c\r\n * fc.values() -> [c]\r\n */\r\n values = (): string[] => {\r\n if (this.parts.length === 0)\r\n return [];\r\n\r\n return FilterContext.valuesFromPart(ArrayHelper.lastOrDefault(this.parts, null, \"\"));\r\n }\r\n\r\n /**\r\n * Returns part transformed into an array of one or more values.\r\n * \r\n * E.g. Given a filter context: fc with the path |a|b|[c1, c2] and we are checking the final part\r\n * FilterContext.valuesFromPart(\"[c1, c2]\") -> [c1, c2]\r\n * \r\n * Given a filter context: fc with the path |a|b|c and we are checking the final part\r\n * FilterContext.valuesFromPart(\"c\") -> [c]\r\n */\r\n static valuesFromPart(part: string): string[] {\r\n if (part.startsWith(\"[\") && part.endsWith(\"]\")) {\r\n return part.substring(1, part.length - 1).split(DASH_VALUE_DELIMITER);\r\n }\r\n\r\n return [part];\r\n }\r\n\r\n /**\r\n * Returns the last element of the path formatted for usage by the UI.\r\n * \r\n * E.g. Given a filter context: fc with the path |a|b|[c1, c2]\r\n * fc.values() -> \"[c1, c2]\"\"\r\n * \r\n * Given a filter context: fc with the path |a|b|c\r\n * fc.values() -> \"c\"\r\n */\r\n valuesLabel = (): string => {\r\n const values = this.values();\r\n if (values.length === 0)\r\n return \"\";\r\n\r\n return (values.length === 1)\r\n ? values[0]\r\n : (\"[\" + values.join(\", \") + \"]\");\r\n }\r\n}\r\n","type Identifier = (item: TValue) => string;\r\ntype Reducer = (previousValue: TAccumulator, currentValue: TValue, currentIndex: number, array: TValue[]) => TAccumulator;\r\ntype Map = (value: TValue, index: number, array: TValue[]) => TMap;\r\n\r\ninterface IRule {\r\n\r\n\t/** Tests the given item to see if it matches the rule */\r\n\tpredicate: (item: T) => boolean;\r\n\r\n\t/** Sort run after all the matched items are collected */\r\n\tsort?: (a: T, b: T) => number;\r\n}\r\n\r\nconst joiner = (fn: Identifier): Reducer => (t, v) => `${t}${fn(v)}`;\r\nconst defaultIdentifier: Identifier = item => typeof item === \"string\" ? item : (item || \"\").toString();\r\n\r\n/**\r\n * Compares two arrays to check if they have differences.\r\n * @param a One of the two lists to compare against each other.\r\n * @param b One of the two lists to compare against each other.\r\n * @param identifier Function runs over each element in the array. Returns a uniquely identifiable string to be used during comparison. Will default to a toString comparison, if A and B are string arrays it will default to comparing the string values directly.\r\n * @returns TRUE if the lists are different, FALSE if the list are the same.\r\n */\r\nexport const hasDifference = (a: T[] = [], b: T[] = [], identifier: Identifier = defaultIdentifier): boolean => \t\r\n\ta.length === 0 && b.length === 0 ? false :\r\n\ta.length !== b.length ? true :\r\n\ta.reduce(joiner(identifier), \"\") !== b.reduce(joiner(identifier), \"\");\r\n\r\n/**\r\n * Unzips an array.\r\n * @param array The array to unzip.\r\n * @param unzip the unzipper callback, data returned in index 1 and 2 will come out as members of the returned arrays index 1 and 2 respectively.\r\n * @returns an object containing an array of the unzipped lists.\r\n */\r\nexport const unzip = (array:T[] = [], unzip: Map = () => [null, null]): [U[], V[]] => {\r\n\r\n\tconst unzipped: [U[], V[]] = [ [], [] ];\r\n\t\r\n\tarray.forEach((v, i, a) => {\r\n\t\tconst [ item1, item2 ] = unzip(v, i, a);\r\n\t\tunzipped[0].push(item1);\r\n\t\tunzipped[1].push(item2);\r\n\t});\r\n\r\n\treturn unzipped;\r\n}\r\n\r\n/**\r\n * Returns the first matching item. Otherwise defaultValue. * \r\n * @param array The array to search\r\n * @param predicate The search predicate function\r\n * @param defaultValue The default value to return if not found\r\n */\r\nexport const firstOrDefault = (array:T[], predicate: (T) => boolean = null, defaultValue: T = null) => {\r\n\tif (array && Array.isArray(array))\r\n\t\tfor (let i = 0; i < array.length; i++)\r\n\t\t\tif (!predicate || predicate(array[i]))\r\n\t\t\t\treturn array[i];\r\n\r\n\treturn defaultValue;\r\n}\r\n\r\n/**\r\n * Returns the last matching item. Otherwise defaultValue. * \r\n * @param array The array to search\r\n * @param predicate The search predicate function\r\n * @param defaultValue The default value to return if not found\r\n */\r\nexport const lastOrDefault = (array:T[], predicate: (T) => boolean = null, defaultValue: T = null) => {\r\n\tif (array && Array.isArray(array))\r\n\t\tfor (let i = array.length - 1; i >= 0; i--)\r\n\t\t\tif (!predicate || predicate(array[i]))\r\n\t\t\t\treturn array[i];\r\n\r\n\treturn defaultValue;\r\n}\r\n\r\n/**\r\n * For a given list of item, each item will be matched against a rule.\r\n * The item's position in the output list is determined by which rule it matches.\r\n * An items that didn't match a rule will be at the buttom of the output list.\r\n * @param list list of items to run the rules against\r\n * @param rules List of rules to match against. Rule order matters, each list item will only match a maximum of a single rule\r\n */\r\nexport const cascadingSort = (list: T[], rules: IRule[]): T[] => {\r\n\r\n\tconst ruleMatches: T[][] = rules.map(() => []);\r\n\tconst remaining: T[] = [];\r\n\r\n\tlist.forEach(item =>\r\n\t\t!!rules.find((rule, i) => rule.predicate(item) && !!ruleMatches[i].push(item))\r\n\t\t|| remaining.push(item)\r\n\t);\r\n\r\n\treturn ruleMatches.reduce((t, matchGroup, i) => \r\n\t\tt.concat(rules[i].sort ? matchGroup.sort(rules[i].sort) : matchGroup)\r\n\t, []).concat(remaining);\r\n};\r\n\r\n/**\r\n * Returns a new array with the distinct/unique elements from the source array\r\n * @param array array to select the distinct elements from.\r\n */\r\nexport function distinct(array: T[]): Array {\r\n\treturn [...new Set(array)];\r\n}\r\n\r\n/**\r\n * Chops x elements off the tail of the array\r\n * @param list \r\n * @param x \r\n */\r\nexport function chopRight(array: T[], x: number) {\r\n\tif (!array)\r\n\t\treturn [];\r\n\r\n\tconst keep = array.length - x;\r\n\tif (keep < 0)\r\n\t\treturn [];\r\n\r\n\treturn array.slice(0, keep);\r\n}\r\n\r\n/**\r\n * Returns the right x elements. If x < 0 x is interpreted as 0 - (-1 * x)\r\n * @param list \r\n * @param x \r\n */\r\nexport function right(array: T[], x: number) {\r\n\tif (!array)\r\n\t\treturn [];\r\n\r\n\tlet start;\r\n\r\n\tif (x < 0) {\r\n\t\tstart = (x * -1);\r\n\t} else {\r\n\t\tstart = array.length - x;\r\n\t}\r\n\r\n\tif (start < array.length)\r\n\t\treturn array.slice(start, array.length);\r\n\r\n\treturn [];\r\n}\r\n\r\n/**\r\n * Chops x elements off the start of the array\r\n * @param list \r\n * @param x \r\n */\r\nexport function chopLeft(array: T[], x: number) {\r\n\tif (!array)\r\n\t\treturn [];\r\n\r\n\tif (x <= 0)\r\n\t\treturn array;\r\n\r\n\tif (x >= array.length)\r\n\t\treturn [];\r\n\r\n\treturn array.slice(x);\r\n}\r\n\r\n/**\r\n * Returns the left x elements. If x < 0 x is interpreted as 0 - (-1 * x)\r\n * @param list \r\n * @param x \r\n */\r\nexport function left(array: T[], x: number) {\r\n\tif (!array || x <= 0)\r\n\t\treturn [];\r\n\r\n\tif (x > array.length)\r\n\t\treturn array;\r\n\r\n\treturn array.slice(0, x);\r\n}","export default __webpack_public_path__ + \"qca-black.png\";","import html2canvas from \"html2canvas\";\r\nimport watermark from \"static/qca-black.png\";\r\n\r\n\r\n/**\r\n * This module contains the common core data structures and functions for the dashboard components\r\n */\r\nexport const monthLabels = [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\", \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"];\r\n\r\n/**\r\n * Lightweight precomputed date for viewmodel\r\n */\r\nexport interface IStringDate {\r\n year: string; //e.g \"2010\"\r\n monthIndex: number; //zero based index into monthLabels\r\n dd: string; //e.g. \"01\"\r\n week: string; //e.g. W01\r\n dateLabel: string;\r\n}\r\n/**\r\n * DD-MMM-YYYY\r\n * @param d \r\n */\r\nexport function dateLabel(d: IStringDate) {\r\n return d.dd + \"-\" + monthLabels[d.monthIndex] + \"-\" + d.year;\r\n}\r\n\r\n/**\r\n * Facility dimension model \r\n */\r\nexport interface IDimFacility { \r\n facilityId: number;\r\n name: string;\r\n abbrev: string;\r\n hhsId: number;\r\n}\r\n\r\n/**\r\n * Facility dimension model \r\n */\r\nexport interface IDimMDT { \r\n mdtNameId: number; \r\n name: string;\r\n nameAndFacility: string;\r\n facilityId: number;\r\n hhsId: number; \r\n}\r\n\r\n/**\r\n * Common structure for generic dimensions\r\n */\r\nexport interface IDimension { \r\n id: number;\r\n name: string;\r\n} \r\n\r\n/**\r\n * Common / generic dimension \r\n */\r\nexport type DimensionsById = { [id: number]: IDimension };\r\n\r\n/**\r\n * Generic base plot data\r\n */\r\nexport interface IPlotData {\r\n /**\r\n * Plot labels\r\n */\r\n labels: string[]; \r\n /**\r\n * Plot values\r\n */\r\n values: Array;\r\n\r\n\tname?: string;\r\n}\r\n\r\n/**\r\n * Create a new plot data\r\n */\r\nexport function createPlotData(): IPlotData {\r\n return {\r\n labels: [],\r\n values: [],\r\n };\r\n}\r\n\r\n/**\r\n * Basic interface for a dictionary data source\r\n */\r\nexport interface ISourceData {\r\n [key: string]: number;\r\n}\r\n\r\n/**\r\n * Create a new basic SourceData object.\r\n */\r\nexport function createData(): ISourceData {\r\n return {};\r\n}\r\n\r\nexport type SortOverrideFn = (keys: string[]) => string[];\r\n\r\n/**\r\n * Pivot the source data object into the target plot data object. e.g.:\r\n * \r\n * E.g. Given from = * { key: value, key2: value2 }\r\n * pivotObject(from, {}) -> {\r\n* labels: [key, key2],\r\n* values: [value, value2]\r\n* }\r\n * \r\n * @param from Source data\r\n * @param into Target plot data object\r\n * @param sortFn optional sort comparer function\r\n */\r\nexport function pivotObject(from: TSource, into: TPlot, sortFn?: (source: TSource, a: string, b: string) => number, sortOverrideFn?: SortOverrideFn): TPlot {\r\n let ordered: string[] = [];\r\n let keys = Object.keys(from);\r\n\r\n if (sortOverrideFn != null) {\r\n ordered = sortOverrideFn(keys);\r\n } else {\r\n if (sortFn != null) {\r\n ordered = keys.sort((a, b) => sortFn(from, a, b));\r\n } else {\r\n ordered = keys;\r\n }\r\n }\r\n\r\n ordered.forEach(key => {\r\n into.labels.push(key);\r\n into.values.push(from[key]);\r\n });\r\n\r\n return into;\r\n}\r\n\r\n/***\r\n * Try add to the set, returns true if the value was added, false otherwise.\r\n */\r\nexport function addSet(value: T, into: Set) {\r\n const was = into.size;\r\n into.add(value);\r\n return into.size > was;\r\n}\r\n\r\n/**\r\n * Add the value to the key of the object if the key doesn't already exist. \r\n * Returns true if the key/value was added, false otherwise.\r\n * \r\n * @param key \r\n * @param value \r\n * @param into \r\n */\r\nexport function addKey(key: TKey, value: any, into: any) {\r\n if (into[key] === undefined) {\r\n into[key] = value;\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Shared structure for all dashboard view models\r\n */\r\nexport interface IDashboardBaseViewModel {\r\n referralId: number;\r\n patientId: any;\r\n diagnosisId: number;\r\n uniqueReferral: string;\r\n uniquePatient: string;\r\n ageAtDiagnosis: number;\r\n mdtDate: IStringDate;\r\n mdt: IDimMDT;\r\n facility: IDimFacility;\r\n}\r\n\r\nexport type DashboardBaseFilterFunc = (vm: TViewModel, values: number[] | string[]) => boolean;\r\nexport type AddDataBaseFunc = (vm: TViewModel, into: TSource) => void;\r\n\r\n/**\r\n * Accumulate the vm value into the source data object.\r\n * \r\n * @param vm source view model\r\n * @param into data object to accumulate into\r\n */\r\nexport function addDataFactory(keyExtractor: (vm: TViewModel) => keyof ISourceData): AddDataBaseFunc {\r\n return (vm: TViewModel, into: TSource) => {\r\n const key = keyExtractor(vm) as keyof ISourceData;\r\n\r\n if (into[key] == null) {\r\n (into as any)[key] = 0;\r\n }\r\n (into as any)[key] += 1;\r\n };\r\n\r\n}\r\n\r\n//default colors can be found at https://plotly.com/javascript/reference/layout/#layout-colorway\r\nconst UNKNOWN_COLOR = \"#bbd854\"; //light green\r\n\r\nexport const graphColors = {\r\n unknown: UNKNOWN_COLOR,\r\n default: [\"#1e88e5\", \"#f79325\", \"#ffd92f\", \"#2ca02c\", \"#d62728\", \"#9467bd\", \"#8c564b\", \"#e377c2\", \"#7f7f7f\", \"#bcbd22\", \"#17becf\"], \r\n //blue, orange, yellow, dark green, red, purple, brown, pink, gray, mustard, pale blue\r\n}\r\n\r\n/**\r\n * Default layout for most charts\r\n */\r\n\r\n/**\r\n * Common box styling\r\n * @param height\r\n */\r\n export function boxStyle(height: number) {\r\n return {\r\n minHeight: height,\r\n maxHeight: height,\r\n height: height,\r\n padding: 1,\r\n };\r\n}\r\n export const defaultStyles = {\r\n demographicBox: boxStyle(260),\r\n box: boxStyle,\r\n defaultBox: boxStyle(260),\r\n tallBox: boxStyle(460),\r\n inheritHW: {\r\n width: \"inherit\",\r\n height: \"inherit\"\r\n }\r\n};\r\n\r\n export const defaultLayout: Partial = {\r\n font: { size: 10 },\r\n margin: {\r\n l: 80,\r\n r: 50,\r\n b: 50,\r\n t: 10,\r\n pad: 1\r\n },\r\n dragmode: \"select\" as any,\r\n colorway: graphColors.default,\r\n};\r\n\r\nexport function chartAttrs(height: number = 480) {\r\n //Determine the height of the chart so it can be wrapped in a scrollable container\r\n const maxHeight = height - 50;\r\n const layout = Object.assign({}, defaultLayout) as any;\r\n \r\n return {\r\n outerStyle: {minHeight: maxHeight, maxHeight: maxHeight, height: maxHeight } as React.CSSProperties,\r\n layout,\r\n };\r\n}\r\n\r\n/**\r\n * Default chart configuration\r\n */\r\nexport const defaultConfig: Partial = {\r\n displaylogo: false,\r\n displayModeBar: false,\r\n responsive: false,\r\n};\r\n\r\n/**\r\n * Creates a blob\r\n */\r\n\r\n export function downloadFile(content, filename, contentType) {\r\n // Create a blob\r\n var blob = new Blob([content], { type: contentType });\r\n var url = URL.createObjectURL(blob);\r\n downloadFromURL(url, filename);\r\n }\r\n\r\n /**\r\n * Downloads blob as file\r\n */\r\n\r\n export function downloadFromURL(url, filename) {\r\n // Create a link to download it\r\n var pom = document.createElement('a');\r\n pom.href = url;\r\n pom.setAttribute('download', filename);\r\n pom.click();\r\n } \r\n \r\n /**\r\n * Creates an image of a div.\r\n */\r\n export function downloadAsImage(div: HTMLElement, filename: string, isFullScreen: boolean, activeFilters: string)\r\n { \r\n //Clone div \r\n const logo = document.createElement('img');\r\n logo.src = watermark;\r\n logo.height = 50;\r\n logo.width = 300;\r\n logo.style.opacity = \"0.3\";\r\n logo.style.position = \"absolute\";\r\n logo.style.zIndex = \"9999\";\r\n logo.style.top = \"10%\";\r\n logo.style.right = \"5%\";\r\n \r\n const clone = div.cloneNode(true) as HTMLElement;\r\n clone.id = \"clone\";\r\n clone.style.width = (!isFullScreen ? \"100%\" : \"120%\");\r\n clone.className = \"\";\r\n \r\n const lineBreak = document.createElement('br');\r\n\r\n\t\t\r\n\r\n const currentFilters = document.createElement('div');\r\n currentFilters.append(\"Selected Filters: \" + activeFilters);\r\n currentFilters.append(document.createElement('br'));\r\n currentFilters.append(document.createElement('br'));\r\n\r\n const source = document.createElement('div');\r\n source.append(\"Source: Cancer Alliance Queensland (\" + window.location.href + \")\");\r\n source.append(document.createElement('br'));\r\n source.append(\"Downloaded: \" + new Date().toString());\r\n source.style.fontStyle = 'italic';\r\n source.style.fontSize = \"0.75em\"\r\n \r\n const combinedDiv = document.createElement('div');\r\n combinedDiv.style.width = (Number(getComputedStyle(div).width.slice(0,-2))) + \"px\";\r\n combinedDiv.id = 'hiddenClonedDiv';\r\n combinedDiv.style.position = \"relative\";\r\n \r\n combinedDiv.append(logo);\r\n combinedDiv.append(lineBreak);\r\n \r\n \r\n combinedDiv.append(clone);\r\n\r\n if (activeFilters != \"\") {\r\n combinedDiv.append(currentFilters); \r\n }\r\n combinedDiv.append(source);\r\n\r\n\r\n\t\t\r\n document.body.append(combinedDiv);\r\n \r\n //Convert the HTML element to a canvas and then download that canvas \r\n html2canvas(combinedDiv, {scale: 1.5}).then(canvas => { const img: any = canvas.toDataURL();\r\n downloadFromURL(img, filename);\r\n }).then(_ => combinedDiv.remove())\r\n }\r\n","import { \r\n IPlotData as ICorePlotData, createPlotData as createCorePlotData, \r\n ISourceData as ICoreSourceData, createData as createCoreData, addDataFactory, addSet \r\n} from \"models/core\";\r\nimport { IDashboardViewModel } from \"./core\";\r\n\r\n/**\r\n * Plot data source\r\n */\r\nexport type IPlotData = ICorePlotData;\r\n\r\n/**\r\n * Source data\r\n */\r\nexport type ISourceData = ICoreSourceData;\r\n\r\n/**\r\n * Raw data source. Used to shape and accumulate.\r\n */\r\nexport interface ISourceBuilder {\r\n uniques: Set;\r\n values: ISourceData;\r\n}\r\n\r\n/**\r\n * Create a new plot data object.\r\n */\r\nexport const createPlotData = createCorePlotData;\r\n\r\n/**\r\n * Create a new source data object\r\n */\r\nexport function createBuilder(): ISourceBuilder {\r\n return {\r\n uniques: new Set(),\r\n values: createCoreData(),\r\n };\r\n}\r\n\r\nconst add = addDataFactory((vm: IDashboardViewModel) => vm.mdt?.nameAndFacility);\r\n\r\n/**\r\n * Returns the number added to the hierarchy on add, 0 otherwise. \r\n * @param vm \r\n * @param into \r\n */\r\nexport function addData(vm: IDashboardViewModel, into: ISourceBuilder): number {\r\n //Only count once per unique (referral ids + date + mdtName) since we're counting mdt participation.\r\n if (addSet(vm?.uniqueReferral + \"_\" + vm.mdt?.mdtNameId, into.uniques)) {\r\n add(vm, into.values);\r\n return 1;\r\n }\r\n\r\n return 0;\r\n}\r\n\r\n/**\r\n * Compare sourceData[a] to sourceData[b] and return -1 when a is less than b, 0 when equal, 1 when a is greater than 0\r\n * @param a \r\n * @param b \r\n */\r\nexport const sort = (s: ISourceData, a: string, b: string): number => {\r\n return ((s[a] < s[b]) ? -1 : ((s[a] > s[b]) ? 1 : 0));\r\n};\r\n\r\n/** \r\n * Complete adding data and clear any temporary resources \r\n */\r\nexport function finish(builder: ISourceBuilder): ISourceData {\r\n try {\r\n return builder.values;\r\n } finally {\r\n builder.uniques.clear();\r\n builder.uniques = null;\r\n builder.values = null;\r\n builder = null;\r\n }\r\n}","import { \r\n IPlotData as ICorePlotData, createPlotData as createCorePlotData, \r\n ISourceData as ICoreSourceData, createData as createCoreData, addDataFactory, addSet \r\n} from \"models/core\";\r\nimport { IDashboardViewModel } from \"./core\";\r\n\r\n/**\r\n * Plot data source\r\n */\r\nexport type IPlotData = ICorePlotData;\r\n\r\n/**\r\n * Source data\r\n */\r\nexport type ISourceData = ICoreSourceData;\r\n\r\n/**\r\n * Raw data source. Used to shape and accumulate.\r\n */\r\nexport interface ISourceBuilder {\r\n uniques: Set;\r\n values: ISourceData;\r\n}\r\n\r\n/**\r\n * Create a new plot data object.\r\n */\r\nexport const createPlotData = createCorePlotData;\r\n\r\n/**\r\n * Create a new source data object\r\n */\r\nexport function createBuilder(): ISourceBuilder {\r\n return {\r\n uniques: new Set(),\r\n values: createCoreData(),\r\n };\r\n}\r\n\r\nconst add = addDataFactory((vm: IDashboardViewModel) => vm.mdt?.nameAndFacility);\r\n\r\n/**\r\n * Returns the number added to the hierarchy on add, 0 otherwise. \r\n * @param vm \r\n * @param into \r\n */\r\nexport function addData(vm: IDashboardViewModel, into: ISourceBuilder): number {\r\n //Only count once per unique patient per mdt.\r\n if (addSet(vm.patientId + \"_\" + vm.mdt?.mdtNameId, into.uniques)) {\r\n add(vm, into.values);\r\n return 1;\r\n }\r\n\r\n return 0;\r\n}\r\n\r\n/**\r\n * Compare sourceData[a] to sourceData[b] and return -1 when a is less than b, 0 when equal, 1 when a is greater than 0\r\n * @param a \r\n * @param b \r\n */\r\nexport const sort = (s: ISourceData, a: string, b: string): number => {\r\n return ((s[a] < s[b]) ? -1 : ((s[a] > s[b]) ? 1 : 0));\r\n};\r\n\r\n/** \r\n * Complete adding data and clear any temporary resources \r\n */\r\nexport function finish(builder: ISourceBuilder): ISourceData {\r\n try {\r\n return builder.values;\r\n } finally {\r\n builder.uniques.clear();\r\n builder.uniques = null;\r\n builder.values = null;\r\n builder = null;\r\n }\r\n}","import { \r\n IPlotData as ICorePlotData, createPlotData as createCorePlotData, \r\n ISourceData as ICoreSourceData, createData as createCoreData, addDataFactory, addSet \r\n} from \"models/core\";\r\nimport { IDashboardViewModel } from \"./core\";\r\n\r\n/**\r\n * Plot data source\r\n */\r\nexport type IPlotData = ICorePlotData;\r\n\r\n/**\r\n * Source data\r\n */\r\nexport type ISourceData = ICoreSourceData;\r\n\r\n/**\r\n * Raw data source. Used to shape and accumulate.\r\n */\r\nexport interface ISourceBuilder {\r\n uniques: Set;\r\n values: ISourceData;\r\n}\r\n\r\n/**\r\n * Create a new plot data object.\r\n */\r\nexport const createPlotData = createCorePlotData;\r\n\r\n/**\r\n * Create a new source data object\r\n */\r\nexport function createBuilder(): ISourceBuilder {\r\n return {\r\n uniques: new Set(),\r\n values: createCoreData(),\r\n };\r\n}\r\n\r\nconst add = addDataFactory((vm: IDashboardViewModel) => vm.mdt?.nameAndFacility);\r\n\r\n/**\r\n * Returns the number added to the hierarchy on add, 0 otherwise. \r\n * @param vm \r\n * @param into \r\n */\r\nexport function addData(vm: IDashboardViewModel, into: ISourceBuilder): number {\r\n //Only count once per unique patient per mdt.\r\n if (addSet(vm.diagnosisId + \"_\" + vm.mdt?.mdtNameId, into.uniques)) {\r\n add(vm, into.values);\r\n return 1;\r\n }\r\n\r\n return 0;\r\n}\r\n\r\n/**\r\n * Compare sourceData[a] to sourceData[b] and return -1 when a is less than b, 0 when equal, 1 when a is greater than 0\r\n * @param a \r\n * @param b \r\n */\r\nexport const sort = (s: ISourceData, a: string, b: string): number => {\r\n return ((s[a] < s[b]) ? -1 : ((s[a] > s[b]) ? 1 : 0));\r\n};\r\n\r\n/** \r\n * Complete adding data and clear any temporary resources \r\n */\r\nexport function finish(builder: ISourceBuilder): ISourceData {\r\n try {\r\n return builder.values;\r\n } finally {\r\n builder.uniques.clear();\r\n builder.uniques = null;\r\n builder.values = null;\r\n builder = null;\r\n }\r\n}","import { \r\n IPlotData as ICorePlotData, \r\n createPlotData as createCorePlotData, \r\n ISourceData as ICoreSourceData, \r\n createData as createCoreData, \r\n addDataFactory,\r\n DimensionsById,\r\n addSet\r\n} from \"../../core\";\r\nimport { IDashboardViewModel } from \"./viewModel\";\r\n\r\n/**\r\n * Sort asc\r\n * @param a \r\n * @param b \r\n */\r\nexport const sort = (_: ISourceData, a: string, b: string): number => {\r\n return ((a < b) ? -1 : ((a > b) ? 1 : 0));\r\n};\r\n\r\n/**\r\n * Plot data source\r\n */\r\nexport type IPlotData = ICorePlotData;\r\n\r\n/**\r\n * Raw data source. Used to shape and accumulate.\r\n */\r\nexport type ISourceData = ICoreSourceData;\r\n\r\n/**\r\n * Raw data source. Used to shape and accumulate.\r\n */\r\nexport interface ISourceBuilder {\r\n uniques: Set;\r\n values: ISourceData;\r\n}\r\n\r\n/**\r\n * Create a new plot data object.\r\n */\r\nexport const createPlotData = createCorePlotData;\r\n\r\n/**\r\n * Create a new source data object\r\n */\r\nconst createData = createCoreData;\r\n\r\n/**\r\n * Create a new source data object\r\n */\r\nexport function createBuilder(): ISourceBuilder {\r\n return {\r\n uniques: new Set(),\r\n values: createData(),\r\n };\r\n}\r\n\r\n/**\r\n * Overcomplicated way to ensure consistent coloring for references\r\n * of unknown size.\r\n */\r\nexport function toColors(groupReferences: DimensionsById, groupLabels: string[], colors: string[], unknownColor: string): string[] {\r\n const keys = Object.keys(groupReferences).filter(p => Object.prototype.hasOwnProperty.call(groupReferences, p));\r\n\r\n const mappedColors = [];\r\n for (let i = 0; i < groupLabels.length; i++) {\r\n const label = groupLabels[i];\r\n //Force Unk to be green\r\n if (label === \"Unk\") {\r\n mappedColors.push(unknownColor);\r\n break;\r\n }\r\n\r\n //Otherwise use the index - they shouldn't overlap\r\n for (const key of keys) {\r\n const g = groupReferences[key];\r\n if (label === g.name) {\r\n mappedColors.push(colors[g.id - 1]);\r\n break;\r\n }\r\n }\r\n }\r\n\r\n return mappedColors;\r\n}\r\n\r\n/**\r\n * Accumulate the vm value into the source data object.\r\n * \r\n * @param vm source view model\r\n * @param into data object to accumulate into\r\n */\r\nconst add = addDataFactory((vm: IDashboardViewModel) => vm.hhsResidenceGroup?.name);\r\n\r\n/**\r\n * Returns the number added to the hierarchy on add, 0 otherwise. \r\n * @param vm \r\n * @param into \r\n * @param filter \r\n */\r\nexport function addData(vm: IDashboardViewModel, into: ISourceBuilder): number {\r\n //Only count once per unique (hhsResidenceGroup + diagnosisId ) since we're counting mdt participation.\r\n if (addSet(vm.hhsResidenceGroup?.id + \"_\" + vm.diagnosisId, into.uniques)) {\r\n add(vm, into.values);\r\n return 1;\r\n }\r\n\r\n return 0;\r\n}\r\n\r\n/** \r\n * Complete adding data and clear any temporary resources \r\n */\r\nexport function finish(builder: ISourceBuilder): ISourceData {\r\n try {\r\n return builder.values;\r\n } finally {\r\n builder.uniques.clear();\r\n builder.uniques = null;\r\n builder.values = null;\r\n builder = null;\r\n }\r\n}","import { \r\n IPlotData as ICorePlotData, createPlotData as createCorePlotData, \r\n ISourceData as ICoreSourceData, createData as createCoreData, addDataFactory, addSet \r\n} from \"models/core\";\r\nimport { IDashboardViewModel } from \"./core\";\r\n\r\n/**\r\n * Plot data source\r\n */\r\nexport type IPlotData = ICorePlotData;\r\n\r\n/**\r\n * Source data\r\n */\r\nexport type ISourceData = ICoreSourceData;\r\n\r\n/**\r\n * Raw data source. Used to shape and accumulate.\r\n */\r\nexport interface ISourceBuilder {\r\n uniques: Set;\r\n values: ISourceData;\r\n}\r\n\r\n/**\r\n * Create a new plot data object.\r\n */\r\nexport const createPlotData = createCorePlotData;\r\n\r\n/**\r\n * Create a new source data object\r\n */\r\nexport function createBuilder(): ISourceBuilder {\r\n return {\r\n uniques: new Set(),\r\n values: createCoreData(),\r\n };\r\n}\r\n\r\nconst add = addDataFactory((vm: IDashboardViewModel) => vm.morphology?.name);\r\n\r\n/**\r\n * Returns the number added to the hierarchy on add, 0 otherwise. \r\n * @param vm \r\n * @param into \r\n */\r\nexport function addData(vm: IDashboardViewModel, into: ISourceBuilder): number {\r\n //Only count once per diagnosis per morphology.\r\n if (addSet(vm.morphology?.id + \"_\" + vm.diagnosisId, into.uniques)) {\r\n add(vm, into.values);\r\n return 1;\r\n }\r\n\r\n return 0;\r\n}\r\n\r\n/**\r\n * Compare sourceData[a] to sourceData[b] and return -1 when a is less than b, 0 when equal, 1 when a is greater than 0\r\n * @param a \r\n * @param b \r\n */\r\nexport const sort = (s: ISourceData, a: string, b: string): number => {\r\n return ((s[a] < s[b]) ? -1 : ((s[a] > s[b]) ? 1 : 0));\r\n};\r\n\r\n/** \r\n * Complete adding data and clear any temporary resources \r\n */\r\nexport function finish(builder: ISourceBuilder): ISourceData {\r\n try {\r\n return builder.values;\r\n } finally {\r\n builder.uniques.clear();\r\n builder.uniques = null;\r\n builder.values = null;\r\n builder = null;\r\n }\r\n}","import { \r\n IPlotData as ICorePlotData, createPlotData as createCorePlotData, \r\n ISourceData as ICoreSourceData, createData as createCoreData, addDataFactory, addSet \r\n} from \"models/core\";\r\n//import { IDashboardViewModel } from \"../../mdt/plotdata/core\";\r\nimport { IDashboardSharedViewModel } from \"./viewModel\";\r\n\r\n/**\r\n * Plot data source\r\n */\r\nexport type IPlotData = ICorePlotData;\r\n\r\n/**\r\n * Source data\r\n */\r\nexport type ISourceData = ICoreSourceData;\r\n\r\n/**\r\n * Raw data source. Used to shape and accumulate.\r\n */\r\nexport interface ISourceBuilder {\r\n uniques: Set;\r\n values: ISourceData;\r\n}\r\n\r\n/**\r\n * Create a new plot data object.\r\n */\r\nexport const createPlotData = createCorePlotData;\r\n\r\n/**\r\n * Create a new source data object\r\n */\r\nexport function createBuilder(): ISourceBuilder {\r\n return {\r\n uniques: new Set(),\r\n values: createCoreData(),\r\n };\r\n}\r\n\r\nexport const addData = addDataFactory((vm: IDashboardSharedViewModel) => vm.remoteness.name);\r\n\r\n/**\r\n * Compare sourceData[a] to sourceData[b] and return -1 when a is less than b, 0 when equal, 1 when a is greater than 0\r\n * @param a \r\n * @param b \r\n */\r\nexport const sort = (s: ISourceData, a: string, b: string): number => {\r\n return ((s[a] < s[b]) ? -1 : ((s[a] > s[b]) ? 1 : 0));\r\n};\r\n\r\n/** \r\n * Complete adding data and clear any temporary resources \r\n */\r\nexport function finish(builder: ISourceBuilder): ISourceData {\r\n try {\r\n return builder.values;\r\n } finally {\r\n builder.uniques.clear();\r\n builder.uniques = null;\r\n builder.values = null;\r\n builder = null;\r\n }\r\n}","import { \r\n IPlotData as ICorePlotData, createPlotData as createCorePlotData, \r\n ISourceData as ICoreSourceData, createData as createCoreData, addDataFactory, addSet \r\n} from \"models/core\";\r\n//import { IDashboardViewModel } from \"../../mdt/plotdata/core\";\r\nimport { IDashboardSharedViewModel } from \"./viewModel\";\r\n/**\r\n * Plot data source\r\n */\r\nexport type IPlotData = ICorePlotData;\r\n\r\n/**\r\n * Source data\r\n */\r\nexport type ISourceData = ICoreSourceData;\r\n\r\n/**\r\n * Raw data source. Used to shape and accumulate.\r\n */\r\nexport interface ISourceBuilder {\r\n uniques: Set;\r\n values: ISourceData;\r\n}\r\n\r\n/**\r\n * Create a new plot data object.\r\n */\r\nexport const createPlotData = createCorePlotData;\r\n\r\n/**\r\n * Create a new source data object\r\n */\r\nexport function createBuilder(): ISourceBuilder {\r\n return {\r\n uniques: new Set(),\r\n values: createCoreData(),\r\n };\r\n}\r\n\r\nexport const addData = addDataFactory((vm: IDashboardSharedViewModel) => vm.residenceHHSId.name);\r\n\r\n/**\r\n * Compare sourceData[a] to sourceData[b] and return -1 when a is less than b, 0 when equal, 1 when a is greater than 0\r\n * @param a \r\n * @param b \r\n */\r\nexport const sort = (s: ISourceData, a: string, b: string): number => {\r\n return ((s[a] < s[b]) ? -1 : ((s[a] > s[b]) ? 1 : 0));\r\n};\r\n\r\n/** \r\n * Complete adding data and clear any temporary resources \r\n */\r\nexport function finish(builder: ISourceBuilder): ISourceData {\r\n try {\r\n return builder.values;\r\n } finally {\r\n builder.uniques.clear();\r\n builder.uniques = null;\r\n builder.values = null;\r\n builder = null;\r\n }\r\n}","import { \r\n IPlotData as ICorePlotData, createPlotData as createCorePlotData, \r\n ISourceData as ICoreSourceData, createData as createCoreData, addDataFactory, addSet \r\n} from \"models/core\";\r\nimport { IDashboardViewModel } from \"./core\";\r\n\r\n/**\r\n * Plot data source\r\n */\r\nexport type IPlotData = ICorePlotData;\r\n\r\n/**\r\n * Source data\r\n */\r\nexport type ISourceData = ICoreSourceData;\r\n\r\n/**\r\n * Raw data source. Used to shape and accumulate.\r\n */\r\nexport interface ISourceBuilder {\r\n uniques: Set;\r\n values: ISourceData;\r\n}\r\n\r\n/**\r\n * Create a new plot data object.\r\n */\r\nexport const createPlotData = createCorePlotData;\r\n\r\n/**\r\n * Create a new source data object\r\n */\r\nexport function createBuilder(): ISourceBuilder {\r\n return {\r\n uniques: new Set(),\r\n values: createCoreData(),\r\n };\r\n}\r\n\r\nexport const add = addDataFactory((vm: IDashboardViewModel) => vm.firstTreatment?.name);\r\n\r\n/**\r\n * Returns the number added to the hierarchy on add, 0 otherwise. \r\n * @param vm \r\n * @param into \r\n */\r\n export function addData(vm: IDashboardViewModel, into: ISourceBuilder): number {\r\n //Only count once per unique (hhsResidenceGroup + diagnosisId ) since we're counting mdt participation.\r\n if (addSet(vm.firstTreatment?.id + \"_\" + vm.diagnosisId, into.uniques)) {\r\n add(vm, into.values);\r\n return 1;\r\n }\r\n\r\n return 0;\r\n}\r\n\r\n/**\r\n * Compare sourceData[a] to sourceData[b] and return -1 when a is less than b, 0 when equal, 1 when a is greater than 0\r\n * @param a \r\n * @param b \r\n */\r\n export const sort = (s: ISourceData, a: string, b: string): number => {\r\n return ((s[a] < s[b]) ? -1 : ((s[a] > s[b]) ? 1 : 0));\r\n};\r\n\r\n/** \r\n * Complete adding data and clear any temporary resources \r\n */\r\nexport function finish(builder: ISourceBuilder): ISourceData {\r\n try {\r\n return builder.values;\r\n } finally {\r\n builder.uniques.clear();\r\n builder.uniques = null;\r\n builder.values = null;\r\n builder = null;\r\n }\r\n}","import { \r\n IPlotData as ICorePlotData, createPlotData as createCorePlotData, \r\n ISourceData as ICoreSourceData, createData as createCoreData, addDataFactory, addSet \r\n} from \"models/core\";\r\nimport { IDashboardViewModel } from \"./core\";\r\n\r\n/**\r\n * Plot data source\r\n */\r\nexport type IPlotData = ICorePlotData;\r\n\r\n/**\r\n * Source data\r\n */\r\nexport type ISourceData = ICoreSourceData;\r\n\r\n/**\r\n * Raw data source. Used to shape and accumulate.\r\n */\r\nexport interface ISourceBuilder {\r\n uniques: Set;\r\n values: ISourceData;\r\n}\r\n\r\n/**\r\n * Create a new plot data object.\r\n */\r\nexport const createPlotData = createCorePlotData;\r\n\r\n/**\r\n * Create a new source data object\r\n */\r\nexport function createBuilder(): ISourceBuilder {\r\n return {\r\n uniques: new Set(),\r\n values: createCoreData(),\r\n };\r\n}\r\n\r\nconst add = addDataFactory((vm: IDashboardViewModel) => vm.timeToFirstTreatment?.name);\r\n\r\n/**\r\n * Returns the number added to the hierarchy on add, 0 otherwise. \r\n * @param vm \r\n * @param into \r\n */\r\nexport function addData(vm: IDashboardViewModel, into: ISourceBuilder): number {\r\n //Only count once per unique diagnosis per first treatment.\r\n if (addSet(vm.timeToFirstTreatment?.id + \"_\" + vm.diagnosisId, into.uniques)) {\r\n add(vm, into.values);\r\n return 1;\r\n }\r\n\r\n return 0;\r\n}\r\n\r\n/**\r\n * Compare sourceData[a] to sourceData[b] and return -1 when a is less than b, 0 when equal, 1 when a is greater than 0\r\n * @param a \r\n * @param b \r\n */\r\nexport const sort = (s: ISourceData, a: string, b: string): number => {\r\n //Alphabetically by key (name)\r\n return ((a < b) ? -1 : ((a > b) ? 1 : 0));\r\n};\r\n\r\n/** \r\n * Complete adding data and clear any temporary resources \r\n */\r\nexport function finish(builder: ISourceBuilder): ISourceData {\r\n try {\r\n return builder.values;\r\n } finally {\r\n builder.uniques.clear();\r\n builder.uniques = null;\r\n builder.values = null;\r\n builder = null;\r\n }\r\n}","import { \r\n IPlotData as ICorePlotData, \r\n createPlotData as createCorePlotData, \r\n ISourceData as ICoreSourceData, \r\n createData as createCoreData, \r\n addDataFactory \r\n} from \"../../core\";\r\nimport { IDashboardSharedViewModel, KeyedDimension, comorbidities } from \"./viewModel\";\r\n\r\nexport { comorbidities };\r\n\r\nconst IndexMap = {\r\n [comorbidities.zero.name]: 0,\r\n [comorbidities.one.name]: 1,\r\n [comorbidities.twoPlus.name]: 2, \r\n [comorbidities.unknown.name]: 3\r\n};\r\n\r\nexport function toColors(comorbities: string[], colors: string[]) {\r\n return comorbities.map(p => colors[IndexMap[p] || 0]);\r\n}\r\n\r\n/**\r\n * Maps the raw value to a Comorbidity enum value\r\n * @param n raw comorbidity count\r\n */\r\nexport function toComorbidity(n: string): KeyedDimension {\r\n if (n == null || n === \"Unk\") {\r\n return comorbidities.unknown;\r\n }\r\n\r\n switch (n) {\r\n case \"0\": return comorbidities.zero;\r\n case \"1\": return comorbidities.one;\r\n default: return comorbidities.twoPlus;\r\n }\r\n}\r\n\r\n/**\r\n * Compare a to b and return -1 when a is less than b, 0 when equal, 1 when a is greater than 0\r\n * @param a \r\n * @param b \r\n */\r\nexport const sort = (_: ISourceData, a: string, b: string): number => {\r\n return ((a < b) ? -1 : ((a > b) ? 1 : 0));\r\n};\r\n\r\n/**\r\n * Plot data source\r\n */\r\nexport type IPlotData = ICorePlotData;\r\n\r\n/**\r\n * Raw data source. Used to shape and accumulate.\r\n */\r\nexport type ISourceData = ICoreSourceData;\r\n\r\n/**\r\n * Create a new plot data object.\r\n */\r\nexport const createPlotData = createCorePlotData;\r\n\r\n/**\r\n * Create a new source data object\r\n */\r\nexport const createData = createCoreData;\r\n\r\n/**\r\n * Accumulate the vm value into the source data object.\r\n * \r\n * @param vm source view model\r\n * @param into data object to accumulate into\r\n */\r\nexport const addData = addDataFactory((vm: IDashboardSharedViewModel) => vm.comorbidityCount.name);\r\n","import { \r\n IPlotData as ICorePlotData, \r\n createPlotData as createCorePlotData, \r\n ISourceData as ICoreSourceData, \r\n createData as createCoreData, \r\n addDataFactory\r\n} from \"../../core/core\";\r\nimport { IDashboardSharedViewModel, KeyedDimension, sexes } from \"./viewModel\";\r\n\r\nexport { sexes }\r\n\r\n/**\r\n * \r\n * @param sex Convert raw sex code to enum\r\n */\r\nexport const toSex = (sex: number): KeyedDimension => {\r\n if (!sex)\r\n return sexes.unknown;\r\n\r\n switch (sex) {\r\n case 3: return sexes.indeterminate;\r\n case 2: return sexes.female;\r\n case 9: return sexes.unknown;\r\n default: return sexes.male;\r\n }\r\n};\r\n\r\nconst rank = {\r\n [sexes.male.name]: 1,\r\n [sexes.female.name]: 2,\r\n [sexes.indeterminate.name]: 3,\r\n [sexes.unknown.name]: 4,\r\n};\r\n\r\n/**\r\n * Sort asc\r\n * @param a \r\n * @param b \r\n */\r\nexport const sort = (_: ISourceData, a: string, b: string): number => {\r\n const a1 = rank[a];\r\n const b1 = rank[b];\r\n\r\n return (a1 > b1) ? -1 : ((a1 < b1 ? 1 : 0));\r\n};\r\n\r\n/**\r\n * Plot data source\r\n */\r\nexport type IPlotData = ICorePlotData;\r\n\r\n/**\r\n * Raw data source. Used to shape and accumulate.\r\n */\r\nexport type ISourceData = ICoreSourceData;\r\n\r\n/**\r\n * Create a new plot data object.\r\n */\r\nexport const createPlotData = createCorePlotData;\r\n\r\n/**\r\n * Create a new source data object\r\n */\r\nexport const createData = createCoreData;\r\n\r\n/**\r\n * Accumulate the vm value into the source data object.\r\n * \r\n * @param vm source view model\r\n * @param into data object to accumulate into\r\n */\r\nexport const addData = addDataFactory((vm: IDashboardSharedViewModel) => vm.sex.name);\r\n","import { \r\n IPlotData as ICorePlotData, \r\n createPlotData as createCorePlotData, \r\n ISourceData as ICoreSourceData, \r\n createData as createCoreData, \r\n addDataFactory\r\n} from \"../../core/core\";\r\nimport { IDashboardSharedViewModel, KeyedDimension, tnmStages } from \"./viewModel\";\r\n\r\nexport { tnmStages }\r\n\r\n/**\r\n * Maps the raw value to an enum value\r\n * @param n raw count\r\n */\r\nexport function toTnmStage(tnmStage: string): KeyedDimension {\r\n if (tnmStage === null || tnmStage === undefined)\r\n return tnmStages.unknown;\r\n\r\n switch (tnmStage) {\r\n case \"0\": return tnmStages.zero;\r\n case \"I\": return tnmStages.i;\r\n case \"II\": return tnmStages.ii;\r\n case \"III\": return tnmStages.iii;\r\n case \"IV\": return tnmStages.iv;\r\n default: return tnmStages.unknown;\r\n }\r\n}\r\n\r\n/** \r\n * Compare a to b (desc)\r\n * @param a \r\n * @param b \r\n */\r\nexport const sort = (_: ISourceData, a: string, b: string): number => {\r\n return ((a > b) ? -1 : ((a < b) ? 1 : 0));\r\n};\r\n\r\n/**\r\n * Plot data source\r\n */\r\nexport type IPlotData = ICorePlotData;\r\n\r\n/**\r\n * Raw data source. Used to shape and accumulate.\r\n */\r\nexport type ISourceData = ICoreSourceData;\r\n\r\n/**\r\n * Create a new plot data object.\r\n */\r\nexport const createPlotData = createCorePlotData;\r\n\r\n/**\r\n * Create a new source data object\r\n */\r\nexport const createData = createCoreData;\r\n\r\n/**\r\n * Accumulate the vm value into the source data object.\r\n * \r\n * @param vm source view model\r\n * @param into data object to accumulate into\r\n */\r\nexport const addData = addDataFactory((vm: IDashboardSharedViewModel) => vm.tnmStage.name);\r\n","import { \r\n IPlotData as ICorePlotData, \r\n createPlotData as createCorePlotData, \r\n ISourceData as ICoreSourceData, \r\n createData as createCoreData, \r\n addDataFactory\r\n} from \"../../core/core\";\r\nimport { IDashboardSharedViewModel } from \"./viewModel\";\r\n\r\n/**\r\n * Sort asc\r\n * @param a \r\n * @param b \r\n */\r\nexport const sort = (_: ISourceData, a: string, b: string): number => {\r\n return ((a > b) ? -1 : ((a < b) ? 1 : 0));\r\n};\r\n\r\n/**\r\n * Plot data source\r\n */\r\nexport type IPlotData = ICorePlotData;\r\n\r\n/**\r\n * Raw data source. Used to shape and accumulate.\r\n */\r\nexport type ISourceData = ICoreSourceData;\r\n\r\n/**\r\n * Create a new plot data object.\r\n */\r\nexport const createPlotData = createCorePlotData;\r\n\r\n/**\r\n * Create a new source data object\r\n */\r\nexport const createData = createCoreData;\r\n\r\n/**\r\n * Accumulate the vm value into the source data object.\r\n * \r\n * @param vm source view model\r\n * @param into data object to accumulate into\r\n */\r\nexport const addData = addDataFactory((vm: IDashboardSharedViewModel) => vm.ses.name);\r\n","import { \r\n addDataFactory,\r\n IPlotData as ICorePlotData, \r\n createPlotData as createCorePlotData, \r\n ISourceData as ICoreSourceData, \r\n createData as createCoreData,\r\n} from \"../../core\";\r\nimport { ageRanges, IDashboardSharedViewModel, KeyedDimension } from \"./viewModel\";\r\n\r\nexport { ageRanges };\r\n\r\n/**\r\n * Sort asc\r\n * @param a \r\n * @param b \r\n */\r\nexport const sort = (_: ISourceData, a: string, b: string): number => {\r\n //Alphabetically by key (name)\r\n return ((a < b) ? -1 : ((a > b) ? 1 : 0));\r\n};\r\n\r\n/**\r\n * Plot data source\r\n */\r\nexport type IPlotData = ICorePlotData;\r\n\r\n/**\r\n * Raw data source. Used to shape and accumulate.\r\n */\r\nexport type ISourceData = ICoreSourceData;\r\n\r\n/**\r\n * Create a new plot data object.\r\n */\r\nexport const createPlotData = createCorePlotData;\r\n\r\n/**\r\n * Create a new source data object\r\n */\r\nexport const createData = createCoreData;\r\n\r\n\r\n\r\n/**\r\n * \r\n * @param age Convert raw age to enum\r\n */\r\nexport const toAgeRange = (age: number): KeyedDimension => {\r\n if (age === undefined || age === null || age === 999 || age < 0) {\r\n return ageRanges.unknown;\r\n }\r\n\r\n if (age < 20) return ageRanges.lt20;\r\n if (age < 40) return ageRanges.lt40;\r\n if (age < 60) return ageRanges.lt60;\r\n if (age < 80) return ageRanges.lt80;\r\n if (age <= 180) return ageRanges.gteq80;\r\n\r\n return ageRanges.unknown;\r\n};\r\n\r\n/**\r\n * Accumulate the vm value into the source data object.\r\n * \r\n * @param vm source view model\r\n * @param into data object to accumulate into\r\n */\r\nexport const addData = addDataFactory((vm: IDashboardSharedViewModel) => vm.ageRange.name);\r\n","import { \r\n IPlotData as ICorePlotData, \r\n createPlotData as createCorePlotData, \r\n ISourceData as ICoreSourceData, \r\n createData as createCoreData, \r\n addDataFactory\r\n} from \"../../core\";\r\nimport { IDashboardSharedViewModel, indigenousGroups, KeyedDimension } from \"./viewModel\";\r\n\r\nexport { indigenousGroups }\r\n\r\n/**\r\n * Sort asc\r\n * @param a \r\n * @param b \r\n */\r\nexport const sort = (_: ISourceData, a: string, b: string): number => {\r\n return ((a > b) ? -1 : ((a < b) ? 1 : 0));\r\n};\r\n\r\n/**\r\n * Plot data source\r\n */\r\nexport type IPlotData = ICorePlotData;\r\n\r\n/**\r\n * Raw data source. Used to shape and accumulate.\r\n */\r\nexport type ISourceData = ICoreSourceData;\r\n\r\n/**\r\n * Create a new plot data object.\r\n */\r\nexport const createPlotData = createCorePlotData;\r\n\r\n/**\r\n * Create a new source data object\r\n */\r\nexport const createData = createCoreData;\r\n\r\nfunction isIndigenous(indigenousStatusId: number): boolean {\r\n return indigenousStatusId && [1, 2, 3, 5].indexOf(indigenousStatusId) !== -1;\r\n}\r\n\r\n/**\r\n * Convert raw id to enum\r\n * @param id\r\n */\r\nexport const toIndigenousGroup = (id: number): KeyedDimension => {\r\n if (!id || id === 9)\r\n return indigenousGroups.unknown;\r\n\r\n if (isIndigenous(id)) \r\n return indigenousGroups.indigenous;\r\n\r\n return indigenousGroups.nonIndigenous;\r\n};\r\n\r\n/**\r\n * Accumulate the vm value into the source data object.\r\n * \r\n * @param vm source view model\r\n * @param into data object to accumulate into\r\n */\r\nexport const addData = addDataFactory((vm: IDashboardSharedViewModel) => vm.indigenousGroup.name);\r\n","import { \r\n IPlotData as ICorePlotData, \r\n createPlotData as createCorePlotData, \r\n ISourceData as ICoreSourceData, \r\n createData as createCoreData, \r\n addDataFactory, \r\n} from \"../../core\";\r\nimport { IDashboardSharedViewModel, ecogGroups, KeyedDimension } from \"./viewModel\";\r\n\r\nexport { ecogGroups }\r\n\r\n/**\r\n * Maps the raw value to an enum value\r\n * @param n raw value\r\n */\r\nexport function toEcogGroup(n: number): KeyedDimension {\r\n switch (n) {\r\n case 0: return ecogGroups.good;\r\n case 1: return ecogGroups.good;\r\n case 2: return ecogGroups.poor;\r\n case 3: return ecogGroups.poor;\r\n case 4: return ecogGroups.poor;\r\n default: return ecogGroups.unknown;\r\n }\r\n}\r\n\r\n/**\r\n * Sort\r\n * @param a \r\n * @param b \r\n */\r\nexport const sort = (s: ISourceData, a: string, b: string): number => {\r\n //Alphabetically by key (name)\r\n return ((a < b) ? -1 : ((a > b) ? 1 : 0));\r\n};\r\n\r\n/**\r\n * Plot data source\r\n */\r\nexport type IPlotData = ICorePlotData;\r\n\r\n/**\r\n * Raw data source. Used to shape and accumulate.\r\n */\r\nexport type ISourceData = ICoreSourceData;\r\n\r\n/**\r\n * Create a new plot data object.\r\n */\r\nexport const createPlotData = createCorePlotData;\r\n\r\n/**\r\n * Create a new source data object\r\n */\r\nexport const createData = createCoreData;\r\n\r\n/**\r\n * Accumulate the vm value into the source data object.\r\n * \r\n * @param vm source view model\r\n * @param into data object to accumulate into\r\n */\r\nexport const addData = addDataFactory((vm: IDashboardSharedViewModel) => vm.ecogGroup.name);\r\n","import { HHSLabel } from \"config/appUrlConfig\";\r\nimport { DimensionsById, IDimension, IDimFacility, IDimMDT, ISourceData, AddDataBaseFunc, DashboardBaseFilterFunc, IFilterKeys } from \"../core\";\r\nimport { AgeRange, Comorbidity, EcogGroup, IDashboardSharedViewModel, IndigenousGroup, Ses, Sex, TnmStage, Remoteness, HHSOfResidence } from \"./plotdata\";\r\nimport { DimensionsByKey } from \"./plotdata/viewModel\";\r\n\r\nexport { type IDashboardSharedViewModel, AgeRange, Comorbidity, EcogGroup, IndigenousGroup, Ses, Sex, TnmStage, Remoteness, HHSOfResidence } from \"./plotdata\";\r\n\r\n/**\r\n * Shared dimensions / reference data\r\n */\r\nexport interface IDashboardSharedDimensionsViewModel {\r\n facilities?: { [facilityId: number]: IDimFacility };\r\n mdtNames?: { [mdtNameId: number]: IDimMDT };\r\n hhses?: DimensionsById;\r\n seses?: DimensionsById;\r\n ecogGroups?: DimensionsByKey;\r\n mdtsArray?: Array;\r\n facilitiesArray?: Array;\r\n hhsesArray?: Array;\r\n dataDate?: string; \r\n monthsArray?: Array;\r\n yearsArray?: Array;\r\n months?: { [monthId: number]: string };\r\n years?: { [yearId: number]: string };\r\n}\r\n\r\n/**\r\n * Shared structure for all dashboard plotdata\r\n */\r\nexport interface IDashboardSharedChartData {\r\n comorbidities: Comorbidity.IPlotData;\r\n tnmStage: TnmStage.IPlotData;\r\n sex: Sex.IPlotData;\r\n ses: Ses.IPlotData;\r\n ageRange: AgeRange.IPlotData;\r\n indigenousGroup: IndigenousGroup.IPlotData;\r\n ecogGroup: EcogGroup.IPlotData;\r\n facilities: IDimFacility[];\r\n hhses: IDimension[];\r\n remoteness: Remoteness.IPlotData;\r\n hhsOfResidence: HHSOfResidence.IPlotData;\r\n //month: IDimension[];\r\n //year: IDimension[];\r\n}\r\n\r\nexport type DashboardSharedFilterFunc = DashboardBaseFilterFunc;\r\nexport type AddDataSharedFunc = AddDataBaseFunc;\r\n\r\nexport const DashboardSharedFilterKey: IFilterKeys = {\r\n Mdt: {key: \"Mdt\", label: \"MDT\"},\r\n Year: {key: \"Year\", label: \"Period\"},\r\n Sex: {key: \"Sex\", label: \"Sex\"},\r\n ComorbidityCount: {key: \"ComorbidityCount\", label: \"Comorbidity count\"},\r\n TnmStage: {key: \"TnmStage\", label: \"Stage\"},\r\n Facility: {key: \"Facility\", label: \"Facility\"},\r\n Ses: {key: \"Ses\", label: \"Socio-economic status\"},\r\n AgeRange: {key: \"AgeRange\", label: \"Age at diagnosis\"},\r\n IndigenousGroup: {key: \"IndigenousGroup\", label: \"First Nations Group\"},\r\n EcogGroup: {key: \"EcogGroup\", label: \"ECOG\"},\r\n HHS: {key: \"HHS\", label: HHSLabel},\r\n}\r\n","\r\nimport {\r\n AddDataSharedFunc, DashboardSharedFilterFunc, DashboardSharedFilterKey,\r\n IDashboardSharedChartData, IDashboardSharedDimensionsViewModel,\r\n} from \"models/common\";\r\nimport { IFilters, IFilterKeys, DimensionsById, ISourceData, IDimension, IDimMDT } from \"models/core\";\r\n\r\n//Plots for this dashboard\r\nimport * as ReviewsByService from \"./reviewsByService\";\r\nimport * as PatientsByService from \"./patientsByService\";\r\nimport * as DiagnosesByService from \"./diagnosesByService\";\r\nimport * as ReviewsByPeriod from \"./reviewsByPeriodHierarchy\";\r\nimport * as PatientsByPeriod from \"./patientsByPeriodHierarchy\";\r\nimport * as DiagnosesByPeriod from \"./diagnosesByPeriodHierarchy\";\r\nimport * as DataQualityByPeriod from \"./dataQualityByPeriod\";\r\nimport * as PrimarySite from \"./primarySiteHierarchy\";\r\nimport * as HhsResidenceGroup from \"./hhsResidenceGroup\";\r\nimport * as HhsResidenceGroupByPeriod from \"./hhsResidenceGroupByPeriod\";\r\nimport * as Morphology from \"./morphology\";\r\nimport * as Remoteness from \"../../common/plotdata/remoteness\";\r\nimport * as HHSOfResidence from \"../../common/plotdata/hhsOfResidence\";\r\nimport * as FirstTreatment from \"./firstTreatment\";\r\nimport * as TimeToFirstTreatment from \"./timeToFirstTreatment\";\r\nimport * as DataQualityByIndicator from \"./dataQualityByIndicator\";\r\nimport { IDashboardViewModel } from \"./viewModel\";\r\n\r\nexport { type IDashboardDataQualityViewModel, type IDashboardViewModel } from \"./viewModel\";\r\n\r\nexport interface IDashboardSource {\r\n eligible: IDashboardViewModel[];\r\n ineligible: IDashboardViewModel[];\r\n\tnoProfiles: Partial[];\r\n}\r\n\r\nexport interface IDashboardDimensionsViewModel extends IDashboardSharedDimensionsViewModel {\r\n hhsResidenceGroups?: DimensionsById;\r\n dataQualityIndicators?: DimensionsById;\r\n monthsArray?: Array;\r\n yearsArray?: Array;\r\n months?: { [monthId: number]: string };\r\n years?: { [yearId: number]: string };\r\n dqCompFacility?: { [facilityYearKey: string]: number };\r\n dqCompState?: { [facilityYearKey: string]: number };\r\n oneYearSurvivalMDT?: { [mdtDiagYearKey: string]: { \"MDT\": number, \"State\": number } };\r\n threeYearSurvivalMDT?: { [mdtDiagYearKey: string]: { \"MDT\": number, \"State\": number } };\r\n fiveYearSurvivalMDT?: { [mdtDiagYearKey: string]: { \"MDT\": number, \"State\": number } };\r\n tenYearSurvivalMDT?: { [mdtDiagYearKey: string]: { \"MDT\": number, \"State\": number } };\r\n kmSurvivalMDT?: {[mdtCancerKey: string]: { survivalTime: string, mdtKMSurvival: number, stateKMSurvival: number }};\r\n}\r\n\r\nexport interface IChartData extends IDashboardSharedChartData {\r\n reviewsByService: ReviewsByService.IPlotData;\r\n patientsByService: PatientsByService.IPlotData;\r\n diagnosesByService: DiagnosesByService.IPlotData;\r\n reviewsByPeriod: ReviewsByPeriod.IHierarchyPlotData;\r\n patientsByPeriod: PatientsByPeriod.IHierarchyPlotData;\r\n diagnosesByPeriod: DiagnosesByPeriod.IHierarchyPlotData;\r\n primarySite: PrimarySite.IHierarchyPlotData;\r\n morphology: Morphology.IPlotData;\r\n remoteness: Remoteness.IPlotData;\r\n hhsOfResidence: HHSOfResidence.IPlotData;\r\n firstTreatment: FirstTreatment.IPlotData;\r\n timeToFirstTreatment: TimeToFirstTreatment.IPlotData;\r\n hhsResidenceGroup: HhsResidenceGroup.IPlotData;\r\n hhsResidenceGroupByPeriod: HhsResidenceGroupByPeriod.IHierarchyPlotData;\r\n dataQualityByPeriod: DataQualityByPeriod.IHierarchyPlotData;\r\n dataQualityByIndicator: DataQualityByIndicator.IPlotData;\r\n mdts: IDimMDT[];\r\n month: IDimension[];\r\n year: IDimension[];\r\n dqCompFacility: { [facilityYearKey: string]: number };\r\n dqCompState: { [facilityYearKey: string]: number };\r\n oneYearSurvivalMDT?: { [mdtDiagYearKey: string]: { \"MDT\": number, \"State\": number } };\r\n threeYearSurvivalMDT?: { [mdtDiagYearKey: string]: { \"MDT\": number, \"State\": number } };\r\n fiveYearSurvivalMDT?: { [mdtDiagYearKey: string]: { \"MDT\": number, \"State\": number } };\r\n tenYearSurvivalMDT?: { [mdtDiagYearKey: string]: { \"MDT\": number, \"State\": number } };\r\n kmSurvivalMDT?: {[mdtCancerKey: string]: { survivalTime: string, mdtKMSurvival: number, stateKMSurvival: number }};\r\n //Computations\r\n totalReviews: number;\r\n totalPresentations: number;\r\n totalManyPresentations: number;\r\n totalPatients: number;\r\n totalDiagnoses: number;\r\n totalDataQualityEligibleDiagnoses: number;\r\n totalMaleDiagnoses: number;\r\n totalIndigenousDiagnoses: number;\r\n totalMDTs: number;\r\n totalDisadvantaged: number;\r\n totalComorbidity2Plus: number;\r\n totalLateStage: number;\r\n\ttotalNoProfiles: number;\r\n medianAgeAtDiagnosis: number;\r\n averageDataQuality: number;\r\n // Export\r\n filteredReferralIdCsv: string;\r\n excludedReferralIdCsv: string;\r\n\r\n}\r\n\r\nconst FilterKey: IFilterKeys = {\r\n HHSResidenceGroup: { key: \"HHSResidenceGroup\", label: \"HHS residence group\" },\r\n HHSOfResidence: { key: \"HHSOfResidence\", label: \"HHS of residence\"},\r\n DataQualityEligible: { key: \"DataQualityEligible\", label: \"Data quality eligible\" },\r\n PrimarySite: { key: \"PrimarySite\", label: \"Primary site\" },\r\n Morphology: { key: \"Morphology\", label: \"Morphology\" },\r\n Remoteness: { key: \"Remoteness\", label: \"Rurality\" },\r\n FirstTreatment: { key: \"FirstTreatment\", label: \"First Treatment\" },\r\n TimeToFirstTreatment: { key: \"TimeToFirstTreatment\", label: \"Time To First Treatment\" },\r\n DiagMonth: { key: \"DiagMonth\", label: \"Diagnosis Month\" },\r\n DiagYear: { key: \"DiagYear\", label: \"Diagnosis Year\" },\r\n}\r\n\r\nexport const DashboardFilterKeys: IFilterKeys = {\r\n ...DashboardSharedFilterKey,\r\n ...FilterKey\r\n}\r\n\r\nexport type Filters = IFilters;\r\nexport type DashboardFilterFunc = DashboardSharedFilterFunc;\r\nexport type AddDataFunc = AddDataSharedFunc;\r\n\r\n","import { IFilterKey, IFilterKeys, IFilters } from \"models/core\";\r\n\r\nexport function generateUUID() {\r\n\tvar d = Date.now();\r\n\treturn 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {\r\n\t\tvar r = (d + Math.random() * 16) % 16 | 0;\r\n\t\td = Math.floor(d / 16);\r\n\t\treturn (c === 'x' ? r : (r & 0x3 | 0x8)).toString(16);\r\n\t});\r\n}\r\n\r\n\r\n\r\n/**\r\n * Execute a head request to determine if a given url is accessible\r\n */\r\nexport function serverExists(url: string, callback: (exists: boolean) => void) {\r\n\t// if (isIeBrowser())\r\n\t// \treturn callback(true);\r\n\r\n\tif (!window.XMLHttpRequest)\r\n\t\treturn callback(false);\r\n\r\n\ttry {\r\n\t\tconst xhr = new XMLHttpRequest();\r\n\t\txhr.open(\"GET\", url);\r\n\t\txhr.timeout = 2000;\r\n\t\txhr.onreadystatechange = function () {\r\n\t\t\tif (xhr.readyState === 4) {\r\n\t\t\t\tconst status = xhr.status;\r\n\t\t\t\tif (status >= 200 && status < 400) {\r\n\t\t\t\t\tcallback(true);\r\n\t\t\t\t} else {\r\n\t\t\t\t\t//Circumvent CORS, try load image\r\n\t\t\t\t\tconst canary = document.createElement(\"img\");\r\n\t\t\t\t\tcanary.onerror = (..._args) => {\r\n\t\t\t\t\t\t//image does not exist (no favicon) or any other error\r\n\t\t\t\t\t\tcallback(false);\r\n\t\t\t\t\t};\r\n\t\t\t\t\tcanary.onload = () => {\r\n\t\t\t\t\t\t//image exists but cors blocked\r\n\t\t\t\t\t\tcallback(true);\r\n\t\t\t\t\t};\r\n\t\t\t\t\tconst u = new URL(url);\r\n\t\t\t\t\tcanary.src = u.origin + \"/favicon.ico\";\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t};\r\n\r\n\t\txhr.send();\r\n\t} catch (error) {\r\n\t\tconsole.error(error);\r\n\t\tcallback(false);\r\n\t}\r\n}\r\n","import { ApiService } from \"qccat-ui\";\r\nimport { WebServiceUrl, LoginUrl, NotifyRequestRejectedUrl } from \"../config/appUrlConfig\";\r\n\r\nexport const dashboardApiService = new ApiService( { apiUrl: WebServiceUrl, loginUrl: LoginUrl, notifyRequestRejectedUrl: NotifyRequestRejectedUrl });","import { IStateIndicator, IUserSettings } from \"models\";\r\nimport { dashboardApiService } from \"./dashboardApiService\";\r\nimport { max } from \"moment\";\r\n\r\nconst routes = {\r\n\tpingDashboard: \"api/dashboard/ping\",\r\n\tgetStateIndicatorReferences: \"api/dashboard/getStateIndicatorReferences\",\r\n\tgetMdtDashboard: \"api/dashboard/getMdtDashboard\",\r\n\tgetMdtDashboardReferences: \"api/dashboard/getMdtDashboardReferences\",\r\n\tgetMdtDashboardDataQualityIndicators: \"api/dashboard/getMdtDashboardDataQualityIndicators\",\r\n\tgetMdtDashboardDataQualityComparisons: \"api/dashboard/getMdtDashboardDataQualityComparisons\",\r\n\tgetMdtDashboardSurvival: \"api/dashboard/getMdtDashboardSurvival\",\r\n\tgetMdtDashboardKMSurvival: \"api/dashboard/getMdtDashboardKMSurvival\",\r\n\tgetNoMdtDashboard: \"api/dashboard/getNoMdtDashboard\",\r\n\tgetNoMdtDashboardReferences: \"api/dashboard/getNoMdtDashboardReferences\",\r\n\tgetNoMdtDashboardSurvival: \"api/dashboard/getNoMdtDashboardSurvival\",\r\n\tgetNoMdtDashboardKMSurvival: \"api/dashboard/getNoMdtDashboardKMSurvival\",\r\n\tgetBreastDashboard: \"api/dashboard/getBreastDashboard2\",\r\n\tgetBreastDashboardReferences: \"api/dashboard/getBreastDashboardReferences\",\r\n\tgetCRCDashboard: \"api/dashboard/getCRCDashboard2\",\r\n\tgetCRCDashboardReferences: \"api/dashboard/getCRCDashboardReferences\",\r\n\tgetLungDashboard: \"api/dashboard/getLungDashboard\",\r\n\tgetLungDashboardReferences: \"api/dashboard/getLungDashboardReferences\",\r\n\tgetBrainDashboard: \"api/dashboard/getBrainDashboard\",\r\n\tgetBrainDashboardReferences: \"api/dashboard/getBrainDashboardReferences\",\r\n\tgetHeadAndNeckDashboard: \"api/dashboard/getHeadAndNeckDashboard\",\r\n\tgetHeadAndNeckDashboardReferences: \"api/dashboard/getHeadAndNeckDashboardReferences\",\r\n\tgetYouthCancerDashboard: \"api/dashboard/getYouthCancerDashboard\",\r\n\tgetYouthCancerDashboardReferences: \"api/dashboard/getYouthCancerDashboardReferences\",\r\n\tgetAMLDashboard: \"api/dashboard/getAMLDashboard\",\r\n\tgetAMLDashboardReferences: \"api/dashboard/getAMLDashboardReferences\",\r\n\tgetUserSettings: \"api/dashboard/userSettings\",\r\n\tgetMdtDashboardNoProfileIndicators: \"api/dashboard/getMdtDashboardNoProfileIndicators\"\r\n}\r\n\r\nexport const pingDashboard = () =>\r\n\tdashboardApiService.get(routes.pingDashboard)\r\n\r\nlet stateWideIndicators: IStateIndicator[] | null = null;\r\n\r\nexport const getStateIndicatorReferences = async (cancerName: string, year?: number) => {\r\n\tif (stateWideIndicators == null)\r\n\t\tstateWideIndicators = await (dashboardApiService.get(routes.getStateIndicatorReferences)) as any;\r\n\r\n\t// option 1 but that means you need to change every dashboard because instead of just a string it is an object with numerator, denominator and percentage\r\n\t// let dictionary: { [key: string]: { numerator: string, denominator: string, percentage: string } }\r\n\t// \t= Object.assign({}, ...res.filter(x => x.cancer.toLowerCase() == cancerName).map((x) => ({ [x.indicator]: { numerator: x.numerator, denominator: x.denominator, percentage: x.percentage } })));\r\n\r\n\t// option 2 make it all a string, might look wonky not sure if you can insert newlines like this\r\n\tif (stateWideIndicators != null) {\r\n\r\n\t\tlet dictionary = Object.assign({}, ...stateWideIndicators.filter(x => x.cancer.toLowerCase().includes(cancerName) && (x.endYear == year || !year)).map(x =>\r\n\t\t\t(x.rateText2 !== null ? ({ [x.indicator]: `${x.rateText1}\\n${x.rateText2}` }) : ({ [x.indicator]: `${x.rateText1}` }))\r\n\t\t));\r\n\t\t\r\n\t\treturn dictionary;\r\n\t}\r\n\r\n\r\n\treturn {};\r\n}\r\n\r\n\r\nexport const getMdtDashboard = (showAll: boolean = false) =>\r\n\tdashboardApiService.post(routes.getMdtDashboard, { showAll });\r\n\r\nexport const getMdtDashboardReferences = (showAll: boolean = false) =>\r\n\tdashboardApiService.post(routes.getMdtDashboardReferences, { showAll });\r\n\r\nexport const getMdtDashboardDataQualityIndicators = (showAll: boolean = false) =>\r\n\tdashboardApiService.post(routes.getMdtDashboardDataQualityIndicators, { showAll });\r\n\r\nexport const getMdtDashboardDataQualityComparisons = (showAll: boolean = false) =>\r\n\tdashboardApiService.post(routes.getMdtDashboardDataQualityComparisons, { showAll });\r\n\r\nexport const getMdtDashboardNoProfileIndicators = (showAll: boolean = false) =>\r\n\tdashboardApiService.post(routes.getMdtDashboardNoProfileIndicators, { showAll });\r\n\r\nexport const getMdtDashboardSurvival = (showAll: boolean = false, service: any, primarySite: any) =>\r\n\tdashboardApiService.post(routes.getMdtDashboardSurvival, { showAll, service, primarySite });\r\n\r\nexport const getMdtDashboardKMSurvival = (showAll: boolean = false, service: any, primarySite: any) =>\r\n\tdashboardApiService.post(routes.getMdtDashboardKMSurvival, { showAll, service, primarySite });\r\n\r\nexport const getNoMdtDashboard = (showAll: boolean = false) =>\r\n\tdashboardApiService.post(routes.getNoMdtDashboard, { showAll });\r\n\r\nexport const getNoMdtDashboardReferences = (showAll: boolean = false) =>\r\n\tdashboardApiService.post(routes.getNoMdtDashboardReferences, { showAll });\r\n\r\nexport const getNoMdtDashboardSurvival = (showAll: boolean = false, service: any, primarySite: any) =>\r\n\tdashboardApiService.post(routes.getNoMdtDashboardSurvival, { showAll, service, primarySite });\r\n\r\nexport const getNoMdtDashboardKMSurvival = (showAll: boolean = false, service: any, primarySite: any) =>\r\n\tdashboardApiService.post(routes.getNoMdtDashboardKMSurvival, { showAll, service, primarySite });\r\n\r\nexport const getBreastDashboard = (showAll: boolean = false) =>\r\n\tdashboardApiService.post(routes.getBreastDashboard, { showAll });\r\n\r\nexport const getBreastDashboardReferences = (showAll: boolean = false) =>\r\n\tdashboardApiService.post(routes.getBreastDashboardReferences, { showAll });\r\n\r\nexport const getCRCDashboard = (showAll: boolean = false) =>\r\n\tdashboardApiService.post(routes.getCRCDashboard, { showAll });\r\n\r\nexport const getCRCDashboardReferences = (showAll: boolean = false) =>\r\n\tdashboardApiService.post(routes.getCRCDashboardReferences, { showAll });\r\n\r\nexport const getLungDashboard = (showAll: boolean = false) =>\r\n\tdashboardApiService.post(routes.getLungDashboard, { showAll });\r\n\r\nexport const getLungDashboardReferences = (showAll: boolean = false) =>\r\n\tdashboardApiService.post(routes.getLungDashboardReferences, { showAll });\r\n\r\nexport const getBrainDashboard = (showAll: boolean = false) =>\r\n\tdashboardApiService.post(routes.getBrainDashboard, { showAll });\r\n\r\nexport const getBrainDashboardReferences = (showAll: boolean = false) =>\r\n\tdashboardApiService.post(routes.getBrainDashboardReferences, { showAll });\r\n\r\nexport const getHeadAndNeckDashboard = (showAll: boolean = false) =>\r\n\tdashboardApiService.post(routes.getHeadAndNeckDashboard, { showAll });\r\n\r\nexport const getHeadAndNeckDashboardReferences = (showAll: boolean = false) =>\r\n\tdashboardApiService.post(routes.getHeadAndNeckDashboardReferences, { showAll });\r\n\r\nexport const getYouthCancerDashboard = (showAll: boolean = false) =>\r\n\tdashboardApiService.post(routes.getYouthCancerDashboard, { showAll });\r\n\r\nexport const getYouthCancerDashboardReferences = (showAll: boolean = false) =>\r\n\tdashboardApiService.post(routes.getYouthCancerDashboardReferences, { showAll });\r\nexport const getAMLDashboard = (showAll: boolean = false) =>\r\n\tdashboardApiService.post(routes.getAMLDashboard, { showAll });\r\n\r\nexport const getAMLDashboardReferences = (showAll: boolean = false) =>\r\n\tdashboardApiService.post(routes.getAMLDashboardReferences, { showAll });\r\n\r\nexport const getUserSettings = () =>\r\n\tdashboardApiService.get(routes.getUserSettings) as Promise;\r\n","import { IChartData, IDashboardDimensionsViewModel, Filters } from \"../plotdata\";\r\n\r\n//Actions / requests\r\nexport enum WorkerRequestType { Ping, Fetch, ChartData, FetchSurvival }\r\nexport interface IWorkerFetchRequest { all: boolean, rawRefs: any, rawRows: string, rawDqiRows: string, rawDqiCompRows: string, rawNoProfileRows: string }\r\nexport interface IWorkerFetchSurvivalRequest { all: boolean, rawSurvivalRows: string, rawKMSurvivalRows: string, activeFilters: Filters}\r\nexport interface IWorkerChartDataRequest { filtersToApply: Filters };\r\nexport interface IWorkerRequest {\r\n type: WorkerRequestType;\r\n id: string;\r\n payload?: any; //?\r\n}\r\n\r\n//Results\r\nexport enum WorkerResultType { Ping, Fetch, ChartData, InvalidType }\r\nexport interface IWorkerResult {\r\n type: WorkerResultType;\r\n id: string;\r\n payload?: any; //?\r\n}\r\nexport interface IWorkerPingResult {}\r\nexport interface IWorkerFetchResult { allData: boolean, references: IDashboardDimensionsViewModel, chartData: IChartData }\r\nexport type IWorkerChartDataResult = IChartData;","export default function Worker_fn() {\n return new Worker(__webpack_public_path__ + \"data.worker.4b768b3704792bd6c61f.worker.js\");\n}\n","import { ApiService, IConfig } from \"qccat-ui\";\r\nimport { WebServiceUrl, LoginUrl, NotifyRequestRejectedUrl } from \"../config/appUrlConfig\";\r\n\r\nexport const qoolApiService = new ApiService( { apiUrl: WebServiceUrl, loginUrl: LoginUrl, notifyRequestRejectedUrl: NotifyRequestRejectedUrl });","import { qoolApiService } from \"./qoolApiService\";\r\nimport { ICreateFileReportResult } from \"models\";\r\n\r\nconst routes = {\r\n\tgetMdtDashboardPatientList: \"api/report/GetMdtDashboardPatientList\",\r\n\tgetMdtDashboardExcludedPatientList: \"api/report/GetMdtDashboardExcludedPatientList\",\r\n\tgetBreastIndicatorPatientList: \"api/report/GetBreastIndicatorPatientList\",\r\n\tgetLungIndicatorPatientList: \"api/report/GetLungIndicatorPatientList\",\r\n\tgetCRCIndicatorPatientList: \"api/report/GetCRCIndicatorPatientList\",\r\n\tgetBrainIndicatorPatientList: \"api/report/GetBrainIndicatorPatientList\",\r\n\tgetHeadAndNeckIndicatorPatientList: \"api/report/GetHeadAndNeckIndicatorPatientList\",\r\n\tgetYouthCancerIndicatorPatientList: \"api/report/GetYouthCancerIndicatorPatientList\",\r\n\tgetAMLIndicatorPatientList: \"api/report/GetAMLIndicatorPatientList\"\r\n};\r\n\r\ninterface IReportViewModel {\r\n\r\n}\r\n\r\nexport class ReportApi {\r\n\tstatic getMdtDashboardPatientList(referralIdCsvOrAll: string, allData: boolean) {\r\n\t\treturn qoolApiService.post(routes.getMdtDashboardPatientList, { referralIdCsvOrAll, allData }) as Promise\r\n\t}\r\n\r\n\tstatic getMdtDashboardExcludedPatientList(excludedReferralIdCsv: string, allData: boolean) {\r\n\t\treturn qoolApiService.post(routes.getMdtDashboardExcludedPatientList, { excludedReferralIdCsv, allData }) as Promise\r\n\t}\r\n\r\n\tstatic getBreastIndicatorPatientList(referralIdCsvOrAll: string, allData: boolean, extractTypeId: number) {\r\n\t\treturn qoolApiService.post(routes.getBreastIndicatorPatientList, { referralIdCsvOrAll, allData, extractTypeId }) as Promise\r\n\t}\r\n\r\n\tstatic getLungIndicatorPatientList(referralIdCsvOrAll: string, allData: boolean, extractTypeId: number) {\r\n\t\treturn qoolApiService.post(routes.getLungIndicatorPatientList, { referralIdCsvOrAll, allData, extractTypeId }) as Promise\r\n\t}\r\n\r\n\tstatic getCRCIndicatorPatientList(referralIdCsvOrAll: string, allData: boolean, extractTypeId: number) {\r\n\t\treturn qoolApiService.post(routes.getCRCIndicatorPatientList, { referralIdCsvOrAll, allData, extractTypeId }) as Promise\r\n\t}\r\n\t\r\n\tstatic getBrainIndicatorPatientList(referralIdCsvOrAll: string, allData: boolean, extractTypeId: number) {\r\n\t\treturn qoolApiService.post(routes.getBrainIndicatorPatientList, { referralIdCsvOrAll, allData, extractTypeId }) as Promise\r\n\t}\r\n\r\n\tstatic getHeadAndNeckIndicatorPatientList(referralIdCsvOrAll: string, allData: boolean, extractTypeId: number) {\r\n\t\treturn qoolApiService.post(routes.getHeadAndNeckIndicatorPatientList, { referralIdCsvOrAll, allData, extractTypeId }) as Promise\r\n\t}\r\n\r\n\tstatic getYouthCancerIndicatorPatientList(referralIdCsvOrAll: string, allData: boolean, extractTypeId: number) {\r\n\t\treturn qoolApiService.post(routes.getYouthCancerIndicatorPatientList, { referralIdCsvOrAll, allData, extractTypeId }) as Promise\r\n\t}\r\n\r\n\tstatic getAMLIndicatorPatientList(referralIdCsvOrAll: string, allData: boolean, extractTypeId: number) {\r\n\t\treturn qoolApiService.post(routes.getAMLIndicatorPatientList, { referralIdCsvOrAll, allData, extractTypeId }) as Promise\r\n\t}\r\n}\r\n\r\nexport default ReportApi;\r\n","import { generateUUID } from \"helpers\";\r\nimport { getMdtDashboard, getMdtDashboardDataQualityComparisons, getMdtDashboardDataQualityIndicators, getMdtDashboardKMSurvival, getMdtDashboardNoProfileIndicators, getMdtDashboardReferences, getMdtDashboardSurvival } from \"api/dashboardApi\";\r\nimport { Filters } from \"../plotdata\";\r\nimport { IWorkerChartDataRequest, IWorkerChartDataResult, IWorkerFetchRequest, IWorkerFetchResult, IWorkerFetchSurvivalRequest, IWorkerPingResult, IWorkerRequest, WorkerRequestType, WorkerResultType } from \"./models\";\r\nimport DataWorker from 'worker-loader!./data.worker';\r\nimport ReportApi from \"api/reportApi\";\r\nimport { ICreateFileReportResult } from \"models\";\r\nexport { type IWorkerChartDataResult, type IWorkerFetchResult, type IWorkerPingResult, type IWorkerRequest, WorkerRequestType }\r\n\r\n//#region Worker\r\n\r\nlet worker: DataWorker = null;\r\nlet promises = {};\r\n\r\n/**\r\n * Start the Worker\r\n */\r\nexport function start() {\r\n if (!window[\"Worker\"]) {\r\n console.log(\"WebWorker not supported\");\r\n return false;\r\n\r\n } else {\r\n console.log(\"WebWorker starting\");\r\n\r\n worker = worker || new DataWorker();\r\n\r\n /**\r\n * When the worker sends an error back to the main thread, resolve the associated promise.\r\n */\r\n worker.addEventListener(\"message\", (ev: MessageEvent) => {\r\n const { data: { id, type, payload } } = ev;\r\n\t\t\t\r\n //Any specific handling by message type\r\n switch (type as WorkerResultType) {\r\n // case WorkerResultType.Ping: {\r\n // case WorkerResultType.Fetch: {\r\n default: {\r\n //Default handler will just resolve\r\n promises[id]?.resolve(payload);\r\n break;\r\n }\r\n }\r\n\r\n promises[id] = undefined;\r\n });\r\n\r\n /**\r\n * When the worker sends an error back to the main thread, reject the associated promise.\r\n */\r\n worker.addEventListener(\"messageerror\", (ev: MessageEvent) => {\r\n const { data: { id, type, payload } } = ev;\r\n\r\n //Any specific handling by message type\r\n switch (type) {\r\n //case WorkerResultType.Ping: {\r\n //case WorkerResultType.Fetch: {\r\n default: {\r\n console.error(\"ERROR from worker\", payload);\r\n promises[id].reject(payload);\r\n break;\r\n }\r\n }\r\n\r\n promises[id] = undefined;\r\n });\r\n\r\n return true;\r\n }\r\n}\r\n\r\n/**\r\n * Post the message to the Worker\r\n * @param request \r\n */\r\nfunction send(request: IWorkerRequest) {\r\n worker.postMessage(request);\r\n}\r\n\r\n/**\r\n * Transform into a Promise and track it.\r\n * @param type \r\n * @param payload \r\n */\r\nfunction actionPromise(type: WorkerRequestType, payload: TIn): Promise {\r\n const id = generateUUID();\r\n promises[id] = {};\r\n promises[id].promise = new Promise((resolve, reject) => {\r\n send({ id, type, payload });\r\n\r\n promises[id].resolve = resolve;\r\n promises[id].reject = reject;\r\n });\r\n\r\n return promises[id].promise;\r\n}\r\n\r\nexport function ping(): Promise {\r\n return actionPromise(WorkerRequestType.Ping, null);\r\n}\r\n\r\n/**\r\n * Fetch the data from the server, then push it to the Worker for processing.\r\n * @param all \r\n */\r\n\r\nexport function fetch(all: boolean): Promise {\r\n //WebWorker cannot access sessionStorage so do the api call here and\r\n //send the data tp it.\r\n return Promise.all([\r\n\t\tgetMdtDashboard(all),\r\n\t\tgetMdtDashboardReferences(all),\r\n\t\tgetMdtDashboardDataQualityIndicators(all),\r\n getMdtDashboardDataQualityComparisons(all), \r\n\t\tgetMdtDashboardNoProfileIndicators(all),\r\n ])\r\n .then(results => {\r\n return actionPromise(WorkerRequestType.Fetch, {\r\n all,\r\n rawRows: results[0] as string,\r\n rawRefs: results[1] as any,\r\n rawDqiRows: results[2] as string,\r\n rawDqiCompRows: results[3] as string,\r\n\t\t\t\trawNoProfileRows: results[4] as string,\r\n });\r\n });\r\n\r\n}\r\n\r\nexport function fetchSurvival(all: boolean, service: any, primarySite: any, activeFilters: Filters): Promise {\r\n //WebWorker cannot access sessionStorage so do the api call here and\r\n //send the data tp it.\r\n \r\n return Promise.all([\r\n getMdtDashboardSurvival(all, service, primarySite), \r\n getMdtDashboardKMSurvival(all, service, primarySite), \r\n ])\r\n .then(results => {\r\n return actionPromise(WorkerRequestType.FetchSurvival, {\r\n all,\r\n rawSurvivalRows: results[0] as string,\r\n rawKMSurvivalRows: results[1] as string,\r\n activeFilters\r\n });\r\n });\r\n\r\n}\r\n\r\nexport function exportMdtPatients(referralIdCsv: string, allData: boolean) {\r\n return ReportApi.getMdtDashboardPatientList(referralIdCsv, allData);\r\n}\r\n\r\nexport function exportMdtExcludedPatients(excludedIdCsv: string, allData: boolean) {\r\n return ReportApi.getMdtDashboardExcludedPatientList(excludedIdCsv, allData);\r\n}\r\n\r\n/**\r\n * Apply the filters in the Worker and return the ChartData\r\n * @param filtersToApply \r\n */\r\nexport function chartData(filtersToApply: Filters): Promise {\r\n return actionPromise(WorkerRequestType.ChartData, {\r\n filtersToApply\r\n });\r\n}\r\n\r\n/** Terminate the worker */\r\nexport function stop() {\r\n worker && worker.terminate();\r\n worker = null;\r\n console.log(\"WebWorker terminated\");\r\n}\r\n\r\n//#endregion Worker\r\n","import { Filter } from \"@mui/icons-material\";\r\nimport { IMDT } from \"qccat-ui\";\r\nimport { AddFilterBaseFunc, FilterContext, RemoveFilterBaseFunc } from \"../core\";\r\nimport { DashboardFilterKeys, Filters, IChartData, IDashboardDimensionsViewModel } from \"./plotdata\";\r\nexport { type IChartData, type IDashboardDimensionsViewModel, DashboardFilterKeys, type Filters } from \"./plotdata\";\r\nexport type AddFilterFunc = AddFilterBaseFunc;\r\nexport type RemoveFilterFunc = RemoveFilterBaseFunc;\r\n\r\nimport * as DashWorker from \"./worker\";\r\n\r\n\r\n\r\nexport interface IMDTDashboard {\r\n\tallData: boolean;\r\n\treferences: IDashboardDimensionsViewModel;\r\n\tfilters: Filters;\r\n\tchartData: IChartData;\r\n\tselectedFacilities: Set;\r\n selectedHhses: Set;\r\n onlyDataQualityEligible: boolean;\r\n}\r\n\r\n\r\nexport const initState = (): IMDTDashboard => {\r\n\treturn {\r\n\t\tallData: false,\r\n\t\treferences: {},\r\n\t\tchartData: null,\r\n\t\tfilters: {},\r\n\t\tselectedFacilities: new Set(),\r\n\t\tselectedHhses: new Set(),\r\n\t\tonlyDataQualityEligible: false,\r\n\t}\r\n};\r\n\r\n\r\nexport const loadMdtDashboard = async (state: IMDTDashboard): Promise => {\r\n\tDashWorker.start();\r\n\ttry {\r\n\t\tawait DashWorker.ping()\r\n\t\tconsole.log(\"WORKER PING RESOLVED\");\r\n\t\treturn await fetchData(state, state.allData);\r\n\t} catch {\r\n\t\tconsole.error(\"WORKER PING FAILED\");\r\n\t}\r\n}\r\n\r\n\r\nexport const loadSurvivalDashboard = async (state: IMDTDashboard, service: any, primarySite: any, activeFilters: Filters): Promise => {\r\n\ttry {\r\n\t\tawait DashWorker.ping()\r\n\t\treturn await fetchSurvivalData(state, false, service, primarySite, activeFilters);\r\n\t} catch {\r\n\t\tconsole.error(\"LOADING SURVIVAL DATA FAILED\");\r\n\t}\r\n}\r\n\r\nexport const clearFilters = (state: IMDTDashboard): IMDTDashboard => {\r\n\tconst maybeSetDefaultFilter = (filterKey: string, dimensions: { name: string }[]): Set => {\r\n\t\tif (!dimensions || dimensions.length !== 1)\r\n\t\t\treturn (new Set());\r\n\r\n\t\tif (state.allData)\r\n\t\t\treturn (new Set());\r\n\r\n\t\tlet filterSet = new Set();\r\n\t\tfilterSet.add(dimensions[0].name);\r\n\r\n\t\tstate = addFilter(state)(filterKey, [dimensions[0].name])\r\n\t\treturn filterSet;\r\n\t}\r\n\r\n\tstate.filters = {};\r\n\tstate.selectedHhses = maybeSetDefaultFilter(DashboardFilterKeys.HHS.key, state.chartData.hhses);\r\n\tstate.selectedFacilities = maybeSetDefaultFilter(DashboardFilterKeys.Facility.key, state.chartData.facilities);\r\n\r\n\treturn { ... state };\r\n\r\n}\r\n\r\n\r\n\r\nexport const closeMdtDashboard = () =>\r\n\tDashWorker.stop();\r\n\r\nconst fetchData = async (state: IMDTDashboard, all: boolean): Promise => {\r\n\ttry {\r\n\t\tconst data = await DashWorker.fetch(all);\r\n\r\n\t\tconst maybeSetDefaultFilter = (filterKey: string, dimensions: { name: string }[]): Set => {\r\n\t\t\tif (!dimensions || dimensions.length !== 1)\r\n\t\t\t\treturn (new Set());\r\n\r\n\t\t\tif (all)\r\n\t\t\t\treturn (new Set());\r\n\r\n\t\t\tlet filterSet = new Set();\r\n\t\t\tfilterSet.add(dimensions[0].name);\r\n\r\n\t\t\tstate = addFilter(state)(filterKey, [dimensions[0].name])\r\n\t\t\treturn filterSet;\r\n\t\t}\r\n\r\n\t\tstate.selectedHhses = maybeSetDefaultFilter(DashboardFilterKeys.HHS.key, data.chartData.hhses);\r\n state.selectedFacilities = maybeSetDefaultFilter(DashboardFilterKeys.Facility.key, data.chartData.facilities);\r\n\t\tstate.allData = all;\r\n\t\tstate.references = data.references;\r\n\t\tstate.chartData = data.chartData;\r\n\t\t\r\n\t\treturn state;\r\n\t} catch {\r\n\t\tconsole.error(\"WORKER FETCHDATA FAILED\");\r\n\t\treturn state;\r\n\t}\r\n}\r\n\r\n\r\nconst fetchSurvivalData = async (state: IMDTDashboard, all: boolean, service: any, primarySite: any, activeFilters: Filters): Promise => {\r\n\ttry {\r\n\t\tconst data = await DashWorker.fetchSurvival(all, service, primarySite, activeFilters);\r\n\t\tstate.chartData = data.chartData;\r\n\t\treturn state;\r\n\t} catch {\r\n\t\tconsole.error(\"WORKER FETCHDATA FAILED\");\r\n\t\treturn state;\r\n\t}\r\n}\r\n\r\nexport const computeChartData = async (state: IMDTDashboard): Promise => {\r\n\ttry {\r\n\t\tconst data = await DashWorker.chartData(state.filters);\r\n\t\tstate.chartData = data;\r\n\t\treturn {...state};\r\n\t} catch {\r\n\t\tconsole.error(\"WORKER COMPUTECHARTDATA FAILED\")\r\n\t\treturn state;\r\n\t}\r\n}\r\n\r\nexport const addFilter = (state: IMDTDashboard) => (key: keyof typeof DashboardFilterKeys, value: string | string[], context?: FilterContext, labelOverride?: string): IMDTDashboard => {\r\n\tconst filters: Filters = Object.assign({}, state.filters);\r\n\tconst values = (typeof value === \"string\")\r\n\t\t? [value]\r\n\t\t: value;\r\n\r\n\t//Replace the existing path entry if we are replacing a multi-value filter\r\n\t//to do so: traverse to the parent\r\n\tconst baseContext: FilterContext = context && ((context.values().length > 1) ? context.parent() : context) || new FilterContext();\r\n\tbaseContext.push(values);\r\n\r\n\tfilters[key] = ({ value: values, labelOverride, parts: baseContext.parts });\r\n\r\n\tstate.filters = filters;\r\n\treturn {...state};\r\n}\r\n\r\n\r\n\r\nexport const removeFilter = (state: IMDTDashboard, key: keyof typeof DashboardFilterKeys, value?: string, labelOverride?: string): IMDTDashboard => {\r\n\tconst filters: Filters = Object.assign({}, state.filters);\r\n\tconst valueToRemove: string = value || null;\r\n\tconst context = FilterContext.fromFilters(filters, key);\r\n\tconst values = context.values();\r\n\tconst newValue = (valueToRemove ? values.filter(p => p != valueToRemove): null);\r\n\r\n\tconst n = context.parent() || new FilterContext();\r\n\tif (newValue) {\r\n\t\tn.push(newValue);\r\n\t}\r\n\tfilters[key] = ({value: n.values(), labelOverride, parts: n.parts});\r\n\r\n\tif (n.parts.length === 0) {\r\n\t\tdelete filters[key];\r\n\t}\r\n\r\n\tstate.filters = filters;\r\n\treturn {...state};\r\n}\r\n\r\n\r\n\r\n /**\r\n * Exports a string with the current filters selected and their values.\r\n */\r\nexport function extractFilterLabel(filterValues, spacer) {\r\n\r\nlet filters = [];\r\n\r\nfor (const key in DashboardFilterKeys) {\r\n\tif (Object.prototype.hasOwnProperty.call(DashboardFilterKeys, key)) {\r\n\t\tfilters.push({\"key\": key, \"label\": DashboardFilterKeys[key].label});\r\n\t}\r\n}\r\n\r\nlet filterString = \"\";\r\n\tif (filterValues) {\r\n\tfor (var key of Object.keys(filterValues)) {\r\n\t\t\tfilterValues[key].parts.forEach(p => {\r\n\t\t\t\tfilterString += ((filters.find(id => id.key == key).label + \":\" +\" \" + p + spacer));\r\n\t\t\t\t}) \r\n\t\r\n\t}\r\n}\r\n\r\nreturn filterString.substring(0, filterString.length -2);\r\n}\r\n","import { IAppState } from \"models\";\r\nimport { initState } from \"models/mdt\";\r\n\r\n\r\nexport const initialState = (): IAppState => {\r\n\treturn {\r\n\t\tpage: {\r\n\t\t\tdashboard: initState(),\r\n\t\t\tloading: true,\r\n\t\t\tcomputing: false,\r\n\t\t},\r\n\t\tuserSettings: {\r\n\t\t\tisAdmin: false,\r\n\t\t\tqoolLink: null,\r\n\t\t\tqlikLink: null,\r\n\t\t},\r\n\t\tappSettings: {\r\n\t\t\tshowInternalLinks: false\r\n\t\t}\r\n\t}\r\n}\r\n","import { IBreastDashboard } from \"models/breast\";\r\nimport { IMDTDashboard } from \"models/mdt\";\r\nimport { IMDTDashboard as NoMDTDashboard } from \"models/noMdt\";\r\nimport { IMDTDashboard as CRCDashboard } from \"models/crc\";\r\nimport { IBrainDashboard as BrainDashboard } from \"models/brain\";\r\nimport { IUserSettings } from \"models\";\r\nimport { ILungDashboard } from \"models/lung\";\r\nimport { IHeadAndNeckDashboard } from \"models/headAndNeck\";\r\nimport { IYouthCancerDashboard } from \"models/youthCancer\";\r\nimport { IAMLDashboard } from \"models/aml\";\r\n\r\nexport enum ActionTypes {\r\n\tUserWantsToLoadMdtDashboard,\r\n\tUserLoadedMdtDashboard,\r\n\tUserClickedOnChart,\r\n\tUserClearedFilters,\r\n\tShowInternalLinks,\r\n\tApiGetUserSettings,\r\n\tComputingChartData,\r\n\tUserWantsToNavigate\r\n}\r\n\r\nexport type Actions =\r\n\t| { type: ActionTypes.UserLoadedMdtDashboard, payload: (IMDTDashboard | NoMDTDashboard | CRCDashboard | IBreastDashboard | ILungDashboard | BrainDashboard | IHeadAndNeckDashboard | IAMLDashboard | IYouthCancerDashboard) }\r\n\t| { type: ActionTypes.UserWantsToLoadMdtDashboard }\r\n\t| { type: ActionTypes.UserClickedOnChart, payload: (IMDTDashboard | NoMDTDashboard | CRCDashboard | IBreastDashboard | ILungDashboard | BrainDashboard | IHeadAndNeckDashboard | IAMLDashboard | IYouthCancerDashboard) }\r\n\t| { type: ActionTypes.UserClearedFilters, payload: (IMDTDashboard | NoMDTDashboard | CRCDashboard | IBreastDashboard | ILungDashboard | BrainDashboard | IHeadAndNeckDashboard | IAMLDashboard | IYouthCancerDashboard) }\r\n\t| { type: ActionTypes.ApiGetUserSettings, payload: IUserSettings }\r\n\t| { type: ActionTypes.ShowInternalLinks, payload: boolean }\r\n\t| { type: ActionTypes.ComputingChartData }\r\n\t| { type: ActionTypes.UserWantsToNavigate }\r\n","import { IAppSettings } from \"models\";\r\nimport { ActionTypes } from \"./actions\";\r\n\r\nexport const appSettingsReducer = (state: IAppSettings, { payload, type }: { payload: any, type: ActionTypes } ) => {\r\n switch (type) {\r\n\t\tcase ActionTypes.ShowInternalLinks:\r\n\t\t\tstate.showInternalLinks = payload;\r\n\t\t\treturn { ...state }\r\n\t\t\t\r\n default:\r\n return state\r\n }\r\n}\r\n\r\n\r\n","import { IMDTDashboard } from \"models/mdt\";\r\nimport { IMDTDashboard as NoMDTDashboard } from \"models/noMdt\";\r\nimport { IMDTDashboard as CRCDashboard } from \"models/crc\";\r\nimport { IBreastDashboard } from \"models/breast\";\r\nimport { ActionTypes } from \"./actions\";\r\nimport { ILungDashboard } from \"models/lung\";\r\nimport { IBrainDashboard } from \"models/brain\";\r\nimport { IHeadAndNeckDashboard } from \"models/headAndNeck\";\r\nimport { IYouthCancerDashboard } from \"models/youthCancer\";\r\nimport { IAMLDashboard } from \"models/aml\";\r\nimport { initialState } from \"./initialState\";\r\n\r\nexport const pageReducer = (state: { dashboard: (IMDTDashboard | NoMDTDashboard | CRCDashboard | IBreastDashboard | ILungDashboard | IBrainDashboard | IHeadAndNeckDashboard | IYouthCancerDashboard | IAMLDashboard); loading: boolean; computing: boolean }, action: any) => {\r\n\tswitch (action.type) {\r\n\t\tcase ActionTypes.UserLoadedMdtDashboard:\r\n\t\t\tstate.dashboard = action.payload;\r\n\t\t\tstate.loading = false;\r\n\t\t\treturn { ...state };\r\n\r\n\t\tcase ActionTypes.UserWantsToLoadMdtDashboard:\r\n\t\t\tstate.loading = true;\r\n\t\t\treturn { ...state };\r\n\r\n\t\tcase ActionTypes.UserWantsToNavigate:\r\n\t\t\tconst nextState = initialState()\r\n\t\t\treturn nextState.page;\r\n\r\n\t\tcase ActionTypes.UserClickedOnChart:\r\n\t\tcase ActionTypes.UserClearedFilters:\r\n\t\t\tstate.dashboard = action.payload;\r\n\t\t\tstate.computing = false;\r\n\t\t\treturn { ...state };\r\n\r\n\t\tcase ActionTypes.ComputingChartData:\r\n\t\t\tstate.computing = true;\r\n\t\t\treturn { ...state };\r\n\r\n\r\n\r\n\t\tdefault:\r\n\t\t\treturn state;\r\n\t}\r\n}","import { IUserSettings } from \"models\";\r\nimport { ActionTypes } from \"./actions\";\r\n\r\nexport const userSettingsReducer = (state: IUserSettings, { payload, type }: { payload: any, type: ActionTypes } ) => {\r\n switch (type) {\r\n\t\tcase ActionTypes.ApiGetUserSettings:\r\n\t\t\treturn payload;\r\n\t\t\t\r\n default:\r\n return state\r\n }\r\n}\r\n\r\n\r\n","import { IAppState } from \"models\";\r\nimport { appSettingsReducer } from \"./appSettingsReducer\";\r\nimport { pageReducer } from \"./pageReducer\";\r\nimport { userSettingsReducer } from \"./userSettingsReducer\";\r\n\r\n\r\nexport const appReducer = (app: IAppState, action) => ({\r\n\tpage: pageReducer(app.page, action),\r\n\tuserSettings: userSettingsReducer(app.userSettings, action),\r\n\tappSettings: appSettingsReducer(app.appSettings, action),\r\n})","import * as React from \"react\";\r\nimport { createContext, useReducer } from 'react';\r\nimport type { IAppState } from \"models\";\r\nimport { Actions } from \"reducer/actions\";\r\nimport { initialState } from \"reducer/initialState\";\r\nimport { appReducer } from \"reducer\";\r\n\r\n\r\n\r\nconst AppContext = createContext<{ state: IAppState, dispatch: React.Dispatch }>(\r\n {\r\n state: initialState(),\r\n dispatch: () => null\r\n });\r\n\r\n\r\nconst AppProvider = ({ children }) => {\r\n const [state, dispatch] = useReducer(appReducer, initialState());\r\n\r\n return (\r\n \r\n {children}\r\n \r\n )\r\n}\r\n\r\n\r\n\r\nexport { AppContext, AppProvider };\r\n\r\n","import * as React from \"react\";\r\nimport AppBar from \"@mui/material/AppBar\";\r\nimport Toolbar from \"@mui/material/Toolbar\";\r\nimport Box from \"@mui/material/Box\";\r\nimport { Button, IconButton, Menu, MenuItem, Typography } from \"@mui/material\";\r\nimport PersonIcon from '@mui/icons-material/Person';\r\nimport MoreVertIcon from \"@mui/icons-material/MoreVert\"\r\nimport { common } from \"@mui/material/colors\";\r\nimport { useAuth } from \"AuthContext\";\r\nimport { useLocation, useNavigate } from \"react-router-dom\";\r\nimport logo from \"static/qca-white.png\";\r\nimport { AppContext } from \"AppContext\";\r\nimport { ActionTypes } from \"reducer/actions\";\r\nimport { DashboardKeys, BreastTechnicalAppendixUrl, BrainTechnicalAppendixUrl, CrcTechnicalAppendixUrl, HeadAndNeckTechnicalAppendixUrl, AMLTechnicalAppendixUrl /*, LungTechnicalAppendixUrl*/ } from \"config/appUrlConfig\";\r\n\r\n\r\nfunction Header() {\r\n\tlet navigate = useNavigate();\r\n\tlet location = useLocation();\r\n\r\n\tlet openTechnicalAppendix = (currentPageKey: string) => {\r\n\t\tlet route = location.pathname;\r\n\r\n\t\tif (currentPageKey == \"/breast-indicators\") {\r\n\t\t\troute = BreastTechnicalAppendixUrl;\r\n\t\t} else if (currentPageKey == \"/crc-indicators\") {\r\n\t\t\troute = CrcTechnicalAppendixUrl;\r\n\t\t}\r\n\t\t// else if (currentPageKey == \"/lung-indicators\") {\r\n\t\t// \troute = LungTechnicalAppendixUrl;\r\n\t\t// } \r\n\t\telse if (currentPageKey == \"/brain-indicators\") {\r\n\t\t\troute = BrainTechnicalAppendixUrl;\r\n\t\t}\r\n\t\telse if (currentPageKey == \"/headandneck-indicators\") {\r\n\t\t\troute = HeadAndNeckTechnicalAppendixUrl;\r\n\t\t}\r\n\t\telse if (currentPageKey == \"/aml-indicators\") {\r\n\t\t\troute = AMLTechnicalAppendixUrl;\r\n\t\t}\r\n\r\n\t\twindow.open(route, \"_blank\");\r\n\t}\r\n\r\n\tconst { state, dispatch } = React.useContext(AppContext);\r\n\r\n\t/*\r\n\t\tAdd elements to dashboard keys to make navigation buttons visible\r\n\t*/\r\n\tconst dashboards = DashboardKeys();\r\n\r\n\tconst isHomeRoute = location.pathname == \"/mdt-activity\" || location.pathname == \"/\";\r\n\r\n\r\n\tconst navButton = (key: string, label: string, pathToNavigateTo: string) => {\r\n\t\tconst dash: boolean = dashboards[key];\r\n\r\n\t\tif (dash == undefined || !dash)\r\n\t\t\treturn;\r\n\r\n\t\tlet style = {\r\n\t\t\tcolor: \"white\",\r\n\t\t\tmarginTop: 10,\r\n\t\t\tmarginLeft: 5\r\n\t\t}\r\n\r\n\t\tconst currentRoute = pathToNavigateTo == location.pathname || (pathToNavigateTo == \"/mdt-activity\" && location.pathname == \"/\")\r\n\r\n\t\tif (currentRoute)\r\n\t\t\tstyle = Object.assign({}, style, { textDecoration: \"underline\", textUnderlineOffset: \"100%\" });\r\n\r\n\t\treturn (\r\n\t\t\t {\r\n\t\t\t\t\tif (!currentRoute) {\r\n\t\t\t\t\t\tif (!state.page.loading) {\r\n\t\t\t\t\t\t\tdispatch({ type: ActionTypes.UserWantsToNavigate })\r\n\t\t\t\t\t\t\tnavigate(pathToNavigateTo)\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\t}\r\n\t\t\t>\r\n\t\t\t\t{label}\r\n\t\t\t\r\n\t\t)\r\n\t}\r\n\r\n\r\n\r\n\treturn (\r\n\t\t\r\n\t\t\t theme.zIndex.drawer + 1 }}>\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\tif (!isHomeRoute) {\r\n\t\t\t\t\t\t\t\t\tif (!state.page.loading) {\r\n\t\t\t\t\t\t\t\t\t\tdispatch({ type: ActionTypes.UserWantsToNavigate })\r\n\t\t\t\t\t\t\t\t\t\tnavigate(\"/\");\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t<>\r\n\t\t\t\t\t\t\t\t\t{navButton(\"mdt\", \"MDT Activity\", \"/mdt-activity\")}\r\n\t\t\t\t\t\t\t\t\t{navButton(\"noMdt\", \"Treatment Activity\", \"/treatment-activity\")}\r\n\t\t\t\t\t\t\t\t\t{navButton(\"breast\", \"Breast\", \"/breast-indicators\")}\r\n\t\t\t\t\t\t\t\t\t{navButton(\"crc\", \"Colorectal\", \"/crc-indicators\")}\r\n\t\t\t\t\t\t\t\t\t{navButton(\"lung\", \"Lung\", \"/lung-indicators\")}\r\n\t\t\t\t\t\t\t\t\t{navButton(\"brain\", \"Brain\", \"/brain-indicators\")}\r\n\t\t\t\t\t\t\t\t\t{navButton(\"headAndNeck\", \"Head And Neck\", \"/headandneck-indicators\")}\r\n\t\t\t\t\t\t\t\t\t{navButton(\"aml\", \"AML\", \"/aml-indicators\")}\r\n\t\t\t\t\t\t\t\t\t{navButton(\"youthCancer\", \"Youth Cancer\", \"/youthcancer-indicators\")}\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t{(location.pathname == \"/mdt-activity\" || location.pathname == \"/lung-indicators\" || location.pathname == \"/\" ? <> : {\r\n\t\t\t\t\t\t\t\topenTechnicalAppendix(location.pathname);\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t>\r\n\t\t\t\t\t\t\tTechnical Appendix\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t)}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t)\r\n}\r\n\r\n\r\nfunction Account() {\r\n\tconst [anchorEl, setAnchorEl] = React.useState(null);\r\n\tconst open = Boolean(anchorEl);\r\n\r\n\tconst handleClick = (event: React.MouseEvent) => {\r\n\t\tsetAnchorEl(event.currentTarget);\r\n\t};\r\n\tconst handleClose = () => {\r\n\t\tsetAnchorEl(null);\r\n\t};\r\n\r\n\tlet auth = useAuth();\r\n\r\n\tif (!auth.user)\r\n\t\treturn null;\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\tLogout\r\n\t\t\t\r\n\t\t\r\n\t)\r\n}\r\n\r\n\r\n\r\nfunction Ellipsis(props: { showInternalLinks: boolean, qlikLink: string, qoolLink: string }) {\r\n\tconst [anchorEl, setAnchorEl] = React.useState(null);\r\n\tconst open = Boolean(anchorEl);\r\n\r\n\tconst handleClick = (event: React.MouseEvent) => {\r\n\t\tsetAnchorEl(event.currentTarget);\r\n\t};\r\n\tconst handleClose = () => {\r\n\t\tsetAnchorEl(null);\r\n\t};\r\n\r\n\tconst openLink = (link: string) => {\r\n\t\twindow.open(link, '_blank').focus();\r\n\t}\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t{props.qoolLink && openLink(props.qoolLink)}>Open QOOL}\r\n\t\t\t\t{props.showInternalLinks && props.qlikLink && openLink(props.qlikLink)}>Open QLIK-Dash}\r\n\t\t\t\r\n\t\t\r\n\t)\r\n}\r\n\r\nexport default Header;","import { ApiService } from \"qccat-ui\";\r\nimport { WebServiceUrl, LoginUrl } from \"../config/appUrlConfig\";\r\n\r\nexport const authApiService = new ApiService( { apiUrl: WebServiceUrl, loginUrl: LoginUrl });","import * as React from \"react\";\r\nimport { useParams } from \"react-router-dom\";\r\nimport { Auth } from \"qccat-ui\";\r\nimport { LoginUrl } from \"config/appUrlConfig\";\r\nimport { authApiService } from \"api/authApiService\";\r\nimport { useAuth } from \"AuthContext\";\r\n\r\nfunction Authenticate() {\r\n\tconst params = useParams();\r\n\tlet auth = useAuth();\r\n\treturn (\r\n\t\t<>\r\n\t\t\t\r\n\t\t\r\n\t)\r\n}\r\n\r\nexport default Authenticate;","import * as React from \"react\";\r\nimport { useAuth } from \"AuthContext\";\r\nimport { LoginUrl, ApplicationId } from \"config/appUrlConfig\";\r\n\r\nfunction RequireAuth({ children }: { children: JSX.Element }) {\r\n\tlet auth = useAuth();\r\n\r\n\tif (!auth.user) {\r\n\t\t// Redirect them to the /login page\r\n\t\twindow.location.href = LoginUrl + \"?next=\" + ApplicationId;;\r\n\t}\r\n\r\n\treturn children;\r\n}\r\n\r\nexport default RequireAuth;","import * as React from \"react\";\r\nimport { Drawer, IconButton, Box, Tooltip, Badge, Typography, Chip, Stack, Button } from \"@mui/material\";\r\nimport ChevronRightIcon from \"@mui/icons-material/ChevronRight\";\r\nimport { common } from \"@mui/material/colors\";\r\nimport CloseRounded from '@mui/icons-material/CloseRounded';\r\nimport { AppContext } from \"AppContext\";\r\nimport ClearAllIcon from '@mui/icons-material/ClearAll';\r\nimport { ActionTypes } from \"reducer/actions\";\r\nimport * as MDT from \"models/mdt\";\r\nimport Select from 'react-select';\r\nimport { addFilterFactory, addHierarchyFilterFactory } from \"helpers/filterHelper\";\r\nimport { FilterContext } from \"models/core\";\r\nimport { ArrowBackIos } from \"@mui/icons-material\";\r\nimport { QCCATClaims } from \"qccat-ui\";\r\nimport { getUserSettings } from \"api/dashboardApi\";\r\nimport { serverExists } from \"helpers\";\r\nimport Loader from \"./filterloader\";\r\n\r\n\r\nenum LoadingAllDataState {\r\n\tFetchingData,\r\n\tWaiting,\r\n\tErrorFetchingData,\r\n\tFetchedData\r\n}\r\n\r\nfunction Page(props: { filterDrawer: React.ReactNode, main: React.ReactNode, clearFilters: (dashboard: any) => any, computeChartData: (dashboard: any) => Promise, loadData: (dashboard: any) => Promise }) {\r\n\tconst [openFilterDrawer, setOpenFilterDrawer] = React.useState(false);\r\n\tconst [loadingAllDataState, setLoadingAllDataState] = React.useState(LoadingAllDataState.Waiting);\r\n\r\n\tconst { state, dispatch } = React.useContext(AppContext);\r\n\r\n\tconst filterLength = Object.keys(state.page.dashboard.filters).length;\r\n\r\n\tReact.useEffect(() => {\r\n\r\n\t\tconst apiGetUserSettings = async () => {\r\n\t\t\ttry {\r\n\t\t\t\tconst result = await getUserSettings();\r\n\t\t\t\treturn dispatch({ type: ActionTypes.ApiGetUserSettings, payload: result });\r\n\t\t\t}\r\n\t\t\tcatch (error) {\r\n\t\t\t\tconsole.error(error);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tserverExists(\"https://qheps.health.qld.gov.au\", exists => {\r\n\t\t\treturn dispatch({ type: ActionTypes.ShowInternalLinks, payload: exists })\r\n\t\t});\r\n\r\n\t\tapiGetUserSettings();\r\n\r\n\t}, [])\r\n\r\n\tReact.useEffect(() => {\r\n\t\tsetLoadingAllDataState(LoadingAllDataState.Waiting);\r\n\t}, [props.main])\r\n\r\n\tconst pageIsLoading =\r\n\t\tstate?.page?.loading != null ? state.page.loading : true;\r\n\r\n\tconst loadAllDataView = () => {\r\n\t\tconst msgStyle = {\r\n\t\t\tdisplay: \"block\", fontSize: \"small\", textAlign: \"left\", marginTop: 3, fontStyle: \"italic\"\r\n\t\t} as React.CSSProperties\r\n\r\n\t\tswitch (loadingAllDataState) {\r\n\t\t\tcase LoadingAllDataState.Waiting:\r\n\t\t\t\treturn (\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t<>\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tWarning: Loading all data can take several minutes, please do not refresh the page\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t)\r\n\t\t\tcase LoadingAllDataState.ErrorFetchingData:\r\n\t\t\t\treturn (\r\n\t\t\t\t\tError: Unable to load all data at this time, please try again later\r\n\t\t\t\t)\r\n\r\n\t\t\tcase LoadingAllDataState.FetchingData:\r\n\t\t\t\treturn (\r\n\t\t\t\t\tIn Progress: Loading all data can take several minutes, please do not refresh the page\r\n\t\t\t\t)\r\n\r\n\t\t\tcase LoadingAllDataState.FetchedData:\r\n\t\t\t\treturn (\r\n\t\t\t\t\tSuccess: All data was loaded successfully\r\n\t\t\t\t)\r\n\t\t}\r\n\t}\r\n\r\n\t//to make multiselect filters with chips\r\n\treturn (\r\n\t\t<>\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t !pageIsLoading && setOpenFilterDrawer(true)}>\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\tif (!pageIsLoading) {\r\n\t\t\t\t\t\t\t\t\tdispatch({ type: ActionTypes.ComputingChartData });\r\n\t\t\t\t\t\t\t\t\tprops.computeChartData(props.clearFilters(state.page.dashboard))\r\n\t\t\t\t\t\t\t\t\t\t.then(dashboard => dispatch({ type: ActionTypes.UserClearedFilters, payload: dashboard }));\r\n\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t}}>\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t{props.main}\r\n\t\t\t\t\r\n\t\t\t\r\n\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t
\r\n\t\t\t\t\t\tFilters\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t !pageIsLoading && setOpenFilterDrawer(false)}>\r\n\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\t{props.loadData && state.userSettings.isAdmin &&\r\n\t\t\t\t\t\t\t\tloadAllDataView()}\r\n\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t
\r\n\r\n\t\t\t\t\t{props.filterDrawer}\r\n\r\n\t\t\t\t
\r\n\t\t\t\r\n\t\t\r\n\t)\r\n}\r\n\r\nexport default Page;","import * as React from \"react\";\r\n\r\nenum ApplicationHelpTypeEnum {\r\n\t\"HTML\" = 1,\r\n\t\"PDFContent\" = 2,\r\n}\r\n\r\ninterface IProps {\r\n label: string;\r\n blockKey?: string;\r\n helpLabel?: string;\r\n helpType?: ApplicationHelpTypeEnum;\r\n}\r\n\r\nconst BlockHeading = (label: string, blockKey: string = undefined, helpLabel?: string, helpType?: ApplicationHelpTypeEnum) => {\r\n return (\r\n \r\n )\r\n}\r\n\r\nexport class BlockHeadingComponent extends React.Component {\r\n\r\n constructor(props, context) {\r\n super(props, context);\r\n }\r\n\r\n render() {\r\n const { label, blockKey, helpLabel, helpType } = this.props;\r\n if (label === null || label === undefined)\r\n return null;\r\n\r\n return (\r\n
\r\n

\r\n {label}\r\n

\r\n {/* {blockKey && } */}\r\n
\r\n )\r\n }\r\n}\r\n\r\nexport default BlockHeading;\r\n","import { AddFilterBaseFunc, FilterContext, IHierarchyPlotData } from \"models/core\";\r\n\r\n//default colors can be found at https://plotly.com/javascript/reference/layout/#layout-colorway\r\nconst UNKNOWN_COLOR = \"#bbd854\"; //light green\r\n\r\nexport const graphColors = {\r\n unknown: UNKNOWN_COLOR,\r\n default: [\"#1e88e5\", \"#f79325\", \"#ffd92f\", UNKNOWN_COLOR], //blue, orange, yellow\r\n}\r\n\r\nconst DEFAULT_CHART_HEIGHT = 260;\r\nconst DEMOGRAPHIC_CHART_HEIGHT = 260;\r\nconst TALL_CHART_HEIGHT = 460;\r\nconst HORIZONTAL_BAR_MARGIN = 0;\r\n\r\nexport type ChartEventHandler = (e: { points: Plotly.PlotDatum[]; }) => void\r\nexport type LegendFilter = (value: string) => void;\r\n\r\n/**\r\n * Default layout for most charts\r\n */\r\nexport const defaultLayout: Partial = {\r\n font: { size: 10 },\r\n margin: {\r\n l: 80,\r\n r: 50,\r\n b: 50,\r\n t: 10,\r\n pad: 1\r\n },\r\n xaxis: { title: { font: { size: 10 } } },\r\n yaxis: { title: { font: { size: 10 } } },\r\n dragmode: \"select\" as any,\r\n colorway: graphColors.default,\r\n};\r\n\r\n/**\r\n * Default chart configuration\r\n */\r\nexport const defaultConfig: Partial = {\r\n displaylogo: false,\r\n displayModeBar: false,\r\n responsive: false\r\n};\r\n\r\n/**\r\n * Common box styling\r\n * @param height\r\n */\r\nexport function boxStyle(height: number) {\r\n return {\r\n minHeight: height,\r\n maxHeight: height,\r\n height: height,\r\n padding: 1,\r\n };\r\n}\r\n\r\n/**\r\n * Default shared styles\r\n */\r\nexport const defaultStyles = {\r\n demographicBox: boxStyle(DEMOGRAPHIC_CHART_HEIGHT),\r\n box: boxStyle,\r\n defaultBox: boxStyle(DEFAULT_CHART_HEIGHT),\r\n tallBox: boxStyle(TALL_CHART_HEIGHT),\r\n inheritHW: {\r\n width: \"inherit\",\r\n height: \"inherit\"\r\n }\r\n};\r\n\r\n/**\r\n * Common calculations for attributes for horizontal bar charts\r\n * \r\n * @param values Plot values\r\n * @param height Expected / max height\r\n * @param maxMultiplier Used to extend the axes of the chart\r\n * @param allowFilter Allow filtering / click events\r\n * @param barHeight Height to render the bar traces\r\n */\r\nexport function horizontalBarchartAttrs(values: Array, height: number = 480, maxMultiplier: number = 2, allowFilter: boolean = true, barHeight: number = 32) {\r\n //Determine the height of the chart so it can be wrapped in a scrollable container\r\n const array = values || [];\r\n const count = array.length;\r\n\r\n let maxHeight = height - 50;\r\n const barsHeight = count === 0\r\n ? maxHeight\r\n : count * (barHeight + HORIZONTAL_BAR_MARGIN);\r\n\r\n //If the chart shorter than the expected height centre it vertically\r\n const verticalAlign = (maxHeight - barsHeight > 0) ? (maxHeight - barsHeight) / 2 : 0;\r\n\r\n //Allow extra length in the x-axis range so that we can display the labels outside\r\n const maxValue = Math.max(...array) * maxMultiplier;\r\n\r\n const layout = Object.assign({}, defaultLayout, {\r\n margin: { l: 108, r: 0, b: 0, t: 0, pad: 1 },\r\n autosize: true,\r\n xaxis: { visible: false, fixedrange: true, range: [0, maxValue] },\r\n cliponaxis: false,\r\n clickmode: \"select\",\r\n });\r\n if (!allowFilter) {\r\n layout.dragmode = false;\r\n }\r\n\r\n return {\r\n maxValue,\r\n outerStyle: { minHeight: maxHeight, maxHeight: maxHeight, height: maxHeight, overflowY: barsHeight <= maxHeight ? \"hidden\" : \"scroll\" } as React.CSSProperties,\r\n innerStyle: { marginTop: verticalAlign, minHeight: barsHeight, maxHeight: barsHeight, height: barsHeight } as React.CSSProperties,\r\n layout,\r\n };\r\n}\r\n\r\n/**\r\n * Chart keys for React\r\n * @param heading \r\n */\r\nexport function computeChartKey(heading: string) {\r\n return `DASHBOARD_${heading.toUpperCase().replace(/\\s/g, \"_\")}`;\r\n}\r\n\r\n/**\r\n * When denominator is not 0, returns the result in the form \"#% (#,###)\", with optional rounding parameter\r\n * @param numerator \r\n * @param denominator \r\n */\r\n export function percentWithCount(numerator: number, denominator: number, delimiter: string = \" \", dp?: number): string {\r\n if (denominator === 0)\r\n return \"0\";\r\n\r\n const percent = (numerator / denominator * 100.0);\r\n\r\n return `${toFixed(percent, dp)}%${delimiter}(${numerator.toLocaleString()})`;\r\n}\r\n\r\n/**\r\n * When denominator is not 0, returns the result in the form \"#,### (#%)\" \r\n * @param numerator \r\n * @param denominator \r\n */\r\nexport function countWithPercent(numerator: number, denominator: number, delimiter: string = \" \"): string {\r\n if (denominator === 0)\r\n return \"0\";\r\n\r\n const percent = (numerator / denominator * 100.0);\r\n return `${numerator.toLocaleString()}${delimiter}(${toFixed(percent)}%)`;\r\n}\r\n\r\n/**\r\n * When denominator is not 0, returns the result as a percentage\r\n * @param numerator \r\n * @param denominator \r\n */\r\nexport function percentValue(numerator: number, denominator: number): number {\r\n if (denominator === 0)\r\n return 0;\r\n\r\n return (numerator / denominator * 100.0);\r\n}\r\n\r\n/**\r\n * When denominator is not 0, returns the result in the form \"#%\" \r\n * @param numerator \r\n * @param denominator \r\n */\r\nexport function percent(numerator: number, denominator: number): string {\r\n const percent = percentValue(numerator, denominator);\r\n return `${toFixed(percent)}%`;\r\n}\r\n\r\n/**\r\n * When dp is not specified, truncates trailing zeroes from the rounded value (to 2 dp).\r\n * E.g. \r\n * 2.60 returns \"2.6\"\r\n * 3.00 returns \"3\"\r\n * @param value \r\n * @param dp \r\n */\r\nexport function toFixed(value: number, dp?: number): string {\r\n if (value === null || value === undefined) {\r\n return \"\";\r\n }\r\n\r\n if (dp !== undefined) {\r\n return `${value.toFixed(dp)}`;\r\n }\r\n\r\n let v = value.toFixed(2);\r\n while (v.endsWith(\"0\")) {\r\n v = v.substr(0, v.length - 1);\r\n }\r\n if (v.endsWith(\".\")) {\r\n v = v.substr(0, v.length - 1);\r\n }\r\n return v;\r\n}\r\n\r\n/**\r\n * Creates a basic function to apply the filter with the selected values\r\n * @param filterKey key of the filter to be applied\r\n * @param filterFunc function to filter\r\n * @param context path/context information\r\n */\r\nexport function addFilterFactory(addFilter: AddFilterBaseFunc, filterKey: string, pointValueFunc: (point: Plotly.PlotDatum) => string, context?: FilterContext): ChartEventHandler {\r\n return (e: { points: Plotly.PlotDatum[]; }) => {\r\n if (!filterKey || !e || !e.points || e.points.length === 0) {\r\n return;\r\n }\r\n\r\n const uniques = new Set(e.points.map(p => pointValueFunc(p)));\r\n addFilter(filterKey, [...uniques].sort(), context);\r\n };\r\n}\r\n\r\n/**\r\n * Creates a function to apply the filter with the selected values \r\n * using the supplied function to extract the value from the view model\r\n * @param filterKey key of the filter to be applied\r\n * @param pointValueFunc function to extract the values from the points\r\n */\r\nexport function simpleFilterFactory(addFilter: AddFilterBaseFunc, filterKey: string, pointValueFunc: (point: Plotly.PlotDatum) => string): ChartEventHandler {\r\n return addFilterFactory(\r\n addFilter,\r\n filterKey,\r\n pointValueFunc\r\n );\r\n}\r\n\r\n/**\r\n * Returns a ChartEventHandler that adds a filter for a hierarchical chart. \r\n * The filter will apply each level of the hierearchy in turn to the view model based on the context against the hierarchy\r\n * as at the time of function creation.\r\n * \r\n * @param hierarchy The hierarchy to be filtered against\r\n * @param filterKey The key for the filter being created\r\n * @param valueFn Function to extract the value from the selected plotly datums.\r\n */\r\nexport function addHierarchyFilterFactory(addFilter: AddFilterBaseFunc, filterKey: string, hierarchy: IHierarchyPlotData, valueFn: (p: Plotly.PlotDatum) => string): ChartEventHandler {\r\n const { path, filterMore } = hierarchy;\r\n\t\r\n if (!filterMore)\r\n return null;\r\n\r\n const context = path && FilterContext.fromPath(path) || new FilterContext();\r\n return addFilterFactory(addFilter, filterKey, valueFn, context);\r\n}\r\n\r\n/**\r\n * Creates a function to apply a filter for a legend element click.\r\n * @param filterKey key of the filter to be applied\r\n * @param legendValue the valuie to apply for the legend\r\n */\r\nexport function legendFilterFactory(addFilter: AddFilterBaseFunc, filterKey: string): LegendFilter {\r\n return legendValue => addFilter(filterKey, legendValue);\r\n}\r\n","import React from \"react\";\r\n\r\n/**\r\n * Displays the specified element on true, message otherwise\r\n * @param condition check condition\r\n * @param element Element to display when true\r\n * @param message Message to display when false\r\n */\r\nfunction chartOrMessage(condition: boolean, elementWhenTrue: React.ReactNode, messageWhenFalse: string): any {\r\n if (condition) {\r\n return (\r\n elementWhenTrue\r\n );\r\n }\r\n\r\n return
{messageWhenFalse}
;\r\n}\r\n\r\ninterface IOptionalProps {\r\n show: boolean;\r\n message?: string;\r\n children?: React.ReactNode;\r\n}\r\n\r\n/**\r\n * Component that displays the specified element on true, message otherwise\r\n * @param props \r\n */\r\nexport function ChartOrMessage(props: IOptionalProps) {\r\n const { show, message, children } = props;\r\n return chartOrMessage(show, children, message || \"No data\");\r\n}","import React from \"react\";\r\nimport Paper from \"@mui/material/Paper\";\r\n\r\ninterface IProps {\r\n children: React.ReactNode, \r\n paperKey: string, \r\n uniqueId?: string, \r\n style?: any, \r\n overridePadding?: number | string\r\n}\r\n\r\n/**\r\n * Wraps dash element in paper border\r\n */\r\nexport function DashPaper(props: IProps) {\r\n const { children, paperKey, uniqueId, style, overridePadding } = props;\r\n \r\n return (\r\n \r\n
\r\n {children}\r\n
\r\n
\r\n );\r\n }\r\n\r\n //function dashPaper(element: JSX.Element, key: string, uniqueId?: string, style?: any, overridePadding?: number | string) {","import * as React from \"react\";\r\n\r\ninterface IProps {\r\n text: string;\r\n}\r\n\r\nexport function SubHeading(props: IProps) {\r\n const { text } = props;\r\n if (!text)\r\n return null;\r\n\r\n return (\r\n
{text}
\r\n );\r\n}","import { CSSProperties } from \"@mui/material/styles/createTypography\";\r\nimport { BlockHeadingComponent } from \"./BlockHeadingComponent\";\r\nimport React from \"react\";\r\nimport { ChartOrMessage } from \"./ChartOrMessage\";\r\nimport { DashPaper } from \"./DashPaper\";\r\nimport { SubHeading } from \"./SubHeading\";\r\n\r\ninterface IDashChart {\r\n chartKey: string;\r\n children?: React.ReactNode;\r\n heading?: string;\r\n subheading?: string;\r\n breadcrumb?: React.ReactNode;\r\n style: CSSProperties;\r\n}\r\n\r\nexport function DashChart(props: IDashChart): JSX.Element {\r\n const { children, style, heading, subheading, breadcrumb, chartKey } = props;\r\n \r\n return (\r\n \r\n
\r\n \r\n \r\n {breadcrumb}\r\n \r\n {children}\r\n \r\n
\r\n
\r\n );\r\n}\r\n","import { BarChart, Close, Fullscreen, GetApp, PieChart, ShowChart, Sort, TableChart, Image, Info, Person } from \"@mui/icons-material\";\r\nimport { Tooltip, Typography } from \"@mui/material\";\r\nimport { IFilterKeys, IFilters } from \"models/core\";\r\nimport { downloadAsImage, downloadFile } from \"models/core/core\";\r\nimport { extractFilterLabel } from \"models/mdt\";\r\nimport { PlotData } from \"plotly.js\";\r\nimport React from \"react\";\r\nimport { DataToCSV } from \"./DataToCSV\";\r\n\r\ninterface IProps {\r\n vbar?: boolean;\r\n hbar?: boolean;\r\n table?: boolean;\r\n scatter?: boolean;\r\n pie?: boolean;\r\n person?: boolean;\r\n downloadAsCsv?: boolean;\r\n downloadAsPng?: boolean;\r\n isFullScreen?: boolean;\r\n viewAsFullScreen?: boolean;\r\n tooltipInfo?: boolean;\r\n tooltipText?: string[];\r\n chartOrientation: string;\r\n chartType: string;\r\n traces: Partial[];\r\n xLabel: string;\r\n yLabel: string;\r\n title: string;\r\n setChartType: Function;\r\n setChartOrientation: Function;\r\n setFullScreen: Function;\r\n currentFilters: IFilters;\r\n}\r\n\r\n/**\r\n * Component to create the icons that will appear in the top right corner of the dash paper\r\n * In the chart file, we set true or false to each icon to decide if it will show\r\n */\r\n\r\nexport class ChartIcons extends React.Component {\r\n\r\n constructor(props, context) {\r\n super(props, context);\r\n }\r\n\r\n render() {\r\n const { vbar, \r\n hbar, \r\n table, \r\n scatter, \r\n pie, \r\n person,\r\n downloadAsCsv, \r\n downloadAsPng, \r\n viewAsFullScreen, \r\n isFullScreen, \r\n tooltipInfo,\r\n tooltipText,\r\n chartOrientation, \r\n chartType, \r\n traces, \r\n xLabel, \r\n yLabel, \r\n title, \r\n setChartType, \r\n setChartOrientation,\r\n setFullScreen,\r\n currentFilters } = this.props;\r\n\r\n //Create function to show table option\r\n const showTable = () => {\r\n setChartType(\"table\"), setChartOrientation(\"v\");\r\n };\r\n\r\n //Create function to show bar chart option\r\n const showBarChart = () => {\r\n setChartType(\"bar\"), setChartOrientation(\"v\");\r\n };\r\n\r\n //Create function to show horizontal bar chart option\r\n const showHorizontalBarChart = () => {\r\n setChartType(\"bar\"), setChartOrientation(\"h\");\r\n };\r\n\r\n //Create function to show pie chart option \r\n const showPieChart = () => {\r\n setChartType(\"pie\"), setChartOrientation(\"v\");\r\n };\r\n\r\n //Create function to show line chart option \r\n const showLineChart = () => {\r\n setChartType(\"scatter\"), setChartOrientation(\"v\");\r\n };\r\n\r\n //Create function to show person chart option \r\n const showPersonChart = () => {\r\n setChartType(\"person\"), setChartOrientation(\"h\");\r\n };\r\n\r\n //Create function to show fullscreen option\r\n const showChartFullscreen = () => {\r\n setFullScreen(true);\r\n };\r\n\r\n //Create function to close fullscreen option\r\n const closeChartFullscreen = () => {\r\n setFullScreen(false);\r\n };\r\n\r\n\r\n return (\r\n
\r\n\r\n {(vbar ? \r\n showBarChart()} \r\n style={{ cursor: \"pointer\", \r\n color: (chartType == \"bar\" && chartOrientation ==\"v\" ? \"#1e88e5\": \"gray\"), \r\n padding: \"1px\",\r\n fontSize: 20, \r\n }} \r\n />\r\n : null)}\r\n\r\n {(hbar ? \r\n showHorizontalBarChart()} \r\n style={{ cursor: \"pointer\", \r\n color: (chartType == \"bar\" && chartOrientation ==\"h\" ? \"#1e88e5\": \"gray\"), \r\n padding: \"1px\",\r\n fontSize: 20, \r\n }} \r\n />\r\n : null)}\r\n\r\n {(table ? \r\n showTable()} \r\n style={{ cursor: \"pointer\",\r\n color: (chartType == \"table\" ? \"#1e88e5\": \"gray\"),\r\n padding: \"1px\", \r\n fontSize: 20, \r\n }} \r\n />\r\n : null)}\r\n \r\n {(scatter ? \r\n showLineChart()} \r\n style={{ cursor: \"pointer\",\r\n color: (chartType == \"scatter\" ? \"#1e88e5\": \"gray\"), \r\n padding: \"1px\",\r\n fontSize: 20, \r\n }} \r\n />\r\n : null)}\r\n\r\n {(pie ? \r\n showPieChart()} \r\n style={{ cursor: \"pointer\",\r\n color: (chartType == \"pie\" ? \"#1e88e5\": \"gray\"), \r\n padding: \"1px\",\r\n fontSize: 20, \r\n }} \r\n />\r\n : null)}\r\n\r\n {(person ? \r\n showPersonChart()} \r\n style={{\r\n cursor: \"pointer\",\r\n color: (chartType == \"person\" ? \"#1e88e5\": \"gray\"),\r\n padding: \"1px\",\r\n }}\r\n />\r\n : null)}\r\n\r\n {(downloadAsCsv ?\r\n \r\n downloadFile(DataToCSV(traces, \r\n chartType,\r\n chartOrientation, \r\n xLabel, \r\n yLabel, \r\n title,\r\n currentFilters,\r\n ), \r\n title+'.csv', \r\n 'text/csv;charset=utf-8;'\r\n )} \r\n style={{ cursor: \"pointer\",\r\n color: \"gray\", \r\n padding: \"1px\",\r\n fontSize: 20, \r\n }} \r\n />\r\n : null)}\r\n\r\n {(downloadAsPng ?\r\n \r\n \r\n downloadAsImage(_.currentTarget.parentElement.parentElement.parentElement.parentElement,\r\n title+'.png',\r\n isFullScreen,\r\n extractFilterLabel(currentFilters, \" | \")) \r\n } \r\n style={{ cursor: \"pointer\",\r\n color: \"gray\", \r\n padding: \"1px\",\r\n fontSize: 20, \r\n }} \r\n />\r\n : null)}\r\n\r\n {(viewAsFullScreen && window.innerWidth > 991 && !isFullScreen ? \r\n \r\n showChartFullscreen()} \r\n style={{ cursor: \"pointer\",\r\n color: \"gray\", \r\n padding: \"1px\",\r\n fontSize: 20, \r\n }} \r\n />\r\n : null)}\r\n\r\n {(viewAsFullScreen && window.innerWidth > 991 && isFullScreen ? \r\n \r\n closeChartFullscreen()} \r\n style={{ cursor: \"pointer\", \r\n color: \"gray\", \r\n padding: \"1px\",\r\n fontSize: 20,\r\n }} \r\n />\r\n : null)}\r\n\r\n {(tooltipInfo ? \r\n \r\n {tooltipText.map(a => \r\n {a}
\r\n )} \r\n \r\n }>\r\n \r\n
: null)}\r\n\r\n
\r\n )\r\n }\r\n}\r\n\r\n ","import { IFilterKeys, IFilters } from 'models/core';\r\nimport { extractFilterLabel } from 'models/mdt';\r\nimport { PlotData } from 'plotly.js';\r\n\r\nexport function DataToCSV(traces: Partial[], \r\n chartType: string, \r\n chartOrientation: string, \r\n labelTitle: string, \r\n valueTitle: string, \r\n chartTitle: string,\r\n currentFilters: IFilters,\r\n ): string {\r\n \r\n\r\n let chartTraces = new Set;\r\n traces?.forEach(a => chartTraces.add(a.name))\r\n\r\n\r\n //transform the traces into one array \r\n let labs: any[] = [];\r\n //Get unique labels. \r\n //Create the array of labels using either the x or y values if chart is vertical or horizontal respectively \r\n //Replace any commas (,) in the label with dash (-)\r\n\r\n if (chartType == \"pie\") {\r\n traces.forEach(a => {\r\n a.labels.forEach((p: any) => {\r\n if (labs.indexOf(p) === -1) {\r\n labs.push(p.replaceAll(`,`, `- `))\r\n }\r\n })\r\n })\r\n } else if (chartOrientation == \"v\") {\r\n traces.forEach(a => {\r\n a.x.forEach((p) => {\r\n if (labs.indexOf(p) === -1) {\r\n labs.push(p.replaceAll(`,`, `- `))\r\n }\r\n })\r\n })\r\n } else {\r\n traces.forEach(a => {\r\n a.y.forEach(p => {\r\n if (labs.indexOf(p) === -1) {\r\n labs.push(p.replaceAll(`,`, `- `))\r\n }\r\n })\r\n })\r\n }\r\n\r\n //Reverse array when horizontal \r\n if (chartOrientation == \"h\") { \r\n labs.reverse();\r\n }\r\n\r\n //Get Values. Push an array of values for each trace to create an array of arrays\r\n //Ensure that the correct value is pushed for each label by using the index of the label\r\n //Where available use the 'text' property from the traces as this has additional formatting like %, thousands separator etc \r\n let vals = Array.from(Array(chartTraces.size), () => new Array(labs.length));\r\n\r\n for (i=0; i new Array(chartTraces.size + 1));\r\n for (var i=0; i < labs.length; i++) {\r\n combinedTraces[i][0] = labs[i];\r\n for (var x=1; x < chartTraces.size+1; x++) {\r\n combinedTraces[i][x] = vals[x-1][i];\r\n }\r\n }\r\n \r\n //get list of filters \r\n let filterLabel: any = \"\" \r\n if (extractFilterLabel(currentFilters, \" \") !== \"\") { \r\n combinedTraces.push([\"\", \"\"]);\r\n combinedTraces.push([\"Selected Filters\", \"\"]);\r\n filterLabel = extractFilterLabel(currentFilters, \" | \");\r\n }\r\n combinedTraces.push([filterLabel.replaceAll(`,`, `- `), \"\"]);\r\n\r\n //Add source and timestamp to the bottom of the array\r\n const source = \"Source: Cancer Alliance Queensland (\" + window.location.href + \")\"\r\n const timeStamp = \"Downloaded: \" + new Date().toString();\r\n combinedTraces.push([\"\", \"\"]); \r\n combinedTraces.push([source, \"\"]);\r\n combinedTraces.push([timeStamp, \"\"]);\r\n \r\n return (\r\n combinedTraces.map(row =>\r\n row\r\n .map(String) // convert every value to String\r\n .map((v: { replaceAll: (arg0: string, arg1: string) => any; }) => v.replaceAll('\"', '\"\"')) // escape double colons\r\n .map((v: any) => `\"${v}\"`) // quote it\r\n .map((v: any) => \"=\" + v) //add an equals sign before every argument\r\n .join(',') // comma-separated\r\n ).join('\\r\\n')\r\n );\r\n}","import React from \"react\";\r\nimport { AddFilterBaseFunc, DASH_PATH_DELIMITER_UI, FilterContext, IFilter, RemoveFilterBaseFunc } from \"models/core/filter\";\r\n\r\ninterface IProps {\r\n filteredValues: IFilter;\r\n filterKey: string;\r\n removeFilter: RemoveFilterBaseFunc;\r\n}\r\n\r\n/**\r\n * Component to display the path of the current hierarchy position.\r\n * Supports navigation and filtering back up the hierarchy.\r\n */\r\nexport class SimpleBreadcrumb extends React.Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n }\r\n\r\n /**\r\n * \r\n * @param p Value \r\n * @param partIndex \r\n */\r\n\r\n render = () => {\r\n const { filteredValues, filterKey, removeFilter } = this.props;\r\n const valuesLabel = filteredValues?.value;\r\n\r\n if (valuesLabel) {\r\n return (\r\n
\r\n \r\n removeFilter(filterKey)}>All / \r\n {valuesLabel.map((p, i) => {\r\n if (i !== valuesLabel.length - 1) {\r\n return {p + \", \"}\r\n } else {\r\n return {p}\r\n }\r\n })}\r\n
\r\n );\r\n }\r\n\r\n return (
 
);\r\n }\r\n}","import React from 'react';\r\nimport { PlotData } from 'plotly.js';\r\nimport Table from '@mui/material/Table';\r\nimport TableHead from '@mui/material/TableHead';\r\nimport TableRow from '@mui/material/TableRow';\r\nimport TableBody from '@mui/material/TableBody';\r\nimport TableCell from '@mui/material/TableCell';\r\n\r\n\r\ninterface IProps {\r\n traces: Partial[],\r\n chartOrientation: string,\r\n chartHeight: string,\r\n labelTitle: string,\r\n valueTitle: string,\r\n filterState?: any[],\r\n selectableFilter: boolean,\r\n onChanged: Function;\r\n}\r\ninterface IState {\r\n\r\n}\r\nexport class DashTable extends React.Component {\r\n state = {\r\n selected: new Set(this.props.filterState || null),\r\n };\r\n constructor(props, context) {\r\n super(props, context);\r\n }\r\n\r\n//Function to handle filtering when a item in the table is selected\r\n handleClick = (event, id) => {\r\n const { selected } = this.state;\r\n let newSelected: Set = selected;\r\n\r\n if (!selected.has(id)) {\r\n newSelected.add(id);\r\n } else {\r\n newSelected.delete(id);\r\n } \r\n\r\n\t let points: Partial[] = [{\r\n\t\ty: id,\r\n\t\tx: id,\t\t\r\n\t }];\r\n\t \r\n this.props.onChanged({ points });\r\n };\r\n\r\n isSelected = id => this.state.selected.has(id);\r\n\r\n render = () => {\r\n const { traces, chartOrientation, chartHeight, labelTitle, valueTitle, selectableFilter } = this.props;\r\n let chartTraces = new Set;\r\n traces?.forEach(a => chartTraces.add(a.name))\r\n\r\n //transform the traces into one array \r\n let combinedTraces = []\r\n let labs = [];\r\n\r\n //Get unique labels. \r\n //If chart is vertical, the x values are the labels\r\n //If chart is horizontal, the y values are the labels\r\n if (chartOrientation == \"v\") {\r\n traces.forEach(a => {\r\n a.x.forEach(p => {\r\n if (labs.indexOf(p) === -1) {\r\n labs.push(p)\r\n }\r\n })\r\n })\r\n } else {\r\n traces.forEach(a => {\r\n a.y.forEach(p => {\r\n if (labs.indexOf(p) === -1) {\r\n labs.push(p)\r\n }\r\n })\r\n })\r\n }\r\n \r\n //Get Values. Push an array of values for each trace to create an array of arrays\r\n //Ensure that the correct value is pushed for each label by using the index of the label\r\n //Where available use the 'text' property from the traces as this has additional formatting like %, thousands separator etc \r\n\r\n let vals = Array.from(Array(labs.length), () => new Array(chartTraces.size));\r\n\r\n for (i=0; i\r\n \r\n \r\n \r\n {labelTitle}\r\n \r\n {(traces.length == 1 ? \r\n {valueTitle}\r\n :\r\n traces.map(a => { \r\n return (\r\n \r\n {a.name}\r\n \r\n )\r\n }) \r\n )}\r\n \r\n \r\n \r\n {combinedTraces.map(row => {\r\n return (\r\n { this.handleClick(event, row.labels) }} \r\n\t\t\t\tselected={this.isSelected(row.labels)}\r\n\t\t\t\thover={selectableFilter}> \r\n \r\n {row.labels}\r\n \r\n {row.values?.map((dat, i) => {\r\n return (\r\n \r\n {dat.toLocaleString()}\r\n \r\n )\r\n }) \r\n }\r\n \r\n );\r\n })}\r\n \r\n \r\n );\r\n}}","import React from \"react\";\r\nimport Plot from \"react-plotly.js\";\r\nimport { chartAttrs, defaultConfig, defaultStyles, graphColors } from \"models/core\";\r\nimport { truncateStringWithEllipsis } from \"helpers/stringHelper\";\r\nimport { DashTable } from \"./DashTable\";\r\nimport { Color, PieData, PlotData } from \"plotly.js\";\r\nimport { UNKNOWN_TERMS } from \"charts/core\";\r\nimport { Person } from \"@mui/icons-material\";\r\n\r\nexport function CreateChart(height: number, \r\n width: number, \r\n paperHeight: number, \r\n chartOrientation: string, \r\n chartType: string,\r\n showChart: boolean, \r\n xtitle: string, \r\n ytitle: string,\r\n labels: any[],\r\n values: any[],\r\n traces: Partial[] | Partial[], \r\n filterFn?: Function,\r\n\t\t\t\t\t\t\tstyling?: Partial,\r\n\t\t\t\t\t\t\tdebug?: boolean,\r\n\t\t\t\t\t\t\tmaxValue?: number) {\r\n\r\n/**\r\n * Component to create the JSX element of the chart that will be drawn inside the paper on the dash \r\n */\r\n\r\n\tlet chart: JSX.Element = null;\r\n\tlet chartTraces = [];\r\n\r\n\t//Pie charts have slightly different options available so transform the traces to Pie Data \r\n\tif (chartType == \"pie\") { \r\n\t\tchartTraces = traces as Partial[];\r\n\t} else {\r\n\t\tchartTraces = traces as Partial[];\r\n\t}\r\n\r\n\t\t//Define the basic layout styling that will be applied based on the chart type and orientation\r\n\t\t//Any changes to this for an individual chart can be sent in the chart file\r\n\t\tconst style = defaultStyles.defaultBox;\r\n\t\tconst bx = chartAttrs(style.height);\r\n\t\tbx.layout.autosize = true;\r\n bx.layout.hovermode = \"closest\";\r\n bx.layout.selectdirection = (chartOrientation ==\"v\" ? \"h\" : \"v\");\r\n\t\tbx.layout.barmode = \"group\";\r\n\t\tbx.layout.margin = { l: 20, r: 20, b: 20, t: 20, pad: 2 };\r\n\t\tbx.layout.xaxis = { automargin:true,\r\n\t\t\tautotick: true, \r\n\t\t\tdtick: 1, title: xtitle, \r\n\t\t\tfixedrange: true,\r\n\t\t\tautotypenumbers: 'strict',\r\n\t\t};\r\n\t\tbx.layout.yaxis = { automargin:true,\r\n\t\t\tautotick: true, \r\n\t\t\tdtick: 1, title: ytitle, \r\n\t\t\tfixedrange: true,\r\n\t\t\tshowticklabels: true, \r\n\t\t\tautotypenumbers: 'strict', \r\n\t\t};\r\n\r\n\r\n\t\t//Trim labels to avoid really long x axis labels \r\n\t\tconst trimmedLabels: string[] | number[] = (typeof labels[0] == \"number\" ? labels : labels.map(a => truncateStringWithEllipsis(a, 15)));\r\n\r\n\t\tif (chartType == \"pie\") {\r\n\t\t\tbx.layout.margin = { l: 35, r: 35, b: 35, t: 45, pad: 2 };\r\n\t\t}\r\n\r\n\t\tif (chartOrientation == \"h\") {\r\n\t\t\tbx.layout.xaxis.range = [0, Math.max(...values) * (1 + ((window.innerWidth*-0.012+55)/100))] //We increase the range to prevent labels being cut off\r\n\t\t\tbx.layout.yaxis.autorange = true;\r\n\t\t\tbx.layout.yaxis.rangemode = 'tozero';\r\n\t\t\tbx.layout.yaxis.tickmode = \"array\";\r\n\t\t\tbx.layout.yaxis.ticktext = trimmedLabels;\r\n\t\t\tbx.layout.yaxis.tickfont = {size: 12};\r\n\t\t\tbx.layout.yaxis.tickvals = labels;\r\n\t\t\tbx.layout.yaxis.tickformat = ',d';\r\n\t\t}\r\n\r\n\t\tif (chartOrientation == \"v\") {\r\n bx.layout.yaxis.range = [0, Math.max(...values) *1.15] //We increase the range to prevent labels being cut off\r\n\t\t\tbx.layout.xaxis.autorange = true;\r\n\t\t\tbx.layout.xaxis.rangemode = 'tozero';\r\n\t\t\tbx.layout.xaxis.tickmode = \"array\";\r\n\t\t\tbx.layout.xaxis.ticktext = trimmedLabels;\r\n\t\t\tbx.layout.xaxis.tickvals = labels;\r\n\t\t\tbx.layout.xaxis.tickfont = {size: 12};\r\n\t\t\tbx.layout.xaxis.tickformat = ',d';\r\n\t\t}\r\n\r\n\t//Here we are dictating the width of the bars to ensure they are always a decent thickness and cause a scroll chart rather than making the bars really \r\n\t//thin to fit onto the chart dimensions provided\r\n\tif (chartType==\"bar\") {\r\n\t\tlet multiplier = (styling?.barmode && styling.barmode == \"overlay\" ? 1 : chartTraces.length);\r\n\t\tif (chartOrientation==\"v\") {\r\n\t\t\tbx.layout.width = (chartTraces[0]?.x?.length == 1 ? width*0.5 : (width > chartTraces[0]?.x?.length*40*multiplier ? width : chartTraces[0]?.x?.length*40*multiplier));\r\n\t\t\tbx.layout.height = height;\r\n\t\t} else {\r\n\t\t\tbx.layout.height = (chartTraces[0]?.y?.length == 1 ? height*0.5 : (height > chartTraces[0]?.y?.length*40*multiplier ? height : chartTraces[0]?.y?.length*40*multiplier));\r\n\t\t\tbx.layout.width = width;\r\n\t\t}\r\n\t} else {\r\n\t\tbx.layout.height = height;\r\n\t\tbx.layout.width = width;\r\n\t}\r\n\r\n\t//if there is any specific styling for the chart, apply here\r\n\tif (styling) {\r\n\t\tbx.layout = Object.assign({}, bx.layout, styling);\r\n\t}\r\n\r\n\t//Make bar trace green for unknown \r\n\r\n\tlet barColor: Color[] = [];\r\n\r\n\t\r\n\t\r\n\tif (chartTraces.length == 1 && chartOrientation == \"v\" && chartType == \"bar\") {\r\n\t\tchartTraces.map((a, i) => {\r\n\t\t\ta?.x?.map(x => {\r\n\t\t\treturn barColor.push(UNKNOWN_TERMS.indexOf(x) > -1 ? graphColors.unknown : graphColors.default[i]);\r\n\t\t})\r\n\r\n\t\tchartTraces[i].marker.color = barColor;\r\n\t\t})\r\n\t}\r\n\r\n\tif (chartTraces.length == 1 && chartOrientation == \"h\" && chartType == \"bar\") {\r\n\t\tchartTraces.map((a, i) => {\r\n\t\t\ta?.y?.map(y => {\r\n\t\t\treturn barColor.push(UNKNOWN_TERMS.indexOf(y) > -1\r\n\t\t\t\t? graphColors.unknown : graphColors.default[i]);\r\n\t\t})\r\n\r\n\t\tchartTraces[i].marker.color = barColor;\r\n\t\t})\r\n\t}\r\n\r\n\tif (chartType == \"pie\") {\r\n\t\tchartTraces.map((a, i) => {\r\n\t\t\ta?.labels?.map((y, j) => {\r\n\t\t\treturn barColor.push(UNKNOWN_TERMS.indexOf(y) > -1\r\n\t\t\t\t? graphColors.unknown : graphColors.default);\r\n\t\t})\r\n\r\n\t\tchartTraces[i].marker.colors = barColor;\r\n\t\t})\r\n\t}\r\n\t\r\n\tif (chartType == \"person\") {\r\n\t\tlet personValues = chartTraces.find(a => a.y?.length > 0).y ?? [];\t\r\n\t\tchart = (personValues.map((a, index) => { \r\n\t\t\treturn (\r\n\t\t\t\t
\r\n\t\t\t\t\t x + y, 0))*100+20)+\"%\"}}\r\n\t\t\t\t\t/>\r\n\t\t\t\t\t
\r\n\t\t\t\t\t{labels[index]} \r\n\t\t\t\t\t
\r\n\t\t\t\t\t{Math.round((a/personValues.reduce((x, y) => x + y, 0))*100)+\"%\"}\r\n\t\t\t\t\t
\r\n\t\t\t\t\t{\"(\"+personValues[index]+\")\"}\r\n\t\t\t\t
\r\n\t\t\t)\r\n\t\t}))\r\n\t}\r\n\r\n\t//Draw the plotly charts (anything but table currently - if we want to add pictograms etc they will need to be excluded here too and added below)\r\n\tif (showChart && chartType !== \"table\" && chartType !== \"person\") {\r\n\t\tchart = (\r\n\t\t\t\t \r\n\t\t);\r\n\t}\r\n\r\n\t//Draw any tables \r\n\tif (showChart && chartType == \"table\") {\r\n chart = (\r\n\t\t\t
\r\n
\r\n \r\n
\r\n
\r\n\t\t);\r\n }\r\n\t\r\n\treturn chart;\r\n\t}","export interface IPluralizeDefinitions {\r\n\t[key: number]: string;\r\n\tempty?: string;\r\n}\r\n\r\n/**\r\n * Joins list of rest parameter strings with space characters.\r\n * Will ignore NULL and UNDEFINED.\r\n * @param strings strings to join together\r\n * @returns all the given strings join together with space characters\r\n */\r\nexport const joiner = (...strings: string[]): string => strings.filter(Boolean).join(\" \");\r\n\r\n/**\r\n * Truncates a string and concats an ellipsis if the length\r\n * of the string is greater than the max length\r\n * @param text string to truncate\r\n * @param maxLength maximum allowed length\r\n * @returns text or text with ellipsis\r\n */\r\nexport const truncateStringWithEllipsis = (text: string, maxLength: number = 60) => {\r\n\tif (!text)\r\n\t\treturn \"\";\r\n\r\n\tif (text.length <= maxLength)\r\n\t\treturn text;\r\n\r\n\treturn text.substring(0, maxLength) + \"...\";\r\n};\r\n\r\n\r\n/**\r\n * Truncates long file name to given length with extension preserved\r\n * @param fileName string to truncate\r\n * @param maxLength maximum allowed length\r\n * @returns text or text with ellipsis\r\n */\r\nexport const truncateFileNamePreservingExtension = (fileName: string, maxLength: number = 60) => {\r\n\tif (!fileName)\r\n\t\treturn \"\";\r\n\r\n\tif (fileName.length <= maxLength)\r\n\t\treturn fileName;\r\n\r\n\t// find extension\r\n\tlet index = fileName.lastIndexOf('.');\r\n\r\n\t// no extension, cut right to length\r\n\tif (index < 0) {\r\n\t\treturn fileName.substring(0, maxLength) + \"...\";\r\n\t}\r\n\r\n\t// try shift cutting position to keep some text immediately before the extension\r\n\tif (index > 12) {\r\n\t\tindex = index - 6;\r\n\t}\r\n\t\r\n\t// with extension, cut in the middle\r\n\treturn fileName.substring(0, Math.min(maxLength - (fileName.length - index), index - 1)) + \"...\" + fileName.substring(index);\r\n};\r\n\r\n/**\r\n * Truncates the text at the specified position and appends the suffix. When suffixLengthMatters, maxLength applies to the final string.\r\n * Falls back to a hard truncation at maxLength if it's not possible to truncate on a word.\r\n * \r\n * Samples:\r\n * \ttruncateOnWord(\"This isatest!\", 5, \" \", \"...\", true)\r\n * = \"Th...\"\r\n * \r\n * \ttruncateOnWord(\"This isatest!\", 5, \" \", \"...\", true)\r\n * = \"This\"\r\n * \r\n * \ttruncateOnWord(\"This isatest!\", 5, \" \", \"...\", false)\r\n * = \"This...\"\r\n * \r\n * @param text The text to truncate\r\n * @param maxLength Max length of the truncated string\r\n * @param separator Separators for words to consider. Usually \" \".\r\n * @param suffix Any suffix to add to indicate truncation\r\n * @param suffixLengthMatters The suffix counts towards the max length\r\n */\r\nexport function truncateOnWord(text: string, maxLength: number, separator: string = \" \", suffix: string = \"...\", suffixLengthMatters: boolean = true) {\r\n\tconst s = text || \"\";\r\n\tconst max = maxLength || 0;\r\n\r\n\tif (max <= 0 || s.length <= max) {\r\n\t\treturn s;\r\n\t}\r\n\r\n\tconst suffixedMax = suffixLengthMatters ? max - suffix.length : max;\r\n\tif (suffixedMax < 0) {\r\n\t\treturn s.slice(0, max);\r\n\t}\r\n\r\n\tconst trunc = (length: number) => {\r\n\t\tconst index = s.lastIndexOf(separator, length);\r\n\t\tif (index > -1) {\r\n\t\t\treturn s.slice(0, index) + suffix;\r\n\t\t}\r\n\r\n\t\treturn undefined;\r\n\t};\r\n\r\n\tlet v = trunc(max);\r\n\tif (v && v.length > max) {\r\n\t\tv = trunc(suffixedMax);\r\n\t}\r\n\r\n\t//Fallback to truncate with ellipsis with word break if needed.\r\n\treturn v || s.slice(0, suffixedMax) + suffix;\r\n}\r\n\r\n/**\r\n * Generates the correct pluralized string based on a definition and a given count.\r\n * If the given count isn't found, the next definition in the approaching zero direction will be used.\r\n * If the count is empty then the \"empty\" definition will be used.\r\n * @example 10 will move down to 9, -5 will move up to -4.\r\n * @param count the value for the pluralized definition to search for\r\n * @param list list of pluralized definitions\r\n */\r\nexport const pluralize = (count: number, list: IPluralizeDefinitions): string => {\r\n\r\n\tif (count == null)\r\n\t\treturn list.empty || null;\r\n\r\n\tif (list[count] !== undefined)\r\n\t\treturn list[count];\r\n\r\n\tconst keys = Object.getOwnPropertyNames(list).map(x => +x).filter(x => !isNaN(x));\r\n\tconst ordered = [count, ...keys].sort((a, b) => a - b);\r\n\tconst keyIndex = ordered.indexOf(count) - (count >= 0 ? 1 : -1);\r\n\r\n\treturn keyIndex >= 0 ? list[ordered[keyIndex]] : null;\r\n}\r\n\r\ntype DateRangeX = {\r\n\tstartDate?: string;\r\n\tstartDateX?: string;\r\n\tstartDateXDeletedOnDate?: Date;\r\n\tstopDate?: string;\r\n\tstopDateX?: string;\r\n\tstopDateXDeletedOnDate?: Date;\r\n};\r\n\r\nexport const divideDates = (obj: DateRangeX, divider = \"-\"): string => {\r\n\tif (obj.startDate && obj.stopDate)\r\n\t\treturn `${obj.startDate} ${divider} ${obj.stopDate}`;\r\n\r\n\tif (obj.startDateX && obj.stopDateX && !obj.startDateXDeletedOnDate && !obj.stopDateXDeletedOnDate)\r\n\t\treturn `${obj.startDateX} ${divider} ${obj.stopDateX}`;\r\n\r\n\tif (obj.startDate && obj.stopDateX && !obj.stopDateXDeletedOnDate)\r\n\t\treturn `${obj.startDate} ${divider} ${obj.stopDateX}`;\r\n\r\n\tif (obj.startDateX && obj.stopDate && !obj.startDateXDeletedOnDate)\r\n\t\treturn `${obj.startDateX} ${divider} ${obj.stopDate}`;\r\n\r\n\tif (obj.startDate)\r\n\t\treturn obj.startDate;\r\n\r\n\tif (obj.startDateX && !obj.startDateXDeletedOnDate)\r\n\t\treturn obj.startDateX;\r\n\r\n\treturn \"\";\r\n};\r\n\r\nexport const capitalizeFirstLetter = (value: string, remainderToLower: boolean = false) =>\r\n\tvalue.charAt(0).toUpperCase() + (remainderToLower ? value.slice(1).toLowerCase() : value.slice(1));\r\n\r\nconst isUpper = (c: string) => c != null && c.length === 1 && c === c.toUpperCase() && c !== c.toLowerCase();\r\nconst isLower = (c: string) => c != null && c.length === 1 && c === c.toLowerCase() && c !== c.toUpperCase();\r\nconst isDigit = (c: string) => c != null && c.length === 1 && \"1234567890\".indexOf(c) >= 0;\r\n\r\nexport const splitCamelCase = (source: string, trim: boolean = true, capitalizeFirst = true): string => {\r\n\tlet sb = \"\";\r\n\tlet delimiter = \" \";\r\n\tlet text = source || \"\";\r\n\r\n\tfor (let i = 0; i < text.length; i++) {\r\n\t\tlet c = text[i];\r\n\r\n\t\t//Insert delimiter if needed\r\n\t\tif (i > 0) {\r\n\t\t\tlet lastIsLower = isLower(text[i - 1]);\r\n\t\t\tif (isUpper(c)) {\r\n\t\t\t\tlet lastIsDigit = isDigit(text[i - 1]);\r\n\t\t\t\tif (i + 1 < text.length) {\r\n\t\t\t\t\tlet nextIsUpper = isUpper(text[i + 1]);\r\n\t\t\t\t\tif (!nextIsUpper)\r\n\t\t\t\t\t\tsb += delimiter;\r\n\r\n\t\t\t\t\telse if (lastIsLower || lastIsDigit)\r\n\t\t\t\t\t\tsb += delimiter;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (lastIsLower)\r\n\t\t\t\t\t\tsb += delimiter;\r\n\t\t\t\t}\r\n\t\t\t} else if (isDigit(c)) {\r\n\t\t\t\tlet lastIsUpper = isUpper(text[i - 1]);\r\n\t\t\t\tif (i + 1 < text.length) {\r\n\t\t\t\t\tlet nextIsDigit = isDigit(text[i + 1]);\r\n\t\t\t\t\tif (!nextIsDigit)\r\n\t\t\t\t\t\tsb += delimiter;\r\n\r\n\t\t\t\t\telse if (lastIsLower || lastIsUpper)\r\n\t\t\t\t\t\tsb += delimiter;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tif (lastIsLower)\r\n\t\t\t\t\t\tsb += delimiter;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tsb += c;\r\n\t}\r\n\r\n\tif (capitalizeFirst) {\r\n\t\tsb = capitalizeFirstLetter(sb);\r\n\t}\r\n\treturn trim ? sb.trim() : sb;\r\n};\r\n\r\n\r\n/**\r\n * Transform base64 string to byte array\r\n * @param data \r\n */\r\n export const base64ToArrayBuffer = (data) => {\r\n\tlet binaryString = window.atob(data);\r\n\tlet binaryLen = binaryString.length;\r\n\tlet bytes = new Uint8Array(binaryLen);\r\n\tfor (let i = 0; i < binaryLen; i++) {\r\n\t\tlet ascii = binaryString.charCodeAt(i);\r\n\t\tbytes[i] = ascii;\r\n\t}\r\n\treturn bytes;\r\n}\r\n","import * as React from \"react\";\r\nimport { AddFilterBaseFunc, IFilterKeys, IFilters, IPlotData, RemoveFilterBaseFunc } from \"models/core\";\r\nimport { PlotData } from \"plotly.js\";\r\nimport { CircularProgress, Dialog, Grid } from \"@mui/material\";\r\nimport { addFilterFactory } from \"helpers/filterHelper\";\r\nimport { DashChart } from \"components/common/DashChart\";\r\nimport { ChartIcons } from \"components/common/ChartIcons\";\r\nimport { SimpleBreadcrumb } from \"components/common/SimpleBreadcrumb\";\r\nimport watermark from \"../static/qca-black.png\";\r\nimport { CreateChart } from \"components/common/CreateChart\";\r\nimport { PrimarySiteHierarchy } from \"models/mdt/plotdata\";\r\nimport { AppContext } from \"AppContext\";\r\nimport { Person } from \"@mui/icons-material\";\r\n\r\nexport function chartDimesionsCalc(chartHeightProportion: number, parentColNumber?: number, tabColNumber?: number) {\r\n\r\n\tconst parentColNumberP = 12 / parentColNumber;\r\n\tconst tabColNumberP = (12 / tabColNumber) * parentColNumberP || 2;\r\n\r\n\treturn {\r\n\t\t//paperHeight: Math.round(window.innerWidth > 991 ? (window.innerHeight-230)/(100/chartHeightProportion) : (window.innerHeight-230)/(100/chartHeightProportion)*2 ),\r\n\t\tpaperHeight: (window.innerWidth > 991 ? 400 : 800),\r\n\t\tpaperWidth: Math.round((window.innerWidth > 991 ? window.innerWidth / (tabColNumberP * 1.2) : (window.innerWidth - 100) * 0.85)),\r\n\t\tchartWidth: Math.round((window.innerWidth > 991 ? window.innerWidth / (tabColNumberP * 1.2) * 0.97 : (window.innerWidth - 100) * 0.75)),\r\n\t\t//chartHeight: Math.round(window.innerWidth > 991 ? ((window.innerHeight-230)/(100/chartHeightProportion))*0.8 : ((window.innerHeight-230)/(100/chartHeightProportion))*0.8*2),\r\n\t\tchartHeight: (window.innerWidth > 991 ? 330 : 550),\r\n\t\tmiddleChart: Math.round(((window.innerHeight - 230) / (100 / chartHeightProportion)) / 2.5),\r\n\t\t//middleChartText: Math.round(window.innerWidth > 991 ? ((window.innerHeight-230)/(100/chartHeightProportion))/8 : ((window.innerHeight-230)/(100/chartHeightProportion))/2),\r\n\t\tmiddleChartText: (window.innerWidth > 991 ? 130 : 300),\r\n\t\tfullScreenPaperHeight: Math.round(window.innerHeight - 300),\r\n\t\tfullScreenChartHeight: Math.round((window.innerHeight - 300) * 0.85),\r\n\t\tfullScreenChartWidth: Math.round((window.innerWidth - 100) * 0.8),\r\n\t\tfullScreenTextSize: Math.round(window.innerWidth > 991 ? (window.innerWidth) / 80 : 15),\r\n\t\ttextSize: Math.round(window.innerWidth > 991 ? (window.innerWidth) / 120 : 15)\r\n\t};\r\n}\r\n\r\n\r\ntype Pd =\r\n\tPrimarySiteHierarchy.IHierarchyPlotData\r\n\t| IPlotData[];\r\n\r\ninterface IProps {\r\n\tplotData: T;\r\n\tactiveFilters: IFilters;\r\n\taddFilterFn: AddFilterBaseFunc;\r\n\tremoveFilterFn: RemoveFilterBaseFunc;\r\n\tdefaultChartType: ChartType;\r\n\tdefaultChartOrientation: ChartOrientation;\r\n\tfilterKey: string;\r\n\tchartTitle: string;\r\n\tchartOrder: IChartOrder;\r\n\txAxis: IChartAxis;\r\n\tyAxis: IChartAxis;\r\n\thoverText: string;\r\n\thovertextFn?: (values: number[]) => string[];\r\n\ttextFn?: (values: number[]) => string[];\r\n\tfilterFn?: (chartType: ChartType, chartOrientation: ChartOrientation) => Function;\r\n\tclipOnAxis?: boolean;\r\n\r\n\t// optional props\r\n\tchartDimensions?: IChartDimensions;\r\n\tcalculateRangeOnPlotDataIndex?: number;\r\n\tchartIcons?: IChartIcons;\r\n\tdebug?: boolean;\r\n\tsummary?: JSX.Element;\r\n\tlegend?: (chartType: ChartType) => JSX.Element;\r\n\tsortUnknownToEnd?: boolean;\r\n\tbreadcrumb?: JSX.Element;\r\n\tmsgWhenHidden?: string;\r\n\thoverTextAlt?: string[];\r\n\thovertemplate?: string;\r\n}\r\n\r\ninterface IChartIcons {\r\n\tverticalBar?: boolean;\r\n\thorizontalBar?: boolean;\r\n\ttable?: boolean;\r\n\tline?: boolean;\r\n\tpie?: boolean;\r\n\tperson?: boolean;\r\n\tdownloadAsCsv?: boolean;\r\n\tdownloadAsPng?: boolean;\r\n\tfullScreen?: boolean;\r\n\thelp?: string[];\r\n}\r\n\r\ninterface IChartDimensions {\r\n\tchartHeightProportion: number;\r\n\tparentColNumber?: number;\r\n\ttabColNumber?: number;\r\n}\r\n\r\ninterface IChartAxis {\r\n\r\n\tverticalOrientation: {\r\n\t\tlabel: string;\r\n\t\tstyle?: Partial\r\n\t};\r\n\thorizontalOrientation: {\r\n\t\tlabel: string;\r\n\t\tstyle?: Partial\r\n\t};\r\n}\r\n\r\ninterface IChartOrder {\r\n\tverticalOrientation: {\r\n\t\treversed: boolean;\r\n\t};\r\n\thorizontalOrientation: {\r\n\t\treversed: boolean;\r\n\t}\r\n\r\n}\r\n\r\nconst getLabelOrder = (co: ChartOrientation, chartOrder: IChartOrder, labels: string[]) => {\r\n\tswitch (co) {\r\n\t\tcase ChartOrientation.Horizontal:\r\n\t\t\tif (chartOrder.horizontalOrientation.reversed) {\r\n\t\t\t\treturn labels.slice().reverse();\r\n\t\t\t} else {\r\n\t\t\t\treturn labels;\r\n\t\t\t}\r\n\r\n\r\n\t\tcase ChartOrientation.Vertical:\r\n\t\t\tif (chartOrder.verticalOrientation.reversed) {\r\n\t\t\t\treturn labels.slice().reverse();\r\n\t\t\t} else {\r\n\t\t\t\treturn labels;\r\n\t\t\t}\r\n\t}\r\n}\r\nconst getValueOrder = (co: ChartOrientation, chartOrder: IChartOrder, values: number[]) => {\r\n\tswitch (co) {\r\n\t\tcase ChartOrientation.Horizontal:\r\n\t\t\tif (chartOrder.horizontalOrientation.reversed) {\r\n\t\t\t\treturn values.slice().reverse();\r\n\t\t\t} else {\r\n\t\t\t\treturn values;\r\n\t\t\t}\r\n\r\n\r\n\t\tcase ChartOrientation.Vertical:\r\n\t\t\tif (chartOrder.verticalOrientation.reversed) {\r\n\t\t\t\treturn values.slice().reverse();\r\n\t\t\t} else {\r\n\t\t\t\treturn values;\r\n\t\t\t}\r\n\t}\r\n}\r\n\r\n\r\nconst getAxisLabel = (co: ChartOrientation, axis: IChartAxis) => {\r\n\tswitch (co) {\r\n\t\tcase ChartOrientation.Horizontal:\r\n\t\t\treturn axis.horizontalOrientation.label;\r\n\r\n\t\tdefault:\r\n\t\t\treturn axis.verticalOrientation.label;\r\n\t}\r\n}\r\n\r\n\r\nexport enum ChartType {\r\n\tBar,\r\n\tPie,\r\n\tTable,\r\n\tLine,\r\n\tPerson\r\n}\r\n\r\nconst getChartType = (ct: ChartType) => {\r\n\tswitch (ct) {\r\n\t\tcase ChartType.Bar:\r\n\t\t\treturn \"bar\";\r\n\t\tcase ChartType.Pie:\r\n\t\t\treturn \"pie\";\r\n\t\tcase ChartType.Table:\r\n\t\t\treturn \"table\";\r\n\t\tcase ChartType.Line:\r\n\t\t\treturn \"scatter\"\r\n\t\tcase ChartType.Person:\r\n\t\t\treturn \"person\"\r\n\t\tdefault:\r\n\t\t\treturn \"bar\";\r\n\t}\r\n}\r\n\r\nconst toChartType = (ct: string) => {\r\n\tswitch (ct) {\r\n\t\tcase \"pie\":\r\n\t\t\treturn ChartType.Pie;\r\n\t\tcase \"bar\":\r\n\t\t\treturn ChartType.Bar;\r\n\t\tcase \"table\":\r\n\t\t\treturn ChartType.Table;\r\n\t\tcase \"scatter\":\r\n\t\t\treturn ChartType.Line;\r\n\t\tcase \"person\":\r\n\t\t\treturn ChartType.Person;\r\n\t\tdefault:\r\n\t\t\treturn ChartType.Bar;\r\n\r\n\t}\r\n}\r\n\r\nexport enum ChartOrientation {\r\n\tHorizontal,\r\n\tVertical\r\n}\r\n\r\nconst toChartOrientation = (co: string) => {\r\n\tswitch (co) {\r\n\t\tcase \"h\":\r\n\t\t\treturn ChartOrientation.Horizontal;\r\n\r\n\t\tcase \"v\":\r\n\t\t\treturn ChartOrientation.Vertical\r\n\r\n\t\tdefault:\r\n\t\t\treturn ChartOrientation.Horizontal;\r\n\t}\r\n}\r\n\r\nconst getChartOrientation = (co: ChartOrientation) => {\r\n\tswitch (co) {\r\n\t\tcase ChartOrientation.Horizontal:\r\n\t\t\treturn \"h\";\r\n\t\tcase ChartOrientation.Vertical:\r\n\t\t\treturn \"v\";\r\n\t\tdefault:\r\n\t\t\treturn \"v\";\r\n\t}\r\n}\r\n\r\nexport const textTemplate = (chartType: ChartType, chartOrientation: ChartOrientation) => {\r\n\tlet result = \"%{text}\";\r\n\r\n\tif (chartType == ChartType.Pie)\r\n\t\tresult = result + \"
%{label}\";\r\n\r\n\treturn result;\r\n}\r\n\r\nexport const UNKNOWN_TERMS = [\r\n\t\"Unk\",\r\n\t\"Unknown\",\r\n\t\"Not Determined\",\r\n\t\"No Treatment/Unk\",\r\n\t\"No Tx/Unk\",\r\n\t\"Had no treatment\",\r\n\t\"undefined\"\r\n];\r\n\r\nexport const text = (chartType: ChartType, chartOrientation: ChartOrientation, values: number[]): string[] => {\r\n\tif (chartType == ChartType.Line)\r\n\t\treturn values.map(a => `${a}%`)\r\n\r\n\tconst d = values.reduce((a, b) => (a || 0) + (b || 0), 0);\r\n\r\n\tif (isNaN(d)) {\r\n\t\treturn []\r\n\t}\r\n\r\n\tlet result = values.map(x => {\r\n\t\tif (x == undefined || d == undefined)\r\n\t\t\treturn `0 (0%)`;\r\n\r\n\t\tif (d == 0)\r\n\t\t\treturn `${x} (0%)`;\r\n\r\n\t\tconst c = (x / d * 100);\r\n\r\n\t\tif (isNaN(c))\r\n\t\t\treturn `${x} (${d})`\r\n\r\n\t\t//Add line for pie to put % in its own line \r\n\t\tif (chartType == ChartType.Pie)\r\n\t\t\treturn `${x}
(${c.toFixed(1)}%)`\r\n\r\n\t\treturn `${x} (${c.toFixed(1)}%)`\r\n\t});\r\n\r\n\treturn result;\r\n}\r\n\r\nexport const SortUnknownToEnd = (plotData: IPlotData): IPlotData => {\r\n\tconst unkIndex = plotData.labels.findIndex(a => UNKNOWN_TERMS.indexOf(a) > -1);\r\n\r\n\tif (unkIndex == -1)\r\n\t\treturn plotData;\r\n\r\n\tconst unkLabel = plotData.labels[unkIndex];\r\n\tconst unkValue = plotData.values[unkIndex];\r\n\r\n\tplotData.values.splice(unkIndex, 1)\r\n\tplotData.labels.splice(unkIndex, 1);\r\n\r\n\tplotData.values.unshift(unkValue);\r\n\tplotData.labels.unshift(unkLabel);\r\n\r\n\treturn {\r\n\t\tvalues: plotData.values,\r\n\t\tlabels: plotData.labels,\r\n\t\tname: plotData.name\r\n\t};\r\n}\r\n\r\nexport const QoolDashChart = (props: IProps) => {\r\n\tconst [chartType, setChartType] = React.useState(props.defaultChartType);\r\n\tconst [chartOrientation, setChartOrientation] = React.useState(props.defaultChartOrientation);\r\n\tconst [fullScreenOpen, setFullScreenOpen] = React.useState(false);\r\n\r\n\tconst { state, dispatch } = React.useContext(AppContext);\r\n\r\n\tconst { textFn, plotData, activeFilters, addFilterFn, removeFilterFn, filterKey, chartTitle, xAxis, yAxis, chartOrder, chartDimensions, hoverText } = props;\r\n\r\n\tlet breadcrumb = null;\r\n\tif (props.breadcrumb) {\r\n\t\tbreadcrumb = props.breadcrumb\r\n\t} else {\r\n\t\tbreadcrumb = \r\n\t}\r\n\r\n\tconst chartStyle = { padding: 0, margin: 10, height: \"100%\", minHeight: 500 };\r\n\tconst centerChartContentStyle = { display: \"flex\" as const, alignItems: \"center\" as const, justifyContent: \"center\" as const, textAlign: \"center\" as const };\r\n\r\n\tconst dimensions = chartDimesionsCalc(chartDimensions?.chartHeightProportion ?? 50, chartDimensions?.parentColNumber ?? 12, chartDimensions?.tabColNumber ?? 3);\r\n\r\n\r\n\tif (state.page.computing) {\r\n\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t\r\n\t\t\t\t\t
\r\n\t\t\t\t\t{props.legend && props.legend(chartType)}\r\n\t\t\t\t
\r\n\t\t\t
\r\n\t\t);\r\n\t}\r\n\r\n\r\n\tconst pdIndex =\r\n\t\tprops.calculateRangeOnPlotDataIndex && plotData.length > props.calculateRangeOnPlotDataIndex\r\n\t\t\t? props.calculateRangeOnPlotDataIndex\r\n\t\t\t: 0;\r\n\r\n\tconst filterFn =\r\n\t\tprops.filterFn && props.filterFn(chartType, chartOrientation) ||\r\n\t\taddFilterFactory(addFilterFn, filterKey,\r\n\t\t\t(chartType == ChartType.Pie\r\n\t\t\t\t? p => p.data.labels[p.pointNumber].toString()\r\n\t\t\t\t: chartOrientation == ChartOrientation.Horizontal\r\n\t\t\t\t\t? p => p.y.toString()\r\n\t\t\t\t\t: p => p.x.toString()\r\n\t\t\t))\r\n\r\n\tconst traces: Partial[] = [];\r\n\tconst logo = watermark;\r\n\r\n\tconst chartData = {\r\n\t\torientiation: getChartOrientation(chartOrientation),\r\n\t\txLabel: getAxisLabel(chartOrientation, xAxis),\r\n\t\tyLabel: getAxisLabel(chartOrientation, yAxis),\r\n\t\ttype: getChartType(chartType),\r\n\t\tchartHeight: fullScreenOpen ? dimensions.fullScreenChartHeight : dimensions.chartHeight,\r\n\t\tchartWidth: fullScreenOpen ? dimensions.fullScreenChartWidth : dimensions.chartWidth,\r\n\t\tpaperHeight: fullScreenOpen ? dimensions.fullScreenPaperHeight : dimensions.paperHeight,\r\n\t\tpaperWidth: fullScreenOpen ? dimensions.fullScreenChartWidth : dimensions.paperWidth,\r\n\t\ttextSize: fullScreenOpen ? dimensions.fullScreenTextSize : dimensions.textSize,\r\n\t\tgetValues: (v: number[]) => getValueOrder(chartOrientation, chartOrder, v),\r\n\t\tgetLabels: (l: string[]) => getLabelOrder(chartOrientation, chartOrder, l),\r\n\r\n\t};\r\n\r\n\r\n\tconst labels = chartData.getLabels(plotData[pdIndex].labels);\r\n\r\n\t(plotData || []).forEach((a: IPlotData) => {\r\n\t\tlet data: IPlotData = a;\r\n\t\tif (props.sortUnknownToEnd) {\r\n\t\t\tdata = SortUnknownToEnd(a);\r\n\t\t}\r\n\r\n\r\n\t\tconst values = chartData.getValues(data.values);\r\n\r\n\r\n\r\n\t\tif (chartType == ChartType.Pie) {\r\n\t\t\ttraces.push({\r\n\t\t\t\tvalues: values,\r\n\t\t\t\tname: data.name,\r\n\t\t\t\tlabels: labels,\r\n\t\t\t\ttext: textFn && textFn(values) || text(chartType, chartOrientation, values),\r\n\t\t\t\ttexttemplate: textTemplate(chartType, chartOrientation),\r\n\t\t\t\thoverinfo: \"none\",\r\n\t\t\t\thole: 0.6,\r\n\t\t\t\ttype: chartData.type,\r\n\t\t\t\tshowlegend: false,\r\n\t\t\t\tdirection: \"clockwise\",\r\n\t\t\t\tinsidetextorientation: \"horizontal\",\r\n\t\t\t\ttextposition: \"auto\",\r\n\t\t\t\tcliponaxis: props.clipOnAxis != undefined ? props.clipOnAxis : false,\r\n\t\t\t\tmarker: {},\r\n\t\t\t\tsort: false,\r\n\t\t\t} as Partial)\r\n\t\t}\r\n\t\telse if (chartOrientation == ChartOrientation.Vertical) {\r\n\t\t\ttraces.push({\r\n\t\t\t\tx: labels,\r\n\t\t\t\ty: values,\r\n\t\t\t\tname: data.name,\r\n\t\t\t\tshowlegend: false,\r\n\t\t\t\ttext: textFn && textFn(values) || text(chartType, chartOrientation, values),\r\n\t\t\t\ttexttemplate: textTemplate(chartType, chartOrientation),\r\n\t\t\t\ttextposition: \"top center\",\r\n\t\t\t\tcliponaxis: props.clipOnAxis != undefined ? props.clipOnAxis : false,\r\n\t\t\t\ttextfont: {\r\n\t\t\t\t\tsize: 12,\r\n\t\t\t\t},\r\n\t\t\t\thovertext: props.hoverTextAlt || labels,\r\n\t\t\t\thovertemplate: props.hovertemplate || `%{hovertext}
${hoverText}: %{text}
`,\r\n\t\t\t\ttype: chartData.type,\r\n\t\t\t\torientation: chartData.orientiation,\r\n\t\t\t\tmarker: {},\r\n\r\n\t\t\t} as Partial)\r\n\t\t}\r\n\t\telse if (chartOrientation == ChartOrientation.Horizontal) {\r\n\t\t\ttraces.push({\r\n\t\t\t\tx: values,\r\n\t\t\t\ty: labels,\r\n\t\t\t\tname: data.name,\r\n\t\t\t\tshowlegend: false,\r\n\t\t\t\ttext: textFn && textFn(values) || text(chartType, chartOrientation, values),\r\n\t\t\t\ttexttemplate: textTemplate(chartType, chartOrientation),\r\n\t\t\t\ttextposition: \"top center\",\r\n\t\t\t\tcliponaxis: props.clipOnAxis != undefined ? props.clipOnAxis : false,\r\n\t\t\t\ttextfont: {\r\n\t\t\t\t\tsize: 12,\r\n\t\t\t\t},\r\n\t\t\t\thovertext: props.hoverTextAlt || labels,\r\n\t\t\t\thovertemplate: props.hovertemplate || `%{hovertext}
${hoverText}: %{text}
`,\r\n\t\t\t\ttype: chartData.type,\r\n\t\t\t\torientation: chartData.orientiation,\r\n\t\t\t\tmarker: {},\r\n\r\n\t\t\t} as Partial)\r\n\t\t}\r\n\t});\r\n\r\n\r\n\r\n\r\n\tlet layout: Partial = {\r\n\r\n\t}\r\n\r\n\tif (yAxis.horizontalOrientation.style && ChartOrientation.Horizontal == chartOrientation) {\r\n\t\tlayout.yaxis = Object.assign({}, layout.yaxis, yAxis.horizontalOrientation.style)\r\n\t}\r\n\r\n\tif (yAxis.verticalOrientation.style && ChartOrientation.Vertical == chartOrientation) {\r\n\t\tlayout.yaxis = Object.assign({}, layout.yaxis, yAxis.verticalOrientation.style)\r\n\t}\r\n\r\n\tif (xAxis.horizontalOrientation.style && ChartOrientation.Horizontal == chartOrientation) {\r\n\t\tlayout.xaxis = Object.assign({}, layout.xaxis, xAxis.horizontalOrientation.style)\r\n\t}\r\n\r\n\tif (xAxis.verticalOrientation.style && ChartOrientation.Vertical == chartOrientation) {\r\n\t\tlayout.xaxis = Object.assign({}, layout.xaxis, xAxis.verticalOrientation.style)\r\n\t}\r\n\r\n\tif (chartType == ChartType.Pie) {\r\n\t\tlayout.margin = { l: 60, r: 60, b: 40, t: 40, pad: 2 };\r\n\t}\r\n\r\n\tconst showChart = plotData[pdIndex].values.length > 0;\r\n\r\n\tconst chart = (width: number) =>\r\n\t\tCreateChart(chartData.chartHeight,\r\n\t\t\twidth,\r\n\t\t\tchartData.paperHeight,\r\n\t\t\tchartData.orientiation,\r\n\t\t\tchartData.type,\r\n\t\t\tshowChart,\r\n\t\t\tchartData.xLabel,\r\n\t\t\tchartData.yLabel,\r\n\t\t\tplotData[pdIndex].labels,\r\n\t\t\tplotData[pdIndex].values,\r\n\t\t\ttraces,\r\n\t\t\tfilterFn,\r\n\t\t\tlayout,\r\n\t\t\tprops.debug);\r\n\r\n\r\n\tconst chartIcons =\r\n\t\t setChartOrientation(toChartOrientation(a))}\r\n\t\t\tsetChartType={(a: string) => setChartType(toChartType(a))}\r\n\t\t\tsetFullScreen={setFullScreenOpen}\r\n\t\t\tcurrentFilters={activeFilters}\r\n\t\t/>\r\n\r\n\r\n\r\n\tlet chartGrid = null;\r\n\tif (props.summary) {\r\n\t\tchartGrid = (\r\n\t\t\t\r\n\t\t\t\t{props.summary}\r\n\t\t\t\t{chart(chartData.chartWidth * 0.7)}\r\n\t\t\t\r\n\t\t)\r\n\t} else {\r\n\t\tchartGrid = (\r\n\t\t\t\r\n\t\t\t\t{chart(chartData.chartWidth)}\r\n\t\t\t\r\n\t\t)\r\n\t}\r\n\r\n\tif (fullScreenOpen) {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t
\r\n\t\t\t\t\t\t{chartIcons}\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t{\"Cancer}\r\n\t\t\t\t\t
\r\n\t\t\t\t\t
\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t{chartGrid}\r\n\t\t\t\t\t\t\t
{props.legend && props.legend(chartType)}
\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t\r\n\t\t);\r\n\t}\r\n\r\n\treturn (\r\n\t\t
\r\n\t\t\t
\r\n\t\t\t\t{chartIcons}\r\n\t\t\t
\r\n\t\t\t\r\n\t\t\t\t{\r\n\t\t\t\t\t
\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t{chartGrid}\r\n\r\n\t\t\t\t\t\t\t
{props.legend && props.legend(chartType)}
\r\n\r\n\t\t\t\t\t\t\t{!showChart && props.msgWhenHidden &&\r\n\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\t\t{props.msgWhenHidden}\r\n\t\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t
\r\n\t\t\t\t}\r\n\t\t\t
\r\n\t\t
\r\n\t);\r\n\r\n}\r\n\r\n\r\n","import React, { useState } from \"react\";\r\nimport Plot from \"react-plotly.js\";\r\n\r\nimport { AddFilterBaseFunc, chartAttrs, defaultConfig, defaultStyles, graphColors, IFilterKeys, IFilters, RemoveFilterBaseFunc } from \"models/core\";\r\nimport { AddFilterFunc, RemoveFilterFunc, DashboardFilterKeys } from \"models/mdt\";\r\nimport { DiagnosesByService, PatientsByService, ReviewsByService } from \"models/mdt/plotdata\";\r\nimport { PlotData, PlotType } from \"plotly.js\";\r\nimport { Dialog } from \"@mui/material\";\r\nimport { LabelSharp } from \"@mui/icons-material\";\r\nimport { addFilterFactory } from \"helpers/filterHelper\";\r\nimport { HierarchyBreadcrumb } from \"components/common/HierarchyBreadcrumb\";\r\nimport { DashTable } from \"components/common/DashTable\";\r\nimport { DashChart } from \"components/common/DashChart\";\r\nimport { ChartIcons } from \"components/common/ChartIcons\";\r\nimport { SimpleBreadcrumb } from \"components/common/SimpleBreadcrumb\";\r\nimport { chartDimesionsCalc, ChartOrientation, ChartType, QoolDashChart } from \"../core\";\r\nimport watermark from \"../../static/qca-black.png\";\r\nimport { truncateStringWithEllipsis } from \"helpers/stringHelper\";\r\nimport { CreateChart } from \"components/common/CreateChart\";\r\nimport { HHSLabel } from \"config/appUrlConfig\";\r\n\r\ninterface IProps {\r\n\tplotDataReviews: ReviewsByService.IPlotData;\r\n\tplotDataPatients: PatientsByService.IPlotData;\r\n\tplotDataDiagnoses: DiagnosesByService.IPlotData;\r\n\tactiveFilters: IFilters;\r\n\t//addFilterFn: (e: any, filterKey: string, getY: (p) => string) => void;\r\n\taddFilterFn: AddFilterBaseFunc;\r\n\tremoveFilterFn: RemoveFilterBaseFunc;\r\n}\r\n\r\n/**\r\n * Reviews by service chart / My MDTs\r\n */\r\nexport function ReviewsByServiceChart(props: IProps) {\r\n\r\n\tconst { plotDataReviews, plotDataPatients, plotDataDiagnoses, activeFilters, addFilterFn, removeFilterFn } = props;\r\n\tconst hierarchy = plotDataReviews;\r\n\r\n\tlet valuesROriginal = [];\r\n\tlet labelsROriginal = [];\r\n\tlet valuesPOriginal = [];\r\n\tlet labelsPOriginal = [];\r\n\tlet valuesDOriginal = [];\r\n\tlet labelsDOriginal = [];\r\n\r\n\tlet valuesRReversed = [];\r\n\tlet labelsRReversed = [];\r\n\tlet valuesPReversed = [];\r\n\tlet labelsPReversed = [];\r\n\tlet valuesDReversed = [];\r\n\tlet labelsDReversed = [];\r\n\r\n\tlet Reviews = {};\r\n\tlet Patients = {};\r\n\tlet Diagnoses = {};\r\n\r\n\r\n\tvaluesROriginal = hierarchy.values;\r\n\tlabelsROriginal = hierarchy.labels;\r\n\tvaluesRReversed = hierarchy.values.slice().reverse();\r\n\tlabelsRReversed = hierarchy.labels.slice().reverse();\r\n\tReviews = { \"name\": \"Presentations\", \"labels\": labelsROriginal, \"labelsReversed\": labelsRReversed, \"values\": valuesROriginal, \"valuesReversed\": valuesRReversed };\r\n\r\n\tvaluesPOriginal = plotDataPatients.values;\r\n\tlabelsPOriginal = plotDataPatients.labels;\r\n\tvaluesPReversed = plotDataPatients.values.slice().reverse();\r\n\tlabelsPReversed = plotDataPatients.labels.slice().reverse();\r\n\tPatients = { \"name\": \"Patients\", \"labels\": labelsPOriginal, \"labelsReversed\": labelsPReversed, \"values\": valuesPOriginal, \"valuesReversed\": valuesPReversed };\r\n\r\n\tvaluesDOriginal = plotDataDiagnoses.values;\r\n\tlabelsDOriginal = plotDataDiagnoses.labels;\r\n\tvaluesDReversed = plotDataDiagnoses.values.slice().reverse();\r\n\tlabelsDReversed = plotDataDiagnoses.labels.slice().reverse();\r\n\tDiagnoses = { \"name\": \"Diagnoses\", \"labels\": labelsDOriginal, \"labelsReversed\": labelsDReversed, \"values\": valuesDOriginal, \"valuesReversed\": valuesDReversed };\r\n\r\n\tconst tracesArray: any[] = [];\r\n\r\n\ttracesArray.push(Patients);\r\n\ttracesArray.push(Diagnoses);\r\n\ttracesArray.push(Reviews);\t\r\n\r\n\tconst legend = (chartType: ChartType) => {\r\n\t\tif (chartType == ChartType.Table)\r\n\t\t\treturn null;\r\n\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t\t\t
\r\n\t\t\t\t\t
Patients
\r\n\t\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t\t\t
\r\n\t\t\t\t\t
Diagnoses
\r\n\t\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t\t\t
\r\n\t\t\t\t\t
Presentations
\r\n\t\t\t\t
\r\n\t\t\t
\r\n\t\t)\r\n\t}\r\n\r\n\t//Text for info icon on hover\r\n\tconst toolTipText = [\"Patients:\", \"A unique count of a patient presented to a MDT\",\r\n\t\t\"Diagnoses:\", \"A unique count of a patient's diagnoses presented to a MDT\",\r\n\t\t\"Presentations:\", \"A count of patient presentations to MDT where a patient can present multiple times\",\r\n\t\t\"\", \"Records excluded from analysis are those in which a diagnosis has not been selected at time of referral\"\r\n\t];\r\n\r\n\r\n\treturn (\r\n\t\t\r\n\t)\r\n\r\n\r\n}\r\n","import React from \"react\";\r\n//import { DASH_PATH_DELIMITER_UI, FilterContext, AddFilterBaseFunc, RemoveFilterBaseFunc } from \"models/dashboard/core\";\r\nimport { IHierarchyPlotData } from \"models/core/hierarchy\";\r\nimport { AddFilterBaseFunc, DASH_PATH_DELIMITER_UI, FilterContext, RemoveFilterBaseFunc } from \"models/core/filter\";\r\n\r\ninterface IProps {\r\n data: IHierarchyPlotData;\r\n filterKey: string;\r\n addFilter: AddFilterBaseFunc;\r\n removeFilter: RemoveFilterBaseFunc;\r\n}\r\n\r\n/**\r\n * Component to display the path of the current hierarchy position.\r\n * Supports navigation and filtering back up the hierarchy.\r\n */\r\nexport class HierarchyBreadcrumb extends React.Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n }\r\n\r\n /**\r\n * \r\n * @param p Value \r\n * @param partIndex \r\n */\r\n private addHierarchyFilterFactory = (p: string, partIndex: number) => {\r\n const { data, filterKey, addFilter } = this.props;\r\n const { path } = data;\r\n\r\n const context = path && FilterContext.fromPath(path) || new FilterContext();\r\n const ancestor = context.ancestor(partIndex + 1) || new FilterContext();\r\n\r\n return addFilter(filterKey, [p], ancestor);\r\n }\r\n\r\n render = () => {\r\n const { data, filterKey, removeFilter } = this.props;\r\n const context = FilterContext.fromPath(data.path);\r\n const parts = context.parts;\r\n const valuesLabel = context.valuesLabel().replace(`[`, ``).replace(`]`, ``);\r\n\r\n if (data && data.path) {\r\n return (\r\n
\r\n removeFilter(filterKey)}>All / \r\n {parts.map((p, i) => {\r\n if (i !== parts.length - 1) {\r\n return this.addHierarchyFilterFactory(p, i)} >{p}{DASH_PATH_DELIMITER_UI};\r\n } else {\r\n return {valuesLabel};\r\n }\r\n })}\r\n
\r\n );\r\n }\r\n\r\n return (
 
);\r\n }\r\n}","import React, { useState } from \"react\";\r\nimport Plot from \"react-plotly.js\";\r\n\r\nimport { AddFilterBaseFunc, chartAttrs, defaultConfig, defaultStyles, graphColors, IFilterKeys, IFilters, RemoveFilterBaseFunc } from \"models/core\";\r\nimport { DashboardFilterKeys } from \"models/mdt\";\r\nimport { ReviewsByPeriodHierarchy, PatientsByPeriodHierarchy, DiagnosesByPeriodHierarchy } from \"models/mdt/plotdata\";\r\nimport { PlotData, PlotType } from \"plotly.js\";\r\nimport { Dialog, Grid } from \"@mui/material\";\r\nimport { addHierarchyFilterFactory } from \"helpers/filterHelper\";\r\nimport { HierarchyBreadcrumb } from \"components/common/HierarchyBreadcrumb\";\r\nimport { DashTable } from \"components/common/DashTable\";\r\nimport { DashChart } from \"components/common/DashChart\";\r\nimport { ChartIcons } from \"components/common/ChartIcons\";\r\nimport { chartDimesionsCalc, ChartOrientation, ChartType, QoolDashChart } from \"../core\";\r\nimport watermark from \"../../static/qca-black.png\";\r\nimport { CreateChart } from \"components/common/CreateChart\";\r\n\r\ninterface IProps {\r\n\tplotDataReviews: ReviewsByPeriodHierarchy.IHierarchyPlotData;\r\n\tplotDataPatients: PatientsByPeriodHierarchy.IHierarchyPlotData;\r\n\tplotDataDiagnoses: DiagnosesByPeriodHierarchy.IHierarchyPlotData;\r\n\tactiveFilters: IFilters;\r\n\t//addFilterFn: (e: any, filterKey: string, getY: (p) => string) => void;\r\n\taddFilterFn: AddFilterBaseFunc;\r\n\tremoveFilterFn: RemoveFilterBaseFunc;\r\n\tnoProfileCount: number;\r\n}\r\n\r\n/**\r\n * Reviews by service chart / My MDTs\r\n */\r\nexport function MDTActivityTrendChart(props: IProps) {\r\n\tconst { plotDataReviews, plotDataPatients, plotDataDiagnoses, activeFilters, addFilterFn, removeFilterFn } = props;\r\n\tconst hierarchy = plotDataReviews;\r\n\r\n\tlet valuesROriginal = [];\r\n\tlet labelsROriginal = [];\r\n\tlet valuesPOriginal = [];\r\n\tlet labelsPOriginal = [];\r\n\tlet valuesDOriginal = [];\r\n\tlet labelsDOriginal = [];\r\n\r\n\tlet valuesRReversed = [];\r\n\tlet labelsRReversed = [];\r\n\tlet valuesPReversed = [];\r\n\tlet labelsPReversed = [];\r\n\tlet valuesDReversed = [];\r\n\tlet labelsDReversed = [];\r\n\r\n\tlet Reviews = {};\r\n\tlet Patients = {};\r\n\tlet Diagnoses = {};\r\n\r\n\t\r\n\tvaluesROriginal = hierarchy.values;\r\n\tlabelsROriginal = hierarchy.labels;\r\n\tvaluesRReversed = hierarchy.values.slice().reverse();\r\n\tlabelsRReversed = hierarchy.labels.slice().reverse();\r\n\tReviews = { \"name\": \"Presentations\", \"labels\": labelsROriginal, \"labelsReversed\": labelsRReversed, \"values\": valuesROriginal, \"valuesReversed\": valuesRReversed };\r\n\r\n\tvaluesPOriginal = plotDataPatients.values;\r\n\tlabelsPOriginal = plotDataPatients.labels;\r\n\tvaluesPReversed = plotDataPatients.values.slice().reverse();\r\n\tlabelsPReversed = plotDataPatients.labels.slice().reverse();\r\n\tPatients = { \"name\": \"Patients\", \"labels\": labelsPOriginal, \"labelsReversed\": labelsPReversed, \"values\": valuesPOriginal, \"valuesReversed\": valuesPReversed };\r\n\r\n\tvaluesDOriginal = plotDataDiagnoses.values;\r\n\tlabelsDOriginal = plotDataDiagnoses.labels;\r\n\tvaluesDReversed = plotDataDiagnoses.values.slice().reverse();\r\n\tlabelsDReversed = plotDataDiagnoses.labels.slice().reverse();\r\n\tDiagnoses = { \"name\": \"Diagnoses\", \"labels\": labelsDOriginal, \"labelsReversed\": labelsDReversed, \"values\": valuesDOriginal, \"valuesReversed\": valuesDReversed };\r\n\r\n\tconst tracesArray: any[] = [];\r\n\r\n\ttracesArray.push(Patients);\r\n\ttracesArray.push(Diagnoses);\r\n\ttracesArray.push(Reviews);\t\r\n\r\n\r\n\t//Create Summary box\r\n\tconst presentations = valuesROriginal.reduce((a, b) => a + b, 0);\r\n\tconst diagnoses = valuesDOriginal.reduce((a, b) => a + b, 0);\r\n\tconst patients = valuesPOriginal.reduce((a, b) => a + b, 0);\r\n\tconst representationRate = ((presentations - diagnoses) / diagnoses * 100).toFixed(1);\r\n\r\n\tconst box = (): JSX.Element => {\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t{patients.toLocaleString()}\r\n\t\t\t\t\t
\r\n\t\t\t\t\t{diagnoses.toLocaleString()}\r\n\t\t\t\t\t
\r\n\t\t\t\t\t{presentations.toLocaleString()}\r\n\t\t\t\t\t
\r\n\t\t\t\t\t{representationRate}%\r\n\t\t\t\t\t
\r\n\t\t\t\t\t{props.noProfileCount}\r\n\t\t\t\t
\r\n\t\t\t\t\r\n\t\t\t\t\tPatients\r\n\t\t\t\t\t
\r\n\t\t\t\t\tDiagnoses\r\n\t\t\t\t\t
\r\n\t\t\t\t\tPresentations\r\n\t\t\t\t\t
\r\n\t\t\t\t\tRepresentation rate\r\n\t\t\t\t\t
\r\n\t\t\t\t\tRecords excluded from data analysis\r\n\t\t\t\t
\r\n\t\t\t
\r\n\t\t)\r\n\t}\r\n\r\n\t//Text for info icon on hover\r\n\tconst toolTipText = [\"Patients:\", \"A unique count of a patient presented to a MDT\",\r\n\t\t\"Diagnoses:\", \"A unique count of a patient's diagnoses presented to a MDT\",\r\n\t\t\"Presentations:\", \"A count of patient presentations to MDT where a patient can present multiple times\",\r\n\t\t\"Representation rate:\", \"The rate at which a patient is presented to an individual MDT more than once for a given diagnosis. n=Patients presented to MDT, N=Presentations to MDT\",\r\n\t\t\"\", \"Records excluded from analysis are those in which a diagnosis has not been selected at time of referral\"\r\n\t];\r\n\r\n\r\n\tconst legend = (chartType: ChartType): JSX.Element => {\r\n\r\n\t\tif (chartType == ChartType.Table)\r\n\t\t\treturn null;\r\n\r\n\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t\t\t
\r\n\t\t\t\t\t
Patients
\r\n\t\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t\t\t
\r\n\t\t\t\t\t
Diagnoses
\r\n\t\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t\t\t
\r\n\t\t\t\t\t
Presentations
\r\n\t\t\t\t
\r\n\t\t\t\t\r\n\t\t\t
\r\n\r\n\t\t)\r\n\t}\r\n\r\n\tconst filterFn = (chartType: ChartType, chartOrientation: ChartOrientation) => \r\n\t\taddHierarchyFilterFactory(props.addFilterFn, DashboardFilterKeys.Year.key, hierarchy, (chartType == ChartType.Pie ? p => p.data.labels[p.pointNumber].toString() : (chartOrientation == ChartOrientation.Horizontal ? p => p.y.toString() : p => p.x.toString()))); \r\n\r\n\r\n\tconst breadcrumb = (\r\n\t\t\r\n\t\t);\r\n\r\n\r\n\treturn (\r\n\t\t v.map(String)} \r\n\t\t\tbreadcrumb={breadcrumb}\r\n\t\t\tchartIcons={{\r\n\t\t\t\tpie: false,\r\n\t\t\t\tverticalBar: false,\r\n\t\t\t\thorizontalBar: false,\r\n\t\t\t\thelp: toolTipText\r\n\t\t\t}}\r\n\t\t\tchartDimensions={{\r\n\t\t\t\tchartHeightProportion: 50,\r\n\t\t\t\tparentColNumber: 12,\r\n\t\t\t\ttabColNumber: 4\r\n\t\t\t}}\r\n\t\t\tsummary={box()}\r\n\t\t\tlegend={legend}\r\n\t\t/>\r\n\t)\r\n}\r\n","import React from \"react\";\r\n\r\nimport { AddFilterBaseFunc, IFilterKeys, IFilters, RemoveFilterBaseFunc } from \"models/core\";\r\nimport { DashboardFilterKeys } from \"models/mdt\";\r\nimport { PrimarySiteHierarchy } from \"models/mdt/plotdata\";\r\nimport { ChartOrientation, ChartType, QoolDashChart } from \"../core\";\r\nimport { addHierarchyFilterFactory } from \"helpers/filterHelper\";\r\nimport { HierarchyBreadcrumb } from \"components/common/HierarchyBreadcrumb\";\r\n\r\ninterface IProps {\r\n\tplotData: PrimarySiteHierarchy.IHierarchyPlotData;\r\n\tactiveFilters: IFilters;\r\n\taddFilterFn: AddFilterBaseFunc;\r\n removeFilterFn: RemoveFilterBaseFunc;\r\n}\r\n\r\n\r\nexport function PatientsBySiteChart(props: IProps) {\r\n\r\n\tconst filterFn = (chartType: ChartType, chartOrientation: ChartOrientation) => \r\n\t\taddHierarchyFilterFactory(props.addFilterFn, DashboardFilterKeys.PrimarySite.key, props.plotData, (chartType == ChartType.Pie ? p => p.data.labels[p.pointNumber].toString() : (chartOrientation == ChartOrientation.Horizontal ? p => p.y.toString() : p => p.x.toString()))); \r\n\r\n\treturn (\r\n\t\t}\r\n\t\t\tactiveFilters={props.activeFilters}\r\n\t\t\tfilterFn={filterFn}\r\n\t\t\taddFilterFn={props.addFilterFn}\r\n\t\t\tremoveFilterFn={props.removeFilterFn}\r\n\t\t\thoverText=\"Diagnoses\"\r\n\t\t\tsortUnknownToEnd={true}\r\n\t\t\tchartIcons={{\r\n\t\t\t\tline: false\r\n\t\t\t}}\r\n\t\t\tchartDimensions={{\r\n\t\t\t\tchartHeightProportion: 50,\r\n\t\t\t\tparentColNumber: 12,\r\n\t\t\t\ttabColNumber: 4\r\n\t\t\t}}\r\n\t\t/>\r\n\t)\r\n\r\n}\r\n","import React, { useState } from \"react\";\r\nimport Plot from \"react-plotly.js\";\r\n\r\nimport { AddFilterBaseFunc, chartAttrs, defaultConfig, defaultStyles, IFilterKeys, IFilters, RemoveFilterBaseFunc } from \"models/core\";\r\nimport { DashboardFilterKeys } from \"models/mdt\";\r\nimport { Morphology } from \"models/mdt/plotdata\";\r\nimport { PlotData } from \"plotly.js\";\r\nimport { Dialog } from \"@mui/material\";\r\nimport { addFilterFactory } from \"helpers/filterHelper\";\r\nimport { DashTable } from \"components/common/DashTable\";\r\nimport { DashChart } from \"components/common/DashChart\";\r\nimport { ChartIcons } from \"components/common/ChartIcons\";\r\nimport { SimpleBreadcrumb } from \"components/common/SimpleBreadcrumb\";\r\nimport { truncateStringWithEllipsis } from \"helpers/stringHelper\";\r\nimport { chartDimesionsCalc, ChartOrientation, ChartType, QoolDashChart } from \"../core\";\r\nimport watermark from \"../../static/qca-black.png\";\r\nimport { CreateChart } from \"components/common/CreateChart\";\r\nimport { defText, defTextTemplate } from \"defaults\";\r\n\r\ninterface IProps {\r\n\tplotData: Morphology.IPlotData;\r\n\tactiveFilters: IFilters;\r\n\taddFilterFn: AddFilterBaseFunc;\r\n removeFilterFn: RemoveFilterBaseFunc;\r\n}\r\n\r\n/**\r\n * Reviews by service chart / My MDTs\r\n */\r\nexport function PatientsByMorphChart(props: IProps) {\r\n\r\n\treturn (\r\n\t\t\r\n\t)\r\n\r\n}\r\n","import React, { useState } from \"react\";\r\n\r\nimport { AddFilterBaseFunc, IFilterKeys, IFilters, RemoveFilterBaseFunc } from \"models/core\";\r\nimport { DashboardFilterKeys } from \"models/mdt\";\r\nimport { HhsResidenceGroup } from \"models/mdt/plotdata\";\r\nimport { PlotData } from \"plotly.js\";\r\nimport { Dialog } from \"@mui/material\";\r\nimport { addFilterFactory } from \"helpers/filterHelper\";\r\nimport { DashChart } from \"components/common/DashChart\";\r\nimport { ChartIcons } from \"components/common/ChartIcons\";\r\nimport { SimpleBreadcrumb } from \"components/common/SimpleBreadcrumb\";\r\nimport { chartDimesionsCalc, ChartOrientation, ChartType, QoolDashChart } from \"../core\";\r\nimport watermark from \"../../static/qca-black.png\";\r\nimport { CreateChart } from \"components/common/CreateChart\";\r\nimport { defText, defTextTemplate } from \"defaults\";\r\nimport { HHSLabel } from \"config/appUrlConfig\";\r\n\r\ninterface IProps {\r\n\tplotData: HhsResidenceGroup.IPlotData;\r\n\tactiveFilters: IFilters;\r\n\taddFilterFn: AddFilterBaseFunc;\r\n removeFilterFn: RemoveFilterBaseFunc;\r\n}\r\n\r\n/**\r\n * Reviews by service chart / My MDTs\r\n */\r\nexport function HHSResidenceGroupPieChart(props: IProps) {\r\n\r\n\treturn (\r\n\t\t\r\n\t)\r\n}\r\n","import React from \"react\";\r\n\r\nimport { AddFilterBaseFunc, IFilterKeys, IFilters, IPlotData, RemoveFilterBaseFunc } from \"models/core\";\r\nimport { DashboardFilterKeys } from \"models/mdt\";\r\nimport { ChartOrientation, ChartType, QoolDashChart } from \"../core\";\r\n\r\ninterface IProps {\r\n\tplotData: IPlotData;\r\n\tactiveFilters: IFilters;\r\n\taddFilterFn: AddFilterBaseFunc;\r\n removeFilterFn: RemoveFilterBaseFunc;\r\n}\r\n\r\nexport function TumourStageChart(props: IProps) {\r\n\r\n\treturn (\r\n\t\t\r\n\t)\r\n}\r\n","import React from \"react\";\r\n\r\nimport { AddFilterBaseFunc, IFilterKeys, IFilters, IPlotData, RemoveFilterBaseFunc } from \"models/core\";\r\nimport { DashboardFilterKeys } from \"models/mdt\";\r\nimport { ChartOrientation, ChartType, QoolDashChart } from \"../core\";\r\n\r\ninterface IProps {\r\n\tplotData: IPlotData;\r\n\tactiveFilters: IFilters;\r\n\taddFilterFn: AddFilterBaseFunc;\r\n removeFilterFn: RemoveFilterBaseFunc;\r\n}\r\n\r\nexport function AgeAtDiagnosisChart(props: IProps) {\r\n\r\n\treturn (\r\n\t\t\r\n\t)\r\n\r\n}\r\n","import React from \"react\";\r\n\r\nimport { AddFilterBaseFunc, IFilterKeys, IFilters, IPlotData, RemoveFilterBaseFunc } from \"models/core\";\r\nimport { DashboardFilterKeys } from \"models/mdt\";\r\nimport { ChartOrientation, ChartType, QoolDashChart } from \"../core\";\r\n\r\ninterface IProps {\r\n\tplotData: IPlotData;\r\n\tactiveFilters: IFilters;\r\n\taddFilterFn: AddFilterBaseFunc;\r\n removeFilterFn: RemoveFilterBaseFunc;\r\n}\r\n\r\nexport function SexChart(props: IProps) {\r\n\r\n\treturn (\r\n\t\t\r\n\t)\r\n\r\n}\r\n","import React, { useState } from \"react\";\r\n\r\nimport { AddFilterBaseFunc, IFilterKeys, IFilters, IPlotData, RemoveFilterBaseFunc } from \"models/core\";\r\nimport { DashboardFilterKeys } from \"models/mdt\";\r\nimport { PlotData } from \"plotly.js\";\r\nimport { Dialog } from \"@mui/material\";\r\nimport { addFilterFactory } from \"helpers/filterHelper\";\r\nimport { DashChart } from \"components/common/DashChart\";\r\nimport { ChartIcons } from \"components/common/ChartIcons\";\r\nimport { SimpleBreadcrumb } from \"components/common/SimpleBreadcrumb\";\r\nimport { chartDimesionsCalc, ChartOrientation, ChartType, QoolDashChart } from \"../core\";\r\nimport watermark from \"../../static/qca-black.png\";\r\nimport { CreateChart } from \"components/common/CreateChart\";\r\nimport { defText, defTextTemplate } from \"defaults\";\r\n\r\ninterface IProps {\r\n\tplotData: IPlotData;\r\n\tactiveFilters: IFilters;\r\n\taddFilterFn: AddFilterBaseFunc;\r\n removeFilterFn: RemoveFilterBaseFunc;\r\n}\r\n\r\n/**\r\n * Reviews by service chart / My MDTs\r\n */\r\nexport function ECOGChart(props: IProps) {\r\n\r\n\treturn (\r\n\t\t\r\n\t)\r\n\r\n}\r\n","import React, { useState } from \"react\";\r\n\r\nimport { AddFilterBaseFunc, IFilterKeys, IFilters, IPlotData, RemoveFilterBaseFunc } from \"models/core\";\r\nimport { DashboardFilterKeys } from \"models/mdt\";\r\nimport { PlotData } from \"plotly.js\";\r\nimport { Dialog } from \"@mui/material\";\r\nimport { addFilterFactory } from \"helpers/filterHelper\";\r\nimport { DashChart } from \"components/common/DashChart\";\r\nimport { ChartIcons } from \"components/common/ChartIcons\";\r\nimport { SimpleBreadcrumb } from \"components/common/SimpleBreadcrumb\";\r\nimport { chartDimesionsCalc, ChartOrientation, ChartType, QoolDashChart } from \"../core\";\r\nimport watermark from \"../../static/qca-black.png\";\r\nimport { CreateChart } from \"components/common/CreateChart\";\r\nimport { defText, defTextTemplate } from \"defaults\";\r\n\r\ninterface IProps {\r\n\tplotData: IPlotData;\r\n\tactiveFilters: IFilters;\r\n\taddFilterFn: AddFilterBaseFunc;\r\n removeFilterFn: RemoveFilterBaseFunc;\r\n}\r\n\r\n/**\r\n * Comorbidities Chart\r\n */\r\nexport function ComorbiditiesChart(props: IProps) {\r\n\treturn (\r\n\t\t\r\n\t);\r\n}\r\n","import React from \"react\";\r\n\r\nimport { AddFilterBaseFunc, IFilterKeys, IFilters, IPlotData, RemoveFilterBaseFunc } from \"models/core\";\r\nimport { DashboardFilterKeys } from \"models/mdt\";\r\nimport { ChartOrientation, ChartType, QoolDashChart } from \"../core\";\r\n\r\ninterface IProps {\r\n\tplotData: IPlotData;\r\n\tactiveFilters: IFilters;\r\n\taddFilterFn: AddFilterBaseFunc;\r\n removeFilterFn: RemoveFilterBaseFunc;\r\n}\r\n\r\nexport function FirstNationsStatusChart(props: IProps) {\r\n\treturn (\r\n\t\t\r\n\t)\r\n}\r\n","import React from \"react\";\r\n\r\nimport { AddFilterBaseFunc, IFilterKeys, IFilters, IPlotData, RemoveFilterBaseFunc } from \"models/core\";\r\nimport { DashboardFilterKeys } from \"models/mdt\";\r\nimport { ChartOrientation, ChartType, QoolDashChart } from \"../core\";\r\n\r\ninterface IProps {\r\n\tplotData: IPlotData;\r\n\tactiveFilters: IFilters;\r\n\taddFilterFn: AddFilterBaseFunc;\r\n removeFilterFn: RemoveFilterBaseFunc;\r\n}\r\n\r\nexport function SESChart(props: IProps) {\r\n\r\n\treturn (\r\n\t\t\r\n\t)\r\n}\r\n","import React from \"react\";\r\n\r\nimport { AddFilterBaseFunc, IFilterKeys, IFilters, IPlotData, RemoveFilterBaseFunc } from \"models/core\";\r\nimport { DashboardFilterKeys } from \"models/mdt\";\r\nimport { ChartOrientation, ChartType, QoolDashChart } from \"../core\";\r\n\r\ninterface IProps {\r\n\tplotData: IPlotData;\r\n\tactiveFilters: IFilters;\r\n\taddFilterFn: AddFilterBaseFunc;\r\n removeFilterFn: RemoveFilterBaseFunc;\r\n}\r\n\r\nexport function RemotenessChart(props: IProps) {\r\n\treturn (\r\n\t\t\r\n\t)\r\n}\r\n","import React from \"react\";\r\n\r\nimport { AddFilterBaseFunc, IFilterKeys, IFilters, RemoveFilterBaseFunc } from \"models/core\";\r\nimport { DashboardFilterKeys } from \"models/mdt\";\r\nimport { DataQualityByIndicator } from \"models/mdt/plotdata\";\r\nimport { percentValue, toFixed } from \"helpers/filterHelper\";\r\nimport { ChartOrientation, ChartType, QoolDashChart } from \"../core\";\r\n\r\ninterface IProps {\r\n\tplotData: DataQualityByIndicator.IPlotData;\r\n\tactiveFilters: IFilters;\r\n\taddFilterFn: AddFilterBaseFunc;\r\n removeFilterFn: RemoveFilterBaseFunc;\r\n}\r\n\r\n/**\r\n * Reviews by service chart / My MDTs\r\n */\r\nexport function DataQualityByIndicatorChart(props: IProps) {\r\n\tconst { plotData } = props;\r\n\tconst data = plotData;\r\n\r\n\tconst labels = [];\r\n\tconst valuesYes = [];\r\n\tconst valuesNo = [];\r\n\tconst denominators = {};\r\n\r\n\t//Process data for those with and without complete data \r\n\tfor (let i = 0; i < data.labels.length; i++) {\r\n\t\tconst key = data.labels[i].substring(0, data.labels[i].length - 1);\r\n\t\tconst value = data.values[i] || 0;\r\n\t\tif (i % 2 === 0) {\r\n\t\t\tlabels.push(key);\r\n\t\t\tvaluesYes.push(value);\r\n\t\t} else {\r\n\t\t\tvaluesNo.push(value);\r\n\t\t}\r\n\t\tif (denominators[key] === undefined) {\r\n\t\t\tdenominators[key] = 0;\r\n\t\t}\r\n\t\tdenominators[key] += value;\r\n\t}\r\n\r\n\t//Compute and format the values + hovertext\r\n\tconst mapIntoPercent = (p, i) => percentValue(p || 0, denominators[labels[i]]);\r\n\tconst percentsYes = valuesYes.map(mapIntoPercent);\r\n\r\n\tconst percentYesData = {\"name\": \"Complete\", \"labels\": labels, \"values\": percentsYes};\r\n\r\n\tconst tracesArray: any[] = [];\r\n\ttracesArray.push(percentYesData);\r\n\r\n\treturn (\r\n\t\t null} // not filtering triggers\r\n\t\t\ttextFn={(v: number[]) => v.map(p => { return toFixed(p, 0) + \"%\"; })}\r\n\t\t/>\r\n\t)\r\n\r\n}\r\n","import React from \"react\";\r\n\r\nimport { AddFilterBaseFunc, graphColors, IDimMDT, IFilterKeys, IFilters, IPlotData, RemoveFilterBaseFunc } from \"models/core\";\r\nimport { DashboardFilterKeys } from \"models/mdt\";\r\nimport { DataQualityByPeriod } from \"models/mdt/plotdata\";\r\nimport { ChartOrientation, ChartType, QoolDashChart } from \"../core\";\r\nimport { StateLabel } from \"config/appUrlConfig\";\r\nimport { HierarchyBreadcrumb } from \"components/common/HierarchyBreadcrumb\";\r\nimport { addHierarchyFilterFactory } from \"helpers/filterHelper\";\r\n\r\ninterface IProps {\r\n\tplotData: DataQualityByPeriod.IHierarchyPlotData;\r\n\tplotDataFacility: { [facilityYearKey: string]: number };\r\n\tplotDataState: { [facilityYearKey: string]: number };\r\n\tmdtFacilityRef: IDimMDT[];\r\n\tactiveFilters: IFilters;\r\n\taddFilterFn: AddFilterBaseFunc;\r\n\tremoveFilterFn: RemoveFilterBaseFunc;\r\n}\r\n\r\n/**\r\n * Reviews by service chart / My MDTs\r\n */\r\nexport function DataQualityByPeriodChart(props: IProps) {\r\n\tconst { plotData, plotDataFacility, plotDataState, mdtFacilityRef, activeFilters } = props;\r\n\tconst hierarchy = plotData;\r\n\tconst { labels } = hierarchy;\r\n\tconst values = hierarchy.values.map(p => p.sum === 0 ? 0 : Math.round((p.sumYes / p.sum) * 100));\r\n\r\n\t//Filter the plotDataFacility & plotDataQLD with the current facility+year filters\r\n\t//Get the currently filtered MDT name \r\n\tconst mdtName = activeFilters?.Mdt?.value[0]\r\n\r\n\tlet facilityDQComparisons: IPlotData = { labels: [], values: [] };\r\n\tlet stateDQComparisons: IPlotData = { labels: [], values: [] };\r\n\r\n\t//Qld line can always be showen if there is a matching label\r\n\t//Use Facility ID 4 which is The Prince Charles Hospital and reliably in each year \r\n\r\n\t/*\r\n\t\tTODO: my facility and state-wide comparisons only\r\n\t\twork across years as the table only supports diagnosis year\r\n\t\t-- Table: qool.DimDataQualityComparisons\r\n\t*/\r\n\r\n\tlabels.forEach(a => {\r\n\t\tif (plotDataState[a + '4']) {\r\n\t\t\tstateDQComparisons.labels.push(a)\r\n\t\t\tstateDQComparisons.values.push(Math.round(plotDataState[a + '4']))\r\n\t\t}\r\n\t})\r\n\r\n\tif (activeFilters?.Mdt?.value.length == 1) {\r\n\t\t//Using MDT name, get the relevant facility \r\n\t\tlet facilityId = mdtFacilityRef.find(x => x.nameAndFacility == mdtName)?.facilityId;\r\n\t\t//Using the label (year) and relevant facility, get the qld and facility values. \r\n\t\t//Note if the hierarchy is at a different level other than year, these don't match so just the My MDT line shows \r\n\t\tlabels.forEach(a => {\r\n\t\t\tif (plotDataState[a + facilityId]) {\r\n\t\t\t\tfacilityDQComparisons.labels.push(a)\r\n\t\t\t\tfacilityDQComparisons.values.push(Math.round(plotDataFacility[a + facilityId]))\r\n\t\t\t}\r\n\t\t})\r\n\t}\r\n\r\n\t//Create the individual values/labels sets for each trace\r\n\tconst valuesMDT = values;\r\n\tconst labelsMDT = labels;\r\n\tconst mdt = { \"name\": \"My MDT(s)\", \"labels\": labelsMDT, \"values\": valuesMDT };\r\n\r\n\tconst valuesFacility = facilityDQComparisons?.values;\r\n\tconst labelsFacility = facilityDQComparisons?.labels;\r\n\tconst facility = { \"name\": \"My Facility\", \"labels\": labelsFacility, \"values\": valuesFacility };\r\n\r\n\tconst valuesState = stateDQComparisons?.values;\r\n\tconst labelsState = stateDQComparisons?.labels;\r\n\r\n\tconst state = {\r\n\t\tname: StateLabel,\r\n\t\tlabels: labelsState,\r\n\t\tvalues: valuesState\r\n\t};\r\n\r\n\tconst tracesArray: IPlotData[] = [];\r\n\ttracesArray.push(mdt);\r\n\r\n\tif (state.values.length > 0) {\r\n\t\ttracesArray.push(state);\r\n\t}\r\n\r\n\tif (facility.values.length > 0) {\r\n\t\ttracesArray.push(facility);\r\n\t}\r\n\r\n\tconst legend = (chartType: ChartType): JSX.Element => {\r\n\r\n\t\tif (chartType == ChartType.Table)\r\n\t\t\treturn null;\r\n\r\n\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t\t\t
\r\n\t\t\t\t\t
My MDT
\r\n\t\t\t\t
\r\n\t\t\t\t{state.values.length > 0 &&
\r\n\t\t\t\t\t
\r\n\t\t\t\t\t
{StateLabel}
\r\n\t\t\t\t
}\r\n\t\t\t\t{facility.values.length > 0 &&
\r\n\t\t\t\t\t
\r\n\t\t\t\t\t
My Facility
\r\n\t\t\t\t
}\r\n\t\t\t
\r\n\r\n\t\t)\r\n\t}\r\n\r\n\tconst filterFn = (chartType: ChartType, chartOrientation: ChartOrientation) => \r\n\t\taddHierarchyFilterFactory(props.addFilterFn, DashboardFilterKeys.Year.key, props.plotData, (chartType == ChartType.Pie ? p => p.data.labels[p.pointNumber].toString() : (chartOrientation == ChartOrientation.Horizontal ? p => p.y.toString() : p => p.x.toString()))); \r\n\r\n\r\n\t\r\n\treturn (\r\n\t\t}\r\n\t\t\taddFilterFn={props.addFilterFn}\r\n\t\t\tfilterFn={filterFn}\r\n\t\t\tremoveFilterFn={props.removeFilterFn}\r\n\t\t\thoverText=\"%{fullData.name}\"\t\t\t\r\n\t\t\tchartIcons={{\r\n\t\t\t\tpie: false,\r\n\t\t\t\tverticalBar: false,\r\n\t\t\t\thorizontalBar: false,\r\n\t\t\t}}\r\n\t\t\tchartDimensions={{\r\n\t\t\t\tchartHeightProportion: 50,\r\n\t\t\t\tparentColNumber: 12,\r\n\t\t\t\ttabColNumber: 6\r\n\t\t\t}}\r\n\t\t\ttextFn={(v) => v.map(p => p + \"%\")}\r\n\t\t\tlegend={legend}\r\n\t\t/>\r\n\t)\r\n\r\n\r\n}\r\n","import React from \"react\";\r\nimport { Chip } from \"@mui/material\";\r\n\r\ninterface IProps {\r\n removeFilterFn?: (filterName:string, filterValue:string) => void;\r\n filterId?:string;\r\n filterName?: string;\r\n filterValue?: string;\r\n filterParent?: string;\r\n}\r\n\r\n// const styles = {\r\n// chip: {\r\n// marginRight: 10,\r\n// maxWidth: \"100%\",\r\n// },\r\n// };\r\n\r\nexport function DashChip(props: IProps) {\r\n const { filterName, filterValue, removeFilterFn, filterId, filterParent } = props;\r\n\r\n let title = (filterParent ? filterName + \": \" + filterParent + \" - \" + filterValue : filterName + \": \" + filterValue);\r\n // if(filterValue)\r\n // title += `: ${filterValue}`;\r\n\r\n return removeFilterFn && removeFilterFn(filterId, filterValue)}\r\n label={title}\r\n title={title}\r\n // style={styles.chip}\r\n />;\r\n}","import React from \"react\";\r\nimport { AddFilterBaseFunc, graphColors, IDimMDT, IFilterKeys, IFilters, IPlotData, RemoveFilterBaseFunc } from \"models/core\";\r\nimport { DashboardFilterKeys } from \"models/mdt\";\r\nimport { ChartOrientation, ChartType, QoolDashChart } from \"../core\";\r\n\r\n\r\ninterface IProps {\r\n\tplotData: { [mdtDiagYearKey: string]: { \"MDT\": number, \"State\": number } };\r\n\tmdtFacilityRef: IDimMDT[];\r\n\tactiveFilters: IFilters;\r\n\taddFilterFn: AddFilterBaseFunc;\r\n\tremoveFilterFn: RemoveFilterBaseFunc;\r\n\r\n\tmdtName: string;\r\n\tcancerName: string;\r\n}\r\n\r\n/**\r\n * Reviews by service chart / My MDTs\r\n */\r\nexport function OneYearSurvivalChart(props: IProps) {\r\n\tconst { plotData, mdtFacilityRef, cancerName } = props;\r\n\r\n\tconst labels = [\"2011-2013\", \"2014-2016\", \"2017-2019\", \"2020-2022\"];\r\n\r\n\tconst survivalYears = 1;\r\n\r\n\r\n\tlet mdtSurvival: IPlotData = { labels: [], values: [] };\r\n\tlet stateSurvival: IPlotData = { labels: [], values: [] };\r\n\r\n\r\n\tlet mdtId = mdtFacilityRef.find(x => x.nameAndFacility == props.mdtName)?.mdtNameId;\r\n\r\n\t\r\n\r\n\r\n\tlabels.forEach(a => {\r\n\r\n\t\tif (plotData[mdtId + a + survivalYears + cancerName]) {\r\n\t\t\tmdtSurvival.labels.push(a)\r\n\t\t\tif (plotData[mdtId + a + survivalYears + cancerName].MDT == -1) {\r\n\t\t\t\tmdtSurvival.values.push(1)\r\n\t\t\t} else {\r\n\t\t\t\tmdtSurvival.values.push(plotData[mdtId + a + survivalYears + cancerName].MDT)\r\n\t\t\t}\r\n\t\t\tstateSurvival.labels.push(a)\r\n\t\t\tstateSurvival.values.push(plotData[mdtId + a + survivalYears + cancerName].State)\r\n\t\t}\r\n\t})\r\n\r\n\r\n\tconst valuesMDT = mdtSurvival.values;\r\n\tconst labelsMDT = mdtSurvival.labels;\r\n\tconst mdt = { \"name\": \"My MDT\", \"labels\": labelsMDT, \"values\": valuesMDT };\r\n\r\n\tconst valuesState = stateSurvival.values;\r\n\tconst labelsState = stateSurvival.labels;\r\n\tconst state = { \"name\": \"Queensland\", \"labels\": labelsState, \"values\": valuesState };\r\n\r\n\tconst tracesArray: any[] = [];\r\n\ttracesArray.push(mdt);\r\n\ttracesArray.push(state);\r\n\r\n\tconst legend = (chartType: ChartType): JSX.Element => {\r\n\r\n\t\tif (chartType == ChartType.Table)\r\n\t\t\treturn null;\r\n\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t\t\t
\r\n\t\t\t\t\t
My MDT
\r\n\t\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t\t\t
\r\n\t\t\t\t\t
Queensland
\r\n\t\t\t\t
\r\n\t\t\t
\r\n\r\n\t\t)\r\n\t}\r\n\r\n\r\n\treturn (\r\n\t\t v.map(p => (p == 1 ? \"NA\" : p.toString() + \"%\"))}\r\n\t\t\tbreadcrumb={null}\r\n\t\t\tchartIcons={{\r\n\t\t\t\tpie: false,\r\n\t\t\t\tline: false,\r\n\t\t\t\thelp: [\"Overall survival describes the proportion of people still alive after a specified time from their diagnosis.\",\r\n\t\t\t\t\t\t\"\",\r\n\t\t\t\t\t\t\"All causes of death are considered.\", \r\n\t\t\t\t\t\t\"\", \r\n\t\t\t\t\t\t\"Note: Survival Rate = NA\",\r\n\t\t\t\t\t\t\"When there is less than 10 patients we do not calculate survival.\",\r\n\t\t\t\t\t\t\"Survival rates of 100% may indicate low patient numbers.\"]\r\n\t\t\t}}\r\n\t\t\tchartDimensions={{\r\n\t\t\t\tchartHeightProportion: 50,\r\n\t\t\t\tparentColNumber: 12,\r\n\t\t\t\ttabColNumber: 4\r\n\t\t\t}}\r\n\t\t\tlegend={legend}\r\n\t\t\tmsgWhenHidden={\"Please select a single MDT and Cancer to generate data\"}\r\n\t\t/>\r\n\t)\r\n\r\n}\r\n","import React from \"react\";\r\nimport { AddFilterBaseFunc, graphColors, IDimMDT, IFilterKeys, IFilters, IPlotData, RemoveFilterBaseFunc } from \"models/core\";\r\nimport { DashboardFilterKeys } from \"models/mdt\";\r\nimport { ChartOrientation, ChartType, QoolDashChart } from \"../core\";\r\n\r\ninterface IProps {\r\n\tplotData: { [mdtDiagYearKey: string]: { \"MDT\": number, \"State\": number } };\r\n\tmdtFacilityRef: IDimMDT[];\r\n\tactiveFilters: IFilters;\r\n\taddFilterFn: AddFilterBaseFunc;\r\n\tremoveFilterFn: RemoveFilterBaseFunc;\r\n\tmdtName: string;\r\n\tcancerName: string;\r\n}\r\n\r\n/**\r\n * Reviews by service chart / My MDTs\r\n */\r\nexport function ThreeYearSurvivalChart(props: IProps) {\r\n\tconst { plotData, mdtFacilityRef, activeFilters, mdtName, cancerName } = props;\r\n\r\n\tconst labels = [\"2010-2011\", \"2012-2014\", \"2015-2017\", \"2018-2020\"];\r\n\r\n\tconst survivalYears = 3;\r\n\r\n\r\n\tlet mdtSurvival: IPlotData = { labels: [], values: [] };\r\n\tlet stateSurvival: IPlotData = { labels: [], values: [] };\r\n\r\n\r\n\r\n\tlet mdtId = mdtFacilityRef.find(x => x.nameAndFacility == mdtName)?.mdtNameId;\r\n\tlabels.forEach(a => {\r\n\t\tif (plotData[mdtId + a + survivalYears + cancerName]) {\r\n\t\t\tmdtSurvival.labels.push(a)\r\n\t\t\tif (plotData[mdtId + a + survivalYears + cancerName].MDT == -1) {\r\n\t\t\t\tmdtSurvival.values.push(1)\r\n\t\t\t} else {\r\n\t\t\t\tmdtSurvival.values.push(plotData[mdtId + a + survivalYears + cancerName].MDT)\r\n\t\t\t}\r\n\t\t\tstateSurvival.labels.push(a)\r\n\t\t\tstateSurvival.values.push(plotData[mdtId + a + survivalYears + cancerName].State)\r\n\t\t}\r\n\t})\r\n\r\n\r\n\r\n\tconst valuesMDT = mdtSurvival.values;\r\n\tconst labelsMDT = mdtSurvival.labels;\r\n\tconst mdt = { \"name\": \"My MDT\", \"labels\": labelsMDT, \"values\": valuesMDT };\r\n\r\n\tconst valuesState = stateSurvival.values;\r\n\tconst labelsState = stateSurvival.labels;\r\n\tconst state = { \"name\": \"Queensland\", \"labels\": labelsState, \"values\": valuesState };\r\n\r\n\tconst tracesArray: any[] = [];\r\n\ttracesArray.push(mdt);\r\n\ttracesArray.push(state);\r\n\r\n\tconst legend = (chartType: ChartType): JSX.Element => {\r\n\r\n\t\tif (chartType == ChartType.Table)\r\n\t\t\treturn null;\r\n\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t\t\t
\r\n\t\t\t\t\t
My MDT
\r\n\t\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t\t\t
\r\n\t\t\t\t\t
Queensland
\r\n\t\t\t\t
\r\n\t\t\t
\r\n\r\n\t\t)\r\n\t}\r\n\r\n\treturn (\r\n\t\t v.map(p => (p == 1 ? \"NA\" : p.toString() + \"%\"))}\r\n\t\t\tbreadcrumb={null}\r\n\t\t\tchartIcons={{\r\n\t\t\t\tpie: false,\r\n\t\t\t\tline: false,\r\n\t\t\t\thelp: [\"Overall survival describes the proportion of people still alive after a specified time from their diagnosis.\",\r\n\t\t\t\t\t\t\"\",\r\n\t\t\t\t \t\t\"All causes of death are considered.\", \r\n\t\t\t\t\t\t\"\", \r\n\t\t\t\t\t\t\"Note: Survival Rate = NA\",\r\n\t\t\t\t\t\t\"When there is less than 10 patients we do not calculate survival.\",\r\n\t\t\t\t\t\t\"Survival rates of 100% may indicate low patient numbers.\"]\r\n\t\t\t}}\r\n\t\t\tchartDimensions={{\r\n\t\t\t\tchartHeightProportion: 50,\r\n\t\t\t\tparentColNumber: 12,\r\n\t\t\t\ttabColNumber: 4\r\n\t\t\t}}\r\n\t\t\tlegend={legend}\r\n\t\t\tmsgWhenHidden={\"Please select a single MDT and Cancer to generate data\"}\r\n\t\t/>\r\n\t)\r\n}\r\n","import React from \"react\";\r\nimport { AddFilterBaseFunc, graphColors, IDimMDT, IFilterKeys, IFilters, IPlotData, RemoveFilterBaseFunc } from \"models/core\";\r\nimport { DashboardFilterKeys } from \"models/mdt\";\r\nimport { ChartOrientation, ChartType, QoolDashChart } from \"../core\";\r\n\r\ninterface IProps {\r\n\tplotData: { [mdtDiagYearKey: string]: { \"MDT\": number, \"State\": number } };\r\n\tmdtFacilityRef: IDimMDT[];\r\n\tactiveFilters: IFilters;\r\n\taddFilterFn: AddFilterBaseFunc;\r\n\tremoveFilterFn: RemoveFilterBaseFunc;\r\n\tmdtName: string;\r\n\tcancerName: string;\r\n}\r\n\r\n/**\r\n * Reviews by service chart / My MDTs\r\n */\r\nexport function FiveYearSurvivalChart(props: IProps) {\r\n\tconst { plotData, mdtFacilityRef, activeFilters, cancerName, mdtName } = props;\r\n\r\n\tconst labels = [\"2010-2012\", \"2013-2015\", \"2016-2018\"];\r\n\r\n\tconst survivalYears = 5;\r\n\r\n\tlet mdtSurvival: IPlotData = { labels: [], values: [] };\r\n\tlet stateSurvival: IPlotData = { labels: [], values: [] };\r\n\r\n\r\n\r\n\tlet mdtId = mdtFacilityRef.find(x => x.nameAndFacility == mdtName)?.mdtNameId;\r\n\tlabels.forEach(a => {\r\n\t\tif (plotData[mdtId + a + survivalYears + cancerName]) {\r\n\t\t\tmdtSurvival.labels.push(a)\r\n\t\t\tif (plotData[mdtId + a + survivalYears + cancerName].MDT == -1) {\r\n\t\t\t\tmdtSurvival.values.push(1)\r\n\t\t\t} else {\r\n\t\t\t\tmdtSurvival.values.push(plotData[mdtId + a + survivalYears + cancerName].MDT)\r\n\t\t\t}\r\n\t\t\tstateSurvival.labels.push(a)\r\n\t\t\tstateSurvival.values.push(plotData[mdtId + a + survivalYears + cancerName].State)\r\n\t\t}\r\n\t})\r\n\r\n\r\n\r\n\tconst valuesMDT = mdtSurvival.values;\r\n\tconst labelsMDT = mdtSurvival.labels;\r\n\tconst mdt = { \"name\": \"My MDT\", \"labels\": labelsMDT, \"values\": valuesMDT };\r\n\r\n\tconst valuesState = stateSurvival.values;\r\n\tconst labelsState = stateSurvival.labels;\r\n\tconst state = { \"name\": \"Queensland\", \"labels\": labelsState, \"values\": valuesState };\r\n\r\n\tconst tracesArray: any[] = [];\r\n\ttracesArray.push(mdt);\r\n\ttracesArray.push(state);\r\n\r\n\tconst legend = (chartType: ChartType): JSX.Element => {\r\n\r\n\t\tif (chartType == ChartType.Table)\r\n\t\t\treturn null;\r\n\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t\t\t
\r\n\t\t\t\t\t
My MDT
\r\n\t\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t\t\t
\r\n\t\t\t\t\t
Queensland
\r\n\t\t\t\t
\r\n\t\t\t
\r\n\r\n\t\t)\r\n\t}\r\n\r\n\treturn (\r\n\t\t v.map(p => (p == 1 ? \"NA\" : p.toString() + \"%\"))}\r\n\t\t\tbreadcrumb={null}\r\n\t\t\tchartIcons={{\r\n\t\t\t\tpie: false,\r\n\t\t\t\tline: false,\r\n\t\t\t\thelp: [\"Overall survival describes the proportion of people still alive after a specified time from their diagnosis.\",\r\n\t\t\t\t\t\t\"\",\r\n\t\t\t\t\t\t\"All causes of death are considered.\", \r\n\t\t\t\t\t\t\"\", \r\n\t\t\t\t\t\t\"Note: Survival Rate = NA\",\r\n\t\t\t\t\t\t\"When there is less than 10 patients we do not calculate survival.\",\r\n\t\t\t\t\t\t\"Survival rates of 100% may indicate low patient numbers.\"]\r\n\t\t\t}}\r\n\t\t\tchartDimensions={{\r\n\t\t\t\tchartHeightProportion: 50,\r\n\t\t\t\tparentColNumber: 12,\r\n\t\t\t\ttabColNumber: 4\r\n\t\t\t}}\r\n\t\t\tlegend={legend}\r\n\t\t\tmsgWhenHidden={\"Please select a single MDT and Cancer to generate data\"}\r\n\t\t/>\r\n\t)\r\n}","import React from \"react\";\r\nimport { AddFilterBaseFunc, IFilterKeys, IFilters, IPlotData, RemoveFilterBaseFunc } from \"models/core\";\r\nimport { DashboardFilterKeys } from \"models/mdt\";\r\nimport { ChartOrientation, ChartType, QoolDashChart } from \"../core\";\r\n\r\nimport { HHSLabel } from \"config/appUrlConfig\";\r\n\r\n\r\ninterface IProps {\r\n\tplotData: IPlotData;\r\n\tactiveFilters: IFilters;\r\n\taddFilterFn: AddFilterBaseFunc;\r\n removeFilterFn: RemoveFilterBaseFunc;\r\n}\r\n\r\n/**\r\n * HHS Of Residence Chart\r\n */\r\nexport function HHSOfResidenceChart(props: IProps) {\r\n\r\n\treturn (\r\n\t\t\r\n\t)\r\n}\r\n","import React, { useState } from \"react\";\r\n\r\nimport { AddFilterBaseFunc, chartAttrs, defaultStyles, graphColors, IDimMDT, IFilterKeys, IFilters, IPlotData, RemoveFilterBaseFunc } from \"models/core\";\r\nimport { DashboardFilterKeys } from \"models/mdt\";\r\nimport { PlotData } from \"plotly.js\";\r\nimport { Dialog } from \"@mui/material\";\r\nimport { DashChart } from \"components/common/DashChart\";\r\nimport { ChartIcons } from \"components/common/ChartIcons\";\r\nimport { chartDimesionsCalc, ChartOrientation, ChartType, QoolDashChart } from \"../core\";\r\nimport watermark from \"../../static/qca-black.png\";\r\nimport { CreateChart } from \"components/common/CreateChart\";\r\nimport { StateLabel } from \"config/appUrlConfig\";\r\n\r\ninterface IProps {\r\n\tplotData: { [mdtCancerKey: string]: { survivalTime: string, mdtKMSurvival: number, stateKMSurvival: number } };\r\n\tmdtFacilityRef: IDimMDT[];\r\n\tactiveFilters: IFilters;\r\n\taddFilterFn: AddFilterBaseFunc;\r\n\tremoveFilterFn: RemoveFilterBaseFunc;\r\n\tmdtName: string;\r\n\tcancerName: string;\r\n}\r\n\r\n/**\r\n * Reviews by service chart / My MDTs\r\n */\r\nexport function KMSurvivalChart(props: IProps) {\r\n\tconst { plotData, mdtFacilityRef, mdtName, cancerName } = props;\r\n\r\n\tconst chartTitle = \"Kaplan-Meier Survival\";\r\n\r\n\r\n\tlet mdtSurvival: IPlotData = { labels: [], values: [] };\r\n\tlet stateSurvival: IPlotData = { labels: [], values: [] };\r\n\r\n\r\n\t//Get MDTID from the MDT name\r\n\tlet mdtId = mdtFacilityRef.find(x => x.nameAndFacility == mdtName)?.mdtNameId;\r\n\tconst prefix = mdtId + cancerName + \"|\";\r\n\r\n\t//Extract labels (survival time)\r\n\tlet labels: string[] = [];\r\n\tfor (const key in plotData) {\r\n\t\tif (Object.prototype.hasOwnProperty.call(plotData, key)) {\r\n\t\t\tif (key.startsWith(prefix)) {\r\n\t\t\t\tlabels.push(key.substring((key.indexOf(\"|\") + 1)));\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t//Use labels to extract the values\r\n\tlabels.forEach(a => {\r\n\t\tif (plotData[mdtId + cancerName + \"|\" + a]) {\r\n\t\t\tmdtSurvival.labels.push(a)\r\n\t\t\tmdtSurvival.values.push(plotData[mdtId + cancerName + \"|\" + a].mdtKMSurvival)\r\n\r\n\t\t\tstateSurvival.labels.push(a)\r\n\t\t\tstateSurvival.values.push(plotData[mdtId + cancerName + \"|\" + a].stateKMSurvival)\r\n\t\t}\r\n\t})\r\n\r\n\tconst valuesMDT = mdtSurvival.values;\r\n\tconst labelsMDT = mdtSurvival.labels;\r\n\tconst mdt = { \"name\": \"My MDT\", \"labels\": labelsMDT, \"values\": valuesMDT };\r\n\r\n\tconst valuesState = stateSurvival.values;\r\n\tconst labelsState = stateSurvival.labels;\r\n\tconst state = { \"name\": StateLabel, \"labels\": labelsState, \"values\": valuesState };\r\n\r\n\r\n\tconst tracesArray: any[] = [];\r\n\ttracesArray.push(mdt);\r\n\ttracesArray.push(state);\r\n\r\n\r\n\tlet survivalLabel: string[] = [];\r\n\r\n\ttracesArray?.forEach((a, i) => {\r\n\r\n\t\t//Ensure labels are read in as numbers then sort in ascending order \r\n\t\tlet xs: number[] = a.labels.map(x => {\r\n\t\t\treturn Number(x);\r\n\t\t})\r\n\t\txs.sort((a, b) => a - b);\r\n\r\n\t\txs.forEach(x => {\r\n\t\t\tlet years = Math.floor(x);\r\n\t\t\tlet months = Math.round((x % 1) * 12)\r\n\r\n\t\t\tsurvivalLabel.push(years + \" years, \" + months + \" months\")\r\n\t\t})\r\n\r\n\t})\r\n\r\n\tconst legend = (chartType: ChartType): JSX.Element => {\r\n\r\n\t\tif (chartType == ChartType.Table)\r\n\t\t\treturn null;\r\n\r\n\r\n\t\treturn (\r\n\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t\t\t
\r\n\t\t\t\t\t
My MDT
\r\n\t\t\t\t
\r\n\t\t\t\t{state.values.length > 0 &&
\r\n\t\t\t\t\t
\r\n\t\t\t\t\t
{state.name}
\r\n\t\t\t\t
}\r\n\t\t\t
\r\n\r\n\t\t)\r\n\t}\r\n\r\n\r\n\treturn (\r\n\t\t\" +\r\n\t\t\t\t\"%{fullData.name}: %{y:,}%
\" +\r\n\t\t\t\t\"\"}\r\n\t\t\thoverTextAlt={survivalLabel}\r\n\t\t\tbreadcrumb={null}\r\n\t\t\tchartIcons={{\r\n\t\t\t\tpie: false,\r\n\t\t\t\tline: true,\r\n\t\t\t\thorizontalBar: false,\r\n\t\t\t\tverticalBar: false,\r\n\t\t\t\thelp: [\"Overall survival is calculated from date of diagnosis to date of death\"]\r\n\t\t\t}}\r\n\t\t\tchartDimensions={{\r\n\t\t\t\tchartHeightProportion: 50,\r\n\t\t\t\tparentColNumber: 12,\r\n\t\t\t\ttabColNumber: 6\r\n\t\t\t}}\r\n\t\t\tlegend={legend}\r\n\t\t\tmsgWhenHidden={\"Please select a single MDT and Cancer to generate data\"}\r\n\t\t/>\r\n\t)\r\n\r\n}\r\n","import * as React from \"react\";\r\nimport MuiCircularProgress from \"@mui/material/CircularProgress\";\r\n\r\n\r\nconst PageLoader = () => {\r\n\treturn (\r\n\t\t
\r\n\t\t\t\r\n\t\t
\r\n\t)\r\n}\r\n\r\n\r\n\r\nexport default PageLoader;","import * as React from \"react\"\r\nimport * as MDT from \"models/mdt\";\r\nimport { AppContext } from \"AppContext\";\r\nimport { ActionTypes } from \"reducer/actions\";\r\nimport { ReviewsByServiceChart } from \"charts/mdt/ReviewsByServiceChart\";\r\nimport { FormControlLabel, Grid, Paper, Switch } from \"@mui/material\";\r\nimport { MDTActivityTrendChart } from \"charts/mdt/MDTActivityTrendChart\";\r\nimport { PatientsBySiteChart } from \"charts/mdt/PatientsBySiteChart\";\r\nimport { FilterContext, IFilterKeys, IFilters } from \"models/core/filter\";\r\nimport { PatientsByMorphChart } from \"charts/mdt/PatientsByMorphChart\";\r\nimport { HHSResidenceGroupPieChart } from \"charts/mdt/HHSResidenceGroupPieChart\";\r\nimport { HHSResidenceGroupByYearChart } from \"charts/mdt/HHSResidenceGroupByYearChart\";\r\nimport { TumourStageChart } from \"charts/mdt/TumourStageChart\";\r\nimport { TumourGradeChart } from \"charts/mdt/TumourGradeChart\";\r\nimport { AgeAtDiagnosisChart } from \"charts/common/AgeAtDiagnosisChart\";\r\nimport { SexChart } from \"charts/common/SexChart\";\r\nimport { ECOGChart } from \"charts/common/ECOGChart\";\r\nimport { ComorbiditiesChart } from \"charts/common/ComorbiditiesChart\";\r\nimport { FirstNationsStatusChart } from \"charts/common/FirstNationsStatusChart\";\r\nimport { SESChart } from \"charts/common/SESChart\";\r\nimport { RemotenessChart } from \"charts/mdt/RemotenessChart\";\r\nimport { DataQualityByIndicatorChart } from \"charts/mdt/DataQualityByIndicatorChart\";\r\nimport { DataQualityByPeriodChart } from \"charts/mdt/DataQualityByPeriod\";\r\nimport { TimeToFirstTreatment } from \"models/mdt/plotdata\";\r\nimport { TimeToFirstTreatmentChart } from \"charts/mdt/TimeToFirstTreatmentChart\";\r\nimport { FirstTreatmentChart } from \"charts/mdt/FirstTreatmentChart\";\r\nimport { Link } from \"react-scroll\";\r\nimport { DashChip } from \"components/common/DashChips\";\r\nimport { OneYearSurvivalChart } from \"charts/mdt/OneYearSurvivalChart\";\r\nimport { ThreeYearSurvivalChart } from \"charts/mdt/ThreeYearSurvivalChart\";\r\nimport { FiveYearSurvivalChart } from \"charts/mdt/FiveYearSurvivalChart\";\r\nimport { HHSOfResidenceChart } from \"charts/common/HHSOfResidenceChart\";\r\nimport { KMSurvivalChart } from \"charts/mdt/KMSurvivalChart\";\r\nimport { Check, Clear } from \"@mui/icons-material\";\r\nimport Loader from \"pages/shared/pageloader\";\r\n\r\n\r\nexport function MdtDashboard() {\r\n\tconst { state, dispatch } = React.useContext(AppContext);\r\n\r\n\tconst [showFilterChips, setFilterChips] = React.useState(true);\r\n\r\n\tconst addFilter: MDT.AddFilterFunc = async (key: keyof typeof MDT.DashboardFilterKeys, value: string | string[], context?: FilterContext, labelOverride?: string) => {\r\n\t\tdispatch({ type: ActionTypes.ComputingChartData });\r\n\t\tconst filteredDashboard = await MDT.computeChartData(MDT.addFilter(state.page.dashboard as MDT.IMDTDashboard)(key, value, context, labelOverride)); // state = what the other filter function returns \r\n\t\tdispatch({ type: ActionTypes.UserClickedOnChart, payload: filteredDashboard });\r\n\t}\r\n\r\n\tconst removeFilter: MDT.RemoveFilterFunc = async (key: keyof typeof MDT.DashboardFilterKeys, value?: string) => {\r\n\t\tdispatch({ type: ActionTypes.ComputingChartData });\r\n\t\tconst filteredDashboard = await MDT.computeChartData(MDT.removeFilter(state.page.dashboard as MDT.IMDTDashboard, key, value));\r\n\t\tdispatch({ type: ActionTypes.UserClickedOnChart, payload: filteredDashboard });\r\n\t}\r\n\r\n\tReact.useEffect(() => {\r\n\t\tdispatch({ type: ActionTypes.UserWantsToLoadMdtDashboard });\r\n\t\tMDT.loadMdtDashboard(state.page.dashboard as MDT.IMDTDashboard)\r\n\t\t\t.then((value) => {\r\n\t\t\t\tdispatch({ type: ActionTypes.UserLoadedMdtDashboard, payload: value })\r\n\t\t\t});\r\n\t\treturn () => {\r\n\t\t\tMDT.closeMdtDashboard();\r\n\t\t}\r\n\t}, []);\r\n\r\n\r\n\tconst mdtData = state.page.dashboard.chartData as MDT.IChartData;\r\n\r\n\r\n\r\n\tconst inferSurvivalData = (): { mdtName: string, cancerName: string, cancerNameKey: string } => {\r\n\t\tlet survivalData = {\r\n\t\t\tmdtName: \"\",\r\n\t\t\tcancerName: \"\",\r\n\t\t\tcancerNameKey: \"\"\r\n\t\t};\r\n\r\n\t\tif (state.page.loading || state.page.computing)\r\n\t\t\treturn survivalData;\r\n\r\n\t\tconst activeFilters = state.page?.dashboard?.filters;\r\n\r\n\t\tsurvivalData.mdtName =\r\n\t\t\tactiveFilters?.Mdt?.value[0] ?? mdtData?.patientsByService.labels[mdtData?.patientsByService?.labels.length - 1];\r\n\r\n\r\n\t\tconst getPrimarySite = () => {\r\n\t\t\tif (mdtData?.primarySite) {\r\n\r\n\t\t\t\tfor (let i = mdtData.primarySite.labels.length - 1; i >= 0; i--) {\r\n\t\t\t\t\tif (mdtData.primarySite.labels[i] != \"Not Determined\")\r\n\t\t\t\t\t\treturn mdtData.primarySite.labels[i];\r\n\t\t\t\t}\r\n\r\n\t\t\t}\r\n\t\t\treturn \"\";\r\n\t\t}\r\n\r\n\t\tconst getPrimarySiteFromFilters = () => {\r\n\t\t\tif (activeFilters?.PrimarySite?.parts) {\r\n\t\t\t\tif (activeFilters?.PrimarySite?.parts?.length == 2) {\r\n\t\t\t\t\treturn activeFilters?.PrimaySite?.parts[1]\r\n\t\t\t\t}\r\n\t\t\t\treturn activeFilters?.PrimarySite?.parts[0]\r\n\t\t\t}\r\n\r\n\t\t\treturn \"\";\r\n\t\t}\r\n\r\n\t\tconst getPrimarySiteKeyFromFilters = () => {\r\n\t\t\tlet key = \"\";\r\n\t\t\tif (activeFilters?.PrimarySite) {\r\n\t\t\t\tkey = activeFilters?.PrimarySite?.parts[0];\r\n\t\t\t\tif (activeFilters?.PrimarySite?.parts?.length == 2) {\r\n\t\t\t\t\tkey += activeFilters?.PrimarySite?.parts[1];\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t\treturn key;\r\n\t\t}\r\n\r\n\t\tsurvivalData.cancerName = getPrimarySiteFromFilters()\r\n\t\t\t|| getPrimarySite();\r\n\r\n\t\tsurvivalData.cancerNameKey = getPrimarySiteKeyFromFilters()\r\n\t\t\t|| getPrimarySite();\r\n\r\n\r\n\t\treturn survivalData;\r\n\t}\r\n\r\n\tconst survivalData = inferSurvivalData();\r\n\r\n\tReact.useEffect(() => {\r\n\t\tif (survivalData.cancerName && survivalData.mdtName) {\r\n\t\t\tMDT.loadSurvivalDashboard(state.page.dashboard as MDT.IMDTDashboard, survivalData.mdtName, survivalData.cancerName, state.page.dashboard.filters)\r\n\t\t\t\t.then((value) => {\r\n\t\t\t\t\tdispatch({ type: ActionTypes.UserClickedOnChart, payload: value })\r\n\t\t\t\t});\r\n\t\t}\r\n\r\n\t}, [state.page.loading || state.page.computing])\r\n\r\n\r\n\tif (state.page.loading || !state.page.dashboard.chartData)\r\n\t\treturn \r\n\r\n\t//Create function to show/hide filter chips\r\n\tconst toggleChips = () => {\r\n\t\tif (showFilterChips) {\r\n\t\t\tsetFilterChips(false);\r\n\t\t} else {\r\n\t\t\tsetFilterChips(true);\r\n\t\t}\r\n\t};\r\n\r\n\tlet activeFiltersArray = [];\r\n\tlet filterArray = [];\r\n\tlet chips = [];\r\n\r\n\tfor (const key in state.page.dashboard.filters) {\r\n\t\tif (Object.prototype.hasOwnProperty.call(state.page.dashboard.filters, key)) {\r\n\t\t\tactiveFiltersArray.push({ \"key\": key, \"values\": state.page.dashboard.filters[key].value, \"parts\": state.page.dashboard.filters[key].parts });\r\n\t\t}\r\n\t}\r\n\r\n\tfor (const key in MDT.DashboardFilterKeys) {\r\n\t\tif (Object.prototype.hasOwnProperty.call(MDT.DashboardFilterKeys, key)) {\r\n\t\t\tfilterArray.push({ \"key\": key, \"label\": MDT.DashboardFilterKeys[key].label });\r\n\t\t}\r\n\t}\r\n\r\n\tactiveFiltersArray.forEach(a => {\r\n\t\ta.values.forEach(b => {\r\n\t\t\tchips.push( id.key == a.key).label}\r\n\t\t\t\tfilterValue={b}\r\n\t\t\t\tfilterId={a.key}\r\n\t\t\t\tfilterParent={(a.parts.length > 1 ? a.parts[0] : null)}\r\n\t\t\t/>\r\n\t\t\t)\r\n\t\t})\r\n\t})\r\n\r\n\r\n\tconst survivalDataSelections = () => {\r\n\t\tconst mdt =\r\n\t\t\tsurvivalData.mdtName ?\r\n\t\t\t\t<> MDT: {survivalData.mdtName}\r\n\t\t\t\t: <> MDT: Please select a MDT\r\n\r\n\t\tconst cancer =\r\n\t\t\tsurvivalData.cancerName ?\r\n\t\t\t\t<> Cancer: {survivalData.cancerName}\r\n\t\t\t\t: <> Cancer: Please select a cancer type\r\n\r\n\t\treturn (\r\n\t\t\t<>\r\n\t\t\t\t{mdt}\r\n\t\t\t\t \r\n\t\t\t\t{cancer}\r\n\t\t\t\r\n\t\t)\r\n\t}\r\n\r\n\r\n\r\n\r\n\tconst dashboard =\r\n\t\t<>\r\n\t\t\t
\r\n\t\t\t\t\r\n\r\n\r\n\t\t\t\t\t
\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tOverview\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tTumour Characteristics\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tPatient Characteristics\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tQuality Measures\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tOutcomes\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t
\r\n\r\n\t\t\t\t\t
\r\n\t\t\t\t\t\t toggleChips()}\r\n\t\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\tlabel=\"Show Filter Selections\"\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t
\r\n\r\n\r\n\r\n\r\n\t\t\t\t
\r\n\r\n\t\t\t\t{(showFilterChips ?\r\n\t\t\t\t\t
\r\n\t\t\t\t\t\t{chips}\r\n\t\t\t\t\t
:
)}\r\n\r\n\r\n\t\t\t
\r\n\r\n\r\n\r\n\t\t\t\r\n\r\n\t\t\t\t\r\n\t\t\t\t\t 991 ? 4 : 11}>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t 991 ? 4 : 11}>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t 991 ? 4 : 11}>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t{/* 991 ? 4 : 11}>\r\n\t\t\t\t\r\n\t\t\t\t */}\r\n\t\t\t\t\r\n\t\t\t\t{\r\n\t\t\t\t\t//Tumour Characteristics\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t

Tumour Characteristics

\r\n\t\t\t\t\t
\r\n\r\n\t\t\t\t\t 991 ? 4 : 11}>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t 991 ? 4 : 11}>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t 991 ? 4 : 11}>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t{/* 991 ? 3 : 11}>\r\n\t\t\t\r\n\t\t\t */}\r\n\t\t\t\t
\r\n\t\t\t\t{\r\n\t\t\t\t\t//Patient Characteristics\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t

Patient Characteristics

\r\n\t\t\t\t\t
\r\n\r\n\t\t\t\t\t 991 ? 3 : 11}>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t 991 ? 3 : 11}>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t 991 ? 3 : 11}>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t 991 ? 3 : 11}>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t 991 ? 3 : 11}>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t 991 ? 3 : 11}>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t 991 ? 3 : 11}>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t 991 ? 3 : 11}>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t
\r\n\t\t\t\t{\r\n\t\t\t\t\t//Quality Measures\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t

Quality Measures

\r\n\t\t\t\t\t
\r\n\r\n\t\t\t\t\t 991 ? 6 : 11}>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t 991 ? 6 : 11}>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t{/* 991 ? 3 : 11}>\r\n\t\t\t\t\r\n\t\t\t\t\r\n\r\n\t\t\t 991 ? 3 : 11}>\r\n\t\t\t\t\r\n\t\t\t\t */}\r\n\t\t\t\t
\r\n\r\n\t\t\t\t{\r\n\t\t\t\t\t//Outcomes\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t

Outcomes

\r\n\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t

\r\n\t\t\t\t\t\t\tNote: These graphs are static and do not respond to filter selections with the exception of My MDT and Cancer Type\r\n\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\tIf no selections are made, the survival charts default to your most common MDT and Cancer Type\r\n\t\t\t\t\t\t

\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t{survivalDataSelections()}\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t
\r\n\r\n\t\t\t\t\t 991 ? 4 : 11}>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t 991 ? 4 : 11}>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t 991 ? 4 : 11}>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t{/* 991 ? 3 : 11}>\r\n\t\t\t\t\r\n\t\t\t\t */}\r\n\r\n\t\t\t\t\t 991 ? 6 : 11}>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t
\r\n\r\n\t\t\t
\r\n\t\t\r\n\r\n\treturn (\r\n\t\tdashboard\r\n\t)\r\n\r\n\r\n} ","import * as React from \"react\";\r\nimport { Button } from \"@mui/material\";\r\n\r\ninterface IProps {\r\n filterItems: any[],\r\n currentState: string,\r\n onChanged: Function,\r\n rightAlignButtons?: boolean\r\n}\r\ninterface IState {\r\n\r\n}\r\n\r\nexport class SideBySideButton extends React.Component {\r\n constructor(props, context) {\r\n super(props, context);\r\n }\r\n\r\n shouldComponentUpdate(nextProps) {\r\n return nextProps.min !== this.props.currentState;\r\n }\r\n\r\n componentDidUpdate(props) {\r\n // Desired operations: ex setting state\r\n }\r\n\r\n onChanged = (p) => {\r\n this.props.onChanged(p);\r\n }\r\n\r\n render = () => {\r\n const { filterItems, currentState, rightAlignButtons } = this.props;\r\n const buttonWidth = 96/filterItems.length\r\n\r\n //Create the side by side option buttons. The width is determined by the number of them - current logic is if there are less than 4 buttons \r\n //they go side by side, more than four \r\n //we put four to a row \r\n return (\r\n
\r\n {filterItems.map(a => \r\n )}\r\n
\r\n );\r\n }\r\n}","\r\nexport const MimeType: MimeType = {\r\n Json: { type: \"application/json\", ext: \"json\", stringify: true },\r\n Pdf: { type: \"application/pdf\", ext: \"pdf\" },\r\n Xml: { type: \"application/xml\", ext: \"xml\" },\r\n Csv: { type: \"application/csv\", ext: \"csv\" },\r\n DocX: { type: \"application/vnd.openxmlformats-officedocument.wordprocessingml.document\", ext: \"docx\"},\r\n XlsX: { type: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\", ext: \"xlsx\" },\r\n Html: { type: \"application/html\", ext: \"html\"}\r\n}\r\n\r\ntype MimeType = {\r\n [key in MimeTypeKey]: IMimeTypeObj\r\n}\r\n\r\ntype MimeTypeKey = \"Json\" | \"Pdf\" | \"Xml\" | \"Csv\" | \"DocX\" | \"XlsX\" | \"Html\";\r\n\r\ninterface IMimeTypeObj {\r\n type: string;\r\n ext: string;\r\n stringify?: boolean\r\n}\r\n\r\nexport const fileTypeToMimeType = (filetype: string): IMimeTypeObj => {\r\n switch ((filetype || \"\").toLowerCase()) {\r\n case \"json\":\r\n return MimeType.Json;\r\n case \"xml\":\r\n return MimeType.Xml;\r\n case \"csv\":\r\n return MimeType.Csv;\r\n case \"docx\":\r\n return MimeType.DocX;\r\n case \"xlsx\":\r\n return MimeType.XlsX;\r\n case \"html\":\r\n return MimeType.Html;\r\n case \"doc\":\r\n return MimeType.DocX;\r\n case \"xls\":\r\n return MimeType.XlsX;\t\r\n\t\tcase \"pdf\":\r\n\t\t\treturn MimeType.Pdf;\t\t\r\n default:\r\n return MimeType.XlsX;\r\n }\r\n}\r\n\r\nexport const showFile = (blob: any, filename: string, MimeType: IMimeTypeObj, anchorElemId: string = null) => { \r\n // It is necessary to create a new blob object with mime-type explicitly set\r\n // otherwise only Chrome works like it should \r\n let _blob = null;\r\n\r\n if (!MimeType.stringify)\r\n _blob = base64ToArrayBuffer(blob)\r\n else \r\n _blob = blob;\r\n\r\n const newBlob = new Blob([_blob], {type: MimeType.type});\r\n\r\n // IE doesn't allow using a blob object directly as link href\r\n // instead it is necessary to use msSaveOrOpenBlob\r\n const navigator: any = window.navigator;\r\n if (navigator && navigator.msSaveOrOpenBlob) {\r\n navigator.msSaveOrOpenBlob(newBlob);\r\n return;\r\n } \r\n\r\n // For other browsers: \r\n // Create a link pointing to the ObjectURL containing the blob.\r\n const data = window.URL.createObjectURL(newBlob);\r\n const download = `${filename}.${MimeType.ext}`;\r\n\r\n if (anchorElemId) {\r\n const anchorElem = document.getElementById(anchorElemId);\r\n anchorElem.setAttribute(\"href\", data);\r\n anchorElem.setAttribute(\"download\", download)\r\n anchorElem.click();\r\n } else {\r\n let link = document.createElement(\"a\");\r\n document.body.appendChild(link);\r\n link.href = data;\r\n link.download = download;\r\n link.click();\r\n }\r\n\r\n setTimeout(() => {\r\n // For Firefox it is necessary to delay revoking the ObjectURL\r\n window.URL.revokeObjectURL(data);\r\n }, 1);\r\n} \r\n\r\nconst base64ToArrayBuffer = (data) => {\r\n let binaryString = window.atob(data);\r\n let binaryLen = binaryString.length;\r\n let bytes = new Uint8Array(binaryLen);\r\n for (let i = 0; i < binaryLen; i++) {\r\n let ascii = binaryString.charCodeAt(i);\r\n bytes[i] = ascii;\r\n }\r\n return bytes;\r\n}","import * as React from \"react\";\r\nimport MuiCircularProgress from \"@mui/material/CircularProgress\";\r\n\r\n\r\nconst FilterLoader = () => {\r\n\treturn (\r\n\t\t
\r\n\t\t\t\r\n\t\t
\r\n\t)\r\n}\r\n\r\n\r\n\r\nexport default FilterLoader;","import * as React from \"react\"\r\nimport * as MDT from \"models/mdt\";\r\nimport { AppContext } from \"AppContext\";\r\nimport { ActionTypes } from \"reducer/actions\";\r\nimport { Box, Button, Typography } from \"@mui/material\";\r\nimport { FilterContext } from \"models/core/filter\";\r\nimport Select from \"react-select\";\r\nimport { SideBySideButton } from \"components/common/SideBySideOptions\";\r\nimport { exportMdtPatients, exportMdtExcludedPatients } from \"models/mdt/worker\";\r\nimport * as fileHelper from \"helpers/fileHelper\";\r\nimport Loader from \"pages/shared/filterloader\";\r\n\r\nexport function MdtFilters() {\r\n\tconst { state, dispatch } = React.useContext(AppContext);\r\n\r\n\tconst addFilter: MDT.AddFilterFunc = async (key: keyof typeof MDT.DashboardFilterKeys, value: string | string[], context?: FilterContext, labelOverride?: string) => {\r\n\t\tconst filteredDashboard = await MDT.computeChartData(MDT.addFilter(state.page.dashboard as MDT.IMDTDashboard)(key, value, context, labelOverride)); // state = what the other filter function returns \r\n\t\tdispatch({ type: ActionTypes.UserClickedOnChart, payload: filteredDashboard });\r\n\t}\r\n\r\n\tconst removeFilter: MDT.RemoveFilterFunc = async (key: keyof typeof MDT.DashboardFilterKeys) => {\r\n\r\n\t\tconst filteredDashboard = await MDT.computeChartData(MDT.removeFilter(state.page.dashboard as MDT.IMDTDashboard, key));\r\n\t\tdispatch({ type: ActionTypes.UserClickedOnChart, payload: filteredDashboard });\r\n\t}\r\n\r\n\tif (state.page.loading)\r\n\t\treturn ;\r\n\r\n\tconst mdtData = state?.page?.dashboard?.chartData as MDT.IChartData;\r\n\r\n\t//HHS \r\n\t//HHS Options\r\n\tconst hhsOptions: any[] = [];\r\n\tmdtData?.hhses.map(p => {\r\n\t\thhsOptions.push({ label: p.name, value: p.id });\r\n\t})\r\n\r\n\t//Filtered HHSes\r\n\tlet hhsSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.HHS?.value?.map(p => {\r\n\t\thhsSelections.push({ label: p, value: hhsOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\t//Add code to be able to filter list of facilities to a chosen HHS\r\n\tlet selectedHHSIds = [];\r\n\tif (hhsSelections.length > 0) {\r\n\t\tselectedHHSIds = hhsSelections.map(a =>\r\n\t\t\ta.value);\r\n\t}\r\n\r\n\t//Facility \r\n\t//Facility Options\r\n\tconst facilityOptions: any[] = [];\r\n\tif (hhsSelections.length > 0) {\r\n\t\tmdtData?.facilities.filter(a => selectedHHSIds.includes(a.hhsId)).map(p => {\r\n\t\t\tfacilityOptions.push({ label: p.name, value: p.facilityId });\r\n\t\t})\r\n\t} else {\r\n\t\tmdtData?.facilities.map(p => {\r\n\t\t\tfacilityOptions.push({ label: p.name, value: p.facilityId });\r\n\t\t});\r\n\t}\r\n\r\n\t//Filtered facilities\r\n\tlet facilitySelections: any[] = [];\r\n\tstate.page.dashboard.filters?.Facility?.value?.map(p => {\r\n\t\tfacilitySelections.push({ label: p, value: facilityOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\t//Add code to be able to filter list of Mdts to a chosen Facilities\r\n\tlet selectedFacilityIds = [];\r\n\tif (facilitySelections.length > 0) {\r\n\t\tselectedFacilityIds = facilitySelections.map(a =>\r\n\t\t\ta.value);\r\n\t}\r\n\r\n\t//MDTs\r\n\t//Options\r\n\tconst mdtOptions: any[] = [];\r\n\tif (facilitySelections.length > 0) {\r\n\t\tmdtData?.mdts.filter(a => selectedFacilityIds.includes(a.facilityId)).map(p => {\r\n\t\t\tmdtOptions.push({ label: p.nameAndFacility, value: p.mdtNameId });\r\n\t\t})\r\n\t} else {\r\n\t\tmdtData?.mdts.map(p => {\r\n\t\t\tmdtOptions.push({ label: p.nameAndFacility, value: p.mdtNameId });\r\n\t\t})\r\n\t}\r\n\r\n\t//Filtered MDTs\r\n\tlet mdtSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.Mdt?.value?.map(p => {\r\n\t\tmdtSelections.push({ label: p, value: mdtOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\tlet { path } = mdtData.reviewsByPeriod;\r\n\tlet parts = FilterContext.fromPath(path).parts;\r\n\r\n\t//Months\r\n\t//Options\r\n\tconst monthOptions: any[] = [];\r\n\tmdtData?.month.map(p => {\r\n\t\tmonthOptions.push({ label: p.name, value: p.id });\r\n\t})\r\n\r\n\t//Filtered MDT months\r\n\tlet mdtMonthSelections: any[] = [];\r\n\tif (parts.length > 1) {\r\n\t\tparts[1].replace(`[`, ``).replace(`]`, ``).split('; ').map(p => {\r\n\t\t\tmdtMonthSelections.push({\r\n\t\t\t\tlabel: monthOptions.find(a => a.label.substring(0, 3) == p.replace(\" \", \"\"))?.label,\r\n\t\t\t\tvalue: monthOptions.find(a => a.label.substring(0, 3) == p.replace(\" \", \"\"))?.value\r\n\t\t\t});\r\n\t\t})\r\n\t}\r\n\r\n\t//Filtered diagnosis months\r\n\tlet diagMonthSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.DiagMonth?.value?.map(p => {\r\n\t\tdiagMonthSelections.push({ label: p, value: monthOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\t//Years\r\n\t//MDT Year options\r\n\tconst mdtYearOptions: any[] = [];\r\n\tmdtData?.year.map(p => {\r\n\t\tif (p.id >= 2010 && p.name != \"Unknown\") {\r\n\t\t\tmdtYearOptions.push({ label: p.name, value: p.id });\r\n\t\t}\r\n\t})\r\n\r\n\t//Filtered year selections\r\n\tlet mdtYearSelections: any[] = [];\r\n\tif (parts.length > 0) {\r\n\t\tparts[0].replace(`[`, ``).replace(`]`, ``).split(';').map(p => {\r\n\t\t\tmdtYearSelections.push({\r\n\t\t\t\tlabel: p.replace(\" \", \"\"),\r\n\t\t\t\tvalue: mdtData?.year.find(a => a.name == p.replace(\" \", \"\"))?.id\r\n\t\t\t});\r\n\t\t})\r\n\t}\r\n\r\n\t//Diagnosis year options\r\n\tconst diagYearOptions: any[] = [];\r\n\tmdtData?.year.map(p => {\r\n\t\tif (p.name != \"Unknown\") {\r\n\t\t\tdiagYearOptions.push({ label: p.name, value: p.id });\r\n\t\t}\r\n\t})\r\n\r\n\t//Filtered diagnosis selections\r\n\tlet diagYearSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.DiagYear?.value?.map(p => {\r\n\t\tdiagYearSelections.push({ label: p, value: diagYearOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\t//State for side by side button \r\n\tconst [viewBy, setViewBy] = React.useState(diagYearSelections.length > 0 ? \"Diagnosis Year\" : \"MDT Year\");\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t\r\n\t\t\t\tHHS\r\n\t\t\t\t {\r\n\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\tremoveFilter(MDT.DashboardFilterKeys.HHS.key);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\taddFilter(MDT.DashboardFilterKeys.HHS.key, filterValues);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t}),\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t\r\n\r\n\r\n\t\t\t\r\n\t\t\t\tFacility\r\n\t\t\t\t {\r\n\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\tremoveFilter(MDT.DashboardFilterKeys.Facility.key);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\taddFilter(MDT.DashboardFilterKeys.Facility.key, filterValues);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t}),\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t\r\n\r\n\r\n\t\t\t\r\n\t\t\t\tMDT\r\n\t\t\t\t {\r\n\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\tremoveFilter(MDT.DashboardFilterKeys.Mdt.key);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\taddFilter(MDT.DashboardFilterKeys.Mdt.key, filterValues);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t}),\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t\r\n\r\n\t\t\t\r\n\t\t\t\tView By\r\n\t\t\t\t {\r\n\t\t\t\t\t\tsetViewBy(p)\r\n\t\t\t\t\t}}\r\n\r\n\t\t\t\t/>\r\n\t\t\t\r\n\r\n\t\t\t{(viewBy == \"MDT Year\" ?\r\n\t\t\t\t<>\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tMDT Year\r\n\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\t\t\t\t\t\t\t\tfilterValues.sort();\r\n\r\n\t\t\t\t\t\t\t\tif (mdtYearSelections.length > 0) {\r\n\t\t\t\t\t\t\t\t\tlet context = path && FilterContext.fromPath(path) || new FilterContext();\r\n\t\t\t\t\t\t\t\t\tcontext.parts = [];\r\n\r\n\t\t\t\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\t\t\t\tremoveFilter(MDT.DashboardFilterKeys.Year.key);\r\n\t\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\t\taddFilter(MDT.DashboardFilterKeys.Year.key, filterValues, context);\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\tconst context = path && FilterContext.fromPath(path) || new FilterContext();\r\n\t\t\t\t\t\t\t\t\taddFilter(MDT.DashboardFilterKeys.Year.key, filterValues, context);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t{(mdtYearSelections && mdtYearSelections.length == 1 ?\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tMDT Month\r\n\t\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label.substring(0, 3)));\r\n\r\n\t\t\t\t\t\t\t\t\tif (parts.length > 1) {\r\n\t\t\t\t\t\t\t\t\t\tlet context = path && FilterContext.fromPath(path) || new FilterContext();\r\n\t\t\t\t\t\t\t\t\t\tcontext.parts = [context.parts[0]];\r\n\r\n\t\t\t\t\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\t\t\t\t\tlet context = path && FilterContext.fromPath(path) || new FilterContext();\r\n\t\t\t\t\t\t\t\t\t\t\tcontext.parts = [context.parts[0]];\r\n\t\t\t\t\t\t\t\t\t\t\taddFilter(MDT.DashboardFilterKeys.Year.key, [], context);\r\n\t\t\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\t\t\taddFilter(MDT.DashboardFilterKeys.Year.key, filterValues, context);\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\t\tconst context = path && FilterContext.fromPath(path) || new FilterContext();\r\n\t\t\t\t\t\t\t\t\t\taddFilter(MDT.DashboardFilterKeys.Year.key, filterValues, context);\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t: null)}\r\n\t\t\t\t\r\n\t\t\t\t:\r\n\t\t\t\t<>\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tDiagnosis Year\r\n\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\t\t\tremoveFilter(MDT.DashboardFilterKeys.DiagYear.key);\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\taddFilter(MDT.DashboardFilterKeys.DiagYear.key, filterValues);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tDiagnosis Month\r\n\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\t\t\tremoveFilter(MDT.DashboardFilterKeys.DiagMonth.key);\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\taddFilter(MDT.DashboardFilterKeys.DiagMonth.key, filterValues);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\r\n\r\n\t\t\t\t\r\n\t\t\t)}\r\n\r\n\r\n\t\t\t\r\n\t\t\t\t{(Object.keys(state.page.dashboard.filters).length !== 0 ?\r\n\t\t\t\t\t
\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\texportMdtPatients(mdtData.filteredReferralIdCsv, false)\r\n\t\t\t\t\t\t\t\t\t.then(data => {\r\n\t\t\t\t\t\t\t\t\t\tif (data.errorMessage) {\r\n\t\t\t\t\t\t\t\t\t\t\tthrow data.errorMessage;\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\treturn fileHelper.showFile(data.bytes, data.filename, fileHelper.fileTypeToMimeType(data.filetype), \"exportMdtPatientsElem\")\r\n\t\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t\t\t.catch(err => {\r\n\t\t\t\t\t\t\t\t\t\tconsole.log(err)\r\n\t\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t>Download Patient List\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\texportMdtExcludedPatients(mdtData.excludedReferralIdCsv, false)\r\n\t\t\t\t\t\t\t\t\t.then(data => {\r\n\t\t\t\t\t\t\t\t\t\tif (data.errorMessage) {\r\n\t\t\t\t\t\t\t\t\t\t\tthrow data.errorMessage;\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\treturn fileHelper.showFile(data.bytes, data.filename, fileHelper.fileTypeToMimeType(data.filetype), \"exportMdtPatientsElem\")\r\n\t\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t\t\t.catch(err => {\r\n\t\t\t\t\t\t\t\t\t\tconsole.log(err)\r\n\t\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t>Download Excluded Patients List\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t
\r\n\t\t\t\t\t:\r\n\t\t\t\t\t
Make a filter selection in order to download patient list
)}\r\n\t\t\t
\r\n\r\n\t\t\t\r\n\t\t\r\n\t)\r\n}\r\n\r\n\r\n","import { MdtDashboard } from \"./dashboard\";\r\nimport { MdtFilters } from \"./filters\";\r\nimport * as React from \"react\";\r\n\r\nexport { MdtFilters }\r\n\r\n\r\nexport class MdtDashboardHome extends React.Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n width: 0,\r\n height: 0\r\n }; \r\n\r\n }\r\n\r\n private updateDimensions = () => {\r\n this.setState({ width: window.innerWidth, height: window.innerHeight });\r\n };\r\n \r\n public componentWillUnmount() {\r\n window.removeEventListener('resize', this.updateDimensions);\r\n }\r\n \r\n public componentDidMount() {\r\n window.addEventListener('resize', this.updateDimensions);\r\n }\r\n\r\n render = () => {\r\n return (\r\n <>\r\n \r\n \r\n )\r\n\r\n }\r\n}","import { \r\n IPlotData as ICorePlotData, createPlotData as createCorePlotData, \r\n ISourceData as ICoreSourceData, createData as createCoreData, addDataFactory, addSet \r\n} from \"models/core\";\r\nimport { IDashboardViewModel } from \"./core\";\r\n\r\n/**\r\n * Plot data source\r\n */\r\nexport type IPlotData = ICorePlotData;\r\n\r\n/**\r\n * Source data\r\n */\r\nexport type ISourceData = ICoreSourceData;\r\n\r\n/**\r\n * Raw data source. Used to shape and accumulate.\r\n */\r\nexport interface ISourceBuilder {\r\n uniques: Set;\r\n values: ISourceData;\r\n}\r\n\r\n/**\r\n * Create a new plot data object.\r\n */\r\nexport const createPlotData = createCorePlotData;\r\n\r\n/**\r\n * Create a new source data object\r\n */\r\nexport function createBuilder(): ISourceBuilder {\r\n return {\r\n uniques: new Set(),\r\n values: createCoreData(),\r\n };\r\n}\r\n\r\nexport const addData = addDataFactory((vm: IDashboardViewModel) => vm.remoteness.name);\r\n\r\n/**\r\n * Compare sourceData[a] to sourceData[b] and return -1 when a is less than b, 0 when equal, 1 when a is greater than 0\r\n * @param a \r\n * @param b \r\n */\r\nexport const sort = (s: ISourceData, a: string, b: string): number => {\r\n return ((s[a] < s[b]) ? -1 : ((s[a] > s[b]) ? 1 : 0));\r\n};\r\n\r\n/** \r\n * Complete adding data and clear any temporary resources \r\n */\r\nexport function finish(builder: ISourceBuilder): ISourceData {\r\n try {\r\n return builder.values;\r\n } finally {\r\n builder.uniques.clear();\r\n builder.uniques = null;\r\n builder.values = null;\r\n builder = null;\r\n }\r\n}","import { \r\n IPlotData as ICorePlotData, createPlotData as createCorePlotData, \r\n ISourceData as ICoreSourceData, createData as createCoreData, addDataFactory, addSet \r\n} from \"models/core\";\r\nimport { IDashboardViewModel } from \"./core\";\r\n\r\n/**\r\n * Plot data source\r\n */\r\nexport type IPlotData = ICorePlotData;\r\n\r\n/**\r\n * Source data\r\n */\r\nexport type ISourceData = ICoreSourceData;\r\n\r\n/**\r\n * Raw data source. Used to shape and accumulate.\r\n */\r\nexport interface ISourceBuilder {\r\n uniques: Set;\r\n values: ISourceData;\r\n}\r\n\r\n/**\r\n * Create a new plot data object.\r\n */\r\nexport const createPlotData = createCorePlotData;\r\n\r\n/**\r\n * Create a new source data object\r\n */\r\nexport function createBuilder(): ISourceBuilder {\r\n return {\r\n uniques: new Set(),\r\n values: createCoreData(),\r\n };\r\n}\r\n\r\nexport const add = addDataFactory((vm: IDashboardViewModel) => vm.firstTreatment.name);\r\n\r\n/**\r\n * Returns the number added to the hierarchy on add, 0 otherwise. \r\n * @param vm \r\n * @param into \r\n */\r\n export function addData(vm: IDashboardViewModel, into: ISourceBuilder): number {\r\n //Only count once per unique (treatment type + patient id + facility ) since we're counting participation at a facility.\r\n if (addSet(vm.firstTreatment.id + \"_\" + vm.patientId + vm.facility, into.uniques)) {\r\n add(vm, into.values);\r\n return 1;\r\n }\r\n\r\n return 0;\r\n}\r\n\r\n/**\r\n * Compare sourceData[a] to sourceData[b] and return -1 when a is less than b, 0 when equal, 1 when a is greater than 0\r\n * @param a \r\n * @param b \r\n */\r\nexport const sort = (s: ISourceData, a: string, b: string): number => {\r\n return ((s[a] < s[b]) ? -1 : ((s[a] > s[b]) ? 1 : 0));\r\n};\r\n\r\n/** \r\n * Complete adding data and clear any temporary resources \r\n */\r\nexport function finish(builder: ISourceBuilder): ISourceData {\r\n try {\r\n return builder.values;\r\n } finally {\r\n builder.uniques.clear();\r\n builder.uniques = null;\r\n builder.values = null;\r\n builder = null;\r\n }\r\n}","import {\r\n AddDataSharedFunc, DashboardSharedFilterFunc, DashboardSharedFilterKey,\r\n IDashboardSharedChartData, IDashboardSharedDimensionsViewModel,\r\n} from \"models/common\";\r\nimport { IFilters, IFilterKeys, DimensionsById, ISourceData, IDimension, IDimMDT } from \"models/core\";\r\n\r\n//Plots for this dashboard\r\nimport * as PatientsByPeriod from \"./patientsByPeriodHierarchy\";\r\nimport * as PrimarySite from \"./primarySiteHierarchy\";\r\nimport * as Remoteness from \"./remoteness\";\r\nimport * as FirstTreatment from \"./firstTreatment\";\r\nimport { IDashboardViewModel, IDashboardDataQualityComparisonsViewModel } from \"./viewModel\";\r\n\r\nexport { type IDashboardDataQualityViewModel, type IDashboardViewModel } from \"./viewModel\";\r\n\r\nexport interface IDashboardSource {\r\n eligible: IDashboardViewModel[];\r\n}\r\n\r\nexport interface IDashboardDimensionsViewModel extends IDashboardSharedDimensionsViewModel {\r\n hhsResidenceGroups?: DimensionsById;\r\n dataQualityIndicators?: DimensionsById;\r\n monthsArray?: Array;\r\n yearsArray?: Array;\r\n months?: { [monthId: number]: string };\r\n years?: { [yearId: number]: string };\r\n dqCompFacility?: { [facilityYearKey: string]: number };\r\n dqCompState?: { [facilityYearKey: string]: number };\r\n oneYearSurvival?: { [facDiagYearKey: string]: { \"Facility\": number, \"State\": number } };\r\n threeYearSurvival?: { [facDiagYearKey: string]: { \"Facility\": number, \"State\": number } };\r\n fiveYearSurvival?: { [facDiagYearKey: string]: { \"Facility\": number, \"State\": number } };\r\n tenYearSurvival?: { [facDiagYearKey: string]: { \"Facility\": number, \"State\": number } };\r\n kmSurvival?: { [facCancerKey: string]: { \"survivalTime\": string, \"noMdtKMSurvival\": number, \"stateKMSurvival\": number } };\r\n\r\n}\r\n\r\nexport interface IChartData extends IDashboardSharedChartData {\r\n patientsByPeriod: PatientsByPeriod.IHierarchyPlotData;\r\n primarySite: PrimarySite.IHierarchyPlotData;\r\n remoteness: Remoteness.IPlotData;\r\n firstTreatment: FirstTreatment.IPlotData;\r\n month: IDimension[];\r\n year: IDimension[];\r\n dqCompFacility: { [facilityYearKey: string]: number };\r\n dqCompState: { [facilityYearKey: string]: number };\r\n oneYearSurvival?: { [facDiagYearKey: string]: { \"Facility\": number, \"State\": number } };\r\n threeYearSurvival?: { [facDiagYearKey: string]: { \"Facility\": number, \"State\": number } };\r\n fiveYearSurvival?: { [facDiagYearKey: string]: { \"Facility\": number, \"State\": number } };\r\n tenYearSurvival?: { [facDiagYearKey: string]: { \"Facility\": number, \"State\": number } };\r\n kmSurvival?: { [facCancerKey: string]: { \"survivalTime\": string, \"noMdtKMSurvival\": number, \"stateKMSurvival\": number } };\r\n //Computations\r\n totalPatients: number;\r\n totalDiagnoses: number;\r\n totalMaleDiagnoses: number;\r\n totalIndigenousDiagnoses: number;\r\n totalDisadvantaged: number;\r\n totalComorbidity2Plus: number;\r\n totalLateStage: number;\r\n medianAgeAtDiagnosis: number;\r\n // Export\r\n filteredReferralIdCsv: string;\r\n\r\n}\r\n\r\nconst FilterKey: IFilterKeys = {\r\n PrimarySite: { key: \"PrimarySite\", label: \"Primary site\" },\r\n Remoteness: { key: \"Remoteness\", label: \"Rurality\" },\r\n FirstTreatment: { key: \"FirstTreatment\", label: \"First Treatment\" },\r\n DiagMonth: { key: \"DiagMonth\", label: \"Diagnosis Month\" },\r\n DiagYear: { key: \"DiagYear\", label: \"Diagnosis Year\" },\r\n AdmMonth: { key: \"AdmMonth\", label: \"Admission Month\" },\r\n AdmYear: { key: \"AdmYear\", label: \"Admission Year\" },\r\n}\r\n\r\nexport const DashboardFilterKeys: IFilterKeys = {\r\n ...DashboardSharedFilterKey,\r\n ...FilterKey\r\n}\r\n\r\nexport type Filters = IFilters;\r\nexport type DashboardFilterFunc = DashboardSharedFilterFunc;\r\nexport type AddDataFunc = AddDataSharedFunc;","import { IChartData, IDashboardDimensionsViewModel, Filters } from \"../plotdata\";\r\n\r\n//Actions / requests\r\nexport enum WorkerRequestType { Ping, Fetch, ChartData, FetchSurvival }\r\nexport interface IWorkerFetchRequest { all: boolean, rawRefs: any, rawRows: string}\r\nexport interface IWorkerFetchSurvivalRequest { all: boolean, rawSurvivalRows: string, rawKMSurvivalRows: string, activeFilters: Filters}\r\nexport interface IWorkerChartDataRequest { filtersToApply: Filters };\r\nexport interface IWorkerRequest {\r\n type: WorkerRequestType;\r\n id: string;\r\n payload?: any; //?\r\n}\r\n\r\n//Results\r\nexport enum WorkerResultType { Ping, Fetch, ChartData, InvalidType }\r\nexport interface IWorkerResult {\r\n type: WorkerResultType;\r\n id: string;\r\n payload?: any; //?\r\n}\r\nexport interface IWorkerPingResult {}\r\nexport interface IWorkerFetchResult { allData: boolean, references: IDashboardDimensionsViewModel, chartData: IChartData }\r\nexport type IWorkerChartDataResult = IChartData;","export default function Worker_fn() {\n return new Worker(__webpack_public_path__ + \"data.worker.35c973452800c15d267d.worker.js\");\n}\n","import { generateUUID } from \"helpers\";\r\nimport { getNoMdtDashboard, getNoMdtDashboardReferences, getNoMdtDashboardSurvival, getNoMdtDashboardKMSurvival } from \"api/dashboardApi\";\r\nimport { Filters } from \"../plotdata\";\r\nimport { IWorkerChartDataRequest, IWorkerChartDataResult, IWorkerFetchRequest, IWorkerFetchResult, IWorkerFetchSurvivalRequest, IWorkerPingResult, IWorkerRequest, WorkerRequestType, WorkerResultType } from \"./models\";\r\nimport DataWorker from 'worker-loader!./data.worker';\r\nimport ReportApi from \"api/reportApi\";\r\nimport { ICreateFileReportResult } from \"models\";\r\nexport { type IWorkerChartDataResult, type IWorkerFetchResult, type IWorkerPingResult, type IWorkerRequest, WorkerRequestType }\r\n\r\n//#region Worker\r\n\r\nlet worker: DataWorker = null;\r\nlet promises = {};\r\n\r\n/**\r\n * Start the Worker\r\n */\r\nexport function start() {\r\n if (!window[\"Worker\"]) {\r\n console.log(\"WebWorker not supported\");\r\n return false;\r\n\r\n } else {\r\n console.log(\"WebWorker starting\");\r\n\r\n worker = worker || new DataWorker();\r\n\r\n /**\r\n * When the worker sends an error back to the main thread, resolve the associated promise.\r\n */\r\n worker.addEventListener(\"message\", (ev: MessageEvent) => {\r\n const { data: { id, type, payload } } = ev;\r\n\r\n //Any specific handling by message type\r\n switch (type as WorkerResultType) {\r\n // case WorkerResultType.Ping: {\r\n // case WorkerResultType.Fetch: {\r\n default: {\r\n //Default handler will just resolve\r\n promises[id].resolve(payload);\r\n break;\r\n }\r\n }\r\n\r\n promises[id] = undefined;\r\n });\r\n\r\n /**\r\n * When the worker sends an error back to the main thread, reject the associated promise.\r\n */\r\n worker.addEventListener(\"messageerror\", (ev: MessageEvent) => {\r\n const { data: { id, type, payload } } = ev;\r\n\r\n //Any specific handling by message type\r\n switch (type) {\r\n //case WorkerResultType.Ping: {\r\n //case WorkerResultType.Fetch: {\r\n default: {\r\n console.error(\"ERROR from worker\", payload);\r\n promises[id].reject(payload);\r\n break;\r\n }\r\n }\r\n\r\n promises[id] = undefined;\r\n });\r\n\r\n return true;\r\n }\r\n}\r\n\r\n/**\r\n * Post the message to the Worker\r\n * @param request \r\n */\r\nfunction send(request: IWorkerRequest) {\r\n worker.postMessage(request);\r\n}\r\n\r\n/**\r\n * Transform into a Promise and track it.\r\n * @param type \r\n * @param payload \r\n */\r\nfunction actionPromise(type: WorkerRequestType, payload: TIn): Promise {\r\n const id = generateUUID();\r\n promises[id] = {};\r\n promises[id].promise = new Promise((resolve, reject) => {\r\n send({ id, type, payload });\r\n\r\n promises[id].resolve = resolve;\r\n promises[id].reject = reject;\r\n });\r\n\r\n return promises[id].promise;\r\n}\r\n\r\nexport function ping(): Promise {\r\n return actionPromise(WorkerRequestType.Ping, null);\r\n}\r\n\r\n/**\r\n * Fetch the data from the server, then push it to the Worker for processing.\r\n * @param all \r\n */\r\n\r\nexport function fetch(all: boolean): Promise {\r\n //WebWorker cannot access sessionStorage so do the api call here and\r\n //send the data tp it.\r\n return Promise.all([\r\n\t\tgetNoMdtDashboard(all),\r\n\t\tgetNoMdtDashboardReferences(all), \r\n ])\r\n .then(results => {\r\n return actionPromise(WorkerRequestType.Fetch, {\r\n all,\r\n rawRows: results[0] as string,\r\n rawRefs: results[1] as any,\r\n });\r\n });\r\n\r\n}\r\n\r\nexport function fetchSurvival(all: boolean, service: any, primarySite: any, activeFilters: Filters): Promise {\r\n //WebWorker cannot access sessionStorage so do the api call here and\r\n //send the data tp it.\r\n return Promise.all([\r\n getNoMdtDashboardSurvival(all, service, primarySite), \r\n getNoMdtDashboardKMSurvival(all, service, primarySite), \r\n ])\r\n .then(results => {\r\n return actionPromise(WorkerRequestType.FetchSurvival, {\r\n all,\r\n rawSurvivalRows: results[0] as string,\r\n rawKMSurvivalRows: results[1] as string,\r\n activeFilters\r\n });\r\n });\r\n\r\n}\r\n\r\nexport function exportMdtPatients(referralIdCsv: string, allData: boolean) {\r\n return ReportApi.getMdtDashboardPatientList(referralIdCsv, allData);\r\n}\r\n\r\n/**\r\n * Apply the filters in the Worker and return the ChartData\r\n * @param filtersToApply \r\n */\r\nexport function chartData(filtersToApply: Filters): Promise {\r\n return actionPromise(WorkerRequestType.ChartData, {\r\n filtersToApply\r\n });\r\n}\r\n\r\n/** Terminate the worker */\r\nexport function stop() {\r\n worker && worker.terminate();\r\n worker = null;\r\n console.log(\"WebWorker terminated\");\r\n}\r\n\r\n//#endregion Worker\r\n","import { AddFilterBaseFunc, FilterContext, RemoveFilterBaseFunc } from \"../core\";\r\nimport { DashboardFilterKeys, Filters, IChartData, IDashboardDimensionsViewModel } from \"./plotdata\";\r\nexport { type IChartData, type IDashboardDimensionsViewModel, DashboardFilterKeys, type Filters } from \"./plotdata\";\r\nexport type AddFilterFunc = AddFilterBaseFunc;\r\nexport type RemoveFilterFunc = RemoveFilterBaseFunc;\r\n\r\nimport * as DashWorker from \"./worker\";\r\n\r\nexport interface IMDTDashboard {\r\n\tallData: boolean;\r\n\treferences: IDashboardDimensionsViewModel;\r\n\tfilters: Filters;\r\n\tchartData: IChartData;\r\n\tselectedFacilities: Set;\r\n selectedHhses: Set;\r\n}\r\n\r\n\r\nexport const initState = (): IMDTDashboard => {\r\n\treturn {\r\n\t\tallData: false,\r\n\t\treferences: {},\r\n\t\tchartData: null,\r\n\t\tfilters: {},\r\n\t\tselectedFacilities: new Set(),\r\n\t\tselectedHhses: new Set(),\r\n\t}\r\n};\r\n\r\n\r\nexport const loadMdtDashboard = async (state: IMDTDashboard): Promise => {\r\n\tDashWorker.start();\r\n\ttry {\r\n\t\tawait DashWorker.ping()\r\n\t\tconsole.log(\"WORKER PING RESOLVED\");\r\n\t\treturn await fetchData(state, state.allData);\r\n\t} catch {\r\n\t\tconsole.error(\"WORKER PING FAILED\");\r\n\t}\r\n}\r\n\r\nexport const loadSurvivalDashboard = async (state: IMDTDashboard, service: any, primarySite: any, activeFilters: Filters): Promise => {\r\n\ttry {\r\n\t\tawait DashWorker.ping()\r\n\t\treturn await fetchSurvivalData(state, false, service, primarySite, activeFilters);\r\n\t} catch {\r\n\t\tconsole.error(\"LOADING SURVIVAL DATA FAILED\");\r\n\t}\r\n}\r\n\r\nexport const clearFilters = (state: IMDTDashboard): IMDTDashboard => {\r\n\tconst maybeSetDefaultFilter = (filterKey: string, dimensions: { name: string }[]): Set => {\r\n\t\tif (!dimensions || dimensions.length !== 1)\r\n\t\t\treturn (new Set());\r\n\r\n\t\tif (state.allData)\r\n\t\t\treturn (new Set());\r\n\r\n\t\tlet filterSet = new Set();\r\n\t\tfilterSet.add(dimensions[0].name);\r\n\r\n\t\tstate = addFilter(state)(filterKey, [dimensions[0].name])\r\n\t\treturn filterSet;\r\n\t}\r\n\r\n\tstate.filters = {};\r\n\tstate.selectedHhses = maybeSetDefaultFilter(DashboardFilterKeys.HHS.key, state.chartData.hhses);\r\n\tstate.selectedFacilities = maybeSetDefaultFilter(DashboardFilterKeys.Facility.key, state.chartData.facilities);\r\n\r\n\treturn { ... state };\r\n\r\n}\r\n\r\n\r\n\r\nexport const closeMdtDashboard = () =>\r\n\tDashWorker.stop();\r\n\r\nconst fetchData = async (state: IMDTDashboard, all: boolean): Promise => {\r\n\ttry {\r\n\t\tconst data = await DashWorker.fetch(all);\r\n\r\n\t\tconst maybeSetDefaultFilter = (filterKey: string, dimensions: { name: string }[]): Set => {\r\n\t\t\tif (!dimensions || dimensions.length !== 1)\r\n\t\t\t\treturn (new Set());\r\n\r\n\t\t\tif (all)\r\n\t\t\t\treturn (new Set());\r\n\r\n\t\t\tlet filterSet = new Set();\r\n\t\t\tfilterSet.add(dimensions[0].name);\r\n\r\n\t\t\tstate = addFilter(state)(filterKey, [dimensions[0].name])\r\n\t\t\treturn filterSet;\r\n\t\t}\r\n\r\n\t\tstate.selectedHhses = maybeSetDefaultFilter(DashboardFilterKeys.HHS.key, data.chartData.hhses);\r\n state.selectedFacilities = maybeSetDefaultFilter(DashboardFilterKeys.Facility.key, data.chartData.facilities);\r\n\t\tstate.allData = all;\r\n\t\tstate.references = data.references;\r\n\t\tstate.chartData = data.chartData;\r\n\t\t\r\n\t\treturn state;\r\n\t} catch {\r\n\t\tconsole.error(\"WORKER FETCHDATA FAILED\");\r\n\t\treturn state;\r\n\t}\r\n}\r\n\r\nconst fetchSurvivalData = async (state: IMDTDashboard, all: boolean, service: any, primarySite: any, activeFilters: Filters): Promise => {\r\n\ttry {\r\n\t\tconst data = await DashWorker.fetchSurvival(all, service, primarySite, activeFilters);\r\n\t\tstate.chartData = data.chartData;\r\n\t\treturn state;\r\n\t} catch {\r\n\t\tconsole.error(\"WORKER FETCHDATA FAILED\");\r\n\t\treturn state;\r\n\t}\r\n}\r\n\r\nexport const computeChartData = async (state: IMDTDashboard): Promise => {\r\n\ttry {\r\n\t\tconst data = await DashWorker.chartData(state.filters);\r\n\t\tstate.chartData = data;\r\n\t\treturn {...state};\r\n\t} catch {\r\n\t\tconsole.error(\"WORKER COMPUTECHARTDATA FAILED\")\r\n\t\treturn state;\r\n\t}\r\n}\r\n\r\nexport const addFilter = (state: IMDTDashboard) => (key: keyof typeof DashboardFilterKeys, value: string | string[], context?: FilterContext, labelOverride?: string): IMDTDashboard => {\r\n\tconst filters: Filters = Object.assign({}, state.filters);\r\n\tconst values = (typeof value === \"string\")\r\n\t\t? [value]\r\n\t\t: value;\r\n\r\n\t//Replace the existing path entry if we are replacing a multi-value filter\r\n\t//to do so: traverse to the parent\r\n\tconst baseContext: FilterContext = context && ((context.values().length > 1) ? context.parent() : context) || new FilterContext();\r\n\tbaseContext.push(values);\r\n\r\n\tfilters[key] = ({ value: values, labelOverride, parts: baseContext.parts });\r\n\r\n\tstate.filters = filters;\r\n\r\n\treturn {...state};\r\n}\r\n\r\n\r\nexport const removeFilter = (state: IMDTDashboard, key: keyof typeof DashboardFilterKeys, value?: string | number): IMDTDashboard => {\r\n\tconst filters: Filters = Object.assign({}, state.filters);\r\n\tif (filters[key].value.length > 1 && value) {\r\n\t\tfilters[key].value.splice(filters[key].value.findIndex(a => a == value), 1)\r\n\t} else {\r\n\t\tdelete filters[key];\r\n\t}\r\n\r\n\tstate.filters = filters;\r\n\treturn {...state};\r\n}\r\n\r\n\r\n\r\n /**\r\n * Exports a string with the current filters selected and their values.\r\n */\r\nexport function extractFilterLabel(filterValues, spacer) {\r\n\r\nlet filters = [];\r\n\r\nfor (const key in DashboardFilterKeys) {\r\n\tif (Object.prototype.hasOwnProperty.call(DashboardFilterKeys, key)) {\r\n\t\tfilters.push({\"key\": key, \"label\": DashboardFilterKeys[key].label});\r\n\t}\r\n}\r\n\r\nlet filterString = \"\";\r\n\tif (filterValues) {\r\n\tfor (var key of Object.keys(filterValues)) {\r\n\t\t\tfilterValues[key].parts.forEach(p => {\r\n\t\t\t\tfilterString += ((filters.find(id => id.key == key).label + \":\" +\" \" + p + spacer));\r\n\t\t\t\t}) \r\n\t\r\n\t}\r\n}\r\n\r\nreturn filterString.substring(0, filterString.length -2);\r\n}\r\n","import React, { useState } from \"react\";\r\n\r\nimport { AddFilterBaseFunc, chartAttrs, defaultStyles, IFilterKeys, IFilters, IPlotData, RemoveFilterBaseFunc } from \"models/core\";\r\nimport { DashboardFilterKeys } from \"models/mdt\";\r\nimport { PlotData } from \"plotly.js\";\r\nimport { Dialog } from \"@mui/material\";\r\nimport { addFilterFactory } from \"helpers/filterHelper\";\r\nimport { DashChart } from \"components/common/DashChart\";\r\nimport { ChartIcons } from \"components/common/ChartIcons\";\r\nimport { SimpleBreadcrumb } from \"components/common/SimpleBreadcrumb\";\r\nimport { chartDimesionsCalc } from \"../core\";\r\nimport watermark from \"../../static/qca-black.png\";\r\nimport { CreateChart } from \"components/common/CreateChart\";\r\n\r\ninterface IProps {\r\n\tplotData: IPlotData;\r\n\tactiveFilters: IFilters;\r\n\taddFilterFn: AddFilterBaseFunc;\r\n removeFilterFn: RemoveFilterBaseFunc;\r\n}\r\n\r\n/**\r\n * Reviews by service chart / My MDTs\r\n */\r\nexport function FirstTreatmentChart(props: IProps) {\r\n\tconst { plotData, activeFilters, addFilterFn, removeFilterFn } = props;\r\n\tconst [ chartType, setChartType ] = useState(\"bar\");\r\n const [ chartOrientation, setChartOrientation ] = useState(\"h\");\r\n\tconst [ fullScreenOpen, setFullScreenState ] = useState(false);\r\n const { values, labels } = plotData;\r\n\r\n\tconst showChart = values.length > 0;\r\n\tconst filterKey = DashboardFilterKeys.FirstTreatment.key;\r\n\tconst filterFn = addFilterFactory(addFilterFn, filterKey, (chartType == \"pie\" ? p => p.data.labels[p.pointNumber].toString() : (chartOrientation ==\"h\" ? p => p.y.toString() : p => p.x.toString())));\r\n\r\n\tconst chartDimensions = chartDimesionsCalc(50, 12, 4);\r\n\tconst chartTitle = \"First treatment received\";\r\n\tconst xtitle = (chartOrientation == \"h\" ? \"Number of Diagnoses\" : \"\");\r\n\tconst ytitle = (chartOrientation == \"h\" ? \"\" : \"Number of Diagnoses\");\r\n\tconst textFn = String;\r\n\t\r\n\t//Pull out the unknown index to be able to add to the bottom of the array\r\n\t//Reversed vs original labels/values allows the horizontal and vertical charts to present data in the same order \r\n\tconst indexOfUnk = plotData.labels.findIndex(x => x == \"Had no treatment\");\r\n\r\n\tconst labelsOriginal = plotData.labels.slice();\r\n\tif (indexOfUnk !== -1)\t{\r\n\t\tlabelsOriginal.splice(indexOfUnk, 1);\r\n\t}\r\n\t\r\n\tconst reversedLabels = labelsOriginal.slice().reverse();\r\n\tif (indexOfUnk !== -1)\t{\r\n\t\tlabelsOriginal.unshift(plotData.labels[indexOfUnk]);\r\n\t\treversedLabels.push(plotData.labels[indexOfUnk]);\r\n\t}\r\n\t\t\r\n\tconst valuesOriginal = plotData.values.slice();\r\n\tif (indexOfUnk !== -1)\t{\r\n\t\tvaluesOriginal.splice(indexOfUnk, 1);\r\n\t}\r\n\r\n\tconst reversedValues = valuesOriginal.slice().reverse();\r\n\tif (indexOfUnk !== -1)\t{\r\n\t\tvaluesOriginal.unshift(plotData.values[indexOfUnk]);\r\n\t\treversedValues.push(plotData.values[indexOfUnk]);\t\r\n\t}\r\n\r\n\tconst traces: Partial[] = [];\r\n\r\n\t\t\tswitch (true) {\r\n\t\t\t\tcase chartType == \"pie\":\r\n\t\t\t\t\ttraces.push({\r\n\t\t\t\t\t\tvalues: reversedValues,\r\n\t\t\t\t\t\tlabels: reversedLabels,\r\n\t\t\t\t\t\ttext: reversedValues.map(x => ((x / reversedValues.reduce((a, b) => a + b, 0))*100).toFixed(1) + \"%\"),\r\n\t\t\t\t\t\ttexttemplate: \"%{label}
\" +\r\n\t\t\t\t\t\t\t\t\t\t\"%{text}
\",\r\n\t\t\t\t\t\thoverinfo: \"none\",\r\n\t\t\t\t\t\thole: 0.6,\r\n\t\t\t\t\t\ttype: chartType,\r\n\t\t\t\t\t\tshowlegend: false,\r\n\t\t\t\t\t\tdirection: \"clockwise\",\r\n\t\t\t\t\t\tinsidetextorientation: \"horizontal\",\r\n\t\t\t\t\t\ttextposition: \"outside\",\r\n\t\t\t\t\t\tmarker: {},\r\n\t\t\t\t\t\tsort: false,\r\n\t\t\t\t\t} as unknown as Plotly.PlotData)\r\n\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase chartOrientation == \"v\":\r\n\t\t\t\t\ttraces.push({\r\n\t\t\t\t\t\tx: reversedLabels,\r\n\t\t\t\t\t\ty: reversedValues,\r\n\t\t\t\t\t\ttext: reversedValues.map(textFn),\r\n\t\t\t\t\t\ttextposition: \"outside\",\r\n\t\t\t\t\t\ttextfont: {\r\n\t\t\t\t\t\t\tsize: 12,\r\n\t\t\t\t\t\t },\r\n\t\t\t\t\t\thovertext: reversedLabels,\r\n\t\t\t\t\t\thovertemplate: \"%{hovertext}
\" +\r\n\t\t\t\t\t\t\t\t\t\"Diagnoses: %{y:,}
\" +\r\n\t\t\t\t\t\t\t\t\t\"\",\r\n\t\t\t\t\t\ttype: chartType,\r\n\t\t\t\t\t\torientation: chartOrientation,\r\n\t\t\t\t\t\tmarker: {},\r\n\t\t\t\t\t} as unknown as Plotly.PlotData)\r\n\t\t\t\tbreak;\r\n\r\n\t\t\t\tdefault:\r\n\t\t\t\t\ttraces.push({\r\n\t\t\t\t\t\tx: valuesOriginal,\r\n\t\t\t\t\t\ty: labelsOriginal,\r\n\t\t\t\t\t\ttext: valuesOriginal.map(textFn),\r\n\t\t\t\t\t\ttextposition: \"outside\",\r\n\t\t\t\t\t\ttextfont: {\r\n\t\t\t\t\t\t\tsize: 12,\r\n\t\t\t\t\t\t },\r\n\t\t\t\t\t\thovertext: labelsOriginal,\r\n\t\t\t\t\t\thovertemplate: \"%{hovertext}
\" +\r\n\t\t\t\t\t\t\t\t\t\"Diagnoses: %{x:,}
\" +\r\n\t\t\t\t\t\t\t\t\t\"\",\r\n\t\t\t\t\t\ttype: chartType,\r\n\t\t\t\t\t\torientation: chartOrientation,\r\n\t\t\t\t\t\tmarker: {},\r\n\t\t\t\t\t} as unknown as Plotly.PlotData)\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\r\n\t//Add breadcrumb\r\n\tconst breadcrumb = (\r\n\t\t\r\n\t\t);\r\n\r\n\t//Custom styling when a pie chart to avoid cut off labels\r\n\tconst style = defaultStyles.defaultBox;\r\n\tconst bx = chartAttrs(style.height);\r\n\tconst styling = Object.assign({}, bx.layout)\r\n\tstyling.margin = { l: 70, r: 70, b: 70, t: 70, pad: 0 };\r\n\t\r\n\t//Full screen chart\r\n\tconst logo = watermark;\r\n\tconst fullScreenChart =\r\n\t\t\r\n\t\t\t\t \r\n\t\t\t\t\t
\r\n\t\t\t\t\t\r\n\t\t\t\t\t
\r\n\t\t\t\t\t{}\r\n\t\t\t\t\t
\r\n\t\t\t\t\t{CreateChart(chartDimensions.fullScreenChartHeight,\r\n\t\t\t\t\t\t\t\t chartDimensions.fullScreenChartWidth,\r\n\t\t\t\t\t\t\t\t chartDimensions.fullScreenPaperHeight,\r\n\t\t\t\t\t\t\t\t chartOrientation,\r\n\t\t\t\t\t\t\t\t chartType, \r\n\t\t\t\t\t\t\t\t showChart, \r\n\t\t\t\t\t\t\t\t xtitle, \r\n\t\t\t\t\t\t\t\t ytitle, \r\n\t\t\t\t\t\t\t\t labels,\r\n\t\t\t\t\t\t\t\t values, \r\n\t\t\t\t\t\t\t\t traces, \r\n\t\t\t\t\t\t\t\t filterFn,\r\n\t\t\t\t\t\t\t\t (chartType==\"pie\" ? styling : null)\r\n\t\t\t\t\t\t\t\t )}\r\n\t\t\t\t
\r\n\t\t\r\n\r\n\r\n\treturn (\r\n\t\t
\r\n\t\t\r\n\t\t\r\n\t\t\t{CreateChart(chartDimensions.chartHeight,\r\n\t\t\t\t\t\t\t\t chartDimensions.chartWidth,\r\n\t\t\t\t\t\t\t\t chartDimensions.paperHeight,\r\n\t\t\t\t\t\t\t\t chartOrientation,\r\n\t\t\t\t\t\t\t\t chartType, \r\n\t\t\t\t\t\t\t\t showChart, \r\n\t\t\t\t\t\t\t\t xtitle, \r\n\t\t\t\t\t\t\t\t ytitle, \r\n\t\t\t\t\t\t\t\t labels,\r\n\t\t\t\t\t\t\t\t values, \r\n\t\t\t\t\t\t\t\t traces, \r\n\t\t\t\t\t\t\t\t filterFn,\r\n\t\t\t\t\t\t\t\t (chartType==\"pie\" ? styling : null)\r\n\t\t\t\t\t\t\t\t )}\r\n\t\t\t{fullScreenChart}\r\n\t\t\r\n\t\t
\r\n\t);\r\n}\r\n","import React, { useState } from \"react\";\r\n\r\nimport { AddFilterBaseFunc, chartAttrs, defaultStyles, graphColors, IDimFacility, IDimMDT, IFilterKeys, IFilters, IPlotData, RemoveFilterBaseFunc } from \"models/core\";\r\nimport { DashboardFilterKeys } from \"models/mdt\";\r\nimport { PlotData } from \"plotly.js\";\r\nimport { Dialog } from \"@mui/material\";\r\nimport { DashChart } from \"components/common/DashChart\";\r\nimport { ChartIcons } from \"components/common/ChartIcons\";\r\nimport { chartDimesionsCalc } from \"../core\";\r\nimport watermark from \"../../static/qca-black.png\";\r\nimport { CreateChart } from \"components/common/CreateChart\";\r\n\r\ninterface IProps {\r\n\tplotData: {[facDiagYearKey: string]: { \"Facility\": number, \"State\": number } };\r\n\tmdtFacilityRef: IDimFacility[];\r\n\tactiveFilters: IFilters;\r\n\taddFilterFn: AddFilterBaseFunc;\r\n removeFilterFn: RemoveFilterBaseFunc;\r\n}\r\n\r\n/**\r\n * Reviews by service chart / My MDTs\r\n */\r\nexport function OneYearSurvivalChart(props: IProps) {\r\n\tconst { plotData, mdtFacilityRef, activeFilters } = props;\r\n\tconst [ chartType, setChartType ] = useState(\"bar\");\r\n const [ chartOrientation, setChartOrientation ] = useState(\"v\");\r\n\tconst [ fullScreenOpen, setFullScreenState ] = useState(false);\r\n \r\n\tconst chartDimensions = chartDimesionsCalc(50, 12, 4);\r\n\tconst chartTitle = \"One Year Survival\";\r\n\tconst xtitle = (chartOrientation == \"h\" ? \"\" : \"Diagnosis Years\");\r\n\tconst ytitle = (chartOrientation == \"h\" ? \"Diagnosis Years\" : \"\");\r\n\r\n\t//Filter the survival data with the current mdt+Cancer filters\r\n\tconst facName = activeFilters?.Facility?.value[0];\r\n\r\n\tlet cancerName: string = activeFilters?.PrimarySite?.parts[0];\r\n\tif (activeFilters?.PrimarySite?.parts?.length == 2) {\r\n\t\tcancerName += activeFilters?.PrimarySite?.parts[1];\r\n\t}\r\n\r\n const labels = [/*\"Pre-2010\", \"2010-2012\", \"2013-2015\",*/ \"2016-2018\", \"2019-2020\"];\r\n\r\n\tlet mdtSurvival: IPlotData = {labels: [], values: []};\r\n let stateSurvival: IPlotData = {labels: [], values: []};\r\n\tif (activeFilters?.Facility?.value.length == 1 && activeFilters?.PrimarySite?.value.length == 1) { \r\n\t\tlet facId = mdtFacilityRef.find(x => x.name == facName)?.facilityId;\r\n\t\tlabels.forEach(a => {\r\n\t\t\tif (plotData[facId+a+cancerName]) {\r\n mdtSurvival.labels.push(a)\r\n mdtSurvival.values.push(plotData[facId+a+cancerName].Facility)\r\n\r\n stateSurvival.labels.push(a)\r\n stateSurvival.values.push(plotData[facId+a+cancerName].State)\r\n\t\t\t}\r\n\t\t})\r\n\t}\r\n\r\n\tconst valuesMDT = mdtSurvival.values;\r\n\tconst labelsMDT = mdtSurvival.labels;\r\n\tconst mdt = {\"name\": \"My Facility\", \"labels\": labelsMDT, \"values\": valuesMDT};\r\n\r\n const valuesState = stateSurvival.values;\r\n\tconst labelsState = stateSurvival.labels;\r\n\tconst state = {\"name\": \"Queensland\", \"labels\": labelsState, \"values\": valuesState};\r\n\r\n const showChart = mdtSurvival.values.findIndex(p => p !== 0) !== -1;\r\n\r\n\tconst tracesArray: any[] = [];\r\n\ttracesArray.push(mdt);\r\n tracesArray.push(state);\r\n\r\n\tconst traces: Partial[] = [];\r\n\r\n //Change y axis range to limit to 100% \r\n const style = defaultStyles.defaultBox;\r\n\tconst bx = chartAttrs(style.height);\r\n const styling = Object.assign({}, bx.layout)\r\n\tif (chartOrientation == \"v\") {\r\n \tstyling.yaxis = { range: [0, 110] };\r\n\t}\r\n\r\n\tif (chartOrientation == \"h\") {\r\n \tstyling.xaxis = { range: [0, 110] };\r\n\t}\r\n\r\n tracesArray?.forEach((a, i) => { \r\n\tswitch (true) {\r\n\t\t\t\tcase chartOrientation == \"v\":\r\n\t\t\t\t\ttraces.push({\r\n\t\t\t\t\t\tx: a.labels,\r\n\t\t\t\t\t\ty: a.values,\r\n\t\t\t\t\t\tname: a.name,\r\n\t\t\t\t\t\ttext: a.values.map(p => p.toString() + \"%\"),\r\n\t\t\t\t\t\ttextposition: \"outside\",\r\n\t\t\t\t\t\ttextfont: {\r\n\t\t\t\t\t\t\tsize: 12,\r\n\t\t\t\t\t\t },\r\n hovertext: a.labels,\r\n\t\t\t\t\t\thovertemplate: \"%{hovertext}
\" +\r\n \"Survival: %{text}
\" +\r\n \"\",\r\n\t\t\t\t\t\ttype: chartType,\r\n\t\t\t\t\t\torientation: chartOrientation,\r\n\t\t\t\t\t\tmarker: {},\r\n\t\t\t\t\t\tshowlegend: false,\r\n\t\t\t\t\t} as unknown as Plotly.PlotData)\r\n\t\t\t\tbreak;\r\n\r\n\t\t\t\tdefault:\r\n\t\t\t\t\ttraces.push({\r\n\t\t\t\t\t\tx: a.values,\r\n\t\t\t\t\t\ty: a.labels,\r\n\t\t\t\t\t\tname: a.name,\r\n\t\t\t\t\t\ttext: a.values.map(p => p.toString() + \"%\"),\r\n\t\t\t\t\t\ttextposition: \"outside\",\r\n\t\t\t\t\t\ttextfont: {\r\n\t\t\t\t\t\t\tsize: 12,\r\n\t\t\t\t\t\t },\r\n hovertext: a.labels,\r\n hovertemplate: \"%{hovertext}
\" +\r\n \"Survival: %{text}
\" +\r\n \"\",\r\n\t\t\t\t\t\ttype: chartType,\r\n\t\t\t\t\t\torientation: chartOrientation,\r\n\t\t\t\t\t\tmarker: {},\r\n\t\t\t\t\t\tshowlegend: false,\r\n\t\t\t\t\t} as unknown as Plotly.PlotData)\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t})\r\n\t\r\n\tconst logo = watermark;\r\n\tconst fullScreenChart =\r\n\t\t\r\n\t\t\t\t \r\n\t\t\t\t\t
\r\n\t\t\t\t\t\r\n\t\t\t\t\t
\r\n\t\t\t\t\t{}\r\n\t\t\t\t\t
\r\n\t\t\t\t\t{CreateChart(chartDimensions.fullScreenChartHeight * 1.2,\r\n\t\t\t\t\t\t\t\t chartDimensions.fullScreenChartWidth,\r\n\t\t\t\t\t\t\t\t chartDimensions.fullScreenPaperHeight,\r\n\t\t\t\t\t\t\t\t chartOrientation,\r\n\t\t\t\t\t\t\t\t chartType, \r\n\t\t\t\t\t\t\t\t showChart, \r\n\t\t\t\t\t\t\t\t xtitle, \r\n\t\t\t\t\t\t\t\t ytitle, \r\n\t\t\t\t\t\t\t\t mdtSurvival.labels,\r\n\t\t\t\t\t\t\t\t mdtSurvival.values, \r\n\t\t\t\t\t\t\t\t traces,\r\n null,\r\n styling)}\r\n {(chartType !== \"table\" ?
\r\n
\r\n
\r\n
My Facility
\r\n
\r\n
\r\n
\r\n
Queensland
\r\n
\r\n \t
: null)}\r\n\t\t\t\t
\r\n\t\t\r\n\r\n\r\n\treturn (\r\n\t\t
\r\n\t\t\r\n\t\t\r\n\t\t\t{CreateChart(chartDimensions.chartHeight*1.05,\r\n\t\t\t\t\t\t\t\t chartDimensions.chartWidth,\r\n\t\t\t\t\t\t\t\t chartDimensions.paperHeight,\r\n\t\t\t\t\t\t\t\t chartOrientation,\r\n\t\t\t\t\t\t\t\t chartType, \r\n\t\t\t\t\t\t\t\t showChart, \r\n\t\t\t\t\t\t\t\t xtitle, \r\n\t\t\t\t\t\t\t\t ytitle, \r\n\t\t\t\t\t\t\t\t mdtSurvival.labels,\r\n\t\t\t\t\t\t\t\t mdtSurvival.values, \r\n\t\t\t\t\t\t\t\t traces,\r\n null,\r\n styling)}\r\n\t\t\t{fullScreenChart}\r\n {(chartType !== \"table\" ?
\r\n
\r\n
\r\n
My Facility
\r\n
\r\n
\r\n
\r\n
Queensland
\r\n
\r\n \t
: null)}\r\n {(!showChart && activeFilters?.Facility?.value.length !== 1 && activeFilters?.PrimarySite?.value.length !== 1 ? \r\n
Please select a single Facility and Cancer to generate data
: null)}\r\n\t\t
\r\n\t\t
\r\n\t);\r\n}\r\n","import React, { useState } from \"react\";\r\nimport { AddFilterBaseFunc, chartAttrs, defaultStyles, graphColors, IDimFacility, IFilterKeys, IFilters, IPlotData, RemoveFilterBaseFunc } from \"models/core\";\r\nimport { DashboardFilterKeys } from \"models/mdt\";\r\nimport { PlotData } from \"plotly.js\";\r\nimport { Dialog } from \"@mui/material\";\r\nimport { DashChart } from \"components/common/DashChart\";\r\nimport { ChartIcons } from \"components/common/ChartIcons\";\r\nimport { chartDimesionsCalc } from \"../core\";\r\nimport watermark from \"../../static/qca-black.png\";\r\nimport { CreateChart } from \"components/common/CreateChart\";\r\n\r\ninterface IProps {\r\n\tplotData: {[facDiagYearKey: string]: { \"Facility\": number, \"State\": number }};\r\n\tmdtFacilityRef: IDimFacility[];\r\n\tactiveFilters: IFilters;\r\n\taddFilterFn: AddFilterBaseFunc;\r\n removeFilterFn: RemoveFilterBaseFunc;\r\n}\r\n\r\n/**\r\n * Reviews by service chart / My MDTs\r\n */\r\nexport function ThreeYearSurvivalChart(props: IProps) {\r\n\tconst { plotData, mdtFacilityRef, activeFilters } = props;\r\n\tconst [ chartType, setChartType ] = useState(\"bar\");\r\n const [ chartOrientation, setChartOrientation ] = useState(\"v\");\r\n\tconst [ fullScreenOpen, setFullScreenState ] = useState(false);\r\n \r\n\tconst chartDimensions = chartDimesionsCalc(50, 12, 4);\r\n\tconst chartTitle = \"Three Year Survival\";\r\n\tconst xtitle = (chartOrientation == \"h\" ? \"\" : \"Diagnosis Years\");\r\n\tconst ytitle = (chartOrientation == \"h\" ? \"Diagnosis Years\" : \"\");\r\n\r\n\t//Filter the survival data with the current facility+Cancer filters\r\n\tconst facName = activeFilters?.Facility?.value[0];\r\n\r\n\tlet cancerName: string = activeFilters?.PrimarySite?.parts[0];\r\n\tif (activeFilters?.PrimarySite?.parts?.length == 2) {\r\n\t\tcancerName += activeFilters?.PrimarySite?.parts[1];\r\n\t}\r\n\r\n const labels = [/*\"Pre-2011\", \"2011-2013\", \"2014-2016\",*/ \"2017-2019\"];\r\n\r\n\tlet mdtSurvival: IPlotData = {labels: [], values: []};\r\n let stateSurvival: IPlotData = {labels: [], values: []};\r\n\tif (activeFilters?.Facility?.value.length == 1 && activeFilters?.PrimarySite?.value.length == 1) { \r\n\t\tlet facId = mdtFacilityRef.find(x => x.name == facName)?.facilityId;\r\n\t\tlabels.forEach(a => {\r\n\t\t\tif (plotData[facId+a+cancerName]) {\r\n mdtSurvival.labels.push(a)\r\n mdtSurvival.values.push(plotData[facId+a+cancerName].Facility)\r\n\r\n stateSurvival.labels.push(a)\r\n stateSurvival.values.push(plotData[facId+a+cancerName].State)\r\n\t\t\t}\r\n\t\t})\r\n\t}\r\n\r\n\tconst valuesMDT = mdtSurvival.values;\r\n\tconst labelsMDT = mdtSurvival.labels;\r\n\tconst mdt = {\"name\": \"My Facility\", \"labels\": labelsMDT, \"values\": valuesMDT};\r\n\r\n const valuesState = stateSurvival.values;\r\n\tconst labelsState = stateSurvival.labels;\r\n\tconst state = {\"name\": \"Queensland\", \"labels\": labelsState, \"values\": valuesState};\r\n\r\n const showChart = mdtSurvival.values.findIndex(p => p !== 0) !== -1;\r\n\r\n\tconst tracesArray: any[] = [];\r\n\ttracesArray.push(mdt);\r\n tracesArray.push(state);\r\n\r\n\tconst traces: Partial[] = [];\r\n\r\n //Change y axis range to limit to 100% \r\n const style = defaultStyles.defaultBox;\r\n\tconst bx = chartAttrs(style.height);\r\n const styling = Object.assign({}, bx.layout)\r\n\tif (chartOrientation == \"v\") {\r\n \tstyling.yaxis = { range: [0, 110] };\r\n\t}\r\n\r\n\tif (chartOrientation == \"h\") {\r\n \tstyling.xaxis = { range: [0, 110] };\r\n\t}\r\n\r\n tracesArray?.forEach((a, i) => { \r\n\tswitch (true) {\r\n\t\t\t\tcase chartOrientation == \"v\":\r\n\t\t\t\t\ttraces.push({\r\n\t\t\t\t\t\tx: a.labels,\r\n\t\t\t\t\t\ty: a.values,\r\n\t\t\t\t\t\tname: a.name,\r\n\t\t\t\t\t\ttext: a.values.map(p => p.toString() + \"%\"),\r\n\t\t\t\t\t\ttextposition: \"outside\",\r\n\t\t\t\t\t\ttextfont: {\r\n\t\t\t\t\t\t\tsize: 12,\r\n\t\t\t\t\t\t },\r\n hovertext: a.labels,\r\n\t\t\t\t\t\thovertemplate: \"%{hovertext}
\" +\r\n \"Survival: %{text}
\" +\r\n \"\",\r\n\t\t\t\t\t\ttype: chartType,\r\n\t\t\t\t\t\torientation: chartOrientation,\r\n\t\t\t\t\t\tmarker: {},\r\n\t\t\t\t\t\tshowlegend: false,\r\n\t\t\t\t\t} as unknown as Plotly.PlotData)\r\n\t\t\t\tbreak;\r\n\r\n\t\t\t\tdefault:\r\n\t\t\t\t\ttraces.push({\r\n\t\t\t\t\t\tx: a.values,\r\n\t\t\t\t\t\ty: a.labels,\r\n\t\t\t\t\t\tname: a.name,\r\n\t\t\t\t\t\ttext: a.values.map(p => p.toString() + \"%\"),\r\n\t\t\t\t\t\ttextposition: \"outside\",\r\n\t\t\t\t\t\ttextfont: {\r\n\t\t\t\t\t\t\tsize: 12,\r\n\t\t\t\t\t\t },\r\n hovertext: a.labels,\r\n hovertemplate: \"%{hovertext}
\" +\r\n \"Survival: %{text}
\" +\r\n \"\",\r\n\t\t\t\t\t\ttype: chartType,\r\n\t\t\t\t\t\torientation: chartOrientation,\r\n\t\t\t\t\t\tmarker: {},\r\n\t\t\t\t\t\tshowlegend: false,\r\n\t\t\t\t\t} as unknown as Plotly.PlotData)\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t})\r\n\t\r\n\tconst logo = watermark;\r\n\tconst fullScreenChart =\r\n\t\t\r\n\t\t\t\t \r\n\t\t\t\t\t
\r\n\t\t\t\t\t\r\n\t\t\t\t\t
\r\n\t\t\t\t\t{}\r\n\t\t\t\t\t
\r\n\t\t\t\t\t{CreateChart(chartDimensions.fullScreenChartHeight * 1.2,\r\n\t\t\t\t\t\t\t\t chartDimensions.fullScreenChartWidth,\r\n\t\t\t\t\t\t\t\t chartDimensions.fullScreenPaperHeight,\r\n\t\t\t\t\t\t\t\t chartOrientation,\r\n\t\t\t\t\t\t\t\t chartType, \r\n\t\t\t\t\t\t\t\t showChart, \r\n\t\t\t\t\t\t\t\t xtitle, \r\n\t\t\t\t\t\t\t\t ytitle, \r\n\t\t\t\t\t\t\t\t mdtSurvival.labels,\r\n\t\t\t\t\t\t\t\t mdtSurvival.values, \r\n\t\t\t\t\t\t\t\t traces,\r\n null,\r\n styling)}\r\n {(chartType !== \"table\" ?
\r\n
\r\n
\r\n
My Facility
\r\n
\r\n
\r\n
\r\n
Queensland
\r\n
\r\n \t
: null)}\r\n\t\t\t\t
\r\n\t\t\r\n\r\n\r\n\treturn (\r\n\t\t
\r\n\t\t\r\n\t\t\r\n\t\t\t{CreateChart(chartDimensions.chartHeight*1.05,\r\n\t\t\t\t\t\t\t\t chartDimensions.chartWidth,\r\n\t\t\t\t\t\t\t\t chartDimensions.paperHeight,\r\n\t\t\t\t\t\t\t\t chartOrientation,\r\n\t\t\t\t\t\t\t\t chartType, \r\n\t\t\t\t\t\t\t\t showChart, \r\n\t\t\t\t\t\t\t\t xtitle, \r\n\t\t\t\t\t\t\t\t ytitle, \r\n\t\t\t\t\t\t\t\t mdtSurvival.labels,\r\n\t\t\t\t\t\t\t\t mdtSurvival.values, \r\n\t\t\t\t\t\t\t\t traces,\r\n null,\r\n styling)}\r\n\t\t\t{fullScreenChart}\r\n {(chartType !== \"table\" ?
\r\n
\r\n
\r\n
My Facility
\r\n
\r\n
\r\n
\r\n
Queensland
\r\n
\r\n \t
: null)}\r\n {(!showChart && activeFilters?.Facility?.value.length !== 1 && activeFilters?.PrimarySite?.value.length !== 1 ? \r\n
Please select a single Facility and Cancer to generate data
: null)}\r\n\t\t
\r\n\t\t
\r\n\t);\r\n}\r\n","import React, { useState } from \"react\";\r\nimport { AddFilterBaseFunc, chartAttrs, defaultStyles, IDimFacility, IFilterKeys, IFilters, IPlotData, RemoveFilterBaseFunc } from \"models/core\";\r\nimport { DashboardFilterKeys } from \"models/mdt\";\r\nimport { PlotData } from \"plotly.js\";\r\nimport { Dialog } from \"@mui/material\";\r\nimport { DashChart } from \"components/common/DashChart\";\r\nimport { ChartIcons } from \"components/common/ChartIcons\";\r\nimport { chartDimesionsCalc } from \"../core\";\r\nimport watermark from \"../../static/qca-black.png\";\r\nimport { CreateChart } from \"components/common/CreateChart\";\r\n\r\ninterface IProps {\r\n\tplotData: {[facCancerKey: string]: { survivalTime: string, noMdtKMSurvival: number, stateKMSurvival: number }};\r\n\tmdtFacilityRef: IDimFacility[];\r\n\tactiveFilters: IFilters;\r\n\taddFilterFn: AddFilterBaseFunc;\r\n removeFilterFn: RemoveFilterBaseFunc;\r\n}\r\n\r\n/**\r\n * Reviews by service chart / My MDTs\r\n */\r\nexport function KMSurvivalChart(props: IProps) {\r\n\tconst { plotData, mdtFacilityRef, activeFilters } = props;\r\n\tconst [ chartType, setChartType ] = useState(\"scatter\");\r\n const [ chartOrientation, setChartOrientation ] = useState(\"v\");\r\n\tconst [ fullScreenOpen, setFullScreenState ] = useState(false);\r\n \r\n\tconst chartDimensions = chartDimesionsCalc(50, 12, 12);\r\n\tconst chartTitle = \"KM Survival\";\r\n\tconst xtitle = (chartOrientation == \"h\" ? \"Survival Rate (%)\" : \"Years\");\r\n\tconst ytitle = (chartOrientation == \"h\" ? \"Years\" : \"Survival Rate (%)\");\r\n\r\n\t//Filter the survival data with the current mdt+Cancer filters\r\n\t//Get the MDT name from current filters\r\n\tconst facName = activeFilters?.Facility?.value[0];\r\n\r\n //Get the cancer label based on current filters \r\n\tlet cancerName: string = activeFilters?.PrimarySite?.parts[0];\r\n\t//Check if at second level in hierarchy, if so add this also to the cancer name \r\n\tif (activeFilters?.PrimarySite?.parts?.length == 2) {\r\n\t\tcancerName += activeFilters?.PrimarySite?.parts[1];\r\n\t}\r\n\r\n\tlet mdtSurvival: IPlotData = {labels: [], values: []};\r\n let stateSurvival: IPlotData = {labels: [], values: []};\r\n\r\n\t//Only if there is only one MDT selected and only one cancer site selected \r\n\tif (activeFilters?.Facility?.value.length == 1 && activeFilters?.PrimarySite?.value.length == 1) { \r\n \r\n\t\t//Get MDTID from the MDT name\r\n\t\tlet facId = mdtFacilityRef.find(x => x.name == facName)?.facilityId;\r\n const prefix = facId+cancerName+\"|\";\r\n\r\n //Extract labels (survival time)\r\n let labels: string[] = [];\r\n for (const key in plotData) {\r\n if (Object.prototype.hasOwnProperty.call(plotData, key)) {\r\n if (key.startsWith(prefix)) {\r\n labels.push(key.substring((key.indexOf(\"|\")+1)));\r\n }\r\n }\r\n }\r\n \r\n\t\t//Use labels to extract the values\r\n labels.forEach(a => {\r\n\t\t\tif (plotData[facId+cancerName+\"|\"+a]) {\r\n mdtSurvival.labels.push(a)\r\n mdtSurvival.values.push(plotData[facId+cancerName+\"|\"+a].noMdtKMSurvival)\r\n\r\n stateSurvival.labels.push(a)\r\n stateSurvival.values.push(plotData[facId+cancerName+\"|\"+a].stateKMSurvival)\r\n\t\t\t}\r\n\t\t})\r\n }\r\n\r\n\tconst valuesMDT = mdtSurvival.values;\r\n\tconst labelsMDT = mdtSurvival.labels;\r\n\tconst mdt = {\"name\": \"My Facility\", \"labels\": labelsMDT, \"values\": valuesMDT};\r\n\r\n const valuesState = stateSurvival.values;\r\n\tconst labelsState = stateSurvival.labels;\r\n\tconst state = {\"name\": \"Queensland\", \"labels\": labelsState, \"values\": valuesState};\r\n\r\n const showChart = mdtSurvival.values.length > 0;\r\n\r\n\tconst tracesArray: any[] = [];\r\n\ttracesArray.push(mdt);\r\n tracesArray.push(state);\r\n\r\n\tconst traces: Partial[] = [];\r\n\r\n tracesArray?.forEach((a, i) => { \r\n\r\n\t\t//Ensure labels are read in as numbers then sort in ascending order \r\n let xs: number[] = a.labels.map(x => {\r\n return Number(x);\r\n })\r\n xs.sort((a,b)=>a-b);\r\n\r\n\t\t//Use the order of the labels to assign the values in the correct order \r\n let ys: number[] = new Array(xs.length)\r\n for (var x=0; x {\r\n let years = Math.floor(x);\r\n let months = Math.round((x % 1)*12)\r\n\r\n survivalLabel.push(years + \" years, \" + months + \" months\")\r\n }) \r\n\r\n traces.push({\r\n name: a.name,\r\n mode: \"text+lines\",\r\n x: xs,\r\n y: ys,\r\n hovertext: survivalLabel.map(x => x),\r\n hovertemplate: \"%{hovertext}
\" +\r\n \"%{fullData.name}: %{y:,}%
\" +\r\n \"\",\r\n type: chartType, \r\n orientation: \"v\",\r\n marker: {},\r\n } as unknown as Plotly.PlotData);\r\n })\r\n\r\n //Custom styling: Change y axis range to limit to 100% and just show full year labels \r\n const style = defaultStyles.defaultBox;\r\n\tconst bx = chartAttrs(style.height);\r\n const styling = Object.assign({}, bx.layout)\r\n\tif (chartOrientation == \"v\") {\r\n \tstyling.yaxis = { range: [0, 110] };\r\n\t}\r\n\r\n\tif (chartOrientation == \"h\") {\r\n \tstyling.xaxis = { range: [0, 110] };\r\n\t}\r\n\r\n styling.xaxis = { automargin:true, tick: 0, autotick: false, dtick: 1, autotypenumbers: 'strict', title: \"Years\", \r\n fixedrange: true, zeroline: false, rangemode: \"tozero\"\r\n };\r\n\r\n\r\n\t//Full screen chart\r\n\tconst logo = watermark;\r\n\tconst fullScreenChart =\r\n\t\t\r\n\t\t\t\t \r\n\t\t\t\t\t
\r\n\t\t\t\t\t\r\n\t\t\t\t\t
\r\n\t\t\t\t\t{}\r\n\t\t\t\t\t
\r\n\t\t\t\t\t{CreateChart(chartDimensions.fullScreenChartHeight * 1.2,\r\n\t\t\t\t\t\t\t\t chartDimensions.fullScreenChartWidth,\r\n\t\t\t\t\t\t\t\t chartDimensions.fullScreenPaperHeight,\r\n\t\t\t\t\t\t\t\t chartOrientation,\r\n\t\t\t\t\t\t\t\t chartType, \r\n\t\t\t\t\t\t\t\t showChart, \r\n\t\t\t\t\t\t\t\t xtitle, \r\n\t\t\t\t\t\t\t\t ytitle, \r\n\t\t\t\t\t\t\t\t mdtSurvival.labels,\r\n\t\t\t\t\t\t\t\t mdtSurvival.values, \r\n\t\t\t\t\t\t\t\t traces,\r\n null,\r\n styling)}\r\n\t\t\t\t
\r\n\t\t\r\n\r\n\r\n\treturn (\r\n\t\t
\r\n\t \t\r\n\t\t\r\n\t\t\t{CreateChart(chartDimensions.chartHeight*1.05,\r\n\t\t\t\t\t\t\t\t chartDimensions.chartWidth,\r\n\t\t\t\t\t\t\t\t chartDimensions.paperHeight,\r\n\t\t\t\t\t\t\t\t chartOrientation,\r\n\t\t\t\t\t\t\t\t chartType, \r\n\t\t\t\t\t\t\t\t showChart, \r\n\t\t\t\t\t\t\t\t xtitle, \r\n\t\t\t\t\t\t\t\t ytitle, \r\n\t\t\t\t\t\t\t\t mdtSurvival.labels,\r\n\t\t\t\t\t\t\t\t mdtSurvival.values, \r\n\t\t\t\t\t\t\t\t traces,\r\n null,\r\n styling)}\r\n\t\t\t{fullScreenChart}\r\n {(!showChart && activeFilters?.Facility?.value.length !== 1 && activeFilters?.PrimarySite?.value.length !== 1 ? \r\n
Please select a single Facility and Cancer to generate data
: null)}\r\n\t\t
\r\n\t \t
\r\n\t);\r\n}\r\n","import React, { useState } from \"react\";\r\nimport Plot from \"react-plotly.js\";\r\n\r\nimport { AddFilterBaseFunc, chartAttrs, defaultConfig, defaultStyles, graphColors, hierarchyFilterFactory, IFilterKeys, IFilters, RemoveFilterBaseFunc } from \"models/core\";\r\nimport { DashboardFilterKeys } from \"models/mdt\";\r\nimport { ReviewsByPeriodHierarchy, PatientsByPeriodHierarchy } from \"models/mdt/plotdata\";\r\nimport { PlotData, PlotType } from \"plotly.js\";\r\nimport { Dialog, Grid } from \"@mui/material\";\r\nimport { addHierarchyFilterFactory } from \"helpers/filterHelper\";\r\nimport { HierarchyBreadcrumb } from \"components/common/HierarchyBreadcrumb\";\r\nimport { DashTable } from \"components/common/DashTable\";\r\nimport { DashChart } from \"components/common/DashChart\";\r\nimport { ChartIcons } from \"components/common/ChartIcons\";\r\nimport { chartDimesionsCalc } from \"../core\";\r\nimport watermark from \"../../static/qca-black.png\";\r\nimport { CreateChart } from \"components/common/CreateChart\";\r\n\r\ninterface IProps {\r\n\tplotDataPatients: PatientsByPeriodHierarchy.IHierarchyPlotData;\r\n activeFilters: IFilters;\r\n\t//addFilterFn: (e: any, filterKey: string, getY: (p) => string) => void;\r\n\taddFilterFn: AddFilterBaseFunc;\r\n removeFilterFn: RemoveFilterBaseFunc;\r\n}\r\n\r\n/**\r\n * Reviews by service chart / My MDTs\r\n */\r\nexport function NoMDTPatientsTrendChart(props: IProps) {\r\n\tconst { plotDataPatients, activeFilters, addFilterFn, removeFilterFn } = props;\r\n\tconst hierarchy = plotDataPatients;\r\n\r\n\tlet valuesPOriginal = [];\r\n\tlet labelsPOriginal =[];\r\n\r\n\tlet valuesPReversed = [];\r\n\tlet labelsPReversed =[];\r\n\r\n\tlet Patients = {};\r\n\r\n\t//If a diagnosis year is selected, trim the values to only show after that year \r\n\tif (activeFilters.DiagYear?.value && !activeFilters.Year?.value && Number(activeFilters.DiagYear.value.sort()[0]) >= 2010) {\r\n\r\n\t\tconst labelIndexP = hierarchy.labels.findIndex(a => a == activeFilters.DiagYear.value.sort()[0]);\r\n\r\n\t\tvaluesPOriginal = hierarchy.values.slice(labelIndexP);\r\n\t\tlabelsPOriginal = hierarchy.labels.slice(labelIndexP);\r\n\t\tvaluesPReversed = hierarchy.values.slice(labelIndexP).slice().reverse();\r\n\t\tlabelsPReversed = hierarchy.labels.slice(labelIndexP).slice().reverse();\r\n\t\tPatients = {\"name\": \"Patients\", \"labels\": labelsPOriginal, \"labelsReversed\": labelsPReversed, \"values\": valuesPOriginal, \"valuesReversed\": valuesPReversed};\r\n\r\n\t} else {\r\n\t\r\n\t\tvaluesPOriginal = hierarchy.values;\r\n\t\tlabelsPOriginal = hierarchy.labels;\r\n\t\tvaluesPReversed = hierarchy.values.slice().reverse();\r\n\t\tlabelsPReversed = hierarchy.labels.slice().reverse();\r\n\t\tPatients = {\"name\": \"Patients\", \"labels\": labelsPOriginal, \"labelsReversed\": labelsPReversed, \"values\": valuesPOriginal, \"valuesReversed\": valuesPReversed};\r\n\t}\r\n\r\n\tconst tracesArray: any[] = [];\r\n\ttracesArray.push(Patients);\r\n\r\n const [ chartType, setChartType ] = useState(\"scatter\");\r\n const [ chartOrientation, setChartOrientation ] = useState(\"v\");\r\n const [ fullScreenOpen, setFullScreenState ] = useState(false);\r\n\t\r\n\tconst showChart = valuesPOriginal.length > 0;\r\n\tconst filterKey = DashboardFilterKeys.Year.key;\r\n\tconst filterFn = addHierarchyFilterFactory(addFilterFn, filterKey, hierarchy, (chartOrientation ==\"h\" ? p => p.y.toString() : p => p.x.toString()));\r\n\tconst chartDimensions = chartDimesionsCalc(50, 12, 4);\r\n\tconst textFn = String;\r\n\r\n\tconst xtitle = (chartOrientation == \"v\" ? \"Admission Date\" : \"Number of Patients\");\r\n\tconst ytitle = (chartOrientation ==\"v\" ? \"Number of Patients\" : \"Admission Date\");\r\n\tconst chartTitle = \"Patients treated at my facility with no evidence of MDT presentation\";\r\n\r\n\tconst traces: Partial[] = [];\r\n\r\n\t\ttracesArray?.forEach((a, i) => {\r\n\t\t\tswitch (true) {\r\n\t\t\t\tcase chartOrientation == \"v\":\r\n\t\t\t\t\ttraces.push({\r\n\t\t\t\t\t\tx: a.labels,\r\n\t\t\t\t\t\ty: a.values,\r\n\t\t\t\t\t\tname: a.name,\r\n\t\t\t\t\t\ttext: a.values.map(textFn),\r\n\t\t\t\t\t\ttextposition: (chartType == \"bar\" ? \"outside\" : \"none\"),\r\n\t\t\t\t\t\ttextfont: {\r\n\t\t\t\t\t\t\tsize: 12,\r\n\t\t\t\t\t\t },\r\n\t\t\t\t\t\thovertext: a.labels,\r\n\t\t\t\t\t\thovertemplate: \"%{hovertext}
\" +\r\n\t\t\t\t\t\t\t\t\t\"Patients: %{y:,}
\" +\r\n\t\t\t\t\t\t\t\t\t\"\" + \r\n\t\t\t\t\t\t\t\t\t\"
\" +\r\n\t\t\t\t\t\t\t\t\t\"To view specific year(s):
\" +\r\n\t\t\t\t\t\t\t\t\t\"Click and drag on years to select\",\r\n\t\t\t\t\t\ttype: chartType,\r\n\t\t\t\t\t\torientation: chartOrientation,\r\n\t\t\t\t\t\tmarker: {},\r\n\t\t\t\t\t\tshowlegend: false,\r\n\t\t\t\t\t} as unknown as Plotly.PlotData)\r\n\t\t\t\tbreak;\r\n\r\n\t\t\t\tcase chartOrientation == \"h\":\r\n\t\t\t\t\ttraces.push({\r\n\t\t\t\t\t\tx: a.valuesReversed,\r\n\t\t\t\t\t\ty: a.labelsReversed,\r\n\t\t\t\t\t\tname: a.name, \r\n\t\t\t\t\t\ttext: a.valuesReversed.map(textFn),\r\n\t\t\t\t\t\ttextposition: (chartType == \"bar\" ? \"outside\" : \"none\"),\r\n\t\t\t\t\t\ttextfont: {\r\n\t\t\t\t\t\t\tsize: 12,\r\n\t\t\t\t\t\t },\r\n\t\t\t\t\t\thovertext: a.labelsReversed,\r\n\t\t\t\t\t\thovertemplate: \"%{hovertext}
\" +\r\n\t\t\t\t\t\t\t\t\t\"Patients: %{x:,}
\" +\r\n\t\t\t\t\t\t\t\t\t\"\" + \r\n\t\t\t\t\t\t\t\t\t\"
\" +\r\n\t\t\t\t\t\t\t\t\t\"To view specific year(s):
\" +\r\n\t\t\t\t\t\t\t\t\t\"Click and drag on years to select\",\r\n\t\t\t\t\t\ttype: chartType,\r\n\t\t\t\t\t\torientation: chartOrientation,\r\n\t\t\t\t\t\tmarker: {},\r\n\t\t\t\t\t\tshowlegend: false,\r\n\t\t\t\t\t} as unknown as Plotly.PlotData)\r\n\t\t\t\tbreak;\r\n\r\n\t\t}\r\n\t\t});\r\n\r\n\tconst toolTipText = [\"Presentations:\", \"A count of presentations to MDT where a patient can present multiple times\", \r\n\t\t\t\t\t\t\t\"Patients:\", \"A unique count of patients presented to MDT\", \r\n\t\t\t\t\t\t\t\"Re-presentation rate:\", \"The rate at which a patient presents more than once\"];\r\n\r\n\r\n\tconst logo = watermark;\r\n\tconst fullScreenChart =\r\n\t\t\r\n\t\t\t\t \r\n\t\t\t\t\t
\r\n\t\t\t\t\t\r\n\t\t\t\t\t
\r\n\t\t\t\t\t{ }\r\n\t\t\t\t\t
\r\n\t\t\t\t\t{CreateChart(chartDimensions.fullScreenChartHeight,\r\n\t\t\t\t\t\t\t\t chartDimensions.fullScreenChartWidth,\r\n\t\t\t\t\t\t\t\t chartDimensions.fullScreenPaperHeight,\r\n\t\t\t\t\t\t\t\t chartOrientation,\r\n\t\t\t\t\t\t\t\t chartType, \r\n\t\t\t\t\t\t\t\t showChart, \r\n\t\t\t\t\t\t\t\t xtitle, \r\n\t\t\t\t\t\t\t\t ytitle, \r\n\t\t\t\t\t\t\t\t labelsPOriginal,\r\n\t\t\t\t\t\t\t\t valuesPOriginal, \r\n\t\t\t\t\t\t\t\t traces, \r\n\t\t\t\t\t\t\t\t filterFn,\r\n\t\t\t\t\t\t\t\t )}\r\n\t\t\t\t
\r\n\t\t\r\n\r\n\tconst breadcrumb = (\r\n\t\t\r\n\t\t);\r\n\t\r\n\treturn (\r\n\t\t
\r\n\t\t\r\n \r\n\t\t\r\n\t\t\t{CreateChart(chartDimensions.chartHeight,\r\n\t\t\t\t\t\t\t\t chartDimensions.chartWidth,\r\n\t\t\t\t\t\t\t\t chartDimensions.paperHeight,\r\n\t\t\t\t\t\t\t\t chartOrientation,\r\n\t\t\t\t\t\t\t\t chartType, \r\n\t\t\t\t\t\t\t\t showChart, \r\n\t\t\t\t\t\t\t\t xtitle, \r\n\t\t\t\t\t\t\t\t ytitle, \r\n\t\t\t\t\t\t\t\t labelsPOriginal,\r\n\t\t\t\t\t\t\t\t valuesPOriginal, \r\n\t\t\t\t\t\t\t\t traces, \r\n\t\t\t\t\t\t\t\t filterFn,\r\n\t\t\t\t\t\t\t\t )} \r\n {fullScreenChart}\r\n\t\t\r\n\t\t
\r\n\t);\r\n}\r\n","import * as React from \"react\"\r\nimport * as MDT from \"models/noMdt\";\r\nimport { AppContext } from \"AppContext\";\r\nimport { ActionTypes } from \"reducer/actions\";\r\nimport { FormControlLabel, Grid, Switch } from \"@mui/material\";\r\nimport { PatientsBySiteChart } from \"charts/mdt/PatientsBySiteChart\";\r\nimport { FilterContext } from \"models/core/filter\";\r\nimport { AgeAtDiagnosisChart } from \"charts/common/AgeAtDiagnosisChart\";\r\nimport { SexChart } from \"charts/common/SexChart\";\r\nimport { ECOGChart } from \"charts/common/ECOGChart\";\r\nimport { ComorbiditiesChart } from \"charts/common/ComorbiditiesChart\";\r\nimport { FirstNationsStatusChart } from \"charts/common/FirstNationsStatusChart\";\r\nimport { SESChart } from \"charts/common/SESChart\";\r\nimport { RemotenessChart } from \"charts/mdt/RemotenessChart\";\r\nimport { FirstTreatmentChart } from \"charts/noMdt/FirstTreatmentChart\";\r\nimport { Link } from \"react-scroll\";\r\nimport { DashChip } from \"components/common/DashChips\";\r\nimport { OneYearSurvivalChart } from \"charts/noMdt/OneYearSurvivalChart\";\r\nimport { ThreeYearSurvivalChart } from \"charts/noMdt/ThreeYearSurvivalChart\";\r\nimport { FiveYearSurvivalChart } from \"charts/noMdt/FiveYearSurvivalChart\";\r\nimport { KMSurvivalChart } from \"charts/noMdt/KMSurvivalChart\";\r\nimport { NoMDTPatientsTrendChart } from \"charts/noMdt/NoMDTPatientsTrendChart\";\r\nimport Loader from \"pages/shared/pageloader\";\r\n\r\n\r\nexport function NoMdtDashboard() {\r\n\tconst { state, dispatch } = React.useContext(AppContext);\r\n\r\n\tconst [showFilterChips, setFilterChips] = React.useState(true);\r\n\r\n\tconst addFilter: MDT.AddFilterFunc = async (key: keyof typeof MDT.DashboardFilterKeys, value: string | string[], context?: FilterContext, labelOverride?: string) => {\r\n\t\tconst filteredDashboard = await MDT.computeChartData(MDT.addFilter(state.page.dashboard as MDT.IMDTDashboard)(key, value, context, labelOverride)); // state = what the other filter function returns \r\n\t\tdispatch({ type: ActionTypes.UserClickedOnChart, payload: filteredDashboard });\r\n\t}\r\n\r\n\tconst removeFilter: MDT.RemoveFilterFunc = async (key: keyof typeof MDT.DashboardFilterKeys, value?: string | number) => {\r\n\r\n\t\tconst filteredDashboard = await MDT.computeChartData(MDT.removeFilter(state.page.dashboard as MDT.IMDTDashboard, key, value));\r\n\t\tdispatch({ type: ActionTypes.UserClickedOnChart, payload: filteredDashboard });\r\n\t}\r\n\r\n\tReact.useEffect(() => {\r\n\t\tdispatch({ type: ActionTypes.UserWantsToLoadMdtDashboard });\r\n\t\tMDT.loadMdtDashboard(state.page.dashboard as MDT.IMDTDashboard)\r\n\t\t\t.then((value) => {\r\n\t\t\t\tdispatch({ type: ActionTypes.UserLoadedMdtDashboard, payload: value })\r\n\t\t\t});\r\n\t\treturn () => {\r\n\t\t\tMDT.closeMdtDashboard();\r\n\t\t}\r\n\t}, []);\r\n\r\n\tReact.useEffect(() => {\r\n\r\n\t\tconst facility = state.page.dashboard.filters[\"Facility\"];\r\n\t\tconst primarySite = state.page.dashboard.filters[\"PrimarySite\"];\r\n\r\n\t\tif (!facility || !primarySite)\r\n\t\t\treturn;\r\n\r\n\t\tif (facility.value.length != 1 || primarySite.value.length != 1)\r\n\t\t\treturn;\r\n\r\n\t\tMDT.loadSurvivalDashboard(state.page.dashboard as MDT.IMDTDashboard, facility.value[0], primarySite.value[0], state.page.dashboard.filters)\r\n\t\t\t.then((value) => {\r\n\t\t\t\t//dispatch({ type: ActionTypes.UserLoadedMdtDashboard, payload: value })\r\n\t\t\t\tdispatch({ type: ActionTypes.UserClickedOnChart, payload: value })\r\n\t\t\t});\r\n\r\n\t\t// return DashWorker.fetchSurvival(all);\r\n\t}, [state.page.dashboard.filters])\r\n\r\n\r\n\tif (state.page.loading || !state.page.dashboard.chartData)\r\n\t\treturn \r\n\r\n\t//Create function to show/hide filter chips\r\n\tconst toggleChips = () => {\r\n\t\tif (showFilterChips) {\r\n\t\t\tsetFilterChips(false);\r\n\t\t} else {\r\n\t\t\tsetFilterChips(true);\r\n\t\t}\r\n\t};\r\n\r\n\tlet activeFiltersArray = [];\r\n\tlet filterArray = [];\r\n\tlet chips = [];\r\n\r\n\tfor (const key in state.page.dashboard.filters) {\r\n\t\tif (Object.prototype.hasOwnProperty.call(state.page.dashboard.filters, key)) {\r\n\t\t\tactiveFiltersArray.push({ \"key\": key, \"values\": state.page.dashboard.filters[key].value, \"parts\": state.page.dashboard.filters[key].parts });\r\n\t\t}\r\n\t}\r\n\r\n\tfor (const key in MDT.DashboardFilterKeys) {\r\n\t\tif (Object.prototype.hasOwnProperty.call(MDT.DashboardFilterKeys, key)) {\r\n\t\t\tfilterArray.push({ \"key\": key, \"label\": MDT.DashboardFilterKeys[key].label });\r\n\t\t}\r\n\t}\r\n\r\n\tactiveFiltersArray.forEach(a => {\r\n\t\ta.values.forEach(b => {\r\n\t\t\tchips.push( id.key == a.key).label}\r\n\t\t\t\tfilterValue={b}\r\n\t\t\t\tfilterId={a.key}\r\n\t\t\t\tfilterParent={(a.parts.length > 1 ? a.parts[0] : null)}\r\n\t\t\t/>\r\n\t\t\t)\r\n\t\t})\r\n\t})\r\n\r\n\tconst mdtData = state.page.dashboard.chartData as MDT.IChartData;\r\n\r\n\tconst dashboard =\r\n\t\t<>\r\n\t\t\t
\r\n\t\t\t\t\r\n\r\n\t\t\t\t
\r\n\t\t\t\t\t toggleChips()}\r\n\t\t\t\t\t\t\t/>\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t\tlabel=\"Show Filter Selections\"\r\n\t\t\t\t\t/>\r\n\t\t\t\t
\r\n\r\n\t\t\t\t{(showFilterChips ?
\r\n\t\t\t\t\t{chips}\r\n\t\t\t\t
: null)}\r\n\t\t\t
\r\n\r\n\t\t\t\r\n\r\n\t\t\t\t\r\n\t\t\t\t\t 991 ? 4 : 11}>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t 991 ? 4 : 11}>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t 991 ? 4 : 11}>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\r\n\r\n\t\t\t\t{\r\n\t\t\t\t\t//Patient Characteristics\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t

Patient Characteristics

\r\n\t\t\t\t\t
\r\n\r\n\t\t\t\t\t 991 ? 3 : 11}>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t 991 ? 3 : 11}>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t 991 ? 3 : 11}>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t 991 ? 3 : 11}>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t 991 ? 3 : 11}>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t 991 ? 3 : 11}>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t 991 ? 3 : 11}>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t{/* 991 ? 3 : 11}>\r\n\t\t\t\t\r\n\t\t\t\t */}\r\n\t\t\t\t
\r\n\r\n\t\t\t\t{\r\n\t\t\t\t\t//Outcomes\r\n\t\t\t\t}\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t

Outcomes

\r\n\t\t\t\t\t
\r\n\r\n\t\t\t\t\t 991 ? 4 : 11}>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t 991 ? 4 : 11}>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t{/* 991 ? 4 : 11}>\r\n\t\t\t\t\r\n\t\t\t\t */}\r\n\r\n\t\t\t\t\t 991 ? 12 : 11}>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t
\r\n\r\n\t\t\t
\r\n\t\t\r\n\r\n\treturn (\r\n\t\tdashboard\r\n\t)\r\n\r\n\r\n} ","import * as React from \"react\"\r\nimport * as NoMDT from \"models/noMdt\";\r\nimport { AppContext } from \"AppContext\";\r\nimport { ActionTypes } from \"reducer/actions\";\r\nimport { Box, Button, Typography } from \"@mui/material\";\r\nimport { FilterContext } from \"models/core/filter\";\r\nimport Select from \"react-select\";\r\nimport { exportMdtPatients } from \"models/noMdt/worker\";\r\nimport * as fileHelper from \"helpers/fileHelper\";\r\nimport Loader from \"pages/shared/filterloader\";\r\n\r\nexport function NoMdtFilters() {\r\n\tconst { state, dispatch } = React.useContext(AppContext);\r\n\r\n\tconst addFilter: NoMDT.AddFilterFunc = async (key: keyof typeof NoMDT.DashboardFilterKeys, value: string | string[], context?: FilterContext, labelOverride?: string) => {\r\n\t\tconst filteredDashboard = await NoMDT.computeChartData(NoMDT.addFilter(state.page.dashboard as NoMDT.IMDTDashboard)(key, value, context, labelOverride)); // state = what the other filter function returns \r\n\t\tdispatch({ type: ActionTypes.UserClickedOnChart, payload: filteredDashboard });\r\n\t}\r\n\r\n\tconst removeFilter: NoMDT.RemoveFilterFunc = async (key: keyof typeof NoMDT.DashboardFilterKeys) => {\r\n\r\n\t\tconst filteredDashboard = await NoMDT.computeChartData(NoMDT.removeFilter(state.page.dashboard as NoMDT.IMDTDashboard, key));\r\n\t\tdispatch({ type: ActionTypes.UserClickedOnChart, payload: filteredDashboard });\r\n\t}\r\n\r\n\tif (state.page.loading)\r\n\t\treturn ;\r\n\r\n\tconst noMDTData = state.page.dashboard.chartData as NoMDT.IChartData;\r\n\r\n\t//HHS \r\n\t//HHS Options\r\n\tconst hhsOptions: any[] = [];\r\n\tnoMDTData?.hhses.map(p => {\r\n\t\thhsOptions.push({ label: p.name, value: p.id });\r\n\t})\r\n\r\n\t//Filtered HHSes\r\n\tlet hhsSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.HHS?.value?.map(p => {\r\n\t\thhsSelections.push({ label: p, value: hhsOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\t//Add code to be able to filter list of facilities to a chosen HHS\r\n\tlet selectedHHSIds = [];\r\n\tif (hhsSelections.length > 0) {\r\n\t\tselectedHHSIds = hhsSelections.map(a =>\r\n\t\t\ta.value);\r\n\t}\r\n\r\n\t//Facility \r\n\t//Facility Options\r\n\tconst facilityOptions: any[] = [];\r\n\tif (hhsSelections.length > 0) {\r\n\t\tnoMDTData?.facilities.filter(a => selectedHHSIds.includes(a.hhsId)).map(p => {\r\n\t\t\tfacilityOptions.push({ label: p.name, value: p.facilityId });\r\n\t\t})\r\n\t} else {\r\n\t\tnoMDTData?.facilities.map(p => {\r\n\t\t\tfacilityOptions.push({ label: p.name, value: p.facilityId });\r\n\t\t});\r\n\t}\r\n\r\n\t//Filtered facilities\r\n\tlet facilitySelections: any[] = [];\r\n\tstate.page.dashboard.filters?.Facility?.value?.map(p => {\r\n\t\tfacilitySelections.push({ label: p, value: facilityOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\tlet { path } = noMDTData.patientsByPeriod;\r\n\tlet parts = FilterContext.fromPath(path).parts;\r\n\r\n\t//Months\r\n\t//Options\r\n\tconst monthOptions: any[] = [];\r\n\tnoMDTData?.month.map(p => {\r\n\t\tmonthOptions.push({ label: p.name, value: p.id });\r\n\t})\r\n\r\n\t//Filtered MDT months\r\n\tlet admMonthSelections: any[] = [];\r\n\tif (parts.length > 1) {\r\n\t\tparts[1].replace(`[`, ``).replace(`]`, ``).split('; ').map(p => {\r\n\t\t\tadmMonthSelections.push({\r\n\t\t\t\tlabel: monthOptions.find(a => a.label.substring(0, 3) == p.replace(\" \", \"\"))?.label,\r\n\t\t\t\tvalue: monthOptions.find(a => a.label.substring(0, 3) == p.replace(\" \", \"\"))?.value\r\n\t\t\t});\r\n\t\t})\r\n\t}\r\n\r\n\t//Years\r\n\t//Admission year options\r\n\tconst admYearOptions: any[] = [];\r\n\tnoMDTData?.year.map(p => {\r\n\t\tif (p.id >= 2010 && p.name != \"Unknown\") {\r\n\t\t\tadmYearOptions.push({ label: p.name, value: p.id });\r\n\t\t}\r\n\t})\r\n\r\n\t//Filtered year selections\r\n\tlet admYearSelections: any[] = [];\r\n\tif (parts.length > 0) {\r\n\t\tparts[0].replace(`[`, ``).replace(`]`, ``).split(';').map(p => {\r\n\t\t\tadmYearSelections.push({\r\n\t\t\t\tlabel: p.replace(\" \", \"\"),\r\n\t\t\t\tvalue: noMDTData?.year.find(a => a.name == p.replace(\" \", \"\"))?.id\r\n\t\t\t});\r\n\t\t})\r\n\t}\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t\r\n\t\t\t\tHHS\r\n\t\t\t\t {\r\n\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\tremoveFilter(NoMDT.DashboardFilterKeys.HHS.key);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\taddFilter(NoMDT.DashboardFilterKeys.HHS.key, filterValues);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t}),\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t\r\n\r\n\r\n\t\t\t\r\n\t\t\t\tFacility\r\n\t\t\t\t {\r\n\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\tremoveFilter(NoMDT.DashboardFilterKeys.Facility.key);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\taddFilter(NoMDT.DashboardFilterKeys.Facility.key, filterValues);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t}),\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t\r\n\r\n\t\t\t\r\n\t\t\t\tAdmission Year\r\n\t\t\t\t {\r\n\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\t\t\t\t\t\tfilterValues.sort();\r\n\r\n\t\t\t\t\t\tif (admYearSelections.length > 0) {\r\n\t\t\t\t\t\t\tlet context = path && FilterContext.fromPath(path) || new FilterContext();\r\n\t\t\t\t\t\t\tcontext.parts = [];\r\n\r\n\t\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\t\tremoveFilter(NoMDT.DashboardFilterKeys.Year.key);\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\taddFilter(NoMDT.DashboardFilterKeys.Year.key, filterValues, context);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\tconst context = path && FilterContext.fromPath(path) || new FilterContext();\r\n\t\t\t\t\t\t\taddFilter(NoMDT.DashboardFilterKeys.Year.key, filterValues, context);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t}),\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t\r\n\r\n\t\t\t{(admYearSelections && admYearSelections.length == 1 ?\r\n\t\t\t\t\r\n\t\t\t\t\tAdmission Month\r\n\t\t\t\t\t {\r\n\t\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label.substring(0, 3)));\r\n\r\n\t\t\t\t\t\t\tif (parts.length > 1) {\r\n\t\t\t\t\t\t\t\tlet context = path && FilterContext.fromPath(path) || new FilterContext();\r\n\t\t\t\t\t\t\t\tcontext.parts = [context.parts[0]];\r\n\r\n\t\t\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\t\t\tlet context = path && FilterContext.fromPath(path) || new FilterContext();\r\n\t\t\t\t\t\t\t\t\tcontext.parts = [context.parts[0]];\r\n\t\t\t\t\t\t\t\t\taddFilter(NoMDT.DashboardFilterKeys.Year.key, [], context);\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\taddFilter(NoMDT.DashboardFilterKeys.Year.key, filterValues, context);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\tconst context = path && FilterContext.fromPath(path) || new FilterContext();\r\n\t\t\t\t\t\t\t\taddFilter(NoMDT.DashboardFilterKeys.Year.key, filterValues, context);\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t}}\r\n\t\t\t\t\t/>\r\n\t\t\t\t\r\n\t\t\t\t: null)}\r\n\r\n\r\n\t\t\t\r\n\t\t\t\t{(Object.keys(state.page.dashboard.filters).length !== 0 ?\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\texportMdtPatients(noMDTData.filteredReferralIdCsv, false)\r\n\t\t\t\t\t\t\t\t.then(data => {\r\n\t\t\t\t\t\t\t\t\tif (data.errorMessage) {\r\n\t\t\t\t\t\t\t\t\t\tthrow data.errorMessage;\r\n\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\treturn fileHelper.showFile(data.bytes, data.filename, fileHelper.fileTypeToMimeType(data.filetype), \"exportMdtPatientsElem\")\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t\t.catch(err => {\r\n\t\t\t\t\t\t\t\t\tconsole.log(err)\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t>Download Patient List\r\n\t\t\t\t\t :\r\n\r\n\t\t\t\t\t
Make a filter selection in order to download patient list
)}\r\n\t\t\t
\r\n\r\n\t\t\t\r\n\t\t\r\n\t)\r\n}\r\n\r\n\r\n","import { NoMdtDashboard } from \"./dashboard\";\r\nimport { NoMdtFilters } from \"./filters\";\r\nimport * as React from \"react\";\r\n\r\nexport { NoMdtFilters }\r\n\r\n\r\nexport class NoMdtDashboardHome extends React.Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n width: 0,\r\n height: 0\r\n }; \r\n\r\n }\r\n\r\n private updateDimensions = () => {\r\n this.setState({ width: window.innerWidth, height: window.innerHeight });\r\n };\r\n \r\n public componentWillUnmount() {\r\n window.removeEventListener('resize', this.updateDimensions);\r\n }\r\n \r\n public componentDidMount() {\r\n window.addEventListener('resize', this.updateDimensions);\r\n }\r\n\r\n render = () => {\r\n return (\r\n <>\r\n \r\n \r\n )\r\n\r\n }\r\n}","import {\r\n\tIPlotData as ICorePlotData, createPlotData as createCorePlotData,\r\n\tISourceData as ICoreSourceData, createData as createCoreData, addDataFactory, addSet\r\n} from \"models/core\";\r\nimport { IDashboardViewModel } from \"./core\";\r\n\r\n/**\r\n * Plot data source\r\n */\r\nexport type IPlotData = ICorePlotData;\r\n\r\n/**\r\n * Source data\r\n */\r\nexport type ISourceData = ICoreSourceData;\r\n\r\n/**\r\n * Raw data source. Used to shape and accumulate.\r\n */\r\nexport interface ISourceBuilder {\r\n\tuniques: Set;\r\n\tvalues: ISourceData;\r\n}\r\n\r\n/**\r\n * Create a new plot data object.\r\n */\r\nexport const createPlotData = createCorePlotData;\r\n\r\n/**\r\n * Create a new source data object\r\n */\r\nexport function createBuilder(): ISourceBuilder {\r\n\treturn {\r\n\t\tuniques: new Set(),\r\n\t\tvalues: createCoreData(),\r\n\t};\r\n}\r\n\r\nconst add = addDataFactory((vm: IDashboardViewModel) => vm.morphology.name);\r\n\r\n/**\r\n * Returns the number added to the hierarchy on add, 0 otherwise. \r\n * @param vm \r\n * @param into \r\n */\r\nexport function addData(vm: IDashboardViewModel, into: ISourceBuilder): number {\r\n\t//Only count once per diagnosis per morphology.\r\n\tif (!vm?.morphology?.id || !vm?.diagnosisId)\r\n\t\treturn 0;\r\n\r\n\tif (addSet(vm.morphology.id + \"_\" + vm.diagnosisId, into.uniques)) {\r\n\t\tadd(vm, into.values);\r\n\t\treturn 1;\r\n\t}\r\n\r\n\treturn 0;\r\n}\r\n\r\n/**\r\n * Compare sourceData[a] to sourceData[b] and return -1 when a is less than b, 0 when equal, 1 when a is greater than 0\r\n * @param a \r\n * @param b \r\n */\r\nexport const sort = (s: ISourceData, a: string, b: string): number => {\r\n\treturn ((s[a] < s[b]) ? -1 : ((s[a] > s[b]) ? 1 : 0));\r\n};\r\n\r\n/** \r\n * Complete adding data and clear any temporary resources \r\n */\r\nexport function finish(builder: ISourceBuilder): ISourceData {\r\n\ttry {\r\n\t\treturn builder.values;\r\n\t} finally {\r\n\t\tbuilder.uniques.clear();\r\n\t\tbuilder.uniques = null;\r\n\t\tbuilder.values = null;\r\n\t\tbuilder = null;\r\n\t}\r\n}","\r\nimport {\r\n\tAddDataSharedFunc, DashboardSharedFilterFunc, DashboardSharedFilterKey,\r\n\tIDashboardSharedChartData, IDashboardSharedDimensionsViewModel,\r\n} from \"models/common\";\r\nimport { IFilters, IFilterKeys, DimensionsById, ISourceData, IDimFacility, IDimension, IDimMDT } from \"models/core\";\r\nimport { IDashboardViewModel } from \"./viewModel\";\r\n\r\n//Plots for this dashboard\r\nimport * as PrimarySite from \"./primarySiteHierarchy\";\r\nimport * as Morphology from \"./morphology\";\r\nimport * as Remoteness from \"../../common/plotdata/remoteness\";\r\nimport * as HHSOfResidence from \"../../common/plotdata/hhsOfResidence\";\r\n\r\nexport type { IDashboardViewModel } from \"./viewModel\";\r\n\r\nexport type IDashboardSource = IDashboardViewModel[];\r\n\r\nexport interface IBreastIndicatorConstants {\r\n\ttotalBreastDiagnoses: number,\r\n\tupper95Percent: number,\r\n\tlower95Percent: number,\r\n\tupper98Percent: number,\r\n\tlower98Percent: number,\r\n\tstatePercent: number\r\n}\r\n\r\nexport interface IDashboardDimensionsViewModel extends IDashboardSharedDimensionsViewModel {\r\n\tdefMastectomyArray?: Array;\r\n};\r\n\r\ninterface ILevel1ChartData {\r\n\ttotalDiagnoses: number;\r\n\ttotalInvasive: number;\r\n\ttotalDataQualityEligibleDiagnoses: number;\r\n\tfacilities: IDimFacility[];\r\n\thhses: IDimension[];\r\n\tmdts: IDimMDT[];\r\n\tmonth: IDimension[];\r\n\tyear: IDimension[];\r\n\tdefMastectomyInd: IBreastIndicatorConstants[];\r\n\r\n\thadSurgery: { numerator, denominator: number, percentage: number };\r\n\tslnbOnT1TumoursWithIndexBCS: { numerator: number, denominator: number, percentage: number; };\r\n\tslnbAndAxillaryLymphNodeDissection: { numerator: number, denominator: number, percentage: number; };\r\n\taxillaryLymphNodeDissection: { numerator: number, denominator: number, percentage: number; };\r\n\tdefinitiveMastectomy: { numerator: number, denominator: number, percentage: number; };\r\n\tmastectomyForT1Tumour: { numerator: number, denominator: number, percentage: number; };\r\n\treExcisionAfterIndexBCS: { numerator: number, denominator: number, percentage: number; };\r\n\tconversionOfIndexBCSToMastectomy: { numerator: number, denominator: number, percentage: number; };\r\n\ttimeFromPathologicalDiagnosisToFirstSurgery45Days: { numerator: number, denominator: number, percentage: number; };\r\n\tadjuvantIVSTForAxillaryLNPositiveAgedLessThan70: { numerator: number, denominator: number, percentage: number; };\r\n\tneoadjuvantIVST: { numerator: number, denominator: number, percentage: number };\r\n\ttimeFromDefinitiveSurgeryToFirstIVST45Days: { numerator: number, denominator: number, percentage: number };\r\n\ttimeToCompletionWithin37Weeks: { numerator: number, denominator: number, percentage: number };\r\n\txrtFollowingDefinitiveBCS: { numerator: number, denominator: number, percentage: number };\r\n\tdaysToXrtStartDateFromDefinitiveSurgery: { numerator: number, denominator: number, percentage: number };\r\n\r\n\treconstructionAfterMastectomy: { numerator: number, denominator: number, percentage: number };\r\n\treconstructionAtMastectomy: { numerator: number, denominator: number, percentage: number };\r\n\t// Export\r\n\tfilteredReferralIdCsv: string;\r\n}\r\n\r\n// HACK: chop out the reference array from the shared interface \r\ntype RestrictedSharedChartData = Omit, \"hhses\">;\r\n\r\ninterface ILevel2ChartData extends RestrictedSharedChartData {\r\n\ttotalDiagnoses: number;\r\n\tprimarySite: PrimarySite.IHierarchyPlotData;\r\n\tmorphology: Morphology.IPlotData;\r\n\tremoteness: Remoteness.IPlotData;\r\n\thhsOfResidence: HHSOfResidence.IPlotData;\r\n}\r\n\r\nexport interface IChartData {\r\n\tlevel1: ILevel1ChartData;\r\n\tlevel2: ILevel2ChartData;\r\n}\r\n\r\nconst BreastFilterKeys: IFilterKeys = {\r\n\t//Filter keys for breast indicators\r\n\tDiagnosisYear: { key: \"DiagnosisYear\", label: \"Diagnosis Year\" },\r\n\tDiagnosisMonth: { key: \"DiagnosisMonth\", label: \"Diagnosis Month\" },\r\n\tMdtYear: { key: \"MdtYear\", label: \"MDT Year\" },\r\n\tMdtMonth: { key: \"MdtMonth\", label: \"MDT Month\" },\r\n\tInvasive: { key: \"Invasive\", label: \"Invasive / In-situ\" },\r\n\tPrimarySite: { key: \"PrimarySite\", label: \"Primary site\" },\r\n\tMorphology: { key: \"Morphology\", label: \"Morphology\" },\r\n\tRemoteness: { key: \"Remoteness\", label: \"Rurality\" },\r\n\tDefinitiveMastectomy: { key: \"DefinitiveMastectomy\", label: \"Definitive Mastectomy\" },\r\n\tHHSOfResidence: { key: \"HHSOfResidence\", label: \"HHS of residence\" }\r\n}\r\n\r\nexport const DashboardFilterKeys: IFilterKeys = {\r\n\t...DashboardSharedFilterKey,\r\n\t...BreastFilterKeys\r\n}\r\n\r\nexport type Filters = IFilters;\r\nexport type DashboardFilterFunc = DashboardSharedFilterFunc;\r\nexport type AddDataFunc = AddDataSharedFunc;","import { IChartData, IDashboardDimensionsViewModel, Filters } from \"../plotdata\";\r\n\r\n//Actions / requests\r\nexport enum WorkerRequestType { Ping, Fetch, ChartData }\r\nexport interface IWorkerFetchRequest { all: boolean, rawRefs: any, rawRows: string, minYear: number }\r\nexport interface IWorkerChartDataRequest { filtersToApply: Filters, minYear: number };\r\nexport interface IWorkerRequest {\r\n type: WorkerRequestType;\r\n id: string;\r\n payload?: any; //?\r\n}\r\n\r\n//Results\r\nexport enum WorkerResultType { Ping, Fetch, ChartData, InvalidType }\r\nexport interface IWorkerResult {\r\n type: WorkerResultType;\r\n id: string;\r\n payload?: any; //?\r\n}\r\nexport interface IWorkerPingResult {}\r\nexport interface IWorkerFetchResult { allData: boolean, references: IDashboardDimensionsViewModel, chartData: IChartData }\r\nexport type IWorkerChartDataResult = IChartData;","export default function Worker_fn() {\n return new Worker(__webpack_public_path__ + \"data.worker.4d1fd505b3618ed88650.worker.js\");\n}\n","import { generateUUID } from \"helpers\";\r\nimport { getBreastDashboard, getBreastDashboardReferences } from \"api/dashboardApi\";\r\nimport { Filters } from \"../plotdata\";\r\nimport { IWorkerChartDataRequest, IWorkerChartDataResult, IWorkerFetchRequest, IWorkerFetchResult, IWorkerPingResult, IWorkerRequest, WorkerRequestType, WorkerResultType } from \"./models\";\r\nimport DataWorker from 'worker-loader!./data.worker';\r\nexport type { IWorkerChartDataResult, IWorkerFetchResult, IWorkerPingResult, IWorkerRequest, WorkerRequestType }\r\n\r\n//#region Worker\r\n\r\nlet worker: DataWorker = null;\r\nlet promises = {};\r\nlet data = {\r\n minYear: 0,\r\n}\r\n\r\n/**\r\n * Start the Worker\r\n */\r\nexport function start(minYear: number) {\r\n data.minYear = minYear;\r\n\r\n if (!window[\"Worker\"]) {\r\n console.log(\"WebWorker not supported\");\r\n return false;\r\n\r\n } else {\r\n console.log(\"WebWorker starting\");\r\n\r\n worker = worker || new DataWorker();\r\n\r\n /**\r\n * When the worker sends an error back to the main thread, resolve the associated promise.\r\n */\r\n worker.addEventListener(\"message\", (ev: MessageEvent) => {\r\n const { data: { id, type, payload } } = ev;\r\n\r\n //Any specific handling by message type\r\n switch (type as WorkerResultType) {\r\n // case WorkerResultType.Ping: {\r\n // case WorkerResultType.Fetch: {\r\n default: {\r\n //Default handler will just resolve\r\n promises[id]?.resolve(payload);\r\n break;\r\n }\r\n }\r\n\r\n promises[id] = undefined;\r\n });\r\n\r\n /**\r\n * When the worker sends an error back to the main thread, reject the associated promise.\r\n */\r\n worker.addEventListener(\"messageerror\", (ev: MessageEvent) => {\r\n const { data: { id, type, payload } } = ev;\r\n\r\n //Any specific handling by message type\r\n switch (type) {\r\n //case WorkerResultType.Ping: {\r\n //case WorkerResultType.Fetch: {\r\n default: {\r\n console.error(\"ERROR from worker\", payload);\r\n promises[id].reject(payload);\r\n break;\r\n }\r\n }\r\n\r\n promises[id] = undefined;\r\n });\r\n\r\n return true;\r\n }\r\n}\r\n\r\n/**\r\n * Post the message to the Worker\r\n * @param request \r\n */\r\nfunction send(request: IWorkerRequest) {\r\n worker.postMessage(request);\r\n}\r\n\r\n/**\r\n * Transform into a Promise and track it.\r\n * @param type \r\n * @param payload \r\n */\r\nfunction actionPromise(type: WorkerRequestType, payload: TIn): Promise {\r\n const id = generateUUID();\r\n promises[id] = {};\r\n promises[id].promise = new Promise((resolve, reject) => {\r\n send({ id, type, payload });\r\n\r\n promises[id].resolve = resolve;\r\n promises[id].reject = reject;\r\n });\r\n\r\n return promises[id].promise;\r\n}\r\n\r\nexport function ping(): Promise {\r\n return actionPromise(WorkerRequestType.Ping, null);\r\n}\r\n\r\n/**\r\n * Fetch the data from the server, then push it to the Worker for processing.\r\n * @param all \r\n */\r\nexport function fetch(all: boolean): Promise {\r\n //WebWorker cannot access sessionStorage so do the api call here and\r\n //send the data tp it.\r\n return Promise.all([\r\n getBreastDashboard(all),\r\n getBreastDashboardReferences(all),\r\n ])\r\n .then(results => {\r\n return actionPromise(WorkerRequestType.Fetch, {\r\n all,\r\n rawRows: results[0] as string,\r\n rawRefs: results[1] as any,\r\n minYear: data.minYear,\r\n });\r\n });\r\n\r\n}\r\n\r\n/**\r\n * Apply the filters in the Worker and return the ChartData\r\n * @param filtersToApply \r\n */\r\nexport function chartData(filtersToApply: Filters): Promise {\r\n return actionPromise(WorkerRequestType.ChartData, {\r\n filtersToApply,\r\n minYear: data.minYear,\r\n });\r\n}\r\n\r\n/** Terminate the worker */\r\nexport function stop() {\r\n worker && worker.terminate();\r\n worker = null;\r\n console.log(\"WebWorker terminated\");\r\n}\r\n\r\n//#endregion Worker\r\n","import { AddFilterBaseFunc, FilterContext, RemoveFilterBaseFunc } from \"../core\";\r\nimport { DashboardFilterKeys, Filters, IChartData, IDashboardDimensionsViewModel } from \"./plotdata\";\r\n\r\nexport type { IChartData, IDashboardDimensionsViewModel, Filters } from \"./plotdata\";\r\nexport { DashboardFilterKeys } from \"./plotdata\";\r\nexport type AddFilterFunc = AddFilterBaseFunc;\r\nexport type RemoveFilterFunc = RemoveFilterBaseFunc;\r\n\r\nimport * as DashWorker from \"./worker\";\r\nexport { DashWorker }\r\n\r\nexport interface IBreastDashboard {\r\n\tallData: boolean;\r\n\treferences: IDashboardDimensionsViewModel;\r\n\tfilters: Filters;\r\n\tchartData: IChartData;\r\n\tselectedFacilities: Set;\r\n selectedHhses: Set;\r\n onlyDataQualityEligible: boolean;\r\n}\r\n\r\n\r\nexport const initState = (): IBreastDashboard => {\r\n\treturn {\r\n\t\tallData: false,\r\n\t\treferences: {},\r\n\t\tchartData: null,\r\n\t\tfilters: {},\r\n\t\tselectedFacilities: new Set(),\r\n\t\tselectedHhses: new Set(),\r\n\t\tonlyDataQualityEligible: false,\r\n\t}\r\n};\r\n\r\n\r\nexport const loadBreastDashboard = async (state: IBreastDashboard): Promise => {\r\n\tDashWorker.start(2010);\r\n\ttry {\r\n\t\tawait DashWorker.ping()\r\n\t\tconsole.log(\"WORKER PING RESOLVED\");\r\n\t\treturn await fetchData(state, state.allData);\r\n\t} catch {\r\n\t\tconsole.error(\"WORKER PING FAILED\");\r\n\t}\r\n}\r\n\r\nexport const clearFilters = (state: IBreastDashboard): IBreastDashboard => {\r\n\tconst maybeSetDefaultFilter = (filterKey: string, dimensions: { name: string }[]): Set => {\r\n\t\tif (!dimensions || dimensions.length !== 1)\r\n\t\t\treturn (new Set());\r\n\r\n\t\tif (state.allData)\r\n\t\t\treturn (new Set());\r\n\r\n\t\tlet filterSet = new Set();\r\n\t\tfilterSet.add(dimensions[0].name);\r\n\r\n\t\tstate = addFilter(state)(filterKey, [dimensions[0].name])\r\n\t\treturn filterSet;\r\n\t}\r\n\r\n\tstate.filters = {};\r\n\tstate.selectedHhses = maybeSetDefaultFilter(DashboardFilterKeys.HHS.key, state.chartData.level1.hhses);\r\n\tstate.selectedFacilities = maybeSetDefaultFilter(DashboardFilterKeys.Facility.key, state.chartData.level1.facilities);\r\n\r\n\treturn { ... state };\r\n\r\n}\r\n\r\n\r\n\r\nexport const closeBreastDashboard = () =>\r\n\tDashWorker.stop();\r\n\r\nconst fetchData = async (state: IBreastDashboard, all: boolean): Promise => {\r\n\ttry {\r\n\t\tconst data = await DashWorker.fetch(all);\r\n\r\n\t\tconst maybeSetDefaultFilter = (filterKey: string, dimensions: { name: string }[]): Set => {\r\n\t\t\tif (!dimensions || dimensions.length !== 1)\r\n\t\t\t\treturn (new Set());\r\n\r\n\t\t\tif (all)\r\n\t\t\t\treturn (new Set());\r\n\r\n\t\t\tlet filterSet = new Set();\r\n\t\t\tfilterSet.add(dimensions[0].name);\r\n\r\n\t\t\tstate = addFilter(state)(filterKey, [dimensions[0].name])\r\n\t\t\treturn filterSet;\r\n\t\t}\r\n\r\n\t\tstate.selectedHhses = maybeSetDefaultFilter(DashboardFilterKeys.HHS.key, data.chartData.level1.hhses);\r\n state.selectedFacilities = maybeSetDefaultFilter(DashboardFilterKeys.Facility.key, data.chartData.level1.facilities);\r\n\t\tstate.allData = all;\r\n\t\tstate.references = data.references;\r\n\t\tstate.chartData = data.chartData;\r\n\t\t\r\n\t\treturn state;\r\n\t} catch {\r\n\t\tconsole.error(\"WORKER FETCHDATA FAILED\");\r\n\t\treturn state;\r\n\t}\r\n}\r\n\r\nexport const computeChartData = async (state: IBreastDashboard): Promise => {\r\n\ttry {\r\n\t\tconst data = await DashWorker.chartData(state.filters);\r\n\t\tstate.chartData = data;\r\n\t\treturn {...state};\r\n\t} catch {\r\n\t\tconsole.error(\"WORKER COMPUTECHARTDATA FAILED\")\r\n\t\treturn state;\r\n\t}\r\n}\r\n\r\nexport const addFilter = (state: IBreastDashboard) => (key: keyof typeof DashboardFilterKeys, value: string | string[], context?: FilterContext, labelOverride?: string): IBreastDashboard => {\r\n\tconst filters: Filters = Object.assign({}, state.filters);\r\n\tconst values = (typeof value === \"string\")\r\n\t\t? [value]\r\n\t\t: value;\r\n\r\n\t//Replace the existing path entry if we are replacing a multi-value filter\r\n\t//to do so: traverse to the parent\r\n\tconst baseContext: FilterContext = context && ((context.values().length > 1) ? context.parent() : context) || new FilterContext();\r\n\tbaseContext.push(values);\r\n\r\n\tfilters[key] = ({ value: values, labelOverride, parts: baseContext.parts });\r\n\r\n\tstate.filters = filters;\r\n\r\n\treturn {...state};\r\n}\r\n\r\n\r\nexport const removeFilter = (state: IBreastDashboard, key: keyof typeof DashboardFilterKeys, value?: string, labelOverride?: string): IBreastDashboard => {\r\n\tconst filters: Filters = Object.assign({}, state.filters);\r\n\tconst valueToRemove: string = value || null;\r\n\tconst context = FilterContext.fromFilters(filters, key);\r\n\tconst values = context.values();\r\n\tconst newValue = (valueToRemove ? values.filter(p => p != valueToRemove): null);\r\n\r\n\tconst n = context.parent() || new FilterContext();\r\n\tif (newValue) {\r\n\t\tn.push(newValue);\r\n\t}\r\n\tfilters[key] = ({value: n.values(), labelOverride, parts: n.parts});\r\n\r\n\tif (n.parts.length === 0) {\r\n\t\tdelete filters[key];\r\n\t}\r\n\r\n\tstate.filters = filters;\r\n\treturn {...state};\r\n}","import * as React from \"react\"\r\nimport * as Breast from \"models/breast\";\r\nimport { AppContext } from \"AppContext\";\r\nimport { ActionTypes } from \"reducer/actions\";\r\nimport { Button, Paper, Table, TableBody, TableCell, TableContainer, TableHead, TableRow } from \"@mui/material\";\r\nimport { Link } from \"react-scroll\";\r\nimport { FilterContext } from \"models/core/filter\";\r\nimport { DashChip } from \"components/common/DashChips\";\r\nimport ReportApi from \"api/reportApi\";\r\nimport * as fileHelper from \"helpers/fileHelper\";\r\nimport { Download, Downloading } from \"@mui/icons-material\";\r\nimport { BreastIndicatorDefinitionsUrl } from \"config/appUrlConfig\";\r\nimport { getStateIndicatorReferences } from \"api/dashboardApi\";\r\nimport Loader from \"pages/shared/pageloader\";\r\n\r\nenum BreastIndicatorAction {\r\n\tUserClickedDownloadIndicator,\r\n\tDownloadIndicatorSuccess,\r\n\tDownloadIndicatorFail\r\n}\r\n\r\ntype Action =\r\n\t{ type: BreastIndicatorAction.UserClickedDownloadIndicator, payload: number }\r\n\t| { type: BreastIndicatorAction.DownloadIndicatorSuccess }\r\n\t| { type: BreastIndicatorAction.DownloadIndicatorFail }\r\n\r\n\r\ninterface State {\r\n\tindicator: number,\r\n\tdownloading: boolean\r\n}\r\n\r\nconst initialState: State = {\r\n\tindicator: 0,\r\n\tdownloading: false\r\n}\r\n\r\n\r\n\r\nconst reducer = (state: State, action: Action): State => {\r\n\tconst { type } = action;\r\n\r\n\tswitch (type) {\r\n\t\tcase BreastIndicatorAction.UserClickedDownloadIndicator:\r\n\t\t\treturn { ...state, ...{ indicator: action.payload, downloading: true } };\r\n\r\n\t\tcase BreastIndicatorAction.DownloadIndicatorSuccess:\r\n\t\tcase BreastIndicatorAction.DownloadIndicatorFail:\r\n\t\t\treturn { ...state, ...{ indicator: 0, downloading: false } };\r\n\r\n\t\tdefault:\r\n\t\t\treturn state;\r\n\t}\r\n}\r\n\r\nlet stateWideData: {\r\n\ttitle?: string;\r\n\tinvasive?: string;\r\n\thadSurgery?: string;\r\n\tslnbOnT1TumoursWithIndexBCS?: string;\r\n\tslnbAndAxillaryLymphNodeDissection?: string;\r\n\taxillaryLymphNodeDiessection?: string;\r\n\tdefinitiveMastectomy?: string;\r\n\tmastectomyForT1Tumours?: string;\r\n\treExcisionOfLesionAfterIndexBCS?: string;\r\n\tconvertionOfIndexBCSToMastectomy?: string;\r\n\ttimeFromPathologicalDiagnosisToFirstSurgery45Days?: string;\r\n\tadjuvantIVSTForAxillaryLymphNodePositivePatientsUnder70?: string;\r\n\tneoadjuvantTherapy?: string;\r\n\ttimeFromDefinitiveSurgeryToIVST45Days?: string;\r\n\txrtFollowingDefinitiveBCS?: string;\r\n\ttimeFromDefinitiveSurgeryToXrt60Days?: string;\r\n\timmediateBreastReconstructionSurgery?: string;\r\n\tdelayedBreastReconstructionSurgery?: string;\r\n\ttimeToTreatmentCompletion37Weeks?: string;\r\n} = {};\r\n\r\nexport function BreastDashboard() {\r\n\tconst [localState, localDispatch] = React.useReducer(reducer, initialState)\r\n\tconst { state, dispatch } = React.useContext(AppContext);\r\n\r\n\tconst [showFilterChips, setFilterChips] = React.useState(true);\r\n\r\n\t\r\n\tconst addFilter: Breast.AddFilterFunc = async (key: keyof typeof Breast.DashboardFilterKeys, value: string | string[], context?: FilterContext, labelOverride?: string) => {\r\n\t\t\tconst filteredDashboard = await Breast.computeChartData(Breast.addFilter(state.page.dashboard as Breast.IBreastDashboard)(key, value, context, labelOverride)); // state = what the other filter function returns \r\n\t\t\tdispatch({ type: ActionTypes.UserClickedOnChart, payload: filteredDashboard });\r\n\t\t}\r\n\t\r\n\t\tconst removeFilter: Breast.RemoveFilterFunc = async (key: keyof typeof Breast.DashboardFilterKeys, value?: string) => {\r\n\t\t\tconst filteredDashboard = await Breast.computeChartData(Breast.removeFilter(state.page.dashboard as Breast.IBreastDashboard, key, value));\r\n\t\t\tdispatch({ type: ActionTypes.UserClickedOnChart, payload: filteredDashboard });\r\n\t\t}\r\n\t\r\n\t\tReact.useEffect(() => {\r\n\t\t\tdispatch({ type: ActionTypes.UserWantsToLoadMdtDashboard });\r\n\t\r\n\t\t\tconst fetchStateReferenceData = async () => {\r\n\t\t\t\tstateWideData = await getStateIndicatorReferences(\"breast\", 2022);\r\n\t\t\t}\r\n\t\r\n\t\t\tconst loadDashboard = async () => {\r\n\t\t\t\tconst value = await Breast.loadBreastDashboard(state.page.dashboard as Breast.IBreastDashboard);\r\n\t\t\t\tdispatch({ type: ActionTypes.UserLoadedMdtDashboard, payload: value });\r\n\t\t\t}\r\n\t\r\n\t\t\tPromise.all([fetchStateReferenceData(), loadDashboard()]);\r\n\t\r\n\t\t\treturn () => {\r\n\t\t\t\tBreast.closeBreastDashboard();\r\n\t\t\t}\r\n\t\t}, []);\r\n\t\r\n\t\tReact.useEffect(() => {\r\n\t\t\tif (localState.indicator == 0)\r\n\t\t\t\treturn;\r\n\t\r\n\t\t\tlet ids = breastChartData.level1.filteredReferralIdCsv;\r\n\t\t\tlet alldata = false;\r\n\t\r\n\t\r\n\t\t\tconst getBreastIndicatorPatientList = async () => {\r\n\t\t\t\ttry {\r\n\t\t\t\t\tconst data = await ReportApi.getBreastIndicatorPatientList(ids, alldata, localState.indicator);\r\n\t\t\t\t\tif (data.errorMessage) {\r\n\t\t\t\t\t\tconsole.error(data.errorMessage);\r\n\t\t\t\t\t\tlocalDispatch({ type: BreastIndicatorAction.DownloadIndicatorFail })\r\n\t\t\t\t\t}\r\n\t\t\t\t\tlocalDispatch({ type: BreastIndicatorAction.DownloadIndicatorSuccess })\r\n\t\t\t\t\treturn fileHelper.showFile(data.bytes, data.filename, fileHelper.fileTypeToMimeType(data.filetype), \"exportPatientsElem\")\r\n\t\t\t\t} catch {\r\n\t\t\t\t\tlocalDispatch({ type: BreastIndicatorAction.DownloadIndicatorFail })\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\r\n\t\t\tgetBreastIndicatorPatientList();\r\n\t\r\n\t\r\n\t\t}, [localState.indicator]);\r\n\t\r\n\t\r\n\t\tif (state.page.loading || !state.page.dashboard.chartData)\r\n\t\t\treturn \r\n\t\r\n\t\r\n\t\t//Create function to show/hide filter chips\r\n\t\tconst toggleChips = () => {\r\n\t\t\tif (showFilterChips) {\r\n\t\t\t\tsetFilterChips(false);\r\n\t\t\t} else {\r\n\t\t\t\tsetFilterChips(true);\r\n\t\t\t}\r\n\t\t};\r\n\t\r\n\t\tlet activeFiltersArray = [];\r\n\t\tlet filterArray = [];\r\n\t\tlet chips = [];\r\n\t\r\n\t\tfor (const key in state.page.dashboard.filters) {\r\n\t\t\tif (Object.prototype.hasOwnProperty.call(state.page.dashboard.filters, key)) {\r\n\t\t\t\tactiveFiltersArray.push({ \"key\": key, \"values\": state.page.dashboard.filters[key].value, \"parts\": state.page.dashboard.filters[key].parts });\r\n\t\t\t}\r\n\t\t}\r\n\t\r\n\t\tfor (const key in Breast.DashboardFilterKeys) {\r\n\t\t\tif (Object.prototype.hasOwnProperty.call(Breast.DashboardFilterKeys, key)) {\r\n\t\t\t\tfilterArray.push({ \"key\": key, \"label\": Breast.DashboardFilterKeys[key].label });\r\n\t\t\t}\r\n\t\t}\r\n\t\r\n\t\tactiveFiltersArray.forEach(a => {\r\n\t\t\ta.values.forEach(b => {\r\n\t\t\t\tchips.push( id.key == a.key).label}\r\n\t\t\t\t\tfilterValue={b}\r\n\t\t\t\t\tfilterId={a.key}\r\n\t\t\t\t\tfilterParent={(a.parts.length > 1 ? a.parts[0] : null)}\r\n\t\t\t\t/>\r\n\t\t\t\t)\r\n\t\t\t})\r\n\t\t})\r\n\t\r\n\t\tconst breastChartData = state.page.dashboard.chartData as Breast.IChartData;\r\n\t\r\n\t\tconst downloadBtn = (extractTypeId: number) => {\r\n\t\t\tconst { indicator } = localState;\r\n\t\r\n\t\t\tif (indicator == extractTypeId)\r\n\t\t\t\treturn \r\n\t\r\n\t\t\treturn (\r\n\t\t\t\t\r\n\t\t\t\t\tlocalDispatch({ type: BreastIndicatorAction.UserClickedDownloadIndicator, payload: extractTypeId })} />\r\n\t\t\t)\r\n\t\t}\r\n\t\r\n\t\tconst ecog = {\r\n\t\t\tnumerator: 0,\r\n\t\t\tdenominator: 0,\r\n\t\t\tpercentage: 0\r\n\t\t}\r\n\t\r\n\t\tconst stage = {\r\n\t\t\tnumerator: 0,\r\n\t\t\tdenominator: 0,\r\n\t\t\tpercentage: 0\r\n\t\t}\r\n\t\r\n\t\tif (breastChartData.level1.totalDiagnoses > 0) {\r\n\t\t\tecog.numerator = breastChartData.level1.totalDiagnoses - (breastChartData.level2.ecogGroup.values[breastChartData.level2.ecogGroup.labels.indexOf(\"Unk\")] || 0);\r\n\t\t\tecog.denominator = breastChartData.level1.totalDiagnoses\r\n\t\t\tecog.percentage = ecog.numerator / ecog.denominator * 100\r\n\t\r\n\t\t\tstage.numerator = breastChartData.level1.totalDiagnoses - (breastChartData.level2.tnmStage.values[breastChartData.level2.tnmStage.labels.indexOf(\"Unk\")] || 0);\r\n\t\t\tstage.denominator = breastChartData.level1.totalDiagnoses;\r\n\t\t\tstage.percentage = stage.numerator / stage.denominator * 100\r\n\t\t}\r\n\t\r\n\t\r\n\t\tconst dashboard = <>\r\n\t\t\t
\r\n\t\r\n\t\r\n\t\t\t\t{(showFilterChips ?
\r\n\t\t\t\t\t{chips}\r\n\t\t\t\t
: null)}\r\n\t\t\t
\r\n\t\r\n\t\t\t
\r\n\t\r\n\t\t\t\t
\r\n\t\t\t\t\t\r\n\t\t\t\t
\r\n\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tIndicator\r\n\t\t\t\t\t\t\tMy MDT(s)*\r\n\t\t\t\t\t\t\t{stateWideData.title}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tFemale invasive breast cancer diagnoses\r\n\t\t\t\t\t\t\t{breastChartData.level1.totalInvasive}\r\n\t\t\t\t\t\t\t{stateWideData.invasive}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tPercentage of female patients with invasive breast cancers with ECOG\r\n\t\t\t\t\t\t\t{`${ecog.percentage.toFixed(0)}%`}
{`(${ecog.numerator}/${ecog.denominator})`}
\r\n\t\t\t\t\t\t\t-\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tPercentage of female patients with invasive breast cancers with stage\r\n\t\t\t\t\t\t\t{`${stage.percentage.toFixed(0)}%`}
{`(${stage.numerator}/${stage.denominator})`}
\r\n\t\t\t\t\t\t\t-\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tNumber of female patients with invasive breast cancers who had breast surgery\r\n\t\t\t\t\t\t\t{`${breastChartData.level1.hadSurgery.percentage.toFixed(0)}%`}
{`(${breastChartData.level1.hadSurgery.numerator}/${breastChartData.level1.hadSurgery.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.hadSurgery}\r\n\t\t\t\t\t\t
\r\n\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tDiagnosis & Staging - Diagnosis and staging are crucial for breast cancer treatment planning\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tSLNB on a T1 tumour with index BCS\r\n\t\t\t\t\t\t\t{`${breastChartData.level1.slnbOnT1TumoursWithIndexBCS.percentage.toFixed(0)}%`}
{`(${breastChartData.level1.slnbOnT1TumoursWithIndexBCS.numerator}/${breastChartData.level1.slnbOnT1TumoursWithIndexBCS.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.slnbOnT1TumoursWithIndexBCS}\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tSLNB and axillary lymph node dissection (ALND)\r\n\t\t\t\t\t\t\t{`${breastChartData.level1.slnbAndAxillaryLymphNodeDissection.percentage.toFixed(0)}%`}
{`(${breastChartData.level1.slnbAndAxillaryLymphNodeDissection.numerator}/${breastChartData.level1.slnbAndAxillaryLymphNodeDissection.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.slnbAndAxillaryLymphNodeDissection}\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tAxillary lymph node dissection (ALND)\r\n\t\t\t\t\t\t\t{`${breastChartData.level1.axillaryLymphNodeDissection.percentage.toFixed(0)}%`}
{`(${breastChartData.level1.axillaryLymphNodeDissection.numerator}/${breastChartData.level1.axillaryLymphNodeDissection.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.axillaryLymphNodeDiessection}\r\n\t\t\t\t\t\t
\r\n\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tSurgery - Surgery is usually the first type of treatment for early or locally advanced breast cancer\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tDefinitive Mastectomy\r\n\t\t\t\t\t\t\t{`${breastChartData.level1.definitiveMastectomy.percentage.toFixed(0)}%`}
{`(${breastChartData.level1.definitiveMastectomy.numerator}/${breastChartData.level1.definitiveMastectomy.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.definitiveMastectomy}\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tMastectomy for T1 tumours\r\n\t\t\t\t\t\t\t{`${breastChartData.level1.mastectomyForT1Tumour.percentage.toFixed(0)}%`}
{`(${breastChartData.level1.mastectomyForT1Tumour.numerator}/${breastChartData.level1.mastectomyForT1Tumour.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.mastectomyForT1Tumours}\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tRe-excision of lesion after index breast conserving surgery (BCS)\r\n\t\t\t\t\t\t\t{`${breastChartData.level1.reExcisionAfterIndexBCS.percentage.toFixed(0)}%`}
{`(${breastChartData.level1.reExcisionAfterIndexBCS.numerator}/${breastChartData.level1.reExcisionAfterIndexBCS.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.reExcisionOfLesionAfterIndexBCS}\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tConversion of index breast conserving surgery (BCS) to mastectomy\r\n\t\t\t\t\t\t\t{`${breastChartData.level1.conversionOfIndexBCSToMastectomy.percentage.toFixed(0)}%`}
{`(${breastChartData.level1.conversionOfIndexBCSToMastectomy.numerator}/${breastChartData.level1.conversionOfIndexBCSToMastectomy.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.convertionOfIndexBCSToMastectomy}\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tTime from pathological diagnosis to first surgery ≤ 45 days\r\n\t\t\t\t\t\t\t{`${breastChartData.level1.timeFromPathologicalDiagnosisToFirstSurgery45Days.percentage.toFixed(0)}%`}
{`(${breastChartData.level1.timeFromPathologicalDiagnosisToFirstSurgery45Days.numerator}/${breastChartData.level1.timeFromPathologicalDiagnosisToFirstSurgery45Days.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.timeFromPathologicalDiagnosisToFirstSurgery45Days}\r\n\t\t\t\t\t\t
\r\n\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tSystemic Therapy - Systemic therapy may be used at different times to treat breast cancer\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tAdjuvant IVST for axillary lymph node positive women aged under 70 years\r\n\t\t\t\t\t\t\t{`${breastChartData.level1.adjuvantIVSTForAxillaryLNPositiveAgedLessThan70.percentage.toFixed(0)}%`}
{`(${breastChartData.level1.adjuvantIVSTForAxillaryLNPositiveAgedLessThan70.numerator}/${breastChartData.level1.adjuvantIVSTForAxillaryLNPositiveAgedLessThan70.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.adjuvantIVSTForAxillaryLymphNodePositivePatientsUnder70}\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tNeoadjuvant therapy\r\n\t\t\t\t\t\t\t{`${breastChartData.level1.neoadjuvantIVST.percentage.toFixed(0)}%`}
{`(${breastChartData.level1.neoadjuvantIVST.numerator}/${breastChartData.level1.neoadjuvantIVST.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.neoadjuvantTherapy}\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tTime from definitive surgery to first IVST ≤ 45 days\r\n\t\t\t\t\t\t\t{`${breastChartData.level1.timeFromDefinitiveSurgeryToFirstIVST45Days.percentage.toFixed(0)}%`}
{`(${breastChartData.level1.timeFromDefinitiveSurgeryToFirstIVST45Days.numerator}/${breastChartData.level1.timeFromDefinitiveSurgeryToFirstIVST45Days.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.timeFromDefinitiveSurgeryToIVST45Days}\r\n\t\t\t\t\t\t
\r\n\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tRadiation Therapy - Radiotherapy is usually given after surgery and systemic therapy\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tRadiation therapy following definitive breast conserving surgery (BCS)\r\n\t\t\t\t\t\t\t{`${breastChartData.level1.xrtFollowingDefinitiveBCS.percentage.toFixed(0)}%`}
{`(${breastChartData.level1.xrtFollowingDefinitiveBCS.numerator}/${breastChartData.level1.xrtFollowingDefinitiveBCS.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.xrtFollowingDefinitiveBCS}\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tTime from definitive surgery to first radiation therapy ≤ 60 days\r\n\t\t\t\t\t\t\t{`${breastChartData.level1.daysToXrtStartDateFromDefinitiveSurgery.percentage.toFixed(0)}%`}
{`(${breastChartData.level1.daysToXrtStartDateFromDefinitiveSurgery.numerator}/${breastChartData.level1.daysToXrtStartDateFromDefinitiveSurgery.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.timeFromDefinitiveSurgeryToXrt60Days}\r\n\t\t\t\t\t\t
\r\n\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tAccessibility - Making health services available in the most suitable setting\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tImmediate breast reconstruction surgery\r\n\t\t\t\t\t\t\t{`${breastChartData.level1.reconstructionAtMastectomy.percentage.toFixed(0)}%`}
{`(${breastChartData.level1.reconstructionAtMastectomy.numerator}/${breastChartData.level1.reconstructionAtMastectomy.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.immediateBreastReconstructionSurgery}\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tDelayed breast reconstruction surgery\r\n\t\t\t\t\t\t\t{`${breastChartData.level1.reconstructionAfterMastectomy.percentage.toFixed(1)}%`}
{`(${breastChartData.level1.reconstructionAfterMastectomy.numerator}/${breastChartData.level1.reconstructionAfterMastectomy.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.delayedBreastReconstructionSurgery}\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tTime to treatment completion within 37 weeks from pathological diagnosis\r\n\t\t\t\t\t\t\t{`${breastChartData.level1.timeToCompletionWithin37Weeks.percentage.toFixed(0)}%`}
{`(${breastChartData.level1.timeToCompletionWithin37Weeks.numerator}/${breastChartData.level1.timeToCompletionWithin37Weeks.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.timeToTreatmentCompletion37Weeks}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t
\r\n\r\n\t\t\t
\r\n\t\t\t\t

*Data based on facility of MDT

\r\n\t\t\t\t

^The comparison data in the Qld report is based on a person's incidence case of the cancer. The MDT data is all diagnoses (with a diagnosis date) presented to MDT using the Qool application

\r\n\t\t\t
\r\n\r\n\t\t\t
\r\n\t\t\t\t

This report is based on the Queensland Breast Cancer Quality Index 2010-2019 | Volume IV.
Indicator definitions and glossary can be found here also

\r\n\t\t\t
\r\n\r\n\t\t
\r\n\r\n\t\t\r\n\r\n\t\r\n\r\n\treturn (\r\n\t\tdashboard\r\n\t)\r\n\r\n\r\n} ","import * as React from \"react\"\r\nimport * as Breast from \"models/breast\";\r\nimport { AppContext } from \"AppContext\";\r\nimport { ActionTypes } from \"reducer/actions\";\r\nimport { Box, Button, Typography } from \"@mui/material\";\r\nimport { FilterContext } from \"models/core/filter\";\r\nimport Select from \"react-select\";\r\nimport { SideBySideButton } from \"components/common/SideBySideOptions\";\r\nimport { exportMdtPatients } from \"models/mdt/worker\";\r\nimport * as fileHelper from \"helpers/fileHelper\";\r\nimport Loader from \"pages/shared/filterloader\";\r\n\r\nexport function BreastFilters() {\r\n\tconst { state, dispatch } = React.useContext(AppContext);\r\n\r\n\tconst addFilter: Breast.AddFilterFunc = async (key: keyof typeof Breast.DashboardFilterKeys, value: string | string[], context?: FilterContext, labelOverride?: string) => {\r\n\t\tconst filteredDashboard = await Breast.computeChartData(Breast.addFilter(state.page.dashboard as Breast.IBreastDashboard)(key, value, context, labelOverride)); // state = what the other filter function returns \r\n\t\tdispatch({ type: ActionTypes.UserClickedOnChart, payload: filteredDashboard });\r\n\t}\r\n\r\n\tconst removeFilter: Breast.RemoveFilterFunc = async (key: keyof typeof Breast.DashboardFilterKeys) => {\r\n\r\n\t\tconst filteredDashboard = await Breast.computeChartData(Breast.removeFilter(state.page.dashboard as Breast.IBreastDashboard, key));\r\n\t\tdispatch({ type: ActionTypes.UserClickedOnChart, payload: filteredDashboard });\r\n\t}\r\n\r\n\r\n\tif (state.page.loading)\r\n\t\treturn ;\r\n\r\n\tconst dataForFilters = state?.page?.dashboard?.chartData as Breast.IChartData;\r\n\r\n\r\n\t//HHS \r\n\t//HHS Options\r\n\tconst hhsOptions: any[] = [];\r\n\tdataForFilters?.level1.hhses.map(p => {\r\n\t\thhsOptions.push({ label: p.name, value: p.id });\r\n\t})\r\n\r\n\t//Filtered HHSes\r\n\tlet hhsSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.HHS?.value?.map(p => {\r\n\t\thhsSelections.push({ label: p, value: hhsOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\t//Add code to be able to filter list of facilities to a chosen HHS\r\n\tlet selectedHHSIds = [];\r\n\tif (hhsSelections.length > 0) {\r\n\t\tselectedHHSIds = hhsSelections.map(a =>\r\n\t\t\ta.value);\r\n\t}\r\n\r\n\t//Facility \r\n\t//Facility Options\r\n\tconst facilityOptions: any[] = [];\r\n\tif (hhsSelections.length > 0) {\r\n\t\tdataForFilters?.level1.facilities.filter(a => selectedHHSIds.includes(a.hhsId)).map(p => {\r\n\t\t\tfacilityOptions.push({ label: p.name, value: p.facilityId });\r\n\t\t})\r\n\t} else {\r\n\t\tdataForFilters?.level1.facilities.map(p => {\r\n\t\t\tfacilityOptions.push({ label: p.name, value: p.facilityId });\r\n\t\t});\r\n\t}\r\n\r\n\t//Filtered facilities\r\n\tlet facilitySelections: any[] = [];\r\n\tstate.page.dashboard.filters?.Facility?.value?.map(p => {\r\n\t\tfacilitySelections.push({ label: p, value: facilityOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\t//Add code to be able to filter list of Mdts to a chosen Facilities\r\n\tlet selectedFacilityIds = [];\r\n\tif (facilitySelections.length > 0) {\r\n\t\tselectedFacilityIds = facilitySelections.map(a =>\r\n\t\t\ta.value);\r\n\t}\r\n\r\n\t//MDTs\r\n\t//Options\r\n\tconst mdtOptions: any[] = [];\r\n\tif (facilitySelections.length > 0) {\r\n\t\tdataForFilters?.level1.mdts.filter(a => selectedFacilityIds.includes(a.facilityId)).map(p => {\r\n\t\t\tmdtOptions.push({ label: p.nameAndFacility, value: p.mdtNameId });\r\n\t\t})\r\n\t} else {\r\n\t\tdataForFilters?.level1.mdts.map(p => {\r\n\t\t\tmdtOptions.push({ label: p.nameAndFacility, value: p.mdtNameId });\r\n\t\t})\r\n\t}\r\n\r\n\t//Filtered MDTs\r\n\tlet mdtSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.Mdt?.value?.map(p => {\r\n\t\tmdtSelections.push({ label: p, value: mdtOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\t//let { path } = state.page.dashboard.chartData.reviewsByPeriod;\r\n\t//let parts = FilterContext.fromPath(path).parts;\r\n\r\n\t//Months\r\n\t//Options\r\n\tconst monthOptions: any[] = [];\r\n\tdataForFilters?.level1.month.map(p => {\r\n\t\tmonthOptions.push({ label: p.name, value: p.id });\r\n\t})\r\n\r\n\t//Filtered MDT months\r\n\tlet mdtMonthSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.MdtMonth?.value?.map(p => {\r\n\t\tmdtMonthSelections.push({\r\n\t\t\tlabel: p,\r\n\t\t\tvalue: monthOptions.find(a => a.label == p)?.value\r\n\t\t});\r\n\t})\r\n\r\n\t//Filtered diagnosis months\r\n\tlet diagMonthSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.DiagnosisMonth?.value?.map(p => {\r\n\t\tdiagMonthSelections.push({ label: p, value: monthOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\t//Years\r\n\t//MDT Year options\r\n\tconst mdtYearOptions: any[] = [];\r\n\tdataForFilters?.level1.year.map(p => {\r\n\t\tif (p.id >= 2010) {\r\n\t\t\tmdtYearOptions.push({ label: p.name, value: p.id });\r\n\t\t}\r\n\t})\r\n\r\n\t//Diagnosis year options\r\n\tconst diagYearOptions: any[] = [];\r\n\tdataForFilters?.level1.year.map(p => {\r\n\t\tdiagYearOptions.push({ label: p.name, value: p.id });\r\n\t})\r\n\r\n\t//Filtered year selections\r\n\tlet mdtYearSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.MdtYear?.value?.map(p => {\r\n\t\tmdtYearSelections.push({\r\n\t\t\tlabel: p,\r\n\t\t\tvalue: mdtYearOptions.find(a => a.label == p)?.value\r\n\t\t});\r\n\t})\r\n\r\n\t//Filtered diagnosis selections\r\n\tlet diagYearSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.DiagnosisYear?.value?.map(p => {\r\n\t\tdiagYearSelections.push({ label: p, value: diagYearOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\t//State for side by side button \r\n\tconst [viewBy, setViewBy] = React.useState(diagYearSelections.length > 0 ? \"Diagnosis Year\" : \"MDT Year\");\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t\r\n\t\t\t\tHHS\r\n\t\t\t\t {\r\n\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\tremoveFilter(Breast.DashboardFilterKeys.HHS.key);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\taddFilter(Breast.DashboardFilterKeys.HHS.key, filterValues);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t}),\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t\r\n\r\n\r\n\t\t\t\r\n\t\t\t\tFacility\r\n\t\t\t\t {\r\n\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\tremoveFilter(Breast.DashboardFilterKeys.Facility.key);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\taddFilter(Breast.DashboardFilterKeys.Facility.key, filterValues);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t}),\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t\r\n\r\n\r\n\t\t\t\r\n\t\t\t\tMDT\r\n\t\t\t\t {\r\n\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\tremoveFilter(Breast.DashboardFilterKeys.Mdt.key);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\taddFilter(Breast.DashboardFilterKeys.Mdt.key, filterValues);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t}),\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t\r\n\r\n\t\t\t\r\n\t\t\t\tView By\r\n\t\t\t\t {\r\n\t\t\t\t\t\tsetViewBy(p)\r\n\t\t\t\t\t}}\r\n\r\n\t\t\t\t/>\r\n\t\t\t\r\n\r\n\t\t\t{(viewBy == \"MDT Year\" ?\r\n\t\t\t\t<>\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tMDT Year\r\n\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\t\t\tremoveFilter(Breast.DashboardFilterKeys.MdtYear.key);\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\taddFilter(Breast.DashboardFilterKeys.MdtYear.key, filterValues);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tMDT Month\r\n\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\t\t\tremoveFilter(Breast.DashboardFilterKeys.MdtMonth.key);\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\taddFilter(Breast.DashboardFilterKeys.MdtMonth.key, filterValues);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t:\r\n\t\t\t\t<>\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tDiagnosis Year\r\n\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\t\t\tremoveFilter(Breast.DashboardFilterKeys.DiagnosisYear.key);\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\taddFilter(Breast.DashboardFilterKeys.DiagnosisYear.key, filterValues);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tDiagnosis Month\r\n\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\t\t\tremoveFilter(Breast.DashboardFilterKeys.DiagnosisMonth.key);\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\taddFilter(Breast.DashboardFilterKeys.DiagnosisMonth.key, filterValues);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\r\n\r\n\t\t\t\t\r\n\t\t\t)}\r\n\r\n\r\n\t\t\t{/* \r\n\t\t\t\t{(Object.keys(state.page.dashboard.filters).length !== 0 ?\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\texportMdtPatients(dataForFilters.level1.filteredReferralIdCsv, false)\r\n\t\t\t\t\t\t\t\t.then(data => {\r\n\t\t\t\t\t\t\t\t\tif (data.errorMessage) {\r\n\t\t\t\t\t\t\t\t\t\tthrow data.errorMessage;\r\n\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\treturn fileHelper.showFile(data.bytes, data.filename, fileHelper.fileTypeToMimeType(data.filetype), \"exportMdtPatientsElem\")\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t\t.catch(err => console.log(err))\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t>Download Patient List\r\n\t\t\t\t\t :\r\n\r\n\t\t\t\t\t
Make a filter selection in order to download patient list
)}\r\n\t\t\t
\r\n\r\n\t\t\t */}\r\n\t\t\r\n\t)\r\n}\r\n\r\n","import { BreastDashboard } from \"./dashboard\";\r\nimport { BreastFilters } from \"./filters\";\r\nimport * as React from \"react\";\r\n\r\nexport { BreastFilters }\r\n\r\n\r\nexport class BreastDashboardHome extends React.Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n width: 0,\r\n height: 0\r\n }; \r\n\r\n }\r\n\r\n private updateDimensions = () => {\r\n this.setState({ width: window.innerWidth, height: window.innerHeight });\r\n };\r\n \r\n public componentWillUnmount() {\r\n window.removeEventListener('resize', this.updateDimensions);\r\n }\r\n \r\n public componentDidMount() {\r\n window.addEventListener('resize', this.updateDimensions);\r\n }\r\n\r\n render = () => {\r\n return (\r\n <>\r\n \r\n \r\n )\r\n\r\n }\r\n}\r\n","import { \r\n IPlotData as ICorePlotData, createPlotData as createCorePlotData, \r\n ISourceData as ICoreSourceData, createData as createCoreData, addDataFactory, addSet \r\n} from \"models/core\";\r\nimport { IDashboardViewModel } from \"./core\";\r\n\r\n/**\r\n * Plot data source\r\n */\r\nexport type IPlotData = ICorePlotData;\r\n\r\n/**\r\n * Source data\r\n */\r\nexport type ISourceData = ICoreSourceData;\r\n\r\n/**\r\n * Raw data source. Used to shape and accumulate.\r\n */\r\nexport interface ISourceBuilder {\r\n uniques: Set;\r\n values: ISourceData;\r\n}\r\n\r\n/**\r\n * Create a new plot data object.\r\n */\r\nexport const createPlotData = createCorePlotData;\r\n\r\n/**\r\n * Create a new source data object\r\n */\r\nexport function createBuilder(): ISourceBuilder {\r\n return {\r\n uniques: new Set(),\r\n values: createCoreData(),\r\n };\r\n}\r\n\r\nconst add = addDataFactory((vm: IDashboardViewModel) => (vm.primarySite.name == 'Digestive organs' ? vm.reportingPrimarySite.name : 'Other'));\r\n\r\n/**\r\n * Returns the number added to the hierarchy on add, 0 otherwise. \r\n * @param vm \r\n * @param into \r\n */\r\nexport function addData(vm: IDashboardViewModel, into: ISourceBuilder): number {\r\n //Only count once per diagnosis per morphology.\r\n if (addSet(vm.reportingPrimarySite.id + \"_\" + vm.diagnosisId, into.uniques)) {\r\n add(vm, into.values);\r\n return 1;\r\n }\r\n\r\n return 0;\r\n}\r\n\r\n/**\r\n * Compare sourceData[a] to sourceData[b] and return -1 when a is less than b, 0 when equal, 1 when a is greater than 0\r\n * @param a \r\n * @param b \r\n */\r\nexport const sort = (s: ISourceData, a: string, b: string): number => {\r\n return ((s[a] > s[b]) ? -1 : ((s[a] < s[b]) ? 1 : 0));\r\n};\r\n\r\n/** \r\n * Complete adding data and clear any temporary resources \r\n */\r\nexport function finish(builder: ISourceBuilder): ISourceData {\r\n try {\r\n return builder.values;\r\n } finally {\r\n builder.uniques.clear();\r\n builder.uniques = null;\r\n builder.values = null;\r\n builder = null;\r\n }\r\n}","import { \r\n IPlotData as ICorePlotData, createPlotData as createCorePlotData, \r\n ISourceData as ICoreSourceData, createData as createCoreData, addDataFactory, addSet \r\n} from \"models/core\";\r\nimport { IDashboardViewModel } from \"./core\";\r\n\r\n/**\r\n * Plot data source\r\n */\r\nexport type IPlotData = ICorePlotData;\r\n\r\n/**\r\n * Source data\r\n */\r\nexport type ISourceData = ICoreSourceData;\r\n\r\n/**\r\n * Raw data source. Used to shape and accumulate.\r\n */\r\nexport interface ISourceBuilder {\r\n uniques: Set;\r\n values: ISourceData;\r\n}\r\n\r\n/**\r\n * Create a new plot data object.\r\n */\r\nexport const createPlotData = createCorePlotData;\r\n\r\n/**\r\n * Create a new source data object\r\n */\r\nexport function createBuilder(): ISourceBuilder {\r\n return {\r\n uniques: new Set(),\r\n values: createCoreData(),\r\n };\r\n}\r\n\r\nconst add = addDataFactory((vm: IDashboardViewModel) => vm.morphology.name);\r\n\r\n/**\r\n * Returns the number added to the hierarchy on add, 0 otherwise. \r\n * @param vm \r\n * @param into \r\n */\r\nexport function addData(vm: IDashboardViewModel, into: ISourceBuilder): number {\r\n //Only count once per diagnosis per morphology.\r\n if (addSet(vm.morphology.id + \"_\" + vm.diagnosisId, into.uniques)) {\r\n add(vm, into.values);\r\n return 1;\r\n }\r\n\r\n return 0;\r\n}\r\n\r\n/**\r\n * Compare sourceData[a] to sourceData[b] and return -1 when a is less than b, 0 when equal, 1 when a is greater than 0\r\n * @param a \r\n * @param b \r\n */\r\nexport const sort = (s: ISourceData, a: string, b: string): number => {\r\n return ((s[a] < s[b]) ? -1 : ((s[a] > s[b]) ? 1 : 0));\r\n};\r\n\r\n/** \r\n * Complete adding data and clear any temporary resources \r\n */\r\nexport function finish(builder: ISourceBuilder): ISourceData {\r\n try {\r\n return builder.values;\r\n } finally {\r\n builder.uniques.clear();\r\n builder.uniques = null;\r\n builder.values = null;\r\n builder = null;\r\n }\r\n}","\r\nimport {\r\n AddDataSharedFunc, DashboardSharedFilterFunc, DashboardSharedFilterKey,\r\n EcogGroup,\r\n HHSOfResidence,\r\n IDashboardSharedChartData, IDashboardSharedDimensionsViewModel, Remoteness, TnmStage,\r\n} from \"models/common\";\r\nimport { IFilters, IFilterKeys, DimensionsById, ISourceData, IDimension, IDimMDT, IDimFacility } from \"models/core\";\r\n\r\n//Plots for this dashboard\r\nimport * as ReviewsByPeriod from \"./reviewByPeriodHierarchy\";\r\nimport * as PrimarySite from \"./primarySiteHierarchy\";\r\nimport * as PrimarySiteSummary from \"./primarySiteSummary\";\r\nimport * as Morphology from \"./morphology\";\r\nimport { IDashboardViewModel } from \"./viewModel\";\r\n\r\nexport { type IDashboardDataQualityViewModel, type IDashboardViewModel } from \"./viewModel\";\r\n\r\nexport interface IDashboardSource {\r\n eligible: IDashboardViewModel[];\r\n ineligible: IDashboardViewModel[];\r\n}\r\n\r\nexport interface IDashboardDimensionsViewModel extends IDashboardSharedDimensionsViewModel {\r\n hhsResidenceGroups?: DimensionsById;\r\n dataQualityIndicators?: DimensionsById;\r\n monthsArray?: Array;\r\n yearsArray?: Array;\r\n months?: { [monthId: number]: string };\r\n years?: { [yearId: number]: string };\r\n dqCompFacility?: { [facilityYearKey: string]: number };\r\n dqCompState?: { [facilityYearKey: string]: number };\r\n oneYearSurvivalMDT?: { [mdtDiagYearKey: string]: { \"MDT\": number, \"State\": number } };\r\n threeYearSurvivalMDT?: { [mdtDiagYearKey: string]: { \"MDT\": number, \"State\": number } };\r\n fiveYearSurvivalMDT?: { [mdtDiagYearKey: string]: { \"MDT\": number, \"State\": number } };\r\n tenYearSurvivalMDT?: { [mdtDiagYearKey: string]: { \"MDT\": number, \"State\": number } };\r\n kmSurvivalMDT?: {[mdtCancerKey: string]: { survivalTime: string, mdtKMSurvival: number, stateKMSurvival: number }};\r\n\r\n}\r\n\r\ninterface ILevel1ChartData {\r\n totalDiagnoses: {colon: number, rectal: number};\r\n\ttotalDataQualityEligibleDiagnoses: number;\r\n\tfacilities: IDimFacility[];\r\n\thhses: IDimension[];\r\n\tmdts: IDimMDT[];\r\n\tmonth: IDimension[];\r\n\tyear: IDimension[];\r\n\r\n diagToSurg30Days: { colon:{ numerator, denominator: number, percentage: number }, rectal: { numerator, denominator: number, percentage: number } };\r\n diagToFirstTreatment30Days: { colon:{ numerator, denominator: number, percentage: number }, rectal: { numerator, denominator: number, percentage: number } };\r\n diagToFirstST42Days: { colon:{ numerator, denominator: number, percentage: number }, rectal: { numerator, denominator: number, percentage: number } };\r\n lengthOfStay: { colon: {lowerquart: number, median: number, upperquart: number }, rectal: {lowerquart: number, median: number, upperquart: number }} ;\r\n prolongedLOS: { colon:{ numerator, denominator: number, percentage: number }, rectal: { numerator, denominator: number, percentage: number } };\r\n hadAnastomicLeak: { colon:{ numerator, denominator: number, percentage: number }, rectal: { numerator, denominator: number, percentage: number } };\r\n hadAnastomicLeakDied90Days:{ colon:{ numerator, denominator: number, percentage: number }, rectal: { numerator, denominator: number, percentage: number } };\r\n lapConvertedOpenSurg: { colon:{ numerator, denominator: number, percentage: number }, rectal: { numerator, denominator: number, percentage: number } };\r\n hadStomaAtSurg: { colon:{ numerator, denominator: number, percentage: number }, rectal: { numerator, denominator: number, percentage: number } };\r\n hadAbdominoperinealResection: { colon:{ numerator, denominator: number, percentage: number }, rectal: { numerator, denominator: number, percentage: number } };\r\n inpatientDeath: { colon:{ numerator, denominator: number, percentage: number }, rectal: { numerator, denominator: number, percentage: number } };\r\n death30Days: { colon:{ numerator, denominator: number, percentage: number }, rectal: { numerator, denominator: number, percentage: number } };\r\n death90Days: { colon:{ numerator, denominator: number, percentage: number }, rectal: { numerator, denominator: number, percentage: number } };\r\n stage3Adjuvant: { colon:{ numerator, denominator: number, percentage: number }, rectal: { numerator, denominator: number, percentage: number } };\r\n neoAdjuvantXRT: { colon:{ numerator, denominator: number, percentage: number }, rectal: { numerator, denominator: number, percentage: number } };\r\n survival365Days: { colon:{ numerator, denominator: number, percentage: number }, rectal: { numerator, denominator: number, percentage: number } };\r\n survival730Days: { colon:{ numerator, denominator: number, percentage: number }, rectal: { numerator, denominator: number, percentage: number } };\r\n survival1825Days: { colon:{ numerator, denominator: number, percentage: number }, rectal: { numerator, denominator: number, percentage: number } };\r\n\t// Export\r\n\tfilteredReferralIdCsv: string;\r\n}\r\n\r\n// HACK: chop out the reference array from the shared interface \r\ntype RestrictedSharedChartData = Omit, \"hhses\">, \"tnmStage\">, \"ecogGroup\">;\r\n\r\ninterface ILevel2ChartData extends RestrictedSharedChartData {\r\n\ttotalDiagnoses: number;\r\n\tprimarySite: PrimarySite.IHierarchyPlotData;\r\n\tmorphology: Morphology.IPlotData;\r\n\tremoteness: Remoteness.IPlotData;\r\n\thhsOfResidence: HHSOfResidence.IPlotData;\r\n tnmStage: {colon: TnmStage.IPlotData, rectal: TnmStage.IPlotData};\r\n ecogGroup: {colon: EcogGroup.IPlotData, rectal: EcogGroup.IPlotData};\r\n}\r\n\r\nexport interface IChartData {\r\n\tlevel1: ILevel1ChartData;\r\n\tlevel2: ILevel2ChartData;\r\n}\r\n\r\nconst FilterKey: IFilterKeys = {\r\n HHSResidenceGroup: { key: \"HHSResidenceGroup\", label: \"HHS residence group\" },\r\n HHSOfResidence: { key: \"HHSOfResidence\", label: \"HHS of residence\" },\r\n DataQualityEligible: { key: \"DataQualityEligible\", label: \"Data quality eligible\" },\r\n PrimarySite: { key: \"PrimarySite\", label: \"Primary site\" },\r\n Morphology: { key: \"Morphology\", label: \"Morphology\" },\r\n Remoteness: { key: \"Remoteness\", label: \"Rurality\" },\r\n FirstTreatment: { key: \"FirstTreatment\", label: \"First Treatment\" },\r\n TimeToFirstTreatment: { key: \"TimeToFirstTreatment\", label: \"Time To First Treatment\" },\r\n DiagMonth: { key: \"DiagMonth\", label: \"Diagnosis Month\" },\r\n DiagYear: { key: \"DiagYear\", label: \"Diagnosis Year\" },\r\n MdtMonth: { key: \"MdtMonth\", label: \"MDT Month\" },\r\n // DaysFromDiagToSurg: { key: \"DaysFromDiagToSurg\", label: \"Days From Diagnosis To Surgery <= 30 Days\" },\r\n // InHospitalMortality: { key: \"InHospitalMortality\", label: \"In Hospital Mortality\" },\r\n // ThirtyDayMortality: { key: \"ThirtyDayMortality\", label: \"30 Day Mortality\" },\r\n // NinetyDayMortality: { key: \"NinetyDayMortality\", label: \"90 Day Mortality\" },\r\n // OneYearSurvival: { key: \"OneYearSurvival\", label: \"1 Year Survival\" },\r\n // TwoYearSurvival: { key: \"TwoYearSurvival\", label: \"2 Year Survival\" },\r\n // Stage3AdjuvantTx: { key: \"Stage3AdjuvantTx\", label: \"Stage 3 Adjuvant Therapy\" },\r\n // NeoAdjuvantXRT: { key: \"NeoAdjuvantXRT\", label: \"Neo Adjuvant XRT\" },\r\n}\r\n\r\nexport const DashboardFilterKeys: IFilterKeys = {\r\n ...DashboardSharedFilterKey,\r\n ...FilterKey\r\n}\r\n\r\nexport type Filters = IFilters;\r\nexport type DashboardFilterFunc = DashboardSharedFilterFunc;\r\nexport type AddDataFunc = AddDataSharedFunc;\r\n\r\n","import { IChartData, IDashboardDimensionsViewModel, Filters } from \"../plotData\";\r\n\r\n//Actions / requests\r\nexport enum WorkerRequestType { Ping, Fetch, ChartData }\r\nexport interface IWorkerFetchRequest { all: boolean, rawRefs: any, rawRows: string, minYear: number }\r\nexport interface IWorkerChartDataRequest { filtersToApply: Filters, minYear: number };\r\nexport interface IWorkerRequest {\r\n type: WorkerRequestType;\r\n id: string;\r\n payload?: any; //?\r\n}\r\n\r\n//Results\r\nexport enum WorkerResultType { Ping, Fetch, ChartData, InvalidType }\r\nexport interface IWorkerResult {\r\n type: WorkerResultType;\r\n id: string;\r\n payload?: any; //?\r\n}\r\nexport interface IWorkerPingResult {}\r\nexport interface IWorkerFetchResult { allData: boolean, references: IDashboardDimensionsViewModel, chartData: IChartData }\r\nexport type IWorkerChartDataResult = IChartData;","export default function Worker_fn() {\n return new Worker(__webpack_public_path__ + \"data.worker.8e6dd7d78ce521f6640a.worker.js\");\n}\n","import { generateUUID } from \"helpers\";\r\nimport { getCRCDashboard, getCRCDashboardReferences } from \"api/dashboardApi\";\r\nimport { Filters } from \"../plotData\";\r\nimport { IWorkerChartDataRequest, IWorkerChartDataResult, IWorkerFetchRequest, IWorkerFetchResult, IWorkerPingResult, IWorkerRequest, WorkerRequestType, WorkerResultType } from \"./models\";\r\nimport DataWorker from 'worker-loader!./data.worker';\r\nexport type { IWorkerChartDataResult, IWorkerFetchResult, IWorkerPingResult, IWorkerRequest, WorkerRequestType }\r\n\r\n//#region Worker\r\n\r\nlet worker: DataWorker = null;\r\nlet promises = {};\r\nlet data = {\r\n minYear: 0,\r\n}\r\n\r\n/**\r\n * Start the Worker\r\n */\r\nexport function start(minYear: number) {\r\n data.minYear = minYear;\r\n\r\n if (!window[\"Worker\"]) {\r\n console.log(\"WebWorker not supported\");\r\n return false;\r\n\r\n } else {\r\n console.log(\"WebWorker starting\");\r\n\r\n worker = worker || new DataWorker();\r\n\r\n /**\r\n * When the worker sends an error back to the main thread, resolve the associated promise.\r\n */\r\n worker.addEventListener(\"message\", (ev: MessageEvent) => {\r\n const { data: { id, type, payload } } = ev;\r\n\r\n //Any specific handling by message type\r\n switch (type as WorkerResultType) {\r\n // case WorkerResultType.Ping: {\r\n // case WorkerResultType.Fetch: {\r\n default: {\r\n //Default handler will just resolve\r\n promises[id]?.resolve(payload);\r\n break;\r\n }\r\n }\r\n\r\n promises[id] = undefined;\r\n });\r\n\r\n /**\r\n * When the worker sends an error back to the main thread, reject the associated promise.\r\n */\r\n worker.addEventListener(\"messageerror\", (ev: MessageEvent) => {\r\n const { data: { id, type, payload } } = ev;\r\n\r\n //Any specific handling by message type\r\n switch (type) {\r\n //case WorkerResultType.Ping: {\r\n //case WorkerResultType.Fetch: {\r\n default: {\r\n console.error(\"ERROR from worker\", payload);\r\n promises[id].reject(payload);\r\n break;\r\n }\r\n }\r\n\r\n promises[id] = undefined;\r\n });\r\n\r\n return true;\r\n }\r\n}\r\n\r\n/**\r\n * Post the message to the Worker\r\n * @param request \r\n */\r\nfunction send(request: IWorkerRequest) {\r\n worker.postMessage(request);\r\n}\r\n\r\n/**\r\n * Transform into a Promise and track it.\r\n * @param type \r\n * @param payload \r\n */\r\nfunction actionPromise(type: WorkerRequestType, payload: TIn): Promise {\r\n const id = generateUUID();\r\n promises[id] = {};\r\n promises[id].promise = new Promise((resolve, reject) => {\r\n send({ id, type, payload });\r\n\r\n promises[id].resolve = resolve;\r\n promises[id].reject = reject;\r\n });\r\n\r\n return promises[id].promise;\r\n}\r\n\r\nexport function ping(): Promise {\r\n return actionPromise(WorkerRequestType.Ping, null);\r\n}\r\n\r\n/**\r\n * Fetch the data from the server, then push it to the Worker for processing.\r\n * @param all \r\n */\r\nexport function fetch(all: boolean): Promise {\r\n //WebWorker cannot access sessionStorage so do the api call here and\r\n //send the data tp it.\r\n \r\n return Promise.all([\r\n getCRCDashboard(all),\r\n getCRCDashboardReferences(all),\r\n ])\r\n .then(results => {\r\n return actionPromise(WorkerRequestType.Fetch, {\r\n all,\r\n rawRows: results[0] as string,\r\n rawRefs: results[1] as any,\r\n minYear: data.minYear,\r\n });\r\n });\r\n\r\n}\r\n\r\n/**\r\n * Apply the filters in the Worker and return the ChartData\r\n * @param filtersToApply \r\n */\r\nexport function chartData(filtersToApply: Filters): Promise {\r\n return actionPromise(WorkerRequestType.ChartData, {\r\n filtersToApply,\r\n minYear: data.minYear,\r\n });\r\n}\r\n\r\n/** Terminate the worker */\r\nexport function stop() {\r\n worker && worker.terminate();\r\n worker = null;\r\n console.log(\"WebWorker terminated\");\r\n}\r\n\r\n//#endregion Worker\r\n","import { AddFilterBaseFunc, FilterContext, RemoveFilterBaseFunc } from \"../core\";\r\nimport { DashboardFilterKeys, Filters, IChartData, IDashboardDimensionsViewModel } from \"./plotData\";\r\nexport { type IChartData, type IDashboardDimensionsViewModel, DashboardFilterKeys, type Filters } from \"./plotData\";\r\nexport type AddFilterFunc = AddFilterBaseFunc;\r\nexport type RemoveFilterFunc = RemoveFilterBaseFunc;\r\n\r\nimport * as DashWorker from \"./worker\";\r\n\r\n\r\n\r\nexport interface IMDTDashboard {\r\n\tallData: boolean;\r\n\treferences: IDashboardDimensionsViewModel;\r\n\tfilters: Filters;\r\n\tchartData: IChartData;\r\n\tselectedFacilities: Set;\r\n selectedHhses: Set;\r\n //onlyDataQualityEligible: boolean;\r\n}\r\n\r\n\r\nexport const initState = (): IMDTDashboard => {\r\n\treturn {\r\n\t\tallData: false,\r\n\t\treferences: {},\r\n\t\tchartData: null,\r\n\t\tfilters: {},\r\n\t\tselectedFacilities: new Set(),\r\n\t\tselectedHhses: new Set(),\r\n\t\t//onlyDataQualityEligible: false,\r\n\t}\r\n};\r\n\r\n\r\nexport const loadMdtDashboard = async (state: IMDTDashboard): Promise => {\r\n\tDashWorker.start(2010);\r\n\ttry {\r\n\t\tawait DashWorker.ping()\r\n\t\tconsole.log(\"WORKER PING RESOLVED\");\r\n\t\treturn await fetchData(state, state.allData);\r\n\t} catch {\r\n\t\tconsole.error(\"WORKER PING FAILED\");\r\n\t}\r\n}\r\n\r\nexport const clearFilters = (state: IMDTDashboard): IMDTDashboard => {\r\n\tconst maybeSetDefaultFilter = (filterKey: string, dimensions: { name: string }[]): Set => {\r\n\t\tif (!dimensions || dimensions.length !== 1)\r\n\t\t\treturn (new Set());\r\n\r\n\t\tif (state.allData)\r\n\t\t\treturn (new Set());\r\n\r\n\t\tlet filterSet = new Set();\r\n\t\tfilterSet.add(dimensions[0].name);\r\n\r\n\t\tstate = addFilter(state)(filterKey, [dimensions[0].name])\r\n\t\treturn filterSet;\r\n\t}\r\n\r\n\tstate.filters = {};\r\n\tstate.selectedHhses = maybeSetDefaultFilter(DashboardFilterKeys.HHS.key, state.chartData.level1.hhses);\r\n\tstate.selectedFacilities = maybeSetDefaultFilter(DashboardFilterKeys.Facility.key, state.chartData.level1.facilities);\r\n\r\n\treturn { ... state };\r\n\r\n}\r\n\r\n\r\n\r\nexport const closeMdtDashboard = () =>\r\n\tDashWorker.stop();\r\n\r\nconst fetchData = async (state: IMDTDashboard, all: boolean): Promise => {\r\n\ttry {\r\n\t\tconst data = await DashWorker.fetch(all);\r\n\r\n\t\tconst maybeSetDefaultFilter = (filterKey: string, dimensions: { name: string }[]): Set => {\r\n\t\t\tif (!dimensions || dimensions.length !== 1)\r\n\t\t\t\treturn (new Set());\r\n\r\n\t\t\tif (all)\r\n\t\t\t\treturn (new Set());\r\n\r\n\t\t\tlet filterSet = new Set();\r\n\t\t\tfilterSet.add(dimensions[0].name);\r\n\r\n\t\t\tstate = addFilter(state)(filterKey, [dimensions[0].name])\r\n\t\t\treturn filterSet;\r\n\t\t}\r\n\r\n\t\tstate.selectedHhses = maybeSetDefaultFilter(DashboardFilterKeys.HHS.key, data.chartData.level1.hhses);\r\n state.selectedFacilities = maybeSetDefaultFilter(DashboardFilterKeys.Facility.key, data.chartData.level1.facilities);\r\n\t\tstate.allData = all;\r\n\t\tstate.references = data.references;\r\n\t\tstate.chartData = data.chartData;\r\n\t\t\r\n\t\treturn state;\r\n\t} catch {\r\n\t\tconsole.error(\"WORKER FETCHDATA FAILED\");\r\n\t\treturn state;\r\n\t}\r\n}\r\n\r\nexport const computeChartData = async (state: IMDTDashboard): Promise => {\r\n\ttry {\r\n\t\tconst data = await DashWorker.chartData(state.filters);\r\n\t\tstate.chartData = data;\r\n\t\treturn {...state};\r\n\t} catch {\r\n\t\tconsole.error(\"WORKER COMPUTECHARTDATA FAILED\")\r\n\t\treturn state;\r\n\t}\r\n}\r\n\r\nexport const addFilter = (state: IMDTDashboard) => (key: keyof typeof DashboardFilterKeys, value: string | string[], context?: FilterContext, labelOverride?: string): IMDTDashboard => {\r\n\tconst filters: Filters = Object.assign({}, state.filters);\r\n\tconst values = (typeof value === \"string\")\r\n\t\t? [value]\r\n\t\t: value;\r\n\r\n\t//Replace the existing path entry if we are replacing a multi-value filter\r\n\t//to do so: traverse to the parent\r\n\tconst baseContext: FilterContext = context && ((context.values().length > 1) ? context.parent() : context) || new FilterContext();\r\n\tbaseContext.push(values);\r\n\r\n\tfilters[key] = ({ value: values, labelOverride, parts: baseContext.parts });\r\n\r\n\tstate.filters = filters;\r\n\treturn {...state};\r\n}\r\n\r\n\r\n\r\nexport const removeFilter = (state: IMDTDashboard, key: keyof typeof DashboardFilterKeys, value?: string, labelOverride?: string): IMDTDashboard => {\r\n\tconst filters: Filters = Object.assign({}, state.filters);\r\n\tconst valueToRemove: string = value || null;\r\n\tconst context = FilterContext.fromFilters(filters, key);\r\n\tconst values = context.values();\r\n\tconst newValue = (valueToRemove ? values.filter(p => p != valueToRemove): null);\r\n\r\n\tconst n = context.parent() || new FilterContext();\r\n\tif (newValue) {\r\n\t\tn.push(newValue);\r\n\t}\r\n\tfilters[key] = ({value: n.values(), labelOverride, parts: n.parts});\r\n\r\n\tif (n.parts.length === 0) {\r\n\t\tdelete filters[key];\r\n\t}\r\n\r\n\tstate.filters = filters;\r\n\treturn {...state};\r\n}\r\n\r\n\r\n\r\n /**\r\n * Exports a string with the current filters selected and their values.\r\n */\r\nexport function extractFilterLabel(filterValues, spacer) {\r\n\r\nlet filters = [];\r\n\r\nfor (const key in DashboardFilterKeys) {\r\n\tif (Object.prototype.hasOwnProperty.call(DashboardFilterKeys, key)) {\r\n\t\tfilters.push({\"key\": key, \"label\": DashboardFilterKeys[key].label});\r\n\t}\r\n}\r\n\r\nlet filterString = \"\";\r\n\tif (filterValues) {\r\n\tfor (var key of Object.keys(filterValues)) {\r\n\t\t\tfilterValues[key].parts.forEach(p => {\r\n\t\t\t\tfilterString += ((filters.find(id => id.key == key).label + \":\" +\" \" + p + spacer));\r\n\t\t\t\t}) \r\n\t\r\n\t}\r\n}\r\n\r\nreturn filterString.substring(0, filterString.length -2);\r\n}\r\n","import * as React from \"react\"\r\nimport * as CRC from \"models/crc\";\r\nimport { AppContext } from \"AppContext\";\r\nimport { ActionTypes } from \"reducer/actions\";\r\nimport { Button, Paper, Table, TableBody, TableCell, TableContainer, TableHead, TableRow } from \"@mui/material\";\r\nimport ReportApi from \"api/reportApi\";\r\nimport * as fileHelper from \"helpers/fileHelper\";\r\nimport { FilterContext } from \"models/core/filter\";\r\nimport { ColonIndicatorDefinitionsUrl, RectalIndicatorDefinitionsUrl } from \"config/appUrlConfig\";\r\nimport { DashChip } from \"components/common/DashChips\";\r\nimport { Download, Downloading } from \"@mui/icons-material\";\r\nimport { getStateIndicatorReferences } from \"api/dashboardApi\";\r\nimport Loader from \"pages/shared/pageloader\";\r\n\r\nenum CRCIndicatorAction {\r\n\tUserClickedDownloadIndicator,\r\n\tDownloadIndicatorSuccess,\r\n\tDownloadIndicatorFail\r\n}\r\n\r\ntype Action =\r\n\t{ type: CRCIndicatorAction.UserClickedDownloadIndicator, payload: number }\r\n\t| { type: CRCIndicatorAction.DownloadIndicatorSuccess }\r\n\t| { type: CRCIndicatorAction.DownloadIndicatorFail }\r\n\r\n\r\ninterface State {\r\n\tindicator: number\r\n}\r\n\r\nconst initialState: State = {\r\n\tindicator: 0\r\n}\r\n\r\n\r\n\r\nconst reducer = (state: State, action: Action): State => {\r\n\tconst { type } = action;\r\n\r\n\tswitch (type) {\r\n\t\tcase CRCIndicatorAction.UserClickedDownloadIndicator:\r\n\t\t\treturn { ...state, ...{ indicator: action.payload } };\r\n\r\n\t\tcase CRCIndicatorAction.DownloadIndicatorSuccess:\r\n\t\tcase CRCIndicatorAction.DownloadIndicatorFail:\r\n\t\t\treturn { ...state, ...{ indicator: 0 } };\r\n\r\n\t\tdefault:\r\n\t\t\treturn state;\r\n\t}\r\n}\r\n\r\nlet stateWideData: {\r\n\ttitle?: string;\r\n\tpatientsColon?: string;\r\n\tdaysFromDiagToSurgLT30Colon?: string;\r\n\thospitalStayDaysColon?: string;\r\n\tprolongedLOSGT21DaysColon?: string;\r\n\thadAnastomicLeakColon?: string;\r\n\thadAnastomicLeakAndDiedWithin90DaysColon?: string;\r\n\tlapConvertedToOpenSurgColon?: string;\r\n\thadStomaAtSurgColon?: string;\r\n\tinHospitalMortalityColon?: string;\r\n\tmortality30DaysColon?: string;\r\n\tmortality90DaysColon?: string;\r\n\tstage3AdjuvantSTColon?: string;\r\n\toneYearSurvivalColon?: string;\r\n\ttwoYearSurvivalColon?: string;\r\n\tfiveYearSurvivalColon?: string;\r\n\tpatientsRectal?: string;\r\n\tdaysFromDiagToSurgLT30Rectal?: string;\r\n\thospitalStayDaysRectal?: string;\r\n\tprolongedLOSGT21DaysRectal?: string;\r\n\thadAnastomicLeakRectal?: string;\r\n\thadAnastomicLeakAndDiedWithin90DaysRectal?: string;\r\n\tlapConvertedToOpenSurgRectal?: string;\r\n\thadStomaAtSurgRectal?: string;\r\n\thadAbdominoperinealResectionRectal?: string;\r\n\tinHospitalMortalityRectal?: string;\r\n\tmortality30DaysRectal?: string;\r\n\tmortality90DaysRectal?: string;\r\n\tstage3AdjuvantSTRectal?: string;\r\n\tneoadjuvantXRTRectal?: string;\r\n\toneYearSurvivalRectal?: string;\r\n\ttwoYearSurvivalRectal?: string;\r\n\tfiveYearSurvivalRectal?: string;\r\n\thadFirstIVSTWT42DaysColon?: string;\r\n\thadFirstIVSTWT42DaysRectal?: string;\r\n\thadFirstTreatmentWT30DaysColon?: string;\r\n\thadFirstTreatmentWT30DaysRectal?: string;\r\n} = {};\r\n\r\nexport function CrcDashboard() {\r\n\tconst { state, dispatch } = React.useContext(AppContext);\r\n\tconst [localState, localDispatch] = React.useReducer(reducer, initialState)\r\n\r\n\tconst [showFilterChips, setFilterChips] = React.useState(true);\r\n\r\n\t//Set states to be able to switch between indicator views \r\n\tconst [viewBy, setViewBy] = React.useState(null);\r\n\tconst [daysFromDiagToSurgInd, setDaysFromDiagToSurgInd] = React.useState(0);\r\n\tconst [inHospitalMortalityInd, setInHospitalMortalityInd] = React.useState(0);\r\n\tconst [thirtyDayMortalityInd, setThirtyDayMortalityInd] = React.useState(0);\r\n\tconst [ninetyDayMortalityInd, setNinetyDayMortalityInd] = React.useState(0);\r\n\tconst [oneYearSurvivalInd, setOneYearSurvivalInd] = React.useState(0);\r\n\tconst [twoYearSurvivalInd, setTwoYearSurvivalInd] = React.useState(0);\r\n\tconst [stage3AdjuvantTxInd, setStage3AdjuvantTxInd] = React.useState(0);\r\n\tconst [neoAdjuvantXRTInd, setNeoAdjuvantXRTInd] = React.useState(0);\r\n\r\n\tconst addFilter: CRC.AddFilterFunc = async (key: keyof typeof CRC.DashboardFilterKeys, value: string | string[], context?: FilterContext, labelOverride?: string) => {\r\n\t\tconst filteredDashboard = await CRC.computeChartData(CRC.addFilter(state.page.dashboard as CRC.IMDTDashboard)(key, value, context, labelOverride)); // state = what the other filter function returns \r\n\t\tdispatch({ type: ActionTypes.UserClickedOnChart, payload: filteredDashboard });\r\n\t}\r\n\r\n\tconst removeFilter: CRC.RemoveFilterFunc = async (key: keyof typeof CRC.DashboardFilterKeys, value?: string) => {\r\n\r\n\t\tconst filteredDashboard = await CRC.computeChartData(CRC.removeFilter(state.page.dashboard as CRC.IMDTDashboard, key, value));\r\n\t\tdispatch({ type: ActionTypes.UserClickedOnChart, payload: filteredDashboard });\r\n\t}\r\n\r\n\tReact.useEffect(() => {\r\n\t\tdispatch({ type: ActionTypes.UserWantsToLoadMdtDashboard });\r\n\t\tconst fetchStateReferenceData = async () => {\r\n\t\t\tstateWideData = await getStateIndicatorReferences(\"colorectal\");\r\n\t\t}\r\n\r\n\t\tconst loadDashboard = async () => {\r\n\t\t\tconst value = await CRC.loadMdtDashboard(state.page.dashboard as CRC.IMDTDashboard);\r\n\t\t\tdispatch({ type: ActionTypes.UserLoadedMdtDashboard, payload: value });\r\n\t\t}\r\n\r\n\t\tPromise.all([fetchStateReferenceData(), loadDashboard()]);\r\n\t\treturn () => {\r\n\t\t\tCRC.closeMdtDashboard();\r\n\t\t}\r\n\t}, []);\r\n\r\n\tReact.useEffect(() => {\r\n\t\tif (localState.indicator == 0)\r\n\t\t\treturn;\r\n\r\n\t\tlet ids = crcData.level1.filteredReferralIdCsv;\r\n\t\tlet alldata = false;\r\n\r\n\r\n\t\tconst getCRCIndicatorPatientList = async () => {\r\n\t\t\ttry {\r\n\t\t\t\tconst data = await ReportApi.getCRCIndicatorPatientList(ids, alldata, localState.indicator);\r\n\t\t\t\tif (data.errorMessage) {\r\n\t\t\t\t\tconsole.error(data.errorMessage);\r\n\t\t\t\t\tlocalDispatch({ type: CRCIndicatorAction.DownloadIndicatorFail })\r\n\t\t\t\t}\r\n\t\t\t\tlocalDispatch({ type: CRCIndicatorAction.DownloadIndicatorSuccess })\r\n\t\t\t\treturn fileHelper.showFile(data.bytes, data.filename, fileHelper.fileTypeToMimeType(data.filetype), \"exportPatientsElem\")\r\n\t\t\t} catch {\r\n\t\t\t\tlocalDispatch({ type: CRCIndicatorAction.DownloadIndicatorFail })\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tgetCRCIndicatorPatientList();\r\n\r\n\r\n\t}, [localState.indicator]);\r\n\r\n\tif (state.page.loading || !state.page.dashboard.chartData)\r\n\t\treturn \r\n\r\n\t//Create function to show/hide filter chips\r\n\tconst toggleChips = () => {\r\n\t\tif (showFilterChips) {\r\n\t\t\tsetFilterChips(false);\r\n\t\t} else {\r\n\t\t\tsetFilterChips(true);\r\n\t\t}\r\n\t};\r\n\r\n\tlet activeFiltersArray = [];\r\n\tlet filterArray = [];\r\n\tlet chips = [];\r\n\r\n\tfor (const key in state.page.dashboard.filters) {\r\n\t\tif (Object.prototype.hasOwnProperty.call(state.page.dashboard.filters, key)) {\r\n\t\t\tactiveFiltersArray.push({ \"key\": key, \"values\": state.page.dashboard.filters[key].value, \"parts\": state.page.dashboard.filters[key].parts });\r\n\t\t}\r\n\t}\r\n\r\n\tfor (const key in CRC.DashboardFilterKeys) {\r\n\t\tif (Object.prototype.hasOwnProperty.call(CRC.DashboardFilterKeys, key)) {\r\n\t\t\tfilterArray.push({ \"key\": key, \"label\": CRC.DashboardFilterKeys[key].label });\r\n\t\t}\r\n\t}\r\n\r\n\tactiveFiltersArray.forEach(a => {\r\n\t\ta.values.forEach(b => {\r\n\t\t\tchips.push( id.key == a.key).label}\r\n\t\t\t\tfilterValue={b}\r\n\t\t\t\tfilterId={a.key}\r\n\t\t\t\tfilterParent={(a.parts.length > 1 ? a.parts[0] : null)}\r\n\t\t\t/>\r\n\t\t\t)\r\n\t\t})\r\n\t})\r\n\r\n\tconst crcData = state.page.dashboard.chartData as CRC.IChartData;\r\n\r\n\r\n\tconst downloadBtn = (extractTypeId: number) => {\r\n\t\tconst { indicator } = localState;\r\n\r\n\t\tif (indicator == extractTypeId)\r\n\t\t\treturn \r\n\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\tlocalDispatch({ type: CRCIndicatorAction.UserClickedDownloadIndicator, payload: extractTypeId })} />\r\n\t\t)\r\n\t}\r\n\r\n\r\n\tconst ecog = {\r\n\t\tcolon: {\r\n\t\t\tnumerator: 0,\r\n\t\t\tdenominator: 0,\r\n\t\t\tpercentage: 0\r\n\t\t},\r\n\t\trectal: {\r\n\t\t\tnumerator: 0,\r\n\t\t\tdenominator: 0,\r\n\t\t\tpercentage: 0\r\n\t\t}\r\n\r\n\t}\r\n\r\n\tconst stage = {\r\n\t\tcolon: {\r\n\t\t\tnumerator: 0,\r\n\t\t\tdenominator: 0,\r\n\t\t\tpercentage: 0\r\n\t\t},\r\n\t\trectal: {\r\n\t\t\tnumerator: 0,\r\n\t\t\tdenominator: 0,\r\n\t\t\tpercentage: 0\r\n\t\t}\r\n\t}\r\n\r\n\r\n\tif (crcData.level1.totalDiagnoses.colon > 0) {\r\n\r\n\t\tecog.colon.numerator = crcData.level1.totalDiagnoses.colon - (crcData.level2.ecogGroup.colon.values[crcData.level2.ecogGroup.colon.labels.indexOf(\"Unk\")] || 0);\r\n\t\tecog.colon.denominator = crcData.level1.totalDiagnoses.colon\r\n\t\tecog.colon.percentage = ecog.colon.numerator / ecog.colon.denominator * 100\r\n\r\n\t\tstage.colon.numerator = crcData.level1.totalDiagnoses.colon - (crcData.level2.tnmStage.colon.values[crcData.level2.tnmStage.colon.labels.indexOf(\"Unk\")] || 0);\r\n\t\tstage.colon.denominator = crcData.level1.totalDiagnoses.colon;\r\n\t\tstage.colon.percentage = stage.colon.numerator / stage.colon.denominator * 100\r\n\t}\r\n\r\n\tif (crcData.level1.totalDiagnoses.rectal > 0) {\r\n\r\n\t\tecog.rectal.numerator = crcData.level1.totalDiagnoses.rectal - (crcData.level2.ecogGroup.rectal.values[crcData.level2.ecogGroup.rectal.labels.indexOf(\"Unk\")] || 0);\r\n\t\tecog.rectal.denominator = crcData.level1.totalDiagnoses.rectal\r\n\t\tecog.rectal.percentage = ecog.rectal.numerator / ecog.rectal.denominator * 100\r\n\r\n\t\tstage.rectal.numerator = crcData.level1.totalDiagnoses.rectal - (crcData.level2.tnmStage.rectal.values[crcData.level2.tnmStage.rectal.labels.indexOf(\"Unk\")] || 0);\r\n\t\tstage.rectal.denominator = crcData.level1.totalDiagnoses.rectal;\r\n\t\tstage.rectal.percentage = stage.rectal.numerator / stage.rectal.denominator * 100\r\n\t}\r\n\r\n\tconst dashboard = <>\r\n\t\t
\r\n\r\n\r\n\t\t\t{(showFilterChips ?
\r\n\t\t\t\t{chips}\r\n\t\t\t
: null)}\r\n\t\t
\r\n\r\n\t\t
\r\n\r\n\t\t\t
\r\n\t\t\t\t\r\n\t\t\t
\r\n\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tIndicator\r\n\t\t\t\t\t\t\tMy MDT(s)*\r\n\t\t\t\t\t\t\t{stateWideData.title}^\r\n\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t \r\n\t\t\t\t\t\t\tColon\r\n\t\t\t\t\t\t\tRectal\r\n\t\t\t\t\t\t\tColon\r\n\t\t\t\t\t\t\tRectal\r\n\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tColorectal cancer diagnoses^\r\n\t\t\t\t\t\t\t{crcData.level1.totalDiagnoses.colon}\r\n\t\t\t\t\t\t\t{crcData.level1.totalDiagnoses.rectal}\r\n\t\t\t\t\t\t\t{stateWideData.patientsColon}\r\n\t\t\t\t\t\t\t{stateWideData.patientsRectal}\r\n\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tPercentage of patients with ECOG\r\n\t\t\t\t\t\t\t{`${ecog.colon.percentage.toFixed(0)}%`}
{`(${ecog.colon.numerator}/${ecog.colon.denominator})`}
\r\n\t\t\t\t\t\t\t{`${ecog.rectal.percentage.toFixed(0)}%`}
{`(${ecog.rectal.numerator}/${ecog.rectal.denominator})`}
\r\n\t\t\t\t\t\t\t-\r\n\t\t\t\t\t\t\t-\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tPercentage of patients with Stage\r\n\t\t\t\t\t\t\t{`${stage.colon.percentage.toFixed(0)}%`}
{`(${stage.colon.numerator}/${stage.colon.denominator})`}
\r\n\t\t\t\t\t\t\t{`${stage.rectal.percentage.toFixed(0)}%`}
{`(${stage.rectal.numerator}/${stage.rectal.denominator})`}
\r\n\t\t\t\t\t\t\t-\r\n\t\t\t\t\t\t\t-\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tReceived first treatment within 30 days\r\n\t\t\t\t\t\t\t{`${crcData.level1.diagToFirstTreatment30Days.colon.percentage.toFixed(0)}%`}
{`(${crcData.level1.diagToFirstTreatment30Days.colon.numerator}/${crcData.level1.diagToFirstTreatment30Days.colon.denominator})`}
\r\n\t\t\t\t\t\t\t{`${crcData.level1.diagToFirstTreatment30Days.rectal.percentage.toFixed(0)}%`}
{`(${crcData.level1.diagToFirstTreatment30Days.rectal.numerator}/${crcData.level1.diagToFirstTreatment30Days.rectal.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.hadFirstTreatmentWT30DaysColon}\r\n\t\t\t\t\t\t\t{stateWideData.hadFirstTreatmentWT30DaysRectal}\r\n\t\t\t\t\t\t
\r\n\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tSurgical\r\n\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tReceived definitive resection as first treatment within 30 days of diagnosis\r\n\t\t\t\t\t\t\t{`${crcData.level1.diagToSurg30Days.colon.percentage.toFixed(0)}%`}
{`(${crcData.level1.diagToSurg30Days.colon.numerator}/${crcData.level1.diagToSurg30Days.colon.denominator})`}
\r\n\t\t\t\t\t\t\t{`${crcData.level1.diagToSurg30Days.rectal.percentage.toFixed(0)}%`}
{`(${crcData.level1.diagToSurg30Days.rectal.numerator}/${crcData.level1.diagToSurg30Days.rectal.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.daysFromDiagToSurgLT30Colon}\r\n\t\t\t\t\t\t\t{stateWideData.daysFromDiagToSurgLT30Rectal}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t{/* \r\n\t\t\t\t\t\tHospital stay (Median days) \r\n\t\t\t\t\t\t{`${crcData.level1.lengthOfStay.colon.median}`}
{`(${crcData.level1.lengthOfStay.colon.lowerquart} - ${crcData.level1.lengthOfStay.colon.upperquart})`}
\t\t\t\t\t\t\r\n\t\t\t\t\t\t{`${crcData.level1.lengthOfStay.rectal.median}`}
{`(${crcData.level1.lengthOfStay.rectal.lowerquart} - ${crcData.level1.lengthOfStay.rectal.upperquart})`}
\r\n\t\t\t\t\t\t{stateWideData.hospitalStayDaysColon}\r\n\t\t\t\t\t\t{stateWideData.hospitalStayDaysRectal}\r\n\t\t\t\t\t
*/}\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t Prolonged LOS ≥ 21 days\r\n\t\t\t\t\t\t\t{`${crcData.level1.prolongedLOS.colon.percentage.toFixed(1)}%`}
{`(${crcData.level1.prolongedLOS.colon.numerator}/${crcData.level1.prolongedLOS.colon.denominator})`}
\r\n\t\t\t\t\t\t\t{`${crcData.level1.prolongedLOS.rectal.percentage.toFixed(1)}%`}
{`(${crcData.level1.prolongedLOS.rectal.numerator}/${crcData.level1.prolongedLOS.rectal.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.prolongedLOSGT21DaysColon}\r\n\t\t\t\t\t\t\t{stateWideData.prolongedLOSGT21DaysRectal}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t{/* \r\n\t\t\t\t\t\tHad an anastomotic leak\r\n\t\t\t\t\t\t{`${crcData.level1.hadAnastomicLeak.colon.percentage.toFixed(2)}%`}
{`(${crcData.level1.hadAnastomicLeak.colon.numerator}/${crcData.level1.hadAnastomicLeak.colon.denominator})`}
\t\t\t\t\t\t\r\n\t\t\t\t\t\t{`${crcData.level1.hadAnastomicLeak.rectal.percentage.toFixed(2)}%`}
{`(${crcData.level1.hadAnastomicLeak.rectal.numerator}/${crcData.level1.hadAnastomicLeak.rectal.denominator})`}
\r\n\t\t\t\t\t\t{stateWideData.hadAnastomicLeakColon}\r\n\t\t\t\t\t\t{stateWideData.hadAnastomicLeakRectal}\r\n\t\t\t\t\t\t{(crcData.level1.hadAnastomicLeak.colon.denominator > 0 || crcData.level1.hadAnastomicLeak.rectal.denominator > 0) && downloadBtn(5)}\r\n\t\t\t\t\t
\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t Had an anastomotic leak and died within 90 days of definitive resection\r\n\t\t\t\t\t\t{`${crcData.level1.hadAnastomicLeakDied90Days.colon.percentage.toFixed(2)}%`}
{`(${crcData.level1.hadAnastomicLeakDied90Days.colon.numerator}/${crcData.level1.hadAnastomicLeakDied90Days.colon.denominator})`}
\t\t\t\t\t\t\r\n\t\t\t\t\t\t{`${crcData.level1.hadAnastomicLeakDied90Days.rectal.percentage.toFixed(2)}%`}
{`(${crcData.level1.hadAnastomicLeakDied90Days.rectal.numerator}/${crcData.level1.hadAnastomicLeakDied90Days.rectal.denominator})`}
\r\n\t\t\t\t\t\t{stateWideData.hadAnastomicLeakAndDiedWithin90DaysColon}\r\n\t\t\t\t\t\t{stateWideData.hadAnastomicLeakAndDiedWithin90DaysRectal}\r\n\t\t\t\t\t\t{(crcData.level1.hadAnastomicLeakDied90Days.colon.denominator > 0 || crcData.level1.hadAnastomicLeakDied90Days.rectal.denominator > 0) && downloadBtn(6)}\r\n\t\t\t\t\t
*/}\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tStoma rate at definitive resection \r\n\t\t\t\t\t\t\t{`${crcData.level1.hadStomaAtSurg.colon.percentage.toFixed(1)}%`}
{`(${crcData.level1.hadStomaAtSurg.colon.numerator}/${crcData.level1.hadStomaAtSurg.colon.denominator})`}
\r\n\t\t\t\t\t\t\t{`${crcData.level1.hadStomaAtSurg.rectal.percentage.toFixed(0)}%`}
{`(${crcData.level1.hadStomaAtSurg.rectal.numerator}/${crcData.level1.hadStomaAtSurg.rectal.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.hadStomaAtSurgColon}\r\n\t\t\t\t\t\t\t{stateWideData.hadStomaAtSurgRectal}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tHad abdominoperineal resection (rectal cancer only)\r\n\t\t\t\t\t\t\t-\r\n\t\t\t\t\t\t\t{`${crcData.level1.hadAbdominoperinealResection.rectal.percentage.toFixed(0)}%`}
{`(${crcData.level1.hadAbdominoperinealResection.rectal.numerator}/${crcData.level1.hadAbdominoperinealResection.rectal.denominator})`}
\r\n\t\t\t\t\t\t\t-\r\n\t\t\t\t\t\t\t{stateWideData.hadAbdominoperinealResectionRectal}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t{/* \r\n\t\t\t\t\t\tLaparoscopic converted to open surgery (2014 only)\r\n\t\t\t\t\t\t{`${crcData.level1.lapConvertedOpenSurg.colon.percentage.toFixed(2)}%`}
{`(${crcData.level1.lapConvertedOpenSurg.colon.numerator}/${crcData.level1.lapConvertedOpenSurg.colon.denominator})`}
\t\t\t\t\t\t\r\n\t\t\t\t\t\t{`${crcData.level1.lapConvertedOpenSurg.rectal.percentage.toFixed(2)}%`}
{`(${crcData.level1.lapConvertedOpenSurg.rectal.numerator}/${crcData.level1.lapConvertedOpenSurg.rectal.denominator})`}
\r\n\t\t\t\t\t\t{stateWideData.lapConvertedToOpenSurgColon}\r\n\t\t\t\t\t\t{stateWideData.lapConvertedToOpenSurgRectal}\r\n\t\t\t\t\t\t{(crcData.level1.lapConvertedOpenSurg.colon.denominator > 0 || crcData.level1.lapConvertedOpenSurg.rectal.denominator > 0) && downloadBtn(17)}\r\n\t\t\t\t\t
*/}\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tIn-Hospital mortality\r\n\t\t\t\t\t\t\t{`${crcData.level1.inpatientDeath.colon.percentage.toFixed(1)}%`}
{`(${crcData.level1.inpatientDeath.colon.numerator}/${crcData.level1.inpatientDeath.colon.denominator})`}
\r\n\t\t\t\t\t\t\t{`${crcData.level1.inpatientDeath.rectal.percentage.toFixed(2)}%`}
{`(${crcData.level1.inpatientDeath.rectal.numerator}/${crcData.level1.inpatientDeath.rectal.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.inHospitalMortalityColon}\r\n\t\t\t\t\t\t\t{stateWideData.inHospitalMortalityRectal}\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t 30 day mortality\r\n\t\t\t\t\t\t\t{`${crcData.level1.death30Days.colon.percentage.toFixed(1)}%`}
{`(${crcData.level1.death30Days.colon.numerator}/${crcData.level1.death30Days.colon.denominator})`}
\r\n\t\t\t\t\t\t\t{`${crcData.level1.death30Days.rectal.percentage.toFixed(2)}%`}
{`(${crcData.level1.death30Days.rectal.numerator}/${crcData.level1.death30Days.rectal.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.mortality30DaysColon}\r\n\t\t\t\t\t\t\t{stateWideData.mortality30DaysRectal}\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t 90 day mortality\r\n\t\t\t\t\t\t\t{`${crcData.level1.death90Days.colon.percentage.toFixed(1)}%`}
{`(${crcData.level1.death90Days.colon.numerator}/${crcData.level1.death90Days.colon.denominator})`}
\r\n\t\t\t\t\t\t\t{`${crcData.level1.death90Days.rectal.percentage.toFixed(1)}%`}
{`(${crcData.level1.death90Days.rectal.numerator}/${crcData.level1.death90Days.rectal.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.mortality90DaysColon}\r\n\t\t\t\t\t\t\t{stateWideData.mortality90DaysRectal}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t1 year surgical survival^\r\n\t\t\t\t\t\t\t{`${crcData.level1.survival365Days.colon.percentage.toFixed(0)}%`}
{`(${crcData.level1.survival365Days.colon.numerator}/${crcData.level1.survival365Days.colon.denominator})`}
\r\n\t\t\t\t\t\t\t{`${crcData.level1.survival365Days.rectal.percentage.toFixed(0)}%`}
{`(${crcData.level1.survival365Days.rectal.numerator}/${crcData.level1.survival365Days.rectal.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.oneYearSurvivalColon}\r\n\t\t\t\t\t\t\t{stateWideData.oneYearSurvivalRectal}\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t2 year surgical survival^\r\n\t\t\t\t\t\t\t{`${crcData.level1.survival730Days.colon.percentage.toFixed(0)}%`}
{`(${crcData.level1.survival730Days.colon.numerator}/${crcData.level1.survival730Days.colon.denominator})`}
\r\n\t\t\t\t\t\t\t{`${crcData.level1.survival730Days.rectal.percentage.toFixed(0)}%`}
{`(${crcData.level1.survival730Days.rectal.numerator}/${crcData.level1.survival730Days.rectal.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.twoYearSurvivalColon}\r\n\t\t\t\t\t\t\t{stateWideData.twoYearSurvivalRectal}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t ^Patients with less than one and two years of data from their first surgery are excluded from the one and two year survival indicators respectively.\r\n\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t{/* \r\n\t\t\t\t\t\t 5 year surgical survival\r\n\t\t\t\t\t\t{`${crcData.level1.survival1825Days.colon.percentage.toFixed(2)}%`}
{`(${crcData.level1.survival1825Days.colon.numerator}/${crcData.level1.survival1825Days.colon.denominator})`}
\t\t\t\t\t\t\r\n\t\t\t\t\t\t{`${crcData.level1.survival1825Days.rectal.percentage.toFixed(2)}%`}
{`(${crcData.level1.survival1825Days.rectal.numerator}/${crcData.level1.survival1825Days.rectal.denominator})`}
\r\n\t\t\t\t\t\t{stateWideData.fiveYearSurvivalColon}\r\n\t\t\t\t\t\t{stateWideData.fiveYearSurvivalRectal}\r\n\t\t\t\t\t
*/}\r\n\r\n\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tSystemic Therapy\r\n\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tReceived IV systemic therapy as first treatment within 42 days of diagnosis\r\n\t\t\t\t\t\t\t{`${crcData.level1.diagToFirstST42Days.colon.percentage.toFixed(0)}%`}
{`(${crcData.level1.diagToFirstST42Days.colon.numerator}/${crcData.level1.diagToFirstST42Days.colon.denominator})`}
\r\n\t\t\t\t\t\t\t{`${crcData.level1.diagToFirstST42Days.rectal.percentage.toFixed(0)}%`}
{`(${crcData.level1.diagToFirstST42Days.rectal.numerator}/${crcData.level1.diagToFirstST42Days.rectal.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.hadFirstIVSTWT42DaysColon}\r\n\t\t\t\t\t\t\t{stateWideData.hadFirstIVSTWT42DaysRectal}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tAdjuvant IV systemic therapy for stage III patients\r\n\t\t\t\t\t\t\t{`${crcData.level1.stage3Adjuvant.colon.percentage.toFixed(0)}%`}
{`(${crcData.level1.stage3Adjuvant.colon.numerator}/${crcData.level1.stage3Adjuvant.colon.denominator})`}
\r\n\t\t\t\t\t\t\t{`${crcData.level1.stage3Adjuvant.rectal.percentage.toFixed(0)}%`}
{`(${crcData.level1.stage3Adjuvant.rectal.numerator}/${crcData.level1.stage3Adjuvant.rectal.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.stage3AdjuvantSTColon}\r\n\t\t\t\t\t\t\t{stateWideData.stage3AdjuvantSTRectal}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tRadiation Therapy\r\n\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tNeoadjuvant radiation therapy rate (rectal cancer only)\r\n\t\t\t\t\t\t\t-\r\n\t\t\t\t\t\t\t{`${crcData.level1.neoAdjuvantXRT.rectal.percentage.toFixed(0)}%`}
{`(${crcData.level1.neoAdjuvantXRT.rectal.numerator}/${crcData.level1.neoAdjuvantXRT.rectal.denominator})`}
\r\n\t\t\t\t\t\t\t-\r\n\t\t\t\t\t\t\t{stateWideData.neoadjuvantXRTRectal}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t
\r\n\r\n\t\t\t
\r\n\t\t\t\t

*Data based on facility of MDT

\r\n\t\t\t
\r\n\r\n\t\t\t
\r\n\t\t\t\t

^The comparison data in the Qld report is based on a person's incidence case of the cancer. The MDT data is all diagnoses (with a diagnosis date) presented to MDT using the Qool application

\r\n\t\t\t
\r\n\r\n\t\t\t
\r\n\t\t\t\t

This report is based on the Queensland Colon Cancer Quality Index 2012-2021 \r\n\t\t\t\t\tand Queensland Rectal Cancer Quality Index 2012-2021. Indicator definitions and glossary can be found in the technical appendix

\r\n\t\t\t
\r\n\t\t
\r\n\r\n\t\t\r\n\r\n\t\r\n\r\n\treturn (\r\n\t\tdashboard\r\n\t)\r\n\r\n}","import * as React from \"react\"\r\nimport * as CRC from \"models/crc\";\r\nimport { AppContext } from \"AppContext\";\r\nimport { ActionTypes } from \"reducer/actions\";\r\nimport { Box, Button, Typography } from \"@mui/material\";\r\nimport { FilterContext } from \"models/core/filter\";\r\nimport Select from \"react-select\";\r\nimport { SideBySideButton } from \"components/common/SideBySideOptions\";\r\nimport { exportMdtPatients } from \"models/mdt/worker\";\r\nimport * as fileHelper from \"helpers/fileHelper\";\r\nimport Loader from \"pages/shared/filterloader\";\r\n\r\nexport function CrcFilters() {\r\n\tconst { state, dispatch } = React.useContext(AppContext);\r\n\r\n\tconst addFilter: CRC.AddFilterFunc = async (key: keyof typeof CRC.DashboardFilterKeys, value: string | string[], context?: FilterContext, labelOverride?: string) => {\r\n\t\tconst filteredDashboard = await CRC.computeChartData(CRC.addFilter(state.page.dashboard as CRC.IMDTDashboard)(key, value, context, labelOverride)); // state = what the other filter function returns \r\n\t\tdispatch({ type: ActionTypes.UserClickedOnChart, payload: filteredDashboard });\r\n\t}\r\n\r\n\tconst removeFilter: CRC.RemoveFilterFunc = async (key: keyof typeof CRC.DashboardFilterKeys) => {\r\n\r\n\t\tconst filteredDashboard = await CRC.computeChartData(CRC.removeFilter(state.page.dashboard as CRC.IMDTDashboard, key));\r\n\t\tdispatch({ type: ActionTypes.UserClickedOnChart, payload: filteredDashboard });\r\n\t}\r\n\r\n\r\n\tif (state.page.loading)\r\n\t\treturn ;\r\n\r\n\tconst dataForFilters = state.page.dashboard.chartData as CRC.IChartData;\r\n\t//HHS \r\n\t//HHS Options\r\n\tconst hhsOptions: any[] = [];\r\n\tdataForFilters?.level1.hhses.map(p => {\r\n\t\thhsOptions.push({ label: p.name, value: p.id });\r\n\t})\r\n\r\n\t//Filtered HHSes\r\n\tlet hhsSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.HHS?.value?.map(p => {\r\n\t\thhsSelections.push({ label: p, value: hhsOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\t//Add code to be able to filter list of facilities to a chosen HHS\r\n\tlet selectedHHSIds = [];\r\n\tif (hhsSelections.length > 0) {\r\n\t\tselectedHHSIds = hhsSelections.map(a =>\r\n\t\t\ta.value);\r\n\t}\r\n\r\n\t//Facility \r\n\t//Facility Options\r\n\tconst facilityOptions: any[] = [];\r\n\tif (hhsSelections.length > 0) {\r\n\t\tdataForFilters?.level1.facilities.filter(a => selectedHHSIds.includes(a.hhsId)).map(p => {\r\n\t\t\tfacilityOptions.push({ label: p.name, value: p.facilityId });\r\n\t\t})\r\n\t} else {\r\n\t\tdataForFilters?.level1.facilities.map(p => {\r\n\t\t\tfacilityOptions.push({ label: p.name, value: p.facilityId });\r\n\t\t});\r\n\t}\r\n\r\n\t//Filtered facilities\r\n\tlet facilitySelections: any[] = [];\r\n\tstate.page.dashboard.filters?.Facility?.value?.map(p => {\r\n\t\tfacilitySelections.push({ label: p, value: facilityOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\t//Add code to be able to filter list of Mdts to a chosen Facilities\r\n\tlet selectedFacilityIds = [];\r\n\tif (facilitySelections.length > 0) {\r\n\t\tselectedFacilityIds = facilitySelections.map(a =>\r\n\t\t\ta.value);\r\n\t}\r\n\r\n\t//MDTs\r\n\t//Options\r\n\tconst mdtOptions: any[] = [];\r\n\tif (facilitySelections.length > 0) {\r\n\t\tdataForFilters?.level1.mdts.filter(a => selectedFacilityIds.includes(a.facilityId)).map(p => {\r\n\t\t\tmdtOptions.push({ label: p.nameAndFacility, value: p.mdtNameId });\r\n\t\t})\r\n\t} else {\r\n\t\tdataForFilters?.level1.mdts.map(p => {\r\n\t\t\tmdtOptions.push({ label: p.nameAndFacility, value: p.mdtNameId });\r\n\t\t})\r\n\t}\r\n\r\n\t//Filtered MDTs\r\n\tlet mdtSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.Mdt?.value?.map(p => {\r\n\t\tmdtSelections.push({ label: p, value: mdtOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\t//let { path } = state.page.dashboard.chartData.reviewsByPeriod;\r\n\t//let parts = FilterContext.fromPath(path).parts;\r\n\r\n\t//Months\r\n\t//Options\r\n\tconst monthOptions: any[] = [];\r\n\tdataForFilters?.level1.month.map(p => {\r\n\t\tmonthOptions.push({ label: p.name, value: p.id });\r\n\t})\r\n\r\n\t//Filtered MDT months\r\n\tlet mdtMonthSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.MdtMonth?.value?.map(p => {\r\n\t\tmdtMonthSelections.push({\r\n\t\t\tlabel: p,\r\n\t\t\tvalue: monthOptions.find(a => a.label == p)?.value\r\n\t\t});\r\n\t})\r\n\r\n\t//Filtered diagnosis months\r\n\tlet diagMonthSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.DiagMonth?.value?.map(p => {\r\n\t\tdiagMonthSelections.push({ label: p, value: monthOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\t//Years\r\n\t//MDT Year options\r\n\tconst mdtYearOptions: any[] = [];\r\n\tdataForFilters?.level1.year.map(p => {\r\n\t\tif (p.id >= 2010) {\r\n\t\t\tmdtYearOptions.push({ label: p.name, value: p.id });\r\n\t\t}\r\n\t})\r\n\r\n\t//Diagnosis year options\r\n\tconst diagYearOptions: any[] = [];\r\n\tdataForFilters?.level1.year.map(p => {\r\n\t\tdiagYearOptions.push({ label: p.name, value: p.id });\r\n\t})\r\n\r\n\t//Filtered year selections\r\n\tlet mdtYearSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.Year?.value?.map(p => {\r\n\t\tmdtYearSelections.push({\r\n\t\t\tlabel: p,\r\n\t\t\tvalue: mdtYearOptions.find(a => a.label == p)?.value\r\n\t\t});\r\n\t})\r\n\r\n\t//Filtered diagnosis selections\r\n\tlet diagYearSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.DiagYear?.value?.map(p => {\r\n\t\tdiagYearSelections.push({ label: p, value: diagYearOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\t//State for side by side button \r\n\tconst [viewBy, setViewBy] = React.useState(diagYearSelections.length > 0 ? \"Diagnosis Year\" : \"MDT Year\");\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t\r\n\t\t\t\tHHS\r\n\t\t\t\t {\r\n\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\tremoveFilter(CRC.DashboardFilterKeys.HHS.key);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\taddFilter(CRC.DashboardFilterKeys.HHS.key, filterValues);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t}),\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t\r\n\r\n\r\n\t\t\t\r\n\t\t\t\tFacility\r\n\t\t\t\t {\r\n\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\tremoveFilter(CRC.DashboardFilterKeys.Facility.key);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\taddFilter(CRC.DashboardFilterKeys.Facility.key, filterValues);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t}),\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t\r\n\r\n\r\n\t\t\t\r\n\t\t\t\tMDT\r\n\t\t\t\t {\r\n\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\tremoveFilter(CRC.DashboardFilterKeys.Mdt.key);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\taddFilter(CRC.DashboardFilterKeys.Mdt.key, filterValues);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t}),\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t\r\n\r\n\t\t\t\r\n\t\t\t\tView By\r\n\t\t\t\t {\r\n\t\t\t\t\t\tsetViewBy(p)\r\n\t\t\t\t\t}}\r\n\r\n\t\t\t\t/>\r\n\t\t\t\r\n\r\n\t\t\t{(viewBy == \"MDT Year\" ?\r\n\t\t\t\t<>\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tMDT Year\r\n\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\t\t\tremoveFilter(CRC.DashboardFilterKeys.Year.key);\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\taddFilter(CRC.DashboardFilterKeys.Year.key, filterValues);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tMDT Month\r\n\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\t\t\tremoveFilter(CRC.DashboardFilterKeys.MdtMonth.key);\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\taddFilter(CRC.DashboardFilterKeys.MdtMonth.key, filterValues);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t:\r\n\t\t\t\t<>\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tDiagnosis Year\r\n\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\t\t\tremoveFilter(CRC.DashboardFilterKeys.DiagYear.key);\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\taddFilter(CRC.DashboardFilterKeys.DiagYear.key, filterValues);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tDiagnosis Month\r\n\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\t\t\tremoveFilter(CRC.DashboardFilterKeys.DiagMonth.key);\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\taddFilter(CRC.DashboardFilterKeys.DiagMonth.key, filterValues);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\r\n\r\n\t\t\t\t\r\n\t\t\t)}\r\n\r\n\r\n\t\t\t{/* \r\n\t\t\t\t{(Object.keys(state.page.dashboard.filters).length !== 0 ?\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\texportMdtPatients(dataForFilters.level1.filteredReferralIdCsv, false)\r\n\t\t\t\t\t\t\t\t.then(data => {\r\n\t\t\t\t\t\t\t\t\tif (data.errorMessage) {\r\n\t\t\t\t\t\t\t\t\t\tthrow data.errorMessage;\r\n\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\treturn fileHelper.showFile(data.bytes, data.filename, fileHelper.fileTypeToMimeType(data.filetype), \"exportMdtPatientsElem\")\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t\t.catch(err => console.log(err))\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t>Download Patient List\r\n\t\t\t\t\t :\r\n\r\n\t\t\t\t\t
Make a filter selection in order to download patient list
)}\r\n\t\t\t
\r\n\r\n\t\t\t */}\r\n\t\t\r\n\t)\r\n}\r\n\r\n","import { CrcDashboard } from \"./dashboard\";\r\nimport { CrcFilters } from \"./filters\";\r\nimport * as React from \"react\";\r\n\r\nexport { CrcFilters }\r\n\r\n\r\nexport class CrcDashboardHome extends React.Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n width: 0,\r\n height: 0\r\n }; \r\n\r\n }\r\n\r\n private updateDimensions = () => {\r\n this.setState({ width: window.innerWidth, height: window.innerHeight });\r\n };\r\n \r\n public componentWillUnmount() {\r\n window.removeEventListener('resize', this.updateDimensions);\r\n }\r\n \r\n public componentDidMount() {\r\n window.addEventListener('resize', this.updateDimensions);\r\n }\r\n\r\n render = () => {\r\n return (\r\n <>\r\n \r\n \r\n )\r\n\r\n }\r\n}","import { \r\n IPlotData as ICorePlotData, createPlotData as createCorePlotData, \r\n ISourceData as ICoreSourceData, createData as createCoreData, addDataFactory, addSet \r\n} from \"models/core\";\r\nimport { IDashboardViewModel } from \"./core\";\r\n\r\n/**\r\n * Plot data source\r\n */\r\nexport type IPlotData = ICorePlotData;\r\n\r\n/**\r\n * Source data\r\n */\r\nexport type ISourceData = ICoreSourceData;\r\n\r\n/**\r\n * Raw data source. Used to shape and accumulate.\r\n */\r\nexport interface ISourceBuilder {\r\n uniques: Set;\r\n values: ISourceData;\r\n}\r\n\r\n/**\r\n * Create a new plot data object.\r\n */\r\nexport const createPlotData = createCorePlotData;\r\n\r\n/**\r\n * Create a new source data object\r\n */\r\nexport function createBuilder(): ISourceBuilder {\r\n return {\r\n uniques: new Set(),\r\n values: createCoreData(),\r\n };\r\n}\r\n\r\nconst add = addDataFactory((vm: IDashboardViewModel) => vm.morphology.name);\r\n\r\n/**\r\n * Returns the number added to the hierarchy on add, 0 otherwise. \r\n * @param vm \r\n * @param into \r\n */\r\nexport function addData(vm: IDashboardViewModel, into: ISourceBuilder): number {\r\n //Only count once per diagnosis per morphology.\r\n if (addSet(vm.morphology.id + \"_\" + vm.diagnosisId, into.uniques)) {\r\n add(vm, into.values);\r\n return 1;\r\n }\r\n\r\n return 0;\r\n}\r\n\r\n/**\r\n * Compare sourceData[a] to sourceData[b] and return -1 when a is less than b, 0 when equal, 1 when a is greater than 0\r\n * @param a \r\n * @param b \r\n */\r\nexport const sort = (s: ISourceData, a: string, b: string): number => {\r\n return ((s[a] < s[b]) ? -1 : ((s[a] > s[b]) ? 1 : 0));\r\n};\r\n\r\n/** \r\n * Complete adding data and clear any temporary resources \r\n */\r\nexport function finish(builder: ISourceBuilder): ISourceData {\r\n try {\r\n return builder.values;\r\n } finally {\r\n builder.uniques.clear();\r\n builder.uniques = null;\r\n builder.values = null;\r\n builder = null;\r\n }\r\n}","\r\nimport {\r\n\tAddDataSharedFunc, DashboardSharedFilterFunc, DashboardSharedFilterKey,\r\n\tIDashboardSharedChartData, IDashboardSharedDimensionsViewModel,\r\n} from \"models/common\";\r\nimport { IFilters, IFilterKeys, DimensionsById, ISourceData, IDimFacility, IDimension, IDimMDT } from \"models/core\";\r\nimport { IDashboardViewModel } from \"./viewModel\";\r\n\r\n//Plots for this dashboard\r\nimport * as PrimarySite from \"./primarySiteHierarchy\";\r\nimport * as Morphology from \"./morphology\";\r\nimport * as Remoteness from \"../../common/plotdata/remoteness\";\r\nimport * as HHSOfResidence from \"../../common/plotdata/hhsOfResidence\";\r\n\r\nexport type { IDashboardViewModel } from \"./viewModel\";\r\n\r\nexport type IDashboardSource = IDashboardViewModel[];\r\n\r\nexport interface IDashboardDimensionsViewModel extends IDashboardSharedDimensionsViewModel {\r\n hhsResidenceGroups?: DimensionsById;\r\n dataQualityIndicators?: DimensionsById;\r\n monthsArray?: Array;\r\n yearsArray?: Array;\r\n months?: { [monthId: number]: string };\r\n years?: { [yearId: number]: string };\r\n dqCompFacility?: { [facilityYearKey: string]: number };\r\n dqCompState?: { [facilityYearKey: string]: number };\r\n oneYearSurvivalMDT?: { [mdtDiagYearKey: string]: { \"MDT\": number, \"State\": number } };\r\n threeYearSurvivalMDT?: { [mdtDiagYearKey: string]: { \"MDT\": number, \"State\": number } };\r\n fiveYearSurvivalMDT?: { [mdtDiagYearKey: string]: { \"MDT\": number, \"State\": number } };\r\n tenYearSurvivalMDT?: { [mdtDiagYearKey: string]: { \"MDT\": number, \"State\": number } };\r\n kmSurvivalMDT?: {[mdtCancerKey: string]: { survivalTime: string, mdtKMSurvival: number, stateKMSurvival: number }};\r\n\r\n}\r\n\r\ninterface ILevel1ChartData {\r\n\ttotalDiagnoses: number;\r\n\ttotalDataQualityEligibleDiagnoses: number;\r\n\tfacilities: IDimFacility[];\r\n\thhses: IDimension[];\r\n\tmdts: IDimMDT[];\r\n\tmonth: IDimension[];\r\n\tyear: IDimension[];\r\n\r\n histDiag: { numerator, denominator: number, percentage: number };\r\n\tcraniotomy30DaysDiagnosis: { numerator: number, denominator: number, percentage: number; };\r\n\tcraniotomyForHistDiagGlioAnaOligoAnaAstro: { numerator: number, denominator: number, percentage: number; };\r\n\tcraniotomyForepend: { numerator: number, denominator: number, percentage: number; };\r\n\tinHospitalMortality: { numerator: number, denominator: number, percentage: number; };\r\n\tmortality30Days: { numerator: number, denominator: number, percentage: number; };\r\n\tmortality90Days: { numerator: number, denominator: number, percentage: number; };\r\n\toneYearSurvival: { numerator: number, denominator: number, percentage: number; };\r\n\ttwoYearSurvival: { numerator: number, denominator: number, percentage: number; };\r\n\trt45To54LowGrade: { numerator: number, denominator: number, percentage: number; };\r\n\trt54To60Under70Grade4: { numerator: number, denominator: number, percentage: number };\r\n\trtUnder70HighGrade: { numerator: number, denominator: number, percentage: number };\r\n\trt70PlusHighGrade: { numerator: number, denominator: number, percentage: number };\r\n\trtAnaOligo: { numerator: number, denominator: number, percentage: number };\r\n\trtAnaAstro: { numerator: number, denominator: number, percentage: number };\r\n\trt49DaysHistDiagHighGrade: { numerator: number, denominator: number, percentage: number };\r\n\t// Export\r\n\tfilteredReferralIdCsv: string;\r\n}\r\n\r\n// HACK: chop out the reference array from the shared interface \r\ntype RestrictedSharedChartData = Omit, \"hhses\">;\r\n\r\ninterface ILevel2ChartData extends RestrictedSharedChartData {\r\n\ttotalDiagnoses: number;\r\n\tprimarySite: PrimarySite.IHierarchyPlotData;\r\n\tmorphology: Morphology.IPlotData;\r\n\tremoteness: Remoteness.IPlotData;\r\n\thhsOfResidence: HHSOfResidence.IPlotData;\r\n}\r\n\r\nexport interface IChartData {\r\n\tlevel1: ILevel1ChartData;\r\n\tlevel2: ILevel2ChartData;\r\n}\r\n\r\nconst BreastFilterKeys: IFilterKeys = {\r\n\t//Filter keys for breast indicators\r\n\tDiagnosisYear: { key: \"DiagnosisYear\", label: \"Diagnosis Year\" },\r\n\tDiagnosisMonth: { key: \"DiagnosisMonth\", label: \"Diagnosis Month\" },\r\n\tMdtYear: { key: \"MdtYear\", label: \"MDT Year\" },\r\n\tMdtMonth: { key: \"MdtMonth\", label: \"MDT Month\" },\r\n\tInvasive: { key: \"Invasive\", label: \"Invasive / In-situ\" },\r\n\tPrimarySite: { key: \"PrimarySite\", label: \"Primary site\" },\r\n\tMorphology: { key: \"Morphology\", label: \"Morphology\" },\r\n\tRemoteness: { key: \"Remoteness\", label: \"Rurality\" },\r\n\tDefinitiveMastectomy: { key: \"DefinitiveMastectomy\", label: \"Definitive Mastectomy\" },\r\n\tHHSOfResidence: { key: \"HHSOfResidence\", label: \"HHS of residence\" }\r\n}\r\n\r\nexport const DashboardFilterKeys: IFilterKeys = {\r\n\t...DashboardSharedFilterKey,\r\n\t...BreastFilterKeys\r\n}\r\n\r\nexport type Filters = IFilters;\r\nexport type DashboardFilterFunc = DashboardSharedFilterFunc;\r\nexport type AddDataFunc = AddDataSharedFunc;","import { IChartData, IDashboardDimensionsViewModel, Filters } from \"../plotdata\";\r\n\r\n//Actions / requests\r\nexport enum WorkerRequestType { Ping, Fetch, ChartData }\r\nexport interface IWorkerFetchRequest { all: boolean, rawRefs: any, rawRows: string, minYear: number }\r\nexport interface IWorkerChartDataRequest { filtersToApply: Filters, minYear: number };\r\nexport interface IWorkerRequest {\r\n type: WorkerRequestType;\r\n id: string;\r\n payload?: any; //?\r\n}\r\n\r\n//Results\r\nexport enum WorkerResultType { Ping, Fetch, ChartData, InvalidType }\r\nexport interface IWorkerResult {\r\n type: WorkerResultType;\r\n id: string;\r\n payload?: any; //?\r\n}\r\nexport interface IWorkerPingResult {}\r\nexport interface IWorkerFetchResult { allData: boolean, references: IDashboardDimensionsViewModel, chartData: IChartData }\r\nexport type IWorkerChartDataResult = IChartData;","export default function Worker_fn() {\n return new Worker(__webpack_public_path__ + \"data.worker.021a8864f3c412366f4d.worker.js\");\n}\n","import { generateUUID } from \"helpers\";\r\nimport { getBrainDashboard, getBrainDashboardReferences } from \"api/dashboardApi\";\r\nimport { Filters } from \"../plotdata\";\r\nimport { IWorkerChartDataRequest, IWorkerChartDataResult, IWorkerFetchRequest, IWorkerFetchResult, IWorkerPingResult, IWorkerRequest, WorkerRequestType, WorkerResultType } from \"./models\";\r\nimport DataWorker from 'worker-loader!./data.worker';\r\nexport type { IWorkerChartDataResult, IWorkerFetchResult, IWorkerPingResult, IWorkerRequest, WorkerRequestType }\r\n\r\n//#region Worker\r\n\r\nlet worker: DataWorker = null;\r\nlet promises = {};\r\nlet data = {\r\n minYear: 0,\r\n}\r\n\r\n/**\r\n * Start the Worker\r\n */\r\nexport function start(minYear: number) {\r\n data.minYear = minYear;\r\n\r\n if (!window[\"Worker\"]) {\r\n console.log(\"WebWorker not supported\");\r\n return false;\r\n\r\n } else {\r\n console.log(\"WebWorker starting\");\r\n\r\n worker = worker || new DataWorker();\r\n\r\n /**\r\n * When the worker sends an error back to the main thread, resolve the associated promise.\r\n */\r\n worker.addEventListener(\"message\", (ev: MessageEvent) => {\r\n const { data: { id, type, payload } } = ev;\r\n\r\n //Any specific handling by message type\r\n switch (type as WorkerResultType) {\r\n // case WorkerResultType.Ping: {\r\n // case WorkerResultType.Fetch: {\r\n default: {\r\n //Default handler will just resolve\r\n promises[id]?.resolve(payload);\r\n break;\r\n }\r\n }\r\n\r\n promises[id] = undefined;\r\n });\r\n\r\n /**\r\n * When the worker sends an error back to the main thread, reject the associated promise.\r\n */\r\n worker.addEventListener(\"messageerror\", (ev: MessageEvent) => {\r\n const { data: { id, type, payload } } = ev;\r\n\r\n //Any specific handling by message type\r\n switch (type) {\r\n //case WorkerResultType.Ping: {\r\n //case WorkerResultType.Fetch: {\r\n default: {\r\n console.error(\"ERROR from worker\", payload);\r\n promises[id].reject(payload);\r\n break;\r\n }\r\n }\r\n\r\n promises[id] = undefined;\r\n });\r\n\r\n return true;\r\n }\r\n}\r\n\r\n/**\r\n * Post the message to the Worker\r\n * @param request \r\n */\r\nfunction send(request: IWorkerRequest) {\r\n worker.postMessage(request);\r\n}\r\n\r\n/**\r\n * Transform into a Promise and track it.\r\n * @param type \r\n * @param payload \r\n */\r\nfunction actionPromise(type: WorkerRequestType, payload: TIn): Promise {\r\n const id = generateUUID();\r\n promises[id] = {};\r\n promises[id].promise = new Promise((resolve, reject) => {\r\n send({ id, type, payload });\r\n\r\n promises[id].resolve = resolve;\r\n promises[id].reject = reject;\r\n });\r\n\r\n return promises[id].promise;\r\n}\r\n\r\nexport function ping(): Promise {\r\n return actionPromise(WorkerRequestType.Ping, null);\r\n}\r\n\r\n/**\r\n * Fetch the data from the server, then push it to the Worker for processing.\r\n * @param all \r\n */\r\nexport function fetch(all: boolean): Promise {\r\n //WebWorker cannot access sessionStorage so do the api call here and\r\n //send the data tp it.\r\n return Promise.all([\r\n getBrainDashboard(all),\r\n getBrainDashboardReferences(all),\r\n ])\r\n .then(results => {\r\n return actionPromise(WorkerRequestType.Fetch, {\r\n all,\r\n rawRows: results[0] as string,\r\n rawRefs: results[1] as any,\r\n minYear: data.minYear,\r\n });\r\n });\r\n\r\n}\r\n\r\n/**\r\n * Apply the filters in the Worker and return the ChartData\r\n * @param filtersToApply \r\n */\r\nexport function chartData(filtersToApply: Filters): Promise {\r\n return actionPromise(WorkerRequestType.ChartData, {\r\n filtersToApply,\r\n minYear: data.minYear,\r\n });\r\n}\r\n\r\n/** Terminate the worker */\r\nexport function stop() {\r\n worker && worker.terminate();\r\n worker = null;\r\n console.log(\"WebWorker terminated\");\r\n}\r\n\r\n//#endregion Worker\r\n","import { AddFilterBaseFunc, FilterContext, RemoveFilterBaseFunc } from \"../core\";\r\nimport { DashboardFilterKeys, Filters, IChartData, IDashboardDimensionsViewModel } from \"./plotdata\";\r\n\r\nexport type { IChartData, IDashboardDimensionsViewModel, Filters } from \"./plotdata\";\r\nexport { DashboardFilterKeys } from \"./plotdata\";\r\nexport type AddFilterFunc = AddFilterBaseFunc;\r\nexport type RemoveFilterFunc = RemoveFilterBaseFunc;\r\n\r\nimport * as DashWorker from \"./worker\";\r\nexport { DashWorker }\r\n\r\nexport interface IBrainDashboard {\r\n\tallData: boolean;\r\n\treferences: IDashboardDimensionsViewModel;\r\n\tfilters: Filters;\r\n\tchartData: IChartData;\r\n\tselectedFacilities: Set;\r\n selectedHhses: Set;\r\n onlyDataQualityEligible: boolean;\r\n}\r\n\r\n\r\nexport const initState = (): IBrainDashboard => {\r\n\treturn {\r\n\t\tallData: false,\r\n\t\treferences: {},\r\n\t\tchartData: null,\r\n\t\tfilters: {},\r\n\t\tselectedFacilities: new Set(),\r\n\t\tselectedHhses: new Set(),\r\n\t\tonlyDataQualityEligible: false,\r\n\t}\r\n};\r\n\r\n\r\nexport const loadBrainDashboard = async (state: IBrainDashboard): Promise => {\r\n\tDashWorker.start(2010);\r\n\ttry {\r\n\t\tawait DashWorker.ping()\r\n\t\tconsole.log(\"WORKER PING RESOLVED\");\r\n\t\treturn await fetchData(state, state.allData);\r\n\t} catch {\r\n\t\tconsole.error(\"WORKER PING FAILED\");\r\n\t}\r\n}\r\n\r\nexport const clearFilters = (state: IBrainDashboard): IBrainDashboard => {\r\n\tconst maybeSetDefaultFilter = (filterKey: string, dimensions: { name: string }[]): Set => {\r\n\t\tif (!dimensions || dimensions.length !== 1)\r\n\t\t\treturn (new Set());\r\n\r\n\t\tif (state.allData)\r\n\t\t\treturn (new Set());\r\n\r\n\t\tlet filterSet = new Set();\r\n\t\tfilterSet.add(dimensions[0].name);\r\n\r\n\t\tstate = addFilter(state)(filterKey, [dimensions[0].name])\r\n\t\treturn filterSet;\r\n\t}\r\n\r\n\tstate.filters = {};\r\n\tstate.selectedHhses = maybeSetDefaultFilter(DashboardFilterKeys.HHS.key, state.chartData.level1.hhses);\r\n\tstate.selectedFacilities = maybeSetDefaultFilter(DashboardFilterKeys.Facility.key, state.chartData.level1.facilities);\r\n\r\n\treturn { ... state };\r\n\r\n}\r\n\r\n\r\n\r\nexport const closeBrainDashboard = () =>\r\n\tDashWorker.stop();\r\n\r\nconst fetchData = async (state: IBrainDashboard, all: boolean): Promise => {\r\n\ttry {\r\n\t\tconst data = await DashWorker.fetch(all);\r\n\r\n\t\tconst maybeSetDefaultFilter = (filterKey: string, dimensions: { name: string }[]): Set => {\r\n\t\t\tif (!dimensions || dimensions.length !== 1)\r\n\t\t\t\treturn (new Set());\r\n\r\n\t\t\tif (all)\r\n\t\t\t\treturn (new Set());\r\n\r\n\t\t\tlet filterSet = new Set();\r\n\t\t\tfilterSet.add(dimensions[0].name);\r\n\r\n\t\t\tstate = addFilter(state)(filterKey, [dimensions[0].name])\r\n\t\t\treturn filterSet;\r\n\t\t}\r\n\r\n\t\tstate.selectedHhses = maybeSetDefaultFilter(DashboardFilterKeys.HHS.key, data.chartData.level1.hhses);\r\n state.selectedFacilities = maybeSetDefaultFilter(DashboardFilterKeys.Facility.key, data.chartData.level1.facilities);\r\n\t\tstate.allData = all;\r\n\t\tstate.references = data.references;\r\n\t\tstate.chartData = data.chartData;\r\n\t\t\r\n\t\treturn state;\r\n\t} catch {\r\n\t\tconsole.error(\"WORKER FETCHDATA FAILED\");\r\n\t\treturn state;\r\n\t}\r\n}\r\n\r\nexport const computeChartData = async (state: IBrainDashboard): Promise => {\r\n\ttry {\r\n\t\tconst data = await DashWorker.chartData(state.filters);\r\n\t\tstate.chartData = data;\r\n\t\treturn {...state};\r\n\t} catch {\r\n\t\tconsole.error(\"WORKER COMPUTECHARTDATA FAILED\")\r\n\t\treturn state;\r\n\t}\r\n}\r\n\r\nexport const addFilter = (state: IBrainDashboard) => (key: keyof typeof DashboardFilterKeys, value: string | string[], context?: FilterContext, labelOverride?: string): IBrainDashboard => {\r\n\tconst filters: Filters = Object.assign({}, state.filters);\r\n\tconst values = (typeof value === \"string\")\r\n\t\t? [value]\r\n\t\t: value;\r\n\r\n\t//Replace the existing path entry if we are replacing a multi-value filter\r\n\t//to do so: traverse to the parent\r\n\tconst baseContext: FilterContext = context && ((context.values().length > 1) ? context.parent() : context) || new FilterContext();\r\n\tbaseContext.push(values);\r\n\r\n\tfilters[key] = ({ value: values, labelOverride, parts: baseContext.parts });\r\n\r\n\tstate.filters = filters;\r\n\r\n\treturn {...state};\r\n}\r\n\r\n\r\nexport const removeFilter = (state: IBrainDashboard, key: keyof typeof DashboardFilterKeys, value?: string, labelOverride?: string): IBrainDashboard => {\r\n\tconst filters: Filters = Object.assign({}, state.filters);\r\n\tconst valueToRemove: string = value || null;\r\n\tconst context = FilterContext.fromFilters(filters, key);\r\n\tconst values = context.values();\r\n\tconst newValue = (valueToRemove ? values.filter(p => p != valueToRemove): null);\r\n\r\n\tconst n = context.parent() || new FilterContext();\r\n\tif (newValue) {\r\n\t\tn.push(newValue);\r\n\t}\r\n\tfilters[key] = ({value: n.values(), labelOverride, parts: n.parts});\r\n\r\n\tif (n.parts.length === 0) {\r\n\t\tdelete filters[key];\r\n\t}\r\n\r\n\tstate.filters = filters;\r\n\treturn {...state};\r\n}","import * as React from \"react\"\r\nimport * as Brain from \"models/brain\";\r\nimport { AppContext } from \"AppContext\";\r\nimport { ActionTypes } from \"reducer/actions\";\r\nimport { Button, Paper, Table, TableBody, TableCell, TableContainer, TableHead, TableRow } from \"@mui/material\";\r\nimport { Link } from \"react-scroll\";\r\nimport { FilterContext } from \"models/core/filter\";\r\nimport { DashChip } from \"components/common/DashChips\";\r\nimport ReportApi from \"api/reportApi\";\r\nimport * as fileHelper from \"helpers/fileHelper\";\r\nimport { Download, Downloading } from \"@mui/icons-material\";\r\nimport { BrainIndicatorDefinitionsUrl } from \"config/appUrlConfig\";\r\nimport { getStateIndicatorReferences } from \"api/dashboardApi\";\r\nimport Loader from \"pages/shared/pageloader\";\r\n\r\nenum BrainIndicatorAction {\r\n\tUserClickedDownloadIndicator,\r\n\tDownloadIndicatorSuccess,\r\n\tDownloadIndicatorFail\r\n}\r\n\r\ntype Action =\r\n\t{ type: BrainIndicatorAction.UserClickedDownloadIndicator, payload: number }\r\n\t| { type: BrainIndicatorAction.DownloadIndicatorSuccess }\r\n\t| { type: BrainIndicatorAction.DownloadIndicatorFail }\r\n\r\n\r\ninterface State {\r\n\tindicator: number\r\n}\r\n\r\nconst initialState: State = {\r\n\tindicator: 0\r\n}\r\n\r\n\r\n\r\nconst reducer = (state: State, action: Action): State => {\r\n\tconst { type } = action;\r\n\r\n\tswitch (type) {\r\n\t\tcase BrainIndicatorAction.UserClickedDownloadIndicator:\r\n\t\t\treturn { ...state, ...{ indicator: action.payload } };\r\n\r\n\t\tcase BrainIndicatorAction.DownloadIndicatorSuccess:\r\n\t\tcase BrainIndicatorAction.DownloadIndicatorFail:\r\n\t\t\treturn { ...state, ...{ indicator: 0 } };\r\n\r\n\t\tdefault:\r\n\t\t\treturn state;\r\n\t}\r\n}\r\n\r\nlet stateWideData: {\r\n\ttitle?: string,\r\n\tpatients?: string,\r\n\thistDiag?: string,\r\n\tcraniotomy30DaysDiagnosis?: string,\r\n\tcraniotomyForHistDiagGlioAnaOligoAnaAstro?: string,\r\n\tcraniotomyForepend?: string,\r\n\tinHospitalMortality?: string,\r\n\tmortality30Days?: string,\r\n\tmortality90Days?: string,\r\n\toneYearSurvival?: string,\r\n\ttwoYearSurvival?: string,\r\n\trt45To54LowGrade?: string,\r\n\trt54To60Under70Grade4?: string,\r\n\trtUnder70HighGrade?: string,\r\n\trt70PlusHighGrade?: string,\r\n\trtAnaOligo?: string,\r\n\trtAnaAstro?: string,\r\n\trt49DaysHistDiagHighGrade?: string\r\n} = {};\r\n\r\n\r\nexport function BrainDashboard() {\r\n\tconst [localState, localDispatch] = React.useReducer(reducer, initialState)\r\n\tconst { state, dispatch } = React.useContext(AppContext);\r\n\r\n\r\n\tconst [showFilterChips, setFilterChips] = React.useState(true);\r\n\r\n\tconst addFilter: Brain.AddFilterFunc = async (key: keyof typeof Brain.DashboardFilterKeys, value: string | string[], context?: FilterContext, labelOverride?: string) => {\r\n\t\tconst filteredDashboard = await Brain.computeChartData(Brain.addFilter(state.page.dashboard as Brain.IBrainDashboard)(key, value, context, labelOverride)); // state = what the other filter function returns \r\n\t\tdispatch({ type: ActionTypes.UserClickedOnChart, payload: filteredDashboard });\r\n\t}\r\n\r\n\tconst removeFilter: Brain.RemoveFilterFunc = async (key: keyof typeof Brain.DashboardFilterKeys, value?: string) => {\r\n\t\tconst filteredDashboard = await Brain.computeChartData(Brain.removeFilter(state.page.dashboard as Brain.IBrainDashboard, key, value));\r\n\t\tdispatch({ type: ActionTypes.UserClickedOnChart, payload: filteredDashboard });\r\n\t}\r\n\r\n\tReact.useEffect(() => {\r\n\t\tdispatch({ type: ActionTypes.UserWantsToLoadMdtDashboard });\r\n\r\n\t\tconst fetchStateReferenceData = async () => {\r\n\t\t\tstateWideData = await getStateIndicatorReferences(\"brain\");\r\n\t\t}\r\n\r\n\t\tconst loadDashboard = async () => {\r\n\t\t\tconst value = await Brain.loadBrainDashboard(state.page.dashboard as Brain.IBrainDashboard);\r\n\t\t\tdispatch({ type: ActionTypes.UserLoadedMdtDashboard, payload: value })\r\n\t\t}\r\n\r\n\t\tPromise.all([fetchStateReferenceData(), loadDashboard()]);\r\n\r\n\t\treturn () => {\r\n\t\t\tBrain.closeBrainDashboard();\r\n\t\t}\r\n\t}, []);\r\n\r\n\tReact.useEffect(() => {\r\n\t\tif (localState.indicator == 0)\r\n\t\t\treturn;\r\n\r\n\t\tlet ids = brainChartData.level1.filteredReferralIdCsv;\r\n\t\tlet alldata = false;\r\n\r\n\r\n\t\tconst getBrainIndicatorPatientList = async () => {\r\n\t\t\ttry {\r\n\t\t\t\tconst data = await ReportApi.getBrainIndicatorPatientList(ids, alldata, localState.indicator);\r\n\t\t\t\tif (data.errorMessage) {\r\n\t\t\t\t\tconsole.error(data.errorMessage);\r\n\t\t\t\t\tlocalDispatch({ type: BrainIndicatorAction.DownloadIndicatorFail })\r\n\t\t\t\t}\r\n\t\t\t\tlocalDispatch({ type: BrainIndicatorAction.DownloadIndicatorSuccess })\r\n\t\t\t\treturn fileHelper.showFile(data.bytes, data.filename, fileHelper.fileTypeToMimeType(data.filetype), \"exportPatientsElem\")\r\n\t\t\t} catch {\r\n\t\t\t\tlocalDispatch({ type: BrainIndicatorAction.DownloadIndicatorFail })\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tgetBrainIndicatorPatientList();\r\n\r\n\r\n\t}, [localState.indicator]);\r\n\r\n\r\n\tif (state.page.loading || !state.page.dashboard.chartData)\r\n\t\treturn \r\n\r\n\t//Create function to show/hide filter chips\r\n\tconst toggleChips = () => {\r\n\t\tif (showFilterChips) {\r\n\t\t\tsetFilterChips(false);\r\n\t\t} else {\r\n\t\t\tsetFilterChips(true);\r\n\t\t}\r\n\t};\r\n\r\n\tlet activeFiltersArray = [];\r\n\tlet filterArray = [];\r\n\tlet chips = [];\r\n\r\n\tfor (const key in state.page.dashboard.filters) {\r\n\t\tif (Object.prototype.hasOwnProperty.call(state.page.dashboard.filters, key)) {\r\n\t\t\tactiveFiltersArray.push({ \"key\": key, \"values\": state.page.dashboard.filters[key].value, \"parts\": state.page.dashboard.filters[key].parts });\r\n\t\t}\r\n\t}\r\n\r\n\tfor (const key in Brain.DashboardFilterKeys) {\r\n\t\tif (Object.prototype.hasOwnProperty.call(Brain.DashboardFilterKeys, key)) {\r\n\t\t\tfilterArray.push({ \"key\": key, \"label\": Brain.DashboardFilterKeys[key].label });\r\n\t\t}\r\n\t}\r\n\r\n\tactiveFiltersArray.forEach(a => {\r\n\t\ta.values.forEach(b => {\r\n\t\t\tchips.push( id.key == a.key).label}\r\n\t\t\t\tfilterValue={b}\r\n\t\t\t\tfilterId={a.key}\r\n\t\t\t\tfilterParent={(a.parts.length > 1 ? a.parts[0] : null)}\r\n\t\t\t/>\r\n\t\t\t)\r\n\t\t})\r\n\t})\r\n\r\n\tconst brainChartData = state.page.dashboard.chartData as Brain.IChartData;\r\n\r\n\r\n\tconst downloadBtn = (extractTypeId: number) => {\r\n\t\tconst { indicator } = localState;\r\n\r\n\t\tif (indicator == extractTypeId)\r\n\t\t\treturn \r\n\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\tlocalDispatch({ type: BrainIndicatorAction.UserClickedDownloadIndicator, payload: extractTypeId })} />\r\n\t\t)\r\n\t}\r\n\r\n\tconst ecog = {\r\n\t\tnumerator: 0,\r\n\t\tdenominator: 0,\r\n\t\tpercentage: 0\r\n\t}\r\n\r\n\tconst stage = {\r\n\t\tnumerator: 0,\r\n\t\tdenominator: 0,\r\n\t\tpercentage: 0\r\n\t}\r\n\r\n\tif (brainChartData.level1.totalDiagnoses > 0) {\r\n\t\tecog.numerator = brainChartData.level1.totalDiagnoses - (brainChartData.level2.ecogGroup.values[brainChartData.level2.ecogGroup.labels.indexOf(\"Unk\")] || 0);\r\n\t\tecog.denominator = brainChartData.level1.totalDiagnoses\r\n\t\tecog.percentage = ecog.numerator / ecog.denominator * 100\r\n\r\n\t\tstage.numerator = brainChartData.level1.totalDiagnoses - (brainChartData.level2.tnmStage.values[brainChartData.level2.tnmStage.labels.indexOf(\"Unk\")] || 0);\r\n\t\tstage.denominator = brainChartData.level1.totalDiagnoses;\r\n\t\tstage.percentage = stage.numerator / stage.denominator * 100\r\n\t}\r\n\r\n\r\n\tconst dashboard = <>\r\n\t\t
\r\n\r\n\r\n\t\t\t{(showFilterChips ?
\r\n\t\t\t\t{chips}\r\n\t\t\t
: null)}\r\n\t\t
\r\n\r\n\r\n\r\n\t\t
\r\n\r\n\t\t\t
\r\n\t\t\t\t\r\n\t\t\t
\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tIndicator\r\n\t\t\t\t\t\t\tMy MDT(s)*\r\n\t\t\t\t\t\t\t{stateWideData.title}^\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tPrimary brain cancer diagnoses^\r\n\t\t\t\t\t\t\t{`${brainChartData.level1.totalDiagnoses}`}\r\n\t\t\t\t\t\t\t{stateWideData.patients}\r\n\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tPercentage of patients with ECOG\r\n\t\t\t\t\t\t\t{`${ecog.percentage.toFixed(0)}%`}
{`(${ecog.numerator}/${ecog.denominator})`}
\r\n\t\t\t\t\t\t\t-\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tDiagnosis\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tPrimary brain cancer was histologically diagnosed?\r\n\t\t\t\t\t\t\t{`${brainChartData.level1.histDiag.percentage.toFixed(0)}%`}
{`(${brainChartData.level1.histDiag.numerator}/${brainChartData.level1.histDiag.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.histDiag}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tSurgical\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tReceived craniotomy as first treatment within 30 days of diagnosis?\r\n\t\t\t\t\t\t\t{`${brainChartData.level1.craniotomy30DaysDiagnosis.percentage.toFixed(0)}%`}
{`(${brainChartData.level1.craniotomy30DaysDiagnosis.numerator}/${brainChartData.level1.craniotomy30DaysDiagnosis.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.craniotomy30DaysDiagnosis}\r\n\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tCraniotomy for histologically diagnosed glioblastoma, anaplastic oligodendroglioma or anaplastic astrocytoma \r\n\t\t\t\t\t\t\t{`${brainChartData.level1.craniotomyForHistDiagGlioAnaOligoAnaAstro.percentage.toFixed(0)}%`}
{`(${brainChartData.level1.craniotomyForHistDiagGlioAnaOligoAnaAstro.numerator}/${brainChartData.level1.craniotomyForHistDiagGlioAnaOligoAnaAstro.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.craniotomyForHistDiagGlioAnaOligoAnaAstro}\r\n\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tCraniotomy for histologically diagnosed ependymoma\r\n\t\t\t\t\t\t\t{`${brainChartData.level1.craniotomyForepend.percentage.toFixed(0)}%`}
{`(${brainChartData.level1.craniotomyForepend.numerator}/${brainChartData.level1.craniotomyForepend.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.craniotomyForepend}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tDied during last craniotomy admission\r\n\t\t\t\t\t\t\t{`${brainChartData.level1.inHospitalMortality.percentage.toFixed(1)}%`}
{`(${brainChartData.level1.inHospitalMortality.numerator}/${brainChartData.level1.inHospitalMortality.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.inHospitalMortality}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tDied within 30 days of craniotomy\r\n\t\t\t\t\t\t\t{`${brainChartData.level1.mortality30Days.percentage.toFixed(1)}%`}
{`(${brainChartData.level1.mortality30Days.numerator}/${brainChartData.level1.mortality30Days.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.mortality30Days}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tDied within 90 days of craniotomy\r\n\t\t\t\t\t\t\t{`${brainChartData.level1.mortality90Days.percentage.toFixed(0)}%`}
{`(${brainChartData.level1.mortality90Days.numerator}/${brainChartData.level1.mortality90Days.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.mortality90Days}\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t1 yrs survival after 1st craniotomy^\r\n\t\t\t\t\t\t\t{`${brainChartData.level1.oneYearSurvival.percentage.toFixed(0)}%`}
{`(${brainChartData.level1.oneYearSurvival.numerator}/${brainChartData.level1.oneYearSurvival.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.oneYearSurvival}\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t2 yrs survival after 1st craniotomy^\r\n\t\t\t\t\t\t\t{`${brainChartData.level1.twoYearSurvival.percentage.toFixed(0)}%`}
{`(${brainChartData.level1.twoYearSurvival.numerator}/${brainChartData.level1.twoYearSurvival.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.twoYearSurvival}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t ^Patients with less than one and two years of data from their first surgery are excluded from the one and two year survival indicators respectively.\r\n\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tRadiation Therapy\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tRadiation therapy dosimetry of 45-54Gy for low grade glioma \r\n\t\t\t\t\t\t\t{`${brainChartData.level1.rt45To54LowGrade.percentage.toFixed(0)}%`}
{`(${brainChartData.level1.rt45To54LowGrade.numerator}/${brainChartData.level1.rt45To54LowGrade.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.rt45To54LowGrade}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tRadiation therapy dosimetry of 54-60Gy for people aged under 70 with grade 4 gliomas \r\n\t\t\t\t\t\t\t{`${brainChartData.level1.rt54To60Under70Grade4.percentage.toFixed(0)}%`}
{`(${brainChartData.level1.rt54To60Under70Grade4.numerator}/${brainChartData.level1.rt54To60Under70Grade4.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.rt54To60Under70Grade4}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tReceived radiation therapy for people aged under 70 with high grade glioma\r\n\t\t\t\t\t\t\t{`${brainChartData.level1.rtUnder70HighGrade.percentage.toFixed(0)}%`}
{`(${brainChartData.level1.rtUnder70HighGrade.numerator}/${brainChartData.level1.rtUnder70HighGrade.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.rtUnder70HighGrade}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tRadiation therapy for people aged 70 and older with high grade glioma \r\n\t\t\t\t\t\t\t{`${brainChartData.level1.rt70PlusHighGrade.percentage.toFixed(0)}%`}
{`(${brainChartData.level1.rt70PlusHighGrade.numerator}/${brainChartData.level1.rt70PlusHighGrade.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.rt70PlusHighGrade}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tRadiation therapy for anaplastic oligodendroglioma\r\n\t\t\t\t\t\t\t{`${brainChartData.level1.rtAnaOligo.percentage.toFixed(0)}%`}
{`(${brainChartData.level1.rtAnaOligo.numerator}/${brainChartData.level1.rtAnaOligo.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.rtAnaOligo}\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tRadiation therapy for anaplastic astrocytoma \r\n\t\t\t\t\t\t\t{`${brainChartData.level1.rtAnaAstro.percentage.toFixed(0)}%`}
{`(${brainChartData.level1.rtAnaAstro.numerator}/${brainChartData.level1.rtAnaAstro.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.rtAnaAstro}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tRadiation therapy within 49 days of diagnosis for people with histologically diagnosed high grade glioma \r\n\t\t\t\t\t\t\t{`${brainChartData.level1.rt49DaysHistDiagHighGrade.percentage.toFixed(0)}%`}
{`(${brainChartData.level1.rt49DaysHistDiagHighGrade.numerator}/${brainChartData.level1.rt49DaysHistDiagHighGrade.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.rt49DaysHistDiagHighGrade}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t
\r\n\r\n\t\t\t
\r\n\t\t\t\t

*Data based on facility of MDT

\r\n\t\t\t
\r\n\r\n\t\t\t
\r\n\t\t\t\t

^The comparison data in the Qld report is based on a person's incidence case of the cancer. The MDT data is all diagnoses (with a diagnosis date) presented to MDT using the Qool application

\r\n\t\t\t
\r\n\r\n\t\t\t
\r\n\t\t\t\t

This report is based on the Queensland Brain Cancer Quality Index 2011-2020. Indicator definitions and glossary can be found here also

\r\n\t\t\t
\r\n\r\n\t\t
\r\n\r\n\t\t\r\n\r\n\t\r\n\r\n\treturn (\r\n\t\tdashboard\r\n\t)\r\n\r\n\r\n} ","import * as React from \"react\"\r\nimport * as Brain from \"models/brain\";\r\nimport { AppContext } from \"AppContext\";\r\nimport { ActionTypes } from \"reducer/actions\";\r\nimport { Box, Button, Typography } from \"@mui/material\";\r\nimport { FilterContext } from \"models/core/filter\";\r\nimport Select from \"react-select\";\r\nimport { SideBySideButton } from \"components/common/SideBySideOptions\";\r\nimport { exportMdtPatients } from \"models/mdt/worker\";\r\nimport * as fileHelper from \"helpers/fileHelper\";\r\nimport Loader from \"pages/shared/filterloader\";\r\n\r\nexport function BrainFilters() {\r\n\tconst { state, dispatch } = React.useContext(AppContext);\r\n\r\n\tconst addFilter: Brain.AddFilterFunc = async (key: keyof typeof Brain.DashboardFilterKeys, value: string | string[], context?: FilterContext, labelOverride?: string) => {\r\n\t\tconst filteredDashboard = await Brain.computeChartData(Brain.addFilter(state.page.dashboard as Brain.IBrainDashboard)(key, value, context, labelOverride)); // state = what the other filter function returns \r\n\t\tdispatch({ type: ActionTypes.UserClickedOnChart, payload: filteredDashboard });\r\n\t}\r\n\r\n\tconst removeFilter: Brain.RemoveFilterFunc = async (key: keyof typeof Brain.DashboardFilterKeys) => {\r\n\r\n\t\tconst filteredDashboard = await Brain.computeChartData(Brain.removeFilter(state.page.dashboard as Brain.IBrainDashboard, key));\r\n\t\tdispatch({ type: ActionTypes.UserClickedOnChart, payload: filteredDashboard });\r\n\t}\r\n\r\n\tif (state.page.loading)\r\n\t\treturn \r\n\r\n\tconst dataForFilters = state.page.dashboard.chartData as Brain.IChartData;\r\n\t//HHS \r\n\t//HHS Options\r\n\tconst hhsOptions: any[] = [];\r\n\tdataForFilters?.level1.hhses.map(p => {\r\n\t\thhsOptions.push({ label: p.name, value: p.id });\r\n\t})\r\n\r\n\t//Filtered HHSes\r\n\tlet hhsSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.HHS?.value?.map(p => {\r\n\t\thhsSelections.push({ label: p, value: hhsOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\t//Add code to be able to filter list of facilities to a chosen HHS\r\n\tlet selectedHHSIds = [];\r\n\tif (hhsSelections.length > 0) {\r\n\t\tselectedHHSIds = hhsSelections.map(a =>\r\n\t\t\ta.value);\r\n\t}\r\n\r\n\t//Facility \r\n\t//Facility Options\r\n\tconst facilityOptions: any[] = [];\r\n\tif (hhsSelections.length > 0) {\r\n\t\tdataForFilters?.level1.facilities.filter(a => selectedHHSIds.includes(a.hhsId)).map(p => {\r\n\t\t\tfacilityOptions.push({ label: p.name, value: p.facilityId });\r\n\t\t})\r\n\t} else {\r\n\t\tdataForFilters?.level1.facilities.map(p => {\r\n\t\t\tfacilityOptions.push({ label: p.name, value: p.facilityId });\r\n\t\t});\r\n\t}\r\n\r\n\t//Filtered facilities\r\n\tlet facilitySelections: any[] = [];\r\n\tstate.page.dashboard.filters?.Facility?.value?.map(p => {\r\n\t\tfacilitySelections.push({ label: p, value: facilityOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\t//Add code to be able to filter list of Mdts to a chosen Facilities\r\n\tlet selectedFacilityIds = [];\r\n\tif (facilitySelections.length > 0) {\r\n\t\tselectedFacilityIds = facilitySelections.map(a =>\r\n\t\t\ta.value);\r\n\t}\r\n\r\n\t//MDTs\r\n\t//Options\r\n\tconst mdtOptions: any[] = [];\r\n\tif (facilitySelections.length > 0) {\r\n\t\tdataForFilters?.level1.mdts.filter(a => selectedFacilityIds.includes(a.facilityId)).map(p => {\r\n\t\t\tmdtOptions.push({ label: p.nameAndFacility, value: p.mdtNameId });\r\n\t\t})\r\n\t} else {\r\n\t\tdataForFilters?.level1.mdts.map(p => {\r\n\t\t\tmdtOptions.push({ label: p.nameAndFacility, value: p.mdtNameId });\r\n\t\t})\r\n\t}\r\n\r\n\t//Filtered MDTs\r\n\tlet mdtSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.Mdt?.value?.map(p => {\r\n\t\tmdtSelections.push({ label: p, value: mdtOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\t//let { path } = state.page.dashboard.chartData.reviewsByPeriod;\r\n\t//let parts = FilterContext.fromPath(path).parts;\r\n\r\n\t//Months\r\n\t//Options\r\n\tconst monthOptions: any[] = [];\r\n\tdataForFilters?.level1.month.map(p => {\r\n\t\tmonthOptions.push({ label: p.name, value: p.id });\r\n\t})\r\n\r\n\t//Filtered MDT months\r\n\tlet mdtMonthSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.MdtMonth?.value?.map(p => {\r\n\t\tmdtMonthSelections.push({\r\n\t\t\tlabel: p,\r\n\t\t\tvalue: monthOptions.find(a => a.label == p)?.value\r\n\t\t});\r\n\t})\r\n\r\n\t//Filtered diagnosis months\r\n\tlet diagMonthSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.DiagnosisMonth?.value?.map(p => {\r\n\t\tdiagMonthSelections.push({ label: p, value: monthOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\t//Years\r\n\t//MDT Year options\r\n\tconst mdtYearOptions: any[] = [];\r\n\tdataForFilters?.level1.year.map(p => {\r\n\t\tif (p.id >= 2010) {\r\n\t\t\tmdtYearOptions.push({ label: p.name, value: p.id });\r\n\t\t}\r\n\t})\r\n\r\n\t//Diagnosis year options\r\n\tconst diagYearOptions: any[] = [];\r\n\tdataForFilters?.level1.year.map(p => {\r\n\t\tdiagYearOptions.push({ label: p.name, value: p.id });\r\n\t})\r\n\r\n\t//Filtered year selections\r\n\tlet mdtYearSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.MdtYear?.value?.map(p => {\r\n\t\tmdtYearSelections.push({\r\n\t\t\tlabel: p,\r\n\t\t\tvalue: mdtYearOptions.find(a => a.label == p)?.value\r\n\t\t});\r\n\t})\r\n\r\n\t//Filtered diagnosis selections\r\n\tlet diagYearSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.DiagnosisYear?.value?.map(p => {\r\n\t\tdiagYearSelections.push({ label: p, value: diagYearOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\t//State for side by side button \r\n\tconst [viewBy, setViewBy] = React.useState(diagYearSelections.length > 0 ? \"Diagnosis Year\" : \"MDT Year\");\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t\r\n\t\t\t\tHHS\r\n\t\t\t\t {\r\n\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\tremoveFilter(Brain.DashboardFilterKeys.HHS.key);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\taddFilter(Brain.DashboardFilterKeys.HHS.key, filterValues);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t}),\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t\r\n\r\n\r\n\t\t\t\r\n\t\t\t\tFacility\r\n\t\t\t\t {\r\n\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\tremoveFilter(Brain.DashboardFilterKeys.Facility.key);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\taddFilter(Brain.DashboardFilterKeys.Facility.key, filterValues);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t}),\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t\r\n\r\n\r\n\t\t\t\r\n\t\t\t\tMDT\r\n\t\t\t\t {\r\n\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\tremoveFilter(Brain.DashboardFilterKeys.Mdt.key);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\taddFilter(Brain.DashboardFilterKeys.Mdt.key, filterValues);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t}),\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t\r\n\r\n\t\t\t\r\n\t\t\t\tView By\r\n\t\t\t\t {\r\n\t\t\t\t\t\tsetViewBy(p)\r\n\t\t\t\t\t}}\r\n\r\n\t\t\t\t/>\r\n\t\t\t\r\n\r\n\t\t\t{(viewBy == \"MDT Year\" ?\r\n\t\t\t\t<>\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tMDT Year\r\n\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\t\t\tremoveFilter(Brain.DashboardFilterKeys.MdtYear.key);\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\taddFilter(Brain.DashboardFilterKeys.MdtYear.key, filterValues);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tMDT Month\r\n\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\t\t\tremoveFilter(Brain.DashboardFilterKeys.MdtMonth.key);\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\taddFilter(Brain.DashboardFilterKeys.MdtMonth.key, filterValues);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t:\r\n\t\t\t\t<>\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tDiagnosis Year\r\n\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\t\t\tremoveFilter(Brain.DashboardFilterKeys.DiagnosisYear.key);\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\taddFilter(Brain.DashboardFilterKeys.DiagnosisYear.key, filterValues);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tDiagnosis Month\r\n\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\t\t\tremoveFilter(Brain.DashboardFilterKeys.DiagnosisMonth.key);\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\taddFilter(Brain.DashboardFilterKeys.DiagnosisMonth.key, filterValues);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\r\n\r\n\t\t\t\t\r\n\t\t\t)}\r\n\r\n\r\n\t\t\t{/* \r\n\t\t\t\t{(Object.keys(state.page.dashboard.filters).length !== 0 ?\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\texportMdtPatients(dataForFilters.level1.filteredReferralIdCsv, false)\r\n\t\t\t\t\t\t\t\t.then(data => {\r\n\t\t\t\t\t\t\t\t\tif (data.errorMessage) {\r\n\t\t\t\t\t\t\t\t\t\tthrow data.errorMessage;\r\n\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\treturn fileHelper.showFile(data.bytes, data.filename, fileHelper.fileTypeToMimeType(data.filetype), \"exportMdtPatientsElem\")\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t\t.catch(err => console.log(err))\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t>Download Patient List\r\n\t\t\t\t\t :\r\n\r\n\t\t\t\t\t
Make a filter selection in order to download patient list
)}\r\n\t\t\t
\r\n\r\n\t\t\t */}\r\n\t\t\r\n\t)\r\n}\r\n\r\n","import { BrainDashboard } from \"./dashboard\";\r\nimport { BrainFilters } from \"./filters\";\r\nimport * as React from \"react\";\r\n\r\nexport { BrainFilters }\r\n\r\n\r\nexport class BrainDashboardHome extends React.Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n width: 0,\r\n height: 0\r\n }; \r\n \r\n }\r\n\r\n private updateDimensions = () => {\r\n this.setState({ width: window.innerWidth, height: window.innerHeight });\r\n };\r\n \r\n public componentWillUnmount() {\r\n window.removeEventListener('resize', this.updateDimensions);\r\n }\r\n \r\n public componentDidMount() {\r\n window.addEventListener('resize', this.updateDimensions);\r\n }\r\n\r\n render = () => {\r\n return (\r\n <>\r\n \r\n \r\n )\r\n\r\n }\r\n}\r\n","import { \r\n IPlotData as ICorePlotData, createPlotData as createCorePlotData, \r\n ISourceData as ICoreSourceData, createData as createCoreData, addDataFactory, addSet \r\n} from \"models/core\";\r\nimport { IDashboardViewModel } from \"./core\";\r\n\r\n/**\r\n * Plot data source\r\n */\r\nexport type IPlotData = ICorePlotData;\r\n\r\n/**\r\n * Source data\r\n */\r\nexport type ISourceData = ICoreSourceData;\r\n\r\n/**\r\n * Raw data source. Used to shape and accumulate.\r\n */\r\nexport interface ISourceBuilder {\r\n uniques: Set;\r\n values: ISourceData;\r\n}\r\n\r\n/**\r\n * Create a new plot data object.\r\n */\r\nexport const createPlotData = createCorePlotData;\r\n\r\n/**\r\n * Create a new source data object\r\n */\r\nexport function createBuilder(): ISourceBuilder {\r\n return {\r\n uniques: new Set(),\r\n values: createCoreData(),\r\n };\r\n}\r\n\r\nconst add = addDataFactory((vm: IDashboardViewModel) => vm.morphology.name);\r\n\r\n/**\r\n * Returns the number added to the hierarchy on add, 0 otherwise. \r\n * @param vm \r\n * @param into \r\n */\r\nexport function addData(vm: IDashboardViewModel, into: ISourceBuilder): number {\r\n //Only count once per diagnosis per morphology.\r\n if (addSet(vm.morphology.id + \"_\" + vm.diagnosisId, into.uniques)) {\r\n add(vm, into.values);\r\n return 1;\r\n }\r\n\r\n return 0;\r\n}\r\n\r\n/**\r\n * Compare sourceData[a] to sourceData[b] and return -1 when a is less than b, 0 when equal, 1 when a is greater than 0\r\n * @param a \r\n * @param b \r\n */\r\nexport const sort = (s: ISourceData, a: string, b: string): number => {\r\n return ((s[a] < s[b]) ? -1 : ((s[a] > s[b]) ? 1 : 0));\r\n};\r\n\r\n/** \r\n * Complete adding data and clear any temporary resources \r\n */\r\nexport function finish(builder: ISourceBuilder): ISourceData {\r\n try {\r\n return builder.values;\r\n } finally {\r\n builder.uniques.clear();\r\n builder.uniques = null;\r\n builder.values = null;\r\n builder = null;\r\n }\r\n}","\r\nimport {\r\n\tAddDataSharedFunc, DashboardSharedFilterFunc, DashboardSharedFilterKey,\r\n\tIDashboardSharedChartData, IDashboardSharedDimensionsViewModel,\r\n} from \"models/common\";\r\nimport { IFilters, IFilterKeys, DimensionsById, ISourceData, IDimFacility, IDimension, IDimMDT } from \"models/core\";\r\nimport { IDashboardViewModel } from \"./viewModel\";\r\n\r\n//Plots for this dashboard\r\nimport * as PrimarySite from \"./primarySiteHierarchy\";\r\nimport * as Morphology from \"./morphology\";\r\nimport * as Remoteness from \"../../common/plotdata/remoteness\";\r\nimport * as HHSOfResidence from \"../../common/plotdata/hhsOfResidence\";\r\n\r\nexport type { IDashboardViewModel } from \"./viewModel\";\r\n\r\nexport type IDashboardSource = IDashboardViewModel[];\r\n\r\nexport interface ILungIndicatorConstants {\r\n\ttotalLungDiagnoses: number,\r\n\tupper95Percent: number,\r\n\tlower95Percent: number,\r\n\tupper98Percent: number,\r\n\tlower98Percent: number,\r\n\tstatePercent: number\r\n}\r\n\r\nexport interface IDashboardDimensionsViewModel extends IDashboardSharedDimensionsViewModel {\r\n\tdefMastectomyArray?: Array;\r\n};\r\n\r\ninterface ILevel1ChartData {\r\n\ttotalDiagnoses: number;\r\n\ttotalDataQualityEligibleDiagnoses: number;\r\n\tfacilities: IDimFacility[];\r\n\thhses: IDimension[];\r\n\tmdts: IDimMDT[];\r\n\tmonth: IDimension[];\r\n\tyear: IDimension[];\r\n\r\n\thadSurgery: { numerator, denominator: number, percentage: number };\r\n hadSurgeryStageOneOrTwo: { numerator, denominator: number, percentage: number };\r\n rtInoperableStageOneOrTwo: { numerator, denominator: number, percentage: number };\r\n //crtInoperableStageThree: { numerator, denominator: number, percentage: number };\r\n concurrentCRTInoperableStageThree: { numerator, denominator: number, percentage: number };\r\n //sequentialCRTInoperableStageThree: { numerator, denominator: number, percentage: number };\r\n lengthOfStay: { min: number, max: number, median: number };\r\n //emergencyReadmission30Day: { numerator, denominator: number, percentage: number };\r\n inHospitalMortality: { numerator, denominator: number, percentage: number };\r\n mortality30Day: { numerator, denominator: number, percentage: number };\r\n mortality90Day: { numerator, denominator: number, percentage: number };\r\n prolongedLOS: { numerator, denominator: number, percentage: number };\r\n mortality30DayRT: { numerator, denominator: number, percentage: number };\r\n mortality30DayIVST: { numerator, denominator: number, percentage: number };\r\n treatment30DaysFromDiagnosis: { numerator, denominator: number, percentage: number };\r\n surgery30DaysFromDiagnosis: { numerator, denominator: number, percentage: number };\r\n rt30DaysFromDiagnosis: { numerator, denominator: number, percentage: number };\r\n ivst30DaysFromDiagnosis: { numerator, denominator: number, percentage: number };\r\n survivalOneYearAfterSurgery: { numerator, denominator: number, percentage: number };\r\n survivalTwoYearAfterSurgery: { numerator, denominator: number, percentage: number };\r\n\tneoAdjOrAdjInStage2A3A: { numerator, denominator: number, percentage: number };\r\n\treceivedSTStage4: { numerator, denominator: number, percentage: number };\r\n\thadPathDiagnosis: { numerator, denominator: number, percentage: number };\r\n\ttreatmentRate: { numerator, denominator: number, percentage: number };\r\n\thadSurgOrRTStageOneOrTwo: { numerator, denominator: number, percentage: number };\r\n\t// Export\r\n\tfilteredReferralIdCsv: string;\r\n}\r\n\r\n// HACK: chop out the reference array from the shared interface \r\ntype RestrictedSharedChartData = Omit, \"hhses\">;\r\n\r\ninterface ILevel2ChartData extends RestrictedSharedChartData {\r\n\ttotalDiagnoses: number;\r\n\tprimarySite: PrimarySite.IHierarchyPlotData;\r\n\tmorphology: Morphology.IPlotData;\r\n\tremoteness: Remoteness.IPlotData;\r\n\thhsOfResidence: HHSOfResidence.IPlotData;\r\n}\r\n\r\nexport interface IChartData {\r\n\tlevel1: ILevel1ChartData;\r\n\tlevel2: ILevel2ChartData;\r\n}\r\n\r\nconst LungFilterKeys: IFilterKeys = {\r\n\t//Filter keys for lung indicators\r\n\tDiagnosisYear: { key: \"DiagnosisYear\", label: \"Diagnosis Year\" },\r\n\tDiagnosisMonth: { key: \"DiagnosisMonth\", label: \"Diagnosis Month\" },\r\n\tMdtYear: { key: \"MdtYear\", label: \"MDT Year\" },\r\n\tMdtMonth: { key: \"MdtMonth\", label: \"MDT Month\" },\r\n\tPrimarySite: { key: \"PrimarySite\", label: \"Primary site\" },\r\n\tMorphology: { key: \"Morphology\", label: \"Morphology\" },\r\n\tRemoteness: { key: \"Remoteness\", label: \"Rurality\" },\r\n\tHHSOfResidence: { key: \"HHSOfResidence\", label: \"HHS of residence\" }\r\n}\r\n\r\nexport const DashboardFilterKeys: IFilterKeys = {\r\n\t...DashboardSharedFilterKey,\r\n\t...LungFilterKeys\r\n}\r\n\r\nexport type Filters = IFilters;\r\nexport type DashboardFilterFunc = DashboardSharedFilterFunc;\r\nexport type AddDataFunc = AddDataSharedFunc;","import { IChartData, IDashboardDimensionsViewModel, Filters } from \"../plotdata\";\r\n\r\n//Actions / requests\r\nexport enum WorkerRequestType { Ping, Fetch, ChartData }\r\nexport interface IWorkerFetchRequest { all: boolean, rawRefs: any, rawRows: string, minYear: number }\r\nexport interface IWorkerChartDataRequest { filtersToApply: Filters, minYear: number };\r\nexport interface IWorkerRequest {\r\n type: WorkerRequestType;\r\n id: string;\r\n payload?: any; //?\r\n}\r\n\r\n//Results\r\nexport enum WorkerResultType { Ping, Fetch, ChartData, InvalidType }\r\nexport interface IWorkerResult {\r\n type: WorkerResultType;\r\n id: string;\r\n payload?: any; //?\r\n}\r\nexport interface IWorkerPingResult {}\r\nexport interface IWorkerFetchResult { allData: boolean, references: IDashboardDimensionsViewModel, chartData: IChartData }\r\nexport type IWorkerChartDataResult = IChartData;","export default function Worker_fn() {\n return new Worker(__webpack_public_path__ + \"data.worker.0a882e9a0038470044f8.worker.js\");\n}\n","import { generateUUID } from \"helpers\";\r\nimport { getLungDashboard, getLungDashboardReferences } from \"api/dashboardApi\";\r\nimport { Filters } from \"../plotdata\";\r\nimport { IWorkerChartDataRequest, IWorkerChartDataResult, IWorkerFetchRequest, IWorkerFetchResult, IWorkerPingResult, IWorkerRequest, WorkerRequestType, WorkerResultType } from \"./models\";\r\nimport DataWorker from 'worker-loader!./data.worker';\r\nexport type { IWorkerChartDataResult, IWorkerFetchResult, IWorkerPingResult, IWorkerRequest, WorkerRequestType }\r\n\r\n//#region Worker\r\n\r\nlet worker: DataWorker = null;\r\nlet promises = {};\r\nlet data = {\r\n minYear: 0,\r\n}\r\n\r\n/**\r\n * Start the Worker\r\n */\r\nexport function start(minYear: number) {\r\n data.minYear = minYear;\r\n\r\n if (!window[\"Worker\"]) {\r\n console.log(\"WebWorker not supported\");\r\n return false;\r\n\r\n } else {\r\n console.log(\"WebWorker starting\");\r\n\r\n worker = worker || new DataWorker();\r\n\r\n /**\r\n * When the worker sends an error back to the main thread, resolve the associated promise.\r\n */\r\n worker.addEventListener(\"message\", (ev: MessageEvent) => {\r\n const { data: { id, type, payload } } = ev;\r\n\r\n //Any specific handling by message type\r\n switch (type as WorkerResultType) {\r\n // case WorkerResultType.Ping: {\r\n // case WorkerResultType.Fetch: {\r\n default: {\r\n //Default handler will just resolve\r\n promises[id]?.resolve(payload);\r\n break;\r\n }\r\n }\r\n\r\n promises[id] = undefined;\r\n });\r\n\r\n /**\r\n * When the worker sends an error back to the main thread, reject the associated promise.\r\n */\r\n worker.addEventListener(\"messageerror\", (ev: MessageEvent) => {\r\n const { data: { id, type, payload } } = ev;\r\n\r\n //Any specific handling by message type\r\n switch (type) {\r\n //case WorkerResultType.Ping: {\r\n //case WorkerResultType.Fetch: {\r\n default: {\r\n console.error(\"ERROR from worker\", payload);\r\n promises[id].reject(payload);\r\n break;\r\n }\r\n }\r\n\r\n promises[id] = undefined;\r\n });\r\n\r\n return true;\r\n }\r\n}\r\n\r\n/**\r\n * Post the message to the Worker\r\n * @param request \r\n */\r\nfunction send(request: IWorkerRequest) {\r\n worker.postMessage(request);\r\n}\r\n\r\n/**\r\n * Transform into a Promise and track it.\r\n * @param type \r\n * @param payload \r\n */\r\nfunction actionPromise(type: WorkerRequestType, payload: TIn): Promise {\r\n const id = generateUUID();\r\n promises[id] = {};\r\n promises[id].promise = new Promise((resolve, reject) => {\r\n send({ id, type, payload });\r\n\r\n promises[id].resolve = resolve;\r\n promises[id].reject = reject;\r\n });\r\n\r\n return promises[id].promise;\r\n}\r\n\r\nexport function ping(): Promise {\r\n return actionPromise(WorkerRequestType.Ping, null);\r\n}\r\n\r\n/**\r\n * Fetch the data from the server, then push it to the Worker for processing.\r\n * @param all \r\n */\r\nexport function fetch(all: boolean): Promise {\r\n //WebWorker cannot access sessionStorage so do the api call here and\r\n //send the data tp it.\r\n return Promise.all([\r\n getLungDashboard(all),\r\n getLungDashboardReferences(all),\r\n ])\r\n .then(results => {\r\n return actionPromise(WorkerRequestType.Fetch, {\r\n all,\r\n rawRows: results[0] as string,\r\n rawRefs: results[1] as any,\r\n minYear: data.minYear,\r\n });\r\n });\r\n\r\n}\r\n\r\n/**\r\n * Apply the filters in the Worker and return the ChartData\r\n * @param filtersToApply \r\n */\r\nexport function chartData(filtersToApply: Filters): Promise {\r\n return actionPromise(WorkerRequestType.ChartData, {\r\n filtersToApply,\r\n minYear: data.minYear,\r\n });\r\n}\r\n\r\n/** Terminate the worker */\r\nexport function stop() {\r\n worker && worker.terminate();\r\n worker = null;\r\n console.log(\"WebWorker terminated\");\r\n}\r\n\r\n//#endregion Worker\r\n","import { AddFilterBaseFunc, FilterContext, RemoveFilterBaseFunc } from \"../core\";\r\nimport { DashboardFilterKeys, Filters, IChartData, IDashboardDimensionsViewModel } from \"./plotdata\";\r\n\r\nexport type { IChartData, IDashboardDimensionsViewModel, Filters } from \"./plotdata\";\r\nexport { DashboardFilterKeys } from \"./plotdata\";\r\nexport type AddFilterFunc = AddFilterBaseFunc;\r\nexport type RemoveFilterFunc = RemoveFilterBaseFunc;\r\n\r\nimport * as DashWorker from \"./worker\";\r\nexport { DashWorker }\r\n\r\nexport interface ILungDashboard {\r\n\tallData: boolean;\r\n\treferences: IDashboardDimensionsViewModel;\r\n\tfilters: Filters;\r\n\tchartData: IChartData;\r\n\tselectedFacilities: Set;\r\n selectedHhses: Set;\r\n onlyDataQualityEligible: boolean;\r\n}\r\n\r\n\r\nexport const initState = (): ILungDashboard => {\r\n\treturn {\r\n\t\tallData: false,\r\n\t\treferences: {},\r\n\t\tchartData: null,\r\n\t\tfilters: {},\r\n\t\tselectedFacilities: new Set(),\r\n\t\tselectedHhses: new Set(),\r\n\t\tonlyDataQualityEligible: false,\r\n\t}\r\n};\r\n\r\n\r\nexport const loadLungDashboard = async (state: ILungDashboard): Promise => {\r\n\tDashWorker.start(2010);\r\n\ttry {\r\n\t\tawait DashWorker.ping()\r\n\t\tconsole.log(\"WORKER PING RESOLVED\");\r\n\t\treturn await fetchData(state, state.allData);\r\n\t} catch {\r\n\t\tconsole.error(\"WORKER PING FAILED\");\r\n\t}\r\n}\r\n\r\nexport const clearFilters = (state: ILungDashboard): ILungDashboard => {\r\n\tconst maybeSetDefaultFilter = (filterKey: string, dimensions: { name: string }[]): Set => {\r\n\t\tif (!dimensions || dimensions.length !== 1)\r\n\t\t\treturn (new Set());\r\n\r\n\t\tif (state.allData)\r\n\t\t\treturn (new Set());\r\n\r\n\t\tlet filterSet = new Set();\r\n\t\tfilterSet.add(dimensions[0].name);\r\n\r\n\t\tstate = addFilter(state)(filterKey, [dimensions[0].name])\r\n\t\treturn filterSet;\r\n\t}\r\n\r\n\tstate.filters = {};\r\n\tstate.selectedHhses = maybeSetDefaultFilter(DashboardFilterKeys.HHS.key, state.chartData.level1.hhses);\r\n\tstate.selectedFacilities = maybeSetDefaultFilter(DashboardFilterKeys.Facility.key, state.chartData.level1.facilities);\r\n\r\n\treturn { ... state };\r\n\r\n}\r\n\r\n\r\n\r\nexport const closeLungDashboard = () =>\r\n\tDashWorker.stop();\r\n\r\nconst fetchData = async (state: ILungDashboard, all: boolean): Promise => {\r\n\ttry {\r\n\t\tconst data = await DashWorker.fetch(all);\r\n\r\n\t\tconst maybeSetDefaultFilter = (filterKey: string, dimensions: { name: string }[]): Set => {\r\n\t\t\tif (!dimensions || dimensions.length !== 1)\r\n\t\t\t\treturn (new Set());\r\n\r\n\t\t\tif (all)\r\n\t\t\t\treturn (new Set());\r\n\r\n\t\t\tlet filterSet = new Set();\r\n\t\t\tfilterSet.add(dimensions[0].name);\r\n\r\n\t\t\tstate = addFilter(state)(filterKey, [dimensions[0].name])\r\n\t\t\treturn filterSet;\r\n\t\t}\r\n\r\n\t\tstate.selectedHhses = maybeSetDefaultFilter(DashboardFilterKeys.HHS.key, data.chartData.level1.hhses);\r\n state.selectedFacilities = maybeSetDefaultFilter(DashboardFilterKeys.Facility.key, data.chartData.level1.facilities);\r\n\t\tstate.allData = all;\r\n\t\tstate.references = data.references;\r\n\t\tstate.chartData = data.chartData;\r\n\t\t\r\n\t\treturn state;\r\n\t} catch {\r\n\t\tconsole.error(\"WORKER FETCHDATA FAILED\");\r\n\t\treturn state;\r\n\t}\r\n}\r\n\r\nexport const computeChartData = async (state: ILungDashboard): Promise => {\r\n\ttry {\r\n\t\tconst data = await DashWorker.chartData(state.filters);\r\n\t\tstate.chartData = data;\r\n\t\treturn {...state};\r\n\t} catch {\r\n\t\tconsole.error(\"WORKER COMPUTECHARTDATA FAILED\")\r\n\t\treturn state;\r\n\t}\r\n}\r\n\r\nexport const addFilter = (state: ILungDashboard) => (key: keyof typeof DashboardFilterKeys, value: string | string[], context?: FilterContext, labelOverride?: string): ILungDashboard => {\r\n\tconst filters: Filters = Object.assign({}, state.filters);\r\n\tconst values = (typeof value === \"string\")\r\n\t\t? [value]\r\n\t\t: value;\r\n\r\n\t//Replace the existing path entry if we are replacing a multi-value filter\r\n\t//to do so: traverse to the parent\r\n\tconst baseContext: FilterContext = context && ((context.values().length > 1) ? context.parent() : context) || new FilterContext();\r\n\tbaseContext.push(values);\r\n\r\n\tfilters[key] = ({ value: values, labelOverride, parts: baseContext.parts });\r\n\r\n\tstate.filters = filters;\r\n\r\n\treturn {...state};\r\n}\r\n\r\n\r\nexport const removeFilter = (state: ILungDashboard, key: keyof typeof DashboardFilterKeys, value?: string, labelOverride?: string): ILungDashboard => {\r\n\tconst filters: Filters = Object.assign({}, state.filters);\r\n\tconst valueToRemove: string = value || null;\r\n\tconst context = FilterContext.fromFilters(filters, key);\r\n\tconst values = context.values();\r\n\tconst newValue = (valueToRemove ? values.filter(p => p != valueToRemove): null);\r\n\r\n\tconst n = context.parent() || new FilterContext();\r\n\tif (newValue) {\r\n\t\tn.push(newValue);\r\n\t}\r\n\tfilters[key] = ({value: n.values(), labelOverride, parts: n.parts});\r\n\r\n\tif (n.parts.length === 0) {\r\n\t\tdelete filters[key];\r\n\t}\r\n\r\n\tstate.filters = filters;\r\n\treturn {...state};\r\n}","import * as React from \"react\"\r\nimport * as Lung from \"models/lung\";\r\nimport { AppContext } from \"AppContext\";\r\nimport { ActionTypes } from \"reducer/actions\";\r\nimport { Button, Paper, Table, TableBody, TableCell, TableContainer, TableHead, TableRow } from \"@mui/material\";\r\nimport { FilterContext } from \"models/core/filter\";\r\nimport { DashChip } from \"components/common/DashChips\";\r\nimport ReportApi from \"api/reportApi\";\r\nimport * as fileHelper from \"helpers/fileHelper\";\r\nimport { Download, Downloading } from \"@mui/icons-material\";\r\nimport { LUCiDUrl, LungIndicatorDefintionsUrl } from \"config/appUrlConfig\";\r\nimport { getStateIndicatorReferences } from \"api/dashboardApi\";\r\nimport Loader from \"pages/shared/pageloader\";\r\n\r\nenum LungIndicatorAction {\r\n\tUserClickedDownloadIndicator,\r\n\tDownloadIndicatorSuccess,\r\n\tDownloadIndicatorFail\r\n}\r\n\r\ntype Action =\r\n\t{ type: LungIndicatorAction.UserClickedDownloadIndicator, payload: number }\r\n\t| { type: LungIndicatorAction.DownloadIndicatorSuccess }\r\n\t| { type: LungIndicatorAction.DownloadIndicatorFail }\r\n\r\n\r\ninterface State {\r\n\tindicator: number,\r\n\tdownloading: boolean\r\n}\r\n\r\nconst initialState: State = {\r\n\tindicator: 0,\r\n\tdownloading: false\r\n}\r\n\r\n\r\n\r\nconst reducer = (state: State, action: Action): State => {\r\n\tconst { type } = action;\r\n\r\n\tswitch (type) {\r\n\t\tcase LungIndicatorAction.UserClickedDownloadIndicator:\r\n\t\t\treturn { ...state, ...{ indicator: action.payload, downloading: true } };\r\n\r\n\t\tcase LungIndicatorAction.DownloadIndicatorSuccess:\r\n\t\tcase LungIndicatorAction.DownloadIndicatorFail:\r\n\t\t\treturn { ...state, ...{ indicator: 0, downloading: false } };\r\n\r\n\t\tdefault:\r\n\t\t\treturn state;\r\n\t}\r\n}\r\n\r\nlet stateWideData: {\r\n\ttitle?: string,\r\n\ttotalPatients?: string,\r\n\thadPathDiagnosis?: string,\r\n\thadPathDiagnosisLUCiD?: string,\r\n\thadECOG?: string, \r\n\thadECOGLUCiD?: string, \r\n\thadStage?: string,\r\n\thadStageLUCiD?: string, \r\n\ttreatmentRate?: string,\r\n\ttreatmentRateLUCiD?: string,\r\n\thadSurgery?: string,\r\n\thadSurgeryStageOneAndTwo?: string,\r\n\thadSurgeryStageOneAndTwoLUCiD?: string,\r\n\thadSurgOrRadFirstStageOneOrTwo?: string,\r\n\thadSurgOrRadFirstStageOneOrTwoLUCiD?: string,\r\n\tadjuvantIVSTOperableStageTwo?: string,\r\n\trtInoperableStageOneOrTwo?: string,\r\n\tconcurrentCRTInoperableStageThree?: string,\r\n\tconcurrentCRTInoperableStageThreeLUCiD?: string,\r\n\tlengthOfStay?: string,\r\n\tinHospitalMortality?: string,\r\n\tmortality30Day?: string,\r\n\tmortality90Day?: string,\r\n\tprolongedLOS?: string,\r\n\tmortality30DayRT?: string,\r\n\tmortality30DayRTLUCiD?: string,\r\n\tmortality30DayIVST?: string,\r\n\tmortality30DayIVSTLUCiD?: string,\r\n\ttreatment30DaysFromDiagnosis?: string,\r\n\tsurgery30DaysFromDiagnosis?: string,\r\n\trt30DaysFromDiagnosis?: string,\r\n\tivst30DaysFromDiagnosis?: string,\r\n\tsurvivalOneYearAfterSurgery?: string,\r\n\tsurvivalTwoYearAfterSurgery?: string,\r\n\tneoAdjOrAdjInStage2A3A?: string,\r\n\tneoAdjOrAdjInStage2A3ALUCiD?: string,\r\n\treceivedSTStage4?: string,\r\n\treceivedSTStage4LUCiD?: string\r\n} = {};\r\n\r\nexport function LungDashboard() {\r\n\tconst [localState, localDispatch] = React.useReducer(reducer, initialState)\r\n\tconst { state, dispatch } = React.useContext(AppContext);\r\n\r\n\r\n\tconst [showFilterChips, setFilterChips] = React.useState(true);\r\n\r\n\r\n\r\n\tconst addFilter: Lung.AddFilterFunc = async (key: keyof typeof Lung.DashboardFilterKeys, value: string | string[], context?: FilterContext, labelOverride?: string) => {\r\n\t\tconst filteredDashboard = await Lung.computeChartData(Lung.addFilter(state.page.dashboard as Lung.ILungDashboard)(key, value, context, labelOverride)); // state = what the other filter function returns \r\n\t\tdispatch({ type: ActionTypes.UserClickedOnChart, payload: filteredDashboard });\r\n\t}\r\n\r\n\tconst removeFilter: Lung.RemoveFilterFunc = async (key: keyof typeof Lung.DashboardFilterKeys, value?: string) => {\r\n\t\tconst filteredDashboard = await Lung.computeChartData(Lung.removeFilter(state.page.dashboard as Lung.ILungDashboard, key, value));\r\n\t\tdispatch({ type: ActionTypes.UserClickedOnChart, payload: filteredDashboard });\r\n\t}\r\n\r\n\tReact.useEffect(() => {\r\n\t\tdispatch({ type: ActionTypes.UserWantsToLoadMdtDashboard });\r\n\r\n\t\tconst fetchStateReferenceData = async () => {\r\n\t\t\tstateWideData = await getStateIndicatorReferences(\"lung\", 2021);\r\n\t\t}\r\n\r\n\t\tconst loadDashboard = async () => {\r\n\t\t\tconst value = await Lung.loadLungDashboard(state.page.dashboard as Lung.ILungDashboard);\r\n\t\t\tdispatch({ type: ActionTypes.UserLoadedMdtDashboard, payload: value });\r\n\t\t}\r\n\r\n\t\tPromise.all([fetchStateReferenceData(), loadDashboard()]);\r\n\r\n\t\treturn () => {\r\n\t\t\tLung.closeLungDashboard();\r\n\t\t}\r\n\t}, []);\r\n\r\n\tReact.useEffect(() => {\r\n\t\tif (localState.indicator == 0)\r\n\t\t\treturn;\r\n\r\n\t\tlet ids = lungChartData.level1.filteredReferralIdCsv;\r\n\t\tlet alldata = false;\r\n\r\n\r\n\t\tconst getLungIndicatorPatientList = async () => {\r\n\t\t\ttry {\r\n\t\t\t\tconst data = await ReportApi.getLungIndicatorPatientList(ids, alldata, localState.indicator);\r\n\t\t\t\tif (data.errorMessage) {\r\n\t\t\t\t\tconsole.error(data.errorMessage);\r\n\t\t\t\t\tlocalDispatch({ type: LungIndicatorAction.DownloadIndicatorFail })\r\n\t\t\t\t}\r\n\t\t\t\tlocalDispatch({ type: LungIndicatorAction.DownloadIndicatorSuccess })\r\n\t\t\t\treturn fileHelper.showFile(data.bytes, data.filename, fileHelper.fileTypeToMimeType(data.filetype), \"exportPatientsElem\")\r\n\t\t\t} catch {\r\n\t\t\t\tlocalDispatch({ type: LungIndicatorAction.DownloadIndicatorFail })\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tgetLungIndicatorPatientList();\r\n\r\n\r\n\t}, [localState.indicator]);\r\n\r\n\r\n\tif (state.page.loading || !state.page.dashboard.chartData)\r\n\t\treturn \r\n\r\n\r\n\t//Create function to show/hide filter chips\r\n\tconst toggleChips = () => {\r\n\t\tif (showFilterChips) {\r\n\t\t\tsetFilterChips(false);\r\n\t\t} else {\r\n\t\t\tsetFilterChips(true);\r\n\t\t}\r\n\t};\r\n\r\n\tlet activeFiltersArray = [];\r\n\tlet filterArray = [];\r\n\tlet chips = [];\r\n\r\n\tfor (const key in state.page.dashboard.filters) {\r\n\t\tif (Object.prototype.hasOwnProperty.call(state.page.dashboard.filters, key)) {\r\n\t\t\tactiveFiltersArray.push({ \"key\": key, \"values\": state.page.dashboard.filters[key].value, \"parts\": state.page.dashboard.filters[key].parts });\r\n\t\t}\r\n\t}\r\n\r\n\tfor (const key in Lung.DashboardFilterKeys) {\r\n\t\tif (Object.prototype.hasOwnProperty.call(Lung.DashboardFilterKeys, key)) {\r\n\t\t\tfilterArray.push({ \"key\": key, \"label\": Lung.DashboardFilterKeys[key].label });\r\n\t\t}\r\n\t}\r\n\r\n\tactiveFiltersArray.forEach(a => {\r\n\t\ta.values.forEach(b => {\r\n\t\t\tchips.push( id.key == a.key).label}\r\n\t\t\t\tfilterValue={b}\r\n\t\t\t\tfilterId={a.key}\r\n\t\t\t\tfilterParent={(a.parts.length > 1 ? a.parts[0] : null)}\r\n\t\t\t/>\r\n\t\t\t)\r\n\t\t})\r\n\t})\r\n\r\n\tconst lungChartData = state.page.dashboard.chartData as Lung.IChartData;\r\n\r\n\tconst downloadBtn = (extractTypeId: number) => {\r\n\t\tconst { indicator } = localState;\r\n\r\n\t\tif (indicator == extractTypeId)\r\n\t\t\treturn \r\n\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\tlocalDispatch({ type: LungIndicatorAction.UserClickedDownloadIndicator, payload: extractTypeId })} />\r\n\t\t)\r\n\t}\r\n\r\n\tconst ecog = {\r\n\t\tnumerator: 0,\r\n\t\tdenominator: 0,\r\n\t\tpercentage: 0\r\n\t}\r\n\r\n\tconst stage = {\r\n\t\tnumerator: 0,\r\n\t\tdenominator: 0,\r\n\t\tpercentage: 0\r\n\t}\r\n\r\n\tif (lungChartData.level1.totalDiagnoses > 0) {\r\n\t\tecog.numerator = lungChartData.level1.totalDiagnoses - (lungChartData.level2.ecogGroup.values[lungChartData.level2.ecogGroup.labels.indexOf(\"Unk\")] || 0);\r\n\t\tecog.denominator = lungChartData.level1.totalDiagnoses\r\n\t\tecog.percentage = ecog.numerator / ecog.denominator * 100\r\n\r\n\t\tstage.numerator = lungChartData.level1.totalDiagnoses - (lungChartData.level2.tnmStage.values[lungChartData.level2.tnmStage.labels.indexOf(\"Unk\")] || 0);\r\n\t\tstage.denominator = lungChartData.level1.totalDiagnoses;\r\n\t\tstage.percentage = stage.numerator / stage.denominator * 100\r\n\t}\r\n\r\n\r\n\tconst dashboard = <>\r\n\t\t
\r\n\r\n\r\n\t\t\t{(showFilterChips ?
\r\n\t\t\t\t{chips}\r\n\t\t\t
: null)}\r\n\t\t
\r\n\r\n\r\n\r\n\t\t
\r\n\r\n\t\t\t
\r\n\t\t\t\t\r\n\t\t\t
\r\n\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tIndicator\r\n\t\t\t\t\t\t\tMy MDT(s)*\r\n\t\t\t\t\t\t\t{stateWideData.title}^\r\n\t\t\t\t\t\t\tLUCiD Guideline#\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tDiagnosis and Staging\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tNSCLC diagnoses^\r\n\t\t\t\t\t\t\t{`${lungChartData.level1.totalDiagnoses}`}\r\n\t\t\t\t\t\t\t{stateWideData.totalPatients}\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tReceived a pathological diagnosis\r\n\t\t\t\t\t\t\t{`${lungChartData.level1.hadPathDiagnosis.percentage.toFixed(0)}%`}
{`(${lungChartData.level1.hadPathDiagnosis.numerator}/${lungChartData.level1.hadPathDiagnosis.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.hadPathDiagnosis}\r\n\t\t\t\t\t\t\t≥{stateWideData.hadPathDiagnosisLUCiD}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tPerformance status (ECOG) recorded\r\n\t\t\t\t\t\t\t{`${ecog.percentage.toFixed(0)}%`}
{`(${ecog.numerator}/${ecog.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.hadECOG}\r\n\t\t\t\t\t\t\t≥{stateWideData.hadECOGLUCiD}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tStage (TNM) recorded\r\n\t\t\t\t\t\t\t{`${stage.percentage.toFixed(0)}%`}
{`(${stage.numerator}/${stage.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.hadStage}\r\n\t\t\t\t\t\t\t≥{stateWideData.hadStageLUCiD}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tAccess\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tReceived first treatment within 30 days of diagnosis\r\n\t\t\t\t\t\t\t{`${lungChartData.level1.treatment30DaysFromDiagnosis.percentage.toFixed(0)}%`}
{`(${lungChartData.level1.treatment30DaysFromDiagnosis.numerator}/${lungChartData.level1.treatment30DaysFromDiagnosis.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.treatment30DaysFromDiagnosis}\r\n\t\t\t\t\t\t\t-\r\n\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tReceived first surgery within 30 days of diagnosis\r\n\t\t\t\t\t\t\t{`${lungChartData.level1.surgery30DaysFromDiagnosis.percentage.toFixed(0)}%`}
{`(${lungChartData.level1.surgery30DaysFromDiagnosis.numerator}/${lungChartData.level1.surgery30DaysFromDiagnosis.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.surgery30DaysFromDiagnosis}\r\n\t\t\t\t\t\t\t-\r\n\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tReceived first radiation therapy within 30 days of diagnosis\r\n\t\t\t\t\t\t\t{`${lungChartData.level1.rt30DaysFromDiagnosis.percentage.toFixed(0)}%`}
{`(${lungChartData.level1.rt30DaysFromDiagnosis.numerator}/${lungChartData.level1.rt30DaysFromDiagnosis.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.rt30DaysFromDiagnosis}\r\n\t\t\t\t\t\t\t-\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tReceived first IV systemic therapy within 30 days of diagnosis\r\n\t\t\t\t\t\t\t{`${lungChartData.level1.ivst30DaysFromDiagnosis.percentage.toFixed(0)}%`}
{`(${lungChartData.level1.ivst30DaysFromDiagnosis.numerator}/${lungChartData.level1.ivst30DaysFromDiagnosis.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.ivst30DaysFromDiagnosis}\r\n\t\t\t\t\t\t\t-\r\n\t\t\t\t\t\t
\r\n\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tTreatment\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tTreatment rate\r\n\t\t\t\t\t\t\t{`${lungChartData.level1.treatmentRate.percentage.toFixed(0)}%`}
{`(${lungChartData.level1.treatmentRate.numerator}/${lungChartData.level1.treatmentRate.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.treatmentRate}\r\n\t\t\t\t\t\t\t≥{stateWideData.treatmentRateLUCiD}\r\n\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tSurgery rate for all persons with NSCLC\r\n\t\t\t\t\t\t\t{`${lungChartData.level1.hadSurgery.percentage.toFixed(0)}%`}
{`(${lungChartData.level1.hadSurgery.numerator}/${lungChartData.level1.hadSurgery.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.hadSurgery}\r\n\t\t\t\t\t\t\t-\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tSurgery rate for stage I & II disease\r\n\t\t\t\t\t\t\t{`${lungChartData.level1.hadSurgeryStageOneOrTwo.percentage.toFixed(0)}%`}
{`(${lungChartData.level1.hadSurgeryStageOneOrTwo.numerator}/${lungChartData.level1.hadSurgeryStageOneOrTwo.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.hadSurgeryStageOneAndTwo}\r\n\t\t\t\t\t\t\t≥{stateWideData.hadSurgeryStageOneAndTwoLUCiD}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tRadiation therapy rate for stage I or II disease, who did not receive surgery\r\n\t\t\t\t\t\t\t{`${lungChartData.level1.rtInoperableStageOneOrTwo.percentage.toFixed(0)}%`}
{`(${lungChartData.level1.rtInoperableStageOneOrTwo.numerator}/${lungChartData.level1.rtInoperableStageOneOrTwo.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.rtInoperableStageOneOrTwo}\r\n\t\t\t\t\t\t\t-\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tStage I or II disease who received surgery or radiation therapy as first treatment\r\n\t\t\t\t\t\t\t{`${lungChartData.level1.hadSurgOrRTStageOneOrTwo.percentage.toFixed(0)}%`}
{`(${lungChartData.level1.hadSurgOrRTStageOneOrTwo.numerator}/${lungChartData.level1.hadSurgOrRTStageOneOrTwo.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.hadSurgOrRadFirstStageOneOrTwo}\r\n\t\t\t\t\t\t\t≥{stateWideData.hadSurgOrRadFirstStageOneOrTwoLUCiD}\r\n\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tNeoadjuvant or adjuvant IV systemic therapy for stage IIA - IIIA disease\r\n\t\t\t\t\t\t\t{`${lungChartData.level1.neoAdjOrAdjInStage2A3A.percentage.toFixed(0)}%`}
{`(${lungChartData.level1.neoAdjOrAdjInStage2A3A.numerator}/${lungChartData.level1.neoAdjOrAdjInStage2A3A.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.neoAdjOrAdjInStage2A3A}\r\n\t\t\t\t\t\t\t≥{stateWideData.neoAdjOrAdjInStage2A3ALUCiD}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tConcurrent chemoradiotherapy rate in stage III disease, who did not receive surgery\r\n\t\t\t\t\t\t\t{`${lungChartData.level1.concurrentCRTInoperableStageThree.percentage.toFixed(0)}%`}
{`(${lungChartData.level1.concurrentCRTInoperableStageThree.numerator}/${lungChartData.level1.concurrentCRTInoperableStageThree.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.concurrentCRTInoperableStageThree}\r\n\t\t\t\t\t\t\t≥{stateWideData.concurrentCRTInoperableStageThreeLUCiD}\r\n\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tIVST for stage IV disease\r\n\t\t\t\t\t\t\t{`${lungChartData.level1.receivedSTStage4.percentage.toFixed(0)}%`}
{`(${lungChartData.level1.receivedSTStage4.numerator}/${lungChartData.level1.receivedSTStage4.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.receivedSTStage4}\r\n\t\t\t\t\t\t\t≥{stateWideData.receivedSTStage4LUCiD}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tOutcomes\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tProlonged LOS ≥ 12 days\r\n\t\t\t\t\t\t\t{`${lungChartData.level1.prolongedLOS.percentage.toFixed(0)}%`}
{`(${lungChartData.level1.prolongedLOS.numerator}/${lungChartData.level1.prolongedLOS.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.prolongedLOS}\r\n\t\t\t\t\t\t\t-\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tIn-Hospital surgical mortality\r\n\t\t\t\t\t\t\t{`${lungChartData.level1.inHospitalMortality.percentage.toFixed(1)}%`}
{`(${lungChartData.level1.inHospitalMortality.numerator}/${lungChartData.level1.inHospitalMortality.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.inHospitalMortality}\r\n\t\t\t\t\t\t\t-\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t30-day surgical mortality\r\n\t\t\t\t\t\t\t{`${lungChartData.level1.mortality30Day.percentage.toFixed(1)}%`}
{`(${lungChartData.level1.mortality30Day.numerator}/${lungChartData.level1.mortality30Day.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.mortality30Day}\r\n\t\t\t\t\t\t\t-\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t90-day surgical mortality\r\n\t\t\t\t\t\t\t{`${lungChartData.level1.mortality90Day.percentage.toFixed(1)}%`}
{`(${lungChartData.level1.mortality90Day.numerator}/${lungChartData.level1.mortality90Day.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.mortality90Day}\r\n\t\t\t\t\t\t\t-\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t1-year surgical survival^\r\n\t\t\t\t\t\t\t{`${lungChartData.level1.survivalOneYearAfterSurgery.percentage.toFixed(0)}%`}
{`(${lungChartData.level1.survivalOneYearAfterSurgery.numerator}/${lungChartData.level1.survivalOneYearAfterSurgery.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.survivalOneYearAfterSurgery}\r\n\t\t\t\t\t\t\t-\r\n\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t2-year surgical survival^\r\n\t\t\t\t\t\t\t{`${lungChartData.level1.survivalTwoYearAfterSurgery.percentage.toFixed(0)}%`}
{`(${lungChartData.level1.survivalTwoYearAfterSurgery.numerator}/${lungChartData.level1.survivalTwoYearAfterSurgery.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.survivalTwoYearAfterSurgery}\r\n\t\t\t\t\t\t\t-\r\n\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t30-day mortality following IV systemic therapy\r\n\t\t\t\t\t\t\t{`${lungChartData.level1.mortality30DayIVST.percentage.toFixed(0)}%`}
{`(${lungChartData.level1.mortality30DayIVST.numerator}/${lungChartData.level1.mortality30DayIVST.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.mortality30DayIVST}\r\n\t\t\t\t\t\t\t{stateWideData.mortality30DayIVSTLUCiD}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t30-day mortality following curative radiation therapy\r\n\t\t\t\t\t\t\t{`${lungChartData.level1.mortality30DayRT.percentage.toFixed(0)}%`}
{`(${lungChartData.level1.mortality30DayRT.numerator}/${lungChartData.level1.mortality30DayRT.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.mortality30DayRT}\r\n\t\t\t\t\t\t\t{stateWideData.mortality30DayRTLUCiD}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t ^Patients with less than one and two years of data from their first surgery are excluded from the one and two year survival indicators respectively.\r\n\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t
\r\n\r\n\t\t\t
\r\n\t\t\t\t

*Data based on facility of MDT

\r\n\t\t\t
\r\n\r\n\t\t\t
\r\n\t\t\t\t

^The comparison data in the Qld report is based on a person's incidence case of the cancer. The MDT data is all diagnoses (with a diagnosis date) presented to MDT using the QOOL application

\r\n\t\t\t
\r\n\r\n\t\t\t
\r\n\t\t\t\t

#Lung Cancer (internet-based) Delphi (LUCiD): a modified eDelphi consensus process to establish Australasian clinical quality indicators for thoracic cancer (2024). Respirology; http://doi.org/10.1111/resp.14812

\r\n\t\t\t
\r\n\r\n\t\t\t
\r\n\t\t\t\t

This report is based on the Queensland Lung Cancer Quality Index 2012-2021. Indicator definitions and glossary can be found in the technical appendix

\r\n\t\t\t
\r\n\r\n\t\t
\r\n\r\n\t\t\r\n\r\n\t\r\n\r\n\treturn (\r\n\t\tdashboard\r\n\t)\r\n\r\n\r\n} ","import * as React from \"react\"\r\nimport * as Lung from \"models/lung\";\r\nimport { AppContext } from \"AppContext\";\r\nimport { ActionTypes } from \"reducer/actions\";\r\nimport { Box, Button, Typography } from \"@mui/material\";\r\nimport { FilterContext } from \"models/core/filter\";\r\nimport Select from \"react-select\";\r\nimport { SideBySideButton } from \"components/common/SideBySideOptions\";\r\nimport { exportMdtPatients } from \"models/mdt/worker\";\r\nimport * as fileHelper from \"helpers/fileHelper\";\r\nimport Loader from \"pages/shared/filterloader\";\r\n\r\nexport function LungFilters() {\r\n\tconst { state, dispatch } = React.useContext(AppContext);\r\n\r\n\tconst addFilter: Lung.AddFilterFunc = async (key: keyof typeof Lung.DashboardFilterKeys, value: string | string[], context?: FilterContext, labelOverride?: string) => {\r\n\t\tconst filteredDashboard = await Lung.computeChartData(Lung.addFilter(state.page.dashboard as Lung.ILungDashboard)(key, value, context, labelOverride)); // state = what the other filter function returns \r\n\t\tdispatch({ type: ActionTypes.UserClickedOnChart, payload: filteredDashboard });\r\n\t}\r\n\r\n\tconst removeFilter: Lung.RemoveFilterFunc = async (key: keyof typeof Lung.DashboardFilterKeys) => {\r\n\r\n\t\tconst filteredDashboard = await Lung.computeChartData(Lung.removeFilter(state.page.dashboard as Lung.ILungDashboard, key));\r\n\t\tdispatch({ type: ActionTypes.UserClickedOnChart, payload: filteredDashboard });\r\n\t}\r\n\r\n\tif (state.page.loading)\r\n\t\treturn ;\r\n\r\n\tconst dataForFilters = state.page.dashboard.chartData as Lung.IChartData;\r\n\t//HHS \r\n\t//HHS Options\r\n\tconst hhsOptions: any[] = [];\r\n\tdataForFilters?.level1.hhses.map(p => {\r\n\t\thhsOptions.push({ label: p.name, value: p.id });\r\n\t})\r\n\r\n\t//Filtered HHSes\r\n\tlet hhsSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.HHS?.value?.map(p => {\r\n\t\thhsSelections.push({ label: p, value: hhsOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\t//Add code to be able to filter list of facilities to a chosen HHS\r\n\tlet selectedHHSIds = [];\r\n\tif (hhsSelections.length > 0) {\r\n\t\tselectedHHSIds = hhsSelections.map(a =>\r\n\t\t\ta.value);\r\n\t}\r\n\r\n\t//Facility \r\n\t//Facility Options\r\n\tconst facilityOptions: any[] = [];\r\n\tif (hhsSelections.length > 0) {\r\n\t\tdataForFilters?.level1.facilities.filter(a => selectedHHSIds.includes(a.hhsId)).map(p => {\r\n\t\t\tfacilityOptions.push({ label: p.name, value: p.facilityId });\r\n\t\t})\r\n\t} else {\r\n\t\tdataForFilters?.level1.facilities.map(p => {\r\n\t\t\tfacilityOptions.push({ label: p.name, value: p.facilityId });\r\n\t\t});\r\n\t}\r\n\r\n\t//Filtered facilities\r\n\tlet facilitySelections: any[] = [];\r\n\tstate.page.dashboard.filters?.Facility?.value?.map(p => {\r\n\t\tfacilitySelections.push({ label: p, value: facilityOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\t//Add code to be able to filter list of Mdts to a chosen Facilities\r\n\tlet selectedFacilityIds = [];\r\n\tif (facilitySelections.length > 0) {\r\n\t\tselectedFacilityIds = facilitySelections.map(a =>\r\n\t\t\ta.value);\r\n\t}\r\n\r\n\t//MDTs\r\n\t//Options\r\n\tconst mdtOptions: any[] = [];\r\n\tif (facilitySelections.length > 0) {\r\n\t\tdataForFilters?.level1.mdts.filter(a => selectedFacilityIds.includes(a.facilityId)).map(p => {\r\n\t\t\tmdtOptions.push({ label: p.nameAndFacility, value: p.mdtNameId });\r\n\t\t})\r\n\t} else {\r\n\t\tdataForFilters?.level1.mdts.map(p => {\r\n\t\t\tmdtOptions.push({ label: p.nameAndFacility, value: p.mdtNameId });\r\n\t\t})\r\n\t}\r\n\r\n\t//Filtered MDTs\r\n\tlet mdtSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.Mdt?.value?.map(p => {\r\n\t\tmdtSelections.push({ label: p, value: mdtOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\t//let { path } = state.page.dashboard.chartData.reviewsByPeriod;\r\n\t//let parts = FilterContext.fromPath(path).parts;\r\n\r\n\t//Months\r\n\t//Options\r\n\tconst monthOptions: any[] = [];\r\n\tdataForFilters?.level1.month.map(p => {\r\n\t\tmonthOptions.push({ label: p.name, value: p.id });\r\n\t})\r\n\r\n\t//Filtered MDT months\r\n\tlet mdtMonthSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.MdtMonth?.value?.map(p => {\r\n\t\tmdtMonthSelections.push({\r\n\t\t\tlabel: p,\r\n\t\t\tvalue: monthOptions.find(a => a.label == p)?.value\r\n\t\t});\r\n\t})\r\n\r\n\t//Filtered diagnosis months\r\n\tlet diagMonthSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.DiagnosisMonth?.value?.map(p => {\r\n\t\tdiagMonthSelections.push({ label: p, value: monthOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\t//Years\r\n\t//MDT Year options\r\n\tconst mdtYearOptions: any[] = [];\r\n\tdataForFilters?.level1.year.map(p => {\r\n\t\tif (p.id >= 2010) {\r\n\t\t\tmdtYearOptions.push({ label: p.name, value: p.id });\r\n\t\t}\r\n\t})\r\n\r\n\t//Diagnosis year options\r\n\tconst diagYearOptions: any[] = [];\r\n\tdataForFilters?.level1.year.map(p => {\r\n\t\tdiagYearOptions.push({ label: p.name, value: p.id });\r\n\t})\r\n\r\n\t//Filtered year selections\r\n\tlet mdtYearSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.MdtYear?.value?.map(p => {\r\n\t\tmdtYearSelections.push({\r\n\t\t\tlabel: p,\r\n\t\t\tvalue: mdtYearOptions.find(a => a.label == p)?.value\r\n\t\t});\r\n\t})\r\n\r\n\t//Filtered diagnosis selections\r\n\tlet diagYearSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.DiagnosisYear?.value?.map(p => {\r\n\t\tdiagYearSelections.push({ label: p, value: diagYearOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\t//State for side by side button \r\n\tconst [viewBy, setViewBy] = React.useState(diagYearSelections.length > 0 ? \"Diagnosis Year\" : \"MDT Year\");\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t\r\n\t\t\t\tHHS\r\n\t\t\t\t {\r\n\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\tremoveFilter(Lung.DashboardFilterKeys.HHS.key);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\taddFilter(Lung.DashboardFilterKeys.HHS.key, filterValues);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t}),\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t\r\n\r\n\r\n\t\t\t\r\n\t\t\t\tFacility\r\n\t\t\t\t {\r\n\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\tremoveFilter(Lung.DashboardFilterKeys.Facility.key);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\taddFilter(Lung.DashboardFilterKeys.Facility.key, filterValues);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t}),\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t\r\n\r\n\r\n\t\t\t\r\n\t\t\t\tMDT\r\n\t\t\t\t {\r\n\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\tremoveFilter(Lung.DashboardFilterKeys.Mdt.key);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\taddFilter(Lung.DashboardFilterKeys.Mdt.key, filterValues);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t}),\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t\r\n\r\n\t\t\t\r\n\t\t\t\tView By\r\n\t\t\t\t {\r\n\t\t\t\t\t\tsetViewBy(p)\r\n\t\t\t\t\t}}\r\n\r\n\t\t\t\t/>\r\n\t\t\t\r\n\r\n\t\t\t{(viewBy == \"MDT Year\" ?\r\n\t\t\t\t<>\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tMDT Year\r\n\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\t\t\tremoveFilter(Lung.DashboardFilterKeys.MdtYear.key);\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\taddFilter(Lung.DashboardFilterKeys.MdtYear.key, filterValues);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tMDT Month\r\n\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\t\t\tremoveFilter(Lung.DashboardFilterKeys.MdtMonth.key);\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\taddFilter(Lung.DashboardFilterKeys.MdtMonth.key, filterValues);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t:\r\n\t\t\t\t<>\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tDiagnosis Year\r\n\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\t\t\tremoveFilter(Lung.DashboardFilterKeys.DiagnosisYear.key);\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\taddFilter(Lung.DashboardFilterKeys.DiagnosisYear.key, filterValues);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tDiagnosis Month\r\n\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\t\t\tremoveFilter(Lung.DashboardFilterKeys.DiagnosisMonth.key);\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\taddFilter(Lung.DashboardFilterKeys.DiagnosisMonth.key, filterValues);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\r\n\r\n\t\t\t\t\r\n\t\t\t)}\r\n\r\n\r\n\t\t\t{/* \r\n\t\t\t\t{(Object.keys(state.page.dashboard.filters).length !== 0 ?\r\n\t\t\t\t\t localDispatch({ type: LungIndicatorAction.UserClickedDownloadIndicator, payload: 99 })}\r\n\t\t\t\t\t>Download Patient List\r\n\t\t\t\t\t :\r\n\r\n\t\t\t\t\t
Make a filter selection in order to download patient list
)}\r\n\t\t\t
\r\n\r\n\t\t\t */}\r\n\t\t\r\n\t)\r\n}\r\n\r\n","import { LungDashboard } from \"./dashboard\";\r\nimport { LungFilters } from \"./filters\";\r\nimport * as React from \"react\";\r\n\r\nexport { LungFilters }\r\n\r\n\r\nexport class LungDashboardHome extends React.Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n width: 0,\r\n height: 0\r\n }; \r\n\r\n }\r\n\r\n private updateDimensions = () => {\r\n this.setState({ width: window.innerWidth, height: window.innerHeight });\r\n };\r\n \r\n public componentWillUnmount() {\r\n window.removeEventListener('resize', this.updateDimensions);\r\n }\r\n \r\n public componentDidMount() {\r\n window.addEventListener('resize', this.updateDimensions);\r\n }\r\n\r\n render = () => {\r\n return (\r\n <>\r\n \r\n \r\n )\r\n\r\n }\r\n}\r\n","import { \r\n IPlotData as ICorePlotData, createPlotData as createCorePlotData, \r\n ISourceData as ICoreSourceData, createData as createCoreData, addDataFactory, addSet \r\n} from \"models/core\";\r\nimport { IDashboardViewModel } from \"./core\";\r\n\r\n/**\r\n * Plot data source\r\n */\r\nexport type IPlotData = ICorePlotData;\r\n\r\n/**\r\n * Source data\r\n */\r\nexport type ISourceData = ICoreSourceData;\r\n\r\n/**\r\n * Raw data source. Used to shape and accumulate.\r\n */\r\nexport interface ISourceBuilder {\r\n uniques: Set;\r\n values: ISourceData;\r\n}\r\n\r\n/**\r\n * Create a new plot data object.\r\n */\r\nexport const createPlotData = createCorePlotData;\r\n\r\n/**\r\n * Create a new source data object\r\n */\r\nexport function createBuilder(): ISourceBuilder {\r\n return {\r\n uniques: new Set(),\r\n values: createCoreData(),\r\n };\r\n}\r\n\r\nconst add = addDataFactory((vm: IDashboardViewModel) => vm.morphology.name);\r\n\r\n/**\r\n * Returns the number added to the hierarchy on add, 0 otherwise. \r\n * @param vm \r\n * @param into \r\n */\r\nexport function addData(vm: IDashboardViewModel, into: ISourceBuilder): number {\r\n //Only count once per diagnosis per morphology.\r\n if (addSet(vm.morphology.id + \"_\" + vm.diagnosisId, into.uniques)) {\r\n add(vm, into.values);\r\n return 1;\r\n }\r\n\r\n return 0;\r\n}\r\n\r\n/**\r\n * Compare sourceData[a] to sourceData[b] and return -1 when a is less than b, 0 when equal, 1 when a is greater than 0\r\n * @param a \r\n * @param b \r\n */\r\nexport const sort = (s: ISourceData, a: string, b: string): number => {\r\n return ((s[a] < s[b]) ? -1 : ((s[a] > s[b]) ? 1 : 0));\r\n};\r\n\r\n/** \r\n * Complete adding data and clear any temporary resources \r\n */\r\nexport function finish(builder: ISourceBuilder): ISourceData {\r\n try {\r\n return builder.values;\r\n } finally {\r\n builder.uniques.clear();\r\n builder.uniques = null;\r\n builder.values = null;\r\n builder = null;\r\n }\r\n}","\r\nimport {\r\n\tAddDataSharedFunc, DashboardSharedFilterFunc, DashboardSharedFilterKey,\r\n\tIDashboardSharedChartData, IDashboardSharedDimensionsViewModel,\r\n} from \"models/common\";\r\nimport { IFilters, IFilterKeys, DimensionsById, ISourceData, IDimFacility, IDimension, IDimMDT } from \"models/core\";\r\nimport { IDashboardViewModel } from \"./viewModel\";\r\n\r\n//Plots for this dashboard\r\nimport * as PrimarySite from \"./primarySiteHierarchy\";\r\nimport * as Morphology from \"./morphology\";\r\nimport * as Remoteness from \"../../../common/plotdata/remoteness\";\r\nimport * as HHSOfResidence from \"../../../common/plotdata/hhsOfResidence\";\r\n\r\nexport type { IDashboardViewModel } from \"./viewModel\";\r\n\r\nexport type IDashboardSource = {\r\n\toverall: IDashboardViewModel[];\r\n\thypopharynx: IDashboardViewModel[];\r\n\tnasalCavityAndParanasalSinuses: IDashboardViewModel[];\r\n\tmajorSalivaryGlands: IDashboardViewModel[];\r\n\toropharynx: IDashboardViewModel[];\r\n\totherPharynx: IDashboardViewModel[];\r\n\toralCavity: IDashboardViewModel[];\r\n\tlarynx: IDashboardViewModel[];\r\n\tnasopharynx: IDashboardViewModel[];\r\n}\r\n\r\nexport interface IDashboardDimensionsViewModel extends IDashboardSharedDimensionsViewModel {\r\n hhsResidenceGroups?: DimensionsById;\r\n dataQualityIndicators?: DimensionsById;\r\n monthsArray?: Array;\r\n yearsArray?: Array;\r\n months?: { [monthId: number]: string };\r\n years?: { [yearId: number]: string };\r\n dqCompFacility?: { [facilityYearKey: string]: number };\r\n dqCompState?: { [facilityYearKey: string]: number };\r\n oneYearSurvivalMDT?: { [mdtDiagYearKey: string]: { \"MDT\": number, \"State\": number } };\r\n threeYearSurvivalMDT?: { [mdtDiagYearKey: string]: { \"MDT\": number, \"State\": number } };\r\n fiveYearSurvivalMDT?: { [mdtDiagYearKey: string]: { \"MDT\": number, \"State\": number } };\r\n tenYearSurvivalMDT?: { [mdtDiagYearKey: string]: { \"MDT\": number, \"State\": number } };\r\n kmSurvivalMDT?: {[mdtCancerKey: string]: { survivalTime: string, mdtKMSurvival: number, stateKMSurvival: number }};\r\n\r\n}\r\n\r\ninterface ILevel1ChartData {\r\n\ttotalDiagnoses: number;\r\n\ttotalDataQualityEligibleDiagnoses: number;\r\n\tfacilities: IDimFacility[];\r\n\thhses: IDimension[];\r\n\tmdts: IDimMDT[];\r\n\tmonth: IDimension[];\r\n\tyear: IDimension[];\r\n\r\n hadSurgery: { numerator: number, denominator: number, percentage: number };\r\n\tdiagnosisToSurgeryLT30Days: { numerator, denominator: number, percentage: number };\r\n\tlengthOfStay: { min: number, median: number, max: number; };\r\n\tmortality90Days: { numerator: number, denominator: number, percentage: number; };\r\n\ttwoYearSurvival: { numerator: number, denominator: number, percentage: number; };\r\n\thadIVST: { numerator: number, denominator: number, percentage: number };\r\n\tdiagnosisToIVSTLT45Days: { numerator: number, denominator: number, percentage: number; };\r\n\tdiagnosisToConcurrentCRTLT45Days: { numerator: number, denominator: number, percentage: number };\r\n\thadRT: { numerator: number, denominator: number, percentage: number };\r\n\tdiagnosisToRTLT45Days: { numerator: number, denominator: number, percentage: number };\r\n\t// Export\r\n\tfilteredReferralIdCsv: string;\r\n}\r\n\r\n// HACK: chop out the reference array from the shared interface \r\ntype RestrictedSharedChartData = Omit, \"hhses\">;\r\n\r\ninterface ILevel2ChartData extends RestrictedSharedChartData {\r\n\ttotalDiagnoses: number;\r\n\tprimarySite: PrimarySite.IHierarchyPlotData;\r\n\tmorphology: Morphology.IPlotData;\r\n\tremoteness: Remoteness.IPlotData;\r\n\thhsOfResidence: HHSOfResidence.IPlotData;\r\n}\r\n\r\nexport interface IChartData {\r\n\thypopharynx: {\r\n\t\tlevel1: ILevel1ChartData;\r\n\t\tlevel2: ILevel2ChartData;\r\n\t},\r\n\tnasopharynx: { \r\n\t\tlevel1: ILevel1ChartData;\r\n\t\tlevel2: ILevel2ChartData;\r\n\t}\r\n\tlarynx: { \r\n\t\tlevel1: ILevel1ChartData;\r\n\t\tlevel2: ILevel2ChartData;\r\n\t},\r\n\tmajorSalivaryGlands: { \r\n\t\tlevel1: ILevel1ChartData;\r\n\t\tlevel2: ILevel2ChartData;\r\n\t},\r\n\tnasalCavityAndParanasalSinuses: { \r\n\t\tlevel1: ILevel1ChartData;\r\n\t\tlevel2: ILevel2ChartData;\r\n\t},\r\n\toralCavity: { \r\n\t\tlevel1: ILevel1ChartData;\r\n\t\tlevel2: ILevel2ChartData;\r\n\t},\r\n\toropharynx: { \r\n\t\tlevel1: ILevel1ChartData;\r\n\t\tlevel2: ILevel2ChartData;\r\n\t},\r\n\toverall: { \r\n\t\tlevel1: ILevel1ChartData;\r\n\t\tlevel2: ILevel2ChartData;\r\n\t},\r\n\totherPharynx: { \r\n\t\tlevel1: ILevel1ChartData;\r\n\t\tlevel2: ILevel2ChartData;\r\n\t}\r\n\t\r\n\r\n}\r\n\r\nconst BreastFilterKeys: IFilterKeys = {\r\n\t//Filter keys for breast indicators\r\n\tDiagnosisYear: { key: \"DiagnosisYear\", label: \"Diagnosis Year\" },\r\n\tDiagnosisMonth: { key: \"DiagnosisMonth\", label: \"Diagnosis Month\" },\r\n\tMdtYear: { key: \"MdtYear\", label: \"MDT Year\" },\r\n\tMdtMonth: { key: \"MdtMonth\", label: \"MDT Month\" },\r\n\tInvasive: { key: \"Invasive\", label: \"Invasive / In-situ\" },\r\n\tPrimarySite: { key: \"PrimarySite\", label: \"Primary site\" },\r\n\tMorphology: { key: \"Morphology\", label: \"Morphology\" },\r\n\tRemoteness: { key: \"Remoteness\", label: \"Rurality\" },\r\n\tDefinitiveMastectomy: { key: \"DefinitiveMastectomy\", label: \"Definitive Mastectomy\" },\r\n\tHHSOfResidence: { key: \"HHSOfResidence\", label: \"HHS of residence\" }\r\n}\r\n\r\nexport const DashboardFilterKeys: IFilterKeys = {\r\n\t...DashboardSharedFilterKey,\r\n\t...BreastFilterKeys\r\n}\r\n\r\nexport type Filters = IFilters;\r\nexport type DashboardFilterFunc = DashboardSharedFilterFunc;\r\nexport type AddDataFunc = AddDataSharedFunc;","import { IChartData, IDashboardDimensionsViewModel, Filters } from \"../plotdata\";\r\n\r\n//Actions / requests\r\nexport enum WorkerRequestType { Ping, Fetch, ChartData }\r\nexport interface IWorkerFetchRequest { all: boolean, rawRefs: any, rawRows: string, minYear: number }\r\nexport interface IWorkerChartDataRequest { filtersToApply: Filters, minYear: number };\r\nexport interface IWorkerRequest {\r\n type: WorkerRequestType;\r\n id: string;\r\n payload?: any; //?\r\n}\r\n\r\n//Results\r\nexport enum WorkerResultType { Ping, Fetch, ChartData, InvalidType }\r\nexport interface IWorkerResult {\r\n type: WorkerResultType;\r\n id: string;\r\n payload?: any; //?\r\n}\r\nexport interface IWorkerPingResult {}\r\nexport interface IWorkerFetchResult { allData: boolean, references: IDashboardDimensionsViewModel, chartData: IChartData }\r\nexport type IWorkerChartDataResult = IChartData;","export default function Worker_fn() {\n return new Worker(__webpack_public_path__ + \"data.worker.d309668bb18bf17a6bcc.worker.js\");\n}\n","import { generateUUID } from \"helpers\";\r\nimport { getHeadAndNeckDashboard, getHeadAndNeckDashboardReferences } from \"api/dashboardApi\";\r\nimport { Filters } from \"../plotdata\";\r\nimport { IWorkerChartDataRequest, IWorkerChartDataResult, IWorkerFetchRequest, IWorkerFetchResult, IWorkerPingResult, IWorkerRequest, WorkerRequestType, WorkerResultType } from \"./models\";\r\nimport DataWorker from 'worker-loader!./data.worker';\r\nexport type { IWorkerChartDataResult, IWorkerFetchResult, IWorkerPingResult, IWorkerRequest, WorkerRequestType }\r\n\r\n//#region Worker\r\n\r\nlet worker: DataWorker = null;\r\nlet promises = {};\r\nlet data = {\r\n minYear: 0,\r\n}\r\n\r\n/**\r\n * Start the Worker\r\n */\r\nexport function start(minYear: number) {\r\n data.minYear = minYear;\r\n\r\n if (!window[\"Worker\"]) {\r\n console.log(\"WebWorker not supported\");\r\n return false;\r\n\r\n } else {\r\n console.log(\"WebWorker starting\");\r\n\r\n worker = worker || new DataWorker();\r\n\r\n /**\r\n * When the worker sends an error back to the main thread, resolve the associated promise.\r\n */\r\n worker.addEventListener(\"message\", (ev: MessageEvent) => {\r\n const { data: { id, type, payload } } = ev;\r\n\r\n //Any specific handling by message type\r\n switch (type as WorkerResultType) {\r\n // case WorkerResultType.Ping: {\r\n // case WorkerResultType.Fetch: {\r\n default: {\r\n //Default handler will just resolve\r\n promises[id]?.resolve(payload);\r\n break;\r\n }\r\n }\r\n\r\n promises[id] = undefined;\r\n });\r\n\r\n /**\r\n * When the worker sends an error back to the main thread, reject the associated promise.\r\n */\r\n worker.addEventListener(\"messageerror\", (ev: MessageEvent) => {\r\n const { data: { id, type, payload } } = ev;\r\n\r\n //Any specific handling by message type\r\n switch (type) {\r\n //case WorkerResultType.Ping: {\r\n //case WorkerResultType.Fetch: {\r\n default: {\r\n console.error(\"ERROR from worker\", payload);\r\n promises[id].reject(payload);\r\n break;\r\n }\r\n }\r\n\r\n promises[id] = undefined;\r\n });\r\n\r\n return true;\r\n }\r\n}\r\n\r\n/**\r\n * Post the message to the Worker\r\n * @param request \r\n */\r\nfunction send(request: IWorkerRequest) {\r\n worker.postMessage(request);\r\n}\r\n\r\n/**\r\n * Transform into a Promise and track it.\r\n * @param type \r\n * @param payload \r\n */\r\nfunction actionPromise(type: WorkerRequestType, payload: TIn): Promise {\r\n const id = generateUUID();\r\n promises[id] = {};\r\n promises[id].promise = new Promise((resolve, reject) => {\r\n send({ id, type, payload });\r\n\r\n promises[id].resolve = resolve;\r\n promises[id].reject = reject;\r\n });\r\n\r\n return promises[id].promise;\r\n}\r\n\r\nexport function ping(): Promise {\r\n return actionPromise(WorkerRequestType.Ping, null);\r\n}\r\n\r\n/**\r\n * Fetch the data from the server, then push it to the Worker for processing.\r\n * @param all \r\n */\r\nexport function fetch(all: boolean): Promise {\r\n //WebWorker cannot access sessionStorage so do the api call here and\r\n //send the data tp it.\r\n return Promise.all([\r\n getHeadAndNeckDashboard(all),\r\n getHeadAndNeckDashboardReferences(all),\r\n ])\r\n .then(results => {\r\n return actionPromise(WorkerRequestType.Fetch, {\r\n all,\r\n rawRows: results[0] as string,\r\n rawRefs: results[1] as any,\r\n minYear: data.minYear,\r\n });\r\n });\r\n\r\n}\r\n\r\n/**\r\n * Apply the filters in the Worker and return the ChartData\r\n * @param filtersToApply \r\n */\r\nexport function chartData(filtersToApply: Filters): Promise {\r\n return actionPromise(WorkerRequestType.ChartData, {\r\n filtersToApply,\r\n minYear: data.minYear,\r\n });\r\n}\r\n\r\n/** Terminate the worker */\r\nexport function stop() {\r\n worker && worker.terminate();\r\n worker = null;\r\n console.log(\"WebWorker terminated\");\r\n}\r\n\r\n//#endregion Worker\r\n","import { AddFilterBaseFunc, FilterContext, RemoveFilterBaseFunc } from \"../core\";\r\nimport { DashboardFilterKeys, Filters, IChartData, IDashboardDimensionsViewModel } from \"./overall/plotdata\";\r\n\r\nexport type { IChartData, IDashboardDimensionsViewModel, Filters } from \"./overall/plotdata\";\r\nexport { DashboardFilterKeys } from \"./overall/plotdata\";\r\nexport type AddFilterFunc = AddFilterBaseFunc;\r\nexport type RemoveFilterFunc = RemoveFilterBaseFunc;\r\n\r\nimport * as DashWorker from \"./overall/worker\";\r\nexport { DashWorker }\r\n\r\nexport interface IHeadAndNeckDashboard {\r\n\tallData: boolean;\r\n\treferences: IDashboardDimensionsViewModel;\r\n\tfilters: Filters;\r\n\tchartData: IChartData;\r\n\tselectedFacilities: Set;\r\n selectedHhses: Set;\r\n onlyDataQualityEligible: boolean;\r\n}\r\n\r\n\r\nexport const initState = (): IHeadAndNeckDashboard => {\r\n\treturn {\r\n\t\tallData: false,\r\n\t\treferences: {},\r\n\t\tchartData: null,\r\n\t\tfilters: {},\r\n\t\tselectedFacilities: new Set(),\r\n\t\tselectedHhses: new Set(),\r\n\t\tonlyDataQualityEligible: false,\r\n\t}\r\n};\r\n\r\n\r\nexport const loadHeadAndNeckDashboard = async (state: IHeadAndNeckDashboard): Promise => {\r\n\tDashWorker.start(2010);\r\n\ttry {\r\n\t\tawait DashWorker.ping()\r\n\t\tconsole.log(\"WORKER PING RESOLVED\");\r\n\t\treturn await fetchData(state, state.allData);\r\n\t} catch {\r\n\t\tconsole.error(\"WORKER PING FAILED\");\r\n\t}\r\n}\r\n\r\nexport const clearFilters = (state: IHeadAndNeckDashboard): IHeadAndNeckDashboard => {\r\n\tconst maybeSetDefaultFilter = (filterKey: string, dimensions: { name: string }[]): Set => {\r\n\t\tif (!dimensions || dimensions.length !== 1)\r\n\t\t\treturn (new Set());\r\n\r\n\t\tif (state.allData)\r\n\t\t\treturn (new Set());\r\n\r\n\t\tlet filterSet = new Set();\r\n\t\tfilterSet.add(dimensions[0].name);\r\n\r\n\t\tstate = addFilter(state)(filterKey, [dimensions[0].name])\r\n\t\treturn filterSet;\r\n\t}\r\n\r\n\tstate.filters = {};\r\n\tstate.selectedHhses = maybeSetDefaultFilter(DashboardFilterKeys.HHS.key, state.chartData.overall.level1.hhses);\r\n\tstate.selectedFacilities = maybeSetDefaultFilter(DashboardFilterKeys.Facility.key, state.chartData.overall.level1.facilities);\r\n\r\n\treturn { ... state };\r\n\r\n}\r\n\r\n\r\n\r\nexport const closeHeadAndNeckDashboard = () =>\r\n\tDashWorker.stop();\r\n\r\nconst fetchData = async (state: IHeadAndNeckDashboard, all: boolean): Promise => {\r\n\ttry {\r\n\t\tconst data = await DashWorker.fetch(all);\r\n\r\n\t\tconst maybeSetDefaultFilter = (filterKey: string, dimensions: { name: string }[]): Set => {\r\n\t\t\tif (!dimensions || dimensions.length !== 1)\r\n\t\t\t\treturn (new Set());\r\n\r\n\t\t\tif (all)\r\n\t\t\t\treturn (new Set());\r\n\r\n\t\t\tlet filterSet = new Set();\r\n\t\t\tfilterSet.add(dimensions[0].name);\r\n\r\n\t\t\tstate = addFilter(state)(filterKey, [dimensions[0].name])\r\n\t\t\treturn filterSet;\r\n\t\t}\r\n\r\n\t\tstate.selectedHhses = maybeSetDefaultFilter(DashboardFilterKeys.HHS.key, data.chartData.overall.level1.hhses);\r\n state.selectedFacilities = maybeSetDefaultFilter(DashboardFilterKeys.Facility.key, data.chartData.overall.level1.facilities);\r\n\t\tstate.allData = all;\r\n\t\tstate.references = data.references;\r\n\t\tstate.chartData = data.chartData;\r\n\t\t\r\n\t\treturn state;\r\n\t} catch {\r\n\t\tconsole.error(\"WORKER FETCHDATA FAILED\");\r\n\t\treturn state;\r\n\t}\r\n}\r\n\r\nexport const computeChartData = async (state: IHeadAndNeckDashboard): Promise => {\r\n\ttry {\r\n\t\tconst data = await DashWorker.chartData(state.filters);\r\n\t\tstate.chartData = data;\r\n\t\treturn {...state};\r\n\t} catch {\r\n\t\tconsole.error(\"WORKER COMPUTECHARTDATA FAILED\")\r\n\t\treturn state;\r\n\t}\r\n}\r\n\r\nexport const addFilter = (state: IHeadAndNeckDashboard) => (key: keyof typeof DashboardFilterKeys, value: string | string[], context?: FilterContext, labelOverride?: string): IHeadAndNeckDashboard => {\r\n\tconst filters: Filters = Object.assign({}, state.filters);\r\n\tconst values = (typeof value === \"string\")\r\n\t\t? [value]\r\n\t\t: value;\r\n\r\n\t//Replace the existing path entry if we are replacing a multi-value filter\r\n\t//to do so: traverse to the parent\r\n\tconst baseContext: FilterContext = context && ((context.values().length > 1) ? context.parent() : context) || new FilterContext();\r\n\tbaseContext.push(values);\r\n\r\n\tfilters[key] = ({ value: values, labelOverride, parts: baseContext.parts });\r\n\r\n\tstate.filters = filters;\r\n\r\n\treturn {...state};\r\n}\r\n\r\n\r\nexport const removeFilter = (state: IHeadAndNeckDashboard, key: keyof typeof DashboardFilterKeys, value?: string, labelOverride?: string): IHeadAndNeckDashboard => {\r\n\tconst filters: Filters = Object.assign({}, state.filters);\r\n\tconst valueToRemove: string = value || null;\r\n\tconst context = FilterContext.fromFilters(filters, key);\r\n\tconst values = context.values();\r\n\tconst newValue = (valueToRemove ? values.filter(p => p != valueToRemove): null);\r\n\r\n\tconst n = context.parent() || new FilterContext();\r\n\tif (newValue) {\r\n\t\tn.push(newValue);\r\n\t}\r\n\tfilters[key] = ({value: n.values(), labelOverride, parts: n.parts});\r\n\r\n\tif (n.parts.length === 0) {\r\n\t\tdelete filters[key];\r\n\t}\r\n\r\n\tstate.filters = filters;\r\n\treturn {...state};\r\n}","import * as React from \"react\"\r\nimport * as HAN from \"models/headAndNeck\";\r\nimport { AppContext } from \"AppContext\";\r\nimport { ActionTypes } from \"reducer/actions\";\r\nimport { Button, Paper, Table, TableBody, TableCell, TableContainer, TableHead, TableRow } from \"@mui/material\";\r\nimport ReportApi from \"api/reportApi\";\r\nimport * as fileHelper from \"helpers/fileHelper\";\r\nimport { FilterContext } from \"models/core/filter\";\r\nimport { HeadAndNeckIndicatorDefintionsUrl } from \"config/appUrlConfig\";\r\nimport { DashChip } from \"components/common/DashChips\";\r\nimport { Download, Downloading } from \"@mui/icons-material\";\r\nimport { Link } from \"react-scroll\";\r\nimport { getStateIndicatorReferences } from \"api/dashboardApi\";\r\nimport Loader from \"pages/shared/pageloader\";\r\n\r\nenum HANIndicatorAction {\r\n\tUserClickedDownloadIndicator,\r\n\tDownloadIndicatorSuccess,\r\n\tDownloadIndicatorFail\r\n}\r\n\r\ntype Action =\r\n\t{ type: HANIndicatorAction.UserClickedDownloadIndicator, payload: number }\r\n\t| { type: HANIndicatorAction.DownloadIndicatorSuccess }\r\n\t| { type: HANIndicatorAction.DownloadIndicatorFail }\r\n\r\n\r\ninterface State {\r\n\tindicator: number\r\n}\r\n\r\nconst initialState: State = {\r\n\tindicator: 0\r\n}\r\n\r\nconst reducer = (state: State, action: Action): State => {\r\n\tconst { type } = action;\r\n\r\n\tswitch (type) {\r\n\t\tcase HANIndicatorAction.UserClickedDownloadIndicator:\r\n\t\t\treturn { ...state, ...{ indicator: action.payload } };\r\n\r\n\t\tcase HANIndicatorAction.DownloadIndicatorSuccess:\r\n\t\tcase HANIndicatorAction.DownloadIndicatorFail:\r\n\t\t\treturn { ...state, ...{ indicator: 0 } };\r\n\r\n\t\tdefault:\r\n\t\t\treturn state;\r\n\t}\r\n}\r\n\r\nlet stateWideData: {\r\n\toverall?: {\r\n\t\ttitle?: string;\r\n\t\tpatients?: string;\r\n\t\tdiagnosisToSurgeryLT30Days?: string;\r\n\t\tlengthOfStay?: string;\r\n\t\tmortality90Days?: string;\r\n\t\ttwoYearSurvival?: string;\r\n\t\tdiagnosisToIVSTLT45Days?: string;\r\n\t\tdiagnosisToConcurrentCRTLT45Days?: string;\r\n\t\tdiagnosisToRTLT45Days?: string;\r\n\t\thadSurgery?: string;\r\n\t\thadIVST?: string;\r\n\t\thadRT?: string;\r\n\t},\r\n\r\n\toralCavity?: {\r\n\t\ttitle?: string;\r\n\t\tpatients?: string;\r\n\t\tdiagnosisToSurgeryLT30Days?: string;\r\n\t\tlengthOfStay?: string;\r\n\t\tmortality90Days?: string;\r\n\t\ttwoYearSurvival?: string;\r\n\t\tdiagnosisToIVSTLT45Days?: string;\r\n\t\tdiagnosisToConcurrentCRTLT45Days?: string;\r\n\t\tdiagnosisToRTLT45Days?: string;\r\n\t\thadSurgery?: string;\r\n\t\thadIVST?: string;\r\n\t\thadRT?: string;\r\n\t},\r\n\r\n\toropharynx?: {\r\n\t\ttitle?: string;\r\n\t\tpatients?: string;\r\n\t\tdiagnosisToSurgeryLT30Days?: string;\r\n\t\tlengthOfStay?: string;\r\n\t\tmortality90Days?: string;\r\n\t\ttwoYearSurvival?: string;\r\n\t\tdiagnosisToIVSTLT45Days?: string;\r\n\t\tdiagnosisToConcurrentCRTLT45Days?: string;\r\n\t\tdiagnosisToRTLT45Days?: string;\r\n\t\thadSurgery?: string;\r\n\t\thadIVST?: string;\r\n\t\thadRT?: string;\r\n\t},\r\n\r\n\tmajorSalivaryGlands?: {\r\n\t\ttitle?: string;\r\n\t\tpatients?: string;\r\n\t\tdiagnosisToSurgeryLT30Days?: string;\r\n\t\tlengthOfStay?: string;\r\n\t\tmortality90Days?: string;\r\n\t\ttwoYearSurvival?: string;\r\n\t\tdiagnosisToIVSTLT45Days?: string;\r\n\t\tdiagnosisToConcurrentCRTLT45Days?: string;\r\n\t\tdiagnosisToRTLT45Days?: string;\r\n\t\thadSurgery?: string;\r\n\t\thadIVST?: string;\r\n\t\thadRT?: string;\r\n\t},\r\n\r\n\tnasopharynx?: {\r\n\t\ttitle?: string;\r\n\t\tpatients?: string;\r\n\t\tdiagnosisToSurgeryLT30Days?: string;\r\n\t\tlengthOfStay?: string;\r\n\t\tmortality90Days?: string;\r\n\t\ttwoYearSurvival?: string;\r\n\t\tdiagnosisToIVSTLT45Days?: string;\r\n\t\tdiagnosisToConcurrentCRTLT45Days?: string;\r\n\t\tdiagnosisToRTLT45Days?: string;\r\n\t\thadSurgery?: string;\r\n\t\thadIVST?: string;\r\n\t\thadRT?: string;\r\n\t},\r\n\r\n\thypopharynx?: {\r\n\t\ttitle?: string;\r\n\t\tpatients?: string;\r\n\t\tdiagnosisToSurgeryLT30Days?: string;\r\n\t\tlengthOfStay?: string;\r\n\t\tmortality90Days?: string;\r\n\t\ttwoYearSurvival?: string;\r\n\t\tdiagnosisToIVSTLT45Days?: string;\r\n\t\tdiagnosisToConcurrentCRTLT45Days?: string;\r\n\t\tdiagnosisToRTLT45Days?: string;\r\n\t\thadSurgery?: string;\r\n\t\thadIVST?: string;\r\n\t\thadRT?: string;\r\n\t},\r\n\r\n\tnasalCavityAndParanasalSinuses?: {\r\n\t\ttitle?: string;\r\n\t\tpatients?: string;\r\n\t\tdiagnosisToSurgeryLT30Days?: string;\r\n\t\tlengthOfStay?: string;\r\n\t\tmortality90Days?: string;\r\n\t\ttwoYearSurvival?: string;\r\n\t\tdiagnosisToIVSTLT45Days?: string;\r\n\t\tdiagnosisToConcurrentCRTLT45Days?: string;\r\n\t\tdiagnosisToRTLT45Days?: string;\r\n\t\thadSurgery?: string;\r\n\t\thadIVST?: string;\r\n\t\thadRT?: string;\r\n\t},\r\n\r\n\tlarynx?: {\r\n\t\ttitle?: string;\r\n\t\tpatients?: string;\r\n\t\tdiagnosisToSurgeryLT30Days?: string;\r\n\t\tlengthOfStay?: string;\r\n\t\tmortality90Days?: string;\r\n\t\ttwoYearSurvival?: string;\r\n\t\tdiagnosisToIVSTLT45Days?: string;\r\n\t\tdiagnosisToConcurrentCRTLT45Days?: string;\r\n\t\tdiagnosisToRTLT45Days?: string;\r\n\t\thadSurgery?: string;\r\n\t\thadIVST?: string;\r\n\t\thadRT?: string;\r\n\t},\r\n\r\n\totherPharynx?: {\r\n\t\ttitle?: string;\r\n\t\tpatients?: string;\r\n\t\tdiagnosisToSurgeryLT30Days?: string;\r\n\t\tlengthOfStay?: string;\r\n\t\tmortality90Days?: string;\r\n\t\ttwoYearSurvival?: string;\r\n\t\tdiagnosisToIVSTLT45Days?: string;\r\n\t\tdiagnosisToConcurrentCRTLT45Days?: string;\r\n\t\tdiagnosisToRTLT45Days?: string;\r\n\t\thadSurgery?: string;\r\n\t\thadIVST?: string;\r\n\t\thadRT?: string;\r\n\t}\r\n\r\n} = {};\r\n\r\nexport function HeadAndNeckDashboard() {\r\n\tconst { state, dispatch } = React.useContext(AppContext);\r\n\tconst [localState, localDispatch] = React.useReducer(reducer, initialState)\r\n\r\n\tconst [showFilterChips, setFilterChips] = React.useState(true);\r\n\r\n\t//Set states to be able to switch between indicator views \r\n\tconst [viewBy, setViewBy] = React.useState(null);\r\n\tconst [daysFromDiagToSurgInd, setDaysFromDiagToSurgInd] = React.useState(0);\r\n\tconst [inHospitalMortalityInd, setInHospitalMortalityInd] = React.useState(0);\r\n\tconst [thirtyDayMortalityInd, setThirtyDayMortalityInd] = React.useState(0);\r\n\tconst [ninetyDayMortalityInd, setNinetyDayMortalityInd] = React.useState(0);\r\n\tconst [oneYearSurvivalInd, setOneYearSurvivalInd] = React.useState(0);\r\n\tconst [twoYearSurvivalInd, setTwoYearSurvivalInd] = React.useState(0);\r\n\tconst [stage3AdjuvantTxInd, setStage3AdjuvantTxInd] = React.useState(0);\r\n\tconst [neoAdjuvantXRTInd, setNeoAdjuvantXRTInd] = React.useState(0);\r\n\r\n\tconst addFilter: HAN.AddFilterFunc = async (key: keyof typeof HAN.DashboardFilterKeys, value: string | string[], context?: FilterContext, labelOverride?: string) => {\r\n\t\tconst filteredDashboard = await HAN.computeChartData(HAN.addFilter(state.page.dashboard as HAN.IHeadAndNeckDashboard)(key, value, context, labelOverride)); // state = what the other filter function returns \r\n\t\tdispatch({ type: ActionTypes.UserClickedOnChart, payload: filteredDashboard });\r\n\t}\r\n\r\n\tconst removeFilter: HAN.RemoveFilterFunc = async (key: keyof typeof HAN.DashboardFilterKeys, value?: string) => {\r\n\r\n\t\tconst filteredDashboard = await HAN.computeChartData(HAN.removeFilter(state.page.dashboard as HAN.IHeadAndNeckDashboard, key, value));\r\n\t\tdispatch({ type: ActionTypes.UserClickedOnChart, payload: filteredDashboard });\r\n\t}\r\n\r\n\tReact.useEffect(() => {\r\n\t\tdispatch({ type: ActionTypes.UserWantsToLoadMdtDashboard });\r\n\t\tconst fetchStateReferenceData = async () => {\r\n\t\t\tstateWideData.overall = await getStateIndicatorReferences(\"head and neck - overall\");\r\n\t\t\tstateWideData.oralCavity = await getStateIndicatorReferences(\"head and neck - oral cavity\");\r\n\t\t\tstateWideData.oropharynx = await getStateIndicatorReferences(\"head and neck - oropharynx\");\r\n\t\t\tstateWideData.majorSalivaryGlands = await getStateIndicatorReferences(\"head and neck - major salivary glands\");\r\n\t\t\tstateWideData.nasopharynx = await getStateIndicatorReferences(\"head and neck - nasopharynx\");\r\n\t\t\tstateWideData.hypopharynx = await getStateIndicatorReferences(\"head and neck - hypopharynx\");\r\n\t\t\tstateWideData.nasalCavityAndParanasalSinuses = await getStateIndicatorReferences(\"head and neck - nasal cavity and paranasal sinuses\");\r\n\t\t\tstateWideData.larynx = await getStateIndicatorReferences(\"head and neck - larynx\");\r\n\t\t\tstateWideData.otherPharynx = await getStateIndicatorReferences(\"head and neck - other pharynx\");\r\n\t\t}\r\n\r\n\t\tconst loadDashboard = async () => {\r\n\t\t\tconst value = await HAN.loadHeadAndNeckDashboard(state.page.dashboard as HAN.IHeadAndNeckDashboard);\r\n\t\t\tdispatch({ type: ActionTypes.UserLoadedMdtDashboard, payload: value });\r\n\t\t}\r\n\r\n\t\tPromise.all([fetchStateReferenceData(), loadDashboard()]);\r\n\t\treturn () => {\r\n\t\t\tHAN.closeHeadAndNeckDashboard();\r\n\t\t}\r\n\t}, []);\r\n\r\n\tReact.useEffect(() => {\r\n\t\tif (localState.indicator == 0)\r\n\t\t\treturn;\r\n\r\n\t\tlet ids = hanData['overall'].level1.filteredReferralIdCsv;\r\n\t\tlet alldata = false;\r\n\r\n\r\n\t\tconst getHeadAndNeckIndicatorPatientList = async () => {\r\n\t\t\ttry {\r\n\t\t\t\tconst data = await ReportApi.getHeadAndNeckIndicatorPatientList(ids, alldata, localState.indicator);\r\n\t\t\t\tif (data.errorMessage) {\r\n\t\t\t\t\tconsole.error(data.errorMessage);\r\n\t\t\t\t\tlocalDispatch({ type: HANIndicatorAction.DownloadIndicatorFail })\r\n\t\t\t\t}\r\n\t\t\t\tlocalDispatch({ type: HANIndicatorAction.DownloadIndicatorSuccess })\r\n\t\t\t\treturn fileHelper.showFile(data.bytes, data.filename, fileHelper.fileTypeToMimeType(data.filetype), \"exportPatientsElem\")\r\n\t\t\t} catch {\r\n\t\t\t\tlocalDispatch({ type: HANIndicatorAction.DownloadIndicatorFail })\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tgetHeadAndNeckIndicatorPatientList();\r\n\r\n\r\n\t}, [localState.indicator]);\r\n\r\n\tif (state.page.loading || !state.page.dashboard.chartData)\r\n\t\treturn \r\n\r\n\t//Create function to show/hide filter chips\r\n\tconst toggleChips = () => {\r\n\t\tif (showFilterChips) {\r\n\t\t\tsetFilterChips(false);\r\n\t\t} else {\r\n\t\t\tsetFilterChips(true);\r\n\t\t}\r\n\t};\r\n\r\n\tlet activeFiltersArray = [];\r\n\tlet filterArray = [];\r\n\tlet chips = [];\r\n\r\n\tfor (const key in state.page.dashboard.filters) {\r\n\t\tif (Object.prototype.hasOwnProperty.call(state.page.dashboard.filters, key)) {\r\n\t\t\tactiveFiltersArray.push({ \"key\": key, \"values\": state.page.dashboard.filters[key].value, \"parts\": state.page.dashboard.filters[key].parts });\r\n\t\t}\r\n\t}\r\n\r\n\tfor (const key in HAN.DashboardFilterKeys) {\r\n\t\tif (Object.prototype.hasOwnProperty.call(HAN.DashboardFilterKeys, key)) {\r\n\t\t\tfilterArray.push({ \"key\": key, \"label\": HAN.DashboardFilterKeys[key].label });\r\n\t\t}\r\n\t}\r\n\r\n\tactiveFiltersArray.forEach(a => {\r\n\t\ta.values.forEach(b => {\r\n\t\t\tchips.push( id.key == a.key).label}\r\n\t\t\t\tfilterValue={b}\r\n\t\t\t\tfilterId={a.key}\r\n\t\t\t\tfilterParent={(a.parts.length > 1 ? a.parts[0] : null)}\r\n\t\t\t/>\r\n\t\t\t)\r\n\t\t})\r\n\t})\r\n\r\n\tconst hanData = state.page.dashboard.chartData as HAN.IChartData;\r\n\r\n\r\n\tconst downloadBtn = (extractTypeId: number) => {\r\n\t\tconst { indicator } = localState;\r\n\r\n\t\tif (indicator == extractTypeId)\r\n\t\t\treturn \r\n\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\tlocalDispatch({ type: HANIndicatorAction.UserClickedDownloadIndicator, payload: extractTypeId })} />\r\n\t\t)\r\n\t}\r\n\r\n\t//Create function to title case the subtypes \r\n\tfunction convertToTitleCase(str) {\r\n\t\tif (!str) {\r\n\t\t\treturn \"\";\r\n\t\t}\r\n\t\tlet strsplit = str.split(/(?=[A-Z])/);\r\n\t\tlet strjoin = strsplit.join(\" \");\r\n\t\treturn strjoin.toLowerCase().replace(/\\b\\w/g, s => s.toUpperCase());\r\n\t}\r\n\r\n\r\n\tconst ecog = {\r\n\t\tnumerator: 0,\r\n\t\tdenominator: 0,\r\n\t\tpercentage: 0\r\n\t}\r\n\r\n\tconst stage = {\r\n\t\tnumerator: 0,\r\n\t\tdenominator: 0,\r\n\t\tpercentage: 0\r\n\t}\r\n\r\n\t//Create a set of the subtypes to be able to loop through \r\n\tlet cancerTypes = [\r\n\t\t'overall',\r\n\t\t'oralCavity',\r\n\t\t'oropharynx',\r\n\t\t'majorSalivaryGlands',\r\n\t\t'nasopharynx',\r\n\t\t'hypopharynx',\r\n\t\t'nasalCavityAndParanasalSinuses',\r\n\t\t'larynx',\r\n\t\t'otherPharynx'\r\n\t]\r\n\r\n\tlet dashboard = [];\r\n\r\n\t//add shortcuts to the sections\r\n\tlet shortcuts =\r\n\t\t
\r\n\t\t\t\r\n\r\n\t\t\t\t
\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tOverall\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tOral Cavity\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tOropharynx\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tMajor Salivary Glands\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tNasopharynx\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tHypopharynx\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tNasal Cavity and Paranasal Sinuses\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tLarynx\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tOther Pharynx\r\n\t\t\t\t\t\r\n\t\t\t\t
\r\n\r\n\t\t\t
\r\n\r\n\r\n\t\t\t{(showFilterChips ?
\r\n\t\t\t\t{chips}\r\n\t\t\t
: null)}\r\n\t\t
\r\n\r\n\tdashboard.push(shortcuts);\r\n\r\n\r\n\tcancerTypes.forEach((subType, i) => {\r\n\r\n\r\n\t\tif (hanData[subType] && hanData[subType].level1.totalDiagnoses > 0) {\r\n\r\n\t\t\tecog.numerator = hanData[subType].level1.totalDiagnoses - (hanData[subType].level2.ecogGroup.values[hanData[subType].level2.ecogGroup.labels.indexOf(\"Unk\")] || 0);\r\n\t\t\tecog.denominator = hanData[subType].level1.totalDiagnoses\r\n\t\t\tecog.percentage = ecog.numerator / ecog.denominator * 100\r\n\r\n\t\t\tstage.numerator = hanData[subType].level1.totalDiagnoses - (hanData[subType].level2.tnmStage.values[hanData[subType].level2.tnmStage.labels.indexOf(\"Unk\")] || 0);\r\n\t\t\tstage.denominator = hanData[subType].level1.totalDiagnoses;\r\n\t\t\tstage.percentage = stage.numerator / stage.denominator * 100\r\n\t\t} else {\r\n\t\t\tecog.numerator = 0\r\n\t\t\tecog.denominator = 0\r\n\t\t\tecog.percentage = 0\r\n\r\n\t\t\tstage.numerator = 0\r\n\t\t\tstage.denominator = 0\r\n\t\t\tstage.percentage = 0\r\n\t\t}\r\n\r\n\t\tlet itdashboard = <>\r\n\r\n\t\titdashboard =
\r\n\t\t\t{/*
\r\n\r\n\r\n\t\t\t{(showFilterChips ?
\r\n\t\t\t\t{chips}\r\n\t\t\t
: null)}\r\n\t\t
*/}\r\n\r\n\r\n\r\n\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t\t\t\r\n\t\t\t\t
\r\n\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t{convertToTitleCase(subType)}\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tIndicator\r\n\t\t\t\t\t\t\t\tMy MDT(s)*\r\n\t\t\t\t\t\t\t\t{stateWideData[subType].title}^\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tHead and neck cancer diagnoses^\r\n\t\t\t\t\t\t\t\t{`${hanData[subType].level1.totalDiagnoses}`}\r\n\t\t\t\t\t\t\t\t{stateWideData[subType].patients}\r\n\t\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tPercentage of patients with ECOG\r\n\t\t\t\t\t\t\t\t{`${ecog.percentage.toFixed(2)}%`}
{`(${ecog.numerator}/${ecog.denominator})`}
\r\n\t\t\t\t\t\t\t\t-\r\n\t\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tPercentage of patients with Stage\r\n\t\t\t\t\t\t\t\t{`${stage.percentage.toFixed(2)}%`}
{`(${stage.numerator}/${stage.denominator})`}
\r\n\t\t\t\t\t\t\t\t-\r\n\t\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\tSurgical\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tReceived surgery\r\n\t\t\t\t\t\t\t\t{`${hanData[subType].level1.hadSurgery.percentage.toFixed(2)}%`}
{`(${hanData[subType].level1.hadSurgery.numerator}/${hanData[subType].level1.hadSurgery.denominator})`}
\r\n\t\t\t\t\t\t\t\t{stateWideData[subType].hadSurgery}\r\n\t\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tReceived surgery as first treatment within 30 days of diagnosis?\r\n\t\t\t\t\t\t\t\t{`${hanData[subType].level1.diagnosisToSurgeryLT30Days.percentage.toFixed(2)}%`}
{`(${hanData[subType].level1.diagnosisToSurgeryLT30Days.numerator}/${hanData[subType].level1.diagnosisToSurgeryLT30Days.denominator})`}
\r\n\t\t\t\t\t\t\t\t{stateWideData[subType].diagnosisToSurgeryLT30Days}\r\n\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tHospital length of stay\r\n\t\t\t\t\t\t\t\t{`${hanData[subType].level1.lengthOfStay.median}`}
{`(${hanData[subType].level1.lengthOfStay.min} - ${hanData[subType].level1.lengthOfStay.max})`}
\r\n\t\t\t\t\t\t\t\t{stateWideData[subType].lengthOfStay}\r\n\t\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t90-day mortality post surgery\r\n\t\t\t\t\t\t\t\t{`${hanData[subType].level1.mortality90Days.percentage.toFixed(2)}%`}
{`(${hanData[subType].level1.mortality90Days.numerator}/${hanData[subType].level1.mortality90Days.denominator})`}
\r\n\t\t\t\t\t\t\t\t{stateWideData[subType].mortality90Days}\r\n\t\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t2-year surgical survival\r\n\t\t\t\t\t\t\t\t{`${hanData[subType].level1.twoYearSurvival.percentage.toFixed(2)}%`}
{`(${hanData[subType].level1.twoYearSurvival.numerator}/${hanData[subType].level1.twoYearSurvival.denominator})`}
\r\n\t\t\t\t\t\t\t\t{stateWideData[subType].twoYearSurvival}\r\n\t\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\tSystemic Therapy\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tReceived IV systemic therapy\r\n\t\t\t\t\t\t\t\t{`${hanData[subType].level1.hadIVST.percentage.toFixed(2)}%`}
{`(${hanData[subType].level1.hadIVST.numerator}/${hanData[subType].level1.hadIVST.denominator})`}
\r\n\t\t\t\t\t\t\t\t{stateWideData[subType].hadIVST}\r\n\t\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tTime from diagnosis to first IV systemic therapy within 45 days\r\n\t\t\t\t\t\t\t\t{`${hanData[subType].level1.diagnosisToIVSTLT45Days.percentage.toFixed(2)}%`}
{`(${hanData[subType].level1.diagnosisToIVSTLT45Days.numerator}/${hanData[subType].level1.diagnosisToIVSTLT45Days.denominator})`}
\r\n\t\t\t\t\t\t\t\t{stateWideData[subType].diagnosisToIVSTLT45Days}\r\n\t\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tTime from diagnosis to first concurrent CRT within 45 days\r\n\t\t\t\t\t\t\t\t{`${hanData[subType].level1.diagnosisToConcurrentCRTLT45Days.percentage.toFixed(2)}%`}
{`(${hanData[subType].level1.diagnosisToConcurrentCRTLT45Days.numerator}/${hanData[subType].level1.diagnosisToConcurrentCRTLT45Days.denominator})`}
\r\n\t\t\t\t\t\t\t\t{stateWideData[subType].diagnosisToConcurrentCRTLT45Days}\r\n\t\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\tRadiation Therapy\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tReceived radiation therapy\r\n\t\t\t\t\t\t\t\t{`${hanData[subType].level1.hadRT.percentage.toFixed(2)}%`}
{`(${hanData[subType].level1.hadRT.numerator}/${hanData[subType].level1.hadRT.denominator})`}
\r\n\t\t\t\t\t\t\t\t{stateWideData[subType].hadRT}\r\n\t\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tTime from diagnosis to first radiation therapy within 45 days\r\n\t\t\t\t\t\t\t\t{`${hanData[subType].level1.diagnosisToRTLT45Days.percentage.toFixed(2)}%`}
{`(${hanData[subType].level1.diagnosisToRTLT45Days.numerator}/${hanData[subType].level1.diagnosisToRTLT45Days.denominator})`}
\r\n\t\t\t\t\t\t\t\t{stateWideData[subType].diagnosisToRTLT45Days}\r\n\t\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t
\r\n\t\t\t\t
\r\n\r\n\t\t\t\t
\r\n\t\t\t\t

*Data based on facility of MDT

\r\n\t\t\t\t
\r\n\r\n\t\t\t\t
\r\n\t\t\t\t\t

^The comparison data in the Qld report is based on a person's incidence case of the cancer. The MDT data is all diagnoses (with a diagnosis date) presented to MDT using the Qool application

\r\n\t\t\t\t
\r\n\r\n\t\t\t\t
\r\n\t\t\t\t\t

This report is based on the Queensland Head and Neck Cancer Quality Index 2015-2019.
Indicator definitions and glossary can be found here also

\r\n\t\t\t\t
\r\n\r\n\t\t\t
\r\n\t\t\t\r\n\r\n\t\t
\r\n\r\n\t\tdashboard.push(itdashboard);\r\n\r\n\t})\r\n\r\n\treturn (\r\n\t\t
{dashboard}
\r\n\t)\r\n\r\n\r\n} ","import * as React from \"react\"\r\nimport * as HAN from \"models/headAndNeck\";\r\nimport { AppContext } from \"AppContext\";\r\nimport { ActionTypes } from \"reducer/actions\";\r\nimport { Box, Button, Typography } from \"@mui/material\";\r\nimport { FilterContext } from \"models/core/filter\";\r\nimport Select from \"react-select\";\r\nimport { SideBySideButton } from \"components/common/SideBySideOptions\";\r\nimport { exportMdtPatients } from \"models/mdt/worker\";\r\nimport * as fileHelper from \"helpers/fileHelper\";\r\nimport Loader from \"pages/shared/filterloader\";\r\n\r\nexport function HeadAndNeckFilters() {\r\n\tconst { state, dispatch } = React.useContext(AppContext);\r\n\r\n\tconst addFilter: HAN.AddFilterFunc = async (key: keyof typeof HAN.DashboardFilterKeys, value: string | string[], context?: FilterContext, labelOverride?: string) => {\r\n\t\tconst filteredDashboard = await HAN.computeChartData(HAN.addFilter(state.page.dashboard as HAN.IHeadAndNeckDashboard)(key, value, context, labelOverride)); // state = what the other filter function returns \r\n\t\tdispatch({ type: ActionTypes.UserClickedOnChart, payload: filteredDashboard });\r\n\t}\r\n\r\n\tconst removeFilter: HAN.RemoveFilterFunc = async (key: keyof typeof HAN.DashboardFilterKeys) => {\r\n\r\n\t\tconst filteredDashboard = await HAN.computeChartData(HAN.removeFilter(state.page.dashboard as HAN.IHeadAndNeckDashboard, key));\r\n\t\tdispatch({ type: ActionTypes.UserClickedOnChart, payload: filteredDashboard });\r\n\t}\r\n\r\n\tif (state.page.loading)\r\n\t\treturn ;\r\n\r\n\tconst dataForFilters = state.page.dashboard.chartData as HAN.IChartData;\r\n\t//HHS \r\n\t//HHS Options\r\n\tconst hhsOptions: any[] = [];\r\n\tdataForFilters?.overall.level1.hhses.map(p => {\r\n\t\thhsOptions.push({ label: p.name, value: p.id });\r\n\t})\r\n\r\n\t//Filtered HHSes\r\n\tlet hhsSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.HHS?.value?.map(p => {\r\n\t\thhsSelections.push({ label: p, value: hhsOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\t//Add code to be able to filter list of facilities to a chosen HHS\r\n\tlet selectedHHSIds = [];\r\n\tif (hhsSelections.length > 0) {\r\n\t\tselectedHHSIds = hhsSelections.map(a =>\r\n\t\t\ta.value);\r\n\t}\r\n\r\n\t//Facility \r\n\t//Facility Options\r\n\tconst facilityOptions: any[] = [];\r\n\tif (hhsSelections.length > 0) {\r\n\t\tdataForFilters?.overall.level1.facilities.filter(a => selectedHHSIds.includes(a.hhsId)).map(p => {\r\n\t\t\tfacilityOptions.push({ label: p.name, value: p.facilityId });\r\n\t\t})\r\n\t} else {\r\n\t\tdataForFilters?.overall.level1.facilities.map(p => {\r\n\t\t\tfacilityOptions.push({ label: p.name, value: p.facilityId });\r\n\t\t});\r\n\t}\r\n\r\n\t//Filtered facilities\r\n\tlet facilitySelections: any[] = [];\r\n\tstate.page.dashboard.filters?.Facility?.value?.map(p => {\r\n\t\tfacilitySelections.push({ label: p, value: facilityOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\t//Add code to be able to filter list of Mdts to a chosen Facilities\r\n\tlet selectedFacilityIds = [];\r\n\tif (facilitySelections.length > 0) {\r\n\t\tselectedFacilityIds = facilitySelections.map(a =>\r\n\t\t\ta.value);\r\n\t}\r\n\r\n\t//MDTs\r\n\t//Options\r\n\tconst mdtOptions: any[] = [];\r\n\tif (facilitySelections.length > 0) {\r\n\t\tdataForFilters?.overall.level1.mdts.filter(a => selectedFacilityIds.includes(a.facilityId)).map(p => {\r\n\t\t\tmdtOptions.push({ label: p.nameAndFacility, value: p.mdtNameId });\r\n\t\t})\r\n\t} else {\r\n\t\tdataForFilters?.overall.level1.mdts.map(p => {\r\n\t\t\tmdtOptions.push({ label: p.nameAndFacility, value: p.mdtNameId });\r\n\t\t})\r\n\t}\r\n\r\n\t//Filtered MDTs\r\n\tlet mdtSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.Mdt?.value?.map(p => {\r\n\t\tmdtSelections.push({ label: p, value: mdtOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\t//let { path } = state.page.dashboard.chartData.reviewsByPeriod;\r\n\t//let parts = FilterContext.fromPath(path).parts;\r\n\r\n\t//Months\r\n\t//Options\r\n\tconst monthOptions: any[] = [];\r\n\tdataForFilters?.overall.level1.month.map(p => {\r\n\t\tmonthOptions.push({ label: p.name, value: p.id });\r\n\t})\r\n\r\n\t//Filtered MDT months\r\n\tlet mdtMonthSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.MdtMonth?.value?.map(p => {\r\n\t\tmdtMonthSelections.push({\r\n\t\t\tlabel: p,\r\n\t\t\tvalue: monthOptions.find(a => a.label == p)?.value\r\n\t\t});\r\n\t})\r\n\r\n\t//Filtered diagnosis months\r\n\tlet diagMonthSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.DiagnosisMonth?.value?.map(p => {\r\n\t\tdiagMonthSelections.push({ label: p, value: monthOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\t//Years\r\n\t//MDT Year options\r\n\tconst mdtYearOptions: any[] = [];\r\n\tdataForFilters?.overall.level1.year.map(p => {\r\n\t\tif (p.id >= 2010) {\r\n\t\t\tmdtYearOptions.push({ label: p.name, value: p.id });\r\n\t\t}\r\n\t})\r\n\r\n\t//Diagnosis year options\r\n\tconst diagYearOptions: any[] = [];\r\n\tdataForFilters?.overall.level1.year.map(p => {\r\n\t\tdiagYearOptions.push({ label: p.name, value: p.id });\r\n\t})\r\n\r\n\t//Filtered year selections\r\n\tlet mdtYearSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.MdtYear?.value?.map(p => {\r\n\t\tmdtYearSelections.push({\r\n\t\t\tlabel: p,\r\n\t\t\tvalue: mdtYearOptions.find(a => a.label == p)?.value\r\n\t\t});\r\n\t})\r\n\r\n\t//Filtered diagnosis selections\r\n\tlet diagYearSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.DiagnosisYear?.value?.map(p => {\r\n\t\tdiagYearSelections.push({ label: p, value: diagYearOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\t//State for side by side button \r\n\tconst [viewBy, setViewBy] = React.useState(diagYearSelections.length > 0 ? \"Diagnosis Year\" : \"MDT Year\");\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t\r\n\t\t\t\tHHS\r\n\t\t\t\t {\r\n\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\tremoveFilter(HAN.DashboardFilterKeys.HHS.key);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\taddFilter(HAN.DashboardFilterKeys.HHS.key, filterValues);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t}),\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t\r\n\r\n\r\n\t\t\t\r\n\t\t\t\tFacility\r\n\t\t\t\t {\r\n\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\tremoveFilter(HAN.DashboardFilterKeys.Facility.key);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\taddFilter(HAN.DashboardFilterKeys.Facility.key, filterValues);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t}),\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t\r\n\r\n\r\n\t\t\t\r\n\t\t\t\tMDT\r\n\t\t\t\t {\r\n\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\tremoveFilter(HAN.DashboardFilterKeys.Mdt.key);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\taddFilter(HAN.DashboardFilterKeys.Mdt.key, filterValues);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t}),\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t\r\n\r\n\t\t\t\r\n\t\t\t\tView By\r\n\t\t\t\t {\r\n\t\t\t\t\t\tsetViewBy(p)\r\n\t\t\t\t\t}}\r\n\r\n\t\t\t\t/>\r\n\t\t\t\r\n\r\n\t\t\t{(viewBy == \"MDT Year\" ?\r\n\t\t\t\t<>\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tMDT Year\r\n\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\t\t\tremoveFilter(HAN.DashboardFilterKeys.MdtYear.key);\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\taddFilter(HAN.DashboardFilterKeys.MdtYear.key, filterValues);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tMDT Month\r\n\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\t\t\tremoveFilter(HAN.DashboardFilterKeys.MdtMonth.key);\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\taddFilter(HAN.DashboardFilterKeys.MdtMonth.key, filterValues);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t:\r\n\t\t\t\t<>\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tDiagnosis Year\r\n\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\t\t\tremoveFilter(HAN.DashboardFilterKeys.DiagnosisYear.key);\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\taddFilter(HAN.DashboardFilterKeys.DiagnosisYear.key, filterValues);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tDiagnosis Month\r\n\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\t\t\tremoveFilter(HAN.DashboardFilterKeys.DiagnosisMonth.key);\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\taddFilter(HAN.DashboardFilterKeys.DiagnosisMonth.key, filterValues);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\r\n\r\n\t\t\t\t\r\n\t\t\t)}\r\n\r\n\t\t\r\n\t)\r\n}\r\n\r\n","import { HeadAndNeckDashboard } from \"./dashboard\";\r\nimport { HeadAndNeckFilters } from \"./filters\";\r\nimport * as React from \"react\";\r\n\r\nexport { HeadAndNeckFilters }\r\n\r\n\r\nexport class HeadAndNeckDashboardHome extends React.Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n width: 0,\r\n height: 0\r\n }; \r\n\r\n }\r\n\r\n private updateDimensions = () => {\r\n this.setState({ width: window.innerWidth, height: window.innerHeight });\r\n };\r\n \r\n public componentWillUnmount() {\r\n window.removeEventListener('resize', this.updateDimensions);\r\n }\r\n \r\n public componentDidMount() {\r\n window.addEventListener('resize', this.updateDimensions);\r\n }\r\n\r\n render = () => {\r\n return (\r\n <>\r\n \r\n \r\n )\r\n\r\n }\r\n}","import { \r\n IPlotData as ICorePlotData, createPlotData as createCorePlotData, \r\n ISourceData as ICoreSourceData, createData as createCoreData, addDataFactory, addSet \r\n} from \"models/core\";\r\nimport { IDashboardViewModel } from \"./core\";\r\n\r\n/**\r\n * Plot data source\r\n */\r\nexport type IPlotData = ICorePlotData;\r\n\r\n/**\r\n * Source data\r\n */\r\nexport type ISourceData = ICoreSourceData;\r\n\r\n/**\r\n * Raw data source. Used to shape and accumulate.\r\n */\r\nexport interface ISourceBuilder {\r\n uniques: Set;\r\n values: ISourceData;\r\n}\r\n\r\n/**\r\n * Create a new plot data object.\r\n */\r\nexport const createPlotData = createCorePlotData;\r\n\r\n/**\r\n * Create a new source data object\r\n */\r\nexport function createBuilder(): ISourceBuilder {\r\n return {\r\n uniques: new Set(),\r\n values: createCoreData(),\r\n };\r\n}\r\n\r\nconst add = addDataFactory((vm: IDashboardViewModel) => vm.morphology.name);\r\n\r\n/**\r\n * Returns the number added to the hierarchy on add, 0 otherwise. \r\n * @param vm \r\n * @param into \r\n */\r\nexport function addData(vm: IDashboardViewModel, into: ISourceBuilder): number {\r\n //Only count once per diagnosis per morphology.\r\n if (addSet(vm.morphology.id + \"_\" + vm.diagnosisId, into.uniques)) {\r\n add(vm, into.values);\r\n return 1;\r\n }\r\n\r\n return 0;\r\n}\r\n\r\n/**\r\n * Compare sourceData[a] to sourceData[b] and return -1 when a is less than b, 0 when equal, 1 when a is greater than 0\r\n * @param a \r\n * @param b \r\n */\r\nexport const sort = (s: ISourceData, a: string, b: string): number => {\r\n return ((s[a] < s[b]) ? -1 : ((s[a] > s[b]) ? 1 : 0));\r\n};\r\n\r\n/** \r\n * Complete adding data and clear any temporary resources \r\n */\r\nexport function finish(builder: ISourceBuilder): ISourceData {\r\n try {\r\n return builder.values;\r\n } finally {\r\n builder.uniques.clear();\r\n builder.uniques = null;\r\n builder.values = null;\r\n builder = null;\r\n }\r\n}","import { \r\n IPlotData as ICorePlotData, createPlotData as createCorePlotData, \r\n ISourceData as ICoreSourceData, createData as createCoreData, addDataFactory, addSet \r\n} from \"models/core\";\r\nimport { IDashboardViewModel } from \"./core\";\r\n\r\n/**\r\n * Plot data source\r\n */\r\nexport type IPlotData = ICorePlotData;\r\n\r\n/**\r\n * Source data\r\n */\r\nexport type ISourceData = ICoreSourceData;\r\n\r\n/**\r\n * Raw data source. Used to shape and accumulate.\r\n */\r\nexport interface ISourceBuilder {\r\n uniques: Set;\r\n values: ISourceData;\r\n}\r\n\r\n/**\r\n * Create a new plot data object.\r\n */\r\nexport const createPlotData = createCorePlotData;\r\n\r\n/**\r\n * Create a new source data object\r\n */\r\nexport function createBuilder(): ISourceBuilder {\r\n return {\r\n uniques: new Set(),\r\n values: createCoreData(),\r\n };\r\n}\r\n\r\nconst add = addDataFactory((vm: IDashboardViewModel) => vm.fertilityPreservationId.name);\r\n\r\n/**\r\n * Returns the number added to the hierarchy on add, 0 otherwise. \r\n * @param vm \r\n * @param into \r\n */\r\nexport function addData(vm: IDashboardViewModel, into: ISourceBuilder): number {\r\n //Only count once per diagnosis per morphology.\r\n if (addSet(vm.fertilityPreservationId.id + \"_\" + vm.diagnosisId, into.uniques)) {\r\n add(vm, into.values);\r\n return 1;\r\n }\r\n\r\n return 0;\r\n}\r\n\r\n/**\r\n * Compare sourceData[a] to sourceData[b] and return -1 when a is less than b, 0 when equal, 1 when a is greater than 0\r\n * @param a \r\n * @param b \r\n */\r\nexport const sort = (s: ISourceData, a: string, b: string): number => {\r\n return ((s[a] < s[b]) ? -1 : ((s[a] > s[b]) ? 1 : 0));\r\n};\r\n\r\n/** \r\n * Complete adding data and clear any temporary resources \r\n */\r\nexport function finish(builder: ISourceBuilder): ISourceData {\r\n try {\r\n return builder.values;\r\n } finally {\r\n builder.uniques.clear();\r\n builder.uniques = null;\r\n builder.values = null;\r\n builder = null;\r\n }\r\n}","import { \r\n IPlotData as ICorePlotData, createPlotData as createCorePlotData, \r\n ISourceData as ICoreSourceData, createData as createCoreData, addDataFactory, addSet \r\n} from \"models/core\";\r\nimport { IDashboardViewModel } from \"./core\";\r\n\r\n/**\r\n * Plot data source\r\n */\r\nexport type IPlotData = ICorePlotData;\r\n\r\n/**\r\n * Source data\r\n */\r\nexport type ISourceData = ICoreSourceData;\r\n\r\n/**\r\n * Raw data source. Used to shape and accumulate.\r\n */\r\nexport interface ISourceBuilder {\r\n uniques: Set;\r\n values: ISourceData;\r\n}\r\n\r\n/**\r\n * Create a new plot data object.\r\n */\r\nexport const createPlotData = createCorePlotData;\r\n\r\n/**\r\n * Create a new source data object\r\n */\r\nexport function createBuilder(): ISourceBuilder {\r\n return {\r\n uniques: new Set(),\r\n values: createCoreData(),\r\n };\r\n}\r\n\r\nconst add = addDataFactory((vm: IDashboardViewModel) => vm.diagnosisRecurrenceId.name);\r\n\r\n/**\r\n * Returns the number added to the hierarchy on add, 0 otherwise. \r\n * @param vm \r\n * @param into \r\n */\r\nexport function addData(vm: IDashboardViewModel, into: ISourceBuilder): number {\r\n //Only count once per diagnosis per morphology.\r\n if (addSet(vm.diagnosisRecurrenceId.id + \"_\" + vm.diagnosisId, into.uniques)) {\r\n add(vm, into.values);\r\n return 1;\r\n }\r\n\r\n return 0;\r\n}\r\n\r\n/**\r\n * Sort asc\r\n * @param a \r\n * @param b \r\n */\r\nexport const sort = (_: ISourceData, a: string, b: string): number => {\r\n //Alphabetically by key (name)\r\n return ((a < b) ? -1 : ((a < b) ? 1 : 0));\r\n};\r\n\r\n/** \r\n * Complete adding data and clear any temporary resources \r\n */\r\nexport function finish(builder: ISourceBuilder): ISourceData {\r\n try {\r\n return builder.values;\r\n } finally {\r\n builder.uniques.clear();\r\n builder.uniques = null;\r\n builder.values = null;\r\n builder = null;\r\n }\r\n}","import { \r\n addDataFactory,\r\n IPlotData as ICorePlotData, \r\n createPlotData as createCorePlotData, \r\n ISourceData as ICoreSourceData, \r\n createData as createCoreData,\r\n} from \"../../core\";\r\nimport { ageRanges } from \"./viewModel\";\r\nimport { IDashboardSharedViewModel, KeyedDimension } from \"../../common/plotdata/viewModel\"\r\n\r\nexport { ageRanges };\r\n\r\n/**\r\n * Sort asc\r\n * @param a \r\n * @param b \r\n */\r\nexport const sort = (_: ISourceData, a: string, b: string): number => {\r\n //Alphabetically by key (name)\r\n return ((a > b) ? -1 : ((a > b) ? 1 : 0));\r\n};\r\n\r\n/**\r\n * Plot data source\r\n */\r\nexport type IPlotData = ICorePlotData;\r\n\r\n/**\r\n * Raw data source. Used to shape and accumulate.\r\n */\r\nexport type ISourceData = ICoreSourceData;\r\n\r\n/**\r\n * Create a new plot data object.\r\n */\r\nexport const createPlotData = createCorePlotData;\r\n\r\n/**\r\n * Create a new source data object\r\n */\r\nexport const createData = createCoreData;\r\n\r\n\r\n\r\n/**\r\n * \r\n * @param age Convert raw age to enum\r\n */\r\nexport const toAgeRange = (age: number): KeyedDimension => {\r\n if (age === undefined || age === null || age === 999 || age < 0) {\r\n return ageRanges.unknown;\r\n }\r\n\r\n if (age > 14 && age < 19) return ageRanges.lt19;\r\n else if (age > 18 && age < 26) return ageRanges.lt26;\r\n else ageRanges.ltother;\r\n\r\n return ageRanges.unknown;\r\n};\r\n\r\n/**\r\n * Accumulate the vm value into the source data object.\r\n * \r\n * @param vm source view model\r\n * @param into data object to accumulate into\r\n */\r\nexport const addData = addDataFactory((vm: IDashboardSharedViewModel) => vm.ageRange.name);\r\n","import { \r\n addDataFactory,\r\n IPlotData as ICorePlotData, \r\n createPlotData as createCorePlotData, \r\n ISourceData as ICoreSourceData, \r\n createData as createCoreData,\r\n} from \"../../core\";\r\nimport { IDashboardSharedViewModel, KeyedDimension } from \"../../common/plotdata/viewModel\"\r\nimport { boolOptions, IDashboardViewModel } from \"./viewModel\";\r\n\r\nexport { boolOptions };\r\n\r\n/**\r\n * Sort asc\r\n * @param a \r\n * @param b \r\n */\r\nexport const sort = (_: ISourceData, a: string, b: string): number => {\r\n //Alphabetically by key (name)\r\n return ((a < b) ? -1 : ((a > b) ? 1 : 0));\r\n};\r\n\r\n/**\r\n * Plot data source\r\n */\r\nexport type IPlotData = ICorePlotData;\r\n\r\n/**\r\n * Raw data source. Used to shape and accumulate.\r\n */\r\nexport type ISourceData = ICoreSourceData;\r\n\r\n/**\r\n * Create a new plot data object.\r\n */\r\nexport const createPlotData = createCorePlotData;\r\n\r\n/**\r\n * Create a new source data object\r\n */\r\nexport const createData = createCoreData;\r\n\r\n\r\n\r\n/**\r\n * \r\n * @param age Convert raw age to enum\r\n */\r\nexport const toYesNo = (bool: number): KeyedDimension => {\r\n if (bool == 1) {\r\n return boolOptions.y;\r\n } else if (bool == 0) {\r\n return boolOptions.n;\r\n } else return boolOptions.unknown;\r\n};\r\n\r\n/**\r\n * Accumulate the vm value into the source data object.\r\n * \r\n * @param vm source view model\r\n * @param into data object to accumulate into\r\n */\r\nexport const addData = addDataFactory((vm: IDashboardViewModel) => vm.youthHasGpDetails.name);\r\n","import { \r\n addDataFactory,\r\n IPlotData as ICorePlotData, \r\n createPlotData as createCorePlotData, \r\n ISourceData as ICoreSourceData, \r\n createData as createCoreData,\r\n} from \"../../core\";\r\nimport { IDashboardSharedViewModel, KeyedDimension } from \"../../common/plotdata/viewModel\"\r\nimport { boolOptions, IDashboardViewModel } from \"./viewModel\";\r\n\r\nexport { boolOptions };\r\n\r\n/**\r\n * Sort asc\r\n * @param a \r\n * @param b \r\n */\r\nexport const sort = (_: ISourceData, a: string, b: string): number => {\r\n //Alphabetically by key (name)\r\n return ((a < b) ? -1 : ((a > b) ? 1 : 0));\r\n};\r\n\r\n/**\r\n * Plot data source\r\n */\r\nexport type IPlotData = ICorePlotData;\r\n\r\n/**\r\n * Raw data source. Used to shape and accumulate.\r\n */\r\nexport type ISourceData = ICoreSourceData;\r\n\r\n/**\r\n * Create a new plot data object.\r\n */\r\nexport const createPlotData = createCorePlotData;\r\n\r\n/**\r\n * Create a new source data object\r\n */\r\nexport const createData = createCoreData;\r\n\r\n\r\n\r\n/**\r\n * \r\n * @param age Convert raw age to enum\r\n */\r\nexport const toYesNo = (bool: number): KeyedDimension => {\r\n if (bool == 1) {\r\n return boolOptions.y;\r\n } else if (bool == 0) {\r\n return boolOptions.n;\r\n } else return boolOptions.unknown;\r\n};\r\n\r\n/**\r\n * Accumulate the vm value into the source data object.\r\n * \r\n * @param vm source view model\r\n * @param into data object to accumulate into\r\n */\r\nexport const addData = addDataFactory((vm: IDashboardViewModel) => vm.youthHadTreatment.name);\r\n","//import { IDimension } from \"models/dashboard/core\";\r\nimport { IDashboardSharedViewModel } from \"models/common\";\r\nimport { KeyedDimension } from \"models/common/plotdata/viewModel\";\r\nimport { IDimension, IStringDate } from \"models/core\";\r\n\r\n/**\r\n * Valid values for age range\r\n */\r\nexport const ageRanges = {\r\n lt19: { key: \"15-18\", name: \"15-18\" } as KeyedDimension,\r\n lt26: { key: \"19-25\", name: \"19-25\" } as KeyedDimension,\r\n ltother: { key: \"Other\", name: \"Other\" } as KeyedDimension,\r\n unknown: { key: \"Unk\", name: \"Unk\" } as KeyedDimension,\r\n}\r\n\r\n/**\r\n * Keys for Y/N fields\r\n */\r\nexport const boolOptions = {\r\n y: { key: \"Yes\", name: \"Yes\" } as KeyedDimension,\r\n n: { key: \"No\", name: \"No\" } as KeyedDimension,\r\n unknown: { key: \"Unk\", name: \"Unk\" } as KeyedDimension,\r\n}\r\n\r\nexport interface IDashboardViewModel extends IDashboardSharedViewModel {\r\n\tdiagnosisDate: IStringDate,\r\n\tprimarySite: IDimension,\r\n\treportingPrimarySite: IDimension,\r\n\tmorphology: IDimension,\r\n\tdataQualityEligible: boolean,\r\n\tyouthHadTreatment: KeyedDimension,\r\n fertilityPreservationId: IDimension,\r\n diagnosisRecurrenceId: IDimension, \r\n youthHasGpDetails: KeyedDimension,\r\n psychosocialCarePlanNum: number,\r\n receivedPsychosocialCareNum: number,\r\n hadFertilityDiscussionNum: number,\r\n referralToFertilitySpecialistNum: number,\r\n fertilityPreservationNum: number,\r\n reviewedAtTreatmentMDTNum: number,\r\n psychosocialSurvivorshipCarePlanNum: number,\r\n medicalTreatmentPlanToGPNum: number,\r\n enrolledInMedicalTrialNum: number,\r\n enrolledInOtherResearchNum: number,\r\n oneYearSurvivalNum: number, \r\n oneYearSurvivalDen: number,\r\n twoYearSurvivalNum: number, \r\n twoYearSurvivalDen: number,\r\n fiveYearSurvivalNum: number, \r\n fiveYearSurvivalDen: number\r\n\r\n}","\r\nimport {\r\n\tAddDataSharedFunc, DashboardSharedFilterFunc, DashboardSharedFilterKey,\r\n\tIDashboardSharedChartData, IDashboardSharedDimensionsViewModel,\r\n} from \"models/common\";\r\nimport { IFilters, IFilterKeys, DimensionsById, ISourceData, IDimFacility, IDimension, IDimMDT } from \"models/core\";\r\nimport { IDashboardViewModel } from \"./viewModel\";\r\n\r\n//Plots for this dashboard\r\nimport * as PrimarySite from \"./primarySiteHierarchy\";\r\nimport * as Morphology from \"./morphology\";\r\nimport * as Remoteness from \"../../common/plotdata/remoteness\";\r\nimport * as HHSOfResidence from \"../../common/plotdata/hhsOfResidence\";\r\nimport { FertilityPreservation, GPDetailsProvided, HadTreatment, Recurrence } from \".\";\r\n\r\nexport type { IDashboardViewModel } from \"./viewModel\";\r\n\r\nexport type IDashboardSource = IDashboardViewModel[];\r\n\r\nexport interface IYouthCancerIndicatorConstants {\r\n\ttotalYouthDiagnoses: number,\r\n\tupper95Percent: number,\r\n\tlower95Percent: number,\r\n\tupper98Percent: number,\r\n\tlower98Percent: number,\r\n\tstatePercent: number\r\n}\r\n\r\nexport interface IDashboardDimensionsViewModel extends IDashboardSharedDimensionsViewModel {\r\n\tdefMastectomyArray?: Array;\r\n};\r\n\r\ninterface ILevel1ChartData {\r\n\ttotalDiagnoses: number;\r\n\ttotalDataQualityEligibleDiagnoses: number;\r\n\tfacilities: IDimFacility[];\r\n\thhses: IDimension[];\r\n\tmdts: IDimMDT[];\r\n\tmonth: IDimension[];\r\n\tyear: IDimension[];\r\n\t// Export\r\n\tfilteredReferralIdCsv: string;\r\n}\r\n\r\n// HACK: chop out the reference array from the shared interface \r\ntype RestrictedSharedChartData = Omit, \"hhses\">;\r\n\r\ninterface ILevel2ChartData extends RestrictedSharedChartData {\r\n\ttotalDiagnoses: number;\r\n\tprimarySite: PrimarySite.IHierarchyPlotData;\r\n\tmorphology: Morphology.IPlotData;\r\n\tremoteness: Remoteness.IPlotData;\r\n\thhsOfResidence: HHSOfResidence.IPlotData;\r\n\tpsychosocialCarePlanNum: { numerator, denominator: number, percentage: number };\r\n receivedPsychosocialCareNum: { numerator, denominator: number, percentage: number };\r\n hadFertilityDiscussionNum: { numerator, denominator: number, percentage: number };\r\n referralToFertilitySpecialistNum: { numerator, denominator: number, percentage: number };\r\n fertilityPreservationNum: { numerator, denominator: number, percentage: number };\r\n reviewedAtTreatmentMDTNum: { numerator, denominator: number, percentage: number };\r\n psychosocialSurvivorshipCarePlanNum: { numerator, denominator: number, percentage: number };\r\n medicalTreatmentPlanToGPNum: { numerator, denominator: number, percentage: number };\r\n enrolledInMedicalTrialNum: { numerator, denominator: number, percentage: number };\r\n enrolledInOtherResearchNum: { numerator, denominator: number, percentage: number };\r\n\toneYearSurvival: { numerator, denominator: number, percentage: number };\r\n\ttwoYearSurvival: { numerator, denominator: number, percentage: number };\r\n\tfiveYearSurvival: { numerator, denominator: number, percentage: number };\r\n\tfertilityPreservation: FertilityPreservation.IPlotData;\r\n\tdiagnosisRecurrence: Recurrence.IPlotData;\r\n\thadTreatment: HadTreatment.IPlotData;\r\n\tgpDetailsProvided: GPDetailsProvided.IPlotData;\r\n\t\r\n\r\n}\r\n\r\nexport interface IChartData {\r\n\tlevel1: ILevel1ChartData;\r\n\tlevel2: ILevel2ChartData;\r\n}\r\n\r\nconst YouthCancerFilterKeys: IFilterKeys = {\r\n\t//Filter keys for youth indicators\r\n\tDiagnosisYear: { key: \"DiagnosisYear\", label: \"Diagnosis Year\" },\r\n\tDiagnosisMonth: { key: \"DiagnosisMonth\", label: \"Diagnosis Month\" },\r\n\tMdtYear: { key: \"MdtYear\", label: \"MDT Year\" },\r\n\tMdtMonth: { key: \"MdtMonth\", label: \"MDT Month\" },\r\n\tPrimarySite: { key: \"PrimarySite\", label: \"Primary site\" },\r\n\tMorphology: { key: \"Morphology\", label: \"Morphology\" },\r\n\tRemoteness: { key: \"Remoteness\", label: \"Rurality\" },\r\n\tHHSOfResidence: { key: \"HHSOfResidence\", label: \"HHS of residence\" },\r\n\tHadTreatment: { key: \"HadTreatment\", label: \"Had treatment\"},\r\n\tGPDetailsProvided: { key: \"GPDetailsProvided\", label: \"GP details provided\"},\r\n\tFertilityPreservation: { key: \"FertilityPreservation\", label: \"Fertility preservation\"},\r\n\tDiagnosisRecurrence: { key: \"DiagnosisRecurrence\", label: \"Cancer recurrence\"}\r\n}\r\n\r\nexport const DashboardFilterKeys: IFilterKeys = {\r\n\t...DashboardSharedFilterKey,\r\n\t...YouthCancerFilterKeys\r\n}\r\n\r\nexport type Filters = IFilters;\r\nexport type DashboardFilterFunc = DashboardSharedFilterFunc;\r\nexport type AddDataFunc = AddDataSharedFunc;","import { IChartData, IDashboardDimensionsViewModel, Filters } from \"../plotdata\";\r\n\r\n//Actions / requests\r\nexport enum WorkerRequestType { Ping, Fetch, ChartData }\r\nexport interface IWorkerFetchRequest { all: boolean, rawRefs: any, rawRows: string, minYear: number }\r\nexport interface IWorkerChartDataRequest { filtersToApply: Filters, minYear: number };\r\nexport interface IWorkerRequest {\r\n type: WorkerRequestType;\r\n id: string;\r\n payload?: any; //?\r\n}\r\n\r\n//Results\r\nexport enum WorkerResultType { Ping, Fetch, ChartData, InvalidType }\r\nexport interface IWorkerResult {\r\n type: WorkerResultType;\r\n id: string;\r\n payload?: any; //?\r\n}\r\nexport interface IWorkerPingResult {}\r\nexport interface IWorkerFetchResult { allData: boolean, references: IDashboardDimensionsViewModel, chartData: IChartData }\r\nexport type IWorkerChartDataResult = IChartData;","export default function Worker_fn() {\n return new Worker(__webpack_public_path__ + \"data.worker.0bc5af6165d1ac38101a.worker.js\");\n}\n","import { generateUUID } from \"helpers\";\r\nimport { getYouthCancerDashboard, getYouthCancerDashboardReferences } from \"api/dashboardApi\";\r\nimport { Filters } from \"../plotdata\";\r\nimport { IWorkerChartDataRequest, IWorkerChartDataResult, IWorkerFetchRequest, IWorkerFetchResult, IWorkerPingResult, IWorkerRequest, WorkerRequestType, WorkerResultType } from \"./models\";\r\nimport DataWorker from 'worker-loader!./data.worker';\r\nexport type { IWorkerChartDataResult, IWorkerFetchResult, IWorkerPingResult, IWorkerRequest, WorkerRequestType }\r\n\r\n//#region Worker\r\n\r\nlet worker: DataWorker = null;\r\nlet promises = {};\r\nlet data = {\r\n minYear: 0,\r\n}\r\n\r\n/**\r\n * Start the Worker\r\n */\r\nexport function start(minYear: number) {\r\n data.minYear = minYear;\r\n\r\n if (!window[\"Worker\"]) {\r\n console.log(\"WebWorker not supported\");\r\n return false;\r\n\r\n } else {\r\n console.log(\"WebWorker starting\");\r\n\r\n worker = worker || new DataWorker();\r\n\r\n /**\r\n * When the worker sends an error back to the main thread, resolve the associated promise.\r\n */\r\n worker.addEventListener(\"message\", (ev: MessageEvent) => {\r\n const { data: { id, type, payload } } = ev;\r\n\r\n //Any specific handling by message type\r\n switch (type as WorkerResultType) {\r\n // case WorkerResultType.Ping: {\r\n // case WorkerResultType.Fetch: {\r\n default: {\r\n //Default handler will just resolve\r\n promises[id]?.resolve(payload);\r\n break;\r\n }\r\n }\r\n\r\n promises[id] = undefined;\r\n });\r\n\r\n /**\r\n * When the worker sends an error back to the main thread, reject the associated promise.\r\n */\r\n worker.addEventListener(\"messageerror\", (ev: MessageEvent) => {\r\n const { data: { id, type, payload } } = ev;\r\n\r\n //Any specific handling by message type\r\n switch (type) {\r\n //case WorkerResultType.Ping: {\r\n //case WorkerResultType.Fetch: {\r\n default: {\r\n console.error(\"ERROR from worker\", payload);\r\n promises[id].reject(payload);\r\n break;\r\n }\r\n }\r\n\r\n promises[id] = undefined;\r\n });\r\n\r\n return true;\r\n }\r\n}\r\n\r\n/**\r\n * Post the message to the Worker\r\n * @param request \r\n */\r\nfunction send(request: IWorkerRequest) {\r\n worker.postMessage(request);\r\n}\r\n\r\n/**\r\n * Transform into a Promise and track it.\r\n * @param type \r\n * @param payload \r\n */\r\nfunction actionPromise(type: WorkerRequestType, payload: TIn): Promise {\r\n const id = generateUUID();\r\n promises[id] = {};\r\n promises[id].promise = new Promise((resolve, reject) => {\r\n send({ id, type, payload });\r\n\r\n promises[id].resolve = resolve;\r\n promises[id].reject = reject;\r\n });\r\n\r\n return promises[id].promise;\r\n}\r\n\r\nexport function ping(): Promise {\r\n return actionPromise(WorkerRequestType.Ping, null);\r\n}\r\n\r\n/**\r\n * Fetch the data from the server, then push it to the Worker for processing.\r\n * @param all \r\n */\r\nexport function fetch(all: boolean): Promise {\r\n //WebWorker cannot access sessionStorage so do the api call here and\r\n //send the data tp it.\r\n return Promise.all([\r\n getYouthCancerDashboard(all),\r\n getYouthCancerDashboardReferences(all),\r\n ])\r\n .then(results => {\r\n return actionPromise(WorkerRequestType.Fetch, {\r\n all,\r\n rawRows: results[0] as string,\r\n rawRefs: results[1] as any,\r\n minYear: data.minYear,\r\n });\r\n });\r\n\r\n}\r\n\r\n/**\r\n * Apply the filters in the Worker and return the ChartData\r\n * @param filtersToApply \r\n */\r\nexport function chartData(filtersToApply: Filters): Promise {\r\n return actionPromise(WorkerRequestType.ChartData, {\r\n filtersToApply,\r\n minYear: data.minYear,\r\n });\r\n}\r\n\r\n/** Terminate the worker */\r\nexport function stop() {\r\n worker && worker.terminate();\r\n worker = null;\r\n console.log(\"WebWorker terminated\");\r\n}\r\n\r\n//#endregion Worker\r\n","import { AddFilterBaseFunc, FilterContext, RemoveFilterBaseFunc } from \"../core\";\r\nimport { DashboardFilterKeys, Filters, IChartData, IDashboardDimensionsViewModel } from \"./plotdata\";\r\n\r\nexport type { IChartData, IDashboardDimensionsViewModel, Filters } from \"./plotdata\";\r\nexport { DashboardFilterKeys } from \"./plotdata\";\r\nexport type AddFilterFunc = AddFilterBaseFunc;\r\nexport type RemoveFilterFunc = RemoveFilterBaseFunc;\r\n\r\nimport * as DashWorker from \"./worker\";\r\nexport { DashWorker }\r\n\r\nexport interface IYouthCancerDashboard {\r\n\tallData: boolean;\r\n\treferences: IDashboardDimensionsViewModel;\r\n\tfilters: Filters;\r\n\tchartData: IChartData;\r\n\tselectedFacilities: Set;\r\n selectedHhses: Set;\r\n onlyDataQualityEligible: boolean;\r\n}\r\n\r\n\r\nexport const initState = (): IYouthCancerDashboard => {\r\n\treturn {\r\n\t\tallData: false,\r\n\t\treferences: {},\r\n\t\tchartData: null,\r\n\t\tfilters: {},\r\n\t\tselectedFacilities: new Set(),\r\n\t\tselectedHhses: new Set(),\r\n\t\tonlyDataQualityEligible: false,\r\n\t}\r\n};\r\n\r\n\r\nexport const loadYouthCancerDashboard = async (state: IYouthCancerDashboard): Promise => {\r\n\tDashWorker.start(2010);\r\n\ttry {\r\n\t\tawait DashWorker.ping()\r\n\t\tconsole.log(\"WORKER PING RESOLVED\");\r\n\t\treturn await fetchData(state, state.allData);\r\n\t} catch {\r\n\t\tconsole.error(\"WORKER PING FAILED\");\r\n\t}\r\n}\r\n\r\nexport const clearFilters = (state: IYouthCancerDashboard): IYouthCancerDashboard => {\r\n\tconst maybeSetDefaultFilter = (filterKey: string, dimensions: { name: string }[]): Set => {\r\n\t\tif (!dimensions || dimensions.length !== 1)\r\n\t\t\treturn (new Set());\r\n\r\n\t\tif (state.allData)\r\n\t\t\treturn (new Set());\r\n\r\n\t\tlet filterSet = new Set();\r\n\t\tfilterSet.add(dimensions[0].name);\r\n\r\n\t\tstate = addFilter(state)(filterKey, [dimensions[0].name])\r\n\t\treturn filterSet;\r\n\t}\r\n\r\n\tstate.filters = {};\r\n\tstate.selectedHhses = maybeSetDefaultFilter(DashboardFilterKeys.HHS.key, state.chartData.level1.hhses);\r\n\tstate.selectedFacilities = maybeSetDefaultFilter(DashboardFilterKeys.Facility.key, state.chartData.level1.facilities);\r\n\r\n\treturn { ... state };\r\n\r\n}\r\n\r\n\r\n\r\nexport const closeYouthCancerDashboard = () =>\r\n\tDashWorker.stop();\r\n\r\nconst fetchData = async (state: IYouthCancerDashboard, all: boolean): Promise => {\r\n\ttry {\r\n\t\tconst data = await DashWorker.fetch(all);\r\n\r\n\t\tconst maybeSetDefaultFilter = (filterKey: string, dimensions: { name: string }[]): Set => {\r\n\t\t\tif (!dimensions || dimensions.length !== 1)\r\n\t\t\t\treturn (new Set());\r\n\r\n\t\t\tif (all)\r\n\t\t\t\treturn (new Set());\r\n\r\n\t\t\tlet filterSet = new Set();\r\n\t\t\tfilterSet.add(dimensions[0].name);\r\n\r\n\t\t\tstate = addFilter(state)(filterKey, [dimensions[0].name])\r\n\t\t\treturn filterSet;\r\n\t\t}\r\n\r\n\t\tstate.selectedHhses = maybeSetDefaultFilter(DashboardFilterKeys.HHS.key, data.chartData.level1.hhses);\r\n state.selectedFacilities = maybeSetDefaultFilter(DashboardFilterKeys.Facility.key, data.chartData.level1.facilities);\r\n\t\tstate.allData = all;\r\n\t\tstate.references = data.references;\r\n\t\tstate.chartData = data.chartData;\r\n\t\t\r\n\t\treturn state;\r\n\t} catch {\r\n\t\tconsole.error(\"WORKER FETCHDATA FAILED\");\r\n\t\treturn state;\r\n\t}\r\n}\r\n\r\nexport const computeChartData = async (state: IYouthCancerDashboard): Promise => {\r\n\ttry {\r\n\t\tconst data = await DashWorker.chartData(state.filters);\r\n\t\tstate.chartData = data;\r\n\t\treturn {...state};\r\n\t} catch {\r\n\t\tconsole.error(\"WORKER COMPUTECHARTDATA FAILED\")\r\n\t\treturn state;\r\n\t}\r\n}\r\n\r\nexport const addFilter = (state: IYouthCancerDashboard) => (key: keyof typeof DashboardFilterKeys, value: string | string[], context?: FilterContext, labelOverride?: string): IYouthCancerDashboard => {\r\n\tconst filters: Filters = Object.assign({}, state.filters);\r\n\tconst values = (typeof value === \"string\")\r\n\t\t? [value]\r\n\t\t: value;\r\n\r\n\t//Replace the existing path entry if we are replacing a multi-value filter\r\n\t//to do so: traverse to the parent\r\n\tconst baseContext: FilterContext = context && ((context.values().length > 1) ? context.parent() : context) || new FilterContext();\r\n\tbaseContext.push(values);\r\n\r\n\tfilters[key] = ({ value: values, labelOverride, parts: baseContext.parts });\r\n\r\n\tstate.filters = filters;\r\n\r\n\treturn {...state};\r\n}\r\n\r\n\r\nexport const removeFilter = (state: IYouthCancerDashboard, key: keyof typeof DashboardFilterKeys, value?: string, labelOverride?: string): IYouthCancerDashboard => {\r\n\tconst filters: Filters = Object.assign({}, state.filters);\r\n\tconst valueToRemove: string = value || null;\r\n\tconst context = FilterContext.fromFilters(filters, key);\r\n\tconst values = context.values();\r\n\tconst newValue = (valueToRemove ? values.filter(p => p != valueToRemove): null);\r\n\r\n\tconst n = context.parent() || new FilterContext();\r\n\tif (newValue) {\r\n\t\tn.push(newValue);\r\n\t}\r\n\tfilters[key] = ({value: n.values(), labelOverride, parts: n.parts});\r\n\r\n\tif (n.parts.length === 0) {\r\n\t\tdelete filters[key];\r\n\t}\r\n\r\n\tstate.filters = filters;\r\n\treturn {...state};\r\n}","import React from \"react\";\r\n\r\nimport { AddFilterBaseFunc, IFilterKeys, IFilters, RemoveFilterBaseFunc } from \"models/core\";\r\nimport { DashboardFilterKeys } from \"models/youthCancer\";\r\nimport { PrimarySiteHierarchy } from \"models/youthCancer/plotdata\";\r\nimport { ChartOrientation, ChartType, QoolDashChart } from \"../core\";\r\nimport { addHierarchyFilterFactory } from \"helpers/filterHelper\";\r\nimport { HierarchyBreadcrumb } from \"components/common/HierarchyBreadcrumb\";\r\n\r\ninterface IProps {\r\n\tplotData: PrimarySiteHierarchy.IHierarchyPlotData;\r\n\tactiveFilters: IFilters;\r\n\taddFilterFn: AddFilterBaseFunc;\r\n removeFilterFn: RemoveFilterBaseFunc;\r\n}\r\n\r\n\r\nexport function PatientsBySiteChart(props: IProps) {\r\n\r\n\tconst filterFn = (chartType: ChartType, chartOrientation: ChartOrientation) => \r\n\t\taddHierarchyFilterFactory(props.addFilterFn, DashboardFilterKeys.PrimarySite.key, props.plotData, (chartType == ChartType.Pie ? p => p.data.labels[p.pointNumber].toString() : (chartOrientation == ChartOrientation.Horizontal ? p => p.y.toString() : p => p.x.toString()))); \r\n\r\n\treturn (\r\n\t\t}\r\n\t\t\tactiveFilters={props.activeFilters}\r\n\t\t\tfilterFn={filterFn}\r\n\t\t\taddFilterFn={props.addFilterFn}\r\n\t\t\tremoveFilterFn={props.removeFilterFn}\r\n\t\t\thoverText=\"Diagnoses\"\r\n\t\t\tsortUnknownToEnd={true}\r\n\t\t\tchartIcons={{\r\n\t\t\t\tline: false\r\n\t\t\t}}\r\n\t\t\tchartDimensions={{\r\n\t\t\t\tchartHeightProportion: 50,\r\n\t\t\t\tparentColNumber: 12,\r\n\t\t\t\ttabColNumber: 4\r\n\t\t\t}}\r\n\t\t/>\r\n\t)\r\n\r\n}\r\n","import React from \"react\";\r\n\r\nimport { AddFilterBaseFunc, IFilterKeys, IFilters, IPlotData, RemoveFilterBaseFunc } from \"models/core\";\r\nimport { DashboardFilterKeys } from \"models/youthCancer\";\r\nimport { ChartOrientation, ChartType, QoolDashChart } from \"../core\";\r\n\r\ninterface IProps {\r\n\tplotData: IPlotData;\r\n\tactiveFilters: IFilters;\r\n\taddFilterFn: AddFilterBaseFunc;\r\n removeFilterFn: RemoveFilterBaseFunc;\r\n}\r\n\r\nexport function RemotenessChart(props: IProps) {\r\n\treturn (\r\n\t\t\r\n\t)\r\n}\r\n","import React from \"react\";\r\n\r\nimport { AddFilterBaseFunc, IFilterKeys, IFilters, IPlotData, RemoveFilterBaseFunc } from \"models/core\";\r\nimport { DashboardFilterKeys } from \"models/youthCancer\";\r\nimport { ChartOrientation, ChartType, QoolDashChart } from \"../core\";\r\n\r\ninterface IProps {\r\n\tplotData: IPlotData;\r\n\tactiveFilters: IFilters;\r\n\taddFilterFn: AddFilterBaseFunc;\r\n removeFilterFn: RemoveFilterBaseFunc;\r\n}\r\n\r\nexport function FertilityPreservationChart(props: IProps) {\r\n\r\n\treturn (\r\n\t\t\r\n\t)\r\n}\r\n","import React from \"react\";\r\n\r\nimport { AddFilterBaseFunc, IFilterKeys, IFilters, IPlotData, RemoveFilterBaseFunc } from \"models/core\";\r\nimport { DashboardFilterKeys } from \"models/youthCancer\";\r\nimport { ChartOrientation, ChartType, QoolDashChart } from \"../core\";\r\n\r\ninterface IProps {\r\n\tplotData: IPlotData;\r\n\tactiveFilters: IFilters;\r\n\taddFilterFn: AddFilterBaseFunc;\r\n removeFilterFn: RemoveFilterBaseFunc;\r\n}\r\n\r\nexport function RecurrenceChart(props: IProps) {\r\n\treturn (\r\n\t\t\r\n\t)\r\n}\r\n","import React from \"react\";\r\n\r\nimport { AddFilterBaseFunc, IFilterKeys, IFilters, IPlotData, RemoveFilterBaseFunc } from \"models/core\";\r\nimport { DashboardFilterKeys } from \"models/youthCancer\";\r\nimport { ChartOrientation, ChartType, QoolDashChart } from \"../core\";\r\n\r\ninterface IProps {\r\n\tplotData: IPlotData;\r\n\tactiveFilters: IFilters;\r\n\taddFilterFn: AddFilterBaseFunc;\r\n removeFilterFn: RemoveFilterBaseFunc;\r\n}\r\n\r\nexport function HadTreatmentChart(props: IProps) {\r\n\r\n\treturn (\r\n\t\t\r\n\t)\r\n}\r\n","import React from \"react\";\r\n\r\nimport { AddFilterBaseFunc, IFilterKeys, IFilters, IPlotData, RemoveFilterBaseFunc } from \"models/core\";\r\nimport { DashboardFilterKeys } from \"models/youthCancer\";\r\nimport { ChartOrientation, ChartType, QoolDashChart } from \"../core\";\r\n\r\ninterface IProps {\r\n\tplotData: IPlotData;\r\n\tactiveFilters: IFilters;\r\n\taddFilterFn: AddFilterBaseFunc;\r\n removeFilterFn: RemoveFilterBaseFunc;\r\n}\r\n\r\nexport function GPDetailsProvidedChart(props: IProps) {\r\n\treturn (\r\n\t\t\r\n\t)\r\n}\r\n","import * as React from \"react\"\r\nimport * as YouthCancer from \"models/youthCancer\";\r\nimport { AppContext } from \"AppContext\";\r\nimport { ActionTypes } from \"reducer/actions\";\r\nimport { Button, Paper, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Grid } from \"@mui/material\";\r\nimport { Link } from \"react-scroll\";\r\nimport { FilterContext } from \"models/core/filter\";\r\nimport { DashChip } from \"components/common/DashChips\";\r\nimport ReportApi from \"api/reportApi\";\r\nimport * as fileHelper from \"helpers/fileHelper\";\r\nimport { Download, Downloading } from \"@mui/icons-material\";\r\nimport { PatientsBySiteChart } from \"charts/youthCancer/PatientsBySiteChart\";\r\nimport { RemotenessChart } from \"charts/youthCancer/RemotenessChart\";\r\nimport { AgeAtDiagnosisChart } from \"charts/common/AgeAtDiagnosisChart\";\r\nimport { FertilityPreservationChart } from \"charts/youthCancer/FertilityPreservationChart\";\r\nimport { RecurrenceChart } from \"charts/youthCancer/RecurrenceChart\";\r\nimport { HadTreatmentChart } from \"charts/youthCancer/HadTreatmentChart\";\r\nimport { GPDetailsProvidedChart } from \"charts/youthCancer/GPDetailsProvidedChart\";\r\nimport Loader from \"pages/shared/pageloader\";\r\n\r\n\r\nenum YouthCancerIndicatorAction {\r\n\tUserClickedDownloadIndicator,\r\n\tDownloadIndicatorSuccess,\r\n\tDownloadIndicatorFail\r\n}\r\n\r\ntype Action =\r\n\t{ type: YouthCancerIndicatorAction.UserClickedDownloadIndicator, payload: number }\r\n\t| { type: YouthCancerIndicatorAction.DownloadIndicatorSuccess }\r\n\t| { type: YouthCancerIndicatorAction.DownloadIndicatorFail }\r\n\r\n\r\ninterface State {\r\n\tindicator: number\r\n}\r\n\r\nconst initialState: State = {\r\n\tindicator: 0\r\n}\r\n\r\n\r\n\r\nconst reducer = (state: State, action: Action): State => {\r\n\tconst { type } = action;\r\n\r\n\tswitch (type) {\r\n\t\tcase YouthCancerIndicatorAction.UserClickedDownloadIndicator:\r\n\t\t\treturn { ...state, ...{ indicator: action.payload } };\r\n\r\n\t\tcase YouthCancerIndicatorAction.DownloadIndicatorSuccess:\r\n\t\tcase YouthCancerIndicatorAction.DownloadIndicatorFail:\r\n\t\t\treturn { ...state, ...{ indicator: 0 } };\r\n\r\n\t\tdefault:\r\n\t\t\treturn state;\r\n\t}\r\n}\r\n\r\n\r\nexport function YouthCancerDashboard() {\r\n\tconst [localState, localDispatch] = React.useReducer(reducer, initialState)\r\n\tconst { state, dispatch } = React.useContext(AppContext);\r\n\r\n\r\n\tconst [showFilterChips, setFilterChips] = React.useState(true);\r\n\r\n\tconst addFilter: YouthCancer.AddFilterFunc = async (key: keyof typeof YouthCancer.DashboardFilterKeys, value: string | string[], context?: FilterContext, labelOverride?: string) => {\r\n\t\tconst filteredDashboard = await YouthCancer.computeChartData(YouthCancer.addFilter(state.page.dashboard as YouthCancer.IYouthCancerDashboard)(key, value, context, labelOverride)); // state = what the other filter function returns \r\n\t\tdispatch({ type: ActionTypes.UserClickedOnChart, payload: filteredDashboard });\r\n\t}\r\n\r\n\tconst removeFilter: YouthCancer.RemoveFilterFunc = async (key: keyof typeof YouthCancer.DashboardFilterKeys, value?: string) => {\r\n\t\tconst filteredDashboard = await YouthCancer.computeChartData(YouthCancer.removeFilter(state.page.dashboard as YouthCancer.IYouthCancerDashboard, key, value));\r\n\t\tdispatch({ type: ActionTypes.UserClickedOnChart, payload: filteredDashboard });\r\n\t}\r\n\r\n\tReact.useEffect(() => {\r\n\t\tdispatch({ type: ActionTypes.UserWantsToLoadMdtDashboard });\r\n\t\tYouthCancer.loadYouthCancerDashboard(state.page.dashboard as YouthCancer.IYouthCancerDashboard)\r\n\t\t\t.then((value) => {\r\n\t\t\t\tdispatch({ type: ActionTypes.UserLoadedMdtDashboard, payload: value })\r\n\t\t\t});\r\n\t\treturn () => {\r\n\t\t\tYouthCancer.closeYouthCancerDashboard();\r\n\t\t}\r\n\t}, []);\r\n\r\n\tReact.useEffect(() => {\r\n\t\tif (localState.indicator == 0)\r\n\t\t\treturn;\r\n\r\n\t\tlet ids = youthCancerChartData.level1.filteredReferralIdCsv;\r\n\t\tlet alldata = false;\r\n\r\n\r\n\t\tconst getYouthCancerIndicatorPatientList = async () => {\r\n\t\t\ttry {\r\n\t\t\t\tconst data = await ReportApi.getYouthCancerIndicatorPatientList(ids, alldata, localState.indicator);\r\n\t\t\t\tif (data.errorMessage) {\r\n\t\t\t\t\tconsole.error(data.errorMessage);\r\n\t\t\t\t\tlocalDispatch({ type: YouthCancerIndicatorAction.DownloadIndicatorFail })\r\n\t\t\t\t}\r\n\t\t\t\tlocalDispatch({ type: YouthCancerIndicatorAction.DownloadIndicatorSuccess })\r\n\t\t\t\treturn fileHelper.showFile(data.bytes, data.filename, fileHelper.fileTypeToMimeType(data.filetype), \"exportPatientsElem\")\r\n\t\t\t} catch {\r\n\t\t\t\tlocalDispatch({ type: YouthCancerIndicatorAction.DownloadIndicatorFail })\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tgetYouthCancerIndicatorPatientList();\r\n\r\n\r\n\t}, [localState.indicator]);\r\n\r\n\r\n\tif (state.page.loading || !state.page.dashboard.chartData)\r\n\t\treturn \r\n\r\n\t//Create function to show/hide filter chips\r\n\tconst toggleChips = () => {\r\n\t\tif (showFilterChips) {\r\n\t\t\tsetFilterChips(false);\r\n\t\t} else {\r\n\t\t\tsetFilterChips(true);\r\n\t\t}\r\n\t};\r\n\r\n\tlet activeFiltersArray = [];\r\n\tlet filterArray = [];\r\n\tlet chips = [];\r\n\r\n\tfor (const key in state.page.dashboard.filters) {\r\n\t\tif (Object.prototype.hasOwnProperty.call(state.page.dashboard.filters, key)) {\r\n\t\t\tactiveFiltersArray.push({ \"key\": key, \"values\": state.page.dashboard.filters[key].value, \"parts\": state.page.dashboard.filters[key].parts });\r\n\t\t}\r\n\t}\r\n\r\n\tfor (const key in YouthCancer.DashboardFilterKeys) {\r\n\t\tif (Object.prototype.hasOwnProperty.call(YouthCancer.DashboardFilterKeys, key)) {\r\n\t\t\tfilterArray.push({ \"key\": key, \"label\": YouthCancer.DashboardFilterKeys[key].label });\r\n\t\t}\r\n\t}\r\n\r\n\tactiveFiltersArray.forEach(a => {\r\n\t\ta.values.forEach(b => {\r\n\t\t\tchips.push( id.key == a.key).label}\r\n\t\t\t\tfilterValue={b}\r\n\t\t\t\tfilterId={a.key}\r\n\t\t\t\tfilterParent={(a.parts.length > 1 ? a.parts[0] : null)}\r\n\t\t\t/>\r\n\t\t\t)\r\n\t\t})\r\n\t})\r\n\r\n\tconst youthCancerChartData = state.page.dashboard.chartData as YouthCancer.IChartData;\r\n\r\n\tconst downloadBtn = (extractTypeId: number) => {\r\n\t\tconst { indicator } = localState;\r\n\r\n\t\tif (indicator == extractTypeId)\r\n\t\t\treturn \r\n\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\tlocalDispatch({ type: YouthCancerIndicatorAction.UserClickedDownloadIndicator, payload: extractTypeId })} />\r\n\t\t)\r\n\t}\r\n\r\n\t// const ecog = {\r\n\t// \tnumerator: 0,\r\n\t// \tdenominator: 0,\r\n\t// \tpercentage: 0\r\n\t// }\r\n\r\n\t// const stage = {\r\n\t// \tnumerator: 0,\r\n\t// \tdenominator: 0,\r\n\t// \tpercentage: 0\r\n\t// }\r\n\r\n\t// if (youthCancerChartData.level1.totalDiagnoses > 0) {\r\n\t// \tecog.numerator = youthCancerChartData.level1.totalDiagnoses - (youthCancerChartData.level2.ecogGroup.values[youthCancerChartData.level2.ecogGroup.labels.indexOf(\"Unk\")] || 0);\r\n\t// \tecog.denominator = youthCancerChartData.level1.totalDiagnoses\r\n\t// \tecog.percentage = ecog.numerator / ecog.denominator * 100\r\n\r\n\t// \tstage.numerator = youthCancerChartData.level1.totalDiagnoses - (youthCancerChartData.level2.tnmStage.values[youthCancerChartData.level2.tnmStage.labels.indexOf(\"Unk\")] || 0);\r\n\t// \tstage.denominator = youthCancerChartData.level1.totalDiagnoses;\r\n\t// \tstage.percentage = stage.numerator / stage.denominator * 100\r\n\t// }\r\n\r\n\r\n\tconst dashboard = <>\r\n\t\t
\r\n\r\n\r\n\t\t\t{(showFilterChips ?
\r\n\t\t\t\t{chips}\r\n\t\t\t
: null)}\r\n\t\t
\r\n\r\n\r\n\r\n\t\t
\r\n\r\n\t\t\t
\r\n\t\t\t\t\r\n\t\t\t
\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tIndicator\r\n\t\t\t\t\t\t\tMy MDT(s)\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tNumber of youth cancer patients\r\n\t\t\t\t\t\t\t{`${youthCancerChartData.level2.totalDiagnoses}`}\r\n\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t{/* \r\n\t\t\t\t\t\t\tPercentage of patients with ECOG\r\n\t\t\t\t\t\t\t{`${ecog.percentage.toFixed(0)}%`}
{`(${ecog.numerator}/${ecog.denominator})`}
\r\n\t\t\t\t\t\t\t- \r\n\t\t\t\t\t
*/}\r\n\r\n\t\t\t\t\t\t{/* \r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tDiagnosis\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t */}\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tPsychosocial care plan completed\r\n\t\t\t\t\t\t\t {`(${youthCancerChartData.level2.psychosocialCarePlanNum.numerator}/${youthCancerChartData.level2.psychosocialCarePlanNum.denominator})`}\r\n\t\t\t\t\t\t\t{`${youthCancerChartData.level2.psychosocialCarePlanNum.percentage.toFixed(1)}%`}\r\n\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t{/* \r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tSurgical\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t */}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tReceived psychosocial / supportive care\r\n\t\t\t\t\t\t\t{`(${youthCancerChartData.level2.receivedPsychosocialCareNum.numerator}/${youthCancerChartData.level2.receivedPsychosocialCareNum.denominator})`}\r\n\t\t\t\t\t\t\t{`${youthCancerChartData.level2.receivedPsychosocialCareNum.percentage.toFixed(1)}%`}\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tHad fertility discussion\r\n\t\t\t\t\t\t\t{`(${youthCancerChartData.level2.hadFertilityDiscussionNum.numerator}/${youthCancerChartData.level2.hadFertilityDiscussionNum.denominator})`}\r\n\t\t\t\t\t\t\t{`${youthCancerChartData.level2.hadFertilityDiscussionNum.percentage.toFixed(1)}%`}\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tReferred to fertility specialist\r\n\t\t\t\t\t\t\t{`(${youthCancerChartData.level2.referralToFertilitySpecialistNum.numerator}/${youthCancerChartData.level2.referralToFertilitySpecialistNum.denominator})`}\r\n\t\t\t\t\t\t\t{`${youthCancerChartData.level2.referralToFertilitySpecialistNum.percentage.toFixed(1)}%`}\r\n\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tUnderwent fertility preservation\r\n\t\t\t\t\t\t\t{`(${youthCancerChartData.level2.fertilityPreservationNum.numerator}/${youthCancerChartData.level2.fertilityPreservationNum.denominator})`}\r\n\t\t\t\t\t\t\t{`${youthCancerChartData.level2.fertilityPreservationNum.percentage.toFixed(1)}%`}\r\n\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tReviewed at treatment MDT\r\n\t\t\t\t\t\t\t{`(${youthCancerChartData.level2.reviewedAtTreatmentMDTNum.numerator}/${youthCancerChartData.level2.reviewedAtTreatmentMDTNum.denominator})`}\r\n\t\t\t\t\t\t\t{`${youthCancerChartData.level2.reviewedAtTreatmentMDTNum.percentage.toFixed(1)}%`}\r\n\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tPsychosocial survivorship care plan given to patient\r\n\t\t\t\t\t\t\t{`(${youthCancerChartData.level2.psychosocialSurvivorshipCarePlanNum.numerator}/${youthCancerChartData.level2.psychosocialSurvivorshipCarePlanNum.denominator})`}\r\n\t\t\t\t\t\t\t{`${youthCancerChartData.level2.psychosocialSurvivorshipCarePlanNum.percentage.toFixed(1)}%`}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tMedical treatment plan given to GP\r\n\t\t\t\t\t\t\t{`(${youthCancerChartData.level2.medicalTreatmentPlanToGPNum.numerator}/${youthCancerChartData.level2.medicalTreatmentPlanToGPNum.denominator})`}\r\n\t\t\t\t\t\t\t{`${youthCancerChartData.level2.medicalTreatmentPlanToGPNum.percentage.toFixed(1)}%`}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tEnrolled in a medical trial\r\n\t\t\t\t\t\t\t{`(${youthCancerChartData.level2.enrolledInMedicalTrialNum.numerator}/${youthCancerChartData.level2.enrolledInMedicalTrialNum.denominator})`}\r\n\t\t\t\t\t\t\t{`${youthCancerChartData.level2.enrolledInMedicalTrialNum.percentage.toFixed(1)}%`}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tEnrolled in other research\r\n\t\t\t\t\t\t\t{`(${youthCancerChartData.level2.enrolledInOtherResearchNum.numerator}/${youthCancerChartData.level2.enrolledInOtherResearchNum.denominator})`}\r\n\t\t\t\t\t\t\t{`${youthCancerChartData.level2.enrolledInOtherResearchNum.percentage.toFixed(1)}%`}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tOne year survival^\r\n\t\t\t\t\t\t\t{`(${youthCancerChartData.level2.oneYearSurvival.numerator}/${youthCancerChartData.level2.oneYearSurvival.denominator})`}\r\n\t\t\t\t\t\t\t{`${youthCancerChartData.level2.oneYearSurvival.percentage.toFixed(1)}%`}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tTwo year survival^\r\n\t\t\t\t\t\t\t{`(${youthCancerChartData.level2.twoYearSurvival.numerator}/${youthCancerChartData.level2.twoYearSurvival.denominator})`}\r\n\t\t\t\t\t\t\t{`${youthCancerChartData.level2.twoYearSurvival.percentage.toFixed(1)}%`}\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tFive year survival^\r\n\t\t\t\t\t\t\t{`(${youthCancerChartData.level2.fiveYearSurvival.numerator}/${youthCancerChartData.level2.fiveYearSurvival.denominator})`}\r\n\t\t\t\t\t\t\t{`${youthCancerChartData.level2.fiveYearSurvival.percentage.toFixed(1)}%`}\r\n\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t
\r\n\r\n\t\t\t
\r\n\t\t\t\t

^Patients with less than one, two, and five years of data from diagnosis are excluded from the one, two, and five year survival indicators respectively.

\r\n\t\t\t
\r\n\r\n\t\t
\r\n\r\n\t\t\r\n\t\t\t\r\n\t\t\t\t

Patient Characteristics

\r\n\t\t\t
\r\n\r\n\t\t\t 991 ? 4 : 11}>\r\n\t\t\t\t\r\n\t\t\t\r\n\r\n\t\t\t 991 ? 4 : 11}>\r\n\t\t\t\t\r\n\t\t\t\r\n\r\n\t\t\t 991 ? 4 : 11}>\r\n\t\t\t\t\r\n\t\t\t\r\n\r\n\t\t\t 991 ? 3 : 11}>\r\n\t\t\t\t\r\n\t\t\t\r\n\r\n\t\t\t 991 ? 3 : 11}>\r\n\t\t\t\t\r\n\t\t\t\r\n\r\n\t\t\t 991 ? 3 : 11}>\r\n\t\t\t\t\r\n\t\t\t\r\n\r\n\t\t\t 991 ? 3 : 11}>\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t
\r\n\r\n\t\t\r\n\r\n\t\r\n\r\n\treturn (\r\n\t\tdashboard\r\n\t)\r\n\r\n\r\n} ","import * as React from \"react\"\r\nimport * as YouthCancer from \"models/youthCancer\";\r\nimport { AppContext } from \"AppContext\";\r\nimport { ActionTypes } from \"reducer/actions\";\r\nimport { Box, Button, Typography } from \"@mui/material\";\r\nimport { FilterContext } from \"models/core/filter\";\r\nimport Select from \"react-select\";\r\nimport { SideBySideButton } from \"components/common/SideBySideOptions\";\r\nimport { exportMdtPatients } from \"models/mdt/worker\";\r\nimport * as fileHelper from \"helpers/fileHelper\";\r\nimport Loader from \"pages/shared/filterloader\";\r\n\r\nexport function YouthCancerFilters() {\r\n\tconst { state, dispatch } = React.useContext(AppContext);\r\n\r\n\tconst addFilter: YouthCancer.AddFilterFunc = async (key: keyof typeof YouthCancer.DashboardFilterKeys, value: string | string[], context?: FilterContext, labelOverride?: string) => {\r\n\t\tconst filteredDashboard = await YouthCancer.computeChartData(YouthCancer.addFilter(state.page.dashboard as YouthCancer.IYouthCancerDashboard)(key, value, context, labelOverride)); // state = what the other filter function returns \r\n\t\tdispatch({ type: ActionTypes.UserClickedOnChart, payload: filteredDashboard });\r\n\t}\r\n\r\n\tconst removeFilter: YouthCancer.RemoveFilterFunc = async (key: keyof typeof YouthCancer.DashboardFilterKeys) => {\r\n\r\n\t\tconst filteredDashboard = await YouthCancer.computeChartData(YouthCancer.removeFilter(state.page.dashboard as YouthCancer.IYouthCancerDashboard, key));\r\n\t\tdispatch({ type: ActionTypes.UserClickedOnChart, payload: filteredDashboard });\r\n\t}\r\n\r\n\tif (state.page.loading)\r\n\t\treturn ;\r\n\r\n\tconst dataForFilters = state.page.dashboard.chartData as YouthCancer.IChartData;\r\n\t//HHS \r\n\t//HHS Options\r\n\tconst hhsOptions: any[] = [];\r\n\tdataForFilters?.level1.hhses.map(p => {\r\n\t\thhsOptions.push({ label: p.name, value: p.id });\r\n\t})\r\n\r\n\t//Filtered HHSes\r\n\tlet hhsSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.HHS?.value?.map(p => {\r\n\t\thhsSelections.push({ label: p, value: hhsOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\t//Add code to be able to filter list of facilities to a chosen HHS\r\n\tlet selectedHHSIds = [];\r\n\tif (hhsSelections.length > 0) {\r\n\t\tselectedHHSIds = hhsSelections.map(a =>\r\n\t\t\ta.value);\r\n\t}\r\n\r\n\t//Facility \r\n\t//Facility Options\r\n\tconst facilityOptions: any[] = [];\r\n\tif (hhsSelections.length > 0) {\r\n\t\tdataForFilters?.level1.facilities.filter(a => selectedHHSIds.includes(a.hhsId)).map(p => {\r\n\t\t\tfacilityOptions.push({ label: p.name, value: p.facilityId });\r\n\t\t})\r\n\t} else {\r\n\t\tdataForFilters?.level1.facilities.map(p => {\r\n\t\t\tfacilityOptions.push({ label: p.name, value: p.facilityId });\r\n\t\t});\r\n\t}\r\n\r\n\t//Filtered facilities\r\n\tlet facilitySelections: any[] = [];\r\n\tstate.page.dashboard.filters?.Facility?.value?.map(p => {\r\n\t\tfacilitySelections.push({ label: p, value: facilityOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\t//Add code to be able to filter list of Mdts to a chosen Facilities\r\n\tlet selectedFacilityIds = [];\r\n\tif (facilitySelections.length > 0) {\r\n\t\tselectedFacilityIds = facilitySelections.map(a =>\r\n\t\t\ta.value);\r\n\t}\r\n\r\n\t//MDTs\r\n\t//Options\r\n\tconst mdtOptions: any[] = [];\r\n\tif (facilitySelections.length > 0) {\r\n\t\tdataForFilters?.level1.mdts.filter(a => selectedFacilityIds.includes(a.facilityId)).map(p => {\r\n\t\t\tmdtOptions.push({ label: p.nameAndFacility, value: p.mdtNameId });\r\n\t\t})\r\n\t} else {\r\n\t\tdataForFilters?.level1.mdts.map(p => {\r\n\t\t\tmdtOptions.push({ label: p.nameAndFacility, value: p.mdtNameId });\r\n\t\t})\r\n\t}\r\n\r\n\t//Filtered MDTs\r\n\tlet mdtSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.Mdt?.value?.map(p => {\r\n\t\tmdtSelections.push({ label: p, value: mdtOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\t//let { path } = state.page.dashboard.chartData.reviewsByPeriod;\r\n\t//let parts = FilterContext.fromPath(path).parts;\r\n\r\n\t//Months\r\n\t//Options\r\n\tconst monthOptions: any[] = [];\r\n\tdataForFilters?.level1.month.map(p => {\r\n\t\tmonthOptions.push({ label: p.name, value: p.id });\r\n\t})\r\n\r\n\t//Filtered MDT months\r\n\tlet mdtMonthSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.MdtMonth?.value?.map(p => {\r\n\t\tmdtMonthSelections.push({\r\n\t\t\tlabel: p,\r\n\t\t\tvalue: monthOptions.find(a => a.label == p)?.value\r\n\t\t});\r\n\t})\r\n\r\n\t//Filtered diagnosis months\r\n\tlet diagMonthSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.DiagnosisMonth?.value?.map(p => {\r\n\t\tdiagMonthSelections.push({ label: p, value: monthOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\t//Years\r\n\t//MDT Year options\r\n\tconst mdtYearOptions: any[] = [];\r\n\tdataForFilters?.level1.year.map(p => {\r\n\t\tif (p.id >= 2010) {\r\n\t\t\tmdtYearOptions.push({ label: p.name, value: p.id });\r\n\t\t}\r\n\t})\r\n\r\n\t//Diagnosis year options\r\n\tconst diagYearOptions: any[] = [];\r\n\tdataForFilters?.level1.year.map(p => {\r\n\t\tdiagYearOptions.push({ label: p.name, value: p.id });\r\n\t})\r\n\r\n\t//Filtered year selections\r\n\tlet mdtYearSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.MdtYear?.value?.map(p => {\r\n\t\tmdtYearSelections.push({\r\n\t\t\tlabel: p,\r\n\t\t\tvalue: mdtYearOptions.find(a => a.label == p)?.value\r\n\t\t});\r\n\t})\r\n\r\n\t//Filtered diagnosis selections\r\n\tlet diagYearSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.DiagnosisYear?.value?.map(p => {\r\n\t\tdiagYearSelections.push({ label: p, value: diagYearOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\t//State for side by side button \r\n\tconst [viewBy, setViewBy] = React.useState(diagYearSelections.length > 0 ? \"Diagnosis Year\" : \"MDT Year\");\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t\r\n\t\t\t\tHHS\r\n\t\t\t\t {\r\n\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\tremoveFilter(YouthCancer.DashboardFilterKeys.HHS.key);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\taddFilter(YouthCancer.DashboardFilterKeys.HHS.key, filterValues);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t}),\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t\r\n\r\n\r\n\t\t\t\r\n\t\t\t\tFacility\r\n\t\t\t\t {\r\n\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\tremoveFilter(YouthCancer.DashboardFilterKeys.Facility.key);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\taddFilter(YouthCancer.DashboardFilterKeys.Facility.key, filterValues);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t}),\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t\r\n\r\n\r\n\t\t\t\r\n\t\t\t\tMDT\r\n\t\t\t\t {\r\n\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\tremoveFilter(YouthCancer.DashboardFilterKeys.Mdt.key);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\taddFilter(YouthCancer.DashboardFilterKeys.Mdt.key, filterValues);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t}),\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t\r\n\r\n\t\t\t\r\n\t\t\t\tView By\r\n\t\t\t\t {\r\n\t\t\t\t\t\tsetViewBy(p)\r\n\t\t\t\t\t}}\r\n\r\n\t\t\t\t/>\r\n\t\t\t\r\n\r\n\t\t\t{(viewBy == \"MDT Year\" ?\r\n\t\t\t\t<>\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tMDT Year\r\n\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\t\t\tremoveFilter(YouthCancer.DashboardFilterKeys.MdtYear.key);\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\taddFilter(YouthCancer.DashboardFilterKeys.MdtYear.key, filterValues);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tMDT Month\r\n\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\t\t\tremoveFilter(YouthCancer.DashboardFilterKeys.MdtMonth.key);\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\taddFilter(YouthCancer.DashboardFilterKeys.MdtMonth.key, filterValues);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t:\r\n\t\t\t\t<>\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tDiagnosis Year\r\n\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\t\t\tremoveFilter(YouthCancer.DashboardFilterKeys.DiagnosisYear.key);\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\taddFilter(YouthCancer.DashboardFilterKeys.DiagnosisYear.key, filterValues);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tDiagnosis Month\r\n\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\t\t\tremoveFilter(YouthCancer.DashboardFilterKeys.DiagnosisMonth.key);\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\taddFilter(YouthCancer.DashboardFilterKeys.DiagnosisMonth.key, filterValues);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\r\n\r\n\t\t\t\t\r\n\t\t\t)}\r\n\r\n\r\n\t\t\t{/* \r\n\t\t\t\t{(Object.keys(state.page.dashboard.filters).length !== 0 ?\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\texportMdtPatients(dataForFilters.level1.filteredReferralIdCsv, false)\r\n\t\t\t\t\t\t\t\t.then(data => {\r\n\t\t\t\t\t\t\t\t\tif (data.errorMessage) {\r\n\t\t\t\t\t\t\t\t\t\tthrow data.errorMessage;\r\n\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\treturn fileHelper.showFile(data.bytes, data.filename, fileHelper.fileTypeToMimeType(data.filetype), \"exportMdtPatientsElem\")\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t\t.catch(err => console.log(err))\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t>Download Patient List\r\n\t\t\t\t\t :\r\n\r\n\t\t\t\t\t
Make a filter selection in order to download patient list
)}\r\n\t\t\t
\r\n\r\n\t\t\t */}\r\n\t\t\r\n\t)\r\n}\r\n\r\n","import { YouthCancerDashboard } from \"./dashboard\";\r\nimport { YouthCancerFilters } from \"./filters\";\r\nimport * as React from \"react\";\r\n\r\nexport { YouthCancerFilters }\r\n\r\n\r\nexport class YouthCancerDashboardHome extends React.Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n width: 0,\r\n height: 0\r\n }; \r\n \r\n }\r\n\r\n private updateDimensions = () => {\r\n this.setState({ width: window.innerWidth, height: window.innerHeight });\r\n };\r\n \r\n public componentWillUnmount() {\r\n window.removeEventListener('resize', this.updateDimensions);\r\n }\r\n \r\n public componentDidMount() {\r\n window.addEventListener('resize', this.updateDimensions);\r\n }\r\n\r\n render = () => {\r\n return (\r\n <>\r\n \r\n \r\n )\r\n\r\n }\r\n}\r\n","import { \r\n IPlotData as ICorePlotData, createPlotData as createCorePlotData, \r\n ISourceData as ICoreSourceData, createData as createCoreData, addDataFactory, addSet \r\n} from \"models/core\";\r\nimport { IDashboardViewModel } from \"./core\";\r\n\r\n/**\r\n * Plot data source\r\n */\r\nexport type IPlotData = ICorePlotData;\r\n\r\n/**\r\n * Source data\r\n */\r\nexport type ISourceData = ICoreSourceData;\r\n\r\n/**\r\n * Raw data source. Used to shape and accumulate.\r\n */\r\nexport interface ISourceBuilder {\r\n uniques: Set;\r\n values: ISourceData;\r\n}\r\n\r\n/**\r\n * Create a new plot data object.\r\n */\r\nexport const createPlotData = createCorePlotData;\r\n\r\n/**\r\n * Create a new source data object\r\n */\r\nexport function createBuilder(): ISourceBuilder {\r\n return {\r\n uniques: new Set(),\r\n values: createCoreData(),\r\n };\r\n}\r\n\r\nconst add = addDataFactory((vm: IDashboardViewModel) => vm.morphology.name);\r\n\r\n/**\r\n * Returns the number added to the hierarchy on add, 0 otherwise. \r\n * @param vm \r\n * @param into \r\n */\r\nexport function addData(vm: IDashboardViewModel, into: ISourceBuilder): number {\r\n //Only count once per diagnosis per morphology.\r\n if (addSet(vm.morphology.id + \"_\" + vm.diagnosisId, into.uniques)) {\r\n add(vm, into.values);\r\n return 1;\r\n }\r\n\r\n return 0;\r\n}\r\n\r\n/**\r\n * Compare sourceData[a] to sourceData[b] and return -1 when a is less than b, 0 when equal, 1 when a is greater than 0\r\n * @param a \r\n * @param b \r\n */\r\nexport const sort = (s: ISourceData, a: string, b: string): number => {\r\n return ((s[a] < s[b]) ? -1 : ((s[a] > s[b]) ? 1 : 0));\r\n};\r\n\r\n/** \r\n * Complete adding data and clear any temporary resources \r\n */\r\nexport function finish(builder: ISourceBuilder): ISourceData {\r\n try {\r\n return builder.values;\r\n } finally {\r\n builder.uniques.clear();\r\n builder.uniques = null;\r\n builder.values = null;\r\n builder = null;\r\n }\r\n}","\r\nimport {\r\n\tAddDataSharedFunc, DashboardSharedFilterFunc, DashboardSharedFilterKey,\r\n\tIDashboardSharedChartData, IDashboardSharedDimensionsViewModel,\r\n} from \"models/common\";\r\nimport { IFilters, IFilterKeys, DimensionsById, ISourceData, IDimFacility, IDimension, IDimMDT } from \"models/core\";\r\nimport { IDashboardViewModel } from \"./viewModel\";\r\n\r\n//Plots for this dashboard\r\nimport * as PrimarySite from \"./primarySiteHierarchy\";\r\nimport * as Morphology from \"./morphology\";\r\nimport * as Remoteness from \"../../common/plotdata/remoteness\";\r\nimport * as HHSOfResidence from \"../../common/plotdata/hhsOfResidence\";\r\n\r\nexport type { IDashboardViewModel } from \"./viewModel\";\r\n\r\nexport type IDashboardSource = IDashboardViewModel[];\r\n\r\nexport interface IDashboardDimensionsViewModel extends IDashboardSharedDimensionsViewModel {\r\n hhsResidenceGroups?: DimensionsById;\r\n dataQualityIndicators?: DimensionsById;\r\n monthsArray?: Array;\r\n yearsArray?: Array;\r\n months?: { [monthId: number]: string };\r\n years?: { [yearId: number]: string };\r\n dqCompFacility?: { [facilityYearKey: string]: number };\r\n dqCompState?: { [facilityYearKey: string]: number };\r\n oneYearSurvivalMDT?: { [mdtDiagYearKey: string]: { \"MDT\": number, \"State\": number } };\r\n threeYearSurvivalMDT?: { [mdtDiagYearKey: string]: { \"MDT\": number, \"State\": number } };\r\n fiveYearSurvivalMDT?: { [mdtDiagYearKey: string]: { \"MDT\": number, \"State\": number } };\r\n tenYearSurvivalMDT?: { [mdtDiagYearKey: string]: { \"MDT\": number, \"State\": number } };\r\n kmSurvivalMDT?: {[mdtCancerKey: string]: { survivalTime: string, mdtKMSurvival: number, stateKMSurvival: number }};\r\n\r\n}\r\n\r\ninterface ILevel1ChartData {\r\n\ttotalDiagnoses: number;\r\n\ttotalDataQualityEligibleDiagnoses: number;\r\n\tfacilities: IDimFacility[];\r\n\thhses: IDimension[];\r\n\tmdts: IDimMDT[];\r\n\tmonth: IDimension[];\r\n\tyear: IDimension[];\r\n\r\n bmatBeforeFirstTreat: { numerator, denominator: number, percentage: number };\r\n\tflt3BeforeFirstTreat: { numerator: number, denominator: number, percentage: number; };\r\n\thadIVST: { numerator: number, denominator: number, percentage: number; };\r\n\tfirstTreat0To5Days: { numerator: number, denominator: number, percentage: number; };\r\n\tfirstTreat6To10Days: { numerator: number, denominator: number, percentage: number; };\r\n\tfirstTreat11To15Days: { numerator: number, denominator: number, percentage: number; };\r\n\tfirstTreatMoreThan15Days: { numerator: number, denominator: number, percentage: number; };\r\n\thadBMT: { numerator: number, denominator: number, percentage: number; };\r\n\tbmt0To3Months: { numerator: number, denominator: number, percentage: number };\r\n\tbmt3To6Months: { numerator: number, denominator: number, percentage: number };\r\n\tbmt6To9Months: { numerator: number, denominator: number, percentage: number };\r\n\tbmt9To12Months: { numerator: number, denominator: number, percentage: number };\r\n\tlengthOfStayBMT: { min: number, median: number, max: number };\r\n\toneYearSurvival: { numerator: number, denominator: number, percentage: number; };\r\n\ttwoYearSurvival: { numerator: number, denominator: number, percentage: number; };\r\n\tfiveYearSurvival: { numerator: number, denominator: number, percentage: number; };\r\n\tmortality30Days: { numerator: number, denominator: number, percentage: number };\r\n\tmortality31To365Days: { numerator: number, denominator: number, percentage: number };\r\n\thadAPML: number;\r\n\t// Export\r\n\tfilteredReferralIdCsv: string;\r\n}\r\n\r\n// HACK: chop out the reference array from the shared interface \r\ntype RestrictedSharedChartData = Omit, \"hhses\">;\r\n\r\ninterface ILevel2ChartData extends RestrictedSharedChartData {\r\n\ttotalDiagnoses: number;\r\n\tprimarySite: PrimarySite.IHierarchyPlotData;\r\n\tmorphology: Morphology.IPlotData;\r\n\tremoteness: Remoteness.IPlotData;\r\n\thhsOfResidence: HHSOfResidence.IPlotData;\r\n}\r\n\r\nexport interface IChartData {\r\n\tlevel1: ILevel1ChartData;\r\n\tlevel2: ILevel2ChartData;\r\n}\r\n\r\nconst BreastFilterKeys: IFilterKeys = {\r\n\t//Filter keys for breast indicators\r\n\tDiagnosisYear: { key: \"DiagnosisYear\", label: \"Diagnosis Year\" },\r\n\tDiagnosisMonth: { key: \"DiagnosisMonth\", label: \"Diagnosis Month\" },\r\n\tMdtYear: { key: \"MdtYear\", label: \"MDT Year\" },\r\n\tMdtMonth: { key: \"MdtMonth\", label: \"MDT Month\" },\r\n\tInvasive: { key: \"Invasive\", label: \"Invasive / In-situ\" },\r\n\tPrimarySite: { key: \"PrimarySite\", label: \"Primary site\" },\r\n\tMorphology: { key: \"Morphology\", label: \"Morphology\" },\r\n\tRemoteness: { key: \"Remoteness\", label: \"Rurality\" },\r\n\tDefinitiveMastectomy: { key: \"DefinitiveMastectomy\", label: \"Definitive Mastectomy\" },\r\n\tHHSOfResidence: { key: \"HHSOfResidence\", label: \"HHS of residence\" }\r\n}\r\n\r\nexport const DashboardFilterKeys: IFilterKeys = {\r\n\t...DashboardSharedFilterKey,\r\n\t...BreastFilterKeys\r\n}\r\n\r\nexport type Filters = IFilters;\r\nexport type DashboardFilterFunc = DashboardSharedFilterFunc;\r\nexport type AddDataFunc = AddDataSharedFunc;","import { IChartData, IDashboardDimensionsViewModel, Filters } from \"../plotdata\";\r\n\r\n//Actions / requests\r\nexport enum WorkerRequestType { Ping, Fetch, ChartData }\r\nexport interface IWorkerFetchRequest { all: boolean, rawRefs: any, rawRows: string, minYear: number }\r\nexport interface IWorkerChartDataRequest { filtersToApply: Filters, minYear: number };\r\nexport interface IWorkerRequest {\r\n type: WorkerRequestType;\r\n id: string;\r\n payload?: any; //?\r\n}\r\n\r\n//Results\r\nexport enum WorkerResultType { Ping, Fetch, ChartData, InvalidType }\r\nexport interface IWorkerResult {\r\n type: WorkerResultType;\r\n id: string;\r\n payload?: any; //?\r\n}\r\nexport interface IWorkerPingResult {}\r\nexport interface IWorkerFetchResult { allData: boolean, references: IDashboardDimensionsViewModel, chartData: IChartData }\r\nexport type IWorkerChartDataResult = IChartData;","export default function Worker_fn() {\n return new Worker(__webpack_public_path__ + \"data.worker.277f6def6642f7340378.worker.js\");\n}\n","import { generateUUID } from \"helpers\";\r\nimport { getAMLDashboard, getAMLDashboardReferences } from \"api/dashboardApi\";\r\nimport { Filters } from \"../plotdata\";\r\nimport { IWorkerChartDataRequest, IWorkerChartDataResult, IWorkerFetchRequest, IWorkerFetchResult, IWorkerPingResult, IWorkerRequest, WorkerRequestType, WorkerResultType } from \"./models\";\r\nimport DataWorker from 'worker-loader!./data.worker';\r\nexport type { IWorkerChartDataResult, IWorkerFetchResult, IWorkerPingResult, IWorkerRequest, WorkerRequestType }\r\n\r\n//#region Worker\r\n\r\nlet worker: DataWorker = null;\r\nlet promises = {};\r\nlet data = {\r\n minYear: 0,\r\n}\r\n\r\n/**\r\n * Start the Worker\r\n */\r\nexport function start(minYear: number) {\r\n data.minYear = minYear;\r\n\r\n if (!window[\"Worker\"]) {\r\n console.log(\"WebWorker not supported\");\r\n return false;\r\n\r\n } else {\r\n console.log(\"WebWorker starting\");\r\n\r\n worker = worker || new DataWorker();\r\n\r\n /**\r\n * When the worker sends an error back to the main thread, resolve the associated promise.\r\n */\r\n worker.addEventListener(\"message\", (ev: MessageEvent) => {\r\n const { data: { id, type, payload } } = ev;\r\n\r\n //Any specific handling by message type\r\n switch (type as WorkerResultType) {\r\n // case WorkerResultType.Ping: {\r\n // case WorkerResultType.Fetch: {\r\n default: {\r\n //Default handler will just resolve\r\n promises[id]?.resolve(payload);\r\n break;\r\n }\r\n }\r\n\r\n promises[id] = undefined;\r\n });\r\n\r\n /**\r\n * When the worker sends an error back to the main thread, reject the associated promise.\r\n */\r\n worker.addEventListener(\"messageerror\", (ev: MessageEvent) => {\r\n const { data: { id, type, payload } } = ev;\r\n\r\n //Any specific handling by message type\r\n switch (type) {\r\n //case WorkerResultType.Ping: {\r\n //case WorkerResultType.Fetch: {\r\n default: {\r\n console.error(\"ERROR from worker\", payload);\r\n promises[id].reject(payload);\r\n break;\r\n }\r\n }\r\n\r\n promises[id] = undefined;\r\n });\r\n\r\n return true;\r\n }\r\n}\r\n\r\n/**\r\n * Post the message to the Worker\r\n * @param request \r\n */\r\nfunction send(request: IWorkerRequest) {\r\n worker.postMessage(request);\r\n}\r\n\r\n/**\r\n * Transform into a Promise and track it.\r\n * @param type \r\n * @param payload \r\n */\r\nfunction actionPromise(type: WorkerRequestType, payload: TIn): Promise {\r\n const id = generateUUID();\r\n promises[id] = {};\r\n promises[id].promise = new Promise((resolve, reject) => {\r\n send({ id, type, payload });\r\n\r\n promises[id].resolve = resolve;\r\n promises[id].reject = reject;\r\n });\r\n\r\n return promises[id].promise;\r\n}\r\n\r\nexport function ping(): Promise {\r\n return actionPromise(WorkerRequestType.Ping, null);\r\n}\r\n\r\n/**\r\n * Fetch the data from the server, then push it to the Worker for processing.\r\n * @param all \r\n */\r\nexport function fetch(all: boolean): Promise {\r\n //WebWorker cannot access sessionStorage so do the api call here and\r\n //send the data tp it.\r\n return Promise.all([\r\n getAMLDashboard(all),\r\n getAMLDashboardReferences(all),\r\n ])\r\n .then(results => {\r\n return actionPromise(WorkerRequestType.Fetch, {\r\n all,\r\n rawRows: results[0] as string,\r\n rawRefs: results[1] as any,\r\n minYear: data.minYear,\r\n });\r\n });\r\n\r\n}\r\n\r\n/**\r\n * Apply the filters in the Worker and return the ChartData\r\n * @param filtersToApply \r\n */\r\nexport function chartData(filtersToApply: Filters): Promise {\r\n return actionPromise(WorkerRequestType.ChartData, {\r\n filtersToApply,\r\n minYear: data.minYear,\r\n });\r\n}\r\n\r\n/** Terminate the worker */\r\nexport function stop() {\r\n worker && worker.terminate();\r\n worker = null;\r\n console.log(\"WebWorker terminated\");\r\n}\r\n\r\n//#endregion Worker\r\n","import { AddFilterBaseFunc, FilterContext, RemoveFilterBaseFunc } from \"../core\";\r\nimport { DashboardFilterKeys, Filters, IChartData, IDashboardDimensionsViewModel } from \"./plotdata\";\r\n\r\nexport type { IChartData, IDashboardDimensionsViewModel, Filters } from \"./plotdata\";\r\nexport { DashboardFilterKeys } from \"./plotdata\";\r\nexport type AddFilterFunc = AddFilterBaseFunc;\r\nexport type RemoveFilterFunc = RemoveFilterBaseFunc;\r\n\r\nimport * as DashWorker from \"./worker\";\r\nexport { DashWorker }\r\n\r\nexport interface IAMLDashboard {\r\n\tallData: boolean;\r\n\treferences: IDashboardDimensionsViewModel;\r\n\tfilters: Filters;\r\n\tchartData: IChartData;\r\n\tselectedFacilities: Set;\r\n selectedHhses: Set;\r\n onlyDataQualityEligible: boolean;\r\n}\r\n\r\n\r\nexport const initState = (): IAMLDashboard => {\r\n\treturn {\r\n\t\tallData: false,\r\n\t\treferences: {},\r\n\t\tchartData: null,\r\n\t\tfilters: {},\r\n\t\tselectedFacilities: new Set(),\r\n\t\tselectedHhses: new Set(),\r\n\t\tonlyDataQualityEligible: false,\r\n\t}\r\n};\r\n\r\n\r\nexport const loadAMLDashboard = async (state: IAMLDashboard): Promise => {\r\n\tDashWorker.start(2010);\r\n\ttry {\r\n\t\tawait DashWorker.ping()\r\n\t\tconsole.log(\"WORKER PING RESOLVED\");\r\n\t\treturn await fetchData(state, state.allData);\r\n\t} catch {\r\n\t\tconsole.error(\"WORKER PING FAILED\");\r\n\t}\r\n}\r\n\r\nexport const clearFilters = (state: IAMLDashboard): IAMLDashboard => {\r\n\tconst maybeSetDefaultFilter = (filterKey: string, dimensions: { name: string }[]): Set => {\r\n\t\tif (!dimensions || dimensions.length !== 1)\r\n\t\t\treturn (new Set());\r\n\r\n\t\tif (state.allData)\r\n\t\t\treturn (new Set());\r\n\r\n\t\tlet filterSet = new Set();\r\n\t\tfilterSet.add(dimensions[0].name);\r\n\r\n\t\tstate = addFilter(state)(filterKey, [dimensions[0].name])\r\n\t\treturn filterSet;\r\n\t}\r\n\r\n\tstate.filters = {};\r\n\tstate.selectedHhses = maybeSetDefaultFilter(DashboardFilterKeys.HHS.key, state.chartData.level1.hhses);\r\n\tstate.selectedFacilities = maybeSetDefaultFilter(DashboardFilterKeys.Facility.key, state.chartData.level1.facilities);\r\n\r\n\treturn { ... state };\r\n\r\n}\r\n\r\n\r\n\r\nexport const closeAMLDashboard = () =>\r\n\tDashWorker.stop();\r\n\r\nconst fetchData = async (state: IAMLDashboard, all: boolean): Promise => {\r\n\ttry {\r\n\t\tconst data = await DashWorker.fetch(all);\r\n\r\n\t\tconst maybeSetDefaultFilter = (filterKey: string, dimensions: { name: string }[]): Set => {\r\n\t\t\tif (!dimensions || dimensions.length !== 1)\r\n\t\t\t\treturn (new Set());\r\n\r\n\t\t\tif (all)\r\n\t\t\t\treturn (new Set());\r\n\r\n\t\t\tlet filterSet = new Set();\r\n\t\t\tfilterSet.add(dimensions[0].name);\r\n\r\n\t\t\tstate = addFilter(state)(filterKey, [dimensions[0].name])\r\n\t\t\treturn filterSet;\r\n\t\t}\r\n\r\n\t\tstate.selectedHhses = maybeSetDefaultFilter(DashboardFilterKeys.HHS.key, data.chartData.level1.hhses);\r\n state.selectedFacilities = maybeSetDefaultFilter(DashboardFilterKeys.Facility.key, data.chartData.level1.facilities);\r\n\t\tstate.allData = all;\r\n\t\tstate.references = data.references;\r\n\t\tstate.chartData = data.chartData;\r\n\t\t\r\n\t\treturn state;\r\n\t} catch {\r\n\t\tconsole.error(\"WORKER FETCHDATA FAILED\");\r\n\t\treturn state;\r\n\t}\r\n}\r\n\r\nexport const computeChartData = async (state: IAMLDashboard): Promise => {\r\n\ttry {\r\n\t\tconst data = await DashWorker.chartData(state.filters);\r\n\t\tstate.chartData = data;\r\n\t\treturn {...state};\r\n\t} catch {\r\n\t\tconsole.error(\"WORKER COMPUTECHARTDATA FAILED\")\r\n\t\treturn state;\r\n\t}\r\n}\r\n\r\nexport const addFilter = (state: IAMLDashboard) => (key: keyof typeof DashboardFilterKeys, value: string | string[], context?: FilterContext, labelOverride?: string): IAMLDashboard => {\r\n\tconst filters: Filters = Object.assign({}, state.filters);\r\n\tconst values = (typeof value === \"string\")\r\n\t\t? [value]\r\n\t\t: value;\r\n\r\n\t//Replace the existing path entry if we are replacing a multi-value filter\r\n\t//to do so: traverse to the parent\r\n\tconst baseContext: FilterContext = context && ((context.values().length > 1) ? context.parent() : context) || new FilterContext();\r\n\tbaseContext.push(values);\r\n\r\n\tfilters[key] = ({ value: values, labelOverride, parts: baseContext.parts });\r\n\r\n\tstate.filters = filters;\r\n\r\n\treturn {...state};\r\n}\r\n\r\n\r\nexport const removeFilter = (state: IAMLDashboard, key: keyof typeof DashboardFilterKeys, value?: string, labelOverride?: string): IAMLDashboard => {\r\n\tconst filters: Filters = Object.assign({}, state.filters);\r\n\tconst valueToRemove: string = value || null;\r\n\tconst context = FilterContext.fromFilters(filters, key);\r\n\tconst values = context.values();\r\n\tconst newValue = (valueToRemove ? values.filter(p => p != valueToRemove): null);\r\n\r\n\tconst n = context.parent() || new FilterContext();\r\n\tif (newValue) {\r\n\t\tn.push(newValue);\r\n\t}\r\n\tfilters[key] = ({value: n.values(), labelOverride, parts: n.parts});\r\n\r\n\tif (n.parts.length === 0) {\r\n\t\tdelete filters[key];\r\n\t}\r\n\r\n\tstate.filters = filters;\r\n\treturn {...state};\r\n}","import * as React from \"react\"\r\nimport * as AML from \"models/aml\";\r\nimport { AppContext } from \"AppContext\";\r\nimport { ActionTypes } from \"reducer/actions\";\r\nimport { Button, Paper, Table, TableBody, TableCell, TableContainer, TableHead, TableRow } from \"@mui/material\";\r\nimport { Link } from \"react-scroll\";\r\nimport { FilterContext } from \"models/core/filter\";\r\nimport { DashChip } from \"components/common/DashChips\";\r\nimport ReportApi from \"api/reportApi\";\r\nimport * as fileHelper from \"helpers/fileHelper\";\r\nimport { Download, Downloading } from \"@mui/icons-material\";\r\nimport { AMLIndicatorDefinitionsUrl } from \"config/appUrlConfig\";\r\nimport { getStateIndicatorReferences } from \"api/dashboardApi\";\r\nimport Loader from \"pages/shared/pageloader\";\r\n\r\nenum AMLIndicatorAction {\r\n\tUserClickedDownloadIndicator,\r\n\tDownloadIndicatorSuccess,\r\n\tDownloadIndicatorFail\r\n}\r\n\r\ntype Action =\r\n\t{ type: AMLIndicatorAction.UserClickedDownloadIndicator, payload: number }\r\n\t| { type: AMLIndicatorAction.DownloadIndicatorSuccess }\r\n\t| { type: AMLIndicatorAction.DownloadIndicatorFail }\r\n\r\n\r\ninterface State {\r\n\tindicator: number\r\n}\r\n\r\nconst initialState: State = {\r\n\tindicator: 0\r\n}\r\n\r\n\r\n\r\nconst reducer = (state: State, action: Action): State => {\r\n\tconst { type } = action;\r\n\r\n\tswitch (type) {\r\n\t\tcase AMLIndicatorAction.UserClickedDownloadIndicator:\r\n\t\t\treturn { ...state, ...{ indicator: action.payload } };\r\n\r\n\t\tcase AMLIndicatorAction.DownloadIndicatorSuccess:\r\n\t\tcase AMLIndicatorAction.DownloadIndicatorFail:\r\n\t\t\treturn { ...state, ...{ indicator: 0 } };\r\n\r\n\t\tdefault:\r\n\t\t\treturn state;\r\n\t}\r\n}\r\n\r\nlet stateWideData: {\r\n\ttitle?: string;\r\n\tpatients?: string;\r\n\tapmlPatients?: string;\r\n\tbmatBeforeFirstTreat?: string;\r\n\tflt3BeforeFirstTreat?: string;\r\n\thadIVST?: string;\r\n\tfirstTreat0To5Days?: string;\r\n\tfirstTreat6To10Days?: string;\r\n\tfirstTreat11To15Days?: string;\r\n\tfirstTreatMoreThan15Days?: string;\r\n\thadBMT?: string;\r\n\tbmt0To3Months?: string;\r\n\tbmt3To6Months?: string;\r\n\tbmt6To9Months?: string;\r\n\tbmt9To12Months?: string;\r\n\tlengthOfStayBMT?: string;\r\n\toneYearSurvival?: string;\r\n\ttwoYearSurvival?: string;\r\n\tfiveYearSurvival?: string;\r\n\tmortality30Days?: string;\r\n\tmortality31To365Days?: string;\r\n} = {};\r\n\r\n\r\nexport function AMLDashboard() {\r\n\tconst [localState, localDispatch] = React.useReducer(reducer, initialState)\r\n\tconst { state, dispatch } = React.useContext(AppContext);\r\n\r\n\r\n\tconst [showFilterChips, setFilterChips] = React.useState(true);\r\n\r\n\tconst addFilter: AML.AddFilterFunc = async (key: keyof typeof AML.DashboardFilterKeys, value: string | string[], context?: FilterContext, labelOverride?: string) => {\r\n\t\tconst filteredDashboard = await AML.computeChartData(AML.addFilter(state.page.dashboard as AML.IAMLDashboard)(key, value, context, labelOverride)); // state = what the other filter function returns \r\n\t\tdispatch({ type: ActionTypes.UserClickedOnChart, payload: filteredDashboard });\r\n\t}\r\n\r\n\tconst removeFilter: AML.RemoveFilterFunc = async (key: keyof typeof AML.DashboardFilterKeys, value?: string) => {\r\n\t\tconst filteredDashboard = await AML.computeChartData(AML.removeFilter(state.page.dashboard as AML.IAMLDashboard, key, value));\r\n\t\tdispatch({ type: ActionTypes.UserClickedOnChart, payload: filteredDashboard });\r\n\t}\r\n\r\n\tReact.useEffect(() => {\r\n\t\tdispatch({ type: ActionTypes.UserWantsToLoadMdtDashboard });\r\n\t\tconst fetchStateReferenceData = async () => {\r\n\t\t\tstateWideData = await getStateIndicatorReferences(\"aml\");\r\n\t\t}\r\n\r\n\t\tconst loadDashboard = async () => {\r\n\t\t\tconst value = await AML.loadAMLDashboard(state.page.dashboard as AML.IAMLDashboard);\r\n\t\t\tdispatch({ type: ActionTypes.UserLoadedMdtDashboard, payload: value });\r\n\t\t}\r\n\r\n\t\tPromise.all([fetchStateReferenceData(), loadDashboard()]);\r\n\t\treturn () => {\r\n\t\t\tAML.closeAMLDashboard();\r\n\t\t}\r\n\t}, []);\r\n\r\n\tReact.useEffect(() => {\r\n\t\tif (localState.indicator == 0)\r\n\t\t\treturn;\r\n\r\n\t\tlet ids = AMLChartData.level1.filteredReferralIdCsv;\r\n\t\tlet alldata = false;\r\n\r\n\r\n\t\tconst getAMLIndicatorPatientList = async () => {\r\n\t\t\ttry {\r\n\t\t\t\tconst data = await ReportApi.getAMLIndicatorPatientList(ids, alldata, localState.indicator);\r\n\t\t\t\tif (data.errorMessage) {\r\n\t\t\t\t\tconsole.error(data.errorMessage);\r\n\t\t\t\t\tlocalDispatch({ type: AMLIndicatorAction.DownloadIndicatorFail })\r\n\t\t\t\t}\r\n\t\t\t\tlocalDispatch({ type: AMLIndicatorAction.DownloadIndicatorSuccess })\r\n\t\t\t\treturn fileHelper.showFile(data.bytes, data.filename, fileHelper.fileTypeToMimeType(data.filetype), \"exportPatientsElem\")\r\n\t\t\t} catch {\r\n\t\t\t\tlocalDispatch({ type: AMLIndicatorAction.DownloadIndicatorFail })\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tgetAMLIndicatorPatientList();\r\n\r\n\r\n\t}, [localState.indicator]);\r\n\r\n\r\n\tif (state.page.loading || !state.page.dashboard.chartData)\r\n\t\treturn \r\n\r\n\t//Create function to show/hide filter chips\r\n\tconst toggleChips = () => {\r\n\t\tif (showFilterChips) {\r\n\t\t\tsetFilterChips(false);\r\n\t\t} else {\r\n\t\t\tsetFilterChips(true);\r\n\t\t}\r\n\t};\r\n\r\n\tlet activeFiltersArray = [];\r\n\tlet filterArray = [];\r\n\tlet chips = [];\r\n\r\n\tfor (const key in state.page.dashboard.filters) {\r\n\t\tif (Object.prototype.hasOwnProperty.call(state.page.dashboard.filters, key)) {\r\n\t\t\tactiveFiltersArray.push({ \"key\": key, \"values\": state.page.dashboard.filters[key].value, \"parts\": state.page.dashboard.filters[key].parts });\r\n\t\t}\r\n\t}\r\n\r\n\tfor (const key in AML.DashboardFilterKeys) {\r\n\t\tif (Object.prototype.hasOwnProperty.call(AML.DashboardFilterKeys, key)) {\r\n\t\t\tfilterArray.push({ \"key\": key, \"label\": AML.DashboardFilterKeys[key].label });\r\n\t\t}\r\n\t}\r\n\r\n\tactiveFiltersArray.forEach(a => {\r\n\t\ta.values.forEach(b => {\r\n\t\t\tchips.push( id.key == a.key).label}\r\n\t\t\t\tfilterValue={b}\r\n\t\t\t\tfilterId={a.key}\r\n\t\t\t\tfilterParent={(a.parts.length > 1 ? a.parts[0] : null)}\r\n\t\t\t/>\r\n\t\t\t)\r\n\t\t})\r\n\t})\r\n\r\n\tconst AMLChartData = state.page.dashboard.chartData as AML.IChartData;\r\n\r\n\r\n\r\n\tconst downloadBtn = (extractTypeId: number) => {\r\n\t\tconst { indicator } = localState;\r\n\r\n\t\tif (indicator == extractTypeId)\r\n\t\t\treturn \r\n\r\n\t\treturn (\r\n\t\t\t\r\n\t\t\t\tlocalDispatch({ type: AMLIndicatorAction.UserClickedDownloadIndicator, payload: extractTypeId })} />\r\n\t\t)\r\n\t}\r\n\r\n\tconst ecog = {\r\n\t\tnumerator: 0,\r\n\t\tdenominator: 0,\r\n\t\tpercentage: 0\r\n\t}\r\n\r\n\tconst stage = {\r\n\t\tnumerator: 0,\r\n\t\tdenominator: 0,\r\n\t\tpercentage: 0\r\n\t}\r\n\r\n\tif (AMLChartData.level1.totalDiagnoses > 0) {\r\n\t\tecog.numerator = AMLChartData.level1.totalDiagnoses - (AMLChartData.level2.ecogGroup.values[AMLChartData.level2.ecogGroup.labels.indexOf(\"Unk\")] || 0);\r\n\t\tecog.denominator = AMLChartData.level1.totalDiagnoses\r\n\t\tecog.percentage = ecog.numerator / ecog.denominator * 100\r\n\r\n\t\tstage.numerator = AMLChartData.level1.totalDiagnoses - (AMLChartData.level2.tnmStage.values[AMLChartData.level2.tnmStage.labels.indexOf(\"Unk\")] || 0);\r\n\t\tstage.denominator = AMLChartData.level1.totalDiagnoses;\r\n\t\tstage.percentage = stage.numerator / stage.denominator * 100\r\n\t}\r\n\r\n\r\n\tconst dashboard = <>\r\n\t\t
\r\n\r\n\r\n\t\t\t{(showFilterChips ?
\r\n\t\t\t\t{chips}\r\n\t\t\t
: null)}\r\n\t\t
\r\n\r\n\r\n\r\n\t\t
\r\n\r\n\t\t\t
\r\n\t\t\t\t\r\n\t\t\t
\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tIndicator\r\n\t\t\t\t\t\t\tMy MDT(s)\r\n\t\t\t\t\t\t\t{stateWideData.title}*\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tPrimary AML (excluding APML) diagnoses*\r\n\t\t\t\t\t\t\t{`${AMLChartData.level1.totalDiagnoses}`}\r\n\t\t\t\t\t\t\t{stateWideData.patients}\r\n\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tAPML diagnoses*\r\n\t\t\t\t\t\t\t{`${AMLChartData.level1.hadAPML}`}\r\n\t\t\t\t\t\t\t{stateWideData.apmlPatients}\r\n\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tPercentage of patients with ECOG\r\n\t\t\t\t\t\t\t{`${ecog.percentage.toFixed(0)}%`}
{`(${ecog.numerator}/${ecog.denominator})`}
\r\n\t\t\t\t\t\t\t-\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t{/* \r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tDiagnosis\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tReceived bone marrow aspirate and trephine (BMAT) biopsy prior to first treatment\r\n\t\t\t\t\t\t\t{`${AMLChartData.level1.bmatBeforeFirstTreat.percentage.toFixed(0)}%`}
{`(${AMLChartData.level1.bmatBeforeFirstTreat.numerator}/${AMLChartData.level1.bmatBeforeFirstTreat.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.bmatBeforeFirstTreat}\r\n\t\t\t\t\t\t
\r\n\r\n \r\n\t\t\t\t\t\t\tReceived FLT3 test prior to first treatment\r\n\t\t\t\t\t\t\t{`${AMLChartData.level1.flt3BeforeFirstTreat.percentage.toFixed(0)}%`}
{`(${AMLChartData.level1.flt3BeforeFirstTreat.numerator}/${AMLChartData.level1.flt3BeforeFirstTreat.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.flt3BeforeFirstTreat}\r\n\r\n\t\t\t\t\t\t
*/}\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\tSystemic therapy\r\n\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tHad IV systemic therapy\r\n\t\t\t\t\t\t\t{`${AMLChartData.level1.hadIVST.percentage.toFixed(0)}%`}
{`(${AMLChartData.level1.hadIVST.numerator}/${AMLChartData.level1.hadIVST.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.hadIVST}\r\n\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tReceived 1st treatment within 0-5 days of diagnosis\r\n\t\t\t\t\t\t\t{`${AMLChartData.level1.firstTreat0To5Days.percentage.toFixed(0)}%`}
{`(${AMLChartData.level1.firstTreat0To5Days.numerator}/${AMLChartData.level1.firstTreat0To5Days.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.firstTreat0To5Days}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tReceived 1st treatment within 6-10 days of diagnosis\r\n\t\t\t\t\t\t\t{`${AMLChartData.level1.firstTreat6To10Days.percentage.toFixed(0)}%`}
{`(${AMLChartData.level1.firstTreat6To10Days.numerator}/${AMLChartData.level1.firstTreat6To10Days.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.firstTreat6To10Days}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tReceived 1st treatment within 11-15 days of diagnosis\r\n\t\t\t\t\t\t\t{`${AMLChartData.level1.firstTreat11To15Days.percentage.toFixed(1)}%`}
{`(${AMLChartData.level1.firstTreat11To15Days.numerator}/${AMLChartData.level1.firstTreat11To15Days.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.firstTreat11To15Days}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tReceived 1st treatment more than 15 days from diagnosis\r\n\t\t\t\t\t\t\t{`${AMLChartData.level1.firstTreatMoreThan15Days.percentage.toFixed(0)}%`}
{`(${AMLChartData.level1.firstTreatMoreThan15Days.numerator}/${AMLChartData.level1.firstTreatMoreThan15Days.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.firstTreatMoreThan15Days}\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tReceived bone marrow transplant\r\n\t\t\t\t\t\t\t{`${AMLChartData.level1.hadBMT.percentage.toFixed(0)}%`}
{`(${AMLChartData.level1.hadBMT.numerator}/${AMLChartData.level1.hadBMT.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.hadBMT}\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tReceived BMT within 0-<3 months of diagnosis\r\n\t\t\t\t\t\t\t{`${AMLChartData.level1.bmt0To3Months.percentage.toFixed(1)}%`}
{`(${AMLChartData.level1.bmt0To3Months.numerator}/${AMLChartData.level1.bmt0To3Months.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.bmt0To3Months}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tReceived BMT within 3-<6 months of diagnosis\r\n\t\t\t\t\t\t\t{`${AMLChartData.level1.bmt3To6Months.percentage.toFixed(0)}%`}
{`(${AMLChartData.level1.bmt3To6Months.numerator}/${AMLChartData.level1.bmt3To6Months.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.bmt3To6Months}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tReceived BMT within 6-<9 months of diagnosis\r\n\t\t\t\t\t\t\t{`${AMLChartData.level1.bmt6To9Months.percentage.toFixed(0)}%`}
{`(${AMLChartData.level1.bmt6To9Months.numerator}/${AMLChartData.level1.bmt6To9Months.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.bmt6To9Months}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tReceived BMT within 9-<12 months of diagnosis\r\n\t\t\t\t\t\t\t{`${AMLChartData.level1.bmt9To12Months.percentage.toFixed(1)}%`}
{`(${AMLChartData.level1.bmt9To12Months.numerator}/${AMLChartData.level1.bmt9To12Months.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.bmt9To12Months}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tLength of stay for bone marrow transplant (days)\r\n\t\t\t\t\t\t\t{`${AMLChartData.level1.lengthOfStayBMT.median}`}
{`(${AMLChartData.level1.lengthOfStayBMT.min} - ${AMLChartData.level1.lengthOfStayBMT.max})`}
\r\n\t\t\t\t\t\t\t{stateWideData.lengthOfStayBMT}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tOne year survival^\r\n\t\t\t\t\t\t\t{`${AMLChartData.level1.oneYearSurvival.percentage.toFixed(0)}%`}
{`(${AMLChartData.level1.oneYearSurvival.numerator}/${AMLChartData.level1.oneYearSurvival.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.oneYearSurvival}\r\n\t\t\t\t\t\t
\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tTwo year survival^\r\n\t\t\t\t\t\t\t{`${AMLChartData.level1.twoYearSurvival.percentage.toFixed(0)}%`}
{`(${AMLChartData.level1.twoYearSurvival.numerator}/${AMLChartData.level1.twoYearSurvival.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.twoYearSurvival}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\tFive year survival^\r\n\t\t\t\t\t\t\t{`${AMLChartData.level1.fiveYearSurvival.percentage.toFixed(0)}%`}
{`(${AMLChartData.level1.fiveYearSurvival.numerator}/${AMLChartData.level1.fiveYearSurvival.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.fiveYearSurvival}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t30 day mortality from first treatment\r\n\t\t\t\t\t\t\t{`${AMLChartData.level1.mortality30Days.percentage.toFixed(1)}%`}
{`(${AMLChartData.level1.mortality30Days.numerator}/${AMLChartData.level1.mortality30Days.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.mortality30Days}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t31-365 day mortality from first treatment\r\n\t\t\t\t\t\t\t{`${AMLChartData.level1.mortality31To365Days.percentage.toFixed(0)}%`}
{`(${AMLChartData.level1.mortality31To365Days.numerator}/${AMLChartData.level1.mortality31To365Days.denominator})`}
\r\n\t\t\t\t\t\t\t{stateWideData.mortality31To365Days}\r\n\t\t\t\t\t\t
\r\n\r\n\t\t\t\t\t
\r\n\t\t\t\t
\r\n\t\t\t
\r\n\r\n\r\n\t\t\t
\r\n\t\t\t\t

*Patients in MDT include all diagnoses that have been presented to MDT and no exclusions have been made.\r\n\t\t\t\t\tIn contrast, the report presents the incidence case of the AML diagnosis and in addition, de novo cases.\r\n\t\t\t\t\tTherefore, exclusions have been made based on previous AML diagnosis, prior systemic therapy and/or radiotherapy treatment,\r\n\t\t\t\t\tdiagnosis of myeloproliferative disorder, aplastic anaemia and/or myelodysplastic syndrome.\r\n\t\t\t\t\tRate of APML diagnosis has been presented but excluded from all other analysis.\r\n\t\t\t\t\t\r\n\t\t\t\t\tData based on the facility of MDT

\r\n\t\t\t
\r\n\r\n\t\t\t
\r\n\t\t\t\t

^Patients with less than one, two, and five years of data from diagnosis are excluded from the one, two, and five year survival indicators respectively.

\r\n\t\t\t
\r\n\r\n\t\t\t
\r\n\t\t\t\t

This report is based on the Queensland AML Cancer Quality Index 2011-2020. Indicator definitions and glossary can be found here also

\r\n\t\t\t
\r\n\r\n\t\t
\r\n\r\n\t\t\r\n\r\n\t\r\n\r\n\treturn (\r\n\t\tdashboard\r\n\t)\r\n\r\n\r\n} ","import * as React from \"react\"\r\nimport * as AML from \"models/aml\";\r\nimport { AppContext } from \"AppContext\";\r\nimport { ActionTypes } from \"reducer/actions\";\r\nimport { Box, Button, Typography } from \"@mui/material\";\r\nimport { FilterContext } from \"models/core/filter\";\r\nimport Select from \"react-select\";\r\nimport { SideBySideButton } from \"components/common/SideBySideOptions\";\r\nimport { exportMdtPatients } from \"models/mdt/worker\";\r\nimport * as fileHelper from \"helpers/fileHelper\";\r\nimport Loader from \"pages/shared/filterloader\";\r\n\r\nexport function AMLFilters() {\r\n\tconst { state, dispatch } = React.useContext(AppContext);\r\n\r\n\tconst addFilter: AML.AddFilterFunc = async (key: keyof typeof AML.DashboardFilterKeys, value: string | string[], context?: FilterContext, labelOverride?: string) => {\r\n\t\tconst filteredDashboard = await AML.computeChartData(AML.addFilter(state.page.dashboard as AML.IAMLDashboard)(key, value, context, labelOverride)); // state = what the other filter function returns \r\n\t\tdispatch({ type: ActionTypes.UserClickedOnChart, payload: filteredDashboard });\r\n\t}\r\n\r\n\tconst removeFilter: AML.RemoveFilterFunc = async (key: keyof typeof AML.DashboardFilterKeys) => {\r\n\r\n\t\tconst filteredDashboard = await AML.computeChartData(AML.removeFilter(state.page.dashboard as AML.IAMLDashboard, key));\r\n\t\tdispatch({ type: ActionTypes.UserClickedOnChart, payload: filteredDashboard });\r\n\t}\r\n\r\n\tif (state.page.loading)\r\n\t\treturn \r\n\r\n\tconst dataForFilters = state.page.dashboard.chartData as AML.IChartData;\r\n\t//HHS \r\n\t//HHS Options\r\n\tconst hhsOptions: any[] = [];\r\n\tdataForFilters?.level1.hhses.map(p => {\r\n\t\thhsOptions.push({ label: p.name, value: p.id });\r\n\t})\r\n\r\n\t//Filtered HHSes\r\n\tlet hhsSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.HHS?.value?.map(p => {\r\n\t\thhsSelections.push({ label: p, value: hhsOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\t//Add code to be able to filter list of facilities to a chosen HHS\r\n\tlet selectedHHSIds = [];\r\n\tif (hhsSelections.length > 0) {\r\n\t\tselectedHHSIds = hhsSelections.map(a =>\r\n\t\t\ta.value);\r\n\t}\r\n\r\n\t//Facility \r\n\t//Facility Options\r\n\tconst facilityOptions: any[] = [];\r\n\tif (hhsSelections.length > 0) {\r\n\t\tdataForFilters?.level1.facilities.filter(a => selectedHHSIds.includes(a.hhsId)).map(p => {\r\n\t\t\tfacilityOptions.push({ label: p.name, value: p.facilityId });\r\n\t\t})\r\n\t} else {\r\n\t\tdataForFilters?.level1.facilities.map(p => {\r\n\t\t\tfacilityOptions.push({ label: p.name, value: p.facilityId });\r\n\t\t});\r\n\t}\r\n\r\n\t//Filtered facilities\r\n\tlet facilitySelections: any[] = [];\r\n\tstate.page.dashboard.filters?.Facility?.value?.map(p => {\r\n\t\tfacilitySelections.push({ label: p, value: facilityOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\t//Add code to be able to filter list of Mdts to a chosen Facilities\r\n\tlet selectedFacilityIds = [];\r\n\tif (facilitySelections.length > 0) {\r\n\t\tselectedFacilityIds = facilitySelections.map(a =>\r\n\t\t\ta.value);\r\n\t}\r\n\r\n\t//MDTs\r\n\t//Options\r\n\tconst mdtOptions: any[] = [];\r\n\tif (facilitySelections.length > 0) {\r\n\t\tdataForFilters?.level1.mdts.filter(a => selectedFacilityIds.includes(a.facilityId)).map(p => {\r\n\t\t\tmdtOptions.push({ label: p.nameAndFacility, value: p.mdtNameId });\r\n\t\t})\r\n\t} else {\r\n\t\tdataForFilters?.level1.mdts.map(p => {\r\n\t\t\tmdtOptions.push({ label: p.nameAndFacility, value: p.mdtNameId });\r\n\t\t})\r\n\t}\r\n\r\n\t//Filtered MDTs\r\n\tlet mdtSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.Mdt?.value?.map(p => {\r\n\t\tmdtSelections.push({ label: p, value: mdtOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\t//let { path } = state.page.dashboard.chartData.reviewsByPeriod;\r\n\t//let parts = FilterContext.fromPath(path).parts;\r\n\r\n\t//Months\r\n\t//Options\r\n\tconst monthOptions: any[] = [];\r\n\tdataForFilters?.level1.month.map(p => {\r\n\t\tmonthOptions.push({ label: p.name, value: p.id });\r\n\t})\r\n\r\n\t//Filtered MDT months\r\n\tlet mdtMonthSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.MdtMonth?.value?.map(p => {\r\n\t\tmdtMonthSelections.push({\r\n\t\t\tlabel: p,\r\n\t\t\tvalue: monthOptions.find(a => a.label == p)?.value\r\n\t\t});\r\n\t})\r\n\r\n\t//Filtered diagnosis months\r\n\tlet diagMonthSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.DiagnosisMonth?.value?.map(p => {\r\n\t\tdiagMonthSelections.push({ label: p, value: monthOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\t//Years\r\n\t//MDT Year options\r\n\tconst mdtYearOptions: any[] = [];\r\n\tdataForFilters?.level1.year.map(p => {\r\n\t\tif (p.id >= 2010) {\r\n\t\t\tmdtYearOptions.push({ label: p.name, value: p.id });\r\n\t\t}\r\n\t})\r\n\r\n\t//Diagnosis year options\r\n\tconst diagYearOptions: any[] = [];\r\n\tdataForFilters?.level1.year.map(p => {\r\n\t\tdiagYearOptions.push({ label: p.name, value: p.id });\r\n\t})\r\n\r\n\t//Filtered year selections\r\n\tlet mdtYearSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.MdtYear?.value?.map(p => {\r\n\t\tmdtYearSelections.push({\r\n\t\t\tlabel: p,\r\n\t\t\tvalue: mdtYearOptions.find(a => a.label == p)?.value\r\n\t\t});\r\n\t})\r\n\r\n\t//Filtered diagnosis selections\r\n\tlet diagYearSelections: any[] = [];\r\n\tstate.page.dashboard.filters?.DiagnosisYear?.value?.map(p => {\r\n\t\tdiagYearSelections.push({ label: p, value: diagYearOptions.find(a => a.label == p).value });\r\n\t})\r\n\r\n\t//State for side by side button \r\n\tconst [viewBy, setViewBy] = React.useState(diagYearSelections.length > 0 ? \"Diagnosis Year\" : \"MDT Year\");\r\n\r\n\treturn (\r\n\t\t<>\r\n\t\t\t\r\n\t\t\t\tHHS\r\n\t\t\t\t {\r\n\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\tremoveFilter(AML.DashboardFilterKeys.HHS.key);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\taddFilter(AML.DashboardFilterKeys.HHS.key, filterValues);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t}),\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t\r\n\r\n\r\n\t\t\t\r\n\t\t\t\tFacility\r\n\t\t\t\t {\r\n\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\tremoveFilter(AML.DashboardFilterKeys.Facility.key);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\taddFilter(AML.DashboardFilterKeys.Facility.key, filterValues);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t}),\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t\r\n\r\n\r\n\t\t\t\r\n\t\t\t\tMDT\r\n\t\t\t\t {\r\n\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\tremoveFilter(AML.DashboardFilterKeys.Mdt.key);\r\n\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\taddFilter(AML.DashboardFilterKeys.Mdt.key, filterValues);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}}\r\n\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t}),\r\n\t\t\t\t\t}}\r\n\t\t\t\t/>\r\n\t\t\t\r\n\r\n\t\t\t\r\n\t\t\t\tView By\r\n\t\t\t\t {\r\n\t\t\t\t\t\tsetViewBy(p)\r\n\t\t\t\t\t}}\r\n\r\n\t\t\t\t/>\r\n\t\t\t\r\n\r\n\t\t\t{(viewBy == \"MDT Year\" ?\r\n\t\t\t\t<>\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tMDT Year\r\n\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\t\t\tremoveFilter(AML.DashboardFilterKeys.MdtYear.key);\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\taddFilter(AML.DashboardFilterKeys.MdtYear.key, filterValues);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tMDT Month\r\n\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\t\t\tremoveFilter(AML.DashboardFilterKeys.MdtMonth.key);\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\taddFilter(AML.DashboardFilterKeys.MdtMonth.key, filterValues);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t:\r\n\t\t\t\t<>\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tDiagnosis Year\r\n\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\t\t\tremoveFilter(AML.DashboardFilterKeys.DiagnosisYear.key);\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\taddFilter(AML.DashboardFilterKeys.DiagnosisYear.key, filterValues);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\r\n\t\t\t\t\t\r\n\t\t\t\t\t\tDiagnosis Month\r\n\t\t\t\t\t\t {\r\n\t\t\t\t\t\t\t\tconst selected: any = p;\r\n\t\t\t\t\t\t\t\tlet filterValues: string[] = [];\r\n\t\t\t\t\t\t\t\tselected.forEach(a => filterValues.push(a.label));\r\n\r\n\t\t\t\t\t\t\t\tif (filterValues.length == 0) {\r\n\t\t\t\t\t\t\t\t\tremoveFilter(AML.DashboardFilterKeys.DiagnosisMonth.key);\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\taddFilter(AML.DashboardFilterKeys.DiagnosisMonth.key, filterValues);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t\tplaceholder={\"All\"}\r\n\t\t\t\t\t\t\tcloseMenuOnSelect={false}\r\n\t\t\t\t\t\t\tstyles={{\r\n\t\t\t\t\t\t\t\tplaceholder: (base) => ({\r\n\t\t\t\t\t\t\t\t\t...base,\r\n\t\t\t\t\t\t\t\t\tcolor: \"black\",\r\n\t\t\t\t\t\t\t\t}),\r\n\t\t\t\t\t\t\t}}\r\n\t\t\t\t\t\t/>\r\n\t\t\t\t\t\r\n\r\n\r\n\t\t\t\t\r\n\t\t\t)}\r\n\r\n\r\n\t\t\t{/* \r\n\t\t\t\t{(Object.keys(state.page.dashboard.filters).length !== 0 ?\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\texportMdtPatients(dataForFilters.level1.filteredReferralIdCsv, false)\r\n\t\t\t\t\t\t\t\t.then(data => {\r\n\t\t\t\t\t\t\t\t\tif (data.errorMessage) {\r\n\t\t\t\t\t\t\t\t\t\tthrow data.errorMessage;\r\n\t\t\t\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\t\t\t\treturn fileHelper.showFile(data.bytes, data.filename, fileHelper.fileTypeToMimeType(data.filetype), \"exportMdtPatientsElem\")\r\n\t\t\t\t\t\t\t\t})\r\n\t\t\t\t\t\t\t\t.catch(err => console.log(err))\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t>Download Patient List\r\n\t\t\t\t\t :\r\n\r\n\t\t\t\t\t
Make a filter selection in order to download patient list
)}\r\n\t\t\t
*/}\r\n\r\n\t\t\t{/* */}\r\n\t\t\r\n\t)\r\n}\r\n\r\n","import { AMLDashboard } from \"./dashboard\";\r\nimport { AMLFilters } from \"./filters\";\r\nimport * as React from \"react\";\r\n\r\nexport { AMLFilters }\r\n\r\n\r\nexport class AMLDashboardHome extends React.Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n\r\n this.state = {\r\n width: 0,\r\n height: 0\r\n }; \r\n \r\n }\r\n\r\n private updateDimensions = () => {\r\n this.setState({ width: window.innerWidth, height: window.innerHeight });\r\n };\r\n \r\n public componentWillUnmount() {\r\n window.removeEventListener('resize', this.updateDimensions);\r\n }\r\n \r\n public componentDidMount() {\r\n window.addEventListener('resize', this.updateDimensions);\r\n }\r\n\r\n render = () => {\r\n return (\r\n <>\r\n \r\n \r\n )\r\n\r\n }\r\n}\r\n","import * as React from \"react\";\r\nimport Header from \"pages/shared/header\";\r\nimport Box from \"@mui/material/Box\";\r\n\r\nimport { AppProvider } from \"AppContext\";\r\nimport AuthProvider from \"AuthContext\";\r\nimport { Route, Routes } from \"react-router-dom\";\r\n\r\n// Hocs\r\nimport Authenticate from \"pages/authenticate\";\r\nimport RequireAuth from \"pages/authenticate/requireAuth\";\r\n\r\n\r\n// Pages\r\nimport Page from \"pages/shared/page\";\r\nimport { MdtFilters, MdtDashboardHome } from \"pages/mdt\";\r\nimport { NoMdtFilters, NoMdtDashboardHome } from \"pages/noMdt\";\r\nimport { BreastFilters, BreastDashboardHome } from \"pages/breast\"; \r\nimport { CrcFilters, CrcDashboardHome } from \"pages/crc\";\r\nimport { BrainFilters, BrainDashboardHome } from \"pages/brain\";\r\nimport { LungDashboardHome, LungFilters } from \"pages/lung\";\r\nimport { HeadAndNeckDashboardHome, HeadAndNeckFilters } from \"pages/headAndNeck\";\r\nimport { YouthCancerDashboardHome, YouthCancerFilters } from \"pages/youthCancer\";\r\nimport { AMLDashboardHome, AMLFilters } from \"pages/aml\";\r\n\r\nimport * as MDT from \"models/mdt\";\r\nimport * as NoMDT from \"models/noMdt\";\r\nimport * as CRC from \"models/crc\";\r\nimport * as Breast from \"models/breast\";\r\nimport * as Lung from \"models/lung\";\r\nimport * as Brain from \"models/brain\";\r\nimport * as HAN from \"models/headAndNeck\";\r\nimport * as YC from \"models/youthCancer\";\r\nimport * as AML from \"models/aml\";\r\n\r\n\r\n\r\n\r\nfunction App() {\r\n return (\r\n <>\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\t
\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t} clearFilters={MDT.clearFilters} computeChartData={MDT.computeChartData} filterDrawer={} loadData={MDT.loadMdtDashboard}/>}/>\r\n\t\t\t\t\t\t\t} clearFilters={MDT.clearFilters} computeChartData={MDT.computeChartData} filterDrawer={} loadData={MDT.loadMdtDashboard}/>}/>\r\n\t\t\t\t\t\t\t} clearFilters={NoMDT.clearFilters} computeChartData={NoMDT.computeChartData} filterDrawer={} loadData={NoMDT.loadMdtDashboard}/>}/>\r\n\t\t\t\t\t\t\t} clearFilters={Breast.clearFilters} computeChartData={Breast.computeChartData} filterDrawer={} loadData={Breast.loadBreastDashboard}/>}/>\r\n\t\t\t\t\t\t\t} clearFilters={Lung.clearFilters} computeChartData={Lung.computeChartData} filterDrawer={} loadData={Lung.loadLungDashboard}/>}/>\r\n\t\t\t\t\t\t\t} clearFilters={CRC.clearFilters} computeChartData={CRC.computeChartData} filterDrawer={} loadData={CRC.loadMdtDashboard}/>}/>\r\n\t\t\t\t\t\t\t} clearFilters={Brain.clearFilters} computeChartData={Brain.computeChartData} filterDrawer={} loadData={Brain.loadBrainDashboard}/>}/>\r\n\t\t\t\t\t\t\t} clearFilters={HAN.clearFilters} computeChartData={HAN.computeChartData} filterDrawer={} loadData={HAN.loadHeadAndNeckDashboard}/>}/>\r\n\t\t\t\t\t\t\t} clearFilters={YC.clearFilters} computeChartData={YC.computeChartData} filterDrawer={} loadData={YC.loadYouthCancerDashboard}/>}/>\r\n\t\t\t\t\t\t\t} clearFilters={AML.clearFilters} computeChartData={AML.computeChartData} filterDrawer={} loadData={AML.loadAMLDashboard}/>}/>\r\n\t\t\t\t\t\t\t}/>\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n \r\n )\r\n}\r\n\r\nexport default App;","import { createTheme } from '@mui/material/styles';\r\nimport { red, blue } from '@mui/material/colors';\r\n\r\n// A custom theme for this app\r\nconst theme = createTheme({\r\n palette: {\r\n primary: {\r\n main: blue[\"500\"],\r\n },\r\n secondary: {\r\n main: blue[\"500\"],\r\n },\r\n error: {\r\n main: red.A400,\r\n },\r\n },\r\n});\r\n\r\nexport default theme;","\n import API from \"!../../node_modules/style-loader/dist/runtime/injectStylesIntoStyleTag.js\";\n import domAPI from \"!../../node_modules/style-loader/dist/runtime/styleDomAPI.js\";\n import insertFn from \"!../../node_modules/style-loader/dist/runtime/insertBySelector.js\";\n import setAttributes from \"!../../node_modules/style-loader/dist/runtime/setAttributesWithoutAttributes.js\";\n import insertStyleElement from \"!../../node_modules/style-loader/dist/runtime/insertStyleElement.js\";\n import styleTagTransformFn from \"!../../node_modules/style-loader/dist/runtime/styleTagTransform.js\";\n import content, * as namedExport from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./styles.scss\";\n \n \n\nvar options = {};\n\noptions.styleTagTransform = styleTagTransformFn;\noptions.setAttributes = setAttributes;\n\n options.insert = insertFn.bind(null, \"head\");\n \noptions.domAPI = domAPI;\noptions.insertStyleElement = insertStyleElement;\n\nvar update = API(content, options);\n\n\n\nexport * from \"!!../../node_modules/css-loader/dist/cjs.js!../../node_modules/sass-loader/dist/cjs.js!./styles.scss\";\n export default content && content.locals ? content.locals : undefined;\n","import * as React from \"react\";\r\nimport * as ReactDOM from \"react-dom/client\";\r\nimport App from \"./App\";\r\nimport theme from './theme';\r\nimport CssBaseline from '@mui/material/CssBaseline';\r\nimport { ThemeProvider } from '@mui/material/styles';\r\nimport {BrowserRouter } from \"react-router-dom\";\r\nimport { ServerAppBasename } from \"config/appUrlConfig\";\r\nimport \"styles/styles.scss\";\r\n\r\nconst root = ReactDOM.createRoot(document.getElementById(\"app\"));\r\nroot.render(\r\n \r\n {/* CssBaseline kickstart an elegant, consistent, and simple baseline to build upon. */}\r\n \r\n\t\t\r\n\t\t\t\r\n\t\t\r\n \r\n);","// Imports\nimport ___CSS_LOADER_API_SOURCEMAP_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/sourceMaps.js\";\nimport ___CSS_LOADER_API_IMPORT___ from \"../../node_modules/css-loader/dist/runtime/api.js\";\nvar ___CSS_LOADER_EXPORT___ = ___CSS_LOADER_API_IMPORT___(___CSS_LOADER_API_SOURCEMAP_IMPORT___);\n// Module\n___CSS_LOADER_EXPORT___.push([module.id, \".link{color:#ff4081;text-decoration:none;cursor:pointer}.link:hover{text-decoration:underline}a{color:#1e88e5;text-decoration:none;cursor:pointer}a:hover{text-decoration:underline}.truncate-with-ellipsis{width:auto;height:auto;display:inline;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.js-plotly-plot .plotly .cursor-crosshair{cursor:inherit}.js-plotly-plot .plotly .cursor-pointer{cursor:inherit}.js-plotly-plot .plotly .cursor-default{cursor:inherit}h1,h2,h3{font-weight:100;margin-bottom:10px}h1{font-size:1.5em}h2{font-size:1.25em}.dash-header{display:flex;justify-content:center;padding:5px;align-items:center}.dash-legend{float:right;margin-top:5px}.dash-legend>div{float:left;margin-left:12px}.dash-legend>div div.key{cursor:auto;display:block;float:left;min-height:12px;min-width:12px}.dash-legend>div div.title{display:block;float:left;font-size:10px;margin:0 3px}nav{display:inline-block;align-items:center;position:-webkit-sticky;position:sticky;top:64px;left:33%;z-index:999;height:30px;padding-right:1rem;padding-left:1rem;margin-bottom:1rem;border-bottom-width:1px;border-bottom-style:solid}.active{text-decoration:underline}\", \"\",{\"version\":3,\"sources\":[\"webpack://./src/styles/styles.scss\"],\"names\":[],\"mappings\":\"AACA,MAAA,aAAA,CAAA,oBAAA,CAAA,cAAA,CACA,YAAA,yBAAA,CACA,EAAA,aAHgB,CAGW,oBAAA,CAAA,cAAA,CAC3B,QAAA,yBAAA,CAEA,wBACC,UAAA,CACA,WAAA,CACA,cAAA,CACA,kBAAA,CACA,eAAA,CACA,sBAAA,CAEyB,0CACrB,cAAA,CAGqB,wCACzB,cAAA,CAGyB,wCACzB,cAAA,CAGD,SACC,eAAA,CACA,kBAAA,CAED,GACC,eAAA,CAED,GACC,gBAAA,CAGD,aACC,YAAA,CACA,sBAAA,CACA,WAAA,CACA,kBAAA,CAGD,aACC,WAAA,CACA,cAAA,CAEA,iBACC,UAAA,CACA,gBAAA,CAEA,yBACC,WAAA,CACA,aAAA,CACA,UAAA,CACA,eAAA,CACA,cAAA,CAGD,2BACC,aAAA,CACA,UAAA,CACA,cAAA,CACA,YAAA,CAKH,IACC,oBAAA,CACA,kBAAA,CACA,uBAAA,CACA,eAAA,CACA,QAAA,CACA,QAAA,CACA,WAAA,CACA,WAAA,CACA,kBAAA,CACA,iBAAA,CACA,kBAAA,CACgB,uBAAA,CACZ,yBAAA,CAIL,QACC,yBAAA\",\"sourcesContent\":[\"$primary1Color: #1e88e5;\\r\\n.link { color: #ff4081; text-decoration: none; cursor: pointer; }\\r\\n.link:hover { text-decoration: underline; }\\r\\na { color: $primary1Color; text-decoration: none; cursor: pointer; }\\r\\na:hover { text-decoration: underline; }\\r\\n\\r\\n.truncate-with-ellipsis {\\r\\n\\twidth: auto;\\r\\n\\theight: auto;\\r\\n\\tdisplay: inline;\\r\\n\\twhite-space: nowrap;\\r\\n\\toverflow: hidden;\\r\\n\\ttext-overflow: ellipsis;\\r\\n}\\r\\n.js-plotly-plot {.plotly {.cursor-crosshair {\\r\\n cursor: inherit; \\r\\n}}}\\r\\n\\r\\n.js-plotly-plot {.plotly {.cursor-pointer {\\r\\n\\tcursor: inherit; \\r\\n}}}\\r\\n\\r\\n.js-plotly-plot {.plotly {.cursor-default {\\r\\n\\tcursor: inherit; \\r\\n}}}\\r\\n\\r\\nh1, h2, h3 {\\r\\n\\tfont-weight: 100;\\r\\n\\tmargin-bottom: 10px;\\r\\n}\\r\\nh1 {\\r\\n\\tfont-size: 1.5em;\\r\\n}\\r\\nh2 {\\r\\n\\tfont-size: 1.25em;\\r\\n}\\r\\n\\r\\n.dash-header {\\r\\n\\tdisplay: flex;\\r\\n\\tjustify-content: center;\\r\\n\\tpadding: 5px;\\r\\n\\talign-items: center;\\r\\n}\\r\\n\\r\\n.dash-legend {\\r\\n\\tfloat: right;\\r\\n\\tmargin-top: 5px;\\r\\n\\r\\n\\t> div {\\r\\n\\t\\tfloat: left;\\r\\n\\t\\tmargin-left: 12px;\\r\\n\\r\\n\\t\\tdiv.key {\\r\\n\\t\\t\\tcursor: auto;\\r\\n\\t\\t\\tdisplay: block;\\r\\n\\t\\t\\tfloat: left;\\r\\n\\t\\t\\tmin-height: 12px;\\r\\n\\t\\t\\tmin-width: 12px;\\r\\n\\t\\t}\\r\\n\\t\\t\\r\\n\\t\\tdiv.title {\\r\\n\\t\\t\\tdisplay: block;\\r\\n\\t\\t\\tfloat: left;\\r\\n\\t\\t\\tfont-size: 10px;\\r\\n\\t\\t\\tmargin: 0 3px;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n}\\r\\n\\r\\nnav {\\r\\n\\tdisplay: inline-block;\\r\\n\\talign-items: center;\\r\\n\\tposition: -webkit-sticky;\\r\\n\\tposition: sticky;\\r\\n\\ttop: 64px;\\r\\n\\tleft: 33%;\\r\\n\\tz-index: 999;\\r\\n\\theight: 30px;\\r\\n\\tpadding-right: 1rem;\\r\\n\\tpadding-left: 1rem;\\r\\n\\tmargin-bottom: 1rem;\\r\\n\\tborder-bottom: {width: 1px;\\r\\n\\t\\t\\t\\t\\tstyle: solid;\\r\\n\\t\\t\\t\\t\\t}\\r\\n}\\r\\n\\r\\n.active {\\r\\n\\ttext-decoration: underline;\\r\\n}\"],\"sourceRoot\":\"\"}]);\n// Exports\nexport default ___CSS_LOADER_EXPORT___;\n","var map = {\n\t\"./af\": 2786,\n\t\"./af.js\": 2786,\n\t\"./ar\": 867,\n\t\"./ar-dz\": 4130,\n\t\"./ar-dz.js\": 4130,\n\t\"./ar-kw\": 6135,\n\t\"./ar-kw.js\": 6135,\n\t\"./ar-ly\": 6440,\n\t\"./ar-ly.js\": 6440,\n\t\"./ar-ma\": 7702,\n\t\"./ar-ma.js\": 7702,\n\t\"./ar-sa\": 6040,\n\t\"./ar-sa.js\": 6040,\n\t\"./ar-tn\": 7100,\n\t\"./ar-tn.js\": 7100,\n\t\"./ar.js\": 867,\n\t\"./az\": 1083,\n\t\"./az.js\": 1083,\n\t\"./be\": 9808,\n\t\"./be.js\": 9808,\n\t\"./bg\": 8338,\n\t\"./bg.js\": 8338,\n\t\"./bm\": 7438,\n\t\"./bm.js\": 7438,\n\t\"./bn\": 8905,\n\t\"./bn-bd\": 6225,\n\t\"./bn-bd.js\": 6225,\n\t\"./bn.js\": 8905,\n\t\"./bo\": 1560,\n\t\"./bo.js\": 1560,\n\t\"./br\": 1278,\n\t\"./br.js\": 1278,\n\t\"./bs\": 622,\n\t\"./bs.js\": 622,\n\t\"./ca\": 2468,\n\t\"./ca.js\": 2468,\n\t\"./cs\": 5822,\n\t\"./cs.js\": 5822,\n\t\"./cv\": 877,\n\t\"./cv.js\": 877,\n\t\"./cy\": 7373,\n\t\"./cy.js\": 7373,\n\t\"./da\": 4780,\n\t\"./da.js\": 4780,\n\t\"./de\": 9740,\n\t\"./de-at\": 217,\n\t\"./de-at.js\": 217,\n\t\"./de-ch\": 894,\n\t\"./de-ch.js\": 894,\n\t\"./de.js\": 9740,\n\t\"./dv\": 5300,\n\t\"./dv.js\": 5300,\n\t\"./el\": 837,\n\t\"./el.js\": 837,\n\t\"./en-au\": 8348,\n\t\"./en-au.js\": 8348,\n\t\"./en-ca\": 7925,\n\t\"./en-ca.js\": 7925,\n\t\"./en-gb\": 2243,\n\t\"./en-gb.js\": 2243,\n\t\"./en-ie\": 6436,\n\t\"./en-ie.js\": 6436,\n\t\"./en-il\": 7207,\n\t\"./en-il.js\": 7207,\n\t\"./en-in\": 4175,\n\t\"./en-in.js\": 4175,\n\t\"./en-nz\": 6319,\n\t\"./en-nz.js\": 6319,\n\t\"./en-sg\": 1662,\n\t\"./en-sg.js\": 1662,\n\t\"./eo\": 2915,\n\t\"./eo.js\": 2915,\n\t\"./es\": 5655,\n\t\"./es-do\": 5251,\n\t\"./es-do.js\": 5251,\n\t\"./es-mx\": 6112,\n\t\"./es-mx.js\": 6112,\n\t\"./es-us\": 1146,\n\t\"./es-us.js\": 1146,\n\t\"./es.js\": 5655,\n\t\"./et\": 5603,\n\t\"./et.js\": 5603,\n\t\"./eu\": 7763,\n\t\"./eu.js\": 7763,\n\t\"./fa\": 6959,\n\t\"./fa.js\": 6959,\n\t\"./fi\": 1897,\n\t\"./fi.js\": 1897,\n\t\"./fil\": 2549,\n\t\"./fil.js\": 2549,\n\t\"./fo\": 4694,\n\t\"./fo.js\": 4694,\n\t\"./fr\": 4470,\n\t\"./fr-ca\": 3049,\n\t\"./fr-ca.js\": 3049,\n\t\"./fr-ch\": 2330,\n\t\"./fr-ch.js\": 2330,\n\t\"./fr.js\": 4470,\n\t\"./fy\": 5044,\n\t\"./fy.js\": 5044,\n\t\"./ga\": 9295,\n\t\"./ga.js\": 9295,\n\t\"./gd\": 2101,\n\t\"./gd.js\": 2101,\n\t\"./gl\": 8794,\n\t\"./gl.js\": 8794,\n\t\"./gom-deva\": 7884,\n\t\"./gom-deva.js\": 7884,\n\t\"./gom-latn\": 3168,\n\t\"./gom-latn.js\": 3168,\n\t\"./gu\": 5349,\n\t\"./gu.js\": 5349,\n\t\"./he\": 4206,\n\t\"./he.js\": 4206,\n\t\"./hi\": 94,\n\t\"./hi.js\": 94,\n\t\"./hr\": 316,\n\t\"./hr.js\": 316,\n\t\"./hu\": 2138,\n\t\"./hu.js\": 2138,\n\t\"./hy-am\": 1423,\n\t\"./hy-am.js\": 1423,\n\t\"./id\": 9218,\n\t\"./id.js\": 9218,\n\t\"./is\": 135,\n\t\"./is.js\": 135,\n\t\"./it\": 626,\n\t\"./it-ch\": 150,\n\t\"./it-ch.js\": 150,\n\t\"./it.js\": 626,\n\t\"./ja\": 9183,\n\t\"./ja.js\": 9183,\n\t\"./jv\": 4286,\n\t\"./jv.js\": 4286,\n\t\"./ka\": 2105,\n\t\"./ka.js\": 2105,\n\t\"./kk\": 7772,\n\t\"./kk.js\": 7772,\n\t\"./km\": 8758,\n\t\"./km.js\": 8758,\n\t\"./kn\": 9282,\n\t\"./kn.js\": 9282,\n\t\"./ko\": 3730,\n\t\"./ko.js\": 3730,\n\t\"./ku\": 1408,\n\t\"./ku.js\": 1408,\n\t\"./ky\": 3291,\n\t\"./ky.js\": 3291,\n\t\"./lb\": 6841,\n\t\"./lb.js\": 6841,\n\t\"./lo\": 5466,\n\t\"./lo.js\": 5466,\n\t\"./lt\": 7010,\n\t\"./lt.js\": 7010,\n\t\"./lv\": 7595,\n\t\"./lv.js\": 7595,\n\t\"./me\": 9861,\n\t\"./me.js\": 9861,\n\t\"./mi\": 5493,\n\t\"./mi.js\": 5493,\n\t\"./mk\": 5966,\n\t\"./mk.js\": 5966,\n\t\"./ml\": 7341,\n\t\"./ml.js\": 7341,\n\t\"./mn\": 5115,\n\t\"./mn.js\": 5115,\n\t\"./mr\": 370,\n\t\"./mr.js\": 370,\n\t\"./ms\": 9847,\n\t\"./ms-my\": 1237,\n\t\"./ms-my.js\": 1237,\n\t\"./ms.js\": 9847,\n\t\"./mt\": 2126,\n\t\"./mt.js\": 2126,\n\t\"./my\": 6165,\n\t\"./my.js\": 6165,\n\t\"./nb\": 4924,\n\t\"./nb.js\": 4924,\n\t\"./ne\": 6744,\n\t\"./ne.js\": 6744,\n\t\"./nl\": 3901,\n\t\"./nl-be\": 9814,\n\t\"./nl-be.js\": 9814,\n\t\"./nl.js\": 3901,\n\t\"./nn\": 3877,\n\t\"./nn.js\": 3877,\n\t\"./oc-lnc\": 2135,\n\t\"./oc-lnc.js\": 2135,\n\t\"./pa-in\": 5858,\n\t\"./pa-in.js\": 5858,\n\t\"./pl\": 4495,\n\t\"./pl.js\": 4495,\n\t\"./pt\": 9520,\n\t\"./pt-br\": 7971,\n\t\"./pt-br.js\": 7971,\n\t\"./pt.js\": 9520,\n\t\"./ro\": 6459,\n\t\"./ro.js\": 6459,\n\t\"./ru\": 238,\n\t\"./ru.js\": 238,\n\t\"./sd\": 950,\n\t\"./sd.js\": 950,\n\t\"./se\": 490,\n\t\"./se.js\": 490,\n\t\"./si\": 124,\n\t\"./si.js\": 124,\n\t\"./sk\": 4249,\n\t\"./sk.js\": 4249,\n\t\"./sl\": 4985,\n\t\"./sl.js\": 4985,\n\t\"./sq\": 1104,\n\t\"./sq.js\": 1104,\n\t\"./sr\": 9131,\n\t\"./sr-cyrl\": 9915,\n\t\"./sr-cyrl.js\": 9915,\n\t\"./sr.js\": 9131,\n\t\"./ss\": 5893,\n\t\"./ss.js\": 5893,\n\t\"./sv\": 8760,\n\t\"./sv.js\": 8760,\n\t\"./sw\": 1172,\n\t\"./sw.js\": 1172,\n\t\"./ta\": 7333,\n\t\"./ta.js\": 7333,\n\t\"./te\": 3110,\n\t\"./te.js\": 3110,\n\t\"./tet\": 2095,\n\t\"./tet.js\": 2095,\n\t\"./tg\": 7321,\n\t\"./tg.js\": 7321,\n\t\"./th\": 9041,\n\t\"./th.js\": 9041,\n\t\"./tk\": 9005,\n\t\"./tk.js\": 9005,\n\t\"./tl-ph\": 5768,\n\t\"./tl-ph.js\": 5768,\n\t\"./tlh\": 9444,\n\t\"./tlh.js\": 9444,\n\t\"./tr\": 2397,\n\t\"./tr.js\": 2397,\n\t\"./tzl\": 8254,\n\t\"./tzl.js\": 8254,\n\t\"./tzm\": 1106,\n\t\"./tzm-latn\": 699,\n\t\"./tzm-latn.js\": 699,\n\t\"./tzm.js\": 1106,\n\t\"./ug-cn\": 9288,\n\t\"./ug-cn.js\": 9288,\n\t\"./uk\": 7691,\n\t\"./uk.js\": 7691,\n\t\"./ur\": 3795,\n\t\"./ur.js\": 3795,\n\t\"./uz\": 6791,\n\t\"./uz-latn\": 588,\n\t\"./uz-latn.js\": 588,\n\t\"./uz.js\": 6791,\n\t\"./vi\": 5666,\n\t\"./vi.js\": 5666,\n\t\"./x-pseudo\": 4378,\n\t\"./x-pseudo.js\": 4378,\n\t\"./yo\": 5805,\n\t\"./yo.js\": 5805,\n\t\"./zh-cn\": 3839,\n\t\"./zh-cn.js\": 3839,\n\t\"./zh-hk\": 5726,\n\t\"./zh-hk.js\": 5726,\n\t\"./zh-mo\": 9807,\n\t\"./zh-mo.js\": 9807,\n\t\"./zh-tw\": 4152,\n\t\"./zh-tw.js\": 4152\n};\n\n\nfunction webpackContext(req) {\n\tvar id = webpackContextResolve(req);\n\treturn __webpack_require__(id);\n}\nfunction webpackContextResolve(req) {\n\tif(!__webpack_require__.o(map, req)) {\n\t\tvar e = new Error(\"Cannot find module '\" + req + \"'\");\n\t\te.code = 'MODULE_NOT_FOUND';\n\t\tthrow e;\n\t}\n\treturn map[req];\n}\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 6700;"],"names":["LoginUrl","WebServiceUrl","NotifyRequestRejectedUrl","HHSLabel","StateLabel","StorageItems","FACILITIES","TITLES","STATES","POSITIONS","CONTACTDETAILS","QOOLUSERASSOCIATEDDATA","API_RETRIES","AJAX_MONITOR_LAST_PUSH_UP_TIME","acceptTermsKey","USER","USERACCOUNTDETAILS","QCCATSessionStorage","key","onNotFound","stored","sessionStorage","getItem","JSON","parse","error","console","log","value","setItem","stringify","removeItem","prop","hasOwnProperty","refresh","getValue","user","setValue","removeValue","retries","userAccountDetails","facilities","stateId","titles","lastTime","states","positions","contactDetails","qoolUserAssociatedData","setLastTermsAcceptanceDate","undefined","DateFormat","axios","config","ApiService","ajaxMonitorConfig","enabled","headers","jsMonitorHeaderRequest","start","moment","Date","utc","format","Promise","reject","response","url","toString","includes","jsMonitorHeaderResponse","currentTimeUTC","lastPushUpTime","setFullYear","Math","abs","diff","ajaxPushUpMaxSeconds","jsMonitorResponse","jsMonitorRequest","e","startTimeUTCServer","endTimeUTCServer","end","startTimeUTCJS","endTimeUTCJS","ajaxMilliSeconds","ajaxMonitorLog","id","uuid","jsStartUTC","toISOString","jsFinishUTC","serverStartUTC","serverFinishUTC","request","body","data","insertAjaxTimeToServer","res","apiService","apiUrl","ajaxMonitorServer","loginUrl","resolve","post","then","catch","constructor","window","location","href","this","_config","apiRoute","additionalHeaders","service","axiosConfig","getDefaultConfigWithToken","Object","keys","map","k","getFullUrl","handleRequestRejectedResponse","isAuthorizationError","isUnauthorized","createRejectResultFromError","get","params","urlParams","getUrlParams","requestUrl","isRequestRejectedResponse","notifyOfRequestRejectedResponse","message","status","responseData","startsWith","initialRequestUrl","notifyRequestRejectedUrl","fields","forEach","element","name","getToken","userAccess","access_token","redirectToLoginUrl","history","back","AuthApi","_apiService","userName","username","Password","password","command","email","oneTimeToken","encodeURIComponent","redirectToApplication","nextAppWebServiceUrl","nextAppApplicationUrl","Auth","failedAuthUrl","successAuthRoute","storeAuthenticatedUser","decodedOneTimeToken","decodeURIComponent","authApi","navigate","useNavigate","setMessage","React","async","security","authenticate","replace","claim","claims","indexOf","QCCATClaims","AuthContext","useAuth","children","hydrateUser","setUser","signin","signout","Provider","DASH_PATH_DELIMITER","DASH_PATH_DELIMITER_UI","FilterContext","parts","length","hasParent","array","x","keep","slice","ArrayHelper","depth","upToExcl","values","push","join","path","j","delimiter","parent","toPath","label","valuesLabel","substring","RegExp","valuesFromPart","predicate","defaultValue","Array","isArray","i","part","endsWith","split","filter","p","filters","filterKey","addDataFactory","keyExtractor","vm","into","graphColors","unknown","default","boxStyle","height","minHeight","maxHeight","padding","defaultStyles","demographicBox","box","defaultBox","tallBox","inheritHW","width","defaultLayout","font","size","margin","l","r","b","t","pad","dragmode","colorway","chartAttrs","layout","assign","outerStyle","defaultConfig","displaylogo","displayModeBar","responsive","downloadFromURL","filename","pom","document","createElement","setAttribute","click","mdt","nameAndFacility","hhsResidenceGroup","morphology","remoteness","residenceHHSId","firstTreatment","timeToFirstTreatment","comorbidityCount","sex","tnmStage","ses","ageRange","indigenousGroup","ecogGroup","DashboardSharedFilterKey","Mdt","Year","Sex","ComorbidityCount","TnmStage","Facility","Ses","AgeRange","IndigenousGroup","EcogGroup","HHS","DashboardFilterKeys","HHSResidenceGroup","HHSOfResidence","DataQualityEligible","PrimarySite","Morphology","Remoteness","FirstTreatment","TimeToFirstTreatment","DiagMonth","DiagYear","generateUUID","d","now","c","random","floor","dashboardApiService","routes","stateWideIndicators","getStateIndicatorReferences","cancerName","year","cancer","toLowerCase","endYear","rateText2","indicator","rateText1","getMdtDashboard","showAll","getMdtDashboardReferences","getMdtDashboardDataQualityIndicators","getMdtDashboardDataQualityComparisons","getMdtDashboardNoProfileIndicators","getMdtDashboardSurvival","primarySite","getMdtDashboardKMSurvival","getNoMdtDashboard","getNoMdtDashboardReferences","getNoMdtDashboardSurvival","getNoMdtDashboardKMSurvival","getBreastDashboard","getBreastDashboardReferences","getCRCDashboard","getCRCDashboardReferences","getLungDashboard","getLungDashboardReferences","getBrainDashboard","getBrainDashboardReferences","getHeadAndNeckDashboard","getHeadAndNeckDashboardReferences","getYouthCancerDashboard","getYouthCancerDashboardReferences","getAMLDashboard","getAMLDashboardReferences","WorkerRequestType","WorkerResultType","Worker_fn","Worker","qoolApiService","referralIdCsvOrAll","allData","excludedReferralIdCsv","extractTypeId","worker","promises","actionPromise","type","payload","promise","postMessage","ping","Ping","loadMdtDashboard","DataWorker","addEventListener","ev","DashWorker","fetchData","state","clearFilters","maybeSetDefaultFilter","dimensions","Set","filterSet","add","addFilter","selectedHhses","chartData","hhses","selectedFacilities","all","results","Fetch","rawRows","rawRefs","rawDqiRows","rawDqiCompRows","rawNoProfileRows","references","computeChartData","filtersToApply","ChartData","context","labelOverride","baseContext","removeFilter","valueToRemove","newValue","n","extractFilterLabel","filterValues","spacer","prototype","call","filterString","find","initialState","page","dashboard","onlyDataQualityEligible","loading","computing","userSettings","isAdmin","qoolLink","qlikLink","appSettings","showInternalLinks","ActionTypes","appSettingsReducer","ShowInternalLinks","pageReducer","action","UserLoadedMdtDashboard","UserWantsToLoadMdtDashboard","UserWantsToNavigate","UserClickedOnChart","UserClearedFilters","ComputingChartData","userSettingsReducer","ApiGetUserSettings","appReducer","app","AppContext","createContext","dispatch","AppProvider","useReducer","Account","anchorEl","setAnchorEl","open","Boolean","auth","IconButton","onClick","event","currentTarget","Person","sx","color","common","Menu","onClose","anchorOrigin","vertical","horizontal","transformOrigin","MenuItem","Ellipsis","props","openLink","link","focus","MoreVert","style","marginTop","useLocation","dashboards","isHomeRoute","pathname","navButton","pathToNavigateTo","dash","marginLeft","currentRoute","textDecoration","textUnderlineOffset","Button","Box","AppBar","position","zIndex","theme","drawer","Toolbar","justifyContent","display","alignItems","src","logo","alt","Typography","variant","currentPageKey","route","openTechnicalAppendix","authApiService","useParams","LoadingAllDataState","openFilterDrawer","setOpenFilterDrawer","loadingAllDataState","setLoadingAllDataState","Waiting","filterLength","callback","XMLHttpRequest","xhr","timeout","onreadystatechange","readyState","canary","onerror","onload","u","URL","origin","send","serverExists","exists","result","apiGetUserSettings","main","pageIsLoading","textAlign","Tooltip","title","top","left","ChevronRight","fontSize","Badge","badgeContent","ClearAll","flexGrow","Drawer","anchor","PaperProps","paddingLeft","Stack","spacing","ArrowBackIos","loadData","msgStyle","fontStyle","FetchingData","FetchedData","ErrorFetchingData","backgroundColor","cursor","loadAllDataView","filterDrawer","ApplicationHelpTypeEnum","addFilterFactory","pointValueFunc","points","uniques","sort","addHierarchyFilterFactory","hierarchy","valueFn","filterMore","BlockHeadingComponent","super","render","blockKey","helpLabel","helpType","className","fontWeight","ChartOrMessage","show","messageWhenFalse","DashPaper","paperKey","uniqueId","overridePadding","Paper","elevation","SubHeading","text","DashChart","heading","subheading","breadcrumb","chartKey","ChartIcons","vbar","hbar","table","scatter","pie","person","downloadAsCsv","downloadAsPng","viewAsFullScreen","isFullScreen","tooltipInfo","tooltipText","chartOrientation","chartType","traces","xLabel","yLabel","setChartType","setChartOrientation","setFullScreen","currentFilters","paddingTop","paddingRight","float","BarChart","_","Sort","TableChart","ShowChart","PieChart","GetApp","downloadFile","content","labelTitle","valueTitle","chartTitle","chartTraces","a","labs","labels","replaceAll","y","reverse","vals","from","textArray","unshift","combinedTraces","filterLabel","source","timeStamp","row","String","v","DataToCSV","blob","Blob","createObjectURL","Image","div","activeFilters","watermark","opacity","right","clone","cloneNode","lineBreak","append","combinedDiv","Number","getComputedStyle","html2canvas","scale","canvas","toDataURL","remove","downloadAsImage","parentElement","innerWidth","Fullscreen","Close","Info","SimpleBreadcrumb","filteredValues","DashTable","selected","filterState","newSelected","has","delete","onChanged","chartHeight","selectableFilter","Table","TableHead","TableRow","TableCell","TableBody","handleClick","isSelected","hover","dat","toLocaleString","CreateChart","paperHeight","showChart","xtitle","ytitle","filterFn","styling","debug","maxValue","chart","bx","autosize","hovermode","selectdirection","barmode","xaxis","automargin","autotick","dtick","fixedrange","autotypenumbers","yaxis","showticklabels","trimmedLabels","maxLength","truncateStringWithEllipsis","range","max","autorange","rangemode","tickmode","ticktext","tickfont","tickvals","tickformat","multiplier","barColor","UNKNOWN_TERMS","marker","colors","personValues","index","reduce","round","overflowX","overflowY","maxWidth","onSelected","marginRight","chartDimesionsCalc","chartHeightProportion","parentColNumber","tabColNumber","tabColNumberP","paperWidth","chartWidth","middleChart","innerHeight","middleChartText","fullScreenPaperHeight","fullScreenChartHeight","fullScreenChartWidth","fullScreenTextSize","textSize","getAxisLabel","co","axis","ChartOrientation","Horizontal","horizontalOrientation","verticalOrientation","ChartType","getChartType","ct","Bar","Pie","Line","getChartOrientation","Vertical","textTemplate","isNaN","toFixed","QoolDashChart","defaultChartType","defaultChartOrientation","fullScreenOpen","setFullScreenOpen","textFn","plotData","addFilterFn","removeFilterFn","xAxis","yAxis","chartOrder","chartDimensions","hoverText","chartStyle","centerChartContentStyle","CircularProgress","legend","pdIndex","calculateRangeOnPlotDataIndex","pointNumber","orientiation","getValues","reversed","getValueOrder","getLabels","getLabelOrder","sortUnknownToEnd","unkIndex","findIndex","unkLabel","unkValue","splice","SortUnknownToEnd","texttemplate","hoverinfo","hole","showlegend","direction","insidetextorientation","textposition","cliponaxis","clipOnAxis","textfont","hovertext","hoverTextAlt","hovertemplate","orientation","chartIcons","verticalBar","horizontalBar","line","fullScreen","help","toChartOrientation","toChartType","chartGrid","summary","Grid","container","item","xs","Dialog","fullWidth","minWidth","msgWhenHidden","clear","ReviewsByServiceChart","plotDataReviews","plotDataPatients","plotDataDiagnoses","valuesROriginal","labelsROriginal","valuesPOriginal","labelsPOriginal","valuesDOriginal","labelsDOriginal","valuesRReversed","labelsRReversed","valuesPReversed","labelsPReversed","valuesDReversed","labelsDReversed","Reviews","Patients","Diagnoses","tracesArray","HierarchyBreadcrumb","partIndex","ancestor","MDTActivityTrendChart","presentations","diagnoses","patients","representationRate","noProfileCount","PatientsBySiteChart","PatientsByMorphChart","HHSResidenceGroupPieChart","TumourStageChart","AgeAtDiagnosisChart","SexChart","ECOGChart","ComorbiditiesChart","FirstNationsStatusChart","SESChart","RemotenessChart","DataQualityByIndicatorChart","valuesYes","valuesNo","denominators","percentsYes","percentValue","numerator","denominator","percentYesData","dp","substr","DataQualityByPeriodChart","plotDataFacility","plotDataState","mdtFacilityRef","sum","sumYes","mdtName","facilityDQComparisons","stateDQComparisons","facilityId","valuesFacility","facility","valuesState","labelsState","DashChip","filterName","filterValue","filterId","filterParent","Chip","onDelete","OneYearSurvivalChart","mdtSurvival","stateSurvival","mdtId","mdtNameId","MDT","State","valuesMDT","ThreeYearSurvivalChart","FiveYearSurvivalChart","HHSOfResidenceChart","KMSurvivalChart","prefix","mdtKMSurvival","stateKMSurvival","survivalLabel","years","months","MdtDashboard","showFilterChips","setFilterChips","filteredDashboard","terminate","mdtData","survivalData","cancerNameKey","patientsByService","getPrimarySite","PrimaySite","getPrimarySiteKeyFromFilters","inferSurvivalData","FetchSurvival","rawSurvivalRows","rawKMSurvivalRows","fetchSurvivalData","activeFiltersArray","filterArray","chips","activeClass","smooth","spy","to","FormControlLabel","control","Switch","checked","onChange","reviewsByPeriod","patientsByPeriod","diagnosesByPeriod","totalNoProfiles","reviewsByService","diagnosesByService","marginBottom","comorbidities","hhsOfResidence","dataQualityByIndicator","dataQualityByPeriod","dqCompFacility","dqCompState","mdts","Check","Clear","survivalDataSelections","oneYearSurvivalMDT","threeYearSurvivalMDT","fiveYearSurvivalMDT","kmSurvivalMDT","SideBySideButton","filterItems","currentState","rightAlignButtons","buttonWidth","flexWrap","shouldComponentUpdate","nextProps","min","componentDidUpdate","MimeType","ext","fileTypeToMimeType","filetype","showFile","anchorElemId","_blob","base64ToArrayBuffer","newBlob","navigator","msSaveOrOpenBlob","download","anchorElem","getElementById","appendChild","setTimeout","revokeObjectURL","binaryString","atob","binaryLen","bytes","Uint8Array","ascii","charCodeAt","MdtFilters","hhsOptions","hhsSelections","selectedHHSIds","facilityOptions","hhsId","facilitySelections","selectedFacilityIds","mdtOptions","mdtSelections","monthOptions","month","mdtMonthSelections","diagMonthSelections","mdtYearOptions","mdtYearSelections","diagYearOptions","diagYearSelections","viewBy","setViewBy","isMulti","options","placeholder","closeMenuOnSelect","styles","base","exportMdtPatients","referralIdCsv","filteredReferralIdCsv","ReportApi","errorMessage","fileHelper","err","exportMdtExcludedPatients","excludedIdCsv","MdtDashboardHome","setState","componentWillUnmount","removeEventListener","updateDimensions","componentDidMount","AdmMonth","AdmYear","FirstTreatmentChart","useState","setFullScreenState","indexOfUnk","labelsOriginal","reversedLabels","valuesOriginal","reversedValues","fullScreenChart","facName","facId","noMdtKMSurvival","ys","mode","tick","zeroline","NoMDTPatientsTrendChart","labelIndexP","valuesReversed","labelsReversed","toolTipText","NoMdtDashboard","paddingBottom","oneYearSurvival","threeYearSurvival","kmSurvival","NoMdtFilters","NoMDT","noMDTData","admMonthSelections","admYearOptions","admYearSelections","NoMdtDashboardHome","DiagnosisYear","DiagnosisMonth","MdtYear","MdtMonth","Invasive","DefinitiveMastectomy","minYear","fetch","loadBreastDashboard","level1","BreastIndicatorAction","downloading","reducer","UserClickedDownloadIndicator","DownloadIndicatorSuccess","DownloadIndicatorFail","stateWideData","BreastDashboard","localState","localDispatch","Breast","fetchStateReferenceData","loadDashboard","ids","breastChartData","getBreastIndicatorPatientList","ecog","percentage","stage","totalDiagnoses","level2","TableContainer","component","align","whiteSpace","totalInvasive","invasive","hadSurgery","colSpan","slnbOnT1TumoursWithIndexBCS","slnbAndAxillaryLymphNodeDissection","axillaryLymphNodeDissection","axillaryLymphNodeDiessection","definitiveMastectomy","mastectomyForT1Tumour","mastectomyForT1Tumours","reExcisionAfterIndexBCS","reExcisionOfLesionAfterIndexBCS","conversionOfIndexBCSToMastectomy","convertionOfIndexBCSToMastectomy","timeFromPathologicalDiagnosisToFirstSurgery45Days","adjuvantIVSTForAxillaryLNPositiveAgedLessThan70","adjuvantIVSTForAxillaryLymphNodePositivePatientsUnder70","neoadjuvantIVST","neoadjuvantTherapy","timeFromDefinitiveSurgeryToFirstIVST45Days","timeFromDefinitiveSurgeryToIVST45Days","xrtFollowingDefinitiveBCS","daysToXrtStartDateFromDefinitiveSurgery","timeFromDefinitiveSurgeryToXrt60Days","reconstructionAtMastectomy","immediateBreastReconstructionSurgery","reconstructionAfterMastectomy","delayedBreastReconstructionSurgery","timeToCompletionWithin37Weeks","timeToTreatmentCompletion37Weeks","target","BreastFilters","dataForFilters","BreastDashboardHome","reportingPrimarySite","CRCIndicatorAction","CrcDashboard","daysFromDiagToSurgInd","setDaysFromDiagToSurgInd","inHospitalMortalityInd","setInHospitalMortalityInd","thirtyDayMortalityInd","setThirtyDayMortalityInd","ninetyDayMortalityInd","setNinetyDayMortalityInd","oneYearSurvivalInd","setOneYearSurvivalInd","twoYearSurvivalInd","setTwoYearSurvivalInd","stage3AdjuvantTxInd","setStage3AdjuvantTxInd","neoAdjuvantXRTInd","setNeoAdjuvantXRTInd","CRC","crcData","getCRCIndicatorPatientList","colon","rectal","patientsColon","patientsRectal","diagToFirstTreatment30Days","hadFirstTreatmentWT30DaysColon","hadFirstTreatmentWT30DaysRectal","diagToSurg30Days","daysFromDiagToSurgLT30Colon","daysFromDiagToSurgLT30Rectal","prolongedLOS","prolongedLOSGT21DaysColon","prolongedLOSGT21DaysRectal","hadStomaAtSurg","hadStomaAtSurgColon","hadStomaAtSurgRectal","hadAbdominoperinealResection","hadAbdominoperinealResectionRectal","inpatientDeath","inHospitalMortalityColon","inHospitalMortalityRectal","death30Days","mortality30DaysColon","mortality30DaysRectal","death90Days","mortality90DaysColon","mortality90DaysRectal","survival365Days","oneYearSurvivalColon","oneYearSurvivalRectal","survival730Days","twoYearSurvivalColon","twoYearSurvivalRectal","diagToFirstST42Days","hadFirstIVSTWT42DaysColon","hadFirstIVSTWT42DaysRectal","stage3Adjuvant","stage3AdjuvantSTColon","stage3AdjuvantSTRectal","neoAdjuvantXRT","neoadjuvantXRTRectal","CrcFilters","CrcDashboardHome","loadBrainDashboard","BrainIndicatorAction","BrainDashboard","Brain","brainChartData","getBrainIndicatorPatientList","histDiag","craniotomy30DaysDiagnosis","craniotomyForHistDiagGlioAnaOligoAnaAstro","craniotomyForepend","inHospitalMortality","mortality30Days","mortality90Days","twoYearSurvival","rt45To54LowGrade","rt54To60Under70Grade4","rtUnder70HighGrade","rt70PlusHighGrade","rtAnaOligo","rtAnaAstro","rt49DaysHistDiagHighGrade","BrainFilters","BrainDashboardHome","loadLungDashboard","LungIndicatorAction","LungDashboard","Lung","lungChartData","getLungIndicatorPatientList","totalPatients","hadPathDiagnosis","hadPathDiagnosisLUCiD","hadECOG","hadECOGLUCiD","hadStage","hadStageLUCiD","treatment30DaysFromDiagnosis","surgery30DaysFromDiagnosis","rt30DaysFromDiagnosis","ivst30DaysFromDiagnosis","treatmentRate","treatmentRateLUCiD","hadSurgeryStageOneOrTwo","hadSurgeryStageOneAndTwo","hadSurgeryStageOneAndTwoLUCiD","rtInoperableStageOneOrTwo","hadSurgOrRTStageOneOrTwo","hadSurgOrRadFirstStageOneOrTwo","hadSurgOrRadFirstStageOneOrTwoLUCiD","neoAdjOrAdjInStage2A3A","neoAdjOrAdjInStage2A3ALUCiD","concurrentCRTInoperableStageThree","concurrentCRTInoperableStageThreeLUCiD","receivedSTStage4","receivedSTStage4LUCiD","mortality30Day","mortality90Day","survivalOneYearAfterSurgery","survivalTwoYearAfterSurgery","mortality30DayIVST","mortality30DayIVSTLUCiD","mortality30DayRT","mortality30DayRTLUCiD","LungFilters","LungDashboardHome","loadHeadAndNeckDashboard","overall","HANIndicatorAction","HeadAndNeckDashboard","HAN","oralCavity","oropharynx","majorSalivaryGlands","nasopharynx","hypopharynx","nasalCavityAndParanasalSinuses","larynx","otherPharynx","hanData","getHeadAndNeckIndicatorPatientList","shortcuts","offset","subType","itdashboard","str","s","toUpperCase","diagnosisToSurgeryLT30Days","lengthOfStay","median","hadIVST","diagnosisToIVSTLT45Days","diagnosisToConcurrentCRTLT45Days","hadRT","diagnosisToRTLT45Days","HeadAndNeckFilters","HeadAndNeckDashboardHome","fertilityPreservationId","diagnosisRecurrenceId","youthHasGpDetails","youthHadTreatment","HadTreatment","GPDetailsProvided","FertilityPreservation","DiagnosisRecurrence","loadYouthCancerDashboard","FertilityPreservationChart","RecurrenceChart","HadTreatmentChart","GPDetailsProvidedChart","YouthCancerIndicatorAction","YouthCancerDashboard","YouthCancer","youthCancerChartData","getYouthCancerIndicatorPatientList","psychosocialCarePlanNum","receivedPsychosocialCareNum","hadFertilityDiscussionNum","referralToFertilitySpecialistNum","fertilityPreservationNum","reviewedAtTreatmentMDTNum","psychosocialSurvivorshipCarePlanNum","medicalTreatmentPlanToGPNum","enrolledInMedicalTrialNum","enrolledInOtherResearchNum","fiveYearSurvival","hadTreatment","fertilityPreservation","diagnosisRecurrence","gpDetailsProvided","YouthCancerFilters","YouthCancerDashboardHome","loadAMLDashboard","AMLIndicatorAction","AMLDashboard","AML","AMLChartData","getAMLIndicatorPatientList","hadAPML","apmlPatients","firstTreat0To5Days","firstTreat6To10Days","firstTreat11To15Days","firstTreatMoreThan15Days","hadBMT","bmt0To3Months","bmt3To6Months","bmt6To9Months","bmt9To12Months","lengthOfStayBMT","mortality31To365Days","AMLFilters","AMLDashboardHome","YC","createTheme","palette","primary","blue","secondary","red","styleTagTransform","setAttributes","insert","domAPI","insertStyleElement","ReactDOM","ThemeProvider","CssBaseline","basename","___CSS_LOADER_EXPORT___","module","webpackContext","req","webpackContextResolve","__webpack_require__","o","Error","code","exports"],"sourceRoot":""}