{"version":3,"file":"static/js/ae3ece37c87d672a8cfe.bundle.js","mappings":";uwBA0CM,MAAOA,EAqBTC,YACIC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,GAcG,KAAAC,YAAc,KACjB,MAAMR,EAAmBS,EAAAA,EAAA,GAClBC,KAAKV,oBAAoBW,SACzBC,EAAAA,EAAAA,IAAKF,KAAKV,oBAAoBa,UAWrC,OARiBC,EAAAA,EAAAA,eAEb,GAAGJ,KAAKZ,YAAYY,KAAKJ,UAAUI,KAAKR,UAAYQ,KAAKP,cAAcO,KAAKH,aAAaG,KAAKT,SAASc,KACnGC,GAAW,GAAGA,EAAQC,iBAAmBD,EAAQE,sBAAwB,KAAOF,EAAQG,uBAAyB,aAChHC,EAAAA,EAAAA,iBAAgBpB,KACrBU,KAAKX,YACLW,KAAKJ,SAKN,KAAAe,mBAAqB,IAAM,yBAE3B,KAAAC,cAAgB,IAAiB,UA/BpCZ,KAAKZ,SAAWA,EAChBY,KAAKX,YAAcA,EACnBW,KAAKR,SAAWA,EAChBQ,KAAKP,WAAaA,EAClBO,KAAKV,oBAAsBA,EAC3BU,KAAKT,SAAWA,EAChBS,KAAKN,kBAAoBA,EACzBM,KAAKL,qBAAuBA,EAC5BK,KAAKJ,OAASA,EACdI,KAAKH,UAAYA,MAAAA,EAAAA,EAAa,GAgD/B,MAAMgB,EAA4BA,CACrCC,EACAC,KAEA,MAAM3B,EACyC,aAA3C0B,EAAKE,eAAeC,UAAU7B,UAA4B0B,EAAKE,eAAeE,OAASJ,EAAKE,eAAeE,MAAMC,WAC3G,WACA,SAEJ7B,EAAsB8B,EAAAA,yBAAyBC,cAAcP,GAAMQ,oBACnEC,GAAgBC,EAAAA,EAAAA,IAAuBV,EAAKE,gBAC5CtB,MAxHoB+B,EAwHqBX,KAvH9BW,EAAUC,aAAiDC,IAAvCF,EAAUC,OAAOhC,oBAA0E,IAAvC+B,EAAUC,OAAOhC,mBAD9G,IAA8B+B,EAyH1B,MAAM9B,EA7GV,SAA+B8B,GAA+D,IAAAG,EAC1F,QAAyB,QAAjBA,EAACH,EAAUC,cAAM,IAAAE,IAAhBA,EAAkBC,oBA4GEC,CAAsBhB,GAC7CjB,GAAYkC,EAAAA,EAAAA,IAAajB,EAAKE,gBAMpC,GAJIF,EAAKE,eAAeE,OAASJ,EAAKE,eAAeE,MAAMc,UACvD1C,EAAoBa,QAAU,CAAE8B,QAAuBC,KAAKC,MAAMC,mBAAmBtB,EAAKE,eAAeE,MAAMc,YAGlG,aAAb5C,EACA,OAAO,IAAI2B,EACP3B,EACA0B,EAAKE,eAAe3B,YACpBC,EACAiC,IACET,EAAKE,eAAeC,UAAUoB,QAAWvB,EAAKE,eAAeE,OAASJ,EAAKE,eAAeE,MAAMC,YAAe,QACjHQ,EACAjC,EACAC,EACAmB,EAAKE,eAAepB,OACpBC,GAED,GAAiB,WAAbT,GAAyB0B,EAAKE,eAAeE,OAASJ,EAAKE,eAAeE,MAAMoB,EACvF,OAAO,IAAIvB,EACP3B,EACA0B,EAAKE,eAAe3B,YACpBC,EACAiC,OACAI,EACAb,EAAKE,eAAeE,MAAMoB,EAC1B5C,EACAC,EACAmB,EAAKE,eAAepB,OACpBC,GAED,GACU,WAAbT,GACA0B,EAAKE,eAAeE,OACpBJ,EAAKE,eAAeE,MAAMqB,WAC1BzB,EAAKE,eAAeE,MAAMsB,eAE1B,OAAO,IAAIzB,EACP3B,EACA0B,EAAKE,eAAe3B,YACpBC,EACAiC,OACAI,EACAO,KAAKO,UAAU,CAAEC,UAAW5B,EAAKE,eAAeE,MAAMqB,UAAWI,eAAgB7B,EAAKE,eAAeE,MAAMsB,iBAC3G9C,EACAC,EACAmB,EAAKE,eAAepB,OACpBC,GAIR,MAAM,IAAI+C,MAAM,oTC5IRC,mDA/BN,MAAOC,UAAyC5D,EAAAA,EAAtDC,kCAKW,KAAAwB,mBAAqB,IAAc,0BAMnC,KAAAC,cAAgB,KAEG,aAAlBZ,KAAKZ,UACJY,KAAKT,UAAYS,KAAKT,SAASwD,OAAS,GACxC/C,KAAKV,qBACFU,KAAKV,oBAAoBa,SACzBH,KAAKV,oBAAoBa,QAAQ8B,SACjCjC,KAAKV,oBAAoBa,QAAQ8B,QAAQc,OAEtC,UAWnB,SAAYF,GAIRA,EAAA,kBAKAA,EAAA,kBAKAA,EAAA,kBAdJ,CAAYA,IAAAA,EAAoC,KAuDhD,SAASG,EAAaC,EAA8BC,GAChD,IAAKC,EAAAA,gBAAgBC,YAAYH,EAAQI,iBAErC,OAAO,EAEX,IAAK,MAAMC,KAAaL,EAAQI,gBAC5B,GACIC,EAAUC,WAAaL,EAA8BM,mCACrDF,EAAUG,YAAcP,EAA8BQ,sCAItD,OAAO,EAIf,OAAO,EA2DL,SAAUC,EACZC,EACAV,EACAW,GAEA,IAAKV,EAAAA,gBAAgBC,YAAYQ,IAAaE,EAAAA,iBAAiBC,kBAAkBb,GAC7E,MAAO,GAEX,OAAQW,EAAQ7C,eAAegD,IAAItC,OAAOuC,6BACtC,KAAKpB,EAAqCqB,QACtC,OA5DZ,SACIN,EACAV,GAEA,IAAKC,EAAAA,gBAAgBC,YAAYQ,GAC7B,MAAO,GAEX,MAAMO,EAA0C,GAEhD,IAAK,MAAMlB,KAAWW,EACbZ,EAAaC,EAASC,IACvBiB,EAAiBC,KAAKnB,GAG9B,OAAOkB,EA8CQE,CAAyBT,EAAUV,GAC9C,KAAKL,EAAqCyB,QACtC,OAvCZ,SACIV,EACAV,GAEA,IAAKC,EAAAA,gBAAgBC,YAAYQ,GAC7B,MAAO,GAEX,MAAMW,EAAyC,GACzCC,EAA4C,GAElD,IAAK,MAAMvB,KAAWW,EACdZ,EAAaC,EAASC,GACtBsB,EAAmBJ,KAAKnB,GAExBsB,EAAgBH,KAAKnB,GAG7B,OAAOsB,EAAgBE,OAAOD,GAsBfE,CAAiCd,EAAUV,GACtD,QACI,OAAOU,GAInB,MAAMe,EAAgBA,CAACC,EAA6BC,KAChD,MAAMC,EAAa,CACfF,EAAYG,WACZH,EAAYI,WACZJ,EAAYK,WACZL,EAAYM,WACZN,EAAYO,YAEhB,GAAIN,EAAgB,EAAI,GAChBD,EAAYQ,kBAAmB,CAC/B,IAAK,IAAIC,EAAI,EAAGA,EAAIR,EAAgB,EAAGQ,IACnC,GAAIP,GAAcA,EAAWO,GAAI,CAC7B,MAAMC,EAAmBR,EAAWO,IAAM,EAC1CT,EAAYQ,kBAAoBR,EAAYQ,kBAAoBE,EAC5DV,EAAYW,eACZX,EAAYW,aAAeX,EAAYW,aAAeD,GAE1DR,EAAWO,GAAK,EAGxB,IAAIG,EAAa,EACjB,IAAK,IAAIC,EAAI,EAAGA,EAAIX,EAAW/B,OAAQ0C,IAAK,CAExCD,IAA2BC,EAAI,IADRX,EAAWW,IAAM,GAI5Cb,EAAYc,cAAgBF,EAAaZ,EAAYQ,kBAG7D,OAAOR,GAoCJe,eAAeC,EAClBC,EACAhC,EACAiC,GAEA,MAEMC,EAAiCF,EAAqBxF,KAAI2F,IAC5D,MAAMC,GAAcC,EAAAA,EAAAA,yBAAwBF,EAAqBnC,EAAQ7C,eAAe3B,aAMxF,OAJI4G,IACAD,EAAoBG,gBAAkBF,GAGnCD,KAKX,GACInC,EAAQ7C,eAAegD,IAAItC,OAAO0E,iBAAmBC,EAAAA,gBAAgBC,YACd,IAAvDzC,EAAQ7C,eAAegD,IAAItC,OAAO6E,iBAElC,MAAO,CACH3C,SAAUmC,EACVS,MAAOV,MAAAA,EAAAA,EApBqB,GAuBpC,MAAM5C,QAAsCuD,EAAAA,EAAAA,gCAA+B,CAAEC,cAAe7C,IAyB5F,IAAI8C,EAA2BhD,EAvBRoC,EAA+B1F,KAAI2F,IACtD,GAAI7C,EAAAA,gBAAgBC,YAAY4C,EAAoB3C,iBAChD,IAAK,MAAMuD,KAAWZ,EAAoB3C,gBAGlCH,QACqBvB,IAArBiF,EAAQrD,UACRqD,EAAQrD,WAAaL,EAA8BM,mCAEG,QAAtDK,EAAQ7C,eAAegD,IAAItC,OAAOmF,iBAClCD,EAAQnD,YAAcP,EAA8BQ,wCAMpDkD,EAAQnD,UAAY,IAKhC,OAAOuC,KAE8E9C,EAA+BW,GACxH,IACI8C,OAxF8BhB,OAAO/B,EAAiCC,KAC1E,MACMiD,EADalD,EAASvD,KAAI0G,GAAKA,EAAExD,WACXlD,KAAI2G,IAC5B,MAAMC,EACF,GAAGpD,EAAQ7C,eAAe3B,YAAY6H,+CAA+CF,sBACzEnD,EAAQ7C,eAAe3B,YAAY8H,IAAIC,KACvD,OAAOC,EAAAA,EAAAA,IAA4BJ,EAAY,UAE7CK,QAA2BC,QAAQC,IAAIV,GAC7C,IAAK,MAAMW,KAAMH,EACb,GAAIG,EAAGC,KAAM,CACT,IAAI9C,EAAc6C,EAAGC,KACrB,MAAM7C,EAAgBhB,EAAQ7C,eAAegD,IAAItC,OAAOiG,0BACxD/C,EAAcD,EAAcC,EAAaC,GACzC,IAAK,MAAMkC,KAAKnD,EACRgB,EAAYrC,WAAawE,EAAExD,WAAaqE,SAAShD,EAAYrC,UAAW,MACxEwE,EAAEc,cAAgBjD,EAAYc,cAC9BqB,EAAEe,aAAelD,EAAYQ,mBAM7C,OAAOxB,GAiE8BmE,CAA8BpB,EAA0B9C,GAC3F,MAAOmE,GACLC,QAAQC,IAAI,0BAEhB,MAAO,CACHtE,SAAU+C,EACVH,MAAOV,MAAAA,EAAAA,EAxDyB,EA0DhCqC,gCAAiCjF,EAC3BA,EAA8BM,uCAC9B7B,GAgGP,MAAMyG,GAAmBC,EAAAA,EAAAA,IAA2B,CACvDjB,GAAI,qFACJkB,OAxFJ3C,eAAsB4C,EAAyC1E,GAC3D,IAAI2E,EACAC,EACJ,MAAMC,EAA6C,GACnDA,EAAoBC,QAAU,CAC1BC,UAAW/E,EAAQ7C,eAAe3B,YAAYwJ,UAC9CC,UAAWjF,EAAQ7C,eAAe3B,YAAYQ,WAElD6I,EAAoBK,WAAaR,EAAMhJ,SACvCmJ,EAAoBM,kBAAoBT,EAAM7I,kBAC9CgJ,EAAoBO,sBAAuB,EAI3C,IAAIC,EAAWrF,EAAQ7C,eAAeE,OAAS2C,EAAQ7C,eAAeE,MAAMgI,SAAWrF,EAAQ7C,eAAeE,MAAMgI,SAAW,GAG/H,GAFAA,EAAWA,EAASC,QAAQ,MAAO,OAEZ,aAAnBZ,EAAMnJ,UAA4ByE,EAAQ7C,eAAeE,OAAS2C,EAAQ7C,eAAeE,MAAMC,WAAa,CAC5G,IAAIoH,EAAM/I,SAaN,MAAM,IAAIoD,MAAM,wFAZhB8F,EAAoBU,YAAc,CAACb,EAAM/I,UARnB,GASlB0J,IACAR,EAAoBW,gBAAkB,aAAaH,KAEvDV,GAAUc,EAAAA,EAAAA,uBACN,CACI5C,cAAe7C,EACfvE,oBAAqBiJ,EAAMjJ,qBAE/BoJ,QAKL,GAAIH,EAAM9I,YAAcoE,EAAQ7C,eAAeE,OAAS2C,EAAQ7C,eAAeE,MAAMoB,EACxFoG,EAAoBW,gBAAkBd,EAAM9I,WAC5CiJ,EAAoBW,gBAAkBH,EAAW,GAAGX,EAAM9I,uBAAuByJ,IAAaX,EAAM9I,WACpG+I,GAAUc,EAAAA,EAAAA,uBACN,CACI5C,cAAe7C,EACfvE,oBAAqBiJ,EAAMjJ,qBAE/BoJ,OAED,MACHH,EAAM9I,YACNoE,EAAQ7C,eAAeE,OACvB2C,EAAQ7C,eAAeE,MAAMqB,WAC7BsB,EAAQ7C,eAAeE,MAAMsB,gBAuB7B,MAAM,IAAII,MAAM,qGAtBlB,CACE,MAAM2G,EAAerH,KAAKC,MAAMoG,EAAM9I,YAEtC,GADAgJ,EAAkBe,OAAOD,EAAa7G,WAClC8G,OAAOC,MAAMhB,GACb,MAAM,IAAI7F,MAAM,mDACb,IAAK2G,EAAa5G,eACrB,MAAM,IAAIC,MAAM,0CAEhB8F,EAAoBgB,qBAAuBH,EAAa5G,eACxD+F,EAAoBiB,IAAM,CAAClB,GA9CL,GA+ClBS,IACAR,EAAoBW,gBAAkB,aAAaH,KAEvDV,GAAUc,EAAAA,EAAAA,uBACN,CACI5C,cAAe7C,EACfvE,oBAAqBiJ,EAAMjJ,qBAE/BoJ,IAOZ,MAAM7C,QAA6B2C,EAGV,IAAAoB,EAOzB,OAPKC,EAAAA,GAASC,WACVjG,EAAQkG,OAAO,IAAIC,EAAAA,mBAAsB,CACrCC,kBAAyC,QAAxBL,EAAEpB,EAAQ0B,SAAS1D,aAAK,IAAAoD,EAAAA,EAnEnB,EAoEtBO,cAAe5B,EAAMhJ,WAItBqG,EAAeC,EAAsBhC,EAAS2E,EAAQ0B,SAAS1D,QAMtE+B,MA1ViBzH,IACjB,MAAMyH,GAAQ1H,EAAAA,EAAAA,GAA0BC,EAAMgC,GAc9C,OAXIyF,EAAMjJ,oBAAoBW,QAAUa,EAAKY,SACzC6G,EAAMjJ,oBAAoBW,OAAOmK,IAAMtJ,EAAKY,OAAO2I,cAAgB,GAInE9B,EAAMjJ,oBAAoBW,QAAUa,EAAKE,eAAeE,OAASJ,EAAKE,eAAeE,MAAMoJ,OAC3F/B,EAAMjJ,oBAAoBW,OAAOsK,MAAQzJ,EAAKE,eAAeE,MAAMoJ,MAGvE/B,EAAMjJ,oBAAoBkH,OAAQ,EAE3B+B,KA8UX,4NCpZO,MAAMiC,EAAc,CACvBC,0BAA2B,eAC3BC,sBAAuB,oBACvBC,uBAAwB,qBACxBC,oBAAqB,WACrBC,qBAAsB,YACtBC,qBAAsB,YACtBC,sBAAuB,aACvBC,wBAAyB,cACzBC,qBAAsB,WACtBC,0BAA2B,iBAMzB,MAAOC,EAGThM,YAAYE,GAIL,KAAAS,YAAc,KAAMM,EAAAA,EAAAA,eAAc,oBAAqBJ,KAAKX,aAE5D,KAAAsB,mBAAqB,IAAM,oBAE3B,KAAAC,cAAgB,IAAiB,UAPpCZ,KAAKX,YAAcA,GAepBsG,eAAeyF,EAA6B7C,EAA0B8C,GACzE,OAAOC,EAAAA,EAAAA,6BAA4B,CAAE5E,cAAe2E,IAAOE,MAAMC,IACxBA,EAAoBC,oBAAsB,IAC1EpL,KAA4CqL,IACzC,IAAIC,EAAM,GACV,GAAID,EAAWE,WACX,OAAQF,EAAWE,WAAWC,eAC1B,IAAK,OACDF,EAAMD,EAAWI,aAAetB,EAAYK,qBAAuBL,EAAYI,oBAC/E,MACJ,IAAK,QACDe,EAAMD,EAAWI,aAAetB,EAAYO,sBAAwBP,EAAYM,qBAChF,MACJ,IAAK,gBACDa,EAAMD,EAAWI,aAAetB,EAAYG,uBAAyBH,EAAYE,sBACjF,MACJ,IAAK,UACDiB,EAAMnB,EAAYC,0BAClB,MACJ,IAAK,mBACDkB,EAAMnB,EAAYQ,wBAClB,MACJ,IAAK,WACDW,EAAMnB,EAAYS,qBAClB,MACJ,IAAK,gBACDU,EAAMnB,EAAYU,+BAK1BG,EAAIU,UAAUC,QAAQ,2DAE1B,GAAIL,EACA,MAAO,CACHA,IAAAA,EACAD,WAAAA,MAKXO,OAAOC,WAIb,MAAMC,EAAe1K,GACjB,IAAI0J,EAAkB1J,EAAUT,eAAe3B,aAG7C+M,GAAyC/D,EAAAA,EAAAA,IAA2B,CAC7EjB,GAAI,qFACJkB,OAA8C8C,EAC9C7C,MAAO4D,IAGX,sHC5GKE,0BCGE1G,eAAe2G,EAClBC,EACAjN,EACA+L,GAEA,OAAOmB,EAAAA,EAAAA,+BAA8B,CAAE9F,cAAe2E,EAAK/L,oBAAAA,GAAuBiN,GAAgBhB,MAC7FkB,IACG,IAAKA,EAED,OADApB,EAAIqB,MAAM,sDACyB,GAGvC,MAAMC,GAAUF,GAAmB,IAAIpM,KAAKuM,GAA6DA,IAEzG,OAAsB,IAAlBD,EAAO5J,QACPsI,EAAIqB,MAAM,8EACyB,IAGhCC,MDtBnB,SAAKN,GACDA,EAAAA,EAAA,mDACAA,EAAAA,EAAA,iDAFJ,CAAKA,IAAAA,EAAa,KAQZ,MAAOQ,UAAkC3N,EAAAA,EAA/CC,kCACW,KAAAwB,mBAAqB,IAAM,iBAE3B,KAAAC,cAAgB,IAEG,aAAlBZ,KAAKZ,UACJY,KAAKT,UAAYS,KAAKT,SAASwD,OAAS,GACxC/C,KAAKV,qBACFU,KAAKV,oBAAoBa,SACzBH,KAAKV,oBAAoBa,QAAQ8B,SACjCjC,KAAKV,oBAAoBa,QAAQ8B,QAAQc,OAAS,EAE/C,UAEJ,eA8ER,MAAMqF,GAAmBC,EAAAA,EAAAA,IAA2B,CACvDjB,GAAI,iFACJkB,OA/DJ3C,eAAsB4C,EAAkC8C,GACpD,IAAI5C,EACJ,GAAuB,aAAnBF,EAAMnJ,SAAyB,CAC/B,GAAImJ,EAAM/I,SACN,OAAO8M,EACH,CACIlD,YAAa,CAACb,EAAM/I,UAAY6M,EAAcS,wBAC9CnE,QAAS,CACLC,UAAWL,EAAMlJ,YAAYwJ,UAC7BC,UAAWP,EAAM1I,WAErBkJ,WAAYR,EAAM5I,qBAAuB4I,EAAMhJ,SAAW,IAE9DgJ,EAAMjJ,oBACN+L,GAGR,MAAM,IAAIzI,MAAM,oFAEhB,GAAI2F,EAAM9I,YAAc4L,EAAIrK,eAAeE,OAASmK,EAAIrK,eAAeE,MAAMoB,EACzE,OAAOgK,EACH,CACIjD,gBAAiBd,EAAM9I,WACvBkJ,QAAS,CACLC,UAAWL,EAAMlJ,YAAYwJ,UAC7BC,UAAWP,EAAM1I,WAErBkJ,WAAYR,EAAM5I,qBAAuB4I,EAAMhJ,SAAW,IAE9DgJ,EAAMjJ,oBACN+L,GAGR,GAAI9C,EAAM9I,YAAc4L,EAAIrK,eAAeE,OAASmK,EAAIrK,eAAeE,MAAMqB,UAAW,CACpF,MAAMgH,EAAerH,KAAKC,MAAMoG,EAAM9I,YAEtC,GADAgJ,EAAkBe,OAAOD,EAAa7G,WAClC8G,OAAOC,MAAMhB,GACb,MAAM,IAAI7F,MAAM,mDACb,GAAK2G,EAAa5G,eAGrB,OAAO2J,EACH,CACI3D,QAAS,CACLC,UAAWL,EAAMlJ,YAAYwJ,UAC7BC,UAAWP,EAAM1I,WAErBkJ,WAAYR,EAAM5I,qBAAuB4I,EAAMhJ,SAAW,GAC1DmK,qBAAsBH,EAAa5G,eACnCgH,IAAK,CAAClB,GAAmB4D,EAAcU,wBAE3CxE,EAAMjJ,oBACN+L,GAbJ,MAAM,IAAIzI,MAAM,0CAiBpB,MAAM,IAAIA,MAAM,sGAQxB2F,MAzEiBzH,IACVD,EAAAA,EAAAA,GAA0BC,EAAM+L,KA2E3C,mHEvGA,MAAMG,EAAwB,CAC1B,gBACA,uBACA,kBACA,qBACA,wBACA,YAQSxL,EAA0BR,IACnC,MAAMiM,EAAyBC,EAAuC,WAAYlM,GAClF,OAAKiM,GAA4D,IAAlCA,EAAuBlK,OAIxBkK,EACzB5M,KAAI8M,IACD,IACI,MAAMC,EAAqC,GAI3C,OAHAJ,EAAsBK,SAAQ,CAACC,EAAYC,KACvCH,EAAcE,GAAcH,EAAkBI,MAE3CH,EACT,MAAAI,GACE,WAGPvB,OAAOC,SAfD,IA2CFuB,EAAmBA,CAACC,EAAcnO,EAAkCoO,EAA+BC,KAE5G,QAAiBjM,IAAbpC,EAAwB,CACxB,GAAwB,IAApBA,EAASwD,OACT2K,EAAQG,aAAaC,OAAO,gBACzB,CACH,MAAMC,EAAiBxO,EAASyO,MAAK,CAACC,EAAOC,IACzCD,EAAM1N,iBAAmB2N,EAAO3N,iBAAmB0N,EAAM1N,gBAAkB2N,EAAO3N,gBAAkB,GAAK,IAE7GmN,EAAQG,aAAaM,IAAI,WAAYjM,KAAKO,UA9BrBlD,CAAAA,IAC7B,MAAM6O,EAA4C,GAUlD,OARA7O,EAAS8N,SAAQ/M,IACb,MAAM6M,EAAyC,GAC/CH,EAAsBK,SAAQC,IAC1BH,EAAkB/I,KAAK9D,EAAQgN,OAEnCc,EAAmBhK,KAAK+I,MAGrBiB,GAmBqDC,CAAiBN,KAKzE,OADAL,EAAQG,aAAaC,OAAO,QACrBJ,EAAQY,KAGnB,YAAuB3M,IAAnBgM,GAC8B,IAA1BA,EAAe5K,OACf2K,EAAQG,aAAaC,OAAO,WAE5BJ,EAAQG,aAAaM,IAAI,UAAWjM,KAAKO,UAAUkL,IAIvDD,EAAQG,aAAaC,OAAO,QACrBJ,EAAQY,OAGfV,GACAF,EAAQG,aAAaM,IAAI,OAAQP,EAAUW,YAGxCb,EAAQY,OAQNpB,EAAkBA,CAAIvB,EAAa3K,IACxCA,EAAeE,OAASF,EAAeE,MAAMyK,GACnCzJ,KAAKC,MAAMC,mBAAmBpB,EAAeE,MAAMyK,KAE1D,KAOE6C,EAAiBxN,GACtB6I,EAAAA,GAASC,WAAa2E,OACf,IAAIC,IAAID,OAAOE,SAASL,MAI/BtN,EAAe4N,IAAI3H,WAAWqH,KACvB,IAAII,IAAI1N,EAAe4N,IAAI3H,WAAWqH,MAE1C,IAAII,IAAsB1N,EAAe4N,IAAI3H,mECjItC4H,8vBAAlB,SAAkBA,GACdA,EAAA,UACAA,EAAA,UACAA,EAAA,UACAA,EAAA,cACAA,EAAA,YALJ,CAAkBA,IAAAA,EAAmB,KCyJrC,IAAqBC,EAAqBC,EAA1C,cAAmDC,EAAAA,cAiD/C7P,YAAY8P,EAA8EC,GAAkC,IAAAC,EACxHC,MAAMH,GA1CO,KAAAI,sBAAkD,CAC/D,CAAE1D,IAAKnB,EAAAA,YAAYC,0BAA2B6E,MAAOtP,KAAKiP,MAAMM,UAAU9E,2BAC1E,CAAEkB,IAAKnB,EAAAA,YAAYI,oBAAqB0E,MAAOtP,KAAKiP,MAAMM,UAAU3E,qBACpE,CAAEe,IAAKnB,EAAAA,YAAYK,qBAAsByE,MAAOtP,KAAKiP,MAAMM,UAAU1E,sBACrE,CAAEc,IAAKnB,EAAAA,YAAYM,qBAAsBwE,MAAOtP,KAAKiP,MAAMM,UAAUzE,sBACrE,CAAEa,IAAKnB,EAAAA,YAAYO,sBAAuBuE,MAAOtP,KAAKiP,MAAMM,UAAUxE,uBACtE,CAAEY,IAAKnB,EAAAA,YAAYG,uBAAwB2E,MAAOtP,KAAKiP,MAAMM,UAAU5E,yBAK1D,KAAA6E,UAAgCxP,KAAKiP,MAAMpL,QAAQ4L,QAAQxO,UAAU7B,SAS9E,KAAAsQ,mBAAyC,EAMhC,KAAAC,kBAAoB,EAgO9B,KAAAC,gBAAkB,CAACC,EAA8BC,KACpD,IAAKD,IAAWC,EACZ,OAAO,EAEX,IAAID,MAAAA,OAAM,EAANA,EAAQ9M,WAAW+M,MAAAA,OAAM,EAANA,EAAQ/M,QAC3B,OAAO,EAEX,IAAK,IAAIgN,EAAI,EAAGA,EAAIF,EAAO9M,OAAQgN,IAC/B,GAAIF,EAAOE,KAAOD,EAAOC,GACrB,OAAO,EAGf,OAAO,GA6FM,KAAAC,gBAAkBrK,UAC/B,MAAMsK,EAAoB,CACtB,CACIC,cAAelQ,KAAKiP,MAAMpL,QAAQG,IAAItC,OAAOwO,cAC7CC,cAAenQ,KAAKiP,MAAMpL,QAAQG,IAAItC,OAAOyO,cAC7CC,qBAAsBpQ,KAAKiP,MAAMpL,QAAQG,IAAItC,OAAO0O,qBACpDC,gBAAiB,GACjBC,WAAY,GACZC,oBAAqB,KAI7B,IAAI3M,EAAY5D,KAAKiP,MAAMvH,KAAK8I,cAAc7D,QAAU3M,KAAKiP,MAAMvH,KAAK8I,cAAc7D,OAAO8D,gBAAmB,GAChH,MAAMC,EAAgBvN,EAAAA,gBAAgBC,YAAYQ,GAAYA,EAASvD,KAAIsQ,GAAQA,EAAKpN,WAAY,GAC9FqN,EAAkC,CACpChI,UAAW5I,KAAKiP,MAAMpL,QAAQ4L,QAAQpQ,YAAYwJ,UAClDC,UAAW9I,KAAKiP,MAAMpL,QAAQ4L,QAAQpQ,YAAYQ,WAEhDgR,QAAaC,EAAAA,EAAAA,qBAAoB9Q,KAAKiP,MAAMpL,QAAQkN,eACpDC,EAAcH,MAAAA,OAAI,EAAJA,EAAMI,iBAC1BhJ,QAAQC,IAAI8I,SACNE,EAAAA,EAAAA,sBACF,CACIxK,cAAe1G,KAAKiP,MAAMpL,QAAQkN,cAClCzR,oBAAqB,IAEzBsR,EACAF,EACA,IAAIS,KACJ,KACAlB,GACA,GAEC1E,MAAM6F,IAAwC,IAAAC,EAC3CrR,KAAKsR,cAAgBF,EACrB,MAAMG,EAAgBH,EAAqB/Q,KAAImR,GAAaA,EAAUC,gBAChEC,EAAoB,GAC1BN,EAAqB/Q,KAAImR,IACjBA,EAAU9O,WACVgP,EAAQtN,KAAKoN,EAAU9O,cAG3B1C,KAAK4P,gBAAgB8B,EAAS1R,KAAKkP,MAAMyC,kBACzC3R,KAAK4R,SAAS,CACVL,cAAeA,EACfM,eAAe,EACfF,gBAAiBD,IAIzB9N,EAAWA,EAASvD,KAAIsQ,IACpB,MAAMmB,EAAcV,EAAqBW,MAAKC,GAASA,EAAMtP,YAAciO,EAAKpN,WAC/D,IAAA0O,EAAbH,IACAnB,EAAKuB,MAA2C,QAAtCD,EAAGH,EAAYK,+BAAuB,IAAAF,EAAAA,EAAItB,EAAKuB,MACzDvB,EAAKyB,UAAYC,KAAKC,IAClBR,EAAYM,WAAa,EACzBN,EAAYS,qBAAuB,EACnCT,EAAYU,eAAiB,IAGrC,OAAO7B,KAEX/M,EAAmB,QAAXyN,EAAGzN,SAAQ,IAAAyN,OAAA,EAARA,EAAUpF,QAAO0E,KACJS,EAAqBW,MAAKC,GAASA,EAAMtP,YAAciO,EAAKpN,aAMpFvD,KAAKiP,MAAMvH,KAAK8I,cAAcjF,MAAKiF,IAC/BA,EAAcC,eAAiB7M,QAGtC6O,OAAOC,IASJ,MARA1S,KAAK4R,SAAS,CACVC,eAAe,IAEnB7R,KAAKiP,MAAMpL,QAAQkN,cAAcrE,MAAMgG,EAAMC,SAC7C3S,KAAKiP,MAAMpL,QAAQkN,cAAchF,UAAU6G,UAAUF,GACrD1S,KAAKiP,MAAMpL,QAAQkN,cAAchF,UAAU8G,MACvC,mFAEE,IAAIjQ,MAAM,sFAIX,KAAAkQ,6BAA+BnN,UAC5C,MAAM/B,EAAY5D,KAAKiP,MAAMvH,KAAK8I,cAAc7D,QAAU3M,KAAKiP,MAAMvH,KAAK8I,cAAc7D,OAAO8D,gBAAmB,GAC5GC,EAAgBvN,EAAAA,gBAAgBC,YAAYQ,GAAYA,EAASvD,KAAIsQ,GAAQA,EAAKpN,WAAY,GAC9FqN,EAAkC,CACpChI,UAAW5I,KAAKiP,MAAMpL,QAAQ4L,QAAQpQ,YAAYwJ,UAClDC,UAAW9I,KAAKiP,MAAMpL,QAAQ4L,QAAQpQ,YAAYQ,iBAEhDqR,EAAAA,EAAAA,sBACF,CACIxK,cAAe1G,KAAKiP,MAAMpL,QAAQkN,cAClCzR,oBAAqB,IAEzBsR,EACAF,EACA,IAAIS,KACJ,KACA,MACA,GAEC5F,MAAM6F,IACCA,GAAwBA,EAAqBrO,OAAS,IACtDqO,EAAuBA,EAAqBnF,QAAO0E,MAC3B/M,MAAAA,OAAQ,EAARA,EAAUmO,MAAKC,GAASA,EAAMzO,WAAaoN,EAAKjO,eAMxE1C,KAAK4R,SAAS,CACVmB,oBAAqB3B,QAIhCqB,OAAOC,IASJ,MARA1S,KAAK4R,SAAS,CACVC,eAAe,IAEnB7R,KAAKiP,MAAMpL,QAAQkN,cAAcrE,MAAMgG,EAAMC,SAC7C3S,KAAKiP,MAAMpL,QAAQkN,cAAchF,UAAU6G,UAAUF,GACrD1S,KAAKiP,MAAMpL,QAAQkN,cAAchF,UAAU8G,MACvC,mFAEE,IAAIjQ,MAAM,sFAIX,KAAAoQ,sBAAwB,KACrC,MAAM,UAAEzD,GAAcvP,KAAKiP,MAC3B,OAAOgE,EAAAA,EAAAA,mBAAkB,CACrB1D,UAAW,CACP2D,qBAAsB3D,EAAU2D,qBAChCC,WAAY5D,EAAU4D,YAE1BC,OAAQpT,KAAKkP,MAAMmE,YACnBC,UAAWtT,KAAKuT,gBAChBC,cAAexT,KAAKyT,gBAIX,KAAAC,oBAAsB,KAAsB,IAAAC,EACzD,MAAM,KAAEjM,EAAI,QAAE7D,EAAO,UAAE0L,GAAcvP,KAAKiP,MAE1C,IAAI2E,EAAsC,GAEtCA,EADA/P,GAAWA,EAAQ4L,SAAW5L,EAAQ4L,QAAQvO,OAAS2C,EAAQ4L,QAAQvO,MAAMoB,EAC3D,IAAIuB,EAAQ4L,QAAQvO,MAAMoB,KAGvCoF,EAAKlI,SAASmN,QACXoC,EAAsB8E,gBAAgBhQ,EAAQ4L,QAAQ7P,OAAQ8H,EAAKlI,SAASmN,OAAOmH,mBACtFpM,EAAKlI,SAASmN,QAAUjF,EAAKlI,SAASmN,OAAOoH,KAEtD,IACIC,EADAC,EAAmB,GAEnBvM,EAAK8I,eAAiB9I,EAAK8I,cAAc7D,aAA0DhL,IAAhD+F,EAAK8I,cAAc7D,OAAO1C,kBAC7E+J,EAAqBtM,EAAK8I,cAAc7D,OAAO1C,kBACxCvC,EAAK9D,UAAY8D,EAAK9D,SAAS+I,SACtCqH,EAAqBtM,EAAK9D,SAAS+I,OAAOnG,OAI1CyN,EADAD,GAA6C,IAAvBA,EAEK,IAAvBA,GACME,EAAAA,EAAAA,QAAOlU,KAAKiP,MAAMM,UAAU4E,iBAAkBH,GAC9ChU,KAAKiP,MAAMM,UAAU6E,YAEZF,EAAAA,EAAAA,QAAOlU,KAAKiP,MAAMM,UAAU4E,iBAAkB,GAErE,MAAME,EAA+C,QAAnCV,EAAG3T,KAAKiP,MAAMpL,QAAQ4L,QAAQvO,aAAK,IAAAyS,OAAA,EAAhCA,EAAkCrR,EACjDgS,EAAWzQ,EAAQ4L,QAAQ8E,kBAAoB,gBAAgB1Q,EAAQ4L,QAAQ8E,kBAAkBC,gBAAkB,GACnHC,EAAczF,EAAAA,cAAC0F,EAAAA,MAAK,CAACC,UAAU,4CAA4CC,KAAMrF,EAAUsF,mBAC3FC,EAAYlB,GAAmB5E,EAAAA,cAAC0F,EAAAA,MAAK,CAACC,UAAU,0CAA0CC,KAAMhB,IAChGmB,EAAa/F,EAAAA,cAAC0F,EAAAA,MAAK,CAACC,UAAU,2CAA2CC,KAAMX,IAErF,MAAO,CACHe,eAAgB,CAAEL,UAAW,qCAAqCf,EAAkB,GAAK,YAAYU,KACrGW,MAAO,CACHR,YAAAA,EACAK,UAAAA,EACAC,WAAYV,EAAeU,OAAapT,KAKnC,KAAAuT,sBAAwB,KACrC,MAAM,KAAExN,GAAS1H,KAAKiP,MAChBkG,EAAoBzN,EAAKyN,kBAAkBxI,OAejD,MAAO,CACHyI,2BAA4B,CAAEC,IAAK,MAAOV,UAAW,kDACrDW,sBAfAH,GACAA,EAAkB9U,KAAI,CAACiP,EAA8B/B,IAE7CyB,EAAAA,cAACuG,EAAAA,KAAI,CACD5J,IAAK4B,EACLqH,KAAMtF,EAAMyE,KACZyB,UAAW,GAAGxV,KAAKiP,MAAMM,UAAUkG,yBAAyBnG,EAAMyE,OAClEzF,KAAMgB,EAAMoG,QASxBC,2BAL0B3G,EAAAA,cAAC4G,EAAAA,UAAS,CAACC,UAAU,QAStC,KAAAC,oBAAsB,KACnC,MAAM,UAAEvG,GAAcvP,KAAKiP,MACrB8G,EAAiB/V,KAAKgW,+BAAiChW,KAAKkP,MAAM+G,aAAaC,qBACrF,IAAIC,EAAkBnW,KAAKqP,sBAEvBrP,KAAKiP,MAAMpL,QAAQG,IAAItC,OAAO0U,aAC9BD,EAAkBnW,KAAKqP,sBAAsBpD,QAAOoK,GAAyC,uBAAvBA,EAAe1K,OAezF,MAAO,CACH2K,iBAAkB,CAAE3B,UAAW,gDAC/B4B,eAdAvH,EAAAA,cAACwH,EAAAA,gBAAe,CACZC,eAAe,uBACfC,UAAWnH,EAAUoH,oBACrBC,WAAW,yBACXC,kBAAkB,wBAClBC,YAAY,OACZC,gBAAiBZ,EACjBa,eAAgBjB,EAChBkB,eAAgBjX,KAAKkX,sBACrBC,IAAKnX,KAAKoX,+BASL,KAAAC,eAAiB,KAC9B,MAAM,OAAE3V,EAAM,QAAEmC,EAAO,KAAE6D,EAAI,UAAE6H,GAAcvP,KAAKiP,MAC5CuB,EAAgB9I,GAAQA,EAAK8I,eAAiB9I,EAAK8I,cAAc7D,OACjEe,GAAUc,EAAAA,EAAAA,IAAc3K,EAAQ4L,SAChCpF,EAAe3I,EAAO2I,cAAgB,GACtCuD,EACF4C,GAAqD,OAApCA,EAAc8G,kBACzB9G,EAAc8G,mBAAqBtX,KAAKiP,MAAMvN,OAAO2I,cAAgB,IACpErK,KAAKiP,MAAMpL,QAAQ4L,QAAQvO,QAAUlB,KAAKiP,MAAMpL,QAAQ4L,QAAQvO,MAAMoJ,MAAS,EACpFiN,EAAc/G,GAAiBA,EAAcvG,mBAAsB,EACnEuN,EAAejI,EAAUkI,gBACzBC,EAAWnI,EAAUoI,YAE3B,OAAIJ,GAAclN,EACP,KAGP2E,EAAAA,cAAC4I,EAAAA,uBAAsB,CACnBjD,UAAU,yCACVkD,KAAK,aAAY,aACLtI,EAAUuI,oBACtBlJ,IAAKlB,EAAQY,KACbyJ,IAAI,OACJC,MAAOT,EACPlN,aAAcA,EACd4N,aAAcrK,EACd4J,aAAcxX,KAAKkY,YAAYV,GAC/BE,SAAU1X,KAAKmY,YAAYT,GAC3BU,kBAAmBZ,EACnBa,cAAeX,EACfY,iBAAkBtY,KAAKsY,oBAK3B,KAAAC,2BAA6B,CAACC,EAAiBC,EAAqBC,KACxE,GAAI1Y,KAAKkP,MAAMyJ,2BAA6B3Y,KAAKkP,MAAMyJ,0BAA0B5V,OAAQ,CACrF,MAAM6V,EAAsD,GAI5D,GAHA5Y,KAAKkP,MAAMyJ,0BAA0BtY,KAAIwY,IACrCD,EAAkBxU,KAAKyU,MAEvBH,GAAqBE,GAAqBA,EAAkB7V,OAAQ,CACpE,IAAI+V,GAAkB,EACtB,IAAK,IAAI/I,EAAI,EAAGA,EAAI6I,EAAkB7V,OAAQgN,IAC1C,IAAK,IAAIgJ,EAAI,EAAGA,EAAIH,EAAkB7I,GAAGhN,OAAQgW,IACxCH,EAAkB7I,GAAGgJ,GAAGN,aACzBK,GAAkB,GAI9B,IAAKA,EACD,OAEJ,IAAK,IAAI/I,EAAI,EAAGA,EAAI6I,EAAkB7V,OAAQgN,IAC1C,IAAK,IAAIgJ,EAAI,EAAGA,EAAIH,EAAkB7I,GAAGhN,OAAQgW,IAC7CH,EAAkB7I,GAAGgJ,GAAGN,YAAa,EAG7CzY,KAAK4R,SAAS,CAAE+G,0BAA2BC,SACxC,GAAIA,GAAqBA,EAAkB7V,OAAQ,CACtD,IAAK,IAAIgN,EAAI,EAAGA,EAAI6I,EAAkB7V,OAAQgN,IAC1C,IAAK,IAAIgJ,EAAI,EAAGA,EAAIH,EAAkB7I,GAAGhN,OAAQgW,IAI7C,GAHIH,EAAkB7I,GAAGgJ,IAAMH,EAAkB7I,GAAGgJ,GAAGP,UAAYA,IAC/DI,EAAkB7I,GAAGgJ,GAAGN,WAAaA,GAErCG,EAAkB7I,GAAGgJ,GAAGP,UAAYA,IAAYC,EAChD,IAAK,IAAIO,EAAI,EAAGA,EAAIJ,EAAkB7V,OAAQiW,IAC1C,IAAK,IAAIC,EAAI,EAAGA,EAAIL,EAAkBI,GAAGjW,OAAQkW,IACzCL,EAAkBI,GAAGC,IAAML,EAAkBI,GAAGC,GAAGT,UAAYA,IAC/DI,EAAkBI,GAAGC,GAAGR,YAAa,GAO7DzY,KAAK4R,SAAS,CAAE+G,0BAA2BC,OAK/C,KAAAM,mCAAsCC,IAC1C,MAAMC,EAA6C,OAAxBpZ,KAAKqZ,gBAAmD,OAAxBrZ,KAAKqZ,eAA0B,EAAI,EACxFC,EAA2C,GACjD,IAAIC,EAAqC,GACzC,GAAIJ,EAAgB,CAChB,IAAK,IAAI5L,EAAQ,EAAGA,EAAQ4L,EAAepW,OAAQwK,IAC3CA,EAAQ6L,GAAuB,GAAe,IAAV7L,IACpC+L,EAAelV,KAAKmV,GACpBA,EAAa,IAEjBA,EAAWnV,KAAK+U,EAAe5L,GAAOiM,SAEtCD,EAAWxW,QACXuW,EAAelV,KAAKmV,GAExB,MAAMZ,EAA8D,GACpE,GAAIW,GAAkBA,EAAevW,OACjC,IAAK,IAAIgN,EAAI,EAAGA,EAAIuJ,EAAevW,OAAQgN,IAAK,CAC5C,MAAM0J,EAA4D,GAClE,IAAK,IAAIV,EAAI,EAAGA,EAAIO,EAAevJ,GAAGhN,OAAQgW,IAAK,CAC/C,MAAMW,EAAiBJ,EAAevJ,GAAGgJ,GACzCU,EAA0BrV,KAAK,CAAEqU,YAAY,EAAMD,QAASkB,IAE5DD,EAA0B1W,QAC1B4V,EAA0BvU,KAAKqV,GAI3CzZ,KAAK4R,SAAS,CAAE+G,0BAA2BA,MAIlC,KAAAgB,eAAiB,KAC9B,MAAM,KAAEjS,EAAI,QAAE7D,EAAO,OAAEnC,GAAW1B,KAAKiP,MACjC2K,EAAoB/V,EAAQ4L,QAAQvO,OAAS2C,EAAQ4L,QAAQvO,MAAM2Y,WAAa,QAAU,SAC1FC,EACF9Z,KAAKiP,MAAMvN,OAAOG,oBAAsBsB,EAAAA,gBAAgBC,YAAYpD,KAAKkP,MAAM3P,UACzES,KAAKkP,MAAM3P,SAAS0M,QAAO3L,GAChB6C,EAAAA,gBAAgBC,YAAY9C,EAAQyZ,UAE/CrS,EAAKnI,SAASoN,QACdjF,EAAKnI,SAASoN,OAAOV,QAAO3L,GACjB6C,EAAAA,gBAAgBC,YAAY9C,EAAQyZ,UAGnDC,EAAkBtS,EAAK8I,cAAc7D,QAAUjF,EAAK8I,cAAc7D,OAAOxC,eAAkB,GAEjGnK,KAAKia,uBAAuBH,GAAiBA,EAAc/W,OAAQrB,EAAOmN,qBAE1E,MAAMd,EAAiB+L,EAEjBI,EAAsBla,KAAKiP,MAAMvN,OAAOwY,qBAAuB,GAE/DC,EAAmBpM,MAAAA,OAAc,EAAdA,EAAgB9B,QAAO3L,GAAW4Z,EAAoBE,QAAQ9Z,EAAQkZ,UAAa,IAEtGL,EAAiBpL,MAAAA,OAAc,EAAdA,EAAgB9B,QAAO3L,KACjB6Z,MAAAA,OAAgB,EAAhBA,EAAkBpI,MAAKsI,GAAmBA,EAAgB9W,WAAajD,EAAQiD,cAKtG+W,EAAmBta,KAAK0P,mBAExB6K,EACFJ,GACAA,EAAiB9Z,KAAI,CAACma,EAAmDjN,IAEjEyB,EAAAA,cAACyL,EAAAA,EAAa,CACVD,wBAAyBA,EACzBE,sBAAuBV,EACvBW,sBAAuB3a,KAAK4a,uBAC5BC,6BAA8B7a,KAAKiP,MAAMM,UAAUsL,6BACnDC,6BAA8B9a,KAAKiP,MAAMM,UAAUuL,6BACnDnP,IAAK4B,EACLwN,iBAAkB/a,KAAKgb,kBACvBC,WAAYjb,KAAKkb,iBACjBC,YAAY,EACZC,2BAA4Bd,GAAoBA,EAAmB/M,GACnEqM,kBAAmBA,EACnB/V,QAASA,EACTwX,SAAUrb,KAAKiP,MAAM7H,GACrBkU,eAAgBtb,KAAKiP,MAAMsM,aAKrCC,EACFrC,GACAA,EAAe9Y,KAAI,CAACma,EAAmDjN,IAE/DyB,EAAAA,cAACyL,EAAAA,EAAa,CACVD,wBAAyBA,EACzBE,sBAAuBV,EACvBW,sBAAuB3a,KAAK4a,uBAC5BC,6BAA8B7a,KAAKiP,MAAMM,UAAUsL,6BACnDC,6BAA8B9a,KAAKiP,MAAMM,UAAUuL,6BACnDnP,IAAK4B,EACLwN,iBAAkB/a,KAAKgb,kBACvBC,WAAYjb,KAAKkb,iBACjBC,YAAY,EACZC,2BAA4Bd,GAAoBA,EAAmB/M,GACnEqM,kBAAmBA,EACnB/V,QAASA,EACTwX,SAAUrb,KAAKiP,MAAM7H,GACrBkU,eAAgBtb,KAAKiP,MAAMsM,SAC3B5C,0BAA2B3Y,KAAKkP,MAAMyJ,0BACtC8C,SAAUzb,KAAKuY,+BAO/B,OAHKvY,KAAKkP,MAAMyJ,2BACZ3Y,KAAKkZ,mCAAmCC,GAErC,CACHuC,oBAAqB,CAAE/G,UAAW,2CAClCgH,wBAAyB,CACrBhH,UAAW,4EACP3U,KAAKkP,MAAM0M,YAAc,WAAa,KAG9Crc,SAAUgb,EACVpB,eAAgBqC,IAIP,KAAAK,kBAAoB,KACjC,MAAM,UAAEtM,EAAS,KAAE7H,EAAI,UAAEqE,GAAc/L,KAAKiP,MACtC6M,EAAoBpU,EAAK8I,cAAc7D,QAAUjF,EAAK8I,cAAc7D,OAAOxC,eAAkB,GACnG,OACI6E,EAAAA,cAAC+M,EAAAA,EAAa,CACVC,WAAW,gCACXC,aAAc1M,EAAU0M,aACxBC,iBAAkB3M,EAAU4M,iBAC5BC,MAAO7M,EAAU8M,mBACjBC,gBAAiBR,EAEjBS,iBAAkB7U,EAAKnI,SAASoN,OAChC6P,aAAcjN,EAAUiN,aACxBC,uBAAwBlN,EAAUkN,uBAClC1Q,UAAWA,EACX2Q,gBAAiB1c,KAAK2c,iBACtB1B,WAAYjb,KAAK4c,iCACjBC,gBAAiBtN,EAAUsN,gBAC3BvE,iBAAkBtY,KAAKsY,iBACvBzU,QAAS7D,KAAKiP,MAAMpL,WAKf,KAAAiZ,aAAe,KAAkB,IAAAC,EAAAC,EAC9C,MAAM,cAAEC,EAAa,oBAAEC,GAAwBld,KAAKiP,MAAMvN,QACpD,UAAE6N,GAAcvP,KAAKiP,MACrBkO,EAAgBnd,KAAKiP,MAAMpL,QAAQG,IAAItC,OAAO0b,eAC9CC,EAAYH,IAA0C,SAAlBC,GAA8C,oBAAlBA,GAChEvZ,EAAY5D,KAAKiP,MAAMvH,KAAK8I,cAAc7D,QAAU3M,KAAKiP,MAAMvH,KAAK8I,cAAc7D,OAAO8D,gBAAmB,GAC5G6M,EAAgBtd,KAAKiP,MAAMsO,OAASvd,KAAKiP,MAAMsO,MAAMC,WAAaxd,KAAKiP,MAAMsO,MAAMC,UAAU,GAC7FC,EAA+D,QAAtCV,EAAG/c,KAAKiP,MAAMvH,KAAKgW,aAAa/Q,cAAM,IAAAoQ,OAAA,EAAnCA,EAAqChL,MACnE2L,GAAsC,0DAAtBA,EAAa3J,OAEjC,OACI/E,EAAAA,cAAC2O,EAAAA,yBAAwB,CACrB/Z,SAAUA,EACVC,QAAS7D,KAAKiP,MAAMpL,QACpBoZ,cAAeA,EACf1N,UAAWA,EACXqO,WAAY5d,KAAKiP,MAAMsM,SACvBF,SAAUrb,KAAKiP,MAAM7H,GACrB8V,oBAAqBG,EACrB/E,iBAAkBtY,KAAKsY,iBACvBuF,cAAeP,EACfnV,gCAAgE,QAAjC6U,EAAEhd,KAAKiP,MAAMvH,KAAK9D,SAAS+I,cAAM,IAAAqQ,OAAA,EAA/BA,EAAiC7U,gCAClE2V,qBAAsBL,MAAAA,OAAyB,EAAzBA,EAA2BM,UACjDxM,cAAevR,KAAKkP,MAAMqC,cAC1B7P,OAAQ1B,KAAKiP,MAAMvN,OACnBmQ,cAAe7R,KAAKkP,MAAM2C,cAC1BmM,UAAWhe,KAAKiP,MAAMvH,KAAKsW,UAAUrR,OACrCsR,SAAUje,KAAKie,SACfC,QAASle,KAAKiP,MAAMvH,KAAKyW,YAAYxR,OACrCoG,oBAAqB/S,KAAKkP,MAAM6D,qBAAuB/S,KAAKkP,MAAM6D,oBAClEqL,eAAgBpe,KAAKiP,MAAMvN,OAAO0c,eAClCC,YAAare,KAAKiP,MAAMvN,OAAO2c,YAC/BC,eAAgBte,KAAKiP,MAAMvN,OAAO4c,eAClCC,iBAAkBve,KAAKiP,MAAMvN,OAAO6c,iBACpCC,0BAA2Bxe,KAAKiP,MAAMvN,OAAO8c,6BAKxC,KAAAtH,sBAAyBuH,IACtC,MAAM,QAAE5a,GAAY7D,KAAKiP,MACnBjO,EAAiB6C,GAAWA,EAAQ4L,QACpCsB,EAAgBlN,GAAWA,EAAQkN,cAEzC,IAAK/P,IAAmB+P,IAAkB/Q,KAAKiP,MAAMvH,KAAK8I,cAAc7D,OAAQ,CAC5E,MAAM+F,EAAQ,mDAAoD1R,EAAqC,GAApB,qBAC9E+P,EAAmC,GAAnB,sCAErB/Q,KAAKiP,MAAMlD,UAAUC,QAAQ0G,GAGjC7I,EAAAA,GAASC,WACL2E,QACAA,OAAOiQ,QAAQC,UACX,GACA,IACAlR,EAAAA,EAAAA,KACIe,EAAAA,EAAAA,IAAcxO,KAAKiP,MAAMpL,QAAQ4L,cACjC9N,EACA,CAAC3B,KAAK4e,iCAAiCH,EAAazH,sBACpDrV,IAGZ3B,KAAK4R,SAAS,CAAEiN,WAAY7e,KAAKkP,MAAM2P,UAAWtN,cAAe,MAEjEuN,EAAAA,EAAAA,KAAY,KACR9e,KAAKiP,MAAMvH,KAAK8I,cAAc7D,OAAQ2K,kBAAoB,EAC1DtX,KAAKiP,MAAMvH,KAAK8I,cAAc7D,OAAQoS,eAAiB,CACnD9c,QAAS,CAACjC,KAAK4e,iCAAiCH,EAAazH,sBAKxD,KAAA4H,iCAAoCI,IACjD,MAAM,KAAEtX,GAAS1H,KAAKiP,MAEtB,IAAKvH,EAAK8D,oBAAoBmB,OAC1B,MAAO,GAGX,MAAMsS,EAAsBvX,EAAK8D,oBAAoBmB,OAAOoF,MAAKvG,GACtDA,EAAoBG,MAAQqT,EAAOrT,MAG9C,OAAIsT,EACOA,EAAoBvT,WAGxB,IAGM,KAAAsK,4BAA8B,KAC3C,MAAM,KAAEtO,GAAS1H,KAAKiP,MAChBiQ,EAAexX,EAAK8I,cAAc7D,QAAUjF,EAAK8I,cAAc7D,OAAOoS,eAEtEI,EACDD,GAAgBA,EAAajd,SAAWid,EAAajd,QAAQ,MAC7DiL,EAAAA,EAAAA,IAA8B,UAAWlN,KAAKiP,MAAMpL,QAAQ4L,UAAY,IAAI,GAEjF,GAAI0P,GAAoBzX,EAAK8D,oBAAoBmB,OAAQ,CACrD,MAAMyS,EAAqB1X,EAAK8D,oBAAoBmB,OAAOoF,MAAKsN,GAExDA,EAAmB3T,WAAWE,aAAeuT,EAAiBvT,YAC9DyT,EAAmB3T,WAAWI,eAAiBqT,EAAiBrT,eAGxE,GAAIsT,EACA,OAAOpf,KAAKqP,sBAAsB0C,MAAKsE,GAAkBA,EAAe1K,MAAQyT,EAAmBzT,QAO9F,KAAAqP,kBAAqBsE,IAClC,MAAM,QAAEzb,GAAY7D,KAAKiP,MACnBjO,EAAiB6C,GAAWA,EAAQ4L,QACpCsB,EAAgBlN,GAAWA,EAAQkN,cAEzC,IAAK/P,IAAmB+P,IAAkB/Q,KAAKiP,MAAMvH,KAAK8I,cAAc7D,OAAQ,CAC5E,MAAM+F,EAAQ,8CAA+C1R,EAAqC,GAApB,qBACzE+P,EAAmC,GAAnB,sCAErB/Q,KAAKiP,MAAMlD,UAAUC,QAAQ0G,GAGjC,MAAM6M,GAA4BC,EAAAA,EAAAA,8BAC9BF,EACCtf,KAAKiP,MAAMvH,KAAK8I,cAAc7D,QAAU3M,KAAKiP,MAAMvH,KAAK8I,cAAc7D,OAAOxC,eAAkB,IAGpGN,EAAAA,GAASC,WACL2E,QACAA,OAAOiQ,QAAQC,UAAU,GAAI,IAAIlR,EAAAA,EAAAA,KAAiBe,EAAAA,EAAAA,IAAcxO,KAAKiP,MAAMpL,QAAQ4L,SAAU8P,KACjGT,EAAAA,EAAAA,KAAY,KACR9e,KAAKiP,MAAMvH,KAAK8I,cAAc7D,OAAQ2K,kBAAoB,EAC1DtX,KAAKiP,MAAMvH,KAAK8I,cAAc7D,OAAQxC,cAAgBoV,MAI7C,KAAArE,iBAAoBoE,IACjC,GAAItf,KAAKiP,MAAMvH,KAAK8I,cAAc7D,OAAQ,CACtC,MAAM8S,GAAwBD,EAAAA,EAAAA,8BAC1BF,EACAtf,KAAKiP,MAAMvH,KAAK8I,cAAc7D,OAAOxC,eAAiB,IAG1D,OAAOsD,EAAAA,EAAAA,KAAiBe,EAAAA,EAAAA,IAAcxO,KAAKiP,MAAMpL,QAAQ4L,SAAUgQ,GAGvE,OADAzf,KAAKiP,MAAMlD,UAAUC,QAAQ,uFACtB,IAGM,KAAA2Q,iBAAoB8B,IACjC,MAAM,KAAE/W,EAAI,UAAEqE,GAAc/L,KAAKiP,MAEjC,IAAKvH,EAAK8I,cAAc7D,OAEpB,YADAZ,EAAUC,QAAQ,sGAItB,IAAI0T,EAA6BhY,EAAK8I,cAAc7D,QAAUjF,EAAK8I,cAAc7D,OAAOxC,eAAkB,GAE1G,GAAKsU,EAAakB,SASX,CACHD,EAA4B,GAG5B,MAAME,EAAoB5f,KAAKoX,2BAA2ByI,SAAW7f,KAAKoX,2BAA2ByI,QAAQ5Q,MAAM2H,WAC7GkJ,EAAkBF,GAAqBG,SAASC,eAAeJ,GACrEK,YAAW,KACPH,GAAmBA,EAAgBI,UACpC,QAjBqB,CACxB,MAAMC,EAAiB1B,EAAa2B,cACpC,IAAKD,EAED,YADApU,EAAUC,QAAQ,gFAGtB0T,EAA4BA,EAA0BzT,QACjDoU,KAA4CC,EAAAA,EAAAA,+BAA8BH,EAAgBE,KAanG,MAAM3S,GAAUc,EAAAA,EAAAA,IAAcxO,KAAKiP,MAAMpL,QAAQ4L,SACjD5F,EAAAA,GAASC,WAAa2E,QAAUA,OAAOiQ,QAAQC,UAAU,GAAI,IAAIlR,EAAAA,EAAAA,IAAiBC,EAASgS,IAC3FhY,EAAK8I,cAAc7D,OAAO2K,kBAAoB,EAC9C5P,EAAK8I,cAAc7D,OAAOxC,cAAgBuV,GAG7B,KAAA9C,iCAAmC,CAAC2D,EAAsCC,KACvF,MAAM,KAAE9Y,EAAI,UAAEqE,GAAc/L,KAAKiP,MAC3BvB,GAAUc,EAAAA,EAAAA,IAAcxO,KAAKiP,MAAMpL,QAAQ4L,SAEjD,IAAK/H,EAAK8I,cAAc7D,OAEpB,OADAZ,EAAUC,QAAQ,yGACX0B,EAAQY,KAGnB,IAAIoR,EAA6BhY,EAAK8I,cAAc7D,QAAUjF,EAAK8I,cAAc7D,OAAOxC,eAAkB,GAE1G,GAAKqW,EASDd,EAA4B,OATf,CACb,IAAKa,EAED,OADAxU,EAAUC,QAAQ,wFACX0B,EAAQY,KAEnBoR,EAA4BA,EAA0BzT,QACjDoU,KAA4CC,EAAAA,EAAAA,+BAA8BC,EAAiBF,KAMpG,OAAO5S,EAAAA,EAAAA,IAAiBC,EAASgS,IA4CpB,KAAAzF,uBAAyB,CAACH,EAAwB2G,KAC/D,OAAQA,GACJ,KAAK5R,EAAoBrH,IACrBxH,KAAK0P,mBAAqBoK,EAC1B,MACJ,KAAKjL,EAAoB6R,IACrB1gB,KAAK0P,mBAAqB,EAC1B,MACJ,KAAKb,EAAoB8R,IACrB3gB,KAAK0P,mBAAqB,EAC1B,MACJ,KAAKb,EAAoB+R,MACrB5gB,KAAK0P,mBAAqB,EAC1B,MACJ,KAAKb,EAAoBgS,KACrB7gB,KAAK0P,mBAAqB,EAC1B,MACJ,QACI1P,KAAK0P,mBAAqB,IASrB,KAAAwI,YAAe4I,GAExB9R,EAAAA,cAAA,OAAK2F,UAAU,wBACX3F,EAAAA,cAAA,QAAM2F,UAAU,oCAAmC,cAAa,SAChE3F,EAAAA,cAAA,QAAM2F,UAAU,aAAamM,IAUxB,KAAA3I,YAAe4I,GAExB/R,EAAAA,cAAA,OAAK2F,UAAU,wBACX3F,EAAAA,cAAA,QAAM2F,UAAU,aAAaoM,GAC7B/R,EAAAA,cAAA,QAAM2F,UAAU,qCAAoC,cAAa,UAKrE,KAAAqM,aAAe,KAAK,IAAAC,EACxB,MAAMC,EAAmC,QAA3BD,EAAGjhB,KAAKmhB,YAAYtB,eAAO,IAAAoB,OAAA,EAAxBA,EAA0BG,wBACrCC,EACFxX,EAAAA,GAASC,WAAa2E,QAAWsR,SAASuB,cAAc,4CACtDC,EAAoBF,EAAcA,EAAYG,aAAe,EAC7DC,EAAkB5X,EAAAA,GAASC,WAAa2E,QAAUsR,SAAS2B,uBAAuB,mBAElFC,EACF9X,EAAAA,GAASC,WAAa2E,QAAWsR,SAAS2B,uBAAuB,+BAA+B,GAQ9FE,EAAqBD,EAAmBA,EAAiBH,aAAe,EAC9E,OACKC,IACAA,EAAgB1e,QAChB0e,GAAmBA,EAAgB1e,QAAUgd,SAAS2B,uBAAuB,uBAAuB3e,OAGjG6e,EACOV,GAAYA,EAASW,IAAM,GAAK,IAAMN,EAEtCL,GAAYA,EAASW,IAAM,IAAMN,EAIxCK,EACI/X,EAAAA,GAASC,WAAa2E,QAAUA,OAAOqT,YAAc,IAC9CZ,GAAYA,EAASW,IAAM,KAAON,EAEtCL,GAAYA,EAASW,IAAM,KAAON,EAElCL,GAAYA,EAASW,KAAON,GAOvC,KAAAQ,gBAAkB,KACtB,GAAI/hB,KAAKghB,eAAgB,CACrB,GAAInX,EAAAA,GAASC,WAAa2E,QAAUA,OAAOqT,YAAc,KAAO9hB,KAAKgiB,6BAA8B,CAE/F,IADY,IAAI7Q,MACR8Q,UAAYjiB,KAAKgiB,6BAA6BC,WAAa,IAC/D,OAGRjiB,KAAK4R,SAAS,CACVgK,aAAa,SAET5b,KAAKkP,MAAM0M,cACf/R,EAAAA,GAASC,WAAa2E,QAAUA,OAAOqT,YAAc,MACrD9hB,KAAKgiB,6BAA+B,IAAI7Q,MAE5CnR,KAAK4R,SAAS,CACVgK,aAAa,MA3nCrB5b,KAAKkiB,UACDjT,EAAMpL,QAAQ4L,SAAWR,EAAMpL,QAAQ4L,QAAQ0S,QAAgD,WAAtClT,EAAMpL,QAAQ4L,QAAQ0S,OAAOC,KAAoB,KAAO,KACrHpiB,KAAKuT,gBAAkBvE,EAAAA,YACvBhP,KAAKoX,2BAA6BpI,EAAAA,YAClChP,KAAKyT,aAAezT,KAAKyT,aAAa4O,KAAKriB,MAC3CA,KAAKsiB,gBAAkBtiB,KAAKsiB,gBAAgBD,KAAKriB,MACjDA,KAAKsR,cAAgB,GACrBtR,KAAKmhB,YAAcnS,EAAAA,YACnBhP,KAAKkP,MAAQ,CACT+G,aAAc,CACVsM,SAAS,EACTrM,qBAAsBlW,KAAKqP,sBAAsB,IAErDgE,aAAa,EACb9T,SAAU,GACVgS,cAAe,GACfM,eAAe,EACfgN,WAAW,EACX9L,oBAAqB,GACrBpB,gBAAiB,GACjB6Q,WAAY,GACZ5G,aAAa,GAEjB,MAAM,mBAAE6G,EAAkB,SAAEC,EAAQ,SAAEC,EAAQ,gBAAEC,GAAoB5iB,KAAKiP,MAAMM,UAEzE3P,EAASI,KAAKiP,MAAMpL,QAAQ4L,QAAQ7P,OACpCmM,EAAY/L,KAAKiP,MAAMlD,UACvB8W,EAAqB7iB,KAAKiP,MAAMM,UAAUuT,yBAC1CC,EAAuB/iB,KAAKiP,MAAMM,UAAUyT,wBAkBlD,GAjBAhjB,KAAK4a,uBAAyB,CAC1B7O,UAAAA,EACAnM,OAAAA,EACA6iB,mBAAAA,EACAC,SAAAA,EACAC,SAAAA,EACAC,gBAAAA,EACAC,mBAAAA,EACAE,qBAAAA,GAEJ/iB,KAAKsY,kBAAmB2K,EAAAA,EAAAA,oBACpBjjB,KAAKiP,MAAMpL,QAAQ4L,QAAQ8E,kBAC3BvU,KAAKiP,MAAMiU,aACXljB,KAAKiP,MAAMlD,WAIXkD,EAAMvH,KAAK9D,SAAS+I,QAA+C,IAArCsC,EAAMvH,KAAK9D,SAAS+I,OAAOnG,MAAa,KAAA2c,EACtE,MAAMC,EAAwE,QAA7DD,EAAGlU,EAAMvH,KAAK9D,SAAS+I,OAAO/I,SAAS,GAAG2M,2BAAmB,IAAA4S,OAAA,EAA1DA,EAA4DpR,MAAKsR,GAAqB,gBAAbA,EAAKC,MAC9FF,GAAeA,EAAYG,MAAOC,aAAe3Z,EAAAA,GAASC,WAAa2E,QACvEA,OAAOE,SAAS8U,OAAOL,EAAYG,MAAOC,aAMlDxjB,KAAKiP,MAAMvH,KAAK9D,SAAS2H,MAAK3H,IAC1B5D,KAAKiP,MAAMvH,KAAK8I,cAAcjF,MAAKiF,IACR,aAAnBxQ,KAAKwP,UACLgB,EAAcpR,SAAW,WAEzBoR,EAAcpR,SAAW,SAG7B,IAAIskB,EAA6B,GAE7B1jB,KAAKiP,MAAMpL,QAAQ4L,QAAQvO,OAASlB,KAAKiP,MAAMpL,QAAQ4L,QAAQvO,MAAMc,UACrE0hB,EAAexhB,KAAKC,MAAMC,mBAAmBpC,KAAKiP,MAAMpL,QAAQ4L,QAAQvO,MAAMc,WAGlFwO,EAAc8G,kBACTtX,KAAKiP,MAAMpL,QAAQ4L,QAAQvO,QAAUlB,KAAKiP,MAAMpL,QAAQ4L,QAAQvO,MAAMoJ,MAAQtK,KAAKiP,MAAMvN,OAAO2I,cAAgB,KACjH,EACJmG,EAAcuO,eAAiB,CAAE9c,QAASyhB,GAC1ClT,EAAcmT,SAAW3jB,KAAKiP,MAAMvN,OAAO2I,cAAgB,GAC3DmG,EAAcC,eAAiB7M,EAASA,SACxC4M,EAAcvG,kBAAoBrG,EAAS4C,MAC3CgK,EAAcrG,eAAgB3I,EAAAA,EAAAA,IAAuBxB,KAAKiP,MAAMpL,QAAQ4L,UAGxEmU,EAAAA,EAAAA,KACI,IACW,CACHpT,EAAcrG,eAAiBqG,EAAcrG,cAAcpH,OAC3DyN,EAAc8G,kBACd9G,EAAcuO,gBAAkB/e,KAAKkP,MAAM2P,aAGnD,KAAK,IAAAgF,EAAAC,EACD,MAAMvb,EAAQ,IAAIzF,EAAAA,iCACd0N,EAAcpR,SACdY,KAAKiP,MAAMpL,QAAQ4L,QAAQpQ,YAC3B,CACIY,OAAQ,CACJmK,IAAKpK,KAAKiP,MAAMvN,OAAO2I,aACvBE,KAAM8H,KAAKC,IAAI9B,EAAcmT,UAAYnT,EAAc8G,mBAAqB,GAAI,IAEpF9Q,OAAO,EACPrG,QAASqQ,EAAcuO,gBAAkB,IAE7CvO,EAAcrG,eAAiB,KAC7BnK,KAAKiP,MAAMpL,QAAQ4L,QAAQxO,UAAUoB,QAAU,GAEjDrC,KAAKiP,MAAMpL,QAAQ4L,QAAQvO,OAASlB,KAAKiP,MAAMpL,QAAQ4L,QAAQvO,MAAMoB,EAC/DtC,KAAKiP,MAAMpL,QAAQ4L,QAAQvO,MAAMoB,EACjCJ,KAAKO,UAAU,CACXC,UAA2C,QAAlCmhB,EAAE7jB,KAAKiP,MAAMpL,QAAQ4L,QAAQvO,aAAK,IAAA2iB,OAAA,EAAhCA,EAAkCthB,UAC7CI,eAAgD,QAAlCmhB,EAAE9jB,KAAKiP,MAAMpL,QAAQ4L,QAAQvO,aAAK,IAAA4iB,OAAA,EAAhCA,EAAkCthB,oBAGxDxC,KAAKiP,OACLjP,KAAKiP,MAAMvN,aAC6BC,IAAxC3B,KAAKiP,MAAMvN,OAAOhC,mBAClBM,KAAKiP,MAAMvN,OAAOhC,mBAEtBM,KAAKiP,MAAMvN,OAAOG,mBAClB7B,KAAKiP,MAAMpL,QAAQ4L,QAAQ7P,QAoB/B,IAlBAmkB,EAAAA,EAAAA,SAAsBxb,EAAOvI,KAAKiP,MAAMpL,QAAQkN,eAAexF,MAAKyY,IAChExT,EAAcC,eAAiBuT,EAAepgB,SAC1CogB,EAAepgB,SAASb,QAAUihB,EAAexd,MACjDgK,EAAcvG,kBAAoB+Z,EAAexd,MACzCwd,EAAepgB,SAASb,QAAWihB,EAAexd,QAC1DgK,EAAcvG,kBAAoB+Z,EAAexd,OAQjDxG,KAAKiP,MAAMvN,OAAOuiB,+BAClBjkB,KAAKgQ,qBAIThQ,KAAKiP,MAAMvN,OAAOG,mBAAoB,KAAAqiB,EAAAC,EAAAC,EAAAC,EAAAC,EAAAC,EACtC,MAAMC,EAAe,IAAI3X,EAAAA,0BACrB2D,EAAcpR,SACdY,KAAKiP,MAAMpL,QAAQ4L,QAAQpQ,YAC3B,CACIY,OAAQ,CACJmK,IAAKpK,KAAKiP,MAAMvN,OAAO2I,aACvBE,KAAM8H,KAAKC,IACP9B,EAAcmT,UAA2C,QAAnCO,EAAI1T,EAAc8G,yBAAiB,IAAA4M,EAAAA,EAAIlkB,KAAK2P,mBAClE3P,KAAK2P,oBAGbnJ,OAAO,EACPrG,QAAqC,QAA9BgkB,EAAE3T,EAAcuO,sBAAc,IAAAoF,EAAAA,EAAI,IAElB,QAD1BC,EACD5T,EAAcrG,qBAAa,IAAAia,EAAAA,EAAI,KACc,QAA7CC,EAAErkB,KAAKiP,MAAMpL,QAAQ4L,QAAQxO,UAAUoB,cAAM,IAAAgiB,EAAAA,EAAI,GACjB,QAAhCC,EAAAtkB,KAAKiP,MAAMpL,QAAQ4L,QAAQvO,aAAK,IAAAojB,GAAhCA,EAAkChiB,EAC5BtC,KAAKiP,MAAMpL,QAAQ4L,QAAQvO,MAAMoB,EACD,QADEiiB,EAClCvkB,KAAKiP,MAAMpL,QAAQ4L,QAAQvO,aAAK,IAAAqjB,OAAA,EAAhCA,EAAkChiB,WACxC,EACAvC,KAAKiP,MAAMvN,OAAOG,qBAGtB4iB,EAAAA,EAAAA,SAA4BD,EAAcxkB,KAAKiP,MAAMpL,QAAQkN,eACxDxF,MAAKhM,IACFS,KAAK4R,SAAS,CAAErS,SAAAA,OAEnBkT,OAAMC,IACH1S,KAAKiP,MAAMlD,UAAU2G,MAAMA,gBAQnB,QAApCvD,EAAInP,KAAKiP,MAAMpL,QAAQ4L,QAAQvO,aAAK,IAAAiO,GAAhCA,EAAkC5M,WAClCvC,KAAKiP,MAAMvH,KAAKgd,eAAenZ,MAAK3H,IAChC5D,KAAKiP,MAAMvH,KAAK8I,cAAcjF,MAAKoZ,IAC/BA,EAAqBD,eAAiB9gB,QAIlD5D,KAAKsiB,kBAlOC,eACN,MAA0B,OAAnBtiB,KAAKkiB,WAAyC,OAAnBliB,KAAKkiB,WAAyC,OAAnBliB,KAAKkiB,UAiC/D,uBAAuBtiB,EAAgBglB,GAC1C,IAAIC,EAKJ,OAJIjlB,GAAUglB,GAAoBA,EAAiB7hB,OAAS,IACxD8hB,EAAkBD,EAAiB7S,MAAKsR,GAAQA,EAAKyB,SAAUtQ,gBAAkB5U,EAAO4U,iBAGrFqQ,GAAmBA,EAAgBE,KA6LvCC,oBACCnb,EAAAA,GAASC,WAAa2E,QAAUA,QAAUA,OAAOwW,mBACjDxW,OAAOwW,iBAAiB,SAAUjlB,KAAKsiB,iBACvCtiB,KAAKsiB,kBACL7T,OAAOwW,iBAAiB,SAAUjlB,KAAK+hB,kBAEvC/hB,KAAKiP,MAAMvN,OAAOuiB,+BAClBjkB,KAAKgQ,kBAKThQ,KAAK8S,gCACL8Q,EAAAA,EAAAA,KACI,IAAM5jB,KAAKiP,MAAMvH,KAAK8I,cAAc7D,QAAU3M,KAAKiP,MAAMvH,KAAK8I,cAAc7D,OAAO8D,iBACnF9K,UAAW,IAAAuf,EACP,MAAMtW,EAAM/E,EAAAA,GAASC,WAAa2E,QAAUA,OAAOE,SAASL,KACpB,QAApC4W,EAAAllB,KAAKiP,MAAMvH,KAAK8I,cAAc7D,cAAM,IAAAuY,GAApCA,EAAsCzU,eAAe1N,QAAU/C,KAAKkP,MAAMsT,aAAe5T,IACzF5O,KAAK8S,+BACL9S,KAAK4R,SAAS,CAAE4Q,WAAY5T,GAAY,SAqBjDuW,uBACCtb,EAAAA,GAASC,WAAa2E,OAAO2W,qBAC7B3W,OAAO2W,oBAAoB,SAAUplB,KAAKsiB,iBAE1CzY,EAAAA,GAASC,WAAa2E,QAAUA,OAAOwW,kBACvCxW,OAAOwW,iBAAiB,SAAUjlB,KAAK+hB,iBAIxCsD,SACH,MAAM,cAAEpI,EAAa,UAAEtI,GAAc3U,KAAKiP,MAAMvN,QAC1C,UAAE6N,GAAcvP,KAAKiP,MAErBrL,GACD5D,KAAKiP,MAAMvH,KAAK8I,cAAc7D,QAC/B3M,KAAKiP,MAAMvH,KAAK8I,cAAc7D,OAAO8D,gBAC0B,IAA/DzQ,KAAKiP,MAAMvH,KAAK8I,cAAc7D,OAAO8D,eAAe1N,SACnD/C,KAAKiP,MAAMvH,KAAK8I,cAAc7D,OAAO8D,eAAe,GAAG6U,OAClD,GACAtlB,KAAKiP,MAAMvH,KAAK8I,cAAc7D,OAAQ8D,iBAAmB,GAE7D8U,EAAiBvlB,KAAKiP,MAAMvH,KAAK8I,cAAc7D,QAAU3M,KAAKiP,MAAMvH,KAAK8I,cAAc7D,OAAO+X,gBAAmB,KACvH,IAAIc,EAAY,GACX5hB,GAAgC,IAApBA,EAASb,SACtByiB,EAA+B,aAAnBxlB,KAAKwP,UAA2BD,EAAUkW,2BAA6BlW,EAAUmW,0BAEjG,MAAMC,EAAoB3lB,KAAK8c,eACzB8I,EACF5W,EAAAA,cAAC6W,EAAAA,wBAAuB,CACpB5iB,QAASsiB,EACT1hB,QAAS7D,KAAKiP,MAAMpL,QACpBoZ,cAAeA,EACf1N,UAAWA,EACXqO,WAAY5d,KAAKiP,MAAMsM,SACvBF,SAAUrb,KAAKiP,MAAM7H,GACrBkR,iBAAkBtY,KAAKsY,mBAIzBwN,EAA8B/lB,EAAAA,EAAA,GAC7BC,KAAKiP,OAAK,IAEbrL,SAAU+hB,EACVI,gBAAiB/lB,KAAKiP,MAAMvN,OAAOskB,kBAAoBhmB,KAAK0T,sBAC5DyB,mBAAoBnV,KAAKiP,MAAMvN,OAAOskB,kBAAoBhmB,KAAKkV,wBAC/D+Q,WAAYjmB,KAAK2Z,iBACjBhF,UAAWuR,GAAAA,CAAW,6BAA8BvR,GACpD7F,sBAAuB,CACnBqX,YAAanmB,KAAKiP,MAClB0F,UAAWuR,GAAAA,CAAW,mEAAoEvR,IAE9FyR,cACIpmB,KAAKiP,MAAMvH,KAAK8I,cAAc7D,QAAqE,IAA3D3M,KAAKiP,MAAMvH,KAAK8I,cAAc7D,OAAO1C,kBACvEjK,KAAK8V,sBACL,KACVuQ,WAAYrmB,KAAKqX,iBACjBiP,kBAAmB,CAAE3R,UAAW,wCAChC4R,wBAAyB,CAAE5R,UAAW,+CACtC6R,qBAAsB,CAAE7R,UAAW,qFACnC8R,iCAAkC,CAC9B9R,UAAW,yFAEf+R,cAAe1mB,KAAK6b,oBACpB8K,YACI3mB,KAAKiP,MAAMvH,KAAK8I,cAAc7D,QAAqE,IAA3D3M,KAAKiP,MAAMvH,KAAK8I,cAAc7D,OAAO1C,kBACzE+E,EAAAA,cAAC4X,EAAAA,YAAW,CACRhS,KAAMrF,EAAU4D,WAChBqC,UAAWjG,EAAU4D,WACrB0T,SAAU7mB,KAAKuT,gBACfuT,QAAS9mB,KAAKyT,aACdrM,GAAG,wBAEP,KACR2f,kBAAmB/mB,KAAKgT,wBACxBiL,SAAUje,KAAKie,SACf+I,aAAcxB,GAAaxW,EAAAA,cAACiY,EAAAA,aAAY,CAACrS,KAAM4Q,IAC/C0B,uBAAwB,CAAEvS,UAAW,4BACrCwS,mBACInnB,KAAKiP,MAAMvH,KAAK8I,cAAc7D,QAC0B,OAAxD3M,KAAKiP,MAAMvH,KAAK8I,cAAc7D,OAAO+X,qBACmB/iB,IAAxD3B,KAAKiP,MAAMvH,KAAK8I,cAAc7D,OAAO+X,eAC/BkB,EACA,KACVtU,cAAetR,KAAKsR,cACpB6P,YAAanhB,KAAKmhB,YAClBiG,qBAAsBpnB,KAAKuY,6BAE/B,OAAOvY,KAAKiP,MAAMoY,WAAWvB,GAgrBzBzM,eACJ,MAAM,QAAExV,GAAY7D,KAAKiP,MAGzB,GAAIpL,EAAQ4L,SAAW5L,EAAQ4L,QAAQ0S,QAA0C,WAAhCte,EAAQ4L,QAAQ0S,OAAOC,KACpE,MAAO,KAGX,GAAIvY,EAAAA,GAASC,WAAa2E,QAAUA,OAAOqT,WAAY,CACnD,MAAMwF,EAAezjB,EAAQ4L,QAAQ6X,aACrC,GAAIA,EACA,OAAIA,EAAaC,IAAM9Y,QAAUA,OAAOqT,YAAcwF,EAAaC,GAAGC,EAC3D,KACAF,EAAaG,IAAMhZ,QAAUA,OAAOqT,YAAcwF,EAAaG,GAAGD,EAClE,KACAF,EAAaI,IAAMjZ,QAAUA,OAAOqT,YAAcwF,EAAaI,GAAGF,EAClE,KACAF,EAAaK,IAAMlZ,QAAUA,OAAOqT,YAAcwF,EAAaK,GAAGH,EAClE,KAEJ,KAIf,MAAO,KAGH/T,eACJzT,KAAK4R,SAAS,CACVyB,aAAcrT,KAAKkP,MAAMmE,cAIzBiP,kBACJtiB,KAAKkiB,UAAYliB,KAAKqZ,eAElBrZ,KAAKkP,MAAMmE,cAAgBrT,KAAKie,UAChCje,KAAKyT,kBAzjCHmU,EAAAA,EAAAA,IAAA,CAATC,EAAAA,IAAQ,8BAkBTD,EAAAA,EAAAA,IAAA,CADCE,EAAAA,IAAU,gCArBMhZ,EAAqBC,GAAA6Y,EAAAA,EAAAA,IAAA,CADzCG,EAAAA,IACoBjZ,kIC5IrB,MAiNMkZ,EAA0BA,CAC5BC,EACAC,EACAjC,EACA1P,EACA0H,EACAkK,EACAC,IAEOpZ,IAAAA,aACHkZ,EAAWG,MACX,GACAH,EAAWI,YACXC,EAAgBN,EAAUC,EAAYjC,EAAY1P,EAAgB0H,EAAUkK,EAAwBC,GACpGF,EAAWM,aAIbD,EAAkBA,CACpBN,EACAhZ,EACAgX,EACA1P,EACA0H,EACAkK,EACAC,IAEI7R,EACOvH,IAAAA,aACHC,EAAMwZ,UACN,GACAC,EAAWnS,GACXoS,EAAcV,EAAUhC,EAAY,KAAMhI,EAAUkK,EAAwBC,IAG7E,KAsDLO,EAAgBA,CAClBC,EACA3Z,EACA4Z,EACA5K,EACAkK,EACAC,KAEA,MAAM,SAAE7oB,EAAQ,eAAE4Z,EAAc,oBAAEuC,EAAmB,wBAAEC,GAA4B1M,EACnF,IAAI6Z,EAAuB3P,EAC3B,MAAM4P,EAnCc1d,CAAAA,IACpB,GAAIxB,EAAAA,GAASC,WAAa2E,QAAUA,OAAOqT,YAClBzW,EAAIoE,QAAQ6X,aAE7B,OAAI7Y,OAAOqT,WAAa,IAEb,EACArT,OAAOqT,WAAa,KAEpB,GACArT,OAAOqT,WAEP,GAWnB,OAAO,GAYYkH,CAAeJ,EAAU/kB,SAE5C,IAAIuV,EAAoC,IAAf2P,EAAmB,EAAmB,IAAfA,EAAmB,EAAI,EAMvC,IAAAE,EAAhC,OALA7P,EAAoC,IAAf2P,EAAmB,EAAI3P,EACxCD,IAAkBA,MAAAA,OAAc,EAAdA,EAAgBpW,QAASqW,IAAuB+O,IAClEW,EAAuB3P,EAAe+P,MAAM,EAAG9P,IAG/C7Z,GAAY4Z,GACZlR,QAAQC,IAAI,oCAER8G,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAACma,EAAAA,KAAIC,OAAA3F,OAAA,GAAK9H,GACLpc,EAASc,KAAI,CAACgpB,EAAS9b,IACpByB,IAAAA,cAACA,IAAAA,SAAc,CAACrD,IAAK4B,GAAQ8b,KAGjCra,IAAAA,cAAA,OAAK2F,UAAWsJ,EAAW,GAAK,sBAC5BjP,IAAAA,cAACma,EAAAA,KAAIC,OAAA3F,OAAA,GAAK/H,GACLzT,QAAQC,IAAI,+DACb8G,IAAAA,cAAA,OAAK2F,UAAU,oBAAoBkU,GAAcA,GACjD7Z,IAAAA,cAAA,OAAK2F,UAAU,8BACX3F,IAAAA,cAAA,OAAK2F,UAAW,gBAAewT,EAAyB,cAAgB,gBAC/C,QAD8Dc,EAClFH,SAAoB,IAAAG,OAAA,EAApBA,EAAsB5oB,KAAI,CAACgpB,EAAS9b,IACjCyB,IAAAA,cAACA,IAAAA,SAAc,CAACrD,IAAK4B,GAAQ8b,MAGpClQ,GAAkBA,EAAepW,OAASqW,GACvCpK,IAAAA,cAACsa,EAAAA,EAAM,CACH3U,UAAW,qBAAoBwT,EAAyB,eAAiB,eACzErB,QAASA,KACLsB,GAA2BD,GACvBS,EAAUxB,sBACVwB,EAAUxB,0BAAqBzlB,GAAW,GAAO,KAIxDwmB,EAAyB,eAAiB,eAE3CnZ,IAAAA,cAAA,QAAM2F,UAAU,gBAU7C,MAGL+T,EAAczZ,IAChB,MAAM,iBAAEqH,EAAgB,eAAEC,GAAmBtH,EAC7C,OAAIsH,EACOvH,IAAAA,cAACma,EAAAA,KAAIC,OAAA3F,OAAA,GAAKnN,GAAmBC,GAEjC,MAyBLgT,EAA2Bta,IAC7B,MAAM,2BAAEmG,EAA0B,sBAAEE,EAAqB,2BAAEK,GAA+B1G,EAC1F,OAAIqG,EAEItG,IAAAA,cAACma,EAAAA,KAAIC,OAAA3F,OAAA,GAAKrO,GACLE,EAAsBjV,KAAI,CAACb,EAAU+N,IAClCyB,IAAAA,cAACA,IAAAA,SAAc,CAACrD,IAAK4B,GAChB/N,EACA8V,GAAyBA,EAAsB/H,EAAQ,IAAMoI,MAO3E,MAGL6T,EAA6BA,CAACva,EAAwBwa,KAAiE,IAAAC,EACzH,MAAM,MAAEzU,EAAK,eAAED,GAAmB/F,EAC5BoF,EAA6C,QAAjCqV,EAAGD,EAAS5lB,QAAQ4L,QAAQvO,aAAK,IAAAwoB,OAAA,EAA9BA,EAAgCpnB,EACrD,OAAI2S,EAEIjG,IAAAA,cAACma,EAAAA,KAAIC,OAAA3F,OAAA,GAAKzO,GACLX,EACGrF,IAAAA,cAAA,UACKiG,EAAMR,YAAW,IAAGQ,EAAMH,UAAS,MAAKG,EAAMF,YAGnD/F,IAAAA,cAAA,UAAKiG,EAAMH,YAKpB,MAGX,EA3a6E7F,IAAQ,IAAAkU,EAAAwG,EACjF,MACIjiB,MACIlI,UAAYmN,OAAQid,IACvB,sBACD9a,EAAqB,SACrBlL,EAAQ,kBACR0iB,EAAiB,wBACjBC,EAAuB,cACvBG,EAAa,SACbzI,EAAQ,YACR0I,EAAW,kBACXI,EAAiB,eACjBhB,EAAc,WACdE,EAAU,kBACV9Q,EAAiB,cACjBiR,EAAa,qBACbI,EAAoB,iCACpBC,EAAgC,aAChCO,EAAY,uBACZE,EAAsB,mBACtBC,EACA5J,OAAO,OAAEsM,GAAQ,WAEjBxD,EAAU,YACVlF,GACAlS,GACG6a,EAAWC,IAAgBC,EAAAA,EAAAA,WAAS,IACpCC,EAAeC,IAAoBF,EAAAA,EAAAA,aACnC7B,EAAwBC,IAA6B4B,EAAAA,EAAAA,WAAS,IAIrEG,EAAAA,EAAAA,YAAU,KASN,GARApK,SAASkF,iBAAiB,WAAYjd,IACA,WAA9BA,EAAE2D,IAAIye,qBACFN,GACAC,GAAcD,WAKJnoB,IAAlBsoB,EAA6B,CAC7B,MAAMI,EAAsBT,GAAmBA,EAAgB7V,KAAO6V,EAAgB7V,KAAO,GAC7F9E,EAAMpL,QAAQkN,cAAchH,OAAO,IAAIugB,EAAAA,uBAA0B,CAAEC,aAAcF,IACjFH,EAAiBG,MAEtB,CAACP,IAEJ,MAAMU,EAAkCA,CAAC7V,EAAmB8V,KACxD,IAAIC,EAA6BD,EAAMC,OACvC,KAAOA,GAAUA,IAAW3K,UAAU,CAClC,GAAK2K,EAAmBC,WAAcD,EAAmBC,UAAUC,SAASjW,GACxE,OAAO,EAEX+V,EAAUA,EAAgBG,WAE9B,OAAO,IAGXV,EAAAA,EAAAA,YAAU,KACNpK,SAAS+K,KAAK7F,iBACV,SACA8F,IACI,MAAMC,EAAcjL,SAAS2B,uBAAuB,8BAChDsJ,GAAeA,EAAYjoB,SAEtBynB,EAAgC,6BAA8BO,IAC9DP,EAAgC,iCAAkCO,IAE/D9b,EAAMmY,sBACNnY,EAAMmY,0BAAqBzlB,GAAW,GAAO,OAK7D,KAEL,IACH,MAAMwR,EAAaA,KACf,MAAM,SAAE3T,GAAayP,EAAMvH,KACrB6iB,EAAe/qB,GAAYA,EAASmN,QAAUnN,EAASmN,OAAOoH,KAEpE,OACI/E,IAAAA,cAACma,EAAAA,KAAI,CAAC9T,IAAI,MAAMV,UAAU,yBACtB3F,IAAAA,cAACma,EAAAA,KAAI,CAAC9T,IAAI,OAAOV,UAAU,cACtB4V,GAELvb,IAAAA,cAAA,OAAK2F,UAAU,sBAAsBmS,QANrBmE,IAAMlB,GAAcD,GAM2BjS,KAAK,UAChE7I,IAAAA,cAAA,KAAG2F,UAAU,+BAUvBuW,EAAeA,KACjBnB,GAAcD,IAkBZ1G,EAAyE,QAA9DD,EAAGlU,EAAMvH,KAAK9D,SAAS+I,OAAQ/I,SAAS,GAAG2M,2BAAmB,IAAA4S,OAAA,EAA3DA,EAA6DpR,MAAKsR,GAAqB,gBAAbA,EAAKC,MACnG,IAAI6H,GAAiB,EACqB,IAAtClc,EAAMvH,KAAK9D,SAAS+I,OAAQnG,OAAe4c,GAAeA,EAAYG,MAAOC,cAC7E2H,GAAiB,GAErB,MAAM9W,EAA0C,QAA9BsV,EAAG1a,EAAMpL,QAAQ4L,QAAQvO,aAAK,IAAAyoB,OAAA,EAA3BA,EAA6BrnB,EAClD,IAAI8oB,GAAuB,EAC3B,GAAIvhB,EAAAA,GAASC,WAAa2E,OAAQ,CAC9B,MAAMgT,EAAkB1B,SAAS2B,uBAAuB,oCACxD,GAAID,GAAmBA,EAAgB1e,OAAQ,CAC3C,MAAMsoB,EAAwBtL,SAAS2B,uBAAuB,2BAC1D2J,GAAyBA,EAAsBtoB,QAAUsoB,EAAsB,GAAGC,YAClFF,GAAuB,IAYnC,OAAInN,EACQkN,EAiCJnc,IAAAA,cAAAA,IAAAA,SAAA,MAhCAA,IAAAA,cAACuc,EAAAA,OAAMnC,OAAA3F,OAAA,GAAK3U,GAGPqG,GAAqBoU,EAAwBpU,IAC5Cd,IAAiB+W,IAAyBrF,GAAkByD,EAA2BzD,EAAgB9W,GA3C7GD,IAAAA,cAAAA,IAAAA,SAAA,KACIA,IAAAA,cAAA,OAAK2F,UAAU,yBACf3F,IAAAA,cAACwc,EAAAA,EAAY,CACT7W,UAAU,0BACVvB,OAAQ0W,EACR2B,eAAgB5B,EAChBrW,cAAe0X,EACf/X,WAAYA,IACZqV,YAhBLxZ,IAAAA,cAAA,OAAK2F,UAAU,eAAekD,KAAK,SAASiP,QAD3BmE,IAAMlB,GAAcD,QAyDnCnD,EACAqB,EACG/Y,EACA8X,EACAd,EACAG,EACAnI,EACAkK,EACAC,GAEJpZ,IAAAA,cAAA,OAAK2F,UAAU,eAAewC,IAAKgK,GAC9BwH,EAAc1Z,EAAOgX,EAAY4D,GAAQ,EAAO1B,EAAwBC,IAE5EhC,GAAiBsC,EAAWtC,GAC5BM,EACD1X,IAAAA,cAACma,EAAAA,KAAIC,OAAA3F,OAAA,GAAKyD,GAAyBC,GACnCnY,IAAAA,cAACma,EAAAA,KAAIC,OAAA3F,OAAA,GAAK6C,GACLU,EACApjB,GAEJyiB,GAML8E,EA0BJnc,IAAAA,cAAAA,IAAAA,SAAA,MAzBAA,IAAAA,cAACuc,EAAAA,OAAMnC,OAAA3F,OAAA,GAAK3U,GAERE,IAAAA,cAACma,EAAAA,KAAIC,OAAA3F,OAAA,GAAK+C,GAGLrR,GAAqBoU,EAAwBpU,IAC5Cd,IAAiB+W,IAAyBrF,GAAkByD,EAA2BzD,EAAgB9W,IAE7GD,IAAAA,cAACma,EAAAA,KAAIC,OAAA3F,OAAA,GAAKgD,EAAgC,CAAEtP,IAAKgK,IAC7CnS,IAAAA,cAAA,OAAK2F,UAAU,eAAewC,IAAKgK,GAC9BwH,EAAc1Z,EAAOgX,EAAY4D,EAAQ5L,EAAUkK,EAAwBC,IAEhFpZ,IAAAA,cAACma,EAAAA,KAAIC,OAAA3F,OAAA,GAAK8C,GACLG,EACAN,GAAiBsC,EAAWtC,GAC7BpX,IAAAA,cAACma,EAAAA,KAAIC,OAAA3F,OAAA,GAAKyD,GAAyBC,GACnCnY,IAAAA,cAACma,EAAAA,KAAIC,OAAA3F,OAAA,GAAK6C,GACLU,EACApjB,GAEJyiB,qLCtMf,MAAOqF,EAAbvsB,cACuB,KAAAgL,cAA8C,KAE9C,KAAAsG,eAAwC,GAExC,KAAAsO,eAAqC,KAErC,KAAAzH,kBAAmC,KAEnC,KAAA/X,SAA8C,KAI9C,KAAAokB,SAAmB,GAEnB,KAAAvkB,SAAyB,UAEzB,KAAAslB,eAAuC,KAEvC,KAAApT,cAA4C,KAlBnDsW,EAAAA,EAAAA,IAAA,CAAXE,EAAAA,IAAU,qCAECF,EAAAA,EAAAA,IAAA,CAAXE,EAAAA,IAAU,sCAECF,EAAAA,EAAAA,IAAA,CAAXE,EAAAA,IAAU,sCAECF,EAAAA,EAAAA,IAAA,CAAXE,EAAAA,IAAU,yCAECF,EAAAA,EAAAA,IAAA,CAAXE,EAAAA,IAAU,gCAECF,EAAAA,EAAAA,IAAA,CAAXE,EAAAA,IAAU,yCAECF,EAAAA,EAAAA,IAAA,CAAXE,EAAAA,IAAU,gCAECF,EAAAA,EAAAA,IAAA,CAAXE,EAAAA,IAAU,gCAECF,EAAAA,EAAAA,IAAA,CAAXE,EAAAA,IAAU,sCAECF,EAAAA,EAAAA,IAAA,CAAXE,EAAAA,IAAU,oCAMT,MAAO9d,EAAb7K,cACW,KAAAW,YAAc,IAAM,gBAEpB,KAAAa,mBAAqB,IAAM,gBAE3B,KAAAC,cAAgB,IAAiB,WAGrC+E,eAAegmB,EAAoBpjB,EAA2B8C,GACjE,OAAO,IAAIqgB,EAOR,MAAME,EAAuBnqB,GACzB,IAAIuI,EAMf,GAAe3B,EAAAA,EAAAA,IAA0C,CACrDC,OAAgCqjB,EAChCpjB,MAAOqjB,sHCxDL,MAAOtB,EAAbnrB,cAGW,KAAAW,YAAc,IAAM,qBACpB,KAAAa,mBAAqB,IAAM,qBAC3B,KAAAC,cAAgB,IAAiB,WAkBrC+E,eAAekmB,EAAkBtjB,EAA+B8C,GACnE,MAAO,CAAEygB,2BAAuBnqB,EAAW4oB,kBAAc5oB,GAM7D,SAAe0G,EAAAA,EAAAA,IAAgD,CAC3DC,OAAsCujB,EACtCtjB,MAfiB9G,GACV,IAAI6oB,sDCxBf,MAkBA,EAlBoDrb,GAE5CD,EAAAA,cAAC+c,EAAAA,MAAK,CACF3Y,OAAQnE,EAAMmE,OACd4Y,OAAQ,KACRC,gBAAiB,aACjBC,WAAW,EACXC,OAAQld,EAAMuE,cACdmB,UAAW,iBAAiB1F,EAAM0F,aAEjC1F,EAAMkE,YAAcnE,EAAAA,cAACod,EAAAA,YAAW,SAAGnd,EAAMkE,YACzClE,EAAMwc,gBAAkBzc,EAAAA,cAACqd,EAAAA,UAAS,CAAC1X,UAAU,sBAAsB1F,EAAMwc,gBACzExc,EAAMqd,kBAAoBtd,EAAAA,cAACqd,EAAAA,UAAS,CAAC1X,UAAU,sBAAsB1F,EAAMqd,kBAC3Erd,EAAMuZ,aAAexZ,EAAAA,cAACud,EAAAA,YAAW,KAAEtd,EAAMuZ,mnBC1BtD,MAAMgE,EAAU,CAAEC,QAAS,GAAIC,YAAa,IAmBlCC,EAA8BA,CAACC,EAAqBC,KAUlD,GADAL,EAAQE,YAAYE,GAAuBC,GACtCL,EAAQE,YAAYE,GAAqBE,QAC1C,MAAM,IAAIlqB,MAAM,oBAAsBgqB,EAAsB,mCAEhEJ,EAAQE,YAAYE,GAAqBE,QAAQC,UAAUC,eAAiBJ,EACxEJ,EAAQE,YAAYE,GAAqBE,QAAQC,UAAU3lB,KAC3DolB,EAAQE,YAAYF,EAAQE,YAAYE,GAAqBE,QAAQC,UAAU3lB,IAAMwlB,IAMhGJ,EAAQC,QAAQ,mCAAqC,CAClDQ,EAAGA,IAAMC,EAAQ,MACjBC,MAAO,kBACPC,GAAI,CAAC,CAACC,KAAK,WAAaC,KAAK,0EAA2EC,MAAO,GAAG,CAACF,KAAK,oBAAsBC,KAAK,oFAAqFC,MAAO,GAAG,CAACF,KAAK,iBAAmBC,KAAK,0EAA2EC,MAAO,GAAG,CAACF,KAAK,eAAiBC,KAAK,uEAAwEC,MAAO,GAAG,CAACF,KAAK,gBAAkBC,KAAK,0DAA2DC,MAAO,GAAG,CAACF,KAAK,cAAgBC,KAAK,sEAAuEC,MAAO,GAAG,CAACF,KAAK,qBAAuBC,KAAK,oDAAqDC,MAAO,GAAG,CAACF,KAAK,WAAaC,KAAK,kFAAmFC,MAAO,GAAG,CAACF,KAAK,WAAaC,KAAK,8EAA+EC,MAAO,GAAG,CAACF,KAAK,sBAAwBC,KAAK,kFAAmFC,MAAO,GAAG,CAACF,KAAK,YAAcC,KAAK,iFAAkFC,MAAO,IAE1tCC,KAAK,EACLC,GAAI,YACJC,EAAG,kCACH3mB,EAAG,YAEH4mB,IAAK,GAGLjG,GAAI,+CAOAiF,EAF4B,0EACXO,EAAQ,MAQzBP,EAF4B,oFACXO,EAAQ,MAQzBP,EAF4B,uEACXO,EAAQ,KAQzBP,EAF4B,sEACXO,EAAQ,KAQzBP,EAF4B,0EACXO,EAAQ,KAQzBP,EAF4B,iFACXO,EAAQ,MAQzBP,EAF4B,kFACXO,EAAQ,MAQzBP,EAF4B,kFACXO,EAAQ,MAQzBP,EAF4B,8EACXO,EAAQ,MAQzBP,EAF4B,0DACXO,EAAQ,OAQzBP,EAF4B,oDACXO,EAAQ,MAMjCze,OAAOmf,aAAenf,OAAOmf,cAAgB,GAC7Cnf,OAAOmf,aAAanB,QAAO1sB,EAAAA,EAAA,GACpB0O,OAAOmf,aAAanB,SAAW,IAC/BD,EAAQC,SAGXhe,OAAOmf,aAAalB,YAAW3sB,EAAAA,EAAA,GAC5B0O,OAAOmf,aAAalB,aAAe,IACnCF,EAAQE,aAEY,MAAMmB,EAAiB,GAC9BA,EAAe,+FAAiG,CACxHZ,EAAGA,IAAMC,EAAQ,MACjBY,GAAI,uDAEpBrf,OAAOmf,aAAenf,OAAOmf,cAAgB,GAC7Cnf,OAAOmf,aAAaC,eAAc9tB,EAAAA,EAAA,GACP0O,OAAOmf,aAAaC,gBAAkB,IACtCA,UCzJ3BE,EAAOC,QAAUhf,cCAjB+e,EAAOC,QAAUC","sources":["webpack://Dobbies.Commerce/./src/modules/dobbies-search-result-container/actions/base-collection-action.ts?6f2b","webpack://Dobbies.Commerce/./src/modules/dobbies-search-result-container/actions/get-full-products-by-collection.ts?1eea","webpack://Dobbies.Commerce/./src/modules/dobbies-search-result-container/actions/get-mapped-search-configuration.ts?cef7","webpack://Dobbies.Commerce/./src/modules/dobbies-search-result-container/actions/get-refiners-for-collection.ts?2fad","webpack://Dobbies.Commerce/./src/modules/dobbies-search-result-container/actions/get-product-refiner-hierarchy.ts?5ea0","webpack://Dobbies.Commerce/./src/modules/dobbies-search-result-container/actions/url-utils.ts?e355","webpack://Dobbies.Commerce/./src/modules/dobbies-search-result-container/dobbies-search-result-container.props.autogenerated.ts?30bd","webpack://Dobbies.Commerce/./src/modules/dobbies-search-result-container/dobbies-search-result-container.tsx?0279","webpack://Dobbies.Commerce/./src/modules/dobbies-search-result-container/dobbies-search-result-container.view.tsx?7af5","webpack://Dobbies.Commerce/./src/modules/dobbies-search-result-container/list-page-state.ts?94e6","webpack://Dobbies.Commerce/./src/themes/dobbies/actions/modules-state-share-action.ts?117d","webpack://Dobbies.Commerce/./src/themes/dobbies/views/custom-components/dobbies-modal.tsx?9a82","webpack://Dobbies.Commerce/./lib/dobbies-search-result-container/module-registration.js?3a5f","webpack://Dobbies.Commerce/external var \"React\"?0d3b","webpack://Dobbies.Commerce/external var \"ReactDOM\"?853b"],"sourcesContent":["/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { CacheType, getCatalogId, IActionInput, IAny, ICommerceApiSettings, ICreateActionContext, IGeneric } from '@msdyn365-commerce/core';\r\nimport { convertToString, IQueryResultSettings, ProductRefinerValue, SortColumn } from '@msdyn365-commerce/retail-proxy';\r\nimport { buildCacheKey, QueryResultSettingsProxy } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { toJS } from 'mobx';\r\n\r\nimport { hydrateRefinersFromUrl } from './url-utils';\r\n\r\n/**\r\n * Export listPageType.\r\n */\r\nexport type listPageType = 'Category' | 'Search' | 'Unknown';\r\n\r\n/**\r\n * Get include attributes from config.\r\n * @param inputData - ICreateActionContext.\r\n * @returns Boolean.\r\n */\r\nfunction getIncludeAttributes(inputData: ICreateActionContext, IGeneric>): boolean {\r\n if (inputData && inputData.config && inputData.config.includeAttributes !== undefined && inputData.config.includeAttributes === true) {\r\n return true;\r\n }\r\n return false;\r\n}\r\n\r\n/**\r\n * Get updateRefinerPanel from config.\r\n * @param inputData - ICreateActionContext.\r\n * @returns Boolean.\r\n */\r\nfunction getUpdateRefinerPanel(inputData: ICreateActionContext, IGeneric>): boolean {\r\n return !!inputData.config?.updateRefinerPanel;\r\n}\r\n\r\n/**\r\n * BaseCollection Action Input.\r\n */\r\nexport class BaseCollectionInput implements IActionInput {\r\n public pageType: listPageType;\r\n\r\n public category: number | undefined;\r\n\r\n public searchText: string | undefined;\r\n\r\n public refiners: ProductRefinerValue[];\r\n\r\n public queryResultSettings: IQueryResultSettings;\r\n\r\n public apiSettings: ICommerceApiSettings;\r\n\r\n public includeAttributes: boolean | undefined;\r\n\r\n public locale?: string;\r\n\r\n public isUpdateRefinerPanel?: boolean;\r\n\r\n public catalogId?: number;\r\n\r\n public constructor(\r\n pageType: listPageType,\r\n apiSettings: ICommerceApiSettings,\r\n queryResultSettings: IQueryResultSettings,\r\n refiners: ProductRefinerValue[],\r\n category: number | undefined,\r\n searchText: string | undefined,\r\n includeAttributes: boolean | undefined,\r\n isUpdateRefinerPanel?: boolean | undefined,\r\n locale?: string,\r\n catalogId?: number\r\n ) {\r\n this.pageType = pageType;\r\n this.apiSettings = apiSettings;\r\n this.category = category;\r\n this.searchText = searchText;\r\n this.queryResultSettings = queryResultSettings;\r\n this.refiners = refiners;\r\n this.includeAttributes = includeAttributes;\r\n this.isUpdateRefinerPanel = isUpdateRefinerPanel;\r\n this.locale = locale;\r\n this.catalogId = catalogId ?? 0;\r\n }\r\n\r\n public getCacheKey = () => {\r\n const queryResultSettings = {\r\n ...this.queryResultSettings.Paging,\r\n ...toJS(this.queryResultSettings.Sorting)\r\n };\r\n\r\n const cacheKey = buildCacheKey(\r\n // eslint-disable-next-line @typescript-eslint/restrict-template-expressions -- disabling this as inputs can be undefined depending on page type\r\n `${this.pageType}-${this.locale}-${this.category || this.searchText}-${this.catalogId}-${this.refiners.map(\r\n refiner => `${refiner.RefinerRecordId + (refiner.LeftValueBoundString || '') + (refiner.RightValueBoundString || '')}-`\r\n )}-${convertToString(queryResultSettings)}`,\r\n this.apiSettings,\r\n this.locale\r\n );\r\n return cacheKey;\r\n };\r\n\r\n public getCacheObjectType = () => 'CollectionActionResult';\r\n\r\n public dataCacheType = (): CacheType => 'request';\r\n}\r\n\r\n// TODO: Create a data model here or import one to capture the response of the action\r\nexport interface IGetFullProductsByCollectionData {\r\n text: string;\r\n}\r\n\r\nexport type CollectionClassConstructor = new (\r\n pageType: listPageType,\r\n apiSettings: ICommerceApiSettings,\r\n queryResultSettings: IQueryResultSettings,\r\n refiners: ProductRefinerValue[],\r\n category: number | undefined,\r\n searchText: string | undefined,\r\n includeAttributes: boolean | undefined,\r\n isUpdateRefinerPanel?: boolean | undefined,\r\n locale?: string,\r\n catalogId?: number\r\n) => BaseCollectionInput;\r\n\r\n/**\r\n * TODO: Use this function to create the input required to make the action call.\r\n * @param args\r\n * @param inputClassConstuctor\r\n */\r\nexport const createBaseCollectionInput = (\r\n args: ICreateActionContext,\r\n inputClassConstuctor: CollectionClassConstructor\r\n): BaseCollectionInput => {\r\n const pageType =\r\n args.requestContext.urlTokens.pageType === 'Category' || (args.requestContext.query && args.requestContext.query.categoryId)\r\n ? 'Category'\r\n : 'Search';\r\n\r\n const queryResultSettings = QueryResultSettingsProxy.fromInputData(args).QueryResultSettings;\r\n const queryRefiners = hydrateRefinersFromUrl(args.requestContext);\r\n const includeAttributes = getIncludeAttributes(args);\r\n const isUpdateRefinerPanel = getUpdateRefinerPanel(args);\r\n const catalogId = getCatalogId(args.requestContext);\r\n\r\n if (args.requestContext.query && args.requestContext.query.sorting) {\r\n queryResultSettings.Sorting = { Columns: JSON.parse(decodeURIComponent(args.requestContext.query.sorting)) };\r\n }\r\n\r\n if (pageType === 'Category') {\r\n return new inputClassConstuctor(\r\n pageType,\r\n args.requestContext.apiSettings,\r\n queryResultSettings,\r\n queryRefiners,\r\n +(args.requestContext.urlTokens.itemId || (args.requestContext.query && args.requestContext.query.categoryId) || 0),\r\n undefined,\r\n includeAttributes,\r\n isUpdateRefinerPanel,\r\n args.requestContext.locale,\r\n catalogId\r\n );\r\n } else if (pageType === 'Search' && args.requestContext.query && args.requestContext.query.q) {\r\n return new inputClassConstuctor(\r\n pageType,\r\n args.requestContext.apiSettings,\r\n queryResultSettings,\r\n queryRefiners,\r\n undefined,\r\n args.requestContext.query.q,\r\n includeAttributes,\r\n isUpdateRefinerPanel,\r\n args.requestContext.locale,\r\n catalogId\r\n );\r\n } else if (\r\n pageType === 'Search' &&\r\n args.requestContext.query &&\r\n args.requestContext.query.productId &&\r\n args.requestContext.query.recommendation\r\n ) {\r\n return new inputClassConstuctor(\r\n pageType,\r\n args.requestContext.apiSettings,\r\n queryResultSettings,\r\n queryRefiners,\r\n undefined,\r\n JSON.stringify({ ProductId: args.requestContext.query.productId, Recommendation: args.requestContext.query.recommendation }),\r\n includeAttributes,\r\n isUpdateRefinerPanel,\r\n args.requestContext.locale,\r\n catalogId\r\n );\r\n }\r\n\r\n throw new Error('[getFullProductsForCollection]Unable to create input');\r\n};\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport MsDyn365, {\r\n CacheType,\r\n createObservableDataAction,\r\n IAction,\r\n IActionContext,\r\n IActionInput,\r\n ICreateActionContext,\r\n sendRequest\r\n} from '@msdyn365-commerce/core';\r\nimport { AsyncResult, ChannelInventoryConfiguration, ProductSearchCriteria, ProductSearchResult } from '@msdyn365-commerce/retail-proxy';\r\nimport { searchByCriteriaAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport { getInventoryConfigurationAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\r\nimport { ArrayExtensions, generateProductImageUrl, InventoryLevels, ObjectExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport { RatingsSummary } from '@msdyn365-commerce/commerce-entities';\r\nimport { ListPageStateInput } from '../list-page-state';\r\nimport { BaseCollectionInput, createBaseCollectionInput } from './base-collection-action';\r\n\r\n/**\r\n * GetFullProductsByCollection Action Input.\r\n */\r\nexport class GetFullProductsByCollectionInput extends BaseCollectionInput implements IActionInput {\r\n /**\r\n * The cache object type.\r\n * @returns The cache object type.\r\n */\r\n public getCacheObjectType = (): string => 'FullProductSearchResult';\r\n\r\n /**\r\n * The data cache type.\r\n * @returns The data cache type.\r\n */\r\n public dataCacheType = (): CacheType => {\r\n if (\r\n this.pageType !== 'Category' ||\r\n (this.refiners && this.refiners.length > 0) ||\r\n (this.queryResultSettings &&\r\n this.queryResultSettings.Sorting &&\r\n this.queryResultSettings.Sorting.Columns &&\r\n this.queryResultSettings.Sorting.Columns.length > 0)\r\n ) {\r\n return 'none';\r\n }\r\n // Needed to be done because when URL with uc_param is hit, it just returns old Cached result, so we need to\r\n // invalidate cache every time.\r\n return 'none';\r\n };\r\n}\r\n\r\n/**\r\n * This setting defines inventory filtering options.\r\n */\r\nexport enum ProductListInventoryFilteringOptions {\r\n /**\r\n * Filter out all products out of stock.\r\n */\r\n HideOOS = 'hideOOS',\r\n\r\n /**\r\n * Sort products by availability, OOS goes last.\r\n */\r\n SortOOS = 'sortOOS',\r\n\r\n /**\r\n * No filtering selected.\r\n */\r\n Default = 'default'\r\n}\r\n\r\n/**\r\n * The full product search result with count interface.\r\n */\r\nexport interface IFullProductsSearchResultsWithCount {\r\n products: ProductSearchResult[];\r\n count: number;\r\n channelInventoryConfigurationId?: number;\r\n}\r\n\r\n/**\r\n * CreateInput function which creates and actionInput used to fetch products for a list page.\r\n * @param args - The API arguments.\r\n * @returns IActionInput - The action input.\r\n */\r\nconst createInput = (args: ICreateActionContext<{ itemsPerPage: number; includedAttributes: boolean | undefined }>): IActionInput => {\r\n const input = createBaseCollectionInput(args, GetFullProductsByCollectionInput);\r\n\r\n // Set Top\r\n if (input.queryResultSettings.Paging && args.config) {\r\n input.queryResultSettings.Paging.Top = args.config.itemsPerPage || 1;\r\n }\r\n\r\n // Set Skip\r\n if (input.queryResultSettings.Paging && args.requestContext.query && args.requestContext.query.skip) {\r\n input.queryResultSettings.Paging.Skip = +args.requestContext.query.skip;\r\n }\r\n\r\n input.queryResultSettings.count = true;\r\n\r\n return input;\r\n};\r\n\r\n/**\r\n * Finds whether a product is out of stock based on the attribute.\r\n * @param product - The product.\r\n * @param channelInventoryConfiguration - The channel configuration.\r\n * @returns True if is OOS, false otherwise.\r\n */\r\nfunction isOutOfStock(product: ProductSearchResult, channelInventoryConfiguration: ChannelInventoryConfiguration): boolean {\r\n if (!ArrayExtensions.hasElements(product.AttributeValues)) {\r\n // If no attributes then assume is in stock\r\n return false;\r\n }\r\n for (const attribute of product.AttributeValues) {\r\n if (\r\n attribute.RecordId === channelInventoryConfiguration.InventoryProductAttributeRecordId &&\r\n attribute.TextValue === channelInventoryConfiguration.InventoryOutOfStockAttributeValueText\r\n ) {\r\n // The matching recordId indicates that is the inventory attribute\r\n // if the text value are the same then is out of stock.\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Returns only in stock products.\r\n * @param products - The product.\r\n * @param channelInventoryConfiguration - The channel configuration.\r\n * @returns Filtered product search result.\r\n */\r\nfunction filterOutOfStockProducts(\r\n products: ProductSearchResult[],\r\n channelInventoryConfiguration: ChannelInventoryConfiguration\r\n): ProductSearchResult[] {\r\n if (!ArrayExtensions.hasElements(products)) {\r\n return [];\r\n }\r\n const filteredProducts: ProductSearchResult[] = [];\r\n\r\n for (const product of products) {\r\n if (!isOutOfStock(product, channelInventoryConfiguration)) {\r\n filteredProducts.push(product);\r\n }\r\n }\r\n return filteredProducts;\r\n}\r\n\r\n/**\r\n * Returns sorted products based on availability.\r\n * @param products - The product.\r\n * @param channelInventoryConfiguration - The channel configuration.\r\n * @returns Sorted product search result.\r\n */\r\nfunction sortsProductsBasedOnAvailability(\r\n products: ProductSearchResult[],\r\n channelInventoryConfiguration: ChannelInventoryConfiguration\r\n): ProductSearchResult[] {\r\n if (!ArrayExtensions.hasElements(products)) {\r\n return [];\r\n }\r\n const inStockProducts: ProductSearchResult[] = [];\r\n const outOfStockProducts: ProductSearchResult[] = [];\r\n\r\n for (const product of products) {\r\n if (isOutOfStock(product, channelInventoryConfiguration)) {\r\n outOfStockProducts.push(product);\r\n } else {\r\n inStockProducts.push(product);\r\n }\r\n }\r\n return inStockProducts.concat(outOfStockProducts);\r\n}\r\n\r\n/**\r\n * Returns list of products based on inventory information.\r\n * @param products - The products.\r\n * @param channelInventoryConfiguration - The channel configuration.\r\n * @param context - The context.\r\n * @returns List of product based on the inventory information.\r\n */\r\nexport function returnProductsBasedOnInventoryInformation(\r\n products: ProductSearchResult[],\r\n channelInventoryConfiguration: ChannelInventoryConfiguration,\r\n context: IActionContext\r\n): ProductSearchResult[] {\r\n if (!ArrayExtensions.hasElements(products) || ObjectExtensions.isNullOrUndefined(channelInventoryConfiguration)) {\r\n return [];\r\n }\r\n switch (context.requestContext.app.config.productListInventoryDisplay) {\r\n case ProductListInventoryFilteringOptions.HideOOS:\r\n return filterOutOfStockProducts(products, channelInventoryConfiguration);\r\n case ProductListInventoryFilteringOptions.SortOOS:\r\n return sortsProductsBasedOnAvailability(products, channelInventoryConfiguration);\r\n default:\r\n return products;\r\n }\r\n}\r\n\r\nconst updateRatings = (ratingsData: RatingsSummary, minNumOfStars: number): RatingsSummary => {\r\n const starCounts = [\r\n ratingsData.star1Count,\r\n ratingsData.star2Count,\r\n ratingsData.star3Count,\r\n ratingsData.star4Count,\r\n ratingsData.star5Count\r\n ];\r\n if (minNumOfStars - 1 > 0) {\r\n if (ratingsData.totalRatingsCount) {\r\n for (let y = 0; y < minNumOfStars - 1; y++) {\r\n if (starCounts && starCounts[y]) {\r\n const countToSubstract = starCounts[y] || 0;\r\n ratingsData.totalRatingsCount = ratingsData.totalRatingsCount - countToSubstract;\r\n if (ratingsData.reviewsCount) {\r\n ratingsData.reviewsCount = ratingsData.reviewsCount - countToSubstract;\r\n }\r\n starCounts[y] = 0;\r\n }\r\n }\r\n let totalScore = 0;\r\n for (let z = 0; z < starCounts.length; z++) {\r\n const currIndexScore = starCounts[z] || 0;\r\n totalScore = totalScore + (z + 1) * currIndexScore;\r\n }\r\n\r\n ratingsData.averageRating = totalScore / ratingsData.totalRatingsCount;\r\n }\r\n }\r\n return ratingsData;\r\n};\r\n\r\nconst getProductsWithRatingsUpdated = async (products: ProductSearchResult[], context: IActionContext): Promise => {\r\n const productIds = products.map(p => p.RecordId);\r\n const requests = productIds.map(pid => {\r\n const requestUrl =\r\n `${context.requestContext.apiSettings.ratingsReviewsEndpoint}/v2.0/ratings/product/${pid}/summary?` +\r\n `tenantId=${context.requestContext.apiSettings.rnr.id}`;\r\n return sendRequest(requestUrl, 'get');\r\n });\r\n const allRatingsResponse = await Promise.all(requests);\r\n for (const rr of allRatingsResponse) {\r\n if (rr.data) {\r\n let ratingsData = rr.data;\r\n const minNumOfStars = context.requestContext.app.config.numberOfStarReviewsToShow;\r\n ratingsData = updateRatings(ratingsData, minNumOfStars);\r\n for (const p of products) {\r\n if (ratingsData.productId && p.RecordId === parseInt(ratingsData.productId, 10)) {\r\n p.AverageRating = ratingsData.averageRating;\r\n p.TotalRatings = ratingsData.totalRatingsCount;\r\n }\r\n }\r\n }\r\n }\r\n\r\n return products;\r\n};\r\n\r\n/**\r\n * Returns list of products based on inventory information.\r\n * @param productSearchResults - The products.\r\n * @param context - The context.\r\n * @param metadataCount - The metadata count.\r\n * @returns List of product based on the inventory information.\r\n */\r\nexport async function returnProducts(\r\n productSearchResults: ProductSearchResult[],\r\n context: IActionContext,\r\n metadataCount: number | undefined\r\n): Promise {\r\n const defaultProductCount: number = 0;\r\n\r\n const productSearchResultsWithImages = productSearchResults.map(productSearchResult => {\r\n const newImageUrl = generateProductImageUrl(productSearchResult, context.requestContext.apiSettings);\r\n\r\n if (newImageUrl) {\r\n productSearchResult.PrimaryImageUrl = newImageUrl;\r\n }\r\n\r\n return productSearchResult;\r\n });\r\n\r\n // If inventory level is threshold or inventory check is disabled then return the list of products without the inventory configuration\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- read config file.\r\n if (\r\n context.requestContext.app.config.inventoryLevel === InventoryLevels.threshold ||\r\n context.requestContext.app.config.enableStockCheck === false\r\n ) {\r\n return {\r\n products: productSearchResultsWithImages,\r\n count: metadataCount ?? defaultProductCount\r\n };\r\n }\r\n const channelInventoryConfiguration = await getInventoryConfigurationAsync({ callerContext: context });\r\n\r\n const mappedProducts = productSearchResultsWithImages.map(productSearchResult => {\r\n if (ArrayExtensions.hasElements(productSearchResult.AttributeValues)) {\r\n for (const element of productSearchResult.AttributeValues) {\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- need check.\r\n if (\r\n channelInventoryConfiguration &&\r\n element.RecordId !== undefined &&\r\n element.RecordId === channelInventoryConfiguration.InventoryProductAttributeRecordId &&\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- read config file.\r\n context.requestContext.app.config.inventoryRanges !== 'all' &&\r\n element.TextValue !== channelInventoryConfiguration.InventoryOutOfStockAttributeValueText\r\n ) {\r\n // If same RecordId then it means that is the Inventory attribute\r\n // Based on the inventory range (and filtering options), the inventory label will be displayed\r\n // If Inventory range is 'All' then in stock and out of stock labels are shown, else only OOS\r\n // if the text value is different that the channelInventoryConfiguration.InventoryOutOfStockAttributeValueText then is in stock\r\n element.TextValue = '';\r\n }\r\n }\r\n }\r\n\r\n return productSearchResult;\r\n });\r\n let productsBasedOnInventory = returnProductsBasedOnInventoryInformation(mappedProducts, channelInventoryConfiguration, context);\r\n try {\r\n productsBasedOnInventory = await getProductsWithRatingsUpdated(productsBasedOnInventory, context);\r\n } catch (e) {\r\n console.log('Error fetching ratings');\r\n }\r\n return {\r\n products: productsBasedOnInventory,\r\n count: metadataCount ?? defaultProductCount,\r\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- check config.\r\n channelInventoryConfigurationId: channelInventoryConfiguration\r\n ? channelInventoryConfiguration.InventoryProductAttributeRecordId\r\n : undefined\r\n };\r\n}\r\n\r\n/**\r\n * Action function to fetch products for a list page.\r\n * @param input - The input.\r\n * @param context - The context.\r\n * @returns IFullProductsSearchResultsWithCount - The full product search result with count.\r\n */\r\nasync function action(input: GetFullProductsByCollectionInput, context: IActionContext): Promise {\r\n let promise: AsyncResult;\r\n let searchProductId;\r\n const searchCriteriaInput: ProductSearchCriteria = {};\r\n searchCriteriaInput.Context = {\r\n ChannelId: context.requestContext.apiSettings.channelId,\r\n CatalogId: context.requestContext.apiSettings.catalogId\r\n };\r\n searchCriteriaInput.Refinement = input.refiners;\r\n searchCriteriaInput.IncludeAttributes = input.includeAttributes;\r\n searchCriteriaInput.SkipVariantExpansion = true;\r\n const defaultNumber: number = 0;\r\n\r\n // VSI CUSTOMIZATION - START - pass uc_param to searchByCriteria if exist in url\r\n let uc_param = context.requestContext.query && context.requestContext.query.uc_param ? context.requestContext.query.uc_param : '';\r\n uc_param = uc_param.replace(/\\s/g, '%20');\r\n // VSI CUSTOMIZATION - END -\r\n if (input.pageType === 'Category' || (context.requestContext.query && context.requestContext.query.categoryId)) {\r\n if (input.category) {\r\n searchCriteriaInput.CategoryIds = [input.category || defaultNumber];\r\n if (uc_param) {\r\n searchCriteriaInput.SearchCondition = `&uc_param=${uc_param}`;\r\n }\r\n promise = searchByCriteriaAsync(\r\n {\r\n callerContext: context,\r\n queryResultSettings: input.queryResultSettings\r\n },\r\n searchCriteriaInput\r\n );\r\n } else {\r\n throw new Error('[GetFullProductsForCollection]Category Page Detected, but no global categoryId found');\r\n }\r\n } else if (input.searchText && context.requestContext.query && context.requestContext.query.q) {\r\n searchCriteriaInput.SearchCondition = input.searchText;\r\n searchCriteriaInput.SearchCondition = uc_param ? `${input.searchText}&uc_param=${uc_param}` : input.searchText;\r\n promise = searchByCriteriaAsync(\r\n {\r\n callerContext: context,\r\n queryResultSettings: input.queryResultSettings\r\n },\r\n searchCriteriaInput\r\n );\r\n } else if (\r\n input.searchText &&\r\n context.requestContext.query &&\r\n context.requestContext.query.productId &&\r\n context.requestContext.query.recommendation\r\n ) {\r\n const searchObject = JSON.parse(input.searchText);\r\n searchProductId = Number(searchObject.ProductId);\r\n if (Number.isNaN(searchProductId)) {\r\n throw new Error('Failed to cast search product id into a number.');\r\n } else if (!searchObject.Recommendation) {\r\n throw new Error('Failed to retrieve the Recommendation.');\r\n } else {\r\n searchCriteriaInput.RecommendationListId = searchObject.Recommendation;\r\n searchCriteriaInput.Ids = [searchProductId || defaultNumber];\r\n if (uc_param) {\r\n searchCriteriaInput.SearchCondition = `&uc_param=${uc_param}`;\r\n }\r\n promise = searchByCriteriaAsync(\r\n {\r\n callerContext: context,\r\n queryResultSettings: input.queryResultSettings\r\n },\r\n searchCriteriaInput\r\n );\r\n }\r\n } else {\r\n throw new Error('[GetFullProductsForCollection]Search Page Detected, but no q= or productId= query parameter found');\r\n }\r\n\r\n const productSearchResults = await promise;\r\n\r\n // Update ListPageState For SSR\r\n if (!MsDyn365.isBrowser) {\r\n context.update(new ListPageStateInput(), {\r\n totalProductCount: promise.metadata.count ?? defaultNumber,\r\n activeFilters: input.refiners\r\n });\r\n }\r\n\r\n return returnProducts(productSearchResults, context, promise.metadata.count);\r\n}\r\n\r\nexport const actionDataAction = createObservableDataAction({\r\n id: '@msdyn365-commerce-modules/search-result-container/get-full-products-by-collection',\r\n action: >action,\r\n input: createInput\r\n});\r\n\r\nexport default actionDataAction;\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport {\r\n CacheType,\r\n createObservableDataAction,\r\n IAction,\r\n IActionContext,\r\n IActionInput,\r\n IAny,\r\n ICommerceApiSettings,\r\n ICreateActionContext,\r\n IGeneric\r\n} from '@msdyn365-commerce/core';\r\nimport { SortColumn } from '@msdyn365-commerce/retail-proxy';\r\nimport { getSearchConfigurationAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/StoreOperationsDataActions.g';\r\nimport { buildCacheKey } from '@msdyn365-commerce-modules/retail-actions';\r\n\r\n// TODO: import from commerce entities when available\r\n// eslint-disable-next-line @typescript-eslint/naming-convention -- Name change will require many modifications\r\ninterface SearchConfiguration {\r\n ProductSortColumns?: SortColumn[];\r\n}\r\n\r\n// eslint-disable-next-line @typescript-eslint/naming-convention -- Name change will require many modifications\r\nexport interface MappedSearchConfiguration {\r\n key: string;\r\n sortColumn: SortColumn;\r\n}\r\n\r\nexport const sortOptions = {\r\n sortByOptionRelevanceDesc: 'Ranking-Desc',\r\n sortByOptionRatingAsc: 'AverageRating-Asc',\r\n sortByOptionRatingDesc: 'AverageRating-Desc',\r\n sortByOptionNameAsc: 'Name-Asc',\r\n sortByOptionNameDesc: 'Name-Desc',\r\n sortByOptionPriceAsc: 'Price-Asc',\r\n sortByOptionPriceDesc: 'Price-Desc',\r\n sortByOptionBestSelling: 'BestSelling',\r\n sortByOptionNewScore: 'NewScore',\r\n sortByOptionTrendingScore: 'TrendingScore'\r\n};\r\n\r\n/**\r\n * ActionInput class for the get-mapped-search-configuration Data Action.\r\n */\r\nexport class MappedSearchInput implements IActionInput {\r\n private readonly apiSettings: ICommerceApiSettings;\r\n\r\n constructor(apiSettings: ICommerceApiSettings) {\r\n this.apiSettings = apiSettings;\r\n }\r\n\r\n public getCacheKey = () => buildCacheKey('MappedSearchInput', this.apiSettings);\r\n\r\n public getCacheObjectType = () => 'MappedSearchInput';\r\n\r\n public dataCacheType = (): CacheType => 'request';\r\n}\r\n\r\n/**\r\n * Get a mapped search configuration that is easy to use for sorting.\r\n * @param input\r\n * @param ctx\r\n */\r\nexport async function getMappedSearchConfiguration(input: MappedSearchInput, ctx: IActionContext): Promise {\r\n return getSearchConfigurationAsync({ callerContext: ctx }).then((searchConfiguration: SearchConfiguration) => {\r\n return (searchConfiguration.ProductSortColumns || [])\r\n .map((sortColumn: SortColumn) => {\r\n let key = '';\r\n if (sortColumn.ColumnName) {\r\n switch (sortColumn.ColumnName.toUpperCase()) {\r\n case 'NAME':\r\n key = sortColumn.IsDescending ? sortOptions.sortByOptionNameDesc : sortOptions.sortByOptionNameAsc;\r\n break;\r\n case 'PRICE':\r\n key = sortColumn.IsDescending ? sortOptions.sortByOptionPriceDesc : sortOptions.sortByOptionPriceAsc;\r\n break;\r\n case 'AVERAGERATING':\r\n key = sortColumn.IsDescending ? sortOptions.sortByOptionRatingDesc : sortOptions.sortByOptionRatingAsc;\r\n break;\r\n case 'RANKING':\r\n key = sortOptions.sortByOptionRelevanceDesc;\r\n break;\r\n case 'BESTSELLINGSCORE':\r\n key = sortOptions.sortByOptionBestSelling;\r\n break;\r\n case 'NEWSCORE':\r\n key = sortOptions.sortByOptionNewScore;\r\n break;\r\n case 'TRENDINGSCORE':\r\n key = sortOptions.sortByOptionTrendingScore;\r\n break;\r\n default:\r\n }\r\n } else {\r\n ctx.telemetry.warning('[get-mapped-search-configuration] unknown search option');\r\n }\r\n if (key) {\r\n return {\r\n key,\r\n sortColumn\r\n };\r\n }\r\n return undefined;\r\n })\r\n .filter(Boolean);\r\n });\r\n}\r\n\r\nexport const createInput = (inputData: ICreateActionContext>): IActionInput => {\r\n return new MappedSearchInput(inputData.requestContext.apiSettings);\r\n};\r\n\r\nexport const getMappedSearchConfigurationDataAction = createObservableDataAction({\r\n id: '@msdyn365-commerce-modules/search-result-container/get-mapped-search-configuration',\r\n action: >getMappedSearchConfiguration,\r\n input: createInput\r\n});\r\n\r\nexport default getMappedSearchConfigurationDataAction;\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { createObservableDataAction, IAction, IActionContext, IActionInput, ICreateActionContext } from '@msdyn365-commerce/core';\r\n\r\nimport { BaseCollectionInput, createBaseCollectionInput } from './base-collection-action';\r\nimport { getProductRefinerHierarchy } from './get-product-refiner-hierarchy';\r\n\r\n/**\r\n * Default Category/Product Id Values.\r\n */\r\nenum DefaultValues {\r\n defaultCategoryIdValue = 0,\r\n defaultProductIdValue = 0\r\n}\r\n\r\n/**\r\n * Refiners-by-Collection Input action.\r\n */\r\nexport class RefinersByCollectionInput extends BaseCollectionInput implements IActionInput {\r\n public getCacheObjectType = () => 'ProductRefiner';\r\n\r\n public dataCacheType = () => {\r\n if (\r\n this.pageType !== 'Category' ||\r\n (this.refiners && this.refiners.length > 0) ||\r\n (this.queryResultSettings &&\r\n this.queryResultSettings.Sorting &&\r\n this.queryResultSettings.Sorting.Columns &&\r\n this.queryResultSettings.Sorting.Columns.length > 0)\r\n ) {\r\n return 'request';\r\n }\r\n return 'application';\r\n };\r\n}\r\n\r\n/**\r\n * Create input method which creates an ActionInput for fetching list page refiners.\r\n * @param args\r\n */\r\nconst createInput = (args: ICreateActionContext): IActionInput => {\r\n return createBaseCollectionInput(args, RefinersByCollectionInput);\r\n};\r\n\r\n/**\r\n * Action method which fetches refiners for the given list page.\r\n * @param input\r\n * @param ctx\r\n */\r\nasync function action(input: RefinersByCollectionInput, ctx: IActionContext): Promise {\r\n let searchProductId;\r\n if (input.pageType === 'Category') {\r\n if (input.category) {\r\n return getProductRefinerHierarchy(\r\n {\r\n CategoryIds: [input.category || DefaultValues.defaultCategoryIdValue],\r\n Context: {\r\n ChannelId: input.apiSettings.channelId,\r\n CatalogId: input.catalogId\r\n },\r\n Refinement: input.isUpdateRefinerPanel ? input.refiners : []\r\n },\r\n input.queryResultSettings,\r\n ctx\r\n );\r\n }\r\n throw new Error('[GetRefinersForCollection]Category Page Detected, but no global categoryId found');\r\n } else {\r\n if (input.searchText && ctx.requestContext.query && ctx.requestContext.query.q) {\r\n return getProductRefinerHierarchy(\r\n {\r\n SearchCondition: input.searchText,\r\n Context: {\r\n ChannelId: input.apiSettings.channelId,\r\n CatalogId: input.catalogId\r\n },\r\n Refinement: input.isUpdateRefinerPanel ? input.refiners : []\r\n },\r\n input.queryResultSettings,\r\n ctx\r\n );\r\n }\r\n if (input.searchText && ctx.requestContext.query && ctx.requestContext.query.productId) {\r\n const searchObject = JSON.parse(input.searchText);\r\n searchProductId = Number(searchObject.ProductId);\r\n if (Number.isNaN(searchProductId)) {\r\n throw new Error('Failed to cast search product id into a number.');\r\n } else if (!searchObject.Recommendation) {\r\n throw new Error('Failed to retrieve the Recommendation.');\r\n } else {\r\n return getProductRefinerHierarchy(\r\n {\r\n Context: {\r\n ChannelId: input.apiSettings.channelId,\r\n CatalogId: input.catalogId\r\n },\r\n Refinement: input.isUpdateRefinerPanel ? input.refiners : [],\r\n RecommendationListId: searchObject.Recommendation,\r\n Ids: [searchProductId || DefaultValues.defaultProductIdValue]\r\n },\r\n input.queryResultSettings,\r\n ctx\r\n );\r\n }\r\n } else {\r\n throw new Error('[GetFullProductsForCollection]Search Page Detected, but no q= or productId= query parameter found');\r\n }\r\n }\r\n}\r\n\r\nexport const actionDataAction = createObservableDataAction({\r\n id: '@msdyn365-commerce-modules/search-result-container/get-refiners-for-collection',\r\n action: >action,\r\n input: createInput\r\n});\r\n\r\nexport default actionDataAction;\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport { IActionContext } from '@msdyn365-commerce/core';\r\nimport { IQueryResultSettings, ProductRefiner, ProductSearchCriteria } from '@msdyn365-commerce/retail-proxy';\r\nimport { getProductSearchRefinersAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\n\r\n/**\r\n * Uses Bulk refiner API to get refiners and child refiner values.\r\n * @param searchCriteria Product search criteria.\r\n * @param maxItems Max items.\r\n * @param queryResultSettings\r\n * @param ctx Action context.\r\n */\r\nexport async function getProductRefinerHierarchy(\r\n searchCriteria: ProductSearchCriteria,\r\n queryResultSettings: IQueryResultSettings,\r\n ctx: IActionContext\r\n): Promise {\r\n return getProductSearchRefinersAsync({ callerContext: ctx, queryResultSettings }, searchCriteria).then(\r\n (productRefiners: ProductRefiner[]) => {\r\n if (!productRefiners) {\r\n ctx.trace('[getRefinersByCriteriaAction] returned no refiners');\r\n return [];\r\n }\r\n\r\n const result = (productRefiners || []).map((productRefiner: ProductRefiner) => productRefiner);\r\n\r\n if (result.length === 0) {\r\n ctx.trace('[getRefinersByCriteriaAction] returned no IProductRefinerHierarchy objects');\r\n return [];\r\n }\r\n\r\n return result;\r\n }\r\n );\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\n/* eslint-disable security/detect-object-injection */\r\nimport MsDyn365, { IRequestContext } from '@msdyn365-commerce/core';\r\nimport { ProductRefinerValue, SortColumn } from '@msdyn365-commerce/retail-proxy';\r\n\r\n/**\r\n * Refiner Compression:\r\n * Refiners contains a non-trivial amount of data that is required to successfully make\r\n * a refiner-based API call. To allow for deep-linking of refiners in the URL, refiner data\r\n * must be compressed so that URL max length is not exceeded. Refiners will be compressed into\r\n * the following array style index-based format:\r\n * [DataTypeValue, LeftValueBoundString, RefinerRecordId, RefinerSourceValue, RightValueBoundString, UnitText].\r\n */\r\nconst compressedRefinerKeys = [\r\n 'DataTypeValue',\r\n 'LeftValueBoundString',\r\n 'RefinerRecordId',\r\n 'RefinerSourceValue',\r\n 'RightValueBoundString',\r\n 'UnitText'\r\n];\r\n\r\n/**\r\n * Hydrates compressed refiner data from URL.\r\n * @param fullUrl The full URL of the page.\r\n * @param requestContext\r\n */\r\nexport const hydrateRefinersFromUrl = (requestContext: IRequestContext): ProductRefinerValue[] => {\r\n const compressedRefinerArray = parseQueryParam<(string | number)[][]>('refiners', requestContext);\r\n if (!compressedRefinerArray || compressedRefinerArray.length === 0) {\r\n return [];\r\n }\r\n\r\n return compressedRefinerArray\r\n .map(compressedRefiner => {\r\n try {\r\n const parsedRefiner: ProductRefinerValue = {};\r\n compressedRefinerKeys.forEach((refinerKey, index) => {\r\n parsedRefiner[refinerKey] = compressedRefiner[index];\r\n });\r\n return parsedRefiner;\r\n } catch {\r\n return undefined;\r\n }\r\n })\r\n .filter(Boolean);\r\n};\r\n\r\n/**\r\n * Compressed a list of refiners for use in URLs.\r\n * @param refiners The uncompressed refiners.\r\n */\r\nexport const compressRefiners = (refiners: ProductRefinerValue[]) => {\r\n const compressedRefiners: (string | number)[][] = [];\r\n\r\n refiners.forEach(refiner => {\r\n const compressedRefiner: (string | number)[] = [];\r\n compressedRefinerKeys.forEach(refinerKey => {\r\n compressedRefiner.push(refiner[refinerKey]);\r\n });\r\n compressedRefiners.push(compressedRefiner);\r\n });\r\n\r\n return compressedRefiners;\r\n};\r\n\r\n/**\r\n * Method which creates a URL contiaining serialized active refiners.\r\n * @param fullUrl The Current URL of the page.\r\n * @param refiners The refiners which should be added to the URL.\r\n * @param sortingColumns\r\n * @param skipCount\r\n */\r\nexport const buildListPageUrl = (fullUrl: URL, refiners?: ProductRefinerValue[], sortingColumns?: SortColumn[], skipCount?: number) => {\r\n // Refiner Change flow\r\n if (refiners !== undefined) {\r\n if (refiners.length === 0) {\r\n fullUrl.searchParams.delete('refiners');\r\n } else {\r\n const sortedRefiners = refiners.sort((first, second) =>\r\n first.RefinerRecordId && second.RefinerRecordId && first.RefinerRecordId > second.RefinerRecordId ? 1 : -1\r\n );\r\n fullUrl.searchParams.set('refiners', JSON.stringify(compressRefiners(sortedRefiners)));\r\n }\r\n\r\n // Adding or removing a refiner means we want to always load page 1\r\n fullUrl.searchParams.delete('skip');\r\n return fullUrl.href;\r\n }\r\n\r\n if (sortingColumns !== undefined) {\r\n if (sortingColumns.length === 0) {\r\n fullUrl.searchParams.delete('sorting');\r\n } else {\r\n fullUrl.searchParams.set('sorting', JSON.stringify(sortingColumns));\r\n }\r\n\r\n // Changing the sort means always load page 1\r\n fullUrl.searchParams.delete('skip');\r\n return fullUrl.href;\r\n }\r\n\r\n if (skipCount) {\r\n fullUrl.searchParams.set('skip', skipCount.toString());\r\n }\r\n\r\n return fullUrl.href;\r\n};\r\n\r\n/**\r\n * Parses a query param from the query object of the request context.\r\n * @param key The query parameter key.\r\n * @param requestContext The request context.\r\n */\r\nexport const parseQueryParam = (key: string, requestContext: IRequestContext): T | null => {\r\n if (requestContext.query && requestContext.query[key]) {\r\n return JSON.parse(decodeURIComponent(requestContext.query[key]));\r\n }\r\n return null;\r\n};\r\n\r\n/**\r\n * Gets the current URL of the page from the request context.\r\n * @param requestContext The request context.\r\n */\r\nexport const getCurrentUrl = (requestContext: IRequestContext): URL => {\r\n if (MsDyn365.isBrowser && window) {\r\n return new URL(window.location.href);\r\n }\r\n\r\n // NOTE: Typing on requestURL is incorrect\r\n if (requestContext.url.requestUrl.href) {\r\n return new URL(requestContext.url.requestUrl.href);\r\n }\r\n return new URL((requestContext.url.requestUrl));\r\n};\r\n","/**\r\n * Copyright (c) Microsoft Corporation\r\n * All rights reserved. See License.txt in the project root for license information.\r\n * IDobbiesSearchResultContainer containerModule Interface Properties\r\n * THIS FILE IS AUTO-GENERATED - MANUAL MODIFICATIONS WILL BE LOST\r\n */\r\n\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport * as React from 'react';\r\n\r\nexport const enum expandRefinersCount {\r\n all = 'all',\r\n one = 'one',\r\n two = 'two',\r\n three = 'three',\r\n four = 'four'\r\n}\r\n\r\nexport interface IDobbiesSearchResultContainerConfig extends Msdyn365.IModuleConfig {\r\n itemsPerPage?: number;\r\n allowBackNavigation?: boolean;\r\n imageSettings?: Msdyn365.IImageSettings;\r\n expandRefinersCount?: expandRefinersCount;\r\n disableHierarchy?: boolean;\r\n includeAttributes?: boolean;\r\n enableAffiliationBasedPricing?: boolean;\r\n updateRefinerPanel?: boolean;\r\n className?: string;\r\n clientRender?: boolean;\r\n startingRefinerList?: string[];\r\n enableOutOfStockButton?: boolean;\r\n clubPlusBadgeLink?: string;\r\n tilesForPLP?: ITilesForPLPData[];\r\n showTilesOnPLP?: boolean;\r\n repeatSameTile?: boolean;\r\n tileToAppearAfterProducts?: number;\r\n maxNumberOfTiles?: number;\r\n}\r\n\r\nexport interface IDobbiesSearchResultContainerResources {\r\n noResultsForRefinersText: string;\r\n resultCategoryNotFoundText: string;\r\n resultSearchNotFoundText: string;\r\n paginationAriaLabel: string;\r\n priceFree: string;\r\n priceRangeSeparator: string;\r\n originalPriceText: string;\r\n currentPriceText: string;\r\n ratingAriaLabel: string;\r\n flipperNext: string;\r\n flipperPrevious: string;\r\n searchTextPrefix: string;\r\n numberOfProducts: string;\r\n oneProduct: string;\r\n categoryLinkAriaLabel: string;\r\n sortByDropdownLabel: string;\r\n sortByOptionNameAsc: string;\r\n sortByOptionNameDesc: string;\r\n sortByOptionPriceAsc: string;\r\n sortByOptionPriceDesc: string;\r\n sortByOptionRatingDesc: string;\r\n sortByOptionBestSelling: string;\r\n sortByOptionNewScore: string;\r\n sortByOptionTrendingScore: string;\r\n sortByOptionRelevanceDesc: string;\r\n placeholderTextMax: string;\r\n minLabel: string;\r\n maxLabel: string;\r\n rangeNameFormat: string;\r\n validationErrorNotNumber: string;\r\n validationErrorNotRange: string;\r\n clearAllText: string;\r\n choiceSummaryLabel: string;\r\n choiceFormat: string;\r\n choiceRangeValueFormat: string;\r\n choiceAriaLabel: string;\r\n closeAriaLabel: string;\r\n modalTitle: string;\r\n modalCloseButtonText: string;\r\n minValueSliderThumbAriaLabel: string;\r\n maxValueSliderThumbAriaLabel: string;\r\n featureSimilarLooksTitle: string;\r\n featureSimilarDescriptionTitle: string;\r\n productCountAriaLabel: string;\r\n singleProductCountAriaLabel: string;\r\n swatchItemAriaLabel: string;\r\n refineItemsAriaLabel: string;\r\n refineItemAriaLabel: string;\r\n filterActiveText: string;\r\n browseButtonText: string;\r\n outOfStockNavText: string;\r\n showOutofStockBtn: string;\r\n hideOutOfStockBtn: string;\r\n}\r\n\r\nexport interface ITilesForPLPData {\r\n imageUrl?: string;\r\n urlForTileClick?: string;\r\n nameForTile?: string;\r\n currentTileShouldAppearAfterProducts?: number;\r\n}\r\n\r\nexport interface IDobbiesSearchResultContainerProps extends Msdyn365.IModule {\r\n resources: IDobbiesSearchResultContainerResources;\r\n config: IDobbiesSearchResultContainerConfig;\r\n slots: {\r\n browse: React.ReactNode[];\r\n quickview: React.ReactNode[];\r\n productComparisonButton: React.ReactNode[];\r\n };\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\n\r\nimport {\r\n CategoryHierarchy as CategoryHierarchyData,\r\n IProductRefinerHierarchy,\r\n IProductsDimensionsAvailabilities\r\n} from '@msdyn365-commerce/commerce-entities';\r\nimport MsDyn365 from '@msdyn365-commerce/core';\r\nimport { getCartFromCustomer } from '@msdyn365-commerce/global-state';\r\nimport {\r\n format,\r\n ProductPrice,\r\n ProductRefinerValue,\r\n ProjectionDomain,\r\n SortColumn,\r\n TextValueTranslation,\r\n DiscountLine\r\n} from '@msdyn365-commerce/retail-proxy';\r\nimport { getActivePricesAsync } from '@msdyn365-commerce/retail-proxy/dist/DataActions/ProductsDataActions.g';\r\nimport { ArrayExtensions } from '@msdyn365-commerce-modules/retail-actions';\r\nimport {\r\n getTelemetryObject,\r\n ILabeledDropdownOnChangeNotification,\r\n ILabeledDropdownOption,\r\n IModuleProps,\r\n INodeProps,\r\n ITelemetryContent,\r\n LabeledDropdown,\r\n UncontrolledPagination\r\n} from '@msdyn365-commerce-modules/utilities';\r\nimport classnames from 'classnames';\r\nimport { computed, observable, reaction, transaction } from 'mobx';\r\nimport { observer } from 'mobx-react';\r\nimport * as React from 'react';\r\n\r\nimport {\r\n buildListPageUrl,\r\n getCollectionProducts,\r\n getCollectionRefinersAction,\r\n getCurrentUrl,\r\n GetFullProductsByCollectionInput,\r\n parseQueryParam,\r\n RefinersByCollectionInput,\r\n sortOptions\r\n} from './actions';\r\nimport { hydrateRefinersFromUrl } from './actions/url-utils';\r\nimport {\r\n ErrorMessage,\r\n FeatureSearchResultItem,\r\n getUpdatedRefinementCriteria,\r\n IChoiceSummaryClickNotification,\r\n IRefineItemCommonProps,\r\n IRefineItemToggleNotification,\r\n ISearchResultModalViewProps,\r\n isMatchingRefinementCriterion,\r\n Link,\r\n ModalToggle,\r\n ProductSearchResultItems,\r\n SearchResultModal,\r\n Separator,\r\n Title\r\n} from './components';\r\nimport ChoiceSummary from './components/choice-summary';\r\nimport RefineSubmenu from './components/refine-submenu';\r\nimport { IDobbiesSearchResultContainerData } from './dobbies-search-result-container.data';\r\nimport { expandRefinersCount, IDobbiesSearchResultContainerProps } from './dobbies-search-result-container.props.autogenerated';\r\n// import { useState, useEffect } from \"react\";\r\nexport interface ISearchResultContainerViewProps extends IDobbiesSearchResultContainerProps {\r\n products?: React.ReactNode;\r\n className?: string;\r\n SearchResultContainer: IModuleProps;\r\n TitleViewProps: ITitleViewProps;\r\n categoryHierarchy: ICategoryHierarchyViewProps;\r\n pagination?: React.ReactNode;\r\n ProductsContainer: INodeProps;\r\n ProductSectionContainer: INodeProps;\r\n refineMenu: IRefineMenuViewProps;\r\n sortByOptions: ISortByViewProps;\r\n choiceSummary?: React.ReactNode;\r\n modalToggle: React.ReactNode;\r\n searchResultModal: ISearchResultModalViewProps;\r\n isMobile: boolean;\r\n CategoryNavContainer: INodeProps;\r\n RefineAndProductSectionContainer: INodeProps;\r\n errorMessage: React.ReactNode;\r\n FeatureSearchContainer: INodeProps;\r\n similarLookProduct?: React.ReactNode;\r\n productPrices?: ProductPrice[];\r\n refinersRef: React.RefObject;\r\n onMoreFiltersClicked?(keyName: string | undefined, isExpanded: boolean, isFromMoreFilters?: boolean): void;\r\n}\r\n\r\nexport interface ITitleViewProps {\r\n TitleContainer: INodeProps;\r\n title: ISearchResultTitle;\r\n}\r\n\r\nexport interface IRefineMenuViewProps {\r\n RefineMenuContainer: INodeProps;\r\n RefinerSectionContainer: INodeProps;\r\n refiners?: React.ReactNode[];\r\n endingRefiners?: React.ReactNode[];\r\n}\r\n\r\nexport interface ICategoryHierarchyViewProps {\r\n categoryHierarchyList?: React.ReactNode[];\r\n categoryHierarchySeparator?: React.ReactNode;\r\n CategoryHierarchyContainer: INodeProps;\r\n}\r\n\r\nexport interface ISortByViewProps {\r\n SortingContainer: INodeProps;\r\n sortByDropDown?: React.ReactNode;\r\n}\r\n\r\nexport type GridSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';\r\n\r\n/**\r\n * Title component for search result container.\r\n */\r\nexport interface ISearchResultTitle {\r\n titlePrefix?: React.ReactNode;\r\n titleText?: React.ReactNode;\r\n titleCount?: React.ReactNode;\r\n}\r\n\r\nexport interface ISearchResultContainerState {\r\n sortingState: ISortByCollectionState;\r\n modalIsOpen: boolean;\r\n refiners: IProductRefinerHierarchy[];\r\n discountLines: (DiscountLine[] | undefined)[];\r\n showProdPrice: boolean;\r\n productsDimensionAvailabilities?: IProductsDimensionsAvailabilities[][];\r\n isUpdated: boolean;\r\n nonClubPlusDiscount: ProductPrice[];\r\n updatedProducts: number[] | undefined;\r\n lastUrlStr: string;\r\n refinersExpandedStateData?: IDobbiesRefinerExpandedState[][];\r\n scrollClass: boolean;\r\n}\r\n\r\ninterface ISortByCollectionState {\r\n selectedSortByOption: ILabeledDropdownOption;\r\n pending: boolean;\r\n}\r\n\r\nexport interface IDobbiesRefinerExpandedState {\r\n refinerId?: number;\r\n isExpanded: boolean;\r\n keyName?: string;\r\n}\r\n\r\n/**\r\n *\r\n * SearchResultContainer component.\r\n * @extends {React.PureComponent>}\r\n */\r\n@observer\r\nexport default class SearchResultContainer extends React.PureComponent<\r\n IDobbiesSearchResultContainerProps,\r\n ISearchResultContainerState\r\n> {\r\n @computed get isMobile(): boolean {\r\n return this._viewport === 'xs' || this._viewport === 'sm' || this._viewport === 'md';\r\n }\r\n\r\n private readonly sortByDropdownOptions: ILabeledDropdownOption[] = [\r\n { key: sortOptions.sortByOptionRelevanceDesc, value: this.props.resources.sortByOptionRelevanceDesc },\r\n { key: sortOptions.sortByOptionNameAsc, value: this.props.resources.sortByOptionNameAsc },\r\n { key: sortOptions.sortByOptionNameDesc, value: this.props.resources.sortByOptionNameDesc },\r\n { key: sortOptions.sortByOptionPriceAsc, value: this.props.resources.sortByOptionPriceAsc },\r\n { key: sortOptions.sortByOptionPriceDesc, value: this.props.resources.sortByOptionPriceDesc },\r\n { key: sortOptions.sortByOptionRatingDesc, value: this.props.resources.sortByOptionRatingDesc }\r\n ];\r\n\r\n private readonly _refineItemCommonProps: IRefineItemCommonProps;\r\n\r\n private readonly _pageType: string | undefined = this.props.context.request.urlTokens.pageType;\r\n\r\n @observable\r\n private _viewport: GridSize;\r\n\r\n private readonly _modalToggleRef: React.RefObject;\r\n\r\n private readonly _sortAndFilterContainerRef: React.RefObject;\r\n\r\n private expandrefinerCount: number | undefined = 0;\r\n\r\n private readonly telemetryContent: ITelemetryContent;\r\n\r\n private productPrices: ProductPrice[];\r\n\r\n private readonly defaultPageNumber = 0;\r\n\r\n private refinersRef: React.RefObject;\r\n\r\n public static getFriendlyName(locale: string, nameTranslations?: TextValueTranslation[]): string | undefined {\r\n let nameTranslation: TextValueTranslation | undefined;\r\n if (locale && nameTranslations && nameTranslations.length > 0) {\r\n nameTranslation = nameTranslations.find(item => item.Language!.toLowerCase() === locale.toLowerCase());\r\n }\r\n\r\n return nameTranslation && nameTranslation.Text;\r\n }\r\n\r\n private lastChangedScrollStateMobile: Date | undefined;\r\n\r\n constructor(props: IDobbiesSearchResultContainerProps, state: ISearchResultContainerState) {\r\n super(props);\r\n this._viewport =\r\n props.context.request && props.context.request.device && props.context.request.device.Type === 'Mobile' ? 'xs' : 'lg';\r\n this._modalToggleRef = React.createRef();\r\n this._sortAndFilterContainerRef = React.createRef();\r\n this._toggleModal = this._toggleModal.bind(this);\r\n this._updateViewport = this._updateViewport.bind(this);\r\n this.productPrices = [];\r\n this.refinersRef = React.createRef();\r\n this.state = {\r\n sortingState: {\r\n pending: false,\r\n selectedSortByOption: this.sortByDropdownOptions[0]\r\n },\r\n modalIsOpen: false,\r\n refiners: [],\r\n discountLines: [],\r\n showProdPrice: false,\r\n isUpdated: false,\r\n nonClubPlusDiscount: [],\r\n updatedProducts: [],\r\n lastUrlStr: '',\r\n scrollClass: false\r\n };\r\n const { placeholderTextMax, minLabel, maxLabel, rangeNameFormat } = this.props.resources;\r\n\r\n const locale = this.props.context.request.locale;\r\n const telemetry = this.props.telemetry;\r\n const validationErrorNaN = this.props.resources.validationErrorNotNumber;\r\n const validationErrorRange = this.props.resources.validationErrorNotRange;\r\n this._refineItemCommonProps = {\r\n telemetry,\r\n locale,\r\n placeholderTextMax,\r\n minLabel,\r\n maxLabel,\r\n rangeNameFormat,\r\n validationErrorNaN,\r\n validationErrorRange\r\n };\r\n this.telemetryContent = getTelemetryObject(\r\n this.props.context.request.telemetryPageName!,\r\n this.props.friendlyName,\r\n this.props.telemetry\r\n );\r\n\r\n // VSI-Customization -- START check & redirect if found url in returns of search query\r\n if (props.data.products.result && props.data.products.result.count === 0) {\r\n const redirectUrl = props.data.products.result.products[0].ExtensionProperties?.find(item => item.Key === 'RedirectURL');\r\n if (redirectUrl && redirectUrl.Value!.StringValue && MsDyn365.isBrowser && window) {\r\n window.location.assign(redirectUrl.Value!.StringValue);\r\n }\r\n }\r\n /* VSI-Customization -- END */\r\n\r\n // Initalization of list page\r\n this.props.data.products.then(products => {\r\n this.props.data.listPageState.then(listPageState => {\r\n if (this._pageType === 'Category') {\r\n listPageState.pageType = 'Category';\r\n } else {\r\n listPageState.pageType = 'Search';\r\n }\r\n\r\n let querySorting: SortColumn[] = [];\r\n\r\n if (this.props.context.request.query && this.props.context.request.query.sorting) {\r\n querySorting = JSON.parse(decodeURIComponent(this.props.context.request.query.sorting)) as SortColumn[];\r\n }\r\n\r\n listPageState.currentPageNumber =\r\n (this.props.context.request.query && +this.props.context.request.query.skip / (this.props.config.itemsPerPage || 10)) ||\r\n 0;\r\n listPageState.sortingCritera = { Columns: querySorting };\r\n listPageState.pageSize = this.props.config.itemsPerPage || 10;\r\n listPageState.activeProducts = products.products;\r\n listPageState.totalProductCount = products.count;\r\n listPageState.activeFilters = hydrateRefinersFromUrl(this.props.context.request);\r\n\r\n // Initialize reaction based on listPageState properties\r\n reaction(\r\n () => {\r\n return [\r\n listPageState.activeFilters && listPageState.activeFilters.length,\r\n listPageState.currentPageNumber,\r\n listPageState.sortingCritera && this.state.isUpdated\r\n ];\r\n },\r\n () => {\r\n const input = new GetFullProductsByCollectionInput(\r\n listPageState.pageType,\r\n this.props.context.request.apiSettings,\r\n {\r\n Paging: {\r\n Top: this.props.config.itemsPerPage,\r\n Skip: Math.max(listPageState.pageSize * (listPageState.currentPageNumber || 0), 0)\r\n },\r\n count: true,\r\n Sorting: listPageState.sortingCritera || {}\r\n },\r\n listPageState.activeFilters || [],\r\n +(this.props.context.request.urlTokens.itemId || 0),\r\n\r\n this.props.context.request.query && this.props.context.request.query.q\r\n ? this.props.context.request.query.q\r\n : JSON.stringify({\r\n ProductId: this.props.context.request.query?.productId,\r\n Recommendation: this.props.context.request.query?.recommendation\r\n }),\r\n !!(\r\n this.props &&\r\n this.props.config &&\r\n this.props.config.includeAttributes !== undefined &&\r\n this.props.config.includeAttributes\r\n ),\r\n this.props.config.updateRefinerPanel,\r\n this.props.context.request.locale\r\n );\r\n getCollectionProducts(input, this.props.context.actionContext).then(productResults => {\r\n listPageState.activeProducts = productResults.products;\r\n if (productResults.products.length && productResults.count) {\r\n listPageState.totalProductCount = productResults.count;\r\n } else if (!productResults.products.length && !productResults.count) {\r\n listPageState.totalProductCount = productResults.count;\r\n }\r\n // if (\r\n // this.props.config.enableAffiliationBasedPricing &&\r\n // this.props.context.actionContext.requestContext?.user?.isAuthenticated\r\n // ) {\r\n // this._getActivePrice();\r\n // }\r\n if (this.props.config.enableAffiliationBasedPricing) {\r\n this._getActivePrice();\r\n }\r\n });\r\n\r\n if (this.props.config.updateRefinerPanel) {\r\n const refinerInput = new RefinersByCollectionInput(\r\n listPageState.pageType,\r\n this.props.context.request.apiSettings,\r\n {\r\n Paging: {\r\n Top: this.props.config.itemsPerPage,\r\n Skip: Math.max(\r\n listPageState.pageSize * (listPageState.currentPageNumber ?? this.defaultPageNumber),\r\n this.defaultPageNumber\r\n )\r\n },\r\n count: true,\r\n Sorting: listPageState.sortingCritera ?? {}\r\n },\r\n listPageState.activeFilters ?? [],\r\n +(this.props.context.request.urlTokens.itemId ?? 0),\r\n this.props.context.request.query?.q\r\n ? this.props.context.request.query.q\r\n : this.props.context.request.query?.productId,\r\n false,\r\n this.props.config.updateRefinerPanel\r\n );\r\n\r\n getCollectionRefinersAction(refinerInput, this.props.context.actionContext)\r\n .then(refiners => {\r\n this.setState({ refiners });\r\n })\r\n .catch(error => {\r\n this.props.telemetry.error(error);\r\n });\r\n }\r\n }\r\n );\r\n });\r\n });\r\n\r\n if (this.props.context.request.query?.productId) {\r\n this.props.data.featureProduct.then(products => {\r\n this.props.data.listPageState.then(listPageStateFeature => {\r\n listPageStateFeature.featureProduct = products;\r\n });\r\n });\r\n }\r\n this._updateViewport();\r\n }\r\n\r\n public componentDidMount(): void {\r\n if (MsDyn365.isBrowser && window && window && window.addEventListener) {\r\n window.addEventListener('resize', this._updateViewport);\r\n this._updateViewport();\r\n window.addEventListener('scroll', this._mainMenuScroll);\r\n }\r\n if (this.props.config.enableAffiliationBasedPricing) {\r\n this._getActivePrice();\r\n }\r\n // if (this.props.config.enableAffiliationBasedPricing && this.props.context.actionContext.requestContext?.user?.isAuthenticated) {\r\n // this._getActivePrice();\r\n // }\r\n this.getNonClubPlusDiscountPrices();\r\n reaction(\r\n () => this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts,\r\n async () => {\r\n const url = MsDyn365.isBrowser && window && window.location.href;\r\n if (this.props.data.listPageState.result?.activeProducts.length && this.state.lastUrlStr !== url) {\r\n this.getNonClubPlusDiscountPrices();\r\n this.setState({ lastUrlStr: url ? url : '' });\r\n }\r\n }\r\n );\r\n }\r\n\r\n public checkDifference = (array1: number[] | undefined, array2: number[] | undefined) => {\r\n if (!array1 || !array2) {\r\n return true;\r\n }\r\n if (array1?.length !== array2?.length) {\r\n return true;\r\n }\r\n for (let i = 0; i < array1.length; i++) {\r\n if (array1[i] !== array2[i]) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n public componentWillUnmount(): void {\r\n if (MsDyn365.isBrowser && window.removeEventListener) {\r\n window.removeEventListener('resize', this._updateViewport);\r\n }\r\n if (MsDyn365.isBrowser && window && window.addEventListener) {\r\n window.addEventListener('scroll', this._mainMenuScroll);\r\n }\r\n }\r\n\r\n public render(): JSX.Element {\r\n const { imageSettings, className } = this.props.config;\r\n const { resources } = this.props;\r\n // VSI-Customization START - check empty product object on searching special character.\r\n const products =\r\n (this.props.data.listPageState.result &&\r\n this.props.data.listPageState.result.activeProducts &&\r\n this.props.data.listPageState.result.activeProducts.length === 1 &&\r\n !this.props.data.listPageState.result.activeProducts[0].ItemId\r\n ? []\r\n : this.props.data.listPageState.result!.activeProducts) || [];\r\n // VSI-Customization END\r\n const searchProduct = (this.props.data.listPageState.result && this.props.data.listPageState.result.featureProduct) || null;\r\n let errorText = '';\r\n if (!products || products.length === 0) {\r\n errorText = this._pageType === 'Category' ? resources.resultCategoryNotFoundText : resources.resultSearchNotFoundText;\r\n }\r\n const productsComponent = this._getProducts();\r\n const featureComponent = (\r\n \r\n );\r\n\r\n const searchResultContainerViewProps = {\r\n ...this.props,\r\n\r\n products: productsComponent,\r\n TitleViewProps: !this.props.config.disableHierarchy && this._getCollectionTitle(),\r\n categoryHierarchy: !this.props.config.disableHierarchy && this._getCategoryHierarchy(),\r\n refineMenu: this._getRefineMenu(),\r\n className: classnames('ms-search-result-container', className),\r\n SearchResultContainer: {\r\n moduleProps: this.props,\r\n className: classnames('ms-search-result-container new-filter-ms-search-result-container', className)\r\n },\r\n sortByOptions:\r\n this.props.data.listPageState.result && this.props.data.listPageState.result.totalProductCount !== 0\r\n ? this._getSortingDropDown()\r\n : null,\r\n pagination: this._getPagination(),\r\n ProductsContainer: { className: 'ms-search-result-container__Products' },\r\n ProductSectionContainer: { className: 'ms-search-result-container__product-section' },\r\n CategoryNavContainer: { className: 'ms-search-result-container__category-nav-section new-filter__category-nav-section' },\r\n RefineAndProductSectionContainer: {\r\n className: 'ms-search-result-container__refine-product-section new-filter__refine-product-section'\r\n },\r\n choiceSummary: this._getChoiceSummary(),\r\n modalToggle:\r\n this.props.data.listPageState.result && this.props.data.listPageState.result.totalProductCount !== 0 ? (\r\n \r\n ) : null,\r\n searchResultModal: this._getSearchResultModal(),\r\n isMobile: this.isMobile,\r\n errorMessage: errorText && ,\r\n FeatureSearchContainer: { className: 'ms-feature-search-result' },\r\n similarLookProduct:\r\n this.props.data.listPageState.result &&\r\n this.props.data.listPageState.result.featureProduct !== null &&\r\n this.props.data.listPageState.result.featureProduct !== undefined\r\n ? featureComponent\r\n : null,\r\n productPrices: this.productPrices,\r\n refinersRef: this.refinersRef,\r\n onMoreFiltersClicked: this.toggleRefinersInSameColumn\r\n };\r\n return this.props.renderView(searchResultContainerViewProps) as React.ReactElement;\r\n }\r\n\r\n private readonly _getActivePrice = async (): Promise => {\r\n const priceAffiliations = [\r\n {\r\n AffiliationId: this.props.context.app.config.AffiliationId,\r\n LoyaltyTierId: this.props.context.app.config.LoyaltyTierId,\r\n AffiliationTypeValue: this.props.context.app.config.AffiliationTypeValue,\r\n ReasonCodeLines: [],\r\n CustomerId: '',\r\n ExtensionProperties: []\r\n }\r\n ];\r\n\r\n let products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\r\n const productRecIds = ArrayExtensions.hasElements(products) ? products.map(prod => prod.RecordId) : [];\r\n const projectDomain: ProjectionDomain = {\r\n ChannelId: this.props.context.request.apiSettings.channelId,\r\n CatalogId: this.props.context.request.apiSettings.catalogId\r\n };\r\n const cart = await getCartFromCustomer(this.props.context.actionContext);\r\n const affliations = cart?.AffiliationLines;\r\n console.log(affliations);\r\n await getActivePricesAsync(\r\n {\r\n callerContext: this.props.context.actionContext,\r\n queryResultSettings: {}\r\n },\r\n projectDomain,\r\n productRecIds,\r\n new Date(),\r\n null,\r\n priceAffiliations,\r\n true\r\n )\r\n .then((activePricesResponse: ProductPrice[]) => {\r\n this.productPrices = activePricesResponse;\r\n const discountLines = activePricesResponse.map(priceResp => priceResp.DiscountLines);\r\n const prodIds: number[] = [];\r\n activePricesResponse.map(priceResp => {\r\n if (priceResp.ProductId) {\r\n prodIds.push(priceResp.ProductId);\r\n }\r\n });\r\n if (this.checkDifference(prodIds, this.state.updatedProducts)) {\r\n this.setState({\r\n discountLines: discountLines,\r\n showProdPrice: true,\r\n updatedProducts: prodIds\r\n });\r\n }\r\n\r\n products = products.map(prod => {\r\n const activePrice = activePricesResponse.find(price => price.ProductId === prod.RecordId);\r\n if (activePrice) {\r\n prod.Price = activePrice.CustomerContextualPrice ?? prod.Price;\r\n prod.BasePrice = Math.max(\r\n activePrice.BasePrice || 0,\r\n activePrice.TradeAgreementPrice || 0,\r\n activePrice.AdjustedPrice || 0\r\n );\r\n }\r\n return prod;\r\n });\r\n products = products?.filter(prod => {\r\n const activePrice = activePricesResponse.find(price => price.ProductId === prod.RecordId);\r\n if (activePrice) {\r\n return true;\r\n }\r\n return false;\r\n });\r\n this.props.data.listPageState.then(listPageState => {\r\n listPageState.activeProducts = products;\r\n });\r\n })\r\n .catch((error: Error) => {\r\n this.setState({\r\n showProdPrice: true\r\n });\r\n this.props.context.actionContext.trace(error.message);\r\n this.props.context.actionContext.telemetry.exception(error);\r\n this.props.context.actionContext.telemetry.debug(\r\n '[get Affiliation based price on search result container ]Error executing action'\r\n );\r\n throw new Error('[get Affiliation based price on search result container]Error executing action');\r\n });\r\n };\r\n\r\n private readonly getNonClubPlusDiscountPrices = async (): Promise => {\r\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\r\n const productRecIds = ArrayExtensions.hasElements(products) ? products.map(prod => prod.RecordId) : [];\r\n const projectDomain: ProjectionDomain = {\r\n ChannelId: this.props.context.request.apiSettings.channelId,\r\n CatalogId: this.props.context.request.apiSettings.catalogId\r\n };\r\n await getActivePricesAsync(\r\n {\r\n callerContext: this.props.context.actionContext,\r\n queryResultSettings: {}\r\n },\r\n projectDomain,\r\n productRecIds,\r\n new Date(),\r\n null,\r\n null,\r\n true\r\n )\r\n .then((activePricesResponse: ProductPrice[]) => {\r\n if (activePricesResponse && activePricesResponse.length > 0) {\r\n activePricesResponse = activePricesResponse.filter(prod => {\r\n const activePrice = products?.find(price => price.RecordId === prod.ProductId);\r\n if (activePrice) {\r\n return true;\r\n }\r\n return false;\r\n });\r\n this.setState({\r\n nonClubPlusDiscount: activePricesResponse\r\n });\r\n }\r\n })\r\n .catch((error: Error) => {\r\n this.setState({\r\n showProdPrice: true\r\n });\r\n this.props.context.actionContext.trace(error.message);\r\n this.props.context.actionContext.telemetry.exception(error);\r\n this.props.context.actionContext.telemetry.debug(\r\n '[get Affiliation based price on search result container ]Error executing action'\r\n );\r\n throw new Error('[get Affiliation based price on search result container]Error executing action');\r\n });\r\n };\r\n\r\n private readonly _getSearchResultModal = (): ISearchResultModalViewProps => {\r\n const { resources } = this.props;\r\n return SearchResultModal({\r\n resources: {\r\n modalCloseButtonText: resources.modalCloseButtonText,\r\n modalTitle: resources.modalTitle\r\n },\r\n isOpen: this.state.modalIsOpen,\r\n returnRef: this._modalToggleRef,\r\n onModalToggle: this._toggleModal\r\n });\r\n };\r\n\r\n private readonly _getCollectionTitle = (): ITitleViewProps => {\r\n const { data, context, resources } = this.props;\r\n\r\n let collectionTitle: string | undefined = '';\r\n if (context && context.request && context.request.query && context.request.query.q) {\r\n collectionTitle = `\"${context.request.query.q}\"`;\r\n } else {\r\n collectionTitle =\r\n (data.category.result &&\r\n SearchResultContainer.getFriendlyName(context.request.locale, data.category.result.NameTranslations)) ||\r\n (data.category.result && data.category.result.Name);\r\n }\r\n let productCountText = '';\r\n let productCountNumber: number | undefined;\r\n if (data.listPageState && data.listPageState.result && data.listPageState.result.totalProductCount !== undefined) {\r\n productCountNumber = data.listPageState.result.totalProductCount;\r\n } else if (data.products && data.products.result) {\r\n productCountNumber = data.products.result.count;\r\n }\r\n\r\n if (productCountNumber && productCountNumber !== 0) {\r\n productCountText =\r\n productCountNumber !== 1\r\n ? format(this.props.resources.numberOfProducts, productCountNumber)\r\n : this.props.resources.oneProduct;\r\n } else {\r\n productCountText = format(this.props.resources.numberOfProducts, 0);\r\n }\r\n const isSearchPage = this.props.context.request.query?.q;\r\n const pageName = context.request.telemetryPageName ? `result-count-${context.request.telemetryPageName.toLowerCase()}` : '';\r\n const titlePrefix = ;\r\n const titleText = collectionTitle && <Title className='ms-search-result__collection-title-text' text={collectionTitle} />;\r\n const titleCount = <Title className='ms-search-result__collection-title-count' text={productCountText} />;\r\n\r\n return {\r\n TitleContainer: { className: `ms-search-result-container__title ${collectionTitle ? '' : 'd-none'} ${pageName}` },\r\n title: {\r\n titlePrefix,\r\n titleText,\r\n titleCount: isSearchPage ? titleCount : undefined\r\n }\r\n };\r\n };\r\n\r\n private readonly _getCategoryHierarchy = (): ICategoryHierarchyViewProps => {\r\n const { data } = this.props;\r\n const categoryHierarchy = data.categoryHierarchy.result;\r\n const categoryLinks =\r\n categoryHierarchy &&\r\n categoryHierarchy.map((value: CategoryHierarchyData, index: number) => {\r\n return (\r\n <Link\r\n key={index}\r\n text={value.Name}\r\n ariaLabel={`${this.props.resources.categoryLinkAriaLabel} ${value.Name}`}\r\n href={value.Url}\r\n />\r\n );\r\n });\r\n const categoryLinkSeparator = <Separator separator='/' />;\r\n\r\n return {\r\n CategoryHierarchyContainer: { tag: 'nav', className: 'ms-search-result-container__category-hierarchy' },\r\n categoryHierarchyList: categoryLinks,\r\n categoryHierarchySeparator: categoryLinkSeparator\r\n };\r\n };\r\n\r\n private readonly _getSortingDropDown = (): ISortByViewProps => {\r\n const { resources } = this.props;\r\n const activeDropdown = this._getCurrentlySelectedOption() || this.state.sortingState.selectedSortByOption;\r\n let dropdwonOptions = this.sortByDropdownOptions;\r\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access -- App config settings are of \"any\" value.\r\n if (this.props.context.app.config.hideRating) {\r\n dropdwonOptions = this.sortByDropdownOptions.filter(dropdownOption => dropdownOption.key !== 'AverageRating-Desc');\r\n }\r\n const dropdown = (\r\n <LabeledDropdown\r\n labelClassname='reviews-list-sort-by'\r\n labelText={resources.sortByDropdownLabel}\r\n dropdownId='categorySortByDropdown'\r\n dropdownClassname='reviews-list-dropdown'\r\n toggleColor='link'\r\n dropdownOptions={dropdwonOptions}\r\n selectedOption={activeDropdown}\r\n onSelectOption={this._updateSortByDropdown}\r\n ref={this._sortAndFilterContainerRef}\r\n />\r\n );\r\n return {\r\n SortingContainer: { className: 'ms-search-result-container__Sort-by-category' },\r\n sortByDropDown: dropdown\r\n };\r\n };\r\n\r\n private readonly _getPagination = (): React.ReactNode => {\r\n const { config, context, data, resources } = this.props;\r\n const listPageState = data && data.listPageState && data.listPageState.result;\r\n const fullUrl = getCurrentUrl(context.request);\r\n const itemsPerPage = config.itemsPerPage || 10;\r\n const skipCount =\r\n listPageState && listPageState.currentPageNumber !== null\r\n ? listPageState.currentPageNumber * (this.props.config.itemsPerPage || 10)\r\n : (this.props.context.request.query && +this.props.context.request.query.skip) || 0;\r\n const totalItems = (listPageState && listPageState.totalProductCount) || 0;\r\n const previousText = resources.flipperPrevious;\r\n const nextText = resources.flipperNext;\r\n\r\n if (totalItems <= itemsPerPage) {\r\n return null;\r\n }\r\n return (\r\n <UncontrolledPagination\r\n className='ms-search-result-container__pagination'\r\n role='navigation'\r\n aria-label={resources.paginationAriaLabel}\r\n url={fullUrl.href}\r\n qsp='skip'\r\n items={totalItems}\r\n itemsPerPage={itemsPerPage}\r\n startingItem={skipCount}\r\n previousText={this._renderPrev(previousText)}\r\n nextText={this._renderNext(nextText)}\r\n previousAriaLabel={previousText}\r\n nextAriaLabel={nextText}\r\n telemetryContent={this.telemetryContent}\r\n />\r\n );\r\n };\r\n\r\n private toggleRefinersInSameColumn = (keyName: string, isExpanded: boolean, isFromMoreFilters?: boolean) => {\r\n if (this.state.refinersExpandedStateData && this.state.refinersExpandedStateData.length) {\r\n const expandedStateData: IDobbiesRefinerExpandedState[][] = [];\r\n this.state.refinersExpandedStateData.map(refRow => {\r\n expandedStateData.push(refRow);\r\n });\r\n if (isFromMoreFilters && expandedStateData && expandedStateData.length) {\r\n let hasFilterOpened = false;\r\n for (let i = 0; i < expandedStateData.length; i++) {\r\n for (let j = 0; j < expandedStateData[i].length; j++) {\r\n if (!expandedStateData[i][j].isExpanded) {\r\n hasFilterOpened = true;\r\n }\r\n }\r\n }\r\n if (!hasFilterOpened) {\r\n return;\r\n }\r\n for (let i = 0; i < expandedStateData.length; i++) {\r\n for (let j = 0; j < expandedStateData[i].length; j++) {\r\n expandedStateData[i][j].isExpanded = true;\r\n }\r\n }\r\n this.setState({ refinersExpandedStateData: expandedStateData });\r\n } else if (expandedStateData && expandedStateData.length) {\r\n for (let i = 0; i < expandedStateData.length; i++) {\r\n for (let j = 0; j < expandedStateData[i].length; j++) {\r\n if (expandedStateData[i][j] && expandedStateData[i][j].keyName === keyName) {\r\n expandedStateData[i][j].isExpanded = isExpanded;\r\n }\r\n if (expandedStateData[i][j].keyName === keyName && !isExpanded) {\r\n for (let k = 0; k < expandedStateData.length; k++) {\r\n for (let m = 0; m < expandedStateData[k].length; m++) {\r\n if (expandedStateData[k][m] && expandedStateData[k][m].keyName !== keyName) {\r\n expandedStateData[k][m].isExpanded = true;\r\n }\r\n }\r\n }\r\n }\r\n }\r\n }\r\n this.setState({ refinersExpandedStateData: expandedStateData });\r\n }\r\n }\r\n };\r\n\r\n private setInitialSameColumnRefinerDetails = (endingRefiners: IProductRefinerHierarchy[] | undefined) => {\r\n const maxRefinersColumns = this._getViewport() !== 'xl' && this._getViewport() !== 'lg' ? 4 : 5;\r\n const filtersNavData: (string | undefined)[][] = [];\r\n let filtersRow: (string | undefined)[] = [];\r\n if (endingRefiners) {\r\n for (let index = 0; index < endingRefiners.length; index++) {\r\n if (index % maxRefinersColumns === 0 && index !== 0) {\r\n filtersNavData.push(filtersRow);\r\n filtersRow = [];\r\n }\r\n filtersRow.push(endingRefiners[index].KeyName);\r\n }\r\n if (filtersRow.length) {\r\n filtersNavData.push(filtersRow);\r\n }\r\n const refinersExpandedStateData: IDobbiesRefinerExpandedState[][] = [];\r\n if (filtersNavData && filtersNavData.length) {\r\n for (let i = 0; i < filtersNavData.length; i++) {\r\n const refinersRowExpandedStates: IDobbiesRefinerExpandedState[] = [];\r\n for (let j = 0; j < filtersNavData[i].length; j++) {\r\n const filtersKeyName = filtersNavData[i][j];\r\n refinersRowExpandedStates.push({ isExpanded: true, keyName: filtersKeyName });\r\n }\r\n if (refinersRowExpandedStates.length) {\r\n refinersExpandedStateData.push(refinersRowExpandedStates);\r\n }\r\n }\r\n }\r\n this.setState({ refinersExpandedStateData: refinersExpandedStateData });\r\n }\r\n };\r\n\r\n private readonly _getRefineMenu = (): IRefineMenuViewProps => {\r\n const { data, context, config } = this.props;\r\n const tempRangeTypeTODO = context.request.query && context.request.query.inputRange ? 'input' : 'slider';\r\n const validRefiners =\r\n this.props.config.updateRefinerPanel && ArrayExtensions.hasElements(this.state.refiners)\r\n ? this.state.refiners.filter(refiner => {\r\n return ArrayExtensions.hasElements(refiner.Values);\r\n })\r\n : data.refiners.result &&\r\n data.refiners.result.filter(refiner => {\r\n return ArrayExtensions.hasElements(refiner.Values);\r\n });\r\n\r\n const activeRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n this._getexpandRefinerCount(validRefiners && validRefiners.length, config.expandRefinersCount);\r\n\r\n const sortedRefiners = validRefiners;\r\n\r\n const startingRefinerList = this.props.config.startingRefinerList || [];\r\n\r\n const startingRefiners = sortedRefiners?.filter(refiner => startingRefinerList.indexOf(refiner.KeyName!) > -1);\r\n\r\n const endingRefiners = sortedRefiners?.filter(refiner => {\r\n const existsInStarting = startingRefiners?.find(startingRefiner => startingRefiner.RecordId === refiner.RecordId);\r\n\r\n return !existsInStarting;\r\n });\r\n\r\n const expandedRefiners = this.expandrefinerCount;\r\n\r\n const subMenus =\r\n startingRefiners &&\r\n startingRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\r\n return (\r\n <RefineSubmenu\r\n productRefinerHierarchy={productRefinerHierarchy}\r\n selectedRefinerValues={activeRefiners}\r\n refineItemCommonProps={this._refineItemCommonProps}\r\n minValueSliderThumbAriaLabel={this.props.resources.minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={this.props.resources.maxValueSliderThumbAriaLabel}\r\n key={index}\r\n onUpdateRefiners={this._onUpdateRefiners}\r\n urlBuilder={this._buildRefinerUrl}\r\n isDisabled={false}\r\n isExpandedOnInitialLoad={!!(expandedRefiners && expandedRefiners > index)}\r\n tempRangeTypeTODO={tempRangeTypeTODO}\r\n context={context}\r\n moduleId={this.props.id}\r\n moduleTypeName={this.props.typeName}\r\n />\r\n );\r\n });\r\n\r\n const endingSubMenus =\r\n endingRefiners &&\r\n endingRefiners.map((productRefinerHierarchy: IProductRefinerHierarchy, index: number) => {\r\n return (\r\n <RefineSubmenu\r\n productRefinerHierarchy={productRefinerHierarchy}\r\n selectedRefinerValues={activeRefiners}\r\n refineItemCommonProps={this._refineItemCommonProps}\r\n minValueSliderThumbAriaLabel={this.props.resources.minValueSliderThumbAriaLabel}\r\n maxValueSliderThumbAriaLabel={this.props.resources.maxValueSliderThumbAriaLabel}\r\n key={index}\r\n onUpdateRefiners={this._onUpdateRefiners}\r\n urlBuilder={this._buildRefinerUrl}\r\n isDisabled={false}\r\n isExpandedOnInitialLoad={!!(expandedRefiners && expandedRefiners > index)}\r\n tempRangeTypeTODO={tempRangeTypeTODO}\r\n context={context}\r\n moduleId={this.props.id}\r\n moduleTypeName={this.props.typeName}\r\n refinersExpandedStateData={this.state.refinersExpandedStateData}\r\n onToggle={this.toggleRefinersInSameColumn}\r\n />\r\n );\r\n });\r\n if (!this.state.refinersExpandedStateData) {\r\n this.setInitialSameColumnRefinerDetails(endingRefiners);\r\n }\r\n return {\r\n RefineMenuContainer: { className: `ms-search-result-container__refine-menu` },\r\n RefinerSectionContainer: {\r\n className: `ms-search-result-container__refiner-section new-filter__refiner-section ${\r\n this.state.scrollClass ? 'scrolled' : ''\r\n }`\r\n },\r\n refiners: subMenus,\r\n endingRefiners: endingSubMenus\r\n };\r\n };\r\n\r\n private readonly _getChoiceSummary = (): React.ReactNode => {\r\n const { resources, data, telemetry } = this.props;\r\n const selectedRefiners = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n return (\r\n <ChoiceSummary\r\n classNames='ms-choice-summary-by-category'\r\n clearAllText={resources.clearAllText}\r\n FilterActiveText={resources.filterActiveText}\r\n label={resources.choiceSummaryLabel}\r\n selectedChoices={selectedRefiners}\r\n // @ts-expect-error: NOTE Type-unsafe line below, null refinersByCategoryHierarchy case not handled\r\n refinerHierarchy={data.refiners.result}\r\n choiceFormat={resources.choiceFormat}\r\n choiceRangeValueFormat={resources.choiceRangeValueFormat}\r\n telemetry={telemetry}\r\n onChoiceClicked={this._onChoiceClicked}\r\n urlBuilder={this._buildRefinerUrlForChoiceSummary}\r\n choiceAriaLabel={resources.choiceAriaLabel}\r\n telemetryContent={this.telemetryContent}\r\n context={this.props.context}\r\n />\r\n );\r\n };\r\n\r\n private readonly _getProducts = (): JSX.Element => {\r\n const { imageSettings, allowBackNavigation } = this.props.config;\r\n const { resources } = this.props;\r\n const breaCrumbType = this.props.context.app.config.breadcrumbType;\r\n const allowBack = allowBackNavigation && (breaCrumbType === 'back' || breaCrumbType === 'categoryAndBack');\r\n const products = (this.props.data.listPageState.result && this.props.data.listPageState.result.activeProducts) || [];\r\n const quickviewslot = this.props.slots && this.props.slots.quickview && this.props.slots.quickview[0];\r\n const isPriceMinMaxFeatureState = this.props.data.featureState.result?.find(\r\n featureState => featureState.Name === 'Dynamics.AX.Application.RetailSearchPriceRangeFeature'\r\n );\r\n return (\r\n <ProductSearchResultItems\r\n products={products}\r\n context={this.props.context}\r\n imageSettings={imageSettings}\r\n resources={resources}\r\n moduleType={this.props.typeName}\r\n moduleId={this.props.id}\r\n allowBackNavigation={allowBack}\r\n telemetryContent={this.telemetryContent}\r\n quickviewSlot={quickviewslot}\r\n channelInventoryConfigurationId={this.props.data.products.result?.channelInventoryConfigurationId}\r\n isPriceMinMaxEnabled={isPriceMinMaxFeatureState?.IsEnabled}\r\n discountLines={this.state.discountLines}\r\n config={this.props.config}\r\n showProdPrice={this.state.showProdPrice}\r\n wishlists={this.props.data.wishlists.result}\r\n isMobile={this.isMobile}\r\n loyalty={this.props.data.loyaltyCard.result}\r\n nonClubPlusDiscount={this.state.nonClubPlusDiscount && this.state.nonClubPlusDiscount}\r\n showTilesOnPLP={this.props.config.showTilesOnPLP}\r\n tilesForPLP={this.props.config.tilesForPLP}\r\n repeatSameTile={this.props.config.repeatSameTile}\r\n maxNumberOfTiles={this.props.config.maxNumberOfTiles}\r\n tileToAppearAfterProducts={this.props.config.tileToAppearAfterProducts}\r\n />\r\n );\r\n };\r\n\r\n private readonly _updateSortByDropdown = (notification: ILabeledDropdownOnChangeNotification): void => {\r\n const { context } = this.props;\r\n const requestContext = context && context.request;\r\n const actionContext = context && context.actionContext;\r\n\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n const error = `[sort-by-category] cannot sort without context: ${!requestContext ? 'requestContext ' : ''} ${\r\n !actionContext ? 'actionContext ' : ''\r\n } could not be found`;\r\n this.props.telemetry.warning(error);\r\n }\r\n\r\n MsDyn365.isBrowser &&\r\n window &&\r\n window.history.pushState(\r\n {},\r\n '',\r\n buildListPageUrl(\r\n getCurrentUrl(this.props.context.request),\r\n undefined,\r\n [this._getSortColumnFromSelectedOption(notification.selectedOption)],\r\n undefined\r\n )\r\n );\r\n this.setState({ isUpdated: !this.state.isUpdated, discountLines: [] });\r\n\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.sortingCritera = {\r\n Columns: [this._getSortColumnFromSelectedOption(notification.selectedOption)]\r\n };\r\n });\r\n };\r\n\r\n private readonly _getSortColumnFromSelectedOption = (option: ILabeledDropdownOption): SortColumn => {\r\n const { data } = this.props;\r\n\r\n if (!data.searchConfiguration.result) {\r\n return {};\r\n }\r\n\r\n const mappedConfiguration = data.searchConfiguration.result.find(searchConfiguration => {\r\n return searchConfiguration.key === option.key;\r\n });\r\n\r\n if (mappedConfiguration) {\r\n return mappedConfiguration.sortColumn;\r\n }\r\n\r\n return {};\r\n };\r\n\r\n private readonly _getCurrentlySelectedOption = (): ILabeledDropdownOption | undefined => {\r\n const { data } = this.props;\r\n const sortCriteria = data.listPageState.result && data.listPageState.result.sortingCritera;\r\n\r\n const activeSortColumn =\r\n (sortCriteria && sortCriteria.Columns && sortCriteria.Columns[0]) ||\r\n (parseQueryParam<SortColumn[]>('sorting', this.props.context.request) || [])[0];\r\n\r\n if (activeSortColumn && data.searchConfiguration.result) {\r\n const activeMappedConfig = data.searchConfiguration.result.find(mappedSearchConfig => {\r\n return (\r\n mappedSearchConfig.sortColumn.ColumnName === activeSortColumn.ColumnName &&\r\n mappedSearchConfig.sortColumn.IsDescending === activeSortColumn.IsDescending\r\n );\r\n });\r\n if (activeMappedConfig) {\r\n return this.sortByDropdownOptions.find(dropdownOption => dropdownOption.key === activeMappedConfig.key);\r\n }\r\n }\r\n\r\n return;\r\n };\r\n\r\n private readonly _onUpdateRefiners = (itemToggleNotification: IRefineItemToggleNotification): void => {\r\n const { context } = this.props;\r\n const requestContext = context && context.request;\r\n const actionContext = context && context.actionContext;\r\n\r\n if (!requestContext || !actionContext || !this.props.data.listPageState.result) {\r\n const error = `Refine menu cannot refine search criteria: ${!requestContext ? 'requestContext ' : ''} ${\r\n !actionContext ? 'actionContext ' : ''\r\n } could not be found`;\r\n this.props.telemetry.warning(error);\r\n }\r\n\r\n const updatedRefinementCriteria = getUpdatedRefinementCriteria(\r\n itemToggleNotification,\r\n (this.props.data.listPageState.result && this.props.data.listPageState.result.activeFilters) || []\r\n );\r\n\r\n MsDyn365.isBrowser &&\r\n window &&\r\n window.history.pushState({}, '', buildListPageUrl(getCurrentUrl(this.props.context.request), updatedRefinementCriteria));\r\n transaction(() => {\r\n this.props.data.listPageState.result!.currentPageNumber = 0;\r\n this.props.data.listPageState.result!.activeFilters = updatedRefinementCriteria;\r\n });\r\n };\r\n\r\n private readonly _buildRefinerUrl = (itemToggleNotification: IRefineItemToggleNotification): string => {\r\n if (this.props.data.listPageState.result) {\r\n const newRefinementCriteria = getUpdatedRefinementCriteria(\r\n itemToggleNotification,\r\n this.props.data.listPageState.result.activeFilters || []\r\n );\r\n\r\n return buildListPageUrl(getCurrentUrl(this.props.context.request), newRefinementCriteria);\r\n }\r\n this.props.telemetry.warning('[buildRefinerQueryString]List Page State Not available, unable to build refiner URL');\r\n return '';\r\n };\r\n\r\n private readonly _onChoiceClicked = (notification: IChoiceSummaryClickNotification): void => {\r\n const { data, telemetry } = this.props;\r\n\r\n if (!data.listPageState.result) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked]ListPageState unavailable, unable to update refiners.');\r\n return;\r\n }\r\n\r\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (!notification.clearAll) {\r\n const selectedChoice = notification.choiceClicked;\r\n if (!selectedChoice) {\r\n telemetry.warning('[choice-summary-by-category._onChoiceClicked] Choice could not be determined');\r\n return;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedChoice, selectedCriterion)\r\n );\r\n } else {\r\n currentRefinementCriteria = [];\r\n\r\n // Set focus to sort and filter\r\n const dropdownElementId = this._sortAndFilterContainerRef.current && this._sortAndFilterContainerRef.current.props.dropdownId;\r\n const dropdownElement = dropdownElementId && document.getElementById(dropdownElementId);\r\n setTimeout(() => {\r\n dropdownElement && dropdownElement.focus();\r\n }, 50);\r\n }\r\n\r\n const fullUrl = getCurrentUrl(this.props.context.request);\r\n MsDyn365.isBrowser && window && window.history.pushState({}, '', buildListPageUrl(fullUrl, currentRefinementCriteria));\r\n data.listPageState.result.currentPageNumber = 0;\r\n data.listPageState.result.activeFilters = currentRefinementCriteria;\r\n };\r\n\r\n private readonly _buildRefinerUrlForChoiceSummary = (selectedRefiner: ProductRefinerValue, isClearAll: boolean): string => {\r\n const { data, telemetry } = this.props;\r\n const fullUrl = getCurrentUrl(this.props.context.request);\r\n\r\n if (!data.listPageState.result) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl]ListPageState unavailable, unable to create refiner URL.');\r\n return fullUrl.href;\r\n }\r\n\r\n let currentRefinementCriteria = (data.listPageState.result && data.listPageState.result.activeFilters) || [];\r\n\r\n if (!isClearAll) {\r\n if (!selectedRefiner) {\r\n telemetry.warning('[choice-summary-by-category._buildRefinerUrl] URL for Choice could not be determined');\r\n return fullUrl.href;\r\n }\r\n currentRefinementCriteria = currentRefinementCriteria.filter(\r\n (selectedCriterion: ProductRefinerValue) => !isMatchingRefinementCriterion(selectedRefiner, selectedCriterion)\r\n );\r\n } else {\r\n currentRefinementCriteria = [];\r\n }\r\n\r\n return buildListPageUrl(fullUrl, currentRefinementCriteria);\r\n };\r\n\r\n private _getViewport(): GridSize {\r\n const { context } = this.props;\r\n\r\n // Always render in mobile viewport on a mobile device\r\n if (context.request && context.request.device && context.request.device.Type === 'Mobile') {\r\n return 'xs';\r\n }\r\n\r\n if (MsDyn365.isBrowser && window && window.innerWidth) {\r\n const gridSettings = context.request.gridSettings;\r\n if (gridSettings) {\r\n if (gridSettings.xs && window && window.innerWidth <= gridSettings.xs.w) {\r\n return 'xs';\r\n } else if (gridSettings.sm && window && window.innerWidth <= gridSettings.sm.w) {\r\n return 'sm';\r\n } else if (gridSettings.md && window && window.innerWidth <= gridSettings.md.w) {\r\n return 'md';\r\n } else if (gridSettings.lg && window && window.innerWidth <= gridSettings.lg.w) {\r\n return 'lg';\r\n }\r\n return 'xl';\r\n }\r\n }\r\n\r\n return 'lg';\r\n }\r\n\r\n private _toggleModal(): void {\r\n this.setState({\r\n modalIsOpen: !this.state.modalIsOpen\r\n });\r\n }\r\n\r\n private _updateViewport(): void {\r\n this._viewport = this._getViewport();\r\n\r\n if (this.state.modalIsOpen && !this.isMobile) {\r\n this._toggleModal();\r\n }\r\n }\r\n\r\n private readonly _getexpandRefinerCount = (validRefiners?: number, refinerCount?: expandRefinersCount): void => {\r\n switch (refinerCount) {\r\n case expandRefinersCount.all:\r\n this.expandrefinerCount = validRefiners;\r\n break;\r\n case expandRefinersCount.one:\r\n this.expandrefinerCount = 1;\r\n break;\r\n case expandRefinersCount.two:\r\n this.expandrefinerCount = 2;\r\n break;\r\n case expandRefinersCount.three:\r\n this.expandrefinerCount = 3;\r\n break;\r\n case expandRefinersCount.four:\r\n this.expandrefinerCount = 4;\r\n break;\r\n default:\r\n this.expandrefinerCount = 0;\r\n }\r\n };\r\n\r\n /**\r\n * Renders a Pagination previous text.\r\n * @param paginationPreviousText - Pagination previous text from resources.\r\n * @returns Previous text and flipper icon.\r\n */\r\n private readonly _renderPrev = (paginationPreviousText: string) => {\r\n return (\r\n <div className='msc-pagination__prev'>\r\n <span className='ms-search-result__pagination-left' aria-hidden='true' />\r\n <span className='prev-text'>{paginationPreviousText}</span>\r\n </div>\r\n );\r\n };\r\n\r\n /**\r\n * Renders a Pagination next text.\r\n * @param paginationNextText - Pagination next text from resources.\r\n * @returns Next text and flipper icon.\r\n */\r\n private readonly _renderNext = (paginationNextText: string) => {\r\n return (\r\n <div className='msc-pagination__next'>\r\n <span className='next-text'>{paginationNextText}</span>\r\n <span className='ms-search-result__pagination-right' aria-hidden='true' />\r\n </div>\r\n );\r\n };\r\n\r\n private isInViewport = () => {\r\n const bounding = this.refinersRef.current?.getBoundingClientRect();\r\n const refinerMenu =\r\n MsDyn365.isBrowser && window && (document.querySelector('.ms-search-result-container__refine-menu') as HTMLElement);\r\n const refinerMenuHeight = refinerMenu ? refinerMenu.offsetHeight : 0;\r\n const categoryBanners = MsDyn365.isBrowser && window && document.getElementsByClassName('category-banner');\r\n\r\n const HamburgerMenuBtn =\r\n MsDyn365.isBrowser && window && (document.getElementsByClassName('ms-header__nav-icon msc-btn')[0] as HTMLElement);\r\n // const contentBlock =\r\n // MsDyn365.isBrowser &&\r\n // window &&\r\n // document.getElementsByClassName('ms-content-block category-banner').length &&\r\n // (document.getElementsByClassName('ms-content-block category-banner')[\r\n // document.getElementsByClassName('ms-content-block category-banner').length - 1\r\n // ] as HTMLElement);\r\n const isHamburgerMenuBtn = HamburgerMenuBtn ? HamburgerMenuBtn.offsetHeight : 0;\r\n if (\r\n !categoryBanners ||\r\n !categoryBanners.length ||\r\n (categoryBanners && categoryBanners.length && document.getElementsByClassName('no-image-categories').length)\r\n ) {\r\n //for plps desktop\r\n if (isHamburgerMenuBtn) {\r\n return bounding && bounding.top + 66 + 40 >= refinerMenuHeight;\r\n } else {\r\n return bounding && bounding.top + 66 >= refinerMenuHeight;\r\n }\r\n } else {\r\n //for clps desktop\r\n if (isHamburgerMenuBtn) {\r\n if (MsDyn365.isBrowser && window && window.innerWidth <= 426) {\r\n return bounding && bounding.top + 190 >= refinerMenuHeight;\r\n }\r\n return bounding && bounding.top + 100 >= refinerMenuHeight;\r\n } else {\r\n return bounding && bounding.top >= refinerMenuHeight;\r\n }\r\n }\r\n };\r\n\r\n /* VSI Customization - START - 29/10/20 */\r\n /* Sticky Navigation function added */\r\n private _mainMenuScroll = (): void => {\r\n if (this.isInViewport()) {\r\n if (MsDyn365.isBrowser && window && window.innerWidth <= 426 && this.lastChangedScrollStateMobile) {\r\n const now = new Date();\r\n if (now.getTime() - this.lastChangedScrollStateMobile.getTime() <= 500) {\r\n return;\r\n }\r\n }\r\n this.setState({\r\n scrollClass: false\r\n });\r\n } else if (!this.state.scrollClass) {\r\n if (MsDyn365.isBrowser && window && window.innerWidth <= 426) {\r\n this.lastChangedScrollStateMobile = new Date();\r\n }\r\n this.setState({\r\n scrollClass: true\r\n });\r\n }\r\n };\r\n /* VSI Customization - END - 29/10/20 */\r\n}\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { Module, Node } from '@msdyn365-commerce-modules/utilities';\r\nimport React, { useEffect, useState } from 'react';\r\nimport { ModulesStateShareInput } from '../../themes/dobbies/actions/modules-state-share-action';\r\nimport DobbiesModal from '../../themes/dobbies/views/custom-components/dobbies-modal';\r\nimport { ISearchResultModalViewProps } from './components';\r\nimport MsDyn365 from '@msdyn365-commerce/core';\r\nimport * as Msdyn365 from '@msdyn365-commerce/core';\r\nimport {\r\n // GridSize,\r\n ICategoryHierarchyViewProps,\r\n IRefineMenuViewProps,\r\n ISearchResultContainerViewProps,\r\n ISortByViewProps,\r\n ITitleViewProps\r\n} from './dobbies-search-result-container';\r\nimport Button from 'reactstrap/lib/Button';\r\n\r\nconst SearchResultContainerView: React.FC<ISearchResultContainerViewProps> = props => {\r\n const {\r\n data: {\r\n category: { result: currentCategory }\r\n },\r\n SearchResultContainer,\r\n products,\r\n ProductsContainer,\r\n ProductSectionContainer,\r\n choiceSummary,\r\n isMobile,\r\n modalToggle,\r\n searchResultModal,\r\n TitleViewProps,\r\n refineMenu,\r\n categoryHierarchy,\r\n sortByOptions,\r\n CategoryNavContainer,\r\n RefineAndProductSectionContainer,\r\n errorMessage,\r\n FeatureSearchContainer,\r\n similarLookProduct,\r\n slots: { browse },\r\n // resources: { browseButtonText },\r\n pagination,\r\n refinersRef\r\n } = props;\r\n const [showModal, setShowModal] = useState(false); /* VSI-Customization -- START showModal Hook for managing state of showModal */\r\n const [categoryTitle, SetCategoryTitle] = useState<string | undefined>(); // Following hook is used to store category name\r\n const [shouldShowMoreRefiners, setShouldShowMoreRefiners] = useState(false);\r\n // const { category } = props.data;\r\n // const categoryName = category && category.result && category.result.Name;\r\n\r\n useEffect(() => {\r\n document.addEventListener('keydown', (e: KeyboardEvent) => {\r\n if (e.key.toLocaleLowerCase() === 'escape') {\r\n if (showModal) {\r\n setShowModal(!showModal);\r\n }\r\n }\r\n });\r\n // Store categoryName in state data action to display it in category header\r\n if (categoryTitle === undefined) {\r\n const currentCategoryName = currentCategory && currentCategory.Name ? currentCategory.Name : '';\r\n props.context.actionContext.update(new ModulesStateShareInput(), { categoryName: currentCategoryName });\r\n SetCategoryTitle(currentCategoryName);\r\n }\r\n }, [showModal]);\r\n\r\n const isClickInsideElementByClassName = (className: string, event: MouseEvent): boolean => {\r\n let target: EventTarget | null = event.target;\r\n while (target && target !== document) {\r\n if ((target as Element).classList && (target as Element).classList.contains(className)) {\r\n return true;\r\n }\r\n target = (target as Node).parentNode;\r\n }\r\n return false;\r\n };\r\n\r\n useEffect(() => {\r\n document.body.addEventListener(\r\n 'click',\r\n evt => {\r\n const filtersDivs = document.getElementsByClassName('new-filter__filter-section');\r\n if (filtersDivs && filtersDivs.length) {\r\n if (\r\n !isClickInsideElementByClassName('new-filter__filter-section', evt) &&\r\n !isClickInsideElementByClassName('ms-product-search-result__item', evt)\r\n ) {\r\n if (props.onMoreFiltersClicked) {\r\n props.onMoreFiltersClicked(undefined, false, true);\r\n }\r\n }\r\n }\r\n },\r\n true\r\n );\r\n }, []);\r\n const modalTitle = (): JSX.Element => {\r\n const { category } = props.data;\r\n const categoryName = category && category.result && category.result.Name;\r\n const handleShowModal = () => setShowModal(!showModal);\r\n return (\r\n <Node tag='div' className='view-all-popup-header'>\r\n <Node tag='span' className='title-text'>\r\n {categoryName}\r\n </Node>\r\n <div className='header-close-button' onClick={handleShowModal} role='button'>\r\n <i className='msc-modal__close-button' />\r\n </div>\r\n </Node>\r\n );\r\n };\r\n\r\n const modalFooter = (): JSX.Element => {\r\n const handleShowModal = () => setShowModal(!showModal);\r\n return <div className='close-button' role='button' onClick={handleShowModal} />;\r\n };\r\n const _modalToggle = () => {\r\n setShowModal(!showModal);\r\n };\r\n const renderToggle = (slotBrowse: React.ReactNode): JSX.Element | undefined => {\r\n // const handleShowModal = () => setShowModal(!showModal);\r\n return (\r\n <>\r\n <div className='category-list-mobile'>{/* <button onClick={handleShowModal}>{browseButtonText}</button> */}</div>\r\n <DobbiesModal\r\n className='modal ms-dobbies-browse'\r\n isOpen={showModal}\r\n modalBodySlots={browse}\r\n onModalToggle={_modalToggle}\r\n modalTitle={modalTitle()}\r\n modalFooter={modalFooter()}\r\n />\r\n </>\r\n );\r\n };\r\n const redirectUrl = props.data.products.result!.products[0].ExtensionProperties?.find(item => item.Key === 'RedirectURL');\r\n let shouldRedirect = false;\r\n if (props.data.products.result!.count === 0 && redirectUrl && redirectUrl.Value!.StringValue) {\r\n shouldRedirect = true;\r\n }\r\n const isSearchPage = props.context.request.query?.q;\r\n let hasContentBlockTitle = false;\r\n if (MsDyn365.isBrowser && window) {\r\n const categoryBanners = document.getElementsByClassName('ms-content-block category-banner');\r\n if (categoryBanners && categoryBanners.length) {\r\n const contentBlockTitleDivs = document.getElementsByClassName('ms-content-block__title');\r\n if (contentBlockTitleDivs && contentBlockTitleDivs.length && contentBlockTitleDivs[0].innerHTML) {\r\n hasContentBlockTitle = true;\r\n }\r\n }\r\n }\r\n\r\n /* VSI-Customization -- END */\r\n // let collectionTitle: string | undefined = '';\r\n // if (props.context && props.context.request && props.context.request.query && props.context.request.query.q) {\r\n // collectionTitle = `\"${props.context.request.query.q}\"`;\r\n // } else {\r\n // collectionTitle = undefined;\r\n // }\r\n if (isMobile) {\r\n return !shouldRedirect ? (\r\n <Module {...SearchResultContainer}>\r\n {/* {!collectionTitle && <h1 className='top-title'>{categoryName} </h1>} */}\r\n {/* {renderOutOfStockBtn(props)} */}\r\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\r\n {(isSearchPage || !hasContentBlockTitle) && TitleViewProps && renderTitleAndProductCount(TitleViewProps, props)}\r\n {/* {TitleViewProps && renderTitleAndProductCount(TitleViewProps, props)} */}\r\n {/* VSI-Customization -- START Render Browse Module for Mobile view */}\r\n {renderToggle(browse)}\r\n {/* VSI-Customization -- END */}\r\n {modalToggle}\r\n {createSearchResultModal(\r\n props,\r\n searchResultModal,\r\n refineMenu,\r\n sortByOptions,\r\n isMobile,\r\n shouldShowMoreRefiners,\r\n setShouldShowMoreRefiners\r\n )}\r\n <div className='sticky-check' ref={refinersRef}>\r\n {renderRefiner(props, refineMenu, browse, false, shouldShowMoreRefiners, setShouldShowMoreRefiners)}\r\n </div>\r\n {sortByOptions && renderSort(sortByOptions)}\r\n {choiceSummary}\r\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n {pagination}\r\n </Module>\r\n ) : (\r\n <></>\r\n );\r\n }\r\n return !shouldRedirect ? (\r\n <Module {...SearchResultContainer}>\r\n {/* {!collectionTitle && <h1 className='top-title'>{categoryName} </h1>} */}\r\n <Node {...CategoryNavContainer}>\r\n {/* {renderOutOfStockBtn(props)} */}\r\n {/* {outOfStock && renderOOSBtn(props)} */}\r\n {categoryHierarchy && renderCategoryHierarchy(categoryHierarchy)}\r\n {(isSearchPage || !hasContentBlockTitle) && TitleViewProps && renderTitleAndProductCount(TitleViewProps, props)}\r\n </Node>\r\n <Node {...RefineAndProductSectionContainer} ref={refinersRef}>\r\n <div className='sticky-check' ref={refinersRef}>\r\n {renderRefiner(props, refineMenu, browse, isMobile, shouldShowMoreRefiners, setShouldShowMoreRefiners)}\r\n </div>\r\n <Node {...ProductSectionContainer}>\r\n {choiceSummary}\r\n {sortByOptions && renderSort(sortByOptions)}\r\n <Node {...FeatureSearchContainer}>{similarLookProduct}</Node>\r\n <Node {...ProductsContainer}>\r\n {errorMessage}\r\n {products}\r\n </Node>\r\n {pagination}\r\n </Node>\r\n </Node>\r\n </Module>\r\n ) : (\r\n <></>\r\n );\r\n};\r\n\r\nconst createSearchResultModal = (\r\n oosProps: ISearchResultContainerViewProps,\r\n modalProps: ISearchResultModalViewProps,\r\n refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps,\r\n isMobile: Boolean,\r\n shouldShowMoreRefiners: boolean,\r\n setShouldShowMoreRefiners: React.Dispatch<React.SetStateAction<boolean>>\r\n): JSX.Element => {\r\n return React.cloneElement(\r\n modalProps.modal,\r\n {},\r\n modalProps.modalHeader,\r\n createModalBody(oosProps, modalProps, refineMenu, sortByDropDown, isMobile, shouldShowMoreRefiners, setShouldShowMoreRefiners),\r\n modalProps.modalFooter\r\n );\r\n};\r\n\r\nconst createModalBody = (\r\n oosProps: ISearchResultContainerViewProps,\r\n props: ISearchResultModalViewProps,\r\n refineMenu: IRefineMenuViewProps,\r\n sortByDropDown: ISortByViewProps,\r\n isMobile: Boolean,\r\n shouldShowMoreRefiners: boolean,\r\n setShouldShowMoreRefiners: React.Dispatch<React.SetStateAction<boolean>>\r\n): JSX.Element | null => {\r\n if (sortByDropDown) {\r\n return React.cloneElement(\r\n props.modalBody,\r\n {},\r\n renderSort(sortByDropDown),\r\n renderRefiner(oosProps, refineMenu, null, isMobile, shouldShowMoreRefiners, setShouldShowMoreRefiners)\r\n );\r\n }\r\n return null;\r\n};\r\n\r\n// const _getViewport = (props: ISearchResultContainerViewProps): GridSize => {\r\n// const { context } = props;\r\n\r\n// // Always render in mobile viewport on a mobile device\r\n// if (context.request && context.request.device && context.request.device.Type === 'Mobile') {\r\n// return 'xs';\r\n// }\r\n\r\n// if (MsDyn365.isBrowser && window.innerWidth) {\r\n// const gridSettings = context.request.gridSettings;\r\n// if (gridSettings) {\r\n// if (gridSettings.xs && window.innerWidth <= gridSettings.xs.w) {\r\n// return 'xs';\r\n// } else if (gridSettings.sm && window.innerWidth <= gridSettings.sm.w) {\r\n// return 'sm';\r\n// } else if (gridSettings.md && window.innerWidth <= gridSettings.md.w) {\r\n// return 'md';\r\n// } else if (gridSettings.lg && window.innerWidth <= gridSettings.lg.w) {\r\n// return 'lg';\r\n// }\r\n// return 'xl';\r\n// }\r\n// }\r\n\r\n// return 'xs';\r\n// };\r\nconst _getScreenSize = (ctx: Msdyn365.ICoreContext): number => {\r\n if (MsDyn365.isBrowser && window && window.innerWidth) {\r\n const gridSettings = ctx.request.gridSettings;\r\n if (gridSettings) {\r\n if (window.innerWidth < 768) {\r\n // mobile\r\n return 1;\r\n } else if (window.innerWidth < 1280) {\r\n // iPad\r\n return 2;\r\n } else if (window.innerWidth >= 1280) {\r\n // Desktop\r\n return 3;\r\n } else {\r\n return 3;\r\n }\r\n // else if (gridSettings.lg && window.innerWidth <= gridSettings.lg.w) {\r\n // // Desktop\r\n // return 3;\r\n // }\r\n }\r\n }\r\n\r\n return 3; // desktop\r\n};\r\nconst renderRefiner = (\r\n viewProps: ISearchResultContainerViewProps,\r\n props: IRefineMenuViewProps,\r\n slotBrowse: React.ReactNode[] | null,\r\n isMobile: Boolean,\r\n shouldShowMoreRefiners: boolean,\r\n setShouldShowMoreRefiners: React.Dispatch<React.SetStateAction<boolean>>\r\n): JSX.Element | null => {\r\n const { refiners, endingRefiners, RefineMenuContainer, RefinerSectionContainer } = props;\r\n let endingRefinersToShow = endingRefiners;\r\n const screenSize = _getScreenSize(viewProps.context);\r\n // const maxRefinersColumns = _getViewport(viewProps) !== 'xl' && _getViewport(viewProps) !== 'lg' ? 4 : 5;\r\n let maxRefinersColumns = screenSize === 3 ? 5 : screenSize === 2 ? 4 : 0;\r\n maxRefinersColumns = screenSize === 1 ? 2 : maxRefinersColumns;\r\n if (endingRefiners && endingRefiners?.length > maxRefinersColumns && !shouldShowMoreRefiners) {\r\n endingRefinersToShow = endingRefiners.slice(0, maxRefinersColumns);\r\n }\r\n\r\n if (refiners && endingRefiners) {\r\n console.log('Inside Refiners Category listing');\r\n return (\r\n <>\r\n <Node {...RefinerSectionContainer}>\r\n {refiners.map((submenu, index) => (\r\n <React.Fragment key={index}>{submenu}</React.Fragment>\r\n ))}\r\n\r\n <div className={isMobile ? '' : `refiner-add-remove`}>\r\n <Node {...RefineMenuContainer}>\r\n {console.log('Inside Refiners Category listing Rendering Category Listing')}\r\n <div className='category-listing'>{slotBrowse && slotBrowse}</div>\r\n <div className='new-filter__filter-section'>\r\n <div className={`filter-list ${shouldShowMoreRefiners ? 'filter-more' : 'filter-less'}`}>\r\n {endingRefinersToShow?.map((submenu, index) => (\r\n <React.Fragment key={index}>{submenu}</React.Fragment>\r\n ))}\r\n </div>\r\n {endingRefiners && endingRefiners.length > maxRefinersColumns && (\r\n <Button\r\n className={`more-filters-btn ${shouldShowMoreRefiners ? 'filter-minus' : 'filter-plus'}`}\r\n onClick={() => {\r\n setShouldShowMoreRefiners(!shouldShowMoreRefiners);\r\n if (viewProps.onMoreFiltersClicked) {\r\n viewProps.onMoreFiltersClicked(undefined, false, true);\r\n }\r\n }}\r\n >\r\n {shouldShowMoreRefiners ? 'Less filters' : 'More filters'}\r\n\r\n <span className='icon'></span>\r\n </Button>\r\n )}\r\n </div>\r\n </Node>\r\n </div>\r\n </Node>\r\n </>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nconst renderSort = (props: ISortByViewProps): JSX.Element | null => {\r\n const { SortingContainer, sortByDropDown } = props;\r\n if (sortByDropDown) {\r\n return <Node {...SortingContainer}>{sortByDropDown}</Node>;\r\n }\r\n return null;\r\n};\r\n\r\n// const renderOOSBtn = (props: ISearchResultContainerViewProps) : JSX.Element | null => {\r\n// return (\r\n// <Node className=''>\r\n// {outOfStock}\r\n// </Node>\r\n// )\r\n// }\r\n\r\n// const renderOutOfStockBtn = (props: ISearchResultContainerViewProps): JSX.Element | null => {\r\n// const {showOutOfStock,hideOutOfStock, outOfStockStatus, isMobile, resources} = props;\r\n// return (\r\n// <Node className={isMobile ? 'out-of-stock-mob-container' : 'out-of-stock-container'}>\r\n// <p className='out-of-stock-text'>{resources.outOfStockNavText}</p>\r\n// <Node className='out-of-stock-btn-container'>\r\n// <button className={outOfStockStatus ? 'out-of-stock-active' : 'out-of-stock-hide'} onClick={showOutOfStock}>{resources.showOutofStockBtn}</button>\r\n// <button className={!outOfStockStatus ? 'out-of-stock-active' : 'out-of-stock-hide'} onClick={hideOutOfStock}>{resources.hideOutOfStockBtn}</button>\r\n// </Node>\r\n// {/* <button onClick={toggleOutOfStock}>Out Of Stock</button> */}\r\n// </Node>\r\n// )\r\n// }\r\n\r\nconst renderCategoryHierarchy = (props: ICategoryHierarchyViewProps): JSX.Element | null => {\r\n const { CategoryHierarchyContainer, categoryHierarchyList, categoryHierarchySeparator } = props;\r\n if (categoryHierarchyList) {\r\n return (\r\n <Node {...CategoryHierarchyContainer}>\r\n {categoryHierarchyList.map((category, index) => (\r\n <React.Fragment key={index}>\r\n {category}\r\n {categoryHierarchyList && categoryHierarchyList[index + 1] && categoryHierarchySeparator}\r\n </React.Fragment>\r\n ))}\r\n </Node>\r\n );\r\n }\r\n\r\n return null;\r\n};\r\n\r\nconst renderTitleAndProductCount = (props: ITitleViewProps, srcProps: ISearchResultContainerViewProps): JSX.Element | null => {\r\n const { title, TitleContainer } = props;\r\n const isSearchPage = srcProps.context.request.query?.q;\r\n if (title) {\r\n return (\r\n <Node {...TitleContainer}>\r\n {isSearchPage ? (\r\n <h2>\r\n {title.titlePrefix} {title.titleText} - {title.titleCount}\r\n </h2>\r\n ) : (\r\n <h1>{title.titleText}</h1>\r\n )}\r\n </Node>\r\n );\r\n }\r\n return null;\r\n};\r\n\r\nexport default SearchResultContainerView;\r\n","/*!\r\n * Copyright (c) Microsoft Corporation.\r\n * All rights reserved. See LICENSE in the project root for license information.\r\n */\r\n\r\n/* eslint-disable no-duplicate-imports */\r\nimport { IProductRefinerHierarchy } from '@msdyn365-commerce/commerce-entities';\r\nimport {\r\n CacheType,\r\n createObservableDataAction,\r\n IAction,\r\n IActionContext,\r\n IActionInput,\r\n IAny,\r\n ICreateActionContext,\r\n IGeneric\r\n} from '@msdyn365-commerce/core';\r\nimport { ProductPrice, ProductRefinerValue, ProductSearchResult, SimpleProduct, SortingInfo } from '@msdyn365-commerce/retail-proxy';\r\nimport { observable } from 'mobx';\r\n\r\nimport { listPageType } from './actions';\r\n\r\n/**\r\n * ListPageState class.\r\n */\r\nexport class ListPageState {\r\n @observable public activeFilters: ProductRefinerValue[] | null = null;\r\n\r\n @observable public activeProducts: ProductSearchResult[] = [];\r\n\r\n @observable public sortingCritera: SortingInfo | null = null;\r\n\r\n @observable public currentPageNumber: number | null = null;\r\n\r\n @observable public refiners: IProductRefinerHierarchy[] | null = null;\r\n\r\n @observable public totalProductCount: number | undefined;\r\n\r\n @observable public pageSize: number = 10;\r\n\r\n @observable public pageType: listPageType = 'Unknown';\r\n\r\n @observable public featureProduct: SimpleProduct | null = null;\r\n\r\n @observable public productPrices: ProductPrice[] | undefined = [];\r\n}\r\n\r\n/**\r\n * ListPageStateInput - action input.\r\n */\r\nexport class ListPageStateInput implements IActionInput {\r\n public getCacheKey = () => 'ListPageState';\r\n\r\n public getCacheObjectType = () => 'ListPageState';\r\n\r\n public dataCacheType = (): CacheType => 'request';\r\n}\r\n\r\nexport async function listPageStateAction(input: ListPageStateInput, ctx: IActionContext): Promise<ListPageState> {\r\n return new ListPageState();\r\n}\r\n\r\n/**\r\n * Create new input for create action.\r\n * @param inputData\r\n */\r\nexport const createListPageInput = (inputData: ICreateActionContext<IGeneric<IAny>>): IActionInput => {\r\n return new ListPageStateInput();\r\n};\r\n\r\n/**\r\n * ListPageState - create action.\r\n */\r\nexport default createObservableDataAction<ListPageState>({\r\n action: <IAction<ListPageState>>listPageStateAction,\r\n input: createListPageInput\r\n});\r\n","/*---------------------------------------------------------------------------------------------\r\n * Copyright (c) Microsoft Corporation. All rights reserved.\r\n * Licensed under the MIT License. See License.txt in the project root for license information.\r\n *--------------------------------------------------------------------------------------------*/\r\nimport {\r\n CacheType,\r\n createObservableDataAction,\r\n IAction,\r\n IActionContext,\r\n IActionInput,\r\n IAny,\r\n ICreateActionContext,\r\n IGeneric\r\n} from '@msdyn365-commerce/core';\r\n\r\n/**\r\n * LoyaltyCardState Input Action\r\n */\r\n\r\nexport class ModulesStateShareInput implements IActionInput {\r\n // TODO: Determine if the results of this get action should cache the results and if so provide\r\n // a cache object type and an appropriate cache key\r\n public getCacheKey = () => `modulesSharedState`;\r\n public getCacheObjectType = () => 'modulesSharedState';\r\n public dataCacheType = (): CacheType => 'request';\r\n}\r\n\r\n// TODO: Create a data model here or import one to capture the response of the action\r\nexport interface IModulesSharedState {\r\n customerLoyaltyTierId: string | undefined;\r\n categoryName: string | undefined;\r\n}\r\n\r\n/**\r\n * TODO: Use this function to create the input required to make the action call\r\n */\r\nconst createInput = (inputData: ICreateActionContext<IGeneric<IAny>>): IActionInput => {\r\n return new ModulesStateShareInput();\r\n};\r\n/**\r\n * TODO: Use this function to call your action and process the results as needed\r\n */\r\nexport async function sampleStateAction(input: ModulesStateShareInput, ctx: IActionContext): Promise<IModulesSharedState> {\r\n return { customerLoyaltyTierId: undefined, categoryName: undefined };\r\n}\r\n\r\n/**\r\n * SampleState - create action\r\n */\r\nexport default createObservableDataAction<IModulesSharedState>({\r\n action: <IAction<IModulesSharedState>>sampleStateAction,\r\n input: createInput\r\n});\r\n","import { Modal, ModalBody, ModalFooter, ModalHeader } from '@msdyn365-commerce-modules/utilities';\r\nimport * as React from 'react';\r\n\r\nexport interface IDobbiesModalProps {\r\n modalBodySlots?: React.ReactNode[];\r\n modalBodyElement?: JSX.Element;\r\n isOpen: boolean;\r\n className: string;\r\n modalTitle: JSX.Element;\r\n modalFooter: JSX.Element;\r\n onModalToggle?(): void;\r\n}\r\n\r\nconst DobbiesModal: React.FC<IDobbiesModalProps> = (props: IDobbiesModalProps) => {\r\n return (\r\n <Modal\r\n isOpen={props.isOpen}\r\n zIndex={1050}\r\n applicationNode={'renderPage'}\r\n autoFocus={true}\r\n toggle={props.onModalToggle}\r\n className={`dobbies-modal ${props.className}`}\r\n >\r\n {props.modalTitle && <ModalHeader> {props.modalTitle}</ModalHeader>}\r\n {props.modalBodySlots && <ModalBody className='dobbies-modal-body'>{props.modalBodySlots}</ModalBody>}\r\n {props.modalBodyElement && <ModalBody className='dobbies-modal-body'>{props.modalBodyElement}</ModalBody>}\r\n {props.modalFooter && <ModalFooter>{props.modalFooter}</ModalFooter>}\r\n </Modal>\r\n );\r\n};\r\n\r\nexport default DobbiesModal;\r\n","const binding = { modules: {}, dataActions: {} };\n\n const registerActionId = (actionPath) => {\n if (binding.dataActions[actionPath] &&\n binding.dataActions[actionPath].default &&\n binding.dataActions[actionPath].default.prototype &&\n binding.dataActions[actionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[actionPath].default.prototype.id] = binding.dataActions[actionPath];\n } else {\n Object.keys(binding.dataActions[actionPath] || {}).forEach(exportName => {\n if (binding.dataActions[actionPath][exportName] &&\n binding.dataActions[actionPath][exportName].prototype &&\n binding.dataActions[actionPath][exportName].prototype.Action) {\n binding.dataActions[binding.dataActions[actionPath][exportName].prototype.id] = binding.dataActions[actionPath][exportName];\n }\n })\n }\n };\n\n const registerSanitizedActionPath = (sanitizedActionPath, dataAction) => {\n if (process.env.NODE_ENV === 'development') {\n if (!dataAction.default) {\n throw new Error('Data action path does not have a default export');\n }\n if (!(dataAction.default.prototype.id && binding.dataActions[dataAction.default.prototype.id]) || !binding.dataActions[sanitizedActionPath]) {\n binding.dataActions[sanitizedActionPath] = dataAction;\n }\n } else {\n binding.dataActions[sanitizedActionPath] = dataAction;\n if (!binding.dataActions[sanitizedActionPath].default) {\n throw new Error('Data action path ' + sanitizedActionPath + ' does not have a default export');\n }\n binding.dataActions[sanitizedActionPath].default.prototype.RegistrationId = sanitizedActionPath;\n if (binding.dataActions[sanitizedActionPath].default.prototype.id) {\n binding.dataActions[binding.dataActions[sanitizedActionPath].default.prototype.id] = sanitizedActionPath;\n }\n }\n };\n \n\n (binding.modules['dobbies-search-result-container'] = {\n c: () => require('partner/modules/dobbies-search-result-container/dobbies-search-result-container.tsx'),\n $type: 'containerModule',\n da: [{name:'category', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-current-category', runOn: 0},{name:'categoryHierarchy', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-current-category-hierarchy', runOn: 0},{name:'featureProduct', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-selected-variant', runOn: 0},{name:'featureState', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-feature-state', runOn: 0},{name:'listPageState', path:'modules/dobbies-search-result-container/list-page-state', runOn: 0},{name:'loyaltyCard', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-loyalty-card', runOn: 0},{name:'modulesSharedState', path:'themes/dobbies/actions/modules-state-share-action', runOn: 0},{name:'products', path:'modules/dobbies-search-result-container/actions/get-full-products-by-collection', runOn: 0},{name:'refiners', path:'modules/dobbies-search-result-container/actions/get-refiners-for-collection', runOn: 0},{name:'searchConfiguration', path:'modules/dobbies-search-result-container/actions/get-mapped-search-configuration', runOn: 0},{name:'wishlists', path:'@msdyn365-commerce-modules/retail-actions/dist/lib/get-wishlist-by-customer-id', runOn: 1}],\n \n iNM: false,\n ns: '__local__',\n n: 'dobbies-search-result-container',\n p: '__local__',\n \n pdp: '',\n \n \n md: 'src/modules/dobbies-search-result-container'\n });\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-current-category';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-current-category');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-current-category-hierarchy';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-current-category-hierarchy');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-feature-state';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-feature-state');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-loyalty-card';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-loyalty-card');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-selected-variant';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-selected-variant');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = '@msdyn365-commerce-modules/retail-actions/dist/lib/get-wishlist-by-customer-id';\n let dataAction = require('@msdyn365-commerce-modules/retail-actions/dist/lib/get-wishlist-by-customer-id');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = 'modules/dobbies-search-result-container/actions/get-full-products-by-collection';\n let dataAction = require('partner/modules/dobbies-search-result-container/actions/get-full-products-by-collection');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = 'modules/dobbies-search-result-container/actions/get-mapped-search-configuration';\n let dataAction = require('partner/modules/dobbies-search-result-container/actions/get-mapped-search-configuration');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = 'modules/dobbies-search-result-container/actions/get-refiners-for-collection';\n let dataAction = require('partner/modules/dobbies-search-result-container/actions/get-refiners-for-collection');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = 'modules/dobbies-search-result-container/list-page-state';\n let dataAction = require('partner/modules/dobbies-search-result-container/list-page-state');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n {\n const sanitizedActionPath = 'themes/dobbies/actions/modules-state-share-action';\n let dataAction = require('partner/themes/dobbies/actions/modules-state-share-action');\n registerSanitizedActionPath(sanitizedActionPath, dataAction);\n }\n \n\n \n window.__bindings__ = window.__bindings__ || {};\n window.__bindings__.modules = {\n ...window.__bindings__.modules || {},\n ...binding.modules\n };\n \n window.__bindings__.dataActions = {\n ...window.__bindings__.dataActions || {},\n ...binding.dataActions\n };\n export const viewDictionary = {};\n viewDictionary['__local__|__local__|modules|dobbies-search-result-container|dobbies-search-result-container'] = {\n c: () => require('partner/modules/dobbies-search-result-container/dobbies-search-result-container.view.tsx'),\n cn: '__local__-__local__-dobbies-search-result-container'\n };\nwindow.__bindings__ = window.__bindings__ || {};\nwindow.__bindings__.viewDictionary = {\n ...window.__bindings__.viewDictionary || {},\n ...viewDictionary\n };","module.exports = React;","module.exports = ReactDOM;"],"names":["BaseCollectionInput","constructor","pageType","apiSettings","queryResultSettings","refiners","category","searchText","includeAttributes","isUpdateRefinerPanel","locale","catalogId","getCacheKey","_objectSpread","this","Paging","toJS","Sorting","buildCacheKey","map","refiner","RefinerRecordId","LeftValueBoundString","RightValueBoundString","convertToString","getCacheObjectType","dataCacheType","createBaseCollectionInput","args","inputClassConstuctor","requestContext","urlTokens","query","categoryId","QueryResultSettingsProxy","fromInputData","QueryResultSettings","queryRefiners","hydrateRefinersFromUrl","inputData","config","undefined","_inputData$config","updateRefinerPanel","getUpdateRefinerPanel","getCatalogId","sorting","Columns","JSON","parse","decodeURIComponent","itemId","q","productId","recommendation","stringify","ProductId","Recommendation","Error","ProductListInventoryFilteringOptions","GetFullProductsByCollectionInput","length","isOutOfStock","product","channelInventoryConfiguration","ArrayExtensions","hasElements","AttributeValues","attribute","RecordId","InventoryProductAttributeRecordId","TextValue","InventoryOutOfStockAttributeValueText","returnProductsBasedOnInventoryInformation","products","context","ObjectExtensions","isNullOrUndefined","app","productListInventoryDisplay","HideOOS","filteredProducts","push","filterOutOfStockProducts","SortOOS","inStockProducts","outOfStockProducts","concat","sortsProductsBasedOnAvailability","updateRatings","ratingsData","minNumOfStars","starCounts","star1Count","star2Count","star3Count","star4Count","star5Count","totalRatingsCount","y","countToSubstract","reviewsCount","totalScore","z","averageRating","async","returnProducts","productSearchResults","metadataCount","productSearchResultsWithImages","productSearchResult","newImageUrl","generateProductImageUrl","PrimaryImageUrl","inventoryLevel","InventoryLevels","threshold","enableStockCheck","count","getInventoryConfigurationAsync","callerContext","productsBasedOnInventory","element","inventoryRanges","requests","p","pid","requestUrl","ratingsReviewsEndpoint","rnr","id","sendRequest","allRatingsResponse","Promise","all","rr","data","numberOfStarReviewsToShow","parseInt","AverageRating","TotalRatings","getProductsWithRatingsUpdated","e","console","log","channelInventoryConfigurationId","actionDataAction","createObservableDataAction","action","input","promise","searchProductId","searchCriteriaInput","Context","ChannelId","channelId","CatalogId","Refinement","IncludeAttributes","SkipVariantExpansion","uc_param","replace","CategoryIds","SearchCondition","searchByCriteriaAsync","searchObject","Number","isNaN","RecommendationListId","Ids","_promise$metadata$cou","MsDyn365","isBrowser","update","ListPageStateInput","totalProductCount","metadata","activeFilters","Top","itemsPerPage","skip","Skip","sortOptions","sortByOptionRelevanceDesc","sortByOptionRatingAsc","sortByOptionRatingDesc","sortByOptionNameAsc","sortByOptionNameDesc","sortByOptionPriceAsc","sortByOptionPriceDesc","sortByOptionBestSelling","sortByOptionNewScore","sortByOptionTrendingScore","MappedSearchInput","getMappedSearchConfiguration","ctx","getSearchConfigurationAsync","then","searchConfiguration","ProductSortColumns","sortColumn","key","ColumnName","toUpperCase","IsDescending","telemetry","warning","filter","Boolean","createInput","getMappedSearchConfigurationDataAction","DefaultValues","getProductRefinerHierarchy","searchCriteria","getProductSearchRefinersAsync","productRefiners","trace","result","productRefiner","RefinersByCollectionInput","defaultCategoryIdValue","defaultProductIdValue","compressedRefinerKeys","compressedRefinerArray","parseQueryParam","compressedRefiner","parsedRefiner","forEach","refinerKey","index","_unused","buildListPageUrl","fullUrl","sortingColumns","skipCount","searchParams","delete","sortedRefiners","sort","first","second","set","compressedRefiners","compressRefiners","href","toString","getCurrentUrl","window","URL","location","url","expandRefinersCount","SearchResultContainer","SearchResultContainer_1","React","props","state","_this$props$context$r7","super","sortByDropdownOptions","value","resources","_pageType","request","expandrefinerCount","defaultPageNumber","checkDifference","array1","array2","i","_getActivePrice","priceAffiliations","AffiliationId","LoyaltyTierId","AffiliationTypeValue","ReasonCodeLines","CustomerId","ExtensionProperties","listPageState","activeProducts","productRecIds","prod","projectDomain","cart","getCartFromCustomer","actionContext","affliations","AffiliationLines","getActivePricesAsync","Date","activePricesResponse","_products","productPrices","discountLines","priceResp","DiscountLines","prodIds","updatedProducts","setState","showProdPrice","activePrice","find","price","_activePrice$Customer","Price","CustomerContextualPrice","BasePrice","Math","max","TradeAgreementPrice","AdjustedPrice","catch","error","message","exception","debug","getNonClubPlusDiscountPrices","nonClubPlusDiscount","_getSearchResultModal","SearchResultModal","modalCloseButtonText","modalTitle","isOpen","modalIsOpen","returnRef","_modalToggleRef","onModalToggle","_toggleModal","_getCollectionTitle","_this$props$context$r","collectionTitle","getFriendlyName","NameTranslations","Name","productCountNumber","productCountText","format","numberOfProducts","oneProduct","isSearchPage","pageName","telemetryPageName","toLowerCase","titlePrefix","Title","className","text","searchTextPrefix","titleText","titleCount","TitleContainer","title","_getCategoryHierarchy","categoryHierarchy","CategoryHierarchyContainer","tag","categoryHierarchyList","Link","ariaLabel","categoryLinkAriaLabel","Url","categoryHierarchySeparator","Separator","separator","_getSortingDropDown","activeDropdown","_getCurrentlySelectedOption","sortingState","selectedSortByOption","dropdwonOptions","hideRating","dropdownOption","SortingContainer","sortByDropDown","LabeledDropdown","labelClassname","labelText","sortByDropdownLabel","dropdownId","dropdownClassname","toggleColor","dropdownOptions","selectedOption","onSelectOption","_updateSortByDropdown","ref","_sortAndFilterContainerRef","_getPagination","currentPageNumber","totalItems","previousText","flipperPrevious","nextText","flipperNext","UncontrolledPagination","role","paginationAriaLabel","qsp","items","startingItem","_renderPrev","_renderNext","previousAriaLabel","nextAriaLabel","telemetryContent","toggleRefinersInSameColumn","keyName","isExpanded","isFromMoreFilters","refinersExpandedStateData","expandedStateData","refRow","hasFilterOpened","j","k","m","setInitialSameColumnRefinerDetails","endingRefiners","maxRefinersColumns","_getViewport","filtersNavData","filtersRow","KeyName","refinersRowExpandedStates","filtersKeyName","_getRefineMenu","tempRangeTypeTODO","inputRange","validRefiners","Values","activeRefiners","_getexpandRefinerCount","startingRefinerList","startingRefiners","indexOf","startingRefiner","expandedRefiners","subMenus","productRefinerHierarchy","RefineSubmenu","selectedRefinerValues","refineItemCommonProps","_refineItemCommonProps","minValueSliderThumbAriaLabel","maxValueSliderThumbAriaLabel","onUpdateRefiners","_onUpdateRefiners","urlBuilder","_buildRefinerUrl","isDisabled","isExpandedOnInitialLoad","moduleId","moduleTypeName","typeName","endingSubMenus","onToggle","RefineMenuContainer","RefinerSectionContainer","scrollClass","_getChoiceSummary","selectedRefiners","ChoiceSummary","classNames","clearAllText","FilterActiveText","filterActiveText","label","choiceSummaryLabel","selectedChoices","refinerHierarchy","choiceFormat","choiceRangeValueFormat","onChoiceClicked","_onChoiceClicked","_buildRefinerUrlForChoiceSummary","choiceAriaLabel","_getProducts","_this$props$data$feat","_this$props$data$prod","imageSettings","allowBackNavigation","breaCrumbType","breadcrumbType","allowBack","quickviewslot","slots","quickview","isPriceMinMaxFeatureState","featureState","ProductSearchResultItems","moduleType","quickviewSlot","isPriceMinMaxEnabled","IsEnabled","wishlists","isMobile","loyalty","loyaltyCard","showTilesOnPLP","tilesForPLP","repeatSameTile","maxNumberOfTiles","tileToAppearAfterProducts","notification","history","pushState","_getSortColumnFromSelectedOption","isUpdated","transaction","sortingCritera","option","mappedConfiguration","sortCriteria","activeSortColumn","activeMappedConfig","mappedSearchConfig","itemToggleNotification","updatedRefinementCriteria","getUpdatedRefinementCriteria","newRefinementCriteria","currentRefinementCriteria","clearAll","dropdownElementId","current","dropdownElement","document","getElementById","setTimeout","focus","selectedChoice","choiceClicked","selectedCriterion","isMatchingRefinementCriterion","selectedRefiner","isClearAll","refinerCount","one","two","three","four","paginationPreviousText","paginationNextText","isInViewport","_this$refinersRef$cur","bounding","refinersRef","getBoundingClientRect","refinerMenu","querySelector","refinerMenuHeight","offsetHeight","categoryBanners","getElementsByClassName","HamburgerMenuBtn","isHamburgerMenuBtn","top","innerWidth","_mainMenuScroll","lastChangedScrollStateMobile","getTime","_viewport","device","Type","bind","_updateViewport","pending","lastUrlStr","placeholderTextMax","minLabel","maxLabel","rangeNameFormat","validationErrorNaN","validationErrorNotNumber","validationErrorRange","validationErrorNotRange","getTelemetryObject","friendlyName","_props$data$products$","redirectUrl","item","Key","Value","StringValue","assign","querySorting","pageSize","reaction","_this$props$context$r2","_this$props$context$r3","getCollectionProducts","productResults","enableAffiliationBasedPricing","_listPageState$curren","_listPageState$sortin","_listPageState$active","_this$props$context$r4","_this$props$context$r5","_this$props$context$r6","refinerInput","getCollectionRefinersAction","featureProduct","listPageStateFeature","nameTranslations","nameTranslation","Language","Text","componentDidMount","addEventListener","_this$props$data$list","componentWillUnmount","removeEventListener","render","ItemId","searchProduct","errorText","resultCategoryNotFoundText","resultSearchNotFoundText","productsComponent","featureComponent","FeatureSearchResultItem","searchResultContainerViewProps","TitleViewProps","disableHierarchy","refineMenu","classnames","moduleProps","sortByOptions","pagination","ProductsContainer","ProductSectionContainer","CategoryNavContainer","RefineAndProductSectionContainer","choiceSummary","modalToggle","ModalToggle","innerRef","onClick","searchResultModal","errorMessage","ErrorMessage","FeatureSearchContainer","similarLookProduct","onMoreFiltersClicked","renderView","gridSettings","xs","w","sm","md","lg","__decorate","computed","observable","observer","createSearchResultModal","oosProps","modalProps","shouldShowMoreRefiners","setShouldShowMoreRefiners","modal","modalHeader","createModalBody","modalFooter","modalBody","renderSort","renderRefiner","viewProps","slotBrowse","endingRefinersToShow","screenSize","_getScreenSize","_endingRefinersToShow","slice","Node","Object","submenu","Button","renderCategoryHierarchy","renderTitleAndProductCount","srcProps","_srcProps$context$req","_props$context$reques","currentCategory","browse","showModal","setShowModal","useState","categoryTitle","SetCategoryTitle","useEffect","toLocaleLowerCase","currentCategoryName","ModulesStateShareInput","categoryName","isClickInsideElementByClassName","event","target","classList","contains","parentNode","body","evt","filtersDivs","handleShowModal","_modalToggle","shouldRedirect","hasContentBlockTitle","contentBlockTitleDivs","innerHTML","Module","DobbiesModal","modalBodySlots","ListPageState","listPageStateAction","createListPageInput","sampleStateAction","customerLoyaltyTierId","Modal","zIndex","applicationNode","autoFocus","toggle","ModalHeader","ModalBody","modalBodyElement","ModalFooter","binding","modules","dataActions","registerSanitizedActionPath","sanitizedActionPath","dataAction","default","prototype","RegistrationId","c","require","$type","da","name","path","runOn","iNM","ns","n","pdp","__bindings__","viewDictionary","cn","module","exports","ReactDOM"],"sourceRoot":""}