{"version":3,"file":"1454.49a7182e33cc461774bd.js","mappings":"oMAaO,SAASA,EAAW,GAAsD,IAAtD,SAAEC,EAAQ,MAAEC,EAAK,OAAEC,EAAM,OAAEC,EAAM,SAAEC,GAAiB,EAC7E,MAAMC,GAAKC,EAAAA,EAAAA,MACJC,EAAQC,IAAaC,EAAAA,EAAAA,WAAS,IAC9BC,EAAUC,IAAeF,EAAAA,EAAAA,WAAS,GACnCG,GAAaC,EAAAA,EAAAA,QAAuB,MA4B1C,OA1BAC,EAAAA,EAAAA,IAAc,KACZf,EAAWgB,YAAYV,GAAKW,KACrBT,GAAUS,EAAMC,iBACnBT,GAAU,GACVL,SAAAA,KAGFQ,EAAYK,EAAMC,gBAClBb,SAAAA,EAAWY,EAAMC,eAAe,IAGlC,MAAMC,EAAYN,EAAWO,QAM7B,OAJID,GACFnB,EAAWqB,SAASC,QAAQH,GAGvB,YACEnB,EAAWuB,UAAUjB,GAC5Ba,GAAanB,EAAWqB,SAASG,UAAUL,GACM,IAA7CM,OAAOC,KAAK1B,EAAWuB,WAAWI,QACpC3B,EAAWqB,SAASO,YACtB,CACD,KAID,gBAAKtB,GAAIA,EAAIuB,IAAKhB,EAAYiB,MAAO,CAAE5B,QAAOC,UAAS,SACpDK,IAA+B,mBAAbP,EAA0BA,EAAS,CAAEU,aAAcV,IAG5E,CAEAD,EAAWuB,UAAY,CAAC,EACxBvB,EAAWgB,YAAc,CAACV,EAAYyB,IAA+C/B,EAAWuB,UAAUjB,GAAMyB,EAChH/B,EAAWqB,SAAW,IAAIW,sBACvBC,IACC,IAAK,MAAMhB,KAASgB,EAClBjC,EAAWuB,UAAUN,EAAMiB,OAAO5B,IAAIW,EACxC,GAEF,CAAEkB,WAAY,U,0HC1DT,SAASC,EAAYC,GAC1B,MAAO,0BAA0BC,KAAKD,aAAI,EAAJA,EAAME,cAC9C,C,8FCOO,MAAMC,EAAyC,IAAwB,IAAvB,MAAEC,EAAK,QAAEC,GAAS,EACvE,MAAMC,GAASC,EAAAA,EAAAA,IAAWC,GAE1B,OAAIJ,IAAUK,EAAAA,GAAAA,SAEV,gBAAKC,UAAU,gBAAgBL,QAASA,EAAQ,gBAC9C,SAACM,EAAA,EAAO,CAACC,QAAQ,eAAc,UAC7B,SAACC,EAAA,EAAI,CAACH,UAAU,wCAAwCI,KAAK,cAMjEV,IAAUK,EAAAA,GAAAA,WAEV,gBAAKC,UAAU,gBAAgBL,QAASA,EAAQ,UAC9C,gBAAKU,MAAM,4BAA4BL,UAAWJ,EAAOU,oBAKxD,IAAI,EAGb,SAASR,EAAUS,GACjB,MAAO,CACLD,gBAAiBE,EAAAA,GAAI;;;oBAGLD,EAAME,OAAOC,KAAKC;4BACVJ,EAAME,OAAOC,KAAKC;;;;;MAO9C,C,qBCnCO,MAAMC,EAAyB,IAAsC,IAArC,SAAE1D,GAA8B,EAAjB2D,E,oIAAQ,MAC5D,MAAOC,EAAkBC,IAAuBpD,EAAAA,EAAAA,UAA4B,CAAEqD,EAAG,EAAGC,EAAG,KAChFC,EAAeC,IAAoBxD,EAAAA,EAAAA,WAAkB,GAEtDyD,GAAeC,EAAAA,EAAAA,cAClBC,KAwBL,SAAiBjD,EAA4BkD,GAAqD,IAAzBC,EAAW,UAAH,6CAAG,IAIlF,OADsBC,KAAKC,MAAMrD,EAAQ2C,EAAIO,EAAQP,IAAM,GAAK3C,EAAQ4C,EAAIM,EAAQN,IAAM,IAClEO,CAC1B,EA5BWG,CAAQb,EAAkBc,EAAwBN,KAIvDH,GAAkBD,EAAc,GAElC,CAACJ,EAAkBI,EAAeC,IAG9BU,GAAcR,EAAAA,EAAAA,cACjBC,IACCP,EAAoBa,EAAwBN,GAAO,GAErD,CAACP,IAGH,OACE,mCAAYF,EAAQ,CAAEb,UAAU,wBAAwBL,QAASyB,EAAcS,YAAaA,EAAY,SACrG3E,EAAS,CAAEgE,gBAAeY,UAAW,IAAMX,GAAiB,OACtD,EAWb,SAASS,EAAwBN,GAC/B,MAAO,CACLN,EAAGM,EAAMS,QACTd,EAAGK,EAAMU,QAEb,C,eC5CO,MAAMC,UAAwBC,EAAAA,cAAqB,oB,MAAA,2B,EAC1C,SAACC,GAA6C,IAAtBC,EAAY,UAAH,8CAC7C,OACE,eAAIpC,UAAU,+CAA+CqC,KAAMD,EAAY,GAAK,OAAO,SACxFD,EAAKG,KAAI,CAACC,EAAUC,KAEjB,SAACC,EAAA,EAAmB,CAElBC,KAAMH,EAASG,KACfhC,KAAM6B,EAAS7B,KACfiC,cAAeJ,EAASI,cACxBhD,QAAS4C,EAAS5C,QAClBiD,SAAUL,EAASK,SAAS,SAE3BL,EAASM,SAAW,EAAKC,YAAYP,EAASM,SAAS,IAPlD,GAAEN,EAAS7B,OAAO8B,QAapC,G,EApBwD,iB,EAAA,M,qFAoBvD,CAEDO,SACE,OAAO,gBAAK/C,UAAU,qCAAoC,SAAEgD,KAAKF,YAAYE,KAAKC,MAAMC,QAC1F,E,4HCfK,MAAMC,EAAqC,IAAoC,IAAnC,MAAEC,EAAK,UAAEC,EAAS,SAAEnG,GAAU,EAC/E,MAAOgG,EAAOI,IAAY3F,EAAAA,EAAAA,UAA0B,IAC9C4F,GAAmBC,EAAAA,EAAAA,KAAa9D,IAAK,aAAwC,QAAxC,GAAK+D,EAAAA,EAAAA,GAAsB/D,EAAO0D,UAAM,aAAnC,EAAqCG,gBAAgB,IAMrG,OAJAG,EAAAA,EAAAA,YAAU,KACRJ,ECCG,SACLD,EACAD,EACAG,GAEA,MAAMI,EAAerC,IACnBA,EAAMsC,iBACNC,EAAAA,GAAAA,QAAwB,CACtBC,UAAWV,EAAM7F,IACjB,EAGEwG,EAAezC,IACnBA,EAAMsC,iBACNC,EAAAA,GAAAA,QAAwB,CACtBG,UAAWZ,EAAM7F,IACjB,EAQE0G,EAAqB3C,IACzBA,EAAMsC,kBACNM,EAAAA,EAAAA,IAAgBb,EAAWD,EAAM,EAG7Be,EAAwB7C,IAC5BA,EAAMsC,kBACNQ,EAAAA,EAAAA,IAAmBhB,EAAM,EAGrBiB,EAAkBC,IACtBT,EAAAA,GAAAA,QAAwB,CACtBU,QAASnB,EAAM7F,GACfiH,WAAYF,KAGdG,EAAAA,EAAAA,IAAkB,6BAA8B,CAC9CH,IAAKA,QAAAA,EAAOI,EAAAA,EAAAA,MACZ,EAGEC,EAAUrD,IACdA,EAAMsC,gBAAgB,EAGlBgB,EAAoBtD,IACxBA,EAAMsC,kBACNiB,EAAAA,EAAAA,IAAexB,EAAWD,EAAM,EAG5B0B,EAAexD,IACnBA,EAAMsC,kBACNmB,EAAAA,EAAAA,IAAU3B,EAAM,EAGZ4B,EAAiB1D,IACrBA,EAAMsC,kBACNqB,EAAAA,EAAAA,IAAY5B,EAAWD,GAAO,EAAK,EAG/B8B,EAAuB5D,IAC3BA,EAAMsC,iBACN,MAAMuB,EACJ7D,EAAM8D,SAAW9D,EAAM+D,QAAWC,GAAgBC,OAAOC,KAAM,GAAEC,EAAAA,GAAAA,YAAmBH,UAASI,EAC/FC,EAAAA,EAAAA,UAAeC,EAAAA,EAAAA,IAAkBxC,EAAO,CAAEyC,iBAAgB,IAAEC,WAAU,KAAEC,cAAa,KAAEZ,oBAA0B,EAG7Ga,EAAkB1E,IACtBA,EAAMsC,kBACNqC,EAAAA,EAAAA,IAAa7C,EAAM,EAEfjB,EAAwB,GAE9B,IAAKiB,EAAM8C,UAAW,CACpB,MAAMC,GAAsBC,EAAAA,EAAAA,GAAE,yBAA2B,QACzDjE,EAAKkE,KAAK,CACR3F,KAAMyF,EACNxD,cAAe,MACfhD,QAASgE,EACTf,SAAU,KAEd,CAEIS,EAAUiD,aAAalD,KAAWA,EAAM8C,WAC1C/D,EAAKkE,KAAK,CACR3F,KAAM,OACNiC,cAAe,OACfhD,QAASoE,EACTnB,SAAU,MAId,MAAM2D,GAAuBH,EAAAA,EAAAA,GAAE,0BAA4B,SAE3DjE,EAAKkE,KAAK,CACR3F,KAAM6F,EACN5D,cAAe,YACfhD,QAlFoB2B,IACpBA,EAAMsC,kBACN4C,EAAAA,EAAAA,IAAWnD,EAAWD,EAAM,EAiF5BR,SAAU,SAGR6D,EAAAA,GAAAA,sBAAqCrD,EAAMsD,QAAUtD,EAAMsD,OAAOC,KAAKC,eACzEzE,EAAKkE,KAAK,CACR3F,KAAM,UACNiC,cAAe,UACfhD,QAASuF,EACTtC,SAAU,MAId,MAAMiE,EAA+B,GAGrC,GAAIzD,EAAMsD,SAAWtD,EAAMsD,OAAOC,KAAKC,cAAe,CACpD,MAAME,GAAsBV,EAAAA,EAAAA,GAAE,iCAAmC,QAEjES,EAAYR,KAAK,CACf3F,KAAMoG,EACNnH,QAAUoH,GAA6B1C,EAAeK,EAAAA,EAAAA,QAGpDrB,EAAUsD,KAAKK,SACjBH,EAAYR,KAAK,CACf3F,KAAM,QACNf,QAAUoH,GAA6B1C,EAAeK,EAAAA,EAAAA,QAG5D,CAEA,MAAMuC,GAAsBb,EAAAA,EAAAA,GAAE,iCAAmC,cAEjES,EAAYR,KAAK,CACf3F,KAAMuG,EACNtH,QAAUoH,GAA6B1C,EAAeK,EAAAA,EAAAA,QAGxD,MAAMwC,GAAyBd,EAAAA,EAAAA,GAAE,4BAA8B,WAE/DjE,EAAKkE,KAAK,CACR3D,KAAM,UACNhC,KAAMwG,EACNvE,cAAe,cACfhD,QAAUoH,GAA6B1C,IACvCzB,SAAU,IACVC,QAASgE,IAGX,MAAMhE,EAA2B,GAC3BmE,EAAU3D,EAAUiD,aAAalD,GA4BvC,IA1BI4D,GAAa5D,EAAM+D,WAAa/D,EAAM8C,YACxCrD,EAAQwD,KAAK,CACX3F,KAAM,YACNf,QAASiF,EACThC,SAAU,QAGZC,EAAQwD,KAAK,CACX3F,KAAM,OACNf,QAASmF,KAGPsC,EAAAA,EAAAA,GAAyBhE,GAC3BP,EAAQwD,KAAK,CACX3F,KAAM,uBACNf,QAASwE,IAGXtB,EAAQwD,KAAK,CACX3F,KAAM,uBACNf,QAASsE,KAMXV,EAAkB,CACpB,MAAM8D,EAAQ9D,EAAiB+D,WACzBC,EAAuBF,EAAMG,YAAYC,KACzCC,EAAmBH,EAAUI,kBAEnC,IAAK,MAAMC,KAAQF,EAAkB,CACnC,MAAMG,EAA2B,CAC/BnH,KAAMkH,EAAKlH,KACXoH,KAAMF,EAAKE,KACXlF,SAAUgF,EAAKhF,UAGbgF,EAAKG,QACPF,EAAUlI,QAAU,KAClB0H,EAAMW,MAAMJ,EAAKG,MAAO,CAAEN,KAAMF,GAAY,GAIhD1E,EAAQwD,KAAKwB,EACf,CACF,CAwBA,GAtBIzE,EAAM6E,QAAQC,QAChBrF,EAAQwD,KAAK,CACX3F,KAAM0C,EAAM6E,QAAQC,OAAOC,YACvB/B,EAAAA,EAAAA,GAAE,gCAAiC,gBACnCA,EAAAA,EAAAA,GAAE,gCAAiC,eACvCzG,QAASqG,EACTpD,SAAU,QAKVQ,EAAM8C,YACRrD,EAAQjE,OAAS,GAGfoI,GAAW5D,EAAMsD,SAAWtD,EAAMsD,OAAOC,KAAKC,eAChD/D,EAAQwD,KAAK,CACX3F,KAAM,WACNf,QAAUoH,GAAwB1C,EAAeK,EAAAA,EAAAA,QAIjD7B,EAAQjE,OAAQ,CAClB,MAAMwJ,GAAsBhC,EAAAA,EAAAA,GAAE,yBAA2B,WACzDjE,EAAKkE,KAAK,CACR3D,KAAM,UACNhC,KAAM0H,EACNzF,cAAe,OACfE,UACAlD,QAASgF,GAEb,CAaA,OAXItB,EAAUiD,aAAalD,IAAWA,EAAM8C,WAAc9C,EAAM+D,YAC9DhF,EAAKkE,KAAK,CAAE3D,KAAM,UAAWhC,KAAM,KAEnCyB,EAAKkE,KAAK,CACR3F,KAAM,SACNiC,cAAe,YACfhD,QAASqF,EACTpC,SAAU,SAIPT,CACT,CDxPakG,CAAahF,EAAWD,EAAOG,GAAkB,GACzD,CAACF,EAAWD,EAAOG,EAAkBD,IAEjCpG,EAAS,CAAEgG,SAAQ,EEdfoF,EAAoC,IAA0B,IAAzB,MAAElF,EAAK,UAAEC,GAAW,EACpE,OACE,SAACF,EAAuB,CAACC,MAAOA,EAAOC,UAAWA,EAAU,SACzD,IAAe,IAAd,MAAEH,GAAO,EACT,OAAO,SAACjB,EAAe,CAACiB,MAAOA,GAAS,GAElB,ECTjBqF,EAA+B,IAAyB,IAAxB,OAAEC,EAAM,QAAE7I,GAAS,EAC9D,MAAM8I,EACgB,UAApBD,EAAOE,UAA4C,YAApBF,EAAOE,SAAyB,uBAAyB,cAE1F,OACE,SAACzI,EAAA,EAAO,CAACC,QAASsI,EAAO9H,KAAK,SAC3B8H,EAAOjE,SACN,gBAAKvE,UAAU,4BAA4BL,QAAUoH,GAAMpH,EAAQoH,EAAGyB,EAAOjE,SAAU,UACrF,SAACpE,EAAA,EAAI,CAACC,KAAMqI,EAAU1J,MAAO,CAAE4J,YAAa,YAG9C,cAAG3I,UAAU,oBAAoB8H,KAAMU,EAAOI,KAAMzJ,OAAO,SAAS0J,IAAI,aAAY,UAClF,SAAC1I,EAAA,EAAI,CAACC,KAAMqI,EAAU1J,MAAO,CAAE4J,YAAa,YAPdH,EAAOE,SAUjC,ECbDI,EAAgC,IAAyB,IAAxB,OAAEC,EAAM,QAAEC,GAAS,EAC/D,MAAMC,GAAc5H,EAAAA,EAAAA,cAClB,CAAC0F,EAAyBzC,KACxByC,EAAEmC,kBACFrF,EAAAA,GAAAA,QAAwB,CAAEU,QAASyE,EAASxE,WAAYF,GAAM,GAEhE,CAAC0E,IAIGG,EAAiD,CAAC,EACxD,IAAK,MAAMC,KAASL,EAClB,GAAKK,EAAMzC,MAASyC,EAAMzC,KAAKwC,QAI/B,IAAK,MAAMX,KAAUY,EAAMzC,KAAKwC,QAC9BA,EAAQX,EAAOE,UAAYF,EAI/B,OACE,8BACG9J,OAAO2K,OAAOF,GAAS7G,KAAKkG,IAC3B,SAACD,EAAiB,CAACC,OAAQA,EAAQ7I,QAASsJ,GAAkBT,EAAOE,aAEtE,E,UCTA,MAAMY,GAAyB,IAAyE,IAAxE,MAAElG,EAAK,MAAEmG,EAAK,UAAEpC,EAAS,UAAEjB,EAAS,KAAEsD,EAAI,WAAEC,EAAU,UAAEpG,GAAW,EACxG,MACMhD,EAAQ+C,EAAMsG,kBACd1J,GAAY2J,EAAAA,EAAAA,IAAG,eAAkBxC,GAAajB,EAAkC,GAArB,oBAC3DtG,GAASC,EAAAA,EAAAA,IAAW+J,IAE1B,OACE,iCACE,SAACnK,EAA2B,CAACC,MAAO8J,EAAK9J,MAAOC,QAP9B,IAAMyD,EAAMyG,iBAAiBC,iBAQ/C,SAACC,EAAA,EAAiB,CAChB3G,MAAOA,EACP/C,MAAO+C,EAAM/C,MACb2J,YAAa5G,EAAM4G,YACnBC,WAAY7G,EAAM6G,WAClBC,OAAOC,EAAAA,EAAAA,GAAsB/G,GAC7BmG,MAAOA,KAET,gBAAKvJ,UAAWA,EAAU,UACxB,SAACY,EAAsB,CAAC,cAAawJ,EAAAA,GAAAA,WAAAA,OAAAA,MAAAA,MAAwC/J,GAAO,SACjF,IAAkC,IAAjC,UAAEyB,EAAS,cAAEZ,GAAe,EAC5B,OACE,SAACmJ,EAAA,EAAmB,CAAC1K,QAASmC,EAAWwI,OAAQC,SAAS,UACxD,iBAAKvK,UAAU,cAAa,WAC1B,SAAC8I,EAAkB,CAACC,OAAQS,EAAKgB,OAAQxB,QAAS5F,EAAM7F,KACvDkM,GACC,SAACtJ,EAAA,EAAI,CACHC,KAAqB,aAAfqJ,EAA4B,cAAgB,QAClDzJ,UAAU,2BACVjB,MAAO,CAAE4J,YAAa,OACtB8B,KAAK,OAEL,MACJ,eAAIzK,UAAWJ,EAAO8K,UAAU,SAAErK,KAChCgD,EAAUsD,KAAKgE,6BACf,iBAAK,cAAY,iBAAgB,mBAC/B,SAACxK,EAAA,EAAI,CAACC,KAAK,aAAaJ,UAAU,uBACjCkB,GACC,SAACoH,EAAsB,CAAClF,MAAOA,EAAOC,UAAWA,EAAWuH,QAAS9I,IACnE,QAGP0H,EAAKqB,SAAWrB,EAAKqB,QAAQC,WAC5B,kBAAM9K,UAAU,kBAAiB,mBAC/B,SAACG,EAAA,EAAI,CAACC,KAAK,aAAaqK,KAAK,QAAO,IAAEjB,EAAKqB,QAAQC,gBAIrC,QAK7B,EAIDlB,GAAerJ,IACZ,CACLmK,UAAWlK,EAAAA,GAAI;;;;;;qBAMED,EAAMwK,WAAWC;mBACnBzK,EAAMwK,WAAWE,KAAKC;;;;iBAIxB3K,EAAME,OAAOC,KAAKyK;;;;;iIC3C5B,MAAMC,WAAsClJ,EAAAA,cAMjDmJ,YAAYpI,GACVqI,MAAMrI,GAAO,kBANe,MAAI,mBACf6C,EAAAA,EAAAA,OAAY,4CAExB,IAAIyF,EAAAA,IAITvI,KAAKtD,MAAQ,CACX8J,KAAM,CACJ9J,MAAOK,EAAAA,GAAAA,WACPyK,OAAQ,GACRgB,WAAWC,EAAAA,EAAAA,OAGjB,CAEAC,oBACE,MAAM,MAAEtI,GAAUJ,KAAKC,MACvBD,KAAK2I,mBAGL,MAAMC,EAAcxI,EAAMyG,iBAG1B7G,KAAK6I,KAAKC,IACRF,EAAYG,QAAQ,CAAEC,gBAAgB,EAAOC,iBAAiB,IAASC,UAAU,CAC/EC,KAAO3C,GAAoBxG,KAAKoJ,kBAAkB5C,KAGxD,CAEA4C,kBAAkB5C,GAChB,IAAI6C,EAEJ,GAAI7C,EAAK9J,QAAUK,EAAAA,GAAAA,MAAoB,CACrC,MAAM,MAAEwJ,GAAUC,EACdD,GACE8C,IAAiB9C,EAAM+C,UACzBD,EAAe9C,EAAM+C,QAG3B,CAEAtJ,KAAKuJ,SAAS,CAAE/C,OAAM6C,gBACxB,CAEAG,uBAEmC,OADjCxJ,KAAK6I,KAAKY,cACNzJ,KAAKC,MAAMM,oBACc,QAA3B,EAAAP,KAAKC,MAAMM,wBAAgB,OAA3B,EAA6BmJ,UAEjC,CAEAC,mBAAmBC,EAAkBC,GACnC,MAAM,OAAEnG,EAAM,OAAEtJ,EAAM,MAAED,EAAK,MAAEiG,GAAUJ,KAAKC,MAE1C2J,EAAUlG,SAAWA,GACvB1D,KAAK2I,mBAGHiB,EAAUzP,QAAUA,GAASyP,EAAUxP,SAAWA,GAChD4F,KAAK8J,aACP9J,KAAK8J,WAAWrC,KAAKrN,OAAS4F,KAAK+J,sBACnC/J,KAAK8J,WAAWrC,KAAKtN,MAAQ6F,KAAKgK,qBAClC5J,EAAML,SAGZ,CAEAgK,sBACE,MAAM,OAAErG,EAAM,OAAEtJ,GAAW4F,KAAKC,OAC1B,MAAE1C,GAAUkF,EAAAA,GAIlB,OAAOrI,GAFc4F,KAAKiK,mBAAqB,EAAI1M,EAAM2M,mBAEV,GADzBxG,EAAOyG,UAAY,EAAI5M,EAAM6M,cACAC,EAAAA,EACrD,CAEAL,qBACE,MAAM,OAAEtG,EAAM,MAAEvJ,GAAU6F,KAAKC,OACzB,MAAE1C,GAAUkF,EAAAA,GAGlB,OAAOtI,EAAwB,GADTuJ,EAAOyG,UAAY,EAAI5M,EAAM6M,cAChBC,EAAAA,EACrC,CAEA1B,mBACE,MAAM,MAAEvI,EAAK,UAAEC,EAAS,yBAAEiK,GAA6BtK,KAAKC,MAG5D,IAAKD,KAAKuK,QACR,OAGF,MAAMC,GAASC,EAAAA,EAAAA,KAGfzK,KAAK8J,WAAa,CAChB1J,MAAOA,EACPC,UAAWA,EACXoH,KAAM,CAAEtN,MAAO6F,KAAKgK,qBAAsB5P,OAAQ4F,KAAK+J,wBAGzDO,EAAyB,CACvBI,IAAKtK,EAAMsK,IACXnK,iBAAkBiK,EAAOG,KAAK3K,KAAKuK,QAASvK,KAAK8J,WAVlC,mFAYnB,CAEAG,mBACE,MAAM,MAAE7J,GAAUJ,KAAKC,OACjB,KAAEuG,GAASxG,KAAKtD,MAGtB,QAAI8J,EAAKqB,UAAWrB,EAAKqB,QAAQC,YAIzB1H,EAAMwK,UAChB,CAEA7K,SAAS,MACP,MAAM,UAAEM,EAAS,MAAED,EAAK,UAAE+D,EAAS,UAAEjB,EAAS,OAAEQ,GAAW1D,KAAKC,OAC1D,aAAEoJ,EAAY,KAAE7C,GAASxG,KAAKtD,OAC9B,YAAEmO,GAAgBzK,EAElBqG,EAA4B,QAAlB,EAAGD,EAAKC,kBAAU,aAAf,EAAiB/J,MAE9BoO,EAAsBC,IAAW,CACrC,mBAAmB,EACnB,4BAA6B1O,EAAYwE,EAAAA,GAAAA,cAA8BmK,UACvE,+BAAgCH,EAChC,4BAA6B7K,KAAKiK,mBAClC,uBAAmCvH,IAAhBtC,EAAM6K,MACzB,CAAE,sBAAqBxE,UAA8B/D,IAAf+D,IAGlCyE,EAAyBH,IAAW,CACxC,iBAAiB,EACjB,4BAA6BrH,EAAOyG,YAGtC,OACE,iBAAKnN,UAAW8N,EAAqB,aAAY1D,EAAAA,GAAAA,WAAAA,OAAAA,MAAAA,iBAAmDhH,EAAM/C,OAAO,WAC/G,SAACiJ,GAAW,CACVlG,MAAOA,EACPC,UAAWA,EACXhD,MAAO+C,EAAM/C,MACb2J,YAAa5G,EAAM4G,YACnBE,MAAO9G,EAAM8G,MACbX,MAAO8C,EACPlF,UAAWA,EACXjB,UAAWA,EACXsD,KAAMA,EACNC,WAAYA,KAEd,gBAAKzJ,UAAWkO,EAAuB,UACrC,gBAAKpP,IAAMyO,GAAavK,KAAKuK,QAAUA,EAAUvN,UAAU,4BAInE,EAGF,MAMMmO,GAAkE,CAAEb,yBAAwBA,EAAAA,IAErFc,IAAqBC,EAAAA,EAAAA,UAR6C,CAAC3O,EAAOuD,KAAU,MAC/F,MAAO,CACLM,iBAA2D,QAA3C,GAAEE,EAAAA,EAAAA,GAAsB/D,EAAOuD,EAAMG,cAAM,aAAzC,EAA2CG,iBAC9D,GAKwD4K,GAAzBE,CAA6CjD,I,yKC5NxE,MA+CDkD,GAAiB,CAACC,EAAeC,KAC9B,CACLC,QAAS,CACPlR,GAAImR,GAAAA,GAAAA,OACJzG,QAASsG,GAEXI,WAAY,CAACC,GAAeJ,MAI1BI,GAAkBJ,IACf,CACLjR,GAAI,QACJsR,MAAO,CACLC,KAAMC,GAAAA,EAAAA,MACNC,WAAYR,K,mMCMX,MAAMS,WAA0B/M,EAAAA,cAKrCmJ,YAAYpI,GACVqI,MAAMrI,GAEN,mBAPkC6C,EAAAA,EAAAA,OAAY,eACjC,IAAIyF,EAAAA,IAAc,sBACS,CAAE2D,WAAW,IAAM,mBAgCnD,IAAOlM,KAAKC,MAAMiD,UAAYiJ,GAAAA,EAAAA,IAA0BnM,KAAKC,MAAMI,UAAU+L,eAAa,iCAE3EP,IACvB7L,KAAKC,MAAMoM,sBAAsBR,GAEjC7L,KAAKuJ,SAAS,CACZ+C,QAAS,OAAF,UACFtM,KAAKtD,MAAM4P,QAAO,CACrBC,cAAeV,KAEjB,IACH,+BAaqB,CAACN,EAAeC,KACpCxL,KAAKwM,oBDhIqC,EAC5CjB,EACAC,EACAiB,KAEA,MAAM,UAAEC,GAAcD,EAChBE,EAAeF,EAAYC,UAAUE,WAAWC,GAC7CA,EAASpB,QAAQlR,KAAOmR,GAAAA,GAAAA,QAAyBmB,EAASpB,QAAQxG,UAAYsG,IAGvF,GAAIoB,EAAe,EACjB,OAAO,OAAP,UACKF,EAAW,CACdC,UAAW,IAAID,EAAYC,UAAWpB,GAAeC,EAAOC,MAIhE,MAAMsB,EAAgBC,MAAMC,KAAKN,GAC3BO,EAAWH,EAAcH,GACzBO,EAAgBD,EAAStB,WAAWiB,WAAWO,GAAe,UAATA,EAAE5S,KAE7D,GAAI2S,EAAgB,EAMlB,OALAJ,EAAcH,GAAgB,OAAH,UACtBM,EAAQ,CACXtB,WAAY,IAAIsB,EAAStB,WAAYC,GAAeJ,MAG/C,OAAP,UACKiB,EAAW,CACdC,UAAWI,IAIf,MAAMM,EAAiBL,MAAMC,KAAKC,EAAStB,YAQ3C,OAPAyB,EAAeF,GAAiBtB,GAAeJ,GAE/CsB,EAAcH,GAAgB,OAAH,UACtBM,EAAQ,CACXtB,WAAYyB,IAGP,OAAP,UACKX,EAAW,CACdC,UAAWI,GAAa,ECqFCO,CAA+B9B,EAAOC,EAAOxL,KAAKC,MAAMG,MAAMqM,aAAa,IACrG,oCAE0B,CAAClB,EAAeO,KACzC9L,KAAKwM,qBACHc,EAAAA,GAAAA,GAA8B/B,EAAOO,EAAM9L,KAAKC,MAAMG,MAAMqM,YAAazM,KAAKtD,MAAM8J,KAAKgB,QAC1F,IACF,8BAEqB+F,IACpB,MAAMC,EAAkCxN,KAAKC,MAAMG,MAAM6E,QAAQC,OAGjE,IAAKsI,EACH,OAGF,IAAIC,EAAWD,EAAcC,SACzBC,EAASF,EAAcE,OACvBH,IAAYG,IACdD,OAAW/K,IAII,IAAb+K,GACFC,OAAShL,EACT+K,OAAW/K,IAEX+K,GAAYA,EACZC,EAASH,GAGXvN,KAAK2N,gBAAgB,OAAD,UACf3N,KAAKC,MAAMG,MAAM6E,QAAO,CAC3BC,OAAQ,OAAF,UAAOsI,EAAe,CAAAE,SAAQD,eACpC,IACH,qBA2IW,KACV,MAAM,UAAEpN,EAAS,MAAED,EAAK,SAAExF,EAAQ,MAAET,GAAU6F,KAAKC,MAEnD,IAAKrF,EAEH,YADAoF,KAAKuJ,SAAS,CAAEqE,mBAAmB,IAIrC,MAAMC,GAAWC,EAAAA,EAAAA,IAAwB1N,EAAOJ,KAAK+N,QAAQvF,aAG7D,GAAIxI,KAAKgO,oBAAqB,CAC5B,GAAI7T,EAAQ,EACV,OAGE6F,KAAKtD,MAAMkR,mBACb5N,KAAKuJ,SAAS,CAAEqE,mBAAmB,IAErCxN,EAAM6N,mBAAmB,CACvBC,YAAa7N,EAAU9F,GACvB4T,aAAc9N,EAAU+N,IACxBC,kBAAmBhO,EAAUiO,cAC7B3G,2BAA4BtH,EAAUsD,KAAKgE,2BAC3CkG,WACA1T,SAEJ,MAEE6F,KAAKuJ,SAAS,CACZ/C,KAAM,OAAF,UAAOxG,KAAKtD,MAAM8J,KAAM,CAAAgC,UAAWxI,KAAK+N,QAAQvF,cACpD+F,cAAevO,KAAKtD,MAAM6R,cAAgB,EAC1CC,cAAU9L,GAEd,IACD,oBAEU,KACT,MAAM+L,EAAc,CAAEF,cAAevO,KAAKtD,MAAM6R,cAAgB,GAChEvO,KAAKuJ,SAASkF,EAAY,IAC3B,2BAEkBxJ,IACjBjF,KAAKC,MAAMG,MAAMsO,cAAczJ,EAAQ,IACxC,+BAEsBxC,IACrBzC,KAAKC,MAAMG,MAAMuO,kBAAkBlM,EAAO,IAC3C,wBAEe8D,IACd,MAAM8C,EAAe9C,EAAM+C,SAvTF,kBAwTrBtJ,KAAKtD,MAAM2M,eAAiBA,GAC9BrJ,KAAKuJ,SAAS,CAAEF,gBAClB,IACD,+BAEqB,KACpBrJ,KAAKuJ,SAAS,CAAEF,kBAAc3G,GAAY,IAC3C,8BAEoBkM,UACnB,MAAMC,EAAWvQ,EAAM0O,OAAS1O,EAAMwQ,GAChCC,EAAO,CACXZ,aAAcnO,KAAKC,MAAMI,UAAU+N,IACnCpI,QAAShG,KAAKC,MAAMG,MAAM7F,GAC1BsU,WACAG,KAAM1Q,EAAM0O,KACZiC,QAASJ,EAAWvQ,EAAMwQ,GAAK,EAC/BI,KAAM5Q,EAAM4Q,KACZxR,KAAMY,EAAM0I,mBAERmI,EAAAA,GAAAA,IAAeJ,IACrBK,EAAAA,GAAAA,MAA0BC,IAAI,CAAEhP,UAAWL,KAAKC,MAAMI,UAAWiP,MAAOtP,KAAK+N,QAAQvF,cACrFxI,KAAKtD,MAAM4P,QAAQiD,SAASC,QAAQ,IAAIC,GAAAA,GAAsBV,GAAM,IACrE,8BAEoBH,gBACbc,EAAAA,GAAAA,IAAiB,CAAEnV,QACzB6U,EAAAA,GAAAA,MAA0BC,IAAI,CAAEhP,UAAWL,KAAKC,MAAMI,UAAWiP,MAAOtP,KAAK+N,QAAQvF,cACrFxI,KAAKtD,MAAM4P,QAAQiD,SAASC,QAAQ,IAAIC,GAAAA,GAAsB,CAAElV,OAAM,IACvE,8BAEoBqU,UACnB,MAAMC,EAAWvQ,EAAM0O,OAAS1O,EAAMwQ,GAChCC,EAAO,CACXxU,GAAI+D,EAAM/D,GACV4T,aAAcnO,KAAKC,MAAMI,UAAU+N,IACnCpI,QAAShG,KAAKC,MAAMG,MAAM7F,GAC1BsU,WACAG,KAAM1Q,EAAM0O,KACZiC,QAASJ,EAAWvQ,EAAMwQ,GAAK,EAC/BI,KAAM5Q,EAAM4Q,KACZxR,KAAMY,EAAM0I,mBAER2I,EAAAA,GAAAA,IAAiBZ,IAEvBK,EAAAA,GAAAA,MAA0BC,IAAI,CAAEhP,UAAWL,KAAKC,MAAMI,UAAWiP,MAAOtP,KAAK+N,QAAQvF,cACrFxI,KAAKtD,MAAM4P,QAAQiD,SAASC,QAAQ,IAAIC,GAAAA,GAAsBV,GAAM,IACrE,6BAWoBvG,IACnBxI,KAAK+N,QAAQ6B,QAAQ,CACnB5C,MAAM6C,EAAAA,GAAAA,IAAMrH,EAAUwE,MACtB8B,IAAIe,EAAAA,GAAAA,IAAMrH,EAAUsG,KACpB,IApVF,MAAMS,EAAWtP,EAAMI,UAAUyP,OAAOC,aAAc,SAAQ9P,EAAMG,MAAM7F,KAAMyF,KAAKgQ,aAErFhQ,KAAKtD,MAAQ,CACXuT,aAAa,EACb1B,cAAe,EACfX,mBAAmB,EACnBtB,QAAS,CACPiD,WACAW,IAAKlQ,KAAKmQ,qBACVC,KAAMpQ,KAAKqQ,QACXC,oBAAqBtQ,KAAKsQ,oBAC1BC,yBAA0BvQ,KAAKwQ,yBAC/BC,mBAAoBzQ,KAAKyQ,mBACzBC,mBAAoB1Q,KAAK0Q,mBACzBC,mBAAoB3Q,KAAK2Q,mBACzBtE,sBAAuBrM,KAAKqM,sBAC5BuE,mBAAoB5Q,KAAK4Q,mBACzBC,kBAAmB5Q,EAAMI,UAAUwQ,kBAAkBC,KAAK7Q,EAAMI,WAChE0Q,mBAAoB9Q,EAAMI,UAAU0Q,mBAAmBD,KAAK7Q,EAAMI,WAClE2Q,qBAAsB/Q,EAAMI,UAAU2Q,qBAAqBF,KAAK7Q,EAAMI,YAExEmG,KAAMxG,KAAKiR,2BAEf,CAgBAd,qBACE,OAAInQ,KAAKC,MAAMiD,UACNgO,GAAAA,GAAAA,YAELlR,KAAKC,MAAMkE,UACN+M,GAAAA,GAAAA,YAGFA,GAAAA,GAAAA,SACT,CAyCAD,2BACE,MAAO,CACLvU,MAAOK,EAAAA,GAAAA,WACPyK,OAAQ,GACRgB,WAAWC,EAAAA,EAAAA,MAEf,CAEAC,oBACE,MAAM,MAAEtI,EAAK,UAAEC,GAAcL,KAAKC,MAGlCD,KAAK6I,KAAKC,IAAI1I,EAAM0P,OAAO5G,UAAUiI,GAAAA,GAAcnR,KAAKoR,YACxDpR,KAAK6I,KAAKC,IAAI1I,EAAM0P,OAAO5G,UAAUmI,GAAAA,GAAarR,KAAKsR,WAEvDjR,EAAUkR,iBAAiBvR,KAAKC,MAAMG,OAGlCJ,KAAKwR,iBACPxR,KAAKuJ,SAAS,CACZ/C,MAAMiL,EAAAA,GAAAA,GAAiBrR,EAAOC,GAC9B4P,aAAa,KAKZjQ,KAAKgO,qBACRhO,KAAKuJ,SAAS,CAAE0G,aAAa,IAG/BjQ,KAAK6I,KAAKC,IACR1I,EACGyG,iBACAkC,QAAQ,CAAEC,gBAAgB,EAAMC,iBAAiB,IACjDC,UAAU,CACTC,KAAO3C,GAASxG,KAAK0R,aAAalL,MAKxCmL,GAAAA,EAAAA,OAAiB3R,MACnB,CAEAwJ,uBACExJ,KAAK6I,KAAKY,cACVkI,GAAAA,EAAAA,OAAiB3R,KACnB,CAEA4R,gBAAgBpD,GACd,MAAM,KAAEhI,GAASxG,KAAKtD,MACtB,GAAI8J,EAAKgC,UAAW,CAClB,MAAMqJ,EAAQrD,EAASM,GAAGgD,UAAYtL,EAAKgC,UAAUsG,GAAGgD,UACxD,GAAID,EAAQ,IAGV,YADAE,QAAQC,IAAI,mBAAoBhS,KAAKC,MAAMG,MAAM/C,MAAOwU,EAG5D,CACA7R,KAAKuJ,SAAS,CAAEiF,YAClB,CAEA7E,mBAAmBC,GACjB,MAAM,SAAEhP,EAAQ,MAAET,GAAU6F,KAAKC,OAC3B,QAAEqM,GAAYtM,KAAKtD,MAEnBwT,EAAMlQ,KAAKmQ,qBAEb7D,EAAQ4D,MAAQA,GAClBlQ,KAAKuJ,SAAS,CACZ+C,QAAS,OAAF,UACFA,EAAO,CACV4D,UAMFtV,IAAagP,EAAUhP,UACrBA,GAEEoF,KAAKtD,MAAMkR,mBACb5N,KAAKoR,YAMPjX,IAAUyP,EAAUzP,OACtBwX,GAAAA,EAAAA,eAAyB3R,KAE7B,CAKA0R,aAAalL,GACX,MAAM,UAAEnG,EAAS,MAAED,EAAK,OAAEsD,GAAW1D,KAAKC,MAG1C,GAAIyD,EAAOC,KAAKC,cAEd,YADA5D,KAAKuJ,SAAS,CAAE/C,KAAMxG,KAAKiR,6BAI7B,IACI5H,GADA,YAAE4G,GAAgBjQ,KAAKtD,MAG3B,OAAQ8J,EAAK9J,OACX,KAAKK,EAAAA,GAAAA,QAGH,GAAIiD,KAAKtD,MAAM8J,KAAK9J,QAAUK,EAAAA,GAAAA,QAC5B,OAEF,MACF,KAAKA,EAAAA,GAAAA,MACH,MAAM,MAAEwJ,GAAUC,EACdD,GACE8C,IAAiB9C,EAAM+C,UACzBD,EAAe9C,EAAM+C,SAGzB,MACF,KAAKvM,EAAAA,GAAAA,KAECsD,EAAU4R,WACZ7R,EAAM8R,aAAe1L,EAAKgB,OAAOlI,KAAK8G,IAAU+L,EAAAA,GAAAA,IAAe/L,MAE7D6J,IACFA,GAAc,GAKpBjQ,KAAKuJ,SAAS,CAAE0G,cAAa5G,eAAc7C,OAAMgI,cAAU9L,GAC7D,CAuGI8O,uBACF,MAAM,MAAEpR,GAAUJ,KAAKC,MACvB,OAAOG,EAAM8R,cAAgB9R,EAAM8R,aAAatW,MAClD,CAEIoS,0BACF,QAAShO,KAAKC,MAAMyD,OAAOC,KAAKC,eAAiB5D,KAAKwR,iBACxD,CASAY,+BAA+BC,EAA4BC,GACzD,OAAOD,IAAiBtV,EAAAA,GAAAA,MAAqBuV,EAAW1O,aAC1D,CAEA2O,gBAAgBF,GACd,MAAM,YAAEpC,GAAgBjQ,KAAKtD,MAC7B,OACEsD,KAAKgO,qBACLiC,IACCoC,IAAiBtV,EAAAA,GAAAA,SAAwBsV,IAAiBtV,EAAAA,GAAAA,WAE/D,CAEAyV,mBAAmBC,EAAoBC,GAAqB,QAC1D,MAAM,MAAEtS,EAAK,OAAEsD,EAAM,UAAErD,GAAcL,KAAKC,OACpC,cAAEsO,EAAa,KAAE/H,GAASxG,KAAKtD,OAC7BA,MAAO2V,GAAiB7L,EAGhC,GAAIxG,KAAKuS,gBAAgBF,GACvB,OAAO,KAKLrS,KAAKoS,+BAA+BC,EAAc3O,EAAOC,OAC3DgP,GAAAA,EAAAA,qBAGF,MAAMC,EAAiBlP,EAAOtD,MACxBoI,EAAiD,QAAxC,EAAsB,QAAtB,EAAGxI,KAAKtD,MAAM8R,gBAAQ,QAAIhI,EAAKgC,iBAAS,QAAIxI,KAAK+N,QAAQvF,YAClEqK,EAAezS,EAAM0S,aAM3B,OAFA9S,KAAKgQ,YAAY9D,UAAuC,IAA3B7L,EAAU+L,cAGrC,+BACE,SAAC2G,GAAA,GAAoB,CAAClH,MAAO7L,KAAKtD,MAAM4P,QAAQ,UAC9C,SAACsG,EAAc,CACbrY,GAAI6F,EAAM7F,GACViM,KAAMA,EACNnJ,MAAO+C,EAAM/C,MACbmL,UAAWA,EACXwK,SAAUhT,KAAKC,MAAMI,UAAUiO,cAC/BrJ,QAAS4N,EACTpG,YAAarM,EAAMqM,YACnB5B,YAAazK,EAAMyK,YACnB1Q,MAAOsY,EACPrY,OAAQsY,EACRnE,cAAeA,EACf0E,iBAAkB7S,EAAM6S,iBACxBtF,gBAAiB3N,KAAK2N,gBACtBnB,oBAAqBxM,KAAKwM,oBAC1B0G,kBAAmBlT,KAAKkT,kBACxB3D,SAAUlP,EAAUyP,YAK9B,CAEAqD,YAAYhZ,EAAeC,GAAgB,QACzC,MAAM,MAAEgG,EAAK,OAAEsD,EAAM,UAAErD,GAAcL,KAAKC,OACpC,cAAEsO,EAAa,KAAE/H,GAASxG,KAAKtD,OAC/B,MAAEa,GAAUkF,GAAAA,GACV/F,MAAO2V,GAAiB7L,EAGhC,GAAIxG,KAAKuS,gBAAgBF,GACvB,OAAO,KAKLrS,KAAKoS,+BAA+BC,EAAc3O,EAAOC,OAC3DgP,GAAAA,EAAAA,qBAGF,MAAMC,EAAiBlP,EAAOtD,MACxBoI,EAAiD,QAAxC,EAAsB,QAAtB,EAAGxI,KAAKtD,MAAM8R,gBAAQ,QAAIhI,EAAKgC,iBAAS,QAAIxI,KAAK+N,QAAQvF,YAClE4K,EAAepT,KAAKiK,mBAAqB,EAAI1M,EAAM2M,kBACnDmJ,EAAgB3P,EAAOyG,UAAY,EAAI5M,EAAM6M,aAC7CkJ,EAAanZ,EAAwB,EAAhBkZ,EAAoBhJ,EAAAA,GACzCkJ,EAAmBnZ,EAASgZ,EAA+B,EAAhBC,EAAoBhJ,EAAAA,GAC/Da,EAAyBH,IAAW,CACxC,iBAAiB,EACjB,4BAA6BrH,EAAOyG,YAEhC0I,EAAezS,EAAM0S,aAI3B9S,KAAKgQ,YAAY9D,UAAuC,IAA3B7L,EAAU+L,aAEvC,MAAM4G,EAAWhT,KAAKC,MAAMuT,UAAYxT,KAAKC,MAAMI,UAAUiO,cAE7D,OACE,+BACE,gBAAKtR,UAAWkO,EAAuB,UACrC,SAACuI,GAAA,EAAqB,CAAC9P,KAAMD,EAAOC,KAAK,UACvC,SAACoP,GAAA,GAAoB,CAAClH,MAAO7L,KAAKtD,MAAM4P,QAAQ,UAC9C,SAACsG,EAAc,CACbrY,GAAI6F,EAAM7F,GACViM,KAAMA,EACNnJ,MAAO+C,EAAM/C,MACbmL,UAAWA,EACXwK,SAAUA,EACV/N,QAAS4N,EACTpG,YAAarM,EAAMqM,YACnB5B,YAAazK,EAAMyK,YACnB1Q,MAAOmZ,EACPlZ,OAAQmZ,EACRhF,cAAeA,EACf0E,iBAAkB7S,EAAM6S,iBACxBtF,gBAAiB3N,KAAK2N,gBACtBnB,oBAAqBxM,KAAKwM,oBAC1B0G,kBAAmBlT,KAAKkT,kBACxB3D,SAAUlP,EAAUyP,gBAOlC,CAEA7F,mBACE,MAAM,MAAE7J,GAAUJ,KAAKC,OACjB,KAAEuG,GAASxG,KAAKtD,MAGtB,QAAI8J,EAAKqB,UAAWrB,EAAKqB,QAAQC,YAIzB1H,EAAMwK,UAChB,CAEA7K,SAAS,MACP,MAAM,UAAEM,EAAS,MAAED,EAAK,UAAE+D,EAAS,UAAEjB,EAAS,MAAE/I,EAAK,OAAEC,EAAM,OAAEsJ,GAAW1D,KAAKC,OACzE,aAAEoJ,EAAY,KAAE7C,GAASxG,KAAKtD,OAC9B,YAAEmO,GAAgBzK,EAElBqG,EAA4B,QAAlB,EAAGD,EAAKC,kBAAU,aAAf,EAAiB/J,MAE9BoO,EAAsBC,IAAW,CACrC,mBAAmB,EACnB,4BAA6B1O,EAAYwE,EAAAA,GAAAA,cAA8BmK,UACvE,+BAAgCH,EAChC,4BAA6B7K,KAAKiK,mBAClC,CAAE,sBAAqBxD,UAA8B/D,IAAf+D,IAKlCpJ,EAAQ+C,EAAMsG,kBACdyD,EAA0BzG,EAAOyG,UAAY,OAAS,KACtDuJ,EAAY,EAChB,SAACjX,EAA2B,CAACC,MAAO8J,EAAK9J,MAAOC,QAJ5B,IAAMyD,EAAMyG,iBAAiBC,eAI2B,sBAG9E,OAAIrE,GAAAA,EAAAA,eAAAA,kBAEA,SAACkR,GAAA,GAAW,CAACxZ,MAAOA,EAAOC,OAAQA,EAAQiD,MAAOA,EAAOqW,UAAWA,EAAWE,QAASzJ,EAAU,SAC/F,CAACsI,EAAYC,KACZ,+BACE,SAACmB,GAAA,GAAa,CACZC,aAAc,CAACtN,EAAM9C,EAAQtD,EAAM0S,cACnCiB,QAAS/T,KAAKgU,aACdC,UAAWjU,KAAKkU,oBAAoB,SAEnC,IAAe,IAAd,MAAE3N,GAAO,EACT,OAAIA,EACK,KAEFvG,KAAKwS,mBAAmBC,EAAYC,EAAY,SASjE,qBACE1V,UAAW8N,EACX,aAAY1D,EAAAA,GAAAA,WAAAA,OAAAA,MAAAA,iBAAmDhH,EAAM/C,OAAO,WAE5E,SAACiJ,GAAW,CACVlG,MAAOA,EACPC,UAAWA,EACXhD,MAAO+C,EAAM/C,MACb2J,YAAa5G,EAAM4G,YACnBE,MAAO9G,EAAM8G,MACbX,MAAO8C,EACPnG,UAAWA,EACXiB,UAAWA,EACXsC,WAAYA,EACZD,KAAMA,KAER,SAACqN,GAAA,GAAa,CACZC,aAAc,CAACtN,EAAM9C,EAAQtD,EAAM0S,cACnCiB,QAAS/T,KAAKgU,aACdC,UAAWjU,KAAKkU,oBAAoB,SAEnC,IAAe,IAAd,MAAE3N,GAAO,EACT,OAAIA,EACK,KAEFvG,KAAKmT,YAAYhZ,EAAOC,EAAO,MAMlD,E,yHC5mBF,MAYM+Q,GAAqB,CACzBgJ,eAAc,KACdC,sBAAqBA,EAAAA,IAGjBC,IAAYhJ,EAAAA,EAAAA,UAjBM,CAAC3O,EAAmBuD,KAC1C,MAAMqU,EAAa5X,EAAM6X,OAAOtU,EAAMuU,UACtC,OAAKF,EAIE,CACL5Q,OAAQ4Q,EAAW5Q,OACnB6I,cAAe+H,EAAW/H,eALnB,CAAE7I,OAAQ,KAMlB,GAQwCyH,IAIpC,MAAMsJ,WAAkCvV,EAAAA,cAAqB,mEAYzC2M,IACvB7L,KAAKC,MAAMmU,sBAAsB,CAAE1J,IAAK1K,KAAKC,MAAMuU,SAAU3I,SAAQ,IACtE,8BAEqB6I,IACpB1U,KAAKC,MAAMG,MAAMxF,SAAW8Z,CAAC,IAC9B,uBAEa,KACP1U,KAAKC,MAAMyD,QACd1D,KAAKC,MAAMkU,eAAenU,KAAKC,MAAMG,MACvC,IACD,uBAEcxF,IACb,MAAM,UAAEyF,EAAS,MAAED,EAAK,UAAE+D,EAAS,UAAEjB,EAAS,MAAE/I,EAAK,OAAEC,EAAM,OAAEsJ,EAAM,SAAE8P,GAAaxT,KAAKC,MAEzF,OAAKyD,EAIDA,GAAUA,EAAOiR,kBAEjB,SAACvJ,GAAkB,CACjB1H,OAAQA,EACRtD,MAAOA,EACPC,UAAWA,EACX8D,UAAWA,EACXjB,UAAWA,EACXtI,SAAUA,EACVT,MAAOA,EACPC,OAAQA,KAMZ,SAAC6R,GAAiB,CAChBvI,OAAQA,EACRtD,MAAOA,EACPC,UAAWA,EACX8D,UAAWA,EACXjB,UAAWA,EACXtI,SAAUA,EACVT,MAAOA,EACPC,OAAQA,EACRiS,sBAAuBrM,KAAKqM,sBAC5BmH,SAAUA,IA7BL,IA8BL,GAEL,CAzDD9K,oBACE1I,KAAKC,MAAMG,MAAMxF,UAAYoF,KAAKC,MAAM2U,KACnC5U,KAAKC,MAAM2U,MACd5U,KAAK6U,aAET,CAsDA9U,SACE,MAAM,MAAE5F,EAAK,OAAEC,EAAM,KAAEwa,GAAS5U,KAAKC,MAErC,OAAO2U,GACL,SAAC3a,EAAU,CAACE,MAAOA,EAAOC,OAAQA,EAAQE,SAAU0F,KAAK8U,mBAAoBza,OAAQ2F,KAAK6U,YAAY,SACnG7U,KAAKmT,cAGRnT,KAAKmT,aAAY,EAErB,EACD,GA3EYsB,GAAyB,eACE,CACpCG,MAAM,IA2EH,MAAMG,GAAiBV,GAAUI,G,2CCjHnCO,E,2NAAQ,SAARA,GAAAA,EAAQ,cAARA,EAAQ,YAARA,EAAQ,eAARA,IAAAA,EAAQ,KAeN,MAAMjO,UAA0BkO,EAAAA,UAAiB,oDACnCnS,EAAAA,EAAAA,OAAY,sBAEjB,KACZ,MAAM,MAAE1C,EAAK,MAAEmG,GAAUvG,KAAKC,MAC9B,OAAIsG,EACKyO,EAASE,MAEZ9U,EAAM4G,YACHgO,EAASG,KAEd/U,EAAM8G,OAAS9G,EAAM8G,MAAMtL,OACtBoZ,EAASI,WADlB,CAIgB,IACjB,yBAEgB,KACf,MAAM,MAAEhV,GAAUJ,KAAKC,MACjBoV,EAAWjV,EAAM4G,aAAe,GAChCsO,GAAuBC,EAAAA,EAAAA,KAAiBC,QAAQH,EAAUjV,EAAM6G,YAChEwO,GAA6BC,EAAAA,EAAAA,GAAeJ,GAC5CpO,EAAQlH,KAAKC,MAAMiH,OAASlH,KAAKC,MAAMiH,MAAMyO,SAASvV,EAAM6S,kBAElE,OACE,iBAAKjW,UAAU,mCAAkC,WAC/C,gBAAK4Y,wBAAyB,CAAEC,OAAQJ,KAEvCvO,GAASA,EAAMtL,OAAS,IACvB,eAAIoB,UAAU,0BAAyB,SACpCkK,EAAM5H,KAAI,CAACsG,EAAMpG,KAEd,yBACE,cAAGxC,UAAU,gCAAgC8H,KAAMc,EAAKd,KAAM3I,OAAQyJ,EAAKzJ,OAAO,SAC/EyJ,EAAKvI,SAFDmC,SASb,IAET,uBAKc,KACbqB,EAAAA,GAAAA,QAAwB,CACtBU,QAASvB,KAAKC,MAAMG,MAAM7F,GAC1BiH,WAAYE,EAAAA,EAAAA,OACZ,GACH,CAEDoU,iBAAiBC,EAAoB7Y,EAAyBP,GAC5D,MAAMY,EAAQwY,IAAaf,EAASE,MAAQ,QAAU,OAChDlY,EAAa,wCAAuC+Y,EAASvZ,gBAC7DwZ,EAAY5O,EAAAA,GAAAA,WAAAA,OAAAA,MAAAA,iBAAmD2O,EAASvZ,eAE9E,OACE,SAAC,IAAO,CAACU,QAASA,EAAS+Y,UAAU,YAAY1Y,MAAOA,EAAO2Y,aAAW,YACxE,oBAAQxW,KAAK,SAAS1C,UAAWA,EAAWL,QAASA,EAAS,aAAYqZ,EAAU,iBAClF,cAAG,iBAAYhZ,UAAU,QAAO,OAChC,iBAAMA,UAAU,iCAIxB,CAEA+C,SACE,MAAM,MAAEwG,GAAUvG,KAAKC,MACjB8V,EAAiC/V,KAAKmW,cAE5C,OAAKJ,EAIDA,IAAaf,EAASE,OAAS3O,EAC1BvG,KAAK8V,iBAAiBC,EAAUxP,EAAOvG,KAAKoW,cAGjDL,IAAaf,EAASG,MAAQY,IAAaf,EAASI,MAC/CpV,KAAK8V,iBAAiBC,EAAU/V,KAAKqW,gBAGvC,KAXE,IAYX,EAGF,S,oHCrGA,MAAMC,EAAqB,iBACrBC,GAAuBC,EAAAA,EAAAA,IAAwBF,GAE9C,SAAShJ,EACd/B,EACAO,EACAW,EACAjG,GAEA,MAAM,UAAEkG,GAAcD,EAEhBgK,EAAclL,EACdoB,EAAeD,EAAUE,UAAU2J,GAEzC,GAAI5J,EAAe,EAAG,CACpB,GAAIb,IAAS4K,EAAAA,EAAAA,gBAA4C,CACvD,MAAM7J,EAAWvB,EAAe,CAACmL,KAAgBE,EAAuBjK,EAAWlG,KAEnF,OAAO,OAAP,UACKiG,EAAW,CACdC,UAAW,IAAID,EAAYC,UAAWG,IAE1C,CAEA,MACMA,EAAWvB,EADIsL,EAAgBpQ,EAAMiQ,IAG3C,OAAO,OAAP,UACKhK,EAAW,CACdC,UAAW,IAAID,EAAYC,UAAWG,IAE1C,CAEA,MAAMC,EAAgBC,MAAMC,KAAKN,IAC1BrR,GAAWyR,EAAc+J,OAAOlK,EAAc,GAErD,GAAIb,IAAS4K,EAAAA,EAAAA,gBAA4C,CACvD,IAAIzJ,EAAW6J,EAAwBzb,GACvC,MAAM0b,EAAqBJ,EAAuB7J,EAAetG,GAMjE,GAJIuQ,EAAmBnb,OAAS,IAC9BqR,EAAWA,EAAS+J,QAAQC,GAAOF,EAAmBG,QAAQD,GAAM,KAGlEhK,EAAS,KAAOwJ,GAAmC,IAApBxJ,EAASrR,OAC1C,OAAO,OAAP,UACK6Q,EAAW,CACdC,UAAWI,IAIf,MAAMD,EAAWvB,EAAe,CAACmL,KAAgBM,IAEjD,OAAO,OAAP,UACKtK,EAAW,CACdC,UAAW,IAAII,EAAeD,IAElC,CAEA,MAAMA,EAAWsK,EAAuB9b,EAASob,GAEjD,OAAIW,EAAqBvK,EAAUrG,GAC1B,OAAP,UACKiG,EAAW,CACdC,UAAWI,IAIR,OAAP,UACKL,EAAW,CACdC,UAAW,IAAII,EAAeD,IAElC,CAEA,SAASvB,EACP+L,GAG0B,UAF1BvL,EAAO,UAAH,6CAAGwL,EAAAA,GAAAA,QACPC,EAA6B,uCAW7B,OATAA,EAAmB,QAAX,EAAGA,SAAQ,QAAI,CACrBhd,GAAI,kBACJsR,MAAO,CACL2L,KAAK,EACLtS,QAAQ,EACRuS,SAAS,IAIN,CACLC,YAAapB,EACb7K,QAAS,CACPlR,GAAImR,EAAAA,GAAAA,QACJzG,QAAS,CACP6G,KAAMA,EACNuL,MAAOA,EACPM,OAAQ7L,IAASwL,EAAAA,GAAAA,QAA6B,mBAAgB5U,EAC9DkV,UAAU,IAGdjM,WAAY,CAAC,OAAD,UAEL4L,EAAQ,CACX1L,MAAO,CACL2L,KAAK,EACLtS,QAAQ,EACRuS,SAAS,MAKnB,CAEA,MAAMN,EAAyB,SAC7B9b,EACAob,GAE6B,IAD7B3K,EAAO,UAAH,6CAAGwL,EAAAA,GAAAA,QAEP,MAAMC,EAAWlc,EAAQsQ,WAAWkM,MAAM1K,GAAe,oBAATA,EAAE5S,KAC5C0S,EAAW6J,EAAwBzb,GACnCyc,EAAQ7K,EAASL,WAAWxP,GAASA,IAASqZ,IAQpD,OANIqB,EAAQ,EACV7K,EAAS5J,KAAKoT,GAEdxJ,EAAS4J,OAAOiB,EAAO,GAGlBxM,EAAe2B,EAAUnB,EAAMyL,EACxC,EAEMT,EAA2BiB,IAA6C,MAC5E,MAAMV,EAA4B,QAAvB,EAAGU,EAAKtM,QAAQxG,eAAO,aAApB,EAAsBoS,MACpC,OAAKtK,MAAMiL,QAAQX,GAGZ,IAAIA,GAFF,EAEQ,EAGbD,EAAuB,CAACvK,EAAoCrG,IACzDsQ,EAAwBjK,GAAUjR,SAAWgb,EAAgBpQ,GAAM5K,OAGtEgb,EAAkB,CAACpQ,EAAmByR,KAC1C,MAAMC,EAAS,IAAIC,IAEnB,IAAK,MAAM/R,KAASI,EAClB,IAAK,MAAM4R,KAAShS,EAAMiS,OAAQ,CAChC,GAAID,EAAM1Y,OAAS4Y,EAAAA,GAAAA,OACjB,SAGF,MAAMlb,GAAOmb,EAAAA,EAAAA,GAAoBH,EAAOhS,EAAOI,GAE3CpJ,IAAS6a,GAIbC,EAAOpP,IAAI1L,EACb,CAGF,OAAO2P,MAAMC,KAAKkL,EAAO,EAGrBvB,EAAyB,CAACjK,EAAiClG,KAC/D,IAAI6Q,EAAkB,GAEtB,IAAK,MAAMxK,KAAYH,EAAW,OAChC,MAAM6K,EAAW1K,EAASlB,WAAWkM,MAAM1K,GAAe,oBAATA,EAAE5S,KAEnD,QAAiBmI,IAAb6U,IAAqD,KAAb,QAAd,EAAAA,EAAS1L,aAAK,aAAd,EAAgB3G,QAAiB,CAC7D,MACMuG,EADO+M,EAAAA,GAAAA,IAAkB3L,EAASpB,QAAQlR,IAC3Bke,IAAI5L,EAASpB,QAAQxG,SAE1C,IAAK,MAAMmB,KAASI,EAClB,IAAK,MAAM4R,KAAShS,EAAMiS,OAAQ,CAChC,GAAID,EAAM1Y,OAAS4Y,EAAAA,GAAAA,OACjB,SAGF,MAAMlb,GAAOmb,EAAAA,EAAAA,GAAoBH,EAAOhS,EAAOI,GAE3CiF,EAAQ2M,EAAOhS,EAAOI,IACxB6Q,EAAMhU,KAAKjG,EAEf,CAEJ,CACF,CAEA,OAAOia,CAAK,C,yVC7Fd,MAAMqB,EAAyB,SAC7BnE,GAE4C,IAD5CoE,EAAmD,UAAH,6CAAG,CAAC,EAiBpD,OAfApE,EAAOqE,SAASxY,IACVA,EAAMmU,OACRmE,EAAuBtY,EAAMmU,OAAQoE,GAC5BvY,EAAMyY,SACfzY,EAAMyY,QAAQD,SAASzc,IAAW,MACX,QAArB,EAAIA,EAAO2c,kBAAU,OAAjB,EAAmBpZ,OACjBiZ,EAAQxc,EAAO2c,WAAWpZ,MAC5BiZ,EAAQxc,EAAO2c,WAAWpZ,MAAM2D,KAAKlH,GAErCwc,EAAQxc,EAAO2c,WAAWpZ,MAAQ,CAACvD,GAEvC,GAEJ,IAEKwc,CACT,EAWO,SAASI,EAAcC,GAC5B,OAAOpK,MAAOqK,EAAUC,KAAa,QAEnCD,GAASE,EAAAA,EAAAA,OAGT,MAAMC,QAhHVxK,eACEoK,EACAC,EACAC,GAGA,MAAMG,EAAQ1W,EAAAA,EAAAA,UAA8B2W,GAC5C,GAAID,EAEF,OADAE,IACOF,EAGT,IACE,OAAQL,EAAKQ,WACX,KAAKC,EAAAA,GAAAA,KAAsB,CAEzB,MAAML,QAA8BM,EAAAA,GAAAA,IAAe,wBAGnD,GAAIN,EAAQO,YAAa,CACvB,MAAMC,EAASC,EAAAA,EAAAA,iBAA8BT,EAAQO,aAErD,OADA9Y,EAAAA,GAAAA,QAAwB+Y,GACjB,IACT,CAMA,OAHAR,EAAQzV,KAAKmW,SAAU,EACvBV,EAAQzV,KAAKoW,UAAW,EACxBX,EAAQzV,KAAKqW,SAAU,EAChBZ,CACT,CACA,KAAKK,EAAAA,GAAAA,OACH,aAAaQ,EAAAA,GAAAA,cAAiC,SAAUjB,EAAKkB,QAASlB,EAAKmB,aAE7E,KAAKV,EAAAA,GAAAA,OAAwB,CAC3B,MAAML,QAA8Ba,EAAAA,GAAAA,cAAiCjB,EAAKoB,QAASpB,EAAKkB,QAASlB,EAAKqB,QAEtG,GAAIrB,EAAKsB,QAAUlB,EAAQzV,KAAKrB,MAAQiY,EAAAA,GAAAA,UAAuB,CAE7D,MAAMC,EAAeX,EAAAA,EAAAA,iBAA8BT,EAAQzV,KAAKrB,KAC1DmY,EAAc5Z,EAAAA,GAAAA,cAA8BmK,SAE9CwP,IAAiBC,IAEnB5Z,EAAAA,GAAAA,QAAwB,OAAD,UAClBA,EAAAA,GAAAA,cAA6B,CAChCmK,SAAUwP,KAEZzI,QAAQC,IAAI,6BAA8BwI,EAAcC,GAE5D,CACA,OAAOrB,CACT,CACA,KAAKK,EAAAA,GAAAA,IACH,OAAOiB,EAAyB1B,EAAK2B,YAAa3B,EAAK4B,WAEzD,KAAKnB,EAAAA,GAAAA,KAAsB,OACzB,MAAMnd,EAAmB,QAAf,EAAG0c,EAAKkB,eAAO,QAAI,GAC7B,aAAaD,EAAAA,GAAAA,cAAiCR,EAAAA,GAAAA,KAAsBnd,EAAMA,EAC5E,CACA,QACE,KAAM,CAAEgN,QAAS,iBAAmB0P,EAAKQ,WAW/C,CATE,MAAOqB,GAEP,OAAIC,EAAAA,EAAAA,IAAaD,IAAQA,EAAIE,YAI7B9B,GAAS+B,EAAAA,EAAAA,IAAoB,CAAE1R,QAAS,4BAA6B/C,MAAOsU,KAC5E9I,QAAQxL,MAAMsU,IAJL,IAMX,CACF,CAuC0BI,CAAejC,EAAMC,GAG3C,IAAKG,EACH,OAOF,IAAI/Y,EAHJ4Y,GAASiC,EAAAA,EAAAA,OAIT,IACE7a,EAAY,IAAI8a,EAAAA,EAAe/B,EAAQ/Y,UAAW+Y,EAAQzV,KAK5D,CAJE,MAAOkX,GAGP,OAFA5B,GAAS+B,EAAAA,EAAAA,IAAoB,CAAE1R,QAAS,gCAAiC/C,MAAOsU,UAChF9I,QAAQxL,MAAMsU,EAEhB,CAGA,MAAMO,EAAalC,IACbmC,EAAcxa,EAAAA,GAAAA,kBAEfwa,EAAYC,OAEfza,EAAAA,GAAAA,QAAwB,CAAEya,MAAOF,EAAWG,KAAKD,QAAS,GAI5D,MAAMvN,GAAmBjL,EAAAA,EAAAA,OACU0Y,EAAAA,EAAAA,MAGtBC,WAAWpb,GAExB0N,EAAQ2N,KAAKrb,GAEb,MAAMsb,GAAeC,EAAAA,EAAAA,IAAsB,QAAZ,EAAC5C,EAAKqB,cAAM,QAAIha,EAAU+N,WAEnD6K,GAAS4C,EAAAA,EAAAA,IAAyBF,EAActb,IAOtD,IAHeyb,EAAAA,EAAAA,IAA2B,CAAEzb,YAAW0N,YAChDsB,IAAI,CAAEhP,YAAWiP,MAAOvB,EAAQvF,eAEnCuT,EAAAA,EAAAA,IAAmB7C,OAAgByC,GAQnCzC,IAAW7Y,UAAU2b,YAAcC,EAAAA,GAAAA,SAAvC,CAIA,IACE5b,EAAU6b,iBAGNb,EAAYc,eACd9b,EAAU+b,cAAc7Z,OAAOmQ,YAAa2I,EAAYgB,OAG1DrD,EAAKsD,cAAcC,uBAAuBlc,EAM5C,CALE,MAAOwa,GACHA,aAAe3F,OACjB+D,GAASuD,EAAAA,EAAAA,KAAUC,EAAAA,EAAAA,IAAwB,wBAAyB5B,KAEtE9I,QAAQxL,MAAMsU,EAChB,CAGI7B,EAAKQ,YAAcC,EAAAA,GAAAA,MC7NpB,SAAgCpZ,GACrC,MAAMqc,EAAuC,CAC3CxO,YAAa7N,EAAU9F,GACvBoiB,cAAetc,EAAUhD,MACzBse,aAActb,EAAU+N,IACxBwO,WAAYvc,EAAUsD,KAAKkZ,YAC3BC,UAAWC,EAAAA,GAAAA,cACXC,mBAAoB3c,EAAUsD,KAAKqZ,qBAGrCC,EAAAA,EAAAA,IAAoBP,EACtB,CDmNMQ,CAAuB7c,GAGvB8c,EAAAA,EAAAA,MAAuB9c,EAAU+N,MAEjC+O,EAAAA,EAAAA,QAI0B,KAAxB9c,EAAU+c,WACZC,EAAAA,EAAAA,IAAahd,EAAU+c,YAEvBC,EAAAA,EAAAA,IAAa5a,EAAAA,EAAAA,SAAAA,KAAAA,WAIf6a,EAAAA,EAAAA,QACE,IAAIC,EAAAA,GAAqB,CACvBrP,YAAa7N,EAAU+N,IACvBkN,MAAOF,EAAWG,KAAKD,MACvBkC,OAA4B,QAAtB,EAAEpC,EAAWG,KAAKA,YAAI,aAApB,EAAsBhhB,GAC9BkjB,eAAgBhb,EAAAA,EAAAA,UAAAA,QAChBkW,QAASD,EAAuBrY,EAAUkU,WAK9C0E,GAASyE,EAAAA,EAAAA,IAAuBrd,GA/ChC,CA+C2C,CAE/C,CAEO,SAASqa,EAAyBC,EAAsBC,GAC7D,MAAMpU,EAAO,CACX7C,KAAM,CACJqW,SAAS,EACTD,UAAU,EACV4D,WAAW,EACXC,OAAO,EACPC,SAAU,GAEZxd,UAAW,CACThD,MAAO,gBACPkX,OAAQ,CACN,CACE7U,KAAMkb,QAAAA,EAAa,YACnBkD,QAAS,CAAE9f,EAAG,EAAGC,EAAG,EAAG8f,EAAG,GAAIC,EAAG,GACjC3gB,MAAO,kBAUf,OAJIsd,IACFnU,EAAK7C,KAAKka,SAAWI,SAAStD,EAAa,KAGtCnU,CACT,CAEA,MAAM8S,EAAwB,wBAEvB,SAAS4E,EAAoC7E,GAClD1W,EAAAA,EAAAA,UAAgB2W,EAAuBD,EACzC,CAEO,SAASE,IACd5W,EAAAA,EAAAA,OAAa2W,EACf,C,uIE3RO,SAAS7H,EAAiBrR,EAAmBC,GAClD,MAAMmG,GAAO2X,EAAAA,EAAAA,IAAuB/d,EAAM8R,cACpCkM,EAAS,IAAIC,EAAAA,EACbpZ,EAAU,CAAE5E,YAAWiP,OAAO7G,EAAAA,EAAAA,OAC9B6V,EAAmBF,EAAOG,QAAQtZ,GAAWmZ,EAAOI,yBAAyBne,EAAWD,EAAM7F,IAAM,GACpGkkB,EAAc,CAAC,IAAIC,EAAAA,EAAeJ,IAGxC,MAAO,CACL9V,WAHesF,EAAAA,EAAAA,IAAwB1N,GAAO0C,EAAAA,EAAAA,MAAa0F,aAGvCA,UACpB9L,MAAOK,EAAAA,GAAAA,KACPyK,QAAQmX,EAAAA,EAAAA,IAAoB,CAC1BnY,OACAiG,YAAa,CACXmS,SAAU,CAAC,EACXlS,UAAW,IAEbuG,iBAAkB7S,EAAM6S,iBACxB4L,oBAAqBze,EAAMsD,OAAQmb,oBACnCthB,MAAOkF,EAAAA,GAAAA,OACPuQ,SAAU3S,EAAUiO,gBAEtBmQ,cAEJ,C,kBClCO,IAAK/c,E,iBASX,SATWA,GAAAA,EAAU,YAAVA,EAAU,YAAVA,EAAU,cAAVA,EAAU,cAAVA,EAAU,YAAVA,EAAU,cAAVA,EAAU,kBAAVA,EAAU,YASrB,CATWA,IAAAA,EAAU,I,0FCmDf,MAAMod,EAAyBjT,IACpC,MAAM3E,EAAQ2E,EAAMuM,MAAMlR,MAC1B,GAAKA,GAA0B,IAAjBA,EAAMtL,OAIpB,MAAO,CACL+Z,SAAW1C,IACT,MAAMhM,EAA0C,CAAC,EAEjD,GAAI4E,EAAMkT,KAAM,CACd,MAAM,UAAEC,GAAcnT,EAAMkT,KAE5B9X,EAAqB,SAAI,CACvB4E,MAAO,CACLzO,KAAM4hB,EAAU5hB,KAChB6hB,MAAOD,EAAUC,OAEnBvhB,KAAM,UAGR,MAAM0a,OAA2B1V,IAAnBmJ,EAAMqT,SAAyBF,EAAU3G,OAAOxM,EAAMqT,eAAYxc,EAEhF,GAAI0V,EAAO,CAST,GARAnR,EAAoB,QAAI,CACtB4E,MAAO,CACLzO,KAAMgb,EAAMhb,KACZ+hB,OAAQ/G,EAAM+G,QAEhBzhB,KAAM,cAGegF,IAAnBmJ,EAAMuT,UAA0BvT,EAAMuT,UAAY,EAAG,CACvD,MAAM,UAAEC,IAAcC,EAAAA,EAAAA,IAAaN,GACnC/X,EAAoB,QAAI,CACtB4E,MAAO,CACL0T,IAAKnH,EAAM/R,OAAOoS,IAAI5M,EAAMuT,UAC5BI,QAAS3T,EAAM4T,QAAQD,QACvB9hB,MAAMgiB,EAAAA,EAAAA,IAAuB7T,EAAM4T,SACnCzQ,KAAMqQ,EAAYA,EAAUhZ,OAAOoS,IAAI5M,EAAMuT,eAAY1c,GAE3DhF,KAAM,QAEV,CAGImO,EAAMkT,OACR9X,EAAmB,OAAI,CACrB4E,MAAO,CACLzO,KAAM4hB,EAAU5hB,KAChB6hB,MAAOD,EAAUC,MACjB5G,QAAQsH,EAAAA,EAAAA,GAA2B,CACjCvZ,MAAO4Y,EACPI,SAAUvT,EAAMuT,YAGpB1hB,KAAM,QAGZ,MAEEuJ,EAAoB,QAAI,CACtB4E,MAAO,CACL0T,IAAK1T,EAAM4T,QAAQD,QACnBA,QAAS3T,EAAM4T,QAAQD,QACvB9hB,MAAMgiB,EAAAA,EAAAA,IAAuB7T,EAAM4T,SACnCG,KAAM/T,EAAMzO,MAEdM,KAAM,QAGZ,MACEqU,QAAQC,IAAI,QAASnG,GAGvB,MAAM2J,EAA+B,CAAC3J,EAAegU,EAA8BC,KACjF,MAAMC,EAAwB,OAAH,UACrB9Y,EACD4Y,GAEL,OAAO5M,EAAiBpH,EAAOkU,EAAWD,EAAI,EAGhD,OAAO5Y,EAAM5H,KAAKsG,IACToa,EAAAA,EAAAA,MAAaC,mBAAmBra,EAAM4P,EAAS3J,IACtD,EAEL,EAGU1E,EAAyB/G,IACpC,MAAM8G,EAAQ9G,EAAM8G,MAEpB,GAAKA,GAA0B,IAAjBA,EAAMtL,OAIpB,MAAO,CACL+Z,SAAU,IACDzO,EAAM5H,KAAKsG,IACToa,EAAAA,EAAAA,MAAaC,mBAAmBra,EAAMxF,EAAM6S,iBAAkB7S,KAG1E,C,kBCrJI,SAASK,EAAsB/D,EAAmB2c,GACvD,OAAO3c,EAAM6X,OAAO8E,EAAM3O,IAC5B,C","sources":["webpack://grafana/./public/app/features/dashboard/dashgrid/LazyLoader.tsx","webpack://grafana/./public/app/routes/utils.ts","webpack://grafana/./public/app/features/dashboard/dashgrid/PanelHeader/PanelHeaderLoadingIndicator.tsx","webpack://grafana/./public/app/features/dashboard/dashgrid/PanelHeader/PanelHeaderMenuTrigger.tsx","webpack://grafana/./public/app/features/dashboard/dashgrid/PanelHeader/PanelHeaderMenu.tsx","webpack://grafana/./public/app/features/dashboard/dashgrid/PanelHeader/PanelHeaderMenuProvider.tsx","webpack://grafana/./public/app/features/dashboard/utils/getPanelMenu.ts","webpack://grafana/./public/app/features/dashboard/dashgrid/PanelHeader/PanelHeaderMenuWrapper.tsx","webpack://grafana/./public/app/features/dashboard/dashgrid/PanelHeader/PanelHeaderNotice.tsx","webpack://grafana/./public/app/features/dashboard/dashgrid/PanelHeader/PanelHeaderNotices.tsx","webpack://grafana/./public/app/features/dashboard/dashgrid/PanelHeader/PanelHeader.tsx","webpack://grafana/./public/app/features/dashboard/dashgrid/PanelChromeAngular.tsx","webpack://grafana/./public/app/plugins/panel/timeseries/overrides/colorSeriesConfigFactory.ts","webpack://grafana/./public/app/features/dashboard/dashgrid/PanelStateWrapper.tsx","webpack://grafana/./public/app/features/dashboard/dashgrid/DashboardPanel.tsx","webpack://grafana/./public/app/features/dashboard/dashgrid/PanelHeader/PanelHeaderCorner.tsx","webpack://grafana/./public/app/features/dashboard/dashgrid/SeriesVisibilityConfigFactory.ts","webpack://grafana/./public/app/features/dashboard/state/initDashboard.ts","webpack://grafana/./public/app/features/dashboard/state/analyticsProcessor.ts","webpack://grafana/./public/app/features/dashboard/utils/loadSnapshotData.ts","webpack://grafana/./public/app/features/inspector/types.ts","webpack://grafana/./public/app/features/panel/panellinks/linkSuppliers.ts","webpack://grafana/./public/app/features/panel/state/selectors.ts"],"sourcesContent":["import React, { useRef, useState } from 'react';\nimport { useEffectOnce } from 'react-use';\n\nimport { useUniqueId } from 'app/plugins/datasource/influxdb/components/useUniqueId';\n\nexport interface Props {\n children: React.ReactNode | (({ isInView }: { isInView: boolean }) => React.ReactNode);\n width?: number;\n height?: number;\n onLoad?: () => void;\n onChange?: (isInView: boolean) => void;\n}\n\nexport function LazyLoader({ children, width, height, onLoad, onChange }: Props) {\n const id = useUniqueId();\n const [loaded, setLoaded] = useState(false);\n const [isInView, setIsInView] = useState(false);\n const wrapperRef = useRef<HTMLDivElement>(null);\n\n useEffectOnce(() => {\n LazyLoader.addCallback(id, (entry) => {\n if (!loaded && entry.isIntersecting) {\n setLoaded(true);\n onLoad?.();\n }\n\n setIsInView(entry.isIntersecting);\n onChange?.(entry.isIntersecting);\n });\n\n const wrapperEl = wrapperRef.current;\n\n if (wrapperEl) {\n LazyLoader.observer.observe(wrapperEl);\n }\n\n return () => {\n delete LazyLoader.callbacks[id];\n wrapperEl && LazyLoader.observer.unobserve(wrapperEl);\n if (Object.keys(LazyLoader.callbacks).length === 0) {\n LazyLoader.observer.disconnect();\n }\n };\n });\n\n return (\n <div id={id} ref={wrapperRef} style={{ width, height }}>\n {loaded && (typeof children === 'function' ? children({ isInView }) : children)}\n </div>\n );\n}\n\nLazyLoader.callbacks = {} as Record<string, (e: IntersectionObserverEntry) => void>;\nLazyLoader.addCallback = (id: string, c: (e: IntersectionObserverEntry) => void) => (LazyLoader.callbacks[id] = c);\nLazyLoader.observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n LazyLoader.callbacks[entry.target.id](entry);\n }\n },\n { rootMargin: '100px' }\n);\n","import { NavLinkDTO } from '@grafana/data';\n\nexport function isSoloRoute(path: string): boolean {\n return /(d-solo|dashboard-solo)/.test(path?.toLowerCase());\n}\n\nexport function pluginHasRootPage(pluginId: string, navTree: NavLinkDTO[]): boolean {\n return Boolean(\n navTree\n .find((navLink) => navLink.id === 'apps')\n ?.children?.find((app) => app.id === `plugin-page-${pluginId}`)\n ?.children?.some((page) => page.url?.endsWith(`/a/${pluginId}`))\n );\n}\n","import { css } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { GrafanaTheme2, LoadingState } from '@grafana/data';\nimport { Icon, Tooltip, useStyles2 } from '@grafana/ui';\n\ninterface Props {\n state: LoadingState;\n onClick: () => void;\n}\n\nexport const PanelHeaderLoadingIndicator: FC<Props> = ({ state, onClick }) => {\n const styles = useStyles2(getStyles);\n\n if (state === LoadingState.Loading) {\n return (\n <div className=\"panel-loading\" onClick={onClick}>\n <Tooltip content=\"Cancel query\">\n <Icon className=\"panel-loading__spinner spin-clockwise\" name=\"sync\" />\n </Tooltip>\n </div>\n );\n }\n\n if (state === LoadingState.Streaming) {\n return (\n <div className=\"panel-loading\" onClick={onClick}>\n <div title=\"Streaming (click to stop)\" className={styles.streamIndicator} />\n </div>\n );\n }\n\n return null;\n};\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n streamIndicator: css`\n width: 10px;\n height: 10px;\n background: ${theme.colors.text.disabled};\n box-shadow: 0 0 2px ${theme.colors.text.disabled};\n border-radius: 50%;\n position: relative;\n top: 6px;\n right: 1px;\n `,\n };\n}\n","import React, { HTMLAttributes, MouseEvent, ReactElement, useCallback, useState } from 'react';\n\nimport { CartesianCoords2D } from '@grafana/data';\n\ninterface PanelHeaderMenuTriggerApi {\n panelMenuOpen: boolean;\n closeMenu: () => void;\n}\n\ninterface Props extends Omit<HTMLAttributes<HTMLDivElement>, 'children'> {\n children: (props: PanelHeaderMenuTriggerApi) => ReactElement;\n}\n\nexport const PanelHeaderMenuTrigger = ({ children, ...divProps }: Props) => {\n const [clickCoordinates, setClickCoordinates] = useState<CartesianCoords2D>({ x: 0, y: 0 });\n const [panelMenuOpen, setPanelMenuOpen] = useState<boolean>(false);\n\n const onMenuToggle = useCallback(\n (event: MouseEvent<HTMLDivElement>) => {\n if (!isClick(clickCoordinates, eventToClickCoordinates(event))) {\n return;\n }\n\n setPanelMenuOpen(!panelMenuOpen);\n },\n [clickCoordinates, panelMenuOpen, setPanelMenuOpen]\n );\n\n const onMouseDown = useCallback(\n (event: MouseEvent<HTMLDivElement>) => {\n setClickCoordinates(eventToClickCoordinates(event));\n },\n [setClickCoordinates]\n );\n\n return (\n <header {...divProps} className=\"panel-title-container\" onClick={onMenuToggle} onMouseDown={onMouseDown}>\n {children({ panelMenuOpen, closeMenu: () => setPanelMenuOpen(false) })}\n </header>\n );\n};\n\nfunction isClick(current: CartesianCoords2D, clicked: CartesianCoords2D, deadZone = 3.5): boolean {\n // A \"deadzone\" radius is added so that if the cursor is moved within this radius\n // between mousedown and mouseup, it's still considered a click and not a drag.\n const clickDistance = Math.sqrt((current.x - clicked.x) ** 2 + (current.y - clicked.y) ** 2);\n return clickDistance <= deadZone;\n}\n\nfunction eventToClickCoordinates(event: MouseEvent<HTMLDivElement>): CartesianCoords2D {\n return {\n x: event.clientX,\n y: event.clientY,\n };\n}\n","import React, { PureComponent } from 'react';\n\nimport { PanelMenuItem } from '@grafana/data';\n\nimport { PanelHeaderMenuItem } from './PanelHeaderMenuItem';\n\nexport interface Props {\n items: PanelMenuItem[];\n}\n\nexport class PanelHeaderMenu extends PureComponent<Props> {\n renderItems = (menu: PanelMenuItem[], isSubMenu = false) => {\n return (\n <ul className=\"dropdown-menu dropdown-menu--menu panel-menu\" role={isSubMenu ? '' : 'menu'}>\n {menu.map((menuItem, idx: number) => {\n return (\n <PanelHeaderMenuItem\n key={`${menuItem.text}${idx}`}\n type={menuItem.type}\n text={menuItem.text}\n iconClassName={menuItem.iconClassName}\n onClick={menuItem.onClick}\n shortcut={menuItem.shortcut}\n >\n {menuItem.subMenu && this.renderItems(menuItem.subMenu, true)}\n </PanelHeaderMenuItem>\n );\n })}\n </ul>\n );\n };\n\n render() {\n return <div className=\"panel-menu-container dropdown open\">{this.renderItems(this.props.items)}</div>;\n }\n}\n","import { FC, ReactElement, useEffect, useState } from 'react';\n\nimport { PanelMenuItem } from '@grafana/data';\nimport { getPanelStateForModel } from 'app/features/panel/state/selectors';\nimport { useSelector } from 'app/types';\n\nimport { DashboardModel, PanelModel } from '../../state';\nimport { getPanelMenu } from '../../utils/getPanelMenu';\n\ninterface PanelHeaderMenuProviderApi {\n items: PanelMenuItem[];\n}\n\ninterface Props {\n panel: PanelModel;\n dashboard: DashboardModel;\n children: (props: PanelHeaderMenuProviderApi) => ReactElement;\n}\n\nexport const PanelHeaderMenuProvider: FC<Props> = ({ panel, dashboard, children }) => {\n const [items, setItems] = useState<PanelMenuItem[]>([]);\n const angularComponent = useSelector((state) => getPanelStateForModel(state, panel)?.angularComponent);\n\n useEffect(() => {\n setItems(getPanelMenu(dashboard, panel, angularComponent));\n }, [dashboard, panel, angularComponent, setItems]);\n\n return children({ items });\n};\n","import { PanelMenuItem } from '@grafana/data';\nimport { AngularComponent, getDataSourceSrv, locationService, reportInteraction } from '@grafana/runtime';\nimport { PanelCtrl } from 'app/angular/panel/panel_ctrl';\nimport config from 'app/core/config';\nimport { t } from 'app/core/internationalization';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport { getExploreUrl } from 'app/core/utils/explore';\nimport { DashboardModel } from 'app/features/dashboard/state/DashboardModel';\nimport { PanelModel } from 'app/features/dashboard/state/PanelModel';\nimport {\n addLibraryPanel,\n copyPanel,\n duplicatePanel,\n removePanel,\n sharePanel,\n toggleLegend,\n unlinkLibraryPanel,\n} from 'app/features/dashboard/utils/panel';\nimport { InspectTab } from 'app/features/inspector/types';\nimport { isPanelModelLibraryPanel } from 'app/features/library-panels/guard';\nimport { store } from 'app/store/store';\n\nimport { navigateToExplore } from '../../explore/state/main';\nimport { getTimeSrv } from '../services/TimeSrv';\n\nexport function getPanelMenu(\n dashboard: DashboardModel,\n panel: PanelModel,\n angularComponent?: AngularComponent | null\n): PanelMenuItem[] {\n const onViewPanel = (event: React.MouseEvent<any>) => {\n event.preventDefault();\n locationService.partial({\n viewPanel: panel.id,\n });\n };\n\n const onEditPanel = (event: React.MouseEvent<any>) => {\n event.preventDefault();\n locationService.partial({\n editPanel: panel.id,\n });\n };\n\n const onSharePanel = (event: React.MouseEvent<any>) => {\n event.preventDefault();\n sharePanel(dashboard, panel);\n };\n\n const onAddLibraryPanel = (event: React.MouseEvent<any>) => {\n event.preventDefault();\n addLibraryPanel(dashboard, panel);\n };\n\n const onUnlinkLibraryPanel = (event: React.MouseEvent<any>) => {\n event.preventDefault();\n unlinkLibraryPanel(panel);\n };\n\n const onInspectPanel = (tab?: InspectTab) => {\n locationService.partial({\n inspect: panel.id,\n inspectTab: tab,\n });\n\n reportInteraction('grafana_panel_menu_inspect', {\n tab: tab ?? InspectTab.Data,\n });\n };\n\n const onMore = (event: React.MouseEvent<any>) => {\n event.preventDefault();\n };\n\n const onDuplicatePanel = (event: React.MouseEvent<any>) => {\n event.preventDefault();\n duplicatePanel(dashboard, panel);\n };\n\n const onCopyPanel = (event: React.MouseEvent<any>) => {\n event.preventDefault();\n copyPanel(panel);\n };\n\n const onRemovePanel = (event: React.MouseEvent<any>) => {\n event.preventDefault();\n removePanel(dashboard, panel, true);\n };\n\n const onNavigateToExplore = (event: React.MouseEvent<any>) => {\n event.preventDefault();\n const openInNewWindow =\n event.ctrlKey || event.metaKey ? (url: string) => window.open(`${config.appSubUrl}${url}`) : undefined;\n store.dispatch(navigateToExplore(panel, { getDataSourceSrv, getTimeSrv, getExploreUrl, openInNewWindow }) as any);\n };\n\n const onToggleLegend = (event: React.MouseEvent) => {\n event.preventDefault();\n toggleLegend(panel);\n };\n const menu: PanelMenuItem[] = [];\n\n if (!panel.isEditing) {\n const viewTextTranslation = t('panel.header-menu.view', `View`);\n menu.push({\n text: viewTextTranslation,\n iconClassName: 'eye',\n onClick: onViewPanel,\n shortcut: 'v',\n });\n }\n\n if (dashboard.canEditPanel(panel) && !panel.isEditing) {\n menu.push({\n text: 'Edit',\n iconClassName: 'edit',\n onClick: onEditPanel,\n shortcut: 'e',\n });\n }\n\n const shareTextTranslation = t('panel.header-menu.share', `Share`);\n\n menu.push({\n text: shareTextTranslation,\n iconClassName: 'share-alt',\n onClick: onSharePanel,\n shortcut: 'p s',\n });\n\n if (contextSrv.hasAccessToExplore() && !(panel.plugin && panel.plugin.meta.skipDataQuery)) {\n menu.push({\n text: 'Explore',\n iconClassName: 'compass',\n onClick: onNavigateToExplore,\n shortcut: 'x',\n });\n }\n\n const inspectMenu: PanelMenuItem[] = [];\n\n // Only show these inspect actions for data plugins\n if (panel.plugin && !panel.plugin.meta.skipDataQuery) {\n const dataTextTranslation = t('panel.header-menu.inspect-data', `Data`);\n\n inspectMenu.push({\n text: dataTextTranslation,\n onClick: (e: React.MouseEvent<any>) => onInspectPanel(InspectTab.Data),\n });\n\n if (dashboard.meta.canEdit) {\n inspectMenu.push({\n text: 'Query',\n onClick: (e: React.MouseEvent<any>) => onInspectPanel(InspectTab.Query),\n });\n }\n }\n\n const jsonTextTranslation = t('panel.header-menu.inspect-json', `Panel JSON`);\n\n inspectMenu.push({\n text: jsonTextTranslation,\n onClick: (e: React.MouseEvent<any>) => onInspectPanel(InspectTab.JSON),\n });\n\n const inspectTextTranslation = t('panel.header-menu.inspect', `Inspect`);\n\n menu.push({\n type: 'submenu',\n text: inspectTextTranslation,\n iconClassName: 'info-circle',\n onClick: (e: React.MouseEvent<any>) => onInspectPanel(),\n shortcut: 'i',\n subMenu: inspectMenu,\n });\n\n const subMenu: PanelMenuItem[] = [];\n const canEdit = dashboard.canEditPanel(panel);\n\n if (canEdit && !(panel.isViewing || panel.isEditing)) {\n subMenu.push({\n text: 'Duplicate',\n onClick: onDuplicatePanel,\n shortcut: 'p d',\n });\n\n subMenu.push({\n text: 'Copy',\n onClick: onCopyPanel,\n });\n\n if (isPanelModelLibraryPanel(panel)) {\n subMenu.push({\n text: 'Unlink library panel',\n onClick: onUnlinkLibraryPanel,\n });\n } else {\n subMenu.push({\n text: 'Create library panel',\n onClick: onAddLibraryPanel,\n });\n }\n }\n\n // add old angular panel options\n if (angularComponent) {\n const scope = angularComponent.getScope();\n const panelCtrl: PanelCtrl = scope.$$childHead.ctrl;\n const angularMenuItems = panelCtrl.getExtendedMenu();\n\n for (const item of angularMenuItems) {\n const reactItem: PanelMenuItem = {\n text: item.text,\n href: item.href,\n shortcut: item.shortcut,\n };\n\n if (item.click) {\n reactItem.onClick = () => {\n scope.$eval(item.click, { ctrl: panelCtrl });\n };\n }\n\n subMenu.push(reactItem);\n }\n }\n\n if (panel.options.legend) {\n subMenu.push({\n text: panel.options.legend.showLegend\n ? t('panel.header-menu.hide-legend', 'Hide legend')\n : t('panel.header-menu.show-legend', 'Show legend'),\n onClick: onToggleLegend,\n shortcut: 'p l',\n });\n }\n\n // When editing hide most actions\n if (panel.isEditing) {\n subMenu.length = 0;\n }\n\n if (canEdit && panel.plugin && !panel.plugin.meta.skipDataQuery) {\n subMenu.push({\n text: 'Get help',\n onClick: (e: React.MouseEvent) => onInspectPanel(InspectTab.Help),\n });\n }\n\n if (subMenu.length) {\n const moreTextTranslation = t('panel.header-menu.more', `More...`);\n menu.push({\n type: 'submenu',\n text: moreTextTranslation,\n iconClassName: 'cube',\n subMenu,\n onClick: onMore,\n });\n }\n\n if (dashboard.canEditPanel(panel) && !panel.isEditing && !panel.isViewing) {\n menu.push({ type: 'divider', text: '' });\n\n menu.push({\n text: 'Remove',\n iconClassName: 'trash-alt',\n onClick: onRemovePanel,\n shortcut: 'p r',\n });\n }\n\n return menu;\n}\n","import React, { FC } from 'react';\n\nimport { DashboardModel, PanelModel } from '../../state';\n\nimport { PanelHeaderMenu } from './PanelHeaderMenu';\nimport { PanelHeaderMenuProvider } from './PanelHeaderMenuProvider';\n\ninterface Props {\n panel: PanelModel;\n dashboard: DashboardModel;\n onClose: () => void;\n}\n\nexport const PanelHeaderMenuWrapper: FC<Props> = ({ panel, dashboard }) => {\n return (\n <PanelHeaderMenuProvider panel={panel} dashboard={dashboard}>\n {({ items }) => {\n return <PanelHeaderMenu items={items} />;\n }}\n </PanelHeaderMenuProvider>\n );\n};\n","import React, { FC } from 'react';\n\nimport { QueryResultMetaNotice } from '@grafana/data';\nimport { Icon, Tooltip } from '@grafana/ui';\n\ninterface Props {\n notice: QueryResultMetaNotice;\n onClick: (e: React.SyntheticEvent, tab: string) => void;\n}\n\nexport const PanelHeaderNotice: FC<Props> = ({ notice, onClick }) => {\n const iconName =\n notice.severity === 'error' || notice.severity === 'warning' ? 'exclamation-triangle' : 'info-circle';\n\n return (\n <Tooltip content={notice.text} key={notice.severity}>\n {notice.inspect ? (\n <div className=\"panel-info-notice pointer\" onClick={(e) => onClick(e, notice.inspect!)}>\n <Icon name={iconName} style={{ marginRight: '8px' }} />\n </div>\n ) : (\n <a className=\"panel-info-notice\" href={notice.link} target=\"_blank\" rel=\"noreferrer\">\n <Icon name={iconName} style={{ marginRight: '8px' }} />\n </a>\n )}\n </Tooltip>\n );\n};\n","import React, { FC, useCallback } from 'react';\n\nimport { DataFrame, QueryResultMetaNotice } from '@grafana/data';\nimport { locationService } from '@grafana/runtime';\n\nimport { PanelHeaderNotice } from './PanelHeaderNotice';\n\ninterface Props {\n panelId: number;\n frames: DataFrame[];\n}\n\nexport const PanelHeaderNotices: FC<Props> = ({ frames, panelId }) => {\n const openInspect = useCallback(\n (e: React.SyntheticEvent, tab: string) => {\n e.stopPropagation();\n locationService.partial({ inspect: panelId, inspectTab: tab });\n },\n [panelId]\n );\n\n // dedupe on severity\n const notices: Record<string, QueryResultMetaNotice> = {};\n for (const frame of frames) {\n if (!frame.meta || !frame.meta.notices) {\n continue;\n }\n\n for (const notice of frame.meta.notices) {\n notices[notice.severity] = notice;\n }\n }\n\n return (\n <>\n {Object.values(notices).map((notice) => (\n <PanelHeaderNotice notice={notice} onClick={openInspect} key={notice.severity} />\n ))}\n </>\n );\n};\n","import { css, cx } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { DataLink, GrafanaTheme2, PanelData } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { Icon, useStyles2, ClickOutsideWrapper } from '@grafana/ui';\nimport { DashboardModel } from 'app/features/dashboard/state/DashboardModel';\nimport { PanelModel } from 'app/features/dashboard/state/PanelModel';\nimport { getPanelLinksSupplier } from 'app/features/panel/panellinks/linkSuppliers';\n\nimport PanelHeaderCorner from './PanelHeaderCorner';\nimport { PanelHeaderLoadingIndicator } from './PanelHeaderLoadingIndicator';\nimport { PanelHeaderMenuTrigger } from './PanelHeaderMenuTrigger';\nimport { PanelHeaderMenuWrapper } from './PanelHeaderMenuWrapper';\nimport { PanelHeaderNotices } from './PanelHeaderNotices';\n\nexport interface Props {\n panel: PanelModel;\n dashboard: DashboardModel;\n title?: string;\n description?: string;\n links?: DataLink[];\n error?: string;\n alertState?: string;\n isViewing: boolean;\n isEditing: boolean;\n data: PanelData;\n}\n\nexport const PanelHeader: FC<Props> = ({ panel, error, isViewing, isEditing, data, alertState, dashboard }) => {\n const onCancelQuery = () => panel.getQueryRunner().cancelQuery();\n const title = panel.getDisplayTitle();\n const className = cx('panel-header', !(isViewing || isEditing) ? 'grid-drag-handle' : '');\n const styles = useStyles2(panelStyles);\n\n return (\n <>\n <PanelHeaderLoadingIndicator state={data.state} onClick={onCancelQuery} />\n <PanelHeaderCorner\n panel={panel}\n title={panel.title}\n description={panel.description}\n scopedVars={panel.scopedVars}\n links={getPanelLinksSupplier(panel)}\n error={error}\n />\n <div className={className}>\n <PanelHeaderMenuTrigger data-testid={selectors.components.Panels.Panel.title(title)}>\n {({ closeMenu, panelMenuOpen }) => {\n return (\n <ClickOutsideWrapper onClick={closeMenu} parent={document}>\n <div className=\"panel-title\">\n <PanelHeaderNotices frames={data.series} panelId={panel.id} />\n {alertState ? (\n <Icon\n name={alertState === 'alerting' ? 'heart-break' : 'heart'}\n className=\"icon-gf panel-alert-icon\"\n style={{ marginRight: '4px' }}\n size=\"sm\"\n />\n ) : null}\n <h2 className={styles.titleText}>{title}</h2>\n {!dashboard.meta.publicDashboardAccessToken && (\n <div data-testid=\"panel-dropdown\">\n <Icon name=\"angle-down\" className=\"panel-menu-toggle\" />\n {panelMenuOpen ? (\n <PanelHeaderMenuWrapper panel={panel} dashboard={dashboard} onClose={closeMenu} />\n ) : null}\n </div>\n )}\n {data.request && data.request.timeInfo && (\n <span className=\"panel-time-info\">\n <Icon name=\"clock-nine\" size=\"sm\" /> {data.request.timeInfo}\n </span>\n )}\n </div>\n </ClickOutsideWrapper>\n );\n }}\n </PanelHeaderMenuTrigger>\n </div>\n </>\n );\n};\n\nconst panelStyles = (theme: GrafanaTheme2) => {\n return {\n titleText: css`\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n max-width: calc(100% - 38px);\n cursor: pointer;\n font-weight: ${theme.typography.fontWeightMedium};\n font-size: ${theme.typography.body.fontSize};\n margin: 0;\n\n &:hover {\n color: ${theme.colors.text.primary};\n }\n .panel-has-alert & {\n max-width: calc(100% - 54px);\n }\n `,\n };\n};\n","import classNames from 'classnames';\nimport React, { PureComponent } from 'react';\nimport { connect, MapDispatchToProps, MapStateToProps } from 'react-redux';\nimport { Subscription } from 'rxjs';\n\nimport { getDefaultTimeRange, LoadingState, PanelData, PanelPlugin } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { AngularComponent, getAngularLoader, locationService } from '@grafana/runtime';\nimport config from 'app/core/config';\nimport { PANEL_BORDER } from 'app/core/constants';\nimport { setPanelAngularComponent } from 'app/features/panel/state/reducers';\nimport { getPanelStateForModel } from 'app/features/panel/state/selectors';\nimport { StoreState } from 'app/types';\n\nimport { isSoloRoute } from '../../../routes/utils';\nimport { getTimeSrv, TimeSrv } from '../services/TimeSrv';\nimport { DashboardModel, PanelModel } from '../state';\n\nimport { PanelHeader } from './PanelHeader/PanelHeader';\n\ninterface OwnProps {\n panel: PanelModel;\n dashboard: DashboardModel;\n plugin: PanelPlugin;\n isViewing: boolean;\n isEditing: boolean;\n isInView: boolean;\n width: number;\n height: number;\n}\n\ninterface ConnectedProps {\n angularComponent?: AngularComponent;\n}\n\ninterface DispatchProps {\n setPanelAngularComponent: typeof setPanelAngularComponent;\n}\n\nexport type Props = OwnProps & ConnectedProps & DispatchProps;\n\nexport interface State {\n data: PanelData;\n errorMessage?: string;\n}\n\ninterface AngularScopeProps {\n panel: PanelModel;\n dashboard: DashboardModel;\n size: {\n height: number;\n width: number;\n };\n}\n\nexport class PanelChromeAngularUnconnected extends PureComponent<Props, State> {\n element: HTMLElement | null = null;\n timeSrv: TimeSrv = getTimeSrv();\n scopeProps?: AngularScopeProps;\n subs = new Subscription();\n\n constructor(props: Props) {\n super(props);\n this.state = {\n data: {\n state: LoadingState.NotStarted,\n series: [],\n timeRange: getDefaultTimeRange(),\n },\n };\n }\n\n componentDidMount() {\n const { panel } = this.props;\n this.loadAngularPanel();\n\n // subscribe to data events\n const queryRunner = panel.getQueryRunner();\n\n // we are not displaying any of this data so no need for transforms or field config\n this.subs.add(\n queryRunner.getData({ withTransforms: false, withFieldConfig: false }).subscribe({\n next: (data: PanelData) => this.onPanelDataUpdate(data),\n })\n );\n }\n\n onPanelDataUpdate(data: PanelData) {\n let errorMessage: string | undefined;\n\n if (data.state === LoadingState.Error) {\n const { error } = data;\n if (error) {\n if (errorMessage !== error.message) {\n errorMessage = error.message;\n }\n }\n }\n\n this.setState({ data, errorMessage });\n }\n\n componentWillUnmount() {\n this.subs.unsubscribe();\n if (this.props.angularComponent) {\n this.props.angularComponent?.destroy();\n }\n }\n\n componentDidUpdate(prevProps: Props, prevState: State) {\n const { plugin, height, width, panel } = this.props;\n\n if (prevProps.plugin !== plugin) {\n this.loadAngularPanel();\n }\n\n if (prevProps.width !== width || prevProps.height !== height) {\n if (this.scopeProps) {\n this.scopeProps.size.height = this.getInnerPanelHeight();\n this.scopeProps.size.width = this.getInnerPanelWidth();\n panel.render();\n }\n }\n }\n\n getInnerPanelHeight() {\n const { plugin, height } = this.props;\n const { theme } = config;\n\n const headerHeight = this.hasOverlayHeader() ? 0 : theme.panelHeaderHeight;\n const chromePadding = plugin.noPadding ? 0 : theme.panelPadding;\n return height - headerHeight - chromePadding * 2 - PANEL_BORDER;\n }\n\n getInnerPanelWidth() {\n const { plugin, width } = this.props;\n const { theme } = config;\n\n const chromePadding = plugin.noPadding ? 0 : theme.panelPadding;\n return width - chromePadding * 2 - PANEL_BORDER;\n }\n\n loadAngularPanel() {\n const { panel, dashboard, setPanelAngularComponent } = this.props;\n\n // if we have no element or already have loaded the panel return\n if (!this.element) {\n return;\n }\n\n const loader = getAngularLoader();\n const template = '<plugin-component type=\"panel\" class=\"panel-height-helper\"></plugin-component>';\n\n this.scopeProps = {\n panel: panel,\n dashboard: dashboard,\n size: { width: this.getInnerPanelWidth(), height: this.getInnerPanelHeight() },\n };\n\n setPanelAngularComponent({\n key: panel.key,\n angularComponent: loader.load(this.element, this.scopeProps, template),\n });\n }\n\n hasOverlayHeader() {\n const { panel } = this.props;\n const { data } = this.state;\n\n // always show normal header if we have time override\n if (data.request && data.request.timeInfo) {\n return false;\n }\n\n return !panel.hasTitle();\n }\n\n render() {\n const { dashboard, panel, isViewing, isEditing, plugin } = this.props;\n const { errorMessage, data } = this.state;\n const { transparent } = panel;\n\n const alertState = data.alertState?.state;\n\n const containerClassNames = classNames({\n 'panel-container': true,\n 'panel-container--absolute': isSoloRoute(locationService.getLocation().pathname),\n 'panel-container--transparent': transparent,\n 'panel-container--no-title': this.hasOverlayHeader(),\n 'panel-has-alert': panel.alert !== undefined,\n [`panel-alert-state--${alertState}`]: alertState !== undefined,\n });\n\n const panelContentClassNames = classNames({\n 'panel-content': true,\n 'panel-content--no-padding': plugin.noPadding,\n });\n\n return (\n <div className={containerClassNames} aria-label={selectors.components.Panels.Panel.containerByTitle(panel.title)}>\n <PanelHeader\n panel={panel}\n dashboard={dashboard}\n title={panel.title}\n description={panel.description}\n links={panel.links}\n error={errorMessage}\n isViewing={isViewing}\n isEditing={isEditing}\n data={data}\n alertState={alertState}\n />\n <div className={panelContentClassNames}>\n <div ref={(element) => (this.element = element)} className=\"panel-height-helper\" />\n </div>\n </div>\n );\n }\n}\n\nconst mapStateToProps: MapStateToProps<ConnectedProps, OwnProps, StoreState> = (state, props) => {\n return {\n angularComponent: getPanelStateForModel(state, props.panel)?.angularComponent,\n };\n};\n\nconst mapDispatchToProps: MapDispatchToProps<DispatchProps, OwnProps> = { setPanelAngularComponent };\n\nexport const PanelChromeAngular = connect(mapStateToProps, mapDispatchToProps)(PanelChromeAngularUnconnected);\n","import {\n ConfigOverrideRule,\n DynamicConfigValue,\n FieldColorModeId,\n FieldConfigSource,\n FieldMatcherID,\n} from '@grafana/data';\n\nexport const changeSeriesColorConfigFactory = (\n label: string,\n color: string,\n fieldConfig: FieldConfigSource\n): FieldConfigSource => {\n const { overrides } = fieldConfig;\n const currentIndex = fieldConfig.overrides.findIndex((override) => {\n return override.matcher.id === FieldMatcherID.byName && override.matcher.options === label;\n });\n\n if (currentIndex < 0) {\n return {\n ...fieldConfig,\n overrides: [...fieldConfig.overrides, createOverride(label, color)],\n };\n }\n\n const overridesCopy = Array.from(overrides);\n const existing = overridesCopy[currentIndex];\n const propertyIndex = existing.properties.findIndex((p) => p.id === 'color');\n\n if (propertyIndex < 0) {\n overridesCopy[currentIndex] = {\n ...existing,\n properties: [...existing.properties, createProperty(color)],\n };\n\n return {\n ...fieldConfig,\n overrides: overridesCopy,\n };\n }\n\n const propertiesCopy = Array.from(existing.properties);\n propertiesCopy[propertyIndex] = createProperty(color);\n\n overridesCopy[currentIndex] = {\n ...existing,\n properties: propertiesCopy,\n };\n\n return {\n ...fieldConfig,\n overrides: overridesCopy,\n };\n};\n\nconst createOverride = (label: string, color: string): ConfigOverrideRule => {\n return {\n matcher: {\n id: FieldMatcherID.byName,\n options: label,\n },\n properties: [createProperty(color)],\n };\n};\n\nconst createProperty = (color: string): DynamicConfigValue => {\n return {\n id: 'color',\n value: {\n mode: FieldColorModeId.Fixed,\n fixedColor: color,\n },\n };\n};\n","import classNames from 'classnames';\nimport React, { PureComponent } from 'react';\nimport { Subscription } from 'rxjs';\n\nimport {\n AbsoluteTimeRange,\n AnnotationChangeEvent,\n AnnotationEventUIModel,\n CoreApp,\n DashboardCursorSync,\n EventFilterOptions,\n FieldConfigSource,\n getDefaultTimeRange,\n LoadingState,\n PanelData,\n PanelPlugin,\n PanelPluginMeta,\n PluginContextProvider,\n TimeRange,\n toDataFrameDTO,\n toUtc,\n} from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { config, locationService, RefreshEvent } from '@grafana/runtime';\nimport { VizLegendOptions } from '@grafana/schema';\nimport {\n ErrorBoundary,\n PanelChrome,\n PanelContext,\n PanelContextProvider,\n PanelPadding,\n SeriesVisibilityChangeMode,\n} from '@grafana/ui';\nimport { PANEL_BORDER } from 'app/core/constants';\nimport { profiler } from 'app/core/profiler';\nimport { applyPanelTimeOverrides } from 'app/features/dashboard/utils/panel';\nimport { changeSeriesColorConfigFactory } from 'app/plugins/panel/timeseries/overrides/colorSeriesConfigFactory';\nimport { RenderEvent } from 'app/types/events';\n\nimport { isSoloRoute } from '../../../routes/utils';\nimport { deleteAnnotation, saveAnnotation, updateAnnotation } from '../../annotations/api';\nimport { getDashboardQueryRunner } from '../../query/state/DashboardQueryRunner/DashboardQueryRunner';\nimport { getTimeSrv, TimeSrv } from '../services/TimeSrv';\nimport { DashboardModel, PanelModel } from '../state';\nimport { loadSnapshotData } from '../utils/loadSnapshotData';\n\nimport { PanelHeader } from './PanelHeader/PanelHeader';\nimport { PanelHeaderLoadingIndicator } from './PanelHeader/PanelHeaderLoadingIndicator';\nimport { seriesVisibilityConfigFactory } from './SeriesVisibilityConfigFactory';\nimport { liveTimer } from './liveTimer';\n\nconst DEFAULT_PLUGIN_ERROR = 'Error in plugin';\n\nexport interface Props {\n panel: PanelModel;\n dashboard: DashboardModel;\n plugin: PanelPlugin;\n isViewing: boolean;\n isEditing: boolean;\n isInView: boolean;\n width: number;\n height: number;\n onInstanceStateChange: (value: any) => void;\n timezone?: string;\n}\n\nexport interface State {\n isFirstLoad: boolean;\n renderCounter: number;\n errorMessage?: string;\n refreshWhenInView: boolean;\n context: PanelContext;\n data: PanelData;\n liveTime?: TimeRange;\n}\n\nexport class PanelStateWrapper extends PureComponent<Props, State> {\n private readonly timeSrv: TimeSrv = getTimeSrv();\n private subs = new Subscription();\n private eventFilter: EventFilterOptions = { onlyLocal: true };\n\n constructor(props: Props) {\n super(props);\n\n // Can this eventBus be on PanelModel? when we have more complex event filtering, that may be a better option\n const eventBus = props.dashboard.events.newScopedBus(`panel:${props.panel.id}`, this.eventFilter);\n\n this.state = {\n isFirstLoad: true,\n renderCounter: 0,\n refreshWhenInView: false,\n context: {\n eventBus,\n app: this.getPanelContextApp(),\n sync: this.getSync,\n onSeriesColorChange: this.onSeriesColorChange,\n onToggleSeriesVisibility: this.onSeriesVisibilityChange,\n onAnnotationCreate: this.onAnnotationCreate,\n onAnnotationUpdate: this.onAnnotationUpdate,\n onAnnotationDelete: this.onAnnotationDelete,\n onInstanceStateChange: this.onInstanceStateChange,\n onToggleLegendSort: this.onToggleLegendSort,\n canAddAnnotations: props.dashboard.canAddAnnotations.bind(props.dashboard),\n canEditAnnotations: props.dashboard.canEditAnnotations.bind(props.dashboard),\n canDeleteAnnotations: props.dashboard.canDeleteAnnotations.bind(props.dashboard),\n },\n data: this.getInitialPanelDataState(),\n };\n }\n\n // Due to a mutable panel model we get the sync settings via function that proactively reads from the model\n getSync = () => (this.props.isEditing ? DashboardCursorSync.Off : this.props.dashboard.graphTooltip);\n\n onInstanceStateChange = (value: any) => {\n this.props.onInstanceStateChange(value);\n\n this.setState({\n context: {\n ...this.state.context,\n instanceState: value,\n },\n });\n };\n\n getPanelContextApp() {\n if (this.props.isEditing) {\n return CoreApp.PanelEditor;\n }\n if (this.props.isViewing) {\n return CoreApp.PanelViewer;\n }\n\n return CoreApp.Dashboard;\n }\n\n onSeriesColorChange = (label: string, color: string) => {\n this.onFieldConfigChange(changeSeriesColorConfigFactory(label, color, this.props.panel.fieldConfig));\n };\n\n onSeriesVisibilityChange = (label: string, mode: SeriesVisibilityChangeMode) => {\n this.onFieldConfigChange(\n seriesVisibilityConfigFactory(label, mode, this.props.panel.fieldConfig, this.state.data.series)\n );\n };\n\n onToggleLegendSort = (sortKey: string) => {\n const legendOptions: VizLegendOptions = this.props.panel.options.legend;\n\n // We don't want to do anything when legend options are not available\n if (!legendOptions) {\n return;\n }\n\n let sortDesc = legendOptions.sortDesc;\n let sortBy = legendOptions.sortBy;\n if (sortKey !== sortBy) {\n sortDesc = undefined;\n }\n\n // if already sort ascending, disable sorting\n if (sortDesc === false) {\n sortBy = undefined;\n sortDesc = undefined;\n } else {\n sortDesc = !sortDesc;\n sortBy = sortKey;\n }\n\n this.onOptionsChange({\n ...this.props.panel.options,\n legend: { ...legendOptions, sortBy, sortDesc },\n });\n };\n\n getInitialPanelDataState(): PanelData {\n return {\n state: LoadingState.NotStarted,\n series: [],\n timeRange: getDefaultTimeRange(),\n };\n }\n\n componentDidMount() {\n const { panel, dashboard } = this.props;\n\n // Subscribe to panel events\n this.subs.add(panel.events.subscribe(RefreshEvent, this.onRefresh));\n this.subs.add(panel.events.subscribe(RenderEvent, this.onRender));\n\n dashboard.panelInitialized(this.props.panel);\n\n // Move snapshot data into the query response\n if (this.hasPanelSnapshot) {\n this.setState({\n data: loadSnapshotData(panel, dashboard),\n isFirstLoad: false,\n });\n return;\n }\n\n if (!this.wantsQueryExecution) {\n this.setState({ isFirstLoad: false });\n }\n\n this.subs.add(\n panel\n .getQueryRunner()\n .getData({ withTransforms: true, withFieldConfig: true })\n .subscribe({\n next: (data) => this.onDataUpdate(data),\n })\n );\n\n // Listen for live timer events\n liveTimer.listen(this);\n }\n\n componentWillUnmount() {\n this.subs.unsubscribe();\n liveTimer.remove(this);\n }\n\n liveTimeChanged(liveTime: TimeRange) {\n const { data } = this.state;\n if (data.timeRange) {\n const delta = liveTime.to.valueOf() - data.timeRange.to.valueOf();\n if (delta < 100) {\n // 10hz\n console.log('Skip tick render', this.props.panel.title, delta);\n return;\n }\n }\n this.setState({ liveTime });\n }\n\n componentDidUpdate(prevProps: Props) {\n const { isInView, width } = this.props;\n const { context } = this.state;\n\n const app = this.getPanelContextApp();\n\n if (context.app !== app) {\n this.setState({\n context: {\n ...context,\n app,\n },\n });\n }\n\n // View state has changed\n if (isInView !== prevProps.isInView) {\n if (isInView) {\n // Check if we need a delayed refresh\n if (this.state.refreshWhenInView) {\n this.onRefresh();\n }\n }\n }\n\n // The timer depends on panel width\n if (width !== prevProps.width) {\n liveTimer.updateInterval(this);\n }\n }\n\n // Updates the response with information from the stream\n // The next is outside a react synthetic event so setState is not batched\n // So in this context we can only do a single call to setState\n onDataUpdate(data: PanelData) {\n const { dashboard, panel, plugin } = this.props;\n\n // Ignore this data update if we are now a non data panel\n if (plugin.meta.skipDataQuery) {\n this.setState({ data: this.getInitialPanelDataState() });\n return;\n }\n\n let { isFirstLoad } = this.state;\n let errorMessage: string | undefined;\n\n switch (data.state) {\n case LoadingState.Loading:\n // Skip updating state data if it is already in loading state\n // This is to avoid rendering partial loading responses\n if (this.state.data.state === LoadingState.Loading) {\n return;\n }\n break;\n case LoadingState.Error:\n const { error } = data;\n if (error) {\n if (errorMessage !== error.message) {\n errorMessage = error.message;\n }\n }\n break;\n case LoadingState.Done:\n // If we are doing a snapshot save data in panel model\n if (dashboard.snapshot) {\n panel.snapshotData = data.series.map((frame) => toDataFrameDTO(frame));\n }\n if (isFirstLoad) {\n isFirstLoad = false;\n }\n break;\n }\n\n this.setState({ isFirstLoad, errorMessage, data, liveTime: undefined });\n }\n\n onRefresh = () => {\n const { dashboard, panel, isInView, width } = this.props;\n\n if (!isInView) {\n this.setState({ refreshWhenInView: true });\n return;\n }\n\n const timeData = applyPanelTimeOverrides(panel, this.timeSrv.timeRange());\n\n // Issue Query\n if (this.wantsQueryExecution) {\n if (width < 0) {\n return;\n }\n\n if (this.state.refreshWhenInView) {\n this.setState({ refreshWhenInView: false });\n }\n panel.runAllPanelQueries({\n dashboardId: dashboard.id,\n dashboardUID: dashboard.uid,\n dashboardTimezone: dashboard.getTimezone(),\n publicDashboardAccessToken: dashboard.meta.publicDashboardAccessToken,\n timeData,\n width,\n });\n } else {\n // The panel should render on refresh as well if it doesn't have a query, like clock panel\n this.setState({\n data: { ...this.state.data, timeRange: this.timeSrv.timeRange() },\n renderCounter: this.state.renderCounter + 1,\n liveTime: undefined,\n });\n }\n };\n\n onRender = () => {\n const stateUpdate = { renderCounter: this.state.renderCounter + 1 };\n this.setState(stateUpdate);\n };\n\n onOptionsChange = (options: any) => {\n this.props.panel.updateOptions(options);\n };\n\n onFieldConfigChange = (config: FieldConfigSource) => {\n this.props.panel.updateFieldConfig(config);\n };\n\n onPanelError = (error: Error) => {\n const errorMessage = error.message || DEFAULT_PLUGIN_ERROR;\n if (this.state.errorMessage !== errorMessage) {\n this.setState({ errorMessage });\n }\n };\n\n onPanelErrorRecover = () => {\n this.setState({ errorMessage: undefined });\n };\n\n onAnnotationCreate = async (event: AnnotationEventUIModel) => {\n const isRegion = event.from !== event.to;\n const anno = {\n dashboardUID: this.props.dashboard.uid,\n panelId: this.props.panel.id,\n isRegion,\n time: event.from,\n timeEnd: isRegion ? event.to : 0,\n tags: event.tags,\n text: event.description,\n };\n await saveAnnotation(anno);\n getDashboardQueryRunner().run({ dashboard: this.props.dashboard, range: this.timeSrv.timeRange() });\n this.state.context.eventBus.publish(new AnnotationChangeEvent(anno));\n };\n\n onAnnotationDelete = async (id: string) => {\n await deleteAnnotation({ id });\n getDashboardQueryRunner().run({ dashboard: this.props.dashboard, range: this.timeSrv.timeRange() });\n this.state.context.eventBus.publish(new AnnotationChangeEvent({ id }));\n };\n\n onAnnotationUpdate = async (event: AnnotationEventUIModel) => {\n const isRegion = event.from !== event.to;\n const anno = {\n id: event.id,\n dashboardUID: this.props.dashboard.uid,\n panelId: this.props.panel.id,\n isRegion,\n time: event.from,\n timeEnd: isRegion ? event.to : 0,\n tags: event.tags,\n text: event.description,\n };\n await updateAnnotation(anno);\n\n getDashboardQueryRunner().run({ dashboard: this.props.dashboard, range: this.timeSrv.timeRange() });\n this.state.context.eventBus.publish(new AnnotationChangeEvent(anno));\n };\n\n get hasPanelSnapshot() {\n const { panel } = this.props;\n return panel.snapshotData && panel.snapshotData.length;\n }\n\n get wantsQueryExecution() {\n return !(this.props.plugin.meta.skipDataQuery || this.hasPanelSnapshot);\n }\n\n onChangeTimeRange = (timeRange: AbsoluteTimeRange) => {\n this.timeSrv.setTime({\n from: toUtc(timeRange.from),\n to: toUtc(timeRange.to),\n });\n };\n\n shouldSignalRenderingCompleted(loadingState: LoadingState, pluginMeta: PanelPluginMeta) {\n return loadingState === LoadingState.Done || pluginMeta.skipDataQuery;\n }\n\n skipFirstRender(loadingState: LoadingState) {\n const { isFirstLoad } = this.state;\n return (\n this.wantsQueryExecution &&\n isFirstLoad &&\n (loadingState === LoadingState.Loading || loadingState === LoadingState.NotStarted)\n );\n }\n\n renderPanelContent(innerWidth: number, innerHeight: number) {\n const { panel, plugin, dashboard } = this.props;\n const { renderCounter, data } = this.state;\n const { state: loadingState } = data;\n\n // do not render component until we have first data\n if (this.skipFirstRender(loadingState)) {\n return null;\n }\n\n // This is only done to increase a counter that is used by backend\n // image rendering to know when to capture image\n if (this.shouldSignalRenderingCompleted(loadingState, plugin.meta)) {\n profiler.renderingCompleted();\n }\n\n const PanelComponent = plugin.panel!;\n const timeRange = this.state.liveTime ?? data.timeRange ?? this.timeSrv.timeRange();\n const panelOptions = panel.getOptions();\n\n // Update the event filter (dashboard settings may have changed)\n // Yes this is called ever render for a function that is triggered on every mouse move\n this.eventFilter.onlyLocal = dashboard.graphTooltip === 0;\n\n return (\n <>\n <PanelContextProvider value={this.state.context}>\n <PanelComponent\n id={panel.id}\n data={data}\n title={panel.title}\n timeRange={timeRange}\n timeZone={this.props.dashboard.getTimezone()}\n options={panelOptions}\n fieldConfig={panel.fieldConfig}\n transparent={panel.transparent}\n width={innerWidth}\n height={innerHeight}\n renderCounter={renderCounter}\n replaceVariables={panel.replaceVariables}\n onOptionsChange={this.onOptionsChange}\n onFieldConfigChange={this.onFieldConfigChange}\n onChangeTimeRange={this.onChangeTimeRange}\n eventBus={dashboard.events}\n />\n </PanelContextProvider>\n </>\n );\n }\n\n renderPanel(width: number, height: number) {\n const { panel, plugin, dashboard } = this.props;\n const { renderCounter, data } = this.state;\n const { theme } = config;\n const { state: loadingState } = data;\n\n // do not render component until we have first data\n if (this.skipFirstRender(loadingState)) {\n return null;\n }\n\n // This is only done to increase a counter that is used by backend\n // image rendering to know when to capture image\n if (this.shouldSignalRenderingCompleted(loadingState, plugin.meta)) {\n profiler.renderingCompleted();\n }\n\n const PanelComponent = plugin.panel!;\n const timeRange = this.state.liveTime ?? data.timeRange ?? this.timeSrv.timeRange();\n const headerHeight = this.hasOverlayHeader() ? 0 : theme.panelHeaderHeight;\n const chromePadding = plugin.noPadding ? 0 : theme.panelPadding;\n const panelWidth = width - chromePadding * 2 - PANEL_BORDER;\n const innerPanelHeight = height - headerHeight - chromePadding * 2 - PANEL_BORDER;\n const panelContentClassNames = classNames({\n 'panel-content': true,\n 'panel-content--no-padding': plugin.noPadding,\n });\n const panelOptions = panel.getOptions();\n\n // Update the event filter (dashboard settings may have changed)\n // Yes this is called ever render for a function that is triggered on every mouse move\n this.eventFilter.onlyLocal = dashboard.graphTooltip === 0;\n\n const timeZone = this.props.timezone || this.props.dashboard.getTimezone();\n\n return (\n <>\n <div className={panelContentClassNames}>\n <PluginContextProvider meta={plugin.meta}>\n <PanelContextProvider value={this.state.context}>\n <PanelComponent\n id={panel.id}\n data={data}\n title={panel.title}\n timeRange={timeRange}\n timeZone={timeZone}\n options={panelOptions}\n fieldConfig={panel.fieldConfig}\n transparent={panel.transparent}\n width={panelWidth}\n height={innerPanelHeight}\n renderCounter={renderCounter}\n replaceVariables={panel.replaceVariables}\n onOptionsChange={this.onOptionsChange}\n onFieldConfigChange={this.onFieldConfigChange}\n onChangeTimeRange={this.onChangeTimeRange}\n eventBus={dashboard.events}\n />\n </PanelContextProvider>\n </PluginContextProvider>\n </div>\n </>\n );\n }\n\n hasOverlayHeader() {\n const { panel } = this.props;\n const { data } = this.state;\n\n // always show normal header if we have time override\n if (data.request && data.request.timeInfo) {\n return false;\n }\n\n return !panel.hasTitle();\n }\n\n render() {\n const { dashboard, panel, isViewing, isEditing, width, height, plugin } = this.props;\n const { errorMessage, data } = this.state;\n const { transparent } = panel;\n\n const alertState = data.alertState?.state;\n\n const containerClassNames = classNames({\n 'panel-container': true,\n 'panel-container--absolute': isSoloRoute(locationService.getLocation().pathname),\n 'panel-container--transparent': transparent,\n 'panel-container--no-title': this.hasOverlayHeader(),\n [`panel-alert-state--${alertState}`]: alertState !== undefined,\n });\n\n // for new panel header design\n const onCancelQuery = () => panel.getQueryRunner().cancelQuery();\n const title = panel.getDisplayTitle();\n const noPadding: PanelPadding = plugin.noPadding ? 'none' : 'md';\n const leftItems = [\n <PanelHeaderLoadingIndicator state={data.state} onClick={onCancelQuery} key=\"loading-indicator\" />,\n ];\n\n if (config.featureToggles.newPanelChromeUI) {\n return (\n <PanelChrome width={width} height={height} title={title} leftItems={leftItems} padding={noPadding}>\n {(innerWidth, innerHeight) => (\n <>\n <ErrorBoundary\n dependencies={[data, plugin, panel.getOptions()]}\n onError={this.onPanelError}\n onRecover={this.onPanelErrorRecover}\n >\n {({ error }) => {\n if (error) {\n return null;\n }\n return this.renderPanelContent(innerWidth, innerHeight);\n }}\n </ErrorBoundary>\n </>\n )}\n </PanelChrome>\n );\n } else {\n return (\n <section\n className={containerClassNames}\n aria-label={selectors.components.Panels.Panel.containerByTitle(panel.title)}\n >\n <PanelHeader\n panel={panel}\n dashboard={dashboard}\n title={panel.title}\n description={panel.description}\n links={panel.links}\n error={errorMessage}\n isEditing={isEditing}\n isViewing={isViewing}\n alertState={alertState}\n data={data}\n />\n <ErrorBoundary\n dependencies={[data, plugin, panel.getOptions()]}\n onError={this.onPanelError}\n onRecover={this.onPanelErrorRecover}\n >\n {({ error }) => {\n if (error) {\n return null;\n }\n return this.renderPanel(width, height);\n }}\n </ErrorBoundary>\n </section>\n );\n }\n }\n}\n","import React, { PureComponent } from 'react';\nimport { connect, ConnectedProps } from 'react-redux';\n\nimport { StoreState } from 'app/types';\n\nimport { initPanelState } from '../../panel/state/actions';\nimport { setPanelInstanceState } from '../../panel/state/reducers';\nimport { DashboardModel, PanelModel } from '../state';\n\nimport { LazyLoader } from './LazyLoader';\nimport { PanelChromeAngular } from './PanelChromeAngular';\nimport { PanelStateWrapper } from './PanelStateWrapper';\n\nexport interface OwnProps {\n panel: PanelModel;\n stateKey: string;\n dashboard: DashboardModel;\n isEditing: boolean;\n isViewing: boolean;\n width: number;\n height: number;\n lazy?: boolean;\n timezone?: string;\n}\n\nconst mapStateToProps = (state: StoreState, props: OwnProps) => {\n const panelState = state.panels[props.stateKey];\n if (!panelState) {\n return { plugin: null };\n }\n\n return {\n plugin: panelState.plugin,\n instanceState: panelState.instanceState,\n };\n};\n\nconst mapDispatchToProps = {\n initPanelState,\n setPanelInstanceState,\n};\n\nconst connector = connect(mapStateToProps, mapDispatchToProps);\n\nexport type Props = OwnProps & ConnectedProps<typeof connector>;\n\nexport class DashboardPanelUnconnected extends PureComponent<Props> {\n static defaultProps: Partial<Props> = {\n lazy: true,\n };\n\n componentDidMount() {\n this.props.panel.isInView = !this.props.lazy;\n if (!this.props.lazy) {\n this.onPanelLoad();\n }\n }\n\n onInstanceStateChange = (value: any) => {\n this.props.setPanelInstanceState({ key: this.props.stateKey, value });\n };\n\n onVisibilityChange = (v: boolean) => {\n this.props.panel.isInView = v;\n };\n\n onPanelLoad = () => {\n if (!this.props.plugin) {\n this.props.initPanelState(this.props.panel);\n }\n };\n\n renderPanel = (isInView: boolean) => {\n const { dashboard, panel, isViewing, isEditing, width, height, plugin, timezone } = this.props;\n\n if (!plugin) {\n return null;\n }\n\n if (plugin && plugin.angularPanelCtrl) {\n return (\n <PanelChromeAngular\n plugin={plugin}\n panel={panel}\n dashboard={dashboard}\n isViewing={isViewing}\n isEditing={isEditing}\n isInView={isInView}\n width={width}\n height={height}\n />\n );\n }\n\n return (\n <PanelStateWrapper\n plugin={plugin}\n panel={panel}\n dashboard={dashboard}\n isViewing={isViewing}\n isEditing={isEditing}\n isInView={isInView}\n width={width}\n height={height}\n onInstanceStateChange={this.onInstanceStateChange}\n timezone={timezone}\n />\n );\n };\n\n render() {\n const { width, height, lazy } = this.props;\n\n return lazy ? (\n <LazyLoader width={width} height={height} onChange={this.onVisibilityChange} onLoad={this.onPanelLoad}>\n {this.renderPanel}\n </LazyLoader>\n ) : (\n this.renderPanel(true)\n );\n }\n}\n\nexport const DashboardPanel = connector(DashboardPanelUnconnected);\n","import React, { Component } from 'react';\n\nimport { renderMarkdown, LinkModelSupplier, ScopedVars } from '@grafana/data';\nimport { selectors } from '@grafana/e2e-selectors';\nimport { locationService, getTemplateSrv } from '@grafana/runtime';\nimport { Tooltip, PopoverContent } from '@grafana/ui';\nimport { getTimeSrv, TimeSrv } from 'app/features/dashboard/services/TimeSrv';\nimport { PanelModel } from 'app/features/dashboard/state/PanelModel';\nimport { InspectTab } from 'app/features/inspector/types';\n\nenum InfoMode {\n Error = 'Error',\n Info = 'Info',\n Links = 'Links',\n}\n\nexport interface Props {\n panel: PanelModel;\n title?: string;\n description?: string;\n scopedVars?: ScopedVars;\n links?: LinkModelSupplier<PanelModel>;\n error?: string;\n}\n\nexport class PanelHeaderCorner extends Component<Props> {\n timeSrv: TimeSrv = getTimeSrv();\n\n getInfoMode = () => {\n const { panel, error } = this.props;\n if (error) {\n return InfoMode.Error;\n }\n if (!!panel.description) {\n return InfoMode.Info;\n }\n if (panel.links && panel.links.length) {\n return InfoMode.Links;\n }\n\n return undefined;\n };\n\n getInfoContent = (): JSX.Element => {\n const { panel } = this.props;\n const markdown = panel.description || '';\n const interpolatedMarkdown = getTemplateSrv().replace(markdown, panel.scopedVars);\n const markedInterpolatedMarkdown = renderMarkdown(interpolatedMarkdown);\n const links = this.props.links && this.props.links.getLinks(panel.replaceVariables);\n\n return (\n <div className=\"panel-info-content markdown-html\">\n <div dangerouslySetInnerHTML={{ __html: markedInterpolatedMarkdown }} />\n\n {links && links.length > 0 && (\n <ul className=\"panel-info-corner-links\">\n {links.map((link, idx) => {\n return (\n <li key={idx}>\n <a className=\"panel-info-corner-links__item\" href={link.href} target={link.target}>\n {link.title}\n </a>\n </li>\n );\n })}\n </ul>\n )}\n </div>\n );\n };\n\n /**\n * Open the Panel Inspector when we click on an error\n */\n onClickError = () => {\n locationService.partial({\n inspect: this.props.panel.id,\n inspectTab: InspectTab.Error,\n });\n };\n\n renderCornerType(infoMode: InfoMode, content: PopoverContent, onClick?: () => void) {\n const theme = infoMode === InfoMode.Error ? 'error' : 'info';\n const className = `panel-info-corner panel-info-corner--${infoMode.toLowerCase()}`;\n const ariaLabel = selectors.components.Panels.Panel.headerCornerInfo(infoMode.toLowerCase());\n\n return (\n <Tooltip content={content} placement=\"top-start\" theme={theme} interactive>\n <button type=\"button\" className={className} onClick={onClick} aria-label={ariaLabel}>\n <i aria-hidden className=\"fa\" />\n <span className=\"panel-info-corner-inner\" />\n </button>\n </Tooltip>\n );\n }\n\n render() {\n const { error } = this.props;\n const infoMode: InfoMode | undefined = this.getInfoMode();\n\n if (!infoMode) {\n return null;\n }\n\n if (infoMode === InfoMode.Error && error) {\n return this.renderCornerType(infoMode, error, this.onClickError);\n }\n\n if (infoMode === InfoMode.Info || infoMode === InfoMode.Links) {\n return this.renderCornerType(infoMode, this.getInfoContent);\n }\n\n return null;\n }\n}\n\nexport default PanelHeaderCorner;\n","import {\n ByNamesMatcherMode,\n ConfigOverrideRule,\n DataFrame,\n DynamicConfigValue,\n FieldConfigSource,\n FieldMatcherID,\n fieldMatchers,\n FieldType,\n getFieldDisplayName,\n isSystemOverrideWithRef,\n SystemConfigOverrideRule,\n} from '@grafana/data';\nimport { SeriesVisibilityChangeMode } from '@grafana/ui';\n\nconst displayOverrideRef = 'hideSeriesFrom';\nconst isHideSeriesOverride = isSystemOverrideWithRef(displayOverrideRef);\n\nexport function seriesVisibilityConfigFactory(\n label: string,\n mode: SeriesVisibilityChangeMode,\n fieldConfig: FieldConfigSource,\n data: DataFrame[]\n) {\n const { overrides } = fieldConfig;\n\n const displayName = label;\n const currentIndex = overrides.findIndex(isHideSeriesOverride);\n\n if (currentIndex < 0) {\n if (mode === SeriesVisibilityChangeMode.ToggleSelection) {\n const override = createOverride([displayName, ...getNamesOfHiddenFields(overrides, data)]);\n\n return {\n ...fieldConfig,\n overrides: [...fieldConfig.overrides, override],\n };\n }\n\n const displayNames = getDisplayNames(data, displayName);\n const override = createOverride(displayNames);\n\n return {\n ...fieldConfig,\n overrides: [...fieldConfig.overrides, override],\n };\n }\n\n const overridesCopy = Array.from(overrides);\n const [current] = overridesCopy.splice(currentIndex, 1) as SystemConfigOverrideRule[];\n\n if (mode === SeriesVisibilityChangeMode.ToggleSelection) {\n let existing = getExistingDisplayNames(current);\n const nameOfHiddenFields = getNamesOfHiddenFields(overridesCopy, data);\n\n if (nameOfHiddenFields.length > 0) {\n existing = existing.filter((el) => nameOfHiddenFields.indexOf(el) < 0);\n }\n\n if (existing[0] === displayName && existing.length === 1) {\n return {\n ...fieldConfig,\n overrides: overridesCopy,\n };\n }\n\n const override = createOverride([displayName, ...nameOfHiddenFields]);\n\n return {\n ...fieldConfig,\n overrides: [...overridesCopy, override],\n };\n }\n\n const override = createExtendedOverride(current, displayName);\n\n if (allFieldsAreExcluded(override, data)) {\n return {\n ...fieldConfig,\n overrides: overridesCopy,\n };\n }\n\n return {\n ...fieldConfig,\n overrides: [...overridesCopy, override],\n };\n}\n\nfunction createOverride(\n names: string[],\n mode = ByNamesMatcherMode.exclude,\n property?: DynamicConfigValue\n): SystemConfigOverrideRule {\n property = property ?? {\n id: 'custom.hideFrom',\n value: {\n viz: true,\n legend: false,\n tooltip: false,\n },\n };\n\n return {\n __systemRef: displayOverrideRef,\n matcher: {\n id: FieldMatcherID.byNames,\n options: {\n mode: mode,\n names: names,\n prefix: mode === ByNamesMatcherMode.exclude ? 'All except:' : undefined,\n readOnly: true,\n },\n },\n properties: [\n {\n ...property,\n value: {\n viz: true,\n legend: false,\n tooltip: false,\n },\n },\n ],\n };\n}\n\nconst createExtendedOverride = (\n current: SystemConfigOverrideRule,\n displayName: string,\n mode = ByNamesMatcherMode.exclude\n): SystemConfigOverrideRule => {\n const property = current.properties.find((p) => p.id === 'custom.hideFrom');\n const existing = getExistingDisplayNames(current);\n const index = existing.findIndex((name) => name === displayName);\n\n if (index < 0) {\n existing.push(displayName);\n } else {\n existing.splice(index, 1);\n }\n\n return createOverride(existing, mode, property);\n};\n\nconst getExistingDisplayNames = (rule: SystemConfigOverrideRule): string[] => {\n const names = rule.matcher.options?.names;\n if (!Array.isArray(names)) {\n return [];\n }\n return [...names];\n};\n\nconst allFieldsAreExcluded = (override: SystemConfigOverrideRule, data: DataFrame[]): boolean => {\n return getExistingDisplayNames(override).length === getDisplayNames(data).length;\n};\n\nconst getDisplayNames = (data: DataFrame[], excludeName?: string): string[] => {\n const unique = new Set<string>();\n\n for (const frame of data) {\n for (const field of frame.fields) {\n if (field.type !== FieldType.number) {\n continue;\n }\n\n const name = getFieldDisplayName(field, frame, data);\n\n if (name === excludeName) {\n continue;\n }\n\n unique.add(name);\n }\n }\n\n return Array.from(unique);\n};\n\nconst getNamesOfHiddenFields = (overrides: ConfigOverrideRule[], data: DataFrame[]): string[] => {\n let names: string[] = [];\n\n for (const override of overrides) {\n const property = override.properties.find((p) => p.id === 'custom.hideFrom');\n\n if (property !== undefined && property.value?.legend === true) {\n const info = fieldMatchers.get(override.matcher.id);\n const matcher = info.get(override.matcher.options);\n\n for (const frame of data) {\n for (const field of frame.fields) {\n if (field.type !== FieldType.number) {\n continue;\n }\n\n const name = getFieldDisplayName(field, frame, data);\n\n if (matcher(field, frame, data)) {\n names.push(name);\n }\n }\n }\n }\n }\n\n return names;\n};\n","import { DataQuery, locationUtil, setWeekStart, DashboardLoadedEvent } from '@grafana/data';\nimport { config, isFetchError, locationService } from '@grafana/runtime';\nimport { notifyApp } from 'app/core/actions';\nimport appEvents from 'app/core/app_events';\nimport { createErrorNotification } from 'app/core/copy/appNotification';\nimport { backendSrv } from 'app/core/services/backend_srv';\nimport { KeybindingSrv } from 'app/core/services/keybindingSrv';\nimport store from 'app/core/store';\nimport { dashboardLoaderSrv } from 'app/features/dashboard/services/DashboardLoaderSrv';\nimport { DashboardSrv, getDashboardSrv } from 'app/features/dashboard/services/DashboardSrv';\nimport { getTimeSrv, TimeSrv } from 'app/features/dashboard/services/TimeSrv';\nimport { dashboardWatcher } from 'app/features/live/dashboard/dashboardWatcher';\nimport { playlistSrv } from 'app/features/playlist/PlaylistSrv';\nimport { toStateKey } from 'app/features/variables/utils';\nimport { DashboardDTO, DashboardInitPhase, DashboardRoutes, StoreState, ThunkDispatch, ThunkResult } from 'app/types';\n\nimport { createDashboardQueryRunner } from '../../query/state/DashboardQueryRunner/DashboardQueryRunner';\nimport { initVariablesTransaction } from '../../variables/state/actions';\nimport { getIfExistsLastKey } from '../../variables/state/selectors';\n\nimport { DashboardModel } from './DashboardModel';\nimport { PanelModel } from './PanelModel';\nimport { emitDashboardViewEvent } from './analyticsProcessor';\nimport { dashboardInitCompleted, dashboardInitFailed, dashboardInitFetching, dashboardInitServices } from './reducers';\n\nexport interface InitDashboardArgs {\n urlUid?: string;\n urlSlug?: string;\n urlType?: string;\n urlFolderId?: string;\n panelType?: string;\n accessToken?: string;\n routeName?: string;\n fixUrl: boolean;\n keybindingSrv: KeybindingSrv;\n}\n\nasync function fetchDashboard(\n args: InitDashboardArgs,\n dispatch: ThunkDispatch,\n getState: () => StoreState\n): Promise<DashboardDTO | null> {\n // When creating new or adding panels to a dashboard from explore we load it from local storage\n const model = store.getObject<DashboardDTO>(DASHBOARD_FROM_LS_KEY);\n if (model) {\n removeDashboardToFetchFromLocalStorage();\n return model;\n }\n\n try {\n switch (args.routeName) {\n case DashboardRoutes.Home: {\n // load home dash\n const dashDTO: DashboardDTO = await backendSrv.get('/api/dashboards/home');\n\n // if user specified a custom home dashboard redirect to that\n if (dashDTO.redirectUri) {\n const newUrl = locationUtil.stripBaseFromUrl(dashDTO.redirectUri);\n locationService.replace(newUrl);\n return null;\n }\n\n // disable some actions on the default home dashboard\n dashDTO.meta.canSave = false;\n dashDTO.meta.canShare = false;\n dashDTO.meta.canStar = false;\n return dashDTO;\n }\n case DashboardRoutes.Public: {\n return await dashboardLoaderSrv.loadDashboard('public', args.urlSlug, args.accessToken);\n }\n case DashboardRoutes.Normal: {\n const dashDTO: DashboardDTO = await dashboardLoaderSrv.loadDashboard(args.urlType, args.urlSlug, args.urlUid);\n\n if (args.fixUrl && dashDTO.meta.url && !playlistSrv.isPlaying) {\n // check if the current url is correct (might be old slug)\n const dashboardUrl = locationUtil.stripBaseFromUrl(dashDTO.meta.url);\n const currentPath = locationService.getLocation().pathname;\n\n if (dashboardUrl !== currentPath) {\n // Spread current location to persist search params used for navigation\n locationService.replace({\n ...locationService.getLocation(),\n pathname: dashboardUrl,\n });\n console.log('not correct url correcting', dashboardUrl, currentPath);\n }\n }\n return dashDTO;\n }\n case DashboardRoutes.New: {\n return getNewDashboardModelData(args.urlFolderId, args.panelType);\n }\n case DashboardRoutes.Path: {\n const path = args.urlSlug ?? '';\n return await dashboardLoaderSrv.loadDashboard(DashboardRoutes.Path, path, path);\n }\n default:\n throw { message: 'Unknown route ' + args.routeName };\n }\n } catch (err) {\n // Ignore cancelled errors\n if (isFetchError(err) && err.cancelled) {\n return null;\n }\n\n dispatch(dashboardInitFailed({ message: 'Failed to fetch dashboard', error: err }));\n console.error(err);\n return null;\n }\n}\n\nconst getQueriesByDatasource = (\n panels: PanelModel[],\n queries: { [datasourceId: string]: DataQuery[] } = {}\n): { [datasourceId: string]: DataQuery[] } => {\n panels.forEach((panel) => {\n if (panel.panels) {\n getQueriesByDatasource(panel.panels, queries);\n } else if (panel.targets) {\n panel.targets.forEach((target) => {\n if (target.datasource?.type) {\n if (queries[target.datasource.type]) {\n queries[target.datasource.type].push(target);\n } else {\n queries[target.datasource.type] = [target];\n }\n }\n });\n }\n });\n return queries;\n};\n\n/**\n * This action (or saga) does everything needed to bootstrap a dashboard & dashboard model.\n * First it handles the process of fetching the dashboard, correcting the url if required (causing redirects/url updates)\n *\n * This is used both for single dashboard & solo panel routes, home & new dashboard routes.\n *\n * Then it handles the initializing of the old angular services that the dashboard components & panels still depend on\n *\n */\nexport function initDashboard(args: InitDashboardArgs): ThunkResult<void> {\n return async (dispatch, getState) => {\n // set fetching state\n dispatch(dashboardInitFetching());\n\n // fetch dashboard data\n const dashDTO = await fetchDashboard(args, dispatch, getState);\n\n // returns null if there was a redirect or error\n if (!dashDTO) {\n return;\n }\n\n // set initializing state\n dispatch(dashboardInitServices());\n\n // create model\n let dashboard: DashboardModel;\n try {\n dashboard = new DashboardModel(dashDTO.dashboard, dashDTO.meta);\n } catch (err) {\n dispatch(dashboardInitFailed({ message: 'Failed create dashboard model', error: err }));\n console.error(err);\n return;\n }\n\n // add missing orgId query param\n const storeState = getState();\n const queryParams = locationService.getSearchObject();\n\n if (!queryParams.orgId) {\n // TODO this is currently not possible with the LocationService API\n locationService.partial({ orgId: storeState.user.orgId }, true);\n }\n\n // init services\n const timeSrv: TimeSrv = getTimeSrv();\n const dashboardSrv: DashboardSrv = getDashboardSrv();\n\n // legacy srv state, we need this value updated for built-in annotations\n dashboardSrv.setCurrent(dashboard);\n\n timeSrv.init(dashboard);\n\n const dashboardUid = toStateKey(args.urlUid ?? dashboard.uid);\n // template values service needs to initialize completely before the rest of the dashboard can load\n await dispatch(initVariablesTransaction(dashboardUid, dashboard));\n\n // DashboardQueryRunner needs to run after all variables have been resolved so that any annotation query including a variable\n // will be correctly resolved\n const runner = createDashboardQueryRunner({ dashboard, timeSrv });\n runner.run({ dashboard, range: timeSrv.timeRange() });\n\n if (getIfExistsLastKey(getState()) !== dashboardUid) {\n // if a previous dashboard has slow running variable queries the batch uid will be the new one\n // but the args.urlUid will be the same as before initVariablesTransaction was called so then we can't continue initializing\n // the previous dashboard.\n return;\n }\n\n // If dashboard is in a different init phase it means it cancelled during service init\n if (getState().dashboard.initPhase !== DashboardInitPhase.Services) {\n return;\n }\n\n try {\n dashboard.processRepeats();\n\n // handle auto fix experimental feature\n if (queryParams.autofitpanels) {\n dashboard.autoFitPanels(window.innerHeight, queryParams.kiosk);\n }\n\n args.keybindingSrv.setupDashboardBindings(dashboard);\n } catch (err) {\n if (err instanceof Error) {\n dispatch(notifyApp(createErrorNotification('Dashboard init failed', err)));\n }\n console.error(err);\n }\n\n // send open dashboard event\n if (args.routeName !== DashboardRoutes.New) {\n emitDashboardViewEvent(dashboard);\n\n // Listen for changes on the current dashboard\n dashboardWatcher.watch(dashboard.uid);\n } else {\n dashboardWatcher.leave();\n }\n\n // set week start\n if (dashboard.weekStart !== '') {\n setWeekStart(dashboard.weekStart);\n } else {\n setWeekStart(config.bootData.user.weekStart);\n }\n\n // Propagate an app-wide event about the dashboard being loaded\n appEvents.publish(\n new DashboardLoadedEvent({\n dashboardId: dashboard.uid,\n orgId: storeState.user.orgId,\n userId: storeState.user.user?.id,\n grafanaVersion: config.buildInfo.version,\n queries: getQueriesByDatasource(dashboard.panels),\n })\n );\n\n // yay we are done\n dispatch(dashboardInitCompleted(dashboard));\n };\n}\n\nexport function getNewDashboardModelData(urlFolderId?: string, panelType?: string): any {\n const data = {\n meta: {\n canStar: false,\n canShare: false,\n canDelete: false,\n isNew: true,\n folderId: 0,\n },\n dashboard: {\n title: 'New dashboard',\n panels: [\n {\n type: panelType ?? 'add-panel',\n gridPos: { x: 0, y: 0, w: 12, h: 9 },\n title: 'Panel Title',\n },\n ],\n },\n };\n\n if (urlFolderId) {\n data.meta.folderId = parseInt(urlFolderId, 10);\n }\n\n return data;\n}\n\nconst DASHBOARD_FROM_LS_KEY = 'DASHBOARD_FROM_LS_KEY';\n\nexport function setDashboardToFetchFromLocalStorage(model: DashboardDTO) {\n store.setObject(DASHBOARD_FROM_LS_KEY, model);\n}\n\nexport function removeDashboardToFetchFromLocalStorage() {\n store.delete(DASHBOARD_FROM_LS_KEY);\n}\n","import { reportMetaAnalytics, MetaAnalyticsEventName, DashboardViewEventPayload } from '@grafana/runtime';\n\nimport { DashboardModel } from './DashboardModel';\n\nexport function emitDashboardViewEvent(dashboard: DashboardModel) {\n const eventData: DashboardViewEventPayload = {\n dashboardId: dashboard.id,\n dashboardName: dashboard.title,\n dashboardUid: dashboard.uid,\n folderName: dashboard.meta.folderTitle,\n eventName: MetaAnalyticsEventName.DashboardView,\n publicDashboardUid: dashboard.meta.publicDashboardUid,\n };\n\n reportMetaAnalytics(eventData);\n}\n","import { applyFieldOverrides, ArrayDataFrame, getDefaultTimeRange, LoadingState, PanelData } from '@grafana/data';\nimport { config } from 'app/core/config';\n\nimport { SnapshotWorker } from '../../query/state/DashboardQueryRunner/SnapshotWorker';\nimport { getProcessedDataFrames } from '../../query/state/runRequest';\nimport { getTimeSrv } from '../services/TimeSrv';\nimport { DashboardModel, PanelModel } from '../state';\n\nimport { applyPanelTimeOverrides } from './panel';\n\nexport function loadSnapshotData(panel: PanelModel, dashboard: DashboardModel): PanelData {\n const data = getProcessedDataFrames(panel.snapshotData);\n const worker = new SnapshotWorker();\n const options = { dashboard, range: getDefaultTimeRange() };\n const annotationEvents = worker.canWork(options) ? worker.getAnnotationsInSnapshot(dashboard, panel.id) : [];\n const annotations = [new ArrayDataFrame(annotationEvents)];\n const timeData = applyPanelTimeOverrides(panel, getTimeSrv().timeRange());\n\n return {\n timeRange: timeData.timeRange,\n state: LoadingState.Done,\n series: applyFieldOverrides({\n data,\n fieldConfig: {\n defaults: {},\n overrides: [],\n },\n replaceVariables: panel.replaceVariables,\n fieldConfigRegistry: panel.plugin!.fieldConfigRegistry,\n theme: config.theme2,\n timeZone: dashboard.getTimezone(),\n }),\n annotations,\n };\n}\n","export enum InspectTab {\n Data = 'data',\n Meta = 'meta', // When result metadata exists\n Error = 'error',\n Stats = 'stats',\n JSON = 'json',\n Query = 'query',\n Actions = 'actions', // ALPHA!\n Help = 'help', // get info required for support+debugging\n}\n","import {\n DataLink,\n DisplayValue,\n FieldDisplay,\n formattedValueToString,\n getFieldDisplayValuesProxy,\n getTimeField,\n InterpolateFunction,\n Labels,\n LinkModelSupplier,\n ScopedVar,\n ScopedVars,\n} from '@grafana/data';\nimport { PanelModel } from 'app/features/dashboard/state/PanelModel';\n\nimport { getLinkSrv } from './link_srv';\n\ninterface SeriesVars {\n name?: string;\n refId?: string;\n}\n\ninterface FieldVars {\n name: string;\n labels?: Labels;\n}\n\ninterface ValueVars {\n raw: any;\n numeric: number;\n text: string;\n time?: number;\n calc?: string;\n}\n\ninterface DataViewVars {\n name?: string;\n refId?: string;\n fields?: Record<string, DisplayValue>;\n}\n\ninterface DataLinkScopedVars extends ScopedVars {\n __series: ScopedVar<SeriesVars>;\n __field: ScopedVar<FieldVars>;\n __value: ScopedVar<ValueVars>;\n __data: ScopedVar<DataViewVars>;\n}\n\n/**\n * Link suppliers creates link models based on a link origin\n */\nexport const getFieldLinksSupplier = (value: FieldDisplay): LinkModelSupplier<FieldDisplay> | undefined => {\n const links = value.field.links;\n if (!links || links.length === 0) {\n return undefined;\n }\n\n return {\n getLinks: (replaceVariables: InterpolateFunction) => {\n const scopedVars: Partial<DataLinkScopedVars> = {};\n\n if (value.view) {\n const { dataFrame } = value.view;\n\n scopedVars['__series'] = {\n value: {\n name: dataFrame.name,\n refId: dataFrame.refId,\n },\n text: 'Series',\n };\n\n const field = value.colIndex !== undefined ? dataFrame.fields[value.colIndex] : undefined;\n\n if (field) {\n scopedVars['__field'] = {\n value: {\n name: field.name,\n labels: field.labels,\n },\n text: 'Field',\n };\n\n if (value.rowIndex !== undefined && value.rowIndex >= 0) {\n const { timeField } = getTimeField(dataFrame);\n scopedVars['__value'] = {\n value: {\n raw: field.values.get(value.rowIndex),\n numeric: value.display.numeric,\n text: formattedValueToString(value.display),\n time: timeField ? timeField.values.get(value.rowIndex) : undefined,\n },\n text: 'Value',\n };\n }\n\n // Expose other values on the row\n if (value.view) {\n scopedVars['__data'] = {\n value: {\n name: dataFrame.name,\n refId: dataFrame.refId,\n fields: getFieldDisplayValuesProxy({\n frame: dataFrame,\n rowIndex: value.rowIndex!,\n }),\n },\n text: 'Data',\n };\n }\n } else {\n // calculation\n scopedVars['__value'] = {\n value: {\n raw: value.display.numeric,\n numeric: value.display.numeric,\n text: formattedValueToString(value.display),\n calc: value.name,\n },\n text: 'Value',\n };\n }\n } else {\n console.log('VALUE', value);\n }\n\n const replace: InterpolateFunction = (value: string, vars: ScopedVars | undefined, fmt?: string | Function) => {\n const finalVars: ScopedVars = {\n ...(scopedVars as ScopedVars),\n ...vars,\n };\n return replaceVariables(value, finalVars, fmt);\n };\n\n return links.map((link: DataLink) => {\n return getLinkSrv().getDataLinkUIModel(link, replace, value);\n });\n },\n };\n};\n\nexport const getPanelLinksSupplier = (panel: PanelModel): LinkModelSupplier<PanelModel> | undefined => {\n const links = panel.links;\n\n if (!links || links.length === 0) {\n return undefined;\n }\n\n return {\n getLinks: () => {\n return links.map((link) => {\n return getLinkSrv().getDataLinkUIModel(link, panel.replaceVariables, panel);\n });\n },\n };\n};\n","import { PanelModel } from 'app/features/dashboard/state';\nimport { StoreState } from 'app/types';\n\nimport { PanelState } from './reducers';\n\nexport function getPanelStateForModel(state: StoreState, model: PanelModel): PanelState | undefined {\n return state.panels[model.key];\n}\n"],"names":["LazyLoader","children","width","height","onLoad","onChange","id","useUniqueId","loaded","setLoaded","useState","isInView","setIsInView","wrapperRef","useRef","useEffectOnce","addCallback","entry","isIntersecting","wrapperEl","current","observer","observe","callbacks","unobserve","Object","keys","length","disconnect","ref","style","c","IntersectionObserver","entries","target","rootMargin","isSoloRoute","path","test","toLowerCase","PanelHeaderLoadingIndicator","state","onClick","styles","useStyles2","getStyles","LoadingState","className","Tooltip","content","Icon","name","title","streamIndicator","theme","css","colors","text","disabled","PanelHeaderMenuTrigger","divProps","clickCoordinates","setClickCoordinates","x","y","panelMenuOpen","setPanelMenuOpen","onMenuToggle","useCallback","event","clicked","deadZone","Math","sqrt","isClick","eventToClickCoordinates","onMouseDown","closeMenu","clientX","clientY","PanelHeaderMenu","PureComponent","menu","isSubMenu","role","map","menuItem","idx","PanelHeaderMenuItem","type","iconClassName","shortcut","subMenu","renderItems","render","this","props","items","PanelHeaderMenuProvider","panel","dashboard","setItems","angularComponent","useSelector","getPanelStateForModel","useEffect","onViewPanel","preventDefault","locationService","viewPanel","onEditPanel","editPanel","onAddLibraryPanel","addLibraryPanel","onUnlinkLibraryPanel","unlinkLibraryPanel","onInspectPanel","tab","inspect","inspectTab","reportInteraction","InspectTab","onMore","onDuplicatePanel","duplicatePanel","onCopyPanel","copyPanel","onRemovePanel","removePanel","onNavigateToExplore","openInNewWindow","ctrlKey","metaKey","url","window","open","config","undefined","store","navigateToExplore","getDataSourceSrv","getTimeSrv","getExploreUrl","onToggleLegend","toggleLegend","isEditing","viewTextTranslation","t","push","canEditPanel","shareTextTranslation","sharePanel","contextSrv","plugin","meta","skipDataQuery","inspectMenu","dataTextTranslation","e","canEdit","jsonTextTranslation","inspectTextTranslation","isViewing","isPanelModelLibraryPanel","scope","getScope","panelCtrl","$$childHead","ctrl","angularMenuItems","getExtendedMenu","item","reactItem","href","click","$eval","options","legend","showLegend","moreTextTranslation","getPanelMenu","PanelHeaderMenuWrapper","PanelHeaderNotice","notice","iconName","severity","marginRight","link","rel","PanelHeaderNotices","frames","panelId","openInspect","stopPropagation","notices","frame","values","PanelHeader","error","data","alertState","getDisplayTitle","cx","panelStyles","getQueryRunner","cancelQuery","PanelHeaderCorner","description","scopedVars","links","getPanelLinksSupplier","selectors","ClickOutsideWrapper","parent","document","series","size","titleText","publicDashboardAccessToken","onClose","request","timeInfo","typography","fontWeightMedium","body","fontSize","primary","PanelChromeAngularUnconnected","constructor","super","Subscription","timeRange","getDefaultTimeRange","componentDidMount","loadAngularPanel","queryRunner","subs","add","getData","withTransforms","withFieldConfig","subscribe","next","onPanelDataUpdate","errorMessage","message","setState","componentWillUnmount","unsubscribe","destroy","componentDidUpdate","prevProps","prevState","scopeProps","getInnerPanelHeight","getInnerPanelWidth","hasOverlayHeader","panelHeaderHeight","noPadding","panelPadding","PANEL_BORDER","setPanelAngularComponent","element","loader","getAngularLoader","key","load","hasTitle","transparent","containerClassNames","classNames","pathname","alert","panelContentClassNames","mapDispatchToProps","PanelChromeAngular","connect","createOverride","label","color","matcher","FieldMatcherID","properties","createProperty","value","mode","FieldColorModeId","fixedColor","PanelStateWrapper","onlyLocal","DashboardCursorSync","graphTooltip","onInstanceStateChange","context","instanceState","onFieldConfigChange","fieldConfig","overrides","currentIndex","findIndex","override","overridesCopy","Array","from","existing","propertyIndex","p","propertiesCopy","changeSeriesColorConfigFactory","seriesVisibilityConfigFactory","sortKey","legendOptions","sortDesc","sortBy","onOptionsChange","refreshWhenInView","timeData","applyPanelTimeOverrides","timeSrv","wantsQueryExecution","runAllPanelQueries","dashboardId","dashboardUID","uid","dashboardTimezone","getTimezone","renderCounter","liveTime","stateUpdate","updateOptions","updateFieldConfig","async","isRegion","to","anno","time","timeEnd","tags","saveAnnotation","getDashboardQueryRunner","run","range","eventBus","publish","AnnotationChangeEvent","deleteAnnotation","updateAnnotation","setTime","toUtc","events","newScopedBus","eventFilter","isFirstLoad","app","getPanelContextApp","sync","getSync","onSeriesColorChange","onToggleSeriesVisibility","onSeriesVisibilityChange","onAnnotationCreate","onAnnotationUpdate","onAnnotationDelete","onToggleLegendSort","canAddAnnotations","bind","canEditAnnotations","canDeleteAnnotations","getInitialPanelDataState","CoreApp","RefreshEvent","onRefresh","RenderEvent","onRender","panelInitialized","hasPanelSnapshot","loadSnapshotData","onDataUpdate","liveTimer","liveTimeChanged","delta","valueOf","console","log","snapshot","snapshotData","toDataFrameDTO","shouldSignalRenderingCompleted","loadingState","pluginMeta","skipFirstRender","renderPanelContent","innerWidth","innerHeight","profiler","PanelComponent","panelOptions","getOptions","PanelContext","timeZone","replaceVariables","onChangeTimeRange","renderPanel","headerHeight","chromePadding","panelWidth","innerPanelHeight","timezone","PluginContextProvider","leftItems","PanelChrome","padding","ErrorBoundary","dependencies","onError","onPanelError","onRecover","onPanelErrorRecover","initPanelState","setPanelInstanceState","connector","panelState","panels","stateKey","DashboardPanelUnconnected","v","angularPanelCtrl","lazy","onPanelLoad","onVisibilityChange","DashboardPanel","InfoMode","Component","Error","Info","Links","markdown","interpolatedMarkdown","getTemplateSrv","replace","markedInterpolatedMarkdown","renderMarkdown","getLinks","dangerouslySetInnerHTML","__html","renderCornerType","infoMode","ariaLabel","placement","interactive","getInfoMode","onClickError","getInfoContent","displayOverrideRef","isHideSeriesOverride","isSystemOverrideWithRef","displayName","SeriesVisibilityChangeMode","getNamesOfHiddenFields","getDisplayNames","splice","getExistingDisplayNames","nameOfHiddenFields","filter","el","indexOf","createExtendedOverride","allFieldsAreExcluded","names","ByNamesMatcherMode","property","viz","tooltip","__systemRef","prefix","readOnly","find","index","rule","isArray","excludeName","unique","Set","field","fields","FieldType","getFieldDisplayName","fieldMatchers","get","getQueriesByDatasource","queries","forEach","targets","datasource","initDashboard","args","dispatch","getState","dashboardInitFetching","dashDTO","model","DASHBOARD_FROM_LS_KEY","removeDashboardToFetchFromLocalStorage","routeName","DashboardRoutes","backendSrv","redirectUri","newUrl","locationUtil","canSave","canShare","canStar","dashboardLoaderSrv","urlSlug","accessToken","urlType","urlUid","fixUrl","playlistSrv","dashboardUrl","currentPath","getNewDashboardModelData","urlFolderId","panelType","err","isFetchError","cancelled","dashboardInitFailed","fetchDashboard","dashboardInitServices","DashboardModel","storeState","queryParams","orgId","user","getDashboardSrv","setCurrent","init","dashboardUid","toStateKey","initVariablesTransaction","createDashboardQueryRunner","getIfExistsLastKey","initPhase","DashboardInitPhase","processRepeats","autofitpanels","autoFitPanels","kiosk","keybindingSrv","setupDashboardBindings","notifyApp","createErrorNotification","eventData","dashboardName","folderName","folderTitle","eventName","MetaAnalyticsEventName","publicDashboardUid","reportMetaAnalytics","emitDashboardViewEvent","dashboardWatcher","weekStart","setWeekStart","appEvents","DashboardLoadedEvent","userId","grafanaVersion","dashboardInitCompleted","canDelete","isNew","folderId","gridPos","w","h","parseInt","setDashboardToFetchFromLocalStorage","getProcessedDataFrames","worker","SnapshotWorker","annotationEvents","canWork","getAnnotationsInSnapshot","annotations","ArrayDataFrame","applyFieldOverrides","defaults","fieldConfigRegistry","getFieldLinksSupplier","view","dataFrame","refId","colIndex","labels","rowIndex","timeField","getTimeField","raw","numeric","display","formattedValueToString","getFieldDisplayValuesProxy","calc","vars","fmt","finalVars","getLinkSrv","getDataLinkUIModel"],"sourceRoot":""}