/usr/share/grafana/public/build
{"version":3,"file":"3688.ec5e74c60569e9498687.js","mappings":"sMAgBO,MAAMA,KAAoB,QAAK,CAAC,CAAE,IAAKC,GAAa,mBAAAC,CAAmB,IAAa,CACzF,MAAMC,KAAY,MAAW,IAAS,EAChCC,KAAM,WAAQ,IACNH,GAAY,MAAM,EAE7B,CAACA,EAAW,CAAC,EAEhB,SACE,OAAC,OAAI,UAAWI,EAAO,eACrB,mBAAC,OAAI,UAAWF,EAAU,QACxB,mBAAC,OAAI,UAAWA,EAAU,eACvB,SAAAC,EAAI,WACH,OAAC,QAAK,UAAU,wBACd,mBAAC,IAAc,CAAC,MAAOA,EAAI,KAAM,EACnC,KAEA,oBACG,WAACF,MAAsB,OAAC,OAAI,UAAU,wBAAyB,SAAAE,EAAI,KAAK,EACxEF,MACC,OAAC,OAAI,UAAU,6BACZ,mBAAC,IAAsB,CAAC,OAAQE,EAAI,sBAAuB,EAC9D,GAEJ,EAEJ,EACF,EACF,CAEJ,CAAC,EAEDJ,EAAkB,YAAc,oBAEhC,MAAMK,EAAS,CACb,kBAAgB,OAAI,CAClB,UAAW,OACX,SAAU,MACZ,CAAC,CACH,C,0DCnDO,SAAS,EAAUC,EAAO,CAC/B,OAAOC,EAAc,KAAKD,CAAK,CACjC,CACA,MAAMC,EAAgB,aAMf,SAASC,EAASF,EAAO,CAC9B,OAAOG,EAAa,KAAKH,CAAK,CAChC,CACA,MAAMG,EAAe,gDAUd,SAASC,EAAaJ,EAAOK,EAAQ,CAC1C,GAAI,EAAUL,CAAK,EACjB,OAAO,OAAO,cAAc,OAAO,SAASA,EAAO,EAAE,CAAC,EAExD,MAAMM,EAAM,OAAO,WAAWN,CAAK,EAC7BO,EAAS,OAAOD,CAAG,EACzB,GAAIN,IAAUO,EACZ,MAAO,GAET,MAAMC,GAAcC,EAAyBT,CAAK,EAC5CU,GAAeD,EAAyBF,CAAM,EAIpD,MAHI,GAAAC,KAAgBE,IAGhBL,GAAQ,SAAW,IAMjB,CAAC,EAAUL,CAAK,GAAKU,GAAa,QAAU,IAAkBF,GAAY,WAAWE,GAAa,UAAU,EAAG,EAAc,CAAC,EAKtI,CACO,IAAIC,EAAkC,SAAUA,EAAoB,CACzE,OAAAA,EAAmB,UAAe,YAClCA,EAAmB,SAAc,WACjCA,EAAmB,iBAAsB,mBACzCA,EAAmB,eAAoB,iBAChCA,CACT,EAAE,CAAC,CAAC,EAOG,SAASC,EAAsBZ,EAAO,CAC3C,GAAII,EAAaJ,EAAO,CACtB,OAAQ,EACV,CAAC,EACC,OAEF,GAAI,EAAUA,CAAK,EACjB,OAAOW,EAAmB,iBAE5B,MAAML,EAAM,OAAO,WAAWN,CAAK,EACnC,OAAK,OAAO,SAASM,CAAG,EAGpBA,IAAQ,EACHK,EAAmB,UAErBA,EAAmB,eALjBA,EAAmB,QAM9B,CAMO,SAASE,EAAoBb,EAAOK,EAAQ,CACjD,MAAMS,EAAS,OAAO,WAAWd,CAAK,EAChCe,EAAeH,EAAsBZ,CAAK,EAChD,GAAIK,GAAQ,SAAW,GAAOU,GAAgBA,IAAiBJ,EAAmB,eAAiBI,EAAc,CAC/G,MAAMC,GAAmBD,GAAc,QAAQ,QAAS,EAAE,EAC1D,MAAM,IAAI,MAAM,+CAA+Cf,CAAK,WAAWgB,EAAgB,eAAeF,CAAM,EAAE,CACxH,CACA,OAAOA,CACT,CAQO,SAASG,EAAYjB,EAAO,CACjC,MAAMkB,EAAQlB,EAAM,MAAM,oCAAoC,EAC9D,GAAI,CAACkB,EACH,MAAM,IAAI,YAAY,mBAAmBlB,CAAK,EAAE,EAElD,MAAMmB,EAAOD,EAAM,CAAC,EACdE,EAAYF,EAAM,CAAC,EACzB,IAAIG,GAAWH,EAAM,CAAC,IAAM,OAAY,OAAO,SAASA,EAAM,CAAC,EAAG,EAAE,EAAI,EACxE,MAAMI,GAAMF,EAAU,QAAQ,GAAG,EACjCC,IAAYC,KAAQ,GAAKA,GAAM,EAAIF,EAAU,OAAS,EACtD,MAAMG,GAASH,EAAU,QAAQ,IAAK,EAAE,EACvC,QAAQ,MAAOI,KAEdH,IAAYG,GAAM,OACX,GACR,EAAE,QAAQ,MAAO,EAAE,EAEpB,OAAOD,GAAO,OAAS,EAAI,CACzB,KAAAJ,EACA,OAAAI,GACA,SAAAF,EACF,EAAI,CACF,KAAAF,EACA,OAAQ,IACR,SAAUE,GAAW,CACvB,CACF,CAOO,SAAS,GAAc,EAAGI,EAAG,CAClC,GAAI,IAAMA,EACR,MAAO,GAET,MAAMC,EAAKT,EAAY,CAAC,EAClBU,EAAKV,EAAYQ,CAAC,EAClBN,GAAOO,EAAG,OAAS,IAAM,GAAK,EACpC,OAAIA,EAAG,OAASC,EAAG,KACbD,EAAG,SAAW,KAAOC,EAAG,SAAW,IAC9B,EAEFR,GAELO,EAAG,WAAaC,EAAG,SACdD,EAAG,SAAWC,EAAG,SAAWR,GAAOO,EAAG,SAAWC,EAAG,SAAW,CAACR,GAAO,EAEzEO,EAAG,OAASC,EAAG,OAASR,GAAOO,EAAG,OAASC,EAAG,OAAS,CAACR,GAAO,CACxE,CAWO,SAAS,EAAuBnB,EAAO,CAC5C,KAAM,CACJ,MAAA4B,EACA,IAAAC,CACF,EAAIC,EAAyB9B,CAAK,EAC5BsB,EAAMtB,EAAM,QAAQ,GAAG,EAC7B,OAAIsB,IAAQ,IAAMA,EAAMM,GAASN,EAAMO,EAC9BA,EAAMD,EAERC,EAAMD,EAAQ,CACvB,CAWO,SAASnB,EAAyBT,EAAO,CAC9C,KAAM,CACJ,MAAA4B,EACA,IAAAC,CACF,EAAIC,EAAyB9B,CAAK,EAC5BuB,EAASvB,EAAM,UAAU4B,EAAOC,CAAG,EACnCP,GAAMC,EAAO,QAAQ,GAAG,EAC9B,OAAID,KAAQ,GACHC,EAEFA,EAAO,UAAU,EAAGD,EAAG,EAAIC,EAAO,UAAUD,GAAM,CAAC,CAC5D,CAaA,SAASQ,EAAyB9B,EAAO,CACvC,IAAI4B,EAAQ,EAIZ,IAHI5B,EAAM,CAAC,IAAM,KACf4B,IAEK5B,EAAM4B,CAAK,IAAM,KAAO5B,EAAM4B,CAAK,IAAM,KAC9CA,IAEF,IAAIC,EAAM7B,EAAM,YAAY,GAAG,EAO/B,IANI6B,IAAQ,KACVA,EAAM7B,EAAM,YAAY,GAAG,GAEzB6B,IAAQ,KACVA,EAAM7B,EAAM,SAENA,EAAM6B,EAAM,CAAC,IAAM,KAAO7B,EAAM6B,EAAM,CAAC,IAAM,MAAQA,EAAMD,GACjEC,IAEF,MAAO,CACL,MAAAD,EACA,IAAAC,CACF,CACF,CClOO,MAAME,EAAe,CAI1B,iBAAmB,GACnB,YAAY/B,EAAO,CACjB,GAAI,CAACE,EAASF,CAAK,EACjB,MAAM,IAAI,MAAM,2BAA2BA,CAAK,IAAI,EAEtD,KAAK,MAAQA,CACf,CAaA,SAAU,CACR,MAAMe,EAAeH,EAAsB,KAAK,KAAK,EAGrD,GAAIG,IAAiB,QAAaA,IAAiBJ,EAAmB,eACpE,OAAO,OAAO,WAAW,KAAK,KAAK,EAIrC,GAAI,EAAU,KAAK,KAAK,EACtB,OAAO,OAAO,KAAK,KAAK,EAI1B,MAAM,IAAI,MAAM,+CAA+C,KAAK,KAAK,WAAWI,CAAY,eAAe,OAAO,WAAW,KAAK,KAAK,CAAC,EAAE,CAChJ,CAKA,UAAW,CACT,OAAO,KAAK,KACd,CAKF,CAKO,SAASiB,EAAiBhC,EAAO,CAEtC,OAAOA,GAAS,OAAOA,GAAU,UAAYA,EAAM,kBAAoB,EACzE,CAMO,SAASiC,EAAiBjC,EAAO,CAEtC,GAAI,uBAAuB,OAAOA,CAAK,CAAC,EAAI,GAC1C,MAAM,IAAI,MAAM,0GAA0GA,CAAK,GAAG,EAEpI,GAAI,OAAO,MAAMA,CAAK,EACpB,MAAM,IAAI,MAAM,qBAAqB,EAEvC,GAAI,CAAC,OAAO,SAASA,CAAK,EACxB,MAAM,IAAI,MAAM,mBAAmBA,CAAK,EAAE,EAE5C,OAAO,IAAI+B,GAAe,OAAO/B,CAAK,CAAC,CACzC,CAOO,SAASkC,EAAsB,EAAGT,EAAG,CAC1C,OAAO,cAAc,EAAE,MAAOA,EAAE,KAAK,CACvC,CCxFO,SAASU,EAAoBnC,EAAO,CACzC,OAAO,IAAI+B,GAAe/B,CAAK,CACjC,CACO,SAASoC,GAAqBpC,EAAO,CAC1C,OAAO,UAAUA,CAAK,EAAI,OAAOA,CAAK,EAAI,OAAO,WAAWA,CAAK,CACnE,CCIO,SAASqC,EAAOC,EAAMC,EAAS,CACpC,OAAOC,EAAY,CACjB,GAAIF,CACN,EAAG,GAAIA,EAAMC,CAAO,CACtB,CAKA,SAASC,EAAYC,EAASC,EAAK1C,EAAOuC,EAAS,CACjD,OAAI,MAAM,QAAQvC,CAAK,EACduC,EAAQ,KAAKE,EAASC,EAAKC,EAAY3C,EAAOuC,CAAO,CAAC,EAE3DvC,GAAS,OAAOA,GAAU,UAAY,CAACgC,EAAiBhC,CAAK,EAGxDuC,EAAQ,KAAKE,EAASC,EAAKE,EAAa5C,EAAOuC,CAAO,CAAC,EAEzDA,EAAQ,KAAKE,EAASC,EAAK1C,CAAK,CACzC,CAKA,SAAS4C,EAAaC,EAAQN,EAAS,CACrC,UAAWG,KAAO,OAAO,KAAKG,CAAM,EAAG,CACrC,MAAM7C,EAAQwC,EAAYK,EAAQH,EAAKG,EAAOH,CAAG,EAAGH,CAAO,EACvDvC,IAAU,OACZ6C,EAAOH,CAAG,EAAI1C,EAEd,OAAO6C,EAAOH,CAAG,CAErB,CACA,OAAOG,CACT,CAKA,SAASF,EAAYG,EAAOP,EAAS,CACnC,QAASQ,EAAI,EAAGA,EAAID,EAAM,OAAQC,IAChCD,EAAMC,CAAC,EAAIP,EAAYM,EAAO,OAAOC,CAAC,EAAGD,EAAMC,CAAC,EAAGR,CAAO,EAE5D,OAAOO,CACT,CC/BO,SAASE,EAAMC,EAAMV,EAAS,CACnC,IAAIW,EAAc,UAAU,OAAS,GAAK,UAAU,CAAC,IAAM,OAAY,UAAU,CAAC,EAAIf,EAClFY,EAAI,EACR,MAAM/C,GAAQmD,GAAW,EACzB,OAAAC,GAAYpD,EAAK,EACjBqD,GAAiB,EACVd,EAAUF,EAAOrC,GAAOuC,CAAO,EAAIvC,GAC1C,SAASsD,IAAc,CACrB,GAAIL,EAAK,WAAWF,CAAC,IAAMQ,EAAkB,CAC3CR,IACAS,GAAe,EACf,MAAMX,GAAS,CAAC,EAChB,IAAIY,GAAU,GACd,KAAOV,EAAIE,EAAK,QAAUA,EAAK,WAAWF,CAAC,IAAMW,GAAkB,CAC5DD,GAIHA,GAAU,IAHVE,GAAS,EACTH,GAAe,GAIjB,MAAM5B,GAAQmB,EACRL,GAAMkB,GAAY,EACxB,GAAIlB,KAAQ,OAAW,CACrBmB,GAAuB,EACvB,MACF,CACAL,GAAe,EACfM,GAAS,EACT,MAAM9D,GAAQmD,GAAW,EACzB,GAAInD,KAAU,OAAW,CACvB+D,EAAyB,EACzB,MACF,CAGI,OAAO,UAAU,eAAe,KAAKlB,GAAQH,EAAG,GAAK,CAACsB,EAAYhE,GAAO6C,GAAOH,EAAG,CAAC,GAGtFuB,GAAkBvB,GAAKd,GAAQ,CAAC,EAElCiB,GAAOH,EAAG,EAAI1C,EAChB,CACA,OAAIiD,EAAK,WAAWF,CAAC,IAAMW,GACzBQ,GAA4B,EAE9BnB,IACOF,EACT,CACF,CACA,SAASsB,IAAa,CACpB,GAAIlB,EAAK,WAAWF,CAAC,IAAMqB,EAAoB,CAC7CrB,IACAS,GAAe,EACf,MAAMV,GAAQ,CAAC,EACf,IAAIW,GAAU,GACd,KAAOV,EAAIE,EAAK,QAAUA,EAAK,WAAWF,CAAC,IAAMsB,GAAoB,CAC9DZ,GAGHA,GAAU,GAFVE,GAAS,EAIX,MAAM3D,GAAQmD,GAAW,EACzBmB,GAAgBtE,EAAK,EACrB8C,GAAM,KAAK9C,EAAK,CAClB,CACA,OAAIiD,EAAK,WAAWF,CAAC,IAAMsB,GACzBE,GAA4B,EAE9BxB,IACOD,EACT,CACF,CACA,SAASK,IAAa,CACpBK,GAAe,EACf,MAAMxD,GAAQ4D,GAAY,GAAKY,GAAa,GAAKlB,GAAY,GAAKa,GAAW,GAAKM,GAAa,OAAQ,EAAI,GAAKA,GAAa,QAAS,EAAK,GAAKA,GAAa,OAAQ,IAAI,EACzK,OAAAjB,GAAe,EACRxD,EACT,CACA,SAASyE,GAAaC,GAAM1E,GAAO,CACjC,GAAIiD,EAAK,MAAMF,EAAGA,EAAI2B,GAAK,MAAM,IAAMA,GACrC,OAAA3B,GAAK2B,GAAK,OACH1E,EAEX,CACA,SAASwD,IAAiB,CACxB,KAAOmB,GAAa1B,EAAK,WAAWF,CAAC,CAAC,GACpCA,GAEJ,CACA,SAASa,IAAc,CACrB,GAAIX,EAAK,WAAWF,CAAC,IAAM6B,EAAiB,CAC1C7B,IACA,IAAI8B,GAAS,GACb,KAAO9B,EAAIE,EAAK,QAAUA,EAAK,WAAWF,CAAC,IAAM6B,GAAiB,CAChE,GAAI3B,EAAK,WAAWF,CAAC,IAAM+B,EAAe,CACxC,MAAMC,GAAO9B,EAAKF,EAAI,CAAC,EACjBiC,GAAaC,EAAiBF,EAAI,EACpCC,KAAe,QACjBH,IAAUG,GACVjC,KACSgC,KAAS,IACdG,EAAMjC,EAAK,WAAWF,EAAI,CAAC,CAAC,GAAKmC,EAAMjC,EAAK,WAAWF,EAAI,CAAC,CAAC,GAAKmC,EAAMjC,EAAK,WAAWF,EAAI,CAAC,CAAC,GAAKmC,EAAMjC,EAAK,WAAWF,EAAI,CAAC,CAAC,GACjI8B,IAAU,OAAO,aAAa,OAAO,SAAS5B,EAAK,MAAMF,EAAI,EAAGA,EAAI,CAAC,EAAG,EAAE,CAAC,EAC3EA,GAAK,GAELoC,GAA6BpC,CAAC,EAGhCqC,EAA4BrC,CAAC,CAEjC,MACMsC,GAAuBpC,EAAK,WAAWF,CAAC,CAAC,EAC3C8B,IAAU5B,EAAKF,CAAC,EAEhBuC,GAAsBrC,EAAKF,CAAC,CAAC,EAGjCA,GACF,CACA,OAAAwC,GAAkB,EAClBxC,IACO8B,EACT,CACF,CACA,SAASL,IAAe,CACtB,MAAM5C,GAAQmB,EAKd,GAJIE,EAAK,WAAWF,CAAC,IAAMyC,IACzBzC,IACA0C,GAAY7D,EAAK,GAEfqB,EAAK,WAAWF,CAAC,IAAM2C,EACzB3C,YACS4C,GAAe1C,EAAK,WAAWF,CAAC,CAAC,EAE1C,IADAA,IACO6C,GAAQ3C,EAAK,WAAWF,CAAC,CAAC,GAC/BA,IAGJ,GAAIE,EAAK,WAAWF,CAAC,IAAM8C,EAGzB,IAFA9C,IACA0C,GAAY7D,EAAK,EACVgE,GAAQ3C,EAAK,WAAWF,CAAC,CAAC,GAC/BA,IAGJ,GAAIE,EAAK,WAAWF,CAAC,IAAM+C,GAAkB7C,EAAK,WAAWF,CAAC,IAAMgD,EAMlE,IALAhD,KACIE,EAAK,WAAWF,CAAC,IAAMyC,GAAavC,EAAK,WAAWF,CAAC,IAAMiD,IAC7DjD,IAEF0C,GAAY7D,EAAK,EACVgE,GAAQ3C,EAAK,WAAWF,CAAC,CAAC,GAC/BA,IAGJ,GAAIA,EAAInB,GACN,OAAOsB,EAAYD,EAAK,MAAMrB,GAAOmB,CAAC,CAAC,CAE3C,CACA,SAASY,IAAW,CAClB,GAAIV,EAAK,WAAWF,CAAC,IAAMkD,EACzB,MAAM,IAAI,YAAY,kCAAkCC,GAAM,CAAC,EAAE,EAEnEnD,GACF,CACA,SAASe,IAAW,CAClB,GAAIb,EAAK,WAAWF,CAAC,IAAMoD,EACzB,MAAM,IAAI,YAAY,0CAA0CD,GAAM,CAAC,EAAE,EAE3EnD,GACF,CACA,SAASK,GAAYpD,GAAO,CAC1B,GAAIA,KAAU,OACZ,MAAM,IAAI,YAAY,uBAAuBkG,GAAM,CAAC,EAAE,CAE1D,CACA,SAAS5B,GAAgBtE,GAAO,CAC9B,GAAIA,KAAU,OACZ,MAAM,IAAI,YAAY,uBAAuBkG,GAAM,CAAC,EAAE,CAE1D,CACA,SAAS7C,IAAmB,CAC1B,GAAIN,EAAIE,EAAK,OACX,MAAM,IAAI,YAAY,yBAAyBiD,GAAM,CAAC,EAAE,CAE5D,CACA,SAAST,GAAY7D,GAAO,CAC1B,GAAI,CAACgE,GAAQ3C,EAAK,WAAWF,CAAC,CAAC,EAAG,CAChC,MAAMqD,GAAWnD,EAAK,MAAMrB,GAAOmB,CAAC,EACpC,MAAM,IAAI,YAAY,mBAAmBqD,EAAQ,wBAAwBF,GAAM,CAAC,EAAE,CACpF,CACF,CACA,SAASX,IAAoB,CAC3B,GAAItC,EAAK,WAAWF,CAAC,IAAM6B,EACzB,MAAM,IAAI,YAAY,8BAA8BsB,GAAM,CAAC,EAAE,CAEjE,CACA,SAASrC,IAAyB,CAChC,MAAM,IAAI,YAAY,8BAA8BqC,GAAM,CAAC,EAAE,CAC/D,CACA,SAASjC,GAAkBvB,GAAK2D,GAAK,CACnC,MAAM,IAAI,YAAY,kBAAkB3D,EAAG,6BAA6B2D,EAAG,EAAE,CAC/E,CACA,SAASnC,IAA8B,CACrC,MAAM,IAAI,YAAY,mDAAmDgC,GAAM,CAAC,EAAE,CACpF,CACA,SAAS3B,IAA8B,CACrC,MAAM,IAAI,YAAY,2CAA2C2B,GAAM,CAAC,EAAE,CAC5E,CACA,SAASZ,GAAsBP,GAAM,CACnC,MAAM,IAAI,YAAY,sBAAsBA,EAAI,KAAKsB,GAAI,CAAC,EAAE,CAC9D,CACA,SAASjB,EAA4BxD,GAAO,CAC1C,MAAM0E,GAAQrD,EAAK,MAAMrB,GAAOA,GAAQ,CAAC,EACzC,MAAM,IAAI,YAAY,6BAA6B0E,EAAK,KAAKD,GAAI,CAAC,EAAE,CACtE,CACA,SAAStC,GAA2B,CAClC,MAAM,IAAI,YAAY,mCAAmCsC,GAAI,CAAC,EAAE,CAClE,CACA,SAASlB,GAA6BvD,GAAO,CAC3C,MAAM0E,GAAQrD,EAAK,MAAMrB,GAAOA,GAAQ,CAAC,EACzC,MAAM,IAAI,YAAY,8BAA8B0E,EAAK,KAAKD,GAAI,CAAC,EAAE,CACvE,CAGA,SAASA,IAAM,CACb,MAAO,eAAetD,CAAC,EACzB,CACA,SAASwD,IAAM,CACb,OAAOxD,EAAIE,EAAK,OAAS,YAAYA,EAAKF,CAAC,CAAC,IAAM,0BACpD,CACA,SAASmD,IAAQ,CACf,MAAO,GAAGK,GAAI,CAAC,IAAIF,GAAI,CAAC,EAC1B,CACF,CACA,SAAS1B,GAAa6B,EAAM,CAC1B,OAAOA,IAASC,GAAaD,IAASE,GAAeF,IAASG,GAAWH,IAASI,CACpF,CACA,SAAS1B,EAAMsB,EAAM,CACnB,OAAOA,GAAQd,GAAYc,GAAQK,IAAYL,GAAQM,GAAkBN,GAAQO,GAAkBP,GAAQQ,GAAkBR,GAAQS,EACvI,CACA,SAASrB,GAAQY,EAAM,CACrB,OAAOA,GAAQd,GAAYc,GAAQK,EACrC,CACA,SAASlB,GAAea,EAAM,CAC5B,OAAOA,GAAQU,GAAWV,GAAQK,EACpC,CACO,SAASxB,GAAuBmB,EAAM,CAC3C,OAAOA,GAAQ,IAAQA,GAAQ,OACjC,CACO,SAASxC,EAAY,EAAGvC,EAAG,CAChC,OAAI,IAAMA,EACD,GAEL,MAAM,QAAQ,CAAC,GAAK,MAAM,QAAQA,CAAC,EAC9B,EAAE,SAAWA,EAAE,QAAU,EAAE,MAAM,CAAC0F,EAAMC,IAAUpD,EAAYmD,EAAM1F,EAAE2F,CAAK,CAAC,CAAC,EAElFC,EAAS,CAAC,GAAKA,EAAS5F,CAAC,EACd,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,OAAO,KAAK,CAAC,EAAG,GAAG,OAAO,KAAKA,CAAC,CAAC,CAAC,CAAC,EACpD,MAAMiB,GAAOsB,EAAY,EAAEtB,CAAG,EAAGjB,EAAEiB,CAAG,CAAC,CAAC,EAE/C,EACT,CACA,SAAS2E,EAASrH,EAAO,CACvB,OAAO,OAAOA,GAAU,UAAYA,IAAU,IAChD,CAGA,MAAMiF,EAAmB,CACvB,IAAK,IACL,KAAM,KACN,IAAK,IACL,EAAG,KACH,EAAG,KACH,EAAG;AAAA,EACH,EAAG,KACH,EAAG,GAEL,EACMH,EAAgB,GAChBvB,EAAmB,IACnBG,EAAmB,IACnBU,EAAqB,GACrBC,EAAqB,GACrBoC,EAAY,GACZC,EAAc,GACdC,EAAU,EACVC,EAAa,GACbhC,EAAkB,GAClBoB,EAAW,GACXR,EAAY,GACZE,EAAW,GACXwB,EAAU,GACVL,GAAW,GACXZ,EAAY,GACZJ,EAAU,GACVM,EAAY,GACLW,EAAiB,GACjBE,EAAiB,GACjBjB,EAAiB,GACjBD,EAAiB,IACjBiB,EAAiB,GACjBE,GAAiB,IClSvB,SAASK,GAAUtH,EAAOuH,EAAUC,EAAOC,EAAoB,CACpE,MAAMC,GAAgBC,GAAaH,CAAK,EAClCI,GAAgB,OAAOL,GAAa,WAAaA,EAAS,KAAK,CACnE,GAAIvH,CACN,EAAG,GAAIA,CAAK,EAAIA,EAChB,OAAO6H,GAAeD,GAAe,EAAE,EAKvC,SAASC,GAAe7H,GAAO8H,GAAQ,CACrC,GAAI,MAAM,QAAQL,CAAkB,EAAG,CACrC,MAAMM,GAAcN,EAAmB,KAAKN,IAAQA,GAAK,KAAKnH,EAAK,CAAC,EACpE,GAAI+H,GAAa,CACf,MAAMC,GAAMD,GAAY,UAAU/H,EAAK,EACvC,GAAI,OAAOgI,IAAQ,UAAY,CAAC9H,EAAS8H,EAAG,EAC1C,MAAM,IAAI,MAAM,0GAA0GA,EAAG,GAAG,EAElI,OAAOA,EACT,CACF,CAGA,GAAI,OAAOhI,IAAU,WAAa,OAAOA,IAAU,UAAY,OAAOA,IAAU,UAAYA,KAAU,MAAQA,cAAiB,MAAQA,cAAiB,SAAWA,cAAiB,QAAUA,cAAiB,OAC7M,OAAO,KAAK,UAAUA,EAAK,EAU7B,GALIA,IAAO,kBAKP,OAAOA,IAAU,SACnB,OAAOA,GAAM,SAAS,EAIxB,GAAI,MAAM,QAAQA,EAAK,EACrB,OAAOiI,GAAejI,GAAO8H,EAAM,EAIrC,GAAI9H,IAAS,OAAOA,IAAU,SAC5B,OAAOkI,GAAgBlI,GAAO8H,EAAM,CAGxC,CAKA,SAASG,GAAenF,GAAOgF,GAAQ,CACrC,GAAIhF,GAAM,SAAW,EACnB,MAAO,KAET,MAAMqF,GAAcT,GAAgBI,GAASJ,GAAgB,OAC7D,IAAIM,GAAMN,GAAgB;AAAA,EAAQ,IAClC,QAAS3E,GAAI,EAAGA,GAAID,GAAM,OAAQC,KAAK,CACrC,MAAMoE,GAAO,OAAOI,GAAa,WAAaA,EAAS,KAAKzE,GAAO,OAAOC,EAAC,EAAGD,GAAMC,EAAC,CAAC,EAAID,GAAMC,EAAC,EAC7F2E,KACFM,IAAOG,IAEL,OAAOhB,GAAS,KAAe,OAAOA,IAAS,WACjDa,IAAOH,GAAeV,GAAMgB,EAAW,EAEvCH,IAAO,OAELjF,GAAID,GAAM,OAAS,IACrBkF,IAAON,GAAgB;AAAA,EAAQ,IAEnC,CACA,OAAAM,IAAON,GAAgB;AAAA,EAAKI,EAAM,IAAM,IACjCE,EACT,CAKA,SAASE,GAAgBrF,GAAQiF,GAAQ,CACvC,GAAI,OAAOjF,GAAO,QAAW,WAC3B,OAAOyE,GAAUzE,GAAO,OAAO,EAAG0E,EAAUC,EAAO,MAAS,EAE9D,MAAMY,GAAO,MAAM,QAAQb,CAAQ,EAAIA,EAAS,IAAI,MAAM,EAAI,OAAO,KAAK1E,EAAM,EAChF,GAAIuF,GAAK,SAAW,EAClB,MAAO,KAET,MAAMD,GAAcT,GAAgBI,GAASJ,GAAgB,OAC7D,IAAIW,GAAQ,GACRL,GAAMN,GAAgB;AAAA,EAAQ,IAClC,UAAWhF,MAAO0F,GAAM,CACtB,MAAMpI,GAAQ,OAAOuH,GAAa,WAAaA,EAAS,KAAK1E,GAAQH,GAAKG,GAAOH,EAAG,CAAC,EAAIG,GAAOH,EAAG,EACnG,GAAI4F,GAAgB5F,GAAK1C,EAAK,EAAG,CAC3BqI,GACFA,GAAQ,GAERL,IAAON,GAAgB;AAAA,EAAQ,IAEjC,MAAMa,GAAS,KAAK,UAAU7F,EAAG,EACjCsF,IAAON,GAAgB,GAAGS,GAAcI,EAAM,KAAO,GAAGA,EAAM,IAC9DP,IAAOH,GAAe7H,GAAOmI,EAAW,CAC1C,CACF,CACA,OAAAH,IAAON,GAAgB;AAAA,EAAKI,EAAM,IAAM,IACjCE,EACT,CAKA,SAASM,GAAgBE,GAAMxI,GAAO,CACpC,OAAO,OAAOA,GAAU,KAAe,OAAOA,IAAU,YAAc,OAAOA,IAAU,QACzF,CACF,CAMA,SAAS2H,GAAaH,EAAO,CAC3B,GAAI,OAAOA,GAAU,SACnB,MAAO,IAAI,OAAOA,CAAK,EAEzB,GAAI,OAAOA,GAAU,UAAYA,IAAU,GACzC,OAAOA,CAGX,C,0RCpGA,MAAMiB,KAAY,WAAYC,IACrB,CACL,aAAW,OAAI,CACb,OAAQ,aAAaA,EAAM,OAAO,KAAK,SAAS,GAChD,MAAOA,EAAM,OAAO,KAAK,UACzB,aAAcA,EAAM,MAAM,OAAO,OACjC,SAAUA,EAAM,QAAQ,CAAC,EACzB,WAAYA,EAAM,QAAQ,IAAI,EAC9B,OAAQA,EAAM,QAAQ,GAAG,EACzB,MAAOA,EAAM,QAAQ,GAAG,EACxB,QAAS,OACT,eAAgB,SAChB,cAAe,SACf,WAAYA,EAAM,QAAQ,CAAC,CAC7B,CAAC,EACD,gBAAc,OAAI,CAChB,MAAO,eACP,UAAW,WACb,CAAC,EACD,cAAY,OAAI,CACd,aAAc,CACZ,IAAK,EACL,MAAOA,EAAM,OAAO,KAAK,UACzB,QAAS,EACT,eAAgB,SAChB,aAAcA,EAAM,MAAM,OAAO,OACjC,OAAQA,EAAM,QAAQA,EAAM,WAAW,OAAO,EAAE,EAChD,MAAOA,EAAM,QAAQA,EAAM,WAAW,OAAO,EAAE,EAC/C,IAAK,CACH,OAAQ,CACV,EAEA,aAAc,CACZ,IAAK,OACL,WAAY,CACV,MAAOA,EAAM,OAAO,QAAQ,IAC9B,CACF,CACF,CACF,CAAC,EACD,uBAAqB,OAAI,CACvB,WAAYA,EAAM,QAAQ,CAAC,CAC7B,CAAC,EACD,YAAU,OAAI,CACZ,MAAO,WACP,WAAY,UACd,CAAC,EACD,mBAAiB,OAAI,CACnB,QAAS,KAAKA,EAAM,QAAQ,CAAC,CAAC,EAChC,CAAC,EACD,mBAAiB,OAAI,CACnB,QAAS,OACT,WAAY,SACZ,WAAY,OAEZ,0BAA2B,CACzB,WAAY,QACd,EACA,UAAW,CACT,0BAA2B,CACzB,WAAY,SACd,CACF,CACF,CAAC,EACD,aAAW,OAAI,CACb,QAAS,OACT,cAAe,MACf,IAAKA,EAAM,QAAQ,EAAG,EACtB,WAAYA,EAAM,QAAQ,EAAG,CAC/B,CAAC,CACH,EACD,EAED,MAAMC,UAA8B,eAA4B,CAAhE,kCACE,WAAe,CACb,gBAAiB,GACjB,WAAY,EACZ,WAAY,IACd,EAQA,eAAY,IAAM,CAChB,KAAM,CAAE,iBAAkBC,EAA0B,WAAAC,EAAY,IAAAC,CAAI,EAAI,KAAK,MACzEF,GACFA,EAAyBC,EAAW,CAAC,CAAC,KAGxC,OAAkB,wDAAyD,CACzE,eAAgBC,EAAI,eACpB,UAAWA,EAAI,IACf,KAAM,QACR,CAAC,CACH,EAEA,eAAY,IAAM,CAChB,KAAM,CAAE,iBAAkBC,EAA0B,WAAAF,EAAY,IAAAC,CAAI,EAAI,KAAK,MACzEC,GACFA,EAAyBF,EAAW,CAAC,CAAC,KAGxC,OAAkB,wDAAyD,CACzE,eAAgBC,EAAI,eACpB,UAAWA,EAAI,IACf,KAAM,SACR,CAAC,CACH,EAEA,yBAAsB,SAAY,CAChC,KAAM,CAAE,oBAAAE,EAAqB,WAAAH,EAAY,aAAAI,EAAc,IAAAH,CAAI,EAAI,KAAK,MACpE,OAAIE,EACK,MAAMA,EAAoBH,EAAW,CAAC,EAAGI,EAAa,CAAC,EAAGH,EAAI,WAAW,KAAK,EAEhF,EACT,EAEA,iBAAc,IAAM,CAClB,KAAM,CAAE,mBAAAI,EAAoB,WAAAL,EAAY,aAAAI,EAAc,IAAAH,CAAI,EAAI,KAAK,MAC/DI,GACFA,EAAmBL,EAAW,CAAC,EAAGI,EAAa,CAAC,KAAG,OAA2BH,CAAG,GAAK,MAAS,KAGjG,OAAkB,kDAAmD,CACnE,eAAgBA,EAAI,eACpB,WAAY,UACZ,UAAWA,EAAI,GACjB,CAAC,CACH,EAEA,oBAAiB,IAAM,CACrB,KAAM,CAAE,sBAAAK,EAAuB,WAAAN,EAAY,aAAAI,EAAc,IAAAH,CAAI,EAAI,KAAK,MAClEK,GACFA,EAAsBN,EAAW,CAAC,EAAGI,EAAa,CAAC,KAAG,OAA2BH,CAAG,GAAK,MAAS,KAGpG,OAAkB,kDAAmD,CACnE,eAAgBA,EAAI,eACpB,WAAY,UACZ,UAAWA,EAAI,GACjB,CAAC,CACH,EAEA,iBAAc,IAAM,CAClB,KAAM,CAAE,SAAAM,CAAS,EAAI,KAAK,MACpBC,EAAaD,EAAS,EACtBE,EAAaD,EAAaA,EAAW,OAAO,CAACE,EAAKC,IAASD,EAAMC,EAAK,MAAO,CAAC,EAAI,GACpF,IAAC,WAAQ,KAAK,MAAM,WAAYH,CAAU,GAAKC,IAAe,KAAK,MAAM,aAC3E,KAAK,SAAS,CAAE,WAAAD,EAAY,WAAAC,CAAW,CAAC,CAE5C,EAEA,eAAY,IAAM,CAChB,KAAM,CAAE,QAAAG,EAAS,IAAAX,EAAK,IAAAY,CAAI,EAAI,KAAK,MAC7B,CAAE,gBAAAC,CAAgB,EAAI,KAAK,MAC5BA,GACH,KAAK,YAAY,EAEnB,KAAK,kBAAkB,KAEvB,OAAkB,iDAAkD,CAClE,eAAgBb,EAAI,eACpB,UAAWW,EAAU,QAAU,gBAC/B,KAAME,EAAkB,QAAU,OAClC,UAAWb,EAAI,IACf,IAAAY,CACF,CAAC,CACH,EA1FA,oBAAqB,CACf,KAAK,MAAM,iBACb,KAAK,YAAY,CAErB,CAwFA,mBAAoB,CAClB,KAAK,SAAUE,IACN,CACL,gBAAiB,CAACA,EAAM,eAC1B,EACD,CACH,CAEA,wBAAwBC,EAAa,CACnC,KAAM,CAAE,MAAAnB,CAAM,EAAI,KAAK,MACjB3I,EAAS0I,EAAUC,CAAK,EAE9B,SACE,OAAC,OAAI,UAAW,0BAA0B3I,EAAO,UAAU,GACzD,mBAAC+J,EAAA,GACC,QAAS,IAAMD,EACf,gBAAY,KAAE,+DAAgE,yBAAyB,EACvG,KAAK,OACL,QAAQ,YACR,KAAK,OACL,KAAK,KACP,EACF,CAEJ,CAEA,iBAAiB7J,EAAiB+J,EAAoB,CACpD,SACE,OAAC,SACC,mBAAC,SACE,SAAA/J,GAAO,IAAI,CAAC6J,EAAK9G,OAEd,OAAC,MACC,oBAAC,MACE,UAAA8G,EACAE,GAAYF,IAAQ,IAAM,KAAK,wBAAwBA,CAAG,GAC7D,GAJO,GAAGA,CAAG,IAAI9G,CAAC,EAKpB,CAEH,EACH,EACF,CAEJ,CAEA,QAAS,CACP,KAAM,CACJ,MAAA2F,EACA,WAAAG,EACA,aAAAI,EACA,QAAAQ,EACA,MAAAO,EACA,gBAAAC,EACA,eAAAC,EACA,mBAAAhB,EACA,sBAAAC,EACA,eAAAgB,EACA,IAAArB,EACA,IAAAY,EACA,UAAAU,EACA,0BAAAC,CACF,EAAI,KAAK,MACH,CAAE,gBAAAV,GAAiB,WAAAN,EAAY,WAAAC,CAAW,EAAI,KAAK,MACnDvJ,EAAS0I,EAAUC,CAAK,EACxB4B,KAAYC,EAAA,GAAgB7B,CAAK,EACjC8B,EAAY3B,GAAc,KAAO,GAAQA,EAAW,SAAW,EAC/D4B,EAAYxB,GAAgB,KAAO,GAAQA,EAAa,SAAW,EACnEyB,EAA4B,CAACP,GAAkBjB,GAAsBC,EACrEwB,EAAejB,IAAQ,KAAQ,SAAWZ,EAAI,WAAW,MAAQ,aAAaA,EAAI,WAAW,KAAK,GAAK,GACvG8B,GAAYJ,KAAY,MAAoB3B,EAAW,CAAC,EAAGC,CAAG,EAAI,KAElE+B,GACJ,CAACJ,GAAaxB,GAAgB,MAAQ,CAACA,EAAa,MAAOY,GAAQA,IAAQ,EAAE,EAEzEiB,GACJb,GAAmBpB,GAAc,MAAQoB,EAAgB,SAASpB,EAAW,CAAC,CAAC,KAC7E,OAACkC,EAAA,GACC,QAAQ,UACR,WAAS,KAAE,6EAA8E,iBAAiB,EAC1G,KAAK,MACL,QAAS,KAAK,UAChB,KAEA,OAACA,EAAA,GACC,WAAS,KACP,mFACA,wCACF,EACA,KAAK,MACL,QAAS,KAAK,UAChB,EAGJ,SACE,oBACE,qBAAC,MAAG,UAAWT,EAAU,gBACvB,oBAAC,MAAG,UAAWA,EAAU,gBACvB,oBAAC,OAAI,UAAWvK,EAAO,UACpB,UAAA2K,MACC,oBACE,oBAACM,GAAA,CACC,KAAK,cACL,QAAS,KAAK,YAEd,SAAU,IAAM,KAAK,oBAAoB,EACzC,cAAeL,CAAA,CACjB,KACA,OAACI,EAAA,GACC,KAAK,eACL,QACErB,IAAQ,KAAQ,SAAWZ,EAAI,WAAW,SACtC,KAAE,kDAAmD,sCAAuC,CAC1F,MAAOA,EAAI,WAAW,KACxB,CAAC,KACD,KAAE,4CAA6C,kBAAkB,EAEvE,QAAS,KAAK,eAChB,GACF,EAED,CAACqB,GAAkBF,GAAmBa,GACtC,CAACX,MACA,OAACY,EAAA,GACC,QAASpB,GAAkB,UAAY,YACvC,KAAK,SACL,WAAS,KAAE,0DAA2D,mBAAmB,EACzF,UAAU,eACV,SAAU,CAACa,EACX,QAAS,KAAK,UAChB,GAEJ,EACF,KAEA,OAAC,MAAI,SAAAI,OAAa,OAACK,EAAA,CAAe,KAAML,GAAW,OAAA7K,CAAA,CAAgB,EAAG,KAEtE,OAAC,MAAG,UAAWuK,EAAU,gBAAkB,SAAAE,EAAY3B,EAAW,CAAC,EAAI,KAAK,iBAAiBA,CAAU,EAAE,KACzG,OAAC,MAAG,aAAW,MAAG9I,EAAO,aAAcmK,GAAkBnK,EAAO,QAAQ,EACtE,oBAAC,OAAI,UAAWA,EAAO,gBACpB,UAAA0K,EAAYxB,EAAa,CAAC,EAAI,KAAK,iBAAiBA,EAAc,EAAI,EACtEwB,GAAa,KAAK,wBAAwBxB,EAAa,CAAC,CAAC,KAC1D,OAAC,OAAI,aAAW,OAAIwB,GAAaI,KAAoC9K,EAAO,mBAAmB,EAC5F,SAAAiK,GAAO,IAAI,CAACkB,EAAMnI,IAAM,CACvB,GAAImI,EAAK,SAAWd,EAAW,CAC7B,MAAMe,EAAkBD,EAAK,QAC7BA,EAAK,QAAU,CAACE,EAAGC,KAAW,CAE5BjB,EAAUtB,EAAK,EAAK,EAGpBqC,EAAgBC,EAAGC,EAAM,CAC3B,CACF,CACA,SACE,OAAC,QACC,mBAACC,EAAA,GACC,YAAa,CAEX,QACE,OAAOjB,GAA8B,UAAYa,EAAK,QAClDb,EACA,OACN,QAAS,YACT,KAAM,UACN,GAAIa,EAAK,MAAQ,CAAE,KAAMA,EAAK,IAAK,CACrC,EACA,KAAAA,CAAA,CACF,GAbS,GAAGA,EAAK,KAAK,IAAInI,CAAC,EAc7B,CAEJ,CAAC,EACH,GACF,EACF,GACF,EACC4G,IAAmBa,GAAaC,MAC/B,QAAC,MACC,oBAAC,MAAG,QAAS,EACX,mBAACM,EAAA,GACC,QAASpB,GAAkB,UAAY,YACvC,KAAK,SACL,WAAS,KAAE,+DAAgE,wBAAwB,EACnG,QAAS,KAAK,UAChB,EACF,KACA,OAAC,MAAG,QAAS,EACX,mBAAC,OAAI,UAAW5J,EAAO,gBACrB,mBAACwL,EAAA,GACC,MAAOlC,EACP,MAAOR,EAAW,CAAC,EACnB,MAAOI,EAAa,CAAC,EACrB,SAAUK,EACV,QAAAG,CAAA,CACF,EACF,EACF,GACF,GAEJ,CAEJ,CACF,CAEA,SAASwB,EAAe,CAAE,KAAAO,EAAM,OAAAzL,CAAO,EAA2D,CAChG,SACE,OAAC0L,EAAA,EAAO,CAAC,QAASD,EAChB,mBAAC,OAAI,UAAWzL,EAAO,UACrB,mBAAC,QAAM,SAAAyL,EAAK,UAAU,EAAG,CAAC,EAAE,EAC9B,EACF,CAEJ,CAQA,MAAMR,GAAkB,CAAC,CAAE,SAAAU,EAAU,cAAAC,EAAe,GAAGC,CAAK,IAA4B,CACtF,KAAM,CAACC,EAAQC,CAAS,KAAI,YAAS,EAAK,EACpCC,EAAUF,EAAS,gBAAkB,mBAE3C,sBAAU,IAAM,CACdH,EAAS,EAAE,KAAKI,CAAS,CAC3B,EAAG,CAACJ,CAAQ,CAAC,KAEN,OAACX,EAAA,EAAU,CAAE,GAAGa,EAAM,QAASC,EAAS,UAAY,OAAW,QAASE,EAAUJ,CAAA,CAAe,CAC1G,EAEaK,KAAgB,MAAWrD,CAAqB,EAC7DqD,EAAc,YAAc,gB,gBC7ZrB,MAAMC,GAA8B,CAACnD,EAAkBoD,IAAyB,CAErF,MAAMzJ,KAAoD,WAAQ,KACzD,CACL,WAAY,OAAO,YAAY,OAAO,QAAQqG,EAAI,MAAM,EAAE,IAAI,CAAC,CAACpG,EAAK1C,CAAK,IAAM,CAAC0C,EAAK,CAAC1C,CAAK,CAAC,CAAC,CAAC,EAC/F,UAAW,CAAE,KAAMkM,EAAU,KAAK,QAAQ,EAAG,GAAIA,EAAU,GAAG,QAAQ,CAAE,EACxE,WAAY,CACV,KAAMpD,EAAI,gBAAkB,GAC5B,IAAKA,EAAI,eAAiB,EAC5B,CACF,GACC,CAACA,EAAI,OAAQA,EAAI,eAAgBA,EAAI,cAAeoD,CAAS,CAAC,EAE3D,CAAE,MAAAlC,CAAM,KAAImC,EAAA,GAAe,CAC/B,iBAAkB,KAAsB,2BACxC,eAAgB,GAChB,QAAA1J,CACF,CAAC,EAED,SAAO,WAAQ,IACNuH,EAAM,OAA4C,CAACoC,EAAKlB,IAAS,CACtE,GAAIA,EAAK,SAAU,CACjB,MAAMmB,EAA+B,CACnC,KAAMnB,EAAK,MAAQ,GACnB,OAAQ,SACR,OAAQ,OACR,MAAOA,EAAK,MACZ,QAASA,EAAK,QACd,KAAMA,EAAK,IACb,EAEIkB,EAAIlB,EAAK,QAAQ,EACnBkB,EAAIlB,EAAK,QAAQ,EAAE,KAAKmB,CAAS,EAEjCD,EAAIlB,EAAK,QAAQ,EAAI,CAACmB,CAAS,CAEnC,CACA,OAAOD,CACT,EAAG,CAAC,CAAC,EACJ,CAACpC,CAAK,CAAC,CACZ,EAEMsC,GAAgCC,GAA0C,CAC9E,SAASC,EAAmBC,EAAc,CACxC,MAAMC,EAAaT,GAA4BQ,EAAM,IAAKA,EAAM,SAAS,EACzE,SAAO,OAACF,EAAA,CAAW,GAAGE,EAAO,MAAOC,CAAA,CAAY,CAClD,CAEA,OAAOF,CACT,EAEA,MAAMG,UAA2B,eAAqB,CACpD,QAAS,CACP,KAAM,CACJ,IAAAjD,EACA,IAAAZ,EACA,MAAAJ,EACA,SAAAkE,EACA,sBAAAzD,EACA,mBAAAD,EACA,QAAA2D,EACA,eAAAC,EACA,UAAAC,EACA,iBAAAC,EACA,iBAAAC,EACA,gBAAAhD,EACA,cAAAiD,EACA,eAAAhD,EACA,UAAAE,GACA,OAAArK,EACA,0BAAAsK,EACA,MAAAL,CACF,EAAI,KAAK,MACHmD,KAAc,KAAkBzE,EAAOI,EAAI,QAAQ,EACnDsE,EAAStE,EAAI,OAASA,EAAI,OAAS,CAAC,EACpCuE,EAAkB,OAAO,KAAKD,CAAM,EAAE,OAAS,EAC/CE,KAAiB,OAAaxE,EAAKoE,CAAa,EACtD,IAAIK,EAAkBD,EAAe,OAAQE,IAAMA,GAAE,OAAO,MAAM,EAClE,MAAMC,GAA2BF,EAAgB,OAAQC,IAAMA,GAAE,aAAe1E,EAAI,eAAe,EAAE,KAAK,EACpG4E,GAAwBH,EAAgB,OAAQC,IAAMA,GAAE,aAAe1E,EAAI,eAAe,EAAE,KAAK,EACjG6E,MAAiC,OAAmBD,EAAqB,EACzEE,EACHH,IAA4BA,GAAyB,OAAS,GAC9DE,IAAkCA,GAA+B,OAAS,EAEvEE,EACJ/E,EAAI,UAAU,MAAM,OAAS,IAAc,SAEvC,CAAC,EAEDwE,EAAe,OAAQE,IAAMA,GAAE,OAAO,SAAW,GAAKA,GAAE,aAAe1E,EAAI,eAAe,EAAE,KAAK,EACjGgF,EAAkBD,GAAUA,EAAO,OAAS,EAG5CE,EAAiBnB,EACnB,GACA,GAAGO,EAAY,iBAAiB,IAAIpN,EAAO,YAAY,IAAIA,EAAO,mBAAmB,GAEzF,SACE,QAAC,MAAG,aAAW,MAAGgN,EAAWhN,EAAO,UAAU,EAC3C,UAAA+M,MAAkB,OAAC,OAAG,KACvB,OAAC,MAAG,UAAWiB,EAAgB,gBAAY,KAAE,kDAAmD,WAAW,EAAG,KAC9G,OAAC,MAAG,QAAS,EACX,mBAAC,OAAI,UAAWhO,EAAO,oBACrB,mBAAC,SAAM,UAAWA,EAAO,gBACvB,oBAAC,SACE,UAAAkK,GAAmBA,EAAgB,OAAS,MAC3C,oBACE,oBAAC,MACC,mBAAC,MACC,QAAS,IACT,UAAWlK,EAAO,kBAClB,gBAAY,KAAE,6CAA8C,UAAU,EAEtE,mBAAC,KAAK,CAAC,QAAQ,4BAA4B,oBAAQ,EACrD,EACF,KACA,OAACiO,GAAA,GACC,iBAAAhB,EACA,iBAAAC,EACA,IAAAnE,EACA,IAAAY,EACA,gBAAAO,EACA,eAAgB,GAChB,MAAAvB,CAAA,CACF,GACF,GAEA2E,GAAmBS,OACnB,OAAC,MACC,mBAAC,MACC,QAAS,IACT,UAAW/N,EAAO,kBAClB,gBAAY,KAAE,+CAAgD,QAAQ,EAEtE,mBAAC,KAAK,CAAC,QAAQ,0BAA0B,kBAAM,EACjD,EACF,EAED,OAAO,KAAKqN,CAAM,EAChB,KAAK,EACL,IAAI,CAAC1K,GAAKK,KAAM,CACf,MAAM/C,GAAQoN,EAAO1K,EAAG,EACxB,SACE,OAACsJ,EAAA,CAEC,WAAY,CAACtJ,EAAG,EAChB,aAAc,CAAC1C,EAAK,EACpB,QAAS,GACT,SAAU,OAAM,MAAwB6M,EAAQ,EAAGnK,EAAG,EACtD,sBAAAyG,EACA,mBAAAD,EACA,iBAAA8D,EACA,iBAAAC,EACA,IAAAnE,EACA,IAAAY,EACA,eAAAQ,EACA,gBAAAD,EACA,eAAgB,GAChB,oBAAqB,KAAK,MAAM,oBAChC,MAAOD,IAAQtH,EAAG,GAfb,GAAGA,EAAG,IAAI1C,EAAK,IAAI+C,EAAC,EAgB3B,CAEJ,CAAC,EACF8K,EAAO,IAAI,CAACI,GAAOlL,KAAM,CACxB,KAAM,CAAE,KAAAqF,GAAM,OAAA8F,GAAQ,WAAAC,EAAW,EAAIF,GACrC,SACE,OAACjC,EAAA,CAEC,WAAY5D,GACZ,aAAc8F,GACd,iBAAAlB,EACA,iBAAAC,EACA,sBAAA9D,EACA,mBAAAD,EACA,SAAU,OAAM,MAAeJ,EAAI,UAAU,OAAOqF,EAAU,EAAE,MAAM,EACtE,gBAAAlE,EACA,eAAAC,EACA,IAAApB,EACA,IAAAY,EACA,eAAgB,GAChB,oBAAqB,KAAK,MAAM,qBAb3B,GAAGtB,GAAK,CAAC,CAAC,IAAI8F,GAAO,CAAC,CAAC,IAAInL,EAAC,EAcnC,CAEJ,CAAC,EAEA6K,MACC,OAAC,MACC,mBAAC,MACC,QAAS,IACT,UAAW7N,EAAO,kBAClB,gBAAY,KAAE,mDAAoD,YAAY,EAE9E,mBAAC,KAAK,CAAC,QAAQ,yBAAyB,iBAAK,EAC/C,EACF,EAED0N,GAAyB,IAAI,CAACQ,GAAOlL,KAAM,CAC1C,KAAM,CAAE,KAAAqF,GAAM,OAAA8F,GAAQ,MAAAlE,GAAO,WAAAmE,EAAW,EAAIF,GAC5C,SACE,OAACjC,EAAA,CAEC,WAAY5D,GACZ,aAAc8F,GACd,MAAOlE,GACP,iBAAAgD,EACA,iBAAAC,EACA,UAAA7C,GACA,0BAAAC,EACA,SAAU,OAAM,MAAevB,EAAI,UAAU,OAAOqF,EAAU,EAAE,MAAM,EACtE,gBAAAlE,EACA,eAAAC,EACA,IAAApB,EACA,IAAAY,EACA,eAAgB,IAbX,GAAGtB,GAAK,CAAC,CAAC,IAAI8F,GAAO,CAAC,CAAC,IAAInL,EAAC,EAcnC,CAEJ,CAAC,EACA4K,IAAgC,IAAI,CAACM,GAAOlL,KAAM,CACjD,KAAM,CAAE,KAAAqF,GAAM,OAAA8F,GAAQ,MAAAlE,GAAO,WAAAmE,EAAW,EAAIF,GAC5C,SACE,OAACjC,EAAA,CAEC,WAAY5D,GACZ,aAAc8F,GACd,MAAOlE,GACP,iBAAAgD,EACA,iBAAAC,EACA,UAAA7C,GACA,0BAAAC,EACA,SAAU,OAAM,MAAevB,EAAI,UAAU,OAAOqF,EAAU,EAAE,MAAM,EACtE,gBAAAlE,EACA,eAAAC,EACA,IAAApB,EACA,IAAAY,EACA,eAAgB,IAbX,GAAGtB,GAAK,CAAC,CAAC,IAAI8F,GAAO,CAAC,CAAC,IAAInL,EAAC,EAcnC,CAEJ,CAAC,EAEA,CAAC+K,GAAmB,CAACT,GAAmB,CAACO,MACxC,OAAC,MACC,mBAAC,MAAG,QAAS,IAAK,gBAAY,KAAE,mDAAoD,YAAY,EAC9F,mBAAC,KAAK,CAAC,QAAQ,8BAA8B,gCAAoB,EACnE,EACF,GAEJ,EACF,EACF,EACF,GACF,CAEJ,CACF,CAEO,MAAMQ,KAAa,MAAW9B,GAA6BK,CAAkB,CAAC,EACrFyB,EAAW,YAAc,Y,2NC9RlB,MAAMC,EAAiB,CAAC,CAC7B,IAAA3E,EACA,SAAA4E,GACA,QAAAC,GACA,aAAAC,GACA,MAAAC,EACA,KAAAC,EACA,cAAAC,EACA,UAAAC,EACA,SAAAC,EACA,iBAAAC,EAAmB,EACrB,IAAa,CACX,KAAM,CAACC,EAAiBC,CAAkB,KAAI,YAAS,EAAK,EACtD,CAACC,EAAiBC,CAAkB,KAAI,YAAS,EAAK,EACtD,CAACC,EAAcC,CAAe,KAAI,YAAS,EAAK,EAChD,CAACC,EAAcC,CAAe,KAAI,YAAS,EAAK,EAChDC,KAAU,UAAsBb,CAAI,EACpCc,KAAa,UAAeb,GAAe,WAAa,CAAC,EACzDc,KAAY,UAAkC,IAAI,EAClDC,MAAW,UAAO,CAAC,KAGzB,aAAU,IAAM,CACdV,EAAmB,EAAK,EACxBE,EAAmB,EAAK,CAC1B,EAAG,CAACT,EAAOC,EAAME,CAAS,CAAC,KAG3B,aAAU,IAAM,CACTL,KACHa,EAAgB,EAAK,EACrBE,EAAgB,EAAK,EAEzB,EAAG,CAACf,EAAO,CAAC,KAGZ,aAAU,IAAM,CACVc,GAAgBV,GAClBA,EAAc,SAAS,EAAGA,EAAc,aAAeA,EAAc,YAAY,CAErF,EAAG,CAACU,EAAcV,CAAa,CAAC,KAGhC,aAAU,IAAM,CACVD,IAASa,EAAQ,SAAWb,EAAK,SAAWa,EAAQ,QAAQ,SAAWJ,GAAgBE,KACrFT,IAAc,KAAc,YAAcS,EAC5CH,EAAmB,EAAI,EACdN,IAAc,KAAc,WAAaO,GAClDH,EAAmB,EAAI,GAG3BO,EAAQ,QAAUb,CACpB,EAAG,CAACW,EAAcX,EAAME,EAAWO,CAAY,CAAC,KAEhD,aAAU,IAAM,CAId,GAHI,CAACR,GAAiB,CAACH,IAGnBG,EAAc,cAAgBA,EAAc,aAC9C,OAGF,SAASgB,EAAaC,EAA2B,CAC/C,GAAI,CAACjB,GAAiB,CAACH,IAAgB,CAACE,EAAK,QAAUH,IAAW,CAAC,IAAO,eAAe,sBACvF,OAEF,MAAMsB,EAAkBC,EAAeF,EAAOH,EAAU,QAASC,GAAUf,EAAea,EAAW,OAAO,EAC5GC,EAAU,QAAUG,EACpBJ,EAAW,QAAUb,EAAc,UAC/BkB,IAAoB,IAGxBD,EAAM,yBAAyB,EAC3BC,IAAoB,IAAuBf,EAC7CiB,EAAU,EACDF,IAAoB,GAC7BG,EAAa,EAEfP,EAAU,QAAU,KACtB,CAEA,SAASM,GAAY,CACnB,MAAME,EAAWC,EAAaC,GAAgBzB,CAAI,EAAGD,EAAOI,EAAUD,CAAS,EAC/E,GAAI,CAACqB,EAAU,CACbjB,EAAmB,EAAI,EACvB,MACF,CACAA,EAAmB,EAAK,EACxBR,KAAeyB,CAAQ,EACvBb,EAAgB,EAAI,KACpB,MAAkB,kCAAmC,CACnD,UAAW,MACX,WAAYR,CACd,CAAC,CACH,CAEA,SAASoB,GAAe,CACtB,MAAMC,EAAWG,EAAgBD,GAAgBzB,CAAI,EAAGD,EAAOI,EAAUD,CAAS,EAClF,GAAI,CAACqB,EAAU,CACbf,EAAmB,EAAI,EACvB,MACF,CACAA,EAAmB,EAAK,EACxBV,KAAeyB,CAAQ,EACvBX,EAAgB,EAAI,KACpB,MAAkB,kCAAmC,CACnD,UAAW,SACX,WAAYV,CACd,CAAC,CACH,CAEA,OAAAD,EAAc,iBAAiB,SAAUgB,CAAY,EACrDhB,EAAc,iBAAiB,QAASgB,CAAY,EAE7C,IAAM,CACXhB,EAAc,oBAAoB,SAAUgB,CAAY,EACxDhB,EAAc,oBAAoB,QAASgB,CAAY,CACzD,CACF,EAAG,CAACnB,GAAcD,GAASE,EAAOC,EAAMC,EAAeC,EAAWC,EAAUC,CAAgB,CAAC,EAG7F,MAAMuB,EAAiBzB,IAAc,KAAc,YAAc,iBAAyBH,EAAM,IAAI,EAAE,EAChG6B,EAAoB1B,IAAc,KAAc,WAAa,iBAAyBH,EAAM,IAAI,EAAE,EAElG8B,KAAgB,eAAY,IAAM,IAEtC,MAAkB,mDAAoD,CACpE,SAAU,iBACZ,CAAC,EACD,MAAMN,EAAWC,EAAaC,GAAgBzB,CAAI,EAAGD,EAAOI,EAAUD,CAAS,EAC/E,GAAI,CAACqB,EAAU,CACbjB,EAAmB,EAAI,EACvB,MACF,CACAA,EAAmB,EAAK,EACxBR,KAAeyB,CAAQ,EACvBb,EAAgB,EAAI,EACpBT,GAAe,OAAO,CACpB,SAAU,OACV,IAAK,CACP,CAAC,CACH,EAAG,CAACH,GAAcC,EAAOC,EAAMC,EAAeC,EAAWC,CAAQ,CAAC,EAElE,SACE,oBACG,UAAAM,MAAgB,OAAC,IAAgB,CAAC,UAAWP,IAAc,KAAc,WAAa,QAAU,QAAS,EACzG,CAACyB,GAAkBtB,GAAmByB,EACtC5B,IAAc,KAAc,WAAalF,IAAQ,KAAQ,SAAW8E,OACnE,OAAC,KAAM,CAAC,UAAWzO,GAAO,UAAW,QAAQ,YAAY,QAASwQ,EAAe,SAAUhC,GACzF,oBAAC,OAAI,UAAWxO,GAAO,iBACrB,oBAAC,KAAI,CAAC,KAAK,WAAW,KAAK,IAAK,MAChC,OAAC,KAAK,CAAC,QAAQ,kCAAkC,sBAAU,GAC7D,EACF,EAEDuO,GACA,CAACgC,GAAqBrB,GAAmBuB,EACzCnB,MAAgB,OAAC,IAAgB,CAAC,UAAWT,IAAc,KAAc,WAAa,QAAU,QAAS,GAC5G,CAEJ,EAEM7O,GAAS,CACb,oBAAkB,OAAI,CACpB,UAAW,SACX,QAAS,GACX,CAAC,EACD,aAAW,OAAI,CACb,MAAO,OACP,OAAQ,OACR,QAAS,OACT,cAAe,SACf,eAAgB,SAChB,WAAY,SACZ,WAAY,IACZ,SAAU,WACV,IAAK,EACL,MAAO,GACP,OAAQ,CACV,CAAC,EACD,oBAAkB,OAAI,CACpB,QAAS,OACT,cAAe,SACf,eAAgB,SAChB,WAAY,SACZ,WAAY,QACd,CAAC,CACH,EAEMyQ,KACJ,OAAC,OAAI,UAAWzQ,GAAO,iBAAkB,cAAY,eACnD,mBAAC,KAAK,CAAC,QAAQ,2DAA2D,2CAA+B,EAC3G,EAGK,IAAK0Q,GAAAA,IACVA,EAAAA,EAAA,IAAM,EAAE,EAAR,MACAA,EAAAA,EAAA,OAAS,CAAC,EAAV,SACAA,EAAAA,EAAA,SAAW,CAAC,EAAZ,WAHUA,IAAAA,GAAA,IAKL,SAASX,EACdF,EACAH,GACAC,GACAgB,GACAlB,EACiB,CACjB,MAAMmB,EAAQf,aAAiB,WAAaA,EAAM,OAASc,GAAQ,UAAYlB,EAC/E,GAAImB,IAAU,EACZ,MAAO,GAGT,MAAMd,EAAkBc,EAAQ,EAAI,GAAsB,EAU1D,OAREd,IAAoB,GAChBa,GAAQ,UACRA,GAAQ,aAAeA,GAAQ,UAAYA,GAAQ,cAE9C,GAIP,CAACjB,IAAamB,EAA0BhB,EAAOH,GAAWC,EAAQ,EAC7D,EAGFG,CACT,CAEA,SAASe,EACPhB,EACAH,GACAC,GACA,CACA,MAAMmB,GAAYjB,EAAM,UAAYH,GAAU,UAE9C,OAAIoB,GAAY,KACdnB,GAAS,QAAU,EACZ,KAETA,GAAS,UAELmB,GAAY,IAEVnB,GAAS,SAAW,KACtBA,GAAS,QAAU,EACZ,IAEF,GAGLmB,GAAY,KAEVnB,GAAS,SAAW,IACtBA,GAAS,QAAU,EACZ,IAGJ,GACT,CAEO,SAASS,GAAgBzB,EAAqB,CACnD,MAAMoC,GAAiBpC,EAAK,CAAC,EAAE,YACzBqC,GAAgBrC,EAAKA,EAAK,OAAS,CAAC,EAAE,YAO5C,OAJEqC,GAAgBD,GACZ,CAAE,KAAMC,GAAe,GAAID,EAAe,EAC1C,CAAE,KAAMA,GAAgB,GAAIC,EAAc,CAGlD,CAEA,SAASC,EAAaC,EAAiCC,GAAyB,CAC9E,MAAO,CAAE,KAAMA,GAAa,KAAK,QAAQ,EAAG,GAAID,EAAa,IAAK,CACpE,CAEA,SAASE,EAAaF,EAAiCC,GAAyBrC,GAAoB,CAElG,OAAAqC,GAAeE,GAAmBF,GAAcrC,EAAQ,EACjD,CAAE,KAAMoC,EAAa,GAAI,GAAIC,GAAa,GAAG,QAAQ,CAAE,CAChE,CAEO,MAAMG,EAAsB,IAG5B,SAASnB,EACde,EACAC,GACArC,GACAD,GAC+B,CAC/B,OAAIA,KAAc,KAAc,YAE9BsC,GAAeE,GAAmBF,GAAcrC,EAAQ,EACtCqC,GAAa,GAAG,QAAQ,EAAID,EAAa,GAAKI,EAC7CF,EAAaF,EAAcC,GAAcrC,EAAQ,EAAI,QAGxD,KAAK,IAAIqC,GAAa,KAAK,QAAQ,EAAID,EAAa,IAAI,EAAII,EAC3DL,EAAaC,EAAcC,EAAY,EAAI,MAChE,CAEO,SAASd,EACda,EACAC,GACArC,GACAD,GAC+B,CAC/B,OAAIA,KAAc,KAAc,WACZ,KAAK,IAAIsC,GAAa,KAAK,QAAQ,EAAID,EAAa,IAAI,EAAII,EAC3DL,EAAaC,EAAcC,EAAY,EAAI,QAGhEA,GAAeE,GAAmBF,GAAcrC,EAAQ,EACtCqC,GAAa,GAAG,QAAQ,EAAID,EAAa,GAAKI,EAC7CF,EAAaF,EAAcC,GAAcrC,EAAQ,EAAI,OAC1E,CAGA,SAASuC,GAAmBlF,EAAsB2C,GAAoB,CACpE,OAAO,sBAA8B3C,EAAU,GAAG,EAC9C,oBAA4BA,EAAU,IAAK2C,EAAQ,EACnD3C,CACN,C,mHCtVO,MAAMoF,EAAoB,CAAC5I,EAAsB6I,KAAwB,CAC9E,IAAIC,EAAW9I,EAAM,QAAUA,EAAM,GAAG,QAAQ,MAAQA,EAAM,GAAG,QAAQ,MACzE,OAAQ6I,GAAU,CAChB,KAAK,KAAS,KACd,KAAK,KAAS,SACZC,EAAW,UACX,MACF,KAAK,KAAS,MACd,KAAK,KAAS,IACZA,EAAW,UACX,MACF,KAAK,KAAS,QACd,KAAK,KAAS,KACZA,EAAW9I,EAAM,OAAO,QAAQ,KAChC,MACF,KAAK,KAAS,KACZ8I,EAAW,UACX,MACF,KAAK,KAAS,MACZA,EAAW,UACX,MACF,KAAK,KAAS,MACZA,EAAW,UACX,KACJ,CAEA,MAAO,CACL,qBAAmB,OAAI,CACrB,WAAY,CACV,gBAAiBA,CACnB,CACF,CAAC,CACH,CACF,EAEajH,KAAkB,WAAY7B,GAAyB,CAClE,MAAM+I,GAAe,aAAuB/I,EAAM,OAAO,WAAW,UAAWA,CAAK,EAC9EgJ,KAAsB,KAAUhJ,EAAM,WAAW,UAAU,UAAU,EAAE,SAAS,EAAG,EAAE,YAAY,EACvG,MAAO,CACL,gBAAc,OAAI,CAChB,MAAO,kBACP,SAAUA,EAAM,QAAQ,IAAI,EAC5B,OAAQ,UACR,WAAY,CACV,QAAS,KACT,QAAS,QACT,SAAU,WACV,IAAK,MACL,OAAQ,MACR,MAAO,MACP,KAAMA,EAAM,QAAQ,EAAG,CACzB,CACF,CAAC,EAED,oBAAkB,OAAI,CACpB,SAAU,GAAGA,EAAM,QAAQ,GAAG,CAAC,EACjC,CAAC,EACD,yBAAuB,OAAI,CACzB,MAAO,4BACP,WAAY,UACZ,QAAS,UACT,MAAOA,EAAM,WAAW,cAAc,KACtC,gBAAiBA,EAAM,WAAW,cAAc,UAClD,CAAC,EACD,WAAS,OAAI,CACX,SAAU,UACZ,CAAC,EACD,YAAU,OAAI,CACZ,QAAS,cACT,WAAY,SACZ,IAAKA,EAAM,QAAQ,CAAC,EACpB,MAAOA,EAAM,OAAO,KAAK,UACzB,QAAS,GACT,SAAUA,EAAM,WAAW,UAAU,SACrC,UAAWA,EAAM,QAAQ,CAAC,CAC5B,CAAC,EACD,iBAAe,OAAI,CACjB,MAAO,YACP,WAAYA,EAAM,WAAW,oBAC7B,SAAUA,EAAM,WAAW,UAAU,SACrC,MAAO,OACP,SAAU,UACZ,CAAC,EACD,wBAAsB,OAAI,CACxB,QAAS,QACX,CAAC,EACD,uBAAqB,OAAI,CACvB,mBAAiB,KAAUA,EAAM,OAAO,KAAK,WAAW,EAAE,SAAS,GAAI,EAAE,SAAS,CACpF,CAAC,EACD,WAAS,OAAI,CACX,MAAO,WACP,MAAO,OACP,OAAQ,UACR,cAAe,MAEf,iBAAkB,CAChB,QAAS,aAAaA,EAAM,OAAO,QAAQ,MAAM,GACjD,cAAe,MACjB,EAEA,UAAW,CACT,gBAAiB,CACf,OAAQ,CACV,EAEA,WAAY+I,EACd,EAEA,wCAAyC,CACvC,MAAO,MACT,EAEA,+BAAgC,CAC9B,SAAU,WACV,aAAc/I,EAAM,QAAQ,CAAC,EAC7B,UAAW,wBACX,aAAc,wBACd,OAAQ,MACV,CACF,CAAC,EACD,qBAAmB,OAAI,CACrB,MAAO,uBACP,UAAW,QACX,MAAO,MACP,OAAQ,SACV,CAAC,EACD,gBAAc,OAAI,CAChB,MAAOA,EAAM,OAAO,QAAQ,KAC5B,SAAU,WACV,IAAK,MACP,CAAC,EACD,eAAa,OAAI,CACf,MAAOA,EAAM,OAAO,KAAK,KACzB,SAAU,WACV,IAAK,MACP,CAAC,EACD,wBAAsB,OAAI,CACxB,MAAO,iCACP,SAAU,MACV,SAAU,MACZ,CAAC,EACD,oBAAkB,OAAI,CACpB,MAAO,sBACP,WAAY,QACd,CAAC,EACD,iBAAe,OAAI,CACjB,MAAO,mBACP,WAAY,SACZ,SAAU,OAGV,SAAU,CACR,UAAW,QACb,CACF,CAAC,EACD,kBAAgB,OAAI,CAClB,MAAO,oBACP,WAAY,WACZ,UAAW,YACX,aAAc,WACd,MAAO,OACP,UAAW,MACb,CAAC,EACD,iBAAe,OAAI,CACjB,QAASA,EAAM,QAAQ,EAAG,EAAG,EAAG,EAAG,EACnC,OAAQA,EAAM,QAAQ,CAAC,EACvB,MAAOA,EAAM,QAAQ,IAAI,EACzB,WAAYA,EAAM,QAAQ,GAAG,EAC7B,SAAU,SACV,UAAW,CACT,gBAAiB,KAAiB,MAAMA,EAAM,OAAO,KAAK,QAAS,GAAI,CACzE,CACF,CAAC,EAED,uBAAqB,OAAI,CACvB,MAAO,yBACP,OAAQ,aAAaA,EAAM,OAAO,OAAO,MAAM,GAC/C,QAASA,EAAM,QAAQ,EAAG,EAAG,CAAC,EAC9B,aAAcA,EAAM,MAAM,OAAO,QACjC,OAAQA,EAAM,QAAQ,IAAK,EAAG,IAAK,CAAC,EACpC,OAAQ,SACV,CAAC,EACD,mBAAiB,OAAI,CACnB,MAAO,yBACP,WAAY,OACZ,MAAO,OACP,gBAAiB,CACf,MAAO,MACT,CACF,CAAC,EACD,mBAAiB,OAAI,CACnB,MAAO,yBACP,SAAU,WACV,MAAOA,EAAM,GAAG,QAAQ,MACxB,WAAY,MACZ,cAAe,MACf,aAAcA,EAAM,QAAQ,GAAI,CAClC,CAAC,EACD,mBAAiB,OAAI,CACnB,MAAO,0BACP,SAAU,OACV,QAASA,EAAM,QAAQ,EAAG,CAAC,EAC3B,aAAc,YAChB,CAAC,EACD,qBAAmB,OAAI,CACrB,MAAO,4BACP,WAAYA,EAAM,WAAW,eAC7B,QAASA,EAAM,QAAQ,EAAG,EAAG,EAAG,CAClC,CAAC,EACD,mBAAiB,OAAI,CACnB,MAAO,wBACP,SAAU,WACV,cAAe,SACf,OAAQ,UAER,UAAW,CACT,gBAAiB+I,EACnB,CACF,CAAC,EACD,iBAAe,OAAI,CACjB,WAAY,OACZ,WAAY,OACZ,OAAQ,OACR,QAAS,EAET,UAAW,OAGX,kBAAmB,CACjB,UAAW,MACb,EAEA,UAAW,CACT,QAAS,CACX,EACA,UAAW,CACT,QAAS,KACT,MAAO,EACP,SAAU,UACZ,CACF,CAAC,EAGD,oBAAkB,OAAI,CACpB,MAAO,mBACP,UAAW/I,EAAM,QAAQ,GAAI,EAC7B,WAAYA,EAAM,QAAQ,IAAK,CACjC,CAAC,EACD,eAAa,OAAI,CACf,UAAW,CACT,gBAAiB,aAAuBA,EAAM,OAAO,WAAW,QAASA,CAAK,CAChF,CACF,CAAC,EACD,eAAa,OAAI,CACf,MAAO,gBACP,MAAOA,EAAM,OAAO,KAAK,SAC3B,CAAC,EAED,oBAAkB,OAAI,CACpB,MAAO,mBACP,SAAU,UACZ,CAAC,EACD,kBAAgB,OAAI,CAClB,MAAO,iBACP,OAAQ,EACR,QAAS,gBAAgBgJ,CAAmB,GAC5C,QAAS,SACX,CAAC,EACD,oBAAkB,OAAI,CACpB,MAAO,mBACP,WAAY,KACd,CAAC,EACD,kBAAgB,OAAI,CAClB,QAAS,QACT,WAAY,KACd,CAAC,EACD,WAAS,OAAI,CACX,MAAO,UACP,QAAS,OACT,SAAU,SACV,cAAe,MACf,aAAc,WACd,eAAgB,eAChB,WAAY,SACZ,SAAU,WACV,IAAK,EACL,OAAQ,OACR,WAAYhJ,EAAM,OAAO,WAAW,QACpC,UAAWA,EAAM,QAAQ,GACzB,QAASA,EAAM,QAAQ,GAAK,EAAG,GAAK,CAAC,EACrC,OAAQ,IACR,IAAKA,EAAM,QAAQ,EAAG,EAEtB,aAAc,CACZ,OAAQ,CACV,CACF,CAAC,EACD,kBAAgB,OAAI,CAClB,SAAU,SACV,OAAQA,EAAM,OAAO,SACrB,UAAWA,EAAM,QAAQ,KAAM,EAC/B,MAAO,EAEP,WAAY,CACV,UAAW,mBACb,CACF,CAAC,EACD,WAAS,OAAI,CACX,WAAYA,EAAM,WAAW,oBAC7B,SAAUA,EAAM,WAAW,UAAU,SACrC,cAAeA,EAAM,WAAW,UAAU,cAC1C,UAAW,OACX,QAAS,EACT,WAAY,MACd,CAAC,EAED,uBAAqB,OAAI,CACvB,MAAO,0BACP,WAAY,CACV,IAAK,MACP,CACF,CAAC,EACD,cAAY,OAAI,CACd,MAAO,0BACP,OAAQ,UAER,UAAW,CACT,gBAAiBA,EAAM,OAAO,WAAW,OAC3C,CACF,CAAC,EACD,kBAAgB,OAAI,CAClB,MAAO,iBACP,YAAa,MACb,OAAQ,EACV,CAAC,EACD,cAAY,OAAI,CACd,MAAO,aACP,WAAY,CACV,WAAYA,EAAM,QAAQ,EAAG,CAC/B,CACF,CAAC,EACD,UAAQ,OAAI,CACV,MAAO,SACP,WAAY,QACd,CAAC,EACD,eAAa,OAAI,CACf,OAAQA,EAAM,QAAQ,CAAC,EACvB,WAAYA,EAAM,QAAQ,GAAG,CAC/B,CAAC,CACH,CACF,CAAC,C,wKC/VD,SAASiJ,EAAaC,EAA8B,CAClD,OAAOC,EAAcD,EAAe,GAAI,CAC1C,CAEA,SAASC,EAAcC,EAAyB,CAC9C,OAAO,KAAK,MAAMA,EAAU,EAAE,CAChC,CAEO,SAASC,EAAoBtD,EAAmBuD,EAAgC,CACrF,GAAIvD,GAASuD,EAAW,CACtB,MAAMC,GAAiBN,EAAalD,EAAM,KAAK,QAAQ,CAAC,IAAMkD,EAAaK,EAAU,KAAK,QAAQ,CAAC,EAC7FE,EAAeP,EAAalD,EAAM,GAAG,QAAQ,CAAC,IAAMkD,EAAaK,EAAU,GAAG,QAAQ,CAAC,EAE7F,MAAO,EAAEC,IAAkBC,EAC7B,CACA,MAAO,EACT,CAMA,MAAMC,EAAqB,uBAC3B,SAASC,EAAiBpS,EAAuB,CAC/C,OAAOA,EAAM,QAAQmS,EAAoB,MAAM,CACjD,CAMO,SAASE,GAAgCC,EAA4B,CAC1E,OAAOA,EAAW,QAAQ,MAAO,MAAM,EAAE,QAAQ,MAAO,KAAK,EAAE,QAAQ,KAAM,KAAK,CACpF,CAEO,SAASC,EAAmBD,EAA4B,CAC7D,OAAOA,EAAW,QAAQ,OAAQ;AAAA,CAAI,EAAE,QAAQ,OAAQ,GAAG,EAAE,QAAQ,QAAS,IAAI,CACpF,CAEO,SAASE,EAAgCF,EAA4B,CAC1E,OAAOD,GAAgCD,EAAiBE,CAAU,CAAC,CACrE,CAEO,SAASG,EAA2BH,EAAoBI,EAA2B,CACxF,OAAOC,GAAgBD,CAAQ,EAC3BF,EAAgCF,CAAU,EAC1CD,GAAgCC,CAAU,CAChD,CAEO,SAASK,GAAgBD,EAAmB,CACjD,MAAI,GAAAA,IAAaA,EAAS,SAAS,IAAI,GAAKA,EAAS,SAAS,IAAI,GAIpE,CAEO,SAASE,EAAcC,EAAgB,CAC5C,MAAMC,EAAiB,CACrB,IACA,MACA,MACA,KACA,KACA,MACA,MACA,KACA,KACA,MACA,MACA,KACA,KACA,MACA,MACA,KACA,KACA,MACA,MACA,KACA,KACA,MACA,MACA,KACA,IACF,EACMC,GAAQ,IAAI,OAAO,6BAA6BD,EAAe,KAAK,GAAG,CAAC,IAAI,EAElF,MAAO,CAAC,CADMD,EAAO,MAAME,EAAK,CAElC,CAEO,SAASC,EAAsBC,EAAkBC,EAAmB9L,GAAkC,CAC3G,GAAI,CAAC8L,GAAS9L,KAAU,OACtB,OAAO,KAGT,MAAM+L,EAAYD,EAAM,OAAO,KAAMjF,IAAUA,GAAM,OAAS,YAAY,GAAG,OAAO7G,EAAK,EACzF,GAAI,CAAC+L,EACH,OAAO,KAET,OAAQA,EAAUF,CAAQ,EAAG,CAC3B,IAAK,IACH,OAAO,KAAU,QACnB,IAAK,IACH,OAAO,KAAU,mBACnB,IAAK,IACH,OAAO,KAAU,OACnB,QACE,OAAO,IACX,CACF,CAEO,MAAMG,EAA2D,CACtE,CAAC,KAAsB,KAAK,EAAG,IAC/B,CAAC,KAAsB,QAAQ,EAAG,KAClC,CAAC,KAAsB,UAAU,EAAG,KACpC,CAAC,KAAsB,aAAa,EAAG,IACzC,EAGaC,KAA2B,UAAOD,CAAiB,EAEzD,SAASE,GAAoBC,EAAwC,CAC1E,MAAMC,EAAOD,EAAgB,cAC1B,IAAKb,IAAmC,CACvC,MAAMe,EAAWL,EAAkBV,GAAS,QAAQ,EACpD,OAAIe,EACK,GAAGf,GAAS,IAAI,GAAGe,CAAQ,IAAIf,GAAS,KAAK,IAE7C,EAEX,CAAC,EACA,OAAQtH,IAAcA,KAAM,EAAE,EAC9B,KAAK,IAAI,EAEZ,OAAOoI,EAAO,IAAIA,CAAI,IAAM,EAC9B,CAEO,SAASE,EAActG,EAA0C,CACtE,MAAMuG,EAA2C,CAAC,EAClDvG,EAAO,QAASwG,GAAU,CACxB,OAAO,KAAKA,CAAK,EAAE,QAASlR,IAAQ,CAC7BiR,EAASjR,EAAG,IACfiR,EAASjR,EAAG,EAAI,IAAI,KAEjBiR,EAASjR,EAAG,EAAE,IAAIkR,EAAMlR,EAAG,CAAC,GAC/BiR,EAASjR,EAAG,EAAE,IAAIkR,EAAMlR,EAAG,CAAC,CAEhC,CAAC,CACH,CAAC,EAED,MAAMmR,GAA0C,CAAC,EACjD,OAAAC,EAAiB,OAAO,KAAKH,CAAQ,CAAC,EAAE,QAASjR,GAAQ,CACvDmR,GAAWnR,CAAG,EAAIoR,EAAiB,MAAM,KAAKH,EAASjR,CAAG,CAAC,CAAC,CAC9D,CAAC,EAEM,CAAE,OAAQmR,GAAY,KAAM,OAAO,KAAKA,EAAU,CAAE,CAC7D,CAGO,MAAME,EAAoB,IAC1B,SAASD,EAAiBE,EAAiB,CAChD,OAAOA,EAAM,MAAM,EAAGD,CAAiB,CACzC,C,+TCjIO,SAASE,EAAmCC,EAAQ,GAAc,CACvE,MAAMC,EAAoB,CAAC,EAErBC,EAAUC,EAAkBH,EAAO,CAAC,IAAU,CAAC,EAErD,UAAWI,KAAUF,EAAS,CAC5B,MAAMG,EAAYD,EAAO,SAAS,IAAM,GAAG,SAAS,IAAS,EACvDE,EAAYF,EAAO,SAAS,IAAM,GAAG,SAAS,IAAS,EACvDG,GAAUC,EAAyBJ,CAAM,EAE/C,GAAK,GAACC,GAAa,CAACC,GAAc,CAACC,GAAQ,QAI3C,UAAW5B,KAAU4B,GAAS,CAC5B,MAAME,EAAaT,EAAM,UAAUrB,EAAO,KAAMA,EAAO,EAAE,EAAE,KAAK,EAC1D+B,EAAiBD,EAAW,CAAC,IAAM,IACnCE,EAAsBF,EAAW,UAAU,EAAGA,EAAW,OAAS,CAAC,EAEzE,GAAI,CAACE,EACH,SAGF,IAAIC,EAAa,GAGbN,EAGFM,EAAaF,EAAiBC,EAAsBA,EAAoB,QAAQ,QAAS,IAAI,EAG7FC,KAAa,gBAAaD,CAAmB,EAG3CC,GACFX,EAAQ,KAAKW,CAAU,CAE3B,CACF,CACA,OAAOX,CACT,CAEO,SAASY,EAA+BC,EAA6B,CAC1E,OAAOA,EAAoB,QAAQ,SAAU,EAAE,CACjD,CAEO,SAASN,EAAyBJ,EAAkC,CACzE,MAAMW,EAAsB,CAAC,EAC7B,IAAIC,EAA0BZ,EAC9B,EAAG,CACD,MAAMzB,EAASqC,EAAK,SAAS,IAAM,EAC/BrC,GAAU,CAACqC,EAAK,SAAS,IAAQ,GACnCD,EAAM,KAAKpC,CAAM,EAEnBqC,EAAOA,EAAK,SAAS,IAAQ,CAC/B,OAASA,GAAQ,MAEjB,OAAOD,CACT,CAEO,SAASE,GAAuBC,EAA6B,CAClE,IAAIC,EAAYC,EAAiBF,CAAK,EAEtC,KAAM,CAAE,QAAAG,EAAS,MAAA9G,EAAO,GAAG7C,CAAK,EAAIwJ,EAGpC,GAAI,CACEI,EAAYJ,EAAM,IAAI,GAAKC,IAAc,KAAc,UACzDA,EAAY,KAAc,MAE9B,MAAY,CAAC,CACb,MAAO,CAAE,GAAGzJ,EAAM,UAAAyJ,CAAU,CAC9B,CAEO,SAASC,EAAiBF,EAAiC,CAGhE,KAAM,CAAE,UAAAC,CAAU,EAAID,EAKtB,OAHEC,IAAc,KAAc,OAASA,IAAc,KAAc,SAAWA,IAAc,KAAc,OAIjGA,EAILD,EAAM,UAAY,GACb,KAAc,QAIhB,KAAc,KACvB,CAEA,MAAMK,EAAgB,CAAC,SAAU,aAAc,cAAe,QAAQ,EAChEC,EAAc,CAAC,YAAa,aAAc,gBAAiB,QAAQ,EAClE,SAASC,GAAUP,EAAuB,CAC/C,IAAIQ,EAA0BR,EAE9B,OADa,KAAO,MAAMA,CAAK,EAC1B,QAAQ,CACX,MAAO,CAAC,CAAE,KAAA1Q,EAAM,KAAAmR,EAAM,GAAAC,CAAG,IAAoB,CAC3C,MAAMC,GAAYX,EAAM,UAAUS,EAAMC,CAAE,EACtCL,EAAc,SAAS/Q,CAAI,GAAK,CAACgR,EAAY,SAASK,EAAS,IACjEH,EAAkBA,EAAgB,QAAQG,GAAWrR,CAAI,EAE7D,CACF,CAAC,EACMkR,CACT,CAEO,SAASI,EAAsBZ,EAAyB,CAC7D,MAAMa,EAAuB,CAAC,EAE9B,OADa,OAAO,MAAMb,CAAK,EAC1B,QAAQ,CACX,MAAO,CAAC,CAAE,KAAA1Q,CAAK,IAAoB,CACjCuR,EAAW,KAAKvR,CAAI,CACtB,CACF,CAAC,EACMuR,CACT,CAEO,SAASC,EAAgBd,EAAee,EAA2B,CACxE,IAAID,EAAkB,GAEtB,OADa,KAAO,MAAMd,CAAK,EAC1B,QAAQ,CACX,MAAO,CAAC,CAAE,KAAA5J,CAAK,IAAoB,CACjC,GAAIA,EAAK,KAAO2K,EACdD,OAAAA,EAAkB,GACX,EAEX,CACF,CAAC,EACMA,CACT,CAEO,SAAS7B,EAAkBe,EAAegB,EAAoC,CACnF,MAAMnB,EAAsB,CAAC,EAE7B,OADa,KAAO,MAAMG,CAAK,EAC1B,QAAQ,CACX,MAAQF,GAAuB,EACzBkB,IAAc,QAAaA,EAAU,SAASlB,EAAK,KAAK,EAAE,IAC5DD,EAAM,KAAKC,EAAK,IAAI,CAExB,CACF,CAAC,EACMD,CACT,CAEO,SAASoB,EAA0BjB,EAAegB,EAAsC,CAC7F,MAAME,EAA4B,CAAC,EAEnC,OADa,KAAO,MAAMlB,CAAK,EAC1B,QAAQ,CACX,MAAQF,GAAuB,EACzBkB,IAAc,QAAaA,EAAU,SAASlB,EAAK,KAAK,EAAE,IAC5DoB,EAAU,KAAK,KAAa,SAASpB,EAAK,IAAI,CAAC,CAEnD,CACF,CAAC,EACMoB,CACT,CAEO,SAASC,GAAiBnB,EAAee,EAA0C,CACxF,MAAMlB,EAAQZ,EAAkBe,EAAO,CAACe,CAAQ,CAAC,EACjD,OAAOlB,EAAM,OAAS,EAAIA,EAAM,CAAC,EAAI,MACvC,CAOO,SAASuB,EAAiBpB,EAAwB,CACvD,OAAOc,EAAgBd,EAAO,IAAO,CACvC,CAEO,SAASI,EAAYJ,EAAwB,CAElD,OAAOA,EAAM,KAAK,EAAE,OAAS,GAAK,CAACc,EAAgBd,EAAO,IAAU,CACtE,CAEO,SAASqB,EAAkBrB,EAAkE,CAElG,MAAMsB,EADQrC,EAAkBe,EAAO,CAAC,KAAa,KAAsB,IAAM,CAAC,EACxD,OAC1B,MAAO,CAAE,gBAAiBsB,EAAc,EAAG,YAAAA,CAAY,CACzD,CAEO,SAASC,EAAmBvB,EAAmC,CACpE,MAAMwB,EAAUvC,EAAkBe,EAAO,CAAC,KAAa,KAAM,IAAM,CAAC,EACpE,OAAOwB,EAAQ,OAAS,EAAIxB,EAAM,UAAUwB,EAAQ,CAAC,EAAE,KAAMA,EAAQ,CAAC,EAAE,EAAE,EAAE,KAAK,EAAI,MACvF,CAEO,SAASC,EAA8BzB,EAAwB,CACpE,MAAMhI,EAASiH,EAAkBe,EAAO,CAAC,IAAW,CAAC,EACrD,UAAWF,KAAQ9H,EAAQ,CACzB,MAAMwG,EAAQsB,EAAK,SAAS,IAAO,GAAG,SAAS,IAAU,EACzD,GAAItB,GACgBwB,EAAM,UAAUxB,EAAM,KAAMA,EAAM,EAAE,IACpC,YAChB,MAAO,EAGb,CACA,MAAO,EACT,CAEO,SAASkD,GAAuB1B,EAAwB,CAC7D,OAAOc,EAAgBd,EAAO,IAAe,CAC/C,CAEO,SAAS2B,EAA4B3B,EAAuB,CACjE,GAAII,EAAYJ,CAAK,EACnB,OAAOA,EAIT,MAAM4B,EAAeT,GAAiBnB,EAAO,IAAQ,EACrD,GAAI,CAAC4B,EACH,MAAO,GAET,MAAMtE,EAAW0C,EAAM,UAAU4B,EAAa,KAAMA,EAAa,EAAE,EAE7DC,EAAmBV,GAAiBnB,EAAO,IAAY,EACvD8B,EAAeD,EAAmB7B,EAAM,UAAU6B,EAAiB,KAAMA,EAAiB,EAAE,EAAI,GAEtG,MAAO,GAAGvE,CAAQ,IAAIwE,CAAY,GAAG,KAAK,CAC5C,CAEO,SAASC,GAAsC/B,EAAegC,EAA0B,CAC7F,GAAI5B,EAAYJ,CAAK,EACnB,OAAOA,EAGT,MAAMiC,EAAchD,EAAkBe,EAAO,CAAC,IAAU,CAAC,EACtD,QAAQ,EACR,KAAMF,GAASA,EAAK,MAAQkC,GAAYlC,EAAK,IAAMkC,CAAQ,EAC9D,OAAKC,EAGEN,EAA4B3B,EAAM,UAAUiC,EAAY,KAAMA,EAAY,EAAE,CAAC,EAF3E,EAGX,CAEO,SAASC,GAAuBlC,EAAwB,CAC7D,OAAOc,EAAgBd,EAAO,IAAW,CAC3C,CAEO,SAASmC,GAAsBnC,EAAwB,CAC5D,OAAOc,EAAgBd,EAAO,IAAU,CAC1C,CAEO,SAASoC,EAAyBpC,EAAwB,CAC/D,MAAMqC,EAAapD,EAAkBe,EAAO,CAAC,IAAK,CAAC,EACnD,UAAWF,KAAQuC,EACjB,GAAIrC,EAAM,UAAUF,EAAK,KAAMA,EAAK,EAAE,EAAE,MAAM,sBAAsB,EAClE,MAAO,GAGX,MAAO,EACT,CAEO,SAASwC,EAA4BtC,EAAyB,CAOnE,SAN8B,MAA2BA,CAAK,EAElB,IAAKuC,GACxCvC,EAAM,MAAMuC,EAAa,KAAMA,EAAa,EAAE,CACtD,CAGH,CAEO,SAASC,EAAyBC,EAAyB,CAMhE,OALgBA,EACb,OAAQzC,GAAU,CAACA,EAAM,IAAI,EAC7B,OAAQA,GAAU,CAACA,EAAM,MAAM,SAAS,cAAc,CAAC,EACvD,OAAQA,GAAUA,EAAM,IAAI,EAEhB,OAAS,CAC1B,CAEO,SAAS0C,EAAwBD,EAAyB,CAW/D,OAVgBA,EACb,OAAQzC,GAAU,CAACA,EAAM,IAAI,EAC7B,OAAQA,GAAUA,EAAM,YAAc,KAAc,OAAO,EAC3D,OAAQA,GAAU,CAACA,EAAM,MAAM,SAAS,cAAc,CAAC,EACvD,OAAQA,GAAUA,EAAM,IAAI,EAC5B,OACEA,GACEA,EAAM,YAAc,KAAmB,MAAQI,EAAYJ,EAAM,IAAI,GAAM2C,EAAuB3C,EAAM,IAAI,CACjH,EAEa,OAAS,CAC1B,CAEA,SAAS2C,EAAuB3C,EAAe,CAO7C,GANII,EAAYJ,CAAK,IAGrBA,EAAQA,EAAM,KAAK,EAAE,YAAY,EAEdf,EAAkBe,EAAO,CAAC,IAAS,CAAC,EACxC,OAAS,GACtB,MAAO,GAST,MAAM4C,EAAY3D,EAAkBe,EAAO,CAAC,IAAQ,CAAC,EAC/C6C,EAAqBD,EAAU,OAAQ9C,GAASgD,EAAc9C,EAAOF,CAAI,IAAM,KAAK,EACpFiD,EAAuBH,EAAU,OAAQ9C,GAASgD,EAAc9C,EAAOF,CAAI,IAAM,KAAK,EACtFkD,EAA8BH,EAAmB,OAAQI,GAC7DF,EAAqB,MAAOG,GAAkBD,EAAY,KAAOC,EAAc,IAAI,CACrF,EACA,GAAIH,EAAqB,OAAS,EAChC,OAAOC,EAA4B,OAAS,EAG9C,MAAMG,GAAWlE,EAAkBe,EAAO,CAAC,IAAO,CAAC,EAC7CoD,EAAoB,CAAC,kBAAmB,gBAAiB,iBAAiB,EAChF,UAAWtD,KAAQqD,GACjB,GAAI,CAACC,EAAkB,SAASN,EAAc9C,EAAOF,CAAI,CAAC,EACxD,OAAOkD,EAA4B,OAAS,EAIhD,MAAO,EACT,CAEA,SAASF,EAAc9C,EAAeF,EAAkB,CACtD,OAAOE,EAAM,UAAUF,EAAK,KAAMA,EAAK,EAAE,CAC3C,CAEO,MAAMuD,EAAerD,GACrBA,EAIE,SAAUA,GAASA,EAAM,OAAS,OAHhC,GAMEsD,EAA6BtD,GAA6C,CACrF,GAAI,GAACA,GAAS,CAACqD,EAAYrD,CAAK,GAIhC,OAAOA,CACT,EAEauD,EAA8B,CAACC,EAAsBC,IAAqB,CACrF,GAAIA,EAAO,SAAW,EACpB,OAAOD,EAGT,IAAIE,EAAaD,EAAO,KAAK,GAAG,EAGhC,OAAIC,IAAe,MAAQD,EAAO,SAAW,GAC3CC,EAAaA,IAAe,KAAO,GAAKA,EACjCF,EAAQ,IAAKxD,IAAW,CAC7B,GAAGA,EACH,KAAM2D,EAA4B3D,EAAM,KAAM,IAAK0D,CAAU,CAC/D,EAAE,GAGGF,EAAQ,IAAKxD,IAAW,CAC7B,GAAGA,EACH,KAAM2D,EAA4B3D,EAAM,KAAM,KAAM0D,CAAU,CAChE,EAAE,CACJ,EAEA,SAASC,EAA4B3D,EAAe3B,EAAkBqF,EAAoB,CACxF,MAAME,KAAe,MAAgB5D,EAAO,mBAAoB3B,EAAUqF,EAAY,KAAU,OAAO,EACvG,OAAKtD,EAAYJ,CAAK,EAGf4D,KAFE,MAAeA,EAAc,CAAC,kBAAkB,CAAC,CAG5D,CAEO,MAAMC,EAA6B7D,GAAkB,CAC1D,MAAM1C,EAAW2B,EAAkBe,EAAO,CAAC,IAAQ,CAAC,EACpD,OAAI1C,EAAS,OAAS,EACb0C,EAAM,UAAU1C,EAAS,CAAC,EAAE,KAAMA,EAAS,CAAC,EAAE,EAAE,EAElD,EACT,C,gECvaO,MAAMwG,KAAyB,QAAK,CAAC,CAAE,OAAAC,CAAO,OAEjD,mBACG,SAAAA,EAAO,IAAI,CAACC,EAAOrW,OAClB,OAACsW,EAAA,CAAS,MAAAD,CAAA,EAAmBrW,CAAG,CACjC,EACH,CAEH,EACDmW,EAAuB,YAAc,yBAErC,MAAMG,KAAW,QAAK,CAAC,CAAE,MAAAD,CAAM,IACzB,OAAOA,GAAU,SACZA,EAEL,MAAM,QAAQA,EAAM,OAAO,KAE3B,OAAC,QAAK,UAAW,SAASA,EAAM,IAAI,GACjC,SAAAA,EAAM,QAAQ,IAAI,CAACE,EAAUvW,OAC5B,OAACsW,EAAA,CAAiB,MAAOC,CAAA,EAAVvW,CAAoB,CACpC,EACH,KAIF,OAAC,QAAK,UAAW,SAASqW,EAAM,IAAI,GACjC,gBAAOA,EAAM,SAAY,SAAWA,EAAM,WAAU,OAACC,EAAA,CAAS,MAAOD,EAAM,QAAS,EACvF,CAEH,EACDC,EAAS,YAAc,U,sHCjBvB,SAASE,EAAkB7Q,EAAsB8Q,EAAoB,CACnE,OAAOA,EAAI,MAAM,MAAM,EAAE,OAAc,CAACC,EAAaC,KAAS,CAI5D,GAAIA,KAAS,wBACX,MAAO,CAAE,MAAOhR,EAAM,OAAO,KAAK,SAAU,EAG9C,MAAMxH,EAAQwY,GAAK,MAAM,sBAAsB,EAE/C,GAAIxY,GAASA,EAAM,CAAC,GAAKA,EAAM,CAAC,EAAG,CACjC,MAAMwB,EAAMxB,EAAM,CAAC,EAAE,QAAQ,YAAa,CAACyY,EAAGC,IAAcA,EAAU,YAAY,CAAC,EACnFH,EAAY/W,CAAG,EAAIxB,EAAM,CAAC,CAC5B,CAEA,OAAOuY,CACT,EAAG,CAAC,CAAC,CACP,CAeO,MAAMI,UAA+B,eAA4B,CAAjE,kCACL,WAAe,CACb,OAAQ,CAAC,EACT,UAAW,EACb,EAEA,OAAO,yBAAyBpN,EAAc7C,EAAc,CAC1D,OAAI6C,EAAM,QAAU7C,EAAM,UACjB,KAKF,CACL,OAHa,WAAgB6C,EAAM,KAAK,EAGzB,MAAM,IAAKqN,GACjBA,EAAK,IACR,CACE,MAAOP,EAAkB9M,EAAM,MAAOqN,EAAK,GAAG,EAC9C,KAAMA,EAAK,IACb,EACA,CAAE,KAAMA,EAAK,IAAK,CACvB,EACD,UAAWrN,EAAM,KACnB,CACF,CAEA,QAAS,CACP,KAAM,CAAE,OAAAsN,CAAO,EAAI,KAAK,MAExB,OAAOA,EAAO,IAAI,CAACC,EAAO5S,KAAU,CAClC,MAAM6S,EAAY,KAAK,MAAM,WAAW,eACtC,OAAC,KAEC,gBAAiBD,EAAM,KACvB,YAAa,KAAK,MAAM,UAAU,YAClC,WAAY,KACZ,mBAAoB,KAAK,MAAM,UAAU,oBAJpC5S,EAKP,EAEA4S,EAAM,KAER,OAAOA,EAAM,SACX,OAAC,QAAiB,MAAOA,EAAM,MAAO,cAAY,cAC/C,SAAAC,CAAA,EADQ7S,EAEX,EAEA6S,CAEJ,CAAC,CACH,CACF,CAEO,MAAMC,MAAiB,MAAWL,CAAsB,EAC/DK,GAAe,YAAc,gB,kTCvF7B,SAASzR,GAAUC,EAAsB,CACvC,MAAO,CACL,WAAS,OAAI,CACX,QAAS,OACT,IAAKA,EAAM,QAAQ,CAAC,CACtB,CAAC,CACH,CACF,CAEO,MAAMyR,EAAqB1N,GAAiB,CACjD,MAAM1M,KAAS,MAAW0I,EAAS,EAC7B,CAAE,UAAA2R,EAAW,kBAAAC,EAAmB,oBAAAC,CAAoB,EAAI7N,EACxD8N,KAA4B,eAC/B3K,GAA6C,CAC5C,MAAMhG,EAAQgG,EAAM,cAAc,WAClC,MAAkB,wDAAyD,CACzE,MAAAhG,CACF,CAAC,EACDyQ,EAAkBzQ,CAAK,CACzB,EACA,CAACyQ,CAAiB,CACpB,EAEA,SACE,QAAC,OAAI,UAAWta,EAAO,QACrB,oBAAC,KACC,UAAS,GACT,MAAOqa,EACP,SAAUG,EACV,SAAO,MAAE,4CAA6C,YAAY,EACpE,KACA,OAACC,EAAA,GAAM,CAAC,QAAQ,YAAY,QAASF,EACnC,mBAAC,MAAK,CAAC,QAAQ,+CAA+C,+BAAmB,EACnF,GACF,CAEJ,EChBM,GAAa5R,IACV,CACL,SAAO,OAAI,CACT,MAAO,OACP,CAACA,EAAM,YAAY,KAAK,IAAI,CAAC,EAAG,CAC9B,MAAO,MACT,CACF,CAAC,EACD,UAAQ,OAAI,CACV,SAAU,SACV,OAAQ,EACR,IAAK,OACL,OAAQ,MACV,CAAC,EACD,SAAO,OAAI,CACT,SAAU,CACR,QAASA,EAAM,QAAQ,EAAG,EAAG,EAAG,CAAC,CACnC,EACA,WAAYA,EAAM,OAAO,UAAUA,EAAM,OAAO,WAAW,SAAS,EAEpE,YAAa,CACX,aAAc,CAChB,EAEA,kBAAmB,CACjB,UAAW,MACb,CACF,CAAC,EACD,gBAAc,OAAI,CAChB,cAAeA,EAAM,QAAQ,IAAI,EACjC,QAAS,OACT,WAAY,QACd,CAAC,EACD,gBAAc,OAAI,CAChB,SAAU,OACV,UAAW,MACX,UAAW,UACX,QAAS,eACT,OAAQ,aAAaA,EAAM,OAAO,OAAO,IAAI,GAC7C,aAAcA,EAAM,MAAM,OAAO,QACjC,YAAa,CACX,SAAU,MACZ,CACF,CAAC,EACD,cAAY,OAAI,CACd,QAAS,OACT,cAAe,SACf,QAASA,EAAM,QAAQ,EAAG,EAAG,EAAG,CAAC,CACnC,CAAC,EACD,WAAS,OAAI,CACX,QAAS,OACT,cAAe,MACf,WAAY,SACZ,qBAAsB,CACpB,WAAY,MACd,CACF,CAAC,EACD,kBAAgB,OAAI,CAClB,YAAa,CACX,aAAc,CAChB,CACF,CAAC,EACD,UAAQ,OAAI,CACV,QAAS,MACX,CAAC,EACD,cAAY,OAAI,CACd,WAAYA,EAAM,QAAQ,CAAC,CAC7B,CAAC,EACD,iBAAe,OAAI,CACjB,cAAeA,EAAM,QAAQ,CAAC,CAChC,CAAC,EACD,QAAM,OAAI,CACR,MAAOA,EAAM,OAAO,KAAK,UACzB,SAAUA,EAAM,WAAW,UAAU,SACrC,SAAU,CACR,MAAOA,EAAM,OAAO,KAAK,IAC3B,CACF,CAAC,EACD,eAAa,OAAI,CACf,SAAU,SACV,KAAM,MACN,QAAS,eACT,UAAW,kBACb,CAAC,CACH,GA2BI+R,GAAmB,KAAgB,CACvC,MAAO,CAAE,aAAc,KAAa,WAAY,KAAM,CAAC,CAAE,EACzD,MAAO,CAAE,aAAc,KAAa,WAAY,KAAM,CAAC,CAAE,CAC3D,GAEMC,GAAuB,CAACC,EAAc/L,IACtC+L,IAAU,SAAW/L,IAAc,KAAc,YAGjD+L,IAAU,SAAW/L,IAAc,KAAc,UAC5C,KAA4B,QAG9B,KAA4B,SAK/BgM,EAAuB,CAAC9R,EAAkB+R,KAevC,CACL,GAAG/R,EACH,UAAW,CACT,GAAGA,EAAI,UACP,MAAO,WAAW+R,EAAQ,KAAK,IAAIA,EAAQ,KAAK,EAClD,CACF,GAGIC,EAAc,CAACpM,EAAqB5F,IACjC4F,EAAK,KAAMqM,GAAMA,EAAE,QAAUjS,EAAI,OAASiS,EAAE,cAAgBjS,EAAI,WAAW,EAG9EkS,EAAY,IAELC,EAAuE,CAAC,CACnF,IAAAnS,EACA,KAAAoS,EACA,cAAAC,EACA,SAAAtM,EACA,mBAAAuM,EACA,mBAAAC,EACA,QAAAC,EACA,cAAAC,CACF,IAAM,CACJ,MAAM5M,KAAgB,UAA8B,IAAI,EAClD6M,KAAe,UAAmC,IAAI,EAItDC,KAAkB,UAAmC,IAAI,EAEzDC,KAAsB,UAAsB,IAAI,EAChDC,KAAsB,UAAsB,IAAI,EAEhDC,MAAsB,UAA8B,IAAI,EACxDC,KAAsB,UAA8B,IAAI,EAExDC,KAAe,UAAoB,CAAE,MAAO,EAAG,MAAO,CAAE,CAAC,EAEzDC,KAAW,OAAY,EACvBrT,KAAQ,MAAU,EAClB3I,EAAS,GAAU2I,CAAK,EAExB,CAACsT,EAAQC,CAAS,KAAI,YAAS,EAAI,EAOnC,CAACxZ,EAASyZ,EAAU,KAAI,YAAkBzB,GAAiB,CAAC,EAC5D0B,GAAa,CAACxB,GAAcyB,KAAiC,CACjEF,GAAYG,IAAM,CAChB,MAAMC,GAAa,CAAE,GAAGD,EAAE,EAC1B,OAAAC,GAAW3B,EAAK,EAAIyB,GAAIC,GAAE1B,EAAK,CAAC,EACzB2B,EACT,CAAC,CACH,EAUMC,MAAgB,UAAO,CAAC,EAExB,CAACC,EAAcC,CAAe,KAAI,YAA2B,IAAI,EACjE,CAACrC,EAAWsC,CAAY,KAAI,YAChCC,EAAA,EAAM,QAAQ,KAAc,yBAA0BA,EAAA,EAAM,QAAQ,KAAc,eAAgB,EAAI,CAAC,CACzG,EACMC,MAAmB,eAAY,IAAM,CACzC,KAAM,CAAE,MAAAC,GAAO,MAAAC,EAAM,EAAIra,EACnBsa,MAAU,MAAY,CAAC,GAAGF,GAAM,KAAM/T,EAAK,GAAGgU,GAAM,IAAI,EAAG,KAAc,SAAS,EAClFE,GAASD,GAAQ,CAAC,EAAE,YAC1B,IAAIE,GAAOF,GAAQA,GAAQ,OAAS,CAAC,EAAE,YAGnCC,KAAWC,KACbA,IAAQ,GAEV,MAAMpH,MAAO,MAASmH,EAAM,EACtBlH,KAAK,MAASmH,EAAI,EAUxB,MARyB,CACvB,KAAApH,GACA,GAAAC,EACA,IAAK,CACH,KAAAD,GACA,GAAAC,CACF,CACF,CAEF,EAAG,CAACrT,EAASqG,CAAG,CAAC,EAEXoU,MAAqB,eAAY,SAAY,CACjD,MAAMV,GAAenB,EAAqB,MAAMA,EAAmBvS,CAAG,EAAI,KAC1E2T,EAAgBD,EAAY,CAC9B,EAAG,CAAC1T,EAAKuS,CAAkB,CAAC,EAEtB8B,GAAgB,SAAY,CAChC,MAAMD,GAAmB,EACzBhB,GAAWzB,GAAiB,CAAC,EAC7BqB,EAAa,QAAU,CAAE,MAAO,EAAG,MAAO,CAAE,EAC5CS,GAAc,SAAW,CAC3B,EAEMa,GAAW,MAAOzC,GAAcoC,KAAmD,CACvFjB,EAAa,QAAQnB,EAAK,GAAK,EAC/B,MAAM0C,GAASN,GAAQ,GAAGpC,KAAU,QAAU,EAAI,EAAE,EACpD,GAAI0C,IAAU,KACZ,MAAM,IAAI,MAAM,iFAAiF,KAGnG,MAAkB,oDAAqD,CACrE,eAAgBA,GAAO,eACvB,MAAOvB,EAAa,QAAQ,MAC5B,MAAOA,EAAa,QAAQ,KAC9B,CAAC,EAED,MAAMwB,GAAY5C,GAAqBC,GAAOQ,CAAa,EAErDtW,GAAS,MAAM0W,EAAcX,EAAqByC,GAAQvB,EAAa,OAAO,EAAG,CACrF,MAAOd,EACP,UAAAsC,EACF,CAAC,EACKC,MAAU,MAAqB1Y,GAAO,IAAI,EAAE,KAElD,OAAIsW,IAAkB,KAAc,WAClCoC,GAAQ,QAAQ,EAGNA,GAAQ,OAAQxC,GACnB,CAACD,EAAYiC,GAAShC,CAAC,CAC/B,CAGH,KAEA,aAAU,IAAM,CACVG,GACFgC,GAAmB,CAEvB,EAAG,CAACA,GAAoBhC,CAAI,CAAC,EAE7B,KAAM,CAACjR,GAAiBuT,EAAkB,KAAI,YAAmB,CAAC,CAAC,EAE7DC,GAAa/a,IAAgB,CACnBuH,GAAgB,QAAQvH,EAAG,IAE3B,IACZ8a,GAAmB,CAAC,GAAGvT,GAAiBvH,EAAG,CAAC,CAEhD,EAEMgb,GAAahb,IAAgB,CACjC,MAAM0E,GAAQ6C,GAAgB,QAAQvH,EAAG,EAErC0E,GAAQ,KACV6C,GAAgB,OAAO7C,GAAO,CAAC,EAC/BoW,GAAmB,CAAC,GAAGvT,EAAe,CAAC,EAE3C,EAEM0T,GAAgB,MAAOhD,IAAiB,CAC5C,KAAM,CAAE,MAAAkC,GAAO,MAAAC,EAAM,EAAIra,EAEzB,GADgBA,EAAQkY,EAAK,EACjB,eAAiB,KAAa,QACxC,OAGFwB,GAAWxB,GAAQiD,KAAa,CAC9B,GAAGA,GACH,aAAc,KAAa,OAC7B,EAAE,EAEF,MAAMC,GAAatB,GAAc,QACjC,GAAI,CAGF,MAAMQ,GAAU,CAAC,GAAGD,GAAM,KAAMhU,EAAK,GAAG+T,GAAM,IAAI,EAE5CU,GAAW,MAAMH,GAASzC,GAAOoC,EAAO,GAAG,IAAKhC,IAEpD,CAACA,GAAE,aAAe,CAACA,GAAE,aAAa,OAAS,CAAE,GAAGA,GAAG,YAAajS,EAAI,WAAY,EAAIiS,EACtF,EACM,CAAC+C,EAAOC,EAAK,KAAI,aAAUR,EAAUS,IAAWA,GAAO,YAAclV,EAAI,WAAW,EACpFmV,GAAW9C,IAAkB,KAAc,UAAY4C,GAAQD,EAC/DI,GAAW/C,IAAkB,KAAc,UAAY2C,EAAQC,GAEjEF,KAAetB,GAAc,SAC/BL,GAAYG,IAAM,CAEhB,MAAM8B,GACJF,GAAS,OAAS,KAAI,MAAY,CAAC,GAAGA,GAAU,GAAG5B,GAAE,MAAM,IAAI,EAAGlB,CAAa,EAAIkB,GAAE,MAAM,KACvF+B,GACJF,GAAS,OAAS,KAAI,MAAY,CAAC,GAAG7B,GAAE,MAAM,KAAM,GAAG6B,EAAQ,EAAG/C,CAAa,EAAIkB,GAAE,MAAM,KAC7F,MAAO,CACL,MAAO,CACL,KAAM8B,GACN,aACExD,KAAU,QACN4C,EAAQ,SAAW,EACjB,KAAa,KACb,KAAa,WACflB,GAAE,MAAM,YAChB,EACA,MAAO,CACL,KAAM+B,GACN,aACEzD,KAAU,QACN4C,EAAQ,SAAW,EACjB,KAAa,KACb,KAAa,WACflB,GAAE,MAAM,YAChB,CACF,CACF,CAAC,CAEL,MAAQ,CACNF,GAAWxB,GAAQiD,KAAa,CAC9B,KAAMA,GAAQ,KACd,aAAc,KAAa,KAC7B,EAAE,CACJ,CACF,EAEMS,GAAc,MAAOC,GAAsCC,KAAmC,CAClG,UAAWC,MAASF,GAAS,CAE3B,GAAI,CAACE,GAAM,eACT,SAGF,MAAMC,GAAgBD,GAAM,OAExBC,KAAkB7C,GAAoB,QACxC+B,GAAc,OAAO,EACZc,KAAkB5C,EAAoB,SAC/C8B,GAAc,OAAO,CAEzB,CACF,KAEA,aAAU,IAAM,CACd,MAAMe,GAAS/P,EAAc,QACvBgQ,GAAY/C,GAAoB,QAChCgD,GAAY/C,EAAoB,QAEtC,GAAI6C,IAAU,KAEZ,OAGF,MAAMH,GAAW,IAAI,qBAAqBF,GAAa,CAAE,KAAMK,EAAO,CAAC,EAEvE,OAAIC,IAAa,MACfJ,GAAS,QAAQI,EAAS,EAGxBC,IAAa,MACfL,GAAS,QAAQK,EAAS,EAGrB,IAAM,CACXL,GAAS,WAAW,CACtB,CACF,CAAC,EAED,MAAMM,MAAiB,eAAY,IAAM,CACvCpD,EAAgB,SAAS,eAAe,CAAE,MAAO,QAAS,CAAC,EAC3DD,EAAa,SAAS,eAAe,CAAE,MAAO,QAAS,CAAC,CAC1D,EAAG,CAACC,EAAiBD,CAAY,CAAC,KAElC,mBAAgB,IAAM,CACpB,MAAMsD,GAAUnQ,EAAc,QAC9B,GAAImQ,IAAW,KACb,OAGF,MAAMC,GAAmBpD,EAAoB,QACvCqD,GAAsBF,GAAQ,aAEpC,GADAnD,EAAoB,QAAUqD,GAC1BD,KAAqBC,GAAqB,CAE5CH,GAAe,EACf,MACF,CAIA,GAAI/C,EAAa,QAAQ,OAAS,GAAKA,EAAa,QAAQ,OAAS,EAAG,CACtE+C,GAAe,EACf,MACF,CAEA,MAAMI,GAAmBvD,EAAoB,QACvCwD,GAAgBJ,GAAQ,aAE9B,GADApD,EAAoB,QAAUwD,GAC1BD,IAAoB,KAAM,CAC5B,MAAME,GAAeL,GAAQ,WAAaI,GAAgBD,IAC1DH,GAAQ,UAAYK,EACtB,CACF,EAAG,CAAC1c,EAAQ,MAAM,KAAMoc,EAAc,CAAC,KAEvCO,EAAA,GAASlC,GAAoB,CAAC7B,EAAoBvS,CAAG,CAAC,EAEtD,MAAMuW,GAAoB5c,EAAQ,MAAM,aAClC6c,GAAoB7c,EAAQ,MAAM,aAClCyJ,GAAY0Q,GAAiB,EAEnC,SACE,QAAC2C,GAAA,GACC,OAAQrE,EACR,SAAO,MAAE,+CAAgD,aAAa,EACtE,iBAAkBnb,EAAO,WACzB,UAAWA,EAAO,MAClB,UAAWub,EAEV,UAAAjb,EAAA,EAAO,eAAe,yBAA2B+a,MAChD,OAAC,OAAI,UAAWrb,EAAO,aAAe,SAAAqb,EAAmBtS,EAAKqU,EAAa,EAAE,KAE/E,OAAC,OAAI,aAAW,MAAGpd,EAAO,QAASA,EAAO,aAAa,EACrD,mBAAC,OACC,mBAACoa,EAAA,CACC,UAAAC,EACA,kBAAmBsC,EACnB,oBAAqBmC,EAAA,CACvB,EACF,EACF,KACA,OAAC,OAAI,IAAKlQ,EAAe,UAAW5O,EAAO,aACzC,mBAAC,SACC,oBAAC,SACC,oBAAC,MACC,oBAAC,MAAG,UAAWA,EAAO,YACnB,UAAAsf,KAAsB,KAAa,MAAQA,KAAsB,KAAa,UAC7E,OAAC,OAAI,IAAKzD,GACR,mBAAC4D,EAAA,EAAgB,CAAC,UAAU,OAAQ,GACtC,EAEDH,KAAsB,KAAa,UAClC,OAAC,OACC,mBAAC,MAAK,CAAC,QAAQ,yDAAyD,oCAExE,EACF,EAEDA,KAAsB,KAAa,SAClC,OAAC,OACC,mBAAC,MAAK,CAAC,QAAQ,oDAAoD,mCAAuB,EAC5F,GAEJ,EACF,KACA,OAAC,MACC,mBAAC,MAAG,UAAWtf,EAAO,eACpB,mBAAC0f,EAAA,GACC,QAAShd,EAAQ,MAAM,KACvB,cAAe,KAAkB,KACjC,WAAYka,EAAA,EAAM,QAAQ,KAAc,WAAY,EAAK,EACzD,SAAUA,EAAA,EAAM,QAAQ,KAAc,SAAU,EAAI,EACpD,eAAgBvC,EAChB,mBAAoBuC,EAAA,EAAM,QAAQ,KAAc,mBAAoB,EAAK,EACzE,iBAAkB,GAClB,SAAA9N,EACA,gBAAA5E,GACA,iBAAkBwT,GAClB,iBAAkBC,GAClB,cAAe,KACf,UAAAxR,EAAA,CACF,EACF,EACF,KACA,OAAC,MAAG,IAAKuP,CAAA,CAAiB,KAC1B,OAAC,MAAG,IAAKD,EAAc,aAAW,MAAGzb,EAAO,MAAOic,EAASjc,EAAO,OAAS,IAAI,EAAG,cAAY,YAC7F,mBAAC,MAAG,UAAWA,EAAO,eACpB,mBAAC0f,EAAA,GACC,QAAS,CAAC3W,CAAG,EACb,cAAe,KAAkB,KACjC,WAAY6T,EAAA,EAAM,QAAQ,KAAc,WAAY,EAAK,EACzD,SAAUA,EAAA,EAAM,QAAQ,KAAc,SAAU,EAAI,EACpD,eAAgBvC,EAChB,mBAAoBuC,EAAA,EAAM,QAAQ,KAAc,mBAAoB,EAAK,EACzE,iBAAkB,GAClB,SAAA9N,EACA,gBAAA5E,GACA,iBAAkBwT,GAClB,iBAAkBC,GAClB,YAAa,IAAMzB,EAAU,EAAK,EAClC,UAAW,IAAMA,EAAU,EAAI,EAC/B,WAAYD,EAAS,CAAClT,EAAI,GAAG,EAAI,OACjC,mBAAoB,GACpB,cAAe,KACf,UAAAoD,EAAA,CACF,EACF,EACF,KACA,OAAC,MACC,mBAAC,MACC,+BACE,mBAACuT,EAAA,GACC,QAAShd,EAAQ,MAAM,KACvB,cAAe,KAAkB,KACjC,WAAYka,EAAA,EAAM,QAAQ,KAAc,WAAY,EAAK,EACzD,SAAUA,EAAA,EAAM,QAAQ,KAAc,SAAU,EAAI,EACpD,eAAgBvC,EAChB,mBAAoBuC,EAAA,EAAM,QAAQ,KAAc,mBAAoB,EAAK,EACzE,iBAAkB,GAClB,SAAA9N,EACA,gBAAA5E,GACA,iBAAkBwT,GAClB,iBAAkBC,GAClB,cAAe,KACf,UAAAxR,EAAA,CACF,EACF,EACF,EACF,KACA,OAAC,MACC,oBAAC,MAAG,UAAWnM,EAAO,YACnB,UAAAuf,KAAsB,KAAa,MAAQA,KAAsB,KAAa,UAC7E,OAAC,OAAI,IAAKzD,EACR,mBAAC2D,EAAA,EAAgB,CAAC,UAAU,OAAQ,GACtC,EAEDF,KAAsB,KAAa,UAClC,OAAC,OACC,mBAAC,MAAK,CAAC,QAAQ,yDAAyD,oCAExE,EACF,EAEDA,KAAsB,KAAa,SAClC,OAAC,OACC,mBAAC,MAAK,CAAC,QAAQ,oDAAoD,mCAAuB,EAC5F,GAEJ,EACF,GACF,EACF,EACF,KAEA,OAACC,GAAA,EAAM,UAAN,CACE,SAAA/C,GAAc,YAAY,QACzB,OAAChC,EAAA,IACC,QAAQ,YACR,QAAS,SAAY,CACnB,IAAIkF,GAAQ5W,EAAI,IACZA,EAAI,UAAU,QAEhB4W,GAAQ5W,EAAI,IAAI,QAAQA,EAAI,UAAU,MAAO0T,EAAa,KAAK,GAGjET,KACE,MAAU,CACR,QAAS,CAACS,CAAY,EACtB,MAAOtQ,GACP,cAAesQ,EAAa,WAAY,IACxC,YAAa,CACX,KAAM,CACJ,GAAIkD,EACN,CACF,CACF,CAAC,CACH,EACApE,EAAQ,KACR,MAAkB,2DAA4D,CAC5E,eAAgBxS,EAAI,eACpB,UAAWA,EAAI,GACjB,CAAC,CACH,EAEA,mBAAC,MAAK,CAAC,QAAQ,gDAAgD,8BAAkB,EACnF,EAEJ,GACF,CAEJ,C,kGCjpBA,MAAML,EAAaC,IAA0B,CAC3C,gBAAc,OAAI,CAChB,MAAO,iBACP,OAAQ,GAAG,SAASA,EAAM,QAAQ,CAAC,EAAG,EAAE,EAAI,IAAI,MAClD,CAAC,EACD,sBAAoB,OAAI,CACtB,MAAO,yBACP,MAAOA,EAAM,OAAO,QAAQ,KAC5B,SAAU,UACZ,CAAC,EACD,qBAAmB,OAAI,CACrB,MAAO,wBACP,QAAS,OACT,aAAc,KAChB,CAAC,EACD,qBAAmB,OAAI,CACrB,MAAO,wBACP,KAAM,EACN,aAAc,WACd,SAAU,QACZ,CAAC,EACD,qBAAmB,OAAI,CACrB,MAAO,wBACP,UAAW,QACX,WAAYA,EAAM,QAAQ,GAAI,CAChC,CAAC,EACD,uBAAqB,OAAI,CACvB,MAAO,0BACP,UAAW,QACX,WAAYA,EAAM,QAAQ,GAAI,EAC9B,MAAOA,EAAM,QAAQ,GAAG,CAC1B,CAAC,EACD,mBAAiB,OAAI,CACnB,MAAO,sBACP,OAAQA,EAAM,QAAQ,EAAG,EACzB,SAAU,SACV,WAAYA,EAAM,OAAO,KAAK,QAChC,CAAC,EACD,wBAAsB,OAAI,CACxB,MAAO,2BACP,OAAQA,EAAM,QAAQ,EAAG,EACzB,SAAU,SACV,WAAYA,EAAM,OAAO,QAAQ,IACnC,CAAC,CACH,GASaiX,EAAmB,CAAC,CAAE,OAAA9T,EAAQ,MAAA+T,EAAO,WAAAC,EAAY,MAAA7f,EAAM,IAAa,CAC/E,MAAM8f,KAAQ,MAAWrX,CAAS,EAC5BsX,EAAU,GAAG,KAAK,MAAMF,EAAa,GAAG,CAAC,IACzCG,EAAW,CAAE,MAAOD,CAAQ,EAC5BhT,EAAYlB,KAAS,MAAG,CAACiU,EAAM,aAAcA,EAAM,kBAAkB,CAAC,KAAI,MAAG,CAACA,EAAM,YAAY,CAAC,EAEvG,SACE,QAAC,OAAI,UAAA/S,EACH,qBAAC,OAAI,aAAW,MAAG,CAAC+S,EAAM,iBAAiB,CAAC,EAC1C,oBAAC,OAAI,aAAW,MAAG,CAACA,EAAM,iBAAiB,CAAC,EAAG,MAAO9f,GACnD,SAAAA,EAAA,CACH,KACA,OAAC,OAAI,aAAW,MAAG,CAAC8f,EAAM,iBAAiB,CAAC,EAAI,SAAAF,CAAA,CAAM,KACtD,OAAC,OAAI,aAAW,MAAG,CAACE,EAAM,mBAAmB,CAAC,EAAI,SAAAC,CAAA,CAAQ,GAC5D,KACA,OAAC,OAAI,aAAW,MAAG,CAACD,EAAM,eAAe,CAAC,EACxC,mBAAC,OAAI,aAAW,MAAG,CAACA,EAAM,oBAAoB,CAAC,EAAG,MAAOE,CAAA,CAAU,EACrE,GACF,CAEJ,EAEAL,EAAiB,YAAc,mBCvE/B,MAAMM,EAAkB,EAElB,EAAavX,IACV,CACL,aAAW,OAAI,CACb,MAAO,aACP,WAAY,UACZ,MAAOA,EAAM,OAAO,KAAK,QACzB,UAAW,YACX,MAAO,cACP,SAAU,MACZ,CAAC,EACD,mBAAiB,OAAI,CACnB,MAAO,qBACP,aAAc,aAAaA,EAAM,OAAO,OAAO,MAAM,GACrD,QAAS,MACX,CAAC,EACD,kBAAgB,OAAI,CAClB,MAAO,oBACP,WAAYA,EAAM,WAAW,iBAC7B,aAAcA,EAAM,QAAQ,CAAC,EAC7B,QAAS,eACT,WAAY,SACZ,aAAc,WACd,SAAU,CACZ,CAAC,EACD,kBAAgB,OAAI,CAClB,MAAO,oBACP,OAAQ,SACV,CAAC,EACD,iBAAe,OAAI,CACjB,MAAO,mBACP,QAAS,SACX,CAAC,CACH,GAYW6C,GAAgB,CAAC,CAAE,UAAAwB,EAAW,MAAA6G,EAAO,SAAAsM,EAAU,MAAAC,GAAO,MAAAngB,EAAO,QAAAyJ,CAAQ,IAAa,CAC7F,MAAMqW,KAAQ,MAAW,CAAS,EAC5BpR,KAAO,WAAQ,IAAM,CACzB,MAAM0R,EAAUD,GAAM,MAAM,EAAGF,CAAe,EAC9C,IAAII,EAAYD,EAAQ,KAAMtX,IAAQA,GAAI,QAAU9I,CAAK,EACrDsgB,GAAYH,GAAM,MAAMF,CAAe,EAC3C,MAAMM,EAAkB,CAACF,EAGzB,OAAIE,IACFF,EAAYC,GAAU,KAAMxX,IAAQA,GAAI,QAAU9I,CAAK,EACvDsgB,GAAYA,GAAU,OAAQxX,IAAQA,GAAI,QAAU9I,CAAK,GAEpD,CAAE,QAAAogB,EAAS,UAAAE,GAAW,gBAAAC,EAAiB,UAAAF,CAAU,CAC1D,EAAG,CAACF,GAAOngB,CAAK,CAAC,EAEXwgB,MAAa,WAAQ,IAAM9R,EAAK,UAAU,OAAO,CAACnF,EAAKT,IAAQS,EAAMT,EAAI,MAAO,CAAC,EAAG,CAAC4F,EAAK,SAAS,CAAC,EAEpG+R,KADW,WAAQ,IAAM/R,EAAK,QAAQ,OAAO,CAACnF,EAAKT,IAAQS,EAAMT,EAAI,MAAO,CAAC,EAAG,CAAC4F,EAAK,OAAO,CAAC,EAC3E8R,GACnBE,EAAkBF,GAAaC,EAErC,SACE,QAAC,OAAI,UAAW1T,GAAa+S,EAAM,UAAW,cAAY,gBACxD,oBAAC,OAAI,UAAWA,EAAM,gBACpB,mBAAC,OAAI,UAAWA,EAAM,eACnB,SAAArW,KACG,KACE,iDACA,4DACA,CACE,MAAAmK,EACA,MAAA6M,EACA,SAAAP,CACF,CACF,KACA,KACE,iDACA,2DACF,EACN,EACF,KACA,QAAC,OAAI,UAAWJ,EAAM,cACnB,UAAApR,EAAK,QAAQ,IAAKlF,MACjB,OAACmW,EAAgB,CAAmB,GAAGnW,EAAM,OAAQA,EAAK,QAAUxJ,CAAA,EAA7CwJ,EAAK,KAA+C,CAC5E,EACAkF,EAAK,iBAAmBA,EAAK,cAC5B,OAACiR,EAAgB,CAA6B,GAAGjR,EAAK,UAAW,OAAM,IAAhDA,EAAK,UAAU,KAAkC,EAEzE8R,GAAa,MACZ,OAACb,EAAgB,CAAkB,MAAOa,GAAY,MAAM,QAAQ,WAAYE,CAAA,EAA1D,YAA2E,GAErG,GACF,CAEJ,C,4SC/BO,MAAMC,MAAiB,iBAAkC,CAC9D,IAAK,MAAQ,QACb,aAAc,IAAM,CAAC,EACrB,iBAAkB,GAClB,cAAe,KAAkB,KACjC,iBAAkB,IAAM,GACxB,YAAa,UACb,aAAc,EACd,gBAAiB,CAAC,EAClB,aAAc,IAAM,CAAC,EACrB,iBAAkB,GAClB,aAAc,CAAC,EACf,YAAa,GACb,SAAU,UACV,oBAAqB,GACrB,eAAgB,GAChB,oBAAqB,IAAM,CAAC,EAC5B,iBAAkB,IAAM,CAAC,EACzB,eAAgB,IAAM,CAAC,EACvB,gBAAiB,IAAM,CAAC,EACxB,gBAAiB,IAAM,CAAC,EACxB,YAAa,IAAM,CAAC,EACpB,eAAgB,IAAM,CAAC,EACvB,gBAAiB,IAAM,CAAC,EACxB,cAAe,IAAM,CAAC,EACtB,gBAAiB,IAAM,CAAC,EACxB,YAAa,IAAM,CAAC,EACpB,oBAAqB,IAAM,CAAC,EAC5B,aAAc,IAAM,CAAC,EACrB,sBAAuB,IAAM,CAAC,EAC9B,uBAAwB,IAAM,CAAC,EAC/B,kBAAmB,IAAM,CAAC,EAC1B,YAAa,CAAC,EACd,SAAU,GACV,UAAW,KAAc,UACzB,mBAAoB,GACpB,oBAAqB,KACrB,cAAe,IAAM,CAAC,EACtB,eAAgB,GAChB,qBAAsB,GACtB,mBAAoB,IAAM,CAAC,CAC7B,CAAC,EAEYC,EAAyBle,GACH,WAAWie,EAAc,EAC9Cje,CAAG,EAGJme,EAAoB,OACxB,cAAWF,EAAc,EAGrBG,EAAkBhhB,GAAsB,CACnD,KAAM,CAAE,WAAAihB,CAAW,KAAI,cAAWJ,EAAc,EAChD,OAAOI,GAAY,KAAMC,GAAUA,IAAUlhB,EAAI,KAAK,CACxD,EAEamhB,EAAuBnhB,GAAsB,CACxD,KAAM,CAAE,iBAAAohB,CAAiB,KAAI,cAAWP,EAAc,EACtD,OAAOO,GAAoBA,IAAqBphB,EAAI,GACtD,EA8DaqhB,EAAyB,CAAC,CACrC,IAAAzX,EACA,SAAA4E,EACA,iBAAA8S,EACA,iBAAAC,EACA,qBAAAC,EACA,YAAaC,EAAkBD,EAC1B,IAAM,IAAI,GAAGA,CAAoB,cAAc,GAAKE,EAAsBJ,CAAgB,EAC3FI,EAAsBJ,CAAgB,EAC1C,cAAAK,EACA,gBAAAxX,EACA,aAAAyX,EACA,SAAAC,EACA,oBAAAC,EACA,mBAAAvG,EACA,KAAAwG,GACA,uBAAAC,EACA,SAAAC,EACA,mBAAAC,EACA,eAAAC,EACA,mBAAA/Y,EACA,sBAAAC,EACA,oBAAA+Y,EACA,uBAAAC,EACA,iBAAAnV,GACA,iBAAAC,GACA,mBAAAmV,GACA,eAAAC,EACA,iBAAAC,EACA,UAAAlY,EACA,cAAAmY,EACA,YAAAC,GACA,iBAAAtB,GACA,0BAAA7W,GACA,WAAA0W,GACA,aAAc0B,GACd,mBAAAjF,GACA,aAAAkF,GACA,kBAAAC,GACA,SAAAC,GACA,iBAAAC,GACA,UAAAjU,GACA,mBAAAhP,GACA,oBAAAkjB,GAAsBxB,EACjB,IAAM,IAAI,GAAGA,CAAoB,sBAAsB,GAAK,KAC7D,KACJ,eAAgByB,EAClB,IAAa,CACX,KAAM,CAACC,GAAcC,EAAe,KAAI,YAAuB,CAC7D,cAAAxB,EACA,aACEC,IAAiBJ,EAAuB,IAAM,UAAU,GAAGA,CAAoB,gBAAiB,CAAC,CAAC,EAAI,CAAC,GACzG,SAAAK,EACA,YAAaL,EAAuB,IAAM,QAAQ,GAAGA,CAAoB,eAAgB,EAAK,EAAI,GAClG,WAAAP,GACA,SAAA6B,GACA,iBAAAC,GACA,UAAAjU,GACA,mBAAAhP,GACA,oBAAAkjB,EACF,CAAC,EACK,CAACI,GAAaC,EAAc,KAAI,YAAyB,CAAC,CAAC,EAC3D,CAACC,GAAcC,EAAoB,KAAI,YAC3CC,GAAgBlC,EAAkBE,EAAsB,OAAWC,EAAiBmB,EAAY,CAClG,EACM,CAACa,EAAaC,CAAc,KAAI,YACpCjC,GAAmBC,EAAsBJ,CAAgB,CAC3D,EACM,CAAE,YAAaqC,GAAsB,cAAAC,EAAc,KAAI,gBAAa,EACpE,CAACC,GAAcC,EAAoB,KAAI,YAASnB,EAAgB,EAChE,CAACvY,GAAgB2Z,EAAsB,KAAI,YAASd,EAAkB,KAE5E,aAAU,IAAM,CACVd,MAGJ,KAAsB,iBAAiBvY,CAAG,kBAAmB,CAC3D,cAAA+X,EACA,SAAAE,EACA,YAAaqB,GAAa,YAC1B,qBAAmB,MAAgB1B,CAAoB,EACvD,SAAAsB,GACA,iBAAAC,GACA,mBAAAjjB,GACA,eAAAsK,GACA,aAAAyZ,GACA,aAAAP,GACA,YAAAG,EACA,oBAAqBtZ,EAAgB,OAAS,EAC9C,oBAAqB+Y,GAAa,mBACpC,CAAC,CAGH,EAAG,CAAC,CAAC,EAEL,MAAMc,MAAsB,WAAQ,IAC9B,CAAC,IAAO,eAAe,oBAAsB,CAACtG,IAAsBmF,KAAsB,GACrF,CAAC,KAEH,MAA0Bd,EAAI,EACpC,CAACA,GAAMrE,GAAoBmF,EAAiB,CAAC,KAGhD,aAAU,IAAM,CACV,IAAO,eAAe,oBAAsBA,KAAsB,IACpEP,KAAqB,yBAA0B0B,EAAmB,CAEtE,EAAG,CAAC1B,GAAoB0B,GAAqBnB,EAAiB,CAAC,KAE/D,aAAU,IAAM,CACV1Y,EAAgB,OAAS,GAAK,CAACuT,IAG/BsG,GAAoB,QACtBtG,GAAmBsG,EAAmB,CAE1C,EAAG,CAAC7Z,EAAgB,OAAQ6Z,GAAqBtG,EAAkB,CAAC,KAGpE,aAAU,IAAM,CAEd,GAAIkF,IAAgBhZ,IAAQ,MAAQ,YAClC,OAEF,MAAMqa,GAAW,CACf,GAAGf,GACH,cAAAvB,EACA,SAAAmB,GACA,iBAAAC,GACA,UAAAjU,GACA,mBAAAhP,EACF,KACK,MAAeojB,GAAce,EAAQ,GACxCd,GAAgBc,EAAQ,CAE5B,EAAG,CAACra,EAAK+X,EAAeuB,GAAcN,GAAcE,GAAUC,GAAkBjU,GAAWhP,EAAkB,CAAC,KAG9G,aAAU,IAAM,CACV8hB,IAAiB,QAGrBuB,GAAiBD,OACV,MAAeA,GAAa,aAActB,CAAY,EAGpDsB,GAFE,CAAE,GAAGA,GAAc,aAAAtB,CAAa,CAG1C,CACH,EAAG,CAACA,CAAY,CAAC,KAGjB,aAAU,IAAM,CACVH,GACFiC,EAAejC,CAAe,CAElC,EAAG,CAACA,CAAe,CAAC,KAGpB,aAAU,IAAM,CACd0B,GAAiBD,KAAkB,CAAE,GAAGA,GAAc,SAAArB,CAAS,EAAE,CACnE,EAAG,CAACA,CAAQ,CAAC,KAGb,aAAU,IAAM,IACT,MAAeqB,GAAa,YAAc,CAAC,EAAGjC,IAAc,CAAC,CAAC,GACjEkC,GAAgB,CAAE,GAAGD,GAAc,WAAAjC,EAAW,CAAC,CAEnD,EAAG,CAACiC,GAAcjC,EAAU,CAAC,KAG7B,aAAU,IAAM,CACd,GAAI,CAACmC,GAAY,OACf,OAEF,MAAMc,GAAiBd,GAAY,OAChCe,IAAgBpC,GAAK,UAAW/hB,IAAQA,GAAI,MAAQmkB,GAAY,GAAG,GAAK,CAC3E,EACID,GAAe,SAAWd,GAAY,QACxCC,GAAea,EAAc,CAEjC,EAAG,CAACnC,GAAMqB,EAAW,CAAC,KAGtB,aAAU,IAAM,CACdG,GAAqBC,GAAgBlC,EAAkBE,EAAsB,OAAWiC,EAAab,EAAY,CAAC,CACpH,EAAG,CAACtB,EAAkBmC,EAAajC,EAAsBoB,EAAY,CAAC,KAGtE,aAAU,IAAM,CACd,GAAI,CAACtB,EACH,OAEF,MAAM8C,MAAe,YAAS,IAAM,CAClCb,GAAsBD,IACpBE,GAAgBlC,EAAkBE,EAAsB8B,GAAcG,EAAab,EAAY,CACjG,CACF,EAAG,EAAE,EACCnE,GAAW,IAAI,eAAe,IAAM2F,GAAa,CAAC,EACxD,OAAA3F,GAAS,QAAQ6C,CAAgB,EAC1B,IAAM7C,GAAS,WAAW,CACnC,EAAG,CAAC6C,EAAkBmC,EAAajC,EAAsBoB,EAAY,CAAC,KAGtE,aAAU,IAAM,CACVD,KAAqB,QACvBmB,GAAqBnB,EAAgB,CAEzC,EAAG,CAACA,EAAgB,CAAC,KAGrB,aAAU,IAAM,CACdoB,GAAuBd,EAAkB,CAC3C,EAAG,CAACA,EAAkB,CAAC,KAGvB,aAAU,IAAM,CACdE,GAAiBrZ,KAAW,CAC1B,GAAGA,GACH,oBAAAkZ,EACF,EAAE,CACJ,EAAG,CAACA,EAAmB,CAAC,KAGxB,aAAU,IAAM,CACVH,KAAsB,IAASnF,IACjCA,GAAmB,CAAC,CAAC,CAEzB,EAAG,CAACA,GAAoBmF,EAAiB,CAAC,EAE1C,MAAMwB,GAA4B,IAAM,QACtC,GAAG7C,CAAoB,oBACvB8C,EAA+BhD,GAAoB,IAAI,CACzD,EAEM,CAACiD,GAAkBC,EAAmB,KAAI,YAAkBH,EAAyB,EAErFI,MAAmB,eACtBzkB,IAAsB,CAAC,CAACojB,GAAY,KAAMsB,IAAaA,GAAS,MAAQ1kB,GAAI,GAAG,EAChF,CAACojB,EAAW,CACd,EAEMuB,MAAmB,eACtBhD,IAAqC,CACpCwB,GAAgB,CAAE,GAAGD,GAAc,cAAAvB,EAAc,CAAC,EAClDW,KAAqB,gBAAiBX,EAAa,CACrD,EACA,CAACuB,GAAcZ,EAAkB,CACnC,EAEMsC,MAAc,eACjB/C,IAA8B,CACzBL,GACF,IAAM,IAAI,GAAGA,CAAoB,YAAaK,EAAQ,EAExDsB,GAAiBD,KAAkB,CAAE,GAAGA,GAAc,SAAArB,EAAS,EAAE,EACjES,KAAqB,WAAYT,EAAQ,CAC3C,EACA,CAACL,EAAsBc,EAAkB,CAC3C,EAEMuC,MAAiB,eACpBC,IAAyB,CACxB3B,GAAgB,CAAE,GAAGD,GAAc,YAAA4B,EAAY,CAAC,CAClD,EACA,CAAC5B,EAAY,CACf,EAEM6B,MAAkB,eACrBnD,IAA6B,CAC5BuB,GAAgB,CAAE,GAAGD,GAAc,aAAAtB,EAAa,CAAC,EACjDU,KAAqB,eAAgBV,EAAY,CACnD,EACA,CAACsB,GAAcZ,EAAkB,CACnC,EAEM0C,MAAgB,eACnB/D,IAAyB,CACxBkC,GAAgB,CAAE,GAAGD,GAAc,WAAAjC,EAAW,CAAC,EAC/CqB,KAAqB,aAAcrB,EAAU,CAC/C,EACA,CAACiC,GAAcZ,EAAkB,CACnC,EAEM2C,MAAc,eACjBnC,IAAsB,CACrB,MAAMoC,GAAqBpC,KAAa,GAAQ,KAAOI,GAAa,oBACpEC,GAAgB,CACd,GAAGD,GACH,SAAAJ,GACA,oBAAqBoC,EACvB,CAAC,EACD5C,KAAqB,WAAYQ,EAAQ,EACrCtB,IACF,IAAM,IAAI,GAAGA,CAAoB,YAAasB,EAAQ,EACtD,IAAM,IAAI,GAAGtB,CAAoB,uBAAwB0D,EAAkB,EAE/E,EACA,CAAChC,GAAc1B,EAAsBc,EAAkB,CACzD,EAEM6C,MAAsB,eACzBpC,IAA8B,CAC7BI,GAAgB,CAAE,GAAGD,GAAc,iBAAAH,EAAiB,CAAC,EACrDT,KAAqB,mBAAoBS,EAAgB,EACrDvB,GACF,IAAM,IAAI,GAAGA,CAAoB,cAAeuB,EAAgB,CAEpE,EACA,CAACG,GAAc1B,EAAsBc,EAAkB,CACzD,EAEM8C,MAAkB,eACrBvB,IAA0B,CACzBC,GAAqBD,EAAY,EAC7BrC,GACF,IAAM,IAAI,GAAGA,CAAoB,sBAAuBqC,EAAY,EAEtEvB,KAAqB,qBAAsBuB,EAAY,CACzD,EACA,CAACrC,EAAsBc,EAAkB,CAC3C,EAEM+C,MAAwB,eAC3BvlB,IAAgC,CAC/BqjB,GAAgB,CAAE,GAAGD,GAAc,mBAAApjB,EAAmB,CAAC,EACvDwiB,KAAqB,qBAAsBxiB,EAAkB,EACzD0hB,GACF,IAAM,IAAI,GAAGA,CAAoB,sBAAuB1hB,EAAkB,CAE9E,EACA,CAACojB,GAAc1B,EAAsBc,EAAkB,CACzD,EAEMgD,MAAe,eAClBxW,IAA6B,CAC5BqU,GAAgB,CAAE,GAAGD,GAAc,UAAApU,EAAU,CAAC,EAC9CwT,KAAqB,YAAaxT,EAAS,EACvC0S,GACF,IAAM,IAAI,GAAGA,CAAoB,aAAc1S,EAAS,CAE5D,EACA,CAACoU,GAAc1B,EAAsBc,EAAkB,CACzD,EAEMiD,MAAoB,eACvBnb,IAA4B,CAC3B2Z,GAAuB3Z,EAAc,EACjCoX,GACF,IAAM,IAAI,GAAGA,CAAoB,kBAAmBpX,EAAc,EAEpEkY,KAAqB,iBAAkBlY,EAAc,CACvD,EACA,CAACoX,EAAsBc,EAAkB,CAC3C,EAEMkD,MAAe,eAClBC,IAA2B,CAC1B,MAAMC,GACJxC,GAAa,aAAa,SAAW,EACjCnB,GACAA,GAAK,OAAQ/hB,IAAQkjB,GAAa,aAAa,SAASljB,GAAI,QAAQ,CAAC,KAC3E,OAASylB,GAAQC,GAAczD,EAAU9X,CAAe,CAC1D,EACA,CAACA,EAAiB+Y,GAAa,aAAcnB,GAAME,CAAQ,CAC7D,EAEM0D,MAAe,eAAY,IAAM,CACrCvC,GAAY,QAASpjB,IAAQ4lB,EAA4B5lB,EAAG,CAAC,EAC7DqjB,GAAe,CAAC,CAAC,CACnB,EAAG,CAACD,EAAW,CAAC,EAEVyC,MAAgB,eACnB7lB,IAAsB,CACrB,GAAI,CAACuhB,EACH,OAEF,MAAMuE,GAAQ1C,GAAY,KAAM2C,IAAaA,KAAa/lB,IAAO+lB,GAAS,MAAQ/lB,GAAI,GAAG,EACrF8lB,IACFF,EAA4BE,EAAK,EACjCzC,GAAeD,GAAY,OAAQ2C,IAAaA,KAAa/lB,IAAO+lB,GAAS,MAAQ/lB,GAAI,GAAG,CAAC,GAG7FqjB,GAAe,CAAC,GAAGD,GAAapjB,EAAG,CAAC,CAExC,EACA,CAACuhB,EAAkB6B,EAAW,CAChC,EAEM4C,MAAkB,eACrBC,IAAkB,CACjB,GAAI,CAACzE,GAAwB,CAACF,EAC5B,OAGF,MAAM4E,GAAW5E,EAAiB,YAAc,KAC5C2E,GAAQC,KAIZ,IAAM,IAAI,GAAG1E,CAAoB,gBAAiByE,EAAK,EACvD1C,GAAqB0C,EAAK,EAC5B,EACA,CAAC3E,EAAkBE,CAAoB,CACzC,EAEM2E,MAAyB,eAC5BnD,IAAoD,CAC/CxB,GACF,IAAM,IAAI,GAAGA,CAAoB,uBAAwBwB,EAAmB,EAE9EG,GAAiBrZ,KAAW,CAC1B,GAAGA,GACH,oBAAAkZ,EACF,EAAE,CACJ,EACA,CAACxB,CAAoB,CACvB,EAEM4E,MAAqB,eACxBpmB,IAAsB,CAChB4jB,IAGLyC,EAAoBzC,GAAe5jB,EAAG,CACxC,EACA,CAAC4jB,EAAa,CAChB,EAEM0C,MAAoB,WAAQ,IAAMvE,GAAK,KAAM/hB,IAAQ,CAAC,IAAC,OAAeA,EAAG,CAAC,EAAG,CAAC+hB,EAAI,CAAC,EACnFwE,MAAiB,WAAQ,IAAMxE,GAAK,KAAM/hB,IAAQ,CAAC,IAAC,OAAiBA,EAAG,CAAC,EAAG,CAAC+hB,EAAI,CAAC,EAClFyE,MAAsB,WAAQ,IAAMzE,GAAK,KAAM9G,IAAMA,GAAE,mBAAmB,EAAG,CAAC8G,EAAI,CAAC,EAEzF,SACE,OAAClB,GAAe,SAAf,CACC,MAAO,CACL,IAAAjX,EACA,aAAA+b,GACA,iBAAApB,GACA,iBAAAE,GACA,cAAevB,GAAa,cAC5B,YAAAO,EACA,aAAAH,GACA,gBAAAnZ,EACA,aAAAqb,GACA,iBAAAjE,EACA,aAAc2B,GAAa,aAC3B,SAAUA,GAAa,SACvB,YAAaA,GAAa,YAC1B,kBAAAoD,GACA,eAAAC,GACA,oBAAAC,GACA,oBAAA1E,EACA,mBAAAvG,EACA,mBAAA2G,EACA,uBAAAF,EACA,qBAAAR,EACA,eAAgBW,GAAkB,GAClC,mBAAA/Y,EACA,sBAAAC,EACA,oBAAA+Y,EACA,uBAAAC,EACA,iBAAAnV,GACA,iBAAAC,GACA,eAAAoV,EACA,iBAAAC,EACA,UAAAlY,EACA,cAAAmY,EACA,YAAAC,GACA,iBAAAtB,GACA,0BAAA7W,GACA,WAAY2Y,GAAa,WACzB,aAAAW,GACA,oBAAAW,GACA,iBAAAG,GACA,eAAAjB,EACA,gBAAAsC,GACA,mBAAAtI,GACA,gBAAAqH,GACA,YAAAH,GACA,eAAAC,GACA,gBAAA1B,GACA,cAAA6B,GACA,gBAAAI,GACA,YAAAH,GACA,oBAAAE,GACA,aAAAG,GACA,sBAAAD,GACA,uBAAAc,GACA,kBAAAZ,GACA,YAAAnC,GACA,SAAUF,GAAa,SACvB,iBAAkBA,GAAa,iBAC/B,UAAWA,GAAa,UACxB,mBAAoBA,GAAa,mBACjC,oBAAqBA,GAAa,oBAClC,cAAA2C,GACA,eAAAzb,GACA,qBAAAuZ,GACA,mBAAAyC,EACF,EAEC,SAAA5X,CAAA,CACH,CAEJ,EAEO,SAASiY,GAAgBvmB,EAAwC,CACtE,OAAOA,IAAU,KAAc,WAAaA,IAAU,KAAc,UACtE,CAEO,SAASwmB,EAAgBxmB,EAA4C,CAC1E,OACEA,IAAU,KAAkB,OAC5BA,IAAU,KAAkB,MAC5BA,IAAU,KAAkB,SAC5BA,IAAU,KAAkB,SAEhC,CAGA,SAASsjB,GACPlC,EACAE,EACAmF,EACAlD,EAAkC,UAClCb,EACA,CACA,GAAI,CAACtB,EACH,MAAO,GAET,GAAImC,IAAgB,SAClB,OAAOnC,EAAiB,eAAc,MAAkB,GAAKsB,EAAe,KAA0B,GAExG,MAAMgE,EAAetF,EAAiB,YAAc,GAC9CgC,EACJqD,IACCnF,EACG,SAAS,IAAM,IAAI,GAAGA,CAAoB,eAAe,GAAKoF,EAAc,EAAE,EAC9EA,GAEAV,EAAW5E,EAAiB,YAAc,KAGhD,OAAIgC,GAAgBhC,EAAiB,aAAegC,EAAe4C,EAC1DS,GAAgBC,EAElBtD,CACT,CAEA,MAAMuD,GAAmB,IAAI,IAEtB,SAASC,GAA0B9mB,EAAmBsX,EAAkB,CAC7EuP,GAAiB,IAAI7mB,EAAI,IAAKsX,CAAQ,CACxC,CAEO,SAASyP,EAAyB/mB,EAAmB,CAC1D,OAAO6mB,GAAiB,IAAI7mB,EAAI,GAAG,GAAK,CAC1C,CAEO,SAAS4lB,EAA4B5lB,EAAmB,CAC7D6mB,GAAiB,OAAO7mB,EAAI,GAAG,CACjC,CAEA,eAAeqmB,EAAoBzC,EAAoD5jB,EAAmB,CACxG,MAAMgnB,EAAa,QAAM,KAAiB,EAAE,IAAIhnB,EAAI,aAAa,EAC3D2C,EAAU,CAAC,EACbqkB,GACFrkB,EAAQ,QACN,8BAA2B,aAAc,CACvC,cAAeqkB,EAAW,GAC5B,CAAC,CACH,EAEFpD,EAAc,CACZ,OAAQ,2BACR,OAAQ,MAAG,KAAE,wCAAyC,mCAAmC,CAAC;AAAA;AAAA;AAAA,EAG5F5jB,EAAI,MAAM,WAAW,IAAK,KAAK,CAAC;AAAA;AAAA,QAG9B,QAAS,CACP,GAAG2C,KACH,8BAA2B,aAAc,CACvC,SAAO,KAAE,8BAA+B,UAAU,EAClD,KAAM,CACJ,OAAQ3C,EAAI,OACZ,MAAOA,EAAI,MACX,UAAWA,EAAI,SACjB,CACF,CAAC,CACH,CACF,CAAC,CACH,CAEO,SAAS0hB,EAAsBuF,EAA2D,CAE/F,OADcA,GAAW,aAAe,OAAO,YAChC,KAAO,UAAY,QACpC,CAEO,SAAS3C,EAA+B2C,EAA2C,CAExF,OADcA,GAAW,aAAe,OAAO,YAChC,IACjB,C,2GC5sBO,SAASC,EAA2BxT,EAAuB,CAChE,MAAMyT,KAAe,MAAiBzT,CAAI,EAEpC0B,EADO,KAAO,MAAM+R,CAAY,EACpB,QAQZxkB,EAAmB,CACvB,MANgC,CAChC,OAAQ,CAAC,EACT,WAAY,CAAC,CACf,EAIE,OAAQ,CAAC,CACX,EAEA,GAAI,CACFykB,EAAiBD,EAAc/R,EAAMzS,CAAO,CAC9C,OAAS0kB,EAAK,CAEZ,QAAQ,MAAMA,CAAG,EACbA,aAAe,OACjB1kB,EAAQ,OAAO,KAAK,CAClB,KAAM0kB,EAAI,OACZ,CAAC,CAEL,CAGA,OAAIC,GAAa3kB,EAAQ,KAAK,IAC5BA,EAAQ,OAAS,CAAC,GAEbA,CACT,CAEO,SAASykB,EAAiB1T,EAAc0B,EAAkBzS,EAAkB,CACjF,MAAM4kB,EAAW5kB,EAAQ,MACzB,OAAQyS,EAAK,KAAK,GAAI,CACpB,KAAK,KAAS,CACZmS,EAAS,OAAO,KAAKC,EAAS9T,EAAM0B,CAAI,CAAC,EACzC,MAAMiS,EAAMjS,EAAK,SAAS,IAAO,EAC7BiS,GACF1kB,EAAQ,OAAO,QAAK,MAAU+Q,EAAM2T,CAAG,CAAC,EAE1C,KACF,CAEA,KAAK,KAAY,CACf,KAAM,CAAE,UAAAI,EAAW,MAAAC,CAAM,EAAIC,EAAcjU,EAAM0B,CAAI,EACjDqS,GACFF,EAAS,WAAW,KAAKE,CAAS,EAGhCC,GACF/kB,EAAQ,OAAO,KAAKilB,EAAwBlU,EAAM0B,EAAMsS,CAAK,CAAC,EAEhE,KACF,CAEA,KAAK,KAAa,CAChBH,EAAS,WAAW,KAAKM,GAAenU,EAAM0B,CAAI,CAAC,EACnD,KACF,CAEA,KAAK,KAAa,CAChB,KAAM,CAAE,UAAAqS,EAAW,MAAAC,CAAM,EAAII,EAAepU,EAAM0B,CAAI,EAClDqS,GACFF,EAAS,WAAW,KAAKE,CAAS,EAGhCC,GACF/kB,EAAQ,OAAO,KAAKilB,EAAwBlU,EAAM0B,EAAMsS,CAAK,CAAC,EAEhE,KACF,CACA,KAAK,KAAsB,CACzBH,EAAS,WAAW,KAAKQ,EAAwBrU,EAAM0B,CAAI,CAAC,EAC5D,KACF,CAEA,KAAK,KACL,KAAK,KAAwB,CAC3B,KAAM,CAAE,UAAAqS,EAAW,MAAAC,CAAM,EAAIM,EAAgBtU,EAAM0B,CAAI,EACnDqS,GACFF,EAAS,WAAW,KAAKE,CAAS,EAEhCC,GACF/kB,EAAQ,OAAO,KAAKilB,EAAwBlU,EAAM0B,EAAMsS,CAAK,CAAC,EAEhE,KACF,CAEA,KAAK,KAAgB,CACnBH,EAAS,WAAW,KAAKU,GAAcvU,EAAM0B,CAAI,CAAC,EAClD,KACF,CAEA,KAAK,KAAoB,CACvBmS,EAAS,WAAW,KAAKW,EAAexU,EAAM0B,CAAI,CAAC,EACnD,KACF,CAEA,KAAK,KAAY,CACf,KAAM,CAAE,UAAAqS,EAAW,MAAAC,CAAM,EAAIS,EAAiBzU,EAAM0B,EAAMzS,CAAO,EAC7D8kB,GACFF,EAAS,WAAW,KAAKE,CAAS,EAGhCC,GACF/kB,EAAQ,OAAO,KAAKilB,EAAwBlU,EAAM0B,EAAMsS,CAAK,CAAC,EAGhE,KACF,CAEA,KAAK,KAAY,CACfH,EAAS,WAAW,KAAKa,EAAc,CAAC,EACxC,KACF,CAEA,KAAK,KAAsB,CACzBb,EAAS,WAAW,KAAKc,EAAuB3U,EAAM0B,EAAMzS,CAAO,CAAC,EACpE,KACF,CAEA,KAAK,KAAuB,CAC1B4kB,EAAS,WAAW,KAAKe,GAAwB5U,EAAM0B,EAAMzS,CAAO,CAAC,EACrE,KACF,CAEA,KAAK,KAAW,CACd4lB,EAAa7U,EAAM0B,EAAMzS,CAAO,EAChC,KACF,CAEA,KAAK,KAAS,CACZ,GAAI6lB,EAAwBpT,CAAI,EAC9B,MAEFzS,EAAQ,OAAO,QAAK,MAAU+Q,EAAM0B,CAAI,CAAC,EACzC,KACF,CAEA,KAAK,KAAgB,CACnBmS,EAAS,WAAW,KAAKkB,GAAiB/U,EAAM0B,EAAMzS,CAAO,CAAC,EAC9D,KACF,CAEA,KAAK,KAAgB,CACnB4kB,EAAS,WAAW,KAAKmB,GAAiBhV,EAAM0B,EAAMzS,CAAO,CAAC,EAC9D,KACF,CAEA,QAAS,CAKP,IAAIgmB,EAAQvT,EAAK,WACjB,KAAOuT,GACLvB,EAAiB1T,EAAMiV,EAAOhmB,CAAO,EACrCgmB,EAAQA,EAAM,WAElB,CACF,CACF,CAEA,SAASnB,EAAS9T,EAAc0B,EAA2C,CACzE,MAAMwT,EAAYxT,EAAK,SAAS,IAAU,EACpCtB,KAAQ,MAAUJ,EAAMkV,CAAS,EACjCC,KAAK,MAAUnV,EAAMkV,GAAW,WAAW,EACjD,IAAI1oB,KAAQ,MAAUwT,EAAM0B,EAAK,SAAS,IAAM,CAAC,EAEjD,OAAAlV,EAAQA,EAAM,UAAU,EAAGA,EAAM,OAAS,CAAC,EAEpC,CACL,MAAA4T,EACA,GAAA+U,EACA,MAAA3oB,CACF,CACF,CAEA,SAASynB,EAAcjU,EAAc0B,EAAsC,CACzE,MAAMZ,KAAS,MAAUd,EAAM0B,EAAK,SAAS,IAAM,CAAC,EAC9C0T,EAAaC,KAAa,MAAUrV,EAAM0B,EAAK,SAAS,IAAM,CAAC,CAAC,EAEtE,GADqBA,EAAK,SAAS,IAAQ,GAAG,SAAS,IAAE,EAEvD,MAAO,CACL,UAAW,CACT,GAAI,KAAgB,oBACpB,OAAQ,CAACZ,EAAQsU,CAAU,CAC7B,CACF,EAGF,MAAME,EAAS,CAACF,CAAU,EAC1B,IAAIG,EAAW7T,EAAK,SAAS,IAAQ,EACrC,KAAO6T,GACLD,EAAO,KAAKD,KAAa,MAAUrV,EAAMuV,EAAS,SAAS,IAAM,CAAC,CAAC,CAAC,EACpEA,EAAWA,EAAS,SAAS,IAAQ,EAUvC,MAAO,CACL,UAAW,CACT,GAT+C,CACjD,KAAM,KAAgB,aACtB,KAAM,KAAgB,gBACtB,KAAM,KAAgB,iBACtB,KAAM,KAAgB,mBACxB,EAIkBzU,CAAM,EACpB,OAAAwU,CACF,CACF,CACF,CAEA,SAASnB,GAAenU,EAAc0B,EAAyC,CAC7E,MAAM8T,EAAa9T,EAAK,WAClB+T,KAAS,MAAUzV,EAAMwV,CAAU,EAEnCnW,EAASgW,KAAa,MAAUrV,EAAM0B,EAAK,SAAS,IAAM,CAAC,CAAC,EAClE,IAAI4T,EAA8CjW,EAAS,CAACA,CAAM,EAAI,CAAC,EACvE,MAAMqW,KAAQ,MAAkBD,CAAM,EACtC,OAAIC,GAAS,IAAC,MAAoBA,EAAOJ,CAAM,IAC7CA,EAASI,GAAO,eAAiB,CAAC,GAG7B,CACL,GAAID,EACJ,OAAAH,CACF,CACF,CAEA,SAASjB,EAAwBrU,EAAc0B,EAAyC,CACtF,MAAM8T,EAAa9T,EAAK,SAAS,IAAI,EAC/B+T,KAAS,MAAUzV,EAAMwV,CAAU,EAEnCF,EAAS,CAAC,MAAG,MAAatV,EAAM0B,EAAM,IAAyB,CAAC,EACtE,MAAO,CACL,GAAI+T,EACJ,OAAAH,CACF,CACF,CAEA,SAAShB,EAAgBtU,EAAc0B,EAAsC,CAC3E,MAAMiU,EAAkB,CAAC,EACnB/b,EAAmB,CAAC,EAC1B,IAAIoa,EAEJ,MAAM4B,EAASlU,EAAK,KACpB,OAAAA,EAAK,OAAO,EAAE,QAAQ,CACpB,MAAQmU,GAAY,CACdA,EAAQ,KAAK,KAAO,KACtBF,EAAM,KAAK3V,EAAK,UAAU6V,EAAQ,KAAOD,EAAQC,EAAQ,GAAKD,CAAM,CAAC,EAC5DC,EAAQ,KAAK,KAAO,KAC7Bjc,EAAO,KAAKoG,EAAK,UAAU6V,EAAQ,KAAOD,EAAQC,EAAQ,GAAKD,CAAM,CAAC,EAC7DC,EAAQ,KAAK,KAAO,OAC7B7B,EAAQ,sBAAsBhU,EAAK,UAAU6V,EAAQ,KAAOD,EAAQC,EAAQ,GAAKD,CAAM,CAAC,IAE5F,CACF,CAAC,EAOM,CACL,UANgB,CAChB,GAAI,KAAgB,OACpB,OAAQ,CAACD,EAAM,SAAS,UAAU,EAAGA,EAAM,SAAS,cAAc,EAAG,GAAG/b,CAAM,CAChF,EAIE,MAAAoa,CACF,CACF,CAEA,SAASI,EAAepU,EAAc0B,EAAsC,CAE1E,GAAIA,EAAK,SAAS,IAAE,GAAKA,EAAK,SAAS,IAAG,GAAKA,EAAK,SAAS,OAAO,EAClE,MAAO,CACL,MAAO,qEACT,EAEF,GAAIA,EAAK,WAAY,KAAK,KAAO,KAAe,CAC9C,MAAMoU,EAAgBpU,EAAK,WACrBtB,EAAQ0V,GAAe,SAAS,IAAU,EAC1CX,EAAK/U,GAAO,YACZ5T,EAAQspB,GAAe,SAAS,IAAM,EACtCC,EAAcV,KAAa,MAAUrV,EAAMxT,CAAK,CAAC,EAEvD,MAAO,CACL,UAAW,CACT,GAAI,KAAgB,qBACpB,OAAQ,IAAC,MAAUwT,EAAMI,CAAK,KAAG,MAAUJ,EAAMmV,CAAE,EAAGY,CAAW,CACnE,CACF,CACF,CAEA,MAAMC,EAAK,KAAgB,YAC3B,GAAItU,EAAK,WAAY,KAAK,KAAO,KAAY,CAE3C,MAAMtB,EADSsB,EAAK,WAAY,WACV,WAChByT,EAAK/U,EAAO,YACZ5T,EAAQ2oB,EAAI,YACZY,EAAcV,KAAa,MAAUrV,EAAMxT,CAAK,CAAC,EAEvD,MAAO,CACL,UAAW,CACT,GAAAwpB,EACA,OAAQ,IAAC,MAAUhW,EAAMI,CAAK,KAAG,MAAUJ,EAAMmV,CAAE,EAAGY,CAAW,CACnE,CACF,CACF,CAGA,MAAM3V,EADSsB,EAAK,WACE,WAChByT,EAAK/U,EAAO,YACZ5T,EAAQ2oB,EAAI,YACZG,EAAS,IAAC,MAAUtV,EAAMI,CAAK,KAAG,MAAUJ,EAAMmV,CAAE,EAAGE,KAAa,MAAUrV,EAAMxT,CAAK,CAAC,CAAC,EAGjG,OAAI8oB,EAAO,KAAK,EAAE,IAAM,aACf,CACL,UAAW,CACT,GAAI,KAAgB,oBACpB,OAAQ,CAAC,CACX,CACF,EAGK,CACL,UAAW,CACT,GAAAU,EACA,OAAAV,CACF,CACF,CACF,CAEA,SAASf,GAAcvU,EAAc0B,EAAyC,CAC5E,MAAMsU,EAAK,KAAgB,WACrB3W,EAASgW,KAAa,MAAUrV,EAAM0B,EAAK,SAAS,IAAM,CAAC,CAAC,EAElE,MAAO,CACL,GAAAsU,EACA,OAAQ,CAAC3W,CAAM,CACjB,CACF,CAEA,SAASmV,EAAexU,EAAc0B,EAAyC,CAC7E,MAAMsU,EAAK,KAAgB,YACrBC,EAAWvU,EAAK,SAAS,IAAU,EAEnCwU,EADKD,EAAU,YACK,YAE1B,MAAO,CACL,GAAAD,EACA,OAAQ,IAAC,MAAUhW,EAAMkW,CAAa,EAAGb,KAAa,MAAUrV,EAAMiW,CAAQ,CAAC,CAAC,CAClF,CACF,CAEA,SAASvB,GAAuC,CAG9C,MAAO,CACL,GAHS,KAAgB,WAIzB,OAAQ,CAAC,CACX,CACF,CAEA,SAASD,EAAiBzU,EAAc0B,EAAkBzS,EAAsC,CAC9F,MAAMknB,EAAkBzU,EAAK,SAAS,IAAU,EAC1C0U,EAAmB1U,EAAK,SAAS,IAAW,EAC5C2U,EAAc3U,EAAK,SAAS,IAAM,EAUxC,GARIyU,GACFzC,EAAiB1T,EAAMmW,EAAiBlnB,CAAO,EAG7CmnB,GACF1C,EAAiB1T,EAAMoW,EAAkBnnB,CAAO,EAG9ConB,EAAa,CACf,GAAIA,EAAY,aAAa,KAAK,KAAO,KAAQ,CAC/C,MAAMC,EAASD,EAAY,YACrBE,EAAaD,EAAO,YAC1B,MAAO,CACL,UAAW,CACT,GAAI,KAAgB,OACpB,OAAQ,IAAC,MAAUtW,EAAMuW,CAAU,KAAG,MAAUvW,EAAMsW,CAAM,CAAC,CAC/D,CACF,CACF,CAEA,MAAO,CACL,UAAW,CACT,GAAI,KAAgB,OACpB,OAAQ,IAAC,MAAUtW,EAAMqW,GAAa,WAAW,EAAG,EAAE,CACxD,CACF,CACF,CAEA,MAAO,CAAC,CACV,CAEA,SAAS1B,EAAuB3U,EAAc0B,EAAkBzS,EAAkB,CAChF,MAAMunB,EAAW9U,EAAK,SAAS,IAAO,EAChC+U,KAAW,MAAUzW,EAAMwW,CAAQ,EACnClpB,EAASoU,EAAK,SAAS,IAAW,EAClCgV,EAAUhV,EAAK,SAAS,IAAY,EACpC4T,EAAShoB,GAAW,KAA+B,IAAC,MAAU0S,EAAM1S,CAAM,CAAC,EAAI,CAAC,EAChF2N,EAAQyb,GAAS,SAAS,IAAK,EAC/BC,EAAa1b,KAAQ,MAAU+E,EAAM/E,CAAK,EAAI,KAC9C2b,EAAWlV,EAAK,SAAS,IAAQ,EAEnCiV,GACFrB,EAAO,QAAQqB,EAAW,UAAU,EAAGA,EAAW,OAAS,CAAC,CAAC,EAG3DC,GACFtB,EAAO,KAAK,MAAG,MAAatV,EAAM4W,EAAU,IAAU,CAAC,EAGzD,MAAMzB,EAAK,CACT,GAAIsB,EACJ,OAAAnB,CACF,EAEA,OAAIoB,GACFhD,EAAiB1T,EAAM0W,EAASznB,CAAO,EAGlCkmB,CACT,CAEA,SAASP,GAAwB5U,EAAc0B,EAAkBzS,EAAkB,CACjF,MAAMunB,EAAW9U,EAAK,SAAS,IAAQ,EACvC,IAAI+U,KAAW,MAAUzW,EAAMwW,CAAQ,EAEvC,MAAMI,EAAWlV,EAAK,SAAS,IAAQ,EACjC4T,EAAS,CAAC,EAEVuB,EAAanV,EAAK,SAAS,IAAW,EACtCoV,EAAYpV,EAAK,SAAS,IAAO,GAAG,SAAS,IAAU,EAEzDmV,EACFvB,EAAO,KAAK,UAAO,MAAUtV,EAAM6W,CAAU,CAAC,CAAC,EACtCC,GAETxB,EAAO,QAAK,MAAUtV,EAAM8W,CAAS,CAAC,EAGpCF,IACiBA,EAAS,SAAS,IAAE,GACrBH,IAChBA,EAAW,KAAKA,CAAQ,OAGFG,EAAS,SAAS,IAAO,IAE/CH,EAAW,KAAKA,CAAQ,YAG1BnB,EAAO,KAAK,MAAG,MAAatV,EAAM4W,EAAU,IAAU,CAAC,GAGzD,MAAMG,EAAarV,EAAK,SAAS,IAAU,EACrCyT,EAA4B,CAAE,GAAIsB,EAAU,OAAAnB,CAAO,EAEzD,OAAIyB,IAEEA,EAAW,YAAY,KAAK,KAAO,MACrC9nB,EAAQ,OAAO,KAAK,CAClB,KAAM,8BACN,KAAM8nB,EAAW,WAAW,KAC5B,GAAIA,EAAW,YAAY,EAC7B,CAAC,EAGHrD,EAAiB1T,EAAM+W,EAAY9nB,CAAO,GAGrCkmB,CACT,CAEA,MAAM6B,EAAmB,IAAiB,OAA6D,CAACpe,EAAKqe,KAC3Gre,EAAIqe,EAAI,IAAI,EAAI,CACd,GAAIA,EAAI,GACR,WAAYA,EAAI,UAClB,EACOre,GACN,CAAC,CAAC,EASL,SAASic,EAAa7U,EAAc0B,EAAkBzS,EAAkB,CACtE,MAAM4kB,EAAW5kB,EAAQ,MACnBioB,EAAOxV,EAAK,WACZyT,KAAK,MAAUnV,EAAMkX,EAAK,WAAW,EACrCC,EAAcC,EAAkBpX,EAAM0B,EAAK,SAAS,IAAa,CAAC,EAElE2V,EAAQ3V,EAAK,UAEbgU,EAAQsB,EAAiB7B,CAAE,EAE3BmC,EAAaC,GAAyBL,EAAM,+BAA+B,EAC3EM,EAAcD,GAAyBF,EAAO,+BAA+B,EAE7EI,EAAcJ,EAAM,SAAS,IAAS,EAW5C,GATIC,GAMF5D,EAAiB1T,EAAMkX,EAAMjoB,CAAO,EAGlCuoB,EACF3D,EAAS,WAAW,QAAK,MAAU6B,EAAO1V,EAAMqX,EAAO,CAAC,CAACF,GAAa,MAAM,CAAC,UACpEM,EAAa,CAGtB,MAAMC,KAAgB,MAAiBL,CAAK,EACxCK,GAAe,KAAK,KAAO,MAC7B7D,EAAS,WAAW,QAAK,MAAU6B,EAAO1V,EAAM0X,EAAe,CAAC,CAACP,GAAa,MAAM,CAAC,EAKvFzD,EAAiB1T,EAAMqX,EAAOpoB,CAAO,CACvC,KAAO,CACL4kB,EAAS,cAAgBA,EAAS,eAAiB,CAAC,EACpD,MAAM8D,EAAkC,CACtC,SAAUxC,EACV,MAAO,CACL,OAAQ,CAAC,EACT,WAAY,CAAC,CACf,CACF,EACIgC,GAAa,YACfQ,EAAS,kBAAoBR,EAAY,UACzCQ,EAAS,cAAgBR,EAAY,SAEvCtD,EAAS,cAAc,KAAK8D,CAAQ,EACpCjE,EAAiB1T,EAAMqX,EAAO,CAC5B,MAAOM,EAAS,MAChB,OAAQ1oB,EAAQ,MAClB,CAAC,CACH,CACF,CAEA,SAASmoB,EACPpX,EACA0B,EAIY,CACZ,GAAI,CAACA,EACH,OAEF,MAAMkW,EAAUlW,EAAK,SAAS,IAAoB,EAC5CmW,EAAcnW,EAAK,SAAS,GAAI,EAEtC,GAAI,CAACkW,GAAWC,EACd,MAAO,CAAE,OAAQ,GAAM,UAAW,EAAM,EACnC,CACL,GAAI,CAACD,EAEH,OAEF,MAAMhe,KAAS,MAAUoG,EAAM4X,EAAQ,SAAS,IAAc,GAAG,SAAS,IAAiB,CAAC,EAC5F,MAAO,CACL,UAAW,GACX,OAAQ,CAAC,CAACC,EACV,QAASje,EACT,UAAWge,EAAQ,SAAS,IAAE,EAAI,KAAO,UAC3C,CACF,CACF,CAEA,SAAS9C,EAAwBpT,EAAkB,CACjD,OAAOA,GAAM,QAAQ,KAAK,KAAO,IACnC,CAEO,SAAS2T,EAAahW,EAAgB,CAC3C,OAAIA,EAAO,CAAC,IAAM,KAAOA,EAAOA,EAAO,OAAS,CAAC,IAAM,IAC9CA,EACJ,UAAU,EAAGA,EAAO,OAAS,CAAC,EAC9B,QAAQ,OAAQ,GAAG,EACnB,QAAQ,QAAS,IAAI,EAEnBA,EAAO,QAAQ,KAAM,EAAE,CAChC,CAQA,SAASkY,GAAyB7V,EAAkBxC,EAAkB,CACpE,IAAI+V,EAA2BvT,EAC/B,MAAM5G,EAAWoE,EAAS,MAAM,GAAG,EACnC,UAAW4Y,KAAKhd,EAEd,GADAma,EAAQA,EAAM,SAAS6C,CAAC,EACpB,CAAC7C,EACH,OAAO,KAGX,OAAOA,CACT,CAQA,SAASf,EAAwBlU,EAAc0B,EAAkBsS,EAAe,CAC9E,MAAML,KAAM,MAAU3T,EAAM0B,CAAI,EAChC,OAAAiS,EAAI,KAAO,GAAGK,CAAK,KAAKL,EAAI,IAAI,GACzBA,CACT,CAEA,SAASC,GAAahS,EAAwB,CAC5C,OAAIA,EAAM,OAAO,SAAW,GAAKA,EAAM,WAAW,SAAW,CAI/D,CAEA,SAASmT,GAAiB/U,EAAc0B,EAAkBzS,EAAyC,CACjG,MAAM2K,EAAmB,CAAC,EAC1B,IAAIme,EAAgBrW,EAAK,SAAS,IAAU,EAC5C,KAAOqW,GAAe,CACpB,MAAM3X,KAAQ,MAAUJ,EAAM+X,EAAc,SAAS,IAAS,CAAC,EAC3D3X,GACFxG,EAAO,KAAKwG,CAAK,EAEnB2X,EAAgBA,GAAe,SAAS,IAAU,CACpD,CACA,OAAAne,EAAO,QAAQ,EACR,CACL,GAAI,KAAgB,KACpB,OAAQA,CACV,CACF,CAEA,SAASob,GAAiBhV,EAAc0B,EAAkBzS,EAAyC,CACjG,MAAM2K,EAAmB,CAAC,EAC1B,IAAIme,EAAgBrW,EAAK,SAAS,IAAU,EAC5C,KAAOqW,GAAe,CACpB,MAAM3X,KAAQ,MAAUJ,EAAM+X,EAAc,SAAS,IAAS,CAAC,EAC3D3X,GACFxG,EAAO,KAAKwG,CAAK,EAEnB2X,EAAgBA,GAAe,SAAS,IAAU,CACpD,CACA,OAAAne,EAAO,QAAQ,EACR,CACL,GAAI,KAAgB,KACpB,OAAQA,CACV,CACF,C,oOCprBO,SAASoe,EAAc/e,EAAc,CAC1C,KAAM,CAAE,WAAAgf,EAAY,iBAAAC,EAAkB,WAAAC,CAAW,EAAIlf,EAC/Cmf,GAAeD,GAAY,QAE3B,CAACE,EAAiBC,EAAkB,KAAI,YAAyC,MAAS,EAC1FC,MAAa,MAAW,IAAa,EAGrC,CAACC,GAAyBC,CAA0B,KAAI,YAAyC,MAAS,EAE1GC,EAASC,EAAmB,EAC5BC,EAAkB3f,GAAO,YAAY,MAGrC,CAAC4f,EAAkBC,CAAmB,KAAI,YAC9Cb,EAAW,KAAMje,GAAMA,EAAE,QAAU4e,CAAe,GAAKX,EAAW,CAAC,CACrE,EAEMc,KAAsB,eACzBC,GAAmC,CAClC,MAAMC,EAAqBhgB,EAAM,YAAY,QAC7C,OAAIggB,GACF,OAAO,OAAOA,CAAkB,EAAE,QAAQ,CAAC/pB,EAAK0E,IAAU,CACpDolB,EAAW9pB,CAAG,IAChB8pB,EAAW9pB,CAAG,EAAE,OAAS,GACzB8pB,EAAW9pB,CAAG,EAAE,MAAQ0E,EAE5B,CAAC,EAEIolB,CACT,EACA,CAAC/f,EAAM,YAAY,OAAO,CAC5B,EAEMigB,KAAY,WAAQ,OAAM,OAAeL,CAAgB,EAAG,CAACA,CAAgB,CAAC,KAEpF,aAAU,IAAM,CACd,GAAIK,GAAW,UAAU,MAAQA,GAAW,UAAU,MAAQ,CAACd,GAAc,CAC3E,MAAMe,EAAiB,CAAE,EAAGD,GAAW,UAAU,MAAQ,GAAI,EAAGA,GAAW,UAAU,MAAQ,EAAG,EAChGhB,EAAiB,CACf,QAAS,OAAO,OAAOiB,CAAc,EACrC,kBAAmB,QACnB,eAAgBD,GAAW,kBAAkB,GAAK,MACpD,CAAC,CACH,CACF,EAAG,CAACA,EAAWd,GAAcF,CAAgB,CAAC,KAK9C,aAAU,IAAM,CACd,MAAMkB,EAAWnB,EAAW,KAAMje,GAAMA,EAAE,QAAU4e,CAAe,GAAKX,EAAW,CAAC,EAChFmB,GACFN,EAAoBM,CAAQ,CAEhC,EAAG,CAACnB,EAAYW,CAAe,CAAC,KAOhC,aAAU,IAAM,CACd,GAAI,CAACP,GAAmB,CAACG,GACvB,OAEF,IAAIa,EAAc,CAAE,GAAGb,EAAwB,EAC3Cc,EAAO,GACX,OAAO,KAAKjB,CAAe,EAAE,QAASnpB,GAAQ,CACxCmqB,EAAYnqB,CAAG,GAAKmqB,EAAYnqB,CAAG,EAAE,SAAWmpB,EAAgBnpB,CAAG,EAAE,SACvEmqB,EAAYnqB,CAAG,EAAImpB,EAAgBnpB,CAAG,EACtCoqB,EAAO,GAEX,CAAC,EACGA,GACFb,EAA2BY,CAAW,CAE1C,EAAG,CAAChB,EAAiBG,EAAuB,CAAC,KAU7C,aAAU,IAAM,CAEd,GAAI,CAACK,EAAiB,OACpB,OAEF,MAAMU,EAAmBV,EAAmBA,EAAiB,OAAS,EAChEK,KAAY,OAAeL,CAAgB,EAC3Cjf,EAASsf,GAAW,0BAA0B,EAE9CM,EAAc,CAAC,EAEjBN,GACFM,EAAY,KAAK,GAAGN,EAAU,YAAY,OAAQze,GAAU,CAACA,GAAO,QAAQ,QAAQ,MAAM,CAAC,EAEzFye,GAAW,eACbM,EAAY,KAAKN,GAAW,aAAa,EAEvCA,GAAW,WACbM,EAAY,KAAKN,GAAW,SAAS,EAEnCA,GAAW,WACbM,EAAY,KAAKN,GAAW,SAAS,EAIvC,MAAMO,EAAmB,IAAI,IAG7B,IAAIC,EAAwC,CAAC,EAGzC9f,GAAQ,QAAU2f,IAEpB3f,EAAO,QAASA,GAAmB,CACb,OAAO,KAAKA,CAAM,EAE1B,QAASwG,IAAU,CAE7B,GAAIqZ,EAAiB,IAAIrZ,EAAK,EAAG,CAC/B,MAAM5T,GAAQitB,EAAiB,IAAIrZ,EAAK,EACpC5T,KACEA,IAAO,OACTitB,EAAiB,IAAIrZ,GAAO,CAC1B,wBAAyB5T,GAAM,wBAA0B,EACzD,OAAQ,GACR,MAAOA,GAAM,KACf,CAAC,EAEDitB,EAAiB,IAAIrZ,GAAO,CAC1B,wBAAyB5T,GAAM,wBAA0B,EACzD,OAAQ,GACR,MAAO,MACT,CAAC,EAIP,MACEitB,EAAiB,IAAIrZ,GAAO,CAAE,wBAAyB,EAAG,OAAQ,GAAO,MAAO,MAAU,CAAC,CAE/F,CAAC,CACH,CAAC,EAGDsZ,EAAoB,OAAO,YAAYD,CAAgB,EAGvD,OAAO,KAAKC,CAAiB,EAAE,QAASxqB,GAAQ,CAC9CwqB,EAAkBxqB,CAAG,EAAE,wBAA0ByqB,EAC/CD,EAAkBxqB,CAAG,EAAE,wBACvBqqB,CACF,CACF,CAAC,GAIHC,EAAY,QAAS/e,GAAU,CAC7B,MAAMvC,GAAWwhB,EAAkBjf,EAAM,IAAI,GAAG,OAC1C7G,GAAQ8lB,EAAkBjf,EAAM,IAAI,GAAG,MACzCvC,IAAYtE,KAAU,OACxB8lB,EAAkBjf,EAAM,IAAI,EAAI,CAC9B,wBAAyBkf,EACvBlf,EAAM,OAAO,OAAQjO,IAAUA,IAAU,IAA2B,EAAE,OACtE+sB,CACF,EACA,OAAQ,GACR,MAAA3lB,EACF,EAEA8lB,EAAkBjf,EAAM,IAAI,EAAI,CAC9B,wBAAyBkf,EACvBlf,EAAM,OAAO,OAAQjO,IAAUA,IAAU,IAA2B,EAAE,OACtE+sB,CACF,EACA,OAAQ,GACR,MAAO,MACT,CAEJ,CAAC,EAEDG,EAAoBX,EAAoBW,CAAiB,EAG1C,OAAO,KAAKA,CAAiB,EAAE,OAAQxqB,GAAQwqB,EAAkBxqB,CAAG,EAAE,MAAM,EAGhF,SAAW,IAChBgqB,GAAW,WAAW,OACxBQ,EAAkBR,EAAU,UAAU,IAAI,EAAE,OAAS,IAEnDA,GAAW,WAAW,OACxBQ,EAAkBR,EAAU,UAAU,IAAI,EAAE,OAAS,KAIrDA,GAAW,WAAW,MAAQA,GAAW,WAAW,OACtDQ,EAAkBR,EAAU,UAAU,IAAI,EAAE,KAAO,aACnDQ,EAAkBR,EAAU,UAAU,IAAI,EAAE,KAAO,cAGrDZ,GAAmBoB,CAAiB,CAGtC,EAAG,CAACb,EAAkBE,CAAmB,CAAC,EAE1C,KAAM,CAACa,EAAcC,CAAe,KAAI,eAAS,MAAgB,IAAgB,CAAC,EAC5EC,EAAa7gB,EAAM,MAAQ2gB,EAE3BrtB,KAAS,MAAW0I,GAAWyjB,EAAQkB,CAAY,EAEzD,GAAI,CAACvB,EACH,OAAO,KAGT,SAAS0B,EAAkBC,EAAoB,CAC7C,GAAI3B,EAAiB,CACnB,MAAM9H,EAAW,CAAC8H,EAAgB2B,CAAU,GAAG,OACzCC,EAAmB,OAAO,KAAK5B,CAAe,EAAE,OAAQ6B,GAAW7B,EAAgB6B,CAAM,GAAG,MAAM,GAAG,OACrG9d,EAAQ,CACZ,aAAcmU,EAAW,MAAQ,SACjC,YAAaA,EAAW0J,EAAmB,EAAIA,EAAmB,EAClE,eAAgBhhB,EAAM,cACxB,KACA,MAAkB,mDAAoDmD,CAAK,CAC7E,CACF,CAEA,MAAM+d,EAAiB,IAAM,CAC3B,MAAMT,EAAoB,CAAE,GAAGrB,CAAgB,EAC/C,OAAO,KAAKqB,CAAiB,EAAE,QAASxqB,GAAQ,CAC9C,MAAMkrB,EAAiB,CAAC,CAACV,EAAkBxqB,CAAG,EAAE,KAEhDwqB,EAAkBxqB,CAAG,EAAE,OAAS,EAAAkrB,EAE5BV,EAAkBxqB,CAAG,EAAE,OAAS,aAClCwqB,EAAkBxqB,CAAG,EAAE,MAAQ,EAE/BwqB,EAAkBxqB,CAAG,EAAE,MAAQwqB,EAAkBxqB,CAAG,EAAE,OAAS,aAAe,EAAI,MAEtF,CAAC,EACDopB,GAAmBoB,CAAiB,CACtC,EAEMW,EAAiBC,GAAyB,CAC9C,MAAMZ,EAAoB,CAAE,GAAGrB,CAAgB,EAE/CiC,EAAW,QAAQ,CAACprB,EAAK0E,IAAU,CACjC8lB,EAAkBxqB,CAAG,EAAE,MAAQ0E,CACjC,CAAC,EAGD0kB,GAAmBoB,CAAiB,EAGpCa,EAAmBb,CAAiB,CACtC,EAEA,SAASa,EAAmBb,EAAuC,CAEjE,MAAMc,EAAkB,OAAO,KAAKd,CAAiB,EAElD,OAAQxqB,GAAQwqB,EAAkBxqB,CAAG,GAAG,MAAM,EAC9C,KAAK,CAACurB,EAAGxsB,IAAM,CACd,MAAMysB,EAAKhB,EAAkBe,CAAC,EACxBE,GAAKjB,EAAkBzrB,CAAC,EAC9B,OAAIysB,EAAG,QAAU,QAAaC,GAAG,QAAU,OAClCD,EAAG,MAAQC,GAAG,MAEhB,CACT,CAAC,EAEGL,EAAqC,OAAO,OAChD,CAAC,EAEDE,CACF,EAEMrB,EAAiB,CAAE,EAAGD,GAAW,UAAU,MAAQ,GAAI,EAAGA,GAAW,UAAU,MAAQ,EAAG,EAC1F0B,EAAuC,CAC3C,GAAG3hB,EAAM,WAET,QAAS,OAAO,KAAKqhB,CAAU,EAAE,OAASA,EAAanB,EACvD,MAAON,EAAiB,MACxB,kBAAmB,QACnB,eAAgBK,GAAW,kBAAkB,GAAK,MACpD,EAGAhB,EAAiB0C,CAAa,CAChC,CAGA,MAAMC,EAAgBb,GAA0B,CAC9C,GAAI,CAAC3B,GAAmB,EAAE2B,KAAc3B,GAAkB,CACxD,QAAQ,KAAK,uBAAwBA,CAAe,EACpD,MACF,CAEA,MAAMyC,EAAS,OAAO,KAAKzC,CAAe,EAAE,OAAQxP,GAAMwP,EAAgBxP,CAAC,EAAE,MAAM,EAAE,OAC/E3Q,EAAYmgB,EAAgB2B,CAAU,EAAE,OAAgB,OAAP,GAEvD,IAAIN,EA4BJ,GA3BIxhB,EACFwhB,EAAoB,CAClB,GAAGrB,EACH,CAAC2B,CAAU,EAAG,CACZ,GAAG3B,EAAgB2B,CAAU,EAC7B,OAAQ9hB,EACR,MAAO4iB,CACT,CACF,EAEApB,EAAoB,CAClB,GAAGrB,EACH,CAAC2B,CAAU,EAAG,CACZ,GAAG3B,EAAgB2B,CAAU,EAC7B,OAAQ,GACR,MAAO,MACT,CACF,EAIFD,EAAkBC,CAAU,EAG5B1B,GAAmBoB,CAAiB,EAGhClB,GAAyB,CAC3B,MAAMngB,EAAS,CAACmgB,GAAwBwB,CAAU,GAAG,OACrD,IAAIe,EACA1iB,EACF0iB,EAA4B,CAC1B,GAAGvC,GACH,CAACwB,CAAU,EAAG,CACZ,GAAGxB,GAAwBwB,CAAU,EACrC,OAAA3hB,EACA,MAAOyiB,CACT,CACF,EAEAC,EAA4B,CAC1B,GAAGvC,GACH,CAACwB,CAAU,EAAG,CACZ,GAAGxB,GAAwBwB,CAAU,EACrC,OAAQ,GACR,MAAO,MACT,CACF,EAGFvB,EAA2BsC,CAAyB,CACtD,CAEAR,EAAmBb,CAAiB,CACtC,EAEMsB,EAAyBxuB,GAAmC,CACtCyrB,EAAW,KAAMvY,GAAUA,EAAM,QAAUlT,EAAM,KAAK,GAE9EssB,EAAoBb,EAAW,KAAMvY,GAAUA,EAAM,QAAUlT,EAAM,KAAK,GAAKyrB,EAAW,CAAC,CAAC,EAE9Fhf,EAAM,iBAAiB,CAAE,MAAOzM,EAAM,MAAO,eAAgB0sB,GAAW,kBAAkB,GAAK,MAAU,CAAC,CAC5G,EAEM+B,GAA8B,CAAC7e,EAAO0N,EAAWoR,IAAQ,CAC7D,MAAMC,EAAkB,OAAOD,EAAI,MAAM,MAAM,MAAM,EAAG,EAAE,CAAC,EACtD,MAAMC,CAAe,IACxBtB,EAAgBsB,CAAe,EAC/B,IAAM,IAAI,GAAG,IAAgB,uBAAwBA,CAAe,KACpE,KAAsB,8BAA+B,CACnD,KAAM,OACR,CAAC,EAEL,EAEA,SACE,oBACE,oBAAC,OACE,SAAAlD,EAAW,OAAS,MACnB,OAAC,OACC,mBAAC,KACC,SAAO,KAAE,6CAA8C,cAAc,EACrE,QAAQ,oCACR,WAAY,GACZ,WAAS,KACP,+DACA,0CACF,EAEA,mBAAC,MACC,QAAS,oCACT,gBAAY,KAAE,0DAA2D,sBAAsB,EAC/F,MAAOY,EAAiB,MACxB,QAASZ,EAAW,IAAKvY,IAChB,CACL,MAAOA,EAAM,MACb,MAAOA,EAAM,KACf,EACD,EACD,SAAUsb,CAAA,CACZ,EACF,EACF,EAEJ,KACA,QAAC,OAAI,UAAWzuB,EAAO,QACrB,oBAAC,KACC,OAAQ,CACN,MAAO,EACT,EACA,cAAe,CAAE,MAAOgsB,GAAW,kBAAmB,EACtD,KAAM,CAAE,MAAOqB,EAAc,OAAQjB,EAAmB,CAAE,EAC1D,YAAa,CAAE,MAAOiB,EAAc,OAAQjB,EAAmB,CAAE,EACjE,SAAU,KACV,SAAU1f,EAAM,MAAQ,GACxB,SAAUgiB,GAEV,mBAAC,MACC,MAAOd,EACP,gBAAA9B,EACA,WAAY,CAACQ,CAAgB,EAC7B,KAAM,CAAC,EACP,QAASwB,EACT,gBAAAR,EACA,aAAAD,EACA,OAAQiB,CAAA,CACV,EACF,KACA,OAAC,OAAI,UAAWtuB,EAAO,eACrB,mBAAC,OAAI,UAAWA,EAAO,aACrB,mBAAC,KACC,UAAA2sB,EACA,mBAAoBjgB,EAAM,mBAC1B,sBAAuBA,EAAM,sBAC7B,cAAeA,EAAM,cACrB,MAAOA,EAAM,MACb,UAAWA,EAAM,UACjB,SAAUA,EAAM,SAChB,MAAO6gB,EACP,UAAWjB,EACX,gBAAAR,EACA,OAAAK,CAAA,CACF,EACF,EACF,GACF,GACF,CAEJ,CAEA,MAAMiB,EAAY,CAACntB,EAAeygB,IACzB,KAAK,KAAM,IAAMzgB,EAASygB,CAAK,EAGxC,SAAShY,GAAUC,EAAsBwjB,EAAgBnG,EAAe,CACtE,MAAO,CACL,WAAS,OAAI,CACX,QAAS,MACX,CAAC,EACD,WAAS,OAAI,CACX,OAAAmG,EACA,SAAUxjB,EAAM,WAAW,QAAQ,EAAE,EACrC,UAAW,SACX,MAAAqd,EACA,aAAcrd,EAAM,QAAQ,CAAC,CAC/B,CAAC,EACD,kBAAgB,OAAI,CAClB,SAAU,WACV,SAAU,SACV,KAAM,CACR,CAAC,EACD,gBAAc,OAAI,CAChB,SAAU,WACV,KAAM,EACN,IAAK,CACP,CAAC,CACH,CACF,CAEO,MAAMyjB,EAAqB,IAKzB,KAAK,IAAI,OAAO,YAAc,IAAK,GAAG,C,gsBCziB/C,MAAMyC,EAAS,EACbC,EAAW,EACXC,EAAW,EACXC,EAAY,EACZC,EAAW,EACXC,EAAW,EACXC,EAAgB,EAChBC,EAAe,EACfC,GAAiB,EACjBC,EAAW,GACXC,EAAW,GACXC,EAAS,GACTC,GAAO,GACPC,EAAa,GACbC,EAAc,GACdC,EAAe,GACfC,EAAe,GACfC,GAAS,GACTC,EAAS,GACTC,EAAO,GACPC,EAAY,GACZC,EAAQ,GACRC,EAAO,GACPC,GAAW,GACXC,EAAQ,GACRC,GAAQ,GACRC,GAAU,GACVC,GAAQ,GACRC,EAAQ,GACRC,EAAW,GACXC,EAAW,GACXC,EAAY,GACZC,EAAS,GACTC,EAAS,GACTC,EAAc,GAEVC,EAAgB,CACpB,KAAMnC,EACN,OAAQC,EACR,OAAQC,EACR,QAASC,EACT,OAAQC,EACR,aAAcE,EACd,YAAaC,EACb,cAAeC,GACf,OAAQC,EACR,OAAQC,EACR,KAAMC,EACN,GAAIC,GACJ,SAAUC,EACV,WAAYC,EACZ,YAAaC,EACb,OAAQV,EACR,WAAYW,EACZ,KAAMC,GACN,KAAMC,CACR,EAEMkB,EAAwBhxB,IACrB+wB,EAAc/wB,GAAM,YAAY,CAAC,GAAK,GAGzCixB,EAA0B,CAC9B,GAAIlB,EACJ,QAASC,EACT,IAAKC,EACL,GAAIC,EACJ,OAAQC,GACR,IAAKC,EACL,IAAKC,GACL,MAAOC,GACP,IAAKC,GACL,IAAKC,EACL,OAAQC,EACR,OAAQC,EACR,QAASC,EACT,KAAMC,EACN,KAAMC,EACN,UAAWC,CACb,EAEMI,EAAoBlxB,IACjBixB,EAAwBjxB,GAAM,YAAY,CAAC,GAAK,GAInDmxB,EAAkB,CAAC,UAAU,KAAK,GAAG,IAAK,gBAAgB,IAAK,KAAK,IAAK,aAAa,IAAK,gBAAgB,IAAK,WAAW,IAAK,cAAc,IAAK,cAAc,IAAK,cAAc,IAAK,cAAc,IAAK,iBAAiB,IAAK,iBAAiB,IAAK,mBAAmB,IAAK,gBAAgB,IAAK,eAAe,IAAK,iBAAiB,IAAK,MAAM,IAAK,SAAS,IAAK,iBAAiB,GAAG,EAC5XlI,EAAS,KAAS,YAAY,CAClC,QAAS,GACT,OAAQ,ygGACR,UAAW,+9KACX,KAAM,wvCACN,UAAW,u4CACX,QAAS,IACT,aAAc,CAAC,EAAE,EAAE,EACnB,gBAAiB,EACjB,UAAW,4tEACX,WAAY,CAAC,EAAG,CAAC,EACjB,SAAU,CAAC,MAAQ,CAAC,EAAE,EAAE,CAAC,EACzB,YAAa,CAAC,CAAC,KAAM,GAAI,IAAK,CAACjpB,GAAOoxB,KAAWJ,EAAqBhxB,EAAK,GAAK,CAAE,EAAE,CAAC,KAAM,GAAI,IAAK,CAACA,GAAOoxB,KAAWF,EAAiBlxB,EAAK,GAAK,EAAK,CAAC,EAAE,CAAC,KAAM,GAAI,IAAKA,IAASmxB,EAAgBnxB,EAAK,GAAK,EAAE,CAAC,EAChN,UAAW,CACb,CAAC,EAEKqxB,EAAO,EACXC,EAAS,EACTC,EAAS,EACTC,EAAU,EACVC,GAAS,EACTC,EAAS,EACTC,EAAc,EACdC,EAAa,EACbC,EAAe,EACfC,EAAS,GACTC,EAAS,GACTC,EAAO,GACPC,EAAK,GACLC,GAAW,GACXC,GAAY,GACZC,GAAa,GACbC,EAAa,GACbC,EAAO,GACPC,EAAO,GACPC,EAAK,GACLC,GAAU,GACVC,GAAM,GACNC,GAAK,GACLC,GAAS,GACTC,GAAM,GACNC,GAAM,GACNC,GAAQ,GACRC,GAAM,GACNC,GAAM,GACNC,GAAS,GACTC,GAAS,GACTC,GAAU,GACVC,GAAO,GACPC,GAAO,GACPC,GAAY,GACZC,GAAc,GACdC,GAAQ,GACRC,GAAO,GACPC,GAAU,GACVC,GAAW,GACXC,EAAW,GACXC,EAAU,GACVC,GAAa,GACbC,GAAK,GACLC,GAAS,GACTC,GAAM,GACNC,GAAK,GACLC,GAAM,GACNC,GAAe,GACfC,GAAgB,GAChBC,GAAc,GACdC,GAAa,GACbC,GAAS,GACTC,GAAY,GACZC,GAAY,GACZC,GAAc,GACdC,GAAM,GACNC,GAAW,GACXC,GAAK,GACLC,GAAW,GACXC,GAAO,GACPC,GAAe,GACfC,GAAoB,GACpBC,GAAa,GACbC,GAAc,GACdC,GAAuB,GACvBC,GAAgC,GAChCC,GAA4B,GAC5BC,GAAyB,GACzBC,GAAc,GACdC,GAAgB,GAChBC,GAAa,GACbC,GAAiB,GACjBC,GAAM,GACNC,GAAW,GACXC,GAAM,GACNC,GAAM,GACNC,GAAM,GACNC,GAAM,GACNC,GAAc,GACdC,GAAQ,GACRC,GAAe,GACfC,GAAc,GACdC,GAAS,GACTC,GAAM,GACNC,GAAM,GACNC,GAAiB,GACjBC,GAAkB,GAClBC,GAAe,GACfC,GAAqB,GACrBC,GAAiB,GACjBC,GAAiB,GACjBC,GAAa,GACbC,GAAY,GACZC,GAAiB,GACjBC,GAAa,GACbC,GAAY,GACZC,GAAa,GACbC,GAAuB,GACvBC,GAAU,IACVC,GAAgB,IAChBC,GAAO,IACPC,GAAc,IACdC,GAAgB,IAChBC,GAAY,IACZC,GAAc,IACdC,GAAc,IACdC,GAAc,IACdC,GAAc,IACdC,GAAiB,IACjBC,GAAiB,IACjBC,GAAmB,IACnBC,GAAgB,IAChBC,GAAe,IACfC,GAAiB,IACjBC,GAAe,IACfC,GAAQ,IACRC,GAAa,IACbC,GAAa,IACbC,GAAS,IACTC,GAAY,IACZC,GAAe,IACfC,GAAsB,IACtBC,GAAW,IACXC,GAAS,IACTC,GAAwB,IACxBC,GAAW,IACXC,GAAY,IACZC,GAAgB,IAChBC,GAAuB,IACvBC,GAAiB,IACjBC,GAAoB,IACpBC,GAAgB,IAChBC,GAAY,IACZC,GAAM,IACNC,GAAM,IACNC,GAAM,IACNC,GAAM,IACNC,GAAmB,IACnBC,GAAa,G,+JC3OR,SAASC,EAAkB,CAChC,SAAAC,EACA,MAAA9yB,EACA,YAAA+yB,GACA,MAAAn6B,EACA,MAAAoV,EACA,WAAA0R,EACA,UAAA5a,EACA,cAAAkuB,CACF,EAA0C,CACxC,KAAM,CAACxwB,GAAOywB,CAAQ,KAAI,YAGvB,CAAC,CAAC,EAEL,SACE,OAACC,EAAA,IACC,WAAS,MAAoBH,GAAa/yB,CAAK,EAC/C,WAAY,SAAY,CAEtBizB,EAAS,CAAE,UAAW,EAAK,CAAC,EAC5B,MAAME,GAAU,MAAMC,GAAkBplB,EAAO0R,EAAYsT,EAAeluB,CAAS,EACnFmuB,EAAS,CAAE,QAAAE,GAAS,UAAW,MAAU,CAAC,CAC5C,EACA,UAAW3wB,GAAM,UACjB,iBAAgB,GAChB,iBAAiB,kBACjB,eAAe,iBACf,QAASA,GAAM,QACf,MAAO5J,KAAQ,KAASA,EAAM,SAAS,CAAC,EAAI,KAC5C,SAAWA,IAAU,CACfA,GAAM,OACRk6B,EAAS9yB,EAAOpH,GAAM,KAAK,CAE/B,EACF,CAEJ,CAEA,eAAew6B,GACbplB,EACA0R,EACAsT,GACAluB,KAAY,MAAoB,EACS,CACzC,MAAMuuB,EAAYL,GAAc,YAAYhlB,CAAK,EACjD,GAAI,EAAE,mBAAoB0R,IAAe,OAAOA,EAAW,gBAAmB,WAC5E,MAAO,CAAC,EAGV,MAAM4T,EAAU,MAAM5T,EAAW,eAAe,CAAE,KAAM2T,EAAW,MAAO,gBAAiB,EAAGvuB,EAAW,CACvG,6BAA8B,EAChC,CAAC,EAQD,SAPqB,MAAoCwuB,EAAQ,CAAC,CAAC,EAEjC,IAAK9mB,KAAW,CAChD,MAAAA,GACA,MAAOA,EACT,EAAE,CAGJ,C,eCtDA,SAAS+mB,GAA6D,CACpE,MAAMC,EAAe,CACnB,KAAgB,IAChB,KAAgB,IAChB,KAAgB,IAChB,KAAgB,IAChB,KAAgB,OAChB,KAAgB,OAChB,KAAgB,KAClB,EAAE,QAASC,MACT,MAA2BA,EAAM,CAC/B,oBAAqB,KACrB,UAAW,KAAmB,IAChC,CAAC,CACH,EAEMC,EAAwB,CAAC,KAAgB,KAAM,KAAgB,OAAO,EAAE,QAASD,MAC9E,MACLA,EACA,CACE,OAAQ,CAAC,CAAE,KAAM,UAAW,KAAM,QAAS,CAAC,EAC5C,cAAe,CAAC,CAAC,CACnB,EACA,CACE,oBAAqB,KACrB,UAAW,KAAmB,IAChC,CACF,CACD,EAEKE,GAAkB,IACtB,MAAqB,KAAgB,IAAI,KACzC,MAAqB,KAAgB,WAAW,KAChD,MAAqB,KAAgB,aAAa,KAClD,MAAqB,KAAgB,WAAW,KAChD,MAAqB,KAAgB,SAAS,KAC9C,MAAqB,KAAgB,aAAa,KAClD,MAAqB,KAAgB,cAAc,CACrD,EAEMC,EAA8B,CAClC,MAAG,MAAiC,KAAgB,WAAW,EAC/D,MAAG,MAAiC,KAAgB,WAAW,EAC/D,MAAG,MAAiC,KAAgB,WAAW,EAC/D,MAAG,MAAiC,KAAgB,aAAa,EACjE,MAAG,MAAiC,KAAgB,YAAY,EAChE,MAAG,MAAiC,KAAgB,cAAc,EAClE,MAAG,MAAiC,KAAgB,cAAc,EAClE,MAAG,MAAiC,KAAgB,gBAAgB,CACtE,EAuhBA,MArhBgD,CAC9C,GAAGJ,EACH,GAAGE,EACH,GAAGC,GACH,GAAGC,EACH,CACE,GAAI,KAAgB,KACpB,KAAM,OACN,OAAQ,CACN,CACE,KAAM,aACN,KAAM,SACN,UAAW,GACX,SAAU,GACV,SAAU,GACV,YAAa,sBACb,YACE,qLACJ,CACF,EACA,cAAe,CAAC,EAChB,WAAY,GACZ,gBAAiB,SACjB,SAAU,KAAiC,QAC3C,UAAW,KAAmB,QAC9B,SAAU,KACV,oBAAqB,KACrB,eAAgB,IACd,+QACJ,EACA,CACE,GAAI,KAAgB,OACpB,KAAM,SACN,OAAQ,CACN,CACE,KAAM,SACN,KAAM,UACN,SAAU,GACV,YACE,gLACJ,EACA,CACE,KAAM,aACN,KAAM,UACN,SAAU,GACV,YACE,iHACJ,EACA,CACE,KAAM,aACN,KAAM,SACN,SAAU,GACV,UAAW,GACX,SAAU,GACV,YAAa,aACb,YACE,2KACJ,CACF,EACA,cAAe,CAAC,GAAO,EAAK,EAC5B,WAAY,GACZ,gBAAiB,SACjB,SAAU,KAAiC,QAC3C,UAAW,KAAmB,QAC9B,SAAU,KACV,oBAAqB,KACrB,eAAgB,IACd,uRACJ,EACA,CACE,GAAI,KAAgB,OACpB,KAAM,SACN,OAAQ,CACN,CACE,KAAM,SACN,KAAM,SACN,SAAU,GACV,YAAa,OACb,YAAa,kEACb,SAAU,EACZ,CACF,EACA,cAAe,CAAC,EAAE,EAClB,WAAY,GACZ,gBAAiB,SACjB,SAAU,KAAiC,QAC3C,UAAW,KAAmB,QAC9B,SAAU,CAACC,EAAOxQ,EAAKyQ,IAAc,GAAGA,CAAS,eAAeD,EAAM,OAAO,CAAC,CAAC,KAC/E,oBAAqB,KACrB,eAAgB,IACd,ggBACJ,EACA,CACE,GAAI,KAAgB,QACpB,KAAM,UACN,OAAQ,CACN,CACE,KAAM,SACN,KAAM,SACN,SAAU,GACV,YAAa,uBACb,YAAa,2DACb,SAAU,EACZ,CACF,EACA,cAAe,CAAC,EAAE,EAClB,WAAY,GACZ,gBAAiB,SACjB,SAAU,KAAiC,QAC3C,UAAW,KAAmB,QAC9B,SAAU,CAACA,EAAOxQ,EAAKyQ,IAAc,GAAGA,CAAS,gBAAgBD,EAAM,OAAO,CAAC,CAAC,KAChF,oBAAqB,KACrB,eAAgB,IACd,0YACJ,EACA,CACE,GAAI,KAAgB,OACpB,KAAM,SACN,OAAQ,CAAC,EACT,cAAe,CAAC,EAChB,WAAY,GACZ,gBAAiB,SACjB,SAAU,KAAiC,QAC3C,UAAW,KAAmB,QAC9B,SAAU,KACV,oBAAqB,KACrB,eAAgB,IACd,kTACJ,EACA,CACE,GAAI,KAAgB,WACpB,KAAM,cACN,OAAQ,CACN,CACE,KAAM,SACN,KAAM,SACN,SAAU,GACV,YAAa,mBACb,YAAa,wEACb,SAAU,EACZ,CACF,EACA,cAAe,CAAC,EAAE,EAClB,WAAY,GACZ,gBAAiB,SACjB,SAAU,KAAiC,QAC3C,UAAW,KAAmB,eAC9B,SAAU,CAACA,EAAOxQ,EAAKyQ,IAAc,GAAGA,CAAS,oBAAoBD,EAAM,OAAO,CAAC,CAAC,KACpF,oBAAqB,KACrB,eAAgB,IACd;AAAA;AAAA;AAAA;AAAA;AAAA,SAMJ,EACA,CACE,GAAI,KAAgB,YACpB,KAAM,eACN,OAAQ,CACN,CAAE,KAAM,QAAS,KAAM,QAAS,EAChC,CAAE,KAAM,YAAa,KAAM,QAAS,CACtC,EACA,cAAe,CAAC,GAAI,EAAE,EACtB,WAAY,GACZ,gBAAiB,SACjB,SAAU,KAAiC,QAC3C,UAAW,KAAmB,eAC9B,SAAU,CAACA,EAAOxQ,EAAKyQ,IAAc,GAAGA,CAAS,mBAAmBD,EAAM,OAAO,CAAC,CAAC,IAAIA,EAAM,OAAO,CAAC,CAAC,GACtG,oBAAqB,KACrB,eAAgB,IACd,0RAMJ,EAEA,CACE,GAAI,KAAgB,aACpB,KAAM,gBACN,OAAQ,CACN,CACE,KAAM,GACN,KAAM,SACN,SAAU,GACV,UAAW,GACX,YAAa,eACb,YAAa,yCACb,SAAU,GACV,gBAAiB,EACnB,CACF,EACA,cAAe,CAAC,EAAE,EAClB,WAAY,GACZ,gBAAiB,cACjB,SAAU,KAAiC,YAC3C,UAAW,KAAmB,YAC9B,YAAU,MAAsB,IAAI,EACpC,oBAAqB,KACrB,eAAiBtS,GAAO,0CAA0CA,EAAG,QAAQ,KAAK,SAAS,CAAC,KAC9F,EACA,CACE,GAAI,KAAgB,gBACpB,KAAM,wBACN,OAAQ,CACN,CACE,KAAM,GACN,KAAM,SACN,SAAU,GACV,UAAW,GACX,YAAa,kBACb,YAAa,iDACb,SAAU,GACV,gBAAiB,EACnB,CACF,EACA,cAAe,CAAC,EAAE,EAClB,WAAY,GACZ,gBAAiB,cACjB,SAAU,KAAiC,YAC3C,UAAW,KAAmB,YAC9B,YAAU,MAAsB,IAAI,EACpC,oBAAqB,KACrB,eAAiBA,GAAO,mDAAmDA,EAAG,QAAQ,KAAK,SAAS,CAAC,KACvG,EACA,CACE,GAAI,KAAgB,4BACpB,KAAM,iCACN,OAAQ,CACN,CACE,KAAM,GACN,KAAM,SACN,SAAU,GACV,UAAW,GACX,YAAa,eACb,YAAa,yCACb,SAAU,GACV,gBAAiB,EACnB,CACF,EACA,cAAe,CAAC,EAAE,EAClB,WAAY,GACZ,gBAAiB,cACjB,SAAU,KAAiC,YAC3C,UAAW,KAAmB,YAC9B,YAAU,MAAsB,KAAM,EAAI,EAC1C,oBAAqB,KACrB,eAAiBA,GAAO,2CAA2CA,EAAG,QAAQ,KAAK,aAAa,CAAC,KACnG,EACA,CACE,GAAI,KAAgB,+BACpB,KAAM,yCACN,OAAQ,CACN,CACE,KAAM,GACN,KAAM,SACN,SAAU,GACV,UAAW,GACX,YAAa,kBACb,YAAa,iDACb,SAAU,GACV,gBAAiB,EACnB,CACF,EACA,cAAe,CAAC,EAAE,EAClB,WAAY,GACZ,gBAAiB,cACjB,SAAU,KAAiC,YAC3C,UAAW,KAAmB,YAC9B,YAAU,MAAsB,KAAM,EAAI,EAC1C,oBAAqB,KACrB,eAAiBA,GAAO,oDAAoDA,EAAG,QAAQ,KAAK,aAAa,CAAC,KAC5G,EACA,CACE,GAAI,KAAgB,iBACpB,KAAM,4BACN,OAAQ,CACN,CACE,KAAM,GACN,KAAM,SACN,SAAU,GACV,UAAW,GACX,YAAa,mBACb,YAAa,+CACb,SAAU,GACV,gBAAiB,EACnB,CACF,EACA,cAAe,CAAC,EAAE,EAClB,WAAY,GACZ,gBAAiB,cACjB,SAAU,KAAiC,YAC3C,UAAW,KAAmB,YAC9B,YAAU,MAAsB,IAAI,EACpC,oBAAqB,KACrB,eAAiBA,GAAO,0DAA0DA,EAAG,QAAQ,KAAK,SAAS,CAAC,KAC9G,EACA,CACE,GAAI,KAAgB,oBACpB,KAAM,4BACN,OAAQ,CACN,CACE,KAAM,GACN,KAAM,SACN,SAAU,GACV,UAAW,GACX,YAAa,qBACb,YAAa,wDACb,SAAU,GACV,gBAAiB,EACnB,CACF,EACA,cAAe,CAAC,EAAE,EAClB,WAAY,GACZ,gBAAiB,cACjB,SAAU,KAAiC,YAC3C,UAAW,KAAmB,YAC9B,YAAU,MAAsB,IAAI,EACpC,oBAAqB,KACrB,eAAiBA,GACf,kEAAkEA,EAAG,QAAQ,KAAK,SAAS,CAAC,KAChG,EACA,CACE,GAAI,KAAgB,oBACpB,KAAM,4BACN,OAAQ,CACN,CACE,KAAM,WACN,KAAM,SACN,SAAU,GACV,QAAS,CAAC,KAAc,SAAU,KAAc,cAAc,CAChE,EACA,CACE,KAAM,UACN,KAAM,SACN,YAAa,YACb,SAAU,GACV,gBAAiB,EACnB,CACF,EACA,cAAe,CAAC,KAAM,EAAE,EACxB,WAAY,GACZ,gBAAiB,cACjB,SAAU,KAAiC,YAC3C,UAAW,KAAmB,YAC9B,SAAU,CAACA,EAAI8B,EAAKyQ,IAAc,GAAGA,CAAS,IAAIvS,EAAG,OAAO,CAAC,CAAC,SAASA,EAAG,OAAO,CAAC,CAAC,MACnF,oBAAqB,KACrB,eAAiBA,GAAO,2CAA2CA,EAAG,OAAO,CAAC,CAAC,IACjF,EACA,CACE,GAAI,KAAgB,YACpB,KAAM,0BACN,OAAQ,CACN,CAAE,KAAM,QAAS,KAAM,SAAU,SAAU,EAAG,EAC9C,CACE,KAAM,WACN,KAAM,SACN,SAAU,GACV,QAAS,CACP,KAAc,OACd,KAAc,aACd,KAAc,aACd,KAAc,kBACd,KAAc,YACd,KAAc,SACd,KAAc,mBACd,KAAc,eAChB,CACF,EACA,CAAE,KAAM,QAAS,KAAM,SAAU,SAAU,EAAG,CAChD,EACA,cAAe,CAAC,GAAI,IAAK,EAAE,EAC3B,WAAY,GACZ,gBAAiB,eACjB,SAAU,KAAiC,aAC3C,UAAW,KAAmB,eAC9B,SAAU,KACV,oBAAqB,KACrB,eAAgB,IAAM,+EACxB,EACA,CACE,GAAI,KAAgB,qBACpB,KAAM,6BACN,OAAQ,CACN,CAAE,KAAM,QAAS,KAAM,SAAU,SAAU,EAAG,EAC9C,CACE,KAAM,WACN,KAAM,SACN,SAAU,GACV,QAAS,CAAC,KAAc,OAAQ,KAAc,YAAY,CAC5D,EACA,CAAE,KAAM,QAAS,KAAM,SAAU,SAAU,EAAG,CAChD,EACA,cAAe,CAAC,GAAI,IAAK,EAAE,EAC3B,WAAY,GACZ,gBAAiB,eACjB,SAAU,KAAiC,aAC3C,UAAW,KAAmB,eAC9B,SAAU,CAACsS,EAAOxQ,EAAKyQ,IACrB,GAAGA,CAAS,MAAMD,EAAM,OAAO,CAAC,CAAC,IAAIA,EAAM,OAAO,CAAC,CAAC,SAASA,EAAM,OAAO,CAAC,CAAC,MAC9E,oBAAqB,KACrB,eAAiBtS,GAAO,2CAA2CA,EAAG,OAAO,CAAC,CAAC,YAAYA,EAAG,OAAO,CAAC,CAAC,UACzG,EACA,CACE,GAAI,KAAgB,oBACpB,KAAM,qBACN,OAAQ,CAAC,EACT,cAAe,CAAC,EAChB,WAAY,GACZ,gBAAiB,eACjB,SAAU,KAAiC,aAC3C,UAAW,KAAmB,SAC9B,SAAU,CAACsS,EAAOxQ,EAAKyQ,IAAc,GAAGA,CAAS,oBACjD,oBAAqB,KACrB,eAAgB,IAAM,+CACxB,EACA,CACE,GAAI,KAAgB,OACpB,KAAM,SACN,OAAQ,CACN,CACE,KAAM,aACN,KAAM,SACN,SAAU,GACV,SAAU,GACV,YAAa,YACb,OAAQjB,CACV,EACA,CACE,KAAM,sBACN,SAAU,GACV,KAAM,SACN,QAAS,CAAC,WAAY,mBAAoB,OAAO,EACjD,SAAU,EACZ,CACF,EACA,cAAe,CAAC,GAAI,EAAE,EACtB,WAAY,GACZ,gBAAiB,SACjB,SAAU,KAAiC,QAC3C,UAAW,KAAmB,OAC9B,SAAU,CAACtR,EAAI8B,EAAKyQ,IAClB,GAAGA,CAAS,aAAavS,EAAG,OAAO,CAAC,EAAI,GAAGA,EAAG,OAAO,CAAC,CAAC,IAAIA,EAAG,OAAO,CAAC,CAAC,IAAMA,EAAG,OAAO,CAAC,CAAC,GAC3F,oBAAqB,KACrB,eAAiBA,GAAO,CACtB,IAAI/U,EAAQ,OAAO+U,EAAG,OAAO,CAAC,CAAC,EAAE,OAAS,EAAIA,EAAG,OAAO,CAAC,EAAI,UAC7D,MAAO,6BAA6B/U,CAAK,iFACvC+U,EAAG,OAAO,CAAC,EACP,0BAA0BA,EAAG,OAAO,CAAC,CAAC,iBAAiB/U,CAAK,iFAC5D,EACN,EACF,CACF,EACA,CACE,GAAI,KAAgB,WACpB,KAAM,aACN,OAAQ,CAAC,EACT,cAAe,CAAC,EAChB,WAAY,GACZ,gBAAiB,SACjB,SAAU,KAAiC,QAC3C,UAAW,KAAmB,eAC9B,SAAU,CAAC+U,EAAI8B,EAAKyQ,IAAc,GAAGA,CAAS,gBAC9C,oBAAqB,KACrB,eAAgB,IAAM,mDACxB,EACA,CACE,GAAI,KAAgB,KACpB,KAAM,OACN,OAAQ,CAGN,CACE,KAAM,QACN,KAAM,SACN,UAAW,GACX,SAAU,GACV,SAAU,GACV,YAAa,gBACb,YAAa,wCACf,CACF,EACA,cAAe,CAAC,EAAE,EAClB,WAAY,GACZ,gBAAiB,SACjB,SAAU,KAAiC,QAC3C,UAAW,KAAmB,eAC9B,SAAU,KACV,oBAAqB,KACrB,eAAgB,IAAM,iEACxB,EACA,CACE,GAAI,KAAgB,KACpB,KAAM,OACN,OAAQ,CAGN,CACE,KAAM,QACN,KAAM,SACN,UAAW,GACX,SAAU,GACV,SAAU,GACV,YAAa,gBACb,YAAa,wCACf,CACF,EACA,cAAe,CAAC,EAAE,EAClB,WAAY,GACZ,gBAAiB,SACjB,SAAU,KAAiC,QAC3C,UAAW,KAAmB,eAC9B,SAAU,KACV,oBAAqB,KACrB,eAAgB,IACd,wGACJ,EACA,GAAGC,EAAA,EACH,CACE,GAAI,KAAgB,YACpB,KAAM,8BACN,OAAQ,CAAC,EACT,cAAe,CAAC,EAChB,WAAY,GACZ,SAAU,KAAiC,UAC3C,SAAU,CAACF,EAAOxQ,EAAKyQ,IAAcA,EACrC,oBAAqB,IACvB,CACF,CAGF,CAGO,MAAME,EAAuBT,EAAwB,EAMrD,SAASU,GAAgB7R,EAAsC,CAMpE,OALmB4R,EAAqB,KAAM7T,GAAcA,EAAU,KAAOiC,CAAE,GAEnD,iBAAiB,CAAE,GAAI,GAAI,OAAQ,CAAC,SAAS,CAAE,CAAC,GAAK,IAGlE,QAAQ,kBAAmB,IAAI,CAChD,CAEO,SAAS8R,EAAkB9R,EAAyD,CACzF,OAAO4R,EAAqB,KAAMG,GAAMA,EAAE,KAAO/R,CAAE,CACrD,CAEO,SAASgS,EACd/Q,EACA3B,EACS,CAET,MAAI,EAAAA,EAAO,OAAS2B,EAAI,OAAO,OAAQgR,IAAU,CAACA,GAAM,QAAQ,EAAE,OAKpE,C,iKC9mBO,MAAMC,EAAsB,CAAC,CAClC,QAAAntB,EACA,aAAAC,EACA,iBAAAmtB,EAAmB,CAAC,EACpB,MAAAltB,EACA,UAAAmtB,GACA,mBAAA1yB,EACA,sBAAAC,GACA,WAAAwiB,GACA,eAAAkQ,GACA,iBAAAnQ,EACA,MAAA3F,EACA,gBAAA+V,EACA,kBAAAC,EACA,GAAGnwB,CACL,IAA6B,CAC3B,KAAM,CAAE,UAAAgD,EAAW,iBAAAyV,CAAiB,KAAI,OAAkB,EACpD2X,KAAW,WAAQ,IAAM,IAAIC,EAAA,EAAe,CAAC,CAAC,EAC9CvN,KAAM,UAAO,IAAI,EAEjB3uB,KAAS,MAAW0I,CAAS,EAEnC,GAAI,CAACmzB,IAAa,CAAC7V,GAAS,CAAC2F,EAAkB,CAC7C,QAAQ,MAAM,gDAAgD,EAC9D,MACF,CAEA,MAAMwQ,EAA6BnW,GAAS,KAA0B,IAChEuH,EAAavH,GAAS,KAAiB,IAE7C,SACE,QAAC,OAAI,IAAA2I,EAAU,UAAW3uB,EAAO,iBAC/B,oBAACo8B,EAAA,GAAe,CAAC,SAAAH,EAAoB,kBAAAD,CAAA,CAAsC,KAC3E,OAAC,OAAI,UAAWh8B,EAAO,QAAS,cAAY,eAE1C,mBAACyrB,EAAA,GACC,cAAe5c,EACf,MAAAH,EACA,UAAAmtB,GACA,SAAUhwB,EAAK,SACf,MAAOyY,EAAmB6X,EAA6B5O,EACvD,WAAYwO,GAAmB,CAAC,EAChC,mBAAA5yB,EACA,sBAAAC,GACA,WAAAwiB,GACA,iBAAAD,EACA,eAAAmQ,EAAA,CACF,EACF,GACF,CAEJ,EAEMpzB,EAAaC,IACV,CACL,WAAS,OAAI,CACX,UAAW,UACX,MAAO,MACT,CAAC,EACD,oBAAkB,OAAI,CACpB,QAAS,OACT,cAAe,aACjB,CAAC,CACH,G,sCCjBK,MAAM0zB,KAAoB,cAC/B,CACE,CACE,iBAAAT,EACA,cAAAla,EACA,aAAAC,EACA,WAAA2a,EACA,SAAAzZ,GACA,SAAAb,EACA,qBAAAT,GACA,cAAAnG,GACA,mBAAAmhB,GACA,mBAAAla,EACA,eAAAlY,EACA,GAAG0B,CACL,EACA8iB,OAGE,QAAC/N,GAAA,IACC,IAAK/U,EAAK,KAAO,KAAQ,QACzB,gBAAiB,CAAC,EAClB,cAAA6V,EACA,iBAAkB,GAClB,aAAAC,EACA,SAAS,UACT,qBAAAJ,GACA,KAAMqa,GAAoB,CAAC,EAC3B,SAAA5Z,EACA,aAAcua,GACd,aAAY,GACZ,SAAA1Z,GACA,iBAAkByZ,EAClB,UAAWlhB,IAAiB,KAAc,WAC1C,mBAAAiH,EACA,eAAAlY,EAEC,UAAA0B,EAAK,oBAAsB,WAC1B,OAAC2wB,EAAA,CAAiB,IAAA7N,EAAW,GAAG9iB,EAAM,iBAAA+vB,CAAA,CAAoC,EAE3E/vB,EAAK,oBAAsB,SAAWA,EAAK,qBAAoB,OAAC8vB,EAAmB,CAAE,GAAG9vB,CAAA,CAAM,GACjG,CAGN,EAEAwwB,EAAkB,YAAc,oBAEhC,MAAMG,KAAmB,cACvB,CACE,CACE,QAAAhuB,EACA,aAAAC,EACA,iBAAAmtB,EAAmB,CAAC,EACpB,MAAAltB,EACA,eAAgB+tB,GAChB,GAAG5wB,CACL,EACA8iB,KACG,CACH,KAAM,CACJ,IAAAhlB,GACA,cAAA+X,GACA,aAAAC,EACA,YAAAkD,EACA,aAAAjB,EACA,UAAA/U,EACA,SAAAgU,EACA,iBAAAC,EACA,eAAA3Y,CACF,KAAI,OAAkB,EAChB8xB,KAAW,WAAQ,IAAM,IAAIC,EAAA,EAAe,CAAC,CAAC,EAC9CQ,KAAmB,UAA8B,IAAI,KAE3D,aAAU,IAAM,CACd,MAAMC,EAAeV,EAAS,UAAU,KAAoB5wB,GAC1DuxB,GAAoBvxB,EAAGqxB,EAAiB,OAAO,CACjD,EACA,MAAO,IAAMC,EAAa,YAAY,CACxC,EAAG,CAACV,CAAQ,CAAC,KAEb,uBAAkEtN,GAAK,IAAM+N,EAAiB,OAAO,EAErG,MAAMjX,KAAe,WACnB,IACE9D,EAAa,SAAW,EACpBia,EACAA,EAAiB,OAAQ77B,GAAQ4hB,EAAa,SAAS5hB,EAAI,QAAQ,CAAC,EAC1E,CAAC4hB,EAAcia,CAAgB,CACjC,EAEMiB,KAAyB,WAAQ,IACjClO,GACK3uB,EAAO,2BAETM,EAAA,EAAO,eAAe,sBAAwBN,EAAO,kBAAoBA,EAAO,QACtF,CAAC2uB,EAAG,CAAC,EAEFmO,KAAiB,eACpBnsB,GAAyB,CACxB,GAAI8rB,GAAoB,CACtBA,GAAmB9rB,CAAO,EAC1B,MACF,CACI+rB,EAAiB,SACnBA,EAAiB,QAAQ,OAAO,CAC9B,SAAU,SACV,IAAKA,EAAiB,QAAQ,UAAY/rB,EAAQ,sBAAsB,EAAE,IAAM,OAAO,YAAc,CACvG,CAAC,CAEL,EACA,CAAC8rB,EAAkB,CACrB,EAEA,SACE,QAAC,OAAI,UAAWz8B,EAAO,iBACrB,oBAACo8B,EAAA,GAAe,CAAC,SAAAH,CAAA,CAAoB,KACrC,OAAC,OAAI,IAAKS,EAAkB,UAAWG,EACrC,mBAACvuB,GAAA,IACC,QAAAE,EACA,aAAAC,EACA,MAAAC,EACA,SAAU7C,EAAK,SACf,KAAM4Z,EACN,cAAeiX,EAAiB,QAChC,UAAA7tB,EAEA,mBAAC6Q,EAAA,GACE,GAAG7T,EACJ,IAAAlC,GACA,cAAA+X,GACA,iBAAkB+D,EAClB,YAAAZ,EACA,QAASY,EACT,cAAe5W,EACf,cAAe6tB,EAAiB,QAChC,mBAAoB,EAAQ9Y,EAC5B,eAAAkZ,EACA,WAAY,EAAQha,EACpB,SAAAD,EACA,eAAA1Y,CAAA,CACF,EACF,EACF,GACF,CAEJ,CACF,EAEAqyB,EAAiB,YAAc,mBAE/B,SAASI,GAAoB/sB,EAA0BjB,EAAsC,CACvFiB,EAAM,QAAQ,WAAa,MAC7BjB,GAAe,SAAS,EAAG,CAAC,EACnBA,GACTA,EAAc,SAAS,EAAGA,EAAc,YAAY,CAExD,CAEA,MAAM5O,EAAS,CACb,qBAAmB,OAAI,CACrB,UAAW,OACX,MAAO,OACP,UAAW,MACb,CAAC,EACD,8BAA4B,OAAI,CAC9B,UAAW,OACX,MAAO,OACP,UAAW,MACb,CAAC,EACD,WAAS,OAAI,CACX,UAAW,SACX,UAAW,UACX,MAAO,MACT,CAAC,EACD,oBAAkB,OAAI,CACpB,QAAS,OACT,cAAe,cACf,OAAQ,MACV,CAAC,CACH,C,mPCvOA,MAAM+8B,EAAuB,CAC3B,gBAAiB,0BACjB,mBAAoB,wBACtB,EAEMC,EAAyB,CAC7B,iBAAkB,4FAClB,iBAAkB,wDAClB,qBAAsB,6CACtB,mBAAoB,6DACtB,EAEMC,EAAuB,CAC3B,qBAAsB,CACpB,QAAS,yCACT,WAAY,EACd,EACA,mBAAoB,CAClB,QAAS,yCACT,WAAY,GACZ,OAAQ,CACN,GAAGD,CACL,CACF,EACA,iBAAkB,oCACpB,EAEaE,GAAsBn9B,GAAsB,CACvD,MAAMsN,EAAS,OAAO,KAAKtN,EAAI,MAAM,EAAE,OAAOA,EAAI,OAAO,IAAKmO,GAAUA,EAAM,KAAK,CAAC,CAAC,CAAC,EAChFivB,EAAwB,CAC5B,kBAAmB,IAAI,OAAO,OAAO9vB,EAAO,KAAK,GAAG,CAAC,kBAAmB,GAAG,CAC7E,EACA,OAAItN,EAAI,OACC,CACL,GAAGo9B,EACH,GAAGF,CACL,EAEK,CACL,GAAGE,EACH,GAAGH,EACH,GAAGD,CACL,CACF,EAEaK,EAA2B,CAACC,EAAuC,CAAC,EAAGC,IAA6B,CAM/G,MAAMC,EAAcF,EACjB,IAAKG,GAAS,CACb,KAAM,CAAE,QAAAC,EAAS,MAAArU,CAAM,KAAI,OAAWsU,EAAYF,CAAI,CAAC,EACvD,GAAI,CACF,OAAO,IAAI,OAAO,MAAMC,CAAO,IAAKrU,CAAK,CAC3C,OAAS/d,EAAG,CACV,QAAQ,MAAM,sEAAsEoyB,CAAO,IAAIrU,CAAK,GAAI/d,CAAC,CAC3G,CAEF,CAAC,EACA,OAAQsyB,GAAeA,IAAe,MAAS,EAElD,GAAIL,EACF,GAAI,CACFC,EAAY,KAAK,IAAI,UAAO,MAAYD,CAAM,EAAG,IAAI,CAAC,CACxD,OAASjyB,EAAG,CACV,QAAQ,MAAM,sEAAsEiyB,CAAM,MAAOjyB,CAAC,CACpG,CAEF,OAAKkyB,EAAY,OAGV,CACL,mBAAoBA,CACtB,EAJS,CAAC,CAKZ,EAEMG,EAAeE,GACZA,EAAO,QAAQ,2BAA4B,EAAE,EC7DhDC,EAA4B,IACrBC,EAAiB,gBAEvB,MAAMC,CAAoC,CA2C/C,YACEh+B,EACA,CAAE,OAAAi+B,EAAQ,cAAA7wB,EAAe,QAAA8wB,EAAS,aAAAra,EAAc,SAAA9U,EAAU,eAAAovB,EAAgB,eAAA/zB,CAAe,EACzF,CA7CF,eAAiC,OA2BjC,0BAAuB,GAEvB,KAAQ,MAA4B,OACpC,KAAQ,eAAqC,OAE7C,KAAQ,iBAAuC,OAC/C,KAAQ,gCAAqE,OAC7E,KAAQ,iBAAsD,OAC9D,KAAQ,QAAkC,OAC1C,KAAQ,eAA8C,OAItD,KAAQ,MAAQ,GAOd,KAAK,eAAiBpK,EAAI,eAC1B,KAAK,UAAYA,EAAI,UACrB,KAAK,cAAgBA,EAAI,cACzB,KAAK,WAAaA,EAAI,WACtB,KAAK,MAAQA,EAAI,MACjB,KAAK,gBAAkBA,EAAI,gBAC3B,KAAK,QAAUA,EAAI,QACnB,KAAK,SAAW,CAAC,IAAC,OAAeA,CAAG,EACpC,KAAK,oBAAsBA,EAAI,oBAC/B,KAAK,UAAY,CAAC,IAAC,OAAiBA,CAAG,EACvC,KAAK,OAASA,EAAI,OAClB,KAAK,SAAWA,EAAI,SACpB,KAAK,gBAAe,MAAqBA,CAAG,EAC5C,KAAK,SAAWA,EAAI,SACpB,KAAK,MAAQA,EAAI,MACjB,KAAK,YAAcA,EAAI,YACvB,KAAK,YAAcA,EAAI,YACvB,KAAK,YAAcA,EAAI,YACvB,KAAK,YAAcA,EAAI,YACvB,KAAK,UAAYA,EAAI,UACrB,KAAK,QAAUA,EAAI,QACnB,KAAK,IAAMA,EAAI,IACf,KAAK,aAAeA,EAAI,aAGxB,KAAK,aAAeo+B,GAAuBp+B,EAAI,QAAQ,EACvD,KAAK,eAAiBoN,EACtB,KAAK,SAAW8wB,EAChB,KAAK,cAAgB,EAAQra,EAC7B,KAAK,aAAY,MAAe7jB,EAAI,YAAa,CAC/C,SAAA+O,EAEA,OAAQ,KAAkB,UAC5B,CAAC,EACD,KAAK,gBAAkBovB,EACvB,KAAK,gBAAkB/zB,EAEvB,IAAIi0B,EAAMr+B,EAAI,IACVi+B,GAAUj+B,EAAI,sBAChBq+B,KAAM,OAAsBA,CAAG,GAEjC,KAAK,IAAMA,EAEP99B,EAAA,EAAO,eAAe,oBAAsB,KAAK,eACnD,KAAK,OAAO,IAAmC,KAAI,MAAuB,KAAM6J,CAAc,EAElG,CAEA,OAAQ,CACN,MAAMk0B,EAAQ,OAAO,OAAO,OAAO,OAAO,OAAO,eAAe,IAAI,CAAC,EAAG,IAAI,EAE5E,OAAAA,EAAM,gBAAkB,GACxBA,EAAM,MAAQ,OACdA,EAAM,iBAAmB,OAClBA,CACT,CAEA,IAAI,MAAe,CACjB,GAAI,KAAK,QAAU,OAAW,CAC5B,GAAI,CACF,MAAM79B,KAAS,MAAM,KAAK,GAAG,EACzB,OAAOA,GAAW,UAAYA,IAAW,MAAQ,EAAEA,aAAkB,QACvE,KAAK,MAAQ,IAEf,MAAM89B,EAAgB,KAAK,iBAAmB,KAAK,iBAAgB,MAAU99B,EAAQ,OAAW,CAAC,EAAI,KAAK,IACtG89B,IACF,KAAK,IAAMA,EAEf,MAAgB,CAAC,CACjB,MAAMF,EAAM,KAAK,IACjB,KAAK,MAAQ,KAAK,UACdA,EAAI,UAAU,EAAG,KAAK,iBAAiB,oBAAoB,IAAI,GAAKP,CAAyB,EAC7FO,EACC,KAAK,kBACR,KAAK,MAAQ,KAAK,MAAM,QAAQN,EAAgB,EAAE,EAEtD,CACA,OAAO,KAAK,KACd,CAEA,IAAI,cAAmC,CACrC,SAAO,OAAe,IAAI,CAC5B,CAEA,IAAI,QAAqB,CACvB,OAAI,KAAK,UAAY,SACnB,KAAK,WAAU,MAAa,KAAM,KAAK,cAAc,GAEhD,KAAK,OACd,CAEA,IAAI,iBAAkB,CACpB,GAAI,KAAK,mBAAqB,OAAW,CAEvC,MAAMS,EAAO,KAAK,KAClB,KAAK,SAAW,KAAK,UAAYrB,GAAmB,IAAI,EACxD,MAAMsB,EAAepB,EAAyB,KAAK,YAAa,KAAK,cAAc,EACnF,KAAK,iBAAmB,cAAgBmB,EAAM,CAAE,GAAGC,EAAc,GAAG,KAAK,QAAS,EAAG,MAAM,CAC7F,CACA,OAAO,KAAK,gBACd,CAEA,IAAI,uBAAwB,CAC1B,GAAI,KAAK,mBAAqB,OAAW,CAEvC,MAAMD,EAAO,KAAK,KAClB,KAAK,SAAW,KAAK,UAAYrB,GAAmB,IAAI,EACxD,MAAMsB,EAAepB,EAAyB,KAAK,YAAa,KAAK,cAAc,EACnF,KAAK,iBAAmB,aAAemB,EAAM,CAAE,GAAGC,EAAc,GAAG,KAAK,QAAS,CAAC,CACpF,CACA,OAAO,KAAK,gBACd,CAEA,IAAI,gCAAiC,CACnC,GAAI,KAAK,kCAAoC,OAAW,CACtD,MAAMC,EAAa,KAAK,OAAO,IAAmC,GAAK,GACvE,GAAI,CAACA,EACH,MAAO,CAAC,EAEV,KAAK,SAAW,KAAK,UAAYvB,GAAmB,IAAI,EACxD,MAAMsB,EAAepB,EAAyB,KAAK,YAAa,KAAK,cAAc,EACnF,KAAK,gCAAkC,aAAeqB,EAAY,CAAE,GAAGD,EAAc,GAAG,KAAK,QAAS,CAAC,CACzG,CACA,OAAO,KAAK,+BACd,CAEA,IAAI,QAAS,CACX,OAAO,KAAK,KACd,CAEA,IAAI,gBAAqC,CACvC,SAAO,OAAiB,IAAI,CAC9B,CAEA,IAAI,aAAsB,CACxB,IAAIE,EAAS,KAAK,YAAY,UAAU,KAAK,YAAY,SAAS,EAAE,MAAM,EAC1E,OAAO,KAAK,UAAYA,CAC1B,CAEA,uBAAuBC,EAAmBC,EAAY,GAAe,CACnE,GAAID,IAAc,IAChB,OAAOC,EAAYC,EAAA,SAAgB,KAAK,IAAI,EAAI,KAAK,KAEvD,IAAIC,EAAa,GACjB,GAAI,KAAK,OAAOH,CAAS,GAAK,KAC5BG,EAAa,KAAK,OAAOH,CAAS,MAC7B,CACL,MAAMzwB,EAAQ,KAAK,OAAO,KAAMA,GACvBA,EAAM,KAAK,CAAC,IAAMywB,CAC1B,EAEDG,EAAa5wB,EAAQA,EAAM,OAAO,SAAS,EAAI,EACjD,CACA,OAAK,KAAK,gBAGH4wB,EAFEA,EAAW,QAAQhB,EAAgB,EAAE,CAGhD,CAEA,qBAAqB5zB,EAA2B8c,EAAkC,CAChF,MAAMrN,EACJzP,EAAgB,OAAS,EACrBA,EAAgB,IAAKgE,GAAU,KAAK,uBAAuBA,EAAO,EAAI,CAAC,EAAE,KAAK,EAAE,EAChF,KAAK,KAGX,IAAI6wB,EACFplB,EAAK,SAAW,KAAK,iBAAiB,oBAAoBqN,CAAS,GAAK6W,GACpE,GACA,OAGN,GAAI,CAACkB,GAAa,KAAK,gBAAiB,CACtC,MAAMC,EAAkB,KAAK,gBAAgB,uBAAuB,EACpED,EAAYE,GAActlB,EAAMqlB,CAAe,GAAKA,EAAkB,GAAOD,CAC/E,EAEI,KAAK,YAAc,QAAaA,IAAc,UAChD,KAAK,UAAYA,EACjB,KAAK,MAAQ,OACb,KAAK,iBAAmB,OAE5B,CAEA,kBAAkBA,EAAoB,CAChC,KAAK,YAAcA,IACrB,KAAK,MAAQ,OACb,KAAK,iBAAmB,QAE1B,KAAK,UAAYA,CACnB,CAEA,iBAAiBzB,EAA4B,CAC3C,KAAK,eAAiBA,EACtB,KAAK,iBAAmB,OACxB,KAAK,gCAAkC,MACzC,CACF,CAYO,MAAM4B,GAAiB,CAC5Bpd,EACA,CAAE,OAAAkc,EAAQ,cAAA7wB,EAAe,MAAAgyB,EAAO,aAAAvb,EAAc,SAAA9U,EAAU,eAAAovB,EAAgB,eAAA/zB,CAAe,EACvF8zB,OAEoB,OAAYnc,EAAMqd,CAAK,EACxB,IAAKp/B,GACtBq/B,EAAcr/B,EAAK,CACjB,OAAAi+B,EACA,cAAA7wB,EACA,QAAA8wB,EACA,aAAAra,EACA,SAAA9U,EACA,eAAAovB,EACA,eAAA/zB,CACF,CAAC,CACH,EAYIi1B,EAAgB,CAACr/B,EAAkBy6B,IAChC,IAAIuD,EAAah+B,EAAKy6B,CAAO,EAGtC,SAAS2D,GAAuBkB,EAAQ,GAAI,CAC1C,OAAQA,EAAO,CACb,KAAK,KAAS,SACZ,MAAO,OACT,KAAK,KAAS,QACZ,MAAO,OACT,KAAK,KAAS,QACZ,MAAO,GACT,QACE,OAAOA,CACX,CACF,CAEA,SAASJ,GAAcl/B,EAAau/B,EAAQ,IAAU,CACpD,IAAIzf,EAAQ,EACZ,QAAS7c,EAAI,EAAGA,EAAIjD,EAAI,OAAQ,EAAEiD,EAAG,CAEnC,GAAI6c,EAAQ,IACV,OAAOA,EAEL9f,EAAIiD,CAAC,IAAM;AAAA,EACb6c,GAAS,EACA9f,EAAIiD,CAAC,IAAM,OACpB6c,GAAS,EAEL9f,EAAIiD,CAAC,IAAM;AAAA,IACbA,GAAK,GAGX,CACA,OAAO6c,CACT,CAEO,SAAS0f,GAAkBzd,EAAsB,CACtD,MAAM0d,EAAS,IAAI,IACnB,UAAWz/B,KAAO+hB,EAChB0d,EAAO,IAAIz/B,EAAI,QAAQ,EAEzB,OAAO,MAAM,KAAKy/B,CAAM,EAAE,OAAQH,GAAUA,GAAS,IAAI,CAC3D,CAEO,SAASI,EAAuBvxB,EAAe,CACpD,OAAIA,IAAU,OACL,KAAE,uCAAwC,UAAU,EAClDA,IAAU,QACZ,KAAE,6CAA8C,iBAAiB,EAEnEA,CACT,C,uJCvWO,MAAMwxB,CAAe,CAG1B,aAAc,CACZ,KAAK,KAAO,IAAI,IAChB,KAAK,MAAQ,CACf,CAEA,OAAOC,EAAqB,CAC1B,KAAK,OAAS,EACd,MAAMC,EAAW,KAAKD,CAAW,GACjC,OAAI,KAAK,KAAK,IAAIC,CAAQ,EACjB,KAAK,KAAK,KAAK,IAEtB,KAAK,KAAK,IAAIA,CAAQ,EACfA,EAEX,CACF,C,mJCmBO,MAAMC,MAAiB,QAC5B,CAAC,CACC,QAAAC,EACA,cAAAtd,EACA,iBAAAD,EACA,UAAAlY,EACA,YAAAoY,EACA,0BAAAnY,GACA,OAAAy1B,EACA,IAAAh3B,EACA,kBAAAi3B,EACA,OAAAhgC,EACA,YAAAigC,EACA,OAAAC,EACA,mBAAA5kB,EACA,YAAA6kB,EACA,WAAAC,EACF,IAAa,CACX,MAAMC,MAA0B,WAC9B,IAAOL,EAAoBA,EAAkBj3B,CAAG,EAAI,GACpD,CAACA,EAAKi3B,CAAiB,CACzB,EACMM,MAAgB,eAAaj1B,IAAsB,CACvDA,GAAE,gBAAgB,CACpB,EAAG,CAAC,CAAC,EACCk1B,KAAqB,eACzB,MAAO1wB,IAAmC,CACxCA,GAAM,gBAAgB,KACtB,KAA2BA,GAAO9G,EAAKuS,EAAoBkH,CAAa,CAC1E,EACA,CAACA,EAAelH,EAAoBvS,CAAG,CACzC,EAKMy3B,KAAa,eAChBn1B,IAAkB,CACb,CAACA,GAAE,cAAc,SAASA,GAAE,aAAa,GAAK60B,GAChDA,EAAO,CAEX,EACA,CAACA,CAAM,CACT,EACMO,KAAa,eAAY,IAAMX,EAAS,CAACA,CAAO,CAAC,EAEjDY,KAAgB,WAAQ,IACvBP,EAGEQ,EAAwBR,EAAap3B,CAAG,EAFtC,KAGR,CAACo3B,EAAap3B,CAAG,CAAC,EAEf63B,MAAe,WAAQ,IACtBR,GAGEO,EAAwBP,GAAYr3B,CAAG,EAFrC,KAGR,CAACq3B,GAAYr3B,CAAG,CAAC,EAEpB,SAGE,QAAC,QAAK,UAAW,gBAAgB/I,EAAO,OAAO,GAAI,QAASsgC,GAAe,OAAQE,EAChF,UAAAT,GAAU,CAACE,MACV,OAACj1B,EAAA,GACC,UAAWhL,EAAO,YAClB,KAAK,KACL,KAAK,SACL,QAAS,IAAMyiB,GAAeA,EAAY1Z,CAAG,EAC7C,WAAS,KAAE,4CAA6C,YAAY,EACpE,iBAAiB,MACjB,gBAAY,KAAE,+CAAgD,YAAY,EAC1E,SAAU,EACZ,EAEDk3B,MACC,oBACG,UAAAS,EACAL,OACC,OAACr1B,EAAA,GACC,KAAK,KACL,KAAK,kBACL,QAASu1B,EACT,WAAS,KAAE,8CAA+C,cAAc,EACxE,iBAAiB,MACjB,gBAAY,KAAE,iDAAkD,cAAc,EAC9E,SAAU,EACZ,KAEF,OAACx2B,EAAA,GACC,UAAW/J,EAAO,cAClB,KAAK,OACL,QAAQ,YACR,KAAK,OACL,KAAK,KACL,QAASygC,EACT,WAAS,KAAE,mDAAoD,mBAAmB,EAClF,iBAAiB,MACjB,SAAU,EACZ,EACCV,GAAUtd,MACT,OAACzX,EAAA,GACC,UAAWhL,EAAO,YAClB,KAAK,KACL,KAAK,SACL,QAAS,IAAMyiB,GAAeA,EAAY1Z,CAAG,EAC7C,WAAS,KAAE,4CAA6C,YAAY,EACpE,iBAAiB,MACjB,gBAAY,KAAE,+CAAgD,YAAY,EAC1E,SAAU,EACZ,EAED,CAACg3B,GAAU11B,MACV,OAACW,EAAA,GACC,UAAWhL,EAAO,YAClB,KAAK,KACL,KAAK,SACL,QAAS,IAAMqK,GAAaA,EAAUtB,CAAG,EACzC,QAASuB,IAA6B,WACtC,iBAAiB,MACjB,gBAAY,KAAE,6CAA8C,UAAU,EACtE,SAAU,EACZ,EAEDiY,GAAoBxZ,EAAI,QAAU,QAAaA,EAAI,QAClD,OAACiC,EAAA,GACC,WAAS,KAAE,gDAAiD,gBAAgB,EAC5E,gBAAY,KAAE,mDAAoD,gBAAgB,EAClF,iBAAiB,MACjB,KAAK,KACL,KAAK,YACL,QAAS,IAAMuX,EAAiBxZ,CAAG,EACnC,SAAU,EACZ,EAED63B,EAAA,EACH,GAEJ,CAEJ,CACF,EAGA,SAASD,EAAwBzrB,EAAoBnM,EAAkB,CACrE,OAAOmM,EAAM,IAAI,CAACC,EAAM9N,IAAU,CAChC,MAAI,kBAAe8N,CAAI,EAAG,CACxB,MAAM0rB,EAAgC1rB,EAAK,MAAM,QACjD,OAAK0rB,KAGE,gBAAa1rB,EAAM,CACxB,QAAUtF,IAAmC,CAC3CgxB,EAAQhxB,GAAO9G,CAAG,CACpB,EACA,IAAK1B,CACP,CAAC,EAPQ8N,CAQX,CACA,OAAOA,CACT,CAAC,CACH,CAEA0qB,GAAe,YAAc,iBC/LtB,MAAMiB,GAAiB,IAmCxBC,GAAa,CAAC,CAAE,QAAAC,EAAS,MAAAviB,EAAO,WAAAwiB,EAAY,OAAAjhC,CAAO,IAAuB,CAC9E,MAAMkhC,KAAmB,WAAQ,IAAMziB,EAAM,OAASqiB,GAAgB,CAACriB,CAAK,CAAC,EACvE0iB,GACJF,GAAcA,EAAW,OAAS,GAAKA,EAAW,CAAC,GAAKA,EAAW,CAAC,EAAE,OAAS,GAAKC,GAAoB,EACpGE,EAAcH,GAAc,CAAC,EAC7B,CAACI,EAAUC,CAAW,KAAI,YAASJ,EAAmB,CAAC,EACvDK,KAAiB,WAAQ,IAAOF,EAAW5iB,EAAQA,EAAM,UAAU,EAAGqiB,EAAc,EAAI,CAACriB,EAAO4iB,CAAQ,CAAC,EAE/G,GAAIL,EAAS,CACX,MAAMQ,EAAYL,GAAmB,CAAE,YAAAC,EAAa,mBAAoBphC,EAAO,qBAAsB,EAAI,OACzG,SAAO,OAACma,EAAA,EAAc,CAAC,MAAOonB,EAAgB,UAAAC,CAAA,CAAsB,CACtE,SAAWL,GACT,SACE,OAAC,KACC,gBAAiBI,EACjB,YAAAH,EACA,WAAY,KACZ,mBAAoBphC,EAAO,sBAC7B,EAGJ,SACE,oBACG,UAAAuhC,EACA,CAACF,MAAY,OAACI,GAAA,CAAS,SAAAJ,EAAoB,OAAQC,EAAa,KAAMJ,CAAA,CAAkB,GAC3F,CAEJ,EAOMO,GAAW,CAAC,CAAE,OAAAC,EAAQ,KAAAC,CAAK,IAAqB,CACpD,MAAM3hC,EAAS4hC,KAAkB,MAAU,CAAC,EACtCC,EAAex2B,GAAsB,CACzCA,EAAE,gBAAgB,EAClBq2B,EAAO,EAAI,CACb,EACA,SACE,oBACE,oBAAC,KAAK,CAAC,QAAQ,gCAAgC,mBAAE,KACjD,QAAC,UAAO,UAAW1hC,EAAO,SAAU,QAAS6hC,EAC1C,UAAAF,EAAK,OAAC,OAAC,KAAK,CAAC,QAAQ,4BAA4B,gBAAI,GACxD,GACF,CAEJ,EAEMC,EAAqBj5B,IAA0B,CACnD,YAAU,OAAI,CACZ,gBAAiB,cACjB,QAAS,cACT,WAAYA,EAAM,WAAW,iBAC7B,SAAUA,EAAM,WAAW,KAAK,GAChC,WAAYA,EAAM,WAAW,WAC7B,OAAQA,EAAM,QAAQ,CAAC,EACvB,QAASA,EAAM,QAAQ,IAAM,CAAC,EAC9B,MAAOA,EAAM,OAAO,UAAU,KAC9B,OAAQ,aAAaA,EAAM,OAAO,OAAO,MAAM,GAC/C,UAAW,CACT,WAAYA,EAAM,OAAO,UAAU,YACnC,YAAaA,EAAM,OAAO,UAAUA,EAAM,OAAO,OAAO,OAAQ,GAAI,EACpE,MAAOA,EAAM,OAAO,UAAU,IAChC,CACF,CAAC,CACH,GAEMm5B,EAAiB,CACrB/4B,EACAwzB,EACApyB,EACA43B,EACAld,IACW,CACX,IAAIlL,GAAO5Q,EAAI,IACf,GAAIwzB,EACF,GAAI,CACF,OAAA5iB,GAAO,KAAK,UAAU,KAAK,MAAMA,EAAI,EAAG,OAAW,CAAC,EAC7C5Q,EAAI,qBAAuB8b,KAAc,MAAsBlL,EAAI,EAAIA,EAChF,MAAgB,CAAC,CAEnB,OAAI5Q,EAAI,qBAAuB8b,IAC7BlL,MAAO,MAAsBA,EAAI,GAG/B,CAACxP,GAAkB,CAAC43B,IACtBpoB,GAAOA,GAAK,QAAQ,gBAAiB,EAAE,GAElCA,EACT,EAEaqoB,KAAgB,QAAMt1B,GAAiB,CAClD,KAAM,CACJ,IAAA3D,EACA,eAAAoB,EACA,mBAAAoyB,EACA,kBAAAyD,EACA,OAAAhgC,GACA,cAAAwiB,EACA,iBAAAD,EACA,YAAAE,EACA,UAAApY,EACA,0BAAAC,EACA,OAAAy1B,EACA,YAAAE,EACA,OAAAC,EACA,mBAAA5kB,GACA,SAAAymB,GACA,sBAAAE,GACA,qBAAAC,EACA,YAAArd,CACF,EAAInY,EACE,CAAE,QAAAs0B,CAAQ,EAAIj4B,EACdo5B,KAAoB,WACxB,IAAML,EAAe/4B,EAAKwzB,EAAoBpyB,EAAgB,EAAQ43B,GAAW,EAAQld,CAAY,EACrG,CAACkd,GAAUld,EAAa0X,EAAoBxzB,EAAKoB,CAAc,CACjE,EACMi4B,GAAiBnC,GAAeF,EAEtC,SACE,oBAKE,oBAAC,MAAG,UAAW//B,GAAO,eACpB,mBAAC,OAAI,UAAWmK,EAAiBnK,GAAO,iBAAmBA,GAAO,iBAChE,mBAAC,OAAI,UAAW,GAAGA,GAAO,OAAO,IAAIA,GAAO,gBAAgB,GAC1D,mBAAC+gC,GAAA,CAAW,QAAAC,EAAkB,MAAOmB,EAAmB,WAAYp5B,EAAI,YAAa,OAAA/I,EAAA,CAAgB,EACvG,EACF,EACF,KACA,OAAC,MAAG,UAAW,qBAAqBA,GAAO,cAAc,GACtD,SAAAoiC,OACC,OAACvC,GAAA,CACC,QAASsC,EACT,IAAAp5B,EACA,kBAAAi3B,EACA,mBAAA1kB,GACA,cAAAkH,EACA,iBAAAD,EACA,UAAAlY,EACA,YAAAoY,EACA,0BAAAnY,EACA,OAAAy1B,EACA,OAAA//B,GACA,YAAAigC,EACA,OAAAC,EACA,YAAa+B,GACb,WAAYC,CAAA,CACd,EAEJ,GACF,CAEJ,CAAC,EAEDF,EAAc,YAAc,gB,0BCnLrB,MAAMK,KAA+B,QAAM31B,GAAiB,CACjE,KAAM,CACJ,IAAA3D,EACA,eAAAu5B,EACA,cAAAn1B,EACA,eAAAhD,EACA,OAAAnK,GACA,YAAAigC,EACA,OAAAF,EACA,sBAAAkC,EACA,qBAAAC,EACA,QAAAK,EACA,GAAG12B,CACL,EAAIa,EACE81B,EAAgBr4B,EAAiB,GAAKs4B,EAAsB,OAC5D30B,KAAS,WAAQ,OAAM,MAAa/E,EAAKoE,CAAa,EAAG,CAACA,EAAepE,CAAG,CAAC,EAE7E4Q,MAAO,WAAQ,IAAM,CACzB,IAAIA,GAAO,GACX,QAAS3W,EAAI,EAAGA,EAAIs/B,EAAe,OAAQt/B,IAAK,CAC9C,MAAM0/B,EAAYJ,EAAet/B,CAAC,EAE9B0/B,IAAc,MAChB/oB,IAAQ,IAAI5Q,EAAI,KAAK,IAGvB,MAAMmF,EAAQJ,EAAO,KAAMI,GAClBA,EAAM,KAAK,CAAC,IAAMw0B,CAC1B,EAEGx0B,GAAS,OACXyL,IAAQ,IAAI+oB,CAAS,IAAIx0B,EAAM,MAAM,IAGnCnF,EAAI,OAAO25B,CAAS,GAAK,MAAQ35B,EAAI,OAAO25B,CAAS,GAAK,OAC5D/oB,IAAQ,IAAI+oB,CAAS,IAAI35B,EAAI,OAAO25B,CAAS,CAAC,GAElD,CACA,OAAO/oB,GAAK,UAAU,CACxB,EAAG,CAAC2oB,EAAgBx0B,EAAQ/E,EAAI,MAAOA,EAAI,MAAM,CAAC,EAE5Cq5B,GAAiBnC,GAAeF,EAEtC,OAAIwC,KAEA,oBACE,oBAAC,MACC,mBAAC,OAAK,SAAA5oB,EAAA,CAAK,EACb,KACA,OAAC,OAAG,GACN,KAKF,oBACE,oBAAC,MAAG,UAAW3Z,GAAO,eACpB,mBAAC,OAAI,UAAWwiC,EAAgB,SAAA7oB,EAAA,CAAK,EACvC,KACA,OAAC,MAAG,UAAW,qBAAqB3Z,GAAO,cAAc,GACtD,SAAAoiC,OACC,OAACvC,GAAA,CACC,QAASlmB,GACT,IAAA5Q,EACA,OAAA/I,GACA,OAAA+/B,EACA,YAAAE,EACA,YAAagC,EACb,WAAYC,EACX,GAAGr2B,CAAA,CACN,EAEJ,GACF,CAEJ,CAAC,EAEK42B,EAAwB,CAC5B,UAAQ,OAAI,CACV,WAAY,QACd,CAAC,CACH,EAEAJ,EAA6B,YAAc,+B,eC5CpC,MAAMM,EAAS,CAAC,CACrB,QAAA71B,EACA,mBAAA3D,EACA,sBAAAC,EACA,iBAAA6D,EACA,iBAAAC,EACA,iBAAAoU,GACA,IAAAvY,EACA,eAAAgE,EACA,kBAAAizB,EACA,WAAA1D,EACA,SAAAzZ,EACA,gBAAA3Y,EACA,eAAAC,EACA,mBAAAoyB,EACA,cAAApvB,GACA,YAAA0X,GACA,IAAAlb,GACA,OAAA3J,EACA,mBAAAsb,EACA,OAAAykB,EACA,sBAAAkC,EACA,qBAAAC,GACA,SAAApzB,GACA,iBAAA8zB,GACA,eAAA9F,GACA,oBAAA+F,GACA,cAAAC,GACA,GAAGp2B,EACL,IAAa,CACX,KAAM,CAACq2B,GAAgBC,EAAiB,KAAI,YAAS,EAAK,EACpD,CAAC7f,GAAaC,EAAc,KAAI,YAAS,EAAK,EAC9C,CAAC6c,GAAagD,EAAc,KAAI,YAAS,EAAK,EAC9C,CAACC,GAAaC,EAAc,KAAI,YAAS,EAAK,EAC9CC,MAAa,UAAmC,IAAI,EACpDz6B,MAAQ,MAAU,EAElB06B,MAAY,WAChB,OACE,OAAet6B,EAAI,YAAa,CAC9B,SAAA+F,GACA,cAAe,EACjB,CAAC,EACH,CAAC/F,EAAI,YAAa+F,EAAQ,CAC5B,EACM1B,MAAc,WAAQ,OAAM,KAAkBzE,GAAOI,EAAI,QAAQ,EAAG,CAACA,EAAI,SAAUJ,EAAK,CAAC,EACzF26B,MAAe,WACnB,IAAOv6B,EAAI,qBAAuB8b,GAAc,CAAE,GAAG9b,EAAK,SAAO,MAAsBA,EAAI,KAAK,CAAE,EAAIA,EACtG,CAAC8b,GAAa9b,CAAG,CACnB,EACMw6B,KAAe,MAAex6B,CAAG,EACjC8D,EAAW02B,IAAiB,OAC5BC,MAAgB,MAAiBz6B,CAAG,EACpC06B,GAAYD,KAAkB,UAEpC,aAAU,IAAM,CACd,GAAIZ,KAAqB75B,EAAI,IAAK,CAChCo6B,GAAe,EAAK,EACpB,MACF,CACA,GAAI,CAACD,GAAa,CAChBC,GAAe,EAAI,EACnB,MACF,CAEIC,GAAW,SAAWtG,KAExBA,GAAesG,GAAW,OAAO,KACjC,MAAkB,wCAAyC,CACzD,eAAgBr6B,EAAI,gBAAkB,UACtC,UAAWA,EAAI,GACjB,CAAC,EACDo6B,GAAe,EAAI,EAEvB,EAAG,CAACD,GAAaN,GAAkB75B,EAAI,eAAgBA,EAAI,IAAK+zB,EAAc,CAAC,EAI/E,MAAM4G,MAAwB,kBAC5B,YAAS,IAAM,CACbV,GAAkB,EAAK,CACzB,EAAG,GAAI,EACP,CAAC,CACH,EAEMxgB,MAAgB,eACnBzZ,IAAqB,CACpBi6B,GAAkB,EAAI,EACtBt2B,GAAM,cAAc3D,GAAK26B,EAAqB,CAChD,EACA,CAACA,GAAuBh3B,EAAK,CAC/B,EAEMi3B,MAAa,eAChBt4B,IAAuC,CAClCw3B,KAAsBx3B,GAAGtC,CAAG,GAK3BuY,IAIL8B,GAAgBD,IAAyB,CAACA,EAAW,CACvD,EACA,CAAC7B,GAAkBuhB,GAAqB95B,CAAG,CAC7C,EAEM66B,MAAe,eAAY,IAAM,CACrCX,GAAe,EAAI,EACfH,IACFA,GAAc/5B,CAAG,CAErB,EAAG,CAAC+5B,GAAe/5B,CAAG,CAAC,EAEjB86B,MAAc,eACjBx4B,IAAkB,CAEZw3B,IAID,SAAS,aAAa,GAAG,SAAS,GAAKx3B,GAAE,QAAU,GACrD43B,GAAe,EAAK,CAExB,EACA,CAACJ,EAAmB,CACtB,EAEMiB,MAAe,eAAY,IAAM,CACrCb,GAAe,EAAK,CACtB,EAAG,CAAC,CAAC,EAEL,SACE,oBACE,qBAAC,MACC,IAAKG,GACL,UAAW,GAAGpjC,EAAO,OAAO,IAAI6M,EAAW7M,EAAO,YAAc,EAAE,IAAI+iC,IAAkBG,IAAenD,EAAS//B,EAAO,oBAAsB,EAAE,GAC/I,QAAS2jC,GACT,aAAAC,GACA,aAAAE,GACA,YAAAD,GAMA,QAASD,GAER,UAAA72B,MACC,OAAC,MAAG,UAAW/M,EAAO,kBACnB,SAAAsjC,GAAa,YAAcA,GAAa,WAAa,EAAI,GAAGA,GAAa,WAAa,CAAC,IAAM,KAChG,KAEF,QAAC,MACC,UACEz2B,GAAY42B,GAAYzjC,EAAO,iBAAmB,GAAGoN,GAAY,iBAAiB,IAAIpN,EAAO,YAAY,GAG1G,UAAA6M,MACC,OAACnB,EAAA,GACC,WAAS,KAAE,qCAAsC,0BAA2B,CAAE,aAAA63B,CAAa,CAAC,EAC5F,UAAU,QACV,MAAM,QAEN,mBAACQ,EAAA,EAAI,CAAC,UAAW/jC,EAAO,aAAc,KAAK,uBAAuB,KAAK,IAAK,GAC9E,EAEDyjC,OACC,OAAC/3B,EAAA,EAAO,CAAC,QAAS83B,GAAe,UAAU,QAAQ,MAAM,OACvD,mBAACO,EAAA,EAAI,CAAC,UAAW/jC,EAAO,YAAa,KAAK,cAAc,KAAK,IAAK,GACpE,GAEJ,KACA,OAAC,MACC,MAAOshB,GAAoB6B,GAAc,mBAAqB,kBAAqB,GACnF,UAAW7B,GAAmBthB,EAAO,qBAAuB,GAE3D,SAAAshB,OACC,OAAC,UACC,gBAAY,KAAE,mCAAoC,iBAAiB,EACnE,UAAWthB,EAAO,cAClB,gBAAemjB,GAEf,mBAAC4gB,EAAA,EAAI,CAAC,UAAW/jC,EAAO,iBAAkB,KAAMmjB,GAAc,aAAe,cAAe,EAC9F,EAEJ,EACCN,MAAY,OAAC,MAAG,UAAW7iB,EAAO,iBAAmB,SAAAqjC,EAAA,CAAU,EAC/D/G,GAAcgH,GAAa,iBAC1B,OAAC,MAAG,UAAWtjC,EAAO,cACpB,mBAACgkC,EAAA,EAAS,CAAC,OAAQV,GAAa,aAAc,WAAY,GAAO,EACnE,EAEDp5B,GAAmBA,EAAgB,OAAS,KAC3C,OAACm4B,EAAA,CACC,IAAKiB,GACL,kBAAAtD,EACA,eAAgB91B,EAChB,cAAAiD,GACA,eAAAhD,EACA,cAAAqY,GACA,iBAAkB9V,GAAM,iBACxB,OAAA1M,EACA,UAAW0M,GAAM,UACjB,YAAaA,GAAM,YACnB,OAAAqzB,EACA,YAAAE,GACA,OAAQ6D,GACR,sBAAA7B,EACA,qBAAAC,EAAA,CACF,KAEA,OAACF,EAAA,CACC,IAAKsB,GACL,kBAAAtD,EACA,mBAAA1kB,EACA,eAAAnR,EACA,mBAAAoyB,EACA,cAAA/Z,GACA,iBAAkB9V,GAAM,iBACxB,IAAA/C,GACA,OAAA3J,EACA,UAAW0M,GAAM,UACjB,YAAaA,GAAM,YACnB,0BAA2BA,GAAM,0BACjC,OAAAqzB,EACA,YAAAE,GACA,OAAQ6D,GACR,SAAU3gB,GACV,YAAA0B,GACA,sBAAAod,EACA,qBAAAC,EAAA,CACF,GAEJ,EACC/e,OACC,OAAC9U,EAAA,GACC,UAAW3B,GAAM,UACjB,UAAW,GAAG1M,EAAO,OAAO,IAAI6M,EAAW7M,EAAO,YAAc,EAAE,IAAIkjC,IAAe,CAAC/f,GAAcnjB,EAAO,oBAAsB,EAAE,GACnI,eAAA+M,EACA,cAAAI,GACA,mBAAAhE,EACA,sBAAAC,EACA,iBAAA6D,EACA,iBAAAC,EACA,QAAAJ,EACA,IAAKw2B,GACL,eAAAn5B,EACA,SAAA0C,EACA,gBAAA3C,EACA,IAAAP,GACA,OAAA3J,EACA,oBAAqB0M,GAAM,oBAC3B,0BAA2BA,GAAM,0BACjC,UAAWA,GAAM,UACnB,GAEJ,CAEJ,ECvUMu3B,EAAU,IAAM,CAAC,EACVC,EAAgB,CAAC,CAAE,IAAAn7B,EAAK,eAAAgE,EAAgB,WAAAuvB,EAAY,SAAAzZ,EAAU,gBAAA3Y,EAAiB,GAAG2B,EAAK,OAEhG,QAAC,MACE,UAAAkB,MAAkB,OAAC,OAAG,KACvB,OAAC,OAAG,KACJ,OAAC,OAAG,EACH8V,MAAY,OAAC,MAAI,SAAA9Z,EAAI,YAAY,EACjCuzB,GAAcvzB,EAAI,iBAAgB,OAAC,OAAG,EACtCmB,GAAmBA,EAAgB,OAAS,KAC3C,OAACm4B,EAAA,CACE,GAAGx2B,GACJ,IAAA9C,EACA,eAAgBmB,EAChB,YAAa,GACb,OAAQ+5B,EACR,cAAeA,EACf,QAAO,GACT,KAEA,OAAC,MAAG,UAAWp4B,GAAK,OAAO,eAAiB,SAAA9C,EAAI,MAAM,KAExD,OAAC,MAAG,UAAW,qBAAqB8C,GAAK,OAAO,cAAc,GAAI,GACpE,EC0DS6T,KAAU,QACrB,CAAC,CACC,iBAAAkc,EACA,QAAAuI,EAAU,CAAC,EACX,cAAAziB,EACA,cAAAtG,EACA,aAAAgpB,EACA,WAAApjB,GACA,cAAAwB,EACA,uBAAAJ,EACA,oBAAAD,EACA,cAAAvT,EACA,cAAAy1B,EAAgB,GAChB,iBAAA/iB,EACA,iBAAAshB,EACA,GAAGl2B,CACL,IAAa,CACX,KAAM,CAAC43B,GAAaC,EAAc,KAAI,YAKpCF,GAAiB,CAACzB,EACd,KAAK,IAAI,EAAI,KAAK,KAAK,OAAO,YAAc,EAAE,EAAG,KAAK,KAAKuB,EAAQ,OAAS,CAAC,CAAC,EAC9E,GACN,EACM,CAACK,GAAcC,CAAe,KAAI,YAA2B,CACjE,UAAW,GACX,YAAa,KACb,uBAAwB,CAAE,EAAG,EAAG,EAAG,CAAE,CACvC,CAAC,EACK,CAACC,EAA2BC,CAA4B,KAAI,YAAS,EAAK,EAC1EC,KAAa,UAAuB,IAAI,EACxCj8B,MAAQ,MAAU,EAClB3I,MAASwK,EAAA,GAAgB7B,EAAK,EAC9Bk8B,GAAcjJ,GAAsCuI,EACpDW,MAAa,WACjB,IAAMD,GAAY,OAAO,CAACr7B,GAAKT,KAASA,GAAI,WAAaS,GAAMT,GAAI,WAAaS,GAAM,CAAC,EACvF,CAACq7B,EAAW,CACd,EACM93B,GAAiB2U,IAAkB,KAAkB,MAAQojB,GAAa,EAC1EC,MAAc,WAClB,IAAO3pB,KAAgB,MAAYypB,GAAazpB,CAAa,EAAIypB,GACjE,CAACA,GAAazpB,CAAa,CAC7B,EAEMtO,MAAU,WAAQ,IAAM,IAAMi4B,GAAa,CAACA,EAAW,CAAC,EACxDC,MAAuB,UAAoC,IAAI,EAC/DC,GAAW,IAAIvF,KAErB,aAAU,IACD,IAAM,CACPsF,GAAqB,UACvB,SAAS,oBAAoB,QAASA,GAAqB,OAAO,EAClE,SAAS,oBAAoB,cAAeA,GAAqB,OAAO,EAE5E,EACC,CAAC,CAAC,KAEL,aAAU,IAAM,CACd,GAAI,CAACp2B,EACH,OAGF,SAASs2B,IAAY,CACnBX,GAAe,GAAQ,EACvB31B,GAAe,oBAAoB,SAAUs2B,EAAS,EACtDt2B,GAAe,oBAAoB,QAASs2B,EAAS,CACvD,CAEAt2B,EAAc,iBAAiB,SAAUs2B,EAAS,EAClDt2B,EAAc,iBAAiB,QAASs2B,EAAS,CACnD,EAAG,CAACf,EAAQ,OAAQv1B,CAAa,CAAC,EAKlC,MAAMu2B,MAAc,eAClB,CAACp8B,GAAkBwS,KAA8B,CAC3CiH,GACFA,EAAczZ,GAAKwS,EAAO,CAE9B,EACA,CAACiH,CAAa,CAChB,EAEM4iB,MAAuB,eAAY,IACnC,CAAC9kC,EAAA,EAAO,eAAe,uBAAsB,MAAsB,EAC9D,GAEF,GAAQ8hB,GAA0BD,GACxC,CAACC,EAAwBD,CAAmB,CAAC,EAE1CkjB,MAAmB,eAAY,IAAM,CACrCL,GAAqB,UACvB,SAAS,oBAAoB,QAASA,GAAqB,OAAO,EAClE,SAAS,oBAAoB,cAAeA,GAAqB,OAAO,EACxEA,GAAqB,QAAU,MAEjCP,EAAgB,CACd,UAAW,GACX,uBAAwB,CAAE,EAAG,EAAG,EAAG,CAAE,EACrC,YAAa,IACf,CAAC,CACH,EAAG,CAAC,CAAC,EAECa,MAAoB,eACvBj6B,IAAa,CACZ,MAAI,MAAgBA,GAAE,MAAM,GAAK,CAACu5B,EAAW,SAAS,SAASv5B,GAAE,MAAM,EAAG,CAExEg6B,GAAiB,EACjB,MACF,CACI,SAAS,aAAa,GAAG,SAAS,GAGtCA,GAAiB,CACnB,EACA,CAACA,EAAgB,CACnB,EAEME,MAAkB,eACtB,CAACl6B,GAA4BtC,KAA8B,CACzD,MAAMy8B,GAAY,SAAS,aAAa,GAAG,SAAS,EACpD,GAAI,CAACA,GACH,MAAO,GAKT,GAHIn6B,GAAE,WACJ,MAAkB,EAEhB+5B,GAAqB,IAAM,GAE7B,MAAO,EAAAI,GAGT,GAAI,CAACZ,EAAW,QACd,MAAO,GAGT,MAAMa,EAAa,IACbC,EAAc,IACdlK,GAAInwB,GAAE,QAAUo6B,EAAa,OAAO,WAAa,OAAO,WAAaA,EAAap6B,GAAE,QACpFs6B,GAAIt6B,GAAE,QAAUq6B,EAAc,OAAO,YAAc,OAAO,YAAcA,EAAcr6B,GAAE,QAE9F,OAAAo5B,EAAgB,CACd,UAAAe,GACA,uBAAwB,CAAE,EAAAhK,GAAG,EAAAmK,EAAE,EAC/B,YAAa58B,EACf,CAAC,EACDi8B,GAAqB,QAAUM,GAC/B,SAAS,iBAAiB,QAASA,EAAiB,EACpD,SAAS,iBAAiB,cAAeA,EAAiB,EACnD,EACT,EACA,CAACA,GAAmBF,EAAoB,CAC1C,EAEMQ,MAAuB,eAAY,IAAM,CAC7CjB,EAA6B,EAAI,CACnC,EAAG,CAAC,CAAC,EAECkB,MAAkB,eAAY,IAAM,CACxClB,EAA6B,EAAK,CACpC,EAAG,CAAC,CAAC,EAECmB,MAAmB,eAAY,IAAM,IACzC,MAAmB,EACnBnB,EAA6B,EAAK,CACpC,EAAG,CAAC,CAAC,EAEL,SACE,QAAC,OAAI,UAAW3kC,GAAO,QAAS,IAAK4kC,EAClC,UAAAJ,GAAa,WAAaA,GAAa,gBACtC,OAACuB,GAAA,GACC,MAAOV,GACP,IAAKb,GAAa,YAClB,UAAWA,GAAa,UACvB,GAAGA,GAAa,uBACjB,oBAAAriB,EACA,uBAAAC,EACA,UAAWwjB,EAAA,CACb,EAEDlB,MACC,OAACsB,EAAA,GACC,OAAM,GACN,SAAO,KAAE,sCAAuC,cAAc,EAC9D,QACE,oBACE,oBAAC,KAAK,CAAC,QAAQ,wCAAwC,gIAGvD,KACA,QAAC,OAAI,UAAWhmC,GAAO,SACrB,oBAAC+jC,EAAA,EAAI,CAAC,KAAK,UAAW,MACtB,OAAC,KAAK,CAAC,QAAQ,iDAAiD,sCAA0B,GAC5F,GACF,EAEF,eAAa,KAAE,wCAAyC,SAAS,EACjE,KAAK,uBACL,UAAW+B,GACX,UAAWD,EAAA,CACb,KAEF,OAAC,SAAM,aAAW,MAAG7lC,GAAO,cAAe0M,EAAM,mBAAqB,GAAK1M,GAAO,oBAAoB,EACpG,mBAAC,SACE,SAAA+kC,GAAY,IAAI,CAACh8B,GAAK1B,KACrBA,GAAQi9B,MACN,OAAC3B,EAAA,CAEC,QAAA71B,GACA,IAAA/D,GACA,eAAAgE,GACA,cAAAqO,EACA,cAAe+pB,GACf,OAAAnlC,GACA,iBAAkB0M,EAAM,iBACxB,eAAgBA,EAAM,eACtB,iBAAAk2B,EACA,UAAWl2B,EAAM,UACjB,YAAaA,EAAM,YACnB,0BAA2BA,EAAM,0BACjC,OAAQsU,IAAY,KAAMC,IAAUA,KAAUlY,GAAI,OAASkY,KAAUlY,GAAI,GAAG,EAC5E,oBAAqB2D,EAAM,oBAC3B,oBAAqB64B,GACrB,iBAAAjkB,EACC,GAAG5U,CAAA,EAjBCu4B,GAAS,OAAOl8B,GAAI,GAAG,CAkB9B,KAEA,OAACm7B,EAAA,CAEC,iBAAkB,GAClB,QAAAp3B,GACA,cAAeq4B,GACf,OAAAnlC,GACA,eAAA+M,GACC,GAAGL,EACJ,IAAA3D,EAAA,EAPK,WAAWk8B,GAAS,OAAOl8B,GAAI,GAAG,CAAC,EAQ1C,CAEJ,EACF,EACF,GACF,CAEJ,CACF,EACA2W,EAAQ,YAAc,S,qVC/Tf,MAAMumB,EAAgC,IAAM,CACjD,KAAM,CAAE,gBAAA/7B,EAAiB,mBAAAuT,CAAmB,KAAI,MAAkB,EAE5DyoB,MAA4B,eAChC,CAACC,GAAkBC,GAAmBC,KAA4B,CAChE,MAAMC,GAAqB,CAAC,GAAGp8B,CAAe,EACxCyG,GAAUzG,EAAgBi8B,EAAQ,EAExCG,GAAmB,OAAOH,GAAU,CAAC,EACrCG,GAAmB,OAAOF,GAAW,EAAGz1B,EAAO,EAE/C8M,IAAqB6oB,EAAkB,KAEvC,KAAsB,yCAA0C,CAC9D,SAAUA,GAAmB,OAC7B,KAAAD,EACF,CAAC,CACH,EACA,CAACn8B,EAAiBuT,CAAkB,CACtC,EAEM8oB,MAAY,eACfzhC,IAAuB,CAClBA,GAAO,aAAe,MAG1BohC,GAA0BphC,GAAO,OAAO,MAAOA,GAAO,YAAY,MAAO,MAAM,CACjF,EACA,CAACohC,EAAyB,CAC5B,EAEA,SACE,OAAC,OACC,mBAAC,KAAe,CAAC,UAAAK,GACf,mBAAC,KAAS,CAAC,YAAY,mBAAmB,UAAU,WACjD,SAACC,OAEE,QAAC,OAAI,IAAKA,GAAS,SAAW,GAAGA,GAAS,eACvC,UAAAt8B,EAAgB,IAAI,CAACgE,GAAO7G,QAC3B,OAACo/B,GAAA,CAEC,MAAAv4B,GACA,MAAA7G,GACA,UAAW6+B,EAAA,EAHNh4B,EAIP,CACD,EACAs4B,GAAS,aACZ,CAEJ,CACF,EACF,EACF,CAEJ,EAQMC,GAA0B,CAAC,CAAE,MAAAv4B,EAAO,MAAA7G,EAAO,UAAAq/B,EAAU,OAEvD,OAAC,KAAS,CAAC,YAAax4B,EAAO,MAAA7G,EAC5B,SAACm/B,OACA,OAACG,GAAA,CAA2B,MAAAz4B,EAAc,MAAA7G,EAAc,UAAAq/B,GAAsB,SAAAF,EAAA,EAAzDt4B,CAA6E,EAEtG,EAIEy4B,GAAiB,CAAC,CACtB,MAAAz4B,EACA,MAAA7G,EACA,UAAAq/B,GACA,SAAAF,EACF,IAAsE,CACpE,KAAM,CAAE,YAAAhjB,GAAa,gBAAAtZ,GAAiB,iBAAAgD,EAAiB,KAAI,MAAkB,EACvElN,MAAS,MAAW0I,GAAW8a,EAAW,EAC1CojB,GAAYv/B,IAAU6C,GAAgB,OAAS,EAAI,EAAI7C,EAAQ,EAC/Dw/B,GAAYx/B,IAAU,EAAI6C,GAAgB,OAAS,EAAI7C,EAAQ,EACrE,SACE,OAAC,OAAI,IAAKm/B,GAAS,SAAW,GAAGA,GAAS,eAAiB,GAAGA,GAAS,gBACrE,mBAACM,EAAA,EAAI,CAAC,SAAQ,GAAC,UAAW9mC,GAAO,UAC/B,oBAAC,OAAI,UAAWA,GAAO,aACrB,oBAAC,OAAI,UAAWA,GAAO,MAAQ,mBAAuBkO,CAAK,EAAE,EAC5DhE,GAAgB,OAAS,MACxB,oBACE,oBAACc,EAAA,GACC,KAAK,aACL,QAAS,IAAM07B,GAAUr/B,EAAOu/B,GAAW,QAAQ,EACnD,WAAS,KAAE,kDAAmD,WAAW,EAC3E,KACA,OAAC57B,EAAA,GACC,KAAK,WACL,QAAS,IAAM07B,GAAUr/B,EAAOw/B,GAAW,QAAQ,EACnD,WAAS,KAAE,gDAAiD,SAAS,EACvE,GACF,EAED35B,OACC,OAAClC,EAAA,GACC,KAAK,QACL,QAAS,IAAMkC,GAAiBgB,CAAK,EACrC,WAAS,KAAE,+CAAgD,cAAc,EAC3E,GAEJ,EACF,EACF,CAEJ,EAEMxF,GAAY,CAACC,EAAsB6a,KAAqC,CAC5E,aAAW,OAAI,CACb,QAAS,QACT,QAAS7a,EAAM,QAAQ,CAAC,EACxB,aAAcA,EAAM,QAAQ,CAAC,EAC7B,MAAO6a,IAAgB,SAAW,OAAS,OAC3C,SAAU,SACV,aAAc,WACd,UAAW,YACb,CAAC,EACD,gBAAc,OAAI,CAChB,OAAQ,OACR,QAAS,OACT,IAAK7a,EAAM,QAAQ,EAAG,EACtB,eAAgB,cAClB,CAAC,EACD,SAAO,OAAI,CACT,KAAM,CACR,CAAC,CACH,G,yFCvHO,MAAMo+B,KAAuB,QAAK,CAAC,CAAE,eAAA38B,EAAgB,OAAA0D,EAAQ,IAAA/N,GAAK,KAAA+hB,GAAM,OAAAwb,EAAO,IAAiC,CACrH,MAAMt9B,MAAS,MAAWgnC,CAAe,EACnCC,MAAU,eAAY,IAAMnlB,GAAM,CAACA,EAAI,CAAC,EACxColB,MAAiB,WAAQ,IAAO5J,GAAS6J,EAAar5B,EAAQwvB,EAAM,EAAIxvB,EAAS,CAACA,EAAQwvB,EAAM,CAAC,EAEvG,GAAKxvB,EAAO,QAEL,GAAIo5B,GAAe,SAAW,EACnC,SAAO,KAAE,0CAA2C,wBAAwB,MAF5E,QAAO,KAKT,SACE,OAAC,OAAI,UAAW98B,EAAiBpK,GAAO,qBAAuBA,GAAO,YACnE,SAAAknC,GAAe,IAAI,CAACh5B,GAAOlL,QAC1B,OAACokC,EAAA,CAEC,eAAAh9B,EACA,QAAA68B,GACA,WAAY/4B,GAAM,WAClB,KAAMA,GAAM,KACZ,MAAOA,GAAM,MACb,IAAAnO,GACA,OAAQmO,GAAM,QAPT,GAAGA,GAAM,KAAK,CAAC,CAAC,IAAIA,GAAM,OAAO,CAAC,CAAC,IAAIlL,EAAC,EAQ/C,CACD,EACH,CAEJ,CAAC,EACD+jC,EAAqB,YAAc,uBAmB5B,MAAMM,EAA4B,CAAC,CAAE,OAAAv5B,EAAQ,IAAA/N,EAAK,KAAA+hB,GAAM,OAAAwb,EAAO,IAAsC,CAC1G,MAAMt9B,MAAS,MAAWgnC,CAAe,EACnCC,MAAU,eAAY,IAAMnlB,GAAM,CAACA,EAAI,CAAC,EACxColB,MAAiB,WAAQ,IAAO5J,GAASgK,EAAax5B,EAAQwvB,EAAM,EAAIxvB,EAAS,CAACA,EAAQwvB,EAAM,CAAC,EAEvG,GAAKxvB,EAAO,QAEL,GAAIo5B,GAAe,SAAW,EACnC,SAAO,KAAE,0CAA2C,wBAAwB,MAF5E,QAAO,KAKT,SACE,OAAC,OAAI,UAAWlnC,GAAO,YACpB,SAAAknC,GAAe,IAAI,CAACh5B,GAAOlL,QAC1B,OAACokC,EAAA,CAEC,QAAAH,GACA,QAAO,GACP,KAAM,CAAC/4B,GAAM,GAAG,EAChB,MAAOA,GAAM,MACb,IAAAnO,EACA,OAAQ,CAACmO,GAAM,KAAK,GANf,GAAGA,GAAM,GAAG,IAAIA,GAAM,KAAK,IAAIlL,EAAC,EAOvC,CACD,EACH,CAEJ,EAEMgkC,EAAmBr+B,IAA0B,CACjD,eAAa,OAAI,CACf,QAAS,OACT,IAAKA,EAAM,QAAQ,CAAC,EACpB,oBAAqB,GAAGA,EAAM,QAAQ,IAAI,CAAC,uBAC7C,CAAC,EACD,wBAAsB,OAAI,CACxB,QAAS,OACT,IAAKA,EAAM,QAAQ,CAAC,EACpB,oBAAqB,UACvB,CAAC,CACH,GAaay+B,EAAsB,CAAC,CAClC,eAAAh9B,EAAiB,GACjB,WAAAgE,EACA,QAAA64B,GACA,QAAAv9B,GACA,MAAAO,GACA,IAAAlK,GACA,KAAAsI,GACA,OAAA8F,EACF,IAAgC,CAC9B,KAAM,CAACvE,GAAiB29B,EAAiB,KAAI,YAAS,EAAK,EACrD,CAACh+B,GAAYi+B,EAAa,KAAI,YAAS,CAAC,EACxC,CAACl+B,GAAYm+B,EAAa,KAAI,YAAsC,IAAI,EACxE,CACJ,IAAA99B,GACA,aAAA+b,GACA,gBAAAxb,GACA,oBAAA2X,GACA,eAAAK,GACA,mBAAA/Y,GACA,sBAAAC,GACA,iBAAA6D,GACA,iBAAAC,GACA,UAAA7C,GACA,0BAAAC,GACA,aAAAsZ,EACF,KAAI,MAAkB,EAEhB5jB,MAAS,MAAW0nC,CAAc,EAElCr+B,MAAW,eAAY,IACvBK,MACK,MAAwBu9B,GAAQ,EAAG5+B,GAAK,CAAC,CAAC,EAE/C+F,IAAe,UACV,MAAerO,GAAI,UAAU,OAAOqO,CAAU,EAAE,MAAM,EAExD,CAAC,EACP,CAACA,EAAY64B,GAASv9B,GAASrB,GAAMtI,GAAI,UAAU,MAAM,CAAC,EAEvD4nC,MAAc,eAAY,IAAM,CACpC,MAAMC,GAAWv+B,GAAS,EACpBw+B,GAAWD,GAAS,OAAO,CAACp+B,GAAKC,KAASD,GAAMC,GAAK,MAAO,CAAC,GAC/D,IAAC,WAAQH,GAAYs+B,EAAQ,GAAKr+B,KAAes+B,MACnDJ,GAAcG,EAAQ,EACtBJ,GAAcK,EAAQ,EAE1B,EAAG,CAACt+B,GAAYD,GAAYD,EAAQ,CAAC,KAErC,aAAU,IAAM,CACVO,IACF+9B,GAAY,CAEhB,EAAG,CAAC/9B,GAAiB+9B,EAAW,CAAC,EAEjC,MAAMG,MAA2B,eAC/B,CAACC,GAAyBC,KAAyC,CAC7D9lB,OAGJ,MAAkB6lB,GAAiBC,EAAU,CAC/C,EACA,CAAC9lB,EAAc,CACjB,EAEMxE,MAAY,eAAY,IAAM,CAC9BzQ,IACFA,GAAiB5E,GAAK,CAAC,CAAC,EAG1By/B,GAAyB,2CAA4C,CACnE,eAAgB/nC,GAAI,cACtB,CAAC,CACH,EAAG,CAACkN,GAAkB66B,GAA0B/nC,GAAI,eAAgBsI,EAAI,CAAC,EAEnEsV,MAAY,eAAY,IAAM,CAC9BzQ,IACFA,GAAiB7E,GAAK,CAAC,CAAC,EAG1By/B,GAAyB,2CAA4C,CACnE,eAAgB/nC,GAAI,cACtB,CAAC,CACH,EAAG,CAACmN,GAAkB46B,GAA0B/nC,GAAI,eAAgBsI,EAAI,CAAC,EAEnE4/B,MAAc,eAAY,IAAM,CAChC9+B,IACFA,GAAmBd,GAAK,CAAC,EAAG8F,GAAO,CAAC,KAAG,MAA2BpO,EAAG,GAAK,MAAS,EAGrF+nC,GAAyB,uCAAwC,CAC/D,eAAgB/nC,GAAI,eACpB,WAAY,UACZ,UAAWA,GAAI,GACjB,CAAC,CACH,EAAG,CAACoJ,GAAoB2+B,GAA0B/nC,GAAKsI,GAAM8F,EAAM,CAAC,EAE9D+5B,MAAiB,eAAY,IAAM,CACnC9+B,IACFA,GAAsBf,GAAK,CAAC,EAAG8F,GAAO,CAAC,KAAG,MAA2BpO,EAAG,GAAK,MAAS,EAGxF+nC,GAAyB,uCAAwC,CAC/D,eAAgB/nC,GAAI,eACpB,WAAY,UACZ,UAAWA,GAAI,GACjB,CAAC,CACH,EAAG,CAACqJ,GAAuB0+B,GAA0B/nC,GAAKsI,GAAM8F,EAAM,CAAC,EAEjEg6B,MAAoB,eAAY,SAChCtmB,GACK,MAAMA,GAAoBxZ,GAAK,CAAC,EAAG8F,GAAO,CAAC,EAAGpO,GAAI,WAAW,KAAK,EAEpE,GACN,CAAC8hB,GAAqBxZ,GAAM8F,GAAQpO,GAAI,WAAW,KAAK,CAAC,EAEtDqoC,MAAY,eAAY,IAAM,CAClCb,GAAmBc,IAA4B,CAACA,EAAc,EAE9DP,GAAyB,sCAAuC,CAC9D,eAAgB/nC,GAAI,eACpB,UAAW2J,GAAU,QAAU,QAC/B,KAAME,GAAkB,QAAU,OAClC,UAAW7J,GAAI,IACf,IAAA4J,EACF,CAAC,CACH,EAAG,CAACA,GAAKD,GAAS3J,GAAI,eAAgBA,GAAI,IAAK+nC,GAA0Bl+B,EAAe,CAAC,EAEnFgB,MAAe,WACnB,IAAOjB,KAAQ,KAAQ,SAAW5J,GAAI,WAAW,MAAQ,aAAaA,GAAI,WAAW,KAAK,GAAK,GAC/F,CAAC4J,GAAK5J,GAAI,WAAW,KAAK,CAC5B,EACM0K,GAAYpC,GAAK,SAAW,EAC5BigC,GAAcn6B,GAAO,SAAW,EAEhCo6B,GAAuBlgC,GAAK,CAAC,IAAM,KAEzC,SACE,oBACE,qBAAC,OAAI,UAAWrI,GAAO,IACpB,WAACoK,MACA,QAAC,OAAI,UAAWpK,GAAO,QACpB,UAAAmJ,IAAsBo/B,OACrB,OAACt9B,GAAA,CACC,KAAK,cACL,QAASg9B,GAET,SAAUE,GACV,cAAev9B,EAAA,CACjB,EAEDxB,IAAyBm/B,OACxB,OAACv9B,EAAA,GACC,KAAK,eACL,QACErB,KAAQ,KAAQ,SAAW5J,GAAI,WAAW,SACtC,KAAE,gDAAiD,sCAAuC,CACxF,MAAOA,GAAI,WAAW,KACxB,CAAC,KACD,KAAE,0CAA2C,kBAAkB,EAErE,QAASmoC,EAAA,CACX,EAEDz9B,IAAaP,GAAgB,SAAS7B,GAAK,CAAC,CAAC,MAC5C,OAAC2C,EAAA,GACC,QAAQ,UACR,WAAS,KAAE,mEAAoE,iBAAiB,EAChG,KAAK,MACL,QAAS2S,EAAA,CACX,EAEDlT,IAAa,CAACP,GAAgB,SAAS7B,GAAK,CAAC,CAAC,MAC7C,OAAC2C,EAAA,GACC,WAAS,KACP,yEACA,wCACF,EACA,KAAK,MACL,QAAS0S,EAAA,CACX,KAEF,OAAC1S,EAAA,GACC,QAASpB,GAAkB,UAAY,YACvC,KAAK,SACL,WAAS,KAAE,gDAAiD,mBAAmB,EAC/E,UAAU,eACV,SAAU,CAACa,GACX,QAAS29B,EAAA,CACX,GACF,KAEF,OAAC,OAAI,UAAWpoC,GAAO,MACpB,SAAAyK,MAAY,OAAuBpC,GAAK,CAAC,CAAC,KAAI,OAACmgC,EAAA,CAAc,OAAQngC,EAAA,CAAM,EAC9E,KACA,OAAC,OAAI,UAAWrI,GAAO,MACrB,mBAAC,OAAI,UAAWA,GAAO,eACpB,SAAAsoC,MACC,OAACG,EAAA,CAAY,MAAOt6B,GAAO,CAAC,EAAG,aAAAyV,EAAA,CAA4B,KAE3D,OAAC4kB,EAAA,CAAc,SAAU,GAAM,OAAAr6B,EAAA,CAAgB,EAEnD,EACF,GACF,EACClE,IAAO,IAAI,CAACkB,GAAMnI,KAAM,CACvB,GAAImI,GAAK,SAAWd,GAAW,CAC7B,MAAMe,GAAkBD,GAAK,QAC7BA,GAAK,QAAU,CAACE,GAAGC,KAAW,CAE5BjB,GAAUtK,EAAG,EAGbqL,GAAgBC,GAAGC,EAAM,EAEzBoa,GAAa,CACf,CACF,CACA,SACE,OAAC,OAAI,UAAW1lB,GAAO,IACrB,mBAAC,OAAI,UAAWoK,EAAiBpK,GAAO,cAAgBA,GAAO,KAC7D,mBAACuL,EAAA,GACC,YAAa,CAEX,QACE,OAAOjB,IAA8B,UAAYa,GAAK,QAClDb,GACA,OACN,QAAS,YACT,KAAM,UACN,GAAIa,GAAK,MAAQ,CAAE,KAAMA,GAAK,IAAK,CACrC,EACA,KAAAA,EAAA,CACF,EACF,GAf+B,GAAGA,GAAK,KAAK,IAAInI,EAAC,EAgBnD,CAEJ,CAAC,EACA4G,IAAmBN,OAClB,OAAC,OAAI,UAAWtJ,GAAO,IACrB,mBAAC,OAAI,UAAWoK,EAAiB,OAAYpK,GAAO,YAClD,mBAACwL,EAAA,GACC,UAAWxL,GAAO,MAClB,MAAOsJ,GACP,MAAOjB,GAAK,CAAC,EACb,MAAO8F,GAAO,CAAC,EACf,SAAU5E,GACV,QAAAG,EAAA,CACF,EACF,EACF,GAEJ,CAEJ,EAEMg+B,EAAkB/+B,IAA0B,CAChD,OAAK,OAAI,CACP,QAAS,UACX,CAAC,EACD,WAAS,OAAI,CACX,WAAY,QACd,CAAC,EACD,SAAO,OAAI,CACT,aAAcA,EAAM,QAAQ,CAAC,EAC7B,aAAc,aACd,UAAW,YACb,CAAC,EACD,SAAO,OAAI,CACT,aAAc,aACd,UAAW,aACX,OAAQ,CACN,WAAY,QACd,EACA,UAAW,CACT,OAAQ,CACN,WAAY,SACd,CACF,CACF,CAAC,EACD,QAAM,OAAI,CACR,WAAY,OACd,CAAC,EACD,iBAAe,OAAI,CACjB,WAAY,SACZ,cAAeA,EAAM,QAAQ,EAAG,CAClC,CAAC,EACD,SAAO,OAAI,CACT,aAAcA,EAAM,QAAQ,CAAC,EAC7B,UAAW,YACX,MAAO,OACP,SAAU,MACZ,CAAC,EACD,eAAa,OAAI,CACf,WAAY,OACd,CAAC,EACD,kBAAgB,OAAI,CAClB,QAAS,OACT,WAAYA,EAAM,WAAW,KAAK,WAClC,WAAY,WACZ,UAAW,aACX,UAAW,OACX,SAAU,MACZ,CAAC,CACH,GAEM+/B,EAAyB,CAAC,CAAE,MAAAzoC,CAAM,IAAyB,CAC/D,MAAMD,KAAS,MAAW2oC,CAAwB,EAClD,SACE,OAAC,OAAI,UAAW3oC,EAAO,OACrB,mBAAC+J,EAAA,GACC,QAAS,IAAM9J,EACf,gBAAY,KAAE,uDAAwD,yBAAyB,EAC/F,KAAK,OACL,QAAQ,YACR,KAAK,OACL,KAAK,KACP,EACF,CAEJ,EAEM0oC,EAA4BhgC,IAA0B,CAC1D,UAAQ,OAAI,CACV,aAAc,CACZ,MAAOA,EAAM,OAAO,KAAK,UACzB,IAAK,EACL,QAAS,EACT,eAAgB,SAChB,aAAcA,EAAM,MAAM,OAAO,OACjC,OAAQA,EAAM,QAAQA,EAAM,WAAW,OAAO,EAAE,EAChD,MAAOA,EAAM,QAAQA,EAAM,WAAW,OAAO,EAAE,EAC/C,IAAK,CACH,OAAQ,CACV,EAEA,aAAc,CACZ,IAAK,OACL,WAAY,CACV,MAAOA,EAAM,OAAO,QAAQ,IAC9B,CACF,CACF,CACF,CAAC,CACH,GAEa6/B,EAAgB,CAAC,CAAE,SAAAx+B,EAAU,OAAAmE,EAAS,CAAC,CAAE,IAChDA,EAAO,MAAOrE,IAAQA,KAAQ,EAAE,EAC3B,QAGP,OAAC,SACC,mBAAC,SACE,SAAAqE,EAAO,IAAI,CAACrE,GAAK9G,QAEd,QAAC,MACC,oBAAC,MAAI,SAAA8G,EAAA,CAAI,KACT,OAAC,MAAI,SAAAE,GAAYF,KAAQ,OAAM,OAAC4+B,EAAA,CAAuB,MAAO5+B,EAAA,CAAK,EAAG,IAF/D,GAAGA,EAAG,IAAI9G,EAAC,EAGpB,CAEH,EACH,EACF,EAISylC,EAAc,CAAC,CAAE,MAAOG,EAAe,aAAAhlB,CAAa,IAAiD,CAChH,MAAM3jB,MAAQ,WAAQ,IAAM,CAC1B,GAAI,CAAC2jB,EACH,OAAOglB,EAET,GAAI,CACF,MAAMpoC,MAAS,SAAU,MAAMooC,CAAa,EAAG,OAAW,CAAC,EAC3D,GAAIpoC,GACF,OAAOA,EAEX,MAAgB,CAAC,CACjB,OAAOooC,CACT,EAAG,CAACA,EAAehlB,CAAY,CAAC,EAEhC,SACE,oBACG,UAAA3jB,MACD,OAACyoC,EAAA,CAAuB,MAAAzoC,EAAA,CAAc,GACxC,CAEJ,EAQMgL,GAAkB,CAAC,CAAE,SAAAU,EAAU,cAAAC,EAAe,GAAGC,EAAK,IAA4B,CACtF,KAAM,CAACC,GAAQC,EAAS,KAAI,YAAS,EAAK,EACpCC,GAAUF,GAAS,gBAAkB,mBAE3C,sBAAU,IAAM,CACdH,EAAS,EAAE,KAAKI,EAAS,CAC3B,EAAG,CAACJ,CAAQ,CAAC,KAEN,OAACX,EAAA,EAAU,CAAE,GAAGa,GAAM,QAASC,GAAS,UAAY,OAAW,QAASE,GAAUJ,CAAA,CAAe,CAC1G,EAEO,SAASu7B,EAAar5B,EAAoBwvB,EAAgB,CAC/D,MAAMj1B,GAAOyF,EAAO,IAAKI,IAAUA,GAAM,KAAK,KAAK,GAAG,CAAC,EACjD26B,MAAUC,EAAA,GAAYzgC,GAAMi1B,CAAM,EAClCnvB,GAASL,EAAO,IAAKI,IAAUA,GAAM,OAAO,KAAK,GAAG,CAAC,EACrD66B,MAAYD,EAAA,GAAY36B,GAAQmvB,CAAM,EAEtClpB,GAAUy0B,GAAQ,IAAKxhC,IAAUyG,EAAOzG,EAAK,CAAC,EACpD,OAAA0hC,GAAU,QAAS1hC,IAAU,CACtB+M,GAAQ,SAAStG,EAAOzG,EAAK,CAAC,GACjC+M,GAAQ,KAAKtG,EAAOzG,EAAK,CAAC,CAE9B,CAAC,EAEM+M,EACT,CAEA,SAASkzB,EAAaj6B,EAA0BiwB,EAAgB,CAC9D,MAAMj1B,GAAOgF,EAAO,IAAKa,IAAUA,GAAM,GAAG,EACtC26B,MAAUC,EAAA,GAAYzgC,GAAMi1B,CAAM,EAClCnvB,GAASd,EAAO,IAAKa,IAAUA,GAAM,KAAK,EAC1C66B,MAAYD,EAAA,GAAY36B,GAAQmvB,CAAM,EAEtClpB,GAAUy0B,GAAQ,IAAKxhC,IAAUgG,EAAOhG,EAAK,CAAC,EACpD,OAAA0hC,GAAU,QAAS1hC,IAAU,CACtB+M,GAAQ,SAAS/G,EAAOhG,EAAK,CAAC,GACjC+M,GAAQ,KAAK/G,EAAOhG,EAAK,CAAC,CAE9B,CAAC,EAEM+M,EACT,C,oCC3hBO,MAAM40B,EAAuB,CAAC,CAAE,aAAAC,EAAc,IAAAlpC,EAAK,OAAAu9B,GAAQ,SAAA4L,EAAS,IAAa,CACtF,KAAM,CACJ,aAAAxjB,GACA,YAAAlC,GACA,gBAAAtZ,GACA,mBAAAoR,GACA,qBAAAiG,GACA,mBAAAU,GACA,eAAAC,GACA,eAAAuB,GACA,iBAAAvW,GACA,iBAAAD,GACA,cAAAuV,GACA,iBAAAD,GACA,UAAAlY,GACA,YAAAoY,GACA,eAAAtY,GACA,qBAAAuZ,GACA,mBAAAyC,EACF,KAAI,MAAkB,EAChB4Z,MAAS,MAAehgC,CAAG,EAC3BC,MAAS,MAAW,EAAWwjB,GAAarZ,EAAc,EAC1Dg/B,MAAe,UAA8B,IAAI,EACjDC,MAAW,UAAgC,IAAI,EAC/CC,MAAgB,UAAO,EAAK,EAE5BvB,MAA2B,eAC/B,CAACC,GAAyBC,KAAyC,CAC7D9lB,OAGJ,MAAkB6lB,GAAiBC,EAAU,CAC/C,EACA,CAAC9lB,EAAc,CACjB,EAEMonB,MAAkB,eAAY,IAAM,CACxCL,IAAelpC,CAAG,EAClB+nC,GAAyB,gDAAgD,CAC3E,EAAG,CAACmB,EAAclpC,EAAK+nC,EAAwB,CAAC,EAE1CyB,MAAc,eAAY,IAAM,IACpC,MAASxpC,EAAI,MAAOopC,EAAY,EAChCrB,GAAyB,2CAA2C,CACtE,EAAG,CAAC/nC,EAAI,MAAO+nC,EAAwB,CAAC,EAElC0B,MAAoB,eAAY,IAAM,CAC1CjnB,KAAmBxiB,CAAG,EACtB+nC,GAAyB,gDAAgD,CAC3E,EAAG,CAAC/nC,EAAKwiB,GAAkBulB,EAAwB,CAAC,EAE9C2B,MAAgB,eAAY,IAAM,CAClC1J,GACFtd,KAAc1iB,CAAG,EAEjBsK,KAAYtK,CAAG,EAEjB+nC,GAAyB,8CAA8C,CACzE,EAAG,CAAC/nC,EAAKsK,GAAWoY,GAAasd,GAAQ+H,EAAwB,CAAC,EAE5D4B,MAA2B,WAC/B,IAAOznB,GAAqBA,GAAmBliB,CAAG,EAAI,GACtD,CAACA,EAAKkiB,EAAkB,CAC1B,EAEM0nB,MAAc,eAClB,MAAO95B,IAAmC,IACxC,KAA2BA,GAAO9P,EAAKub,GAAqBvb,IAAqByiB,KAAgBziB,GAAK,IAAM,CAAC,CAAC,CAAC,EAC/G+nC,GAAyB,8CAA8C,CACzE,EACA,CAAC/nC,EAAKub,GAAoBwsB,GAA0BtlB,EAAa,CACnE,EAEMonB,GAAoB18B,IAAoBD,IAAoB/C,GAAgB,OAAS,EACrF2/B,GAAmB3/B,GAAgB,SAAS,GAAwB,EAEpE4/B,MAAoB,eAAY,IAAM,CAC1C,MAAMC,GAAUvmB,KAAgB,SAAW,UAAY,SACnDjC,IACF3E,EAAA,EAAM,IAAI,GAAG2E,EAAoB,eAAgBwoB,EAAO,EAG1DtmB,GAAesmB,EAAO,CACxB,EAAG,CAACvmB,GAAajC,GAAsBkC,EAAc,CAAC,EAEhDumB,MAAgB,eAAY,IAAM,CAClCH,GACF38B,KAAmB,GAAwB,EAE3CD,KAAmB,GAAwB,EAE7C66B,GAAyB,mDAAmD,CAC9E,EAAG,CAAC+B,GAAkB38B,GAAkBD,GAAkB66B,EAAwB,CAAC,EAE7EmC,MAAc,WAClB,OACE,OAACj/B,EAAA,GACC,KAAK,QACL,KAAK,KACL,QAAS,IAAM,CACbk+B,GAAS,EAAE,EACXpB,GAAyB,6CAA6C,EAClEsB,GAAS,UACXA,GAAS,QAAQ,MAAQ,GAE7B,EACA,WAAS,KAAE,qCAAsC,OAAO,EAC1D,EAEF,CAACF,GAAUpB,EAAwB,CACrC,EAEMoC,MAAe,eAClB7+B,IAAqC,CACpC69B,GAAS79B,GAAE,OAAO,KAAK,EAClBg+B,GAAc,UACjBvB,GAAyB,0CAA0C,EACnEuB,GAAc,QAAU,GAE5B,EACA,CAACH,GAAUpB,EAAwB,CACrC,EAEA,SACE,QAAC,OAAI,UAAW9nC,GAAO,OAAQ,IAAKmpC,GAClC,oBAACgB,EAAA,GACC,SAAUD,GACV,eAAa,KAAE,2CAA4C,+BAA+B,EAC1F,IAAKd,GACL,OAAQ9L,KAAW,GAAK2M,GAAc,OACxC,KACA,QAAC,OAAI,UAAWjqC,GAAO,MACpB,UAAA0jB,OACC,OAAC1Y,EAAA,GACC,WAAS,KAAE,uCAAwC,+BAA+B,EAClF,iBAAiB,MACjB,KAAK,KACL,KAAK,aACL,QAAS,IAAMmb,KAAqBpmB,CAAG,EACvC,SAAU,EACZ,EAEDkpC,MACC,OAACj+B,EAAA,GACC,WAAS,KAAE,0CAA2C,oBAAoB,EAC1E,iBAAiB,MACjB,KAAK,KACL,KAAK,WACL,QAASs+B,GACT,SAAU,EACZ,EAEDM,OACC,OAAC5+B,EAAA,GACC,QACE6+B,MACI,KAAE,sCAAuC,eAAe,KACxD,KAAE,sCAAuC,eAAe,EAE9D,iBAAiB,MACjB,KAAK,KACL,KAAK,MACL,QAASG,GACT,SAAU,EACV,QAASH,GAAmB,UAAY,OAC1C,KAEF,OAAC7+B,EAAA,GACC,WAAS,KAAE,0CAA2C,mBAAmB,EACzE,iBAAiB,MACjB,KAAK,KACL,KAAK,OACL,QAASu+B,GACT,SAAU,EACZ,EACChnB,IAAoBxiB,EAAI,QAAU,QAAaA,EAAI,QAClD,OAACiL,EAAA,GACC,WAAS,KAAE,uCAAwC,gBAAgB,EACnE,iBAAiB,MACjB,KAAK,KACL,KAAK,YACL,QAASw+B,GACT,SAAU,EACZ,EAEDzJ,IAAUtd,OACT,OAACzX,EAAA,GACC,KAAK,KACL,KAAK,SACL,QAASy+B,GACT,WAAS,KAAE,mCAAoC,WAAW,EAC1D,iBAAiB,MACjB,SAAU,EACV,QAAQ,UACV,EAED,CAAC1J,IAAU11B,OACV,OAACW,EAAA,GACC,KAAK,KACL,KAAK,SACL,QAASy+B,GACT,WAAS,KAAE,iCAAkC,SAAS,EACtD,iBAAiB,MACjB,SAAU,EACZ,EAEDC,OACC,OAAC1+B,EAAA,GACC,KAAK,KACL,KAAK,kBACL,QAAS2+B,GACT,WAAS,KAAE,qCAAsC,cAAc,EAC/D,iBAAiB,MACjB,SAAU,EACZ,KAEF,OAAC3+B,EAAA,GACC,KAAMwY,KAAgB,SAAW,cAAgB,mBACjD,QACEA,KAAgB,YACZ,KAAE,qCAAsC,qBAAqB,KAC7D,KAAE,oCAAqC,gBAAgB,EAE7D,QAASsmB,EAAA,CACX,KACA,OAAC9+B,EAAA,GACC,KAAK,QACL,WAAS,KAAE,8BAA+B,mBAAmB,EAC7D,QAAS0a,EAAA,CACX,GACF,GACF,CAEJ,EAEM,EAAY,CAAC/c,EAAsB09B,EAA0Bl8B,MAA6B,CAC9F,aAAW,OAAI,CACb,SAAU,OACV,OAAQ,MACV,CAAC,EACD,mBAAiB,OAAI,CACnB,SAAU,OACV,OAAQ,MACV,CAAC,EACD,UAAQ,OAAI,CACV,WAAY,SACZ,WAAYxB,EAAM,OAAO,WAAW,OACpC,QAAS,OACT,cAAe,CAACwB,IAAkBk8B,IAAS,SAAW,cAAgB,MACtE,IAAK19B,EAAM,QAAQ,GAAI,EACvB,OAAQA,EAAM,OAAO,YACrB,OAAQA,EAAM,QAAQ,GAAG,EACzB,aAAcA,EAAM,QAAQ,CAAC,EAC7B,QAASA,EAAM,QAAQ,GAAK,CAAC,EAC7B,SAAU,SACV,IAAK,CACP,CAAC,EACD,SAAO,OAAI,CACT,QAAS,OACT,IAAKA,EAAM,QAAQ,CAAC,EACpB,YAAaA,EAAM,QAAQ,CAAC,CAC9B,CAAC,EACD,iBAAe,OAAI,CACjB,QAAS,EACT,OAAQA,EAAM,QAAQ,CAAC,EACvB,MAAOA,EAAM,QAAQ,GAAG,EACxB,SAAU,SACV,UAAW,CACT,gBAAiByhC,EAAA,GAAiB,MAAMzhC,EAAM,OAAO,KAAK,QAAS,GAAI,CACzE,CACF,CAAC,EACD,oBAAkB,OAAI,CACpB,QAASA,EAAM,QAAQ,EAAG,EAAG,EAAG,CAAC,CACnC,CAAC,CACH,G,eCpRO,MAAM0hC,MAAsB,QAAK,CAAC,CAAE,OAAAv8B,EAAQ,IAAA/N,EAAK,OAAAu9B,EAAO,IAAgC,CAC7F,MAAMt9B,MAAS,MAAW,EAAe,EACnCknC,MAAiB,WAAQ,IAAO5J,GAAS6J,EAAar5B,EAAQwvB,EAAM,EAAIxvB,EAAS,CAACA,EAAQwvB,EAAM,CAAC,EAEvG,GAAKxvB,EAAO,QAEL,GAAIo5B,GAAe,SAAW,EACnC,SAAO,KAAE,0CAA2C,wBAAwB,MAF5E,QAAO,KAKT,SACE,OAAC,OAAI,UAAWlnC,GAAO,WACpB,SAAAknC,GAAe,IAAI,CAACh5B,GAAOlL,QAC1B,OAAC,GAAmB,CAAkD,MAAAkL,GAAc,IAAAnO,CAAA,EAA1D,GAAGmO,GAAM,KAAK,CAAC,CAAC,IAAIA,GAAM,OAAO,CAAC,CAAC,IAAIlL,EAAC,EAA4B,CAC/F,EACH,CAEJ,CAAC,EACDqnC,GAAoB,YAAc,sBAElC,MAAM,GAAmB1hC,IAA0B,CACjD,cAAY,OAAI,CACd,QAAS,OACT,IAAKA,EAAM,QAAQ,CAAC,EACpB,oBAAqB,uBACrB,aAAcA,EAAM,QAAQ,CAAC,CAC/B,CAAC,CACH,GAOa,GAAsB,CAAC,CAAE,MAAAuF,EAAO,IAAAnO,CAAI,IAAgC,CAC/E,KAAM,CAAE,aAAA2lB,GAAc,UAAArb,GAAW,0BAAAC,GAA2B,aAAAsZ,EAAa,KAAI,MAAkB,EAEzF5jB,MAAS,MAAW,CAAc,EAElCyK,GAAYyD,EAAM,KAAK,SAAW,EAClCo6B,GAAcp6B,EAAM,OAAO,SAAW,EAEtClC,MAAU,WACd,OACE,OAAC,OAAI,UAAWhM,GAAO,MACrB,mBAAC,OAAI,UAAWA,GAAO,eACpB,SAAAsoC,MACC,OAACG,EAAW,CAAC,MAAOv6B,EAAM,OAAO,CAAC,EAAG,aAAA0V,EAAA,CAA4B,KAEjE,OAAC4kB,EAAa,CAAC,SAAU,GAAM,OAAQt6B,EAAM,OAAQ,EAEzD,EACF,EAEF,CAACA,EAAM,OAAQo6B,GAAatoC,GAAO,MAAOA,GAAO,eAAgB4jB,EAAY,CAC/E,EAEA,SACE,oBACE,qBAAC,OAAI,UAAW5jB,GAAO,MACpB,UAAAyK,GAAYyD,EAAM,KAAK,CAAC,KAAI,OAACs6B,EAAa,CAAC,OAAQt6B,EAAM,KAAM,KAChE,OAACo8B,EAAA,EAAS,CAAC,WAAU,GAAC,QAASt+B,GAC7B,mBAAC+3B,EAAA,GACC,gBAAY,KAAE,2CAA4C,YAAY,EACtE,UAAW/jC,GAAO,UAClB,KAAK,cACP,EACF,GACF,KACA,OAAC,OAAI,UAAWA,GAAO,MACpB,SAAAkO,EAAM,OAAO,IAAI,CAAC/C,GAAMnI,KAAM,CAC7B,GAAImI,GAAK,SAAWd,GAAW,CAC7B,MAAMe,GAAkBD,GAAK,QAC7BA,GAAK,QAAU,CAACE,GAAGC,KAAW,CAE5BjB,GAAUtK,CAAG,EAGbqL,GAAgBC,GAAGC,EAAM,EAEzBoa,GAAa,CACf,CACF,CACA,SACE,OAAC,QAAgC,UAAW1lB,GAAO,KACjD,mBAACuL,EAAA,GACC,YAAa,CAEX,QACE,OAAOjB,IAA8B,UAAYa,GAAK,QAClDb,GACA,OACN,QAAS,YACT,KAAM,SACR,EACA,KAAAa,EAAA,CACF,GAZS,GAAGA,GAAK,KAAK,IAAInI,EAAC,EAa7B,CAEJ,CAAC,EACH,GACF,CAEJ,EAEM,EAAkB2F,IAA0B,CAChD,SAAO,OAAI,CACT,aAAc,aACd,UAAW,aACX,aAAcA,EAAM,QAAQ,CAAC,CAC/B,CAAC,EACD,aAAW,OAAI,CACb,WAAYA,EAAM,QAAQ,CAAC,CAC7B,CAAC,EACD,SAAO,OAAI,CACT,OAAQ,CACN,WAAY,QACd,EACA,UAAW,CACT,OAAQ,CACN,WAAY,SACd,CACF,CACF,CAAC,EACD,SAAO,OAAI,CACT,cAAeA,EAAM,QAAQ,EAAG,CAClC,CAAC,EACD,QAAM,OAAI,CACR,YAAaA,EAAM,QAAQ,EAAG,CAChC,CAAC,EACD,kBAAgB,OAAI,CAClB,QAAS,OACT,WAAYA,EAAM,WAAW,KAAK,WAClC,WAAY,WACZ,UAAW,YACX,UAAW,OACX,SAAU,MACZ,CAAC,CACH,G,2GCzIO,MAAM4hC,GAAsB,CAAC,CAAE,UAAAp+B,EAAW,SAAA2C,EAAU,SAAA07B,EAAS,IAAa,CAC/E,KAAM,CAACC,GAAYC,EAAa,KAAI,YAA+B,IAAI,EACjE,CAACC,GAAYC,EAAa,KAAI,YAAyC,MAAS,EAChF,CAAE,IAAAjhC,EAAI,KAAI,MAAkB,EAC5B3J,MAAS,MAAW,EAAS,KAEnC,aAAU,IAAM,CACd0qC,GAAc,IAAI,KAClB,MAAiB,EACd,IAAIF,GAAS,KAAK,EAClB,KAAMC,IAAe,CAChBA,GACFC,GAAcD,EAAU,EAExBG,GAAc,IAAI,CAEtB,CAAC,CACL,EAAG,CAACJ,GAAS,KAAK,CAAC,KAEnB,aAAU,IAAM,CACd,GAAI,CAACC,GACH,OAEFG,GAAc,MAAS,EACvB,MAAMC,GAAwC,CAC5C,IAAAlhC,GACA,UAAW,qBAAqB6gC,GAAS,KAAK,GAC9C,QAAS,CACP,CACE,MAAOA,GAAS,MAChB,UAAW,UACX,MAAO,qBAAqBA,GAAS,KAAK,GAC1C,UAAW,MAAgB,OAC3B,QAAS,CAAC,CACZ,CACF,EACA,SAAU,GACV,WAAY,EACZ,MAAOr+B,EACP,WAAY,CAAC,EACb,SAAU2C,EACV,UAAW,KAAK,IAAI,CACtB,EACMuG,GAAQo1B,GAAW,MAAMI,EAAO,KAClCC,EAAA,GAAaz1B,EAAK,MACpB01B,EAAA,GAAc11B,EAAK,EAChB,KAAM21B,IAAa,CAClBJ,GAAcI,GAAS,MAAM,OAASA,GAAS,KAAO,IAAI,CAC5D,CAAC,EACA,MAAM,IAAM,CACXJ,GAAc,IAAI,CACpB,CAAC,CAEP,EAAG,CAACjhC,GAAK8gC,GAAYt+B,EAAW2C,EAAU07B,GAAS,KAAK,CAAC,EAEzD,MAAMS,MAAY,WAAQ,IAAON,IAAY,UAASO,GAAA,GAAoBP,GAAW,CAAC,CAAC,EAAI,OAAY,CAACA,EAAU,CAAC,EAEnH,sBAAU,IAAM,CACVF,IAAc,MAAM,QAAQE,EAAU,GAAKM,MAC7C,MAAkB,uCAAuC,EAChDN,KAAe,SACxB,MAAkB,4CAA4C,CAElE,EAAG,CAACA,GAAYF,GAAYQ,EAAS,CAAC,KAGpC,QAAC,OACE,UAAAR,IAAc,MAAM,QAAQE,EAAU,GAAKM,OAC1C,OAACE,GAAA,EAAS,CAAC,WAAAR,GAAwB,UAAAM,GAAsB,WAAYR,GAAY,UAAAt+B,CAAA,CAAsB,EAExGw+B,KAAe,SACd,QAAC,OAAI,UAAW3qC,GAAO,QACrB,oBAAC0L,GAAA,GACC,WAAS,KACP,4CACA,kEACF,EAEA,mBAACq4B,EAAA,EAAI,CAAC,KAAK,aAAc,GAC3B,KACC,KAAE,4CAA6C,2BAA2B,GAC7E,EAED4G,KAAe,WACd,QAAC,OAAI,UAAW3qC,GAAO,QACrB,oBAACorC,GAAA,EAAO,EAAC,KACR,KAAE,8CAA+C,kBAAkB,GACtE,GAEJ,CAEJ,EAEM,GAAaziC,IAA0B,CAC3C,WAAS,OAAI,CACX,QAAS,OACT,IAAKA,EAAM,QAAQ,CAAC,EACpB,WAAY,QACd,CAAC,CACH,GCpHO,SAAS0iC,GAAuBv9B,EAAoB,CACzD,UAAWI,KAASJ,EAClB,GAAKI,EAAM,MAGX,UAAW/C,MAAQ+C,EAAM,MAAO,CAC9B,MAAMo9B,GAAQC,GAAsBpgC,EAAI,EACxC,GAAImgC,GACF,OAAOA,EAEX,CAEF,OAAO,IACT,CAEA,SAASC,GAAsBpgC,EAAiB,CAC9C,GAAIA,EAAK,oBAAoB,OAASqgC,GAAargC,EAAK,mBAAmB,KAAK,EAAG,CACjF,MAAMkK,EAAQlK,EAAK,mBAAmB,MACtC,MAAO,CACL,MAAOkK,EAAM,YAAY,KAAO,GAChC,MAAOA,EAAM,MACb,UAAWA,EAAM,WAAa,EAChC,CACF,KACE,OAEJ,CAaA,MAAMm2B,GAAgBn2B,GAChB,CAACA,GAAS,OAAOA,GAAU,SACtB,GAEF,UAAWA,GAAS,cAAeA,EChB/Bo2B,MAA0B,QACrC,CAAC,CAAE,aAAAxC,EAAc,IAAAlpC,EAAK,KAAA+hB,GAAM,UAAA3V,GAAW,SAAA2C,EAAS,IAAoC,CAClF,KAAM,CAAE,gBAAA5E,GAAiB,eAAAgY,GAAgB,qBAAAX,GAAsB,mBAAA9D,GAAoB,mBAAA5d,EAAmB,KACpG,MAAkB,EACd,CAACy9B,GAAQoO,EAAS,KAAI,YAAS,EAAE,EACjCtC,MAAW,UAAO,EAAE,EACpBppC,MAAS,MAAW,EAAS,EAE7B2rC,MAAiB,KAA4B5rC,EAAKoM,EAAS,EAE3DqB,MAAkB,WAAQ,IAAM,CACpC,MAAMA,GAAkBzN,EAAI,OAAO,OAAQ0N,IAAMA,GAAE,OAAO,MAAM,EAC1DC,GAA2BF,GAAgB,OAAQC,IAAMA,GAAE,aAAe1N,EAAI,eAAe,EAAE,KAAK,EACpG4N,GAAwBH,GAAgB,OAAQC,IAAMA,GAAE,aAAe1N,EAAI,eAAe,EAAE,KAAK,EACjG6N,MAAiC,OAAmBD,EAAqB,EAC/E,MAAO,CACL,MAAOD,GACP,qBAAsBE,EACxB,CACF,EAAG,CAAC7N,EAAI,gBAAiBA,EAAI,MAAM,CAAC,EAE9B6rC,GACJ7rC,EAAI,UAAU,MAAM,OAAS,KAAc,SAEvC,CAAC,EAEDA,EAAI,OAAO,OAAQ0N,IAAMA,GAAE,OAAO,SAAW,GAAKA,GAAE,aAAe1N,EAAI,eAAe,EAAE,KAAK,EAE7F8rC,MAAoC,WACxC,IACE,OAAO,KAAK9rC,EAAI,MAAM,EACnB,KAAK,EACL,IAAK8T,KAAW,CACf,IAAKA,GACL,MAAO9T,EAAI,OAAO8T,EAAK,EACvB,MAAO83B,KAAiB93B,EAAK,CAC/B,EAAE,EACN,CAAC83B,GAAgB5rC,EAAI,MAAM,CAC7B,EAEMurC,MAAQ,WAAQ,IAAMD,GAAuB79B,GAAgB,KAAK,EAAG,CAACA,GAAgB,KAAK,CAAC,EAE5Fs+B,MAAgB,WACpB,OAAM,WAAQD,GAAkBh4B,OAAU,MAAoBA,GAAM,IAAK9T,EAAK,EAAI,GAAK,EAAE,EACzF,CAAC8rC,GAAiB9rC,CAAG,CACvB,EACMgsC,MAAc,WAAQ,IAAM,OAAO,KAAKD,EAAa,EAAG,CAACA,EAAa,CAAC,EAEvEE,GAAczqB,GAChB3E,EAAA,EAAM,QAAQ,GAAG2E,EAAoB,2BAA4B,EAAK,EACtE,GACE0qB,GAAY1qB,GACd3E,EAAA,EAAM,QAAQ,GAAG2E,EAAoB,yBAA0B,EAAI,EACnE,GACE2qB,GAAa3qB,GACf3E,EAAA,EAAM,QAAQ,GAAG2E,EAAoB,0BAA2B,EAAI,EACpE,GACE4qB,GAAsB5qB,GACxB3E,EAAA,EAAM,QAAQ,GAAG2E,EAAoB,mCAAoC,EAAK,EAC9E,GACE6qB,GAAY7qB,GACd3E,EAAA,EAAM,QAAQ,GAAG2E,EAAoB,yBAA0B,EAAK,EACpE,GAEE8qB,MAAe,eACnB,CAACC,GAAgBC,KAAoB,CACnC3vB,EAAA,EAAM,IAAI,GAAG2E,EAAoB,gBAAgB+qB,EAAM,GAAIC,EAAM,EAC5DrqB,OACH,MAAkB,wCAAyC,CACzD,QAASoqB,GAAO,QAAQ,OAAQ,EAAE,EAClC,MAAOC,GAAS,OAAS,QAC3B,CAAC,CAEL,EACA,CAAChrB,GAAsBW,EAAc,CACvC,EAEMgoB,MAAe,eAAasC,IAAsB,CACtDpD,GAAS,QAAUoD,MACnB,mBAAgB,IAAM,CACpBd,GAAUtC,GAAS,OAAO,CAC5B,CAAC,CACH,EAAG,CAAC,CAAC,EAECqD,GACJ,CAACj/B,GAAgB,MAAM,QACvB,CAACA,GAAgB,qBAAqB,QACtC,CAACu+B,GAAY,QACb,CAACH,GAAmB,OAEhBc,MAAW,WACf,IAAM,CAAC,GAAGl/B,GAAgB,MAAO,GAAGA,GAAgB,oBAAoB,EACxE,CAACA,GAAgB,MAAOA,GAAgB,oBAAoB,CAC9D,EAEA,SACE,oBACE,oBAACw7B,EAAoB,CAAC,aAAAC,EAA4B,IAAAlpC,EAAU,OAAAu9B,GAAgB,SAAU4M,EAAA,CAAc,KACpG,QAAC,OAAI,UAAWlqC,GAAO,iBACrB,oBAAC,KACC,UAAWA,GAAO,YAClB,SAAO,KAAE,yCAA0C,UAAU,EAC7D,OAAQgsC,GACR,SAAWO,IAAoBF,GAAa,cAAeE,EAAM,EAEjE,mBAAC5sC,EAAA,EAAiB,CAAC,IAAAI,EAAU,mBAAoBF,IAAsB,GAAM,EAC/E,EACCqK,GAAgB,OAAS,GAAKuT,OAC7B,OAAC,KACC,SAAO,KAAE,iDAAkD,2BAA2B,EACtF,OAAQ0uB,GACR,SAAWI,IAAoBF,GAAa,sBAAuBE,EAAM,EAEzE,mBAACtG,EAA6B,EAAC,EACjC,EAEDyG,GAAS,OAAS,MACjB,OAAC,KACC,UAAW1sC,GAAO,YAClB,SAAO,KAAE,sCAAuC,OAAO,EACvD,OAAQisC,GACR,SAAWM,IAAoBF,GAAa,YAAaE,EAAM,EAE/D,mBAAClC,GAAmB,CAAC,IAAAtqC,EAAU,KAAA+hB,GAAY,OAAQ4qB,GAAU,OAAApP,EAAA,CAAgB,EAC/E,EAEDgO,OACC,OAAC,KACC,SAAO,KAAE,sCAAuC,OAAO,EACvD,OAAQc,GACR,SAAWG,IAAoBF,GAAa,YAAaE,EAAM,EAE/D,mBAAChC,GAAmB,CAAC,UAAAp+B,GAAsB,SAAA2C,GAAoB,SAAUw8B,EAAA,CAAO,EAClF,EAEDS,GAAY,IAAKY,IAChBA,KAAU,MACR,QAAC,KACC,UAAW3sC,GAAO,YAElB,SAAO,KAAE,uCAAwC,QAAQ,EACzD,OAAQksC,GACR,SAAWK,IAAoBF,GAAa,aAAcE,EAAM,EAEhE,oBAAClF,EAAyB,CAAC,IAAAtnC,EAAU,KAAA+hB,GAAY,OAAQgqB,GAAca,EAAK,EAAG,OAAArP,EAAA,CAAgB,KAC/F,OAACyJ,EAAoB,CAAC,IAAAhnC,EAAU,KAAA+hB,GAAY,OAAQ8pB,GAAoB,OAAAtO,EAAA,CAAgB,IANnF,QAOP,KAEA,OAAC,KACC,UAAWt9B,GAAO,YAElB,MAAO2sC,GACP,OAAQ/vB,EAAA,EAAM,QAAQ,GAAG2E,EAAoB,gBAAgBqrB,GAAgBD,EAAK,CAAC,GAAI,EAAI,EAC3F,SAAWJ,IAAoBF,GAAaO,GAAgBD,EAAK,EAAGJ,EAAM,EAE1E,mBAAClF,EAAyB,CAAC,IAAAtnC,EAAU,KAAA+hB,GAAY,OAAQgqB,GAAca,EAAK,EAAG,OAAArP,EAAA,CAAgB,GAL1FqP,EAMP,CAEJ,EACC,CAACZ,GAAY,QAAUH,GAAmB,OAAS,MAClD,OAAC,KACC,UAAW5rC,GAAO,YAElB,SAAO,KAAE,uCAAwC,QAAQ,EACzD,OAAQksC,GACR,SAAWK,IAAoBF,GAAa,aAAcE,EAAM,EAEhE,mBAACxF,EAAoB,CAAC,IAAAhnC,EAAU,KAAA+hB,GAAY,OAAQ8pB,GAAoB,OAAAtO,EAAA,CAAgB,GALnF,QAMP,EAEDmP,OAAa,OAAC,KAAK,CAAC,QAAQ,mCAAmC,iCAAqB,GACvF,GACF,CAEJ,CACF,EACAhB,GAAwB,YAAc,0BAEtC,SAASmB,GAAgBD,EAAe,CACtC,MAAO,MAAG,aAAUA,CAAK,CAAC,MAC5B,CAEA,MAAM,GAAahkC,IAA0B,CAC3C,eAAa,OAAI,CACf,iBAAkB,CAChB,aAAc,CAChB,CACF,CAAC,EACD,oBAAkB,OAAI,CACpB,QAASA,EAAM,QAAQ,EAAG,EAAG,EAAG,CAAC,CACnC,CAAC,CACH,G,gBCpMO,MAAMkkC,MAAiB,QAC5B,CAAC,CAAE,iBAAAxrB,EAAkB,aAAA4nB,EAAc,KAAAnnB,GAAM,UAAA3V,GAAW,SAAA2C,GAAU,aAAA6T,EAAa,IAAa,CACtF,KAAM,CAAE,aAAAU,GAAc,eAAAnB,GAAgB,gBAAA6D,EAAgB,KAAI,MAAkB,EACtE/lB,MAAS,MAAW,GAAW,UAAW2iB,EAAY,EACtDqJ,MAAa,MAAW,GAAa,EACrCmd,MAAe,UAA8B,IAAI,EAEjDhlB,MAAe,eAAY,IAAM,CACjCglB,GAAa,SACfpjB,GAAgBojB,GAAa,QAAQ,WAAW,CAEpD,EAAG,CAACpjB,EAAe,CAAC,EAEd+mB,MAAe,eAAY,IAAM,CACjC3D,GAAa,SAAW,CAACjnB,OAC3B,MAAkB,wCAAyC,CACzD,MAAO,KAAK,MAAMinB,GAAa,QAAQ,WAAW,CACpD,CAAC,CAEL,EAAG,CAACjnB,EAAc,CAAC,EAEb+D,GAAW5E,EAAiB,YAAc,MAEhD,SACE,OAAC,KACC,SAAU8C,GACV,aAAc2oB,GACd,cAAe,CAAE,KAAM9gB,GAAW,kBAAmB,EACrD,YAAa,CAAE,MAAO3I,GAAc,OAAQhC,EAAiB,YAAa,EAC1E,KAAM,CAAE,MAAOgC,GAAc,OAAQhC,EAAiB,YAAa,EACnE,OAAQ,CAAE,KAAM,EAAK,EACrB,SAAU,GACV,SAAA4E,GAEA,mBAAC,OAAI,UAAWjmB,GAAO,UAAW,IAAKmpC,GACrC,mBAAC4D,GAAA,CAAmB,aAAA9D,EAA4B,KAAAnnB,GAAY,UAAA3V,GAAsB,SAAA2C,EAAA,CAAoB,EACxG,EACF,CAEJ,CACF,EACA+9B,GAAe,YAAc,iBAE7B,MAAME,MAAqB,QACzB,CAAC,CAAE,aAAA9D,EAAc,KAAAnnB,EAAM,UAAA3V,GAAW,SAAA2C,EAAS,IAAuE,CAChH,KAAM,CAAE,IAAAnF,GAAK,aAAA+b,GAAc,eAAAxD,GAAgB,YAAAiB,GAAa,cAAAyC,GAAe,eAAAzb,EAAe,KAAI,MAAkB,EACtG,CAAC6iC,GAAYC,EAAa,KAAI,YAAS9pB,GAAY,CAAC,CAAC,EACrD+pB,MAAsBC,EAAA,GAAYhqB,EAAW,EAC7CnjB,MAAS,MAAW,GAAW,SAAS,EAE9C,sBAAU,IAAM,CAGVmK,IACF8+B,EAAa+D,EAAU,EAEpB9qB,OACH,MAAkB,kCAAmC,CACnD,KAAM,UACN,IAAAvY,EACF,CAAC,CAIL,EAAG,CAAC,CAAC,KAEL,aAAU,IAAM,CACd,GAAI,CAACwZ,GAAY,OAAQ,CACvBuC,GAAa,EACb,MACF,CAEA,GAAI,CAACwnB,IAAuB/pB,GAAY,OAAS+pB,GAAoB,OAAQ,CAC3ED,GAAc9pB,GAAYA,GAAY,OAAS,CAAC,CAAC,EACjD,MACF,MAAYA,GAAY,KAAMpjB,IAAQA,GAAI,MAAQitC,GAAW,GAAG,GAC9DC,GAAc9pB,GAAYA,GAAY,OAAS,CAAC,CAAC,CAErD,EAAG,CAACuC,GAAcsnB,GAAW,IAAKE,GAAqB/pB,EAAW,CAAC,KAGjE,oBACG,UAAAA,GAAY,OAAS,MACpB,OAACiqB,GAAA,EAAO,CACL,SAAAjqB,GAAY,IAAKpjB,OAEd,OAACstC,EAAA,GAEC,SAAQ,GACR,MAAOttC,GAAI,MAAM,UAAU,EAAG,EAAE,EAChC,OAAQitC,GAAW,MAAQjtC,GAAI,IAC/B,YAAa,IAAMktC,GAAcltC,EAAG,EACpC,OAAQ,OACN,OAACgkC,EAAA,GACC,KAAK,QACL,gBAAY,KAAE,mCAAoC,YAAY,EAC9D,QAAS,IAAMne,GAAc7lB,EAAG,EAClC,GAVGA,GAAI,GAYX,CAEH,EACH,KAEF,OAAC,OAAI,UAAWC,GAAO,gBACrB,mBAACyrC,GAAA,CACC,aAAAxC,EACA,IAAK+D,GACL,KAAAlrB,EACA,UAAA3V,GACA,SAAA2C,EAAA,CACF,EACF,GACF,CAEJ,CACF,EACAi+B,GAAmB,YAAc,qBAU1B,MAAMO,MAAuB,QAAK,CAAC,CAAE,KAAAxrB,EAAM,IAAA/hB,EAAK,SAAAwtC,GAAU,UAAAphC,GAAW,SAAA2C,EAAS,IAAiC,CACpH,KAAM,CAAE,IAAAnF,GAAK,aAAA0Z,GAAc,eAAAnB,EAAe,KAAI,MAAkB,EAC1DliB,MAAS,MAAW,GAAW,QAAQ,EACvCwtC,MAAY,UAA8B,IAAI,KAEpD,aAAU,IAAM,CACTtrB,OACH,MAAkB,kCAAmC,CACnD,KAAM,SACN,IAAAvY,EACF,CAAC,CAEL,EAAG,CAACA,GAAKuY,EAAc,CAAC,KAExB,aAAU,KACR,OAAO,iBAAiB,SAAUqrB,EAAQ,EACnC,IAAM,OAAO,oBAAoB,SAAUA,EAAQ,GACzD,CAACA,EAAQ,CAAC,EAEb,MAAME,MAAa,eAAY,IAAM,IACnC,MAA0B1tC,EAAKytC,GAAU,SAAS,WAAa,CAAC,CAClE,EAAG,CAACztC,CAAG,CAAC,EAER,sBAAU,IAAM,CACTytC,GAAU,UAGfA,GAAU,QAAQ,aAAY,MAAyBztC,CAAG,EAC5D,EAAG,CAACA,CAAG,CAAC,KAGN,OAAC,OAAI,UAAW,GAAGC,GAAO,aAAa,2BAA4B,MAAO,CAAE,SAAUqjB,EAAa,EACjG,mBAAC,OAAI,UAAWrjB,GAAO,gBACrB,mBAAC,OAAI,UAAWA,GAAO,gBAAiB,IAAKwtC,GAAW,SAAUC,GAChE,mBAAChC,GAAuB,CAAC,IAAA1rC,EAAU,KAAA+hB,EAAY,UAAA3V,GAAsB,SAAA2C,EAAA,CAAoB,EAC3F,EACF,EACF,CAEJ,CAAC,EACDw+B,GAAqB,YAAc,uBAE5B,MAAMI,GAA0B,GAEjC,GAAY,CAAC/kC,EAAsB09B,EAA0B1jB,MAA4B,CAC7F,iBAAe,OAAI,CACjB,WAAY,SACZ,OAAQ,GAAG+qB,EAAuB,KAClC,QAAS/kC,EAAM,QAAQ,EAAG,EAAG,IAAK,CAAC,EACnC,YAAa,CACf,CAAC,EACD,mBAAiB,OAAI,CACnB,gBAAiBA,EAAM,OAAO,WAAW,UACzC,OAAQ,aAAaA,EAAM,OAAO,OAAO,IAAI,GAC7C,aAAcA,EAAM,MAAM,OAAO,QACjC,OAAQ,OACR,SAAU,MACZ,CAAC,EACD,aAAW,OAAI,CACb,gBAAiBA,EAAM,OAAO,WAAW,SACzC,OAAQ,aAAaA,EAAM,OAAO,OAAO,IAAI,GAC7C,wBAAyBga,GAAe,OAAYha,EAAM,MAAM,OAAO,QACvE,YAAa09B,IAAS,WAAa1jB,GAAe,OAAS,OAC3D,qBAAsBA,GAAe,OAAYha,EAAM,MAAM,OAAO,QACpE,UAAWA,EAAM,QAAQ,GACzB,OAAQ,OACR,SAAU,MACZ,CAAC,EACD,mBAAiB,OAAI,CACnB,SAAU,OACV,OAAQ,MACV,CAAC,EACD,oBAAkB,OAAI,CACpB,QAASA,EAAM,QAAQ,EAAG,EAAG,EAAG,CAAC,CACnC,CAAC,CACH,E,qDCjOIglC,GAAoCC,IACtCA,EAAiB,KAAU,OAC3BA,EAAiB,QAAa,UACvBA,IACND,GAAmB,CAAC,CAAC,EACxB,MAAME,EAAwB,mB,sJCCvB,MAAMC,EAAqB,IAErBC,EAAuB,IAEvBC,EAAsB,GAEtBC,EAA0B,GAEhC,MAAMC,CAAsB,CAWjC,YAAYvlC,EAAsBiZ,EAA2B,CAV7D,KAAQ,IAAuC,KAI/C,KAAQ,gBAAoC,SAG5C,KAAQ,YAAc,SAAS,cAAc,MAAM,EA+BnD,mBAAgB,IAAM,KAAK,WAC3B,iBAAc,IAAM,KAAK,SACzB,sBAAmB,IAAM,KAAK,cAE9B,4BAAyB,IAAM,KAAK,MAAM,OAAO,YAAc,KAAK,cAAc,EAAI,GAAG,EAEzF,yBAAuBoF,IACEA,EAAYmnB,EAAqBnnB,CAAS,EAAI,OAAO,YACnD,KAAK,iBAAiB,GAAG,EAAK,KAAK,uBAAuB,EAGrF,8BAA2B,IAAM,CAC/B,GAAI,CAAC,KAAK,IAAK,CACb,KAAK,gBAAkB,MACvB,MACF,CACA,MAAMonB,EAAkB,KAAK,IAAI,YAAY,GAAG,EAAE,MAC7B,KAAK,wBAAwB,GAAG,EACzBA,GAChB,KACV,QAAQ,KAAK,2DAA2D,EACxE,KAAK,gBAAkB,MAE3B,EAEA,2BAAwB,CAACC,EAAcC,IAAsC,CAC3E,MAAMC,EAAS,SAAS,cAAc,QAAQ,EAC9C,KAAK,IAAMA,EAAO,WAAW,IAAI,EAC5B,KAAK,MAGV,KAAK,IAAI,KAAOF,EAChB,KAAK,IAAI,YAAc,SACvB,KAAK,IAAI,YAAc,SACvB,KAAK,IAAI,gBAAkB,SAC3B,KAAK,IAAI,cAAgB,qBACrBC,IACF,KAAK,IAAI,cAAgBA,GAE7B,EAEA,wBAAqB,CAACD,EAAcC,IAAsC,CACxE,KAAK,YAAY,MAAM,KAAOD,EAC9B,KAAK,YAAY,MAAM,WAAa,SACpC,KAAK,YAAY,MAAM,SAAW,WAClC,KAAK,YAAY,MAAM,UAAY,YAC/BC,IACF,KAAK,YAAY,MAAM,cAAgBA,EAE3C,EAEA,sBAAoBprC,GAAyB,CAC3C,GAAI,CAAC,KAAK,IACR,MAAM,IAAI,MAAM,kEAAkE,EAEpF,MAAMP,EAAMO,EAAK,OAEXsrC,EAAc,KAAK,aAAa,IAAI7rC,CAAG,EAC7C,GAAI6rC,EACF,OAAOA,EAGT,MAAMxoB,GACJ,KAAK,kBAAoB,SAAW,KAAK,IAAI,YAAY9iB,CAAI,EAAE,MAAQ,KAAK,wBAAwBA,CAAI,EAC1G,YAAK,aAAa,IAAIP,EAAKqjB,EAAK,EAEzBA,EACT,EAEA,6BAA2B9iB,GAAiB,CAC1C,KAAK,YAAY,YAAcA,EAE/B,SAAS,KAAK,YAAY,KAAK,WAAW,EAC1C,MAAM8iB,EAAQ,KAAK,YAAY,sBAAsB,EAAE,MACvD,gBAAS,KAAK,YAAY,KAAK,WAAW,EAEnCA,CACT,EAEA,uBAAoB,CAAC9iB,EAAc+iB,EAAkBwoB,EAAc,IAAM,CACvE,IAAIC,GAAW,EACf,MAAMC,EAAY,KAAK,iBAAiB,GAAG,EAC3C,IAAIC,GAAqB,KAAK,MAAM3oB,EAAW0oB,CAAS,EACxD,MAAME,GAAuB,KAAK,OAAO5oB,EAAWwoB,GAAeE,CAAS,EAAI,EAAIA,EAC9EG,GAAY5rC,EAAK,MAAM;AAAA,CAAI,EAGjC,GAAI4rC,GAAU,SAAW,GAAK5rC,EAAK,OAAS2rC,GAC1C,MAAO,CACL,MAAO,EACP,OAAQ,KAAK,cAAc,EAAI,KAAK,aACtC,EAGF,MAAME,EAAiB9oB,EAAWwoB,EAClC,UAAWO,KAAYF,GACrB,QAASjtC,EAAQ,EAAGA,EAAQmtC,EAAS,QAAU,CAC7C,IAAIC,EACAjpB,EAAQ,EACRpV,EAAQ,EACZ,EAAG,CACDq+B,EAAcD,EAAS,UAAUntC,EAAOA,EAAQ+sC,GAAqBh+B,CAAK,EAC1E,IAAIs+B,EAAeD,EACfP,GAAW,GACbQ,EAAa,UAAU,EAEzBlpB,EAAQ,KAAK,iBAAiBkpB,CAAY,EAC1Ct+B,GAAS,CACX,OAASoV,GAAS+oB,GACdN,IACFA,EAAc,GAEhBC,IAAY,EACZ7sC,GAASotC,EAAY,MACvB,CAGF,MAAM9iB,EAASuiB,GAAW,KAAK,cAAc,EAAI,KAAK,cAEtD,MAAO,CACL,MAAOA,GACP,OAAAviB,CACF,CACF,EAEA,8BAA2B,CACzBrK,EACA5X,EAA4B,CAAC,EAC7B6Y,EACAD,KACG,CACH,GAAI,CAAChB,EAAK,OACR,MAAO,CAAC,EAEV,IAAIqtB,EAAiB,EACjBC,GAAa,EACjB,MAAMC,GAAsC,CAAC,EAC7C,QAASrsC,EAAI,EAAGA,EAAI8e,EAAK,OAAQ9e,IAAK,CACpC,IAAIgjB,EAAQ,KAAK,iBAAiBjD,IAAwB,KAAOjB,EAAK9e,CAAC,EAAE,UAAY8e,EAAK9e,CAAC,EAAE,WAAW,EACpGgjB,EAAQmpB,IACVA,EAAiB,KAAK,MAAMnpB,CAAK,GAEnCA,EAAQ,KAAK,iBAAiBlE,EAAK9e,CAAC,EAAE,YAAY,EAC9CgjB,EAAQopB,KACVA,GAAa,KAAK,MAAMppB,CAAK,GAE/B,UAAW9X,KAAShE,EAClB8b,EAAQ,KAAK,iBAAiBlE,EAAK9e,CAAC,EAAE,uBAAuBkL,EAAO,EAAI,CAAC,EACzEmhC,GAAYnhC,CAAK,EAAI,CAACmhC,GAAYnhC,CAAK,GAAK8X,EAAQqpB,GAAYnhC,CAAK,EAAI,KAAK,MAAM8X,CAAK,EAAIqpB,GAAYnhC,CAAK,CAElH,CACA,MAAMohC,GAAkC,CACtC,CACE,MAAO,YACP,MAAOH,CACT,EACA,CACE,MAAO,QACP,MAAOC,EACT,CACF,EACItsB,IACFwsB,GAAW,KAAK,CACd,MAAO,gBACP,MAAO,CACT,CAAC,EAEH,UAAWphC,KAASmhC,GAClBC,GAAW,KAAK,CACd,MAAAphC,EACA,MAAOmhC,GAAYnhC,CAAK,CAC1B,CAAC,EAEH,OAAOohC,EACT,EAEA,uBAAoB,IAAM,CACxB,KAAK,gBAAkB,IAAI,GAC7B,EAEA,sBAAmB,CAAC7lB,EAAYzC,EAA2BmF,IAAmB,CAC5E,MAAMxpB,GAAM,GAAG8mB,CAAE,IAAI0kB,EAAqBnnB,CAAS,CAAC,IAAI,KAAK,QAAQ,GACrE,KAAK,gBAAgB,IAAIrkB,GAAKwpB,CAAM,CACtC,EAEA,yBAAsB,CAAC1C,EAAYzC,IAA8B,CAC/D,MAAMrkB,EAAM,GAAG8mB,CAAE,IAAI0kB,EAAqBnnB,CAAS,CAAC,IAAI,KAAK,QAAQ,GACrE,OAAO,KAAK,gBAAgB,IAAIrkB,CAAG,CACrC,EAvNE,KAAK,SAAWif,EAEhB,IAAI2tB,GACA3tB,IAAa,WACf2tB,GAAa5mC,EAAM,WAAW,SAC9B,KAAK,WAAaA,EAAM,WAAW,SAAWA,EAAM,WAAW,KAAK,aAEpE4mC,GACE,OAAO5mC,EAAM,WAAW,UAAU,UAAa,UAAYA,EAAM,WAAW,UAAU,SAAS,SAAS,KAAK,EACzGA,EAAM,WAAW,SAAW,WAAWA,EAAM,WAAW,UAAU,QAAQ,EAC1E,SAASA,EAAM,WAAW,UAAU,SAAU,EAAE,EACtD,KAAK,WAAa4mC,GAAa5mC,EAAM,WAAW,UAAU,YAG5D,KAAK,SAAWA,EAAM,QAAQ,SAC9B,KAAK,cAAgB,KAAK,SAAW,IACrC,KAAK,gBAAkB,IAAI,IAC3B,KAAK,aAAe,IAAI,IAExB,MAAM0lC,EAAO,GAAGkB,EAAU,MAAM5mC,EAAM,WAAW,mBAAmB,GAC9D2lC,EAAgB3lC,EAAM,WAAW,KAAK,cAE5C,KAAK,mBAAmB0lC,EAAMC,CAAa,EAC3C,KAAK,sBAAsBD,EAAMC,CAAa,EAC9C,KAAK,yBAAyB,CAChC,CA+LF,CAYO,SAASkB,EACdtR,EACApc,EACAkF,EACA9c,GACA,CAAE,YAAAsZ,EAAa,kBAAA6C,EAAmB,eAAAC,EAAgB,eAAAvZ,EAAgB,YAAAoW,EAAa,SAAAN,GAAU,KAAA4sB,CAAK,EAC9FpoC,GACA,CACA,GAAI,CAAC2f,EACH,MAAO,GAET,MAAM0oB,GAAMxR,EAAe,YAAY,EAAI6P,EACrC4B,GACJnsB,IAAgB,UAAY1B,EAAKza,EAAK,GAAK8b,EAAY,UAAWpjB,GAAQA,EAAI,MAAQ+hB,EAAKza,EAAK,EAAE,GAAG,GAAK,EACtG,OAAO,aAAe,KAA0B,KAAOqoC,GAAM,EAC7D,EAEN,GAAI,CAACD,GAAQ,CAAC3tB,EAAKza,EAAK,EACtB,OAAO62B,EAAe,cAAc,EAAIA,EAAe,iBAAiB,EAAIyR,GAI9E,GADA7tB,EAAKza,EAAK,EAAE,qBAAqB6C,GAAiB8c,CAAS,EACvDlF,EAAKza,EAAK,EAAE,UACd,OAAQ62B,EAAe,uBAAuB,EAAI,GAAKA,EAAe,cAAc,EAAIyR,GAG1F,MAAMC,EAAa1R,EAAe,oBAAoBpc,EAAKza,EAAK,EAAE,IAAK2f,CAAS,EAChF,GAAI4oB,EACF,OAAOA,EAGT,IAAIC,EAAgB,GACpB,MAAMC,EAAW5R,EAAe,YAAY,EAAI,GAChD,IAAI6R,EAAe,EACfhjC,IACFgjC,GAAgB7R,EAAe,YAAY,EAAI,IAAM4R,GAEnDzpB,IACF0pB,GAAgB7R,EAAe,YAAY,EAAI,EAAI4R,GAEjDxpB,IACFypB,GAAgB7R,EAAe,YAAY,EAAI,EAAI4R,GAEjDjtB,KACFktB,GAAgBL,GAChBG,GAAiB/tB,EAAKza,EAAK,EAAE,YAG3Bya,EAAKza,EAAK,EAAE,cAAgB,CAACooC,KAC/BM,GAAgBL,GAChBG,GAAiB/tB,EAAKza,EAAK,EAAE,cAAgB,IAE/C,UAAW6G,KAAShE,GAClB2lC,EAAgB/tB,EAAKza,EAAK,EAAE,uBAAuB6G,EAAO,EAAI,EAAI2hC,EAE/D3lC,GAAgB,SACnB2lC,GAAiB,WAAgB/tB,EAAKza,EAAK,EAAE,IAAI,GAGnD,KAAM,CAAE,OAAA8kB,CAAO,EAAI+R,EAAe,kBAAkB2R,EAAe1B,EAAqBnnB,CAAS,EAAG+oB,CAAY,EAEhH,OAAOjuB,EAAKza,EAAK,EAAE,YAAc,GAC7B8kB,EAAS+R,EAAe,cAAc,EAAIyR,GAC1CxjB,EAASwjB,EACf,CAOO,SAASK,GACd9R,EACAvtB,EACAs/B,EACAlR,GACe,CACXA,KAAc,QAAakR,IAC7BA,GAAoB/R,EAAe,cAAc,GAEnD,MAAMgS,EAAgBv/B,EAAQ,cAC1B,MAAM,KAAKA,EAAQ,cAAc,QAAQ,EAAE,OAAQA,IACjDA,GAAQ,UAAU,SAAS,yBAAyB,CACtD,EACA,OACEg/B,EAAgBO,GAAe,OAASA,EAAc,CAAC,EAAE,aAAe,EAG9E,IAAIC,EAAiBx/B,EAAQ,aAAeg/B,EAC5C,MAAMxjB,EAAS8jB,GAAoBt/B,EAAQ,aAC3C,GAAIw/B,EAAiBhkB,EACnB,OAAO4S,KAAc,OAAYoR,EAAiBjS,EAAe,cAAc,EAAIiS,EAIrF,MAAMznB,EAAQ/X,EAAQ,SAAS,CAAC,EAEhC,OADAw/B,EAAiBznB,EAAM,aAAeinB,EAClCjnB,aAAiB,gBAAkBynB,EAAiBhkB,EAC/C4S,KAAc,OAAYoR,EAAiBjS,EAAe,cAAc,EAAIiS,EAI9E,IACT,CAEA,MAAMC,EAAuB,GACvBC,EAAiBC,GAAkB,EAElC,SAASnC,EAAqBnnB,EAA2B,CAC9D,OAAOA,EAAU,YAAcqpB,EAAiBD,CAClD,CAEO,SAASE,IAAoB,CAClC,MAAMC,EAAY,SAAS,cAAc,KAAK,EAE9CA,EAAU,MAAM,MAAQ,QACxBA,EAAU,MAAM,OAAS,QACzBA,EAAU,MAAM,SAAW,SAC3BA,EAAU,MAAM,SAAW,WAC3BA,EAAU,MAAM,IAAM,UAEtB,SAAS,KAAK,YAAYA,CAAS,EACnC,MAAMvqB,EAAQuqB,EAAU,YAAcA,EAAU,YAChD,gBAAS,KAAK,YAAYA,CAAS,EAE5BvqB,CACT,CAMO,MAAMwqB,UAA0B,GAA8C,CACnF,MAAO,CAAP,KAAO,KAAO,uBAChB,C,8QCxXO,MAAMC,EAAwB,aACnC,CACE,CACE,cAAAC,EACA,SAAA3O,EACA,MAAAluB,EACA,QAAA7H,EACA,UAAW2kC,EACX,KAAMC,EACN,GAAGC,CACL,EACAliB,IACG,CACH,MAAM3uB,KAAS,MAAW0I,EAAWq5B,CAAQ,EAE7C,SACE,OAAC,OAAI,UAAW,GAAG/hC,EAAO,SAAS,IAAI0wC,EAAgB1wC,EAAO,cAAgB,EAAE,GAC9E,oBAAC,SAAM,UAAWA,EAAO,MACvB,oBAAC,QAAK,UAAWA,EAAO,UAAY,SAAA6T,GAAS7H,CAAA,CAAQ,KACrD,OAAC,QAAK,UAAWhM,EAAO,cACtB,mBAACgL,EAAA,GACC,KAAM4lC,EACN,QAAA5kC,EACA,UAAW2kC,EACX,IAAAhiB,EACC,GAAGkiB,CAAA,CACN,EACF,GACF,EACF,CAEJ,CACF,EAcaC,EAA8B,aACzC,CACE,CACE,cAAAJ,EACA,SAAA3O,EACA,MAAAluB,EACA,QAAA7H,EACA,UAAW2kC,EACX,KAAMC,EACN,SAAAG,EACA,SAAAplC,EACA,cAAAqlC,EACA,gBAAAC,EACA,GAAGJ,CACL,EACAliB,IACG,CACH,MAAM3uB,KAAS,MAAW0I,EAAWq5B,CAAQ,EAE7C,SACE,OAAC,OAAI,UAAW/hC,EAAO,UACrB,oBAAC,SAAM,UAAWA,EAAO,MACvB,oBAAC,QAAK,UAAWA,EAAO,UAAY,SAAA6T,GAAS7H,CAAA,CAAQ,KACrD,OAAC,QACC,mBAACklC,GAAA,EAAQ,CAAC,QAASH,EAAU,UAAU,WACrC,mBAAC,OAAI,UAAW/wC,EAAO,cACrB,mBAAC0L,EAAA,EAAO,CAAC,QAASM,EAChB,oBAAC,UACC,eAAcL,EACd,aAAYslC,EACZ,UAAW,GAAGjxC,EAAO,mBAAmB,IAAI2L,EAAW3L,EAAO,oBAAsBA,EAAO,aAAa,GACxG,KAAK,SAEL,oBAAC+jC,GAAA,GACE,GAAG8M,EACJ,IAAAliB,EACA,KAAMiiB,EACN,KAAK,KACL,UAAW5wC,EAAO,kBACpB,EACC2L,MAAY,OAAC,QAAK,UAAW3L,EAAO,iBAAmB,SAAAgxC,CAAA,CAAc,GACxE,EACF,EACF,EACF,EACF,GACF,EACF,CAEJ,CACF,EAEAF,EAA4B,YAAc,8BAC1C,MAAMpoC,EAAY,CAACC,EAAsBo5B,KAEhC,CACL,oBAAkB,OAAI,CACpB,MAAOp5B,EAAM,OAAO,QAAQ,KAC5B,SAAU,GACV,SAAU,WACV,OAAQ,GACR,MAAO,EACP,WAAY,OACZ,gBAAiBA,EAAM,OAAO,WAAW,QACzC,YAAa,CACf,CAAC,EACD,qBAAmB,OAAI,CACrB,cAAe,UACjB,CAAC,EACD,uBAAqB,OAAI,CACvB,SAAU,WACV,OAAQ,EACR,OAAQ,EACR,UAAW,OACX,OAAQ,OACR,QAAS,OACT,WAAY,cACZ,eAAgB,SAChB,WAAY,SACZ,QAAS,EACT,SAAU,UACV,MAAO,MACT,CAAC,EACD,uBAAqB,OAAI,CACvB,OAAQ,EACR,MAAOA,EAAM,OAAO,KAAK,UACzB,OAAQA,EAAM,QAAQ,CAAC,EACvB,UAAW,CACT,WAAY,CACV,gBAAiBA,EAAM,OAAO,OAAO,MACrC,QAAS,CACX,CACF,EACA,WAAY,CACV,OAAQ,GACR,SAAU,WACV,QAAS,EACT,MAAO,OACP,OAAQ,OACR,aAAcA,EAAM,MAAM,OAAO,QACjC,QAAS,KACT,CAACA,EAAM,YAAY,aAAa,gBAAiB,QAAQ,CAAC,EAAG,CAC3D,mBAAoB,OACpB,yBAA0B,+BAC1B,mBAAoB,SACtB,CACF,EACA,UAAW,CACT,QAAS,QACT,QAAS,MACT,SAAU,WACV,OAAQ,EACR,aAAcA,EAAM,MAAM,OAAO,QACjC,OAAQA,EAAM,QAAQ,EAAE,EACxB,gBAAiBA,EAAM,OAAO,UAAU,gBACxC,MAAOA,EAAM,QAAQ,IAAI,EACzB,QAAS,CACX,CACF,CAAC,EACD,iBAAe,OAAI,CACjB,OAAQ,EACR,MAAOA,EAAM,OAAO,KAAK,UACzB,OAAQA,EAAM,QAAQ,CAAC,CACzB,CAAC,EACD,iBAAe,OAAI,CACjB,UAAW,OACX,aAAcA,EAAM,QAAQ,CAAC,CAC/B,CAAC,EACD,aAAW,OAAI,CACb,QAASo5B,EAAW,QAAU,MAChC,CAAC,EACD,iBAAe,OAAI,CACjB,QAAS,OACT,WAAY,SACZ,OAAQ,MACV,CAAC,EACD,aAAW,OAAI,CACb,SAAUp5B,EAAM,WAAW,QAAQ,EAAE,EACrC,OAAQA,EAAM,QAAQ,CAAC,EACvB,MAAO,MACT,CAAC,EACD,SAAO,OAAI,CACT,QAAS,OACT,eAAgBo5B,EAAW,gBAAkB,SAC7C,YAAaA,EAAW,QAAU,CACpC,CAAC,CACH,GAGF0O,EAAsB,YAAc,wB,0BClLpC,MAAMU,GAAgB,CACpB,KAAkB,KAClB,KAAkB,MAClB,KAAkB,QAClB,KAAkB,SACpB,EAEMC,EAA4B,CAChC,KAAS,KACT,KAAS,MACT,KAAS,MACT,KAAS,QACT,KAAS,MACT,KAAS,SACT,KAAS,OACX,EAEahV,GAAkB,CAAC,CAAE,SAAAH,EAAU,UAAAoV,EAAYD,EAAe,kBAAApV,EAAoB,MAAO,IAAa,CAC7G,KAAM,CACJ,IAAAryB,EACA,iBAAA2a,EACA,cAAA5C,EACA,aAAA6D,EACA,aAAA5D,EACA,SAAAC,EACA,YAAAiD,EACA,oBAAA0B,EACA,qBAAAhF,EACA,aAAAqC,EACA,oBAAAW,GACA,iBAAAG,EACA,gBAAAI,EACA,YAAAH,EACA,eAAAC,EACA,gBAAAO,EACA,YAAAH,EACA,oBAAAE,EACA,aAAAG,EACA,sBAAAD,GACA,kBAAAE,GACA,SAAAzC,GACA,iBAAAC,EACA,UAAAjU,EACA,mBAAAhP,EACA,eAAAsK,CACF,KAAI,MAAkB,EAChB,CAAE,WAAAmnC,GAAY,cAAAC,GAAe,WAAAC,EAAW,KAAI,MAAwB,EAEpExxC,MAAS,MAAW,EAAWskB,CAAgB,EAE/CmtB,MAAqB,eAAY,IAAM,IAC3C,OAAkB,2CAA2C,EAC7DxV,EAAS,QACP,IAAI,KAAkB,CACpB,SAAU,KACZ,CAAC,CACH,CACF,EAAG,CAACA,CAAQ,CAAC,EAEPyV,MAAwB,eAAY,IAAM,IAC9C,OAAkB,8CAA8C,EAChEzV,EAAS,QACP,IAAI,KAAkB,CACpB,SAAU,QACZ,CAAC,CACH,CACF,EAAG,CAACA,CAAQ,CAAC,EAEP0V,MAAwB,eAAY,IAAM,IAC9C,OAAkB,gDAAgD,EAClEptB,GAAoB,CAACD,CAAgB,EACrC1H,EAAA,EAAM,IAAI,GAAG2E,CAAoB,oBAAqB,CAAC+C,CAAgB,CACzE,EAAG,CAACA,EAAkB/C,EAAsBgD,EAAmB,CAAC,EAE1DqtB,MAAqB,eAAY,IAAM,IAC3C,OAAkB,6CAA6C,EAC/DhtB,EAAe,CAACC,CAAW,CAC7B,EAAG,CAACA,EAAaD,CAAc,CAAC,EAE1BitB,MAAqB,eACxBxS,GAAqB,IACpB,OAAkB,uCAAwC,CACxD,MAAAA,CACF,CAAC,EACGA,IAAU,OACZva,EAAgB,CAAC,CAAC,EACRnD,EAAa,SAAS0d,CAAK,EAGrCva,EAAgBnD,EAAa,OAAQmwB,GAAgBA,IAAgBzS,CAAK,CAAC,EAF3Eva,EAAgB,CAAC,GAAGnD,EAAc0d,CAAK,CAAC,CAI5C,EACA,CAAC1d,EAAcmD,CAAe,CAChC,EAEMitB,MAAkB,eAAY,IAAM,CACxC,MAAMC,EAAUpwB,IAAa,UAAY,QAAU,aACnD,OAAkB,2CAA4C,CAC5D,KAAMowB,CACR,CAAC,EACDrtB,EAAYqtB,CAAO,CACrB,EAAG,CAACpwB,EAAU+C,CAAW,CAAC,EAEpBstB,MAAwB,eAAY,IAAM,IAC9C,OAAkB,2CAA4C,CAC5D,UAAW,CAACpvB,EACd,CAAC,EACDmC,EAAY,CAACnC,EAAQ,CACvB,EAAG,CAACmC,EAAanC,EAAQ,CAAC,EAEpBqvB,MAA0B,eAAY,IAAM,IAChD,OAAkB,oDAAqD,CACrE,mBAAoBpvB,CACtB,CAAC,EACDoC,EAAoB,CAACpC,CAAgB,CACvC,EAAG,CAACoC,EAAqBpC,CAAgB,CAAC,EAEpCqvB,MAAmB,eAAY,IAAM,IACzC,OAAkB,4CAA6C,CAC7D,MAAOtjC,IAAc,KAAc,UAAY,KAAc,WAAa,KAAc,SAC1F,CAAC,EACDwW,EAAaxW,IAAc,KAAc,UAAY,KAAc,WAAa,KAAc,SAAS,CACzG,EAAG,CAACwW,EAAcxW,CAAS,CAAC,EAEtBujC,MAAyB,eAAY,IAAM,IAC/C,OAAkB,+CAAgD,CAChE,MAAO,CAACxuB,CACV,CAAC,EACDuB,EAAgB,CAACvB,CAAY,CAC/B,EAAG,CAACA,EAAcuB,CAAe,CAAC,EAE5BktB,MAA6B,eAAY,IAAM,IACnD,OAAkB,wCAAyC,CACzD,MAAO,CAACxyC,CACV,CAAC,EACDulB,GAAsB,CAACvlB,CAAkB,CAC3C,EAAG,CAACulB,GAAuBvlB,CAAkB,CAAC,EAExCyyC,MAAwB,eAC3BjnC,GAAkB,CACjBA,EAAE,eAAe,KACjB,OAAkB,sCAAuC,CACvD,MAAO,CAAClB,CACV,CAAC,EACDmb,GAAkB,CAACnb,CAAc,CACnC,EACA,CAACmb,GAAmBnb,CAAc,CACpC,EAEMooC,MAAoB,WACxB,OACE,OAACC,EAAA,EAAI,CACF,SAAArB,GAAc,IAAK7E,MAClB,OAACkG,EAAA,EAAK,KAAL,CAEC,UAAW9wB,IAAkB4qB,EAAStsC,GAAO,eAAiB,OAC9D,YAAa,KAAqBssC,CAAM,EACxC,SAAO,cAAWA,CAAM,EACxB,QAAS,IAAM,CACb5nB,EAAiB4nB,CAAM,KACvB,OAAkB,+CAAgD,CAChE,OAAAA,CACF,CAAC,CACH,GATKA,CAUP,CACD,EACH,EAEF,CAAC5qB,EAAegD,EAAkB1kB,GAAO,cAAc,CACzD,EAEMyyC,MAAmB,WACvB,OACE,QAACD,EAAA,EAAI,CACH,oBAACA,EAAA,EAAK,KAAL,CAEC,UAAW7wB,EAAa,SAAW,EAAI3hB,GAAO,eAAiB,OAC/D,SAAO,KAAE,uCAAwC,YAAY,EAC7D,QAAS,IAAM6xC,GAAmB,GAH7B,KAIP,EACCR,EAAU,IAAKhS,MACd,OAACmT,EAAA,EAAK,KAAL,CAEC,UAAW7wB,EAAa,SAAS0d,CAAK,EAAIr/B,GAAO,eAAiB,OAClE,SAAO,cAAWq/B,CAAK,EACvB,QAAS,IAAMwS,GAAmBxS,CAAK,GAHlCA,CAIP,CACD,GACH,EAEF,CAAC1d,EAAc0vB,EAAWQ,GAAoB7xC,GAAO,cAAc,CACrE,EAEM0yC,MAAe,WACnB,OACE,QAACF,EAAA,EAAI,CACH,oBAACA,EAAA,EAAK,KAAL,CACC,SAAO,KAAE,uCAAwC,KAAK,EACtD,QAAS,IAAM,CACbjtB,EAAa,IAAe,IAAI,KAChC,OAAkB,yCAA0C,CAC1D,OAAQ,IAAe,IACzB,CAAC,CACH,EACF,KACA,OAACitB,EAAA,EAAK,KAAL,CACC,SAAO,KAAE,wCAAyC,MAAM,EACxD,QAAS,IAAM,CACbjtB,EAAa,IAAe,IAAI,KAChC,OAAkB,yCAA0C,CAC1D,OAAQ,IAAe,IACzB,CAAC,CACH,EACF,KACA,OAACitB,EAAA,EAAK,KAAL,CACC,SAAO,KAAE,uCAAwC,KAAK,EACtD,QAAS,IAAM,CACbjtB,EAAa,IAAe,GAAG,KAC/B,OAAkB,yCAA0C,CAC1D,OAAQ,IAAe,GACzB,CAAC,CACH,EACF,GACF,EAEF,CAACA,CAAY,CACf,EAEMotB,GAAchpC,IAAQ,KAAQ,WAAaA,IAAQ,KAAQ,aAAeA,IAAQ,KAAQ,YAEhG,SACE,QAAC,OAAI,UAAW3J,GAAO,aACrB,iCACE,oBAACywC,EAAA,CACC,SAAUnsB,EACV,KAAK,mBACL,aAAW,MAAGtkB,GAAO,cAAeA,GAAO,sBAAsB,EACjE,QAAQ,YACR,QAAS2xC,GACT,MACErtB,KACI,KAAE,oCAAqC,UAAU,KACjD,KAAE,kCAAmC,WAAW,EAEtD,QACEA,KAAmB,KAAE,8BAA+B,UAAU,KAAI,KAAE,4BAA6B,QAAQ,EAE3G,KAAK,KACP,EACC0X,IAAsB,WACrB,OAACyU,EAAA,CACC,SAAUnsB,EACV,KAAK,aACL,UAAWtkB,GAAO,cAClB,QAAQ,YACR,QAAS0xC,GACT,WAAS,KAAE,mCAAoC,kBAAkB,EACjE,KAAK,KACP,GAEJ,EACEiB,MAoNA,oBACG,UAAAryC,EAAA,EAAO,eAAe,iBACrB,OAACmwC,EAAA,CACC,SAAUnsB,EACV,KAAM,SACN,UAAWitB,GAAgBvxC,GAAO,oBAAsBA,GAAO,cAC/D,QAASuxC,GAAgBD,GAAaE,GACtC,MACED,MACI,KAAE,wCAAyC,cAAc,KACzD,KAAE,wCAAyC,aAAa,EAE9D,QACEA,MACI,KAAE,iCAAkC,cAAc,KAClD,KAAE,iCAAkC,uBAAuB,EAEjE,KAAK,KACP,KAEF,OAACL,GAAA,EAAQ,CAAC,QAASuB,GAAkB,UAAU,WAC7C,mBAAChC,EAAA,CACC,SAAUnsB,EACV,KAAM,UACN,UAAW3C,GAAgBA,EAAa,OAAS,EAAI3hB,GAAO,oBAAsBA,GAAO,cACzF,SAAO,KAAE,mCAAoC,eAAe,EAC5D,WAAS,KAAE,0CAA2C,6BAA6B,EACnF,KAAK,KACP,EACF,EACCg8B,IAAsB,QAAUzV,MAC/B,OAACkqB,EAAA,CACC,SAAUnsB,EACV,KAAK,QACL,eAAcO,EACd,UAAWA,EAAc7kB,GAAO,oBAAsBA,GAAO,cAC7D,QAAS4xC,GACT,MACE/sB,KACI,KAAE,qCAAsC,iBAAiB,KACzD,KAAE,2CAA4C,iBAAiB,EAErE,QACEA,KACI,KAAE,qCAAsC,iBAAiB,KACzD,KACE,qCACA,gEACF,EAEN,KAAK,KACP,GAEJ,KAxQA,oBACE,oBAAC4rB,EAAA,CACC,SAAUnsB,EACV,KAAMzV,IAAc,KAAc,WAAa,iBAAmB,mBAClE,UAAW7O,GAAO,cAClB,QAASmyC,GACT,MACEtjC,IAAc,KAAc,cACxB,KAAE,yCAA0C,mBAAmB,KAC/D,KAAE,yCAA0C,mBAAmB,EAErE,QACEA,IAAc,KAAc,cACxB,KAAE,kCAAmC,0DAA0D,KAC/F,KAAE,kCAAmC,0DAA0D,EAErG,KAAK,KACP,EACCmtB,IAAsB,WACrB,oBACE,oBAAC,OAAI,UAAWh8B,GAAO,QAAS,EAC/BM,EAAA,EAAO,eAAe,iBACrB,OAACmwC,EAAA,CACC,SAAUnsB,EACV,KAAM,SACN,UAAWitB,GAAgBvxC,GAAO,oBAAsBA,GAAO,cAC/D,QAASuxC,GAAgBD,GAAaE,GACtC,MACED,MACI,KAAE,wCAAyC,cAAc,KACzD,KAAE,wCAAyC,aAAa,EAE9D,QACEA,MACI,KAAE,iCAAkC,cAAc,KAClD,KAAE,iCAAkC,uBAAuB,EAEjE,KAAK,KACP,KAEF,OAACL,GAAA,EAAQ,CAAC,QAASqB,GAAmB,UAAU,WAC9C,mBAAC9B,EAAA,CACC,SAAUnsB,EACV,KAAM,SACN,UACE5C,IAAkB,KAAkB,KAAO1hB,GAAO,oBAAsBA,GAAO,cAEjF,WAAS,KAAE,mCAAoC,eAAe,EAC9D,KAAK,KACP,EACF,KACA,OAACkxC,GAAA,EAAQ,CAAC,QAASuB,GAAkB,UAAU,WAC7C,mBAAChC,EAAA,CACC,SAAUnsB,EACV,KAAM,UACN,UACE3C,GAAgBA,EAAa,OAAS,EAAI3hB,GAAO,oBAAsBA,GAAO,cAEhF,SAAO,KAAE,mCAAoC,eAAe,EAC5D,WAAS,KAAE,0CAA2C,6BAA6B,EACnF,KAAK,KACP,EACF,KACA,OAAC,OAAI,UAAWA,GAAO,QAAS,EAC/BM,EAAA,EAAO,eAAe,gBACrB,OAACsyC,GAAA,CAA0B,SAAUtuB,CAAA,CAAkB,KAEvD,OAACmsB,EAAA,CACC,SAAUnsB,EACV,KAAK,aACL,eAAczB,GACd,UAAWA,GAAW7iB,GAAO,oBAAsBA,GAAO,cAC1D,QAASiyC,GACT,QACEpvB,MACI,KAAE,qCAAsC,iBAAiB,KACzD,KAAE,qCAAsC,iBAAiB,EAE/D,KAAK,KACP,EAGDC,IAAqB,QAAanZ,IAAQ,KAAQ,YACjD,OAAC8mC,EAAA,CACC,SAAUnsB,EACV,KAAK,UACL,eAAcxB,EACd,UAAWA,EAAmB9iB,GAAO,oBAAsBA,GAAO,cAClE,QAASkyC,GACT,QACEpvB,KACI,KAAE,wCAAyC,oBAAoB,KAC/D,KAAE,wCAAyC,oBAAoB,EAErE,KAAK,KACP,EAEDxiB,EAAA,EAAO,eAAe,gBACrB,OAACuyC,GAAA,CAAqB,SAAUvuB,CAAA,CAAkB,KAElD,OAACmsB,EAAA,CACC,SAAUnsB,EACV,KAAK,YACL,UAAWna,EAAiBnK,GAAO,oBAAsBA,GAAO,cAChE,eAAcmK,EACd,QAASmoC,GACT,QACEnoC,KACI,KAAE,kCAAmC,cAAc,KACnD,KAAE,gCAAiC,YAAY,EAErD,KAAK,KACP,EAEDyZ,IAAiB,QAAa,CAACtjB,EAAA,EAAO,eAAe,iBACpD,OAACmwC,EAAA,CACC,SAAUnsB,EACV,KAAK,iBACL,eAAcV,EACd,UAAWA,EAAe5jB,GAAO,oBAAsBA,GAAO,cAC9D,QAASoyC,GACT,QACExuB,KACI,KAAE,2CAA4C,oBAAoB,KAClE,KAAE,mCAAoC,kBAAkB,EAE9D,KAAK,KACP,EAED/jB,IAAuB,WACtB,OAAC4wC,EAAA,CACC,SAAUnsB,EACV,KAAK,iBACL,UAAWzkB,EAAqBG,GAAO,oBAAsBA,GAAO,cACpE,eAAcH,EACd,QAASwyC,GACT,MACExyC,KACI,KAAE,gDAAiD,gBAAgB,KACnE,KAAE,+CAAgD,YAAY,EAEpE,QACEA,KACI,KAAE,kDAAmD,sBAAsB,KAC3E,KAAE,iDAAkD,qBAAqB,EAE/E,KAAK,KACP,EAEDS,EAAA,EAAO,eAAe,iBACrB,OAACmwC,EAAA,CACC,SAAUnsB,EACV,KAAK,cACL,UAAW1C,IAAa,QAAU5hB,GAAO,oBAAsBA,GAAO,cACtE,eAAc,EAAQ4hB,EACtB,QAASmwB,GACT,MACEnwB,IAAa,aACT,KAAE,uCAAwC,YAAY,KACtD,KAAE,uCAAwC,YAAY,EAE5D,QACEA,IAAa,aACT,KAAE,gCAAiC,gBAAgB,KACnD,KAAE,gCAAiC,gBAAgB,EAEzD,KAAK,KACP,EAED2E,MACC,OAACkqB,EAAA,CACC,SAAUnsB,EACV,KAAK,QACL,eAAcO,EACd,UAAWA,EAAc7kB,GAAO,oBAAsBA,GAAO,cAC7D,QAAS4xC,GACT,MACE/sB,KACI,KAAE,qCAAsC,iBAAiB,KACzD,KAAE,2CAA4C,iBAAiB,EAErE,QACEA,KACI,KAAE,qCAAsC,iBAAiB,KACzD,KACE,qCACA,gEACF,EAEN,KAAK,KACP,GAEJ,EAED,CAACvkB,EAAA,EAAO,4BACP,oBACE,oBAAC,OAAI,UAAWN,GAAO,QAAS,KAChC,OAACkxC,GAAA,EAAQ,CAAC,QAASwB,GAAc,UAAU,WACzC,mBAACjC,EAAA,CACC,SAAUnsB,EACV,KAAK,eACL,UAAWtkB,GAAO,cAClB,SAAO,KAAE,8BAA+B,eAAe,EACvD,WAAS,KAAE,sCAAuC,UAAU,EAC5D,KAAK,KACP,EACF,GACF,GAEJ,EAyDDg8B,IAAsB,WACrB,OAACyU,EAAA,CACC,cAAe,GACf,SAAUnsB,EACV,KAAK,WACL,cAAY,cACZ,UAAWtkB,GAAO,kBAClB,QAAQ,YACR,QAASyxC,GACT,WAAS,KAAE,gCAAiC,eAAe,EAC3D,KAAK,KACP,GAEJ,CAEJ,EAMMmB,GAA4B,CAAC,CAAE,SAAA7Q,CAAS,IAA4B,CACxE,MAAM/hC,KAAS,MAAW8yC,EAAqB/Q,CAAQ,EACjD,CAAE,uBAAA7b,EAAwB,YAAAlB,EAAa,SAAAnC,EAAU,oBAAAE,CAAoB,KAAI,MAAkB,EAE3FgwB,KAAO,eAAY,IAAM,CAC7B/tB,EAAY,EAAK,KACjB,OAAkB,2CAA4C,CAC5D,UAAW,EACb,CAAC,CACH,EAAG,CAACA,CAAW,CAAC,EAEVguB,KAAS,eAAY,IAAM,CAC/BhuB,EAAY,EAAI,EAChBkB,EAAuB,IAAI,KAC3B,OAAkB,2CAA4C,CAC5D,UAAW,GACX,WAAY,IACd,CAAC,CACH,EAAG,CAAClB,EAAakB,CAAsB,CAAC,EAElC+sB,KAAS,eAAY,IAAM,CAC/BjuB,EAAY,EAAI,EAChBkB,EAAuB,IAAI,KAC3B,OAAkB,2CAA4C,CAC5D,UAAW,GACX,WAAY,IACd,CAAC,CACH,EAAG,CAAClB,EAAakB,CAAsB,CAAC,EAElCgtB,KAAgB,WACpB,OACE,QAACV,EAAA,EAAI,CACH,oBAACA,EAAA,EAAK,KAAL,CACC,SAAO,KAAE,oCAAqC,iBAAiB,EAC/D,UAAY3vB,EAAmC,OAAxB7iB,EAAO,eAC9B,QAAS+yC,CAAA,CACX,KACA,OAACP,EAAA,EAAK,KAAL,CACC,SAAO,KAAE,4CAA6C,6BAA6B,EACnF,UAAW3vB,GAAYE,IAAwB,KAAO/iB,EAAO,eAAiB,OAC9E,QAASgzC,CAAA,CACX,KACA,OAACR,EAAA,EAAK,KAAL,CACC,SAAO,KAAE,2CAA4C,4BAA4B,EACjF,UAAW3vB,GAAYE,IAAwB,KAAO/iB,EAAO,eAAiB,OAC9E,QAASizC,CAAA,CACX,GACF,EAEF,CAACF,EAAMC,EAAQC,EAAQpwB,EAAU7iB,EAAO,eAAgB+iB,CAAmB,CAC7E,EAEMowB,EAAatwB,EAEfE,IAAwB,QACtB,KAAE,wCAAyC,YAAY,KACvD,KAAE,wCAAyC,YAAY,KAHzD,KAAE,0CAA2C,iBAAiB,EAK5DiuB,EACJjuB,IAAwB,QACpB,KAAE,mCAAoC,IAAI,KAC1C,KAAE,mCAAoC,IAAI,EAEhD,SACE,OAAC+tB,EAAA,CACC,SAAA/O,EACA,KAAM,aACN,SAAUlf,EACV,SAAUqwB,EACV,WAAS,KAAE,uCAAwC,sBAAsB,EACzE,MAAOC,EACP,mBAAiB,KAAE,qCAAsC,gBAAgB,EACzE,cAAAnC,CAAA,CACF,CAEJ,EACM6B,GAAuB,CAAC,CAAE,SAAA9Q,CAAS,IAA4B,CACnE,MAAM/hC,KAAS,MAAW8yC,EAAqB/Q,CAAQ,EACjD,CAAE,aAAAne,EAAc,gBAAAuB,EAAiB,kBAAAG,EAAmB,eAAAnb,CAAe,KAAI,MAAkB,EAYzFipC,KAAU,eAAY,IAAM,CAChC9tB,EAAkB,EAAK,EACvBH,EAAgB,EAAK,KACrB,OAAkB,sCAAuC,CACvD,MAAO,GACP,SAAU,EACZ,CAAC,CACH,EAAG,CAACA,EAAiBG,CAAiB,CAAC,EAEjCmqB,KAAO,eAAY,IAAM,CAC7BnqB,EAAkB,EAAI,EACtBH,EAAgB,EAAK,KACrB,OAAkB,sCAAuC,CACvD,MAAO,GACP,SAAU,EACZ,CAAC,CACH,EAAG,CAACA,EAAiBG,CAAiB,CAAC,EAEjC+tB,KAAkB,eAAY,IAAM,CACxC/tB,EAAkB,EAAI,EACtBH,EAAgB,EAAI,KACpB,OAAkB,sCAAuC,CACvD,MAAO,GACP,SAAU,EACZ,CAAC,CACH,EAAG,CAACA,EAAiBG,CAAiB,CAAC,EAEjCguB,KAAe,WACnB,OACE,QAACd,EAAA,EAAI,CACH,oBAACA,EAAA,EAAK,KAAL,CACC,SAAO,KAAE,wCAAyC,uBAAuB,EACzE,UAAYroC,EAAyC,OAAxBnK,EAAO,eACpC,QAASozC,CAAA,CACX,KACA,OAACZ,EAAA,EAAK,KAAL,CACC,SAAO,KAAE,0CAA2C,sBAAsB,EAC1E,UAAWroC,GAAkB,CAACyZ,EAAe5jB,EAAO,eAAiB,OACrE,QAASyvC,CAAA,CACX,KACA,OAAC+C,EAAA,EAAK,KAAL,CACC,SAAO,KAAE,mDAAoD,wCAAwC,EACrG,UAAWroC,GAAkByZ,EAAe5jB,EAAO,eAAiB,OACpE,QAASqzC,CAAA,CACX,GACF,EAEF,CAACD,EAASxvB,EAAc5jB,EAAO,eAAgByvC,EAAM4D,EAAiBlpC,CAAc,CACtF,EAEMopC,EAAiBppC,EAEnBA,GAAkB,CAACyZ,KACjB,KAAE,8CAA+C,YAAY,KAC7D,KAAE,8CAA+C,WAAW,KAH9D,KAAE,8CAA+C,eAAe,EAK9D5X,KAAU,KAAE,2CAA4C,eAAe,EAE7E,SACE,OAAC8kC,EAAA,CACC,SAAA/O,EACA,KAAM,YACN,SAAU53B,EACV,SAAUmpC,EACV,QAAAtnC,EACA,MAAOunC,EACP,gBAAiBvnC,EACjB,cAAe4X,EAAe,IAAM,GACtC,CAEJ,EAEMkvB,EAAsB,CAACnqC,EAAsBo5B,KAC1C,CACL,kBAAgB,OAAI,CAClB,WAAY,CACV,QAAS,KACT,SAAU,WACV,KAAM,EACN,IAAKp5B,EAAM,QAAQ,EAAG,EACtB,OAAQ,eAAeA,EAAM,QAAQ,CAAC,CAAC,IACvC,MAAO,MACP,gBAAiBA,EAAM,OAAO,QAAQ,IACxC,CACF,CAAC,CACH,GAGW6qC,EAAiB,GACjBC,EAA0B,IAEjC,EAAY,CAAC9qC,EAAsB2b,KAChC,CACL,gBAAc,OAAI,CAChB,UAAW,OACX,QAAS,OACT,KAAM,WACN,IAAK3b,EAAM,QAAQ,CAAC,EACpB,cAAe,SACf,eAAgB,aAChB,MAAO2b,EAAmBmvB,EAA0BD,EACpD,WAAY7qC,EAAM,QAAQ,GAAI,EAC9B,YAAaA,EAAM,QAAQ,CAAC,EAC5B,WAAY,aAAaA,EAAM,OAAO,OAAO,MAAM,GACnD,SAAUA,EAAM,QAAQ,CAAC,EACzB,gBAAiBA,EAAM,OAAO,WAAW,OAC3C,CAAC,EACD,qBAAmB,OAAI,CACrB,OAAQ,EACR,UAAW,OACX,MAAOA,EAAM,OAAO,KAAK,UACzB,OAAQA,EAAM,QAAQ,CAAC,CACzB,CAAC,EACD,0BAAwB,OAAI,CAC1B,UAAY2b,EAAsC,GAAnB,gBACjC,CAAC,EACD,iBAAe,OAAI,CACjB,OAAQ,EACR,MAAO3b,EAAM,OAAO,KAAK,UACzB,OAAQA,EAAM,QAAQ,CAAC,CACzB,CAAC,EACD,WAAS,OAAI,CACX,UAAW,aAAaA,EAAM,OAAO,OAAO,MAAM,GAClD,OAAQ,EACR,UAAWA,EAAM,QAAQ,IAAK,EAC9B,aAAcA,EAAM,QAAQ,KAAK,CACnC,CAAC,EACD,uBAAqB,OAAI,CACvB,OAAQ,EACR,MAAOA,EAAM,OAAO,KAAK,UACzB,OAAQA,EAAM,QAAQ,CAAC,EACvB,UAAW,CACT,QAAS,QACT,QAAS,MACT,SAAU,WACV,OAAQ,EACR,aAAcA,EAAM,MAAM,OAAO,QACjC,OAAQA,EAAM,QAAQ,EAAE,EACxB,gBAAiBA,EAAM,OAAO,UAAU,gBACxC,MAAOA,EAAM,QAAQ,IAAI,EACzB,QAAS,CACX,CACF,CAAC,EACD,kBAAgB,OAAI,CAClB,WAAY,CACV,QAAS,KACT,SAAU,WACV,KAAM,EACN,IAAKA,EAAM,QAAQ,EAAG,EACtB,OAAQ,eAAeA,EAAM,QAAQ,CAAC,CAAC,IACvC,MAAO,MACP,gBAAiBA,EAAM,OAAO,QAAQ,IACxC,CACF,CAAC,CACH,E,qDCvzBK,MAAM+qC,EAAwB,CAAC3L,EAAyBC,IAAyC,CACtG,MAAMrlC,EAAM,qBAAqBolC,CAAe,GAC5C,eAAe,QAAQplC,CAAG,IAG9B,eAAe,QAAQA,EAAK,GAAG,KAC/B,MAAkBolC,EAAiBC,CAAU,EAC/C,C,qJCCA,MAAM2L,GAAgB,CAAC,iBAAkB,QAAS,MAAO,UAAU,EAWtD3P,KAAY,QACvB,CAAC,CACC,OAAA32B,EACA,aAAAumC,EACA,WAAAC,EAAa,GACb,WAAAC,EACA,mBAAAC,GACA,WAAYC,EAAoB,EAClC,IAAa,CACX,KAAM,CAACC,EAAYC,CAAa,KAAI,YAA8BJ,EAAaE,EAAoB,MAAS,EACtGh0C,KAAS,MAAW0I,EAAS,EAC7ByrC,KAAY,WAChB,IACE,OAAO,KAAK9mC,CAAM,EACf,OAAQwG,GAAU,CAACA,EAAM,WAAW,GAAG,GAAK,CAAC8/B,GAAc,SAAS9/B,CAAK,GAAKxG,EAAOwG,CAAK,CAAC,EAC3F,IAAKA,GAAU,GAAGA,CAAK,IAAIxG,EAAOwG,CAAK,CAAC,EAAE,EAC/C,CAACxG,CAAM,CACT,EACM+mC,MAAgB,WACpB,IAAMD,EAAU,MAAM,EAAG,CAACF,GAAcH,EAAaA,EAAa,GAAQ,EAC1E,CAACK,EAAWF,EAAYH,CAAU,CACpC,EAEA,OAAIM,GAAc,SAAW,GAAKR,KAE9B,OAAC,QAAK,UAAW5zC,EAAO,WACtB,mBAAC,QAAK,UAAWA,EAAO,UAAY,SAAA4zC,CAAA,CAAa,EACnD,KAKF,QAAC,QAAK,UAAW5zC,EAAO,WACrB,UAAAo0C,GAAc,IAAK7hC,GACXshC,KACL,OAAC,IAAO,CAAC,QAASthC,EAA6B,UAAU,MACvD,mBAAC8hC,EAAA,CAAS,OAAAr0C,EAAiB,SAAAuS,CAAA,CAAW,GADLA,CAEnC,KAEA,OAAC8hC,EAAA,CAAS,OAAAr0C,EAAgB,QAASuS,EAChC,SAAAA,CAAA,EADiDA,CAEpD,CAEH,EACA6hC,GAAc,OAASD,EAAU,QAAU,CAACF,MAC3C,QAAC,MACC,KAAK,KACL,KAAK,UACL,QAAQ,YACR,UAAWj0C,EAAO,OAClB,gBAAY,KAAE,yBAA0B,eAAe,EACvD,QAAS,IAAM,CACbk0C,EAAc,EAAI,EAClBH,KAAqB,EAAI,CAC3B,EAEA,oBAAC,IAAI,CAAC,KAAK,OAAO,KAAK,IAAK,GAC3BI,EAAU,OAASC,GAAc,QACpC,EAEDH,IAAe,OACd,OAAC,MACC,KAAK,KACL,KAAK,UACL,QAAQ,YACR,UAAWj0C,EAAO,OAClB,gBAAY,KAAE,2BAA4B,iBAAiB,EAC3D,QAAS,IAAM,CACbk0C,EAAc,EAAK,EACnBH,KAAqB,EAAK,CAC5B,EAEA,mBAAC,IAAI,CAAC,KAAK,QAAQ,KAAK,IAAK,GAC/B,GAEJ,CAEJ,CACF,EACA/P,EAAU,YAAc,YAMjB,MAAMsQ,KAAgB,QAAK,CAAC,CAAE,OAAAjnC,CAAO,IAA2B,CACrE,MAAMrN,KAAS,MAAW0I,EAAS,EAEnC,SACE,OAAC,QAAK,UAAW1I,EAAO,WACrB,SAAAqN,EAAO,IAAKwG,MACX,OAACwgC,EAAA,CAAqB,OAAAr0C,EAAgB,QAAS6T,EAC5C,kBAAuBA,CAAK,GADhBA,CAEf,CACD,EACH,CAEJ,CAAC,EACDygC,EAAc,YAAc,gBAQ5B,MAAMD,KAAW,cAA2C,CAAC,CAAE,OAAAr0C,EAAQ,QAAAgM,EAAS,SAAAuC,CAAS,EAAkBogB,OAEvG,OAAC,QAAK,UAAW3uB,EAAO,UAAW,IAAA2uB,EACjC,mBAAC,QAAK,UAAW3uB,EAAO,eAAgB,MAAOgM,EAC5C,SAAAuC,CAAA,CACH,EACF,CAEH,EACD8lC,EAAS,YAAc,WAEvB,MAAM3rC,GAAaC,IACV,CACL,cAAY,OAAI,CACd,QAAS,cACT,SAAU,OACV,SAAUA,EAAM,WAAW,KAAK,GAChC,WAAY,QACd,CAAC,EACD,aAAW,OAAI,CACb,MAAO,aACP,QAAS,OACT,QAASA,EAAM,QAAQ,EAAG,GAAI,EAC9B,gBAAiBA,EAAM,OAAO,WAAW,UACzC,aAAcA,EAAM,MAAM,OAAO,QACjC,OAAQA,EAAM,QAAQ,KAAO,GAAK,EAAG,CAAC,EACtC,aAAc,WACd,WAAY,SACZ,SAAU,SACV,UAAWA,EAAM,QAAQ,CAAC,CAC5B,CAAC,EACD,kBAAgB,OAAI,CAClB,MAAO,oBACP,QAAS,eACT,SAAUA,EAAM,QAAQ,EAAE,EAC1B,aAAc,WACd,SAAU,QACZ,CAAC,EACD,UAAQ,OAAI,CACV,OAAQA,EAAM,QAAQ,IAAI,CAC5B,CAAC,CACH,E,0EC1JK,MAAM4rC,KAAuB,iBAAwC,CAC1E,WAAY,IAAM,CAAC,EACnB,WAAY,GACZ,aAAc,KACd,cAAe,GACf,gBAAiB,IAAM,CAAC,EACxB,UAAW,IAAM,CAAC,EAClB,WAAY,IAAM,CAAC,EACnB,iBAAkB,IAAM,CAAC,CAC3B,CAAC,EAEYC,EAA+B7xC,GACH,WAAW4xC,CAAoB,EAC1D5xC,CAAG,EAGJ8xC,EAA0B,OAC9B,cAAWF,CAAoB,EAG3BG,EAA+B,CAAC,CAAE,SAAAnmC,CAAS,IAA+B,CACrF,KAAM,CAAC+uB,EAAQoO,CAAS,KAAI,YAA6B,MAAS,EAC5D,CAAC6F,GAAeoD,CAAgB,KAAI,YAAS,EAAK,EAClD,CAACC,EAAcC,CAAe,KAAI,YAA0B,IAAI,EAChE,CAACC,GAAYC,CAAa,KAAI,YAAS,EAAK,EAE5CzD,KAAa,eAAY,IAAM,CACnCqD,EAAiB,EAAK,CACxB,EAAG,CAAC,CAAC,EAECnD,KAAa,eAAY,IAAM,CACnCmD,EAAiB,EAAI,CACvB,EAAG,CAAC,CAAC,EAECK,KAAmB,eAAY,IAAM,CACzCD,EAAeD,IAAe,CAACA,EAAU,CAC3C,EAAG,CAAC,CAAC,EAEL,SACE,OAACP,EAAqB,SAArB,CACC,MAAO,CACL,WAAAjD,EACA,WAAAwD,GACA,aAAAF,EACA,OAAAtX,EACA,cAAAiU,GACA,gBAAAsD,EACA,UAAAnJ,EACA,WAAA8F,EACA,iBAAAwD,CACF,EAEC,SAAAzmC,CAAA,CACH,CAEJ,C,6ICrEO,SAAS0mC,EAAct7B,EAAuB,CACnD,IAAInZ,EACJ,GAAI,CACFA,EAAS,KAAK,MAAMmZ,CAAI,CAC1B,MAAgB,CAAC,CAEjB,OAAO,OAAOnZ,GAAW,QAC3B,CAMA,MAAM00C,EAAgB,4DAEf,SAASC,EAAgBx7B,EAAuB,CACrD,OAAOu7B,EAAc,KAAKv7B,CAAI,CAChC,CAEO,SAASy7B,EAAgBz7B,EAAuB,CACrD,IAAInZ,EACJ,GAAI,CACF,OAAAA,EAAS,KAAK,MAAMmZ,CAAI,EACjBnZ,EAAO,eAAe,QAAQ,CACvC,MAAgB,CACd,MAAO,EACT,CACF,C,eCrBO,SAAS60C,EAAsBliC,EAA2B,CAE/D,OAD4BA,EAAM,OAAO,KAAM1F,IAAMA,GAAE,OAAS,QAAQ,GAAG,QAAU,CAAC,GACrE,KAAMJ,IAAWA,GAAO,YAAc,MAAS,CAClE,CAEO,SAASioC,GAAuBniC,EAA2B,CAEhE,OAD4BA,EAAM,OAAO,KAAM1F,IAAMA,GAAE,OAAS,QAAQ,GAAG,QAAU,CAAC,GACrE,KAAMJ,IAAWA,GAAO,QAAU,MAAS,CAC9D,CAEO,SAASkoC,EAA8BpiC,EAI5C,CACA,MAAMqiC,EAAYriC,EAAM,OAAO,KAAMjF,GAAUA,EAAM,OAAS,KAAU,MAAM,EAC9E,GAAIsnC,GAAa,KACf,MAAO,CAAE,QAAS,GAAO,UAAW,GAAO,QAAS,EAAM,EAG5D,MAAM9G,GAAqB8G,EAAU,OAErC,IAAIC,EAAU,GACVC,EAAY,GACZC,EAAU,GAEd,OAAAjH,GAAS,QAAS/0B,GAAS,CACrBs7B,EAAct7B,CAAI,IACpB87B,EAAU,GAEVE,EAAUP,EAAgBz7B,CAAI,GAE5Bw7B,EAAgBx7B,CAAI,IACtB+7B,EAAY,GAEhB,CAAC,EAEM,CAAE,UAAAA,EAAW,QAAAD,EAAS,QAAAE,CAAQ,CACvC,CAEO,SAASC,EAA8BziC,EAAkB1H,EAAkB,KAAU,QAAmB,CAC7G,MAAMoqC,GACJ1iC,GAAO,QAAQ,KAAMjF,GAAUA,EAAM,OAAS,QAAQ,GAAG,QAAU,CAAC,EAChE4nC,EACJ3iC,GAAO,QAAQ,KAAMjF,GAAUA,EAAM,OAAS,YAAY,GAAG,QAAU,CAAC,EAE1E,GAAI,CAAC2nC,IAAa,OAChB,MAAO,CAAC,EAIV,GAAI,CAACC,GAAgB,OAAQ,CAC3B,GAAIrqC,IAAS,KAAU,QAAS,CAC9B,KAAM,CAAE,KAAMsqC,CAAU,KAAI,MAAcF,EAAW,EACrD,OAAOE,CACT,CACA,MAAO,CAAC,CACV,CAGA,IAAIC,EAAY,IAAI,IACpB,QAAShzC,EAAI,EAAGA,EAAI6yC,GAAY,OAAQ7yC,IAAK,CAC3C,MAAMqK,EAASwoC,GAAY7yC,CAAC,EACtBizC,EAAaH,EAAe9yC,CAAC,EAE7BkzC,GAAe,OAAO,KAAK7oC,CAAM,EAAE,OAAQ1K,GAAQszC,EAAWtzC,CAAG,IAAM8I,CAAI,EACjFuqC,EAAY,IAAI,IAAI,CAAC,GAAGA,EAAW,GAAGE,EAAY,CAAC,CACrD,CAEA,OAAO,MAAM,KAAKF,CAAS,CAC7B,CAEO,SAASG,EAAoChjC,EAA4B,CAC9E,MAAM0iC,EACJ1iC,GAAO,QAAQ,KAAMjF,GAAUA,EAAM,OAAS,QAAQ,GAAG,QAAU,CAAC,EAEtE,OAAK2nC,GAAa,OAMW,OAAO,KAAKA,EAAY,CAAC,CAAC,EAAE,OAAQlzC,GAAQ,CACvE,MAAM1C,EAAQ41C,EAAY,CAAC,EAAElzC,CAAG,EAChC,OAAK1C,EAGE,CAAC,MAAM,OAAOA,CAAK,CAAC,MAAK,MAAkBA,CAAK,MAAK,MAAcA,CAAK,EAFtE,EAGX,CAAC,EAG2B,OAAQ4T,GAAUgiC,EAAY,MAAOO,GAAQA,EAAIviC,CAAK,CAAC,CAAC,EAd3E,CAAC,CAeZ,CAEO,SAASwiC,GAAkCljC,EAA2B,CAC3E,MAAMmjC,EAAanjC,EAAM,OAAO,KAAMjF,GAAUA,EAAM,OAAS,UAAYA,EAAM,OAAS,KAAU,KAAK,EACzG,OAAIooC,GAAc,KACT,GAGwCA,EAAW,OAC9C,KAAMziC,GAAUA,EAAM,SAAY,CAClD,CAEO,SAAS0iC,EAAmCpjC,EAAiC,CAClF,MAAMmjC,EAAanjC,EAAM,OAAO,KAAMjF,GAAUA,EAAM,OAAS,UAAYA,EAAM,OAAS,KAAU,KAAK,EACzG,GAAIooC,GAAc,KAChB,OAAO,KAKT,MAAMT,GAAgDS,EAAW,OAAO,MAAM,EAAG,CAAC,EAClF,IAAIE,EAAgC,KAGpC,QAASnpC,KAAUwoC,GAAa,CAC9B,MAAMhiC,EAAQ,OAAO,KAAKxG,CAAM,EAAE,KAC/BwG,GAAUA,IAAU,SAAWA,IAAU,kBAAoBA,IAAU,OAASA,EAAM,SAAS,OAAO,CACzG,EACA,GAAIA,EAAO,CACT2iC,EAAiB3iC,EACjB,KACF,CACF,CACA,OAAO2iC,CACT,CAEO,SAASC,EAAiBC,EAAkC,CACjE,MAAMC,EAAUD,EAAc,QACzBA,EAAc,OAAO,CAAC,EAAE,SAAW,IAAI,YAAY,EACnDA,EAAc,OAAO,SAAW,GACrC,GAAIC,EAAQ,SAAS,SAAS,EAC5B,MAAO,GACF,GAAID,EAAc,KAAK,OAAS,GAAKA,EAAc,KAAK,CAAC,EAAE,OAAO,OAAS,EAEhF,MAAO,GAET,MAAM,IAAI,MAAMC,CAAO,CACzB,C,yDCjJO,MAAMC,EAAgB,CAC3B,WAAY,kCACZ,SAAU,gCACV,eAAgB,sCAChB,mBAAoB,0CACpB,cAAe,iCACf,yBAA0B,iDAC1B,aAAc,mCAChB,EAEaC,EAAmB,uBAEnBC,EAAuB,wC,uPCThCC,EAAY,OAAO,eACnBC,EAAkB,CAACZ,EAAKzzC,EAAK1C,IAAU0C,KAAOyzC,EAAMW,EAAUX,EAAKzzC,EAAK,CAAE,WAAY,GAAM,aAAc,GAAM,SAAU,GAAM,MAAA1C,CAAM,CAAC,EAAIm2C,EAAIzzC,CAAG,EAAI1C,EACtJg3C,EAAgB,CAACb,EAAKzzC,EAAK1C,IAAU+2C,EAAgBZ,EAAK,OAAOzzC,GAAQ,SAAWA,EAAM,GAAKA,EAAK1C,CAAK,EAC7G,MAAMi3C,EAAkB,CACtB,YAAY7b,EAAsB8b,EAAuB,CACvDF,EAAc,KAAM,oBAAoB,EACxCA,EAAc,KAAM,aAAc,CAAC,CAAC,EACpCA,EAAc,KAAM,uBAAuB,EAC3C,KAAK,mBAAqB,IAAIG,EAAA,EAAS,IAAM/b,CAAoB,EACjE,KAAK,sBAAwB8b,GAAyB,SACxD,CACA,uBAAuBE,EAAY,CACjC,KAAK,WAAaA,CACpB,CACA,yBAAyBC,EAAU,CACjC,OAAO,KAAK,mBAAmB,KAAK,EAAE,OAAQ1uB,GAAOA,EAAG,WAAa0uB,GAAY,CAAC1uB,EAAG,YAAY,CACnG,CACA,yBAAyBjmB,EAAK,CAC5B,OAAO,KAAK,mBAAmB,KAAK,EAAE,OAAQimB,GAAOA,EAAG,iBAAmBA,EAAG,kBAAoBjmB,CAAG,CACvG,CACA,eAAgB,CACd,OAAO,KAAK,UACd,CACA,uBAAuB8mB,EAAI,CACzB,OAAO,KAAK,mBAAmB,YAAYA,CAAE,CAC/C,CACA,YAAYpU,EAAO,CACjB,OAAOA,EAAM,WAAW,KAAMuT,GAAO,CACnC,MAAM8B,EAAM,KAAK,uBAAuB9B,EAAG,EAAE,EAC7C,OAAkC8B,GAAI,WAAc,GACtD,CAAC,IAAM,MACT,CACF,C,0BCxBO,MAAM6sB,UAA0BL,EAAkB,CACvD,aAAc,CACZ,MAAM,KAAsB,QAAQ,EAEpC,KAAK,uBAAuB,CAC1B,KAAiC,aACjC,KAAiC,eACjC,KAAiC,QACjC,KAAiC,UACjC,KAAiC,aACjC,KAAiC,WACnC,CAAC,CACH,CAEA,iBAAiBM,EAAqBC,EAA6C,CACjF,UAAWjwB,KAAaiwB,EAAY,CAClC,GAAIjwB,EAAU,SACZ,SAEF,MAAMkD,EAAM,KAAK,mBAAmB,YAAYlD,EAAU,EAAE,EAC5D,GAAI,CAACkD,EAAK,CACR,QAAQ,MAAM,4BAA4BlD,EAAU,EAAE,kBAAkB,EACxE,QACF,CACAgwB,EAAc9sB,EAAI,SAASlD,EAAWkD,EAAK8sB,CAAW,CACxD,CACA,OAAOA,CACT,CAEA,oBAAoBA,EAAqBE,EAAuD,CAC9F,GAAIA,EACF,UAAWtsB,KAAYssB,EACrBF,EAAc,GAAG,KAAK,kBAAkBA,EAAapsB,CAAQ,CAAC,GAGlE,OAAOosB,CACT,CAEQ,kBAAkBG,EAAqBC,EAA6C,CAC1F,IAAI9yC,EAAS6yC,EAAc,IAAIC,EAAY,QAAQ,IAEnD,OAAIA,EAAY,gBACd9yC,GAAU,GAAG8yC,EAAY,iBAAiB,IAAIA,EAAY,aAAa,MAGlE9yC,EAAS,KAAK,YAAY8yC,EAAY,MAAO,EAAI,CAC1D,CAEA,aAAavqC,EAA2C,CACtD,GAAIA,EAAO,SAAW,EACpB,MAAO,KAGT,IAAIoG,EAAO,IACX,UAAWc,KAAUlH,EACfoG,IAAS,MACXA,GAAQ,MAGVA,GAAQ,GAAGc,EAAO,KAAK,GAAGA,EAAO,EAAE,IAAIA,EAAO,KAAK,IAGrD,OAAOd,EAAO,GAChB,CAEA,YAAY4B,EAAoBwiC,EAA0B,CACxD,IAAIL,EAAc,KAAK,aAAaniC,EAAM,MAAM,EAChD,OAAAmiC,EAAc,KAAK,iBAAiBA,EAAaniC,EAAM,UAAU,EAE7D,CAACwiC,GAAU,KAAK,YAAYxiC,CAAK,GAAaA,EAAM,eAAe,SACrEmiC,EAAc,IAAIA,CAAW,KAG/BA,EAAc,KAAK,oBAAoBA,EAAaniC,EAAM,aAAa,EAEhEmiC,CACT,CAEA,kBAAuC,CACrC,MAAO,CACL,CACE,KAAM,qCACN,KAAM,KAAqB,IAE3B,WAAY,CACV,CAAE,GAAI,KAAgB,OAAQ,OAAQ,CAAC,CAAE,EACzC,CAAE,GAAI,KAAgB,oBAAqB,OAAQ,CAAC,CAAE,CACxD,CACF,EACA,CACE,KAAM,mCACN,KAAM,KAAqB,IAE3B,WAAY,CACV,CAAE,GAAI,KAAgB,KAAM,OAAQ,CAAC,CAAE,EACvC,CAAE,GAAI,KAAgB,oBAAqB,OAAQ,CAAC,CAAE,CACxD,CACF,EACA,CACE,KAAM,+CACN,KAAM,KAAqB,IAE3B,WAAY,CACV,CAAE,GAAI,KAAgB,aAAc,OAAQ,CAAC,EAAE,CAAE,EACjD,CAAE,GAAI,KAAgB,OAAQ,OAAQ,CAAC,CAAE,EACzC,CAAE,GAAI,KAAgB,oBAAqB,OAAQ,CAAC,CAAE,CACxD,CACF,EACA,CACE,KAAM,8CACN,KAAM,KAAqB,IAE3B,WAAY,CACV,CAAE,GAAI,KAAgB,aAAc,OAAQ,CAAC,EAAE,CAAE,EACjD,CAAE,GAAI,KAAgB,KAAM,OAAQ,CAAC,CAAE,EACvC,CAAE,GAAI,KAAgB,oBAAqB,OAAQ,CAAC,CAAE,CACxD,CACF,EACA,CACE,KAAM,yDACN,KAAM,KAAqB,IAE3B,WAAY,CACV,CAAE,GAAI,KAAgB,aAAc,OAAQ,CAAC,EAAE,CAAE,EACjD,CAAE,GAAI,KAAgB,OAAQ,OAAQ,CAAC,CAAE,EACzC,CAAE,GAAI,KAAgB,oBAAqB,OAAQ,CAAC,CAAE,EACtD,CAAE,GAAI,KAAgB,YAAa,OAAQ,CAAC,QAAS,IAAK,OAAO,CAAE,CACrE,CACF,EACA,CACE,KAAM,mCACN,KAAM,KAAqB,IAE3B,WAAY,CACV,CAAE,GAAI,KAAgB,aAAc,OAAQ,CAAC,EAAE,CAAE,EACjD,CAAE,GAAI,KAAgB,KAAM,OAAQ,CAAC,CAAE,EACvC,CAAE,GAAI,KAAgB,oBAAqB,OAAQ,CAAC,CAAE,EACtD,CAAE,GAAI,KAAgB,WAAY,OAAQ,CAAC,cAAc,CAAE,EAC3D,CAAE,GAAI,KAAgB,KAAM,OAAQ,CAAC,CAAE,EACvC,CAAE,GAAI,KAAgB,oBAAqB,OAAQ,CAAC,CAAE,CACxD,CACF,EACA,CACE,KAAM,qBACN,KAAM,KAAqB,IAE3B,WAAY,CACV,CAAE,GAAI,KAAgB,aAAc,OAAQ,CAAC,EAAE,CAAE,EACjD,CAAE,GAAI,KAAgB,OAAQ,OAAQ,CAAC,CAAE,EACzC,CAAE,GAAI,KAAgB,oBAAqB,OAAQ,CAAC,CAAE,EACtD,CAAE,GAAI,KAAgB,WAAY,OAAQ,CAAC,cAAc,CAAE,CAC7D,CACF,EACA,CACE,KAAM,4BACN,KAAM,KAAqB,IAE3B,WAAY,CACV,CAAE,GAAI,KAAgB,aAAc,OAAQ,CAAC,EAAE,CAAE,EACjD,CAAE,GAAI,KAAgB,OAAQ,OAAQ,CAAC,CAAE,EACzC,CAAE,GAAI,KAAgB,oBAAqB,OAAQ,CAAC,CAAE,EACtD,CAAE,GAAI,KAAgB,YAAa,OAAQ,CAAC,MAAO,OAAO,CAAE,CAC9D,CACF,EACA,CACE,KAAM,mCACN,KAAM,KAAqB,OAE3B,WAAY,CACV,CAAE,GAAI,KAAgB,aAAc,OAAQ,CAAC,EAAE,CAAE,EACjD,CAAE,GAAI,KAAgB,OAAQ,OAAQ,CAAC,CAAE,EACzC,CAAE,GAAI,KAAgB,oBAAqB,OAAQ,CAAC,CAAE,EACtD,CAAE,GAAI,KAAgB,OAAQ,OAAQ,CAAC,EAAE,CAAE,EAC3C,CAAE,GAAI,KAAgB,oBAAqB,OAAQ,CAAC,CAAE,EACtD,CAAE,GAAI,KAAgB,YAAa,OAAQ,CAAC,SAAS,CAAE,EACvD,CAAE,GAAI,KAAgB,IAAK,OAAQ,CAAC,CAAE,CACxC,CACF,EACA,CACE,KAAM,sCACN,KAAM,KAAqB,OAE3B,WAAY,CACV,CAAE,GAAI,KAAgB,aAAc,OAAQ,CAAC,EAAE,CAAE,EACjD,CAAE,GAAI,KAAgB,cAAe,OAAQ,CAAC,SAAS,CAAE,EACzD,CAAE,GAAI,KAAgB,IAAK,OAAQ,CAAC,CAAE,CACxC,CACF,EACA,CACE,KAAM,sDACN,KAAM,KAAqB,OAE3B,WAAY,CACV,CAAE,GAAI,KAAgB,aAAc,OAAQ,CAAC,EAAE,CAAE,EACjD,CAAE,GAAI,KAAgB,OAAQ,OAAQ,CAAC,CAAE,EACzC,CAAE,GAAI,KAAgB,oBAAqB,OAAQ,CAAC,CAAE,EACtD,CAAE,GAAI,KAAgB,cAAe,OAAQ,CAAC,SAAS,CAAE,EACzD,CAAE,GAAI,KAAgB,IAAK,OAAQ,CAAC,CAAE,CACxC,CACF,EACA,CACE,KAAM,6BACN,KAAM,KAAqB,OAE3B,WAAY,CACV,CAAE,GAAI,KAAgB,aAAc,OAAQ,CAAC,EAAE,CAAE,EACjD,CAAE,GAAI,KAAgB,cAAe,OAAQ,CAAC,SAAS,CAAE,CAC3D,CACF,EACA,CACE,KAAM,gCACN,KAAM,KAAqB,OAE3B,WAAY,CACV,CAAE,GAAI,KAAgB,aAAc,OAAQ,CAAC,EAAE,CAAE,EACjD,CAAE,GAAI,KAAgB,cAAe,OAAQ,CAAC,SAAS,CAAE,CAC3D,CACF,EACA,CACE,KAAM,yCACN,KAAM,KAAqB,OAE3B,WAAY,CACV,CAAE,GAAI,KAAgB,OAAQ,OAAQ,CAAC,CAAE,EACzC,CAAE,GAAI,KAAgB,oBAAqB,OAAQ,CAAC,CAAE,EACtD,CAAE,GAAI,KAAgB,cAAe,OAAQ,CAAC,SAAS,CAAE,EACzD,CAAE,GAAI,KAAgB,IAAK,OAAQ,CAAC,CAAE,EACtC,CAAE,GAAI,KAAgB,KAAM,OAAQ,CAAC,EAAE,CAAE,CAC3C,CACF,EACA,CACE,KAAM,qBACN,KAAM,KAAqB,OAE3B,WAAY,CACV,CAAE,GAAI,KAAgB,OAAQ,OAAQ,CAAC,CAAE,EACzC,CAAE,GAAI,KAAgB,oBAAqB,OAAQ,CAAC,CAAE,EACtD,CAAE,GAAI,KAAgB,OAAQ,OAAQ,CAAC,SAAS,CAAE,EAClD,CAAE,GAAI,KAAgB,oBAAqB,OAAQ,CAAC,CAAE,EACtD,CAAE,GAAI,KAAgB,iBAAkB,OAAQ,CAAC,UAAW,EAAG,CAAE,EACjE,CAAE,GAAI,KAAgB,IAAK,OAAQ,CAAC,CAAE,CACxC,CACF,CACF,CACF,CACF,CAEO,MAAMM,GAAoB,IAAIP,E,0BClO9B,MAAMQ,CAAa,CAKxB,YAAYjiC,EAAcC,EAAYtK,EAAiB,CACrD,KAAK,KAAOqK,EACZ,KAAK,GAAKC,EACV,KAAK,KAAOtK,CACd,CAEA,OAAO,SAAS0J,EAAgC,CAC9C,OAAO,IAAI4iC,EAAa5iC,EAAK,KAAMA,EAAK,GAAIA,EAAK,IAAI,CACvD,CAEA,SAASkC,EAAiC,CACxC,OAAO,KAAK,MAAQA,EAAS,MAAQ,KAAK,IAAMA,EAAS,EAC3D,CAEA,cAAchC,EAAuB,CACnC,OAAOA,EAAM,UAAU,KAAK,KAAM,KAAK,EAAE,CAC3C,CACF,CAKO,SAAS2iC,EAAe3iC,EAAe1S,EAAa+Q,EAAkBzT,EAAwB,CAEnG,OADiBg4C,EAAsB5iC,EAAO1S,EAAK+Q,EAAUzT,CAAK,EAClD,OAAS,CAC3B,CAKO,SAASi4C,GAAqB7iC,EAAe1S,EAAa+Q,EAAkBzT,EAAuB,CACxG,MAAMk4C,EAAWF,EAAsB5iC,EAAO1S,EAAK+Q,EAAUzT,CAAK,EAClE,UAAWorB,KAAW8sB,EACpB9iC,EACEgW,EAAQ,QAAQ,KAAK,KAAO,KAAc+sB,EAAkB/iC,EAAOgW,CAAO,EAAIgtB,EAAehjC,EAAOgW,CAAO,EAE/G,OAAOhW,CACT,CAEA,SAAS+iC,EAAkB/iC,EAAegW,EAA6B,CACrE,MAAMitB,EAAgBjtB,EAAQ,QAAQ,OACtC,MAAI,CAACitB,GAAiBA,EAAc,KAAK,KAAO,KACvCjjC,GAEDA,EAAM,UAAU,EAAGijC,EAAc,IAAI,EAAIjjC,EAAM,UAAUijC,EAAc,EAAE,GAAG,KAAK,CAC3F,CAEA,SAASD,EAAehjC,EAAegW,EAA6B,CAClE,IAAI1Y,EAA8B0Y,EAClC,GACE1Y,EAAWA,EAAS,aACbA,GAAYA,EAAS,KAAK,KAAO,MAC1C,MAAMkB,EAAQwX,EAAQ,SAAS,IAAU,EACzC,GAAI,CAAC1Y,GAAY,CAACkB,EAChB,OAAOwB,EAET,MAAMkjC,EAAYljC,EAAM,UAAUxB,EAAM,KAAMA,EAAM,EAAE,EAEhD2kC,EAASnjC,EAAM,UAAU,EAAG1C,EAAS,IAAI,EACzC+rB,EAASrpB,EAAM,UAAU1C,EAAS,EAAE,EAEpC8lC,KAAgB,MAA2BpjC,EAAM,UAAU1C,EAAS,KAAMA,EAAS,EAAE,CAAC,EAC5F,OAAA8lC,EAAc,MAAM,OAASA,EAAc,MAAM,OAAO,OAAQ5kC,IAAUA,GAAM,QAAU0kC,CAAS,EAE5FC,EAAS,GAAS,YAAYC,EAAc,KAAK,EAAI/Z,CAC9D,CAEA,SAASuZ,EAAsB5iC,EAAexB,EAAeH,EAAkBzT,EAA6B,CAC1G,MAAMy4C,EAAO,KAAO,MAAMrjC,CAAK,EACzB8iC,EAAyB,CAAC,EAChC,OAAAO,EAAK,QAAQ,CACX,MAAO,CAAC,CAAE,KAAAjtC,EAAM,KAAA0J,CAAK,IAAY,CAC3B1J,EAAK,KAAO,MACd0sC,EAAS,KAAKhjC,CAAI,CAEtB,CACF,CAAC,EACMgjC,EAAS,OAAQ9sB,GAAY,CAClC,MAAM1C,EAAY0C,EAAQ,SAAS,IAAU,EACvCstB,GAAShwB,GAAW,YACpBiwB,GAAYvtB,EAAQ,SAAS,IAAM,EAKzC,GAJI,CAAC1C,GAAa,CAACgwB,IAAU,CAACC,IAGZvjC,EAAM,UAAUsT,EAAU,KAAMA,EAAU,EAAE,IAC5C9U,EAChB,MAAO,GAET,MAAMtB,EAAa8C,EAAM,UAAUujC,GAAU,KAAMA,GAAU,EAAE,EAK/D,MAJI,WAAarmC,CAAU,OAAM,MAAmBtS,CAAK,GAGnCoV,EAAM,UAAUsjC,GAAO,KAAMA,GAAO,EAAE,IACtCjlC,EAIxB,CAAC,CACH,CAWO,SAASmlC,EACdxjC,EACA1S,EACA+Q,EACAzT,EACA4K,EACQ,CACR,GAAI,CAAClI,EACH,MAAM,IAAI,MAAM,6BAA6B,EAG/C,MAAMm2C,EAA0BC,EAA2B1jC,CAAK,EAChE,GAAI,CAACyjC,EAAwB,OAC3B,OAAOzjC,EAGT,MAAM2jC,EAAkBC,EAAmB5jC,CAAK,EAC1C6jC,EAAuBC,EAAwB9jC,CAAK,EACpD+jC,GAA4BC,EAA4BhkC,CAAK,EAE7DikC,MAAuB,MAA0BjkC,EAAO,CAAC,IAAe,CAAC,EAG1ExK,GACgC0uC,GAA+BlkC,CAAK,EACxB,IAAKlU,GAAUA,EAAM,cAAckU,CAAK,CAAC,EACxE,SAAS1S,CAAG,IAC1BkI,EAAY,KAAU,SAI1B,MAAM2uC,GAAgCV,EAAwB,MAAOW,GACnEL,GAA0B,KACvBM,GACCA,EAAgB,MAAQD,EAAuB,MAAQC,EAAgB,IAAMD,EAAuB,EACxG,CACF,EAEMllC,EAASolC,EAAch3C,EAAK1C,EAAOyT,CAAQ,EACjD,GAAI7I,IAAc,KAAU,QAAUA,IAAc,KAAU,mBAAoB,CAChF,MAAM+uC,EAA6BC,EAA6BxkC,EAAO,CACrE,GAAGyjC,EACH,GAAGI,EACH,GAAGF,EACH,GAAGM,EACL,CAAC,EAED,OAAOQ,EAAuBzkC,EAAOukC,EAA4BrlC,CAAM,CACzE,KAAO,IAAI1J,IAAc,KAAU,QACjC,OAAOkvC,EAA0B1kC,EAAOyjC,EAAyBvkC,CAAM,EAIvE,GAAIykC,EAAgB,SAAW,GAAKQ,KAAkC,GACpE,OAAOO,EAA0B1kC,EAAOyjC,EAAyBvkC,CAAM,EAClE,CAGL,MAAMqlC,EAA6BC,EAA6BxkC,EAAO,CACrE,GAAG2jC,EACH,GAAGE,EACH,GAAGI,EACL,CAAC,EAED,OAAOQ,EAAuBzkC,EAAOukC,EAA4BrlC,CAAM,CACzE,EAEJ,CAEA,SAASslC,EAA6BxkC,EAAekB,EAA2C,CAC9F,MAAMyjC,EAAiBC,KAAW,MAA0B5kC,EAAO,CAAC,IAAI,CAAC,CAAC,EACpE6kC,EAAe,CAAC,GAAG3jC,CAAS,EAUlC,OAPmCyjC,EAAe,IAAKG,GAC9CC,EACLF,EAAa,OAAQG,GACZF,EAAc,SAASE,CAAC,CAChC,CACH,CACD,CAEH,CASO,SAASC,GAAiBjlC,EAAe6T,EAAwB,CACtE,MAAMqxB,EAAsBC,EAAwBnlC,CAAK,EAEzD,GAAIklC,EAAoB,OACtB,OAAOE,GAAkBplC,EAAOklC,EAAqBrxB,CAAM,EACtD,CACL,MAAM4vB,EAA0BC,EAA2B1jC,CAAK,EAChE,OAAKyjC,EAAwB,OAGtB2B,GAAkBplC,EAAOyjC,EAAyB5vB,CAAM,EAFtD7T,CAGX,CACF,CASO,SAASqlC,EAAerlC,EAAeslC,EAAgC,CAC5E,MAAMJ,EAAsBC,EAAwBnlC,CAAK,EAEzD,GAAIklC,EAAoB,OACtB,OAAOE,GAAkBplC,EAAOklC,EAAqB,QAAQI,EAAa,KAAK,IAAI,CAAC,EAAE,EACjF,CACL,MAAM7B,EAA0BC,EAA2B1jC,CAAK,EAChE,OAAKyjC,EAAwB,OAGtB2B,GAAkBplC,EAAOyjC,EAAyB,QAAQ6B,EAAa,KAAK,IAAI,CAAC,EAAE,EAFjFtlC,CAGX,CACF,CAQA,SAASolC,GAAkBplC,EAAeulC,EAAoCC,EAA2B,CACvG,IAAIC,EAAW,GACXC,EAAO,EAEX,QAAS/3C,EAAI,EAAGA,EAAI43C,EAAmB,OAAQ53C,IAAK,CAElD,MAAM7B,EAAQy5C,EAAmB53C,CAAC,EAC5Bg4C,EAASh4C,IAAM43C,EAAmB,OAAS,EAE3C/4C,GAAQwT,EAAM,UAAU0lC,EAAM55C,EAAM,EAAE,EACtCW,GAAMk5C,EAAS3lC,EAAM,UAAUlU,EAAM,EAAE,EAAI,GAGjD25C,GAAYj5C,GAAQ,MAAMg5C,CAAS,GAAK/4C,GACxCi5C,EAAO55C,EAAM,EACf,CACA,OAAO25C,CACT,CAQO,SAASG,GAA0B5lC,EAAuB,CAC/D,MAAM2jC,EAAkBC,EAAmB5jC,CAAK,EAChD,GAAI,CAAC2jC,EAAgB,OACnB,OAAO3jC,EAGT,MAAMd,EAASolC,EAAc,YAAa,GAAI,GAAG,EACjD,OAAOG,EAAuBzkC,EAAO2jC,EAAiBzkC,CAAM,CAC9D,CASO,SAAS2mC,GAAsB7lC,EAAe8lC,EAAkE,CACrH,MAAMC,EAAoBC,EAAqBhmC,CAAK,EACpD,OAAOimC,EAAejmC,EAAO+lC,EAAmBD,CAAW,CAC7D,CAMO,SAASI,EAAwBlmC,EAAuB,CAC7D,MAAMmmC,EAAuBC,EAAwBpmC,CAAK,EAE1D,GAAI,CAACmmC,EAAqB,OACxB,OAAOnmC,EAGT,IAAIylC,EAAW,GACXC,EAAO,EAEX,QAASW,KAAuBF,EAC9BV,EAAWA,EAAWzlC,EAAM,UAAU0lC,EAAMW,EAAoB,IAAI,EACpEX,EAAOW,EAAoB,GAE7B,OAAAZ,EAAWA,EAAWzlC,EAAM,UAAU0lC,CAAI,EACnCD,CACT,CAOO,SAAS/B,EAA2B1jC,EAA+B,CACxE,MAAMqjC,EAAO,KAAO,MAAMrjC,CAAK,EACzBkB,EAA4B,CAAC,EACnC,OAAAmiC,EAAK,QAAQ,CACX,MAAO,CAAC,CAAE,KAAAjtC,EAAM,KAAA0J,CAAK,IAAoB,CACvC,GAAI1J,EAAK,KAAO,KACd,OAAA8K,EAAU,KAAKwhC,EAAa,SAAS5iC,CAAI,CAAC,EACnC,EAEX,CACF,CAAC,EACMoB,CACT,CAMO,SAAS0iC,EAAmB5jC,EAA+B,CAChE,MAAMqjC,EAAO,KAAO,MAAMrjC,CAAK,EACzBkB,EAA4B,CAAC,EAC7BolC,EAAkB,CAAC,KAAa,KAAsB,KAAc,IAAsB,EAChG,OAAAjD,EAAK,QAAQ,CACX,MAAO,CAAC,CAAE,KAAAjtC,EAAM,KAAA0J,CAAK,IAAoB,CACvC,GAAIwmC,EAAgB,SAASlwC,EAAK,EAAE,EAClC,OAAA8K,EAAU,KAAKwhC,EAAa,SAAS5iC,CAAI,CAAC,EACnC,EAEX,CACF,CAAC,EACMoB,CACT,CAMO,SAAS4iC,EAAwB9jC,EAA+B,CACrE,MAAMqjC,EAAO,KAAO,MAAMrjC,CAAK,EACzBkB,EAA4B,CAAC,EACnC,OAAAmiC,EAAK,QAAQ,CACX,MAAO,CAAC,CAAE,KAAAjtC,EAAM,KAAA0J,CAAK,IAAoB,CACvC,GAAI1J,EAAK,KAAO,KACd,OAAA8K,EAAU,KAAKwhC,EAAa,SAAS5iC,CAAI,CAAC,EACnC,EAEX,CACF,CAAC,EACMoB,CACT,CAMA,SAASikC,EAAwBnlC,EAA+B,CAC9D,MAAMqjC,EAAO,KAAO,MAAMrjC,CAAK,EACzBkB,EAA4B,CAAC,EACnC,OAAAmiC,EAAK,QAAQ,CACX,MAAO,CAAC,CAAE,KAAAjtC,EAAM,KAAA0J,CAAK,IAAoB,CACvC,GAAI1J,EAAK,KAAO,KACd,OAAA8K,EAAU,KAAKwhC,EAAa,SAAS5iC,CAAI,CAAC,EACnC,EAEX,CACF,CAAC,EACMoB,CACT,CAMA,SAAS8kC,EAAqBhmC,EAA+B,CAC3D,MAAMqjC,EAAO,KAAO,MAAMrjC,CAAK,EACzBkB,EAA4B,CAAC,EACnC,OAAAmiC,EAAK,QAAQ,CACX,MAAO,CAAC,CAAE,KAAAjtC,EAAM,KAAA0J,CAAK,IAAoB,CACvC,GAAI1J,EAAK,KAAO,KACd,OAAA8K,EAAU,KAAKwhC,EAAa,SAAS5iC,CAAI,CAAC,EACnC,GAIT,GAAI1J,EAAK,KAAO,KAAc,CAG5B,MAAMmwC,EAAoC,CAAC,EACrCjpC,EAAWwC,EAAK,SAAS,IAAQ,EACnCxC,GACFipC,EAAkB,KAAK7D,EAAa,SAASplC,CAAQ,CAAC,EAGxD,MAAMkpC,EAAW1mC,EAAK,SAAS,IAAY,EACvC0mC,GACFD,EAAkB,KAAK7D,EAAa,SAAS8D,CAAQ,CAAC,EAGxD,MAAMC,GAAS3mC,EAAK,SAAS,IAAU,EACnC2mC,IACFF,EAAkB,KAAK7D,EAAa,SAAS+D,EAAM,CAAC,EAItD,MAAMC,MAAS,UAAOH,EAAoBvkC,IAAaA,GAAS,EAAE,EAClE,OAAAd,EAAU,KAAK,IAAIwhC,EAAagE,GAAO,CAAC,EAAE,KAAMA,GAAOA,GAAO,OAAS,CAAC,EAAE,EAAE,CAAC,EACtE,EACT,CACF,CACF,CAAC,EACMxlC,CACT,CAEO,SAASojC,EAAch3C,EAAa1C,EAAeyT,EAA2C,CAEnG,MAAO,CAAE,MAAO/Q,EAAK,GAAI+Q,EAAU,MAAAzT,CAAM,CAC3C,CAQA,SAAS85C,EACP1kC,EACA2mC,EACAznC,EACQ,CACR,IAAIumC,EAAW,GACXC,EAAO,EAEX,QAAS/3C,EAAI,EAAGA,EAAIg5C,EAAwB,OAAQh5C,IAAK,CAEvD,MAAM7B,EAAQ66C,EAAwBh5C,CAAC,EACjCg4C,EAASh4C,IAAMg5C,EAAwB,OAAS,EAEhDn6C,GAAQwT,EAAM,UAAU0lC,EAAM55C,EAAM,IAAI,EACxCW,GAAMk5C,EAAS3lC,EAAM,UAAUlU,EAAM,EAAE,EAAI,GAC3Cs3C,MAAgB,MAA2BpjC,EAAM,UAAUlU,EAAM,KAAMA,EAAM,EAAE,CAAC,EAEjF86C,EAAYxD,GAAc,MAAM,OAAQlkC,CAAM,GAEjDkkC,GAAc,MAAM,OAAO,KAAKlkC,CAAM,EAExC,MAAM2nC,EAAY,GAAS,YAAYzD,GAAc,KAAK,EAC1DqC,GAAYj5C,GAAQq6C,EAAYp6C,GAChCi5C,EAAO55C,EAAM,EACf,CACA,OAAO25C,CACT,CAQO,SAAShB,EACdzkC,EACA8mC,EACA5nC,EACQ,CACR,IAAIumC,EAAW,GACXC,EAAO,EAEX,QAAS/3C,EAAI,EAAGA,EAAIm5C,EAAoB,OAAQn5C,IAAK,CAEnD,MAAM7B,EAAQg7C,EAAoBn5C,CAAC,EAC7Bg4C,EAASh4C,IAAMm5C,EAAoB,OAAS,EAE5Ct6C,GAAQwT,EAAM,UAAU0lC,EAAM55C,EAAM,EAAE,EACtCW,GAAMk5C,EAAS3lC,EAAM,UAAUlU,EAAM,EAAE,EAAI,GAEjD,IAAIi7C,GAAc,GAEd,CAAC,OAAO,MAAM,OAAO7nC,EAAO,KAAK,CAAC,IAAMA,EAAO,KAAO,KAAOA,EAAO,KAAO,KAC7E6nC,GAAc,MAAM7nC,EAAO,KAAK,GAAGA,EAAO,EAAE,GAAG,OAAOA,EAAO,KAAK,CAAC,GAInE6nC,GAAc,MAAM7nC,EAAO,KAAK,GAAGA,EAAO,EAAE,QAAK,MAAmBA,EAAO,KAAK,CAAC,KAGnFumC,GAAYj5C,GAAQu6C,GAAct6C,GAClCi5C,EAAO55C,EAAM,EACf,CACA,OAAO25C,CACT,CAQA,SAASQ,EACPjmC,EACA+lC,EACAD,EACQ,CACR,IAAIL,EAAW,GACXC,EAAO,EAEX,QAAS/3C,EAAI,EAAGA,EAAIo4C,EAAkB,OAAQp4C,IAAK,CAEjD,MAAM7B,EAAQi6C,EAAkBp4C,CAAC,EAC3Bg4C,EAASh4C,IAAMo4C,EAAkB,OAAS,EAE1Cv5C,GAAQwT,EAAM,UAAU0lC,EAAM55C,EAAM,EAAE,EACtCW,GAAMk5C,EAAS3lC,EAAM,UAAUlU,EAAM,EAAE,EAAI,GAE3Ci7C,GAAc,mBAAmBjB,EAAY,QAAQ,IAAIA,EAAY,aAAa,GACxFL,GAAYj5C,GAAQu6C,GAAct6C,GAClCi5C,EAAO55C,EAAM,EACf,CACA,OAAO25C,CACT,CAEO,SAASuB,EAAchnC,EAAepV,EAAQ,GAAIyT,EAAW,KAAc,CAChF,MAAMolC,EAA0BC,EAA2B1jC,CAAK,EAChE,GAAI,CAACyjC,EAAwB,OAC3B,OAAOzjC,EAET,MAAMinC,EAAoBxD,EAAwB,CAAC,EAAE,GAGrD,OADqBzjC,EAAM,MAAM,EAAGinC,CAAiB,EAAI,IAAI5oC,CAAQ,MAAMzT,CAAK,KAAOoV,EAAM,MAAMinC,CAAiB,CAEtH,CAEA,SAASb,EAAwBpmC,EAA+B,CAC9D,MAAMqjC,EAAO,KAAO,MAAMrjC,CAAK,EACzBkB,EAA4B,CAAC,EACnC,OAAAmiC,EAAK,QAAQ,CACX,MAAO,CAAC,CAAE,KAAAjtC,EAAM,KAAAqK,EAAM,GAAAC,CAAG,IAAoB,CAC3C,GAAItK,EAAK,KAAO,KACd,OAAA8K,EAAU,KAAK,IAAIwhC,EAAajiC,EAAMC,EAAItK,CAAI,CAAC,EACxC,EAEX,CACF,CAAC,EACM8K,CACT,CAOA,SAAS0lC,EAAY5uC,EAAmCkH,EAAiC,CACvF,OAAOlH,EAAO,KAAMwG,GAAUA,EAAM,QAAUU,EAAO,OAASV,EAAM,QAAUU,EAAO,KAAK,CAC5F,CAMO,SAAS6lC,EAAiB7jC,EAAyC,CACxE,OAAKA,EAAU,OAGRA,EAAU,OAAO,CAACwkC,EAAMwB,IAAaxB,EAAK,GAAKwB,EAAQ,GAAKxB,EAAOwB,CAAQ,EAFzE,IAAIxE,EAAa,EAAG,CAAC,CAGhC,CAQA,SAASkC,EAAW/kC,EAAuC,CACzD,OAAOA,EAAM,OAAQC,GAASD,EAAM,MAAOsnC,GAAMrnC,EAAK,SAASqnC,CAAC,IAAM,IAASrnC,IAASqnC,CAAC,CAAC,CAC5F,CAEA,SAASC,EAA4BtnC,EAAkB1J,EAA8B,CACnF,GAAI0J,EAAK,KAAK,KAAO1J,EACnB,MAAO,CAACssC,EAAa,SAAS5iC,CAAI,CAAC,EAGrC,MAAMoB,EAA4B,CAAC,EACnC,IAAIjQ,EAAM,EACNoiB,EAAQvT,EAAK,WAAW7O,CAAG,EAC/B,KAAOoiB,GACLnS,EAAU,KAAK,GAAGkmC,EAA4B/zB,EAAOjd,CAAI,CAAC,EAC1DnF,EAAMoiB,EAAM,GACZA,EAAQvT,EAAK,WAAW7O,CAAG,EAE7B,OAAOiQ,CACT,CAEA,SAAS8iC,EAA4BhkC,EAA+B,CAClE,MAAMqjC,EAAO,KAAO,MAAMrjC,CAAK,EACzBkB,EAA4B,CAAC,EACnC,OAAAmiC,EAAK,QAAQ,CACX,MAAO,CAAC,CAAE,KAAAvjC,CAAK,IAAoB,CAC7BA,EAAK,KAAK,KAAO,MACnBoB,EAAU,KAAK,GAAGkmC,EAA4BtnC,EAAM,IAAO,CAAC,CAEhE,CACF,CAAC,EACMoB,CACT,CAEO,SAASgjC,GAA+BlkC,EAA+B,CAC5E,MAAMqjC,EAAO,KAAO,MAAMrjC,CAAK,EACzBkB,EAA4B,CAAC,EACnC,OAAAmiC,EAAK,QAAQ,CACX,MAAO,CAAC,CAAE,KAAAvjC,CAAK,IAAoB,CAC7BA,EAAK,KAAK,KAAO,MACnBoB,EAAU,KAAK,GAAGkmC,EAA4BtnC,EAAM,IAAU,CAAC,CAEnE,CACF,CAAC,EACMoB,CACT,C,gICtoBA,MAAM7N,KAAY,WAAYC,IACrB,CACL,aAAW,OAAI,CACb,QAAS,OACT,cAAe,MACf,IAAKA,EAAM,QAAQ,EAAG,EACtB,WAAYA,EAAM,QAAQ,EAAG,CAC/B,CAAC,CACH,EACD,EAEY+zC,EAA2B,sBAE3BzuC,GAAkBvB,GAAiB,CAC9C,MAAMgR,EAAY,IAAM,CACtB,KAAM,CAAE,iBAAAzQ,EAAkB,IAAAlE,CAAI,EAAI2D,EAC9BO,GACFA,EAAiByvC,CAAwB,KAG3C,MAAkB,qDAAsD,CACtE,eAAgB3zC,EAAI,eACpB,UAAWA,EAAI,IACf,KAAM,SACN,IAAK2D,EAAM,GACb,CAAC,CACH,EAEMiR,EAAY,IAAM,CACtB,KAAM,CAAE,iBAAAzQ,EAAkB,IAAAnE,CAAI,EAAI2D,EAC9BQ,GACFA,EAAiBwvC,CAAwB,KAG3C,MAAkB,qDAAsD,CACtE,eAAgB3zC,EAAI,eACpB,UAAWA,EAAI,IACf,KAAM,UACN,IAAK2D,EAAM,GACb,CAAC,CACH,EAEM,CAAE,MAAA/D,GAAO,gBAAAuB,EAAiB,eAAAE,EAAgB,IAAArB,CAAI,EAAI2D,EAClD1M,EAAS0I,EAAUC,EAAK,EACxB4B,MAAY,KAAgB5B,EAAK,EAEjCoC,EACJb,GAAmB,MAAQA,EAAgB,SAASwyC,CAAwB,KAC1E,OAAC,KACC,QAAQ,UACR,WAAS,KAAE,kEAAmE,eAAe,EAC7F,KAAK,MACL,QAAS/+B,CAAA,CACX,KAEA,OAAC,KACC,WAAS,KAAE,kEAAmE,eAAe,EAC7F,KAAK,MACL,QAASD,CAAA,CACX,EAGJ,SACE,QAAC,MAAG,UAAWnT,GAAU,gBACvB,oBAAC,MAAG,UAAWA,GAAU,gBACvB,mBAAC,OAAI,UAAWvK,EAAO,UAAY,UAACoK,GAAkBF,GAAmBa,CAAA,CAAkB,EAC7F,KAEA,OAAC,MAAG,UAAWR,GAAU,gBAAiB,QAAS,IAChD,SAAAxB,EAAI,MACP,GACF,CAEJ,C,kICxEO,MAAMg9B,EAAc,CAAC,CAC1B,EAAAvK,EACA,EAAAmK,EACA,oBAAAxjB,GACA,uBAAAC,EACA,UAAAojB,EACA,IAAAz8B,EACA,MAAA4zC,EACA,GAAGjwC,EACL,IAAwB,CACtB,MAAMy8B,KAAe,UAA8B,IAAI,EACjDnpC,KAAS,MAAW0I,CAAS,KAEnC,aAAU,IAAM,CACd,SAASk0C,EAAavxC,GAAkB,CAClCA,GAAE,MAAQ,UACZsxC,EAAM,CAEV,CACA,gBAAS,iBAAiB,QAASC,CAAY,EAExC,IAAM,CACX,SAAS,oBAAoB,QAASA,CAAY,CACpD,CACF,EAAG,CAACD,CAAK,CAAC,EAEV,MAAME,KAAY,eAAY,IAAM,CAClCC,GAAM,wBAAyBtX,EAAU,OAAQz8B,EAAI,cAAc,EACnE2D,GAAM,UAAU,CAClB,EAAG,CAACA,GAAO3D,EAAI,eAAgBy8B,EAAU,MAAM,CAAC,EAIhD,OAFkBrjB,IAAuBC,KAOvC,mBACE,mBAAC,OAAI,UAAWpiB,EAAO,KAAM,MAAO,CAAE,IAAK2lC,EAAG,KAAMnK,CAAE,EACpD,oBAAC,IAAI,CAAC,IAAK2N,EACT,oBAAC,IAAK,KAAL,CACC,SAAO,KAAE,yBAA0B,gBAAgB,EACnD,QAAS,IAAM,IACb,MAAS3D,EAAW2D,CAAY,EAChCwT,EAAM,EACNG,GAAM,OAAQtX,EAAU,OAAQz8B,EAAI,cAAc,CACpD,EACF,EACCoZ,OACC,OAAC,IAAK,KAAL,CACC,SAAO,KAAE,kCAAmC,6BAA6B,EACzE,QAAS,IAAM,CACbA,GAAoBqjB,EAAWz8B,EAAI,UAAU,KAAK,EAClD4zC,EAAM,EACNG,GAAM,gBAAiBtX,EAAU,OAAQz8B,EAAI,cAAc,CAC7D,EACF,EAEDqZ,MACC,OAAC,IAAK,KAAL,CACC,SAAO,KAAE,sCAAuC,qCAAqC,EACrF,QAAS,IAAM,CACbA,EAAuBojB,EAAWz8B,EAAI,UAAU,KAAK,EACrD4zC,EAAM,EACNG,GAAM,wBAAyBtX,EAAU,OAAQz8B,EAAI,cAAc,CACrE,EACF,KAEF,OAAC,IAAK,QAAL,EAAa,KACd,OAAC,IAAK,KAAL,CAAU,SAAO,KAAE,iCAAkC,cAAc,EAAG,QAAS8zC,CAAA,CAAW,GAC7F,EACF,EACF,EAvCO,IAyCX,EAEA,SAASC,GAAMC,EAAgBC,EAAyBC,GAAoC,IAC1F,MAAkB,oCAAqC,CACrD,OAAAF,EACA,gBAAAC,EACA,eAAgBC,IAAkB,SACpC,CAAC,CACH,CAEA,MAAMv0C,EAAaC,IAA0B,CAC3C,QAAM,OAAI,CACR,SAAU,QACV,OAAQA,EAAM,OAAO,KACvB,CAAC,CACH,E,wECtGO,MAAMu0C,EAAmB,CAC9B,CACE,GAAI,KAAgB,SACpB,KAAM,aACN,KAAM,GACR,EACA,CACE,GAAI,KAAgB,YACpB,KAAM,kBACN,KAAM,GACR,EACA,CACE,GAAI,KAAgB,WACpB,KAAM,qBACN,KAAM,GACR,EACA,CACE,GAAI,KAAgB,SACpB,KAAM,mBACN,KAAM,GACR,EACA,CACE,GAAI,KAAgB,OACpB,KAAM,mBACN,KAAM,GACR,EACA,CACE,GAAI,KAAgB,SACpB,KAAM,WACN,KAAM,GACR,EACA,CACE,GAAI,KAAgB,QACpB,KAAM,WACN,KAAM,KACN,WAAY,EACd,EACA,CACE,GAAI,KAAgB,WACpB,KAAM,eACN,KAAM,KACN,WAAY,EACd,EACA,CACE,GAAI,KAAgB,YACpB,KAAM,eACN,KAAM,IACN,WAAY,EACd,EACA,CACE,GAAI,KAAgB,SACpB,KAAM,YACN,KAAM,IACN,WAAY,EACd,EACA,CACE,GAAI,KAAgB,eACpB,KAAM,sBACN,KAAM,KACN,WAAY,EACd,EACA,CACE,GAAI,KAAgB,YACpB,KAAM,mBACN,KAAM,KACN,WAAY,EACd,CACF,EAIa9hB,EAA4D8hB,EAAiB,IAAK/zB,GAAU,CACvG,MAAMJ,EAA0C,CAAC,CAAE,KAAM,QAAS,KAAM,QAAS,CAAC,EAClF,IAAIo0B,EAA8C,CAAC,CAAC,EACpD,OAAIh0B,EAAM,aACRJ,EAAO,KAAK,CACV,KAAM,OACN,KAAM,UACN,YAAa,+EACf,CAAC,EACDo0B,EAAgB,CAAC,EAAG,EAAK,GAGpB,CACL,GAAIh0B,EAAM,GACV,KAAMA,EAAM,KACZ,OAAAJ,EACA,cAAAo0B,EACA,WAAY,GACZ,gBAAiB,2BACjB,SAAU,KAAiC,UAC3C,SAAUC,EAAwBj0B,EAAM,IAAI,EAC5C,oBAAqB,IACvB,CACF,CAAC,EAED,SAASi0B,EAAwB1pC,EAAkB,CACjD,OAAO,SACLwnB,EACAxQ,EACAyQ,GACA,CACA,IAAIO,EAAQR,EAAM,OAAO,CAAC,EACtBmiB,EAAO,GACX,OAAIniB,EAAM,OAAO,SAAW,IAC1BmiB,EAAOniB,EAAM,OAAO,CAAC,EAAI,QAAU,IAG9B,GAAGC,EAAS,IAAIznB,CAAQ,GAAG2pC,CAAI,IAAI3hB,CAAK,EACjD,CACF,C,2EC7GO,MAAMjc,EAAmB,CAAC,CAAE,UAAA69B,EAAY,OAAQ,IAAa,CAClE,MAAMp6C,EAAO,WAAWo6C,CAAS,WACjC,SACE,OAAC,OAAI,UAAWC,EACd,oBAAC,OACE,UAAAr6C,EAAK,OAAC,OAAC,IAAO,CAAC,OAAM,GAAC,GACzB,EACF,CAEJ,EAEMq6C,KAAyB,OAAI,CACjC,QAAS,OACT,eAAgB,QAClB,CAAC,C,gRCbM,MAAMC,EAAiB,CAAC,CAAE,SAAAjvC,EAAU,QAAAsyB,EAAS,MAAA9gB,EAAO,OAAA/f,CAAO,OAE9D,OAAC,OAAI,MAAA+f,EAAc,UAAW,GAAG/f,EAAO,OAAO,IAAIA,EAAO,cAAc,GACrE,SAAA6gC,KACC,OAAC,UAAO,UAAW7gC,EAAO,eAAgB,QAAA6gC,EACvC,SAAAtyB,CAAA,CACH,EAEAA,CAAA,CAEJ,EC2BS,EAAiB,CAAC,CAC7B,SAAAA,EACA,gBAAArE,EACA,eAAAuzC,EACA,mBAAAC,EACA,QAAAlvC,EACA,SAAA6O,EACA,KAAAyE,EACA,QAAA+e,EACA,cAAAjyB,GACA,yBAAA+uC,GACA,SAAA96B,GACA,UAAAhU,EACA,UAAA1C,EACA,SAAA2C,EACA,eAAAovB,EACA,eAAA/zB,EACF,IAAa,CACX,KAAM,CAACyzC,GAAqBC,EAAsB,KAAI,YAA8B,MAAM,EACpF,CAACC,GAAYC,EAAa,KAAI,YAAS,EAAK,EAC5CC,MAAW7Q,EAAA,GAAYrrB,CAAI,EAC3Bm8B,MAAgB9Q,EAAA,GAAYt+B,CAAS,EACrCY,MAAa,UAAeb,IAAe,WAAa,CAAC,EACzDc,MAAY,UAAkC,IAAI,EAClDC,MAAW,UAAO,CAAC,EACnBuuC,MAAgB,UAAiB,CAAC,CAAC,EACnCl+C,MAAS,MAAW,KAAWk+B,CAAc,EAC7CigB,MAAoB,UAA6C,IAAI,EACrEC,MAAqB,UAAiC,MAAS,EAC/DC,MAAc,UAA4B,MAAS,KAEzD,aAAU,IAAM,CAEV,CAACL,IAAYA,KAAal8B,IAI1B87B,KAAwB,WAE1BC,GACE/7B,EAAK,SAAWk8B,GAAS,QAAUN,IAAuB,WAAa,gBAAkB,MAC3F,EACIU,GAAmB,SACrBL,GAAc,EAAI,IAGpBG,GAAc,QAAU,CAAC,EACzBH,GAAc,EAAI,GAEtB,EAAG,CAACH,GAAqBF,EAAoB57B,EAAMk8B,EAAQ,CAAC,KAE5D,aAAU,IAAM,CACVC,IAAiBA,KAAkBpvC,GACrCgvC,GAAuB,MAAM,CAEjC,EAAG,CAACI,GAAepvC,CAAS,CAAC,KAE7B,aAAU,IAAM,CACVivC,IAAc,CAACtvC,IACjBmvC,GAAyBS,GAAmB,OAAO,EACnDA,GAAmB,QAAU,OAC7BL,GAAc,EAAK,EAEvB,EAAG,CAACD,GAAYtvC,EAASmvC,EAAwB,CAAC,EAElD,MAAMW,MAAa,eAChBxuC,IAAqC,CACpC,MAAMI,GACJJ,KAAoB,KAAgB,UAChC,SAAgB,MAAgBgS,CAAI,EAAG3V,EAAW2C,EAAUD,CAAS,KACrE,SAAa,MAAgBiT,CAAI,EAAG3V,EAAW2C,EAAUD,CAAS,EACxE,GAAI,CAACqB,IAAYwtC,IAAuB,WAAY,CAClDG,GAAuB,eAAe,EACtC,MACF,CACI/tC,KAAoB,KAAgB,OACtCouC,GAAc,QAAQ,KAAKp8B,EAAKA,EAAK,OAAS,CAAC,EAAE,GAAG,GAEpDs8B,GAAmB,QAAUt8B,EAAK,CAAC,EACnCo8B,GAAc,QAAQ,KAAKp8B,EAAK,CAAC,EAAE,GAAG,GAExC+7B,GAAuB,SAAS,EAChCxgC,IAAWnN,OAAY,MAAgB4R,CAAI,EAAGhS,EAAe,KAE7D,MAAkB,kCAAmC,CACnD,UAAWA,GACX,WAAYjB,CACd,CAAC,CACH,EACA,CAAC6uC,EAAoBrgC,EAAUyE,EAAMjT,EAAW1C,EAAW2C,CAAQ,CACrE,KAEA,aAAU,IAAM,CACd,GAAI,CAACF,IAAiB,CAACyO,GAAY,CAAC/c,EAAA,EAAO,eAAe,sBACxD,OAGF,SAASsP,GAAaC,GAA2B,CAC/C,GACE,CAACjB,IACD,CAACyO,GACD,CAACyE,EAAK,QACNu8B,GAAY,UAAY,QACxBA,GAAY,UAAY,GAExB,OAEF,MAAMvuC,MAAkB,MAAeD,GAAOH,GAAU,QAASC,GAAUf,GAAea,GAAW,OAAO,EAG5G,GAFAC,GAAU,QAAUG,GACpBJ,GAAW,QAAUb,GAAc,UAC/BgvC,KAAwB,qBAAuBA,KAAwB,iBAAkB,CAC3F,GAAIF,IAAuB,aAAe5tC,KAAoB,KAAgB,IAAK,CACjF+tC,GAAuB,gBAAgB,EACvCM,GAAkB,QAAU,WAAW,IAAM,CAC3CN,GAAwBh0C,IAAWA,KAAU,iBAAmB,OAASA,EAAM,CACjF,EAAG,GAAK,EACR,MACF,CACA,MACF,CACIiG,KAAoB,KAAgB,UACtCwuC,GAAWxuC,EAAe,CAE9B,CAEA,OAAAlB,GAAc,iBAAiB,SAAUgB,EAAY,EACrDhB,GAAc,iBAAiB,QAASgB,EAAY,EAE7C,IAAM,CACXhB,GAAc,oBAAoB,SAAUgB,EAAY,EACxDhB,GAAc,oBAAoB,QAASgB,EAAY,CACzD,CACF,EAAG,CAACguC,GAAqBF,EAAoBrgC,EAAUyE,EAAK,OAAQw8B,GAAY1vC,EAAa,CAAC,KAE9F,aAAU,IACD,IAAM,CACPuvC,GAAkB,SACpB,aAAaA,GAAkB,OAAO,CAE1C,EACC,CAAC,CAAC,EAEL,MAAMI,MAAc,eAAY,IAAM,CAChCJ,GAAkB,SACpB,aAAaA,GAAkB,OAAO,EAExCG,GAAW,KAAgB,GAAG,CAChC,EAAG,CAACA,EAAU,CAAC,EAETE,MAAiB,eAAY,IAAM,CACvCF,GAAW,KAAgB,MAAM,CACnC,EAAG,CAACA,EAAU,CAAC,EAETG,MAAW,eACf,CAAC,CAAE,MAAAp3C,GAAO,MAAA0Y,EAAM,IACV,CAAC+B,EAAKza,EAAK,GAAKu2C,KAAwB,UAExC,OAACJ,EAAA,CACC,MAAAz9B,GACA,OAAA/f,GACA,QAAS49C,KAAwB,oBAAsBY,GAAiB,OAEvE,SAAAE,EAAkCd,GAAqB/uC,CAAS,EACnE,KAIF,OAAC8vC,EAAA,IACC,gBAAAz0C,EACA,MAAA7C,GACA,IAAKya,EAAKza,EAAK,EACf,KAAAya,EACA,QAAA+e,EACA,SAAAhe,GACA,MAAA9C,GACA,OAAA/f,GACA,UAAAmM,EACA,SAAA2C,EACA,QAAS8vC,GAAkB98B,EAAMza,GAAO62C,GAAc,OAAO,EAC7D,eAAAhgB,EACA,eAAA/zB,GACA,WAAYszC,CAAA,CACd,EAGJ,CACEvzC,EACAuzC,EACAG,GACAY,GACA18B,EACA+e,EACAhe,GACAhU,EACA7O,GACAmM,EACA2C,EACAovB,EACA/zB,EACF,CACF,EAEM00C,MAAkB,eACrBnyC,IAAoC,CAOnC,GANI,CAACkC,KAGDlC,GAAM,oBAAsB,IAC9B2xC,GAAY,QAAUzvC,GAAc,cAAgBA,GAAc,cAEhEyvC,GAAY,SAAWT,KAAwB,WAAaA,KAAwB,iBACtF,OAEF,MAAMkB,GAAeh9B,EAAK,OAAS,EAC7Bi9B,GAAiBj9B,EAAK,OAAS,EACjCpV,GAAM,kBAAoBoyC,GAC5BjB,GAAuB,mBAAmB,EACjCnxC,GAAM,kBAAoBqyC,IACnClB,GAAuB,MAAM,CAEjC,EACA,CAACD,GAAqB97B,EAAK,OAAQlT,EAAa,CAClD,EAEMowC,KAAa,eAAa33C,IAAmBya,EAAKza,EAAK,EAAIya,EAAKza,EAAK,EAAE,IAAMA,GAAM,SAAS,EAAI,CAACya,CAAI,CAAC,EAEtGm9B,EAAYn9B,EAAK,QAAUzE,GAAYugC,KAAwB,OAAS97B,EAAK,OAAS,EAAIA,EAAK,OAErG,SACE,oBACG,UAAA87B,KAAwB,qBACvB,OAAC,OAAI,UAAW59C,GAAO,qBACrB,mBAACw9C,EAAc,CAAC,MAAO,CAAC,EAAG,OAAAx9C,GAAgB,QAASu+C,GACjD,kBAAE,iCAAkC,qBAAqB,EAC5D,EACF,EAEDhwC,EAAS,CAAE,WAAAywC,EAAY,UAAAC,EAAW,gBAAAJ,GAAiB,SAAAJ,EAAS,CAAC,GAChE,CAEJ,EAEA,SAASC,EAAkC70C,EAA4Bs1B,EAAsB,CAC3F,OAAQt1B,EAAO,CACb,IAAK,gBACH,SAAO,MAAE,oCAAqC,iCAAiC,EACjF,IAAK,UACH,SACE,oBACG,UAAAs1B,IAAU,KAAc,aACrB,MAAE,kCAAmC,uBAAuB,KAC5D,MAAE,kCAAmC,uBAAuB,EAAG,OACnE,OAACiM,GAAA,EAAO,CAAC,OAAM,GAAC,GAClB,EAEJ,IAAK,oBACH,SAAO,MAAE,iCAAkC,qBAAqB,EAClE,QACE,OAAO,IACX,CACF,CAEA,SAASwT,GAAkB98B,EAAsBza,EAAe62C,EAAyB,CACvF,GAAI,CAACA,EAAc,QAAU,CAACp8B,EAAKza,EAAQ,CAAC,EAC1C,OAEF,MAAM63C,EAAUp9B,EAAKza,EAAQ,CAAC,EAC9B,UAAW83C,KAAOjB,EAChB,GAAIgB,EAAQ,MAAQC,EAElB,MAAO,iBAIb,C,8FChTO,MAAMC,EAAyB,GACzBC,EAAgB,CAAC,CAAE,QAAAC,EAAS,KAAAx9B,CAAK,IAAa,CACzD,KAAM,CACJ,WAAAwvB,EACA,WAAAwD,EACA,aAAAF,EACA,gBAAAC,EACA,UAAW0K,EACX,cAAAhO,EACA,iBAAAyD,EACF,KAAI,MAAwB,EACtB,CAAE,gBAAA9qC,GAAiB,eAAAgY,EAAe,KAAI,OAAkB,EACxD,CAACob,EAAQoO,CAAS,KAAI,YAAS,EAAE,EACjC,CAAC8T,EAAeC,CAAgB,KAAI,YAAwB,IAAI,EAChErW,MAAW,UAAO,EAAE,EACpBC,MAAgB,UAAO,EAAK,EAC5BrpC,MAAS,MAAW0I,CAAS,EAE7Bg3C,MAAU,WAAQ,IAClB,CAACpiB,GAAU,CAACiU,EACP,CAAC,EAEHoO,EAAiB79B,EAAMwb,EAAQpzB,EAAe,EACpD,CAACA,GAAiB4X,EAAMwb,EAAQiU,CAAa,CAAC,EAE3CqO,MAAe,eAClBv0C,IAAqC,CACpC+9B,GAAS,QAAU/9B,GAAE,OAAO,SAC5B,mBAAgB,IAAM,CACpBqgC,EAAUtC,GAAS,OAAO,CAC5B,CAAC,EACG,CAACC,GAAc,SAAW,CAACnnB,QAC7B,MAAkB,2BAA2B,EAC7CmnB,GAAc,QAAU,GAE5B,EACA,CAACnnB,EAAc,CACjB,EAEM29B,MAAa,eAAY,IAAM,CACnC,GAAIL,IAAkB,KACpB,OAEF,MAAMzE,GAAOyE,EAAgB,EAAIA,EAAgB,EAAIE,GAAQ,OAAS,EACtED,EAAiB1E,EAAI,EACrBuE,GAAS,aAAax9B,EAAK,QAAQ49B,GAAQ3E,EAAI,CAAC,EAAG,QAAQ,CAC7D,EAAG,CAACyE,EAAeF,EAASx9B,EAAM49B,EAAO,CAAC,EAEpCI,MAAa,eAAY,IAAM,CACnC,GAAIN,IAAkB,KACpB,OAEF,MAAMO,GAAOP,EAAgBE,GAAQ,OAAS,EAAIF,EAAgB,EAAI,EACtEC,EAAiBM,EAAI,EACrBT,GAAS,aAAax9B,EAAK,QAAQ49B,GAAQK,EAAI,CAAC,EAAG,QAAQ,CAC7D,EAAG,CAACP,EAAeF,EAASx9B,EAAM49B,EAAO,CAAC,EAyC1C,MAvCA,aAAU,IAAM,CACd,GAAI,CAACA,GAAQ,OAAQ,CACnBD,EAAiB,IAAI,EACrB,MACF,CACKD,IACHC,EAAiB,CAAC,EAClBH,GAAS,aAAax9B,EAAK,QAAQ49B,GAAQ,CAAC,CAAC,EAAG,QAAQ,EAE5D,EAAG,CAACF,EAAeF,EAASx9B,EAAM49B,EAAO,CAAC,KAE1C,aAAU,IAAM,CACTnO,IACH7F,EAAU,EAAE,EACZ6T,EAAiB,MAAS,EAC1B1K,EAAgB,IAAI,EAExB,EAAG,CAACtD,EAAegO,EAAkB1K,CAAe,CAAC,KAErD,aAAU,IAAM,CACd,MAAMmL,GAAkBN,GAAQ,IAAK3/C,IAAQA,GAAI,GAAG,EAC9CkgD,GAAWrL,KAAe,OAAeA,EAAcoL,EAAe,EAAI,GAE5EpL,GAAgB,CAACqL,IAEnBn+B,EACG,OAAQ/hB,IAAQ60C,EAAa,SAAS70C,GAAI,GAAG,CAAC,EAC9C,OAAQmgD,IAAoBR,GAAQ,UAAWS,IAAgBA,GAAY,MAAQD,GAAgB,GAAG,EAAI,CAAC,EAC3G,QAASngD,IAAQA,GAAI,iBAAiB,MAAS,CAAC,EAGrDw/C,EAAiBjiB,GAAkB,MAAS,EACvC2iB,GAEOP,GAAQ,QAClB7K,EAAgB,IAAI,EAFpBA,EAAgBmL,GAAgB,OAASA,GAAkB,IAAI,CAInE,EAAG,CAACl+B,EAAM49B,GAAS9K,EAActX,EAAQiiB,EAAkB1K,CAAe,CAAC,EAEvE,CAACtD,EACH,OAAO,KAGT,MAAM7S,GACJpB,IAAW,MAAK,mBAAG,YAAGkiB,IAAkB,KAAOA,EAAgB,EAAI,CAAC,IAAIE,IAAS,QAAU,CAAC,GAAG,EAAM,OAEvG,SACE,QAAC,OAAI,UAAW1/C,GAAO,UACrB,oBAAC,OAAI,UAAWA,GAAO,QACrB,mBAACmqC,EAAA,GACC,SAAUyV,GACV,UAAS,GACT,eAAa,MAAE,yCAA0C,gBAAgB,EACzE,OAAAlhB,EAAA,CACF,EACF,KACA,OAAC1zB,EAAA,GACC,KAAK,cACL,QAAQ,YACR,WAAS,MACP,4BACA,yKACF,EACF,KACA,OAACA,EAAA,GACC,QAAS60C,GACT,SAAU,CAACH,IAAW,CAACA,GAAQ,OAC/B,KAAK,WACL,gBAAY,MAAE,4BAA6B,iBAAiB,EAC9D,KACA,OAAC10C,EAAA,GACC,QAAS80C,GACT,SAAU,CAACJ,IAAW,CAACA,GAAQ,OAC/B,KAAK,aACL,gBAAY,MAAE,4BAA6B,aAAa,EAC1D,KACA,OAAC10C,EAAA,GACC,QAASgqC,GACT,SAAU,CAAC0K,IAAW,CAACA,GAAQ,OAC/B,UAAW5K,EAAa90C,GAAO,oBAAsB,OACrD,KAAK,SACL,gBAAY,MAAE,8BAA+B,sBAAsB,EACrE,KACA,OAACgL,EAAA,EAAU,CAAC,QAASsmC,EAAY,KAAK,QAAQ,gBAAY,MAAE,6BAA8B,cAAc,EAAG,GAC7G,CAEJ,EAEM5oC,EAAaC,IAA0B,CAC3C,aAAW,OAAI,CACb,WAAYA,EAAM,OAAO,WAAW,SACpC,QAAS,OACT,IAAKA,EAAM,QAAQ,CAAC,EACpB,QAASA,EAAM,QAAQ,CAAC,EACxB,OAAQA,EAAM,OAAO,MACrB,SAAU,SACV,MAAO,MACT,CAAC,EACD,WAAS,OAAI,CACX,MAAO,KACT,CAAC,EACD,uBAAqB,OAAI,CACvB,UAAW,CACT,QAAS,QACT,QAAS,MACT,SAAU,WACV,OAAQ,EACR,aAAcA,EAAM,MAAM,OAAO,QACjC,OAAQ,EACR,gBAAiBA,EAAM,OAAO,UAAU,gBACxC,MAAO,MACP,QAAS,CACX,CACF,CAAC,CACH,GAEA,SAASg3C,EAAiB79B,EAAsBwb,EAAgBpzB,EAA2B,CACzF,MAAM8I,EAAQ,IAAI,UAAO,MAAYsqB,CAAM,EAAG,GAAG,EAC3C8iB,EAAat+B,EAAK,OAAQ/hB,GAC1BA,EAAI,MAAM,MAAMiT,CAAK,EAChB,GAGF9I,EAAgB,KAAMgE,GAAUnO,EAAI,uBAAuBmO,CAAK,EAAE,MAAM8E,CAAK,CAAC,CACtF,EACD,OAAAotC,EAAW,QAASrgD,GAAQA,EAAI,iBAAiBu9B,CAAM,CAAC,EACjD8iB,CACT,C,eC/LO,MAAMC,EAAiB,IAAM,CAClC,KAAM,CAAE,WAAA/O,EAAY,cAAAC,EAAe,WAAAC,CAAW,KAAI,MAAwB,KAE1E,aAAU,IAAM,CACd,SAAS8O,EAAmBzwC,EAAsB,CAChD,MAAM0wC,EAAQ,UAAU,UAAU,SAAS,KAAK,EAC1CC,EAAS3wC,EAAM,MAAQ,KAAOA,EAAM,MAAQ,IAElD,GAAK0wC,GAAS1wC,EAAM,SAAW2wC,GAAY,CAACD,GAAS1wC,EAAM,SAAW2wC,EAAS,CAC7EhP,EAAW,EACX,MACF,CACI3hC,EAAM,MAAQ,UAAY0hC,GAC5BD,EAAW,CAEf,CACA,gBAAS,iBAAiB,UAAWgP,CAAkB,EAChD,IAAM,CACX,SAAS,oBAAoB,UAAWA,CAAkB,CAC5D,CACF,CAAC,CACH,E,eCtBO,MAAMG,EAAkBp/B,GAA4C,CACzE,KAAM,CAACmjB,EAAcC,CAAe,KAAI,YAA2B,CACjE,UAAW,GACX,YAAa,KACb,uBAAwB,CAAE,EAAG,EAAG,EAAG,CAAE,CACvC,CAAC,EACK,CAACC,EAA2BC,CAA4B,KAAI,YAAS,EAAK,EAC1EK,KAAuB,UAAoC,IAAI,EAC/D,CAAE,uBAAA5iB,EAAwB,oBAAAD,CAAoB,KAAI,OAAkB,EAEpEijB,MAAuB,eAAY,IACnC,CAAC9kC,EAAA,EAAO,eAAe,uBAAsB,MAAsB,EAC9D,GAEF,GAAQ8hB,GAA0BD,GACxC,CAACC,EAAwBD,CAAmB,CAAC,EAE1CkjB,MAAmB,eAAY,IAAM,CACrCL,EAAqB,UACvB,SAAS,oBAAoB,QAASA,EAAqB,OAAO,EAClE,SAAS,oBAAoB,cAAeA,EAAqB,OAAO,EACxEA,EAAqB,QAAU,MAEjCP,EAAgB,CACd,UAAW,GACX,uBAAwB,CAAE,EAAG,EAAG,EAAG,CAAE,EACrC,YAAa,IACf,CAAC,CACH,EAAG,CAAC,CAAC,EAECa,MAAoB,eACvBj6B,IAAa,CACZ,MAAI,MAAgBA,GAAE,MAAM,GAAK,CAACgW,GAAkB,SAAShW,GAAE,MAAM,EAAG,CAEtEg6B,GAAiB,EACjB,MACF,CACI,SAAS,aAAa,GAAG,SAAS,GAGtCA,GAAiB,CACnB,EACA,CAACA,GAAkBhkB,CAAgB,CACrC,EAEMwhB,KAAsB,eAC1B,CAACx3B,GAA4BtC,KAA+B,CAC1D,MAAMy8B,GAAY,SAAS,aAAa,GAAG,SAAS,EACpD,GAAI,CAACA,GACH,MAAO,GAKT,GAHIn6B,GAAE,WACJ,MAAkB,EAEhB+5B,GAAqB,IAAM,GAE7B,MAAO,EAAAI,GAGT,GAAI,CAACnkB,EACH,MAAO,GAGT,MAAMokB,GAAa,IACbC,GAAc,IACdlK,GAAInwB,GAAE,QAAUo6B,GAAa,OAAO,WAAa,OAAO,WAAaA,GAAap6B,GAAE,QACpFs6B,GAAIt6B,GAAE,QAAUq6B,GAAc,OAAO,YAAc,OAAO,YAAcA,GAAcr6B,GAAE,QAE9F,OAAAo5B,EAAgB,CACd,UAAAe,GACA,uBAAwB,CAAE,EAAAhK,GAAG,EAAAmK,EAAE,EAC/B,YAAa58B,EACf,CAAC,EACDi8B,EAAqB,QAAUM,GAC/B,SAAS,iBAAiB,QAASA,EAAiB,EACpD,SAAS,iBAAiB,cAAeA,EAAiB,EACnD,EACT,EACA,CAACjkB,EAAkBikB,GAAmBF,EAAoB,CAC5D,EAEMQ,KAAuB,eAAY,IAAM,CAC7CP,GAAiB,EACjBV,EAA6B,EAAI,CACnC,EAAG,CAACU,EAAgB,CAAC,EAEfQ,KAAkB,eAAY,IAAM,CACxClB,EAA6B,EAAK,CACpC,EAAG,CAAC,CAAC,EAECmB,KAAmB,eAAY,IAAM,IACzC,MAAmB,EACnBnB,EAA6B,EAAK,CACpC,EAAG,CAAC,CAAC,EAEL,MAAO,CACL,iBAAAU,GACA,oBAAAxC,EACA,gBAAAgD,EACA,iBAAAC,EACA,qBAAAF,EACA,aAAApB,EACA,0BAAAE,CACF,CACF,E,eCGO,MAAMgc,EAAU,CAAC,CACtB,IAAA/2C,EACA,gBAAAO,EACA,WAAAygC,EACA,iBAAAtpB,EACA,qBAAAE,EACA,YAAAiC,EACA,cAAA9B,EACA,iBAAAJ,EACA,SAAA2a,GACA,aAAAta,GACA,SAAAC,GAAWL,EAAwB3E,EAAA,EAAM,IAAI,GAAG2E,CAAoB,WAAW,GAAK,UAAa,UACjG,cAAApU,EACA,mBAAAmO,EACA,QAAA2iB,EACA,mBAAAyf,EACA,sBAAAiD,GAAwB,MACxB,oBAAA9+B,GACA,QAAArT,GACA,SAAA6O,GACA,uBAAA0E,GACA,KAAAD,GACA,SAAAE,GACA,mBAAAC,GACA,eAAAC,GACA,mBAAA/Y,GACA,sBAAAC,GACA,oBAAA+Y,GACA,uBAAAC,GACA,iBAAAnV,GACA,iBAAAC,GACA,mBAAAmV,GACA,eAAAC,GACA,iBAAAC,GACA,UAAAlY,GACA,cAAAmY,GACA,YAAAC,EACA,iBAAAtB,EACA,0BAAA7W,GACA,WAAA0W,GACA,aAAA4C,GAAerC,EAAuB3E,EAAA,EAAM,QAAQ,GAAG2E,CAAoB,sBAAuB,EAAI,EAAI,GAC1G,mBAAA9D,GACA,aAAAkF,GACA,kBAAAi+B,GACA,kBAAAh+B,GACA,SAAAC,GACA,iBAAAC,GACA,UAAAjU,GACA,mBAAAhP,GAAqB0hB,EAAuB3E,EAAA,EAAM,QAAQ,GAAG2E,CAAoB,sBAAuB,EAAI,EAAI,GAChH,UAAApV,GACA,oBAAA4W,GACA,SAAAjU,GACA,eAAA3E,EACF,OAEI,OAACyW,GAAA,IACC,IAAAjX,EACA,iBAAA0X,EACA,cAAAK,EACA,YAAA8B,EACA,gBAAAtZ,EACA,iBAAAoX,EACA,aAAAK,GACA,SAAAC,GACA,mBAAAtG,EACA,oBAAAuG,GACA,KAAAC,GACA,SAAAE,GACA,uBAAAD,GACA,qBAAAR,EACA,mBAAAU,GACA,eAAAC,GACA,mBAAA/Y,GACA,sBAAAC,GACA,oBAAA+Y,GACA,uBAAAC,GACA,iBAAAnV,GACA,iBAAAC,GACA,mBAAAmV,GACA,eAAAC,GACA,iBAAAC,GACA,UAAAlY,GACA,cAAAmY,GACA,YAAAC,EACA,iBAAAtB,EACA,0BAAA7W,GACA,WAAA0W,GACA,aAAA4C,GACA,mBAAAnG,GACA,aAAAkF,GACA,kBAAAC,GACA,SAAAC,GACA,iBAAAC,GACA,UAAAjU,GACA,mBAAAhP,GACA,oBAAAkjB,GACA,eAAA5Y,GAEA,mBAACoqC,EAAA,GAA4B,CAC3B,mBAACsM,EAAA,CACC,iBAAAx/B,EACA,WAAAspB,EACA,SAAA1O,GACA,cAAA9uB,EACA,QAAA8wB,EACA,sBAAA0iB,GACA,mBAAAjD,EACA,QAAAlvC,GACA,SAAA6O,GACA,KAAAyE,GACA,aAAAa,GACA,kBAAAi+B,GACA,UAAAz0C,GACA,SAAA2C,EAAA,CACF,EACF,EACF,EAIE+xC,EAAmB,CAAC,CACxB,iBAAAx/B,EACA,WAAAspB,EACA,SAAA1O,EAAW,IAAIC,EAAA,EACf,cAAA/uB,EACA,QAAA8wB,EACA,sBAAA0iB,EAAwB,MACxB,mBAAAjD,EAAqB,WACrB,QAAAlvC,EACA,SAAA6O,GACA,KAAAyE,GACA,aAAAa,GACA,kBAAAi+B,EACA,UAAAz0C,EACA,SAAA2C,CACF,IAA6B,CAC3B,KAAM,CACJ,IAAAnF,EACA,gBAAAO,GACA,cAAAwX,GACA,YAAA8B,GACA,aAAA7B,GACA,SAAAC,GACA,YAAAiD,GACA,kBAAAwB,GACA,eAAAC,GACA,oBAAAnE,GACA,uBAAAC,GACA,iBAAAjB,GACA,aAAAyC,GACA,YAAAT,GACA,SAAAN,GACA,iBAAAC,GACA,UAAAjU,GACA,oBAAAkU,GACA,cAAA6C,GACA,eAAAzb,EACF,KAAI,OAAkB,EAChB,CAAC22C,GAAeC,CAAgB,KAAI,YAAyB,CAAC,CAAC,EAC/D,CAACC,EAAYC,EAAa,KAAI,YAASC,GAAc7/B,EAAkB1X,CAAG,CAAC,EAC3EhB,MAAQ,MAAU,EAClB22C,MAAU,UAAgC,IAAI,EAC9C6B,MAAW,UAAO9/B,EAAiB,WAAW,EAC9C+/B,MAAa,UAA8B,IAAI,EAC/C5T,MAAY,UAA8B,IAAI,EAC9CtP,MAAiB,WAAQ,IAAM,IAAI,KAAsBv1B,GAAOiZ,EAAQ,EAAG,CAACjZ,GAAOiZ,EAAQ,CAAC,EAC5F0tB,MAAa,WACjB,IACEnlC,GACI,CAAC,EACD+zB,GAAe,yBACb4iB,GACA52C,GACA6Y,GACAD,EACF,EACN,CAAC5Y,GAAiB42C,GAAeh+B,GAAkBC,GAAqBmb,GAAgB/zB,EAAc,CACxG,EACMnK,MAAS,MAAW,EAAWsvC,GAAYplC,GAAiB,CAAE,SAAA2Y,EAAS,CAAC,EACxEw+B,GAAiBD,GAAW,SAAW//B,EACvC,CACJ,iBAAAgkB,GACA,oBAAAxC,GACA,gBAAAgD,GACA,iBAAAC,GACA,qBAAAF,GACA,aAAApB,GACA,0BAAAE,EACF,EAAI+b,EAAeW,GAAW,OAAO,EACrCf,EAAe,EACf,KAAM,CAAE,WAAAvL,GAAY,aAAAF,GAAc,cAAArD,EAAc,KAAI,MAAwB,EAEtE+P,MAAoB,WACxB,IACE3/B,GAAa,SAAW,EAAIm/B,GAAgBA,GAAc,OAAQ/gD,IAAQ4hB,GAAa,SAAS5hB,GAAI,QAAQ,CAAC,EAC/G,CAAC4hB,GAAcm/B,EAAa,CAC9B,EAEMr7B,MAAe,WACnB,IACEmvB,IAAgBE,GACZwM,GAAkB,OAAQvhD,IAAQ60C,GAAa,SAAS70C,GAAI,GAAG,CAAC,EAChEuhD,GACN,CAACxM,GAAYwM,GAAmB1M,EAAY,CAC9C,EAIM2M,MAA2B,WAAQ,OAChC,YAAUl6C,IAAkB,CACjCi4C,GAAQ,SAAS,gBAAgBj4C,EAAK,EACtCm6C,GAAiB,QAAU,GAC7B,EAAG,CAAC,EACH,CAAC,CAAC,EAECC,MAAwB,WAAQ,OAC7B,YAAS,CAACp6C,GAAeq6C,KAAkB,CAChDpC,GAAQ,SAAS,aAAaj4C,GAAOq6C,EAAK,CAC5C,EAAG,GAAG,EACL,CAAC,CAAC,KAEL,aAAU,IAAM,CACd,MAAM/kB,GAAeV,EAAS,UAAU,KAAoB5wB,IAC1DuxB,EAAoBvxB,GAAGoa,GAAc65B,GAAQ,OAAO,CACtD,EACA,MAAO,IAAM3iB,GAAa,YAAY,CACxC,EAAG,CAACV,EAAUxW,EAAY,CAAC,KAE3B,aAAU,IAAM,CACds7B,KACE,MACEj/B,GACA,CACE,cAAA3U,EACA,OAAQ0X,IAAe,GACvB,aAAAjB,GACA,MAAO/U,GACP,SAAAC,EACA,eAAAovB,GACA,eAAA/zB,EACF,EACA8zB,CACF,CACF,EACAC,GAAe,kBAAkB,EACjCohB,GAAQ,SAAS,gBAAgB,CAAC,CACpC,EAAG,CAACz6B,GAAa1X,EAAe8wB,EAASnc,GAAM8B,GAAc/U,GAAWC,EAAUovB,GAAgB/zB,EAAc,CAAC,KAEjH,aAAU,IAAM,CACdm1C,GAAQ,SAAS,gBAAgB,CAAC,CACpC,EAAG,CAACn1C,GAAgBgZ,GAAajZ,GAAiBwX,EAAa,CAAC,KAEhE,mBAAgB,IAAM,CACpB,MAAMyC,GAAgB1F,IAA+B,CACnDwiC,GAAcC,GAAc7/B,EAAkB1X,EAAK4nC,EAAa,CAAC,EAC7D4P,GAAS,UAAY1iC,GAAM,YAAY,QACzC0iC,GAAS,QAAU1iC,GAAM,YAAY,MAEzC,EACMD,GAAW,IAAI,eAAgBD,IAAmC,CAClEA,GAAQ,QACV4F,GAAa5F,GAAQ,CAAC,CAAC,CAE3B,CAAC,EACD,OAAAC,GAAS,QAAQ6C,CAAgB,EAC1B,IAAM7C,GAAS,WAAW,CACnC,EAAG,CAAC7U,EAAK0X,EAAkBkwB,EAAa,CAAC,EAEzC,MAAMiQ,MAAmB,UAAO,GAAQ,EAClC/D,MAAiB,eACrB,CAACp2C,GAAeoiB,GAAY0C,KAAoB,CAC1CA,KAAW,QACb+R,GAAe,iBAAiBzU,GAAI43B,GAAgBl1B,EAAM,EAExD9kB,KAAUm6C,GAAiB,UAG/BA,GAAiB,QAAUn6C,GAAQm6C,GAAiB,QAAUn6C,GAAQm6C,GAAiB,QACvFD,GAAyBC,GAAiB,OAAO,EACnD,EACA,CAACD,GAA0BrjB,GAAgBmjB,EAAc,CAC3D,EAEMM,MAAuB,eAC1B5hD,IAAuB,CACtB,MAAM6hD,GAAc7hD,GAAMA,GAAI,IAAMohB,GACpC,GAAIygC,GAAa,CACf,MAAMv6C,GAAQy5C,GAAc,UAAW/gD,IAAQA,GAAI,MAAQ6hD,EAAW,EACtE,GAAIv6C,IAAS,EAAG,CACdi4C,GAAQ,SAAS,aAAaj4C,GAAO,OAAO,EAC5C,MACF,CACF,CACAi4C,GAAQ,SAAS,aAAaqB,IAA0B,MAAQ,EAAIG,GAAc,OAAS,CAAC,CAC9F,EACA,CAACH,EAAuBx/B,GAAkB2/B,EAAa,CACzD,EAEMe,MAAqB,eACzB,CAACx2C,GAA4BtL,KAAsB,CAC7C8iC,GAAoBx3B,GAAGtL,EAAG,GAI9B6lB,GAAc7lB,EAAG,CACnB,EACA,CAAC8iC,GAAqBjd,EAAa,CACrC,EAEMqjB,MAAe,eAClBlpC,IAAsB,CACrB,MAAMsH,GAAQoe,GAAa,UAAWq8B,IAAgBA,GAAY,MAAQ/hD,GAAI,GAAG,EAC7EsH,IAAS,GACXo6C,GAAsBp6C,GAAO,OAAO,CAExC,EACA,CAACo6C,GAAuBh8B,EAAY,CACtC,EAEM4rB,MAAY,WAAQ,OAAM,MAAkByP,EAAa,EAAG,CAACA,EAAa,CAAC,EAEjF,MAAI,CAACz/B,GAAoB2/B,GAAc,KAE9B,QAIP,QAAC,OAAI,UAAWhhD,GAAO,iBACpB,UAAA2iB,OAAgB,OAACyZ,GAAA,GAAe,CAAC,UAAAiV,GAAsB,SAAApV,CAAA,CAAoB,EAC3EzY,KAAgB,WAAaL,GAAY,OAAS,MACjD,OAAC0pB,EAAA,IACC,iBAAAxrB,EACA,aAAA4nB,GACA,KAAMxjB,GACN,UAAAtZ,EACA,SAAA2C,EACA,aAAA6T,EAAA,CACF,KAEF,QAAC,OAAI,UAAW3iB,GAAO,eAAgB,IAAKohD,GACzC,UAAA5c,GAAa,WAAaA,GAAa,gBACtC,OAACuB,GAAA,GACC,MAAOV,GACP,IAAKb,GAAa,YAClB,UAAWA,GAAa,UACvB,GAAGA,GAAa,uBACjB,oBAAAriB,GACA,uBAAAC,GACA,UAAWwjB,EAAA,CACb,EAEDlB,OACC,OAACsB,EAAA,GACC,OAAM,GACN,SAAO,MAAE,sCAAuC,cAAc,EAC9D,QACE,oBACE,oBAAC,MAAK,CAAC,QAAQ,wCAAwC,gIAGvD,KACA,QAAC,OAAI,UAAWhmC,GAAO,SACrB,oBAAC+jC,EAAA,EAAI,CAAC,KAAK,UAAW,MACtB,OAAC,MAAK,CAAC,QAAQ,iDAAiD,sCAA0B,GAC5F,GACF,EAEF,eAAa,MAAE,wCAAyC,SAAS,EACjE,KAAK,uBACL,UAAW+B,GACX,UAAWD,EAAA,CACb,KAEF,OAACwZ,EAAa,CAAC,KAAMiC,GAAmB,QAAShC,GAAQ,QAAS,KAClE,OAAC,GACC,gBAAAp1C,GACA,eAAAuzC,GACA,mBAAAC,EACA,QAAAlvC,EACA,KAAMiX,GACN,SAAApI,GACA,QAASwkC,GACT,cAAerU,GAAU,QACzB,SAAA3qB,GACA,UAAAhU,GACA,UAAA1C,EACA,SAAA2C,EACA,yBAA0B6yC,GAC1B,eAAAzjB,GACA,eAAA/zB,GAEC,UAAC,CAAE,WAAA60C,GAAY,UAAAC,GAAW,gBAAAJ,GAAiB,SAAAJ,EAAS,OACnD,OAAC,MACC,UAAWz+C,GAAO,QAClB,OAAQghD,EACR,UAAA/B,GACA,SAAU,KAAe,KAAK,KAAM/gB,GAAgBzY,GAAc47B,GAAgBn3C,GAAiB,CACjG,YAAAsZ,GACA,kBAAA6C,GACA,eAAAC,GACA,eAAgB5E,KAAkB,KAAkB,KACpD,YAAAyB,GACA,SAAAN,GACA,KAAM1Y,EACR,CAAC,EACD,QAAS60C,GACT,OAAO,WACP,gBAAAH,GACA,SAAUrR,GACV,cAAe,EACf,IAAK8R,GACL,MAAOn1C,GAAiB,CAAE,UAAW,QAAS,EAAI,CAAE,SAAU,QAAS,EACvE,MAAM,OAEL,SAAAs0C,EAAA,CACH,EAEJ,GACF,EACCmC,GAAqBE,GAAc,OAAS,GAAKnW,MAChD,OAAC,KAAoB,CAAC,iBAAAtpB,EAAoC,WAAAspB,EAAwB,KAAMmW,EAAA,CAAe,GAE3G,CAEJ,EAEA,SAAS,EACPn4C,EACA2mC,EACAplC,EACA,CAAE,SAAA2Y,CAAS,EACX,CACA,MAAMk/B,EAAUl/B,EAAWysB,EAAaA,EAAW,OAAO,CAAC11B,EAAGvS,IAAUA,EAAQ,CAAC,EACjF,MAAO,CACL,WAAS,OAAI,CACX,wBAAyB,CACvB,QAAS,OACT,uBAAqB,MAAuB06C,EAAS73C,CAAe,EACpE,WAAY,CACV,SAAU,QACZ,CACF,CACF,CAAC,EACD,oBAAkB,OAAI,CACpB,QAAS,OACT,cAAe,cAEf,SAAUvB,EAAM,QAAQ,EAAE,CAC5B,CAAC,EACD,kBAAgB,OAAI,CAClB,SAAU,WACV,MAAO,MACT,CAAC,EACD,YAAU,OAAI,CACZ,QAAS,cACT,WAAY,SACZ,IAAKA,EAAM,QAAQ,CAAC,EACpB,MAAOA,EAAM,OAAO,KAAK,UACzB,QAAS,GACT,SAAUA,EAAM,WAAW,UAAU,SACrC,UAAWA,EAAM,QAAQ,CAAC,CAC5B,CAAC,CACH,CACF,CAEA,SAASi0B,EAAoB/sB,EAA0BiS,EAAsBkgC,EAA+B,CAC1G,GAAInyC,EAAM,QAAQ,WAAa,MAC7BmyC,GAAM,SAAS,CAAC,UACPnyC,EAAM,QAAQ,WAAa,SACpCmyC,GAAM,aAAalgC,EAAK,OAAS,CAAC,MAC7B,CAEL,MAAMza,EAAQya,EAAK,UAAW/hB,GAAQA,EAAI,MAAQ8P,EAAM,QAAQ,QAAQ,EACpExI,GAAS,GACX26C,GAAM,aAAa36C,EAAO,QAAQ,CAEtC,CACF,CAEA,SAAS65C,GAAc7/B,EAAkC1X,EAAc4nC,EAAgB,GAAO,CAC5F,OACG5nC,IAAQ,KAAQ,QACb,KAAK,IAAI,OAAO,YAAc,GAAK0X,EAAiB,YAAY,EAChEA,EAAiB,eAAiBkwB,EAAgB6N,EAAyB,EAEnF,C,sGCllBO,MAAM6C,EAAmB,kBAC1BC,EAAwB,UAE9B,SAASC,EAAsBrgC,EAAgD,CAC7E,MAAMsgC,EAAe,IAAI,IACzB,OAAAtgC,EAAK,QAAS/hB,IAAQ,CACpB,MAAMsiD,EAAOC,EAAqBviD,EAAG,EACjCsiD,IAAS,QACXD,EAAa,IAAIC,CAAI,CAEzB,CAAC,EACM,CAAC,GAAGD,CAAY,CACzB,CAEO,SAASE,EAAqBviD,EAAqD,CACxF,MAAI,iBAAkBA,GAAOA,EAAI,aACxBA,EAAI,aAENA,EAAI,OAAOkiD,CAAgB,IAAM,OACnCliD,EAAI,OAAO,wBAA0BmiD,EACtC,MACN,CAEA,SAASK,EAA+BzgC,EAAsC0gC,EAAqB,CACjG,MAAMt4C,GAA4B,CAAC,EAEnC,OAAAs4C,EAAU,QAASC,GAAa,EACf,QAAyCC,EAA4B,GAC7E,QAASx0C,GAAU,CACnBhE,GAAgB,SAASgE,CAAK,GACjChE,GAAgB,KAAKgE,CAAK,CAE9B,CAAC,CACH,CAAC,EAEMhE,GAAgB,OACpBgE,GACCA,IAAU,KACVA,IAAUy0C,GACV7gC,EAAK,KAAM/hB,GAAQA,EAAI,OAAOmO,CAAK,IAAM,MAAS,CACtD,CACF,CAMO,SAAS00C,EAA0B9gC,EAAgD,CACxF,OAAOygC,EAA+BzgC,EAAMqgC,EAAsBrgC,CAAI,CAAC,CACzE,CAGA,SAAS+gC,EAA4BJ,EAAkB,CAEvD,CAKO,SAASK,GAA0BhhC,EAAgD,CAExF,OADkBqgC,EAAsBrgC,CAAI,EAC7B,OAGAihC,EAA8B,EAE/B,OACX70C,GACCA,IAAU,KACVA,IAAUy0C,GACV7gC,EAAK,KAAM/hB,GAAQA,EAAI,OAAOmO,CAAK,IAAM,MAAS,CACtD,EATS,CAAC,CAUZ,CAEA,SAAS60C,GAAgC,CACvC,MAAO,CAAC,aAAc,GAAGL,EAA4B,CAAC,CACxD,CAEA,SAASA,GAA8B,CACrC,MAAO,CACL,cACA,iBACA,oBACA,IACAC,CACF,CACF,CAEA,MAAMK,EACJ,sIACIC,GACJ,6FAEWN,EAAsC,4BAE5C,SAASO,EAAuBnjD,EAAmBoK,EAAyB,CAOjF,MAAMs0B,EANmB,OAAO,KAAK1+B,EAAI,MAAM,EAAE,OAC9C8T,GACC,CAACmvC,EAA0B,KAAKnvC,CAAK,GACrC,CAACovC,GAAsB,KAAKpvC,CAAK,GACjCA,IAAU8uC,CACd,EAEG,IAAKz0C,GAAWnO,EAAI,OAAOmO,CAAK,EAAI,GAAGA,CAAK,IAAInO,EAAI,OAAOmO,CAAK,CAAC,GAAK,EAAG,EACzE,KAAK,GAAG,EACX,OAAK/D,EAGEs0B,EAFEA,EAAW,QAAQ,KAAgB,EAAE,CAGhD,C,4NCvGO,MAAM0kB,EAAmB,CAAC,CAC/B,SAAAhpB,EACA,MAAA9yB,EACA,YAAA+yB,EACA,MAAAn6B,EACA,MAAAoV,EACA,WAAA0R,EACA,cAAAsT,CACF,IAA6C,CAC3C,KAAM,CAACxwB,EAAOywB,EAAQ,KAAI,YAGvB,CAAC,CAAC,EAEL,SACE,OAACC,EAAA,IACC,QAAS6oB,EAAoBhpB,EAAa/yB,CAAK,EAC/C,UAAWpH,IAAU,GACrB,gBAAe,GACf,WAAY,SAAY,CACtBq6B,GAAS,CAAE,UAAW,EAAK,CAAC,EAC5B,MAAME,EAAU,MAAM6oB,GAAkBhuC,EAAO0R,EAAYsT,CAAa,EACxEC,GAAS,CAAE,QAAAE,EAAS,UAAW,MAAU,CAAC,CAC5C,EACA,UAAW3wB,EAAM,UACjB,iBAAgB,GAChB,iBAAiB,kBACjB,eAAe,iBACf,QAASA,EAAM,QACf,MAAOy5C,EAASrjD,CAAK,EACrB,SAAWA,GAAUk6B,EAAS9yB,EAAOpH,EAAM,KAAM,EACnD,CAEJ,EAEA,eAAeojD,GACbhuC,EACA0R,EACAsT,EAC4B,CAC5B,IAAIhtB,EAAoCgI,EAAM,OAE9C,MAAMmiC,EAAcnd,EAAc,aAAahtB,CAAM,EAGrD,OAFyB,MAAM0Z,EAAW,iBAAiB,YAAY,CAAE,eAAgBywB,CAAY,CAAC,GAExF,IAAKhc,IAAO,CACxB,MAAOA,EACP,MAAOA,CACT,EAAE,CACJ,CAEA,MAAM8nB,EACJrjD,IACkE,CAAE,MAAOA,GAAO,SAAS,EAAG,MAAAA,CAAM,G,eCjD/F,SAASsjD,EACd5+C,EACA6+C,EACiC,CACjC,MAAMz6B,EAAS,CAAC06B,GAAuB,CAAC,EAClCtG,EAAgB,CAAC,SAAS,EAChC,IAAIuG,EAEJ,OAAI/+C,IAAS,KAAgB,mBAC3Bw4C,EAAc,KAAK,MAAM,EACzBp0B,EAAO,KAAK,CACV,KAAM,WACN,KAAM,QACR,CAAC,GAGCy6B,IACFz6B,EAAO,KAAK,CACV,KAAM,WACN,KAAM,SACN,UAAW,GACX,SAAU,EACZ,CAAC,EAED26B,EAAsBC,GAAuB,KAAKh/C,CAAI,KAAK,GAGtD,CACL,GAAIA,EACJ,KAAMi/C,EAA4Bj/C,CAAI,EACtC,OAAAokB,EACA,cAAAo0B,EACA,WAAY,GACZ,gBAAiB,iBACjB,SAAU,KAAiC,eAC3C,UAAW,KAAmB,oBAC9B,SAAU0G,EACV,oBAAqBC,EACrB,oBAAAJ,EACA,eAAgB,CAAC96B,EAAI8B,IAAQ,CAC3B,IAAIq5B,EAAS,KAAU,KAAMvoB,IAAMA,GAAE,aAAe5S,EAAG,EAAE,GAAG,eAAiB,GAE7E,OAAIA,EAAG,OAAO,CAAC,IAAM,UACZ,GAAGm7B,CAAM,sQAET,GAAGA,CAAM,wHAAwHn7B,EAAG,OAAO,CAAC,CAAC,KAExJ,CACF,CACF,CAEO,SAASo7B,GAAiCr/C,EAAiD,CAChG,MAAMs/C,EAAiBV,EAAqB5+C,EAAM,EAAI,EAEhDokB,EAASk7B,EAAe,OAAO,MAAM,EAAG,EAAE,EAkDhD,MAjDsD,CACpDA,EACA,CACE,GAAI,KAAKt/C,CAAI,MACb,KAAM,GAAGi/C,EAA4Bj/C,CAAI,CAAC,MAC1C,OAAQ,CACN,GAAGokB,EACH,CACE,KAAM,QACN,KAAM,SACN,UAAW,GACX,SAAU,GACV,OAAQo6B,CACV,CACF,EACA,cAAe,CAAC,GAAGc,EAAe,cAAe,EAAE,EACnD,WAAY,GACZ,gBAAiB,+BACjB,SAAU,KAAiC,eAC3C,SAAUC,EAAwCv/C,EAAM,IAAI,EAC5D,oBAAqBw/C,GAA2Bx/C,CAAI,EACpD,eAAgBy/C,GAAwBz/C,EAAM,IAAI,EAClD,oBAAqBm/C,EACrB,aAAc,EAChB,EACA,CACE,GAAI,KAAKn/C,CAAI,WACb,KAAM,GAAGi/C,EAA4Bj/C,CAAI,CAAC,WAC1C,OAAQ,CACN,GAAGokB,EACH,CACE,KAAM,QACN,KAAM,SACN,UAAW,GACX,SAAU,GACV,OAAQo6B,CACV,CACF,EACA,cAAe,CAAC,GAAGc,EAAe,cAAe,EAAE,EACnD,gBAAiB,+BACjB,SAAU,KAAiC,eAC3C,SAAUC,EAAwCv/C,EAAM,SAAS,EACjE,oBAAqBw/C,GAA2Bx/C,CAAI,EACpD,eAAgBy/C,GAAwBz/C,EAAM,SAAS,EACvD,oBAAqBm/C,EACrB,aAAc,EAChB,CACF,CAGF,CAEO,SAASI,EAAwCG,EAAqBh6B,EAA4B,CACvG,OAAO,SACL6Q,EACAxQ,EACAyQ,EACA,CACA,MAAMmpB,EAAiB55B,EAAI,OAAO,UAAWgR,GAAUA,EAAM,SAAS,EAChE3S,EAASmS,EAAM,OAAO,MAAM,EAAGopB,CAAc,EAC7CC,GAAarpB,EAAM,OAAO,MAAMopB,CAAc,EAEpD,OAAIv7B,EAAO,SAAW,GAAKs7B,IAAgB,KAAgB,iBAClD,GAAGA,CAAW,IAAIt7B,EAAO,CAAC,CAAC,KAAKoS,CAAS,KAAKpS,EAAO,CAAC,CAAC,MAAMsB,CAAQ,KAAKk6B,GAAW,KAAK,IAAI,CAAC,IAGjG,GAAGF,CAAW,IAAIlpB,CAAS,KAAKpS,EAAO,CAAC,CAAC,MAAMsB,CAAQ,KAAKk6B,GAAW,KAAK,IAAI,CAAC,GAC1F,CACF,CAEA,SAASV,EACP3oB,EACAxQ,EACAyQ,EACA,CACA,MAAMpS,EAASmS,EAAM,QAAU,CAAC,EAC1BspB,EAAcz7B,EAAO,CAAC,GAAK,UAEjC,GAAIA,EAAO,SAAW,GAAKmS,EAAM,KAAO,KAAgB,iBAAkB,CACxE,MAAMupB,EAAW17B,EAAO,CAAC,EACzB,MAAO,GAAGmS,EAAM,EAAE,IAAIupB,CAAQ,KAAKtpB,CAAS,KAAKqpB,CAAW,IAC9D,CAEA,MAAO,GAAGtpB,EAAM,EAAE,IAAIC,CAAS,KAAKpS,EAAO,CAAC,GAAK,SAAS,IAC5D,CAEO,SAAS27B,EACdxpB,EACAxQ,EACAyQ,EACA,CAGA,MAFyB,CAAC,IAAK,KAAM,IAAK,IAAI,EAEzB,SAAS,OAAOD,EAAM,OAAO,CAAC,CAAC,CAAC,EAC5C,GAAGC,CAAS,MAAMD,EAAM,OAAO,CAAC,CAAC,IAAIA,EAAM,OAAO,CAAC,CAAC,IAAIA,EAAM,OAAO,CAAC,CAAC,GAGzE,GAAGC,CAAS,MAAMD,EAAM,OAAO,CAAC,CAAC,IAAIA,EAAM,OAAO,CAAC,CAAC,MAAMA,EAAM,OAAO,CAAC,CAAC,IAClF,CAEO,SAASypB,EACdn9B,EACAo9B,EACS,CACT,GAAI,CAACp9B,EACH,MAAO,GAET,MAAMq9B,EAAsBr9B,EAAU,OAAO,CAAC,EAAE,SAAS,EAAE,WAAW,GAAG,EAmBzE,OAjBmBo9B,EAAgB,OAChCE,GACCA,EAAe,KAAO,gBAAgB,aACtCA,EAAe,OAAO,CAAC,IAAMt9B,EAAU,OAAO,CAAC,GAC/Cs9B,EAAe,OAAO,CAAC,IAAMt9B,EAAU,OAAO,CAAC,CACnD,EAE4B,KAAMu9B,GAC5B,GAAAF,GAAuBE,EAAU,OAAO,CAAC,EAAE,SAAS,EAAE,WAAW,GAAG,IAAM,IAG1EF,IAAwB,IAASE,EAAU,OAAO,CAAC,EAAE,SAAS,EAAE,WAAW,GAAG,EAInF,CAGH,CAEO,SAASC,GACd9pB,EACAxQ,EACAyQ,EACA,CACA,OAAQD,EAAM,GAAI,CAChB,KAAK,KAAgB,OACnB,KAAM,CAAC+pB,EAAS,GAAOC,EAAY,GAAO,GAAG73C,CAAM,EAAI6tB,EAAM,OAC7D,MAAO,GAAGC,CAAS,YAAY8pB,EAAS,YAAc,EAAE,GAAGC,EAAY,gBAAkB,EAAE,IAAI73C,EAC5F,OAAQwG,GAAUA,CAAK,EACvB,KAAK,IAAI,CAAC,GAAG,KAAK,EACvB,KAAK,KAAgB,KACnB,MAAO,GAAGsnB,CAAS,WAAWD,EAAM,OAAO,OAAQQ,GAAUA,CAAK,EAAE,KAAK,IAAI,CAAC,GAAG,KAAK,EACxF,KAAK,KAAgB,KACnB,MAAO,GAAGP,CAAS,WAAWD,EAAM,OAAO,OAAQQ,GAAUA,CAAK,EAAE,KAAK,IAAI,CAAC,GAAG,KAAK,EACxF,KAAK,KAAgB,KACnB,MAAO,GAAGP,CAAS,WAAWD,EAAM,OAAO,OAAQQ,GAAUA,CAAK,EAAE,KAAK,IAAI,CAAC,GAAG,KAAK,EACxF,QACE,MAAO,GAAGP,CAAS,MAAMD,EAAM,EAAE,EACrC,CACF,CAEA,SAASiqB,EAAsBz6B,EAAsC,CACnE,OAAOA,EAAI,WAAa,KAAiC,cAC3D,CAEA,SAAS06B,EACP3N,EACApd,EACAgrB,EACA,CACA,MAAMh+C,EAAQowC,EAAW,UAAWjc,GAAM,CACxC,MAAMrS,EAAQkR,EAAc,uBAAuBmB,EAAE,EAAE,EACvD,OAAKrS,EAGEk8B,EAAUl8B,CAAK,EAFb,EAGX,CAAC,EAED,OAAO9hB,IAAU,GAAKowC,EAAW,OAASpwC,CAC5C,CAEO,SAASy8C,EACdp5B,EACArV,EACAiwC,EACiB,CACjB,MAAMC,EAAsC,CAC1C,GAAI76B,EAAI,GACR,OAAQA,EAAI,aACd,EAEM+sB,EAAa,CAAC,GAAGpiC,EAAM,UAAU,EAEjCmwC,EAA8B/N,EAAW,KAAMjc,GAAM,CACzD,MAAMrS,EAAQm8B,EAAS,uBAAuB9pB,EAAE,EAAE,EAClD,OAAKrS,EAGEg8B,EAAsBh8B,CAAK,EAFzB,EAGX,CAAC,EAED,OAAQuB,EAAI,SAAU,CACpB,KAAK,KAAiC,aACtC,KAAK,KAAiC,UAEpC,GAAI,CAAC86B,EAA6B,CAChC,MAAMC,EAAgBL,EACpB3N,EACA6N,EACC56B,IAAQA,GAAI,WAAa,KAAiC,SAC7D,EACA+sB,EAAW,OAAOgO,EAAe,EAAG,CAAE,GAAI,KAAgB,KAAM,OAAQ,CAAC,SAAS,CAAE,CAAC,CACvF,CACAhO,EAAW,KAAK8N,CAAY,EAC5B,MACF,KAAK,KAAiC,eAEpC,GAAIC,EAA6B,CAC/B,MAAMn+C,EAAQowC,EAAW,QAAQ+N,CAA2B,EAC5D/N,EAAWpwC,CAAK,EAAIk+C,EACpB,KACF,CAGF,QACE,MAAME,EAAgBL,EACpB3N,EACA6N,EACC9pB,IAAO9Q,EAAI,WAAa,MAAQ8Q,EAAE,WAAa,IAClD,EACAic,EAAW,OAAOgO,EAAe,EAAGF,CAAY,EAChD,KACJ,CAEA,MAAO,CACL,GAAGlwC,EACH,WAAAoiC,CACF,CACF,CAEO,SAASiO,EAAsBh7B,EAAsCrV,EAAyC,CACnH,MAAO,CACL,GAAGA,EACH,cAAe,CACb,GAAIA,EAAM,eAAiB,CAAC,EAC5B,CACE,SAAU,IACV,MAAAA,CACF,CACF,CACF,CACF,CAEO,SAASswC,EAAsBn+B,EAAmBo+B,EAA2B,CAClF,OAAO,SACL1qB,EACAxQ,EACAyQ,EACA,CACA,MAAM0qB,EAAe3qB,EAAM,OAAO,KAAMQ,GAAU,OAAOA,GAAU,UAAYA,EAAM,SAAS,GAAG,CAAC,EAC5FoqB,EAAYD,EAAe,IAAM,IACvC,IAAI98B,GAQJ,OAPI88B,EACF98B,GAASmS,EAAM,OAAO,IAAKQ,GACzB,OAAOA,GAAU,YAAW,MAAgCA,CAAK,EAAIA,CACvE,EAEA3S,GAASmS,EAAM,OAEb0qB,EACK,GAAGzqB,CAAS,IAAI3T,CAAS,IAAIs+B,CAAS,OAAO/8B,GAAO,KAAK,GAAG+8B,CAAS,OAAOA,CAAS,MAAM,CAAC,GAAGA,CAAS,GAE1G,GAAG3qB,CAAS,IAAI3T,CAAS,IAAIs+B,CAAS,GAAG/8B,GAAO,KAAK,GAAG+8B,CAAS,OAAOA,CAAS,EAAE,CAAC,GAAGA,CAAS,EACzG,CACF,CAEA,SAASrC,IAAwD,CAC/D,MAAO,CACL,KAAM,QACN,KAAM,SACN,QAAS,CAAC,SAAS,EACnB,YACE,0GACJ,CACF,CAEO,SAASL,EAAoBhpB,EAAqB2rB,EAAoB,CAC3E,MAAO,cAAc3rB,CAAW,UAAU2rB,CAAU,EACtD,CAEO,SAASpC,GAAuBqC,EAA6B,CAClE,OAAO,SAAwB3+C,EAAeuhB,EAA2B8B,EAAsC,CAI7G,OAAI9B,EAAG,OAAO,SAAW8B,EAAI,OAAO,OAC3B,CACL,GAAG9B,EACH,GAAIo9B,CACN,EAEKp9B,CACT,CACF,CAKO,SAASw7B,GAAwB6B,EAAyB5f,EAA6B,CAC5F,OAAO,SAA8BnL,EAA8B,CACjE,MAAM7tB,EAAS6tB,EAAM,OAAO,IAAKrnB,GAAU,KAAKA,CAAK,IAAI,EAAE,KAAK,OAAO,EACjEqyC,EAAY,IAAU,QAAShrB,EAAM,OAAO,MAAM,EAExD,OAAQmL,EAAM,CACZ,IAAK,KACH,MAAO,cAAc4f,CAAe,qCAAqCC,CAAS,IAAI74C,CAAM,IAC9F,IAAK,UACH,MAAO,cAAc44C,CAAe,wBAAwB54C,CAAM,oCACpE,QACE,MAAO,cAAc44C,CAAe,uBACxC,CACF,CACF,CAKO,SAAS9B,GAA2B6B,EAA6B,CACtE,OAAO,SAAwB3+C,EAAeuhB,EAA2B8B,EAAsC,CAG7G,OAAI9B,EAAG,OAAO,OAAS8B,EAAI,OAAO,OACzB,CACL,GAAG9B,EACH,GAAIo9B,CACN,EAGKp9B,CACT,CACF,CAEO,SAASg7B,EAA4B15B,EAAkB,CAC5D,SAAO,cAAWA,EAAS,QAAQ,KAAM,GAAG,CAAC,CAC/C,CAEO,SAASi8B,EAAkDz7B,EAAsCrV,EAAU,CAChH,MAAMkwC,EAAsC,CAC1C,GAAI76B,EAAI,GACR,OAAQA,EAAI,aACd,EAEA,MAAO,CACL,GAAGrV,EACH,WAAY,CAAC,GAAGA,EAAM,WAAYkwC,CAAY,CAChD,CACF,CAEO,SAASa,EACdzhD,EACA0hD,EAAsD,CAAC,EACpB,CAqEnC,MApEsD,CACpD,CACE,GAAI1hD,EACJ,KAAMi/C,EAA4Bj/C,CAAI,EACtC,OAAQ,CACN,CACE,KAAM,WACN,KAAM,SACN,UAAW,GACX,SAAU,EACZ,CACF,EACA,cAAe,CAAC,EAChB,WAAY,GACZ,gBAAiB,qBACjB,SAAU,KAAiC,aAC3C,SAAU2hD,EACV,oBAAqB3C,GAAuB,KAAKh/C,CAAI,KAAK,EAC1D,eAAgBy/C,GAAwBz/C,EAAM,EAAE,EAChD,oBAAqBwhD,EACrB,GAAGE,CACL,EACA,CACE,GAAI,KAAK1hD,CAAI,MACb,KAAM,GAAGi/C,EAA4Bj/C,CAAI,CAAC,MAC1C,OAAQ,CACN,CACE,KAAM,QACN,KAAM,SACN,UAAW,GACX,SAAU,GACV,OAAQw+C,CACV,CACF,EACA,cAAe,CAAC,EAAE,EAClB,gBAAiB,kBACjB,SAAU,KAAiC,aAC3C,SAAUoD,EAAyB5hD,CAAI,EACvC,oBAAqBw/C,GAA2Bx/C,CAAI,EACpD,eAAgBy/C,GAAwBz/C,EAAM,IAAI,EAClD,oBAAqBwhD,EACrB,aAAc,GACd,GAAGE,CACL,EACA,CACE,GAAI,KAAK1hD,CAAI,WACb,KAAM,GAAGi/C,EAA4Bj/C,CAAI,CAAC,WAC1C,OAAQ,CACN,CACE,KAAM,QACN,KAAM,SACN,UAAW,GACX,SAAU,GACV,OAAQw+C,CACV,CACF,EACA,cAAe,CAAC,EAAE,EAClB,gBAAiB,kBACjB,SAAU,KAAiC,aAC3C,SAAUqD,EAA8B7hD,CAAI,EAC5C,oBAAqBw/C,GAA2Bx/C,CAAI,EACpD,eAAgBy/C,GAAwBz/C,EAAM,SAAS,EACvD,oBAAqBwhD,EACrB,aAAc,GACd,GAAGE,CACL,CACF,CAGF,CAEA,SAASG,EAA8BnC,EAAqB,CAC1D,OAAO,SACLnpB,EACAxQ,EACAyQ,EACA,CACA,MAAO,GAAGkpB,CAAW,YAAYnpB,EAAM,OAAO,KAAK,IAAI,CAAC,MAAMC,CAAS,GACzE,CACF,CAEO,SAASmrB,EACdprB,EACAxQ,EACAyQ,EACA,CACA,MAAMpS,EAAS09B,EAAavrB,EAAOxQ,EAAKyQ,CAAS,EAC3ClzB,EAAMizB,EAAM,GAAK,IAEvB,OAAIC,GACFpS,EAAO,KAAKoS,CAAS,EAGhBlzB,EAAM8gB,EAAO,KAAK,IAAI,EAAI,GACnC,CAEA,SAAS09B,EAAavrB,EAA8BxQ,EAAsCyQ,EAAmB,CAC3G,OAAQD,EAAM,QAAU,CAAC,GAAG,IAAI,CAACj7B,EAAOoH,IACrBqjB,EAAI,OAAOrjB,CAAK,EACpB,OAAS,SACb,IAAMpH,EAAQ,IAGhBA,CACR,CACH,CAEA,SAASsmD,EAAyBlC,EAAqB,CACrD,OAAO,SACLnpB,EACAxQ,EACAyQ,EACA,CACA,MAAO,GAAGkpB,CAAW,OAAOnpB,EAAM,OAAO,KAAK,IAAI,CAAC,MAAMC,CAAS,GACpE,CACF,CAEO,SAASurB,EACd/hD,EACAgiD,EACAN,EAAsD,CAAC,EACpB,CACnC,MAAM5O,EAAa2O,EAA2BzhD,EAAM0hD,CAAS,EAC7D,OAAA5O,EAAW,CAAC,EAAE,OAAO,QAAQ,GAAGkP,EAAU,MAAM,EAChDlP,EAAW,CAAC,EAAE,OAAO,QAAQ,GAAGkP,EAAU,MAAM,EAChDlP,EAAW,CAAC,EAAE,OAAO,QAAQ,GAAGkP,EAAU,MAAM,EAChDlP,EAAW,CAAC,EAAE,cAAgBkP,EAAU,cACxClP,EAAW,CAAC,EAAE,cAAgB,CAAC,GAAGkP,EAAU,cAAe,EAAE,EAC7DlP,EAAW,CAAC,EAAE,cAAgB,CAAC,GAAGkP,EAAU,cAAe,EAAE,EAC7DlP,EAAW,CAAC,EAAE,SAAWmP,EAAsCjiD,CAAI,EACnE8yC,EAAW,CAAC,EAAE,SAAWmP,EAAsCjiD,CAAI,EAC5D8yC,CACT,CAEA,SAASmP,EAAsCvC,EAAqB,CAClE,OAAO,SACLnpB,EACAxQ,EACAyQ,EACA,CACA,MAAMmpB,EAAiB55B,EAAI,OAAO,UAAWgR,IAAUA,GAAM,SAAS,EAChE3S,EAASmS,EAAM,OAAO,MAAM,EAAGopB,CAAc,EAC7CC,EAAarpB,EAAM,OAAO,MAAMopB,CAAc,EAEpD,MAAO,GAAGD,CAAW,OAAOE,EAAW,KAAK,IAAI,CAAC,MAAMx7B,EACpD,IAAI,CAAC2S,GAAOmrB,IAASn8B,EAAI,OAAOm8B,CAAG,EAAE,OAAS,SAAW,IAAKnrB,EAAK,IAAOA,EAAM,EAChF,KAAK,IAAI,CAAC,KAAKP,CAAS,GAC7B,CACF,C,qUCxiBO,SAAS2rB,EAAM,CACpB,OAAAh7C,EAAS,GACT,UAAAi7C,EAAY,GACZ,MAAA74C,EACA,OAAAwzB,EACA,UAAAslB,EAAY,EACd,EAAyC,CACvC,MAAMhnD,KAAS,OAAW0I,CAAS,EAE7Bk3C,KAAe,eAAY,IAAM,IACrC,MAAkB,4CAA6C,CAC7D,OAAA9zC,CACF,CAAC,EACD41B,EAAOxzB,EAAM,IAAI,CACnB,EAAG,CAACpC,EAAQoC,EAAM,KAAMwzB,CAAM,CAAC,EAE/B,SACE,oBACE,qBAAC,OAAI,UAAW1hC,EAAO,YACrB,oBAACinD,EAAA,GACC,UAAWjnD,EAAO,cAClB,SAAO,MAAuBkO,EAAM,IAAI,EACxC,SAAU0xC,EACV,QAAS9zC,CAAA,CACX,EACCk7C,MACC,QAAC,UAAO,UAAWhnD,EAAO,WAAY,QAAS4/C,EAC5C,UAAA1xC,EAAM,MAAM,wBAAwB,KACvC,GAEJ,EACC64C,MACC,OAAChjB,EAAA,GACC,gBAAY,KAAE,oDAAqD,oBAAoB,EACvF,SAAO,KAAE,qDAAsD,0BAA0B,EACzF,KAAK,gBACL,KAAK,KACL,UAAW/jC,EAAO,SACpB,GAEJ,CAEJ,CAEA,SAAS0I,EAAUC,EAAsB,CACvC,MAAO,CACL,YAAU,OAAI,CACZ,OAAQ,OACR,WAAYA,EAAM,QAAQ,CAAC,EAC3B,QAAS,EACX,CAAC,EACD,cAAY,OAAI,CACd,WAAYA,EAAM,QAAQ,EAAG,EAC7B,YAAaA,EAAM,QAAQ,EAAG,EAC9B,WAAY,OACZ,WAAY,OACZ,OAAQ,OACR,SAAUA,EAAM,WAAW,QAAQ,EAAE,EACrC,QAAS,EACX,CAAC,EACD,eAAa,OAAI,CACf,QAAS,OACT,WAAY,SACZ,eAAgB,gBAChB,MAAO,MACT,CAAC,EAED,iBAAe,OAAI,CACjB,SAAU,CACR,SAAU,SACV,aAAc,WACd,WAAY,SACZ,QAAS,QACT,SAAU,MACZ,CACF,CAAC,CACH,CACF,CC9EO,MAAMu+C,GAAe,CAAC,CAAE,aAAAC,EAAc,MAAAC,EAAO,OAAAt5C,EAAQ,QAAAu5C,EAAS,gBAAAC,EAAiB,OAAA5lB,CAAO,IAAa,CACxG,MAAM1hC,KAAS,OAAWunD,CAAmB,EAEvChhB,MAAY,eACfzhC,GAAuB,CACtB,GAAI,CAACA,EAAO,YACV,OAEF,MAAM0iD,EAAkB,CAAC,GAAGL,CAAY,EAClCx2C,EAAUw2C,EAAariD,EAAO,OAAO,KAAK,EAEhD0iD,EAAgB,OAAO1iD,EAAO,OAAO,MAAO,CAAC,EAC7C0iD,EAAgB,OAAO1iD,EAAO,YAAY,MAAO,EAAG6L,CAAO,EAE3D02C,EAAQG,CAAe,CACzB,EACA,CAACL,EAAcE,CAAO,CACxB,EAEMv7C,MAAS,WACb,IAAM,CACJ,GAAGq7C,EACA,IACExiD,GAASmJ,EAAO,KAAMI,GAAUA,EAAM,OAASvJ,CAAI,GAAK2iD,EAAgB,KAAMp5C,GAAUA,EAAM,OAASvJ,CAAI,CAC9G,EACC,OAAQuJ,GAAUA,IAAU,MAAS,CAC1C,EACA,CAACi5C,EAAcr5C,EAAQw5C,CAAe,CACxC,EAEMG,MAAY,WAChB,IAAMH,EAAgB,OAAQI,GAAmB,CAACP,EAAa,SAASO,EAAe,IAAI,CAAC,EAC5F,CAACP,EAAcG,CAAe,CAChC,EAEA,OAAIx7C,GAAO,QAAU27C,GAAU,UAE3B,oBACE,qBAAC,OAAI,UAAWznD,EAAO,aACrB,oBAAC,KAAK,CAAC,QAAQ,kDAAkD,2BAAe,KAChF,OAAC,UAAO,QAASonD,EAAO,UAAWpnD,EAAO,mBACxC,mBAAC,KAAK,CAAC,QAAQ,wCAAwC,iBAAK,EAC9D,GACF,KACA,OAAC,MAAe,CAAC,UAAAumC,GACf,mBAAC,MAAS,CAAC,YAAY,eAAe,UAAU,WAC7C,SAACC,MACA,QAAC,OAAI,UAAWxmC,EAAO,cAAgB,GAAGwmC,EAAS,eAAgB,IAAKA,EAAS,SAC9E,UAAA16B,GAAO,IAAI,CAACoC,EAAO7G,OAClB,OAAC,OACC,YAAa6G,EAAM,KAEnB,MAAA7G,EACA,eAAgB,CAAC8/C,EAAa,SAASj5C,EAAM,IAAI,EAEhD,UAACs4B,EAA6BmhB,QAC7B,OAAC,OACC,aAAW,MAAG3nD,EAAO,KAAM2nD,GAAS,WAAa3nD,EAAO,SAAW,MAAS,EAC5E,IAAKwmC,EAAS,SACb,GAAGA,EAAS,eACZ,GAAGA,EAAS,gBACb,SAAO,KACL,kCACA,wDACA,CAAE,UAAWt4B,EAAM,KAAM,WAAYA,EAAM,MAAM,uBAAwB,CAC3E,EAEA,mBAAC44C,EAAA,CACC,OAAQK,EAAa,SAASj5C,EAAM,IAAI,EACxC,MAAAA,EACA,OAAAwzB,EACA,UAAWylB,EAAa,SAASj5C,EAAM,IAAI,EAC7C,EACF,GAtBGA,EAAM,IAwBb,CACD,EACAs4B,EAAS,aACZ,EAEJ,EACF,EACCihB,GAAU,OAAS,MAClB,oBACE,oBAAC,OAAI,UAAWznD,EAAO,gBACrB,mBAAC,KAAK,CAAC,QAAQ,mDAAmD,qBAAS,EAC7E,KACA,OAAC,OAAI,UAAWA,EAAO,cACpB,SAAAynD,GAAU,IAAKv5C,MACd,OAAC,OAAI,UAAWlO,EAAO,KACrB,mBAAC8mD,EAAK,CAAC,MAAA54C,EAAc,OAAAwzB,CAAA,CAAgB,GADLxzB,EAAM,IAExC,CACD,EACH,GACF,GAEJ,EAIG,IACT,EAEO,SAASq5C,EAAoB5+C,EAAsB,CACxD,MAAO,CACL,QAAM,OAAI,CACR,UAAWA,EAAM,QAAQ,CAAC,EAC1B,aAAcA,EAAM,QAAQ,CAAC,EAC7B,QAAS,OACT,WAAYA,EAAM,OAAO,WAAW,OACtC,CAAC,EACD,YAAU,OAAI,CACZ,WAAYA,EAAM,OAAO,WAAW,SACtC,CAAC,EACD,gBAAc,OAAI,CAChB,QAAS,OACT,eAAgB,gBAChB,SAAUA,EAAM,WAAW,GAAG,SAC9B,WAAYA,EAAM,OAAO,WAAW,UACpC,SAAU,SACV,IAAK,EACL,KAAM,EACN,WAAYA,EAAM,QAAQ,GAAI,EAC9B,aAAcA,EAAM,QAAQ,GAAI,EAChC,cAAeA,EAAM,QAAQ,GAAI,EACjC,YAAaA,EAAM,QAAQ,GAAG,EAC9B,OAAQ,EACR,aAAcA,EAAM,QAAQ,CAAC,CAC/B,CAAC,EACD,mBAAiB,OAAI,CACnB,QAASA,EAAM,QAAQ,EAAG,EAAG,IAAM,EAAG,EACtC,MAAOA,EAAM,OAAO,KAAK,SAC3B,CAAC,EACD,sBAAoB,OAAI,CACtB,WAAY,OACZ,WAAY,OACZ,OAAQ,OACR,SAAUA,EAAM,WAAW,QAAQ,EAAE,CACvC,CAAC,EACD,iBAAe,OAAI,CACjB,aAAcA,EAAM,QAAQ,GAAG,EAE/B,YAAaA,EAAM,QAAQ,EAAG,CAChC,CAAC,CACH,CACF,CC/JA,SAAS,GAAUA,EAAsB,CACvC,MAAO,CACL,SAAO,OAAI,CACT,aAAcA,EAAM,QAAQ,CAAC,EAC7B,WAAYA,EAAM,QAAQ,IAAI,EAC9B,SAAUA,EAAM,WAAW,QAC7B,CAAC,CACH,CACF,CAEO,SAASi/C,IAAc,CAC5B,MAAM5nD,KAAS,OAAW,EAAS,EACnC,SACE,OAAC,OAAI,UAAWA,EAAO,MACrB,mBAAC,KAAK,CAAC,QAAQ,4CAA4C,qBAAS,EACtE,CAEJ,CCNO,MAAM6nD,GAAkB,CAAC,CAAE,aAAAV,EAAc,OAAAr5C,EAAQ,OAAA4zB,EAAQ,QAAA2lB,CAAQ,IAA0B,CAChG,MAAMrnD,KAAS,OAAWunD,CAAmB,EAEvCO,KAAkB,WACtB,IAAMh6C,EAAO,OAAQI,GAAU,CAACi5C,EAAa,SAASj5C,EAAM,IAAI,CAAC,EAAE,KAAK65C,CAAU,EAClF,CAACZ,EAAcr5C,CAAM,CACvB,EAEA,OAAIg6C,EAAgB,UAEhB,OAAC,OAAI,UAAW9nD,EAAO,cACpB,SAAA8nD,EAAgB,IAAK55C,MACpB,OAAC,OAEC,UAAWlO,EAAO,KAClB,SAAO,KAAE,kCAAmC,wDAAyD,CACnG,UAAWkO,EAAM,KACjB,WAAYA,EAAM,MAAM,uBAC1B,CAAC,EAED,mBAAC44C,EAAK,CAAC,MAAA54C,EAAc,OAAAwzB,EAAgB,UAAS,GAAC,GAP1CxzB,EAAM,IAQb,CACD,EACH,KAIG,OAAC05C,GAAW,EAAC,CACtB,EAEMI,EAAW,IAAI,KAAK,SAAS,OAAW,CAAE,YAAa,MAAO,CAAC,EAErE,SAASD,EAAW75B,EAAmBxsB,EAAmB,CACxD,OAAOsmD,EAAS,QAAQ95B,EAAE,KAAMxsB,EAAE,IAAI,CACxC,CChCO,MAAMumD,EAAY,CAAC,CAAE,aAAAd,EAAc,MAAAC,EAAO,OAAAt5C,EAAQ,QAAAu5C,EAAS,gBAAAC,EAAiB,OAAA5lB,CAAO,IAAa,CACrG,MAAM/4B,KAAQ,OAAU,EAClB3I,GAAS,EAAU2I,CAAK,EAE9B,SACE,OAAC,OAAI,UAAW3I,GAAO,YAErB,gCACE,oBAACknD,GAAA,CACC,aAAAC,EACA,MAAAC,EACA,OAAAt5C,EACA,QAAAu5C,EACA,gBAAAC,EACA,OAAA5lB,CAAA,CACF,KAEA,OAAC,OAAI,UAAW1hC,GAAO,aACrB,mBAAC,KAAK,CAAC,QAAQ,yCAAyC,kBAAM,EAChE,KACA,OAAC6nD,GAAe,CAAC,aAAAV,EAA4B,OAAAr5C,EAAgB,QAAAu5C,EAAkB,OAAA3lB,CAAA,CAAgB,GACjG,EACF,CAEJ,EAEA,SAAS,EAAU/4B,EAAsB,CACvC,MAAO,CACL,eAAa,OAAI,CACf,UAAW,SACX,KAAM,EACN,eAAgB,MAClB,CAAC,EACD,gBAAc,OAAI,CAChB,QAAS,OACT,eAAgB,gBAChB,SAAUA,EAAM,WAAW,GAAG,SAC9B,WAAYA,EAAM,OAAO,WAAW,UACpC,SAAU,SACV,IAAK,EACL,KAAM,EACN,WAAYA,EAAM,QAAQ,GAAI,EAC9B,aAAcA,EAAM,QAAQ,GAAI,EAChC,cAAeA,EAAM,QAAQ,GAAI,EACjC,YAAaA,EAAM,QAAQ,GAAG,EAC9B,OAAQ,EACR,aAAcA,EAAM,QAAQ,CAAC,CAC/B,CAAC,CACH,CACF,C,0BCvDO,SAASu/C,EAAY,CAAE,SAAAC,EAAU,SAAAhuB,EAAU,MAAAl6B,CAAM,EAAU,CAChE,MAAMD,KAAS,OAAW,CAAS,EACnC,SACE,oBACE,oBAACgL,EAAA,GACC,UAAWhL,EAAO,aAClB,QAASmoD,EACT,KAAK,mBACL,WAAS,KAAE,+BAAgC,kBAAkB,EAC7D,KAAK,KACP,KACA,OAAC,IAAK,CAAC,SAAQ,GAAC,UAAWnoD,EAAO,WAChC,mBAACmqC,EAAA,GACC,MAAAlqC,EACA,KAAK,OACL,eAAa,KAAE,wDAAyD,uBAAuB,EAC/F,SAAAk6B,EACA,OACEl6B,KACE,OAAC+K,EAAA,GACC,KAAK,QACL,gBAAY,KAAE,mCAAoC,OAAO,EACzD,QAAS,IAAMmvB,EAAS,EAC1B,EACE,OAER,EACF,GACF,CAEJ,CAEA,SAAS,EAAUxxB,EAAsB,CACvC,MAAO,CACL,gBAAc,OAAI,CAChB,SAAU,WACV,MAAOA,EAAM,QAAQ,EAAG,EACxB,IAAKA,EAAM,QAAQ,CAAC,EACpB,IAAK,CACH,UAAW,iBACb,CACF,CAAC,EACD,cAAY,OAAI,CACd,QAAS,GAAGA,EAAM,QAAQ,EAAG,CAAC,MAAMA,EAAM,QAAQ,EAAG,CAAC,IAAIA,EAAM,QAAQ,EAAG,CAAC,GAC5E,aAAcA,EAAM,QAAQ,CAAC,CAC/B,CAAC,CACH,CACF,CC9BA,MAAMy/C,EAAgB,IACTC,EAAY,GAEZC,EAAuB,CAAC,CAAE,iBAAAjnC,EAAkB,WAAAspB,EAAY,KAAA7oB,CAAK,IAAiC,CACzG,KAAM,CAAE,gBAAA5X,EAAiB,iBAAA+C,EAAkB,iBAAAC,EAAkB,mBAAAuQ,EAAoB,qBAAA8D,EAAqB,KACpG,MAAkB,EACd,CAACgnC,GAAeC,EAAgB,KAAI,YAAS,GAAG,EAChD,CAACn7B,EAAcC,CAAe,KAAI,YAASm7B,GAAgBlnC,EAAoB,CAAC,EAChFyK,KAAa,OAAW,GAAa,KAE3C,mBAAgB,IAAM,CACpB,MAAMxN,GAAW,IAAI,eAAgBD,IAAmC,CAClEA,GAAQ,QACViqC,GAAiBjqC,GAAQ,CAAC,EAAE,YAAY,MAAM,CAElD,CAAC,EACD,OAAAC,GAAS,QAAQ6C,CAAgB,EAC1B,IAAM7C,GAAS,WAAW,CACnC,EAAG,CAAC6C,CAAgB,CAAC,EAErB,MAAMqnC,KAAyB,eAC5B1iC,IAAkB,CACjBsH,EAAgBtH,EAAK,EACjBzE,IACF3E,EAAA,EAAM,IAAI,GAAG2E,EAAoB,uBAAwByE,EAAK,CAElE,EACA,CAACzE,EAAoB,CACvB,EAEMonC,MAAc,eAAY,IAAM,CACpClrC,IAAqB,CAAC,CAAC,KACvB,MAAkB,2CAA4C,CAC5D,OAAQvT,EAAgB,OACxB,KAAM,MACR,CAAC,CACH,EAAG,CAACA,EAAgB,OAAQuT,CAAkB,CAAC,EAEzC0qC,MAAW,eAAY,IAAM,CACjCO,EAAuBL,CAAS,KAChC,MAAkB,uCAAwC,CACxD,KAAM,MACR,CAAC,CACH,EAAG,CAACK,CAAsB,CAAC,EAErBE,MAAS,eAAY,IAAM,CAC/B,MAAM5iC,GAAQyiC,GAAgBlnC,EAAoB,EAClDmnC,EAAuB1iC,GAAQ,EAAIqiC,EAAYD,EAAgBpiC,EAAK,KACpE,MAAkB,qCAAsC,CACtD,KAAM,MACR,CAAC,CACH,EAAG,CAACzE,GAAsBmnC,CAAsB,CAAC,EAE3CvkC,MAA+B,eACnC,CAACtU,GAAO0N,GAAWoR,KAAQ,CACzB+5B,EAAuB/5B,GAAI,WAAW,KACtC,KAAsB,8BAA+B,CACnD,KAAM,MACR,CAAC,CACH,EACA,CAAC+5B,CAAsB,CACzB,EAEMG,MAAc,eACjBlkD,IAAiB,CACZuF,EAAgB,SAASvF,EAAI,EAC/BuI,IAAmBvI,EAAI,EAEvBsI,IAAmBtI,EAAI,CAE3B,EACA,CAACuF,EAAiBgD,EAAkBD,CAAgB,CACtD,EAEMq6C,MAAkB,WAAQ,IAAMwB,EAAmBhnC,EAAM5X,CAAe,EAAG,CAACA,EAAiB4X,CAAI,CAAC,EAClGhU,MAAS,WAAQ,IAAMi7C,EAAmBpe,CAAU,EAAG,CAACA,CAAU,CAAC,EAEzE,MAAI,CAAC19B,GAAoB,CAACC,GAAoB,CAACuQ,GAC7C,QAAQ,KACN,sGACF,EACO,MAEL8qC,KAAkB,EACb,QAIP,OAAC,KACC,OAAQ,CACN,MAAO,EACT,EACA,cAAe,CAAE,MAAOv8B,EAAW,kBAAmB,EACtD,KAAM,CAAE,MAAOqB,EAAc,OAAQk7B,EAAc,EACnD,YAAa,CAAE,MAAOl7B,EAAc,OAAQk7B,EAAc,EAC1D,SAAUF,EACV,SAAUhnC,EAAiB,YAAc,GACzC,SAAU8C,GAET,SAAAkJ,EAAeg7B,EAAY,KAC1B,OAACW,EAAA,CACC,aAAc9+C,EACd,MAAOy+C,GACP,SAAAR,GACA,OAAAr6C,GACA,QAAS2P,EACT,gBAAA6pC,GACA,OAAQuB,EAAA,CACV,KAEA,OAAC,OAAI,UAAWI,EAA+B,yBAC7C,mBAACj+C,EAAA,GACC,UAAWi+C,EAA+B,gBAC1C,QAASL,GACT,KAAK,mBACL,WAAS,KAAE,6BAA8B,gBAAgB,EACzD,KAAK,KACP,EACF,EAEJ,CAEJ,EAEMK,EAAiC,CACrC,4BAA0B,OAAI,CAC5B,QAAS,OACT,cAAe,SACf,eAAgB,aAChB,WAAY,SACZ,WAAY,CACd,CAAC,EACD,mBAAiB,OAAI,CACnB,OAAQ,CACV,CAAC,CACH,EAgBaC,EAAyB,CAAC,CACrC,gBAAAp9B,EACA,MAAOq9B,EACP,WAAAxe,EACA,KAAA7oB,EACA,QAAAulC,EACA,gBAAA/5B,EACA,aAAAD,EACA,OAAAqU,EACF,IAAmC,CACjC,MAAMgnB,MAAyB,eAC5B1iC,IAAkB,CACjBsH,EAAgBtH,EAAK,EACrBpJ,EAAA,EAAM,IAAI,GAAG,IAAgB,uBAAwBoJ,EAAK,CAC5D,EACA,CAACsH,CAAe,CAClB,EAEM66B,MAAW,eAAY,IAAM,CACjCO,GAAuBL,CAAS,KAChC,MAAkB,uCAAwC,CACxD,KAAM,OACR,CAAC,CACH,EAAG,CAACK,EAAsB,CAAC,EAErBE,KAAS,eAAY,IAAM,CAC/B,MAAM5iC,GAAQyiC,GAAgB,IAAgB,EAC9CC,GAAuB1iC,GAAQ,EAAIqiC,EAAYD,EAAgBpiC,EAAK,KACpE,MAAkB,qCAAsC,CACtD,KAAM,OACR,CAAC,CACH,EAAG,CAAC0iC,EAAsB,CAAC,EAErBU,KAAmB,WACvB,IACE,OAAO,KAAKt9B,CAAe,EACxB,OAAQ6B,IAAW7B,EAAgB6B,EAAM,EAAE,MAAM,EACjD,KAAK,CAACO,GAAGxsB,KACRoqB,EAAgBoC,EAAC,EAAE,QAAU,QAAapC,EAAgBpqB,EAAC,EAAE,QAAU,OACnEoqB,EAAgBoC,EAAC,EAAE,MAAQpC,EAAgBpqB,EAAC,EAAE,MAC9C,CACN,EACJ,CAACoqB,CAAe,CAClB,EAEMs7B,KAAQ,eAAY,IAAM,CAC9B+B,EAAU,KACV,MAAkB,2CAA4C,CAC5D,OAAQC,EAAiB,OACzB,KAAM,OACR,CAAC,CACH,EAAG,CAACD,EAAWC,EAAiB,MAAM,CAAC,EAEjCx8B,KAAiB,WACrB,IACE,OAAO,KAAKd,CAAe,EACxB,KAAK,CAACoC,GAAGxsB,KACRoqB,EAAgBoC,EAAC,EAAE,QAAU,QAAapC,EAAgBpqB,EAAC,EAAE,QAAU,OACnEoqB,EAAgBoC,EAAC,EAAE,MAAQpC,EAAgBpqB,EAAC,EAAE,MAC9C,CACN,EACC,OACEisB,IAAW7B,EAAgB6B,EAAM,EAAE,OAAS,cAAgB7B,EAAgB6B,EAAM,EAAE,OAAS,YAChG,EACJ,CAAC7B,CAAe,CAClB,EAEMw7B,MAAkB,WACtB,IAAMwB,EAAmBhnC,EAAMsnC,EAAkBx8B,CAAc,EAC/D,CAACA,EAAgBw8B,EAAkBtnC,CAAI,CACzC,EACMhU,MAAS,WAAQ,IAAMi7C,EAAmBpe,CAAU,EAAG,CAACA,CAAU,CAAC,EAEzE,OAAOtd,EAAeg7B,EAAY,KAChC,OAACW,EAAA,CACC,aAAcI,EACd,MAAAhC,EACA,SAAAe,GACA,OAAAr6C,GACA,QAAAu5C,EACA,gBAAAC,GACA,OAAA5lB,EAAA,CACF,KAEA,OAAC,OAAI,UAAWunB,EAA+B,yBAC7C,mBAACj+C,EAAA,GACC,UAAWi+C,EAA+B,gBAC1C,QAASL,EACT,KAAK,mBACL,WAAS,KAAE,6BAA8B,gBAAgB,EACzD,KAAK,KACP,EACF,CAEJ,EAqBaI,EAAgB,CAAC,CAC5B,aAAA7B,EACA,MAAAC,EACA,SAAAe,EACA,OAAAr6C,EACA,QAAAu5C,EACA,gBAAAC,EACA,OAAA5lB,CACF,IAA0B,CACxB,KAAM,CAAC2nB,GAAaC,EAAc,KAAI,YAAiB,EAAE,EACnDtpD,MAAS,OAAW,CAAS,EAE7BupD,KAAsB,eAAal+C,GAA0C,CACjF,GAAIA,IAAM,OAAW,CACnBi+C,GAAe,EAAE,EACjB,MACF,IACA,mBAAgB,IAAM,CACpBA,GAAej+C,EAAE,cAAc,KAAK,CACtC,CAAC,KACD,KAAsB,iCAAiC,CACzD,EAAG,CAAC,CAAC,EAEC67B,KAAiB,WAAQ,IAAM,CACnC,GAAI,CAACmiB,GACH,OAAOv7C,EAET,MAAM07C,KAAO1gB,EAAA,GACXh7B,EAAO,IAAKI,IAAUA,GAAM,IAAI,EAChCm7C,EACF,EACA,OAAOv7C,EAAO,OAAO,CAAC8L,GAAGvS,KAAUmiD,EAAK,SAASniD,EAAK,CAAC,CACzD,EAAG,CAACyG,EAAQu7C,EAAW,CAAC,EAElBI,KAA0B,WAAQ,IAAM,CAC5C,GAAI,CAACJ,GACH,OAAO/B,EAET,MAAMkC,KAAO1gB,EAAA,GACXwe,EAAgB,IAAKp5C,IAAUA,GAAM,IAAI,EACzCm7C,EACF,EACA,OAAO/B,EAAgB,OAAO,CAAC1tC,GAAGvS,KAAUmiD,EAAK,SAASniD,EAAK,CAAC,CAClE,EAAG,CAACgiD,GAAa/B,CAAe,CAAC,EAEjC,SACE,QAAC,WAAQ,UAAWtnD,GAAO,QACzB,oBAACkoD,EAAW,CAAC,SAAAC,EAAoB,SAAUoB,EAAqB,MAAOF,EAAA,CAAa,KACpF,OAACpB,EAAA,CACC,aAAAd,EACA,MAAAC,EACA,OAAQlgB,EACR,QAAAmgB,EACA,gBAAiBoC,EACjB,OAAA/nB,CAAA,CACF,GACF,CAEJ,EAEA,SAAS,EAAU/4B,EAAsB,CACvC,MAAO,CACL,WAAS,OAAI,CACX,SAAUA,EAAM,WAAW,QAAQ,EAAE,EACrC,aAAcA,EAAM,QAAQ,CAAC,EAC7B,OAAQ,OACR,QAAS,OACT,cAAe,SACf,SAAU,UACZ,CAAC,CACH,CACF,CAEA,SAASogD,EAAmBpe,EAA2C,CACrE,MAAM+e,EAAc,IAAI,IACxB,IAAIC,EAAa,EACjB,MAAMC,EAAYjf,EAAW,QAASkf,GAAc,CAClD,MAAMl9B,KAAY,OAAek9B,CAAS,EAC1CF,GAAcE,EAAU,OAGxB,MAAMx8C,GADcsf,GAAW,0BAA0B,GAE1C,QAAStf,GAAW,CAC/B,MAAMhF,EAAO,OAAO,KAAKgF,CAAM,EAC/B,OAAAhF,EAAK,QAAS1F,GAAQ+mD,EAAY,IAAI/mD,GAAM+mD,EAAY,IAAI/mD,CAAG,GAAK,GAAK,CAAC,CAAC,EACpE0F,CACT,CAAC,GAAK,CAAC,EAEHyF,IAAU6e,GAAW,aAAe,CAAC,GACxC,OAAQze,GAAU,CAACA,GAAO,QAAQ,QAAQ,MAAM,EAChD,IAAKA,IACJw7C,EAAY,IAAIx7C,EAAM,KAAMA,EAAM,OAAO,OAAQjO,GAAUA,GAAU,IAA2B,EAAE,MAAM,EACjGiO,EAAM,KACd,EAEH,MAAO,CAAC,GAAGb,GAAQ,GAAGS,EAAM,CAC9B,CAAC,EAID,MAFe,CAAC,GAAG,IAAI,IAAI87C,CAAS,CAAC,EAEvB,IAAK/1C,IAAW,CAC5B,KAAMA,EACN,MAAO,CACL,wBAAyB,KAAK,KAAM,KAAO61C,EAAY,IAAI71C,CAAK,GAAK,GAAM81C,CAAU,CACvF,CACF,EAAE,CACJ,CAEA,SAASb,EAAmBhnC,EAAsB5X,EAA2B4/C,EAA0B,CAAC,EAAG,CACzG,MAAMxC,EAAoCwC,EAAc,IAAK57C,IAAW,CACtE,KAAMA,EACN,MAAO,CACL,wBAAyB,GAC3B,CACF,EAAE,EACF,OAAI5N,EAAA,EAAO,eAAe,uBACxB,MAA0BwhB,CAAI,EAAE,QAAS5T,GAAU,CACjDo5C,EAAgB,KAAK,CACnB,KAAMp5C,EACN,MAAO,CACL,wBAAyB,GAC3B,CACF,CAAC,CACH,CAAC,EAID,CAAC47C,EAAc,QACf5/C,EAAgB,QAChB,CAACo9C,EAAgB,KAAMp5C,GAAUA,EAAM,OAAS,GAAwB,GAExEo5C,EAAgB,KAAK,CACnB,KAAM,IACN,MAAO,CACL,wBAAyB,GAC3B,CACF,CAAC,EAGIA,CACT,CAEO,SAASmB,GAAgBlnC,EAAuC,CACrE,MAAMyE,GACHzE,EACG,SAAS3E,EAAA,EAAM,IAAI,GAAG2E,CAAoB,sBAAsB,GAAK6mC,EAAe,EAAE,EACtF,SAAcA,EAEpB,OAAOpiC,EAAQqiC,EAAYA,EAAYriC,CACzC,CAEO,SAAS+jC,EAAgBxoC,EAAoD,CAClF,OAAKA,EAIE,EADO,SAAS3E,EAAA,EAAM,IAAI,GAAG2E,CAAoB,sBAAsB,GAAK6mC,EAAe,EAAE,GACpFC,EAAY,GAH1B,MAIJ,C,0FCpbY2B,GAAAA,IACVA,EAAA,IAAM,MACNA,EAAA,OAAS,SAFCA,IAAAA,GAAA,IAWAC,GAAAA,IACVA,EAAA,aAAe,eACfA,EAAA,eAAiB,kBACjBA,EAAA,UAAY,YACZA,EAAA,QAAU,UACVA,EAAA,YAAc,eACdA,EAAA,aAAe,gBACfA,EAAA,UAAY,GAAG,GAAqB,GAP1BA,IAAAA,GAAA,IAUAC,GAAAA,IACVA,EAAA,KAAO,OACPA,EAAA,OAAS,SACTA,EAAA,OAAS,SACTA,EAAA,QAAU,UACVA,EAAA,OAAS,SACTA,EAAA,WAAa,cACbA,EAAA,YAAc,eACdA,EAAA,WAAa,aACbA,EAAA,KAAO,OACPA,EAAA,KAAO,OACPA,EAAA,KAAO,OACPA,EAAA,YAAc,eACdA,EAAA,cAAgB,kBAChBA,EAAA,YAAc,gBACdA,EAAA,YAAc,gBACdA,EAAA,YAAc,gBACdA,EAAA,YAAc,gBACdA,EAAA,cAAgB,kBAChBA,EAAA,aAAe,iBACfA,EAAA,eAAiB,mBACjBA,EAAA,eAAiB,mBACjBA,EAAA,iBAAmB,qBACnBA,EAAA,UAAY,aACZA,EAAA,cAAgB,kBAChBA,EAAA,eAAiB,mBACjBA,EAAA,IAAM,MACNA,EAAA,IAAM,MACNA,EAAA,IAAM,MACNA,EAAA,IAAM,MACNA,EAAA,OAAS,SACTA,EAAA,OAAS,SACTA,EAAA,MAAQ,QACRA,EAAA,KAAO,OACPA,EAAA,QAAU,UACVA,EAAA,aAAe,kBACfA,EAAA,gBAAkB,sBAClBA,EAAA,4BAA8B,mCAC9BA,EAAA,+BAAiC,uCACjCA,EAAA,iBAAmB,uBACnBA,EAAA,oBAAsB,2BACtBA,EAAA,oBAAsB,2BACtBA,EAAA,YAAc,iBACdA,EAAA,oBAAsB,2BACtBA,EAAA,qBAAuB,4BACvBA,EAAA,OAAS,SACTA,EAAA,MAAQ,WACRA,EAAA,WAAa,gBAEbA,EAAA,SAAW,aACXA,EAAA,YAAc,gBACdA,EAAA,WAAa,gBACbA,EAAA,SAAW,cACXA,EAAA,OAAS,WACTA,EAAA,SAAW,aACXA,EAAA,YAAc,iBACdA,EAAA,QAAU,aACVA,EAAA,WAAa,iBACbA,EAAA,YAAc,iBACdA,EAAA,SAAW,cACXA,EAAA,eAAiB,qBACjBA,EAAA,YAAc,kBA7DJA,IAAAA,GAAA,IAgEAC,GAAAA,IACVA,EAAAA,EAAA,YAAc,CAAC,EAAf,cACAA,EAAAA,EAAA,QAAU,CAAC,EAAX,UACAA,EAAAA,EAAA,eAAiB,CAAC,EAAlB,iBAEAA,EAAAA,EAAA,OAAS,CAAC,EAAV,SACAA,EAAAA,EAAA,SAAW,CAAC,EAAZ,WACAA,EAAAA,EAAA,oBAAsB,CAAC,EAAvB,sBACAA,EAAAA,EAAA,KAAO,CAAC,EAAR,OARUA,IAAAA,GAAA,IAWL,MAAMC,EAAgB,CAC3B,OAAQ,CAAE,MAAO,IAAK,MAAO,IAAK,YAAa,SAAU,aAAc,EAAM,EAC7E,aAAc,CAAE,MAAO,KAAM,MAAO,KAAM,YAAa,iBAAkB,aAAc,EAAM,EAC7F,aAAc,CAAE,MAAO,KAAM,MAAO,KAAM,YAAa,gBAAiB,aAAc,EAAK,EAC3F,kBAAmB,CAAE,MAAO,KAAM,MAAO,KAAM,YAAa,uBAAwB,aAAc,EAAK,EACvG,YAAa,CAAE,MAAO,IAAK,MAAO,IAAK,YAAa,eAAgB,aAAc,EAAM,EACxF,mBAAoB,CAAE,MAAO,KAAM,MAAO,KAAM,YAAa,2BAA4B,aAAc,EAAM,EAC7G,SAAU,CAAE,MAAO,IAAK,MAAO,IAAK,YAAa,YAAa,aAAc,EAAM,EAClF,gBAAiB,CAAE,MAAO,KAAM,MAAO,KAAM,YAAa,wBAAyB,aAAc,EAAM,EACvG,SAAU,CAAE,MAAO,KAAM,MAAO,KAAM,YAAa,WAAY,aAAc,EAAM,EACnF,eAAgB,CAAE,MAAO,KAAM,MAAO,KAAM,YAAa,mBAAoB,aAAc,EAAM,CACnG,C,gaC3DO,MAAMnvC,EAAY,IACZovC,EAAsB,KAEtBC,KAAiB,QAC5B,CAAC,CACC,IAAAvqD,EACA,qBAAAwhB,EACA,KAAApG,EACA,UAAAtM,EAAY0S,EACP,IAAM,IAAI,GAAGA,CAAoB,YAAY,GAAK,KAAc,WACjE,KAAc,WAClB,SAAAzS,GACA,mBAAAuM,EACA,mBAAAC,EACA,QAAAC,EACA,cAAAC,EACA,gBAAAtR,EAAkB,CAAC,EACnB,uBAAA6X,EACA,iBAAAQ,EACA,iBAAAtV,EACA,iBAAAC,EACF,IAA2B,CACzB,MAAMi8B,MAAe,UAA8B,IAAI,EACjD,CAAC1sB,GAAcC,CAAe,KAAI,YAA2B,IAAI,EACjE,CAAC6tC,EAAWC,CAAY,KAAI,YAAwB,CAAC,CAAC,EACtD,CAACC,EAAWC,EAAY,KAAI,YAAwB,CAAC,CAAC,EACtD,CAACC,GAAaC,EAAc,KAAI,YAAS,EAAK,EAC9CC,MAAU,WAAQ,IAAM,CAAC,GAAGN,EAAWxqD,EAAK,GAAG0qD,CAAS,EAAG,CAAC1qD,EAAK0qD,EAAWF,CAAS,CAAC,EACtF,CAACO,GAAYC,EAAa,KAAI,YAAS,KAAa,UAAU,EAC9D,CAACC,GAAYC,EAAa,KAAI,YAAS,KAAa,UAAU,EAC9D,CAACC,GAASC,EAAU,KAAI,YAAS,EAAK,EACtC,CAACC,GAAoBC,EAAqB,KAAI,YAElD,IAAI,EACAC,GAAoB/pC,EACrB,IAAM,IAAI,GAAGA,CAAoB,oBAAoB,GAAK8oC,EAAoB,SAAS,EACxFA,EAAoB,SAAS,EAC3B,CAACkB,GAAYC,EAAa,KAAI,YAAS,SAASF,GAAmB,EAAE,CAAC,EAEtEG,MAAc,UAAO,IAAI,GAAa,EAEtCzvC,MAAW,MAAY,EACvBrT,MAAQ,MAAU,EAClB3I,GAAS0I,EAAUC,EAAK,EAExBwD,MAAY,WAAQ,IAAM,CAC9B,MAAM8Q,GACJpO,IAAc,KAAc,UAAYg8C,GAAQ,CAAC,EAAE,YAAcA,GAAQA,GAAQ,OAAS,CAAC,EAAE,YAC/F,IAAI3tC,GACFrO,IAAc,KAAc,UAAYg8C,GAAQA,GAAQ,OAAS,CAAC,EAAE,YAAcA,GAAQ,CAAC,EAAE,YAE3F5tC,KAAWC,KACbA,IAAQ,GAEV,MAAMpH,MAAO,OAASmH,EAAM,EACtBlH,MAAK,OAASmH,EAAI,EAUxB,MARyB,CACvB,KAAApH,GACA,GAAAC,GACA,IAAK,CACH,KAAAD,GACA,GAAAC,EACF,CACF,CAEF,EAAG,CAAC80C,GAASh8C,CAAS,CAAC,EAEjBsO,KAAqB,eAAY,SAAY,CACjD,MAAMV,GAAenB,EAAqB,MAAMA,EAAmBvb,CAAG,EAAI,KAC1E2c,EAAgBD,EAAY,CAC9B,EAAG,CAAC1c,EAAKub,CAAkB,CAAC,KAE5B,aAAU,IAAM,CACVH,IACFgC,EAAmB,KACnB,MAAkB,6BAA8B,CAC9C,eAAgBpd,EAAI,eACpB,IAAKA,EAAI,GACX,CAAC,EAEL,EAAG,CAACod,EAAoBhC,EAAMpb,CAAG,CAAC,EAElC,MAAM2rD,KAAiB,eACrB,MAAO9wC,GAA0B+wC,GAAqBC,KAAkD,CACtG,MAAM9mD,GAAS,MAAM0W,EAAcqwC,EAAkBF,EAAM,EAAG,CAC5D,MAAO1wC,EACP,UAAWN,EAAqBC,GAAO/L,CAAS,EAEhD,aAAA+8C,EACF,CAAC,EAEKE,MAAU,OAAqBhnD,GAAO,IAAI,EAAE,KAClD,OAAI+J,IAAc,KAAc,WAC9Bi9C,GAAQ,QAAQ,EAEXA,GAAQ,OAAQ9wC,IAAM,CAACD,EAAY8vC,GAAS7vC,EAAC,CAAC,CACvD,EACA,CAAC6vC,GAASrvC,EAAe3M,CAAS,CACpC,EAEMwO,MAAW,eACf,MAAOzC,GAA0B+wC,GAAqBJ,KAAwB,CAC5E,MAAMjxB,GAAW1f,KAAU,QAAUmwC,GAAgBE,GACrD3wB,GAAS,KAAa,OAAO,EAE7B,GAAI,CACF,MAAMwxB,IAAW,MAAMJ,EAAe9wC,GAAO+wC,GAAQJ,EAAU,GAAG,IAAKvwC,IAErE,CAACA,GAAE,aAAe,CAACA,GAAE,aAAa,OAAS,CAAE,GAAGA,GAAG,YAAajb,EAAI,WAAY,EAAIib,EACtF,EACM,CAAC+C,GAAOC,EAAK,KAAI,aAAU8tC,GAAU7tC,IAAWA,GAAO,YAAcle,EAAI,WAAW,EACpFme,GAAWrP,IAAc,KAAc,UAAYmP,GAAQD,GAC3DI,GAAWtP,IAAc,KAAc,UAAYkP,GAAQC,GAEjEwsC,EAAcD,IACLrsC,GAAS,OAAS,KAAI,OAAY,CAAC,GAAGA,GAAU,GAAGqsC,EAAS,EAAG17C,CAAS,EAAI07C,EACpF,EACDG,GAAcD,IACLtsC,GAAS,OAAS,KAAI,OAAY,CAAC,GAAGssC,GAAW,GAAGtsC,EAAQ,EAAGtP,CAAS,EAAI47C,EACpF,EAEDnwB,GAAS,KAAa,UAAU,EAC5B,CAACpc,GAAS,QAAUtD,KAAU,SAChCmwC,GAAc,KAAa,IAAI,EAE7B,CAAC5sC,GAAS,QAAUvD,KAAU,SAChCqwC,GAAc,KAAa,IAAI,CAEnC,MAAQ,CACN3wB,GAAS,KAAa,KAAK,CAC7B,CACF,EACA,CAACoxB,EAAgB3rD,EAAK8O,CAAS,CACjC,KAEA,aAAU,IAAM,CACTsM,IAGAwvC,KACH,QAAQ,IAAI,CAACttC,GAAS,QAAStd,EAAKwrD,EAAU,EAAGluC,GAAS,QAAStd,EAAKwrD,EAAU,CAAC,CAAC,EACpFX,GAAe,EAAI,GAEvB,EAAG,CAACD,GAAattC,GAAUtd,EAAKob,EAAMowC,EAAU,CAAC,EAEjD,MAAMQ,MAAiB,eACrB,CAACnyC,GAAsB2D,KAA+B,CAChDA,KAAc,MAAgB,OAChCF,GAAS,QAASwtC,GAAQA,GAAQ,OAAS,CAAC,CAAC,EAE7CxtC,GAAS,QAASwtC,GAAQ,CAAC,CAAC,CAEhC,EACA,CAACA,GAASxtC,EAAQ,CACpB,EAEM9C,MAAsB,eAAY,IAAM,CAC5CkxC,GAAY,QAAQ,QAClB,IAAI,KAAkB,CACpB,SAAU1rD,EAAI,GAChB,CAAC,CACH,CACF,EAAG,CAACA,EAAI,GAAG,CAAC,EAENisD,MAAmB,eAAY,IAAM,CACzC,GAAI,CAACvvC,GACH,OAEF,IAAIkD,GAAQ5f,EAAI,IACZA,EAAI,UAAU,QAEhB4f,GAAQ5f,EAAI,IAAI,QAAQA,EAAI,UAAU,MAAO0c,GAAa,KAAK,GAGjET,MACE,OAAU,CACR,QAAS,CAACS,EAAY,EACtB,MAAOtQ,GACP,cAAesQ,GAAa,WAAY,IACxC,YAAa,CACX,KAAM,CACJ,GAAIkD,EACN,CACF,CACF,CAAC,CACH,EACApE,EAAQ,KACR,MAAkB,8CAA+C,CAC/D,eAAgBxb,EAAI,cACtB,CAAC,CACH,EAAG,CAAC0c,GAAcT,GAAUjc,EAAI,UAAU,MAAOA,EAAI,eAAgBA,EAAI,IAAKwb,EAASpP,EAAS,CAAC,EAE3F8/C,MAAyB,eAC5B3f,IAAmC,CAC9B/qB,GACF,IAAM,IAAI,GAAGA,CAAoB,qBAAsB+qB,GAAO,KAAK,EAErEkf,GAAc,SAASlf,GAAO,MAAO,EAAE,CAAC,EACxCke,EAAa,CAAC,CAAC,EACfE,GAAa,CAAC,CAAC,EACfE,GAAe,EAAK,KACpB,MAAkB,2CAA4C,CAC5D,YAAate,GAAO,KACtB,CAAC,CACH,EACA,CAAC/qB,CAAoB,CACvB,EAEM2qC,MAAc,eAAY,IAAM,IACpC,MAAkB,+BAAgC,CAChD,eAAgBnsD,EAAI,eACpB,IAAKA,EAAI,GACX,CAAC,EACDwb,EAAQ,CACV,EAAG,CAACxb,EAAI,eAAgBA,EAAI,IAAKwb,CAAO,CAAC,EAEnC6B,MAAgB,eAAY,SAAY,CAC5CotC,EAAa,CAAC,CAAC,EACfE,GAAa,CAAC,CAAC,EACf,MAAMvtC,EAAmB,EACzBytC,GAAe,EAAK,CACtB,EAAG,CAACztC,CAAkB,CAAC,EAEjBhT,GAAiBoX,EAAuB,IAAM,QAAQ,GAAGA,CAAoB,kBAAmB,EAAI,EAAI,GACxG1hB,GAAqB0hB,EACvB,IAAM,QAAQ,GAAGA,CAAoB,sBAAuB,EAAI,EAChE,GAGE4qC,MAAe,WACnB,IACEpsD,aAAe,KACXA,EACA,IAAI,KAAaA,EAAK,CACpB,OAAQ,GACR,SAAA+O,GACA,eAAA3E,EACF,CAAC,EACP,CAACpK,EAAK+O,GAAU3E,EAAc,CAChC,EAEA,sBAAU,IAAM,CACVpK,EAAI,kBACN,KAAiB,EACd,IAAI,CAAE,IAAKA,EAAI,aAAc,CAAC,EAC9B,KAAMqsD,IAAO,IACR,MAAsBA,EAAE,GAC1Bf,GAAsBe,EAAE,CAE5B,CAAC,CAEP,EAAG,CAACrsD,EAAI,aAAa,CAAC,KAGpB,QAAC,KACC,OAAQob,EACR,SAAO,MAAE,0CAA2C,aAAa,EACjE,iBAAkBnb,GAAO,WACzB,UAAWA,GAAO,MAClB,UAAWksD,GAEV,cAAO,eAAe,yBAA2B7wC,MAChD,OAAC,OAAK,SAAAA,EAAmBtb,EAAKqd,EAAa,EAAE,KAE/C,OAAC,MACC,OAAQ8tC,GACR,SAAU,IAAMC,GAAW,CAACD,EAAO,EACnC,UAAWlrD,GAAO,iBAClB,SAAO,MAAE,uCAAwC,qBAAqB,EAEtE,mBAAC,IAAiB,CAAC,IAAKmsD,GAAc,mBAAAtsD,EAAA,CAAwC,EAChF,KACA,QAAC,OAAI,UAAWG,GAAO,SACpB,UAAAorD,IAAoB,6BACnB,QAAC,IAAK,CACJ,oBAAC,KACC,QAAQ,sBACR,WAAS,MACP,4CACA,oDACF,EACA,MAAM,OAEL,kBAAE,0CAA2C,qBAAqB,EACrE,KACA,OAAC,KACC,GAAG,sBACH,QAASiB,EAAqB,EAC9B,SAAUJ,GACV,MAAOV,GAAW,SAAS,EAC3B,SAAU,EACV,MAAM,OACR,GACF,KAEF,OAAC,KAAM,CAAC,QAAQ,YAAY,QAAShxC,GACnC,mBAAC,MAAK,CAAC,QAAQ,4CAA4C,+BAAmB,EAChF,EACCkC,IAAc,YAAY,QACzB,OAAC,KAAM,CAAC,QAAQ,YAAY,QAASuvC,GACnC,mBAAC,MAAK,CAAC,QAAQ,2CAA2C,8BAAkB,EAC9E,GAEJ,KACA,QAAC,OAAI,UAAWhsD,GAAO,iBACpB,UAAA8qD,KAAe,KAAa,YAC3B,OAAC,KACC,UACEj8C,IAAc,KAAc,cACxB,MAAE,mCAAoC,OAAO,KAC7C,MAAE,mCAAoC,OAAO,EAErD,EAEDi8C,KAAe,KAAa,SAC3B,OAAC,MAAK,CAAC,QAAQ,+CAA+C,mCAAuB,GAEzF,KACA,OAAC,OAAI,UAAW9qD,GAAO,QACrB,mBAAC,OAAI,UAAWA,GAAO,cAAe,IAAKmpC,GACxC,SAAAA,GAAa,YACZ,OAAC,KACC,IAAK,KAAQ,QACb,iBAAkBA,GAAa,QAC/B,WAAY,CAAC,EACb,cAAe,KAAkB,KACjC,YAAY,SACZ,gBAAAj/B,EACA,iBAAkB,GAClB,SAAUuhD,GAAY,QACtB,mBAAmB,YACnB,SAAUM,GACV,uBAAAhqC,EACA,qBAAAR,EACA,KAAMspC,GACN,QAASC,KAAe,KAAa,SAAWE,KAAe,KAAa,QAC5E,iBAAkBjrD,EAAI,IACtB,iBAAAwiB,EACA,iBAAArV,GACA,iBAAAD,EACA,aAAY,GACZ,kBAAmB,GACnB,SAAUsU,EAAuB,IAAM,QAAQ,GAAGA,CAAoB,YAAa,EAAI,EAAI,GAC3F,UAAA1S,EACA,mBAAAhP,GACA,UAAAsM,GACA,SAAA2C,GACA,eAAA3E,EAAA,CACF,EAEJ,EACF,KACA,QAAC,OAAI,UAAWnK,GAAO,iBACpB,UAAAgrD,KAAe,KAAa,YAC3B,OAAC,KACC,UACEn8C,IAAc,KAAc,cACxB,MAAE,mCAAoC,OAAO,KAC7C,MAAE,mCAAoC,OAAO,EAErD,EAEDm8C,KAAe,KAAa,SAC3B,OAAC,MAAK,CAAC,QAAQ,+CAA+C,mCAAuB,GAEzF,GACF,CAEJ,CACF,EACAV,EAAe,YAAc,iBAE7B,MAAM5hD,EAAaC,IACV,CACL,SAAO,OAAI,CACT,MAAO,OACP,OAAQ,OACR,CAACA,EAAM,YAAY,KAAK,IAAI,CAAC,EAAG,CAC9B,MAAO,OACP,OAAQ,OACV,CACF,CAAC,EACD,oBAAkB,OAAI,CACpB,OAAQA,EAAM,QAAQ,CAAC,EACvB,UAAWA,EAAM,QAAQ,CAAC,EAC1B,UAAW,QACb,CAAC,EACD,oBAAkB,OAAI,CACpB,KAAM,CACR,CAAC,EACD,WAAS,OAAI,CACX,OAAQ,aAAaA,EAAM,OAAO,OAAO,IAAI,GAC7C,QAASA,EAAM,QAAQ,EAAG,EAAG,EAAG,CAAC,EACjC,KAAM,WACN,UAAW,CACb,CAAC,EACD,iBAAe,OAAI,CACjB,OAAQ,OACR,SAAU,QACZ,CAAC,EACD,cAAY,OAAI,CACd,QAAS,OACT,cAAe,SACf,QAASA,EAAM,QAAQ,EAAG,EAAG,EAAG,CAAC,EACjC,OAAQ,OACR,IAAKA,EAAM,QAAQ,EAAG,CACxB,CAAC,EACD,QAAM,OAAI,CACR,MAAOA,EAAM,OAAO,KAAK,UACzB,SAAUA,EAAM,WAAW,UAAU,SACrC,SAAU,CACR,MAAOA,EAAM,OAAO,KAAK,IAC3B,CACF,CAAC,EACD,cAAY,OAAI,CACd,SAAU,SACV,UAAW,OACX,aAAc,WACd,MAAO,OACP,WAAY,QACd,CAAC,EACD,YAAU,OAAI,CACZ,QAAS,OACT,eAAgB,WAChB,IAAKA,EAAM,QAAQ,CAAC,CACtB,CAAC,CACH,GAGIgS,EAAuB,CAACC,EAA0B/L,IAClD+L,IAAU,SAAW/L,IAAc,KAAc,YAGjD+L,IAAU,SAAW/L,IAAc,KAAc,UAC5C,KAA4B,QAG9B,KAA4B,SAG/Bg9C,EAAqB9rD,IAelB,CACL,GAAGA,EACH,UAAW,CACT,GAAGA,EAAI,UACP,MAAO,WAAWA,EAAI,KAAOA,EAAI,UAAU,OAASA,EAAI,WAAW,EACrE,CACF,GAGIgb,EAAc,CAACpM,EAAqB5F,IACjC4F,EAAK,KAAMqM,GAAMA,EAAE,QAAUjS,EAAI,OAASiS,EAAE,cAAgBjS,EAAI,WAAW,EAGpF,SAASsjD,GAAuB,CAE9B,MADkB,CAAC,IAAK,IAAK,IAAM,IAAM,IAAO,IAAO,IAAQ,KAAS,KAAShC,CAAmB,EACnF,IAAKiC,IAAc,CAClC,SAAO,SAAuB,MAAe,IAAI,EAAEA,CAAQ,CAAC,EAC5D,MAAOA,EAAS,SAAS,CAC3B,EAAE,CACJ,C,uGCvhBO,MAAMC,EAAU,EAEhB,SAASC,EAAiBC,EAA6B,CAC5D,OAAOA,EAAI,WAAaD,EAAiBC,EAAI,UAAU,EAAIA,CAC7D,CAEO,SAASC,EAAUj5C,EAAc0B,EAAkB,CACxD,MAAO,CACL,KAAMw3C,EAAUl5C,EAAM0B,CAAI,EAI1B,KAAMA,EAAK,KACX,GAAIA,EAAK,GACT,WAAYA,EAAK,QAAQ,IAC3B,CACF,CASO,MAAMy3C,EAAgB,kFAOtB,SAASC,EAAiBp5C,EAAc,CAC7C,OAAOA,EAAK,QAAQm5C,EAAe,CAACzrD,EAAO2rD,GAAMC,EAAMC,EAAMC,EAAMC,EAAWC,KAAS,CACrF,MAAMC,EAAMJ,GAAQG,GACpB,IAAIE,EAAWP,GACXQ,EAAU,IAEd,OAAIP,IACFM,EAAWN,EACXO,EAAU,KAGRL,IACFI,EAAWJ,EACXK,EAAU,KAGL,OAAOA,CAAO,KAAOD,EAAW,SAAWD,EAAM,QAAUA,EAAM,QAAU,GACpF,CAAC,CACH,CAEA,MAAMG,EAAc,CAClB,CAAC,EAAW9/C,IAAe,IAAK,CAAC,GACjC,CAAC,EAAWA,IAAe,KAAK,CAAC,GAAGA,EAAI,IAAIA,CAAC,GAAK,EAAE,KACpD,CAAC,EAAWA,IAAe,MAAO,CAAC,GAAGA,EAAI,IAAIA,CAAC,GAAK,EAAE,GACxD,EAMO,SAAS+/C,EAAgB/5C,EAAc,CAC5C,OAAOA,EAAK,QAAQ,4CAA6C,CAACtS,EAAOsK,GAAMgiD,EAAGhgD,IACzE8/C,EAAY,SAAS9hD,GAAM,EAAE,CAAC,EAAEgiD,EAAGhgD,CAAC,CAC5C,CACH,CAQO,SAASk/C,EAAUl5C,EAAc0B,EAAkD,CACxF,OAAKA,EAGEq4C,EAAgB/5C,EAAK,UAAU0B,EAAK,KAAMA,EAAK,EAAE,CAAC,EAFhD,EAGX,CASO,SAASu4C,EACdvkC,EACA1V,EACA6W,GACAqjC,EACuB,CACvB,MAAM5kC,EAA4C,CAAC,WAAW4jC,EAAUl5C,EAAM6W,EAAU,CAAC,CAAC,EAC1F,OAAInB,EAAM,YACRJ,EAAO,KAAK4kC,CAAO,EAEd,CACL,GAAIxkC,EAAM,GACV,OAAAJ,CACF,CACF,CAWO,SAAS6kC,GAAan6C,EAAcg5C,EAAiBhhD,GAAiC,CAC3F,GAAIghD,EAAI,KAAK,KAAOhhD,IAAQghD,EAAI,OAAShhD,GACvC,MAAO,CAACkhD,EAAUl5C,EAAMg5C,CAAG,CAAC,EAE9B,MAAMt+C,EAAmB,CAAC,EAC1B,IAAI7H,EAAM,EACNoiB,EAAQ+jC,EAAI,WAAWnmD,CAAG,EAC9B,KAAOoiB,GACLva,EAAO,KAAK,GAAGy/C,GAAan6C,EAAMiV,EAAOjd,EAAI,CAAC,EAC9CnF,EAAMoiB,EAAM,GACZA,EAAQ+jC,EAAI,WAAWnmD,CAAG,EAE5B,OAAO6H,CACT,CAKO,MAAM0/C,EAAkCx4C,GAC1BA,EAAM,MAAM,GAAG,EAChB,IAAKA,IAAU,GAAGA,EAAK,IAAI,EAAE,KAAK,EAAE,C,yTCvGjD,MAAMy4C,EAAc,CAAC,CAAE,IAAA/tD,EAAK,OAAAC,CAAO,IAAa,CACrD,KAAM,CACJ,iBAAAshB,EACA,iBAAAkD,EACA,mBAAAlJ,EACA,cAAAkH,EACA,iBAAAD,EACA,UAAAlY,EACA,YAAAoY,EACA,uBAAAV,GAAyB,CAAC,EAC1B,mBAAAE,EACA,cAAA2D,EACA,qBAAAlC,EACA,mBAAAyC,CACF,KAAI,MAAkB,EAChB4Z,KAAS,MAAehgC,CAAG,EAC3BguD,KAAU,UAAO,IAAI,EAErBxkB,KAAc,eAAY,IAAM,IACpC,MAASxpC,EAAI,MAAOguD,CAAO,CAC7B,EAAG,CAAChuD,EAAI,KAAK,CAAC,EAERypC,KAAoB,eAAY,IAAM,CAC1CjnB,IAAmBxiB,CAAG,CACxB,EAAG,CAACA,EAAKwiB,CAAgB,CAAC,EAEpBmnB,MAA2B,WAC/B,IAAOznB,EAAqBA,EAAmBliB,CAAG,EAAI,GACtD,CAACA,EAAKkiB,CAAkB,CAC1B,EAEM0nB,MAAc,eAClB,MAAO95B,GAAmC,IACxC,KAA2BA,EAAO9P,EAAKub,EAAqBvb,IAAqByiB,IAAgBziB,GAAK,IAAM,CAAC,CAAC,CAAC,CACjH,EACA,CAACyiB,EAAelH,EAAoBvb,CAAG,CACzC,EAEMiuD,MAAmB,eAAY,IAAM,CACzCpoC,EAAc7lB,CAAG,CACnB,EAAG,CAACA,EAAK6lB,CAAa,CAAC,EAEjB6jB,KAAgB,eAAY,IAAM,CAClC1J,EACFtd,IAAc1iB,CAAG,EAEjBsK,IAAYtK,CAAG,CAEnB,EAAG,CAACA,EAAKsK,EAAWoY,EAAasd,CAAM,CAAC,EAElCkuB,EAAmB3sC,GAAoBooB,IAA4Br/B,GAAaoY,EAEhFyrC,KAAO,eACX,OACE,QAAC1b,GAAA,EAAI,CAAC,IAAKub,EACR,UAAAzsC,MACC,OAACkxB,GAAA,EAAK,KAAL,CACC,QAASwb,GACT,MACExpC,EAAiBzkB,CAAG,KAChB,KAAE,kCAAmC,kBAAkB,KACvD,KAAE,kCAAmC,kBAAkB,EAE/D,EAED2pC,OACC,OAAC8I,GAAA,EAAK,KAAL,CAAU,QAAS7I,GAAa,SAAO,KAAE,kCAAmC,cAAc,EAAG,EAE/F,CAAC5J,GAAU11B,MACV,OAACmoC,GAAA,EAAK,KAAL,CAAU,QAAS/I,EAAe,SAAO,KAAE,oCAAqC,SAAS,EAAG,EAE9F1J,GAAUtd,MACT,OAAC+vB,GAAA,EAAK,KAAL,CAAU,QAAS/I,EAAe,SAAO,KAAE,wCAAyC,WAAW,EAAG,EAEpGwkB,MAAoB,OAACzb,GAAA,EAAK,QAAL,EAAa,KACnC,OAACA,GAAA,EAAK,KAAL,CAAU,QAASjJ,EAAa,SAAO,KAAE,8BAA+B,eAAe,EAAG,EAC1FhnB,GAAoBxiB,EAAI,QAAU,QAAaA,EAAI,QAClD,OAACyyC,GAAA,EAAK,KAAL,CAAU,QAAShJ,EAAmB,SAAO,KAAE,+BAAgC,uBAAuB,EAAG,EAE3GznB,GAAuB,IAAI,CAAC3a,EAAMpE,KAC7BmrD,GAAU/mD,CAAI,KACT,OAACorC,GAAA,EAAK,QAAL,GAAkBxvC,EAAG,EAE3BorD,EAAOhnD,CAAI,KACN,OAACorC,GAAA,EAAK,KAAL,CAAU,QAAS,IAAMprC,EAAK,QAAQrH,CAAG,EAAG,MAAOqH,EAAK,OAAYpE,EAAG,EAE1E,IACR,EACA0gB,MACC,oBACE,oBAAC8uB,GAAA,EAAK,QAAL,EAAa,KACd,OAACA,GAAA,EAAK,KAAL,CACC,QAAS,IAAMrsB,IAAqBpmB,CAAG,EACvC,KAAK,aACL,SAAO,KAAE,oCAAqC,+BAA+B,EAC/E,GACF,GAEJ,EAEF,CACEypC,EACAD,EACA/kB,EACAlD,EACAoC,EACA3jB,EACAgiB,GACAQ,EACAlY,EACAoY,EACA0D,EACA4Z,EACA2J,GACAC,GACAskB,EACAD,GACAvkB,CACF,CACF,EAEA,SACE,OAACyH,EAAA,EAAQ,CAAC,QAASgd,EAAM,UAAU,eACjC,mBAACljD,EAAA,GACC,UAAWhL,EAAO,SAClB,KAAK,aACL,gBAAY,KAAE,gCAAiC,UAAU,EACzD,KAAK,SACP,EACF,CAEJ,EAEA,SAASmuD,GAAU/mD,EAA6B,CAC9C,MAAO,YAAaA,GAAQA,EAAK,OACnC,CAEA,SAASgnD,EAAOhnD,EAA6B,CAC3C,MAAO,YAAaA,GAAQ,UAAWA,CACzC,C,wCCvHO,MAAMu3C,EAAU,CAAC,CACtB,gBAAAz0C,EACA,MAAA7C,EACA,IAAAtH,EACA,KAAA+hB,EACA,MAAA/B,EACA,OAAA/f,EACA,QAAA6gC,EACA,WAAAwtB,EACA,SAAAxrC,EACA,UAAA1W,GACA,SAAA2C,EACA,QAAAw/C,EACA,eAAApwB,EACA,eAAA/zB,CACF,OAEI,OAAC,OAAI,MAAOA,EAAiB4V,EAAQ,CAAE,GAAGA,EAAO,MAAO,cAAe,SAAU,MAAO,EACtF,mBAACwuC,EAAA,CACC,gBAAArkD,EACA,OAAQ6V,EAAM,OACd,MAAA1Y,EACA,IAAAtH,EACA,KAAA+hB,EACA,OAAA9hB,EACA,QAAA6gC,EACA,WAAAwtB,EACA,SAAAxrC,EACA,UAAA1W,GACA,SAAA2C,EACA,QAAAw/C,EACA,eAAApwB,EACA,eAAA/zB,CAAA,CACF,EACF,EAQEokD,KAAmB,QACvB,CAAC,CACC,gBAAArkD,EACA,OAAAiiB,EACA,MAAA9kB,EACA,IAAAtH,EACA,KAAA+hB,EACA,OAAA9hB,EACA,QAAA6gC,EACA,WAAAwtB,EACA,SAAAxrC,EACA,UAAA1W,GACA,SAAA2C,EACA,QAAAw/C,EACA,eAAApwB,EACA,eAAA/zB,CACF,IAA6B,CAC3B,KAAM,CACJ,iBAAAqa,EACA,YAAAhB,EACA,cAAA9B,EACA,iBAAAJ,EACA,SAAAM,GACA,kBAAAyE,GACA,eAAAC,GACA,iBAAAxD,EACA,oBAAAC,EACA,eAAAT,CACF,KAAI,MAAkB,EAChB,CAACyc,EAAWyvB,EAAY,KAAI,YAChCrkD,GAAkBpK,EAAI,YAAc,OAAYA,EAAI,UAAY,MAClE,EACMqjC,MAAa,UAA8B,IAAI,EAC/CrD,MAAS,MAAehgC,CAAG,EAC3BmjC,MAAc,MAAoBnjC,CAAG,EAErC0uD,MAAsB,eAAY,IAAM,CAC5C,GAAI,CAACJ,GAAc,CAACjrB,GAAW,SAAW,CAAClF,GAAkB,CAAC/R,EAC5D,OAEF,MAAM8jB,GAAmB,OAAO9jB,GAAW,SAAWA,EAAS,OACzDuiC,MAAe,OAAoBxwB,EAAgBkF,GAAW,QAAS6M,GAAkBlwC,EAAI,SAAS,EACxG2uD,IACFL,EAAWhnD,EAAOtH,EAAI,IAAK2uD,EAAY,CAE3C,EAAG,CAACviC,EAAQ9kB,EAAOtH,EAAI,UAAWA,EAAI,IAAKsuD,EAAYnwB,CAAc,CAAC,KAEtE,mBAAgB,IAAM,CACpBuwB,GAAoB,CACtB,EAAG,CAACA,GAAqBjrC,CAAW,CAAC,KAErC,mBAAgB,IAAM,CACpB,GAAI,CAAC4f,GAAW,QACd,OAEF,IAAIurB,GACJ,MAAMxqC,GAAe,IAAM,CACrBwqC,IACF,qBAAqBA,EAAO,EAE9BA,GAAU,sBAAsB,IAAMF,GAAoB,CAAC,CAC7D,EACMjwC,GAAW,IAAI,eAAe2F,EAAY,EAChD,OAAA3F,GAAS,QAAQ4kB,GAAW,OAAO,EAC5B,IAAM,CACX5kB,GAAS,WAAW,EAChBmwC,IACF,qBAAqBA,EAAO,CAEhC,CACF,EAAG,CAACF,EAAmB,CAAC,KAExB,aAAU,IAAM,CACTtkD,GAEM40B,IAAc,QAAah/B,EAAI,YAAc,QAE7Cg/B,IAAc,QAAah/B,EAAI,YAAc,SACtDyuD,GAAazuD,EAAI,SAAS,EAJ1ByuD,GAAa,MAAS,CAM1B,EAAG,CAACzvB,EAAWh/B,EAAI,UAAWoK,CAAc,CAAC,EAE7C,MAAMykD,MAAkB,eAAY,IAAMtsC,IAAiBviB,CAAG,EAAG,CAACA,EAAKuiB,CAAc,CAAC,EAEhFusC,MAAuB,eAAY,IAAM,CAC7C,MAAM7qC,GAAW,CAAC+a,EAClBh/B,EAAI,kBAAkBikB,EAAQ,EAC9BwqC,GAAaxqC,EAAQ,EACrBqqC,IAAahnD,EAAOtH,EAAI,GAAG,CAC7B,EAAG,CAACg/B,EAAW13B,EAAOtH,EAAKsuD,CAAU,CAAC,EAEhCxsB,MAAc,eACjBx2B,IAA+B,CAC1ByjD,EAAezjD,GAAE,MAAM,GACzBw1B,EAAQx1B,GAAGtL,CAAG,CAElB,EACA,CAACA,EAAK8gC,CAAO,CACf,EAEMkuB,GAAevqC,EAAiBzkB,CAAG,EAEzC,SACE,oBAGE,qBAAC,OACC,UAAW,GAAGC,EAAO,OAAO,IAAIsuD,GAAW,EAAE,IAAIvuB,GAAS//B,EAAO,cAAgB,EAAE,IAAIkjC,GAAcljC,EAAO,mBAAqB,EAAE,IAAI+uD,GAAe/uD,EAAO,iBAAmB,EAAE,IAAI4hB,KAAa,QAAU5hB,EAAO,cAAgB,EAAE,IAAIshB,EAAmBthB,EAAO,UAAY,EAAE,GAClR,IAAKquD,EAAajrB,GAAa,OAC/B,aAAcwrB,GACd,QAASA,GACT,QAAS/sB,GAET,oBAACisB,EAAW,CAAC,OAAA9tD,EAAgB,IAAAD,CAAA,CAAU,EACtC2hB,IAAkB,KAAkB,SACnC,OAAC,OAAI,UAAW,GAAG1hB,EAAO,UAAU,GACjC,SAAAD,EAAI,YAAcA,EAAI,WAAa,EAAI,GAAGA,EAAI,WAAa,CAAC,IAAM,KACrE,EAEDsmB,OACC,OAAC,OAAI,UAAW,GAAGrmB,EAAO,QAAQ,GAC/B,SAAAD,EAAI,aACH,OAAC2L,GAAA,GACC,WAAS,KAAE,8BAA+B,0BAA2B,CACnE,aAAc3L,EAAI,YACpB,CAAC,EACD,UAAU,QACV,MAAM,QAEN,mBAACgkC,EAAA,GACC,UAAW/jC,EAAO,aAClB,KAAK,uBACL,gBAAY,KAAE,0BAA2B,YAAY,EACrD,KAAK,KACP,EACF,EAEJ,EAEDsmB,OACC,OAAC,OAAI,UAAW,GAAGtmB,EAAO,SAAS,GAChC,SAAAD,EAAI,cACH,OAAC2L,GAAA,EAAO,CAAC,QAAS3L,EAAI,gBAAkB,GAAI,UAAU,QAAQ,MAAM,OAClE,mBAACgkC,EAAA,GACC,UAAW/jC,EAAO,YAClB,KAAK,cACL,KAAK,KACL,gBAAY,KAAE,2BAA4B,YAAY,EACxD,EACF,EAEJ,KAEF,OAAC,OACC,UAAW,GAAGA,EAAO,aAAa,IAAI+uD,GAAe/uD,EAAO,iBAAmB,EAAE,IAAImK,EAAiBnK,EAAO,eAAiB,GAAGA,EAAO,gBAAgB,qBAAqB,IAAI++B,IAAc,GAAO/+B,EAAO,iBAAmB,EAAE,GAClO,MACE++B,GAAab,EACT,CAAE,UAAW,GAAGA,EAAe,uBAAuB,EAAIA,EAAe,cAAc,CAAC,IAAK,EAC7F,OAGN,mBAAC8wB,EAAA,CACC,UAAAjwB,EACA,gBAAA70B,EACA,IAAAnK,EACA,SAAA8iB,EACA,iBAAAC,EACA,OAAA9iB,EACA,oBAAA+iB,EACA,eAAA5Y,CAAA,CACF,EACF,GACF,EACC40B,IAAc,OACb,OAAC,OAAI,UAAW/+B,EAAO,sBACrB,mBAACya,EAAA,IACC,QAAQ,UACR,KAAK,OACL,KAAK,KACL,UAAWza,EAAO,4BAClB,QAAS6uD,GAER,iBAAE,0BAA2B,WAAW,EAC3C,EACF,EAED9vB,IAAc,OACb,OAAC,OAAI,UAAW/+B,EAAO,sBACrB,mBAACya,EAAA,IACC,QAAQ,UACR,KAAK,OACL,KAAK,KACL,UAAWza,EAAO,4BAClB,QAAS6uD,GAER,iBAAE,0BAA2B,WAAW,EAC3C,EACF,EAEDrrC,IAAgB,UAAYurC,OAC3B,OAAC,MACC,KAAAjtC,EACA,IAAA/hB,EACA,SAAU0uD,GACV,UAAAtiD,GACA,SAAA2C,CAAA,CACF,GAEJ,CAEJ,CACF,EACAy/C,EAAiB,YAAc,mBAe/B,MAAMS,KAAM,QACV,CAAC,CAAE,gBAAA9kD,EAAiB,IAAAnK,EAAK,SAAA8iB,EAAU,iBAAAC,EAAkB,OAAA9iB,EAAQ,oBAAA+iB,EAAqB,eAAA5Y,CAAe,IAAgB,CAC/G,MAAM8kD,KAAqB,eACxBltB,GAAsB,CACrBhiC,EAAI,qBAAuBgiC,CAC7B,EACA,CAAChiC,CAAG,CACN,EACA,SACE,oBACG,UAAA8iB,MACC,OAAC,QAAK,UAAW,GAAG7iB,EAAO,SAAS,UAAUD,EAAI,QAAQ,SACvD,SAAAgjB,IAAwB,KAAOhjB,EAAI,UAAYA,EAAI,YACtD,GAKAA,EAAI,cAAgB,CAACoK,OACrB,OAAC,QAAK,UAAW,GAAGnK,EAAO,KAAK,UAAUD,EAAI,QAAQ,SAAW,SAAAA,EAAI,aAAa,EAEnF+iB,GAAoB/iB,EAAI,iBACvB,OAAC,QAAK,UAAU,QACd,mBAACikC,GAAA,GACC,WAAY,GACZ,WAAYjkC,EAAI,qBAChB,WAAY,EACZ,OAAQA,EAAI,aACZ,mBAAoBkvD,CAAA,CACtB,EACF,EAED/kD,EAAgB,OAAS,KACxB,OAACglD,EAAA,CAAgB,gBAAAhlD,EAAkC,IAAAnK,EAAU,OAAAC,CAAA,CAAgB,KAE7E,OAACmvD,EAAA,CAAY,IAAApvD,EAAU,OAAAC,CAAA,CAAgB,GAE3C,CAEJ,CACF,EACAgvD,EAAI,YAAc,MAElB,MAAME,EAAkB,CAAC,CACvB,gBAAAhlD,EACA,IAAAnK,EACA,OAAAC,CACF,IAIM,CACJ,KAAM,CAAE,aAAA40C,EAAc,OAAAtX,CAAO,KAAI,OAAwB,EACnD,CAAE,mBAAAz9B,CAAmB,KAAI,MAAkB,EAE3CuhC,KAAc,WAAQ,IAAM,CAChC,MAAMA,EAAcrhC,EAAI,aAAeA,EAAI,YAAY,CAAC,EAAIA,EAAI,YAAY,MAAM,EAAI,CAAC,EAIvF,GAHIu9B,GAAUsX,GAAc,SAAS70C,EAAI,GAAG,GAC1CqhC,EAAY,KAAK9D,CAAM,EAErB,EAAC8D,EAAY,OAGjB,OAAOA,CACT,EAAG,CAACrhC,EAAI,YAAaA,EAAI,IAAK60C,EAActX,CAAM,CAAC,EAEnD,OAAOpzB,EAAgB,IAAKgE,GACtBA,IAAU,OACL,OAACihD,EAAA,CAAY,IAAApvD,EAAsB,OAAAC,CAAA,EAAPkO,CAAuB,EAExDA,IAAU,MAAuCrO,KAEjD,OAAC,QAAK,UAAU,6BAA6B,SAAO,OAAuBqO,CAAK,EAC9E,mBAACiL,EAAA,EAAsB,CAAC,OAAQpZ,EAAI,+BAAgC,GADkBmO,CAExF,KAIF,OAAC,QAAK,UAAU,QAAQ,SAAO,OAAuBA,CAAK,EACxD,SAAAkzB,KACC,OAAC,KACC,gBAAiBrhC,EAAI,uBAAuBmO,CAAK,EACjD,YAAAkzB,EACA,WAAY,KACZ,mBAAoBphC,EAAO,eAC7B,EAEAD,EAAI,uBAAuBmO,CAAK,GAT+BA,CAWnE,CAEH,CACH,EAEMihD,EAAc,CAAC,CAAE,IAAApvD,EAAK,OAAAC,CAAO,IAAoD,CACrF,KAAM,CAAE,mBAAAH,CAAmB,KAAI,MAAkB,EAC3C,CAAE,aAAA+0C,EAAc,OAAAtX,CAAO,KAAI,OAAwB,EAEnDkE,KAAY,WAAQ,IAAM,CAC9B,MAAMJ,EAAcvhC,GAAsBE,EAAI,aAAeA,EAAI,YAAY,CAAC,EAAIA,EAAI,YAAY,MAAM,EAAI,CAAC,EAI7G,GAHIu9B,GAAUsX,GAAc,SAAS70C,EAAI,GAAG,GAC1CqhC,EAAY,KAAK9D,CAAM,EAErB,EAAC8D,EAAY,OAGjB,MAAO,CAAE,YAAAA,EAAa,mBAAoBphC,EAAO,cAAe,CAClE,EAAG,CAACD,EAAI,YAAaA,EAAI,IAAK60C,EAActX,EAAQt9B,EAAO,eAAgBH,CAAkB,CAAC,EAE9F,OAAIE,EAAI,WAEJ,OAAC,QAAK,UAAU,wBACd,mBAACoa,EAAA,EAAc,CAAC,MAAOpa,EAAI,KAAM,UAAAyhC,CAAA,CAAsB,EACzD,EAIC3hC,KAcH,OAAC,QAAK,UAAU,6BACd,mBAACsZ,EAAA,EAAsB,CAAC,OAAQpZ,EAAI,sBAAuB,EAC7D,EAfOyhC,KACL,OAAC,KACC,gBAAiBzhC,EAAI,KACrB,YAAayhC,EAAU,YACvB,WAAY,KACZ,mBAAoBxhC,EAAO,eAC7B,KAEA,OAAC,QAAK,UAAU,wBAAyB,SAAAD,EAAI,KAAK,CASxD,EAEO,SAASqvD,EAAuB9f,EAAiCplC,EAA2B,CACjG,MAAM63C,EAAUzS,EACb,IAAK+f,GAAeA,EAAU,MAAQ,EAAI,GAAGA,EAAU,KAAK,KAAO,aAAc,EACjF,KAAK,GAAG,EACLC,EAAeplD,EAAgB,OAAS,EAAI,GAAK,OACvD,MAAO,GAAG63C,CAAO,GAAGuN,CAAY,EAClC,CAGO,MAAM5mD,EAAY,CAACC,EAAsBu1B,IAA2C,CACzF,MAAMqxB,EAAS,CACb,SAAU,UACV,MAAO5mD,EAAM,OAAO,MAAM,KAC1B,QAAS,UACT,MAAO,UACP,MAAO,UACP,KAAM,UACN,SAAUA,EAAM,OAAO,KAAK,UAC5B,QAASA,EAAM,OAAO,KAAK,QAC3B,YAAaA,EAAM,OAAO,KAAK,SACjC,EAEM6mD,KAAaC,EAAA,GAAU9mD,EAAM,OAAO,WAAW,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,EAEnF,MAAO,CACL,WAAS,OAAI,CACX,MAAO4mD,EAAO,QACd,QAAS,OACT,IAAK5mD,EAAM,QAAQ,EAAG,EACtB,cAAe,MACf,WAAYA,EAAM,WAAW,oBAC7B,SAAUA,EAAM,WAAW,SAC3B,WAAYA,EAAM,WAAW,KAAK,WAClC,UAAW,YACX,UAAW,CACT,WAAY6mD,CACd,EACA,oBAAqB,CACnB,YAAa,CACX,UAAW,aAAa7mD,EAAM,OAAO,OAAO,MAAM,GAClD,QAAS,KACT,OAAQ,EACR,KAAM,EACN,SAAU,WACV,IAAK,GACL,MAAO,MACT,CACF,EACA,0BAA2B,CACzB,oBAAqB,CACnB,MAAO4mD,EAAO,OAChB,EACA,sBAAuB,CACrB,MAAO5mD,EAAM,OAAO,QAAQ,IAC9B,EACA,kBAAmB,CACjB,MAAOA,EAAM,OAAO,QAAQ,IAC9B,EACA,kBAAmB,CACjB,MAAOA,EAAM,OAAO,QAAQ,IAC9B,EACA,iBAAkB,CAChB,MAAO4mD,EAAO,YACd,WAAY5mD,EAAM,WAAW,gBAC/B,EACA,sBAAuB,CACrB,MAAO4mD,EAAO,YACd,QAAS,GACT,WAAY5mD,EAAM,WAAW,gBAC/B,EACA,mBAAoB,CAClB,MAAO4mD,EAAO,SACd,WAAY5mD,EAAM,WAAW,cAC/B,EACA,oBAAqB,CACnB,MAAOA,EAAM,OAAO,KAAK,KAC3B,EACA,oBAAqB,CACnB,MAAOA,EAAM,WAAW,cAAc,KACtC,gBAAiBA,EAAM,WAAW,cAAc,UAClD,CACF,EACA,qBAAsB,CACpB,MAAOA,EAAM,OAAO,KAAK,OAC3B,CACF,CAAC,EACD,kBAAgB,OAAI,CAClB,MAAOA,EAAM,WAAW,cAAc,KACtC,gBAAiBA,EAAM,WAAW,cAAc,UAClD,CAAC,EACD,iBAAe,OAAI,CACjB,SAAUA,EAAM,WAAW,UAAU,SACrC,WAAYA,EAAM,WAAW,UAAU,UACzC,CAAC,EACD,oBAAkB,OAAI,CACpB,cAAY8mD,EAAA,GAAU9mD,EAAM,OAAO,WAAW,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,CAC9E,CAAC,EACD,iBAAe,OAAI,CACjB,mBAAiB8mD,EAAA,GAAU9mD,EAAM,OAAO,KAAK,WAAW,EAAE,SAAS,GAAI,EAAE,SAAS,CACpF,CAAC,EACD,sBAAoB,OAAI,CACtB,mBAAiB8mD,EAAA,GAAU9mD,EAAM,OAAO,KAAK,WAAW,EAAE,SAAS,GAAI,EAAE,SAAS,CACpF,CAAC,EACD,YAAU,OAAI,CACZ,OAAQu1B,GAAgB,cAAc,GAAK,MAC3C,OAAQ,EACR,QAASv1B,EAAM,QAAQ,EAAG,EAAG,EAAG,EAAG,CACrC,CAAC,EACD,kBAAgB,OAAI,CAClB,WAAYA,EAAM,WAAW,WAC7B,eAAgB,QAClB,CAAC,EACD,aAAW,OAAI,CACb,MAAOA,EAAM,OAAO,KAAK,SACzB,QAAS,cACX,CAAC,EACD,cAAY,OAAI,CACd,WAAY,EACZ,UAAW,SACX,MAAOA,EAAM,QAAQ,GAAG,CAC1B,CAAC,EACD,YAAU,OAAI,CACZ,WAAY,EACZ,MAAOA,EAAM,QAAQ,CAAC,EACtB,QAAS,CACP,SAAU,WACV,IAAK,EACP,CACF,CAAC,EACD,aAAW,OAAI,CACb,WAAY,EACZ,MAAOA,EAAM,QAAQ,CAAC,EACtB,QAAS,CACP,SAAU,WACV,IAAK,EACP,CACF,CAAC,EACD,gBAAc,OAAI,CAChB,MAAOA,EAAM,OAAO,QAAQ,IAC9B,CAAC,EACD,eAAa,OAAI,CACf,MAAOA,EAAM,OAAO,KAAK,IAC3B,CAAC,EACD,SAAO,OAAI,CACT,MAAOA,EAAM,OAAO,KAAK,UACzB,WAAYA,EAAM,WAAW,eAC7B,cAAe,YACf,QAAS,eACT,mBAAoB,CAClB,MAAO4mD,EAAO,QAChB,EACA,gBAAiB,CACf,MAAOA,EAAO,KAChB,EACA,kBAAmB,CACjB,MAAOA,EAAO,OAChB,EACA,eAAgB,CACd,MAAOA,EAAO,IAChB,EACA,gBAAiB,CACf,MAAOA,EAAO,KAChB,CACF,CAAC,EACD,kBAAgB,OAAI,CAClB,WAAY,cACZ,OAAQ,OACR,QAAS,QACX,CAAC,EACD,wBAAsB,OAAI,CACxB,mBAAiBE,EAAA,GAAU9mD,EAAM,OAAO,WAAW,OAAO,EAAE,SAAS,GAAI,EAAE,SAAS,EACpF,KAAM,EACN,SAAU,WACV,IAAK,EACL,MAAO,OACP,OAAQA,EAAM,OAAO,WACvB,CAAC,EACD,aAAW,OAAI,CACb,QAAS,eACX,CAAC,EACD,aAAW,OAAI,CACb,OAAQ,SACV,CAAC,EACD,oBAAkB,OAAI,CACpB,QAAS,OACT,cAAeA,EAAM,QAAQ,KAAoB,EACjD,WAAY,MACZ,cAAeA,EAAM,QAAQ,GAAI,CACnC,CAAC,EACD,kBAAgB,OAAI,CAClB,UAAW,aACX,cAAeA,EAAM,QAAQ,GAAI,EACjC,WAAY,WACZ,WAAY,CACV,YAAaA,EAAM,QAAQ,KAAoB,CACjD,EACA,sBAAuB,CACrB,YAAa,CACf,CACF,CAAC,EACD,iBAAe,OAAI,CACjB,UAAWu1B,EAAiBA,EAAe,cAAc,EAAIA,EAAe,iBAAiB,EAAI,OACjG,UAAW,CACT,WAAYsxB,CACd,CACF,CAAC,EACD,oBAAkB,OAAI,CACpB,SAAU,QACZ,CAAC,EACD,yBAAuB,OAAI,CACzB,QAAS,OACT,eAAgB,QAClB,CAAC,EACD,+BAA6B,OAAI,CAC/B,WAAY7mD,EAAM,WAAW,gBAC7B,OAAQu1B,GAAgB,cAAc,GAAK,MAC3C,OAAQ,CACV,CAAC,CACH,CACF,EAEA,SAAS4wB,EAAeY,EAAqB,CAE3C,MAAO,EADgBA,aAAkB,mBAAsBA,aAAkB,SAAWA,EAAO,QAAQ,QAAQ,EAErH,C","sources":["webpack://grafana/./public/app/features/logs/components/panel/LogLineDetailsLog.tsx","webpack://grafana/./node_modules/lossless-json/lib/esm/utils.js","webpack://grafana/./node_modules/lossless-json/lib/esm/LosslessNumber.js","webpack://grafana/./node_modules/lossless-json/lib/esm/numberParsers.js","webpack://grafana/./node_modules/lossless-json/lib/esm/revive.js","webpack://grafana/./node_modules/lossless-json/lib/esm/parse.js","webpack://grafana/./node_modules/lossless-json/lib/esm/stringify.js","webpack://grafana/./public/app/features/logs/components/LogDetailsRow.tsx","webpack://grafana/./public/app/features/logs/components/LogDetails.tsx","webpack://grafana/./public/app/features/logs/components/InfiniteScroll.tsx","webpack://grafana/./public/app/features/logs/components/getLogRowStyles.ts","webpack://grafana/./public/app/plugins/datasource/loki/languageUtils.ts","webpack://grafana/./public/app/plugins/datasource/loki/queryUtils.ts","webpack://grafana/./public/app/features/logs/components/panel/HighlightedLogRenderer.tsx","webpack://grafana/./public/app/features/logs/components/LogMessageAnsi.tsx","webpack://grafana/./public/app/features/logs/components/log-context/LogContextButtons.tsx","webpack://grafana/./public/app/features/logs/components/log-context/LogRowContextModal.tsx","webpack://grafana/./public/app/features/logs/components/LogLabelStatsRow.tsx","webpack://grafana/./public/app/features/logs/components/LogLabelStats.tsx","webpack://grafana/./public/app/features/logs/components/panel/LogListContext.tsx","webpack://grafana/./public/app/plugins/datasource/loki/querybuilder/parsing.ts","webpack://grafana/./public/app/features/explore/Logs/LogsTableWrap.tsx","webpack://grafana/./node_modules/@grafana/lezer-logql/index.es.js","webpack://grafana/./public/app/plugins/datasource/loki/querybuilder/components/UnwrapParamEditor.tsx","webpack://grafana/./public/app/plugins/datasource/loki/querybuilder/operations.ts","webpack://grafana/./public/app/features/logs/components/ControlledLogsTable.tsx","webpack://grafana/./public/app/features/logs/components/ControlledLogRows.tsx","webpack://grafana/./public/app/features/logs/components/panel/grammar.ts","webpack://grafana/./public/app/features/logs/components/panel/processing.ts","webpack://grafana/./public/app/features/logs/UniqueKeyMaker.ts","webpack://grafana/./public/app/features/logs/components/LogRowMenuCell.tsx","webpack://grafana/./public/app/features/logs/components/LogRowMessage.tsx","webpack://grafana/./public/app/features/logs/components/LogRowMessageDisplayedFields.tsx","webpack://grafana/./public/app/features/logs/components/LogRow.tsx","webpack://grafana/./public/app/features/logs/components/PreviewLogRow.tsx","webpack://grafana/./public/app/features/logs/components/LogRows.tsx","webpack://grafana/./public/app/features/logs/components/panel/LogLineDetailsDisplayedFields.tsx","webpack://grafana/./public/app/features/logs/components/panel/LogLineDetailsFields.tsx","webpack://grafana/./public/app/features/logs/components/panel/LogLineDetailsHeader.tsx","webpack://grafana/./public/app/features/logs/components/panel/LogLineDetailsLinks.tsx","webpack://grafana/./public/app/features/logs/components/panel/LogLineDetailsTrace.tsx","webpack://grafana/./public/app/features/logs/components/panel/links.ts","webpack://grafana/./public/app/features/logs/components/panel/LogLineDetailsComponent.tsx","webpack://grafana/./public/app/features/logs/components/panel/LogLineDetails.tsx","webpack://grafana/./node_modules/@grafana/plugin-ui/dist/esm/components/VisualQueryBuilder/types.js","webpack://grafana/./public/app/features/logs/components/panel/virtualization.ts","webpack://grafana/./public/app/features/logs/components/panel/LogListControlsOption.tsx","webpack://grafana/./public/app/features/logs/components/panel/LogListControls.tsx","webpack://grafana/./public/app/features/logs/components/panel/analytics.ts","webpack://grafana/./public/app/features/logs/components/LogLabels.tsx","webpack://grafana/./public/app/features/logs/components/panel/LogListSearchContext.tsx","webpack://grafana/./public/app/plugins/datasource/loki/lineParser.ts","webpack://grafana/./public/app/plugins/datasource/loki/responseUtils.ts","webpack://grafana/./public/app/features/explore/Logs/utils/logs.ts","webpack://grafana/./node_modules/@grafana/plugin-ui/dist/esm/components/VisualQueryBuilder/QueryModellerBase.js","webpack://grafana/./public/app/plugins/datasource/loki/querybuilder/LokiQueryModeller.ts","webpack://grafana/./public/app/plugins/datasource/loki/modifyQuery.ts","webpack://grafana/./public/app/features/logs/components/LogDetailsBody.tsx","webpack://grafana/./public/app/features/explore/Logs/PopoverMenu.tsx","webpack://grafana/./public/app/plugins/datasource/loki/querybuilder/binaryScalarOperations.ts","webpack://grafana/./public/app/features/logs/components/LoadingIndicator.tsx","webpack://grafana/./public/app/features/logs/components/panel/LogLineMessage.tsx","webpack://grafana/./public/app/features/logs/components/panel/InfiniteScroll.tsx","webpack://grafana/./public/app/features/logs/components/panel/LogListSearch.tsx","webpack://grafana/./public/app/features/logs/components/panel/useKeyBindings.ts","webpack://grafana/./public/app/features/logs/components/panel/usePopoverMenu.ts","webpack://grafana/./public/app/features/logs/components/panel/LogList.tsx","webpack://grafana/./public/app/features/logs/components/otel/formats.ts","webpack://grafana/./public/app/plugins/datasource/loki/querybuilder/components/LabelParamEditor.tsx","webpack://grafana/./public/app/plugins/datasource/loki/querybuilder/operationUtils.ts","webpack://grafana/./public/app/features/logs/components/fieldSelector/Field.tsx","webpack://grafana/./public/app/features/logs/components/fieldSelector/ActiveFields.tsx","webpack://grafana/./public/app/features/logs/components/fieldSelector/EmptyFields.tsx","webpack://grafana/./public/app/features/logs/components/fieldSelector/AvailableFields.tsx","webpack://grafana/./public/app/features/logs/components/fieldSelector/FieldList.tsx","webpack://grafana/./public/app/features/logs/components/fieldSelector/FieldSearch.tsx","webpack://grafana/./public/app/features/logs/components/fieldSelector/FieldSelector.tsx","webpack://grafana/./public/app/plugins/datasource/loki/querybuilder/types.ts","webpack://grafana/./public/app/features/logs/components/panel/LogLineContext.tsx","webpack://grafana/./public/app/plugins/datasource/loki/querybuilder/parsingUtils.ts","webpack://grafana/./public/app/features/logs/components/panel/LogLineMenu.tsx","webpack://grafana/./public/app/features/logs/components/panel/LogLine.tsx"],"sourcesContent":["import { css } from '@emotion/css';\nimport { memo, useMemo } from 'react';\n\nimport { useStyles2 } from '@grafana/ui';\n\nimport { LogMessageAnsi } from '../LogMessageAnsi';\n\nimport { HighlightedLogRenderer } from './HighlightedLogRenderer';\nimport { getStyles } from './LogLine';\nimport { LogListModel } from './processing';\n\ninterface Props {\n log: LogListModel;\n syntaxHighlighting: boolean;\n}\n\nexport const LogLineDetailsLog = memo(({ log: originalLog, syntaxHighlighting }: Props) => {\n const logStyles = useStyles2(getStyles);\n const log = useMemo(() => {\n const log = originalLog.clone();\n return log;\n }, [originalLog]);\n\n return (\n <div className={styles.logLineWrapper}>\n <div className={logStyles.logLine}>\n <div className={logStyles.wrappedLogLine}>\n {log.hasAnsi ? (\n <span className=\"field no-highlighting\">\n <LogMessageAnsi value={log.body} />\n </span>\n ) : (\n <>\n {!syntaxHighlighting && <div className=\"field no-highlighting\">{log.body}</div>}\n {syntaxHighlighting && (\n <div className=\"field log-syntax-highlight\">\n {<HighlightedLogRenderer tokens={log.highlightedBodyTokens} />}\n </div>\n )}\n </>\n )}\n </div>\n </div>\n </div>\n );\n});\n\nLogLineDetailsLog.displayName = 'LogLineDetailsLog';\n\nconst styles = {\n logLineWrapper: css({\n maxHeight: '50vh',\n overflow: 'auto',\n }),\n};\n","/**\n * Test whether a string contains an integer number\n */\nexport function isInteger(value) {\n return INTEGER_REGEX.test(value);\n}\nconst INTEGER_REGEX = /^-?[0-9]+$/;\n\n/**\n * Test whether a string contains a number\n * http://stackoverflow.com/questions/13340717/json-numbers-regular-expression\n */\nexport function isNumber(value) {\n return NUMBER_REGEX.test(value);\n}\nconst NUMBER_REGEX = /^-?(?:0|[1-9]\\d*)(?:\\.\\d+)?(?:[eE][+-]?\\d+)?$/;\n\n/**\n * Test whether a string can be safely represented with a number\n * without information loss.\n *\n * When approx is true, floating point numbers that lose a few digits but\n * are still approximately equal in value are considered safe too.\n * Integer numbers must still be exactly equal.\n */\nexport function isSafeNumber(value, config) {\n if (isInteger(value)) {\n return Number.isSafeInteger(Number.parseInt(value, 10));\n }\n const num = Number.parseFloat(value);\n const parsed = String(num);\n if (value === parsed) {\n return true;\n }\n const valueDigits = extractSignificantDigits(value);\n const parsedDigits = extractSignificantDigits(parsed);\n if (valueDigits === parsedDigits) {\n return true;\n }\n if (config?.approx === true) {\n // A value is approximately equal when:\n // 1. it is a floating point number, not an integer\n // 2. it has at least 14 digits\n // 3. the first 14 digits are equal\n const requiredDigits = 14;\n if (!isInteger(value) && parsedDigits.length >= requiredDigits && valueDigits.startsWith(parsedDigits.substring(0, requiredDigits))) {\n return true;\n }\n }\n return false;\n}\nexport let UnsafeNumberReason = /*#__PURE__*/function (UnsafeNumberReason) {\n UnsafeNumberReason[\"underflow\"] = \"underflow\";\n UnsafeNumberReason[\"overflow\"] = \"overflow\";\n UnsafeNumberReason[\"truncate_integer\"] = \"truncate_integer\";\n UnsafeNumberReason[\"truncate_float\"] = \"truncate_float\";\n return UnsafeNumberReason;\n}({});\n\n/**\n * When the provided value is an unsafe number, describe what the reason is:\n * overflow, underflow, truncate_integer, or truncate_float.\n * Returns undefined when the value is safe.\n */\nexport function getUnsafeNumberReason(value) {\n if (isSafeNumber(value, {\n approx: false\n })) {\n return undefined;\n }\n if (isInteger(value)) {\n return UnsafeNumberReason.truncate_integer;\n }\n const num = Number.parseFloat(value);\n if (!Number.isFinite(num)) {\n return UnsafeNumberReason.overflow;\n }\n if (num === 0) {\n return UnsafeNumberReason.underflow;\n }\n return UnsafeNumberReason.truncate_float;\n}\n\n/**\n * Convert a string into a number when it is safe to do so.\n * Throws an error otherwise, explaining the reason.\n */\nexport function toSafeNumberOrThrow(value, config) {\n const number = Number.parseFloat(value);\n const unsafeReason = getUnsafeNumberReason(value);\n if (config?.approx === true ? unsafeReason && unsafeReason !== UnsafeNumberReason.truncate_float : unsafeReason) {\n const unsafeReasonText = unsafeReason?.replace(/_\\w+$/, '');\n throw new Error(`Cannot safely convert to number: the value '${value}' would ${unsafeReasonText} and become ${number}`);\n }\n return number;\n}\n\n/**\n * Split a number into sign, digits, and exponent.\n * The value can be constructed again from a split number by inserting a dot\n * at the second character of the digits if there is more than one digit,\n * prepending it with the sign, and appending the exponent like `e${exponent}`\n */\nexport function splitNumber(value) {\n const match = value.match(/^(-?)(\\d+\\.?\\d*)([eE]([+-]?\\d+))?$/);\n if (!match) {\n throw new SyntaxError(`Invalid number: ${value}`);\n }\n const sign = match[1];\n const digitsStr = match[2];\n let exponent = match[4] !== undefined ? Number.parseInt(match[4], 10) : 0;\n const dot = digitsStr.indexOf('.');\n exponent += dot !== -1 ? dot - 1 : digitsStr.length - 1;\n const digits = digitsStr.replace('.', '') // remove the dot (must be removed before removing leading zeros)\n .replace(/^0*/, zeros => {\n // remove leading zeros, add their count to the exponent\n exponent -= zeros.length;\n return '';\n }).replace(/0*$/, ''); // remove trailing zeros\n\n return digits.length > 0 ? {\n sign,\n digits,\n exponent\n } : {\n sign,\n digits: '0',\n exponent: exponent + 1\n };\n}\n\n/**\n * Compare two strings containing a numeric value\n * Returns 1 when a is larger than b, 0 when they are equal,\n * and -1 when a is smaller than b.\n */\nexport function compareNumber(a, b) {\n if (a === b) {\n return 0;\n }\n const aa = splitNumber(a);\n const bb = splitNumber(b);\n const sign = aa.sign === '-' ? -1 : 1;\n if (aa.sign !== bb.sign) {\n if (aa.digits === '0' && bb.digits === '0') {\n return 0;\n }\n return sign;\n }\n if (aa.exponent !== bb.exponent) {\n return aa.exponent > bb.exponent ? sign : aa.exponent < bb.exponent ? -sign : 0;\n }\n return aa.digits > bb.digits ? sign : aa.digits < bb.digits ? -sign : 0;\n}\n\n/**\n * Count the significant digits of a number.\n *\n * For example:\n * '2.34' returns 3\n * '-77' returns 2\n * '0.003400' returns 2\n * '120.5e+30' returns 4\n **/\nexport function countSignificantDigits(value) {\n const {\n start,\n end\n } = getSignificantDigitRange(value);\n const dot = value.indexOf('.');\n if (dot === -1 || dot < start || dot > end) {\n return end - start;\n }\n return end - start - 1;\n}\n\n/**\n * Get the significant digits of a number.\n *\n * For example:\n * '2.34' returns '234'\n * '-77' returns '77'\n * '0.003400' returns '34'\n * '120.5e+30' returns '1205'\n **/\nexport function extractSignificantDigits(value) {\n const {\n start,\n end\n } = getSignificantDigitRange(value);\n const digits = value.substring(start, end);\n const dot = digits.indexOf('.');\n if (dot === -1) {\n return digits;\n }\n return digits.substring(0, dot) + digits.substring(dot + 1);\n}\n\n/**\n * Returns the range (start to end) of the significant digits of a value.\n * Note that this range _may_ contain the decimal dot.\n *\n * For example:\n *\n * getSignificantDigitRange('0.0325900') // { start: 3, end: 7 }\n * getSignificantDigitRange('2.0300') // { start: 0, end: 3 }\n * getSignificantDigitRange('0.0') // { start: 3, end: 3 }\n *\n */\nfunction getSignificantDigitRange(value) {\n let start = 0;\n if (value[0] === '-') {\n start++;\n }\n while (value[start] === '0' || value[start] === '.') {\n start++;\n }\n let end = value.lastIndexOf('e');\n if (end === -1) {\n end = value.lastIndexOf('E');\n }\n if (end === -1) {\n end = value.length;\n }\n while ((value[end - 1] === '0' || value[end - 1] === '.') && end > start) {\n end--;\n }\n return {\n start,\n end\n };\n}\n//# sourceMappingURL=utils.js.map","import { compareNumber, countSignificantDigits, getUnsafeNumberReason, isInteger, isNumber, UnsafeNumberReason } from './utils.js';\n\n/**\n * A lossless number. Stores its numeric value as string\n */\nexport class LosslessNumber {\n // numeric value as string\n\n // type information\n isLosslessNumber = true;\n constructor(value) {\n if (!isNumber(value)) {\n throw new Error(`Invalid number (value: \"${value}\")`);\n }\n this.value = value;\n }\n\n /**\n * Get the value of the LosslessNumber as number or bigint.\n *\n * - a number is returned for safe numbers and decimal values that only lose some insignificant digits\n * - a bigint is returned for big integer numbers\n * - an Error is thrown for values that will overflow or underflow\n *\n * Note that you can implement your own strategy for conversion by just getting the value as string\n * via .toString(), and using util functions like isInteger, isSafeNumber, getUnsafeNumberReason,\n * and toSafeNumberOrThrow to convert it to a numeric value.\n */\n valueOf() {\n const unsafeReason = getUnsafeNumberReason(this.value);\n\n // safe or truncate_float\n if (unsafeReason === undefined || unsafeReason === UnsafeNumberReason.truncate_float) {\n return Number.parseFloat(this.value);\n }\n\n // truncate_integer\n if (isInteger(this.value)) {\n return BigInt(this.value);\n }\n\n // overflow or underflow\n throw new Error(`Cannot safely convert to number: the value '${this.value}' would ${unsafeReason} and become ${Number.parseFloat(this.value)}`);\n }\n\n /**\n * Get the value of the LosslessNumber as string.\n */\n toString() {\n return this.value;\n }\n\n // Note: we do NOT implement a .toJSON() method, and you should not implement\n // or use that, it cannot safely turn the numeric value in the string into\n // stringified JSON since it has to be parsed into a number first.\n}\n\n/**\n * Test whether a value is a LosslessNumber\n */\nexport function isLosslessNumber(value) {\n // @ts-expect-error\n return value && typeof value === 'object' && value.isLosslessNumber || false;\n}\n\n/**\n * Convert a number into a LosslessNumber if this is possible in a safe way\n * If the value has too many digits, or is NaN or Infinity, an error will be thrown\n */\nexport function toLosslessNumber(value) {\n const maxDigits = 15;\n if (countSignificantDigits(String(value)) > maxDigits) {\n throw new Error(`Invalid number: contains more than 15 digits and is most likely truncated and unsafe by itself (value: ${value})`);\n }\n if (Number.isNaN(value)) {\n throw new Error('Invalid number: NaN');\n }\n if (!Number.isFinite(value)) {\n throw new Error(`Invalid number: ${value}`);\n }\n return new LosslessNumber(String(value));\n}\n\n/**\n * Compare two lossless numbers.\n * Returns 1 when a is larger than b, 0 when they are equal,\n * and -1 when a is smaller than b.\n */\nexport function compareLosslessNumber(a, b) {\n return compareNumber(a.value, b.value);\n}\n//# sourceMappingURL=LosslessNumber.js.map","import { LosslessNumber } from './LosslessNumber.js';\nimport { isInteger } from './utils.js';\nexport function parseLosslessNumber(value) {\n return new LosslessNumber(value);\n}\nexport function parseNumberAndBigInt(value) {\n return isInteger(value) ? BigInt(value) : Number.parseFloat(value);\n}\n//# sourceMappingURL=numberParsers.js.map","import { isLosslessNumber } from './LosslessNumber.js';\n/**\n * Revive a json object.\n * Applies the reviver function recursively on all values in the JSON object.\n * @param json A JSON Object, Array, or value\n * @param reviver\n * A reviver function invoked with arguments `key` and `value`,\n * which must return a replacement value. The function context\n * (`this`) is the Object or Array that contains the currently\n * handled value.\n */\nexport function revive(json, reviver) {\n return reviveValue({\n '': json\n }, '', json, reviver);\n}\n\n/**\n * Revive a value\n */\nfunction reviveValue(context, key, value, reviver) {\n if (Array.isArray(value)) {\n return reviver.call(context, key, reviveArray(value, reviver));\n }\n if (value && typeof value === 'object' && !isLosslessNumber(value)) {\n // note the special case for LosslessNumber,\n // we don't want to iterate over the internals of a LosslessNumber\n return reviver.call(context, key, reviveObject(value, reviver));\n }\n return reviver.call(context, key, value);\n}\n\n/**\n * Revive the properties of an object\n */\nfunction reviveObject(object, reviver) {\n for (const key of Object.keys(object)) {\n const value = reviveValue(object, key, object[key], reviver);\n if (value !== undefined) {\n object[key] = value;\n } else {\n delete object[key];\n }\n }\n return object;\n}\n\n/**\n * Revive the properties of an Array\n */\nfunction reviveArray(array, reviver) {\n for (let i = 0; i < array.length; i++) {\n array[i] = reviveValue(array, String(i), array[i], reviver);\n }\n return array;\n}\n//# sourceMappingURL=revive.js.map","import { parseLosslessNumber } from './numberParsers.js';\nimport { revive } from './revive.js';\n/**\n * The LosslessJSON.parse() method parses a string as JSON, optionally transforming\n * the value produced by parsing.\n *\n * The parser is based on the parser of Tan Li Hou shared in\n * https://lihautan.com/json-parser-with-javascript/\n *\n * @param text\n * The string to parse as JSON. See the JSON object for a description of JSON syntax.\n *\n * @param [reviver]\n * If a function, prescribes how the value originally produced by parsing is\n * transformed, before being returned.\n *\n * @param [parseNumber=parseLosslessNumber]\n * Pass a custom number parser. Input is a string, and the output can be unknown\n * numeric value: number, bigint, LosslessNumber, or a custom BigNumber library.\n *\n * @returns Returns the Object corresponding to the given JSON text.\n *\n * @throws Throws a SyntaxError exception if the string to parse is not valid JSON.\n */\nexport function parse(text, reviver) {\n let parseNumber = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : parseLosslessNumber;\n let i = 0;\n const value = parseValue();\n expectValue(value);\n expectEndOfInput();\n return reviver ? revive(value, reviver) : value;\n function parseObject() {\n if (text.charCodeAt(i) === codeOpeningBrace) {\n i++;\n skipWhitespace();\n const object = {};\n let initial = true;\n while (i < text.length && text.charCodeAt(i) !== codeClosingBrace) {\n if (!initial) {\n eatComma();\n skipWhitespace();\n } else {\n initial = false;\n }\n const start = i;\n const key = parseString();\n if (key === undefined) {\n throwObjectKeyExpected();\n return; // To make TS happy\n }\n skipWhitespace();\n eatColon();\n const value = parseValue();\n if (value === undefined) {\n throwObjectValueExpected();\n return; // To make TS happy\n }\n\n // biome-ignore lint/suspicious/noPrototypeBuiltins: TODO: replace with hasOwn one day, when browser support is high enough\n if (Object.prototype.hasOwnProperty.call(object, key) && !isDeepEqual(value, object[key])) {\n // Note that we could also test `if(key in object) {...}`\n // or `if (object[key] !== 'undefined') {...}`, but that is slower.\n throwDuplicateKey(key, start + 1);\n }\n object[key] = value;\n }\n if (text.charCodeAt(i) !== codeClosingBrace) {\n throwObjectKeyOrEndExpected();\n }\n i++;\n return object;\n }\n }\n function parseArray() {\n if (text.charCodeAt(i) === codeOpeningBracket) {\n i++;\n skipWhitespace();\n const array = [];\n let initial = true;\n while (i < text.length && text.charCodeAt(i) !== codeClosingBracket) {\n if (!initial) {\n eatComma();\n } else {\n initial = false;\n }\n const value = parseValue();\n expectArrayItem(value);\n array.push(value);\n }\n if (text.charCodeAt(i) !== codeClosingBracket) {\n throwArrayItemOrEndExpected();\n }\n i++;\n return array;\n }\n }\n function parseValue() {\n skipWhitespace();\n const value = parseString() ?? parseNumeric() ?? parseObject() ?? parseArray() ?? parseKeyword('true', true) ?? parseKeyword('false', false) ?? parseKeyword('null', null);\n skipWhitespace();\n return value;\n }\n function parseKeyword(name, value) {\n if (text.slice(i, i + name.length) === name) {\n i += name.length;\n return value;\n }\n }\n function skipWhitespace() {\n while (isWhitespace(text.charCodeAt(i))) {\n i++;\n }\n }\n function parseString() {\n if (text.charCodeAt(i) === codeDoubleQuote) {\n i++;\n let result = '';\n while (i < text.length && text.charCodeAt(i) !== codeDoubleQuote) {\n if (text.charCodeAt(i) === codeBackslash) {\n const char = text[i + 1];\n const escapeChar = escapeCharacters[char];\n if (escapeChar !== undefined) {\n result += escapeChar;\n i++;\n } else if (char === 'u') {\n if (isHex(text.charCodeAt(i + 2)) && isHex(text.charCodeAt(i + 3)) && isHex(text.charCodeAt(i + 4)) && isHex(text.charCodeAt(i + 5))) {\n result += String.fromCharCode(Number.parseInt(text.slice(i + 2, i + 6), 16));\n i += 5;\n } else {\n throwInvalidUnicodeCharacter(i);\n }\n } else {\n throwInvalidEscapeCharacter(i);\n }\n } else {\n if (isValidStringCharacter(text.charCodeAt(i))) {\n result += text[i];\n } else {\n throwInvalidCharacter(text[i]);\n }\n }\n i++;\n }\n expectEndOfString();\n i++;\n return result;\n }\n }\n function parseNumeric() {\n const start = i;\n if (text.charCodeAt(i) === codeMinus) {\n i++;\n expectDigit(start);\n }\n if (text.charCodeAt(i) === codeZero) {\n i++;\n } else if (isNonZeroDigit(text.charCodeAt(i))) {\n i++;\n while (isDigit(text.charCodeAt(i))) {\n i++;\n }\n }\n if (text.charCodeAt(i) === codeDot) {\n i++;\n expectDigit(start);\n while (isDigit(text.charCodeAt(i))) {\n i++;\n }\n }\n if (text.charCodeAt(i) === codeLowercaseE || text.charCodeAt(i) === codeUppercaseE) {\n i++;\n if (text.charCodeAt(i) === codeMinus || text.charCodeAt(i) === codePlus) {\n i++;\n }\n expectDigit(start);\n while (isDigit(text.charCodeAt(i))) {\n i++;\n }\n }\n if (i > start) {\n return parseNumber(text.slice(start, i));\n }\n }\n function eatComma() {\n if (text.charCodeAt(i) !== codeComma) {\n throw new SyntaxError(`Comma ',' expected after value ${gotAt()}`);\n }\n i++;\n }\n function eatColon() {\n if (text.charCodeAt(i) !== codeColon) {\n throw new SyntaxError(`Colon ':' expected after property name ${gotAt()}`);\n }\n i++;\n }\n function expectValue(value) {\n if (value === undefined) {\n throw new SyntaxError(`JSON value expected ${gotAt()}`);\n }\n }\n function expectArrayItem(value) {\n if (value === undefined) {\n throw new SyntaxError(`Array item expected ${gotAt()}`);\n }\n }\n function expectEndOfInput() {\n if (i < text.length) {\n throw new SyntaxError(`Expected end of input ${gotAt()}`);\n }\n }\n function expectDigit(start) {\n if (!isDigit(text.charCodeAt(i))) {\n const numSoFar = text.slice(start, i);\n throw new SyntaxError(`Invalid number '${numSoFar}', expecting a digit ${gotAt()}`);\n }\n }\n function expectEndOfString() {\n if (text.charCodeAt(i) !== codeDoubleQuote) {\n throw new SyntaxError(`End of string '\"' expected ${gotAt()}`);\n }\n }\n function throwObjectKeyExpected() {\n throw new SyntaxError(`Quoted object key expected ${gotAt()}`);\n }\n function throwDuplicateKey(key, pos) {\n throw new SyntaxError(`Duplicate key '${key}' encountered at position ${pos}`);\n }\n function throwObjectKeyOrEndExpected() {\n throw new SyntaxError(`Quoted object key or end of object '}' expected ${gotAt()}`);\n }\n function throwArrayItemOrEndExpected() {\n throw new SyntaxError(`Array item or end of array ']' expected ${gotAt()}`);\n }\n function throwInvalidCharacter(char) {\n throw new SyntaxError(`Invalid character '${char}' ${pos()}`);\n }\n function throwInvalidEscapeCharacter(start) {\n const chars = text.slice(start, start + 2);\n throw new SyntaxError(`Invalid escape character '${chars}' ${pos()}`);\n }\n function throwObjectValueExpected() {\n throw new SyntaxError(`Object value expected after ':' ${pos()}`);\n }\n function throwInvalidUnicodeCharacter(start) {\n const chars = text.slice(start, start + 6);\n throw new SyntaxError(`Invalid unicode character '${chars}' ${pos()}`);\n }\n\n // zero based character position\n function pos() {\n return `at position ${i}`;\n }\n function got() {\n return i < text.length ? `but got '${text[i]}'` : 'but reached end of input';\n }\n function gotAt() {\n return `${got()} ${pos()}`;\n }\n}\nfunction isWhitespace(code) {\n return code === codeSpace || code === codeNewline || code === codeTab || code === codeReturn;\n}\nfunction isHex(code) {\n return code >= codeZero && code <= codeNine || code >= codeUppercaseA && code <= codeUppercaseF || code >= codeLowercaseA && code <= codeLowercaseF;\n}\nfunction isDigit(code) {\n return code >= codeZero && code <= codeNine;\n}\nfunction isNonZeroDigit(code) {\n return code >= codeOne && code <= codeNine;\n}\nexport function isValidStringCharacter(code) {\n return code >= 0x20 && code <= 0x10ffff;\n}\nexport function isDeepEqual(a, b) {\n if (a === b) {\n return true;\n }\n if (Array.isArray(a) && Array.isArray(b)) {\n return a.length === b.length && a.every((item, index) => isDeepEqual(item, b[index]));\n }\n if (isObject(a) && isObject(b)) {\n const keys = [...new Set([...Object.keys(a), ...Object.keys(b)])];\n return keys.every(key => isDeepEqual(a[key], b[key]));\n }\n return false;\n}\nfunction isObject(value) {\n return typeof value === 'object' && value !== null;\n}\n\n// map with all escape characters\nconst escapeCharacters = {\n '\"': '\"',\n '\\\\': '\\\\',\n '/': '/',\n b: '\\b',\n f: '\\f',\n n: '\\n',\n r: '\\r',\n t: '\\t'\n // note that \\u is handled separately in parseString()\n};\nconst codeBackslash = 0x5c; // \"\\\"\nconst codeOpeningBrace = 0x7b; // \"{\"\nconst codeClosingBrace = 0x7d; // \"}\"\nconst codeOpeningBracket = 0x5b; // \"[\"\nconst codeClosingBracket = 0x5d; // \"]\"\nconst codeSpace = 0x20; // \" \"\nconst codeNewline = 0xa; // \"\\n\"\nconst codeTab = 0x9; // \"\\t\"\nconst codeReturn = 0xd; // \"\\r\"\nconst codeDoubleQuote = 0x0022; // \"\nconst codePlus = 0x2b; // \"+\"\nconst codeMinus = 0x2d; // \"-\"\nconst codeZero = 0x30;\nconst codeOne = 0x31;\nconst codeNine = 0x39;\nconst codeComma = 0x2c; // \",\"\nconst codeDot = 0x2e; // \".\" (dot, period)\nconst codeColon = 0x3a; // \":\"\nexport const codeUppercaseA = 0x41; // \"A\"\nexport const codeLowercaseA = 0x61; // \"a\"\nexport const codeUppercaseE = 0x45; // \"E\"\nexport const codeLowercaseE = 0x65; // \"e\"\nexport const codeUppercaseF = 0x46; // \"F\"\nexport const codeLowercaseF = 0x66; // \"f\"\n//# sourceMappingURL=parse.js.map","import { isNumber } from './utils.js';\n\n/**\n * The LosslessJSON.stringify() method converts a JavaScript value to a JSON string,\n * optionally replacing values if a replacer function is specified, or\n * optionally including only the specified properties if a replacer array is specified.\n *\n * @param value\n * The value to convert to a JSON string.\n *\n * @param [replacer]\n * A function that alters the behavior of the stringification process,\n * or an array of String and Number objects that serve as a whitelist for\n * selecting the properties of the value object to be included in the JSON string.\n * If this value is null or not provided, all properties of the object are\n * included in the resulting JSON string.\n *\n * @param [space]\n * A String or Number object that's used to insert white space into the output\n * JSON string for readability purposes. If this is a Number, it indicates the\n * number of space characters to use as white space; this number is capped at 10\n * if it's larger than that. Values less than 1 indicate that no space should be\n * used. If this is a String, the string (or the first 10 characters of the string,\n * if it's longer than that) is used as white space. If this parameter is not\n * provided (or is null), no white space is used.\n *\n * @param [numberStringifiers]\n * An optional list with additional number stringifiers, for example to serialize\n * a BigNumber. The output of the function must be valid stringified JSON.\n * When `undefined` is returned, the property will be deleted from the object.\n * The difference with using a `replacer` is that the output of a `replacer`\n * must be JSON and will be stringified afterwards, whereas the output of the\n * `numberStringifiers` is already stringified JSON.\n *\n * @returns Returns the string representation of the JSON object.\n */\nexport function stringify(value, replacer, space, numberStringifiers) {\n const resolvedSpace = resolveSpace(space);\n const replacedValue = typeof replacer === 'function' ? replacer.call({\n '': value\n }, '', value) : value;\n return stringifyValue(replacedValue, '');\n\n /**\n * Stringify a value\n */\n function stringifyValue(value, indent) {\n if (Array.isArray(numberStringifiers)) {\n const stringifier = numberStringifiers.find(item => item.test(value));\n if (stringifier) {\n const str = stringifier.stringify(value);\n if (typeof str !== 'string' || !isNumber(str)) {\n throw new Error(`Invalid JSON number: output of a number stringifier must be a string containing a JSON number (output: ${str})`);\n }\n return str;\n }\n }\n\n // boolean, null, number, string, or date\n if (typeof value === 'boolean' || typeof value === 'number' || typeof value === 'string' || value === null || value instanceof Date || value instanceof Boolean || value instanceof Number || value instanceof String) {\n return JSON.stringify(value);\n }\n\n // lossless number, the secret ingredient :)\n // @ts-expect-error\n if (value?.isLosslessNumber) {\n return value.toString();\n }\n\n // BigInt\n if (typeof value === 'bigint') {\n return value.toString();\n }\n\n // Array\n if (Array.isArray(value)) {\n return stringifyArray(value, indent);\n }\n\n // Object (test lastly!)\n if (value && typeof value === 'object') {\n return stringifyObject(value, indent);\n }\n return undefined;\n }\n\n /**\n * Stringify an array\n */\n function stringifyArray(array, indent) {\n if (array.length === 0) {\n return '[]';\n }\n const childIndent = resolvedSpace ? indent + resolvedSpace : undefined;\n let str = resolvedSpace ? '[\\n' : '[';\n for (let i = 0; i < array.length; i++) {\n const item = typeof replacer === 'function' ? replacer.call(array, String(i), array[i]) : array[i];\n if (resolvedSpace) {\n str += childIndent;\n }\n if (typeof item !== 'undefined' && typeof item !== 'function') {\n str += stringifyValue(item, childIndent);\n } else {\n str += 'null';\n }\n if (i < array.length - 1) {\n str += resolvedSpace ? ',\\n' : ',';\n }\n }\n str += resolvedSpace ? `\\n${indent}]` : ']';\n return str;\n }\n\n /**\n * Stringify an object\n */\n function stringifyObject(object, indent) {\n if (typeof object.toJSON === 'function') {\n return stringify(object.toJSON(), replacer, space, undefined);\n }\n const keys = Array.isArray(replacer) ? replacer.map(String) : Object.keys(object);\n if (keys.length === 0) {\n return '{}';\n }\n const childIndent = resolvedSpace ? indent + resolvedSpace : undefined;\n let first = true;\n let str = resolvedSpace ? '{\\n' : '{';\n for (const key of keys) {\n const value = typeof replacer === 'function' ? replacer.call(object, key, object[key]) : object[key];\n if (includeProperty(key, value)) {\n if (first) {\n first = false;\n } else {\n str += resolvedSpace ? ',\\n' : ',';\n }\n const keyStr = JSON.stringify(key);\n str += resolvedSpace ? `${childIndent + keyStr}: ` : `${keyStr}:`;\n str += stringifyValue(value, childIndent);\n }\n }\n str += resolvedSpace ? `\\n${indent}}` : '}';\n return str;\n }\n\n /**\n * Test whether to include a property in a stringified object or not.\n */\n function includeProperty(_key, value) {\n return typeof value !== 'undefined' && typeof value !== 'function' && typeof value !== 'symbol';\n }\n}\n\n/**\n * Resolve a JSON stringify space:\n * replace a number with a string containing that number of spaces\n */\nfunction resolveSpace(space) {\n if (typeof space === 'number') {\n return ' '.repeat(space);\n }\n if (typeof space === 'string' && space !== '') {\n return space;\n }\n return undefined;\n}\n//# sourceMappingURL=stringify.js.map","import { css, cx } from '@emotion/css';\nimport { isEqual } from 'lodash';\nimport memoizeOne from 'memoize-one';\nimport { PureComponent, useEffect, useState } from 'react';\nimport * as React from 'react';\n\nimport {\n CoreApp,\n DataFrame,\n Field,\n GrafanaTheme2,\n IconName,\n LinkModel,\n LogLabelStatsModel,\n LogRowModel,\n} from '@grafana/data';\nimport { t } from '@grafana/i18n';\nimport { reportInteraction } from '@grafana/runtime';\nimport {\n ClipboardButton,\n DataLinkButton,\n IconButton,\n PopoverContent,\n Themeable2,\n Tooltip,\n withTheme2,\n} from '@grafana/ui';\n\nimport { logRowToSingleRowDataFrame } from '../logsModel';\nimport { getLabelTypeFromRow } from '../utils';\n\nimport { LogLabelStats } from './LogLabelStats';\nimport { getLogRowStyles } from './getLogRowStyles';\n\ninterface LinkModelWithIcon extends LinkModel<Field> {\n icon?: IconName;\n}\n\nexport interface Props extends Themeable2 {\n parsedValues: string[];\n parsedKeys: string[];\n disableActions: boolean;\n wrapLogMessage?: boolean;\n isLabel?: boolean;\n onClickFilterLabel?: (key: string, value: string, frame?: DataFrame) => void;\n onClickFilterOutLabel?: (key: string, value: string, frame?: DataFrame) => void;\n links?: LinkModelWithIcon[];\n getStats: () => LogLabelStatsModel[] | null;\n displayedFields?: string[];\n onClickShowField?: (key: string) => void;\n onClickHideField?: (key: string) => void;\n row: LogRowModel;\n app?: CoreApp;\n isFilterLabelActive?: (key: string, value: string, refId?: string) => Promise<boolean>;\n onPinLine?: (row: LogRowModel, allowUnPin?: boolean) => void;\n pinLineButtonTooltipTitle?: PopoverContent;\n}\n\ninterface State {\n showFieldsStats: boolean;\n fieldCount: number;\n fieldStats: LogLabelStatsModel[] | null;\n}\n\nconst getStyles = memoizeOne((theme: GrafanaTheme2) => {\n return {\n labelType: css({\n border: `solid 1px ${theme.colors.text.secondary}`,\n color: theme.colors.text.secondary,\n borderRadius: theme.shape.radius.circle,\n fontSize: theme.spacing(1),\n lineHeight: theme.spacing(1.25),\n height: theme.spacing(1.5),\n width: theme.spacing(1.5),\n display: 'flex',\n justifyContent: 'center',\n verticalAlign: 'middle',\n marginLeft: theme.spacing(1),\n }),\n wordBreakAll: css({\n label: 'wordBreakAll',\n wordBreak: 'break-all',\n }),\n copyButton: css({\n '& > button': {\n gap: 0,\n color: theme.colors.text.secondary,\n padding: 0,\n justifyContent: 'center',\n borderRadius: theme.shape.radius.circle,\n height: theme.spacing(theme.components.height.sm),\n width: theme.spacing(theme.components.height.sm),\n svg: {\n margin: 0,\n },\n\n 'span > div': {\n top: '-5px',\n '& button': {\n color: theme.colors.success.main,\n },\n },\n },\n }),\n adjoiningLinkButton: css({\n marginLeft: theme.spacing(1),\n }),\n wrapLine: css({\n label: 'wrapLine',\n whiteSpace: 'pre-wrap',\n }),\n logDetailsStats: css({\n padding: `0 ${theme.spacing(1)}`,\n }),\n logDetailsValue: css({\n display: 'flex',\n alignItems: 'center',\n lineHeight: '22px',\n\n '.log-details-value-copy': {\n visibility: 'hidden',\n },\n '&:hover': {\n '.log-details-value-copy': {\n visibility: 'visible',\n },\n },\n }),\n buttonRow: css({\n display: 'flex',\n flexDirection: 'row',\n gap: theme.spacing(0.5),\n marginLeft: theme.spacing(0.5),\n }),\n };\n});\n\nclass UnThemedLogDetailsRow extends PureComponent<Props, State> {\n state: State = {\n showFieldsStats: false,\n fieldCount: 0,\n fieldStats: null,\n };\n\n componentDidUpdate() {\n if (this.state.showFieldsStats) {\n this.updateStats();\n }\n }\n\n showField = () => {\n const { onClickShowField: onClickShowDetectedField, parsedKeys, row } = this.props;\n if (onClickShowDetectedField) {\n onClickShowDetectedField(parsedKeys[0]);\n }\n\n reportInteraction('grafana_explore_logs_log_details_replace_line_clicked', {\n datasourceType: row.datasourceType,\n logRowUid: row.uid,\n type: 'enable',\n });\n };\n\n hideField = () => {\n const { onClickHideField: onClickHideDetectedField, parsedKeys, row } = this.props;\n if (onClickHideDetectedField) {\n onClickHideDetectedField(parsedKeys[0]);\n }\n\n reportInteraction('grafana_explore_logs_log_details_replace_line_clicked', {\n datasourceType: row.datasourceType,\n logRowUid: row.uid,\n type: 'disable',\n });\n };\n\n isFilterLabelActive = async () => {\n const { isFilterLabelActive, parsedKeys, parsedValues, row } = this.props;\n if (isFilterLabelActive) {\n return await isFilterLabelActive(parsedKeys[0], parsedValues[0], row.dataFrame?.refId);\n }\n return false;\n };\n\n filterLabel = () => {\n const { onClickFilterLabel, parsedKeys, parsedValues, row } = this.props;\n if (onClickFilterLabel) {\n onClickFilterLabel(parsedKeys[0], parsedValues[0], logRowToSingleRowDataFrame(row) || undefined);\n }\n\n reportInteraction('grafana_explore_logs_log_details_filter_clicked', {\n datasourceType: row.datasourceType,\n filterType: 'include',\n logRowUid: row.uid,\n });\n };\n\n filterOutLabel = () => {\n const { onClickFilterOutLabel, parsedKeys, parsedValues, row } = this.props;\n if (onClickFilterOutLabel) {\n onClickFilterOutLabel(parsedKeys[0], parsedValues[0], logRowToSingleRowDataFrame(row) || undefined);\n }\n\n reportInteraction('grafana_explore_logs_log_details_filter_clicked', {\n datasourceType: row.datasourceType,\n filterType: 'exclude',\n logRowUid: row.uid,\n });\n };\n\n updateStats = () => {\n const { getStats } = this.props;\n const fieldStats = getStats();\n const fieldCount = fieldStats ? fieldStats.reduce((sum, stat) => sum + stat.count, 0) : 0;\n if (!isEqual(this.state.fieldStats, fieldStats) || fieldCount !== this.state.fieldCount) {\n this.setState({ fieldStats, fieldCount });\n }\n };\n\n showStats = () => {\n const { isLabel, row, app } = this.props;\n const { showFieldsStats } = this.state;\n if (!showFieldsStats) {\n this.updateStats();\n }\n this.toggleFieldsStats();\n\n reportInteraction('grafana_explore_logs_log_details_stats_clicked', {\n dataSourceType: row.datasourceType,\n fieldType: isLabel ? 'label' : 'detectedField',\n type: showFieldsStats ? 'close' : 'open',\n logRowUid: row.uid,\n app,\n });\n };\n\n toggleFieldsStats() {\n this.setState((state) => {\n return {\n showFieldsStats: !state.showFieldsStats,\n };\n });\n }\n\n generateClipboardButton(val: string) {\n const { theme } = this.props;\n const styles = getStyles(theme);\n\n return (\n <div className={`log-details-value-copy ${styles.copyButton}`}>\n <ClipboardButton\n getText={() => val}\n aria-label={t('logs.un-themed-log-details-row.title-copy-value-to-clipboard', 'Copy value to clipboard')}\n fill=\"text\"\n variant=\"secondary\"\n icon=\"copy\"\n size=\"md\"\n />\n </div>\n );\n }\n\n generateMultiVal(value: string[], showCopy?: boolean) {\n return (\n <table>\n <tbody>\n {value?.map((val, i) => {\n return (\n <tr key={`${val}-${i}`}>\n <td>\n {val}\n {showCopy && val !== '' && this.generateClipboardButton(val)}\n </td>\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n }\n\n render() {\n const {\n theme,\n parsedKeys,\n parsedValues,\n isLabel,\n links,\n displayedFields,\n wrapLogMessage,\n onClickFilterLabel,\n onClickFilterOutLabel,\n disableActions,\n row,\n app,\n onPinLine,\n pinLineButtonTooltipTitle,\n } = this.props;\n const { showFieldsStats, fieldStats, fieldCount } = this.state;\n const styles = getStyles(theme);\n const rowStyles = getLogRowStyles(theme);\n const singleKey = parsedKeys == null ? false : parsedKeys.length === 1;\n const singleVal = parsedValues == null ? false : parsedValues.length === 1;\n const hasFilteringFunctionality = !disableActions && onClickFilterLabel && onClickFilterOutLabel;\n const refIdTooltip = app === CoreApp.Explore && row.dataFrame?.refId ? ` in query ${row.dataFrame?.refId}` : '';\n const labelType = singleKey ? getLabelTypeFromRow(parsedKeys[0], row) : null;\n\n const isMultiParsedValueWithNoContent =\n !singleVal && parsedValues != null && !parsedValues.every((val) => val === '');\n\n const toggleFieldButton =\n displayedFields && parsedKeys != null && displayedFields.includes(parsedKeys[0]) ? (\n <IconButton\n variant=\"primary\"\n tooltip={t('logs.un-themed-log-details-row.toggle-field-button.tooltip-hide-this-field', 'Hide this field')}\n name=\"eye\"\n onClick={this.hideField}\n />\n ) : (\n <IconButton\n tooltip={t(\n 'logs.un-themed-log-details-row.toggle-field-button.tooltip-field-instead-message',\n 'Show this field instead of the message'\n )}\n name=\"eye\"\n onClick={this.showField}\n />\n );\n\n return (\n <>\n <tr className={rowStyles.logDetailsValue}>\n <td className={rowStyles.logsDetailsIcon}>\n <div className={styles.buttonRow}>\n {hasFilteringFunctionality && (\n <>\n <AsyncIconButton\n name=\"search-plus\"\n onClick={this.filterLabel}\n // We purposely want to pass a new function on every render to allow the active state to be updated when log details remains open between updates.\n isActive={() => this.isFilterLabelActive()}\n tooltipSuffix={refIdTooltip}\n />\n <IconButton\n name=\"search-minus\"\n tooltip={\n app === CoreApp.Explore && row.dataFrame?.refId\n ? t('logs.un-themed-log-details-row.filter-out-query', 'Filter out value in query {{query}}', {\n query: row.dataFrame?.refId,\n })\n : t('logs.un-themed-log-details-row.filter-out', 'Filter out value')\n }\n onClick={this.filterOutLabel}\n />\n </>\n )}\n {!disableActions && displayedFields && toggleFieldButton}\n {!disableActions && (\n <IconButton\n variant={showFieldsStats ? 'primary' : 'secondary'}\n name=\"signal\"\n tooltip={t('logs.un-themed-log-details-row.tooltip-adhoc-statistics', 'Ad-hoc statistics')}\n className=\"stats-button\"\n disabled={!singleKey}\n onClick={this.showStats}\n />\n )}\n </div>\n </td>\n\n <td>{labelType && <LabelTypeBadge type={labelType} styles={styles} />}</td>\n {/* Key - value columns */}\n <td className={rowStyles.logDetailsLabel}>{singleKey ? parsedKeys[0] : this.generateMultiVal(parsedKeys)}</td>\n <td className={cx(styles.wordBreakAll, wrapLogMessage && styles.wrapLine)}>\n <div className={styles.logDetailsValue}>\n {singleVal ? parsedValues[0] : this.generateMultiVal(parsedValues, true)}\n {singleVal && this.generateClipboardButton(parsedValues[0])}\n <div className={cx((singleVal || isMultiParsedValueWithNoContent) && styles.adjoiningLinkButton)}>\n {links?.map((link, i) => {\n if (link.onClick && onPinLine) {\n const originalOnClick = link.onClick;\n link.onClick = (e, origin) => {\n // Pin the line\n onPinLine(row, false);\n\n // Execute the link onClick function\n originalOnClick(e, origin);\n };\n }\n return (\n <span key={`${link.title}-${i}`}>\n <DataLinkButton\n buttonProps={{\n // Show tooltip message if max number of pinned lines has been reached\n tooltip:\n typeof pinLineButtonTooltipTitle === 'object' && link.onClick\n ? pinLineButtonTooltipTitle\n : undefined,\n variant: 'secondary',\n fill: 'outline',\n ...(link.icon && { icon: link.icon }),\n }}\n link={link}\n />\n </span>\n );\n })}\n </div>\n </div>\n </td>\n </tr>\n {showFieldsStats && singleKey && singleVal && (\n <tr>\n <td colSpan={2}>\n <IconButton\n variant={showFieldsStats ? 'primary' : 'secondary'}\n name=\"signal\"\n tooltip={t('logs.un-themed-log-details-row.tooltip-hide-adhoc-statistics', 'Hide ad-hoc statistics')}\n onClick={this.showStats}\n />\n </td>\n <td colSpan={2}>\n <div className={styles.logDetailsStats}>\n <LogLabelStats\n stats={fieldStats!}\n label={parsedKeys[0]}\n value={parsedValues[0]}\n rowCount={fieldCount}\n isLabel={isLabel}\n />\n </div>\n </td>\n </tr>\n )}\n </>\n );\n }\n}\n\nfunction LabelTypeBadge({ type, styles }: { type: string; styles: ReturnType<typeof getStyles> }) {\n return (\n <Tooltip content={type}>\n <div className={styles.labelType}>\n <span>{type.substring(0, 1)}</span>\n </div>\n </Tooltip>\n );\n}\n\ninterface AsyncIconButtonProps extends Pick<React.ButtonHTMLAttributes<HTMLButtonElement>, 'onClick'> {\n name: IconName;\n isActive(): Promise<boolean>;\n tooltipSuffix: string;\n}\n\nconst AsyncIconButton = ({ isActive, tooltipSuffix, ...rest }: AsyncIconButtonProps) => {\n const [active, setActive] = useState(false);\n const tooltip = active ? 'Remove filter' : 'Filter for value';\n\n useEffect(() => {\n isActive().then(setActive);\n }, [isActive]);\n\n return <IconButton {...rest} variant={active ? 'primary' : undefined} tooltip={tooltip + tooltipSuffix} />;\n};\n\nexport const LogDetailsRow = withTheme2(UnThemedLogDetailsRow);\nLogDetailsRow.displayName = 'LogDetailsRow';\n","import { cx } from '@emotion/css';\nimport { PureComponent, useMemo } from 'react';\n\nimport {\n TimeRange,\n CoreApp,\n DataFrame,\n DataFrameType,\n IconName,\n LinkModel,\n LogRowModel,\n PluginExtensionPoints,\n PluginExtensionResourceAttributesContext,\n} from '@grafana/data';\nimport { Trans, t } from '@grafana/i18n';\nimport { usePluginLinks } from '@grafana/runtime';\nimport { PopoverContent, Themeable2, withTheme2 } from '@grafana/ui';\nimport { GetFieldLinksFn } from 'app/plugins/panel/logs/types';\n\nimport { calculateLogsLabelStats, calculateStats } from '../utils';\n\nimport { LogDetailsBody } from './LogDetailsBody';\nimport { LogDetailsRow } from './LogDetailsRow';\nimport { getLogLevelStyles, LogRowStyles } from './getLogRowStyles';\nimport { getAllFields, createLogLineLinks } from './logParser';\n\nexport interface Props extends Themeable2 {\n row: LogRowModel;\n showDuplicates: boolean;\n getRows: () => LogRowModel[];\n wrapLogMessage: boolean;\n className?: string;\n hasError?: boolean;\n app?: CoreApp;\n styles: LogRowStyles;\n\n onClickFilterLabel?: (key: string, value: string, frame?: DataFrame) => void;\n onClickFilterOutLabel?: (key: string, value: string, frame?: DataFrame) => void;\n getFieldLinks?: GetFieldLinksFn;\n displayedFields?: string[];\n onClickShowField?: (key: string) => void;\n onClickHideField?: (key: string) => void;\n isFilterLabelActive?: (key: string, value: string, refId?: string) => Promise<boolean>;\n\n onPinLine?: (row: LogRowModel) => void;\n pinLineButtonTooltipTitle?: PopoverContent;\n links?: Record<string, LinkModel[]>;\n timeRange: TimeRange;\n}\n\ninterface LinkModelWithIcon extends LinkModel {\n icon?: IconName;\n}\n\nexport const useAttributesExtensionLinks = (row: LogRowModel, timeRange: TimeRange) => {\n // Stable context for useMemo inside usePluginLinks\n const context: PluginExtensionResourceAttributesContext = useMemo(() => {\n return {\n attributes: Object.fromEntries(Object.entries(row.labels).map(([key, value]) => [key, [value]])),\n timeRange: { from: timeRange.from.valueOf(), to: timeRange.to.valueOf() },\n datasource: {\n type: row.datasourceType ?? '',\n uid: row.datasourceUid ?? '',\n },\n };\n }, [row.labels, row.datasourceType, row.datasourceUid, timeRange]);\n\n const { links } = usePluginLinks({\n extensionPointId: PluginExtensionPoints.LogsViewResourceAttributes,\n limitPerPlugin: 10,\n context,\n });\n\n return useMemo(() => {\n return links.reduce<Record<string, LinkModelWithIcon[]>>((acc, link) => {\n if (link.category) {\n const linkModel: LinkModelWithIcon = {\n href: link.path ?? '',\n target: '_blank',\n origin: undefined,\n title: link.title,\n onClick: link.onClick,\n icon: link.icon,\n };\n\n if (acc[link.category]) {\n acc[link.category].push(linkModel);\n } else {\n acc[link.category] = [linkModel];\n }\n }\n return acc;\n }, {});\n }, [links]);\n};\n\nconst withAttributesExtensionLinks = (Component: React.ComponentType<Props>) => {\n function ComponentWithLinks(props: Props) {\n const labelLinks = useAttributesExtensionLinks(props.row, props.timeRange);\n return <Component {...props} links={labelLinks} />;\n }\n\n return ComponentWithLinks;\n};\n\nclass UnThemedLogDetails extends PureComponent<Props> {\n render() {\n const {\n app,\n row,\n theme,\n hasError,\n onClickFilterOutLabel,\n onClickFilterLabel,\n getRows,\n showDuplicates,\n className,\n onClickShowField,\n onClickHideField,\n displayedFields,\n getFieldLinks,\n wrapLogMessage,\n onPinLine,\n styles,\n pinLineButtonTooltipTitle,\n links,\n } = this.props;\n const levelStyles = getLogLevelStyles(theme, row.logLevel);\n const labels = row.labels ? row.labels : {};\n const labelsAvailable = Object.keys(labels).length > 0;\n const fieldsAndLinks = getAllFields(row, getFieldLinks);\n let fieldsWithLinks = fieldsAndLinks.filter((f) => f.links?.length);\n const displayedFieldsWithLinks = fieldsWithLinks.filter((f) => f.fieldIndex !== row.entryFieldIndex).sort();\n const hiddenFieldsWithLinks = fieldsWithLinks.filter((f) => f.fieldIndex === row.entryFieldIndex).sort();\n const fieldsWithLinksFromVariableMap = createLogLineLinks(hiddenFieldsWithLinks);\n const fieldsWithLinksAvailable =\n (displayedFieldsWithLinks && displayedFieldsWithLinks.length > 0) ||\n (fieldsWithLinksFromVariableMap && fieldsWithLinksFromVariableMap.length > 0);\n\n const fields =\n row.dataFrame.meta?.type === DataFrameType.LogLines\n ? // for LogLines frames (dataplane) we don't want to show any additional fields besides already extracted labels and links\n []\n : // for other frames, do not show the log message unless there is a link attached\n fieldsAndLinks.filter((f) => f.links?.length === 0 && f.fieldIndex !== row.entryFieldIndex).sort();\n const fieldsAvailable = fields && fields.length > 0;\n\n // If logs with error, we are not showing the level color\n const levelClassName = hasError\n ? ''\n : `${levelStyles.logsRowLevelColor} ${styles.logsRowLevel} ${styles.logsRowLevelDetails}`;\n\n return (\n <tr className={cx(className, styles.logDetails)}>\n {showDuplicates && <td />}\n <td className={levelClassName} aria-label={t('logs.un-themed-log-details.aria-label-log-level', 'Log level')} />\n <td colSpan={4}>\n <div className={styles.logDetailsContainer}>\n <table className={styles.logDetailsTable}>\n <tbody>\n {displayedFields && displayedFields.length > 0 && (\n <>\n <tr>\n <td\n colSpan={100}\n className={styles.logDetailsHeading}\n aria-label={t('logs.un-themed-log-details.aria-label-line', 'Log line')}\n >\n <Trans i18nKey=\"logs.log-details.log-line\">Log line</Trans>\n </td>\n </tr>\n <LogDetailsBody\n onClickShowField={onClickShowField}\n onClickHideField={onClickHideField}\n row={row}\n app={app}\n displayedFields={displayedFields}\n disableActions={false}\n theme={theme}\n />\n </>\n )}\n {(labelsAvailable || fieldsAvailable) && (\n <tr>\n <td\n colSpan={100}\n className={styles.logDetailsHeading}\n aria-label={t('logs.un-themed-log-details.aria-label-fields', 'Fields')}\n >\n <Trans i18nKey=\"logs.log-details.fields\">Fields</Trans>\n </td>\n </tr>\n )}\n {Object.keys(labels)\n .sort()\n .map((key, i) => {\n const value = labels[key];\n return (\n <LogDetailsRow\n key={`${key}=${value}-${i}`}\n parsedKeys={[key]}\n parsedValues={[value]}\n isLabel={true}\n getStats={() => calculateLogsLabelStats(getRows(), key)}\n onClickFilterOutLabel={onClickFilterOutLabel}\n onClickFilterLabel={onClickFilterLabel}\n onClickShowField={onClickShowField}\n onClickHideField={onClickHideField}\n row={row}\n app={app}\n wrapLogMessage={wrapLogMessage}\n displayedFields={displayedFields}\n disableActions={false}\n isFilterLabelActive={this.props.isFilterLabelActive}\n links={links?.[key]}\n />\n );\n })}\n {fields.map((field, i) => {\n const { keys, values, fieldIndex } = field;\n return (\n <LogDetailsRow\n key={`${keys[0]}=${values[0]}-${i}`}\n parsedKeys={keys}\n parsedValues={values}\n onClickShowField={onClickShowField}\n onClickHideField={onClickHideField}\n onClickFilterOutLabel={onClickFilterOutLabel}\n onClickFilterLabel={onClickFilterLabel}\n getStats={() => calculateStats(row.dataFrame.fields[fieldIndex].values)}\n displayedFields={displayedFields}\n wrapLogMessage={wrapLogMessage}\n row={row}\n app={app}\n disableActions={false}\n isFilterLabelActive={this.props.isFilterLabelActive}\n />\n );\n })}\n\n {fieldsWithLinksAvailable && (\n <tr>\n <td\n colSpan={100}\n className={styles.logDetailsHeading}\n aria-label={t('logs.un-themed-log-details.aria-label-data-links', 'Data links')}\n >\n <Trans i18nKey=\"logs.log-details.links\">Links</Trans>\n </td>\n </tr>\n )}\n {displayedFieldsWithLinks.map((field, i) => {\n const { keys, values, links, fieldIndex } = field;\n return (\n <LogDetailsRow\n key={`${keys[0]}=${values[0]}-${i}`}\n parsedKeys={keys}\n parsedValues={values}\n links={links}\n onClickShowField={onClickShowField}\n onClickHideField={onClickHideField}\n onPinLine={onPinLine}\n pinLineButtonTooltipTitle={pinLineButtonTooltipTitle}\n getStats={() => calculateStats(row.dataFrame.fields[fieldIndex].values)}\n displayedFields={displayedFields}\n wrapLogMessage={wrapLogMessage}\n row={row}\n app={app}\n disableActions={false}\n />\n );\n })}\n {fieldsWithLinksFromVariableMap?.map((field, i) => {\n const { keys, values, links, fieldIndex } = field;\n return (\n <LogDetailsRow\n key={`${keys[0]}=${values[0]}-${i}`}\n parsedKeys={keys}\n parsedValues={values}\n links={links}\n onClickShowField={onClickShowField}\n onClickHideField={onClickHideField}\n onPinLine={onPinLine}\n pinLineButtonTooltipTitle={pinLineButtonTooltipTitle}\n getStats={() => calculateStats(row.dataFrame.fields[fieldIndex].values)}\n displayedFields={displayedFields}\n wrapLogMessage={wrapLogMessage}\n row={row}\n app={app}\n disableActions={true}\n />\n );\n })}\n\n {!fieldsAvailable && !labelsAvailable && !fieldsWithLinksAvailable && (\n <tr>\n <td colSpan={100} aria-label={t('logs.un-themed-log-details.aria-label-no-details', 'No details')}>\n <Trans i18nKey=\"logs.log-details.no-details\">No details available</Trans>\n </td>\n </tr>\n )}\n </tbody>\n </table>\n </div>\n </td>\n </tr>\n );\n }\n}\n\nexport const LogDetails = withTheme2(withAttributesExtensionLinks(UnThemedLogDetails));\nLogDetails.displayName = 'LogDetails';\n","import { css } from '@emotion/css';\nimport { ReactNode, MutableRefObject, useCallback, useEffect, useRef, useState } from 'react';\n\nimport { AbsoluteTimeRange, CoreApp, LogRowModel, TimeRange, rangeUtil } from '@grafana/data';\n// import { convertRawToRange, isRelativeTime, isRelativeTimeRange } from '@grafana/data/internal';\nimport { Trans } from '@grafana/i18n';\nimport { config, reportInteraction } from '@grafana/runtime';\nimport { LogsSortOrder, TimeZone } from '@grafana/schema';\nimport { Button, Icon } from '@grafana/ui';\n\nimport { LoadingIndicator } from './LoadingIndicator';\n\nexport type Props = {\n app?: CoreApp;\n children: ReactNode;\n loading: boolean;\n loadMoreLogs?: (range: AbsoluteTimeRange) => void;\n range: TimeRange;\n rows: LogRowModel[];\n scrollElement: HTMLDivElement | null;\n sortOrder: LogsSortOrder;\n timeZone: TimeZone;\n topScrollEnabled?: boolean;\n};\n\nexport const InfiniteScroll = ({\n app,\n children,\n loading,\n loadMoreLogs,\n range,\n rows,\n scrollElement,\n sortOrder,\n timeZone,\n topScrollEnabled = false,\n}: Props) => {\n const [upperOutOfRange, setUpperOutOfRange] = useState(false);\n const [lowerOutOfRange, setLowerOutOfRange] = useState(false);\n const [upperLoading, setUpperLoading] = useState(false);\n const [lowerLoading, setLowerLoading] = useState(false);\n const rowsRef = useRef<LogRowModel[]>(rows);\n const lastScroll = useRef<number>(scrollElement?.scrollTop || 0);\n const lastEvent = useRef<Event | WheelEvent | null>(null);\n const countRef = useRef(0);\n\n // Reset messages when range/order/rows change\n useEffect(() => {\n setUpperOutOfRange(false);\n setLowerOutOfRange(false);\n }, [range, rows, sortOrder]);\n\n // Reset loading messages when loading stops\n useEffect(() => {\n if (!loading) {\n setUpperLoading(false);\n setLowerLoading(false);\n }\n }, [loading]);\n\n // Ensure bottom loader visibility\n useEffect(() => {\n if (lowerLoading && scrollElement) {\n scrollElement.scrollTo(0, scrollElement.scrollHeight - scrollElement.clientHeight);\n }\n }, [lowerLoading, scrollElement]);\n\n // Request came back with no new past rows\n useEffect(() => {\n if (rows !== rowsRef.current && rows.length === rowsRef.current.length && (upperLoading || lowerLoading)) {\n if (sortOrder === LogsSortOrder.Descending && lowerLoading) {\n setLowerOutOfRange(true);\n } else if (sortOrder === LogsSortOrder.Ascending && upperLoading) {\n setUpperOutOfRange(true);\n }\n }\n rowsRef.current = rows;\n }, [lowerLoading, rows, sortOrder, upperLoading]);\n\n useEffect(() => {\n if (!scrollElement || !loadMoreLogs) {\n return;\n }\n if (scrollElement.scrollHeight <= scrollElement.clientHeight) {\n return;\n }\n\n function handleScroll(event: Event | WheelEvent) {\n if (!scrollElement || !loadMoreLogs || !rows.length || loading || !config.featureToggles.logsInfiniteScrolling) {\n return;\n }\n const scrollDirection = shouldLoadMore(event, lastEvent.current, countRef, scrollElement, lastScroll.current);\n lastEvent.current = event;\n lastScroll.current = scrollElement.scrollTop;\n if (scrollDirection === ScrollDirection.NoScroll) {\n return;\n }\n event.stopImmediatePropagation();\n if (scrollDirection === ScrollDirection.Top && topScrollEnabled) {\n scrollTop();\n } else if (scrollDirection === ScrollDirection.Bottom) {\n scrollBottom();\n }\n lastEvent.current = null;\n }\n\n function scrollTop() {\n const newRange = canScrollTop(getVisibleRange(rows), range, timeZone, sortOrder);\n if (!newRange) {\n setUpperOutOfRange(true);\n return;\n }\n setUpperOutOfRange(false);\n loadMoreLogs?.(newRange);\n setUpperLoading(true);\n reportInteraction('grafana_logs_infinite_scrolling', {\n direction: 'top',\n sort_order: sortOrder,\n });\n }\n\n function scrollBottom() {\n const newRange = canScrollBottom(getVisibleRange(rows), range, timeZone, sortOrder);\n if (!newRange) {\n setLowerOutOfRange(true);\n return;\n }\n setLowerOutOfRange(false);\n loadMoreLogs?.(newRange);\n setLowerLoading(true);\n reportInteraction('grafana_logs_infinite_scrolling', {\n direction: 'bottom',\n sort_order: sortOrder,\n });\n }\n\n scrollElement.addEventListener('scroll', handleScroll);\n scrollElement.addEventListener('wheel', handleScroll);\n\n return () => {\n scrollElement.removeEventListener('scroll', handleScroll);\n scrollElement.removeEventListener('wheel', handleScroll);\n };\n }, [loadMoreLogs, loading, range, rows, scrollElement, sortOrder, timeZone, topScrollEnabled]);\n\n // We allow \"now\" to move when using relative time, so we hide the message so it doesn't flash.\n const hideTopMessage = sortOrder === LogsSortOrder.Descending && rangeUtil.isRelativeTime(range.raw.to);\n const hideBottomMessage = sortOrder === LogsSortOrder.Ascending && rangeUtil.isRelativeTime(range.raw.to);\n\n const loadOlderLogs = useCallback(() => {\n //If we are not on the last page, use next page's range\n reportInteraction('grafana_explore_logs_infinite_pagination_clicked', {\n pageType: 'olderLogsButton',\n });\n const newRange = canScrollTop(getVisibleRange(rows), range, timeZone, sortOrder);\n if (!newRange) {\n setUpperOutOfRange(true);\n return;\n }\n setUpperOutOfRange(false);\n loadMoreLogs?.(newRange);\n setUpperLoading(true);\n scrollElement?.scroll({\n behavior: 'auto',\n top: 0,\n });\n }, [loadMoreLogs, range, rows, scrollElement, sortOrder, timeZone]);\n\n return (\n <>\n {upperLoading && <LoadingIndicator adjective={sortOrder === LogsSortOrder.Descending ? 'newer' : 'older'} />}\n {!hideTopMessage && upperOutOfRange && outOfRangeMessage}\n {sortOrder === LogsSortOrder.Ascending && app === CoreApp.Explore && loadMoreLogs && (\n <Button className={styles.navButton} variant=\"secondary\" onClick={loadOlderLogs} disabled={loading}>\n <div className={styles.navButtonContent}>\n <Icon name=\"angle-up\" size=\"lg\" />\n <Trans i18nKey=\"logs.infinite-scroll.older-logs\">Older logs</Trans>\n </div>\n </Button>\n )}\n {children}\n {!hideBottomMessage && lowerOutOfRange && outOfRangeMessage}\n {lowerLoading && <LoadingIndicator adjective={sortOrder === LogsSortOrder.Descending ? 'older' : 'newer'} />}\n </>\n );\n};\n\nconst styles = {\n messageContainer: css({\n textAlign: 'center',\n padding: 0.25,\n }),\n navButton: css({\n width: '58px',\n height: '68px',\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n lineHeight: '1',\n position: 'absolute',\n top: 0,\n right: -3,\n zIndex: 1,\n }),\n navButtonContent: css({\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'center',\n alignItems: 'center',\n whiteSpace: 'normal',\n }),\n};\n\nconst outOfRangeMessage = (\n <div className={styles.messageContainer} data-testid=\"end-of-range\">\n <Trans i18nKey=\"logs.out-of-range-message.end-of-the-selected-time-range\">End of the selected time range.</Trans>\n </div>\n);\n\nexport enum ScrollDirection {\n Top = -1,\n Bottom = 1,\n NoScroll = 0,\n}\nexport function shouldLoadMore(\n event: Event | WheelEvent,\n lastEvent: Event | WheelEvent | null,\n countRef: MutableRefObject<number>,\n element: HTMLDivElement,\n lastScroll: number\n): ScrollDirection {\n const delta = event instanceof WheelEvent ? event.deltaY : element.scrollTop - lastScroll;\n if (delta === 0) {\n return ScrollDirection.NoScroll;\n }\n\n const scrollDirection = delta < 0 ? ScrollDirection.Top : ScrollDirection.Bottom;\n const diff =\n scrollDirection === ScrollDirection.Top\n ? element.scrollTop\n : element.scrollHeight - element.scrollTop - element.clientHeight;\n\n if (diff > 1) {\n return ScrollDirection.NoScroll;\n }\n\n if (!lastEvent || shouldIgnoreChainOfEvents(event, lastEvent, countRef)) {\n return ScrollDirection.NoScroll;\n }\n\n return scrollDirection;\n}\n\nfunction shouldIgnoreChainOfEvents(\n event: Event | WheelEvent,\n lastEvent: Event | WheelEvent,\n countRef: MutableRefObject<number>\n) {\n const deltaTime = event.timeStamp - lastEvent.timeStamp;\n // Not a chain of events\n if (deltaTime > 500) {\n countRef.current = 0;\n return false;\n }\n countRef.current++;\n // Likely trackpad\n if (deltaTime < 100) {\n // User likely to want more results\n if (countRef.current >= 180) {\n countRef.current = 0;\n return false;\n }\n return true;\n }\n // Likely mouse wheel\n if (deltaTime < 400) {\n // User likely to want more results\n if (countRef.current >= 25) {\n countRef.current = 0;\n return false;\n }\n }\n return true;\n}\n\nexport function getVisibleRange(rows: LogRowModel[]) {\n const firstTimeStamp = rows[0].timeEpochMs;\n const lastTimeStamp = rows[rows.length - 1].timeEpochMs;\n\n const visibleRange =\n lastTimeStamp < firstTimeStamp\n ? { from: lastTimeStamp, to: firstTimeStamp }\n : { from: firstTimeStamp, to: lastTimeStamp };\n\n return visibleRange;\n}\n\nfunction getPrevRange(visibleRange: AbsoluteTimeRange, currentRange: TimeRange) {\n return { from: currentRange.from.valueOf(), to: visibleRange.from };\n}\n\nfunction getNextRange(visibleRange: AbsoluteTimeRange, currentRange: TimeRange, timeZone: TimeZone) {\n // When requesting new logs, update the current range if using relative time ranges.\n currentRange = updateCurrentRange(currentRange, timeZone);\n return { from: visibleRange.to, to: currentRange.to.valueOf() };\n}\n\nexport const SCROLLING_THRESHOLD = 1e3;\n\n// To get more logs, the difference between the visible range and the current range should be 1 second or more.\nexport function canScrollTop(\n visibleRange: AbsoluteTimeRange,\n currentRange: TimeRange,\n timeZone: TimeZone,\n sortOrder: LogsSortOrder\n): AbsoluteTimeRange | undefined {\n if (sortOrder === LogsSortOrder.Descending) {\n // When requesting new logs, update the current range if using relative time ranges.\n currentRange = updateCurrentRange(currentRange, timeZone);\n const canScroll = currentRange.to.valueOf() - visibleRange.to > SCROLLING_THRESHOLD;\n return canScroll ? getNextRange(visibleRange, currentRange, timeZone) : undefined;\n }\n\n const canScroll = Math.abs(currentRange.from.valueOf() - visibleRange.from) > SCROLLING_THRESHOLD;\n return canScroll ? getPrevRange(visibleRange, currentRange) : undefined;\n}\n\nexport function canScrollBottom(\n visibleRange: AbsoluteTimeRange,\n currentRange: TimeRange,\n timeZone: TimeZone,\n sortOrder: LogsSortOrder\n): AbsoluteTimeRange | undefined {\n if (sortOrder === LogsSortOrder.Descending) {\n const canScroll = Math.abs(currentRange.from.valueOf() - visibleRange.from) > SCROLLING_THRESHOLD;\n return canScroll ? getPrevRange(visibleRange, currentRange) : undefined;\n }\n // When requesting new logs, update the current range if using relative time ranges.\n currentRange = updateCurrentRange(currentRange, timeZone);\n const canScroll = currentRange.to.valueOf() - visibleRange.to > SCROLLING_THRESHOLD;\n return canScroll ? getNextRange(visibleRange, currentRange, timeZone) : undefined;\n}\n\n// Given a TimeRange, returns a new instance if using relative time, or else the same.\nfunction updateCurrentRange(timeRange: TimeRange, timeZone: TimeZone) {\n return rangeUtil.isRelativeTimeRange(timeRange.raw)\n ? rangeUtil.convertRawToRange(timeRange.raw, timeZone)\n : timeRange;\n}\n","import { css } from '@emotion/css';\nimport memoizeOne from 'memoize-one';\nimport tinycolor from 'tinycolor2';\n\nimport { colorManipulator, GrafanaTheme2, LogLevel } from '@grafana/data';\nimport { styleMixins } from '@grafana/ui';\n\nexport const getLogLevelStyles = (theme: GrafanaTheme2, logLevel?: LogLevel) => {\n let logColor = theme.isLight ? theme.v1.palette.gray5 : theme.v1.palette.gray2;\n switch (logLevel) {\n case LogLevel.crit:\n case LogLevel.critical:\n logColor = '#705da0';\n break;\n case LogLevel.error:\n case LogLevel.err:\n logColor = '#e24d42';\n break;\n case LogLevel.warning:\n case LogLevel.warn:\n logColor = theme.colors.warning.main;\n break;\n case LogLevel.info:\n logColor = '#7eb26d';\n break;\n case LogLevel.debug:\n logColor = '#1f78c1';\n break;\n case LogLevel.trace:\n logColor = '#6ed0e0';\n break;\n }\n\n return {\n logsRowLevelColor: css({\n '&::after': {\n backgroundColor: logColor,\n },\n }),\n };\n};\n\nexport const getLogRowStyles = memoizeOne((theme: GrafanaTheme2) => {\n const hoverBgColor = styleMixins.hoverColor(theme.colors.background.secondary, theme);\n const contextOutlineColor = tinycolor(theme.components.dashboard.background).setAlpha(0.7).toRgbString();\n return {\n logsRowLevel: css({\n label: 'logs-row__level',\n maxWidth: theme.spacing(1.25),\n cursor: 'default',\n '&::after': {\n content: \"''\",\n display: 'block',\n position: 'absolute',\n top: '1px',\n bottom: '1px',\n width: '3px',\n left: theme.spacing(0.5),\n },\n }),\n // Compared to logsRowLevel we need to make error logs wider to accommodate the icon\n logsRowWithError: css({\n maxWidth: `${theme.spacing(1.5)}`,\n }),\n logsRowMatchHighLight: css({\n label: 'logs-row__match-highlight',\n background: 'inherit',\n padding: 'inherit',\n color: theme.components.textHighlight.text,\n backgroundColor: theme.components.textHighlight.background,\n }),\n logRows: css({\n position: 'relative',\n }),\n shortcut: css({\n display: 'inline-flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n color: theme.colors.text.secondary,\n opacity: 0.7,\n fontSize: theme.typography.bodySmall.fontSize,\n marginTop: theme.spacing(1),\n }),\n logsRowsTable: css({\n label: 'logs-rows',\n fontFamily: theme.typography.fontFamilyMonospace,\n fontSize: theme.typography.bodySmall.fontSize,\n width: '100%',\n position: 'relative',\n }),\n logsRowsTableContain: css({\n contain: 'strict',\n }),\n highlightBackground: css({\n backgroundColor: tinycolor(theme.colors.info.transparent).setAlpha(0.25).toString(),\n }),\n logsRow: css({\n label: 'logs-row',\n width: '100%',\n cursor: 'pointer',\n verticalAlign: 'top',\n\n '&:focus-within': {\n outline: `2px solid ${theme.colors.primary.border}`,\n outlineOffset: '-2px',\n },\n\n '&:hover': {\n '.log-row-menu': {\n zIndex: 1,\n },\n\n background: hoverBgColor,\n },\n\n 'td:not(.log-row-menu-cell):last-child': {\n width: '100%',\n },\n\n '> td:not(.log-row-menu-cell)': {\n position: 'relative',\n paddingRight: theme.spacing(1),\n borderTop: '1px solid transparent',\n borderBottom: '1px solid transparent',\n height: '100%',\n },\n }),\n logsRowDuplicates: css({\n label: 'logs-row__duplicates',\n textAlign: 'right',\n width: '4em',\n cursor: 'default',\n }),\n logIconError: css({\n color: theme.colors.warning.main,\n position: 'relative',\n top: '-2px',\n }),\n logIconInfo: css({\n color: theme.colors.info.main,\n position: 'relative',\n top: '-2px',\n }),\n logsRowToggleDetails: css({\n label: 'logs-row-toggle-details__level',\n fontSize: '9px',\n maxWidth: '15px',\n }),\n logsRowLocalTime: css({\n label: 'logs-row__localtime',\n whiteSpace: 'nowrap',\n }),\n logsRowLabels: css({\n label: 'logs-row__labels',\n whiteSpace: 'nowrap',\n maxWidth: '22em',\n\n /* This is to make the labels vertical align */\n '> span': {\n marginTop: '0.75px',\n },\n }),\n logsRowMessage: css({\n label: 'logs-row__message',\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-all',\n overflowWrap: 'anywhere',\n width: '100%',\n textAlign: 'left',\n }),\n copyLogButton: css({\n padding: theme.spacing(0, 0, 0, 0.5),\n height: theme.spacing(3),\n width: theme.spacing(3.25),\n lineHeight: theme.spacing(2.5),\n overflow: 'hidden',\n '&:hover': {\n backgroundColor: colorManipulator.alpha(theme.colors.text.primary, 0.12),\n },\n }),\n //Log details specific CSS\n logDetailsContainer: css({\n label: 'logs-row-details-table',\n border: `1px solid ${theme.colors.border.medium}`,\n padding: theme.spacing(0, 1, 1),\n borderRadius: theme.shape.radius.default,\n margin: theme.spacing(2.5, 1, 2.5, 2),\n cursor: 'default',\n }),\n logDetailsTable: css({\n label: 'logs-row-details-table',\n lineHeight: '18px',\n width: '100%',\n 'td:last-child': {\n width: '100%',\n },\n }),\n logsDetailsIcon: css({\n label: 'logs-row-details__icon',\n position: 'relative',\n color: theme.v1.palette.gray3,\n paddingTop: '1px',\n paddingBottom: '1px',\n paddingRight: theme.spacing(0.75),\n }),\n logDetailsLabel: css({\n label: 'logs-row-details__label',\n maxWidth: '30em',\n padding: theme.spacing(0, 1),\n overflowWrap: 'break-word',\n }),\n logDetailsHeading: css({\n label: 'logs-row-details__heading',\n fontWeight: theme.typography.fontWeightBold,\n padding: theme.spacing(1, 0, 0.5),\n }),\n logDetailsValue: css({\n label: 'logs-row-details__row',\n position: 'relative',\n verticalAlign: 'middle',\n cursor: 'default',\n\n '&:hover': {\n backgroundColor: hoverBgColor,\n },\n }),\n detailsToggle: css({\n appearance: 'none',\n background: 'none',\n border: 'none',\n padding: 0,\n // Don't increase the height of the row\n maxHeight: '19px',\n\n // Don't show default button box-shadow on focus, we apply outline to the entire row instead\n '&:focus-visible': {\n boxShadow: 'none',\n },\n\n '&:focus': {\n outline: 0,\n },\n '&:after': {\n content: '\"\"',\n inset: 0,\n position: 'absolute',\n },\n }),\n\n // Log row\n topVerticalAlign: css({\n label: 'topVerticalAlign',\n marginTop: theme.spacing(-0.9),\n marginLeft: theme.spacing(-0.25),\n }),\n detailsOpen: css({\n '&:hover': {\n backgroundColor: styleMixins.hoverColor(theme.colors.background.primary, theme),\n },\n }),\n errorLogRow: css({\n label: 'erroredLogRow',\n color: theme.colors.text.secondary,\n }),\n // Log Row Message\n positionRelative: css({\n label: 'positionRelative',\n position: 'relative',\n }),\n rowWithContext: css({\n label: 'rowWithContext',\n zIndex: 1,\n outline: `9999px solid ${contextOutlineColor}`,\n display: 'inherit',\n }),\n horizontalScroll: css({\n label: 'horizontalScroll',\n whiteSpace: 'pre',\n }),\n contextNewline: css({\n display: 'block',\n marginLeft: '0px',\n }),\n rowMenu: css({\n label: 'rowMenu',\n display: 'flex',\n flexWrap: 'nowrap',\n flexDirection: 'row',\n alignContent: 'flex-end',\n justifyContent: 'space-evenly',\n alignItems: 'center',\n position: 'absolute',\n top: 0,\n bottom: 'auto',\n background: theme.colors.background.primary,\n boxShadow: theme.shadows.z3,\n padding: theme.spacing(0.5, 1, 0.5, 1),\n zIndex: 100,\n gap: theme.spacing(0.5),\n\n '& > button': {\n margin: 0,\n },\n }),\n logRowMenuCell: css({\n position: 'sticky',\n zIndex: theme.zIndex.dropdown,\n marginTop: theme.spacing(-0.125),\n right: 0,\n\n '& > span': {\n transform: 'translateX(-100%)',\n },\n }),\n logLine: css({\n fontFamily: theme.typography.fontFamilyMonospace,\n fontSize: theme.typography.bodySmall.fontSize,\n letterSpacing: theme.typography.bodySmall.letterSpacing,\n textAlign: 'left',\n padding: 0,\n userSelect: 'text',\n }),\n // Log details\n logsRowLevelDetails: css({\n label: 'logs-row__level_details',\n '&::after': {\n top: '-3px',\n },\n }),\n logDetails: css({\n label: 'logDetailsDefaultCursor',\n cursor: 'default',\n\n '&:hover': {\n backgroundColor: theme.colors.background.primary,\n },\n }),\n visibleRowMenu: css({\n label: 'visibleRowMenu',\n aspectRatio: '1/1',\n zIndex: 90,\n }),\n linkButton: css({\n label: 'linkButton',\n '> button': {\n paddingTop: theme.spacing(0.5),\n },\n }),\n hidden: css({\n label: 'hidden',\n visibility: 'hidden',\n }),\n unPinButton: css({\n height: theme.spacing(3),\n lineHeight: theme.spacing(2.5),\n }),\n };\n});\n\nexport type LogRowStyles = ReturnType<typeof getLogRowStyles>;\n","import { invert } from 'lodash';\n\nimport { AbstractLabelMatcher, AbstractLabelOperator, AbstractQuery, DataFrame, TimeRange } from '@grafana/data';\n\nimport { LabelType } from './types';\n\nfunction roundMsToMin(milliseconds: number): number {\n return roundSecToMin(milliseconds / 1000);\n}\n\nfunction roundSecToMin(seconds: number): number {\n return Math.floor(seconds / 60);\n}\n\nexport function shouldRefreshLabels(range?: TimeRange, prevRange?: TimeRange): boolean {\n if (range && prevRange) {\n const sameMinuteFrom = roundMsToMin(range.from.valueOf()) === roundMsToMin(prevRange.from.valueOf());\n const sameMinuteTo = roundMsToMin(range.to.valueOf()) === roundMsToMin(prevRange.to.valueOf());\n // If both are same, don't need to refresh\n return !(sameMinuteFrom && sameMinuteTo);\n }\n return false;\n}\n\n// Loki regular-expressions use the RE2 syntax (https://github.com/google/re2/wiki/Syntax),\n// so every character that matches something in that list has to be escaped.\n// the list of meta characters is: *+?()|\\.[]{}^$\n// we make a javascript regular expression that matches those characters:\nconst RE2_METACHARACTERS = /[*+?()|\\\\.\\[\\]{}^$]/g;\nfunction escapeLokiRegexp(value: string): string {\n return value.replace(RE2_METACHARACTERS, '\\\\$&');\n}\n\n// based on the openmetrics-documentation, the 3 symbols we have to handle are:\n// - \\n ... the newline character\n// - \\ ... the backslash character\n// - \" ... the double-quote character\nexport function escapeLabelValueInExactSelector(labelValue: string): string {\n return labelValue.replace(/\\\\/g, '\\\\\\\\').replace(/\\n/g, '\\\\n').replace(/\"/g, '\\\\\"');\n}\n\nexport function unescapeLabelValue(labelValue: string): string {\n return labelValue.replace(/\\\\n/g, '\\n').replace(/\\\\\"/g, '\"').replace(/\\\\\\\\/g, '\\\\');\n}\n\nexport function escapeLabelValueInRegexSelector(labelValue: string): string {\n return escapeLabelValueInExactSelector(escapeLokiRegexp(labelValue));\n}\n\nexport function escapeLabelValueInSelector(labelValue: string, selector?: string): string {\n return isRegexSelector(selector)\n ? escapeLabelValueInRegexSelector(labelValue)\n : escapeLabelValueInExactSelector(labelValue);\n}\n\nexport function isRegexSelector(selector?: string) {\n if (selector && (selector.includes('=~') || selector.includes('!~'))) {\n return true;\n }\n return false;\n}\n\nexport function isBytesString(string: string) {\n const BYTES_KEYWORDS = [\n 'b',\n 'kib',\n 'Kib',\n 'kb',\n 'KB',\n 'mib',\n 'Mib',\n 'mb',\n 'MB',\n 'gib',\n 'Gib',\n 'gb',\n 'GB',\n 'tib',\n 'Tib',\n 'tb',\n 'TB',\n 'pib',\n 'Pib',\n 'pb',\n 'PB',\n 'eib',\n 'Eib',\n 'eb',\n 'EB',\n ];\n const regex = new RegExp(`^(?:-?\\\\d+(?:\\\\.\\\\d+)?)(?:${BYTES_KEYWORDS.join('|')})$`);\n const match = string.match(regex);\n return !!match;\n}\n\nexport function getLabelTypeFromFrame(labelKey: string, frame?: DataFrame, index?: number): null | LabelType {\n if (!frame || index === undefined) {\n return null;\n }\n\n const typeField = frame.fields.find((field) => field.name === 'labelTypes')?.values[index];\n if (!typeField) {\n return null;\n }\n switch (typeField[labelKey]) {\n case 'I':\n return LabelType.Indexed;\n case 'S':\n return LabelType.StructuredMetadata;\n case 'P':\n return LabelType.Parsed;\n default:\n return null;\n }\n}\n\nexport const mapOpToAbstractOp: Record<AbstractLabelOperator, string> = {\n [AbstractLabelOperator.Equal]: '=',\n [AbstractLabelOperator.NotEqual]: '!=',\n [AbstractLabelOperator.EqualRegEx]: '=~',\n [AbstractLabelOperator.NotEqualRegEx]: '!~',\n};\n\n// eslint-disable-next-line @typescript-eslint/consistent-type-assertions\nexport const mapAbstractOperatorsToOp = invert(mapOpToAbstractOp) as Record<string, AbstractLabelOperator>;\n\nexport function abstractQueryToExpr(labelBasedQuery: AbstractQuery): string {\n const expr = labelBasedQuery.labelMatchers\n .map((selector: AbstractLabelMatcher) => {\n const operator = mapOpToAbstractOp[selector.operator];\n if (operator) {\n return `${selector.name}${operator}\"${selector.value}\"`;\n } else {\n return '';\n }\n })\n .filter((e: string) => e !== '')\n .join(', ');\n\n return expr ? `{${expr}}` : '';\n}\n\nexport function processLabels(labels: Array<{ [key: string]: string }>) {\n const valueSet: { [key: string]: Set<string> } = {};\n labels.forEach((label) => {\n Object.keys(label).forEach((key) => {\n if (!valueSet[key]) {\n valueSet[key] = new Set();\n }\n if (!valueSet[key].has(label[key])) {\n valueSet[key].add(label[key]);\n }\n });\n });\n\n const valueArray: { [key: string]: string[] } = {};\n limitSuggestions(Object.keys(valueSet)).forEach((key) => {\n valueArray[key] = limitSuggestions(Array.from(valueSet[key]));\n });\n\n return { values: valueArray, keys: Object.keys(valueArray) };\n}\n\n// Max number of items (metrics, labels, values) that we display as suggestions. Prevents from running out of memory.\nexport const SUGGESTIONS_LIMIT = 10000;\nexport function limitSuggestions(items: string[]) {\n return items.slice(0, SUGGESTIONS_LIMIT);\n}\n","import { SyntaxNode } from '@lezer/common';\nimport { escapeRegExp } from 'lodash';\n\nimport {\n parser,\n LineFilter,\n PipeExact,\n PipeMatch,\n Filter,\n String,\n LabelFormatExpr,\n Selector,\n PipelineExpr,\n LabelParser,\n JsonExpressionParser,\n LabelFilter,\n MetricExpr,\n Matcher,\n Identifier,\n Range,\n Logfmt,\n Json,\n OrFilter,\n FilterOp,\n RangeOp,\n VectorOp,\n BinOpExpr,\n} from '@grafana/lezer-logql';\nimport { DataQuery } from '@grafana/schema';\n\nimport { addDropToQuery, addLabelToQuery, getStreamSelectorPositions, NodePosition } from './modifyQuery';\nimport { ErrorId } from './querybuilder/parsingUtils';\nimport { LabelType, LokiQuery, LokiQueryDirection, LokiQueryType } from './types';\n\n/**\n * Returns search terms from a LogQL query.\n * E.g., `{} |= \"foo\" |= \"bar\" != \"baz\"` returns `['foo', 'bar']`.\n */\nexport function getHighlighterExpressionsFromQuery(input = ''): string[] {\n const results: string[] = [];\n\n const filters = getNodesFromQuery(input, [LineFilter]);\n\n for (const filter of filters) {\n const pipeExact = filter.getChild(Filter)?.getChild(PipeExact);\n const pipeMatch = filter.getChild(Filter)?.getChild(PipeMatch);\n const strings = getStringsFromLineFilter(filter);\n\n if ((!pipeExact && !pipeMatch) || !strings.length) {\n continue;\n }\n\n for (const string of strings) {\n const filterTerm = input.substring(string.from, string.to).trim();\n const backtickedTerm = filterTerm[0] === '`';\n const unwrappedFilterTerm = filterTerm.substring(1, filterTerm.length - 1);\n\n if (!unwrappedFilterTerm) {\n continue;\n }\n\n let resultTerm = '';\n\n // Only filter expressions with |~ operator are treated as regular expressions\n if (pipeMatch) {\n // When using backticks, Loki doesn't require to escape special characters and we can just push regular expression to highlights array\n // When using quotes, we have extra backslash escaping and we need to replace \\\\ with \\\n resultTerm = backtickedTerm ? unwrappedFilterTerm : unwrappedFilterTerm.replace(/\\\\\\\\/g, '\\\\');\n } else {\n // We need to escape this string so it is not matched as regular expression\n resultTerm = escapeRegExp(unwrappedFilterTerm);\n }\n\n if (resultTerm) {\n results.push(resultTerm);\n }\n }\n }\n return results;\n}\n\nexport function getExpressionFromExecutedQuery(executedQueryString: string) {\n return executedQueryString.replace('Expr: ', '');\n}\n\nexport function getStringsFromLineFilter(filter: SyntaxNode): SyntaxNode[] {\n const nodes: SyntaxNode[] = [];\n let node: SyntaxNode | null = filter;\n do {\n const string = node.getChild(String);\n if (string && !node.getChild(FilterOp)) {\n nodes.push(string);\n }\n node = node.getChild(OrFilter);\n } while (node != null);\n\n return nodes;\n}\n\nexport function getNormalizedLokiQuery(query: LokiQuery): LokiQuery {\n let queryType = getLokiQueryType(query);\n // instant and range are deprecated, we want to remove them\n const { instant, range, ...rest } = query;\n\n // if `query.expr` is not parsable this might throw an error\n try {\n if (isLogsQuery(query.expr) && queryType === LokiQueryType.Instant) {\n queryType = LokiQueryType.Range;\n }\n } catch (e) {}\n return { ...rest, queryType };\n}\n\nexport function getLokiQueryType(query: LokiQuery): LokiQueryType {\n // we are migrating from `.instant` and `.range` to `.queryType`\n // this function returns the correct query type\n const { queryType } = query;\n const hasValidQueryType =\n queryType === LokiQueryType.Range || queryType === LokiQueryType.Instant || queryType === LokiQueryType.Stream;\n\n // if queryType exists, it is respected\n if (hasValidQueryType) {\n return queryType;\n }\n\n // if no queryType, and instant===true, it's instant\n if (query.instant === true) {\n return LokiQueryType.Instant;\n }\n\n // otherwise it is range\n return LokiQueryType.Range;\n}\n\nconst tagsToObscure = ['String', 'Identifier', 'LineComment', 'Number'];\nconst partsToKeep = ['__error__', '__interval', '__interval_ms', '__auto'];\nexport function obfuscate(query: string): string {\n let obfuscatedQuery: string = query;\n const tree = parser.parse(query);\n tree.iterate({\n enter: ({ name, from, to }): false | void => {\n const queryPart = query.substring(from, to);\n if (tagsToObscure.includes(name) && !partsToKeep.includes(queryPart)) {\n obfuscatedQuery = obfuscatedQuery.replace(queryPart, name);\n }\n },\n });\n return obfuscatedQuery;\n}\n\nexport function parseToNodeNamesArray(query: string): string[] {\n const queryParts: string[] = [];\n const tree = parser.parse(query);\n tree.iterate({\n enter: ({ name }): false | void => {\n queryParts.push(name);\n },\n });\n return queryParts;\n}\n\nexport function isQueryWithNode(query: string, nodeType: number): boolean {\n let isQueryWithNode = false;\n const tree = parser.parse(query);\n tree.iterate({\n enter: ({ type }): false | void => {\n if (type.id === nodeType) {\n isQueryWithNode = true;\n return false;\n }\n },\n });\n return isQueryWithNode;\n}\n\nexport function getNodesFromQuery(query: string, nodeTypes?: number[]): SyntaxNode[] {\n const nodes: SyntaxNode[] = [];\n const tree = parser.parse(query);\n tree.iterate({\n enter: (node): false | void => {\n if (nodeTypes === undefined || nodeTypes.includes(node.type.id)) {\n nodes.push(node.node);\n }\n },\n });\n return nodes;\n}\n\nexport function getNodePositionsFromQuery(query: string, nodeTypes?: number[]): NodePosition[] {\n const positions: NodePosition[] = [];\n const tree = parser.parse(query);\n tree.iterate({\n enter: (node): false | void => {\n if (nodeTypes === undefined || nodeTypes.includes(node.type.id)) {\n positions.push(NodePosition.fromNode(node.node));\n }\n },\n });\n return positions;\n}\n\nexport function getNodeFromQuery(query: string, nodeType: number): SyntaxNode | undefined {\n const nodes = getNodesFromQuery(query, [nodeType]);\n return nodes.length > 0 ? nodes[0] : undefined;\n}\n\n/**\n * Parses the query and looks for error nodes. If there is at least one, it returns true.\n * Grafana variables are considered errors, so if you need to validate a query\n * with variables you should interpolate it first.\n */\nexport function isQueryWithError(query: string): boolean {\n return isQueryWithNode(query, ErrorId);\n}\n\nexport function isLogsQuery(query: string): boolean {\n // As a safeguard we are checking for a length of 2, because at least the query should be `{}`\n return query.trim().length > 2 && !isQueryWithNode(query, MetricExpr);\n}\n\nexport function isQueryWithParser(query: string): { queryWithParser: boolean; parserCount: number } {\n const nodes = getNodesFromQuery(query, [LabelParser, JsonExpressionParser, Logfmt]);\n const parserCount = nodes.length;\n return { queryWithParser: parserCount > 0, parserCount };\n}\n\nexport function getParserFromQuery(query: string): string | undefined {\n const parsers = getNodesFromQuery(query, [LabelParser, Json, Logfmt]);\n return parsers.length > 0 ? query.substring(parsers[0].from, parsers[0].to).trim() : undefined;\n}\n\nexport function isQueryPipelineErrorFiltering(query: string): boolean {\n const labels = getNodesFromQuery(query, [LabelFilter]);\n for (const node of labels) {\n const label = node.getChild(Matcher)?.getChild(Identifier);\n if (label) {\n const labelName = query.substring(label.from, label.to);\n if (labelName === '__error__') {\n return true;\n }\n }\n }\n return false;\n}\n\nexport function isQueryWithLabelFormat(query: string): boolean {\n return isQueryWithNode(query, LabelFormatExpr);\n}\n\nexport function getLogQueryFromMetricsQuery(query: string): string {\n if (isLogsQuery(query)) {\n return query;\n }\n\n // Log query in metrics query composes of Selector & PipelineExpr\n const selectorNode = getNodeFromQuery(query, Selector);\n if (!selectorNode) {\n return '';\n }\n const selector = query.substring(selectorNode.from, selectorNode.to);\n\n const pipelineExprNode = getNodeFromQuery(query, PipelineExpr);\n const pipelineExpr = pipelineExprNode ? query.substring(pipelineExprNode.from, pipelineExprNode.to) : '';\n\n return `${selector} ${pipelineExpr}`.trim();\n}\n\nexport function getLogQueryFromMetricsQueryAtPosition(query: string, position: number): string {\n if (isLogsQuery(query)) {\n return query;\n }\n\n const metricQuery = getNodesFromQuery(query, [MetricExpr])\n .reverse() // So we don't get the root metric node\n .find((node) => node.from <= position && node.to >= position);\n if (!metricQuery) {\n return '';\n }\n return getLogQueryFromMetricsQuery(query.substring(metricQuery.from, metricQuery.to));\n}\n\nexport function isQueryWithLabelFilter(query: string): boolean {\n return isQueryWithNode(query, LabelFilter);\n}\n\nexport function isQueryWithLineFilter(query: string): boolean {\n return isQueryWithNode(query, LineFilter);\n}\n\nexport function isQueryWithRangeVariable(query: string): boolean {\n const rangeNodes = getNodesFromQuery(query, [Range]);\n for (const node of rangeNodes) {\n if (query.substring(node.from, node.to).match(/\\[\\$__range(_s|_ms)?/)) {\n return true;\n }\n }\n return false;\n}\n\nexport function getStreamSelectorsFromQuery(query: string): string[] {\n const labelMatcherPositions = getStreamSelectorPositions(query);\n\n const labelMatchers = labelMatcherPositions.map((labelMatcher) => {\n return query.slice(labelMatcher.from, labelMatcher.to);\n });\n\n return labelMatchers;\n}\n\nexport function requestSupportsSplitting(allQueries: LokiQuery[]) {\n const queries = allQueries\n .filter((query) => !query.hide)\n .filter((query) => !query.refId.includes('do-not-chunk'))\n .filter((query) => query.expr);\n\n return queries.length > 0;\n}\n\nexport function requestSupportsSharding(allQueries: LokiQuery[]) {\n const queries = allQueries\n .filter((query) => !query.hide)\n .filter((query) => query.queryType !== LokiQueryType.Instant)\n .filter((query) => !query.refId.includes('do-not-shard'))\n .filter((query) => query.expr)\n .filter(\n (query) =>\n (query.direction === LokiQueryDirection.Scan && isLogsQuery(query.expr)) || metricSupportsSharding(query.expr)\n );\n\n return queries.length > 0;\n}\n\nfunction metricSupportsSharding(query: string) {\n if (isLogsQuery(query)) {\n return false;\n }\n query = query.trim().toLowerCase();\n\n const disallowed = getNodesFromQuery(query, [BinOpExpr]);\n if (disallowed.length > 0) {\n return false;\n }\n\n /**\n * If there are VectorAggregationExpr, we want to make sure that the leftmost VectorOp is sum, meaning that\n * it's wrapped in a sum. E.g.\n * Disallowed: avg(sum by (level) (avg_over_time({place=\"luna\"}[1m])))\n * Allowed: sum(sum by (level) (avg_over_time({place=\"luna\"}[1m])))\n */\n const vectorOps = getNodesFromQuery(query, [VectorOp]);\n const supportedVectorOps = vectorOps.filter((node) => getNodeString(query, node) === 'sum');\n const unsupportedVectorOps = vectorOps.filter((node) => getNodeString(query, node) !== 'sum');\n const supportedWrappingVectorOpps = supportedVectorOps.filter((supportedOp) =>\n unsupportedVectorOps.every((unsupportedOp) => supportedOp.from < unsupportedOp.from)\n );\n if (unsupportedVectorOps.length > 0) {\n return supportedWrappingVectorOpps.length > 0;\n }\n\n const rangeOps = getNodesFromQuery(query, [RangeOp]);\n const supportedRangeOps = ['count_over_time', 'sum_over_time', 'bytes_over_time'];\n for (const node of rangeOps) {\n if (!supportedRangeOps.includes(getNodeString(query, node))) {\n return supportedWrappingVectorOpps.length > 0;\n }\n }\n\n return true;\n}\n\nfunction getNodeString(query: string, node: SyntaxNode) {\n return query.substring(node.from, node.to);\n}\n\nexport const isLokiQuery = (query: DataQuery): query is LokiQuery => {\n if (!query) {\n return false;\n }\n\n return 'expr' in query && query.expr !== undefined;\n};\n\nexport const getLokiQueryFromDataQuery = (query?: DataQuery): LokiQuery | undefined => {\n if (!query || !isLokiQuery(query)) {\n return undefined;\n }\n\n return query;\n};\n\nexport const interpolateShardingSelector = (queries: LokiQuery[], shards: number[]) => {\n if (shards.length === 0) {\n return queries;\n }\n\n let shardValue = shards.join('|');\n\n // -1 means empty shard value\n if (shardValue === '-1' || shards.length === 1) {\n shardValue = shardValue === '-1' ? '' : shardValue;\n return queries.map((query) => ({\n ...query,\n expr: addStreamShardLabelsToQuery(query.expr, '=', shardValue),\n }));\n }\n\n return queries.map((query) => ({\n ...query,\n expr: addStreamShardLabelsToQuery(query.expr, '=~', shardValue),\n }));\n};\n\nfunction addStreamShardLabelsToQuery(query: string, operator: string, shardValue: string) {\n const shardedQuery = addLabelToQuery(query, '__stream_shard__', operator, shardValue, LabelType.Indexed);\n if (!isLogsQuery(query)) {\n return addDropToQuery(shardedQuery, ['__stream_shard__']);\n }\n return shardedQuery;\n}\n\nexport const getSelectorForShardValues = (query: string) => {\n const selector = getNodesFromQuery(query, [Selector]);\n if (selector.length > 0) {\n return query.substring(selector[0].from, selector[0].to);\n }\n return '';\n};\n","import { Token } from 'prismjs';\nimport { memo } from 'react';\n\nexport const HighlightedLogRenderer = memo(({ tokens }: { tokens: Array<string | Token> }) => {\n return (\n <>\n {tokens.map((token, i) => (\n <LogToken token={token} key={i} />\n ))}\n </>\n );\n});\nHighlightedLogRenderer.displayName = 'HighlightedLogRenderer';\n\nconst LogToken = memo(({ token }: { token: Token | string }) => {\n if (typeof token === 'string') {\n return token;\n }\n if (Array.isArray(token.content)) {\n return (\n <span className={`token ${token.type}`}>\n {token.content.map((subToken, i) => (\n <LogToken key={i} token={subToken} />\n ))}\n </span>\n );\n }\n return (\n <span className={`token ${token.type}`}>\n {typeof token.content === 'string' ? token.content : <LogToken token={token.content} />}\n </span>\n );\n});\nLogToken.displayName = 'LogToken';\n","import ansicolor from 'ansicolor';\nimport { PureComponent } from 'react';\nimport Highlighter from 'react-highlight-words';\n\nimport { findHighlightChunksInText, GrafanaTheme2 } from '@grafana/data';\nimport { withTheme2, Themeable2 } from '@grafana/ui';\n\ninterface Style {\n [key: string]: string;\n}\n\ninterface ParsedChunk {\n style: Style;\n text: string;\n}\n\nfunction convertCSSToStyle(theme: GrafanaTheme2, css: string): Style {\n return css.split(/;\\s*/).reduce<Style>((accumulated, line) => {\n // The ansicolor package returns this color if the chunk has the ANSI dim\n // style (`\\e[2m`), but it is nearly unreadable in the dark theme, so we use\n // GrafanaTheme2 instead to style it in a way that works across all themes.\n if (line === 'color:rgba(0,0,0,0.5)') {\n return { color: theme.colors.text.secondary };\n }\n\n const match = line.match(/([^:\\s]+)\\s*:\\s*(.+)/);\n\n if (match && match[1] && match[2]) {\n const key = match[1].replace(/-([a-z])/g, (_, character) => character.toUpperCase());\n accumulated[key] = match[2];\n }\n\n return accumulated;\n }, {});\n}\n\ninterface Props extends Themeable2 {\n value: string;\n highlight?: {\n searchWords: string[];\n highlightClassName: string;\n };\n}\n\ninterface State {\n chunks: ParsedChunk[];\n prevValue: string;\n}\n\nexport class UnThemedLogMessageAnsi extends PureComponent<Props, State> {\n state: State = {\n chunks: [],\n prevValue: '',\n };\n\n static getDerivedStateFromProps(props: Props, state: State) {\n if (props.value === state.prevValue) {\n return null;\n }\n\n const parsed = ansicolor.parse(props.value);\n\n return {\n chunks: parsed.spans.map((span) => {\n return span.css\n ? {\n style: convertCSSToStyle(props.theme, span.css),\n text: span.text,\n }\n : { text: span.text };\n }),\n prevValue: props.value,\n };\n }\n\n render() {\n const { chunks } = this.state;\n\n return chunks.map((chunk, index) => {\n const chunkText = this.props.highlight?.searchWords ? (\n <Highlighter\n key={index}\n textToHighlight={chunk.text}\n searchWords={this.props.highlight.searchWords}\n findChunks={findHighlightChunksInText}\n highlightClassName={this.props.highlight.highlightClassName}\n />\n ) : (\n chunk.text\n );\n return chunk.style ? (\n <span key={index} style={chunk.style} data-testid=\"ansiLogLine\">\n {chunkText}\n </span>\n ) : (\n chunkText\n );\n });\n }\n}\n\nexport const LogMessageAnsi = withTheme2(UnThemedLogMessageAnsi);\nLogMessageAnsi.displayName = 'LogMessageAnsi';\n","import { css } from '@emotion/css';\nimport { useCallback } from 'react';\nimport * as React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Trans, t } from '@grafana/i18n';\nimport { reportInteraction } from '@grafana/runtime';\nimport { Button, InlineSwitch, useStyles2 } from '@grafana/ui';\n\nexport type Props = {\n wrapLines?: boolean;\n onChangeWrapLines: (wrapLines: boolean) => void;\n onScrollCenterClick: () => void;\n};\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n buttons: css({\n display: 'flex',\n gap: theme.spacing(1),\n }),\n };\n}\n\nexport const LogContextButtons = (props: Props) => {\n const styles = useStyles2(getStyles);\n const { wrapLines, onChangeWrapLines, onScrollCenterClick } = props;\n const internalOnChangeWrapLines = useCallback(\n (event: React.FormEvent<HTMLInputElement>) => {\n const state = event.currentTarget.checked;\n reportInteraction('grafana_explore_logs_log_context_toggle_lines_clicked', {\n state,\n });\n onChangeWrapLines(state);\n },\n [onChangeWrapLines]\n );\n\n return (\n <div className={styles.buttons}>\n <InlineSwitch\n showLabel\n value={wrapLines}\n onChange={internalOnChangeWrapLines}\n label={t('logs.log-context-buttons.label-wrap-lines', 'Wrap lines')}\n />\n <Button variant=\"secondary\" onClick={onScrollCenterClick}>\n <Trans i18nKey=\"logs.log-context-buttons.center-matched-line\">Center matched line</Trans>\n </Button>\n </div>\n );\n};\n","import { css, cx } from '@emotion/css';\nimport { partition } from 'lodash';\nimport { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport * as React from 'react';\nimport { useAsync } from 'react-use';\n\nimport {\n DataQueryResponse,\n DataSourceWithLogsContextSupport,\n GrafanaTheme2,\n LogRowContextOptions,\n LogRowContextQueryDirection,\n LogRowModel,\n LogsDedupStrategy,\n LogsSortOrder,\n dateTime,\n TimeRange,\n LoadingState,\n} from '@grafana/data';\nimport { Trans, t } from '@grafana/i18n';\nimport { config, reportInteraction } from '@grafana/runtime';\nimport { DataQuery, TimeZone } from '@grafana/schema';\nimport { Button, Modal, useTheme2 } from '@grafana/ui';\nimport store from 'app/core/store';\nimport { SETTINGS_KEYS } from 'app/features/explore/Logs/utils/logs';\nimport { splitOpen } from 'app/features/explore/state/main';\nimport { useDispatch } from 'app/types/store';\n\nimport { dataFrameToLogsModel } from '../../logsModel';\nimport { sortLogRows } from '../../utils';\nimport { LoadingIndicator } from '../LoadingIndicator';\nimport { LogRows } from '../LogRows';\n\nimport { LogContextButtons } from './LogContextButtons';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n modal: css({\n width: '85vw',\n [theme.breakpoints.down('md')]: {\n width: '100%',\n },\n }),\n sticky: css({\n position: 'sticky',\n zIndex: 1,\n top: '-1px',\n bottom: '-1px',\n }),\n entry: css({\n '& > td': {\n padding: theme.spacing(1, 0, 1, 0),\n },\n background: theme.colors.emphasize(theme.colors.background.secondary),\n\n '& > table': {\n marginBottom: 0,\n },\n\n '& .log-row-menu': {\n marginTop: '-6px',\n },\n }),\n datasourceUi: css({\n paddingBottom: theme.spacing(1.25),\n display: 'flex',\n alignItems: 'center',\n }),\n logRowGroups: css({\n overflow: 'auto',\n maxHeight: '75%',\n alignSelf: 'stretch',\n display: 'inline-block',\n border: `1px solid ${theme.colors.border.weak}`,\n borderRadius: theme.shape.radius.default,\n '& > table': {\n minWidth: '100%',\n },\n }),\n flexColumn: css({\n display: 'flex',\n flexDirection: 'column',\n padding: theme.spacing(0, 3, 3, 3),\n }),\n flexRow: css({\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n '& > div:last-child': {\n marginLeft: 'auto',\n },\n }),\n noMarginBottom: css({\n '& > table': {\n marginBottom: 0,\n },\n }),\n hidden: css({\n display: 'none',\n }),\n paddingTop: css({\n paddingTop: theme.spacing(1),\n }),\n paddingBottom: css({\n paddingBottom: theme.spacing(1),\n }),\n link: css({\n color: theme.colors.text.secondary,\n fontSize: theme.typography.bodySmall.fontSize,\n ':hover': {\n color: theme.colors.text.link,\n },\n }),\n loadingCell: css({\n position: 'sticky',\n left: '50%',\n display: 'inline-block',\n transform: 'translateX(-50%)',\n }),\n };\n};\n\ninterface LogRowContextModalProps {\n row: LogRowModel;\n open: boolean;\n timeZone: TimeZone;\n onClose: () => void;\n getRowContext: (row: LogRowModel, options: LogRowContextOptions) => Promise<DataQueryResponse>;\n\n getRowContextQuery?: (\n row: LogRowModel,\n options?: LogRowContextOptions,\n cacheFilters?: boolean\n ) => Promise<DataQuery | null>;\n logsSortOrder: LogsSortOrder;\n runContextQuery?: () => void;\n getLogRowContextUi?: DataSourceWithLogsContextSupport['getLogRowContextUi'];\n}\n\ntype Section = {\n loadingState: LoadingState;\n rows: LogRowModel[];\n};\ntype Place = 'above' | 'below';\ntype Context = Record<Place, Section>;\n\nconst makeEmptyContext = (): Context => ({\n above: { loadingState: LoadingState.NotStarted, rows: [] },\n below: { loadingState: LoadingState.NotStarted, rows: [] },\n});\n\nconst getLoadMoreDirection = (place: Place, sortOrder: LogsSortOrder): LogRowContextQueryDirection => {\n if (place === 'above' && sortOrder === LogsSortOrder.Descending) {\n return LogRowContextQueryDirection.Forward;\n }\n if (place === 'below' && sortOrder === LogsSortOrder.Ascending) {\n return LogRowContextQueryDirection.Forward;\n }\n\n return LogRowContextQueryDirection.Backward;\n};\n\ntype LoadCounter = Record<Place, number>;\n\nconst normalizeLogRowRefId = (row: LogRowModel, counter: LoadCounter): LogRowModel => {\n // the datasoure plugins often create the context-query based on the row's dataframe's refId,\n // by appending something to it. for example:\n // - let's say the row's dataframe's refId is \"query\"\n // - the datasource plugin will take \"query\" and append \"-context\" to it, so it becomes \"query-context\".\n // - later we want to load even more lines, so we make a context query\n // - the datasource plugin does the same transform again, but now the source is \"query-context\",\n // so the new refId becomes \"query-context-context\"\n // - next time it becomes \"query-context-context-context\", and so on.\n // we do not want refIds to grow unbounded.\n // to avoid this, we set the refId to a value that does not grow.\n // on the other hand, the refId is also used in generating the row's UID, so it is useful\n // when the refId is not always the exact same string, otherwise UID duplication can occur,\n // which may cause problems.\n // so we go with an approach where the refId always changes, but does not grow.\n return {\n ...row,\n dataFrame: {\n ...row.dataFrame,\n refId: `context_${counter.above}_${counter.below}`,\n },\n };\n};\n\nconst containsRow = (rows: LogRowModel[], row: LogRowModel) => {\n return rows.some((r) => r.entry === row.entry && r.timeEpochNs === row.timeEpochNs);\n};\n\nconst PAGE_SIZE = 100;\n\nexport const LogRowContextModal: React.FunctionComponent<LogRowContextModalProps> = ({\n row,\n open,\n logsSortOrder,\n timeZone,\n getLogRowContextUi,\n getRowContextQuery,\n onClose,\n getRowContext,\n}) => {\n const scrollElement = useRef<HTMLDivElement | null>(null);\n const entryElement = useRef<HTMLTableRowElement | null>(null);\n // We can not use `entryElement` to scroll to the right element because it's\n // sticky. That's why we add another row and use this ref to scroll to that\n // first.\n const preEntryElement = useRef<HTMLTableRowElement | null>(null);\n\n const prevScrollHeightRef = useRef<number | null>(null);\n const prevClientHeightRef = useRef<number | null>(null);\n\n const aboveLoadingElement = useRef<HTMLDivElement | null>(null);\n const belowLoadingElement = useRef<HTMLDivElement | null>(null);\n\n const loadCountRef = useRef<LoadCounter>({ above: 0, below: 0 });\n\n const dispatch = useDispatch();\n const theme = useTheme2();\n const styles = getStyles(theme);\n\n const [sticky, setSticky] = useState(true);\n\n // we need to keep both the \"above\" and \"below\" rows\n // in the same react-state, to be able to atomically change both\n // at the same time.\n // we create the `setSection` convenience function to adjust any\n // part of it easily.\n const [context, setContext] = useState<Context>(makeEmptyContext());\n const setSection = (place: Place, fun: (s: Section) => Section) => {\n setContext((c) => {\n const newContext = { ...c };\n newContext[place] = fun(c[place]);\n return newContext;\n });\n };\n\n // this is used to \"cancel\" the ongoing load-more requests.\n // whenever we want to cancel them, we increment this number.\n // and when those requests return, we check if the number\n // is still the same as when we started. and if it is not the same,\n // we ignore the results.\n //\n // best would be to literally cancel those requests,\n // but right now there's no way with the current logs-context API.\n const generationRef = useRef(1);\n\n const [contextQuery, setContextQuery] = useState<DataQuery | null>(null);\n const [wrapLines, setWrapLines] = useState(\n store.getBool(SETTINGS_KEYS.logContextWrapLogMessage, store.getBool(SETTINGS_KEYS.wrapLogMessage, true))\n );\n const getFullTimeRange = useCallback(() => {\n const { below, above } = context;\n const allRows = sortLogRows([...below.rows, row, ...above.rows], LogsSortOrder.Ascending);\n const fromMs = allRows[0].timeEpochMs;\n let toMs = allRows[allRows.length - 1].timeEpochMs;\n // In case we have a lot of logs and from and to have same millisecond\n // we add 1 millisecond to toMs to make sure we have a range\n if (fromMs === toMs) {\n toMs += 1;\n }\n const from = dateTime(fromMs);\n const to = dateTime(toMs);\n\n const range: TimeRange = {\n from,\n to,\n raw: {\n from,\n to,\n },\n };\n return range;\n }, [context, row]);\n\n const updateContextQuery = useCallback(async () => {\n const contextQuery = getRowContextQuery ? await getRowContextQuery(row) : null;\n setContextQuery(contextQuery);\n }, [row, getRowContextQuery]);\n\n const updateResults = async () => {\n await updateContextQuery();\n setContext(makeEmptyContext());\n loadCountRef.current = { above: 0, below: 0 };\n generationRef.current += 1; // results from currently running loadMore calls will be ignored\n };\n\n const loadMore = async (place: Place, allRows: LogRowModel[]): Promise<LogRowModel[]> => {\n loadCountRef.current[place] += 1;\n const refRow = allRows.at(place === 'above' ? 0 : -1);\n if (refRow == null) {\n throw new Error('should never happen. the array always contains at least 1 item (the middle row)');\n }\n\n reportInteraction('grafana_explore_logs_log_context_load_more_called', {\n datasourceType: refRow.datasourceType,\n above: loadCountRef.current.above,\n below: loadCountRef.current.below,\n });\n\n const direction = getLoadMoreDirection(place, logsSortOrder);\n\n const result = await getRowContext(normalizeLogRowRefId(refRow, loadCountRef.current), {\n limit: PAGE_SIZE,\n direction,\n });\n const newRows = dataFrameToLogsModel(result.data).rows;\n\n if (logsSortOrder === LogsSortOrder.Ascending) {\n newRows.reverse();\n }\n\n const out = newRows.filter((r) => {\n return !containsRow(allRows, r);\n });\n\n return out;\n };\n\n useEffect(() => {\n if (open) {\n updateContextQuery();\n }\n }, [updateContextQuery, open]);\n\n const [displayedFields, setDisplayedFields] = useState<string[]>([]);\n\n const showField = (key: string) => {\n const index = displayedFields.indexOf(key);\n\n if (index === -1) {\n setDisplayedFields([...displayedFields, key]);\n }\n };\n\n const hideField = (key: string) => {\n const index = displayedFields.indexOf(key);\n\n if (index > -1) {\n displayedFields.splice(index, 1);\n setDisplayedFields([...displayedFields]);\n }\n };\n\n const maybeLoadMore = async (place: Place) => {\n const { below, above } = context;\n const section = context[place];\n if (section.loadingState === LoadingState.Loading) {\n return;\n }\n\n setSection(place, (section) => ({\n ...section,\n loadingState: LoadingState.Loading,\n }));\n\n const currentGen = generationRef.current;\n try {\n // we consider all the currently existing rows, even the original row,\n // this way this array of rows will never be empty\n const allRows = [...above.rows, row, ...below.rows];\n\n const newRows = (await loadMore(place, allRows)).map((r) =>\n // apply the original row's searchWords to all the rows for highlighting\n !r.searchWords || !r.searchWords?.length ? { ...r, searchWords: row.searchWords } : r\n );\n const [older, newer] = partition(newRows, (newRow) => newRow.timeEpochNs > row.timeEpochNs);\n const newAbove = logsSortOrder === LogsSortOrder.Ascending ? newer : older;\n const newBelow = logsSortOrder === LogsSortOrder.Ascending ? older : newer;\n\n if (currentGen === generationRef.current) {\n setContext((c) => {\n // we should only modify the row-arrays if necessary\n const sortedNewAbove =\n newAbove.length > 0 ? sortLogRows([...newAbove, ...c.above.rows], logsSortOrder) : c.above.rows;\n const sortedNewBelow =\n newBelow.length > 0 ? sortLogRows([...c.below.rows, ...newBelow], logsSortOrder) : c.below.rows;\n return {\n above: {\n rows: sortedNewAbove,\n loadingState:\n place === 'above'\n ? newRows.length === 0\n ? LoadingState.Done\n : LoadingState.NotStarted\n : c.above.loadingState,\n },\n below: {\n rows: sortedNewBelow,\n loadingState:\n place === 'below'\n ? newRows.length === 0\n ? LoadingState.Done\n : LoadingState.NotStarted\n : c.below.loadingState,\n },\n };\n });\n }\n } catch {\n setSection(place, (section) => ({\n rows: section.rows,\n loadingState: LoadingState.Error,\n }));\n }\n };\n\n const onScrollHit = async (entries: IntersectionObserverEntry[], observer: IntersectionObserver) => {\n for (const entry of entries) {\n // If the element is not intersecting, skip to the next one\n if (!entry.isIntersecting) {\n continue;\n }\n\n const targetElement = entry.target;\n\n if (targetElement === aboveLoadingElement.current) {\n maybeLoadMore('above');\n } else if (targetElement === belowLoadingElement.current) {\n maybeLoadMore('below');\n }\n }\n };\n\n useEffect(() => {\n const scroll = scrollElement.current;\n const aboveElem = aboveLoadingElement.current;\n const belowElem = belowLoadingElement.current;\n\n if (scroll == null) {\n // should not happen, but need to make typescript happy\n return;\n }\n\n const observer = new IntersectionObserver(onScrollHit, { root: scroll });\n\n if (aboveElem != null) {\n observer.observe(aboveElem);\n }\n\n if (belowElem != null) {\n observer.observe(belowElem);\n }\n\n return () => {\n observer.disconnect();\n };\n }); // on every render, why not\n\n const scrollToCenter = useCallback(() => {\n preEntryElement.current?.scrollIntoView({ block: 'center' });\n entryElement.current?.scrollIntoView({ block: 'center' });\n }, [preEntryElement, entryElement]);\n\n useLayoutEffect(() => {\n const scrollE = scrollElement.current;\n if (scrollE == null) {\n return;\n }\n\n const prevClientHeight = prevClientHeightRef.current;\n const currentClientHeight = scrollE.clientHeight;\n prevClientHeightRef.current = currentClientHeight;\n if (prevClientHeight !== currentClientHeight) {\n // height has changed, we scroll to the center\n scrollToCenter();\n return;\n }\n\n // if the newly loaded content is part of the initial load of `above` and `below`,\n // we scroll to center, to keep the chosen log-row centered\n if (loadCountRef.current.above <= 1 && loadCountRef.current.below <= 1) {\n scrollToCenter();\n return;\n }\n\n const prevScrollHeight = prevScrollHeightRef.current;\n const currentHeight = scrollE.scrollHeight;\n prevScrollHeightRef.current = currentHeight;\n if (prevScrollHeight != null) {\n const newScrollTop = scrollE.scrollTop + (currentHeight - prevScrollHeight);\n scrollE.scrollTop = newScrollTop;\n }\n }, [context.above.rows, scrollToCenter]);\n\n useAsync(updateContextQuery, [getRowContextQuery, row]);\n\n const loadingStateAbove = context.above.loadingState;\n const loadingStateBelow = context.below.loadingState;\n const timeRange = getFullTimeRange();\n\n return (\n <Modal\n isOpen={open}\n title={t('logs.log-row-context-modal.title-log-context', 'Log context')}\n contentClassName={styles.flexColumn}\n className={styles.modal}\n onDismiss={onClose}\n >\n {config.featureToggles.logsContextDatasourceUi && getLogRowContextUi && (\n <div className={styles.datasourceUi}>{getLogRowContextUi(row, updateResults)}</div>\n )}\n <div className={cx(styles.flexRow, styles.paddingBottom)}>\n <div>\n <LogContextButtons\n wrapLines={wrapLines}\n onChangeWrapLines={setWrapLines}\n onScrollCenterClick={scrollToCenter}\n />\n </div>\n </div>\n <div ref={scrollElement} className={styles.logRowGroups}>\n <table>\n <tbody>\n <tr>\n <td className={styles.loadingCell}>\n {loadingStateAbove !== LoadingState.Done && loadingStateAbove !== LoadingState.Error && (\n <div ref={aboveLoadingElement}>\n <LoadingIndicator adjective=\"newer\" />\n </div>\n )}\n {loadingStateAbove === LoadingState.Error && (\n <div>\n <Trans i18nKey=\"logs.log-row-context-modal.error-loading-log-more-logs\">\n Error loading more logs.\n </Trans>\n </div>\n )}\n {loadingStateAbove === LoadingState.Done && (\n <div>\n <Trans i18nKey=\"logs.log-row-context-modal.no-more-logs-available\">No more logs available.</Trans>\n </div>\n )}\n </td>\n </tr>\n <tr>\n <td className={styles.noMarginBottom}>\n <LogRows\n logRows={context.above.rows}\n dedupStrategy={LogsDedupStrategy.none}\n showLabels={store.getBool(SETTINGS_KEYS.showLabels, false)}\n showTime={store.getBool(SETTINGS_KEYS.showTime, true)}\n wrapLogMessage={wrapLines}\n prettifyLogMessage={store.getBool(SETTINGS_KEYS.prettifyLogMessage, false)}\n enableLogDetails={true}\n timeZone={timeZone}\n displayedFields={displayedFields}\n onClickShowField={showField}\n onClickHideField={hideField}\n scrollElement={null}\n timeRange={timeRange}\n />\n </td>\n </tr>\n <tr ref={preEntryElement}></tr>\n <tr ref={entryElement} className={cx(styles.entry, sticky ? styles.sticky : null)} data-testid=\"entry-row\">\n <td className={styles.noMarginBottom}>\n <LogRows\n logRows={[row]}\n dedupStrategy={LogsDedupStrategy.none}\n showLabels={store.getBool(SETTINGS_KEYS.showLabels, false)}\n showTime={store.getBool(SETTINGS_KEYS.showTime, true)}\n wrapLogMessage={wrapLines}\n prettifyLogMessage={store.getBool(SETTINGS_KEYS.prettifyLogMessage, false)}\n enableLogDetails={true}\n timeZone={timeZone}\n displayedFields={displayedFields}\n onClickShowField={showField}\n onClickHideField={hideField}\n onUnpinLine={() => setSticky(false)}\n onPinLine={() => setSticky(true)}\n pinnedLogs={sticky ? [row.uid] : undefined}\n overflowingContent={true}\n scrollElement={null}\n timeRange={timeRange}\n />\n </td>\n </tr>\n <tr>\n <td>\n <>\n <LogRows\n logRows={context.below.rows}\n dedupStrategy={LogsDedupStrategy.none}\n showLabels={store.getBool(SETTINGS_KEYS.showLabels, false)}\n showTime={store.getBool(SETTINGS_KEYS.showTime, true)}\n wrapLogMessage={wrapLines}\n prettifyLogMessage={store.getBool(SETTINGS_KEYS.prettifyLogMessage, false)}\n enableLogDetails={true}\n timeZone={timeZone}\n displayedFields={displayedFields}\n onClickShowField={showField}\n onClickHideField={hideField}\n scrollElement={null}\n timeRange={timeRange}\n />\n </>\n </td>\n </tr>\n <tr>\n <td className={styles.loadingCell}>\n {loadingStateBelow !== LoadingState.Done && loadingStateBelow !== LoadingState.Error && (\n <div ref={belowLoadingElement}>\n <LoadingIndicator adjective=\"older\" />\n </div>\n )}\n {loadingStateBelow === LoadingState.Error && (\n <div>\n <Trans i18nKey=\"logs.log-row-context-modal.error-loading-log-more-logs\">\n Error loading more logs.\n </Trans>\n </div>\n )}\n {loadingStateBelow === LoadingState.Done && (\n <div>\n <Trans i18nKey=\"logs.log-row-context-modal.no-more-logs-available\">No more logs available.</Trans>\n </div>\n )}\n </td>\n </tr>\n </tbody>\n </table>\n </div>\n\n <Modal.ButtonRow>\n {contextQuery?.datasource?.uid && (\n <Button\n variant=\"secondary\"\n onClick={async () => {\n let rowId = row.uid;\n if (row.dataFrame.refId) {\n // the orignal row has the refid from the base query and not the refid from the context query, so we need to replace it.\n rowId = row.uid.replace(row.dataFrame.refId, contextQuery.refId);\n }\n\n dispatch(\n splitOpen({\n queries: [contextQuery],\n range: timeRange,\n datasourceUid: contextQuery.datasource!.uid!,\n panelsState: {\n logs: {\n id: rowId,\n },\n },\n })\n );\n onClose();\n reportInteraction('grafana_explore_logs_log_context_open_split_view_clicked', {\n datasourceType: row.datasourceType,\n logRowUid: row.uid,\n });\n }}\n >\n <Trans i18nKey=\"logs.log-row-context-modal.open-in-split-view\">Open in split view</Trans>\n </Button>\n )}\n </Modal.ButtonRow>\n </Modal>\n );\n};\n","import { css, cx } from '@emotion/css';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n logsStatsRow: css({\n label: 'logs-stats-row',\n margin: `${parseInt(theme.spacing(2), 10) / 1.75}px 0`,\n }),\n logsStatsRowActive: css({\n label: 'logs-stats-row--active',\n color: theme.colors.primary.text,\n position: 'relative',\n }),\n logsStatsRowLabel: css({\n label: 'logs-stats-row__label',\n display: 'flex',\n marginBottom: '1px',\n }),\n logsStatsRowValue: css({\n label: 'logs-stats-row__value',\n flex: 1,\n textOverflow: 'ellipsis',\n overflow: 'hidden',\n }),\n logsStatsRowCount: css({\n label: 'logs-stats-row__count',\n textAlign: 'right',\n marginLeft: theme.spacing(0.75),\n }),\n logsStatsRowPercent: css({\n label: 'logs-stats-row__percent',\n textAlign: 'right',\n marginLeft: theme.spacing(0.75),\n width: theme.spacing(4.5),\n }),\n logsStatsRowBar: css({\n label: 'logs-stats-row__bar',\n height: theme.spacing(0.5),\n overflow: 'hidden',\n background: theme.colors.text.disabled,\n }),\n logsStatsRowInnerBar: css({\n label: 'logs-stats-row__innerbar',\n height: theme.spacing(0.5),\n overflow: 'hidden',\n background: theme.colors.primary.main,\n }),\n});\n\nexport interface Props {\n active?: boolean;\n count: number;\n proportion: number;\n value?: string;\n}\n\nexport const LogLabelStatsRow = ({ active, count, proportion, value }: Props) => {\n const style = useStyles2(getStyles);\n const percent = `${Math.round(proportion * 100)}%`;\n const barStyle = { width: percent };\n const className = active ? cx([style.logsStatsRow, style.logsStatsRowActive]) : cx([style.logsStatsRow]);\n\n return (\n <div className={className}>\n <div className={cx([style.logsStatsRowLabel])}>\n <div className={cx([style.logsStatsRowValue])} title={value}>\n {value}\n </div>\n <div className={cx([style.logsStatsRowCount])}>{count}</div>\n <div className={cx([style.logsStatsRowPercent])}>{percent}</div>\n </div>\n <div className={cx([style.logsStatsRowBar])}>\n <div className={cx([style.logsStatsRowInnerBar])} style={barStyle} />\n </div>\n </div>\n );\n};\n\nLogLabelStatsRow.displayName = 'LogLabelStatsRow';\n","import { css } from '@emotion/css';\nimport { useMemo } from 'react';\n\nimport { LogLabelStatsModel, GrafanaTheme2 } from '@grafana/data';\nimport { t } from '@grafana/i18n';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { LogLabelStatsRow } from './LogLabelStatsRow';\n\nconst STATS_ROW_LIMIT = 5;\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n logsStats: css({\n label: 'logs-stats',\n background: 'inherit',\n color: theme.colors.text.primary,\n wordBreak: 'break-all',\n width: 'fit-content',\n maxWidth: '100%',\n }),\n logsStatsHeader: css({\n label: 'logs-stats__header',\n borderBottom: `1px solid ${theme.colors.border.medium}`,\n display: 'flex',\n }),\n logsStatsTitle: css({\n label: 'logs-stats__title',\n fontWeight: theme.typography.fontWeightMedium,\n paddingRight: theme.spacing(2),\n display: 'inline-block',\n whiteSpace: 'nowrap',\n textOverflow: 'ellipsis',\n flexGrow: 1,\n }),\n logsStatsClose: css({\n label: 'logs-stats__close',\n cursor: 'pointer',\n }),\n logsStatsBody: css({\n label: 'logs-stats__body',\n padding: '5px 0px',\n }),\n };\n};\n\ninterface Props {\n className?: string;\n stats: LogLabelStatsModel[];\n label: string;\n value: string;\n rowCount: number;\n isLabel?: boolean;\n}\n\nexport const LogLabelStats = ({ className, label, rowCount, stats, value, isLabel }: Props) => {\n const style = useStyles2(getStyles);\n const rows = useMemo(() => {\n const topRows = stats.slice(0, STATS_ROW_LIMIT);\n let activeRow = topRows.find((row) => row.value === value);\n let otherRows = stats.slice(STATS_ROW_LIMIT);\n const insertActiveRow = !activeRow;\n\n // Remove active row from other to show extra\n if (insertActiveRow) {\n activeRow = otherRows.find((row) => row.value === value);\n otherRows = otherRows.filter((row) => row.value !== value);\n }\n return { topRows, otherRows, insertActiveRow, activeRow };\n }, [stats, value]);\n\n const otherCount = useMemo(() => rows.otherRows.reduce((sum, row) => sum + row.count, 0), [rows.otherRows]);\n const topCount = useMemo(() => rows.topRows.reduce((sum, row) => sum + row.count, 0), [rows.topRows]);\n const total = topCount + otherCount;\n const otherProportion = otherCount / total;\n\n return (\n <div className={className ?? style.logsStats} data-testid=\"logLabelStats\">\n <div className={style.logsStatsHeader}>\n <div className={style.logsStatsTitle}>\n {isLabel\n ? t(\n 'logs.un-themed-log-label-stats.label-log-stats',\n '{{label}}: {{total}} of {{rowCount}} rows have that label',\n {\n label,\n total,\n rowCount,\n }\n )\n : t(\n 'logs.un-themed-log-label-stats.field-log-stats',\n '{{label}}: {{total}} of {{rowCount}} rows have that field'\n )}\n </div>\n </div>\n <div className={style.logsStatsBody}>\n {rows.topRows.map((stat) => (\n <LogLabelStatsRow key={stat.value} {...stat} active={stat.value === value} />\n ))}\n {rows.insertActiveRow && rows.activeRow && (\n <LogLabelStatsRow key={rows.activeRow.value} {...rows.activeRow} active />\n )}\n {otherCount > 0 && (\n <LogLabelStatsRow key=\"__OTHERS__\" count={otherCount} value=\"Other\" proportion={otherProportion} />\n )}\n </div>\n </div>\n );\n};\n","import { debounce } from 'lodash';\nimport {\n createContext,\n Dispatch,\n ReactNode,\n SetStateAction,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from 'react';\n\nimport { createAssistantContextItem, OpenAssistantProps, useAssistant } from '@grafana/assistant';\nimport {\n CoreApp,\n DataFrame,\n LogLevel,\n LogRowModel,\n LogsDedupStrategy,\n LogsMetaItem,\n LogsSortOrder,\n shallowCompare,\n store,\n} from '@grafana/data';\nimport { t } from '@grafana/i18n';\nimport { config, getDataSourceSrv } from '@grafana/runtime';\nimport { PopoverContent } from '@grafana/ui';\n\nimport { checkLogsError, checkLogsSampled, downloadLogs as download, DownloadFormat } from '../../utils';\nimport { getSidebarState } from '../fieldSelector/FieldSelector';\nimport { getDisplayedFieldsForLogs } from '../otel/formats';\n\nimport { LogLineTimestampResolution } from './LogLine';\nimport { LogLineDetailsMode } from './LogLineDetails';\nimport { GetRowContextQueryFn, LogLineMenuCustomItem } from './LogLineMenu';\nimport { LogListOptions, LogListFontSize } from './LogList';\nimport { reportInteractionOnce } from './analytics';\nimport { LogListModel } from './processing';\nimport { getScrollbarWidth, LOG_LIST_CONTROLS_WIDTH, LOG_LIST_MIN_WIDTH } from './virtualization';\n\nexport interface LogListContextData extends Omit<Props, 'containerElement' | 'logs' | 'logsMeta' | 'showControls'> {\n closeDetails: () => void;\n controlsExpanded: boolean;\n detailsDisplayed: (log: LogListModel) => boolean;\n detailsMode: LogLineDetailsMode;\n detailsWidth: number;\n downloadLogs: (format: DownloadFormat) => void;\n enableLogDetails: boolean;\n filterLevels: LogLevel[];\n forceEscape: boolean;\n hasLogsWithErrors?: boolean;\n hasSampledLogs?: boolean;\n hasUnescapedContent: boolean;\n logLineMenuCustomItems?: LogLineMenuCustomItem[];\n setControlsExpanded: (expanded: boolean) => void;\n setDedupStrategy: (dedupStrategy: LogsDedupStrategy) => void;\n setDetailsMode: (mode: LogLineDetailsMode) => void;\n setDetailsWidth: (width: number) => void;\n setFilterLevels: (filterLevels: LogLevel[]) => void;\n setFontSize: (size: LogListFontSize) => void;\n setForceEscape: (forceEscape: boolean) => void;\n setLogListState: Dispatch<SetStateAction<LogListState>>;\n setPinnedLogs: (pinnedlogs: string[]) => void;\n setPrettifyJSON: (prettifyJSON: boolean) => void;\n setSyntaxHighlighting: (syntaxHighlighting: boolean) => void;\n setShowTime: (showTime: boolean) => void;\n setShowUniqueLabels: (showUniqueLabels: boolean) => void;\n setSortOrder: (sortOrder: LogsSortOrder) => void;\n setTimestampResolution: (format: LogLineTimestampResolution) => void;\n setWrapLogMessage: (showTime: boolean) => void;\n showDetails: LogListModel[];\n timestampResolution: LogLineTimestampResolution;\n toggleDetails: (log: LogListModel) => void;\n isAssistantAvailable: boolean;\n openAssistantByLog: ((log: LogListModel) => void) | undefined;\n}\n\nexport const LogListContext = createContext<LogListContextData>({\n app: CoreApp.Unknown,\n closeDetails: () => {},\n controlsExpanded: false,\n dedupStrategy: LogsDedupStrategy.none,\n detailsDisplayed: () => false,\n detailsMode: 'sidebar',\n detailsWidth: 0,\n displayedFields: [],\n downloadLogs: () => {},\n enableLogDetails: false,\n filterLevels: [],\n forceEscape: false,\n fontSize: 'default',\n hasUnescapedContent: false,\n noInteractions: false,\n setControlsExpanded: () => {},\n setDedupStrategy: () => {},\n setDetailsMode: () => {},\n setDetailsWidth: () => {},\n setFilterLevels: () => {},\n setFontSize: () => {},\n setForceEscape: () => {},\n setLogListState: () => {},\n setPinnedLogs: () => {},\n setPrettifyJSON: () => {},\n setShowTime: () => {},\n setShowUniqueLabels: () => {},\n setSortOrder: () => {},\n setSyntaxHighlighting: () => {},\n setTimestampResolution: () => {},\n setWrapLogMessage: () => {},\n showDetails: [],\n showTime: true,\n sortOrder: LogsSortOrder.Ascending,\n syntaxHighlighting: true,\n timestampResolution: 'ns',\n toggleDetails: () => {},\n wrapLogMessage: false,\n isAssistantAvailable: false,\n openAssistantByLog: () => {},\n});\n\nexport const useLogListContextData = (key: keyof LogListContextData) => {\n const data: LogListContextData = useContext(LogListContext);\n return data[key];\n};\n\nexport const useLogListContext = (): LogListContextData => {\n return useContext(LogListContext);\n};\n\nexport const useLogIsPinned = (log: LogListModel) => {\n const { pinnedLogs } = useContext(LogListContext);\n return pinnedLogs?.some((logId) => logId === log.rowId);\n};\n\nexport const useLogIsPermalinked = (log: LogListModel) => {\n const { permalinkedLogId } = useContext(LogListContext);\n return permalinkedLogId && permalinkedLogId === log.uid;\n};\n\nexport type LogListState = Pick<\n LogListContextData,\n | 'dedupStrategy'\n | 'fontSize'\n | 'forceEscape'\n | 'filterLevels'\n | 'pinnedLogs'\n | 'showUniqueLabels'\n | 'showTime'\n | 'sortOrder'\n | 'syntaxHighlighting'\n | 'timestampResolution'\n>;\n\nexport interface Props {\n app: CoreApp;\n children?: ReactNode;\n // Only ControlledLogRows can send an undefined containerElement. See LogList.tsx\n containerElement?: HTMLDivElement;\n detailsMode?: LogLineDetailsMode;\n dedupStrategy: LogsDedupStrategy;\n displayedFields: string[];\n enableLogDetails: boolean;\n filterLevels?: LogLevel[];\n fontSize: LogListFontSize;\n getRowContextQuery?: GetRowContextQueryFn;\n isLabelFilterActive?: (key: string, value: string, refId?: string) => Promise<boolean>;\n logs: LogRowModel[];\n logLineMenuCustomItems?: LogLineMenuCustomItem[];\n logsMeta?: LogsMetaItem[];\n logOptionsStorageKey?: string;\n logSupportsContext?: (row: LogRowModel) => boolean;\n noInteractions?: boolean;\n onClickFilterLabel?: (key: string, value: string, frame?: DataFrame) => void;\n onClickFilterOutLabel?: (key: string, value: string, frame?: DataFrame) => void;\n onClickFilterString?: (value: string, refId?: string) => void;\n onClickFilterOutString?: (value: string, refId?: string) => void;\n onClickShowField?: (key: string) => void;\n onClickHideField?: (key: string) => void;\n onLogOptionsChange?: (option: LogListOptions, value: string | boolean | string[]) => void;\n onLogLineHover?: (row?: LogRowModel) => void;\n onPermalinkClick?: (row: LogRowModel) => Promise<void>;\n onPinLine?: (row: LogRowModel) => void;\n onOpenContext?: (row: LogRowModel, onClose: () => void) => void;\n onUnpinLine?: (row: LogRowModel) => void;\n permalinkedLogId?: string;\n pinLineButtonTooltipTitle?: PopoverContent;\n pinnedLogs?: string[];\n prettifyJSON?: boolean;\n setDisplayedFields?: (displayedFields: string[]) => void;\n showControls: boolean;\n showLogAttributes?: boolean;\n showUniqueLabels?: boolean;\n showTime: boolean;\n sortOrder: LogsSortOrder;\n syntaxHighlighting?: boolean;\n timestampResolution?: LogLineTimestampResolution;\n wrapLogMessage: boolean;\n}\n\nexport const LogListContextProvider = ({\n app,\n children,\n containerElement,\n enableLogDetails,\n logOptionsStorageKey,\n detailsMode: detailsModeProp = logOptionsStorageKey\n ? (store.get(`${logOptionsStorageKey}.detailsMode`) ?? getDefaultDetailsMode(containerElement))\n : getDefaultDetailsMode(containerElement),\n dedupStrategy,\n displayedFields,\n filterLevels,\n fontSize,\n isLabelFilterActive,\n getRowContextQuery,\n logs,\n logLineMenuCustomItems,\n logsMeta,\n logSupportsContext,\n noInteractions,\n onClickFilterLabel,\n onClickFilterOutLabel,\n onClickFilterString,\n onClickFilterOutString,\n onClickShowField,\n onClickHideField,\n onLogOptionsChange,\n onLogLineHover,\n onPermalinkClick,\n onPinLine,\n onOpenContext,\n onUnpinLine,\n permalinkedLogId,\n pinLineButtonTooltipTitle,\n pinnedLogs,\n prettifyJSON: prettifyJSONProp,\n setDisplayedFields,\n showControls,\n showLogAttributes,\n showTime,\n showUniqueLabels,\n sortOrder,\n syntaxHighlighting,\n timestampResolution = logOptionsStorageKey\n ? (store.get(`${logOptionsStorageKey}.timestampResolution`) ?? 'ms')\n : 'ms',\n wrapLogMessage: wrapLogMessageProp,\n}: Props) => {\n const [logListState, setLogListState] = useState<LogListState>({\n dedupStrategy,\n filterLevels:\n filterLevels ?? (logOptionsStorageKey ? store.getObject(`${logOptionsStorageKey}.filterLevels`, []) : []),\n fontSize,\n forceEscape: logOptionsStorageKey ? store.getBool(`${logOptionsStorageKey}.forceEscape`, false) : false,\n pinnedLogs,\n showTime,\n showUniqueLabels,\n sortOrder,\n syntaxHighlighting,\n timestampResolution,\n });\n const [showDetails, setShowDetails] = useState<LogListModel[]>([]);\n const [detailsWidth, setDetailsWidthState] = useState(\n getDetailsWidth(containerElement, logOptionsStorageKey, undefined, detailsModeProp, showControls)\n );\n const [detailsMode, setDetailsMode] = useState<LogLineDetailsMode>(\n detailsModeProp ?? getDefaultDetailsMode(containerElement)\n );\n const { isAvailable: isAssistantAvailable, openAssistant } = useAssistant();\n const [prettifyJSON, setPrettifyJSONState] = useState(prettifyJSONProp);\n const [wrapLogMessage, setWrapLogMessageState] = useState(wrapLogMessageProp);\n\n useEffect(() => {\n if (noInteractions) {\n return;\n }\n reportInteractionOnce(`logs_log_list_${app}_logs_displayed`, {\n dedupStrategy,\n fontSize,\n forceEscape: logListState.forceEscape,\n fieldSelectorOpen: getSidebarState(logOptionsStorageKey),\n showTime,\n showUniqueLabels,\n syntaxHighlighting,\n wrapLogMessage,\n prettifyJSON,\n detailsWidth,\n detailsMode,\n withDisplayedFields: displayedFields.length > 0,\n timestampResolution: logListState.timestampResolution,\n });\n // Just once\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n const otelDisplayedFields = useMemo(() => {\n if (!config.featureToggles.otelLogsFormatting || !setDisplayedFields || showLogAttributes === false) {\n return [];\n }\n return getDisplayedFieldsForLogs(logs);\n }, [logs, setDisplayedFields, showLogAttributes]);\n\n // OTel displayed fields\n useEffect(() => {\n if (config.featureToggles.otelLogsFormatting && showLogAttributes !== false) {\n onLogOptionsChange?.('defaultDisplayedFields', otelDisplayedFields);\n }\n }, [onLogOptionsChange, otelDisplayedFields, showLogAttributes]);\n\n useEffect(() => {\n if (displayedFields.length > 0 || !setDisplayedFields) {\n return;\n }\n if (otelDisplayedFields.length) {\n setDisplayedFields(otelDisplayedFields);\n }\n }, [displayedFields.length, otelDisplayedFields, setDisplayedFields]);\n\n // Sync state\n useEffect(() => {\n // Props are updated in the context only of the panel is being externally controlled.\n if (showControls && app !== CoreApp.PanelEditor) {\n return;\n }\n const newState = {\n ...logListState,\n dedupStrategy,\n showTime,\n showUniqueLabels,\n sortOrder,\n syntaxHighlighting,\n };\n if (!shallowCompare(logListState, newState)) {\n setLogListState(newState);\n }\n }, [app, dedupStrategy, logListState, showControls, showTime, showUniqueLabels, sortOrder, syntaxHighlighting]);\n\n // Sync filter levels\n useEffect(() => {\n if (filterLevels === undefined) {\n return;\n }\n setLogListState((logListState) => {\n if (!shallowCompare(logListState.filterLevels, filterLevels)) {\n return { ...logListState, filterLevels };\n }\n return logListState;\n });\n }, [filterLevels]);\n\n // Sync details mode\n useEffect(() => {\n if (detailsModeProp) {\n setDetailsMode(detailsModeProp);\n }\n }, [detailsModeProp]);\n\n // Sync font size\n useEffect(() => {\n setLogListState((logListState) => ({ ...logListState, fontSize }));\n }, [fontSize]);\n\n // Sync pinned logs\n useEffect(() => {\n if (!shallowCompare(logListState.pinnedLogs ?? [], pinnedLogs ?? [])) {\n setLogListState({ ...logListState, pinnedLogs });\n }\n }, [logListState, pinnedLogs]);\n\n // Sync show details\n useEffect(() => {\n if (!showDetails.length) {\n return;\n }\n const newShowDetails = showDetails.filter(\n (expandedLog) => logs.findIndex((log) => log.uid === expandedLog.uid) >= 0\n );\n if (newShowDetails.length !== showDetails.length) {\n setShowDetails(newShowDetails);\n }\n }, [logs, showDetails]);\n\n // Sync log details inline and sidebar width\n useEffect(() => {\n setDetailsWidthState(getDetailsWidth(containerElement, logOptionsStorageKey, undefined, detailsMode, showControls));\n }, [containerElement, detailsMode, logOptionsStorageKey, showControls]);\n\n // Sync log details width\n useEffect(() => {\n if (!containerElement) {\n return;\n }\n const handleResize = debounce(() => {\n setDetailsWidthState((detailsWidth) =>\n getDetailsWidth(containerElement, logOptionsStorageKey, detailsWidth, detailsMode, showControls)\n );\n }, 50);\n const observer = new ResizeObserver(() => handleResize());\n observer.observe(containerElement);\n return () => observer.disconnect();\n }, [containerElement, detailsMode, logOptionsStorageKey, showControls]);\n\n // Sync prettifyJSON\n useEffect(() => {\n if (prettifyJSONProp !== undefined) {\n setPrettifyJSONState(prettifyJSONProp);\n }\n }, [prettifyJSONProp]);\n\n // Sync wrapLogMessage\n useEffect(() => {\n setWrapLogMessageState(wrapLogMessageProp);\n }, [wrapLogMessageProp]);\n\n // Sync timestamp resolution\n useEffect(() => {\n setLogListState((state) => ({\n ...state,\n timestampResolution,\n }));\n }, [timestampResolution]);\n\n // Sync showLogAttributes\n useEffect(() => {\n if (showLogAttributes === false && setDisplayedFields) {\n setDisplayedFields([]);\n }\n }, [setDisplayedFields, showLogAttributes]);\n\n const controlsExpandedFromStore = store.getBool(\n `${logOptionsStorageKey}.controlsExpanded`,\n getDefaultControlsExpandedMode(containerElement ?? null)\n );\n // If the user has a large viewport, show the expanded state by default\n const [controlsExpanded, setControlsExpanded] = useState<boolean>(controlsExpandedFromStore);\n\n const detailsDisplayed = useCallback(\n (log: LogListModel) => !!showDetails.find((shownLog) => shownLog.uid === log.uid),\n [showDetails]\n );\n\n const setDedupStrategy = useCallback(\n (dedupStrategy: LogsDedupStrategy) => {\n setLogListState({ ...logListState, dedupStrategy });\n onLogOptionsChange?.('dedupStrategy', dedupStrategy);\n },\n [logListState, onLogOptionsChange]\n );\n\n const setFontSize = useCallback(\n (fontSize: LogListFontSize) => {\n if (logOptionsStorageKey) {\n store.set(`${logOptionsStorageKey}.fontSize`, fontSize);\n }\n setLogListState((logListState) => ({ ...logListState, fontSize }));\n onLogOptionsChange?.('fontSize', fontSize);\n },\n [logOptionsStorageKey, onLogOptionsChange]\n );\n\n const setForceEscape = useCallback(\n (forceEscape: boolean) => {\n setLogListState({ ...logListState, forceEscape });\n },\n [logListState]\n );\n\n const setFilterLevels = useCallback(\n (filterLevels: LogLevel[]) => {\n setLogListState({ ...logListState, filterLevels });\n onLogOptionsChange?.('filterLevels', filterLevels);\n },\n [logListState, onLogOptionsChange]\n );\n\n const setPinnedLogs = useCallback(\n (pinnedLogs: string[]) => {\n setLogListState({ ...logListState, pinnedLogs });\n onLogOptionsChange?.('pinnedLogs', pinnedLogs);\n },\n [logListState, onLogOptionsChange]\n );\n\n const setShowTime = useCallback(\n (showTime: boolean) => {\n const newTimestampFormat = showTime === false ? 'ms' : logListState.timestampResolution;\n setLogListState({\n ...logListState,\n showTime,\n timestampResolution: newTimestampFormat,\n });\n onLogOptionsChange?.('showTime', showTime);\n if (logOptionsStorageKey) {\n store.set(`${logOptionsStorageKey}.showTime`, showTime);\n store.set(`${logOptionsStorageKey}.timestampResolution`, newTimestampFormat);\n }\n },\n [logListState, logOptionsStorageKey, onLogOptionsChange]\n );\n\n const setShowUniqueLabels = useCallback(\n (showUniqueLabels: boolean) => {\n setLogListState({ ...logListState, showUniqueLabels });\n onLogOptionsChange?.('showUniqueLabels', showUniqueLabels);\n if (logOptionsStorageKey) {\n store.set(`${logOptionsStorageKey}.showLabels`, showUniqueLabels);\n }\n },\n [logListState, logOptionsStorageKey, onLogOptionsChange]\n );\n\n const setPrettifyJSON = useCallback(\n (prettifyJSON: boolean) => {\n setPrettifyJSONState(prettifyJSON);\n if (logOptionsStorageKey) {\n store.set(`${logOptionsStorageKey}.prettifyLogMessage`, prettifyJSON);\n }\n onLogOptionsChange?.('prettifyLogMessage', prettifyJSON);\n },\n [logOptionsStorageKey, onLogOptionsChange]\n );\n\n const setSyntaxHighlighting = useCallback(\n (syntaxHighlighting: boolean) => {\n setLogListState({ ...logListState, syntaxHighlighting });\n onLogOptionsChange?.('syntaxHighlighting', syntaxHighlighting);\n if (logOptionsStorageKey) {\n store.set(`${logOptionsStorageKey}.syntaxHighlighting`, syntaxHighlighting);\n }\n },\n [logListState, logOptionsStorageKey, onLogOptionsChange]\n );\n\n const setSortOrder = useCallback(\n (sortOrder: LogsSortOrder) => {\n setLogListState({ ...logListState, sortOrder });\n onLogOptionsChange?.('sortOrder', sortOrder);\n if (logOptionsStorageKey) {\n store.set(`${logOptionsStorageKey}.sortOrder`, sortOrder);\n }\n },\n [logListState, logOptionsStorageKey, onLogOptionsChange]\n );\n\n const setWrapLogMessage = useCallback(\n (wrapLogMessage: boolean) => {\n setWrapLogMessageState(wrapLogMessage);\n if (logOptionsStorageKey) {\n store.set(`${logOptionsStorageKey}.wrapLogMessage`, wrapLogMessage);\n }\n onLogOptionsChange?.('wrapLogMessage', wrapLogMessage);\n },\n [logOptionsStorageKey, onLogOptionsChange]\n );\n\n const downloadLogs = useCallback(\n (format: DownloadFormat) => {\n const filteredLogs =\n logListState.filterLevels.length === 0\n ? logs\n : logs.filter((log) => logListState.filterLevels.includes(log.logLevel));\n download(format, filteredLogs, logsMeta, displayedFields);\n },\n [displayedFields, logListState.filterLevels, logs, logsMeta]\n );\n\n const closeDetails = useCallback(() => {\n showDetails.forEach((log) => removeDetailsScrollPosition(log));\n setShowDetails([]);\n }, [showDetails]);\n\n const toggleDetails = useCallback(\n (log: LogListModel) => {\n if (!enableLogDetails) {\n return;\n }\n const found = showDetails.find((stateLog) => stateLog === log || stateLog.uid === log.uid);\n if (found) {\n removeDetailsScrollPosition(found);\n setShowDetails(showDetails.filter((stateLog) => stateLog !== log && stateLog.uid !== log.uid));\n } else {\n // Supporting one displayed details for now\n setShowDetails([...showDetails, log]);\n }\n },\n [enableLogDetails, showDetails]\n );\n\n const setDetailsWidth = useCallback(\n (width: number) => {\n if (!logOptionsStorageKey || !containerElement) {\n return;\n }\n\n const maxWidth = containerElement.clientWidth - LOG_LIST_MIN_WIDTH;\n if (width > maxWidth) {\n return;\n }\n\n store.set(`${logOptionsStorageKey}.detailsWidth`, width);\n setDetailsWidthState(width);\n },\n [containerElement, logOptionsStorageKey]\n );\n\n const setTimestampResolution = useCallback(\n (timestampResolution: LogLineTimestampResolution) => {\n if (logOptionsStorageKey) {\n store.set(`${logOptionsStorageKey}.timestampResolution`, timestampResolution);\n }\n setLogListState((state) => ({\n ...state,\n timestampResolution,\n }));\n },\n [logOptionsStorageKey]\n );\n\n const openAssistantByLog = useCallback(\n (log: LogListModel) => {\n if (!openAssistant) {\n return;\n }\n handleOpenAssistant(openAssistant, log);\n },\n [openAssistant]\n );\n\n const hasLogsWithErrors = useMemo(() => logs.some((log) => !!checkLogsError(log)), [logs]);\n const hasSampledLogs = useMemo(() => logs.some((log) => !!checkLogsSampled(log)), [logs]);\n const hasUnescapedContent = useMemo(() => logs.some((r) => r.hasUnescapedContent), [logs]);\n\n return (\n <LogListContext.Provider\n value={{\n app,\n closeDetails,\n controlsExpanded,\n detailsDisplayed,\n dedupStrategy: logListState.dedupStrategy,\n detailsMode,\n detailsWidth,\n displayedFields,\n downloadLogs,\n enableLogDetails,\n filterLevels: logListState.filterLevels,\n fontSize: logListState.fontSize,\n forceEscape: logListState.forceEscape,\n hasLogsWithErrors,\n hasSampledLogs,\n hasUnescapedContent,\n isLabelFilterActive,\n getRowContextQuery,\n logSupportsContext,\n logLineMenuCustomItems,\n logOptionsStorageKey,\n noInteractions: noInteractions ?? false,\n onClickFilterLabel,\n onClickFilterOutLabel,\n onClickFilterString,\n onClickFilterOutString,\n onClickShowField,\n onClickHideField,\n onLogLineHover,\n onPermalinkClick,\n onPinLine,\n onOpenContext,\n onUnpinLine,\n permalinkedLogId,\n pinLineButtonTooltipTitle,\n pinnedLogs: logListState.pinnedLogs,\n prettifyJSON,\n setControlsExpanded,\n setDedupStrategy,\n setDetailsMode,\n setDetailsWidth,\n setDisplayedFields,\n setFilterLevels,\n setFontSize,\n setForceEscape,\n setLogListState,\n setPinnedLogs,\n setPrettifyJSON,\n setShowTime,\n setShowUniqueLabels,\n setSortOrder,\n setSyntaxHighlighting,\n setTimestampResolution,\n setWrapLogMessage,\n showDetails,\n showTime: logListState.showTime,\n showUniqueLabels: logListState.showUniqueLabels,\n sortOrder: logListState.sortOrder,\n syntaxHighlighting: logListState.syntaxHighlighting,\n timestampResolution: logListState.timestampResolution,\n toggleDetails,\n wrapLogMessage,\n isAssistantAvailable,\n openAssistantByLog,\n }}\n >\n {children}\n </LogListContext.Provider>\n );\n};\n\nexport function isLogsSortOrder(value: unknown): value is LogsSortOrder {\n return value === LogsSortOrder.Ascending || value === LogsSortOrder.Descending;\n}\n\nexport function isDedupStrategy(value: unknown): value is LogsDedupStrategy {\n return (\n value === LogsDedupStrategy.exact ||\n value === LogsDedupStrategy.none ||\n value === LogsDedupStrategy.numbers ||\n value === LogsDedupStrategy.signature\n );\n}\n\n// Only ControlledLogRows can send an undefined containerElement. See LogList.tsx\nfunction getDetailsWidth(\n containerElement: HTMLDivElement | undefined,\n logOptionsStorageKey?: string,\n currentWidth?: number,\n detailsMode: LogLineDetailsMode = 'sidebar',\n showControls?: boolean\n) {\n if (!containerElement) {\n return 0;\n }\n if (detailsMode === 'inline') {\n return containerElement.clientWidth - getScrollbarWidth() - (showControls ? LOG_LIST_CONTROLS_WIDTH : 0);\n }\n const defaultWidth = containerElement.clientWidth * 0.4;\n const detailsWidth =\n currentWidth ||\n (logOptionsStorageKey\n ? parseInt(store.get(`${logOptionsStorageKey}.detailsWidth`) ?? defaultWidth, 10)\n : defaultWidth);\n\n const maxWidth = containerElement.clientWidth - LOG_LIST_MIN_WIDTH;\n\n // The user might have resized the screen.\n if (detailsWidth >= containerElement.clientWidth || detailsWidth > maxWidth) {\n return currentWidth ?? defaultWidth;\n }\n return detailsWidth;\n}\n\nconst detailsScrollMap = new Map<string, number>();\n\nexport function saveDetailsScrollPosition(log: LogListModel, position: number) {\n detailsScrollMap.set(log.uid, position);\n}\n\nexport function getDetailsScrollPosition(log: LogListModel) {\n return detailsScrollMap.get(log.uid) ?? 0;\n}\n\nexport function removeDetailsScrollPosition(log: LogListModel) {\n detailsScrollMap.delete(log.uid);\n}\n\nasync function handleOpenAssistant(openAssistant: (props: OpenAssistantProps) => void, log: LogListModel) {\n const datasource = await getDataSourceSrv().get(log.datasourceUid);\n const context = [];\n if (datasource) {\n context.push(\n createAssistantContextItem('datasource', {\n datasourceUid: datasource.uid,\n })\n );\n }\n openAssistant({\n origin: 'grafana/explain-log-line',\n prompt: `${t('logs.log-line-menu.log-line-explainer', 'Explain log line in a concise way')}:\n\n \\`\\`\\`\n${log.entry.replaceAll('`', '\\\\`')}\n \\`\\`\\`\n `,\n context: [\n ...context,\n createAssistantContextItem('structured', {\n title: t('logs.log-line-menu.log-line', 'Log line'),\n data: {\n labels: log.labels,\n value: log.entry,\n timestamp: log.timestamp,\n },\n }),\n ],\n });\n}\n\nexport function getDefaultDetailsMode(container: HTMLDivElement | undefined): LogLineDetailsMode {\n const width = container?.clientWidth ?? window.innerWidth;\n return width > 1440 ? 'sidebar' : 'inline';\n}\n\nexport function getDefaultControlsExpandedMode(container: HTMLDivElement | null): boolean {\n const width = container?.clientWidth ?? window.innerWidth;\n return width > 1200;\n}\n","import { SyntaxNode } from '@lezer/common';\n\nimport {\n And,\n BinOpExpr,\n Bool,\n By,\n ConvOp,\n Decolorize,\n DropLabel,\n DropLabels,\n DropLabelsExpr,\n Filter,\n FilterOp,\n Grouping,\n GroupingLabelList,\n GroupingLabels,\n Identifier,\n Ip,\n IpLabelFilter,\n Json,\n JsonExpressionParser,\n KeepLabel,\n KeepLabels,\n KeepLabelsExpr,\n LabelExtractionExpression,\n LabelFilter,\n LabelFormatMatcher,\n LabelParser,\n LineFilter,\n LineFormatExpr,\n LogfmtExpressionParser,\n LogfmtParser,\n LogRangeExpr,\n Matcher,\n MetricExpr,\n Number as NumberLezer,\n On,\n Or,\n parser,\n ParserFlag,\n Range,\n RangeAggregationExpr,\n RangeOp,\n String,\n UnitFilter,\n Unwrap,\n UnwrapExpr,\n VectorAggregationExpr,\n VectorOp,\n Without,\n BinOpModifier,\n OnOrIgnoringModifier,\n OrFilter,\n} from '@grafana/lezer-logql';\nimport { QueryBuilderLabelFilter, QueryBuilderOperation, QueryBuilderOperationParamValue } from '@grafana/plugin-ui';\n\nimport { binaryScalarDefs } from './binaryScalarOperations';\nimport { checkParamsAreValid, getDefinitionById } from './operations';\nimport {\n ErrorId,\n getAllByType,\n getLeftMostChild,\n getString,\n makeBinOp,\n makeError,\n replaceVariables,\n} from './parsingUtils';\nimport { LokiOperationId, LokiVisualQuery, LokiVisualQueryBinary } from './types';\n\ninterface Context {\n query: LokiVisualQuery;\n errors: ParsingError[];\n}\n\ninterface ParsingError {\n text: string;\n from?: number;\n to?: number;\n parentType?: string;\n}\n\ninterface GetOperationResult {\n operation?: QueryBuilderOperation;\n error?: string;\n}\n\nexport function buildVisualQueryFromString(expr: string): Context {\n const replacedExpr = replaceVariables(expr);\n const tree = parser.parse(replacedExpr);\n const node = tree.topNode;\n\n // This will be modified in the handleExpression\n const visQuery: LokiVisualQuery = {\n labels: [],\n operations: [],\n };\n\n const context: Context = {\n query: visQuery,\n errors: [],\n };\n\n try {\n handleExpression(replacedExpr, node, context);\n } catch (err) {\n // Not ideal to log it here, but otherwise we would lose the stack trace.\n console.error(err);\n if (err instanceof Error) {\n context.errors.push({\n text: err.message,\n });\n }\n }\n\n // If we have empty query, we want to reset errors\n if (isEmptyQuery(context.query)) {\n context.errors = [];\n }\n return context;\n}\n\nexport function handleExpression(expr: string, node: SyntaxNode, context: Context) {\n const visQuery = context.query;\n switch (node.type.id) {\n case Matcher: {\n visQuery.labels.push(getLabel(expr, node));\n const err = node.getChild(ErrorId);\n if (err) {\n context.errors.push(makeError(expr, err));\n }\n break;\n }\n\n case LineFilter: {\n const { operation, error } = getLineFilter(expr, node);\n if (operation) {\n visQuery.operations.push(operation);\n }\n // Show error for query patterns not supported in visual query builder\n if (error) {\n context.errors.push(createNotSupportedError(expr, node, error));\n }\n break;\n }\n\n case LabelParser: {\n visQuery.operations.push(getLabelParser(expr, node));\n break;\n }\n\n case LabelFilter: {\n const { operation, error } = getLabelFilter(expr, node);\n if (operation) {\n visQuery.operations.push(operation);\n }\n // Show error for query patterns not supported in visual query builder\n if (error) {\n context.errors.push(createNotSupportedError(expr, node, error));\n }\n break;\n }\n case JsonExpressionParser: {\n visQuery.operations.push(getJsonExpressionParser(expr, node));\n break;\n }\n\n case LogfmtParser:\n case LogfmtExpressionParser: {\n const { operation, error } = getLogfmtParser(expr, node);\n if (operation) {\n visQuery.operations.push(operation);\n }\n if (error) {\n context.errors.push(createNotSupportedError(expr, node, error));\n }\n break;\n }\n\n case LineFormatExpr: {\n visQuery.operations.push(getLineFormat(expr, node));\n break;\n }\n\n case LabelFormatMatcher: {\n visQuery.operations.push(getLabelFormat(expr, node));\n break;\n }\n\n case UnwrapExpr: {\n const { operation, error } = handleUnwrapExpr(expr, node, context);\n if (operation) {\n visQuery.operations.push(operation);\n }\n // Show error for query patterns not supported in visual query builder\n if (error) {\n context.errors.push(createNotSupportedError(expr, node, error));\n }\n\n break;\n }\n\n case Decolorize: {\n visQuery.operations.push(getDecolorize());\n break;\n }\n\n case RangeAggregationExpr: {\n visQuery.operations.push(handleRangeAggregation(expr, node, context));\n break;\n }\n\n case VectorAggregationExpr: {\n visQuery.operations.push(handleVectorAggregation(expr, node, context));\n break;\n }\n\n case BinOpExpr: {\n handleBinary(expr, node, context);\n break;\n }\n\n case ErrorId: {\n if (isIntervalVariableError(node)) {\n break;\n }\n context.errors.push(makeError(expr, node));\n break;\n }\n\n case DropLabelsExpr: {\n visQuery.operations.push(handleDropFilter(expr, node, context));\n break;\n }\n\n case KeepLabelsExpr: {\n visQuery.operations.push(handleKeepFilter(expr, node, context));\n break;\n }\n\n default: {\n // Any other nodes we just ignore and go to its children. This should be fine as there are lots of wrapper\n // nodes that can be skipped.\n // TODO: there are probably cases where we will just skip nodes we don't support and we should be able to\n // detect those and report back.\n let child = node.firstChild;\n while (child) {\n handleExpression(expr, child, context);\n child = child.nextSibling;\n }\n }\n }\n}\n\nfunction getLabel(expr: string, node: SyntaxNode): QueryBuilderLabelFilter {\n const labelNode = node.getChild(Identifier);\n const label = getString(expr, labelNode);\n const op = getString(expr, labelNode?.nextSibling);\n let value = getString(expr, node.getChild(String));\n // `value` is wrapped in double quotes, so we need to remove them. As a value can contain double quotes, we can't use RegEx here.\n value = value.substring(1, value.length - 1);\n\n return {\n label,\n op,\n value,\n };\n}\n\nfunction getLineFilter(expr: string, node: SyntaxNode): GetOperationResult {\n const filter = getString(expr, node.getChild(Filter));\n const filterExpr = handleQuotes(getString(expr, node.getChild(String)));\n const ipLineFilter = node.getChild(FilterOp)?.getChild(Ip);\n if (ipLineFilter) {\n return {\n operation: {\n id: LokiOperationId.LineFilterIpMatches,\n params: [filter, filterExpr],\n },\n };\n }\n\n const params = [filterExpr];\n let orFilter = node.getChild(OrFilter);\n while (orFilter) {\n params.push(handleQuotes(getString(expr, orFilter.getChild(String))));\n orFilter = orFilter.getChild(OrFilter);\n }\n\n const mapFilter: Record<string, LokiOperationId> = {\n '|=': LokiOperationId.LineContains,\n '!=': LokiOperationId.LineContainsNot,\n '|~': LokiOperationId.LineMatchesRegex,\n '!~': LokiOperationId.LineMatchesRegexNot,\n };\n\n return {\n operation: {\n id: mapFilter[filter],\n params,\n },\n };\n}\n\nfunction getLabelParser(expr: string, node: SyntaxNode): QueryBuilderOperation {\n const parserNode = node.firstChild;\n const parser = getString(expr, parserNode);\n\n const string = handleQuotes(getString(expr, node.getChild(String)));\n let params: QueryBuilderOperationParamValue[] = !!string ? [string] : [];\n const opDef = getDefinitionById(parser);\n if (opDef && !checkParamsAreValid(opDef, params)) {\n params = opDef?.defaultParams || [];\n }\n\n return {\n id: parser,\n params,\n };\n}\n\nfunction getJsonExpressionParser(expr: string, node: SyntaxNode): QueryBuilderOperation {\n const parserNode = node.getChild(Json);\n const parser = getString(expr, parserNode);\n\n const params = [...getAllByType(expr, node, LabelExtractionExpression)];\n return {\n id: parser,\n params,\n };\n}\n\nfunction getLogfmtParser(expr: string, node: SyntaxNode): GetOperationResult {\n const flags: string[] = [];\n const labels: string[] = [];\n let error: string | undefined = undefined;\n\n const offset = node.from;\n node.toTree().iterate({\n enter: (subNode) => {\n if (subNode.type.id === ParserFlag) {\n flags.push(expr.substring(subNode.from + offset, subNode.to + offset));\n } else if (subNode.type.id === LabelExtractionExpression) {\n labels.push(expr.substring(subNode.from + offset, subNode.to + offset));\n } else if (subNode.type.id === ErrorId) {\n error = `Unexpected string \"${expr.substring(subNode.from + offset, subNode.to + offset)}\"`;\n }\n },\n });\n\n const operation = {\n id: LokiOperationId.Logfmt,\n params: [flags.includes('--strict'), flags.includes('--keep-empty'), ...labels],\n };\n\n return {\n operation,\n error,\n };\n}\n\nfunction getLabelFilter(expr: string, node: SyntaxNode): GetOperationResult {\n // Check for nodes not supported in visual builder and return error\n if (node.getChild(Or) || node.getChild(And) || node.getChild('Comma')) {\n return {\n error: 'Label filter with comma, \"and\", \"or\" not supported in query builder',\n };\n }\n if (node.firstChild!.type.id === IpLabelFilter) {\n const ipLabelFilter = node.firstChild;\n const label = ipLabelFilter?.getChild(Identifier);\n const op = label?.nextSibling;\n const value = ipLabelFilter?.getChild(String);\n const valueString = handleQuotes(getString(expr, value));\n\n return {\n operation: {\n id: LokiOperationId.LabelFilterIpMatches,\n params: [getString(expr, label), getString(expr, op), valueString],\n },\n };\n }\n\n const id = LokiOperationId.LabelFilter;\n if (node.firstChild!.type.id === UnitFilter) {\n const filter = node.firstChild!.firstChild;\n const label = filter!.firstChild;\n const op = label!.nextSibling;\n const value = op!.nextSibling;\n const valueString = handleQuotes(getString(expr, value));\n\n return {\n operation: {\n id,\n params: [getString(expr, label), getString(expr, op), valueString],\n },\n };\n }\n // In this case it is Matcher or NumberFilter\n const filter = node.firstChild;\n const label = filter!.firstChild;\n const op = label!.nextSibling;\n const value = op!.nextSibling;\n const params = [getString(expr, label), getString(expr, op), handleQuotes(getString(expr, value))];\n\n // Special case of pipe filtering - no errors\n if (params.join('') === `__error__=`) {\n return {\n operation: {\n id: LokiOperationId.LabelFilterNoErrors,\n params: [],\n },\n };\n }\n\n return {\n operation: {\n id,\n params,\n },\n };\n}\n\nfunction getLineFormat(expr: string, node: SyntaxNode): QueryBuilderOperation {\n const id = LokiOperationId.LineFormat;\n const string = handleQuotes(getString(expr, node.getChild(String)));\n\n return {\n id,\n params: [string],\n };\n}\n\nfunction getLabelFormat(expr: string, node: SyntaxNode): QueryBuilderOperation {\n const id = LokiOperationId.LabelFormat;\n const renameTo = node.getChild(Identifier);\n const op = renameTo!.nextSibling;\n const originalLabel = op!.nextSibling;\n\n return {\n id,\n params: [getString(expr, originalLabel), handleQuotes(getString(expr, renameTo))],\n };\n}\n\nfunction getDecolorize(): QueryBuilderOperation {\n const id = LokiOperationId.Decolorize;\n\n return {\n id,\n params: [],\n };\n}\n\nfunction handleUnwrapExpr(expr: string, node: SyntaxNode, context: Context): GetOperationResult {\n const unwrapExprChild = node.getChild(UnwrapExpr);\n const labelFilterChild = node.getChild(LabelFilter);\n const unwrapChild = node.getChild(Unwrap);\n\n if (unwrapExprChild) {\n handleExpression(expr, unwrapExprChild, context);\n }\n\n if (labelFilterChild) {\n handleExpression(expr, labelFilterChild, context);\n }\n\n if (unwrapChild) {\n if (unwrapChild.nextSibling?.type.id === ConvOp) {\n const convOp = unwrapChild.nextSibling;\n const identifier = convOp.nextSibling;\n return {\n operation: {\n id: LokiOperationId.Unwrap,\n params: [getString(expr, identifier), getString(expr, convOp)],\n },\n };\n }\n\n return {\n operation: {\n id: LokiOperationId.Unwrap,\n params: [getString(expr, unwrapChild?.nextSibling), ''],\n },\n };\n }\n\n return {};\n}\n\nfunction handleRangeAggregation(expr: string, node: SyntaxNode, context: Context) {\n const nameNode = node.getChild(RangeOp);\n const funcName = getString(expr, nameNode);\n const number = node.getChild(NumberLezer);\n const logExpr = node.getChild(LogRangeExpr);\n const params = number !== null && number !== undefined ? [getString(expr, number)] : [];\n const range = logExpr?.getChild(Range);\n const rangeValue = range ? getString(expr, range) : null;\n const grouping = node.getChild(Grouping);\n\n if (rangeValue) {\n params.unshift(rangeValue.substring(1, rangeValue.length - 1));\n }\n\n if (grouping) {\n params.push(...getAllByType(expr, grouping, Identifier));\n }\n\n const op = {\n id: funcName,\n params,\n };\n\n if (logExpr) {\n handleExpression(expr, logExpr, context);\n }\n\n return op;\n}\n\nfunction handleVectorAggregation(expr: string, node: SyntaxNode, context: Context) {\n const nameNode = node.getChild(VectorOp);\n let funcName = getString(expr, nameNode);\n\n const grouping = node.getChild(Grouping);\n const params = [];\n\n const numberNode = node.getChild(NumberLezer);\n const errorNode = node.getChild(ErrorId)?.getChild(Identifier);\n\n if (numberNode) {\n params.push(Number(getString(expr, numberNode)));\n } else if (errorNode) {\n // Variables get parsed as errors, so the value us an identifier within an error node.\n params.push(getString(expr, errorNode));\n }\n\n if (grouping) {\n const byModifier = grouping.getChild(By);\n if (byModifier && funcName) {\n funcName = `__${funcName}_by`;\n }\n\n const withoutModifier = grouping.getChild(Without);\n if (withoutModifier) {\n funcName = `__${funcName}_without`;\n }\n\n params.push(...getAllByType(expr, grouping, Identifier));\n }\n\n const metricExpr = node.getChild(MetricExpr);\n const op: QueryBuilderOperation = { id: funcName, params };\n\n if (metricExpr) {\n // A vector aggregation expression with a child of metric expression with a child of binary expression is ambiguous after being parsed into a visual query\n if (metricExpr.firstChild?.type.id === BinOpExpr) {\n context.errors.push({\n text: 'Query parsing is ambiguous.',\n from: metricExpr.firstChild.from,\n to: metricExpr.firstChild?.to,\n });\n }\n\n handleExpression(expr, metricExpr, context);\n }\n\n return op;\n}\n\nconst operatorToOpName = binaryScalarDefs.reduce<Record<string, { id: string; comparison?: boolean }>>((acc, def) => {\n acc[def.sign] = {\n id: def.id,\n comparison: def.comparison,\n };\n return acc;\n}, {});\n\n/**\n * Right now binary expressions can be represented in 2 way in visual query. As additional operation in case it is\n * just operation with scalar or it creates a binaryQuery when it's 2 queries.\n * @param expr\n * @param node\n * @param context\n */\nfunction handleBinary(expr: string, node: SyntaxNode, context: Context) {\n const visQuery = context.query;\n const left = node.firstChild!;\n const op = getString(expr, left.nextSibling);\n const binModifier = getBinaryModifier(expr, node.getChild(BinOpModifier));\n\n const right = node.lastChild!;\n\n const opDef = operatorToOpName[op];\n\n const leftNumber = getLastChildWithSelector(left, 'MetricExpr.LiteralExpr.Number');\n const rightNumber = getLastChildWithSelector(right, 'MetricExpr.LiteralExpr.Number');\n\n const rightBinary = right.getChild(BinOpExpr);\n\n if (leftNumber) {\n // TODO: this should be already handled in case parent is binary expression as it has to be added to parent\n // if query starts with a number that isn't handled now.\n } else {\n // If this is binary we don't really know if there is a query or just chained scalars. So\n // we have to traverse a bit deeper to know\n handleExpression(expr, left, context);\n }\n\n if (rightNumber) {\n visQuery.operations.push(makeBinOp(opDef, expr, right, !!binModifier?.isBool));\n } else if (rightBinary) {\n // Due to the way binary ops are parsed we can get a binary operation on the right that starts with a number which\n // is a factor for a current binary operation. So we have to add it as an operation now.\n const leftMostChild = getLeftMostChild(right);\n if (leftMostChild?.type.id === NumberLezer) {\n visQuery.operations.push(makeBinOp(opDef, expr, leftMostChild, !!binModifier?.isBool));\n }\n\n // If we added the first number literal as operation here we still can continue and handle the rest as the first\n // number will be just skipped.\n handleExpression(expr, right, context);\n } else {\n visQuery.binaryQueries = visQuery.binaryQueries || [];\n const binQuery: LokiVisualQueryBinary = {\n operator: op,\n query: {\n labels: [],\n operations: [],\n },\n };\n if (binModifier?.isMatcher) {\n binQuery.vectorMatchesType = binModifier.matchType;\n binQuery.vectorMatches = binModifier.matches;\n }\n visQuery.binaryQueries.push(binQuery);\n handleExpression(expr, right, {\n query: binQuery.query,\n errors: context.errors,\n });\n }\n}\n\nfunction getBinaryModifier(\n expr: string,\n node: SyntaxNode | null\n):\n | { isBool: true; isMatcher: false }\n | { isBool: boolean; isMatcher: true; matches: string; matchType: 'ignoring' | 'on' }\n | undefined {\n if (!node) {\n return undefined;\n }\n const matcher = node.getChild(OnOrIgnoringModifier);\n const boolMatcher = node.getChild(Bool);\n\n if (!matcher && boolMatcher) {\n return { isBool: true, isMatcher: false };\n } else {\n if (!matcher) {\n // Not sure what this could be, maybe should be an error.\n return undefined;\n }\n const labels = getString(expr, matcher.getChild(GroupingLabels)?.getChild(GroupingLabelList));\n return {\n isMatcher: true,\n isBool: !!boolMatcher,\n matches: labels,\n matchType: matcher.getChild(On) ? 'on' : 'ignoring',\n };\n }\n}\n\nfunction isIntervalVariableError(node: SyntaxNode) {\n return node?.parent?.type.id === Range;\n}\n\nexport function handleQuotes(string: string) {\n if (string[0] === `\"` && string[string.length - 1] === `\"`) {\n return string\n .substring(1, string.length - 1)\n .replace(/\\\\\"/g, '\"')\n .replace(/\\\\\\\\/g, '\\\\');\n }\n return string.replace(/`/g, '');\n}\n\n/**\n * Simple helper to traverse the syntax tree. Instead of node.getChild('foo')?.getChild('bar')?.getChild('baz') you\n * can write getChildWithSelector(node, 'foo.bar.baz')\n * @param node\n * @param selector\n */\nfunction getLastChildWithSelector(node: SyntaxNode, selector: string) {\n let child: SyntaxNode | null = node;\n const children = selector.split('.');\n for (const s of children) {\n child = child.getChild(s);\n if (!child) {\n return null;\n }\n }\n return child;\n}\n\n/**\n * Helper function to enrich error text with information that visual query builder doesn't support that logQL\n * @param expr\n * @param node\n * @param error\n */\nfunction createNotSupportedError(expr: string, node: SyntaxNode, error: string) {\n const err = makeError(expr, node);\n err.text = `${error}: ${err.text}`;\n return err;\n}\n\nfunction isEmptyQuery(query: LokiVisualQuery) {\n if (query.labels.length === 0 && query.operations.length === 0) {\n return true;\n }\n return false;\n}\n\nfunction handleDropFilter(expr: string, node: SyntaxNode, context: Context): QueryBuilderOperation {\n const labels: string[] = [];\n let exploringNode = node.getChild(DropLabels);\n while (exploringNode) {\n const label = getString(expr, exploringNode.getChild(DropLabel));\n if (label) {\n labels.push(label);\n }\n exploringNode = exploringNode?.getChild(DropLabels);\n }\n labels.reverse();\n return {\n id: LokiOperationId.Drop,\n params: labels,\n };\n}\n\nfunction handleKeepFilter(expr: string, node: SyntaxNode, context: Context): QueryBuilderOperation {\n const labels: string[] = [];\n let exploringNode = node.getChild(KeepLabels);\n while (exploringNode) {\n const label = getString(expr, exploringNode.getChild(KeepLabel));\n if (label) {\n labels.push(label);\n }\n exploringNode = exploringNode?.getChild(KeepLabels);\n }\n labels.reverse();\n return {\n id: LokiOperationId.Keep,\n params: labels,\n };\n}\n","import { css } from '@emotion/css';\nimport { Resizable, ResizeCallback } from 're-resizable';\nimport { useCallback, useEffect, useMemo, useState } from 'react';\n\nimport {\n DataFrame,\n ExploreLogsPanelState,\n GrafanaTheme2,\n Labels,\n LogsSortOrder,\n SelectableValue,\n SplitOpen,\n store,\n TimeRange,\n} from '@grafana/data';\nimport { t } from '@grafana/i18n';\nimport { reportInteraction } from '@grafana/runtime';\nimport { getDragStyles, InlineField, Select, useStyles2 } from '@grafana/ui';\nimport {\n getSidebarWidth,\n LogsTableFieldSelector,\n MIN_WIDTH,\n} from 'app/features/logs/components/fieldSelector/FieldSelector';\nimport { reportInteractionOnce } from 'app/features/logs/components/panel/analytics';\n\nimport { parseLogsFrame } from '../../logs/logsFrame';\n\nimport { LogsTable } from './LogsTable';\nimport { SETTING_KEY_ROOT } from './utils/logs';\n\ninterface Props {\n logsFrames: DataFrame[];\n width: number;\n timeZone: string;\n splitOpen: SplitOpen;\n range: TimeRange;\n logsSortOrder: LogsSortOrder;\n panelState: ExploreLogsPanelState | undefined;\n updatePanelState: (panelState: Partial<ExploreLogsPanelState>) => void;\n onClickFilterLabel?: (key: string, value: string, frame?: DataFrame) => void;\n onClickFilterOutLabel?: (key: string, value: string, frame?: DataFrame) => void;\n datasourceType?: string;\n}\n\ntype ActiveFieldMeta = {\n active: false;\n index: undefined; // if undefined the column is not selected\n};\n\ntype InactiveFieldMeta = {\n active: true;\n index: number; // if undefined the column is not selected\n};\n\ntype GenericMeta = {\n percentOfLinesWithLabel: number;\n type?: 'BODY_FIELD' | 'TIME_FIELD';\n};\n\nexport type FieldNameMeta = (InactiveFieldMeta | ActiveFieldMeta) & GenericMeta;\n\ntype FieldName = string;\nexport type FieldNameMetaStore = Record<FieldName, FieldNameMeta>;\n\nexport function LogsTableWrap(props: Props) {\n const { logsFrames, updatePanelState, panelState } = props;\n const propsColumns = panelState?.columns;\n // Save the normalized cardinality of each label\n const [columnsWithMeta, setColumnsWithMeta] = useState<FieldNameMetaStore | undefined>(undefined);\n const dragStyles = useStyles2(getDragStyles);\n\n // Filtered copy of columnsWithMeta that only includes matching results\n const [filteredColumnsWithMeta, setFilteredColumnsWithMeta] = useState<FieldNameMetaStore | undefined>(undefined);\n\n const height = getLogsTableHeight();\n const panelStateRefId = props?.panelState?.refId;\n\n // The current dataFrame containing the refId of the current query\n const [currentDataFrame, setCurrentDataFrame] = useState<DataFrame>(\n logsFrames.find((f) => f.refId === panelStateRefId) ?? logsFrames[0]\n );\n\n const getColumnsFromProps = useCallback(\n (fieldNames: FieldNameMetaStore) => {\n const previouslySelected = props.panelState?.columns;\n if (previouslySelected) {\n Object.values(previouslySelected).forEach((key, index) => {\n if (fieldNames[key]) {\n fieldNames[key].active = true;\n fieldNames[key].index = index;\n }\n });\n }\n return fieldNames;\n },\n [props.panelState?.columns]\n );\n\n const logsFrame = useMemo(() => parseLogsFrame(currentDataFrame), [currentDataFrame]);\n\n useEffect(() => {\n if (logsFrame?.timeField.name && logsFrame?.bodyField.name && !propsColumns) {\n const defaultColumns = { 0: logsFrame?.timeField.name ?? '', 1: logsFrame?.bodyField.name ?? '' };\n updatePanelState({\n columns: Object.values(defaultColumns),\n visualisationType: 'table',\n labelFieldName: logsFrame?.getLabelFieldName() ?? undefined,\n });\n }\n }, [logsFrame, propsColumns, updatePanelState]);\n\n /**\n * When logs frame updates (e.g. query|range changes), we need to set the selected frame to state\n */\n useEffect(() => {\n const newFrame = logsFrames.find((f) => f.refId === panelStateRefId) ?? logsFrames[0];\n if (newFrame) {\n setCurrentDataFrame(newFrame);\n }\n }, [logsFrames, panelStateRefId]);\n\n /**\n * Keeps the filteredColumnsWithMeta state in sync with the columnsWithMeta state,\n * which can be updated by explore browser history state changes\n * This prevents an edge case bug where the user is navigating while a search is open.\n */\n useEffect(() => {\n if (!columnsWithMeta || !filteredColumnsWithMeta) {\n return;\n }\n let newFiltered = { ...filteredColumnsWithMeta };\n let flag = false;\n Object.keys(columnsWithMeta).forEach((key) => {\n if (newFiltered[key] && newFiltered[key].active !== columnsWithMeta[key].active) {\n newFiltered[key] = columnsWithMeta[key];\n flag = true;\n }\n });\n if (flag) {\n setFilteredColumnsWithMeta(newFiltered);\n }\n }, [columnsWithMeta, filteredColumnsWithMeta]);\n\n /**\n * when the query results change, we need to update the columnsWithMeta state\n * and reset any local search state\n *\n * This will also find all the unique labels, and calculate how many log lines have each label into the labelCardinality Map\n * Then it normalizes the counts\n *\n */\n useEffect(() => {\n // If the data frame is empty, there's nothing to viz, it could mean the user has unselected all columns\n if (!currentDataFrame.length) {\n return;\n }\n const numberOfLogLines = currentDataFrame ? currentDataFrame.length : 0;\n const logsFrame = parseLogsFrame(currentDataFrame);\n const labels = logsFrame?.getLogFrameLabelsAsLabels();\n\n const otherFields = [];\n\n if (logsFrame) {\n otherFields.push(...logsFrame.extraFields.filter((field) => !field?.config?.custom?.hidden));\n }\n if (logsFrame?.severityField) {\n otherFields.push(logsFrame?.severityField);\n }\n if (logsFrame?.bodyField) {\n otherFields.push(logsFrame?.bodyField);\n }\n if (logsFrame?.timeField) {\n otherFields.push(logsFrame?.timeField);\n }\n\n // Use a map to dedupe labels and count their occurrences in the logs\n const labelCardinality = new Map<FieldName, FieldNameMeta>();\n\n // What the label state will look like\n let pendingLabelState: FieldNameMetaStore = {};\n\n // If we have labels and log lines\n if (labels?.length && numberOfLogLines) {\n // Iterate through all of Labels\n labels.forEach((labels: Labels) => {\n const labelsArray = Object.keys(labels);\n // Iterate through the label values\n labelsArray.forEach((label) => {\n // If it's already in our map, increment the count\n if (labelCardinality.has(label)) {\n const value = labelCardinality.get(label);\n if (value) {\n if (value?.active) {\n labelCardinality.set(label, {\n percentOfLinesWithLabel: value.percentOfLinesWithLabel + 1,\n active: true,\n index: value.index,\n });\n } else {\n labelCardinality.set(label, {\n percentOfLinesWithLabel: value.percentOfLinesWithLabel + 1,\n active: false,\n index: undefined,\n });\n }\n }\n // Otherwise add it\n } else {\n labelCardinality.set(label, { percentOfLinesWithLabel: 1, active: false, index: undefined });\n }\n });\n });\n\n // Converting the map to an object\n pendingLabelState = Object.fromEntries(labelCardinality);\n\n // Convert count to percent of log lines\n Object.keys(pendingLabelState).forEach((key) => {\n pendingLabelState[key].percentOfLinesWithLabel = normalize(\n pendingLabelState[key].percentOfLinesWithLabel,\n numberOfLogLines\n );\n });\n }\n\n // Normalize the other fields\n otherFields.forEach((field) => {\n const isActive = pendingLabelState[field.name]?.active;\n const index = pendingLabelState[field.name]?.index;\n if (isActive && index !== undefined) {\n pendingLabelState[field.name] = {\n percentOfLinesWithLabel: normalize(\n field.values.filter((value) => value !== null && value !== undefined).length,\n numberOfLogLines\n ),\n active: true,\n index: index,\n };\n } else {\n pendingLabelState[field.name] = {\n percentOfLinesWithLabel: normalize(\n field.values.filter((value) => value !== null && value !== undefined).length,\n numberOfLogLines\n ),\n active: false,\n index: undefined,\n };\n }\n });\n\n pendingLabelState = getColumnsFromProps(pendingLabelState);\n\n // Get all active columns\n const active = Object.keys(pendingLabelState).filter((key) => pendingLabelState[key].active);\n\n // If nothing is selected, then select the default columns\n if (active.length === 0) {\n if (logsFrame?.bodyField?.name) {\n pendingLabelState[logsFrame.bodyField.name].active = true;\n }\n if (logsFrame?.timeField?.name) {\n pendingLabelState[logsFrame.timeField.name].active = true;\n }\n }\n\n if (logsFrame?.bodyField?.name && logsFrame?.timeField?.name) {\n pendingLabelState[logsFrame.bodyField.name].type = 'BODY_FIELD';\n pendingLabelState[logsFrame.timeField.name].type = 'TIME_FIELD';\n }\n\n setColumnsWithMeta(pendingLabelState);\n\n // The panel state is updated when the user interacts with the multi-select sidebar\n }, [currentDataFrame, getColumnsFromProps]);\n\n const [sidebarWidth, setSidebarWidth] = useState(getSidebarWidth(SETTING_KEY_ROOT));\n const tableWidth = props.width - sidebarWidth;\n\n const styles = useStyles2(getStyles, height, sidebarWidth);\n\n if (!columnsWithMeta) {\n return null;\n }\n\n function columnFilterEvent(columnName: string) {\n if (columnsWithMeta) {\n const newState = !columnsWithMeta[columnName]?.active;\n const priorActiveCount = Object.keys(columnsWithMeta).filter((column) => columnsWithMeta[column]?.active)?.length;\n const event = {\n columnAction: newState ? 'add' : 'remove',\n columnCount: newState ? priorActiveCount + 1 : priorActiveCount - 1,\n datasourceType: props.datasourceType,\n };\n reportInteraction('grafana_explore_logs_table_column_filter_clicked', event);\n }\n }\n\n const clearSelection = () => {\n const pendingLabelState = { ...columnsWithMeta };\n Object.keys(pendingLabelState).forEach((key) => {\n const isDefaultField = !!pendingLabelState[key].type;\n // after reset the only active fields are the special time and body fields\n pendingLabelState[key].active = isDefaultField ? true : false;\n // reset the index\n if (pendingLabelState[key].type === 'TIME_FIELD') {\n pendingLabelState[key].index = 0;\n } else {\n pendingLabelState[key].index = pendingLabelState[key].type === 'BODY_FIELD' ? 1 : undefined;\n }\n });\n setColumnsWithMeta(pendingLabelState);\n };\n\n const reorderColumn = (newColumns: string[]) => {\n const pendingLabelState = { ...columnsWithMeta };\n\n newColumns.forEach((key, index) => {\n pendingLabelState[key].index = index;\n });\n\n // Set local state\n setColumnsWithMeta(pendingLabelState);\n\n // Sync the explore state\n updateExploreState(pendingLabelState);\n };\n\n function updateExploreState(pendingLabelState: FieldNameMetaStore) {\n // Get all active columns and sort by index\n const newColumnsArray = Object.keys(pendingLabelState)\n // Only include active filters\n .filter((key) => pendingLabelState[key]?.active)\n .sort((a, b) => {\n const pa = pendingLabelState[a];\n const pb = pendingLabelState[b];\n if (pa.index !== undefined && pb.index !== undefined) {\n return pa.index - pb.index; // sort by index\n }\n return 0;\n });\n\n const newColumns: Record<number, string> = Object.assign(\n {},\n // Get the keys of the object as an array\n newColumnsArray\n );\n\n const defaultColumns = { 0: logsFrame?.timeField.name ?? '', 1: logsFrame?.bodyField.name ?? '' };\n const newPanelState: ExploreLogsPanelState = {\n ...props.panelState,\n // URL format requires our array of values be an object, so we convert it using object.assign\n columns: Object.keys(newColumns).length ? newColumns : defaultColumns,\n refId: currentDataFrame.refId,\n visualisationType: 'table',\n labelFieldName: logsFrame?.getLabelFieldName() ?? undefined,\n };\n\n // Update url state\n updatePanelState(newPanelState);\n }\n\n // Toggle a column on or off when the user interacts with an element in the multi-select sidebar\n const toggleColumn = (columnName: FieldName) => {\n if (!columnsWithMeta || !(columnName in columnsWithMeta)) {\n console.warn('failed to get column', columnsWithMeta);\n return;\n }\n\n const length = Object.keys(columnsWithMeta).filter((c) => columnsWithMeta[c].active).length;\n const isActive = !columnsWithMeta[columnName].active ? true : undefined;\n\n let pendingLabelState: FieldNameMetaStore;\n if (isActive) {\n pendingLabelState = {\n ...columnsWithMeta,\n [columnName]: {\n ...columnsWithMeta[columnName],\n active: isActive,\n index: length,\n },\n };\n } else {\n pendingLabelState = {\n ...columnsWithMeta,\n [columnName]: {\n ...columnsWithMeta[columnName],\n active: false,\n index: undefined,\n },\n };\n }\n\n // Analytics\n columnFilterEvent(columnName);\n\n // Set local state\n setColumnsWithMeta(pendingLabelState);\n\n // If user is currently filtering, update filtered state\n if (filteredColumnsWithMeta) {\n const active = !filteredColumnsWithMeta[columnName]?.active;\n let pendingFilteredLabelState: FieldNameMetaStore;\n if (active) {\n pendingFilteredLabelState = {\n ...filteredColumnsWithMeta,\n [columnName]: {\n ...filteredColumnsWithMeta[columnName],\n active: active,\n index: length,\n },\n };\n } else {\n pendingFilteredLabelState = {\n ...filteredColumnsWithMeta,\n [columnName]: {\n ...filteredColumnsWithMeta[columnName],\n active: false,\n index: undefined,\n },\n };\n }\n\n setFilteredColumnsWithMeta(pendingFilteredLabelState);\n }\n\n updateExploreState(pendingLabelState);\n };\n\n const onFrameSelectorChange = (value: SelectableValue<string>) => {\n const matchingDataFrame = logsFrames.find((frame) => frame.refId === value.value);\n if (matchingDataFrame) {\n setCurrentDataFrame(logsFrames.find((frame) => frame.refId === value.value) ?? logsFrames[0]);\n }\n props.updatePanelState({ refId: value.value, labelFieldName: logsFrame?.getLabelFieldName() ?? undefined });\n };\n\n const getOnResize: ResizeCallback = (event, direction, ref) => {\n const newSidebarWidth = Number(ref.style.width.slice(0, -2));\n if (!isNaN(newSidebarWidth)) {\n setSidebarWidth(newSidebarWidth);\n store.set(`${SETTING_KEY_ROOT}.fieldSelector.width`, newSidebarWidth);\n reportInteractionOnce('logs_field_selector_resized', {\n mode: 'table',\n });\n }\n };\n\n return (\n <>\n <div>\n {logsFrames.length > 1 && (\n <div>\n <InlineField\n label={t('explore.logs-table-wrap.label-select-query', 'Select query')}\n htmlFor=\"explore_logs_table_frame_selector\"\n labelWidth={22}\n tooltip={t(\n 'explore.logs-table-wrap.tooltip-select-query-visualize-table',\n 'Select a query to visualize in the table'\n )}\n >\n <Select\n inputId={'explore_logs_table_frame_selector'}\n aria-label={t('explore.logs-table-wrap.aria-label-select-query-by-name', 'Select query by name')}\n value={currentDataFrame.refId}\n options={logsFrames.map((frame) => {\n return {\n label: frame.refId,\n value: frame.refId,\n };\n })}\n onChange={onFrameSelectorChange}\n />\n </InlineField>\n </div>\n )}\n </div>\n <div className={styles.wrapper}>\n <Resizable\n enable={{\n right: true,\n }}\n handleClasses={{ right: dragStyles.dragHandleVertical }}\n size={{ width: sidebarWidth, height: getLogsTableHeight() }}\n defaultSize={{ width: sidebarWidth, height: getLogsTableHeight() }}\n minWidth={MIN_WIDTH}\n maxWidth={props.width * 0.8}\n onResize={getOnResize}\n >\n <LogsTableFieldSelector\n clear={clearSelection}\n columnsWithMeta={columnsWithMeta}\n dataFrames={[currentDataFrame]}\n logs={[]}\n reorder={reorderColumn}\n setSidebarWidth={setSidebarWidth}\n sidebarWidth={sidebarWidth}\n toggle={toggleColumn}\n />\n </Resizable>\n <div className={styles.tableContainer}>\n <div className={styles.tableWrapper}>\n <LogsTable\n logsFrame={logsFrame}\n onClickFilterLabel={props.onClickFilterLabel}\n onClickFilterOutLabel={props.onClickFilterOutLabel}\n logsSortOrder={props.logsSortOrder}\n range={props.range}\n splitOpen={props.splitOpen}\n timeZone={props.timeZone}\n width={tableWidth}\n dataFrame={currentDataFrame}\n columnsWithMeta={columnsWithMeta}\n height={height}\n />\n </div>\n </div>\n </div>\n </>\n );\n}\n\nconst normalize = (value: number, total: number): number => {\n return Math.ceil((100 * value) / total);\n};\n\nfunction getStyles(theme: GrafanaTheme2, height: number, width: number) {\n return {\n wrapper: css({\n display: 'flex',\n }),\n sidebar: css({\n height: height,\n fontSize: theme.typography.pxToRem(11),\n overflowY: 'hidden',\n width: width,\n paddingRight: theme.spacing(3),\n }),\n tableContainer: css({\n position: 'relative',\n overflow: 'hidden',\n flex: 1,\n }),\n tableWrapper: css({\n position: 'absolute',\n left: 0,\n top: 0,\n }),\n };\n}\n\nexport const getLogsTableHeight = () => {\n // Instead of making the height of the table based on the content (like in the table panel itself), let's try to use the vertical space that is available.\n // Since this table is in explore, we can expect the user to be running multiple queries that return disparate numbers of rows and labels in the same session\n // Also changing the height of the table between queries can be and cause content to jump, so we'll set a minimum height of 500px, and a max based on the innerHeight\n // Ideally the table container should always be able to fit in the users viewport without needing to scroll\n return Math.max(window.innerHeight - 500, 500);\n};\n","import { LRParser } from '@lezer/lr';\n\n// This file was generated by lezer-generator. You probably shouldn't edit it.\nconst Json$1 = 1,\n Logfmt$1 = 2,\n Unpack$1 = 3,\n Pattern$1 = 4,\n Regexp$1 = 5,\n Unwrap$1 = 6,\n LabelFormat$1 = 7,\n LineFormat$1 = 8,\n LabelReplace$1 = 9,\n Vector$1 = 10,\n Offset$1 = 11,\n Bool$1 = 12,\n On$1 = 13,\n Ignoring$1 = 14,\n GroupLeft$1 = 15,\n GroupRight$1 = 16,\n Decolorize$1 = 17,\n Drop$1 = 18,\n Keep$1 = 19,\n By$1 = 20,\n Without$1 = 21,\n And$1 = 22,\n Or$1 = 23,\n Unless$1 = 24,\n Sum$1 = 25,\n Avg$1 = 26,\n Count$1 = 27,\n Max$1 = 28,\n Min$1 = 29,\n Stddev$1 = 30,\n Stdvar$1 = 31,\n Bottomk$1 = 32,\n Topk$1 = 33,\n Sort$1 = 34,\n Sort_Desc$1 = 35;\n\nconst keywordTokens = {\n json: Json$1,\n logfmt: Logfmt$1,\n unpack: Unpack$1,\n pattern: Pattern$1,\n regexp: Regexp$1,\n label_format: LabelFormat$1,\n line_format: LineFormat$1,\n label_replace: LabelReplace$1,\n vector: Vector$1,\n offset: Offset$1,\n bool: Bool$1,\n on: On$1,\n ignoring: Ignoring$1,\n group_left: GroupLeft$1,\n group_right: GroupRight$1,\n unwrap: Unwrap$1,\n decolorize: Decolorize$1,\n drop: Drop$1,\n keep: Keep$1,\n};\n\nconst specializeIdentifier = (value) => {\n return keywordTokens[value.toLowerCase()] || -1;\n};\n\nconst contextualKeywordTokens = {\n by: By$1,\n without: Without$1,\n and: And$1,\n or: Or$1,\n unless: Unless$1,\n sum: Sum$1,\n avg: Avg$1,\n count: Count$1,\n max: Max$1,\n min: Min$1,\n stddev: Stddev$1,\n stdvar: Stdvar$1,\n bottomk: Bottomk$1,\n topk: Topk$1,\n sort: Sort$1,\n sort_desc: Sort_Desc$1,\n};\n\nconst extendIdentifier = (value) => {\n return contextualKeywordTokens[value.toLowerCase()] || -1;\n};\n\n// This file was generated by lezer-generator. You probably shouldn't edit it.\nconst spec_Identifier = {__proto__:null,ip:295, count_over_time:301, rate:303, rate_counter:305, bytes_over_time:307, bytes_rate:309, avg_over_time:311, sum_over_time:313, min_over_time:315, max_over_time:317, stddev_over_time:319, stdvar_over_time:321, quantile_over_time:323, first_over_time:325, last_over_time:327, absent_over_time:329, bytes:335, duration:337, duration_seconds:339};\nconst parser = LRParser.deserialize({\n version: 14,\n states: \"EtOYQPOOO#cQPO'#DUOOQO'#ER'#ERO#hQPO'#ERO$}QPO'#DTOYQPO'#DTOOQO'#Ed'#EdO%[QPO'#EcOOQO'#FP'#FPO%aQPO'#FOQ%lQPOOO&mQPO'#F]O&rQPO'#F^OOQO'#Eb'#EbOOQO'#DS'#DSOOQO'#Ee'#EeOOQO'#Ef'#EfOOQO'#Eg'#EgOOQO'#Eh'#EhOOQO'#Ei'#EiOOQO'#Ej'#EjOOQO'#Ek'#EkOOQO'#El'#ElOOQO'#Em'#EmOOQO'#En'#EnOOQO'#Eo'#EoOOQO'#Ep'#EpOOQO'#Eq'#EqOOQO'#Er'#ErOOQO'#Es'#EsO&wQPO'#DWOOQO'#DV'#DVO'VQPO,59pOOQO,5:m,5:mOOQO'#Dc'#DcO'_QPO'#DbO'gQPO'#DaO)lQPO'#D`O*{QPO'#D`OOQO'#D_'#D_O+sQPO,59oO-}QPO,59oO.UQPO,5:|O.]QPO,5:}O.hQPO'#E|O0sQPO,5;jO0zQPO,5;jO1PQPO,5;lO1PQPO,5;lO1PQPO,5;lO1PQPO,5;lO1PQPO,5;lO1PQPO,5;lOYQPO,5;wO3cQPO,5;xO3hQPO,59rO#cQPO,59qOOQO1G/[1G/[OOQO'#Dh'#DhO3mQPO,59|O5^QPO,59|OOQO'#Di'#DiO5cQPO,59{OOQO,59{,59{O5kQPO'#DWO6YQPO'#DlO8PQPO'#DoO9sQPO'#DoOOQO'#Do'#DoOOQO'#Dv'#DvOOQO'#Dt'#DtO+kQPO'#DtO9xQPO,59zO;iQPO'#EVO;nQPO'#EWOOQO'#EZ'#EZO;sQPO'#E[O;xQPO'#E_OOQO,59z,59zOOQO,59y,59yOOQO1G/Z1G/ZOOQO1G0h1G0hO;}QPO'#EtO.`QPO'#EtO<XQPO1G0iO<^QPO1G0iO<cQPO,5;hO=oQPO1G1UO=vQPO1G1UO=}QPO1G1UO>UQPO'#FSO@dQPO'#FRO@nQPO'#FROYQPO1G1WOYQPO1G1WOYQPO1G1WOYQPO1G1WOYQPO1G1WOYQPO1G1WO@xQPO1G1cOAPQPO1G1dOOQO1G/^1G/^OOQO1G/]1G/]O5cQPO1G/hOAUQPO1G/hOAZQPO'#DjOBzQPO'#DjOOQO1G/g1G/gOCbQPO,59rOCPQPO,5:cOOQO'#Dm'#DmOClQPO,5:WOEcQPO'#DrOOQO'#Dq'#DqOGVQPO,5:_OHvQPO,5:[OOQO,5:Z,5:ZOJgQPO,5:`O+kQPO,5:`O+kQPO,5:`OOQO,5:q,5:qOJuQPO'#EYOOQO'#EX'#EXOJzQPO,5:rOLkQPO'#E^OOQO'#E^'#E^OOQO'#E]'#E]ONbQPO,5:vO!!RQPO'#EaOOQO'#Ea'#EaOOQO'#E`'#E`O!#xQPO,5:yO!%iQPO'#D`O;}QPO,5;`O!%pQPO'#EuO!%uQPO,5;`O!%}QPO,5;`O!&[QPO,5;`O!&iQPO,5;`O!&nQPO7+&TO.`QPO7+&TOOQO'#E}'#E}O!(OQPO1G1SOOQO1G1S1G1SOYQPO7+&pO!(WQPO7+&pO!)hQPO7+&pO!)oQPO7+&pO!)vQQO'#FTOOQO,5;n,5;nO!,UQPO,5;mO!,]QPO,5;mO!-nQPO7+&rO!-uQPO7+&rOOQO7+&r7+&rO!.SQPO7+&rO!.ZQPO7+&rO!/`QPO7+&rO!/pQPO7+&}OOQO7+'O7+'OOOQO7+%S7+%SO!/uQPO7+%SO5cQPO,5:UO!/zQPO,5:UO!0PQPO1G/{OOQO1G/}1G/}OOQO1G0U1G0UOOQO1G0W1G0WOOQO,5:X,5:XO!0UQPO1G/yO!1uQPO,5:^O!1zQPO,5:]OOQO1G/z1G/zO!2PQPO1G/zO!3pQPO,5:tO;nQPO,5:sO;sQPO,5:wO;xQPO,5:zO!3xQPO,5;cO!%uQPO1G0zO!4WQPO1G0zO!4`QPO,5;aO+kQPO,5;cO!4eQPO1G0zO!4oQPO'#EvO!4tQPO1G0zO!4eQPO1G0zO!4|QPO1G0zO!5ZQPO1G0zO!%xQPO1G0zOOQO1G0z1G0zOOQO<<Io<<IoO!5fQPO<<IoO!5kQPO,5;iOOQO7+&n7+&nO!5pQPO<<J[OOQO<<J[<<J[OYQPO<<J[OOQO'#FV'#FVO!5wQPO,5;oOOQO'#FU'#FUOOQO,5;o,5;oOOQO1G1X1G1XO!6PQPO1G1XO!8YQPO<<JiOOQO<<Hn<<HnOOQO1G/p1G/pO!8_QPO1G/pO!8dQPO7+%gOOQO1G/x1G/xOOQO1G/w1G/wOOQO1G0`1G0`OOQO1G0_1G0_OOQO1G0c1G0cOOQO1G0f1G0fOOQO'#Ex'#ExOOQO1G0}1G0}O!8iQPO1G0}OOQO'#Ey'#EyOOQO'#Ez'#EzOOQO'#E{'#E{OOQO7+&f7+&fOOQO1G0{1G0{O!8nQPO1G0}O!9SQPO7+&fOOQO,5;b,5;bO!9[QPO7+&fO!%xQPO7+&fO!9fQPO7+&fO!9qQPOAN?ZOOQO1G1T1G1TO!;RQPOAN?vO!<cQPOAN?vO!<jQQO1G1ZOOQO1G1Z1G1ZOOQO7+&s7+&sO!<rQPOAN@TOOQO7+%[7+%[O!<wQPO<<IRO!<|QPO7+&iO!=RQPO<<JQO!=ZQPO<<JQO!=cQPO'#EwO!=hQPO<<JQOOQOG24uG24uOOQOG25bG25bOOQO1G1[1G1[OOQO7+&u7+&uO!=pQPOG25oOOQOAN>mAN>mO!=uQPO<<JTOOQOAN?lAN?lO!=zQPOAN?lO!>SQPOLD+ZOOQOAN?oAN?oOOQO,5:r,5:rO!>XQPO!$'NuO!>^QPO!)9DaO!>cQPO!.K9{OOQO!4//g!4//gO;nQPO'#EWO!>hQPO'#D`O!?`QPO,59oO!@fQPO'#DTOYQPO1G1WOYQPO1G1WOYQPO1G1WOYQPO1G1WOYQPO1G1WOYQPO1G1WO1PQPO,5;lO1PQPO,5;lO1PQPO,5;lO1PQPO,5;lO1PQPO,5;lO1PQPO,5;lO!AqQPO7+&rO!AxQPO7+&rO!BVQPO7+&rO!C_QPO7+&rO!CfQPO7+&rO!B^QPO'#FQ\",\n stateData: \"!Cs~O$TOStOS~OXZOY[OiWOjWOkWOlWOmWOnWOoWOpWOqWOrWOsWO!vQO!wRO!xRO$UPO$YTO$[_O$]`O$^aO$_bO$`cO$adO$beO$cfO$dgO$ehO$fiO$gjO$hkO$ilO$jmO~O{nO~O!vqO~O!OrO!QrO!WrO!XrO!YrO!ZrOfwXgwXhwX!lwX!nwX!owX!pwX!qwX!wwX!xwX#{wX#|wX#}wX$OwX~O!_vO$RwX$ZwX~P#mO$Y{O~Od|Oe|O$Y}O~Of!QOg!POh!QO!O!UO!l!UO!n!UO!o!UO!p!UO!q!UO!w!RO!x!RO#{!SO#|!SO#}!SO$O!TO~O$Y!VO~O$Y!WO~O|!XO!O!XO!P!XO!Q!XO~O$V!YO$W!ZO~O}!]O$X!_O~Og!`Of!TXh!TX!O!TX!Q!TX!W!TX!X!TX!Y!TX!Z!TX!_!TX!l!TX!n!TX!o!TX!p!TX!q!TX!w!TX!x!TX#{!TX#|!TX#}!TX$O!TX$R!TX$Z!TX$k!TX$V!TX~O!OrO!QrO!WrO!XrO!YrO!ZrO~Of!SXg!SXh!SX!_!SX!l!SX!n!SX!o!SX!p!SX!q!SX!w!SX!x!SX#{!SX#|!SX#}!SX$O!SX$R!SX$Z!SX$k!SX$V!SX~P)WOP!dOQ!cOR!fOS!eOT!eOV!lOW!kOa!mOb!nOc!oO{!bO$Y!iO~O!_vOfwagwahwa!lwa!nwa!owa!pwa!qwa!wwa!xwa#{wa#|wa#}wa$Owa$Rwa$Zwa~P)WOfvXgvXhvX!OvX!lvX!nvX!ovX!pvX!qvX!wvX!xvX#{vX#|vX#}vX$OvX~O$Z!rO~P,|O$Z!sO~P,|O!v!wO$UPO$Y!uO~O$Y!xO~OXZOY[OiWOjWOkWOlWOmWOnWOoWOpWOqWOrWOsWO!wRO!xRO$UPO$YTO$[_O$]`O$^aO$_bO$`cO$adO$beO$cfO$dgO$ehO$fiO$gjO$hkO$ilO$jmO~O!v!yO~P.mO$Y!{O~O[#OO]!|O^!|OX#uPY#uPi#uPj#uPk#uPl#uPm#uPn#uPo#uPp#uPq#uPr#uPs#uP!v#uP!w#uP!x#uP$U#uP$Y#uP$[#uP$]#uP$^#uP$_#uP$`#uP$a#uP$b#uP$c#uP$d#uP$e#uP$f#uP$g#uP$h#uP$i#uP$j#uP~O!v#WO~O}#XO~Og#ZOf!Uah!Ua!O!Ua!Q!Ua!W!Ua!X!Ua!Y!Ua!Z!Ua!_!Ua!l!Ua!n!Ua!o!Ua!p!Ua!q!Ua!w!Ua!x!Ua#{!Ua#|!Ua#}!Ua$O!Ua$R!Ua$Z!Ua$k!Ua$V!Ua~O$Y#[O~O}#]O$X!_O~O|#`O!O#`O!P!XO!Q!XO!l#aO!n#aO!o#aO!p#aO!q#aO~O{#dO!b#bOf!`Xg!`Xh!`X!O!`X!Q!`X!W!`X!X!`X!Y!`X!Z!`X!_!`X!l!`X!n!`X!o!`X!p!`X!q!`X!w!`X!x!`X#{!`X#|!`X#}!`X$O!`X$R!`X$Z!`X$k!`X$V!`X~O{#dOf!cXg!cXh!cX!O!cX!Q!cX!W!cX!X!cX!Y!cX!Z!cX!_!cX!l!cX!n!cX!o!cX!p!cX!q!cX!w!cX!x!cX#{!cX#|!cX#}!cX$O!cX$R!cX$Z!cX$k!cX$V!cX~O}#hO~Of#jOg#kO$V#jOh!Sa!O!Sa!Q!Sa!W!Sa!X!Sa!Y!Sa!Z!Sa!_!Sa!l!Sa!n!Sa!o!Sa!p!Sa!q!Sa!w!Sa!x!Sa#{!Sa#|!Sa#}!Sa$O!Sa$R!Sa$Z!Sa$k!Sa~O}#lO~O{#mO~O{#pO~O{#tO~O!_#xO$k#zO~P)WO$Z$PO~O$V$QO~O{$RO$Z$TO~Of!uXg!uXh!uX!O!uX!l!uX!n!uX!o!uX!p!uX!q!uX!w!uX!x!uX#{!uX#|!uX#}!uX$O!uX$Z!uX~O$V$UO~P<kO$Z$VO~P,|O!v$WO~P.mO$Y$YO~OX#uXY#uXi#uXj#uXk#uXl#uXm#uXn#uXo#uXp#uXq#uXr#uXs#uX!v#uX!w#uX!x#uX$U#uX$Y#uX$[#uX$]#uX$^#uX$_#uX$`#uX$a#uX$b#uX$c#uX$d#uX$e#uX$f#uX$g#uX$h#uX$i#uX$j#uX~O_$[O`$[O~P>ZO]!|O^!|O~P>ZO$V$dO~P,|O$Z$eO~O}$gO~Og$hOf!^Xh!^X!O!^X!Q!^X!W!^X!X!^X!Y!^X!Z!^X!_!^X!l!^X!n!^X!o!^X!p!^X!q!^X!w!^X!x!^X#{!^X#|!^X#}!^X$O!^X$R!^X$Z!^X$k!^X$V!^X~O$Y$iO~O!m$kO!s$lO!vQO!wRO!xRO~O}#XO$X!_O~PCPO{#dO!b$nOf!`ag!`ah!`a!O!`a!Q!`a!W!`a!X!`a!Y!`a!Z!`a!_!`a!l!`a!n!`a!o!`a!p!`a!q!`a!w!`a!x!`a#{!`a#|!`a#}!`a$O!`a$R!`a$Z!`a$k!`a$V!`a~O|$pOf!fXg!fXh!fX!O!fX!Q!fX!W!fX!X!fX!Y!fX!Z!fX!_!fX!l!fX!n!fX!o!fX!p!fX!q!fX!w!fX!x!fX#{!fX#|!fX#}!fX$O!fX$R!fX$V!fX$Z!fX$k!fX~O$V$qOf!gag!gah!ga!O!ga!Q!ga!W!ga!X!ga!Y!ga!Z!ga!_!ga!l!ga!n!ga!o!ga!p!ga!q!ga!w!ga!x!ga#{!ga#|!ga#}!ga$O!ga$R!ga$Z!ga$k!ga~O$V$qOf!dag!dah!da!O!da!Q!da!W!da!X!da!Y!da!Z!da!_!da!l!da!n!da!o!da!p!da!q!da!w!da!x!da#{!da#|!da#}!da$O!da$R!da$Z!da$k!da~Of#jOg#kO$V#jO$Z$rO~O|$tO~O$V$uOf!zag!zah!za!O!za!Q!za!W!za!X!za!Y!za!Z!za!_!za!l!za!n!za!o!za!p!za!q!za!w!za!x!za#{!za#|!za#}!za$O!za$R!za$Z!za$k!za~O|!XO!O!XO!P!XO!Q!XOf#QXg#QXh#QX!W#QX!X#QX!Y#QX!Z#QX!_#QX!l#QX!n#QX!o#QX!p#QX!q#QX!w#QX!x#QX#{#QX#|#QX#}#QX$O#QX$R#QX$V#QX$Z#QX$k#QX~O$V$vOf#Oag#Oah#Oa!O#Oa!Q#Oa!W#Oa!X#Oa!Y#Oa!Z#Oa!_#Oa!l#Oa!n#Oa!o#Oa!p#Oa!q#Oa!w#Oa!x#Oa#{#Oa#|#Oa#}#Oa$O#Oa$R#Oa$Z#Oa$k#Oa~O|!XO!O!XO!P!XO!Q!XOf#TXg#TXh#TX!W#TX!X#TX!Y#TX!Z#TX!_#TX!l#TX!n#TX!o#TX!p#TX!q#TX!w#TX!x#TX#{#TX#|#TX#}#TX$O#TX$R#TX$V#TX$Z#TX$k#TX~O$V$wOf#Rag#Rah#Ra!O#Ra!Q#Ra!W#Ra!X#Ra!Y#Ra!Z#Ra!_#Ra!l#Ra!n#Ra!o#Ra!p#Ra!q#Ra!w#Ra!x#Ra#{#Ra#|#Ra#}#Ra$O#Ra$R#Ra$Z#Ra$k#Ra~OU$xO~P*{O!m${O~O!_$|O$k#zO~OZ%OO!_#xO$Z#ha~P)WO!_#xO$Z%TO$k#zO~P)WO$Z%UO~Od|Oe|Of#Vqg#Vqh#Vq!O#Vq!l#Vq!n#Vq!o#Vq!p#Vq!q#Vq!w#Vq!x#Vq#{#Vq#|#Vq#}#Vq$O#Vq$R#Vq$Z#Vq$V#Vq~O$V%XO$Z%YO~Od|Oe|Of#rqg#rqh#rq!O#rq!l#rq!n#rq!o#rq!p#rq!q#rq!w#rq!x#rq#{#rq#|#rq#}#rq$O#rq$R#rq$Z#rq$V#rq~O$V%]O~P<kO$Z%[O~P,|O#z%^O$Z%aO~OX#uaY#uai#uaj#uak#ual#uam#uan#uao#uap#uaq#uar#uas#ua!v#ua!w#ua!x#ua$U#ua$[#ua$]#ua$^#ua$_#ua$`#ua$a#ua$b#ua$c#ua$d#ua$e#ua$f#ua$g#ua$h#ua$i#ua$j#ua~O$Y$YO~P!*OO_%cO`%cO$Y#ua~P!*OOf!QOh!QO!O!UO!l!UO!n!UO!o!UO!p!UO!q!UO!w!RO!x!RO#{#tq#|#tq#}#tq$O#tq$R#tq$Z#tq~Og#tq~P!,jOf#tqg#tqh#tq~P!,pOg!PO~P!,jO$R#tq$Z#tq~P%lOf#tqg#tqh#tq!O#tq!l#tq!n#tq!o#tq!p#tq!q#tq#{#tq#|#tq#}#tq$O#tq~O!w!RO!x!RO$R#tq$Z#tq~P!.eO}%dO~O$Z%eO~O}%gO~O$Y%hO~O$V$qOf!gig!gih!gi!O!gi!Q!gi!W!gi!X!gi!Y!gi!Z!gi!_!gi!l!gi!n!gi!o!gi!p!gi!q!gi!w!gi!x!gi#{!gi#|!gi#}!gi$O!gi$R!gi$Z!gi$k!gi~O}%iO~O{#dO~Of#jO$V#jOg!hih!hi!O!hi!Q!hi!W!hi!X!hi!Y!hi!Z!hi!_!hi!l!hi!n!hi!o!hi!p!hi!q!hi!w!hi!x!hi#{!hi#|!hi#}!hi$O!hi$R!hi$Z!hi$k!hi~O{%kO}%kO~O{%pO$m%rO$n%sO$o%tO~OZ%OO$Z#hi~O$l%vO~O!_#xO$Z#hi~P)WO!m%yO~O!_$|O$Z#hi~O!_#xO$Z%{O$k#zO~P)WO!_$|O$Z%{O$k#zO~O$Z%}O~O{&OO~O$Z&PO~P,|O$V&RO$Z&SO~O$Y$YOX#uiY#uii#uij#uik#uil#uim#uin#uio#uip#uiq#uir#uis#ui!v#ui!w#ui!x#ui$U#ui$[#ui$]#ui$^#ui$_#ui$`#ui$a#ui$b#ui$c#ui$d#ui$e#ui$f#ui$g#ui$h#ui$i#ui$j#ui~O$V&UO~O$Z&VO~O}&WO~O$Y&XO~Of#jOg#kO$V#jO!_#ki$k#ki$Z#ki~O!_$|O$Z#hq~O!_#xO$Z#hq~P)WOZ%OO!_&[O$Z#hq~Od|Oe|Of#V!Rg#V!Rh#V!R!O#V!R!l#V!R!n#V!R!o#V!R!p#V!R!q#V!R!w#V!R!x#V!R#{#V!R#|#V!R#}#V!R$O#V!R$R#V!R$Z#V!R$V#V!R~Od|Oe|Of#r!Rg#r!Rh#r!R!O#r!R!l#r!R!n#r!R!o#r!R!p#r!R!q#r!R!w#r!R!x#r!R#{#r!R#|#r!R#}#r!R$O#r!R$R#r!R$Z#r!R$V#r!R~O$Z&_O~P,|O#z%^O$Z&aO~O}&bO~O$Z&cO~O{&dO~O!_$|O$Z#hy~OZ%OO$Z#hy~OU$xO~O!_&[O$Z#hy~O$V&gO~O$Z&hO~O!_$|O$Z#h!R~O}&jO~O$V&kO~O}&lO~O$Z&mO~OP!dOQ!cOR!fOS!eOT!eOV&nOW!kOa!mOb!nOc!oO{!bO$Y!iO~O!_&oOfwagwahwa!lwa!nwa!owa!pwa!qwa!wwa!xwa#{wa#|wa#}wa$Owa$Vwa~P)WO!_&oO$VwX~P#mOf&yOh&yO!O&}O!l&}O!n&}O!o&}O!p&}O!q&}O!w&zO!x&zO#{#tq#|#tq#}#tq$O#tq$V#tq~Og#tq~P!@pOf#tqg#tqh#tq~P!@vOg&xO~P!@pOf&yOg&xOh&yO!O&}O!l&}O!n&}O!o&}O!p&}O!q&}O!w&zO!x&zO#{&{O#|&{O#}&{O$O&|O~O$V#tq~P!B^O!w&zO!x&zO$V#tq~P!.eO\",\n goto: \"1l$RPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP$S%R%j&Y&]PPPPPP&t'W'h'v(XPPPP(h(p(yP)S)XP)S)S)[)e)S)m*O*O*XPPPPPP*XP*O*bPPP)S)S*{+R)S)S+Y+])S+c+f+l,_,t-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-Z-p-y.^.j/S/V/V/V/Y/i,_/l,_0R0w1Y1c1fPPPPP,_,_[YOT}!{$U%]Q$^#PQ$_#QS$`#R&tQ$a#SQ$b#TQ$c#UQ'O&rQ'P&sQ'Q&uQ'R&vQ'S&wR'T!Vt^O}!V!{#P#Q#R#S#T#U$U%]&r&s&t&u&v&wRyTjSOT}!V!{#P#Q#R#S#T#U$U%]S!t{$QQ#}!u]&q&r&s&t&u&v&wRpPQoP^!hv!i#j#k#x$|&oQ#Y!YS#q!n$vT#u!o$wQxSQ#y!tQ$}#|Q%R#}Q%z%QR&p&q[wS!t#|#}%Q&q]!qx#y$}%R%z&piuSx!t#y#|#}$}%Q%R%z&p&qhtSx!t#y#|#}$}%Q%R%z&p&qR!auksSux!t#y#|#}$}%Q%R%z&p&qQ!^sV#^!`#Z$hW![s!`#Z$hR$j#`Q#_!`Q$f#ZR%f$hV!pv#x&oR#c!cQ#f!cQ#g!dR$o#cU#e!c!d#cR%j$qU!jv#x&oQ#i!iQ$r#jQ$s#kR%w$|_!hv!i#j#k#x$|&o_!gv!i#j#k#x$|&ov]OT}!V!{#P#Q#R#S#T#U$U%]&r&s&t&u&v&wT$m#`#aQ#o!lR&i&nS#n!l&nR%l$uR#s!nQ#r!nR%m$vR#w!oQ#v!oR%n$wj^O#P#Q#R#S#T#U&r&s&t&u&v&wQzTQ!z}Q#V!VQ$X!{Q%Z$UR&Q%]w]OT}!V!{#P#Q#R#S#T#U$U%]&r&s&t&u&v&wwVOT}!V!{#P#Q#R#S#T#U$U%]&r&s&t&u&v&wwUOT}!V!{#P#Q#R#S#T#U$U%]&r&s&t&u&v&wQ!v{Q$O!uR%W$QS#|!t#}W$z#y#{%R%SQ%u$yQ%|%TR&Z%{Q%Q#|Q%u$zQ&]%|R&e&ZQ#{!tS$y#y%RQ%P#|Q%S#}S%x$}%QS&Y%z%|R&f&]R%q$xR%o$xQ!OXQ%V$PQ%[$VQ&^%}R&_&PR$S!xwXOT}!V!{#P#Q#R#S#T#U$U%]&r&s&t&u&v&wQ#P!PQ#Q!QQ#R!RQ#S!SQ#T!TQ#U!UQ&r&xQ&s&yQ&t&zQ&u&{Q&v&|R&w&}h!}!P!Q!R!S!T!U&x&y&z&{&|&}R$]#OQ$Z!|Q%b$[R&T%cR%_$YQ%`$YR&`&R\",\n nodeNames: \"⚠Json Logfmt Unpack Pattern Regexp Unwrap LabelFormat LineFormat LabelReplace Vector Offset Bool On Ignoring GroupLeft GroupRight Decolorize Drop Keep By Without And Or Unless Sum Avg Count Max Min Stddev Stdvar Bottomk Topk Sort Sort_Desc LineComment LogQL Expr LogExpr Selector Matchers Matcher Identifier Eq String Neq Re Nre PipelineExpr PipelineStage LineFilters LineFilter Filter PipeExact PipeMatch PipePattern Npa FilterOp Ip OrFilter Pipe LogfmtParser LogfmtParserFlags ParserFlag LabelParser JsonExpressionParser LabelExtractionExpressionList LabelExtractionExpression LogfmtExpressionParser LabelFilter IpLabelFilter UnitFilter DurationFilter Gtr Duration Gte Lss Lte Eql BytesFilter Bytes NumberFilter LiteralExpr Number Add Sub LineFormatExpr LabelFormatExpr LabelsFormat LabelFormatMatcher DecolorizeExpr DropLabelsExpr DropLabels DropLabel KeepLabelsExpr KeepLabels KeepLabel MetricExpr RangeAggregationExpr RangeOp CountOverTime Rate RateCounter BytesOverTime BytesRate AvgOverTime SumOverTime MinOverTime MaxOverTime StddevOverTime StdvarOverTime QuantileOverTime FirstOverTime LastOverTime AbsentOverTime LogRangeExpr Range OffsetExpr UnwrapExpr ConvOp BytesConv DurationConv DurationSecondsConv Grouping Labels VectorAggregationExpr VectorOp BinOpExpr BinOpModifier OnOrIgnoringModifier GroupingLabels GroupingLabelList GroupingLabel LabelName Mul Div Mod Pow LabelReplaceExpr VectorExpr\",\n maxTerm: 169,\n skippedNodes: [0,36],\n repeatNodeCount: 0,\n tokenData: \"<n~RvX^#ipq#iqr$^rs$yst%kuv%vxy%{yz&Qz{&V{|&[|}&a}!O&f!O!P2v!P!Q3v!Q!R3{!R![7^![!]9]!^!_9q!_!`:O!`!a:e!c!}:r!}#O;Y#P#Q;_#Q#R;d#R#S:r#S#T;i#T#o:r#o#p;u#p#q;z#q#r<i#y#z#i$f$g#i#BY#BZ#i$IS$I_#i$I|$JO#i$JT$JU#i$KV$KW#i&FU&FV#i~#nY$T~X^#ipq#i#y#z#i$f$g#i#BY#BZ#i$IS$I_#i$I|$JO#i$JT$JU#i$KV$KW#i&FU&FV#i~$aR!_!`$j!`!a$o#r#s$t~$oO!O~~$tO!Z~~$yO!Q~~$|UOY$yZr$yrs%`s#O$y#O#P%e#P~$y~%eO}~~%hPO~$y~%pQt~OY%kZ~%k~%{O#}~~&QO$Y~~&VO$Z~~&[O#{~~&aO!w~~&fO$V~~&kQ!x~}!O&q!Q![(w~&tQ#_#`&z#g#h(X~&}P#X#Y'Q~'TP#X#Y'W~'ZP#d#e'^~'aP}!O'd~'gP#X#Y'j~'mP#a#b'p~'sP#d#e'v~'yP#h#i'|~(PP#m#n(S~(XO!b~~([P#h#i(_~(bP#f#g(e~(hP#]#^(k~(nP#V#W(q~(tP#h#i(S~(zZ!O!P)m!Q![(w#W#X0`#[#]*]#a#b+j#b#c.R#g#h/X#i#j.^#k#l1T#m#n1{${$|.^~)pP!Q![)s~)vV!Q![)s#[#]*]#a#b+j#b#c.R#g#h/X#i#j.^${$|.^~*bP!m~!Q![*e~*hV!O!P*}!Q![*e#a#b+j#b#c.R#g#h/X#i#j.^${$|.^~+QP!Q![+T~+WU!Q![+T#a#b+j#b#c.R#g#h/X#i#j.^${$|.^~+oQ!m~!Q![+u#g#h-Q~+xV!O!P,_!Q![+u#a#b,z#b#c.R#g#h/X#i#j.^${$|.^~,bP!Q![,e~,hU!Q![,e#a#b,z#b#c.R#g#h/X#i#j.^${$|.^~,}P#g#h-Q~-VP!m~!Q![-Y~-]T!O!P-l!Q![-Y#b#c.R#i#j.^${$|.^~-oP!Q![-r~-uS!Q![-r#b#c.R#i#j.^${$|.^~.UP#g#h.X~.^O!m~~.aP#g#h.d~.iP!m~!Q![.l~.oR!O!P.x!Q![.l#b#c.R~.{P!Q![/O~/RQ!Q![/O#b#c.R~/^P!m~!Q![/a~/dU!O!P/v!Q![/a#a#b,z#b#c.R#i#j.^${$|.^~/yP!Q![/|~0PT!Q![/|#a#b,z#b#c.R#i#j.^${$|.^~0eP!m~!Q![0h~0kW!O!P)m!Q![0h#[#]*]#a#b+j#b#c.R#g#h/X#i#j.^${$|.^~1YP!m~!Q![1]~1`X!O!P)m!Q![1]#W#X0`#[#]*]#a#b+j#b#c.R#g#h/X#i#j.^${$|.^~2QP!m~!Q![2T~2WY!O!P)m!Q![2T#W#X0`#[#]*]#a#b+j#b#c.R#g#h/X#i#j.^#k#l1T${$|.^~2yP!Q![2|~3RR!v~!Q![2|!g!h3[#X#Y3[~3_R{|3h}!O3h!Q![3n~3kP!Q![3n~3sP!v~!Q![3n~3{O#|~~4Qe!v~!O!P5c!Q![7^!d!e6x!g!h3[!i!j6}!m!n6}!o!p6}!r!s6}!v!w6}#W#X0`#X#Y3[#[#]*]#_#`7W#a#b+j#b#c.R#g#h/X#i#j.^#k#l1T#l#m8q#m#n1{${$|.^~5hR!v~!Q![5q!g!h3[#X#Y3[~5v`!v~!Q![5q!d!e6x!g!h3[!i!j6}!m!n6}!o!p6}!r!s6}!v!w6}#X#Y3[#[#]*]#_#`7W#a#b+j#b#c.R#g#h/X#i#j.^${$|.^~6}O!s~~7QQ!d!e6x#]#^7W~7ZP!d!e6x~7cd!v~!O!P5c!Q![7^!d!e6x!g!h3[!i!j6}!m!n6}!o!p6}!r!s6}!v!w6}#W#X0`#X#Y3[#[#]*]#_#`7W#a#b+j#b#c.R#g#h/X#i#j.^#k#l1T#m#n1{${$|.^~8tR!Q![8}!c!i8}#T#Z8}~9SR!v~!Q![8}!c!i8}#T#Z8}P9bT{P!Q![9]![!]9]!c!}9]#R#S9]#T#o9]~9vP!o~!_!`9y~:OO!p~~:TQ|~!_!`:Z#r#s:`~:`O!q~~:eO!P~~:jP!l~!_!`:m~:rO!n~R:yT{P#zQ!Q![:r![!]9]!c!}:r#R#S:r#T#o:r~;_O$k~~;dO$l~~;iO$O~~;lRO#S;i#S#T%`#T~;i~;zO$U~~<PR!_~!_!`<Y!`!a<_#r#s<d~<_O!W~~<dO!Y~~<iO!X~~<nO$W~\",\n tokenizers: [0, 1],\n topRules: {\"LogQL\":[0,37]},\n specialized: [{term: 43, get: (value, stack) => (specializeIdentifier(value) << 1)},{term: 43, get: (value, stack) => (extendIdentifier(value) << 1) | 1},{term: 43, get: value => spec_Identifier[value] || -1}],\n tokenPrec: 0\n});\n// This file was generated by lezer-generator. You probably shouldn't edit it.\nconst Json = 1,\n Logfmt = 2,\n Unpack = 3,\n Pattern = 4,\n Regexp = 5,\n Unwrap = 6,\n LabelFormat = 7,\n LineFormat = 8,\n LabelReplace = 9,\n Vector = 10,\n Offset = 11,\n Bool = 12,\n On = 13,\n Ignoring = 14,\n GroupLeft = 15,\n GroupRight = 16,\n Decolorize = 17,\n Drop = 18,\n Keep = 19,\n By = 20,\n Without = 21,\n And = 22,\n Or = 23,\n Unless = 24,\n Sum = 25,\n Avg = 26,\n Count = 27,\n Max = 28,\n Min = 29,\n Stddev = 30,\n Stdvar = 31,\n Bottomk = 32,\n Topk = 33,\n Sort = 34,\n Sort_Desc = 35,\n LineComment = 36,\n LogQL = 37,\n Expr = 38,\n LogExpr = 39,\n Selector = 40,\n Matchers = 41,\n Matcher = 42,\n Identifier = 43,\n Eq = 44,\n String = 45,\n Neq = 46,\n Re = 47,\n Nre = 48,\n PipelineExpr = 49,\n PipelineStage = 50,\n LineFilters = 51,\n LineFilter = 52,\n Filter = 53,\n PipeExact = 54,\n PipeMatch = 55,\n PipePattern = 56,\n Npa = 57,\n FilterOp = 58,\n Ip = 59,\n OrFilter = 60,\n Pipe = 61,\n LogfmtParser = 62,\n LogfmtParserFlags = 63,\n ParserFlag = 64,\n LabelParser = 65,\n JsonExpressionParser = 66,\n LabelExtractionExpressionList = 67,\n LabelExtractionExpression = 68,\n LogfmtExpressionParser = 69,\n LabelFilter = 70,\n IpLabelFilter = 71,\n UnitFilter = 72,\n DurationFilter = 73,\n Gtr = 74,\n Duration = 75,\n Gte = 76,\n Lss = 77,\n Lte = 78,\n Eql = 79,\n BytesFilter = 80,\n Bytes = 81,\n NumberFilter = 82,\n LiteralExpr = 83,\n Number = 84,\n Add = 85,\n Sub = 86,\n LineFormatExpr = 87,\n LabelFormatExpr = 88,\n LabelsFormat = 89,\n LabelFormatMatcher = 90,\n DecolorizeExpr = 91,\n DropLabelsExpr = 92,\n DropLabels = 93,\n DropLabel = 94,\n KeepLabelsExpr = 95,\n KeepLabels = 96,\n KeepLabel = 97,\n MetricExpr = 98,\n RangeAggregationExpr = 99,\n RangeOp = 100,\n CountOverTime = 101,\n Rate = 102,\n RateCounter = 103,\n BytesOverTime = 104,\n BytesRate = 105,\n AvgOverTime = 106,\n SumOverTime = 107,\n MinOverTime = 108,\n MaxOverTime = 109,\n StddevOverTime = 110,\n StdvarOverTime = 111,\n QuantileOverTime = 112,\n FirstOverTime = 113,\n LastOverTime = 114,\n AbsentOverTime = 115,\n LogRangeExpr = 116,\n Range = 117,\n OffsetExpr = 118,\n UnwrapExpr = 119,\n ConvOp = 120,\n BytesConv = 121,\n DurationConv = 122,\n DurationSecondsConv = 123,\n Grouping = 124,\n Labels = 125,\n VectorAggregationExpr = 126,\n VectorOp = 127,\n BinOpExpr = 128,\n BinOpModifier = 129,\n OnOrIgnoringModifier = 130,\n GroupingLabels = 131,\n GroupingLabelList = 132,\n GroupingLabel = 133,\n LabelName = 134,\n Mul = 135,\n Div = 136,\n Mod = 137,\n Pow = 138,\n LabelReplaceExpr = 139,\n VectorExpr = 140;\n\nexport { AbsentOverTime, Add, And, Avg, AvgOverTime, BinOpExpr, BinOpModifier, Bool, Bottomk, By, Bytes, BytesConv, BytesFilter, BytesOverTime, BytesRate, ConvOp, Count, CountOverTime, Decolorize, DecolorizeExpr, Div, Drop, DropLabel, DropLabels, DropLabelsExpr, Duration, DurationConv, DurationFilter, DurationSecondsConv, Eq, Eql, Expr, Filter, FilterOp, FirstOverTime, GroupLeft, GroupRight, Grouping, GroupingLabel, GroupingLabelList, GroupingLabels, Gte, Gtr, Identifier, Ignoring, Ip, IpLabelFilter, Json, JsonExpressionParser, Keep, KeepLabel, KeepLabels, KeepLabelsExpr, LabelExtractionExpression, LabelExtractionExpressionList, LabelFilter, LabelFormat, LabelFormatExpr, LabelFormatMatcher, LabelName, LabelParser, LabelReplace, LabelReplaceExpr, Labels, LabelsFormat, LastOverTime, LineComment, LineFilter, LineFilters, LineFormat, LineFormatExpr, LiteralExpr, LogExpr, LogQL, LogRangeExpr, Logfmt, LogfmtExpressionParser, LogfmtParser, LogfmtParserFlags, Lss, Lte, Matcher, Matchers, Max, MaxOverTime, MetricExpr, Min, MinOverTime, Mod, Mul, Neq, Npa, Nre, Number, NumberFilter, Offset, OffsetExpr, On, OnOrIgnoringModifier, Or, OrFilter, ParserFlag, Pattern, Pipe, PipeExact, PipeMatch, PipePattern, PipelineExpr, PipelineStage, Pow, QuantileOverTime, Range, RangeAggregationExpr, RangeOp, Rate, RateCounter, Re, Regexp, Selector, Sort, Sort_Desc, Stddev, StddevOverTime, Stdvar, StdvarOverTime, String, Sub, Sum, SumOverTime, Topk, UnitFilter, Unless, Unpack, Unwrap, UnwrapExpr, Vector, VectorAggregationExpr, VectorExpr, VectorOp, Without, parser };\n","import { useState } from 'react';\n\nimport { DataSourceApi, SelectableValue, getDefaultTimeRange, toOption } from '@grafana/data';\nimport { QueryBuilderOperationParamEditorProps, VisualQueryModeller } from '@grafana/plugin-ui';\nimport { Select } from '@grafana/ui';\n\nimport { extractUnwrapLabelKeysFromDataFrame } from '../../responseUtils';\nimport { getOperationParamId } from '../operationUtils';\nimport { LokiVisualQuery } from '../types';\n\nexport function UnwrapParamEditor({\n onChange,\n index,\n operationId,\n value,\n query,\n datasource,\n timeRange,\n queryModeller,\n}: QueryBuilderOperationParamEditorProps) {\n const [state, setState] = useState<{\n options?: Array<SelectableValue<string>>;\n isLoading?: boolean;\n }>({});\n\n return (\n <Select\n inputId={getOperationParamId(operationId, index)}\n onOpenMenu={async () => {\n // This check is always true, we do it to make typescript happy\n setState({ isLoading: true });\n const options = await loadUnwrapOptions(query, datasource, queryModeller, timeRange);\n setState({ options, isLoading: undefined });\n }}\n isLoading={state.isLoading}\n allowCustomValue\n noOptionsMessage=\"No labels found\"\n loadingMessage=\"Loading labels\"\n options={state.options}\n value={value ? toOption(value.toString()) : null}\n onChange={(value) => {\n if (value.value) {\n onChange(index, value.value);\n }\n }}\n />\n );\n}\n\nasync function loadUnwrapOptions(\n query: LokiVisualQuery,\n datasource: DataSourceApi,\n queryModeller: VisualQueryModeller,\n timeRange = getDefaultTimeRange()\n): Promise<Array<SelectableValue<string>>> {\n const queryExpr = queryModeller.renderQuery(query);\n if (!('getDataSamples' in datasource) || typeof datasource.getDataSamples !== 'function') {\n return [];\n }\n // the query is a metric query, we need to set metricQueryToLogConversion to true to getSamples use the log query\n const samples = await datasource.getDataSamples({ expr: queryExpr, refId: 'unwrap_samples' }, timeRange, {\n convertMetricQueryToLogQuery: true,\n });\n const unwrapLabels = extractUnwrapLabelKeysFromDataFrame(samples[0]);\n\n const labelOptions = unwrapLabels.map((label) => ({\n label,\n value: label,\n }));\n\n return labelOptions;\n}\n","import { QueryBuilderOperationDefinition, QueryBuilderOperationParamValue } from '@grafana/plugin-ui';\n\nimport { binaryScalarOperations } from './binaryScalarOperations';\nimport { UnwrapParamEditor } from './components/UnwrapParamEditor';\nimport {\n addLokiOperation,\n addNestedQueryHandler,\n createAggregationOperation,\n createAggregationOperationWithParam,\n createRangeOperation,\n createRangeOperationWithGrouping,\n getLineFilterRenderer,\n labelFilterRenderer,\n pipelineRenderer,\n} from './operationUtils';\nimport { LokiOperationId, LokiOperationOrder, lokiOperators, LokiVisualQueryOperationCategory } from './types';\n\nfunction getOperationDefinitions(): QueryBuilderOperationDefinition[] {\n const aggregations = [\n LokiOperationId.Sum,\n LokiOperationId.Min,\n LokiOperationId.Max,\n LokiOperationId.Avg,\n LokiOperationId.Stddev,\n LokiOperationId.Stdvar,\n LokiOperationId.Count,\n ].flatMap((opId) =>\n createAggregationOperation(opId, {\n addOperationHandler: addLokiOperation,\n orderRank: LokiOperationOrder.Last,\n })\n );\n\n const aggregationsWithParam = [LokiOperationId.TopK, LokiOperationId.BottomK].flatMap((opId) => {\n return createAggregationOperationWithParam(\n opId,\n {\n params: [{ name: 'K-value', type: 'number' }],\n defaultParams: [5],\n },\n {\n addOperationHandler: addLokiOperation,\n orderRank: LokiOperationOrder.Last,\n }\n );\n });\n\n const rangeOperations = [\n createRangeOperation(LokiOperationId.Rate),\n createRangeOperation(LokiOperationId.RateCounter),\n createRangeOperation(LokiOperationId.CountOverTime),\n createRangeOperation(LokiOperationId.SumOverTime),\n createRangeOperation(LokiOperationId.BytesRate),\n createRangeOperation(LokiOperationId.BytesOverTime),\n createRangeOperation(LokiOperationId.AbsentOverTime),\n ];\n\n const rangeOperationsWithGrouping = [\n ...createRangeOperationWithGrouping(LokiOperationId.AvgOverTime),\n ...createRangeOperationWithGrouping(LokiOperationId.MaxOverTime),\n ...createRangeOperationWithGrouping(LokiOperationId.MinOverTime),\n ...createRangeOperationWithGrouping(LokiOperationId.FirstOverTime),\n ...createRangeOperationWithGrouping(LokiOperationId.LastOverTime),\n ...createRangeOperationWithGrouping(LokiOperationId.StdvarOverTime),\n ...createRangeOperationWithGrouping(LokiOperationId.StddevOverTime),\n ...createRangeOperationWithGrouping(LokiOperationId.QuantileOverTime),\n ];\n\n const list: QueryBuilderOperationDefinition[] = [\n ...aggregations,\n ...aggregationsWithParam,\n ...rangeOperations,\n ...rangeOperationsWithGrouping,\n {\n id: LokiOperationId.Json,\n name: 'Json',\n params: [\n {\n name: 'Expression',\n type: 'string',\n restParam: true,\n optional: true,\n minWidth: 18,\n placeholder: 'server=\"servers[0]\"',\n description:\n 'Using expressions with your json parser will extract only the specified json fields to labels. You can specify one or more expressions in this way. All expressions must be quoted.',\n },\n ],\n defaultParams: [],\n toggleable: true,\n alternativesKey: 'format',\n category: LokiVisualQueryOperationCategory.Formats,\n orderRank: LokiOperationOrder.Parsers,\n renderer: pipelineRenderer,\n addOperationHandler: addLokiOperation,\n explainHandler: () =>\n `This will extract keys and values from a [json](https://grafana.com/docs/loki/latest/logql/log_queries/#json) formatted log line as labels. The extracted labels can be used in label filter expressions and used as values for a range aggregation via the unwrap operation.`,\n },\n {\n id: LokiOperationId.Logfmt,\n name: 'Logfmt',\n params: [\n {\n name: 'Strict',\n type: 'boolean',\n optional: true,\n description:\n 'With strict parsing enabled, the logfmt parser immediately stops scanning the log line and returns early with an error when it encounters any poorly formatted key/value pair.',\n },\n {\n name: 'Keep empty',\n type: 'boolean',\n optional: true,\n description:\n 'The logfmt parser retains standalone keys (keys without a value) as labels with its value set to empty string. ',\n },\n {\n name: 'Expression',\n type: 'string',\n optional: true,\n restParam: true,\n minWidth: 18,\n placeholder: 'field_name',\n description:\n 'Using expressions with your logfmt parser will extract and rename (if provided) only the specified fields to labels. You can specify one or more expressions in this way.',\n },\n ],\n defaultParams: [false, false],\n toggleable: true,\n alternativesKey: 'format',\n category: LokiVisualQueryOperationCategory.Formats,\n orderRank: LokiOperationOrder.Parsers,\n renderer: pipelineRenderer,\n addOperationHandler: addLokiOperation,\n explainHandler: () =>\n `This will extract all keys and values from a [logfmt](https://grafana.com/docs/loki/latest/logql/log_queries/#logfmt) formatted log line as labels. The extracted labels can be used in label filter expressions and used as values for a range aggregation via the unwrap operation.`,\n },\n {\n id: LokiOperationId.Regexp,\n name: 'Regexp',\n params: [\n {\n name: 'String',\n type: 'string',\n hideName: true,\n placeholder: '<re>',\n description: 'The regexp expression that matches the structure of a log line.',\n minWidth: 20,\n },\n ],\n defaultParams: [''],\n toggleable: true,\n alternativesKey: 'format',\n category: LokiVisualQueryOperationCategory.Formats,\n orderRank: LokiOperationOrder.Parsers,\n renderer: (model, def, innerExpr) => `${innerExpr} | regexp \\`${model.params[0]}\\``,\n addOperationHandler: addLokiOperation,\n explainHandler: () =>\n `The [regexp parser](https://grafana.com/docs/loki/latest/logql/log_queries/#regular-expression) takes a single parameter | regexp \"<re>\" which is the regular expression using the Golang RE2 syntax. The regular expression must contain a least one named sub-match (e.g (?P<name>re)), each sub-match will extract a different label. The expression matches the structure of a log line. The extracted labels can be used in label filter expressions and used as values for a range aggregation via the unwrap operation.`,\n },\n {\n id: LokiOperationId.Pattern,\n name: 'Pattern',\n params: [\n {\n name: 'String',\n type: 'string',\n hideName: true,\n placeholder: '<pattern-expression>',\n description: 'The expression that matches the structure of a log line.',\n minWidth: 20,\n },\n ],\n defaultParams: [''],\n toggleable: true,\n alternativesKey: 'format',\n category: LokiVisualQueryOperationCategory.Formats,\n orderRank: LokiOperationOrder.Parsers,\n renderer: (model, def, innerExpr) => `${innerExpr} | pattern \\`${model.params[0]}\\``,\n addOperationHandler: addLokiOperation,\n explainHandler: () =>\n `The [pattern parser](https://grafana.com/docs/loki/latest/logql/log_queries/#pattern) allows the explicit extraction of fields from log lines by defining a pattern expression (| pattern \\`<pattern-expression>\\`). The expression matches the structure of a log line. The extracted labels can be used in label filter expressions and used as values for a range aggregation via the unwrap operation.`,\n },\n {\n id: LokiOperationId.Unpack,\n name: 'Unpack',\n params: [],\n defaultParams: [],\n toggleable: true,\n alternativesKey: 'format',\n category: LokiVisualQueryOperationCategory.Formats,\n orderRank: LokiOperationOrder.Parsers,\n renderer: pipelineRenderer,\n addOperationHandler: addLokiOperation,\n explainHandler: () =>\n `This will extract all keys and values from a JSON log line, [unpacking](https://grafana.com/docs/loki/latest/logql/log_queries/#unpack) all embedded labels in the pack stage. The extracted labels can be used in label filter expressions and used as values for a range aggregation via the unwrap operation.`,\n },\n {\n id: LokiOperationId.LineFormat,\n name: 'Line format',\n params: [\n {\n name: 'String',\n type: 'string',\n hideName: true,\n placeholder: '{{.status_code}}',\n description: 'A line template that can refer to stream labels and extracted labels.',\n minWidth: 20,\n },\n ],\n defaultParams: [''],\n toggleable: true,\n alternativesKey: 'format',\n category: LokiVisualQueryOperationCategory.Formats,\n orderRank: LokiOperationOrder.PipeOperations,\n renderer: (model, def, innerExpr) => `${innerExpr} | line_format \\`${model.params[0]}\\``,\n addOperationHandler: addLokiOperation,\n explainHandler: () =>\n `This will replace log line using a specified template. The template can refer to stream labels and extracted labels.\n\nExample: \\`{{.status_code}} - {{.message}}\\`\n\n[Read the docs](https://grafana.com/docs/loki/latest/logql/log_queries/#line-format-expression) for more.\n `,\n },\n {\n id: LokiOperationId.LabelFormat,\n name: 'Label format',\n params: [\n { name: 'Label', type: 'string' },\n { name: 'Rename to', type: 'string' },\n ],\n defaultParams: ['', ''],\n toggleable: true,\n alternativesKey: 'format',\n category: LokiVisualQueryOperationCategory.Formats,\n orderRank: LokiOperationOrder.PipeOperations,\n renderer: (model, def, innerExpr) => `${innerExpr} | label_format ${model.params[1]}=${model.params[0]}`,\n addOperationHandler: addLokiOperation,\n explainHandler: () =>\n `This will change name of label to desired new label. In the example below, label \"error_level\" will be renamed to \"level\".\n\nExample: \\`\\`error_level=\\`level\\` \\`\\`\n\n[Read the docs](https://grafana.com/docs/loki/latest/logql/log_queries/#labels-format-expression) for more.\n `,\n },\n\n {\n id: LokiOperationId.LineContains,\n name: 'Line contains',\n params: [\n {\n name: '',\n type: 'string',\n hideName: true,\n restParam: true,\n placeholder: 'Text to find',\n description: 'Find log lines that contains this text',\n minWidth: 20,\n runQueryOnEnter: true,\n },\n ],\n defaultParams: [''],\n toggleable: true,\n alternativesKey: 'line filter',\n category: LokiVisualQueryOperationCategory.LineFilters,\n orderRank: LokiOperationOrder.LineFilters,\n renderer: getLineFilterRenderer('|='),\n addOperationHandler: addLokiOperation,\n explainHandler: (op) => `Return log lines that contain string \\`${op.params?.join('`, or `')}\\`.`,\n },\n {\n id: LokiOperationId.LineContainsNot,\n name: 'Line does not contain',\n params: [\n {\n name: '',\n type: 'string',\n hideName: true,\n restParam: true,\n placeholder: 'Text to exclude',\n description: 'Find log lines that does not contain this text',\n minWidth: 26,\n runQueryOnEnter: true,\n },\n ],\n defaultParams: [''],\n toggleable: true,\n alternativesKey: 'line filter',\n category: LokiVisualQueryOperationCategory.LineFilters,\n orderRank: LokiOperationOrder.LineFilters,\n renderer: getLineFilterRenderer('!='),\n addOperationHandler: addLokiOperation,\n explainHandler: (op) => `Return log lines that does not contain string \\`${op.params?.join('`, or `')}\\`.`,\n },\n {\n id: LokiOperationId.LineContainsCaseInsensitive,\n name: 'Line contains case insensitive',\n params: [\n {\n name: '',\n type: 'string',\n hideName: true,\n restParam: true,\n placeholder: 'Text to find',\n description: 'Find log lines that contains this text',\n minWidth: 33,\n runQueryOnEnter: true,\n },\n ],\n defaultParams: [''],\n toggleable: true,\n alternativesKey: 'line filter',\n category: LokiVisualQueryOperationCategory.LineFilters,\n orderRank: LokiOperationOrder.LineFilters,\n renderer: getLineFilterRenderer('|~', true),\n addOperationHandler: addLokiOperation,\n explainHandler: (op) => `Return log lines that match regex \\`(?i)${op.params?.join('`, or `(?i)')}\\`.`,\n },\n {\n id: LokiOperationId.LineContainsNotCaseInsensitive,\n name: 'Line does not contain case insensitive',\n params: [\n {\n name: '',\n type: 'string',\n hideName: true,\n restParam: true,\n placeholder: 'Text to exclude',\n description: 'Find log lines that does not contain this text',\n minWidth: 40,\n runQueryOnEnter: true,\n },\n ],\n defaultParams: [''],\n toggleable: true,\n alternativesKey: 'line filter',\n category: LokiVisualQueryOperationCategory.LineFilters,\n orderRank: LokiOperationOrder.LineFilters,\n renderer: getLineFilterRenderer('!~', true),\n addOperationHandler: addLokiOperation,\n explainHandler: (op) => `Return log lines that does not match regex \\`(?i)${op.params?.join('`, or `(?i)')}\\`.`,\n },\n {\n id: LokiOperationId.LineMatchesRegex,\n name: 'Line contains regex match',\n params: [\n {\n name: '',\n type: 'string',\n hideName: true,\n restParam: true,\n placeholder: 'Pattern to match',\n description: 'Find log lines that match this regex pattern',\n minWidth: 30,\n runQueryOnEnter: true,\n },\n ],\n defaultParams: [''],\n toggleable: true,\n alternativesKey: 'line filter',\n category: LokiVisualQueryOperationCategory.LineFilters,\n orderRank: LokiOperationOrder.LineFilters,\n renderer: getLineFilterRenderer('|~'),\n addOperationHandler: addLokiOperation,\n explainHandler: (op) => `Return log lines that match a \\`RE2\\` regex pattern. \\`${op.params?.join('`, or `')}\\`.`,\n },\n {\n id: LokiOperationId.LineMatchesRegexNot,\n name: 'Line does not match regex',\n params: [\n {\n name: '',\n type: 'string',\n hideName: true,\n restParam: true,\n placeholder: 'Pattern to exclude',\n description: 'Find log lines that does not match this regex pattern',\n minWidth: 30,\n runQueryOnEnter: true,\n },\n ],\n defaultParams: [''],\n toggleable: true,\n alternativesKey: 'line filter',\n category: LokiVisualQueryOperationCategory.LineFilters,\n orderRank: LokiOperationOrder.LineFilters,\n renderer: getLineFilterRenderer('!~'),\n addOperationHandler: addLokiOperation,\n explainHandler: (op) =>\n `Return log lines that doesn't match a \\`RE2\\` regex pattern. \\`${op.params?.join('`, or `')}\\`.`,\n },\n {\n id: LokiOperationId.LineFilterIpMatches,\n name: 'IP line filter expression',\n params: [\n {\n name: 'Operator',\n type: 'string',\n minWidth: 16,\n options: [lokiOperators.contains, lokiOperators.doesNotContain],\n },\n {\n name: 'Pattern',\n type: 'string',\n placeholder: '<pattern>',\n minWidth: 16,\n runQueryOnEnter: true,\n },\n ],\n defaultParams: ['|=', ''],\n toggleable: true,\n alternativesKey: 'line filter',\n category: LokiVisualQueryOperationCategory.LineFilters,\n orderRank: LokiOperationOrder.LineFilters,\n renderer: (op, def, innerExpr) => `${innerExpr} ${op.params[0]} ip(\\`${op.params[1]}\\`)`,\n addOperationHandler: addLokiOperation,\n explainHandler: (op) => `Return log lines using IP matching of \\`${op.params[1]}\\``,\n },\n {\n id: LokiOperationId.LabelFilter,\n name: 'Label filter expression',\n params: [\n { name: 'Label', type: 'string', minWidth: 14 },\n {\n name: 'Operator',\n type: 'string',\n minWidth: 14,\n options: [\n lokiOperators.equals,\n lokiOperators.doesNotEqual,\n lokiOperators.matchesRegex,\n lokiOperators.doesNotMatchRegex,\n lokiOperators.greaterThan,\n lokiOperators.lessThan,\n lokiOperators.greaterThanOrEqual,\n lokiOperators.lessThanOrEqual,\n ],\n },\n { name: 'Value', type: 'string', minWidth: 14 },\n ],\n defaultParams: ['', '=', ''],\n toggleable: true,\n alternativesKey: 'label filter',\n category: LokiVisualQueryOperationCategory.LabelFilters,\n orderRank: LokiOperationOrder.PipeOperations,\n renderer: labelFilterRenderer,\n addOperationHandler: addLokiOperation,\n explainHandler: () => `Label expression filter allows filtering using original and extracted labels.`,\n },\n {\n id: LokiOperationId.LabelFilterIpMatches,\n name: 'IP label filter expression',\n params: [\n { name: 'Label', type: 'string', minWidth: 14 },\n {\n name: 'Operator',\n type: 'string',\n minWidth: 14,\n options: [lokiOperators.equals, lokiOperators.doesNotEqual],\n },\n { name: 'Value', type: 'string', minWidth: 14 },\n ],\n defaultParams: ['', '=', ''],\n toggleable: true,\n alternativesKey: 'label filter',\n category: LokiVisualQueryOperationCategory.LabelFilters,\n orderRank: LokiOperationOrder.PipeOperations,\n renderer: (model, def, innerExpr) =>\n `${innerExpr} | ${model.params[0]} ${model.params[1]} ip(\\`${model.params[2]}\\`)`,\n addOperationHandler: addLokiOperation,\n explainHandler: (op) => `Return log lines using IP matching of \\`${op.params[2]}\\` for \\`${op.params[0]}\\` label`,\n },\n {\n id: LokiOperationId.LabelFilterNoErrors,\n name: 'No pipeline errors',\n params: [],\n defaultParams: [],\n toggleable: true,\n alternativesKey: 'label filter',\n category: LokiVisualQueryOperationCategory.LabelFilters,\n orderRank: LokiOperationOrder.NoErrors,\n renderer: (model, def, innerExpr) => `${innerExpr} | __error__=\\`\\``,\n addOperationHandler: addLokiOperation,\n explainHandler: () => `Filter out all formatting and parsing errors.`,\n },\n {\n id: LokiOperationId.Unwrap,\n name: 'Unwrap',\n params: [\n {\n name: 'Identifier',\n type: 'string',\n hideName: true,\n minWidth: 16,\n placeholder: 'Label key',\n editor: UnwrapParamEditor,\n },\n {\n name: 'Conversion function',\n hideName: true,\n type: 'string',\n options: ['duration', 'duration_seconds', 'bytes'],\n optional: true,\n },\n ],\n defaultParams: ['', ''],\n toggleable: true,\n alternativesKey: 'format',\n category: LokiVisualQueryOperationCategory.Formats,\n orderRank: LokiOperationOrder.Unwrap,\n renderer: (op, def, innerExpr) =>\n `${innerExpr} | unwrap ${op.params[1] ? `${op.params[1]}(${op.params[0]})` : op.params[0]}`,\n addOperationHandler: addLokiOperation,\n explainHandler: (op) => {\n let label = String(op.params[0]).length > 0 ? op.params[0] : '<label>';\n return `Use the extracted label \\`${label}\\` as sample values instead of log lines for the subsequent range aggregation.${\n op.params[1]\n ? ` Conversion function \\`${op.params[1]}\\` wrapping \\`${label}\\` will attempt to convert this label from a specific format (e.g. 3k, 500ms).`\n : ''\n }`;\n },\n },\n {\n id: LokiOperationId.Decolorize,\n name: 'Decolorize',\n params: [],\n defaultParams: [],\n toggleable: true,\n alternativesKey: 'format',\n category: LokiVisualQueryOperationCategory.Formats,\n orderRank: LokiOperationOrder.PipeOperations,\n renderer: (op, def, innerExpr) => `${innerExpr} | decolorize`,\n addOperationHandler: addLokiOperation,\n explainHandler: () => `This will remove ANSI color codes from log lines.`,\n },\n {\n id: LokiOperationId.Drop,\n name: 'Drop',\n params: [\n // As drop can support both labels (e.g. job) and expressions (e.g. job=\"grafana\"), we\n // use input and not LabelParamEditor.\n {\n name: 'Label',\n type: 'string',\n restParam: true,\n optional: true,\n minWidth: 18,\n placeholder: 'job=\"grafana\"',\n description: 'Specify labels or expressions to drop.',\n },\n ],\n defaultParams: [''],\n toggleable: true,\n alternativesKey: 'format',\n category: LokiVisualQueryOperationCategory.Formats,\n orderRank: LokiOperationOrder.PipeOperations,\n renderer: pipelineRenderer,\n addOperationHandler: addLokiOperation,\n explainHandler: () => 'The drop expression will drop the given labels in the pipeline.',\n },\n {\n id: LokiOperationId.Keep,\n name: 'Keep',\n params: [\n // As keep can support both labels (e.g. job) and expressions (e.g. job=\"grafana\"), we\n // use input and not LabelParamEditor.\n {\n name: 'Label',\n type: 'string',\n restParam: true,\n optional: true,\n minWidth: 18,\n placeholder: 'job=\"grafana\"',\n description: 'Specify labels or expressions to keep.',\n },\n ],\n defaultParams: [''],\n toggleable: true,\n alternativesKey: 'format',\n category: LokiVisualQueryOperationCategory.Formats,\n orderRank: LokiOperationOrder.PipeOperations,\n renderer: pipelineRenderer,\n addOperationHandler: addLokiOperation,\n explainHandler: () =>\n 'The keep expression will keep only the specified labels in the pipeline and drop all the other labels.',\n },\n ...binaryScalarOperations,\n {\n id: LokiOperationId.NestedQuery,\n name: 'Binary operation with query',\n params: [],\n defaultParams: [],\n toggleable: true,\n category: LokiVisualQueryOperationCategory.BinaryOps,\n renderer: (model, def, innerExpr) => innerExpr,\n addOperationHandler: addNestedQueryHandler,\n },\n ];\n\n return list;\n}\n\n// Keeping a local copy as an optimization measure.\nexport const operationDefinitions = getOperationDefinitions();\n\n/**\n * Given an operator, return the corresponding explain.\n * For usage within the Query Editor.\n */\nexport function explainOperator(id: LokiOperationId | string): string {\n const definition = operationDefinitions.find((operation) => operation.id === id);\n\n const explain = definition?.explainHandler?.({ id: '', params: ['<value>'] }) || '';\n\n // Strip markdown links\n return explain.replace(/\\[(.*)\\]\\(.*\\)/g, '$1');\n}\n\nexport function getDefinitionById(id: string): QueryBuilderOperationDefinition | undefined {\n return operationDefinitions.find((x) => x.id === id);\n}\n\nexport function checkParamsAreValid(\n def: QueryBuilderOperationDefinition,\n params: QueryBuilderOperationParamValue[]\n): boolean {\n // For now we only check if the operation has all the required params.\n if (params.length < def.params.filter((param) => !param.optional).length) {\n return false;\n }\n\n return true;\n}\n","import { css } from '@emotion/css';\nimport { useMemo, useRef } from 'react';\n\nimport { EventBusSrv, GrafanaTheme2 } from '@grafana/data';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { LogsTableWrap } from '../../explore/Logs/LogsTableWrap';\n\nimport { LogRowsComponentProps } from './ControlledLogRows';\nimport { useLogListContext } from './panel/LogListContext';\nimport { CONTROLS_WIDTH, CONTROLS_WIDTH_EXPANDED, LogListControls } from './panel/LogListControls';\n\nexport const ControlledLogsTable = ({\n loading,\n loadMoreLogs,\n deduplicatedRows = [],\n range,\n splitOpen,\n onClickFilterLabel,\n onClickFilterOutLabel,\n panelState,\n datasourceType,\n updatePanelState,\n width,\n logsTableFrames,\n visualisationType,\n ...rest\n}: LogRowsComponentProps) => {\n const { sortOrder, controlsExpanded } = useLogListContext();\n const eventBus = useMemo(() => new EventBusSrv(), []);\n const ref = useRef(null);\n\n const styles = useStyles2(getStyles);\n\n if (!splitOpen || !width || !updatePanelState) {\n console.error('<ControlledLogsTable>: Missing required props.');\n return;\n }\n\n const tableWidthExpandedControls = width - (CONTROLS_WIDTH_EXPANDED + 12);\n const tableWidth = width - (CONTROLS_WIDTH + 12);\n\n return (\n <div ref={ref} className={styles.logRowsContainer}>\n <LogListControls eventBus={eventBus} visualisationType={visualisationType} />\n <div className={styles.logRows} data-testid=\"logRowsTable\">\n {/* Width should be full width minus logs navigation and padding */}\n <LogsTableWrap\n logsSortOrder={sortOrder}\n range={range}\n splitOpen={splitOpen}\n timeZone={rest.timeZone}\n width={controlsExpanded ? tableWidthExpandedControls : tableWidth}\n logsFrames={logsTableFrames ?? []}\n onClickFilterLabel={onClickFilterLabel}\n onClickFilterOutLabel={onClickFilterOutLabel}\n panelState={panelState}\n updatePanelState={updatePanelState}\n datasourceType={datasourceType}\n />\n </div>\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n logRows: css({\n overflowY: 'visible',\n width: '100%',\n }),\n logRowsContainer: css({\n display: 'flex',\n flexDirection: 'row-reverse',\n }),\n };\n};\n","import { css } from '@emotion/css';\nimport { useEffect, useMemo, useRef, forwardRef, useImperativeHandle, useCallback } from 'react';\n\nimport {\n AbsoluteTimeRange,\n CoreApp,\n DataFrame,\n EventBusSrv,\n ExploreLogsPanelState,\n LogLevel,\n LogsMetaItem,\n LogsSortOrder,\n SplitOpen,\n TimeRange,\n} from '@grafana/data';\nimport { config } from '@grafana/runtime';\n\nimport { LogsVisualisationType } from '../../explore/Logs/Logs';\n\nimport { ControlledLogsTable } from './ControlledLogsTable';\nimport { InfiniteScroll } from './InfiniteScroll';\nimport { LogRows, Props } from './LogRows';\nimport { LogListOptions } from './panel/LogList';\nimport { LogListContextProvider, useLogListContext } from './panel/LogListContext';\nimport { LogListControls } from './panel/LogListControls';\nimport { ScrollToLogsEvent } from './panel/virtualization';\n\nexport interface ControlledLogRowsProps extends Omit<Props, 'scrollElement'> {\n loading: boolean;\n logsMeta?: LogsMetaItem[];\n loadMoreLogs?: (range: AbsoluteTimeRange) => void;\n logOptionsStorageKey?: string;\n onLogOptionsChange?: (option: LogListOptions, value: string | boolean | string[]) => void;\n range: TimeRange;\n filterLevels?: LogLevel[];\n\n /** Props added for Table **/\n visualisationType: LogsVisualisationType;\n splitOpen?: SplitOpen;\n panelState?: ExploreLogsPanelState;\n updatePanelState?: (panelState: Partial<ExploreLogsPanelState>) => void;\n datasourceType?: string;\n width?: number;\n logsTableFrames?: DataFrame[];\n}\n\nexport type LogRowsComponentProps = Omit<\n ControlledLogRowsProps,\n | 'app'\n | 'dedupStrategy'\n | 'filterLevels'\n | 'showLabels'\n | 'showTime'\n | 'logsSortOrder'\n | 'prettifyLogMessage'\n | 'wrapLogMessage'\n>;\n\nexport const ControlledLogRows = forwardRef<HTMLDivElement | null, ControlledLogRowsProps>(\n (\n {\n deduplicatedRows,\n dedupStrategy,\n filterLevels,\n showLabels,\n showTime,\n logsMeta,\n logOptionsStorageKey,\n logsSortOrder,\n prettifyLogMessage,\n onLogOptionsChange,\n wrapLogMessage,\n ...rest\n }: ControlledLogRowsProps,\n ref\n ) => {\n return (\n <LogListContextProvider\n app={rest.app || CoreApp.Unknown}\n displayedFields={[]}\n dedupStrategy={dedupStrategy}\n enableLogDetails={false}\n filterLevels={filterLevels}\n fontSize=\"default\"\n logOptionsStorageKey={logOptionsStorageKey}\n logs={deduplicatedRows ?? []}\n logsMeta={logsMeta}\n prettifyJSON={prettifyLogMessage}\n showControls\n showTime={showTime}\n showUniqueLabels={showLabels}\n sortOrder={logsSortOrder || LogsSortOrder.Descending}\n onLogOptionsChange={onLogOptionsChange}\n wrapLogMessage={wrapLogMessage}\n >\n {rest.visualisationType === 'logs' && (\n <LogRowsComponent ref={ref} {...rest} deduplicatedRows={deduplicatedRows} />\n )}\n {rest.visualisationType === 'table' && rest.updatePanelState && <ControlledLogsTable {...rest} />}\n </LogListContextProvider>\n );\n }\n);\n\nControlledLogRows.displayName = 'ControlledLogRows';\n\nconst LogRowsComponent = forwardRef<HTMLDivElement | null, LogRowsComponentProps>(\n (\n {\n loading,\n loadMoreLogs,\n deduplicatedRows = [],\n range,\n scrollIntoView: scrollIntoViewProp,\n ...rest\n }: LogRowsComponentProps,\n ref\n ) => {\n const {\n app,\n dedupStrategy,\n filterLevels,\n forceEscape,\n prettifyJSON,\n sortOrder,\n showTime,\n showUniqueLabels,\n wrapLogMessage,\n } = useLogListContext();\n const eventBus = useMemo(() => new EventBusSrv(), []);\n const scrollElementRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n const subscription = eventBus.subscribe(ScrollToLogsEvent, (e: ScrollToLogsEvent) =>\n handleScrollToEvent(e, scrollElementRef.current)\n );\n return () => subscription.unsubscribe();\n }, [eventBus]);\n\n useImperativeHandle<HTMLDivElement | null, HTMLDivElement | null>(ref, () => scrollElementRef.current);\n\n const filteredLogs = useMemo(\n () =>\n filterLevels.length === 0\n ? deduplicatedRows\n : deduplicatedRows.filter((log) => filterLevels.includes(log.logLevel)),\n [filterLevels, deduplicatedRows]\n );\n\n const scrollElementClassName = useMemo(() => {\n if (ref) {\n return styles.forwardedScrollableLogRows;\n }\n return config.featureToggles.logsInfiniteScrolling ? styles.scrollableLogRows : styles.logRows;\n }, [ref]);\n\n const scrollIntoView = useCallback(\n (element: HTMLElement) => {\n if (scrollIntoViewProp) {\n scrollIntoViewProp(element);\n return;\n }\n if (scrollElementRef.current) {\n scrollElementRef.current.scroll({\n behavior: 'smooth',\n top: scrollElementRef.current.scrollTop + element.getBoundingClientRect().top - window.innerHeight / 2,\n });\n }\n },\n [scrollIntoViewProp]\n );\n\n return (\n <div className={styles.logRowsContainer}>\n <LogListControls eventBus={eventBus} />\n <div ref={scrollElementRef} className={scrollElementClassName}>\n <InfiniteScroll\n loading={loading}\n loadMoreLogs={loadMoreLogs}\n range={range}\n timeZone={rest.timeZone}\n rows={filteredLogs}\n scrollElement={scrollElementRef.current}\n sortOrder={sortOrder}\n >\n <LogRows\n {...rest}\n app={app}\n dedupStrategy={dedupStrategy}\n deduplicatedRows={filteredLogs}\n forceEscape={forceEscape}\n logRows={filteredLogs}\n logsSortOrder={sortOrder}\n scrollElement={scrollElementRef.current}\n prettifyLogMessage={Boolean(prettifyJSON)}\n scrollIntoView={scrollIntoView}\n showLabels={Boolean(showUniqueLabels)}\n showTime={showTime}\n wrapLogMessage={wrapLogMessage}\n />\n </InfiniteScroll>\n </div>\n </div>\n );\n }\n);\n\nLogRowsComponent.displayName = 'LogRowsComponent';\n\nfunction handleScrollToEvent(event: ScrollToLogsEvent, scrollElement: HTMLDivElement | null) {\n if (event.payload.scrollTo === 'top') {\n scrollElement?.scrollTo(0, 0);\n } else if (scrollElement) {\n scrollElement.scrollTo(0, scrollElement.scrollHeight);\n }\n}\n\nconst styles = {\n scrollableLogRows: css({\n overflowY: 'auto',\n width: '100%',\n maxHeight: '80vh',\n }),\n forwardedScrollableLogRows: css({\n overflowY: 'auto',\n width: '100%',\n maxHeight: '100%',\n }),\n logRows: css({\n overflowX: 'scroll',\n overflowY: 'visible',\n width: '100%',\n }),\n logRowsContainer: css({\n display: 'flex',\n flexDirection: 'row-reverse',\n height: '100%',\n }),\n};\n","import { Grammar } from 'prismjs';\n\nimport { escapeRegex, parseFlags } from '@grafana/data';\n\nimport { LogListModel } from './processing';\n\n// The Logs grammar is used for highlight in the logs panel\nconst logsGrammar: Grammar = {\n 'log-token-key': /(\\b|\\B)[\\w_]+(?=\\s*=)/gi,\n 'log-token-string': /\"(?!:)([^'\"])*?\"(?!:)/g,\n};\n\nconst tokensGrammar: Grammar = {\n 'log-token-uuid': /[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}/g,\n 'log-token-size': /(?:\\b|\")\\d+\\.{0,1}\\d*\\s*[kKmMGgtTPp]*[bB]{1}(?:\"|\\b)/g,\n 'log-token-duration': /(?:\\b)\\d+(\\.\\d+)?(ns|µs|ms|s|m|h|d)(?:\\b)/g,\n 'log-token-method': /\\b(GET|POST|PUT|DELETE|PATCH|HEAD|OPTIONS|TRACE|CONNECT)\\b/g,\n};\n\nconst jsonGrammar: Grammar = {\n 'log-token-json-key': {\n pattern: /(^|[^\\\\])\"(?:\\\\.|[^\\\\\"\\r\\n])*\"(?=\\s*:)/,\n lookbehind: true,\n },\n 'log-token-string': {\n pattern: /(^|[^\\\\])\"(?:\\\\.|[^\\\\\"\\r\\n])*\"(?!\\s*:)/,\n lookbehind: true,\n inside: {\n ...tokensGrammar,\n },\n },\n 'log-token-size': /-?\\b\\d+(?:\\.\\d+)?(?:e[+-]?\\d+)?\\b/i,\n};\n\nexport const generateLogGrammar = (log: LogListModel) => {\n const labels = Object.keys(log.labels).concat(log.fields.map((field) => field.keys[0]));\n const labelGrammar: Grammar = {\n 'log-token-label': new RegExp(`\\\\b(${labels.join('|')})(?:[=:]{1})\\\\b`, 'g'),\n };\n if (log.isJSON) {\n return {\n ...labelGrammar,\n ...jsonGrammar,\n };\n }\n return {\n ...labelGrammar,\n ...tokensGrammar,\n ...logsGrammar,\n };\n};\n\nexport const generateTextMatchGrammar = (highlightWords: string[] | undefined = [], search?: string): Grammar => {\n /**\n * See:\n * - https://github.com/grafana/grafana/blob/96f1582c36f94cf4ac7621b7af86bc9e2ad626fb/public/app/features/logs/components/LogRowMessage.tsx#L67\n * - https://github.com/grafana/grafana/blob/96f1582c36f94cf4ac7621b7af86bc9e2ad626fb/packages/grafana-data/src/text/text.ts#L12\n */\n const expressions = highlightWords\n .map((word) => {\n const { cleaned, flags } = parseFlags(cleanNeedle(word));\n try {\n return new RegExp(`(?:${cleaned})`, flags);\n } catch (e) {\n console.error(`generateTextMatchGrammar: cannot generate regular expression from /${cleaned}/${flags}`, e);\n }\n return undefined;\n })\n .filter((expression) => expression !== undefined);\n\n if (search) {\n try {\n expressions.push(new RegExp(escapeRegex(search), 'gi'));\n } catch (e) {\n console.error(`generateTextMatchGrammar: cannot generate regular expression from /${search}/gi`, e);\n }\n }\n if (!expressions.length) {\n return {};\n }\n return {\n 'log-search-match': expressions,\n };\n};\n\nconst cleanNeedle = (needle: string): string => {\n return needle.replace(/[[{(][\\w,.\\/:;<=>?:*+]+$/, '');\n};\n","import ansicolor from 'ansicolor';\nimport { LosslessNumber, parse, stringify } from 'lossless-json';\nimport Prism, { Grammar, Token } from 'prismjs';\n\nimport {\n DataFrame,\n dateTimeFormat,\n Labels,\n LogLevel,\n LogRowModel,\n LogsSortOrder,\n systemDateFormats,\n} from '@grafana/data';\nimport { t } from '@grafana/i18n';\nimport { config } from '@grafana/runtime';\nimport { GetFieldLinksFn } from 'app/plugins/panel/logs/types';\n\nimport { checkLogsError, checkLogsSampled, escapeUnescapedString, sortLogRows } from '../../utils';\nimport { LOG_LINE_BODY_FIELD_NAME } from '../LogDetailsBody';\nimport { FieldDef, getAllFields } from '../logParser';\nimport { identifyOTelLanguage, getOtelAttributesField, OTEL_LOG_LINE_ATTRIBUTES_FIELD_NAME } from '../otel/formats';\n\nimport { generateLogGrammar, generateTextMatchGrammar } from './grammar';\nimport { LogLineVirtualization } from './virtualization';\n\nconst TRUNCATION_DEFAULT_LENGTH = 50000;\nexport const NEWLINES_REGEX = /(\\r\\n|\\n|\\r)/g;\n\nexport class LogListModel implements LogRowModel {\n collapsed: boolean | undefined = undefined;\n datasourceType: string | undefined;\n dataFrame: DataFrame;\n datasourceUid?: string;\n displayLevel: string;\n duplicates: number | undefined;\n entry: string;\n entryFieldIndex: number;\n hasAnsi: boolean;\n hasError: boolean;\n hasUnescapedContent: boolean;\n isSampled: boolean;\n labels: Labels;\n logLevel: LogLevel;\n otelLanguage?: string;\n raw: string;\n rowIndex: number;\n rowId?: string | undefined;\n searchWords: string[] | undefined;\n timestamp: string;\n timeFromNow: string;\n timeEpochMs: number;\n timeEpochNs: string;\n timeLocal: string;\n timeUtc: string;\n uid: string;\n uniqueLabels: Labels | undefined;\n uniqueLabelsExpanded = false;\n\n private _body: string | undefined = undefined;\n private _currentSearch: string | undefined = undefined;\n private _grammar?: Grammar;\n private _highlightedBody: string | undefined = undefined;\n private _highlightedLogAttributesTokens: Array<string | Token> | undefined = undefined;\n private _highlightTokens: Array<string | Token> | undefined = undefined;\n private _fields: FieldDef[] | undefined = undefined;\n private _getFieldLinks: GetFieldLinksFn | undefined = undefined;\n private _prettifyJSON: boolean;\n private _virtualization?: LogLineVirtualization;\n private _wrapLogMessage: boolean;\n private _json = false;\n\n constructor(\n log: LogRowModel,\n { escape, getFieldLinks, grammar, prettifyJSON, timeZone, virtualization, wrapLogMessage }: PreProcessLogOptions\n ) {\n // LogRowModel\n this.datasourceType = log.datasourceType;\n this.dataFrame = log.dataFrame;\n this.datasourceUid = log.datasourceUid;\n this.duplicates = log.duplicates;\n this.entry = log.entry;\n this.entryFieldIndex = log.entryFieldIndex;\n this.hasAnsi = log.hasAnsi;\n this.hasError = !!checkLogsError(log);\n this.hasUnescapedContent = log.hasUnescapedContent;\n this.isSampled = !!checkLogsSampled(log);\n this.labels = log.labels;\n this.logLevel = log.logLevel;\n this.otelLanguage = identifyOTelLanguage(log);\n this.rowIndex = log.rowIndex;\n this.rowId = log.rowId;\n this.searchWords = log.searchWords;\n this.timeFromNow = log.timeFromNow;\n this.timeEpochMs = log.timeEpochMs;\n this.timeEpochNs = log.timeEpochNs;\n this.timeLocal = log.timeLocal;\n this.timeUtc = log.timeUtc;\n this.uid = log.uid;\n this.uniqueLabels = log.uniqueLabels;\n\n // LogListModel\n this.displayLevel = logLevelToDisplayLevel(log.logLevel);\n this._getFieldLinks = getFieldLinks;\n this._grammar = grammar;\n this._prettifyJSON = Boolean(prettifyJSON);\n this.timestamp = dateTimeFormat(log.timeEpochMs, {\n timeZone,\n // YYYY-MM-DD HH:mm:ss.SSS\n format: systemDateFormats.fullDateMS,\n });\n this._virtualization = virtualization;\n this._wrapLogMessage = wrapLogMessage;\n\n let raw = log.raw;\n if (escape && log.hasUnescapedContent) {\n raw = escapeUnescapedString(raw);\n }\n this.raw = raw;\n\n if (config.featureToggles.otelLogsFormatting && this.otelLanguage) {\n this.labels[OTEL_LOG_LINE_ATTRIBUTES_FIELD_NAME] = getOtelAttributesField(this, wrapLogMessage);\n }\n }\n\n clone() {\n const clone = Object.assign(Object.create(Object.getPrototypeOf(this)), this);\n // Unless this function is required outside of <LogLineDetailsLog />, we create a wrapped clone, so new lines are not stripped.\n clone._wrapLogMessage = true;\n clone._body = undefined;\n clone._highlightTokens = undefined;\n return clone;\n }\n\n get body(): string {\n if (this._body === undefined) {\n try {\n const parsed = parse(this.raw);\n if (typeof parsed === 'object' && parsed !== null && !(parsed instanceof LosslessNumber)) {\n this._json = true;\n }\n const reStringified = this._wrapLogMessage && this._prettifyJSON ? stringify(parsed, undefined, 2) : this.raw;\n if (reStringified) {\n this.raw = reStringified;\n }\n } catch (error) {}\n const raw = this.raw;\n this._body = this.collapsed\n ? raw.substring(0, this._virtualization?.getTruncationLength(null) ?? TRUNCATION_DEFAULT_LENGTH)\n : raw;\n if (!this._wrapLogMessage) {\n this._body = this._body.replace(NEWLINES_REGEX, '');\n }\n }\n return this._body;\n }\n\n get errorMessage(): string | undefined {\n return checkLogsError(this);\n }\n\n get fields(): FieldDef[] {\n if (this._fields === undefined) {\n this._fields = getAllFields(this, this._getFieldLinks);\n }\n return this._fields;\n }\n\n get highlightedBody() {\n if (this._highlightedBody === undefined) {\n // Body is accessed first to trigger the getter code before generateLogGrammar()\n const body = this.body;\n this._grammar = this._grammar ?? generateLogGrammar(this);\n const extraGrammar = generateTextMatchGrammar(this.searchWords, this._currentSearch);\n this._highlightedBody = Prism.highlight(body, { ...extraGrammar, ...this._grammar }, 'logs');\n }\n return this._highlightedBody;\n }\n\n get highlightedBodyTokens() {\n if (this._highlightTokens === undefined) {\n // Body is accessed first to trigger the getter code before generateLogGrammar()\n const body = this.body;\n this._grammar = this._grammar ?? generateLogGrammar(this);\n const extraGrammar = generateTextMatchGrammar(this.searchWords, this._currentSearch);\n this._highlightTokens = Prism.tokenize(body, { ...extraGrammar, ...this._grammar });\n }\n return this._highlightTokens;\n }\n\n get highlightedLogAttributesTokens() {\n if (this._highlightedLogAttributesTokens === undefined) {\n const attributes = this.labels[OTEL_LOG_LINE_ATTRIBUTES_FIELD_NAME] ?? '';\n if (!attributes) {\n return [];\n }\n this._grammar = this._grammar ?? generateLogGrammar(this);\n const extraGrammar = generateTextMatchGrammar(this.searchWords, this._currentSearch);\n this._highlightedLogAttributesTokens = Prism.tokenize(attributes, { ...extraGrammar, ...this._grammar });\n }\n return this._highlightedLogAttributesTokens;\n }\n\n get isJSON() {\n return this._json;\n }\n\n get sampledMessage(): string | undefined {\n return checkLogsSampled(this);\n }\n\n get timestampNs(): string {\n let suffix = this.timeEpochNs.substring(this.timeEpochMs.toString().length);\n return this.timestamp + suffix;\n }\n\n getDisplayedFieldValue(fieldName: string, stripAnsi = false): string {\n if (fieldName === LOG_LINE_BODY_FIELD_NAME) {\n return stripAnsi ? ansicolor.strip(this.body) : this.body;\n }\n let fieldValue = '';\n if (this.labels[fieldName] != null) {\n fieldValue = this.labels[fieldName];\n } else {\n const field = this.fields.find((field) => {\n return field.keys[0] === fieldName;\n });\n\n fieldValue = field ? field.values.toString() : '';\n }\n if (!this._wrapLogMessage) {\n return fieldValue.replace(NEWLINES_REGEX, '');\n }\n return fieldValue;\n }\n\n updateCollapsedState(displayedFields: string[], container: HTMLDivElement | null) {\n const line =\n displayedFields.length > 0\n ? displayedFields.map((field) => this.getDisplayedFieldValue(field, true)).join('')\n : this.body;\n\n // Length truncation\n let collapsed =\n line.length >= (this._virtualization?.getTruncationLength(container) ?? TRUNCATION_DEFAULT_LENGTH)\n ? true\n : undefined;\n\n // Newlines truncation\n if (!collapsed && this._virtualization) {\n const truncationLimit = this._virtualization.getTruncationLineCount();\n collapsed = countNewLines(line, truncationLimit) >= truncationLimit ? true : collapsed;\n }\n\n if (this.collapsed === undefined || collapsed === undefined) {\n this.collapsed = collapsed;\n this._body = undefined;\n this._highlightTokens = undefined;\n }\n }\n\n setCollapsedState(collapsed: boolean) {\n if (this.collapsed !== collapsed) {\n this._body = undefined;\n this._highlightTokens = undefined;\n }\n this.collapsed = collapsed;\n }\n\n setCurrentSearch(search: string | undefined) {\n this._currentSearch = search;\n this._highlightTokens = undefined;\n this._highlightedLogAttributesTokens = undefined;\n }\n}\n\nexport interface PreProcessOptions {\n escape: boolean;\n getFieldLinks?: GetFieldLinksFn;\n order: LogsSortOrder;\n prettifyJSON?: boolean;\n timeZone: string;\n virtualization?: LogLineVirtualization;\n wrapLogMessage: boolean;\n}\n\nexport const preProcessLogs = (\n logs: LogRowModel[],\n { escape, getFieldLinks, order, prettifyJSON, timeZone, virtualization, wrapLogMessage }: PreProcessOptions,\n grammar?: Grammar\n): LogListModel[] => {\n const orderedLogs = sortLogRows(logs, order);\n return orderedLogs.map((log) =>\n preProcessLog(log, {\n escape,\n getFieldLinks,\n grammar,\n prettifyJSON,\n timeZone,\n virtualization,\n wrapLogMessage,\n })\n );\n};\n\ninterface PreProcessLogOptions {\n escape: boolean;\n getFieldLinks?: GetFieldLinksFn;\n grammar?: Grammar;\n prettifyJSON?: boolean;\n timeZone: string;\n virtualization?: LogLineVirtualization;\n wrapLogMessage: boolean;\n}\nconst preProcessLog = (log: LogRowModel, options: PreProcessLogOptions): LogListModel => {\n return new LogListModel(log, options);\n};\n\nfunction logLevelToDisplayLevel(level = '') {\n switch (level) {\n case LogLevel.critical:\n return 'crit';\n case LogLevel.warning:\n return 'warn';\n case LogLevel.unknown:\n return '';\n default:\n return level;\n }\n}\n\nfunction countNewLines(log: string, limit = Infinity) {\n let count = 0;\n for (let i = 0; i < log.length; ++i) {\n // No need to iterate further\n if (count > Infinity) {\n return count;\n }\n if (log[i] === '\\n') {\n count += 1;\n } else if (log[i] === '\\r') {\n count += 1;\n // skip LF in CRLF\n if (log[i] === '\\n') {\n i += 1;\n }\n }\n }\n return count;\n}\n\nexport function getLevelsFromLogs(logs: LogListModel[]) {\n const levels = new Set<LogLevel>();\n for (const log of logs) {\n levels.add(log.logLevel);\n }\n return Array.from(levels).filter((level) => level != null);\n}\n\nexport function getNormalizedFieldName(field: string) {\n if (field === LOG_LINE_BODY_FIELD_NAME) {\n return t('logs.log-line-details.log-line-field', 'Log line');\n } else if (field === OTEL_LOG_LINE_ATTRIBUTES_FIELD_NAME) {\n return t('logs.log-line-details.log-attributes-field', 'OTel attributes');\n }\n return field;\n}\n","// this class generates react-keys that are guaranteed to be unique.\n// it will try to use the provided `maybeId`, but if that's a duplicate,\n// it will use an index-based key.\n// NOTE: it will always add a prefix to the string, this is necessary\n// to avoid the problem if your proposed key would conflict with\n// the index-based names\nexport class UniqueKeyMaker {\n seen: Set<string>;\n count: number;\n constructor() {\n this.seen = new Set();\n this.count = 0;\n }\n\n getKey(proposedKey: string) {\n this.count += 1;\n const maybeKey = `k_${proposedKey}`;\n if (this.seen.has(maybeKey)) {\n return `i_${this.count}`;\n } else {\n this.seen.add(maybeKey);\n return maybeKey;\n }\n }\n}\n","import {\n memo,\n FocusEvent,\n SyntheticEvent,\n useCallback,\n ReactNode,\n useMemo,\n cloneElement,\n isValidElement,\n MouseEvent,\n} from 'react';\n\nimport { LogRowContextOptions, LogRowModel } from '@grafana/data';\nimport { t } from '@grafana/i18n';\nimport { DataQuery } from '@grafana/schema';\nimport { ClipboardButton, IconButton, PopoverContent } from '@grafana/ui';\n\nimport { handleOpenLogsContextClick } from '../utils';\n\nimport { LogRowStyles } from './getLogRowStyles';\n\ninterface Props {\n logText: string;\n row: LogRowModel;\n showContextToggle?: (row: LogRowModel) => boolean;\n onOpenContext: (row: LogRowModel) => void;\n getRowContextQuery?: (\n row: LogRowModel,\n options?: LogRowContextOptions,\n cacheFilters?: boolean\n ) => Promise<DataQuery | null>;\n onPermalinkClick?: (row: LogRowModel) => Promise<void>;\n onPinLine?: (row: LogRowModel) => void;\n onUnpinLine?: (row: LogRowModel) => void;\n pinLineButtonTooltipTitle?: PopoverContent;\n pinned?: boolean;\n styles: LogRowStyles;\n mouseIsOver: boolean;\n onBlur: () => void;\n addonBefore?: ReactNode[];\n addonAfter?: ReactNode[];\n}\n\nexport const LogRowMenuCell = memo(\n ({\n logText,\n onOpenContext,\n onPermalinkClick,\n onPinLine,\n onUnpinLine,\n pinLineButtonTooltipTitle,\n pinned,\n row,\n showContextToggle,\n styles,\n mouseIsOver,\n onBlur,\n getRowContextQuery,\n addonBefore,\n addonAfter,\n }: Props) => {\n const shouldShowContextToggle = useMemo(\n () => (showContextToggle ? showContextToggle(row) : false),\n [row, showContextToggle]\n );\n const onLogRowClick = useCallback((e: SyntheticEvent) => {\n e.stopPropagation();\n }, []);\n const onShowContextClick = useCallback(\n async (event: MouseEvent<HTMLElement>) => {\n event.stopPropagation();\n handleOpenLogsContextClick(event, row, getRowContextQuery, onOpenContext);\n },\n [onOpenContext, getRowContextQuery, row]\n );\n /**\n * For better accessibility support, we listen to the onBlur event here (to hide this component), and\n * to onFocus in LogRow (to show this component).\n */\n const handleBlur = useCallback(\n (e: FocusEvent) => {\n if (!e.currentTarget.contains(e.relatedTarget) && onBlur) {\n onBlur();\n }\n },\n [onBlur]\n );\n const getLogText = useCallback(() => logText, [logText]);\n\n const beforeContent = useMemo(() => {\n if (!addonBefore) {\n return null;\n }\n return addClickListenersToNode(addonBefore, row);\n }, [addonBefore, row]);\n\n const afterContent = useMemo(() => {\n if (!addonAfter) {\n return null;\n }\n return addClickListenersToNode(addonAfter, row);\n }, [addonAfter, row]);\n\n return (\n // We keep this click listener here to prevent the row from being selected when clicking on the menu.\n // eslint-disable-next-line jsx-a11y/click-events-have-key-events, jsx-a11y/no-static-element-interactions\n <span className={`log-row-menu ${styles.rowMenu}`} onClick={onLogRowClick} onBlur={handleBlur}>\n {pinned && !mouseIsOver && (\n <IconButton\n className={styles.unPinButton}\n size=\"md\"\n name=\"gf-pin\"\n onClick={() => onUnpinLine && onUnpinLine(row)}\n tooltip={t('logs.log-row-menu-cell.tooltip-unpin-line', 'Unpin line')}\n tooltipPlacement=\"top\"\n aria-label={t('logs.log-row-menu-cell.aria-label-unpin-line', 'Unpin line')}\n tabIndex={0}\n />\n )}\n {mouseIsOver && (\n <>\n {beforeContent}\n {shouldShowContextToggle && (\n <IconButton\n size=\"md\"\n name=\"gf-show-context\"\n onClick={onShowContextClick}\n tooltip={t('logs.log-row-menu-cell.tooltip-show-context', 'Show context')}\n tooltipPlacement=\"top\"\n aria-label={t('logs.log-row-menu-cell.aria-label-show-context', 'Show context')}\n tabIndex={0}\n />\n )}\n <ClipboardButton\n className={styles.copyLogButton}\n icon=\"copy\"\n variant=\"secondary\"\n fill=\"text\"\n size=\"md\"\n getText={getLogText}\n tooltip={t('logs.log-row-menu-cell.tooltip-copy-to-clipboard', 'Copy to clipboard')}\n tooltipPlacement=\"top\"\n tabIndex={0}\n />\n {pinned && onUnpinLine && (\n <IconButton\n className={styles.unPinButton}\n size=\"md\"\n name=\"gf-pin\"\n onClick={() => onUnpinLine && onUnpinLine(row)}\n tooltip={t('logs.log-row-menu-cell.tooltip-unpin-line', 'Unpin line')}\n tooltipPlacement=\"top\"\n aria-label={t('logs.log-row-menu-cell.aria-label-unpin-line', 'Unpin line')}\n tabIndex={0}\n />\n )}\n {!pinned && onPinLine && (\n <IconButton\n className={styles.unPinButton}\n size=\"md\"\n name=\"gf-pin\"\n onClick={() => onPinLine && onPinLine(row)}\n tooltip={pinLineButtonTooltipTitle ?? 'Pin line'}\n tooltipPlacement=\"top\"\n aria-label={t('logs.log-row-menu-cell.aria-label-pin-line', 'Pin line')}\n tabIndex={0}\n />\n )}\n {onPermalinkClick && row.rowId !== undefined && row.uid && (\n <IconButton\n tooltip={t('logs.log-row-menu-cell.tooltip-copy-shortlink', 'Copy shortlink')}\n aria-label={t('logs.log-row-menu-cell.aria-label-copy-shortlink', 'Copy shortlink')}\n tooltipPlacement=\"top\"\n size=\"md\"\n name=\"share-alt\"\n onClick={() => onPermalinkClick(row)}\n tabIndex={0}\n />\n )}\n {afterContent}\n </>\n )}\n </span>\n );\n }\n);\n\ntype AddonOnClickListener = (event: MouseEvent, row: LogRowModel) => void | undefined;\nfunction addClickListenersToNode(nodes: ReactNode[], row: LogRowModel) {\n return nodes.map((node, index) => {\n if (isValidElement(node)) {\n const onClick: AddonOnClickListener = node.props.onClick;\n if (!onClick) {\n return node;\n }\n return cloneElement(node, {\n onClick: (event: MouseEvent<HTMLElement>) => {\n onClick(event, row);\n },\n key: index,\n });\n }\n return node;\n });\n}\n\nLogRowMenuCell.displayName = 'LogRowMenuCell';\n","import { css } from '@emotion/css';\nimport { memo, ReactNode, SyntheticEvent, useMemo, useState } from 'react';\nimport Highlighter from 'react-highlight-words';\n\nimport { CoreApp, findHighlightChunksInText, GrafanaTheme2, LogRowContextOptions, LogRowModel } from '@grafana/data';\nimport { Trans } from '@grafana/i18n';\nimport { DataQuery } from '@grafana/schema';\nimport { PopoverContent, useTheme2 } from '@grafana/ui';\n\nimport { escapeUnescapedString } from '../utils';\n\nimport { LogMessageAnsi } from './LogMessageAnsi';\nimport { LogRowMenuCell } from './LogRowMenuCell';\nimport { LogRowStyles } from './getLogRowStyles';\n\nexport const MAX_CHARACTERS = 100000;\n\ninterface Props {\n row: LogRowModel;\n wrapLogMessage: boolean;\n prettifyLogMessage: boolean;\n app?: CoreApp;\n showContextToggle?: (row: LogRowModel) => boolean;\n onOpenContext: (row: LogRowModel) => void;\n getRowContextQuery?: (\n row: LogRowModel,\n options?: LogRowContextOptions,\n cacheFilters?: boolean\n ) => Promise<DataQuery | null>;\n onPermalinkClick?: (row: LogRowModel) => Promise<void>;\n onPinLine?: (row: LogRowModel) => void;\n onUnpinLine?: (row: LogRowModel) => void;\n pinLineButtonTooltipTitle?: PopoverContent;\n pinned?: boolean;\n styles: LogRowStyles;\n mouseIsOver: boolean;\n onBlur: () => void;\n expanded?: boolean;\n logRowMenuIconsBefore?: ReactNode[];\n logRowMenuIconsAfter?: ReactNode[];\n forceEscape?: boolean;\n}\n\ninterface LogMessageProps {\n hasAnsi: boolean;\n entry: string;\n highlights: string[] | undefined;\n styles: LogRowStyles;\n}\n\nconst LogMessage = ({ hasAnsi, entry, highlights, styles }: LogMessageProps) => {\n const excessCharacters = useMemo(() => entry.length - MAX_CHARACTERS, [entry]);\n const needsHighlighter =\n highlights && highlights.length > 0 && highlights[0] && highlights[0].length > 0 && excessCharacters <= 0;\n const searchWords = highlights ?? [];\n const [showFull, setShowFull] = useState(excessCharacters < 0);\n const truncatedEntry = useMemo(() => (showFull ? entry : entry.substring(0, MAX_CHARACTERS)), [entry, showFull]);\n\n if (hasAnsi) {\n const highlight = needsHighlighter ? { searchWords, highlightClassName: styles.logsRowMatchHighLight } : undefined;\n return <LogMessageAnsi value={truncatedEntry} highlight={highlight} />;\n } else if (needsHighlighter) {\n return (\n <Highlighter\n textToHighlight={truncatedEntry}\n searchWords={searchWords}\n findChunks={findHighlightChunksInText}\n highlightClassName={styles.logsRowMatchHighLight}\n />\n );\n }\n return (\n <>\n {truncatedEntry}\n {!showFull && <Ellipsis showFull={showFull} toggle={setShowFull} diff={excessCharacters} />}\n </>\n );\n};\n\ninterface EllipsisProps {\n showFull: boolean;\n toggle(state: boolean): void;\n diff: number;\n}\nconst Ellipsis = ({ toggle, diff }: EllipsisProps) => {\n const styles = getEllipsisStyles(useTheme2());\n const handleClick = (e: SyntheticEvent) => {\n e.stopPropagation();\n toggle(true);\n };\n return (\n <>\n <Trans i18nKey=\"logs.log-row-message.ellipsis\">… </Trans>\n <button className={styles.showMore} onClick={handleClick}>\n {diff} <Trans i18nKey=\"logs.log-row-message.more\">more</Trans>\n </button>\n </>\n );\n};\n\nconst getEllipsisStyles = (theme: GrafanaTheme2) => ({\n showMore: css({\n backgroundColor: 'transparent',\n display: 'inline-flex',\n fontWeight: theme.typography.fontWeightMedium,\n fontSize: theme.typography.size.sm,\n fontFamily: theme.typography.fontFamily,\n height: theme.spacing(3),\n padding: theme.spacing(0.25, 1),\n color: theme.colors.secondary.text,\n border: `1px solid ${theme.colors.border.strong}`,\n '&:hover': {\n background: theme.colors.secondary.transparent,\n borderColor: theme.colors.emphasize(theme.colors.border.strong, 0.25),\n color: theme.colors.secondary.text,\n },\n }),\n});\n\nconst restructureLog = (\n row: LogRowModel,\n prettifyLogMessage: boolean,\n wrapLogMessage: boolean,\n expanded: boolean,\n forceEscape: boolean\n): string => {\n let line = row.raw;\n if (prettifyLogMessage) {\n try {\n line = JSON.stringify(JSON.parse(line), undefined, 2);\n return row.hasUnescapedContent && forceEscape ? escapeUnescapedString(line) : line;\n } catch (error) {}\n }\n if (row.hasUnescapedContent && forceEscape) {\n line = escapeUnescapedString(line);\n }\n // With wrapping disabled, we want to turn it into a single-line log entry unless the line is expanded\n if (!wrapLogMessage && !expanded) {\n line = line.replace(/(\\r\\n|\\n|\\r)/g, '');\n }\n return line;\n};\n\nexport const LogRowMessage = memo((props: Props) => {\n const {\n row,\n wrapLogMessage,\n prettifyLogMessage,\n showContextToggle,\n styles,\n onOpenContext,\n onPermalinkClick,\n onUnpinLine,\n onPinLine,\n pinLineButtonTooltipTitle,\n pinned,\n mouseIsOver,\n onBlur,\n getRowContextQuery,\n expanded,\n logRowMenuIconsBefore,\n logRowMenuIconsAfter,\n forceEscape,\n } = props;\n const { hasAnsi } = row;\n const restructuredEntry = useMemo(\n () => restructureLog(row, prettifyLogMessage, wrapLogMessage, Boolean(expanded), Boolean(forceEscape)),\n [expanded, forceEscape, prettifyLogMessage, row, wrapLogMessage]\n );\n const shouldShowMenu = mouseIsOver || pinned;\n\n return (\n <>\n {\n // When context is open, the position has to be NOT relative. // Setting the postion as inline-style to\n // overwrite the more sepecific style definition from `styles.logsRowMessage`.\n }\n <td className={styles.logsRowMessage}>\n <div className={wrapLogMessage ? styles.positionRelative : styles.horizontalScroll}>\n <div className={`${styles.logLine} ${styles.positionRelative}`}>\n <LogMessage hasAnsi={hasAnsi} entry={restructuredEntry} highlights={row.searchWords} styles={styles} />\n </div>\n </div>\n </td>\n <td className={`log-row-menu-cell ${styles.logRowMenuCell}`}>\n {shouldShowMenu && (\n <LogRowMenuCell\n logText={restructuredEntry}\n row={row}\n showContextToggle={showContextToggle}\n getRowContextQuery={getRowContextQuery}\n onOpenContext={onOpenContext}\n onPermalinkClick={onPermalinkClick}\n onPinLine={onPinLine}\n onUnpinLine={onUnpinLine}\n pinLineButtonTooltipTitle={pinLineButtonTooltipTitle}\n pinned={pinned}\n styles={styles}\n mouseIsOver={mouseIsOver}\n onBlur={onBlur}\n addonBefore={logRowMenuIconsBefore}\n addonAfter={logRowMenuIconsAfter}\n />\n )}\n </td>\n </>\n );\n});\n\nLogRowMessage.displayName = 'LogRowMessage';\n","import { css } from '@emotion/css';\nimport { memo, ReactNode, useMemo } from 'react';\n\nimport { LogRowModel } from '@grafana/data';\nimport { GetFieldLinksFn } from 'app/plugins/panel/logs/types';\n\nimport { LOG_LINE_BODY_FIELD_NAME } from './LogDetailsBody';\nimport { LogRowMenuCell } from './LogRowMenuCell';\nimport { LogRowStyles } from './getLogRowStyles';\nimport { getAllFields } from './logParser';\n\nexport interface Props {\n row: LogRowModel;\n detectedFields: string[];\n wrapLogMessage: boolean;\n getFieldLinks?: GetFieldLinksFn;\n styles: LogRowStyles;\n showContextToggle?: (row: LogRowModel) => boolean;\n onOpenContext: (row: LogRowModel) => void;\n onPermalinkClick?: (row: LogRowModel) => Promise<void>;\n onPinLine?: (row: LogRowModel) => void;\n onUnpinLine?: (row: LogRowModel) => void;\n pinned?: boolean;\n mouseIsOver: boolean;\n onBlur: () => void;\n logRowMenuIconsBefore?: ReactNode[];\n logRowMenuIconsAfter?: ReactNode[];\n preview?: boolean;\n}\n\nexport const LogRowMessageDisplayedFields = memo((props: Props) => {\n const {\n row,\n detectedFields,\n getFieldLinks,\n wrapLogMessage,\n styles,\n mouseIsOver,\n pinned,\n logRowMenuIconsBefore,\n logRowMenuIconsAfter,\n preview,\n ...rest\n } = props;\n const wrapClassName = wrapLogMessage ? '' : displayedFieldsStyles.noWrap;\n const fields = useMemo(() => getAllFields(row, getFieldLinks), [getFieldLinks, row]);\n // only single key/value rows are filterable, so we only need the first field key for filtering\n const line = useMemo(() => {\n let line = '';\n for (let i = 0; i < detectedFields.length; i++) {\n const parsedKey = detectedFields[i];\n\n if (parsedKey === LOG_LINE_BODY_FIELD_NAME) {\n line += ` ${row.entry}`;\n }\n\n const field = fields.find((field) => {\n return field.keys[0] === parsedKey;\n });\n\n if (field != null) {\n line += ` ${parsedKey}=${field.values}`;\n }\n\n if (row.labels[parsedKey] != null && row.labels[parsedKey] != null) {\n line += ` ${parsedKey}=${row.labels[parsedKey]}`;\n }\n }\n return line.trimStart();\n }, [detectedFields, fields, row.entry, row.labels]);\n\n const shouldShowMenu = mouseIsOver || pinned;\n\n if (preview) {\n return (\n <>\n <td>\n <div>{line}</div>\n </td>\n <td></td>\n </>\n );\n }\n\n return (\n <>\n <td className={styles.logsRowMessage}>\n <div className={wrapClassName}>{line}</div>\n </td>\n <td className={`log-row-menu-cell ${styles.logRowMenuCell}`}>\n {shouldShowMenu && (\n <LogRowMenuCell\n logText={line}\n row={row}\n styles={styles}\n pinned={pinned}\n mouseIsOver={mouseIsOver}\n addonBefore={logRowMenuIconsBefore}\n addonAfter={logRowMenuIconsAfter}\n {...rest}\n />\n )}\n </td>\n </>\n );\n});\n\nconst displayedFieldsStyles = {\n noWrap: css({\n whiteSpace: 'nowrap',\n }),\n};\n\nLogRowMessageDisplayedFields.displayName = 'LogRowMessageDisplayedFields';\n","import { debounce } from 'lodash';\nimport { MouseEvent, ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport {\n CoreApp,\n DataFrame,\n dateTimeFormat,\n LogRowContextOptions,\n LogRowModel,\n LogsSortOrder,\n TimeRange,\n} from '@grafana/data';\nimport { t } from '@grafana/i18n';\nimport { reportInteraction } from '@grafana/runtime';\nimport { DataQuery, TimeZone } from '@grafana/schema';\nimport { Icon, PopoverContent, Tooltip, useTheme2 } from '@grafana/ui';\nimport { GetFieldLinksFn } from 'app/plugins/panel/logs/types';\n\nimport { checkLogsError, checkLogsSampled, escapeUnescapedString } from '../utils';\n\nimport { LogDetails } from './LogDetails';\nimport { LogLabels } from './LogLabels';\nimport { LogRowMessage } from './LogRowMessage';\nimport { LogRowMessageDisplayedFields } from './LogRowMessageDisplayedFields';\nimport { getLogLevelStyles, LogRowStyles } from './getLogRowStyles';\n\nexport interface Props {\n row: LogRowModel;\n showDuplicates: boolean;\n showLabels: boolean;\n showTime: boolean;\n wrapLogMessage: boolean;\n prettifyLogMessage: boolean;\n timeZone: TimeZone;\n enableLogDetails: boolean;\n logsSortOrder?: LogsSortOrder | null;\n forceEscape?: boolean;\n app?: CoreApp;\n displayedFields?: string[];\n getRows: () => LogRowModel[];\n onClickFilterLabel?: (key: string, value: string, frame?: DataFrame) => void;\n onClickFilterOutLabel?: (key: string, value: string, frame?: DataFrame) => void;\n onContextClick?: () => void;\n getFieldLinks?: GetFieldLinksFn;\n showContextToggle?: (row: LogRowModel) => boolean;\n onClickShowField?: (key: string) => void;\n onClickHideField?: (key: string) => void;\n onLogRowHover?: (row?: LogRowModel) => void;\n onOpenContext: (row: LogRowModel, onClose: () => void) => void;\n getRowContextQuery?: (\n row: LogRowModel,\n options?: LogRowContextOptions,\n cacheFilters?: boolean\n ) => Promise<DataQuery | null>;\n onPermalinkClick?: (row: LogRowModel) => Promise<void>;\n styles: LogRowStyles;\n permalinkedRowId?: string;\n scrollIntoView?: (element: HTMLElement) => void;\n isFilterLabelActive?: (key: string, value: string, refId?: string) => Promise<boolean>;\n onPinLine?: (row: LogRowModel, allowUnPin?: boolean) => void;\n onUnpinLine?: (row: LogRowModel) => void;\n pinLineButtonTooltipTitle?: PopoverContent;\n pinned?: boolean;\n handleTextSelection?: (e: MouseEvent<HTMLTableRowElement>, row: LogRowModel) => boolean;\n logRowMenuIconsBefore?: ReactNode[];\n logRowMenuIconsAfter?: ReactNode[];\n timeRange: TimeRange;\n}\n\nexport const LogRow = ({\n getRows,\n onClickFilterLabel,\n onClickFilterOutLabel,\n onClickShowField,\n onClickHideField,\n enableLogDetails,\n row,\n showDuplicates,\n showContextToggle,\n showLabels,\n showTime,\n displayedFields,\n wrapLogMessage,\n prettifyLogMessage,\n getFieldLinks,\n forceEscape,\n app,\n styles,\n getRowContextQuery,\n pinned,\n logRowMenuIconsBefore,\n logRowMenuIconsAfter,\n timeZone,\n permalinkedRowId,\n scrollIntoView,\n handleTextSelection,\n onLogRowHover,\n ...props\n}: Props) => {\n const [showingContext, setShowingContext] = useState(false);\n const [showDetails, setShowDetails] = useState(false);\n const [mouseIsOver, setMouseIsOver] = useState(false);\n const [permalinked, setPermalinked] = useState(false);\n const logLineRef = useRef<HTMLTableRowElement | null>(null);\n const theme = useTheme2();\n\n const timestamp = useMemo(\n () =>\n dateTimeFormat(row.timeEpochMs, {\n timeZone: timeZone,\n defaultWithMS: true,\n }),\n [row.timeEpochMs, timeZone]\n );\n const levelStyles = useMemo(() => getLogLevelStyles(theme, row.logLevel), [row.logLevel, theme]);\n const processedRow = useMemo(\n () => (row.hasUnescapedContent && forceEscape ? { ...row, entry: escapeUnescapedString(row.entry) } : row),\n [forceEscape, row]\n );\n const errorMessage = checkLogsError(row);\n const hasError = errorMessage !== undefined;\n const sampleMessage = checkLogsSampled(row);\n const isSampled = sampleMessage !== undefined;\n\n useEffect(() => {\n if (permalinkedRowId !== row.uid) {\n setPermalinked(false);\n return;\n }\n if (!permalinked) {\n setPermalinked(true);\n return;\n }\n\n if (logLineRef.current && scrollIntoView) {\n // at this point this row is the permalinked row, so we need to scroll to it and highlight it if possible.\n scrollIntoView(logLineRef.current);\n reportInteraction('grafana_explore_logs_permalink_opened', {\n datasourceType: row.datasourceType ?? 'unknown',\n logRowUid: row.uid,\n });\n setPermalinked(true);\n }\n }, [permalinked, permalinkedRowId, row.datasourceType, row.uid, scrollIntoView]);\n\n // we are debouncing the state change by 3 seconds to highlight the logline after the context closed.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n const debouncedContextClose = useCallback(\n debounce(() => {\n setShowingContext(false);\n }, 3000),\n []\n );\n\n const onOpenContext = useCallback(\n (row: LogRowModel) => {\n setShowingContext(true);\n props.onOpenContext(row, debouncedContextClose);\n },\n [debouncedContextClose, props]\n );\n\n const onRowClick = useCallback(\n (e: MouseEvent<HTMLTableRowElement>) => {\n if (handleTextSelection?.(e, row)) {\n // Event handled by the parent.\n return;\n }\n\n if (!enableLogDetails) {\n return;\n }\n\n setShowDetails((showDetails: boolean) => !showDetails);\n },\n [enableLogDetails, handleTextSelection, row]\n );\n\n const onMouseEnter = useCallback(() => {\n setMouseIsOver(true);\n if (onLogRowHover) {\n onLogRowHover(row);\n }\n }, [onLogRowHover, row]);\n\n const onMouseMove = useCallback(\n (e: MouseEvent) => {\n // No need to worry about text selection.\n if (!handleTextSelection) {\n return;\n }\n // The user is selecting text, so hide the log row menu so it doesn't interfere.\n if (document.getSelection()?.toString() && e.buttons > 0) {\n setMouseIsOver(false);\n }\n },\n [handleTextSelection]\n );\n\n const onMouseLeave = useCallback(() => {\n setMouseIsOver(false);\n }, []);\n\n return (\n <>\n <tr\n ref={logLineRef}\n className={`${styles.logsRow} ${hasError ? styles.errorLogRow : ''} ${showingContext || permalinked || pinned ? styles.highlightBackground : ''}`}\n onClick={onRowClick}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n onMouseMove={onMouseMove}\n /**\n * For better accessibility support, we listen to the onFocus event here (to display the LogRowMenuCell), and\n * to onBlur event in the LogRowMenuCell (to hide it). This way, the LogRowMenuCell is displayed when the user navigates\n * using the keyboard.\n */\n onFocus={onMouseEnter}\n >\n {showDuplicates && (\n <td className={styles.logsRowDuplicates}>\n {processedRow.duplicates && processedRow.duplicates > 0 ? `${processedRow.duplicates + 1}x` : null}\n </td>\n )}\n <td\n className={\n hasError || isSampled ? styles.logsRowWithError : `${levelStyles.logsRowLevelColor} ${styles.logsRowLevel}`\n }\n >\n {hasError && (\n <Tooltip\n content={t('logs.log-row-message.tooltip-error', 'Error: {{errorMessage}}', { errorMessage })}\n placement=\"right\"\n theme=\"error\"\n >\n <Icon className={styles.logIconError} name=\"exclamation-triangle\" size=\"xs\" />\n </Tooltip>\n )}\n {isSampled && (\n <Tooltip content={sampleMessage} placement=\"right\" theme=\"info\">\n <Icon className={styles.logIconInfo} name=\"info-circle\" size=\"xs\" />\n </Tooltip>\n )}\n </td>\n <td\n title={enableLogDetails ? (showDetails ? 'Hide log details' : 'See log details') : ''}\n className={enableLogDetails ? styles.logsRowToggleDetails : ''}\n >\n {enableLogDetails && (\n <button\n aria-label={t('logs.log-row-message.see-details', `See log details`)}\n className={styles.detailsToggle}\n aria-expanded={showDetails}\n >\n <Icon className={styles.topVerticalAlign} name={showDetails ? 'angle-down' : 'angle-right'} />\n </button>\n )}\n </td>\n {showTime && <td className={styles.logsRowLocalTime}>{timestamp}</td>}\n {showLabels && processedRow.uniqueLabels && (\n <td className={styles.logsRowLabels}>\n <LogLabels labels={processedRow.uniqueLabels} addTooltip={false} />\n </td>\n )}\n {displayedFields && displayedFields.length > 0 ? (\n <LogRowMessageDisplayedFields\n row={processedRow}\n showContextToggle={showContextToggle}\n detectedFields={displayedFields}\n getFieldLinks={getFieldLinks}\n wrapLogMessage={wrapLogMessage}\n onOpenContext={onOpenContext}\n onPermalinkClick={props.onPermalinkClick}\n styles={styles}\n onPinLine={props.onPinLine}\n onUnpinLine={props.onUnpinLine}\n pinned={pinned}\n mouseIsOver={mouseIsOver}\n onBlur={onMouseLeave}\n logRowMenuIconsBefore={logRowMenuIconsBefore}\n logRowMenuIconsAfter={logRowMenuIconsAfter}\n />\n ) : (\n <LogRowMessage\n row={processedRow}\n showContextToggle={showContextToggle}\n getRowContextQuery={getRowContextQuery}\n wrapLogMessage={wrapLogMessage}\n prettifyLogMessage={prettifyLogMessage}\n onOpenContext={onOpenContext}\n onPermalinkClick={props.onPermalinkClick}\n app={app}\n styles={styles}\n onPinLine={props.onPinLine}\n onUnpinLine={props.onUnpinLine}\n pinLineButtonTooltipTitle={props.pinLineButtonTooltipTitle}\n pinned={pinned}\n mouseIsOver={mouseIsOver}\n onBlur={onMouseLeave}\n expanded={showDetails}\n forceEscape={forceEscape}\n logRowMenuIconsBefore={logRowMenuIconsBefore}\n logRowMenuIconsAfter={logRowMenuIconsAfter}\n />\n )}\n </tr>\n {showDetails && (\n <LogDetails\n onPinLine={props.onPinLine}\n className={`${styles.logsRow} ${hasError ? styles.errorLogRow : ''} ${permalinked && !showDetails ? styles.highlightBackground : ''}`}\n showDuplicates={showDuplicates}\n getFieldLinks={getFieldLinks}\n onClickFilterLabel={onClickFilterLabel}\n onClickFilterOutLabel={onClickFilterOutLabel}\n onClickShowField={onClickShowField}\n onClickHideField={onClickHideField}\n getRows={getRows}\n row={processedRow}\n wrapLogMessage={wrapLogMessage}\n hasError={hasError}\n displayedFields={displayedFields}\n app={app}\n styles={styles}\n isFilterLabelActive={props.isFilterLabelActive}\n pinLineButtonTooltipTitle={props.pinLineButtonTooltipTitle}\n timeRange={props.timeRange}\n />\n )}\n </>\n );\n};\n","import { Props } from './LogRow';\nimport { LogRowMessageDisplayedFields } from './LogRowMessageDisplayedFields';\n\nconst emptyFn = () => {};\nexport const PreviewLogRow = ({ row, showDuplicates, showLabels, showTime, displayedFields, ...rest }: Props) => {\n return (\n <tr>\n {showDuplicates && <td></td>}\n <td></td>\n <td></td>\n {showTime && <td>{row.timeEpochMs}</td>}\n {showLabels && row.uniqueLabels && <td></td>}\n {displayedFields && displayedFields.length > 0 ? (\n <LogRowMessageDisplayedFields\n {...rest}\n row={row}\n detectedFields={displayedFields}\n mouseIsOver={false}\n onBlur={emptyFn}\n onOpenContext={emptyFn}\n preview\n />\n ) : (\n <td className={rest.styles.logsRowMessage}>{row.entry}</td>\n )}\n <td className={`log-row-menu-cell ${rest.styles.logRowMenuCell}`}></td>\n </tr>\n );\n};\n","import { cx } from '@emotion/css';\nimport { MouseEvent, ReactNode, useState, useMemo, useCallback, useRef, useEffect, memo } from 'react';\n\nimport {\n TimeZone,\n LogsDedupStrategy,\n LogRowModel,\n LogsSortOrder,\n CoreApp,\n DataFrame,\n LogRowContextOptions,\n TimeRange,\n} from '@grafana/data';\nimport { Trans, t } from '@grafana/i18n';\nimport { config } from '@grafana/runtime';\nimport { DataQuery } from '@grafana/schema';\nimport { ConfirmModal, Icon, PopoverContent, useTheme2 } from '@grafana/ui';\nimport { GetFieldLinksFn } from 'app/plugins/panel/logs/types';\n\nimport { PopoverMenu } from '../../explore/Logs/PopoverMenu';\nimport { UniqueKeyMaker } from '../UniqueKeyMaker';\nimport { disablePopoverMenu, enablePopoverMenu, isPopoverMenuDisabled, sortLogRows, targetIsElement } from '../utils';\n\n//Components\nimport { LogRow } from './LogRow';\nimport { PreviewLogRow } from './PreviewLogRow';\nimport { getLogRowStyles } from './getLogRowStyles';\n\nexport interface Props {\n logRows?: LogRowModel[];\n deduplicatedRows?: LogRowModel[];\n dedupStrategy: LogsDedupStrategy;\n showLabels: boolean;\n showTime: boolean;\n wrapLogMessage: boolean;\n prettifyLogMessage: boolean;\n timeZone: TimeZone;\n enableLogDetails: boolean;\n logsSortOrder?: LogsSortOrder | null;\n previewLimit?: number;\n forceEscape?: boolean;\n displayedFields?: string[];\n app?: CoreApp;\n showContextToggle?: (row: LogRowModel) => boolean;\n onClickFilterLabel?: (key: string, value: string, frame?: DataFrame) => void;\n onClickFilterOutLabel?: (key: string, value: string, frame?: DataFrame) => void;\n getFieldLinks?: GetFieldLinksFn;\n onClickShowField?: (key: string) => void;\n onClickHideField?: (key: string) => void;\n onPinLine?: (row: LogRowModel, allowUnPin?: boolean) => void;\n onUnpinLine?: (row: LogRowModel) => void;\n pinLineButtonTooltipTitle?: PopoverContent;\n onLogRowHover?: (row?: LogRowModel) => void;\n onOpenContext?: (row: LogRowModel, onClose: () => void) => void;\n getRowContextQuery?: (\n row: LogRowModel,\n options?: LogRowContextOptions,\n cacheFilters?: boolean\n ) => Promise<DataQuery | null>;\n onPermalinkClick?: (row: LogRowModel) => Promise<void>;\n permalinkedRowId?: string;\n scrollIntoView?: (element: HTMLElement) => void;\n isFilterLabelActive?: (key: string, value: string, refId?: string) => Promise<boolean>;\n pinnedLogs?: string[];\n timeRange: TimeRange;\n /**\n * If false or undefined, the `contain:strict` css property will be added to the wrapping `<table>` for performance reasons.\n * Any overflowing content will be clipped at the table boundary.\n */\n overflowingContent?: boolean;\n onClickFilterString?: (value: string, refId?: string) => void;\n onClickFilterOutString?: (value: string, refId?: string) => void;\n logRowMenuIconsBefore?: ReactNode[];\n logRowMenuIconsAfter?: ReactNode[];\n scrollElement: HTMLDivElement | null;\n renderPreview?: boolean;\n}\n\nexport type PopoverStateType = {\n selection: string;\n selectedRow: LogRowModel | null;\n popoverMenuCoordinates: { x: number; y: number };\n};\n\nexport const LogRows = memo(\n ({\n deduplicatedRows,\n logRows = [],\n dedupStrategy,\n logsSortOrder,\n previewLimit,\n pinnedLogs,\n onOpenContext,\n onClickFilterOutString,\n onClickFilterString,\n scrollElement,\n renderPreview = false,\n enableLogDetails,\n permalinkedRowId,\n ...props\n }: Props) => {\n const [previewSize, setPreviewSize] = useState(\n /**\n * If renderPreview is enabled, either half of the log rows or twice the screen size of log rows will be rendered.\n * The biggest of those values will be used. Else, all rows are rendered.\n */\n renderPreview && !permalinkedRowId\n ? Math.max(2 * Math.ceil(window.innerHeight / 20), Math.ceil(logRows.length / 3))\n : Infinity\n );\n const [popoverState, setPopoverState] = useState<PopoverStateType>({\n selection: '',\n selectedRow: null,\n popoverMenuCoordinates: { x: 0, y: 0 },\n });\n const [showDisablePopoverOptions, setShowDisablePopoverOptions] = useState(false);\n const logRowsRef = useRef<HTMLDivElement>(null);\n const theme = useTheme2();\n const styles = getLogRowStyles(theme);\n const dedupedRows = deduplicatedRows ? deduplicatedRows : logRows;\n const dedupCount = useMemo(\n () => dedupedRows.reduce((sum, row) => (row.duplicates ? sum + row.duplicates : sum), 0),\n [dedupedRows]\n );\n const showDuplicates = dedupStrategy !== LogsDedupStrategy.none && dedupCount > 0;\n const orderedRows = useMemo(\n () => (logsSortOrder ? sortLogRows(dedupedRows, logsSortOrder) : dedupedRows),\n [dedupedRows, logsSortOrder]\n );\n // React profiler becomes unusable if we pass all rows to all rows and their labels, using getter instead\n const getRows = useMemo(() => () => orderedRows, [orderedRows]);\n const handleDeselectionRef = useRef<((e: Event) => void) | null>(null);\n const keyMaker = new UniqueKeyMaker();\n\n useEffect(() => {\n return () => {\n if (handleDeselectionRef.current) {\n document.removeEventListener('click', handleDeselectionRef.current);\n document.removeEventListener('contextmenu', handleDeselectionRef.current);\n }\n };\n }, []);\n\n useEffect(() => {\n if (!scrollElement) {\n return;\n }\n\n function renderAll() {\n setPreviewSize(Infinity);\n scrollElement?.removeEventListener('scroll', renderAll);\n scrollElement?.removeEventListener('wheel', renderAll);\n }\n\n scrollElement.addEventListener('scroll', renderAll);\n scrollElement.addEventListener('wheel', renderAll);\n }, [logRows.length, scrollElement]);\n\n /**\n * Toggle the `contextIsOpen` state when a context of one LogRow is opened in order to not show the menu of the other log rows.\n */\n const openContext = useCallback(\n (row: LogRowModel, onClose: () => void): void => {\n if (onOpenContext) {\n onOpenContext(row, onClose);\n }\n },\n [onOpenContext]\n );\n\n const popoverMenuSupported = useCallback(() => {\n if (!config.featureToggles.logRowsPopoverMenu || isPopoverMenuDisabled()) {\n return false;\n }\n return Boolean(onClickFilterOutString || onClickFilterString);\n }, [onClickFilterOutString, onClickFilterString]);\n\n const closePopoverMenu = useCallback(() => {\n if (handleDeselectionRef.current) {\n document.removeEventListener('click', handleDeselectionRef.current);\n document.removeEventListener('contextmenu', handleDeselectionRef.current);\n handleDeselectionRef.current = null;\n }\n setPopoverState({\n selection: '',\n popoverMenuCoordinates: { x: 0, y: 0 },\n selectedRow: null,\n });\n }, []);\n\n const handleDeselection = useCallback(\n (e: Event) => {\n if (targetIsElement(e.target) && !logRowsRef.current?.contains(e.target)) {\n // The mouseup event comes from outside the log rows, close the menu.\n closePopoverMenu();\n return;\n }\n if (document.getSelection()?.toString()) {\n return;\n }\n closePopoverMenu();\n },\n [closePopoverMenu]\n );\n\n const handleSelection = useCallback(\n (e: MouseEvent<HTMLElement>, row: LogRowModel): boolean => {\n const selection = document.getSelection()?.toString();\n if (!selection) {\n return false;\n }\n if (e.altKey) {\n enablePopoverMenu();\n }\n if (popoverMenuSupported() === false) {\n // This signals onRowClick inside LogRow to skip the event because the user is selecting text\n return selection ? true : false;\n }\n\n if (!logRowsRef.current) {\n return false;\n }\n\n const MENU_WIDTH = 270;\n const MENU_HEIGHT = 105;\n const x = e.clientX + MENU_WIDTH > window.innerWidth ? window.innerWidth - MENU_WIDTH : e.clientX;\n const y = e.clientY + MENU_HEIGHT > window.innerHeight ? window.innerHeight - MENU_HEIGHT : e.clientY;\n\n setPopoverState({\n selection,\n popoverMenuCoordinates: { x, y },\n selectedRow: row,\n });\n handleDeselectionRef.current = handleDeselection;\n document.addEventListener('click', handleDeselection);\n document.addEventListener('contextmenu', handleDeselection);\n return true;\n },\n [handleDeselection, popoverMenuSupported]\n );\n\n const onDisablePopoverMenu = useCallback(() => {\n setShowDisablePopoverOptions(true);\n }, []);\n\n const onDisableCancel = useCallback(() => {\n setShowDisablePopoverOptions(false);\n }, []);\n\n const onDisableConfirm = useCallback(() => {\n disablePopoverMenu();\n setShowDisablePopoverOptions(false);\n }, []);\n\n return (\n <div className={styles.logRows} ref={logRowsRef}>\n {popoverState.selection && popoverState.selectedRow && (\n <PopoverMenu\n close={closePopoverMenu}\n row={popoverState.selectedRow}\n selection={popoverState.selection}\n {...popoverState.popoverMenuCoordinates}\n onClickFilterString={onClickFilterString}\n onClickFilterOutString={onClickFilterOutString}\n onDisable={onDisablePopoverMenu}\n />\n )}\n {showDisablePopoverOptions && (\n <ConfirmModal\n isOpen\n title={t('logs.log-rows.disable-popover.title', 'Disable menu')}\n body={\n <>\n <Trans i18nKey=\"logs.log-rows.disable-popover.message\">\n You are about to disable the logs filter menu. To re-enable it, select text in a log line while\n holding the alt key.\n </Trans>\n <div className={styles.shortcut}>\n <Icon name=\"keyboard\" />\n <Trans i18nKey=\"logs.log-rows.disable-popover-message.shortcut\">alt+select to enable again</Trans>\n </div>\n </>\n }\n confirmText={t('logs.log-rows.disable-popover.confirm', 'Confirm')}\n icon=\"exclamation-triangle\"\n onConfirm={onDisableConfirm}\n onDismiss={onDisableCancel}\n />\n )}\n <table className={cx(styles.logsRowsTable, props.overflowingContent ? '' : styles.logsRowsTableContain)}>\n <tbody>\n {orderedRows.map((row, index) =>\n index < previewSize ? (\n <LogRow\n key={keyMaker.getKey(row.uid)}\n getRows={getRows}\n row={row}\n showDuplicates={showDuplicates}\n logsSortOrder={logsSortOrder}\n onOpenContext={openContext}\n styles={styles}\n onPermalinkClick={props.onPermalinkClick}\n scrollIntoView={props.scrollIntoView}\n permalinkedRowId={permalinkedRowId}\n onPinLine={props.onPinLine}\n onUnpinLine={props.onUnpinLine}\n pinLineButtonTooltipTitle={props.pinLineButtonTooltipTitle}\n pinned={pinnedLogs?.some((logId) => logId === row.rowId || logId === row.uid)}\n isFilterLabelActive={props.isFilterLabelActive}\n handleTextSelection={handleSelection}\n enableLogDetails={enableLogDetails}\n {...props}\n />\n ) : (\n <PreviewLogRow\n key={`preview_${keyMaker.getKey(row.uid)}`}\n enableLogDetails={false}\n getRows={getRows}\n onOpenContext={openContext}\n styles={styles}\n showDuplicates={showDuplicates}\n {...props}\n row={row}\n />\n )\n )}\n </tbody>\n </table>\n </div>\n );\n }\n);\nLogRows.displayName = 'LogRows';\n","import { css } from '@emotion/css';\nimport { DragDropContext, Draggable, DraggableProvided, Droppable, DropResult } from '@hello-pangea/dnd';\nimport { useCallback } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { t } from '@grafana/i18n';\nimport { Card, IconButton, useStyles2 } from '@grafana/ui';\n\nimport { LogLineDetailsMode } from './LogLineDetails';\nimport { useLogListContext } from './LogListContext';\nimport { reportInteractionOnce } from './analytics';\nimport { getNormalizedFieldName } from './processing';\n\nexport const LogLineDetailsDisplayedFields = () => {\n const { displayedFields, setDisplayedFields } = useLogListContext();\n\n const reorganizeDisplayedFields = useCallback(\n (srcIndex: number, destIndex: number, mode: 'drag' | 'button') => {\n const newDisplayedFields = [...displayedFields];\n const element = displayedFields[srcIndex];\n\n newDisplayedFields.splice(srcIndex, 1);\n newDisplayedFields.splice(destIndex, 0, element);\n\n setDisplayedFields?.(newDisplayedFields);\n\n reportInteractionOnce('logs_log_line_details_organized_fields', {\n quantity: newDisplayedFields.length,\n mode,\n });\n },\n [displayedFields, setDisplayedFields]\n );\n\n const onDragEnd = useCallback(\n (result: DropResult) => {\n if (result.destination == null) {\n return;\n }\n reorganizeDisplayedFields(result.source.index, result.destination.index, 'drag');\n },\n [reorganizeDisplayedFields]\n );\n\n return (\n <div>\n <DragDropContext onDragEnd={onDragEnd}>\n <Droppable droppableId=\"displayed-fields\" direction=\"vertical\">\n {(provided) => {\n return (\n <div ref={provided.innerRef} {...provided.droppableProps}>\n {displayedFields.map((field, index) => (\n <DraggableDisplayedField\n key={field}\n field={field}\n index={index}\n moveField={reorganizeDisplayedFields}\n />\n ))}\n {provided.placeholder}\n </div>\n );\n }}\n </Droppable>\n </DragDropContext>\n </div>\n );\n};\n\ninterface DraggableDisplayedFieldProps {\n field: string;\n index: number;\n moveField: (srcIndex: number, destIndex: number, mode: 'drag' | 'button') => void;\n}\n\nconst DraggableDisplayedField = ({ field, index, moveField }: DraggableDisplayedFieldProps) => {\n return (\n <Draggable draggableId={field} index={index}>\n {(provided) => (\n <DisplayedField key={field} field={field} index={index} moveField={moveField} provided={provided} />\n )}\n </Draggable>\n );\n};\n\nconst DisplayedField = ({\n field,\n index,\n moveField,\n provided,\n}: DraggableDisplayedFieldProps & { provided: DraggableProvided }) => {\n const { detailsMode, displayedFields, onClickHideField } = useLogListContext();\n const styles = useStyles2(getStyles, detailsMode);\n const nextIndex = index === displayedFields.length - 1 ? 0 : index + 1;\n const prevIndex = index === 0 ? displayedFields.length - 1 : index - 1;\n return (\n <div ref={provided.innerRef} {...provided.draggableProps} {...provided.dragHandleProps}>\n <Card noMargin className={styles.fieldCard}>\n <div className={styles.fieldWrapper}>\n <div className={styles.field}>{getNormalizedFieldName(field)}</div>\n {displayedFields.length > 1 && (\n <>\n <IconButton\n name=\"arrow-down\"\n onClick={() => moveField(index, nextIndex, 'button')}\n tooltip={t('logs.log-line-details.move-displayed-field-down', 'Move down')}\n />\n <IconButton\n name=\"arrow-up\"\n onClick={() => moveField(index, prevIndex, 'button')}\n tooltip={t('logs.log-line-details.move-displayed-field-up', 'Move up')}\n />\n </>\n )}\n {onClickHideField && (\n <IconButton\n name=\"times\"\n onClick={() => onClickHideField(field)}\n tooltip={t('logs.log-line-details.remove-displayed-field', 'Remove field')}\n />\n )}\n </div>\n </Card>\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2, detailsMode: LogLineDetailsMode) => ({\n fieldCard: css({\n display: 'block',\n padding: theme.spacing(1),\n marginBottom: theme.spacing(1),\n width: detailsMode === 'inline' ? '30vw' : undefined,\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n wordBreak: 'break-word',\n }),\n fieldWrapper: css({\n cursor: 'move',\n display: 'flex',\n gap: theme.spacing(0.5),\n justifyContent: 'space-evenly',\n }),\n field: css({\n flex: 1,\n }),\n});\n","import { css } from '@emotion/css';\nimport { isEqual } from 'lodash';\nimport { parse, stringify } from 'lossless-json';\nimport { memo, useCallback, useEffect, useMemo, useState } from 'react';\n\nimport { CoreApp, Field, fuzzySearch, GrafanaTheme2, IconName, LinkModel, LogLabelStatsModel } from '@grafana/data';\nimport { t } from '@grafana/i18n';\nimport { reportInteraction } from '@grafana/runtime';\nimport { ClipboardButton, DataLinkButton, IconButton, useStyles2 } from '@grafana/ui';\n\nimport { logRowToSingleRowDataFrame } from '../../logsModel';\nimport { calculateLogsLabelStats, calculateStats } from '../../utils';\nimport { LogLabelStats } from '../LogLabelStats';\nimport { FieldDef } from '../logParser';\nimport { OTEL_LOG_LINE_ATTRIBUTES_FIELD_NAME } from '../otel/formats';\n\nimport { useLogListContext } from './LogListContext';\nimport { LogListModel, getNormalizedFieldName } from './processing';\n\ninterface LogLineDetailsFieldsProps {\n disableActions?: boolean;\n fields: FieldDef[];\n log: LogListModel;\n logs: LogListModel[];\n search?: string;\n}\n\nexport const LogLineDetailsFields = memo(({ disableActions, fields, log, logs, search }: LogLineDetailsFieldsProps) => {\n const styles = useStyles2(getFieldsStyles);\n const getLogs = useCallback(() => logs, [logs]);\n const filteredFields = useMemo(() => (search ? filterFields(fields, search) : fields), [fields, search]);\n\n if (!fields.length) {\n return null;\n } else if (filteredFields.length === 0) {\n return t('logs.log-line-details.search.no-results', 'No results to display.');\n }\n\n return (\n <div className={disableActions ? styles.fieldsTableNoActions : styles.fieldsTable}>\n {filteredFields.map((field, i) => (\n <LogLineDetailsField\n key={`${field.keys[0]}=${field.values[0]}-${i}`}\n disableActions={disableActions}\n getLogs={getLogs}\n fieldIndex={field.fieldIndex}\n keys={field.keys}\n links={field.links}\n log={log}\n values={field.values}\n />\n ))}\n </div>\n );\n});\nLogLineDetailsFields.displayName = 'LogLineDetailsFields';\n\ninterface LinkModelWithIcon extends LinkModel<Field> {\n icon?: IconName;\n}\n\nexport interface LabelWithLinks {\n key: string;\n value: string;\n links?: LinkModelWithIcon[];\n}\n\ninterface LogLineDetailsLabelFieldsProps {\n fields: LabelWithLinks[];\n log: LogListModel;\n logs: LogListModel[];\n search?: string;\n}\n\nexport const LogLineDetailsLabelFields = ({ fields, log, logs, search }: LogLineDetailsLabelFieldsProps) => {\n const styles = useStyles2(getFieldsStyles);\n const getLogs = useCallback(() => logs, [logs]);\n const filteredFields = useMemo(() => (search ? filterLabels(fields, search) : fields), [fields, search]);\n\n if (!fields.length) {\n return null;\n } else if (filteredFields.length === 0) {\n return t('logs.log-line-details.search.no-results', 'No results to display.');\n }\n\n return (\n <div className={styles.fieldsTable}>\n {filteredFields.map((field, i) => (\n <LogLineDetailsField\n key={`${field.key}=${field.value}-${i}`}\n getLogs={getLogs}\n isLabel\n keys={[field.key]}\n links={field.links}\n log={log}\n values={[field.value]}\n />\n ))}\n </div>\n );\n};\n\nconst getFieldsStyles = (theme: GrafanaTheme2) => ({\n fieldsTable: css({\n display: 'grid',\n gap: theme.spacing(1),\n gridTemplateColumns: `${theme.spacing(11.5)} fit-content(30%) 1fr`,\n }),\n fieldsTableNoActions: css({\n display: 'grid',\n gap: theme.spacing(1),\n gridTemplateColumns: `auto 1fr`,\n }),\n});\n\ninterface LogLineDetailsFieldProps {\n keys: string[];\n values: string[];\n disableActions?: boolean;\n fieldIndex?: number;\n getLogs(): LogListModel[];\n isLabel?: boolean;\n links?: LinkModelWithIcon[];\n log: LogListModel;\n}\n\nexport const LogLineDetailsField = ({\n disableActions = false,\n fieldIndex,\n getLogs,\n isLabel,\n links,\n log,\n keys,\n values,\n}: LogLineDetailsFieldProps) => {\n const [showFieldsStats, setShowFieldStats] = useState(false);\n const [fieldCount, setFieldCount] = useState(0);\n const [fieldStats, setFieldStats] = useState<LogLabelStatsModel[] | null>(null);\n const {\n app,\n closeDetails,\n displayedFields,\n isLabelFilterActive,\n noInteractions,\n onClickFilterLabel,\n onClickFilterOutLabel,\n onClickShowField,\n onClickHideField,\n onPinLine,\n pinLineButtonTooltipTitle,\n prettifyJSON,\n } = useLogListContext();\n\n const styles = useStyles2(getFieldStyles);\n\n const getStats = useCallback(() => {\n if (isLabel) {\n return calculateLogsLabelStats(getLogs(), keys[0]);\n }\n if (fieldIndex !== undefined) {\n return calculateStats(log.dataFrame.fields[fieldIndex].values);\n }\n return [];\n }, [fieldIndex, getLogs, isLabel, keys, log.dataFrame.fields]);\n\n const updateStats = useCallback(() => {\n const newStats = getStats();\n const newCount = newStats.reduce((sum, stat) => sum + stat.count, 0);\n if (!isEqual(fieldStats, newStats) || fieldCount !== newCount) {\n setFieldStats(newStats);\n setFieldCount(newCount);\n }\n }, [fieldCount, fieldStats, getStats]);\n\n useEffect(() => {\n if (showFieldsStats) {\n updateStats();\n }\n }, [showFieldsStats, updateStats]);\n\n const reportInteractionWrapper = useCallback(\n (interactionName: string, properties?: Record<string, unknown>) => {\n if (noInteractions) {\n return;\n }\n reportInteraction(interactionName, properties);\n },\n [noInteractions]\n );\n\n const showField = useCallback(() => {\n if (onClickShowField) {\n onClickShowField(keys[0]);\n }\n\n reportInteractionWrapper('logs_log_line_details_show_field_clicked', {\n datasourceType: log.datasourceType,\n });\n }, [onClickShowField, reportInteractionWrapper, log.datasourceType, keys]);\n\n const hideField = useCallback(() => {\n if (onClickHideField) {\n onClickHideField(keys[0]);\n }\n\n reportInteractionWrapper('logs_log_line_details_hide_field_clicked', {\n datasourceType: log.datasourceType,\n });\n }, [onClickHideField, reportInteractionWrapper, log.datasourceType, keys]);\n\n const filterLabel = useCallback(() => {\n if (onClickFilterLabel) {\n onClickFilterLabel(keys[0], values[0], logRowToSingleRowDataFrame(log) || undefined);\n }\n\n reportInteractionWrapper('logs_log_line_details_filter_clicked', {\n datasourceType: log.datasourceType,\n filterType: 'include',\n logRowUid: log.uid,\n });\n }, [onClickFilterLabel, reportInteractionWrapper, log, keys, values]);\n\n const filterOutLabel = useCallback(() => {\n if (onClickFilterOutLabel) {\n onClickFilterOutLabel(keys[0], values[0], logRowToSingleRowDataFrame(log) || undefined);\n }\n\n reportInteractionWrapper('logs_log_line_details_filter_clicked', {\n datasourceType: log.datasourceType,\n filterType: 'exclude',\n logRowUid: log.uid,\n });\n }, [onClickFilterOutLabel, reportInteractionWrapper, log, keys, values]);\n\n const labelFilterActive = useCallback(async () => {\n if (isLabelFilterActive) {\n return await isLabelFilterActive(keys[0], values[0], log.dataFrame?.refId);\n }\n return false;\n }, [isLabelFilterActive, keys, values, log.dataFrame?.refId]);\n\n const showStats = useCallback(() => {\n setShowFieldStats((showFieldStats: boolean) => !showFieldStats);\n\n reportInteractionWrapper('logs_log_line_details_stats_clicked', {\n dataSourceType: log.datasourceType,\n fieldType: isLabel ? 'label' : 'field',\n type: showFieldsStats ? 'close' : 'open',\n logRowUid: log.uid,\n app,\n });\n }, [app, isLabel, log.datasourceType, log.uid, reportInteractionWrapper, showFieldsStats]);\n\n const refIdTooltip = useMemo(\n () => (app === CoreApp.Explore && log.dataFrame?.refId ? ` in query ${log.dataFrame?.refId}` : ''),\n [app, log.dataFrame?.refId]\n );\n const singleKey = keys.length === 1;\n const singleValue = values.length === 1;\n\n const fieldSupportsFilters = keys[0] !== OTEL_LOG_LINE_ATTRIBUTES_FIELD_NAME;\n\n return (\n <>\n <div className={styles.row}>\n {!disableActions && (\n <div className={styles.actions}>\n {onClickFilterLabel && fieldSupportsFilters && (\n <AsyncIconButton\n name=\"search-plus\"\n onClick={filterLabel}\n // We purposely want to pass a new function on every render to allow the active state to be updated when log details remains open between updates.\n isActive={labelFilterActive}\n tooltipSuffix={refIdTooltip}\n />\n )}\n {onClickFilterOutLabel && fieldSupportsFilters && (\n <IconButton\n name=\"search-minus\"\n tooltip={\n app === CoreApp.Explore && log.dataFrame?.refId\n ? t('logs.log-line-details.fields.filter-out-query', 'Filter out value in query {{query}}', {\n query: log.dataFrame?.refId,\n })\n : t('logs.log-line-details.fields.filter-out', 'Filter out value')\n }\n onClick={filterOutLabel}\n />\n )}\n {singleKey && displayedFields.includes(keys[0]) && (\n <IconButton\n variant=\"primary\"\n tooltip={t('logs.log-line-details.fields.toggle-field-button.hide-this-field', 'Hide this field')}\n name=\"eye\"\n onClick={hideField}\n />\n )}\n {singleKey && !displayedFields.includes(keys[0]) && (\n <IconButton\n tooltip={t(\n 'logs.log-line-details.fields.toggle-field-button.field-instead-message',\n 'Show this field instead of the message'\n )}\n name=\"eye\"\n onClick={showField}\n />\n )}\n <IconButton\n variant={showFieldsStats ? 'primary' : 'secondary'}\n name=\"signal\"\n tooltip={t('logs.log-line-details.fields.adhoc-statistics', 'Ad-hoc statistics')}\n className=\"stats-button\"\n disabled={!singleKey}\n onClick={showStats}\n />\n </div>\n )}\n <div className={styles.label}>\n {singleKey ? getNormalizedFieldName(keys[0]) : <MultipleValue values={keys} />}\n </div>\n <div className={styles.value}>\n <div className={styles.valueContainer}>\n {singleValue ? (\n <SingleValue value={values[0]} prettifyJSON={prettifyJSON} />\n ) : (\n <MultipleValue showCopy={true} values={values} />\n )}\n </div>\n </div>\n </div>\n {links?.map((link, i) => {\n if (link.onClick && onPinLine) {\n const originalOnClick = link.onClick;\n link.onClick = (e, origin) => {\n // Pin the line\n onPinLine(log);\n\n // Execute the link onClick function\n originalOnClick(e, origin);\n\n closeDetails();\n };\n }\n return (\n <div className={styles.row} key={`${link.title}-${i}`}>\n <div className={disableActions ? styles.linkNoActions : styles.link}>\n <DataLinkButton\n buttonProps={{\n // Show tooltip message if max number of pinned lines has been reached\n tooltip:\n typeof pinLineButtonTooltipTitle === 'object' && link.onClick\n ? pinLineButtonTooltipTitle\n : undefined,\n variant: 'secondary',\n fill: 'outline',\n ...(link.icon && { icon: link.icon }),\n }}\n link={link}\n />\n </div>\n </div>\n );\n })}\n {showFieldsStats && fieldStats && (\n <div className={styles.row}>\n <div className={disableActions ? undefined : styles.statsColumn}>\n <LogLabelStats\n className={styles.stats}\n stats={fieldStats}\n label={keys[0]}\n value={values[0]}\n rowCount={fieldCount}\n isLabel={isLabel}\n />\n </div>\n </div>\n )}\n </>\n );\n};\n\nconst getFieldStyles = (theme: GrafanaTheme2) => ({\n row: css({\n display: 'contents',\n }),\n actions: css({\n whiteSpace: 'nowrap',\n }),\n label: css({\n paddingRight: theme.spacing(1),\n overflowWrap: 'break-word',\n wordBreak: 'break-word',\n }),\n value: css({\n overflowWrap: 'break-word',\n wordBreak: 'break-word',\n button: {\n visibility: 'hidden',\n },\n '&:hover': {\n button: {\n visibility: 'visible',\n },\n },\n }),\n link: css({\n gridColumn: '2 / 4',\n }),\n linkNoActions: css({\n gridColumn: 'span 2',\n paddingBottom: theme.spacing(0.5),\n }),\n stats: css({\n paddingRight: theme.spacing(1),\n wordBreak: 'break-all',\n width: '100%',\n maxWidth: '50vh',\n }),\n statsColumn: css({\n gridColumn: '2 / 4',\n }),\n valueContainer: css({\n display: 'flex',\n lineHeight: theme.typography.body.lineHeight,\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-word',\n maxHeight: '50vh',\n overflow: 'auto',\n }),\n});\n\nconst ClipboardButtonWrapper = ({ value }: { value: string }) => {\n const styles = useStyles2(getClipboardButtonStyles);\n return (\n <div className={styles.button}>\n <ClipboardButton\n getText={() => value}\n aria-label={t('logs.log-line-details.fields.copy-value-to-clipboard', 'Copy value to clipboard')}\n fill=\"text\"\n variant=\"secondary\"\n icon=\"copy\"\n size=\"md\"\n />\n </div>\n );\n};\n\nconst getClipboardButtonStyles = (theme: GrafanaTheme2) => ({\n button: css({\n '& > button': {\n color: theme.colors.text.secondary,\n gap: 0,\n padding: 0,\n justifyContent: 'center',\n borderRadius: theme.shape.radius.circle,\n height: theme.spacing(theme.components.height.sm),\n width: theme.spacing(theme.components.height.sm),\n svg: {\n margin: 0,\n },\n\n 'span > div': {\n top: '-5px',\n '& button': {\n color: theme.colors.success.main,\n },\n },\n },\n }),\n});\n\nexport const MultipleValue = ({ showCopy, values = [] }: { showCopy?: boolean; values: string[] }) => {\n if (values.every((val) => val === '')) {\n return null;\n }\n return (\n <table>\n <tbody>\n {values.map((val, i) => {\n return (\n <tr key={`${val}-${i}`}>\n <td>{val}</td>\n <td>{showCopy && val !== '' && <ClipboardButtonWrapper value={val} />}</td>\n </tr>\n );\n })}\n </tbody>\n </table>\n );\n};\n\nexport const SingleValue = ({ value: originalValue, prettifyJSON }: { value: string; prettifyJSON?: boolean }) => {\n const value = useMemo(() => {\n if (!prettifyJSON) {\n return originalValue;\n }\n try {\n const parsed = stringify(parse(originalValue), undefined, 2);\n if (parsed) {\n return parsed;\n }\n } catch (error) {}\n return originalValue;\n }, [originalValue, prettifyJSON]);\n\n return (\n <>\n {value}\n <ClipboardButtonWrapper value={value} />\n </>\n );\n};\n\ninterface AsyncIconButtonProps extends Pick<React.ButtonHTMLAttributes<HTMLButtonElement>, 'onClick'> {\n name: IconName;\n isActive(): Promise<boolean>;\n tooltipSuffix: string;\n}\n\nconst AsyncIconButton = ({ isActive, tooltipSuffix, ...rest }: AsyncIconButtonProps) => {\n const [active, setActive] = useState(false);\n const tooltip = active ? 'Remove filter' : 'Filter for value';\n\n useEffect(() => {\n isActive().then(setActive);\n }, [isActive]);\n\n return <IconButton {...rest} variant={active ? 'primary' : undefined} tooltip={tooltip + tooltipSuffix} />;\n};\n\nexport function filterFields(fields: FieldDef[], search: string) {\n const keys = fields.map((field) => field.keys.join(' '));\n const keysIdx = fuzzySearch(keys, search);\n const values = fields.map((field) => field.values.join(' '));\n const valuesIdx = fuzzySearch(values, search);\n\n const results = keysIdx.map((index) => fields[index]);\n valuesIdx.forEach((index) => {\n if (!results.includes(fields[index])) {\n results.push(fields[index]);\n }\n });\n\n return results;\n}\n\nfunction filterLabels(labels: LabelWithLinks[], search: string) {\n const keys = labels.map((field) => field.key);\n const keysIdx = fuzzySearch(keys, search);\n const values = labels.map((field) => field.value);\n const valuesIdx = fuzzySearch(values, search);\n\n const results = keysIdx.map((index) => labels[index]);\n valuesIdx.forEach((index) => {\n if (!results.includes(labels[index])) {\n results.push(labels[index]);\n }\n });\n\n return results;\n}\n","import { css } from '@emotion/css';\nimport { useCallback, useMemo, MouseEvent, useRef, ChangeEvent } from 'react';\n\nimport { colorManipulator, GrafanaTheme2, LogRowModel, store } from '@grafana/data';\nimport { t } from '@grafana/i18n';\nimport { reportInteraction } from '@grafana/runtime';\nimport { IconButton, Input, useStyles2 } from '@grafana/ui';\n\nimport { copyText, handleOpenLogsContextClick } from '../../utils';\nimport { LOG_LINE_BODY_FIELD_NAME } from '../LogDetailsBody';\n\nimport { LogLineDetailsMode } from './LogLineDetails';\nimport { useLogIsPinned, useLogListContext } from './LogListContext';\nimport { LogListModel } from './processing';\n\ninterface Props {\n focusLogLine?: (log: LogListModel) => void;\n log: LogListModel;\n search: string;\n onSearch(newSearch: string): void;\n}\n\nexport const LogLineDetailsHeader = ({ focusLogLine, log, search, onSearch }: Props) => {\n const {\n closeDetails,\n detailsMode,\n displayedFields,\n getRowContextQuery,\n logOptionsStorageKey,\n logSupportsContext,\n noInteractions,\n setDetailsMode,\n onClickHideField,\n onClickShowField,\n onOpenContext,\n onPermalinkClick,\n onPinLine,\n onUnpinLine,\n wrapLogMessage,\n isAssistantAvailable,\n openAssistantByLog,\n } = useLogListContext();\n const pinned = useLogIsPinned(log);\n const styles = useStyles2(getStyles, detailsMode, wrapLogMessage);\n const containerRef = useRef<HTMLDivElement | null>(null);\n const inputRef = useRef<HTMLInputElement | null>(null);\n const searchUsedRef = useRef(false);\n\n const reportInteractionWrapper = useCallback(\n (interactionName: string, properties?: Record<string, unknown>) => {\n if (noInteractions) {\n return;\n }\n reportInteraction(interactionName, properties);\n },\n [noInteractions]\n );\n\n const scrollToLogLine = useCallback(() => {\n focusLogLine?.(log);\n reportInteractionWrapper('logs_log_line_details_header_scroll_to_clicked');\n }, [focusLogLine, log, reportInteractionWrapper]);\n\n const copyLogLine = useCallback(() => {\n copyText(log.entry, containerRef);\n reportInteractionWrapper('logs_log_line_details_header_copy_clicked');\n }, [log.entry, reportInteractionWrapper]);\n\n const copyLinkToLogLine = useCallback(() => {\n onPermalinkClick?.(log);\n reportInteractionWrapper('logs_log_line_details_header_permalink_clicked');\n }, [log, onPermalinkClick, reportInteractionWrapper]);\n\n const togglePinning = useCallback(() => {\n if (pinned) {\n onUnpinLine?.(log);\n } else {\n onPinLine?.(log);\n }\n reportInteractionWrapper('logs_log_line_details_header_pinning_clicked');\n }, [log, onPinLine, onUnpinLine, pinned, reportInteractionWrapper]);\n\n const shouldlogSupportsContext = useMemo(\n () => (logSupportsContext ? logSupportsContext(log) : false),\n [log, logSupportsContext]\n );\n\n const showContext = useCallback(\n async (event: MouseEvent<HTMLElement>) => {\n handleOpenLogsContextClick(event, log, getRowContextQuery, (log: LogRowModel) => onOpenContext?.(log, () => {}));\n reportInteractionWrapper('logs_log_line_details_header_context_clicked');\n },\n [log, getRowContextQuery, reportInteractionWrapper, onOpenContext]\n );\n\n const showLogLineToggle = onClickHideField && onClickShowField && displayedFields.length > 0;\n const logLineDisplayed = displayedFields.includes(LOG_LINE_BODY_FIELD_NAME);\n\n const toggleDetailsMode = useCallback(() => {\n const newMode = detailsMode === 'inline' ? 'sidebar' : 'inline';\n if (logOptionsStorageKey) {\n store.set(`${logOptionsStorageKey}.detailsMode`, newMode);\n }\n\n setDetailsMode(newMode);\n }, [detailsMode, logOptionsStorageKey, setDetailsMode]);\n\n const toggleLogLine = useCallback(() => {\n if (logLineDisplayed) {\n onClickHideField?.(LOG_LINE_BODY_FIELD_NAME);\n } else {\n onClickShowField?.(LOG_LINE_BODY_FIELD_NAME);\n }\n reportInteractionWrapper('logs_log_line_details_header_show_logline_clicked');\n }, [logLineDisplayed, onClickHideField, onClickShowField, reportInteractionWrapper]);\n\n const clearSearch = useMemo(\n () => (\n <IconButton\n name=\"times\"\n size=\"sm\"\n onClick={() => {\n onSearch('');\n reportInteractionWrapper('logs_log_line_details_header_search_cleared');\n if (inputRef.current) {\n inputRef.current.value = '';\n }\n }}\n tooltip={t('logs.log-line-details.clear-search', 'Clear')}\n />\n ),\n [onSearch, reportInteractionWrapper]\n );\n\n const handleSearch = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n onSearch(e.target.value);\n if (!searchUsedRef.current) {\n reportInteractionWrapper('logs_log_line_details_header_search_used');\n searchUsedRef.current = true;\n }\n },\n [onSearch, reportInteractionWrapper]\n );\n\n return (\n <div className={styles.header} ref={containerRef}>\n <Input\n onChange={handleSearch}\n placeholder={t('logs.log-line-details.search-placeholder', 'Search field names and values')}\n ref={inputRef}\n suffix={search !== '' ? clearSearch : undefined}\n />\n <div className={styles.icons}>\n {isAssistantAvailable && (\n <IconButton\n tooltip={t('logs.log-line-details.open-assistant', 'Explain log line in Assistant')}\n tooltipPlacement=\"top\"\n size=\"md\"\n name=\"ai-sparkle\"\n onClick={() => openAssistantByLog?.(log)}\n tabIndex={0}\n />\n )}\n {focusLogLine && (\n <IconButton\n tooltip={t('logs.log-line-details.scroll-to-logline', 'Scroll to log line')}\n tooltipPlacement=\"top\"\n size=\"md\"\n name=\"arrows-v\"\n onClick={scrollToLogLine}\n tabIndex={0}\n />\n )}\n {showLogLineToggle && (\n <IconButton\n tooltip={\n logLineDisplayed\n ? t('logs.log-line-details.hide-log-line', 'Hide log line')\n : t('logs.log-line-details.show-log-line', 'Show log line')\n }\n tooltipPlacement=\"top\"\n size=\"md\"\n name=\"eye\"\n onClick={toggleLogLine}\n tabIndex={0}\n variant={logLineDisplayed ? 'primary' : undefined}\n />\n )}\n <IconButton\n tooltip={t('logs.log-line-details.copy-to-clipboard', 'Copy to clipboard')}\n tooltipPlacement=\"top\"\n size=\"md\"\n name=\"copy\"\n onClick={copyLogLine}\n tabIndex={0}\n />\n {onPermalinkClick && log.rowId !== undefined && log.uid && (\n <IconButton\n tooltip={t('logs.log-line-details.copy-shortlink', 'Copy shortlink')}\n tooltipPlacement=\"top\"\n size=\"md\"\n name=\"share-alt\"\n onClick={copyLinkToLogLine}\n tabIndex={0}\n />\n )}\n {pinned && onUnpinLine && (\n <IconButton\n size=\"md\"\n name=\"gf-pin\"\n onClick={togglePinning}\n tooltip={t('logs.log-line-details.unpin-line', 'Unpin log')}\n tooltipPlacement=\"top\"\n tabIndex={0}\n variant=\"primary\"\n />\n )}\n {!pinned && onPinLine && (\n <IconButton\n size=\"md\"\n name=\"gf-pin\"\n onClick={togglePinning}\n tooltip={t('logs.log-line-details.pin-line', 'Pin log')}\n tooltipPlacement=\"top\"\n tabIndex={0}\n />\n )}\n {shouldlogSupportsContext && (\n <IconButton\n size=\"md\"\n name=\"gf-show-context\"\n onClick={showContext}\n tooltip={t('logs.log-line-details.show-context', 'Show context')}\n tooltipPlacement=\"top\"\n tabIndex={0}\n />\n )}\n <IconButton\n name={detailsMode === 'inline' ? 'web-section' : 'gf-layout-simple'}\n tooltip={\n detailsMode === 'inline'\n ? t('logs.log-line-details.sidebar-mode', 'Anchor to the right')\n : t('logs.log-line-details.inline-mode', 'Display inline')\n }\n onClick={toggleDetailsMode}\n />\n <IconButton\n name=\"times\"\n tooltip={t('logs.log-line-details.close', 'Close log details')}\n onClick={closeDetails}\n />\n </div>\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2, mode: LogLineDetailsMode, wrapLogMessage: boolean) => ({\n container: css({\n overflow: 'auto',\n height: '100%',\n }),\n scrollContainer: css({\n overflow: 'auto',\n height: '100%',\n }),\n header: css({\n alignItems: 'center',\n background: theme.colors.background.canvas,\n display: 'flex',\n flexDirection: !wrapLogMessage && mode === 'inline' ? 'row-reverse' : 'row',\n gap: theme.spacing(0.75),\n zIndex: theme.zIndex.navbarFixed,\n height: theme.spacing(5.5),\n marginBottom: theme.spacing(1),\n padding: theme.spacing(0.5, 1),\n position: 'sticky',\n top: 0,\n }),\n icons: css({\n display: 'flex',\n gap: theme.spacing(1),\n paddingLeft: theme.spacing(1),\n }),\n copyLogButton: css({\n padding: 0,\n height: theme.spacing(4),\n width: theme.spacing(2.5),\n overflow: 'hidden',\n '&:hover': {\n backgroundColor: colorManipulator.alpha(theme.colors.text.primary, 0.12),\n },\n }),\n componentWrapper: css({\n padding: theme.spacing(0, 1, 1, 1),\n }),\n});\n","import { css } from '@emotion/css';\nimport { memo, useMemo } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { t } from '@grafana/i18n';\nimport { DataLinkButton, Icon, Toggletip, useStyles2 } from '@grafana/ui';\n\nimport { FieldDef } from '../logParser';\n\nimport { filterFields, MultipleValue, SingleValue } from './LogLineDetailsFields';\nimport { useLogListContext } from './LogListContext';\nimport { LogListModel } from './processing';\n\ninterface LogLineDetailsLinksProps {\n fields: FieldDef[];\n log: LogListModel;\n logs: LogListModel[];\n search?: string;\n}\n\nexport const LogLineDetailsLinks = memo(({ fields, log, search }: LogLineDetailsLinksProps) => {\n const styles = useStyles2(getFieldsStyles);\n const filteredFields = useMemo(() => (search ? filterFields(fields, search) : fields), [fields, search]);\n\n if (!fields.length) {\n return null;\n } else if (filteredFields.length === 0) {\n return t('logs.log-line-details.search.no-results', 'No results to display.');\n }\n\n return (\n <div className={styles.linksTable}>\n {filteredFields.map((field, i) => (\n <LogLineDetailsField key={`${field.keys[0]}=${field.values[0]}-${i}`} field={field} log={log} />\n ))}\n </div>\n );\n});\nLogLineDetailsLinks.displayName = 'LogLineDetailsLinks';\n\nconst getFieldsStyles = (theme: GrafanaTheme2) => ({\n linksTable: css({\n display: 'grid',\n gap: theme.spacing(1),\n gridTemplateColumns: `fit-content(30%) 1fr`,\n marginBottom: theme.spacing(1),\n }),\n});\n\ninterface LogLineDetailsFieldProps {\n field: FieldDef;\n log: LogListModel;\n}\n\nexport const LogLineDetailsField = ({ field, log }: LogLineDetailsFieldProps) => {\n const { closeDetails, onPinLine, pinLineButtonTooltipTitle, prettifyJSON } = useLogListContext();\n\n const styles = useStyles2(getFieldStyles);\n\n const singleKey = field.keys.length === 1;\n const singleValue = field.values.length === 1;\n\n const tooltip = useMemo(\n () => (\n <div className={styles.value}>\n <div className={styles.valueContainer}>\n {singleValue ? (\n <SingleValue value={field.values[0]} prettifyJSON={prettifyJSON} />\n ) : (\n <MultipleValue showCopy={true} values={field.values} />\n )}\n </div>\n </div>\n ),\n [field.values, singleValue, styles.value, styles.valueContainer, prettifyJSON]\n );\n\n return (\n <>\n <div className={styles.label}>\n {singleKey ? field.keys[0] : <MultipleValue values={field.keys} />}\n <Toggletip fitContent content={tooltip}>\n <Icon\n aria-label={t('logs.log-line-details.link-value-tooltip', 'Link value')}\n className={styles.labelIcon}\n name=\"info-circle\"\n />\n </Toggletip>\n </div>\n <div className={styles.links}>\n {field.links?.map((link, i) => {\n if (link.onClick && onPinLine) {\n const originalOnClick = link.onClick;\n link.onClick = (e, origin) => {\n // Pin the line\n onPinLine(log);\n\n // Execute the link onClick function\n originalOnClick(e, origin);\n\n closeDetails();\n };\n }\n return (\n <span key={`${link.title}-${i}`} className={styles.link}>\n <DataLinkButton\n buttonProps={{\n // Show tooltip message if max number of pinned lines has been reached\n tooltip:\n typeof pinLineButtonTooltipTitle === 'object' && link.onClick\n ? pinLineButtonTooltipTitle\n : undefined,\n variant: 'secondary',\n fill: 'outline',\n }}\n link={link}\n />\n </span>\n );\n })}\n </div>\n </>\n );\n};\n\nconst getFieldStyles = (theme: GrafanaTheme2) => ({\n label: css({\n overflowWrap: 'break-word',\n wordBreak: 'break-word',\n paddingRight: theme.spacing(1),\n }),\n labelIcon: css({\n marginLeft: theme.spacing(1),\n }),\n value: css({\n button: {\n visibility: 'hidden',\n },\n '&:hover': {\n button: {\n visibility: 'visible',\n },\n },\n }),\n links: css({\n paddingBottom: theme.spacing(0.5),\n }),\n link: css({\n marginRight: theme.spacing(0.5),\n }),\n valueContainer: css({\n display: 'flex',\n lineHeight: theme.typography.body.lineHeight,\n whiteSpace: 'pre-wrap',\n wordBreak: 'break-all',\n maxHeight: '50vh',\n overflow: 'auto',\n }),\n});\n","import { css } from '@emotion/css';\nimport { useEffect, useMemo, useState } from 'react';\nimport { isObservable, lastValueFrom } from 'rxjs';\n\nimport { DataFrame, DataQueryRequest, DataSourceApi, GrafanaTheme2, TimeRange } from '@grafana/data';\nimport { t } from '@grafana/i18n';\nimport { getDataSourceSrv, reportInteraction } from '@grafana/runtime';\nimport { Icon, Spinner, Tooltip, useStyles2 } from '@grafana/ui';\nimport { TraceView } from 'app/features/explore/TraceView/TraceView';\nimport { transformDataFrames } from 'app/features/explore/TraceView/utils/transform';\nimport { SearchTableType, TempoQuery } from 'app/plugins/datasource/tempo/dataquery.gen';\n\nimport { useLogListContext } from './LogListContext';\nimport { EmbeddedInternalLink } from './links';\n\ninterface Props {\n traceRef: EmbeddedInternalLink;\n timeRange: TimeRange;\n timeZone: string;\n}\n\nexport const LogLineDetailsTrace = ({ timeRange, timeZone, traceRef }: Props) => {\n const [dataSource, setDataSource] = useState<DataSourceApi | null>(null);\n const [dataFrames, setDataFrames] = useState<DataFrame[] | null | undefined>(undefined);\n const { app } = useLogListContext();\n const styles = useStyles2(getStyles);\n\n useEffect(() => {\n setDataSource(null);\n getDataSourceSrv()\n .get(traceRef.dsUID)\n .then((dataSource) => {\n if (dataSource) {\n setDataSource(dataSource);\n } else {\n setDataFrames(null);\n }\n });\n }, [traceRef.dsUID]);\n\n useEffect(() => {\n if (!dataSource) {\n return;\n }\n setDataFrames(undefined);\n const request: DataQueryRequest<TempoQuery> = {\n app,\n requestId: `log-details-trace-${traceRef.query}`,\n targets: [\n {\n query: traceRef.query,\n queryType: 'traceql',\n refId: `log-details-trace-${traceRef.query}`,\n tableType: SearchTableType.Traces,\n filters: [],\n },\n ],\n interval: '',\n intervalMs: 0,\n range: timeRange,\n scopedVars: {},\n timezone: timeZone,\n startTime: Date.now(),\n };\n const query = dataSource.query(request);\n if (isObservable(query)) {\n lastValueFrom(query)\n .then((response) => {\n setDataFrames(response.data?.length ? response.data : null);\n })\n .catch(() => {\n setDataFrames(null);\n });\n }\n }, [app, dataSource, timeRange, timeZone, traceRef.query]);\n\n const traceProp = useMemo(() => (dataFrames?.length ? transformDataFrames(dataFrames[0]) : undefined), [dataFrames]);\n\n useEffect(() => {\n if (dataSource && Array.isArray(dataFrames) && traceProp) {\n reportInteraction('logs_log_line_details_trace_displayed');\n } else if (dataFrames === null) {\n reportInteraction('logs_log_line_details_trace_display_failed');\n }\n }, [dataFrames, dataSource, traceProp]);\n\n return (\n <div>\n {dataSource && Array.isArray(dataFrames) && traceProp && (\n <TraceView dataFrames={dataFrames} traceProp={traceProp} datasource={dataSource} timeRange={timeRange} />\n )}\n {dataFrames === null && (\n <div className={styles.message}>\n <Tooltip\n content={t(\n 'logs.log-line-details.trace.error-tooltip',\n 'The trace could have been sampled or be temporarily unavailable.'\n )}\n >\n <Icon name=\"info-circle\" />\n </Tooltip>\n {t('logs.log-line-details.trace.error-message', 'Could not retrieve trace.')}\n </div>\n )}\n {dataFrames === undefined && (\n <div className={styles.message}>\n <Spinner />\n {t('logs.log-line-details.trace.loading-message', 'Loading trace...')}\n </div>\n )}\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n message: css({\n display: 'flex',\n gap: theme.spacing(1),\n alignItems: 'center',\n }),\n});\n","import { LinkModel } from '@grafana/data';\n\nimport { FieldDef } from '../logParser';\n\nexport function getTempoTraceFromLinks(fields: FieldDef[]) {\n for (const field of fields) {\n if (!field.links) {\n continue;\n }\n for (const link of field.links) {\n const trace = getTempoTraceFromLink(link);\n if (trace) {\n return trace;\n }\n }\n }\n return null;\n}\n\nfunction getTempoTraceFromLink(link: LinkModel) {\n if (link.interpolatedParams?.query && isTempoQuery(link.interpolatedParams.query)) {\n const query = link.interpolatedParams.query;\n return {\n dsUID: query.datasource?.uid || '',\n query: query.query,\n queryType: query.queryType || '',\n };\n } else {\n return undefined;\n }\n}\n\nexport type EmbeddedInternalLink = {\n dsUID: string;\n query: string;\n queryType: string;\n};\n\ntype TempoQuery = {\n query: string;\n queryType: string;\n};\n\nconst isTempoQuery = (query: unknown): query is TempoQuery => {\n if (!query || typeof query !== 'object') {\n return false;\n }\n return 'query' in query && 'queryType' in query;\n};\n","import { css } from '@emotion/css';\nimport { camelCase, groupBy } from 'lodash';\nimport { memo, startTransition, useCallback, useMemo, useRef, useState } from 'react';\n\nimport { DataFrameType, GrafanaTheme2, store, TimeRange } from '@grafana/data';\nimport { t, Trans } from '@grafana/i18n';\nimport { reportInteraction } from '@grafana/runtime';\nimport { ControlledCollapse, useStyles2 } from '@grafana/ui';\n\nimport { getLabelTypeFromRow } from '../../utils';\nimport { useAttributesExtensionLinks } from '../LogDetails';\nimport { createLogLineLinks } from '../logParser';\n\nimport { LogLineDetailsDisplayedFields } from './LogLineDetailsDisplayedFields';\nimport { LabelWithLinks, LogLineDetailsFields, LogLineDetailsLabelFields } from './LogLineDetailsFields';\nimport { LogLineDetailsHeader } from './LogLineDetailsHeader';\nimport { LogLineDetailsLinks } from './LogLineDetailsLinks';\nimport { LogLineDetailsLog } from './LogLineDetailsLog';\nimport { LogLineDetailsTrace } from './LogLineDetailsTrace';\nimport { useLogListContext } from './LogListContext';\nimport { getTempoTraceFromLinks } from './links';\nimport { LogListModel } from './processing';\n\ninterface LogLineDetailsComponentProps {\n focusLogLine?: (log: LogListModel) => void;\n log: LogListModel;\n logs: LogListModel[];\n timeRange: TimeRange;\n timeZone: string;\n}\n\nexport const LogLineDetailsComponent = memo(\n ({ focusLogLine, log, logs, timeRange, timeZone }: LogLineDetailsComponentProps) => {\n const { displayedFields, noInteractions, logOptionsStorageKey, setDisplayedFields, syntaxHighlighting } =\n useLogListContext();\n const [search, setSearch] = useState('');\n const inputRef = useRef('');\n const styles = useStyles2(getStyles);\n\n const extensionLinks = useAttributesExtensionLinks(log, timeRange);\n\n const fieldsWithLinks = useMemo(() => {\n const fieldsWithLinks = log.fields.filter((f) => f.links?.length);\n const displayedFieldsWithLinks = fieldsWithLinks.filter((f) => f.fieldIndex !== log.entryFieldIndex).sort();\n const hiddenFieldsWithLinks = fieldsWithLinks.filter((f) => f.fieldIndex === log.entryFieldIndex).sort();\n const fieldsWithLinksFromVariableMap = createLogLineLinks(hiddenFieldsWithLinks);\n return {\n links: displayedFieldsWithLinks,\n linksFromVariableMap: fieldsWithLinksFromVariableMap,\n };\n }, [log.entryFieldIndex, log.fields]);\n\n const fieldsWithoutLinks =\n log.dataFrame.meta?.type === DataFrameType.LogLines\n ? // for LogLines frames (dataplane) we don't want to show any additional fields besides already extracted labels and links\n []\n : // for other frames, do not show the log message unless there is a link attached\n log.fields.filter((f) => f.links?.length === 0 && f.fieldIndex !== log.entryFieldIndex).sort();\n\n const labelsWithLinks: LabelWithLinks[] = useMemo(\n () =>\n Object.keys(log.labels)\n .sort()\n .map((label) => ({\n key: label,\n value: log.labels[label],\n links: extensionLinks?.[label],\n })),\n [extensionLinks, log.labels]\n );\n\n const trace = useMemo(() => getTempoTraceFromLinks(fieldsWithLinks.links), [fieldsWithLinks.links]);\n\n const groupedLabels = useMemo(\n () => groupBy(labelsWithLinks, (label) => getLabelTypeFromRow(label.key, log, true) ?? ''),\n [labelsWithLinks, log]\n );\n const labelGroups = useMemo(() => Object.keys(groupedLabels), [groupedLabels]);\n\n const logLineOpen = logOptionsStorageKey\n ? store.getBool(`${logOptionsStorageKey}.log-details.logLineOpen`, false)\n : false;\n const linksOpen = logOptionsStorageKey\n ? store.getBool(`${logOptionsStorageKey}.log-details.linksOpen`, true)\n : true;\n const fieldsOpen = logOptionsStorageKey\n ? store.getBool(`${logOptionsStorageKey}.log-details.fieldsOpen`, true)\n : true;\n const displayedFieldsOpen = logOptionsStorageKey\n ? store.getBool(`${logOptionsStorageKey}.log-details.displayedFieldsOpen`, false)\n : false;\n const traceOpen = logOptionsStorageKey\n ? store.getBool(`${logOptionsStorageKey}.log-details.traceOpen`, false)\n : false;\n\n const handleToggle = useCallback(\n (option: string, isOpen: boolean) => {\n store.set(`${logOptionsStorageKey}.log-details.${option}`, isOpen);\n if (!noInteractions) {\n reportInteraction('logs_log_line_details_section_toggled', {\n section: option.replace('Open', ''),\n state: isOpen ? 'open' : 'closed',\n });\n }\n },\n [logOptionsStorageKey, noInteractions]\n );\n\n const handleSearch = useCallback((newSearch: string) => {\n inputRef.current = newSearch;\n startTransition(() => {\n setSearch(inputRef.current);\n });\n }, []);\n\n const noDetails =\n !fieldsWithLinks.links.length &&\n !fieldsWithLinks.linksFromVariableMap.length &&\n !labelGroups.length &&\n !fieldsWithoutLinks.length;\n\n const allLinks = useMemo(\n () => [...fieldsWithLinks.links, ...fieldsWithLinks.linksFromVariableMap],\n [fieldsWithLinks.links, fieldsWithLinks.linksFromVariableMap]\n );\n\n return (\n <>\n <LogLineDetailsHeader focusLogLine={focusLogLine} log={log} search={search} onSearch={handleSearch} />\n <div className={styles.componentWrapper}>\n <ControlledCollapse\n className={styles.collapsable}\n label={t('logs.log-line-details.log-line-section', 'Log line')}\n isOpen={logLineOpen}\n onToggle={(isOpen: boolean) => handleToggle('logLineOpen', isOpen)}\n >\n <LogLineDetailsLog log={log} syntaxHighlighting={syntaxHighlighting ?? true} />\n </ControlledCollapse>\n {displayedFields.length > 0 && setDisplayedFields && (\n <ControlledCollapse\n label={t('logs.log-line-details.displayed-fields-section', 'Organize displayed fields')}\n isOpen={displayedFieldsOpen}\n onToggle={(isOpen: boolean) => handleToggle('displayedFieldsOpen', isOpen)}\n >\n <LogLineDetailsDisplayedFields />\n </ControlledCollapse>\n )}\n {allLinks.length > 0 && (\n <ControlledCollapse\n className={styles.collapsable}\n label={t('logs.log-line-details.links-section', 'Links')}\n isOpen={linksOpen}\n onToggle={(isOpen: boolean) => handleToggle('linksOpen', isOpen)}\n >\n <LogLineDetailsLinks log={log} logs={logs} fields={allLinks} search={search} />\n </ControlledCollapse>\n )}\n {trace && (\n <ControlledCollapse\n label={t('logs.log-line-details.trace-section', 'Trace')}\n isOpen={traceOpen}\n onToggle={(isOpen: boolean) => handleToggle('traceOpen', isOpen)}\n >\n <LogLineDetailsTrace timeRange={timeRange} timeZone={timeZone} traceRef={trace} />\n </ControlledCollapse>\n )}\n {labelGroups.map((group) =>\n group === '' ? (\n <ControlledCollapse\n className={styles.collapsable}\n key={'fields'}\n label={t('logs.log-line-details.fields-section', 'Fields')}\n isOpen={fieldsOpen}\n onToggle={(isOpen: boolean) => handleToggle('fieldsOpen', isOpen)}\n >\n <LogLineDetailsLabelFields log={log} logs={logs} fields={groupedLabels[group]} search={search} />\n <LogLineDetailsFields log={log} logs={logs} fields={fieldsWithoutLinks} search={search} />\n </ControlledCollapse>\n ) : (\n <ControlledCollapse\n className={styles.collapsable}\n key={group}\n label={group}\n isOpen={store.getBool(`${logOptionsStorageKey}.log-details.${groupOptionName(group)}`, true)}\n onToggle={(isOpen: boolean) => handleToggle(groupOptionName(group), isOpen)}\n >\n <LogLineDetailsLabelFields log={log} logs={logs} fields={groupedLabels[group]} search={search} />\n </ControlledCollapse>\n )\n )}\n {!labelGroups.length && fieldsWithoutLinks.length > 0 && (\n <ControlledCollapse\n className={styles.collapsable}\n key={'fields'}\n label={t('logs.log-line-details.fields-section', 'Fields')}\n isOpen={fieldsOpen}\n onToggle={(isOpen: boolean) => handleToggle('fieldsOpen', isOpen)}\n >\n <LogLineDetailsFields log={log} logs={logs} fields={fieldsWithoutLinks} search={search} />\n </ControlledCollapse>\n )}\n {noDetails && <Trans i18nKey=\"logs.log-line-details.no-details\">No fields to display.</Trans>}\n </div>\n </>\n );\n }\n);\nLogLineDetailsComponent.displayName = 'LogLineDetailsComponent';\n\nfunction groupOptionName(group: string) {\n return `${camelCase(group)}Open`;\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n collapsable: css({\n '&:last-of-type': {\n marginBottom: 0,\n },\n }),\n componentWrapper: css({\n padding: theme.spacing(0, 1, 1, 1),\n }),\n});\n","import { css } from '@emotion/css';\nimport { Resizable } from 're-resizable';\nimport { memo, useCallback, useEffect, useRef, useState } from 'react';\nimport { usePrevious } from 'react-use';\n\nimport { GrafanaTheme2, TimeRange } from '@grafana/data';\nimport { t } from '@grafana/i18n';\nimport { reportInteraction } from '@grafana/runtime';\nimport { getDragStyles, Icon, Tab, TabsBar, useStyles2 } from '@grafana/ui';\n\nimport { LogLineDetailsComponent } from './LogLineDetailsComponent';\nimport { getDetailsScrollPosition, saveDetailsScrollPosition, useLogListContext } from './LogListContext';\nimport { LogListModel } from './processing';\nimport { LOG_LIST_MIN_WIDTH } from './virtualization';\n\nexport interface Props {\n containerElement: HTMLDivElement;\n focusLogLine: (log: LogListModel) => void;\n logs: LogListModel[];\n timeRange: TimeRange;\n timeZone: string;\n showControls: boolean;\n}\n\nexport type LogLineDetailsMode = 'inline' | 'sidebar';\n\nexport const LogLineDetails = memo(\n ({ containerElement, focusLogLine, logs, timeRange, timeZone, showControls }: Props) => {\n const { detailsWidth, noInteractions, setDetailsWidth } = useLogListContext();\n const styles = useStyles2(getStyles, 'sidebar', showControls);\n const dragStyles = useStyles2(getDragStyles);\n const containerRef = useRef<HTMLDivElement | null>(null);\n\n const handleResize = useCallback(() => {\n if (containerRef.current) {\n setDetailsWidth(containerRef.current.clientWidth);\n }\n }, [setDetailsWidth]);\n\n const reportResize = useCallback(() => {\n if (containerRef.current && !noInteractions) {\n reportInteraction('logs_log_line_details_sidebar_resized', {\n width: Math.round(containerRef.current.clientWidth),\n });\n }\n }, [noInteractions]);\n\n const maxWidth = containerElement.clientWidth - LOG_LIST_MIN_WIDTH;\n\n return (\n <Resizable\n onResize={handleResize}\n onResizeStop={reportResize}\n handleClasses={{ left: dragStyles.dragHandleVertical }}\n defaultSize={{ width: detailsWidth, height: containerElement.clientHeight }}\n size={{ width: detailsWidth, height: containerElement.clientHeight }}\n enable={{ left: true }}\n minWidth={40}\n maxWidth={maxWidth}\n >\n <div className={styles.container} ref={containerRef}>\n <LogLineDetailsTabs focusLogLine={focusLogLine} logs={logs} timeRange={timeRange} timeZone={timeZone} />\n </div>\n </Resizable>\n );\n }\n);\nLogLineDetails.displayName = 'LogLineDetails';\n\nconst LogLineDetailsTabs = memo(\n ({ focusLogLine, logs, timeRange, timeZone }: Pick<Props, 'focusLogLine' | 'logs' | 'timeRange' | 'timeZone'>) => {\n const { app, closeDetails, noInteractions, showDetails, toggleDetails, wrapLogMessage } = useLogListContext();\n const [currentLog, setCurrentLog] = useState(showDetails[0]);\n const previousShowDetails = usePrevious(showDetails);\n const styles = useStyles2(getStyles, 'sidebar');\n\n useEffect(() => {\n // When wrapping is enabled and details is in sidebar mode, the logs panel width changes and the\n // user may lose focus of the log line, so we scroll to it.\n if (wrapLogMessage) {\n focusLogLine(currentLog);\n }\n if (!noInteractions) {\n reportInteraction('logs_log_line_details_displayed', {\n mode: 'sidebar',\n app,\n });\n }\n // Once\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n useEffect(() => {\n if (!showDetails.length) {\n closeDetails();\n return;\n }\n // Focus on the recently open\n if (!previousShowDetails || showDetails.length > previousShowDetails.length) {\n setCurrentLog(showDetails[showDetails.length - 1]);\n return;\n } else if (!showDetails.find((log) => log.uid === currentLog.uid)) {\n setCurrentLog(showDetails[showDetails.length - 1]);\n }\n }, [closeDetails, currentLog.uid, previousShowDetails, showDetails]);\n\n return (\n <>\n {showDetails.length > 1 && (\n <TabsBar>\n {showDetails.map((log) => {\n return (\n <Tab\n key={log.uid}\n truncate\n label={log.entry.substring(0, 25)}\n active={currentLog.uid === log.uid}\n onChangeTab={() => setCurrentLog(log)}\n suffix={() => (\n <Icon\n name=\"times\"\n aria-label={t('logs.log-line-details.remove-log', 'Remove log')}\n onClick={() => toggleDetails(log)}\n />\n )}\n />\n );\n })}\n </TabsBar>\n )}\n <div className={styles.scrollContainer}>\n <LogLineDetailsComponent\n focusLogLine={focusLogLine}\n log={currentLog}\n logs={logs}\n timeRange={timeRange}\n timeZone={timeZone}\n />\n </div>\n </>\n );\n }\n);\nLogLineDetailsTabs.displayName = 'LogLineDetailsTabs';\n\nexport interface InlineLogLineDetailsProps {\n log: LogListModel;\n logs: LogListModel[];\n onResize(): void;\n timeRange: TimeRange;\n timeZone: string;\n}\n\nexport const InlineLogLineDetails = memo(({ logs, log, onResize, timeRange, timeZone }: InlineLogLineDetailsProps) => {\n const { app, detailsWidth, noInteractions } = useLogListContext();\n const styles = useStyles2(getStyles, 'inline');\n const scrollRef = useRef<HTMLDivElement | null>(null);\n\n useEffect(() => {\n if (!noInteractions) {\n reportInteraction('logs_log_line_details_displayed', {\n mode: 'inline',\n app,\n });\n }\n }, [app, noInteractions]);\n\n useEffect(() => {\n window.addEventListener('resize', onResize);\n return () => window.removeEventListener('resize', onResize);\n }, [onResize]);\n\n const saveScroll = useCallback(() => {\n saveDetailsScrollPosition(log, scrollRef.current?.scrollTop ?? 0);\n }, [log]);\n\n useEffect(() => {\n if (!scrollRef.current) {\n return;\n }\n scrollRef.current.scrollTop = getDetailsScrollPosition(log);\n }, [log]);\n\n return (\n <div className={`${styles.inlineWrapper} log-line-inline-details`} style={{ maxWidth: detailsWidth }}>\n <div className={styles.inlineContainer}>\n <div className={styles.scrollContainer} ref={scrollRef} onScroll={saveScroll}>\n <LogLineDetailsComponent log={log} logs={logs} timeRange={timeRange} timeZone={timeZone} />\n </div>\n </div>\n </div>\n );\n});\nInlineLogLineDetails.displayName = 'InlineLogLineDetails';\n\nexport const LOG_LINE_DETAILS_HEIGHT = 45;\n\nconst getStyles = (theme: GrafanaTheme2, mode: LogLineDetailsMode, showControls?: boolean) => ({\n inlineWrapper: css({\n gridColumn: '1 / -1',\n height: `${LOG_LINE_DETAILS_HEIGHT}vh`,\n padding: theme.spacing(1, 2, 1.5, 2),\n marginRight: 1,\n }),\n inlineContainer: css({\n backgroundColor: theme.colors.background.secondary,\n border: `1px solid ${theme.colors.border.weak}`,\n borderRadius: theme.shape.radius.default,\n height: '100%',\n overflow: 'auto',\n }),\n container: css({\n backgroundColor: theme.colors.background.elevated,\n border: `1px solid ${theme.colors.border.weak}`,\n borderBottomRightRadius: showControls ? undefined : theme.shape.radius.default,\n borderRight: mode === 'sidebar' && showControls ? 'none' : undefined,\n borderTopRightRadius: showControls ? undefined : theme.shape.radius.default,\n boxShadow: theme.shadows.z3,\n height: '100%',\n overflow: 'auto',\n }),\n scrollContainer: css({\n overflow: 'auto',\n height: '100%',\n }),\n componentWrapper: css({\n padding: theme.spacing(0, 1, 1, 1),\n }),\n});\n","import 'react';\nimport '@grafana/data';\n\nvar QueryEditorMode = /* @__PURE__ */ ((QueryEditorMode2) => {\n QueryEditorMode2[\"Code\"] = \"code\";\n QueryEditorMode2[\"Builder\"] = \"builder\";\n return QueryEditorMode2;\n})(QueryEditorMode || {});\nconst BINARY_OPERATIONS_KEY = \"Binary operations\";\n\nexport { BINARY_OPERATIONS_KEY, QueryEditorMode };\n//# sourceMappingURL=types.js.map\n","import ansicolor from 'ansicolor';\n\nimport { BusEventWithPayload, GrafanaTheme2 } from '@grafana/data';\n\nimport { LogLineTimestampResolution } from './LogLine';\nimport { LOG_LINE_DETAILS_HEIGHT, LogLineDetailsMode } from './LogLineDetails';\nimport { LogListFontSize } from './LogList';\nimport { LogListModel } from './processing';\n\nexport const LOG_LIST_MIN_WIDTH = 35 * 8;\n// Controls the space between fields in the log line, timestamp, level, displayed fields, and log line body\nexport const FIELD_GAP_MULTIPLIER = 1.5;\n\nexport const DEFAULT_LINE_HEIGHT = 22;\n\nexport const LOG_LIST_CONTROLS_WIDTH = 32;\n\nexport class LogLineVirtualization {\n private ctx: CanvasRenderingContext2D | null = null;\n private gridSize;\n private paddingBottom;\n private lineHeight;\n private measurementMode: 'canvas' | 'dom' = 'canvas';\n private textWidthMap: Map<number, number>;\n private logLineSizesMap: Map<string, number>;\n private spanElement = document.createElement('span');\n readonly fontSize: LogListFontSize;\n\n constructor(theme: GrafanaTheme2, fontSize: LogListFontSize) {\n this.fontSize = fontSize;\n\n let fontSizePx;\n if (fontSize === 'default') {\n fontSizePx = theme.typography.fontSize;\n this.lineHeight = theme.typography.fontSize * theme.typography.body.lineHeight;\n } else {\n fontSizePx =\n typeof theme.typography.bodySmall.fontSize === 'string' && theme.typography.bodySmall.fontSize.includes('rem')\n ? theme.typography.fontSize * parseFloat(theme.typography.bodySmall.fontSize)\n : parseInt(theme.typography.bodySmall.fontSize, 10);\n this.lineHeight = fontSizePx * theme.typography.bodySmall.lineHeight;\n }\n\n this.gridSize = theme.spacing.gridSize;\n this.paddingBottom = this.gridSize * 0.75;\n this.logLineSizesMap = new Map<string, number>();\n this.textWidthMap = new Map<number, number>();\n\n const font = `${fontSizePx}px ${theme.typography.fontFamilyMonospace}`;\n const letterSpacing = theme.typography.body.letterSpacing;\n\n this.initDOMmeasurement(font, letterSpacing);\n this.initCanvasMeasurement(font, letterSpacing);\n this.determineMeasurementMode();\n }\n\n getLineHeight = () => this.lineHeight;\n getGridSize = () => this.gridSize;\n getPaddingBottom = () => this.paddingBottom;\n\n getTruncationLineCount = () => Math.round(window.innerHeight / this.getLineHeight() / 1.5);\n\n getTruncationLength = (container: HTMLDivElement | null) => {\n const availableWidth = container ? getLogContainerWidth(container) : window.innerWidth;\n return (availableWidth / this.measureTextWidth('e')) * this.getTruncationLineCount();\n };\n\n determineMeasurementMode = () => {\n if (!this.ctx) {\n this.measurementMode = 'dom';\n return;\n }\n const canvasCharWidth = this.ctx.measureText('e').width;\n const domCharWidth = this.measureTextWidthWithDOM('e');\n const diff = domCharWidth - canvasCharWidth;\n if (diff >= 0.1) {\n console.warn('Virtualized log list: falling back to DOM for measurement');\n this.measurementMode = 'dom';\n }\n };\n\n initCanvasMeasurement = (font: string, letterSpacing: string | undefined) => {\n const canvas = document.createElement('canvas');\n this.ctx = canvas.getContext('2d');\n if (!this.ctx) {\n return;\n }\n this.ctx.font = font;\n this.ctx.fontKerning = 'normal';\n this.ctx.fontStretch = 'normal';\n this.ctx.fontVariantCaps = 'normal';\n this.ctx.textRendering = 'optimizeLegibility';\n if (letterSpacing) {\n this.ctx.letterSpacing = letterSpacing;\n }\n };\n\n initDOMmeasurement = (font: string, letterSpacing: string | undefined) => {\n this.spanElement.style.font = font;\n this.spanElement.style.visibility = 'hidden';\n this.spanElement.style.position = 'absolute';\n this.spanElement.style.wordBreak = 'break-all';\n if (letterSpacing) {\n this.spanElement.style.letterSpacing = letterSpacing;\n }\n };\n\n measureTextWidth = (text: string): number => {\n if (!this.ctx) {\n throw new Error(`Measuring context canvas is not initialized. Call init() before.`);\n }\n const key = text.length;\n\n const storedWidth = this.textWidthMap.get(key);\n if (storedWidth) {\n return storedWidth;\n }\n\n const width =\n this.measurementMode === 'canvas' ? this.ctx.measureText(text).width : this.measureTextWidthWithDOM(text);\n this.textWidthMap.set(key, width);\n\n return width;\n };\n\n measureTextWidthWithDOM = (text: string) => {\n this.spanElement.textContent = text;\n\n document.body.appendChild(this.spanElement);\n const width = this.spanElement.getBoundingClientRect().width;\n document.body.removeChild(this.spanElement);\n\n return width;\n };\n\n measureTextHeight = (text: string, maxWidth: number, beforeWidth = 0) => {\n let logLines = 0;\n const charWidth = this.measureTextWidth('e');\n let logLineCharsLength = Math.round(maxWidth / charWidth);\n const firstLineCharsLength = Math.floor((maxWidth - beforeWidth) / charWidth) - 2 * charWidth;\n const textLines = text.split('\\n');\n\n // Skip unnecessary measurements\n if (textLines.length === 1 && text.length < firstLineCharsLength) {\n return {\n lines: 1,\n height: this.getLineHeight() + this.paddingBottom,\n };\n }\n\n const availableWidth = maxWidth - beforeWidth;\n for (const textLine of textLines) {\n for (let start = 0; start < textLine.length; ) {\n let testLogLine: string;\n let width = 0;\n let delta = 0;\n do {\n testLogLine = textLine.substring(start, start + logLineCharsLength - delta);\n let measuredLine = testLogLine;\n if (logLines > 0) {\n measuredLine.trimStart();\n }\n width = this.measureTextWidth(measuredLine);\n delta += 1;\n } while (width >= availableWidth);\n if (beforeWidth) {\n beforeWidth = 0;\n }\n logLines += 1;\n start += testLogLine.length;\n }\n }\n\n const height = logLines * this.getLineHeight() + this.paddingBottom;\n\n return {\n lines: logLines,\n height,\n };\n };\n\n calculateFieldDimensions = (\n logs: LogListModel[],\n displayedFields: string[] = [],\n timestampResolution: LogLineTimestampResolution,\n showUniqueLabels?: boolean\n ) => {\n if (!logs.length) {\n return [];\n }\n let timestampWidth = 0;\n let levelWidth = 0;\n const fieldWidths: Record<string, number> = {};\n for (let i = 0; i < logs.length; i++) {\n let width = this.measureTextWidth(timestampResolution === 'ms' ? logs[i].timestamp : logs[i].timestampNs);\n if (width > timestampWidth) {\n timestampWidth = Math.round(width);\n }\n width = this.measureTextWidth(logs[i].displayLevel);\n if (width > levelWidth) {\n levelWidth = Math.round(width);\n }\n for (const field of displayedFields) {\n width = this.measureTextWidth(logs[i].getDisplayedFieldValue(field, true));\n fieldWidths[field] = !fieldWidths[field] || width > fieldWidths[field] ? Math.round(width) : fieldWidths[field];\n }\n }\n const dimensions: LogFieldDimension[] = [\n {\n field: 'timestamp',\n width: timestampWidth,\n },\n {\n field: 'level',\n width: levelWidth,\n },\n ];\n if (showUniqueLabels) {\n dimensions.push({\n field: 'unique-labels',\n width: 0,\n });\n }\n for (const field in fieldWidths) {\n dimensions.push({\n field,\n width: fieldWidths[field],\n });\n }\n return dimensions;\n };\n\n resetLogLineSizes = () => {\n this.logLineSizesMap = new Map<string, number>();\n };\n\n storeLogLineSize = (id: string, container: HTMLDivElement, height: number) => {\n const key = `${id}_${getLogContainerWidth(container)}_${this.fontSize}`;\n this.logLineSizesMap.set(key, height);\n };\n\n retrieveLogLineSize = (id: string, container: HTMLDivElement) => {\n const key = `${id}_${getLogContainerWidth(container)}_${this.fontSize}`;\n return this.logLineSizesMap.get(key);\n };\n}\n\nexport interface DisplayOptions {\n detailsMode: LogLineDetailsMode;\n hasLogsWithErrors?: boolean;\n hasSampledLogs?: boolean;\n showDetails: LogListModel[];\n showDuplicates: boolean;\n showTime: boolean;\n wrap: boolean;\n}\n\nexport function getLogLineSize(\n virtualization: LogLineVirtualization,\n logs: LogListModel[],\n container: HTMLDivElement | null,\n displayedFields: string[],\n { detailsMode, hasLogsWithErrors, hasSampledLogs, showDuplicates, showDetails, showTime, wrap }: DisplayOptions,\n index: number\n) {\n if (!container) {\n return 0;\n }\n const gap = virtualization.getGridSize() * FIELD_GAP_MULTIPLIER;\n const detailsHeight =\n detailsMode === 'inline' && logs[index] && showDetails.findIndex((log) => log.uid === logs[index].uid) >= 0\n ? window.innerHeight * (LOG_LINE_DETAILS_HEIGHT / 100) + gap / 2\n : 0;\n // !logs[index] means the line is not yet loaded by infinite scrolling\n if (!wrap || !logs[index]) {\n return virtualization.getLineHeight() + virtualization.getPaddingBottom() + detailsHeight;\n }\n // If a long line is collapsed, we show the line count + an extra line for the expand/collapse control\n logs[index].updateCollapsedState(displayedFields, container);\n if (logs[index].collapsed) {\n return (virtualization.getTruncationLineCount() + 1) * virtualization.getLineHeight() + detailsHeight;\n }\n\n const storedSize = virtualization.retrieveLogLineSize(logs[index].uid, container);\n if (storedSize) {\n return storedSize;\n }\n\n let textToMeasure = '';\n const iconsGap = virtualization.getGridSize() * 0.5;\n let optionsWidth = 0;\n if (showDuplicates) {\n optionsWidth += virtualization.getGridSize() * 4.5 + iconsGap;\n }\n if (hasLogsWithErrors) {\n optionsWidth += virtualization.getGridSize() * 2 + iconsGap;\n }\n if (hasSampledLogs) {\n optionsWidth += virtualization.getGridSize() * 2 + iconsGap;\n }\n if (showTime) {\n optionsWidth += gap;\n textToMeasure += logs[index].timestamp;\n }\n // When logs are unwrapped, we want an empty column space to align with other log lines.\n if (logs[index].displayLevel || !wrap) {\n optionsWidth += gap;\n textToMeasure += logs[index].displayLevel ?? '';\n }\n for (const field of displayedFields) {\n textToMeasure = logs[index].getDisplayedFieldValue(field, true) + textToMeasure;\n }\n if (!displayedFields.length) {\n textToMeasure += ansicolor.strip(logs[index].body);\n }\n\n const { height } = virtualization.measureTextHeight(textToMeasure, getLogContainerWidth(container), optionsWidth);\n // When the log is collapsed, add an extra line for the expand/collapse control\n return logs[index].collapsed === false\n ? height + virtualization.getLineHeight() + detailsHeight\n : height + detailsHeight;\n}\n\nexport interface LogFieldDimension {\n field: string;\n width: number;\n}\n\nexport function getLogLineDOMHeight(\n virtualization: LogLineVirtualization,\n element: HTMLDivElement,\n calculatedHeight?: number,\n collapsed?: boolean\n): number | null {\n if (collapsed !== undefined && calculatedHeight) {\n calculatedHeight -= virtualization.getLineHeight();\n }\n const inlineDetails = element.parentElement\n ? Array.from(element.parentElement.children).filter((element) =>\n element.classList.contains('log-line-inline-details')\n )\n : undefined;\n const detailsHeight = inlineDetails?.length ? inlineDetails[0].clientHeight : 0;\n\n // Line overflows container\n let measuredHeight = element.scrollHeight + detailsHeight;\n const height = calculatedHeight ?? element.clientHeight;\n if (measuredHeight > height) {\n return collapsed !== undefined ? measuredHeight + virtualization.getLineHeight() : measuredHeight;\n }\n\n // Line is smaller than container\n const child = element.children[1];\n measuredHeight = child.clientHeight + detailsHeight;\n if (child instanceof HTMLDivElement && measuredHeight < height) {\n return collapsed !== undefined ? measuredHeight + virtualization.getLineHeight() : measuredHeight;\n }\n\n // No overflow or undermeasurement\n return null;\n}\n\nconst logLineMenuIconWidth = 24;\nconst scrollBarWidth = getScrollbarWidth();\n\nexport function getLogContainerWidth(container: HTMLDivElement) {\n return container.clientWidth - scrollBarWidth - logLineMenuIconWidth;\n}\n\nexport function getScrollbarWidth() {\n const hiddenDiv = document.createElement('div');\n\n hiddenDiv.style.width = '100px';\n hiddenDiv.style.height = '100px';\n hiddenDiv.style.overflow = 'scroll';\n hiddenDiv.style.position = 'absolute';\n hiddenDiv.style.top = '-9999px';\n\n document.body.appendChild(hiddenDiv);\n const width = hiddenDiv.offsetWidth - hiddenDiv.clientWidth;\n document.body.removeChild(hiddenDiv);\n\n return width;\n}\n\nexport interface ScrollToLogsEventPayload {\n scrollTo: 'top' | 'bottom' | string;\n}\n\nexport class ScrollToLogsEvent extends BusEventWithPayload<ScrollToLogsEventPayload> {\n static type = 'logs-panel-scroll-to';\n}\n","import { css } from '@emotion/css';\nimport React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Dropdown, Icon, IconButton, Tooltip, useStyles2 } from '@grafana/ui';\n\ninterface LogControlOptionProps {\n label?: string;\n expanded: boolean;\n tooltip: string;\n stickToBottom?: boolean;\n}\n\nexport type Props = React.ComponentProps<typeof IconButton> & LogControlOptionProps;\n\nexport const LogListControlsOption = React.forwardRef<HTMLButtonElement, Props>(\n (\n {\n stickToBottom,\n expanded,\n label,\n tooltip,\n className: iconButtonClassName,\n name: iconButtonName,\n ...iconButtonProps\n }: Props,\n ref\n ) => {\n const styles = useStyles2(getStyles, expanded);\n\n return (\n <div className={`${styles.container} ${stickToBottom ? styles.marginTopAuto : ''}`}>\n <label className={styles.label}>\n <span className={styles.labelText}>{label ?? tooltip}</span>\n <span className={styles.iconContainer}>\n <IconButton\n name={iconButtonName}\n tooltip={tooltip}\n className={iconButtonClassName}\n ref={ref}\n {...iconButtonProps}\n />\n </span>\n </label>\n </div>\n );\n }\n);\n\ninterface LogControlSelectOptionProps {\n label?: string;\n expanded: boolean;\n tooltip: string;\n stickToBottom?: boolean;\n dropdown: JSX.Element;\n isActive: boolean;\n customTagText: string;\n buttonAriaLabel: string;\n}\nexport type SelectProps = React.ComponentProps<typeof Icon> & LogControlSelectOptionProps;\n\nexport const LogListControlsSelectOption = React.forwardRef<SVGElement, SelectProps>(\n (\n {\n stickToBottom,\n expanded,\n label,\n tooltip,\n className: iconButtonClassName,\n name: iconButtonName,\n dropdown,\n isActive,\n customTagText,\n buttonAriaLabel,\n ...iconButtonProps\n }: SelectProps,\n ref\n ) => {\n const styles = useStyles2(getStyles, expanded);\n\n return (\n <div className={styles.container}>\n <label className={styles.label}>\n <span className={styles.labelText}>{label ?? tooltip}</span>\n <span>\n <Dropdown overlay={dropdown} placement=\"auto-end\">\n <div className={styles.iconContainer}>\n <Tooltip content={tooltip}>\n <button\n aria-pressed={isActive}\n aria-label={buttonAriaLabel}\n className={`${styles.customControlButton} ${isActive ? styles.controlButtonActive : styles.controlButton}`}\n type=\"button\"\n >\n <Icon\n {...iconButtonProps}\n ref={ref}\n name={iconButtonName}\n size=\"lg\"\n className={styles.customControlIcon}\n />\n {isActive && <span className={styles.customControlTag}>{customTagText}</span>}\n </button>\n </Tooltip>\n </div>\n </Dropdown>\n </span>\n </label>\n </div>\n );\n }\n);\n\nLogListControlsSelectOption.displayName = 'LogListControlsSelectOption';\nconst getStyles = (theme: GrafanaTheme2, expanded: boolean) => {\n const hoverSize = '26';\n return {\n customControlTag: css({\n color: theme.colors.primary.text,\n fontSize: 10,\n position: 'absolute',\n bottom: -4,\n right: 1,\n lineHeight: '10px',\n backgroundColor: theme.colors.background.primary,\n paddingLeft: 2,\n }),\n customControlIcon: css({\n verticalAlign: 'baseline',\n }),\n customControlButton: css({\n position: 'relative',\n zIndex: 0,\n margin: 0,\n boxShadow: 'none',\n border: 'none',\n display: 'flex',\n background: 'transparent',\n justifyContent: 'center',\n alignItems: 'center',\n padding: 0,\n overflow: 'visible',\n width: '100%',\n }),\n controlButtonActive: css({\n margin: 0,\n color: theme.colors.text.secondary,\n height: theme.spacing(2),\n '&:hover': {\n '&:before': {\n backgroundColor: theme.colors.action.hover,\n opacity: 1,\n },\n },\n '&:before': {\n zIndex: -1,\n position: 'absolute',\n opacity: 0,\n width: `${hoverSize}px`,\n height: `${hoverSize}px`,\n borderRadius: theme.shape.radius.default,\n content: '\"\"',\n [theme.transitions.handleMotion('no-preference', 'reduce')]: {\n transitionDuration: '0.2s',\n transitionTimingFunction: 'cubic-bezier(0.4, 0, 0.2, 1)',\n transitionProperty: 'opacity',\n },\n },\n '&:after': {\n display: 'block',\n content: '\" \"',\n position: 'absolute',\n height: 2,\n borderRadius: theme.shape.radius.default,\n bottom: theme.spacing(-1),\n backgroundImage: theme.colors.gradients.brandHorizontal,\n width: theme.spacing(2.25),\n opacity: 1,\n },\n }),\n controlButton: css({\n margin: 0,\n color: theme.colors.text.secondary,\n height: theme.spacing(2),\n }),\n marginTopAuto: css({\n marginTop: 'auto',\n marginBottom: theme.spacing(1),\n }),\n labelText: css({\n display: expanded ? 'block' : 'none',\n }),\n iconContainer: css({\n display: 'flex',\n alignItems: 'center',\n height: '16px',\n }),\n container: css({\n fontSize: theme.typography.pxToRem(12),\n height: theme.spacing(2),\n width: 'auto',\n }),\n label: css({\n display: 'flex',\n justifyContent: expanded ? 'space-between' : 'center',\n marginRight: expanded ? '2.5px' : 0,\n }),\n };\n};\n\nLogListControlsOption.displayName = 'LogListControlsOption';\n","import { css, cx } from '@emotion/css';\nimport { capitalize } from 'lodash';\nimport { MouseEvent, useCallback, useMemo } from 'react';\n\nimport {\n CoreApp,\n EventBus,\n LogLevel,\n LogsDedupDescription,\n LogsDedupStrategy,\n LogsSortOrder,\n store,\n} from '@grafana/data';\nimport { GrafanaTheme2 } from '@grafana/data/';\nimport { t } from '@grafana/i18n';\nimport { config, reportInteraction } from '@grafana/runtime';\nimport { Dropdown, Menu, useStyles2 } from '@grafana/ui';\n\nimport { LogsVisualisationType } from '../../../explore/Logs/Logs';\nimport { DownloadFormat } from '../../utils';\n\nimport { useLogListContext } from './LogListContext';\nimport { LogListControlsOption, LogListControlsSelectOption } from './LogListControlsOption';\nimport { useLogListSearchContext } from './LogListSearchContext';\nimport { ScrollToLogsEvent } from './virtualization';\n\ntype Props = {\n eventBus: EventBus;\n visualisationType?: LogsVisualisationType;\n logLevels?: LogLevel[];\n};\n\nconst DEDUP_OPTIONS = [\n LogsDedupStrategy.none,\n LogsDedupStrategy.exact,\n LogsDedupStrategy.numbers,\n LogsDedupStrategy.signature,\n];\n\nconst FILTER_LEVELS: LogLevel[] = [\n LogLevel.info,\n LogLevel.debug,\n LogLevel.trace,\n LogLevel.warning,\n LogLevel.error,\n LogLevel.critical,\n LogLevel.unknown,\n];\n\nexport const LogListControls = ({ eventBus, logLevels = FILTER_LEVELS, visualisationType = 'logs' }: Props) => {\n const {\n app,\n controlsExpanded,\n dedupStrategy,\n downloadLogs,\n filterLevels,\n fontSize,\n forceEscape,\n hasUnescapedContent,\n logOptionsStorageKey,\n prettifyJSON,\n setControlsExpanded,\n setDedupStrategy,\n setFilterLevels,\n setFontSize,\n setForceEscape,\n setPrettifyJSON,\n setShowTime,\n setShowUniqueLabels,\n setSortOrder,\n setSyntaxHighlighting,\n setWrapLogMessage,\n showTime,\n showUniqueLabels,\n sortOrder,\n syntaxHighlighting,\n wrapLogMessage,\n } = useLogListContext();\n const { hideSearch, searchVisible, showSearch } = useLogListSearchContext();\n\n const styles = useStyles2(getStyles, controlsExpanded);\n\n const onScrollToTopClick = useCallback(() => {\n reportInteraction('logs_log_list_controls_scroll_top_clicked');\n eventBus.publish(\n new ScrollToLogsEvent({\n scrollTo: 'top',\n })\n );\n }, [eventBus]);\n\n const onScrollToBottomClick = useCallback(() => {\n reportInteraction('logs_log_list_controls_scroll_bottom_clicked');\n eventBus.publish(\n new ScrollToLogsEvent({\n scrollTo: 'bottom',\n })\n );\n }, [eventBus]);\n\n const onExpandControlsClick = useCallback(() => {\n reportInteraction('logs_log_list_controls_expand_controls_clicked');\n setControlsExpanded(!controlsExpanded);\n store.set(`${logOptionsStorageKey}.controlsExpanded`, !controlsExpanded);\n }, [controlsExpanded, logOptionsStorageKey, setControlsExpanded]);\n\n const onForceEscapeClick = useCallback(() => {\n reportInteraction('logs_log_list_controls_force_escape_clicked');\n setForceEscape(!forceEscape);\n }, [forceEscape, setForceEscape]);\n\n const onFilterLevelClick = useCallback(\n (level?: LogLevel) => {\n reportInteraction('logs_log_list_controls_level_clicked', {\n level,\n });\n if (level === undefined) {\n setFilterLevels([]);\n } else if (!filterLevels.includes(level)) {\n setFilterLevels([...filterLevels, level]);\n } else {\n setFilterLevels(filterLevels.filter((filterLevel) => filterLevel !== level));\n }\n },\n [filterLevels, setFilterLevels]\n );\n\n const onFontSizeClick = useCallback(() => {\n const newSize = fontSize === 'default' ? 'small' : 'default';\n reportInteraction('logs_log_list_controls_font_size_clicked', {\n size: newSize,\n });\n setFontSize(newSize);\n }, [fontSize, setFontSize]);\n\n const onShowTimestampsClick = useCallback(() => {\n reportInteraction('logs_log_list_controls_show_time_clicked', {\n show_time: !showTime,\n });\n setShowTime(!showTime);\n }, [setShowTime, showTime]);\n\n const onShowUniqueLabelsClick = useCallback(() => {\n reportInteraction('logs_log_list_controls_show_unique_labels_clicked', {\n show_unique_labels: showUniqueLabels,\n });\n setShowUniqueLabels(!showUniqueLabels);\n }, [setShowUniqueLabels, showUniqueLabels]);\n\n const onSortOrderClick = useCallback(() => {\n reportInteraction('logs_log_list_controls_sort_order_clicked', {\n order: sortOrder === LogsSortOrder.Ascending ? LogsSortOrder.Descending : LogsSortOrder.Ascending,\n });\n setSortOrder(sortOrder === LogsSortOrder.Ascending ? LogsSortOrder.Descending : LogsSortOrder.Ascending);\n }, [setSortOrder, sortOrder]);\n\n const onSetPrettifyJSONClick = useCallback(() => {\n reportInteraction('logs_log_list_controls_prettify_json_clicked', {\n state: !prettifyJSON,\n });\n setPrettifyJSON(!prettifyJSON);\n }, [prettifyJSON, setPrettifyJSON]);\n\n const onSyntaxHightlightingClick = useCallback(() => {\n reportInteraction('logs_log_list_controls_syntax_clicked', {\n state: !syntaxHighlighting,\n });\n setSyntaxHighlighting(!syntaxHighlighting);\n }, [setSyntaxHighlighting, syntaxHighlighting]);\n\n const onWrapLogMessageClick = useCallback(\n (e: MouseEvent) => {\n e.preventDefault();\n reportInteraction('logs_log_list_controls_wrap_clicked', {\n state: !wrapLogMessage,\n });\n setWrapLogMessage(!wrapLogMessage);\n },\n [setWrapLogMessage, wrapLogMessage]\n );\n\n const deduplicationMenu = useMemo(\n () => (\n <Menu>\n {DEDUP_OPTIONS.map((option) => (\n <Menu.Item\n key={option}\n className={dedupStrategy === option ? styles.menuItemActive : undefined}\n description={LogsDedupDescription[option]}\n label={capitalize(option)}\n onClick={() => {\n setDedupStrategy(option);\n reportInteraction('logs_log_list_controls_deduplication_clicked', {\n option,\n });\n }}\n />\n ))}\n </Menu>\n ),\n [dedupStrategy, setDedupStrategy, styles.menuItemActive]\n );\n\n const filterLevelsMenu = useMemo(\n () => (\n <Menu>\n <Menu.Item\n key={'all'}\n className={filterLevels.length === 0 ? styles.menuItemActive : undefined}\n label={t('logs.logs-controls.display-level-all', 'All levels')}\n onClick={() => onFilterLevelClick()}\n />\n {logLevels.map((level) => (\n <Menu.Item\n key={level}\n className={filterLevels.includes(level) ? styles.menuItemActive : undefined}\n label={capitalize(level)}\n onClick={() => onFilterLevelClick(level)}\n />\n ))}\n </Menu>\n ),\n [filterLevels, logLevels, onFilterLevelClick, styles.menuItemActive]\n );\n\n const downloadMenu = useMemo(\n () => (\n <Menu>\n <Menu.Item\n label={t('logs.logs-controls.download-logs.txt', 'txt')}\n onClick={() => {\n downloadLogs(DownloadFormat.Text);\n reportInteraction('logs_log_list_controls_downloaded_logs', {\n format: DownloadFormat.Text,\n });\n }}\n />\n <Menu.Item\n label={t('logs.logs-controls.download-logs.json', 'json')}\n onClick={() => {\n downloadLogs(DownloadFormat.Json);\n reportInteraction('logs_log_list_controls_downloaded_logs', {\n format: DownloadFormat.Json,\n });\n }}\n />\n <Menu.Item\n label={t('logs.logs-controls.download-logs.csv', 'csv')}\n onClick={() => {\n downloadLogs(DownloadFormat.CSV);\n reportInteraction('logs_log_list_controls_downloaded_logs', {\n format: DownloadFormat.CSV,\n });\n }}\n />\n </Menu>\n ),\n [downloadLogs]\n );\n\n const inDashboard = app === CoreApp.Dashboard || app === CoreApp.PanelEditor || app === CoreApp.PanelViewer;\n\n return (\n <div className={styles.navContainer}>\n <>\n <LogListControlsOption\n expanded={controlsExpanded}\n name=\"arrow-from-right\"\n className={cx(styles.controlButton, styles.controlsExpandedButton)}\n variant=\"secondary\"\n onClick={onExpandControlsClick}\n label={\n controlsExpanded\n ? t('logs.logs-controls.label.collapse', 'Expanded')\n : t('logs.logs-controls.label.expand', 'Collapsed')\n }\n tooltip={\n controlsExpanded ? t('logs.logs-controls.collapse', 'Collapse') : t('logs.logs-controls.expand', 'Expand')\n }\n size=\"lg\"\n />\n {visualisationType === 'logs' && (\n <LogListControlsOption\n expanded={controlsExpanded}\n name=\"arrow-down\"\n className={styles.controlButton}\n variant=\"secondary\"\n onClick={onScrollToBottomClick}\n tooltip={t('logs.logs-controls.scroll-bottom', 'Scroll to bottom')}\n size=\"lg\"\n />\n )}\n </>\n {!inDashboard ? (\n <>\n <LogListControlsOption\n expanded={controlsExpanded}\n name={sortOrder === LogsSortOrder.Descending ? 'sort-amount-up' : 'sort-amount-down'}\n className={styles.controlButton}\n onClick={onSortOrderClick}\n label={\n sortOrder === LogsSortOrder.Descending\n ? t('logs.logs-controls.labels.newest-first', 'Newest logs first')\n : t('logs.logs-controls.labels.oldest-first', 'Oldest logs first')\n }\n tooltip={\n sortOrder === LogsSortOrder.Descending\n ? t('logs.logs-controls.newest-first', 'Sorted by newest logs first - Click to show oldest first')\n : t('logs.logs-controls.oldest-first', 'Sorted by oldest logs first - Click to show newest first')\n }\n size=\"lg\"\n />\n {visualisationType === 'logs' && (\n <>\n <div className={styles.divider} />\n {config.featureToggles.newLogsPanel && (\n <LogListControlsOption\n expanded={controlsExpanded}\n name={'search'}\n className={searchVisible ? styles.controlButtonActive : styles.controlButton}\n onClick={searchVisible ? hideSearch : showSearch}\n label={\n searchVisible\n ? t('logs.logs-controls.labels.hide-search', 'Close search')\n : t('logs.logs-controls.labels.show-search', 'Search logs')\n }\n tooltip={\n searchVisible\n ? t('logs.logs-controls.hide-search', 'Close search')\n : t('logs.logs-controls.show-search', 'Search in logs result')\n }\n size=\"lg\"\n />\n )}\n <Dropdown overlay={deduplicationMenu} placement=\"auto-end\">\n <LogListControlsOption\n expanded={controlsExpanded}\n name={'filter'}\n className={\n dedupStrategy !== LogsDedupStrategy.none ? styles.controlButtonActive : styles.controlButton\n }\n tooltip={t('logs.logs-controls.deduplication', 'Deduplication')}\n size=\"lg\"\n />\n </Dropdown>\n <Dropdown overlay={filterLevelsMenu} placement=\"auto-end\">\n <LogListControlsOption\n expanded={controlsExpanded}\n name={'gf-logs'}\n className={\n filterLevels && filterLevels.length > 0 ? styles.controlButtonActive : styles.controlButton\n }\n label={t('logs.logs-controls.filter-levels', 'Filter levels')}\n tooltip={t('logs.logs-controls.tooltip.filter-level', 'Filter logs result by level')}\n size=\"lg\"\n />\n </Dropdown>\n <div className={styles.divider} />\n {config.featureToggles.newLogsPanel ? (\n <TimestampResolutionButton expanded={controlsExpanded} />\n ) : (\n <LogListControlsOption\n expanded={controlsExpanded}\n name=\"clock-nine\"\n aria-pressed={showTime}\n className={showTime ? styles.controlButtonActive : styles.controlButton}\n onClick={onShowTimestampsClick}\n tooltip={\n showTime\n ? t('logs.logs-controls.hide-timestamps', 'Hide timestamps')\n : t('logs.logs-controls.show-timestamps', 'Show timestamps')\n }\n size=\"lg\"\n />\n )}\n {/* When this is used in a Plugin context, app is unknown */}\n {showUniqueLabels !== undefined && app !== CoreApp.Unknown && (\n <LogListControlsOption\n expanded={controlsExpanded}\n name=\"tag-alt\"\n aria-pressed={showUniqueLabels}\n className={showUniqueLabels ? styles.controlButtonActive : styles.controlButton}\n onClick={onShowUniqueLabelsClick}\n tooltip={\n showUniqueLabels\n ? t('logs.logs-controls.hide-unique-labels', 'Hide unique labels')\n : t('logs.logs-controls.show-unique-labels', 'Show unique labels')\n }\n size=\"lg\"\n />\n )}\n {config.featureToggles.newLogsPanel ? (\n <WrapLogMessageButton expanded={controlsExpanded} />\n ) : (\n <LogListControlsOption\n expanded={controlsExpanded}\n name=\"wrap-text\"\n className={wrapLogMessage ? styles.controlButtonActive : styles.controlButton}\n aria-pressed={wrapLogMessage}\n onClick={onWrapLogMessageClick}\n tooltip={\n wrapLogMessage\n ? t('logs.logs-controls.unwrap-lines', 'Unwrap lines')\n : t('logs.logs-controls.wrap-lines', 'Wrap lines')\n }\n size=\"lg\"\n />\n )}\n {prettifyJSON !== undefined && !config.featureToggles.newLogsPanel && (\n <LogListControlsOption\n expanded={controlsExpanded}\n name=\"brackets-curly\"\n aria-pressed={prettifyJSON}\n className={prettifyJSON ? styles.controlButtonActive : styles.controlButton}\n onClick={onSetPrettifyJSONClick}\n tooltip={\n prettifyJSON\n ? t('logs.logs-controls.disable-prettify-json', 'Collapse JSON logs')\n : t('logs.logs-controls.prettify-json', 'Expand JSON logs')\n }\n size=\"lg\"\n />\n )}\n {syntaxHighlighting !== undefined && (\n <LogListControlsOption\n expanded={controlsExpanded}\n name=\"brackets-curly\"\n className={syntaxHighlighting ? styles.controlButtonActive : styles.controlButton}\n aria-pressed={syntaxHighlighting}\n onClick={onSyntaxHightlightingClick}\n label={\n syntaxHighlighting\n ? t('logs.logs-controls.label.disable-highlighting', 'Highlight text')\n : t('logs.logs-controls.label.enable-highlighting', 'Plain text')\n }\n tooltip={\n syntaxHighlighting\n ? t('logs.logs-controls.tooltip.disable-highlighting', 'Disable highlighting')\n : t('logs.logs-controls.tooltip.enable-highlighting', 'Enable highlighting')\n }\n size=\"lg\"\n />\n )}\n {config.featureToggles.newLogsPanel && (\n <LogListControlsOption\n expanded={controlsExpanded}\n name=\"text-fields\"\n className={fontSize === 'small' ? styles.controlButtonActive : styles.controlButton}\n aria-pressed={Boolean(fontSize)}\n onClick={onFontSizeClick}\n label={\n fontSize === 'default'\n ? t('logs.logs-controls.labels.font-large', 'Large font')\n : t('logs.logs-controls.labels.font-small', 'Small font')\n }\n tooltip={\n fontSize === 'default'\n ? t('logs.logs-controls.font-small', 'Set small font')\n : t('logs.logs-controls.font-large', 'Set large font')\n }\n size=\"lg\"\n />\n )}\n {hasUnescapedContent && (\n <LogListControlsOption\n expanded={controlsExpanded}\n name=\"enter\"\n aria-pressed={forceEscape}\n className={forceEscape ? styles.controlButtonActive : styles.controlButton}\n onClick={onForceEscapeClick}\n label={\n forceEscape\n ? t('logs.logs-controls.remove-escaping', 'Remove escaping')\n : t('logs.logs-controls.label.escape-newlines', 'Escape newlines')\n }\n tooltip={\n forceEscape\n ? t('logs.logs-controls.remove-escaping', 'Remove escaping')\n : t(\n 'logs.logs-controls.escape-newlines',\n 'Fix incorrectly escaped newline and tab sequences in log lines'\n )\n }\n size=\"lg\"\n />\n )}\n </>\n )}\n {!config.exploreHideLogsDownload && (\n <>\n <div className={styles.divider} />\n <Dropdown overlay={downloadMenu} placement=\"auto-end\">\n <LogListControlsOption\n expanded={controlsExpanded}\n name=\"download-alt\"\n className={styles.controlButton}\n label={t('logs.logs-controls.download', 'Download logs')}\n tooltip={t('logs.logs-controls.tooltip.download', 'Download')}\n size=\"lg\"\n />\n </Dropdown>\n </>\n )}\n </>\n ) : (\n <>\n {config.featureToggles.newLogsPanel && (\n <LogListControlsOption\n expanded={controlsExpanded}\n name={'search'}\n className={searchVisible ? styles.controlButtonActive : styles.controlButton}\n onClick={searchVisible ? hideSearch : showSearch}\n label={\n searchVisible\n ? t('logs.logs-controls.labels.hide-search', 'Close search')\n : t('logs.logs-controls.labels.show-search', 'Search logs')\n }\n tooltip={\n searchVisible\n ? t('logs.logs-controls.hide-search', 'Close search')\n : t('logs.logs-controls.show-search', 'Search in logs result')\n }\n size=\"lg\"\n />\n )}\n <Dropdown overlay={filterLevelsMenu} placement=\"auto-end\">\n <LogListControlsOption\n expanded={controlsExpanded}\n name={'gf-logs'}\n className={filterLevels && filterLevels.length > 0 ? styles.controlButtonActive : styles.controlButton}\n label={t('logs.logs-controls.filter-levels', 'Filter levels')}\n tooltip={t('logs.logs-controls.tooltip.filter-level', 'Filter logs result by level')}\n size=\"lg\"\n />\n </Dropdown>\n {visualisationType === 'logs' && hasUnescapedContent && (\n <LogListControlsOption\n expanded={controlsExpanded}\n name=\"enter\"\n aria-pressed={forceEscape}\n className={forceEscape ? styles.controlButtonActive : styles.controlButton}\n onClick={onForceEscapeClick}\n label={\n forceEscape\n ? t('logs.logs-controls.remove-escaping', 'Remove escaping')\n : t('logs.logs-controls.label.escape-newlines', 'Escape newlines')\n }\n tooltip={\n forceEscape\n ? t('logs.logs-controls.remove-escaping', 'Remove escaping')\n : t(\n 'logs.logs-controls.escape-newlines',\n 'Fix incorrectly escaped newline and tab sequences in log lines'\n )\n }\n size=\"lg\"\n />\n )}\n </>\n )}\n {visualisationType === 'logs' && (\n <LogListControlsOption\n stickToBottom={true}\n expanded={controlsExpanded}\n name=\"arrow-up\"\n data-testid=\"scrollToTop\"\n className={styles.scrollToTopButton}\n variant=\"secondary\"\n onClick={onScrollToTopClick}\n tooltip={t('logs.logs-controls.scroll-top', 'Scroll to top')}\n size=\"lg\"\n />\n )}\n </div>\n );\n};\n\ninterface LogSelectOptionProps {\n expanded: boolean;\n}\n\nconst TimestampResolutionButton = ({ expanded }: LogSelectOptionProps) => {\n const styles = useStyles2(getWrapButtonStyles, expanded);\n const { setTimestampResolution, setShowTime, showTime, timestampResolution } = useLogListContext();\n\n const hide = useCallback(() => {\n setShowTime(false);\n reportInteraction('logs_log_list_controls_show_time_clicked', {\n show_time: false,\n });\n }, [setShowTime]);\n\n const showMs = useCallback(() => {\n setShowTime(true);\n setTimestampResolution('ms');\n reportInteraction('logs_log_list_controls_show_time_clicked', {\n show_time: false,\n resolution: 'ms',\n });\n }, [setShowTime, setTimestampResolution]);\n\n const showNs = useCallback(() => {\n setShowTime(true);\n setTimestampResolution('ns');\n reportInteraction('logs_log_list_controls_show_time_clicked', {\n show_time: false,\n resolution: 'ns',\n });\n }, [setShowTime, setTimestampResolution]);\n\n const timestampMenu = useMemo(\n () => (\n <Menu>\n <Menu.Item\n label={t('logs.logs-controls.timestamp.hide', 'Hide timestamps')}\n className={!showTime ? styles.menuItemActive : undefined}\n onClick={hide}\n />\n <Menu.Item\n label={t('logs.logs-controls.timestamp.milliseconds', 'Show millisecond timestamps')}\n className={showTime && timestampResolution === 'ms' ? styles.menuItemActive : undefined}\n onClick={showMs}\n />\n <Menu.Item\n label={t('logs.logs-controls.timestamp.nanoseconds', 'Show nanosecond timestamps')}\n className={showTime && timestampResolution === 'ns' ? styles.menuItemActive : undefined}\n onClick={showNs}\n />\n </Menu>\n ),\n [hide, showMs, showNs, showTime, styles.menuItemActive, timestampResolution]\n );\n\n const labelText = !showTime\n ? t('logs.logs-controls.timestamp.label-hide', 'Hide timestamps')\n : timestampResolution === 'ms'\n ? t('logs.logs-controls.timestamp.label-ms', 'Display ms')\n : t('logs.logs-controls.timestamp.label-ns', 'Display ns');\n\n const customTagText =\n timestampResolution === 'ms'\n ? t('logs.logs-controls.resolution-ms', 'ms')\n : t('logs.logs-controls.resolution-ns', 'ns');\n\n return (\n <LogListControlsSelectOption\n expanded={expanded}\n name={'clock-nine'}\n isActive={showTime}\n dropdown={timestampMenu}\n tooltip={t('logs.logs-controls.timestamp.tooltip', 'Set timestamp format')}\n label={labelText}\n buttonAriaLabel={t('logs.logs-controls.timestamp.label', 'Log timestamps')}\n customTagText={customTagText}\n />\n );\n};\nconst WrapLogMessageButton = ({ expanded }: LogSelectOptionProps) => {\n const styles = useStyles2(getWrapButtonStyles, expanded);\n const { prettifyJSON, setPrettifyJSON, setWrapLogMessage, wrapLogMessage } = useLogListContext();\n\n /**\n * This component currently controls two internal states: line wrapping and JSON formatting.\n * The state transition is as follows:\n * - Line wrapping and JSON formatting disabled.\n * - Line wrapping enabled.\n * - Line wrapping and JSON formatting enabled.\n *\n * Line wrapping also controls JSON formatting, because with line wrapping disabled,\n * JSON formatting has no effect, so one is related with the other.\n */\n const disable = useCallback(() => {\n setWrapLogMessage(false);\n setPrettifyJSON(false);\n reportInteraction('logs_log_list_controls_wrap_clicked', {\n state: false,\n prettify: false,\n });\n }, [setPrettifyJSON, setWrapLogMessage]);\n\n const wrap = useCallback(() => {\n setWrapLogMessage(true);\n setPrettifyJSON(false);\n reportInteraction('logs_log_list_controls_wrap_clicked', {\n state: true,\n prettify: false,\n });\n }, [setPrettifyJSON, setWrapLogMessage]);\n\n const wrapAndPrettify = useCallback(() => {\n setWrapLogMessage(true);\n setPrettifyJSON(true);\n reportInteraction('logs_log_list_controls_wrap_clicked', {\n state: true,\n prettify: true,\n });\n }, [setPrettifyJSON, setWrapLogMessage]);\n\n const wrappingMenu = useMemo(\n () => (\n <Menu>\n <Menu.Item\n label={t('logs.logs-controls.line-wrapping.hide', 'Disable line wrapping')}\n className={!wrapLogMessage ? styles.menuItemActive : undefined}\n onClick={disable}\n />\n <Menu.Item\n label={t('logs.logs-controls.line-wrapping.enable', 'Enable line wrapping')}\n className={wrapLogMessage && !prettifyJSON ? styles.menuItemActive : undefined}\n onClick={wrap}\n />\n <Menu.Item\n label={t('logs.logs-controls.line-wrapping.enable-prettify', 'Enable line wrapping and prettify JSON')}\n className={wrapLogMessage && prettifyJSON ? styles.menuItemActive : undefined}\n onClick={wrapAndPrettify}\n />\n </Menu>\n ),\n [disable, prettifyJSON, styles.menuItemActive, wrap, wrapAndPrettify, wrapLogMessage]\n );\n\n const wrapStateText = !wrapLogMessage\n ? t('logs.logs-controls.line-wrapping.state.hide', 'Wrap disabled')\n : wrapLogMessage && !prettifyJSON\n ? t('logs.logs-controls.line-wrapping.state.wrap', 'Wrap lines')\n : t('logs.logs-controls.line-wrapping.state.json', 'Wrap JSON');\n\n const tooltip = t('logs.logs-controls.line-wrapping.tooltip', 'Set line wrap');\n\n return (\n <LogListControlsSelectOption\n expanded={expanded}\n name={'wrap-text'}\n isActive={wrapLogMessage}\n dropdown={wrappingMenu}\n tooltip={tooltip}\n label={wrapStateText}\n buttonAriaLabel={tooltip}\n customTagText={prettifyJSON ? '+' : ''}\n />\n );\n};\n\nconst getWrapButtonStyles = (theme: GrafanaTheme2, expanded: boolean) => {\n return {\n menuItemActive: css({\n '&:before': {\n content: '\"\"',\n position: 'absolute',\n left: 0,\n top: theme.spacing(0.5),\n height: `calc(100% - ${theme.spacing(1)})`,\n width: '2px',\n backgroundColor: theme.colors.warning.main,\n },\n }),\n };\n};\n\nexport const CONTROLS_WIDTH = 35;\nexport const CONTROLS_WIDTH_EXPANDED = 176;\n\nconst getStyles = (theme: GrafanaTheme2, controlsExpanded: boolean) => {\n return {\n navContainer: css({\n maxHeight: '100%',\n display: 'flex',\n flex: '1 0 auto',\n gap: theme.spacing(3),\n flexDirection: 'column',\n justifyContent: 'flex-start',\n width: controlsExpanded ? CONTROLS_WIDTH_EXPANDED : CONTROLS_WIDTH,\n paddingTop: theme.spacing(0.75),\n paddingLeft: theme.spacing(1),\n borderLeft: `solid 1px ${theme.colors.border.medium}`,\n minWidth: theme.spacing(4),\n backgroundColor: theme.colors.background.primary,\n }),\n scrollToTopButton: css({\n margin: 0,\n marginTop: 'auto',\n color: theme.colors.text.secondary,\n height: theme.spacing(2),\n }),\n controlsExpandedButton: css({\n transform: !controlsExpanded ? 'rotate(180deg)' : '',\n }),\n controlButton: css({\n margin: 0,\n color: theme.colors.text.secondary,\n height: theme.spacing(2),\n }),\n divider: css({\n borderTop: `solid 1px ${theme.colors.border.medium}`,\n height: 1,\n marginTop: theme.spacing(-0.25),\n marginBottom: theme.spacing(-1.75),\n }),\n controlButtonActive: css({\n margin: 0,\n color: theme.colors.text.secondary,\n height: theme.spacing(2),\n '&:after': {\n display: 'block',\n content: '\" \"',\n position: 'absolute',\n height: 2,\n borderRadius: theme.shape.radius.default,\n bottom: theme.spacing(-1),\n backgroundImage: theme.colors.gradients.brandHorizontal,\n width: theme.spacing(2.25),\n opacity: 1,\n },\n }),\n menuItemActive: css({\n '&:before': {\n content: '\"\"',\n position: 'absolute',\n left: 0,\n top: theme.spacing(0.5),\n height: `calc(100% - ${theme.spacing(1)})`,\n width: '2px',\n backgroundColor: theme.colors.warning.main,\n },\n }),\n };\n};\n","import { reportInteraction } from '@grafana/runtime';\n\nexport const reportInteractionOnce = (interactionName: string, properties?: Record<string, unknown>) => {\n const key = `logs.interactions.${interactionName}`;\n if (sessionStorage.getItem(key)) {\n return;\n }\n sessionStorage.setItem(key, '1');\n reportInteraction(interactionName, properties);\n};\n","import { css } from '@emotion/css';\nimport { memo, forwardRef, useMemo, useState } from 'react';\n\nimport { GrafanaTheme2, Labels } from '@grafana/data';\nimport { t } from '@grafana/i18n';\nimport { Button, Icon, Tooltip, useStyles2 } from '@grafana/ui';\n\nimport { getNormalizedFieldName } from './panel/processing';\n\n// Levels are already encoded in color, filename is a Loki-ism\nconst HIDDEN_LABELS = ['detected_level', 'level', 'lvl', 'filename'];\n\nexport interface Props {\n labels: Labels;\n emptyMessage?: string;\n addTooltip?: boolean;\n displayMax?: number;\n displayAll?: boolean;\n onDisplayMaxToggle?(state: boolean): void;\n}\n\nexport const LogLabels = memo(\n ({\n labels,\n emptyMessage,\n addTooltip = true,\n displayMax,\n onDisplayMaxToggle,\n displayAll: initialDisplayAll = false,\n }: Props) => {\n const [displayAll, setDisplayAll] = useState<boolean | undefined>(displayMax ? initialDisplayAll : undefined);\n const styles = useStyles2(getStyles);\n const allLabels = useMemo(\n () =>\n Object.keys(labels)\n .filter((label) => !label.startsWith('_') && !HIDDEN_LABELS.includes(label) && labels[label])\n .map((label) => `${label}=${labels[label]}`),\n [labels]\n );\n const displayLabels = useMemo(\n () => allLabels.slice(0, !displayAll && displayMax ? displayMax : Infinity),\n [allLabels, displayAll, displayMax]\n );\n\n if (displayLabels.length === 0 && emptyMessage) {\n return (\n <span className={styles.logsLabels}>\n <span className={styles.logsLabel}>{emptyMessage}</span>\n </span>\n );\n }\n\n return (\n <span className={styles.logsLabels}>\n {displayLabels.map((labelValue) => {\n return addTooltip ? (\n <Tooltip content={labelValue} key={labelValue} placement=\"top\">\n <LogLabel styles={styles}>{labelValue}</LogLabel>\n </Tooltip>\n ) : (\n <LogLabel styles={styles} tooltip={labelValue} key={labelValue}>\n {labelValue}\n </LogLabel>\n );\n })}\n {displayLabels.length < allLabels.length && !displayAll && (\n <Button\n size=\"sm\"\n fill=\"outline\"\n variant=\"secondary\"\n className={styles.button}\n aria-label={t('logs.log-labels.expand', 'Expand labels')}\n onClick={() => {\n setDisplayAll(true);\n onDisplayMaxToggle?.(true);\n }}\n >\n <Icon name=\"plus\" size=\"xs\" />\n {allLabels.length - displayLabels.length}\n </Button>\n )}\n {displayAll === true && (\n <Button\n size=\"sm\"\n fill=\"outline\"\n variant=\"secondary\"\n className={styles.button}\n aria-label={t('logs.log-labels.collapse', 'Collapse labels')}\n onClick={() => {\n setDisplayAll(false);\n onDisplayMaxToggle?.(false);\n }}\n >\n <Icon name=\"minus\" size=\"xs\" />\n </Button>\n )}\n </span>\n );\n }\n);\nLogLabels.displayName = 'LogLabels';\n\ninterface LogLabelsArrayProps {\n labels: string[];\n}\n\nexport const LogLabelsList = memo(({ labels }: LogLabelsArrayProps) => {\n const styles = useStyles2(getStyles);\n\n return (\n <span className={styles.logsLabels}>\n {labels.map((label) => (\n <LogLabel key={label} styles={styles} tooltip={label}>\n {getNormalizedFieldName(label)}\n </LogLabel>\n ))}\n </span>\n );\n});\nLogLabelsList.displayName = 'LogLabelsList';\n\ninterface LogLabelProps {\n styles: Record<string, string>;\n tooltip?: string;\n children: JSX.Element | string;\n}\n\nconst LogLabel = forwardRef<HTMLSpanElement, LogLabelProps>(({ styles, tooltip, children }: LogLabelProps, ref) => {\n return (\n <span className={styles.logsLabel} ref={ref}>\n <span className={styles.logsLabelValue} title={tooltip}>\n {children}\n </span>\n </span>\n );\n});\nLogLabel.displayName = 'LogLabel';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n logsLabels: css({\n display: 'inline-flex',\n flexWrap: 'wrap',\n fontSize: theme.typography.size.xs,\n alignItems: 'center',\n }),\n logsLabel: css({\n label: 'logs-label',\n display: 'flex',\n padding: theme.spacing(0, 0.25),\n backgroundColor: theme.colors.background.secondary,\n borderRadius: theme.shape.radius.default,\n margin: theme.spacing(0.125, 0.5, 0, 0),\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n maxHeight: theme.spacing(2),\n }),\n logsLabelValue: css({\n label: 'logs-label__value',\n display: 'inline-block',\n maxWidth: theme.spacing(25),\n textOverflow: 'ellipsis',\n overflow: 'hidden',\n }),\n button: css({\n height: theme.spacing(2.75),\n }),\n };\n};\n","import { createContext, ReactNode, useCallback, useContext, useState } from 'react';\n\nexport interface LogListSearchContextData {\n hideSearch: () => void;\n filterLogs: boolean;\n matchingUids: string[] | null;\n search?: string;\n searchVisible?: boolean;\n setMatchingUids: (matches: string[] | null) => void;\n setSearch: (search: string | undefined) => void;\n showSearch: () => void;\n toggleFilterLogs: () => void;\n}\n\nexport const LogListSearchContext = createContext<LogListSearchContextData>({\n hideSearch: () => {},\n filterLogs: false,\n matchingUids: null,\n searchVisible: false,\n setMatchingUids: () => {},\n setSearch: () => {},\n showSearch: () => {},\n toggleFilterLogs: () => {},\n});\n\nexport const useLogListSearchContextData = (key: keyof LogListSearchContextData) => {\n const data: LogListSearchContextData = useContext(LogListSearchContext);\n return data[key];\n};\n\nexport const useLogListSearchContext = (): LogListSearchContextData => {\n return useContext(LogListSearchContext);\n};\n\nexport const LogListSearchContextProvider = ({ children }: { children: ReactNode }) => {\n const [search, setSearch] = useState<string | undefined>(undefined);\n const [searchVisible, setSearchVisible] = useState(false);\n const [matchingUids, setMatchingUids] = useState<string[] | null>(null);\n const [filterLogs, setFilterLogs] = useState(false);\n\n const hideSearch = useCallback(() => {\n setSearchVisible(false);\n }, []);\n\n const showSearch = useCallback(() => {\n setSearchVisible(true);\n }, []);\n\n const toggleFilterLogs = useCallback(() => {\n setFilterLogs((filterLogs) => !filterLogs);\n }, []);\n\n return (\n <LogListSearchContext.Provider\n value={{\n hideSearch,\n filterLogs,\n matchingUids,\n search,\n searchVisible,\n setMatchingUids,\n setSearch,\n showSearch,\n toggleFilterLogs,\n }}\n >\n {children}\n </LogListSearchContext.Provider>\n );\n};\n","export function isLogLineJSON(line: string): boolean {\n let parsed;\n try {\n parsed = JSON.parse(line);\n } catch (error) {}\n // The JSON parser should only be used for log lines that are valid serialized JSON objects.\n return typeof parsed === 'object';\n}\n\n// This matches:\n// first a label from start of the string or first white space, then any word chars until \"=\"\n// second either an empty quotes, or anything that starts with quote and ends with unescaped quote,\n// or any non whitespace chars that do not start with quote\nconst LOGFMT_REGEXP = /(?:^|\\s)([\\w\\(\\)\\[\\]\\{\\}]+)=(\"\"|(?:\".*?[^\\\\]\"|[^\"\\s]\\S*))/;\n\nexport function isLogLineLogfmt(line: string): boolean {\n return LOGFMT_REGEXP.test(line);\n}\n\nexport function isLogLinePacked(line: string): boolean {\n let parsed;\n try {\n parsed = JSON.parse(line);\n return parsed.hasOwnProperty('_entry');\n } catch (error) {\n return false;\n }\n}\n","import { DataFrame, DataQueryResponse, FieldType, isValidGoDuration, Labels } from '@grafana/data';\n\nimport { isBytesString, processLabels } from './languageUtils';\nimport { isLogLineJSON, isLogLineLogfmt, isLogLinePacked } from './lineParser';\nimport { LabelType } from './types';\n\nexport function dataFrameHasLokiError(frame: DataFrame): boolean {\n const labelSets: Labels[] = frame.fields.find((f) => f.name === 'labels')?.values ?? [];\n return labelSets.some((labels) => labels.__error__ !== undefined);\n}\n\nexport function dataFrameHasLevelLabel(frame: DataFrame): boolean {\n const labelSets: Labels[] = frame.fields.find((f) => f.name === 'labels')?.values ?? [];\n return labelSets.some((labels) => labels.level !== undefined);\n}\n\nexport function extractLogParserFromDataFrame(frame: DataFrame): {\n hasLogfmt: boolean;\n hasJSON: boolean;\n hasPack: boolean;\n} {\n const lineField = frame.fields.find((field) => field.type === FieldType.string);\n if (lineField == null) {\n return { hasJSON: false, hasLogfmt: false, hasPack: false };\n }\n\n const logLines: string[] = lineField.values;\n\n let hasJSON = false;\n let hasLogfmt = false;\n let hasPack = false;\n\n logLines.forEach((line) => {\n if (isLogLineJSON(line)) {\n hasJSON = true;\n\n hasPack = isLogLinePacked(line);\n }\n if (isLogLineLogfmt(line)) {\n hasLogfmt = true;\n }\n });\n\n return { hasLogfmt, hasJSON, hasPack };\n}\n\nexport function extractLabelKeysFromDataFrame(frame: DataFrame, type: LabelType = LabelType.Indexed): string[] {\n const labelsArray: Array<{ [key: string]: string }> | undefined =\n frame?.fields?.find((field) => field.name === 'labels')?.values ?? [];\n const labelTypeArray: Array<{ [key: string]: string }> | undefined =\n frame?.fields?.find((field) => field.name === 'labelTypes')?.values ?? [];\n\n if (!labelsArray?.length) {\n return [];\n }\n\n // if there are no label types and type is LabelType.Indexed return all label keys\n if (!labelTypeArray?.length) {\n if (type === LabelType.Indexed) {\n const { keys: labelKeys } = processLabels(labelsArray);\n return labelKeys;\n }\n return [];\n }\n\n // If we have label types, we can return only label keys that match type\n let labelsSet = new Set<string>();\n for (let i = 0; i < labelsArray.length; i++) {\n const labels = labelsArray[i];\n const labelsType = labelTypeArray[i];\n\n const allLabelKeys = Object.keys(labels).filter((key) => labelsType[key] === type);\n labelsSet = new Set([...labelsSet, ...allLabelKeys]);\n }\n\n return Array.from(labelsSet);\n}\n\nexport function extractUnwrapLabelKeysFromDataFrame(frame: DataFrame): string[] {\n const labelsArray: Array<{ [key: string]: string }> | undefined =\n frame?.fields?.find((field) => field.name === 'labels')?.values ?? [];\n\n if (!labelsArray?.length) {\n return [];\n }\n\n // We do this only for first label object, because we want to consider only labels that are present in all log lines\n // possibleUnwrapLabels are labels with 1. number value OR 2. value that is valid go duration OR 3. bytes string value\n const possibleUnwrapLabels = Object.keys(labelsArray[0]).filter((key) => {\n const value = labelsArray[0][key];\n if (!value) {\n return false;\n }\n return !isNaN(Number(value)) || isValidGoDuration(value) || isBytesString(value);\n });\n\n // Add only labels that are present in every line to unwrapLabels\n return possibleUnwrapLabels.filter((label) => labelsArray.every((obj) => obj[label]));\n}\n\nexport function extractHasErrorLabelFromDataFrame(frame: DataFrame): boolean {\n const labelField = frame.fields.find((field) => field.name === 'labels' && field.type === FieldType.other);\n if (labelField == null) {\n return false;\n }\n\n const labels: Array<{ [key: string]: string }> = labelField.values;\n return labels.some((label) => label['__error__']);\n}\n\nexport function extractLevelLikeLabelFromDataFrame(frame: DataFrame): string | null {\n const labelField = frame.fields.find((field) => field.name === 'labels' && field.type === FieldType.other);\n if (labelField == null) {\n return null;\n }\n\n // Depending on number of labels, this can be pretty heavy operation.\n // Let's just look at first 2 lines If needed, we can introduce more later.\n const labelsArray: Array<{ [key: string]: string }> = labelField.values.slice(0, 2);\n let levelLikeLabel: string | null = null;\n\n // Find first level-like label\n for (let labels of labelsArray) {\n const label = Object.keys(labels).find(\n (label) => label === 'level' || label === 'detected_level' || label === 'lvl' || label.includes('level')\n );\n if (label) {\n levelLikeLabel = label;\n break;\n }\n }\n return levelLikeLabel;\n}\n\nexport function isRetriableError(errorResponse: DataQueryResponse) {\n const message = errorResponse.errors\n ? (errorResponse.errors[0].message ?? '').toLowerCase()\n : (errorResponse.error?.message ?? '');\n if (message.includes('timeout')) {\n return true;\n } else if (errorResponse.data.length > 0 && errorResponse.data[0].fields.length > 0) {\n // Error response but we're receiving data, continue querying.\n return false;\n }\n throw new Error(message);\n}\n","export const SETTINGS_KEYS = {\n showLabels: 'grafana.explore.logs.showLabels',\n showTime: 'grafana.explore.logs.showTime',\n wrapLogMessage: 'grafana.explore.logs.wrapLogMessage',\n prettifyLogMessage: 'grafana.explore.logs.prettifyLogMessage',\n logsSortOrder: 'grafana.explore.logs.sortOrder',\n logContextWrapLogMessage: 'grafana.explore.logs.logContext.wrapLogMessage',\n commonLabels: 'grafana.explore.logs.commonLabels',\n};\n\nexport const SETTING_KEY_ROOT = 'grafana.explore.logs';\n\nexport const visualisationTypeKey = 'grafana.explore.logs.visualisationType';\n","import { Registry } from '@grafana/data';\nimport { BINARY_OPERATIONS_KEY } from './types.js';\n\nvar __defProp = Object.defineProperty;\nvar __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;\nvar __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== \"symbol\" ? key + \"\" : key, value);\nclass QueryModellerBase {\n constructor(operationDefinitions, innerQueryPlaceholder) {\n __publicField(this, \"operationsRegistry\");\n __publicField(this, \"categories\", []);\n __publicField(this, \"innerQueryPlaceholder\");\n this.operationsRegistry = new Registry(() => operationDefinitions);\n this.innerQueryPlaceholder = innerQueryPlaceholder || \"<query>\";\n }\n setOperationCategories(categories) {\n this.categories = categories;\n }\n getOperationsForCategory(category) {\n return this.operationsRegistry.list().filter((op) => op.category === category && !op.hideFromList);\n }\n getAlternativeOperations(key) {\n return this.operationsRegistry.list().filter((op) => op.alternativesKey && op.alternativesKey === key);\n }\n getCategories() {\n return this.categories;\n }\n getOperationDefinition(id) {\n return this.operationsRegistry.getIfExists(id);\n }\n hasBinaryOp(query) {\n return query.operations.find((op) => {\n const def = this.getOperationDefinition(op.id);\n return (def == null ? undefined : def.category) === BINARY_OPERATIONS_KEY;\n }) !== undefined;\n }\n}\n\nexport { QueryModellerBase };\n//# sourceMappingURL=QueryModellerBase.js.map\n","import {\n QueryModellerBase,\n QueryBuilderLabelFilter,\n VisualQuery,\n QueryBuilderOperation,\n VisualQueryBinary,\n} from '@grafana/plugin-ui';\n\nimport { operationDefinitions } from './operations';\nimport { LokiOperationId, LokiQueryPattern, LokiQueryPatternType, LokiVisualQueryOperationCategory } from './types';\n\nexport class LokiQueryModeller extends QueryModellerBase {\n constructor() {\n super(operationDefinitions, '<expr>');\n\n this.setOperationCategories([\n LokiVisualQueryOperationCategory.Aggregations,\n LokiVisualQueryOperationCategory.RangeFunctions,\n LokiVisualQueryOperationCategory.Formats,\n LokiVisualQueryOperationCategory.BinaryOps,\n LokiVisualQueryOperationCategory.LabelFilters,\n LokiVisualQueryOperationCategory.LineFilters,\n ]);\n }\n\n renderOperations(queryString: string, operations: QueryBuilderOperation[]): string {\n for (const operation of operations) {\n if (operation.disabled) {\n continue;\n }\n const def = this.operationsRegistry.getIfExists(operation.id);\n if (!def) {\n console.error(`Could not find operation ${operation.id} in the registry`);\n continue;\n }\n queryString = def.renderer(operation, def, queryString);\n }\n return queryString;\n }\n\n renderBinaryQueries(queryString: string, binaryQueries?: Array<VisualQueryBinary<VisualQuery>>) {\n if (binaryQueries) {\n for (const binQuery of binaryQueries) {\n queryString = `${this.renderBinaryQuery(queryString, binQuery)}`;\n }\n }\n return queryString;\n }\n\n private renderBinaryQuery(leftOperand: string, binaryQuery: VisualQueryBinary<VisualQuery>) {\n let result = leftOperand + ` ${binaryQuery.operator} `;\n\n if (binaryQuery.vectorMatches) {\n result += `${binaryQuery.vectorMatchesType}(${binaryQuery.vectorMatches}) `;\n }\n\n return result + this.renderQuery(binaryQuery.query, true);\n }\n\n renderLabels(labels: QueryBuilderLabelFilter[]): string {\n if (labels.length === 0) {\n return '{}';\n }\n\n let expr = '{';\n for (const filter of labels) {\n if (expr !== '{') {\n expr += ', ';\n }\n\n expr += `${filter.label}${filter.op}\"${filter.value}\"`;\n }\n\n return expr + `}`;\n }\n\n renderQuery(query: VisualQuery, nested?: boolean): string {\n let queryString = this.renderLabels(query.labels);\n queryString = this.renderOperations(queryString, query.operations);\n\n if (!nested && this.hasBinaryOp(query) && Boolean(query.binaryQueries?.length)) {\n queryString = `(${queryString})`;\n }\n\n queryString = this.renderBinaryQueries(queryString, query.binaryQueries);\n\n return queryString;\n }\n\n getQueryPatterns(): LokiQueryPattern[] {\n return [\n {\n name: 'Parse log lines with logfmt parser',\n type: LokiQueryPatternType.Log,\n // {} | logfmt | __error__=``\n operations: [\n { id: LokiOperationId.Logfmt, params: [] },\n { id: LokiOperationId.LabelFilterNoErrors, params: [] },\n ],\n },\n {\n name: 'Parse log lines with JSON parser',\n type: LokiQueryPatternType.Log,\n // {} | json | __error__=``\n operations: [\n { id: LokiOperationId.Json, params: [] },\n { id: LokiOperationId.LabelFilterNoErrors, params: [] },\n ],\n },\n {\n name: 'Filter log line and parse with logfmt parser',\n type: LokiQueryPatternType.Log,\n // {} |= `` | logfmt | __error__=``\n operations: [\n { id: LokiOperationId.LineContains, params: [''] },\n { id: LokiOperationId.Logfmt, params: [] },\n { id: LokiOperationId.LabelFilterNoErrors, params: [] },\n ],\n },\n {\n name: 'Filter log lines and parse with json parser',\n type: LokiQueryPatternType.Log,\n // {} |= `` | json | __error__=``\n operations: [\n { id: LokiOperationId.LineContains, params: [''] },\n { id: LokiOperationId.Json, params: [] },\n { id: LokiOperationId.LabelFilterNoErrors, params: [] },\n ],\n },\n {\n name: 'Parse log line with logfmt parser and use label filter',\n type: LokiQueryPatternType.Log,\n // {} |= `` | logfmt | __error__=`` | label=`value`\n operations: [\n { id: LokiOperationId.LineContains, params: [''] },\n { id: LokiOperationId.Logfmt, params: [] },\n { id: LokiOperationId.LabelFilterNoErrors, params: [] },\n { id: LokiOperationId.LabelFilter, params: ['label', '=', 'value'] },\n ],\n },\n {\n name: 'Parse log lines with nested json',\n type: LokiQueryPatternType.Log,\n // {} |= `` | json | line_format `{{ .message}}` | json\n operations: [\n { id: LokiOperationId.LineContains, params: [''] },\n { id: LokiOperationId.Json, params: [] },\n { id: LokiOperationId.LabelFilterNoErrors, params: [] },\n { id: LokiOperationId.LineFormat, params: ['{{.message}}'] },\n { id: LokiOperationId.Json, params: [] },\n { id: LokiOperationId.LabelFilterNoErrors, params: [] },\n ],\n },\n {\n name: 'Reformat log lines',\n type: LokiQueryPatternType.Log,\n // {} |= `` | logfmt | line_format `{{.message}}`\n operations: [\n { id: LokiOperationId.LineContains, params: [''] },\n { id: LokiOperationId.Logfmt, params: [] },\n { id: LokiOperationId.LabelFilterNoErrors, params: [] },\n { id: LokiOperationId.LineFormat, params: ['{{.message}}'] },\n ],\n },\n {\n name: 'Rename lvl label to level',\n type: LokiQueryPatternType.Log,\n // {} |= `` | logfmt | label_format level=lvl\n operations: [\n { id: LokiOperationId.LineContains, params: [''] },\n { id: LokiOperationId.Logfmt, params: [] },\n { id: LokiOperationId.LabelFilterNoErrors, params: [] },\n { id: LokiOperationId.LabelFormat, params: ['lvl', 'level'] },\n ],\n },\n {\n name: 'Query on value inside a log line',\n type: LokiQueryPatternType.Metric,\n // sum(sum_over_time({ | logfmt | __error__=`` | unwrap | __error__=`` [$__auto]))\n operations: [\n { id: LokiOperationId.LineContains, params: [''] },\n { id: LokiOperationId.Logfmt, params: [] },\n { id: LokiOperationId.LabelFilterNoErrors, params: [] },\n { id: LokiOperationId.Unwrap, params: [''] },\n { id: LokiOperationId.LabelFilterNoErrors, params: [] },\n { id: LokiOperationId.SumOverTime, params: ['$__auto'] },\n { id: LokiOperationId.Sum, params: [] },\n ],\n },\n {\n name: 'Total requests per label of streams',\n type: LokiQueryPatternType.Metric,\n // sum by() (count_over_time({}[$__auto)\n operations: [\n { id: LokiOperationId.LineContains, params: [''] },\n { id: LokiOperationId.CountOverTime, params: ['$__auto'] },\n { id: LokiOperationId.Sum, params: [] },\n ],\n },\n {\n name: 'Total requests per parsed label or label of streams',\n type: LokiQueryPatternType.Metric,\n // sum by() (count_over_time({}| logfmt | __error__=`` [$__auto))\n operations: [\n { id: LokiOperationId.LineContains, params: [''] },\n { id: LokiOperationId.Logfmt, params: [] },\n { id: LokiOperationId.LabelFilterNoErrors, params: [] },\n { id: LokiOperationId.CountOverTime, params: ['$__auto'] },\n { id: LokiOperationId.Sum, params: [] },\n ],\n },\n {\n name: 'Bytes used by a log stream',\n type: LokiQueryPatternType.Metric,\n // bytes_over_time({}[$__auto])\n operations: [\n { id: LokiOperationId.LineContains, params: [''] },\n { id: LokiOperationId.BytesOverTime, params: ['$__auto'] },\n ],\n },\n {\n name: 'Count of log lines per stream',\n type: LokiQueryPatternType.Metric,\n // count_over_time({}[$__auto])\n operations: [\n { id: LokiOperationId.LineContains, params: [''] },\n { id: LokiOperationId.CountOverTime, params: ['$__auto'] },\n ],\n },\n {\n name: 'Top N results by label or parsed label',\n type: LokiQueryPatternType.Metric,\n // topk(10, sum by () (count_over_time({} | logfmt | __error__=`` [$__auto])))\n operations: [\n { id: LokiOperationId.Logfmt, params: [] },\n { id: LokiOperationId.LabelFilterNoErrors, params: [] },\n { id: LokiOperationId.CountOverTime, params: ['$__auto'] },\n { id: LokiOperationId.Sum, params: [] },\n { id: LokiOperationId.TopK, params: [10] },\n ],\n },\n {\n name: 'Extracted quantile',\n type: LokiQueryPatternType.Metric,\n // quantile_over_time(0.5,{} | logfmt | unwrap latency[$__auto]) by ()\n operations: [\n { id: LokiOperationId.Logfmt, params: [] },\n { id: LokiOperationId.LabelFilterNoErrors, params: [] },\n { id: LokiOperationId.Unwrap, params: ['latency'] },\n { id: LokiOperationId.LabelFilterNoErrors, params: [] },\n { id: LokiOperationId.QuantileOverTime, params: ['$__auto', 0.5] },\n { id: LokiOperationId.Sum, params: [] },\n ],\n },\n ];\n }\n}\n\nexport const lokiQueryModeller = new LokiQueryModeller();\n","import { NodeType, SyntaxNode } from '@lezer/common';\nimport { sortBy } from 'lodash';\n\nimport {\n Identifier,\n LabelFilter,\n LabelParser,\n LineComment,\n LineFilters,\n LogExpr,\n LogRangeExpr,\n Matcher,\n parser,\n PipelineExpr,\n Selector,\n UnwrapExpr,\n String,\n PipelineStage,\n LogfmtParser,\n JsonExpressionParser,\n LogfmtExpressionParser,\n Expr,\n LabelFormatExpr,\n} from '@grafana/lezer-logql';\nimport { QueryBuilderLabelFilter } from '@grafana/plugin-ui';\n\nimport { unescapeLabelValue } from './languageUtils';\nimport { getNodePositionsFromQuery } from './queryUtils';\nimport { lokiQueryModeller as modeller } from './querybuilder/LokiQueryModeller';\nimport { buildVisualQueryFromString, handleQuotes } from './querybuilder/parsing';\nimport { LabelType } from './types';\n\nexport class NodePosition {\n from: number;\n to: number;\n type?: NodeType;\n\n constructor(from: number, to: number, type?: NodeType) {\n this.from = from;\n this.to = to;\n this.type = type;\n }\n\n static fromNode(node: SyntaxNode): NodePosition {\n return new NodePosition(node.from, node.to, node.type);\n }\n\n contains(position: NodePosition): boolean {\n return this.from <= position.from && this.to >= position.to;\n }\n\n getExpression(query: string): string {\n return query.substring(this.from, this.to);\n }\n}\n\n/**\n * Checks for the presence of a given label=value filter in any Matcher expression in the query.\n */\nexport function queryHasFilter(query: string, key: string, operator: string, value: string): boolean {\n const matchers = getMatchersWithFilter(query, key, operator, value);\n return matchers.length > 0;\n}\n\n/**\n * Removes a label=value Matcher expression from the query.\n */\nexport function removeLabelFromQuery(query: string, key: string, operator: string, value: string): string {\n const matchers = getMatchersWithFilter(query, key, operator, value);\n for (const matcher of matchers) {\n query =\n matcher.parent?.type.id === LabelFilter ? removeLabelFilter(query, matcher) : removeSelector(query, matcher);\n }\n return query;\n}\n\nfunction removeLabelFilter(query: string, matcher: SyntaxNode): string {\n const pipelineStage = matcher.parent?.parent;\n if (!pipelineStage || pipelineStage.type.id !== PipelineStage) {\n return query;\n }\n return (query.substring(0, pipelineStage.from) + query.substring(pipelineStage.to)).trim();\n}\n\nfunction removeSelector(query: string, matcher: SyntaxNode): string {\n let selector: SyntaxNode | null = matcher;\n do {\n selector = selector.parent;\n } while (selector && selector.type.id !== Selector);\n const label = matcher.getChild(Identifier);\n if (!selector || !label) {\n return query;\n }\n const labelName = query.substring(label.from, label.to);\n\n const prefix = query.substring(0, selector.from);\n const suffix = query.substring(selector.to);\n\n const matchVisQuery = buildVisualQueryFromString(query.substring(selector.from, selector.to));\n matchVisQuery.query.labels = matchVisQuery.query.labels.filter((label) => label.label !== labelName);\n\n return prefix + modeller.renderQuery(matchVisQuery.query) + suffix;\n}\n\nfunction getMatchersWithFilter(query: string, label: string, operator: string, value: string): SyntaxNode[] {\n const tree = parser.parse(query);\n const matchers: SyntaxNode[] = [];\n tree.iterate({\n enter: ({ type, node }): void => {\n if (type.id === Matcher) {\n matchers.push(node);\n }\n },\n });\n return matchers.filter((matcher) => {\n const labelNode = matcher.getChild(Identifier);\n const opNode = labelNode?.nextSibling;\n const valueNode = matcher.getChild(String);\n if (!labelNode || !opNode || !valueNode) {\n return false;\n }\n const labelName = query.substring(labelNode.from, labelNode.to);\n if (labelName !== label) {\n return false;\n }\n const labelValue = query.substring(valueNode.from, valueNode.to);\n if (handleQuotes(labelValue) !== unescapeLabelValue(value)) {\n return false;\n }\n const labelOperator = query.substring(opNode.from, opNode.to);\n if (labelOperator !== operator) {\n return false;\n }\n return true;\n });\n}\n\n/**\n * Adds label filter to existing query. Useful for query modification for example for ad hoc filters.\n *\n * It uses LogQL parser to find instances of labels, alters them and then splices them back into the query.\n * In a case when we have parser, instead of adding new instance of label it adds label filter after the parser.\n *\n * This operates on substrings of the query with labels and operates just on those. This makes this\n * more robust and can alter even invalid queries, and preserves in general the query structure and whitespace.\n */\nexport function addLabelToQuery(\n query: string,\n key: string,\n operator: string,\n value: string,\n labelType?: LabelType | null\n): string {\n if (!key) {\n throw new Error('Need label to add to query.');\n }\n\n const streamSelectorPositions = getStreamSelectorPositions(query);\n if (!streamSelectorPositions.length) {\n return query;\n }\n\n const parserPositions = getParserPositions(query);\n const labelFilterPositions = getLabelFilterPositions(query);\n const hasStreamSelectorMatchers = getMatcherInStreamPositions(query);\n // For non-indexed labels we want to add them after label_format to, for example, allow ad-hoc filters to use formatted labels\n const labelFormatPositions = getNodePositionsFromQuery(query, [LabelFormatExpr]);\n\n // If the label type wasn't passed in from the calling function, we can use lezer to figure out if this label is already in the stream selectors\n if (!labelType) {\n const identifierSelectorMatchers = getIdentifierInStreamPositions(query);\n const indexedKeys = identifierSelectorMatchers.map((match) => match.getExpression(query));\n if (indexedKeys.includes(key)) {\n labelType = LabelType.Indexed;\n }\n }\n\n const everyStreamSelectorHasMatcher = streamSelectorPositions.every((streamSelectorPosition) =>\n hasStreamSelectorMatchers.some(\n (matcherPosition) =>\n matcherPosition.from >= streamSelectorPosition.from && matcherPosition.to <= streamSelectorPosition.to\n )\n );\n\n const filter = toLabelFilter(key, value, operator);\n if (labelType === LabelType.Parsed || labelType === LabelType.StructuredMetadata) {\n const lastPositionsPerExpression = getLastPositionPerExpression(query, [\n ...streamSelectorPositions,\n ...labelFilterPositions,\n ...parserPositions,\n ...labelFormatPositions,\n ]);\n\n return addFilterAsLabelFilter(query, lastPositionsPerExpression, filter);\n } else if (labelType === LabelType.Indexed) {\n return addFilterToStreamSelector(query, streamSelectorPositions, filter);\n } else {\n // labelType is not set, so we need to figure out where to add the label\n // if we don't have a parser, or have empty stream selectors, we will just add it to the stream selector\n if (parserPositions.length === 0 || everyStreamSelectorHasMatcher === false) {\n return addFilterToStreamSelector(query, streamSelectorPositions, filter);\n } else {\n // If `labelType` is not set, it indicates a potential metric query (`labelType` is present only in log queries that came from a Loki instance supporting the `categorize-labels` API). In case we are not adding the label to stream selectors we need to find the last position to add in each expression.\n // E.g. in `sum(rate({foo=\"bar\"} | logfmt [$__auto])) / sum(rate({foo=\"baz\"} | logfmt [$__auto]))` we need to add the label at two places.\n const lastPositionsPerExpression = getLastPositionPerExpression(query, [\n ...parserPositions,\n ...labelFilterPositions,\n ...labelFormatPositions,\n ]);\n\n return addFilterAsLabelFilter(query, lastPositionsPerExpression, filter);\n }\n }\n}\n\nfunction getLastPositionPerExpression(query: string, positions: NodePosition[]): NodePosition[] {\n const subExpressions = findLeaves(getNodePositionsFromQuery(query, [Expr]));\n const subPositions = [...positions];\n\n // find last position for each subexpression\n const lastPositionsPerExpression = subExpressions.map((subExpression) => {\n return findLastPosition(\n subPositions.filter((p) => {\n return subExpression.contains(p);\n })\n );\n });\n return lastPositionsPerExpression;\n}\n\n/**\n * Adds parser to existing query. Useful for query modification for hints.\n * It uses LogQL parser to find instances of stream selectors or line filters and adds parser after them.\n *\n * @param query\n * @param parser\n */\nexport function addParserToQuery(query: string, parser: string): string {\n const lineFilterPositions = getLineFiltersPositions(query);\n\n if (lineFilterPositions.length) {\n return appendToLogsQuery(query, lineFilterPositions, parser);\n } else {\n const streamSelectorPositions = getStreamSelectorPositions(query);\n if (!streamSelectorPositions.length) {\n return query;\n }\n return appendToLogsQuery(query, streamSelectorPositions, parser);\n }\n}\n\n/**\n * Adds a drop statement to the query.\n * It uses LogQL parser to find instances of stream selectors or line filters and adds parser after them.\n *\n * @param query\n * @param parser\n */\nexport function addDropToQuery(query: string, labelsToDrop: string[]): string {\n const lineFilterPositions = getLineFiltersPositions(query);\n\n if (lineFilterPositions.length) {\n return appendToLogsQuery(query, lineFilterPositions, `drop ${labelsToDrop.join(', ')}`);\n } else {\n const streamSelectorPositions = getStreamSelectorPositions(query);\n if (!streamSelectorPositions.length) {\n return query;\n }\n return appendToLogsQuery(query, streamSelectorPositions, `drop ${labelsToDrop.join(', ')}`);\n }\n}\n\n/**\n * Adds a statement after line filters or stream selectors\n * @param query\n * @param queryPartPositions\n * @param parser\n */\nfunction appendToLogsQuery(query: string, queryPartPositions: NodePosition[], statement: string): string {\n let newQuery = '';\n let prev = 0;\n\n for (let i = 0; i < queryPartPositions.length; i++) {\n // Splice on a string for each matched vector selector\n const match = queryPartPositions[i];\n const isLast = i === queryPartPositions.length - 1;\n\n const start = query.substring(prev, match.to);\n const end = isLast ? query.substring(match.to) : '';\n\n // Add parser\n newQuery += start + ` | ${statement}` + end;\n prev = match.to;\n }\n return newQuery;\n}\n\n/**\n * Adds filtering for pipeline errors to existing query. Useful for query modification for hints.\n * It uses LogQL parser to find parsers and adds pipeline errors filtering after them.\n *\n * @param query\n */\nexport function addNoPipelineErrorToQuery(query: string): string {\n const parserPositions = getParserPositions(query);\n if (!parserPositions.length) {\n return query;\n }\n\n const filter = toLabelFilter('__error__', '', '=');\n return addFilterAsLabelFilter(query, parserPositions, filter);\n}\n\n/**\n * Adds label format to existing query. Useful for query modification for hints.\n * It uses LogQL parser to find log query and add label format at the end.\n *\n * @param query\n * @param labelFormat\n */\nexport function addLabelFormatToQuery(query: string, labelFormat: { originalLabel: string; renameTo: string }): string {\n const logQueryPositions = getLogQueryPositions(query);\n return addLabelFormat(query, logQueryPositions, labelFormat);\n}\n\n/**\n * Removes all comments from query.\n * It uses LogQL parser to find all LineComments and removes them.\n */\nexport function removeCommentsFromQuery(query: string): string {\n const lineCommentPositions = getLineCommentPositions(query);\n\n if (!lineCommentPositions.length) {\n return query;\n }\n\n let newQuery = '';\n let prev = 0;\n\n for (let lineCommentPosition of lineCommentPositions) {\n newQuery = newQuery + query.substring(prev, lineCommentPosition.from);\n prev = lineCommentPosition.to;\n }\n newQuery = newQuery + query.substring(prev);\n return newQuery;\n}\n\n/**\n * Parse the string and get all Selector positions in the query together with parsed representation of the\n * selector.\n * @param query\n */\nexport function getStreamSelectorPositions(query: string): NodePosition[] {\n const tree = parser.parse(query);\n const positions: NodePosition[] = [];\n tree.iterate({\n enter: ({ type, node }): false | void => {\n if (type.id === Selector) {\n positions.push(NodePosition.fromNode(node));\n return false;\n }\n },\n });\n return positions;\n}\n\n/**\n * Parse the string and get all LabelParser positions in the query.\n * @param query\n */\nexport function getParserPositions(query: string): NodePosition[] {\n const tree = parser.parse(query);\n const positions: NodePosition[] = [];\n const parserNodeTypes = [LabelParser, JsonExpressionParser, LogfmtParser, LogfmtExpressionParser];\n tree.iterate({\n enter: ({ type, node }): false | void => {\n if (parserNodeTypes.includes(type.id)) {\n positions.push(NodePosition.fromNode(node));\n return false;\n }\n },\n });\n return positions;\n}\n\n/**\n * Parse the string and get all LabelFilter positions in the query.\n * @param query\n */\nexport function getLabelFilterPositions(query: string): NodePosition[] {\n const tree = parser.parse(query);\n const positions: NodePosition[] = [];\n tree.iterate({\n enter: ({ type, node }): false | void => {\n if (type.id === LabelFilter) {\n positions.push(NodePosition.fromNode(node));\n return false;\n }\n },\n });\n return positions;\n}\n\n/**\n * Parse the string and get all Line filter positions in the query.\n * @param query\n */\nfunction getLineFiltersPositions(query: string): NodePosition[] {\n const tree = parser.parse(query);\n const positions: NodePosition[] = [];\n tree.iterate({\n enter: ({ type, node }): false | void => {\n if (type.id === LineFilters) {\n positions.push(NodePosition.fromNode(node));\n return false;\n }\n },\n });\n return positions;\n}\n\n/**\n * Parse the string and get all Log query positions in the query.\n * @param query\n */\nfunction getLogQueryPositions(query: string): NodePosition[] {\n const tree = parser.parse(query);\n const positions: NodePosition[] = [];\n tree.iterate({\n enter: ({ type, node }): false | void => {\n if (type.id === LogExpr) {\n positions.push(NodePosition.fromNode(node));\n return false;\n }\n\n // This is a case in metrics query\n if (type.id === LogRangeExpr) {\n // Unfortunately, LogRangeExpr includes both log and non-log (e.g. Duration/Range/...) parts of query.\n // We get position of all log-parts within LogRangeExpr: Selector, PipelineExpr and UnwrapExpr.\n const logPartsPositions: NodePosition[] = [];\n const selector = node.getChild(Selector);\n if (selector) {\n logPartsPositions.push(NodePosition.fromNode(selector));\n }\n\n const pipeline = node.getChild(PipelineExpr);\n if (pipeline) {\n logPartsPositions.push(NodePosition.fromNode(pipeline));\n }\n\n const unwrap = node.getChild(UnwrapExpr);\n if (unwrap) {\n logPartsPositions.push(NodePosition.fromNode(unwrap));\n }\n\n // We sort them and then pick \"from\" from first position and \"to\" from last position.\n const sorted = sortBy(logPartsPositions, (position) => position.to);\n positions.push(new NodePosition(sorted[0].from, sorted[sorted.length - 1].to));\n return false;\n }\n },\n });\n return positions;\n}\n\nexport function toLabelFilter(key: string, value: string, operator: string): QueryBuilderLabelFilter {\n // We need to make sure that we convert the value back to string because it may be a number\n return { label: key, op: operator, value };\n}\n\n/**\n * Add filter as to stream selectors\n * @param query\n * @param vectorSelectorPositions\n * @param filter\n */\nfunction addFilterToStreamSelector(\n query: string,\n vectorSelectorPositions: NodePosition[],\n filter: QueryBuilderLabelFilter\n): string {\n let newQuery = '';\n let prev = 0;\n\n for (let i = 0; i < vectorSelectorPositions.length; i++) {\n // This is basically just doing splice on a string for each matched vector selector.\n const match = vectorSelectorPositions[i];\n const isLast = i === vectorSelectorPositions.length - 1;\n\n const start = query.substring(prev, match.from);\n const end = isLast ? query.substring(match.to) : '';\n const matchVisQuery = buildVisualQueryFromString(query.substring(match.from, match.to));\n\n if (!labelExists(matchVisQuery.query.labels, filter)) {\n // We don't want to add duplicate labels.\n matchVisQuery.query.labels.push(filter);\n }\n const newLabels = modeller.renderQuery(matchVisQuery.query);\n newQuery += start + newLabels + end;\n prev = match.to;\n }\n return newQuery;\n}\n\n/**\n * Add filter as label filter after the parsers\n * @param query\n * @param positionsToAddAfter\n * @param filter\n */\nexport function addFilterAsLabelFilter(\n query: string,\n positionsToAddAfter: NodePosition[],\n filter: QueryBuilderLabelFilter\n): string {\n let newQuery = '';\n let prev = 0;\n\n for (let i = 0; i < positionsToAddAfter.length; i++) {\n // This is basically just doing splice on a string for each matched vector selector.\n const match = positionsToAddAfter[i];\n const isLast = i === positionsToAddAfter.length - 1;\n\n const start = query.substring(prev, match.to);\n const end = isLast ? query.substring(match.to) : '';\n\n let labelFilter = '';\n // For < and >, if the value is number, we don't add quotes around it and use it as number\n if (!Number.isNaN(Number(filter.value)) && (filter.op === '<' || filter.op === '>')) {\n labelFilter = ` | ${filter.label}${filter.op}${Number(filter.value)}`;\n } else {\n // we now unescape all escaped values again, because we are using backticks which can handle those cases.\n // we also don't care about the operator here, because we need to unescape for both, regex and equal.\n labelFilter = ` | ${filter.label}${filter.op}\\`${unescapeLabelValue(filter.value)}\\``;\n }\n\n newQuery += start + labelFilter + end;\n prev = match.to;\n }\n return newQuery;\n}\n\n/**\n * Add filter as label filter after the parsers\n * @param query\n * @param logQueryPositions\n * @param labelFormat\n */\nfunction addLabelFormat(\n query: string,\n logQueryPositions: NodePosition[],\n labelFormat: { originalLabel: string; renameTo: string }\n): string {\n let newQuery = '';\n let prev = 0;\n\n for (let i = 0; i < logQueryPositions.length; i++) {\n // This is basically just doing splice on a string for each matched vector selector.\n const match = logQueryPositions[i];\n const isLast = i === logQueryPositions.length - 1;\n\n const start = query.substring(prev, match.to);\n const end = isLast ? query.substring(match.to) : '';\n\n const labelFilter = ` | label_format ${labelFormat.renameTo}=${labelFormat.originalLabel}`;\n newQuery += start + labelFilter + end;\n prev = match.to;\n }\n return newQuery;\n}\n\nexport function addLineFilter(query: string, value = '', operator = '|='): string {\n const streamSelectorPositions = getStreamSelectorPositions(query);\n if (!streamSelectorPositions.length) {\n return query;\n }\n const streamSelectorEnd = streamSelectorPositions[0].to;\n\n const newQueryExpr = query.slice(0, streamSelectorEnd) + ` ${operator} \\`${value}\\`` + query.slice(streamSelectorEnd);\n return newQueryExpr;\n}\n\nfunction getLineCommentPositions(query: string): NodePosition[] {\n const tree = parser.parse(query);\n const positions: NodePosition[] = [];\n tree.iterate({\n enter: ({ type, from, to }): false | void => {\n if (type.id === LineComment) {\n positions.push(new NodePosition(from, to, type));\n return false;\n }\n },\n });\n return positions;\n}\n\n/**\n * Check if label exists in the list of labels but ignore the operator.\n * @param labels\n * @param filter\n */\nfunction labelExists(labels: QueryBuilderLabelFilter[], filter: QueryBuilderLabelFilter) {\n return labels.find((label) => label.label === filter.label && label.value === filter.value);\n}\n\n/**\n * Return the last position based on \"to\" property\n * @param positions\n */\nexport function findLastPosition(positions: NodePosition[]): NodePosition {\n if (!positions.length) {\n return new NodePosition(0, 0);\n }\n return positions.reduce((prev, current) => (prev.to > current.to ? prev : current));\n}\n\n/**\n * Gets all leaves of the nodes given. Leaves are nodes that don't contain any other nodes.\n *\n * @param {NodePosition[]} nodes\n * @return\n */\nfunction findLeaves(nodes: NodePosition[]): NodePosition[] {\n return nodes.filter((node) => nodes.every((n) => node.contains(n) === false || node === n));\n}\n\nfunction getAllPositionsInNodeByType(node: SyntaxNode, type: number): NodePosition[] {\n if (node.type.id === type) {\n return [NodePosition.fromNode(node)];\n }\n\n const positions: NodePosition[] = [];\n let pos = 0;\n let child = node.childAfter(pos);\n while (child) {\n positions.push(...getAllPositionsInNodeByType(child, type));\n pos = child.to;\n child = node.childAfter(pos);\n }\n return positions;\n}\n\nfunction getMatcherInStreamPositions(query: string): NodePosition[] {\n const tree = parser.parse(query);\n const positions: NodePosition[] = [];\n tree.iterate({\n enter: ({ node }): false | void => {\n if (node.type.id === Selector) {\n positions.push(...getAllPositionsInNodeByType(node, Matcher));\n }\n },\n });\n return positions;\n}\n\nexport function getIdentifierInStreamPositions(query: string): NodePosition[] {\n const tree = parser.parse(query);\n const positions: NodePosition[] = [];\n tree.iterate({\n enter: ({ node }): false | void => {\n if (node.type.id === Selector) {\n positions.push(...getAllPositionsInNodeByType(node, Identifier));\n }\n },\n });\n return positions;\n}\n","import { css } from '@emotion/css';\nimport memoizeOne from 'memoize-one';\n\nimport { CoreApp, GrafanaTheme2, LogRowModel } from '@grafana/data';\nimport { t } from '@grafana/i18n';\nimport { reportInteraction } from '@grafana/runtime';\nimport { IconButton, Themeable2 } from '@grafana/ui';\n\nimport { getLogRowStyles } from './getLogRowStyles';\n\nexport interface Props extends Themeable2 {\n app?: CoreApp;\n disableActions: boolean;\n displayedFields?: string[];\n onClickShowField?: (key: string) => void;\n onClickHideField?: (key: string) => void;\n row: LogRowModel;\n theme: GrafanaTheme2;\n}\n\nconst getStyles = memoizeOne((theme: GrafanaTheme2) => {\n return {\n buttonRow: css({\n display: 'flex',\n flexDirection: 'row',\n gap: theme.spacing(0.5),\n marginLeft: theme.spacing(0.5),\n }),\n };\n});\n\nexport const LOG_LINE_BODY_FIELD_NAME = '___LOG_LINE_BODY___';\n\nexport const LogDetailsBody = (props: Props) => {\n const showField = () => {\n const { onClickShowField, row } = props;\n if (onClickShowField) {\n onClickShowField(LOG_LINE_BODY_FIELD_NAME);\n }\n\n reportInteraction('grafana_explore_logs_log_details_show_body_clicked', {\n datasourceType: row.datasourceType,\n logRowUid: row.uid,\n type: 'enable',\n app: props.app,\n });\n };\n\n const hideField = () => {\n const { onClickHideField, row } = props;\n if (onClickHideField) {\n onClickHideField(LOG_LINE_BODY_FIELD_NAME);\n }\n\n reportInteraction('grafana_explore_logs_log_details_show_body_clicked', {\n datasourceType: row.datasourceType,\n logRowUid: row.uid,\n type: 'disable',\n app: props.app,\n });\n };\n\n const { theme, displayedFields, disableActions, row } = props;\n const styles = getStyles(theme);\n const rowStyles = getLogRowStyles(theme);\n\n const toggleFieldButton =\n displayedFields != null && displayedFields.includes(LOG_LINE_BODY_FIELD_NAME) ? (\n <IconButton\n variant=\"primary\"\n tooltip={t('logs.log-details-body.toggle-field-button.tooltip-hide-log-line', 'Hide log line')}\n name=\"eye\"\n onClick={hideField}\n />\n ) : (\n <IconButton\n tooltip={t('logs.log-details-body.toggle-field-button.tooltip-show-log-line', 'Show log line')}\n name=\"eye\"\n onClick={showField}\n />\n );\n\n return (\n <tr className={rowStyles.logDetailsValue}>\n <td className={rowStyles.logsDetailsIcon}>\n <div className={styles.buttonRow}>{!disableActions && displayedFields && toggleFieldButton}</div>\n </td>\n\n <td className={rowStyles.logDetailsLabel} colSpan={100}>\n {row.entry}\n </td>\n </tr>\n );\n};\n","import { css } from '@emotion/css';\nimport { useCallback, useEffect, useRef } from 'react';\n\nimport { GrafanaTheme2, LogRowModel } from '@grafana/data';\nimport { t } from '@grafana/i18n';\nimport { reportInteraction } from '@grafana/runtime';\nimport { Menu, useStyles2 } from '@grafana/ui';\n\nimport { copyText } from '../../logs/utils';\n\ninterface PopoverMenuProps {\n selection: string;\n x: number;\n y: number;\n onClickFilterString?: (value: string, refId?: string) => void;\n onClickFilterOutString?: (value: string, refId?: string) => void;\n onDisable: () => void;\n row: LogRowModel;\n close: () => void;\n}\n\nexport const PopoverMenu = ({\n x,\n y,\n onClickFilterString,\n onClickFilterOutString,\n selection,\n row,\n close,\n ...props\n}: PopoverMenuProps) => {\n const containerRef = useRef<HTMLDivElement | null>(null);\n const styles = useStyles2(getStyles);\n\n useEffect(() => {\n function handleEscape(e: KeyboardEvent) {\n if (e.key === 'Escape') {\n close();\n }\n }\n document.addEventListener('keyup', handleEscape);\n\n return () => {\n document.removeEventListener('keyup', handleEscape);\n };\n }, [close]);\n\n const onDisable = useCallback(() => {\n track('popover_menu_disabled', selection.length, row.datasourceType);\n props.onDisable();\n }, [props, row.datasourceType, selection.length]);\n\n const supported = onClickFilterString || onClickFilterOutString;\n\n if (!supported) {\n return null;\n }\n\n return (\n <>\n <div className={styles.menu} style={{ top: y, left: x }}>\n <Menu ref={containerRef}>\n <Menu.Item\n label={t('logs.popover-menu.copy', 'Copy selection')}\n onClick={() => {\n copyText(selection, containerRef);\n close();\n track('copy', selection.length, row.datasourceType);\n }}\n />\n {onClickFilterString && (\n <Menu.Item\n label={t('logs.popover-menu.line-contains', 'Add as line contains filter')}\n onClick={() => {\n onClickFilterString(selection, row.dataFrame.refId);\n close();\n track('line_contains', selection.length, row.datasourceType);\n }}\n />\n )}\n {onClickFilterOutString && (\n <Menu.Item\n label={t('logs.popover-menu.line-contains-not', 'Add as line does not contain filter')}\n onClick={() => {\n onClickFilterOutString(selection, row.dataFrame.refId);\n close();\n track('line_does_not_contain', selection.length, row.datasourceType);\n }}\n />\n )}\n <Menu.Divider />\n <Menu.Item label={t('logs.popover-menu.disable-menu', 'Disable menu')} onClick={onDisable} />\n </Menu>\n </div>\n </>\n );\n};\n\nfunction track(action: string, selectionLength: number, dataSourceType: string | undefined) {\n reportInteraction(`grafana_explore_logs_popover_menu`, {\n action,\n selectionLength: selectionLength,\n datasourceType: dataSourceType || 'unknown',\n });\n}\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n menu: css({\n position: 'fixed',\n zIndex: theme.zIndex.modal,\n }),\n});\n","import {\n QueryBuilderOperation,\n QueryBuilderOperationDefinition,\n QueryBuilderOperationParamDef,\n} from '@grafana/plugin-ui';\n\nimport { defaultAddOperationHandler } from './operationUtils';\nimport { LokiOperationId, LokiVisualQueryOperationCategory } from './types';\n\nexport const binaryScalarDefs = [\n {\n id: LokiOperationId.Addition,\n name: 'Add scalar',\n sign: '+',\n },\n {\n id: LokiOperationId.Subtraction,\n name: 'Subtract scalar',\n sign: '-',\n },\n {\n id: LokiOperationId.MultiplyBy,\n name: 'Multiply by scalar',\n sign: '*',\n },\n {\n id: LokiOperationId.DivideBy,\n name: 'Divide by scalar',\n sign: '/',\n },\n {\n id: LokiOperationId.Modulo,\n name: 'Modulo by scalar',\n sign: '%',\n },\n {\n id: LokiOperationId.Exponent,\n name: 'Exponent',\n sign: '^',\n },\n {\n id: LokiOperationId.EqualTo,\n name: 'Equal to',\n sign: '==',\n comparison: true,\n },\n {\n id: LokiOperationId.NotEqualTo,\n name: 'Not equal to',\n sign: '!=',\n comparison: true,\n },\n {\n id: LokiOperationId.GreaterThan,\n name: 'Greater than',\n sign: '>',\n comparison: true,\n },\n {\n id: LokiOperationId.LessThan,\n name: 'Less than',\n sign: '<',\n comparison: true,\n },\n {\n id: LokiOperationId.GreaterOrEqual,\n name: 'Greater or equal to',\n sign: '>=',\n comparison: true,\n },\n {\n id: LokiOperationId.LessOrEqual,\n name: 'Less or equal to',\n sign: '<=',\n comparison: true,\n },\n];\n\n// Not sure about this one. It could also be a more generic 'Simple math operation' where user specifies\n// both the operator and the operand in a single input\nexport const binaryScalarOperations: QueryBuilderOperationDefinition[] = binaryScalarDefs.map((opDef) => {\n const params: QueryBuilderOperationParamDef[] = [{ name: 'Value', type: 'number' }];\n let defaultParams: [number] | [number, boolean] = [2];\n if (opDef.comparison) {\n params.push({\n name: 'Bool',\n type: 'boolean',\n description: 'If checked comparison will return 0 or 1 for the value rather than filtering.',\n });\n defaultParams = [2, false];\n }\n\n return {\n id: opDef.id,\n name: opDef.name,\n params,\n defaultParams,\n toggleable: true,\n alternativesKey: 'binary scalar operations',\n category: LokiVisualQueryOperationCategory.BinaryOps,\n renderer: getSimpleBinaryRenderer(opDef.sign),\n addOperationHandler: defaultAddOperationHandler,\n };\n});\n\nfunction getSimpleBinaryRenderer(operator: string) {\n return function binaryRenderer(\n model: QueryBuilderOperation,\n def: QueryBuilderOperationDefinition,\n innerExpr: string\n ) {\n let param = model.params[0];\n let bool = '';\n if (model.params.length === 2) {\n bool = model.params[1] ? ' bool' : '';\n }\n\n return `${innerExpr} ${operator}${bool} ${param}`;\n };\n}\n","import { css } from '@emotion/css';\n\nimport { Spinner } from '@grafana/ui';\n\n// ideally we'd use `@grafana/ui/LoadingPlaceholder`, but that\n// one has a large margin-bottom.\ntype Props = {\n adjective?: string;\n};\n\nexport const LoadingIndicator = ({ adjective = 'newer' }: Props) => {\n const text = `Loading ${adjective} logs...`;\n return (\n <div className={loadingIndicatorStyles}>\n <div>\n {text} <Spinner inline />\n </div>\n </div>\n );\n};\n\nconst loadingIndicatorStyles = css({\n display: 'flex',\n justifyContent: 'center',\n});\n","import { CSSProperties, ReactNode } from 'react';\n\nimport { LogLineStyles } from './LogLine';\n\ninterface Props {\n children: ReactNode;\n onClick?: () => void;\n style: CSSProperties;\n styles: LogLineStyles;\n}\n\nexport const LogLineMessage = ({ children, onClick, style, styles }: Props) => {\n return (\n <div style={style} className={`${styles.logLine} ${styles.logLineMessage}`}>\n {onClick ? (\n <button className={styles.loadMoreButton} onClick={onClick}>\n {children}\n </button>\n ) : (\n children\n )}\n </div>\n );\n};\n","import { ReactNode, useCallback, useEffect, useRef, useState, MouseEvent } from 'react';\nimport { usePrevious } from 'react-use';\nimport { ListChildComponentProps, ListOnItemsRenderedProps } from 'react-window';\n\nimport { AbsoluteTimeRange, LogsSortOrder, TimeRange } from '@grafana/data';\nimport { t } from '@grafana/i18n';\nimport { config, reportInteraction } from '@grafana/runtime';\nimport { Spinner, useStyles2 } from '@grafana/ui';\n\nimport { canScrollBottom, canScrollTop, getVisibleRange, ScrollDirection, shouldLoadMore } from '../InfiniteScroll';\n\nimport { getStyles, LogLine } from './LogLine';\nimport { LogLineMessage } from './LogLineMessage';\nimport { LogListModel } from './processing';\nimport { LogLineVirtualization } from './virtualization';\n\ninterface ChildrenProps {\n itemCount: number;\n getItemKey: (index: number) => string;\n onItemsRendered: (props: ListOnItemsRenderedProps) => void;\n Renderer: (props: ListChildComponentProps) => ReactNode;\n}\n\nexport interface Props {\n children: (props: ChildrenProps) => ReactNode;\n displayedFields: string[];\n handleOverflow: (index: number, id: string, height?: number) => void;\n infiniteScrollMode: InfiniteScrollMode;\n loading?: boolean;\n loadMore?: LoadMoreLogsType;\n logs: LogListModel[];\n onClick: (e: MouseEvent<HTMLElement>, log: LogListModel) => void;\n scrollElement: HTMLDivElement | null;\n setInitialScrollPosition: (log?: LogListModel) => void;\n showTime: boolean;\n sortOrder: LogsSortOrder;\n timeRange: TimeRange;\n timeZone: string;\n virtualization: LogLineVirtualization;\n wrapLogMessage: boolean;\n}\n\ntype InfiniteLoaderState = 'idle' | 'out-of-bounds' | 'pre-scroll-top' | 'pre-scroll-bottom' | 'loading';\nexport type InfiniteScrollMode = 'interval' | 'unlimited';\nexport type LoadMoreLogsType =\n | ((range: AbsoluteTimeRange) => void)\n | ((range: AbsoluteTimeRange, scrollDirection: ScrollDirection) => void);\n\nexport const InfiniteScroll = ({\n children,\n displayedFields,\n handleOverflow,\n infiniteScrollMode,\n loading,\n loadMore,\n logs,\n onClick,\n scrollElement,\n setInitialScrollPosition,\n showTime,\n sortOrder,\n timeRange,\n timeZone,\n virtualization,\n wrapLogMessage,\n}: Props) => {\n const [infiniteLoaderState, setInfiniteLoaderState] = useState<InfiniteLoaderState>('idle');\n const [autoScroll, setAutoScroll] = useState(false);\n const prevLogs = usePrevious(logs);\n const prevSortOrder = usePrevious(sortOrder);\n const lastScroll = useRef<number>(scrollElement?.scrollTop || 0);\n const lastEvent = useRef<Event | WheelEvent | null>(null);\n const countRef = useRef(0);\n const lastLogOfPage = useRef<string[]>([]);\n const styles = useStyles2(getStyles, virtualization);\n const resetStateTimeout = useRef<ReturnType<typeof setTimeout> | null>(null);\n const scrollToLogLineRef = useRef<LogListModel | undefined>(undefined);\n const noScrollRef = useRef<undefined | boolean>(undefined);\n\n useEffect(() => {\n // Logs have not changed, ignore effect\n if (!prevLogs || prevLogs === logs) {\n return;\n }\n // New logs are from infinite scrolling\n if (infiniteLoaderState === 'loading') {\n // out-of-bounds if no new logs returned\n setInfiniteLoaderState(\n logs.length === prevLogs.length && infiniteScrollMode === 'interval' ? 'out-of-bounds' : 'idle'\n );\n if (scrollToLogLineRef.current) {\n setAutoScroll(true);\n }\n } else {\n lastLogOfPage.current = [];\n setAutoScroll(true);\n }\n }, [infiniteLoaderState, infiniteScrollMode, logs, prevLogs]);\n\n useEffect(() => {\n if (prevSortOrder && prevSortOrder !== sortOrder) {\n setInfiniteLoaderState('idle');\n }\n }, [prevSortOrder, sortOrder]);\n\n useEffect(() => {\n if (autoScroll && !loading) {\n setInitialScrollPosition(scrollToLogLineRef.current);\n scrollToLogLineRef.current = undefined;\n setAutoScroll(false);\n }\n }, [autoScroll, loading, setInitialScrollPosition]);\n\n const onLoadMore = useCallback(\n (scrollDirection: ScrollDirection) => {\n const newRange =\n scrollDirection === ScrollDirection.Bottom\n ? canScrollBottom(getVisibleRange(logs), timeRange, timeZone, sortOrder)\n : canScrollTop(getVisibleRange(logs), timeRange, timeZone, sortOrder);\n if (!newRange && infiniteScrollMode === 'interval') {\n setInfiniteLoaderState('out-of-bounds');\n return;\n }\n if (scrollDirection === ScrollDirection.Bottom) {\n lastLogOfPage.current.push(logs[logs.length - 1].uid);\n } else {\n scrollToLogLineRef.current = logs[0];\n lastLogOfPage.current.push(logs[0].uid);\n }\n setInfiniteLoaderState('loading');\n loadMore?.(newRange ?? getVisibleRange(logs), scrollDirection);\n\n reportInteraction('grafana_logs_infinite_scrolling', {\n direction: scrollDirection,\n sort_order: sortOrder,\n });\n },\n [infiniteScrollMode, loadMore, logs, sortOrder, timeRange, timeZone]\n );\n\n useEffect(() => {\n if (!scrollElement || !loadMore || !config.featureToggles.logsInfiniteScrolling) {\n return;\n }\n\n function handleScroll(event: Event | WheelEvent) {\n if (\n !scrollElement ||\n !loadMore ||\n !logs.length ||\n noScrollRef.current === undefined ||\n noScrollRef.current === true\n ) {\n return;\n }\n const scrollDirection = shouldLoadMore(event, lastEvent.current, countRef, scrollElement, lastScroll.current);\n lastEvent.current = event;\n lastScroll.current = scrollElement.scrollTop;\n if (infiniteLoaderState !== 'pre-scroll-bottom' && infiniteLoaderState !== 'pre-scroll-top') {\n if (infiniteScrollMode === 'unlimited' && scrollDirection === ScrollDirection.Top) {\n setInfiniteLoaderState('pre-scroll-top');\n resetStateTimeout.current = setTimeout(() => {\n setInfiniteLoaderState((state) => (state === 'pre-scroll-top' ? 'idle' : state));\n }, 10000);\n return;\n }\n return;\n }\n if (scrollDirection !== ScrollDirection.NoScroll) {\n onLoadMore(scrollDirection);\n }\n }\n\n scrollElement.addEventListener('scroll', handleScroll);\n scrollElement.addEventListener('wheel', handleScroll);\n\n return () => {\n scrollElement.removeEventListener('scroll', handleScroll);\n scrollElement.removeEventListener('wheel', handleScroll);\n };\n }, [infiniteLoaderState, infiniteScrollMode, loadMore, logs.length, onLoadMore, scrollElement]);\n\n useEffect(() => {\n return () => {\n if (resetStateTimeout.current) {\n clearTimeout(resetStateTimeout.current);\n }\n };\n }, []);\n\n const loadMoreTop = useCallback(() => {\n if (resetStateTimeout.current) {\n clearTimeout(resetStateTimeout.current);\n }\n onLoadMore(ScrollDirection.Top);\n }, [onLoadMore]);\n\n const loadMoreBottom = useCallback(() => {\n onLoadMore(ScrollDirection.Bottom);\n }, [onLoadMore]);\n\n const Renderer = useCallback(\n ({ index, style }: ListChildComponentProps) => {\n if (!logs[index] && infiniteLoaderState !== 'idle') {\n return (\n <LogLineMessage\n style={style}\n styles={styles}\n onClick={infiniteLoaderState === 'pre-scroll-bottom' ? loadMoreBottom : undefined}\n >\n {getMessageFromInfiniteLoaderState(infiniteLoaderState, sortOrder)}\n </LogLineMessage>\n );\n }\n return (\n <LogLine\n displayedFields={displayedFields}\n index={index}\n log={logs[index]}\n logs={logs}\n onClick={onClick}\n showTime={showTime}\n style={style}\n styles={styles}\n timeRange={timeRange}\n timeZone={timeZone}\n variant={getLogLineVariant(logs, index, lastLogOfPage.current)}\n virtualization={virtualization}\n wrapLogMessage={wrapLogMessage}\n onOverflow={handleOverflow}\n />\n );\n },\n [\n displayedFields,\n handleOverflow,\n infiniteLoaderState,\n loadMoreBottom,\n logs,\n onClick,\n showTime,\n sortOrder,\n styles,\n timeRange,\n timeZone,\n virtualization,\n wrapLogMessage,\n ]\n );\n\n const onItemsRendered = useCallback(\n (props: ListOnItemsRenderedProps) => {\n if (!scrollElement) {\n return;\n }\n if (props.visibleStartIndex === 0) {\n noScrollRef.current = scrollElement.scrollHeight <= scrollElement.clientHeight;\n }\n if (noScrollRef.current || infiniteLoaderState === 'loading' || infiniteLoaderState === 'out-of-bounds') {\n return;\n }\n const lastLogIndex = logs.length - 1;\n const preScrollIndex = logs.length - 2;\n if (props.visibleStopIndex >= lastLogIndex) {\n setInfiniteLoaderState('pre-scroll-bottom');\n } else if (props.visibleStartIndex < preScrollIndex) {\n setInfiniteLoaderState('idle');\n }\n },\n [infiniteLoaderState, logs.length, scrollElement]\n );\n\n const getItemKey = useCallback((index: number) => (logs[index] ? logs[index].uid : index.toString()), [logs]);\n\n const itemCount = logs.length && loadMore && infiniteLoaderState !== 'idle' ? logs.length + 1 : logs.length;\n\n return (\n <>\n {infiniteLoaderState === 'pre-scroll-top' && (\n <div className={styles.loadMoreTopContainer}>\n <LogLineMessage style={{}} styles={styles} onClick={loadMoreTop}>\n {t('logs.infinite-scroll.load-more', 'Scroll to load more')}\n </LogLineMessage>\n </div>\n )}\n {children({ getItemKey, itemCount, onItemsRendered, Renderer })}\n </>\n );\n};\n\nfunction getMessageFromInfiniteLoaderState(state: InfiniteLoaderState, order: LogsSortOrder) {\n switch (state) {\n case 'out-of-bounds':\n return t('logs.infinite-scroll.end-of-range', 'End of the selected time range.');\n case 'loading':\n return (\n <>\n {order === LogsSortOrder.Ascending\n ? t('logs.infinite-scroll.load-newer', 'Loading newer logs...')\n : t('logs.infinite-scroll.load-older', 'Loading older logs...')}{' '}\n <Spinner inline />\n </>\n );\n case 'pre-scroll-bottom':\n return t('logs.infinite-scroll.load-more', 'Scroll to load more');\n default:\n return null;\n }\n}\n\nfunction getLogLineVariant(logs: LogListModel[], index: number, lastLogOfPage: string[]) {\n if (!lastLogOfPage.length || !logs[index - 1]) {\n return undefined;\n }\n const prevLog = logs[index - 1];\n for (const uid of lastLogOfPage) {\n if (prevLog.uid === uid) {\n // First log of an infinite scrolling page\n return 'infinite-scroll';\n }\n }\n return undefined;\n}\n","import { css } from '@emotion/css';\nimport { ChangeEvent, startTransition, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { VariableSizeList } from 'react-window';\n\nimport { escapeRegex, GrafanaTheme2, shallowCompare } from '@grafana/data';\nimport { t } from '@grafana/i18n';\nimport { reportInteraction } from '@grafana/runtime';\nimport { IconButton, Input, useStyles2 } from '@grafana/ui';\n\nimport { useLogListContext } from './LogListContext';\nimport { useLogListSearchContext } from './LogListSearchContext';\nimport { LogListModel } from './processing';\n\ninterface Props {\n listRef: VariableSizeList | null;\n logs: LogListModel[];\n}\n\nexport const LOG_LIST_SEARCH_HEIGHT = 48;\nexport const LogListSearch = ({ listRef, logs }: Props) => {\n const {\n hideSearch,\n filterLogs,\n matchingUids,\n setMatchingUids,\n setSearch: setContextSearch,\n searchVisible,\n toggleFilterLogs,\n } = useLogListSearchContext();\n const { displayedFields, noInteractions } = useLogListContext();\n const [search, setSearch] = useState('');\n const [currentResult, setCurrentResult] = useState<number | null>(null);\n const inputRef = useRef('');\n const searchUsedRef = useRef(false);\n const styles = useStyles2(getStyles);\n\n const matches = useMemo(() => {\n if (!search || !searchVisible) {\n return [];\n }\n return findMatchingLogs(logs, search, displayedFields);\n }, [displayedFields, logs, search, searchVisible]);\n\n const handleChange = useCallback(\n (e: ChangeEvent<HTMLInputElement>) => {\n inputRef.current = e.target.value;\n startTransition(() => {\n setSearch(inputRef.current);\n });\n if (!searchUsedRef.current && !noInteractions) {\n reportInteraction('logs_log_list_search_used');\n searchUsedRef.current = true;\n }\n },\n [noInteractions]\n );\n\n const prevResult = useCallback(() => {\n if (currentResult === null) {\n return;\n }\n const prev = currentResult > 0 ? currentResult - 1 : matches.length - 1;\n setCurrentResult(prev);\n listRef?.scrollToItem(logs.indexOf(matches[prev]), 'center');\n }, [currentResult, listRef, logs, matches]);\n\n const nextResult = useCallback(() => {\n if (currentResult === null) {\n return;\n }\n const next = currentResult < matches.length - 1 ? currentResult + 1 : 0;\n setCurrentResult(next);\n listRef?.scrollToItem(logs.indexOf(matches[next]), 'center');\n }, [currentResult, listRef, logs, matches]);\n\n useEffect(() => {\n if (!matches.length) {\n setCurrentResult(null);\n return;\n }\n if (!currentResult) {\n setCurrentResult(0);\n listRef?.scrollToItem(logs.indexOf(matches[0]), 'center');\n }\n }, [currentResult, listRef, logs, matches]);\n\n useEffect(() => {\n if (!searchVisible) {\n setSearch('');\n setContextSearch(undefined);\n setMatchingUids(null);\n }\n }, [searchVisible, setContextSearch, setMatchingUids]);\n\n useEffect(() => {\n const newMatchingUids = matches.map((log) => log.uid);\n const sameLogs = matchingUids ? shallowCompare(matchingUids, newMatchingUids) : false;\n\n if (matchingUids && !sameLogs) {\n // Cleanup previous matches\n logs\n .filter((log) => matchingUids.includes(log.uid))\n .filter((prevMatchingLog) => matches.findIndex((matchingLog) => matchingLog.uid === prevMatchingLog.uid) < 0)\n .forEach((log) => log.setCurrentSearch(undefined));\n }\n\n setContextSearch(search ? search : undefined);\n if (!sameLogs) {\n setMatchingUids(newMatchingUids.length ? newMatchingUids : null);\n } else if (!matches.length) {\n setMatchingUids(null);\n }\n }, [logs, matches, matchingUids, search, setContextSearch, setMatchingUids]);\n\n if (!searchVisible) {\n return null;\n }\n\n const suffix =\n search !== '' ? <>{`${currentResult !== null ? currentResult + 1 : 0}/${matches?.length ?? 0}`}</> : undefined;\n\n return (\n <div className={styles.container}>\n <div className={styles.wrapper}>\n <Input\n onChange={handleChange}\n autoFocus\n placeholder={t('logs.log-list-search.input-placeholder', 'Search in logs')}\n suffix={suffix}\n />\n </div>\n <IconButton\n name=\"info-circle\"\n variant=\"secondary\"\n tooltip={t(\n 'logs.log-list-search.info',\n 'Client-side search for strings within the displayed logs. Not to be confused with query filters. Use this component to search for specific strings in your log results.'\n )}\n />\n <IconButton\n onClick={prevResult}\n disabled={!matches || !matches.length}\n name=\"angle-up\"\n aria-label={t('logs.log-list-search.prev', 'Previous result')}\n />\n <IconButton\n onClick={nextResult}\n disabled={!matches || !matches.length}\n name=\"angle-down\"\n aria-label={t('logs.log-list-search.next', 'Next result')}\n />\n <IconButton\n onClick={toggleFilterLogs}\n disabled={!matches || !matches.length}\n className={filterLogs ? styles.controlButtonActive : undefined}\n name=\"filter\"\n aria-label={t('logs.log-list-search.filter', 'Filter matching logs')}\n />\n <IconButton onClick={hideSearch} name=\"times\" aria-label={t('logs.log-list-search.close', 'Close search')} />\n </div>\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => ({\n container: css({\n background: theme.colors.background.elevated,\n display: 'flex',\n gap: theme.spacing(1),\n padding: theme.spacing(1),\n zIndex: theme.zIndex.modal,\n overflow: 'hidden',\n width: '100%',\n }),\n wrapper: css({\n width: '50%',\n }),\n controlButtonActive: css({\n '&:after': {\n display: 'block',\n content: '\" \"',\n position: 'absolute',\n height: 2,\n borderRadius: theme.shape.radius.default,\n bottom: 2,\n backgroundImage: theme.colors.gradients.brandHorizontal,\n width: '95%',\n opacity: 1,\n },\n }),\n});\n\nfunction findMatchingLogs(logs: LogListModel[], search: string, displayedFields: string[]) {\n const regex = new RegExp(escapeRegex(search), 'i');\n const newMatches = logs.filter((log) => {\n if (log.entry.match(regex)) {\n return true;\n }\n\n return displayedFields.some((field) => log.getDisplayedFieldValue(field).match(regex));\n });\n newMatches.forEach((log) => log.setCurrentSearch(search));\n return newMatches;\n}\n","import { useEffect } from 'react';\n\nimport { useLogListSearchContext } from './LogListSearchContext';\n\n/**\n * Handles toggling of the search box of virtualized Logs Panel.\n * Mousetrap cannot be used because of the following issues:\n * - https://github.com/ccampbell/mousetrap/issues/442\n * - https://github.com/ccampbell/mousetrap/issues/162\n */\n\nexport const useKeyBindings = () => {\n const { hideSearch, searchVisible, showSearch } = useLogListSearchContext();\n\n useEffect(() => {\n function handleToggleSearch(event: KeyboardEvent) {\n const isMac = navigator.userAgent.includes('Mac');\n const isFKey = event.key === 'f' || event.key === 'F';\n\n if ((isMac && event.metaKey && isFKey) || (!isMac && event.ctrlKey && isFKey)) {\n showSearch();\n return;\n }\n if (event.key === 'Escape' && searchVisible) {\n hideSearch();\n }\n }\n document.addEventListener('keydown', handleToggleSearch);\n return () => {\n document.removeEventListener('keydown', handleToggleSearch);\n };\n });\n};\n","import { useCallback, useRef, useState, MouseEvent } from 'react';\n\nimport { config } from '@grafana/runtime';\n\nimport { disablePopoverMenu, enablePopoverMenu, isPopoverMenuDisabled, targetIsElement } from '../../utils';\nimport { PopoverStateType } from '../LogRows';\n\nimport { useLogListContext } from './LogListContext';\nimport { LogListModel } from './processing';\n\nexport const usePopoverMenu = (containerElement: HTMLDivElement | null) => {\n const [popoverState, setPopoverState] = useState<PopoverStateType>({\n selection: '',\n selectedRow: null,\n popoverMenuCoordinates: { x: 0, y: 0 },\n });\n const [showDisablePopoverOptions, setShowDisablePopoverOptions] = useState(false);\n const handleDeselectionRef = useRef<((e: Event) => void) | null>(null);\n const { onClickFilterOutString, onClickFilterString } = useLogListContext();\n\n const popoverMenuSupported = useCallback(() => {\n if (!config.featureToggles.logRowsPopoverMenu || isPopoverMenuDisabled()) {\n return false;\n }\n return Boolean(onClickFilterOutString || onClickFilterString);\n }, [onClickFilterOutString, onClickFilterString]);\n\n const closePopoverMenu = useCallback(() => {\n if (handleDeselectionRef.current) {\n document.removeEventListener('click', handleDeselectionRef.current);\n document.removeEventListener('contextmenu', handleDeselectionRef.current);\n handleDeselectionRef.current = null;\n }\n setPopoverState({\n selection: '',\n popoverMenuCoordinates: { x: 0, y: 0 },\n selectedRow: null,\n });\n }, []);\n\n const handleDeselection = useCallback(\n (e: Event) => {\n if (targetIsElement(e.target) && !containerElement?.contains(e.target)) {\n // The mouseup event comes from outside the log rows, close the menu.\n closePopoverMenu();\n return;\n }\n if (document.getSelection()?.toString()) {\n return;\n }\n closePopoverMenu();\n },\n [closePopoverMenu, containerElement]\n );\n\n const handleTextSelection = useCallback(\n (e: MouseEvent<HTMLElement>, row: LogListModel): boolean => {\n const selection = document.getSelection()?.toString();\n if (!selection) {\n return false;\n }\n if (e.altKey) {\n enablePopoverMenu();\n }\n if (popoverMenuSupported() === false) {\n // This signals onRowClick inside LogRow to skip the event because the user is selecting text\n return selection ? true : false;\n }\n\n if (!containerElement) {\n return false;\n }\n\n const MENU_WIDTH = 270;\n const MENU_HEIGHT = 105;\n const x = e.clientX + MENU_WIDTH > window.innerWidth ? window.innerWidth - MENU_WIDTH : e.clientX;\n const y = e.clientY + MENU_HEIGHT > window.innerHeight ? window.innerHeight - MENU_HEIGHT : e.clientY;\n\n setPopoverState({\n selection,\n popoverMenuCoordinates: { x, y },\n selectedRow: row,\n });\n handleDeselectionRef.current = handleDeselection;\n document.addEventListener('click', handleDeselection);\n document.addEventListener('contextmenu', handleDeselection);\n return true;\n },\n [containerElement, handleDeselection, popoverMenuSupported]\n );\n\n const onDisablePopoverMenu = useCallback(() => {\n closePopoverMenu();\n setShowDisablePopoverOptions(true);\n }, [closePopoverMenu]);\n\n const onDisableCancel = useCallback(() => {\n setShowDisablePopoverOptions(false);\n }, []);\n\n const onDisableConfirm = useCallback(() => {\n disablePopoverMenu();\n setShowDisablePopoverOptions(false);\n }, []);\n\n return {\n closePopoverMenu,\n handleTextSelection,\n onDisableCancel,\n onDisableConfirm,\n onDisablePopoverMenu,\n popoverState,\n showDisablePopoverOptions,\n };\n};\n","import { css } from '@emotion/css';\nimport { debounce } from 'lodash';\nimport { Grammar } from 'prismjs';\nimport { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState, MouseEvent } from 'react';\nimport { Align, VariableSizeList } from 'react-window';\n\nimport {\n CoreApp,\n DataFrame,\n EventBus,\n EventBusSrv,\n GrafanaTheme2,\n LogLevel,\n LogRowModel,\n LogsDedupStrategy,\n LogsMetaItem,\n LogsSortOrder,\n store,\n TimeRange,\n} from '@grafana/data';\nimport { Trans, t } from '@grafana/i18n';\nimport { ConfirmModal, Icon, PopoverContent, useStyles2, useTheme2 } from '@grafana/ui';\nimport { PopoverMenu } from 'app/features/explore/Logs/PopoverMenu';\nimport { GetFieldLinksFn } from 'app/plugins/panel/logs/types';\n\nimport { LogListFieldSelector } from '../fieldSelector/FieldSelector';\n\nimport { InfiniteScrollMode, InfiniteScroll, LoadMoreLogsType } from './InfiniteScroll';\nimport { getGridTemplateColumns, LogLineTimestampResolution } from './LogLine';\nimport { LogLineDetails, LogLineDetailsMode } from './LogLineDetails';\nimport { GetRowContextQueryFn, LogLineMenuCustomItem } from './LogLineMenu';\nimport { LogListContextProvider, LogListState, useLogListContext } from './LogListContext';\nimport { LogListControls } from './LogListControls';\nimport { LOG_LIST_SEARCH_HEIGHT, LogListSearch } from './LogListSearch';\nimport { LogListSearchContextProvider, useLogListSearchContext } from './LogListSearchContext';\nimport { preProcessLogs, LogListModel, getLevelsFromLogs } from './processing';\nimport { useKeyBindings } from './useKeyBindings';\nimport { usePopoverMenu } from './usePopoverMenu';\nimport { LogLineVirtualization, getLogLineSize, LogFieldDimension, ScrollToLogsEvent } from './virtualization';\n\nexport interface Props {\n app: CoreApp;\n containerElement: HTMLDivElement;\n dedupStrategy: LogsDedupStrategy;\n dataFrames?: DataFrame[];\n detailsMode?: LogLineDetailsMode;\n displayedFields: string[];\n enableLogDetails: boolean;\n eventBus?: EventBus;\n filterLevels?: LogLevel[];\n fontSize?: LogListFontSize;\n getFieldLinks?: GetFieldLinksFn;\n getRowContextQuery?: GetRowContextQueryFn;\n grammar?: Grammar;\n infiniteScrollMode?: InfiniteScrollMode;\n initialScrollPosition?: 'top' | 'bottom';\n isLabelFilterActive?: (key: string, value: string, refId?: string) => Promise<boolean>;\n loading?: boolean;\n loadMore?: LoadMoreLogsType;\n logLineMenuCustomItems?: LogLineMenuCustomItem[];\n logOptionsStorageKey?: string;\n logs: LogRowModel[];\n logsMeta?: LogsMetaItem[];\n logSupportsContext?: (row: LogRowModel) => boolean;\n noInteractions?: boolean;\n onClickFilterLabel?: (key: string, value: string, frame?: DataFrame) => void;\n onClickFilterOutLabel?: (key: string, value: string, frame?: DataFrame) => void;\n onClickFilterString?: (value: string, refId?: string) => void;\n onClickFilterOutString?: (value: string, refId?: string) => void;\n onClickShowField?: (key: string) => void;\n onClickHideField?: (key: string) => void;\n onLogOptionsChange?: (option: LogListOptions, value: string | boolean | string[]) => void;\n onLogLineHover?: (row?: LogRowModel) => void;\n onPermalinkClick?: (row: LogRowModel) => Promise<void>;\n onPinLine?: (row: LogRowModel) => void;\n onOpenContext?: (row: LogRowModel, onClose: () => void) => void;\n onUnpinLine?: (row: LogRowModel) => void;\n permalinkedLogId?: string;\n pinLineButtonTooltipTitle?: PopoverContent;\n pinnedLogs?: string[];\n prettifyJSON?: boolean;\n setDisplayedFields?: (displayedFields: string[]) => void;\n showControls: boolean;\n showFieldSelector?: boolean;\n /**\n * Experimental. When OTel logs are displayed, add an extra displayed field with relevant key-value pairs from labels and metadata\n * @alpha\n */\n showLogAttributes?: boolean;\n showTime: boolean;\n showUniqueLabels?: boolean;\n sortOrder: LogsSortOrder;\n timeRange: TimeRange;\n timestampResolution?: LogLineTimestampResolution;\n timeZone: string;\n syntaxHighlighting?: boolean;\n wrapLogMessage: boolean;\n}\n\nexport type LogListFontSize = 'default' | 'small';\n\nexport type LogListOptions = keyof LogListState | 'wrapLogMessage' | 'prettifyLogMessage' | 'defaultDisplayedFields';\n\ntype LogListComponentProps = Omit<\n Props,\n | 'app'\n | 'dedupStrategy'\n | 'displayedFields'\n | 'enableLogDetails'\n | 'logOptionsStorageKey'\n | 'permalinkedLogId'\n | 'showTime'\n | 'sortOrder'\n | 'syntaxHighlighting'\n | 'wrapLogMessage'\n>;\n\nexport const LogList = ({\n app,\n displayedFields,\n dataFrames,\n containerElement,\n logOptionsStorageKey,\n detailsMode,\n dedupStrategy,\n enableLogDetails,\n eventBus,\n filterLevels,\n fontSize = logOptionsStorageKey ? (store.get(`${logOptionsStorageKey}.fontSize`) ?? 'default') : 'default',\n getFieldLinks,\n getRowContextQuery,\n grammar,\n infiniteScrollMode,\n initialScrollPosition = 'top',\n isLabelFilterActive,\n loading,\n loadMore,\n logLineMenuCustomItems,\n logs,\n logsMeta,\n logSupportsContext,\n noInteractions,\n onClickFilterLabel,\n onClickFilterOutLabel,\n onClickFilterString,\n onClickFilterOutString,\n onClickShowField,\n onClickHideField,\n onLogOptionsChange,\n onLogLineHover,\n onPermalinkClick,\n onPinLine,\n onOpenContext,\n onUnpinLine,\n permalinkedLogId,\n pinLineButtonTooltipTitle,\n pinnedLogs,\n prettifyJSON = logOptionsStorageKey ? store.getBool(`${logOptionsStorageKey}.prettifyLogMessage`, true) : true,\n setDisplayedFields,\n showControls,\n showFieldSelector,\n showLogAttributes,\n showTime,\n showUniqueLabels,\n sortOrder,\n syntaxHighlighting = logOptionsStorageKey ? store.getBool(`${logOptionsStorageKey}.syntaxHighlighting`, true) : true,\n timeRange,\n timestampResolution,\n timeZone,\n wrapLogMessage,\n}: Props) => {\n return (\n <LogListContextProvider\n app={app}\n containerElement={containerElement}\n dedupStrategy={dedupStrategy}\n detailsMode={detailsMode}\n displayedFields={displayedFields}\n enableLogDetails={enableLogDetails}\n filterLevels={filterLevels}\n fontSize={fontSize}\n getRowContextQuery={getRowContextQuery}\n isLabelFilterActive={isLabelFilterActive}\n logs={logs}\n logsMeta={logsMeta}\n logLineMenuCustomItems={logLineMenuCustomItems}\n logOptionsStorageKey={logOptionsStorageKey}\n logSupportsContext={logSupportsContext}\n noInteractions={noInteractions}\n onClickFilterLabel={onClickFilterLabel}\n onClickFilterOutLabel={onClickFilterOutLabel}\n onClickFilterString={onClickFilterString}\n onClickFilterOutString={onClickFilterOutString}\n onClickShowField={onClickShowField}\n onClickHideField={onClickHideField}\n onLogOptionsChange={onLogOptionsChange}\n onLogLineHover={onLogLineHover}\n onPermalinkClick={onPermalinkClick}\n onPinLine={onPinLine}\n onOpenContext={onOpenContext}\n onUnpinLine={onUnpinLine}\n permalinkedLogId={permalinkedLogId}\n pinLineButtonTooltipTitle={pinLineButtonTooltipTitle}\n pinnedLogs={pinnedLogs}\n prettifyJSON={prettifyJSON}\n setDisplayedFields={setDisplayedFields}\n showControls={showControls}\n showLogAttributes={showLogAttributes}\n showTime={showTime}\n showUniqueLabels={showUniqueLabels}\n sortOrder={sortOrder}\n syntaxHighlighting={syntaxHighlighting}\n timestampResolution={timestampResolution}\n wrapLogMessage={wrapLogMessage}\n >\n <LogListSearchContextProvider>\n <LogListComponent\n containerElement={containerElement}\n dataFrames={dataFrames}\n eventBus={eventBus}\n getFieldLinks={getFieldLinks}\n grammar={grammar}\n initialScrollPosition={initialScrollPosition}\n infiniteScrollMode={infiniteScrollMode}\n loading={loading}\n loadMore={loadMore}\n logs={logs}\n showControls={showControls}\n showFieldSelector={showFieldSelector}\n timeRange={timeRange}\n timeZone={timeZone}\n />\n </LogListSearchContextProvider>\n </LogListContextProvider>\n );\n};\n\nconst LogListComponent = ({\n containerElement,\n dataFrames,\n eventBus = new EventBusSrv(),\n getFieldLinks,\n grammar,\n initialScrollPosition = 'top',\n infiniteScrollMode = 'interval',\n loading,\n loadMore,\n logs,\n showControls,\n showFieldSelector,\n timeRange,\n timeZone,\n}: LogListComponentProps) => {\n const {\n app,\n displayedFields,\n dedupStrategy,\n detailsMode,\n filterLevels,\n fontSize,\n forceEscape,\n hasLogsWithErrors,\n hasSampledLogs,\n onClickFilterString,\n onClickFilterOutString,\n permalinkedLogId,\n prettifyJSON,\n showDetails,\n showTime,\n showUniqueLabels,\n sortOrder,\n timestampResolution,\n toggleDetails,\n wrapLogMessage,\n } = useLogListContext();\n const [processedLogs, setProcessedLogs] = useState<LogListModel[]>([]);\n const [listHeight, setListHeight] = useState(getListHeight(containerElement, app));\n const theme = useTheme2();\n const listRef = useRef<VariableSizeList | null>(null);\n const widthRef = useRef(containerElement.clientWidth);\n const wrapperRef = useRef<HTMLDivElement | null>(null);\n const scrollRef = useRef<HTMLDivElement | null>(null);\n const virtualization = useMemo(() => new LogLineVirtualization(theme, fontSize), [theme, fontSize]);\n const dimensions = useMemo(\n () =>\n wrapLogMessage\n ? []\n : virtualization.calculateFieldDimensions(\n processedLogs,\n displayedFields,\n timestampResolution,\n showUniqueLabels\n ),\n [displayedFields, processedLogs, showUniqueLabels, timestampResolution, virtualization, wrapLogMessage]\n );\n const styles = useStyles2(getStyles, dimensions, displayedFields, { showTime });\n const widthContainer = wrapperRef.current ?? containerElement;\n const {\n closePopoverMenu,\n handleTextSelection,\n onDisableCancel,\n onDisableConfirm,\n onDisablePopoverMenu,\n popoverState,\n showDisablePopoverOptions,\n } = usePopoverMenu(wrapperRef.current);\n useKeyBindings();\n const { filterLogs, matchingUids, searchVisible } = useLogListSearchContext();\n\n const levelFilteredLogs = useMemo(\n () =>\n filterLevels.length === 0 ? processedLogs : processedLogs.filter((log) => filterLevels.includes(log.logLevel)),\n [filterLevels, processedLogs]\n );\n\n const filteredLogs = useMemo(\n () =>\n matchingUids && filterLogs\n ? levelFilteredLogs.filter((log) => matchingUids.includes(log.uid))\n : levelFilteredLogs,\n [filterLogs, levelFilteredLogs, matchingUids]\n );\n\n // When log lines report size discrepancies, we debounce the calculation reset to give time to\n // use the smallest log index to reset the heights.\n const debouncedResetAfterIndex = useMemo(() => {\n return debounce((index: number) => {\n listRef.current?.resetAfterIndex(index);\n overflowIndexRef.current = Infinity;\n }, 0);\n }, []);\n\n const debouncedScrollToItem = useMemo(() => {\n return debounce((index: number, align?: Align) => {\n listRef.current?.scrollToItem(index, align);\n }, 250);\n }, []);\n\n useEffect(() => {\n const subscription = eventBus.subscribe(ScrollToLogsEvent, (e: ScrollToLogsEvent) =>\n handleScrollToEvent(e, filteredLogs, listRef.current)\n );\n return () => subscription.unsubscribe();\n }, [eventBus, filteredLogs]);\n\n useEffect(() => {\n setProcessedLogs(\n preProcessLogs(\n logs,\n {\n getFieldLinks,\n escape: forceEscape ?? false,\n prettifyJSON,\n order: sortOrder,\n timeZone,\n virtualization,\n wrapLogMessage,\n },\n grammar\n )\n );\n virtualization.resetLogLineSizes();\n listRef.current?.resetAfterIndex(0);\n }, [forceEscape, getFieldLinks, grammar, logs, prettifyJSON, sortOrder, timeZone, virtualization, wrapLogMessage]);\n\n useEffect(() => {\n listRef.current?.resetAfterIndex(0);\n }, [wrapLogMessage, showDetails, displayedFields, dedupStrategy]);\n\n useLayoutEffect(() => {\n const handleResize = (entry: ResizeObserverEntry) => {\n setListHeight(getListHeight(containerElement, app, searchVisible));\n if (widthRef.current !== entry.contentRect.width) {\n widthRef.current = entry.contentRect.width;\n }\n };\n const observer = new ResizeObserver((entries: ResizeObserverEntry[]) => {\n if (entries.length) {\n handleResize(entries[0]);\n }\n });\n observer.observe(containerElement);\n return () => observer.disconnect();\n }, [app, containerElement, searchVisible]);\n\n const overflowIndexRef = useRef(Infinity);\n const handleOverflow = useCallback(\n (index: number, id: string, height?: number) => {\n if (height !== undefined) {\n virtualization.storeLogLineSize(id, widthContainer, height);\n }\n if (index === overflowIndexRef.current) {\n return;\n }\n overflowIndexRef.current = index < overflowIndexRef.current ? index : overflowIndexRef.current;\n debouncedResetAfterIndex(overflowIndexRef.current);\n },\n [debouncedResetAfterIndex, virtualization, widthContainer]\n );\n\n const handleScrollPosition = useCallback(\n (log?: LogListModel) => {\n const scrollToUID = log ? log.uid : permalinkedLogId;\n if (scrollToUID) {\n const index = processedLogs.findIndex((log) => log.uid === scrollToUID);\n if (index >= 0) {\n listRef.current?.scrollToItem(index, 'start');\n return;\n }\n }\n listRef.current?.scrollToItem(initialScrollPosition === 'top' ? 0 : processedLogs.length - 1);\n },\n [initialScrollPosition, permalinkedLogId, processedLogs]\n );\n\n const handleLogLineClick = useCallback(\n (e: MouseEvent<HTMLElement>, log: LogListModel) => {\n if (handleTextSelection(e, log)) {\n // Event handled by the parent.\n return;\n }\n toggleDetails(log);\n },\n [handleTextSelection, toggleDetails]\n );\n\n const focusLogLine = useCallback(\n (log: LogListModel) => {\n const index = filteredLogs.findIndex((filteredLog) => filteredLog.uid === log.uid);\n if (index >= 0) {\n debouncedScrollToItem(index, 'start');\n }\n },\n [debouncedScrollToItem, filteredLogs]\n );\n\n const logLevels = useMemo(() => getLevelsFromLogs(processedLogs), [processedLogs]);\n\n if (!containerElement || listHeight == null) {\n // Wait for container to be rendered\n return null;\n }\n\n return (\n <div className={styles.logListContainer}>\n {showControls && <LogListControls logLevels={logLevels} eventBus={eventBus} />}\n {detailsMode === 'sidebar' && showDetails.length > 0 && (\n <LogLineDetails\n containerElement={containerElement}\n focusLogLine={focusLogLine}\n logs={filteredLogs}\n timeRange={timeRange}\n timeZone={timeZone}\n showControls={showControls}\n />\n )}\n <div className={styles.logListWrapper} ref={wrapperRef}>\n {popoverState.selection && popoverState.selectedRow && (\n <PopoverMenu\n close={closePopoverMenu}\n row={popoverState.selectedRow}\n selection={popoverState.selection}\n {...popoverState.popoverMenuCoordinates}\n onClickFilterString={onClickFilterString}\n onClickFilterOutString={onClickFilterOutString}\n onDisable={onDisablePopoverMenu}\n />\n )}\n {showDisablePopoverOptions && (\n <ConfirmModal\n isOpen\n title={t('logs.log-rows.disable-popover.title', 'Disable menu')}\n body={\n <>\n <Trans i18nKey=\"logs.log-rows.disable-popover.message\">\n You are about to disable the logs filter menu. To re-enable it, select text in a log line while\n holding the alt key.\n </Trans>\n <div className={styles.shortcut}>\n <Icon name=\"keyboard\" />\n <Trans i18nKey=\"logs.log-rows.disable-popover-message.shortcut\">alt+select to enable again</Trans>\n </div>\n </>\n }\n confirmText={t('logs.log-rows.disable-popover.confirm', 'Confirm')}\n icon=\"exclamation-triangle\"\n onConfirm={onDisableConfirm}\n onDismiss={onDisableCancel}\n />\n )}\n <LogListSearch logs={levelFilteredLogs} listRef={listRef.current} />\n <InfiniteScroll\n displayedFields={displayedFields}\n handleOverflow={handleOverflow}\n infiniteScrollMode={infiniteScrollMode}\n loading={loading}\n logs={filteredLogs}\n loadMore={loadMore}\n onClick={handleLogLineClick}\n scrollElement={scrollRef.current}\n showTime={showTime}\n sortOrder={sortOrder}\n timeRange={timeRange}\n timeZone={timeZone}\n setInitialScrollPosition={handleScrollPosition}\n virtualization={virtualization}\n wrapLogMessage={wrapLogMessage}\n >\n {({ getItemKey, itemCount, onItemsRendered, Renderer }) => (\n <VariableSizeList\n className={styles.logList}\n height={listHeight}\n itemCount={itemCount}\n itemSize={getLogLineSize.bind(null, virtualization, filteredLogs, widthContainer, displayedFields, {\n detailsMode,\n hasLogsWithErrors,\n hasSampledLogs,\n showDuplicates: dedupStrategy !== LogsDedupStrategy.none,\n showDetails,\n showTime,\n wrap: wrapLogMessage,\n })}\n itemKey={getItemKey}\n layout=\"vertical\"\n onItemsRendered={onItemsRendered}\n outerRef={scrollRef}\n overscanCount={5}\n ref={listRef}\n style={wrapLogMessage ? { overflowY: 'scroll' } : { overflow: 'scroll' }}\n width=\"100%\"\n >\n {Renderer}\n </VariableSizeList>\n )}\n </InfiniteScroll>\n </div>\n {showFieldSelector && processedLogs.length > 0 && dataFrames && (\n <LogListFieldSelector containerElement={containerElement} dataFrames={dataFrames} logs={processedLogs} />\n )}\n </div>\n );\n};\n\nfunction getStyles(\n theme: GrafanaTheme2,\n dimensions: LogFieldDimension[],\n displayedFields: string[],\n { showTime }: { showTime: boolean }\n) {\n const columns = showTime ? dimensions : dimensions.filter((_, index) => index > 0);\n return {\n logList: css({\n '& .unwrapped-log-line': {\n display: 'grid',\n gridTemplateColumns: getGridTemplateColumns(columns, displayedFields),\n '& .field': {\n overflow: 'hidden',\n },\n },\n }),\n logListContainer: css({\n display: 'flex',\n flexDirection: 'row-reverse',\n // Minimum width to prevent rendering issues and a sausage-like logs panel.\n minWidth: theme.spacing(35),\n }),\n logListWrapper: css({\n position: 'relative',\n width: '100%',\n }),\n shortcut: css({\n display: 'inline-flex',\n alignItems: 'center',\n gap: theme.spacing(1),\n color: theme.colors.text.secondary,\n opacity: 0.7,\n fontSize: theme.typography.bodySmall.fontSize,\n marginTop: theme.spacing(1),\n }),\n };\n}\n\nfunction handleScrollToEvent(event: ScrollToLogsEvent, logs: LogListModel[], list: VariableSizeList | null) {\n if (event.payload.scrollTo === 'top') {\n list?.scrollTo(0);\n } else if (event.payload.scrollTo === 'bottom') {\n list?.scrollToItem(logs.length - 1);\n } else {\n // uid\n const index = logs.findIndex((log) => log.uid === event.payload.scrollTo);\n if (index >= 0) {\n list?.scrollToItem(index, 'center');\n }\n }\n}\n\nfunction getListHeight(containerElement: HTMLDivElement, app: CoreApp, searchVisible = false) {\n return (\n (app === CoreApp.Explore\n ? Math.max(window.innerHeight * 0.8, containerElement.clientHeight)\n : containerElement.clientHeight) - (searchVisible ? LOG_LIST_SEARCH_HEIGHT : 0)\n );\n}\n","import { LogRowModel } from '@grafana/data';\n\nimport { LOG_LINE_BODY_FIELD_NAME } from '../LogDetailsBody';\nimport { LogListModel, NEWLINES_REGEX } from '../panel/processing';\n\n/**\n * The presence of this field along log fields determines OTel origin.\n */\nexport const OTEL_PROBE_FIELD = 'severity_number';\nconst OTEL_LANGUAGE_UNKNOWN = 'unknown';\n\nfunction identifyOTelLanguages(logs: LogListModel[] | LogRowModel[]): string[] {\n const languagesSet = new Set<string>();\n logs.forEach((log) => {\n const lang = identifyOTelLanguage(log);\n if (lang !== undefined) {\n languagesSet.add(lang);\n }\n });\n return [...languagesSet];\n}\n\nexport function identifyOTelLanguage(log: LogListModel | LogRowModel): string | undefined {\n if ('otelLanguage' in log && log.otelLanguage) {\n return log.otelLanguage;\n }\n return log.labels[OTEL_PROBE_FIELD] !== undefined\n ? (log.labels.telemetry_sdk_language ?? OTEL_LANGUAGE_UNKNOWN)\n : undefined;\n}\n\nfunction getDisplayedFieldsForLanguages(logs: LogListModel[] | LogRowModel[], languages: string[]) {\n const displayedFields: string[] = [];\n\n languages.forEach((language) => {\n const format = getDisplayFormatForLanguage(language) ?? getDefaultOTelDisplayFormat();\n format.forEach((field) => {\n if (!displayedFields.includes(field)) {\n displayedFields.push(field);\n }\n });\n });\n\n return displayedFields.filter(\n (field) =>\n field === LOG_LINE_BODY_FIELD_NAME ||\n field === OTEL_LOG_LINE_ATTRIBUTES_FIELD_NAME ||\n logs.some((log) => log.labels[field] !== undefined)\n );\n}\n\n/***\n * Given a list of logs, identify the OTel language for each, use the language to match displayed fields\n * and return a list of fields to display based on the languages present in the logs.\n */\nexport function getDisplayedFieldsForLogs(logs: LogListModel[] | LogRowModel[]): string[] {\n return getDisplayedFieldsForLanguages(logs, identifyOTelLanguages(logs));\n}\n\n// Languages not implemented.\nfunction getDisplayFormatForLanguage(language: string) {\n return undefined;\n}\n\n/***\n * Given a list of logs, return a list of suggested fields to display for the user.\n */\nexport function getSuggestedFieldsForLogs(logs: LogListModel[] | LogRowModel[]): string[] {\n const languages = identifyOTelLanguages(logs);\n if (!languages.length) {\n return [];\n }\n const fields = getSuggestedOTelDisplayFormat();\n\n return fields.filter(\n (field) =>\n field === LOG_LINE_BODY_FIELD_NAME ||\n field === OTEL_LOG_LINE_ATTRIBUTES_FIELD_NAME ||\n logs.some((log) => log.labels[field] !== undefined)\n );\n}\n\nfunction getSuggestedOTelDisplayFormat() {\n return ['scope_name', ...getDefaultOTelDisplayFormat()];\n}\n\nfunction getDefaultOTelDisplayFormat() {\n return [\n 'thread_name',\n 'exception_type',\n 'exception_message',\n LOG_LINE_BODY_FIELD_NAME,\n OTEL_LOG_LINE_ATTRIBUTES_FIELD_NAME,\n ];\n}\n\nconst OTEL_RESOURCE_ATTRS_REGEX =\n /^(aws_|cloud_|cloudfoundry_|container_|deployment_|faas_|gcp_|host_|k8s_|os_|process_|service_|telemetry_|cluster$|namespace$|pod$)/;\nconst OTEL_LOG_FIELDS_REGEX =\n /^(flags|observed_timestamp|severity_number|severity_text|span_id|trace_id|detected_level)$/;\n\nexport const OTEL_LOG_LINE_ATTRIBUTES_FIELD_NAME = '___OTEL_LOG_ATTRIBUTES___';\n\nexport function getOtelAttributesField(log: LogListModel, wrapLogMessage: boolean) {\n const additionalFields = Object.keys(log.labels).filter(\n (label) =>\n !OTEL_RESOURCE_ATTRS_REGEX.test(label) &&\n !OTEL_LOG_FIELDS_REGEX.test(label) &&\n label !== OTEL_LOG_LINE_ATTRIBUTES_FIELD_NAME\n );\n const attributes = additionalFields\n .map((field) => (log.labels[field] ? `${field}=${log.labels[field]}` : ''))\n .join(' ');\n if (!wrapLogMessage) {\n return attributes.replace(NEWLINES_REGEX, '');\n }\n return attributes;\n}\n","import { useState } from 'react';\n\nimport { DataSourceApi, SelectableValue } from '@grafana/data';\nimport {\n QueryBuilderLabelFilter,\n QueryBuilderOperationParamEditorProps,\n QueryBuilderOperationParamValue,\n VisualQuery,\n VisualQueryModeller,\n} from '@grafana/plugin-ui';\nimport { Select } from '@grafana/ui';\n\nimport { getOperationParamId } from '../operationUtils';\n\nexport const LabelParamEditor = ({\n onChange,\n index,\n operationId,\n value,\n query,\n datasource,\n queryModeller,\n}: QueryBuilderOperationParamEditorProps) => {\n const [state, setState] = useState<{\n options?: SelectableValue[];\n isLoading?: boolean;\n }>({});\n\n return (\n <Select<QueryBuilderOperationParamValue | undefined>\n inputId={getOperationParamId(operationId, index)}\n autoFocus={value === ''}\n openMenuOnFocus\n onOpenMenu={async () => {\n setState({ isLoading: true });\n const options = await loadGroupByLabels(query, datasource, queryModeller);\n setState({ options, isLoading: undefined });\n }}\n isLoading={state.isLoading}\n allowCustomValue\n noOptionsMessage=\"No labels found\"\n loadingMessage=\"Loading labels\"\n options={state.options}\n value={toOption(value)}\n onChange={(value) => onChange(index, value.value!)}\n />\n );\n};\n\nasync function loadGroupByLabels(\n query: VisualQuery,\n datasource: DataSourceApi,\n queryModeller: VisualQueryModeller\n): Promise<SelectableValue[]> {\n let labels: QueryBuilderLabelFilter[] = query.labels;\n\n const queryString = queryModeller.renderLabels(labels);\n const result: string[] = await datasource.languageProvider.fetchLabels({ streamSelector: queryString });\n\n return result.map((x) => ({\n label: x,\n value: x,\n }));\n}\n\nconst toOption = (\n value: QueryBuilderOperationParamValue | undefined\n): SelectableValue<QueryBuilderOperationParamValue | undefined> => ({ label: value?.toString(), value });\n","import { capitalize } from 'lodash';\nimport pluralize from 'pluralize';\n\nimport {\n QueryBuilderOperation,\n QueryBuilderOperationDefinition,\n QueryBuilderOperationParamDef,\n QueryBuilderOperationParamValue,\n VisualQuery,\n VisualQueryModeller,\n} from '@grafana/plugin-ui';\n\nimport { escapeLabelValueInExactSelector } from '../languageUtils';\nimport { FUNCTIONS } from '../syntax';\n\nimport { LabelParamEditor } from './components/LabelParamEditor';\nimport { LokiOperationId, LokiOperationOrder, LokiVisualQuery, LokiVisualQueryOperationCategory } from './types';\n\nexport function createRangeOperation(\n name: string,\n isRangeOperationWithGrouping?: boolean\n): QueryBuilderOperationDefinition {\n const params = [getRangeVectorParamDef()];\n const defaultParams = ['$__auto'];\n let paramChangedHandler = undefined;\n\n if (name === LokiOperationId.QuantileOverTime) {\n defaultParams.push('0.95');\n params.push({\n name: 'Quantile',\n type: 'number',\n });\n }\n\n if (isRangeOperationWithGrouping) {\n params.push({\n name: 'By label',\n type: 'string',\n restParam: true,\n optional: true,\n });\n\n paramChangedHandler = getOnLabelAddedHandler(`__${name}_by`);\n }\n\n return {\n id: name,\n name: getLokiOperationDisplayName(name),\n params: params,\n defaultParams,\n toggleable: true,\n alternativesKey: 'range function',\n category: LokiVisualQueryOperationCategory.RangeFunctions,\n orderRank: LokiOperationOrder.RangeVectorFunction,\n renderer: operationWithRangeVectorRenderer,\n addOperationHandler: addLokiOperation,\n paramChangedHandler,\n explainHandler: (op, def) => {\n let opDocs = FUNCTIONS.find((x) => x.insertText === op.id)?.documentation ?? '';\n\n if (op.params[0] === '$__auto') {\n return `${opDocs} \\`$__auto\\` is a variable that will be replaced with the [value of step](https://grafana.com/docs/grafana/next/datasources/loki/query-editor/#options) for range queries and with the value of the selected time range (calculated to - from) for instant queries.`;\n } else {\n return `${opDocs} The [range vector](https://grafana.com/docs/loki/latest/logql/metric_queries/#range-vector-aggregation) is set to \\`${op.params[0]}\\`.`;\n }\n },\n };\n}\n\nexport function createRangeOperationWithGrouping(name: string): QueryBuilderOperationDefinition[] {\n const rangeOperation = createRangeOperation(name, true);\n // Copy range operation params without the last param\n const params = rangeOperation.params.slice(0, -1);\n const operations: QueryBuilderOperationDefinition[] = [\n rangeOperation,\n {\n id: `__${name}_by`,\n name: `${getLokiOperationDisplayName(name)} by`,\n params: [\n ...params,\n {\n name: 'Label',\n type: 'string',\n restParam: true,\n optional: true,\n editor: LabelParamEditor,\n },\n ],\n defaultParams: [...rangeOperation.defaultParams, ''],\n toggleable: true,\n alternativesKey: 'range function with grouping',\n category: LokiVisualQueryOperationCategory.RangeFunctions,\n renderer: getRangeAggregationWithGroupingRenderer(name, 'by'),\n paramChangedHandler: getLastLabelRemovedHandler(name),\n explainHandler: getAggregationExplainer(name, 'by'),\n addOperationHandler: addLokiOperation,\n hideFromList: true,\n },\n {\n id: `__${name}_without`,\n name: `${getLokiOperationDisplayName(name)} without`,\n params: [\n ...params,\n {\n name: 'Label',\n type: 'string',\n restParam: true,\n optional: true,\n editor: LabelParamEditor,\n },\n ],\n defaultParams: [...rangeOperation.defaultParams, ''],\n alternativesKey: 'range function with grouping',\n category: LokiVisualQueryOperationCategory.RangeFunctions,\n renderer: getRangeAggregationWithGroupingRenderer(name, 'without'),\n paramChangedHandler: getLastLabelRemovedHandler(name),\n explainHandler: getAggregationExplainer(name, 'without'),\n addOperationHandler: addLokiOperation,\n hideFromList: true,\n },\n ];\n\n return operations;\n}\n\nexport function getRangeAggregationWithGroupingRenderer(aggregation: string, grouping: 'by' | 'without') {\n return function aggregationRenderer(\n model: QueryBuilderOperation,\n def: QueryBuilderOperationDefinition,\n innerExpr: string\n ) {\n const restParamIndex = def.params.findIndex((param) => param.restParam);\n const params = model.params.slice(0, restParamIndex);\n const restParams = model.params.slice(restParamIndex);\n\n if (params.length === 2 && aggregation === LokiOperationId.QuantileOverTime) {\n return `${aggregation}(${params[1]}, ${innerExpr} [${params[0]}]) ${grouping} (${restParams.join(', ')})`;\n }\n\n return `${aggregation}(${innerExpr} [${params[0]}]) ${grouping} (${restParams.join(', ')})`;\n };\n}\n\nfunction operationWithRangeVectorRenderer(\n model: QueryBuilderOperation,\n def: QueryBuilderOperationDefinition,\n innerExpr: string\n) {\n const params = model.params ?? [];\n const rangeVector = params[0] ?? '$__auto';\n // QuantileOverTime is only range vector with more than one param\n if (params.length === 2 && model.id === LokiOperationId.QuantileOverTime) {\n const quantile = params[1];\n return `${model.id}(${quantile}, ${innerExpr} [${rangeVector}])`;\n }\n\n return `${model.id}(${innerExpr} [${params[0] ?? '$__auto'}])`;\n}\n\nexport function labelFilterRenderer(\n model: QueryBuilderOperation,\n def: QueryBuilderOperationDefinition,\n innerExpr: string\n) {\n const integerOperators = ['<', '<=', '>', '>='];\n\n if (integerOperators.includes(String(model.params[1]))) {\n return `${innerExpr} | ${model.params[0]} ${model.params[1]} ${model.params[2]}`;\n }\n\n return `${innerExpr} | ${model.params[0]} ${model.params[1]} \\`${model.params[2]}\\``;\n}\n\nexport function isConflictingFilter(\n operation: QueryBuilderOperation,\n queryOperations: QueryBuilderOperation[]\n): boolean {\n if (!operation) {\n return false;\n }\n const operationIsNegative = operation.params[1].toString().startsWith('!');\n\n const candidates = queryOperations.filter(\n (queryOperation) =>\n queryOperation.id === LokiOperationId.LabelFilter &&\n queryOperation.params[0] === operation.params[0] &&\n queryOperation.params[2] === operation.params[2]\n );\n\n const conflict = candidates.some((candidate) => {\n if (operationIsNegative && candidate.params[1].toString().startsWith('!') === false) {\n return true;\n }\n if (operationIsNegative === false && candidate.params[1].toString().startsWith('!')) {\n return true;\n }\n return false;\n });\n\n return conflict;\n}\n\nexport function pipelineRenderer(\n model: QueryBuilderOperation,\n def: QueryBuilderOperationDefinition,\n innerExpr: string\n) {\n switch (model.id) {\n case LokiOperationId.Logfmt:\n const [strict = false, keepEmpty = false, ...labels] = model.params;\n return `${innerExpr} | logfmt${strict ? ' --strict' : ''}${keepEmpty ? ' --keep-empty' : ''} ${labels\n .filter((label) => label)\n .join(', ')}`.trim();\n case LokiOperationId.Json:\n return `${innerExpr} | json ${model.params.filter((param) => param).join(', ')}`.trim();\n case LokiOperationId.Drop:\n return `${innerExpr} | drop ${model.params.filter((param) => param).join(', ')}`.trim();\n case LokiOperationId.Keep:\n return `${innerExpr} | keep ${model.params.filter((param) => param).join(', ')}`.trim();\n default:\n return `${innerExpr} | ${model.id}`;\n }\n}\n\nfunction isRangeVectorFunction(def: QueryBuilderOperationDefinition) {\n return def.category === LokiVisualQueryOperationCategory.RangeFunctions;\n}\n\nfunction getIndexOfOrLast(\n operations: QueryBuilderOperation[],\n queryModeller: VisualQueryModeller,\n condition: (def: QueryBuilderOperationDefinition) => boolean\n) {\n const index = operations.findIndex((x) => {\n const opDef = queryModeller.getOperationDefinition(x.id);\n if (!opDef) {\n return false;\n }\n return condition(opDef);\n });\n\n return index === -1 ? operations.length : index;\n}\n\nexport function addLokiOperation(\n def: QueryBuilderOperationDefinition,\n query: LokiVisualQuery,\n modeller: VisualQueryModeller\n): LokiVisualQuery {\n const newOperation: QueryBuilderOperation = {\n id: def.id,\n params: def.defaultParams,\n };\n\n const operations = [...query.operations];\n\n const existingRangeVectorFunction = operations.find((x) => {\n const opDef = modeller.getOperationDefinition(x.id);\n if (!opDef) {\n return false;\n }\n return isRangeVectorFunction(opDef);\n });\n\n switch (def.category) {\n case LokiVisualQueryOperationCategory.Aggregations:\n case LokiVisualQueryOperationCategory.Functions:\n // If we are adding a function but we have not range vector function yet add one\n if (!existingRangeVectorFunction) {\n const placeToInsert = getIndexOfOrLast(\n operations,\n modeller,\n (def) => def.category === LokiVisualQueryOperationCategory.Functions\n );\n operations.splice(placeToInsert, 0, { id: LokiOperationId.Rate, params: ['$__auto'] });\n }\n operations.push(newOperation);\n break;\n case LokiVisualQueryOperationCategory.RangeFunctions:\n // If adding a range function and range function is already added replace it\n if (existingRangeVectorFunction) {\n const index = operations.indexOf(existingRangeVectorFunction);\n operations[index] = newOperation;\n break;\n }\n\n // Add range functions after any formats, line filters and label filters\n default:\n const placeToInsert = getIndexOfOrLast(\n operations,\n modeller,\n (x) => (def.orderRank ?? 100) < (x.orderRank ?? 100)\n );\n operations.splice(placeToInsert, 0, newOperation);\n break;\n }\n\n return {\n ...query,\n operations,\n };\n}\n\nexport function addNestedQueryHandler(def: QueryBuilderOperationDefinition, query: LokiVisualQuery): LokiVisualQuery {\n return {\n ...query,\n binaryQueries: [\n ...(query.binaryQueries ?? []),\n {\n operator: '/',\n query,\n },\n ],\n };\n}\n\nexport function getLineFilterRenderer(operation: string, caseInsensitive?: boolean) {\n return function lineFilterRenderer(\n model: QueryBuilderOperation,\n def: QueryBuilderOperationDefinition,\n innerExpr: string\n ) {\n const hasBackticks = model.params.some((param) => typeof param === 'string' && param.includes('`'));\n const delimiter = hasBackticks ? '\"' : '`';\n let params;\n if (hasBackticks) {\n params = model.params.map((param) =>\n typeof param === 'string' ? escapeLabelValueInExactSelector(param) : param\n );\n } else {\n params = model.params;\n }\n if (caseInsensitive) {\n return `${innerExpr} ${operation} ${delimiter}(?i)${params.join(`${delimiter} or ${delimiter}(?i)`)}${delimiter}`;\n }\n return `${innerExpr} ${operation} ${delimiter}${params.join(`${delimiter} or ${delimiter}`)}${delimiter}`;\n };\n}\n\nfunction getRangeVectorParamDef(): QueryBuilderOperationParamDef {\n return {\n name: 'Range',\n type: 'string',\n options: ['$__auto'],\n description:\n 'Use the default value \"$__auto\". Change the \"step\" value in the query options to change the bucket size.',\n };\n}\n\nexport function getOperationParamId(operationId: string, paramIndex: number) {\n return `operations.${operationId}.param.${paramIndex}`;\n}\n\nexport function getOnLabelAddedHandler(changeToOperationId: string) {\n return function onParamChanged(index: number, op: QueryBuilderOperation, def: QueryBuilderOperationDefinition) {\n // Check if we actually have the label param. As it's optional the aggregation can have one less, which is the\n // case of just simple aggregation without label. When user adds the label it now has the same number of params\n // as its definition, and now we can change it to its `_by` variant.\n if (op.params.length === def.params.length) {\n return {\n ...op,\n id: changeToOperationId,\n };\n }\n return op;\n };\n}\n\n/**\n * Very simple poc implementation, needs to be modified to support all aggregation operators\n */\nexport function getAggregationExplainer(aggregationName: string, mode: 'by' | 'without' | '') {\n return function aggregationExplainer(model: QueryBuilderOperation) {\n const labels = model.params.map((label) => `\\`${label}\\``).join(' and ');\n const labelWord = pluralize('label', model.params.length);\n\n switch (mode) {\n case 'by':\n return `Calculates ${aggregationName} over dimensions while preserving ${labelWord} ${labels}.`;\n case 'without':\n return `Calculates ${aggregationName} over the dimensions ${labels}. All other labels are preserved.`;\n default:\n return `Calculates ${aggregationName} over the dimensions.`;\n }\n };\n}\n\n/**\n * This function will transform operations without labels to their plan aggregation operation\n */\nexport function getLastLabelRemovedHandler(changeToOperationId: string) {\n return function onParamChanged(index: number, op: QueryBuilderOperation, def: QueryBuilderOperationDefinition) {\n // If definition has more params then is defined there are no optional rest params anymore.\n // We then transform this operation into a different one\n if (op.params.length < def.params.length) {\n return {\n ...op,\n id: changeToOperationId,\n };\n }\n\n return op;\n };\n}\n\nexport function getLokiOperationDisplayName(funcName: string) {\n return capitalize(funcName.replace(/_/g, ' '));\n}\n\nexport function defaultAddOperationHandler<T extends VisualQuery>(def: QueryBuilderOperationDefinition, query: T) {\n const newOperation: QueryBuilderOperation = {\n id: def.id,\n params: def.defaultParams,\n };\n\n return {\n ...query,\n operations: [...query.operations, newOperation],\n };\n}\n\nexport function createAggregationOperation(\n name: string,\n overrides: Partial<QueryBuilderOperationDefinition> = {}\n): QueryBuilderOperationDefinition[] {\n const operations: QueryBuilderOperationDefinition[] = [\n {\n id: name,\n name: getLokiOperationDisplayName(name),\n params: [\n {\n name: 'By label',\n type: 'string',\n restParam: true,\n optional: true,\n },\n ],\n defaultParams: [],\n toggleable: true,\n alternativesKey: 'plain aggregations',\n category: LokiVisualQueryOperationCategory.Aggregations,\n renderer: functionRendererLeft,\n paramChangedHandler: getOnLabelAddedHandler(`__${name}_by`),\n explainHandler: getAggregationExplainer(name, ''),\n addOperationHandler: defaultAddOperationHandler,\n ...overrides,\n },\n {\n id: `__${name}_by`,\n name: `${getLokiOperationDisplayName(name)} by`,\n params: [\n {\n name: 'Label',\n type: 'string',\n restParam: true,\n optional: true,\n editor: LabelParamEditor,\n },\n ],\n defaultParams: [''],\n alternativesKey: 'aggregations by',\n category: LokiVisualQueryOperationCategory.Aggregations,\n renderer: getAggregationByRenderer(name),\n paramChangedHandler: getLastLabelRemovedHandler(name),\n explainHandler: getAggregationExplainer(name, 'by'),\n addOperationHandler: defaultAddOperationHandler,\n hideFromList: true,\n ...overrides,\n },\n {\n id: `__${name}_without`,\n name: `${getLokiOperationDisplayName(name)} without`,\n params: [\n {\n name: 'Label',\n type: 'string',\n restParam: true,\n optional: true,\n editor: LabelParamEditor,\n },\n ],\n defaultParams: [''],\n alternativesKey: 'aggregations by',\n category: LokiVisualQueryOperationCategory.Aggregations,\n renderer: getAggregationWithoutRenderer(name),\n paramChangedHandler: getLastLabelRemovedHandler(name),\n explainHandler: getAggregationExplainer(name, 'without'),\n addOperationHandler: defaultAddOperationHandler,\n hideFromList: true,\n ...overrides,\n },\n ];\n\n return operations;\n}\n\nfunction getAggregationWithoutRenderer(aggregation: string) {\n return function aggregationRenderer(\n model: QueryBuilderOperation,\n def: QueryBuilderOperationDefinition,\n innerExpr: string\n ) {\n return `${aggregation} without(${model.params.join(', ')}) (${innerExpr})`;\n };\n}\n\nexport function functionRendererLeft(\n model: QueryBuilderOperation,\n def: QueryBuilderOperationDefinition,\n innerExpr: string\n) {\n const params = renderParams(model, def, innerExpr);\n const str = model.id + '(';\n\n if (innerExpr) {\n params.push(innerExpr);\n }\n\n return str + params.join(', ') + ')';\n}\n\nfunction renderParams(model: QueryBuilderOperation, def: QueryBuilderOperationDefinition, innerExpr: string) {\n return (model.params ?? []).map((value, index) => {\n const paramDef = def.params[index];\n if (paramDef.type === 'string') {\n return '\"' + value + '\"';\n }\n\n return value;\n });\n}\n\nfunction getAggregationByRenderer(aggregation: string) {\n return function aggregationRenderer(\n model: QueryBuilderOperation,\n def: QueryBuilderOperationDefinition,\n innerExpr: string\n ) {\n return `${aggregation} by(${model.params.join(', ')}) (${innerExpr})`;\n };\n}\n\nexport function createAggregationOperationWithParam(\n name: string,\n paramsDef: { params: QueryBuilderOperationParamDef[]; defaultParams: QueryBuilderOperationParamValue[] },\n overrides: Partial<QueryBuilderOperationDefinition> = {}\n): QueryBuilderOperationDefinition[] {\n const operations = createAggregationOperation(name, overrides);\n operations[0].params.unshift(...paramsDef.params);\n operations[1].params.unshift(...paramsDef.params);\n operations[2].params.unshift(...paramsDef.params);\n operations[0].defaultParams = paramsDef.defaultParams;\n operations[1].defaultParams = [...paramsDef.defaultParams, ''];\n operations[2].defaultParams = [...paramsDef.defaultParams, ''];\n operations[1].renderer = getAggregationByRendererWithParameter(name);\n operations[2].renderer = getAggregationByRendererWithParameter(name);\n return operations;\n}\n\nfunction getAggregationByRendererWithParameter(aggregation: string) {\n return function aggregationRenderer(\n model: QueryBuilderOperation,\n def: QueryBuilderOperationDefinition,\n innerExpr: string\n ) {\n const restParamIndex = def.params.findIndex((param) => param.restParam);\n const params = model.params.slice(0, restParamIndex);\n const restParams = model.params.slice(restParamIndex);\n\n return `${aggregation} by(${restParams.join(', ')}) (${params\n .map((param, idx) => (def.params[idx].type === 'string' ? `\\\"${param}\\\"` : param))\n .join(', ')}, ${innerExpr})`;\n };\n}\n","import { css } from '@emotion/css';\nimport * as React from 'react';\nimport { useCallback } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { t } from '@grafana/i18n';\nimport { reportInteraction } from '@grafana/runtime';\nimport { Checkbox, Icon, useStyles2 } from '@grafana/ui';\n\nimport { getNormalizedFieldName } from '../panel/processing';\n\nimport { FieldWithStats } from './FieldSelector';\n\ninterface Props {\n active?: boolean;\n field: FieldWithStats;\n toggle(key: string): void;\n draggable?: boolean;\n showCount?: boolean;\n}\n\nexport function Field({\n active = false,\n draggable = false,\n field,\n toggle,\n showCount = false,\n}: Props): React.JSX.Element | undefined {\n const styles = useStyles2(getStyles);\n\n const handleChange = useCallback(() => {\n reportInteraction('logs_field_selector_toggle_fields_clicked', {\n active,\n });\n toggle(field.name);\n }, [active, field.name, toggle]);\n\n return (\n <>\n <div className={styles.contentWrap}>\n <Checkbox\n className={styles.checkboxLabel}\n label={getNormalizedFieldName(field.name)}\n onChange={handleChange}\n checked={active}\n />\n {showCount && (\n <button className={styles.labelCount} onClick={handleChange}>\n {field.stats.percentOfLinesWithLabel}%\n </button>\n )}\n </div>\n {draggable && (\n <Icon\n aria-label={t('logs.field-selector.aria-label-drag-and-drop-icon', 'Drag and drop icon')}\n title={t('logs.field-selector.title-drag-and-drop-to-reorder', 'Drag and drop to reorder')}\n name=\"draggabledots\"\n size=\"lg\"\n className={styles.dragIcon}\n />\n )}\n </>\n );\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n dragIcon: css({\n cursor: 'drag',\n marginLeft: theme.spacing(1),\n opacity: 0.4,\n }),\n labelCount: css({\n marginLeft: theme.spacing(0.5),\n marginRight: theme.spacing(0.5),\n appearance: 'none',\n background: 'none',\n border: 'none',\n fontSize: theme.typography.pxToRem(11),\n opacity: 0.6,\n }),\n contentWrap: css({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'space-between',\n width: '100%',\n }),\n // Hide text that overflows, had to select elements within the Checkbox component, so this is a bit fragile\n checkboxLabel: css({\n '> span': {\n overflow: 'hidden',\n textOverflow: 'ellipsis',\n whiteSpace: 'nowrap',\n display: 'block',\n maxWidth: '100%',\n },\n }),\n };\n}\n","import { css, cx } from '@emotion/css';\nimport { DragDropContext, Draggable, DraggableProvided, Droppable, DropResult } from '@hello-pangea/dnd';\nimport { useCallback, useMemo } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { t, Trans } from '@grafana/i18n';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { Field } from './Field';\nimport { FieldWithStats } from './FieldSelector';\n\ninterface Props {\n activeFields: string[];\n clear(): void;\n fields: FieldWithStats[];\n reorder: (columns: string[]) => void;\n suggestedFields: FieldWithStats[];\n toggle: (key: string) => void;\n}\n\nexport const ActiveFields = ({ activeFields, clear, fields, reorder, suggestedFields, toggle }: Props) => {\n const styles = useStyles2(getLogsFieldsStyles);\n\n const onDragEnd = useCallback(\n (result: DropResult) => {\n if (!result.destination) {\n return;\n }\n const newActiveFields = [...activeFields];\n const element = activeFields[result.source.index];\n\n newActiveFields.splice(result.source.index, 1);\n newActiveFields.splice(result.destination.index, 0, element);\n\n reorder(newActiveFields);\n },\n [activeFields, reorder]\n );\n\n const active = useMemo(\n () => [\n ...activeFields\n .map(\n (name) => fields.find((field) => field.name === name) ?? suggestedFields.find((field) => field.name === name)\n )\n .filter((field) => field !== undefined),\n ],\n [activeFields, fields, suggestedFields]\n );\n\n const suggested = useMemo(\n () => suggestedFields.filter((suggestedField) => !activeFields.includes(suggestedField.name)),\n [activeFields, suggestedFields]\n );\n\n if (active.length || suggested.length) {\n return (\n <>\n <div className={styles.columnHeader}>\n <Trans i18nKey=\"explore.logs-table-multi-select.selected-fields\">Selected fields</Trans>\n <button onClick={clear} className={styles.columnHeaderButton}>\n <Trans i18nKey=\"explore.logs-table-multi-select.reset\">Reset</Trans>\n </button>\n </div>\n <DragDropContext onDragEnd={onDragEnd}>\n <Droppable droppableId=\"order-fields\" direction=\"vertical\">\n {(provided) => (\n <div className={styles.columnWrapper} {...provided.droppableProps} ref={provided.innerRef}>\n {active.map((field, index) => (\n <Draggable\n draggableId={field.name}\n key={field.name}\n index={index}\n isDragDisabled={!activeFields.includes(field.name)}\n >\n {(provided: DraggableProvided, snapshot) => (\n <div\n className={cx(styles.wrap, snapshot.isDragging ? styles.dragging : undefined)}\n ref={provided.innerRef}\n {...provided.draggableProps}\n {...provided.dragHandleProps}\n title={t(\n 'logs.field-selector.label-title',\n `{{fieldName}} appears in {{percentage}}% of log lines`,\n { fieldName: field.name, percentage: field.stats.percentOfLinesWithLabel }\n )}\n >\n <Field\n active={activeFields.includes(field.name)}\n field={field}\n toggle={toggle}\n draggable={activeFields.includes(field.name)}\n />\n </div>\n )}\n </Draggable>\n ))}\n {provided.placeholder}\n </div>\n )}\n </Droppable>\n </DragDropContext>\n {suggested.length > 0 && (\n <>\n <div className={styles.columnSubHeader}>\n <Trans i18nKey=\"explore.logs-table-multi-select.suggested-fields\">Suggested</Trans>\n </div>\n <div className={styles.columnWrapper}>\n {suggested.map((field) => (\n <div className={styles.wrap} key={field.name}>\n <Field field={field} toggle={toggle} />\n </div>\n ))}\n </div>\n </>\n )}\n </>\n );\n }\n\n return null;\n};\n\nexport function getLogsFieldsStyles(theme: GrafanaTheme2) {\n return {\n wrap: css({\n marginTop: theme.spacing(1),\n marginBottom: theme.spacing(1),\n display: 'flex',\n background: theme.colors.background.primary,\n }),\n dragging: css({\n background: theme.colors.background.secondary,\n }),\n columnHeader: css({\n display: 'flex',\n justifyContent: 'space-between',\n fontSize: theme.typography.h6.fontSize,\n background: theme.colors.background.secondary,\n position: 'sticky',\n top: 0,\n left: 0,\n paddingTop: theme.spacing(0.75),\n paddingRight: theme.spacing(0.75),\n paddingBottom: theme.spacing(0.75),\n paddingLeft: theme.spacing(1.5),\n zIndex: 3,\n marginBottom: theme.spacing(2),\n }),\n columnSubHeader: css({\n padding: theme.spacing(0, 0, 0.75, 0.5),\n color: theme.colors.text.secondary,\n }),\n columnHeaderButton: css({\n appearance: 'none',\n background: 'none',\n border: 'none',\n fontSize: theme.typography.pxToRem(11),\n }),\n columnWrapper: css({\n marginBottom: theme.spacing(1.5),\n // need some space or the outline of the checkbox is cut off\n paddingLeft: theme.spacing(0.5),\n }),\n };\n}\n","import { css } from '@emotion/css';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Trans } from '@grafana/i18n';\nimport { useStyles2 } from '@grafana/ui';\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n empty: css({\n marginBottom: theme.spacing(2),\n marginLeft: theme.spacing(1.75),\n fontSize: theme.typography.fontSize,\n }),\n };\n}\n\nexport function EmptyFields() {\n const styles = useStyles2(getStyles);\n return (\n <div className={styles.empty}>\n <Trans i18nKey=\"explore.logs-table-empty-fields.no-fields\">No fields</Trans>\n </div>\n );\n}\n","import { useMemo } from 'react';\n\nimport { t } from '@grafana/i18n';\nimport { useStyles2 } from '@grafana/ui';\n\nimport { getLogsFieldsStyles } from './ActiveFields';\nimport { EmptyFields } from './EmptyFields';\nimport { Field } from './Field';\nimport { FieldWithStats } from './FieldSelector';\n\ninterface Props {\n activeFields: string[];\n fields: FieldWithStats[];\n toggle: (key: string) => void;\n reorder: (columns: string[]) => void;\n}\n\nexport const AvailableFields = ({ activeFields, fields, toggle, reorder }: Props): JSX.Element => {\n const styles = useStyles2(getLogsFieldsStyles);\n\n const availableFields = useMemo(\n () => fields.filter((field) => !activeFields.includes(field.name)).sort(sortFields),\n [activeFields, fields]\n );\n\n if (availableFields.length) {\n return (\n <div className={styles.columnWrapper}>\n {availableFields.map((field) => (\n <div\n key={field.name}\n className={styles.wrap}\n title={t('logs.field-selector.label-title', `{{fieldName}} appears in {{percentage}}% of log lines`, {\n fieldName: field.name,\n percentage: field.stats.percentOfLinesWithLabel,\n })}\n >\n <Field field={field} toggle={toggle} showCount />\n </div>\n ))}\n </div>\n );\n }\n\n return <EmptyFields />;\n};\n\nconst collator = new Intl.Collator(undefined, { sensitivity: 'base' });\n\nfunction sortFields(a: FieldWithStats, b: FieldWithStats) {\n return collator.compare(a.name, b.name);\n}\n","import { css } from '@emotion/css';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Trans } from '@grafana/i18n';\nimport { useTheme2 } from '@grafana/ui';\n\nimport { ActiveFields } from './ActiveFields';\nimport { AvailableFields } from './AvailableFields';\nimport { FieldWithStats } from './FieldSelector';\n\ninterface Props {\n activeFields: string[];\n clear: () => void;\n fields: FieldWithStats[];\n reorder: (columns: string[]) => void;\n suggestedFields: FieldWithStats[];\n toggle: (columnName: string) => void;\n}\n\nexport const FieldList = ({ activeFields, clear, fields, reorder, suggestedFields, toggle }: Props) => {\n const theme = useTheme2();\n const styles = getStyles(theme);\n\n return (\n <div className={styles.sidebarWrap}>\n {/* Sidebar columns */}\n <>\n <ActiveFields\n activeFields={activeFields}\n clear={clear}\n fields={fields}\n reorder={reorder}\n suggestedFields={suggestedFields}\n toggle={toggle}\n />\n\n <div className={styles.columnHeader}>\n <Trans i18nKey=\"explore.logs-table-multi-select.fields\">Fields</Trans>\n </div>\n <AvailableFields activeFields={activeFields} fields={fields} reorder={reorder} toggle={toggle} />\n </>\n </div>\n );\n};\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n sidebarWrap: css({\n overflowY: 'scroll',\n flex: 1,\n scrollbarWidth: 'thin',\n }),\n columnHeader: css({\n display: 'flex',\n justifyContent: 'space-between',\n fontSize: theme.typography.h6.fontSize,\n background: theme.colors.background.secondary,\n position: 'sticky',\n top: 0,\n left: 0,\n paddingTop: theme.spacing(0.75),\n paddingRight: theme.spacing(0.75),\n paddingBottom: theme.spacing(0.75),\n paddingLeft: theme.spacing(1.5),\n zIndex: 3,\n marginBottom: theme.spacing(2),\n }),\n };\n}\n","import { css } from '@emotion/css';\nimport * as React from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { t } from '@grafana/i18n';\nimport { Field, IconButton, Input, useStyles2 } from '@grafana/ui';\n\ninterface Props {\n collapse(): void;\n onChange(e?: React.FormEvent<HTMLInputElement>): void;\n value: string;\n}\n\nexport function FieldSearch({ collapse, onChange, value }: Props) {\n const styles = useStyles2(getStyles);\n return (\n <>\n <IconButton\n className={styles.iconExpanded}\n onClick={collapse}\n name=\"arrow-from-right\"\n tooltip={t('logs.field-selector.collapse', 'Collapse sidebar')}\n size=\"sm\"\n />\n <Field noMargin className={styles.searchWrap}>\n <Input\n value={value}\n type=\"text\"\n placeholder={t('logs.field-selector.placeholder-search-fields-by-name', 'Search fields by name')}\n onChange={onChange}\n suffix={\n value ? (\n <IconButton\n name=\"times\"\n aria-label={t('logs.field-selector.clear-button', 'Clear')}\n onClick={() => onChange()}\n />\n ) : undefined\n }\n />\n </Field>\n </>\n );\n}\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n iconExpanded: css({\n position: 'absolute',\n right: theme.spacing(0.2),\n top: theme.spacing(1),\n svg: {\n transform: 'rotate(-180deg)',\n },\n }),\n searchWrap: css({\n padding: `${theme.spacing(0.4)} 0 ${theme.spacing(0.4)} ${theme.spacing(0.4)}`,\n marginBottom: theme.spacing(2),\n }),\n };\n}\n","import { css } from '@emotion/css';\nimport { Resizable, ResizeCallback } from 're-resizable';\nimport { startTransition, useCallback, useLayoutEffect, useMemo, useState } from 'react';\n\nimport { DataFrame, fuzzySearch, GrafanaTheme2, store } from '@grafana/data';\nimport { t } from '@grafana/i18n';\nimport { config, reportInteraction } from '@grafana/runtime';\nimport { getDragStyles, IconButton, useStyles2 } from '@grafana/ui';\nimport { FieldNameMetaStore } from 'app/features/explore/Logs/LogsTableWrap';\nimport { SETTING_KEY_ROOT } from 'app/features/explore/Logs/utils/logs';\nimport { parseLogsFrame } from 'app/features/logs/logsFrame';\n\nimport { LOG_LINE_BODY_FIELD_NAME } from '../LogDetailsBody';\nimport { getSuggestedFieldsForLogs } from '../otel/formats';\nimport { useLogListContext } from '../panel/LogListContext';\nimport { reportInteractionOnce } from '../panel/analytics';\nimport { LogListModel } from '../panel/processing';\n\nimport { FieldList } from './FieldList';\nimport { FieldSearch } from './FieldSearch';\n\n/**\n * FieldSelector wrapper for the LogList visualization.\n */\ninterface LogListFieldSelectorProps {\n containerElement: HTMLDivElement;\n logs: LogListModel[];\n dataFrames: DataFrame[];\n}\n\nconst DEFAULT_WIDTH = 220;\nexport const MIN_WIDTH = 20;\n\nexport const LogListFieldSelector = ({ containerElement, dataFrames, logs }: LogListFieldSelectorProps) => {\n const { displayedFields, onClickShowField, onClickHideField, setDisplayedFields, logOptionsStorageKey } =\n useLogListContext();\n const [sidebarHeight, setSidebarHeight] = useState(220);\n const [sidebarWidth, setSidebarWidth] = useState(getSidebarWidth(logOptionsStorageKey));\n const dragStyles = useStyles2(getDragStyles);\n\n useLayoutEffect(() => {\n const observer = new ResizeObserver((entries: ResizeObserverEntry[]) => {\n if (entries.length) {\n setSidebarHeight(entries[0].contentRect.height);\n }\n });\n observer.observe(containerElement);\n return () => observer.disconnect();\n }, [containerElement]);\n\n const setSidebarWidthWrapper = useCallback(\n (width: number) => {\n setSidebarWidth(width);\n if (logOptionsStorageKey) {\n store.set(`${logOptionsStorageKey}.fieldSelector.width`, width);\n }\n },\n [logOptionsStorageKey]\n );\n\n const clearFields = useCallback(() => {\n setDisplayedFields?.([]);\n reportInteraction('logs_field_selector_clear_fields_clicked', {\n fields: displayedFields.length,\n mode: 'logs',\n });\n }, [displayedFields.length, setDisplayedFields]);\n\n const collapse = useCallback(() => {\n setSidebarWidthWrapper(MIN_WIDTH);\n reportInteraction('logs_field_selector_collapse_clicked', {\n mode: 'logs',\n });\n }, [setSidebarWidthWrapper]);\n\n const expand = useCallback(() => {\n const width = getSidebarWidth(logOptionsStorageKey);\n setSidebarWidthWrapper(width < 2 * MIN_WIDTH ? DEFAULT_WIDTH : width);\n reportInteraction('logs_field_selector_expand_clicked', {\n mode: 'logs',\n });\n }, [logOptionsStorageKey, setSidebarWidthWrapper]);\n\n const handleResize: ResizeCallback = useCallback(\n (event, direction, ref) => {\n setSidebarWidthWrapper(ref.clientWidth);\n reportInteractionOnce('logs_field_selector_resized', {\n mode: 'logs',\n });\n },\n [setSidebarWidthWrapper]\n );\n\n const toggleField = useCallback(\n (name: string) => {\n if (displayedFields.includes(name)) {\n onClickHideField?.(name);\n } else {\n onClickShowField?.(name);\n }\n },\n [displayedFields, onClickHideField, onClickShowField]\n );\n\n const suggestedFields = useMemo(() => getSuggestedFields(logs, displayedFields), [displayedFields, logs]);\n const fields = useMemo(() => getFieldsWithStats(dataFrames), [dataFrames]);\n\n if (!onClickShowField || !onClickHideField || !setDisplayedFields) {\n console.warn(\n 'LogListFieldSelector: Missing required props: onClickShowField, onClickHideField, setDisplayedFields'\n );\n return null;\n }\n if (sidebarHeight === 0) {\n return null;\n }\n\n return (\n <Resizable\n enable={{\n right: true,\n }}\n handleClasses={{ right: dragStyles.dragHandleVertical }}\n size={{ width: sidebarWidth, height: sidebarHeight }}\n defaultSize={{ width: sidebarWidth, height: sidebarHeight }}\n minWidth={MIN_WIDTH}\n maxWidth={containerElement.clientWidth * 0.8}\n onResize={handleResize}\n >\n {sidebarWidth > MIN_WIDTH * 2 ? (\n <FieldSelector\n activeFields={displayedFields}\n clear={clearFields}\n collapse={collapse}\n fields={fields}\n reorder={setDisplayedFields}\n suggestedFields={suggestedFields}\n toggle={toggleField}\n />\n ) : (\n <div className={logsFieldSelectorWrapperStyles.collapsedButtonContainer}>\n <IconButton\n className={logsFieldSelectorWrapperStyles.collapsedButton}\n onClick={expand}\n name=\"arrow-from-right\"\n tooltip={t('logs.field-selector.expand', 'Expand sidebar')}\n size=\"sm\"\n />\n </div>\n )}\n </Resizable>\n );\n};\n\nconst logsFieldSelectorWrapperStyles = {\n collapsedButtonContainer: css({\n display: 'flex',\n flexDirection: 'column',\n justifyContent: 'flex-start',\n alignItems: 'center',\n paddingTop: 2,\n }),\n collapsedButton: css({\n margin: 0,\n }),\n};\n\n/**\n * FieldSelector wrapper for the LogsTable visualization.\n */\ninterface LogsTableFieldSelectorProps {\n columnsWithMeta: FieldNameMetaStore;\n clear(): void;\n dataFrames: DataFrame[];\n logs: LogListModel[];\n reorder(columns: string[]): void;\n setSidebarWidth(width: number): void;\n sidebarWidth: number;\n toggle(key: string): void;\n}\n\nexport const LogsTableFieldSelector = ({\n columnsWithMeta,\n clear: clearProp,\n dataFrames,\n logs,\n reorder,\n setSidebarWidth,\n sidebarWidth,\n toggle,\n}: LogsTableFieldSelectorProps) => {\n const setSidebarWidthWrapper = useCallback(\n (width: number) => {\n setSidebarWidth(width);\n store.set(`${SETTING_KEY_ROOT}.fieldSelector.width`, width);\n },\n [setSidebarWidth]\n );\n\n const collapse = useCallback(() => {\n setSidebarWidthWrapper(MIN_WIDTH);\n reportInteraction('logs_field_selector_collapse_clicked', {\n mode: 'table',\n });\n }, [setSidebarWidthWrapper]);\n\n const expand = useCallback(() => {\n const width = getSidebarWidth(SETTING_KEY_ROOT);\n setSidebarWidthWrapper(width < 2 * MIN_WIDTH ? DEFAULT_WIDTH : width);\n reportInteraction('logs_field_selector_expand_clicked', {\n mode: 'table',\n });\n }, [setSidebarWidthWrapper]);\n\n const displayedColumns = useMemo(\n () =>\n Object.keys(columnsWithMeta)\n .filter((column) => columnsWithMeta[column].active)\n .sort((a, b) =>\n columnsWithMeta[a].index !== undefined && columnsWithMeta[b].index !== undefined\n ? columnsWithMeta[a].index - columnsWithMeta[b].index\n : 0\n ),\n [columnsWithMeta]\n );\n\n const clear = useCallback(() => {\n clearProp();\n reportInteraction('logs_field_selector_clear_fields_clicked', {\n fields: displayedColumns.length,\n mode: 'table',\n });\n }, [clearProp, displayedColumns.length]);\n\n const defaultColumns = useMemo(\n () =>\n Object.keys(columnsWithMeta)\n .sort((a, b) =>\n columnsWithMeta[a].index !== undefined && columnsWithMeta[b].index !== undefined\n ? columnsWithMeta[a].index - columnsWithMeta[b].index\n : 0\n )\n .filter(\n (column) => columnsWithMeta[column].type === 'TIME_FIELD' || columnsWithMeta[column].type === 'BODY_FIELD'\n ),\n [columnsWithMeta]\n );\n\n const suggestedFields = useMemo(\n () => getSuggestedFields(logs, displayedColumns, defaultColumns),\n [defaultColumns, displayedColumns, logs]\n );\n const fields = useMemo(() => getFieldsWithStats(dataFrames), [dataFrames]);\n\n return sidebarWidth > MIN_WIDTH * 2 ? (\n <FieldSelector\n activeFields={displayedColumns}\n clear={clear}\n collapse={collapse}\n fields={fields}\n reorder={reorder}\n suggestedFields={suggestedFields}\n toggle={toggle}\n />\n ) : (\n <div className={logsFieldSelectorWrapperStyles.collapsedButtonContainer}>\n <IconButton\n className={logsFieldSelectorWrapperStyles.collapsedButton}\n onClick={expand}\n name=\"arrow-from-right\"\n tooltip={t('logs.field-selector.expand', 'Expand sidebar')}\n size=\"sm\"\n />\n </div>\n );\n};\n\ninterface FieldStats {\n percentOfLinesWithLabel: number;\n}\n\nexport interface FieldWithStats {\n name: string;\n stats: FieldStats;\n}\n\nexport interface FieldSelectorProps {\n activeFields: string[];\n clear(): void;\n collapse(): void;\n fields: FieldWithStats[];\n reorder(fields: string[]): void;\n suggestedFields: FieldWithStats[];\n toggle: (key: string) => void;\n}\n\nexport const FieldSelector = ({\n activeFields,\n clear,\n collapse,\n fields,\n reorder,\n suggestedFields,\n toggle,\n}: FieldSelectorProps) => {\n const [searchValue, setSearchValue] = useState<string>('');\n const styles = useStyles2(getStyles);\n\n const onSearchInputChange = useCallback((e?: React.FormEvent<HTMLInputElement>) => {\n if (e === undefined) {\n setSearchValue('');\n return;\n }\n startTransition(() => {\n setSearchValue(e.currentTarget.value);\n });\n reportInteractionOnce('logs_field_selector_text_search');\n }, []);\n\n const filteredFields = useMemo(() => {\n if (!searchValue) {\n return fields;\n }\n const idxs = fuzzySearch(\n fields.map((field) => field.name),\n searchValue\n );\n return fields.filter((_, index) => idxs.includes(index));\n }, [fields, searchValue]);\n\n const filteredSuggestedFields = useMemo(() => {\n if (!searchValue) {\n return suggestedFields;\n }\n const idxs = fuzzySearch(\n suggestedFields.map((field) => field.name),\n searchValue\n );\n return suggestedFields.filter((_, index) => idxs.includes(index));\n }, [searchValue, suggestedFields]);\n\n return (\n <section className={styles.sidebar}>\n <FieldSearch collapse={collapse} onChange={onSearchInputChange} value={searchValue} />\n <FieldList\n activeFields={activeFields}\n clear={clear}\n fields={filteredFields}\n reorder={reorder}\n suggestedFields={filteredSuggestedFields}\n toggle={toggle}\n />\n </section>\n );\n};\n\nfunction getStyles(theme: GrafanaTheme2) {\n return {\n sidebar: css({\n fontSize: theme.typography.pxToRem(11),\n paddingRight: theme.spacing(3),\n height: '100%',\n display: 'flex',\n flexDirection: 'column',\n position: 'relative',\n }),\n };\n}\n\nfunction getFieldsWithStats(dataFrames: DataFrame[]): FieldWithStats[] {\n const cardinality = new Map<string, number>();\n let totalLines = 0;\n const allFields = dataFrames.flatMap((dataFrame) => {\n const logsFrame = parseLogsFrame(dataFrame);\n totalLines += dataFrame.length;\n\n const labelValues = logsFrame?.getLogFrameLabelsAsLabels();\n const labels =\n labelValues?.flatMap((labels) => {\n const keys = Object.keys(labels);\n keys.forEach((key) => cardinality.set(key, (cardinality.get(key) ?? 0) + 1));\n return keys;\n }) ?? [];\n\n const fields = (logsFrame?.extraFields ?? [])\n .filter((field) => !field?.config?.custom?.hidden)\n .map((field) => {\n cardinality.set(field.name, field.values.filter((value) => value !== null && value !== undefined).length);\n return field.name;\n });\n\n return [...labels, ...fields];\n });\n\n const labels = [...new Set(allFields)];\n\n return labels.map((label) => ({\n name: label,\n stats: {\n percentOfLinesWithLabel: Math.ceil((100 * (cardinality.get(label) ?? 0)) / totalLines),\n },\n }));\n}\n\nfunction getSuggestedFields(logs: LogListModel[], displayedFields: string[], defaultFields: string[] = []) {\n const suggestedFields: FieldWithStats[] = defaultFields.map((field) => ({\n name: field,\n stats: {\n percentOfLinesWithLabel: 100,\n },\n }));\n if (config.featureToggles.otelLogsFormatting) {\n getSuggestedFieldsForLogs(logs).forEach((field) => {\n suggestedFields.push({\n name: field,\n stats: {\n percentOfLinesWithLabel: 100,\n },\n });\n });\n }\n\n if (\n !defaultFields.length &&\n displayedFields.length &&\n !suggestedFields.find((field) => field.name === LOG_LINE_BODY_FIELD_NAME)\n ) {\n suggestedFields.push({\n name: LOG_LINE_BODY_FIELD_NAME,\n stats: {\n percentOfLinesWithLabel: 100,\n },\n });\n }\n\n return suggestedFields;\n}\n\nexport function getSidebarWidth(logOptionsStorageKey?: string): number {\n const width =\n (logOptionsStorageKey\n ? parseInt(store.get(`${logOptionsStorageKey}.fieldSelector.width`) ?? DEFAULT_WIDTH, 10)\n : undefined) ?? DEFAULT_WIDTH;\n\n return width < MIN_WIDTH ? MIN_WIDTH : width;\n}\n\nexport function getSidebarState(logOptionsStorageKey?: string): boolean | undefined {\n if (!logOptionsStorageKey) {\n return undefined;\n }\n const width = parseInt(store.get(`${logOptionsStorageKey}.fieldSelector.width`) ?? DEFAULT_WIDTH, 10);\n return width <= MIN_WIDTH * 2 ? false : true;\n}\n","import {\n VisualQueryBinary,\n QueryBuilderLabelFilter,\n QueryBuilderOperation,\n BINARY_OPERATIONS_KEY,\n} from '@grafana/plugin-ui';\n\n/**\n * Visual query model\n */\nexport interface LokiVisualQuery {\n labels: QueryBuilderLabelFilter[];\n operations: QueryBuilderOperation[];\n binaryQueries?: LokiVisualQueryBinary[];\n}\n\nexport type LokiVisualQueryBinary = VisualQueryBinary<LokiVisualQuery>;\nexport enum LokiQueryPatternType {\n Log = 'log',\n Metric = 'metric',\n}\n\nexport interface LokiQueryPattern {\n name: string;\n operations: QueryBuilderOperation[];\n type: LokiQueryPatternType;\n}\n\nexport enum LokiVisualQueryOperationCategory {\n Aggregations = 'Aggregations',\n RangeFunctions = 'Range functions',\n Functions = 'Functions',\n Formats = 'Formats',\n LineFilters = 'Line filters',\n LabelFilters = 'Label filters',\n BinaryOps = `${BINARY_OPERATIONS_KEY}`,\n}\n\nexport enum LokiOperationId {\n Json = 'json',\n Logfmt = 'logfmt',\n Regexp = 'regexp',\n Pattern = 'pattern',\n Unpack = 'unpack',\n LineFormat = 'line_format',\n LabelFormat = 'label_format',\n Decolorize = 'decolorize',\n Drop = 'drop',\n Keep = 'keep',\n Rate = 'rate',\n RateCounter = 'rate_counter',\n CountOverTime = 'count_over_time',\n SumOverTime = 'sum_over_time',\n AvgOverTime = 'avg_over_time',\n MaxOverTime = 'max_over_time',\n MinOverTime = 'min_over_time',\n FirstOverTime = 'first_over_time',\n LastOverTime = 'last_over_time',\n StdvarOverTime = 'stdvar_over_time',\n StddevOverTime = 'stddev_over_time',\n QuantileOverTime = 'quantile_over_time',\n BytesRate = 'bytes_rate',\n BytesOverTime = 'bytes_over_time',\n AbsentOverTime = 'absent_over_time',\n Sum = 'sum',\n Avg = 'avg',\n Min = 'min',\n Max = 'max',\n Stddev = 'stddev',\n Stdvar = 'stdvar',\n Count = 'count',\n TopK = 'topk',\n BottomK = 'bottomk',\n LineContains = '__line_contains',\n LineContainsNot = '__line_contains_not',\n LineContainsCaseInsensitive = '__line_contains_case_insensitive',\n LineContainsNotCaseInsensitive = '__line_contains_not_case_insensitive',\n LineMatchesRegex = '__line_matches_regex',\n LineMatchesRegexNot = '__line_matches_regex_not',\n LineFilterIpMatches = '__line_filter_ip_matches',\n LabelFilter = '__label_filter',\n LabelFilterNoErrors = '__label_filter_no_errors',\n LabelFilterIpMatches = '__label_filter_ip_marches',\n Unwrap = 'unwrap',\n SumBy = '__sum_by',\n SumWithout = '__sum_without',\n // Binary ops\n Addition = '__addition',\n Subtraction = '__subtraction',\n MultiplyBy = '__multiply_by',\n DivideBy = '__divide_by',\n Modulo = '__modulo',\n Exponent = '__exponent',\n NestedQuery = '__nested_query',\n EqualTo = '__equal_to',\n NotEqualTo = '__not_equal_to',\n GreaterThan = '__greater_than',\n LessThan = '__less_than',\n GreaterOrEqual = '__greater_or_equal',\n LessOrEqual = '__less_or_equal',\n}\n\nexport enum LokiOperationOrder {\n LineFilters = 1,\n Parsers = 2,\n PipeOperations = 3,\n // Unwrap is a special case, as it is usually the last operation, so the order is after pipeOperations\n Unwrap = 4,\n NoErrors = 5,\n RangeVectorFunction = 5,\n Last = 6,\n}\n\nexport const lokiOperators = {\n equals: { label: '=', value: '=', description: 'Equals', isMultiValue: false },\n doesNotEqual: { label: '!=', value: '!=', description: 'Does not equal', isMultiValue: false },\n matchesRegex: { label: '=~', value: '=~', description: 'Matches regex', isMultiValue: true },\n doesNotMatchRegex: { label: '!~', value: '!~', description: 'Does not match regex', isMultiValue: true },\n greaterThan: { label: '>', value: '>', description: 'Greater than', isMultiValue: false },\n greaterThanOrEqual: { label: '>=', value: '>=', description: 'Greater than or equal to', isMultiValue: false },\n lessThan: { label: '<', value: '<', description: 'Less than', isMultiValue: false },\n lessThanOrEqual: { label: '<=', value: '<=', description: 'Less than or equal to', isMultiValue: false },\n contains: { label: '|=', value: '|=', description: 'Contains', isMultiValue: false },\n doesNotContain: { label: '!=', value: '!=', description: 'Does not contain', isMultiValue: false },\n};\n","import { css } from '@emotion/css';\nimport { partition } from 'lodash';\nimport { memo, useCallback, useEffect, useMemo, useRef, useState } from 'react';\n\nimport {\n AbsoluteTimeRange,\n CoreApp,\n DataQueryResponse,\n DataSourceApi,\n DataSourceWithLogsContextSupport,\n dateTime,\n EventBusSrv,\n formattedValueToString,\n getValueFormat,\n GrafanaTheme2,\n hasLogsContextSupport,\n LoadingState,\n LogRowContextOptions,\n LogRowContextQueryDirection,\n LogRowModel,\n LogsDedupStrategy,\n LogsSortOrder,\n store,\n TimeRange,\n} from '@grafana/data';\nimport { t, Trans } from '@grafana/i18n';\nimport { config, getDataSourceSrv, reportInteraction } from '@grafana/runtime';\nimport { DataQuery, TimeZone } from '@grafana/schema';\nimport { Button, Collapse, Combobox, ComboboxOption, InlineLabel, Modal, Stack, useTheme2 } from '@grafana/ui';\nimport { splitOpen } from 'app/features/explore/state/main';\nimport { useDispatch } from 'app/types/store';\n\nimport { dataFrameToLogsModel } from '../../logsModel';\nimport { sortLogRows } from '../../utils';\nimport { ScrollDirection } from '../InfiniteScroll';\nimport { LoadingIndicator } from '../LoadingIndicator';\n\nimport { LogLineDetailsLog } from './LogLineDetailsLog';\nimport { LogLineMenuCustomItem } from './LogLineMenu';\nimport { LogList } from './LogList';\nimport { LogListModel } from './processing';\nimport { ScrollToLogsEvent } from './virtualization';\n\ninterface LogLineContextProps {\n log: LogRowModel | LogListModel;\n logOptionsStorageKey?: string;\n open: boolean;\n timeZone: TimeZone;\n onClose: () => void;\n getRowContext: (row: LogRowModel, options: LogRowContextOptions) => Promise<DataQueryResponse>;\n getRowContextQuery?: (\n row: LogRowModel,\n options?: LogRowContextOptions,\n cacheFilters?: boolean\n ) => Promise<DataQuery | null>;\n sortOrder?: LogsSortOrder;\n runContextQuery?: () => void;\n getLogRowContextUi?: DataSourceWithLogsContextSupport['getLogRowContextUi'];\n displayedFields?: string[];\n logLineMenuCustomItems?: LogLineMenuCustomItem[];\n onPermalinkClick?: (row: LogRowModel) => Promise<void>;\n onClickShowField?: (key: string) => void;\n onClickHideField?: (key: string) => void;\n}\n\nexport const PAGE_SIZE = 100;\nexport const DEFAULT_TIME_WINDOW = 7200000;\n\nexport const LogLineContext = memo(\n ({\n log,\n logOptionsStorageKey,\n open,\n sortOrder = logOptionsStorageKey\n ? (store.get(`${logOptionsStorageKey}.sortOrder`) ?? LogsSortOrder.Descending)\n : LogsSortOrder.Descending,\n timeZone,\n getLogRowContextUi,\n getRowContextQuery,\n onClose,\n getRowContext,\n displayedFields = [],\n logLineMenuCustomItems,\n onPermalinkClick,\n onClickShowField,\n onClickHideField,\n }: LogLineContextProps) => {\n const containerRef = useRef<HTMLDivElement | null>(null);\n const [contextQuery, setContextQuery] = useState<DataQuery | null>(null);\n const [aboveLogs, setAboveLogs] = useState<LogRowModel[]>([]);\n const [belowLogs, setBelowLogs] = useState<LogRowModel[]>([]);\n const [initialized, setInitialized] = useState(false);\n const allLogs = useMemo(() => [...aboveLogs, log, ...belowLogs], [log, belowLogs, aboveLogs]);\n const [aboveState, setAboveState] = useState(LoadingState.NotStarted);\n const [belowState, setBelowState] = useState(LoadingState.NotStarted);\n const [showLog, setShowLog] = useState(false);\n const [datasourceInstance, setDatasourceInstance] = useState<\n (DataSourceApi & DataSourceWithLogsContextSupport) | null\n >(null);\n const defaultTimeWindow = logOptionsStorageKey\n ? (store.get(`${logOptionsStorageKey}.contextTimeWindow`) ?? DEFAULT_TIME_WINDOW.toString())\n : DEFAULT_TIME_WINDOW.toString();\n const [timeWindow, setTimeWindow] = useState(parseInt(defaultTimeWindow, 10));\n\n const eventBusRef = useRef(new EventBusSrv());\n\n const dispatch = useDispatch();\n const theme = useTheme2();\n const styles = getStyles(theme);\n\n const timeRange = useMemo(() => {\n const fromMs =\n sortOrder === LogsSortOrder.Ascending ? allLogs[0].timeEpochMs : allLogs[allLogs.length - 1].timeEpochMs;\n let toMs =\n sortOrder === LogsSortOrder.Ascending ? allLogs[allLogs.length - 1].timeEpochMs : allLogs[0].timeEpochMs;\n // Add one millisecond to get a range when from and to are equal.\n if (fromMs === toMs) {\n toMs += 1;\n }\n const from = dateTime(fromMs);\n const to = dateTime(toMs);\n\n const range: TimeRange = {\n from,\n to,\n raw: {\n from,\n to,\n },\n };\n return range;\n }, [allLogs, sortOrder]);\n\n const updateContextQuery = useCallback(async () => {\n const contextQuery = getRowContextQuery ? await getRowContextQuery(log) : null;\n setContextQuery(contextQuery);\n }, [log, getRowContextQuery]);\n\n useEffect(() => {\n if (open) {\n updateContextQuery();\n reportInteraction('logs_log_line_context_open', {\n datasourceType: log.datasourceType,\n uid: log.uid,\n });\n }\n }, [updateContextQuery, open, log]);\n\n const getContextLogs = useCallback(\n async (place: 'above' | 'below', refLog: LogRowModel, timeWindowMs?: number): Promise<LogRowModel[]> => {\n const result = await getRowContext(normalizeLogRefId(refLog), {\n limit: PAGE_SIZE,\n direction: getLoadMoreDirection(place, sortOrder),\n // Only on the initial request\n timeWindowMs,\n });\n\n const newLogs = dataFrameToLogsModel(result.data).rows;\n if (sortOrder === LogsSortOrder.Ascending) {\n newLogs.reverse();\n }\n return newLogs.filter((r) => !containsRow(allLogs, r));\n },\n [allLogs, getRowContext, sortOrder]\n );\n\n const loadMore = useCallback(\n async (place: 'above' | 'below', refLog: LogRowModel, timeWindow?: number) => {\n const setState = place === 'above' ? setAboveState : setBelowState;\n setState(LoadingState.Loading);\n\n try {\n const newLogs = (await getContextLogs(place, refLog, timeWindow)).map((r) =>\n // apply the original row's searchWords to all the rows for highlighting\n !r.searchWords || !r.searchWords?.length ? { ...r, searchWords: log.searchWords } : r\n );\n const [older, newer] = partition(newLogs, (newRow) => newRow.timeEpochNs > log.timeEpochNs);\n const newAbove = sortOrder === LogsSortOrder.Ascending ? newer : older;\n const newBelow = sortOrder === LogsSortOrder.Ascending ? older : newer;\n\n setAboveLogs((aboveLogs: LogRowModel[]) => {\n return newAbove.length > 0 ? sortLogRows([...newAbove, ...aboveLogs], sortOrder) : aboveLogs;\n });\n setBelowLogs((belowLogs: LogRowModel[]) => {\n return newBelow.length > 0 ? sortLogRows([...belowLogs, ...newBelow], sortOrder) : belowLogs;\n });\n\n setState(LoadingState.NotStarted);\n if (!newAbove.length && place === 'above') {\n setAboveState(LoadingState.Done);\n }\n if (!newBelow.length && place === 'below') {\n setBelowState(LoadingState.Done);\n }\n } catch {\n setState(LoadingState.Error);\n }\n },\n [getContextLogs, log, sortOrder]\n );\n\n useEffect(() => {\n if (!open) {\n return;\n }\n if (!initialized) {\n Promise.all([loadMore('above', log, timeWindow), loadMore('below', log, timeWindow)]);\n setInitialized(true);\n }\n }, [initialized, loadMore, log, open, timeWindow]);\n\n const handleLoadMore = useCallback(\n (_: AbsoluteTimeRange, direction: ScrollDirection) => {\n if (direction === ScrollDirection.Bottom) {\n loadMore('below', allLogs[allLogs.length - 1]);\n } else {\n loadMore('above', allLogs[0]);\n }\n },\n [allLogs, loadMore]\n );\n\n const onScrollCenterClick = useCallback(() => {\n eventBusRef.current.publish(\n new ScrollToLogsEvent({\n scrollTo: log.uid,\n })\n );\n }, [log.uid]);\n\n const onSplitViewClick = useCallback(() => {\n if (!contextQuery) {\n return;\n }\n let rowId = log.uid;\n if (log.dataFrame.refId) {\n // the orignal row has the refid from the base query and not the refid from the context query, so we need to replace it.\n rowId = log.uid.replace(log.dataFrame.refId, contextQuery.refId);\n }\n\n dispatch(\n splitOpen({\n queries: [contextQuery],\n range: timeRange,\n datasourceUid: contextQuery.datasource!.uid!,\n panelsState: {\n logs: {\n id: rowId,\n },\n },\n })\n );\n onClose();\n reportInteraction('logs_log_line_context_open_in_split_clicked', {\n datasourceType: log.datasourceType,\n });\n }, [contextQuery, dispatch, log.dataFrame.refId, log.datasourceType, log.uid, onClose, timeRange]);\n\n const handleTimeWindowChange = useCallback(\n (option: ComboboxOption<string>) => {\n if (logOptionsStorageKey) {\n store.set(`${logOptionsStorageKey}.contextTimeWindow`, option.value);\n }\n setTimeWindow(parseInt(option.value, 10));\n setAboveLogs([]);\n setBelowLogs([]);\n setInitialized(false);\n reportInteraction('logs_log_line_context_time_window_change', {\n window_size: option.value,\n });\n },\n [logOptionsStorageKey]\n );\n\n const handleClose = useCallback(() => {\n reportInteraction('logs_log_line_context_closed', {\n datasourceType: log.datasourceType,\n uid: log.uid,\n });\n onClose();\n }, [log.datasourceType, log.uid, onClose]);\n\n const updateResults = useCallback(async () => {\n setAboveLogs([]);\n setBelowLogs([]);\n await updateContextQuery();\n setInitialized(false);\n }, [updateContextQuery]);\n\n const wrapLogMessage = logOptionsStorageKey ? store.getBool(`${logOptionsStorageKey}.wrapLogMessage`, true) : true;\n const syntaxHighlighting = logOptionsStorageKey\n ? store.getBool(`${logOptionsStorageKey}.syntaxHighlighting`, true)\n : true;\n\n // @todo: Remove when the LogRows are deprecated\n const logListModel = useMemo(\n () =>\n log instanceof LogListModel\n ? log\n : new LogListModel(log, {\n escape: false,\n timeZone,\n wrapLogMessage,\n }),\n [log, timeZone, wrapLogMessage]\n );\n\n useEffect(() => {\n if (log.datasourceUid) {\n getDataSourceSrv()\n .get({ uid: log.datasourceUid })\n .then((ds) => {\n if (hasLogsContextSupport(ds)) {\n setDatasourceInstance(ds);\n }\n });\n }\n }, [log.datasourceUid]);\n\n return (\n <Modal\n isOpen={open}\n title={t('logs.log-line-context.title-log-context', 'Log context')}\n contentClassName={styles.flexColumn}\n className={styles.modal}\n onDismiss={handleClose}\n >\n {config.featureToggles.logsContextDatasourceUi && getLogRowContextUi && (\n <div>{getLogRowContextUi(log, updateResults)}</div>\n )}\n <Collapse\n isOpen={showLog}\n onToggle={() => setShowLog(!showLog)}\n className={styles.referenceLogLine}\n label={t('logs.log-line-context.title-log-line', 'Referenced log line')}\n >\n <LogLineDetailsLog log={logListModel} syntaxHighlighting={syntaxHighlighting} />\n </Collapse>\n <div className={styles.controls}>\n {datasourceInstance?.supportsAdjustableWindow && (\n <Stack>\n <InlineLabel\n htmlFor=\"time-window-control\"\n tooltip={t(\n 'logs.log-line-context.time-window-tooltip',\n 'Amount of time before and after the referenced log'\n )}\n width=\"auto\"\n >\n {t('logs.log-line-context.time-window-label', 'Context time window')}\n </InlineLabel>\n <Combobox\n id=\"time-window-control\"\n options={getTimeWindowOptions()}\n onChange={handleTimeWindowChange}\n value={timeWindow.toString()}\n minWidth={5}\n width=\"auto\"\n />\n </Stack>\n )}\n <Button variant=\"secondary\" onClick={onScrollCenterClick}>\n <Trans i18nKey=\"logs.log-line-context.center-matched-line\">Center matched line</Trans>\n </Button>\n {contextQuery?.datasource?.uid && (\n <Button variant=\"secondary\" onClick={onSplitViewClick}>\n <Trans i18nKey=\"logs.log-line-context.open-in-split-view\">Open in split view</Trans>\n </Button>\n )}\n </div>\n <div className={styles.loadingIndicator}>\n {aboveState === LoadingState.Loading && (\n <LoadingIndicator\n adjective={\n sortOrder === LogsSortOrder.Descending\n ? t('logs.log-line-context.newer-logs', 'newer')\n : t('logs.log-line-context.older-logs', 'older')\n }\n />\n )}\n {aboveState === LoadingState.Done && (\n <Trans i18nKey=\"logs.log-line-context.no-more-logs-available\">No more logs available.</Trans>\n )}\n </div>\n <div className={styles.wrapper}>\n <div className={styles.logsContainer} ref={containerRef}>\n {containerRef.current && (\n <LogList\n app={CoreApp.Unknown}\n containerElement={containerRef.current}\n dataFrames={[]}\n dedupStrategy={LogsDedupStrategy.none}\n detailsMode=\"inline\"\n displayedFields={displayedFields}\n enableLogDetails={true}\n eventBus={eventBusRef.current}\n infiniteScrollMode=\"unlimited\"\n loadMore={handleLoadMore}\n logLineMenuCustomItems={logLineMenuCustomItems}\n logOptionsStorageKey={logOptionsStorageKey}\n logs={allLogs}\n loading={aboveState === LoadingState.Loading || belowState === LoadingState.Loading}\n permalinkedLogId={log.uid}\n onPermalinkClick={onPermalinkClick}\n onClickHideField={onClickHideField}\n onClickShowField={onClickShowField}\n showControls\n showFieldSelector={false}\n showTime={logOptionsStorageKey ? store.getBool(`${logOptionsStorageKey}.showTime`, true) : true}\n sortOrder={sortOrder}\n syntaxHighlighting={syntaxHighlighting}\n timeRange={timeRange}\n timeZone={timeZone}\n wrapLogMessage={wrapLogMessage}\n />\n )}\n </div>\n </div>\n <div className={styles.loadingIndicator}>\n {belowState === LoadingState.Loading && (\n <LoadingIndicator\n adjective={\n sortOrder === LogsSortOrder.Descending\n ? t('logs.log-line-context.older-logs', 'older')\n : t('logs.log-line-context.newer-logs', 'newer')\n }\n />\n )}\n {belowState === LoadingState.Done && (\n <Trans i18nKey=\"logs.log-line-context.no-more-logs-available\">No more logs available.</Trans>\n )}\n </div>\n </Modal>\n );\n }\n);\nLogLineContext.displayName = 'LogLineContext';\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n modal: css({\n width: '85vw',\n height: '80vh',\n [theme.breakpoints.down('md')]: {\n width: '100%',\n height: '100vh',\n },\n }),\n loadingIndicator: css({\n height: theme.spacing(3),\n minHeight: theme.spacing(3),\n textAlign: 'center',\n }),\n referenceLogLine: css({\n flex: 0,\n }),\n wrapper: css({\n border: `1px solid ${theme.colors.border.weak}`,\n padding: theme.spacing(0, 1, 1, 0),\n flex: '1 1 auto',\n minHeight: 0,\n }),\n logsContainer: css({\n height: '100%',\n overflow: 'hidden',\n }),\n flexColumn: css({\n display: 'flex',\n flexDirection: 'column',\n padding: theme.spacing(0, 3, 3, 3),\n height: '100%',\n gap: theme.spacing(0.5),\n }),\n link: css({\n color: theme.colors.text.secondary,\n fontSize: theme.typography.bodySmall.fontSize,\n ':hover': {\n color: theme.colors.text.link,\n },\n }),\n logPreview: css({\n overflow: 'hidden',\n textAlign: 'left',\n textOverflow: 'ellipsis',\n width: '75vw',\n whiteSpace: 'nowrap',\n }),\n controls: css({\n display: 'flex',\n justifyContent: 'flex-end',\n gap: theme.spacing(2),\n }),\n };\n};\n\nconst getLoadMoreDirection = (place: 'above' | 'below', sortOrder: LogsSortOrder): LogRowContextQueryDirection => {\n if (place === 'above' && sortOrder === LogsSortOrder.Descending) {\n return LogRowContextQueryDirection.Forward;\n }\n if (place === 'below' && sortOrder === LogsSortOrder.Ascending) {\n return LogRowContextQueryDirection.Forward;\n }\n\n return LogRowContextQueryDirection.Backward;\n};\n\nconst normalizeLogRefId = (log: LogRowModel): LogRowModel => {\n // the datasoure plugins often create the context-query based on the row's dataframe's refId,\n // by appending something to it. for example:\n // - let's say the row's dataframe's refId is \"query\"\n // - the datasource plugin will take \"query\" and append \"-context\" to it, so it becomes \"query-context\".\n // - later we want to load even more lines, so we make a context query\n // - the datasource plugin does the same transform again, but now the source is \"query-context\",\n // so the new refId becomes \"query-context-context\"\n // - next time it becomes \"query-context-context-context\", and so on.\n // we do not want refIds to grow unbounded.\n // to avoid this, we set the refId to a value that does not grow.\n // on the other hand, the refId is also used in generating the row's UID, so it is useful\n // when the refId is not always the exact same string, otherwise UID duplication can occur,\n // which may cause problems.\n // so we go with an approach where the refId always changes, but does not grow.\n return {\n ...log,\n dataFrame: {\n ...log.dataFrame,\n refId: `context_${log.uid ?? log.dataFrame.refId ?? log.timeEpochMs}`,\n },\n };\n};\n\nconst containsRow = (rows: LogRowModel[], row: LogRowModel) => {\n return rows.some((r) => r.entry === row.entry && r.timeEpochNs === row.timeEpochNs);\n};\n\nfunction getTimeWindowOptions() {\n const intervals = [100, 500, 1000, 5000, 30000, 60000, 300000, 1800000, 3600000, DEFAULT_TIME_WINDOW];\n return intervals.map((interval) => ({\n label: formattedValueToString(getValueFormat('ms')(interval)),\n value: interval.toString(),\n }));\n}\n","import { SyntaxNode, TreeCursor } from '@lezer/common';\n\nimport { QueryBuilderOperation, QueryBuilderOperationParamValue } from '@grafana/plugin-ui';\n\n// Although 0 isn't explicitly provided in the @grafana/lezer-logql library as the error node ID, it does appear to be the ID of error nodes within lezer.\nexport const ErrorId = 0;\n\nexport function getLeftMostChild(cur: SyntaxNode): SyntaxNode {\n return cur.firstChild ? getLeftMostChild(cur.firstChild) : cur;\n}\n\nexport function makeError(expr: string, node: SyntaxNode) {\n return {\n text: getString(expr, node),\n // TODO: this are positions in the string with the replaced variables. Means it cannot be used to show exact\n // placement of the error for the user. We need some translation table to positions before the variable\n // replace.\n from: node.from,\n to: node.to,\n parentType: node.parent?.name,\n };\n}\n\n// Taken from template_srv, but copied so to not mess with the regex.index which is manipulated in the service\n/*\n * This regex matches 3 types of variable reference with an optional format specifier\n * \\$(\\w+) $var1\n * \\[\\[([\\s\\S]+?)(?::(\\w+))?\\]\\] [[var2]] or [[var2:fmt2]]\n * \\${(\\w+)(?::(\\w+))?} ${var3} or ${var3:fmt3}\n */\nexport const variableRegex = /\\$(\\w+)|\\[\\[([\\s\\S]+?)(?::(\\w+))?\\]\\]|\\${(\\w+)(?:\\.([^:^\\}]+))?(?::([^\\}]+))?}/g;\n\n/**\n * As variables with $ are creating parsing errors, we first replace them with magic string that is parsable and at\n * the same time we can get the variable and its format back from it.\n * @param expr\n */\nexport function replaceVariables(expr: string) {\n return expr.replace(variableRegex, (match, var1, var2, fmt2, var3, fieldPath, fmt3) => {\n const fmt = fmt2 || fmt3;\n let variable = var1;\n let varType = '0';\n\n if (var2) {\n variable = var2;\n varType = '1';\n }\n\n if (var3) {\n variable = var3;\n varType = '2';\n }\n\n return `__V_${varType}__` + variable + '__V__' + (fmt ? '__F__' + fmt + '__F__' : '');\n });\n}\n\nconst varTypeFunc = [\n (v: string, f?: string) => `\\$${v}`,\n (v: string, f?: string) => `[[${v}${f ? `:${f}` : ''}]]`,\n (v: string, f?: string) => `\\$\\{${v}${f ? `:${f}` : ''}\\}`,\n];\n\n/**\n * Get back the text with variables in their original format.\n * @param expr\n */\nexport function returnVariables(expr: string) {\n return expr.replace(/__V_(\\d)__(.+?)__V__(?:__F__(\\w+)__F__)?/g, (match, type, v, f) => {\n return varTypeFunc[parseInt(type, 10)](v, f);\n });\n}\n\n/**\n * Get the actual string of the expression. That is not stored in the tree so we have to get the indexes from the node\n * and then based on that get it from the expression.\n * @param expr\n * @param node\n */\nexport function getString(expr: string, node: SyntaxNode | TreeCursor | null | undefined) {\n if (!node) {\n return '';\n }\n return returnVariables(expr.substring(node.from, node.to));\n}\n\n/**\n * Create simple scalar binary op object.\n * @param opDef - definition of the op to be created\n * @param expr\n * @param numberNode - the node for the scalar\n * @param hasBool - whether operation has a bool modifier. Is used only for ops for which it makes sense.\n */\nexport function makeBinOp(\n opDef: { id: string; comparison?: boolean },\n expr: string,\n numberNode: SyntaxNode,\n hasBool: boolean\n): QueryBuilderOperation {\n const params: QueryBuilderOperationParamValue[] = [parseFloat(getString(expr, numberNode))];\n if (opDef.comparison) {\n params.push(hasBool);\n }\n return {\n id: opDef.id,\n params,\n };\n}\n\n/**\n * Get all nodes with type in the tree. This traverses the tree so it is safe only when you know there shouldn't be\n * too much nesting but you just want to skip some of the wrappers. For example getting function args this way would\n * not be safe is it would also find arguments of nested functions.\n * @param expr\n * @param cur\n * @param type - can be string or number, some data-sources (loki) haven't migrated over to using numeric constants defined in the lezer parsing library (e.g. lezer-promql).\n * @todo Remove string type definition when all data-sources have migrated to numeric constants\n */\nexport function getAllByType(expr: string, cur: SyntaxNode, type: number | string): string[] {\n if (cur.type.id === type || cur.name === type) {\n return [getString(expr, cur)];\n }\n const values: string[] = [];\n let pos = 0;\n let child = cur.childAfter(pos);\n while (child) {\n values.push(...getAllByType(expr, child, type));\n pos = child.to;\n child = cur.childAfter(pos);\n }\n return values;\n}\n\n/**\n * There aren't any spaces in the metric names, so let's introduce a wildcard into the regex for each space to better facilitate a fuzzy search\n */\nexport const regexifyLabelValuesQueryString = (query: string) => {\n const queryArray = query.split(' ');\n return queryArray.map((query) => `${query}.*`).join('');\n};\n","import { MouseEvent, useCallback, useMemo, useRef } from 'react';\n\nimport { LogRowContextOptions, LogRowModel } from '@grafana/data';\nimport { t } from '@grafana/i18n';\nimport { DataQuery } from '@grafana/schema';\nimport { Dropdown, IconButton, Menu } from '@grafana/ui';\n\nimport { copyText, handleOpenLogsContextClick } from '../../utils';\n\nimport { LogLineStyles } from './LogLine';\nimport { useLogIsPinned, useLogListContext } from './LogListContext';\nimport { LogListModel } from './processing';\n\nexport type GetRowContextQueryFn = (\n row: LogRowModel,\n options?: LogRowContextOptions,\n cacheFilters?: boolean\n) => Promise<DataQuery | null>;\n\ntype MenuItem = {\n label: string;\n onClick(log: LogListModel): void;\n};\n\ntype MenuItemDivider = {\n divider: true;\n};\n\nexport type LogLineMenuCustomItem = MenuItem | MenuItemDivider;\n\ninterface Props {\n log: LogListModel;\n styles: LogLineStyles;\n}\n\nexport const LogLineMenu = ({ log, styles }: Props) => {\n const {\n enableLogDetails,\n detailsDisplayed,\n getRowContextQuery,\n onOpenContext,\n onPermalinkClick,\n onPinLine,\n onUnpinLine,\n logLineMenuCustomItems = [],\n logSupportsContext,\n toggleDetails,\n isAssistantAvailable,\n openAssistantByLog,\n } = useLogListContext();\n const pinned = useLogIsPinned(log);\n const menuRef = useRef(null);\n\n const copyLogLine = useCallback(() => {\n copyText(log.entry, menuRef);\n }, [log.entry]);\n\n const copyLinkToLogLine = useCallback(() => {\n onPermalinkClick?.(log);\n }, [log, onPermalinkClick]);\n\n const shouldlogSupportsContext = useMemo(\n () => (logSupportsContext ? logSupportsContext(log) : false),\n [log, logSupportsContext]\n );\n\n const showContext = useCallback(\n async (event: MouseEvent<HTMLElement>) => {\n handleOpenLogsContextClick(event, log, getRowContextQuery, (log: LogRowModel) => onOpenContext?.(log, () => {}));\n },\n [onOpenContext, getRowContextQuery, log]\n );\n\n const toggleLogDetails = useCallback(() => {\n toggleDetails(log);\n }, [log, toggleDetails]);\n\n const togglePinning = useCallback(() => {\n if (pinned) {\n onUnpinLine?.(log);\n } else {\n onPinLine?.(log);\n }\n }, [log, onPinLine, onUnpinLine, pinned]);\n\n const showFirstDivider = enableLogDetails || shouldlogSupportsContext || onPinLine || onUnpinLine;\n\n const menu = useCallback(\n () => (\n <Menu ref={menuRef}>\n {enableLogDetails && (\n <Menu.Item\n onClick={toggleLogDetails}\n label={\n detailsDisplayed(log)\n ? t('logs.log-line-menu.show-details', 'Hide log details')\n : t('logs.log-line-menu.hide-details', 'Show log details')\n }\n />\n )}\n {shouldlogSupportsContext && (\n <Menu.Item onClick={showContext} label={t('logs.log-line-menu.show-context', 'Show context')} />\n )}\n {!pinned && onPinLine && (\n <Menu.Item onClick={togglePinning} label={t('logs.log-line-menu.pin-to-outline', 'Pin log')} />\n )}\n {pinned && onUnpinLine && (\n <Menu.Item onClick={togglePinning} label={t('logs.log-line-menu.unpin-from-outline', 'Unpin log')} />\n )}\n {showFirstDivider && <Menu.Divider />}\n <Menu.Item onClick={copyLogLine} label={t('logs.log-line-menu.copy-log', 'Copy log line')} />\n {onPermalinkClick && log.rowId !== undefined && log.uid && (\n <Menu.Item onClick={copyLinkToLogLine} label={t('logs.log-line-menu.copy-link', 'Copy link to log line')} />\n )}\n {logLineMenuCustomItems.map((item, i) => {\n if (isDivider(item)) {\n return <Menu.Divider key={i} />;\n }\n if (isItem(item)) {\n return <Menu.Item onClick={() => item.onClick(log)} label={item.label} key={i} />;\n }\n return null;\n })}\n {isAssistantAvailable && (\n <>\n <Menu.Divider />\n <Menu.Item\n onClick={() => openAssistantByLog?.(log)}\n icon=\"ai-sparkle\"\n label={t('logs.log-line-menu.open-assistant', 'Explain log line in Assistant')}\n />\n </>\n )}\n </Menu>\n ),\n [\n copyLinkToLogLine,\n copyLogLine,\n detailsDisplayed,\n enableLogDetails,\n isAssistantAvailable,\n log,\n logLineMenuCustomItems,\n onPermalinkClick,\n onPinLine,\n onUnpinLine,\n openAssistantByLog,\n pinned,\n shouldlogSupportsContext,\n showContext,\n showFirstDivider,\n toggleLogDetails,\n togglePinning,\n ]\n );\n\n return (\n <Dropdown overlay={menu} placement=\"bottom-start\">\n <IconButton\n className={styles.menuIcon}\n name=\"ellipsis-v\"\n aria-label={t('logs.log-line-menu.icon-label', 'Log menu')}\n role=\"button\"\n />\n </Dropdown>\n );\n};\n\nfunction isDivider(item: LogLineMenuCustomItem) {\n return 'divider' in item && item.divider;\n}\n\nfunction isItem(item: LogLineMenuCustomItem) {\n return 'onClick' in item && 'label' in item;\n}\n","import { css } from '@emotion/css';\nimport {\n CSSProperties,\n memo,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n MouseEvent,\n useLayoutEffect,\n} from 'react';\nimport Highlighter from 'react-highlight-words';\nimport tinycolor from 'tinycolor2';\n\nimport { findHighlightChunksInText, GrafanaTheme2, LogsDedupStrategy, TimeRange } from '@grafana/data';\nimport { t } from '@grafana/i18n';\nimport { Button, Icon, Tooltip } from '@grafana/ui';\n\nimport { LOG_LINE_BODY_FIELD_NAME } from '../LogDetailsBody';\nimport { LogLabels } from '../LogLabels';\nimport { LogMessageAnsi } from '../LogMessageAnsi';\nimport { OTEL_LOG_LINE_ATTRIBUTES_FIELD_NAME } from '../otel/formats';\n\nimport { HighlightedLogRenderer } from './HighlightedLogRenderer';\nimport { InlineLogLineDetails } from './LogLineDetails';\nimport { LogLineMenu } from './LogLineMenu';\nimport { useLogIsPermalinked, useLogIsPinned, useLogListContext } from './LogListContext';\nimport { useLogListSearchContext } from './LogListSearchContext';\nimport { getNormalizedFieldName, LogListModel } from './processing';\nimport {\n FIELD_GAP_MULTIPLIER,\n getLogLineDOMHeight,\n LogFieldDimension,\n LogLineVirtualization,\n DEFAULT_LINE_HEIGHT,\n} from './virtualization';\n\nexport interface Props {\n displayedFields: string[];\n index: number;\n log: LogListModel;\n logs: LogListModel[];\n showTime: boolean;\n style: CSSProperties;\n styles: LogLineStyles;\n timeRange: TimeRange;\n timeZone: string;\n onClick: (e: MouseEvent<HTMLElement>, log: LogListModel) => void;\n onOverflow?: (index: number, id: string, height?: number) => void;\n variant?: 'infinite-scroll';\n virtualization?: LogLineVirtualization;\n wrapLogMessage: boolean;\n}\n\nexport const LogLine = ({\n displayedFields,\n index,\n log,\n logs,\n style,\n styles,\n onClick,\n onOverflow,\n showTime,\n timeRange,\n timeZone,\n variant,\n virtualization,\n wrapLogMessage,\n}: Props) => {\n return (\n <div style={wrapLogMessage ? style : { ...style, width: 'max-content', minWidth: '100%' }}>\n <LogLineComponent\n displayedFields={displayedFields}\n height={style.height}\n index={index}\n log={log}\n logs={logs}\n styles={styles}\n onClick={onClick}\n onOverflow={onOverflow}\n showTime={showTime}\n timeRange={timeRange}\n timeZone={timeZone}\n variant={variant}\n virtualization={virtualization}\n wrapLogMessage={wrapLogMessage}\n />\n </div>\n );\n};\n\ninterface LogLineComponentProps extends Omit<Props, 'style'> {\n height?: number | string;\n}\n\nconst LogLineComponent = memo(\n ({\n displayedFields,\n height,\n index,\n log,\n logs,\n styles,\n onClick,\n onOverflow,\n showTime,\n timeRange,\n timeZone,\n variant,\n virtualization,\n wrapLogMessage,\n }: LogLineComponentProps) => {\n const {\n detailsDisplayed,\n detailsMode,\n dedupStrategy,\n enableLogDetails,\n fontSize,\n hasLogsWithErrors,\n hasSampledLogs,\n showUniqueLabels,\n timestampResolution,\n onLogLineHover,\n } = useLogListContext();\n const [collapsed, setCollapsed] = useState<boolean | undefined>(\n wrapLogMessage && log.collapsed !== undefined ? log.collapsed : undefined\n );\n const logLineRef = useRef<HTMLDivElement | null>(null);\n const pinned = useLogIsPinned(log);\n const permalinked = useLogIsPermalinked(log);\n\n const handleLogLineResize = useCallback(() => {\n if (!onOverflow || !logLineRef.current || !virtualization || !height) {\n return;\n }\n const calculatedHeight = typeof height === 'number' ? height : undefined;\n const actualHeight = getLogLineDOMHeight(virtualization, logLineRef.current, calculatedHeight, log.collapsed);\n if (actualHeight) {\n onOverflow(index, log.uid, actualHeight);\n }\n }, [height, index, log.collapsed, log.uid, onOverflow, virtualization]);\n\n useLayoutEffect(() => {\n handleLogLineResize();\n }, [handleLogLineResize, detailsMode]);\n\n useLayoutEffect(() => {\n if (!logLineRef.current) {\n return;\n }\n let frameId: number;\n const handleResize = () => {\n if (frameId) {\n cancelAnimationFrame(frameId);\n }\n frameId = requestAnimationFrame(() => handleLogLineResize());\n };\n const observer = new ResizeObserver(handleResize);\n observer.observe(logLineRef.current);\n return () => {\n observer.disconnect();\n if (frameId) {\n cancelAnimationFrame(frameId);\n }\n };\n }, [handleLogLineResize]);\n\n useEffect(() => {\n if (!wrapLogMessage) {\n setCollapsed(undefined);\n } else if (collapsed === undefined && log.collapsed !== undefined) {\n setCollapsed(log.collapsed);\n } else if (collapsed !== undefined && log.collapsed === undefined) {\n setCollapsed(log.collapsed);\n }\n }, [collapsed, log.collapsed, wrapLogMessage]);\n\n const handleMouseOver = useCallback(() => onLogLineHover?.(log), [log, onLogLineHover]);\n\n const handleExpandCollapse = useCallback(() => {\n const newState = !collapsed;\n log.setCollapsedState(newState);\n setCollapsed(newState);\n onOverflow?.(index, log.uid);\n }, [collapsed, index, log, onOverflow]);\n\n const handleClick = useCallback(\n (e: MouseEvent<HTMLElement>) => {\n if (isLogLineClick(e.target)) {\n onClick(e, log);\n }\n },\n [log, onClick]\n );\n\n const detailsShown = detailsDisplayed(log);\n\n return (\n <>\n {/* A button element could be used but in Safari it prevents text selection. Fallback available for a11y in LogLineMenu */}\n {/* eslint-disable-next-line jsx-a11y/no-static-element-interactions, jsx-a11y/click-events-have-key-events */}\n <div\n className={`${styles.logLine} ${variant ?? ''} ${pinned ? styles.pinnedLogLine : ''} ${permalinked ? styles.permalinkedLogLine : ''} ${detailsShown ? styles.detailsDisplayed : ''} ${fontSize === 'small' ? styles.fontSizeSmall : ''} ${enableLogDetails ? styles.clickable : ''}`}\n ref={onOverflow ? logLineRef : undefined}\n onMouseEnter={handleMouseOver}\n onFocus={handleMouseOver}\n onClick={handleClick}\n >\n <LogLineMenu styles={styles} log={log} />\n {dedupStrategy !== LogsDedupStrategy.none && (\n <div className={`${styles.duplicates}`}>\n {log.duplicates && log.duplicates > 0 ? `${log.duplicates + 1}x` : null}\n </div>\n )}\n {hasLogsWithErrors && (\n <div className={`${styles.hasError}`}>\n {log.hasError && (\n <Tooltip\n content={t('logs.log-line.tooltip-error', 'Error: {{errorMessage}}', {\n errorMessage: log.errorMessage,\n })}\n placement=\"right\"\n theme=\"error\"\n >\n <Icon\n className={styles.logIconError}\n name=\"exclamation-triangle\"\n aria-label={t('logs.log-line.has-error', 'Has errors')}\n size=\"xs\"\n />\n </Tooltip>\n )}\n </div>\n )}\n {hasSampledLogs && (\n <div className={`${styles.isSampled}`}>\n {log.isSampled && (\n <Tooltip content={log.sampledMessage ?? ''} placement=\"right\" theme=\"info\">\n <Icon\n className={styles.logIconInfo}\n name=\"info-circle\"\n size=\"xs\"\n aria-label={t('logs.log-line.is-sampled', 'Is sampled')}\n />\n </Tooltip>\n )}\n </div>\n )}\n <div\n className={`${styles.fieldsWrapper} ${detailsShown ? styles.detailsDisplayed : ''} ${wrapLogMessage ? styles.wrappedLogLine : `${styles.unwrappedLogLine} unwrapped-log-line`} ${collapsed === true ? styles.collapsedLogLine : ''}`}\n style={\n collapsed && virtualization\n ? { maxHeight: `${virtualization.getTruncationLineCount() * virtualization.getLineHeight()}px` }\n : undefined\n }\n >\n <Log\n collapsed={collapsed}\n displayedFields={displayedFields}\n log={log}\n showTime={showTime}\n showUniqueLabels={showUniqueLabels}\n styles={styles}\n timestampResolution={timestampResolution}\n wrapLogMessage={wrapLogMessage}\n />\n </div>\n </div>\n {collapsed === true && (\n <div className={styles.expandCollapseControl}>\n <Button\n variant=\"primary\"\n fill=\"text\"\n size=\"sm\"\n className={styles.expandCollapseControlButton}\n onClick={handleExpandCollapse}\n >\n {t('logs.log-line.show-more', 'show more')}\n </Button>\n </div>\n )}\n {collapsed === false && (\n <div className={styles.expandCollapseControl}>\n <Button\n variant=\"primary\"\n fill=\"text\"\n size=\"sm\"\n className={styles.expandCollapseControlButton}\n onClick={handleExpandCollapse}\n >\n {t('logs.log-line.show-less', 'show less')}\n </Button>\n </div>\n )}\n {detailsMode === 'inline' && detailsShown && (\n <InlineLogLineDetails\n logs={logs}\n log={log}\n onResize={handleLogLineResize}\n timeRange={timeRange}\n timeZone={timeZone}\n />\n )}\n </>\n );\n }\n);\nLogLineComponent.displayName = 'LogLineComponent';\n\nexport type LogLineTimestampResolution = 'ms' | 'ns';\n\ninterface LogProps {\n collapsed?: boolean;\n displayedFields: string[];\n log: LogListModel;\n showTime: boolean;\n showUniqueLabels?: boolean;\n styles: LogLineStyles;\n timestampResolution: LogLineTimestampResolution;\n wrapLogMessage: boolean;\n}\n\nconst Log = memo(\n ({ displayedFields, log, showTime, showUniqueLabels, styles, timestampResolution, wrapLogMessage }: LogProps) => {\n const handleLabelsToggle = useCallback(\n (expanded: boolean) => {\n log.uniqueLabelsExpanded = expanded;\n },\n [log]\n );\n return (\n <>\n {showTime && (\n <span className={`${styles.timestamp} level-${log.logLevel} field`}>\n {timestampResolution === 'ms' ? log.timestamp : log.timestampNs}\n </span>\n )}\n {\n // When logs are unwrapped, we want an empty column space to align with other log lines.\n }\n {(log.displayLevel || !wrapLogMessage) && (\n <span className={`${styles.level} level-${log.logLevel} field`}>{log.displayLevel}</span>\n )}\n {showUniqueLabels && log.uniqueLabels && (\n <span className=\"field\">\n <LogLabels\n addTooltip={true}\n displayAll={log.uniqueLabelsExpanded}\n displayMax={5}\n labels={log.uniqueLabels}\n onDisplayMaxToggle={handleLabelsToggle}\n />\n </span>\n )}\n {displayedFields.length > 0 ? (\n <DisplayedFields displayedFields={displayedFields} log={log} styles={styles} />\n ) : (\n <LogLineBody log={log} styles={styles} />\n )}\n </>\n );\n }\n);\nLog.displayName = 'Log';\n\nconst DisplayedFields = ({\n displayedFields,\n log,\n styles,\n}: {\n displayedFields: string[];\n log: LogListModel;\n styles: LogLineStyles;\n}) => {\n const { matchingUids, search } = useLogListSearchContext();\n const { syntaxHighlighting } = useLogListContext();\n\n const searchWords = useMemo(() => {\n const searchWords = log.searchWords && log.searchWords[0] ? log.searchWords.slice() : [];\n if (search && matchingUids?.includes(log.uid)) {\n searchWords.push(search);\n }\n if (!searchWords.length) {\n return undefined;\n }\n return searchWords;\n }, [log.searchWords, log.uid, matchingUids, search]);\n\n return displayedFields.map((field) => {\n if (field === LOG_LINE_BODY_FIELD_NAME) {\n return <LogLineBody log={log} key={field} styles={styles} />;\n }\n if (field === OTEL_LOG_LINE_ATTRIBUTES_FIELD_NAME && syntaxHighlighting) {\n return (\n <span className=\"field log-syntax-highlight\" title={getNormalizedFieldName(field)} key={field}>\n <HighlightedLogRenderer tokens={log.highlightedLogAttributesTokens} />\n </span>\n );\n }\n return (\n <span className=\"field\" title={getNormalizedFieldName(field)} key={field}>\n {searchWords ? (\n <Highlighter\n textToHighlight={log.getDisplayedFieldValue(field)}\n searchWords={searchWords}\n findChunks={findHighlightChunksInText}\n highlightClassName={styles.matchHighLight}\n />\n ) : (\n log.getDisplayedFieldValue(field)\n )}\n </span>\n );\n });\n};\n\nconst LogLineBody = ({ log, styles }: { log: LogListModel; styles: LogLineStyles }) => {\n const { syntaxHighlighting } = useLogListContext();\n const { matchingUids, search } = useLogListSearchContext();\n\n const highlight = useMemo(() => {\n const searchWords = syntaxHighlighting && log.searchWords && log.searchWords[0] ? log.searchWords.slice() : [];\n if (search && matchingUids?.includes(log.uid)) {\n searchWords.push(search);\n }\n if (!searchWords.length) {\n return undefined;\n }\n return { searchWords, highlightClassName: styles.matchHighLight };\n }, [log.searchWords, log.uid, matchingUids, search, styles.matchHighLight, syntaxHighlighting]);\n\n if (log.hasAnsi) {\n return (\n <span className=\"field no-highlighting\">\n <LogMessageAnsi value={log.body} highlight={highlight} />\n </span>\n );\n }\n\n if (!syntaxHighlighting) {\n return highlight ? (\n <Highlighter\n textToHighlight={log.body}\n searchWords={highlight.searchWords}\n findChunks={findHighlightChunksInText}\n highlightClassName={styles.matchHighLight}\n />\n ) : (\n <span className=\"field no-highlighting\">{log.body}</span>\n );\n }\n\n return (\n <span className=\"field log-syntax-highlight\">\n <HighlightedLogRenderer tokens={log.highlightedBodyTokens} />\n </span>\n );\n};\n\nexport function getGridTemplateColumns(dimensions: LogFieldDimension[], displayedFields: string[]) {\n const columns = dimensions\n .map((dimension) => (dimension.width > 0 ? `${dimension.width}px` : 'max-content'))\n .join(' ');\n const logLineWidth = displayedFields.length > 0 ? '' : ' 1fr';\n return `${columns}${logLineWidth}`;\n}\n\nexport type LogLineStyles = ReturnType<typeof getStyles>;\nexport const getStyles = (theme: GrafanaTheme2, virtualization?: LogLineVirtualization) => {\n const colors = {\n critical: '#B877D9',\n error: theme.colors.error.text,\n warning: '#FBAD37',\n debug: '#6E9FFF',\n trace: '#6ed0e0',\n info: '#6CCF8E',\n metadata: theme.colors.text.secondary,\n default: theme.colors.text.primary,\n parsedField: theme.colors.text.secondary,\n };\n\n const hoverColor = tinycolor(theme.colors.background.canvas).darken(5).toRgbString();\n\n return {\n logLine: css({\n color: colors.default,\n display: 'flex',\n gap: theme.spacing(0.5),\n flexDirection: 'row',\n fontFamily: theme.typography.fontFamilyMonospace,\n fontSize: theme.typography.fontSize,\n lineHeight: theme.typography.body.lineHeight,\n wordBreak: 'break-all',\n '&:hover': {\n background: hoverColor,\n },\n '&.infinite-scroll': {\n '&::before': {\n borderTop: `solid 1px ${theme.colors.border.strong}`,\n content: '\"\"',\n height: 0,\n left: 0,\n position: 'absolute',\n top: -3,\n width: '100%',\n },\n },\n '& .log-syntax-highlight': {\n '.log-token-string': {\n color: colors.default,\n },\n '.log-token-duration': {\n color: theme.colors.success.text,\n },\n '.log-token-size': {\n color: theme.colors.success.text,\n },\n '.log-token-uuid': {\n color: theme.colors.success.text,\n },\n '.log-token-key': {\n color: colors.parsedField,\n fontWeight: theme.typography.fontWeightMedium,\n },\n '.log-token-json-key': {\n color: colors.parsedField,\n opacity: 0.9,\n fontWeight: theme.typography.fontWeightMedium,\n },\n '.log-token-label': {\n color: colors.metadata,\n fontWeight: theme.typography.fontWeightBold,\n },\n '.log-token-method': {\n color: theme.colors.info.shade,\n },\n '.log-search-match': {\n color: theme.components.textHighlight.text,\n backgroundColor: theme.components.textHighlight.background,\n },\n },\n '& .no-highlighting': {\n color: theme.colors.text.primary,\n },\n }),\n matchHighLight: css({\n color: theme.components.textHighlight.text,\n backgroundColor: theme.components.textHighlight.background,\n }),\n fontSizeSmall: css({\n fontSize: theme.typography.bodySmall.fontSize,\n lineHeight: theme.typography.bodySmall.lineHeight,\n }),\n detailsDisplayed: css({\n background: tinycolor(theme.colors.background.canvas).darken(2).toRgbString(),\n }),\n pinnedLogLine: css({\n backgroundColor: tinycolor(theme.colors.info.transparent).setAlpha(0.25).toString(),\n }),\n permalinkedLogLine: css({\n backgroundColor: tinycolor(theme.colors.info.transparent).setAlpha(0.25).toString(),\n }),\n menuIcon: css({\n height: virtualization?.getLineHeight() ?? DEFAULT_LINE_HEIGHT,\n margin: 0,\n padding: theme.spacing(0, 0, 0, 0.5),\n }),\n logLineMessage: css({\n fontFamily: theme.typography.fontFamily,\n justifyContent: 'center',\n }),\n timestamp: css({\n color: theme.colors.text.disabled,\n display: 'inline-block',\n }),\n duplicates: css({\n flexShrink: 0,\n textAlign: 'center',\n width: theme.spacing(4.5),\n }),\n hasError: css({\n flexShrink: 0,\n width: theme.spacing(2),\n '& svg': {\n position: 'relative',\n top: -1,\n },\n }),\n isSampled: css({\n flexShrink: 0,\n width: theme.spacing(2),\n '& svg': {\n position: 'relative',\n top: -1,\n },\n }),\n logIconError: css({\n color: theme.colors.warning.main,\n }),\n logIconInfo: css({\n color: theme.colors.info.main,\n }),\n level: css({\n color: theme.colors.text.secondary,\n fontWeight: theme.typography.fontWeightBold,\n textTransform: 'uppercase',\n display: 'inline-block',\n '&.level-critical': {\n color: colors.critical,\n },\n '&.level-error': {\n color: colors.error,\n },\n '&.level-warning': {\n color: colors.warning,\n },\n '&.level-info': {\n color: colors.info,\n },\n '&.level-debug': {\n color: colors.debug,\n },\n }),\n loadMoreButton: css({\n background: 'transparent',\n border: 'none',\n display: 'inline',\n }),\n loadMoreTopContainer: css({\n backgroundColor: tinycolor(theme.colors.background.primary).setAlpha(0.75).toString(),\n left: 0,\n position: 'absolute',\n top: 0,\n width: '100%',\n zIndex: theme.zIndex.navbarFixed,\n }),\n overflows: css({\n outline: 'solid 1px red',\n }),\n clickable: css({\n cursor: 'pointer',\n }),\n unwrappedLogLine: css({\n display: 'grid',\n gridColumnGap: theme.spacing(FIELD_GAP_MULTIPLIER),\n whiteSpace: 'pre',\n paddingBottom: theme.spacing(0.75),\n }),\n wrappedLogLine: css({\n alignSelf: 'flex-start',\n paddingBottom: theme.spacing(0.75),\n whiteSpace: 'pre-wrap',\n '& .field': {\n marginRight: theme.spacing(FIELD_GAP_MULTIPLIER),\n },\n '& .field:last-child': {\n marginRight: 0,\n },\n }),\n fieldsWrapper: css({\n minHeight: virtualization ? virtualization.getLineHeight() + virtualization.getPaddingBottom() : undefined,\n '&:hover': {\n background: hoverColor,\n },\n }),\n collapsedLogLine: css({\n overflow: 'hidden',\n }),\n expandCollapseControl: css({\n display: 'flex',\n justifyContent: 'center',\n }),\n expandCollapseControlButton: css({\n fontWeight: theme.typography.fontWeightLight,\n height: virtualization?.getLineHeight() ?? DEFAULT_LINE_HEIGHT,\n margin: 0,\n }),\n };\n};\n\nfunction isLogLineClick(target: EventTarget) {\n const targetIsButton = target instanceof HTMLButtonElement || (target instanceof Element && target.closest('button'));\n return !targetIsButton;\n}\n"],"names":["LogLineDetailsLog","originalLog","syntaxHighlighting","logStyles","log","styles","value","INTEGER_REGEX","isNumber","NUMBER_REGEX","isSafeNumber","config","num","parsed","valueDigits","extractSignificantDigits","parsedDigits","UnsafeNumberReason","getUnsafeNumberReason","toSafeNumberOrThrow","number","unsafeReason","unsafeReasonText","splitNumber","match","sign","digitsStr","exponent","dot","digits","zeros","b","aa","bb","start","end","getSignificantDigitRange","LosslessNumber","isLosslessNumber","toLosslessNumber","compareLosslessNumber","parseLosslessNumber","parseNumberAndBigInt","revive","json","reviver","reviveValue","context","key","reviveArray","reviveObject","object","array","i","parse","text","parseNumber","parseValue","expectValue","expectEndOfInput","parseObject","codeOpeningBrace","skipWhitespace","initial","codeClosingBrace","eatComma","parseString","throwObjectKeyExpected","eatColon","throwObjectValueExpected","isDeepEqual","throwDuplicateKey","throwObjectKeyOrEndExpected","parseArray","codeOpeningBracket","codeClosingBracket","expectArrayItem","throwArrayItemOrEndExpected","parseNumeric","parseKeyword","name","isWhitespace","codeDoubleQuote","result","codeBackslash","char","escapeChar","escapeCharacters","isHex","throwInvalidUnicodeCharacter","throwInvalidEscapeCharacter","isValidStringCharacter","throwInvalidCharacter","expectEndOfString","codeMinus","expectDigit","codeZero","isNonZeroDigit","isDigit","codeDot","codeLowercaseE","codeUppercaseE","codePlus","codeComma","gotAt","codeColon","numSoFar","pos","chars","got","code","codeSpace","codeNewline","codeTab","codeReturn","codeNine","codeUppercaseA","codeUppercaseF","codeLowercaseA","codeLowercaseF","codeOne","item","index","isObject","stringify","replacer","space","numberStringifiers","resolvedSpace","resolveSpace","replacedValue","stringifyValue","indent","stringifier","str","stringifyArray","stringifyObject","childIndent","keys","first","includeProperty","keyStr","_key","getStyles","theme","UnThemedLogDetailsRow","onClickShowDetectedField","parsedKeys","row","onClickHideDetectedField","isFilterLabelActive","parsedValues","onClickFilterLabel","onClickFilterOutLabel","getStats","fieldStats","fieldCount","sum","stat","isLabel","app","showFieldsStats","state","val","ClipboardButton","showCopy","links","displayedFields","wrapLogMessage","disableActions","onPinLine","pinLineButtonTooltipTitle","rowStyles","getLogRowStyles","singleKey","singleVal","hasFilteringFunctionality","refIdTooltip","labelType","isMultiParsedValueWithNoContent","toggleFieldButton","IconButton","AsyncIconButton","LabelTypeBadge","link","originalOnClick","e","origin","DataLinkButton","LogLabelStats","type","Tooltip","isActive","tooltipSuffix","rest","active","setActive","tooltip","LogDetailsRow","useAttributesExtensionLinks","timeRange","usePluginLinks","acc","linkModel","withAttributesExtensionLinks","Component","ComponentWithLinks","props","labelLinks","UnThemedLogDetails","hasError","getRows","showDuplicates","className","onClickShowField","onClickHideField","getFieldLinks","levelStyles","labels","labelsAvailable","fieldsAndLinks","fieldsWithLinks","f","displayedFieldsWithLinks","hiddenFieldsWithLinks","fieldsWithLinksFromVariableMap","fieldsWithLinksAvailable","fields","fieldsAvailable","levelClassName","LogDetailsBody","field","values","fieldIndex","LogDetails","InfiniteScroll","children","loading","loadMoreLogs","range","rows","scrollElement","sortOrder","timeZone","topScrollEnabled","upperOutOfRange","setUpperOutOfRange","lowerOutOfRange","setLowerOutOfRange","upperLoading","setUpperLoading","lowerLoading","setLowerLoading","rowsRef","lastScroll","lastEvent","countRef","handleScroll","event","scrollDirection","shouldLoadMore","scrollTop","scrollBottom","newRange","canScrollTop","getVisibleRange","canScrollBottom","hideTopMessage","hideBottomMessage","loadOlderLogs","outOfRangeMessage","ScrollDirection","element","delta","shouldIgnoreChainOfEvents","deltaTime","firstTimeStamp","lastTimeStamp","getPrevRange","visibleRange","currentRange","getNextRange","updateCurrentRange","SCROLLING_THRESHOLD","getLogLevelStyles","logLevel","logColor","hoverBgColor","contextOutlineColor","roundMsToMin","milliseconds","roundSecToMin","seconds","shouldRefreshLabels","prevRange","sameMinuteFrom","sameMinuteTo","RE2_METACHARACTERS","escapeLokiRegexp","escapeLabelValueInExactSelector","labelValue","unescapeLabelValue","escapeLabelValueInRegexSelector","escapeLabelValueInSelector","selector","isRegexSelector","isBytesString","string","BYTES_KEYWORDS","regex","getLabelTypeFromFrame","labelKey","frame","typeField","mapOpToAbstractOp","mapAbstractOperatorsToOp","abstractQueryToExpr","labelBasedQuery","expr","operator","processLabels","valueSet","label","valueArray","limitSuggestions","SUGGESTIONS_LIMIT","items","getHighlighterExpressionsFromQuery","input","results","filters","getNodesFromQuery","filter","pipeExact","pipeMatch","strings","getStringsFromLineFilter","filterTerm","backtickedTerm","unwrappedFilterTerm","resultTerm","getExpressionFromExecutedQuery","executedQueryString","nodes","node","getNormalizedLokiQuery","query","queryType","getLokiQueryType","instant","isLogsQuery","tagsToObscure","partsToKeep","obfuscate","obfuscatedQuery","from","to","queryPart","parseToNodeNamesArray","queryParts","isQueryWithNode","nodeType","nodeTypes","getNodePositionsFromQuery","positions","getNodeFromQuery","isQueryWithError","isQueryWithParser","parserCount","getParserFromQuery","parsers","isQueryPipelineErrorFiltering","isQueryWithLabelFormat","getLogQueryFromMetricsQuery","selectorNode","pipelineExprNode","pipelineExpr","getLogQueryFromMetricsQueryAtPosition","position","metricQuery","isQueryWithLabelFilter","isQueryWithLineFilter","isQueryWithRangeVariable","rangeNodes","getStreamSelectorsFromQuery","labelMatcher","requestSupportsSplitting","allQueries","requestSupportsSharding","metricSupportsSharding","vectorOps","supportedVectorOps","getNodeString","unsupportedVectorOps","supportedWrappingVectorOpps","supportedOp","unsupportedOp","rangeOps","supportedRangeOps","isLokiQuery","getLokiQueryFromDataQuery","interpolateShardingSelector","queries","shards","shardValue","addStreamShardLabelsToQuery","shardedQuery","getSelectorForShardValues","HighlightedLogRenderer","tokens","token","LogToken","subToken","convertCSSToStyle","css","accumulated","line","_","character","UnThemedLogMessageAnsi","span","chunks","chunk","chunkText","LogMessageAnsi","LogContextButtons","wrapLines","onChangeWrapLines","onScrollCenterClick","internalOnChangeWrapLines","Button","makeEmptyContext","getLoadMoreDirection","place","normalizeLogRowRefId","counter","containsRow","r","PAGE_SIZE","LogRowContextModal","open","logsSortOrder","getLogRowContextUi","getRowContextQuery","onClose","getRowContext","entryElement","preEntryElement","prevScrollHeightRef","prevClientHeightRef","aboveLoadingElement","belowLoadingElement","loadCountRef","dispatch","sticky","setSticky","setContext","setSection","fun","c","newContext","generationRef","contextQuery","setContextQuery","setWrapLines","store","getFullTimeRange","below","above","allRows","fromMs","toMs","updateContextQuery","updateResults","loadMore","refRow","direction","newRows","setDisplayedFields","showField","hideField","maybeLoadMore","section","currentGen","older","newer","newRow","newAbove","newBelow","sortedNewAbove","sortedNewBelow","onScrollHit","entries","observer","entry","targetElement","scroll","aboveElem","belowElem","scrollToCenter","scrollE","prevClientHeight","currentClientHeight","prevScrollHeight","currentHeight","newScrollTop","useAsync","loadingStateAbove","loadingStateBelow","Modal","LoadingIndicator","LogRows","rowId","LogLabelStatsRow","count","proportion","style","percent","barStyle","STATS_ROW_LIMIT","rowCount","stats","topRows","activeRow","otherRows","insertActiveRow","otherCount","total","otherProportion","LogListContext","useLogListContextData","useLogListContext","useLogIsPinned","pinnedLogs","logId","useLogIsPermalinked","permalinkedLogId","LogListContextProvider","containerElement","enableLogDetails","logOptionsStorageKey","detailsModeProp","getDefaultDetailsMode","dedupStrategy","filterLevels","fontSize","isLabelFilterActive","logs","logLineMenuCustomItems","logsMeta","logSupportsContext","noInteractions","onClickFilterString","onClickFilterOutString","onLogOptionsChange","onLogLineHover","onPermalinkClick","onOpenContext","onUnpinLine","prettifyJSONProp","showControls","showLogAttributes","showTime","showUniqueLabels","timestampResolution","wrapLogMessageProp","logListState","setLogListState","showDetails","setShowDetails","detailsWidth","setDetailsWidthState","getDetailsWidth","detailsMode","setDetailsMode","isAssistantAvailable","openAssistant","prettifyJSON","setPrettifyJSONState","setWrapLogMessageState","otelDisplayedFields","newState","newShowDetails","expandedLog","handleResize","controlsExpandedFromStore","getDefaultControlsExpandedMode","controlsExpanded","setControlsExpanded","detailsDisplayed","shownLog","setDedupStrategy","setFontSize","setForceEscape","forceEscape","setFilterLevels","setPinnedLogs","setShowTime","newTimestampFormat","setShowUniqueLabels","setPrettifyJSON","setSyntaxHighlighting","setSortOrder","setWrapLogMessage","downloadLogs","format","filteredLogs","closeDetails","removeDetailsScrollPosition","toggleDetails","found","stateLog","setDetailsWidth","width","maxWidth","setTimestampResolution","openAssistantByLog","handleOpenAssistant","hasLogsWithErrors","hasSampledLogs","hasUnescapedContent","isLogsSortOrder","isDedupStrategy","currentWidth","defaultWidth","detailsScrollMap","saveDetailsScrollPosition","getDetailsScrollPosition","datasource","container","buildVisualQueryFromString","replacedExpr","handleExpression","err","isEmptyQuery","visQuery","getLabel","operation","error","getLineFilter","createNotSupportedError","getLabelParser","getLabelFilter","getJsonExpressionParser","getLogfmtParser","getLineFormat","getLabelFormat","handleUnwrapExpr","getDecolorize","handleRangeAggregation","handleVectorAggregation","handleBinary","isIntervalVariableError","handleDropFilter","handleKeepFilter","child","labelNode","op","filterExpr","handleQuotes","params","orFilter","parserNode","parser","opDef","flags","offset","subNode","ipLabelFilter","valueString","id","renameTo","originalLabel","unwrapExprChild","labelFilterChild","unwrapChild","convOp","identifier","nameNode","funcName","logExpr","rangeValue","grouping","numberNode","errorNode","metricExpr","operatorToOpName","def","left","binModifier","getBinaryModifier","right","leftNumber","getLastChildWithSelector","rightNumber","rightBinary","leftMostChild","binQuery","matcher","boolMatcher","s","exploringNode","LogsTableWrap","logsFrames","updatePanelState","panelState","propsColumns","columnsWithMeta","setColumnsWithMeta","dragStyles","filteredColumnsWithMeta","setFilteredColumnsWithMeta","height","getLogsTableHeight","panelStateRefId","currentDataFrame","setCurrentDataFrame","getColumnsFromProps","fieldNames","previouslySelected","logsFrame","defaultColumns","newFrame","newFiltered","flag","numberOfLogLines","otherFields","labelCardinality","pendingLabelState","normalize","sidebarWidth","setSidebarWidth","tableWidth","columnFilterEvent","columnName","priorActiveCount","column","clearSelection","isDefaultField","reorderColumn","newColumns","updateExploreState","newColumnsArray","a","pa","pb","newPanelState","toggleColumn","length","pendingFilteredLabelState","onFrameSelectorChange","getOnResize","ref","newSidebarWidth","Json$1","Logfmt$1","Unpack$1","Pattern$1","Regexp$1","Unwrap$1","LabelFormat$1","LineFormat$1","LabelReplace$1","Vector$1","Offset$1","Bool$1","On$1","Ignoring$1","GroupLeft$1","GroupRight$1","Decolorize$1","Drop$1","Keep$1","By$1","Without$1","And$1","Or$1","Unless$1","Sum$1","Avg$1","Count$1","Max$1","Min$1","Stddev$1","Stdvar$1","Bottomk$1","Topk$1","Sort$1","Sort_Desc$1","keywordTokens","specializeIdentifier","contextualKeywordTokens","extendIdentifier","spec_Identifier","stack","Json","Logfmt","Unpack","Pattern","Regexp","Unwrap","LabelFormat","LineFormat","LabelReplace","Vector","Offset","Bool","On","Ignoring","GroupLeft","GroupRight","Decolorize","Drop","Keep","By","Without","And","Or","Unless","Sum","Avg","Count","Max","Min","Stddev","Stdvar","Bottomk","Topk","Sort","Sort_Desc","LineComment","LogQL","Expr","LogExpr","Selector","Matchers","Matcher","Identifier","Eq","String","Neq","Re","Nre","PipelineExpr","PipelineStage","LineFilters","LineFilter","Filter","PipeExact","PipeMatch","PipePattern","Npa","FilterOp","Ip","OrFilter","Pipe","LogfmtParser","LogfmtParserFlags","ParserFlag","LabelParser","JsonExpressionParser","LabelExtractionExpressionList","LabelExtractionExpression","LogfmtExpressionParser","LabelFilter","IpLabelFilter","UnitFilter","DurationFilter","Gtr","Duration","Gte","Lss","Lte","Eql","BytesFilter","Bytes","NumberFilter","LiteralExpr","Number","Add","Sub","LineFormatExpr","LabelFormatExpr","LabelsFormat","LabelFormatMatcher","DecolorizeExpr","DropLabelsExpr","DropLabels","DropLabel","KeepLabelsExpr","KeepLabels","KeepLabel","MetricExpr","RangeAggregationExpr","RangeOp","CountOverTime","Rate","RateCounter","BytesOverTime","BytesRate","AvgOverTime","SumOverTime","MinOverTime","MaxOverTime","StddevOverTime","StdvarOverTime","QuantileOverTime","FirstOverTime","LastOverTime","AbsentOverTime","LogRangeExpr","Range","OffsetExpr","UnwrapExpr","ConvOp","BytesConv","DurationConv","DurationSecondsConv","Grouping","Labels","VectorAggregationExpr","VectorOp","BinOpExpr","BinOpModifier","OnOrIgnoringModifier","GroupingLabels","GroupingLabelList","GroupingLabel","LabelName","Mul","Div","Mod","Pow","LabelReplaceExpr","VectorExpr","UnwrapParamEditor","onChange","operationId","queryModeller","setState","Select","options","loadUnwrapOptions","queryExpr","samples","getOperationDefinitions","aggregations","opId","aggregationsWithParam","rangeOperations","rangeOperationsWithGrouping","model","innerExpr","binaryScalarOperations","operationDefinitions","explainOperator","getDefinitionById","x","checkParamsAreValid","param","ControlledLogsTable","deduplicatedRows","splitOpen","datasourceType","logsTableFrames","visualisationType","eventBus","EventBus","tableWidthExpandedControls","LogListControls","ControlledLogRows","showLabels","prettifyLogMessage","LogRowsComponent","scrollIntoViewProp","scrollElementRef","subscription","handleScrollToEvent","scrollElementClassName","scrollIntoView","logsGrammar","tokensGrammar","jsonGrammar","generateLogGrammar","labelGrammar","generateTextMatchGrammar","highlightWords","search","expressions","word","cleaned","cleanNeedle","expression","needle","TRUNCATION_DEFAULT_LENGTH","NEWLINES_REGEX","LogListModel","escape","grammar","virtualization","logLevelToDisplayLevel","raw","clone","reStringified","body","extraGrammar","attributes","suffix","fieldName","stripAnsi","ansicolor","fieldValue","collapsed","truncationLimit","countNewLines","preProcessLogs","order","preProcessLog","level","limit","getLevelsFromLogs","levels","getNormalizedFieldName","UniqueKeyMaker","proposedKey","maybeKey","LogRowMenuCell","logText","pinned","showContextToggle","mouseIsOver","onBlur","addonBefore","addonAfter","shouldShowContextToggle","onLogRowClick","onShowContextClick","handleBlur","getLogText","beforeContent","addClickListenersToNode","afterContent","onClick","MAX_CHARACTERS","LogMessage","hasAnsi","highlights","excessCharacters","needsHighlighter","searchWords","showFull","setShowFull","truncatedEntry","highlight","Ellipsis","toggle","diff","getEllipsisStyles","handleClick","restructureLog","expanded","LogRowMessage","logRowMenuIconsBefore","logRowMenuIconsAfter","restructuredEntry","shouldShowMenu","LogRowMessageDisplayedFields","detectedFields","preview","wrapClassName","displayedFieldsStyles","parsedKey","LogRow","permalinkedRowId","handleTextSelection","onLogRowHover","showingContext","setShowingContext","setMouseIsOver","permalinked","setPermalinked","logLineRef","timestamp","processedRow","errorMessage","sampleMessage","isSampled","debouncedContextClose","onRowClick","onMouseEnter","onMouseMove","onMouseLeave","Icon","LogLabels","emptyFn","PreviewLogRow","logRows","previewLimit","renderPreview","previewSize","setPreviewSize","popoverState","setPopoverState","showDisablePopoverOptions","setShowDisablePopoverOptions","logRowsRef","dedupedRows","dedupCount","orderedRows","handleDeselectionRef","keyMaker","renderAll","openContext","popoverMenuSupported","closePopoverMenu","handleDeselection","handleSelection","selection","MENU_WIDTH","MENU_HEIGHT","y","onDisablePopoverMenu","onDisableCancel","onDisableConfirm","PopoverMenu","ConfirmModal","LogLineDetailsDisplayedFields","reorganizeDisplayedFields","srcIndex","destIndex","mode","newDisplayedFields","onDragEnd","provided","DraggableDisplayedField","moveField","DisplayedField","nextIndex","prevIndex","Card","LogLineDetailsFields","getFieldsStyles","getLogs","filteredFields","filterFields","LogLineDetailsField","LogLineDetailsLabelFields","filterLabels","setShowFieldStats","setFieldCount","setFieldStats","getFieldStyles","updateStats","newStats","newCount","reportInteractionWrapper","interactionName","properties","filterLabel","filterOutLabel","labelFilterActive","showStats","showFieldStats","singleValue","fieldSupportsFilters","MultipleValue","SingleValue","ClipboardButtonWrapper","getClipboardButtonStyles","originalValue","keysIdx","fuzzySearch","valuesIdx","LogLineDetailsHeader","focusLogLine","onSearch","containerRef","inputRef","searchUsedRef","scrollToLogLine","copyLogLine","copyLinkToLogLine","togglePinning","shouldlogSupportsContext","showContext","showLogLineToggle","logLineDisplayed","toggleDetailsMode","newMode","toggleLogLine","clearSearch","handleSearch","Input","colorManipulator","LogLineDetailsLinks","Toggletip","LogLineDetailsTrace","traceRef","dataSource","setDataSource","dataFrames","setDataFrames","request","isObservable","lastValueFrom","response","traceProp","transform","TraceView","Spinner","getTempoTraceFromLinks","trace","getTempoTraceFromLink","isTempoQuery","LogLineDetailsComponent","setSearch","extensionLinks","fieldsWithoutLinks","labelsWithLinks","groupedLabels","labelGroups","logLineOpen","linksOpen","fieldsOpen","displayedFieldsOpen","traceOpen","handleToggle","option","isOpen","newSearch","noDetails","allLinks","group","groupOptionName","LogLineDetails","reportResize","LogLineDetailsTabs","currentLog","setCurrentLog","previousShowDetails","usePrevious","TabsBar","Tab","InlineLogLineDetails","onResize","scrollRef","saveScroll","LOG_LINE_DETAILS_HEIGHT","QueryEditorMode","QueryEditorMode2","BINARY_OPERATIONS_KEY","LOG_LIST_MIN_WIDTH","FIELD_GAP_MULTIPLIER","DEFAULT_LINE_HEIGHT","LOG_LIST_CONTROLS_WIDTH","LogLineVirtualization","getLogContainerWidth","canvasCharWidth","font","letterSpacing","canvas","storedWidth","beforeWidth","logLines","charWidth","logLineCharsLength","firstLineCharsLength","textLines","availableWidth","textLine","testLogLine","measuredLine","timestampWidth","levelWidth","fieldWidths","dimensions","fontSizePx","getLogLineSize","wrap","gap","detailsHeight","storedSize","textToMeasure","iconsGap","optionsWidth","getLogLineDOMHeight","calculatedHeight","inlineDetails","measuredHeight","logLineMenuIconWidth","scrollBarWidth","getScrollbarWidth","hiddenDiv","ScrollToLogsEvent","LogListControlsOption","stickToBottom","iconButtonClassName","iconButtonName","iconButtonProps","LogListControlsSelectOption","dropdown","customTagText","buttonAriaLabel","Dropdown","DEDUP_OPTIONS","FILTER_LEVELS","logLevels","hideSearch","searchVisible","showSearch","onScrollToTopClick","onScrollToBottomClick","onExpandControlsClick","onForceEscapeClick","onFilterLevelClick","filterLevel","onFontSizeClick","newSize","onShowTimestampsClick","onShowUniqueLabelsClick","onSortOrderClick","onSetPrettifyJSONClick","onSyntaxHightlightingClick","onWrapLogMessageClick","deduplicationMenu","Menu","filterLevelsMenu","downloadMenu","inDashboard","TimestampResolutionButton","WrapLogMessageButton","getWrapButtonStyles","hide","showMs","showNs","timestampMenu","labelText","disable","wrapAndPrettify","wrappingMenu","wrapStateText","CONTROLS_WIDTH","CONTROLS_WIDTH_EXPANDED","reportInteractionOnce","HIDDEN_LABELS","emptyMessage","addTooltip","displayMax","onDisplayMaxToggle","initialDisplayAll","displayAll","setDisplayAll","allLabels","displayLabels","LogLabel","LogLabelsList","LogListSearchContext","useLogListSearchContextData","useLogListSearchContext","LogListSearchContextProvider","setSearchVisible","matchingUids","setMatchingUids","filterLogs","setFilterLogs","toggleFilterLogs","isLogLineJSON","LOGFMT_REGEXP","isLogLineLogfmt","isLogLinePacked","dataFrameHasLokiError","dataFrameHasLevelLabel","extractLogParserFromDataFrame","lineField","hasJSON","hasLogfmt","hasPack","extractLabelKeysFromDataFrame","labelsArray","labelTypeArray","labelKeys","labelsSet","labelsType","allLabelKeys","extractUnwrapLabelKeysFromDataFrame","obj","extractHasErrorLabelFromDataFrame","labelField","extractLevelLikeLabelFromDataFrame","levelLikeLabel","isRetriableError","errorResponse","message","SETTINGS_KEYS","SETTING_KEY_ROOT","visualisationTypeKey","__defProp","__defNormalProp","__publicField","QueryModellerBase","innerQueryPlaceholder","Registry","categories","category","LokiQueryModeller","queryString","operations","binaryQueries","leftOperand","binaryQuery","nested","lokiQueryModeller","NodePosition","queryHasFilter","getMatchersWithFilter","removeLabelFromQuery","matchers","removeLabelFilter","removeSelector","pipelineStage","labelName","prefix","matchVisQuery","tree","opNode","valueNode","addLabelToQuery","streamSelectorPositions","getStreamSelectorPositions","parserPositions","getParserPositions","labelFilterPositions","getLabelFilterPositions","hasStreamSelectorMatchers","getMatcherInStreamPositions","labelFormatPositions","getIdentifierInStreamPositions","everyStreamSelectorHasMatcher","streamSelectorPosition","matcherPosition","toLabelFilter","lastPositionsPerExpression","getLastPositionPerExpression","addFilterAsLabelFilter","addFilterToStreamSelector","subExpressions","findLeaves","subPositions","subExpression","findLastPosition","p","addParserToQuery","lineFilterPositions","getLineFiltersPositions","appendToLogsQuery","addDropToQuery","labelsToDrop","queryPartPositions","statement","newQuery","prev","isLast","addNoPipelineErrorToQuery","addLabelFormatToQuery","labelFormat","logQueryPositions","getLogQueryPositions","addLabelFormat","removeCommentsFromQuery","lineCommentPositions","getLineCommentPositions","lineCommentPosition","parserNodeTypes","logPartsPositions","pipeline","unwrap","sorted","vectorSelectorPositions","labelExists","newLabels","positionsToAddAfter","labelFilter","addLineFilter","streamSelectorEnd","current","n","getAllPositionsInNodeByType","LOG_LINE_BODY_FIELD_NAME","close","handleEscape","onDisable","track","action","selectionLength","dataSourceType","binaryScalarDefs","defaultParams","getSimpleBinaryRenderer","bool","adjective","loadingIndicatorStyles","LogLineMessage","handleOverflow","infiniteScrollMode","setInitialScrollPosition","infiniteLoaderState","setInfiniteLoaderState","autoScroll","setAutoScroll","prevLogs","prevSortOrder","lastLogOfPage","resetStateTimeout","scrollToLogLineRef","noScrollRef","onLoadMore","loadMoreTop","loadMoreBottom","Renderer","getMessageFromInfiniteLoaderState","LogLine","getLogLineVariant","onItemsRendered","lastLogIndex","preScrollIndex","getItemKey","itemCount","prevLog","uid","LOG_LIST_SEARCH_HEIGHT","LogListSearch","listRef","setContextSearch","currentResult","setCurrentResult","matches","findMatchingLogs","handleChange","prevResult","nextResult","next","newMatchingUids","sameLogs","prevMatchingLog","matchingLog","newMatches","useKeyBindings","handleToggleSearch","isMac","isFKey","usePopoverMenu","LogList","initialScrollPosition","showFieldSelector","LogListComponent","processedLogs","setProcessedLogs","listHeight","setListHeight","getListHeight","widthRef","wrapperRef","widthContainer","levelFilteredLogs","debouncedResetAfterIndex","overflowIndexRef","debouncedScrollToItem","align","handleScrollPosition","scrollToUID","handleLogLineClick","filteredLog","columns","list","OTEL_PROBE_FIELD","OTEL_LANGUAGE_UNKNOWN","identifyOTelLanguages","languagesSet","lang","identifyOTelLanguage","getDisplayedFieldsForLanguages","languages","language","getDefaultOTelDisplayFormat","OTEL_LOG_LINE_ATTRIBUTES_FIELD_NAME","getDisplayedFieldsForLogs","getDisplayFormatForLanguage","getSuggestedFieldsForLogs","getSuggestedOTelDisplayFormat","OTEL_RESOURCE_ATTRS_REGEX","OTEL_LOG_FIELDS_REGEX","getOtelAttributesField","LabelParamEditor","getOperationParamId","loadGroupByLabels","toOption","createRangeOperation","isRangeOperationWithGrouping","getRangeVectorParamDef","paramChangedHandler","getOnLabelAddedHandler","getLokiOperationDisplayName","operationWithRangeVectorRenderer","addLokiOperation","opDocs","createRangeOperationWithGrouping","rangeOperation","getRangeAggregationWithGroupingRenderer","getLastLabelRemovedHandler","getAggregationExplainer","aggregation","restParamIndex","restParams","rangeVector","quantile","labelFilterRenderer","isConflictingFilter","queryOperations","operationIsNegative","queryOperation","candidate","pipelineRenderer","strict","keepEmpty","isRangeVectorFunction","getIndexOfOrLast","condition","modeller","newOperation","existingRangeVectorFunction","placeToInsert","addNestedQueryHandler","getLineFilterRenderer","caseInsensitive","hasBackticks","delimiter","paramIndex","changeToOperationId","aggregationName","labelWord","defaultAddOperationHandler","createAggregationOperation","overrides","functionRendererLeft","getAggregationByRenderer","getAggregationWithoutRenderer","renderParams","createAggregationOperationWithParam","paramsDef","getAggregationByRendererWithParameter","idx","Field","draggable","showCount","Checkbox","ActiveFields","activeFields","clear","reorder","suggestedFields","getLogsFieldsStyles","newActiveFields","suggested","suggestedField","snapshot","EmptyFields","AvailableFields","availableFields","sortFields","collator","FieldList","FieldSearch","collapse","DEFAULT_WIDTH","MIN_WIDTH","LogListFieldSelector","sidebarHeight","setSidebarHeight","getSidebarWidth","setSidebarWidthWrapper","clearFields","expand","toggleField","getSuggestedFields","getFieldsWithStats","FieldSelector","logsFieldSelectorWrapperStyles","LogsTableFieldSelector","clearProp","displayedColumns","searchValue","setSearchValue","onSearchInputChange","idxs","filteredSuggestedFields","cardinality","totalLines","allFields","dataFrame","defaultFields","getSidebarState","LokiQueryPatternType","LokiVisualQueryOperationCategory","LokiOperationId","LokiOperationOrder","lokiOperators","DEFAULT_TIME_WINDOW","LogLineContext","aboveLogs","setAboveLogs","belowLogs","setBelowLogs","initialized","setInitialized","allLogs","aboveState","setAboveState","belowState","setBelowState","showLog","setShowLog","datasourceInstance","setDatasourceInstance","defaultTimeWindow","timeWindow","setTimeWindow","eventBusRef","getContextLogs","refLog","timeWindowMs","normalizeLogRefId","newLogs","handleLoadMore","onSplitViewClick","handleTimeWindowChange","handleClose","logListModel","ds","getTimeWindowOptions","interval","ErrorId","getLeftMostChild","cur","makeError","getString","variableRegex","replaceVariables","var1","var2","fmt2","var3","fieldPath","fmt3","fmt","variable","varType","varTypeFunc","returnVariables","v","makeBinOp","hasBool","getAllByType","regexifyLabelValuesQueryString","LogLineMenu","menuRef","toggleLogDetails","showFirstDivider","menu","isDivider","isItem","onOverflow","variant","LogLineComponent","setCollapsed","handleLogLineResize","actualHeight","frameId","handleMouseOver","handleExpandCollapse","isLogLineClick","detailsShown","Log","handleLabelsToggle","DisplayedFields","LogLineBody","getGridTemplateColumns","dimension","logLineWidth","colors","hoverColor","tinycolor","target"],"sourceRoot":""}
.
Edit
..
Edit
1117.145ac642f59357bc40d8.js
Edit
1117.145ac642f59357bc40d8.js.map
Edit
1118.c684d1aadf16a6c70620.js
Edit
1118.c684d1aadf16a6c70620.js.map
Edit
1122.5fbf0d7cd148c610616d.js
Edit
1122.5fbf0d7cd148c610616d.js.map
Edit
1142.a4b35a0e8699cafd901e.js
Edit
1142.a4b35a0e8699cafd901e.js.map
Edit
1162.81868b3ac499fa5ea04b.js
Edit
1162.81868b3ac499fa5ea04b.js.map
Edit
1183.7444f51e5996a7f23c7d.js
Edit
1183.7444f51e5996a7f23c7d.js.map
Edit
1282.ae38cac1b732d8ac1d96.js
Edit
1282.ae38cac1b732d8ac1d96.js.map
Edit
130.a58aaeea748f37ee6482.js
Edit
130.a58aaeea748f37ee6482.js.map
Edit
1419.59f53ae25085b28e1e11.js
Edit
1419.59f53ae25085b28e1e11.js.map
Edit
1420.e63ce495727f83b8887d.js
Edit
1420.e63ce495727f83b8887d.js.map
Edit
1438.ccdd05d7188edf4191ff.js
Edit
1438.ccdd05d7188edf4191ff.js.map
Edit
1446.fe7b1f4563629b80793f.js
Edit
1446.fe7b1f4563629b80793f.js.map
Edit
1484.3da94e44ecdadcd342d4.js
Edit
1484.3da94e44ecdadcd342d4.js.map
Edit
1492.4026c6e7130c3afdae87.js
Edit
1494.ef220afb67ff6c52c7af.js
Edit
1494.ef220afb67ff6c52c7af.js.map
Edit
1560.538cd2395be11ba4e2c9.js
Edit
1560.538cd2395be11ba4e2c9.js.map
Edit
1579.c391ef869d4f7bfc0d1c.js
Edit
1579.c391ef869d4f7bfc0d1c.js.map
Edit
1646.d7d87a40853795910533.js
Edit
1646.d7d87a40853795910533.js.map
Edit
1710.7db3f56c6714c0c340e0.js
Edit
1710.7db3f56c6714c0c340e0.js.map
Edit
1716.f71f518289da5d2229bc.js
Edit
1716.f71f518289da5d2229bc.js.map
Edit
1740.baf38e7ee007e1a6935e.js
Edit
1740.baf38e7ee007e1a6935e.js.map
Edit
1821.c9a2456dc8d78cf6b02f.js
Edit
1821.c9a2456dc8d78cf6b02f.js.map
Edit
1888.d33142738af4fbf8a230.js
Edit
1888.d33142738af4fbf8a230.js.map
Edit
1914.5f33b3c2133b5bb7ea6e.js
Edit
1914.5f33b3c2133b5bb7ea6e.js.map
Edit
198.65a768ff6c601d19ea3f.js
Edit
198.65a768ff6c601d19ea3f.js.map
Edit
1990.9171129a8deabb59bf30.js
Edit
1990.9171129a8deabb59bf30.js.map
Edit
2018.5ff00ee0456301c1cf43.js
Edit
2018.5ff00ee0456301c1cf43.js.map
Edit
205.2eb73847215c8d021cc9.js
Edit
205.2eb73847215c8d021cc9.js.map
Edit
2077.a5848ca4b4b9fdebca17.js
Edit
2077.a5848ca4b4b9fdebca17.js.map
Edit
2094.97e7f0876201e76a77fd.js
Edit
2094.97e7f0876201e76a77fd.js.map
Edit
2150.7576285186c713978b39.js
Edit
2150.7576285186c713978b39.js.map
Edit
2152.b55841e6f422682a3891.js
Edit
2152.b55841e6f422682a3891.js.map
Edit
221.0fc4d14d0a67f3a25d64.js
Edit
221.0fc4d14d0a67f3a25d64.js.map
Edit
2218.623d73bd0985ddf5f8c4.js
Edit
2218.623d73bd0985ddf5f8c4.js.map
Edit
2223.e65417164a45701ed9dc.js
Edit
2223.e65417164a45701ed9dc.js.map
Edit
2244.70c156ada2487a05595c.js
Edit
2244.70c156ada2487a05595c.js.map
Edit
2278.f887de0a65e1b784ea9f.js
Edit
2278.f887de0a65e1b784ea9f.js.map
Edit
2288.6a65ba08c6c0f4f83435.js
Edit
2288.6a65ba08c6c0f4f83435.js.map
Edit
2311.73e1a2b949d289f5d6c9.js
Edit
2311.73e1a2b949d289f5d6c9.js.map
Edit
2398.d142e32be48079fc63c0.js
Edit
2398.d142e32be48079fc63c0.js.map
Edit
2405.c1b37a7cc8182472f6a6.js
Edit
2405.c1b37a7cc8182472f6a6.js.map
Edit
2446.0418c7ea000998178d8b.js
Edit
2446.0418c7ea000998178d8b.js.map
Edit
2450.d73c024ff7273aebf911.js
Edit
2450.d73c024ff7273aebf911.js.map
Edit
2586.668c65b61e9ea31b5bca.js
Edit
2586.668c65b61e9ea31b5bca.js.map
Edit
265.ed6933785cc750cbd9ed.js
Edit
265.ed6933785cc750cbd9ed.js.map
Edit
2658.7f70ebc378803654a814.js
Edit
2658.7f70ebc378803654a814.js.map
Edit
2686.ae267304ddd1380c30c7.js
Edit
2686.ae267304ddd1380c30c7.js.map
Edit
2692.fa24ada7d987a7ee05f1.js
Edit
2692.fa24ada7d987a7ee05f1.js.map
Edit
2699.b79e57051a1a63376320.js
Edit
2699.b79e57051a1a63376320.js.map
Edit
2710.e1ac8e57578a838f5bd8.js
Edit
2710.e1ac8e57578a838f5bd8.js.map
Edit
2744.d6b14bf01022bdb8eab5.js
Edit
2744.d6b14bf01022bdb8eab5.js.map
Edit
2745.8049d948cb362dfc6cb3.js
Edit
2745.8049d948cb362dfc6cb3.js.map
Edit
2835.01beb5b1a252d779aad7.js
Edit
2835.01beb5b1a252d779aad7.js.map
Edit
2961.4b27b21453fdbb115dd4.js
Edit
2961.4b27b21453fdbb115dd4.js.map
Edit
2962.85c9dc0cca68efab5e0c.js
Edit
2962.85c9dc0cca68efab5e0c.js.map
Edit
2975.e64aaea6ff35a7d3b3fd.js
Edit
2975.e64aaea6ff35a7d3b3fd.js.map
Edit
3003.f51365051eb27cf765d8.js
Edit
3003.f51365051eb27cf765d8.js.map
Edit
3042.44bad7d2d0536000b808.js
Edit
3042.44bad7d2d0536000b808.js.map
Edit
3062.ad5844391370fcc7525a.js
Edit
3062.ad5844391370fcc7525a.js.map
Edit
3082.704af6779ad700a5fa42.js
Edit
3082.704af6779ad700a5fa42.js.map
Edit
3096.aed61083f1ba4803ae84.js
Edit
3096.aed61083f1ba4803ae84.js.map
Edit
3126.10c85e1f02105e470a69.js
Edit
3126.10c85e1f02105e470a69.js.map
Edit
3169.0b88a5a2340f70961599.js
Edit
3169.0b88a5a2340f70961599.js.map
Edit
3171.c79c28e2611563e2dbcb.js
Edit
3171.c79c28e2611563e2dbcb.js.map
Edit
3182.831f754ed3b6f10441a0.js
Edit
3182.831f754ed3b6f10441a0.js.map
Edit
3192.2cb90eadf3399270363e.js
Edit
3192.2cb90eadf3399270363e.js.map
Edit
3217.c6faaa4f5637068f90f3.js
Edit
3217.c6faaa4f5637068f90f3.js.map
Edit
3259.c8e4d6ad93201a56e49f.js
Edit
3259.c8e4d6ad93201a56e49f.js.map
Edit
3284.79c2897655286b0c1f6d.js
Edit
3284.79c2897655286b0c1f6d.js.map
Edit
3303.225dae64cff0c2280c3b.js
Edit
3303.225dae64cff0c2280c3b.js.map
Edit
3326.cabc370d66d7ecfbd2c3.js
Edit
3326.cabc370d66d7ecfbd2c3.js.map
Edit
344.85cff3029cbbb5463c7e.js
Edit
344.85cff3029cbbb5463c7e.js.map
Edit
3466.fda7da0cb4150e59da98.js
Edit
3466.fda7da0cb4150e59da98.js.map
Edit
3474.74dfd856a9528c758a57.js
Edit
3474.74dfd856a9528c758a57.js.map
Edit
348.fd20e2547f12dbed76c7.js
Edit
348.fd20e2547f12dbed76c7.js.map
Edit
3495.9c1ae6f61edf7aef207b.js
Edit
3495.9c1ae6f61edf7aef207b.js.map
Edit
3501.a0ee7c2b24136aa91eb5.js
Edit
3501.a0ee7c2b24136aa91eb5.js.map
Edit
3520.a3c2b474e2dcaf9879fc.js
Edit
3520.a3c2b474e2dcaf9879fc.js.map
Edit
3605.41e3c44dfe2ca2966198.js
Edit
3605.41e3c44dfe2ca2966198.js.map
Edit
362.e5ce68af98ee6713a4e7.js
Edit
362.e5ce68af98ee6713a4e7.js.map
Edit
3622.0b196041f825b42c5233.js
Edit
3622.0b196041f825b42c5233.js.map
Edit
3630.1ffe9229d5c27fd0823a.js
Edit
3630.1ffe9229d5c27fd0823a.js.map
Edit
3659.f5dc1bb19d36546aadb8.js
Edit
3659.f5dc1bb19d36546aadb8.js.map
Edit
3688.ec5e74c60569e9498687.js
Edit
3688.ec5e74c60569e9498687.js.map
Edit
3718.b570aa4fa35f8dfc686e.js
Edit
3718.b570aa4fa35f8dfc686e.js.map
Edit
3726.84ef8bb1304f7adbc7f3.js
Edit
3726.84ef8bb1304f7adbc7f3.js.map
Edit
398.ceeafcf522343c717c4b.js
Edit
398.ceeafcf522343c717c4b.js.map
Edit
4064.e52eb763993ad947e4a1.js
Edit
4064.e52eb763993ad947e4a1.js.map
Edit
407.594046bd73cc88c29e80.js
Edit
407.594046bd73cc88c29e80.js.map
Edit
4113.3fa5432815c4662eb03e.js
Edit
4113.3fa5432815c4662eb03e.js.map
Edit
4114.c4741f0a73781d3f87dc.js
Edit
4114.c4741f0a73781d3f87dc.js.map
Edit
4120.968e1408d894f8515330.js
Edit
4120.968e1408d894f8515330.js.map
Edit
4162.8b8a683fa98d677f9137.js
Edit
4162.8b8a683fa98d677f9137.js.map
Edit
4209.de7f2b850ee1292a67e5.js
Edit
4209.de7f2b850ee1292a67e5.js.map
Edit
4224.cc13db0c6e3f7fdb05c9.js
Edit
4224.cc13db0c6e3f7fdb05c9.js.map
Edit
4251.28e90ad13c8fe749062c.js
Edit
4251.28e90ad13c8fe749062c.js.map
Edit
4334.396d65b7ba31733108e9.js
Edit
4334.396d65b7ba31733108e9.js.map
Edit
4350.6db49924324f8061d361.js
Edit
4350.6db49924324f8061d361.js.map
Edit
4463.24a3e34bed64cbbb8b99.js
Edit
4463.24a3e34bed64cbbb8b99.js.map
Edit
4514.03e966fee9064d7305dd.js
Edit
4514.03e966fee9064d7305dd.js.map
Edit
4564.ea4a09ba96ddbf74a0ee.js
Edit
4564.ea4a09ba96ddbf74a0ee.js.map
Edit
46.7809585ddbb4791e248a.js
Edit
46.7809585ddbb4791e248a.js.map
Edit
4630.54d7f3b9d384c6b95bbc.js
Edit
4630.54d7f3b9d384c6b95bbc.js.map
Edit
4656.a07d832134b096826a58.js
Edit
4656.a07d832134b096826a58.js.map
Edit
468.d3a2ba8b0d226ca1475b.js
Edit
468.d3a2ba8b0d226ca1475b.js.map
Edit
4680.abd86af55b75e75326ab.js
Edit
4680.abd86af55b75e75326ab.js.map
Edit
4691.2f69f76af87a66a1513c.js
Edit
4691.2f69f76af87a66a1513c.js.map
Edit
4698.c9a2c562b12da12dc66e.js
Edit
4698.c9a2c562b12da12dc66e.js.map
Edit
4791.fc3ef0337811ab73b164.js
Edit
4791.fc3ef0337811ab73b164.js.map
Edit
4814.2d8cb562606e508512d8.js
Edit
4814.2d8cb562606e508512d8.js.map
Edit
4824.2da8107f19d58bf153e0.js
Edit
4824.2da8107f19d58bf153e0.js.map
Edit
4839.f4d2edd5c2678ef2b624.js
Edit
4839.f4d2edd5c2678ef2b624.js.map
Edit
4857.4971a98037d2ec3b663d.js
Edit
4857.4971a98037d2ec3b663d.js.map
Edit
4865.be02c1283a83523c4414.js
Edit
4865.be02c1283a83523c4414.js.map
Edit
494.5463fc5a297eaedd150f.js
Edit
494.5463fc5a297eaedd150f.js.map
Edit
4958.226af5f19bf47305a407.js
Edit
4958.226af5f19bf47305a407.js.map
Edit
4962.bbff24c5a85e9314600a.js
Edit
4962.bbff24c5a85e9314600a.js.map
Edit
4964.1f2cc5acc0078feb7b08.js
Edit
4964.1f2cc5acc0078feb7b08.js.map
Edit
4965.ccdc00d808390be53820.js
Edit
4965.ccdc00d808390be53820.js.map
Edit
5065.a2c71dab50ccb4174ee2.js
Edit
5065.a2c71dab50ccb4174ee2.js.map
Edit
5074.92e2d1ae98dcd913506e.js
Edit
5074.92e2d1ae98dcd913506e.js.map
Edit
5091.987ffc33b70121541e5d.js
Edit
5091.987ffc33b70121541e5d.js.map
Edit
5106.581eaf66a6592320d97a.js
Edit
5106.581eaf66a6592320d97a.js.map
Edit
5110.96d49ea826be96c65045.js
Edit
5110.96d49ea826be96c65045.js.map
Edit
5130.cbdddcd716a093bdbaac.js
Edit
5130.cbdddcd716a093bdbaac.js.map
Edit
5196.9b7364caf64a8583ad01.js
Edit
5196.9b7364caf64a8583ad01.js.map
Edit
5198.2cd64d4e16a385dd9b91.js
Edit
5198.2cd64d4e16a385dd9b91.js.map
Edit
5280.2c29942977baa2dfbe0e.js
Edit
5280.2c29942977baa2dfbe0e.js.map
Edit
5364.0288d9c98f74f26b73e7.js
Edit
5364.0288d9c98f74f26b73e7.js.map
Edit
5446.ad01d0b233122dd49849.js
Edit
5446.ad01d0b233122dd49849.js.map
Edit
5550.5bf3e7d23d6b104740fd.js
Edit
5550.5bf3e7d23d6b104740fd.js.map
Edit
5618.909592bbe054b70f2377.js
Edit
5618.909592bbe054b70f2377.js.map
Edit
5648.a1fc2b0cbbca9bfa1d94.js
Edit
5648.a1fc2b0cbbca9bfa1d94.js.map
Edit
5664.c55be32f6d459ac3f3d8.js
Edit
5664.c55be32f6d459ac3f3d8.js.map
Edit
5671.e1e396b75d7b95ef461f.js
Edit
5671.e1e396b75d7b95ef461f.js.map
Edit
5742.117597ec799ab75cb2f4.js
Edit
5742.117597ec799ab75cb2f4.js.map
Edit
5747.b9389680058c12ffba68.js
Edit
5747.b9389680058c12ffba68.js.map
Edit
5757.5a4b7f2368dd09da42be.js
Edit
5786.c45dfaf9e1d969472e5e.js
Edit
5786.c45dfaf9e1d969472e5e.js.map
Edit
5790.29b0a5797fd46e9664f5.js
Edit
5790.29b0a5797fd46e9664f5.js.map
Edit
5923.b9c876b4bf528d8511cb.js
Edit
5923.b9c876b4bf528d8511cb.js.map
Edit
5984.1efdc4bb85100bd19ca9.js
Edit
5984.1efdc4bb85100bd19ca9.js.map
Edit
5995.5c7a375f33ea1cd16daa.js
Edit
5995.5c7a375f33ea1cd16daa.js.map
Edit
6018.befdd11bf701ea71f7bf.js
Edit
6018.befdd11bf701ea71f7bf.js.map
Edit
6029.bdcbf27bcdd36812f646.js
Edit
6029.bdcbf27bcdd36812f646.js.map
Edit
6088.7f526abfdb4003574c68.js
Edit
6088.7f526abfdb4003574c68.js.map
Edit
613.084d33252856771cf6e1.js
Edit
613.084d33252856771cf6e1.js.map
Edit
6185.2a7c893c6b3f2f0dadb8.js
Edit
6185.2a7c893c6b3f2f0dadb8.js.map
Edit
6208.571f272269524cfd14e7.js
Edit
6208.571f272269524cfd14e7.js.map
Edit
6236.30d1fa6aee173c946c50.js
Edit
6236.30d1fa6aee173c946c50.js.map
Edit
6244.64f83fc5d05560979c51.js
Edit
6244.64f83fc5d05560979c51.js.map
Edit
6260.b8be95165766a81dade2.js
Edit
6260.b8be95165766a81dade2.js.map
Edit
630.56b78dcdaeeb9d9c2967.js
Edit
630.56b78dcdaeeb9d9c2967.js.map
Edit
6302.a2ffa52069511df9772f.js
Edit
6302.a2ffa52069511df9772f.js.map
Edit
6315.f4d87fc6f8ae3cb40e38.js
Edit
6315.f4d87fc6f8ae3cb40e38.js.map
Edit
6414.7520859a2d9cc0a63d7f.js
Edit
6414.7520859a2d9cc0a63d7f.js.map
Edit
6446.1d75a8140260005fffbd.js
Edit
6446.1d75a8140260005fffbd.js.map
Edit
6743.67a52a99e2fdd1ae1e10.js
Edit
6743.67a52a99e2fdd1ae1e10.js.map
Edit
6759.0454d3c1e41385379bdc.js
Edit
6759.0454d3c1e41385379bdc.js.map
Edit
6772.0d4a074848bc323be8f8.js
Edit
6772.0d4a074848bc323be8f8.js.map
Edit
680.726adca366b4ecb272db.js
Edit
680.726adca366b4ecb272db.js.map
Edit
6830.a4b0ecf3a6d784ca7609.js
Edit
6830.a4b0ecf3a6d784ca7609.js.map
Edit
6834.0c9ef40e2f2b5428983d.js
Edit
6834.0c9ef40e2f2b5428983d.js.map
Edit
6857.252a60422ee275193aa7.js
Edit
6857.252a60422ee275193aa7.js.map
Edit
6940.b6c74df14413f0188f0d.js
Edit
6940.b6c74df14413f0188f0d.js.map
Edit
6990.d663924714fc213b17c6.js
Edit
6990.d663924714fc213b17c6.js.map
Edit
7018.5a037d2577fedc8d10f1.js
Edit
7018.5a037d2577fedc8d10f1.js.map
Edit
7031.047b15171c23b248efa0.js
Edit
7031.047b15171c23b248efa0.js.map
Edit
7033.141597840e42815ef6a4.js
Edit
7033.141597840e42815ef6a4.js.map
Edit
7048.3746fc9a274bf8ff72f1.js
Edit
7048.3746fc9a274bf8ff72f1.js.map
Edit
7051.604a402d305e093c00c2.js
Edit
7051.604a402d305e093c00c2.js.map
Edit
7061.f18464bcd6c6d7455662.js
Edit
7061.f18464bcd6c6d7455662.js.map
Edit
7080.9cdd1b7a0bf62b48e1fe.js
Edit
7080.9cdd1b7a0bf62b48e1fe.js.map
Edit
7200.d4425528f6cee80f9931.js
Edit
7200.d4425528f6cee80f9931.js.map
Edit
7235.46f071d3e4d0bb976223.js
Edit
7235.46f071d3e4d0bb976223.js.map
Edit
7246.03f5a8496e53f64602e2.js
Edit
7246.03f5a8496e53f64602e2.js.map
Edit
7249.3bea4aaf890f89fdad45.js
Edit
7249.3bea4aaf890f89fdad45.js.map
Edit
7299.cdff402b076dfea09ead.js
Edit
7299.cdff402b076dfea09ead.js.map
Edit
7348.6fd722455e8c7e077815.js
Edit
7348.6fd722455e8c7e077815.js.map
Edit
7396.ded473b7a47dc42fbb59.js
Edit
7396.ded473b7a47dc42fbb59.js.map
Edit
7466.b7c17c526c7b734dd5f7.js
Edit
7466.b7c17c526c7b734dd5f7.js.map
Edit
7539.5f405cae3b15e1e2f6fa.js
Edit
7539.5f405cae3b15e1e2f6fa.js.map
Edit
7585.084552e02c66201a55be.js
Edit
7585.084552e02c66201a55be.js.map
Edit
7626.38819cc0696f2d25cf99.js
Edit
7626.38819cc0696f2d25cf99.js.map
Edit
7651.5024ed8dd1beb08d01ab.js
Edit
7651.5024ed8dd1beb08d01ab.js.map
Edit
7681.7ef7b4f86e99abd7b7e1.js
Edit
7681.7ef7b4f86e99abd7b7e1.js.map
Edit
7691.0ad86f0c686b19ce829e.js
Edit
7691.0ad86f0c686b19ce829e.js.map
Edit
7790.4c141092868e7208a087.js
Edit
7790.4c141092868e7208a087.js.map
Edit
7806.dff3509790e494ca5a45.js
Edit
7806.dff3509790e494ca5a45.js.map
Edit
7836.afe37ef4be354f0a3b91.js
Edit
7836.afe37ef4be354f0a3b91.js.map
Edit
7882.e1721e9d6ac2d421bcda.js
Edit
7882.e1721e9d6ac2d421bcda.js.map
Edit
7886.8499ded396232466be7d.js
Edit
7886.8499ded396232466be7d.js.map
Edit
7887.a6dcfd824d57598ba1c3.js
Edit
7887.a6dcfd824d57598ba1c3.js.map
Edit
7969.a048d8060cabf1aede33.js
Edit
7969.a048d8060cabf1aede33.js.map
Edit
7996.bd232896e4559d37a26f.js
Edit
7996.bd232896e4559d37a26f.js.map
Edit
8016.8145cd87abcdd0646db2.js
Edit
8016.8145cd87abcdd0646db2.js.map
Edit
8018.c31846109f2dff21d8c4.js
Edit
8018.c31846109f2dff21d8c4.js.map
Edit
8056.4e8f71ed4d507f89b487.js
Edit
8056.4e8f71ed4d507f89b487.js.map
Edit
8177.52abd0953ac914f69e26.js
Edit
8177.52abd0953ac914f69e26.js.map
Edit
8220.aeea4a8f0893b3447b56.js
Edit
8220.aeea4a8f0893b3447b56.js.map
Edit
8224.75bd73bf51ff7a2fc4a0.js
Edit
8224.75bd73bf51ff7a2fc4a0.js.map
Edit
8230.d65bce2998eec95c6082.js
Edit
8230.d65bce2998eec95c6082.js.map
Edit
8260.c1da67af19b9259d5651.js
Edit
8260.c1da67af19b9259d5651.js.map
Edit
8271.0ee36e030014244adb47.js
Edit
8271.0ee36e030014244adb47.js.map
Edit
8332.a62e8632a336661f2969.js
Edit
8332.a62e8632a336661f2969.js.map
Edit
8334.1196f5ddcef25711fc25.js
Edit
8334.1196f5ddcef25711fc25.js.map
Edit
8347.de402f9280cd7a316c57.js
Edit
8347.de402f9280cd7a316c57.js.map
Edit
8390.9de755da2e214cc845a3.js
Edit
8390.9de755da2e214cc845a3.js.map
Edit
8393.30e95ae45cbe5455dcda.js
Edit
8393.30e95ae45cbe5455dcda.js.map
Edit
8477.4dad0537d13cf9315e86.js
Edit
8477.4dad0537d13cf9315e86.js.map
Edit
8494.659892f00c9d15ae441a.js
Edit
8494.659892f00c9d15ae441a.js.map
Edit
8530.0460c988ee4a40ce7769.js
Edit
8530.0460c988ee4a40ce7769.js.map
Edit
8542.317c15ed57f68fcf0c97.js
Edit
8542.317c15ed57f68fcf0c97.js.map
Edit
8547.390120a5caf7646e0e3e.js
Edit
8547.390120a5caf7646e0e3e.js.map
Edit
8566.5c8f392bb383ab92eed0.js
Edit
8566.5c8f392bb383ab92eed0.js.map
Edit
8622.5acf73c1485a11dfb0ab.js
Edit
8622.5acf73c1485a11dfb0ab.js.map
Edit
8706.f17afa6bcdfd511d5b03.js
Edit
8706.f17afa6bcdfd511d5b03.js.map
Edit
874.d24410518317d605c708.js
Edit
874.d24410518317d605c708.js.map
Edit
8813.e5137844631f6ddedbce.js
Edit
8813.e5137844631f6ddedbce.js.map
Edit
8856.2720526447b3adb5c75f.js
Edit
8856.2720526447b3adb5c75f.js.map
Edit
886.5f3383e84b10a6530b97.js
Edit
886.5f3383e84b10a6530b97.js.map
Edit
8864.2f4ee982114c25634e55.js
Edit
8864.2f4ee982114c25634e55.js.map
Edit
8902.71f14964ec6cea84dc8e.js
Edit
8902.71f14964ec6cea84dc8e.js.map
Edit
8932.e59e50ddb63414e0f2b9.js
Edit
8932.e59e50ddb63414e0f2b9.js.map
Edit
8990.665213a5c89afd6b2f83.js
Edit
8990.665213a5c89afd6b2f83.js.map
Edit
9034.a32e36472481cbe5d72d.js
Edit
9034.a32e36472481cbe5d72d.js.map
Edit
9038.f03b25f160057d4a0bf6.js
Edit
9038.f03b25f160057d4a0bf6.js.map
Edit
904.b68cd2a0cd6d68c5f1ae.js
Edit
904.b68cd2a0cd6d68c5f1ae.js.map
Edit
9044.441f64d6d946cc93be46.js
Edit
9044.441f64d6d946cc93be46.js.map
Edit
9147.8309cadbc384209d62e5.js
Edit
9147.8309cadbc384209d62e5.js.map
Edit
9150.38487365ffd149b730af.js
Edit
9150.38487365ffd149b730af.js.map
Edit
9292.e6befb57f8f116ad95a8.js
Edit
9292.e6befb57f8f116ad95a8.js.map
Edit
9355.95d7e1782f93f339549e.js
Edit
9355.95d7e1782f93f339549e.js.map
Edit
9388.88d95a230e9432e7037b.js
Edit
9388.88d95a230e9432e7037b.js.map
Edit
9390.c72fcd228017f7647b38.js
Edit
9390.c72fcd228017f7647b38.js.map
Edit
9414.642bfe0d5eb16efd0c16.js
Edit
9414.642bfe0d5eb16efd0c16.js.map
Edit
9449.502f2a824d0203e88d4d.js
Edit
9449.502f2a824d0203e88d4d.js.map
Edit
946.48c5e8c688cf29424295.js
Edit
946.48c5e8c688cf29424295.js.map
Edit
9473.e6fc327da88d88712828.js
Edit
9473.e6fc327da88d88712828.js.map
Edit
9510.1e255e96fe40aad2ed6f.js
Edit
9510.1e255e96fe40aad2ed6f.js.map
Edit
9521.e65411d726c29d77c526.js
Edit
9521.e65411d726c29d77c526.js.map
Edit
9538.a2289ff9ad06e24e391f.js
Edit
9538.a2289ff9ad06e24e391f.js.map
Edit
957.3c35d66aa698d8bdfe05.js
Edit
957.3c35d66aa698d8bdfe05.js.map
Edit
9571.41558d40bff9ea8c0726.js
Edit
9571.41558d40bff9ea8c0726.js.map
Edit
9578.9cfae16465bb9bc1f336.js
Edit
9578.9cfae16465bb9bc1f336.js.map
Edit
968.d4b150f9211c478b7b05.js
Edit
968.d4b150f9211c478b7b05.js.map
Edit
970.46f17b76711e4961a575.js
Edit
970.46f17b76711e4961a575.js.map
Edit
9700.02180b7a06c8a1f7606b.js
Edit
9700.02180b7a06c8a1f7606b.js.map
Edit
9744.aa6baaf988a68fa6a9ba.js
Edit
9744.aa6baaf988a68fa6a9ba.js.map
Edit
9820.6b462d83575efd05c883.js
Edit
9820.6b462d83575efd05c883.js.map
Edit
9838.06bd7dfd4290786f80e3.js
Edit
9838.06bd7dfd4290786f80e3.js.map
Edit
9992.fb08517d3ff77e887443.js
Edit
9992.fb08517d3ff77e887443.js.map
Edit
9996.21c451f22ff76b4bb683.js
Edit
9996.21c451f22ff76b4bb683.js.map
Edit
AdminAuthentication.076c98c6380fd1e42f7e.js
Edit
AdminAuthentication.076c98c6380fd1e42f7e.js.map
Edit
AdminEditOrgPage.8df8167ea6ff8f4803bd.js
Edit
AdminEditOrgPage.8df8167ea6ff8f4803bd.js.map
Edit
AdminListOrgsPage.176dac9ed391bda8952b.js
Edit
AdminListOrgsPage.176dac9ed391bda8952b.js.map
Edit
AdminSettings.7373ed8fa9b943bb2098.js
Edit
AdminSettings.7373ed8fa9b943bb2098.js.map
Edit
AlertGroups.81264e6e5009c36eed6e.js
Edit
AlertGroups.81264e6e5009c36eed6e.js.map
Edit
AlertRuleListIndex.98e7328feeaa2ffe67eb.js
Edit
AlertRuleListIndex.98e7328feeaa2ffe67eb.js.map
Edit
AlertingDisabled.b2c834be0ca4666dd793.js
Edit
AlertingDisabled.b2c834be0ca4666dd793.js.map
Edit
AlertingGroupDetails.3a2c6ef8085b505852e4.js
Edit
AlertingGroupDetails.3a2c6ef8085b505852e4.js.map
Edit
AlertingGroupEdit.69cfe9d5f37a1fc65326.js
Edit
AlertingGroupEdit.69cfe9d5f37a1fc65326.js.map
Edit
AlertingHome.06f307ab9a2a5d8b7f93.js
Edit
AlertingHome.06f307ab9a2a5d8b7f93.js.map
Edit
AlertingImportFromDSRules.f1224bcb622d25e2c94f.js
Edit
AlertingImportFromDSRules.f1224bcb622d25e2c94f.js.map
Edit
AlertingRedirectToRule.9ed1d16829d6833d2827.js
Edit
AlertingRedirectToRule.9ed1d16829d6833d2827.js.map
Edit
AlertingRuleForm.2e69d3f00eb6221e7355.js
Edit
AlertingRuleForm.2e69d3f00eb6221e7355.js.map
Edit
AlertingSettings.7a5f782f877cec4790cb.js
Edit
AlertingSettings.7a5f782f877cec4790cb.js.map
Edit
AlertingTriage.1174f36b4937ad0047c1.js
Edit
AlertingTriage.1174f36b4937ad0047c1.js.map
Edit
BenchmarksPage.ef387f4598ba2b2236ad.js
Edit
BenchmarksPage.ef387f4598ba2b2236ad.js.map
Edit
BookmarksPage.8fe93eb7377073f0c985.js
Edit
BookmarksPage.8fe93eb7377073f0c985.js.map
Edit
ChangePasswordPage.f21b0b1dd107ccd33c1a.js
Edit
ChangePasswordPage.f21b0b1dd107ccd33c1a.js.map
Edit
Connections.949b6389e73bcadb2109.js
Edit
Connections.949b6389e73bcadb2109.js.map
Edit
ContactPoints.9ae2d1927d60c6169b87.js
Edit
ContactPoints.9ae2d1927d60c6169b87.js.map
Edit
CorrelationsFeatureToggle.ec2f1aefce6b456e15eb.js
Edit
CorrelationsFeatureToggle.ec2f1aefce6b456e15eb.js.map
Edit
CorrelationsPage.bd7fcd24ed0b5fe8ac3e.js
Edit
CorrelationsPage.bd7fcd24ed0b5fe8ac3e.js.map
Edit
CreateTeam.429acf93986740280312.js
Edit
CreateTeam.429acf93986740280312.js.map
Edit
DashboardImport.3e9b6f980b81d6f1c755.js
Edit
DashboardImport.3e9b6f980b81d6f1c755.js.map
Edit
DashboardListPage.abeb0c29f072f888f9fb.js
Edit
DashboardListPage.abeb0c29f072f888f9fb.js.map
Edit
DashboardPage.72557fe6dd1a022b7d48.js
Edit
DashboardPage.72557fe6dd1a022b7d48.js.map
Edit
DashboardPageProxy.80adfefad8a885d8e2ef.js
Edit
DashboardPageProxy.80adfefad8a885d8e2ef.js.map
Edit
DashboardScenePage.83fe1fa9509b50120d65.js
Edit
DashboardScenePage.83fe1fa9509b50120d65.js.map
Edit
EditContactPoint.0c33428ddc8ba974d946.js
Edit
EditContactPoint.0c33428ddc8ba974d946.js.map
Edit
EditMuteTiming.8760cc9c77560acf0cd6.js
Edit
EditMuteTiming.8760cc9c77560acf0cd6.js.map
Edit
EditRepositoryPage.d71faaab1af2c8d70a22.js
Edit
EditRepositoryPage.d71faaab1af2c8d70a22.js.map
Edit
EmbeddedDashboard.57de550bce819e3d52e6.js
Edit
EmbeddedDashboard.57de550bce819e3d52e6.js.map
Edit
FileHistoryPage.154ab77c19bbe0ebed20.js
Edit
FileHistoryPage.154ab77c19bbe0ebed20.js.map
Edit
FileStatusPage.36f58cd61202ec603d22.js
Edit
FileStatusPage.36f58cd61202ec603d22.js.map
Edit
FolderAlerting.0b9acb6c42276aaee57d.js
Edit
FolderAlerting.0b9acb6c42276aaee57d.js.map
Edit
FolderLibraryPanelsPage.44f8cabf542ec314d176.js
Edit
FolderLibraryPanelsPage.44f8cabf542ec314d176.js.map
Edit
GettingStartedPage.4bea37f1c9bdcfd0f41b.js
Edit
GettingStartedPage.4bea37f1c9bdcfd0f41b.js.map
Edit
GlobalConfig.1377596507974d18caf6.js
Edit
GlobalConfig.1377596507974d18caf6.js.map
Edit
HistoryPage.4da98f4fa313ee3676ca.js
Edit
HistoryPage.4da98f4fa313ee3676ca.js.map
Edit
LdapSettingsPage.0e9f08d5e59150ecf466.js
Edit
LdapSettingsPage.0e9f08d5e59150ecf466.js.map
Edit
LibraryPanelsPage.824580d7751526c658e2.js
Edit
LibraryPanelsPage.824580d7751526c658e2.js.map
Edit
ListPublicDashboardPage.64c26ffd3ebe6c9076f3.js
Edit
ListPublicDashboardPage.64c26ffd3ebe6c9076f3.js.map
Edit
LoginPage.db48423ed1b455431daa.js
Edit
LoginPage.db48423ed1b455431daa.js.map
Edit
MetricsDrilldownRedirect.fcad4bdff346974952f4.js
Edit
MetricsDrilldownRedirect.fcad4bdff346974952f4.js.map
Edit
MigrateToCloud.5b474ad00e8a3d979750.js
Edit
MigrateToCloud.5b474ad00e8a3d979750.js.map
Edit
NewMuteTiming.2f6302420674f1c73aba.js
Edit
NewMuteTiming.2f6302420674f1c73aba.js.map
Edit
NewOrgPage.be31eaee06e2043d609b.js
Edit
NewOrgPage.be31eaee06e2043d609b.js.map
Edit
NewReceiverView.f1d83eb66a39882b8661.js
Edit
NewReceiverView.f1d83eb66a39882b8661.js.map
Edit
NewSilencePage.2643a48031f7e5d8f376.js
Edit
NewSilencePage.2643a48031f7e5d8f376.js.map
Edit
NotificationPoliciesPage.9333d10ecad1452ebf27.js
Edit
NotificationPoliciesPage.9333d10ecad1452ebf27.js.map
Edit
NotificationsPage.57df4ff5ba1433a4345d.js
Edit
NotificationsPage.57df4ff5ba1433a4345d.js.map
Edit
OrgDetailsPage.7b5835c30585aae81343.js
Edit
OrgDetailsPage.7b5835c30585aae81343.js.map
Edit
PlaylistEditPage.8310e384af659e40c313.js
Edit
PlaylistEditPage.8310e384af659e40c313.js.map
Edit
PlaylistNewPage.f45b642a98a747e28c0d.js
Edit
PlaylistNewPage.f45b642a98a747e28c0d.js.map
Edit
PlaylistPage.9af74957a1cdfb125338.js
Edit
PlaylistPage.9af74957a1cdfb125338.js.map
Edit
PlaylistStartPage.8011a98267ac64c7fa05.js
Edit
PlaylistStartPage.8011a98267ac64c7fa05.js.map
Edit
PluginExtensionsLog.54c02047d569b0c05823.js
Edit
PluginExtensionsLog.54c02047d569b0c05823.js.map
Edit
PluginListPage.e50c18fed21c23ca4ee8.js
Edit
PluginListPage.e50c18fed21c23ca4ee8.js.map
Edit
PluginPage.ae424531bce63dd4721e.js
Edit
PluginPage.ae424531bce63dd4721e.js.map
Edit
ProfileFeatureTogglePage.27378dcbb7520611348e.js
Edit
ProfileFeatureTogglePage.27378dcbb7520611348e.js.map
Edit
ProvisioningWizardPage.c4e4a8f431b4719b0e95.js
Edit
ProvisioningWizardPage.c4e4a8f431b4719b0e95.js.map
Edit
PublicDashboardPage.33d6ec8f685f1b70b9a6.js
Edit
PublicDashboardPage.33d6ec8f685f1b70b9a6.js.map
Edit
RecentlyDeleted.5e0ec16474d939fd9683.js
Edit
RecentlyDeleted.5e0ec16474d939fd9683.js.map
Edit
RecentlyDeletedPage.1dbc2b80b28204de8237.js
Edit
RecentlyDeletedPage.1dbc2b80b28204de8237.js.map
Edit
RepositoryListPage.ec3a0af1cbe2740800bf.js
Edit
RepositoryListPage.ec3a0af1cbe2740800bf.js.map
Edit
RepositoryStatusPage.9aee60589e35a4a19ec2.js
Edit
RepositoryStatusPage.9aee60589e35a4a19ec2.js.map
Edit
SelectOrgPage.910a8d842019a6d7fe93.js
Edit
SelectOrgPage.910a8d842019a6d7fe93.js.map
Edit
SendResetMailPage.513361d6980f98ff8139.js
Edit
SendResetMailPage.513361d6980f98ff8139.js.map
Edit
ServerStats.2830ca154f465dbdecea.js
Edit
ServerStats.2830ca154f465dbdecea.js.map
Edit
ServiceAccountCreatePage.80fcbdd2b7f5aa4e2da1.js
Edit
ServiceAccountCreatePage.80fcbdd2b7f5aa4e2da1.js.map
Edit
ServiceAccountPage.48944056459bb412ff33.js
Edit
ServiceAccountPage.48944056459bb412ff33.js.map
Edit
ServiceAccountsPage.d20b1eb9f87661f10b45.js
Edit
ServiceAccountsPage.d20b1eb9f87661f10b45.js.map
Edit
SignupInvited.fe2c29f380e9888c28cf.js
Edit
SignupInvited.fe2c29f380e9888c28cf.js.map
Edit
SilencesTablePage.b998fdbdcc3d60a81739.js
Edit
SilencesTablePage.b998fdbdcc3d60a81739.js.map
Edit
SnapshotListPage.6feaf24adb92e6a302ec.js
Edit
SnapshotListPage.6feaf24adb92e6a302ec.js.map
Edit
SoloPanelPage.7fc6a934aaadf4c1f84d.js
Edit
SoloPanelPage.7fc6a934aaadf4c1f84d.js.map
Edit
SoloPanelPageOld.bde57e000dd0a0108685.js
Edit
SoloPanelPageOld.bde57e000dd0a0108685.js.map
Edit
SupportBundles.1f46603ad3494624d67a.js
Edit
SupportBundles.1f46603ad3494624d67a.js.map
Edit
SupportBundlesCreate.5eaea61a9713f057277b.js
Edit
SupportBundlesCreate.5eaea61a9713f057277b.js.map
Edit
TeamList.6b088f83e6e8cb66b21d.js
Edit
TeamList.6b088f83e6e8cb66b21d.js.map
Edit
TeamPages.9d8b5dceef8be43c6923.js
Edit
TeamPages.9d8b5dceef8be43c6923.js.map
Edit
Templates.7a02a8497ebca052dcfb.js
Edit
Templates.7a02a8497ebca052dcfb.js.map
Edit
TestStuffPage.982c641592b2f7c9db40.js
Edit
TestStuffPage.982c641592b2f7c9db40.js.map
Edit
ThemePlayground.aeeec77fd8e9c1482f55.js
Edit
ThemePlayground.aeeec77fd8e9c1482f55.js.map
Edit
UserAdminPage.fc4d562eef05d9f59aca.js
Edit
UserAdminPage.fc4d562eef05d9f59aca.js.map
Edit
UserCreatePage.b7036214c66612fb31e9.js
Edit
UserCreatePage.b7036214c66612fb31e9.js.map
Edit
UserInvitePage.4a9bcd4084d7ae454c73.js
Edit
UserInvitePage.4a9bcd4084d7ae454c73.js.map
Edit
UserListPage.a452e1153ae820f58ac9.js
Edit
UserListPage.a452e1153ae820f58ac9.js.map
Edit
UserProfileEditPage.82c11690282e669eabb1.js
Edit
UserProfileEditPage.82c11690282e669eabb1.js.map
Edit
alert-rules-drawer-content.c95bb5ddd3fc813cae92.js
Edit
alert-rules-drawer-content.c95bb5ddd3fc813cae92.js.map
Edit
alert-rules-toolbar-button.0d86c1adae7edb55ff76.js
Edit
alert-rules-toolbar-button.0d86c1adae7edb55ff76.js.map
Edit
alertListPanel.0110106a8d1ab70d65d5.js
Edit
alertListPanel.0110106a8d1ab70d65d5.js.map
Edit
alertmanagerPlugin.2b59de5e7b7a556f87f1.js
Edit
alertmanagerPlugin.2b59de5e7b7a556f87f1.js.map
Edit
annoListPanel.0005a0eab0b05e24d970.js
Edit
annoListPanel.0005a0eab0b05e24d970.js.map
Edit
app.8385deda1df49aa75ec2.js
Edit
app.8385deda1df49aa75ec2.js.map
Edit
assets-manifest.json
Edit
barChartPanel.eecdaeab7d146d477721.js
Edit
barChartPanel.eecdaeab7d146d477721.js.map
Edit
barGaugePanel.6d9e94bbb72ba92a0e9b.js
Edit
barGaugePanel.6d9e94bbb72ba92a0e9b.js.map
Edit
candlestickPanel.af0e0decd06e7b7ab286.js
Edit
candlestickPanel.af0e0decd06e7b7ab286.js.map
Edit
canvasPanel.ddab72fab6e58c3419b2.js
Edit
canvasPanel.ddab72fab6e58c3419b2.js.map
Edit
cloudwatchPlugin.06ef34f60000c4f7ea37.js
Edit
cloudwatchPlugin.06ef34f60000c4f7ea37.js.map
Edit
dark.b66fa87185b9a313ec14.js
Edit
dashListPanel.23b954da0c4888602048.js
Edit
dashListPanel.23b954da0c4888602048.js.map
Edit
dataGridPanel.bb5d4b678cba38dd380b.js
Edit
debugPanel.fff63da32084d7a2e236.js
Edit
debugPanel.fff63da32084d7a2e236.js.map
Edit
elasticsearchPlugin.3f2edb012f5162b48903.js
Edit
elasticsearchPlugin.3f2edb012f5162b48903.js.map
Edit
explore-feature-toggle-page.3de03fa91c88d05cea1c.js
Edit
explore-feature-toggle-page.3de03fa91c88d05cea1c.js.map
Edit
explore.dd32637df83326225e0d.js
Edit
explore.dd32637df83326225e0d.js.map
Edit
flamegraphPanel.cc6c5b4bcd69e406fbb7.js
Edit
flamegraphPanel.cc6c5b4bcd69e406fbb7.js.map
Edit
gaugePanel.5da3c4e39a652e281cc4.js
Edit
gaugePanel.5da3c4e39a652e281cc4.js.map
Edit
gazetteer
Edit
geomapPanel.67ebb4567e9b5fa5074b.js
Edit
gettingStartedPanel.833059170dbbf8d5c4bf.js
Edit
gettingStartedPanel.833059170dbbf8d5c4bf.js.map
Edit
grafana.1492.25120d27db88f863e058.css
Edit
grafana.4350.a45e45977094df4a0bc9.css
Edit
grafana.5790.ffb3a9cd952d3cd7471b.css
Edit
grafana.DashboardPage.a66335f88cd003e4a44f.css
Edit
grafana.DashboardPageProxy.a66335f88cd003e4a44f.css
Edit
grafana.app.1f6473bb54b1e1647be8.css
Edit
grafana.dark.1e8d85816912aadbbba5.css
Edit
grafana.dataGridPanel.c1fc5db1829b1b31eb4d.css
Edit
grafana.geomapPanel.0057d964fa972bb207ec.css
Edit
grafana.light.111a5a99fcebc0962ddc.css
Edit
grafana.livePanel.25120d27db88f863e058.css
Edit
grafana.react-monaco-editor.ffb3a9cd952d3cd7471b.css
Edit
grafana.swagger.d0a2da197b9827204ac1.css
Edit
grafana.tablePanel.25120d27db88f863e058.css
Edit
grafanaPlugin.f21cdb4b84a732cc9dd8.js
Edit
grafanaPlugin.f21cdb4b84a732cc9dd8.js.map
Edit
heatmapPanel.7834b997bc573eddba88.js
Edit
heatmapPanel.7834b997bc573eddba88.js.map
Edit
histogramPanel.9953bfeccf8774500c0c.js
Edit
histogramPanel.9953bfeccf8774500c0c.js.map
Edit
img
Edit
influxdbPlugin.7a899e63be0a65d41e13.js
Edit
influxdbPlugin.7a899e63be0a65d41e13.js.map
Edit
light.827d442410485e491818.js
Edit
livePanel.2a43f499bc746d928d45.js
Edit
livePanel.2a43f499bc746d928d45.js.map
Edit
logsPanel.a328022d248508a083c1.js
Edit
logsPanel.a328022d248508a083c1.js.map
Edit
loki-query-field.f9a0b82b636d4821760c.js
Edit
loki-query-field.f9a0b82b636d4821760c.js.map
Edit
maps
Edit
mixedPlugin.3a69de93f366afbb2f85.js
Edit
newsPanel.c17f40f7c88ea14620e7.js
Edit
newsPanel.c17f40f7c88ea14620e7.js.map
Edit
nodeGraphPanel.f717a9075d994a9a8af4.js
Edit
nodeGraphPanel.f717a9075d994a9a8af4.js.map
Edit
opentsdbPlugin.1795eab1c223ea030c2e.js
Edit
opentsdbPlugin.1795eab1c223ea030c2e.js.map
Edit
pieChartPanel.45166aa6d57d163817ea.js
Edit
pieChartPanel.45166aa6d57d163817ea.js.map
Edit
prometheusPlugin.c3a55eb5353085fc3d2b.js
Edit
prometheusPlugin.c3a55eb5353085fc3d2b.js.map
Edit
radialBarPanel.294c52d497d8f5c2bebb.js
Edit
radialBarPanel.294c52d497d8f5c2bebb.js.map
Edit
runtime.a37cc2f12a959f33871a.js
Edit
runtime.a37cc2f12a959f33871a.js.map
Edit
sql-query-editor.e767d4a2aef360034bd9.js
Edit
sql-query-editor.e767d4a2aef360034bd9.js.map
Edit
statPanel.3a7f191bfb27fd320014.js
Edit
statPanel.3a7f191bfb27fd320014.js.map
Edit
stateTimelinePanel.08d857b143ef89dc195f.js
Edit
stateTimelinePanel.08d857b143ef89dc195f.js.map
Edit
static
Edit
statusHistoryPanel.29f7b8dc01039ba795af.js
Edit
statusHistoryPanel.29f7b8dc01039ba795af.js.map
Edit
swagger.06875a6266679f54141d.js
Edit
swagger.06875a6266679f54141d.js.map
Edit
tablePanel.43861ce2a60617dcd19d.js
Edit
tablePanel.43861ce2a60617dcd19d.js.map
Edit
textPanel.867ee60d01b2039aa159.js
Edit
textPanel.867ee60d01b2039aa159.js.map
Edit
timeseriesPanel.b4a947da450030262a31.js
Edit
timeseriesPanel.b4a947da450030262a31.js.map
Edit
tracesPanel.35bfc3e5ff6bea4212a3.js
Edit
tracesPanel.35bfc3e5ff6bea4212a3.js.map
Edit
trendPanel.001aff2bd153e737c464.js
Edit
trendPanel.001aff2bd153e737c464.js.map
Edit
vis-data.b34535ebabc0fcb91557.js
Edit
vis-data.b34535ebabc0fcb91557.js.map
Edit
vis-network.1b41caf21892c9525709.js
Edit
vis-network.1b41caf21892c9525709.js.map
Edit
welcomeBanner.1a693c9dc02006be4f0b.js
Edit
welcomeBanner.1a693c9dc02006be4f0b.js.map
Edit
xychart.cb20af67a6c495ba6ccd.js
Edit
xychart.cb20af67a6c495ba6ccd.js.map
Edit