{"version":3,"file":"8057.c67797a513b39b0caa0f.js","mappings":"sLAIO,IAAKA,GAMX,SANWA,GAAAA,EAAmB,6BAAnBA,EAAmB,oBAAnBA,EAAmB,yBAAnBA,EAAmB,uBAAnBA,EAAmB,kDAM9B,CANWA,IAAAA,EAAmB,KAYxB,MAAMC,EAAoB,IAA0C,IAAzC,SAAEC,GAAkC,EACpE,OACE,UAAC,IAAK,CAACC,MAAQ,QAAOD,oCAA4CE,SAAS,OAAM,kBACzEF,EAAQ,+GACDA,EAAQ,MACf,EAICG,EAAoB,IACxB,IAAP,GAAO,SAAC,IAAK,CAACC,KAAM,cAAeC,MAAO,W,gLCTrC,MAAMC,EAAgB,IAA8D,IAA7D,UAAEC,EAAS,eAAEC,EAAc,mBAAEC,GAA2B,EACpF,MAAMC,GAASC,EAAAA,EAAAA,IAAWC,GAEpBC,GAAuBC,EAAAA,EAAAA,UAC3B,KACEC,EAAAA,EAAAA,WAAUC,KACRC,EAAAA,EAAAA,IAAQC,EAAAA,GAAAA,eAER,MAAMC,EAASH,EAAEG,OACjBX,EAAeW,EAAOC,MAAM,GAC3B,MACL,CAACZ,KAGHa,EAAAA,EAAAA,YAAU,IAAMR,EAAqBS,UAAU,CAACT,IAEhD,MAAMU,EAAa,IAAH,GAAG,SAAC,IAAI,CAACC,KAAM,YAE/B,OACE,iBAAKjB,UAAWA,EAAU,WACxB,SAAC,IAAK,WACJ,UAAC,EAAAkB,MAAK,CAACC,IAAK,GAAI,iBACd,gDACA,SAAC,IAAO,CACNC,QAAO,OACL,sEAEE,yBAAO,yDAEV,UAED,SAAC,IAAI,CAACpB,UAAWG,EAAOkB,KAAMJ,KAAK,cAAcK,KAAK,eAI5D,SAAC,EAAAC,EAAK,CACJC,YAAY,SACZC,aAAcvB,EACdwB,SAAUpB,EACV,cAAY,qBACZqB,OAAQX,EACRhB,UAAWG,EAAOyB,eAEhB,EAIJvB,EAAawB,IAAoB,CACrCR,KAAMS,EAAAA,GAAI;oBACQD,EAAME,QAAQ;IAEhCH,WAAYE,EAAAA,GAAI;;;qUCnClB,MAAME,EAA0C,IAAiB,IAAhB,QAAEC,GAAS,EAC1D,MAAOC,EAAYC,IAAiBC,EAAAA,EAAAA,UAAiB,IAC/CC,GAAmBC,EAAAA,EAAAA,cAAaC,IACpCJ,EAAcI,EAAMC,cAAc3B,MAAM,GACvC,KAEG,QAAE4B,EAAO,MAAEC,EAAK,OAAEC,EAAS,IC7B5B,SAAqCV,GAC1C,MAAMW,GAAWC,EAAAA,EAAAA,MACXC,GAAUC,EAAAA,EAAAA,IACbC,GAAUA,EAAMC,2BAOnB,OAJAnC,EAAAA,EAAAA,YAAU,KACR8B,GAASM,EAAAA,EAAAA,IAA8BjB,GAAS,GAC/C,CAACW,EAAUX,IAEPa,CACT,CDkB0CK,CAA4BlB,GAE9D9B,GAASC,EAAAA,EAAAA,IAAWC,GAE1B,GAAIoC,IAAYC,EACd,OAAO,IAAP,GAAO,SAACU,EAAA,EAAkB,CAACvD,KAAM,wBAGnC,GAAI6C,IAAUD,EACZ,OAAO,SAACY,EAAA,EAAK,CAAC3D,MAAO,sCAAsC,SAAEgD,EAAMY,UAGrE,MAAMC,EAA+D,CACnE,CAAEC,GAAI,QAASC,MAAO,QAASnC,KAAM,cAAeoC,WAAYC,GAChE,CAAEH,GAAI,QAASC,MAAO,GAAInC,KAAM,OAAQoC,WAAYE,GACpD,CAAEJ,GAAI,YAAaC,MAAO,OAAQnC,KAAM,cAAeoC,WAAYG,IAI/DC,EAASC,OAAOC,QAmDjB,SACLlB,GAEA,MAAMmB,EAA+BnB,EAAQoB,KAAKC,IAAS,QAEzD,MAAMC,EAAe,SACfC,EAAyD,QAAxC,EAAgC,QAAhC,EAAGF,EAAKtE,KAAKyE,MAAMF,UAAa,aAA7B,EAA+BG,IAAI,UAAE,QAAI,GAEnE,MAAO,CACLf,GAAIgB,OAAOL,EAAKX,IAChBR,MAAOmB,EAAKM,SAEZ5E,KAAMsE,EAAKtE,KAAK6E,QAAQL,EAAmB,IAC3CM,KAAMR,EAAKQ,KACXC,UAAWT,EAAKU,QAChBR,oBACD,IAKH,OAAOS,EAAAA,EAAAA,SAAQb,GAAQE,GAASA,EAAKE,mBACvC,CAzEgCU,CAAmBpC,IAE9CqC,OACAC,QAAO,QAAEC,GAAS,SAyEhB,SAAkBA,EAAkBhD,GAEzC,GAAmB,KAAfA,EACF,OAAO,EAMT,IAHiBA,EAAWiD,WAAW,OAAQjD,EAAWkD,SAAS,KAIjE,OAAOF,EAASG,SAASnD,GAK3B,IACE,OAAO,IAAIoD,OAAOpD,EAAWqD,MAAM,GAAI,IAAIC,KAAKN,EAGlD,CAFE,MAAOO,GACP,OAAO,CACT,CACF,CA7F4BC,CAASR,EAAUhD,EAAW,IACrDgC,KAAI,IAAuB,IAArBgB,EAAUjB,GAAM,EACrB,MAAM0B,EAAgC1B,EAAMC,KAAK0B,IAAW,CAC1DpC,GAAIoC,EAAYpC,GAChBmB,KAAMiB,MAGR,OACE,4BACE,mBAAQ5F,UAAWG,EAAO0F,cAAc,UACtC,0BAAOX,OAET,SAACY,EAAA,EAAY,CAACC,KAAMxC,EAASU,MAAO0B,MAJ5BT,EAKJ,IAIZ,OACE,4BACE,0BACE,SAACc,EAAA,EAAK,CACJvC,MAAK,OACH,SAACwC,EAAA,EAAK,WACJ,UAAC,EAAA/E,MAAK,CAACC,IAAK,GAAI,WACd,4CACA,SAAC+E,EAAA,EAAO,CACN9E,SACE,gHACqF,KACnF,0BAAQ,qBAAyB,QAAI,0BAAQ,sBAEhD,UAED,SAAC+E,EAAA,EAAI,CAAClF,KAAK,cAAcK,KAAK,eAIrC,UAED,SAAC8E,EAAA7E,EAAK,CAACI,OAAM,OAAE,SAACwE,EAAA,EAAI,CAAClF,KAAM,YAAcS,SAAUW,EAAkBb,YAAY,eAGpFsC,IACG,EAoDV,SAASF,EAAgBO,GAAuB,QAC9C,MAAMkC,EAAqC,QAA9B,EAAiB,QAAjB,EAAGlC,EAAKQ,KAAKA,YAAI,aAAd,EAAgB2B,mBAAW,QAAI,GAE/C,OACE,gCACGnC,EAAKQ,KAAK9E,MACX,SAAC0G,EAAa,UACXF,EAAQnC,KAAKI,IACZ,SAACkC,EAAA,EAAU,CAAoBC,SAAUnC,EAAMoC,OAAQ7F,MAAO2D,OAAOF,EAAMzD,QAA1DyD,EAAMoC,cAKjC,CAEA,SAAS/C,EAAgBQ,GACvB,OAAO,SAACwC,EAAA,EAAa,CAAC3D,MAAOmB,EAAKQ,KAAK3B,OACzC,CAEA,SAASa,EAAoBM,GAC3B,OACE,gBAAKnE,UAAW4G,EAAe,SAAEzC,EAAKQ,KAAKC,YAAa,2BAAOiC,EAAAA,EAAAA,IAAe1C,EAAKQ,KAAKC,cAE5F,CAEA,MAAM2B,EAAgB,IAA+C,IAA9C,SAAEO,GAAuC,EAC9D,MAAM,QAAEC,IAAY3G,EAAAA,EAAAA,IAAWC,GAC/B,OAAO,gBAAKL,UAAW+G,EAAQ,SAAED,GAAe,EAG5CF,EAAiB9E,EAAAA,GAAI;;;;EAMrBzB,EAAawB,IAAoB,CACrCkF,QAASjF,EAAAA,GAAI;;sBAEOD,EAAME,QAAQ;;IAGlC8D,cAAe/D,EAAAA,GAAI;kBACHD,EAAME,QAAQ;qBACXF,EAAME,QAAQ;mEEnL5B,MAAMiF,EAAsC,IAA2B,YAA1B,KAAEC,EAAI,YAAEC,GAAa,EACvE,MAAMC,GAAQ/G,EAAAA,EAAAA,IAAWC,IACnB,MAAE+G,GAAUH,EACZhF,GAAUoF,EAAAA,EAAAA,IAAmBJ,EAAKK,YAA4C,QAAlC,EAAGL,EAAKK,UAAUC,cAAc/D,UAAE,QAAS,IACvF,kBAAEgE,EAAiB,sBAAEC,GCnB7B,SAA8BxF,GAAiB,MAC7C,MAAOyF,EAAWC,IAAgBvF,EAAAA,EAAAA,WAAkB,GAiBpD,MAAO,CACLoF,mBAhBwBjH,EAAAA,EAAAA,UACxB,KACE,SAACqH,EAAA,EAAK,CACJC,OAAQH,EACRI,UAAW,IAAMH,GAAa,GAC9BI,sBAAsB,EACtBC,eAAe,EACftI,MAAM,gBAAe,gBAErB,SAACsC,EAAY,CAACC,QAASA,QAG3B,CAACA,EAASyF,IAKVD,sBAAuB,IAAME,GAAa,GAC1CM,sBAAuB,IAAMN,GAAa,GAE9C,CDJuDO,CAAqBjG,GAEpEkG,GAAyBC,EAAAA,EAAAA,IAAqBlB,GAChDA,EAC0D,QAD/C,GACXmB,EAAAA,EAAAA,IAAqBnB,EAAYoB,SAASC,wBAAgB,aAA1D,EAA4DtH,KAE1DuH,EAAuBC,EAAAA,GAAAA,cAAyBC,EAAAA,GAAAA,oBAEhDC,EAAyB,GAEzBC,GAAcC,EAAAA,EAAAA,IAAqBzB,GAkCzC,IA9BI0B,EAAAA,EAAAA,IAAmB5B,IAAgBsB,IAAyBI,GAC9DD,EAAQI,MACN,SAAC,KAAU,CACT/I,UAAWmH,EAAM6B,OACjB1H,KAAK,KAEL2H,QAAQ,UACR5H,KAAK,aACLT,OAAO,UACPsI,MAAMC,EAAAA,EAAAA,IAAkBjC,EAAYjG,KAAMgG,EAAKmC,OAAO,sBAJlD,YAUNnC,EAAKoC,YAAYC,EAAAA,GAAAA,aACnBX,EAAQI,MACN,SAAC,KAAU,CACT/I,UAAWmH,EAAM6B,OACjB1H,KAAK,KAEL2H,QAAQ,UACR5H,KAAK,OACLT,OAAO,UACPsI,KAAMK,EAAAA,GAAAA,YAAqBtC,EAAKoC,YAAYC,EAAAA,GAAAA,aAAwB,yBAJhE,YAUNrC,EAAKoC,YAAYC,EAAAA,GAAAA,cAA0B,CAC7C,MAAME,EAAevC,EAAKoC,YAAYC,EAAAA,GAAAA,cACtC,GAAIE,EAAc,CAChBb,EAAQI,MACN,SAAC,KAAU,CACT/I,UAAWmH,EAAM6B,OACjB1H,KAAK,KAEL2H,QAAQ,UACR5H,KAAK,OACLT,OAAO,UACPsI,KAAO,KAAIO,mBAAmBD,KAAgB,4BAJ1C,cASR,MAAME,EAAUzC,EAAKoC,YAAYC,EAAAA,GAAAA,SAC7BI,GACFf,EAAQI,MACN,SAAC,KAAU,CACT/I,UAAWmH,EAAM6B,OACjB1H,KAAK,KAEL2H,QAAQ,UACR5H,KAAK,OACLT,OAAO,UACPsI,KAAO,KAAIO,mBAAmBD,gBAA2BC,mBAAmBC,KAAW,wBAJnF,SAUZ,CACF,CA4BA,OA1BIvB,GAA0BM,EAAAA,GAAAA,UAAqBC,EAAAA,GAAAA,uBAA4CD,EAAAA,GAAAA,WAC7FE,EAAQI,MACN,SAAC,KAAU,CACT/I,UAAWmH,EAAM6B,OACjB1H,KAAK,KAELD,KAAK,aACLT,OAAO,UACPsI,MAAMS,EAAAA,EAAAA,IAAyBxB,EAAwBlB,GAAM,oBAHzD,YAUNhF,GACF0G,EAAQI,MACN,UAAC,EAAAa,SAAQ,YACP,SAACC,EAAA,GAAM,CAAC7J,UAAWmH,EAAM6B,OAAQ1H,KAAK,KAAKD,KAAK,UAAUyI,QAAS,IAAMrC,IAAwB,gCAGhGD,IAJW,YASdmB,EAAQoB,QAER,gBAAK/J,UAAWmH,EAAMJ,QAAQ,UAC5B,SAAC,KAAe,CAACiD,MAAM,OAAM,SAAErB,EAAQoB,OAASpB,EAAU,IAAH,GAAG,wBAKzD,IAAI,EAGAtI,EAAawB,IAAoB,CAC5CkF,QAASjF,EAAAA,GAAI;eACAD,EAAME,QAAQ;;;;;+BAKEF,EAAMoI,OAAOC,OAAOC;IAEjDnB,OAAQlH,EAAAA,GAAI;;kBAEID,EAAME,QAAQ;iBACfF,EAAMuI,WAAW9I,KAAK+I;mGE9IhC,SAASC,EAAuBC,GACrC,MAAM,YAAElB,GAAgBkB,EAClBpK,GAASC,EAAAA,EAAAA,IAAWC,GAE1B,OAA2B,IAAvBgJ,EAAYU,OACP,MAIP,gBAAK/J,UAAWG,EAAOkJ,YAAY,SAChCA,EAAYnF,KAAI,QAAEsG,EAAK3J,GAAM,SAC5B,SAAC,IAAsB,CAAW4J,cAAeD,EAAK3J,MAAOA,GAAhC2J,EAAyC,KAI9E,CAEA,MAAMnK,EAAY,KAAM,CACtBgJ,YAAavH,EAAAA,GAAI;;8ICXZ,SAAS4I,EAAuBH,GACrC,MAAM,YAAErD,EAAW,KAAED,GAASsD,EACxBpK,GAASC,EAAAA,EAAAA,IAAWC,GAEpBsK,GAAsDpK,EAAAA,EAAAA,UAAQ,KAClE,IAAIuI,EAAAA,EAAAA,IAAmB5B,GACrB,MAAO,CAAC,CAAEjG,KAAMiG,EAAYjG,KAAMI,KAAM6F,EAAY0D,KAAKC,KAAKC,MAAMC,QAGtE,IAAI1D,EAAAA,EAAAA,IAAmBJ,EAAKK,WAAY,CACtC,MAAM,KAAE3C,GAASsC,EAAKK,UAAUC,cAC1ByD,EAASrG,EAAKsG,QAAO,CAACN,EAAavB,KACvC,MAAM8B,GAAKC,EAAAA,EAAAA,KAAmBC,oBAAoBhC,EAAMiC,eAExD,OAAKH,GAAMA,EAAGI,MAAQC,EAAAA,IAItBZ,EAAYO,EAAGjK,MAAQ,CAAEA,KAAMiK,EAAGjK,KAAMI,KAAM6J,EAAGN,KAAKC,KAAKC,MAAMC,OAC1DJ,GAJEA,CAIS,GACjB,CAAC,GAEJ,OAAO5G,OAAOyH,OAAOR,EACvB,CAEA,MAAO,EAAE,GACR,CAAC/D,EAAMC,IAEV,OAA2B,IAAvByD,EAAYZ,OACP,MAIP,SAAC,IAAY,CAACtG,MAAM,cAAa,SAC9BkH,EAAYzG,KAAI,CAAC,EAAgBuH,KAAK,IAArB,KAAExK,EAAI,KAAEI,GAAM,SAC9B,2BACGA,IACC,iCACE,gBAAKqK,IAAM,GAAEzK,oBAAwBjB,UAAWG,EAAOwL,eAAgBC,IAAKvK,IAAS,OAGxFJ,IANOA,EAOJ,KAId,CAEA,SAASZ,EAAUwB,GACjB,MAAMP,EAAOO,EAAME,QAAQ,GAE3B,MAAO,CACL4J,eAAgB7J,EAAAA,GAAI;eACTR;gBACCA;MAGhB,C,sLCvDO,MAAMuK,EAAuE,IAAwB,IAAvB,SAAEC,EAAQ,KAAEC,GAAM,EACrG,MAAMC,GAAUzL,EAAAA,EAAAA,UACd,IAAM,EACJ0L,EAAAA,EAAAA,GACE,CACEC,OAASC,GAA4B,eAAdA,EAAKC,KAC5BC,UAAW,IAAMP,GAClB,iBACKQ,EAAAA,UAAc,CAAkB,CAACR,GAAwB,UAAbA,EAAuBS,EAAAA,GAAcC,EAAAA,QAG3F,CAACV,IAGGW,GAAalM,EAAAA,EAAAA,UAAQ,KAAMmM,EAAAA,EAAAA,IAAUX,IAAO,CAACA,IAGnD,OAAO,SAAC,KAAM,CAAC,cAAa,oBAAqBC,QAASA,EAASnL,MAAO4L,GAAc,EAG7EE,EAAwB,IAAwC,IAArCC,WAAYxD,EAAK,YAAElC,GAAa,EACtE,MAAM/G,GAASC,EAAAA,EAAAA,IAAWC,GAE1B,OACE,SAACwM,EAAA,EAAI,CAAC7M,WAAW8M,EAAAA,EAAAA,IAAG3M,EAAO4M,KAAM,qBAAqB,UACnDjE,EAAAA,EAAAA,IAAmB5B,IAClB,SAAC2E,EAAgB,CAACE,KAAM3C,EAAO0C,SAAU5E,EAAYkF,OAASY,EAAAA,GAAAA,KAAsB,QAAU,WAE9F5D,GAEG,EAIE/I,EAAawB,IAAoB,CAC5CkL,KAAMjL,EAAAA,GAAI;mBACOD,EAAMuI,WAAW6C;MCzC7B,SAASC,EAAsB3C,GACpC,MAAM,YAAElB,EAAW,YAAEnC,EAAW,KAAED,GAASsD,EACrCpK,EAASE,IAEf,OAAKyI,EAAAA,EAAAA,IAAmB5B,IAKtB,SAACiG,EAAA,EAAY,CAAC1J,MAAM,aAAa2J,YAAY,EAAMpN,WAAW8M,EAAAA,EAAAA,IAAG,CAAE,CAAC3M,EAAOkN,WAAYhE,EAAYU,SAAU,UAC3G,SAAC4C,EAAU,CAACC,WAAY3F,EAAKmC,MAAOlC,YAAaA,MAL5C,IAQX,CAEA,MAAM7G,EAAY,KAAM,CACtBgN,QAASvL,EAAAA,GAAI;;sKCbR,MAAMwL,EAA2B,IAM3B,IAN4B,UACvCtN,EAAS,oBACTuN,EAAmB,YACnBC,EAAW,WACXC,EAAU,kBACVC,GACM,EACN,MAAMvN,GAASC,EAAAA,EAAAA,IAAWC,GAEpBsN,EAAsB3K,GACnB,WACL,OAAO0K,GAAqBA,EAAkB1K,IAC5C,SAAC4K,EAAA,EAAG,CAAC3M,KAAMyM,EAAkB1K,GAAO6K,QAAQ,GAAIC,WAAY,EAAG9N,UAAWG,EAAO4N,MAC/E,IACN,EAGIC,EAAiBjK,OAAOyH,OAAOyC,EAAAA,IAAmB/J,KAAKlB,IAAK,CAChES,MAAOT,EACPnC,MAAOmC,EACPkL,UAAWP,EAAmB3K,OAI1BmL,EADmB,CAACC,EAAAA,GAAAA,OAA8BA,EAAAA,GAAAA,SACnBlK,KAAKlB,IAAK,CAC7CS,OAAO4K,EAAAA,EAAAA,YAAWrL,GAClBnC,MAAOmC,EACPkL,UAAWP,EAAmB3K,OAG1BsL,EAA8B,YAAfb,EAA2BO,EAAiBG,EAEjE,OACE,iBAAKnO,UAAWA,EAAW,cAAY,8BAA6B,iBAClE,SAACiG,EAAA,EAAK,sBACN,SAACsI,EAAA,EAAgB,CACfC,QAASF,EACTzN,MAAO2M,EACP9L,SAAU6L,EACVzD,QAAU2E,IACJA,IAAMjB,GACRD,OAAoBmB,EACtB,MAGA,EAIV,SAASrO,EAAUwB,GACjB,MAAO,CACLkM,IAAKjM,EAAAA,GAAI;;;iBAGID,EAAME,QAAQ,IAAM;;qBAEhBF,EAAME,QAAQ;MAGnC,C,iFC3CA,SAAS4M,EAAkBpE,GACzB,MAAMpK,GAASC,EAAAA,EAAAA,IAAWC,IACpB,iBAAEuO,EAAgB,MAAEC,GAAUtE,EAEpC,OACE,iBAAKvK,UAAWG,EAAO2O,UAAU,WAC/B,sCACWD,EAAME,kBAAiB,WAAUF,EAAMG,gBAAe,gBAEhEJ,IACC,UAAC,KAAU,CAAC1F,KAAM0F,EAAkBtN,KAAK,KAAK2H,QAAQ,YAAW,sBACrD4F,EAAMG,gBAAe,wBAKzC,CAEO,SAASC,EAA6B1E,GAC3C,MACEtD,MAAM,SAAEiI,EAAQ,UAAEC,GAAW,kBAC7BC,EAAoBC,OAAOC,kBAAiB,WAC5CC,GACEhF,GAEGiF,EAAaC,IAAkBrN,EAAAA,EAAAA,aAC/BsN,EAAYC,IAAiBvN,EAAAA,EAAAA,aAG7BwN,IAAaxN,EAAAA,EAAAA,UAAiByN,KAAKC,MAAsB,IAAhBD,KAAKE,WAC/CC,EAAkB,eAAcJ,IAEhCzP,GAASC,EAAAA,EAAAA,IAAWC,GAEpB4P,GAAkB7H,EAAAA,EAAAA,IAAqB+G,EAAUjI,aAAegJ,EAAAA,GAA4B,aAE5FC,GAAS5P,EAAAA,EAAAA,UACb,kBACE6P,EAAAA,EAAAA,IAAelB,IAA4B,QAAnB,EAAIA,EAASiB,cAAM,OAAf,EAAiBpG,OAmDnD,SACEsG,EACAC,EACAH,GAEA,IAAII,EAAiB,IAAIJ,GACzB,GAAIE,EAAoB,CACtB,MAAMG,GAAWC,EAAAA,EAAAA,IAAcJ,GAAsB,IACrDE,EAAiBA,EAAetL,QAAO,QAAC,OAAEyL,GAAQ,SAAKC,EAAAA,EAAAA,IAAoBD,EAAQF,EAAS,GAC9F,CACIF,IACFC,EAAiBA,EAAetL,QAAQ2L,IAC/BC,EAAAA,EAAAA,IAA8BD,EAAM5N,SAAWsN,KAI1D,OAAOC,CACT,CAnEUO,CAAatB,EAAaE,GAAYqB,EAAAA,EAAAA,IAAWC,EAAAA,GAAAA,WAAsB9B,EAASiB,SAChF,EAAE,GACR,CAACjB,EAAUQ,EAAYF,IAGzB,KAAKY,EAAAA,EAAAA,IAAelB,GAClB,OAAO,KAGT,MAAM+B,EAAmBd,EAAO5K,MAAM,EAAG6J,GAEnC8B,GAAkBC,EAAAA,EAAAA,SAAQjC,EAASiB,QAASS,IAAUC,EAAAA,EAAAA,IAA8BD,EAAM5N,SAC1FoO,EAAmBjB,EAAOpG,OAASkH,EAAiBlH,OAEpD8E,EAAuB,CAC3BG,gBAAiBmB,EAAOpG,OACxBgF,kBAAmBkC,EAAiBlH,QAGhC6E,GAAmByC,EAAAA,EAAAA,IAAelC,EAAUjI,YAAaqD,EAAMtD,KAAMqK,SAASC,SAAWD,SAASE,QAElG1C,EAAYsC,GAChB,SAACzC,EAAiB,CAACE,MAAOA,EAAOD,iBAAkBA,SACjDF,EAEJ,OACE,UAACvB,EAAA,EAAY,CAAC1J,MAAM,qBAAqB2J,YAAY,EAAK,WACxD,gBAAKpN,WAAW8M,EAAAA,EAAAA,IAAG3M,EAAOsR,QAAStR,EAAOuR,cAAc,UACtD,iBAAK1R,UAAWG,EAAOsR,QAAQ,WAC7B,SAAC1R,EAAA,EAAa,CACZC,UAAWG,EAAOwR,SAElBzR,mBAAoBsP,EACpBvP,eAAiBY,GAAU4O,EAAe5O,IAFrCmP,IAIP,SAAC1C,EAAwB,CACvBtN,UAAWG,EAAOwR,SAClBlE,WAAYwC,EACZzC,YAAakC,EACbnC,oBAAqBoC,EACrBjC,kBAAmBwD,UAKzB,SAACU,EAAA,EAAmB,CAACC,UAAWZ,EAAkB1B,WAAYA,EAAYT,UAAWA,MAG3F,CAqBA,MAAMzO,EAAawB,IACV,CACL4P,QAAS3P,EAAAA,GAAI;;;;;;uBAMMD,EAAME,QAAQ;MAEjC2P,aAAc5P,EAAAA,GAAI;;MAGlB6P,SAAU7P,EAAAA,GAAI;sBACID,EAAME,QAAQ;MAEhC+M,UAAWhN,EAAAA,GAAI;;;aAGND,EAAME,QAAQ;;;;oHCtJpB,MAAM+P,EAAuB,IAAc,IAAb,KAAE7K,GAAM,EAC3C,MAAME,GAAQ/G,EAAAA,EAAAA,IAAW2R,GAEzB,MAAoB,QAAhB9K,EAAK+K,QAAoC,UAAhB/K,EAAK+K,QAE9B,SAAC,IAAO,CAACnQ,MAAM,QAAQT,QAAS6F,EAAKgL,WAAa,6BAA6B,UAC7E,iBAAKjS,UAAWmH,EAAM+K,KAAK,iBACzB,SAAC,IAAI,CAACjR,KAAK,0BAAyB,OACpC,2CAMD,8BAAGgG,EAAK+K,QAAU,EAGrBD,EAAYlQ,IAAoB,CACpCqQ,KAAMpQ,EAAAA,GAAI;;;;WAIDD,EAAME,QAAQ;;aAEZF,EAAMoI,OAAOkI,QAAQtS;8JCjB3B,MAAMuS,EAAuB,IAAsC,IAArC,KAAEnL,EAAI,WAAEoL,EAAU,WAAEC,GAAY,EACnE,MAAMnL,GAAQ/G,EAAAA,EAAAA,IAAW2R,IACnB,SAAE7C,GAAajI,EAGfsL,GAAUhS,EAAAA,EAAAA,UAAQ,KAAM,MAC5B,GACE2O,IACAkB,EAAAA,EAAAA,IAAelB,IACA,QADS,EACxBA,EAASiB,cAAM,OAAf,EAAiBpG,QACjBmF,EAASlM,QAAUoL,EAAAA,GAAAA,SACnB,CAEA,MAAMoE,GAAgBC,EAAAA,EAAAA,IAAiBvD,GAGvC,GAAIsD,EACF,OACE,kBAAM9S,MAAO8E,OAAOgO,GAAgBxS,UAAWmH,EAAMuL,IAAI,gBACnD,KACHC,EAAAA,EAAAA,IACC,CACEC,MAAOJ,EACPK,IAAK,IAAIC,OAEX,KAKV,CACA,OAAO,IAAI,GACV,CAAC5D,EAAU/H,IAEd,OAAIkL,EACK,IAAP,GACE,UAAC,KAAe,CAACU,MAAM,aAAY,WACjC,SAAC,IAAO,IAAG,eAINT,EACF,IAAP,GACE,UAAC,KAAe,CAACS,MAAM,aAAY,UAChC,KACD,SAAC,IAAO,IAAG,eAIN7D,IAAYkB,EAAAA,EAAAA,IAAelB,IAElC,UAAC,KAAe,CAAC6D,MAAM,aAAY,WACjC,SAAC,IAAa,CAAC/P,MAAOkM,EAASlM,QAC9BuP,KAGIrD,IAAY8D,EAAAA,EAAAA,IAAgB9D,IAC9B,kDAEF,qCAAQ,EAGX6C,EAAYlQ,IAAoB,CACpC6Q,IAAK5Q,EAAAA,GAAI;iBACMD,EAAMuI,WAAW6I,UAAUC;aAC/BrR,EAAMoI,OAAOpK,KAAKsT;;;6GCnDxB,SAASC,EAA0BC,GACxC,MAAMC,GAAqBvQ,EAAAA,EAAAA,IAA4BC,GAAUA,EAAMuQ,YACjEC,GAAsBzQ,EAAAA,EAAAA,IAA4BC,GAAUA,EAAMyQ,aAGlEC,GAAQC,EAAAA,EAAAA,QAAmC,CAAC,GAE5CC,GAAerT,EAAAA,EAAAA,UAAQ,KAC3B,GAAI8S,EAAiB,CACnB,MAAMnM,GAAc2M,EAAAA,EAAAA,IAAqBR,GACzC,IAAKnM,EACH,MAAM,IAAI4M,MAAO,yBAAwBT,KAE3C,MAAO,CAACnM,EACV,CACA,OAAO6M,EAAAA,EAAAA,KAAoB,GAC1B,CAACV,IAEJ,OAAO9S,EAAAA,EAAAA,UACL,IACEqT,EACG1P,KAAKgD,IAAyC,QAC7C,MAAMmM,GAAkBvK,EAAAA,EAAAA,IAAmB5B,GAAeA,EAAYjG,KAAOiG,EACvEqM,EAA+C,QAAtC,EAAGD,EAAmBD,UAAgB,aAAnC,EAAqC1Q,OACjD8Q,EAAiD,QAAvC,EAAGD,EAAoBH,UAAgB,aAApC,EAAsC1Q,OAEnDqR,EAASN,EAAMO,QAAQZ,GAC7B,GAAIW,GAAUA,EAAOT,YAAcA,GAAaS,EAAOP,aAAeA,EACpE,OAAOO,EAAOrR,OAEhB,MAAMuR,EAAoD,CAAC,EAG3DnQ,OAAOC,QAAQyP,GAAc,CAAC,GAAGU,SAAQ,IAA6B,IAA3BC,EAAeC,GAAO,EAC/D,MAAMlF,EAAmC,CACvCjI,cACAjG,KAAMmT,EACNC,OAAQ,IAEVH,EAAWE,GAAiBjF,EA+CxC,SAA2CA,GAA0E,IAAxCkF,EAA8B,UAAH,6CAAG,GACzGlF,EAAUkF,OAASA,EAAOnQ,KAAKkD,IAC7B,MAAMkN,EAAmC,CACvCrT,KAAMmG,EAAMnG,KACZsT,SAAUnN,EAAMmN,SAChBC,eAAgBpN,EAAMoN,eACtBC,MAAO,IAGT,OADAH,EAAcG,MAAQrN,EAAMqN,MAAMvQ,KAAK+C,GAASyN,EAAwBzN,EAAMkI,EAAWmF,KAClFA,CAAa,GAExB,CAzDYK,CAAkCxF,EAAWkF,EAAO,IAItDd,SAAAA,EAAWY,SAAQ,IAAqC,IAAlClT,KAAMmT,EAAa,OAAEC,GAAQ,GAuD7D,SAA0ClF,EAAkCkF,GAC1E,MAAMO,EAAuB,IAAIC,IACjC1F,EAAUkF,OAAOF,SAAS/M,GAAUwN,EAAqBE,IAAI1N,EAAMnG,KAAMmG,KAEzEiN,EAAOF,SAAS/M,IAAU,MACxB,IAAIkN,EAAgBM,EAAqBG,IAAI3N,EAAMnG,MAC9CqT,IACHA,EAAgB,CACdrT,KAAMmG,EAAMnG,KACZwT,MAAO,IAETtF,EAAUkF,OAAOtL,KAAKuL,GACtBM,EAAqBE,IAAI1N,EAAMnG,KAAMqT,IAGvC,MAAMU,EAAsB,IAAIH,IAChCP,EAAeG,MAAMN,SAASc,IAE5B,MAAMC,EAAeF,EAAoBD,IAAIE,EAAEhU,MAC/CiU,EAAeA,EAAanM,KAAKkM,GAAKD,EAAoBF,IAAIG,EAAEhU,KAAM,CAACgU,GAAG,KAGhE,QAAZ,EAAC7N,EAAMqN,aAAK,QAAI,IAAIN,SAASlN,IAC3B,MAAMiO,EA2DZ,SACEjO,EACAkO,EACAjO,GAKA,MAAMkO,EAAoBD,EAAyBJ,IAAI9N,EAAKhG,MAC5D,IAAKmU,EACH,OAGF,IAAIhN,EAAAA,EAAAA,IAAqBlB,GAEvB,OAAOkO,EAAkB,GAI3B,MAAMC,EAAuBD,EAAkBE,MAC5CC,IAAkBA,EAAarG,UAAYsG,EAA8BD,EAActO,GAAM,KAEhG,GAAIoO,EACF,OAAOA,EAKT,MAAMI,EAAsBL,EAAkBE,MAC3CC,IAAkBA,EAAarG,UAAYsG,EAA8BD,EAActO,GAAM,KAEhG,GAAIwO,EACF,OAAOA,EAGT,MACF,CA/F2BC,CAAuBzO,EAAM+N,EAAqB7F,EAAUjI,aAC7EgO,EACFA,EAAahG,SAAWjI,EAExBqN,EAAeG,MAAM1L,KAM7B,SAAgC9B,EAAYkI,EAAkC/H,GAC5E,MAAO,CACLnG,KAAMgG,EAAKhG,KACXmI,MAAOnC,EAAKmC,MACZsH,OAAQzJ,EAAKyJ,QAAU,CAAC,EACxBrH,aAAa+G,EAAAA,EAAAA,IAAenJ,IAAQA,EAAKoC,aAAoB,CAAC,EAC9D6F,SAAUjI,EACVkI,UAAWA,EACX/H,QAEJ,CAhBkCuO,CAAuB1O,EAAMkI,EAAWmF,GACpE,GACA,GAEN,CA/EYsB,CANY1B,EAAWE,GAAiBF,EAAWE,IAAkB,CACnElN,cACAjG,KAAMmT,EACNC,OAAQ,IAG2BA,EAAO,IAG9C,MAAM1R,EAASoB,OAAOyH,OAAO0I,GAG7B,OADAR,EAAMO,QAAQZ,GAAmB,CAAEE,YAAWE,aAAY9Q,UACnDA,CAAM,IAEdkT,QACL,CAACvC,EAAoBE,EAAqBI,GAE9C,CAGO,SAASkC,EAA2B5B,GACzC,OAAOA,EAAWhQ,KAAKiL,IACrB,MAAM4G,EAAsC,OAAH,UACpC5G,EAAS,CACZkF,OAAQ,KAaP,IAAyBI,EAJ5B,OALAsB,EAAa1B,OAAOtL,KAAK,CACvB9H,KAAM,UACNwT,OAO0BA,EAPHtF,EAAUkF,OAAO2B,SAAS5O,GAAUA,EAAMqN,QAQ9DA,EAAMzP,MAAK,CAACiR,EAAGC,IAAMD,EAAEhV,KAAKkV,cAAcD,EAAEjV,WAL1C8U,CAAY,GAEvB,CAgEA,SAASrB,EACPzN,EACAkI,EACA/H,GAEA,OAAOgP,EAAAA,EAAAA,IAAoBnP,GACvB,CACEhG,KAAMgG,EAAK2J,MACXxH,MAAOnC,EAAK8E,KACZ2E,OAAQzJ,EAAKyJ,QAAU,CAAC,EACxBrH,YAAapC,EAAKoC,aAAe,CAAC,EAClC/B,UAAWL,EACXkI,YACA/H,UAEFiP,EAAAA,EAAAA,IAAqBpP,GACrB,CACEhG,KAAMgG,EAAKqP,OACXlN,MAAOnC,EAAK8E,KACZ2E,OAAQzJ,EAAKyJ,QAAU,CAAC,EACxBrH,YAAa,CAAC,EACd/B,UAAWL,EACXkI,YACA/H,SAEF,CACEnG,KAAMgG,EAAKM,cAAc7H,MACzB0J,MAAO,GACPsH,OAAQzJ,EAAKyJ,QAAU,CAAC,EACxBrH,YAAapC,EAAKoC,aAAe,CAAC,EAClC/B,UAAWL,EACXkI,YACA/H,QAER,CAyCA,SAASoO,EAA8BD,EAA4BtO,GAAwC,IAA5BsP,IAAa,UAAH,+CACvF,OAAIhB,EAAatU,OAASgG,EAAKhG,OACtBuV,EAAAA,EAAAA,SACL,CAACD,EAAaE,EAAUlB,EAAanM,OAAS,GAAImM,EAAa7E,OAAQ6E,EAAalM,aACpF,CAACkN,EAAaE,EAAUxP,EAAKmC,OAAS,GAAInC,EAAKyJ,QAAU,CAAC,GAAGN,EAAAA,EAAAA,IAAenJ,IAAQA,EAAKoC,aAAoB,CAAC,GAIpH,CAGA,SAASoN,EAAUrN,GAQjB,OANIA,EAAMW,OAAS,GAAkB,MAAbX,EAAM,IAA0C,MAA5BA,EAAMA,EAAMW,OAAS,KAC/DX,EAAQA,EAAM7D,MAAM,GAAI,KAG1B6D,EAAQA,EAAM1E,QAAQ,SAAU,KAEnBgS,MAAM,IAAI1R,OAAO2R,KAAK,GACrC,C","sources":["webpack://grafana/./public/app/features/alerting/unified/components/Provisioning.tsx","webpack://grafana/./public/app/features/alerting/unified/components/alert-groups/MatcherFilter.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/StateHistory.tsx","webpack://grafana/./public/app/features/alerting/unified/hooks/useManagedAlertStateHistory.ts","webpack://grafana/./public/app/features/alerting/unified/components/rules/RuleDetailsActionButtons.tsx","webpack://grafana/./public/app/features/alerting/unified/hooks/useStateHistoryModal.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/RuleDetailsAnnotations.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/RuleDetailsDataSources.tsx","webpack://grafana/./public/app/features/alerting/unified/components/Expression.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/RuleDetailsExpression.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/AlertInstanceStateFilter.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/RuleDetailsMatchingInstances.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/RuleHealth.tsx","webpack://grafana/./public/app/features/alerting/unified/components/rules/RuleState.tsx","webpack://grafana/./public/app/features/alerting/unified/hooks/useCombinedRuleNamespaces.ts"],"sourcesContent":["import React from 'react';\n\nimport { Alert, Badge } from '@grafana/ui';\n\nexport enum ProvisionedResource {\n ContactPoint = 'contact point',\n Template = 'template',\n MuteTiming = 'mute timing',\n AlertRule = 'alert rule',\n RootNotificationPolicy = 'root notification policy',\n}\n\ninterface ProvisioningAlertProps {\n resource: ProvisionedResource;\n}\n\nexport const ProvisioningAlert = ({ resource }: ProvisioningAlertProps) => {\n return (\n \n This {resource} has been provisioned, that means it was created by config. Please contact your server admin to\n update this {resource}.\n \n );\n};\n\nexport const ProvisioningBadge = () => {\n return ;\n};\n","import { css } from '@emotion/css';\nimport { debounce } from 'lodash';\nimport React, { FormEvent, useEffect, useMemo } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Stack } from '@grafana/experimental';\nimport { logInfo } from '@grafana/runtime';\nimport { Label, Tooltip, Input, Icon, useStyles2 } from '@grafana/ui';\n\nimport { LogMessages } from '../../Analytics';\n\ninterface Props {\n className?: string;\n defaultQueryString?: string;\n onFilterChange: (filterString: string) => void;\n}\n\nexport const MatcherFilter = ({ className, onFilterChange, defaultQueryString }: Props) => {\n const styles = useStyles2(getStyles);\n\n const onSearchInputChanged = useMemo(\n () =>\n debounce((e: FormEvent) => {\n logInfo(LogMessages.filterByLabel);\n\n const target = e.target as HTMLInputElement;\n onFilterChange(target.value);\n }, 600),\n [onFilterChange]\n );\n\n useEffect(() => onSearchInputChanged.cancel(), [onSearchInputChanged]);\n\n const searchIcon = ;\n\n return (\n
\n
\n }\n >\n \n \n \n \n \n \n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n icon: css`\n margin-right: ${theme.spacing(0.5)};\n `,\n inputWidth: css`\n width: 340px;\n flex-grow: 0;\n `,\n});\n","import { css } from '@emotion/css';\nimport { groupBy } from 'lodash';\nimport React, { FC, FormEvent, useCallback, useState } from 'react';\n\nimport { AlertState, dateTimeFormat, GrafanaTheme2 } from '@grafana/data';\nimport { Stack } from '@grafana/experimental';\nimport { Alert, Field, Icon, Input, Label, LoadingPlaceholder, Tooltip, useStyles2 } from '@grafana/ui';\nimport { StateHistoryItem, StateHistoryItemData } from 'app/types/unified-alerting';\nimport { GrafanaAlertStateWithReason, PromAlertingRuleState } from 'app/types/unified-alerting-dto';\n\nimport { useManagedAlertStateHistory } from '../../hooks/useManagedAlertStateHistory';\nimport { AlertLabel } from '../AlertLabel';\nimport { DynamicTable, DynamicTableColumnProps, DynamicTableItemProps } from '../DynamicTable';\n\nimport { AlertStateTag } from './AlertStateTag';\n\ntype StateHistoryRowItem = {\n id: string;\n state: PromAlertingRuleState | GrafanaAlertStateWithReason | AlertState;\n text?: string;\n data?: StateHistoryItemData;\n timestamp?: number;\n stringifiedLabels: string;\n};\n\ntype StateHistoryMap = Record;\n\ntype StateHistoryRow = DynamicTableItemProps;\n\ninterface RuleStateHistoryProps {\n alertId: string;\n}\n\nconst StateHistory: FC = ({ alertId }) => {\n const [textFilter, setTextFilter] = useState('');\n const handleTextFilter = useCallback((event: FormEvent) => {\n setTextFilter(event.currentTarget.value);\n }, []);\n\n const { loading, error, result = [] } = useManagedAlertStateHistory(alertId);\n\n const styles = useStyles2(getStyles);\n\n if (loading && !error) {\n return ;\n }\n\n if (error && !loading) {\n return {error.message};\n }\n\n const columns: Array> = [\n { id: 'state', label: 'State', size: 'max-content', renderCell: renderStateCell },\n { id: 'value', label: '', size: 'auto', renderCell: renderValueCell },\n { id: 'timestamp', label: 'Time', size: 'max-content', renderCell: renderTimestampCell },\n ];\n\n // group the state history list by unique set of labels\n const tables = Object.entries(groupStateByLabels(result))\n // sort and filter each table\n .sort()\n .filter(([groupKey]) => matchKey(groupKey, textFilter))\n .map(([groupKey, items]) => {\n const tableItems: StateHistoryRow[] = items.map((historyItem) => ({\n id: historyItem.id,\n data: historyItem,\n }));\n\n return (\n
\n
\n {groupKey}\n
\n \n
\n );\n });\n\n return (\n
\n
\n }\n >\n \n \n \n \n }\n >\n } onChange={handleTextFilter} placeholder=\"Search\" />\n \n \n {tables}\n \n );\n};\n\n// group state history by labels\nexport function groupStateByLabels(\n history: Array>\n): StateHistoryMap {\n const items: StateHistoryRowItem[] = history.map((item) => {\n // let's grab the last matching set of `{}` since the alert name could also contain { or }\n const LABELS_REGEX = /{.*?}/g;\n const stringifiedLabels = item.text.match(LABELS_REGEX)?.at(-1) ?? '';\n\n return {\n id: String(item.id),\n state: item.newState,\n // let's omit the labels for each entry since it's just added noise to each state history item\n text: item.text.replace(stringifiedLabels, ''),\n data: item.data,\n timestamp: item.updated,\n stringifiedLabels,\n };\n });\n\n // we have to group our state history items by their unique combination of tags since we want to display a DynamicTable for each alert instance\n // (effectively unique combination of labels)\n return groupBy(items, (item) => item.stringifiedLabels);\n}\n\n// match a string either by exact text match or with regular expression when in the form of \"//\"\nexport function matchKey(groupKey: string, textFilter: string) {\n // if the text filter is empty we show all matches\n if (textFilter === '') {\n return true;\n }\n\n const isRegExp = textFilter.startsWith('/') && textFilter.endsWith('/');\n\n // not a regular expression, use normal text matching\n if (!isRegExp) {\n return groupKey.includes(textFilter);\n }\n\n // regular expression, try parsing and applying\n // when we fail to parse the text as a regular expression, we return no match\n try {\n return new RegExp(textFilter.slice(1, -1)).test(groupKey);\n } catch (err) {\n return false;\n }\n}\n\nfunction renderValueCell(item: StateHistoryRow) {\n const matches = item.data.data?.evalMatches ?? [];\n\n return (\n <>\n {item.data.text}\n \n {matches.map((match) => (\n \n ))}\n \n \n );\n}\n\nfunction renderStateCell(item: StateHistoryRow) {\n return ;\n}\n\nfunction renderTimestampCell(item: StateHistoryRow) {\n return (\n
{item.data.timestamp && {dateTimeFormat(item.data.timestamp)}}
\n );\n}\n\nconst LabelsWrapper = ({ children }: React.PropsWithChildren<{}>) => {\n const { wrapper } = useStyles2(getStyles);\n return
{children}
;\n};\n\nconst TimestampStyle = css`\n display: flex;\n align-items: flex-end;\n flex-direction: column;\n`;\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n wrapper: css`\n & > * {\n margin-right: ${theme.spacing(1)};\n }\n `,\n tableGroupKey: css`\n margin-top: ${theme.spacing(2)};\n margin-bottom: ${theme.spacing(2)};\n `,\n});\n\nexport { StateHistory };\n","import { useEffect } from 'react';\n\nimport { useDispatch } from 'app/types';\nimport { StateHistoryItem } from 'app/types/unified-alerting';\n\nimport { fetchGrafanaAnnotationsAction } from '../state/actions';\nimport { AsyncRequestState } from '../utils/redux';\n\nimport { useUnifiedAlertingSelector } from './useUnifiedAlertingSelector';\n\nexport function useManagedAlertStateHistory(alertId: string) {\n const dispatch = useDispatch();\n const history = useUnifiedAlertingSelector>(\n (state) => state.managedAlertStateHistory\n );\n\n useEffect(() => {\n dispatch(fetchGrafanaAnnotationsAction(alertId));\n }, [dispatch, alertId]);\n\n return history;\n}\n","import { css } from '@emotion/css';\nimport React, { FC, Fragment } from 'react';\n\nimport { GrafanaTheme2, textUtil } from '@grafana/data';\nimport { Button, HorizontalGroup, LinkButton, useStyles2 } from '@grafana/ui';\nimport { contextSrv } from 'app/core/services/context_srv';\nimport { AccessControlAction } from 'app/types';\nimport { CombinedRule, RulesSource } from 'app/types/unified-alerting';\n\nimport { useStateHistoryModal } from '../../hooks/useStateHistoryModal';\nimport { getAlertmanagerByUid } from '../../utils/alertmanager';\nimport { Annotation } from '../../utils/constants';\nimport { isCloudRulesSource, isGrafanaRulesSource } from '../../utils/datasource';\nimport { createExploreLink, makeRuleBasedSilenceLink } from '../../utils/misc';\nimport { isFederatedRuleGroup, isGrafanaRulerRule } from '../../utils/rules';\n\ninterface Props {\n rule: CombinedRule;\n rulesSource: RulesSource;\n}\n\nexport const RuleDetailsActionButtons: FC = ({ rule, rulesSource }) => {\n const style = useStyles2(getStyles);\n const { group } = rule;\n const alertId = isGrafanaRulerRule(rule.rulerRule) ? rule.rulerRule.grafana_alert.id ?? '' : '';\n const { StateHistoryModal, showStateHistoryModal } = useStateHistoryModal(alertId);\n\n const alertmanagerSourceName = isGrafanaRulesSource(rulesSource)\n ? rulesSource\n : getAlertmanagerByUid(rulesSource.jsonData.alertmanagerUid)?.name;\n\n const hasExplorePermission = contextSrv.hasPermission(AccessControlAction.DataSourcesExplore);\n\n const buttons: JSX.Element[] = [];\n\n const isFederated = isFederatedRuleGroup(group);\n\n // explore does not support grafana rule queries atm\n // neither do \"federated rules\"\n if (isCloudRulesSource(rulesSource) && hasExplorePermission && !isFederated) {\n buttons.push(\n \n See graph\n \n );\n }\n if (rule.annotations[Annotation.runbookURL]) {\n buttons.push(\n \n View runbook\n \n );\n }\n if (rule.annotations[Annotation.dashboardUID]) {\n const dashboardUID = rule.annotations[Annotation.dashboardUID];\n if (dashboardUID) {\n buttons.push(\n \n Go to dashboard\n \n );\n const panelId = rule.annotations[Annotation.panelID];\n if (panelId) {\n buttons.push(\n \n Go to panel\n \n );\n }\n }\n }\n\n if (alertmanagerSourceName && contextSrv.hasAccess(AccessControlAction.AlertingInstanceCreate, contextSrv.isEditor)) {\n buttons.push(\n \n Silence\n \n );\n }\n\n if (alertId) {\n buttons.push(\n \n \n {StateHistoryModal}\n \n );\n }\n\n if (buttons.length) {\n return (\n
\n {buttons.length ? buttons :
}\n
\n );\n }\n\n return null;\n};\n\nexport const getStyles = (theme: GrafanaTheme2) => ({\n wrapper: css`\n padding: ${theme.spacing(2)} 0;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n flex-wrap: wrap;\n border-bottom: solid 1px ${theme.colors.border.medium};\n `,\n button: css`\n height: 24px;\n margin-top: ${theme.spacing(1)};\n font-size: ${theme.typography.size.sm};\n `,\n});\n","import React, { useMemo, useState } from 'react';\n\nimport { Modal } from '@grafana/ui';\n\nimport { StateHistory } from '../components/rules/StateHistory';\n\nfunction useStateHistoryModal(alertId: string) {\n const [showModal, setShowModal] = useState(false);\n\n const StateHistoryModal = useMemo(\n () => (\n setShowModal(false)}\n closeOnBackdropClick={true}\n closeOnEscape={true}\n title=\"State history\"\n >\n \n \n ),\n [alertId, showModal]\n );\n\n return {\n StateHistoryModal,\n showStateHistoryModal: () => setShowModal(true),\n hideStateHistoryModal: () => setShowModal(false),\n };\n}\n\nexport { useStateHistoryModal };\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { useStyles2 } from '@grafana/ui';\n\nimport { AnnotationDetailsField } from '../AnnotationDetailsField';\n\ntype Props = {\n annotations: Array<[string, string]>;\n};\n\nexport function RuleDetailsAnnotations(props: Props): JSX.Element | null {\n const { annotations } = props;\n const styles = useStyles2(getStyles);\n\n if (annotations.length === 0) {\n return null;\n }\n\n return (\n
\n {annotations.map(([key, value]) => (\n \n ))}\n
\n );\n}\n\nconst getStyles = () => ({\n annotations: css`\n margin-top: 46px;\n `,\n});\n","import { css } from '@emotion/css';\nimport React, { useMemo } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { getDataSourceSrv } from '@grafana/runtime';\nimport { useStyles2 } from '@grafana/ui';\nimport { ExpressionDatasourceUID } from 'app/features/expressions/ExpressionDatasource';\nimport { CombinedRule, RulesSource } from 'app/types/unified-alerting';\n\nimport { isCloudRulesSource } from '../../utils/datasource';\nimport { isGrafanaRulerRule } from '../../utils/rules';\nimport { DetailsField } from '../DetailsField';\n\ntype Props = {\n rule: CombinedRule;\n rulesSource: RulesSource;\n};\n\nexport function RuleDetailsDataSources(props: Props): JSX.Element | null {\n const { rulesSource, rule } = props;\n const styles = useStyles2(getStyles);\n\n const dataSources: Array<{ name: string; icon?: string }> = useMemo(() => {\n if (isCloudRulesSource(rulesSource)) {\n return [{ name: rulesSource.name, icon: rulesSource.meta.info.logos.small }];\n }\n\n if (isGrafanaRulerRule(rule.rulerRule)) {\n const { data } = rule.rulerRule.grafana_alert;\n const unique = data.reduce((dataSources, query) => {\n const ds = getDataSourceSrv().getInstanceSettings(query.datasourceUid);\n\n if (!ds || ds.uid === ExpressionDatasourceUID) {\n return dataSources;\n }\n\n dataSources[ds.name] = { name: ds.name, icon: ds.meta.info.logos.small };\n return dataSources;\n }, {} as Record);\n\n return Object.values(unique);\n }\n\n return [];\n }, [rule, rulesSource]);\n\n if (dataSources.length === 0) {\n return null;\n }\n\n return (\n \n {dataSources.map(({ name, icon }, index) => (\n
\n {icon && (\n <>\n {`${name}{' '}\n \n )}\n {name}\n
\n ))}\n
\n );\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n const size = theme.spacing(2);\n\n return {\n dataSourceIcon: css`\n width: ${size};\n height: ${size};\n `,\n };\n}\n","import { css, cx } from '@emotion/css';\nimport { LanguageMap, languages as prismLanguages } from 'prismjs';\nimport React, { FC, useMemo } from 'react';\nimport { Editor } from 'slate-react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { makeValue, SlatePrism, useStyles2 } from '@grafana/ui';\nimport LogqlSyntax from 'app/plugins/datasource/loki/syntax';\nimport PromqlSyntax from 'app/plugins/datasource/prometheus/promql';\nimport { RulesSource } from 'app/types/unified-alerting';\n\nimport { DataSourceType, isCloudRulesSource } from '../utils/datasource';\n\nimport { Well } from './Well';\n\ninterface Props {\n expression: string;\n rulesSource: RulesSource;\n}\n\nexport const HighlightedQuery: FC<{ language: 'promql' | 'logql'; expr: string }> = ({ language, expr }) => {\n const plugins = useMemo(\n () => [\n SlatePrism(\n {\n onlyIn: (node: any) => node.type === 'code_block',\n getSyntax: () => language,\n },\n { ...(prismLanguages as LanguageMap), [language]: language === 'logql' ? LogqlSyntax : PromqlSyntax }\n ),\n ],\n [language]\n );\n\n const slateValue = useMemo(() => makeValue(expr), [expr]);\n\n //We don't want to set readOnly={true} to the Editor to prevent unwanted charaters in the copied text. See https://github.com/grafana/grafana/pull/57839\n return ;\n};\n\nexport const Expression: FC = ({ expression: query, rulesSource }) => {\n const styles = useStyles2(getStyles);\n\n return (\n \n {isCloudRulesSource(rulesSource) ? (\n \n ) : (\n query\n )}\n \n );\n};\n\nexport const getStyles = (theme: GrafanaTheme2) => ({\n well: css`\n font-family: ${theme.typography.fontFamilyMonospace};\n `,\n});\n","import { css, cx } from '@emotion/css';\nimport React from 'react';\n\nimport { CombinedRule, RulesSource } from 'app/types/unified-alerting';\n\nimport { isCloudRulesSource } from '../../utils/datasource';\nimport { DetailsField } from '../DetailsField';\nimport { Expression } from '../Expression';\n\ntype Props = {\n rule: CombinedRule;\n rulesSource: RulesSource;\n annotations: Array<[string, string]>;\n};\n\nexport function RuleDetailsExpression(props: Props): JSX.Element | null {\n const { annotations, rulesSource, rule } = props;\n const styles = getStyles();\n\n if (!isCloudRulesSource(rulesSource)) {\n return null;\n }\n\n return (\n \n \n \n );\n}\n\nconst getStyles = () => ({\n exprRow: css`\n margin-bottom: 46px;\n `,\n});\n","import { css } from '@emotion/css';\nimport { capitalize } from 'lodash';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data/src';\nimport { Label, RadioButtonGroup, Tag, useStyles2 } from '@grafana/ui';\nimport { GrafanaAlertState, PromAlertingRuleState } from 'app/types/unified-alerting-dto';\n\nexport type InstanceStateFilter = GrafanaAlertState | PromAlertingRuleState.Pending | PromAlertingRuleState.Firing;\n\ninterface Props {\n className?: string;\n filterType: 'grafana' | 'prometheus';\n stateFilter?: InstanceStateFilter;\n onStateFilterChange: (value?: InstanceStateFilter) => void;\n itemPerStateStats?: Record;\n}\n\nexport const AlertInstanceStateFilter = ({\n className,\n onStateFilterChange,\n stateFilter,\n filterType,\n itemPerStateStats,\n}: Props) => {\n const styles = useStyles2(getStyles);\n\n const getOptionComponent = (state: InstanceStateFilter) => {\n return function InstanceStateCounter() {\n return itemPerStateStats && itemPerStateStats[state] ? (\n \n ) : null;\n };\n };\n\n const grafanaOptions = Object.values(GrafanaAlertState).map((state) => ({\n label: state,\n value: state,\n component: getOptionComponent(state),\n }));\n\n const promOptionValues = [PromAlertingRuleState.Firing, PromAlertingRuleState.Pending] as const;\n const promOptions = promOptionValues.map((state) => ({\n label: capitalize(state),\n value: state,\n component: getOptionComponent(state),\n }));\n\n const stateOptions = filterType === 'grafana' ? grafanaOptions : promOptions;\n\n return (\n
\n \n {\n if (v === stateFilter) {\n onStateFilterChange(undefined);\n }\n }}\n />\n
\n );\n};\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n tag: css`\n font-size: 11px;\n font-weight: normal;\n padding: ${theme.spacing(0.25, 0.5)};\n vertical-align: middle;\n margin-left: ${theme.spacing(0.5)};\n `,\n };\n}\n","import { css, cx } from '@emotion/css';\nimport { countBy } from 'lodash';\nimport React, { useMemo, useState } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { LinkButton, useStyles2 } from '@grafana/ui';\nimport { MatcherFilter } from 'app/features/alerting/unified/components/alert-groups/MatcherFilter';\nimport {\n AlertInstanceStateFilter,\n InstanceStateFilter,\n} from 'app/features/alerting/unified/components/rules/AlertInstanceStateFilter';\nimport { labelsMatchMatchers, parseMatchers } from 'app/features/alerting/unified/utils/alertmanager';\nimport { createViewLink, sortAlerts } from 'app/features/alerting/unified/utils/misc';\nimport { SortOrder } from 'app/plugins/panel/alertlist/types';\nimport { Alert, CombinedRule, PaginationProps } from 'app/types/unified-alerting';\nimport { mapStateWithReasonToBaseState } from 'app/types/unified-alerting-dto';\n\nimport { GRAFANA_RULES_SOURCE_NAME, isGrafanaRulesSource } from '../../utils/datasource';\nimport { isAlertingRule } from '../../utils/rules';\nimport { DetailsField } from '../DetailsField';\n\nimport { AlertInstancesTable } from './AlertInstancesTable';\n\ninterface Props {\n rule: CombinedRule;\n pagination?: PaginationProps;\n itemsDisplayLimit?: number;\n}\n\ninterface ShowMoreStats {\n totalItemsCount: number;\n visibleItemsCount: number;\n}\n\nfunction ShowMoreInstances(props: { ruleViewPageLink: string; stats: ShowMoreStats }) {\n const styles = useStyles2(getStyles);\n const { ruleViewPageLink, stats } = props;\n\n return (\n
\n
\n Showing {stats.visibleItemsCount} out of {stats.totalItemsCount} instances\n
\n {ruleViewPageLink && (\n \n Show all {stats.totalItemsCount} alert instances\n \n )}\n
\n );\n}\n\nexport function RuleDetailsMatchingInstances(props: Props): JSX.Element | null {\n const {\n rule: { promRule, namespace },\n itemsDisplayLimit = Number.POSITIVE_INFINITY,\n pagination,\n } = props;\n\n const [queryString, setQueryString] = useState();\n const [alertState, setAlertState] = useState();\n\n // This key is used to force a rerender on the inputs when the filters are cleared\n const [filterKey] = useState(Math.floor(Math.random() * 100));\n const queryStringKey = `queryString-${filterKey}`;\n\n const styles = useStyles2(getStyles);\n\n const stateFilterType = isGrafanaRulesSource(namespace.rulesSource) ? GRAFANA_RULES_SOURCE_NAME : 'prometheus';\n\n const alerts = useMemo(\n (): Alert[] =>\n isAlertingRule(promRule) && promRule.alerts?.length\n ? filterAlerts(queryString, alertState, sortAlerts(SortOrder.Importance, promRule.alerts))\n : [],\n [promRule, alertState, queryString]\n );\n\n if (!isAlertingRule(promRule)) {\n return null;\n }\n\n const visibleInstances = alerts.slice(0, itemsDisplayLimit);\n\n const countAllByState = countBy(promRule.alerts, (alert) => mapStateWithReasonToBaseState(alert.state));\n const hiddenItemsCount = alerts.length - visibleInstances.length;\n\n const stats: ShowMoreStats = {\n totalItemsCount: alerts.length,\n visibleItemsCount: visibleInstances.length,\n };\n\n const ruleViewPageLink = createViewLink(namespace.rulesSource, props.rule, location.pathname + location.search);\n\n const footerRow = hiddenItemsCount ? (\n \n ) : undefined;\n\n return (\n \n
\n
\n setQueryString(value)}\n />\n \n
\n
\n\n \n
\n );\n}\n\nfunction filterAlerts(\n alertInstanceLabel: string | undefined,\n alertInstanceState: InstanceStateFilter | undefined,\n alerts: Alert[]\n): Alert[] {\n let filteredAlerts = [...alerts];\n if (alertInstanceLabel) {\n const matchers = parseMatchers(alertInstanceLabel || '');\n filteredAlerts = filteredAlerts.filter(({ labels }) => labelsMatchMatchers(labels, matchers));\n }\n if (alertInstanceState) {\n filteredAlerts = filteredAlerts.filter((alert) => {\n return mapStateWithReasonToBaseState(alert.state) === alertInstanceState;\n });\n }\n\n return filteredAlerts;\n}\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n flexRow: css`\n display: flex;\n flex-direction: row;\n align-items: flex-end;\n width: 100%;\n flex-wrap: wrap;\n margin-bottom: ${theme.spacing(1)};\n `,\n spaceBetween: css`\n justify-content: space-between;\n `,\n rowChild: css`\n margin-right: ${theme.spacing(1)};\n `,\n footerRow: css`\n display: flex;\n flex-direction: column;\n gap: ${theme.spacing(1)};\n justify-content: space-between;\n align-items: center;\n width: 100%;\n `,\n };\n};\n","import { css } from '@emotion/css';\nimport React, { FC } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Icon, Tooltip, useStyles2 } from '@grafana/ui';\nimport { Rule } from 'app/types/unified-alerting';\n\ninterface Prom {\n rule: Rule;\n}\n\nexport const RuleHealth: FC = ({ rule }) => {\n const style = useStyles2(getStyle);\n\n if (rule.health === 'err' || rule.health === 'error') {\n return (\n \n
\n \n error\n
\n
\n );\n }\n\n return <>{rule.health};\n};\n\nconst getStyle = (theme: GrafanaTheme2) => ({\n warn: css`\n display: inline-flex;\n flex-direction: row;\n align-items: center;\n gap: ${theme.spacing(1)};\n\n color: ${theme.colors.warning.text};\n `,\n});\n","import { css } from '@emotion/css';\nimport React, { FC, useMemo } from 'react';\n\nimport { GrafanaTheme2, intervalToAbbreviatedDurationString } from '@grafana/data';\nimport { HorizontalGroup, Spinner, useStyles2 } from '@grafana/ui';\nimport { CombinedRule } from 'app/types/unified-alerting';\nimport { PromAlertingRuleState } from 'app/types/unified-alerting-dto';\n\nimport { isAlertingRule, isRecordingRule, getFirstActiveAt } from '../../utils/rules';\n\nimport { AlertStateTag } from './AlertStateTag';\n\ninterface Props {\n rule: CombinedRule;\n isDeleting: boolean;\n isCreating: boolean;\n}\n\nexport const RuleState: FC = ({ rule, isDeleting, isCreating }) => {\n const style = useStyles2(getStyle);\n const { promRule } = rule;\n\n // return how long the rule has been in its firing state, if any\n const forTime = useMemo(() => {\n if (\n promRule &&\n isAlertingRule(promRule) &&\n promRule.alerts?.length &&\n promRule.state !== PromAlertingRuleState.Inactive\n ) {\n // find earliest alert\n const firstActiveAt = getFirstActiveAt(promRule);\n\n // calculate time elapsed from earliest alert\n if (firstActiveAt) {\n return (\n \n for{' '}\n {intervalToAbbreviatedDurationString(\n {\n start: firstActiveAt,\n end: new Date(),\n },\n false\n )}\n \n );\n }\n }\n return null;\n }, [promRule, style]);\n\n if (isDeleting) {\n return (\n \n \n deleting\n \n );\n } else if (isCreating) {\n return (\n \n {' '}\n \n creating\n \n );\n } else if (promRule && isAlertingRule(promRule)) {\n return (\n \n \n {forTime}\n \n );\n } else if (promRule && isRecordingRule(promRule)) {\n return <>Recording rule;\n }\n return <>n/a;\n};\n\nconst getStyle = (theme: GrafanaTheme2) => ({\n for: css`\n font-size: ${theme.typography.bodySmall.fontSize};\n color: ${theme.colors.text.secondary};\n white-space: nowrap;\n padding-top: 2px;\n `,\n});\n","import { isEqual } from 'lodash';\nimport { useMemo, useRef } from 'react';\n\nimport {\n CombinedRule,\n CombinedRuleGroup,\n CombinedRuleNamespace,\n Rule,\n RuleGroup,\n RuleNamespace,\n RulesSource,\n} from 'app/types/unified-alerting';\nimport { RulerRuleDTO, RulerRuleGroupDTO, RulerRulesConfigDTO } from 'app/types/unified-alerting-dto';\n\nimport {\n getAllRulesSources,\n getRulesSourceByName,\n isCloudRulesSource,\n isGrafanaRulesSource,\n} from '../utils/datasource';\nimport { isAlertingRule, isAlertingRulerRule, isRecordingRulerRule } from '../utils/rules';\n\nimport { useUnifiedAlertingSelector } from './useUnifiedAlertingSelector';\n\ninterface CacheValue {\n promRules?: RuleNamespace[];\n rulerRules?: RulerRulesConfigDTO | null;\n result: CombinedRuleNamespace[];\n}\n\n// this little monster combines prometheus rules and ruler rules to produce a unified data structure\n// can limit to a single rules source\nexport function useCombinedRuleNamespaces(rulesSourceName?: string): CombinedRuleNamespace[] {\n const promRulesResponses = useUnifiedAlertingSelector((state) => state.promRules);\n const rulerRulesResponses = useUnifiedAlertingSelector((state) => state.rulerRules);\n\n // cache results per rules source, so we only recalculate those for which results have actually changed\n const cache = useRef>({});\n\n const rulesSources = useMemo((): RulesSource[] => {\n if (rulesSourceName) {\n const rulesSource = getRulesSourceByName(rulesSourceName);\n if (!rulesSource) {\n throw new Error(`Unknown rules source: ${rulesSourceName}`);\n }\n return [rulesSource];\n }\n return getAllRulesSources();\n }, [rulesSourceName]);\n\n return useMemo(\n () =>\n rulesSources\n .map((rulesSource): CombinedRuleNamespace[] => {\n const rulesSourceName = isCloudRulesSource(rulesSource) ? rulesSource.name : rulesSource;\n const promRules = promRulesResponses[rulesSourceName]?.result;\n const rulerRules = rulerRulesResponses[rulesSourceName]?.result;\n\n const cached = cache.current[rulesSourceName];\n if (cached && cached.promRules === promRules && cached.rulerRules === rulerRules) {\n return cached.result;\n }\n const namespaces: Record = {};\n\n // first get all the ruler rules in\n Object.entries(rulerRules || {}).forEach(([namespaceName, groups]) => {\n const namespace: CombinedRuleNamespace = {\n rulesSource,\n name: namespaceName,\n groups: [],\n };\n namespaces[namespaceName] = namespace;\n addRulerGroupsToCombinedNamespace(namespace, groups);\n });\n\n // then correlate with prometheus rules\n promRules?.forEach(({ name: namespaceName, groups }) => {\n const ns = (namespaces[namespaceName] = namespaces[namespaceName] || {\n rulesSource,\n name: namespaceName,\n groups: [],\n });\n\n addPromGroupsToCombinedNamespace(ns, groups);\n });\n\n const result = Object.values(namespaces);\n\n cache.current[rulesSourceName] = { promRules, rulerRules, result };\n return result;\n })\n .flat(),\n [promRulesResponses, rulerRulesResponses, rulesSources]\n );\n}\n\n// merge all groups in case of grafana managed, essentially treating namespaces (folders) as groups\nexport function flattenGrafanaManagedRules(namespaces: CombinedRuleNamespace[]) {\n return namespaces.map((namespace) => {\n const newNamespace: CombinedRuleNamespace = {\n ...namespace,\n groups: [],\n };\n\n // add default group with ungrouped rules\n newNamespace.groups.push({\n name: 'default',\n rules: sortRulesByName(namespace.groups.flatMap((group) => group.rules)),\n });\n\n return newNamespace;\n });\n}\n\nexport function sortRulesByName(rules: CombinedRule[]) {\n return rules.sort((a, b) => a.name.localeCompare(b.name));\n}\n\nfunction addRulerGroupsToCombinedNamespace(namespace: CombinedRuleNamespace, groups: RulerRuleGroupDTO[] = []): void {\n namespace.groups = groups.map((group) => {\n const combinedGroup: CombinedRuleGroup = {\n name: group.name,\n interval: group.interval,\n source_tenants: group.source_tenants,\n rules: [],\n };\n combinedGroup.rules = group.rules.map((rule) => rulerRuleToCombinedRule(rule, namespace, combinedGroup));\n return combinedGroup;\n });\n}\n\nfunction addPromGroupsToCombinedNamespace(namespace: CombinedRuleNamespace, groups: RuleGroup[]): void {\n const existingGroupsByName = new Map();\n namespace.groups.forEach((group) => existingGroupsByName.set(group.name, group));\n\n groups.forEach((group) => {\n let combinedGroup = existingGroupsByName.get(group.name);\n if (!combinedGroup) {\n combinedGroup = {\n name: group.name,\n rules: [],\n };\n namespace.groups.push(combinedGroup);\n existingGroupsByName.set(group.name, combinedGroup);\n }\n\n const combinedRulesByName = new Map();\n combinedGroup!.rules.forEach((r) => {\n // Prometheus rules do not have to be unique by name\n const existingRule = combinedRulesByName.get(r.name);\n existingRule ? existingRule.push(r) : combinedRulesByName.set(r.name, [r]);\n });\n\n (group.rules ?? []).forEach((rule) => {\n const existingRule = getExistingRuleInGroup(rule, combinedRulesByName, namespace.rulesSource);\n if (existingRule) {\n existingRule.promRule = rule;\n } else {\n combinedGroup!.rules.push(promRuleToCombinedRule(rule, namespace, combinedGroup!));\n }\n });\n });\n}\n\nfunction promRuleToCombinedRule(rule: Rule, namespace: CombinedRuleNamespace, group: CombinedRuleGroup): CombinedRule {\n return {\n name: rule.name,\n query: rule.query,\n labels: rule.labels || {},\n annotations: isAlertingRule(rule) ? rule.annotations || {} : {},\n promRule: rule,\n namespace: namespace,\n group,\n };\n}\n\nfunction rulerRuleToCombinedRule(\n rule: RulerRuleDTO,\n namespace: CombinedRuleNamespace,\n group: CombinedRuleGroup\n): CombinedRule {\n return isAlertingRulerRule(rule)\n ? {\n name: rule.alert,\n query: rule.expr,\n labels: rule.labels || {},\n annotations: rule.annotations || {},\n rulerRule: rule,\n namespace,\n group,\n }\n : isRecordingRulerRule(rule)\n ? {\n name: rule.record,\n query: rule.expr,\n labels: rule.labels || {},\n annotations: {},\n rulerRule: rule,\n namespace,\n group,\n }\n : {\n name: rule.grafana_alert.title,\n query: '',\n labels: rule.labels || {},\n annotations: rule.annotations || {},\n rulerRule: rule,\n namespace,\n group,\n };\n}\n\n// find existing rule in group that matches the given prom rule\nfunction getExistingRuleInGroup(\n rule: Rule,\n existingCombinedRulesMap: Map,\n rulesSource: RulesSource\n): CombinedRule | undefined {\n // Using Map of name-based rules is important performance optimization for the code below\n // Otherwise we would perform find method multiple times on (possibly) thousands of rules\n\n const nameMatchingRules = existingCombinedRulesMap.get(rule.name);\n if (!nameMatchingRules) {\n return undefined;\n }\n\n if (isGrafanaRulesSource(rulesSource)) {\n // assume grafana groups have only the one rule. check name anyway because paranoid\n return nameMatchingRules[0];\n }\n\n // try finding a rule that matches name, labels, annotations and query\n const strictlyMatchingRule = nameMatchingRules.find(\n (combinedRule) => !combinedRule.promRule && isCombinedRuleEqualToPromRule(combinedRule, rule, true)\n );\n if (strictlyMatchingRule) {\n return strictlyMatchingRule;\n }\n\n // if that fails, try finding a rule that only matches name, labels and annotations.\n // loki & prom can sometimes modify the query so it doesnt match, eg `2 > 1` becomes `1`\n const looselyMatchingRule = nameMatchingRules.find(\n (combinedRule) => !combinedRule.promRule && isCombinedRuleEqualToPromRule(combinedRule, rule, false)\n );\n if (looselyMatchingRule) {\n return looselyMatchingRule;\n }\n\n return undefined;\n}\n\nfunction isCombinedRuleEqualToPromRule(combinedRule: CombinedRule, rule: Rule, checkQuery = true): boolean {\n if (combinedRule.name === rule.name) {\n return isEqual(\n [checkQuery ? hashQuery(combinedRule.query) : '', combinedRule.labels, combinedRule.annotations],\n [checkQuery ? hashQuery(rule.query) : '', rule.labels || {}, isAlertingRule(rule) ? rule.annotations || {} : {}]\n );\n }\n return false;\n}\n\n// there can be slight differences in how prom & ruler render a query, this will hash them accounting for the differences\nfunction hashQuery(query: string) {\n // one of them might be wrapped in parens\n if (query.length > 1 && query[0] === '(' && query[query.length - 1] === ')') {\n query = query.slice(1, -1);\n }\n // whitespace could be added or removed\n query = query.replace(/\\s|\\n/g, '');\n // labels matchers can be reordered, so sort the enitre string, esentially comparing just the character counts\n return query.split('').sort().join('');\n}\n"],"names":["ProvisionedResource","ProvisioningAlert","resource","title","severity","ProvisioningBadge","text","color","MatcherFilter","className","onFilterChange","defaultQueryString","styles","useStyles2","getStyles","onSearchInputChanged","useMemo","debounce","e","logInfo","LogMessages","target","value","useEffect","cancel","searchIcon","name","Stack","gap","content","icon","size","I","placeholder","defaultValue","onChange","prefix","inputWidth","theme","css","spacing","StateHistory","alertId","textFilter","setTextFilter","useState","handleTextFilter","useCallback","event","currentTarget","loading","error","result","dispatch","useDispatch","history","useUnifiedAlertingSelector","state","managedAlertStateHistory","fetchGrafanaAnnotationsAction","useManagedAlertStateHistory","LoadingPlaceholder","Alert","message","columns","id","label","renderCell","renderStateCell","renderValueCell","renderTimestampCell","tables","Object","entries","items","map","item","LABELS_REGEX","stringifiedLabels","match","at","String","newState","replace","data","timestamp","updated","groupBy","groupStateByLabels","sort","filter","groupKey","startsWith","endsWith","includes","RegExp","slice","test","err","matchKey","tableItems","historyItem","tableGroupKey","DynamicTable","cols","Field","Label","Tooltip","Icon","Input","matches","evalMatches","LabelsWrapper","AlertLabel","labelKey","metric","AlertStateTag","TimestampStyle","dateTimeFormat","children","wrapper","RuleDetailsActionButtons","rule","rulesSource","style","group","isGrafanaRulerRule","rulerRule","grafana_alert","StateHistoryModal","showStateHistoryModal","showModal","setShowModal","Modal","isOpen","onDismiss","closeOnBackdropClick","closeOnEscape","hideStateHistoryModal","useStateHistoryModal","alertmanagerSourceName","isGrafanaRulesSource","getAlertmanagerByUid","jsonData","alertmanagerUid","hasExplorePermission","contextSrv","AccessControlAction","buttons","isFederated","isFederatedRuleGroup","isCloudRulesSource","push","button","variant","href","createExploreLink","query","annotations","Annotation","textUtil","dashboardUID","encodeURIComponent","panelId","makeRuleBasedSilenceLink","Fragment","Button","onClick","length","width","colors","border","medium","typography","sm","RuleDetailsAnnotations","props","key","annotationKey","RuleDetailsDataSources","dataSources","meta","info","logos","small","unique","reduce","ds","getDataSourceSrv","getInstanceSettings","datasourceUid","uid","ExpressionDatasourceUID","values","index","alt","dataSourceIcon","src","HighlightedQuery","language","expr","plugins","SlatePrism","onlyIn","node","type","getSyntax","prismLanguages","LogqlSyntax","PromqlSyntax","slateValue","makeValue","Expression","expression","Well","cx","well","DataSourceType","fontFamilyMonospace","RuleDetailsExpression","DetailsField","horizontal","exprRow","AlertInstanceStateFilter","onStateFilterChange","stateFilter","filterType","itemPerStateStats","getOptionComponent","Tag","toFixed","colorIndex","tag","grafanaOptions","GrafanaAlertState","component","promOptions","PromAlertingRuleState","capitalize","stateOptions","RadioButtonGroup","options","v","undefined","ShowMoreInstances","ruleViewPageLink","stats","footerRow","visibleItemsCount","totalItemsCount","RuleDetailsMatchingInstances","promRule","namespace","itemsDisplayLimit","Number","POSITIVE_INFINITY","pagination","queryString","setQueryString","alertState","setAlertState","filterKey","Math","floor","random","queryStringKey","stateFilterType","GRAFANA_RULES_SOURCE_NAME","alerts","isAlertingRule","alertInstanceLabel","alertInstanceState","filteredAlerts","matchers","parseMatchers","labels","labelsMatchMatchers","alert","mapStateWithReasonToBaseState","filterAlerts","sortAlerts","SortOrder","visibleInstances","countAllByState","countBy","hiddenItemsCount","createViewLink","location","pathname","search","flexRow","spaceBetween","rowChild","AlertInstancesTable","instances","RuleHealth","getStyle","health","lastError","warn","warning","RuleState","isDeleting","isCreating","forTime","firstActiveAt","getFirstActiveAt","for","intervalToAbbreviatedDurationString","start","end","Date","align","isRecordingRule","bodySmall","fontSize","secondary","useCombinedRuleNamespaces","rulesSourceName","promRulesResponses","promRules","rulerRulesResponses","rulerRules","cache","useRef","rulesSources","getRulesSourceByName","Error","getAllRulesSources","cached","current","namespaces","forEach","namespaceName","groups","combinedGroup","interval","source_tenants","rules","rulerRuleToCombinedRule","addRulerGroupsToCombinedNamespace","existingGroupsByName","Map","set","get","combinedRulesByName","r","existingRule","existingCombinedRulesMap","nameMatchingRules","strictlyMatchingRule","find","combinedRule","isCombinedRuleEqualToPromRule","looselyMatchingRule","getExistingRuleInGroup","promRuleToCombinedRule","addPromGroupsToCombinedNamespace","flat","flattenGrafanaManagedRules","newNamespace","flatMap","a","b","localeCompare","isAlertingRulerRule","isRecordingRulerRule","record","checkQuery","isEqual","hashQuery","split","join"],"sourceRoot":""}