web-interface.assets.4e85aa7a-5343.eb9f3cea01fef4beb5e4.js.map Maven / Gradle / Ivy
{"version":3,"file":"4e85aa7a-5343.eb9f3cea01fef4beb5e4.js","mappings":"oOAsBA,MAAMA,EAAY,CAChB,CAAEC,MAAO,0BAA2BC,KAAMC,EAAAA,GAAAA,OAAAA,eAAAA,SAAAA,UAC1C,CAAEF,MAAO,iBAAkBC,KAAMC,EAAAA,GAAAA,OAAAA,eAAAA,eAAAA,OASnC,EANqC,IACnC,gBAAC,KAAD,KACE,gBAAC,IAAD,CAAgBC,MAAOJ,I,4GCD3B,MAqBA,EArB2B,QAAC,cAAEK,EAAF,gBAAiBC,GAAlB,SACzB,gBAAC,KAAD,KACE,gBAAC,IAAD,CAAeC,GAAIJ,EAAAA,GAAAA,OAAAA,eAAAA,SAAAA,QACjB,gBAAC,KAAD,CAAQK,UAAWF,IAAoBD,GAAvC,wBAIF,gBAAC,IAAD,CAAeE,GAAIJ,EAAAA,GAAAA,OAAAA,eAAAA,SAAAA,KAA2CE,aAA3C,EAA2CA,EAAeI,KAC3E,gBAAC,KAAD,CAAQD,UAAWH,IAAkBC,EAC7BI,KAAK,UADb,wBAKF,gBAAC,IAAD,CAAeH,GAAIJ,EAAAA,GAAAA,OAAAA,eAAAA,SAAAA,QACjB,gBAAC,KAAD,CAAQQ,QAAQ,UAAUD,KAAK,UAA/B,mBAdqB,C,yCCV3B,MAoDA,GAAiBE,SA1BA,QAAC,QAChBC,EADgB,eAEhBC,EAFgB,qBAGhBC,EAHgB,mBAIhBC,EAJgB,KAKhBN,EALgB,yBAMhBO,EANgB,oBAOhBC,EAPgB,iBAQhBC,EARgB,oBAShBC,EATgB,yBAUhBC,EAVgB,oBAWhBC,GAXe,QAYwD,CACvET,UACAU,aAAcT,EACdU,mBAAoB,CAAEC,MAAOV,EAAqBW,QAClDC,kBAAmBX,EACnBN,KAAMA,EACNkB,sBAAuBX,EACvBY,kBAAmBX,EACnBY,eAAgBX,EAChBY,kBAAmBX,EACnBY,sBAAuBX,EACvBY,mBAAoBX,EAvBL,EA0BUY,OApDZ,QAAC,QACdrB,EADc,aAEdU,EAFc,mBAGdC,EAHc,kBAIdG,EAJc,KAKdjB,EALc,sBAMdkB,EANc,kBAOdC,EAPc,eAQdC,EARc,kBASdC,EATc,sBAUdC,EAVc,mBAWdC,GAXa,QAY0D,CACvEpB,UACAC,eAAgBS,EAChBR,qBAAsB,CAAEW,OAAQF,EAAmBC,OACnDT,mBAAoBW,EACpBjB,KAAMA,EACNO,yBAA0BW,EAC1BV,oBAAqBW,EACrBV,iBAAkBW,EAClBV,oBAAqBW,EACrBV,yBAA0BW,EAC1BV,oBAAqBW,EAvBR,G,oICcf,MAUME,EAAmB,IAA0D,IAAvDC,sBAAuBC,EAAzB,MAAsCpC,GAAmB,EACjF,MAAM,gBAAEK,EAAF,cAAmBD,IAAkBiC,EAAAA,EAAAA,KACrCC,EAZW,EAACF,EAAapC,KAC/B,GAAIoC,EAAa,CACf,MAAMG,EAAeC,EAAAA,EAAAA,qBAAiCJ,EAAYpC,MAAO,IAEzE,OAAO,iEAAgC,yBAAIuC,GAC5C,CAED,OAAOvC,GAAS,oCAAhB,EAKkByC,CAAWL,EAAapC,GAE1C,OACE,gCACE,gBAAC0C,EAAA,EAAD,MACA,gBAAC,KAAD,CAAY1C,MAAOsC,EACPK,QACE,gBAACC,EAAA,EAAD,CAAoBxC,cAAeA,EACfC,gBAAiBA,IAEvCwC,kBAAmB,CACjB7C,MAAO,+BACPC,KAAM6C,EAAAA,EAAAA,MAAAA,cAElB,qGAZN,EAkBFZ,EAAiBa,aAAe,CAC9BZ,2BAAuBa,EACvBhD,WAAOgD,GAGT,U,oCC5CA,iBAAgBC,EAA8BC,EAA8BC,GAAkH,IAAtDC,IAAsD,yDAC5L,MAAMC,GAA4BC,EAAAA,EAAAA,MAC5BC,EAAkB,IAAMC,EAAAA,EAAAA,QAAyB,mDAAoD,WACrGC,EAAiBC,GAAUF,EAAAA,EAAAA,MAAwB,uDAAsDE,IAAS,SAExH,OAAOC,EAAAA,EAAAA,OAA6BV,GAASW,MAAMC,GAC7CA,EAAOC,SAAWZ,EAAWa,mBAAqBV,GAA6BD,EAC1EC,EAA0BV,QAAQqB,iCAAgC,EAAOd,EAAYW,EAAOC,QAAQtD,GAAI2C,GAAaS,KAAKL,IAGnIA,IAEOM,KACNI,OAAOP,IAER,MADAD,EAAcC,GACRA,CAAN,GAfJ,E,6JC2CA,MAAMQ,EAAe,CACnBC,cAAe,GACfC,6BAAyBpB,EACzBqB,gBAAiB,CAAElB,YAAa,GAAImB,aAAc,IAClDpB,WAAY,CAAC,EACbqB,gBAAiB,GACjBC,cAAe,QAGXC,EAAuBC,EAAAA,cAAuCR,GACpE,GAAeS,EAAAA,EAAAA,IAAU,2DAA2D,IAAMF,I,oCCjDnF,MAAMG,EAAW,uBAGXC,EAAkB,CAC7B7E,MAAO,CACL8E,UAAU,GAEZC,WAAY,CACVD,UAAU,GAEZE,WAAY,CACVF,UAAU,EACVG,IAAK,EACLC,IAAK,OAEPC,YAAa,CAAC,EACdzD,kBAAmB,CAAC,EACpBM,mBAAoB,CAAC,EACrBV,aAAc,CAAC,EACfC,mBAAoB,CAAC,GAGjB6D,EAAYC,EAAAA,QAAAA,IAAAA,WAAH,uEAAGA,CAAH,gNAsBTC,EAAkBD,EAAAA,QAAAA,IAAAA,WAAH,6EAAGA,CAAH,6CAuLrB,EAtKyB,IAA2F,IAA1F,QAAEE,EAAF,KAAWC,EAAO,CAAC,EAAnB,SAAsBC,EAAtB,YAAgCC,EAAhC,eAA6CC,EAA7C,gBAA6DC,GAA6B,EAElH,MAAM,cAAEpB,KAAkBqB,IAAeC,EAAAA,EAAAA,YAAWrB,IAC9C,wBAAEL,EAAyBC,iBAAiB,mBAAE0B,IAAyBF,EAEvEG,EAA6B,CAACC,EAAOC,EAAQC,EAAeC,KAChE,MAAMC,EAAeH,EAAOxE,kBACtB4E,EAAWL,EAAMM,OAAOC,MAIT,QAAjBH,GAAuC,QAAbC,GAFP,MAE6BJ,EAAOlB,YACzDmB,EAAc,aAJI,KAOC,QAAjBE,GAAuC,QAAbC,GAPV,MAOgCJ,EAAOlB,YACzDmB,EAAc,aAPO,KAUvBC,EAASH,EAAT,EAWF,OACE,gBAAC,EAAAQ,OAAD,CAAQC,cAAeb,EAAW3C,WAC1ByD,SAAUpB,EACVqB,cAAexC,EACfqB,SAAUA,EACVoB,gBAAgB,EAChBC,kBAAkB,EAClBlB,gBAAiBA,IACtB,QAAC,aAAEmB,EAAF,cAAgBZ,EAAhB,OAA+BD,EAA/B,aAAuCc,GAAxC,SACC,gBAAC,EAAAC,KAAD,CAAMC,UAAU,wBACd,gBAAC,KAAD,CAAiB1B,KAAMA,EAAKxF,MACXmH,MAAM,QACNC,KAAK,QACLC,YAAY,UAE7B,gBAAC,KAAD,CAAiB7B,KAAMA,EAAKL,YACXgC,MAAO,+CAAc,gBAAC,KAAD,OACrB1G,KAAK,WACL2G,KAAK,cACLC,YAAY,gBAE7B,gBAAC,KAAD,CAAO7G,GAAG,WACH2G,MAAM,iBACNG,eAAe,WACfC,iBAAiB,YACtB,gCACE,gBAACnC,EAAD,CAAW8B,UAAU,eACnB,gBAAC,KAAD,CAAaM,mBAAmB,GACnBJ,KAAK,aACL5G,GAAG,aACHkD,MAAOU,aAAF,EAAEA,EAAyBW,WAChCsC,YAAY,WACZI,UAAUC,EAAAA,EAAAA,IAAc7C,EAAgBE,cACrD,wBAAMmC,UAAU,2CAAhB,KACA,gBAAC,KAAD,CAAaM,mBAAmB,GACnBJ,KAAK,aACL5G,GAAG,aACHkD,MAAOU,aAAF,EAAEA,EAAyBY,WAChCqC,YAAY,OACZ5G,KAAK,SACLgH,UAAUC,EAAAA,EAAAA,IAAc7C,EAAgBG,eAGvD,gBAACM,EAAD,KACE,gBAAC,EAAAqC,MAAD,CAAOP,KAAK,sBACT,QAAGQ,OAAO,KAAER,EAAF,SAAQhB,EAAR,OAAkByB,EAAlB,MAA0BrB,IAApC,SACC,gCACE,gBAAC,KAAD,CAAOsB,eAA0B,SAAVtB,EAChBgB,mBAAmB,GACnBhH,GAAI4G,EACJD,MAAM,OACNU,OAAQA,EACRzB,SAAW2B,GAAM/B,EAA2B+B,EAAG7B,EAAQC,EAAeC,GACtE3F,KAAK,QACL+F,MAAM,SACb,gBAAC,KAAD,CAAOsB,eAA0B,QAAVtB,EAChBgB,mBAAmB,GACnBhH,GAAI4G,EACJD,MAAM,MACNU,OAAQA,EACRzB,SAAW2B,GAAM/B,EAA2B+B,EAAG7B,EAAQC,EAAeC,GACtE3F,KAAK,QACL+F,MAAM,QACb,gBAAC,KAAD,CAAOsB,eAA0B,cAAVtB,EAChBgB,mBAAmB,GACnBhH,GAAI4G,EACJD,MAAM,WACNU,OAAQA,EACRzB,SAAW2B,GAAM/B,EAA2B+B,EAAG7B,EAAQC,EAAeC,GACtE3F,KAAK,QACL+F,MAAM,cAzBhB,IA8BH,gBAAC,KAAD,CAAagB,mBAAmB,GACnBL,MAAM,sBACNC,KAAK,qBACL5G,GAAG,qBACHC,KAAK,gBAKxB,gBAAC,KAAD,CAAiB+E,KAAMA,EAAKlE,aACXoC,MAAOU,aAAF,EAAEA,EAAyB9C,aAChC6F,MAAO,kDAAiB,gBAAC,KAAD,OACxBC,KAAK,eACLK,UAAUC,EAAAA,EAAAA,IAAc7C,EAAgBvD,cACxC+F,YAAY,mBAE3BtB,QAAoD/C,IAA9BkD,EAAO3E,mBAC7B,gBAAC,KAAD,CAAOf,GAAG,iBACH2G,MAAO,mDAAkB,gBAAC,KAAD,OACzBG,eAAe,WACfC,iBAAiB,YACtB,gBAAC,KAAD,CAAQ9G,KAAK,SAASuH,QAAS,IAAM7B,EAAc,qBAAsB,KAAzE,mBAKF,gBAAC,KAAD,CAAiB8B,aAAa,kCACbC,YAAcnC,QAAoD/C,IAA9BkD,EAAO3E,mBACzC,gBAAC,KAAD,CAAQd,KAAK,SAASuH,QAAS,IAAM7B,EAAc,0BAAsBnD,IAAzE,mBAGEA,EACJwC,KAAMA,EAAKjE,mBACX4F,MAAO,mDAAkB,gBAAC,KAAD,OACzBC,KAAK,qBACL1D,MAAOU,aAAF,EAAEA,EAAyB7C,mBAChC8F,YAAY,kBACZI,UAAUC,EAAAA,EAAAA,IAAc7C,EAAgBtD,oBACxCd,KAAK,aAGvBkF,EAED,gBAAC,KAAD,CAAeuB,UAAU,cACvB,gBAAC,KAAD,CAAQ3G,SAAUwG,EACViB,QAAS,IAhILhB,KACpBA,IAAepD,MAAMuE,KACdC,EAAAA,EAAAA,IAAcD,IACjBzC,GACD,GAHH,EA+H+B2C,CAAarB,GAC5BvG,KAAK,UAFb,yBAKA,gBAAC,KAAD,CAAQC,QAAQ,UACRH,SAAUwG,EACVtG,KAAK,UAFb,+BApHL,GARL,EC1FWmE,EAAW,uBAGXC,EAAkB,CAC7ByD,aAAc,CAAExD,UAAU,GAC1BnD,sBAAuB,CAAEmD,UAAU,GACnClD,kBAAmB,CAAEkD,UAAU,GAC/BjD,eAAgB,CAAEiD,UAAU,GAC5BhD,kBAAmB,CAAEgD,UAAU,GAC/B/C,sBAAuB,CAAC,GAqI1B,EAvHqB,IAAuH,IAAtH,KAAEyD,EAAO,CAAC,EAAV,eAAa+C,EAAiB,CAAC,EAA/B,QAAkChD,EAAlC,SAA2CE,EAA3C,YAAqDC,EAArD,eAAkEC,EAAlE,gBAAkFC,EAAlF,MAAmG4C,GAAmB,EAE1I,MAAM,cAAEhE,KAAkBqB,IAAeC,EAAAA,EAAAA,YAAWrB,IAC9C,wBAAEL,GAA4ByB,EAC9B4C,EAAeD,EAAME,KAAKC,IAAD,CAAaxB,MAAOwB,EAAKvB,KAAMZ,MAAOmC,EAAKnI,OAAOoI,UAUjF,OACE,gBAAC,EAAAnC,OAAD,CAAQC,cAAeb,EAAW3C,WAC1B0D,cAAexC,EACfuC,SAAUpB,EACVE,SAAUA,EACVoB,gBAAgB,EAChBC,kBAAkB,EAClBlB,gBAAiBA,IACtB,QAAC,aAAEmB,EAAF,aAAgBC,GAAjB,SACC,gBAAC,EAAAC,KAAD,CAAMC,UAAU,wBACd,gBAAC,KAAD,CAAiB1B,KAAMA,EAAK3D,eACXsF,MAAM,iBACNzD,MAAOU,aAAF,EAAEA,EAAyBvC,eAChCuF,KAAK,iBACLC,YAAY,iBACZI,UAAUC,EAAAA,EAAAA,IAAc7C,EAAgBhD,kBAEzD,gBAAC,KAAD,CAAiB2D,KAAMA,EAAK1D,kBACXqF,MAAM,iBACNC,KAAK,oBACL1D,MAAOU,aAAF,EAAEA,EAAyBtC,kBAChCuF,YAAY,iBACZI,UAAUC,EAAAA,EAAAA,IAAc7C,EAAgB/C,qBAEzD,gBAAC,KAAD,CAAiB0D,KAAMA,EAAK5D,kBACXuF,MAAM,iBACNC,KAAK,oBACL1D,MAAOU,aAAF,EAAEA,EAAyBxC,kBAChCyF,YAAY,iBACZI,UAAUC,EAAAA,EAAAA,IAAc7C,EAAgBjD,qBAEzD,gBAAC,KAAD,CAAiB4D,KAAMA,EAAK7D,sBACXwF,MAAM,sBACNC,KAAK,wBACLC,YAAY,sBACZ3D,MAAOU,aAAF,EAAEA,EAAyBzC,sBAChC8F,UAAUC,EAAAA,EAAAA,IAAc7C,EAAgBlD,0BAEvD4G,EAAexG,uBACf,gBAAC,KAAD,CAAiByD,KAAMA,EAAKzD,sBACXoF,MAAM,eACNC,KAAK,wBACLC,YAAY,eACZ3D,MAAOU,aAAF,EAAEA,EAAyBrC,sBAChC0F,UAAUC,EAAAA,EAAAA,IAAc7C,EAAgB9C,yBAG3D,gBAAC,KAAD,KACE,gBAAC,KAAD,CAAK8G,GAAI,EAAGC,SAAU,GACpB,gBAAC,KAAD,CAAOpI,QAAQ,QAAf,8EAC8EmF,EAAWxB,gBAAgBC,aADzG,wGAOJ,gBAAC,EAAAqD,MAAD,CAAOP,KAAK,eAAeK,UAAUC,EAAAA,EAAAA,IAAc7C,EAAgByD,gBAChE,QAAGV,OAAO,KAAER,EAAF,MAAQZ,EAAR,SAAeJ,EAAf,OAAyByB,GAAUkB,MAAM,MAAErF,IAArD,SACC,gBAAC,KAAD,CAAOhD,QAASgD,EAAQ,aAAUV,EAC3BwC,KAAMA,EAAK8C,aACX5E,MAAOA,QAAAA,EAASU,aAAX,EAAWA,EAAyBkE,aACzC9H,GAAG,uBACH2G,MAAM,gBACNG,eAAe,WACfC,iBAAiB,YACtB,gBAAC,KAAD,CAAQyB,WAAY,CAAE,aAAc,oBAC5BC,OAAK,EACLpB,OAAQA,EACRzB,SAAW8C,GAAkB9C,EAAS,CAAEG,OAAQ,CAAEC,MAAO0C,EAAe9B,UACxE+B,QAASV,EACTpB,YAAY,mBACZb,MAAOA,IAdlB,IAmBH,gBAAC,KAAD,KACE,gBAAC,KAAD,CAAKqC,GAAI,EAAGC,SAAU,GACpB,gBAAC,KAAD,CAAOpI,QAAQ,QACb,gBAAC,KAAD,CAAM0G,KAAK,gBAAiB,IAD9B,yFAOHzB,EAED,gBAAC,KAAD,CAAeuB,UAAU,cACvB,gBAAC,KAAD,CAAQ3G,SAAUwG,EACViB,QAAS,IAjGLhB,KACpBA,IAAepD,MAAMuE,KACdC,EAAAA,EAAAA,IAAcD,IACjBzC,GACD,GAHH,EAgG+B2C,CAAarB,GAC5BvG,KAAK,UAFb,kCAKA,gBAAC,KAAD,CAAQC,QAAQ,UACRH,SAAUwG,EACVtG,KAAK,UAFb,gCArFL,GARL,ECvCWmE,EAAW,wBAwDxB,EA3CsB,IAST,UATU,YACrBc,EADqB,qBAErB0D,EAFqB,QAGrB7D,EAHqB,eAIrBI,EAJqB,gBAKrBC,EALqB,MAMrB4C,EANqB,KAOrBhD,EAPqB,eAQrB+C,GACW,EACX,MAAMlF,GAA4BC,EAAAA,EAAAA,MAC5B+F,EAAgBhG,SAAH,UAAGA,EAA2BiG,kBAA9B,aAAG,EAAuCD,cAE7D,OAAKA,EAmBH,gBAACA,EAAD,CAAe9D,QAASA,EACTC,KAAMA,EACN+C,eAAgBA,EAChB7C,YAAaA,EACb0D,qBAAsBA,EACtBZ,MAAOA,EACP7C,eAAgBA,EAChBC,gBAAiBA,IAxB9B,gCACE,gBAAC,KAAD,KACE,gBAAC,KAAD,CAAK2D,GAAI,IACP,gBAAC,KAAD,CAA0BC,YAAY,4BAG1C,gBAAC,KAAD,CAAetC,UAAU,cACvB,gBAAC,KAAD,CAAQxG,QAAQ,UACRsH,QAAS,IAAMtC,GAAY,IADnC,0BASR,ECtCF,EARyB,IAA8C,IAA7C,gBAAEnB,EAAkB,GAApB,QAAwBkF,GAAqB,EACrE,OAAIlF,EAAgBmF,SAASD,GACpB,gCAAE,gBAAC,KAAD,CAAMrC,KAAK,yBAA0B,KAGzC,IAAP,EC+EF,EApEoB,QAAC,SACnBuC,EADmB,gBAEnBC,EAFmB,KAGnBpE,EAHmB,eAInB+C,EAJmB,gBAKnBhE,EALmB,qBAMnB6E,EANmB,MAOnBZ,EAPmB,iBAQnBqB,EARmB,eASnBlE,GATkB,QAUP,CACX,CACEmE,IAAKC,EACL/J,MACE,gCACE,gBAAC,EAAD,CAAkBuE,gBAAiBA,EAAiBkF,QAASM,IAD/D,wBAKFC,UACE,gBAAC,EAAD,CAAkBzE,QAASoE,EAASI,GAClBvE,KAAMA,EACNC,SAAU,IAAMoE,EAAiBI,GACjCvE,YAAakE,EACbjE,eAAgBA,EAChBC,gBAAiBrB,EAAgBmF,SAASK,MAGhE,CACED,IAAKG,EACLjK,MACE,gCACE,gBAAC,EAAD,CAAkBuE,gBAAiBA,EAAiBkF,QAASQ,IAD/D,wBAKFD,UACE,gBAAC,EAAD,CAAczE,QAASoE,EAASM,GAClBzE,KAAMA,EACN+C,eAAgBA,EAChB9C,SAAU,IAAMoE,EAAiBK,GACjCxE,YAAakE,EACbpB,MAAOA,EACP7C,eAAgBA,EAChBC,gBAAiBrB,EAAgBmF,SAASO,MAG5D,CACEH,IAAKI,EACLlK,MACE,gCACE,gBAAC,EAAD,CAAkBuE,gBAAiBA,EAAiBkF,QAASS,IAD/D,gCAKFF,UACE,gBAAC,EAAD,CAAezE,QAASoE,EAASO,GAClB1E,KAAMA,EACN+C,eAAgBA,EAChB7C,YAAakE,EACbR,qBAAsBA,EACtBZ,MAAOA,EACP7C,eAAgBA,EAChBC,gBAAiBrB,EAAgBmF,SAASQ,MA/D3C,E,oBCpBb,MAAMC,GAAwB9E,EAAAA,EAAAA,SAAO+E,EAAAA,IAAV,6FAAG/E,CAAH,4CAKrBgF,EAAQhF,EAAAA,QAAAA,IAAAA,WAAH,kEAAGA,CAAH,yCAKZiF,EAAajF,EAAAA,QAAAA,GAAAA,WAAH,uEAAGA,EAAU,QAAC,MAAEkF,GAAH,QAAgB,oBAC5BA,EAAMC,MAAMC,OAAOC,6DADP,IAWvBC,EAAmB,QAAC,OAAExC,EAAF,QAAUyC,GAAX,SACvB,gBAACT,EAAD,CAAuBzJ,QAAQ,UAC7B,gBAAC2J,EAAD,KAAQO,GACR,gBAACN,EAAD,KACGnC,EAAOO,KAAKhF,GACJ,sBAAIoG,IAAKe,OAAOnH,IAASmH,OAAOnH,OALtB,EAWzBiH,EAAiBG,UAAY,CAC3B3C,OAAQ4C,IAAAA,QAAkBA,IAAAA,QAAkBC,WAC5CJ,QAASG,IAAAA,QAGXJ,EAAiB5H,aAAe,CAC9B6H,QAAS,sBAGX,UCoBA,EArC6B,IAAqC,IAApC,qBAAExB,GAAkC,EAChE,MAAM,gBAAE/E,IAAoByB,EAAAA,EAAAA,YAAWrB,KAChC,QAAEwG,EAAF,QAAWC,EAAX,QAAoBN,EAApB,OAA6BzC,GAAUgD,IAAuBC,EAAAA,EAAAA,UAAS,CAAEH,SAAS,EAAOC,SAAS,EAAON,aAAS5H,EAAWmF,YAAQnF,IAe5I,OACE,gCACE,gJAGA,gBAAC,KAAD,CAAQgF,QAlBmB,KAC7B,MAAM/E,EAvB0BC,KAClC,MAAMmI,EAAsB,IAAKnI,GAUjC,OARKmI,EAAoBC,OAAOpK,mBAC9BmK,EAAoBC,OAAOpK,iBAAmB,IAG3CmK,EAAoBC,OAAOnK,sBAC9BkK,EAAoBC,OAAOnK,oBAAsB,IAG5CkK,CAAP,EAYkBE,CAA2BnC,OAAqBpG,IAEhEmI,EAAoB,CAAEF,SAAS,EAAML,aAAS5H,EAAWmF,YAAQnF,EAAWkI,SAAS,IAErFM,EAAAA,EAAAA,eAAoC,CAAEC,sBAAuBxI,EAASyI,WAAYrH,EAAgBsH,YAAa/H,MAAMgI,IACnHT,EAAoB,CAAEF,SAAS,EAAOL,QAASgB,aAAF,EAAEA,EAAUhB,QAASM,QAASU,aAAF,EAAEA,EAAUV,QAAS/C,OAAQyD,aAAF,EAAEA,EAAUzD,QAAhH,IACClE,OAAOP,IAAU,QAClB,MAAMmI,EAAgB,CAACnI,aAAD,EAACA,EAAOkH,QAASlH,SAAjB,UAAiBA,EAAOoI,kBAAxB,iBAAiB,EAAmBC,WAApC,aAAiB,EAAwBC,MAC/Db,EAAoB,CAAEF,SAAS,EAAOL,aAAS5H,EAAWmF,OAAQ0D,EAAeX,SAAS,GAA1F,GAJF,EAa2CzK,KAAK,UAC3CwK,EAAU,gBAAC,KAAD,CAASgB,MAAO,EAAGD,KAAK,2BAA8B,0BAElEd,GACC,gBAACf,EAAD,CAAuBzJ,QAAQ,WAC7B,yBAAIkK,IAGNzC,GAAUA,EAAO+D,QAAU,GAC3B,gBAAC,EAAD,CAAkB/D,OAAQA,EAAQyC,QAASA,IAdjD,EC6EF,EA1GsB,IAAqC,IAApC,qBAAExB,GAAkC,EACzD,MAAM,gBAAE/E,IAAoByB,EAAAA,EAAAA,YAAWrB,GACjC0H,EAAqB,CAAElB,SAAS,EAAOC,SAAS,EAAOkB,cAAc,EAAOvI,YAAQb,EAAW4H,aAAS5H,EAAWmF,OAAQ,MAC1H,QAAE8C,EAAF,aAAWmB,EAAX,QAAyBlB,EAAzB,QAAkCN,EAAlC,OAA2CzC,EAA3C,OAAmDtE,GAAUwI,IAAkBjB,EAAAA,EAAAA,UAMpFe,GACIG,EAAanE,GAAUA,EAAO+D,QAAU,EAwB9C,OACE,gCACE,gKAGA,gBAAC,EAAAzF,OAAD,CAAQhB,SA3Ba,IAA4B,IAA3B,SAAE8G,EAAF,SAAYC,GAAe,EAGnD,OAFAH,EAAe,IAAKF,EAAoBlB,SAAS,IAE1CO,EAAAA,EAAAA,UAA+B,CACpCC,sBAAuBrC,OAAqBpG,GAC5CyJ,WAAY,CAAEF,WAAUC,YACxBd,WAAYrH,EAAgBsH,YAC3B/H,MAAMgI,IACPS,EAAe,CACbpB,SAAS,EACTmB,cAAc,EACdxB,QAASgB,EAAShB,QAClB/G,OAAQ+H,EAAS/H,OACjBsE,OAAQyD,EAASzD,OACjB+C,QAASU,EAASV,SANpB,IAQCjH,OAAOP,IAAU,QAClB,MAAMmI,EAAgB,CAACnI,aAAD,EAACA,EAAOkH,QAASlH,SAAjB,UAAiBA,EAAOoI,kBAAxB,iBAAiB,EAAmBC,WAApC,aAAiB,EAAwBC,MAC/DK,EAAe,CAAEpB,SAAS,EAAOC,SAAS,EAAOkB,cAAc,EAAMvI,YAAQb,EAAW4H,aAAS5H,EAAWmF,OAAQ0D,GAApH,GAfF,EAwBsCnF,cAAe,CAAE8F,SAAU,GAAID,SAAU,KAC3E,gBAAC,EAAAtF,KAAD,CAAMC,UAAU,QACd,gBAAC,KAAD,CAAKA,UAAU,SACb,gBAAC,KAAD,CAAK2B,GAAI,GACP,gBAAC,KAAD,CAAa1B,MAAM,WACNC,KAAK,WACL5G,GAAG,sBACHsE,UAAQ,KAEvB,gBAAC,KAAD,CAAK+D,GAAI,GACP,gBAAC,KAAD,CAAa1B,MAAM,WACNC,KAAK,WACL3G,KAAK,WACLD,GAAG,sBACHsE,UAAQ,MAGzB,gBAAC,KAAD,CAAQrE,KAAK,UACVwK,EAAU,gBAAC,KAAD,CAASgB,MAAO,EAAGD,KAAK,oBAAuB,oBAEzDM,GAAaF,GACd,gBAACjC,EAAD,CAAuBzJ,QAASwK,EAAU,UAAY,UACpD,2BACIrH,SAAAA,EAAQ6I,cAAe,uBACxB7I,aAAA,EAAAA,EAAQ6I,cACP,gCACG7I,SAAAA,EAAQ8I,cAAgB/B,EAAU,kBAIvC/G,aAAA,EAAAA,EAAQ6I,eAAe7I,aAAvB,EAAuBA,EAAQ+I,eAC/B,2BACE,2BACA,yBAAO1F,UAAU,SACf,6BACE,0BACE,4CACA,qCAIJ,6BACG2F,OAAOC,QAAQjJ,aAAf,EAAeA,EAAQ+I,cAAclE,KAAI,QAAEoB,EAAKtD,GAAP,SACxC,sBAAIsD,IAAKA,GACP,0BACGe,OAAOf,IAEV,0BACGe,OAAOrE,IAN4B,QAgBrD8F,GACC,gBAAC,EAAD,CAAkBnE,OAAQA,EAAQyC,QAASA,MAhErD,ECpCImC,IAAmB1H,EAAAA,EAAAA,SAAO2H,EAAAA,IAAV,gFAAG3H,CAAH,sRAGD4H,GAAUA,EAAM1C,MAAM2C,OAAOC,MAAMC,SAC/BH,GAAUA,EAAM1C,MAAM2C,OAAOG,OAAOC,oBAGlCL,GAAUA,EAAM1C,MAAM2C,OAAOK,MAAMC,gBAqD9D,GAlCgB,IAAqC,IAApC,qBAAEpE,GAAkC,EACnD,MAAOqE,EAAWC,IAAgBtC,EAAAA,EAAAA,UAAqCrB,IAEjE,cAAEvF,KAAkBqB,IAAeC,EAAAA,EAAAA,YAAWrB,GAMpD,OAJAkJ,EAAAA,EAAAA,YAAU,KACRD,EAAa7H,EAAW1B,cAAxB,GACC,CAAC0B,EAAW1B,gBAGb,gBAAC4I,GAAD,CAAkBa,WAAS,EACTH,UAAWA,EACXjN,GAAG,0BACHqN,SAAUH,GAC1B,gBAAC,KAAD,CAAOI,SAAU/D,GACf,gBAAC,aAAD,KACE,gBAAC,WAAD,CAAagE,QAAM,GAAnB,4BAEF,gBAAC,UAAD,CAAYC,aAAW,GACrB,gBAAC,EAAD,CAAsB5E,qBAAsBA,MAGhD,gBAAC,KAAD,CAAO0E,SAAU7D,GACf,gBAAC,aAAD,KACE,gBAAC,WAAD,CAAa8D,QAAM,GAAnB,oBAEF,gBAAC,UAAD,CAAYC,aAAW,GACrB,gBAAC,EAAD,CAAe5E,qBAAsBA,MAlB7C,ECtBI6E,GAAmB,CACvB,CAAClE,GAAoBmE,EACrB,CAACjE,GAAgBkE,GAGbC,GAAiB,gBAAC,MAAE1K,EAAF,UAASiI,GAAV,SACrB,gBAAC,KAAD,KACE,gBAAC,KAAD,CAAKpC,GAAI,EAAG8E,SAAU,GACpB,gBAAC,KAAD,CAAO3N,QAAQ,SAAS4N,MAAO,CAAEC,UAAW,eAC1C,sCAAc5C,EAAY,OAAS,SAAnC,2BAAuE,4BACtEjI,aAAA,EAAAA,EAAOkH,UAAW,gCAAGlH,EAAMkH,QAAQ,2BAAM,4BACzClH,SAHH,UAGGA,EAAOoI,kBAHV,iBAGG,EAAmBC,WAHtB,aAGG,EAAwBC,OANV,EAkBVwC,GAAmB,CAAC7C,EAAsCpK,KACrE,MAAMkN,EAAkBjC,IACtB,GAAKA,EAIL,OAAOA,CAAP,EAKF,OAAIb,OACyB3I,IAAvBzB,EACK,CAAEmN,YAAY,GAGI,KAAvBnN,EACK,CAAEoN,cAAc,GAGlB,CAAEC,UAAWH,EAAelN,IAG9BkN,EAAelN,EAAtB,EAgDIsN,GAAsB,CAAC3L,EAAY4L,EAA4BvG,KACnE,MAAMwG,EAAa,IAAKd,GAAkB,CAAC/D,GAAiB,CAAC,GACvD7G,GAA4BC,EAAAA,EAAAA,MAC5B0L,EAAsB3L,aAAH,EAAGA,EAA2B0L,WAAWE,oBAE9DD,GAAuB9L,EAAWa,oBACpCgL,EAAW7E,GAAkB8E,EAAoB9L,EAAWgM,oBAG9D,MAAM3K,EAAkBsI,OAAOC,QAAQiC,GAAYrG,KAAI,IAA+B,IAA7Be,EAAS0F,GAAoB,EAapF,OAZqBtC,OAAOC,QAAQqC,GAAgBC,MAAK,IAAkC,IAAhCC,EAAWC,GAAqB,EACzF,OAAI/G,EAAe8G,OAIfP,UAAAA,EAA6BO,QAIxB3H,EAAAA,EAAAA,IAAc4H,EAAd5H,CAA+BxE,aAA/B,EAA+BA,EAAamM,IAArD,IAGoB5F,OAAUzG,CAAhC,IAGF,OAAOuM,EAAAA,EAAAA,SAAQhL,EAAf,EAGI8D,GAAe,CACnBxC,EACA2J,EACA/J,EACAgK,EACAC,EACAC,EACAvM,KAEA,MAAMF,EAAauM,IAInB,GAHwBE,EAAczM,EAAY,CAAC,GAG/BgJ,QAAU,EAC5B,OAAO0D,QAAQC,UAIjBL,EAAkB,MAElB,MAAMvM,EAAUyM,EAAiBxM,GAC3B4M,EAAU,IAAMrK,EAASxC,EAASC,EAAY2C,EAAWxB,gBAAgBlB,YAAaC,GAAuBQ,MAAK,KACtHmM,EAAAA,EAAAA,KAAa7P,EAAAA,GAAAA,OAAAA,eAAAA,SAAAA,SAAb,IACC+D,OAAOP,IAAU,QAClB,GAA+C,iBAApCA,SAAP,UAAOA,EAAOoI,kBAAd,iBAAO,EAAmBkE,YAA1B,aAAO,EAAyB7H,QAAqB,CACvD,MAAM/D,EAlI4B6L,KACtC,MAAMC,GAAsBC,EAAAA,EAAAA,WAAUF,GAAgBG,GAAgB,4BAA2BA,EAAWC,KAAK,SAEjH,OAAOC,EAAAA,EAAAA,SAAQJ,GAAqB,CAACK,EAAQzG,KAAQ0G,EAAAA,EAAAA,WAAU1G,IAA/D,EA+HoC2G,CAA+B/M,EAAMoI,WAAWkE,KAAK7H,QACrFwH,EAAczM,EAAYkB,EAC3B,MACCoL,EAAkB9L,EACnB,IAGH,OAAImC,EAAWxB,gBAAgBqM,2BAA6BxN,EAAWa,kBAEjE4M,OAAOC,QAAQ,kGACVd,IAGFF,QAAQC,UAGVC,GAAP,EA0BIe,GAAgB,IAA+F,IAA9F,cAAEnK,EAAF,eAAiBoK,EAAjB,SAAiCrL,EAAjC,gBAA2CpB,EAA3C,KAA4DmB,EAA5D,eAAkE+C,GAA4B,EACnH,MAAMlF,GAA4BC,EAAAA,EAAAA,MAC5ByN,EAAyB1N,aAAH,EAAGA,EAA2BiG,WAAWyH,wBAC9DC,EAAgBC,IAAqB7F,EAAAA,EAAAA,aACrCzF,EAAgB6J,IAAqBpE,EAAAA,EAAAA,aACrCvF,EAAYrB,IAAiB4G,EAAAA,EAAAA,UAA2B,CAC7DjH,cAAe2M,EACfzM,kBACAD,6BAAyBpB,EACzBE,WAAYwD,EACZnC,gBAAiB,KAGboF,EAAW,CACf,CAACI,IAAoBmH,EAAAA,EAAAA,QAAsC,MAC3D,CAACjH,IAAgBiH,EAAAA,EAAAA,QAAsC,MACvD,CAAChH,IAAiBgH,EAAAA,EAAAA,QAAsC,OAGpDC,GAAqBC,EAAAA,EAAAA,UAAQ,KAAM,IAAMvL,EAAYrB,mBAAkB,CAACqB,EAAYrB,IAU1F,IARAmJ,EAAAA,EAAAA,YAAU,IA3BQsD,KAGlBI,EAAAA,EAAAA,mBAFqB,CAAEC,KAAM,EAAGC,QAAS,EAAGC,MAAO,KAED5N,KAAKqN,EAAvD,EAwBgBQ,CAAWR,IAAoB,KAE/CtD,EAAAA,EAAAA,YAAU,MACJqD,GAAmB3M,EAAgBsH,WAAc9F,EAAW3C,WAAWoF,cA/CjD,EAACE,EAAO3C,EAAYrB,KAAkB,MAClE,MAAMkN,EAAsBlJ,SAAH,UAAGA,EAAOmJ,MAAMhJ,GAAuB,WAAdA,EAAKvB,cAA9B,aAAG,EAA+C5G,GAEvEkR,GACFlN,EAAc,IAAKqB,EAAY3C,WAAY,IAAK2C,EAAW3C,WAAYoF,aAAcoJ,IACtF,EA2CGE,CAAsBZ,EAAea,KAAMhM,EAAYrB,EACxD,GACA,CAACwM,EAAgB3M,EAAgBsH,UAAW9F,EAAYrB,KAEtDwM,EACH,OAAO,gBAAC,KAAD,MAGT,MAAMc,EAAyB,KAAM,MACnC,MAAMC,EAAU,UAAGpI,EAAS9D,EAAW1B,sBAAvB,aAAG,EAAoC6N,QAEvD,MAAO,IAAKnM,EAAW3C,cAAe6O,aAAH,EAAGA,EAAY7L,OAAlD,EAGI+L,EAAiB,CAAC/O,EAA8B4L,KACpD,MAAMvK,EAAkBsK,GACtB3L,EACA4L,EACAvG,GAGF,GAAIhE,EAAgB2H,QAAU,EAAG,CAC/B,MAAMgG,EAAc3N,EAAgBmF,SAAS7D,EAAW1B,eAAiB0B,EAAW1B,cAAgBI,EAAgB,GAEpHC,EAAc,IACTqB,EACHzB,wBAAyB0K,EACzB3K,cAAe+N,EACfhP,aACAqB,mBAEH,CAED,OAAOA,CAAP,EAGI4N,EAzMsB,EAACtM,EAAY4J,IAA2B2C,IAGpE,MAAMlP,EAAakP,QAAAA,EAAsB3C,KACnC,aACJnH,EAAe,GADX,YAEJnD,EAFI,WAGJJ,EAHI,WAIJC,EAJI,aAKJ1D,EALI,mBAMJC,EANI,MAOJvB,EAPI,kBAQJ0B,EARI,sBASJK,EATI,sBAUJJ,EAVI,kBAWJC,EAXI,eAYJC,EAZI,kBAaJC,EAbI,mBAcJE,GACEkB,GACE,YACJC,EADI,UAEJwI,GACE9F,EAAWxB,gBAEf,MAAO,CACLrE,QACAmF,cACAkN,cAAe/J,EAAagK,MAAM,KAClChH,OAAQ,CACN1K,QAAS,CAAC,CAAE2R,KAAMxN,EAAYyN,KAAMxN,IACpCnE,eAAgBS,EAChBR,qBAAsB0N,GAAiB7C,EAAWpK,GAClDR,mBAAoBW,EACpBjB,KAAM0C,EACNnC,yBAA0BW,EAC1BV,oBAAqBW,EACrBV,iBAAkBW,EAClBV,oBAAqBW,EACrBV,yBAA0BW,EAC1BV,oBAAqBW,GAfzB,EAgL0ByQ,CAAsB5M,EAAYiM,GAEtDY,EAAqBjJ,IACzB,MAAMvG,EAAa4O,IACnB,IAAIvN,EAAkB,IAAIsB,EAAWtB,iBAGjCA,EAAgB2H,QAAU,IAC5B3H,EAAkBsK,GAAoB3L,EAAY2C,EAAWzB,wBAAyBmE,IAGxF/D,EAAc,IACTqB,EACHtB,kBACArB,aACAiB,cAAesF,GAJjB,EAkBIkJ,EAAQC,EAAY,CACxBjJ,WACAnE,OACAoE,gBAbwBxG,GAAoCiF,GAC5DxC,EACA2J,EACA/J,EACAqM,EACAK,EACAF,EACA7O,GAOAmB,gBAAiBsB,EAAWtB,gBAC5B6E,qBAAsB+I,EACtB5J,iBACAC,MAAOwI,EAAea,KACtBhI,iBAAkB6I,EAClB/M,eAAgBA,GAAkB,gBAACyI,GAAD,CAAgB1K,MAAOiC,EAAgBgG,UAAWtH,EAAgBsH,cAGhGkH,EACJ,gBAACC,EAAA,EAAD,CAAQC,WAAYlN,EAAW1B,cACvB6O,yBAAuB,EACvBC,YAAU,EACVC,WAAS,EACTC,aAAcT,EACdC,MAAOA,GACb,gBAAC,GAAD,CAASvJ,qBAAsB+I,KAInC,OACE,gBAAC,WAAD,CAA+B3L,MAAO2K,GACnCJ,EAEG,gBAACA,EAAD,CAAwB3H,qBAAsB+I,GAC3CU,GAGHA,EARR,EAaFhC,GAAc9N,aAAe,CAC3B+N,eAAgB/G,EAChBvE,UAAMxC,EACNuF,eAAgB,CAAC,GAGnBsI,GAAc/F,UAAY,CACxBzG,gBAAiB0G,IAAAA,MAAgB,CAC/BhF,mBAAoBgF,IAAAA,KACpBY,UAAWZ,IAAAA,OACXzG,aAAcyG,IAAAA,OAAAA,WACd5H,YAAa4H,IAAAA,OAAAA,aACZC,WACHxF,KAAMuF,IAAAA,OACN+F,eAAgB/F,IAAAA,OAChBrE,cAAeqE,IAAAA,OAAAA,WACfxC,eAAgBwC,IAAAA,QAGlB,MCzWA,GDyWA,GEhWaqI,GAAoB,CAC/BjQ,YAAa,OACbmB,aAAc,QAGH+O,GAAO,CAElB/R,aACE,gGACmE,0DADnE,2DAKFC,mBAAoB,8DAEpBM,eACE,qFACwD,0DADxD,KAIFC,kBACE,2CACc,wBAAMoF,UAAU,eAAe,2CAD7C,IACgG,IADhG,cAEa,4BAAO,OAFpB,8CAKFtF,kBACE,wGAC2E,mCAD3E,IAC4F,2BAD5F,kDAEiD,4CAFjD,+CAKFD,sBACE,kHACqF,kCADrF,IACqG,4BAGvGI,sBACE,2GAC8E,yCAD9E,IACqG,4BAGvGuG,aACE,2GAAkF,sCAAlF,4CAIEgL,GAA4C,CAChDtT,MAAOoT,GAAkB9O,aACzBS,WAAY,YACZC,WAAY,IACZtD,kBAAmB,MACnBC,sBAAuB,KACvBC,kBAAmB,MACnBG,sBAAuB,YACvBC,oBAAoB,GAuBtB,GApBsB,KAAM,QAC1B,MAAMqB,GAA4BC,EAAAA,EAAAA,OAEhCkC,KAAM+N,EAAgB,CAAC,EACvB7M,cAAe8M,EAAyB,CAAC,GAFrC,UAGFnQ,SAHE,UAGFA,EAA2BoQ,oBAHzB,aAGF,EAAyCC,YAHvC,QAG+C,CAAC,EAChDlO,EAAO,IAAK6N,MAASE,GACrB7M,EAAgB,IAAK4M,MAAmBE,GAE9C,OACE,gBAAC,KAAD,CAAexT,MAAM,sCACnB,gBAAC,EAAD,MACA,gBAAC,GAAD,CAAeyF,SAAUkO,EACVnO,KAAMA,EACNnB,gBAAiB+O,GACjB1M,cAAeA,IANlC,E,qBCxEF,SAAe,QAAC,MACd1G,EADc,YAEdmF,EAFc,aAGdmD,EAAesL,GAAAA,OACftI,QAAQ,QACN1K,EAAU,GADJ,aAENU,EAFM,kBAGNI,EAHM,sBAINC,EAJM,kBAKNC,EALM,eAMNC,EANM,kBAONC,EAPM,sBAQNC,EARM,mBASNC,IAbW,QAemC,CAChDhC,QACAmF,cACAmD,aAAcA,EAAa+H,OAC3BtL,WAAYnE,EAAQ,GAAG2R,KACvBvN,WAAYpE,EAAQ,GAAG4R,KACvBlR,eACAI,oBACAC,wBACAC,oBACAC,iBACAC,oBACAC,wBACAC,qBA5BF,ECCA,YAAgBiB,EAA8BC,EAA8ByI,EAAmB+E,EAAmCvN,GAA2E,IAAtDC,IAAsD,yDAC3M,MAAMC,GAA4BC,EAAAA,EAAAA,MAC5BC,EAAkB,IAAMC,EAAAA,EAAAA,QAAyB,mDAAoD,WACrGC,EAAiBC,GAAUF,EAAAA,EAAAA,MAAwB,uDAAsDE,IAAS,SAExH,OAAOC,EAAAA,EAAAA,OAA6BgI,EAAW,IAC1C1I,EACHzC,GAAImL,IACH/H,MAAMC,GACHR,GAA6BD,EACxBC,EAA0BV,QAAQqB,gCAAgC0M,EAA0BxN,EAAYyI,EAAWxI,GAAaS,KAAKL,IAG9IA,IAEOM,KACNI,OAAOP,IAER,MADAD,EAAcC,GACRA,CAAN,GAlBJ,E,uOCWA,MA0DA,GAtDoB,IAAsD,YAArD,sBAAEvB,EAAF,eAAyB2O,GAA4B,EACxE,MAAMzN,GAA4BC,EAAAA,EAAAA,OAEhCkC,KAAM+N,EAAgB,CAAC,EACvB7M,cAAe8M,EAAyB,CAAC,GAFrC,UAGFnQ,SAHE,UAGFA,EAA2BoQ,oBAHzB,aAGF,EAAyCC,YAHvC,QAG+C,CAAC,EAChDlO,EAAO,IAAK6N,MAASE,GAC3B,IAAI7M,EAAgBmN,GAA2B1R,GAE/C,GAAIkB,EAA2B,CAC7B,MACEH,WAAY4Q,EADR,gBAEJzT,GACEgD,EAA0B0Q,MAAMC,0BAA0B7R,EAAsB3B,GAAIgT,GAExF,IAAKnT,EACH,OAAO,gBAAC,KAAD,MAGTqG,EAAgB,IAAKA,KAAkBoN,EACxC,CAED,MAAMzP,EAAkB,IACnB+O,GACHzH,UAAWxJ,EAAsB3B,GACjCuF,mBAAoB5D,EAAsBmJ,OAAO/J,mBAAmBC,MACpEkP,2BAA4BhK,EAAc3C,mBAgB5C,OACE,gBAAC,KAAD,CAAe/D,MAAM,oCACnB,gBAAC,EAAD,CAAkBmC,sBAAuBA,IACzC,gBAAC,GAAD,MAjDwB2O,KACrB,CAAEA,mBAgDcmD,CAAqBnD,GAAxC,CACetL,KAAMA,EACNnB,gBAAiBA,EACjBqC,cAAeA,EACfjB,SArBG,CACpBxC,EACAC,EACAC,EACAC,IACG8Q,GACHjR,EACAC,EACAf,EAAsB3B,KACpBkG,EAAc3C,kBAChBZ,EACAC,MAGF,E,sCCrDF,MAMA,GANuB,QAAC,wBAAE+Q,EAAF,QAA2B1K,GAA5B,SACrB,gBAAC,KAAD,CAAenJ,GAAIJ,EAAAA,GAAAA,OAAAA,eAAAA,SAAAA,KAA2CiU,EAAyB1K,IACrF,gBAAC,KAAD,CAAQ/I,QAAQ,UAAU0T,OAAO,SAAjC,QAFmB,ECoBvB,GAjB4B,IAAsC,IAArC,sBAAEjS,GAAmC,EAChE,MAAM,MAAEnC,EAAF,YAASmF,EAAamG,QAAQ,QAAE1K,EAAU,GAAZ,aAAgBU,EAAhB,mBAA8BC,EAA9B,kBAAkDG,EAAlD,mBAAqEM,IAAyBG,EAC5HkS,EAAazT,EAAQ8H,KAAK4L,GAAY,GAAEA,EAAO/B,QAAQ+B,EAAO9B,SAAQnC,KAAK,MAEjF,OACE,gBAACkE,GAAA,EAAD,CAAkBvU,MAAM,uBAAuBwU,cAAe,gBAAC,GAAD,CAAgBL,wBAAyBhS,EAAsB3B,GAAIiJ,QAASM,KACxI,gBAAC,KAAD,CAAmB5C,MAAM,QAAQX,MAAOxG,IACxC,gBAAC,KAAD,CAAmBmH,MAAM,cAAcX,MAAOrB,IAC9C,gBAAC,KAAD,CAAmBgC,MAAM,iBAAiBX,MAAO6N,IACjD,gBAAC,KAAD,CAAmBlN,MAAM,kBAAkBX,MAAOlF,IAClD,gBAAC,KAAD,CAAmB6F,MAAM,kBAAkBX,MAAOjF,SAAAA,EAAoBC,MAAQ,SAAW,OACzF,gBAAC,KAAD,CAAmB2F,MAAM,qBAAqBX,MAAO9E,IACrD,gBAAC,KAAD,CAAmByF,MAAM,sBAAsBX,MAAOxE,IAR1D,ECLIyS,GAAY,CAACC,EAAyClM,IAChCkM,EAAgBhM,KAAKiM,IAAD,mCAAYnM,EAAMmJ,MAAMhJ,GAASA,EAAKnI,KAAOmU,WAA7C,aAAY,EAA0CvN,YAAtD,QAA8D,gBAA9D,IAErBiJ,KAAK,MAS1BuE,GAAkB,IAA6D,IAA5D,sBAAEzS,EAAF,MAAyBqG,EAAzB,eAAgCD,GAA4B,EACnF,MAAM,eACJ1G,EADI,kBAEJC,EAFI,kBAGJF,EAHI,sBAIJD,EAJI,sBAKJI,GACEI,EAAsBmJ,QACpB,aACJhD,EAAesL,GAAAA,QACbzR,EAEJ,OACE,gBAACoS,GAAA,EAAD,CAAkBvU,MAAM,uBAAuBwU,cAAe,gBAAC,GAAD,CAAgBL,wBAAyBhS,EAAsB3B,GAAIiJ,QAASQ,KACxI,gBAAC,KAAD,CAAmB9C,MAAM,iBAAiBX,MAAO3E,IACjD,gBAAC,KAAD,CAAmBsF,MAAM,iBAAiBX,MAAO1E,IACjD,gBAAC,KAAD,CAAmBqF,MAAM,iBAAiBX,MAAO5E,IACjD,gBAAC,KAAD,CAAmBuF,MAAM,sBAAsBX,MAAO7E,KACpD4G,EAAexG,uBACf,gBAAC,KAAD,CAAmBoF,MAAM,eAAeX,MAAOzE,IAEjD,gBAAC,KAAD,CAAmBoF,MAAM,gBAAgBX,MAAOiO,GAAUnM,EAAcE,KAT5E,EAcFoM,GAAgB7R,aAAe,CAC7BwF,eAAgB,CAAC,GAGnBqM,GAAgB9J,UAAY,CAC1BvC,eAAgBwC,EAAAA,QAGlB,YCxCM8J,GAAmB,IAA6D,IAA5D,sBAAE1S,EAAF,MAAyBqG,EAAzB,eAAgCD,GAA4B,EACpF,MAAMlF,GAA4BC,EAAAA,EAAAA,MAC5BwR,EAAyBzR,aAAH,EAAGA,EAA2BiG,WAAWuL,iBAErE,OAAKC,EAaH,gBAACA,EAAD,CAAwB3S,sBAAuBA,EACvBoG,eAAgBA,EAChBC,MAAOA,IAb7B,gBAAC+L,GAAA,EAAD,CAAkBvU,MAAM,wBACNwU,cACE,gBAAC,GAAD,CAAgBL,wBAAyBhS,EAAsB3B,GAC/CiJ,QAASS,KAE3C,gBAAC,KAAD,CAA0BV,YAAY,0BAK5C,EAOFqL,GAAiB9R,aAAe,CAC9BwF,oBAAgBvF,GAGlB,YCdA,GAhB6B,IAA6C,YAA5C,sBAAEb,EAAF,MAAyBqG,GAAmB,EACxE,MAAMnF,GAA4BC,EAAAA,EAAAA,OAEhCiF,eAAgBwM,EAA0B,CAAC,GADvC,UAEF1R,SAFE,UAEFA,EAA2BoQ,oBAFzB,aAEF,EAAyCuB,uBAFvC,QAE0D,CAAC,EAC3DzM,EAAiB,IAAKwM,EAAyBhT,uBAAuB,GAE5E,OACE,gCACE,gBAAC,GAAD,CAAqBI,sBAAuBA,IAC5C,gBAAC,GAAD,CAAiBA,sBAAuBA,EAAuBqG,MAAOA,EAAOD,eAAgBA,IAC7F,gBAAC,GAAD,CAAkBpG,sBAAuBA,EAAuBqG,MAAOA,EAAOD,eAAgBA,IAJlG,ECSF,GAhB6B,IAA6C,YAA5C,sBAAEpG,EAAF,MAAyBqG,GAAmB,EACxE,MAAMnF,GAA4BC,EAAAA,EAAAA,OAEhCiF,eAAgBwM,EAA0B,CAAC,GADvC,UAEF1R,SAFE,UAEFA,EAA2BoQ,oBAFzB,aAEF,EAAyCC,YAFvC,QAE+C,CAAC,EAChDnL,EAAiB,IAAKwM,GAE5B,OACE,gCACE,gBAAC,GAAD,CAAqB5S,sBAAuBA,IAC5C,gBAAC,GAAD,CAAiBA,sBAAuBA,EAAuBqG,MAAOA,EAAOD,eAAgBA,IAC7F,gBAAC,GAAD,CAAkBpG,sBAAuBA,EAAuBqG,MAAOA,EAAOD,eAAgBA,IAJlG,ECCIrG,GAAmB,IAAmD,IAAhDC,sBAAuBC,GAAyB,EAC1E,MAAM,gBAAE/B,EAAF,cAAmBD,IAAkBiC,EAAAA,EAAAA,KACrCC,EAZYF,KAClB,GAAIA,EAAa,CACf,MAAMG,EAAeC,EAAAA,EAAAA,qBAAiCJ,EAAYpC,MAAO,IAEzE,OAAO,iEAAgC,yBAAIuC,GAC5C,CAED,MAAO,gDAAP,EAKkBE,CAAWL,GAE7B,OACE,gCACE,gBAACM,EAAA,EAAD,MACA,gBAAC,KAAD,CAAY1C,MAAOsC,EACPK,QACE,gBAACC,EAAA,EAAD,CAAoBxC,cAAeA,EACfC,gBAAiBA,IAEvCwC,kBAAmB,CACjB7C,MAAO,+BACPC,KAAM6C,EAAAA,EAAAA,MAAAA,cAElB,qGAZN,EAkBFZ,GAAiBa,aAAe,CAC9BZ,2BAAuBa,GAGzB,YCvCaqQ,GAAO,CAElB/R,aACE,4GAC+E,oDAD/E,IACiH,2BADjH,2BAE0B,iDAF1B,kBAKFC,mBAAoB,0EAEpBM,eACE,iGACoE,0DADpE,KAIFC,kBACE,2CACc,wBAAMoF,UAAU,eAAe,uEAD7C,IAC4H,IAD5H,cAEa,4BAAO,OAFpB,8CAKFtF,kBACE,sHACyF,iDADzF,IACwH,2BADxH,kDAEiD,4CAFjD,+CAKFD,sBACE,8HACiG,2CADjG,IAC0H,4BAG5H2G,aACE,2GAAkF,sCAAlF,4CAIS8K,GAAoB,CAC/B9O,aAAc,mBACdnB,YAAa,oBAGTmQ,GAA4C,CAChDtT,MAAOoT,GAAkB9O,aACzBS,WAAY,YACZC,WAAY,IACZtD,kBAAmB,MACnBI,kBAAmB,sEACnBH,sBAAuB,cACvBC,kBAAmB,oBACnBI,oBAAoB,GA0BtB,GAvBsB,KAAM,QAC1B,MAAMqB,GAA4BC,EAAAA,EAAAA,OAEhCkC,KAAM+N,EAAgB,CAAC,EACvBhL,eAAgBwM,EAA0B,CAAC,EAC3CrO,cAAe8M,GAHX,UAIFnQ,SAJE,UAIFA,EAA2BoQ,oBAJzB,aAIF,EAAyCuB,uBAJvC,QAI0D,CAAC,EAC3DxP,EAAO,IAAK6N,MAASE,GACrB7M,EAAgB,IAAK4M,MAAmBE,GACxCjL,EAAiB,IAAKwM,EAAyBhT,uBAAuB,GAE5E,OACE,gBAAC,KAAD,CAAe/B,MAAM,mDACnB,gBAAC,GAAD,MACA,gBAAC,GAAD,CAAeqE,gBAAiB+O,GACjB5N,KAAMA,EACN+C,eAAgBA,EAChB7B,cAAeA,EACfjB,SAAUkO,IAP7B,E,uOCzDF,MA6DA,GAzDoB,IAAsD,YAArD,sBAAExR,EAAF,eAAyB2O,GAA4B,EACxE,MAAMzN,GAA4BC,EAAAA,EAAAA,OAEhCkC,KAAM+N,EAAgB,CAAC,EACvBhL,eAAgBwM,EAA0B,CAAC,EAC3CrO,cAAe8M,EAAyB,CAAC,GAHrC,UAIFnQ,SAJE,UAIFA,EAA2BoQ,oBAJzB,aAIF,EAAyCuB,uBAJvC,QAI0D,CAAC,EAC3DxP,EAAO,IAAK6N,MAASE,GACrBhL,EAAiB,IAAKwM,EAAyBhT,uBAAuB,GAC5E,IAAI2E,EAAgBmN,GAA2B1R,GAE/C,GAAIkB,EAA2B,CAC7B,MACEH,WAAY+R,EADR,gBAEJ5U,GACEgD,EAA0B0Q,MAAMC,0BAA0B7R,EAAsB3B,GAAIgT,GAExF,IAAKnT,EACH,OAAO,gBAAC,KAAD,MAGTqG,EAAgB,IAAKA,KAAkBuO,EACxC,CAED,MAAM5Q,EAAkB,IACnB+O,GACHzH,UAAWxJ,EAAsB3B,GACjCuF,mBAAoB5D,EAAsBmJ,OAAO/J,mBAAmBC,MACpEkP,2BAA4BhK,EAAc3C,mBAgB5C,OACE,gBAAC,KAAD,CAAe/D,MAAM,gDACnB,gBAAC,GAAD,CAAkBmC,sBAAuBA,IACzC,gBAAC,GAAD,MAnDwB2O,KACrB,CAAEA,mBAkDcmD,CAAqBnD,GAAxC,CACezM,gBAAiBA,EACjBkE,eAAgBA,EAChB/C,KAAMA,EACNkB,cAAeA,EACfjB,SAtBG,CACpBxC,EACAC,EACAC,EACAC,IACG8Q,GACHjR,EACAC,EACAf,EAAsB3B,KACpBkG,EAAc3C,kBAChBZ,EACAC,MAGF,ECvDF8R,EAAAA,YAAAA,SAAqB,IAAIC,EAAAA,eAAe,CAAC,EAAG,CAC1C,0BAA2B,CACzB,CACE/N,KAAM,OACNgO,YAAa,OACbC,gBAAiBC,GACjBC,cAAeC,GACfC,uBAAwBC,GACxBC,aAAcC,EAAAA,OACdC,eAAgBD,EAAAA,UAElB,CACExO,KAAM,mBACNgO,YAAa,mBACbC,gBAAiBS,GACjBP,cAAeQ,GACfN,uBAAwBO,GACxBL,aAAcC,EAAAA,OACdC,eAAgBD,EAAAA,a,0ECtBtB,MAyBA,EAzByB,WAAmF,UAAvDK,EAAuD,uDAAP,GACnG,MAAOC,EAAoBC,IAAyB/K,EAAAA,EAAAA,aAC7C/K,EAAiB+V,IAAsBhL,EAAAA,EAAAA,WAAS,GACjDiL,EAAc,IAAM7K,EAAAA,EAAAA,aAAkC5H,MAAMgI,IAChEwK,GAAmB,GACnBD,EAAsBvK,EAAtB,IAaF,OAVA+B,EAAAA,EAAAA,YAAU,KAAQ0I,GAAa,GAAK,KAEpC1I,EAAAA,EAAAA,YAAU,KACR,MAAM2I,EAAkBL,EAAkBvN,KAAK6N,GAAWA,EAAOC,UAAUC,OAAOJ,KAElF,MAAO,KACLC,EAAgBI,SAASC,GAAmBA,KAA5C,CADF,GAGC,CAACV,IAEG,CACL5V,kBACAD,cAAe8V,aAAF,EAAEA,EAAoBpS,QACnC8S,cAAeV,SAAF,UAAEA,EAAoBW,eAAtB,aAAE,EAA6BD,cAE/C,C,0ICnBD,MAAME,GAAYzR,EAAAA,EAAAA,SAAO0R,EAAAA,IAAV,gFAAG1R,CAAH,yBAIT2R,GAAe3R,EAAAA,EAAAA,SAAO4R,EAAAA,IAAV,mFAAG5R,EAAe,QAAC,MAAEkF,GAAH,SAAe2M,EAAAA,EAAAA,KAAd,CAAD,2IACnB3M,EAAMC,MAAMC,OAAO0M,WACrB5M,EAAMC,MAAM4M,KAAKD,WAGnB5M,EAAM2C,OAAOmK,QAAQC,OAAOC,SAOjCC,EAAAA,EAAAA,IAAqBjN,GAIdA,EAAM2C,OAAOG,OAAOoK,aAE3BC,EAAAA,EAAAA,IAAsBnN,IAGpBmN,EAAAA,EAAAA,IAAsBnN,GArBI,IA2BpCyM,EAAa5B,YAAc,SAmB3B,MAsBA,EAtBuB,QAAC,MAAEjV,GAAH,SACrB,gBAAC2W,EAAD,KACG3W,EAAMuI,KAAI,IAAkD,IAAjD,KAAEzI,EAAF,MAAQD,EAAR,YAAe2X,EAAf,eAA4BC,GAAqB,EAC3D,OAAK3X,EAKH,gBAAC,KAAD,CAAa0X,YAAaA,QAAAA,EAAe,GAAI7N,IAAK7J,GAChD,gBAAC,IAAD,CAAeK,GAAIL,EAAM4X,gBAAiBD,GACxC,gBAACZ,EAAD,CAActW,QAAQ,QACpB,gBAAC,KAAD,KACGV,MARF,IAGT,IAPiB,C,oHC/CvB,MAAM8X,EAASzS,EAAAA,QAAAA,IAAAA,WAAH,mEAAGA,CAAH,8GAUC0S,EAAW1S,EAAAA,QAAAA,GAAAA,WAAH,qEAAGA,CAAH,wCAKf2S,GAAiB3S,EAAAA,EAAAA,SAAO4S,EAAAA,GAAV,sFAAG5S,EAAgB,QAAC,MAAEkF,GAAH,SAAe2M,EAAAA,EAAAA,KAAd,CAAD,mCAExB3M,EAAMC,MAAM4M,KAAKc,GAFO,IAKjC3D,EAAmB,QAAC,SAAE4D,EAAF,MAAYnY,EAAZ,YAAmBoY,GAAc,EAAjC,cAAwC5D,EAAxC,UAAuDtN,GAAxD,SACvB,gBAAC,KAAD,CAAKA,UAAY,WAAUA,KACzB,gBAAC,KAAD,CAAKqC,GAAI,IACP,gBAACuO,EAAD,KACE,gBAACC,EAAD,KACG/X,EACAoY,GAAe,gBAACJ,EAAD,CAAgBhM,KAAK,GAAGC,MAAO,KAEhDuI,GAEF2D,GAVkB,EAezB5D,EAAiBxR,aAAe,CAC9BmE,UAAW,GACXkR,aAAa,EACb5D,mBAAexR,GAGjB,S,0ECnDA,MA2DA,GACEqV,MA5DWC,EAAAA,EAAAA,GAAgB,CAC3B/B,OAAQgC,EAAAA,EAAAA,KACR7U,MAAO,CAACA,EAAOiR,KAAR,CACL/J,QAAU,yBAAwB+J,0BAA+BjR,MAEnE8U,kBAAkB,IAwDlBC,QArDmBH,EAAAA,EAAAA,GAAgB,CACnC/B,OAAQgC,EAAAA,EAAAA,OACRrN,QAAS,CAACwN,EAASC,KAAV,CACP/N,QAAU,SAAQ+N,gCAEpBjV,MAAO,CAACA,EAAOgV,EAASC,KAAjB,CACL/N,QAAU,kBAAiB+N,0BAAiCjV,QAgD9DkV,YA5CiBN,EAAAA,EAAAA,GAAgB,CACjC/B,OAAQgC,EAAAA,EAAAA,WACRrN,QAAS,CAACwN,EAASG,KAAV,CACPjO,QAAU,UAASiO,EAAUxI,KAAK,sCAEpC3M,MAAO,CAACA,EAAOgV,EAASG,KAAjB,CACLjO,QAAU,oBAAmBiO,EAAUxI,KAAK,8BAA8B3M,QAuC5EoV,cAnCmBR,EAAAA,EAAAA,GAAgB,CACnC/B,OAAQgC,EAAAA,EAAAA,aACRrN,QAAS,CAACwN,EAASnM,KAAV,CACP3B,QAAU,SAAQ2B,mCAEpB7I,MAAO,CAACA,EAAOgV,EAASnM,KAAjB,CACL3B,QAAU,kBAAiB2B,0BAAiC7I,QA8B9DqV,kBA1BuBT,EAAAA,EAAAA,GAAgB,CACvC/B,OAAQgC,EAAAA,EAAAA,iBACR7U,MAAO,CAACA,EAAOgV,EAASC,KAAjB,CACL/N,QAAU,2BAA0B+N,0BAAiCjV,QAwBvEsV,kBApBuBV,EAAAA,EAAAA,GAAgB,CACvC/B,OAAQgC,EAAAA,EAAAA,iBACR7U,MAAO,CAACA,EAAO6I,KAAR,CACL3B,QAAU,2BAA0B2B,0BAAiC7I,QAkBvEuV,oBAdyBX,EAAAA,EAAAA,GAAgB,CACzC/B,OAAQgC,EAAAA,EAAAA,mBACR7U,MAAQA,IAAD,CACLkH,QAAU,qCAAoClH,Q,mKCxCnC,MAAMwV,EAGnBC,YACE3Y,EACA4G,EACAjC,EACAwS,EACAyB,GAEAC,KAAK9I,OAAS,CACZ/P,KACA4G,OACAjC,cACAwS,cACAyB,WAEH,CAEG5Y,SACF,OAAO6Y,KAAK9I,OAAO/P,EACpB,CAEG4G,WACF,OAAOiS,KAAK9I,OAAOnJ,IACpB,CAEGjC,kBACF,OAAOkU,KAAK9I,OAAOpL,WACpB,CAEGwS,kBACF,OAAO0B,KAAK9I,OAAOoH,WACpB,CAEGyB,eACF,OAAOC,KAAK9I,OAAO6I,QACpB,CAEDE,YACE,MAAM,GACJ9Y,EADI,KAEJ4G,EAFI,YAGJjC,EAHI,YAIJwS,EAJI,SAKJyB,GACEC,KAAK9I,OAGT,OAAO,IAAIgJ,EAAQ3F,EAAAA,IAAc,CAC/BpT,KACA4G,OACAjC,cACAwS,cACAyB,aAEH,CAEY,cACX5Y,EACA4G,EACAjC,EACAwS,EACAyB,GAEA,OAAO,IAAIF,EACT1Y,EACA4G,EACAjC,EACAwS,EACAyB,EAEH,CAEDI,SACE,MAAM,GACJhZ,EADI,KAEJ4G,EAFI,YAGJjC,EAHI,YAIJwS,EAJI,SAKJyB,GACEC,KAAK9I,OAET,MAAO,CACL/P,KACA4G,OACAjC,cACAwS,cACA8B,UAAWL,EAEd,CAEc,gBAAC5S,GACd,MAAM,GACJhG,EADI,KAEJ4G,EAFI,YAGJjC,EAHI,YAIJwS,EACA8B,UAAWL,GACT5S,EAEJ,OAAO0S,EAAKQ,OACVlZ,EACA4G,EACAjC,EACAwS,EACAyB,EAEH,CAEa,iBAEZ,OAAO,IAAIG,CACZ,EAKH,MAAMA,EAGJJ,cAAmD,IAAvC3S,EAAuC,uDAAjBoN,EAAAA,MAChCyF,KAAK7S,MAAQA,CACd,CAEDhG,GAAGgG,GACD,OAAO,IAAI+S,EAAQF,KAAK7S,MAAMmT,IAAI,KAAMnT,GACzC,CAEDY,KAAKZ,GACH,OAAO,IAAI+S,EAAQF,KAAK7S,MAAMmT,IAAI,OAAQnT,GAC3C,CAEDrB,YAAYqB,GACV,OAAO,IAAI+S,EAAQF,KAAK7S,MAAMmT,IAAI,cAAenT,GAClD,CAEDmR,YAAYnR,GACV,OAAO,IAAI+S,EAAQF,KAAK7S,MAAMmT,IAAI,cAAenT,GAClD,CAED4S,SAAS5S,GACP,OAAO,IAAI+S,EAAQF,KAAK7S,MAAMmT,IAAI,WAAYnT,GAC/C,CAEDoT,QACE,MAAM,GACJpZ,EADI,KAEJ4G,EAFI,YAGJjC,EAHI,YAIJwS,EAJI,SAKJyB,GACEC,KAAK7S,MAAMqT,WAEf,OAAO,IAAIX,EACT1Y,EACA4G,EACAjC,EACAwS,EACAyB,EAEH,ECpJH,MAaA,GAb0BU,EAAAA,EAAAA,IACxB,cACA,IAAMC,IAAAA,cAAkC,CACtC1B,KAAM,CAAE2B,aAAa,GACrBvB,OAAQ,CAAEuB,aAAa,GACvBpB,WAAY,CAAEoB,aAAa,GAC3BlB,aAAc,CAAEkB,aAAa,GAC7BjB,iBAAkB,CAAEiB,aAAa,GACjChB,iBAAkB,CAAEgB,aAAa,GACjCf,mBAAoB,CAAEe,aAAa,O,oBClBvC,MAAMC,EAA2B,QAAC,MAChCC,EADgC,MAEhCC,EAFgC,KAGhC7I,EAHgC,SAIhC8I,EAJgC,MAKhC5I,EALgC,MAMhChJ,EAAQ,GANwB,QAOhCqO,EAAU,CAAEwD,WAAOrX,IAPY,QAQF,CAC7B6O,KAAM+B,EAAAA,KAAepL,EAAME,KAAK4R,GAAMpB,EAAKqB,SAASD,MACpDE,WAAY,CACVhJ,QACAF,OACAC,QAAS6I,EACTF,QACAC,SAEFtD,UAjB+B,EAoB3B4D,EAA+B,QAAC,MAAEP,EAAF,MAASC,EAAT,KAAgB7I,EAAhB,SAAsB8I,EAAtB,MAAgC5I,EAAhC,MAAuC6I,GAAxC,QAA6E,CAChHxI,KAAM+B,EAAAA,KAAeyG,EAAM3R,KAAKgS,GAAMC,EAAAA,EAAAA,SAAsBD,MAC5DF,WAAY,CACVlJ,OACAC,QAAS6I,EACT5I,QACA0I,QACAC,SAPiC,EAW/BS,EAAe,SAACC,GAAiG,IAA1CC,EAA0C,uDAAf,GACtG,MAAMC,EAAmBD,EAAUpS,KAAKsS,GAAUC,mBAAmBD,KAErE,OAAOH,KAAYE,GAAkBG,GACtC,GAEkCC,EAAAA,EAAAA,IACjC,cACA,IAAMpB,IAAAA,YAAmB,CACvBqB,YAAa,CAAC7C,GAEdF,KAAK1D,GACH,MAAMuG,GAAMG,EAAAA,EAAAA,IAAWT,EAAaU,EAAAA,EAAAA,qBAAAA,KAAqC,CAAC3G,KACpE4G,GAAUC,EAAAA,EAAAA,IAAM,MAAON,GAAKtX,KAAKsV,EAAKqB,UAI5C,OAFAhC,EAAAA,KAAAA,QAA+BgD,GAExBA,CACR,EAED9C,OAAO9D,GACL,MAAMuG,GAAMG,EAAAA,EAAAA,IAAWT,EAAaU,EAAAA,EAAAA,qBAAAA,OAAuC,CAAC3G,KACtE4G,GAAUC,EAAAA,EAAAA,IAAM,SAAUN,GAIhC,OAFA3C,EAAAA,OAAAA,QAAiCgD,GAE1BA,CACR,EAED3C,WAAWjE,EAAgBkE,GACzB,MAAMqC,EAAMN,EAAaU,EAAAA,EAAAA,qBAAAA,WAA2C,CAAC3G,IAC/D4G,GAAUC,EAAAA,EAAAA,IAAM,OAAOH,EAAAA,EAAAA,IAAWH,GAAMrC,EAAUjQ,WAIxD,OAFA2P,EAAAA,WAAAA,QAAqCgD,GAE9BA,CACR,EAEDzC,aAAanE,EAAgBpI,GAC3B,MAAM2O,EAAMN,EAAaU,EAAAA,EAAAA,qBAAAA,aAA6C,CAAC3G,EAAQpI,IACzEgP,GAAUC,EAAAA,EAAAA,IAAM,UAAUH,EAAAA,EAAAA,IAAWH,IAI3C,OAFA3C,EAAAA,aAAAA,QAAuCgD,GAEhCA,CACR,EAEDxC,iBAAiBpE,EAAgB8G,EAAjB,GAIwB,IAJY,KAClDnK,EADkD,QAElDC,EAFkD,MAGlDC,GACsC,EACtC,MAAMkK,EAASd,EAAaU,EAAAA,EAAAA,qBAAAA,iBAAiD,CAAC3G,IACxEuG,GAAMS,EAAAA,EAAAA,GAAcD,EAAQpK,EAAMC,EAASC,GAE3C+J,GAAUC,EAAAA,EAAAA,IAAM,OAAOH,EAAAA,EAAAA,IAAWH,IACrCtX,KAAK6W,GAIR,OAFAlC,EAAAA,iBAAAA,QAA2CgD,GAEpCA,CACR,EAEDvC,iBAAiBzM,EAAD,GAAkF,IAA/D,KAAE+E,EAAF,QAAQC,EAAR,MAAiBC,GAA8C,EAChG,MAAMkK,EAASd,EAAaU,EAAAA,EAAAA,qBAAAA,iBAAiD,CAAC/O,IACxE2O,GAAMS,EAAAA,EAAAA,GAAcD,EAAQpK,EAAMC,EAASC,GAE3C+J,GAAUC,EAAAA,EAAAA,IAAM,OAAOH,EAAAA,EAAAA,IAAWH,IACrCtX,KAAKqW,GAIR,OAFA1B,EAAAA,iBAAAA,QAA2CgD,GAEpCA,CACR,EAEDtC,mBAAmB,GAA+D,IAA/D,KAAE3H,EAAF,QAAQC,EAAR,MAAiBC,GAA8C,EAChF,MAAMkK,EAASd,EAAaU,EAAAA,EAAAA,qBAAAA,MACtBJ,GAAMS,EAAAA,EAAAA,GAAcD,EAAQpK,EAAMC,EAASC,GAE3C+J,GAAUC,EAAAA,EAAAA,IAAM,OAAOH,EAAAA,EAAAA,IAAWH,IACrCtX,KAAKqW,GAIR,OAFA1B,EAAAA,mBAAAA,QAA6CgD,GAEtCA,CACR,K","sources":["webpack://graylog-web-interface/./src/components/authentication/AuthenticationPageNavigation.tsx","webpack://graylog-web-interface/./src/components/authentication/BackendActionLinks.tsx","webpack://graylog-web-interface/./src/logic/authentication/directoryServices/BackendConfigParser.ts","webpack://graylog-web-interface/./src/components/authentication/directoryServices/ldap/WizardPageHeader.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/HandleCreate.ts","webpack://graylog-web-interface/./src/components/authentication/directoryServices/BackendWizard/BackendWizardContext.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/BackendWizard/ServerConfigStep.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/BackendWizard/UserSyncStep.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/BackendWizard/GroupSyncStep.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/BackendWizard/StepTitleWarning.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/BackendWizard/wizardSteps.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/BackendWizard/ConnectionErrors.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/BackendWizard/ServerConnectionTest.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/BackendWizard/UserLoginTest.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/BackendWizard/Sidebar.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/BackendWizard/BackendWizard.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/BackendWizard/index.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/ldap/BackendCreate.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/PrepareInitialWizardValues.ts","webpack://graylog-web-interface/./src/components/authentication/directoryServices/HandleUpdate.ts","webpack://graylog-web-interface/./src/components/authentication/directoryServices/ldap/BackendEdit.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/BackendConfigDetails/EditLinkButton.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/BackendConfigDetails/ServerConfigSection.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/BackendConfigDetails/UserSyncSection.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/BackendConfigDetails/GroupSyncSection.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/activeDirectory/BackendConfigDetails.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/ldap/BackendConfigDetails.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/activeDirectory/WizardPageHeader.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/activeDirectory/BackendCreate.tsx","webpack://graylog-web-interface/./src/components/authentication/directoryServices/activeDirectory/BackendEdit.tsx","webpack://graylog-web-interface/./src/components/authentication/bindings.ts","webpack://graylog-web-interface/./src/components/authentication/useActiveBackend.ts","webpack://graylog-web-interface/./src/components/common/PageNavigation.tsx","webpack://graylog-web-interface/./src/components/common/Section/SectionComponent.tsx","webpack://graylog-web-interface/./src/domainActions/roles/AuthzRolesDomain.ts","webpack://graylog-web-interface/./src/logic/roles/Role.ts","webpack://graylog-web-interface/./src/actions/roles/AuthzRolesActions.ts","webpack://graylog-web-interface/./src/stores/roles/AuthzRolesStore.ts"],"sourcesContent":["/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\n\nimport Routes from 'routing/Routes';\nimport PageNavigation from 'components/common/PageNavigation';\nimport { Row } from 'components/bootstrap';\n\nconst NAV_ITEMS = [\n { title: 'Authentication Services', path: Routes.SYSTEM.AUTHENTICATION.BACKENDS.OVERVIEW },\n { title: 'Authenticators', path: Routes.SYSTEM.AUTHENTICATION.AUTHENTICATORS.SHOW },\n];\n\nconst AuthenticationPageNavigation = () => (\n \n \n
\n);\n\nexport default AuthenticationPageNavigation;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\n\nimport { LinkContainer } from 'components/common/router';\nimport type AuthenticationBackend from 'logic/authentication/AuthenticationBackend';\nimport Routes from 'routing/Routes';\nimport { ButtonToolbar, Button } from 'components/bootstrap';\n\ntype Props = {\n activeBackend: AuthenticationBackend | undefined,\n finishedLoading: boolean,\n};\n\nconst BackendActionLinks = ({ activeBackend, finishedLoading }: Props) => (\n \n \n \n \n \n \n \n \n \n \n \n);\n\nexport default BackendActionLinks;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport type { DirectoryServiceBackendConfigJson, DirectoryServiceBackendConfig } from './types';\n\nconst toJson = ({\n servers,\n systemUserDn,\n systemUserPassword,\n transportSecurity,\n type,\n userFullNameAttribute,\n userNameAttribute,\n userSearchBase,\n userSearchPattern,\n userUniqueIdAttribute,\n verifyCertificates,\n}: DirectoryServiceBackendConfig): DirectoryServiceBackendConfigJson => ({\n servers,\n system_user_dn: systemUserDn,\n system_user_password: { is_set: systemUserPassword.isSet },\n transport_security: transportSecurity,\n type: type,\n user_full_name_attribute: userFullNameAttribute,\n user_name_attribute: userNameAttribute,\n user_search_base: userSearchBase,\n user_search_pattern: userSearchPattern,\n user_unique_id_attribute: userUniqueIdAttribute,\n verify_certificates: verifyCertificates,\n});\n\nconst fromJson = ({\n servers,\n system_user_dn,\n system_user_password,\n transport_security,\n type,\n user_full_name_attribute,\n user_name_attribute,\n user_search_base,\n user_search_pattern,\n user_unique_id_attribute,\n verify_certificates,\n}: DirectoryServiceBackendConfigJson): DirectoryServiceBackendConfig => ({\n servers,\n systemUserDn: system_user_dn,\n systemUserPassword: { isSet: system_user_password.is_set },\n transportSecurity: transport_security,\n type: type,\n userFullNameAttribute: user_full_name_attribute,\n userNameAttribute: user_name_attribute,\n userSearchBase: user_search_base,\n userSearchPattern: user_search_pattern,\n userUniqueIdAttribute: user_unique_id_attribute,\n verifyCertificates: verify_certificates,\n});\n\nexport default { fromJson, toJson };\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\n\nimport AuthenticationPageNavigation from 'components/authentication/AuthenticationPageNavigation';\nimport DocsHelper from 'util/DocsHelper';\nimport StringUtils from 'util/StringUtils';\nimport type { DirectoryServiceBackend } from 'logic/authentication/directoryServices/types';\nimport type { OktaBackend } from 'logic/authentication/okta/types';\nimport { PageHeader } from 'components/common';\nimport useActiveBackend from 'components/authentication/useActiveBackend';\nimport BackendActionLinks from 'components/authentication/BackendActionLinks';\n\ntype Props = {\n authenticationBackend?: DirectoryServiceBackend | OktaBackend,\n title?: string,\n};\n\nconst _pageTitle = (authBackend, title) => {\n if (authBackend) {\n const backendTitle = StringUtils.truncateWithEllipses(authBackend.title, 30);\n\n return <>Edit Authentication Service - {backendTitle}>;\n }\n\n return title || 'Create LDAP Authentication Service';\n};\n\nconst WizardPageHeader = ({ authenticationBackend: authBackend, title }: Props) => {\n const { finishedLoading, activeBackend } = useActiveBackend();\n const pageTitle = _pageTitle(authBackend, title);\n\n return (\n <>\n \n \n )}\n documentationLink={{\n title: 'Authentication documentation',\n path: DocsHelper.PAGES.USERS_ROLES,\n }}>\n Configure Graylog's authentication services of this Graylog cluster.\n \n >\n );\n};\n\nWizardPageHeader.defaultProps = {\n authenticationBackend: undefined,\n title: undefined,\n};\n\nexport default WizardPageHeader;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport type { $PropertyType } from 'utility-types';\n\nimport UserNotification from 'util/UserNotification';\nimport type { WizardSubmitPayload } from 'logic/authentication/directoryServices/types';\nimport { getEnterpriseGroupSyncPlugin } from 'util/AuthenticationService';\nimport { AuthenticationActions } from 'stores/authentication/AuthenticationStore';\n\nimport type { WizardFormValues, AuthBackendMeta } from './BackendWizard/BackendWizardContext';\n\nexport default (payload: WizardSubmitPayload, formValues: WizardFormValues, serviceType: $PropertyType, shouldUpdateGroupSync: boolean | undefined = true) => {\n const enterpriseGroupSyncPlugin = getEnterpriseGroupSyncPlugin();\n const notifyOnSuccess = () => UserNotification.success('Authentication service was created successfully.', 'Success');\n const notifyOnError = (error) => UserNotification.error(`Creating authentication service failed with status: ${error}`, 'Error');\n\n return AuthenticationActions.create(payload).then((result) => {\n if (result.backend && formValues.synchronizeGroups && enterpriseGroupSyncPlugin && shouldUpdateGroupSync) {\n return enterpriseGroupSyncPlugin.actions.onDirectoryServiceBackendUpdate(false, formValues, result.backend.id, serviceType).then(notifyOnSuccess);\n }\n\n notifyOnSuccess();\n\n return result;\n }).catch((error) => {\n notifyOnError(error);\n throw error;\n });\n};\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\nimport type * as Immutable from 'immutable';\nimport type { $PropertyType } from 'utility-types';\n\nimport type { Step, StepKey } from 'components/common/Wizard';\nimport { singleton } from 'logic/singleton';\n\nexport type WizardFormValues = {\n title?: string,\n description?: string,\n defaultRoles?: string,\n groupSearchBase?: string,\n groupSearchPattern?: string,\n serverHost?: string,\n serverPort?: string | number,\n systemUserDn?: string,\n systemUserPassword?: string,\n synchronizeGroups?: boolean,\n teamDefaultRoles?: string,\n teamNameAttribute?: string,\n teamUniqueIdAttribute?: string,\n teamSelectionType?: 'all' | 'include' | 'exclude',\n teamSelection?: Immutable.Set,\n transportSecurity?: 'tls' | 'start_tls' | 'none',\n userFullNameAttribute?: string,\n userNameAttribute?: string,\n userUniqueIdAttribute?: string,\n userSearchBase?: string,\n userSearchPattern?: string,\n verifyCertificates?: boolean,\n oktaApiToken?: string,\n};\n\nexport type AuthBackendMeta = {\n backendId?: string, // only needed when editing an auth service\n backendHasPassword?: boolean, // only needed when editing an auth service\n backendGroupSyncIsActive?: boolean, // only needed when editing an auth service\n serviceType: string,\n serviceTitle: string,\n};\nexport type WizardStepsState = {\n activeStepKey: $PropertyType,\n backendValidationErrors: { [inputName: string]: React.ReactElement | string | null | undefined } | null | undefined,\n formValues: WizardFormValues,\n invalidStepKeys: Array,\n authBackendMeta: AuthBackendMeta,\n};\n\nexport type BackendWizardType = WizardStepsState & {\n setStepsState: (BackendWizardType) => void,\n};\n\nconst initialState = {\n activeStepKey: '',\n backendValidationErrors: undefined,\n authBackendMeta: { serviceType: '', serviceTitle: '' },\n formValues: {},\n invalidStepKeys: [],\n setStepsState: () => {},\n};\n\nconst BackendWizardContext = React.createContext(initialState);\nexport default singleton('contexts.authentication.directoryServices.backendWizard', () => BackendWizardContext);\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\nimport styled from 'styled-components';\nimport { useContext } from 'react';\nimport type { FormikProps } from 'formik';\nimport { Formik, Form, Field } from 'formik';\n\nimport { validateField, formHasErrors } from 'util/FormsUtils';\nimport { FormikFormGroup, FormikInput, InputOptionalInfo as Opt } from 'components/common';\nimport { Input, Button, ButtonToolbar } from 'components/bootstrap';\n\nimport type { WizardFormValues } from './BackendWizardContext';\nimport BackendWizardContext from './BackendWizardContext';\n\nexport const STEP_KEY = 'server-configuration';\n// Form validation needs to include all input names\n// to be able to associate backend validation errors with the form\nexport const FORM_VALIDATION = {\n title: {\n required: true,\n },\n serverHost: {\n required: true,\n },\n serverPort: {\n required: true,\n min: 1,\n max: 65535,\n },\n description: {},\n transportSecurity: {},\n verifyCertificates: {},\n systemUserDn: {},\n systemUserPassword: {},\n};\n\nconst ServerUrl = styled.div`\n display: flex;\n\n > * {\n align-self: flex-start;\n min-height: 34px;\n flex-grow: 1;\n\n :last-child {\n flex: 0.8;\n min-width: 130px;\n }\n }\n\n .input-group-addon {\n display: flex;\n align-items: center;\n max-width: fit-content;\n min-width: fit-content;\n }\n`;\n\nconst ProtocolOptions = styled.div`\n display: flex;\n\n div + * {\n margin-left: 10px;\n }\n`;\n\ntype Props = {\n formRef: React.Ref>,\n help: { [inputName: string]: React.ReactElement | string | null | undefined },\n onSubmit: () => void,\n onSubmitAll: () => Promise,\n submitAllError: React.ReactNode | null | undefined,\n validateOnMount: boolean,\n};\n\nconst ServerConfigStep = ({ formRef, help = {}, onSubmit, onSubmitAll, submitAllError, validateOnMount }: Props) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { setStepsState, ...stepsState } = useContext(BackendWizardContext);\n const { backendValidationErrors, authBackendMeta: { backendHasPassword } } = stepsState;\n\n const _onTransportSecurityChange = (event, values, setFieldValue, onChange) => {\n const currentValue = values.transportSecurity;\n const newValue = event.target.value;\n const defaultPort = 389;\n const defaultTlsPort = 636;\n\n if (currentValue === 'tls' && newValue !== 'tls' && values.serverPort === defaultTlsPort) {\n setFieldValue('serverPort', defaultPort);\n }\n\n if (currentValue !== 'tls' && newValue === 'tls' && values.serverPort === defaultPort) {\n setFieldValue('serverPort', defaultTlsPort);\n }\n\n onChange(event);\n };\n\n const _onSubmitAll = (validateForm) => {\n validateForm().then((errors) => {\n if (!formHasErrors(errors)) {\n onSubmitAll();\n }\n });\n };\n\n return (\n \n {({ isSubmitting, setFieldValue, values, validateForm }) => (\n \n )}\n \n );\n};\n\nexport default ServerConfigStep;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\nimport type * as Immutable from 'immutable';\nimport { useContext } from 'react';\nimport type { FormikProps } from 'formik';\nimport { Formik, Form, Field } from 'formik';\n\nimport type Role from 'logic/roles/Role';\nimport { validateField, formHasErrors } from 'util/FormsUtils';\nimport { Icon, FormikFormGroup, Select } from 'components/common';\nimport { Alert, Button, ButtonToolbar, Row, Col, Panel, Input } from 'components/bootstrap';\n\nimport type { WizardFormValues } from './BackendWizardContext';\nimport BackendWizardContext from './BackendWizardContext';\n\nexport const STEP_KEY = 'user-synchronization';\n// Form validation needs to include all input names\n// to be able to associate backend validation errors with the form\nexport const FORM_VALIDATION = {\n defaultRoles: { required: true },\n userFullNameAttribute: { required: true },\n userNameAttribute: { required: true },\n userSearchBase: { required: true },\n userSearchPattern: { required: true },\n userUniqueIdAttribute: {},\n};\n\ntype Props = {\n formRef: React.Ref>,\n help: { [inputName: string]: React.ReactElement | string | null | undefined },\n excludedFields: { [inputName: string]: boolean },\n roles: Immutable.List,\n onSubmit: () => void,\n onSubmitAll: () => Promise,\n submitAllError: React.ReactNode | null | undefined,\n validateOnMount: boolean,\n};\n\nconst UserSyncStep = ({ help = {}, excludedFields = {}, formRef, onSubmit, onSubmitAll, submitAllError, validateOnMount, roles }: Props) => {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { setStepsState, ...stepsState } = useContext(BackendWizardContext);\n const { backendValidationErrors } = stepsState;\n const rolesOptions = roles.map((role) => ({ label: role.name, value: role.id })).toArray();\n\n const _onSubmitAll = (validateForm) => {\n validateForm().then((errors) => {\n if (!formHasErrors(errors)) {\n onSubmitAll();\n }\n });\n };\n\n return (\n \n {({ isSubmitting, validateForm }) => (\n \n )}\n \n );\n};\n\nexport default UserSyncStep;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\nimport type * as Immutable from 'immutable';\nimport type { FormikProps } from 'formik';\n\nimport { Row, Col, Button, ButtonToolbar } from 'components/bootstrap';\nimport { EnterprisePluginNotFound } from 'components/common';\nimport type Role from 'logic/roles/Role';\nimport { getEnterpriseGroupSyncPlugin } from 'util/AuthenticationService';\nimport type { WizardSubmitPayload } from 'logic/authentication/directoryServices/types';\n\nimport type { WizardFormValues } from './BackendWizardContext';\n\nexport const STEP_KEY = 'group-synchronization';\n\nexport type Props = {\n formRef: React.Ref>,\n onSubmitAll: (shouldUpdateGroupSync?: boolean) => Promise,\n help: { [inputName: string]: React.ReactElement | string | null | undefined },\n excludedFields: { [inputName: string]: boolean },\n prepareSubmitPayload: (fromValues: WizardFormValues | null | undefined) => WizardSubmitPayload,\n roles: Immutable.List,\n submitAllError: React.ReactNode | null | undefined,\n validateOnMount: boolean,\n};\n\nconst GroupSyncStep = ({\n onSubmitAll,\n prepareSubmitPayload,\n formRef,\n submitAllError,\n validateOnMount,\n roles,\n help,\n excludedFields,\n}: Props) => {\n const enterpriseGroupSyncPlugin = getEnterpriseGroupSyncPlugin();\n const GroupSyncForm = enterpriseGroupSyncPlugin?.components?.GroupSyncForm;\n\n if (!GroupSyncForm) {\n return (\n <>\n \n \n \n \n
\n \n \n \n >\n );\n }\n\n return (\n \n );\n};\n\nexport default GroupSyncStep;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\n\nimport { Icon } from 'components/common';\nimport type { StepKey } from 'components/common/Wizard';\n\ntype Props = {\n invalidStepKeys: Array,\n stepKey: string,\n};\n\nconst StepTitleWarning = ({ invalidStepKeys = [], stepKey }: Props) => {\n if (invalidStepKeys.includes(stepKey)) {\n return <> {' '}>;\n }\n\n return null;\n};\n\nexport default StepTitleWarning;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\nimport type * as Immutable from 'immutable';\nimport type { FormikProps } from 'formik';\n\nimport type { WizardSubmitPayload } from 'logic/authentication/directoryServices/types';\nimport type Role from 'logic/roles/Role';\nimport type { StepKey } from 'components/common/Wizard';\n\nimport type { WizardFormValues } from './BackendWizardContext';\nimport ServerConfigStep, { STEP_KEY as SERVER_CONFIG_KEY } from './ServerConfigStep';\nimport UserSyncStep, { STEP_KEY as USER_SYNC_KEY } from './UserSyncStep';\nimport GroupSyncStep, { STEP_KEY as GROUP_SYNC_KEY } from './GroupSyncStep';\nimport StepTitleWarning from './StepTitleWarning';\n\ntype Props = {\n formRefs: Record>>,\n excludedFields: { [inputName: string]: boolean },\n handleSubmitAll: (shouldUpdateGroupSync?: boolean) => Promise,\n help: { [inputName: string]: React.ReactElement | string | null | undefined },\n invalidStepKeys: Array,\n prepareSubmitPayload: (fromValues: WizardFormValues | null | undefined) => WizardSubmitPayload,\n roles: Immutable.List,\n setActiveStepKey: (stepKey: string) => void,\n submitAllError: React.ReactNode | null | undefined,\n};\n\nconst wizardSteps = ({\n formRefs,\n handleSubmitAll,\n help,\n excludedFields,\n invalidStepKeys,\n prepareSubmitPayload,\n roles,\n setActiveStepKey,\n submitAllError,\n}: Props) => [\n {\n key: SERVER_CONFIG_KEY,\n title: (\n <>\n \n Server Configuration\n >\n ),\n component: (\n setActiveStepKey(USER_SYNC_KEY)}\n onSubmitAll={handleSubmitAll}\n submitAllError={submitAllError}\n validateOnMount={invalidStepKeys.includes(SERVER_CONFIG_KEY)} />\n ),\n },\n {\n key: USER_SYNC_KEY,\n title: (\n <>\n \n User Synchronization\n >\n ),\n component: (\n setActiveStepKey(GROUP_SYNC_KEY)}\n onSubmitAll={handleSubmitAll}\n roles={roles}\n submitAllError={submitAllError}\n validateOnMount={invalidStepKeys.includes(USER_SYNC_KEY)} />\n ),\n },\n {\n key: GROUP_SYNC_KEY,\n title: (\n <>\n \n Group Synchronization (Opt.)\n >\n ),\n component: (\n \n ),\n },\n];\n\nexport default wizardSteps;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\nimport PropTypes from 'prop-types';\nimport styled from 'styled-components';\n\nimport { Alert } from 'components/bootstrap';\n\nexport const NotificationContainer = styled(Alert)`\n margin-top: 10px;\n word-break: break-word;\n`;\n\nexport const Title = styled.div`\n font-weight: bold;\n margin-bottom: 5px;\n`;\n\nconst ErrorsList = styled.ul(({ theme }) => `\n font-family: ${theme.fonts.family.monospace};\n list-style: initial;\n padding-left: 20px;\n`);\n\ntype Props = {\n errors: Array,\n message: string,\n};\n\nconst ConnectionErrors = ({ errors, message }: Props) => (\n \n {message} \n \n {errors.map((error) => {\n return {String(error)} ;\n })}\n \n \n);\n\nConnectionErrors.propTypes = {\n errors: PropTypes.arrayOf(PropTypes.string).isRequired,\n message: PropTypes.string,\n};\n\nConnectionErrors.defaultProps = {\n message: 'There was an error',\n};\n\nexport default ConnectionErrors;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\nimport { useState, useContext } from 'react';\n\nimport type { WizardSubmitPayload } from 'logic/authentication/directoryServices/types';\nimport AuthenticationDomain from 'domainActions/authentication/AuthenticationDomain';\nimport { Button } from 'components/bootstrap';\nimport { Spinner } from 'components/common';\n\nimport ConnectionErrors, { NotificationContainer } from './ConnectionErrors';\nimport type { WizardFormValues } from './BackendWizardContext';\nimport BackendWizardContext from './BackendWizardContext';\n\nconst _addRequiredRequestPayload = (formValues) => {\n const necessaryAttributes = { ...formValues };\n\n if (!necessaryAttributes.config.user_search_base) {\n necessaryAttributes.config.user_search_base = '';\n }\n\n if (!necessaryAttributes.config.user_search_pattern) {\n necessaryAttributes.config.user_search_pattern = '';\n }\n\n return necessaryAttributes;\n};\n\ntype Props = {\n prepareSubmitPayload: (fromValues: WizardFormValues | null | undefined) => WizardSubmitPayload,\n};\n\nconst ServerConnectionTest = ({ prepareSubmitPayload }: Props) => {\n const { authBackendMeta } = useContext(BackendWizardContext);\n const [{ loading, success, message, errors }, setConnectionStatus] = useState({ loading: false, success: false, message: undefined, errors: undefined });\n\n const _handleConnectionCheck = () => {\n const payload = _addRequiredRequestPayload(prepareSubmitPayload(undefined));\n\n setConnectionStatus({ loading: true, message: undefined, errors: undefined, success: false });\n\n AuthenticationDomain.testConnection({ backend_configuration: payload, backend_id: authBackendMeta.backendId }).then((response) => {\n setConnectionStatus({ loading: false, message: response?.message, success: response?.success, errors: response?.errors });\n }).catch((error) => {\n const requestErrors = [error?.message, error?.additional?.res?.text];\n setConnectionStatus({ loading: false, message: undefined, errors: requestErrors, success: false });\n });\n };\n\n return (\n <>\n \n Performs a background connection check with the address and credentials defined in the step "Server Configuration".\n
\n \n {success && (\n \n {message}\n \n )}\n {(errors && errors.length >= 1) && (\n \n )}\n >\n );\n};\n\nexport default ServerConnectionTest;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\nimport { useState, useContext } from 'react';\nimport { Formik, Form } from 'formik';\n\nimport type { WizardSubmitPayload } from 'logic/authentication/directoryServices/types';\nimport AuthenticationDomain from 'domainActions/authentication/AuthenticationDomain';\nimport { FormikInput, Spinner } from 'components/common';\nimport { Button, Row, Col } from 'components/bootstrap';\nimport type { LoginTestResult } from 'stores/authentication/AuthenticationStore';\n\nimport ConnectionErrors, { NotificationContainer } from './ConnectionErrors';\nimport type { WizardFormValues } from './BackendWizardContext';\nimport BackendWizardContext from './BackendWizardContext';\n\ntype Props = {\n prepareSubmitPayload: (fromValues: WizardFormValues | null | undefined) => WizardSubmitPayload,\n};\n\nconst UserLoginTest = ({ prepareSubmitPayload }: Props) => {\n const { authBackendMeta } = useContext(BackendWizardContext);\n const initialLoginStatus = { loading: false, success: false, testFinished: false, result: undefined, message: undefined, errors: [] };\n const [{ loading, testFinished, success, message, errors, result }, setLoginStatus] = useState<\n LoginTestResult & {\n loading: boolean,\n testFinished: boolean,\n result: LoginTestResult['result'] | null | undefined\n }\n >(initialLoginStatus);\n const hasErrors = (errors && errors.length >= 1);\n\n const _handleLoginTest = ({ username, password }) => {\n setLoginStatus({ ...initialLoginStatus, loading: true });\n\n return AuthenticationDomain.testLogin({\n backend_configuration: prepareSubmitPayload(undefined),\n user_login: { username, password },\n backend_id: authBackendMeta.backendId,\n }).then((response) => {\n setLoginStatus({\n loading: false,\n testFinished: true,\n message: response.message,\n result: response.result,\n errors: response.errors,\n success: response.success,\n });\n }).catch((error) => {\n const requestErrors = [error?.message, error?.additional?.res?.text];\n setLoginStatus({ loading: false, success: false, testFinished: true, result: undefined, message: undefined, errors: requestErrors });\n });\n };\n\n return (\n <>\n \n Verify the settings by loading the entry for the given user name. If you omit the password, no authentication attempt will be made.\n
\n \n \n \n >\n );\n};\n\nexport default UserLoginTest;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\nimport { useState, useContext, useEffect } from 'react';\nimport styled from 'styled-components';\nimport type { $PropertyType } from 'utility-types';\n\nimport type { WizardSubmitPayload } from 'logic/authentication/directoryServices/types';\nimport { PanelGroup, Panel } from 'components/bootstrap';\nimport type { Step } from 'components/common/Wizard';\n\nimport { STEP_KEY as SERVER_CONFIG_KEY } from './ServerConfigStep';\nimport { STEP_KEY as USER_SYNC_KEY } from './UserSyncStep';\nimport type { WizardFormValues } from './BackendWizardContext';\nimport BackendWizardContext from './BackendWizardContext';\nimport ServerConnectionTest from './ServerConnectionTest';\nimport UserLoginTest from './UserLoginTest';\n\nconst StyledPanelGroup = styled(PanelGroup)`\n &.panel-group .panel {\n margin-top: 0;\n border-color: ${(props) => props.theme.colors.input.border};\n background-color: ${(props) => props.theme.colors.global.contentBackground};\n\n .panel-heading {\n background-color: ${(props) => props.theme.colors.table.backgroundAlt};\n }\n\n &:not(:first-child) {\n border-top: 0;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n }\n\n &:not(:last-child) {\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n }\n }\n`;\ntype Props = {\n prepareSubmitPayload: (fromValues: WizardFormValues | null | undefined) => WizardSubmitPayload,\n};\n\nconst Sidebar = ({ prepareSubmitPayload }: Props) => {\n const [activeKey, setActiveKey] = useState<$PropertyType>(SERVER_CONFIG_KEY);\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { setStepsState, ...stepsState } = useContext(BackendWizardContext);\n\n useEffect(() => {\n setActiveKey(stepsState.activeStepKey);\n }, [stepsState.activeStepKey]);\n\n return (\n \n \n \n Server Connection Check \n \n \n \n \n \n \n \n User Login Test \n \n \n \n \n \n \n );\n};\n\nexport default Sidebar;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\nimport { useState, useRef, useEffect, useMemo } from 'react';\nimport { compact, camelCase, mapKeys, mapValues } from 'lodash';\nimport type { $PropertyType } from 'utility-types';\nimport PropTypes from 'prop-types';\nimport type { FormikProps } from 'formik';\n\nimport history from 'util/History';\nimport { validateField } from 'util/FormsUtils';\nimport { getEnterpriseGroupSyncPlugin } from 'util/AuthenticationService';\nimport { Row, Col, Alert } from 'components/bootstrap';\nimport { Spinner } from 'components/common';\nimport AuthzRolesDomain from 'domainActions/roles/AuthzRolesDomain';\nimport Routes from 'routing/Routes';\nimport type { WizardSubmitPayload } from 'logic/authentication/directoryServices/types';\nimport type { Step, StepKey } from 'components/common/Wizard';\nimport Wizard from 'components/common/Wizard';\nimport type FetchError from 'logic/errors/FetchError';\nimport type { LoadResponse as LoadBackendResponse } from 'stores/authentication/AuthenticationStore';\nimport type { PaginatedRoles } from 'actions/roles/AuthzRolesActions';\n\nimport type { WizardStepsState, WizardFormValues, AuthBackendMeta } from './BackendWizardContext';\nimport BackendWizardContext from './BackendWizardContext';\nimport { FORM_VALIDATION as SERVER_CONFIG_VALIDATION, STEP_KEY as SERVER_CONFIG_KEY } from './ServerConfigStep';\nimport { FORM_VALIDATION as USER_SYNC_VALIDATION, STEP_KEY as USER_SYNC_KEY } from './UserSyncStep';\nimport { STEP_KEY as GROUP_SYNC_KEY } from './GroupSyncStep';\nimport wizardSteps from './wizardSteps';\nimport Sidebar from './Sidebar';\n\nconst FORMS_VALIDATION = {\n [SERVER_CONFIG_KEY]: SERVER_CONFIG_VALIDATION,\n [USER_SYNC_KEY]: USER_SYNC_VALIDATION,\n};\n\nconst SubmitAllError = ({ error, backendId }: { error: FetchError, backendId: string | null | undefined }) => (\n \n \n \n Failed to {backendId ? 'edit' : 'create'} authentication service
\n {error?.message && <>{error.message}
>}\n {error?.additional?.res?.text}\n \n \n
\n);\n\nconst _formatBackendValidationErrors = (backendErrors: { [inputNameJSON: string]: string[] }) => {\n const backendErrorStrings = mapValues(backendErrors, (errorArray) => `Server validation error: ${errorArray.join(' ')}`);\n\n return mapKeys(backendErrorStrings, (_value, key) => camelCase(key));\n};\n\nexport const _passwordPayload = (backendId: string | null | undefined, systemUserPassword: string | null | undefined) => {\n const _formatPayload = (password) => {\n if (!password) {\n return undefined;\n }\n\n return password;\n };\n\n // Only update password on edit if necessary,\n // if a users resets the previously defined password its form value is an empty string\n if (backendId) {\n if (systemUserPassword === undefined) {\n return { keep_value: true };\n }\n\n if (systemUserPassword === '') {\n return { delete_value: true };\n }\n\n return { set_value: _formatPayload(systemUserPassword) };\n }\n\n return _formatPayload(systemUserPassword);\n};\n\nconst _prepareSubmitPayload = (stepsState, getUpdatedFormsValues) => (overrideFormValues: WizardFormValues): WizardSubmitPayload => {\n // We need to ensure that we are using the actual form values\n // It is possible to provide already updated form values, so we do not need to get them twice\n const formValues = overrideFormValues ?? getUpdatedFormsValues();\n const {\n defaultRoles = '',\n description,\n serverHost,\n serverPort,\n systemUserDn,\n systemUserPassword,\n title,\n transportSecurity,\n userUniqueIdAttribute,\n userFullNameAttribute,\n userNameAttribute,\n userSearchBase,\n userSearchPattern,\n verifyCertificates,\n } = formValues;\n const {\n serviceType,\n backendId,\n } = stepsState.authBackendMeta;\n\n return {\n title,\n description,\n default_roles: defaultRoles.split(','),\n config: {\n servers: [{ host: serverHost, port: serverPort }],\n system_user_dn: systemUserDn,\n system_user_password: _passwordPayload(backendId, systemUserPassword),\n transport_security: transportSecurity,\n type: serviceType,\n user_full_name_attribute: userFullNameAttribute,\n user_name_attribute: userNameAttribute,\n user_search_base: userSearchBase,\n user_search_pattern: userSearchPattern,\n user_unique_id_attribute: userUniqueIdAttribute,\n verify_certificates: verifyCertificates,\n },\n };\n};\n\nconst _getInvalidStepKeys = (formValues, newBackendValidationErrors, excludedFields): StepKey[] => {\n const validation = { ...FORMS_VALIDATION, [GROUP_SYNC_KEY]: {} };\n const enterpriseGroupSyncPlugin = getEnterpriseGroupSyncPlugin();\n const groupSyncValidation = enterpriseGroupSyncPlugin?.validation.GroupSyncValidation;\n\n if (groupSyncValidation && formValues.synchronizeGroups) {\n validation[GROUP_SYNC_KEY] = groupSyncValidation(formValues.teamSelectionType);\n }\n\n const invalidStepKeys = Object.entries(validation).map(([stepKey, formValidation]) => {\n const stepHasError = Object.entries(formValidation).some(([fieldName, fieldValidation]) => {\n if (excludedFields[fieldName]) {\n return false;\n }\n\n if (newBackendValidationErrors?.[fieldName]) {\n return true;\n }\n\n return !!validateField(fieldValidation)(formValues?.[fieldName]);\n });\n\n return stepHasError ? stepKey : undefined;\n });\n\n return compact(invalidStepKeys);\n};\n\nconst _onSubmitAll = (\n stepsState,\n setSubmitAllError,\n onSubmit,\n getUpdatedFormsValues,\n getSubmitPayload,\n validateSteps,\n shouldUpdateGroupSync,\n) => {\n const formValues = getUpdatedFormsValues();\n const invalidStepKeys = validateSteps(formValues, {});\n\n // Do not submit if there are invalid steps\n if (invalidStepKeys.length >= 1) {\n return Promise.resolve();\n }\n\n // Reset submit all errors\n setSubmitAllError(null);\n\n const payload = getSubmitPayload(formValues);\n const _submit = () => onSubmit(payload, formValues, stepsState.authBackendMeta.serviceType, shouldUpdateGroupSync).then(() => {\n history.push(Routes.SYSTEM.AUTHENTICATION.BACKENDS.OVERVIEW);\n }).catch((error) => {\n if (typeof error?.additional?.body?.errors === 'object') {\n const backendValidationErrors = _formatBackendValidationErrors(error.additional.body.errors);\n validateSteps(formValues, backendValidationErrors);\n } else {\n setSubmitAllError(error);\n }\n });\n\n if (stepsState.authBackendMeta.backendGroupSyncIsActive && !formValues.synchronizeGroups) {\n // eslint-disable-next-line no-alert\n if (window.confirm('Do you really want to remove the group synchronization config for this authentication service?')) {\n return _submit();\n }\n\n return Promise.resolve();\n }\n\n return _submit();\n};\n\nconst _setDefaultCreateRole = (roles, stepsState, setStepsState) => {\n const defaultCreateRoleId = roles?.find((role) => role.name === 'Reader')?.id;\n\n if (defaultCreateRoleId) {\n setStepsState({ ...stepsState, formValues: { ...stepsState.formValues, defaultRoles: defaultCreateRoleId } });\n }\n};\n\ntype Props = {\n authBackendMeta: AuthBackendMeta,\n initialStepKey: $PropertyType,\n initialValues: WizardFormValues,\n excludedFields: { [inputName: string]: boolean },\n help: { [inputName: string]: React.ReactElement | string | null | undefined },\n onSubmit: (WizardSubmitPayload, WizardFormValues, serviceType: $PropertyType, shouldUpdateGroupSync?: boolean) => Promise,\n};\n\nconst _loadRoles = (setPaginatedRoles) => {\n const getUnlimited = { page: 1, perPage: 0, query: '' };\n\n AuthzRolesDomain.loadRolesPaginated(getUnlimited).then(setPaginatedRoles);\n};\n\nconst BackendWizard = ({ initialValues, initialStepKey, onSubmit, authBackendMeta, help, excludedFields }: Props) => {\n const enterpriseGroupSyncPlugin = getEnterpriseGroupSyncPlugin();\n const MatchingGroupsProvider = enterpriseGroupSyncPlugin?.components.MatchingGroupsProvider;\n const [paginatedRoles, setPaginatedRoles] = useState();\n const [submitAllError, setSubmitAllError] = useState();\n const [stepsState, setStepsState] = useState({\n activeStepKey: initialStepKey,\n authBackendMeta,\n backendValidationErrors: undefined,\n formValues: initialValues,\n invalidStepKeys: [],\n });\n\n const formRefs = {\n [SERVER_CONFIG_KEY]: useRef>(null),\n [USER_SYNC_KEY]: useRef>(null),\n [GROUP_SYNC_KEY]: useRef>(null),\n };\n\n const wizardContextValue = useMemo(() => ({ ...stepsState, setStepsState }), [stepsState, setStepsState]);\n\n useEffect(() => _loadRoles(setPaginatedRoles), []);\n\n useEffect(() => {\n if (paginatedRoles && !authBackendMeta.backendId && !stepsState.formValues.defaultRoles) {\n _setDefaultCreateRole(paginatedRoles.list, stepsState, setStepsState);\n }\n }, [paginatedRoles, authBackendMeta.backendId, stepsState, setStepsState]);\n\n if (!paginatedRoles) {\n return ;\n }\n\n const _getUpdatedFormsValues = () => {\n const activeForm = formRefs[stepsState.activeStepKey]?.current;\n\n return { ...stepsState.formValues, ...activeForm?.values };\n };\n\n const _validateSteps = (formValues: WizardFormValues, newBackendValidationErrors): Array => {\n const invalidStepKeys = _getInvalidStepKeys(\n formValues,\n newBackendValidationErrors,\n excludedFields,\n );\n\n if (invalidStepKeys.length >= 1) {\n const nextStepKey = invalidStepKeys.includes(stepsState.activeStepKey) ? stepsState.activeStepKey : invalidStepKeys[0];\n\n setStepsState({\n ...stepsState,\n backendValidationErrors: newBackendValidationErrors,\n activeStepKey: nextStepKey,\n formValues,\n invalidStepKeys,\n });\n }\n\n return invalidStepKeys;\n };\n\n const _getSubmitPayload = _prepareSubmitPayload(stepsState, _getUpdatedFormsValues);\n\n const _setActiveStepKey = (stepKey: $PropertyType) => {\n const formValues = _getUpdatedFormsValues();\n let invalidStepKeys = [...stepsState.invalidStepKeys];\n\n // Only update invalid steps keys, we create them on submit all only\n if (invalidStepKeys.length >= 1) {\n invalidStepKeys = _getInvalidStepKeys(formValues, stepsState.backendValidationErrors, excludedFields);\n }\n\n setStepsState({\n ...stepsState,\n invalidStepKeys,\n formValues,\n activeStepKey: stepKey,\n });\n };\n\n const _handleSubmitAll = (shouldUpdateGroupSync?: boolean) => _onSubmitAll(\n stepsState,\n setSubmitAllError,\n onSubmit,\n _getUpdatedFormsValues,\n _getSubmitPayload,\n _validateSteps,\n shouldUpdateGroupSync,\n );\n\n const steps = wizardSteps({\n formRefs,\n help,\n handleSubmitAll: _handleSubmitAll,\n invalidStepKeys: stepsState.invalidStepKeys,\n prepareSubmitPayload: _getSubmitPayload,\n excludedFields,\n roles: paginatedRoles.list,\n setActiveStepKey: _setActiveStepKey,\n submitAllError: submitAllError && ,\n });\n\n const wizard = (\n \n \n \n );\n\n return (\n \n {MatchingGroupsProvider\n ? (\n \n {wizard}\n \n )\n : wizard}\n \n );\n};\n\nBackendWizard.defaultProps = {\n initialStepKey: SERVER_CONFIG_KEY,\n help: undefined,\n excludedFields: {},\n};\n\nBackendWizard.propTypes = {\n authBackendMeta: PropTypes.shape({\n backendHasPassword: PropTypes.bool,\n backendId: PropTypes.string,\n serviceTitle: PropTypes.string.isRequired,\n serviceType: PropTypes.string.isRequired,\n }).isRequired,\n help: PropTypes.object,\n initialStepKey: PropTypes.string,\n initialValues: PropTypes.object.isRequired,\n excludedFields: PropTypes.object,\n};\n\nexport default BackendWizard;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport BackendWizard from './BackendWizard';\n\nexport default BackendWizard;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\n\nimport { DocumentTitle } from 'components/common';\nimport { getEnterpriseGroupSyncPlugin } from 'util/AuthenticationService';\nimport type { WizardFormValues } from 'components/authentication/directoryServices/BackendWizard/BackendWizardContext';\n\nimport WizardPageHeader from './WizardPageHeader';\n\nimport handleCreate from '../HandleCreate';\nimport BackendWizard from '../BackendWizard';\n\nexport const AUTH_BACKEND_META = {\n serviceType: 'ldap',\n serviceTitle: 'LDAP',\n};\n\nexport const HELP = {\n // server config help\n systemUserDn: (\n \n The username for the initial connection to the LDAP server, e.g. cn=admin,dc=example,dc=com
,\n this might be optional depending on your LDAP server.\n \n ),\n systemUserPassword: 'The password for the initial connection to the LDAP server.',\n // user sync help\n userSearchBase: (\n \n The base tree to limit the LDAP search query to, e.g. cn=users,dc=example,dc=com
.\n \n ),\n userSearchPattern: (\n \n For example {'(&(uid={0})(objectClass=inetOrgPerson))'}
.{' '}\n The string {'{0}'}
will be replaced by the entered username.\n \n ),\n userNameAttribute: (\n \n Which LDAP attribute to use for the username of the user in Graylog, e.g uid
.
\n Try to load a test user in the sidebar section User Login Test, if you are unsure which attribute to use.\n \n ),\n userFullNameAttribute: (\n \n Which LDAP attribute to use for the full name of a synchronized Graylog user, e.g. cn
.
\n \n ),\n userUniqueIdAttribute: (\n \n Which LDAP attribute to use for the ID of a synchronized Graylog user, e.g. entryUUID
.
\n \n ),\n defaultRoles: (\n The default Graylog roles synchronized user will obtain. All users need the Reader
role, to use the Graylog web interface\n ),\n};\n\nconst INITIAL_VALUES: Partial = {\n title: AUTH_BACKEND_META.serviceTitle,\n serverHost: 'localhost',\n serverPort: 636,\n transportSecurity: 'tls',\n userFullNameAttribute: 'cn',\n userNameAttribute: 'uid',\n userUniqueIdAttribute: 'entryUUID',\n verifyCertificates: true,\n};\n\nconst BackendCreate = () => {\n const enterpriseGroupSyncPlugin = getEnterpriseGroupSyncPlugin();\n const {\n help: groupSyncHelp = {},\n initialValues: initialGroupSyncValues = {},\n } = enterpriseGroupSyncPlugin?.wizardConfig?.ldap ?? {};\n const help = { ...HELP, ...groupSyncHelp };\n const initialValues = { ...INITIAL_VALUES, ...initialGroupSyncValues };\n\n return (\n \n \n \n \n );\n};\n\nexport default BackendCreate;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as Immutable from 'immutable';\n\nimport type { DirectoryServiceBackend } from 'logic/authentication/directoryServices/types';\n\nimport type { WizardFormValues } from './BackendWizard/BackendWizardContext';\n\nexport default ({\n title,\n description,\n defaultRoles = Immutable.List(),\n config: {\n servers = [],\n systemUserDn,\n transportSecurity,\n userFullNameAttribute,\n userNameAttribute,\n userSearchBase,\n userSearchPattern,\n userUniqueIdAttribute,\n verifyCertificates,\n },\n}: DirectoryServiceBackend): WizardFormValues => ({\n title,\n description,\n defaultRoles: defaultRoles.join(),\n serverHost: servers[0].host,\n serverPort: servers[0].port,\n systemUserDn,\n transportSecurity,\n userFullNameAttribute,\n userNameAttribute,\n userSearchBase,\n userSearchPattern,\n userUniqueIdAttribute,\n verifyCertificates,\n});\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport UserNotification from 'util/UserNotification';\nimport type { WizardSubmitPayload } from 'logic/authentication/directoryServices/types';\nimport { getEnterpriseGroupSyncPlugin } from 'util/AuthenticationService';\nimport { AuthenticationActions } from 'stores/authentication/AuthenticationStore';\n\nimport type { WizardFormValues } from './BackendWizard/BackendWizardContext';\n\nexport default (payload: WizardSubmitPayload, formValues: WizardFormValues, backendId: string, backendGroupSyncIsActive: boolean, serviceType: string, shouldUpdateGroupSync: boolean | undefined = true) => {\n const enterpriseGroupSyncPlugin = getEnterpriseGroupSyncPlugin();\n const notifyOnSuccess = () => UserNotification.success('Authentication service was updated successfully.', 'Success');\n const notifyOnError = (error) => UserNotification.error(`Updating authentication service failed with status: ${error}`, 'Error');\n\n return AuthenticationActions.update(backendId, {\n ...payload,\n id: backendId,\n }).then((result) => {\n if (enterpriseGroupSyncPlugin && shouldUpdateGroupSync) {\n return enterpriseGroupSyncPlugin.actions.onDirectoryServiceBackendUpdate(backendGroupSyncIsActive, formValues, backendId, serviceType).then(notifyOnSuccess);\n }\n\n notifyOnSuccess();\n\n return result;\n }).catch((error) => {\n notifyOnError(error);\n throw error;\n });\n};\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\n\nimport type { DirectoryServiceBackend } from 'logic/authentication/directoryServices/types';\nimport { getEnterpriseGroupSyncPlugin } from 'util/AuthenticationService';\nimport { DocumentTitle, Spinner } from 'components/common';\n\nimport { AUTH_BACKEND_META, HELP } from './BackendCreate';\nimport WizardPageHeader from './WizardPageHeader';\n\nimport prepareInitialWizardValues from '../PrepareInitialWizardValues';\nimport BackendWizard from '../BackendWizard';\nimport handleUpdate from '../HandleUpdate';\n\ntype Props = {\n authenticationBackend: DirectoryServiceBackend,\n initialStepKey: string | null | undefined,\n};\n\nconst _optionalWizardProps = (initialStepKey: string | null | undefined) => {\n return { initialStepKey };\n};\n\nconst BackendEdit = ({ authenticationBackend, initialStepKey }: Props) => {\n const enterpriseGroupSyncPlugin = getEnterpriseGroupSyncPlugin();\n const {\n help: groupSyncHelp = {},\n initialValues: initialGroupSyncValues = {},\n } = enterpriseGroupSyncPlugin?.wizardConfig?.ldap ?? {};\n const help = { ...HELP, ...groupSyncHelp };\n let initialValues = prepareInitialWizardValues(authenticationBackend);\n\n if (enterpriseGroupSyncPlugin) {\n const {\n formValues: groupSyncFormValues,\n finishedLoading,\n } = enterpriseGroupSyncPlugin.hooks.useInitialGroupSyncValues(authenticationBackend.id, initialGroupSyncValues);\n\n if (!finishedLoading) {\n return ;\n }\n\n initialValues = { ...initialValues, ...groupSyncFormValues };\n }\n\n const authBackendMeta = {\n ...AUTH_BACKEND_META,\n backendId: authenticationBackend.id,\n backendHasPassword: authenticationBackend.config.systemUserPassword.isSet,\n backendGroupSyncIsActive: !!initialValues.synchronizeGroups,\n };\n const _handleSubmit = (\n payload,\n formValues,\n serviceType,\n shouldUpdateGroupSync,\n ) => handleUpdate(\n payload,\n formValues,\n authenticationBackend.id,\n !!initialValues.synchronizeGroups,\n serviceType,\n shouldUpdateGroupSync,\n );\n\n return (\n \n \n \n \n );\n};\n\nexport default BackendEdit;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\n\nimport { LinkContainer } from 'components/common/router';\nimport Routes from 'routing/Routes';\nimport { Button } from 'components/bootstrap';\n\ntype Props = {\n authenticationBackendId: string,\n stepKey: string,\n};\n\nconst EditLinkButton = ({ authenticationBackendId, stepKey }: Props) => (\n \n \n \n);\n\nexport default EditLinkButton;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\n\nimport type { DirectoryServiceBackend } from 'logic/authentication/directoryServices/types';\nimport { ReadOnlyFormGroup } from 'components/common';\nimport SectionComponent from 'components/common/Section/SectionComponent';\n\nimport EditLinkButton from './EditLinkButton';\n\nimport { STEP_KEY as SERVER_CONFIG_KEY } from '../BackendWizard/ServerConfigStep';\n\ntype Props = {\n authenticationBackend: DirectoryServiceBackend,\n};\n\nconst ServerConfigSection = ({ authenticationBackend }: Props) => {\n const { title, description, config: { servers = [], systemUserDn, systemUserPassword, transportSecurity, verifyCertificates } } = authenticationBackend;\n const serverUrls = servers.map((server) => `${server.host}:${server.port}`).join(', ');\n\n return (\n }>\n \n \n \n \n \n \n \n \n );\n};\n\nexport default ServerConfigSection;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\nimport * as Immutable from 'immutable';\nimport * as PropTypes from 'prop-types';\n\nimport type { DirectoryServiceBackend } from 'logic/authentication/directoryServices/types';\nimport type Role from 'logic/roles/Role';\nimport { ReadOnlyFormGroup } from 'components/common';\nimport SectionComponent from 'components/common/Section/SectionComponent';\n\nimport EditLinkButton from './EditLinkButton';\n\nimport { STEP_KEY as USER_SYNC_KEY } from '../BackendWizard/UserSyncStep';\n\nconst rolesList = (defaultRolesIds: Immutable.List, roles: Immutable.List) => {\n const defaultRolesNames = defaultRolesIds.map((roleId) => roles.find((role) => role.id === roleId)?.name ?? 'Role not found');\n\n return defaultRolesNames.join(', ');\n};\n\ntype Props = {\n authenticationBackend: DirectoryServiceBackend,\n excludedFields: {[ inputName: string ]: boolean },\n roles: Immutable.List,\n};\n\nconst UserSyncSection = ({ authenticationBackend, roles, excludedFields }: Props) => {\n const {\n userSearchBase,\n userSearchPattern,\n userNameAttribute,\n userFullNameAttribute,\n userUniqueIdAttribute,\n } = authenticationBackend.config;\n const {\n defaultRoles = Immutable.List(),\n } = authenticationBackend;\n\n return (\n }>\n \n \n \n \n {!excludedFields.userUniqueIdAttribute && (\n \n )}\n \n \n );\n};\n\nUserSyncSection.defaultProps = {\n excludedFields: {},\n};\n\nUserSyncSection.propTypes = {\n excludedFields: PropTypes.object,\n};\n\nexport default UserSyncSection;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\nimport type * as Immutable from 'immutable';\n\nimport { getEnterpriseGroupSyncPlugin } from 'util/AuthenticationService';\nimport type { DirectoryServiceBackend } from 'logic/authentication/directoryServices/types';\nimport type Role from 'logic/roles/Role';\nimport { EnterprisePluginNotFound } from 'components/common';\nimport SectionComponent from 'components/common/Section/SectionComponent';\n\nimport EditLinkButton from './EditLinkButton';\n\nimport { STEP_KEY as GROUP_SYNC_KEY } from '../BackendWizard/GroupSyncStep';\n\ntype Props = {\n authenticationBackend: DirectoryServiceBackend,\n excludedFields?: {[ inputName: string ]: boolean },\n roles: Immutable.List,\n};\n\nconst GroupSyncSection = ({ authenticationBackend, roles, excludedFields }: Props) => {\n const enterpriseGroupSyncPlugin = getEnterpriseGroupSyncPlugin();\n const GroupSyncSectionPlugin = enterpriseGroupSyncPlugin?.components.GroupSyncSection;\n\n if (!GroupSyncSectionPlugin) {\n return (\n \n )}>\n \n \n );\n }\n\n return (\n \n );\n};\n\nGroupSyncSection.defaultProps = {\n excludedFields: undefined,\n};\n\nexport default GroupSyncSection;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\nimport type * as Immutable from 'immutable';\n\nimport { getEnterpriseGroupSyncPlugin } from 'util/AuthenticationService';\nimport type { DirectoryServiceBackend } from 'logic/authentication/directoryServices/types';\nimport type Role from 'logic/roles/Role';\n\nimport ServerConfigSection from '../BackendConfigDetails/ServerConfigSection';\nimport UserSyncSection from '../BackendConfigDetails/UserSyncSection';\nimport GroupSyncSection from '../BackendConfigDetails/GroupSyncSection';\n\ntype Props = {\n authenticationBackend: DirectoryServiceBackend,\n roles: Immutable.List,\n};\n\nconst BackendConfigDetails = ({ authenticationBackend, roles }: Props) => {\n const enterpriseGroupSyncPlugin = getEnterpriseGroupSyncPlugin();\n const {\n excludedFields: groupSyncExcludedFields = {},\n } = enterpriseGroupSyncPlugin?.wizardConfig?.activeDirectory ?? {};\n const excludedFields = { ...groupSyncExcludedFields, userUniqueIdAttribute: true };\n\n return (\n <>\n \n \n \n >\n );\n};\n\nexport default BackendConfigDetails;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\nimport type * as Immutable from 'immutable';\n\nimport { getEnterpriseGroupSyncPlugin } from 'util/AuthenticationService';\nimport type { DirectoryServiceBackend } from 'logic/authentication/directoryServices/types';\nimport type Role from 'logic/roles/Role';\n\nimport ServerConfigSection from '../BackendConfigDetails/ServerConfigSection';\nimport UserSyncSection from '../BackendConfigDetails/UserSyncSection';\nimport GroupSyncSection from '../BackendConfigDetails/GroupSyncSection';\n\ntype Props = {\n authenticationBackend: DirectoryServiceBackend,\n roles: Immutable.List,\n};\n\nconst BackendConfigDetails = ({ authenticationBackend, roles }: Props) => {\n const enterpriseGroupSyncPlugin = getEnterpriseGroupSyncPlugin();\n const {\n excludedFields: groupSyncExcludedFields = {},\n } = enterpriseGroupSyncPlugin?.wizardConfig?.ldap ?? {};\n const excludedFields = { ...groupSyncExcludedFields };\n\n return (\n <>\n \n \n \n >\n );\n};\n\nexport default BackendConfigDetails;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\n\nimport AuthenticationPageNavigation from 'components/authentication/AuthenticationPageNavigation';\nimport { PageHeader } from 'components/common';\nimport useActiveBackend from 'components/authentication/useActiveBackend';\nimport BackendActionLinks from 'components/authentication/BackendActionLinks';\nimport DocsHelper from 'util/DocsHelper';\nimport StringUtils from 'util/StringUtils';\nimport type { DirectoryServiceBackend } from 'logic/authentication/directoryServices/types';\n\ntype Props = {\n authenticationBackend?: DirectoryServiceBackend,\n};\n\nconst _pageTitle = (authBackend) => {\n if (authBackend) {\n const backendTitle = StringUtils.truncateWithEllipses(authBackend.title, 30);\n\n return <>Edit Authentication Service - {backendTitle}>;\n }\n\n return 'Create Active Directory Authentication Service';\n};\n\nconst WizardPageHeader = ({ authenticationBackend: authBackend }: Props) => {\n const { finishedLoading, activeBackend } = useActiveBackend();\n const pageTitle = _pageTitle(authBackend);\n\n return (\n <>\n \n \n )}\n documentationLink={{\n title: 'Authentication documentation',\n path: DocsHelper.PAGES.USERS_ROLES,\n }}>\n Configure Graylog's authentication services of this Graylog cluster.\n \n >\n );\n};\n\nWizardPageHeader.defaultProps = {\n authenticationBackend: undefined,\n};\n\nexport default WizardPageHeader;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\n\nimport { DocumentTitle } from 'components/common';\nimport { getEnterpriseGroupSyncPlugin } from 'util/AuthenticationService';\nimport type { WizardFormValues } from 'components/authentication/directoryServices/BackendWizard/BackendWizardContext';\n\nimport WizardPageHeader from './WizardPageHeader';\n\nimport BackendWizard from '../BackendWizard';\nimport handleCreate from '../HandleCreate';\n\nexport const HELP = {\n // server config help\n systemUserDn: (\n \n The username for the initial connection to the Active Directory server, e.g. [email protected]
.
\n This needs to match the userPrincipalName
of that user.\n \n ),\n systemUserPassword: 'The password for the initial connection to the Active Directory server.',\n // user sync help\n userSearchBase: (\n \n The base tree to limit the Active Directory search query to, e.g. cn=users,dc=example,dc=com
.\n \n ),\n userSearchPattern: (\n \n For example {'(&(objectClass=user)(|(sAMAccountName={0})(userPrincipalName={0})))'}
.{' '}\n The string {'{0}'}
will be replaced by the entered username.\n \n ),\n userNameAttribute: (\n \n Which Active Directory attribute to use for the full name of the user in Graylog, e.g. userPrincipalName
.
\n Try to load a test user in the sidebar section User Login Test, if you are unsure which attribute to use.\n \n ),\n userFullNameAttribute: (\n \n Which Active Directory attribute to use for the full name of a synchronized Graylog user, e.g. displayName
.
\n \n ),\n defaultRoles: (\n The default Graylog roles synchronized user will obtain. All users need the Reader
role, to use the Graylog web interface\n ),\n};\n\nexport const AUTH_BACKEND_META = {\n serviceTitle: 'Active Directory',\n serviceType: 'active-directory',\n};\n\nconst INITIAL_VALUES: Partial = {\n title: AUTH_BACKEND_META.serviceTitle,\n serverHost: 'localhost',\n serverPort: 636,\n transportSecurity: 'tls',\n userSearchPattern: '(&(objectClass=user)(|(sAMAccountName={0})(userPrincipalName={0})))',\n userFullNameAttribute: 'displayName',\n userNameAttribute: 'userPrincipalName',\n verifyCertificates: true,\n};\n\nconst BackendCreate = () => {\n const enterpriseGroupSyncPlugin = getEnterpriseGroupSyncPlugin();\n const {\n help: groupSyncHelp = {},\n excludedFields: groupSyncExcludedFields = {},\n initialValues: initialGroupSyncValues,\n } = enterpriseGroupSyncPlugin?.wizardConfig?.activeDirectory ?? {};\n const help = { ...HELP, ...groupSyncHelp };\n const initialValues = { ...INITIAL_VALUES, ...initialGroupSyncValues };\n const excludedFields = { ...groupSyncExcludedFields, userUniqueIdAttribute: true };\n\n return (\n \n \n \n \n );\n};\n\nexport default BackendCreate;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\n\nimport type { DirectoryServiceBackend } from 'logic/authentication/directoryServices/types';\nimport { DocumentTitle, Spinner } from 'components/common';\nimport { getEnterpriseGroupSyncPlugin } from 'util/AuthenticationService';\n\nimport WizardPageHeader from './WizardPageHeader';\nimport { HELP, AUTH_BACKEND_META } from './BackendCreate';\n\nimport prepareInitialWizardValues from '../PrepareInitialWizardValues';\nimport BackendWizard from '../BackendWizard';\nimport handleUpdate from '../HandleUpdate';\n\ntype Props = {\n authenticationBackend: DirectoryServiceBackend,\n initialStepKey: string | null | undefined,\n};\n\nconst _optionalWizardProps = (initialStepKey: string | null | undefined) => {\n return { initialStepKey };\n};\n\nconst BackendEdit = ({ authenticationBackend, initialStepKey }: Props) => {\n const enterpriseGroupSyncPlugin = getEnterpriseGroupSyncPlugin();\n const {\n help: groupSyncHelp = {},\n excludedFields: groupSyncExcludedFields = {},\n initialValues: initialGroupSyncValues = {},\n } = enterpriseGroupSyncPlugin?.wizardConfig?.activeDirectory ?? {};\n const help = { ...HELP, ...groupSyncHelp };\n const excludedFields = { ...groupSyncExcludedFields, userUniqueIdAttribute: true };\n let initialValues = prepareInitialWizardValues(authenticationBackend);\n\n if (enterpriseGroupSyncPlugin) {\n const {\n formValues: groupFormValues,\n finishedLoading,\n } = enterpriseGroupSyncPlugin.hooks.useInitialGroupSyncValues(authenticationBackend.id, initialGroupSyncValues);\n\n if (!finishedLoading) {\n return ;\n }\n\n initialValues = { ...initialValues, ...groupFormValues };\n }\n\n const authBackendMeta = {\n ...AUTH_BACKEND_META,\n backendId: authenticationBackend.id,\n backendHasPassword: authenticationBackend.config.systemUserPassword.isSet,\n backendGroupSyncIsActive: !!initialValues.synchronizeGroups,\n };\n const _handleSubmit = (\n payload,\n formValues,\n serviceType,\n shouldUpdateGroupSync,\n ) => handleUpdate(\n payload,\n formValues,\n authenticationBackend.id,\n !!initialValues.synchronizeGroups,\n serviceType,\n shouldUpdateGroupSync,\n );\n\n return (\n \n \n \n \n );\n};\n\nexport default BackendEdit;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport { PluginManifest, PluginStore } from 'graylog-web-plugin/plugin';\n\nimport ConfigParser from 'logic/authentication/directoryServices/BackendConfigParser';\n\nimport BackendCreateLDAP from './directoryServices/ldap/BackendCreate';\nimport BackendEditLDAP from './directoryServices/ldap/BackendEdit';\nimport BackendConfigDetailsAD from './directoryServices/activeDirectory/BackendConfigDetails';\nimport BackendConfigDetailsLDAP from './directoryServices/ldap/BackendConfigDetails';\nimport BackendCreateAD from './directoryServices/activeDirectory/BackendCreate';\nimport BackendEditAD from './directoryServices/activeDirectory/BackendEdit';\n\nPluginStore.register(new PluginManifest({}, {\n 'authentication.services': [\n {\n name: 'ldap',\n displayName: 'LDAP',\n createComponent: BackendCreateLDAP,\n editComponent: BackendEditLDAP,\n configDetailsComponent: BackendConfigDetailsLDAP,\n configToJson: ConfigParser.toJson,\n configFromJson: ConfigParser.fromJson,\n },\n {\n name: 'active-directory',\n displayName: 'Active Directory',\n createComponent: BackendCreateAD,\n editComponent: BackendEditAD,\n configDetailsComponent: BackendConfigDetailsAD,\n configToJson: ConfigParser.toJson,\n configFromJson: ConfigParser.fromJson,\n },\n ],\n}));\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\n/* eslint-disable import/prefer-default-export */\nimport { useState, useEffect } from 'react';\n\nimport type { LoadActiveResponse } from 'stores/authentication/AuthenticationStore';\nimport type { ListenableAction, PromiseProvider } from 'stores/StoreTypes';\nimport AuthenticationDomain from 'domainActions/authentication/AuthenticationDomain';\n\nconst useActiveBackend = (listenableActions: Array> = []) => {\n const [loadActiveResponse, setLoadActiveResponse] = useState();\n const [finishedLoading, setFinishedLoading] = useState(false);\n const _loadActive = () => AuthenticationDomain.loadActive().then((response) => {\n setFinishedLoading(true);\n setLoadActiveResponse(response);\n });\n\n useEffect(() => { _loadActive(); }, []);\n\n useEffect(() => {\n const unlistenActions = listenableActions.map((action) => action.completed.listen(_loadActive));\n\n return () => {\n unlistenActions.forEach((unlistenAction) => unlistenAction());\n };\n }, [listenableActions]);\n\n return {\n finishedLoading,\n activeBackend: loadActiveResponse?.backend,\n backendsTotal: loadActiveResponse?.context?.backendsTotal,\n };\n};\n\nexport default useActiveBackend;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\nimport styled, { css } from 'styled-components';\n\nimport { Button, ButtonToolbar } from 'components/bootstrap';\nimport { LinkContainer } from 'components/common/router';\nimport { IfPermitted } from 'components/common';\nimport NavItemStateIndicator, {\n hoverIndicatorStyles,\n activeIndicatorStyles,\n} from 'components/common/NavItemStateIndicator';\n\nconst Container = styled(ButtonToolbar)`\n margin-bottom: 10px;\n`;\n\nconst StyledButton = styled(Button)(({ theme }) => css`\n font-family: ${theme.fonts.family.navigation};\n font-size: ${theme.fonts.size.navigation};\n\n &&&& {\n color: ${theme.colors.variant.darker.default};\n \n :hover, :focus {\n text-decoration: none; \n }\n\n :hover {\n ${hoverIndicatorStyles(theme)}\n }\n\n &.active {\n color: ${theme.colors.global.textDefault};\n\n ${activeIndicatorStyles(theme)}\n\n :hover, :focus {\n ${activeIndicatorStyles(theme)}\n }\n }\n }\n`);\n\nStyledButton.displayName = 'Button';\n\ntype Props = {\n /**\n * List of nav items. Define permissions, if the item should only be displayed for users with specific permissions.\n * By default, an item is active if the current URL starts with the item URL.\n * If you only want to display an item as active only when its path matches exactly, set `exactPathMatch` to true.\n */\n items: Array<{\n title: string,\n path: string,\n permissions?: string | Array\n exactPathMatch?: boolean,\n }>\n}\n\n/**\n * Simple tab navigation to allow navigating to subareas of a page.\n */\nconst PageNavigation = ({ items }: Props) => (\n \n {items.map(({ path, title, permissions, exactPathMatch }) => {\n if (!path) {\n return null;\n }\n\n return (\n \n \n \n \n {title}\n \n \n \n \n );\n })}\n \n);\n\nexport default PageNavigation;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as React from 'react';\nimport styled, { css } from 'styled-components';\n\nimport Spinner from 'components/common/Spinner';\nimport { Row, Col } from 'components/bootstrap';\n\ntype Props = {\n children: React.ReactNode,\n title: string,\n showLoading?: boolean,\n headerActions?: React.ReactElement,\n className?: string,\n};\n\nconst Header = styled.div`\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n\n *:not(:first-child) {\n margin-left: 10px;\n }\n`;\n\nexport const Headline = styled.h2`\n margin-bottom: 15px;\n display: inline;\n`;\n\nconst LoadingSpinner = styled(Spinner)(({ theme }) => css`\n margin-left: 10px;\n font-size: ${theme.fonts.size.h3};\n`);\n\nconst SectionComponent = ({ children, title, showLoading = false, headerActions, className }: Props) => (\n \n \n \n \n {title}\n {showLoading && }\n \n {headerActions}\n \n {children}\n \n
\n);\n\nSectionComponent.defaultProps = {\n className: '',\n showLoading: false,\n headerActions: undefined,\n};\n\nexport default SectionComponent;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport { AuthzRolesActions } from 'stores/roles/AuthzRolesStore';\n\nimport notifyingAction from '../notifyingAction';\n\nconst load = notifyingAction({\n action: AuthzRolesActions.load,\n error: (error, roleId) => ({\n message: `Loading role with id \"${roleId}\" failed with status: ${error}`,\n }),\n notFoundRedirect: true,\n});\n\nconst deleteAction = notifyingAction({\n action: AuthzRolesActions.delete,\n success: (_roleId, roleName) => ({\n message: `Role \"${roleName}\" was deleted successfully`,\n }),\n error: (error, _roleId, roleName) => ({\n message: `Deleting role \"${roleName}\" failed with status: ${error}`,\n }),\n});\n\nconst addMembers = notifyingAction({\n action: AuthzRolesActions.addMembers,\n success: (_roleId, usernames) => ({\n message: `Users:\"${usernames.join(', ')}\" were assigned successfully`,\n }),\n error: (error, _roleId, usernames) => ({\n message: `Assigning users \"${usernames.join(', ')}\" failed with status: ${error}`,\n }),\n});\n\nconst removeMember = notifyingAction({\n action: AuthzRolesActions.removeMember,\n success: (_roleId, username) => ({\n message: `User \"${username}\" was unassigned successfully`,\n }),\n error: (error, _roleId, username) => ({\n message: `Unassign user \"${username}\" failed with status: ${error}`,\n }),\n});\n\nconst loadUsersForRole = notifyingAction({\n action: AuthzRolesActions.loadUsersForRole,\n error: (error, _roleId, roleName) => ({\n message: `Loading users for role \"${roleName}\" failed with status: ${error}`,\n }),\n});\n\nconst loadRolesForUser = notifyingAction({\n action: AuthzRolesActions.loadRolesForUser,\n error: (error, username) => ({\n message: `Loading roles for user \"${username}\" failed with status: ${error}`,\n }),\n});\n\nconst loadRolesPaginated = notifyingAction({\n action: AuthzRolesActions.loadRolesPaginated,\n error: (error) => ({\n message: `Loading roles failed with status: ${error}`,\n }),\n});\n\nexport default {\n load,\n delete: deleteAction,\n addMembers,\n removeMember,\n loadUsersForRole,\n loadRolesForUser,\n loadRolesPaginated,\n};\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport * as Immutable from 'immutable';\nimport type { $PropertyType } from 'utility-types';\n\ntype InternalState = {\n id: string,\n name: string,\n description: string,\n permissions: Immutable.Set,\n readOnly: boolean,\n};\n\nexport type RoleJSON = {\n id: string,\n name: string,\n description: string,\n permissions: Immutable.Set,\n read_only: boolean,\n};\n\nexport default class Role {\n _value: InternalState;\n\n constructor(\n id: $PropertyType,\n name: $PropertyType,\n description: $PropertyType,\n permissions: $PropertyType,\n readOnly: $PropertyType,\n ) {\n this._value = {\n id,\n name,\n description,\n permissions,\n readOnly,\n };\n }\n\n get id() {\n return this._value.id;\n }\n\n get name() {\n return this._value.name;\n }\n\n get description() {\n return this._value.description;\n }\n\n get permissions() {\n return this._value.permissions;\n }\n\n get readOnly() {\n return this._value.readOnly;\n }\n\n toBuilder() {\n const {\n id,\n name,\n description,\n permissions,\n readOnly,\n } = this._value;\n\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n return new Builder(Immutable.Map({\n id,\n name,\n description,\n permissions,\n readOnly,\n }));\n }\n\n static create(\n id: $PropertyType,\n name: $PropertyType,\n description: $PropertyType,\n permissions: $PropertyType,\n readOnly: $PropertyType,\n ) {\n return new Role(\n id,\n name,\n description,\n permissions,\n readOnly,\n );\n }\n\n toJSON() {\n const {\n id,\n name,\n description,\n permissions,\n readOnly,\n } = this._value;\n\n return {\n id,\n name,\n description,\n permissions,\n read_only: readOnly,\n };\n }\n\n static fromJSON(value: RoleJSON) {\n const {\n id,\n name,\n description,\n permissions,\n read_only: readOnly,\n } = value;\n\n return Role.create(\n id,\n name,\n description,\n permissions,\n readOnly,\n );\n }\n\n static builder(): Builder {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n return new Builder();\n }\n}\n\ntype BuilderState = Immutable.Map;\n\nclass Builder {\n value: BuilderState;\n\n constructor(value: BuilderState = Immutable.Map()) {\n this.value = value;\n }\n\n id(value: $PropertyType) {\n return new Builder(this.value.set('id', value));\n }\n\n name(value: $PropertyType) {\n return new Builder(this.value.set('name', value));\n }\n\n description(value: $PropertyType) {\n return new Builder(this.value.set('description', value));\n }\n\n permissions(value: $PropertyType) {\n return new Builder(this.value.set('permissions', value));\n }\n\n readOnly(value: $PropertyType) {\n return new Builder(this.value.set('readOnly', value));\n }\n\n build() {\n const {\n id,\n name,\n description,\n permissions,\n readOnly,\n } = this.value.toObject();\n\n return new Role(\n id,\n name,\n description,\n permissions,\n readOnly,\n );\n }\n}\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport Reflux from 'reflux';\nimport type * as Immutable from 'immutable';\n\nimport type Role from 'logic/roles/Role';\nimport type UserOverview from 'logic/users/UserOverview';\nimport { singletonActions } from 'logic/singleton';\nimport type { PaginatedList, Pagination } from 'stores/PaginationTypes';\n\nexport type UserContext = {\n id: string,\n username: string,\n};\n\nexport type RoleContext = {\n users: { [key: string]: UserContext[] },\n};\n\nexport type PaginatedRoles = PaginatedList & {\n context: RoleContext,\n};\nexport type PaginatedUsers = PaginatedList;\n\nexport type ActionsType = {\n load: (roleId: string) => Promise,\n delete: (roleId: string, roleName: string) => Promise,\n addMembers: (roleId: string, usernames: Immutable.Set) => Promise,\n removeMember: (roleId: string, username: string) => Promise,\n loadUsersForRole: (roleId: string, roleName: string, pagination: Pagination) => Promise,\n loadRolesForUser: (username: string, pagination: Pagination) => Promise,\n loadRolesPaginated: (pagination: Pagination) => Promise,\n};\n\nconst AuthzRolesActions = singletonActions(\n 'AuthzRoles',\n () => Reflux.createActions({\n load: { asyncResult: true },\n delete: { asyncResult: true },\n addMembers: { asyncResult: true },\n removeMember: { asyncResult: true },\n loadUsersForRole: { asyncResult: true },\n loadRolesForUser: { asyncResult: true },\n loadRolesPaginated: { asyncResult: true },\n }),\n);\n\nexport default AuthzRolesActions;\n","/*\n * Copyright (C) 2020 Graylog, Inc.\n *\n * This program is free software: you can redistribute it and/or modify\n * it under the terms of the Server Side Public License, version 1,\n * as published by MongoDB, Inc.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * Server Side Public License for more details.\n *\n * You should have received a copy of the Server Side Public License\n * along with this program. If not, see\n * .\n */\nimport Reflux from 'reflux';\nimport * as Immutable from 'immutable';\nimport type { $PropertyType } from 'utility-types';\n\nimport type { PaginatedUsersResponse } from 'stores/users/UsersStore';\nimport type { Store } from 'stores/StoreTypes';\nimport fetch from 'logic/rest/FetchProvider';\nimport ApiRoutes from 'routing/ApiRoutes';\nimport { qualifyUrl } from 'util/URLUtils';\nimport { singletonStore } from 'logic/singleton';\nimport PaginationURL from 'util/PaginationURL';\nimport Role from 'logic/roles/Role';\nimport type { RoleJSON } from 'logic/roles/Role';\nimport type { PaginatedRoles, PaginatedUsers, RoleContext } from 'actions/roles/AuthzRolesActions';\nimport AuthzRolesActions from 'actions/roles/AuthzRolesActions';\nimport UserOverview from 'logic/users/UserOverview';\nimport type { PaginatedListJSON, Pagination } from 'stores/PaginationTypes';\n\nexport type PaginatedRolesResponse = PaginatedListJSON & {\n roles: Array,\n context?: RoleContext,\n};\n\nconst _responseToPaginatedList = ({\n count,\n total,\n page,\n per_page,\n query,\n roles = [],\n context = { users: undefined },\n}: PaginatedRolesResponse) => ({\n list: Immutable.List(roles.map((r) => Role.fromJSON(r))),\n pagination: {\n query,\n page,\n perPage: per_page,\n count,\n total,\n },\n context,\n});\n\nconst _responseToPaginatedUserList = ({ count, total, page, per_page, query, users }: PaginatedUsersResponse) => ({\n list: Immutable.List(users.map((u) => UserOverview.fromJSON(u))),\n pagination: {\n page,\n perPage: per_page,\n query,\n count,\n total,\n },\n});\n\nconst encodeApiUrl = (apiRoute: (...args: Array) => { url: string }, uriParams: Array = []): string => {\n const encodedUriParams = uriParams.map((param) => encodeURIComponent(param));\n\n return apiRoute(...encodedUriParams).url;\n};\n\nconst AuthzRolesStore: Store<{}> = singletonStore(\n 'AuthzRoles',\n () => Reflux.createStore({\n listenables: [AuthzRolesActions],\n\n load(roleId: $PropertyType): Promise {\n const url = qualifyUrl(encodeApiUrl(ApiRoutes.AuthzRolesController.load, [roleId]));\n const promise = fetch('GET', url).then(Role.fromJSON);\n\n AuthzRolesActions.load.promise(promise);\n\n return promise;\n },\n\n delete(roleId: string): Promise {\n const url = qualifyUrl(encodeApiUrl(ApiRoutes.AuthzRolesController.delete, [roleId]));\n const promise = fetch('DELETE', url);\n\n AuthzRolesActions.delete.promise(promise);\n\n return promise;\n },\n\n addMembers(roleId: string, usernames: Immutable.Set): Promise {\n const url = encodeApiUrl(ApiRoutes.AuthzRolesController.addMembers, [roleId]);\n const promise = fetch('PUT', qualifyUrl(url), usernames.toArray());\n\n AuthzRolesActions.addMembers.promise(promise);\n\n return promise;\n },\n\n removeMember(roleId: string, username: string): Promise {\n const url = encodeApiUrl(ApiRoutes.AuthzRolesController.removeMember, [roleId, username]);\n const promise = fetch('DELETE', qualifyUrl(url));\n\n AuthzRolesActions.removeMember.promise(promise);\n\n return promise;\n },\n\n loadUsersForRole(roleId: string, _roleName: string, {\n page,\n perPage,\n query,\n }: Pagination): Promise {\n const apiUrl = encodeApiUrl(ApiRoutes.AuthzRolesController.loadUsersForRole, [roleId]);\n const url = PaginationURL(apiUrl, page, perPage, query);\n\n const promise = fetch('GET', qualifyUrl(url))\n .then(_responseToPaginatedUserList);\n\n AuthzRolesActions.loadUsersForRole.promise(promise);\n\n return promise;\n },\n\n loadRolesForUser(username: string, { page, perPage, query }: Pagination): Promise {\n const apiUrl = encodeApiUrl(ApiRoutes.AuthzRolesController.loadRolesForUser, [username]);\n const url = PaginationURL(apiUrl, page, perPage, query);\n\n const promise = fetch('GET', qualifyUrl(url))\n .then(_responseToPaginatedList);\n\n AuthzRolesActions.loadRolesForUser.promise(promise);\n\n return promise;\n },\n\n loadRolesPaginated({ page, perPage, query }: Pagination): Promise {\n const apiUrl = encodeApiUrl(ApiRoutes.AuthzRolesController.list);\n const url = PaginationURL(apiUrl, page, perPage, query);\n\n const promise = fetch('GET', qualifyUrl(url))\n .then(_responseToPaginatedList);\n\n AuthzRolesActions.loadRolesPaginated.promise(promise);\n\n return promise;\n },\n }),\n);\n\nexport { AuthzRolesActions, AuthzRolesStore };\n"],"names":["NAV_ITEMS","title","path","Routes","items","activeBackend","finishedLoading","to","disabled","id","type","bsStyle","fromJson","servers","system_user_dn","system_user_password","transport_security","user_full_name_attribute","user_name_attribute","user_search_base","user_search_pattern","user_unique_id_attribute","verify_certificates","systemUserDn","systemUserPassword","isSet","is_set","transportSecurity","userFullNameAttribute","userNameAttribute","userSearchBase","userSearchPattern","userUniqueIdAttribute","verifyCertificates","toJson","WizardPageHeader","authenticationBackend","authBackend","useActiveBackend","pageTitle","backendTitle","StringUtils","_pageTitle","AuthenticationPageNavigation","actions","BackendActionLinks","documentationLink","DocsHelper","defaultProps","undefined","payload","formValues","serviceType","shouldUpdateGroupSync","enterpriseGroupSyncPlugin","getEnterpriseGroupSyncPlugin","notifyOnSuccess","UserNotification","notifyOnError","error","AuthenticationActions","then","result","backend","synchronizeGroups","onDirectoryServiceBackendUpdate","catch","initialState","activeStepKey","backendValidationErrors","authBackendMeta","serviceTitle","invalidStepKeys","setStepsState","BackendWizardContext","React","singleton","STEP_KEY","FORM_VALIDATION","required","serverHost","serverPort","min","max","description","ServerUrl","styled","ProtocolOptions","formRef","help","onSubmit","onSubmitAll","submitAllError","validateOnMount","stepsState","useContext","backendHasPassword","_onTransportSecurityChange","event","values","setFieldValue","onChange","currentValue","newValue","target","value","Formik","initialValues","innerRef","initialErrors","validateOnBlur","validateOnChange","isSubmitting","validateForm","Form","className","label","name","placeholder","labelClassName","wrapperClassName","formGroupClassName","validate","validateField","Field","field","onBlur","defaultChecked","e","onClick","autoComplete","buttonAfter","errors","formHasErrors","_onSubmitAll","defaultRoles","excludedFields","roles","rolesOptions","map","role","toArray","sm","smOffset","meta","inputProps","multi","selectedRoles","options","prepareSubmitPayload","GroupSyncForm","components","xs","featureName","stepKey","includes","formRefs","handleSubmitAll","setActiveStepKey","key","SERVER_CONFIG_KEY","component","USER_SYNC_KEY","GROUP_SYNC_KEY","NotificationContainer","Alert","Title","ErrorsList","theme","fonts","family","monospace","ConnectionErrors","message","String","propTypes","PropTypes","isRequired","loading","success","setConnectionStatus","useState","necessaryAttributes","config","_addRequiredRequestPayload","AuthenticationDomain","backend_configuration","backend_id","backendId","response","requestErrors","additional","res","text","delay","length","initialLoginStatus","testFinished","setLoginStatus","hasErrors","username","password","user_login","user_exists","login_success","user_details","Object","entries","StyledPanelGroup","PanelGroup","props","colors","input","border","global","contentBackground","table","backgroundAlt","activeKey","setActiveKey","useEffect","accordion","onSelect","eventKey","toggle","collapsible","FORMS_VALIDATION","SERVER_CONFIG_VALIDATION","USER_SYNC_VALIDATION","SubmitAllError","xsOffset","style","wordBreak","_passwordPayload","_formatPayload","keep_value","delete_value","set_value","_getInvalidStepKeys","newBackendValidationErrors","validation","groupSyncValidation","GroupSyncValidation","teamSelectionType","formValidation","some","fieldName","fieldValidation","compact","setSubmitAllError","getUpdatedFormsValues","getSubmitPayload","validateSteps","Promise","resolve","_submit","history","body","backendErrors","backendErrorStrings","mapValues","errorArray","join","mapKeys","_value","camelCase","_formatBackendValidationErrors","backendGroupSyncIsActive","window","confirm","BackendWizard","initialStepKey","MatchingGroupsProvider","paginatedRoles","setPaginatedRoles","useRef","wizardContextValue","useMemo","AuthzRolesDomain","page","perPage","query","_loadRoles","defaultCreateRoleId","find","_setDefaultCreateRole","list","_getUpdatedFormsValues","activeForm","current","_validateSteps","nextStepKey","_getSubmitPayload","overrideFormValues","default_roles","split","host","port","_prepareSubmitPayload","_setActiveStepKey","steps","wizardSteps","wizard","Wizard","activeStep","hidePreviousNextButtons","horizontal","justified","onStepChange","AUTH_BACKEND_META","HELP","INITIAL_VALUES","groupSyncHelp","initialGroupSyncValues","wizardConfig","ldap","handleCreate","Immutable","prepareInitialWizardValues","groupSyncFormValues","hooks","useInitialGroupSyncValues","_optionalWizardProps","handleUpdate","authenticationBackendId","bsSize","serverUrls","server","SectionComponent","headerActions","rolesList","defaultRolesIds","roleId","UserSyncSection","GroupSyncSection","GroupSyncSectionPlugin","groupSyncExcludedFields","activeDirectory","groupFormValues","PluginStore","PluginManifest","displayName","createComponent","BackendCreateLDAP","editComponent","BackendEditLDAP","configDetailsComponent","BackendConfigDetailsLDAP","configToJson","ConfigParser","configFromJson","BackendCreateAD","BackendEditAD","BackendConfigDetailsAD","listenableActions","loadActiveResponse","setLoadActiveResponse","setFinishedLoading","_loadActive","unlistenActions","action","completed","listen","forEach","unlistenAction","backendsTotal","context","Container","ButtonToolbar","StyledButton","Button","css","navigation","size","variant","darker","default","hoverIndicatorStyles","textDefault","activeIndicatorStyles","permissions","exactPathMatch","relativeActive","Header","Headline","LoadingSpinner","Spinner","h3","children","showLoading","load","notifyingAction","AuthzRolesActions","notFoundRedirect","delete","_roleId","roleName","addMembers","usernames","removeMember","loadUsersForRole","loadRolesForUser","loadRolesPaginated","Role","constructor","readOnly","this","toBuilder","Builder","toJSON","read_only","create","set","build","toObject","singletonActions","Reflux","asyncResult","_responseToPaginatedList","count","total","per_page","users","r","fromJSON","pagination","_responseToPaginatedUserList","u","UserOverview","encodeApiUrl","apiRoute","uriParams","encodedUriParams","param","encodeURIComponent","url","singletonStore","listenables","qualifyUrl","ApiRoutes","promise","fetch","_roleName","apiUrl","PaginationURL"],"sourceRoot":""}