@vendure/admin-ui-plugin 2.1.6 → 2.1.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/admin-ui/539.d5cfcdff4ce41934.js.map +1 -1
- package/lib/admin-ui/{976.d3ac44aefe298211.js → 976.d934e59ba4861463.js} +14 -14
- package/lib/admin-ui/976.d934e59ba4861463.js.map +1 -0
- package/lib/admin-ui/i18n-messages/pt_BR.json +2 -2
- package/lib/admin-ui/i18n-messages/uk.json +166 -166
- package/lib/admin-ui/index.html +1 -1
- package/lib/admin-ui/{main.993ffd651e48802c.js → main.33a1ecfa53568dcf.js} +2 -2
- package/lib/admin-ui/{main.993ffd651e48802c.js.map → main.33a1ecfa53568dcf.js.map} +1 -1
- package/lib/admin-ui/{runtime.a8ec539c419fc3ea.js → runtime.11c11178386ceeb1.js} +2 -2
- package/lib/admin-ui/{runtime.a8ec539c419fc3ea.js.map → runtime.11c11178386ceeb1.js.map} +1 -1
- package/package.json +4 -4
- package/lib/admin-ui/976.d3ac44aefe298211.js.map +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"976.d3ac44aefe298211.js","mappings":"8rFAKM,SAAUA,GAAYC,EAAmCC,EAAgBC,GAC3E,IAAKF,EACD,MAAO,GAEX,MAAMG,EAAYH,EAAOI,YAAYH,GACrC,IAAkB,IAAdE,EACA,OAAOH,EAIX,OAFaA,EAAOK,OAAO,EAAGF,GACjBH,EAAOK,OAAOF,GAAWD,QAAQD,EAAQC,EAE1D,CCiBM,MAAOI,GACTC,YAAoBC,GAAAC,KAAAD,aAA2B,CAE/CE,mBACI,OAAOD,KAAKD,YAAYG,SACnBD,mBACAE,UAAUC,GAAQA,EAAKC,cAAcC,OACrCC,QAAKC,MAAY,GAC1B,CAEAC,0BACIC,EACAC,EACAC,GAEA,MAAMC,EAAiBb,KAAKD,YAAYe,QAAQC,cAAcL,GACxDM,EAAuBL,EAAqBM,OAAOC,OAAOC,GAAK,EAAIA,EAAEC,OAAOC,QAC5EC,EAAsBtB,KAAKuB,0BAA0BP,EAAsBJ,GAEjF,SAAOY,MAASX,EAAgBS,GAAqBf,QACjDkB,KAAS,GAAIV,iBAAiBW,MACGA,EAAaL,UACpCG,MACIE,EAAaC,IAAIC,GACb5B,KAAKD,YAAYe,QAAQe,wBAAwB,CAC7CC,UAAWf,EAAcgB,GACzBC,cAAeJ,EAAYG,QAElC,EAELE,MAAG,KACmB1B,QAAKoB,KAAI,MAASZ,gBAAeW,qBAChE,EACDD,KAAS,EAAGV,gBAAeW,mBACvB,MAAMQ,EAAWvB,EAAqBuB,SAASP,IAAIQ,IAC/C,MAAMC,EAAYV,EAAaL,OACzBc,EAAEE,aAAaV,IAAI,CAACW,EAAYC,KAC5B,MAAMC,EAASd,EAAaa,GAAOE,QAAQC,KAAKC,GAAKA,EAAEC,OAASN,GAChE,IAAKE,EACD,MAAM,IAAIK,MACN,4CAA4CP,4BAGpD,OAAOE,EAAOT,KAElB,GACN,MAAO,IACAI,EACHC,eAGFK,EAAUf,EAAaC,IAAImB,GAAMA,EAAGL,SAASM,OAAO,CAACC,EAAML,IAAM,IAAIK,KAASL,GAAI,IACxF,OAAO3C,KAAKiD,sBACRlC,EACAmB,EACAO,EACA7B,EACAD,EAAqBuC,gBAAe,GAIpD,CAEA3B,0BAA0BN,EAAmDL,GACzE,OAAOK,EAAOI,UACRG,MACIP,EAAOU,IAAIwB,GACPnD,KAAKD,YAAYe,QACZS,0BAA0B,CACvB6B,QAAMC,KAAgBF,EAAEP,KAAM,KAC9BU,aAAc,CAAC,CAAE1C,eAAcgC,KAAMO,EAAEP,OACvCH,QAASU,EAAE/B,OAAOO,IAAIQ,KAClBiB,QAAMC,KAAgBlB,EAAG,KACzBmB,aAAc,CAAC,CAAE1C,eAAcgC,KAAMT,SAG5C5B,QAAKoB,KAAIvB,GAAQA,EAAKmD,8BAC9B,EAELtB,MAAG,GACb,CAEAgB,sBACInC,EACA0C,EACAf,EACA7B,EACAsC,GAEA,MAAMhB,EAAwCsB,EAAY7B,IAAIQ,IAC1D,MAAMS,EAAOH,EAAQpB,OACf,GAAGP,EAAQ8B,QAAQT,EAAEC,UAChBT,IAAII,GAAMU,EAAQC,KAAKC,GAAKA,EAAEZ,KAAOA,IACrCb,OAAOuC,uBACP9B,IAAIgB,GAAKA,EAAEC,MACXc,KAAK,OACV5C,EAAQ8B,KACd,MAAO,CACHd,UAAWhB,EAAQiB,GACnB4B,MAAOxB,EAAEwB,MACTC,IAAKzB,EAAEyB,IACPN,aAAc,CACV,CACI1C,eACAgC,SAGRiB,YAAa,CACT,CACIX,kBACAY,YAAa3B,EAAE4B,QAGvB3B,UAAWD,EAAEC,aAGrB,OAAOpC,KAAKD,YAAYe,QAAQmC,sBAAsBf,GAAU3B,QAC5DoB,KAAI,EAAGsB,4BAAqB,CACxBA,wBACAnB,UAAWhB,EAAQiB,MAG/B,CAEAiC,cAAcC,GAOV,MAAQnD,UAASF,eAAcsD,aAAYC,eAAcC,iBAAkBH,EACrEI,EAA6F,GAC7FC,EAAsBF,GAAiB,GAQ7C,OANkBF,EACZlE,KAAKD,YAAYe,QACZyD,6BAA6B,GAAIzD,EAAQiB,IACzC5B,UAAU,EAAGqE,qBAAsBA,EAAgBlE,QAAK,EAC7D2B,MAAG,KAEQ1B,QACbkB,KAASS,IACL,GAAIiC,EAAc,CACdE,EAAiBI,KAAKzE,KAAKD,YAAYe,QAAQkD,cAAcG,IAC7D,MAAMO,KAAiBC,OAAgB7D,EAASF,IAAegC,MAAQ,GACjEgC,KAAiBD,OAAgBR,EAAcvD,IAAegC,KACpE,GAAIgC,GAAkBF,IAAmBE,GAAkBV,EACvD,UAAWW,KAAW3C,EAAU,CAC5B,MAAM4C,KAAqBH,OAAgBE,EAASjE,IAAegC,MAAQ,GAC3E,IAAImC,EACJ,MAAMC,EAAuBV,EAAoB5B,KAAKuC,IAAKA,GAAElD,KAAO8C,EAAQ9C,IACxEiD,EACAD,EAAeC,GAEfD,EAAe,CACXhD,GAAI8C,EAAQ9C,GACZuB,aAAc,CAAC,CAAE1C,eAAcgC,KAAMkC,KAEzCR,EAAoBG,KAAKM,IAE7B,MAAMG,MAAqBP,OAAgBI,EAAcnE,GACrDsE,KACIA,GAAmBtC,KACnBsC,GAAmBtC,KAAOtD,GACtB4F,GAAmBtC,KACnB8B,EACAE,GAMJM,GAAmBtC,KAAO,CACtBgC,KACGC,EAAQpC,QAAQd,IAAIgB,IAAKA,GAAEC,OAChCc,KAAK,OAM3B,OAAIY,EAAoBjD,QACpBgD,EAAiBI,KACbzE,KAAKD,YAAYe,QAAQqE,sBAAsBb,KAAoB,EAGpE9C,MAAS6C,EAAgB,GAG5C,CAEAe,oBACI1E,EACAI,EACAF,GAQA,OANkBF,EAAMwD,WAClBlE,KAAKD,YAAYe,QACZyD,6BAA6B,GAAIzD,EAAQiB,IACzC5B,UAAU,EAAGqE,qBAAsBA,EAAgBlE,QAAK,EAC7D2B,MAAG,KAEQ1B,QACbkB,KAASS,IACL,IAAImD,KAA8CpD,MAAG,IACrD,GAAIvB,EAAMwD,WAAY,CAElB,IAAIoB,EACJ,MAAMC,KAAgBZ,OAAgBjE,EAAOE,IAAegC,KACvD2C,IACDF,KAA6BpD,MAAG,KAEpC,MAAMuD,EAAgD,GACtD,UAAWX,KAAW3C,EAClB,GAAI2C,EAAQpC,QAAQd,IAAIgB,GAAKA,EAAEZ,IAAI0D,SAAS/E,EAAMqB,IAAK,CAC9CuD,IACDA,KAAgBX,OACZE,EAAQpC,QAAQC,KAAKC,GAAKA,EAAEZ,KAAOrB,EAAMqB,IACzCnB,IACDgC,MAEP,MAAM8C,KAAcf,OAAgBE,EAASjE,IAAegC,MAAQ,GAChE0C,GAAiBC,GAAiBG,EAAYD,SAASH,IACvDE,EAAiBf,KAAK,CAClB1C,GAAI8C,EAAQ9C,GACZuB,aAAc,CACV,CACI1C,eACAgC,KAAMtD,GAAYoG,EAAaJ,EAAeC,OAOlEC,EAAiBnE,SACjBgE,EACIrF,KAAKD,YAAYe,QAAQqE,sBAAsBK,IAG3D,OAAOxF,KAAKD,YAAYe,QACnBsE,oBAAoB1E,GACpBH,QAAKkB,KAAS,IAAM4D,GAA2B,GAGhE,CAEAM,qBAAqB5D,EAAYD,GAC7B,OAAO9B,KAAKD,YAAYe,QAAQ6E,qBAAqB5D,GAAIxB,QACrDqF,KAAUC,GACFA,EAAOF,qBAAqBE,SAAWC,MAAeC,QAC/C/F,KAAKD,YAAYe,QAAQkF,WAAWlE,GAAWmE,WAE/CC,MAAWL,EAAOF,qBAAqBQ,UAI9D,MAlQStG,4CAAoBuG,MAAAC,OAAA,6BAApBxG,GAAoByG,QAApBzG,GAAoB0G,UAAAC,WAFjB,uQCHIJ,MAAA,cAGIA,MAAA,mBAAAA,MAAAK,GAAA,MAAAC,EAAAN,QAAA,OAASA,MAAAM,EAAAC,OAAM,GAGfP,MAAA,wBACJA,gCAHIA,MAAA,WAAAQ,EAAAC,WAAAC,UAAAF,EAAAC,WAAAE,SAEAX,MAAA,GAAAA,MAAA,IAAAA,MAAA,qDAiCJA,MAAA,MACIA,MAAA,0DAMJA,mDAJQA,MAAA,GAAAA,MAAA,eAAAY,EAAAC,wBAAAb,CAAwC,wBAAAc,EAAAC,IAAA,gBAAxCf,CAAwC,YAAAA,MAAA,IAAAY,EAAAI,6CAiBpChB,MAAA,uBAAAA,MAAA,IAAAiB,EAAAC,MAAAvF,GAAA,gCAKAqE,MAAA,8CAAAA,MAAA,IAAAA,MAAA,IAAAmB,EAAAD,MAAAE,UAAA,yCAKApB,MAAA,8CAAAA,MAAA,IAAAA,MAAA,IAAAqB,EAAAH,MAAAI,UAAA,yCAKAtB,MAAA,uEAEIA,MAAA,cAAAuB,EAAAR,IAAA,QAAAf,CAAyC,YAAAA,MAAA,IAAAwB,EAAAR,6CAO7ChB,MAAA,kCAAmBA,MAAA,cAAAyB,EAAAV,IAAA,oCAQnBf,MAAA,0FAEIA,MAAA,eAAA0B,EAAAC,mBAAA3B,CAAmC,aAAnCA,CAAmC,wBAAA4B,EAAAb,IAAA,gBAAnCf,CAAmC,YAAAA,MAAA,IAAA0B,EAAAV,6DA7CnDhB,MAAA,yBAMIA,MAAA,sBAAA6B,GAAA7B,MAAA8B,GAAA,MAAAhB,EAAAd,QAAA+B,UAAAC,EAAAhC,MAAA,UAAcA,MAAAgC,EAAAC,mBAAAnB,EAAAI,MAAAvF,IAAAuG,YAAAL,EAA6D,GAG3E7B,MAAA,4CACIA,MAAA,EAAAmC,GAAA,mBAGJnC,QACAA,MAAA,4CACIA,MAAA,EAAAoC,GAAA,mBAGJpC,QACAA,MAAA,4CACIA,MAAA,EAAAqC,GAAA,mBAGJrC,QACAA,MAAA,8CACIA,MAAA,GAAAsC,GAAA,mBAOJtC,QACAA,MAAA,8CACIA,MAAA,GAAAuC,GAAA,mBAGJvC,QACAA,MAAA,8CAIIA,MAAA,GAAAwC,GAAA,mBASJxC,gEAhDAA,MAAA,QAAAyC,EAAAzC,CAAiB,qBAAA0C,EAAAT,mBAAAnB,EAAAI,MAAAvF,IAAA,KAAA+G,EAAAT,mBAAAnB,EAAAI,MAAAvF,IAAAgH,aAAjB3C,CAAiB,oBAAA0C,EAAAT,mBAAAnB,EAAAI,MAAAvF,IAAA,KAAA+G,EAAAT,mBAAAnB,EAAAI,MAAAvF,IAAAuG,YAAjBlC,CAAiB,aAAAyC,EAAAxH,QAMD+E,MAAA,GAAAA,MAAA,UAAAA,MAAA,kBAAAA,CAAmC,sBAKnCA,MAAA,GAAAA,MAAA,UAAAA,MAAA,0BAAAA,CAA2C,sBAK3CA,MAAA,GAAAA,MAAA,UAAAA,MAAA,0BAAAA,CAA2C,sBAK3CA,MAAA,GAAAA,MAAA,UAAAA,MAAA,qBAAAA,CAAqC,eASrCA,MAAA,GAAAA,MAAA,UAAAA,MAAA,qBAAAA,CAAqC,eAMjDA,MAAA,GAAAA,MAAA,UAAAA,MAAA,8BAAAA,CAA8C,sBAAA0C,EAAAf,mBAAA1G,mCAxE1D+E,MAAA,iBAKIA,MAAA,6BACAA,MAAA,WAAAA,CAAuB,4CAEfA,MAAA,uCAMJA,QACAA,MAAA,4CACIA,MAAA,wCAMJA,UAEJA,MAAA,GAAA4C,GAAA,uBASA5C,MAAA,GAAA6C,GAAA,6BAqDJ7C,uDApFIA,MAAA,gBAAA8C,EAAA9C,CAAmB,QAAAc,EAAAI,MAAAlE,MAGGgD,MAAA,GAAAA,MAAA,SAAAc,EAAAI,OAEFlB,MAAA,GAAAA,MAAA,QAAAA,MAAA,qBAERA,MAAA,GAAAA,MAAA,aAAA8C,EAAA9C,CAAkB,YAAAA,MAAA,KAAA+C,EAAA/B,mBAMVhB,MAAA,GAAAA,MAAA,QAAAA,MAAA,qBAERA,MAAA,GAAAA,MAAA,aAAA8C,EAAA9C,CAAkB,YAAAA,MAAA,MAAA+C,EAAA/B,mBAOchB,MAAA,GAAAA,MAAA,OAAA+C,EAAAlC,wBAAA5F,QAWvC+E,MAAA,GAAAA,MAAA,OAAA+C,EAAAC,WAAAlC,+BArCjBd,MAAA,WAAAA,CAA0F,WAElFA,MAAA,EAAAiD,GAAA,oBAuFJjD,gCAzFeA,MAAA,YAAAkD,EAAAzC,YAGiBT,MAAA,GAAAA,MAAA,UAAAkD,EAAAC,oBCVtC,MAAOC,WAAsCC,MAW/C3J,YACc4J,EACAC,EACAC,EACA7J,EACF8J,EACAC,EACAC,EACAC,GAERC,MAAMP,EAAOC,EAAQC,EAAqB7J,GAThCC,KAAA0J,QACA1J,KAAA2J,SACA3J,KAAA4J,sBACA5J,KAAAD,cACFC,KAAA6J,uBACA7J,KAAA8J,cACA9J,KAAA+J,iBACA/J,KAAAgK,sBAZZhK,KAAAkK,wBAAyB,EACzBlK,KAAAqI,mBAA2F,GAClFrI,KAAAoH,iBAAmB,CAAC+C,MAAWC,cAAeD,MAAWE,eAa9DrK,KAAKiH,wBAA0BjH,KAAKsK,qBAAqB,sBACzDtK,KAAK+H,mBAAqB/H,KAAKsK,qBAAqB,gBACxD,CAEAC,WACIvK,KAAKwK,cAAgBxK,KAAK0J,MAAMe,SAASrK,KAAKsK,OAAOnK,QACjDoB,KAAKb,GAAgCA,EAAQY,eAAY,EACzDiJ,KAAKjJ,IACD,UAAWkJ,KAASlJ,EAChB1B,KAAKqI,mBAAmBuC,EAAM7I,IAAM,CAChCuG,YAAa,EACbS,aAAc,OAK9B/I,KAAK6G,WAAa,IAAIgE,KAAiB,CACnCnJ,aAAc,IAAIoJ,KAAiB,MAEvCb,MAAMc,MACV,CAEAxB,kBAEI,OADqBvJ,KAAK6G,WAAWM,IAAI,gBACC6D,QAC9C,CAEA5B,WAAWxH,GAEP,OADgBA,EAAYuF,IAAI,WACK6D,QACzC,CAEArE,OACI,GAAI3G,KAAK6G,WAAWE,SAAW/G,KAAK6G,WAAWC,SAC3C,OAGJ,MAAMmE,EAAWjL,KAAKD,YAAYe,QAAQkF,WAAWhG,KAAK+B,IAAI5B,UAAUC,GAAQA,EAAKU,UACrFoK,OAAclL,KAAKmL,QAASnL,KAAKoL,cAAeH,GAC3C1K,QACG8K,KAAK,IAAC,EACN5J,KAAS,GAAIC,gBAAgBd,EAAcE,MACvC,MAAMuD,EAA2C,GACjD,UAAWiH,KAAmBtL,KAAKuJ,kBAAmB,CAClD,GAAI+B,EAAgBC,MAAO,CACvB,MAAMC,EAAoB9J,EAAagB,KACnCI,GAAMA,EAAGf,KAAOuJ,EAAgBhE,MAAMvF,IAE1C,GAAIyJ,EAAmB,CACnB,MAAM9K,EAAQV,KAAKyL,sBACfD,EACAF,EACA1K,GAEJyD,EAAiBI,KACbzE,KAAKD,YAAYe,QAAQ4K,yBAAyBhL,KAK9D,UAAWiL,KAAc3L,KAAKoJ,WAAWkC,GACrC,GAAIK,EAAWJ,MAAO,CAClB,MAAM3J,EAAcF,EACfgB,KAAKI,GAAMA,EAAGf,KAAOuJ,EAAgBhE,MAAMvF,KAC1CU,QAAQC,KAAKC,GAAKA,EAAEZ,KAAO4J,EAAWrE,MAAMvF,IAClD,GAAIH,EAAa,CACb,MAAMlB,EAAQV,KAAK4L,iBACfhK,EACA+J,EACA/K,GAEJyD,EAAiBI,KACbzE,KAAK6J,qBAAqBzE,oBACtB,IAAK1E,EAAOwD,WAAYlE,KAAKkK,wBAC7BpJ,EACAF,MAOxB,SAAOY,MAAS6C,EAAgB,IAGvCwH,UACG,KACI7L,KAAK6G,WAAWiF,iBAChB9L,KAAK+J,eAAegC,eACpB/L,KAAKgK,oBAAoBgC,WAAQC,KAAE,gCAAiC,CAChEvB,OAAQ,sBACX,EAELwB,IACIlM,KAAKgK,oBAAoBmC,SAAMF,KAAE,8BAA+B,CAC5DvB,OAAQ,sBACX,EAGjB,CAEQe,sBACJ7J,EACAwK,EACAxL,GAYA,SAVcyL,OAA0B,CACpCC,aAAc1K,EACd2K,cAAeH,EAAqB9E,MACpCkF,kBAAmBxM,KAAKiH,wBACxBrG,eACA6L,mBAAoB,CAChB7L,eACAgC,KAAMhB,EAAYgB,MAAQ,KAItC,CAEQgJ,iBACJpJ,EACAkK,EACA9L,GAYA,SAVcyL,OAA0B,CACpCC,aAAc9J,EACd+J,cAAeG,EAAgBpF,MAC/BkF,kBAAmBxM,KAAK+H,mBACxBnH,eACA6L,mBAAoB,CAChB7L,eACAgC,KAAMJ,EAAOI,MAAQ,KAIjC,CAEU+J,cAAcjC,EAA4B9J,GAChD,MAAMgM,EAAa5M,KAAK6G,WAAWM,IAAI,gBACvC,UAAWvF,KAAe8I,EAAOhJ,aAAc,CAC3C,MAAMmL,KAAmBlI,OAAgB/C,EAAahB,GAEhDkM,EAAY9M,KAAK+M,mBAAmBnL,EAAagL,EAAYC,GACnE7M,KAAKgN,oBAAoBhN,KAAKiH,wBAAyB6F,EAAWlL,EAAaiL,GAE/E,IAAII,EAAcH,EAAU3F,IAAI,WAC3B8F,IACDA,EAAcjN,KAAK8J,YAAYoD,MAAM,IACrCJ,EAAUK,WAAW,UAAWF,IAEpC,UAAWzK,KAAUZ,EAAYa,QAAS,CACtC,MAAM2K,KAAoBzI,OAAgBnC,EAAQ5B,GAC5C+K,EAAa3L,KAAKqN,cAAc7K,EAAQyK,EAAaG,GAE3DpN,KAAKgN,oBAAoBhN,KAAK+H,mBAAoB4D,EAAYnJ,EAAQ4K,IAGlF,CAEUJ,oBAGNM,EACAC,EACA7C,EACA8C,GAEA,GAAIF,EAAajM,OAAQ,CACrB,IAAIoM,EAAyBF,EAAUpG,IAAI,CAAC,iBACvCsG,IACDA,EAAyBzN,KAAK8J,YAAYc,MACtC0C,EAAavK,OAAO,CAAC2K,EAAMC,SAAgBD,EAAM,CAACC,EAAM/K,MAAO,KAAO,KAE1E2K,EAAUJ,WAAW,eAAgBM,IAEzCzN,KAAK4N,yBAAyBN,EAAcG,EAAwB/C,EAAQ8C,GAEpF,CAEUT,mBACNrC,EACAkC,EACAY,GAEA,MAAM5C,EAAQ,CACV7I,GAAI2I,EAAO3I,GACXyF,UAAWkD,EAAOlD,UAClBE,UAAWgD,EAAOhD,UAClBtE,KAAMsH,EAAOtH,KACbR,KAAM4K,GAAoB5K,MAAQ,IAEtC,IAAIkK,EAAYF,EAAW5B,SAAStI,KAAKmL,GAAWA,EAAQvG,MAAMvF,KAAO2I,EAAO3I,IAGhF,OAAI+K,GACAA,EAAU3F,IAAI,OAAO2G,SAASlD,EAAM7I,IACpC+K,EAAU3F,IAAI,SAAS2G,SAASlD,EAAMxH,MACtC0J,EAAU3F,IAAI,SAAS2G,SAASlD,EAAMhI,MACtCkK,EAAU3F,IAAI,cAAc2G,SAASlD,EAAMpD,WAC3CsF,EAAU3F,IAAI,cAAc2G,SAASlD,EAAMlD,aAE3CoF,EAAY9M,KAAK8J,YAAYc,MAAMA,GACnCgC,EAAWnI,KAAKqI,IAEbA,CACX,CAEUO,cACN3C,EACAuC,EACAO,GAEA,MAAM5C,EAAQ,CACV7I,GAAI2I,EAAO3I,GACXyF,UAAWkD,EAAOlD,UAClBE,UAAWgD,EAAOhD,UAClBtE,KAAMsH,EAAOtH,KACbR,KAAM4K,GAAoB5K,MAAQ,IAEtC,IAAI+I,EAAasB,EAAYjC,SAAStI,KAAKmL,GAAWA,EAAQvG,MAAMvF,KAAO2I,EAAO3I,IAGlF,OAAI4J,GACAA,EAAWxE,IAAI,OAAO2G,SAASlD,EAAM7I,IACrC4J,EAAWxE,IAAI,SAAS2G,SAASlD,EAAMxH,MACvCuI,EAAWxE,IAAI,SAAS2G,SAASlD,EAAMhI,MACvC+I,EAAWxE,IAAI,cAAc2G,SAASlD,EAAMpD,WAC5CmE,EAAWxE,IAAI,cAAc2G,SAASlD,EAAMlD,aAE5CiE,EAAa3L,KAAK8J,YAAYc,MAAMA,GACpCqC,EAAYxI,KAAKkH,IAEdA,CACX,MA/PSnC,4CAA6BpD,MAAAC,MAAAD,MAAAC,MAAAD,MAAA2H,OAAA3H,MAAA2H,OAAA3H,MAAA4H,IAAA5H,MAAA6H,MAAA7H,mBAAA2H,OAAA,2BAA7BvE,GAA6B0E,UAAA,iCAAAC,SAAA,CAAA/H,OAAAgI,MAAA,GAAAC,KAAA,GAAAC,OAAA,47CAAAC,SAAA,SAAAC,EAAAC,GAAA,EAAAD,IDlC1CpI,MAAA,qBACIA,MAAA,oBACAA,MAAA,iCAA6BA,MAAA,wBAA2DA,UAE5FA,MAAA,kBAAAA,CAAe,mBAAfA,CAAe,mBAAfA,CAAe,gBAAfA,CAAe,6BAOKA,MAAA,8BAAA6B,GAAA,OAAsBwG,EAAAC,YAAAzG,EAAmB,uCAC5C7B,UAGLA,MAAA,kBAAAA,CAAc,WAAdA,CAAc,WAAdA,CAAc,0BAAdA,CAAc,cAQMA,MAAA,yBAAA6B,GAAA,OAAAwG,EAAAvE,uBAAAjC,CAAA,GAJJ7B,QAMAA,MAAA,YAAOA,MAAA,0BAA4DA,YAG3EA,MAAA,GAAAuI,GAAA,gBAQJvI,cAIZA,MAAA,qBACIA,MAAA,GAAAwI,GAAA,gCA2FJxI,iBAlI6BA,MAAA,GAAAA,YAAA,gDAObA,MAAA,GAAAA,MAAA,yBAAAA,MAAA,KAAAqI,EAAAI,qBAAAzI,CAAsD,sBAAAA,MAAA,MAAAqI,EAAArD,gBAc1ChF,MAAA,GAAAA,MAAA,UAAAqI,EAAAvE,wBAEG9D,MAAA,GAAAA,YAAA,mDAIVA,MAAA,GAAAA,MAAA,mBAAAqI,EAAArH,kBAY4BhB,MAAA,GAAAA,MAAA,OAAAA,MAAA,MAAAqI,EAAAjE,yZExCjDpE,MAAA,8BAAAA,MAAA,IAAAA,MAAA,0FAkBAA,MAAA,cAAkCA,MAAA,mBAAAA,MAAAK,GAAA,MAAAC,EAAAN,QAAA,OAASA,MAAAM,EAAAoI,SAAQ,GAAE1I,MAAA,wBAAiCA,QACtFA,MAAA,cAAsBA,MAAA,mBAAAA,MAAAK,GAAA,MAAAsI,EAAA3I,QAAA,OAASA,MAAA2I,EAAAC,UAAS,GACpC5I,MAAA,wBACJA,gCAHqDA,MAAA,GAAAA,YAAA,sBACaA,MAAA,GAAAA,MAAA,WAAAkD,EAAA2F,KAAAlI,SAC9DX,MAAA,GAAAA,MAAA,IAAAA,MAAA,4BCHF,MAAO8I,GAOTpP,YAAoBgK,GAAA9J,KAAA8J,cAJpB9J,KAAAiP,KAAOjP,KAAK8J,YAAYc,MAAM,CAC1BhI,KAAM,CAAC,GAAIuM,KAAWC,UACtBhM,KAAM,CAAC,GAAI+L,KAAWC,WAEqB,CAE/CC,aACI,MAAMC,EAActP,KAAKiP,KAAK9H,IAAI,QAC5BoI,EAAcvP,KAAKiP,KAAK9H,IAAI,QAC9BmI,GAAeC,GAAeA,EAAYzI,UAC1CyI,EAAYzB,YAASzK,KAAgB,GAAGiM,EAAYhI,QAAS,KAErE,CAEA0H,UACI,MAAQpM,OAAMQ,QAASpD,KAAKiP,KAAK3H,OAC5B1E,IAASQ,GAGdpD,KAAKwP,YAAY,CACbpM,OACAX,QAAS,GACTa,aAAc,CAAC,CAAE1C,aAAcZ,KAAKY,aAAcgC,UAE1D,CAEAkM,SACI9O,KAAKwP,aACT,MA/BSN,4CAAuC9I,MAAAC,MAAA,2BAAvC6I,GAAuChB,UAAA,6CAAAE,MAAA,EAAAC,KAAA,EAAAC,OAAA,qVAAAC,SAAA,SAAAC,EAAAC,GAAA,EAAAD,IDlBpDpI,MAAA,EAAAqJ,GAAA,qBAGArJ,MAAA,UAAAA,CAA0C,2CAElCA,MAAA,aAAoDA,MAAA,0BAASqI,EAAAY,YAAY,GAAzEjJ,UAEJA,MAAA,2CAIIA,MAAA,aAKJA,UAEJA,MAAA,EAAAsJ,GAAA,4BAfuBtJ,MAAA,GAAAA,MAAA,YAAAqI,EAAAQ,MACH7I,MAAA,GAAAA,MAAA,QAAAA,MAAA,oBAIZA,MAAA,GAAAA,MAAA,QAAAA,MAAA,2JEPJA,MAAA,8BAAAA,MAAA,IAAAA,MAAA,sEAIIA,MAAA,sBACIA,MAAA,kBAGJA,kCAJgBA,MAAA,QAAAuJ,EAAA/M,MACDwD,MAAA,GAAAA,MAAA,QAAAuJ,EAAAlN,QAAA2D,CAA6B,kBAAAuJ,EAAAvM,8BAI5CgD,MAAA,iBAAAA,CAC2B,mBAD3BA,CAC2B,aAGfA,MAAA,wBACJA,mBALoEA,MAAA,uBAIhEA,MAAA,GAAAA,MAAA,IAAAA,MAAA,sFAKhBA,MAAA,WAAAA,CAA0C,iBAA1CA,CAA0C,mBAA1CA,CAA0C,aAI1BA,MAAA,wBAGJA,oCAN0BA,MAAA,GAAAA,MAAA,uBAGtBA,MAAA,GAAAA,MAAA,IAAAA,MAAA,2CAAAwJ,EAAAC,gBAAAjN,KAAA,KAAAgN,EAAAC,gBAAAjM,IAAA,gDAoBhBwC,MAAA,eAAkCA,MAAA,mBAAAA,MAAA0J,GAAA,MAAAC,EAAA3J,QAAA,OAASA,MAAA2J,EAAAjB,SAAQ,GAAE1I,MAAA,wBAAiCA,QACtFA,MAAA,eAAsBA,MAAA,mBAAAA,MAAA0J,GAAA,MAAA9I,EAAAZ,QAAA,OAASA,MAAAY,EAAAgI,UAAS,GAEpC5I,MAAA,wBACJA,gCAJqDA,MAAA,GAAAA,YAAA,sBAEjDA,MAAA,GAAAA,MAAA,WAAA2I,EAAAE,KAAAlI,SAAAgI,EAAAc,iBAAA,IAAAd,EAAAjO,QAAAY,aAAAL,QACA+E,MAAA,GAAAA,MAAA,IAAAA,MAAA,4BC7BF,MAAO4J,GAYTlQ,YAAoBgK,GAAA9J,KAAA8J,cATpB9J,KAAAiP,KAAOjP,KAAK8J,YAAYc,MAAM,CAC1BhI,KAAM,CAAC,GAAIuM,KAAWC,UACtBxL,IAAK,CAAC,GAAIuL,KAAWC,UACrBzL,MAAO,CAAC,GAAIwL,KAAWC,UACvB3M,QAASzC,KAAK8J,YAAYmG,OAAe,KAKE,CAE/C1F,WACIvK,KAAKkQ,aAAelQ,KAAKc,QAAQoB,SAAS,IAAIgO,aAC9C,UAAWtO,KAAe5B,KAAKc,QAAQY,aAClC1B,KAAKiP,KAAK9H,IAAI,WAA0BgG,WACrCvL,EAAYwB,KACZ,IAAI+M,KAAY,GAAIhB,KAAWC,WAGjBpP,KAAKiP,KAAK9H,IAAI,WACtBiJ,aAAavE,UAAUvE,IACjC,MAAMgI,EAActP,KAAKiP,KAAK9H,IAAI,QAElC,IADgBkJ,OAAOjP,OAAOkG,GAAOgJ,MAAMnO,GAAU,MAALA,IAChCmF,GAASgI,IAAgBA,EAAY/D,MAAO,CACxD,MAAM3I,EAAOyN,OAAOE,QAAQjJ,GACvB3F,IACG,EAAE6O,EAAWC,KACTzQ,KAAKc,QAAQY,aACRgB,KAAKI,GAAMA,EAAGM,OAASoN,IACtB/N,QAAQC,KAAKC,GAAKA,EAAEZ,KAAO0O,IAAW7N,MAEnDc,KAAK,KACV4L,EAAYxB,SAAS,GAAG9N,KAAKc,QAAQ8B,QAAQA,KAE7ByN,OAAOjP,OAAOkG,GAAOgJ,MAAMnO,GAAU,MAALA,KAEhDnC,KAAK6P,gBAAkB7P,KAAKc,QAAQoB,SAASQ,KAAKP,GAC9CkO,OAAOE,QAAQjJ,GAAOgJ,MAClB,EAAEE,EAAWC,KACTtO,EAAEM,QAAQC,KAAKC,GAAKA,EAAE+N,UAAY1Q,KAAK2Q,mBAAmBH,KAAazO,KACvE0O,IACP,EAIjB,CAEAzB,UACI,MAAQpM,OAAMgB,MAAKnB,UAASkB,SAAU3D,KAAKiP,KAAK3H,MAChD,KAAK1E,GAASgB,GAAQnB,GAAYkB,GAC9B,OAGJ,MAAMvB,EAAYiO,OAAOjP,OAAOqB,GAASvB,OAAOuC,uBAChDzD,KAAKwP,YAAY,CACb1N,UAAW9B,KAAKc,QAAQiB,GACxB6B,MACAD,MAAOiN,OAAOjN,GACdvB,YACAkB,aAAc,CACV,CACI1C,aAAcZ,KAAKc,QAAQF,aAC3BgC,UAIhB,CAEAkM,SACI9O,KAAKwP,aACT,CAEQqB,mBAAmB9O,GACvB,OAAO/B,KAAKc,QAAQY,aAAagB,KAAKI,GAAMA,EAAGf,KAAOA,IAAKqB,MAAQ,EACvE,CAEQuN,mBAAmBvN,GACvB,OAAOpD,KAAKc,QAAQY,aAAagB,KAAKI,GAAMA,EAAGM,OAASA,IAAOrB,IAAM,EACzE,MAjFSiO,4CAAmC5J,MAAAC,MAAA,2BAAnC2J,GAAmC9B,UAAA,wCAAAE,MAAA,GAAAC,KAAA,GAAAC,OAAA,+uBAAAC,SAAA,SAAAC,EAAAC,GAAA,EAAAD,IDjBhDpI,MAAA,EAAA0K,GAAA,qBAGA1K,MAAA,WAAAA,CAAyB,WAEjBA,MAAA,EAAA2K,GAAA,wBAKA3K,MAAA,EAAA4K,GAAA,mBAQJ5K,QACAA,MAAA,EAAA6K,GAAA,aAWA7K,MAAA,UAAAA,CAA4B,2CAEpBA,MAAA,aACJA,QACAA,MAAA,6CACIA,MAAA,cACJA,QACAA,MAAA,6CACIA,MAAA,4BACJA,YAGRA,MAAA,GAAA8K,GAAA,6BAvCM9K,MAAA,GAAAA,MAAA,YAAAqI,EAAAQ,MAEqE7I,MAAA,GAAAA,MAAA,UAAAqI,EAAA3N,QAAAY,cAKvD0E,MAAA,GAAAA,MAAA,WAAAqI,EAAA3N,QAAAY,aAAAL,QASV+E,MAAA,GAAAA,MAAA,OAAAqI,EAAAoB,iBAYczJ,MAAA,GAAAA,MAAA,QAAAA,MAAA,oBAGAA,MAAA,GAAAA,MAAA,QAAAA,MAAA,sBAGAA,MAAA,GAAAA,MAAA,QAAAA,MAAA,wBACqBA,MAAA,GAAAA,MAAA,eAAAqI,EAAAyB,kQEpCrC9J,MAAA,gBAMIA,MAAA,6BAAA+K,EAAA/K,MAAAgL,GAAAjJ,UAAAkJ,EAAAjL,MAAA,UAAaA,MAAAiL,EAAAC,aAAAH,GAAoB,GAEjC/K,MAAA,WAAAA,CAAoC,eAK5BA,MAAA,gBAAA6B,GAAA,MAAAsJ,EAAAnL,MAAAgL,GAAA7O,MAAAuG,EAAA1C,MAAA,UAAQA,MAAA0C,EAAA0I,aAAAD,EAAAtJ,GAAuB,EAA/B7B,CAAgC,iBAAA6B,GAAA,OAAAA,EAAAwJ,cACD,CAAI,GALvCrL,UAQJA,MAAA,aAGIA,MAAA,iBAAA6B,GAAA,MAAAsJ,EAAAnL,MAAAgL,GAAA7O,MAAAmP,EAAAtL,MAAA,UAASA,MAAAsL,EAAAC,SAAAJ,EAAAtJ,GAAmB,GAAgC7B,MAAA,GAAiBA,oEAjBjFA,MAAA,WAAAwL,GAAAlL,EAAAmL,aAAAzL,CAAyC,SAAA+K,EAAAW,QADzC1L,MAAA,OAAA+K,EAAAW,OAAA,eAAA1L,CAAyC,YAAAM,EAAAqL,WAMnC3L,MAAA,GAAAA,MAAA,SAAAM,EAAAsL,eAAAT,GAIEnL,MAAA,GAAAA,MAAA,UAAA+K,EAAAvO,MAOJwD,MAAA,GAAAA,MAAA,YAAA+K,EAAAW,SAAAX,EAAApP,IAC8BqE,MAAA,SAAAM,EAAAsL,eAAAT,GAA8BnL,MAAA,GAAAA,MAAA+K,EAAAvO,iCArBxEwD,MAAA,WACIA,MAAA,EAAA6L,GAAA,mBAsBJ7L,8BArB2BA,MAAA,GAAAA,MAAA,UAAAQ,EAAAvE,eCiBxB,MAAM6P,GAA8C,CACvDC,QAASC,KACTC,eAAaC,OAAW,IAAMC,IAC9BC,OAAO,GAgBL,MAAOD,GAiBT,gBAAIlQ,GACA,OAAOrC,KAAKyS,WAAazS,KAAKyC,SAAW,EAC7C,CAEA3C,YAAoBiK,GAAA/J,KAAA+J,iBApBX/J,KAAA+R,UAAY,GAIX/R,KAAA0S,IAAM,IAAIC,MACV3S,KAAA4S,OAAS,IAAID,MACb3S,KAAA6S,KAAO,IAAIF,MACZ3S,KAAA8S,UAAW,EACpB9S,KAAAU,MAAQ,GACRV,KAAA+S,YAAa,EACb/S,KAAA6R,cAAe,EAEf7R,KAAAgS,cAAe,CAQyC,CAExDgB,iBAAiBC,GACbjT,KAAKkT,WAAaD,CACtB,CAEAE,kBAAkBF,GACdjT,KAAKoT,UAAYH,CACrB,CAEAI,iBAAiBC,GACbtT,KAAK8S,SAAWQ,EAChBtT,KAAK+J,eAAegC,cACxB,CAEAwH,WAAWC,GACPxT,KAAKyS,UAAYe,GAAO,EAC5B,CAEAC,QACIzT,KAAK0T,SAASC,cAAcF,OAChC,CAEA9B,SAASpP,EAAeqR,GACpB,MAAMC,EAAc7T,KAAKqC,aAAaE,GACtC,IAAKsR,EAAY/B,SAAW+B,EAAY9R,GAAI,CACxC6R,EAAMnC,cAAe,EACrBzR,KAAKgS,aAAezP,EACpB,MAAM7B,EAAQV,KAAK8T,WAAW3M,IAAI5E,IAAQoR,cAC1CI,WAAW,IAAMrT,GAAO+S,SAEhC,CAEAjC,aAAajP,EAAeqR,GACxB,MAAMC,EAAc7T,KAAKqC,aAAaE,GAChCyR,EAAWJ,EAAMrU,OAA4B+H,MAC/CuM,IACIG,IACAH,EAAYjR,KAAOoR,EACnBhU,KAAK6S,KAAKoB,KAAK,CAAE1R,QAAOC,OAAQqR,KAEpC7T,KAAKgS,cAAe,EAE5B,CAEAV,aAAa9O,GACJA,EAAOsP,SACJ9R,KAAKyS,WACLzS,KAAKyS,UAAYzS,KAAKyS,WAAWvR,OAAOyB,GAAKA,EAAEC,OAASJ,EAAOI,MAC/D5C,KAAKkT,WAAWlT,KAAKyS,YAErBzS,KAAK4S,OAAOqB,KAAKzR,GAG7B,CAEA0R,UAAUN,GACN,OAAQA,EAAMO,KACV,IAAK,IACL,IAAK,QACDnU,KAAKoU,iBACLR,EAAMS,iBACN,MACJ,IAAK,YACGrU,KAAK6R,cACL7R,KAAKsU,mBACLtU,KAAK6R,cAAe,GACE,KAAf7R,KAAKU,QACZV,KAAK6R,cAAe,GAExB,MACJ,QACI7R,KAAK6R,cAAe,EAEhC,CAEA0C,aACIvU,KAAK+S,YAAa,EAClB/S,KAAKoU,gBACT,CAEQA,iBACJ,MAAM3R,EAAUzC,KAAKwU,sBAAsBxU,KAAKU,OAAOQ,OAAOsB,KAGzCxC,KAAKyC,SAAWzC,KAAKyS,YACpB/P,KAAKC,GAAKA,GAAGC,OAASJ,EAAOI,OAEnD,IAAK5C,KAAKyS,WAAazS,KAAKyC,QACxB,UAAWD,KAAUC,EACjBzC,KAAK0S,IAAIuB,KAAKzR,QAGlBxC,KAAKyS,aAAYgC,KAAO,IAAIzU,KAAKyS,aAAchQ,IAC/CzC,KAAKkT,WAAWlT,KAAKyS,WAEzBzS,KAAKU,MAAQ,EACjB,CAEQ8T,sBAAsB9T,GAC1B,OAAOA,EACFgU,MAAM,SACN/S,IAAIgT,GAAKA,EAAEC,QACX1T,OAAOyT,GAAW,KAANA,GACZhT,IAAIgT,KAAQ/R,KAAM+R,EAAG7C,QAAQ,IACtC,CAEQwC,mBACJ,GAAItU,KAAKqC,aAAahB,OAAQ,CAC1B,MAAMmB,EAASxC,KAAKqC,aAAarC,KAAKqC,aAAahB,OAAS,GAC5DrB,KAAKsR,aAAa9O,GAE1B,MArIS+P,4CAAyBnM,aAAA,2BAAzBmM,GAAyBrE,UAAA,6BAAA2G,UAAA,SAAArG,EAAAC,MAAA,EAAAD,yBAGKsG,oOAL5B,CAAC5C,MAAkC9D,MAAA,EAAAC,KAAA,EAAAC,OAAA,uXAAAC,SAAA,SAAAC,EAAAC,GAAA,KAAAD,EAAA,iBDrClDpI,MAAA,WAAsDA,MAAA,mBAAAA,MAAA2O,GAAA,MAAAC,EAAA5O,MAAA,UAASA,MAAA4O,EAAAvB,QAAgB,GAC3ErN,MAAA,EAAA6O,GAAA,aAwBA7O,MAAA,kBAEIA,MAAA,iBAAA6B,GAAA,OAASwG,EAAAyF,UAAAjM,EAAiB,EAA1B7B,CAA2B,0BAAAqI,EAAAsE,YACL,CAAI,EAD1B3M,CAA2B,yBAEnBqI,EAAA8F,YAAY,EAFpBnO,CAA2B,yBAAA6B,GAAA,OAAAwG,EAAA/N,MAAAuH,CAAA,GAK9B7B,gBAhCsBA,MAAA,QAAAqI,EAAAsE,YACH3M,MAAA,GAAAA,MAAA,SAAAqI,EAAApM,aAAAhB,QA6BhB+E,MAAA,GAAAA,MAAA,UAAAqI,EAAA/N,MAAA0F,CAAmB,WAAAqI,EAAAqE,62CE5BnB1M,MAAA,WAAAA,CAA0E,4CAElEA,MAAA,cAAgBA,MAAA,yBAAA6B,GAAA,MAAAiN,EAAA9O,MAAA+O,GAAAhN,UAAA,OAAa/B,MAAA8O,EAAAtS,KAAAqF,EAAkB,GAA/C7B,UAEJA,MAAA,4CACIA,MAAA,kCAKIA,MAAA,eAAA6B,GAAA,MAAAmN,EAAAhP,MAAA+O,GAAA5S,MAAAqF,EAAAxB,QAAA,OAAOA,MAAAwB,EAAAyN,UAAAD,EAAAnN,EAAArF,MAAyB,EAAhCwD,CAAiC,kBAAA6B,GAAA,MAAAmN,EAAAhP,MAAA+O,GAAA5S,MAAA+S,EAAAlP,QAAA,OACvBA,MAAAkP,EAAAhE,aAAA8D,EAAAnN,GAAuB,GACpC7B,UAELA,MAAA,QAAAA,CAAK,eACiCA,MAAA,yBAAA8O,EAAA9O,MAAA+O,GAAAhN,UAAAL,EAAA1B,QAAA,OAASA,MAAA0B,EAAAyN,kBAAAL,GAAwB,GAC/D9O,MAAA,kBACJA,wCAhBYA,MAAA,GAAAA,MAAA,QAAAA,MAAA,uBACIA,MAAA,GAAAA,MAAA,UAAA8O,EAAAtS,KAAAwD,CAAwB,YAAA8O,EAAAM,OAE5BpP,MAAA,GAAAA,MAAA,QAAAA,MAAA,8BAGRA,MAAA,GAAAA,MAAA,UAAA8O,EAAA9T,OAAAgF,CAAwB,YAAA8O,EAAAtS,KAAxBwD,CAAwB,gBAAA8O,EAAAtS,gCAwCxBwD,MAAA,uBAAAA,MAAA,IAAAqP,EAAA1T,GAAA,gCAKAqE,MAAA,8CAAAA,MAAA,IAAAA,MAAA,IAAAsP,EAAAlO,UAAA,yCAKApB,MAAA,8CAAAA,MAAA,IAAAA,MAAA,IAAAuP,EAAAjO,UAAA,wCAKAtB,MAAA,uBAAAA,MAAA,IAAAwP,EAAAhT,KAAA,+BAKAwD,MAAA,uBAAAA,MAAA,IAAAyP,EAAAjS,IAAA,gCAKAwC,MAAA,iBAGKA,MAAA,GAAiBA,kDADlBA,MAAA,YAAA0P,EAAA1S,MACCgD,MAAA,GAAAA,MAAA2P,EAAAnT,gDAGDwD,MAAA,WAAAA,CAAyB,kBAMjBA,MAAA,kBAAA6B,GAAA7B,MAAA4P,GAAA,MAAAC,EAAA7P,QAAA8P,KAAAJ,EAAA1P,QAAA+B,UAAAgO,EAAA/P,QAAA,OAAUA,MAAA+P,EAAAC,wBAAAH,EAAAlU,GAAA+T,EAAA/T,GAAA,MAAAkG,EAAA,KAAAA,EAAAlG,IAA+D,GAC5EqE,QACDA,MAAA,eAGIA,MAAA,mBAAAA,MAAA4P,GAAA,MAAAC,EAAA7P,QAAA8P,KAAAG,EAAAjQ,MAAA,UAASA,MAAAiQ,EAAAC,mBAAAL,GAA2B,GAGpC7P,MAAA,iBACJA,qEAbIA,MAAA,GAAAA,MAAA,QAAA0P,EAAArT,SAQA2D,MAAA,GAAAA,MAAA,kBAAAmQ,EAAAC,sBAAAP,EAAAlU,MAAAwU,EAAAC,sBAAAP,EAAAlU,IAAA+T,EAAA/T,MAEAqE,MAAA,mBAAAmQ,EAAAC,sBAAAP,EAAAlU,KAAAwU,EAAAC,sBAAAP,EAAAlU,IAAA+T,EAAA/T,iCAlBZqE,MAAA,EAAAqQ,GAAA,mBAKArQ,MAAA,EAAAsQ,GAAA,0BAAAtQ,qEAJKA,MAAA,OAAAgC,EAAAuO,UAAAV,EAAAH,EAAA/T,IAAAqE,CAAyC,WAAAwQ,8BAHtDxQ,MAAA,uBACIA,MAAA,EAAAyQ,GAAA,mBA0BJzQ,kCA3BkEA,MAAA,UAAA0P,EAAAlT,KAAAwD,CAA4B,KAAA0P,EAAA1S,iCA8BtFgD,MAAA,kDAAAA,MAAA,IAAAA,MAAA,IAAA0Q,EAAAnT,MAAAmT,EAAA5G,cAAA,gCAKA9J,MAAA,kDAAAA,MAAA,IAAAA,MAAA,IAAA2Q,EAAAC,aAAAD,EAAA7G,cAAA,+CAKA9J,MAAA,eAA6BA,MAAA,yBAAA6Q,EAAA7Q,MAAA8Q,GAAAhB,KAAAiB,EAAA/Q,QAAA,OAASA,MAAA+Q,EAAAC,cAAAH,GAAsB,GACxD7Q,MAAA,iBACJA,SCzFd,MAAOiR,GAUTvX,YAAYwX,GACR,UAAWnD,KAAO9D,OAAOkH,KAAKD,GAC1BtX,KAAKmU,GAAOmD,EAAOnD,EAE3B,EAqBE,MAAOqD,GAuBT1X,YACY4J,EACA3J,EACA8J,EACAG,EACAyN,EACA1N,GALA/J,KAAA0J,QACA1J,KAAAD,cACAC,KAAA6J,uBACA7J,KAAAgK,sBACAhK,KAAAyX,eACAzX,KAAA+J,iBA5BZ/J,KAAA0X,kBAAmB,EACnB1X,KAAA2X,gBAAiB,EAOjB3X,KAAA+I,aAAe,IACf/I,KAAAsI,YAAc,EACdtI,KAAA4X,kBAAoB,IAAIzH,KAAY,IACpCnQ,KAAA6X,iBAAmB,IAAIC,MAAsB,CACzCC,aAAa,EACbC,cAAeA,CAACC,EAAGC,IAAMD,EAAElW,KAAOmW,EAAEnW,GACpCoW,cAAc,IAElBnY,KAAAwW,sBAEI,GACIxW,KAAAoY,SAAW,IAAIC,IAUpB,CAEH9N,WACIvK,KAAKY,aACAZ,KAAK0J,MAAMe,SAAS6N,SAASnR,IAAI,UAAM,EAAsBoR,SAClEvY,KAAKD,YAAYG,SAASsY,mBAAmBvS,QAAQ4F,UAAUzL,IAC3DJ,KAAKkQ,aAAe9P,EAAKqY,cAAcC,sBAG3C,MAAMC,EAAW3Y,KAAKoY,SAAS7X,QAC3BqF,KAAU,IACN5F,KAAKD,YAAYe,QAEZ8X,0BAA0B5Y,KAAK0J,MAAMmP,QAAQpO,SAAS6N,SAASnR,IAAI,OACnEhH,UAAUC,GAAQA,EAAKU,WAAQ,EAExCgY,KAAU9Y,KAAK0J,MAAMe,SAASrK,KAAKU,UAGvCd,KAAK+Y,UAAYJ,EAASpY,QACtBqF,KAAU9E,GACNd,KAAK4X,kBAAkBxH,aAAa7P,QAChCuY,KAAU,KAAE,EACZnX,KAAIqX,GACAA,EACMlY,EAAQoB,SAAShB,OAAOiB,GAAKA,EAAES,KAAKqW,cAAcxT,SAASuT,EAAKC,gBAChEnY,EAAQoB,aAK9BlC,KAAKwK,cAAgBmO,EAASpY,QAAKoB,KAAIb,GAAWA,EAAQY,eAC1D1B,KAAKkZ,YAAclZ,KAAK+Y,UAAUxY,QAAKoB,KAAIO,GAAYA,EAASb,SAEhEsX,EAAS9M,UAAUsN,IACfnZ,KAAKc,QAAUqY,EACf,MAAMC,EAAmBD,EAAEjX,SAASP,IAAIQ,GAAKA,EAAEM,QAAQd,IAAIa,GAAUA,EAAOT,KAAKiB,OAC3EqW,EAAwBF,EAAEjX,SAASP,IAAIQ,GAAKA,EAAEM,QAAQd,IAAIa,GAAUA,EAAOkO,UAAU1N,OAC3FhD,KAAK0B,aAAeyX,EAAEzX,aAAaC,IAAImB,KACnCf,GAAIe,EAAGf,GACPyT,OAAO,EACP5S,KAAME,EAAGF,KACTkP,OAAQuH,EAAsB5T,SAAS3C,EAAGf,IAC1CX,OAAQ0B,EAAGL,QAAQd,IAAIgB,KACnBZ,GAAIY,EAAEZ,GACNa,KAAMD,EAAEC,KACRkP,OAAQsH,EAAiB3T,SAAS9C,EAAEZ,SAE1C,EAEV,CAEAuX,gBAAgBvQ,GACZ/I,KAAK+I,aAAeA,EACpB/I,KAAKsI,YAAc,CACvB,CAEAiR,cAAcC,GACVxZ,KAAKsI,YAAckR,CACvB,CAEAC,cAAcC,GACV1Z,KAAK0X,kBAAmB,EACxBgC,EAAYC,SAAU,CAC1B,CAEAC,gBACI,OAAQ5Z,KAAK0X,gBACjB,CAEAmC,iBACI7Z,KAAKyX,aACAqC,cAAc5K,GAAyC,CACpD6K,OAAQ,CACJnZ,aAAcZ,KAAKY,gBAG1BL,QACGqF,KAAUC,GACFA,EACO7F,KAAKD,YAAYe,QAAQS,0BAA0BsE,GAAQtF,QAC9DqF,KAAU,EAAGrC,8BACTvD,KAAKD,YAAYe,QAAQe,wBAAwB,CAC7CG,cAAeuB,EAAyBxB,GACxCD,UAAW9B,KAAKc,QAAQiB,OAK7BiY,MAIlBnO,UAAUhG,IACP7F,KAAKgK,oBAAoBgC,WAAQC,KAAE,gCAAiC,CAChEvB,OAAQ,uBAEZ1K,KAAKoY,SAAS6B,OACdja,KAAK+J,eAAegC,cAAY,EAE5C,CAEAwJ,kBACI3T,GAEA,MAAMG,EAAKH,EAAYG,GACjBmY,EAAsBla,KAAKc,QAAQoB,SAAShB,OAAOiB,GACrDA,EAAEM,QAAQd,IAAIgB,GAAKA,EAAE+N,SAASjL,SAAS1D,IACzCV,OACFrB,KAAKyX,aACA0C,OAAO,CACJC,SAAOnO,KAAE,+CACToO,KAAMH,KAAsBjO,KAAE,oDAAsD,GACpFqO,gBAAiB,CAAE1X,KAAMhB,EAAYgB,KAAM2X,MAAOL,GAClDM,QAAS,CACL,CAAEC,KAAM,YAAaC,SAAOzO,KAAE,kBAC9B,CAAEwO,KAAM,SAAUC,SAAOzO,KAAE,iBAAkB0O,aAAa,MAGjEpa,QACGqF,KAAUgV,GACFA,EACO5a,KAAKD,YAAYe,QAAQ+Z,6BAA6B,CACzD7Y,cAAeD,EACfD,UAAW9B,KAAKc,QAAQiB,GACxB+Y,OAAO,IAGJd,MAIlBnO,UAAU,EAAGgP,mCACsC,YAA5CA,EAA6BE,YAC7B/a,KAAKgK,oBAAoBgC,WAAQC,KAAE,gCAAiC,CAChEvB,OAAQ,uBAEZ1K,KAAKoY,SAAS6B,QACqC,4BAA5CY,EAA6BE,YACpC/a,KAAKgK,oBAAoBmC,MAAM0O,EAA6B1U,SAAW,GAAE,EAGzF,CAEAkP,UAAU9S,EAAeD,GACrB,MAAMsI,EAAQ5K,KAAK0B,aAAaa,GAC5BqI,GAASA,EAAM7I,IACf/B,KAAKD,YAAYe,QACZka,iBAAiB,CACdC,qBAAsBrQ,EAAM7I,GAC5BqB,QAAMC,KAAgBf,EAAY,KAClCgB,aAAc,CAAC,CAAEV,KAAMN,EAAY1B,aAAcZ,KAAKY,iBAEzDiL,UAAU,EAAGqP,0BACVlb,KAAKgK,oBAAoBgC,WAAQC,KAAE,gCAAiC,CAChEvB,OAAQ,kBAEZ1K,KAAKoY,SAAS6B,MAAI,EAGlC,CAEA3I,aAAa/O,GAAiBR,KAAIa,SAC9B,MAAMhB,EAAc5B,KAAK0B,aAAaa,GAClCX,GACA5B,KAAKyX,aACA0C,OAAO,CACJC,SAAOnO,KAAE,yCACTqO,gBAAiB,CAAE1X,QACnB4X,QAAS,CACL,CAAEC,KAAM,YAAaC,SAAOzO,KAAE,kBAC9B,CAAEwO,KAAM,SAAUC,SAAOzO,KAAE,iBAAkB0O,aAAa,MAGjEpa,QACGqF,KAAUgV,GACFA,EACO5a,KAAKD,YAAYe,QAAQqa,oBAAoBpZ,GAE7CiY,MAIlBnO,UAAU,EAAGsP,0BACNA,EAAoBtV,SAAWC,MAAeC,SAC9C/F,KAAKgK,oBAAoBgC,WAAQC,KAAE,gCAAiC,CAChEvB,OAAQ,kBAEZ9I,EAAYR,OAASQ,EAAYR,OAAOF,OAAOiB,GAAKA,EAAEJ,KAAOA,GAC7D/B,KAAKoY,SAAS6B,QAEdja,KAAKgK,oBAAoBmC,MAAMgP,EAAoBhV,SAAW,GAAE,EAIpF,CAEAiQ,wBAAwBgF,EAAmBpZ,EAAuByO,GACzDzQ,KAAKwW,sBAAsB4E,KAC5Bpb,KAAKwW,sBAAsB4E,GAAa,IAExC3K,EACAzQ,KAAKwW,sBAAsB4E,GAAWpZ,GAAiByO,SAEhDzQ,KAAKwW,sBAAsB4E,GAAWpZ,EAErD,CAEAsU,mBAAmBzR,GACf,MAAMzC,EAAY,IACXyC,EAAQpC,QAAQd,IAAIgB,GAAKA,EAAEZ,OAC3BsO,OAAOjP,OAAOpB,KAAKwW,sBAAsB3R,EAAQ9C,MAExD/B,KAAKD,YAAYe,QACZqE,sBAAsB,CACnB,CACIpD,GAAI8C,EAAQ9C,GACZK,aAAWqS,KAAOrS,MAGzByJ,UAAU,EAAG1G,4BACVnF,KAAKoY,SAAS6B,MAAI,EAE9B,CAEA7C,cAAcvS,GACV7E,KAAKyX,aACA0C,OAAO,CACJC,SAAOnO,KAAE,0CACTqO,gBAAiB,CAAE1X,KAAMiC,EAAQjC,MACjC4X,QAAS,CACL,CAAEC,KAAM,YAAaC,SAAOzO,KAAE,kBAC9B,CAAEwO,KAAM,SAAUC,SAAOzO,KAAE,iBAAkB0O,aAAa,MAGjEpa,QACGqF,KAAUyV,GACNA,EACMrb,KAAK6J,qBAAqBlE,qBAAqBd,EAAQ9C,GAAI/B,KAAKc,QAAQiB,IACxEiY,MAGbnO,UACG,KACI7L,KAAKgK,oBAAoBgC,WAAQC,KAAE,gCAAiC,CAChEvB,OAAQ,mBAEZ1K,KAAKoY,SAAS6B,MAAI,EAEtB/N,IACIlM,KAAKgK,oBAAoBmC,SAAMF,KAAE,8BAA+B,CAC5DvB,OAAQ,kBACX,EAGjB,CAEA4Q,mBACItb,KAAKyX,aACAqC,cAAc9J,GAAqC,CAChD+J,OAAQ,CACJjZ,QAASd,KAAKc,WAGrBP,QACGqF,KAAUC,GACFA,EACO7F,KAAKD,YAAYe,QAAQmC,sBAAsB,CAAC4C,IAEhDmU,MAIlBnO,UAAUhG,IACP7F,KAAKgK,oBAAoBgC,WAAQC,KAAE,gCAAiC,CAChEvB,OAAQ,mBAEZ1K,KAAKoY,SAAS6B,MAAI,EAE9B,CAEAtD,UACI9R,EACA6L,GAEA,OAAO7L,EAAQpC,QAAQC,KAAKC,GAAKA,EAAE+N,UAAYA,EACnD,MA5TS8G,4CAA8BpR,MAAAC,MAAAD,MAAA2H,OAAA3H,MAAA4H,IAAA5H,MAAA2H,OAAA3H,MAAA2H,OAAA3H,aAAA,2BAA9BoR,GAA8BtJ,UAAA,kCAAAE,MAAA,GAAAC,KAAA,GAAAC,OAAA,owCAAAC,SAAA,SAAAC,EAAAC,GAAA,EAAAD,ID5D3CpI,MAAA,mBAAAA,CAAgB,cAERA,MAAA,EAAAmV,GAAA,eAoBAnV,MAAA,cAA4BA,MAAA,0BAASqI,EAAAoL,gBAAgB,GACjDzT,MAAA,gBACAA,MAAA,wBACJA,UAEJA,MAAA,eAAAA,CAA6B,UAA7BA,CAA6B,cAEEA,MAAA,0BAASqI,EAAA6M,kBAAkB,GAC9ClV,MAAA,iBACAA,MAAA,0BACJA,UAEJA,MAAA,yBAMIA,MAAA,sBAAA6B,GAAA,OAAcwG,EAAA8K,cAAAtR,EAAqB,EAAnC7B,CAAoC,8BAAA6B,GAAA,OACdwG,EAAA6K,gBAAArR,EAAuB,uCAE7C7B,MAAA,6CAIAA,MAAA,6CACIA,MAAA,GAAAoV,GAAA,mBAGJpV,QACAA,MAAA,6CACIA,MAAA,GAAAqV,GAAA,mBAGJrV,QACAA,MAAA,8CACIA,MAAA,GAAAsV,GAAA,mBAGJtV,QACAA,MAAA,8CACIA,MAAA,GAAAuV,GAAA,mBAGJvV,QACAA,MAAA,8CACIA,MAAA,GAAAwV,GAAA,mBAGJxV,QACAA,MAAA,GAAAyV,GAAA,2CA4BAzV,MAAA,8CACIA,MAAA,GAAA0V,GAAA,mBAGJ1V,QACAA,MAAA,8CACIA,MAAA,GAAA2V,GAAA,mBAGJ3V,QACAA,MAAA,8CACIA,MAAA,GAAA4V,GAAA,mBAKJ5V,qBAlHmBA,MAAA,GAAAA,MAAA,UAAAqI,EAAA/M,cAsBnB0E,MAAA,GAAAA,MAAA,IAAAA,MAAA,iDAGEA,MAAA,GAAAA,MAAA,eAIEA,MAAA,GAAAA,MAAA,IAAAA,MAAA,6CAKJA,MAAA,GAAAA,MAAA,QAAAA,MAAA,MAAAqI,EAAAsK,WAAA3S,CAA2B,eAAAqI,EAAA1F,aAA3B3C,CAA2B,aAAAA,MAAA,MAAAqI,EAAAyK,aAA3B9S,CAA2B,cAAAqI,EAAAnG,aAQvBlC,MAAA,GAAAA,MAAA,oBAAAqI,EAAAmJ,kBAAAxR,CAAuC,wBAAAA,MAAA,iCAG3BA,MAAA,GAAAA,MAAA,UAAAA,MAAA,mBAAAA,CAAmC,sBAKnCA,MAAA,GAAAA,MAAA,UAAAA,MAAA,2BAAAA,CAA2C,sBAK3CA,MAAA,GAAAA,MAAA,UAAAA,MAAA,2BAAAA,CAA2C,sBAK3CA,MAAA,GAAAA,MAAA,UAAAA,MAAA,sBAAAA,CAAsC,eAKtCA,MAAA,GAAAA,MAAA,UAAAA,MAAA,qBAAAA,CAAqC,eAKbA,MAAA,GAAAA,MAAA,UAAAA,MAAA,MAAAqI,EAAAjE,gBA4BxBpE,MAAA,GAAAA,MAAA,UAAAA,MAAA,sBAAAA,CAAsC,sBAKtCA,MAAA,GAAAA,MAAA,UAAAA,MAAA,+BAAAA,CAA+C,sBAK/CA,MAAA,GAAAA,MAAA,UAAAA,MAAA,uBAAAA,CAAuC,ybEvG7D,MAAO6V,WAAgCC,MACzCpc,YAAY6J,EAAgB5J,GACxBkK,MACIN,EACA,CACIoR,WAAY,UACZhZ,GAAI,GACJyF,UAAW,GACXE,UAAW,GACX9E,KAAM,GACNhC,aAAc,GACdc,aAAc,GACdQ,SAAU,IAEdH,GAAMhC,EAAYe,QAAQ8X,0BAA0B7W,GAAIoa,UAAU/b,GAAQA,EAAKU,SAEvF,MAhBSmb,4CAAuB7V,MAAAC,MAAAD,MAAA2H,OAAA,6BAAvBkO,GAAuB3V,QAAvB2V,GAAuB1V,UAAAC,WAFpB,SCUT,MAAM4V,GAAgBC,GAAsC,CAC/D,CACIC,KAAM,WACNC,UAAWC,MACXpc,KAAM,CACFqc,WAAY,eACZC,cAAYzQ,KAAE,wBAElB0Q,SAAUN,EAAYO,iBAAiB,iBAE3C,CACIN,KAAM,YACNO,WAAY,YAEhB,CACIP,KAAM,eACNC,UAAWC,MACXpc,KAAM,CACFqc,WAAY,iBACZC,WAAY,CAAEhC,SAAOzO,KAAE,uBAAwB6Q,KAAM,CAAC,MAAO,cAEjEH,SAAU,CACN,CACIL,KAAM,kBACNC,UAAW/E,GACXoC,cAAe,CAACmD,OAChB3c,KAAM,CACFsc,WAAYA,EAAG5b,aAAc,CACzB,CACI4Z,MAAO,GAAG5Z,EAAQ8B,OAClBka,KAAM,CAAC,QAEX,CACIpC,SAAOzO,KAAE,8BACT6Q,KAAM,CAAC,sBAInBE,QAAS,CACLlc,QAAU4I,MACNuT,OAAOC,OACFpc,QAAQ8X,0BAA0BlP,EAAMmP,QAAQsE,OAAOpb,IACvD5B,UAAUC,GAAQA,EAAKU,cAGrCub,EAAYO,iBAAiB,oBAGxC,CACIN,KAAM,mCACNC,UAAWC,MACXpc,KAAM,CACFqc,WAAY,yBACZC,WAAY,CAAEhC,SAAOzO,KAAE,uBAAwB6Q,KAAM,CAAC,MAAO,cAEjEH,SAAUN,EAAYO,iBAAiB,2BAE3C,CACIN,KAAM,uBACNC,UAAW/S,GACXwT,WAASI,OAAkBnB,IAC3BrC,cAAe,CAACmD,OAChB3c,KAAM,CACFsc,WAAYW,KAGpB,CACIf,KAAM,SACNC,UAAWC,MACXpc,KAAM,CACFqc,WAAY,aACZC,cAAYzQ,KAAE,sBAElB0Q,SAAUN,EAAYO,iBAAiB,eAE3C,CACIN,KAAM,aACNC,UAAWC,MACXpc,KAAM,CACFqc,WAAY,eACZC,WAAY,CAAEhC,SAAOzO,KAAE,qBAAsB6Q,KAAM,CAAC,MAAO,YAE/DH,SAAUN,EAAYO,iBAAiB,iBAE3C,CACIN,KAAM,cACNC,UAAWC,MACXpc,KAAM,CACFqc,WAAY,kBACZC,cAAYzQ,KAAE,2BAElB0Q,SAAUN,EAAYO,iBAAiB,oBAE3C,CACIN,KAAM,kBACNC,UAAWC,MACXpc,KAAM,CACFqc,WAAY,oBACZC,WAAY,CAAEhC,SAAOzO,KAAE,0BAA2B6Q,KAAM,CAAC,MAAO,iBAEpEH,SAAUN,EAAYO,iBAAiB,sBAE3C,CACIN,KAAM,SACNC,UAAWC,MACXpc,KAAM,CACFqc,WAAY,aACZC,cAAYzQ,KAAE,sBAElB0Q,SAAUN,EAAYO,iBAAiB,eAE3C,CACIN,KAAM,aACNC,UAAWC,MACXpc,KAAM,CACFqc,WAAY,eACZC,WAAY,CAAEhC,SAAOzO,KAAE,qBAAsB6Q,KAAM,CAAC,MAAO,YAE/DH,SAAUN,EAAYO,iBAAiB,kBAIzC,SAAUS,GAA+Bjd,EAAW+c,GACtD,OAAO/c,EAAKsK,OAAOnK,QACfoB,KAAK+I,GAAgB,CACjB,CACIgQ,SAAOzO,KAAE,uBACT6Q,KAAM,CAAC,MAAO,aAElB,CACIpC,MAAO,GAAGhQ,EAAO9H,OACjBka,KAAM,CAAC,MAAO,WAAYK,EAAOpb,KAErC,CACI2Y,SAAOzO,KAAE,8BACT6Q,KAAM,CAAC,cAIvB,0CC1J4B1W,MAAA,8BAAAA,YAAA,oEAOxBA,MAAA,cAAkCA,MAAA,mBAAAA,MAAAK,GAAA,MAAAC,EAAAN,QAAA,OAASA,MAAAM,EAAAoI,SAAQ,GAAE1I,MAAA,wBAAiCA,QACtFA,MAAA,cAEIA,MAAA,mBAAAA,MAAAK,GAAA,MAAAsI,EAAA3I,QAAA,OAASA,MAAA2I,EAAAuO,eAAc,GAIvBlX,MAAA,wBACJA,gCARqDA,MAAA,GAAAA,YAAA,sBAIjDA,MAAA,GAAAA,MAAA,eAAAkD,EAAAiU,eAAAlc,QAGA+E,MAAA,GAAAA,MAAA,IAAAA,MAAA,gCCMF,MAAOoX,GAOT1d,YAAoBiK,GAAA/J,KAAA+J,iBAJpB/J,KAAAud,eAA+B,EAIyB,CAExDE,kBACI1J,WAAW,IAAM/T,KAAK0d,SAASjK,QAAS,EAC5C,CAEA6J,eACItd,KAAKwP,YAAYxP,KAAKud,eAC1B,CAEAzO,SACI9O,KAAKwP,aACT,MAnBSgO,4CAAyBpX,aAAA,2BAAzBoX,GAAyBtP,UAAA,6BAAA2G,UAAA,SAAArG,EAAAC,MAAA,EAAAD,QACvBmP,MAA2B,sRDrB1CvX,MAAA,EAAAwX,GAAA,qBAEAxX,MAAA,gCACIA,MAAA,gCAAA6B,GAAA,OAAAwG,EAAA8O,eAAAtV,CAAA,GACH7B,QAEDA,MAAA,EAAAyX,GAAA,4JEAYzX,MAAA,cAGIA,MAAA,mBAAAA,MAAA0X,GAAA,MAAAxU,EAAAlD,QAAA,OAASA,MAAAkD,EAAA3C,OAAM,GAGfP,MAAA,wBACJA,gCAHIA,MAAA,WAAAQ,EAAAC,WAAAE,SAAAH,EAAAC,WAAAC,UAEAV,MAAA,GAAAA,MAAA,IAAAA,MAAA,sFCIH2X,GAAqBC;;;;;;;;;MAS5BC;MACAC;EASA,MAAOC,WACDC,MAURte,YACYkK,EACEjK,EACF+J,GAERG,QAJQjK,KAAAgK,sBACEhK,KAAAD,cACFC,KAAA8J,cAVH9J,KAAAsN,aAAetN,KAAKsK,qBAAqB,SAClDtK,KAAA6G,WAAa,IAAIwX,KAAU,CACvBzb,KAAM,IAAIuN,KAAY,IACtBmO,KAAM,IAAInO,KAAY,IACtB7C,aAActN,KAAK8J,YAAYc,SAAM2T,OAAwBve,KAAKsN,gBAStE,CAEA/C,WACIvK,KAAK+K,MACT,CAEAyT,cACIxe,KAAKye,SACT,CAEAC,cAAc9K,GACV5T,KAAK6G,WAAWM,IAAI,SAAS2G,SAAS8F,EAAMhR,MAC5C5C,KAAK6G,WAAWM,IAAI,SAAS2G,SAAS8F,EAAM0K,MAC5Cte,KAAK6G,WAAW8X,aACpB,CAEAhY,OACI3G,KAAKD,YAAYe,QACZ8d,YAAY,CACT7c,GAAI/B,KAAK+B,GACTa,KAAM5C,KAAK6G,WAAWS,MAAM1E,KAC5B0b,KAAMte,KAAK6G,WAAWS,MAAMgX,KAC5BhR,aAActN,KAAK6G,WAAWS,MAAMgG,eAEvCzB,UACG,KACI7L,KAAKgK,oBAAoBgC,WAAQC,KAAE,gCAAiC,CAAEvB,OAAQ,SAAS,EAE3FwB,IACIlM,KAAKgK,oBAAoBmC,SAAMF,KAAE,8BAA+B,CAC5DvB,OAAQ,SACX,EAGjB,CAEUiC,cACNjC,EACA9J,GAEAZ,KAAK6G,WAAWM,IAAI,SAAS2G,SAASpD,EAAO9H,MAC7C5C,KAAK6G,WAAWM,IAAI,SAAS2G,SAASpD,EAAO4T,KAAK3c,IAAIkd,GAAKA,EAAE9c,KACzD/B,KAAKsN,aAAajM,QAClBrB,KAAK4N,yBAAyB5N,KAAKsN,aAActN,KAAK6G,WAAWM,IAAI,CAAC,iBAAkBuD,EAEhG,MA9DSyT,4CAAoB/X,MAAAC,OAAAD,MAAAC,OAAAD,MAAA2H,MAAA,2BAApBoQ,GAAoBjQ,UAAA,uBAAAC,SAAA,CAAA/H,OAAAgI,MAAA,EAAAC,KAAA,EAAAC,OAAA,0NAAAC,SAAA,SAAAC,EAAAC,GAAA,EAAAD,IDnCjCpI,MAAA,mBAAAA,CAAgB,oBAERA,MAAA,iBAEAA,MAAA,kBACIA,MAAA,4BACAA,MAAA,EAAA0Y,GAAA,gBAQJ1Y,YAGRA,MAAA,mBAAAA,CAAgB,yBAMRA,MAAA,uBAAA6B,GAAA,OAAewG,EAAAiQ,cAAAzW,EAAqB,oBALxC7B,iBAXaA,MAAA,GAAAA,MAAA,mBAAAA,MAAA,EAAA2Y,KAYT3Y,MAAA,GAAAA,MAAA,QAAAA,MAAA,IAAAqI,EAAAtD,SAAA/E,CAAyB,cAAzBA,CAAyB,eAAAqI,EAAAnB,aAAzBlH,CAAyB,mBAAAqI,EAAA5H,WAAAM,IAAA,kXEO3B,MAAO6X,WACDC,MAaRnf,YACYkK,EACAyN,EACA1X,EACR4J,EACAD,GAEAO,MAAMN,EAAQD,GANN1J,KAAAgK,sBACAhK,KAAAyX,eACAzX,KAAAD,cATZC,KAAAkf,YAAc,IAAIC,SAAoCC,GACtDpf,KAAAqf,cAAgB,IAAIF,SAA2CC,GAC/Dpf,KAAAsf,WAAY,EAYRrV,MAAMsV,WACF,IAAIC,IAAgBxf,KAAKD,YAAYe,QAAQ2e,gBAAgBD,GAAME,yBACnEtf,GAAQA,EAAKuf,OACb,CAACC,EAAMvU,KACH,MAAMwU,EAAa7f,KAAKkf,YAAY5X,MAC9BgX,EAAOte,KAAKqf,cAAc/X,OAAO3F,IAAIkd,GAAKA,EAAEvX,OAClD,MAAO,CACH7E,QAAS,CACLmd,OACAvU,UACIwU,EACE,CACI3e,OAAQ,CACJ0B,KAAM,CAAEkd,SAAUD,KAG1B,GACNE,KAAM,CACFvY,UAAWwY,MAAUC,MAEzB3B,OACA4B,aAAcC,MAAgBC,OAI1C,CAAE/U,KAAM,GAAIuU,KAAM,GAE1B,CAEArV,WACIN,MAAMM,WACNvK,KAAKqgB,qBAAoBnV,KAAclL,KAAKsgB,cAAetgB,KAAKugB,aAAcvgB,KAAKkZ,aAAa3Y,QAC5FoB,KAAI,EAAEoH,EAAcT,EAAakY,MAAU,CAASzX,eAAcT,cAAakY,iBAEnFxgB,KAAKkf,YAAY3e,QAAKkgB,MAAa,MAAG,EAAGC,MAAU1gB,KAAK2gB,WAAW9U,UAAU,IAAM7L,KAAK4gB,WAExF5gB,KAAKqf,cAAc9e,QAAKmgB,MAAU1gB,KAAK2gB,WAAW9U,UAAU,IAAM7L,KAAK4gB,WACvE5gB,KAAK6gB,SAAW7gB,KAAKD,YAAYe,QAAQggB,aAAa3E,UAAU/b,GAAQA,EAAKke,KAAKhe,MACtF,CAEAygB,cAAcC,GACNA,EAAM3f,SACNrB,KAAKsf,WAAY,EACjBtf,KAAKD,YAAYe,QACZmgB,aAAaD,GACbzgB,QAAK2gB,MAAS,IAAOlhB,KAAKsf,WAAY,IACtCzT,UAAU,EAAGoV,mBACV,IAAIE,EAAe,EACnB,UAAWtb,KAAUob,EACjB,OAAQpb,EAAOkV,YACX,IAAK,QACDoG,IACA,MACJ,IAAK,gBACDnhB,KAAKgK,oBAAoBmC,MAAMtG,EAAOM,SAI9C,EAAIgb,IACJlX,MAAM2W,UACN5gB,KAAKgK,oBAAoBgC,WAAQC,KAAE,sCAAuC,CACtEsO,MAAO4G,IACV,GAIrB,CAEAC,aAAazB,GACT3f,KAAKqhB,mBAAmB1B,EAAOhe,IAAIsW,GAAKA,EAAElW,KACrCxB,QACGqF,KAAUyV,GACFA,EAASxV,SAAWC,MAAeC,QAC5B,EAAC,GAED/F,KAAKqhB,mBACR1B,EAAOhe,IAAIsW,GAAKA,EAAElW,IAClBsZ,EAASlV,SAAW,IACtB5F,QAAKoB,KAAI2f,GAAKA,EAAEzb,SAAWC,MAAeC,YAIvD8F,UACG,KACI7L,KAAKgK,oBAAoBgC,WAAQC,KAAE,gCAAiC,CAChEvB,OAAQ,WAEZ1K,KAAK4gB,SAAO,EAEhB1U,IACIlM,KAAKgK,oBAAoBmC,SAAMF,KAAE,8BAA+B,CAC5DvB,OAAQ,UACX,EAGjB,CAEQ2W,mBAAmBE,EAAoBpb,GAC3C,OAAOnG,KAAKyX,aACP0C,OAAO,CACJC,SAAOnO,KAAE,iCACTqO,gBAAiB,CACbC,MAAOgH,EAASlgB,QAEpBgZ,KAAMlU,EACNqU,QAAS,CACL,CAAEC,KAAM,YAAaC,SAAOzO,KAAE,kBAC9B,CAAEwO,KAAM,SAAUC,SAAOzO,KAAE,iBAAkB0O,aAAa,MAGjEpa,QACGqF,KAAU4b,GAAQA,EAAMxhB,KAAKD,YAAYe,QAAQsgB,aAAaG,IAAYpb,GAAW6T,MAAM,EAC3FrY,KAAI6f,GAAOA,EAAIJ,cAE3B,MAxISpC,4CAAkB5Y,MAAAC,OAAAD,MAAAC,OAAAD,MAAAC,OAAAD,MAAA2H,MAAA3H,MAAA2H,MAAA,2BAAlBiR,GAAkB9Q,UAAA,qBAAAC,SAAA,CAAA/H,OAAAgI,MAAA,GAAAC,KAAA,GAAAC,OAAA,sSAAAC,SAAA,SAAAC,EAAAC,GAAA,EAAAD,IC1B/BpI,MAAA,mBAAAA,CAAgB,UAAhBA,CAAgB,8BAIJA,MAAA,4BAAA6B,GAAA,OAAoBwG,EAAAyQ,YAAAjF,KAAAhS,EAAwB,EAA5C7B,CAA6C,sBAAA6B,GAAA,OAC/BwG,EAAA4Q,cAAApF,KAAAhS,EAA0B,oBAExC7B,MAAA,4BACIA,MAAA,uBAAA6B,GAAA,OAAewG,EAAAsS,cAAA9Y,EAAqB,GAGvC7B,YAGTA,MAAA,yBAIIA,MAAA,wBAAA6B,GAAA,OAAgBwG,EAAA2S,aAAAnZ,EAAoB,kFACvC7B,QAEDA,MAAA,WAAAA,CAA6B,oCAGrBA,MAAA,8BAAA6B,GAAA,OAAsBwG,EAAA6K,gBAAArR,EAAuB,qBAChD7B,QAEDA,MAAA,gCAIIA,MAAA,sBAAA6B,GAAA,OAAcwG,EAAA8K,cAAAtR,EAAqB,yDACtC7B,mBA7BGA,MAAA,GAAAA,MAAA,OAAAA,MAAA,IAAAqI,EAAAoS,WAMIza,MAAA,GAAAA,MAAA,YAAAqI,EAAA6Q,WAMRlZ,MAAA,GAAAA,MAAA,SAAAA,MAAA,KAAAA,MAAA,KAAAqI,EAAAgT,QAAArb,MAAA,KAAAqI,EAAA4R,oBAAAja,MAAA,GAAA2Y,KAAA3Y,CAA2E,iBAA3EA,CAA2E,YAAAA,MAAA,KAAAA,MAAA,GAAAsb,MAQvEtb,MAAA,GAAAA,MAAA,eAAAA,MAAA,MAAAqI,EAAA6R,gBAKAla,MAAA,GAAAA,MAAA,cAAAA,MAAA,MAAAqI,EAAA8R,cAAAna,CAAoC,eAAAA,MAAA,MAAAqI,EAAA6R,eAApCla,CAAoC,aAAAA,MAAA,MAAAqI,EAAAyK,4gBC1BxC9S,MAAA,YAGIA,MAAA,mBAAAA,MAAAub,GAAA,MAAA7Y,EAAA1C,MAAA,UAASA,MAAA0C,EAAA8Y,aAAA9Y,EAAA+Y,eAA2B,2BAHxCzb,iCAEIA,MAAA,MAAAA,MAAA,IAAA+C,EAAA0Y,cAAA,SAAAzb,iDAGJA,MAAA,YAAgDA,MAAA,mBAAAA,MAAA2O,GAAA,MAAArD,EAAAtL,MAAA,UAASA,MAAAsL,EAAAoQ,eAAc,GACnE1b,MAAA,iBACAA,MAAA,SAAKA,MAAA,wBAA6CA,gBAA7CA,MAAA,GAAAA,YAAA,yDAIbA,MAAA,4CACAA,MAAA,QAAAA,CAA2C,eACnBA,MAAA,mBAAAA,MAAA+O,GAAA,MAAA4M,EAAA3b,MAAA,UAASA,MAAA2b,EAAAD,eAAc,GACvC1b,MAAA,iBACAA,MAAA,wBACJA,gBADIA,MAAA,GAAAA,MAAA,IAAAA,MAAA,uDAjBZA,MAAA,UAAAA,CAAwE,WAEhEA,MAAA,EAAA4b,GAAA,aAKA5b,MAAA,EAAA6b,GAAA,aAIJ7b,QACAA,MAAA,WACAA,MAAA,EAAA8b,GAAA,sBACA9b,MAAA,EAAA+b,GAAA,aAMA/b,2CAjBSA,MAAA,GAAAA,MAAA,OAAAQ,EAAAib,eAIqBzb,MAAA,GAAAA,MAAA,QAAAQ,EAAAib,eAMfzb,MAAA,GAAAA,MAAA,mBAAAK,GACTL,MAAA,GAAAA,MAAA,mBAAAQ,EAAAwb,6DAWFhc,MAAA,YAGIA,MAAA,mBAAAA,MAAAic,GAAA,MAAAC,EAAAlc,MAAA,UAASA,MAAAkc,EAAAV,aAAAU,EAAAT,eAA2B,2BAHxCzb,iCAEIA,MAAA,MAAAA,MAAA,IAAAwB,EAAAia,cAAA,SAAAzb,iDAIJA,MAAA,YAAgDA,MAAA,mBAAAA,MAAAmc,GAAA,MAAAC,EAAApc,MAAA,UAASA,MAAAoc,EAAAV,eAAc,GACnE1b,MAAA,iBACJA,+BAEJA,MAAA,4CACAA,MAAA,eAIIA,MAAA,mBAAAA,MAAAqc,GAAA,MAAAC,EAAAtc,MAAA,UAASA,MAAAsc,EAAAZ,eAAc,wBAEvB1b,MAAA,iBACAA,MAAA,wBACJA,cALIA,MAAA,QAAAA,MAAA,wBAIAA,MAAA,GAAAA,MAAA,IAAAA,MAAA,uDAnBJA,MAAA,YACIA,MAAA,EAAAuc,GAAA,aAMAvc,MAAA,EAAAwc,GAAA,aAGJxc,QACAA,MAAA,EAAAyc,GAAA,sBACAzc,MAAA,EAAA0c,GAAA,kDAVS1c,MAAA,GAAAA,MAAA,OAAAM,EAAAmb,eAKqBzb,MAAA,GAAAA,MAAA,QAAAM,EAAAmb,eAIfzb,MAAA,GAAAA,MAAA,mBAAAK,GAEVL,MAAA,GAAAA,MAAA,mBAAAM,EAAA0b,6DAYDhc,MAAA,YAOIA,MAAA,8BAAA6B,GAAA7B,MAAA2c,GAAA,MAAAxM,EAAAnQ,MAAA,UAAsBA,MAAAmQ,EAAAyM,gBAAA/a,GAAuB,4BAE7C7B,MAAA,oBAAAA,CAAsB,YAQdA,MAAA,oCACJA,QACAA,MAAA,yBAAAA,CAA8C,eACJA,MAAA,yBAAA6c,EAAA7c,MAAA2c,GAAA5a,UAAA+a,EAAA9c,MAAA,UAASA,MAAA8c,EAAAtB,aAAAqB,GAAmB,GAC9D7c,MAAA,wBACJA,QACAA,MAAA,gBAIIA,MAAA,yBAAA6c,EAAA7c,MAAA2c,GAAA5a,UAAAgO,EAAA/P,MAAA,UAASA,MAAA+P,EAAAgN,cAAAF,GAAoB,6BAE7B7c,MAAA,0BACJA,QACAA,MAAA,aACAA,MAAA,gBAKIA,MAAA,yBAAA6c,EAAA7c,MAAA2c,GAAA5a,UAAAib,EAAAhd,MAAA,UAASA,MAAAgd,EAAAC,YAAAJ,GAAkB,6BAE3B7c,MAAA,0BACJA,+DAnCRA,MAAA,kBAAAkd,EAAAld,CAAyB,uBAAAA,MAAA,KAAAmd,EAAAnB,oBAQjBhc,MAAA,GAAAA,MAAA,WAAAmd,EAAAC,WAAAP,IAIK7c,MAAA,GAAAA,MAAA,MAAAA,MAAA,KAAA6c,EAAA,QAAA7c,OAIDA,MAAA,GAAAA,MAAA,IAAAA,MAAA,2BAIAA,MAAA,GAAAA,MAAA,WAAAmd,EAAAC,WAAAP,KAAA7c,MAAA,MAAAmd,EAAAnB,oBAIAhc,MAAA,GAAAA,MAAA,IAAAA,MAAA,0CAOAA,MAAA,GAAAA,MAAA,YAAAA,MAAA,MAAAmd,EAAAnB,oBAGAhc,MAAA,GAAAA,MAAA,IAAAA,MAAA,4DAxCpBA,MAAA,YACIA,MAAA,EAAAqd,GAAA,gBA4CJrd,8BA7CwBA,MAAA,UAAA2I,EAAA2U,SAEEtd,MAAA,GAAAA,MAAA,UAAA2I,EAAA4Q,SCbxB,MAAOgE,GACT,gBAAqBC,CAAahJ,GAE9B5a,KAAK2f,QAAU/E,GAAO,IAAIiJ,OAC9B,CAcA/jB,YAAoB2X,EAAoC1N,GAApC/J,KAAAyX,eAAoCzX,KAAA+J,iBATxD/J,KAAA0jB,SAAU,EAEA1jB,KAAA8jB,OAAS,IAAInR,MAEhB3S,KAAA2f,OAAkB,EAKmE,CAE5FmC,eACI9hB,KAAKyX,aACAqC,cAAciK,MAA4B,CACvCC,KAAM,OAETnY,UAAUhG,IACHA,GAAUA,EAAOxE,SACjBrB,KAAK2f,UAASlL,KAAOzU,KAAK2f,OAAOsE,OAAOpe,GAAS,MAC5C7F,KAAK6hB,gBACN7hB,KAAK6hB,cAAgBhc,EAAO,IAEhC7F,KAAKkkB,gBAAgBlkB,KAAK2f,OAAQ3f,KAAK6hB,eACvC7hB,KAAK+J,eAAegC,eAAY,EAGhD,CAEAoX,cAAcgB,GACVnkB,KAAK6hB,cAAgBsC,EACrBnkB,KAAKkkB,gBAAgBlkB,KAAK2f,OAAQwE,EACtC,CAEAX,WAAWW,GACP,QAASnkB,KAAK6hB,eAAiB7hB,KAAK6hB,cAAc9f,KAAOoiB,EAAMpiB,EACnE,CAEA6f,aAAauC,GACTnkB,KAAKyX,aACAqC,cAAcsK,KAA6B,CACxCJ,KAAM,KACNK,UAAU,EACVtK,OAAQ,CAAEoK,QAAOxE,OAAQ3f,KAAK2f,UAEjC9T,WACT,CAEAwX,YAAYc,GACRnkB,KAAK2f,OAAS3f,KAAK2f,OAAOze,OAAO+W,GAAKA,EAAElW,KAAOoiB,EAAMpiB,IACjD/B,KAAK6hB,eAAiB7hB,KAAK6hB,cAAc9f,KAAOoiB,EAAMpiB,KACtD/B,KAAK6hB,cAAgB7hB,KAAK2f,OAAOte,OAAS,EAAIrB,KAAK2f,OAAO,QAAKP,GAEnEpf,KAAKkkB,gBAAgBlkB,KAAK2f,OAAQ3f,KAAK6hB,cAC3C,CAEQqC,gBAAgBvE,EAAiBkC,GACrC7hB,KAAK8jB,OAAO7P,KAAK,CACb0L,SACAkC,iBAER,CAEAmB,gBAAgBpP,IACZ0Q,QAAgBtkB,KAAK2f,OAAQ/L,EAAM2Q,kBAAkBnkB,KAAMwT,EAAM4Q,UAAUpkB,MAC3EJ,KAAKkkB,gBAAgBlkB,KAAK2f,OAAQ3f,KAAK6hB,cAC3C,MA1ES8B,4CAAevd,MAAAC,OAAAD,aAAA,2BAAfud,GAAezV,UAAA,iBAAAuW,SAAA,EAAAC,aAAA,SAAAlW,EAAAC,GAAA,EAAAD,ihDDrC5BpI,MAAA,EAAAue,GAAA,aAuBAve,MAAA,EAAAwe,GAAA,yBAAAxe,OAwBAA,MAAA,EAAAye,GAAA,yBAAAze,8BA/CMA,MAAA,QAAAqI,EAAAiV,QAAAtd,CAAgB,WAAA4O,0wFEClB5O,MAAA,GAAkEA,MAAA,wBAEhEA,eAFgEA,MAAA,GAAAA,YAAA,mEAGnCA,MAAA,8BAAAA,YAAA,qEAH/BA,MAAA,EAAA0e,GAAA,uBAGA1e,MAAA,EAAA2e,GAAA,0BAAA3e,wCAHeA,MAAA,OAAAQ,EAAAoe,qBAAA5e,CAA4B,WAAA0J,sEAsCvB1J,MAAA,8CAAAA,MAAA,IAAAA,MAAA,+BAAAA,MAAA,EAAA2Y,GAAA,MAAAzV,EAAA2b,gBAAA,KAAA3b,EAAA2b,gBAAA7hB,OAAA,6BAGAgD,MAAA,8BAAAA,MAAA,IAAAA,MAAA,kEAWAA,MAAA,uEAAAA,MAAA,IAAAA,MAAA,IAAA8e,EAAAC,aAAA,MAAAC,EAAAH,gBAAA,KAAAG,EAAAH,gBAAAvM,qBAAA,4BAE6BtS,MAAA,mCAPzCA,MAAA,OAAAA,CAAiD,QACzCA,MAAA,GAAcA,QAClBA,MAAA,QAAIA,MAAA,6BAAqEA,QACzEA,MAAA,QACIA,MAAA,EAAAif,GAAA,qBAGAjf,MAAA,EAAAkf,GAAA,0BAAAlf,OACJA,yDAPIA,MAAA,GAAAA,MAAA8e,EAAAtiB,MACAwD,MAAA,GAAAA,YAAA,IAAA8e,EAAAvhB,MAAA,MAAAoL,EAAAwW,eAAA,KAAAxW,EAAAwW,eAAA7M,sBAEatS,MAAA,GAAAA,MAAA,OAAA2I,EAAAkW,gBAAA7e,CAAwB,WAAAof,0EAc7Cpf,MAAA,+CAAAA,MAAA,IAAAA,MAAA,sCAAAA,MAAA,EAAAsb,GAAA,MAAA+D,EAAAR,gBAAA,KAAAQ,EAAAR,gBAAA7hB,OAAA,6BAGAgD,MAAA,8BAAAA,MAAA,IAAAA,MAAA,iFANRA,MAAA,eAAkCA,MAAA,mBAAAA,MAAAsf,GAAA,MAAA5d,EAAA1B,QAAA,OAASA,MAAA0B,EAAAgH,SAAQ,GAAE1I,MAAA,wBAAiCA,QACtFA,MAAA,eAAsBA,MAAA,mBAAAA,MAAAsf,GAAA,MAAApD,EAAAlc,QAAA,OAASA,MAAAkc,EAAAqD,SAAQ,GACnCvf,MAAA,EAAAwf,GAAA,qBAGAxf,MAAA,EAAAyf,GAAA,yBAAAzf,OAGJA,2CARqDA,MAAA,GAAAA,YAAA,sBACZA,MAAA,GAAAA,MAAA,YAAA+C,EAAA8b,iBACxB7e,MAAA,GAAAA,MAAA,OAAA+C,EAAA8b,gBAAA7e,CAAwB,WAAA0f,IC3CvC,MAAOC,GAcT,wBAAIf,GACA,OAAiC,MAA1BhlB,KAAKgmB,iBAChB,CAEAlmB,YAAoBC,EAAkCiK,GAAlChK,KAAAD,cAAkCC,KAAAgK,sBAZtDhK,KAAAimB,mBAAqB,IAAIC,KAAmB,GAC5ClmB,KAAAmmB,yBAA2B,IAAID,IAWkE,CAEjG3b,WACI,MAAM6b,EAAmBpmB,KAAKD,YAAYsmB,OACrCC,aACAnmB,UAAU,EAAGmmB,gBAAiBA,EAAWC,iBACxCC,EAAexmB,KAAKD,YAAYG,SAASumB,cAActmB,UAAUC,GAAQA,EAAKsmB,WAEpFxb,OAAckb,EAAkBI,GAAc3a,UAAU,EAAE0a,EAAiBG,MAEvE1mB,KAAKulB,eAAiBmB,EAASpmB,MAAMoC,KAAKS,GAAKA,EAAEpB,KAAOwkB,GACxDvmB,KAAK2mB,kBAAoBD,EAASpmB,QAGtCN,KAAKmmB,yBAAyB/V,aAAavE,UAAU+a,IACjD5mB,KAAK6mB,cAAcD,EAAG,GAG1B5mB,KAAK8mB,oBAAmB5b,QACpB6b,MAAK/mB,KAAKgnB,eAAe,KACzBhnB,KAAKimB,mBAAmB7V,aAAa7P,QAAKuY,KAAU,KACtDvY,QACEoB,KAAI,EAAEO,EAAU+kB,KACZ/kB,EAASP,IAAIQ,KACTJ,GAAII,EAAEJ,GACNa,KAAMT,EAAES,KACRe,MAAOxB,EAAEwB,MACTwhB,aAAchjB,EAAEwB,OAASsjB,MAIzC,CAEAJ,cAAcK,GACVlnB,KAAKilB,gBAAkBjlB,KAAK2mB,kBAAkBjkB,KAAKS,GAAKA,EAAEpB,KAAOmlB,EAAW,GAChF,CAEAvB,SACI,MAAMV,EAAkBjlB,KAAKilB,gBACzBA,IACKjlB,KAAKglB,qBAcChlB,KAAKgmB,mBACZhmB,KAAKD,YAAYe,QACZqmB,wBAAwB,CACrBC,UAAWnC,EAAgBljB,GAC3BikB,kBAAmBhmB,KAAKgmB,kBACxBqB,aAAcrnB,KAAKimB,mBAAmB3e,QAEzCuE,UAAU,KACP7L,KAAKgK,oBAAoBgC,WAAQC,KAAE,6CAA8C,CAC7Eqb,QAASrC,EAAgB7hB,KAEzBmX,MAAOva,KAAKgmB,kBAAmB3kB,SAEnCrB,KAAKwP,aAAY,EAAI,GA1B7BxP,KAAKD,YAAYe,QACZymB,wBAAwB,CACrBH,UAAWnC,EAAgBljB,GAC3BylB,WAAYxnB,KAAKwnB,WACjBH,aAAcrnB,KAAKimB,mBAAmB3e,QAEzCuE,UAAU,KACP7L,KAAKgK,oBAAoBgC,WAAQC,KAAE,6CAA8C,CAC7Eqb,QAASrC,EAAgB7hB,KACzBmX,MAAOva,KAAKwnB,WAAWnmB,SAE3BrB,KAAKwP,aAAY,EAAI,GAmBzC,CAEAV,SACI9O,KAAKwP,aACT,CAEcwX,eAAe3b,GAAY,IAAAoc,EAAAznB,KAAA,SAAA0nB,MAAA,YACrC,aAAO,EACGC,MACFF,EAAK1nB,YAAYe,QAAQ8mB,mBAAmB,CACxCC,eAAgB1H,MAAgB2H,GAChC5mB,OAAQ,CACJY,UAAW,CAAEimB,GAAIN,EAAKD,YACtBzlB,GAAI,CAAEgmB,GAAIN,EAAKzB,oBAEnB3a,SACDpF,UAETzB,gBAAgBlE,KAAM,EAZa,EAazC,MA5GSylB,4CAAsC3f,MAAAC,OAAAD,MAAAC,OAAA,2BAAtC0f,GAAsC7X,UAAA,4CAAAE,MAAA,GAAAC,KAAA,GAAAC,OAAA,mhBAAAC,SAAA,SAAAC,EAAAC,MAAA,EAAAD,IDtBnDpI,MAAA,EAAA4hB,GAAA,qBAOA5hB,MAAA,UAAAA,CAAkB,wBAAlBA,CAAkB,WAEHA,MAAA,wBAAkCA,QACzCA,MAAA,sCAOJA,QACAA,MAAA,WACAA,MAAA,wBAAAA,CAAqB,WACVA,MAAA,0BAAmDA,QAC1DA,MAAA,cACJA,UAGJA,MAAA,WAAAA,CAAmC,cACEA,MAAA,0BAAiDA,QAClFA,MAAA,aAAAA,CAAqB,WAArBA,CAAqB,QAArBA,CAAqB,SAGLA,MAAA,0BAA+BA,QACnCA,MAAA,SACIA,MAAA,+EAIJA,QACAA,MAAA,SACIA,MAAA,GAAA6hB,GAAA,qBAGA7hB,MAAA,GAAA8hB,GAAA,yBAAA9hB,OAGJA,YAGRA,MAAA,YACIA,MAAA,GAAA+hB,GAAA,gCAUJ/hB,YAIRA,MAAA,GAAAgiB,GAAA,8CArDehiB,MAAA,GAAAA,YAAA,wBAGHA,MAAA,GAAAA,MAAA,cAAAA,CAAkB,2BAAlBA,CAAkB,oBAAAqI,EAAA4Z,kBAAlBjiB,CAAkB,cAAAqI,EAAA0X,0BAQf/f,MAAA,GAAAA,YAAA,0CAC2CA,MAAA,GAAAA,MAAA,cAAAqI,EAAAwX,oBAKrB7f,MAAA,GAAAA,YAAA,wCAIjBA,MAAA,GAAAA,YAAA,sBAEAA,MAAA,GAAAA,MAAA,IAAAA,MAAA,iCAAAA,MAAA,GAAA2Y,GAAA3Y,MAAA,MAAAA,MAAA,YAAAqI,EAAA8W,eAAA,KAAA9W,EAAA8W,eAAAniB,SAAA,KAMagD,MAAA,GAAAA,MAAA,OAAAqI,EAAAwW,gBAAA7e,CAAwB,WAAA0X,GAUzB1X,MAAA,GAAAA,MAAA,UAAAA,MAAA,MAAAqI,EAAAqY,0XE9CzB,MAAMwB,GAAwCtK;;;;;;;;;;;;;;;;;;;EAqBxCuK,GAAwCvK;;;;;;;;;;;;;;;;;;;;EAsBxCwK,GAAuBxK;;;;;;;;;;;;EAcvByK,GAAuBzK;;;;;;;;;;;;2CC1DhC5X,MAAA,8BAAAA,MAAA,IAAAA,MAAA,iEAmBYA,MAAA,YAAkCA,MAAA,GAAcA,wCAAdA,MAAA,GAAAA,MAAAsiB,EAAA9kB,+CAGlCwC,MAAA,6BAGIA,MAAA,0BAAAuiB,EAAAviB,MAAAwiB,GAAAzgB,UAAAugB,EAAAtiB,QAAA+B,UAAAuJ,EAAAtL,MAAA,UAAUA,MAAAsL,EAAAmX,iBAAAH,EAAAC,EAAA5mB,IAAqC,GAClDqE,oCAFGA,MAAA,aAAAuiB,8BARZviB,MAAA,OAAAA,CAA+B,UAA/BA,CAA+B,SAElBA,MAAA,GAAeA,QACpBA,MAAA,EAAA0iB,GAAA,cACJ1iB,QACAA,MAAA,WACIA,MAAA,EAAA2iB,GAAA,+BAKJ3iB,oCATSA,MAAA,GAAAA,MAAAsiB,EAAA9lB,MACCwD,MAAA,GAAAA,MAAA,OAAAsiB,EAAA9kB,KAIqBwC,MAAA,GAAAA,MAAA,UAAAsiB,EAAAM,wCAT3C5iB,MAAA,YAAAA,CAAmE,WAE3DA,MAAA,EAAA6iB,GAAA,YAaJ7iB,gCAbyBA,MAAA,GAAAA,MAAA,UAAAkD,EAAAhJ,+BAiBzB8F,MAAA,YACAA,MAAA,iBACAA,kDAIAA,MAAA,eAAkCA,MAAA,mBAAAA,MAAA0f,GAAA,MAAAL,EAAArf,QAAA,OAASA,MAAAqf,EAAA3W,SAAQ,GAAE1I,MAAA,wBAAiCA,QACtFA,MAAA,eAEIA,MAAA,mBAAAA,MAAA0f,GAAA,MAAAxQ,EAAAlP,QAAA,OAASA,MAAAkP,EAAA4T,iBAAgB,GAIzB9iB,MAAA,wBACJA,gCARqDA,MAAA,GAAAA,YAAA,sBAIjDA,MAAA,GAAAA,MAAA,eAAA2I,EAAAwO,eAAAlc,SAAA,IAAA0N,EAAAoa,oBAGA/iB,MAAA,GAAAA,MAAA,IAAAA,MAAA,2BCDF,MAAOgjB,GAaTtpB,YAAoBC,EAAkCspB,GAAlCrpB,KAAAD,cAAkCC,KAAAqpB,oBARtDrpB,KAAAspB,KAA8B,UAE9BtpB,KAAAupB,MAAwC,UAExCvpB,KAAAud,eAA4C,GAC5Cvd,KAAAM,MAA4B,GAC5BN,KAAAmpB,oBAAqB,CAEwE,CAE7F5e,WACI,MAAMif,EACY,YAAdxpB,KAAKspB,KACCtpB,KAAKD,YACA0pB,MAGCnB,GAAuC,CACrC1B,IAAK5mB,KAAK4mB,KAAO,KAEpBzmB,UAAU,EAAGupB,cACVA,EAASppB,MAAMqB,IAAIwX,QAAWA,EAAG6P,YAAa,IAAI7P,EAAE6P,iBAE5DhpB,KAAKD,YACA0pB,MAGClB,GAAuC,CACrC3B,IAAK5mB,KAAK4mB,KAAO,KAEpBzmB,UAAU,EAAGqE,qBACVA,EAAgBlE,MAAMqB,IAAIwX,QAAWA,EAAG6P,YAAa,IAAI7P,EAAE6P,iBAE7EhpB,KAAK2pB,aAAeH,EAAW3d,UAAU,CACrCoO,KAAM3Z,IACFN,KAAKM,MAAQA,EACbN,KAAKupB,MAAQ,QACbvpB,KAAKqpB,kBAAkBtd,cAAY,GAG/C,CAEAyS,cACIxe,KAAK2pB,cAAcC,aACvB,CAEA9a,SACI9O,KAAKwP,aACT,CAEAqZ,iBAAiB3S,EAAwB2T,GACrC3T,EAAK8S,YAAc9S,EAAK8S,YAAY9nB,OAAO4oB,GAAMA,EAAG/nB,KAAO8nB,GAC3D7pB,KAAKmpB,oBAAqB,CAC9B,CAEAD,iBACI,MAAMa,EAAwB/pB,KAAKud,eAAe5b,IAAIqoB,GAAMA,EAAGjoB,IAC/D,OAAA/B,KAAKupB,MAAQ,UAEK,YAAdvpB,KAAKspB,KACCtpB,KAAKD,YAAYkqB,OACbzB,GACA,CACI9nB,MAAOV,KAAKM,OAAOqB,IAAIb,KACnBiB,GAAIjB,EAAQiB,GACZmoB,iBAAezV,KAAO,IACf3T,EAAQkoB,YAAYrnB,IAAImoB,GAAMA,EAAG/nB,OACjCgoB,SAKnB/pB,KAAKD,YAAYkqB,OACbxB,GACA,CACI/nB,MAAOV,KAAKM,OAAOqB,IAAIb,KACnBiB,GAAIjB,EAAQiB,GACZmoB,iBAAezV,KAAO,IACf3T,EAAQkoB,YAAYrnB,IAAImoB,GAAMA,EAAG/nB,OACjCgoB,UAKhBle,UAAUhG,IACnB7F,KAAKwP,YAAYxP,KAAKud,eAAc,EAE5C,MA5FS6L,4CAAiChjB,MAAAC,OAAAD,aAAA,2BAAjCgjB,GAAiClb,UAAA,uCAAAE,MAAA,GAAAC,KAAA,EAAAC,OAAA,8cAAAC,SAAA,SAAAC,EAAAC,MAAA,EAAAD,ID9C9CpI,MAAA,EAAA+jB,GAAA,qBAIA/jB,MAAA,UAAAA,CAAkB,UAAlBA,CAAkB,WAGNA,MAAA,wBACJA,QACAA,MAAA,gCACIA,MAAA,gCAAA6B,GAAA,OAAAwG,EAAA8O,eAAAtV,CAAA,GACH7B,YAITA,MAAA,EAAAgkB,GAAA,eAkBAhkB,MAAA,EAAAikB,GAAA,yBAAAjkB,OAMAA,MAAA,GAAAkkB,GAAA,4CAhCYlkB,MAAA,GAAAA,MAAA,IAAAA,MAAA,oCAQUA,MAAA,GAAAA,MAAA,mBAAAqI,EAAA8a,MAAAnjB,CAA2B,WAAA0X,8SEZzC1X,MAAA,4BAoBQA,MAAA,uBAAAA,MAAA,IAAAmkB,EAAAxoB,GAAA,gCAKAqE,MAAA,8CAAAA,MAAA,IAAAA,MAAA,IAAAokB,EAAAhjB,UAAA,yCAKApB,MAAA,8CAAAA,MAAA,IAAAA,MAAA,IAAAqkB,EAAA/iB,UAAA,6FAKAtB,MAAA,SAAAA,CACK,UAAMA,MAAA,GAAkBA,QACxBA,MAAA,iBACHA,6BAHsBA,MAAA,aAAAA,MAAA,EAAA2Y,GAAA2L,EAAA5oB,YACbsE,MAAA,GAAAA,MAAAskB,EAAA9nB,gCAOXwD,MAAA,uBAAAA,MAAA,IAAAukB,EAAA/mB,IAAA,gDCPV,MAAOgnB,GAqBT9qB,YAAoB4J,EAA+BC,EAAwB5J,GAAvDC,KAAA0J,QAA+B1J,KAAA2J,SAAwB3J,KAAAD,cAhBlEC,KAAA6qB,uBAAwB,EAOjC7qB,KAAA8qB,kBAAoB,IAAI5E,KAAmB,IAC3ClmB,KAAA+qB,WAAY,EACJ/qB,KAAAgrB,oBAAsB,IAAI7L,IAAwB,IAClDnf,KAAAirB,gBAAkB,IAAI9L,IAAwB,IAC9Cnf,KAAAkrB,eAAiB,IAAI/L,IAA8C,IACnEnf,KAAAmrB,uBAAyB,IAAIhM,KAAyB,GACtDnf,KAAAoY,SAAW,IAAI+G,KAAyB,GACxCnf,KAAA2gB,SAAW,IAAItI,IAE+E,CAEtG9N,WACIvK,KAAKorB,qBAAuBprB,KAAK0J,MAAM2hB,cAAc9qB,QACjDoB,KAAI2pB,GAAOA,EAAInkB,IAAI,kBAAe,EAClCxF,KAAI6X,GAAUA,GAAYA,EAAL,IAAU,EAC/BV,KAAU,IAAC,EACXyS,QAGJvrB,KAAKwrB,sBAAwBxrB,KAAK0J,MAAM2hB,cAAc9qB,QAClDoB,KAAI2pB,GAAOA,EAAInkB,IAAI,qBAAkB,EACrCxF,KAAI8pB,GAAaA,GAAgBA,EAAN,KAAc,EACzC3S,KAAU,KAAE,EACZyS,QAGJ,MAAMG,EAAc1rB,KAAK8qB,kBAAkB1a,aAAa7P,QACpDkgB,MAAa,MAAG,EAChB9V,KAAI,IAAM3K,KAAK2rB,sBAAsB,KAAE,EACvC7S,KAAU,KAGRoS,EAAiBlrB,KAAKkrB,eAAeU,eAAerrB,QACtDW,MAAO,IAAMlB,KAAK6qB,wBAAqB,EACvClgB,KAAI,IAAM3K,KAAK2rB,sBAAsB,KAAE,EACvC7S,KAAU,KAGRqS,EAAyBnrB,KAAKmrB,uBAAuBS,eAAerrB,QACtEW,MAAO,IAA6B,MAAvBlB,KAAK6rB,iBAAsB,EACxCN,QAAoB,EACpB5gB,KAAI,IAAM3K,KAAK2rB,sBAAsB,KAAE,EACvC7S,MAAU,IAcRgT,KAXe5gB,KACjBlL,KAAKgrB,oBACLhrB,KAAKirB,gBACLjrB,KAAKorB,qBACLprB,KAAKwrB,sBACLE,EACAR,EACAC,EACAnrB,KAAKoY,UAGwB7X,QAC7BmgB,MAAU1gB,KAAK2gB,WAAQ,EACvBhW,KAAI,IAAO3K,KAAK+qB,WAAY,IAAK,EACjCtK,MAAa,KAAE,EACf7a,KAAU,EAAE7D,EAAIgqB,EAAUzjB,EAAaS,EAAcijB,EAAYC,EAASJ,MACtE,MAAMxgB,EAAOtC,EACP6W,GAAQtX,EAAc,GAAKS,EACjC,GAAIkjB,EAAQ5qB,QAAUrB,KAAK6qB,sBAAuB,CAC9C,MAAMqB,EAAeF,EACd,CAAEppB,KAAM,CAAEkd,SAAUkM,SACrB5M,EACN,OAAOpf,KAAKD,YAAYosB,WACnBC,0BACG,CACIL,WACAE,UACAJ,kBAEJ,CACIxgB,OACAuU,OACA1e,OAAQgrB,IAGf/rB,UAAUC,GAAQA,EAAKgsB,2BACvB7rB,QAAK8rB,MAAW,OAAMpqB,MAAG,CAAE3B,MAAO,GAAIkgB,WAAY,MACpD,OAAIze,EACA/B,KAAKD,YAAYosB,WACnBG,sBAAsBvqB,EAAIsJ,EAAMuU,EAAMoM,GACtC7rB,UAAUC,GAAQA,EAAK+rB,YAAY3nB,kBAAe,EAEhDvC,MAAG,KAAI,IAErB,EACD0I,KAAI,IAAO3K,KAAK+qB,WAAY,IAAM,EAClC7J,MAAS,IAAOlhB,KAAK+qB,WAAY,IAGrC/qB,KAAKusB,UAAYT,EAAYvrB,QAAKoB,KAAIkE,GAAWA,EAASA,EAAOvF,MAAQ,KACzEN,KAAKwsB,oBAAsBV,EAAYvrB,QAAKoB,KAAIkE,GAAWA,EAASA,EAAO2a,WAAa,GAC5F,CAEAiM,YAAYC,GACJ,iBAAkBA,GAClB1sB,KAAKgrB,oBAAoB/Q,KAAKyS,EAAQC,aAAaC,cAEnD,aAAcF,GACd1sB,KAAKirB,gBAAgBhR,KAAKyS,EAAQX,SAASa,cAE3C,mBAAoBF,GACpB1sB,KAAKmrB,uBAAuBlR,KAAKyS,EAAQb,eAAee,cAExD,mBAAoBF,GAChB1sB,KAAK6sB,gBACL7sB,KAAKkrB,eAAejR,KAAKja,KAAK6sB,eAG1C,CAEArO,cACIxe,KAAK2gB,SAAS1G,OACdja,KAAK2gB,SAASmM,UAClB,CAEAnB,sBAAsBnS,GAClBxZ,KAAK+sB,SAAS,eAAgBvT,EAClC,CAEAwT,wBAAwBvB,GACpBzrB,KAAK+sB,SAAS,kBAAmBtB,EACrC,CAEA7K,UACI5gB,KAAKoY,SAAS6B,MAAK,EACvB,CAEQ8S,SAAS5Y,EAAa7M,GAC1BtH,KAAK2J,OAAOsjB,SAAS,CAAC,MAAO,CACzBC,WAAYltB,KAAK0J,MACjByjB,YAAa,CACTC,CAACjZ,GAAM7M,GAEX+lB,oBAAqB,QACrBC,YAAY,GAEpB,MAzJS1C,4CAA2BxkB,MAAAC,MAAAD,MAAAC,MAAAD,MAAA2H,OAAA,2BAA3B6c,GAA2B1c,UAAA,8BAAAqf,eAAA,SAAA/e,EAAAC,EAAA+e,MAAA,EAAAhf,WAMtBif,MAAW,k1BD7C7BrnB,MAAA,WACIA,MAAA,WACAA,MAAA,WACIA,MAAA,EAAAsnB,GAAA,uCAGJtnB,QACAA,MAAA,wBAOIA,MAAA,sBAAA6B,GAAA,OAAcwG,EAAAkd,sBAAA1jB,EAA6B,EAA3C7B,CAA4C,8BAAA6B,GAAA,OACtBwG,EAAAue,wBAAA/kB,EAA+B,uEAErD7B,MAAA,6CAIAA,MAAA,6CACIA,MAAA,GAAAunB,GAAA,mBAGJvnB,QACAA,MAAA,6CACIA,MAAA,GAAAwnB,GAAA,mBAGJxnB,QACAA,MAAA,6CACIA,MAAA,GAAAynB,GAAA,mBAGJznB,QACAA,MAAA,6CACIA,MAAA,GAAA0nB,GAAA,mBAMJ1nB,QACAA,MAAA,8CACIA,MAAA,GAAA2nB,GAAA,mBAGJ3nB,mBA/CuBA,MAAA,GAAAA,MAAA,UAAAqI,EAAAsc,WAGlB3kB,MAAA,GAAAA,MAAA,mBAAAqI,EAAAuf,eAAA5nB,CAAkC,0BAAAA,MAAA,GAAAsb,GAAAtb,MAAA,KAAAqI,EAAA+d,uBAKvCpmB,MAAA,GAAAA,MAAA,UAAAqI,EAAAsc,WACA3kB,MAAA,QAAAA,MAAA,KAAAqI,EAAA8d,WAAAnmB,CAA2B,eAAAA,MAAA,KAAAqI,EAAA+c,uBAA3BplB,CAA2B,aAAAA,MAAA,KAAAqI,EAAA+d,qBAA3BpmB,CAA2B,cAAAA,MAAA,KAAAqI,EAAA2c,uBAQvBhlB,MAAA,GAAAA,MAAA,oBAAAqI,EAAAqc,kBAAA1kB,CAAuC,wBAAAA,MAAA,iCAG3BA,MAAA,GAAAA,MAAA,UAAAA,MAAA,mBAAAA,CAAmC,sBAKnCA,MAAA,GAAAA,MAAA,UAAAA,MAAA,2BAAAA,CAA2C,sBAK3CA,MAAA,GAAAA,MAAA,UAAAA,MAAA,2BAAAA,CAA2C,sBAK3CA,MAAA,GAAAA,MAAA,UAAAA,MAAA,qBAAAA,CAAqC,eAQrCA,MAAA,GAAAA,MAAA,UAAAA,MAAA,qBAAAA,CAAqC,0rBE5C7DA,MAAA,2DAEIA,MAAA,UAAAQ,EAAAqlB,QAAA7lB,CAAmB,cAAAQ,EAAA7E,8CAUPqE,MAAA,UAAAA,CAAmD,YAE3CA,MAAA,YACAA,MAAA,cAIIA,MAAA,oBAAAA,MAAA2O,GAAA,MAAArD,EAAAtL,QAAA,OAAUA,MAAAsL,EAAAuc,mBAAkB,GAJhC7nB,oCAGIA,MAAA,GAAAA,MAAA,gBAAAkD,EAAAuO,iBAAA,KAAAvO,EAAAuO,iBAAAqW,qDAsBI9nB,MAAA,uCACAA,MAAA,uCACAA,MAAA,2CAEJA,MAAA,YAA+CA,MAAA,GAAoBA,mCAApBA,MAAA,GAAAA,MAAA+nB,EAAAC,qDANnDhoB,MAAA,WAAAA,CAAqD,eACzCA,MAAA,yBAAA+nB,EAAA/nB,MAAAioB,GAAAC,KAAA,OAASloB,MAAA+nB,EAAAI,kBAAsB,GACnCnoB,MAAA,EAAAooB,GAAA,mBACApoB,MAAA,EAAAqoB,GAAA,mBACAroB,MAAA,EAAAsoB,GAAA,mBACJtoB,QACAA,MAAA,EAAAuoB,GAAA,cACJvoB,+BAN6CA,MAAA,GAAAA,MAAA,SAAA+nB,EAAAC,WAC1BhoB,MAAA,GAAAA,MAAA,QAAA+nB,EAAAC,WACAhoB,MAAA,GAAAA,MAAA,eAAA+nB,EAAAC,WACAhoB,MAAA,GAAAA,MAAA,gBAAA+nB,EAAAC,WAEUhoB,MAAA,GAAAA,MAAA,OAAA+nB,EAAAC,sCArBrChoB,MAAA,OAAAA,CAGC,WAHDA,CAGC,8BAHDA,CAGC,UAUiBA,MAAA,GAAoBA,UAE9BA,MAAA,EAAAwoB,GAAA,cAQJxoB,8CArBAA,MAAA,SAAAyoB,EAAAC,QAE0B1oB,MAAA,GAAAA,MAAA,UAAAyoB,EAAAE,OAElB3oB,MAAA,GAAAA,MAAA,aAAAM,EAAA3E,GAAAqE,CAAiB,WAAAyoB,EAAA9sB,GAAjBqE,CAAiB,WAAjBA,CAAiB,cAOXA,MAAA,GAAAA,MAAAyoB,EAAAG,SAEJ5oB,MAAA,GAAAA,MAAA,OAAAyoB,EAAA9O,6BAoCN3Z,MAAA,yBACAA,MAAA,4BAGQA,MAAA,mEAEIA,MAAA,kBAAA6oB,EAAA7oB,CAAgC,UAAA8oB,EAAAjD,mCAIpC7lB,MAAA,qDAEIA,MAAA,UAAAmQ,EAAA0V,oCAVZ7lB,MAAA,GACIA,MAAA,YACIA,MAAA,EAAA+oB,GAAA,iCAMA/oB,MAAA,EAAAgpB,GAAA,iCAKAhpB,MAAA,qCAIJA,QACJA,+BAfqCA,MAAA,GAAAA,MAAA,UAAAipB,EAAApD,QAAAqD,eAMxBlpB,MAAA,GAAAA,MAAA,OAAAipB,EAAApD,QAAA5qB,QAKD+E,MAAA,GAAAA,MAAA,UAAAipB,EAAApD,QAAA7lB,CAAmB,cAAAipB,EAAAttB,8CA/B3CqE,MAAA,OAAAA,CAAuE,UAAvEA,CAAuE,eAS3DA,MAAA,mBAAAA,MAAAmpB,GAAA,MAAArM,EAAA9c,QAAA,OAASA,MAAA8c,EAAAsM,wBAAuB,wBAGhCppB,MAAA,iBACJA,QACAA,MAAA,YACIA,MAAA,EAAAqpB,GAAA,uBACArpB,MAAA,EAAAspB,GAAA,uBACAtpB,MAAA,EAAAupB,GAAA,sBAmBJvpB,oCAhCAA,MAAA,GAAAA,MAAA,SAAAwJ,EAAAggB,qBAFAxpB,MAAA,UAAAwJ,EAAAigB,qBAAAxuB,QAAAuO,EAAAiI,iBAAA,MAMIzR,MAAA,GAAAA,MAAA,SAAAwJ,EAAAggB,qBAEAxpB,MAAA,QAAAA,MAAA,uCAI4BA,MAAA,GAAAA,MAAA,UAAAwJ,EAAAggB,qBACbxpB,MAAA,GAAAA,MAAA,yBAAAwJ,EAAAkgB,gBAAA,KAAAlgB,EAAAkgB,gBAAAvhB,UACAnI,MAAA,GAAAA,MAAA,mBAAAwJ,EAAAmgB,sBACA3pB,MAAA,GAAAA,MAAA,OAAAwJ,EAAAqc,uFA6B3B7lB,MAAA,GAcIA,MAAA,MAIJA,sEAHQA,MAAA,GAAAA,MAAA,mBAAA4pB,EAAA5pB,CAAqC,0BAAAA,MAAA,EAAAsb,GAAAuO,EAAAC,+BAKzC9pB,MAAA,OAAAA,CAA2B,QAEnBA,MAAA,8BACJA,gCAFIA,MAAA,GAAAA,MAAA,UAAA+C,EAAA0mB,qBAAAxuB,QAAA8H,EAAA0O,iBAAA,MACuBzR,MAAA,GAAAA,MAAA,kBAAA+C,EAAAgnB,2DAQ3C/pB,MAAA,oCAGIA,MAAA,8BAAA6B,GAAA7B,MAAAgqB,GAAA,MAAAC,EAAAjqB,QAAA,OAAsBA,MAAAiqB,EAAAC,mBAAArc,KAAAhM,GAA+B,GACxD7B,gCAFGA,MAAA,eAAA2J,EAAAhH,oHAGJ3C,MAAA,YACIA,MAAA,wBACJA,8BADIA,MAAA,GAAAA,MAAA,IAAAA,MAAA,yBAAAA,MAAA,EAAAmqB,GAAAlf,EAAAmf,aAAAnf,EAAAof,WAAApf,EAAAmP,aAAA,+CAGJpa,MAAA,gCAMIA,MAAA,sBAAA6B,GAAA7B,MAAAsqB,GAAA,MAAAC,EAAAvqB,QAAA,OAAcA,MAAAuqB,EAAAC,WAAA3c,KAAAhM,GAAuB,GACxC7B,gCALGA,MAAA,KAAAY,EAAAjF,GAAAqE,CAAS,cAAAY,EAAAsB,YAATlC,CAAS,eAAAY,EAAA+B,aAAT3C,CAAS,aAAAY,EAAAwZ,sDAUTpa,MAAA,UAAAA,CAIC,WAJDA,CAIC,iCAGWA,MAAA,iBACJA,QACAA,MAAA,cAIIA,MAAA,iBAAA6B,GAAA7B,MAAAyqB,GAAA,MAAAC,EAAA1qB,QAAA8P,KAAA6a,EAAA3qB,QAAA,OAASA,MAAA2qB,EAAAC,WAAAF,EAAA7oB,GAAwB,GAJrC7B,mDAPJA,MAAA,SAAA6qB,EAAAC,cAAAD,EAAAE,cAAAL,EAAA/uB,KAI2CqE,MAAA,GAAAA,MAAA,QAAAA,MAAA,mCAMnCA,MAAA,GAAAA,MAAA,gBAAA6qB,EAAApZ,iBAAA,KAAAoZ,EAAApZ,iBAAAuZ,WAAAN,2BAaA1qB,MAAA,qEAHJA,MAAA,GAGIA,MAAA,EAAAirB,GAAA,uBAOJjrB,6CANSA,MAAA,GAAAA,MAAA,oBAAAkrB,EAAAha,OAAAiF,UAAAnW,CAGzB,0BAAAA,MAAA,EAAAmrB,GAAAT,GAHyB1qB,CAGzB,4BAAAkrB,EAAAE,iCAKoBprB,MAAA,2EAAAA,MAAA,EAAAqrB,GAAA,mFACKrrB,MAAA,mBAAAsrB,EAAAnjB,SAAAnI,CAAmC,0BAAAA,MAAA,EAAAurB,GAAAb,EAAAc,+BAlBpDxrB,MAAA,OAAAA,CAGC,YAEOA,MAAA,EAAAyrB,GAAA,uBAWAzrB,MAAA,EAAA0rB,GAAA,0BAAA1rB,OAKJA,wEAnBAA,MAAA,SAAA2rB,EAAAb,cAAAa,EAAAZ,cAAAL,EAAA/uB,KAE0BqE,MAAA,GAAAA,MAAA,UAAAsrB,EAAA3C,OAEjB3oB,MAAA,GAAAA,MAAA,OAAA2rB,EAAAC,iBAAA7qB,IAAAuqB,EAAA3vB,IAAAqE,CAAsC,WAAA6rB,0BAoBnD7rB,MAAA,6BADJA,MAAA,GACIA,MAAA,EAAA8rB,GAAA,uBAGJ9rB,4EAFSA,MAAA,GAAAA,MAAA,mBAAA4pB,EAAA5pB,CAAoC,0BAAAA,MAAA,EAAAurB,GAAAQ,EAAAP,EAAA,oFA7C7CxrB,MAAA,cACIA,MAAA,EAAAgsB,GAAA,aAiBAhsB,MAAA,EAAAisB,GAAA,aAuBAjsB,MAAA,QACJA,QACAA,MAAA,EAAAksB,GAAA,gEA3C2BlsB,MAAA,cAAAA,MAAA,EAAAmsB,GAAAX,EAAAd,IAElB1qB,MAAA,GAAAA,MAAA,OAAAgf,EAAAvN,kBAiBkBzR,MAAA,GAAAA,MAAA,UAAAgf,EAAAyK,sBAsBnBzpB,MAAA,GAAAA,MAAA,SAAAgf,EAAA8L,cAAA9L,EAAA+L,cAAAL,EAAA/uB,KAEgCqE,MAAA,GAAAA,MAAA,UAAAgf,EAAAoN,kBAAA1B,wHC/JtC,MAAO2B,WACDC,MAYR5yB,YACcupB,EACAsJ,EACA5yB,EACF6yB,GAER3oB,MAAMof,EAAmBsJ,EAAqB5yB,GALpCC,KAAAqpB,oBACArpB,KAAA2yB,sBACA3yB,KAAAD,cACFC,KAAA4yB,WAZF5yB,KAAA6yB,YAAc,IAAIlgB,MAM5B3S,KAAA8yB,SAAsB,GACtB9yB,KAAAmxB,cAA0C,GAsC1CnxB,KAAA+yB,cAAgB,CAACxwB,EAAe2T,IACRlW,KAAKgzB,SAASC,iBAAiB1wB,IAC/BnC,KAAK+rB,WAAWJ,WAAa7V,EAAK9V,KAAK+rB,WAAWJ,QAhC1E,CAEAU,YAAYC,GAER,GADAziB,MAAMwiB,YAAYC,GACdA,EAAQwG,gBAAkBxG,EAAQpsB,MAAO,CACzC,MAAM6yB,EAAwC,GAC9C,UAAWhH,KAAcnsB,KAAKM,OAAS,GAAI,CACvC6yB,EAAe1uB,KAAK0nB,GACpB,MAAMiH,EAAuBpzB,KAAKwyB,kBAAkBrG,GACpDgH,EAAe1uB,QAAQ2uB,EAAqBpwB,QAEhDmwB,EAAeE,QAAQ,CAAClH,EAAY5pB,IAAWvC,KAAKmxB,cAAchF,EAAWpqB,IAAMQ,GAE3F,CAEAkb,kBACIzd,KAAKszB,kBAAkB5G,QAAQ7gB,UAAW+O,IACtC5a,KAAKgzB,SAASC,iBAAiBI,QAAQnd,GAAQlW,KAAKgzB,SAASO,WAAWrd,IACxE,UAAWsd,KAAO5Y,EAAI6Y,UAClBD,EAAIE,cAAgB1zB,KAAKgzB,SACzBQ,EAAIG,SAASC,mBAAmB5zB,KAAKgzB,SAASa,cAC9C7zB,KAAKgzB,SAASc,QAAQN,EAAG,EAGrC,CAEAhB,kBAAkBtc,GACd,OAAOlW,KAAKkzB,gBAAgBhyB,OAAOiC,GAAKA,EAAE4oB,WAAa7V,EAAKnU,KAAO,EACvE,CAOAgyB,OACIngB,GAKA,MAAMogB,EAA+D,IAAlDpgB,EAAMsC,KAAK9V,KAAK+rB,WAAW8H,YAAY5yB,OACpD6yB,EAAkBF,GAAch0B,KAAKsI,YAAc,GAAKtI,KAAK+I,aAAe,EAC5EgjB,EAAWnY,EAAMsC,KAAK9V,KAAK+rB,WAAWJ,SACtCoI,EAAcn0B,KAAKM,MAAM8zB,UAAUnvB,GAAKA,EAAElD,KAAOgqB,GACjDsI,EAAgBH,EAAkBtgB,EAAM0gB,aAAeH,EAAc,EAO3E,GANAn0B,KAAK6yB,YAAY5e,KAAK,CAClB0Y,aAAc/Y,EAAMsC,KAAK9V,KAAK+rB,WAAWpqB,GACzCQ,MAAO8xB,EACPtI,SAAUnY,EAAMsC,KAAK9V,KAAK+rB,WAAWJ,WAGrCiI,EACAh0B,KAAKM,MAAQ,IAAIN,KAAKM,OACtBN,KAAKM,MAAMi0B,OAAO3gB,EAAM4gB,cAAe,GACvCx0B,KAAKM,MAAMi0B,OAAO3gB,EAAM0gB,aAAc,EAAG1gB,EAAMsC,KAAK9V,KAAK+rB,gBACtD,CACH,MAAMtT,EAAS7Y,KAAKM,MAAMoC,KAAKuC,GAAKA,EAAElD,KAAOgqB,GAC7C,GAAIlT,EAAQ,CACR,MAAMqa,EAAiBlzB,KAAKwyB,kBAAkB3Z,GACxC4b,EAAwBP,EAAkBtgB,EAAM4gB,cAAgBL,EAAc,EACpFjB,EAAeqB,OAAOE,EAAuB,GAC7CvB,EAAeqB,OAAO3gB,EAAM0gB,aAAc,EAAG1gB,EAAMsC,KAAK9V,KAAK+rB,aAGrEnsB,KAAKqpB,kBAAkBtd,cAC3B,MAtFS0mB,4CAA4BrsB,mBAAAC,OAAAD,MAAAC,OAAAD,MAAA2H,MAAA,2BAA5B0kB,GAA4BvkB,UAAA,gCAAA2G,UAAA,SAAArG,EAAAC,MAAA,EAAAD,SAM1BkmB,KAAW,aAIiBC,65EDjD3CvuB,MAAA,EAAAwuB,GAAA,uCAKAxuB,MAAA,UAAAA,CAA2B,WAEnBA,MAAA,GACJA,QACAA,MAAA,YAAAA,CAAkD,UAAlDA,CAAkD,UAGtCA,MAAA,EAAAyuB,GAAA,YAWAzuB,MAAA,EAAA0uB,GAAA,YAyBA1uB,MAAA,OAAAA,CAAI,WAAJA,CAAI,oCAKQA,MAAA,mBAAA6B,GAAA,OAAWwG,EAAAsmB,gBAAA9sB,EAAuB,EAAlC7B,CAAmC,iCACnBqI,EAAAumB,gBAAgB,qBACnC5uB,cAIbA,MAAA,GAAA6uB,GAAA,aAuCJ7uB,QACAA,MAAA,eAGIA,MAAA,8BAAA6B,GAAA,OAAsBwG,EAAAslB,OAAA9rB,EAAc,GAGpC7B,MAAA,GAAA8uB,GAAA,4CAmBA9uB,MAAA,IACIA,MAAA,GAAA+uB,GAAA,YAKJ/uB,QACJA,YAGRA,MAAA,aACIA,MAAA,GAAAgvB,GAAA,sCAKAhvB,MAAA,GAAAivB,GAAA,cAIAjvB,MAAA,GAAAkvB,GAAA,kCAQJlvB,QAEAA,MAAA,GAAAmvB,GAAA,0BAAAnvB,cAzJKA,MAAA,OAAAqI,EAAAwd,SAQe7lB,MAAA,GAAAA,MAAA,YAAAqI,EAAA+mB,eACLpvB,MAAA,GAAAA,MAAA,uBAAAqI,EAAAoJ,iBAAA,KAAApJ,EAAAoJ,iBAAA4d,UAAAp0B,QAEM+E,MAAA,GAAAA,MAAA,OAAAqI,EAAAoJ,kBAYkBzR,MAAA,GAAAA,MAAA,UAAAqI,EAAAohB,sBA2BXzpB,MAAA,GAAAA,MAAA,aAAAA,MAAA,MAAAqI,EAAAinB,aAAAtvB,CAAkC,UAAAqI,EAAAknB,eAQ7CvvB,MAAA,GAAAA,MAAA,OAAAqI,EAAAqhB,iBAAArhB,EAAAshB,uBAAA,MAAAthB,EAAAwd,QAAA,KAAAxd,EAAAwd,QAAA5qB,SA4CL+E,MAAA,GAAAA,MAAA,2BAAAqI,EAAAskB,eAKL3sB,MAAA,GAAAA,MAAA,UAAAA,MAAA,MAAAqI,EAAAnO,MAAA8F,MAAA,GAAAwvB,GAAAnnB,EAAA1F,aAAA0F,EAAAnG,YAAAmG,EAAA+R,WAAA/R,EAAA1M,KAAAqE,CAOkB,eAAAqI,EAAAonB,WAUJzvB,MAAA,GAAAA,MAAA,eAAAqI,EAAAnO,OAAAmO,EAAAnO,MAAAe,SAWZ+E,MAAA,GAAAA,MAAA,OAAAqI,EAAA+R,YAICpa,MAAA,GAAAA,MAAA,OAAAqI,EAAA+R,YAKDpa,MAAA,GAAAA,MAAA,OAAAqI,EAAA+R,06LErIGpa,MAAA,eAGIA,MAAA,mBAAAA,MAAA0vB,GAAA,MAAAxgB,EAAAlP,QAAA,OAASA,MAAAkP,EAAAygB,SAAQ,GAGjB3vB,MAAA,wBACJA,gCAHIA,MAAA,WAAAQ,EAAAC,WAAAE,SAAAH,EAAAC,WAAAC,UAEAV,MAAA,GAAAA,MAAA,IAAAA,MAAA,oEAGAA,MAAA,eAGIA,MAAA,mBAAAA,MAAAic,GAAA,MAAAC,EAAAlc,MAAA,UAASA,MAAAkc,EAAA3b,OAAM,GAGfP,MAAA,wBACJA,iCAHIA,MAAA,YAAA4vB,EAAAnvB,WAAAE,SAAAivB,EAAAnvB,WAAAC,YAAAkvB,EAAAC,iBAEA7vB,MAAA,GAAAA,MAAA,IAAAA,MAAA,oDANJA,MAAA,EAAA8vB,GAAA,sCACK9vB,MAAA,mBAAAM,EAAAU,0CAyBOhB,MAAA,GAA6DA,MAAA,wBAE3DA,eAF2DA,MAAA,GAAAA,YAAA,+CAGvCA,MAAA,8BAAAA,YAAA,kDAKtCA,MAAA,cACIA,MAAA,6BACJA,6BAD0BA,MAAA,GAAAA,MAAA,SAAA+vB,+EAQd/vB,MAAA,UAA2DA,MAAA,wBAEzDA,eAFCA,MAAA,aAAAA,MAAA,EAAAsb,KAAwDtb,MAAA,GAAAA,YAAA,kHAG3DA,MAAA,UAGKA,MAAA,wBAAiCA,wCAFlCA,MAAA,aAAAA,MAAA,EAAAmqB,GAAA6F,EAAAr0B,KAECqE,MAAA,GAAAA,YAAA,IAAAgwB,EAAAxzB,kCAELwD,MAAA,GAA6BA,MAAA,wBAAiCA,wCAAjCA,MAAA,GAAAA,YAAA,IAAAgwB,EAAAxzB,kCATjCwD,MAAA,QACIA,MAAA,EAAAiwB,GAAA,YAGAjwB,MAAA,EAAAkwB,GAAA,YAKAlwB,MAAA,EAAAmwB,GAAA,uBACJnwB,uCATgDA,MAAA,GAAAA,MAAA,OAAAowB,GAKvCpwB,MAAA,GAAAA,MAAA,QAAAowB,IAAAC,GAGUrwB,MAAA,GAAAA,MAAA,OAAAqwB,8BAZ/BrwB,MAAA,mBAAAA,CACK,WADLA,CACK,WAEOA,MAAA,EAAAswB,GAAA,aAWJtwB,iCAX+BA,MAAA,GAAAA,MAAA,UAAAuwB,EAAA1C,wCAmDnC7tB,MAAA,sCAKIA,MAAA,0DAMJA,8BARIA,MAAA,QAAAA,MAAA,6BAIIA,MAAA,GAAAA,MAAA,eAAAY,EAAAsG,aAAAlH,CAA6B,wBAAAY,EAAAH,WAAAM,IAAA,gBAA7Bf,CAA6B,YAAAA,MAAA,IAAAY,EAAAI,2CAgCrBhB,MAAA,GAAsEA,MAAA,wBAEpEA,eAFoEA,MAAA,GAAAA,YAAA,oEAG9CA,MAAA,8BAAAA,YAAA,gFAOhCA,MAAA,GACIA,MAAA,+BACIA,MAAA,0BAAA8pB,EAAA9pB,MAAAgqB,GAAA7tB,MAAA8tB,EAAAjqB,QAAA,OAAUA,MAAAiqB,EAAAuG,aAAA1G,GAAe,4BAM5B9pB,QACLA,wDANQA,MAAA,GAAAA,MAAA,WAAA8pB,EAAA9pB,CAAc,YAAAywB,EAAdzwB,CAAc,sBAAA0wB,EAAAC,oBAAAF,GAAdzwB,CAAc,kBAAA8pB,EAAd9pB,CAAc,YAAAA,MAAA,IAAA0wB,EAAA1vB,6DAgBdhB,MAAA,eAIIA,MAAA,yBAAA4wB,EAAA5wB,MAAA6wB,GAAA9uB,UAAA+uB,EAAA9wB,MAAA,UAASA,MAAA8wB,EAAAC,UAAAH,GAAiB,GAE1B5wB,MAAA,GACJA,oCADIA,MAAA,GAAAA,MAAA,IAAA4wB,EAAAI,YAAA,gCAdhBhxB,MAAA,QAAAA,CAA0C,iBAA1CA,CAA0C,eAG9BA,MAAA,iBACAA,MAAA,UAAMA,MAAA,wBAA2CA,QACjDA,MAAA,iBACJA,QACAA,MAAA,0BACIA,MAAA,EAAAixB,GAAA,iBAQJjxB,kCAZUA,MAAA,GAAAA,YAAA,gCAKiBA,MAAA,GAAAA,MAAA,UAAA2b,EAAAuV,iIAsB3BlxB,MAAA,WAAAA,CAAkB,YAEVA,MAAA,6CAGJA,QACAA,MAAA,yBAAAA,CAA6E,cAOrEA,MAAA,2BAAAA,MAAAmxB,GAAA,MAAAtG,EAAA7qB,QAAA,OAAiBA,MAAA6qB,EAAAuG,oBAAmB,GANxCpxB,QAQAA,MAAA,WAAOA,MAAA,wBAAiDA,0DAbxDA,MAAA,GAAAA,MAAA,IAAAA,MAAA,wCAAAA,MAAA,4BAAAA,MAAA,GAAAmrB,GAAAkG,IAAA,MAIkBrxB,MAAA,GAAAA,MAAA,kBAAAsxB,EAAA9vB,EAAAf,WAAAM,IAAA,iBAAAuwB,EAAA5wB,UAIdV,MAAA,GAAAA,MAAA,iBAAAA,MAAA,GAAAurB,IAAAvrB,CAAuC,kBAAAuxB,EAAA/vB,EAAAf,WAAAM,IAAA,iBAAAwwB,EAAA7wB,SAAvCV,CAAuC,UAAAwB,EAAAgwB,aAKpCxxB,MAAA,GAAAA,YAAA,gFCnL1ByxB,GAA0B7Z;;;;;;MAMjC8Z;EASA,MAAOC,WACD3Z,MAwBRte,YACYiK,EACEhK,EACF+J,EACAE,EACAyN,EACAkb,GAER1oB,QAPQjK,KAAA+J,iBACE/J,KAAAD,cACFC,KAAA8J,cACA9J,KAAAgK,sBACAhK,KAAAyX,eACAzX,KAAA2yB,sBA3BZ3yB,KAAAsN,aAAetN,KAAKsK,qBAAqB,cACzCtK,KAAA6G,WAAa7G,KAAK8J,YAAYc,MAAM,CAChChI,KAAM,CAAC,GAAIuM,KAAWC,UACtB4oB,KAAM,CAAC,MAAIC,OAAwB,0BACnCb,YAAa,GACbc,SAAS,EACTrM,gBAAgB,EAChBI,QAASjsB,KAAK8J,YAAYoD,MAAM,IAChCI,aAActN,KAAK8J,YAAYc,SAAM2T,OAAwBve,KAAKsN,iBAEtEtN,KAAAm4B,aAA4D,GAC5Dn4B,KAAAisB,QAAmC,GACnCjsB,KAAAs3B,WAAgD,GAGhDt3B,KAAA43B,aAAc,EAEL53B,KAAAoH,iBAAmB,CAAC+C,MAAWC,cAAeD,MAAWiuB,kBAC1Dp4B,KAAAq4B,eAAiB,IAAIhgB,KAYzBrY,KAAK43B,YAAc53B,KAAK2yB,oBAAoBxrB,IAAI,mCAAoC,CACxF,CAEAoD,WACIvK,KAAK+K,OACL/K,KAAKD,YAAYosB,WAAWmM,uBAAuBryB,QAAQ4F,UAAU2V,IACjExhB,KAAKs3B,WAAa9V,EAAI+W,oBAE1B,MAAMC,EAAmBx4B,KAAK6G,WAAWM,IAAI,WACvCsxB,EAAwBz4B,KAAK6G,WAAWM,IAAI,kBAClDnH,KAAK04B,gBAAkBD,EAAsBroB,aAAa7P,QAAKgrB,QAC/DvrB,KAAK24B,mBAAkBC,MAAMJ,EAAiBK,cAAe74B,KAAKq4B,gBAAgB93B,QAC9EkgB,MAAa,MAAG,EAChBvf,MAAO,IAAMs3B,EAAiBM,UAAO,EACrCn3B,KAAI,IACA3B,KAAK+4B,sBAAsB/4B,KAAKisB,QAASuM,EAAiBlxB,OAAOpG,OAAO83B,IAGpE,UAAWC,KAAOD,EAAQE,UACtB,GAAkB,KAAdD,EAAI3xB,MACJ,OAAO,EAGf,OAAO,MAInBtH,KAAKm5B,UAAYn5B,KAAK0J,MAAM4O,SAAS/X,QACjCoB,KAAIy3B,GAAMA,EAAGjyB,IAAI,kBAAeiY,IAAS,EACzCxZ,KAAUmmB,GACFA,KACO9pB,MAAG8pB,GAEH/rB,KAAKmL,QAAQ5K,QAAKoB,KAAIwqB,GAAcA,EAAWtT,QAAQ9W,MAI9E,CAEAyc,cACIxe,KAAKye,SACT,CAEAsY,oBAAoBiC,GAChB,OAAOh5B,KAAKs3B,WAAW50B,KAAK22B,GAAKA,EAAEj2B,OAAS41B,EAAQ51B,KACxD,CAEA6yB,gBACI,QAAS5lB,OAAOjP,OAAOpB,KAAKm4B,cAAc92B,MAC9C,CAKAi4B,WAAWC,GACP,MAAMC,EAAcx5B,KAAK6G,WAAWM,IAAI,CAAC,SACnCqG,EAAqBxN,KAAK0K,UAAS/F,OAAgB3E,KAAK0K,OAAQ1K,KAAKY,mBAAgBwe,EACrFqa,GAAsBjsB,IAAuBA,EAAmBwqB,KAClEwB,GAAeA,EAAY1yB,UAAY2yB,GACvCD,EAAY1rB,YAASzK,KAAgB,GAAGk2B,IAAa,KAE7D,CAEApC,UAAUuC,GACN,MAAMC,EAAe35B,KAAK6G,WAAWM,IAAI,WACnCyyB,EAAWF,EAAiBla,KAAKzc,OACnC,CAAC82B,EAAQZ,SACFY,EACH,CAACZ,EAAIr2B,OAAI,EAAGk3B,OAAkBb,EAAI3xB,SAEtC,IAEJqyB,EAAal1B,KACTzE,KAAK8J,YAAY+D,QAAQ,CACrBzK,KAAMs2B,EAAiBt2B,KACvBoc,KAAMoa,KAGd55B,KAAKisB,QAAQxnB,KAAK,CACdrB,KAAMs2B,EAAiBt2B,KACvBoc,KAAMka,EAAiBla,KAAK7d,IAAIsW,KAAQrV,KAAMqV,EAAErV,KAAM0E,SAAOwyB,OAAkB7hB,EAAE3Q,WAEzF,CAEAsvB,aAAar0B,GACT,MAAMo3B,EAAe35B,KAAK6G,WAAWM,IAAI,YAC3B,IAAV5E,IACAo3B,EAAaI,SAASx3B,GACtBo3B,EAAahb,cACbgb,EAAaK,gBACbh6B,KAAKisB,QAAQsI,OAAOhyB,EAAO,GAC3BvC,KAAKq4B,eAAepe,OAE5B,CAEA8b,SACI,IAAK/1B,KAAK6G,WAAW0E,MACjB,OAEJ,MAAM7K,EAAQV,KAAKi6B,qBACf,CACIl4B,GAAI,GACJyF,UAAW,GACXE,UAAW,GACX9G,aAAcZ,KAAKY,aACnBgC,KAAM,GACNo1B,KAAM,GACNkC,WAAW,EACXjG,YAAa,GACbmD,YAAa,GACbvV,cAAe,KACflC,OAAQ,GACRrc,aAAc,GACduoB,gBAAgB,EAChBI,QAAS,GACTpT,OAAQ,GACR8D,SAAU,MAEd3c,KAAK6G,WACL7G,KAAKY,cAEHmrB,EAAW/rB,KAAK0J,MAAMe,SAAS6N,SAASnR,IAAI,YAC9C4kB,IACArrB,EAAMqrB,SAAWA,GAErB/rB,KAAKD,YAAYosB,WAAWgO,iBAAiBz5B,GAAOmL,UAChDzL,IACIJ,KAAKgK,oBAAoBgC,WAAQC,KAAE,gCAAiC,CAChEvB,OAAQ,eAEZ1K,KAAKm4B,aAAe,GACpBn4B,KAAK6G,WAAWiF,iBAChB9L,KAAK+J,eAAegC,eACpB/L,KAAK2J,OAAOsjB,SAAS,CAAC,MAAO7sB,EAAK+5B,iBAAiBp4B,IAAK,CAAEmrB,WAAYltB,KAAK0J,OAAO,EAEtFwC,IACIlM,KAAKgK,oBAAoBmC,SAAMF,KAAE,8BAA+B,CAC5DvB,OAAQ,cACX,EAGb,CAEA/D,QACIuE,OAAclL,KAAKmL,QAASnL,KAAKoL,eAC5B7K,QACG8K,KAAK,IAAC,EACN5J,KAAS,EAAE24B,EAAUx5B,MACjB,MAAMF,EAAQV,KAAKi6B,qBACfG,EACAp6B,KAAK6G,WACLjG,GAEJ,OAAOZ,KAAKD,YAAYosB,WAAWkO,iBAAiB35B,EAAK,IAGhEmL,UACG,KACI7L,KAAKm4B,aAAe,GACpBn4B,KAAK6G,WAAWiF,iBAChB9L,KAAK+J,eAAegC,eACpB/L,KAAKgK,oBAAoBgC,WAAQC,KAAE,gCAAiC,CAChEvB,OAAQ,eAEZ1K,KAAKs6B,kBAAkB1Z,SAAO,EAElC1U,IACIlM,KAAKgK,oBAAoBmC,SAAMF,KAAE,8BAA+B,CAC5DvB,OAAQ,cACX,EAGjB,CAEAkP,gBACI,OAAO3P,MAAM2P,kBAAoB5Z,KAAKm4B,aAAaxY,SAAW3f,KAAKm4B,aAAatW,aACpF,CAEA2V,oBACIx3B,KAAK43B,aAAe53B,KAAK43B,YACzB53B,KAAK2yB,oBAAoB4H,IAAI,gCAAiCv6B,KAAK43B,YACvE,CAEA/B,UAAUtzB,EAAe2T,GACrB,OAAOskB,KAAKC,UAAUvkB,EAC1B,CAKUvJ,cAAcjC,EAA4B9J,GAChD,MAAM4M,KAAqB7I,OAAgB+F,EAAQ9J,GAEnDZ,KAAK6G,WAAW6zB,WAAW,CACvB93B,KAAM4K,EAAqBA,EAAmB5K,KAAO,GACrDo1B,KAAMxqB,EAAqBA,EAAmBwqB,KAAO,GACrDZ,YAAa5pB,EAAqBA,EAAmB4pB,YAAc,GACnEc,SAAUxtB,EAAOwvB,UACjBrO,eAAgBnhB,EAAOmhB,iBAG3B,MAAM8O,EAAY36B,KAAK6G,WAAWM,IAAI,WAClCwzB,EAAUt5B,SAAWqJ,EAAOuhB,QAAQ5qB,SACpCs5B,EAAUC,QACV56B,KAAKisB,QAAU,GACfvhB,EAAOuhB,QAAQoH,QAAQgG,GAAKr5B,KAAKm3B,UAAUkC,KAG3Cr5B,KAAKsN,aAAajM,QAClBrB,KAAK4N,yBACD5N,KAAKsN,aACLtN,KAAK6G,WAAWM,IAAI,CAAC,iBACrBuD,EACA8C,EAGZ,CAMQysB,qBACJG,EACAnrB,EACArO,GAcA,MAAO,KACH,EAboByL,OAA0B,CAC9CC,aAAc8tB,EACd7tB,cAAe0C,EAAK3H,MACpBkF,kBAAmBxM,KAAKsN,aACxB1M,eACA6L,mBAAoB,CAChB7L,eACAgC,KAAMw3B,EAASx3B,MAAQ,GACvBo1B,KAAMoC,EAASpC,MAAQ,GACvBZ,YAAagD,EAAShD,aAAe,MAKzC7V,SAAUvhB,KAAKm4B,aAAaxY,QAAQhe,IAAIsW,GAAKA,EAAElW,IAC/C84B,gBAAiB76B,KAAKm4B,aAAatW,eAAe9f,GAClDm4B,WAAYjrB,EAAK3H,MAAM4wB,QACvBjM,QAASjsB,KAAK+4B,sBAAsB/4B,KAAKisB,QAASjsB,KAAK6G,WAAWS,MAAM2kB,SAEhF,CAKQ8M,sBACJ+B,EACAC,GAEA,OAAOD,EAAWn5B,IAAI,CAACgB,EAAGsC,MACtB7B,KAAMT,EAAES,KACR81B,UAAW7oB,OAAOE,QAAQwqB,EAAoB91B,GAAGua,MAAM7d,IAAI,EAAEiB,EAAM0E,GAAQ0zB,MACvEp4B,OACA0E,SAAO2zB,OAAqB3zB,QAGxC,gBAxSSywB,4CAAyB3xB,mBAAAC,OAAAD,MAAA2H,MAAA3H,MAAAC,OAAAD,MAAAC,OAAAD,MAAAC,OAAA,2BAAzB0xB,GAAyB7pB,UAAA,4BAAA2G,UAAA,SAAArG,EAAAC,MAAA,EAAAD,kuEDxDtCpI,MAAA,mBAAAA,CAAgB,mBAAhBA,CAAgB,gBAAhBA,CAAgB,6BAOAA,MAAA,8BAAA6B,GAAA,OAAsBwG,EAAAC,YAAAzG,EAAmB,sDAC5C7B,UAELA,MAAA,kBACIA,MAAA,4BACAA,MAAA,EAAA80B,GAAA,kCAQA90B,MAAA,GAAA+0B,GAAA,yBAAA/0B,OAScA,YAI1BA,MAAA,YAAAA,CAA4C,4BAA5CA,CAA4C,6BAA5CA,CAA4C,cAA5CA,CAA4C,6CAKxBA,MAAA,yBACIA,MAAA,wCAOAA,MAAA,cACIA,MAAA,GAAAg1B,GAAA,sBAGAh1B,MAAA,GAAAi1B,GAAA,yBAAAj1B,OACJA,cAIZA,MAAA,GAAAk1B,GAAA,qCAGJl1B,QAEAA,MAAA,GAAAm1B,GAAA,2CAkBAn1B,MAAA,oBAAAA,CAAgB,cAAhBA,CAAgB,YAAhBA,CAAgB,8CAIAA,MAAA,eAKIA,MAAA,iBAAA6B,GAAA,OAASwG,EAAA6qB,WAAArxB,EAAA1I,OAAA+H,MAA+B,6BAL5ClB,UAQJA,MAAA,oEAKIA,MAAA,yCAMJA,QACAA,MAAA,8CAKIA,MAAA,wDAIJA,YAGRA,MAAA,GAAAo1B,GAAA,mBAYAp1B,MAAA,0CAKAA,MAAA,wCACIA,MAAA,oBAIIA,MAAA,kBAAA6B,GAAA,OAAAwG,EAAA0pB,aAAAlwB,CAAA,GACH7B,UAELA,MAAA,wCACIA,MAAA,8CAIIA,MAAA,yBACIA,MAAA,yCAOAA,MAAA,cACIA,MAAA,GAAAq1B,GAAA,sBAGAr1B,MAAA,GAAAs1B,GAAA,0BAAAt1B,OAGJA,YAGRA,MAAA,aACIA,MAAA,GAAAu1B,GAAA,uBAUJv1B,QACAA,MAAA,GAAAw1B,GAAA,eAmBJx1B,QAEAA,MAAA,wCACIA,MAAA,0FAQIA,MAAA,GAAAy1B,GAAA,qBAoBJz1B,gEA5NAA,MAAA,GAAAA,MAAA,WAAAA,MAAA,KAAAqI,EAAAqtB,QAAA11B,CAA2B,yBAAAA,MAAA,KAAAqI,EAAAI,qBAA3BzI,CAA2B,sBAAAA,MAAA,KAAAqI,EAAArD,gBAU1BhF,MAAA,GAAAA,MAAA,OAAAA,MAAA,MAAAqI,EAAAqtB,QAAA11B,CAAsB,WAAA4O,GAmBpB5O,MAAA,GAAAA,MAAA,YAAAqI,EAAA5H,YAIaT,MAAA,GAAAA,MAAA,QAAAA,MAAA,6BAOJA,MAAA,GAAAA,MAAA,eAAAA,MAAA,MAAAqI,EAAArH,mBAGehB,MAAA,GAAAA,MAAA,OAAAqI,EAAA5H,WAAAS,MAAA4wB,QAAA9xB,CAAgC,WAAA21B,GAQpD31B,MAAA,GAAAA,MAAA,OAAAA,MAAA,MAAAqI,EAAAtD,UAKE/E,MAAA,GAAAA,MAAA,OAAAA,MAAA,MAAAqI,EAAAtD,UAqBW/E,MAAA,GAAAA,MAAA,QAAAA,MAAA,sBAKRA,MAAA,GAAAA,MAAA,YAAAA,MAAA,MAAAqI,EAAArH,mBAKJhB,MAAA,GAAAA,MAAA,QAAAA,MAAA,sBAAAA,CAAoC,SAAAA,MAAA,GAAAmsB,GAAAnsB,MAAA,sCAQhCA,MAAA,GAAAA,MAAA,YAAAA,MAAA,MAAAqI,EAAArH,mBAKJhB,MAAA,GAAAA,MAAA,QAAAA,MAAA,6BAKIA,MAAA,GAAAA,MAAA,YAAAA,MAAA,MAAAqI,EAAArH,mBAOXhB,MAAA,GAAAA,MAAA,OAAAqI,EAAAnB,aAAAjM,QAYD+E,MAAA,GAAAA,MAAA,UAAAqI,EAAAtD,QAAA/E,CAAmB,aAAAqI,EAAA5H,YAGbT,MAAA,GAAAA,MAAA,QAAAA,MAAA,yBAEFA,MAAA,GAAAA,MAAA,eAAAqI,EAAA/D,OAAA,KAAA+D,EAAA/D,OAAAiV,OAAAvZ,CAAyB,sBAAAqI,EAAA/D,OAAA,KAAA+D,EAAA/D,OAAAmX,cAAzBzb,CAAyB,oBAAAqI,EAAArH,kBAMvBhB,MAAA,GAAAA,MAAA,QAAAA,MAAA,0BAEFA,MAAA,GAAAA,MAAA,QAAAA,MAAA,qCASQA,MAAA,GAAAA,MAAA,eAAAA,MAAA,MAAAqI,EAAArH,mBAGehB,MAAA,GAAAA,MAAA,OAAAqI,EAAA5H,WAAAS,MAAAukB,eAAAzlB,CAAuC,WAAAub,GAU7Bvb,MAAA,GAAAA,MAAA,UAAAqI,EAAAwd,QAAA7lB,CAAY,eAAAqI,EAAAonB,WAW3CzvB,MAAA,GAAAA,MAAA,mBAAAqI,EAAArH,kBAqBAhB,MAAA,GAAAA,MAAA,QAAAA,MAAA,yBAAAA,CAAuC,eAEzCA,MAAA,GAAAA,MAAA,eAAAqI,EAAA1M,GAAAqE,CAAmB,WAAAA,MAAA,MAAAqI,EAAA0qB,WAAnB/yB,CAAmB,iBAAAA,MAAA,MAAAqI,EAAAkqB,iBAAnBvyB,CAAmB,iBAAAA,MAAA,MAAAqI,EAAAiqB,iBAAnBtyB,CAAmB,wBAAAqI,EAAAmpB,kiCE5LjC,MAAOoE,GACTC,UAAU30B,GACN,OAAOA,GAAO2sB,YAAYpQ,MAAM,GAAG,EACvC,yBCXAzd,MAAA,8BAAAA,MAAA,IAAAA,MAAA,+DAmBQA,MAAA,uBAAAA,MAAA,IAAA81B,EAAAn6B,GAAA,+BAMAqE,MAAA,4CAEIA,MAAA,kBAAA+1B,0BASA/1B,MAAA,uCACAA,MAAA,0DANJA,MAAA,eAGIA,MAAA,mBAAAA,MAAAg2B,GAAA,MAAAC,EAAAj2B,QAAA8P,KAAAuP,EAAArf,QAAA,OAASA,MAAAqf,EAAA6W,eAAAD,GAA0B,GAEnCj2B,MAAA,EAAAm2B,GAAA,mBACAn2B,MAAA,EAAAo2B,GAAA,mBACJp2B,+CAF8BA,MAAA,GAAAA,MAAA,QAAA0C,EAAA2zB,YAAAh3B,SAAA42B,EAAAt6B,KACKqE,MAAA,GAAAA,MAAA,OAAA0C,EAAA2zB,YAAAh3B,SAAA42B,EAAAt6B,6BAEnCqE,MAAA,eACIA,MAAA,iBACJA,aDjCC41B,2CAAwB,wDAAxBA,GAAwBU,MAAA,kFCgBzBt2B,MAAA,WACAA,MAAA,EAAAu2B,GAAA,kBAMAv2B,MAAA,EAAAw2B,GAAA,gBAQAx2B,MAAA,EAAAy2B,GAAA,iBAGAz2B,MAAA,eAA6BA,MAAA,yBAAAi2B,EAAAj2B,MAAA02B,GAAA5mB,KAAA8f,EAAA5vB,QAAA,OAASA,MAAA4vB,EAAAxmB,YAAA6sB,GAAuB,GACzDj2B,MAAA,UAAMA,MAAA,wBAAwEA,2CAnB7EA,MAAA,oBAAA+1B,GAKA/1B,MAAA,GAAAA,MAAA,eAAAi2B,EAAA1f,UAAA0f,EAAA1f,SAAAtb,SAAA,OAAAg7B,EAAAtQ,UAIA3lB,MAAA,GAAAA,MAAA,aAAAi2B,EAAA1f,SAAA,KAAA0f,EAAA1f,SAAAtb,QAMsC+E,MAAA,GAAAA,MAAA,cAAAi2B,EAAAtQ,UAIjC3lB,MAAA,GAAAA,YAAA,iCAAAA,MAAA,EAAA2Y,GAAAsd,EAAAz5B,mCASEwD,MAAA,QAAAA,CAAsC,aACVA,MAAA,OAACA,QAAOA,MAAA,GACpCA,kCADoCA,MAAA,GAAAA,MAAA,GAAA22B,EAAAn6B,KAAA,gCAFxCwD,MAAA,GACIA,MAAA,EAAA42B,GAAA,cAGJ52B,mCAH0BA,MAAA,GAAAA,MAAA,UAAA62B,2BAI1B72B,MAAA,aAAoDA,MAAA,OAACA,mCANzDA,MAAA,GACIA,MAAA,EAAA82B,GAAA,uBAKA92B,MAAA,EAAA+2B,GAAA,eACJ/2B,6BANmBA,MAAA,GAAAA,MAAA,OAAA62B,EAAA57B,QAKU+E,MAAA,GAAAA,MAAA,QAAA62B,EAAA57B,mCAPjC+E,MAAA,YACIA,MAAA,EAAAg3B,GAAA,uDAQJh3B,6BARmBA,MAAA,GAAAA,MAAA,OAAAA,MAAA,IAAAi3B,8BAanBj3B,MAAA,uBAAAA,MAAA,IAAAk3B,EAAAtF,KAAA,MCpDN,MAAOuF,GAaTz9B,YAAoBC,EAAkCy9B,GAAlCx9B,KAAAD,cAAkCC,KAAAw9B,cATtDx9B,KAAA4X,kBAAoB,IAAIzH,KAAY,IAGpCnQ,KAAAugB,aAAe,IAAIpB,IAAgB,GACnCnf,KAAAsgB,cAAgB,IAAInB,IAAgB,IACpCnf,KAAAy9B,aAAe,IAAIplB,KACnBrY,KAAAy8B,YAAwB,EAGyD,CAEjFlyB,WACI,MAAMmzB,EAAuB19B,KAAKD,YAAYosB,WAAWwR,iBAEnDze,EAAclf,KAAK4X,kBAAkBxH,aAAa7P,QACpDkgB,MAAa,MAAG,EAChB8K,QAAoB,EACpBzS,KAAU,KAERyH,EAAevgB,KAAKugB,aAAahgB,QAAKgrB,QACtCjL,EAAgBtgB,KAAKsgB,cAAc/f,QAAKgrB,SAC9CrgB,OAAcgU,EAAaqB,EAAcD,GAAezU,UACpD,EAAEgU,EAAYvX,EAAaS,MACvB,MAAM60B,EAA8B,KAAf/d,EACrB6d,EAAqBlK,IAAIqK,QAAQ,CAC7Bp7B,QAAS,CACLmd,MAAOtX,EAAc,GAAKS,EAC1BsC,KAAMtC,EACN7H,OAAQ,CACJ0B,KAAM,CAAEkd,SAAUD,IAEtB+d,iBAEP,GAIT,MAAME,EAAoB99B,KAAKD,YAAYosB,WACtCwR,eAAe,CACZtyB,KAAM,EACNuyB,cAAc,IAEjBz9B,UAAUC,GAAQA,EAAK29B,YAAYz9B,MAAM,GAAGyrB,UAEjD/rB,KAAKyhB,UAASvW,KACVwyB,EAAqBvhB,UAAU,EAAG4hB,iBAAkBA,GACpDD,GACFv9B,QACEoB,KAAI,EAAEo8B,EAAaC,KAAsB,IACjCA,EACE,CACI,CACIj8B,GAAIi8B,EACJp7B,KAAM5C,KAAKw9B,YAAYS,UAAU,2BACjCjG,KAAM,GACNjM,SAAU,KACVmS,SAAU,EACVrc,cAAe,KACflF,SAAU,GACVsX,YAAa,GACbiG,WAAW,EACX1yB,UAAW,GACXE,UAAW,KAGnB,MACHq2B,EAAYz9B,SAGvBN,KAAKkZ,YAAcwkB,EAAqBvhB,UAAU/b,GAAQA,EAAK29B,YAAYvd,YAE3ExgB,KAAKm+B,gBAAkBn+B,KAAKy9B,aAAal9B,QACrCoK,KAAIiQ,GAAQ5a,KAAKy8B,YAAc7hB,IAAI,EACnChV,KAAUghB,GACFA,EAAIvlB,OACGrB,KAAKD,YAAYosB,WACnBwR,eAAe,CACZtyB,KAAM,IACNnK,OAAQ,CACJ6qB,SAAU,CAAEhE,GAAInB,MAGvBzK,UAAU/b,GAAQA,EAAK29B,YAAYz9B,QAAK,EAEtC2B,MAAG,KAI1B,CAEAq6B,eAAenQ,GACX,IAAIsQ,EAAcz8B,KAAKy8B,YAClBA,EAAYh3B,SAAS0mB,EAAWpqB,IAGjC06B,EAAcA,EAAYv7B,OAAOa,GAAMA,IAAOoqB,EAAWpqB,IAFzD06B,EAAYh4B,KAAK0nB,EAAWpqB,IAIhC/B,KAAKy9B,aAAaxjB,KAAKwiB,EAC3B,MAtGSc,4CAA8Bn3B,MAAAC,OAAAD,MAAAC,OAAA,2BAA9Bk3B,GAA8BrvB,UAAA,kCAAAE,MAAA,GAAAC,KAAA,GAAAC,OAAA,o7BAAAC,SAAA,SAAAC,EAAAC,GAAA,EAAAD,IDZ3CpI,MAAA,EAAAg4B,GAAA,qBAGAh4B,MAAA,iCAQIA,MAAA,sBAAA6B,GAAA,OAAcwG,EAAA8R,aAAAtG,KAAAhS,EAAyB,EAAvC7B,CAAwC,8BAAA6B,GAAA,OAClBwG,EAAA6R,cAAArG,KAAAhS,EAA0B,wFAEhD7B,MAAA,2CAIAA,MAAA,4CACIA,MAAA,GAAAi4B,GAAA,mBAGJj4B,QACAA,MAAA,6CACIA,MAAA,GAAAk4B,GAAA,oBAuBJl4B,QACAA,MAAA,6CACIA,MAAA,GAAAm4B,GAAA,mBAYJn4B,QACAA,MAAA,6CACIA,MAAA,GAAAo4B,GAAA,mBAGJp4B,iBA5DAA,MAAA,GAAAA,MAAA,QAAAA,MAAA,KAAAqI,EAAAgT,QAAArb,CAAwB,iBAAAA,MAAA,KAAAqI,EAAA0vB,iBAAxB/3B,CAAwB,eAAAA,MAAA,KAAAqI,EAAA6R,eAAxBla,CAAwB,aAAAA,MAAA,KAAAqI,EAAAyK,aAAxB9S,CAAwB,cAAAA,MAAA,KAAAqI,EAAA8R,eASpBna,MAAA,GAAAA,MAAA,oBAAAqI,EAAAmJ,kBAAAxR,CAAuC,wBAAAA,MAAA,+BAG3BA,MAAA,GAAAA,MAAA,UAAAA,MAAA,mBAAAA,CAAmC,sBAKnCA,MAAA,GAAAA,MAAA,UAAAA,MAAA,qBAAAA,CAAqC,eAyBrCA,MAAA,GAAAA,MAAA,UAAAA,MAAA,4BAcAA,MAAA,GAAAA,MAAA,UAAAA,MAAA,+0BEzCb,MAAMq4B,MAA8BC,OAEzC,CACEC,SAAU,kBACVC,mBAAoBC,GAChBA,EAAgBp5B,SAAS0E,MAAW20B,mBACpCD,EAAgBp5B,SAAS0E,MAAW40B,eACxCC,YAAa9oB,GAAQA,EAAKtT,KAC1Bq8B,WAAYA,CAACl/B,EAAa6mB,IACtB7mB,EAAYosB,WAAW+S,kBAAkBtY,GAAKrmB,QAAKoB,KAAI6f,GAAOA,EAAI0d,sBAG7DC,GAAoF,CAC7FR,SAAU,kBACVjkB,SAAOzO,KAAE,4BACTmzB,KAAM,cACNR,mBAAoBC,GAChBA,EAAgBp5B,SAAS0E,MAAWC,gBACpCy0B,EAAgBp5B,SAAS0E,MAAWiuB,kBACxCiH,QAASA,EAAG7N,WAAUiE,YAAW6J,gBAAeC,qBAC5C,MAAM9nB,EAAe+Z,EAASrqB,IAAIq4B,OAC5Bz/B,EAAcyxB,EAASrqB,IAAI+V,OAC3BlT,EAAsBwnB,EAASrqB,IAAIs4B,OACzChoB,EACKqC,cAAcyjB,GAAgC,CAC3CvZ,KAAM,KACNK,UAAU,IAEb9jB,QACGqF,KAAUC,IACN,GAAIA,EAAQ,CACR,MAAM65B,EAAgCjK,EAAU9zB,IAAIwB,KAChDwpB,aAAcxpB,EAAEpB,GAChBgqB,SAAUlmB,EAAO9D,GACjBQ,MAAO,KAEX,OAAOxC,EAAYosB,WAAWwT,eAAeD,GAE7C,OAAO1lB,OAIlBnO,UAAUhG,IACPmE,EAAoBgC,WAAQC,KAAE,oCAAqC,CAC/DsO,MAAOkb,EAAUp0B,SAErBk+B,IACAD,EAAc1e,SAAO,EACxB,GAIAgf,MAAuCC,OAElD,CACElB,SAAU,kBACVC,mBAAoBC,GAChBA,EAAgBp5B,SAAS0E,MAAWC,gBACpCy0B,EAAgBp5B,SAAS0E,MAAWiuB,kBACxC4G,YAAa9oB,GAAQA,EAAKtT,KAC1Bk9B,oBAAqBA,CAAC//B,EAAaggC,EAAe3Y,IAC9CrnB,EAAYosB,WACP6T,2BAA2B,CACxBD,gBACA3Y,cAEH7mB,QAAKoB,KAAI6f,GAAOA,EAAIwe,+BAGpBC,MAAyCC,OAEpD,CACEvB,SAAU,kBACVC,mBAAoBC,GAChBA,EAAgBp5B,SAAS0E,MAAW40B,gBACpCF,EAAgBp5B,SAAS0E,MAAW20B,kBACxCE,YAAa9oB,GAAQA,EAAKtT,KAC1Bu9B,sBAAuBA,CAACpgC,EAAaggC,EAAe3Y,IAChDrnB,EAAYosB,WACPiU,6BAA6B,CAC1BhZ,UAAWA,EACX2Y,kBAEHx/B,QAAKoB,KAAI6f,GAAOA,EAAI4e,kJC7FrBh6B,MAAA,SAKIA,MAAA,gBACAA,MAAA,wBACJA,eAJIA,MAAA,aAAAA,MAAA,EAAA2Y,KAGA3Y,MAAA,GAAAA,MAAA,IAAAA,MAAA,oEAgCIA,MAAA,uBAAAA,MAAA,IAAAi6B,EAAAt+B,GAAA,gCASAqE,MAAA,8CAAAA,MAAA,IAAAA,MAAA,IAAAk6B,EAAA94B,UAAA,yCASApB,MAAA,8CAAAA,MAAA,IAAAA,MAAA,IAAAm6B,EAAA74B,UAAA,wCASAtB,MAAA,uBAAAA,MAAA,IAAAo6B,EAAAtC,SAAA,+BAUA93B,MAAA,4CAEIA,MAAA,kBAAAq6B,0BASAr6B,MAAA,uCACAA,MAAA,0DANJA,MAAA,eAGIA,MAAA,mBAAAA,MAAAs6B,GAAA,MAAAC,EAAAv6B,QAAA8P,KAAA9N,EAAAhC,MAAA,UAASA,MAAAgC,EAAAk0B,eAAAqE,GAA0B,GAEnCv6B,MAAA,EAAAw6B,GAAA,mBACAx6B,MAAA,EAAAy6B,GAAA,mBACJz6B,gDAF8BA,MAAA,GAAAA,MAAA,QAAA06B,EAAArE,YAAAh3B,SAAAk7B,EAAA5+B,KACKqE,MAAA,GAAAA,MAAA,OAAA06B,EAAArE,YAAAh3B,SAAAk7B,EAAA5+B,qEAbnCqE,MAAA,YACAA,MAAA,EAAA26B,GAAA,mBAMA36B,MAAA,EAAA46B,GAAA,iBAQA56B,MAAA,SAAAA,CACK,UAAMA,MAAA,GAAqBA,QAC5BA,MAAA,iBACJA,uCAlBKA,MAAA,oBAAAq6B,GAKAr6B,MAAA,GAAAA,MAAA,eAAAu6B,EAAAhkB,UAAAgkB,EAAAhkB,SAAAtb,SAIA+E,MAAA,GAAAA,MAAA,aAAAu6B,EAAAhkB,SAAA,KAAAgkB,EAAAhkB,SAAAtb,QAMmB+E,MAAA,GAAAA,MAAA,aAAAA,MAAA,EAAAsb,GAAAif,EAAA5+B,KACbqE,MAAA,GAAAA,MAAAu6B,EAAA/9B,iCAUCwD,MAAA,QAAAA,CAAsC,aACVA,MAAA,OAACA,QAAOA,MAAA,GACpCA,kCADoCA,MAAA,GAAAA,MAAA,GAAA66B,EAAAr+B,KAAA,gCAFxCwD,MAAA,GACIA,MAAA,EAAA86B,GAAA,cAGJ96B,mCAH0BA,MAAA,GAAAA,MAAA,UAAA+6B,2BAI1B/6B,MAAA,aAAoDA,MAAA,OAACA,mCANzDA,MAAA,GACIA,MAAA,EAAAg7B,GAAA,uBAKAh7B,MAAA,EAAAi7B,GAAA,eACJj7B,6BANmBA,MAAA,GAAAA,MAAA,OAAA+6B,EAAA9/B,QAKU+E,MAAA,GAAAA,MAAA,QAAA+6B,EAAA9/B,mCAPjC+E,MAAA,YACIA,MAAA,EAAAk7B,GAAA,uDAQJl7B,6BARmBA,MAAA,GAAAA,MAAA,OAAAA,MAAA,IAAAk3B,8BAanBl3B,MAAA,uBAAAA,MAAA,IAAAm7B,EAAAvJ,KAAA,6BAKA5xB,MAAA,iBAA2DA,MAAA,wBAErDA,eAFqDA,MAAA,GAAAA,YAAA,+CAG3DA,MAAA,iBAA4DA,MAAA,wBAEtDA,eAFsDA,MAAA,GAAAA,YAAA,iDAH5DA,MAAA,EAAAo7B,GAAA,mBAGAp7B,MAAA,EAAAq7B,GAAA,wCAHWr7B,MAAA,OAAAs7B,EAAAxH,WAGA9zB,MAAA,GAAAA,MAAA,QAAAs7B,EAAAxH,+EAOX9zB,MAAA,SAAAA,CAIC,UACSA,MAAA,wBAAwCA,QAC9CA,MAAA,iBACJA,6BALIA,MAAA,aAAAA,MAAA,EAAAsb,GAAAtb,MAAA,EAAAmqB,GAAAoR,EAAA5/B,MAGMqE,MAAA,GAAAA,YAAA,uDAKlBA,MAAA,wEAEIA,MAAA,cAAAw7B,EAAAx7B,CAA2B,QAAA0wB,EAAA+K,iDA7HnCz7B,MAAA,iCAUIA,MAAA,sBAAA6B,GAAA7B,MAAA07B,GAAA,MAAA/P,EAAA3rB,QAAA,OAAcA,MAAA2rB,EAAAxY,cAAAtR,GAAqB,EAAnC7B,CAAoC,8BAAA6B,GAAA7B,MAAA07B,GAAA,MAAA/Q,EAAA3qB,QAAA,OACdA,MAAA2qB,EAAAzX,gBAAArR,GAAuB,EAD7C7B,CAAoC,uBAAA6B,GAAA7B,MAAA07B,GAAA,MAAAC,EAAA37B,QAAA,OAErBA,MAAA27B,EAAAC,YAAA/5B,GAAmB,yGAElC7B,MAAA,2BAAAA,CAIwB,4CAKxBA,MAAA,8CACIA,MAAA,GAAA67B,GAAA,mBAGJ77B,QACAA,MAAA,8CAKIA,MAAA,GAAA87B,GAAA,mBAGJ97B,QACAA,MAAA,8CAKIA,MAAA,GAAA+7B,GAAA,mBAGJ/7B,QACAA,MAAA,8CAKIA,MAAA,GAAAg8B,GAAA,mBAGJh8B,QACAA,MAAA,8CAKIA,MAAA,GAAAi8B,GAAA,mBAqBJj8B,QACAA,MAAA,8CACIA,MAAA,GAAAk8B,GAAA,mBAYJl8B,QACAA,MAAA,8CACIA,MAAA,GAAAm8B,GAAA,mBAGJn8B,QACAA,MAAA,8CACIA,MAAA,GAAAo8B,GAAA,mBAQJp8B,QACAA,MAAA,8CACIA,MAAA,GAAAq8B,GAAA,mBAUJr8B,QACAA,MAAA,GAAAs8B,GAAA,sCAKJt8B,gCA7HIA,MAAA,QAAAA,MAAA,KAAAkD,EAAAmY,QAAArb,CAAwB,iBAAAA,MAAA,KAAAkD,EAAA60B,iBAAxB/3B,CAAwB,eAAAA,MAAA,KAAAkD,EAAAgX,eAAxBla,CAAwB,aAAAA,MAAA,KAAAkD,EAAA4P,aAAxB9S,CAAwB,cAAAA,MAAA,KAAAkD,EAAAiX,cAAxBna,CAAwB,UAAAkD,EAAA2iB,QAAxB7lB,CAAwB,cAAAA,MAAA,KAAAkD,EAAAq5B,yBAapBv8B,MAAA,GAAAA,MAAA,gBAAAkD,EAAAlD,CAAsB,mBAAAkD,EAAAuO,kBAItBzR,MAAA,GAAAA,MAAA,oBAAAkD,EAAAsO,kBAAAxR,CAAuC,wBAAAA,MAAA,+BAG3BA,MAAA,GAAAA,MAAA,UAAAA,MAAA,mBAAAA,CAAmC,sBAM/CA,MAAA,GAAAA,MAAA,UAAAA,MAAA,2BAAAA,CAA2C,qBAA3CA,CAA2C,OAAAkD,EAAAu4B,MAAA16B,IAAA,cAS3Cf,MAAA,GAAAA,MAAA,UAAAA,MAAA,2BAAAA,CAA2C,qBAA3CA,CAA2C,OAAAkD,EAAAu4B,MAAA16B,IAAA,cAS3Cf,MAAA,GAAAA,MAAA,UAAAA,MAAA,yBAAAA,CAAyC,qBAAzCA,CAAyC,OAAAkD,EAAAu4B,MAAA16B,IAAA,aASzCf,MAAA,GAAAA,MAAA,UAAAA,MAAA,qBAAAA,CAAqC,cAArCA,CAAqC,OAAAkD,EAAAu4B,MAAA16B,IAAA,SA0BzBf,MAAA,GAAAA,MAAA,UAAAA,MAAA,4BAcAA,MAAA,GAAAA,MAAA,UAAAA,MAAA,qBAAAA,CAAqC,OAAAkD,EAAAu4B,MAAA16B,IAAA,SAKrCf,MAAA,GAAAA,MAAA,UAAAA,MAAA,4BAUAA,MAAA,GAAAA,MAAA,UAAAA,MAAA,8BAAAA,CAA8C,eAalCA,MAAA,GAAAA,MAAA,UAAAkD,EAAAgE,yCAOhClH,MAAA,GACIA,MAAA,iDACJA,+BAD6BA,MAAA,GAAAA,MAAA,eAAAA,MAAA,IAAAw8B,EAAAC,iDAD7Bz8B,MAAA,EAAA08B,GAAA,8DAAe18B,MAAA,OAAAA,MAAA,IAAAM,EAAAm8B,uFCtIjB,MAAOE,WACDC,MAsCRljC,YAAsBC,EAAkCiK,GACpDC,QADkBjK,KAAAD,cAAkCC,KAAAgK,sBA/BxDhK,KAAAy8B,YAAwB,GACfz8B,KAAAsN,aAAetN,KAAKsK,qBAAqB,cACzCtK,KAAAisB,QAAUjsB,KAAKijC,yBACnBC,cACAC,iBACAhM,UAAU,CACPv0B,KAAM,OACN8X,SAAOzO,KAAE,eACTwO,KAAM,CAAE2oB,KAAM,QACdC,YAAa,SAEhBlM,UAAU,CACPv0B,KAAM,aACN6X,KAAM,CAAE2oB,KAAM,WACd1oB,SAAOzO,KAAE,qBACTq3B,cAAeh8B,KACX4yB,UAAW,CAAEqJ,IAAKj8B,OAGzBk8B,sBAAsBxjC,KAAKsN,cAC3Bm2B,eAAezjC,KAAK0J,OAChB1J,KAAA6hC,MAAQ7hC,KAAK0jC,uBACjBC,YAAY,WAAY,OACxBC,QAAQ,CAAEhhC,KAAM,cAChBghC,QAAQ,CAAEhhC,KAAM,cAChBghC,QAAQ,CAAEhhC,KAAM,SAChBghC,QAAQ,CAAEhhC,KAAM,SAChBghC,QAAQ,CAAEhhC,KAAM,aAChBihC,oBAAoB7jC,KAAKsN,cACzBm2B,eAAezjC,KAAK0J,OAIrBO,MAAM65B,UAAU,CACZC,SAAUC,MACVC,SAAU7jC,GAAQA,EAAK29B,YACvBmG,aAAcA,CAACtkB,EAAMukB,KACjB,MAAMvG,EAC+B,KAAjC59B,KAAK4X,kBAAkBtQ,OAAsD,IAAtCtH,KAAKisB,QAAQqD,cAAcjuB,aAE5D+d,EACV,MAAO,CACH3c,QAAS,CACLmd,OACAvU,KAAM84B,EACNjjC,OAAQ,CACJ0B,KAAM,CAAEkd,SAAU9f,KAAK4X,kBAAkBtQ,UACtCtH,KAAKisB,QAAQmY,qBAEpBxG,eACA7d,KAAM/f,KAAK6hC,MAAMwC,qBAI7BC,qBAAsB,CAACtkC,KAAKisB,QAAQ7b,aAAcpQ,KAAK6hC,MAAMzxB,eAErE,CAEA7F,WACIN,MAAMM,WACNvK,KAAK6iC,oBAAsB7iC,KAAK0J,MAAM4O,SAAS/X,QAC3CoB,KAAIy3B,GAAMA,EAAGjyB,IAAI,cAAW,EAC5BokB,QAEJ,MAAMkS,EAAez9B,KAAK0J,MAAM2hB,cAAc9qB,QAC1CoB,KAAI2pB,GAAOA,EAAInkB,IAAI,cAAW,EAC9BokB,QAAoB,EACpB5pB,KAAIilB,GAAQA,EAAMA,EAAIlS,MAAM,KAAO,KAEvC+oB,EAAal9B,QAAKmgB,MAAU1gB,KAAK2gB,WAAW9U,UAAU+a,IAClD5mB,KAAKy8B,YAAc7V,IAEvB5mB,KAAKm+B,mBAAkBjzB,KAAcuyB,EAAcz9B,KAAKoY,UAAU7X,QAC9DqF,KAAU,EAAEghB,KACJA,EAAIvlB,OACGrB,KAAKD,YAAYosB,WACnBwR,eAAe,CACZtyB,KAAM,IACNnK,OAAQ,CACJ6qB,SAAU,CAAEhE,GAAInB,MAGvBzK,UAAU/b,GAAQA,EAAK29B,YAAYz9B,QAAK,EAEtC2B,MAAG,MAKtBjC,KAAKukC,0BAAyBr5B,KAC1BlL,KAAK6iC,oBACL7iC,KAAKyhB,OACLzhB,KAAKm+B,iBACP59B,QACEoB,KAAI,EAAEI,EAAIg8B,EAAa7K,MACnB,GAAInxB,EAAI,CACJ,MAAMyiC,EAAQ,IAAIzG,KAAgB7K,GAAgBxwB,KAAKS,GAAKA,EAAEpB,KAAOA,GACrE,OAAOyiC,EAAQA,EAAM5hC,KAAO,GAEhC,MAAO,MAGf5C,KAAK2iC,0BAAyBz3B,KAC1BlL,KAAK6iC,oBACL7iC,KAAKyhB,OACLzhB,KAAKm+B,iBACP59B,QACEoB,KAAI,EAAEI,EAAIg8B,EAAa7K,MACnB,GAAInxB,EAAI,CACJ,MAAMoxB,EAAqC,GAC3C,UAAWhH,KAAc4R,EAAa,CAClC5K,EAAe1uB,KAAK0nB,GACpB,MAAMiH,EAAuBF,EAAehyB,OACxCiC,GAAKA,EAAE4oB,UAAY5oB,EAAE4oB,WAAaI,EAAWpqB,IAEjDoxB,EAAe1uB,QAAQ2uB,GAE3B,OAAOD,EAAeiB,UAAUjxB,GAAKA,EAAEpB,KAAOA,GAElD,OAAO,IAGnB,CAEAigC,YAAYpuB,GACR5T,KAAKD,YAAYosB,WAAWwT,eAAe,CAAC/rB,IAAQ/H,UAAU,CAC1DoO,KAAMA,KACFja,KAAKgK,oBAAoBgC,WAAQC,KAAE,gCACnCjM,KAAK4gB,SAAO,EAEhBzU,MAAOD,IACHlM,KAAKgK,oBAAoBmC,SAAMF,KAAE,oCAAmC,GAGhF,CAEAw4B,gBACI,MAAMtnB,EAAS,IAAKnd,KAAK0J,MAAMe,SAAS0S,eACjCA,EAAOunB,SACd1kC,KAAK2J,OAAOsjB,SAAS,CAAC,KAAM9P,GAAS,CAAE+P,WAAYltB,KAAK0J,MAAO2jB,oBAAqB,YACxF,CAEA3e,YAAYtL,GACRpD,KAAKD,YAAYsmB,OAAOse,mBAAmBvhC,GAAMyI,WACrD,CAEAywB,eAAenQ,GACX,IAAIsQ,EAAcz8B,KAAKy8B,YAClBA,EAAYh3B,SAAS0mB,EAAWpqB,IAGjC06B,EAAcA,EAAYv7B,OAAOa,GAAMA,IAAOoqB,EAAWpqB,IAFzD06B,EAAYh4B,KAAK0nB,EAAWpqB,IAIhC/B,KAAK2J,OAAOsjB,SAAS,CAAC,MAAO,CACzBE,YAAa,CACTyX,SAAUnI,EAAYv7B,OAAOa,KAAQA,GAAI2B,KAAK,MAElD2pB,oBAAqB,QACrBH,WAAYltB,KAAK0J,OAEzB,gBAxKSq5B,4CAAuB38B,MAAAC,OAAAD,MAAAC,OAAA,2BAAvB08B,GAAuB70B,UAAA,0BAAAC,SAAA,CAAA/H,OAAAgI,MAAA,GAAAC,KAAA,GAAAC,OAAA,0xDAAAC,SAAA,SAAAC,EAAAC,GAAA,EAAAD,IDrBpCpI,MAAA,mBAAAA,CAAgB,mBAAhBA,CAAgB,gBAAhBA,CAAgB,6BAMAA,MAAA,8BAAA6B,GAAA,OAAsBwG,EAAAC,YAAAzG,EAAmB,qCAC5C7B,UAELA,MAAA,kBACIA,MAAA,4BACAA,MAAA,EAAAy+B,GAAA,WAQJz+B,YAGRA,MAAA,sBAA+DA,MAAA,iCAAgBqI,EAAAg2B,eAAe,qBAC1Fr+B,MAAA,GAAA0+B,GAAA,uBAmIA1+B,MAAA,GAAA2+B,GAAA,uCAKJ3+B,eA3JgBA,MAAA,GAAAA,MAAA,yBAAAA,MAAA,IAAAqI,EAAAI,qBAAAzI,CAAsD,sBAAAA,MAAA,IAAAqI,EAAAu2B,mBASrD5+B,MAAA,GAAAA,MAAA,mBAAAA,MAAA,GAAAmrB,KASDnrB,MAAA,GAAAA,MAAA,iBAAAA,MAAA,KAAAqI,EAAAo0B,sBAoImBz8B,MAAA,GAAAA,MAAA,iBAAAA,MAAA,MAAAqI,EAAA81B,s5BE9I7B,MAAOU,GASTnlC,cARQE,KAAAklC,iBAAqF,GAErFllC,KAAAmlC,YAAc,IAAI9sB,KAClBrY,KAAAolC,SAAW,IAAI/sB,KAMnBrY,KAAKqlC,WAAarlC,KAAKmlC,YAAYvZ,eACnC5rB,KAAKslC,QAAUtlC,KAAKolC,SAASxZ,cACjC,CAEApN,cACIxe,KAAKmlC,YAAYrY,WACjB9sB,KAAKolC,SAAStY,UAClB,CAEAyY,kBAAkBC,GACdxlC,KAAKylC,eAAiBD,CAC1B,CAEAE,gBACI1lC,KAAKklC,iBAAmB,EAC5B,CAEAS,iBAAiBxZ,GACb,OAAqC,IAAjCnsB,KAAKklC,iBAAiB7jC,SACtBrB,KAAKklC,iBAAmBllC,KAAK4lC,6BAE1B5lC,KAAKklC,iBAAiBhkC,OACzBgV,GACIA,EAAKnU,KAAOoqB,EAAWpqB,KACtBmU,EAAK2vB,eAAeC,IAAI3Z,EAAWpqB,KACpCmU,EAAKnU,KAAOoqB,EAAWtT,QAAQ9W,GAE3C,CAEAgyB,OAAOngB,GACH,MAAMsC,EAAOtC,EAAMsC,KAAK9V,KAElB2lC,EADYnyB,EAAM4Q,UAAUpkB,KACJ2B,GAC9B,GAAmB,MAAfgkC,EACA,MAAM,IAAIljC,MAAM,qDAEpB7C,KAAKmlC,YAAYlrB,KAAK,CAClB0S,aAAczW,EAAKnU,GACnBgqB,SAAUga,EACVxjC,MAAOqR,EAAM0gB,cAErB,CAEA0R,OAAOpyB,GACH5T,KAAKmlC,YAAYlrB,KAAKrG,EAC1B,CAEAqyB,SAASlkC,GACL/B,KAAKolC,SAASnrB,KAAKlY,EACvB,CAEQ6jC,4BACJ,MAAMM,EAAQA,CACVC,EACAC,EACAP,EACAhM,KAEA,MAAMvd,EAAO8pB,EAAWniB,OAAOkiB,EAAKvjC,MACpCi3B,SAAOp1B,KAAK,CAAE6X,KAAMA,EAAKuH,MAAM,GAAGngB,KAAK,QAAU,OAAQ3B,GAAIokC,EAAKpkC,GAAI8jC,mBACtEM,EAAKxpB,SAAS0W,QAAQgT,GAClBH,EAAMG,EAAO/pB,EAAM,IAAIgqB,IAAY,IAAIT,EAAgBM,EAAKpkC,KAAM83B,IAE/DA,GAEX,OAAOqM,EAAMlmC,KAAKylC,eAAgB,GAAI,IAAIa,IAAe,GAC7D,wBCrDgBlgC,MAAA,uCACAA,MAAA,0DAPJA,MAAA,eAIIA,MAAA,mBAAAA,MAAAg2B,GAAA,MAAAmK,EAAAngC,QAAA+B,UAAAsd,EAAArf,QAAA,OAASA,MAAAqf,EAAA6W,eAAAiK,GAA0B,GAEnCngC,MAAA,EAAAogC,GAAA,mBACApgC,MAAA,EAAAqgC,GAAA,mBACJrgC,oDANIA,MAAA,WAAA2I,EAAA23B,WAI0BtgC,MAAA,GAAAA,MAAA,QAAAmgC,EAAA3B,WAAA71B,EAAA23B,WACKtgC,MAAA,GAAAA,MAAA,OAAAmgC,EAAA3B,UAAA71B,EAAA23B,kCAG/BtgC,MAAA,mCAKRA,MAAA,cAAuCA,MAAA,wBAAmCA,eAAnCA,MAAA,GAAAA,YAAA,gDAavCA,MAAA,YACIA,MAAA,iBACJA,aD/CC6+B,2CAAqB,6BAArBA,GAAqB3+B,QAArB2+B,GAAqB1+B,uHCqDdH,MAAA,UAKIA,MAAA,iBACAA,MAAA,wBACJA,wCALIA,MAAA,aAAAA,MAAA,EAAAsb,GAAAtb,MAAA,EAAA2Y,GAAAwnB,EAAAxkC,MAIAqE,MAAA,GAAAA,MAAA,IAAAA,MAAA,oFAwBJA,MAAA,eAIIA,MAAA,yBAAAugC,EAAAvgC,MAAAmc,GAAApa,UAAAo+B,EAAAngC,QAAA+B,UAAA24B,EAAA16B,QAAA,OAASA,MAAA06B,EAAA8F,KAAAL,EAAAI,EAAA5kC,IAAyB,oBAGlCqE,MAAA,WAAAA,CAA0B,YAElBA,MAAA,iBACJA,QACAA,MAAA,YACIA,MAAA,GACJA,mDARJA,MAAA,YAAAA,MAAA,IAAAgf,EAAAyhB,uBAOQzgC,MAAA,GAAAA,MAAA,IAAAugC,EAAArqB,KAAA,+BAiBxBlW,MAAA,0EAEIA,MAAA,YAAAsL,EAAAg1B,UAAAtgC,CAAuB,iBAAAmgC,EAAvBngC,CAAuB,qBAAAsL,EAAAo1B,mBAAvB1gC,CAAuB,mBAAAsL,EAAAmG,0SAtH/BzR,MAAA,UAAAA,CAMC,UANDA,CAMC,QANDA,CAMC,aAWeA,MAAA,iBAAA6B,GAAA,MAAAs+B,EAAAngC,MAAA8B,GAAAC,UAAAC,EAAAhC,QAAA,OAASA,MAAAgC,EAAAyP,iBAAAkvB,gBAAAR,EAAAt+B,GAAoD,GAJjE7B,UAOJA,MAAA,WACIA,MAAA,EAAA4gC,GAAA,gBASA5gC,MAAA,EAAA6gC,GAAA,yBAAA7gC,OAGAA,MAAA,GACJA,QACAA,MAAA,WACAA,MAAA,GAAA8gC,GAAA,mBACA9gC,MAAA,WAKIA,MAAA,kBACAA,MAAA,0BACJA,QACAA,MAAA,WACIA,MAAA,kBACAA,MAAA,0BACJA,QACAA,MAAA,GAAA+gC,GAAA,cAGA/gC,MAAA,kBAAAA,CAAc,gBACqCA,MAAA,yBAAAmgC,EAAAngC,MAAA8B,GAAAC,UAAAknB,EAAAjpB,QAAA,OAASA,MAAAipB,EAAAsW,iBAAAY,GAA4B,GAChFngC,MAAA,kBACJA,QACAA,MAAA,2BACIA,MAAA,GAAAghC,GAAA,YAQAhhC,MAAA,aACAA,MAAA,gBAIIA,MAAA,yBAAAihC,EAAAjhC,MAAA8B,GAAAq+B,EAAAc,EAAAl/B,UAAAm/B,EAAAD,EAAA9kC,MAAA2sB,EAAA9oB,QAAA,OAASA,MAAA8oB,EAAAqY,OAAAhB,EAAAe,GAAqB,qBAE9BlhC,MAAA,kBACAA,MAAA,0BACJA,QACAA,MAAA,gBAMIA,MAAA,yBAAAihC,EAAAjhC,MAAA8B,GAAAq+B,EAAAc,EAAAl/B,UAAAm/B,EAAAD,EAAA9kC,MAAAgU,EAAAnQ,QAAA,OAASA,MAAAmQ,EAAAixB,SAAAjB,EAAAe,GAAuB,qBAEhClhC,MAAA,kBACAA,MAAA,0BACJA,QACAA,MAAA,YAA4BA,MAAA,0BAAmCA,QAC/DA,MAAA,GAAAqhC,GAAA,iBAgBArhC,MAAA,aACAA,MAAA,gBAGIA,MAAA,yBAAAmgC,EAAAngC,MAAA8B,GAAAC,UAAAu/B,EAAAthC,QAAA,OAASA,MAAAshC,EAAAC,OAAApB,EAAAxkC,IAAqB,qBAG9BqE,MAAA,kBACAA,MAAA,0BACJA,cAIZA,MAAA,GAAAwhC,GAAA,mCAOJxhC,mEAzHIA,MAAA,UAAAmgC,EAAArM,WAGA9zB,MAAA,cAAAmgC,GAKIngC,MAAA,GAAAA,MAAA,SAAAmgC,EAAAxkC,KAAAuH,EAAAw9B,oBADA1gC,MAAA,mBAAAkD,EAAAu+B,OAOQzhC,MAAA,GAAAA,MAAA,UAAAkD,EAAAuO,iBAAAuZ,WAAAmV,IAQCngC,MAAA,GAAAA,MAAA,aAAAmgC,EAAA5pB,SAAA,KAAA4pB,EAAA5pB,SAAAtb,OAAA+E,CAAmC,WAAA0hC,GASxC1hC,MAAA,GAAAA,MAAA,IAAAmgC,EAAA3jC,KAAA,KAGOwD,MAAA,GAAAA,MAAA,OAAAmgC,EAAArM,WAGP9zB,MAAA,GAAAA,MAAA,aAAAA,MAAA,GAAAmrB,GAAAnrB,MAAA,GAAAmqB,GAAAgW,EAAAxkC,MAIAqE,MAAA,GAAAA,MAAA,IAAAA,MAAA,oCAE2BA,MAAA,GAAAA,MAAA,aAAAA,MAAA,GAAAurB,GAAA4U,EAAAxkC,KAE3BqE,MAAA,GAAAA,MAAA,IAAAA,MAAA,0BAEoCA,MAAA,GAAAA,MAAA,mBAAAA,MAAA,GAAAmsB,KAW3BnsB,MAAA,GAAAA,MAAA,mBAAAA,MAAA,GAAA2hC,KASD3hC,MAAA,GAAAA,MAAA,eAAAkhC,IAAAlhC,MAAA,MAAAkD,EAAAu9B,uBAIAzgC,MAAA,GAAAA,MAAA,IAAAA,MAAA,8BAKAA,MAAA,GAAAA,MAAA,WAAAkhC,IAAAh+B,EAAAm8B,eAAA9oB,SAAAtb,OAAA,IAAA+E,MAAA,MAAAkD,EAAAu9B,uBAMAzgC,MAAA,GAAAA,MAAA,IAAAA,MAAA,gCAEwBA,MAAA,GAAAA,YAAA,0BAIPA,MAAA,GAAAA,MAAA,UAAAkD,EAAA0+B,eAkBjB5hC,MAAA,GAAAA,MAAA,YAAAA,MAAA,MAAAkD,EAAA2+B,uBAGA7hC,MAAA,GAAAA,MAAA,IAAAA,MAAA,4BAMXA,MAAA,GAAAA,MAAA,OAAAmgC,EAAA3B,UAAAt7B,EAAAo9B,YCjGP,MAAOwB,GAYTpoC,YACoC+Y,EACxB9Y,EACAooC,EACAx+B,EACAD,EACA2f,GALwBrpB,KAAA6Y,SACxB7Y,KAAAD,cACAC,KAAAmoC,wBACAnoC,KAAA2J,SACA3J,KAAA0J,QACA1J,KAAAqpB,oBAjBZrpB,KAAA6nC,MAAQ,EAIC7nC,KAAA0mC,WAAY,EAIrB1mC,KAAAgoC,cAAqD,GAW7CnvB,IACA7Y,KAAK6nC,MAAQhvB,EAAOgvB,MAAQ,EAEpC,CAEAt9B,WACIvK,KAAKooC,WAAapoC,KAAKylC,eAAe7iC,MAAQ,SAC9C,MAAMylC,EAAeroC,KAAKD,YAAYsmB,OACjCC,aACAnK,UAAU/b,GAAQA,EAAKkmB,WAAWgiB,aAClC/nC,QAAKC,MAAY,IACtBR,KAAK6mC,qBAAuBwB,EAAa9nC,QACrCoB,KACI4mC,GACIA,EAAM9iC,SAAS0E,MAAWC,gBAAkBm+B,EAAM9iC,SAAS0E,MAAWiuB,oBAGlFp4B,KAAKioC,qBAAuBI,EAAa9nC,QACrCoB,KACI4mC,GACIA,EAAM9iC,SAAS0E,MAAW40B,gBAAkBwJ,EAAM9iC,SAAS0E,MAAW20B,oBAGlF9+B,KAAK2pB,aAAe3pB,KAAK6X,kBAAkB2wB,kBAAkB38B,UAAU,IACnE7L,KAAKqpB,kBAAkBtd,eAE/B,CAEA0gB,YAAYC,GACR,MAAM+b,EAAkB/b,EAAQga,UAC5B+B,IACsC,IAAlCA,EAAgBC,gBAA2D,IAAjCD,EAAgB7b,cAC1D5sB,KAAKylC,eAAe9oB,SAAS0W,QAAQlwB,GAAMA,EAAEyhC,UAAW,EAGpE,CAEApmB,cACIxe,KAAK2pB,cAAcC,aACvB,CAEAiM,UAAUtzB,EAAe2T,GACrB,OAAOA,EAAKnU,EAChB,CAEAu6B,eAAenQ,GACXA,EAAWyY,UAAYzY,EAAWyY,SAClC,IAAInI,EAAcz8B,KAAK0J,MAAMe,SAAS4gB,cAAclkB,IAAI,aAAauN,MAAM,MAAQ,GAC/EyX,EAAWyY,SACXnI,EAAYh4B,KAAK0nB,EAAWpqB,IAE5B06B,EAAcA,EAAYv7B,OAAOa,GAAMA,IAAOoqB,EAAWpqB,IAE7D/B,KAAK2J,OAAOsjB,SAAS,CAAC,MAAO,CACzBE,YAAa,CACTyX,SAAUnI,EAAYv7B,OAAOa,KAAQA,GAAI2B,KAAK,MAElD2pB,oBAAqB,QACrBH,WAAYltB,KAAK0J,OAEzB,CAEAi8B,iBAAiBxZ,GACbnsB,KAAKgoC,cAAgBhoC,KAAKmoC,sBAAsBxC,iBAAiBxZ,EACrE,CAEAya,KAAKza,EAA+BJ,GAChC/rB,KAAKmoC,sBAAsBnC,OAAO,CAC9BzjC,MAAO,EACPwpB,WACAY,aAAcR,EAAWpqB,IAEjC,CAEAwlC,OAAOpb,EAA+BmI,GAC7BnI,EAAWtT,QAGhB7Y,KAAKmoC,sBAAsBnC,OAAO,CAC9BzjC,MAAO+xB,EAAe,EACtBvI,SAAUI,EAAWtT,OAAO9W,GAC5B4qB,aAAcR,EAAWpqB,IAEjC,CAEAylC,SAASrb,EAA+BmI,GAC/BnI,EAAWtT,QAGhB7Y,KAAKmoC,sBAAsBnC,OAAO,CAC9BzjC,MAAO+xB,EAAe,EACtBvI,SAAUI,EAAWtT,OAAO9W,GAC5B4qB,aAAcR,EAAWpqB,IAEjC,CAEA4mC,KAAK/0B,IACD0Q,QAAgBtkB,KAAKylC,eAAe9oB,SAAU/I,EAAM4gB,cAAe5gB,EAAM0gB,cACzEt0B,KAAKmoC,sBAAsBpU,OAAOngB,EACtC,CAEA+zB,OAAO5lC,GACH/B,KAAKmoC,sBAAsBlC,SAASlkC,EACxC,EC/IE,SAAU6mC,GACZC,EACAC,EACArM,EAAwB,IAExB,MAAMsM,EAAoC,GACpCC,EAA2C,GAC3CC,EAsCV,SAASC,GAA+B1D,GACpC,MAAM2D,EAAU,IAAIC,IACpB,SAASlD,EAAMC,GACXgD,EAAQ5O,IAAI4L,EAAKpkC,GAAIokC,GACrBA,EAAKxpB,SAAS0W,QAAQ6S,EAC1B,CACA,OAAIV,GACAU,EAAMV,GAEH2D,CACX,CAhD4BD,CAAUJ,GAGlC,UAAW3C,KAAQ0C,EACfG,EAAU7C,EAAKpkC,IAAM,IAAMokC,EAAcxpB,SAAU,IAGvD,UAAW5a,KAAM8mC,EAAMlnC,IAAIyrB,GAAKA,EAAErrB,IAC9B,GAAIinC,EAAUK,eAAetnC,GAAK,CAC9B,MAAMunC,EAAaN,EAAUjnC,GAC7BunC,EAAW1E,SAAWqE,EAAgB9hC,IAAIpF,IAAK6iC,UAAYnI,EAAYh3B,SAAS1D,GAChF,MAAM8W,EAASywB,EAAWzwB,OAC1B,IAAKA,EACD,SAGkBmwB,EAAUnwB,EAAO9W,IAE/BinC,EAAUnwB,EAAO9W,IACjBinC,EAAUnwB,EAAO9W,IAAI4a,SAASlY,KAAK6kC,GAEnCN,EAAUnwB,EAAO9W,IAAM,CAAE4a,SAAU,CAAC2sB,IAGxCP,EAActkC,KAAK6kC,GAM/B,MAAO,CAAEvnC,GADMgnC,EAAc1nC,OAAS0nC,EAAc,GAAGlwB,OAAQ9W,QAAKqd,EAC/CzC,SAAUosB,EACnC,oCC9CA3iC,MAAA,qDAGIA,MAAA,YAAAQ,EAAA8/B,UAAAtgC,CAAuB,iBAAAQ,EAAA6+B,eAAvBr/B,CAAuB,mBAAAQ,EAAAiR,iBAAvBzR,CAAuB,qBAAAQ,EAAAkgC,yBFyBdoB,4CAA2B9hC,MAAA8hC,GAAA,IAAA9hC,MAAAC,OAAAD,MAAA2H,IAAA3H,MAAA4H,MAAA5H,MAAA4H,MAAA5H,aAAA,2BAA3B8hC,GAA2Bh6B,UAAA,+BAAAwxB,OAAA,CAAA+F,eAAA,iBAAAqB,mBAAA,qBAAAJ,UAAA,YAAA7uB,iBAAA,oBAAA1J,SAAA,CAAA/H,OAAAgI,MAAA,EAAAC,KAAA,EAAAC,OAAA,8sDAAAC,SAAA,SAAAC,EAAAC,GAAA,EAAAD,ID5BxCpI,MAAA,aAMIA,MAAA,8BAAA6B,GAAA,OAAsBwG,EAAAk6B,KAAA1gC,EAAY,oBAElC7B,MAAA,EAAAmjC,GAAA,eA4HJnjC,eAhIIA,MAAA,kBAAAqI,EAAAg3B,eAAAr/B,CAAkC,uBAAAA,MAAA,IAAAqI,EAAAo4B,uBAOPzgC,MAAA,GAAAA,MAAA,UAAAqI,EAAAg3B,eAAA9oB,SAAAvW,CAA4B,eAAAqI,EAAAonB,gHCiB9CqS,GAA2BsB,KAAAC,MAAAC,OAAA,m5EAAAC,gBAAA,IGLlC,MAAOC,GAUT9pC,YAAoBqoC,GAAAnoC,KAAAmoC,wBAPXnoC,KAAA0mC,WAAY,EACZ1mC,KAAAy8B,YAAwB,GAEvBz8B,KAAA6pC,UAAY,IAAIl3B,MAChB3S,KAAA8pC,iBAAmB,IAAIn3B,KAGkC,CAEnE8Z,YAAYC,GACJ,gBAAiBA,GAAW1sB,KAAK+9B,cACjC/9B,KAAKylC,eAAiBmD,GAAY5oC,KAAK+9B,YAAa/9B,KAAKylC,eAAgBzlC,KAAKy8B,aAC9Ez8B,KAAKmoC,sBAAsB5C,kBAAkBvlC,KAAKylC,gBAClDzlC,KAAKmoC,sBAAsBzC,gBAEnC,CAEAn7B,WACIvK,KAAKmoC,sBAAsB9C,WAAWx5B,UAAU+H,GAAS5T,KAAK6pC,UAAU51B,KAAKL,IAC7E5T,KAAKmoC,sBAAsB7C,QAAQz5B,UAAU9J,GAAM/B,KAAK8pC,iBAAiB71B,KAAKlS,GAClF,yBC7CAqE,MAAA,8BAAAA,MAAA,IAAAA,MAAA,yFAIAA,MAAA,QAAqCA,MAAA,GAAsCA,kCAAtCA,MAAA,GAAAA,MAAA,GAAA2jC,EAAAnnC,KAAA,KAAAmnC,EAAAnmC,IAAA,+CAGrCwC,MAAA,cAAkCA,MAAA,mBAAAA,MAAA0hC,GAAA,MAAA/4B,EAAA3I,QAAA,OAASA,MAAA2I,EAAAD,SAAQ,GAAE1I,MAAA,wBAAiCA,QACtFA,MAAA,cAAsBA,MAAA,mBAAAA,MAAA0hC,GAAA,MAAA/3B,EAAA3J,QAAA,OAASA,MAAA2J,EAAAf,UAAS,GACpC5I,MAAA,wBACJA,cAHqDA,MAAA,GAAAA,YAAA,sBAEjDA,MAAA,GAAAA,MAAA,IAAAA,MAAA,gCDaKwjC,4CAAuBxjC,MAAAC,IAAA,2BAAvBujC,GAAuB17B,UAAA,0BAAAwxB,OAAA,CAAA3B,YAAA,cAAA+I,mBAAA,qBAAAJ,UAAA,YAAAjK,YAAA,cAAA5kB,iBAAA,oBAAAmyB,QAAA,CAAAH,UAAA,YAAAC,iBAAA,oBAAA37B,SAAA,CAAA/H,MAFrB,CAAC6+B,KAAsB7+B,OAAAgI,MAAA,EAAAC,KAAA,EAAAC,OAAA,yMAAAC,SAAA,SAAAC,EAAAC,GAAA,EAAAD,GDrBtCpI,MAAA,EAAA6jC,GAAA,uCACK7jC,MAAA,OAAAqI,EAAAg3B,iEGQC,MAAOyE,GANbpqC,cAQIE,KAAAkC,SAA8E,GAE9E8M,UACIhP,KAAKwP,aAAY,EACrB,CAEAV,SACI9O,KAAKwP,aACT,MAVS06B,2CAAqC,2BAArCA,GAAqCh8B,UAAA,0CAAAE,MAAA,EAAAC,KAAA,EAAAC,OAAA,4JAAAC,SAAA,SAAAC,EAAAC,GAAA,EAAAD,IDTlDpI,MAAA,EAAA+jC,GAAA,qBAGA/jC,MAAA,wBACAA,MAAA,QACIA,MAAA,EAAAgkC,GAAA,YACJhkC,QACAA,MAAA,EAAAikC,GAAA,4BAJAjkC,MAAA,GAAAA,MAAA,KAAAA,MAAA,8DAE4BA,MAAA,GAAAA,MAAA,UAAAqI,EAAAvM,uIEQhBkE,MAAA,eAGIA,MAAA,mBAAAA,MAAAub,GAAA,MAAA7Y,EAAA1C,QAAA,OAASA,MAAA0C,EAAAitB,SAAQ,GAGjB3vB,MAAA,wBACJA,gCAHIA,MAAA,WAAAQ,EAAAC,WAAAE,SAAAH,EAAAC,WAAAC,UAEAV,MAAA,GAAAA,MAAA,IAAAA,MAAA,oEAGAA,MAAA,eAGIA,MAAA,mBAAAA,MAAAwiB,GAAA,MAAAkO,EAAA1wB,MAAA,UAASA,MAAA0wB,EAAAnwB,OAAM,GAGfP,MAAA,wBACJA,iCAHIA,MAAA,WAAAsL,EAAA7K,WAAAE,SAAA2K,EAAA7K,WAAAC,UAEAV,MAAA,GAAAA,MAAA,IAAAA,MAAA,oDANJA,MAAA,EAAAkkC,GAAA,sCACKlkC,MAAA,mBAAAM,EAAAU,0CAyBOhB,MAAA,GAAoEA,MAAA,wBAElEA,eAFkEA,MAAA,GAAAA,YAAA,+CAG9CA,MAAA,8BAAAA,YAAA,iDAMlCA,MAAA,iDAAwDA,MAAA,SAAAmkC,8BAyB5DnkC,MAAA,sCACIA,MAAA,0DAMJA,8BAPUA,MAAA,QAAAA,MAAA,6BAGFA,MAAA,GAAAA,MAAA,eAAAiL,EAAA/D,aAAAlH,CAA6B,wBAAAiL,EAAAxK,WAAAM,IAAA,sBAA7Bf,CAA6B,YAAAA,MAAA,IAAAiL,EAAAjK,8CAkB7BhB,MAAA,0DAGIA,MAAA,cAAAwB,EAAA4iC,cAAApkC,CAA6B,cAAAA,MAAA,uDAWrBA,MAAA,GACIA,MAAA,QAAIA,MAAA,wBAAwCA,QAChDA,eADQA,MAAA,GAAAA,YAAA,gHAkCRA,MAAA,WACIA,MAAA,0DASJA,mDAPQA,MAAA,GAAAA,MAAA,eAAAsc,EAAA+nB,kBAAArkC,CAAkC,aAAlCA,CAAkC,wBAAAsc,EAAA7b,WAAAM,IAAAf,MAAA,EAAA2Y,GAAA2rB,EAAA3oC,KAAlCqE,CAAkC,YAAAA,MAAA,IAAAsc,EAAAtb,sGA/B9ChB,MAAA,UAAAA,CAaC,WAEOA,MAAA,wBACJA,QACAA,MAAA,UAAAA,CAAyB,cAKjBA,MAAA,iBAAA6B,GAAA,MAAAyiC,EAAAtkC,MAAAs6B,GAAAv4B,UAAAob,EAAAnd,MAAA,UAASA,MAAAmd,EAAAonB,gBAAAD,EAAAtnC,KAAA6E,EAAA1I,OAAA+H,MAAAojC,EAAA3oC,IAA0D,4BAJvEqE,UAOJA,MAAA,WACIA,MAAA,cACJA,QACAA,MAAA,EAAAwkC,GAAA,aAWAxkC,MAAA,UAAAA,CAAyB,kBAAzBA,CAAyB,gBAGbA,MAAA,kBACJA,QACAA,MAAA,0BAAAA,CAA8C,gBAItCA,MAAA,yBAAAskC,EAAAtkC,MAAAs6B,GAAAv4B,UAAA+mB,EAAA9oB,MAAA,UAASA,MAAA8oB,EAAA2b,iBAAAH,EAAA3oC,IAA0B,6BAInCqE,MAAA,kBACAA,MAAA,0BACJA,uDA1CZA,MAAA,YAAA06B,EAAAj6B,WAAAM,IAAAf,MAAA,GAAAsb,GAAAgpB,EAAA3oC,MAGqBqE,MAAA,GAAAA,MAAA,SAAAskC,GAMbtkC,MAAA,GAAAA,MAAA,YAAAA,MAAA,IAAA06B,EAAA15B,mBAOMhB,MAAA,GAAAA,MAAA,OAAA06B,EAAA2J,kBAAAppC,QAqBE+E,MAAA,GAAAA,MAAA,YAAAA,MAAA,KAAA06B,EAAA15B,mBAIAhB,MAAA,GAAAA,MAAA,IAAAA,MAAA,kJAnEhCA,MAAA,GACIA,MAAA,aAAAA,CAA8D,UAA9DA,CAA8D,QAGlDA,MAAA,QACAA,MAAA,QAAIA,MAAA,wBAA+BA,QACnCA,MAAA,QAAIA,MAAA,yBAA+BA,QACnCA,MAAA,GAAA0kC,GAAA,uBAGA1kC,MAAA,SACJA,UAEJA,MAAA,YACIA,MAAA,GAAA2kC,GAAA,oCA2DJ3kC,UAEJA,MAAA,YAAAA,CAAgC,qCAGxBA,MAAA,8BAAA6B,GAAA7B,MAAA2c,GAAA,MAAAxM,EAAAnQ,MAAA,UAAAA,MAAAmQ,EAAAxN,aAAAd,EAAA,GACH7B,QACDA,MAAA,iCAIIA,MAAA,sBAAA6B,GAAA7B,MAAA2c,GAAA,MAAAG,EAAA9c,MAAA,UAAAA,MAAA8c,EAAA5a,YAAAL,EAAA,GACH7B,UAETA,0CAlFoBA,MAAA,GAAAA,YAAA,oBACAA,MAAA,GAAAA,YAAA,sBACWA,MAAA,GAAAA,MAAA,OAAAkP,EAAAm1B,kBAAAppC,QAW7B+E,MAAA,GAAAA,MAAA,UAAAA,MAAA,MAAA4kC,EAAA5kC,MAAA,GAAAmqB,GAAAjb,EAAAhN,YAAAgN,EAAAvM,aAAAiiC,EAAA3pC,UA2DU+E,MAAA,GAAAA,MAAA,eAAAkP,EAAAvM,cAIA3C,MAAA,GAAAA,MAAA,cAAAkP,EAAAhN,YAAAlC,CAA2B,eAAAkP,EAAAvM,aAA3B3C,CAA2B,aAAA4kC,EAAA3pC,kDAQnC+E,MAAA,eAIIA,MAAA,mBAAAA,MAAA6kC,GAAA,MAAA90B,EAAA/P,MAAA,UAASA,MAAA+P,EAAA+0B,gBAAe,GAExB9kC,MAAA,iBACAA,MAAA,wBACJA,cADIA,MAAA,GAAAA,MAAA,IAAAA,MAAA,0HA7GZA,MAAA,sCAKIA,MAAA,EAAA+kC,GAAA,sBAQA/kC,MAAA,EAAAglC,GAAA,0CAwFAhlC,MAAA,SACIA,MAAA,EAAAilC,GAAA,iBASJjlC,gCA7GAA,MAAA,QAAAA,MAAA,4BAAAA,CAA4C,eAW7BA,MAAA,GAAAA,MAAA,OAAAA,MAAA,IAAAY,EAAAskC,kBA4FNllC,MAAA,GAAAA,MAAA,mBAAAA,MAAA,EAAAmrB,MCtKlB,MAAMga,GAAqBvtB;;;;;;MAM5BwtB;EAWA,MAAOC,WACDrtB,MA4BRte,YACYiK,EACEhK,EACF+J,EACAE,EACAyN,GAERxN,QANQjK,KAAA+J,iBACE/J,KAAAD,cACFC,KAAA8J,cACA9J,KAAAgK,sBACAhK,KAAAyX,eA9BHzX,KAAAsN,aAAetN,KAAKsK,qBAAqB,SACzCtK,KAAAyqC,kBAAoBzqC,KAAKsK,qBAAqB,cACvDtK,KAAA6G,WAAa7G,KAAK8J,YAAYc,MAAM,CAChC8gC,MAAO1rC,KAAK8J,YAAYc,MAAM,CAC1BxH,KAAM,CAAC,GAAI+L,KAAWC,UACtBxM,KAAM,GACNs1B,SAAS,EACT5qB,aAActN,KAAK8J,YAAYc,SAAM2T,OAAwBve,KAAKsN,iBAEtElM,OAAQpB,KAAK8J,YAAYmG,OAOvB,MAENjQ,KAAAsI,YAAc,EACdtI,KAAA+I,aAAe,GACf/I,KAAAwqC,cAAgB,IAAIr6B,KAAY,IAChCnQ,KAAA2rC,QAAU,IAAIxsB,IAA6B,IAC3Cnf,KAAAsrC,gBAAkB,IAAIM,KACb5rC,KAAAoH,iBAAmB,CAAC+C,MAAWC,cAAeD,MAAW0hC,YAUlE,CAEAthC,WACIvK,KAAK+K,OACL/K,KAAKsrC,mBAAkBpgC,KAAc,CACjClL,KAAK2rC,QACL3rC,KAAKwqC,cAAcp6B,aAAa7P,QAAKuY,KAAU,OAChDvY,QACCoB,KAAI,EAAEP,EAAQ4qB,MACV,MAAM8f,EAAe9f,GAAY/S,cAAcrE,OAC/C,OAAOk3B,EACD1qC,EAAOF,OACHiB,GACIA,EAAES,KAAKqW,cAAcxT,SAASqmC,IAC9B3pC,EAAEiB,KAAK6V,cAAcxT,SAASqmC,IAEtC1qC,KACT,EACDuJ,KAAI,KACA3K,KAAKsI,YAAc,IAG/B,CAEAkW,cACIxe,KAAKye,SACT,CAEApP,WAAW08B,EAAqBxS,GAC5B,IAAKwS,EAAa,CACd,MAAMx8B,EAAcvP,KAAK6G,WAAWM,IAAI,CAAC,QAAS,SAC9CoI,GAAeA,EAAYzI,UAC3ByI,EAAYzB,YAASzK,KAAgBk2B,EAAW,MAG5D,CAEAoR,gBAAgBoB,EAAqBxS,EAAmByS,GACpD,IAAKD,EAAa,CACd,MAAMx8B,EAAcvP,KAAK6G,WAAWM,IAAI,CAAC,SAAU6kC,EAAS,SACxDz8B,GAAeA,EAAYzI,UAC3ByI,EAAYzB,YAASzK,KAAgBk2B,EAAW,MAG5D,CAEA0S,sBAAsB1pC,EAAeK,GACjC,QAAS5C,KAAK6G,WAAWM,IAAI,CAAC,SAAU5E,EAAO,eAAgBK,GACnE,CAEAsoC,gBACI,MAAMgB,EAAmBlsC,KAAK6G,WAAWM,IAAI,UAC7C,GAAI+kC,EAAkB,CAClB,MAAMnqC,EAAK/B,KAAKmsC,eACVC,EAAapsC,KAAK8J,YAAYc,MAAM,CACtC7I,KACAa,KAAM,CAAC,GAAIuM,KAAWC,UACtBhM,KAAM,GACNkK,aAActN,KAAK8J,YAAYc,MAAM,MAEnCyhC,EAAgB,CAAEtqC,KAAIa,KAAM,GAAIQ,KAAM,IAC5C,GAAIpD,KAAKyqC,kBAAkBppC,OAAQ,CAC/B,MAAMoM,EAAyB,IAAI5C,KAAiB,IACpDwhC,EAAS/+B,aAAe,GAExB,UAAWg/B,KAAYtsC,KAAKyqC,kBAAmB,CAC3C,MAAMt2B,EAAMm4B,EAAS1pC,KACrB6K,EAAuBN,WAAWgH,EAAK,IAAI+R,MAG/CkmB,EAAWj/B,WAAW,eAAgBM,GAE1Cy+B,EAAiB/+B,WAAWpL,EAAIqqC,GAChC,MAAMhrC,EAASpB,KAAK2rC,QAAQrkC,MACtBilC,EAAiBvsC,KAAKsI,YAActI,KAAK+I,aAAe,EAC9D3H,EAAOmzB,OAAOgY,EAAgB,EAAGF,GACjCrsC,KAAK2rC,QAAQ1xB,KAAK7Y,GAE1B,CAEA20B,SACI,MAAMyW,EAAYxsC,KAAK6G,WAAWM,IAAI,SACtC,IAAKqlC,IAAcA,EAAUjhC,MACzB,OAEJ,MAAMkhC,EAAWzsC,KAAK0sC,gBAClB,CACI3qC,GAAI,GACJyF,UAAW,GACXE,UAAW,GACXwyB,WAAW,EACXt5B,aAAcZ,KAAKY,aACnBgC,KAAM,GACNQ,KAAM,GACNE,aAAc,GACdlC,OAAQ,IAEZorC,EACAxsC,KAAKY,cAETZ,KAAKD,YAAY2rC,MAAMiB,YAAYF,GAAU5gC,UACzCzL,IACIJ,KAAKgK,oBAAoBgC,WAAQC,KAAE,gCAAiC,CAAEvB,OAAQ,UAC9E1K,KAAK6G,WAAWiF,iBAChB9L,KAAK+J,eAAegC,eACpB/L,KAAK2J,OAAOsjB,SAAS,CAAC,MAAO7sB,EAAKusC,YAAY5qC,IAAK,CAAEmrB,WAAYltB,KAAK0J,OAAO,EAEjFwC,IACIlM,KAAKgK,oBAAoBmC,SAAMF,KAAE,8BAA+B,CAC5DvB,OAAQ,SACX,EAGb,CAEA/D,OACI,MAAMulC,EAAmBlsC,KAAK6G,WAAWM,IACrC,WAEJ+D,OAAclL,KAAKmL,QAASnL,KAAKoL,eAC5B7K,QACG8K,KAAK,IAAC,EACN5J,KAAS,EAAEiqC,EAAO9qC,MACd,MAAM4rC,EAAYxsC,KAAK6G,WAAWM,IAC9B,SAEE9C,EAA2C,GAEjD,GAAImoC,GAAaA,EAAUjhC,MAAO,CAC9B,MAAMkhC,EAAWzsC,KAAK0sC,gBAClBhB,EACAc,EACA5rC,GAEA6rC,GACApoC,EAAiBI,KAAKzE,KAAKD,YAAY2rC,MAAMkB,YAAYH,IAGjE,GAAIP,GAAoBA,EAAiB3gC,MAAO,CAC5C,MAAMshC,EAAgB7sC,KAAK8sC,sBACvBpB,EACAQ,EACAtrC,GAEAisC,EAAcxrC,QACdgD,EAAiBI,KACbzE,KAAKD,YAAY2rC,MAAMqB,kBAAkBF,GAAetsC,QACpDqF,KACI,IACI5F,KAAKD,YAAY0pB,MAAMujB,MAAwB,CAC3CjrC,GAAI/B,KAAK+B,KACVkE,WAKvB,MAAMgnC,EAAgBjtC,KAAKktC,sBACvBxB,EACAQ,EACAtrC,GAEAqsC,EAAc5rC,QACdgD,EAAiBI,KAAKzE,KAAKD,YAAY2rC,MAAMyB,kBAAkBF,IAIvE,SAAOzrC,MAAS6C,EAAgB,IAGvCwH,UACG,KACI7L,KAAK6G,WAAWiF,iBAChB9L,KAAK+J,eAAegC,eACpB/L,KAAKgK,oBAAoBgC,WAAQC,KAAE,gCAAiC,CAAEvB,OAAQ,SAAS,EAE3FwB,IACIlM,KAAKgK,oBAAoBmC,SAAMF,KAAE,8BAA+B,CAC5DvB,OAAQ,SACX,EAGjB,CAEAmgC,iBAAiBhhB,GACb,GAAI7pB,KAAKotC,SAASvjB,GAAlB,CAEI,MAAMqiB,EAAmBlsC,KAAK6G,WAAWM,IAAI,UACzC+kC,GACAA,EAAiBmB,cAAcxjB,GAEnC,MAAMzoB,EAASpB,KAAK2rC,QAAQrkC,MAC5BtH,KAAK2rC,QAAQ1xB,KAAK7Y,EAAOF,OAAOiB,GAAKA,EAAEJ,KAAO8nB,SAGlD7pB,KAAKqhB,mBAAmBwI,GACnBtpB,QACGqF,KAAUyV,GACFA,EAASxV,SAAWC,MAAeC,QAC5B,EAAC,GAED/F,KAAKqhB,mBAAmBwI,EAAcxO,EAASlV,SAAW,IAAI5F,QACjEoB,KAAI2f,GAAKA,EAAEzb,SAAWC,MAAeC,YAGhD,EACDH,KAAU0nC,GACNA,EACMttC,KAAKD,YAAY0pB,MAAMujB,MAAwB,CAC3CjrC,GAAI/B,KAAK+B,KACVkE,QACH,KAGb4F,UACG,KACI,MAAMqgC,EAAmBlsC,KAAK6G,WAAWM,IAAI,UACzC+kC,GACAA,EAAiBmB,cAAcxjB,GAEnC7pB,KAAKgK,oBAAoBgC,WAAQC,KAAE,gCAAiC,CAChEvB,OAAQ,cACX,EAELwB,IACIlM,KAAKgK,oBAAoBmC,SAAMF,KAAE,8BAA+B,CAC5DvB,OAAQ,cACX,EAGjB,CAEQ2W,mBAAmBwI,EAAsB1jB,GAC7C,OAAOnG,KAAKyX,aACP0C,OAAO,CACJC,SAAOnO,KAAE,sCACToO,KAAMlU,EACNqU,QAAS,CACL,CAAEC,KAAM,YAAaC,SAAOzO,KAAE,kBAC9B,CAAEwO,KAAM,SAAUC,SAAOzO,KAAE,iBAAkB0O,aAAa,MAGjEpa,QACGqF,KAAUC,GACNA,EAAS7F,KAAKD,YAAY2rC,MAAM6B,kBAAkB,CAAC1jB,KAAiB1jB,GAAW6T,MAAK,EAExFrY,KAAIkE,GAAUA,EAAO0nC,kBAAkB,IAEnD,CAKU5gC,cAAc++B,EAAgC9qC,GACpD,MAAM4M,KAAqB7I,OAAgB+mC,EAAO9qC,GAElDZ,KAAK6G,WAAW6zB,WAAW,CACvBgR,MAAO,CACHtoC,KAAMsoC,EAAMtoC,KACZ80B,SAAUwT,EAAMxR,UAChBt3B,KAAM4K,GAAoB5K,MAAQ,MAItC5C,KAAKsN,aAAajM,QAClBrB,KAAK4N,yBACD5N,KAAKsN,aACLtN,KAAK6G,WAAWM,IAAI,CAAC,QAAS,iBAC9BukC,EACAl+B,GAIR,MAAMggC,EAAyBxtC,KAAK6G,WAAWM,IAAI,UACnDnH,KAAK2rC,QAAQ1xB,KAAK,IAAIyxB,EAAMtqC,SAC5BsqC,EAAMtqC,OAAOiyB,QAAQ/rB,IACjB,MAAMmmC,KAAmB9oC,OAAgB2C,EAAO1G,GAC1CgK,EAAQ,CACV7I,GAAIuF,EAAMvF,GACVqB,KAAMkE,EAAMlE,KACZR,KAAM6qC,EAAmBA,EAAiB7qC,KAAO,IAErD,IAAI8qC,EAAeF,EAAuBrmC,IAAIG,EAAMvF,IASpD,GARI2rC,GACAA,EAAavmC,IAAI,OAAO2G,SAASlD,EAAM7I,IACvC2rC,EAAavmC,IAAI,SAAS2G,SAASlD,EAAMxH,MACzCsqC,EAAavmC,IAAI,SAAS2G,SAASlD,EAAMhI,QAEzC8qC,EAAe1tC,KAAK8J,YAAYc,MAAMA,GACtC4iC,EAAuBrgC,WAAW7F,EAAMvF,GAAI2rC,IAE5C1tC,KAAKyqC,kBAAkBppC,OAAQ,CAC/B,IAAIoM,EAAyBigC,EAAavmC,IAAI,CAAC,iBAQ/C,GALKsG,IACDA,EAAyB,IAAI5C,KAAiB,IAC9C6iC,EAAavgC,WAAW,eAAgBM,IAGxCA,EACA,UAAW6+B,KAAYtsC,KAAKyqC,kBAAmB,CAC3C,MAAMt2B,EAAMm4B,EAAS1pC,KACf+qC,EACgB,iBAAlBrB,EAAS7xB,KACFgzB,GAAsCngC,eAAe6G,GACrD7M,EAAcgG,aAAa6G,GAChCtG,EAAUJ,EAAuBtG,IAAIgN,GACvCtG,EACAA,EAAQC,SAAS6/B,GAEjBlgC,EAAuBN,WAAWgH,EAAK,IAAI+R,KAAmBynB,OAMtF,CAMQjB,gBACJhB,EACAkC,EACAhtC,GAEA,MAAMF,KAAQ2L,OAA0B,CACpCC,aAAco/B,EACdn/B,cAAeqhC,EAAetmC,MAC9BkF,kBAAmBxM,KAAKsN,aACxB1M,eACA6L,mBAAoB,CAChB7L,eACAgC,KAAM8oC,EAAM9oC,MAAQ,MAG5BlC,SAAMw5B,WAAa0T,EAAetmC,MAAM4wB,QACjCx3B,CACX,CAMQosC,sBACJpB,EACAQ,EACAtrC,GAEA,OAAOyP,OAAOjP,OAAO8qC,EAAiBlhC,UACjC9J,OAAOiC,GAAKA,EAAEmE,MAAMvF,IAAM/B,KAAKotC,SAASjqC,EAAEmE,MAAMvF,KAChDJ,IAAIwB,GAAKA,EAAEmE,OACX3F,IAAI2F,MACD+E,OAA0B,CACtBC,aAAc,IAAKhF,EAAOhE,aAAc,IACxCiJ,cAAejF,GAAS,GACxBkF,kBAAmBxM,KAAKyqC,kBACxB7pC,eACA6L,mBAAoB,CAChB7L,eACAgC,KAAM,OAIjBjB,IAAIjB,KACDmtC,QAASnC,EAAM3pC,GACfqB,KAAM1C,EAAM0C,MAAQ,MACjB1C,EACHqB,QAAIqd,IAEhB,CAMQ8tB,sBACJxB,EACAoC,EACAltC,GAEA,MAAMmtC,EAAcrC,EAAMtqC,OAAOF,OAAOiB,IACpC,MAAM6rC,EAAUF,EAAgB3mC,IAAIhF,EAAEJ,IACtC,OAAOisC,GAAWA,EAAQziC,OAASyiC,EAAQ1mC,MAAMvF,KAE/CksC,EAAmB59B,OAAOjP,OAAO0sC,EAAgB9iC,UAClD9J,OAAOiC,GAAKA,EAAEoI,QAAUvL,KAAKotC,SAASjqC,EAAEmE,MAAMvF,KAC9CJ,IAAIwB,GAAKA,EAAEmE,OAEhB,GAAIymC,EAAY1sC,SAAW4sC,EAAiB5sC,OACxC,MAAM,IAAIwB,SAAMoJ,KAAE,+CAEtB,OAAO8hC,EACFpsC,IAAI,CAAC2F,EAAOrC,OACToH,OAA0B,CACtBC,aAAchF,EACdiF,cAAe0hC,EAAiBhpC,GAChCuH,kBAAmBxM,KAAKyqC,kBACxB7pC,eACA6L,mBAAoB,CAChB7L,eACAgC,KAAM,OAIjB1B,OAAOuC,sBAChB,CAEQ0oC,eACJ,MAAO,QAAQ+B,KAAKC,SAASC,SAAS,IAAIxuC,OAAO,EAAG,IACxD,CAEQwtC,SAASrrC,GACb,OAAOA,EAAGssC,WAAW,QACzB,MApcS5C,4CAAoBrlC,mBAAAC,OAAAD,MAAA2H,MAAA3H,MAAAC,OAAAD,MAAAC,OAAA,2BAApBolC,GAAoBv9B,UAAA,uBAAAC,SAAA,CAAA/H,OAAAgI,MAAA,GAAAC,KAAA,GAAAC,OAAA,w7DAAAC,SAAA,SAAAC,EAAAC,MAAA,EAAAD,IDrDjCpI,MAAA,mBAAAA,CAAgB,mBAAhBA,CAAgB,gBAAhBA,CAAgB,6BAOAA,MAAA,8BAAA6B,GAAA,OAAsBwG,EAAAC,YAAAzG,EAAmB,sDAC5C7B,UAGLA,MAAA,kBACIA,MAAA,4BACAA,MAAA,EAAAkoC,GAAA,kCAQAloC,MAAA,GAAAmoC,GAAA,yBAAAnoC,OAUJA,YAGRA,MAAA,YAAAA,CAA4C,4BAA5CA,CAA4C,+BAA5CA,CAA4C,cAA5CA,CAA4C,6CAKxBA,MAAA,yBACIA,MAAA,wCAOAA,MAAA,cACIA,MAAA,GAAAooC,GAAA,sBAGApoC,MAAA,GAAAqoC,GAAA,0BAAAroC,OACJA,cAIZA,MAAA,eACIA,MAAA,GAAAsoC,GAAA,iDACJtoC,UAEJA,MAAA,oBAAAA,CAAgB,gBAAhBA,CAAgB,YAAhBA,CAAgB,8CAIAA,MAAA,eAKIA,MAAA,iBAAA6B,GAAA,OAASwG,EAAAY,WAAA,MAAAZ,EAAA/D,OAAA,KAAA+D,EAAA/D,OAAAtH,KAAA6E,EAAA1I,OAAA+H,MAA6C,6BAL1DlB,UAQJA,MAAA,8CACIA,MAAA,yCAMJA,YAGRA,MAAA,GAAAuoC,GAAA,mBASAvoC,MAAA,0CAMAA,MAAA,GAAAwoC,GAAA,qCAiHJxoC,gDA9MQA,MAAA,GAAAA,MAAA,WAAAA,MAAA,KAAAqI,EAAAqtB,QAAA11B,CAA2B,yBAAAA,MAAA,KAAAqI,EAAAI,qBAA3BzI,CAA2B,sBAAAA,MAAA,KAAAqI,EAAArD,gBAW1BhF,MAAA,GAAAA,MAAA,OAAAA,MAAA,MAAAqI,EAAAqtB,QAAA11B,CAAsB,WAAA4O,GAmBpB5O,MAAA,GAAAA,MAAA,YAAAqI,EAAA5H,YAIaT,MAAA,GAAAA,MAAA,QAAAA,MAAA,6BAKJA,MAAA,GAAAA,MAAA,eAAAA,MAAA,MAAAqI,EAAArH,mBAKehB,MAAA,GAAAA,MAAA,aAAAqI,EAAA5H,WAAAS,MAAAokC,MAAA,KAAAj9B,EAAA5H,WAAAS,MAAAokC,MAAAxT,QAAA9xB,CAAuC,WAAA21B,GAS3C31B,MAAA,GAAAA,MAAA,OAAAA,MAAA,MAAAqI,EAAAtD,UAMH/E,MAAA,GAAAA,MAAA,QAAAA,MAAA,sBAKRA,MAAA,GAAAA,MAAA,YAAAA,MAAA,MAAAqI,EAAArH,mBAIQhB,MAAA,GAAAA,MAAA,QAAAA,MAAA,sBAIRA,MAAA,GAAAA,MAAA,YAAAA,MAAA,MAAAqI,EAAArH,mBAMwChB,MAAA,GAAAA,MAAA,OAAAqI,EAAAnB,aAAAjM,QAWpD+E,MAAA,GAAAA,MAAA,UAAAqI,EAAAtD,QAAA/E,CAAmB,aAAAqI,EAAA5H,YAKlBT,MAAA,GAAAA,MAAA,QAAAA,MAAA,MAAAqI,EAAAqtB,4gBE3EV,MAAM+S,MAAyBnQ,OAA4D,CAC9FC,SAAU,aACVC,mBAAoBC,GAChBA,EAAgBp5B,SAAS0E,MAAW2kC,cACpCjQ,EAAgBp5B,SAAS0E,MAAW40B,eACxCC,YAAa9oB,GAAQA,EAAKtT,KAC1BmsC,gBAAiBA,CAAC1zB,EAAUnF,MAAWmF,EAASlV,QAChD84B,WAAYA,CAACl/B,EAAa6mB,EAAKooB,IAC3BjvC,EAAY2rC,MAAMuD,aAAaroB,EAAKooB,GAAUzuC,QAAKoB,KAAI6f,GAAOA,EAAIytB,iBAG7DC,MAAkCrP,OAE7C,CACElB,SAAU,aACVC,mBAAoBC,GAChBA,EAAgBp5B,SAAS0E,MAAWC,gBACpCy0B,EAAgBp5B,SAAS0E,MAAW0hC,aACxC7M,YAAa9oB,GAAQA,EAAKtT,KAC1Bk9B,oBAAqBA,CAAC//B,EAAaovC,EAAU/nB,IACzCrnB,EAAY2rC,MACP0D,sBAAsB,CACnBD,WACA/nB,cAEH7mB,QAAKoB,KAAI6f,GAAOA,EAAI4tB,0BAGpBC,MAAoCnP,OAG/C,CACEvB,SAAU,aACVC,mBAAoBC,GAChBA,EAAgBp5B,SAAS0E,MAAW40B,gBACpCF,EAAgBp5B,SAAS0E,MAAW2kC,aACxC9P,YAAa9oB,GAAQA,EAAKtT,KAC1Bu9B,sBAAuBA,CAACpgC,EAAaovC,EAAU/nB,EAAW4nB,IACtDjvC,EAAY2rC,MACP4D,wBAAwB,CACrBloB,UAAWA,EACX+nB,WACAr0B,MAAOk0B,IAEVzuC,QAAKoB,KAAI6f,GAAOA,EAAI8tB,0BAC7BC,cAAe1pC,GAAiC,oBAAtBA,EAAOkV,WAAmClV,EAAOM,aAAUiZ,IAG5EowB,GAGT,CACA7Q,SAAU,aACVjkB,SAAOzO,KAAE,+BACTwjC,mBAAoBA,EAAGje,eAAQ,EAAOke,OAA6Ble,EAASrqB,IAAI+V,QAChFkiB,KAAM,SACNuQ,UAAW,aACX/Q,mBAAoBC,GAChBA,EAAgBp5B,SAAS0E,MAAW0hC,cACpChN,EAAgBp5B,SAAS0E,MAAWC,eACxCwlC,UAAWA,EAAGpe,eAAQ,EAAOqe,OAA2Bre,EAASrqB,IAAI+V,QACrEmiB,QAASA,EAAG7N,WAAUiE,YAAW6J,gBAAeC,qBAC5C,MAAM9nB,EAAe+Z,EAASrqB,IAAIq4B,OAC5Bz/B,EAAcyxB,EAASrqB,IAAI+V,OAC3BlT,EAAsBwnB,EAASrqB,IAAIs4B,OAEnCrZ,EAAmBrmB,EAAYsmB,OAChCC,aACAnmB,UAAU,EAAGmmB,gBAAiBA,EAAWC,iBAE9C,SAASlF,EAAmB8tB,EAAoBhpC,GAC5C,OAAOsR,EACF0C,OAAO,CACJC,SAAOnO,KAAE,+BACTqO,gBAAiB,CACbC,MAAOkb,EAAUp0B,QAErB2iB,KAAM7d,EAAU,KAAO,KACvBkU,KAAMlU,EACNqU,QAAS,CACL,CAAEC,KAAM,YAAaC,SAAOzO,KAAE,kBAC9B,CACIwO,KAAM,SACNC,MAAOvU,KAAU8F,KAAE,wBAAqB,EAAIA,KAAE,iBAC9C0O,aAAa,MAIxBpa,QACGqF,KAAU4b,GACNA,EACM4E,EAAiB7lB,QACbqF,KAAU2gB,GACNA,EACMxmB,EAAY2rC,MAAM4D,wBAAwB,CACtCloB,UAAWb,EACX4oB,WACAr0B,QAAS3U,IAEb6T,MAAK,EAEfrY,KAAImuC,GAAQA,EAAKR,0BAErBt1B,KAGtB,CAEAqH,KAAmB5M,KAAOghB,EAAU9zB,IAAI03B,GAAKA,EAAEt3B,MAC1CxB,QACGqF,KAAUC,IACN,IAAIkqC,EAAeta,EAAUp0B,OAC7B,MAAM2uC,EAAmB,GACnBC,EAAqB,GAC3B,IAAIhrC,EAAI,EACR,UAAWiR,KAAQrQ,EACS,oBAApBqQ,EAAK6E,aACLi1B,EAAOvrC,KAAKyR,EAAK/P,SACjB8pC,EAASxrC,KAAKgxB,EAAUxwB,IAAIlD,IAC5BguC,KAEJ9qC,IAEJ,OAAI,EAAIgrC,EAAS5uC,OACNggB,EAAmB4uB,EAAUD,EAAOtsC,KAAK,OAAOnD,QACnDoB,KAAIuuC,IACA,MAAMC,EAAkBD,EAAQhvC,OAC5BogB,GAAsB,oBAAjBA,EAAEvG,YACT1Z,OACF,OAAOo0B,EAAUp0B,OAAS8uC,MAC5B,EAGCluC,MAAG8tC,EAAY,IAE7B,EACDnqC,KAAUmqC,GACNA,KACML,OAA6B3vC,GAAaqwC,KAAK,EAAGC,kBAAW,CACzDA,cACAN,kBAEJ/1B,MAGbnO,UAAU,EAAGkkC,eAAcM,kBACpBN,IACAzQ,EAAc1e,UACd2e,IACAv1B,EAAoBgC,WAAQC,KAAE,qDAAsD,CAChFsO,MAAOw1B,EACPM,gBACH,EAER,yECtKDjqC,MAAA,UAKIA,MAAA,iBACAA,MAAA,wBACJA,eALIA,MAAA,aAAAA,MAAA,EAAA2Y,KAIA3Y,MAAA,GAAAA,MAAA,IAAAA,MAAA,+DA2BJA,MAAA,uBAAAA,MAAA,IAAAkqC,EAAAvuC,GAAA,gCASAqE,MAAA,8CAAAA,MAAA,IAAAA,MAAA,IAAAmqC,EAAA/oC,UAAA,yCASApB,MAAA,8CAAAA,MAAA,IAAAA,MAAA,IAAAoqC,EAAA9oC,UAAA,8EAKAtB,MAAA,SAAAA,CACK,UAAMA,MAAA,GAAgBA,QACvBA,MAAA,iBACJA,6BAHwBA,MAAA,aAAAA,MAAA,EAAAsb,GAAA+uB,EAAA1uC,KACbqE,MAAA,GAAAA,MAAAqqC,EAAA7tC,gCAOXwD,MAAA,uBAAAA,MAAA,IAAAsqC,EAAAttC,KAAA,6BAKAgD,MAAA,iBAAsDA,MAAA,wBAEpDA,eAFoDA,MAAA,GAAAA,YAAA,+CAGtDA,MAAA,iBAAuDA,MAAA,wBAErDA,eAFqDA,MAAA,GAAAA,YAAA,iDAHvDA,MAAA,EAAAuqC,GAAA,mBAGAvqC,MAAA,EAAAwqC,GAAA,wCAHWxqC,MAAA,OAAAyqC,EAAA3W,WAGA9zB,MAAA,GAAAA,MAAA,QAAAyqC,EAAA3W,qCAQP9zB,MAAA,sDAEIA,MAAA,aAAAskC,EAAAtkC,CAAoB,eAApBA,CAAoB,kDAIxBA,MAAA,cACIA,MAAA,GACJA,mCADIA,MAAA,GAAAA,MAAA,UAAA0qC,EAAAC,UAAAvwB,WAAAswB,EAAAC,UAAAzwC,MAAAe,OAAA,gCAOA+E,MAAA,GACIA,MAAA,iBACAA,MAAA,GACJA,8CADIA,MAAA,GAAAA,MAAA,IAAA0qC,EAAAC,UAAAvwB,WAAAkC,EAAAsuB,aAAA,4BAGA5qC,MAAA,0DAVRA,MAAA,eAGIA,MAAA,mBAAAA,MAAA2c,GAAA,MAAA+tB,EAAA1qC,QAAA8P,KAAAgZ,EAAA9oB,QAAA,OAASA,MAAA8oB,EAAA+hB,mBAAAH,GAAyB,GAElC1qC,MAAA,EAAA8qC,GAAA,uBAIA9qC,MAAA,EAAA+qC,GAAA,0BAAA/qC,OAGJA,0DAPmBA,MAAA,GAAAA,MAAA,QAAA06B,EAAAsQ,aAAAN,EAAA/uC,KAAA,GAAA+uC,EAAAC,UAAAzwC,MAAAe,OAAA+E,CAAoE,WAAAqc,8BAf3Frc,MAAA,YACIA,MAAA,EAAAirC,GAAA,gDAMAjrC,MAAA,EAAAkrC,GAAA,mBAGAlrC,MAAA,EAAAmrC,GAAA,iBAaJnrC,uCArB0BA,MAAA,GAAAA,MAAA,UAAAA,MAAA,IAAA0qC,EAAAC,UAAAzwC,MAAA,EAAA+Q,EAAA+/B,aAAAN,EAAA/uC,KAAA,IAKXqE,MAAA,GAAAA,MAAA,OAAAiL,EAAA+/B,aAAAN,EAAA/uC,IAAA+uC,EAAAC,UAAAvwB,aAAAnP,EAAA+/B,aAAAN,EAAA/uC,KAAA,KAAA+uC,EAAAC,UAAAzwC,MAAAe,QAKN+E,MAAA,GAAAA,MAAA,OAAA0qC,EAAAC,UAAAzwC,MAAAe,OAAAgQ,EAAA2/B,wCAcjB5qC,MAAA,uEAAsEA,MAAA,cAAAorC,EAAAprC,CAA2B,QAAAY,EAAA66B,mECtGxF4P,GAAmBzzB;;;;;;;;;MAS1B0zB;EAQA,MAAOC,WACD3O,MA+BRljC,YAAsBC,GAClBkK,QADkBjK,KAAAD,cA5BbC,KAAAgxC,aAAe,EACxBhxC,KAAAoxC,aAAyC,GAEhCpxC,KAAAsN,aAAetN,KAAKsK,qBAAqB,SACzCtK,KAAAisB,QAAUjsB,KAAKijC,yBACnBC,cACAC,iBACAhM,UAAU,CACPv0B,KAAM,aACN6X,KAAM,CAAE2oB,KAAM,WACd1oB,SAAOzO,KAAE,qBACTq3B,cAAeh8B,KACX4yB,UAAW,CAAEqJ,IAAKj8B,OAGzBk8B,sBAAsBxjC,KAAKsN,cAC3Bm2B,eAAezjC,KAAK0J,OAEhB1J,KAAA6hC,MAAQ7hC,KAAK0jC,uBACjBC,YAAY,YAAa,QACzBC,QAAQ,CAAEhhC,KAAM,OAChBghC,QAAQ,CAAEhhC,KAAM,cAChBghC,QAAQ,CAAEhhC,KAAM,cAChBghC,QAAQ,CAAEhhC,KAAM,SAChBghC,QAAQ,CAAEhhC,KAAM,SAChBihC,oBAAoB7jC,KAAKsN,cACzBm2B,eAAezjC,KAAK0J,OAIrBO,MAAM65B,UAAU,CACZC,SAAU6N,MACV3N,SAAU7jC,GAAQA,EAAKyxC,OACvB3N,aAAcA,CAACtkB,EAAMvU,MACjB5I,QAAS,CACLmd,OACAvU,OACAnK,OAAQ,CACJ0B,KAAM,CACFkd,SAAU9f,KAAK4X,kBAAkBtQ,UAElCtH,KAAKisB,QAAQmY,qBAEpBrkB,KAAM/f,KAAK6hC,MAAMwC,qBAGzBC,qBAAsB,CAACtkC,KAAKisB,QAAQ7b,aAAcpQ,KAAK6hC,MAAMzxB,eAErE,CAEA6gC,mBAAmBvF,GACX1rC,KAAKoxC,aAAa1F,EAAM3pC,MAAQ2pC,EAAMqF,UAAUzwC,MAAMe,OACtDrB,KAAKoxC,aAAa1F,EAAM3pC,IAAM/B,KAAKgxC,aAEnChxC,KAAKoxC,aAAa1F,EAAM3pC,IAAM2pC,EAAMqF,UAAUzwC,MAAMe,MAE5D,CAEAqN,YAAYtL,GACRpD,KAAKD,YAAYsmB,OAAOse,mBAAmBvhC,GAAMyI,WACrD,aAhES8lC,4CAAkBvrC,MAAAC,OAAA,2BAAlBsrC,GAAkBzjC,UAAA,qBAAAC,SAAA,CAAA/H,OAAAgI,MAAA,GAAAC,KAAA,GAAAC,OAAA,6vCAAAC,SAAA,SAAAC,EAAAC,GAAA,EAAAD,ID/B/BpI,MAAA,mBAAAA,CAAgB,mBAAhBA,CAAgB,gBAAhBA,CAAgB,6BAMAA,MAAA,8BAAA6B,GAAA,OAAsBwG,EAAAC,YAAAzG,EAAmB,qCAC5C7B,UAELA,MAAA,kBACIA,MAAA,4BACAA,MAAA,EAAA0rC,GAAA,WAQJ1rC,YAGRA,MAAA,wBAQIA,MAAA,sBAAA6B,GAAA,OAAcwG,EAAA8K,cAAAtR,EAAqB,EAAnC7B,CAAoC,8BAAA6B,GAAA,OACdwG,EAAA6K,gBAAArR,EAAuB,2EAE7C7B,MAAA,4BAAAA,CAIwB,6CAKxBA,MAAA,6CACIA,MAAA,GAAA2rC,GAAA,mBAGJ3rC,QACAA,MAAA,6CAKIA,MAAA,GAAA4rC,GAAA,mBAGJ5rC,QACAA,MAAA,6CAKIA,MAAA,GAAA6rC,GAAA,mBAGJ7rC,QACAA,MAAA,6CACIA,MAAA,GAAA8rC,GAAA,mBAMJ9rC,QACAA,MAAA,8CACIA,MAAA,GAAA+rC,GAAA,mBAGJ/rC,QACAA,MAAA,8CACIA,MAAA,GAAAgsC,GAAA,mBAQJhsC,QACAA,MAAA,8CACIA,MAAA,GAAAisC,GAAA,mBA0BJjsC,QACAA,MAAA,GAAAksC,GAAA,sCACJlsC,eAjHgBA,MAAA,GAAAA,MAAA,yBAAAA,MAAA,KAAAqI,EAAAI,qBAAAzI,CAAsD,sBAAAA,MAAA,KAAAqI,EAAAu2B,mBAUrD5+B,MAAA,GAAAA,MAAA,mBAAAA,MAAA,GAAAmqB,KAWbnqB,MAAA,GAAAA,MAAA,QAAAA,MAAA,MAAAqI,EAAAgT,QAAArb,CAAwB,eAAAA,MAAA,MAAAqI,EAAA6R,eAAxBla,CAAwB,aAAAA,MAAA,MAAAqI,EAAAyK,aAAxB9S,CAAwB,cAAAA,MAAA,MAAAqI,EAAA8R,cAAxBna,CAAwB,UAAAqI,EAAAwd,SAUpB7lB,MAAA,GAAAA,MAAA,gBAAAqI,EAAArI,CAAsB,mBAAAqI,EAAAoJ,kBAItBzR,MAAA,GAAAA,MAAA,oBAAAqI,EAAAmJ,kBAAAxR,CAAuC,wBAAAA,MAAA,iCAG3BA,MAAA,GAAAA,MAAA,UAAAA,MAAA,mBAAAA,CAAmC,qBAAnCA,CAAmC,OAAAqI,EAAAozB,MAAA16B,IAAA,OAM/Cf,MAAA,GAAAA,MAAA,UAAAA,MAAA,2BAAAA,CAA2C,qBAA3CA,CAA2C,OAAAqI,EAAAozB,MAAA16B,IAAA,cAS3Cf,MAAA,GAAAA,MAAA,UAAAA,MAAA,2BAAAA,CAA2C,qBAA3CA,CAA2C,OAAAqI,EAAAozB,MAAA16B,IAAA,cAQ/Bf,MAAA,GAAAA,MAAA,UAAAA,MAAA,qBAAAA,CAAqC,cAArCA,CAAqC,OAAAqI,EAAAozB,MAAA16B,IAAA,SAQrCf,MAAA,GAAAA,MAAA,UAAAA,MAAA,sBAKAA,MAAA,GAAAA,MAAA,UAAAA,MAAA,4BAUAA,MAAA,GAAAA,MAAA,UAAAA,MAAA,yBA4BqCA,MAAA,GAAAA,MAAA,UAAAqI,EAAAnB,wUEpHzDlH,MAAA,UAAAA,CAA8D,UAA9DA,CAA8D,WAE/CA,MAAA,wBAAkCA,QACzCA,MAAA,eAIIA,MAAA,yBAAA6B,GAAA,MAAAsqC,EAAAnsC,MAAAosC,GAAArqC,UAAA,OAAa/B,MAAAmsC,EAAA3vC,KAAAqF,EACpB,EADO7B,CAAwB,yBAAA6B,GAAA7B,MAAAosC,GAAA,MAAAzW,EAAA31B,MAAA,IAAAiL,EAAAjL,QAAA,OAGPA,MAAAiL,EAAAohC,YAAAxqC,EAAA8zB,GAA8C,GAPnE31B,UAUJA,MAAA,UAAAA,CAAoB,WACTA,MAAA,yBAAyCA,QAChDA,MAAA,kCAEIA,MAAA,yBAAA6B,GAAA,MAAAsqC,EAAAnsC,MAAAosC,GAAArqC,UAAA,OAAa/B,MAAAmsC,EAAAnxC,OAAA6G,EACpB,EADO7B,CAA0B,2BAAAA,MAAAosC,GAAA,MAAA1pC,EAAA1C,QAAA,OACTA,MAAA0C,EAAA4pC,mBAAkB,EADnCtsC,CAA0B,kBAAAA,MAAAosC,GAAA,MAAAptB,EAAAhf,QAAA,OAElBA,MAAAgf,EAAAstB,mBAAkB,GAG7BtsC,UAELA,MAAA,YAAAA,CAA0B,gBAIlBA,MAAA,yBAAAmsC,EAAAnsC,MAAAosC,GAAArqC,UAAAuJ,EAAAtL,QAAA,OAASA,MAAAsL,EAAAJ,aAAAihC,EAAA3vC,MAAwB,yBAEjCwD,MAAA,kBACJA,wCA7BOA,MAAA,GAAAA,YAAA,uBAKHA,MAAA,GAAAA,MAAA,UAAAmsC,EAAA3vC,MAOGwD,MAAA,GAAAA,YAAA,+BAGHA,MAAA,GAAAA,MAAA,UAAAmsC,EAAAnxC,OAAAgF,CAA0B,YAAAmsC,EAAA3vC,KAA1BwD,CAA0B,gBAAAmsC,EAAA3vC,MAU1BwD,MAAA,GAAAA,MAAA,QAAAA,MAAA,wDAaRA,MAAA,iBAAAA,CAA0G,mBAA1GA,CAA0G,aAG9FA,MAAA,wBACJA,mBAJ8DA,MAAA,uBAG1DA,MAAA,GAAAA,MAAA,IAAAA,MAAA,+FAQAA,MAAA,eACIA,MAAA,GACJA,kCAFgDA,MAAA,QAAAusC,EAAA5wC,IAC5CqE,MAAA,GAAAA,MAAA,IAAAusC,EAAA/vC,KAAA,+CAHZwD,MAAA,4CACIA,MAAA,eAAQA,MAAA,yBAAA6B,GAAA7B,MAAA02B,GAAA,MAAA9G,EAAA5vB,MAAA,UAAAA,MAAA4vB,EAAA4c,wBAAA3qC,EAAA,GACJ7B,MAAA,EAAAysC,GAAA,iBAGJzsC,iDAL0CA,MAAA,QAAAA,MAAA,sCAClCA,MAAA,GAAAA,MAAA,UAAAqf,EAAAmtB,yBACyBxsC,MAAA,GAAAA,MAAA,UAAA0sC,2BAWzB1sC,MAAA,QAAgCA,MAAA,wBAAiCA,eAAjCA,MAAA,GAAAA,YAAA,8CAChCA,MAAA,QAAgCA,MAAA,wBAAmCA,eAAnCA,MAAA,GAAAA,YAAA,gDAWpCA,MAAA,QACIA,MAAA,cACJA,mCACAA,MAAA,QACIA,MAAA,GACJA,wCADIA,MAAA,GAAAA,MAAA,IAAA2sC,EAAA3xC,OAAAsC,KAAA,qCATR0C,MAAA,WAKIA,MAAA,EAAA4sC,GAAA,YAGA5sC,MAAA,EAAA6sC,GAAA,YAGA7sC,MAAA,OAAAA,CAAI,oBAEIA,MAAA,mCACJA,UAEJA,MAAA,OAAAA,CAAI,oBAEIA,MAAA,2BAIJA,UAEJA,MAAA,QAAAA,CAAI,qBAEIA,MAAA,eACJA,iDAzBJA,MAAA,aAAAsc,EAAAwwB,kBAAAH,EAAAhxC,IAAAuF,MAAAqS,SACAvT,MAAA,YAAAsc,EAAAwwB,kBAAAH,EAAAhxC,KAEKqE,MAAA,GAAAA,MAAA,SAAAsc,EAAAxgB,SAAAb,QAGA+E,MAAA,GAAAA,MAAA,SAAAsc,EAAAxgB,SAAAb,QAK4C+E,MAAA,GAAAA,MAAA,cAAAA,MAAA,oBAOrCA,MAAA,GAAAA,MAAA,eAAAsc,EAAAxS,yCA/BxB9J,MAAA,WAAAA,CAAgE,aAAhEA,CAAgE,UAAhEA,CAAgE,QAIhDA,MAAA,EAAA+sC,GAAA,YACA/sC,MAAA,EAAAgtC,GAAA,YACAhtC,MAAA,QAAIA,MAAA,wBAA+BA,QACnCA,MAAA,QAAIA,MAAA,0BAAiCA,QACrCA,MAAA,SAAIA,MAAA,0BAAyCA,YAGrDA,MAAA,GAAAitC,GAAA,cA8BJjtC,iCArCiBA,MAAA,GAAAA,MAAA,SAAAwB,EAAA1F,SAAAb,QACA+E,MAAA,GAAAA,MAAA,SAAAwB,EAAA1F,SAAAb,QACD+E,MAAA,GAAAA,YAAA,oBACAA,MAAA,GAAAA,YAAA,uBACAA,MAAA,GAAAA,YAAA,gCAIYA,MAAA,GAAAA,MAAA,UAAAwB,EAAA1F,SAAAkE,CAAa,eAAAwB,EAAAiuB,sCA/BjDzvB,MAAA,GACIA,MAAA,EAAAktC,GAAA,oBAQAltC,MAAA,YACIA,MAAA,EAAAmtC,GAAA,yBAOJntC,QAEAA,MAAA,EAAAotC,GAAA,gBA2CJptC,6BA7DgBA,MAAA,GAAAA,MAAA,WAAA0sC,EAAAzxC,QASS+E,MAAA,GAAAA,MAAA,OAAA0sC,EAAAzxC,QASU+E,MAAA,GAAAA,MAAA,SAAA0sC,EAAAzxC,SC3CnC,MAAMoyC,GAAuB,sBAmBvB,MAAOC,GAiBT5zC,YAAoBC,EAAkC+J,GAAlC9J,KAAAD,cAAkCC,KAAA8J,cAhB5C9J,KAAA2zC,eAAiB,IAAIhhC,MAE/B3S,KAAA0B,aAA0F,GAG1F1B,KAAAkzC,kBAQI,GAEJlzC,KAAA4yC,wBAAyC,IACwC,CAEjFroC,WACIvK,KAAKD,YAAYG,SAASsY,mBAAmBvS,QAAQ4F,UAAUzL,IAC3DJ,KAAKkQ,aAAe9P,EAAKqY,cAAcC,sBAE3C1Y,KAAK4zC,gBAAkB5zC,KAAKD,YACvB0pB,MAAMoqB,MAA8B,CACjCpxC,QAAS,CACL4I,KAAM,OAGbqU,yBACAvD,UAAU,EAAG23B,oBAAqBA,EAAexzC,OACjDC,QACGoK,KAAIrK,IACIA,EAAMe,SACNrB,KAAK4yC,wBAA0BtyC,EAAM,GAAGyB,OAKxD/B,KAAK0yC,kBACT,CAEAr9B,YACIrV,KAAK0B,aAAa+C,KAAK,CAAE7B,KAAM,GAAIxB,OAAQ,KAC3C,MAAMmB,EAAQvC,KAAK0B,aAAaL,OAAS,EACzC0S,WAAW,KACO/T,KAAK+zC,gBAAgB5sC,IAAI5E,IAAQoR,eACxCF,OAAK,EAEpB,CAEAnC,aAAa1O,GACT5C,KAAK0B,aAAe1B,KAAK0B,aAAaR,OAAOC,GAAKA,EAAEyB,OAASA,GAC7D5C,KAAK0yC,kBACT,CAEAA,mBAEI,MAAMzxC,EADmBjB,KAAK0B,aAAaqB,OAAO,CAACixC,EAAKppC,IAAUopC,EAAMppC,EAAMxJ,OAAOC,OAAQ,GAEvFrB,KAAK0B,aAAaC,IAAIR,GAAKA,EAAEC,OAAOO,IAAIQ,GAAKA,EAAES,OAC/C,CAAC,CAAC6wC,KACRzzC,KAAKkC,YAAW+xC,4BAAwBhzC,GAAQU,IAAIP,KAAaW,GAAIX,EAAOsC,KAAK,KAAMtC,YAEvFpB,KAAKkC,SAASmxB,QAAQ,CAACxuB,EAAStC,KAC5B,IAAKvC,KAAKkzC,kBAAkBruC,EAAQ9C,IAAK,CACrC,MAAMwL,EAAYvN,KAAK8J,YAAYoqC,YAAYtpC,MAAM,CACjDvI,aAAc,CAACwC,EAAQzD,QACvBuY,SAAS,EACThW,MAAO3D,KAAKm0C,gBAAgBtvC,EAAQ9C,GAAI,QAAS,GACjD6B,IAAK5D,KAAKm0C,gBAAgBtvC,EAAQ9C,GAAI,MAAO,IAC7CgC,MAAO/D,KAAKm0C,gBAAgBtvC,EAAQ9C,GAAI,QAAS,KAErDwL,EAAU6C,aAAavE,UAAU,IAAM7L,KAAKo0C,gBAC9B,IAAV7xC,IACAgL,EAAUpG,IAAI,UAAUiJ,aAAavE,UAAUvE,IAC3CtH,KAAKq0C,qBAAqB,QAAS9mC,EAAUpG,IAAI,SAAQ,GAE7DoG,EAAUpG,IAAI,QAAQiJ,aAAavE,UAAUvE,IACzCtH,KAAKq0C,qBAAqB,MAAO9mC,EAAUpG,IAAI,OAAM,GAEzDoG,EAAUpG,IAAI,UAAUiJ,aAAavE,UAAUvE,IAC3CtH,KAAKq0C,qBAAqB,QAAS9mC,EAAUpG,IAAI,SAAQ,IAGjEnH,KAAKkzC,kBAAkBruC,EAAQ9C,IAAMwL,IAGjD,CAEAsoB,UAAUtzB,EAAesC,GACrB,OAAOA,EAAQzD,OAAOsC,KAAK,IAC/B,CAEA+uC,YAAY7+B,EAAsB0gC,GAC9B1gC,EAAMS,iBACNT,EAAM2gC,kBACND,EAA0B7gC,OAC9B,CAEA4gC,qBAAqB1mC,EAAkC6mC,GAC9CA,GAGLnkC,OAAOjP,OAAOpB,KAAKkzC,mBAAmB7f,QAAQ9lB,IAC1C,MAAMknC,EAA2BlnC,EAAUpG,IAAIwG,GAC3C8mC,GAA4BA,EAAyB3tC,UACrD2tC,EAAyB3mC,SAAS0mC,EAAYltC,MAAO,CAAEotC,WAAW,GAAO,EAGrF,CAEAN,eACI,MAAMO,EAAmB30C,KAAKkC,SACzBP,IAAIQ,GAAKnC,KAAKkzC,kBAAkB/wC,EAAEJ,IAAIuF,OACtCpG,OAAOiB,GAAKA,EAAEwX,SACnB3Z,KAAK2zC,eAAe1/B,KAAK,CACrBhT,OAAQjB,KAAK0B,aAAaC,IAAImB,KAASF,KAAME,EAAGF,KAAMxB,OAAQ0B,EAAG1B,OAAOO,IAAIQ,GAAKA,EAAES,SACnFV,SAAUyyC,EAEVzxC,gBAAiBlD,KAAK4yC,yBAE9B,CAEQuB,gBACJ/4B,EACAw5B,EACAttC,GAEA,OAAO8T,IAAcq4B,GACdzzC,KAAKkzC,kBAAkBO,IAAsBtsC,IAAIytC,IAAOttC,MACzDA,CACV,MAnISosC,4CAAgCttC,MAAAC,OAAAD,MAAA2H,MAAA,2BAAhC2lC,GAAgCxlC,UAAA,oCAAA2G,UAAA,SAAArG,EAAAC,MAAA,EAAAD,aAEAsG,gvCDpC7C1O,MAAA,EAAAyuC,GAAA,eAkCAzuC,MAAA,cAA4BA,MAAA,0BAASqI,EAAA4G,WAAW,GAC5CjP,MAAA,gBACAA,MAAA,wBACJA,QAEAA,MAAA,EAAA0uC,GAAA,8CAvCuB1uC,MAAA,UAAAqI,EAAA/M,cAoCnB0E,MAAA,GAAAA,MAAA,IAAAA,MAAA,gCAGWA,MAAA,GAAAA,MAAA,OAAAA,MAAA,IAAAqI,EAAAmlC,kqBEvCfxtC,MAAA,mBAAAA,CAA4C,8BAIpCA,MAAA,8BAAA6B,GAAA7B,MAAAwiB,GAAA,MAAAkO,EAAA1wB,QAAA,OAAsBA,MAAA0wB,EAAApoB,YAAAzG,GAAmB,qCAC5C7B,kCAHGA,MAAA,GAAAA,MAAA,yBAAAA,MAAA,IAAAQ,EAAAiI,qBAAAzI,CAAsD,sBAAAA,MAAA,IAAAQ,EAAAo+B,6CA2BlD5+B,MAAA,uBAAAA,MAAA,IAAA2uC,EAAAhzC,GAAA,gCASAqE,MAAA,8CAAAA,MAAA,IAAAA,MAAA,IAAA4uC,EAAAxtC,UAAA,yCASApB,MAAA,8CAAAA,MAAA,IAAAA,MAAA,IAAA6uC,EAAAvtC,UAAA,yCAMItB,MAAA,yDAEIA,MAAA,MAAAA,MAAA,IAAA8uC,EAAA,QAAA9uC,+BAGAA,MAAA,YACIA,MAAA,iBACJA,mCARRA,MAAA,YACIA,MAAA,EAAA+uC,GAAA,cAIA/uC,MAAA,EAAAgvC,GAAA,0BAAAhvC,OAKJA,wCARSA,MAAA,GAAAA,MAAA,OAAAivC,EAAAxzB,cAAAzb,CAA4B,WAAA02B,iGAarC12B,MAAA,SAAAA,CAGK,UAAMA,MAAA,GAAkBA,QACxBA,MAAA,iBACHA,6BAHEA,MAAA,aAAAA,MAAA,EAAA2Y,GAAAlJ,EAAA/T,UAAA+T,EAAA9T,KACOqE,MAAA,GAAAA,MAAAyP,EAAAjT,gCAOXwD,MAAA,uBAAAA,MAAA,IAAAkvC,EAAA1xC,IAAA,6BAKAwC,MAAA,iBAAsDA,MAAA,wBAEpDA,eAFoDA,MAAA,GAAAA,YAAA,+CAGtDA,MAAA,iBAAuDA,MAAA,wBAErDA,eAFqDA,MAAA,GAAAA,YAAA,mDAHvDA,MAAA,EAAAmvC,GAAA,mBAGAnvC,MAAA,EAAAovC,GAAA,wCAHWpvC,MAAA,OAAA2sC,EAAAp5B,SAGAvT,MAAA,GAAAA,MAAA,QAAA2sC,EAAAp5B,oCAWXvT,MAAA,kDAAAA,MAAA,IAAAA,MAAA,IAAAqvC,EAAA9xC,MAAA8xC,EAAAvlC,cAAA,gCAKA9J,MAAA,kDAAAA,MAAA,IAAAA,MAAA,IAAAsvC,EAAA1+B,aAAA0+B,EAAAxlC,cAAA,gCAUc9J,MAAA,aACGA,MAAA,GAA2CA,wCAA3CA,MAAA,GAAAA,MAAA,IAAAuvC,EAAAC,eAAA,0CALjBxvC,MAAA,gBAAAA,CAAkG,WAAlGA,CAAkG,SAGtFA,MAAA,GACEA,MAAA,EAAAyvC,GAAA,eAGNzvC,sCAPiDA,MAAA,cAAAuvC,EAAAG,cAAA,KAAAH,EAAAG,cAAAlzC,MAG7CwD,MAAA,GAAAA,MAAA,IAAAuvC,EAAA7xC,YAAA,IACsBsC,MAAA,GAAAA,MAAA,OAAAuvC,EAAAC,0CAJlCxvC,MAAA,EAAA2vC,GAAA,uCAAiC3vC,MAAA,UAAA4vC,EAAAnyC,uCAYzCuC,MAAA,uEAAgEA,MAAA,cAAA6vC,EAAA7vC,CAAqB,QAAAsL,EAAAmwB,QC1GnF,MAAOqU,WACDlT,MA0DRljC,cACImK,QAvDKjK,KAAAm2C,oBAAqB,EAErBn2C,KAAAsN,aAAetN,KAAKsK,qBAAqB,kBACzCtK,KAAAisB,QAAUjsB,KAAKijC,yBACnBC,cACAC,iBACAiT,WAAW,CACR,CACIxzC,KAAM,OACN6X,KAAM,CAAE2oB,KAAM,QACd1oB,SAAOzO,KAAE,eACTo3B,YAAa,QAEjB,CACIzgC,KAAM,UACN6X,KAAM,CAAE2oB,KAAM,WACd1oB,SAAOzO,KAAE,kBACTo3B,YAAa,WAEjB,CACIzgC,KAAM,MACN6X,KAAM,CAAE2oB,KAAM,QACd1oB,SAAOzO,KAAE,eACTo3B,YAAa,OAEjB,CACIzgC,KAAM,QACN6X,KAAM,CAAE2oB,KAAM,SAAUiT,UAAW,YACnC37B,SAAOzO,KAAE,gBACTo3B,YAAa,SAEjB,CACIzgC,KAAM,eACN6X,KAAM,CAAE2oB,KAAM,SAAUiT,UAAW,YACnC37B,SAAOzO,KAAE,yBACTo3B,YAAa,kBAGpBG,sBAAsBxjC,KAAKsN,cAC3Bm2B,eAAezjC,KAAK0J,OAEhB1J,KAAA6hC,MAAQ7hC,KAAK0jC,uBACjB4S,SAAS,CACN,CAAE1zC,KAAM,MACR,CAAEA,KAAM,aACR,CAAEA,KAAM,aACR,CAAEA,KAAM,QACR,CAAEA,KAAM,OACR,CAAEA,KAAM,SACR,CAAEA,KAAM,kBAEXihC,oBAAoB7jC,KAAKsN,cACzBm2B,eAAezjC,KAAK0J,OAIrB1J,KAAK8jC,UAAU,CACXC,SAAUwS,MACVtS,SAAU7jC,GAAQA,EAAKoE,gBACvB0/B,aAAcA,CAACtkB,EAAMvU,MACjB5I,QAAS,CACLmd,OACAvU,OACAnK,OAAQ,CACJ0C,IAAK,CACDkc,SAAU9f,KAAK4X,kBAAkBtQ,UAElCtH,KAAKisB,QAAQmY,uBACZpkC,KAAK8B,UAAY,CAAEA,UAAW,CAAEyhC,GAAIvjC,KAAK8B,YAAgB,IAEjEie,KAAM/f,KAAK6hC,MAAMwC,qBAGzBC,qBAAsB,CAACtkC,KAAK6hC,MAAMzxB,aAAcpQ,KAAKisB,QAAQ7b,eAErE,MAhFS8lC,2CAA2B,2BAA3BA,GAA2BhoC,UAAA,+BAAAwxB,OAAA,CAAA59B,UAAA,YAAAq0C,mBAAA,qBAAAK,YAAA,eAAAroC,SAAA,CAAA/H,OAAAgI,MAAA,GAAAC,KAAA,GAAAC,OAAA,4tCAAAC,SAAA,SAAAC,EAAAC,GAAA,EAAAD,IDbxCpI,MAAA,EAAAqwC,GAAA,wBAOArwC,MAAA,wBAQIA,MAAA,sBAAA6B,GAAA,OAAcwG,EAAA8K,cAAAtR,EAAqB,EAAnC7B,CAAoC,8BAAA6B,GAAA,OACdwG,EAAA6K,gBAAArR,EAAuB,uEAE7C7B,MAAA,2BAAAA,CAIE,2CAKFA,MAAA,4CACIA,MAAA,GAAAswC,GAAA,mBAGJtwC,QACAA,MAAA,6CAKIA,MAAA,GAAAuwC,GAAA,mBAGJvwC,QACAA,MAAA,6CAKIA,MAAA,GAAAwwC,GAAA,mBAGJxwC,QACAA,MAAA,6CACIA,MAAA,GAAAywC,GAAA,mBAaJzwC,QACAA,MAAA,6CACIA,MAAA,GAAA0wC,GAAA,mBAQJ1wC,QACAA,MAAA,6CACIA,MAAA,GAAA2wC,GAAA,mBAGJ3wC,QACAA,MAAA,8CACIA,MAAA,GAAA4wC,GAAA,mBAQJ5wC,QACAA,MAAA,8CAKIA,MAAA,GAAA6wC,GAAA,mBAGJ7wC,QACAA,MAAA,8CACIA,MAAA,GAAA8wC,GAAA,mBAGJ9wC,QAEAA,MAAA,8CACIA,MAAA,GAAA+wC,GAAA,mBAYJ/wC,QACAA,MAAA,GAAAgxC,GAAA,sCACJhxC,eAxHiBA,MAAA,QAAAqI,EAAA0nC,oBASb/vC,MAAA,GAAAA,MAAA,KAAAqI,EAAA+nC,aAAA,uBAAApwC,CAA4C,QAAAA,MAAA,KAAAqI,EAAAgT,QAA5Crb,CAA4C,eAAAA,MAAA,KAAAqI,EAAA6R,eAA5Cla,CAA4C,aAAAA,MAAA,KAAAqI,EAAAyK,aAA5C9S,CAA4C,cAAAA,MAAA,KAAAqI,EAAA8R,cAA5Cna,CAA4C,UAAAqI,EAAAwd,SAWxC7lB,MAAA,GAAAA,MAAA,gBAAAqI,EAAArI,CAAsB,mBAAAqI,EAAAoJ,kBAItBzR,MAAA,GAAAA,MAAA,oBAAAqI,EAAAmJ,kBAAAxR,CAAuC,wBAAAA,MAAA,+BAG3BA,MAAA,GAAAA,MAAA,UAAAA,MAAA,mBAAAA,CAAmC,qBAAnCA,CAAmC,OAAAqI,EAAAozB,MAAA16B,IAAA,OAM/Cf,MAAA,GAAAA,MAAA,UAAAA,MAAA,2BAAAA,CAA2C,qBAA3CA,CAA2C,OAAAqI,EAAAozB,MAAA16B,IAAA,cAS3Cf,MAAA,GAAAA,MAAA,UAAAA,MAAA,2BAAAA,CAA2C,qBAA3CA,CAA2C,OAAAqI,EAAAozB,MAAA16B,IAAA,cAQ/Bf,MAAA,GAAAA,MAAA,UAAAA,MAAA,uBAeAA,MAAA,GAAAA,MAAA,UAAAA,MAAA,sBAAAA,CAAsC,cAAtCA,CAAsC,OAAAqI,EAAAozB,MAAA16B,IAAA,SAUtCf,MAAA,GAAAA,MAAA,UAAAA,MAAA,qBAAAA,CAAqC,OAAAqI,EAAAozB,MAAA16B,IAAA,QAKrCf,MAAA,GAAAA,MAAA,UAAAA,MAAA,yBAWZA,MAAA,GAAAA,MAAA,UAAAA,MAAA,sBAAAA,CAAsC,qBAAtCA,CAAsC,OAAAqI,EAAAozB,MAAA16B,IAAA,UAQ1Bf,MAAA,GAAAA,MAAA,UAAAA,MAAA,+BAAAA,CAA+C,OAAAqI,EAAAozB,MAAA16B,IAAA,iBAM/Cf,MAAA,GAAAA,MAAA,UAAAA,MAAA,+BAAAA,CAA+C,sBAchBA,MAAA,GAAAA,MAAA,UAAAqI,EAAAnB,q4CEzGvClH,MAAA,eAGIA,MAAA,mBAAAA,MAAAg2B,GAAA,MAAAx0B,EAAAxB,QAAA,OAASA,MAAAwB,EAAAmuB,SAAQ,GAGjB3vB,MAAA,wBACJA,gCAHIA,MAAA,WAAAQ,EAAAC,WAAAE,SAAAH,EAAAC,WAAAC,UAAA,IAAAF,EAAAjG,qBAAAuB,SAAAb,QAEA+E,MAAA,GAAAA,MAAA,IAAAA,MAAA,oEAGAA,MAAA,eAGIA,MAAA,mBAAAA,MAAA02B,GAAA,MAAA9G,EAAA5vB,MAAA,UAASA,MAAA4vB,EAAArvB,OAAM,GAGfP,MAAA,wBACJA,iCAHIA,MAAA,YAAA0B,EAAAjB,WAAAE,SAAAe,EAAAjB,WAAAC,YAAAgB,EAAAmuB,iBAEA7vB,MAAA,GAAAA,MAAA,IAAAA,MAAA,oDANJA,MAAA,EAAAixC,GAAA,sCACKjxC,MAAA,mBAAAM,EAAA0b,qFAiBDhc,MAAA,wBACIA,MAAA,cAMAA,MAAA,WAAOA,MAAA,wBAAkCA,gCAFrCA,MAAA,GAAAA,MAAA,cAAAwJ,EAAA/I,WAAAM,IAAAf,MAAA,EAAA2Y,MAEG3Y,MAAA,GAAAA,YAAA,iEAUKA,MAAA,iBAGIA,MAAA,uBAAAA,MAAAwQ,GAAA,MAAA0gC,EAAAlxC,QAAA+B,UAAAob,EAAAnd,MAAA,UAAaA,MAAAmd,EAAAg0B,kBAAAD,EAAAv1C,IAA6B,GAE1CqE,MAAA,0BACAA,MAAA,iCACJA,0CAFuBA,MAAA,GAAAA,MAAA,cAAAkxC,EAAAl0C,MACnBgD,MAAA,GAAAA,MAAA,IAAAA,MAAA,IAAAkxC,EAAAl0C,MAAA,gCAPRgD,MAAA,GACIA,MAAA,EAAAoxC,GAAA,mBAQJpxC,6CAPSA,MAAA,GAAAA,MAAA,QAAAqxC,EAAAC,iBAAAJ,EAAAl0C,iDALrBgD,MAAA,kBAAAA,CAA0C,WAA1CA,CAA0C,YAG9BA,MAAA,EAAAuxC,GAAA,wCAUJvxC,QACAA,MAAA,eAA6BA,MAAA,mBAAAA,MAAAwxC,GAAA,MAAAlQ,EAAAthC,MAAA,UAASA,MAAAshC,EAAAmQ,kBAAiB,GACnDzxC,MAAA,iBACAA,MAAA,wBACJA,qCAdsCA,MAAA,GAAAA,MAAA,UAAAA,MAAA,IAAAoc,EAAAs1B,mBAalC1xC,MAAA,GAAAA,MAAA,IAAAA,MAAA,8DAjBhBA,MAAA,sCACIA,MAAA,EAAA2xC,GAAA,wBAoBJ3xC,cArB6BA,MAAA,QAAAA,MAAA,+CADjCA,MAAA,GACIA,MAAA,EAAA4xC,GAAA,mBAsBJ5xC,mCAGQA,MAAA,iBAKIA,MAAA,GACJA,kCAJIA,MAAA,YAAA6xC,EAAA70C,KAAAgD,CAA8B,aAG9BA,MAAA,GAAAA,MAAA,IAAA6xC,EAAAr1C,KAAA,oEAIJwD,MAAA,UACIA,MAAA,iBACAA,MAAA,wBACJA,eAHGA,MAAA,aAAAA,MAAA,EAAAsb,KAECtb,MAAA,GAAAA,MAAA,IAAAA,MAAA,4DAbZA,MAAA,sCACIA,MAAA,YACIA,MAAA,EAAA8xC,GAAA,mCAOJ9xC,QACAA,MAAA,SACIA,MAAA,EAAA+xC,GAAA,YAIJ/xC,gCAf0CA,MAAA,QAAAA,MAAA,gCAGVA,MAAA,GAAAA,MAAA,UAAAA,MAAA,UAAA+C,EAAAuB,OAAA,KAAAvB,EAAAuB,OAAAhJ,aAAA,OAQ6B0E,MAAA,GAAAA,MAAA,mBAAA+C,EAAAiZ,6DAQzDhc,MAAA,6BAIIA,MAAA,0BAAAgyC,EAAAhyC,MAAAiyC,GAAAlwC,UAAAkO,EAAAjQ,QAAA,OAAUA,MAAAiQ,EAAAiiC,wBAAAF,EAAAr2C,IAAsC,4BACnDqE,8CAHGA,MAAA,aAAAgyC,EAAAhyC,CAAyB,YAAAA,MAAA,IAAA2J,EAAAqS,8DAM7Bhc,MAAA,eAGIA,MAAA,mBAAAA,MAAAmyC,GAAA,MAAAC,EAAApyC,QAAA,OAASA,MAAAoyC,EAAAC,0BAAyB,GAElCryC,MAAA,iBACAA,MAAA,wBACJA,cADIA,MAAA,GAAAA,MAAA,IAAAA,MAAA,0DAIZA,MAAA,cACIA,MAAA,6BACJA,6BAD0BA,MAAA,GAAAA,MAAA,SAAAsyC,2BAkBdtyC,MAAA,QAAAA,CAA2E,0BAEnEA,MAAA,cAMAA,MAAA,WAAOA,MAAA,wBAA4DA,mBAA5DA,MAAA,GAAAA,YAAA,4EA6B3BA,MAAA,sCACIA,MAAA,0DAMJA,8BAPUA,MAAA,QAAAA,MAAA,6BAGFA,MAAA,GAAAA,MAAA,eAAAgf,EAAA9X,aAAAlH,CAA6B,wBAAAgf,EAAAve,WAAAM,IAAA,gBAA7Bf,CAA6B,YAAAA,MAAA,IAAAgf,EAAAhD,8DAoBjChc,MAAA,QAAAA,CAA8C,sCAEtCA,MAAA,0BAAA6B,GAAA7B,MAAAuyC,GAAA,MAAAC,EAAAxyC,QAAA,OAAAA,MAAAwyC,EAAAj4C,qBAAAsH,EAAA,GACH7B,oCAGDA,MAAA,sDACIA,MAAA,YAAA2b,EAAAhgB,GAAAqE,CAAqB,gGAK7BA,MAAA,WAAAA,CAAqD,UAE7CA,MAAA,iBACAA,MAAA,wBAA2CA,iBAF7BA,MAAA,GAAAA,MAAA,aAAAA,MAAA,EAAAmqB,KAEdnqB,MAAA,GAAAA,MAAA,IAAAA,MAAA,0GCjKXyyC,GAAqB76B;;;;;;MAM5B86B;EASA,MAAOC,WACD36B,MAmBRte,YACY+J,EACAC,EACA2N,EACAzN,EACEjK,EACFgK,GAERE,QAPQjK,KAAA6J,uBACA7J,KAAA8J,cACA9J,KAAAyX,eACAzX,KAAAgK,sBACEhK,KAAAD,cACFC,KAAA+J,iBAtBH/J,KAAAsN,aAAetN,KAAKsK,qBAAqB,WAClDtK,KAAA6G,WAAa7G,KAAK8J,YAAYc,MAAM,CAChC+O,SAAS,EACT/W,KAAM,CAAC,GAAIuM,KAAWC,UACtBlF,wBAAwB,EACxB8tB,KAAM,CAAC,MAAIC,OAAwB,0BACnCb,YAAa,GACblN,cAAe,CAAC,IAChB5c,aAActN,KAAK8J,YAAYc,SAAM2T,OAAwBve,KAAKsN,iBAEtEtN,KAAAm4B,aAA+B,GAG/Bn4B,KAAAW,qBAAoD,CAAEM,OAAQ,GAAIiB,SAAU,GAAIgB,gBAAiB,IACjFlD,KAAAoiB,kBAAoB,CAACjY,MAAWC,cAAeD,MAAWE,cAW1E,CAEAE,WACIvK,KAAK+K,OAEL,MAAMiuC,EAAsBh5C,KAAK87B,OAAOv7B,QACpCqF,KAAU4P,GACCA,KAAQvT,MAAG,IAAMjC,KAAKmL,QAAQ5K,QAAKoB,KAAIb,GAAWA,EAAQkoB,gBAKnEiwB,EAFej5C,KAAK6G,WAEoBM,IAAI,iBAAkBiJ,aAAa7P,QAC7EgrB,QAAoB,EACpB3lB,KAAUghB,GACN5mB,KAAKD,YAAY2rC,MACZwN,eAAe,CAAEh4C,OAAQ,CAAEa,GAAI,CAAEgmB,GAAInB,MACrCzmB,UAAU,EAAG6oB,iBAAkBA,EAAY1oB,SAAM,EAE1DE,MAAY,IAEhBR,KAAKm5C,gBAAel1B,MAChB+0B,EAAoBz4C,QAAK8K,KAAK,IAC9B2tC,EAAoBz4C,QAAKqF,KAAU,IAAMqzC,KAE7Cj5C,KAAK83C,iBAAmB93C,KAAKmL,QAAQ5K,QAAKoB,KAAIwX,GAAKA,EAAEuN,UACzD,CAEAlI,cACIxe,KAAKye,SACT,CAEAi5B,iBAAiBrH,GACb,OAAOA,IAAgB+I,KAC3B,CAEAvB,kBACI73C,KAAK83C,iBACAv3C,QACG8K,KAAK,IAAC,EACNzF,KAAU8gB,GACN1mB,KAAKyX,aAAaqC,cAAciM,GAAwC,CACpE/B,KAAM,KACNjK,OAAQ,CACJyN,WAAY,CAACxnB,KAAK+B,IAClBsmB,kBAAmB3B,EAAS/kB,IAAIwB,GAAKA,EAAEpB,SAKtD8J,WACT,CAEA0rC,kBAAkBnwB,IACdL,WAAK2oB,OAA6B1vC,KAAKD,YAAaqnB,IAC/C7mB,QACGqF,KAAU,EAAGyqC,iBACTrwC,KAAKyX,aAAa0C,OAAO,CACrBC,SAAOnO,KAAE,uCACTuO,QAAS,CACL,CAAEC,KAAM,YAAaC,SAAOzO,KAAE,kBAC9B,CACIwO,KAAM,SACNC,SAAOzO,KAAE,+BACTqO,gBAAiB,CAAE+1B,eACnB11B,aAAa,QAGvB,EAEN/U,KAAUyV,GACNA,EACMrb,KAAKD,YAAYe,QAAQu4C,0BAA0B,CAC/CjyB,YACAI,WAAY,CAACxnB,KAAK+B,MAEtBiY,MAGbnO,UACG,KACI7L,KAAKgK,oBAAoBgC,WAAQC,KAAE,sDAAqD,EAE5FC,IACIlM,KAAKgK,oBAAoBmC,SAAMF,KAAE,oDAAmD,EAGpG,CAEAqtC,uBAAuBz0C,GACnB,OAAO7E,KAAKyX,aACPqC,cAAciM,GAAwC,CACnD/B,KAAM,KACNjK,OAAQ,CACJyN,WAAY,CAACxnB,KAAK+B,IAClBikB,kBAAmB,CAACnhB,EAAQ9C,IAC5BsmB,kBAAmBxjB,EAAQ6hB,SAAS/kB,IAAIwB,GAAKA,EAAEpB,OAGtD8J,WACT,CAEA0tC,0BAA2BnyB,YAAWviB,aAClCkiB,WAAK2oB,OAA6B1vC,KAAKD,YAAaqnB,IAC/C7mB,QACGqF,KAAU,EAAGyqC,iBACTrwC,KAAKyX,aAAa0C,OAAO,CACrBC,SAAOnO,KAAE,+CACTuO,QAAS,CACL,CAAEC,KAAM,YAAaC,SAAOzO,KAAE,kBAC9B,CACIwO,KAAM,SACNC,SAAOzO,KAAE,+BACTqO,gBAAiB,CAAE+1B,eACnB11B,aAAa,QAGvB,EAEN/U,KAAUyV,GACNA,EACMrb,KAAKD,YAAYe,QAAQ04C,0BAA0B,CAC/CpyB,YACApB,kBAAmB,CAACnhB,EAAQ9C,MAEhCiY,MAGbnO,UACG,KACI7L,KAAKgK,oBAAoBgC,WAAQC,KAAE,sDAAqD,EAE5FC,IACIlM,KAAKgK,oBAAoBmC,SAAMF,KAAE,oDAAmD,EAGpG,CAEAgqB,gBACI,QAAS5lB,OAAOjP,OAAOpB,KAAKm4B,cAAc92B,MAC9C,CAKAi4B,WAAWC,GACP,MAAMC,EAAcx5B,KAAK6G,WAAWM,IAAI,QAClCqG,EAAqBxN,KAAK0K,UAAS/F,OAAgB3E,KAAK0K,OAAQ1K,KAAKY,mBAAgBwe,EACrFqa,GAAsBjsB,IAAuBA,EAAmBwqB,KAClEwB,GAAeA,EAAY1yB,UAAY2yB,GACvCD,EAAY1rB,YAASzK,KAAgB,GAAGk2B,IAAa,KAE7D,CAEAkf,0BACIz4C,KAAKy5C,yBAAyB5tC,UAAUqe,IACpC,GAAIA,EAAe,CACf,MAAMwvB,EAAe15C,KAAK6G,WACpB8yC,EAAuBD,EAAapyC,MAAM4iB,eAAiB,GACjEwvB,EAAahf,WAAW,CACpBxQ,iBAAezV,KAAO,IAAIklC,KAAyBzvB,MAEvDwvB,EAAa/6B,cACb3e,KAAK+J,eAAegC,iBAGhC,CAEA3G,oBAAoB1E,IAChBwK,OAAclL,KAAKmL,QAASnL,KAAKoL,eAC5B7K,QACG8K,KAAK,IAAC,EACN5J,KAAS,EAAEX,EAASF,KAChBZ,KAAK6J,qBAAqBzE,oBAAoB1E,EAAOI,EAASF,KAGrEiL,UACG,KACI7L,KAAKgK,oBAAoBgC,WAAQC,KAAE,gCAAiC,CAChEvB,OAAQ,iBACX,EAELwB,IACIlM,KAAKgK,oBAAoBmC,SAAMF,KAAE,8BAA+B,CAC5DvB,OAAQ,iBACX,EAGjB,CAEA4tC,wBAAwBzuB,GACpB,MAAM6vB,EAAe15C,KAAK6G,WACpB8yC,EAAuBD,EAAapyC,MAAM4iB,eAAiB,GACjEwvB,EAAahf,WAAW,CACpBxQ,cAAeyvB,EAAqBz4C,OAAOa,GAAMA,IAAO8nB,KAE5D6vB,EAAa/6B,aACjB,CAEQ86B,yBACJ,OAAOz5C,KAAKyX,aACPqC,cAAc0D,GAA2B,CACtCwG,KAAM,KACNK,UAAU,IAEb9jB,QAAKoB,KAAIqnB,GAAeA,GAAeA,EAAYrnB,IAAIQ,GAAKA,EAAEJ,KACvE,CAEAg0B,SACI,MAAM2jB,EAAe15C,KAAK6G,WAC1B,IAAK6yC,EAAanuC,MACd,OAGJ,MAAMquC,EAAa55C,KAAK65C,kBACpB,CACI93C,GAAI,GACJyF,UAAW,GACXE,UAAW,GACXiS,SAAS,EACT/Y,aAAcZ,KAAKY,aACnBgC,KAAM,GACNo1B,KAAM,GACNnW,cAAe,KACflC,OAAQ,GACRyX,YAAa,GACb9zB,aAAc,GACd5B,aAAc,GACdsnB,YAAa,GACbtC,SAAU,IAEdgzB,EACA15C,KAAKY,cAETZ,KAAK6J,qBACApJ,0BAA0Bm5C,EAAY55C,KAAKW,qBAAsBX,KAAKY,cACtEiL,UACG,EAAG5I,wBAAuBnB,gBACtB9B,KAAKgK,oBAAoBgC,WAAQC,KAAE,gCAAiC,CAChEvB,OAAQ,YAEZ1K,KAAKm4B,aAAe,GACpBn4B,KAAK6G,WAAWiF,iBAChB9L,KAAK2J,OAAOsjB,SAAS,CAAC,MAAOnrB,GAAY,CAAEorB,WAAYltB,KAAK0J,OAAO,EAEvEwC,IAEI4tC,QAAQ3tC,MAAMD,GACdlM,KAAKgK,oBAAoBmC,SAAMF,KAAE,8BAA+B,CAC5DvB,OAAQ,WACX,EAGjB,CAEA/D,QACIuE,OAAclL,KAAKmL,QAASnL,KAAKoL,eAC5B7K,QACG8K,KAAK,IAAC,EACN5J,KAAS,EAAEX,EAASF,MAChB,MAAM84C,EAAe15C,KAAK6G,WAC1B,IAAI1C,EAGJ,OAAIu1C,EAAanuC,OAASvL,KAAKi2B,mBAC3B9xB,EAAenE,KAAK65C,kBAChB/4C,EACA44C,EACA94C,IAIDZ,KAAK6J,qBAAqB7F,cAAc,CAC3ClD,UACAF,eACAsD,WAAYlE,KAAK6G,WAAWM,IAAI,CAAC,4BAA4BG,QAAS,EACtEnD,eACAC,cAfAA,WAgBH,IAGRyH,UACGhG,IACI7F,KAAK+5C,oBAAoBl0C,GACzB7F,KAAK6G,WAAWiF,iBAChB9L,KAAKm4B,aAAe,GACpBn4B,KAAKgK,oBAAoBgC,WAAQC,KAAE,gCAAiC,CAChEvB,OAAQ,YAEZ1K,KAAK+J,eAAegC,cAAY,EAEpCG,IACIlM,KAAKgK,oBAAoBmC,SAAMF,KAAE,8BAA+B,CAC5DvB,OAAQ,WACX,EAGjB,CAEAkP,gBACI,OAAO3P,MAAM2P,kBAAoB5Z,KAAKm4B,aAAaxY,SAAW3f,KAAKm4B,aAAatW,aACpF,CAKUlV,cACN7L,EACAF,GAEA,MAAM4M,KAAqB7I,OAAgB7D,EAASF,GACpDZ,KAAK6G,WAAW6zB,WAAW,CACvB/gB,QAAS7Y,EAAQ6Y,QACjB/W,KAAM4K,EAAqBA,EAAmB5K,KAAO,GACrDo1B,KAAMxqB,EAAqBA,EAAmBwqB,KAAO,GACrDZ,YAAa5pB,EAAqBA,EAAmB4pB,YAAc,GACnElN,cAAeppB,EAAQkoB,YAAYrnB,IAAImoB,GAAMA,EAAG/nB,MAGhD/B,KAAKsN,aAAajM,QAClBrB,KAAK4N,yBACD5N,KAAKsN,aACLtN,KAAK6G,WAAWM,IAAI,CAAC,iBACrBrG,EACA0M,EAGZ,CAMQqsC,kBACJ/4C,EACAk5C,EACAp5C,GAcA,MAAO,KACH,EAbmByL,OAA0B,CAC7CC,aAAcxL,EACdyL,cAAeytC,EAAiB1yC,MAChCkF,kBAAmBxM,KAAKsN,aACxB1M,eACA6L,mBAAoB,CAChB7L,eACAgC,KAAM9B,EAAQ8B,MAAQ,GACtBo1B,KAAMl3B,EAAQk3B,MAAQ,GACtBZ,YAAat2B,EAAQs2B,aAAe,MAKxC7V,SAAUvhB,KAAKm4B,aAAaxY,QAAQhe,IAAIsW,GAAKA,EAAElW,IAC/C84B,gBAAiB76B,KAAKm4B,aAAatW,eAAe9f,GAClDmoB,cAAe8vB,EAAiB1yC,MAAM4iB,cAE9C,CAKQ6vB,oBAAoBE,GACxB,MAAMC,EAAcD,EAAQ,GACtBzgB,EAAcx5B,KAAK6G,WAAWM,IAAI,CAAC,UAAW,SAMhDqyB,GAJJ,SAAS2gB,EAAiBz5C,GACtB,OAAOA,EAAM2oC,eAAe,gBAChC,CAEmB8Q,CAAiBD,IAChC1gB,EAAY1rB,SAASosC,EAAYl2C,cAAcg0B,KAAM,CAAE0c,WAAW,GAE1E,MAjZSqE,4CAAsB3yC,MAAAC,IAAAD,MAAA2H,MAAA3H,MAAA4H,OAAA5H,MAAA4H,OAAA5H,MAAA4H,OAAA5H,aAAA,2BAAtB2yC,GAAsB7qC,UAAA,0BAAAC,SAAA,CAAA/H,OAAAgI,MAAA,GAAAC,KAAA,GAAAC,OAAA,uqEAAAC,SAAA,SAAAC,EAAAC,MAAA,EAAAD,ID7DnCpI,MAAA,mBAAAA,CAAgB,mBAAhBA,CAAgB,iBAGJA,MAAA,WACAA,MAAA,6BAIIA,MAAA,8BAAA6B,GAAA,OAAsBwG,EAAAC,YAAAzG,EAAmB,sDAC5C7B,UAGLA,MAAA,kBACIA,MAAA,4BACAA,MAAA,GAAAg0C,GAAA,kCAQAh0C,MAAA,GAAAi0C,GAAA,yBAAAj0C,OAUJA,YAIRA,MAAA,YAAAA,CAA4C,4BAA5CA,CAA4C,6BAA5CA,CAA4C,cAA5CA,CAA4C,6CAKxBA,MAAA,GAAAk0C,GAAA,4BASJl0C,UAEJA,MAAA,GAAAm0C,GAAA,wCAwBAn0C,MAAA,GAAAo0C,GAAA,kBAiBAp0C,MAAA,wCACIA,MAAA,aACIA,MAAA,GAAAq0C,GAAA,iDAMJr0C,QACAA,MAAA,UACIA,MAAA,GAAAs0C,GAAA,iBAQJt0C,UAEJA,MAAA,GAAAu0C,GAAA,oCAGJv0C,QAEAA,MAAA,qBACIA,MAAA,gBACAA,MAAA,cAAAA,CAAU,YAAVA,CAAU,SAAVA,CAAU,8CAIMA,MAAA,eAKIA,MAAA,iBAAA6B,GAAA,OAASwG,EAAA6qB,WAAArxB,EAAA1I,OAAA+H,MAA+B,6BAL5ClB,UAQJA,MAAA,GAAAw0C,GAAA,+BAWJx0C,QACAA,MAAA,oEAKIA,MAAA,yCAMJA,QACAA,MAAA,oEAMIA,MAAA,wDAIJA,YAGRA,MAAA,GAAAy0C,GAAA,kBAQAz0C,MAAA,0CAKAA,MAAA,wCACIA,MAAA,oBAIIA,MAAA,kBAAA6B,GAAA,OAAAwG,EAAA0pB,aAAAlwB,CAAA,GACH7B,UAGLA,MAAA,0DACIA,MAAA,GAAA00C,GAAA,gCAKA10C,MAAA,GAAA20C,GAAA,0BAAA30C,OAOAA,MAAA,GAAA40C,GAAA,gCAMJ50C,wDA7MIA,MAAA,GAAAA,MAAA,WAAAA,MAAA,KAAAqI,EAAAqtB,QAAA11B,CAA2B,yBAAAA,MAAA,KAAAqI,EAAAI,qBAA3BzI,CAA2B,sBAAAA,MAAA,KAAAqI,EAAArD,gBAW1BhF,MAAA,GAAAA,MAAA,OAAAA,MAAA,MAAAqI,EAAAqtB,QAAA11B,CAAsB,WAAA4O,GAoBpB5O,MAAA,GAAAA,MAAA,YAAAqI,EAAA5H,YAIaT,MAAA,GAAAA,MAAA,QAAAA,MAAA,6BACSA,MAAA,GAAAA,MAAA,mBAAAqI,EAAA2T,mBAWdhc,MAAA,GAAAA,MAAA,QAAAA,MAAA,MAAAqI,EAAAqtB,SAwBJ11B,MAAA,GAAAA,MAAA,aAAAqI,EAAA/D,OAAA,KAAA+D,EAAA/D,OAAAhJ,aAAAL,QAiBD+E,MAAA,GAAAA,MAAA,QAAAA,MAAA,yBAGyBA,MAAA,GAAAA,MAAA,UAAAA,MAAA,MAAAqI,EAAA0qC,eAStB/yC,MAAA,GAAAA,MAAA,mBAAAqI,EAAA2T,mBAQFhc,MAAA,GAAAA,MAAA,OAAAA,MAAA,MAAAqI,EAAAtD,UAUiB/E,MAAA,GAAAA,MAAA,QAAAA,MAAA,+BAKRA,MAAA,GAAAA,MAAA,YAAAA,MAAA,MAAAqI,EAAA2T,oBAIFhc,MAAA,GAAAA,MAAA,YAAAA,MAAA,MAAAqI,EAAAqtB,UAAA,OAAAmf,EAAAxsC,EAAA5H,WAAAM,IAAAf,MAAA,GAAAmrB,MAAA,KAAA0pB,EAAA1vC,QAaNnF,MAAA,GAAAA,MAAA,QAAAA,MAAA,sBAAAA,CAAoC,SAAAA,MAAA,GAAAurB,GAAAvrB,MAAA,sCAQhCA,MAAA,GAAAA,MAAA,YAAAA,MAAA,MAAAqI,EAAA2T,oBAKJhc,MAAA,GAAAA,MAAA,QAAAA,MAAA,4BAAAA,CAA0C,SAAAA,MAAA,GAAAurB,GAAAvrB,MAAA,sCAMtCA,MAAA,GAAAA,MAAA,YAAAA,MAAA,MAAAqI,EAAA2T,oBAKwChc,MAAA,GAAAA,MAAA,OAAAqI,EAAAnB,aAAAjM,QAUpD+E,MAAA,GAAAA,MAAA,UAAAqI,EAAAtD,QAAA/E,CAAmB,aAAAqI,EAAA5H,YAGbT,MAAA,GAAAA,MAAA,QAAAA,MAAA,yBAEFA,MAAA,GAAAA,MAAA,SAAAqI,EAAA0pB,aAAAxY,SAAA,MAAAlR,EAAA/D,OAAA,KAAA+D,EAAA/D,OAAAiV,QAAAvZ,CAAgD,gBAAAqI,EAAA0pB,aAAAtW,gBAAA,MAAApT,EAAA/D,OAAA,KAAA+D,EAAA/D,OAAAmX,eAAhDzb,CAAgD,oBAAAqI,EAAA2T,mBAO9Chc,MAAA,GAAAA,MAAA,QAAAA,MAAA,kCAAAA,CAAgD,WAAAA,MAAA,MAAAqI,EAAAqtB,SAChD11B,MAAA,GAAAA,MAAA,OAAAA,MAAA,MAAAqI,EAAAqtB,QAAA11B,CAAsB,WAAA2O,GAYT3O,MAAA,GAAAA,MAAA,YAAAA,MAAA,MAAAqI,EAAAqtB,q0CEtL5B,MAAMof,GAGT,CACAvc,SAAU,eACVjkB,SAAOzO,KAAE,iBACTmzB,KAAM,QACNuQ,UAAW,YACX/Q,mBAAoBC,GAChBA,EAAgBp5B,SAAS0E,MAAWgxC,gBACpCtc,EAAgBp5B,SAAS0E,MAAW40B,eACxCM,QAASA,EAAG7N,WAAUiE,YAAW6J,gBAAeC,qBAC5C,MAAM9nB,EAAe+Z,EAASrqB,IAAIq4B,OAC5Bz/B,EAAcyxB,EAASrqB,IAAI+V,OAC3BlT,EAAsBwnB,EAASrqB,IAAIs4B,OACzChoB,EACK0C,OAAO,CACJC,SAAOnO,KAAE,wCACTqO,gBAAiB,CACbC,MAAOkb,EAAUp0B,QAErBmZ,QAAS,CACL,CAAEC,KAAM,YAAaC,SAAOzO,KAAE,kBAC9B,CAAEwO,KAAM,SAAUC,SAAOzO,KAAE,iBAAkB0O,aAAa,MAGjEpa,QACGqF,KAAUyV,GACNA,EAAWtb,EAAYe,QAAQs6C,kBAAe3mC,KAAOghB,EAAU9zB,IAAIwX,GAAKA,EAAEpX,MAAQiY,MAGzFnO,UAAUhG,IACP,IAAIynC,EAAU,EACd,MAAM0C,EAAmB,GACzB,UAAW95B,KAAQrQ,EAAOu1C,eAClBllC,EAAKrQ,SAAWC,MAAeC,QAC/BunC,IACOp3B,EAAK/P,SACZ6pC,EAAOvrC,KAAKyR,EAAK/P,SAGrB,EAAImnC,GACJtjC,EAAoBgC,WAAQC,KAAE,+CAAgD,CAC1EsO,MAAO+yB,IAGX,EAAI0C,EAAO3uC,QACX2I,EAAoBmC,MAAM6jC,EAAOtsC,KAAK,OAE1C47B,EAAc1e,UACd2e,GAAc,EACjB,GAIA8b,GAGT,CACA1c,SAAU,eACVjkB,SAAOzO,KAAE,6BACTmzB,KAAM,SACNR,mBAAoBC,GAChBA,EAAgBp5B,SAAS0E,MAAWC,gBACpCy0B,EAAgBp5B,SAAS0E,MAAWE,eACxCulC,UAAWA,EAAGpe,eAAQ,EAAO8pB,OAAe9pB,EAASrqB,IAAI+V,QACzDmiB,QAASA,EAAG7N,WAAUiE,YAAW8J,qBACR/N,EAASrqB,IAAIq4B,OAE7B1lB,cAAciM,GAAwC,CACnD/B,KAAM,KACNjK,OAAQ,CACJyN,cAAY/S,KAAOghB,EAAU9zB,IAAIwX,GAAKA,EAAEpX,KACxCsmB,kBAAmB,MAG1Bxc,UAAUhG,IACHA,GACA05B,GAAc,EAErB,GAIAgc,MAAsCrb,OAEjD,CACEvB,SAAU,eACVC,mBAAoBC,GAChBA,EAAgBp5B,SAAS0E,MAAWC,gBACpCy0B,EAAgBp5B,SAAS0E,MAAWE,eACxC20B,YAAa9oB,GAAQA,EAAKtT,KAC1Bu9B,sBAAuBA,CAACpgC,EAAaynB,EAAYJ,IAC7CrnB,EAAYe,QACPu4C,0BAA0B,CACvBjyB,UAAWA,EACXI,eAEHjnB,QAAKoB,KAAI6f,GAAOA,EAAI63B,8BAGpBmC,GAGT,CACA7c,SAAU,eACVjkB,SAAOzO,KAAE,6BACTmzB,KAAM,MACNR,mBAAoBC,GAChBA,EAAgBp5B,SAAS0E,MAAWC,gBACpCy0B,EAAgBp5B,SAAS0E,MAAWE,eACxCg1B,QAASA,EAAG7N,WAAUiE,YAAW6J,gBAAeC,qBAC5C,MAAM9nB,EAAe+Z,EAASrqB,IAAIq4B,OAE5Bx1B,GADcwnB,EAASrqB,IAAI+V,OACLsU,EAASrqB,IAAIs4B,QACnCnW,EAAO,UACP1C,KAAMnS,KAAOghB,EAAU9zB,IAAIwX,GAAKA,EAAEpX,KACxC,OAAO0V,EACFqC,cAAcsP,GAAmC,CAC9CpF,KAAM,KACNjK,OAAQ,CACJuP,OACA1C,SAGP/a,UAAUhG,IACHA,IACAmE,EAAoBgC,WAAQC,KAAE,qCAAsC,CAChEsO,MAAOkb,EAAUp0B,OACjBqJ,OAA6B,aAEjC60B,IAAc,EAErB,oFChJDn5B,MAAA,UAKIA,MAAA,iBACAA,MAAA,wBACJA,eALIA,MAAA,aAAAA,MAAA,EAAA2Y,KAIA3Y,MAAA,GAAAA,MAAA,IAAAA,MAAA,iEAsCJA,MAAA,uBAAAA,MAAA,IAAAq1C,EAAA15C,GAAA,gCASAqE,MAAA,8CAAAA,MAAA,IAAAA,MAAA,IAAAs1C,EAAAl0C,UAAA,yCASApB,MAAA,8CAAAA,MAAA,IAAAA,MAAA,IAAAu1C,EAAAj0C,UAAA,yCAMItB,MAAA,yDAEIA,MAAA,MAAAA,MAAA,IAAAw1C,EAAA,QAAAx1C,+BAGAA,MAAA,YACIA,MAAA,iBACJA,mCARRA,MAAA,YACIA,MAAA,EAAAy1C,GAAA,cAIAz1C,MAAA,EAAA01C,GAAA,0BAAA11C,OAKJA,wCARSA,MAAA,GAAAA,MAAA,OAAA21C,EAAAl6B,cAAAzb,CAA4B,WAAA0f,mEAarC1f,MAAA,SAAAA,CACK,UAAMA,MAAA,GAAkBA,QACxBA,MAAA,iBACHA,6BAHsBA,MAAA,aAAAA,MAAA,EAAAsb,GAAAs6B,EAAAj6C,KACbqE,MAAA,GAAAA,MAAA41C,EAAAp5C,gCAOXwD,MAAA,uBAAAA,MAAA,IAAA61C,EAAAjkB,KAAA,6BAKA5xB,MAAA,iBAAsDA,MAAA,wBAEpDA,eAFoDA,MAAA,GAAAA,YAAA,+CAGtDA,MAAA,iBAAuDA,MAAA,wBAErDA,eAFqDA,MAAA,GAAAA,YAAA,mDAHvDA,MAAA,EAAA81C,GAAA,mBAGA91C,MAAA,EAAA+1C,GAAA,wCAHW/1C,MAAA,OAAAg2C,EAAAziC,SAGAvT,MAAA,GAAAA,MAAA,QAAAg2C,EAAAziC,0EAOXvT,MAAA,6CAAAA,MAAA,IAAAA,MAAA,4BAAAA,MAAA,EAAAmqB,GAAA,MAAA8rB,EAAAC,YAAA,KAAAD,EAAAC,YAAA97B,aAAA,+BAGRpa,MAAA,uEAEIA,MAAA,cAAAm2C,EAAAn2C,CAA2B,QAAA0C,EAAA+4B,qECrG7B,MAAO2a,WACDxZ,MAoERljC,YACcC,EACF0X,EACAzN,EACAyyC,GAERxyC,QALUjK,KAAAD,cACFC,KAAAyX,eACAzX,KAAAgK,sBACAhK,KAAAy8C,kBArEZz8C,KAAA08C,0BAA4B,EACnB18C,KAAAsN,aAAetN,KAAKsK,qBAAqB,WACzCtK,KAAAisB,QAAUjsB,KAAKijC,yBACnBC,cACAC,iBACAiT,WAAW,CACR,CACIxzC,KAAM,UACN6X,KAAM,CAAE2oB,KAAM,WACd1oB,SAAOzO,KAAE,kBACTo3B,YAAa,WAEjB,CACIzgC,KAAM,OACN6X,KAAM,CAAE2oB,KAAM,QACd1oB,SAAOzO,KAAE,eACTo3B,YAAa,UAGpBlM,UAAU,CACPv0B,KAAM,cACN6X,KAAM,CACF2oB,KAAM,SACN7mB,UAAWogC,MACXC,eAAgBt1C,GAASA,EAAM3F,IAAIQ,GAAKA,EAAEJ,IAAI2B,KAAK,KACnDm5C,iBAAkBv1C,GAASA,EAAMoN,MAAM,KAAK/S,IAAII,KAASA,QACzD+6C,SAAUx1C,GACe,IAAjBA,EAAMjG,OACC,GAEPiG,EAAM,GAAG1E,KACF0E,EAAM3F,IAAIQ,GAAKA,EAAES,MAAMc,KAAK,OAAI,EAEhCikB,MACH3nB,KAAKD,YAAY2rC,MACZwN,eAAe,CAAEh4C,OAAQ,CAAEa,GAAI,CAAEgmB,GAAIzgB,EAAM3F,IAAIQ,GAAKA,EAAEJ,QACtD5B,UAAU,EAAG6oB,iBACVA,EAAY1oB,MAAMqB,IAAImoB,GAAMA,EAAGlnB,MAAMc,KAAK,SAMlEgX,SAAOzO,KAAE,wBACTq3B,cAAgBh8B,KACZuiB,aAAc,CACV9B,GAAIzgB,EAAM3F,IAAIQ,GAAKA,EAAEJ,SAIhCyhC,sBAAsBxjC,KAAKsN,cAC3Bm2B,eAAezjC,KAAK0J,OAEhB1J,KAAA6hC,MAAQ7hC,KAAK0jC,uBACjBC,YAAY,YAAa,QACzB2S,SAAS,CACN,CAAE1zC,KAAM,MACR,CAAEA,KAAM,aACR,CAAEA,KAAM,aACR,CAAEA,KAAM,QACR,CAAEA,KAAM,UAEXihC,oBAAoB7jC,KAAKsN,cACzBm2B,eAAezjC,KAAK0J,OASrB1J,KAAK8jC,UAAU,CACXC,SAAUgZ,MACV9Y,SAAU7jC,GAAQA,EAAKspB,SACvBwa,aAAcA,CAACtkB,EAAMvU,MACjB5I,QAAS,CACLmd,OACAvU,OACAnK,OAAQ,CACJ0B,KAAM,CACFkd,SAAU9f,KAAK4X,kBAAkBtQ,UAElCtH,KAAKisB,QAAQmY,qBAEpBrkB,KAAM/f,KAAK6hC,MAAMwC,qBAGzBC,qBAAsB,CAACtkC,KAAK6hC,MAAMzxB,aAAcpQ,KAAKisB,QAAQ7b,eAErE,CAEA4sC,qBACIh9C,KAAKD,YAAYe,QAAQm8C,UAAUpxC,UAAU,EAAGoxC,cAC5Cj9C,KAAKgK,oBAAoBkzC,QAAKjxC,KAAE,uBAChCjM,KAAKy8C,gBAAgBU,OAAOF,EAAQl7C,GAAIq7C,IACpC,GAAIA,EAAI7zB,QAAU8zB,MAASC,UAAW,CAClC,MAAMC,GAAO,IAAIC,KAAKC,cAAeC,OAAON,EAAIO,UAAY,GAC5D39C,KAAKgK,oBAAoBgC,WAAQC,KAAE,8BAA+B,CAC9DsO,MAAO6iC,EAAIv3C,OAAO+3C,iBAClBL,SAEJv9C,KAAK4gB,eAEL5gB,KAAKgK,oBAAoBmC,SAAMF,KAAE,yBAAwB,EAEhE,EAET,CAEA4xC,cAAc/7C,GACV9B,KAAKyX,aACA0C,OAAO,CACJC,SAAOnO,KAAE,kCACTuO,QAAS,CACL,CAAEC,KAAM,YAAaC,SAAOzO,KAAE,kBAC9B,CAAEwO,KAAM,SAAUC,SAAOzO,KAAE,iBAAkB0O,aAAa,MAGjEpa,QACGqF,KAAUyV,GAAaA,EAAWrb,KAAKD,YAAYe,QAAQ+8C,cAAc/7C,GAAakY,MAAM,EAG5F8jC,MAAM,MAETjyC,UACG,KACI7L,KAAKgK,oBAAoBgC,WAAQC,KAAE,gCAAiC,CAChEvB,OAAQ,YAEZ1K,KAAK4gB,SAAO,EAEhB1U,IACIlM,KAAKgK,oBAAoBmC,SAAMF,KAAE,8BAA+B,CAC5DvB,OAAQ,WACX,EAGjB,MA9IS8xC,4CAAoBp2C,MAAAC,OAAAD,MAAAC,OAAAD,MAAAC,OAAAD,MAAAC,OAAA,2BAApBm2C,GAAoBtuC,UAAA,wBAAAC,SAAA,CAAA/H,OAAAgI,MAAA,GAAAC,KAAA,GAAAC,OAAA,y1CAAAC,SAAA,SAAAC,EAAAC,GAAA,EAAAD,IDpBjCpI,MAAA,mBAAAA,CAAgB,mBAAhBA,CAAgB,gBAAhBA,CAAgB,6BAMAA,MAAA,8BAAA6B,GAAA,OAAsBwG,EAAAC,YAAAzG,EAAmB,qCAC5C7B,UAELA,MAAA,kBACIA,MAAA,4BACAA,MAAA,EAAA23C,GAAA,WAQA33C,MAAA,iBAAAA,CAAc,eAENA,MAAA,iBACJA,QACAA,MAAA,yBAAAA,CAA8C,eACJA,MAAA,0BAASqI,EAAAuuC,oBAAoB,GAC/D52C,MAAA,iBACAA,MAAA,0BACJA,kBAMpBA,MAAA,yBAQIA,MAAA,sBAAA6B,GAAA,OAAcwG,EAAA8K,cAAAtR,EAAqB,EAAnC7B,CAAoC,8BAAA6B,GAAA,OACdwG,EAAA6K,gBAAArR,EAAuB,2EAE7C7B,MAAA,4BAAAA,CAIwB,8CAKxBA,MAAA,8CACIA,MAAA,GAAA43C,GAAA,mBAGJ53C,QACAA,MAAA,8CAKIA,MAAA,GAAA63C,GAAA,mBAGJ73C,QACAA,MAAA,8CAKIA,MAAA,GAAA83C,GAAA,mBAGJ93C,QACAA,MAAA,8CACIA,MAAA,GAAA+3C,GAAA,mBAaJ/3C,QACAA,MAAA,8CACIA,MAAA,GAAAg4C,GAAA,mBAMJh4C,QACAA,MAAA,8CACIA,MAAA,GAAAi4C,GAAA,mBAGJj4C,QACAA,MAAA,8CACIA,MAAA,GAAAk4C,GAAA,mBAQJl4C,QACAA,MAAA,8CACIA,MAAA,GAAAm4C,GAAA,mBAGJn4C,QACAA,MAAA,GAAAo4C,GAAA,sCAKJp4C,eAxHgBA,MAAA,GAAAA,MAAA,yBAAAA,MAAA,KAAAqI,EAAAI,qBAAAzI,CAAsD,sBAAAA,MAAA,KAAAqI,EAAAu2B,mBAUrD5+B,MAAA,GAAAA,MAAA,mBAAAA,MAAA,GAAAmrB,KAYOnrB,MAAA,GAAAA,MAAA,IAAAA,MAAA,2CAUpBA,MAAA,GAAAA,MAAA,QAAAA,MAAA,MAAAqI,EAAAgT,QAAArb,CAAwB,eAAAA,MAAA,MAAAqI,EAAA6R,eAAxBla,CAAwB,aAAAA,MAAA,MAAAqI,EAAAyK,aAAxB9S,CAAwB,cAAAA,MAAA,MAAAqI,EAAA8R,cAAxBna,CAAwB,UAAAqI,EAAAwd,SAUpB7lB,MAAA,GAAAA,MAAA,gBAAAqI,EAAArI,CAAsB,mBAAAqI,EAAAoJ,kBAItBzR,MAAA,GAAAA,MAAA,oBAAAqI,EAAAmJ,kBAAAxR,CAAuC,wBAAAA,MAAA,iCAG3BA,MAAA,GAAAA,MAAA,UAAAA,MAAA,mBAAAA,CAAmC,qBAAnCA,CAAmC,OAAAqI,EAAAozB,MAAA16B,IAAA,OAM/Cf,MAAA,GAAAA,MAAA,UAAAA,MAAA,2BAAAA,CAA2C,qBAA3CA,CAA2C,OAAAqI,EAAAozB,MAAA16B,IAAA,cAS3Cf,MAAA,GAAAA,MAAA,UAAAA,MAAA,2BAAAA,CAA2C,qBAA3CA,CAA2C,OAAAqI,EAAAozB,MAAA16B,IAAA,cAQ/Bf,MAAA,GAAAA,MAAA,UAAAA,MAAA,uBAeAA,MAAA,GAAAA,MAAA,UAAAA,MAAA,sBAAAA,CAAsC,cAAtCA,CAAsC,OAAAqI,EAAAozB,MAAA16B,IAAA,SAQtCf,MAAA,GAAAA,MAAA,UAAAA,MAAA,qBAAAA,CAAqC,OAAAqI,EAAAozB,MAAA16B,IAAA,SAKrCf,MAAA,GAAAA,MAAA,UAAAA,MAAA,yBAUAA,MAAA,GAAAA,MAAA,UAAAA,MAAA,qCAMYA,MAAA,GAAAA,MAAA,UAAAqI,EAAAnB,u9CEvHhClH,MAAA,WACIA,MAAA,yCACJA,8BADIA,MAAA,GAAAA,MAAA,IAAAA,MAAA,oCAAAA,MAAA,EAAA2Y,GAAA3Y,MAAA,IAAAQ,EAAA63C,YAAA,gFAEJr4C,MAAA,WACIA,MAAA,oFAIJA,8BAJIA,MAAA,GAAAA,MAAA,IAAAA,MAAA,6CAAAA,MAAA,GAAAsb,GAAAtb,MAAA,IAAAA,MAAA,IAAAkD,EAAAo1C,aAAAp1C,EAAA4G,cAAA9J,MAAA,IAAAkD,EAAAm1C,YAAA,OCME,MAAOE,GAYT7+C,YAAoBC,GAAAC,KAAAD,cAHZC,KAAA4+C,aAAe,IAAIz/B,IAAwB,GAC3Cnf,KAAA6+C,qBAAuB,IAAI1/B,IAAwB,GAEZ,CAE/C5U,WACI,MAAMu0C,EAAY9+C,KAAKD,YAAYG,SAC9B6+C,kBAAkB,IAAK,EAAG,eAC1B5iC,UAAU/b,GAAQA,EAAK4+C,SAAS1+C,OAC/B2+C,EAAiBj/C,KAAKD,YAAYG,SACnCsY,iBAAiB,eACjBkH,yBACAvD,UAAU/b,GAAQA,EAAKqY,eAE5BzY,KAAKy+C,YAAWvzC,KAAc+zC,EAAgBH,EAAW9+C,KAAK6+C,sBAAsBt+C,QAChFoB,KAAI,EAAE2lB,EAAS03B,EAAUE,MACrB,MAAMC,EAAiB73B,EAAQ63B,eAC/B,IAAKA,EACD,OAAO,EAEX,MAAMC,EAAiBJ,EAASt8C,KAC5B28C,GAAWA,EAAQC,KAAKv9C,KAAOo9C,EAAep9C,IAAMs9C,EAAQjlB,SAASr4B,KAAOm9C,GAGhF,OAAKE,EAGEA,EAAe93C,MAFX,KAMnBtH,KAAK0+C,eAAcxzC,KAAclL,KAAKy+C,SAAUz+C,KAAK4+C,cAAcr+C,QAC/DoB,KAAI,EAAE09C,EAAS17C,KAAWuqC,KAAKqR,MAAM57C,IAAU,IAAM07C,GAAW,OAExE,CAEA5yB,YAAYC,GACJ,UAAWA,GACX1sB,KAAK4+C,aAAa3kC,KAAKyS,EAAQ/oB,MAAMipB,cAErC,kBAAmBF,GACnB1sB,KAAK6+C,qBAAqB5kC,KAAKyS,EAAQwyB,cAActyB,aAE7D,kCCnDIxmB,MAAA,uBAAAA,MAAA,IAAAo5C,EAAA58C,KAAA,KAAA48C,EAAA57C,IAAA,gDAZRwC,MAAA,iBAKIA,MAAA,yBAAA6B,GAAA7B,MAAAosC,GAAA,MAAArpC,EAAA/C,QAAA,OAAAA,MAAA+C,EAAAs2C,kBAAAx3C,EAAA,EAAA7B,CAA+B,kBAAA6B,GAAA7B,MAAAosC,GAAA,MAAAnhC,EAAAjL,QAAA,OAIrBA,MAAAiL,EAAAquC,SAAAz3C,GAAgB,yCAE1B7B,MAAA,EAAAu5C,GAAA,qBAGJv5C,gCAZIA,MAAA,QAAAA,MAAA,IAAAQ,EAAAmS,WAAA3S,CAA2B,UAAAQ,EAAA64C,kBAA3Br5C,CAA2B,WAAAQ,EAAAg5C,SAA3Bx5C,CAA2B,eAA3BA,CAA2B,cAAAA,MAAA,4CDSlBu4C,4CAA2Bv4C,MAAAC,OAAA,2BAA3Bs4C,GAA2BzwC,UAAA,+BAAAwxB,OAAA,CAAAmgB,iBAAA,mBAAAl8C,MAAA,QAAAuM,aAAA,eAAAgvC,cAAA,iBAAA/wC,SAAA,CAAA/H,OAAAgI,MAAA,EAAAC,KAAA,EAAAC,OAAA,iEAAAC,SAAA,SAAAC,EAAAC,GAAA,EAAAD,IDXxCpI,MAAA,aAAiCA,MAAA,wBAAiCA,QAClEA,MAAA,EAAA05C,GAAA,aAGA15C,MAAA,EAAA25C,GAAA,qBAJiC35C,MAAA,GAAAA,YAAA,sBAC3BA,MAAA,GAAAA,MAAA,OAAAqI,EAAAoxC,kBAGAz5C,MAAA,GAAAA,MAAA,QAAAqI,EAAAoxC,0LGMkC7hC;;;;;;;;;;;EAmBlC,MAAOgiC,GAITlgD,YAAoBC,EAAkC4J,GAAlC3J,KAAAD,cAAkCC,KAAA2J,SAUtD3J,KAAA4/C,SAAW,CACP5mC,EACA9C,IAEAA,EAAKtT,KAAKqW,cAAcxT,SAASuT,EAAKC,gBACtC/C,EAAKtS,IAAIqV,cAAcxT,SAASuT,EAAKC,cAf8B,CAEvE1O,WACIvK,KAAK+Y,UAAY/Y,KAAKD,YACjB0pB,MAAMw2B,MAAqC,CACxCl+C,GAAI/B,KAAK8B,YAEZ3B,UAAUC,GAAQA,EAAKU,SAASoB,UAAY,GACrD,CASAw9C,SAASxpC,GACDA,GACAlW,KAAK2J,OACAsjB,SAAS,CAAC,UAAW,WAAYjtB,KAAK8B,UAAW,WAAYoU,EAAKnU,KAClEquC,KAAK,IAAOpwC,KAAKy/C,uBAAoBrgC,EAElD,MA3BS4gC,4CAAgC55C,MAAAC,OAAAD,MAAA2H,MAAA,2BAAhCiyC,GAAgC9xC,UAAA,qCAAAwxB,OAAA,CAAA59B,UAAA,aAAAsM,MAAA,EAAAC,KAAA,EAAAC,OAAA,8QAAAC,SAAA,SAAAC,EAAAC,MAAA,EAAAD,ID7B7CpI,MAAA,EAAA85C,GAAA,gDACK95C,MAAA,eAAA+5C,EAAA/5C,MAAA,IAAAqI,EAAAsK,YAAA,KAAAonC,EAAA9+C,QAAA,uIEIe+E,MAAA,6BAMIA,MAAA,8BAAA6B,GAAA7B,MAAAosC,GAAA,MAAArpC,EAAA/C,MAAA,UAAsBA,MAAA+C,EAAAuF,YAAAzG,GAAmB,qCAC5C7B,+CAJGA,MAAA,WAAAA,MAAA,IAAA2I,EAAA+sB,QAAA11B,CAA2B,yBAAAg6C,EAA3Bh6C,CAA2B,sBAAAA,MAAA,IAAA2I,EAAA3D,2CAJnChF,MAAA,GACIA,MAAA,EAAAi6C,GAAA,+BAQJj6C,6BAPSA,MAAA,GAAAA,MAAA,OAAAg6C,EAAA/+C,OAAA,6CAcb+E,MAAA,cAGIA,MAAA,mBAAAA,MAAA4pB,GAAA,MAAAhpB,EAAAZ,QAAA,OAASA,MAAAY,EAAAL,OAAM,GASfP,MAAA,wBACJA,gCATIA,MAAA,YAAAkD,EAAAzC,WAAAE,SAAAuC,EAAAg3C,gBAAAv5C,SAAAuC,EAAAi3C,WAAAx5C,SAAAuC,EAAAzC,WAAAC,UAAAwC,EAAAg3C,gBAAAx5C,UAAAwC,EAAAi3C,WAAAz5C,YAAAwC,EAAA2sB,iBAQA7vB,MAAA,GAAAA,MAAA,IAAAA,MAAA,4FAUIA,MAAA,wBACIA,MAAA,cAMAA,MAAA,WAAOA,MAAA,wBAAkCA,iCAFrCA,MAAA,GAAAA,MAAA,cAAAsL,EAAA7K,WAAAM,IAAAf,MAAA,EAAA2Y,MAEG3Y,MAAA,GAAAA,YAAA,kDAMXA,MAAA,gBAAAA,CAIC,UACSA,MAAA,GAAsCA,QAC5CA,MAAA,GACJA,6CALIA,MAAA,YAAAqxC,EAAA+I,gBAAAC,EAAA/vC,SAAAtK,CAA6C,aAGvCA,MAAA,GAAAA,MAAA,GAAAqxC,EAAA+I,gBAAAC,EAAA/vC,SAAA,KACNtK,MAAA,GAAAA,MAAA,IAAAqxC,EAAAn1C,WAAAm+C,GAAA,6EAIJr6C,MAAA,UAKIA,MAAA,iBACAA,MAAA,wBACJA,eANIA,MAAA,aAAAA,MAAA,EAAAsb,KAKAtb,MAAA,GAAAA,MAAA,IAAAA,MAAA,4DAlBZA,MAAA,sCACIA,MAAA,YACIA,MAAA,EAAAs6C,GAAA,mCAQJt6C,QACAA,MAAA,SACIA,MAAA,EAAAu6C,GAAA,YAQJv6C,+CApBqCA,MAAA,QAAAA,MAAA,gCAGVA,MAAA,GAAAA,MAAA,UAAAA,MAAA,IAAAukB,EAAAloB,QAAA,YAYlB2D,MAAA,GAAAA,MAAA,mBAAA0wB,EAAA1U,6DASLhc,MAAA,6BAIIA,MAAA,0BAAAw6C,EAAAx6C,MAAAy6C,GAAA14C,UAAA+mB,EAAA9oB,MAAA,UAAUA,MAAA8oB,EAAArG,iBAAA+3B,EAAA7+C,IAA+B,4BAC5CqE,+CAHGA,MAAA,aAAAw6C,EAAAx6C,CAAyB,YAAAA,MAAA,IAAA2b,EAAAK,8DAM7Bhc,MAAA,eAGIA,MAAA,mBAAAA,MAAAwxC,GAAA,MAAAlQ,EAAAthC,MAAA,UAASA,MAAAshC,EAAAoZ,mBAAkB,GAE3B16C,MAAA,iBACAA,MAAA,wBACJA,cADIA,MAAA,GAAAA,MAAA,IAAAA,MAAA,yDAMRA,MAAA,iDAAwDA,MAAA,SAAA26C,8BA0B5D36C,MAAA,sCACIA,MAAA,0DAMJA,+BAPUA,MAAA,QAAAA,MAAA,6BAGFA,MAAA,GAAAA,MAAA,eAAAkP,EAAAhI,aAAAlH,CAA6B,wBAAAkP,EAAAzO,WAAAM,IAAA,gBAA7Bf,CAA6B,YAAAA,MAAA,IAAAkP,EAAA8M,+CAsBrBhc,MAAA,eAIIA,MAAA,GACJA,kCAHIA,MAAA,QAAA46C,EAAAj/C,IAEAqE,MAAA,GAAAA,MAAA,IAAA46C,EAAAp+C,KAAA,+CA2BJwD,MAAA,QAAAA,CAA4C,eAIpCA,MAAA,mBAAAA,MAAAsqB,GAAA,MAAAuwB,EAAA76C,QAAA+B,UAAAkO,EAAAjQ,MAAA,UAASA,MAAAiQ,EAAA6qC,kBAAkBD,EAAA95C,IAAU,WAAU,GAE/Cf,MAAA,iBACJA,uDAJIA,MAAA,GAAAA,MAAA,WAAA66C,EAAA35C,MAAA4I,eAAAmgB,EAAA8wB,uDAzBpB/6C,MAAA,WAAAA,CAA4F,iEAapFA,MAAA,YACIA,MAAA,oDAQAA,MAAA,EAAAg7C,GAAA,aASJh7C,UAEJA,MAAA,kDAMJA,6CAvCwEA,MAAA,YAAA66C,GAEhE76C,MAAA,GAAAA,MAAA,QAAAA,MAAA,yBAAA4vB,EAAAuqB,WAAAl/C,OAAA,KAAA4/C,EAAA35C,MAAA4I,aAAA,QAAA9J,CAGC,YAAA4vB,EAAAuqB,WAAAl/C,QAAA4/C,EAAA35C,MAAA4I,eAAA8lB,EAAAmrB,2BAAA/6C,MAAA,sCAAAgZ,GAQ0BhZ,MAAA,GAAAA,MAAA,wBAAA66C,EAAA35C,MAAAqgC,QAGnBvhC,MAAA,GAAAA,MAAA,eAAA66C,EAAA35C,MAAA4I,aAAA9J,CAAyC,YAAAA,MAAA,KAAA4vB,EAAA5T,qBAAA,IAAA6+B,EAAA35C,MAAAqgC,QAMvCvhC,MAAA,GAAAA,MAAA,SAAA4vB,EAAAuqB,WAAAv1C,SAAA3J,QAYV+E,MAAA,GAAAA,MAAA,QAAA66C,EAAA35C,MAAA3D,MAAAyC,CAA2B,eAAA66C,EAAA35C,MAAA4I,aAA3B9J,CAA2B,mBAAAA,MAAA,KAAA4vB,EAAAqrB,0BAA3Bj7C,CAA2B,gBAAA4vB,EAAAnvB,WAAAM,IAAA,iBAAAG,iDAenBlB,MAAA,eAGIA,MAAA,yBAAAk7C,EAAAl7C,MAAA8Q,GAAA/O,UAAAgP,EAAA/Q,MAAA,UAASA,MAAA+Q,EAAAoqC,mBAAAD,GAAgC,GAEzCl7C,MAAA,iCACJA,oCADIA,MAAA,GAAAA,MAAA,IAAAA,MAAA,IAAAk7C,GAAA,gCAbhBl7C,MAAA,QAAAA,CAAwC,iBAAxCA,CAAwC,eAG5BA,MAAA,iBACAA,MAAA,wBACAA,MAAA,iBACJA,QACAA,MAAA,uBACIA,MAAA,EAAAo7C,GAAA,iBAOJp7C,uCAXIA,MAAA,GAAAA,MAAA,IAAAA,MAAA,kDAM6BA,MAAA,GAAAA,MAAA,UAAAq7C,8BAX7Cr7C,MAAA,GACIA,MAAA,EAAAs7C,GAAA,aAkBJt7C,6BAlBUA,MAAA,GAAAA,MAAA,OAAAq7C,EAAApgD,mCA2EV+E,MAAA,WAAAA,CAIC,4CASOA,MAAA,uCAMJA,QACAA,MAAA,2CAOIA,MAAA,GACJA,6DAzBAA,MAAA,YAAAu7C,GAGIv7C,MAAA,GAAAA,MAAA,gBAAAsxB,EAAAiqB,EAAAx6C,IAAA,2BAAAuwB,EAAApwB,OAAA,KAAAlB,MAAA,6BAAAA,CAIC,6BAAAw7C,EAAAD,EAAAx6C,IAAA,yBAAAy6C,EAAAt6C,QAIGlB,MAAA,GAAAA,MAAA,4BAAAuxB,EAAAgqB,EAAAx6C,IAAA,yBAAAwwB,EAAArwB,OAAAlB,CAAgE,YAAAA,MAAA,IAAA06B,EAAA1e,oBAOpEhc,MAAA,GAAAA,MAAA,gBAAAy7C,EAAAF,EAAAx6C,IAAA,2BAAA06C,EAAAv6C,OAAA,KAAAlB,MAAA,iCAMAA,MAAA,GAAAA,MAAA,WAAA07C,EAAAH,EAAAx6C,IAAA,wBAAA26C,EAAAx6C,MAAA,+CAYQlB,MAAA,eAGIA,MAAA,yBAAA27C,EAAA37C,MAAA47C,GAAA75C,UAAA85C,EAAA77C,MAAA,UAASA,MAAA67C,EAAAC,iBAAAH,GAA+B,GAExC37C,MAAA,iBAAyCA,MAAA,GAC7CA,oCAD6CA,MAAA,GAAAA,MAAA,IAAA27C,EAAAn/C,KAAA,gCAbzDwD,MAAA,QAAAA,CAAyC,iBAAzCA,CAAyC,eAG7BA,MAAA,iBACAA,MAAA,wBACAA,MAAA,iBACJA,QACAA,MAAA,uBACIA,MAAA,EAAA+7C,GAAA,iBAOJ/7C,uCAXIA,MAAA,GAAAA,MAAA,IAAAA,MAAA,uCAM8BA,MAAA,GAAAA,MAAA,UAAAg8C,8BAX9Ch8C,MAAA,GACIA,MAAA,EAAAi8C,GAAA,aAkBJj8C,6BAlBUA,MAAA,GAAAA,MAAA,OAAAg8C,EAAA/gD,+GA3Q1B+E,MAAA,YAAAA,CAA+E,2BAA/EA,CAA+E,4BAA/EA,CAA+E,aAA/EA,CAA+E,4CAK3DA,MAAA,EAAAk8C,GAAA,6BASJl8C,UAEJA,MAAA,EAAAm8C,GAAA,mBAsBAn8C,MAAA,sCACIA,MAAA,aACIA,MAAA,GAAAo8C,GAAA,iDAMJp8C,QACAA,MAAA,UACIA,MAAA,GAAAq8C,GAAA,iBAQJr8C,UAGJA,MAAA,eACIA,MAAA,GAAAs8C,GAAA,iDACJt8C,UAGJA,MAAA,qBACIA,MAAA,gBACAA,MAAA,cAAAA,CAAU,YAAVA,CAAU,8CAGEA,MAAA,yCAMJA,QACAA,MAAA,8CACIA,MAAA,yCAMJA,YAGRA,MAAA,GAAAu8C,GAAA,mBAQAv8C,MAAA,0CAKAA,MAAA,wCACIA,MAAA,oBAIIA,MAAA,kBAAA6B,GAAA7B,MAAAw8C,GAAA,MAAAC,EAAAz8C,QAAA,OAAAA,MAAAy8C,EAAA1qB,aAAAlwB,EAAA,GAJJ7B,UAOJA,MAAA,wCACIA,MAAA,YAAAA,CAAuB,8CAEfA,MAAA,gBACIA,MAAA,GAAA08C,GAAA,mCAMJ18C,YAGRA,MAAA,GAAA28C,GAAA,gBAwCA38C,MAAA,GAAA48C,GAAA,wCAoBJ58C,QACAA,MAAA,wCACIA,MAAA,YAAAA,CAAuB,oEAMfA,MAAA,0CAKIA,MAAA,gBACIA,MAAA,0BACJA,QACAA,MAAA,gBACIA,MAAA,0BACJA,QACAA,MAAA,gBACIA,MAAA,0BACJA,YAIRA,MAAA,mEAIIA,MAAA,yCASAA,MAAA,yBACIA,MAAA,yCASAA,MAAA,YACKA,MAAA,0BAEEA,cAKnBA,MAAA,GAAA68C,GAAA,eA8BA78C,MAAA,GAAA88C,GAAA,wCAoBJ98C,qDA9ROA,MAAA,YAAAM,EAAAG,YAIaT,MAAA,GAAAA,MAAA,QAAAA,MAAA,4BACSA,MAAA,GAAAA,MAAA,mBAAAA,MAAA,GAAAmqB,KAWlBnqB,MAAA,GAAAA,MAAA,OAAAukB,EAAAloB,QAAApB,QAsBD+E,MAAA,GAAAA,MAAA,QAAAA,MAAA,wBAGyBA,MAAA,GAAAA,MAAA,UAAAA,MAAA,MAAAM,EAAAyyC,eAStB/yC,MAAA,GAAAA,MAAA,mBAAAM,EAAA0b,mBAUchc,MAAA,GAAAA,MAAA,OAAAA,MAAA,MAAAM,EAAAyE,UAQH/E,MAAA,GAAAA,MAAA,QAAAA,MAAA,sBAKRA,MAAA,GAAAA,MAAA,YAAAA,MAAA,MAAAA,MAAA,GAAAmqB,MAGQnqB,MAAA,GAAAA,MAAA,QAAAA,MAAA,sBAKRA,MAAA,GAAAA,MAAA,YAAAA,MAAA,MAAAM,EAAA0b,oBAKwChc,MAAA,GAAAA,MAAA,OAAAM,EAAA4G,aAAAjM,QAUpD+E,MAAA,GAAAA,MAAA,UAAAM,EAAAyE,QAAA/E,CAAmB,aAAAM,EAAAG,YAGbT,MAAA,GAAAA,MAAA,QAAAA,MAAA,yBAEFA,MAAA,GAAAA,MAAA,SAAAM,EAAAyxB,aAAAxY,QAAAgL,EAAAhL,OAAAvZ,CAAgD,gBAAAM,EAAAyxB,aAAAtW,eAAA8I,EAAA9I,cAAhDzb,CAAgD,oBAAAM,EAAA0b,mBAM9Chc,MAAA,GAAAA,MAAA,QAAAA,MAAA,gCAEcA,MAAA,GAAAA,MAAA,QAAAA,MAAA,+BAGoBA,MAAA,GAAAA,MAAA,UAAAA,MAAA,MAAAM,EAAAy8C,iBAQQ/8C,MAAA,GAAAA,MAAA,UAAAM,EAAA65C,WAAAv1C,UAwCjC5E,MAAA,GAAAA,MAAA,OAAAA,MAAA,MAAAM,EAAA08C,uBAqBTh9C,MAAA,GAAAA,MAAA,QAAAA,MAAA,+BAIEA,MAAA,GAAAA,MAAA,QAAAA,MAAA,iCAAAA,CAA+C,UAAAA,MAAA,0CAM3CA,MAAA,GAAAA,MAAA,YAAAA,MAAA,MAAAM,EAAA0b,oBAEQhc,MAAA,GAAAA,MAAA,QAAAM,EAAA28C,WAAAC,MACJl9C,MAAA,GAAAA,MAAA,IAAAA,MAAA,2CAEIA,MAAA,GAAAA,MAAA,QAAAM,EAAA28C,WAAAE,OACJn9C,MAAA,GAAAA,MAAA,IAAAA,MAAA,4CAEIA,MAAA,GAAAA,MAAA,QAAAM,EAAA28C,WAAAG,SACJp9C,MAAA,GAAAA,MAAA,IAAAA,MAAA,8CAMRA,MAAA,GAAAA,MAAA,QAAAA,MAAA,wCAAAA,CAAsD,UAAAA,MAAA,iDAMlDA,MAAA,GAAAA,MAAA,YAAAA,MAAA,MAAAM,EAAA0b,mBAAAhc,CAAiD,2BAAAq9C,EAAA/8C,EAAAG,WAAAM,IAAA,sCAAAs8C,EAAAn8C,QAAAZ,EAAAg9C,sBAAAh9C,EAAAG,aAY7CT,MAAA,GAAAA,MAAA,eAAAA,MAAA,MAAAM,EAAA0b,oBAAA1b,EAAAg9C,sBAAAh9C,EAAAG,aAKCT,MAAA,GAAAA,MAAA,GAAAA,MAAA,uCAAAM,EAAAi9C,0BAAA,KASUv9C,MAAA,GAAAA,MAAA,UAAAM,EAAA45C,gBAAAt1C,UA4BZ5E,MAAA,GAAAA,MAAA,OAAAA,MAAA,MAAAM,EAAAk9C,wBC5OzB,MAAOC,WACDzlC,MA8CRte,YACY+J,EACAC,EACA2N,EACAzN,EACEjK,EACFgK,GAERE,QAPQjK,KAAA6J,uBACA7J,KAAA8J,cACA9J,KAAAyX,eACAzX,KAAAgK,sBACEhK,KAAAD,cACFC,KAAA+J,iBAjDI/J,KAAAoiB,kBAAoB,CAACjY,MAAWC,cAAeD,MAAWE,eACjErK,KAAAsN,aAAetN,KAAKsK,qBAAqB,kBACzCtK,KAAA8jD,mBAAqB9jD,KAAKsK,qBAAqB,iBAExDtK,KAAA6G,WAAa7G,KAAK8J,YAAYc,MAAwB,CAClD7I,GAAI,GACJ4X,SAAS,EACT/V,IAAK,GACLhB,KAAM,GACNs8C,cAAe,GACfp7C,YAAa,EACbigD,8BAA8B,EAC9BC,oBAAqB,EACrBC,eAAgBZ,MAAWC,KAC3Bp5B,cAAe,GACf5c,aAActN,KAAK8J,YAAYc,SAAM2T,OAAwBve,KAAKsN,iBAEtEtN,KAAAsgD,gBAAkBtgD,KAAK8J,YAAYoD,MAOjC,IACFlN,KAAAugD,WAAavgD,KAAK8J,YAAYoD,MAM5B,IACFlN,KAAAm4B,aAA+B,GAKtBn4B,KAAAqjD,WAAaA,KAetB,CAEA94C,WACIvK,KAAK+K,OACL/K,KAAKD,YAAYG,SAASgkD,kBAAkB,eAAej+C,QAAQ4F,UAAU,EAAGs4C,qBAC5EnkD,KAAKokD,qBAAuBD,EAAeF,eAC3CjkD,KAAK2jD,0BAA4BQ,EAAeH,oBAChDhkD,KAAK+J,eAAegC,cAAY,GAEpC/L,KAAKmjD,eAAiBnjD,KAAKqkD,QAAQ9jD,QAAKoB,KAAIvB,GAAQA,EAAKC,cAAcC,QACvE,MAAMgkD,EAA0BtkD,KAAKqkD,QAAQ9jD,QACzCoK,KAAIvK,GAASJ,KAAKmhD,2BAA6B/gD,EAAKqY,cAAcC,sBAAoB,EACtF/W,KAAIvB,GAAQA,EAAKqY,cAAc8rC,yBAEnCvkD,KAAKojD,wBAAuBl4C,KAAclL,KAAKugD,WAAWnwC,aAAck0C,GAAyB/jD,QAC7FoB,KAAI,EAAE6iD,EAAQC,KACVA,EAAcvjD,OAAOkC,IAASohD,EAAO7iD,IAAIwX,GAAKA,EAAEjJ,cAAczK,SAASrC,MAG/E,MAAMwwC,EAAkB5zC,KAAKqkD,QAAQ9jD,QAAKoB,KAAIvB,GAAQA,EAAK0zC,eAAexzC,QAC1EN,KAAK4jD,wBAAuB14C,KAAclL,KAAKmL,QAASyoC,GAAiBrzC,QACrEoB,KAAI,EAAE+I,EAAQopC,MACV,MAAM4Q,EAAUh6C,EAAO7G,YAAYlC,IAAIgjD,GAAKA,EAAE7O,cAAc/zC,IAC5D,OAAO+xC,EAAe5yC,OAAOyjD,IAAMD,EAAQj/C,SAASk/C,EAAE5iD,IAAG,IAGjE/B,KAAKqhD,yBAA2BrhD,KAAKD,YAAYG,SAC5CsY,iBAAiB,eACjBkH,yBACAvD,UAAU/b,GAAQA,EAAKqY,cAAcmsC,kBACrCrkD,QAAKC,MAAY,IACtBR,KAAK6kD,aAAe7kD,KAAKmL,QAAQ5K,QAAKoB,KAAI+I,GAAUA,GAAQ7G,aAAe,KAC3E,MAAMs1C,EAAen5C,KAAKmL,QAAQ5K,QAAKoB,KAAIkD,GAAWA,EAAQmkB,aAAe,KAEvEiwB,EAA2Bj5C,KAAK6G,WAAWM,IAAI,iBAAkBiJ,aAAa7P,QAChFqf,MAAK,IAAC,EACN2L,QAAoB,EACpB3lB,KAAUghB,GACN5mB,KAAKD,YAAY2rC,MACZwN,eAAe,CAAEh4C,OAAQ,CAAEa,GAAI,CAAEgmB,GAAInB,MACrCzmB,UAAU,EAAG6oB,iBAAkBA,EAAY1oB,SAAM,EAE1DE,MAAY,IAEhBR,KAAKm5C,gBAAel1B,MAChBk1B,EAAa54C,QAAK8K,KAAK,IACvB8tC,EAAa54C,KCvKlB,SAASukD,GAAYC,EAAiBC,GACzC,SAAOC,MAAWD,IAAc,EAAIp/C,KAAU,IAAMm/C,EAAiBC,IAAc,EAAIp/C,KAAU,IAAMm/C,EAC3G,CDqK8BD,CAAY7L,IAEtC,CAEAz6B,cACIxe,KAAKye,SACT,CAEA8iC,mBAAmBrxC,GACflQ,KAAKugD,WAAW97C,KACZzE,KAAK8J,YAAYc,MAAM,CACnBsF,eACAvM,MAAO,EACPgkC,QAAQ,IAGpB,CAEAuZ,kBAAkBgE,GACdA,EAAkBp3C,UAAUo3C,EAAkB59C,OAC9C49C,EAAkBvmC,aACtB,CAEAujC,iBAAiBpM,GACb91C,KAAKsgD,gBAAgB77C,KACjBzE,KAAK8J,YAAYc,MAAM,CACnB1H,gBAAiB4yC,EAAc/zC,GAC/BojD,kBAAmBrP,EAAclzC,KACjCkB,YAAa,EACb8xC,eAAgB,IAG5B,CAEAjvC,QACIuE,OAAclL,KAAKmL,QAASnL,KAAKoL,eAC5B7K,QACG8K,KAAK,IAAC,EACN5J,KAAS,EAAEoD,EAASjE,MAChB,MAAMF,KAAQ0kD,MACVplD,KAAKqlD,kBACDxgD,EACA7E,KAAK6G,WACLjG,GAEJ,CACI,KACA,UACA,eACA,MACA,gBACA,gBACA,kBACA,WACA,iBACA,sBACA,+BACA,iBAGR,OAAIZ,KAAKsgD,gBAAgB/0C,QACrB7K,EAAMmD,YAAc7D,KAAKsgD,gBAAgBt1C,SACpC9J,OAAO2M,GAAWA,EAAQtC,OAC1B5J,IAAIkM,KAED3K,gBAAiB2K,EAAQvG,MAAMpE,gBAE/BY,YAAa+J,EAAQvG,MAAMxD,gBAGnC9D,KAAKugD,WAAWh1C,QAChB7K,EAAM8jD,OAASxkD,KAAKugD,WAAWv1C,SAC1B9J,OAAO2M,GAAWA,EAAQtC,OAC1B5J,IAAIkM,KAEDlK,MAAOkK,EAAQvG,MAAM3D,MAErBuM,aAAcrC,EAAQvG,MAAM4I,aAC5By3B,QAAiC,IAAzB95B,EAAQvG,MAAMqgC,WAG3B3nC,KAAKD,YAAYkqB,OAAOq7B,MAAsC,CACjE5kD,MAAO,CAACA,IACX,IAGRmL,UACGhG,IACI7F,KAAK6G,WAAWiF,iBAChB9L,KAAKsgD,gBAAgBx0C,iBACrB9L,KAAKugD,WAAWz0C,iBAChB9L,KAAKm4B,aAAe,GACpBn4B,KAAKgK,oBAAoBgC,WAAQC,KAAE,gCAAiC,CAChEvB,OAAQ,mBAEZ1K,KAAK+J,eAAegC,cAAY,EAEpCG,IACIlM,KAAKgK,oBAAoBmC,SAAMF,KAAE,8BAA+B,CAC5DvB,OAAQ,kBACX,EAGjB,CAEAurB,gBACI,QAAS5lB,OAAOjP,OAAOpB,KAAKm4B,cAAc92B,MAC9C,CAEAqiD,sBAAsBn2C,GAClB,MAAM02C,EAAiB12C,EAAUpG,IAAI,mBAAmBG,MACxD,OACI28C,IAAmBZ,MAAWE,OAC7BU,IAAmBZ,MAAWG,UAAyC,IAA9BxjD,KAAKokD,oBAEvD,CAEA5D,gBAAgBx+C,GAEZ,OADchC,KAAK0K,QAAQ5J,QAAQY,aAAagB,KAAKvB,GAAKA,EAAEY,KAAOC,IACrDoB,IAClB,CAEAd,WAAWE,GAGP,OADIA,EAAOc,aAAaZ,KAAKmc,GAAKA,EAAEje,eAAiBZ,KAAKY,eAAiB4B,EAAOc,aAAa,IAC5EV,IACvB,CAEAimB,iBAAiBgB,GACb,MAAM6vB,EAAe15C,KAAK6G,WACpB8yC,EAAuBD,EAAapyC,MAAM4iB,eAAiB,GACjEwvB,EAAahf,WAAW,CACpBxQ,cAAeyvB,EAAqBz4C,OAAOa,GAAMA,IAAO8nB,KAE5D6vB,EAAa/6B,aACjB,CAEAmiC,mBACI9gD,KAAKy5C,yBAAyB5tC,UAAUqe,IACpC,GAAIA,EAAe,CACf,MAAMyvB,EAAuB35C,KAAK6G,WAAWS,MAAM4iB,eAAiB,GACpElqB,KAAK6G,WAAW6zB,WAAW,CACvBxQ,iBAAezV,KAAO,IAAIklC,KAAyBzvB,MAEvDlqB,KAAK6G,WAAW8X,gBAG5B,CAEQ86B,yBACJ,OAAOz5C,KAAKyX,aACPqC,cAAc0D,GAA2B,CACtCwG,KAAM,KACNK,UAAU,IAEb9jB,QAAKoB,KAAIqnB,GAAeA,GAAeA,EAAYrnB,IAAIQ,GAAKA,EAAEJ,KACvE,CAEU4K,cACN9H,EACAjE,GAEA,MAAMsE,KAAqBP,OAAgBE,EAASjE,GAC9CspB,EAAgBrlB,EAAQmkB,YAAYrnB,IAAImoB,GAAMA,EAAG/nB,IACvD/B,KAAK6G,WAAW6zB,WAAW,CACvB34B,GAAI8C,EAAQ9C,GACZ4X,QAAS9U,EAAQ8U,QACjB/V,IAAKiB,EAAQjB,IACbhB,KAAMsC,EAAqBA,EAAmBtC,KAAO,GACrDs8C,cAAer6C,EAAQ0gD,YAAYxjD,GACnC+B,YAAae,EAAQhB,YAAY,IAAIC,aAAe,EACpDigD,6BAA8Bl/C,EAAQk/C,6BACtCC,oBAAqBn/C,EAAQm/C,oBAC7BC,eAAgBp/C,EAAQo/C,eACxB/5B,kBAEJlqB,KAAKsgD,gBAAgB1lB,QACrB,UAAW4qB,KAAc3gD,EAAQhB,YAC7B7D,KAAKsgD,gBAAgB77C,KACjBzE,KAAK8J,YAAYc,MAAM,CACnB1H,gBAAiBsiD,EAAW1P,cAAc/zC,GAC1CojD,kBAAmBK,EAAW1P,cAAclzC,KAC5CkB,YAAa0hD,EAAW1hD,YACxB8xC,eAAgB4P,EAAW5P,kBAIvC51C,KAAKugD,WAAW3lB,QAChB,UAAWj3B,KAASkB,EAAQ2/C,OACxBxkD,KAAKugD,WAAW97C,KACZzE,KAAK8J,YAAYc,MAAM,CACnBjH,MAAOA,EAAMA,MACbuM,aAAcvM,EAAMuM,aACpBy3B,QAAQ,KAIhB3nC,KAAKsN,aAAajM,QAClBrB,KAAK4N,yBACD5N,KAAKsN,aACLtN,KAAK6G,WAAWM,IAAI,gBACpBtC,EACAK,EAGZ,CAMQmgD,kBACJxgD,EACA4gD,EACA7kD,GAYA,MAAO,KACH,EAXmByL,OAA0B,CAC7CC,aAAczH,EACd0H,cAAek5C,EAAiBn+C,MAChCkF,kBAAmBxM,KAAKsN,aACxB1M,eACA6L,mBAAoB,CAChB7L,eACAgC,KAAMiC,EAAQjC,MAAQ,MAK1B2e,SAAUvhB,KAAKm4B,aAAaxY,QAAQhe,IAAIsW,GAAKA,EAAElW,IAC/C84B,gBAAiB76B,KAAKm4B,aAAatW,eAAe9f,GAClDmoB,cAAeu7B,EAAiBn+C,MAAM4iB,cACtCg1B,cAAeuG,EAAiBn+C,MAAM43C,cAE9C,MA/US2E,4CAA6Bz9C,MAAAC,IAAAD,MAAA2H,MAAA3H,MAAA4H,OAAA5H,MAAA4H,OAAA5H,MAAA4H,OAAA5H,aAAA,2BAA7By9C,GAA6B31C,UAAA,iCAAAC,SAAA,CAAA/H,OAAAgI,MAAA,GAAAC,KAAA,GAAAC,OAAA,qyFAAAC,SAAA,SAAAC,EAAAC,GAAA,EAAAD,IDnE1CpI,MAAA,mBAAAA,CAAgB,mBAAhBA,CAAgB,kBAAhBA,CAAgB,WAIAA,MAAA,EAAAs/C,GAAA,uCAUAt/C,MAAA,sCACJA,UAGJA,MAAA,kBACIA,MAAA,4BACAA,MAAA,EAAAu/C,GAAA,gBAcJv/C,YAGRA,MAAA,GAAAw/C,GAAA,yCAnCqBx/C,MAAA,GAAAA,MAAA,WAEUA,MAAA,GAAAA,MAAA,OAAAA,MAAA,IAAAqI,EAAAI,sBAUiBzI,MAAA,GAAAA,MAAA,kBAAAqI,EAAA/D,OAAA,KAAA+D,EAAA/D,OAAA5J,QAAAiB,IAO/BqE,MAAA,GAAAA,MAAA,mBAAAA,MAAA,EAAAmqB,KAgB4BnqB,MAAA,GAAAA,MAAA,OAAAA,MAAA,KAAAqI,EAAAtD,+gCGjBtC,MAAM06C,GAGT,CACAlnB,SAAU,uBACVjkB,SAAOzO,KAAE,6BACTmzB,KAAM,SACNR,mBAAoBC,GAChBA,EAAgBp5B,SAAS0E,MAAWC,gBACpCy0B,EAAgBp5B,SAAS0E,MAAWE,eACxCulC,UAAWA,EAAGpe,eAAQ,EAAO8pB,OAAe9pB,EAASrqB,IAAI+V,QACzDmiB,QAASA,EAAG7N,WAAUiE,YAAW8J,qBACR/N,EAASrqB,IAAIq4B,OAE7B1lB,cAAciM,GAAwC,CACnD/B,KAAM,KACNjK,OAAQ,CACJiM,qBAAmBvR,KAAOghB,EAAU9zB,IAAIwX,GAAKA,EAAEpX,KAC/CsmB,kBAAmB,MAG1Bxc,UAAUhG,IACHA,GACA05B,GAAc,EAErB,GAIAumB,MAA6C5lB,OAExD,CACEvB,SAAU,uBACVC,mBAAoBC,GAChBA,EAAgBp5B,SAAS0E,MAAWC,gBACpCy0B,EAAgBp5B,SAAS0E,MAAWE,eACxC20B,YAAa9oB,GAAQA,EAAKtT,KAC1Bu9B,sBAAuBA,CAACpgC,EAAa6mB,EAAKQ,IACtCrnB,EAAYe,QACP04C,0BAA0B,CACvBpyB,UAAWA,EACXpB,kBAAmBY,IAEtBrmB,QAAKoB,KAAI6f,GAAOA,EAAIukC,qCAGpBC,GAA2F,CACpGrnB,SAAU,uBACVjkB,SAAOzO,KAAE,iBACTmzB,KAAM,QACNuQ,UAAW,YACX/Q,mBAAoBC,GAChBA,EAAgBp5B,SAAS0E,MAAWgxC,gBACpCtc,EAAgBp5B,SAAS0E,MAAW40B,eACxCM,QAASA,EAAG7N,WAAUiE,YAAW6J,gBAAeC,qBAC5C,MAAM9nB,EAAe+Z,EAASrqB,IAAIq4B,OAC5Bz/B,EAAcyxB,EAASrqB,IAAI+V,OAC3BlT,EAAsBwnB,EAASrqB,IAAIs4B,OACzChoB,EACK0C,OAAO,CACJC,SAAOnO,KAAE,8BACTqO,gBAAiB,CACbC,MAAOkb,EAAUp0B,QAErBmZ,QAAS,CACL,CAAEC,KAAM,YAAaC,SAAOzO,KAAE,kBAC9B,CAAEwO,KAAM,SAAUC,SAAOzO,KAAE,iBAAkB0O,aAAa,MAGjEpa,QACGqF,KAAUyV,GACNA,EACMtb,EAAYe,QAAQmlD,yBAAsBxxC,KAAOghB,EAAU9zB,IAAIwX,GAAKA,EAAEpX,MACtEiY,MAGbnO,UAAUhG,IACP,IAAIynC,EAAU,EACd,MAAM0C,EAAmB,GACzB,UAAW95B,KAAQrQ,EAAOogD,sBAClB/vC,EAAKrQ,SAAWC,MAAeC,QAC/BunC,IACOp3B,EAAK/P,SACZ6pC,EAAOvrC,KAAKyR,EAAK/P,SAGrB,EAAImnC,GACJtjC,EAAoBgC,WAAQC,KAAE,+CAAgD,CAC1EsO,MAAO+yB,IAGX,EAAI0C,EAAO3uC,QACX2I,EAAoBmC,MAAM6jC,EAAOtsC,KAAK,OAE1C47B,EAAc1e,UACd2e,GAAc,EACjB,kDC9GDn5B,MAAA,GACIA,MAAA,QAAIA,MAAA,GAAsBA,QAC9BA,kCADQA,MAAA,GAAAA,MAAA8/C,EAAAtjD,iCAaQwD,MAAA,yDAEIA,MAAA,MAAAA,MAAA,IAAA+/C,EAAA,QAAA//C,+BAGAA,MAAA,YACIA,MAAA,iBACJA,mCA2BhBA,MAAA,GACIA,MAAA,mCAKIA,MAAA,GACJA,QACJA,4DAJQA,MAAA,GAAAA,MAAA,QAAAA,MAAA,IAAAgf,EAAAghC,gBAAAC,EAAA31C,WADAtK,MAAA,YAAAkgD,EAAAn/C,IAAA,WAAAG,OAGAlB,MAAA,GAAAA,MAAA,IAAAigD,EAAAzjD,KAAA,gCAKAwD,MAAA,+FAGIA,MAAA,eAAA2jC,EAAA75B,aAAA9J,CAAqC,YAAAA,MAAA,IAAAsL,EAAAtK,8CAIzChB,MAAA,+FAGIA,MAAA,eAAA2jC,EAAA75B,aAAA9J,CAAqC,YAAAA,MAAA,IAAA0wB,EAAA1vB,8CA3DrDhB,MAAA,KACIA,MAAA,SAAAA,CAAkF,UAAlFA,CAAkF,WAGtEA,MAAA,EAAAmgD,GAAA,aAIAngD,MAAA,EAAAogD,GAAA,yBAAApgD,OAKJA,YAGRA,MAAA,SAAAA,CAAkF,yBAE1EA,MAAA,8DAOJA,UAEJA,MAAA,UAAAA,CAAkF,0BAE1EA,MAAA,+DAOJA,UAEJA,MAAA,GAAAqgD,GAAA,uCASArgD,MAAA,WAAAA,CAAwF,0BAEhFA,MAAA,GAAAsgD,GAAA,6BAOAtgD,MAAA,GAAAugD,GAAA,6BAOJvgD,UAEJA,MAAA,WAAAA,CAAwF,0BAEhFA,MAAA,yCAQJA,UAEJA,MAAA,WAAAA,CAAwF,yBAEhFA,MAAA,yCAOJA,UAERA,sEAxFgEA,MAAA,YAAAkgD,GAC9BlgD,MAAA,GAAAA,MAAA,YAAAkgD,EAAAn/C,IAAA,WAAAG,OAIblB,MAAA,GAAAA,MAAA,OAAA+C,EAAAy9C,iBAAA7c,GAAA3jC,CAAgC,WAAAgL,GAWnBhL,MAAA,GAAAA,MAAA,YAAAkgD,EAAAn/C,IAAA,WAAAG,OAMlBlB,MAAA,GAAAA,MAAA,YAAAA,MAAA,MAAA+C,EAAA/B,kBAAAhB,CAAgD,cAAAA,MAAA,sBAK9BA,MAAA,GAAAA,MAAA,YAAAkgD,EAAAn/C,IAAA,WAAAG,OAMlBlB,MAAA,GAAAA,MAAA,YAAAA,MAAA,MAAA+C,EAAA/B,kBAAAhB,CAAgD,cAAAA,MAAA,sBAK3BA,MAAA,GAAAA,MAAA,UAAAA,MAAA,MAAA2jC,EAAAtnC,QAAA,YASG2D,MAAA,GAAAA,MAAA,YAAAkgD,EAAAn/C,IAAA,WAAAG,OAGvBlB,MAAA,GAAAA,MAAA,QAAA+C,EAAA09C,yBAOAzgD,MAAA,GAAAA,MAAA,OAAA+C,EAAA09C,yBAQuBzgD,MAAA,GAAAA,MAAA,YAAAkgD,EAAAn/C,IAAA,WAAAG,OAQxBlB,MAAA,GAAAA,MAAA,YAAAA,MAAA,MAAA+C,EAAA/B,mBAIwBhB,MAAA,GAAAA,MAAA,YAAAkgD,EAAAn/C,IAAA,WAAAG,OAOxBlB,MAAA,GAAAA,MAAA,eAAAA,MAAA,MAAA+C,EAAA/B,8CArFpBhB,MAAA,QACIA,MAAA,EAAA0gD,GAAA,wBAyFJ1gD,4CAzFmBA,MAAA,GAAAA,MAAA,OAAAkD,EAAAy9C,aAAA5/C,IAAA4iC,EAAAhoC,MCcrB,MAAOilD,GAWTlnD,YAAoBiK,GAAA/J,KAAA+J,iBAJpB/J,KAAA+mD,aAAe,IAAI3d,IACVppC,KAAAoH,iBAAmB,CAAC+C,MAAWC,cAAeD,MAAWE,cAGV,CAExDE,WACIvK,KAAK2pB,aAAe3pB,KAAK26B,UAAUvqB,aAC9B7P,QACGoB,KAAI2F,GAASA,EAAMjG,SAAM,EACzBof,MAAa,IAAC,EACd8K,QAEH1f,UAAU,KACP7L,KAAKinD,mBAAiB,GAG9BjnD,KAAKinD,mBACT,CAEAzoC,cACQxe,KAAK2pB,cACL3pB,KAAK2pB,aAAaC,aAE1B,CAEAiM,UAAUtzB,EAAe2T,GACrB,OAAwB,MAAnBA,EAAanU,GACNmU,EAAanU,GAEdQ,CAEf,CAEAqkD,iBAAiB/hD,GACb,OAAO7E,KAAKknD,oBAAoBriD,EAAQ9C,KAAK8f,eAAiBhd,EAAQgd,aAC1E,CAEAukC,gBAAgBpkD,GACZ,MAAM4I,EAAQ5K,KAAK0B,aAAagB,KAAKvB,GAAKA,EAAEY,KAAOC,GACnD,OAAO4I,GAASA,EAAMhI,IAC1B,CAEQqkD,oBACJjnD,KAAK+mD,aAAansB,QAClB,UAAWusB,KAAgBnnD,KAAK26B,UAAU3vB,SACtChL,KAAK+mD,aAAaxsB,IAAI4sB,EAAa7/C,MAAMvF,GAAIolD,GAEjDnnD,KAAK+J,eAAegC,cACxB,yBCtFwB3F,MAAA,8BAAAA,YAAA,0CD8Bf4gD,4CAA6B5gD,aAAA,2BAA7B4gD,GAA6B94C,UAAA,iCAAAwxB,OAAA,CAAA/E,UAAA,yCAAAz4B,SAAA,WAAAklD,iBAAA,mBAAAP,wBAAA,0BAAAnlD,aAAA,eAAAwlD,oBAAA,uBAAA94C,MAAA,GAAAC,KAAA,GAAAC,OAAA,4/BAAAC,SAAA,SAAAC,EAAAC,GAAA,EAAAD,ID9B1CpI,MAAA,YAAAA,CAAqB,UAArBA,CAAqB,QAGTA,MAAA,QACAA,MAAA,QAAIA,MAAA,wBAA+BA,QACnCA,MAAA,QAAIA,MAAA,wBAA+BA,QACnCA,MAAA,GAAAihD,GAAA,uCAGAjhD,MAAA,SAAIA,MAAA,0BAAiCA,QACrCA,MAAA,SAAIA,MAAA,0BAAyCA,QAC7CA,MAAA,SAAIA,MAAA,0BAAkCA,YAG9CA,MAAA,YACIA,MAAA,GAAAkhD,GAAA,iCA2FJlhD,iBAtGYA,MAAA,GAAAA,YAAA,oBACAA,MAAA,GAAAA,YAAA,qBACkCA,MAAA,GAAAA,MAAA,UAAAA,MAAA,MAAAqI,EAAA/M,aAAA,OAGlC0E,MAAA,GAAAA,YAAA,wBACAA,MAAA,GAAAA,YAAA,gCACAA,MAAA,GAAAA,YAAA,yBAIgBA,MAAA,GAAAA,MAAA,UAAAA,MAAA,MAAAqI,EAAAvM,SAAAuM,EAAA24C,kBAAAhhD,CAA0C,eAAAqI,EAAAonB,8kBEG1EzvB,MAAA,YAAAA,CAAqC,WAC1BA,MAAA,wBAAwCA,QAC/CA,MAAA,0DAMJA,8BAPWA,MAAA,GAAAA,YAAA,6BAGHA,MAAA,GAAAA,MAAA,eAAAwJ,EAAAtC,aAAAlH,CAA6B,wBAAAwJ,EAAA23C,iBAA7BnhD,CAA6B,YAAAA,MAAA,IAAAA,MAAA,EAAA2Y,gDAOjC3Y,MAAA,eAAkCA,MAAA,mBAAAA,MAAAosC,GAAA,MAAArpC,EAAA/C,QAAA,OAASA,MAAA+C,EAAA2F,SAAQ,GAAE1I,MAAA,wBAAiCA,QACtFA,MAAA,eAEIA,MAAA,mBAAAA,MAAAosC,GAAA,MAAAnhC,EAAAjL,QAAA,OAASA,MAAAiL,EAAAm2C,SAAQ,GAQjBphD,MAAA,wBACJA,sDAZqDA,MAAA,GAAAA,YAAA,sBAIjDA,MAAA,GAAAA,MAAA,WAAA4O,EAAAjO,SAAA+W,EAAA/W,SAAAiO,EAAAlO,UAAAgX,EAAAhX,UAAAiI,EAAAw4C,iBAAAzgD,UAOAV,MAAA,GAAAA,MAAA,IAAAA,MAAA,2CCrBF,MAAOqhD,GANb3nD,cAUIE,KAAA0nD,mBAAoB,EAOpB1nD,KAAA2nD,kBAAmB,EAGnBp9C,WACI,MAAMiD,EAAqBxN,KAAK4nD,cAActkD,aAAaZ,KACvDmc,GAAKA,EAAEje,eAAiBZ,KAAK6nD,gBAKjC,GAHA7nD,KAAK4C,KAAO4K,GAAoB5K,MAAQ,GACxC5C,KAAKoD,KAAOpD,KAAK4nD,cAAcxkD,KAC/BpD,KAAKunD,iBAAmB,IAAI18C,KAAiB,IACzC7K,KAAKsN,aAAc,CACnB,MAAMw6C,EACDt6C,GAAuBA,EAA2BF,cAAiB,GAExE,UAAWg/B,KAAYtsC,KAAKsN,aAAc,CACtC,MAAM6G,EAAMm4B,EAAS1pC,KACf0E,EACgB,iBAAlBglC,EAAS7xB,KACHqtC,EAAqB3zC,GACpBnU,KAAK4nD,cAAsBt6C,aAAa6G,GACnDnU,KAAKunD,iBAAiBp6C,WAAWm/B,EAAS1pC,KAAM,IAAIsjB,KAAmB5e,KAGnF,CAEAkgD,SACI,MAAM3hD,KAASwG,OAA0B,CACrCC,aAActM,KAAK4nD,cACnBhnD,aAAcZ,KAAK6nD,eACnBt7C,cAAe,CACXnJ,KAAMpD,KAAKoD,KACXR,KAAM5C,KAAK4C,KACX0K,aAActN,KAAKunD,iBAAiBjgD,OAExCkF,kBAAmBxM,KAAKsN,aACxBb,mBAAoB,CAChB7L,aAAcZ,KAAK6nD,eACnBjlD,KAAM,MAGd5C,KAAKwP,YAAY,IAAK3J,EAAQ3B,WAAYlE,KAAK0nD,mBACnD,CAEA54C,SACI9O,KAAKwP,aACT,CAEAH,WAAWkqB,IACFv5B,KAAK2nD,mBAAqB3nD,KAAK4nD,cAAcxkD,OAC9CpD,KAAKoD,QAAOC,KAAgBk2B,EAAW,KAE/C,aA9DSkuB,2CAAkC,2BAAlCA,GAAkCv5C,UAAA,uCAAAE,MAAA,GAAAC,KAAA,GAAAC,OAAA,8jBAAAC,SAAA,SAAAC,EAAAC,GAAA,EAAAD,IDnB/CpI,MAAA,EAAA2hD,GAAA,qBACA3hD,MAAA,2CACIA,MAAA,eAIIA,MAAA,yBAAA6B,GAAA,OAAAwG,EAAA7L,KAAAqF,CAAA,EAAA7B,CAAkB,iBAAA6B,GAAA,OAETwG,EAAAY,WAAApH,EAAA1I,OAAA+H,MAA+B,GAN5ClB,UASJA,MAAA,2CACIA,MAAA,eAA2DA,MAAA,yBAAA6B,GAAA,OAAAwG,EAAArL,KAAA6E,CAAA,GAA3D7B,UAEJA,MAAA,yBAAAA,CAAsB,cACiBA,MAAA,yBAAA6B,GAAA,OAAAwG,EAAAi5C,kBAAAz/C,CAAA,GAAnC7B,QACAA,MAAA,YAAOA,MAAA,0BAA2DA,UAEtEA,MAAA,GAAA4hD,GAAA,iBAUA5hD,MAAA,GAAA6hD,GAAA,4BA3BgB7hD,MAAA,GAAAA,MAAA,QAAAA,MAAA,4BAKRA,MAAA,GAAAA,MAAA,UAAAqI,EAAA7L,MAKQwD,MAAA,GAAAA,MAAA,QAAAA,MAAA,oBAC+CA,MAAA,GAAAA,MAAA,UAAAqI,EAAArL,MAGxBgD,MAAA,GAAAA,MAAA,UAAAqI,EAAAi5C,mBAC5BthD,MAAA,GAAAA,YAAA,kDAEDA,MAAA,GAAAA,MAAA,OAAAqI,EAAAnB,aAAAjM,iIEoGJ,MAAO6mD,GAGTpoD,YAAYqoD,EAAsD9rC,GAC1D6rC,GAAcE,kCAGlBD,EAA0BE,mBAAmB7M,IAC7C2M,EAA0BE,mBAAmBhN,IAC7C8M,EAA0BE,mBAAmBxC,IAC7CsC,EAA0BE,mBAAmB9M,IAC7C4M,EAA0BE,mBAAmBvC,IAC7CqC,EAA0BE,mBAAmBnN,IAC7CiN,EAA0BE,mBAAmBrC,IAE7CmC,EAA0BE,mBAAmBnZ,IAC7CiZ,EAA0BE,mBAAmBhZ,IAC7C8Y,EAA0BE,mBAAmBxZ,IAE7CsZ,EAA0BE,mBAAmBlpB,IAC7CgpB,EAA0BE,mBAAmBzoB,IAC7CuoB,EAA0BE,mBAAmBpoB,IAC7CkoB,EAA0BE,mBAAmB5pB,IAE7CpiB,EAAYisC,gBAAgB,CACxBC,SAAU,EACV5pB,SAAU,eACV6pB,OAAKv8C,KAAE,oBACPvC,MAAO,GACP6S,UAAWigC,KAEfngC,EAAYisC,gBAAgB,CACxBC,SAAU,EACV5pB,SAAU,iBACV6pB,OAAKv8C,KAAE,mBACPvC,MAAO,GACP6S,aAAWksC,OAA4B,CACnClsC,UAAWw8B,GACXtvB,MAAOi/B,MACPC,UAAW,UACXC,eAAgBl+C,GAAU,CACtB,CACIgQ,MAAOhQ,EAASA,EAAO9H,QAAOqJ,KAAE,8BAChC6Q,KAAM,CAACpS,GAAQ3I,UAK/Bsa,EAAYisC,gBAAgB,CACxBC,SAAU,EACV5pB,SAAU,eACV6pB,OAAKv8C,KAAE,4BACPvC,MAAO,WACP6S,UAAW25B,KAEf75B,EAAYisC,gBAAgB,CACxBC,SAAU,EACV5pB,SAAU,yBACV6pB,OAAKv8C,KAAE,4BACPvC,MAAO,GACP6S,aAAWksC,OAA4B,CACnClsC,UAAWsnC,GACXp6B,MAAOo/B,MACPF,UAAW,iBACXC,eAAgBl+C,GAAU,CACtB,CACIgQ,MAAO,GAAGhQ,GAAQ5J,QAAQ8B,OAC1Bka,KAAM,CAAC,WAAY,WAAYpS,GAAQ5J,QAAQiB,KAEnD,CACI2Y,MAAO,GAAGhQ,GAAQ9H,SAAS8H,GAAQ9G,OACnCkZ,KAAM,CAAC,WAAYpS,GAAQ3I,UAK3Csa,EAAYisC,gBAAgB,CACxBC,SAAU,EACV5pB,SAAU,aACV6pB,OAAKv8C,KAAE,kBACPvC,MAAO,GACP6S,UAAWo1B,KAEft1B,EAAYisC,gBAAgB,CACxBC,SAAU,EACV5pB,SAAU,eACV6pB,OAAKv8C,KAAE,iBACPvC,MAAO,GACP6S,aAAWksC,OAA4B,CACnClsC,UAAWkvB,GACXhiB,MAAOujB,MACP2b,UAAW,QACXC,eAAgBl+C,GAAU,CACtB,CACIgQ,MAAOhQ,EAASA,EAAO9H,QAAOqJ,KAAE,4BAChC6Q,KAAM,CAACpS,GAAQ3I,UAK/Bsa,EAAYisC,gBAAgB,CACxBC,SAAU,EACV5pB,SAAU,kBACV6pB,OAAKv8C,KAAE,uBACPvC,MAAO,GACP6S,UAAWwmB,KAEf1mB,EAAYisC,gBAAgB,CACxBC,SAAU,EACV5pB,SAAU,oBACV6pB,OAAKv8C,KAAE,sBACPvC,MAAO,GACP6S,aAAWksC,OAA4B,CACnClsC,UAAWwb,GACXtO,MAAOq/B,MACPH,UAAW,aACXC,eAAgBl+C,GAAU,CACtB,CACIgQ,MAAOhQ,EAASA,EAAO9H,QAAOqJ,KAAE,iCAChC6Q,KAAM,CAACpS,GAAQ3I,UAK/Bsa,EAAYisC,gBAAgB,CACxBC,SAAU,EACV5pB,SAAU,aACV6pB,OAAKv8C,KAAE,kBACPvC,MAAO,GACP6S,UAAWyC,KAEf3C,EAAYisC,gBAAgB,CACxBC,SAAU,EACV5pB,SAAU,eACV6pB,OAAKv8C,KAAE,iBACPvC,MAAO,GACP6S,aAAWksC,OAA4B,CACnClsC,UAAW4B,GACXsL,MAAOs/B,MACPJ,UAAW,QACXC,eAAgBl+C,GAAU,CACtB,CACIgQ,MAAO,GAAGhQ,GAAQ9H,OAClBka,KAAM,CAACpS,GAAQ3I,UAK/BmmD,GAAcE,iCAAkC,EACpD,MArJSF,IACME,iCAAkC,yCADxCF,IAAa9hD,MAAAC,OAAAD,MAAAC,OAAA,2BAAb6hD,mCATE,CACP,CACI/1C,QAAS62C,KACTC,WAAa5sC,GAA6BD,GAAaC,GACvD7J,OAAO,EACP02C,KAAM,CAACC,SAEdC,QAAA,CAVSC,MAAcC,KAAaC,SAAS,OCxGlD,MAAMC,GAAsCxrC;;;;;;;;;;;;;;;;;;;;;;;EAyB/ByrC,GAAqBzrC;;;;;;;;;MAS5BwrC;ECjCOE,GAAwD1rC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAwFxD2rC,GAA+B3rC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MA8BtC0rC;EAGOE,GAAkC5rC;;;;;;MAMzC0rC;EC/HAG,GAAsD7rC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAmCtDC;EAGO6rC,GAA6B9rC;;;;;;;;;MASpC6rC","names":["replaceLast","target","search","replace","lastIndex","lastIndexOf","substr","ProductDetailService","constructor","dataService","this","getTaxCategories","settings","mapSingle","data","taxCategories","items","pipe","shareReplay","createProductWithVariants","input","createVariantsConfig","languageCode","createProduct$","product","createProduct","nonEmptyOptionGroups","groups","filter","g","values","length","createOptionGroups$","createProductOptionGroups","forkJoin","mergeMap","optionGroups","map","optionGroup","addOptionGroupToProduct","productId","id","optionGroupId","of","variants","v","optionIds","optionValues","optionName","index","option","options","find","o","name","Error","og","reduce","flat","createProductVariants","stockLocationId","c","code","normalizeString","translations","createProductOptionGroup","variantData","notNullOrUndefined","join","price","sku","stockLevels","stockOnHand","stock","updateProduct","updateOptions","autoUpdate","productInput","variantsInput","updateOperations","updateVariantsInput","getProductVariantsForProduct","productVariants","push","productOldName","findTranslation","productNewName","variant","currentVariantName","variantInput","existingVariantInput","i","variantTranslation","updateProductVariants","updateProductOption","updateProductVariantNames$","oldOptionName","newOptionName","variantsToUpdate","includes","variantName","deleteProductVariant","switchMap","result","DeletionResult","DELETED","getProduct","single$","throwError","message","i0","i1","factory","ɵfac","providedIn","_r3","ctx_r2","save","ctx_r0","detailForm","pristine","invalid","ctx_r8","optionGroupCustomFields","optionGroup_r6","get","updatePermission","optionControl_r18","value","optionControl_r19","createdAt","optionControl_r20","updatedAt","optionControl_r21","ctx_r15","optionControl_r22","ctx_r17","optionCustomFields","optionControl_r23","$event","_r25","$implicit","ctx_r24","paginationSettings","currentPage","ProductOptionsEditorComponent_form_22_vdr_card_2_vdr_data_table_2_12_ng_template_3_Template","ProductOptionsEditorComponent_form_22_vdr_card_2_vdr_data_table_2_12_ng_template_6_Template","ProductOptionsEditorComponent_form_22_vdr_card_2_vdr_data_table_2_12_ng_template_9_Template","ProductOptionsEditorComponent_form_22_vdr_card_2_vdr_data_table_2_12_ng_template_12_Template","ProductOptionsEditorComponent_form_22_vdr_card_2_vdr_data_table_2_12_ng_template_15_Template","ProductOptionsEditorComponent_form_22_vdr_card_2_vdr_data_table_2_12_ng_template_18_Template","options_r11","ctx_r9","itemsPerPage","ProductOptionsEditorComponent_form_22_vdr_card_2_ng_container_11_Template","ProductOptionsEditorComponent_form_22_vdr_card_2_vdr_data_table_2_12_Template","i_r7","ctx_r5","getOptions","ProductOptionsEditorComponent_form_22_vdr_card_2_Template","ctx_r1","getOptionGroups","ProductOptionsEditorComponent","BaseDetailComponent","route","router","serverConfigService","productDetailService","formBuilder","changeDetector","notificationService","super","autoUpdateVariantNames","Permission","UpdateCatalog","UpdateProduct","getCustomFieldConfig","ngOnInit","optionGroups$","snapshot","entity","tap","group","UntypedFormGroup","UntypedFormArray","init","controls","$product","combineLatest","entity$","languageCode$","take","optionGroupForm","dirty","optionGroupEntity","getUpdatedOptionGroup","updateProductOptionGroup","optionForm","getUpdatedOption","subscribe","markAsPristine","markForCheck","success","_","err","error","optionGroupFormGroup","createUpdatedTranslatable","translatable","updatedFields","customFieldConfig","defaultTranslation","optionFormGroup","setFormValues","groupsForm","groupTranslation","groupForm","setOptionGroupForm","setCustomFieldsForm","optionsForm","array","addControl","optionTranslation","setOptionForm","customFields","formGroup","currentTranslation","customValueFieldsGroup","hash","field","setCustomFieldFormValues","control","setValue","i2","i3","i4","selectors","features","decls","vars","consts","template","rf","ctx","setLanguage","ProductOptionsEditorComponent_button_20_Template","ProductOptionsEditorComponent_form_22_Template","availableLanguages$","cancel","ctx_r4","confirm","form","CreateProductOptionGroupDialogComponent","Validators","required","updateCode","nameControl","codeControl","resolveWith","CreateProductOptionGroupDialogComponent_ng_template_0_Template","CreateProductOptionGroupDialogComponent_ng_template_8_Template","optionGroup_r5","ctx_r3","existingVariant","_r7","ctx_r6","CreateProductVariantDialogComponent","record","currencyCode","FormControl","valueChanges","Object","every","entries","groupCode","optionId","groupId","getGroupIdFromCode","Number","getGroupCodeFromId","CreateProductVariantDialogComponent_ng_template_0_Template","CreateProductVariantDialogComponent_vdr_form_field_3_Template","CreateProductVariantDialogComponent_clr_alert_4_Template","CreateProductVariantDialogComponent_div_5_Template","CreateProductVariantDialogComponent_ng_template_16_Template","option_r3","_r8","ctx_r7","removeOption","i_r5","updateOption","cancelBubble","ctx_r11","editName","isLast_r4","lastSelected","locked","groupName","editingIndex","OptionValueInputComponent_div_1_vdr_chip_1_Template","OPTION_VALUE_INPUT_VALUE_ACCESSOR","provide","NG_VALUE_ACCESSOR","useExisting","forwardRef","OptionValueInputComponent","multi","formValue","add","EventEmitter","remove","edit","disabled","isFocussed","registerOnChange","fn","onChangeFn","registerOnTouched","onTouchFn","setDisabledState","isDisabled","writeValue","obj","focus","textArea","nativeElement","event","optionValue","nameInputs","setTimeout","newName","emit","handleKey","key","addOptionValue","preventDefault","removeLastOption","handleBlur","parseInputIntoOptions","unique","split","s","trim","viewQuery","ElementRef","_r12","_r1","OptionValueInputComponent_div_1_Template","group_r10","_r14","i_r11","addOption","ctx_r16","removeOptionGroup","isNew","variant_r18","variant_r19","variant_r20","variant_r21","variant_r22","optionGroup_r23","option_r29","_r33","variant_r25","item","ctx_r31","setOptionToAddToVariant","ctx_r35","addOptionToVariant","ctx_r28","optionsToAddToVariant","ProductVariantsEditorComponent_vdr_dt2_column_33_ng_template_1_vdr_chip_0_Template","ProductVariantsEditorComponent_vdr_dt2_column_33_ng_template_1_ng_template_1_Template","getOption","_r27","ProductVariantsEditorComponent_vdr_dt2_column_33_ng_template_1_Template","variant_r40","variant_r41","priceWithTax","variant_r42","_r44","ctx_r43","deleteVariant","GeneratedVariant","config","keys","ProductVariantsEditorComponent","modalService","formValueChanged","optionsChanged","searchTermControl","selectionManager","SelectionManager","multiSelect","itemsAreEqual","a","b","additiveMode","refresh$","Subject","paramMap","getDefaultUiLanguage","getActiveChannel","activeChannel","defaultCurrencyCode","product$","getProductVariantsOptions","parent","startWith","variants$","term","toLowerCase","totalItems$","p","allUsedOptionIds","allUsedOptionGroupIds","setItemsPerPage","setPageNumber","page","onFormChanged","variantInfo","enabled","canDeactivate","addOptionGroup","fromComponent","locals","EMPTY","next","usedByVariantsCount","dialog","title","body","translationVars","count","buttons","type","label","returnValue","val","removeOptionGroupFromProduct","force","__typename","addOptionToGroup","productOptionGroupId","createProductOption","deleteProductOption","variantId","response","createNewVariant","ProductVariantsEditorComponent_div_2_Template","ProductVariantsEditorComponent_ng_template_20_Template","ProductVariantsEditorComponent_ng_template_23_Template","ProductVariantsEditorComponent_ng_template_26_Template","ProductVariantsEditorComponent_ng_template_29_Template","ProductVariantsEditorComponent_ng_template_32_Template","ProductVariantsEditorComponent_vdr_dt2_column_33_Template","ProductVariantsEditorComponent_ng_template_37_Template","ProductVariantsEditorComponent_ng_template_40_Template","ProductVariantsEditorComponent_ng_template_43_Template","ProductVariantsResolver","BaseEntityResolver","mapStream","createRoutes","pageService","path","component","PageComponent","locationId","breadcrumb","children","getPageTabRoutes","redirectTo","link","CanDeactivateDetailGuard","resolve","inject","DataService","params","createResolveData","productOptionsEditorBreadcrumb","selectValues","selectedValues","ApplyFacetDialogComponent","ngAfterViewInit","selector","FacetValueSelectorComponent","ApplyFacetDialogComponent_ng_template_0_Template","ApplyFacetDialogComponent_ng_template_2_Template","_r2","ASSET_DETAIL_QUERY","gql","ASSET_FRAGMENT","TAG_FRAGMENT","AssetDetailComponent","TypedBaseDetailComponent","FormGroup","tags","getCustomFieldsDefaults","ngOnDestroy","destroy","onAssetChange","markAsDirty","updateAsset","t","AssetDetailComponent_button_5_Template","_c0","AssetListComponent","BaseListComponent","searchTerm$","BehaviorSubject","undefined","filterByTags$","uploading","setQueryFn","args","getAssetList","refetchOnChannelChange","assets","skip","searchTerm","contains","sort","SortOrder","DESC","tagsOperator","LogicalOperator","AND","paginationConfig$","itemsPerPage$","currentPage$","totalItems","debounceTime","takeUntil","destroy$","refresh","allTags$","getTagList","filesSelected","files","createAssets","finalize","successCount","deleteAssets","showModalAndDelete","r","assetIds","res","items$","_c1","_r10","previewAsset","featuredAsset","selectAssets","ctx_r13","AssetsComponent_div_0_img_2_Template","AssetsComponent_div_0_div_3_Template","AssetsComponent_div_0_ng_container_5_Template","AssetsComponent_div_0_div_6_Template","updatePermissions","_r20","ctx_r19","_r22","ctx_r21","_r24","ctx_r23","AssetsComponent_ng_template_1_img_1_Template","AssetsComponent_ng_template_1_div_2_Template","AssetsComponent_ng_template_1_ng_container_3_Template","AssetsComponent_ng_template_1_button_4_Template","_r29","dropListDropped","asset_r26","ctx_r30","setAsFeatured","ctx_r32","removeAsset","index_r27","ctx_r25","isFeatured","AssetsComponent_ng_template_3_div_1_Template","compact","AssetsComponent","assetsSetter","slice","change","AssetPickerDialogComponent","size","concat","emitChangeEvent","asset","AssetPreviewDialogComponent","closable","moveItemInArray","previousContainer","container","hostVars","hostBindings","AssetsComponent_div_0_Template","AssetsComponent_ng_template_1_Template","AssetsComponent_ng_template_3_Template","AssignProductsToChannelDialogComponent_ng_template_0_ng_container_0_Template","AssignProductsToChannelDialogComponent_ng_template_0_ng_template_1_Template","isProductVariantMode","selectedChannel","row_r9","pricePreview","ctx_r10","AssignProductsToChannelDialogComponent_tr_33_ng_template_7_Template","AssignProductsToChannelDialogComponent_tr_33_ng_template_8_Template","currentChannel","_r11","ctx_r14","_r18","assign","AssignProductsToChannelDialogComponent_ng_template_35_ng_template_4_Template","AssignProductsToChannelDialogComponent_ng_template_35_ng_template_5_Template","_r15","AssignProductsToChannelDialogComponent","productVariantIds","priceFactorControl","UntypedFormControl","selectedChannelIdControl","activeChannelId$","client","userStatus","activeChannelId","allChannels$","getChannels","channels","availableChannels","ids","selectChannel","variantsPreview$","from","getTopVariants","factor","channelIds","assignVariantsToChannel","channelId","priceFactor","channel","assignProductsToChannel","productIds","_this","_asyncToGenerator","lastValueFrom","getProductVariants","filterOperator","OR","in","AssignProductsToChannelDialogComponent_ng_template_0_Template","AssignProductsToChannelDialogComponent_ng_template_29_Template","AssignProductsToChannelDialogComponent_ng_template_30_Template","AssignProductsToChannelDialogComponent_tr_33_Template","AssignProductsToChannelDialogComponent_ng_template_35_Template","currentChannelIds","GET_PRODUCTS_WITH_FACET_VALUES_BY_IDS","GET_VARIANTS_WITH_FACET_VALUES_BY_IDS","UPDATE_PRODUCTS_BULK","UPDATE_VARIANTS_BULK","item_r6","facetValue_r10","_r13","removeFacetValue","BulkAddFacetValuesDialogComponent_table_7_tr_2_div_4_Template","BulkAddFacetValuesDialogComponent_table_7_tr_2_vdr_facet_value_chip_6_Template","facetValues","BulkAddFacetValuesDialogComponent_table_7_tr_2_Template","addFacetValues","facetValuesRemoved","BulkAddFacetValuesDialogComponent","changeDetectorRef","mode","state","fetchData$","query","products","subscription","unsubscribe","facetValueId","fv","selectedFacetValueIds","sv","mutate","facetValueIds","BulkAddFacetValuesDialogComponent_ng_template_0_Template","BulkAddFacetValuesDialogComponent_table_7_Template","BulkAddFacetValuesDialogComponent_ng_template_8_Template","BulkAddFacetValuesDialogComponent_ng_template_10_Template","variant_r6","variant_r7","variant_r8","variant_r9","variant_r10","CollectionContentsComponent","previewUpdatedFilters","filterTermControl","isLoading","collectionIdChange$","parentIdChange$","filterChanges$","inheritFiltersChanges$","contentsCurrentPage$","queryParamMap","qpm","distinctUntilChanged","contentsItemsPerPage$","perPage","filterTerm$","setContentsPageNumber","asObservable","inheritFilters","collection$","parentId","filterTerm","filters","filterClause","collection","previewCollectionVariants","catchError","getCollectionContents","contents$","contentsTotalItems$","ngOnChanges","changes","collectionId","currentValue","updatedFilters","complete","setParam","setContentsItemsPerPage","navigate","relativeTo","queryParams","n","queryParamsHandling","replaceUrl","contentQueries","dirIndex","TemplateRef","CollectionContentsComponent_ng_container_3_Template","CollectionContentsComponent_ng_template_14_Template","CollectionContentsComponent_ng_template_17_Template","CollectionContentsComponent_ng_template_20_Template","CollectionContentsComponent_ng_template_23_Template","CollectionContentsComponent_ng_template_26_Template","headerTemplate","onToggleAllClick","areAllCurrentItemsSelected","sort_r16","sortOrder","_r23","ngIf","toggleSortOrder","CollectionDataTableComponent_th_8_div_5_clr_icon_2_Template","CollectionDataTableComponent_th_8_div_5_clr_icon_3_Template","CollectionDataTableComponent_th_8_div_5_clr_icon_4_Template","CollectionDataTableComponent_th_8_div_5_div_5_Template","CollectionDataTableComponent_th_8_div_5_Template","column_r13","expand","align","heading","activeFilter_r29","ctx_r27","CollectionDataTableComponent_tr_13_ng_container_8_vdr_data_table_filters_2_Template","CollectionDataTableComponent_tr_13_ng_container_8_vdr_data_table_filters_3_Template","ctx_r26","activeFilters","_r31","toggleSearchFilterRow","CollectionDataTableComponent_tr_13_ng_container_6_Template","CollectionDataTableComponent_tr_13_ng_container_7_Template","CollectionDataTableComponent_tr_13_ng_container_8_Template","showSearchFilterRow","visibleSortedColumns","searchComponent","customSearchTemplate","_r9","item_r32","i_r33","emptyStateLabel","_r35","ctx_r34","itemsPerPageChange","_c2","currentStart","currentEnd","_r37","ctx_r36","pageChange","_r46","item_r38","ctx_r44","onRowClick","ctx_r41","activeIndex","absoluteIndex","isSelected","CollectionDataTableComponent_ng_template_23_td_3_ng_container_2_ng_container_1_Template","componentConfig_r52","_c3","injector","CollectionDataTableComponent_ng_template_23_td_3_ng_template_3_ng_container_0_Template","column_r48","_c4","depth_r39","CollectionDataTableComponent_ng_template_23_td_3_ng_container_2_Template","CollectionDataTableComponent_ng_template_23_td_3_ng_template_3_Template","ctx_r42","customComponents","_r50","CollectionDataTableComponent_ng_template_23_ng_container_5_ng_container_1_Template","subCollection_r59","CollectionDataTableComponent_ng_template_23_td_2_Template","CollectionDataTableComponent_ng_template_23_td_3_Template","CollectionDataTableComponent_ng_template_23_ng_container_5_Template","_c5","getSubcollections","CollectionDataTableComponent","DataTable2Component","localStorageService","dragDrop","changeOrder","dragRefs","sortPredicate","dropList","getSortedItems","subCollections","allCollections","subCollectionMatches","forEach","collectionRowList","removeItem","ref","toArray","dropContainer","_dragRef","_withDropContainer","_dropListRef","addItem","onDrop","isTopLevel","breadcrumbs","pageIndexOffset","parentIndex","findIndex","adjustedIndex","currentIndex","splice","previousIndex","adjustedPreviousIndex","CdkDropList","CdkDrag","CollectionDataTableComponent_vdr_data_table_filter_presets_0_Template","CollectionDataTableComponent_th_7_Template","CollectionDataTableComponent_th_8_Template","onColumnReorder","onColumnsReset","CollectionDataTableComponent_tr_13_Template","CollectionDataTableComponent_ng_container_15_Template","CollectionDataTableComponent_tr_18_Template","CollectionDataTableComponent_vdr_items_per_page_controls_20_Template","CollectionDataTableComponent_div_21_Template","CollectionDataTableComponent_vdr_pagination_controls_22_Template","CollectionDataTableComponent_ng_template_23_Template","disableSelect","selection","uiLanguage$","sortedColumns","_c7","trackByFn","_r17","create","ctx_r18","assetsChanged","CollectionDetailComponent_ng_template_11_button_0_Template","entity_r21","breadcrumb_r24","CollectionDetailComponent_vdr_page_block_28_li_3_a_1_Template","CollectionDetailComponent_vdr_page_block_28_li_3_a_2_Template","CollectionDetailComponent_vdr_page_block_28_li_3_ng_container_3_Template","isFirst_r25","isLast_r26","CollectionDetailComponent_vdr_page_block_28_li_3_Template","entity_r22","removeFilter","filter_r32","ctx_r12","getFilterDefinition","filter_r37","_r39","ctx_r38","addFilter","description","CollectionDetailComponent_div_64_button_9_Template","allFilters","_r42","toggleLivePreview","count_r40","tmp_1_0","tmp_3_0","livePreview","COLLECTION_DETAIL_QUERY","COLLECTION_FRAGMENT","CollectionDetailComponent","slug","unicodePatternValidator","visible","assetChanges","UpdateCollection","filterRemoved$","getCollectionFilters","collectionFilters","filtersFormArray","inheritFiltersControl","inheritFilters$","updatedFilters$","merge","statusChanges","touched","mapOperationsToInputs","_filter","arg","arguments","parentId$","pm","f","updateSlug","nameValue","slugControl","currentSlugIsEmpty","collectionFilter","filtersArray","argsHash","output","getConfigArgValue","removeAt","markAsTouched","getUpdatedCollection","isPrivate","createCollection","category","updateCollection","contentsComponent","set","JSON","stringify","patchValue","formArray","clear","featuredAssetId","operations","formValueOperations","j","encodeConfigArgValue","CollectionDetailComponent_button_9_Template","CollectionDetailComponent_ng_template_11_Template","CollectionDetailComponent_ng_container_23_Template","CollectionDetailComponent_ng_template_24_Template","CollectionDetailComponent_vdr_card_26_Template","CollectionDetailComponent_vdr_page_block_28_Template","CollectionDetailComponent_vdr_card_46_Template","CollectionDetailComponent_ng_container_59_Template","CollectionDetailComponent_ng_template_60_Template","CollectionDetailComponent_ng_container_63_Template","CollectionDetailComponent_div_64_Template","CollectionDetailComponent_ng_template_72_Template","isNew$","_r4","CollectionBreadcrumbPipe","transform","collection_r5","depth_r7","_r16","collection_r6","toggleExpanded","MoveCollectionsDialogComponent_ng_template_14_button_2_clr_icon_1_Template","MoveCollectionsDialogComponent_ng_template_14_button_2_clr_icon_2_Template","expandedIds","pure","MoveCollectionsDialogComponent_ng_template_14_clr_icon_1_Template","MoveCollectionsDialogComponent_ng_template_14_button_2_Template","MoveCollectionsDialogComponent_ng_template_14_button_3_Template","_r19","item_r26","MoveCollectionsDialogComponent_ng_template_17_ng_container_1_ng_container_1_div_1_Template","breadcrumbs_r22","MoveCollectionsDialogComponent_ng_template_17_ng_container_1_ng_container_1_Template","MoveCollectionsDialogComponent_ng_template_17_ng_container_1_span_2_Template","MoveCollectionsDialogComponent_ng_template_17_ng_container_1_Template","collection_r20","collection_r28","MoveCollectionsDialogComponent","i18nService","expandedIds$","getCollectionsResult","getCollections","topLevelOnly","refetch","rootCollectionId$","collections","rootCollectionId","translate","position","subCollections$","MoveCollectionsDialogComponent_ng_template_0_Template","MoveCollectionsDialogComponent_ng_template_11_Template","MoveCollectionsDialogComponent_ng_template_14_Template","MoveCollectionsDialogComponent_ng_template_17_Template","MoveCollectionsDialogComponent_ng_template_20_Template","deleteCollectionsBulkAction","createBulkDeleteAction","location","requiresPermission","userPermissions","DeleteCollection","DeleteCatalog","getItemName","bulkDelete","deleteCollections","moveCollectionsBulkAction","icon","onClick","hostComponent","clearSelection","ModalService","NotificationService","inputs","moveCollection","assignCollectionsToChannelBulkAction","createBulkAssignToChannelAction","bulkAssignToChannel","collectionIds","assignCollectionsToChannel","removeCollectionsFromChannelBulkAction","createBulkRemoveFromChannelAction","bulkRemoveFromChannel","removeCollectionsFromChannel","collection_r13","collection_r14","collection_r15","collection_r16","depth_r18","_r26","collection_r17","CollectionListComponent_ng_template_11_ng_template_24_button_2_clr_icon_1_Template","CollectionListComponent_ng_template_11_ng_template_24_button_2_clr_icon_2_Template","ctx_r20","CollectionListComponent_ng_template_11_ng_template_24_clr_icon_1_Template","CollectionListComponent_ng_template_11_ng_template_24_button_2_Template","item_r34","CollectionListComponent_ng_template_11_ng_template_27_ng_container_1_ng_container_1_div_1_Template","breadcrumbs_r30","CollectionListComponent_ng_template_11_ng_template_27_ng_container_1_ng_container_1_Template","CollectionListComponent_ng_template_11_ng_template_27_ng_container_1_span_2_Template","CollectionListComponent_ng_template_11_ng_template_27_ng_container_1_Template","collection_r36","CollectionListComponent_ng_template_11_ng_template_33_vdr_chip_0_Template","CollectionListComponent_ng_template_11_ng_template_33_vdr_chip_1_Template","collection_r37","collection_r40","customField_r41","sorts","_r43","ctx_r45","onRearrange","CollectionListComponent_ng_template_11_ng_template_12_Template","CollectionListComponent_ng_template_11_ng_template_15_Template","CollectionListComponent_ng_template_11_ng_template_18_Template","CollectionListComponent_ng_template_11_ng_template_21_Template","CollectionListComponent_ng_template_11_ng_template_24_Template","CollectionListComponent_ng_template_11_ng_template_27_Template","CollectionListComponent_ng_template_11_ng_template_30_Template","CollectionListComponent_ng_template_11_ng_template_33_Template","CollectionListComponent_ng_template_11_ng_template_36_Template","CollectionListComponent_ng_template_11_vdr_dt2_custom_field_column_37_Template","activeCollectionIndex$","ctx_r46","activeCollectionId$","CollectionListComponent_ng_template_12_ng_container_0_Template","CollectionListComponent","TypedBaseListComponent","createFilterCollection","addIdFilter","addDateFilters","kind","filterField","toFilterInput","eq","addCustomFieldFilters","connectToRoute","createSortCollection","defaultSort","addSort","addCustomFieldSorts","configure","document","GetCollectionListDocument","getItems","setVariables","_take","createFilterInput","createSortInput","refreshListOnChanges","activeCollectionTitle$","match","closeContents","contents","setContentLanguage","expanded","CollectionListComponent_a_8_Template","CollectionListComponent_ng_template_11_Template","CollectionListComponent_ng_template_12_Template","contentLanguage$","CollectionTreeService","allMoveListItems","_rearrange$","_delete$","rearrange$","delete$","setCollectionTree","tree","collectionTree","resetMoveList","getMoveListItems","calculateAllMoveListItems","ancestorIdPath","has","newParentId","onMove","onDelete","visit","node","parentPath","child","Set","collection_r2","CollectionTreeNodeComponent_div_3_button_5_clr_icon_1_Template","CollectionTreeNodeComponent_div_3_button_5_clr_icon_2_Template","expandAll","item_r19","move","hasUpdatePermission$","activeCollectionId","toggleSelection","CollectionTreeNodeComponent_div_3_button_5_Template","CollectionTreeNodeComponent_div_3_ng_template_6_Template","CollectionTreeNodeComponent_div_3_vdr_chip_10_Template","CollectionTreeNodeComponent_div_3_div_19_Template","CollectionTreeNodeComponent_div_3_a_24_Template","restoredCtx","i_r3","moveUp","moveDown","CollectionTreeNodeComponent_div_3_button_39_Template","ctx_r29","delete","CollectionTreeNodeComponent_div_3_vdr_collection_tree_node_46_Template","depth","_r5","_c6","moveListItems","hasDeletePermission$","CollectionTreeNodeComponent","collectionTreeService","parentName","permissions$","permissions","perms","selectionChanges$","expandAllChange","previousValue","drop","arrayToTree","nodes","currentState","topLevelNodes","mappedArr","currentStateMap","treeToMap","nodeMap","Map","hasOwnProperty","mappedElem","CollectionTreeNodeComponent_div_3_Template","i5","i14","styles","changeDetection","CollectionTreeComponent","rearrange","deleteCollection","variant_r3","outputs","CollectionTreeComponent_vdr_collection_tree_node_0_Template","ConfirmVariantDeletionDialogComponent","ConfirmVariantDeletionDialogComponent_ng_template_0_Template","ConfirmVariantDeletionDialogComponent_li_4_Template","ConfirmVariantDeletionDialogComponent_ng_template_5_Template","FacetDetailComponent_ng_template_11_button_0_Template","entity_r14","filterControl","customValueFields","value_r21","updateValueCode","FacetDetailComponent_vdr_card_42_ng_container_3_tr_14_td_8_Template","deleteFacetValue","FacetDetailComponent_vdr_card_42_ng_container_3_ng_container_11_Template","FacetDetailComponent_vdr_card_42_ng_container_3_tr_14_Template","filteredValues_r18","_r32","addFacetValue","FacetDetailComponent_vdr_card_42_ng_template_2_Template","FacetDetailComponent_vdr_card_42_ng_container_3_Template","FacetDetailComponent_vdr_card_42_button_6_Template","filteredValues$","FACET_DETAIL_QUERY","FACET_WITH_VALUES_FRAGMENT","FacetDetailComponent","facet","values$","Observable","UpdateFacet","filterString","currentCode","valueId","customValueFieldIsSet","valuesFormRecord","createTempId","valueGroup","newValue","fieldDef","endOfPageIndex","facetForm","newFacet","getUpdatedFacet","createFacet","updateFacet","createdValues","getCreatedFacetValues","createFacetValues","GetFacetDetailDocument","updatedValues","getUpdatedFacetValues","updateFacetValues","isTempId","removeControl","deleted","deleteFacetValues","currentValuesFormGroup","valueTranslation","valueControl","fieldValue","facetFormGroup","facetId","valuesFormGroup","dirtyValues","formRow","dirtyValueValues","Math","random","toString","startsWith","FacetDetailComponent_button_9_Template","FacetDetailComponent_ng_template_11_Template","FacetDetailComponent_ng_container_23_Template","FacetDetailComponent_ng_template_24_Template","FacetDetailComponent_vdr_page_entity_info_27_Template","FacetDetailComponent_vdr_card_40_Template","FacetDetailComponent_vdr_card_42_Template","deleteFacetsBulkAction","DeleteFacet","shouldRetryItem","retrying","deleteFacets","assignFacetsToChannelBulkAction","facetIds","assignFacetsToChannel","removeFacetsFromChannelBulkAction","removeFacetsFromChannel","isErrorResult","removeFacetsFromChannelBulkAction2","getTranslationVars","getChannelCodeFromUserStatus","iconClass","isVisible","currentChannelIsNotDefault","res2","removedCount","errors","errorIds","result2","notRemovedCount","then","channelCode","facet_r9","facet_r10","facet_r11","facet_r12","facet_r13","FacetListComponent_ng_template_34_vdr_chip_0_Template","FacetListComponent_ng_template_34_vdr_chip_1_Template","facet_r14","facet_r17","valueList","initialLimit","toggleDisplayLimit","FacetListComponent_ng_template_37_button_4_ng_container_1_Template","FacetListComponent_ng_template_37_button_4_ng_template_2_Template","displayLimit","FacetListComponent_ng_template_37_vdr_facet_value_chip_1_Template","FacetListComponent_ng_template_37_vdr_chip_3_Template","FacetListComponent_ng_template_37_button_4_Template","customField_r31","FACET_LIST_QUERY","FACET_WITH_VALUE_LIST_FRAGMENT","FacetListComponent","GetFacetListDocument","facets","FacetListComponent_a_8_Template","FacetListComponent_ng_template_19_Template","FacetListComponent_ng_template_22_Template","FacetListComponent_ng_template_25_Template","FacetListComponent_ng_template_28_Template","FacetListComponent_ng_template_31_Template","FacetListComponent_ng_template_34_Template","FacetListComponent_ng_template_37_Template","FacetListComponent_vdr_dt2_custom_field_column_38_Template","group_r2","_r6","handleEnter","generateVariants","location_r17","selectedStockLocationId","GenerateProductVariantsComponent_ng_container_5_vdr_form_field_3_option_3_Template","stockLocations_r12","variant_r24","GenerateProductVariantsComponent_ng_container_5_div_4_tr_15_td_1_Template","GenerateProductVariantsComponent_ng_container_5_div_4_tr_15_td_2_Template","variantFormValues","GenerateProductVariantsComponent_ng_container_5_div_4_th_4_Template","GenerateProductVariantsComponent_ng_container_5_div_4_th_5_Template","GenerateProductVariantsComponent_ng_container_5_div_4_tr_15_Template","GenerateProductVariantsComponent_ng_container_5_clr_alert_1_Template","GenerateProductVariantsComponent_ng_container_5_vdr_form_field_3_Template","GenerateProductVariantsComponent_ng_container_5_div_4_Template","DEFAULT_VARIANT_CODE","GenerateProductVariantsComponent","variantsChange","stockLocations$","GetStockLocationListDocument","stockLocations","groupNameInputs","sum","generateAllCombinations","nonNullable","copyFromDefault","onFormChange","copyValuesToPristine","optionValueInputComponent","stopPropagation","formControl","correspondingFormControl","emitEvent","variantsToCreate","prop","GenerateProductVariantsComponent_div_0_Template","GenerateProductVariantsComponent_ng_container_5_Template","variant_r14","variant_r15","variant_r16","asset_r21","ProductVariantListComponent_ng_template_20_img_1_Template","ProductVariantListComponent_ng_template_20_ng_template_2_Template","variant_r17","variant_r23","ProductVariantListComponent_ng_template_29_vdr_chip_0_Template","ProductVariantListComponent_ng_template_29_vdr_chip_1_Template","variant_r27","variant_r28","stockLevel_r31","stockAllocated","ProductVariantListComponent_ng_template_38_vdr_chip_0_span_4_Template","stockLocation","ProductVariantListComponent_ng_template_38_vdr_chip_0_Template","variant_r29","field_r34","ProductVariantListComponent","hideLanguageSelect","addFilters","inputType","addSorts","ProductVariantListQueryDocument","dataTableId","ProductVariantListComponent_vdr_page_block_0_Template","ProductVariantListComponent_ng_template_11_Template","ProductVariantListComponent_ng_template_14_Template","ProductVariantListComponent_ng_template_17_Template","ProductVariantListComponent_ng_template_20_Template","ProductVariantListComponent_ng_template_23_Template","ProductVariantListComponent_ng_template_26_Template","ProductVariantListComponent_ng_template_29_Template","ProductVariantListComponent_ng_template_32_Template","ProductVariantListComponent_ng_template_35_Template","ProductVariantListComponent_ng_template_38_Template","ProductVariantListComponent_vdr_dt2_custom_field_column_39_Template","ProductDetailComponent_ng_template_12_button_0_Template","channel_r23","removeFromChannel","ProductDetailComponent_ng_container_21_vdr_card_1_vdr_form_item_2_ng_container_3_vdr_chip_1_Template","ctx_r22","isDefaultChannel","ProductDetailComponent_ng_container_21_vdr_card_1_vdr_form_item_2_ng_container_3_Template","_r30","assignToChannel","productChannels$","ProductDetailComponent_ng_container_21_vdr_card_1_vdr_form_item_2_Template","ProductDetailComponent_ng_container_21_vdr_card_1_Template","optionGroup_r33","ProductDetailComponent_vdr_card_23_vdr_chip_3_Template","ProductDetailComponent_vdr_card_23_a_6_Template","facetValue_r34","_r36","removeProductFacetValue","_r38","ctx_r37","selectProductFacetValue","entity_r39","_r41","ctx_r40","GET_PRODUCT_DETAIL","PRODUCT_DETAIL_FRAGMENT","ProductDetailComponent","productFacetValues$","formFacetValueIdChanges$","getFacetValues","facetValues$","DEFAULT_CHANNEL_CODE","removeProductsFromChannel","assignVariantToChannel","removeVariantFromChannel","removeVariantsFromChannel","displayFacetValueModal","productGroup","currentFacetValueIds","newProduct","getUpdatedProduct","console","updateSlugAfterSave","productFormGroup","results","firstResult","isUpdateMutation","ProductDetailComponent_button_10_Template","ProductDetailComponent_ng_template_12_Template","ProductDetailComponent_clr_toggle_wrapper_20_Template","ProductDetailComponent_ng_container_21_Template","ProductDetailComponent_vdr_card_23_Template","ProductDetailComponent_vdr_facet_value_chip_27_Template","ProductDetailComponent_button_30_Template","ProductDetailComponent_vdr_card_31_Template","ProductDetailComponent_div_42_Template","ProductDetailComponent_vdr_card_54_Template","ProductDetailComponent_div_62_Template","ProductDetailComponent_ng_template_64_Template","ProductDetailComponent_div_66_Template","tmp_16_0","deleteProductsBulkAction","DeleteProduct","deleteProducts","assignProductsToChannelBulkAction","isMultiChannel","removeProductsFromChannelBulkAction","assignFacetValuesToProductsBulkAction","product_r10","product_r11","product_r12","asset_r17","ProductListComponent_ng_template_36_img_1_Template","ProductListComponent_ng_template_36_ng_template_2_Template","product_r13","product_r18","product_r19","ProductListComponent_ng_template_45_vdr_chip_0_Template","ProductListComponent_ng_template_45_vdr_chip_1_Template","product_r20","product_r23","variantList","customField_r24","ProductListComponent","jobQueueService","pendingSearchIndexUpdates","FacetValueFormInputComponent","serializeValue","deserializeValue","getLabel","ProductListQueryDocument","rebuildSearchIndex","reindex","info","addJob","job","JobState","COMPLETED","time","Intl","NumberFormat","format","duration","indexedItemCount","deleteProduct","delay","ProductListComponent_a_8_Template","ProductListComponent_ng_template_27_Template","ProductListComponent_ng_template_30_Template","ProductListComponent_ng_template_33_Template","ProductListComponent_ng_template_36_Template","ProductListComponent_ng_template_39_Template","ProductListComponent_ng_template_42_Template","ProductListComponent_ng_template_45_Template","ProductListComponent_ng_template_48_Template","ProductListComponent_vdr_dt2_custom_field_column_49_Template","taxRate$","grossPrice$","VariantPriceDetailComponent","priceChange$","taxCategoryIdChange$","taxRates$","getTaxRatesSimple","taxRates","activeChannel$","taxCategoryId","defaultTaxZone","applicableRate","taxRate","zone","round","item_r2","selectedVariantId","onSelect","ProductVariantQuickJumpComponent_ng_select_0_ng_template_3_Template","searchFn","priceIncludesTax","VariantPriceDetailComponent_div_3_Template","VariantPriceDetailComponent_div_4_Template","ProductVariantQuickJumpComponent","GetProductVariantsQuickJumpDocument","ProductVariantQuickJumpComponent_ng_select_0_Template","tmp_0_0","availableLanguages_r3","ProductVariantDetailComponent_ng_container_4_vdr_language_selector_1_Template","stockLevelsForm","pricesForm","optionGroupCode","option_r24","ProductVariantDetailComponent_form_10_vdr_card_7_vdr_chip_3_Template","ProductVariantDetailComponent_form_10_vdr_card_7_a_6_Template","facetValue_r26","_r28","selectFacetValue","entity_r31","taxCategory_r32","price_r33","toggleDeletePrice","channelDefaultCurrencyCode","ProductVariantDetailComponent_form_10_div_43_div_7_Template","channelPriceIncludesTax$","currencyCode_r42","addPriceInCurrency","ProductVariantDetailComponent_form_10_ng_container_44_div_1_button_8_Template","unusedCurrencyCodes_r39","ProductVariantDetailComponent_form_10_ng_container_44_div_1_Template","stockLevel_r46","tmp_2_0","tmp_5_0","tmp_6_0","stockLocation_r50","_r52","ctx_r51","addStockLocation","ProductVariantDetailComponent_form_10_ng_container_75_div_1_button_8_Template","unusedStockLocations_r47","ProductVariantDetailComponent_form_10_ng_container_75_div_1_Template","ProductVariantDetailComponent_form_10_clr_toggle_wrapper_6_Template","ProductVariantDetailComponent_form_10_vdr_card_7_Template","ProductVariantDetailComponent_form_10_vdr_facet_value_chip_11_Template","ProductVariantDetailComponent_form_10_button_14_Template","ProductVariantDetailComponent_form_10_vdr_page_entity_info_16_Template","ProductVariantDetailComponent_form_10_vdr_card_30_Template","_r55","ctx_r54","ProductVariantDetailComponent_form_10_option_41_Template","ProductVariantDetailComponent_form_10_div_43_Template","ProductVariantDetailComponent_form_10_ng_container_44_Template","ProductVariantDetailComponent_form_10_div_74_Template","ProductVariantDetailComponent_form_10_ng_container_75_Template","taxCategories$","unusedCurrencyCodes$","GlobalFlag","TRUE","FALSE","INHERIT","tmp_37_0","inventoryIsNotTracked","globalOutOfStockThreshold","unusedStockLocation$","ProductVariantDetailComponent","customOptionFields","useGlobalOutOfStockThreshold","outOfStockThreshold","trackInventory","getGlobalSettings","globalSettings","globalTrackInventory","result$","availableCurrencyCodes$","availableCurrencyCodes","prices","currencyCodes","usedIds","l","pricesIncludeTax","stockLevels$","switchMapTo","innerObservable","resultSelector","isFunction","deleteFormControl","stockLocationName","pick","getUpdatedVariant","ProductVariantUpdateMutationDocument","taxCategory","stockLevel","variantFormGroup","ProductVariantDetailComponent_ng_container_4_Template","ProductVariantDetailComponent_button_9_Template","ProductVariantDetailComponent_form_10_Template","assignProductVariantsToChannelBulkAction","removeProductVariantsFromChannelBulkAction","removeProductVariantsFromChannel","deleteProductVariantsBulkAction","deleteProductVariants","optionGroup_r2","featuredAsset_r13","optionGroupName","option_r14","formGroup_r6","ProductVariantsTableComponent_tr_22_ng_container_1_img_4_Template","ProductVariantsTableComponent_tr_22_ng_container_1_ng_template_5_Template","ProductVariantsTableComponent_tr_22_ng_container_1_ng_container_17_Template","ProductVariantsTableComponent_tr_22_ng_container_1_vdr_currency_input_21_Template","ProductVariantsTableComponent_tr_22_ng_container_1_vdr_currency_input_22_Template","getFeaturedAsset","channelPriceIncludesTax","ProductVariantsTableComponent_tr_22_ng_container_1_Template","formGroupMap","ProductVariantsTableComponent","buildFormGroupMap","pendingAssetChanges","controlGroup","paginationConfig","ProductVariantsTableComponent_ng_container_10_Template","ProductVariantsTableComponent_tr_22_Template","customFieldsForm","update","UpdateProductOptionDialogComponent","updateVariantName","codeInputTouched","productOption","activeLanguage","cfCurrentTranslation","UpdateProductOptionDialogComponent_ng_template_0_Template","UpdateProductOptionDialogComponent_section_14_Template","UpdateProductOptionDialogComponent_ng_template_15_Template","CatalogModule","bulkActionRegistryService","hasRegisteredTabsAndBulkActions","registerBulkAction","registerPageTab","priority","tab","detailComponentWithResolver","GetProductDetailDocument","entityKey","getBreadcrumbs","GetProductVariantDetailDocument","CollectionDetailQueryDocument","AssetDetailQueryDocument","ROUTES","useFactory","deps","PageService","imports","SharedModule","RouterModule","forChild","PRODUCT_LIST_QUERY_PRODUCT_FRAGMENT","PRODUCT_LIST_QUERY","PRODUCT_VARIANT_DETAIL_QUERY_PRODUCT_VARIANT_FRAGMENT","PRODUCT_VARIANT_DETAIL_QUERY","PRODUCT_VARIANT_UPDATE_MUTATION","PRODUCT_VARIANT_LIST_QUERY_PRODUCT_VARIANT_FRAGMENT","PRODUCT_VARIANT_LIST_QUERY"],"sourceRoot":"webpack:///","sources":["./src/lib/catalog/src/providers/product-detail/replace-last.ts","./src/lib/catalog/src/providers/product-detail/product-detail.service.ts","./src/lib/catalog/src/components/product-options-editor/product-options-editor.component.html","./src/lib/catalog/src/components/product-options-editor/product-options-editor.component.ts","./src/lib/catalog/src/components/create-product-option-group-dialog/create-product-option-group-dialog.component.html","./src/lib/catalog/src/components/create-product-option-group-dialog/create-product-option-group-dialog.component.ts","./src/lib/catalog/src/components/create-product-variant-dialog/create-product-variant-dialog.component.html","./src/lib/catalog/src/components/create-product-variant-dialog/create-product-variant-dialog.component.ts","./src/lib/catalog/src/components/option-value-input/option-value-input.component.html","./src/lib/catalog/src/components/option-value-input/option-value-input.component.ts","./src/lib/catalog/src/components/product-variants-editor/product-variants-editor.component.html","./src/lib/catalog/src/components/product-variants-editor/product-variants-editor.component.ts","./src/lib/catalog/src/providers/routing/product-variants-resolver.ts","./src/lib/catalog/src/catalog.routes.ts","./src/lib/catalog/src/components/apply-facet-dialog/apply-facet-dialog.component.html","./src/lib/catalog/src/components/apply-facet-dialog/apply-facet-dialog.component.ts","./src/lib/catalog/src/components/asset-detail/asset-detail.component.html","./src/lib/catalog/src/components/asset-detail/asset-detail.component.ts","./src/lib/catalog/src/components/asset-list/asset-list.component.ts","./src/lib/catalog/src/components/asset-list/asset-list.component.html","./src/lib/catalog/src/components/assets/assets.component.html","./src/lib/catalog/src/components/assets/assets.component.ts","./src/lib/catalog/src/components/assign-products-to-channel-dialog/assign-products-to-channel-dialog.component.html","./src/lib/catalog/src/components/assign-products-to-channel-dialog/assign-products-to-channel-dialog.component.ts","./src/lib/catalog/src/components/bulk-add-facet-values-dialog/bulk-add-facet-values-dialog.graphql.ts","./src/lib/catalog/src/components/bulk-add-facet-values-dialog/bulk-add-facet-values-dialog.component.html","./src/lib/catalog/src/components/bulk-add-facet-values-dialog/bulk-add-facet-values-dialog.component.ts","./src/lib/catalog/src/components/collection-contents/collection-contents.component.html","./src/lib/catalog/src/components/collection-contents/collection-contents.component.ts","./src/lib/catalog/src/components/collection-data-table/collection-data-table.component.html","./src/lib/catalog/src/components/collection-data-table/collection-data-table.component.ts","./src/lib/catalog/src/components/collection-detail/collection-detail.component.html","./src/lib/catalog/src/components/collection-detail/collection-detail.component.ts","./src/lib/catalog/src/components/collection-list/collection-breadcrumb.pipe.ts","./src/lib/catalog/src/components/move-collections-dialog/move-collections-dialog.component.html","./src/lib/catalog/src/components/move-collections-dialog/move-collections-dialog.component.ts","./src/lib/catalog/src/components/collection-list/collection-list-bulk-actions.ts","./src/lib/catalog/src/components/collection-list/collection-list.component.html","./src/lib/catalog/src/components/collection-list/collection-list.component.ts","./src/lib/catalog/src/components/collection-tree/collection-tree.service.ts","./src/lib/catalog/src/components/collection-tree/collection-tree-node.component.html","./src/lib/catalog/src/components/collection-tree/collection-tree-node.component.ts","./src/lib/catalog/src/components/collection-tree/array-to-tree.ts","./src/lib/catalog/src/components/collection-tree/collection-tree.component.html","./src/lib/catalog/src/components/collection-tree/collection-tree.component.ts","./src/lib/catalog/src/components/confirm-variant-deletion-dialog/confirm-variant-deletion-dialog.component.html","./src/lib/catalog/src/components/confirm-variant-deletion-dialog/confirm-variant-deletion-dialog.component.ts","./src/lib/catalog/src/components/facet-detail/facet-detail.component.html","./src/lib/catalog/src/components/facet-detail/facet-detail.component.ts","./src/lib/catalog/src/components/facet-list/facet-list-bulk-actions.ts","./src/lib/catalog/src/components/facet-list/facet-list.component.html","./src/lib/catalog/src/components/facet-list/facet-list.component.ts","./src/lib/catalog/src/components/generate-product-variants/generate-product-variants.component.html","./src/lib/catalog/src/components/generate-product-variants/generate-product-variants.component.ts","./src/lib/catalog/src/components/product-variant-list/product-variant-list.component.html","./src/lib/catalog/src/components/product-variant-list/product-variant-list.component.ts","./src/lib/catalog/src/components/product-detail/product-detail.component.html","./src/lib/catalog/src/components/product-detail/product-detail.component.ts","./src/lib/catalog/src/components/product-list/product-list-bulk-actions.ts","./src/lib/catalog/src/components/product-list/product-list.component.html","./src/lib/catalog/src/components/product-list/product-list.component.ts","./src/lib/catalog/src/components/variant-price-detail/variant-price-detail.component.html","./src/lib/catalog/src/components/variant-price-detail/variant-price-detail.component.ts","./src/lib/catalog/src/components/product-variant-quick-jump/product-variant-quick-jump.component.html","./src/lib/catalog/src/components/product-variant-quick-jump/product-variant-quick-jump.component.ts","./src/lib/catalog/src/components/product-variant-detail/product-variant-detail.component.html","./src/lib/catalog/src/components/product-variant-detail/product-variant-detail.component.ts","../node_modules/rxjs/dist/esm/internal/operators/switchMapTo.js","./src/lib/catalog/src/components/product-variant-list/product-variant-list-bulk-actions.ts","./src/lib/catalog/src/components/product-variants-table/product-variants-table.component.html","./src/lib/catalog/src/components/product-variants-table/product-variants-table.component.ts","./src/lib/catalog/src/components/update-product-option-dialog/update-product-option-dialog.component.html","./src/lib/catalog/src/components/update-product-option-dialog/update-product-option-dialog.component.ts","./src/lib/catalog/src/catalog.module.ts","./src/lib/catalog/src/components/product-list/product-list.graphql.ts","./src/lib/catalog/src/components/product-variant-detail/product-variant-detail.graphql.ts","./src/lib/catalog/src/components/product-variant-list/product-variant-list.graphql.ts"],"sourcesContent":["/**\r\n * @description\r\n * Like String.prototype.replace(), but replaces the last instance\r\n * rather than the first.\r\n */\r\nexport function replaceLast(target: string | undefined | null, search: string, replace: string): string {\r\n if (!target) {\r\n return '';\r\n }\r\n const lastIndex = target.lastIndexOf(search);\r\n if (lastIndex === -1) {\r\n return target;\r\n }\r\n const head = target.substr(0, lastIndex);\r\n const tail = target.substr(lastIndex).replace(search, replace);\r\n return head + tail;\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport {\r\n CreateProductInput,\r\n CreateProductVariantInput,\r\n DataService,\r\n DeletionResult,\r\n FacetWithValuesFragment,\r\n findTranslation,\r\n GetProductDetailQuery,\r\n GetProductWithVariantsQuery,\r\n LanguageCode,\r\n UpdateProductInput,\r\n UpdateProductMutation,\r\n UpdateProductOptionInput,\r\n UpdateProductVariantInput,\r\n UpdateProductVariantsMutation,\r\n} from '@vendure/admin-ui/core';\r\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\r\nimport { notNullOrUndefined } from '@vendure/common/lib/shared-utils';\r\nimport { forkJoin, Observable, of, throwError } from 'rxjs';\r\nimport { map, mergeMap, shareReplay, switchMap } from 'rxjs/operators';\r\n\r\nimport { CreateProductVariantsConfig } from '../../components/generate-product-variants/generate-product-variants.component';\r\n\r\nimport { replaceLast } from './replace-last';\r\n\r\n/**\r\n * Handles the logic for making the API calls to perform CRUD operations on a Product and its related\r\n * entities. This logic was extracted out of the component because it became too large and hard to follow.\r\n */\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ProductDetailService {\r\n constructor(private dataService: DataService) {}\r\n\r\n getTaxCategories() {\r\n return this.dataService.settings\r\n .getTaxCategories()\r\n .mapSingle(data => data.taxCategories.items)\r\n .pipe(shareReplay(1));\r\n }\r\n\r\n createProductWithVariants(\r\n input: CreateProductInput,\r\n createVariantsConfig: CreateProductVariantsConfig,\r\n languageCode: LanguageCode,\r\n ) {\r\n const createProduct$ = this.dataService.product.createProduct(input);\r\n const nonEmptyOptionGroups = createVariantsConfig.groups.filter(g => 0 < g.values.length);\r\n const createOptionGroups$ = this.createProductOptionGroups(nonEmptyOptionGroups, languageCode);\r\n\r\n return forkJoin(createProduct$, createOptionGroups$).pipe(\r\n mergeMap(([{ createProduct }, optionGroups]) => {\r\n const addOptionsToProduct$ = optionGroups.length\r\n ? forkJoin(\r\n optionGroups.map(optionGroup =>\r\n this.dataService.product.addOptionGroupToProduct({\r\n productId: createProduct.id,\r\n optionGroupId: optionGroup.id,\r\n }),\r\n ),\r\n )\r\n : of([]);\r\n return addOptionsToProduct$.pipe(map(() => ({ createProduct, optionGroups })));\r\n }),\r\n mergeMap(({ createProduct, optionGroups }) => {\r\n const variants = createVariantsConfig.variants.map(v => {\r\n const optionIds = optionGroups.length\r\n ? v.optionValues.map((optionName, index) => {\r\n const option = optionGroups[index].options.find(o => o.name === optionName);\r\n if (!option) {\r\n throw new Error(\r\n `Could not find a matching ProductOption \"${optionName}\" when creating variant`,\r\n );\r\n }\r\n return option.id;\r\n })\r\n : [];\r\n return {\r\n ...v,\r\n optionIds,\r\n };\r\n });\r\n const options = optionGroups.map(og => og.options).reduce((flat, o) => [...flat, ...o], []);\r\n return this.createProductVariants(\r\n createProduct,\r\n variants,\r\n options,\r\n languageCode,\r\n createVariantsConfig.stockLocationId,\r\n );\r\n }),\r\n );\r\n }\r\n\r\n createProductOptionGroups(groups: Array<{ name: string; values: string[] }>, languageCode: LanguageCode) {\r\n return groups.length\r\n ? forkJoin(\r\n groups.map(c =>\r\n this.dataService.product\r\n .createProductOptionGroups({\r\n code: normalizeString(c.name, '-'),\r\n translations: [{ languageCode, name: c.name }],\r\n options: c.values.map(v => ({\r\n code: normalizeString(v, '-'),\r\n translations: [{ languageCode, name: v }],\r\n })),\r\n })\r\n .pipe(map(data => data.createProductOptionGroup)),\r\n ),\r\n )\r\n : of([]);\r\n }\r\n\r\n createProductVariants(\r\n product: { name: string; id: string },\r\n variantData: Array<{ price: number; sku: string; stock: number; optionIds: string[] }>,\r\n options: Array<{ id: string; name: string }>,\r\n languageCode: LanguageCode,\r\n stockLocationId: string,\r\n ) {\r\n const variants: CreateProductVariantInput[] = variantData.map(v => {\r\n const name = options.length\r\n ? `${product.name} ${v.optionIds\r\n .map(id => options.find(o => o.id === id))\r\n .filter(notNullOrUndefined)\r\n .map(o => o.name)\r\n .join(' ')}`\r\n : product.name;\r\n return {\r\n productId: product.id,\r\n price: v.price,\r\n sku: v.sku,\r\n translations: [\r\n {\r\n languageCode,\r\n name,\r\n },\r\n ],\r\n stockLevels: [\r\n {\r\n stockLocationId,\r\n stockOnHand: v.stock,\r\n },\r\n ],\r\n optionIds: v.optionIds,\r\n };\r\n });\r\n return this.dataService.product.createProductVariants(variants).pipe(\r\n map(({ createProductVariants }) => ({\r\n createProductVariants,\r\n productId: product.id,\r\n })),\r\n );\r\n }\r\n\r\n updateProduct(updateOptions: {\r\n product: NonNullable<GetProductDetailQuery['product']>;\r\n languageCode: LanguageCode;\r\n autoUpdate: boolean;\r\n productInput?: UpdateProductInput;\r\n variantsInput?: UpdateProductVariantInput[];\r\n }) {\r\n const { product, languageCode, autoUpdate, productInput, variantsInput } = updateOptions;\r\n const updateOperations: Array<Observable<UpdateProductMutation | UpdateProductVariantsMutation>> = [];\r\n const updateVariantsInput = variantsInput || [];\r\n\r\n const variants$ = autoUpdate\r\n ? this.dataService.product\r\n .getProductVariantsForProduct({}, product.id)\r\n .mapSingle(({ productVariants }) => productVariants.items)\r\n : of([]);\r\n\r\n return variants$.pipe(\r\n mergeMap(variants => {\r\n if (productInput) {\r\n updateOperations.push(this.dataService.product.updateProduct(productInput));\r\n const productOldName = findTranslation(product, languageCode)?.name ?? '';\r\n const productNewName = findTranslation(productInput, languageCode)?.name;\r\n if (productNewName && productOldName !== productNewName && autoUpdate) {\r\n for (const variant of variants) {\r\n const currentVariantName = findTranslation(variant, languageCode)?.name || '';\r\n let variantInput: UpdateProductVariantInput;\r\n const existingVariantInput = updateVariantsInput.find(i => i.id === variant.id);\r\n if (existingVariantInput) {\r\n variantInput = existingVariantInput;\r\n } else {\r\n variantInput = {\r\n id: variant.id,\r\n translations: [{ languageCode, name: currentVariantName }],\r\n };\r\n updateVariantsInput.push(variantInput);\r\n }\r\n const variantTranslation = findTranslation(variantInput, languageCode);\r\n if (variantTranslation) {\r\n if (variantTranslation.name) {\r\n variantTranslation.name = replaceLast(\r\n variantTranslation.name,\r\n productOldName,\r\n productNewName,\r\n );\r\n } else {\r\n // The variant translation was falsy, which occurs\r\n // when defining the product name for a new translation\r\n // language that had not yet been defined.\r\n variantTranslation.name = [\r\n productNewName,\r\n ...variant.options.map(o => o.name),\r\n ].join(' ');\r\n }\r\n }\r\n }\r\n }\r\n }\r\n if (updateVariantsInput.length) {\r\n updateOperations.push(\r\n this.dataService.product.updateProductVariants(updateVariantsInput),\r\n );\r\n }\r\n return forkJoin(updateOperations);\r\n }),\r\n );\r\n }\r\n\r\n updateProductOption(\r\n input: UpdateProductOptionInput & { autoUpdate: boolean },\r\n product: NonNullable<GetProductDetailQuery['product']>,\r\n languageCode: LanguageCode,\r\n ) {\r\n const variants$ = input.autoUpdate\r\n ? this.dataService.product\r\n .getProductVariantsForProduct({}, product.id)\r\n .mapSingle(({ productVariants }) => productVariants.items)\r\n : of([]);\r\n\r\n return variants$.pipe(\r\n mergeMap(variants => {\r\n let updateProductVariantNames$: Observable<any> = of([]);\r\n if (input.autoUpdate) {\r\n // Update any ProductVariants' names which include the option name\r\n let oldOptionName: string | undefined;\r\n const newOptionName = findTranslation(input, languageCode)?.name;\r\n if (!newOptionName) {\r\n updateProductVariantNames$ = of([]);\r\n }\r\n const variantsToUpdate: UpdateProductVariantInput[] = [];\r\n for (const variant of variants) {\r\n if (variant.options.map(o => o.id).includes(input.id)) {\r\n if (!oldOptionName) {\r\n oldOptionName = findTranslation(\r\n variant.options.find(o => o.id === input.id),\r\n languageCode,\r\n )?.name;\r\n }\r\n const variantName = findTranslation(variant, languageCode)?.name || '';\r\n if (oldOptionName && newOptionName && variantName.includes(oldOptionName)) {\r\n variantsToUpdate.push({\r\n id: variant.id,\r\n translations: [\r\n {\r\n languageCode,\r\n name: replaceLast(variantName, oldOptionName, newOptionName),\r\n },\r\n ],\r\n });\r\n }\r\n }\r\n }\r\n if (variantsToUpdate.length) {\r\n updateProductVariantNames$ =\r\n this.dataService.product.updateProductVariants(variantsToUpdate);\r\n }\r\n }\r\n return this.dataService.product\r\n .updateProductOption(input)\r\n .pipe(mergeMap(() => updateProductVariantNames$));\r\n }),\r\n );\r\n }\r\n\r\n deleteProductVariant(id: string, productId: string) {\r\n return this.dataService.product.deleteProductVariant(id).pipe(\r\n switchMap(result => {\r\n if (result.deleteProductVariant.result === DeletionResult.DELETED) {\r\n return this.dataService.product.getProduct(productId).single$;\r\n } else {\r\n return throwError(result.deleteProductVariant.message);\r\n }\r\n }),\r\n );\r\n }\r\n}\r\n","<vdr-page-header>\r\n <vdr-page-title></vdr-page-title>\r\n <vdr-page-header-description>{{ 'catalog.page-description-options-editor' | translate }}</vdr-page-header-description>\r\n</vdr-page-header>\r\n<vdr-page-body>\r\n <vdr-page-block>\r\n <vdr-action-bar>\r\n <vdr-ab-left>\r\n <vdr-language-selector\r\n [availableLanguageCodes]=\"availableLanguages$ | async\"\r\n [currentLanguageCode]=\"languageCode$ | async\"\r\n (languageCodeChange)=\"setLanguage($event)\"\r\n ></vdr-language-selector>\r\n </vdr-ab-left>\r\n\r\n <vdr-ab-right>\r\n <div class=\"flex center\">\r\n <div class=\"mr-2\">\r\n <clr-checkbox-wrapper>\r\n <input\r\n clrCheckbox\r\n type=\"checkbox\"\r\n id=\"auto-update\"\r\n [(ngModel)]=\"autoUpdateVariantNames\"\r\n />\r\n <label>{{ 'catalog.auto-update-product-variant-name' | translate }}</label>\r\n </clr-checkbox-wrapper>\r\n </div>\r\n <button\r\n *vdrIfPermissions=\"updatePermission\"\r\n class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n [disabled]=\"detailForm.pristine || detailForm.invalid\"\r\n >\r\n {{ 'common.update' | translate }}\r\n </button>\r\n </div>\r\n </vdr-ab-right>\r\n </vdr-action-bar>\r\n </vdr-page-block>\r\n <vdr-page-block>\r\n <form class=\"form\" [formGroup]=\"detailForm\" *ngIf=\"optionGroups$ | async as optionGroups\">\r\n <div formGroupName=\"optionGroups\">\r\n <vdr-card\r\n *ngFor=\"let optionGroup of getOptionGroups(); index as i\"\r\n [formArrayName]=\"i\"\r\n [title]=\"optionGroup.value.code\"\r\n >\r\n <vdr-page-entity-info [entity]=\"optionGroup.value\"></vdr-page-entity-info>\r\n <div class=\"form-grid\">\r\n <vdr-form-field [label]=\"'common.name' | translate\" for=\"name\">\r\n <input\r\n [id]=\"'name-' + i\"\r\n type=\"text\"\r\n formControlName=\"name\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n />\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'common.code' | translate\" for=\"code\">\r\n <input\r\n [id]=\"'code-' + i\"\r\n type=\"text\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n formControlName=\"code\"\r\n />\r\n </vdr-form-field>\r\n </div>\r\n <ng-container formGroupName=\"customFields\" *ngIf=\"optionGroupCustomFields.length\">\r\n <vdr-tabbed-custom-fields\r\n entityName=\"ProductOptionGroup\"\r\n [customFields]=\"optionGroupCustomFields\"\r\n [customFieldsFormGroup]=\"optionGroup.get('customFields')\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n ></vdr-tabbed-custom-fields>\r\n </ng-container>\r\n\r\n <vdr-data-table-2\r\n id=\"edit-options-list\"\r\n *ngIf=\"getOptions(optionGroup) as options\"\r\n [items]=\"options\"\r\n [itemsPerPage]=\"paginationSettings[optionGroup.value.id]?.itemsPerPage\"\r\n [currentPage]=\"paginationSettings[optionGroup.value.id]?.currentPage\"\r\n (pageChange)=\"paginationSettings[optionGroup.value.id].currentPage = $event\"\r\n [totalItems]=\"options.length\"\r\n >\r\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\">\r\n <ng-template let-optionControl=\"item\">\r\n {{ optionControl.value.id }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.created-at' | translate\" id=\"created-at\" [hiddenByDefault]=\"true\">\r\n <ng-template let-optionControl=\"item\">\r\n {{ optionControl.value.createdAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.updated-at' | translate\" id=\"updated-at\" [hiddenByDefault]=\"true\">\r\n <ng-template let-optionControl=\"item\">\r\n {{ optionControl.value.updatedAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.name' | translate\" id=\"name\" [optional]=\"false\">\r\n <ng-template let-optionControl=\"item\">\r\n <input\r\n type=\"text\"\r\n [formControl]=\"optionControl.get('name')\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n />\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.code' | translate\" id=\"code\" [optional]=\"false\">\r\n <ng-template let-optionControl=\"item\">\r\n <input type=\"text\" [formControl]=\"optionControl.get('code')\" />\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column\r\n [heading]=\"'common.custom-fields' | translate\" id=\"custom-fields\"\r\n [hiddenByDefault]=\"optionCustomFields.length === 0\"\r\n >\r\n <ng-template let-optionControl=\"item\">\r\n <vdr-tabbed-custom-fields\r\n entityName=\"ProductOption\"\r\n [customFields]=\"optionCustomFields\"\r\n [compact]=\"true\"\r\n [customFieldsFormGroup]=\"optionControl.get('customFields')\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n ></vdr-tabbed-custom-fields>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n </vdr-data-table-2>\r\n </vdr-card>\r\n </div>\r\n </form>\r\n </vdr-page-block>\r\n</vdr-page-body>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core';\nimport { UntypedFormArray, UntypedFormBuilder, UntypedFormGroup } from '@angular/forms';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\nimport {\n BaseDetailComponent,\n createUpdatedTranslatable,\n CustomFieldConfig,\n DataService,\n findTranslation,\n GetProductVariantOptionsQuery,\n LanguageCode,\n NotificationService,\n Permission,\n ProductOptionFragment,\n ProductOptionGroupFragment,\n ServerConfigService,\n TranslationOf,\n UpdateProductOptionGroupInput,\n UpdateProductOptionInput,\n} from '@vendure/admin-ui/core';\nimport { combineLatest, forkJoin, Observable } from 'rxjs';\nimport { map, mergeMap, take, tap } from 'rxjs/operators';\n\nimport { ProductDetailService } from '../../providers/product-detail/product-detail.service';\n\ntype ProductWithOptions = NonNullable<GetProductVariantOptionsQuery['product']>;\n\n@Component({\n selector: 'vdr-product-options-editor',\n templateUrl: './product-options-editor.component.html',\n styleUrls: ['./product-options-editor.component.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class ProductOptionsEditorComponent extends BaseDetailComponent<ProductWithOptions> implements OnInit {\n detailForm: UntypedFormGroup;\n optionGroups$: Observable<ProductWithOptions['optionGroups']>;\n languageCode$: Observable<LanguageCode>;\n availableLanguages$: Observable<LanguageCode[]>;\n optionGroupCustomFields: CustomFieldConfig[];\n optionCustomFields: CustomFieldConfig[];\n autoUpdateVariantNames = true;\n paginationSettings: { [groupId: string]: { currentPage: number; itemsPerPage: number } } = {};\n readonly updatePermission = [Permission.UpdateCatalog, Permission.UpdateProduct];\n\n constructor(\n protected route: ActivatedRoute,\n protected router: Router,\n protected serverConfigService: ServerConfigService,\n protected dataService: DataService,\n private productDetailService: ProductDetailService,\n private formBuilder: UntypedFormBuilder,\n private changeDetector: ChangeDetectorRef,\n private notificationService: NotificationService,\n ) {\n super(route, router, serverConfigService, dataService);\n this.optionGroupCustomFields = this.getCustomFieldConfig('ProductOptionGroup');\n this.optionCustomFields = this.getCustomFieldConfig('ProductOption');\n }\n\n ngOnInit(): void {\n this.optionGroups$ = this.route.snapshot.data.entity.pipe(\n map((product: ProductWithOptions) => product.optionGroups),\n tap((optionGroups: ProductWithOptions['optionGroups']) => {\n for (const group of optionGroups) {\n this.paginationSettings[group.id] = {\n currentPage: 1,\n itemsPerPage: 10,\n };\n }\n }),\n );\n this.detailForm = new UntypedFormGroup({\n optionGroups: new UntypedFormArray([]),\n });\n super.init();\n }\n\n getOptionGroups(): UntypedFormGroup[] {\n const optionGroups = this.detailForm.get('optionGroups');\n return (optionGroups as UntypedFormArray).controls as UntypedFormGroup[];\n }\n\n getOptions(optionGroup: UntypedFormGroup): UntypedFormGroup[] {\n const options = optionGroup.get('options');\n return (options as UntypedFormArray).controls as UntypedFormGroup[];\n }\n\n save() {\n if (this.detailForm.invalid || this.detailForm.pristine) {\n return;\n }\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const $product = this.dataService.product.getProduct(this.id).mapSingle(data => data.product!);\n combineLatest(this.entity$, this.languageCode$, $product)\n .pipe(\n take(1),\n mergeMap(([{ optionGroups }, languageCode, product]) => {\n const updateOperations: Array<Observable<any>> = [];\n for (const optionGroupForm of this.getOptionGroups()) {\n if (optionGroupForm.dirty) {\n const optionGroupEntity = optionGroups.find(\n og => og.id === optionGroupForm.value.id,\n );\n if (optionGroupEntity) {\n const input = this.getUpdatedOptionGroup(\n optionGroupEntity,\n optionGroupForm,\n languageCode,\n );\n updateOperations.push(\n this.dataService.product.updateProductOptionGroup(input),\n );\n }\n }\n\n for (const optionForm of this.getOptions(optionGroupForm)) {\n if (optionForm.dirty) {\n const optionGroup = optionGroups\n .find(og => og.id === optionGroupForm.value.id)\n ?.options.find(o => o.id === optionForm.value.id);\n if (optionGroup) {\n const input = this.getUpdatedOption(\n optionGroup,\n optionForm,\n languageCode,\n );\n updateOperations.push(\n this.productDetailService.updateProductOption(\n { ...input, autoUpdate: this.autoUpdateVariantNames },\n product,\n languageCode,\n ),\n );\n }\n }\n }\n }\n return forkJoin(updateOperations);\n }),\n )\n .subscribe(\n () => {\n this.detailForm.markAsPristine();\n this.changeDetector.markForCheck();\n this.notificationService.success(_('common.notify-update-success'), {\n entity: 'ProductOptionGroup',\n });\n },\n err => {\n this.notificationService.error(_('common.notify-update-error'), {\n entity: 'ProductOptionGroup',\n });\n },\n );\n }\n\n private getUpdatedOptionGroup(\n optionGroup: ProductOptionGroupFragment,\n optionGroupFormGroup: UntypedFormGroup,\n languageCode: LanguageCode,\n ): UpdateProductOptionGroupInput {\n const input = createUpdatedTranslatable({\n translatable: optionGroup,\n updatedFields: optionGroupFormGroup.value,\n customFieldConfig: this.optionGroupCustomFields,\n languageCode,\n defaultTranslation: {\n languageCode,\n name: optionGroup.name || '',\n },\n });\n return input;\n }\n\n private getUpdatedOption(\n option: ProductOptionFragment,\n optionFormGroup: UntypedFormGroup,\n languageCode: LanguageCode,\n ): UpdateProductOptionInput {\n const input = createUpdatedTranslatable({\n translatable: option,\n updatedFields: optionFormGroup.value,\n customFieldConfig: this.optionCustomFields,\n languageCode,\n defaultTranslation: {\n languageCode,\n name: option.name || '',\n },\n });\n return input;\n }\n\n protected setFormValues(entity: ProductWithOptions, languageCode: LanguageCode): void {\n const groupsForm = this.detailForm.get('optionGroups') as UntypedFormArray;\n for (const optionGroup of entity.optionGroups) {\n const groupTranslation = findTranslation(optionGroup, languageCode);\n\n const groupForm = this.setOptionGroupForm(optionGroup, groupsForm, groupTranslation);\n this.setCustomFieldsForm(this.optionGroupCustomFields, groupForm, optionGroup, groupTranslation);\n\n let optionsForm = groupForm.get('options') as UntypedFormArray;\n if (!optionsForm) {\n optionsForm = this.formBuilder.array([]);\n groupForm.addControl('options', optionsForm);\n }\n for (const option of optionGroup.options) {\n const optionTranslation = findTranslation(option, languageCode);\n const optionForm = this.setOptionForm(option, optionsForm, optionTranslation);\n\n this.setCustomFieldsForm(this.optionCustomFields, optionForm, option, optionTranslation);\n }\n }\n }\n\n protected setCustomFieldsForm<\n T extends ProductWithOptions['optionGroups'][0] | ProductWithOptions['optionGroups'][0]['options'][0],\n >(\n customFields: CustomFieldConfig[],\n formGroup: UntypedFormGroup,\n entity: T,\n currentTranslation?: TranslationOf<T>,\n ) {\n if (customFields.length) {\n let customValueFieldsGroup = formGroup.get(['customFields']);\n if (!customValueFieldsGroup) {\n customValueFieldsGroup = this.formBuilder.group(\n customFields.reduce((hash, field) => ({ ...hash, [field.name]: '' }), {}),\n );\n formGroup.addControl('customFields', customValueFieldsGroup);\n }\n this.setCustomFieldFormValues(customFields, customValueFieldsGroup, entity, currentTranslation);\n }\n }\n\n protected setOptionGroupForm(\n entity: ProductWithOptions['optionGroups'][0],\n groupsForm: UntypedFormArray,\n currentTranslation?: TranslationOf<ProductWithOptions['optionGroups'][0]>,\n ) {\n const group = {\n id: entity.id,\n createdAt: entity.createdAt,\n updatedAt: entity.updatedAt,\n code: entity.code,\n name: currentTranslation?.name ?? '',\n };\n let groupForm = groupsForm.controls.find(control => control.value.id === entity.id) as\n | UntypedFormGroup\n | undefined;\n if (groupForm) {\n groupForm.get('id')?.setValue(group.id);\n groupForm.get('code')?.setValue(group.code);\n groupForm.get('name')?.setValue(group.name);\n groupForm.get('createdAt')?.setValue(group.createdAt);\n groupForm.get('updatedAt')?.setValue(group.updatedAt);\n } else {\n groupForm = this.formBuilder.group(group);\n groupsForm.push(groupForm);\n }\n return groupForm;\n }\n\n protected setOptionForm(\n entity: ProductWithOptions['optionGroups'][0]['options'][0],\n optionsForm: UntypedFormArray,\n currentTranslation?: TranslationOf<ProductWithOptions['optionGroups'][0]['options'][0]>,\n ) {\n const group = {\n id: entity.id,\n createdAt: entity.createdAt,\n updatedAt: entity.updatedAt,\n code: entity.code,\n name: currentTranslation?.name ?? '',\n };\n let optionForm = optionsForm.controls.find(control => control.value.id === entity.id) as\n | UntypedFormGroup\n | undefined;\n if (optionForm) {\n optionForm.get('id')?.setValue(group.id);\n optionForm.get('code')?.setValue(group.code);\n optionForm.get('name')?.setValue(group.name);\n optionForm.get('createdAt')?.setValue(group.createdAt);\n optionForm.get('updatedAt')?.setValue(group.updatedAt);\n } else {\n optionForm = this.formBuilder.group(group);\n optionsForm.push(optionForm);\n }\n return optionForm;\n }\n}\n","<ng-template vdrDialogTitle>\r\n {{ 'catalog.create-product-option-group' | translate }}\r\n</ng-template>\r\n<div class=\"form-grid\" [formGroup]=\"form\">\r\n <vdr-form-field [label]=\"'common.name' | translate\" for=\"name\">\r\n <input id=\"name\" type=\"text\" formControlName=\"name\" (input)=\"updateCode()\" />\r\n </vdr-form-field>\r\n <vdr-form-field\r\n [label]=\"'common.code' | translate\"\r\n for=\"code\"\r\n >\r\n <input\r\n id=\"code\"\r\n type=\"text\"\r\n formControlName=\"code\"\r\n />\r\n </vdr-form-field>\r\n</div>\r\n<ng-template vdrDialogButtons>\r\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\r\n <button type=\"submit\" (click)=\"confirm()\" class=\"btn btn-primary\" [disabled]=\"form.invalid\">\r\n {{ 'common.confirm' | translate }}\r\n </button>\r\n</ng-template>\r\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\r\nimport { FormBuilder, Validators } from '@angular/forms';\r\nimport {\r\n CreateProductOptionGroupInput,\r\n Dialog,\r\n findTranslation,\r\n GetProductVariantOptionsQuery,\r\n LanguageCode,\r\n ServerConfigService,\r\n} from '@vendure/admin-ui/core';\r\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\r\n\r\n@Component({\r\n selector: 'vdr-create-product-option-group-dialog',\r\n templateUrl: './create-product-option-group-dialog.component.html',\r\n styleUrls: ['./create-product-option-group-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CreateProductOptionGroupDialogComponent implements Dialog<CreateProductOptionGroupInput> {\r\n resolveWith: (result?: CreateProductOptionGroupInput) => void;\r\n languageCode: LanguageCode;\r\n form = this.formBuilder.group({\r\n name: ['', Validators.required],\r\n code: ['', Validators.required],\r\n });\r\n constructor(private formBuilder: FormBuilder) {}\r\n\r\n updateCode() {\r\n const nameControl = this.form.get('name');\r\n const codeControl = this.form.get('code');\r\n if (nameControl && codeControl && codeControl.pristine) {\r\n codeControl.setValue(normalizeString(`${nameControl.value}`, '-'));\r\n }\r\n }\r\n\r\n confirm() {\r\n const { name, code } = this.form.value;\r\n if (!name || !code) {\r\n return;\r\n }\r\n this.resolveWith({\r\n code,\r\n options: [],\r\n translations: [{ languageCode: this.languageCode, name }],\r\n });\r\n }\r\n\r\n cancel() {\r\n this.resolveWith();\r\n }\r\n}\r\n","<ng-template vdrDialogTitle>\r\n {{ 'catalog.create-product-variant' | translate }}\r\n</ng-template>\r\n<form [formGroup]=\"form\">\r\n <div formGroupName=\"options\" class=\"form-grid\">\r\n <vdr-form-field [label]=\"optionGroup.name\" *ngFor=\"let optionGroup of product.optionGroups\">\r\n <ng-select [items]=\"optionGroup.options\" [formControlName]=\"optionGroup.code\" bindLabel=\"name\"\r\n bindValue=\"id\" appendTo=\"body\">\r\n </ng-select>\r\n </vdr-form-field>\r\n <clr-alert *ngIf=\"product.optionGroups.length === 0\" clrAlertType=\"warning\" [clrAlertClosable]=\"false\"\r\n class=\"form-grid-span\">\r\n <clr-alert-item>\r\n <span class=\"alert-text\">\r\n {{ 'catalog.cannot-create-variants-without-options' | translate }}\r\n </span>\r\n </clr-alert-item>\r\n </clr-alert>\r\n </div>\r\n <div *ngIf=\"existingVariant\" class=\"mt-2\">\r\n <clr-alert clrAlertType=\"warning\" [clrAlertClosable]=\"false\" class=\"\">\r\n <clr-alert-item>\r\n <span class=\"alert-text\">\r\n {{ 'catalog.product-variant-exists' | translate }}: {{ existingVariant.name }} ({{\r\n existingVariant.sku\r\n }})\r\n </span>\r\n </clr-alert-item>\r\n </clr-alert>\r\n </div>\r\n <div class=\"form-grid mt-2\">\r\n <vdr-form-field [label]=\"'common.name' | translate\">\r\n <input type=\"text\" formControlName=\"name\" />\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'catalog.sku' | translate\">\r\n <input type=\"text\" formControlName=\"sku\" />\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'catalog.price' | translate\">\r\n <vdr-currency-input name=\"price\" [currencyCode]=\"currencyCode\" formControlName=\"price\" />\r\n </vdr-form-field>\r\n </div>\r\n</form>\r\n<ng-template vdrDialogButtons>\r\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\r\n <button type=\"submit\" (click)=\"confirm()\" class=\"btn btn-primary\"\r\n [disabled]=\"form.invalid || existingVariant || product.optionGroups.length === 0\">\r\n {{ 'common.confirm' | translate }}\r\n </button>\r\n</ng-template>","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\r\nimport { FormBuilder, FormControl, FormGroup, FormRecord, Validators } from '@angular/forms';\r\nimport {\r\n CreateProductVariantInput,\r\n CurrencyCode,\r\n Dialog,\r\n GetProductVariantOptionsQuery,\r\n} from '@vendure/admin-ui/core';\r\nimport { notNullOrUndefined } from '@vendure/common/lib/shared-utils';\r\nimport { combineLatest } from 'rxjs';\r\n\r\n@Component({\r\n selector: 'vdr-create-product-variant-dialog',\r\n templateUrl: './create-product-variant-dialog.component.html',\r\n styleUrls: ['./create-product-variant-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CreateProductVariantDialogComponent implements Dialog<CreateProductVariantInput>, OnInit {\r\n resolveWith: (result?: CreateProductVariantInput) => void;\r\n product: NonNullable<GetProductVariantOptionsQuery['product']>;\r\n form = this.formBuilder.group({\r\n name: ['', Validators.required],\r\n sku: ['', Validators.required],\r\n price: ['', Validators.required],\r\n options: this.formBuilder.record<string>({}),\r\n });\r\n existingVariant: NonNullable<GetProductVariantOptionsQuery['product']>['variants'][number] | undefined;\r\n currencyCode: CurrencyCode;\r\n\r\n constructor(private formBuilder: FormBuilder) {}\r\n\r\n ngOnInit() {\r\n this.currencyCode = this.product.variants[0]?.currencyCode;\r\n for (const optionGroup of this.product.optionGroups) {\r\n (this.form.get('options') as FormRecord).addControl(\r\n optionGroup.code,\r\n new FormControl('', Validators.required),\r\n );\r\n }\r\n const optionsRecord = this.form.get('options') as FormRecord;\r\n optionsRecord.valueChanges.subscribe(value => {\r\n const nameControl = this.form.get('name');\r\n const allNull = Object.values(value).every(v => v == null);\r\n if (!allNull && value && nameControl && !nameControl.dirty) {\r\n const name = Object.entries(value)\r\n .map(\r\n ([groupCode, optionId]) =>\r\n this.product.optionGroups\r\n .find(og => og.code === groupCode)\r\n ?.options.find(o => o.id === optionId)?.name,\r\n )\r\n .join(' ');\r\n nameControl.setValue(`${this.product.name} ${name}`);\r\n }\r\n const allSelected = Object.values(value).every(v => v != null);\r\n if (allSelected) {\r\n this.existingVariant = this.product.variants.find(v =>\r\n Object.entries(value).every(\r\n ([groupCode, optionId]) =>\r\n v.options.find(o => o.groupId === this.getGroupIdFromCode(groupCode))?.id ===\r\n optionId,\r\n ),\r\n );\r\n }\r\n });\r\n }\r\n\r\n confirm() {\r\n const { name, sku, options, price } = this.form.value;\r\n if (!name || !sku || !options || !price) {\r\n return;\r\n }\r\n\r\n const optionIds = Object.values(options).filter(notNullOrUndefined);\r\n this.resolveWith({\r\n productId: this.product.id,\r\n sku,\r\n price: Number(price),\r\n optionIds,\r\n translations: [\r\n {\r\n languageCode: this.product.languageCode,\r\n name,\r\n },\r\n ],\r\n });\r\n }\r\n\r\n cancel() {\r\n this.resolveWith();\r\n }\r\n\r\n private getGroupCodeFromId(id: string): string {\r\n return this.product.optionGroups.find(og => og.id === id)?.code ?? '';\r\n }\r\n\r\n private getGroupIdFromCode(code: string): string {\r\n return this.product.optionGroups.find(og => og.code === code)?.id ?? '';\r\n }\r\n}\r\n","<div class=\"input-wrapper\" [class.focus]=\"isFocussed\" (click)=\"textArea.focus()\">\r\n <div class=\"chips\" *ngIf=\"0 < optionValues.length\">\r\n <vdr-chip\r\n *ngFor=\"let option of optionValues; last as isLast; index as i\"\r\n [icon]=\"option.locked ? 'lock' : 'times'\"\r\n [class.selected]=\"isLast && lastSelected\"\r\n [class.locked]=\"option.locked\"\r\n [colorFrom]=\"groupName\"\r\n (iconClick)=\"removeOption(option)\"\r\n >\r\n <span [hidden]=\"editingIndex !== i\">\r\n <input\r\n #editNameInput\r\n type=\"text\"\r\n [ngModel]=\"option.name\"\r\n (blur)=\"updateOption(i, $event)\"\r\n (click)=\"$event.cancelBubble = true\"\r\n />\r\n </span>\r\n <span\r\n class=\"option-name\"\r\n [class.editable]=\"!option.locked && !option.id\"\r\n (click)=\"editName(i, $event)\" [hidden]=\"editingIndex === i\">{{ option.name }}</span>\r\n </vdr-chip>\r\n </div>\r\n <textarea\r\n #textArea\r\n (keyup)=\"handleKey($event)\"\r\n (focus)=\"isFocussed = true\"\r\n (blur)=\"handleBlur()\"\r\n [(ngModel)]=\"input\"\r\n [disabled]=\"disabled\"\r\n ></textarea>\r\n</div>\r\n","import {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ElementRef,\r\n EventEmitter,\r\n forwardRef,\r\n Input,\r\n OnChanges,\r\n OnInit,\r\n Output,\r\n Provider,\r\n QueryList,\r\n SimpleChanges,\r\n ViewChild,\r\n ViewChildren,\r\n} from '@angular/core';\r\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\r\nimport { unique } from '@vendure/common/lib/unique';\r\n\r\nexport const OPTION_VALUE_INPUT_VALUE_ACCESSOR: Provider = {\r\n provide: NG_VALUE_ACCESSOR,\r\n useExisting: forwardRef(() => OptionValueInputComponent),\r\n multi: true,\r\n};\r\n\r\ninterface Option {\r\n id?: string;\r\n name: string;\r\n locked: boolean;\r\n}\r\n\r\n@Component({\r\n selector: 'vdr-option-value-input',\r\n templateUrl: './option-value-input.component.html',\r\n styleUrls: ['./option-value-input.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.Default,\r\n providers: [OPTION_VALUE_INPUT_VALUE_ACCESSOR],\r\n})\r\nexport class OptionValueInputComponent implements ControlValueAccessor {\r\n @Input() groupName = '';\r\n @ViewChild('textArea', { static: true }) textArea: ElementRef<HTMLTextAreaElement>;\r\n @ViewChildren('editNameInput', { read: ElementRef }) nameInputs: QueryList<ElementRef>;\r\n @Input() options: Option[];\r\n @Output() add = new EventEmitter<Option>();\r\n @Output() remove = new EventEmitter<Option>();\r\n @Output() edit = new EventEmitter<{ index: number; option: Option }>();\r\n @Input() disabled = false;\r\n input = '';\r\n isFocussed = false;\r\n lastSelected = false;\r\n formValue: Option[];\r\n editingIndex = -1;\r\n onChangeFn: (value: any) => void;\r\n onTouchFn: (value: any) => void;\r\n\r\n get optionValues(): Option[] {\r\n return this.formValue ?? this.options ?? [];\r\n }\r\n\r\n constructor(private changeDetector: ChangeDetectorRef) {}\r\n\r\n registerOnChange(fn: any): void {\r\n this.onChangeFn = fn;\r\n }\r\n\r\n registerOnTouched(fn: any): void {\r\n this.onTouchFn = fn;\r\n }\r\n\r\n setDisabledState(isDisabled: boolean): void {\r\n this.disabled = isDisabled;\r\n this.changeDetector.markForCheck();\r\n }\r\n\r\n writeValue(obj: any): void {\r\n this.formValue = obj || [];\r\n }\r\n\r\n focus() {\r\n this.textArea.nativeElement.focus();\r\n }\r\n\r\n editName(index: number, event: MouseEvent) {\r\n const optionValue = this.optionValues[index];\r\n if (!optionValue.locked && !optionValue.id) {\r\n event.cancelBubble = true;\r\n this.editingIndex = index;\r\n const input = this.nameInputs.get(index)?.nativeElement;\r\n setTimeout(() => input?.focus());\r\n }\r\n }\r\n\r\n updateOption(index: number, event: InputEvent) {\r\n const optionValue = this.optionValues[index];\r\n const newName = (event.target as HTMLInputElement).value;\r\n if (optionValue) {\r\n if (newName) {\r\n optionValue.name = newName;\r\n this.edit.emit({ index, option: optionValue });\r\n }\r\n this.editingIndex = -1;\r\n }\r\n }\r\n\r\n removeOption(option: Option) {\r\n if (!option.locked) {\r\n if (this.formValue) {\r\n this.formValue = this.formValue?.filter(o => o.name !== option.name);\r\n this.onChangeFn(this.formValue);\r\n } else {\r\n this.remove.emit(option);\r\n }\r\n }\r\n }\r\n\r\n handleKey(event: KeyboardEvent) {\r\n switch (event.key) {\r\n case ',':\r\n case 'Enter':\r\n this.addOptionValue();\r\n event.preventDefault();\r\n break;\r\n case 'Backspace':\r\n if (this.lastSelected) {\r\n this.removeLastOption();\r\n this.lastSelected = false;\r\n } else if (this.input === '') {\r\n this.lastSelected = true;\r\n }\r\n break;\r\n default:\r\n this.lastSelected = false;\r\n }\r\n }\r\n\r\n handleBlur() {\r\n this.isFocussed = false;\r\n this.addOptionValue();\r\n }\r\n\r\n private addOptionValue() {\r\n const options = this.parseInputIntoOptions(this.input).filter(option => {\r\n // do not add an option with the same name\r\n // as an existing option\r\n const existing = this.options ?? this.formValue;\r\n return !existing?.find(o => o?.name === option.name);\r\n });\r\n if (!this.formValue && this.options) {\r\n for (const option of options) {\r\n this.add.emit(option);\r\n }\r\n } else {\r\n this.formValue = unique([...this.formValue, ...options]);\r\n this.onChangeFn(this.formValue);\r\n }\r\n this.input = '';\r\n }\r\n\r\n private parseInputIntoOptions(input: string): Option[] {\r\n return input\r\n .split(/[,\\n]/)\r\n .map(s => s.trim())\r\n .filter(s => s !== '')\r\n .map(s => ({ name: s, locked: false }));\r\n }\r\n\r\n private removeLastOption() {\r\n if (this.optionValues.length) {\r\n const option = this.optionValues[this.optionValues.length - 1];\r\n this.removeOption(option);\r\n }\r\n }\r\n}\r\n","<vdr-page-block>\r\n <vdr-card>\r\n <div *ngFor=\"let group of optionGroups; index as i\" class=\"option-groups\">\r\n <vdr-form-field [label]=\"'catalog.option' | translate\">\r\n <input clrInput [(ngModel)]=\"group.name\" name=\"name\" [readonly]=\"!group.isNew\" />\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'catalog.option-values' | translate\" class=\"flex-spacer\">\r\n <vdr-option-value-input\r\n #optionValueInputComponent\r\n [options]=\"group.values\"\r\n [groupName]=\"group.name\"\r\n [disabled]=\"group.name === ''\"\r\n (add)=\"addOption(i, $event.name)\"\r\n (remove)=\"removeOption(i, $event)\"\r\n ></vdr-option-value-input>\r\n </vdr-form-field>\r\n <div>\r\n <button class=\"button-small mt-4\" (click)=\"removeOptionGroup(group)\">\r\n <clr-icon shape=\"trash\"></clr-icon>\r\n </button>\r\n </div>\r\n </div>\r\n <button class=\"button mt-1\" (click)=\"addOptionGroup()\">\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.create-product-option-group' | translate }}\r\n </button>\r\n </vdr-card>\r\n <vdr-card [paddingX]=\"false\">\r\n <div class=\"mx-3\">\r\n <button class=\"button\" (click)=\"createNewVariant()\">\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.create-product-variant' | translate }}\r\n </button>\r\n </div>\r\n <vdr-data-table-2\r\n id=\"manage-product-variant-list\"\r\n [items]=\"variants$ | async\"\r\n [itemsPerPage]=\"itemsPerPage\"\r\n [totalItems]=\"totalItems$ | async\"\r\n [currentPage]=\"currentPage\"\r\n (pageChange)=\"setPageNumber($event)\"\r\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\r\n >\r\n <vdr-dt2-search\r\n [searchTermControl]=\"searchTermControl\"\r\n [searchTermPlaceholder]=\"'catalog.filter-by-name' | translate\"\r\n />\r\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.id }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.created-at' | translate\" id=\"created-at\" [hiddenByDefault]=\"true\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.createdAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.updated-at' | translate\" id=\"updated-at\" [hiddenByDefault]=\"true\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.updatedAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'catalog.name' | translate\" id=\"name\" [optional]=\"false\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.name }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'catalog.sku' | translate\" id=\"sku\" [optional]=\"false\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.sku }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column *ngFor=\"let optionGroup of optionGroups$ | async\" [heading]=\"optionGroup.name\" [id]=\"optionGroup.code\">\r\n <ng-template let-variant=\"item\">\r\n <vdr-chip\r\n *ngIf=\"getOption(variant, optionGroup.id) as option; else selectOption\"\r\n [colorFrom]=\"optionGroup.code\"\r\n >{{ option.name }}</vdr-chip\r\n >\r\n <ng-template #selectOption>\r\n <div class=\"flex center\">\r\n <ng-select\r\n [items]=\"optionGroup.options\"\r\n bindLabel=\"name\"\r\n bindValue=\"id\"\r\n appendTo=\"body\"\r\n (change)=\"setOptionToAddToVariant(variant.id, optionGroup.id, $event?.id)\"\r\n ></ng-select>\r\n <button\r\n class=\"button-small ml-1\"\r\n [class.primary]=\"!!optionsToAddToVariant[variant.id]?.[optionGroup.id]\"\r\n (click)=\"addOptionToVariant(variant)\"\r\n [disabled]=\"!optionsToAddToVariant[variant.id]?.[optionGroup.id]\"\r\n >\r\n <clr-icon shape=\"floppy\"></clr-icon>\r\n </button>\r\n </div>\r\n </ng-template>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.price' | translate\" id=\"price\" [hiddenByDefault]=\"true\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.price | localeCurrency : variant.currencyCode }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.price-with-tax' | translate\" id=\"price-with-tax\" [hiddenByDefault]=\"true\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.priceWithTax | localeCurrency : variant.currencyCode }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.delete' | translate\" id=\"delete\" [optional]=\"false\">\r\n <ng-template let-variant=\"item\">\r\n <button class=\"button-small\" (click)=\"deleteVariant(variant)\">\r\n <clr-icon shape=\"trash is-danger\"></clr-icon>\r\n </button>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n </vdr-data-table-2>\r\n </vdr-card>\r\n</vdr-page-block>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit } from '@angular/core';\r\nimport { FormControl } from '@angular/forms';\r\nimport { ActivatedRoute } from '@angular/router';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n CurrencyCode,\r\n DataService,\r\n DeactivateAware,\r\n DeletionResult,\r\n getDefaultUiLanguage,\r\n GetProductVariantOptionsQuery,\r\n LanguageCode,\r\n ModalService,\r\n NotificationService,\r\n SelectionManager,\r\n} from '@vendure/admin-ui/core';\r\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\r\nimport { unique } from '@vendure/common/lib/unique';\r\nimport { EMPTY, Observable, Subject } from 'rxjs';\r\nimport { map, startWith, switchMap } from 'rxjs/operators';\r\n\r\nimport { ProductDetailService } from '../../providers/product-detail/product-detail.service';\r\nimport { CreateProductOptionGroupDialogComponent } from '../create-product-option-group-dialog/create-product-option-group-dialog.component';\r\nimport { CreateProductVariantDialogComponent } from '../create-product-variant-dialog/create-product-variant-dialog.component';\r\n\r\nexport class GeneratedVariant {\r\n isDefault: boolean;\r\n options: Array<{ name: string; id?: string }>;\r\n productVariantId?: string;\r\n enabled: boolean;\r\n existing: boolean;\r\n sku: string;\r\n price: number;\r\n stock: number;\r\n\r\n constructor(config: Partial<GeneratedVariant>) {\r\n for (const key of Object.keys(config)) {\r\n this[key] = config[key];\r\n }\r\n }\r\n}\r\n\r\ninterface OptionGroupUiModel {\r\n id?: string;\r\n isNew: boolean;\r\n name: string;\r\n locked: boolean;\r\n values: Array<{\r\n id: string;\r\n name: string;\r\n locked: boolean;\r\n }>;\r\n}\r\n\r\n@Component({\r\n selector: 'vdr-product-variants-editor',\r\n templateUrl: './product-variants-editor.component.html',\r\n styleUrls: ['./product-variants-editor.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.Default,\r\n})\r\nexport class ProductVariantsEditorComponent implements OnInit, DeactivateAware {\r\n formValueChanged = false;\r\n optionsChanged = false;\r\n optionGroups: OptionGroupUiModel[];\r\n product: NonNullable<GetProductVariantOptionsQuery['product']>;\r\n variants$: Observable<NonNullable<GetProductVariantOptionsQuery['product']>['variants']>;\r\n optionGroups$: Observable<NonNullable<GetProductVariantOptionsQuery['product']>['optionGroups']>;\r\n totalItems$: Observable<number>;\r\n currencyCode: CurrencyCode;\r\n itemsPerPage = 100;\r\n currentPage = 1;\r\n searchTermControl = new FormControl('');\r\n selectionManager = new SelectionManager<any>({\r\n multiSelect: true,\r\n itemsAreEqual: (a, b) => a.id === b.id,\r\n additiveMode: true,\r\n });\r\n optionsToAddToVariant: {\r\n [variantId: string]: { [groupId: string]: string };\r\n } = {};\r\n private refresh$ = new Subject<void>();\r\n private languageCode: LanguageCode;\r\n\r\n constructor(\r\n private route: ActivatedRoute,\r\n private dataService: DataService,\r\n private productDetailService: ProductDetailService,\r\n private notificationService: NotificationService,\r\n private modalService: ModalService,\r\n private changeDetector: ChangeDetectorRef,\r\n ) {}\r\n\r\n ngOnInit() {\r\n this.languageCode =\r\n (this.route.snapshot.paramMap.get('lang') as LanguageCode) || getDefaultUiLanguage();\r\n this.dataService.settings.getActiveChannel().single$.subscribe(data => {\r\n this.currencyCode = data.activeChannel.defaultCurrencyCode;\r\n });\r\n\r\n const product$ = this.refresh$.pipe(\r\n switchMap(() =>\r\n this.dataService.product\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n .getProductVariantsOptions(this.route.parent?.snapshot.paramMap.get('id')!)\r\n .mapSingle(data => data.product),\r\n ),\r\n startWith(this.route.snapshot.data.product),\r\n );\r\n\r\n this.variants$ = product$.pipe(\r\n switchMap(product =>\r\n this.searchTermControl.valueChanges.pipe(\r\n startWith(''),\r\n map(term =>\r\n term\r\n ? product.variants.filter(v => v.name.toLowerCase().includes(term.toLowerCase()))\r\n : product.variants,\r\n ),\r\n ),\r\n ),\r\n );\r\n this.optionGroups$ = product$.pipe(map(product => product.optionGroups));\r\n this.totalItems$ = this.variants$.pipe(map(variants => variants.length));\r\n\r\n product$.subscribe(p => {\r\n this.product = p;\r\n const allUsedOptionIds = p.variants.map(v => v.options.map(option => option.id)).flat();\r\n const allUsedOptionGroupIds = p.variants.map(v => v.options.map(option => option.groupId)).flat();\r\n this.optionGroups = p.optionGroups.map(og => ({\r\n id: og.id,\r\n isNew: false,\r\n name: og.name,\r\n locked: allUsedOptionGroupIds.includes(og.id),\r\n values: og.options.map(o => ({\r\n id: o.id,\r\n name: o.name,\r\n locked: allUsedOptionIds.includes(o.id),\r\n })),\r\n }));\r\n });\r\n }\r\n\r\n setItemsPerPage(itemsPerPage: number) {\r\n this.itemsPerPage = itemsPerPage;\r\n this.currentPage = 1;\r\n }\r\n\r\n setPageNumber(page: number) {\r\n this.currentPage = page;\r\n }\r\n\r\n onFormChanged(variantInfo: GeneratedVariant) {\r\n this.formValueChanged = true;\r\n variantInfo.enabled = true;\r\n }\r\n\r\n canDeactivate(): boolean {\r\n return !this.formValueChanged;\r\n }\r\n\r\n addOptionGroup() {\r\n this.modalService\r\n .fromComponent(CreateProductOptionGroupDialogComponent, {\r\n locals: {\r\n languageCode: this.languageCode,\r\n },\r\n })\r\n .pipe(\r\n switchMap(result => {\r\n if (result) {\r\n return this.dataService.product.createProductOptionGroups(result).pipe(\r\n switchMap(({ createProductOptionGroup }) =>\r\n this.dataService.product.addOptionGroupToProduct({\r\n optionGroupId: createProductOptionGroup.id,\r\n productId: this.product.id,\r\n }),\r\n ),\r\n );\r\n } else {\r\n return EMPTY;\r\n }\r\n }),\r\n )\r\n .subscribe(result => {\r\n this.notificationService.success(_('common.notify-create-success'), {\r\n entity: 'ProductOptionGroup',\r\n });\r\n this.refresh$.next();\r\n this.changeDetector.markForCheck();\r\n });\r\n }\r\n\r\n removeOptionGroup(\r\n optionGroup: NonNullable<GetProductVariantOptionsQuery['product']>['optionGroups'][number],\r\n ) {\r\n const id = optionGroup.id;\r\n const usedByVariantsCount = this.product.variants.filter(v =>\r\n v.options.map(o => o.groupId).includes(id),\r\n ).length;\r\n this.modalService\r\n .dialog({\r\n title: _('catalog.confirm-delete-product-option-group'),\r\n body: usedByVariantsCount ? _('catalog.confirm-delete-product-option-group-body') : '',\r\n translationVars: { name: optionGroup.name, count: usedByVariantsCount },\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n { type: 'danger', label: _('common.delete'), returnValue: true },\r\n ],\r\n })\r\n .pipe(\r\n switchMap(val => {\r\n if (val) {\r\n return this.dataService.product.removeOptionGroupFromProduct({\r\n optionGroupId: id,\r\n productId: this.product.id,\r\n force: true,\r\n });\r\n } else {\r\n return EMPTY;\r\n }\r\n }),\r\n )\r\n .subscribe(({ removeOptionGroupFromProduct }) => {\r\n if (removeOptionGroupFromProduct.__typename === 'Product') {\r\n this.notificationService.success(_('common.notify-delete-success'), {\r\n entity: 'ProductOptionGroup',\r\n });\r\n this.refresh$.next();\r\n } else if (removeOptionGroupFromProduct.__typename === 'ProductOptionInUseError') {\r\n this.notificationService.error(removeOptionGroupFromProduct.message ?? '');\r\n }\r\n });\r\n }\r\n\r\n addOption(index: number, optionName: string) {\r\n const group = this.optionGroups[index];\r\n if (group && group.id) {\r\n this.dataService.product\r\n .addOptionToGroup({\r\n productOptionGroupId: group.id,\r\n code: normalizeString(optionName, '-'),\r\n translations: [{ name: optionName, languageCode: this.languageCode }],\r\n })\r\n .subscribe(({ createProductOption }) => {\r\n this.notificationService.success(_('common.notify-create-success'), {\r\n entity: 'ProductOption',\r\n });\r\n this.refresh$.next();\r\n });\r\n }\r\n }\r\n\r\n removeOption(index: number, { id, name }: { id: string; name: string }) {\r\n const optionGroup = this.optionGroups[index];\r\n if (optionGroup) {\r\n this.modalService\r\n .dialog({\r\n title: _('catalog.confirm-delete-product-option'),\r\n translationVars: { name },\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n { type: 'danger', label: _('common.delete'), returnValue: true },\r\n ],\r\n })\r\n .pipe(\r\n switchMap(val => {\r\n if (val) {\r\n return this.dataService.product.deleteProductOption(id);\r\n } else {\r\n return EMPTY;\r\n }\r\n }),\r\n )\r\n .subscribe(({ deleteProductOption }) => {\r\n if (deleteProductOption.result === DeletionResult.DELETED) {\r\n this.notificationService.success(_('common.notify-delete-success'), {\r\n entity: 'ProductOption',\r\n });\r\n optionGroup.values = optionGroup.values.filter(v => v.id !== id);\r\n this.refresh$.next();\r\n } else {\r\n this.notificationService.error(deleteProductOption.message ?? '');\r\n }\r\n });\r\n }\r\n }\r\n\r\n setOptionToAddToVariant(variantId: string, optionGroupId: string, optionId?: string) {\r\n if (!this.optionsToAddToVariant[variantId]) {\r\n this.optionsToAddToVariant[variantId] = {};\r\n }\r\n if (optionId) {\r\n this.optionsToAddToVariant[variantId][optionGroupId] = optionId;\r\n } else {\r\n delete this.optionsToAddToVariant[variantId][optionGroupId];\r\n }\r\n }\r\n\r\n addOptionToVariant(variant: NonNullable<GetProductVariantOptionsQuery['product']>['variants'][number]) {\r\n const optionIds = [\r\n ...variant.options.map(o => o.id),\r\n ...Object.values(this.optionsToAddToVariant[variant.id]),\r\n ];\r\n this.dataService.product\r\n .updateProductVariants([\r\n {\r\n id: variant.id,\r\n optionIds: unique(optionIds),\r\n },\r\n ])\r\n .subscribe(({ updateProductVariants }) => {\r\n this.refresh$.next();\r\n });\r\n }\r\n\r\n deleteVariant(variant: NonNullable<GetProductVariantOptionsQuery['product']>['variants'][number]) {\r\n this.modalService\r\n .dialog({\r\n title: _('catalog.confirm-delete-product-variant'),\r\n translationVars: { name: variant.name },\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n { type: 'danger', label: _('common.delete'), returnValue: true },\r\n ],\r\n })\r\n .pipe(\r\n switchMap(response =>\r\n response\r\n ? this.productDetailService.deleteProductVariant(variant.id, this.product.id)\r\n : EMPTY,\r\n ),\r\n )\r\n .subscribe(\r\n () => {\r\n this.notificationService.success(_('common.notify-delete-success'), {\r\n entity: 'ProductVariant',\r\n });\r\n this.refresh$.next();\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-delete-error'), {\r\n entity: 'ProductVariant',\r\n });\r\n },\r\n );\r\n }\r\n\r\n createNewVariant() {\r\n this.modalService\r\n .fromComponent(CreateProductVariantDialogComponent, {\r\n locals: {\r\n product: this.product,\r\n },\r\n })\r\n .pipe(\r\n switchMap(result => {\r\n if (result) {\r\n return this.dataService.product.createProductVariants([result]);\r\n } else {\r\n return EMPTY;\r\n }\r\n }),\r\n )\r\n .subscribe(result => {\r\n this.notificationService.success(_('common.notify-create-success'), {\r\n entity: 'ProductVariant',\r\n });\r\n this.refresh$.next();\r\n });\r\n }\r\n\r\n getOption(\r\n variant: NonNullable<GetProductVariantOptionsQuery['product']>['variants'][number],\r\n groupId: string,\r\n ) {\r\n return variant.options.find(o => o.groupId === groupId);\r\n }\r\n}\r\n","import { Injectable } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { BaseEntityResolver, GetProductVariantOptionsQuery, DataService } from '@vendure/admin-ui/core';\r\n\r\n@Injectable({\r\n providedIn: 'root',\r\n})\r\nexport class ProductVariantsResolver extends BaseEntityResolver<GetProductVariantOptionsQuery['product']> {\r\n constructor(router: Router, dataService: DataService) {\r\n super(\r\n router,\r\n {\r\n __typename: 'Product' as const,\r\n id: '',\r\n createdAt: '',\r\n updatedAt: '',\r\n name: '',\r\n languageCode: '' as any,\r\n optionGroups: [],\r\n variants: [],\r\n },\r\n id => dataService.product.getProductVariantsOptions(id).mapStream(data => data.product),\r\n );\r\n }\r\n}\r\n","import { inject } from '@angular/core';\r\nimport { ActivatedRouteSnapshot, Route } from '@angular/router';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n CanDeactivateDetailGuard,\r\n createResolveData,\r\n DataService,\r\n PageComponent,\r\n PageService,\r\n} from '@vendure/admin-ui/core';\r\nimport { map } from 'rxjs/operators';\r\nimport { ProductOptionsEditorComponent } from './components/product-options-editor/product-options-editor.component';\r\nimport { ProductVariantsEditorComponent } from './components/product-variants-editor/product-variants-editor.component';\r\nimport { ProductVariantsResolver } from './providers/routing/product-variants-resolver';\r\n\r\nexport const createRoutes = (pageService: PageService): Route[] => [\r\n {\r\n path: 'products',\r\n component: PageComponent,\r\n data: {\r\n locationId: 'product-list',\r\n breadcrumb: _('breadcrumb.products'),\r\n },\r\n children: pageService.getPageTabRoutes('product-list'),\r\n },\r\n {\r\n path: 'inventory',\r\n redirectTo: 'products',\r\n },\r\n {\r\n path: 'products/:id',\r\n component: PageComponent,\r\n data: {\r\n locationId: 'product-detail',\r\n breadcrumb: { label: _('breadcrumb.products'), link: ['../', 'products'] },\r\n },\r\n children: [\r\n {\r\n path: 'manage-variants',\r\n component: ProductVariantsEditorComponent,\r\n canDeactivate: [CanDeactivateDetailGuard],\r\n data: {\r\n breadcrumb: ({ product }) => [\r\n {\r\n label: `${product.name}`,\r\n link: ['../'],\r\n },\r\n {\r\n label: _('breadcrumb.manage-variants'),\r\n link: ['manage-variants'],\r\n },\r\n ],\r\n },\r\n resolve: {\r\n product: (route: ActivatedRouteSnapshot) =>\r\n inject(DataService)\r\n .product.getProductVariantsOptions(route.parent?.params.id)\r\n .mapSingle(data => data.product),\r\n },\r\n },\r\n ...pageService.getPageTabRoutes('product-detail'),\r\n ],\r\n },\r\n {\r\n path: 'products/:productId/variants/:id',\r\n component: PageComponent,\r\n data: {\r\n locationId: 'product-variant-detail',\r\n breadcrumb: { label: _('breadcrumb.products'), link: ['../', 'products'] },\r\n },\r\n children: pageService.getPageTabRoutes('product-variant-detail'),\r\n },\r\n {\r\n path: 'products/:id/options',\r\n component: ProductOptionsEditorComponent,\r\n resolve: createResolveData(ProductVariantsResolver),\r\n canDeactivate: [CanDeactivateDetailGuard],\r\n data: {\r\n breadcrumb: productOptionsEditorBreadcrumb,\r\n },\r\n },\r\n {\r\n path: 'facets',\r\n component: PageComponent,\r\n data: {\r\n locationId: 'facet-list',\r\n breadcrumb: _('breadcrumb.facets'),\r\n },\r\n children: pageService.getPageTabRoutes('facet-list'),\r\n },\r\n {\r\n path: 'facets/:id',\r\n component: PageComponent,\r\n data: {\r\n locationId: 'facet-detail',\r\n breadcrumb: { label: _('breadcrumb.facets'), link: ['../', 'facets'] },\r\n },\r\n children: pageService.getPageTabRoutes('facet-detail'),\r\n },\r\n {\r\n path: 'collections',\r\n component: PageComponent,\r\n data: {\r\n locationId: 'collection-list',\r\n breadcrumb: _('breadcrumb.collections'),\r\n },\r\n children: pageService.getPageTabRoutes('collection-list'),\r\n },\r\n {\r\n path: 'collections/:id',\r\n component: PageComponent,\r\n data: {\r\n locationId: 'collection-detail',\r\n breadcrumb: { label: _('breadcrumb.collections'), link: ['../', 'collections'] },\r\n },\r\n children: pageService.getPageTabRoutes('collection-detail'),\r\n },\r\n {\r\n path: 'assets',\r\n component: PageComponent,\r\n data: {\r\n locationId: 'asset-list',\r\n breadcrumb: _('breadcrumb.assets'),\r\n },\r\n children: pageService.getPageTabRoutes('asset-list'),\r\n },\r\n {\r\n path: 'assets/:id',\r\n component: PageComponent,\r\n data: {\r\n locationId: 'asset-detail',\r\n breadcrumb: { label: _('breadcrumb.assets'), link: ['../', 'assets'] },\r\n },\r\n children: pageService.getPageTabRoutes('asset-detail'),\r\n },\r\n];\r\n\r\nexport function productOptionsEditorBreadcrumb(data: any, params: any) {\r\n return data.entity.pipe(\r\n map((entity: any) => [\r\n {\r\n label: _('breadcrumb.products'),\r\n link: ['../', 'products'],\r\n },\r\n {\r\n label: `${entity.name}`,\r\n link: ['../', 'products', params.id],\r\n },\r\n {\r\n label: _('breadcrumb.product-options'),\r\n link: ['options'],\r\n },\r\n ]),\r\n );\r\n}\r\n","<ng-template vdrDialogTitle>{{ 'catalog.add-facets' | translate }}</ng-template>\r\n\r\n<vdr-facet-value-selector\r\n (selectedValuesChange)=\"selectedValues = $event\"\r\n></vdr-facet-value-selector>\r\n\r\n<ng-template vdrDialogButtons>\r\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\r\n <button\r\n type=\"submit\"\r\n (click)=\"selectValues()\"\r\n [disabled]=\"selectedValues.length === 0\"\r\n class=\"btn btn-primary\"\r\n >\r\n {{ 'catalog.add-facets' | translate }}\r\n </button>\r\n</ng-template>\r\n","import {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport {\r\n Dialog,\r\n FacetValue,\r\n FacetValueSelectorComponent,\r\n FacetWithValuesFragment,\r\n} from '@vendure/admin-ui/core';\r\n\r\n@Component({\r\n selector: 'vdr-apply-facet-dialog',\r\n templateUrl: './apply-facet-dialog.component.html',\r\n styleUrls: ['./apply-facet-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ApplyFacetDialogComponent implements Dialog<FacetValue[]>, AfterViewInit {\r\n @ViewChild(FacetValueSelectorComponent) private selector: FacetValueSelectorComponent;\r\n resolveWith: (result?: FacetValue[]) => void;\r\n selectedValues: FacetValue[] = [];\r\n // Provided by caller\r\n facets: FacetWithValuesFragment[];\r\n\r\n constructor(private changeDetector: ChangeDetectorRef) {}\r\n\r\n ngAfterViewInit() {\r\n setTimeout(() => this.selector.focus(), 0);\r\n }\r\n\r\n selectValues() {\r\n this.resolveWith(this.selectedValues);\r\n }\r\n\r\n cancel() {\r\n this.resolveWith();\r\n }\r\n}\r\n","<vdr-page-block>\r\n <vdr-action-bar>\r\n <vdr-ab-left></vdr-ab-left>\r\n\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"asset-detail\"></vdr-action-bar-items>\r\n <button\r\n *vdrIfPermissions=\"['UpdateCatalog', 'UpdateAsset']\"\r\n class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n [disabled]=\"detailForm.invalid || detailForm.pristine\"\r\n >\r\n {{ 'common.update' | translate }}\r\n </button>\r\n </vdr-ab-right>\r\n </vdr-action-bar>\r\n</vdr-page-block>\r\n<vdr-page-block>\r\n <vdr-asset-preview\r\n [asset]=\"entity$ | async\"\r\n [editable]=\"true\"\r\n [customFields]=\"customFields\"\r\n [customFieldsForm]=\"detailForm.get('customFields')\"\r\n (assetChange)=\"onAssetChange($event)\"\r\n />\r\n</vdr-page-block>\r\n","import { ChangeDetectionStrategy, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { FormControl, FormGroup, UntypedFormBuilder } from '@angular/forms';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n ASSET_FRAGMENT,\r\n AssetDetailQueryDocument,\r\n AssetDetailQueryQuery,\r\n DataService,\r\n getCustomFieldsDefaults,\r\n LanguageCode,\r\n NotificationService,\r\n TAG_FRAGMENT,\r\n TypedBaseDetailComponent,\r\n} from '@vendure/admin-ui/core';\r\nimport { gql } from 'apollo-angular';\r\n\r\nexport const ASSET_DETAIL_QUERY = gql`\r\n query AssetDetailQuery($id: ID!) {\r\n asset(id: $id) {\r\n ...Asset\r\n tags {\r\n ...Tag\r\n }\r\n }\r\n }\r\n ${ASSET_FRAGMENT}\r\n ${TAG_FRAGMENT}\r\n`;\r\n\r\n@Component({\r\n selector: 'vdr-asset-detail',\r\n templateUrl: './asset-detail.component.html',\r\n styleUrls: ['./asset-detail.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class AssetDetailComponent\r\n extends TypedBaseDetailComponent<typeof AssetDetailQueryDocument, 'asset'>\r\n implements OnInit, OnDestroy\r\n{\r\n readonly customFields = this.getCustomFieldConfig('Asset');\r\n detailForm = new FormGroup({\r\n name: new FormControl(''),\r\n tags: new FormControl([] as string[]),\r\n customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),\r\n });\r\n\r\n constructor(\r\n private notificationService: NotificationService,\r\n protected dataService: DataService,\r\n private formBuilder: UntypedFormBuilder,\r\n ) {\r\n super();\r\n }\r\n\r\n ngOnInit() {\r\n this.init();\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy();\r\n }\r\n\r\n onAssetChange(event: { id: string; name: string; tags: string[] }) {\r\n this.detailForm.get('name')?.setValue(event.name);\r\n this.detailForm.get('tags')?.setValue(event.tags);\r\n this.detailForm.markAsDirty();\r\n }\r\n\r\n save() {\r\n this.dataService.product\r\n .updateAsset({\r\n id: this.id,\r\n name: this.detailForm.value.name,\r\n tags: this.detailForm.value.tags,\r\n customFields: this.detailForm.value.customFields,\r\n })\r\n .subscribe(\r\n () => {\r\n this.notificationService.success(_('common.notify-update-success'), { entity: 'Asset' });\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-update-error'), {\r\n entity: 'Asset',\r\n });\r\n },\r\n );\r\n }\r\n\r\n protected setFormValues(\r\n entity: NonNullable<AssetDetailQueryQuery['asset']>,\r\n languageCode: LanguageCode,\r\n ): void {\r\n this.detailForm.get('name')?.setValue(entity.name);\r\n this.detailForm.get('tags')?.setValue(entity.tags.map(t => t.id));\r\n if (this.customFields.length) {\r\n this.setCustomFieldFormValues(this.customFields, this.detailForm.get(['customFields']), entity);\r\n }\r\n }\r\n}\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n Asset,\r\n BaseListComponent,\r\n DataService,\r\n DeletionResult,\r\n GetAssetListQuery,\r\n GetAssetListQueryVariables,\r\n ItemOf,\r\n LogicalOperator,\r\n ModalService,\r\n NotificationService,\r\n SortOrder,\r\n TagFragment,\r\n} from '@vendure/admin-ui/core';\r\nimport { PaginationInstance } from 'ngx-pagination';\r\nimport { BehaviorSubject, combineLatest, EMPTY, Observable } from 'rxjs';\r\nimport { debounceTime, finalize, map, switchMap, takeUntil } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'vdr-asset-list',\r\n templateUrl: './asset-list.component.html',\r\n styleUrls: ['./asset-list.component.scss'],\r\n})\r\nexport class AssetListComponent\r\n extends BaseListComponent<\r\n GetAssetListQuery,\r\n ItemOf<GetAssetListQuery, 'assets'>,\r\n GetAssetListQueryVariables\r\n >\r\n implements OnInit\r\n{\r\n searchTerm$ = new BehaviorSubject<string | undefined>(undefined);\r\n filterByTags$ = new BehaviorSubject<TagFragment[] | undefined>(undefined);\r\n uploading = false;\r\n allTags$: Observable<TagFragment[]>;\r\n paginationConfig$: Observable<PaginationInstance>;\r\n\r\n constructor(\r\n private notificationService: NotificationService,\r\n private modalService: ModalService,\r\n private dataService: DataService,\r\n router: Router,\r\n route: ActivatedRoute,\r\n ) {\r\n super(router, route);\r\n super.setQueryFn(\r\n (...args: any[]) => this.dataService.product.getAssetList(...args).refetchOnChannelChange(),\r\n data => data.assets,\r\n (skip, take) => {\r\n const searchTerm = this.searchTerm$.value;\r\n const tags = this.filterByTags$.value?.map(t => t.value);\r\n return {\r\n options: {\r\n skip,\r\n take,\r\n ...(searchTerm\r\n ? {\r\n filter: {\r\n name: { contains: searchTerm },\r\n },\r\n }\r\n : {}),\r\n sort: {\r\n createdAt: SortOrder.DESC,\r\n },\r\n tags,\r\n tagsOperator: LogicalOperator.AND,\r\n },\r\n };\r\n },\r\n { take: 25, skip: 0 },\r\n );\r\n }\r\n\r\n ngOnInit() {\r\n super.ngOnInit();\r\n this.paginationConfig$ = combineLatest(this.itemsPerPage$, this.currentPage$, this.totalItems$).pipe(\r\n map(([itemsPerPage, currentPage, totalItems]) => ({ itemsPerPage, currentPage, totalItems })),\r\n );\r\n this.searchTerm$.pipe(debounceTime(250), takeUntil(this.destroy$)).subscribe(() => this.refresh());\r\n\r\n this.filterByTags$.pipe(takeUntil(this.destroy$)).subscribe(() => this.refresh());\r\n this.allTags$ = this.dataService.product.getTagList().mapStream(data => data.tags.items);\r\n }\r\n\r\n filesSelected(files: File[]) {\r\n if (files.length) {\r\n this.uploading = true;\r\n this.dataService.product\r\n .createAssets(files)\r\n .pipe(finalize(() => (this.uploading = false)))\r\n .subscribe(({ createAssets }) => {\r\n let successCount = 0;\r\n for (const result of createAssets) {\r\n switch (result.__typename) {\r\n case 'Asset':\r\n successCount++;\r\n break;\r\n case 'MimeTypeError':\r\n this.notificationService.error(result.message);\r\n break;\r\n }\r\n }\r\n if (0 < successCount) {\r\n super.refresh();\r\n this.notificationService.success(_('asset.notify-create-assets-success'), {\r\n count: successCount,\r\n });\r\n }\r\n });\r\n }\r\n }\r\n\r\n deleteAssets(assets: Asset[]) {\r\n this.showModalAndDelete(assets.map(a => a.id))\r\n .pipe(\r\n switchMap(response => {\r\n if (response.result === DeletionResult.DELETED) {\r\n return [true];\r\n } else {\r\n return this.showModalAndDelete(\r\n assets.map(a => a.id),\r\n response.message || '',\r\n ).pipe(map(r => r.result === DeletionResult.DELETED));\r\n }\r\n }),\r\n )\r\n .subscribe(\r\n () => {\r\n this.notificationService.success(_('common.notify-delete-success'), {\r\n entity: 'Assets',\r\n });\r\n this.refresh();\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-delete-error'), {\r\n entity: 'Assets',\r\n });\r\n },\r\n );\r\n }\r\n\r\n private showModalAndDelete(assetIds: string[], message?: string) {\r\n return this.modalService\r\n .dialog({\r\n title: _('catalog.confirm-delete-assets'),\r\n translationVars: {\r\n count: assetIds.length,\r\n },\r\n body: message,\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n { type: 'danger', label: _('common.delete'), returnValue: true },\r\n ],\r\n })\r\n .pipe(\r\n switchMap(res => (res ? this.dataService.product.deleteAssets(assetIds, !!message) : EMPTY)),\r\n map(res => res.deleteAssets),\r\n );\r\n }\r\n}\r\n","<vdr-page-block>\r\n <div class=\"my-2\">\r\n <vdr-asset-search-input\r\n [tags]=\"allTags$ | async\"\r\n (searchTermChange)=\"searchTerm$.next($event)\"\r\n (tagsChange)=\"filterByTags$.next($event)\"\r\n >\r\n <vdr-asset-file-input\r\n (selectFiles)=\"filesSelected($event)\"\r\n [uploading]=\"uploading\"\r\n dropZoneTarget=\".content-area\"\r\n ></vdr-asset-file-input>\r\n </vdr-asset-search-input>\r\n </div>\r\n <vdr-asset-gallery\r\n [assets]=\"(items$ | async)! | paginate : (paginationConfig$ | async) || {}\"\r\n [multiSelect]=\"true\"\r\n [canDelete]=\"['DeleteCatalog', 'DeleteAsset'] | hasPermission\"\r\n (deleteAssets)=\"deleteAssets($event)\"\r\n ></vdr-asset-gallery>\r\n\r\n <div class=\"paging-controls\">\r\n <vdr-items-per-page-controls\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\r\n ></vdr-items-per-page-controls>\r\n\r\n <vdr-pagination-controls\r\n [currentPage]=\"currentPage$ | async\"\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n [totalItems]=\"totalItems$ | async\"\r\n (pageChange)=\"setPageNumber($event)\"\r\n ></vdr-pagination-controls>\r\n </div>\r\n</vdr-page-block>\r\n","<div *ngIf=\"!compact; else compactView\" class=\"standard-view-container\">\r\n <div class=\"featured-asset\">\r\n <img\r\n *ngIf=\"featuredAsset\"\r\n [src]=\"featuredAsset | assetPreview : 'small'\"\r\n (click)=\"previewAsset(featuredAsset)\"\r\n />\r\n <div class=\"placeholder\" *ngIf=\"!featuredAsset\" (click)=\"selectAssets()\">\r\n <clr-icon shape=\"image\" size=\"128\"></clr-icon>\r\n <div>{{ 'catalog.no-featured-asset' | translate }}</div>\r\n </div>\r\n </div>\r\n <div class=\"all-assets-container\">\r\n <ng-container *ngTemplateOutlet=\"assetList\"></ng-container>\r\n <div *vdrIfPermissions=\"updatePermissions\">\r\n <button class=\"btn\" (click)=\"selectAssets()\">\r\n <clr-icon shape=\"attachment\"></clr-icon>\r\n {{ 'asset.add-asset' | translate }}\r\n </button>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<ng-template #compactView>\r\n <div class=\"featured-asset compact\">\r\n <img\r\n *ngIf=\"featuredAsset\"\r\n [src]=\"featuredAsset | assetPreview : 'thumb'\"\r\n (click)=\"previewAsset(featuredAsset)\"\r\n />\r\n\r\n <div class=\"placeholder\" *ngIf=\"!featuredAsset\" (click)=\"selectAssets()\">\r\n <clr-icon shape=\"image\" size=\"150\"></clr-icon>\r\n </div>\r\n </div>\r\n <ng-container *ngTemplateOutlet=\"assetList\"></ng-container>\r\n <button\r\n *vdrIfPermissions=\"updatePermissions\"\r\n class=\"compact-select btn btn-icon btn-sm btn-block\"\r\n [title]=\"'asset.add-asset' | translate\"\r\n (click)=\"selectAssets()\"\r\n >\r\n <clr-icon shape=\"attachment\"></clr-icon>\r\n {{ 'asset.add-asset' | translate }}\r\n </button>\r\n</ng-template>\r\n\r\n<ng-template #assetList>\r\n <div class=\"all-assets\" [class.compact]=\"compact\" cdkDropListGroup>\r\n <div\r\n *ngFor=\"let asset of assets; let index = index\"\r\n class=\"drop-list\"\r\n cdkDropList\r\n cdkDropListOrientation=\"horizontal\"\r\n [cdkDropListData]=\"index\"\r\n [cdkDropListDisabled]=\"!(updatePermissions | hasPermission)\"\r\n (cdkDropListDropped)=\"dropListDropped($event)\"\r\n >\r\n <vdr-dropdown cdkDrag>\r\n <div\r\n class=\"asset-thumb\"\r\n vdrDropdownTrigger\r\n [class.featured]=\"isFeatured(asset)\"\r\n [title]=\"\"\r\n tabindex=\"0\"\r\n >\r\n <img [src]=\"asset | assetPreview : 'tiny'\" />\r\n </div>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <button type=\"button\" vdrDropdownItem (click)=\"previewAsset(asset)\">\r\n {{ 'asset.preview' | translate }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n [disabled]=\"isFeatured(asset) || !(updatePermissions | hasPermission)\"\r\n vdrDropdownItem\r\n (click)=\"setAsFeatured(asset)\"\r\n >\r\n {{ 'asset.set-as-featured-asset' | translate }}\r\n </button>\r\n <div class=\"dropdown-divider\"></div>\r\n <button\r\n type=\"button\"\r\n class=\"remove-asset\"\r\n vdrDropdownItem\r\n [disabled]=\"!(updatePermissions | hasPermission)\"\r\n (click)=\"removeAsset(asset)\"\r\n >\r\n {{ 'asset.remove-asset' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </div>\r\n </div>\r\n</ng-template>\r\n","import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';\r\nimport {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n EventEmitter,\r\n HostBinding,\r\n Input,\r\n Output,\r\n} from '@angular/core';\r\nimport {\r\n Asset,\r\n AssetPickerDialogComponent,\r\n AssetPreviewDialogComponent,\r\n ModalService,\r\n Permission,\r\n} from '@vendure/admin-ui/core';\r\nimport { unique } from '@vendure/common/lib/unique';\r\n\r\nexport interface AssetChange {\r\n assets: Asset[];\r\n featuredAsset: Asset | undefined;\r\n}\r\n\r\n/**\r\n * A component which displays the Assets, and allows assets to be removed and\r\n * added, and for the featured asset to be set.\r\n *\r\n * Note: rather complex code for drag drop is due to a limitation of the default CDK implementation\r\n * which is addressed by a work-around from here: https://github.com/angular/components/issues/13372#issuecomment-483998378\r\n */\r\n@Component({\r\n selector: 'vdr-assets',\r\n templateUrl: './assets.component.html',\r\n styleUrls: ['./assets.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class AssetsComponent {\r\n @Input('assets') set assetsSetter(val: Asset[]) {\r\n // create a new non-readonly array of assets\r\n this.assets = (val || []).slice();\r\n }\r\n\r\n @Input() featuredAsset: Asset | undefined;\r\n @HostBinding('class.compact')\r\n @Input()\r\n compact = false;\r\n // eslint-disable-next-line @angular-eslint/no-output-native\r\n @Output() change = new EventEmitter<AssetChange>();\r\n\r\n public assets: Asset[] = [];\r\n\r\n @Input()\r\n updatePermissions: string | string[] | Permission | Permission[];\r\n\r\n constructor(private modalService: ModalService, private changeDetector: ChangeDetectorRef) {}\r\n\r\n selectAssets() {\r\n this.modalService\r\n .fromComponent(AssetPickerDialogComponent, {\r\n size: 'xl',\r\n })\r\n .subscribe(result => {\r\n if (result && result.length) {\r\n this.assets = unique(this.assets.concat(result), 'id');\r\n if (!this.featuredAsset) {\r\n this.featuredAsset = result[0];\r\n }\r\n this.emitChangeEvent(this.assets, this.featuredAsset);\r\n this.changeDetector.markForCheck();\r\n }\r\n });\r\n }\r\n\r\n setAsFeatured(asset: Asset) {\r\n this.featuredAsset = asset;\r\n this.emitChangeEvent(this.assets, asset);\r\n }\r\n\r\n isFeatured(asset: Asset): boolean {\r\n return !!this.featuredAsset && this.featuredAsset.id === asset.id;\r\n }\r\n\r\n previewAsset(asset: Asset) {\r\n this.modalService\r\n .fromComponent(AssetPreviewDialogComponent, {\r\n size: 'xl',\r\n closable: true,\r\n locals: { asset, assets: this.assets },\r\n })\r\n .subscribe();\r\n }\r\n\r\n removeAsset(asset: Asset) {\r\n this.assets = this.assets.filter(a => a.id !== asset.id);\r\n if (this.featuredAsset && this.featuredAsset.id === asset.id) {\r\n this.featuredAsset = this.assets.length > 0 ? this.assets[0] : undefined;\r\n }\r\n this.emitChangeEvent(this.assets, this.featuredAsset);\r\n }\r\n\r\n private emitChangeEvent(assets: Asset[], featuredAsset: Asset | undefined) {\r\n this.change.emit({\r\n assets,\r\n featuredAsset,\r\n });\r\n }\r\n\r\n dropListDropped(event: CdkDragDrop<number>) {\r\n moveItemInArray(this.assets, event.previousContainer.data, event.container.data);\r\n this.emitChangeEvent(this.assets, this.featuredAsset);\r\n }\r\n}\r\n","<ng-template vdrDialogTitle>\r\n <ng-container *ngIf=\"isProductVariantMode; else productModeTitle\">{{\r\n 'catalog.assign-variants-to-channel' | translate\r\n }}</ng-container>\r\n <ng-template #productModeTitle>{{ 'catalog.assign-products-to-channel' | translate }}</ng-template>\r\n</ng-template>\r\n\r\n<div class=\"flex\">\r\n <clr-input-container>\r\n <label>{{ 'common.channel' | translate }}</label>\r\n <vdr-channel-assignment-control\r\n clrInput\r\n [multiple]=\"false\"\r\n [includeDefaultChannel]=\"false\"\r\n [disableChannelIds]=\"currentChannelIds\"\r\n [formControl]=\"selectedChannelIdControl\"\r\n ></vdr-channel-assignment-control>\r\n </clr-input-container>\r\n <div class=\"flex-spacer\"></div>\r\n <clr-input-container>\r\n <label>{{ 'catalog.price-conversion-factor' | translate }}</label>\r\n <input clrInput type=\"number\" min=\"0\" max=\"99999\" [formControl]=\"priceFactorControl\" />\r\n </clr-input-container>\r\n</div>\r\n\r\n<div class=\"channel-price-preview\">\r\n <label class=\"clr-control-label\">{{ 'catalog.channel-price-preview' | translate }}</label>\r\n <table class=\"table\">\r\n <thead>\r\n <tr>\r\n <th>{{ 'common.name' | translate }}</th>\r\n <th>\r\n {{\r\n 'catalog.price-in-channel'\r\n | translate: { channel: currentChannel?.code | channelCodeToLabel | translate }\r\n }}\r\n </th>\r\n <th>\r\n <ng-template [ngIf]=\"selectedChannel\" [ngIfElse]=\"noSelection\">\r\n {{ 'catalog.price-in-channel' | translate: { channel: selectedChannel?.code } }}\r\n </ng-template>\r\n <ng-template #noSelection>\r\n {{ 'catalog.no-channel-selected' | translate }}\r\n </ng-template>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let row of variantsPreview$ | async\">\r\n <td>{{ row.name }}</td>\r\n <td>{{ row.price | localeCurrency: currentChannel?.defaultCurrencyCode }}</td>\r\n <td>\r\n <ng-template [ngIf]=\"selectedChannel\" [ngIfElse]=\"noChannelSelected\">\r\n {{ row.pricePreview | localeCurrency: selectedChannel?.defaultCurrencyCode }}\r\n </ng-template>\r\n <ng-template #noChannelSelected> - </ng-template>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n</div>\r\n\r\n<ng-template vdrDialogButtons>\r\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\r\n <button type=\"submit\" (click)=\"assign()\" [disabled]=\"!selectedChannel\" class=\"btn btn-primary\">\r\n <ng-template [ngIf]=\"selectedChannel\" [ngIfElse]=\"noSelection\">\r\n {{ 'catalog.assign-to-named-channel' | translate: { channelCode: selectedChannel?.code } }}\r\n </ng-template>\r\n <ng-template #noSelection>\r\n {{ 'catalog.no-channel-selected' | translate }}\r\n </ng-template>\r\n </button>\r\n</ng-template>\r\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\r\nimport { UntypedFormControl } from '@angular/forms';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n DataService,\r\n Dialog,\r\n GetChannelsQuery,\r\n ItemOf,\r\n LogicalOperator,\r\n NotificationService,\r\n} from '@vendure/admin-ui/core';\r\nimport { combineLatest, from, lastValueFrom, Observable } from 'rxjs';\r\nimport { map, startWith } from 'rxjs/operators';\r\n\r\ntype Channel = ItemOf<GetChannelsQuery, 'channels'>;\r\n\r\n@Component({\r\n selector: 'vdr-assign-products-to-channel-dialog',\r\n templateUrl: './assign-products-to-channel-dialog.component.html',\r\n styleUrls: ['./assign-products-to-channel-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class AssignProductsToChannelDialogComponent implements OnInit, Dialog<any> {\r\n selectedChannel: Channel | null | undefined;\r\n currentChannel: Channel;\r\n availableChannels: Channel[];\r\n resolveWith: (result?: any) => void;\r\n variantsPreview$: Observable<Array<{ id: string; name: string; price: number; pricePreview: number }>>;\r\n priceFactorControl = new UntypedFormControl(1);\r\n selectedChannelIdControl = new UntypedFormControl();\r\n\r\n // assigned by ModalService.fromComponent() call\r\n productIds: string[];\r\n productVariantIds: string[] | undefined;\r\n currentChannelIds: string[];\r\n\r\n get isProductVariantMode(): boolean {\r\n return this.productVariantIds != null;\r\n }\r\n\r\n constructor(private dataService: DataService, private notificationService: NotificationService) {}\r\n\r\n ngOnInit() {\r\n const activeChannelId$ = this.dataService.client\r\n .userStatus()\r\n .mapSingle(({ userStatus }) => userStatus.activeChannelId);\r\n const allChannels$ = this.dataService.settings.getChannels().mapSingle(data => data.channels);\r\n\r\n combineLatest(activeChannelId$, allChannels$).subscribe(([activeChannelId, channels]) => {\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n this.currentChannel = channels.items.find(c => c.id === activeChannelId)!;\r\n this.availableChannels = channels.items;\r\n });\r\n\r\n this.selectedChannelIdControl.valueChanges.subscribe(ids => {\r\n this.selectChannel(ids);\r\n });\r\n\r\n this.variantsPreview$ = combineLatest(\r\n from(this.getTopVariants(10)),\r\n this.priceFactorControl.valueChanges.pipe(startWith(1)),\r\n ).pipe(\r\n map(([variants, factor]) =>\r\n variants.map(v => ({\r\n id: v.id,\r\n name: v.name,\r\n price: v.price,\r\n pricePreview: v.price * +factor,\r\n })),\r\n ),\r\n );\r\n }\r\n\r\n selectChannel(channelIds: string[]) {\r\n this.selectedChannel = this.availableChannels.find(c => c.id === channelIds[0]);\r\n }\r\n\r\n assign() {\r\n const selectedChannel = this.selectedChannel;\r\n if (selectedChannel) {\r\n if (!this.isProductVariantMode) {\r\n this.dataService.product\r\n .assignProductsToChannel({\r\n channelId: selectedChannel.id,\r\n productIds: this.productIds,\r\n priceFactor: +this.priceFactorControl.value,\r\n })\r\n .subscribe(() => {\r\n this.notificationService.success(_('catalog.assign-product-to-channel-success'), {\r\n channel: selectedChannel.code,\r\n count: this.productIds.length,\r\n });\r\n this.resolveWith(true);\r\n });\r\n } else if (this.productVariantIds) {\r\n this.dataService.product\r\n .assignVariantsToChannel({\r\n channelId: selectedChannel.id,\r\n productVariantIds: this.productVariantIds,\r\n priceFactor: +this.priceFactorControl.value,\r\n })\r\n .subscribe(() => {\r\n this.notificationService.success(_('catalog.assign-variant-to-channel-success'), {\r\n channel: selectedChannel.code,\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n count: this.productVariantIds!.length,\r\n });\r\n this.resolveWith(true);\r\n });\r\n }\r\n }\r\n }\r\n\r\n cancel() {\r\n this.resolveWith();\r\n }\r\n\r\n private async getTopVariants(take: number) {\r\n return (\r\n await lastValueFrom(\r\n this.dataService.product.getProductVariants({\r\n filterOperator: LogicalOperator.OR,\r\n filter: {\r\n productId: { in: this.productIds },\r\n id: { in: this.productVariantIds },\r\n },\r\n take,\r\n }).single$,\r\n )\r\n ).productVariants.items;\r\n }\r\n}\r\n","import { gql } from 'apollo-angular';\r\n\r\nexport const GET_PRODUCTS_WITH_FACET_VALUES_BY_IDS = gql`\r\n query GetProductsWithFacetValuesByIds($ids: [String!]!) {\r\n products(options: { filter: { id: { in: $ids } } }) {\r\n items {\r\n id\r\n name\r\n facetValues {\r\n id\r\n name\r\n code\r\n facet {\r\n id\r\n name\r\n code\r\n }\r\n }\r\n }\r\n }\r\n }\r\n`;\r\n\r\nexport const GET_VARIANTS_WITH_FACET_VALUES_BY_IDS = gql`\r\n query GetVariantsWithFacetValuesByIds($ids: [String!]!) {\r\n productVariants(options: { filter: { id: { in: $ids } } }) {\r\n items {\r\n id\r\n name\r\n sku\r\n facetValues {\r\n id\r\n name\r\n code\r\n facet {\r\n id\r\n name\r\n code\r\n }\r\n }\r\n }\r\n }\r\n }\r\n`;\r\n\r\nexport const UPDATE_PRODUCTS_BULK = gql`\r\n mutation UpdateProductsBulk($input: [UpdateProductInput!]!) {\r\n updateProducts(input: $input) {\r\n id\r\n name\r\n facetValues {\r\n id\r\n name\r\n code\r\n }\r\n }\r\n }\r\n`;\r\n\r\nexport const UPDATE_VARIANTS_BULK = gql`\r\n mutation UpdateVariantsBulk($input: [UpdateProductVariantInput!]!) {\r\n updateProductVariants(input: $input) {\r\n id\r\n name\r\n facetValues {\r\n id\r\n name\r\n code\r\n }\r\n }\r\n }\r\n`;\r\n","<ng-template vdrDialogTitle>\r\n {{ 'catalog.edit-facet-values' | translate }}\r\n</ng-template>\r\n\r\n<div class=\"flex\">\r\n <div class=\"flex center\">\r\n <div class=\"mr2\">\r\n {{ 'catalog.add-facet-value' | translate }}\r\n </div>\r\n <vdr-facet-value-selector\r\n (selectedValuesChange)=\"selectedValues = $event\"\r\n ></vdr-facet-value-selector>\r\n </div>\r\n</div>\r\n\r\n<table class=\"table\" *ngIf=\"state !== 'loading'; else placeholder\">\r\n <tbody>\r\n <tr *ngFor=\"let item of items\">\r\n <td class=\"left align-middle\">\r\n <div>{{ item.name }}</div>\r\n <div *ngIf=\"item.sku\" class=\"sku\">{{ item.sku }}</div>\r\n </td>\r\n <td class=\"left\">\r\n <vdr-facet-value-chip\r\n *ngFor=\"let facetValue of item.facetValues\"\r\n [facetValue]=\"facetValue\"\r\n (remove)=\"removeFacetValue(item, facetValue.id)\"\r\n ></vdr-facet-value-chip>\r\n </td>\r\n </tr>\r\n </tbody>\r\n</table>\r\n\r\n<ng-template #placeholder>\r\n <div class=\"loading\">\r\n <clr-spinner></clr-spinner>\r\n </div>\r\n</ng-template>\r\n\r\n<ng-template vdrDialogButtons>\r\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\r\n <button\r\n type=\"submit\"\r\n (click)=\"addFacetValues()\"\r\n [disabled]=\"selectedValues.length === 0 && facetValuesRemoved === false\"\r\n class=\"btn btn-primary\"\r\n >\r\n {{ 'common.update' | translate }}\r\n </button>\r\n</ng-template>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport {\r\n DataService,\r\n Dialog,\r\n FacetWithValuesFragment,\r\n GetProductsWithFacetValuesByIdsQuery,\r\n GetProductsWithFacetValuesByIdsQueryVariables,\r\n GetVariantsWithFacetValuesByIdsQuery,\r\n UpdateProductsBulkMutation,\r\n UpdateProductsBulkMutationVariables,\r\n UpdateVariantsBulkMutation,\r\n UpdateVariantsBulkMutationVariables,\r\n} from '@vendure/admin-ui/core';\r\nimport { unique } from '@vendure/common/lib/unique';\r\nimport { Observable, Subscription } from 'rxjs';\r\nimport { shareReplay, switchMap } from 'rxjs/operators';\r\n\r\nimport {\r\n GET_PRODUCTS_WITH_FACET_VALUES_BY_IDS,\r\n GET_VARIANTS_WITH_FACET_VALUES_BY_IDS,\r\n UPDATE_PRODUCTS_BULK,\r\n UPDATE_VARIANTS_BULK,\r\n} from './bulk-add-facet-values-dialog.graphql';\r\n\r\ninterface ProductOrVariant {\r\n id: string;\r\n name: string;\r\n sku?: string;\r\n facetValues: Array<{\r\n id: string;\r\n name: string;\r\n code: string;\r\n facet: Array<{\r\n id: string;\r\n name: string;\r\n code: string;\r\n }>;\r\n }>;\r\n}\r\n\r\n@Component({\r\n selector: 'vdr-bulk-add-facet-values-dialog',\r\n templateUrl: './bulk-add-facet-values-dialog.component.html',\r\n styleUrls: ['./bulk-add-facet-values-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class BulkAddFacetValuesDialogComponent\r\n implements OnInit, OnDestroy, Dialog<FacetWithValuesFragment[]>\r\n{\r\n resolveWith: (result?: FacetWithValuesFragment[]) => void;\r\n /* provided by call to ModalService */\r\n mode: 'product' | 'variant' = 'product';\r\n ids?: string[];\r\n state: 'loading' | 'ready' | 'saving' = 'loading';\r\n\r\n selectedValues: FacetWithValuesFragment[] = [];\r\n items: ProductOrVariant[] = [];\r\n facetValuesRemoved = false;\r\n private subscription: Subscription;\r\n constructor(private dataService: DataService, private changeDetectorRef: ChangeDetectorRef) {}\r\n\r\n ngOnInit(): void {\r\n const fetchData$: Observable<any> =\r\n this.mode === 'product'\r\n ? this.dataService\r\n .query<\r\n GetProductsWithFacetValuesByIdsQuery,\r\n GetProductsWithFacetValuesByIdsQueryVariables\r\n >(GET_PRODUCTS_WITH_FACET_VALUES_BY_IDS, {\r\n ids: this.ids ?? [],\r\n })\r\n .mapSingle(({ products }) =>\r\n products.items.map(p => ({ ...p, facetValues: [...p.facetValues] })),\r\n )\r\n : this.dataService\r\n .query<\r\n GetVariantsWithFacetValuesByIdsQuery,\r\n GetProductsWithFacetValuesByIdsQueryVariables\r\n >(GET_VARIANTS_WITH_FACET_VALUES_BY_IDS, {\r\n ids: this.ids ?? [],\r\n })\r\n .mapSingle(({ productVariants }) =>\r\n productVariants.items.map(p => ({ ...p, facetValues: [...p.facetValues] })),\r\n );\r\n this.subscription = fetchData$.subscribe({\r\n next: items => {\r\n this.items = items;\r\n this.state = 'ready';\r\n this.changeDetectorRef.markForCheck();\r\n },\r\n });\r\n }\r\n\r\n ngOnDestroy() {\r\n this.subscription?.unsubscribe();\r\n }\r\n\r\n cancel() {\r\n this.resolveWith();\r\n }\r\n\r\n removeFacetValue(item: ProductOrVariant, facetValueId: string) {\r\n item.facetValues = item.facetValues.filter(fv => fv.id !== facetValueId);\r\n this.facetValuesRemoved = true;\r\n }\r\n\r\n addFacetValues() {\r\n const selectedFacetValueIds = this.selectedValues.map(sv => sv.id);\r\n this.state = 'saving';\r\n const save$: Observable<any> =\r\n this.mode === 'product'\r\n ? this.dataService.mutate<UpdateProductsBulkMutation, UpdateProductsBulkMutationVariables>(\r\n UPDATE_PRODUCTS_BULK,\r\n {\r\n input: this.items?.map(product => ({\r\n id: product.id,\r\n facetValueIds: unique([\r\n ...product.facetValues.map(fv => fv.id),\r\n ...selectedFacetValueIds,\r\n ]),\r\n })),\r\n },\r\n )\r\n : this.dataService.mutate<UpdateVariantsBulkMutation, UpdateVariantsBulkMutationVariables>(\r\n UPDATE_VARIANTS_BULK,\r\n {\r\n input: this.items?.map(product => ({\r\n id: product.id,\r\n facetValueIds: unique([\r\n ...product.facetValues.map(fv => fv.id),\r\n ...selectedFacetValueIds,\r\n ]),\r\n })),\r\n },\r\n );\r\n return save$.subscribe(result => {\r\n this.resolveWith(this.selectedValues);\r\n });\r\n }\r\n}\r\n","<div class=\"table-wrapper\">\r\n <div class=\"progress loop\" [class.visible]=\"isLoading\"></div>\r\n <div class=\"header-title-row\">\r\n <ng-container\r\n *ngTemplateOutlet=\"headerTemplate; context: { $implicit: contentsTotalItems$ | async }\"\r\n ></ng-container>\r\n </div>\r\n <vdr-data-table-2\r\n id=\"collection-contents\"\r\n [class.loading]=\"isLoading\"\r\n [items]=\"contents$ | async\"\r\n [itemsPerPage]=\"contentsItemsPerPage$ | async\"\r\n [totalItems]=\"contentsTotalItems$ | async\"\r\n [currentPage]=\"contentsCurrentPage$ | async\"\r\n (pageChange)=\"setContentsPageNumber($event)\"\r\n (itemsPerPageChange)=\"setContentsItemsPerPage($event)\"\r\n >\r\n <vdr-dt2-search\r\n [searchTermControl]=\"filterTermControl\"\r\n [searchTermPlaceholder]=\"'catalog.filter-by-name' | translate\"\r\n />\r\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.id }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.created-at' | translate\" id=\"created-at\" [hiddenByDefault]=\"true\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.createdAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.updated-at' | translate\" id=\"updated-at\" [hiddenByDefault]=\"true\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.updatedAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.name' | translate\" id=\"name\" [optional]=\"false\">\r\n <ng-template let-variant=\"item\">\r\n <a class=\"button-ghost\" [routerLink]=\"['/catalog/products', variant.productId]\"\r\n ><span>{{ variant.name }}</span\r\n ><clr-icon shape=\"arrow right\"\r\n /></a>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'catalog.sku' | translate\" id=\"sku\" [optional]=\"false\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.sku }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n </vdr-data-table-2>\r\n</div>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ContentChild,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n SimpleChanges,\r\n TemplateRef,\r\n} from '@angular/core';\r\nimport { UntypedFormControl } from '@angular/forms';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport {\r\n CollectionFilterParameter,\r\n ConfigurableOperationInput,\r\n DataService,\r\n GetCollectionContentsQuery,\r\n} from '@vendure/admin-ui/core';\r\nimport { BehaviorSubject, combineLatest, Observable, of, Subject } from 'rxjs';\r\nimport {\r\n catchError,\r\n debounceTime,\r\n distinctUntilChanged,\r\n filter,\r\n finalize,\r\n map,\r\n startWith,\r\n switchMap,\r\n takeUntil,\r\n tap,\r\n} from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'vdr-collection-contents',\r\n templateUrl: './collection-contents.component.html',\r\n styleUrls: ['./collection-contents.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CollectionContentsComponent implements OnInit, OnChanges, OnDestroy {\r\n @Input() collectionId: string;\r\n @Input() parentId: string;\r\n @Input() inheritFilters: boolean;\r\n @Input() updatedFilters: ConfigurableOperationInput[] | undefined;\r\n @Input() previewUpdatedFilters = false;\r\n @ContentChild(TemplateRef, { static: true }) headerTemplate: TemplateRef<any>;\r\n\r\n contents$: Observable<NonNullable<GetCollectionContentsQuery['collection']>['productVariants']['items']>;\r\n contentsTotalItems$: Observable<number>;\r\n contentsItemsPerPage$: Observable<number>;\r\n contentsCurrentPage$: Observable<number>;\r\n filterTermControl = new UntypedFormControl('');\r\n isLoading = false;\r\n private collectionIdChange$ = new BehaviorSubject<string>('');\r\n private parentIdChange$ = new BehaviorSubject<string>('');\r\n private filterChanges$ = new BehaviorSubject<ConfigurableOperationInput[]>([]);\r\n private inheritFiltersChanges$ = new BehaviorSubject<boolean>(true);\r\n private refresh$ = new BehaviorSubject<boolean>(true);\r\n private destroy$ = new Subject<void>();\r\n\r\n constructor(private route: ActivatedRoute, private router: Router, private dataService: DataService) {}\r\n\r\n ngOnInit() {\r\n this.contentsCurrentPage$ = this.route.queryParamMap.pipe(\r\n map(qpm => qpm.get('contentsPage')),\r\n map(page => (!page ? 1 : +page)),\r\n startWith(1),\r\n distinctUntilChanged(),\r\n );\r\n\r\n this.contentsItemsPerPage$ = this.route.queryParamMap.pipe(\r\n map(qpm => qpm.get('contentsPerPage')),\r\n map(perPage => (!perPage ? 10 : +perPage)),\r\n startWith(10),\r\n distinctUntilChanged(),\r\n );\r\n\r\n const filterTerm$ = this.filterTermControl.valueChanges.pipe(\r\n debounceTime(250),\r\n tap(() => this.setContentsPageNumber(1)),\r\n startWith(''),\r\n );\r\n\r\n const filterChanges$ = this.filterChanges$.asObservable().pipe(\r\n filter(() => this.previewUpdatedFilters),\r\n tap(() => this.setContentsPageNumber(1)),\r\n startWith([]),\r\n );\r\n\r\n const inheritFiltersChanges$ = this.inheritFiltersChanges$.asObservable().pipe(\r\n filter(() => this.inheritFilters != null),\r\n distinctUntilChanged(),\r\n tap(() => this.setContentsPageNumber(1)),\r\n startWith(true),\r\n );\r\n\r\n const fetchUpdate$ = combineLatest(\r\n this.collectionIdChange$,\r\n this.parentIdChange$,\r\n this.contentsCurrentPage$,\r\n this.contentsItemsPerPage$,\r\n filterTerm$,\r\n filterChanges$,\r\n inheritFiltersChanges$,\r\n this.refresh$,\r\n );\r\n\r\n const collection$ = fetchUpdate$.pipe(\r\n takeUntil(this.destroy$),\r\n tap(() => (this.isLoading = true)),\r\n debounceTime(50),\r\n switchMap(([id, parentId, currentPage, itemsPerPage, filterTerm, filters, inheritFilters]) => {\r\n const take = itemsPerPage;\r\n const skip = (currentPage - 1) * itemsPerPage;\r\n if (filters.length && this.previewUpdatedFilters) {\r\n const filterClause = filterTerm\r\n ? ({ name: { contains: filterTerm } } as CollectionFilterParameter)\r\n : undefined;\r\n return this.dataService.collection\r\n .previewCollectionVariants(\r\n {\r\n parentId,\r\n filters,\r\n inheritFilters,\r\n },\r\n {\r\n take,\r\n skip,\r\n filter: filterClause,\r\n },\r\n )\r\n .mapSingle(data => data.previewCollectionVariants)\r\n .pipe(catchError(() => of({ items: [], totalItems: 0 })));\r\n } else if (id) {\r\n return this.dataService.collection\r\n .getCollectionContents(id, take, skip, filterTerm)\r\n .mapSingle(data => data.collection?.productVariants);\r\n } else {\r\n return of(null);\r\n }\r\n }),\r\n tap(() => (this.isLoading = false)),\r\n finalize(() => (this.isLoading = false)),\r\n );\r\n\r\n this.contents$ = collection$.pipe(map(result => (result ? result.items : [])));\r\n this.contentsTotalItems$ = collection$.pipe(map(result => (result ? result.totalItems : 0)));\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if ('collectionId' in changes) {\r\n this.collectionIdChange$.next(changes.collectionId.currentValue);\r\n }\r\n if ('parentId' in changes) {\r\n this.parentIdChange$.next(changes.parentId.currentValue);\r\n }\r\n if ('inheritFilters' in changes) {\r\n this.inheritFiltersChanges$.next(changes.inheritFilters.currentValue);\r\n }\r\n if ('updatedFilters' in changes) {\r\n if (this.updatedFilters) {\r\n this.filterChanges$.next(this.updatedFilters);\r\n }\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy$.next();\r\n this.destroy$.complete();\r\n }\r\n\r\n setContentsPageNumber(page: number) {\r\n this.setParam('contentsPage', page);\r\n }\r\n\r\n setContentsItemsPerPage(perPage: number) {\r\n this.setParam('contentsPerPage', perPage);\r\n }\r\n\r\n refresh() {\r\n this.refresh$.next(true);\r\n }\r\n\r\n private setParam(key: string, value: any) {\r\n this.router.navigate(['./'], {\r\n relativeTo: this.route,\r\n queryParams: {\r\n [key]: value,\r\n },\r\n queryParamsHandling: 'merge',\r\n replaceUrl: true,\r\n });\r\n }\r\n}\r\n","<vdr-data-table-filter-presets\r\n *ngIf=\"filters\"\r\n [filters]=\"filters\"\r\n [dataTableId]=\"id\"\r\n></vdr-data-table-filter-presets>\r\n<div class=\"table-wrapper\">\r\n <div class=\"bulk-actions\">\r\n <ng-content select=\"vdr-bulk-action-menu\"></ng-content>\r\n </div>\r\n <table class=\"\" [class.no-select]=\"disableSelect\">\r\n <thead [class.items-selected]=\"selectionManager?.selection.length\">\r\n <tr class=\"heading-row\">\r\n <th *ngIf=\"selectionManager\" class=\"selection-col\">\r\n <div class=\"flex\">\r\n <div class=\"drag-handle-spacer\"></div>\r\n <input\r\n type=\"checkbox\"\r\n clrCheckbox\r\n [checked]=\"selectionManager?.areAllCurrentItemsSelected()\"\r\n (change)=\"onToggleAllClick()\"\r\n />\r\n </div>\r\n </th>\r\n <th\r\n *ngFor=\"let column of visibleSortedColumns; last as isLast\"\r\n [class.expand]=\"column.expand\"\r\n >\r\n <div class=\"cell-content\" [ngClass]=\"column.align\">\r\n <vdr-ui-extension-point\r\n [locationId]=\"id\"\r\n [metadata]=\"column.id\"\r\n api=\"dataTable\"\r\n [topPx]=\"-6\"\r\n [leftPx]=\"-24\"\r\n display=\"block\"\r\n >\r\n <span>{{ column.heading }}</span>\r\n </vdr-ui-extension-point>\r\n <div *ngIf=\"column.sort as sort\" class=\"sort-toggle\">\r\n <button (click)=\"sort.toggleSortOrder()\" [class.active]=\"sort.sortOrder\">\r\n <clr-icon *ngIf=\"!sort.sortOrder\" shape=\"two-way-arrows left\"></clr-icon>\r\n <clr-icon *ngIf=\"sort.sortOrder === 'ASC'\" shape=\"arrow up\"></clr-icon>\r\n <clr-icon *ngIf=\"sort.sortOrder === 'DESC'\" shape=\"arrow down\"></clr-icon>\r\n </button>\r\n <div class=\"sort-label\" *ngIf=\"sort.sortOrder\">{{ sort.sortOrder }}</div>\r\n </div>\r\n </div>\r\n </th>\r\n <th>\r\n <div class=\"column-picker\">\r\n <vdr-data-table-colum-picker\r\n [uiLanguage]=\"uiLanguage$ | async\"\r\n [columns]=\"sortedColumns\"\r\n (reorder)=\"onColumnReorder($event)\"\r\n (resetColumns)=\"onColumnsReset()\"\r\n ></vdr-data-table-colum-picker>\r\n </div>\r\n </th>\r\n </tr>\r\n <tr *ngIf=\"searchComponent || customSearchTemplate || filters?.length\">\r\n <th\r\n [attr.colspan]=\"visibleSortedColumns.length + (selectionManager ? 2 : 1)\"\r\n class=\"filter-row\"\r\n [class.active]=\"showSearchFilterRow\"\r\n >\r\n <button\r\n class=\"button-ghost toggle-search-filter-row\"\r\n [class.active]=\"showSearchFilterRow\"\r\n (click)=\"toggleSearchFilterRow()\"\r\n [title]=\"'common.search-and-filter-list' | translate\"\r\n >\r\n <clr-icon shape=\"search\"></clr-icon>\r\n </button>\r\n <div class=\"filter-row-wrapper\" [class.hidden]=\"!showSearchFilterRow\">\r\n <ng-container *ngTemplateOutlet=\"searchComponent?.template\"></ng-container>\r\n <ng-container *ngTemplateOutlet=\"customSearchTemplate\"></ng-container>\r\n <ng-container *ngIf=\"filters\">\r\n <div class=\"filters\">\r\n <vdr-data-table-filters\r\n *ngFor=\"let activeFilter of filters.activeFilters\"\r\n [filterWithValue]=\"activeFilter\"\r\n [filters]=\"filters\"\r\n class=\"mt-1\"\r\n ></vdr-data-table-filters>\r\n <vdr-data-table-filters\r\n *ngIf=\"filters.length\"\r\n [filters]=\"filters\"\r\n class=\"mt-1\"\r\n ></vdr-data-table-filters>\r\n <vdr-add-filter-preset-button\r\n [filters]=\"filters\"\r\n [dataTableId]=\"id\"\r\n ></vdr-add-filter-preset-button>\r\n </div>\r\n </ng-container>\r\n </div>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody\r\n cdkDropList\r\n cdkDropListLockAxis=\"y\"\r\n (cdkDropListDropped)=\"onDrop($event)\"\r\n [cdkDropListSortPredicate]=\"sortPredicate\"\r\n >\r\n <ng-container\r\n *ngFor=\"\r\n let item of items\r\n | paginate\r\n : {\r\n itemsPerPage: itemsPerPage,\r\n currentPage: currentPage,\r\n totalItems: totalItems,\r\n id: id,\r\n };\r\n index as i;\r\n trackBy: trackByFn\r\n \"\r\n >\r\n <ng-container\r\n [ngTemplateOutlet]=\"collectionRowTmp\"\r\n [ngTemplateOutletContext]=\"{ item: item, i: i, depth: 0 }\"\r\n ></ng-container>\r\n </ng-container>\r\n <ng-container>\r\n <tr *ngIf=\"!items?.length\">\r\n <td [attr.colspan]=\"visibleSortedColumns.length + (selectionManager ? 2 : 1)\">\r\n <vdr-empty-placeholder [emptyStateLabel]=\"emptyStateLabel\"></vdr-empty-placeholder>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n</div>\r\n<div class=\"table-footer\">\r\n <vdr-items-per-page-controls\r\n *ngIf=\"totalItems\"\r\n [itemsPerPage]=\"itemsPerPage\"\r\n (itemsPerPageChange)=\"itemsPerPageChange.emit($event)\"\r\n ></vdr-items-per-page-controls>\r\n <div *ngIf=\"totalItems\" class=\"p5 total-items-count\">\r\n {{ 'common.total-items' | translate : { currentStart, currentEnd, totalItems } }}\r\n </div>\r\n\r\n <vdr-pagination-controls\r\n *ngIf=\"totalItems\"\r\n [id]=\"id\"\r\n [currentPage]=\"currentPage\"\r\n [itemsPerPage]=\"itemsPerPage\"\r\n [totalItems]=\"totalItems\"\r\n (pageChange)=\"pageChange.emit($event)\"\r\n ></vdr-pagination-controls>\r\n</div>\r\n\r\n<ng-template #collectionRowTmp let-item=\"item\" let-depth=\"depth\">\r\n <tr #collectionRow cdkDrag [cdkDragData]=\"{ depth: depth, collection: item }\" cdkDragBoundary=\"tbody\">\r\n <td\r\n *ngIf=\"selectionManager\"\r\n [class.active]=\"activeIndex === absoluteIndex[item.id]\"\r\n class=\"selection-col\"\r\n >\r\n <div class=\"flex\">\r\n <div class=\"drag-handle\" cdkDragHandle [title]=\"'catalog.reorder-collection' | translate\">\r\n <clr-icon shape=\"drag-handle\"></clr-icon>\r\n </div>\r\n <input\r\n type=\"checkbox\"\r\n clrCheckbox\r\n [checked]=\"selectionManager?.isSelected(item)\"\r\n (click)=\"onRowClick(item, $event)\"\r\n />\r\n </div>\r\n </td>\r\n <td\r\n *ngFor=\"let column of visibleSortedColumns\"\r\n [class.active]=\"activeIndex === absoluteIndex[item.id]\"\r\n >\r\n <div class=\"cell-content\" [ngClass]=\"column.align\">\r\n <ng-container\r\n *ngIf=\"customComponents.get(column.id) as componentConfig; else defaultComponent\"\r\n >\r\n <ng-container\r\n *ngComponentOutlet=\"\r\n componentConfig.config.component;\r\n inputs: { rowItem: item };\r\n injector: componentConfig.injector\r\n \"\r\n ></ng-container>\r\n </ng-container>\r\n <ng-template #defaultComponent>\r\n <ng-container\r\n *ngTemplateOutlet=\"column.template; context: { item: item, depth: depth }\"\r\n ></ng-container>\r\n </ng-template>\r\n </div>\r\n </td>\r\n <td [class.active]=\"activeIndex === absoluteIndex[item.id]\"><!-- column select --></td>\r\n </tr>\r\n <ng-container *ngFor=\"let subCollection of getSubcollections(item)\">\r\n <ng-container\r\n *ngTemplateOutlet=\"collectionRowTmp; context: { item: subCollection, depth: depth + 1 }\"\r\n ></ng-container>\r\n </ng-container>\r\n</ng-template>\r\n","import { CdkDrag, CdkDragDrop, CdkDropList, DragDrop, DragRef } from '@angular/cdk/drag-drop';\r\nimport {\r\n AfterViewInit,\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnChanges,\r\n OnInit,\r\n Output,\r\n QueryList,\r\n SimpleChanges,\r\n ViewChild,\r\n ViewChildren,\r\n} from '@angular/core';\r\nimport {\r\n DataService,\r\n DataTable2Component,\r\n GetCollectionListQuery,\r\n ItemOf,\r\n LocalStorageService,\r\n} from '@vendure/admin-ui/core';\r\n\r\nexport type CollectionTableItem = ItemOf<GetCollectionListQuery, 'collections'>;\r\nexport type CollectionOrderEvent = {\r\n collectionId: string;\r\n parentId: string;\r\n index: number;\r\n};\r\n@Component({\r\n selector: 'vdr-collection-data-table',\r\n templateUrl: './collection-data-table.component.html',\r\n styleUrls: [\r\n '../../../../core/src/shared/components/data-table-2/data-table2.component.scss',\r\n './collection-data-table.component.scss',\r\n ],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CollectionDataTableComponent\r\n extends DataTable2Component<CollectionTableItem>\r\n implements OnChanges, AfterViewInit\r\n{\r\n @Input() subCollections: CollectionTableItem[];\r\n @Output() changeOrder = new EventEmitter<CollectionOrderEvent>();\r\n @ViewChild(CdkDropList, { static: true }) dropList: CdkDropList<{\r\n depth: number;\r\n collection: CollectionTableItem;\r\n }>;\r\n @ViewChildren('collectionRow', { read: CdkDrag }) collectionRowList: QueryList<CdkDrag>;\r\n dragRefs: DragRef[] = [];\r\n absoluteIndex: { [id: string]: number } = {};\r\n constructor(\r\n protected changeDetectorRef: ChangeDetectorRef,\r\n protected localStorageService: LocalStorageService,\r\n protected dataService: DataService,\r\n private dragDrop: DragDrop,\r\n ) {\r\n super(changeDetectorRef, localStorageService, dataService);\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n super.ngOnChanges(changes);\r\n if (changes.subCollections || changes.items) {\r\n const allCollections: CollectionTableItem[] = [];\r\n for (const collection of this.items ?? []) {\r\n allCollections.push(collection);\r\n const subCollectionMatches = this.getSubcollections(collection);\r\n allCollections.push(...subCollectionMatches.flat());\r\n }\r\n allCollections.forEach((collection, index) => (this.absoluteIndex[collection.id] = index));\r\n }\r\n }\r\n\r\n ngAfterViewInit() {\r\n this.collectionRowList.changes.subscribe((val: QueryList<CdkDrag>) => {\r\n this.dropList.getSortedItems().forEach(item => this.dropList.removeItem(item));\r\n for (const ref of val.toArray()) {\r\n ref.dropContainer = this.dropList;\r\n ref._dragRef._withDropContainer(this.dropList._dropListRef);\r\n this.dropList.addItem(ref);\r\n }\r\n });\r\n }\r\n\r\n getSubcollections(item: CollectionTableItem) {\r\n return this.subCollections?.filter(c => c.parentId === item.id) ?? [];\r\n }\r\n\r\n sortPredicate = (index: number, item: CdkDrag<{ depth: number; collection: CollectionTableItem }>) => {\r\n const itemAtIndex = this.dropList.getSortedItems()[index];\r\n return itemAtIndex?.data.collection.parentId === item.data.collection.parentId;\r\n };\r\n\r\n onDrop(\r\n event: CdkDragDrop<{\r\n depth: number;\r\n collection: CollectionTableItem;\r\n }>,\r\n ) {\r\n const isTopLevel = event.item.data.collection.breadcrumbs.length === 2;\r\n const pageIndexOffset = isTopLevel ? (this.currentPage - 1) * this.itemsPerPage : 0;\r\n const parentId = event.item.data.collection.parentId;\r\n const parentIndex = this.items.findIndex(i => i.id === parentId);\r\n const adjustedIndex = pageIndexOffset + event.currentIndex - parentIndex - 1;\r\n this.changeOrder.emit({\r\n collectionId: event.item.data.collection.id,\r\n index: adjustedIndex,\r\n parentId: event.item.data.collection.parentId,\r\n });\r\n\r\n if (isTopLevel) {\r\n this.items = [...this.items];\r\n this.items.splice(event.previousIndex, 1);\r\n this.items.splice(event.currentIndex, 0, event.item.data.collection);\r\n } else {\r\n const parent = this.items.find(i => i.id === parentId);\r\n if (parent) {\r\n const subCollections = this.getSubcollections(parent);\r\n const adjustedPreviousIndex = pageIndexOffset + event.previousIndex - parentIndex - 1;\r\n subCollections.splice(adjustedPreviousIndex, 1);\r\n subCollections.splice(event.currentIndex, 0, event.item.data.collection);\r\n }\r\n }\r\n this.changeDetectorRef.markForCheck();\r\n }\r\n}\r\n","<vdr-page-block>\r\n <vdr-action-bar>\r\n <vdr-ab-left>\r\n <vdr-language-selector\r\n [disabled]=\"isNew$ | async\"\r\n [availableLanguageCodes]=\"availableLanguages$ | async\"\r\n [currentLanguageCode]=\"languageCode$ | async\"\r\n (languageCodeChange)=\"setLanguage($event)\"\r\n ></vdr-language-selector>\r\n </vdr-ab-left>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"collection-detail\"></vdr-action-bar-items>\r\n <button\r\n class=\"btn btn-primary\"\r\n *ngIf=\"isNew$ | async; else updateButton\"\r\n (click)=\"create()\"\r\n [disabled]=\"detailForm.invalid || detailForm.pristine\"\r\n >\r\n {{ 'common.create' | translate }}\r\n </button>\r\n <ng-template #updateButton>\r\n <button\r\n *vdrIfPermissions=\"updatePermission\"\r\n class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n [disabled]=\"(detailForm.invalid || detailForm.pristine) && !assetsChanged()\"\r\n >\r\n {{ 'common.update' | translate }}\r\n </button>\r\n </ng-template></vdr-ab-right\r\n >\r\n </vdr-action-bar>\r\n</vdr-page-block>\r\n<form class=\"form\" [formGroup]=\"detailForm\">\r\n <vdr-page-detail-layout>\r\n <vdr-page-detail-sidebar>\r\n <vdr-card>\r\n <vdr-form-field [label]=\"'catalog.visibility' | translate\" for=\"visibility\">\r\n <clr-toggle-wrapper>\r\n <input\r\n type=\"checkbox\"\r\n clrToggle\r\n formControlName=\"visible\"\r\n id=\"visibility\"\r\n [vdrDisabled]=\"!(updatePermission | hasPermission)\"\r\n />\r\n <label class=\"visible-toggle\">\r\n <ng-container *ngIf=\"detailForm.value.visible; else private\">{{\r\n 'catalog.public' | translate\r\n }}</ng-container>\r\n <ng-template #private>{{ 'catalog.private' | translate }}</ng-template>\r\n </label>\r\n </clr-toggle-wrapper>\r\n </vdr-form-field>\r\n </vdr-card>\r\n <vdr-card *ngIf=\"entity$ | async as entity\">\r\n <vdr-page-entity-info [entity]=\"entity\"></vdr-page-entity-info>\r\n </vdr-card>\r\n </vdr-page-detail-sidebar>\r\n\r\n <vdr-page-block *ngIf=\"entity$ | async as entity\"\r\n ><nav role=\"navigation\">\r\n <ul class=\"collection-breadcrumbs\">\r\n <li *ngFor=\"let breadcrumb of entity.breadcrumbs; let isFirst = first; let isLast = last\">\r\n <a [routerLink]=\"['/catalog/collections']\" *ngIf=\"isFirst\">{{\r\n 'catalog.root-collection' | translate\r\n }}</a>\r\n <a\r\n [routerLink]=\"['/catalog/collections', breadcrumb.id]\"\r\n *ngIf=\"!isFirst && !isLast\"\r\n >{{ breadcrumb.name | translate }}</a\r\n >\r\n <ng-container *ngIf=\"isLast\">{{ breadcrumb.name | translate }}</ng-container>\r\n </li>\r\n </ul>\r\n </nav>\r\n </vdr-page-block>\r\n\r\n <vdr-page-block>\r\n <vdr-card>\r\n <div class=\"form-grid\">\r\n <vdr-form-field [label]=\"'common.name' | translate\" for=\"name\">\r\n <input\r\n id=\"name\"\r\n type=\"text\"\r\n formControlName=\"name\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n (input)=\"updateSlug($event.target.value)\"\r\n />\r\n </vdr-form-field>\r\n <vdr-form-field\r\n [label]=\"'catalog.slug' | translate\"\r\n for=\"slug\"\r\n [errors]=\"{ pattern: ('catalog.slug-pattern-error' | translate) }\"\r\n >\r\n <input\r\n id=\"slug\"\r\n type=\"text\"\r\n formControlName=\"slug\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n />\r\n </vdr-form-field>\r\n <vdr-form-field\r\n class=\"form-grid-span\"\r\n [label]=\"'common.description' | translate\"\r\n for=\"slug\"\r\n >\r\n <vdr-rich-text-editor\r\n formControlName=\"description\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n ></vdr-rich-text-editor>\r\n </vdr-form-field>\r\n </div>\r\n </vdr-card>\r\n <vdr-card\r\n formGroupName=\"customFields\"\r\n *ngIf=\"customFields.length\"\r\n [title]=\"'common.custom-fields' | translate\"\r\n >\r\n <vdr-tabbed-custom-fields\r\n entityName=\"Collection\"\r\n [customFields]=\"customFields\"\r\n [customFieldsFormGroup]=\"detailForm.get('customFields')\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n ></vdr-tabbed-custom-fields>\r\n </vdr-card>\r\n <vdr-custom-detail-component-host\r\n locationId=\"collection-detail\"\r\n [entity$]=\"entity$\"\r\n [detailForm]=\"detailForm\"\r\n ></vdr-custom-detail-component-host>\r\n <vdr-card [title]=\"'catalog.assets' | translate\">\r\n <vdr-assets\r\n [assets]=\"entity?.assets\"\r\n [featuredAsset]=\"entity?.featuredAsset\"\r\n [updatePermissions]=\"updatePermission\"\r\n (change)=\"assetChanges = $event\"\r\n ></vdr-assets>\r\n </vdr-card>\r\n <vdr-card [title]=\"'catalog.filters' | translate\">\r\n <vdr-form-field\r\n [label]=\"'catalog.filter-inheritance' | translate\"\r\n for=\"inheritFilters\"\r\n >\r\n <clr-toggle-wrapper>\r\n <input\r\n type=\"checkbox\"\r\n clrToggle\r\n formControlName=\"inheritFilters\"\r\n id=\"inheritFilters\"\r\n [vdrDisabled]=\"!(updatePermission | hasPermission)\"\r\n />\r\n <label class=\"visible-toggle\">\r\n <ng-container *ngIf=\"detailForm.value.inheritFilters; else noInherit\">{{\r\n 'catalog.inherit-filters-from-parent' | translate\r\n }}</ng-container>\r\n <ng-template #noInherit>{{\r\n 'catalog.do-not-inherit-filters' | translate\r\n }}</ng-template>\r\n </label>\r\n </clr-toggle-wrapper>\r\n </vdr-form-field>\r\n <div formArrayName=\"filters\">\r\n <ng-container *ngFor=\"let filter of filters; index as i; trackBy: trackByFn\">\r\n <vdr-configurable-input\r\n (remove)=\"removeFilter(i)\"\r\n [position]=\"i\"\r\n [operation]=\"filter\"\r\n [operationDefinition]=\"getFilterDefinition(filter)\"\r\n [formControlName]=\"i\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n ></vdr-configurable-input>\r\n </ng-container>\r\n </div>\r\n <div *vdrIfPermissions=\"updatePermission\">\r\n <vdr-dropdown>\r\n <button class=\"btn btn-outline\" vdrDropdownTrigger>\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n <span>{{ 'marketing.add-condition' | translate }}</span>\r\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-left\">\r\n <button\r\n *ngFor=\"let filter of allFilters\"\r\n type=\"button\"\r\n vdrDropdownItem\r\n (click)=\"addFilter(filter)\"\r\n >\r\n {{ filter.description }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </div>\r\n </vdr-card>\r\n\r\n <vdr-card [title]=\"'common.contents' | translate\" [paddingX]=\"false\">\r\n <vdr-collection-contents\r\n [collectionId]=\"id\"\r\n [parentId]=\"parentId$ | async\"\r\n [updatedFilters]=\"updatedFilters$ | async\"\r\n [inheritFilters]=\"inheritFilters$ | async\"\r\n [previewUpdatedFilters]=\"livePreview\"\r\n #collectionContents\r\n >\r\n <ng-template let-count>\r\n <div class=\"ml-3\">\r\n <div class=\"contents-title\">\r\n {{ 'catalog.collection-contents' | translate }} ({{\r\n 'common.results-count' | translate : { count: count }\r\n }})\r\n </div>\r\n <clr-checkbox-wrapper [class.disabled]=\"detailForm.get('filters')?.pristine\">\r\n <input\r\n type=\"checkbox\"\r\n clrCheckbox\r\n [ngModelOptions]=\"{ standalone: true }\"\r\n [disabled]=\"detailForm.get('filters')?.pristine\"\r\n [ngModel]=\"livePreview\"\r\n (ngModelChange)=\"toggleLivePreview()\"\r\n />\r\n <label>{{ 'catalog.live-preview-contents' | translate }}</label>\r\n </clr-checkbox-wrapper>\r\n </div>\r\n </ng-template>\r\n </vdr-collection-contents>\r\n </vdr-card>\r\n </vdr-page-block>\r\n </vdr-page-detail-layout>\r\n</form>\r\n","import {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n OnDestroy,\r\n OnInit,\r\n ViewChild,\r\n} from '@angular/core';\r\nimport { FormBuilder, UntypedFormArray, UntypedFormControl, Validators } from '@angular/forms';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n Asset,\r\n COLLECTION_FRAGMENT,\r\n CollectionDetailQueryDocument,\r\n CollectionFragment,\r\n ConfigurableOperation,\r\n ConfigurableOperationDefinition,\r\n ConfigurableOperationInput,\r\n CreateCollectionInput,\r\n createUpdatedTranslatable,\r\n DataService,\r\n encodeConfigArgValue,\r\n findTranslation,\r\n getConfigArgValue,\r\n getCustomFieldsDefaults,\r\n LanguageCode,\r\n LocalStorageService,\r\n ModalService,\r\n NotificationService,\r\n Permission,\r\n TypedBaseDetailComponent,\r\n unicodePatternValidator,\r\n UpdateCollectionInput,\r\n} from '@vendure/admin-ui/core';\r\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\r\nimport { gql } from 'apollo-angular';\r\nimport { combineLatest, merge, Observable, of, Subject } from 'rxjs';\r\nimport { debounceTime, distinctUntilChanged, filter, map, mergeMap, switchMap, take } from 'rxjs/operators';\r\n\r\nimport { CollectionContentsComponent } from '../collection-contents/collection-contents.component';\r\n\r\nexport const COLLECTION_DETAIL_QUERY = gql`\r\n query CollectionDetailQuery($id: ID!) {\r\n collection(id: $id) {\r\n ...Collection\r\n }\r\n }\r\n ${COLLECTION_FRAGMENT}\r\n`;\r\n\r\n@Component({\r\n selector: 'vdr-collection-detail',\r\n templateUrl: './collection-detail.component.html',\r\n styleUrls: ['./collection-detail.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CollectionDetailComponent\r\n extends TypedBaseDetailComponent<typeof CollectionDetailQueryDocument, 'collection'>\r\n implements OnInit, OnDestroy\r\n{\r\n customFields = this.getCustomFieldConfig('Collection');\r\n detailForm = this.formBuilder.group({\r\n name: ['', Validators.required],\r\n slug: ['', unicodePatternValidator(/^[\\p{Letter}0-9._-]+$/)],\r\n description: '',\r\n visible: false,\r\n inheritFilters: true,\r\n filters: this.formBuilder.array([]),\r\n customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),\r\n });\r\n assetChanges: { assets?: Asset[]; featuredAsset?: Asset } = {};\r\n filters: ConfigurableOperation[] = [];\r\n allFilters: ConfigurableOperationDefinition[] = [];\r\n updatedFilters$: Observable<ConfigurableOperationInput[]>;\r\n inheritFilters$: Observable<boolean>;\r\n livePreview = false;\r\n parentId$: Observable<string | undefined>;\r\n readonly updatePermission = [Permission.UpdateCatalog, Permission.UpdateCollection];\r\n private filterRemoved$ = new Subject<void>();\r\n @ViewChild('collectionContents') contentsComponent: CollectionContentsComponent;\r\n\r\n constructor(\r\n private changeDetector: ChangeDetectorRef,\r\n protected dataService: DataService,\r\n private formBuilder: FormBuilder,\r\n private notificationService: NotificationService,\r\n private modalService: ModalService,\r\n private localStorageService: LocalStorageService,\r\n ) {\r\n super();\r\n this.livePreview = this.localStorageService.get('livePreviewCollectionContents') ?? false;\r\n }\r\n\r\n ngOnInit() {\r\n this.init();\r\n this.dataService.collection.getCollectionFilters().single$.subscribe(res => {\r\n this.allFilters = res.collectionFilters;\r\n });\r\n const filtersFormArray = this.detailForm.get('filters') as UntypedFormArray;\r\n const inheritFiltersControl = this.detailForm.get('inheritFilters') as UntypedFormControl;\r\n this.inheritFilters$ = inheritFiltersControl.valueChanges.pipe(distinctUntilChanged());\r\n this.updatedFilters$ = merge(filtersFormArray.statusChanges, this.filterRemoved$).pipe(\r\n debounceTime(200),\r\n filter(() => filtersFormArray.touched),\r\n map(() =>\r\n this.mapOperationsToInputs(this.filters, filtersFormArray.value).filter(_filter => {\r\n // ensure all the arguments have valid values. E.g. a newly-added\r\n // filter will not yet have valid values\r\n for (const arg of _filter.arguments) {\r\n if (arg.value === '') {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }),\r\n ),\r\n );\r\n this.parentId$ = this.route.paramMap.pipe(\r\n map(pm => pm.get('parentId') || undefined),\r\n switchMap(parentId => {\r\n if (parentId) {\r\n return of(parentId);\r\n } else {\r\n return this.entity$.pipe(map(collection => collection.parent?.id));\r\n }\r\n }),\r\n );\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy();\r\n }\r\n\r\n getFilterDefinition(_filter: ConfigurableOperation): ConfigurableOperationDefinition | undefined {\r\n return this.allFilters.find(f => f.code === _filter.code);\r\n }\r\n\r\n assetsChanged(): boolean {\r\n return !!Object.values(this.assetChanges).length;\r\n }\r\n\r\n /**\r\n * If creating a new Collection, automatically generate the slug based on the collection name.\r\n */\r\n updateSlug(nameValue: string) {\r\n const slugControl = this.detailForm.get(['slug']);\r\n const currentTranslation = this.entity ? findTranslation(this.entity, this.languageCode) : undefined;\r\n const currentSlugIsEmpty = !currentTranslation || !currentTranslation.slug;\r\n if (slugControl && slugControl.pristine && currentSlugIsEmpty) {\r\n slugControl.setValue(normalizeString(`${nameValue}`, '-'));\r\n }\r\n }\r\n\r\n addFilter(collectionFilter: ConfigurableOperation) {\r\n const filtersArray = this.detailForm.get('filters') as UntypedFormArray;\r\n const argsHash = collectionFilter.args.reduce(\r\n (output, arg) => ({\r\n ...output,\r\n [arg.name]: getConfigArgValue(arg.value),\r\n }),\r\n {},\r\n );\r\n filtersArray.push(\r\n this.formBuilder.control({\r\n code: collectionFilter.code,\r\n args: argsHash,\r\n }),\r\n );\r\n this.filters.push({\r\n code: collectionFilter.code,\r\n args: collectionFilter.args.map(a => ({ name: a.name, value: getConfigArgValue(a.value) })),\r\n });\r\n }\r\n\r\n removeFilter(index: number) {\r\n const filtersArray = this.detailForm.get('filters') as UntypedFormArray;\r\n if (index !== -1) {\r\n filtersArray.removeAt(index);\r\n filtersArray.markAsDirty();\r\n filtersArray.markAsTouched();\r\n this.filters.splice(index, 1);\r\n this.filterRemoved$.next();\r\n }\r\n }\r\n\r\n create() {\r\n if (!this.detailForm.dirty) {\r\n return;\r\n }\r\n const input = this.getUpdatedCollection(\r\n {\r\n id: '',\r\n createdAt: '',\r\n updatedAt: '',\r\n languageCode: this.languageCode,\r\n name: '',\r\n slug: '',\r\n isPrivate: false,\r\n breadcrumbs: [],\r\n description: '',\r\n featuredAsset: null,\r\n assets: [],\r\n translations: [],\r\n inheritFilters: true,\r\n filters: [],\r\n parent: {} as any,\r\n children: null,\r\n },\r\n this.detailForm,\r\n this.languageCode,\r\n ) as CreateCollectionInput;\r\n const parentId = this.route.snapshot.paramMap.get('parentId');\r\n if (parentId) {\r\n input.parentId = parentId;\r\n }\r\n this.dataService.collection.createCollection(input).subscribe(\r\n data => {\r\n this.notificationService.success(_('common.notify-create-success'), {\r\n entity: 'Collection',\r\n });\r\n this.assetChanges = {};\r\n this.detailForm.markAsPristine();\r\n this.changeDetector.markForCheck();\r\n this.router.navigate(['../', data.createCollection.id], { relativeTo: this.route });\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-create-error'), {\r\n entity: 'Collection',\r\n });\r\n },\r\n );\r\n }\r\n\r\n save() {\r\n combineLatest(this.entity$, this.languageCode$)\r\n .pipe(\r\n take(1),\r\n mergeMap(([category, languageCode]) => {\r\n const input = this.getUpdatedCollection(\r\n category,\r\n this.detailForm,\r\n languageCode,\r\n ) as UpdateCollectionInput;\r\n return this.dataService.collection.updateCollection(input);\r\n }),\r\n )\r\n .subscribe(\r\n () => {\r\n this.assetChanges = {};\r\n this.detailForm.markAsPristine();\r\n this.changeDetector.markForCheck();\r\n this.notificationService.success(_('common.notify-update-success'), {\r\n entity: 'Collection',\r\n });\r\n this.contentsComponent.refresh();\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-update-error'), {\r\n entity: 'Collection',\r\n });\r\n },\r\n );\r\n }\r\n\r\n canDeactivate(): boolean {\r\n return super.canDeactivate() && !this.assetChanges.assets && !this.assetChanges.featuredAsset;\r\n }\r\n\r\n toggleLivePreview() {\r\n this.livePreview = !this.livePreview;\r\n this.localStorageService.set('livePreviewCollectionContents', this.livePreview);\r\n }\r\n\r\n trackByFn(index: number, item: ConfigurableOperation) {\r\n return JSON.stringify(item);\r\n }\r\n\r\n /**\r\n * Sets the values of the form on changes to the category or current language.\r\n */\r\n protected setFormValues(entity: CollectionFragment, languageCode: LanguageCode) {\r\n const currentTranslation = findTranslation(entity, languageCode);\r\n\r\n this.detailForm.patchValue({\r\n name: currentTranslation ? currentTranslation.name : '',\r\n slug: currentTranslation ? currentTranslation.slug : '',\r\n description: currentTranslation ? currentTranslation.description : '',\r\n visible: !entity.isPrivate,\r\n inheritFilters: entity.inheritFilters,\r\n });\r\n\r\n const formArray = this.detailForm.get('filters') as UntypedFormArray;\r\n if (formArray.length !== entity.filters.length) {\r\n formArray.clear();\r\n this.filters = [];\r\n entity.filters.forEach(f => this.addFilter(f));\r\n }\r\n\r\n if (this.customFields.length) {\r\n this.setCustomFieldFormValues(\r\n this.customFields,\r\n this.detailForm.get(['customFields']),\r\n entity,\r\n currentTranslation,\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Given a category and the value of the form, this method creates an updated copy of the category which\r\n * can then be persisted to the API.\r\n */\r\n private getUpdatedCollection(\r\n category: CollectionFragment,\r\n form: typeof this.detailForm,\r\n languageCode: LanguageCode,\r\n ): CreateCollectionInput | UpdateCollectionInput {\r\n const updatedCategory = createUpdatedTranslatable({\r\n translatable: category,\r\n updatedFields: form.value,\r\n customFieldConfig: this.customFields,\r\n languageCode,\r\n defaultTranslation: {\r\n languageCode,\r\n name: category.name || '',\r\n slug: category.slug || '',\r\n description: category.description || '',\r\n },\r\n });\r\n return {\r\n ...updatedCategory,\r\n assetIds: this.assetChanges.assets?.map(a => a.id),\r\n featuredAssetId: this.assetChanges.featuredAsset?.id,\r\n isPrivate: !form.value.visible,\r\n filters: this.mapOperationsToInputs(this.filters, this.detailForm.value.filters),\r\n };\r\n }\r\n\r\n /**\r\n * Maps an array of conditions or actions to the input format expected by the GraphQL API.\r\n */\r\n private mapOperationsToInputs(\r\n operations: ConfigurableOperation[],\r\n formValueOperations: any,\r\n ): ConfigurableOperationInput[] {\r\n return operations.map((o, i) => ({\r\n code: o.code,\r\n arguments: Object.entries(formValueOperations[i].args).map(([name, value], j) => ({\r\n name,\r\n value: encodeConfigArgValue(value),\r\n })),\r\n }));\r\n }\r\n}\r\n","import { Pipe, PipeTransform } from '@angular/core';\r\nimport { GetCollectionListQuery, ItemOf } from '@vendure/admin-ui/core';\r\n\r\n/**\r\n * Removes the root collection and self breadcrumb from the collection breadcrumb list.\r\n */\r\n@Pipe({\r\n name: 'collectionBreadcrumb',\r\n})\r\nexport class CollectionBreadcrumbPipe implements PipeTransform {\r\n transform(value: ItemOf<GetCollectionListQuery, 'collections'>): unknown {\r\n return value?.breadcrumbs.slice(1, -1);\r\n }\r\n}\r\n","<ng-template vdrDialogTitle>\r\n {{ 'catalog.move-collections' | translate }}\r\n</ng-template>\r\n<vdr-collection-data-table\r\n class=\"mt-2\"\r\n id=\"move-collection-list\"\r\n [items]=\"items$ | async\"\r\n [subCollections]=\"subCollections$ | async\"\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n [totalItems]=\"totalItems$ | async\"\r\n [currentPage]=\"currentPage$ | async\"\r\n (pageChange)=\"currentPage$.next($event)\"\r\n (itemsPerPageChange)=\"itemsPerPage$.next($event)\"\r\n>\r\n <vdr-dt2-search\r\n [searchTermControl]=\"searchTermControl\"\r\n [searchTermPlaceholder]=\"'common.search-by-name' | translate\"\r\n ></vdr-dt2-search>\r\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\">\r\n <ng-template let-collection=\"item\">\r\n {{ collection.id }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.name' | translate\" id=\"name\" [optional]=\"false\">\r\n <ng-template let-collection=\"item\" let-depth=\"depth\">\r\n <div [ngClass]=\"'indent-' + depth\"></div>\r\n <clr-icon\r\n class=\"child-arrow\"\r\n [class.transparent]=\"depth === 0\"\r\n shape=\"child-arrow\"\r\n *ngIf=\"!collection.children?.length && collection.parentId !== '__'\"\r\n ></clr-icon>\r\n <button\r\n class=\"icon-button folder-button\"\r\n *ngIf=\"collection.children?.length\"\r\n (click)=\"toggleExpanded(collection)\"\r\n >\r\n <clr-icon shape=\"folder\" *ngIf=\"!expandedIds.includes(collection.id)\"></clr-icon>\r\n <clr-icon shape=\"folder-open\" *ngIf=\"expandedIds.includes(collection.id)\"></clr-icon>\r\n </button>\r\n <button class=\"icon-button folder-button\" *ngIf=\"collection.parentId === '__'\" disabled>\r\n <clr-icon shape=\"folder\" class=\"is-solid\"></clr-icon>\r\n </button>\r\n <button class=\"button-ghost\" (click)=\"resolveWith(collection)\">\r\n <span>{{ 'catalog.move-collection-to' | translate : {name: collection.name} }}</span>\r\n </button>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.breadcrumb' | translate\" id=\"breadcrumb\">\r\n <ng-template let-collection=\"item\">\r\n <div class=\"breadcrumb\">\r\n <ng-container *ngIf=\"collection | collectionBreadcrumb as breadcrumbs\">\r\n <ng-container *ngIf=\"breadcrumbs.length\">\r\n <div *ngFor=\"let item of breadcrumbs\">\r\n <span class=\"separator\">/</span>{{ item.name }}\r\n </div>\r\n </ng-container>\r\n <span class=\"separator\" *ngIf=\"!breadcrumbs.length\">/</span>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.slug' | translate\" id=\"slug\">\r\n <ng-template let-collection=\"item\">\r\n {{ collection.slug }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n</vdr-collection-data-table>\r\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\nimport { FormControl } from '@angular/forms';\nimport { DataService, Dialog, GetCollectionListQuery, I18nService, ItemOf } from '@vendure/admin-ui/core';\nimport { BehaviorSubject, combineLatest, Observable, of, Subject } from 'rxjs';\nimport { debounceTime, distinctUntilChanged, map, startWith, switchMap, tap } from 'rxjs/operators';\n\n@Component({\n selector: 'vdr-move-collections-dialog',\n templateUrl: './move-collections-dialog.component.html',\n styleUrls: ['./move-collections-dialog.component.scss', '../collection-list/collection-list-common.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class MoveCollectionsDialogComponent\n implements OnInit, Dialog<ItemOf<GetCollectionListQuery, 'collections'>>\n{\n resolveWith: (result?: ItemOf<GetCollectionListQuery, 'collections'>) => void;\n searchTermControl = new FormControl('');\n items$: Observable<Array<ItemOf<GetCollectionListQuery, 'collections'>>>;\n totalItems$: Observable<number>;\n currentPage$ = new BehaviorSubject(1);\n itemsPerPage$ = new BehaviorSubject(10);\n expandedIds$ = new Subject<string[]>();\n expandedIds: string[] = [];\n subCollections$: Observable<Array<ItemOf<GetCollectionListQuery, 'collections'>>>;\n\n constructor(private dataService: DataService, private i18nService: I18nService) {}\n\n ngOnInit() {\n const getCollectionsResult = this.dataService.collection.getCollections();\n\n const searchTerm$ = this.searchTermControl.valueChanges.pipe(\n debounceTime(250),\n distinctUntilChanged(),\n startWith(''),\n );\n const currentPage$ = this.currentPage$.pipe(distinctUntilChanged());\n const itemsPerPage$ = this.itemsPerPage$.pipe(distinctUntilChanged());\n combineLatest(searchTerm$, currentPage$, itemsPerPage$).subscribe(\n ([searchTerm, currentPage, itemsPerPage]) => {\n const topLevelOnly = searchTerm === '';\n getCollectionsResult.ref.refetch({\n options: {\n skip: (currentPage - 1) * itemsPerPage,\n take: itemsPerPage,\n filter: {\n name: { contains: searchTerm },\n },\n topLevelOnly,\n },\n });\n },\n );\n\n const rootCollectionId$ = this.dataService.collection\n .getCollections({\n take: 1,\n topLevelOnly: true,\n })\n .mapSingle(data => data.collections.items[0].parentId);\n\n this.items$ = combineLatest(\n getCollectionsResult.mapStream(({ collections }) => collections),\n rootCollectionId$,\n ).pipe(\n map(([collections, rootCollectionId]) => [\n ...(rootCollectionId\n ? [\n {\n id: rootCollectionId,\n name: this.i18nService.translate('catalog.root-collection'),\n slug: '',\n parentId: '__',\n position: 0,\n featuredAsset: null,\n children: [],\n breadcrumbs: [],\n isPrivate: false,\n createdAt: '',\n updatedAt: '',\n } satisfies ItemOf<GetCollectionListQuery, 'collections'>,\n ]\n : []),\n ...collections.items,\n ]),\n );\n this.totalItems$ = getCollectionsResult.mapStream(data => data.collections.totalItems);\n\n this.subCollections$ = this.expandedIds$.pipe(\n tap(val => (this.expandedIds = val)),\n switchMap(ids => {\n if (ids.length) {\n return this.dataService.collection\n .getCollections({\n take: 999,\n filter: {\n parentId: { in: ids },\n },\n })\n .mapStream(data => data.collections.items);\n } else {\n return of([]);\n }\n }),\n );\n }\n\n toggleExpanded(collection: ItemOf<GetCollectionListQuery, 'collections'>) {\n let expandedIds = this.expandedIds;\n if (!expandedIds.includes(collection.id)) {\n expandedIds.push(collection.id);\n } else {\n expandedIds = expandedIds.filter(id => id !== collection.id);\n }\n this.expandedIds$.next(expandedIds);\n }\n}\n","import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n BulkAction,\r\n createBulkAssignToChannelAction,\r\n createBulkDeleteAction,\r\n createBulkRemoveFromChannelAction,\r\n DataService,\r\n GetCollectionListQuery,\r\n ItemOf,\r\n ModalService,\r\n MoveCollectionInput,\r\n NotificationService,\r\n Permission,\r\n} from '@vendure/admin-ui/core';\r\nimport { EMPTY } from 'rxjs';\r\nimport { map, switchMap } from 'rxjs/operators';\r\nimport { CollectionPartial } from '../collection-tree/collection-tree.types';\r\nimport { MoveCollectionsDialogComponent } from '../move-collections-dialog/move-collections-dialog.component';\r\n\r\nimport { CollectionListComponent } from './collection-list.component';\r\n\r\nexport const deleteCollectionsBulkAction = createBulkDeleteAction<\r\n ItemOf<GetCollectionListQuery, 'collections'>\r\n>({\r\n location: 'collection-list',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.DeleteCollection) ||\r\n userPermissions.includes(Permission.DeleteCatalog),\r\n getItemName: item => item.name,\r\n bulkDelete: (dataService, ids) =>\r\n dataService.collection.deleteCollections(ids).pipe(map(res => res.deleteCollections)),\r\n});\r\n\r\nexport const moveCollectionsBulkAction: BulkAction<CollectionPartial, CollectionListComponent> = {\r\n location: 'collection-list',\r\n label: _('catalog.move-collections'),\r\n icon: 'drag-handle',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.UpdateCatalog) ||\r\n userPermissions.includes(Permission.UpdateCollection),\r\n onClick: ({ injector, selection, hostComponent, clearSelection }) => {\r\n const modalService = injector.get(ModalService);\r\n const dataService = injector.get(DataService);\r\n const notificationService = injector.get(NotificationService);\r\n modalService\r\n .fromComponent(MoveCollectionsDialogComponent, {\r\n size: 'xl',\r\n closable: true,\r\n })\r\n .pipe(\r\n switchMap(result => {\r\n if (result) {\r\n const inputs: MoveCollectionInput[] = selection.map(c => ({\r\n collectionId: c.id,\r\n parentId: result.id,\r\n index: 0,\r\n }));\r\n return dataService.collection.moveCollection(inputs);\r\n } else {\r\n return EMPTY;\r\n }\r\n }),\r\n )\r\n .subscribe(result => {\r\n notificationService.success(_('catalog.move-collections-success'), {\r\n count: selection.length,\r\n });\r\n clearSelection();\r\n hostComponent.refresh();\r\n });\r\n },\r\n};\r\n\r\nexport const assignCollectionsToChannelBulkAction = createBulkAssignToChannelAction<\r\n ItemOf<GetCollectionListQuery, 'collections'>\r\n>({\r\n location: 'collection-list',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.UpdateCatalog) ||\r\n userPermissions.includes(Permission.UpdateCollection),\r\n getItemName: item => item.name,\r\n bulkAssignToChannel: (dataService, collectionIds, channelId) =>\r\n dataService.collection\r\n .assignCollectionsToChannel({\r\n collectionIds,\r\n channelId,\r\n })\r\n .pipe(map(res => res.assignCollectionsToChannel)),\r\n});\r\n\r\nexport const removeCollectionsFromChannelBulkAction = createBulkRemoveFromChannelAction<\r\n ItemOf<GetCollectionListQuery, 'collections'>\r\n>({\r\n location: 'collection-list',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.DeleteCatalog) ||\r\n userPermissions.includes(Permission.DeleteCollection),\r\n getItemName: item => item.name,\r\n bulkRemoveFromChannel: (dataService, collectionIds, channelId) =>\r\n dataService.collection\r\n .removeCollectionsFromChannel({\r\n channelId: channelId,\r\n collectionIds,\r\n })\r\n .pipe(map(res => res.removeCollectionsFromChannel)),\r\n});\r\n","<vdr-page-block>\r\n <vdr-action-bar>\r\n <vdr-ab-left>\r\n <vdr-language-selector\r\n [availableLanguageCodes]=\"availableLanguages$ | async\"\r\n [currentLanguageCode]=\"contentLanguage$ | async\"\r\n (languageCodeChange)=\"setLanguage($event)\"\r\n ></vdr-language-selector>\r\n </vdr-ab-left>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"collection-list\"></vdr-action-bar-items>\r\n <a\r\n class=\"btn btn-primary\"\r\n *vdrIfPermissions=\"['CreateCatalog', 'CreateCollection']\"\r\n [routerLink]=\"['./create']\"\r\n >\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.create-new-collection' | translate }}\r\n </a>\r\n </vdr-ab-right>\r\n </vdr-action-bar>\r\n</vdr-page-block>\r\n<vdr-split-view [rightPanelOpen]=\"activeCollectionId$ | async\" (closeClicked)=\"closeContents()\">\r\n <ng-template vdrSplitViewLeft>\r\n <vdr-collection-data-table\r\n class=\"mt-2\"\r\n id=\"collection-list\"\r\n [items]=\"items$ | async\"\r\n [subCollections]=\"subCollections$ | async\"\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n [totalItems]=\"totalItems$ | async\"\r\n [currentPage]=\"currentPage$ | async\"\r\n [filters]=\"filters\"\r\n [activeIndex]=\"activeCollectionIndex$ | async\"\r\n (pageChange)=\"setPageNumber($event)\"\r\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\r\n (changeOrder)=\"onRearrange($event)\"\r\n >\r\n <vdr-bulk-action-menu\r\n locationId=\"collection-list\"\r\n [hostComponent]=\"this\"\r\n [selectionManager]=\"selectionManager\"\r\n ></vdr-bulk-action-menu>\r\n <vdr-dt2-search\r\n [searchTermControl]=\"searchTermControl\"\r\n [searchTermPlaceholder]=\"'common.search-by-name' | translate\"\r\n ></vdr-dt2-search>\r\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\">\r\n <ng-template let-collection=\"item\">\r\n {{ collection.id }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column\r\n [heading]=\"'common.created-at' | translate\" id=\"created-at\"\r\n [hiddenByDefault]=\"true\"\r\n [sort]=\"sorts.get('createdAt')\"\r\n >\r\n <ng-template let-collection=\"item\">\r\n {{ collection.createdAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column\r\n [heading]=\"'common.updated-at' | translate\" id=\"updated-at\"\r\n [hiddenByDefault]=\"true\"\r\n [sort]=\"sorts.get('updatedAt')\"\r\n >\r\n <ng-template let-collection=\"item\">\r\n {{ collection.updatedAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column\r\n [heading]=\"'common.position' | translate\" id=\"position\"\r\n [hiddenByDefault]=\"true\"\r\n [sort]=\"sorts.get('position')\"\r\n >\r\n <ng-template let-collection=\"item\">\r\n {{ collection.position }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column\r\n [heading]=\"'common.name' | translate\" id=\"name\"\r\n [optional]=\"false\"\r\n [sort]=\"sorts.get('name')\"\r\n >\r\n <ng-template let-collection=\"item\" let-depth=\"depth\">\r\n <div [ngClass]=\"'indent-' + depth\"></div>\r\n <clr-icon\r\n class=\"child-arrow\"\r\n [class.transparent]=\"depth === 0\"\r\n shape=\"child-arrow\"\r\n *ngIf=\"!collection.children?.length\"\r\n ></clr-icon>\r\n <button\r\n class=\"icon-button folder-button\"\r\n *ngIf=\"collection.children?.length\"\r\n (click)=\"toggleExpanded(collection)\"\r\n >\r\n <clr-icon shape=\"folder\" *ngIf=\"!expandedIds.includes(collection.id)\"></clr-icon>\r\n <clr-icon shape=\"folder-open\" *ngIf=\"expandedIds.includes(collection.id)\"></clr-icon>\r\n </button>\r\n <a class=\"button-ghost\" [routerLink]=\"['./', collection.id]\"\r\n ><span>{{ collection.name }}</span>\r\n <clr-icon shape=\"arrow right\"></clr-icon>\r\n </a>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.breadcrumb' | translate\" id=\"breadcrumb\">\r\n <ng-template let-collection=\"item\">\r\n <div class=\"breadcrumb\">\r\n <ng-container *ngIf=\"collection | collectionBreadcrumb as breadcrumbs\">\r\n <ng-container *ngIf=\"breadcrumbs.length\">\r\n <div *ngFor=\"let item of breadcrumbs\">\r\n <span class=\"separator\">/</span>{{ item.name }}\r\n </div>\r\n </ng-container>\r\n <span class=\"separator\" *ngIf=\"!breadcrumbs.length\">/</span>\r\n </ng-container>\r\n </div>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.slug' | translate\" id=\"slug\" [sort]=\"sorts.get('slug')\">\r\n <ng-template let-collection=\"item\">\r\n {{ collection.slug }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.visibility' | translate\" id=\"visibility\">\r\n <ng-template let-collection=\"item\">\r\n <vdr-chip *ngIf=\"collection.isPrivate\" colorType=\"warning\">{{\r\n 'common.private' | translate\r\n }}</vdr-chip>\r\n <vdr-chip *ngIf=\"!collection.isPrivate\" colorType=\"success\">{{\r\n 'common.public' | translate\r\n }}</vdr-chip>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.view-contents' | translate\" id=\"view-contents\" [optional]=\"false\">\r\n <ng-template let-collection=\"item\">\r\n <a\r\n class=\"button-small bg-weight-150\"\r\n [routerLink]=\"['./', { contents: collection.id }]\"\r\n queryParamsHandling=\"preserve\"\r\n >\r\n <span>{{ 'common.view-contents' | translate }}</span>\r\n <clr-icon shape=\"file-group\"></clr-icon>\r\n </a>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-custom-field-column\r\n *ngFor=\"let customField of customFields\"\r\n [customField]=\"customField\"\r\n [sorts]=\"sorts\"\r\n />\r\n </vdr-collection-data-table>\r\n </ng-template>\r\n <ng-template vdrSplitViewRight [splitViewTitle]=\"activeCollectionTitle$ | async\">\r\n <ng-container *ngIf=\"activeCollectionId$ | async as activeGroup\">\r\n <vdr-collection-contents [collectionId]=\"activeCollectionId$ | async\"></vdr-collection-contents>\r\n </ng-container>\r\n </ng-template>\r\n</vdr-split-view>\r\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n DataService,\r\n GetCollectionListDocument,\r\n GetCollectionListQuery,\r\n ItemOf,\r\n LanguageCode,\r\n NotificationService,\r\n TypedBaseListComponent,\r\n} from '@vendure/admin-ui/core';\r\nimport { combineLatest, Observable, of } from 'rxjs';\r\nimport { distinctUntilChanged, map, switchMap, takeUntil } from 'rxjs/operators';\r\nimport { CollectionOrderEvent } from '../collection-data-table/collection-data-table.component';\r\n\r\n@Component({\r\n selector: 'vdr-collection-list',\r\n templateUrl: './collection-list.component.html',\r\n styleUrls: ['./collection-list.component.scss', './collection-list-common.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CollectionListComponent\r\n extends TypedBaseListComponent<typeof GetCollectionListDocument, 'collections'>\r\n implements OnInit\r\n{\r\n activeCollectionId$: Observable<string | null>;\r\n activeCollectionIndex$: Observable<number>;\r\n activeCollectionTitle$: Observable<string>;\r\n subCollections$: Observable<Array<ItemOf<GetCollectionListQuery, 'collections'>>>;\r\n expandedIds: string[] = [];\r\n readonly customFields = this.getCustomFieldConfig('Collection');\r\n readonly filters = this.createFilterCollection()\r\n .addIdFilter()\r\n .addDateFilters()\r\n .addFilter({\r\n name: 'slug',\r\n label: _('common.slug'),\r\n type: { kind: 'text' },\r\n filterField: 'slug',\r\n })\r\n .addFilter({\r\n name: 'visibility',\r\n type: { kind: 'boolean' },\r\n label: _('common.visibility'),\r\n toFilterInput: value => ({\r\n isPrivate: { eq: !value },\r\n }),\r\n })\r\n .addCustomFieldFilters(this.customFields)\r\n .connectToRoute(this.route);\r\n readonly sorts = this.createSortCollection()\r\n .defaultSort('position', 'ASC')\r\n .addSort({ name: 'createdAt' })\r\n .addSort({ name: 'updatedAt' })\r\n .addSort({ name: 'name' })\r\n .addSort({ name: 'slug' })\r\n .addSort({ name: 'position' })\r\n .addCustomFieldSorts(this.customFields)\r\n .connectToRoute(this.route);\r\n\r\n constructor(protected dataService: DataService, private notificationService: NotificationService) {\r\n super();\r\n super.configure({\r\n document: GetCollectionListDocument,\r\n getItems: data => data.collections,\r\n setVariables: (skip, _take) => {\r\n const topLevelOnly =\r\n this.searchTermControl.value === '' && this.filters.activeFilters.length === 0\r\n ? true\r\n : undefined;\r\n return {\r\n options: {\r\n skip,\r\n take: _take,\r\n filter: {\r\n name: { contains: this.searchTermControl.value },\r\n ...this.filters.createFilterInput(),\r\n },\r\n topLevelOnly,\r\n sort: this.sorts.createSortInput(),\r\n },\r\n };\r\n },\r\n refreshListOnChanges: [this.filters.valueChanges, this.sorts.valueChanges],\r\n });\r\n }\r\n\r\n ngOnInit() {\r\n super.ngOnInit();\r\n this.activeCollectionId$ = this.route.paramMap.pipe(\r\n map(pm => pm.get('contents')),\r\n distinctUntilChanged(),\r\n );\r\n const expandedIds$ = this.route.queryParamMap.pipe(\r\n map(qpm => qpm.get('expanded')),\r\n distinctUntilChanged(),\r\n map(ids => (ids ? ids.split(',') : [])),\r\n );\r\n expandedIds$.pipe(takeUntil(this.destroy$)).subscribe(ids => {\r\n this.expandedIds = ids;\r\n });\r\n this.subCollections$ = combineLatest(expandedIds$, this.refresh$).pipe(\r\n switchMap(([ids]) => {\r\n if (ids.length) {\r\n return this.dataService.collection\r\n .getCollections({\r\n take: 999,\r\n filter: {\r\n parentId: { in: ids },\r\n },\r\n })\r\n .mapStream(data => data.collections.items);\r\n } else {\r\n return of([]);\r\n }\r\n }),\r\n );\r\n\r\n this.activeCollectionTitle$ = combineLatest(\r\n this.activeCollectionId$,\r\n this.items$,\r\n this.subCollections$,\r\n ).pipe(\r\n map(([id, collections, subCollections]) => {\r\n if (id) {\r\n const match = [...collections, ...subCollections].find(c => c.id === id);\r\n return match ? match.name : '';\r\n }\r\n return '';\r\n }),\r\n );\r\n this.activeCollectionIndex$ = combineLatest(\r\n this.activeCollectionId$,\r\n this.items$,\r\n this.subCollections$,\r\n ).pipe(\r\n map(([id, collections, subCollections]) => {\r\n if (id) {\r\n const allCollections: typeof collections = [];\r\n for (const collection of collections) {\r\n allCollections.push(collection);\r\n const subCollectionMatches = subCollections.filter(\r\n c => c.parentId && c.parentId === collection.id,\r\n );\r\n allCollections.push(...subCollectionMatches);\r\n }\r\n return allCollections.findIndex(c => c.id === id);\r\n }\r\n return -1;\r\n }),\r\n );\r\n }\r\n\r\n onRearrange(event: CollectionOrderEvent) {\r\n this.dataService.collection.moveCollection([event]).subscribe({\r\n next: () => {\r\n this.notificationService.success(_('common.notify-saved-changes'));\r\n this.refresh();\r\n },\r\n error: err => {\r\n this.notificationService.error(_('common.notify-save-changes-error'));\r\n },\r\n });\r\n }\r\n\r\n closeContents() {\r\n const params = { ...this.route.snapshot.params };\r\n delete params.contents;\r\n this.router.navigate(['./', params], { relativeTo: this.route, queryParamsHandling: 'preserve' });\r\n }\r\n\r\n setLanguage(code: LanguageCode) {\r\n this.dataService.client.setContentLanguage(code).subscribe();\r\n }\r\n\r\n toggleExpanded(collection: ItemOf<GetCollectionListQuery, 'collections'>) {\r\n let expandedIds = this.expandedIds;\r\n if (!expandedIds.includes(collection.id)) {\r\n expandedIds.push(collection.id);\r\n } else {\r\n expandedIds = expandedIds.filter(id => id !== collection.id);\r\n }\r\n this.router.navigate(['./'], {\r\n queryParams: {\r\n expanded: expandedIds.filter(id => !!id).join(','),\r\n },\r\n queryParamsHandling: 'merge',\r\n relativeTo: this.route,\r\n });\r\n }\r\n}\r\n","import { CdkDragDrop } from '@angular/cdk/drag-drop';\r\nimport { Injectable, OnDestroy } from '@angular/core';\r\nimport { Observable, Subject } from 'rxjs';\r\n\r\nimport { RootNode, TreeNode } from './array-to-tree';\r\nimport { CollectionPartial, RearrangeEvent } from './collection-tree.types';\r\n\r\n/**\r\n * Facilitates communication between the CollectionTreeComponent and child CollectionTreeNodeComponents\r\n * without introducing a cyclic dependency.\r\n */\r\n@Injectable()\r\nexport class CollectionTreeService implements OnDestroy {\r\n private allMoveListItems: Array<{ path: string; id: string; ancestorIdPath: Set<string> }> = [];\r\n private collectionTree: RootNode<CollectionPartial>;\r\n private _rearrange$ = new Subject<RearrangeEvent>();\r\n private _delete$ = new Subject<string>();\r\n\r\n public rearrange$: Observable<RearrangeEvent>;\r\n public delete$: Observable<string>;\r\n\r\n constructor() {\r\n this.rearrange$ = this._rearrange$.asObservable();\r\n this.delete$ = this._delete$.asObservable();\r\n }\r\n\r\n ngOnDestroy() {\r\n this._rearrange$.complete();\r\n this._delete$.complete();\r\n }\r\n\r\n setCollectionTree(tree: RootNode<CollectionPartial>) {\r\n this.collectionTree = tree;\r\n }\r\n\r\n resetMoveList() {\r\n this.allMoveListItems = [];\r\n }\r\n\r\n getMoveListItems(collection: CollectionPartial) {\r\n if (this.allMoveListItems.length === 0) {\r\n this.allMoveListItems = this.calculateAllMoveListItems();\r\n }\r\n return this.allMoveListItems.filter(\r\n item =>\r\n item.id !== collection.id &&\r\n !item.ancestorIdPath.has(collection.id) &&\r\n item.id !== collection.parent?.id,\r\n );\r\n }\r\n\r\n onDrop(event: CdkDragDrop<CollectionPartial | RootNode<CollectionPartial>>) {\r\n const item = event.item.data as CollectionPartial;\r\n const newParent = event.container.data;\r\n const newParentId = newParent.id;\r\n if (newParentId == null) {\r\n throw new Error(`Could not determine the ID of the root Collection`);\r\n }\r\n this._rearrange$.next({\r\n collectionId: item.id,\r\n parentId: newParentId,\r\n index: event.currentIndex,\r\n });\r\n }\r\n\r\n onMove(event: RearrangeEvent) {\r\n this._rearrange$.next(event);\r\n }\r\n\r\n onDelete(id: string) {\r\n this._delete$.next(id);\r\n }\r\n\r\n private calculateAllMoveListItems() {\r\n const visit = (\r\n node: TreeNode<any>,\r\n parentPath: string[],\r\n ancestorIdPath: Set<string>,\r\n output: Array<{ path: string; id: string; ancestorIdPath: Set<string> }>,\r\n ) => {\r\n const path = parentPath.concat(node.name);\r\n output.push({ path: path.slice(1).join(' / ') || 'root', id: node.id, ancestorIdPath });\r\n node.children.forEach(child =>\r\n visit(child, path, new Set<string>([...ancestorIdPath, node.id]), output),\r\n );\r\n return output;\r\n };\r\n return visit(this.collectionTree, [], new Set<string>(), []);\r\n }\r\n}\r\n","<div\r\n cdkDropList\r\n class=\"tree-node\"\r\n #dropList\r\n [cdkDropListData]=\"collectionTree\"\r\n [cdkDropListDisabled]=\"!(hasUpdatePermission$ | async)\"\r\n (cdkDropListDropped)=\"drop($event)\"\r\n>\r\n <div\r\n class=\"collection\"\r\n [class.private]=\"collection.isPrivate\"\r\n *ngFor=\"let collection of collectionTree.children; index as i; trackBy: trackByFn\"\r\n cdkDrag\r\n [cdkDragData]=\"collection\"\r\n >\r\n <div\r\n class=\"collection-detail\"\r\n [ngClass]=\"'depth-' + depth\"\r\n [class.active]=\"collection.id === activeCollectionId\"\r\n >\r\n <div>\r\n <input\r\n type=\"checkbox\"\r\n clrCheckbox\r\n [checked]=\"selectionManager.isSelected(collection)\"\r\n (click)=\"selectionManager.toggleSelection(collection, $event)\"\r\n />\r\n </div>\r\n <div class=\"name\">\r\n <button\r\n class=\"icon-button folder-button\"\r\n [disabled]=\"expandAll\"\r\n *ngIf=\"collection.children?.length; else folderSpacer\"\r\n (click)=\"toggleExpanded(collection)\"\r\n >\r\n <clr-icon shape=\"folder\" *ngIf=\"!collection.expanded && !expandAll\"></clr-icon>\r\n <clr-icon shape=\"folder-open\" *ngIf=\"collection.expanded || expandAll\"></clr-icon>\r\n </button>\r\n <ng-template #folderSpacer>\r\n <div class=\"folder-button-spacer\"></div>\r\n </ng-template>\r\n {{ collection.name }}\r\n </div>\r\n <div class=\"flex-spacer\"></div>\r\n <vdr-chip *ngIf=\"collection.isPrivate\">{{ 'catalog.private' | translate }}</vdr-chip>\r\n <a\r\n class=\"btn btn-link btn-sm\"\r\n [routerLink]=\"['./', { contents: collection.id }]\"\r\n queryParamsHandling=\"preserve\"\r\n >\r\n <clr-icon shape=\"view-list\"></clr-icon>\r\n {{ 'catalog.view-contents' | translate }}\r\n </a>\r\n <a class=\"btn btn-link btn-sm\" [routerLink]=\"['/catalog/collections/', collection.id]\">\r\n <clr-icon shape=\"edit\"></clr-icon>\r\n {{ 'common.edit' | translate }}\r\n </a>\r\n <div class=\"drag-handle\" cdkDragHandle *vdrIfPermissions=\"['UpdateCatalog', 'UpdateCollection']\">\r\n <clr-icon shape=\"drag-handle\" size=\"24\"></clr-icon>\r\n </div>\r\n <vdr-dropdown>\r\n <button class=\"icon-button\" vdrDropdownTrigger (click)=\"getMoveListItems(collection)\">\r\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <a\r\n class=\"dropdown-item\"\r\n [routerLink]=\"['./', 'create', { parentId: collection.id }]\"\r\n *vdrIfPermissions=\"['CreateCatalog', 'CreateCollection']\"\r\n >\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.create-new-collection' | translate }}\r\n </a>\r\n <div class=\"dropdown-divider\"></div>\r\n <button\r\n type=\"button\"\r\n vdrDropdownItem\r\n [disabled]=\"i === 0 || !(hasUpdatePermission$ | async)\"\r\n (click)=\"moveUp(collection, i)\"\r\n >\r\n <clr-icon shape=\"caret up\"></clr-icon>\r\n {{ 'catalog.move-up' | translate }}\r\n </button>\r\n <button\r\n type=\"button\"\r\n vdrDropdownItem\r\n [disabled]=\"\r\n i === collectionTree.children.length - 1 || !(hasUpdatePermission$ | async)\r\n \"\r\n (click)=\"moveDown(collection, i)\"\r\n >\r\n <clr-icon shape=\"caret down\"></clr-icon>\r\n {{ 'catalog.move-down' | translate }}\r\n </button>\r\n <h4 class=\"dropdown-header\">{{ 'catalog.move-to' | translate }}</h4>\r\n <button\r\n type=\"button\"\r\n vdrDropdownItem\r\n *ngFor=\"let item of moveListItems\"\r\n (click)=\"move(collection, item.id)\"\r\n [disabled]=\"!(hasUpdatePermission$ | async)\"\r\n >\r\n <div class=\"move-to-item\">\r\n <div class=\"move-icon\">\r\n <clr-icon shape=\"child-arrow\"></clr-icon>\r\n </div>\r\n <div class=\"path\">\r\n {{ item.path }}\r\n </div>\r\n </div>\r\n </button>\r\n <div class=\"dropdown-divider\"></div>\r\n <button\r\n class=\"button\"\r\n vdrDropdownItem\r\n (click)=\"delete(collection.id)\"\r\n [disabled]=\"!(hasDeletePermission$ | async)\"\r\n >\r\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon>\r\n {{ 'common.delete' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </div>\r\n <vdr-collection-tree-node\r\n *ngIf=\"collection.expanded || expandAll\"\r\n [expandAll]=\"expandAll\"\r\n [collectionTree]=\"collection\"\r\n [activeCollectionId]=\"activeCollectionId\"\r\n [selectionManager]=\"selectionManager\"\r\n ></vdr-collection-tree-node>\r\n </div>\r\n</div>\r\n","import { CdkDragDrop, moveItemInArray } from '@angular/cdk/drag-drop';\r\nimport {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n Input,\r\n OnChanges,\r\n OnDestroy,\r\n OnInit,\r\n Optional,\r\n SimpleChanges,\r\n SkipSelf,\r\n} from '@angular/core';\r\nimport { ActivatedRoute, Router } from '@angular/router';\r\nimport { DataService, Permission, SelectionManager } from '@vendure/admin-ui/core';\r\nimport { Observable, Subscription } from 'rxjs';\r\nimport { map, shareReplay } from 'rxjs/operators';\r\n\r\nimport { RootNode, TreeNode } from './array-to-tree';\r\nimport { CollectionTreeService } from './collection-tree.service';\r\nimport { CollectionPartial } from './collection-tree.types';\r\n\r\n@Component({\r\n selector: 'vdr-collection-tree-node',\r\n templateUrl: './collection-tree-node.component.html',\r\n styleUrls: ['./collection-tree-node.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class CollectionTreeNodeComponent implements OnInit, OnChanges, OnDestroy {\r\n depth = 0;\r\n parentName: string;\r\n @Input() collectionTree: TreeNode<CollectionPartial>;\r\n @Input() activeCollectionId: string;\r\n @Input() expandAll = false;\r\n @Input() selectionManager: SelectionManager<CollectionPartial>;\r\n hasUpdatePermission$: Observable<boolean>;\r\n hasDeletePermission$: Observable<boolean>;\r\n moveListItems: Array<{ path: string; id: string }> = [];\r\n private subscription: Subscription;\r\n\r\n constructor(\r\n @SkipSelf() @Optional() private parent: CollectionTreeNodeComponent,\r\n private dataService: DataService,\r\n private collectionTreeService: CollectionTreeService,\r\n private router: Router,\r\n private route: ActivatedRoute,\r\n private changeDetectorRef: ChangeDetectorRef,\r\n ) {\r\n if (parent) {\r\n this.depth = parent.depth + 1;\r\n }\r\n }\r\n\r\n ngOnInit() {\r\n this.parentName = this.collectionTree.name || '<root>';\r\n const permissions$ = this.dataService.client\r\n .userStatus()\r\n .mapStream(data => data.userStatus.permissions)\r\n .pipe(shareReplay(1));\r\n this.hasUpdatePermission$ = permissions$.pipe(\r\n map(\r\n perms =>\r\n perms.includes(Permission.UpdateCatalog) || perms.includes(Permission.UpdateCollection),\r\n ),\r\n );\r\n this.hasDeletePermission$ = permissions$.pipe(\r\n map(\r\n perms =>\r\n perms.includes(Permission.DeleteCatalog) || perms.includes(Permission.DeleteCollection),\r\n ),\r\n );\r\n this.subscription = this.selectionManager?.selectionChanges$.subscribe(() =>\r\n this.changeDetectorRef.markForCheck(),\r\n );\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n const expandAllChange = changes['expandAll'];\r\n if (expandAllChange) {\r\n if (expandAllChange.previousValue === true && expandAllChange.currentValue === false) {\r\n this.collectionTree.children.forEach(c => (c.expanded = false));\r\n }\r\n }\r\n }\r\n\r\n ngOnDestroy() {\r\n this.subscription?.unsubscribe();\r\n }\r\n\r\n trackByFn(index: number, item: CollectionPartial) {\r\n return item.id;\r\n }\r\n\r\n toggleExpanded(collection: TreeNode<CollectionPartial>) {\r\n collection.expanded = !collection.expanded;\r\n let expandedIds = this.route.snapshot.queryParamMap.get('expanded')?.split(',') ?? [];\r\n if (collection.expanded) {\r\n expandedIds.push(collection.id);\r\n } else {\r\n expandedIds = expandedIds.filter(id => id !== collection.id);\r\n }\r\n this.router.navigate(['./'], {\r\n queryParams: {\r\n expanded: expandedIds.filter(id => !!id).join(','),\r\n },\r\n queryParamsHandling: 'merge',\r\n relativeTo: this.route,\r\n });\r\n }\r\n\r\n getMoveListItems(collection: CollectionPartial) {\r\n this.moveListItems = this.collectionTreeService.getMoveListItems(collection);\r\n }\r\n\r\n move(collection: CollectionPartial, parentId: string) {\r\n this.collectionTreeService.onMove({\r\n index: 0,\r\n parentId,\r\n collectionId: collection.id,\r\n });\r\n }\r\n\r\n moveUp(collection: CollectionPartial, currentIndex: number) {\r\n if (!collection.parent) {\r\n return;\r\n }\r\n this.collectionTreeService.onMove({\r\n index: currentIndex - 1,\r\n parentId: collection.parent.id,\r\n collectionId: collection.id,\r\n });\r\n }\r\n\r\n moveDown(collection: CollectionPartial, currentIndex: number) {\r\n if (!collection.parent) {\r\n return;\r\n }\r\n this.collectionTreeService.onMove({\r\n index: currentIndex + 1,\r\n parentId: collection.parent.id,\r\n collectionId: collection.id,\r\n });\r\n }\r\n\r\n drop(event: CdkDragDrop<CollectionPartial | RootNode<CollectionPartial>>) {\r\n moveItemInArray(this.collectionTree.children, event.previousIndex, event.currentIndex);\r\n this.collectionTreeService.onDrop(event);\r\n }\r\n\r\n delete(id: string) {\r\n this.collectionTreeService.onDelete(id);\r\n }\r\n}\r\n","export type HasParent = { id: string; parent?: { id: string } | null };\r\nexport type TreeNode<T extends HasParent> = T & { children: Array<TreeNode<T>>; expanded: boolean };\r\nexport type RootNode<T extends HasParent> = { id?: string; children: Array<TreeNode<T>> };\r\n\r\n/**\r\n * Builds a tree from an array of nodes which have a parent.\r\n * Based on https://stackoverflow.com/a/31247960/772859, modified to preserve ordering.\r\n */\r\nexport function arrayToTree<T extends HasParent>(\r\n nodes: T[],\r\n currentState?: RootNode<T>,\r\n expandedIds: string[] = [],\r\n): RootNode<T> {\r\n const topLevelNodes: Array<TreeNode<T>> = [];\r\n const mappedArr: { [id: string]: TreeNode<T> } = {};\r\n const currentStateMap = treeToMap(currentState);\r\n\r\n // First map the nodes of the array to an object -> create a hash table.\r\n for (const node of nodes) {\r\n mappedArr[node.id] = { ...(node as any), children: [] };\r\n }\r\n\r\n for (const id of nodes.map(n => n.id)) {\r\n if (mappedArr.hasOwnProperty(id)) {\r\n const mappedElem = mappedArr[id];\r\n mappedElem.expanded = currentStateMap.get(id)?.expanded ?? expandedIds.includes(id);\r\n const parent = mappedElem.parent;\r\n if (!parent) {\r\n continue;\r\n }\r\n // If the element is not at the root level, add it to its parent array of children.\r\n const parentIsRoot = !mappedArr[parent.id];\r\n if (!parentIsRoot) {\r\n if (mappedArr[parent.id]) {\r\n mappedArr[parent.id].children.push(mappedElem);\r\n } else {\r\n mappedArr[parent.id] = { children: [mappedElem] } as any;\r\n }\r\n } else {\r\n topLevelNodes.push(mappedElem);\r\n }\r\n }\r\n }\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n const rootId = topLevelNodes.length ? topLevelNodes[0].parent!.id : undefined;\r\n return { id: rootId, children: topLevelNodes };\r\n}\r\n\r\n/**\r\n * Converts an existing tree (as generated by the arrayToTree function) into a flat\r\n * Map. This is used to persist certain states (e.g. `expanded`) when re-building the\r\n * tree.\r\n */\r\nfunction treeToMap<T extends HasParent>(tree?: RootNode<T>): Map<string, TreeNode<T>> {\r\n const nodeMap = new Map<string, TreeNode<T>>();\r\n function visit(node: TreeNode<T>) {\r\n nodeMap.set(node.id, node);\r\n node.children.forEach(visit);\r\n }\r\n if (tree) {\r\n visit(tree as TreeNode<T>);\r\n }\r\n return nodeMap;\r\n}\r\n","<vdr-collection-tree-node\r\n *ngIf=\"collectionTree\"\r\n cdkDropListGroup\r\n [expandAll]=\"expandAll\"\r\n [collectionTree]=\"collectionTree\"\r\n [selectionManager]=\"selectionManager\"\r\n [activeCollectionId]=\"activeCollectionId\"\r\n></vdr-collection-tree-node>\r\n","import {\r\n ChangeDetectionStrategy,\r\n Component,\r\n EventEmitter,\r\n Input,\r\n OnChanges,\r\n OnInit,\r\n Output,\r\n SimpleChanges,\r\n} from '@angular/core';\r\nimport { Collection, SelectionManager } from '@vendure/admin-ui/core';\r\n\r\nimport { arrayToTree, RootNode } from './array-to-tree';\r\nimport { CollectionTreeService } from './collection-tree.service';\r\nimport { CollectionPartial, RearrangeEvent } from './collection-tree.types';\r\n\r\n@Component({\r\n selector: 'vdr-collection-tree',\r\n templateUrl: 'collection-tree.component.html',\r\n styleUrls: ['./collection-tree.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n providers: [CollectionTreeService],\r\n})\r\nexport class CollectionTreeComponent implements OnInit, OnChanges {\r\n @Input() collections: CollectionPartial[];\r\n @Input() activeCollectionId: string;\r\n @Input() expandAll = false;\r\n @Input() expandedIds: string[] = [];\r\n @Input() selectionManager: SelectionManager<CollectionPartial>;\r\n @Output() rearrange = new EventEmitter<RearrangeEvent>();\r\n @Output() deleteCollection = new EventEmitter<string>();\r\n collectionTree: RootNode<CollectionPartial>;\r\n\r\n constructor(private collectionTreeService: CollectionTreeService) {}\r\n\r\n ngOnChanges(changes: SimpleChanges) {\r\n if ('collections' in changes && this.collections) {\r\n this.collectionTree = arrayToTree(this.collections, this.collectionTree, this.expandedIds);\r\n this.collectionTreeService.setCollectionTree(this.collectionTree);\r\n this.collectionTreeService.resetMoveList();\r\n }\r\n }\r\n\r\n ngOnInit() {\r\n this.collectionTreeService.rearrange$.subscribe(event => this.rearrange.emit(event));\r\n this.collectionTreeService.delete$.subscribe(id => this.deleteCollection.emit(id));\r\n }\r\n}\r\n","<ng-template vdrDialogTitle>\r\n {{ 'catalog.confirm-deletion-of-unused-variants-title' | translate }}\r\n</ng-template>\r\n{{ 'catalog.confirm-deletion-of-unused-variants-body' | translate }}\r\n<ul>\r\n <li *ngFor=\"let variant of variants\">{{ variant.name }} ({{ variant.sku }})</li>\r\n</ul>\r\n<ng-template vdrDialogButtons>\r\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\r\n <button type=\"submit\" (click)=\"confirm()\" class=\"btn btn-primary\">\r\n {{ 'common.confirm' | translate }}\r\n </button>\r\n</ng-template>\r\n","import { ChangeDetectionStrategy, Component } from '@angular/core';\r\nimport { Dialog, GetProductVariantOptionsQuery } from '@vendure/admin-ui/core';\r\n\r\n@Component({\r\n selector: 'vdr-confirm-variant-deletion-dialog',\r\n templateUrl: './confirm-variant-deletion-dialog.component.html',\r\n styleUrls: ['./confirm-variant-deletion-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ConfirmVariantDeletionDialogComponent implements Dialog<boolean> {\r\n resolveWith: (result?: boolean) => void;\r\n variants: NonNullable<GetProductVariantOptionsQuery['product']>['variants'] = [];\r\n\r\n confirm() {\r\n this.resolveWith(true);\r\n }\r\n\r\n cancel() {\r\n this.resolveWith();\r\n }\r\n}\r\n","<vdr-page-block>\r\n <vdr-action-bar>\r\n <vdr-ab-left>\r\n <vdr-language-selector\r\n [disabled]=\"isNew$ | async\"\r\n [availableLanguageCodes]=\"availableLanguages$ | async\"\r\n [currentLanguageCode]=\"languageCode$ | async\"\r\n (languageCodeChange)=\"setLanguage($event)\"\r\n ></vdr-language-selector>\r\n </vdr-ab-left>\r\n\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"facet-detail\"></vdr-action-bar-items>\r\n <button\r\n class=\"btn btn-primary\"\r\n *ngIf=\"isNew$ | async; else updateButton\"\r\n (click)=\"create()\"\r\n [disabled]=\"detailForm.invalid || detailForm.pristine\"\r\n >\r\n {{ 'common.create' | translate }}\r\n </button>\r\n <ng-template #updateButton>\r\n <button\r\n *vdrIfPermissions=\"updatePermission\"\r\n class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n [disabled]=\"detailForm.invalid || detailForm.pristine\"\r\n >\r\n {{ 'common.update' | translate }}\r\n </button>\r\n </ng-template>\r\n </vdr-ab-right>\r\n </vdr-action-bar>\r\n</vdr-page-block>\r\n<form class=\"form\" [formGroup]=\"detailForm\">\r\n <vdr-page-detail-layout>\r\n <vdr-page-detail-sidebar formGroupName=\"facet\">\r\n <vdr-card>\r\n <vdr-form-field [label]=\"'catalog.visibility' | translate\" for=\"visibility\">\r\n <clr-toggle-wrapper>\r\n <input\r\n type=\"checkbox\"\r\n clrToggle\r\n [vdrDisabled]=\"!(updatePermission | hasPermission)\"\r\n formControlName=\"visible\"\r\n id=\"visibility\"\r\n />\r\n <label class=\"visible-toggle\">\r\n <ng-container *ngIf=\"detailForm.value.facet?.visible; else private\">{{\r\n 'catalog.public' | translate\r\n }}</ng-container>\r\n <ng-template #private>{{ 'catalog.private' | translate }}</ng-template>\r\n </label>\r\n </clr-toggle-wrapper>\r\n </vdr-form-field>\r\n </vdr-card>\r\n <vdr-card>\r\n <vdr-page-entity-info *ngIf=\"entity$ | async as entity\" [entity]=\"entity\" />\r\n </vdr-card>\r\n </vdr-page-detail-sidebar>\r\n <vdr-page-block>\r\n <vdr-card formGroupName=\"facet\">\r\n <div class=\"form-grid\">\r\n <vdr-form-field [label]=\"'common.name' | translate\" for=\"name\">\r\n <input\r\n id=\"name\"\r\n type=\"text\"\r\n formControlName=\"name\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n (input)=\"updateCode(entity?.code, $event.target.value)\"\r\n />\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'common.code' | translate\" for=\"code\">\r\n <input\r\n id=\"code\"\r\n type=\"text\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n formControlName=\"code\"\r\n />\r\n </vdr-form-field>\r\n </div>\r\n </vdr-card>\r\n <vdr-card [title]=\"'common.custom-fields' | translate\" *ngIf=\"customFields.length\">\r\n <vdr-tabbed-custom-fields\r\n entityName=\"Facet\"\r\n [customFields]=\"customFields\"\r\n [customFieldsFormGroup]=\"detailForm.get('facet.customFields')\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n />\r\n </vdr-card>\r\n\r\n <vdr-custom-detail-component-host\r\n locationId=\"facet-detail\"\r\n [entity$]=\"entity$\"\r\n [detailForm]=\"detailForm\"\r\n ></vdr-custom-detail-component-host>\r\n\r\n <vdr-card\r\n *ngIf=\"!(isNew$ | async)\"\r\n [title]=\"'catalog.facet-values' | translate\"\r\n [paddingX]=\"false\"\r\n >\r\n <ng-template vdrCardControls>\r\n <input\r\n type=\"text\"\r\n class=\"mr-3\"\r\n [formControl]=\"filterControl\"\r\n [placeholder]=\"'catalog.filter-by-name' | translate\"\r\n />\r\n </ng-template>\r\n <ng-container *ngIf=\"filteredValues$ | async as filteredValues\">\r\n <table class=\"facet-values-list table\" formArrayName=\"values\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>{{ 'common.name' | translate }}</th>\r\n <th>{{ 'common.code' | translate }}</th>\r\n <ng-container *ngIf=\"customValueFields.length\">\r\n <th>{{ 'common.custom-fields' | translate }}</th>\r\n </ng-container>\r\n <th></th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr\r\n class=\"facet-value\"\r\n *ngFor=\"\r\n let value of filteredValues\r\n | paginate\r\n : {\r\n currentPage: currentPage,\r\n itemsPerPage: itemsPerPage,\r\n totalItems: filteredValues.length\r\n };\r\n let i = index\r\n \"\r\n [formGroup]=\"detailForm.get(['values', value.id])\"\r\n >\r\n <td class=\"align-middle\">\r\n <vdr-entity-info [entity]=\"value\"></vdr-entity-info>\r\n </td>\r\n <td class=\"align-middle\">\r\n <input\r\n type=\"text\"\r\n formControlName=\"name\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n (input)=\"updateValueCode(value.code, $event.target.value, value.id)\"\r\n />\r\n </td>\r\n <td class=\"align-middle\">\r\n <input type=\"text\" formControlName=\"code\" />\r\n </td>\r\n <td class=\"\" *ngIf=\"customValueFields.length\">\r\n <vdr-tabbed-custom-fields\r\n entityName=\"FacetValue\"\r\n [customFields]=\"customValueFields\"\r\n [compact]=\"true\"\r\n [customFieldsFormGroup]=\"\r\n detailForm.get(['values', value.id, 'customFields'])\r\n \"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n ></vdr-tabbed-custom-fields>\r\n </td>\r\n <td class=\"align-middle\">\r\n <vdr-dropdown>\r\n <button type=\"button\" class=\"icon-button\" vdrDropdownTrigger>\r\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <button\r\n type=\"button\"\r\n class=\"delete-button\"\r\n (click)=\"deleteFacetValue(value.id)\"\r\n [disabled]=\"!(updatePermission | hasPermission)\"\r\n vdrDropdownItem\r\n >\r\n <clr-icon shape=\"trash\" class=\"is-danger\"></clr-icon>\r\n {{ 'common.delete' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div class=\"pagination-wrapper\">\r\n <vdr-items-per-page-controls\r\n [itemsPerPage]=\"itemsPerPage\"\r\n (itemsPerPageChange)=\"itemsPerPage = $event\"\r\n ></vdr-items-per-page-controls>\r\n <vdr-pagination-controls\r\n [currentPage]=\"currentPage\"\r\n [itemsPerPage]=\"itemsPerPage\"\r\n [totalItems]=\"filteredValues.length\"\r\n (pageChange)=\"currentPage = $event\"\r\n ></vdr-pagination-controls>\r\n </div>\r\n </ng-container>\r\n <div>\r\n <button\r\n type=\"button\"\r\n class=\"button m-3\"\r\n *vdrIfPermissions=\"['CreateCatalog', 'CreateFacet']\"\r\n (click)=\"addFacetValue()\"\r\n >\r\n <clr-icon shape=\"add\"></clr-icon>\r\n {{ 'catalog.add-facet-value' | translate }}\r\n </button>\r\n </div>\r\n </vdr-card>\r\n </vdr-page-block>\r\n </vdr-page-detail-layout>\r\n</form>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport {\r\n FormBuilder,\r\n FormControl,\r\n FormGroup,\r\n FormRecord,\r\n UntypedFormControl,\r\n UntypedFormGroup,\r\n Validators,\r\n} from '@angular/forms';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n CreateFacetInput,\r\n CreateFacetValueInput,\r\n createUpdatedTranslatable,\r\n DataService,\r\n DeletionResult,\r\n FACET_WITH_VALUES_FRAGMENT,\r\n FacetWithValuesFragment,\r\n findTranslation,\r\n getCustomFieldsDefaults,\r\n GetFacetDetailDocument,\r\n LanguageCode,\r\n ModalService,\r\n NotificationService,\r\n Permission,\r\n TypedBaseDetailComponent,\r\n UpdateFacetInput,\r\n UpdateFacetValueInput,\r\n} from '@vendure/admin-ui/core';\r\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\r\nimport { notNullOrUndefined } from '@vendure/common/lib/shared-utils';\r\nimport { gql } from 'apollo-angular';\r\nimport { BehaviorSubject, combineLatest, EMPTY, forkJoin, Observable } from 'rxjs';\r\nimport { map, mergeMap, startWith, switchMap, take, tap } from 'rxjs/operators';\r\n\r\nexport const FACET_DETAIL_QUERY = gql`\r\n query GetFacetDetail($id: ID!) {\r\n facet(id: $id) {\r\n ...FacetWithValues\r\n }\r\n }\r\n ${FACET_WITH_VALUES_FRAGMENT}\r\n`;\r\n\r\ntype ValueItem = FacetWithValuesFragment['values'][number] | { id: string; name: string; code: string };\r\n\r\n@Component({\r\n selector: 'vdr-facet-detail',\r\n templateUrl: './facet-detail.component.html',\r\n styleUrls: ['./facet-detail.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class FacetDetailComponent\r\n extends TypedBaseDetailComponent<typeof GetFacetDetailDocument, 'facet'>\r\n implements OnInit, OnDestroy\r\n{\r\n readonly customFields = this.getCustomFieldConfig('Facet');\r\n readonly customValueFields = this.getCustomFieldConfig('FacetValue');\r\n detailForm = this.formBuilder.group({\r\n facet: this.formBuilder.group({\r\n code: ['', Validators.required],\r\n name: '',\r\n visible: true,\r\n customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),\r\n }),\r\n values: this.formBuilder.record<\r\n FormGroup<{\r\n id: FormControl<string>;\r\n name: FormControl<string>;\r\n code: FormControl<string>;\r\n customFields: FormGroup;\r\n }>\r\n >({}),\r\n });\r\n currentPage = 1;\r\n itemsPerPage = 10;\r\n filterControl = new FormControl('');\r\n values$ = new BehaviorSubject<ValueItem[]>([]);\r\n filteredValues$ = new Observable<ValueItem[]>();\r\n readonly updatePermission = [Permission.UpdateCatalog, Permission.UpdateFacet];\r\n\r\n constructor(\r\n private changeDetector: ChangeDetectorRef,\r\n protected dataService: DataService,\r\n private formBuilder: FormBuilder,\r\n private notificationService: NotificationService,\r\n private modalService: ModalService,\r\n ) {\r\n super();\r\n }\r\n\r\n ngOnInit() {\r\n this.init();\r\n this.filteredValues$ = combineLatest([\r\n this.values$,\r\n this.filterControl.valueChanges.pipe(startWith('')),\r\n ]).pipe(\r\n map(([values, filterTerm]) => {\r\n const filterString = filterTerm?.toLowerCase().trim();\r\n return filterString\r\n ? values.filter(\r\n v =>\r\n v.name.toLowerCase().includes(filterString) ||\r\n v.code.toLowerCase().includes(filterString),\r\n )\r\n : values;\r\n }),\r\n tap(() => {\r\n this.currentPage = 1;\r\n }),\r\n );\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy();\r\n }\r\n\r\n updateCode(currentCode: string, nameValue: string) {\r\n if (!currentCode) {\r\n const codeControl = this.detailForm.get(['facet', 'code']);\r\n if (codeControl && codeControl.pristine) {\r\n codeControl.setValue(normalizeString(nameValue, '-'));\r\n }\r\n }\r\n }\r\n\r\n updateValueCode(currentCode: string, nameValue: string, valueId: string) {\r\n if (!currentCode) {\r\n const codeControl = this.detailForm.get(['values', valueId, 'code']);\r\n if (codeControl && codeControl.pristine) {\r\n codeControl.setValue(normalizeString(nameValue, '-'));\r\n }\r\n }\r\n }\r\n\r\n customValueFieldIsSet(index: number, name: string): boolean {\r\n return !!this.detailForm.get(['values', index, 'customFields', name]);\r\n }\r\n\r\n addFacetValue() {\r\n const valuesFormRecord = this.detailForm.get('values') as FormRecord;\r\n if (valuesFormRecord) {\r\n const id = this.createTempId();\r\n const valueGroup = this.formBuilder.group({\r\n id,\r\n name: ['', Validators.required],\r\n code: '',\r\n customFields: this.formBuilder.group({}),\r\n });\r\n const newValue: any = { id, name: '', code: '' };\r\n if (this.customValueFields.length) {\r\n const customValueFieldsGroup = new UntypedFormGroup({});\r\n newValue.customFields = {};\r\n\r\n for (const fieldDef of this.customValueFields) {\r\n const key = fieldDef.name;\r\n customValueFieldsGroup.addControl(key, new UntypedFormControl());\r\n }\r\n\r\n valueGroup.addControl('customFields', customValueFieldsGroup);\r\n }\r\n valuesFormRecord.addControl(id, valueGroup);\r\n const values = this.values$.value;\r\n const endOfPageIndex = this.currentPage * this.itemsPerPage - 1;\r\n values.splice(endOfPageIndex, 0, newValue);\r\n this.values$.next(values);\r\n }\r\n }\r\n\r\n create() {\r\n const facetForm = this.detailForm.get('facet') as (typeof this.detailForm)['controls']['facet'];\r\n if (!facetForm || !facetForm.dirty) {\r\n return;\r\n }\r\n const newFacet = this.getUpdatedFacet(\r\n {\r\n id: '',\r\n createdAt: '',\r\n updatedAt: '',\r\n isPrivate: false,\r\n languageCode: this.languageCode,\r\n name: '',\r\n code: '',\r\n translations: [],\r\n values: [],\r\n },\r\n facetForm,\r\n this.languageCode,\r\n ) as CreateFacetInput;\r\n this.dataService.facet.createFacet(newFacet).subscribe(\r\n data => {\r\n this.notificationService.success(_('common.notify-create-success'), { entity: 'Facet' });\r\n this.detailForm.markAsPristine();\r\n this.changeDetector.markForCheck();\r\n this.router.navigate(['../', data.createFacet.id], { relativeTo: this.route });\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-create-error'), {\r\n entity: 'Facet',\r\n });\r\n },\r\n );\r\n }\r\n\r\n save() {\r\n const valuesFormRecord = this.detailForm.get(\r\n 'values',\r\n ) as (typeof this.detailForm)['controls']['values'];\r\n combineLatest(this.entity$, this.languageCode$)\r\n .pipe(\r\n take(1),\r\n mergeMap(([facet, languageCode]) => {\r\n const facetForm = this.detailForm.get(\r\n 'facet',\r\n ) as (typeof this.detailForm)['controls']['facet'];\r\n const updateOperations: Array<Observable<any>> = [];\r\n\r\n if (facetForm && facetForm.dirty) {\r\n const newFacet = this.getUpdatedFacet(\r\n facet,\r\n facetForm,\r\n languageCode,\r\n ) as UpdateFacetInput;\r\n if (newFacet) {\r\n updateOperations.push(this.dataService.facet.updateFacet(newFacet));\r\n }\r\n }\r\n if (valuesFormRecord && valuesFormRecord.dirty) {\r\n const createdValues = this.getCreatedFacetValues(\r\n facet,\r\n valuesFormRecord,\r\n languageCode,\r\n );\r\n if (createdValues.length) {\r\n updateOperations.push(\r\n this.dataService.facet.createFacetValues(createdValues).pipe(\r\n switchMap(\r\n () =>\r\n this.dataService.query(GetFacetDetailDocument, {\r\n id: this.id,\r\n }).single$,\r\n ),\r\n ),\r\n );\r\n }\r\n const updatedValues = this.getUpdatedFacetValues(\r\n facet,\r\n valuesFormRecord,\r\n languageCode,\r\n );\r\n if (updatedValues.length) {\r\n updateOperations.push(this.dataService.facet.updateFacetValues(updatedValues));\r\n }\r\n }\r\n\r\n return forkJoin(updateOperations);\r\n }),\r\n )\r\n .subscribe(\r\n () => {\r\n this.detailForm.markAsPristine();\r\n this.changeDetector.markForCheck();\r\n this.notificationService.success(_('common.notify-update-success'), { entity: 'Facet' });\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-update-error'), {\r\n entity: 'Facet',\r\n });\r\n },\r\n );\r\n }\r\n\r\n deleteFacetValue(facetValueId: string) {\r\n if (this.isTempId(facetValueId)) {\r\n // deleting a newly-added (not persisted) FacetValue\r\n const valuesFormRecord = this.detailForm.get('values') as FormRecord;\r\n if (valuesFormRecord) {\r\n valuesFormRecord.removeControl(facetValueId);\r\n }\r\n const values = this.values$.value;\r\n this.values$.next(values.filter(v => v.id !== facetValueId));\r\n return;\r\n }\r\n this.showModalAndDelete(facetValueId)\r\n .pipe(\r\n switchMap(response => {\r\n if (response.result === DeletionResult.DELETED) {\r\n return [true];\r\n } else {\r\n return this.showModalAndDelete(facetValueId, response.message || '').pipe(\r\n map(r => r.result === DeletionResult.DELETED),\r\n );\r\n }\r\n }),\r\n switchMap(deleted =>\r\n deleted\r\n ? this.dataService.query(GetFacetDetailDocument, {\r\n id: this.id,\r\n }).single$\r\n : [],\r\n ),\r\n )\r\n .subscribe(\r\n () => {\r\n const valuesFormRecord = this.detailForm.get('values') as FormRecord;\r\n if (valuesFormRecord) {\r\n valuesFormRecord.removeControl(facetValueId);\r\n }\r\n this.notificationService.success(_('common.notify-delete-success'), {\r\n entity: 'FacetValue',\r\n });\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-delete-error'), {\r\n entity: 'FacetValue',\r\n });\r\n },\r\n );\r\n }\r\n\r\n private showModalAndDelete(facetValueId: string, message?: string) {\r\n return this.modalService\r\n .dialog({\r\n title: _('catalog.confirm-delete-facet-value'),\r\n body: message,\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n { type: 'danger', label: _('common.delete'), returnValue: true },\r\n ],\r\n })\r\n .pipe(\r\n switchMap(result =>\r\n result ? this.dataService.facet.deleteFacetValues([facetValueId], !!message) : EMPTY,\r\n ),\r\n map(result => result.deleteFacetValues[0]),\r\n );\r\n }\r\n\r\n /**\r\n * Sets the values of the form on changes to the facet or current language.\r\n */\r\n protected setFormValues(facet: FacetWithValuesFragment, languageCode: LanguageCode) {\r\n const currentTranslation = findTranslation(facet, languageCode);\r\n\r\n this.detailForm.patchValue({\r\n facet: {\r\n code: facet.code,\r\n visible: !facet.isPrivate,\r\n name: currentTranslation?.name ?? '',\r\n },\r\n });\r\n\r\n if (this.customFields.length) {\r\n this.setCustomFieldFormValues(\r\n this.customFields,\r\n this.detailForm.get(['facet', 'customFields']),\r\n facet,\r\n currentTranslation,\r\n );\r\n }\r\n\r\n const currentValuesFormGroup = this.detailForm.get('values') as FormRecord;\r\n this.values$.next([...facet.values]);\r\n facet.values.forEach(value => {\r\n const valueTranslation = findTranslation(value, languageCode);\r\n const group = {\r\n id: value.id,\r\n code: value.code,\r\n name: valueTranslation ? valueTranslation.name : '',\r\n };\r\n let valueControl = currentValuesFormGroup.get(value.id) as FormGroup;\r\n if (valueControl) {\r\n valueControl.get('id')?.setValue(group.id);\r\n valueControl.get('code')?.setValue(group.code);\r\n valueControl.get('name')?.setValue(group.name);\r\n } else {\r\n valueControl = this.formBuilder.group(group);\r\n currentValuesFormGroup.addControl(value.id, valueControl);\r\n }\r\n if (this.customValueFields.length) {\r\n let customValueFieldsGroup = valueControl.get(['customFields']) as\r\n | UntypedFormGroup\r\n | undefined;\r\n if (!customValueFieldsGroup) {\r\n customValueFieldsGroup = new UntypedFormGroup({});\r\n valueControl.addControl('customFields', customValueFieldsGroup);\r\n }\r\n\r\n if (customValueFieldsGroup) {\r\n for (const fieldDef of this.customValueFields) {\r\n const key = fieldDef.name;\r\n const fieldValue =\r\n fieldDef.type === 'localeString'\r\n ? (valueTranslation as any | undefined)?.customFields?.[key]\r\n : (value as any).customFields[key];\r\n const control = customValueFieldsGroup.get(key);\r\n if (control) {\r\n control.setValue(fieldValue);\r\n } else {\r\n customValueFieldsGroup.addControl(key, new UntypedFormControl(fieldValue));\r\n }\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Given a facet and the value of the detailForm, this method creates an updated copy of the facet which\r\n * can then be persisted to the API.\r\n */\r\n private getUpdatedFacet(\r\n facet: FacetWithValuesFragment,\r\n facetFormGroup: (typeof this.detailForm)['controls']['facet'],\r\n languageCode: LanguageCode,\r\n ): CreateFacetInput | UpdateFacetInput {\r\n const input = createUpdatedTranslatable({\r\n translatable: facet,\r\n updatedFields: facetFormGroup.value,\r\n customFieldConfig: this.customFields,\r\n languageCode,\r\n defaultTranslation: {\r\n languageCode,\r\n name: facet.name || '',\r\n },\r\n });\r\n input.isPrivate = !facetFormGroup.value.visible;\r\n return input;\r\n }\r\n\r\n /**\r\n * Given an array of facet values and the values from the detailForm, this method creates a new array\r\n * which can be persisted to the API via a createFacetValues mutation.\r\n */\r\n private getCreatedFacetValues(\r\n facet: FacetWithValuesFragment,\r\n valuesFormRecord: (typeof this.detailForm)['controls']['values'],\r\n languageCode: LanguageCode,\r\n ): CreateFacetValueInput[] {\r\n return Object.values(valuesFormRecord.controls)\r\n .filter(c => c.value.id && this.isTempId(c.value.id))\r\n .map(c => c.value)\r\n .map(value =>\r\n createUpdatedTranslatable({\r\n translatable: { ...value, translations: [] as any },\r\n updatedFields: value ?? {},\r\n customFieldConfig: this.customValueFields,\r\n languageCode,\r\n defaultTranslation: {\r\n languageCode,\r\n name: '',\r\n },\r\n }),\r\n )\r\n .map(input => ({\r\n facetId: facet.id,\r\n code: input.code ?? '',\r\n ...input,\r\n id: undefined,\r\n }));\r\n }\r\n\r\n /**\r\n * Given an array of facet values and the values from the detailForm, this method creates a new array\r\n * which can be persisted to the API via an updateFacetValues mutation.\r\n */\r\n private getUpdatedFacetValues(\r\n facet: FacetWithValuesFragment,\r\n valuesFormGroup: FormGroup,\r\n languageCode: LanguageCode,\r\n ): UpdateFacetValueInput[] {\r\n const dirtyValues = facet.values.filter(v => {\r\n const formRow = valuesFormGroup.get(v.id);\r\n return formRow && formRow.dirty && formRow.value.id;\r\n });\r\n const dirtyValueValues = Object.values(valuesFormGroup.controls)\r\n .filter(c => c.dirty && !this.isTempId(c.value.id))\r\n .map(c => c.value);\r\n\r\n if (dirtyValues.length !== dirtyValueValues.length) {\r\n throw new Error(_(`error.facet-value-form-values-do-not-match`));\r\n }\r\n return dirtyValues\r\n .map((value, i) =>\r\n createUpdatedTranslatable({\r\n translatable: value,\r\n updatedFields: dirtyValueValues[i],\r\n customFieldConfig: this.customValueFields,\r\n languageCode,\r\n defaultTranslation: {\r\n languageCode,\r\n name: '',\r\n },\r\n }),\r\n )\r\n .filter(notNullOrUndefined);\r\n }\r\n\r\n private createTempId() {\r\n return `temp-${Math.random().toString(36).substr(2, 9)}`;\r\n }\r\n\r\n private isTempId(id: string) {\r\n return id.startsWith('temp-');\r\n }\r\n}\r\n","import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n BulkAction,\r\n createBulkAssignToChannelAction,\r\n createBulkDeleteAction,\r\n createBulkRemoveFromChannelAction,\r\n currentChannelIsNotDefault,\r\n DataService,\r\n getChannelCodeFromUserStatus,\r\n GetFacetListQuery,\r\n ItemOf,\r\n ModalService,\r\n NotificationService,\r\n Permission,\r\n RemoveFacetFromChannelResult,\r\n RemoveFacetsFromChannelMutation,\r\n} from '@vendure/admin-ui/core';\r\nimport { unique } from '@vendure/common/lib/unique';\r\nimport { EMPTY, of } from 'rxjs';\r\nimport { map, switchMap } from 'rxjs/operators';\r\n\r\nimport { FacetListComponent } from './facet-list.component';\r\n\r\nexport const deleteFacetsBulkAction = createBulkDeleteAction<ItemOf<GetFacetListQuery, 'facets'>>({\r\n location: 'facet-list',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.DeleteFacet) ||\r\n userPermissions.includes(Permission.DeleteCatalog),\r\n getItemName: item => item.name,\r\n shouldRetryItem: (response, item) => !!response.message,\r\n bulkDelete: (dataService, ids, retrying) =>\r\n dataService.facet.deleteFacets(ids, retrying).pipe(map(res => res.deleteFacets)),\r\n});\r\n\r\nexport const assignFacetsToChannelBulkAction = createBulkAssignToChannelAction<\r\n ItemOf<GetFacetListQuery, 'facets'>\r\n>({\r\n location: 'facet-list',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.UpdateCatalog) ||\r\n userPermissions.includes(Permission.UpdateFacet),\r\n getItemName: item => item.name,\r\n bulkAssignToChannel: (dataService, facetIds, channelId) =>\r\n dataService.facet\r\n .assignFacetsToChannel({\r\n facetIds,\r\n channelId,\r\n })\r\n .pipe(map(res => res.assignFacetsToChannel)),\r\n});\r\n\r\nexport const removeFacetsFromChannelBulkAction = createBulkRemoveFromChannelAction<\r\n ItemOf<GetFacetListQuery, 'facets'>,\r\n RemoveFacetsFromChannelMutation['removeFacetsFromChannel'][number]\r\n>({\r\n location: 'facet-list',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.DeleteCatalog) ||\r\n userPermissions.includes(Permission.DeleteFacet),\r\n getItemName: item => item.name,\r\n bulkRemoveFromChannel: (dataService, facetIds, channelId, retrying) =>\r\n dataService.facet\r\n .removeFacetsFromChannel({\r\n channelId: channelId,\r\n facetIds,\r\n force: retrying,\r\n })\r\n .pipe(map(res => res.removeFacetsFromChannel)),\r\n isErrorResult: result => (result.__typename === 'FacetInUseError' ? result.message : undefined),\r\n});\r\n\r\nexport const removeFacetsFromChannelBulkAction2: BulkAction<\r\n ItemOf<GetFacetListQuery, 'facets'>,\r\n FacetListComponent\r\n> = {\r\n location: 'facet-list',\r\n label: _('catalog.remove-from-channel'),\r\n getTranslationVars: ({ injector }) => getChannelCodeFromUserStatus(injector.get(DataService)),\r\n icon: 'layers',\r\n iconClass: 'is-warning',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.UpdateFacet) ||\r\n userPermissions.includes(Permission.UpdateCatalog),\r\n isVisible: ({ injector }) => currentChannelIsNotDefault(injector.get(DataService)),\r\n onClick: ({ injector, selection, hostComponent, clearSelection }) => {\r\n const modalService = injector.get(ModalService);\r\n const dataService = injector.get(DataService);\r\n const notificationService = injector.get(NotificationService);\r\n\r\n const activeChannelId$ = dataService.client\r\n .userStatus()\r\n .mapSingle(({ userStatus }) => userStatus.activeChannelId);\r\n\r\n function showModalAndDelete(facetIds: string[], message?: string) {\r\n return modalService\r\n .dialog({\r\n title: _('catalog.remove-from-channel'),\r\n translationVars: {\r\n count: selection.length,\r\n },\r\n size: message ? 'lg' : 'md',\r\n body: message,\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n {\r\n type: 'danger',\r\n label: message ? _('common.force-remove') : _('common.remove'),\r\n returnValue: true,\r\n },\r\n ],\r\n })\r\n .pipe(\r\n switchMap(res =>\r\n res\r\n ? activeChannelId$.pipe(\r\n switchMap(activeChannelId =>\r\n activeChannelId\r\n ? dataService.facet.removeFacetsFromChannel({\r\n channelId: activeChannelId,\r\n facetIds,\r\n force: !!message,\r\n })\r\n : EMPTY,\r\n ),\r\n map(res2 => res2.removeFacetsFromChannel),\r\n )\r\n : EMPTY,\r\n ),\r\n );\r\n }\r\n\r\n showModalAndDelete(unique(selection.map(f => f.id)))\r\n .pipe(\r\n switchMap(result => {\r\n let removedCount = selection.length;\r\n const errors: string[] = [];\r\n const errorIds: string[] = [];\r\n let i = 0;\r\n for (const item of result) {\r\n if (item.__typename === 'FacetInUseError') {\r\n errors.push(item.message);\r\n errorIds.push(selection[i]?.id);\r\n removedCount--;\r\n }\r\n i++;\r\n }\r\n if (0 < errorIds.length) {\r\n return showModalAndDelete(errorIds, errors.join('\\n')).pipe(\r\n map(result2 => {\r\n const notRemovedCount = result2.filter(\r\n r => r.__typename === 'FacetInUseError',\r\n ).length;\r\n return selection.length - notRemovedCount;\r\n }),\r\n );\r\n } else {\r\n return of(removedCount);\r\n }\r\n }),\r\n switchMap(removedCount =>\r\n removedCount\r\n ? getChannelCodeFromUserStatus(dataService).then(({ channelCode }) => ({\r\n channelCode,\r\n removedCount,\r\n }))\r\n : EMPTY,\r\n ),\r\n )\r\n .subscribe(({ removedCount, channelCode }) => {\r\n if (removedCount) {\r\n hostComponent.refresh();\r\n clearSelection();\r\n notificationService.success(_('catalog.notify-remove-facets-from-channel-success'), {\r\n count: removedCount,\r\n channelCode,\r\n });\r\n }\r\n });\r\n },\r\n};\r\n","<vdr-page-block>\r\n <vdr-action-bar>\r\n <vdr-ab-left>\r\n <vdr-language-selector\r\n [availableLanguageCodes]=\"availableLanguages$ | async\"\r\n [currentLanguageCode]=\"contentLanguage$ | async\"\r\n (languageCodeChange)=\"setLanguage($event)\"\r\n ></vdr-language-selector>\r\n </vdr-ab-left>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"facet-list\"></vdr-action-bar-items>\r\n <a\r\n class=\"btn btn-primary\"\r\n [routerLink]=\"['./create']\"\r\n *vdrIfPermissions=\"['CreateCatalog', 'CreateFacet']\"\r\n >\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.create-new-facet' | translate }}\r\n </a>\r\n </vdr-ab-right>\r\n </vdr-action-bar>\r\n</vdr-page-block>\r\n<vdr-data-table-2\r\n class=\"mt-2\"\r\n id=\"facet-list\"\r\n [items]=\"items$ | async\"\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n [totalItems]=\"totalItems$ | async\"\r\n [currentPage]=\"currentPage$ | async\"\r\n [filters]=\"filters\"\r\n (pageChange)=\"setPageNumber($event)\"\r\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\r\n>\r\n <vdr-bulk-action-menu\r\n locationId=\"facet-list\"\r\n [hostComponent]=\"this\"\r\n [selectionManager]=\"selectionManager\"\r\n ></vdr-bulk-action-menu>\r\n <vdr-dt2-search\r\n [searchTermControl]=\"searchTermControl\"\r\n [searchTermPlaceholder]=\"'catalog.filter-by-name' | translate\"\r\n ></vdr-dt2-search>\r\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\" [sort]=\"sorts.get('id')\">\r\n <ng-template let-facet=\"item\">\r\n {{ facet.id }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column\r\n [heading]=\"'common.created-at' | translate\" id=\"created-at\"\r\n [hiddenByDefault]=\"true\"\r\n [sort]=\"sorts.get('createdAt')\"\r\n >\r\n <ng-template let-facet=\"item\">\r\n {{ facet.createdAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column\r\n [heading]=\"'common.updated-at' | translate\" id=\"updated-at\"\r\n [hiddenByDefault]=\"true\"\r\n [sort]=\"sorts.get('updatedAt')\"\r\n >\r\n <ng-template let-facet=\"item\">\r\n {{ facet.updatedAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.name' | translate\" id=\"name\" [optional]=\"false\" [sort]=\"sorts.get('name')\">\r\n <ng-template let-facet=\"item\">\r\n <a class=\"button-ghost\" [routerLink]=\"['./', facet.id]\"\r\n ><span>{{ facet.name }}</span>\r\n <clr-icon shape=\"arrow right\"></clr-icon>\r\n </a>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.code' | translate\" id=\"code\">\r\n <ng-template let-facet=\"item\">\r\n {{ facet.code }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.visibility' | translate\" id=\"visibility\">\r\n <ng-template let-facet=\"item\">\r\n <vdr-chip *ngIf=\"facet.isPrivate\" colorType=\"warning\">{{\r\n 'common.private' | translate\r\n }}</vdr-chip>\r\n <vdr-chip *ngIf=\"!facet.isPrivate\" colorType=\"success\">{{\r\n 'common.public' | translate\r\n }}</vdr-chip>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'catalog.values' | translate\" id=\"values\">\r\n <ng-template let-facet=\"item\">\r\n <div class=\"facet-values-list\">\r\n <vdr-facet-value-chip\r\n *ngFor=\"let value of facet.valueList.items | slice : 0 : displayLimit[facet.id] || 3\"\r\n [facetValue]=\"value\"\r\n [removable]=\"false\"\r\n [displayFacetName]=\"false\"\r\n ></vdr-facet-value-chip>\r\n <vdr-chip *ngIf=\"displayLimit[facet.id] < facet.valueList.totalItems && (displayLimit[facet.id] || 0) === facet.valueList.items.length\">\r\n ... + {{ facet.valueList.totalItems - facet.valueList.items.length }}\r\n </vdr-chip>\r\n <button\r\n class=\"button-small\"\r\n *ngIf=\"facet.valueList.items.length > initialLimit\"\r\n (click)=\"toggleDisplayLimit(facet)\"\r\n >\r\n <ng-container *ngIf=\"(displayLimit[facet.id] || 0) < facet.valueList.items.length; else collapse\">\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ facet.valueList.totalItems - initialLimit }}\r\n </ng-container>\r\n <ng-template #collapse>\r\n <clr-icon shape=\"minus\"></clr-icon>\r\n </ng-template>\r\n </button>\r\n </div>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-custom-field-column *ngFor=\"let customField of customFields\" [customField]=\"customField\" [sorts]=\"sorts\" />\r\n</vdr-data-table-2>\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n DataService,\r\n FACET_WITH_VALUE_LIST_FRAGMENT,\r\n FACET_WITH_VALUES_FRAGMENT,\r\n GetFacetListDocument,\r\n GetFacetListQuery,\r\n ItemOf,\r\n LanguageCode,\r\n TypedBaseListComponent,\r\n} from '@vendure/admin-ui/core';\r\nimport { gql } from 'apollo-angular';\r\n\r\nexport const FACET_LIST_QUERY = gql`\r\n query GetFacetList($options: FacetListOptions) {\r\n facets(options: $options) {\r\n items {\r\n ...FacetWithValueList\r\n }\r\n totalItems\r\n }\r\n }\r\n ${FACET_WITH_VALUE_LIST_FRAGMENT}\r\n`;\r\n\r\n@Component({\r\n selector: 'vdr-facet-list',\r\n templateUrl: './facet-list.component.html',\r\n styleUrls: ['./facet-list.component.scss'],\r\n})\r\nexport class FacetListComponent\r\n extends TypedBaseListComponent<typeof GetFacetListDocument, 'facets'>\r\n implements OnInit\r\n{\r\n readonly initialLimit = 3;\r\n displayLimit: { [id: string]: number } = {};\r\n\r\n readonly customFields = this.getCustomFieldConfig('Facet');\r\n readonly filters = this.createFilterCollection()\r\n .addIdFilter()\r\n .addDateFilters()\r\n .addFilter({\r\n name: 'visibility',\r\n type: { kind: 'boolean' },\r\n label: _('common.visibility'),\r\n toFilterInput: value => ({\r\n isPrivate: { eq: !value },\r\n }),\r\n })\r\n .addCustomFieldFilters(this.customFields)\r\n .connectToRoute(this.route);\r\n\r\n readonly sorts = this.createSortCollection()\r\n .defaultSort('createdAt', 'DESC')\r\n .addSort({ name: 'id' })\r\n .addSort({ name: 'createdAt' })\r\n .addSort({ name: 'updatedAt' })\r\n .addSort({ name: 'name' })\r\n .addSort({ name: 'code' })\r\n .addCustomFieldSorts(this.customFields)\r\n .connectToRoute(this.route);\r\n\r\n constructor(protected dataService: DataService) {\r\n super();\r\n super.configure({\r\n document: GetFacetListDocument,\r\n getItems: data => data.facets,\r\n setVariables: (skip, take) => ({\r\n options: {\r\n skip,\r\n take,\r\n filter: {\r\n name: {\r\n contains: this.searchTermControl.value,\r\n },\r\n ...this.filters.createFilterInput(),\r\n },\r\n sort: this.sorts.createSortInput(),\r\n },\r\n }),\r\n refreshListOnChanges: [this.filters.valueChanges, this.sorts.valueChanges],\r\n });\r\n }\r\n\r\n toggleDisplayLimit(facet: ItemOf<GetFacetListQuery, 'facets'>) {\r\n if (this.displayLimit[facet.id] === facet.valueList.items.length) {\r\n this.displayLimit[facet.id] = this.initialLimit;\r\n } else {\r\n this.displayLimit[facet.id] = facet.valueList.items.length;\r\n }\r\n }\r\n\r\n setLanguage(code: LanguageCode) {\r\n this.dataService.client.setContentLanguage(code).subscribe();\r\n }\r\n}\r\n","<div *ngFor=\"let group of optionGroups\" class=\"option-groups\">\r\n <div class=\"name\">\r\n <label>{{ 'catalog.option' | translate }}</label>\r\n <input\r\n #optionGroupName\r\n placeholder=\"e.g. Size\"\r\n clrInput\r\n [(ngModel)]=\"group.name\"\r\n name=\"name\"\r\n required\r\n (keydown.enter)=\"handleEnter($event, optionValueInputComponent)\"\r\n />\r\n </div>\r\n <div class=\"values\">\r\n <label>{{ 'catalog.option-values' | translate }}</label>\r\n <vdr-option-value-input\r\n #optionValueInputComponent\r\n [(ngModel)]=\"group.values\"\r\n (ngModelChange)=\"generateVariants()\"\r\n (edit)=\"generateVariants()\"\r\n [groupName]=\"group.name\"\r\n [disabled]=\"group.name === ''\"\r\n ></vdr-option-value-input>\r\n </div>\r\n <div class=\"remove-group\">\r\n <button\r\n class=\"button-small mt-2\"\r\n [title]=\"'catalog.remove-option' | translate\"\r\n (click)=\"removeOption(group.name)\"\r\n >\r\n <clr-icon shape=\"trash\"></clr-icon>\r\n </button>\r\n </div>\r\n</div>\r\n<button class=\"button mb-2\" (click)=\"addOption()\">\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.add-option' | translate }}\r\n</button>\r\n\r\n<ng-container *ngIf=\"stockLocations$ | async as stockLocations\">\r\n <clr-alert *ngIf=\"stockLocations.length === 0\" clrAlertType=\"warning\" [clrAlertClosable]=\"false\" class=\"\">\r\n <clr-alert-item>\r\n <span class=\"alert-text\">\r\n {{ 'catalog.no-stock-locations-available-on-current-channel' | translate }}\r\n </span>\r\n </clr-alert-item>\r\n </clr-alert>\r\n\r\n <div class=\"form-grid mb-2\">\r\n <vdr-form-field *ngIf=\"stockLocations.length\" [label]=\"'catalog.add-stock-to-location' | translate\">\r\n <select [(ngModel)]=\"selectedStockLocationId\">\r\n <option *ngFor=\"let location of stockLocations\" [value]=\"location.id\">\r\n {{ location.name }}\r\n </option>\r\n </select>\r\n </vdr-form-field>\r\n </div>\r\n\r\n <div class=\"variants-preview\" *ngIf=\"0 < stockLocations.length\">\r\n <table class=\"table\">\r\n <thead>\r\n <tr>\r\n <th *ngIf=\"1 < variants.length\">{{ 'common.create' | translate }}</th>\r\n <th *ngIf=\"1 < variants.length\">{{ 'catalog.variant' | translate }}</th>\r\n <th>{{ 'catalog.sku' | translate }}</th>\r\n <th>{{ 'catalog.price' | translate }}</th>\r\n <th>{{ 'catalog.stock-on-hand' | translate }}</th>\r\n </tr>\r\n </thead>\r\n <tr\r\n *ngFor=\"let variant of variants; trackBy: trackByFn\"\r\n [class.disabled]=\"!variantFormValues[variant.id].value.enabled === false\"\r\n [formGroup]=\"variantFormValues[variant.id]\"\r\n >\r\n <td *ngIf=\"1 < variants.length\">\r\n <input type=\"checkbox\" formControlName=\"enabled\" clrCheckbox />\r\n </td>\r\n <td *ngIf=\"1 < variants.length\">\r\n {{ variant.values.join(' ') }}\r\n </td>\r\n <td>\r\n <vdr-form-field>\r\n <input type=\"text\" formControlName=\"sku\" [placeholder]=\"'catalog.sku' | translate\" />\r\n </vdr-form-field>\r\n </td>\r\n <td>\r\n <vdr-form-field>\r\n <vdr-currency-input\r\n formControlName=\"price\"\r\n [currencyCode]=\"currencyCode\"\r\n ></vdr-currency-input>\r\n </vdr-form-field>\r\n </td>\r\n <td>\r\n <vdr-form-field>\r\n <input type=\"number\" formControlName=\"stock\" min=\"0\" step=\"1\" />\r\n </vdr-form-field>\r\n </td>\r\n </tr>\r\n </table>\r\n </div>\r\n</ng-container>\r\n","import { Component, ElementRef, EventEmitter, OnInit, Output, QueryList, ViewChildren } from '@angular/core';\r\nimport { AbstractControl, FormArray, FormBuilder, FormControl, FormGroup } from '@angular/forms';\r\nimport {\r\n CurrencyCode,\r\n DataService,\r\n GetStockLocationListDocument,\r\n GetStockLocationListQuery,\r\n ItemOf,\r\n} from '@vendure/admin-ui/core';\r\nimport { generateAllCombinations } from '@vendure/common/lib/shared-utils';\r\nimport { Observable } from 'rxjs';\r\nimport { tap } from 'rxjs/operators';\r\n\r\nimport { OptionValueInputComponent } from '../option-value-input/option-value-input.component';\r\n\r\nconst DEFAULT_VARIANT_CODE = '__DEFAULT_VARIANT__';\r\nexport type CreateVariantValues = {\r\n optionValues: string[];\r\n enabled: boolean;\r\n sku: string;\r\n price: number;\r\n stock: number;\r\n};\r\nexport type CreateProductVariantsConfig = {\r\n groups: Array<{ name: string; values: string[] }>;\r\n variants: CreateVariantValues[];\r\n stockLocationId: string;\r\n};\r\n\r\n@Component({\r\n selector: 'vdr-generate-product-variants',\r\n templateUrl: './generate-product-variants.component.html',\r\n styleUrls: ['./generate-product-variants.component.scss'],\r\n})\r\nexport class GenerateProductVariantsComponent implements OnInit {\r\n @Output() variantsChange = new EventEmitter<CreateProductVariantsConfig>();\r\n @ViewChildren('optionGroupName', { read: ElementRef }) groupNameInputs: QueryList<ElementRef>;\r\n optionGroups: Array<{ name: string; values: Array<{ name: string; locked: boolean }> }> = [];\r\n currencyCode: CurrencyCode;\r\n variants: Array<{ id: string; values: string[] }>;\r\n variantFormValues: {\r\n [id: string]: FormGroup<{\r\n optionValues: FormControl<string[]>;\r\n enabled: FormControl<boolean>;\r\n price: FormControl<number>;\r\n sku: FormControl<string>;\r\n stock: FormControl<number>;\r\n }>;\r\n } = {};\r\n stockLocations$: Observable<Array<ItemOf<GetStockLocationListQuery, 'stockLocations'>>>;\r\n selectedStockLocationId: string | null = null;\r\n constructor(private dataService: DataService, private formBuilder: FormBuilder) {}\r\n\r\n ngOnInit() {\r\n this.dataService.settings.getActiveChannel().single$.subscribe(data => {\r\n this.currencyCode = data.activeChannel.defaultCurrencyCode;\r\n });\r\n this.stockLocations$ = this.dataService\r\n .query(GetStockLocationListDocument, {\r\n options: {\r\n take: 999,\r\n },\r\n })\r\n .refetchOnChannelChange()\r\n .mapStream(({ stockLocations }) => stockLocations.items)\r\n .pipe(\r\n tap(items => {\r\n if (items.length) {\r\n this.selectedStockLocationId = items[0].id;\r\n }\r\n }),\r\n );\r\n\r\n this.generateVariants();\r\n }\r\n\r\n addOption() {\r\n this.optionGroups.push({ name: '', values: [] });\r\n const index = this.optionGroups.length - 1;\r\n setTimeout(() => {\r\n const input = this.groupNameInputs.get(index)?.nativeElement;\r\n input?.focus();\r\n });\r\n }\r\n\r\n removeOption(name: string) {\r\n this.optionGroups = this.optionGroups.filter(g => g.name !== name);\r\n this.generateVariants();\r\n }\r\n\r\n generateVariants() {\r\n const totalValuesCount = this.optionGroups.reduce((sum, group) => sum + group.values.length, 0);\r\n const groups = totalValuesCount\r\n ? this.optionGroups.map(g => g.values.map(v => v.name))\r\n : [[DEFAULT_VARIANT_CODE]];\r\n this.variants = generateAllCombinations(groups).map(values => ({ id: values.join('|'), values }));\r\n\r\n this.variants.forEach((variant, index) => {\r\n if (!this.variantFormValues[variant.id]) {\r\n const formGroup = this.formBuilder.nonNullable.group({\r\n optionValues: [variant.values],\r\n enabled: true as boolean,\r\n price: this.copyFromDefault(variant.id, 'price', 0),\r\n sku: this.copyFromDefault(variant.id, 'sku', ''),\r\n stock: this.copyFromDefault(variant.id, 'stock', 0),\r\n });\r\n formGroup.valueChanges.subscribe(() => this.onFormChange());\r\n if (index === 0) {\r\n formGroup.get('price')?.valueChanges.subscribe(value => {\r\n this.copyValuesToPristine('price', formGroup.get('price'));\r\n });\r\n formGroup.get('sku')?.valueChanges.subscribe(value => {\r\n this.copyValuesToPristine('sku', formGroup.get('sku'));\r\n });\r\n formGroup.get('stock')?.valueChanges.subscribe(value => {\r\n this.copyValuesToPristine('stock', formGroup.get('stock'));\r\n });\r\n }\r\n this.variantFormValues[variant.id] = formGroup;\r\n }\r\n });\r\n }\r\n\r\n trackByFn(index: number, variant: { name: string; values: string[] }) {\r\n return variant.values.join('|');\r\n }\r\n\r\n handleEnter(event: KeyboardEvent, optionValueInputComponent: OptionValueInputComponent) {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n optionValueInputComponent.focus();\r\n }\r\n\r\n copyValuesToPristine(field: 'price' | 'sku' | 'stock', formControl: AbstractControl | null) {\r\n if (!formControl) {\r\n return;\r\n }\r\n Object.values(this.variantFormValues).forEach(formGroup => {\r\n const correspondingFormControl = formGroup.get(field) as FormControl;\r\n if (correspondingFormControl && correspondingFormControl.pristine) {\r\n correspondingFormControl.setValue(formControl.value, { emitEvent: false });\r\n }\r\n });\r\n }\r\n\r\n onFormChange() {\r\n const variantsToCreate = this.variants\r\n .map(v => this.variantFormValues[v.id].value as CreateVariantValues)\r\n .filter(v => v.enabled);\r\n this.variantsChange.emit({\r\n groups: this.optionGroups.map(og => ({ name: og.name, values: og.values.map(v => v.name) })),\r\n variants: variantsToCreate,\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n stockLocationId: this.selectedStockLocationId!,\r\n });\r\n }\r\n\r\n private copyFromDefault<T extends keyof CreateVariantValues>(\r\n variantId: string,\r\n prop: T,\r\n value: CreateVariantValues[T],\r\n ): CreateVariantValues[T] {\r\n return variantId !== DEFAULT_VARIANT_CODE\r\n ? (this.variantFormValues[DEFAULT_VARIANT_CODE].get(prop)?.value as CreateVariantValues[T])\r\n : value;\r\n }\r\n}\r\n","<vdr-page-block *ngIf=\"!hideLanguageSelect\">\r\n <vdr-language-selector\r\n [availableLanguageCodes]=\"availableLanguages$ | async\"\r\n [currentLanguageCode]=\"contentLanguage$ | async\"\r\n (languageCodeChange)=\"setLanguage($event)\"\r\n ></vdr-language-selector>\r\n</vdr-page-block>\r\n<vdr-data-table-2\r\n class=\"mt-2\"\r\n [id]=\"dataTableId || 'product-variant-list'\"\r\n [items]=\"items$ | async\"\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n [totalItems]=\"totalItems$ | async\"\r\n [currentPage]=\"currentPage$ | async\"\r\n [filters]=\"filters\"\r\n (pageChange)=\"setPageNumber($event)\"\r\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\r\n>\r\n <vdr-bulk-action-menu\r\n locationId=\"product-variant-list\"\r\n [hostComponent]=\"this\"\r\n [selectionManager]=\"selectionManager\"\r\n />\r\n <vdr-dt2-search\r\n [searchTermControl]=\"searchTermControl\"\r\n [searchTermPlaceholder]=\"'catalog.filter-by-sku' | translate\"\r\n />\r\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\" [sort]=\"sorts.get('id')\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.id }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column\r\n [heading]=\"'common.created-at' | translate\" id=\"created-at\"\r\n [hiddenByDefault]=\"true\"\r\n [sort]=\"sorts.get('createdAt')\"\r\n >\r\n <ng-template let-variant=\"item\">\r\n {{ variant.createdAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column\r\n [heading]=\"'common.updated-at' | translate\" id=\"updated-at\"\r\n [hiddenByDefault]=\"true\"\r\n [sort]=\"sorts.get('updatedAt')\"\r\n >\r\n <ng-template let-variant=\"item\">\r\n {{ variant.updatedAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.image' | translate\" id=\"image\">\r\n <ng-template let-variant=\"item\">\r\n <div class=\"image-placeholder\">\r\n <img\r\n *ngIf=\"variant.featuredAsset as asset; else imagePlaceholder\"\r\n [src]=\"asset | assetPreview : 'tiny'\"\r\n />\r\n <ng-template #imagePlaceholder>\r\n <div class=\"placeholder\">\r\n <clr-icon shape=\"image\" size=\"48\"></clr-icon>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'catalog.name' | translate\" id=\"name\" [optional]=\"false\" [sort]=\"sorts.get('name')\">\r\n <ng-template let-variant=\"item\">\r\n <a\r\n class=\"button-ghost\"\r\n [routerLink]=\"['/catalog/products', variant.productId, 'variants', variant.id]\"\r\n ><span>{{ variant.name }}</span\r\n ><clr-icon shape=\"arrow right\"\r\n /></a>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'catalog.sku' | translate\" id=\"sku\" [sort]=\"sorts.get('sku')\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.sku }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.enabled' | translate\" id=\"enabled\">\r\n <ng-template let-variant=\"item\">\r\n <vdr-chip *ngIf=\"variant.enabled\" colorType=\"success\">{{\r\n 'common.enabled' | translate\r\n }}</vdr-chip>\r\n <vdr-chip *ngIf=\"!variant.enabled\" colorType=\"warning\">{{\r\n 'common.disabled' | translate\r\n }}</vdr-chip>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column\r\n [heading]=\"'common.price' | translate\" id=\"price\"\r\n [hiddenByDefault]=\"true\"\r\n [sort]=\"sorts.get('price')\"\r\n >\r\n <ng-template let-variant=\"item\">\r\n {{ variant.price | localeCurrency : variant.currencyCode }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.price-with-tax' | translate\" id=\"price-with-tax\" [sort]=\"sorts.get('priceWithTax')\">\r\n <ng-template let-variant=\"item\">\r\n {{ variant.priceWithTax | localeCurrency : variant.currencyCode }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n\r\n <vdr-dt2-column [heading]=\"'catalog.stock-on-hand' | translate\" id=\"stock-on-hand\" [hiddenByDefault]=\"false\">\r\n <ng-template let-variant=\"item\">\r\n <vdr-chip *ngFor=\"let stockLevel of variant.stockLevels\" [title]=\"stockLevel.stockLocation?.name\">\r\n <div class=\"flex center\">\r\n <div>\r\n {{ stockLevel.stockOnHand\r\n }}<span class=\"ml-1\" *ngIf=\"stockLevel.stockAllocated\"\r\n >({{ stockLevel.stockAllocated }} allocated)</span\r\n >\r\n </div>\r\n </div>\r\n </vdr-chip>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-custom-field-column *ngFor=\"let field of customFields\" [customField]=\"field\" [sorts]=\"sorts\" />\r\n</vdr-data-table-2>\r\n","import { Component, Input, OnInit } from '@angular/core';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n DataTableLocationId,\r\n ProductVariantListQueryDocument,\r\n TypedBaseListComponent,\r\n} from '@vendure/admin-ui/core';\r\n\r\n@Component({\r\n selector: 'vdr-product-variant-list',\r\n templateUrl: './product-variant-list.component.html',\r\n styleUrls: ['./product-variant-list.component.scss'],\r\n})\r\nexport class ProductVariantListComponent\r\n extends TypedBaseListComponent<typeof ProductVariantListQueryDocument, 'productVariants'>\r\n implements OnInit\r\n{\r\n @Input() productId?: string;\r\n @Input() hideLanguageSelect = false;\r\n @Input() dataTableId: DataTableLocationId | undefined;\r\n readonly customFields = this.getCustomFieldConfig('ProductVariant');\r\n readonly filters = this.createFilterCollection()\r\n .addIdFilter()\r\n .addDateFilters()\r\n .addFilters([\r\n {\r\n name: 'name',\r\n type: { kind: 'text' },\r\n label: _('common.name'),\r\n filterField: 'name',\r\n },\r\n {\r\n name: 'enabled',\r\n type: { kind: 'boolean' },\r\n label: _('common.enabled'),\r\n filterField: 'enabled',\r\n },\r\n {\r\n name: 'sku',\r\n type: { kind: 'text' },\r\n label: _('catalog.sku'),\r\n filterField: 'sku',\r\n },\r\n {\r\n name: 'price',\r\n type: { kind: 'number', inputType: 'currency' },\r\n label: _('common.price'),\r\n filterField: 'price',\r\n },\r\n {\r\n name: 'priceWithTax',\r\n type: { kind: 'number', inputType: 'currency' },\r\n label: _('common.price-with-tax'),\r\n filterField: 'priceWithTax',\r\n },\r\n ])\r\n .addCustomFieldFilters(this.customFields)\r\n .connectToRoute(this.route);\r\n\r\n readonly sorts = this.createSortCollection()\r\n .addSorts([\r\n { name: 'id' },\r\n { name: 'createdAt' },\r\n { name: 'updatedAt' },\r\n { name: 'name' },\r\n { name: 'sku' },\r\n { name: 'price' },\r\n { name: 'priceWithTax' },\r\n ])\r\n .addCustomFieldSorts(this.customFields)\r\n .connectToRoute(this.route);\r\n\r\n constructor() {\r\n super();\r\n this.configure({\r\n document: ProductVariantListQueryDocument,\r\n getItems: data => data.productVariants,\r\n setVariables: (skip, take) => ({\r\n options: {\r\n skip,\r\n take,\r\n filter: {\r\n sku: {\r\n contains: this.searchTermControl.value,\r\n },\r\n ...this.filters.createFilterInput(),\r\n ...(this.productId ? { productId: { eq: this.productId } } : {}),\r\n },\r\n sort: this.sorts.createSortInput(),\r\n },\r\n }),\r\n refreshListOnChanges: [this.sorts.valueChanges, this.filters.valueChanges],\r\n });\r\n }\r\n}\r\n","<vdr-page-block>\r\n <vdr-action-bar>\r\n <vdr-ab-left>\r\n <div class=\"flex clr-flex-row\"></div>\r\n <vdr-language-selector\r\n [disabled]=\"isNew$ | async\"\r\n [availableLanguageCodes]=\"availableLanguages$ | async\"\r\n [currentLanguageCode]=\"languageCode$ | async\"\r\n (languageCodeChange)=\"setLanguage($event)\"\r\n ></vdr-language-selector>\r\n </vdr-ab-left>\r\n\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"product-detail\"></vdr-action-bar-items>\r\n <button\r\n class=\"btn btn-primary\"\r\n *ngIf=\"isNew$ | async; else updateButton\"\r\n (click)=\"create()\"\r\n [disabled]=\"detailForm.invalid || detailForm.pristine || createVariantsConfig.variants.length === 0\"\r\n >\r\n {{ 'common.create' | translate }}\r\n </button>\r\n <ng-template #updateButton>\r\n <button\r\n *vdrIfPermissions=\"updatePermissions\"\r\n class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n [disabled]=\"(detailForm.invalid || detailForm.pristine) && !assetsChanged()\"\r\n >\r\n {{ 'common.update' | translate }}\r\n </button>\r\n </ng-template>\r\n </vdr-ab-right>\r\n </vdr-action-bar>\r\n</vdr-page-block>\r\n\r\n<form class=\"form\" [formGroup]=\"detailForm\">\r\n <vdr-page-detail-layout>\r\n <vdr-page-detail-sidebar>\r\n <vdr-card>\r\n <vdr-form-field [label]=\"'catalog.visibility' | translate\" for=\"visibility\">\r\n <clr-toggle-wrapper *vdrIfPermissions=\"updatePermissions\">\r\n <input\r\n type=\"checkbox\"\r\n clrToggle\r\n name=\"enabled\"\r\n [formControl]=\"detailForm.get(['enabled'])\"\r\n />\r\n <label>{{ 'common.enabled' | translate }}</label>\r\n </clr-toggle-wrapper>\r\n </vdr-form-field>\r\n </vdr-card>\r\n <ng-container *ngIf=\"!(isNew$ | async)\">\r\n <vdr-card *vdrIfMultichannel [title]=\"'common.channels' | translate\">\r\n <vdr-form-item *vdrIfDefaultChannelActive>\r\n <div class=\"flex channel-assignment\">\r\n <div class=\"mb-2\">\r\n <ng-container *ngFor=\"let channel of productChannels$ | async\">\r\n <vdr-chip\r\n *ngIf=\"!isDefaultChannel(channel.code)\"\r\n icon=\"times-circle\"\r\n (iconClick)=\"removeFromChannel(channel.id)\"\r\n >\r\n <vdr-channel-badge [channelCode]=\"channel.code\"></vdr-channel-badge>\r\n {{ channel.code | channelCodeToLabel }}\r\n </vdr-chip>\r\n </ng-container>\r\n </div>\r\n <button class=\"button-small\" (click)=\"assignToChannel()\">\r\n <clr-icon shape=\"layers\"></clr-icon>\r\n {{ 'catalog.assign-to-channel' | translate }}\r\n </button>\r\n </div>\r\n </vdr-form-item>\r\n </vdr-card>\r\n </ng-container>\r\n <vdr-card *ngIf=\"entity?.optionGroups.length\" [title]=\"'catalog.product-options' | translate\">\r\n <div class=\"options\">\r\n <vdr-chip\r\n *ngFor=\"let optionGroup of entity?.optionGroups | sort : 'id'\"\r\n [colorFrom]=\"optionGroup.code\"\r\n [invert]=\"true\"\r\n >\r\n {{ optionGroup.name }}\r\n </vdr-chip>\r\n </div>\r\n <div>\r\n <a [routerLink]=\"['options']\" class=\"button-small mt-2\" *vdrIfPermissions=\"updatePermissions\">\r\n <clr-icon shape=\"pencil\"></clr-icon>\r\n {{ 'catalog.edit-options' | translate }}\r\n </a>\r\n </div>\r\n </vdr-card>\r\n <vdr-card [title]=\"'catalog.facets' | translate\">\r\n <div class=\"facets\">\r\n <vdr-facet-value-chip\r\n *ngFor=\"let facetValue of facetValues$ | async\"\r\n [facetValue]=\"facetValue\"\r\n [removable]=\"updatePermissions | hasPermission\"\r\n (remove)=\"removeProductFacetValue(facetValue.id)\"\r\n ></vdr-facet-value-chip>\r\n </div>\r\n <div>\r\n <button\r\n class=\"button-small mt-2\"\r\n *vdrIfPermissions=\"updatePermissions\"\r\n (click)=\"selectProductFacetValue()\"\r\n >\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.add-facets' | translate }}\r\n </button>\r\n </div>\r\n </vdr-card>\r\n <vdr-card *ngIf=\"entity$ | async as entity\">\r\n <vdr-page-entity-info [entity]=\"entity\"></vdr-page-entity-info>\r\n </vdr-card>\r\n </vdr-page-detail-sidebar>\r\n\r\n <vdr-page-block>\r\n <button type=\"submit\" hidden x-data=\"prevents enter key from triggering other buttons\"></button>\r\n <vdr-card>\r\n <div class=\"form-grid\">\r\n <div>\r\n <vdr-form-field [label]=\"'catalog.product-name' | translate\" for=\"name\">\r\n <input\r\n id=\"name\"\r\n type=\"text\"\r\n formControlName=\"name\"\r\n [readonly]=\"!(updatePermissions | hasPermission)\"\r\n (input)=\"updateSlug($event.target.value)\"\r\n />\r\n </vdr-form-field>\r\n <div *ngIf=\"(isNew$ | async) === false && detailForm.get(['name'])?.dirty\">\r\n <clr-checkbox-wrapper>\r\n <input\r\n clrCheckbox\r\n type=\"checkbox\"\r\n id=\"auto-update\"\r\n formControlName=\"autoUpdateVariantNames\"\r\n />\r\n <label>{{ 'catalog.auto-update-product-variant-name' | translate }}</label>\r\n </clr-checkbox-wrapper>\r\n </div>\r\n </div>\r\n <vdr-form-field\r\n [label]=\"'catalog.slug' | translate\"\r\n for=\"slug\"\r\n [errors]=\"{ pattern: 'catalog.slug-pattern-error' | translate }\"\r\n >\r\n <input\r\n id=\"slug\"\r\n type=\"text\"\r\n formControlName=\"slug\"\r\n [readonly]=\"!(updatePermissions | hasPermission)\"\r\n />\r\n </vdr-form-field>\r\n <vdr-form-field\r\n class=\"form-grid-span\"\r\n [label]=\"'common.description' | translate\"\r\n for=\"slug\"\r\n [errors]=\"{ pattern: 'catalog.slug-pattern-error' | translate }\"\r\n >\r\n <vdr-rich-text-editor\r\n formControlName=\"description\"\r\n [readonly]=\"!(updatePermissions | hasPermission)\"\r\n ></vdr-rich-text-editor>\r\n </vdr-form-field>\r\n </div>\r\n </vdr-card>\r\n <vdr-card [title]=\"'common.custom-fields' | translate\" *ngIf=\"customFields.length\">\r\n <vdr-tabbed-custom-fields\r\n entityName=\"Product\"\r\n [customFields]=\"customFields\"\r\n [customFieldsFormGroup]=\"detailForm.get('customFields')\"\r\n [readonly]=\"!(updatePermissions | hasPermission)\"\r\n ></vdr-tabbed-custom-fields>\r\n </vdr-card>\r\n <vdr-custom-detail-component-host\r\n locationId=\"product-detail\"\r\n [entity$]=\"entity$\"\r\n [detailForm]=\"detailForm\"\r\n ></vdr-custom-detail-component-host>\r\n <vdr-card [title]=\"'catalog.assets' | translate\">\r\n <vdr-assets\r\n [assets]=\"assetChanges.assets || entity?.assets\"\r\n [featuredAsset]=\"assetChanges.featuredAsset || entity?.featuredAsset\"\r\n [updatePermissions]=\"updatePermissions\"\r\n (change)=\"assetChanges = $event\"\r\n ></vdr-assets>\r\n </vdr-card>\r\n\r\n <vdr-card [title]=\"'catalog.product-variants' | translate\" [paddingX]=\"isNew$ | async\">\r\n <div *ngIf=\"isNew$ | async; else variantList\">\r\n <vdr-generate-product-variants\r\n (variantsChange)=\"createVariantsConfig = $event\"\r\n ></vdr-generate-product-variants>\r\n </div>\r\n <ng-template #variantList>\r\n <vdr-product-variant-list\r\n [productId]=\"this.id\"\r\n dataTableId=\"product-detail-variants-list\"\r\n [hideLanguageSelect]=\"true\"\r\n ></vdr-product-variant-list>\r\n </ng-template>\r\n <div class=\"mx-3\" *ngIf=\"(isNew$ | async) === false\">\r\n <a class=\"button\" [routerLink]=\"['manage-variants']\">\r\n <clr-icon shape=\"add-text\"></clr-icon>\r\n {{ 'catalog.manage-variants' | translate }}</a\r\n >\r\n </div>\r\n </vdr-card>\r\n </vdr-page-block>\r\n </vdr-page-detail-layout>\r\n</form>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { FormBuilder, UntypedFormGroup, Validators } from '@angular/forms';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n Asset,\r\n CreateProductInput,\r\n createUpdatedTranslatable,\r\n DataService,\r\n findTranslation,\r\n getChannelCodeFromUserStatus,\r\n getCustomFieldsDefaults,\r\n GetProductDetailDocument,\r\n GetProductDetailQuery,\r\n GetProductWithVariantsQuery,\r\n LanguageCode,\r\n ModalService,\r\n NotificationService,\r\n Permission,\r\n PRODUCT_DETAIL_FRAGMENT,\r\n ProductDetailFragment,\r\n ProductVariantFragment,\r\n TypedBaseDetailComponent,\r\n unicodePatternValidator,\r\n UpdateProductInput,\r\n UpdateProductMutation,\r\n UpdateProductOptionInput,\r\n UpdateProductVariantInput,\r\n UpdateProductVariantsMutation,\r\n} from '@vendure/admin-ui/core';\r\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\r\nimport { DEFAULT_CHANNEL_CODE } from '@vendure/common/lib/shared-constants';\r\nimport { unique } from '@vendure/common/lib/unique';\r\nimport { gql } from 'apollo-angular';\r\nimport { combineLatest, concat, EMPTY, from, Observable, of } from 'rxjs';\r\nimport { distinctUntilChanged, map, mergeMap, shareReplay, switchMap, take } from 'rxjs/operators';\r\n\r\nimport { ProductDetailService } from '../../providers/product-detail/product-detail.service';\r\nimport { ApplyFacetDialogComponent } from '../apply-facet-dialog/apply-facet-dialog.component';\r\nimport { AssignProductsToChannelDialogComponent } from '../assign-products-to-channel-dialog/assign-products-to-channel-dialog.component';\r\nimport { CreateProductVariantsConfig } from '../generate-product-variants/generate-product-variants.component';\r\n\r\ninterface SelectedAssets {\r\n assets?: Asset[];\r\n featuredAsset?: Asset;\r\n}\r\n\r\nexport const GET_PRODUCT_DETAIL = gql`\r\n query GetProductDetail($id: ID!) {\r\n product(id: $id) {\r\n ...ProductDetail\r\n }\r\n }\r\n ${PRODUCT_DETAIL_FRAGMENT}\r\n`;\r\n\r\n@Component({\r\n selector: 'vdr-product-detail2',\r\n templateUrl: './product-detail.component.html',\r\n styleUrls: ['./product-detail.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ProductDetailComponent\r\n extends TypedBaseDetailComponent<typeof GetProductDetailDocument, 'product'>\r\n implements OnInit, OnDestroy\r\n{\r\n readonly customFields = this.getCustomFieldConfig('Product');\r\n detailForm = this.formBuilder.group({\r\n enabled: true,\r\n name: ['', Validators.required],\r\n autoUpdateVariantNames: true,\r\n slug: ['', unicodePatternValidator(/^[\\p{Letter}0-9._-]+$/)],\r\n description: '',\r\n facetValueIds: [[] as string[]],\r\n customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),\r\n });\r\n assetChanges: SelectedAssets = {};\r\n productChannels$: Observable<ProductDetailFragment['channels']>;\r\n facetValues$: Observable<ProductDetailFragment['facetValues']>;\r\n createVariantsConfig: CreateProductVariantsConfig = { groups: [], variants: [], stockLocationId: '' };\r\n public readonly updatePermissions = [Permission.UpdateCatalog, Permission.UpdateProduct];\r\n\r\n constructor(\r\n private productDetailService: ProductDetailService,\r\n private formBuilder: FormBuilder,\r\n private modalService: ModalService,\r\n private notificationService: NotificationService,\r\n protected dataService: DataService,\r\n private changeDetector: ChangeDetectorRef,\r\n ) {\r\n super();\r\n }\r\n\r\n ngOnInit() {\r\n this.init();\r\n\r\n const productFacetValues$ = this.isNew$.pipe(\r\n switchMap(isNew => {\r\n return isNew ? of([]) : this.entity$.pipe(map(product => product.facetValues));\r\n }),\r\n );\r\n const productGroup = this.detailForm;\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n const formFacetValueIdChanges$ = productGroup.get('facetValueIds')!.valueChanges.pipe(\r\n distinctUntilChanged(),\r\n switchMap(ids =>\r\n this.dataService.facet\r\n .getFacetValues({ filter: { id: { in: ids } } })\r\n .mapSingle(({ facetValues }) => facetValues.items),\r\n ),\r\n shareReplay(1),\r\n );\r\n this.facetValues$ = concat(\r\n productFacetValues$.pipe(take(1)),\r\n productFacetValues$.pipe(switchMap(() => formFacetValueIdChanges$)),\r\n );\r\n this.productChannels$ = this.entity$.pipe(map(p => p.channels));\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy();\r\n }\r\n\r\n isDefaultChannel(channelCode: string): boolean {\r\n return channelCode === DEFAULT_CHANNEL_CODE;\r\n }\r\n\r\n assignToChannel() {\r\n this.productChannels$\r\n .pipe(\r\n take(1),\r\n switchMap(channels =>\r\n this.modalService.fromComponent(AssignProductsToChannelDialogComponent, {\r\n size: 'lg',\r\n locals: {\r\n productIds: [this.id],\r\n currentChannelIds: channels.map(c => c.id),\r\n },\r\n }),\r\n ),\r\n )\r\n .subscribe();\r\n }\r\n\r\n removeFromChannel(channelId: string) {\r\n from(getChannelCodeFromUserStatus(this.dataService, channelId))\r\n .pipe(\r\n switchMap(({ channelCode }) =>\r\n this.modalService.dialog({\r\n title: _('catalog.remove-product-from-channel'),\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n {\r\n type: 'danger',\r\n label: _('catalog.remove-from-channel'),\r\n translationVars: { channelCode },\r\n returnValue: true,\r\n },\r\n ],\r\n }),\r\n ),\r\n switchMap(response =>\r\n response\r\n ? this.dataService.product.removeProductsFromChannel({\r\n channelId,\r\n productIds: [this.id],\r\n })\r\n : EMPTY,\r\n ),\r\n )\r\n .subscribe(\r\n () => {\r\n this.notificationService.success(_('catalog.notify-remove-product-from-channel-success'));\r\n },\r\n err => {\r\n this.notificationService.error(_('catalog.notify-remove-product-from-channel-error'));\r\n },\r\n );\r\n }\r\n\r\n assignVariantToChannel(variant: ProductVariantFragment) {\r\n return this.modalService\r\n .fromComponent(AssignProductsToChannelDialogComponent, {\r\n size: 'lg',\r\n locals: {\r\n productIds: [this.id],\r\n productVariantIds: [variant.id],\r\n currentChannelIds: variant.channels.map(c => c.id),\r\n },\r\n })\r\n .subscribe();\r\n }\r\n\r\n removeVariantFromChannel({ channelId, variant }: { channelId: string; variant: ProductVariantFragment }) {\r\n from(getChannelCodeFromUserStatus(this.dataService, channelId))\r\n .pipe(\r\n switchMap(({ channelCode }) =>\r\n this.modalService.dialog({\r\n title: _('catalog.remove-product-variant-from-channel'),\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n {\r\n type: 'danger',\r\n label: _('catalog.remove-from-channel'),\r\n translationVars: { channelCode },\r\n returnValue: true,\r\n },\r\n ],\r\n }),\r\n ),\r\n switchMap(response =>\r\n response\r\n ? this.dataService.product.removeVariantsFromChannel({\r\n channelId,\r\n productVariantIds: [variant.id],\r\n })\r\n : EMPTY,\r\n ),\r\n )\r\n .subscribe(\r\n () => {\r\n this.notificationService.success(_('catalog.notify-remove-variant-from-channel-success'));\r\n },\r\n err => {\r\n this.notificationService.error(_('catalog.notify-remove-variant-from-channel-error'));\r\n },\r\n );\r\n }\r\n\r\n assetsChanged(): boolean {\r\n return !!Object.values(this.assetChanges).length;\r\n }\r\n\r\n /**\r\n * If creating a new product, automatically generate the slug based on the product name.\r\n */\r\n updateSlug(nameValue: string) {\r\n const slugControl = this.detailForm.get('slug');\r\n const currentTranslation = this.entity ? findTranslation(this.entity, this.languageCode) : undefined;\r\n const currentSlugIsEmpty = !currentTranslation || !currentTranslation.slug;\r\n if (slugControl && slugControl.pristine && currentSlugIsEmpty) {\r\n slugControl.setValue(normalizeString(`${nameValue}`, '-'));\r\n }\r\n }\r\n\r\n selectProductFacetValue() {\r\n this.displayFacetValueModal().subscribe(facetValueIds => {\r\n if (facetValueIds) {\r\n const productGroup = this.detailForm;\r\n const currentFacetValueIds = productGroup.value.facetValueIds ?? [];\r\n productGroup.patchValue({\r\n facetValueIds: unique([...currentFacetValueIds, ...facetValueIds]),\r\n });\r\n productGroup.markAsDirty();\r\n this.changeDetector.markForCheck();\r\n }\r\n });\r\n }\r\n\r\n updateProductOption(input: UpdateProductOptionInput & { autoUpdate: boolean }) {\r\n combineLatest(this.entity$, this.languageCode$)\r\n .pipe(\r\n take(1),\r\n mergeMap(([product, languageCode]) =>\r\n this.productDetailService.updateProductOption(input, product, languageCode),\r\n ),\r\n )\r\n .subscribe(\r\n () => {\r\n this.notificationService.success(_('common.notify-update-success'), {\r\n entity: 'ProductOption',\r\n });\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-update-error'), {\r\n entity: 'ProductOption',\r\n });\r\n },\r\n );\r\n }\r\n\r\n removeProductFacetValue(facetValueId: string) {\r\n const productGroup = this.detailForm;\r\n const currentFacetValueIds = productGroup.value.facetValueIds ?? [];\r\n productGroup.patchValue({\r\n facetValueIds: currentFacetValueIds.filter(id => id !== facetValueId),\r\n });\r\n productGroup.markAsDirty();\r\n }\r\n\r\n private displayFacetValueModal(): Observable<string[] | undefined> {\r\n return this.modalService\r\n .fromComponent(ApplyFacetDialogComponent, {\r\n size: 'md',\r\n closable: true,\r\n })\r\n .pipe(map(facetValues => facetValues && facetValues.map(v => v.id)));\r\n }\r\n\r\n create() {\r\n const productGroup = this.detailForm;\r\n if (!productGroup.dirty) {\r\n return;\r\n }\r\n\r\n const newProduct = this.getUpdatedProduct(\r\n {\r\n id: '',\r\n createdAt: '',\r\n updatedAt: '',\r\n enabled: true,\r\n languageCode: this.languageCode,\r\n name: '',\r\n slug: '',\r\n featuredAsset: null,\r\n assets: [],\r\n description: '',\r\n translations: [],\r\n optionGroups: [],\r\n facetValues: [],\r\n channels: [],\r\n },\r\n productGroup as UntypedFormGroup,\r\n this.languageCode,\r\n ) as CreateProductInput;\r\n this.productDetailService\r\n .createProductWithVariants(newProduct, this.createVariantsConfig, this.languageCode)\r\n .subscribe(\r\n ({ createProductVariants, productId }) => {\r\n this.notificationService.success(_('common.notify-create-success'), {\r\n entity: 'Product',\r\n });\r\n this.assetChanges = {};\r\n this.detailForm.markAsPristine();\r\n this.router.navigate(['../', productId], { relativeTo: this.route });\r\n },\r\n err => {\r\n // eslint-disable-next-line no-console\r\n console.error(err);\r\n this.notificationService.error(_('common.notify-create-error'), {\r\n entity: 'Product',\r\n });\r\n },\r\n );\r\n }\r\n\r\n save() {\r\n combineLatest(this.entity$, this.languageCode$)\r\n .pipe(\r\n take(1),\r\n mergeMap(([product, languageCode]) => {\r\n const productGroup = this.detailForm;\r\n let productInput: UpdateProductInput | undefined;\r\n let variantsInput: UpdateProductVariantInput[] | undefined;\r\n\r\n if (productGroup.dirty || this.assetsChanged()) {\r\n productInput = this.getUpdatedProduct(\r\n product,\r\n productGroup as UntypedFormGroup,\r\n languageCode,\r\n ) as UpdateProductInput;\r\n }\r\n\r\n return this.productDetailService.updateProduct({\r\n product,\r\n languageCode,\r\n autoUpdate: this.detailForm.get(['autoUpdateVariantNames'])?.value ?? false,\r\n productInput,\r\n variantsInput,\r\n });\r\n }),\r\n )\r\n .subscribe(\r\n result => {\r\n this.updateSlugAfterSave(result);\r\n this.detailForm.markAsPristine();\r\n this.assetChanges = {};\r\n this.notificationService.success(_('common.notify-update-success'), {\r\n entity: 'Product',\r\n });\r\n this.changeDetector.markForCheck();\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-update-error'), {\r\n entity: 'Product',\r\n });\r\n },\r\n );\r\n }\r\n\r\n canDeactivate(): boolean {\r\n return super.canDeactivate() && !this.assetChanges.assets && !this.assetChanges.featuredAsset;\r\n }\r\n\r\n /**\r\n * Sets the values of the form on changes to the product or current language.\r\n */\r\n protected setFormValues(\r\n product: NonNullable<GetProductWithVariantsQuery['product']>,\r\n languageCode: LanguageCode,\r\n ) {\r\n const currentTranslation = findTranslation(product, languageCode);\r\n this.detailForm.patchValue({\r\n enabled: product.enabled,\r\n name: currentTranslation ? currentTranslation.name : '',\r\n slug: currentTranslation ? currentTranslation.slug : '',\r\n description: currentTranslation ? currentTranslation.description : '',\r\n facetValueIds: product.facetValues.map(fv => fv.id),\r\n });\r\n\r\n if (this.customFields.length) {\r\n this.setCustomFieldFormValues(\r\n this.customFields,\r\n this.detailForm.get(['customFields']),\r\n product,\r\n currentTranslation,\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Given a product and the value of the detailForm, this method creates an updated copy of the product which\r\n * can then be persisted to the API.\r\n */\r\n private getUpdatedProduct(\r\n product: NonNullable<GetProductDetailQuery['product']>,\r\n productFormGroup: UntypedFormGroup,\r\n languageCode: LanguageCode,\r\n ): UpdateProductInput | CreateProductInput {\r\n const updatedProduct = createUpdatedTranslatable({\r\n translatable: product,\r\n updatedFields: productFormGroup.value,\r\n customFieldConfig: this.customFields,\r\n languageCode,\r\n defaultTranslation: {\r\n languageCode,\r\n name: product.name || '',\r\n slug: product.slug || '',\r\n description: product.description || '',\r\n },\r\n });\r\n return {\r\n ...updatedProduct,\r\n assetIds: this.assetChanges.assets?.map(a => a.id),\r\n featuredAssetId: this.assetChanges.featuredAsset?.id,\r\n facetValueIds: productFormGroup.value.facetValueIds,\r\n } as UpdateProductInput | CreateProductInput;\r\n }\r\n\r\n /**\r\n * The server may alter the slug value in order to normalize and ensure uniqueness upon saving.\r\n */\r\n private updateSlugAfterSave(results: Array<UpdateProductMutation | UpdateProductVariantsMutation>) {\r\n const firstResult = results[0];\r\n const slugControl = this.detailForm.get(['product', 'slug']);\r\n\r\n function isUpdateMutation(input: any): input is UpdateProductMutation {\r\n return input.hasOwnProperty('updateProduct');\r\n }\r\n\r\n if (slugControl && isUpdateMutation(firstResult)) {\r\n slugControl.setValue(firstResult.updateProduct.slug, { emitEvent: false });\r\n }\r\n }\r\n}\r\n","import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n BulkAction,\r\n createBulkRemoveFromChannelAction,\r\n DataService,\r\n DeletionResult,\r\n GetProductListQuery,\r\n isMultiChannel,\r\n ItemOf,\r\n ModalService,\r\n NotificationService,\r\n Permission,\r\n} from '@vendure/admin-ui/core';\r\nimport { unique } from '@vendure/common/lib/unique';\r\nimport { EMPTY } from 'rxjs';\r\nimport { map, switchMap } from 'rxjs/operators';\r\n\r\nimport { AssignProductsToChannelDialogComponent } from '../assign-products-to-channel-dialog/assign-products-to-channel-dialog.component';\r\nimport { BulkAddFacetValuesDialogComponent } from '../bulk-add-facet-values-dialog/bulk-add-facet-values-dialog.component';\r\n\r\nimport { ProductListComponent } from './product-list.component';\r\n\r\nexport const deleteProductsBulkAction: BulkAction<\r\n ItemOf<GetProductListQuery, 'products'>,\r\n ProductListComponent\r\n> = {\r\n location: 'product-list',\r\n label: _('common.delete'),\r\n icon: 'trash',\r\n iconClass: 'is-danger',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.DeleteProduct) ||\r\n userPermissions.includes(Permission.DeleteCatalog),\r\n onClick: ({ injector, selection, hostComponent, clearSelection }) => {\r\n const modalService = injector.get(ModalService);\r\n const dataService = injector.get(DataService);\r\n const notificationService = injector.get(NotificationService);\r\n modalService\r\n .dialog({\r\n title: _('catalog.confirm-bulk-delete-products'),\r\n translationVars: {\r\n count: selection.length,\r\n },\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n { type: 'danger', label: _('common.delete'), returnValue: true },\r\n ],\r\n })\r\n .pipe(\r\n switchMap(response =>\r\n response ? dataService.product.deleteProducts(unique(selection.map(p => p.id))) : EMPTY,\r\n ),\r\n )\r\n .subscribe(result => {\r\n let deleted = 0;\r\n const errors: string[] = [];\r\n for (const item of result.deleteProducts) {\r\n if (item.result === DeletionResult.DELETED) {\r\n deleted++;\r\n } else if (item.message) {\r\n errors.push(item.message);\r\n }\r\n }\r\n if (0 < deleted) {\r\n notificationService.success(_('catalog.notify-bulk-delete-products-success'), {\r\n count: deleted,\r\n });\r\n }\r\n if (0 < errors.length) {\r\n notificationService.error(errors.join('\\n'));\r\n }\r\n hostComponent.refresh();\r\n clearSelection();\r\n });\r\n },\r\n};\r\n\r\nexport const assignProductsToChannelBulkAction: BulkAction<\r\n ItemOf<GetProductListQuery, 'products'>,\r\n ProductListComponent\r\n> = {\r\n location: 'product-list',\r\n label: _('catalog.assign-to-channel'),\r\n icon: 'layers',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.UpdateCatalog) ||\r\n userPermissions.includes(Permission.UpdateProduct),\r\n isVisible: ({ injector }) => isMultiChannel(injector.get(DataService)),\r\n onClick: ({ injector, selection, clearSelection }) => {\r\n const modalService = injector.get(ModalService);\r\n modalService\r\n .fromComponent(AssignProductsToChannelDialogComponent, {\r\n size: 'lg',\r\n locals: {\r\n productIds: unique(selection.map(p => p.id)),\r\n currentChannelIds: [],\r\n },\r\n })\r\n .subscribe(result => {\r\n if (result) {\r\n clearSelection();\r\n }\r\n });\r\n },\r\n};\r\n\r\nexport const removeProductsFromChannelBulkAction = createBulkRemoveFromChannelAction<\r\n ItemOf<GetProductListQuery, 'products'>\r\n>({\r\n location: 'product-list',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.UpdateCatalog) ||\r\n userPermissions.includes(Permission.UpdateProduct),\r\n getItemName: item => item.name,\r\n bulkRemoveFromChannel: (dataService, productIds, channelId) =>\r\n dataService.product\r\n .removeProductsFromChannel({\r\n channelId: channelId,\r\n productIds,\r\n })\r\n .pipe(map(res => res.removeProductsFromChannel)),\r\n});\r\n\r\nexport const assignFacetValuesToProductsBulkAction: BulkAction<\r\n ItemOf<GetProductListQuery, 'products'>,\r\n ProductListComponent\r\n> = {\r\n location: 'product-list',\r\n label: _('catalog.edit-facet-values'),\r\n icon: 'tag',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.UpdateCatalog) ||\r\n userPermissions.includes(Permission.UpdateProduct),\r\n onClick: ({ injector, selection, hostComponent, clearSelection }) => {\r\n const modalService = injector.get(ModalService);\r\n const dataService = injector.get(DataService);\r\n const notificationService = injector.get(NotificationService);\r\n const mode = 'product';\r\n const ids = unique(selection.map(p => p.id));\r\n return modalService\r\n .fromComponent(BulkAddFacetValuesDialogComponent, {\r\n size: 'xl',\r\n locals: {\r\n mode,\r\n ids,\r\n },\r\n })\r\n .subscribe(result => {\r\n if (result) {\r\n notificationService.success(_('common.notify-bulk-update-success'), {\r\n count: selection.length,\r\n entity: mode === 'product' ? 'Products' : 'ProductVariants',\r\n });\r\n clearSelection();\r\n }\r\n });\r\n },\r\n};\r\n","<vdr-page-block>\r\n <vdr-action-bar>\r\n <vdr-ab-left>\r\n <vdr-language-selector\r\n [availableLanguageCodes]=\"availableLanguages$ | async\"\r\n [currentLanguageCode]=\"contentLanguage$ | async\"\r\n (languageCodeChange)=\"setLanguage($event)\"\r\n ></vdr-language-selector>\r\n </vdr-ab-left>\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"product-list\"></vdr-action-bar-items>\r\n <a\r\n class=\"button primary mr-1\"\r\n [routerLink]=\"['./create']\"\r\n *vdrIfPermissions=\"['CreateCatalog', 'CreateProduct']\"\r\n >\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.create-new-product' | translate }}\r\n </a>\r\n <vdr-dropdown>\r\n <button class=\"icon-button\" vdrDropdownTrigger>\r\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu vdrPosition=\"bottom-right\">\r\n <button type=\"button\" vdrDropdownItem (click)=\"rebuildSearchIndex()\">\r\n <clr-icon shape=\"refresh\" class=\"\"></clr-icon>\r\n {{ 'catalog.rebuild-search-index' | translate }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </vdr-ab-right>\r\n </vdr-action-bar>\r\n</vdr-page-block>\r\n<vdr-data-table-2\r\n class=\"mt-2\"\r\n id=\"product-list\"\r\n [items]=\"items$ | async\"\r\n [itemsPerPage]=\"itemsPerPage$ | async\"\r\n [totalItems]=\"totalItems$ | async\"\r\n [currentPage]=\"currentPage$ | async\"\r\n [filters]=\"filters\"\r\n (pageChange)=\"setPageNumber($event)\"\r\n (itemsPerPageChange)=\"setItemsPerPage($event)\"\r\n>\r\n <vdr-bulk-action-menu\r\n locationId=\"product-list\"\r\n [hostComponent]=\"this\"\r\n [selectionManager]=\"selectionManager\"\r\n ></vdr-bulk-action-menu>\r\n <vdr-dt2-search\r\n [searchTermControl]=\"searchTermControl\"\r\n [searchTermPlaceholder]=\"'catalog.filter-by-name' | translate\"\r\n />\r\n <vdr-dt2-column [heading]=\"'common.id' | translate\" id=\"id\" [hiddenByDefault]=\"true\" [sort]=\"sorts.get('id')\">\r\n <ng-template let-product=\"item\">\r\n {{ product.id }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column\r\n [heading]=\"'common.created-at' | translate\" id=\"created-at\"\r\n [hiddenByDefault]=\"true\"\r\n [sort]=\"sorts.get('createdAt')\"\r\n >\r\n <ng-template let-product=\"item\">\r\n {{ product.createdAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column\r\n [heading]=\"'common.updated-at' | translate\" id=\"updated-at\"\r\n [hiddenByDefault]=\"true\"\r\n [sort]=\"sorts.get('updatedAt')\"\r\n >\r\n <ng-template let-product=\"item\">\r\n {{ product.updatedAt | localeDate : 'short' }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.image' | translate\" id=\"image\">\r\n <ng-template let-product=\"item\">\r\n <div class=\"image-placeholder\">\r\n <img\r\n *ngIf=\"product.featuredAsset as asset; else imagePlaceholder\"\r\n [src]=\"asset | assetPreview : 'tiny'\"\r\n />\r\n <ng-template #imagePlaceholder>\r\n <div class=\"placeholder\">\r\n <clr-icon shape=\"image\" size=\"48\"></clr-icon>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'catalog.name' | translate\" id=\"name\" [optional]=\"false\" [sort]=\"sorts.get('name')\">\r\n <ng-template let-product=\"item\">\r\n <a class=\"button-ghost\" [routerLink]=\"['./', product.id]\"\r\n ><span>{{ product.name }}</span\r\n ><clr-icon shape=\"arrow right\"\r\n /></a>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.slug' | translate\" id=\"slug\" [sort]=\"sorts.get('slug')\">\r\n <ng-template let-product=\"item\">\r\n {{ product.slug }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'common.enabled' | translate\" id=\"enabled\">\r\n <ng-template let-product=\"item\">\r\n <vdr-chip *ngIf=\"product.enabled\" colorType=\"success\">{{\r\n 'common.enabled' | translate\r\n }}</vdr-chip>\r\n <vdr-chip *ngIf=\"!product.enabled\" colorType=\"warning\">{{\r\n 'common.disabled' | translate\r\n }}</vdr-chip>\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-column [heading]=\"'catalog.number-of-variants' | translate\" id=\"number-of-variants\">\r\n <ng-template let-product=\"item\">\r\n {{ 'catalog.variant-count' | translate : { count: product.variantList?.totalItems } }}\r\n </ng-template>\r\n </vdr-dt2-column>\r\n <vdr-dt2-custom-field-column\r\n *ngFor=\"let customField of customFields\"\r\n [customField]=\"customField\"\r\n [sorts]=\"sorts\"\r\n />\r\n</vdr-data-table-2>\r\n","import { Component, OnInit } from '@angular/core';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n DataService,\r\n FacetValueFormInputComponent,\r\n JobQueueService,\r\n JobState,\r\n ModalService,\r\n NotificationService,\r\n ProductListQueryDocument,\r\n TypedBaseListComponent,\r\n} from '@vendure/admin-ui/core';\r\nimport { EMPTY, lastValueFrom } from 'rxjs';\r\nimport { delay, switchMap } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'vdr-products-list',\r\n templateUrl: './product-list.component.html',\r\n styleUrls: ['./product-list.component.scss'],\r\n})\r\nexport class ProductListComponent\r\n extends TypedBaseListComponent<typeof ProductListQueryDocument, 'products'>\r\n implements OnInit\r\n{\r\n pendingSearchIndexUpdates = 0;\r\n readonly customFields = this.getCustomFieldConfig('Product');\r\n readonly filters = this.createFilterCollection()\r\n .addIdFilter()\r\n .addDateFilters()\r\n .addFilters([\r\n {\r\n name: 'enabled',\r\n type: { kind: 'boolean' },\r\n label: _('common.enabled'),\r\n filterField: 'enabled',\r\n },\r\n {\r\n name: 'slug',\r\n type: { kind: 'text' },\r\n label: _('common.slug'),\r\n filterField: 'slug',\r\n },\r\n ])\r\n .addFilter({\r\n name: 'facetValues',\r\n type: {\r\n kind: 'custom',\r\n component: FacetValueFormInputComponent,\r\n serializeValue: value => value.map(v => v.id).join(','),\r\n deserializeValue: value => value.split(',').map(id => ({ id })),\r\n getLabel: value => {\r\n if (value.length === 0) {\r\n return '';\r\n }\r\n if (value[0].name) {\r\n return value.map(v => v.name).join(', ');\r\n } else {\r\n return lastValueFrom(\r\n this.dataService.facet\r\n .getFacetValues({ filter: { id: { in: value.map(v => v.id) } } })\r\n .mapSingle(({ facetValues }) =>\r\n facetValues.items.map(fv => fv.name).join(', '),\r\n ),\r\n );\r\n }\r\n },\r\n },\r\n label: _('catalog.facet-values'),\r\n toFilterInput: (value: any[]) => ({\r\n facetValueId: {\r\n in: value.map(v => v.id),\r\n },\r\n }),\r\n })\r\n .addCustomFieldFilters(this.customFields)\r\n .connectToRoute(this.route);\r\n\r\n readonly sorts = this.createSortCollection()\r\n .defaultSort('createdAt', 'DESC')\r\n .addSorts([\r\n { name: 'id' },\r\n { name: 'createdAt' },\r\n { name: 'updatedAt' },\r\n { name: 'name' },\r\n { name: 'slug' },\r\n ])\r\n .addCustomFieldSorts(this.customFields)\r\n .connectToRoute(this.route);\r\n\r\n constructor(\r\n protected dataService: DataService,\r\n private modalService: ModalService,\r\n private notificationService: NotificationService,\r\n private jobQueueService: JobQueueService,\r\n ) {\r\n super();\r\n this.configure({\r\n document: ProductListQueryDocument,\r\n getItems: data => data.products,\r\n setVariables: (skip, take) => ({\r\n options: {\r\n skip,\r\n take,\r\n filter: {\r\n name: {\r\n contains: this.searchTermControl.value,\r\n },\r\n ...this.filters.createFilterInput(),\r\n },\r\n sort: this.sorts.createSortInput(),\r\n },\r\n }),\r\n refreshListOnChanges: [this.sorts.valueChanges, this.filters.valueChanges],\r\n });\r\n }\r\n\r\n rebuildSearchIndex() {\r\n this.dataService.product.reindex().subscribe(({ reindex }) => {\r\n this.notificationService.info(_('catalog.reindexing'));\r\n this.jobQueueService.addJob(reindex.id, job => {\r\n if (job.state === JobState.COMPLETED) {\r\n const time = new Intl.NumberFormat().format(job.duration || 0);\r\n this.notificationService.success(_('catalog.reindex-successful'), {\r\n count: job.result.indexedItemCount,\r\n time,\r\n });\r\n this.refresh();\r\n } else {\r\n this.notificationService.error(_('catalog.reindex-error'));\r\n }\r\n });\r\n });\r\n }\r\n\r\n deleteProduct(productId: string) {\r\n this.modalService\r\n .dialog({\r\n title: _('catalog.confirm-delete-product'),\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n { type: 'danger', label: _('common.delete'), returnValue: true },\r\n ],\r\n })\r\n .pipe(\r\n switchMap(response => (response ? this.dataService.product.deleteProduct(productId) : EMPTY)),\r\n // Short delay to allow the product to be removed from the search index before\r\n // refreshing.\r\n delay(500),\r\n )\r\n .subscribe(\r\n () => {\r\n this.notificationService.success(_('common.notify-delete-success'), {\r\n entity: 'Product',\r\n });\r\n this.refresh();\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-delete-error'), {\r\n entity: 'Product',\r\n });\r\n },\r\n );\r\n }\r\n}\r\n","<label class=\"clr-control-label\">{{ 'catalog.taxes' | translate }}</label>\r\n<div *ngIf=\"priceIncludesTax\" class=\"value\">\r\n {{ 'catalog.price-includes-tax-at' | translate: { rate: taxRate$ | async } }}\r\n</div>\r\n<div *ngIf=\"!priceIncludesTax\" class=\"value\">\r\n {{\r\n 'catalog.price-with-tax-in-default-zone'\r\n | translate: { price: grossPrice$ | async | localeCurrency: currencyCode, rate: taxRate$ | async }\r\n }}\r\n</div>\r\n","import { ChangeDetectionStrategy, Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core';\r\nimport { DataService } from '@vendure/admin-ui/core';\r\nimport { BehaviorSubject, combineLatest, Observable, Subject } from 'rxjs';\r\nimport { map } from 'rxjs/operators';\r\n\r\n@Component({\r\n selector: 'vdr-variant-price-detail',\r\n templateUrl: './variant-price-detail.component.html',\r\n styleUrls: ['./variant-price-detail.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class VariantPriceDetailComponent implements OnInit, OnChanges {\r\n @Input() priceIncludesTax: boolean;\r\n @Input() price: number;\r\n @Input() currencyCode: string;\r\n @Input() taxCategoryId: string;\r\n\r\n grossPrice$: Observable<number>;\r\n taxRate$: Observable<number>;\r\n\r\n private priceChange$ = new BehaviorSubject<number>(0);\r\n private taxCategoryIdChange$ = new BehaviorSubject<string>('');\r\n\r\n constructor(private dataService: DataService) {}\r\n\r\n ngOnInit() {\r\n const taxRates$ = this.dataService.settings\r\n .getTaxRatesSimple(999, 0, 'cache-first')\r\n .mapStream(data => data.taxRates.items);\r\n const activeChannel$ = this.dataService.settings\r\n .getActiveChannel('cache-first')\r\n .refetchOnChannelChange()\r\n .mapStream(data => data.activeChannel);\r\n\r\n this.taxRate$ = combineLatest(activeChannel$, taxRates$, this.taxCategoryIdChange$).pipe(\r\n map(([channel, taxRates, taxCategoryId]) => {\r\n const defaultTaxZone = channel.defaultTaxZone;\r\n if (!defaultTaxZone) {\r\n return 0;\r\n }\r\n const applicableRate = taxRates.find(\r\n taxRate => taxRate.zone.id === defaultTaxZone.id && taxRate.category.id === taxCategoryId,\r\n );\r\n\r\n if (!applicableRate) {\r\n return 0;\r\n }\r\n return applicableRate.value;\r\n }),\r\n );\r\n\r\n this.grossPrice$ = combineLatest(this.taxRate$, this.priceChange$).pipe(\r\n map(([taxRate, price]) => Math.round(price * ((100 + taxRate) / 100))),\r\n );\r\n }\r\n\r\n ngOnChanges(changes: SimpleChanges): void {\r\n if ('price' in changes) {\r\n this.priceChange$.next(changes.price.currentValue);\r\n }\r\n if ('taxCategoryId' in changes) {\r\n this.taxCategoryIdChange$.next(changes.taxCategoryId.currentValue);\r\n }\r\n }\r\n}\r\n","<ng-select\r\n *ngIf=\"(variants$ | async)?.length > 1\"\r\n [items]=\"variants$ | async\"\r\n appendTo=\"body\"\r\n bindValue=\"id\"\r\n [(ngModel)]=\"selectedVariantId\"\r\n [searchFn]=\"searchFn\"\r\n [clearable]=\"false\"\r\n [placeholder]=\"'catalog.quick-jump-placeholder' | translate\"\r\n (change)=\"onSelect($event)\"\r\n>\r\n <ng-template ng-option-tmp let-item=\"item\" let-index=\"index\" let-search=\"searchTerm\">\r\n {{ item.name }} ({{ item.sku }})\r\n </ng-template>\r\n</ng-select>\r\n","import { ChangeDetectionStrategy, Component, Input, OnInit } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport {\r\n DataService,\r\n GetProductVariantsQuickJumpDocument,\r\n GetProductVariantsQuickJumpQuery,\r\n} from '@vendure/admin-ui/core';\r\nimport { gql } from 'apollo-angular';\r\nimport { Observable } from 'rxjs';\r\n\r\nconst GET_PRODUCT_VARIANTS_QUICK_JUMP = gql`\r\n query GetProductVariantsQuickJump($id: ID!) {\r\n product(id: $id) {\r\n id\r\n variants {\r\n id\r\n name\r\n sku\r\n }\r\n }\r\n }\r\n`;\r\n\r\n@Component({\r\n selector: 'vdr-product-variant-quick-jump',\r\n templateUrl: './product-variant-quick-jump.component.html',\r\n styleUrls: ['./product-variant-quick-jump.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ProductVariantQuickJumpComponent implements OnInit {\r\n @Input() productId: string;\r\n selectedVariantId: string | undefined;\r\n variants$: Observable<NonNullable<GetProductVariantsQuickJumpQuery['product']>['variants']>;\r\n constructor(private dataService: DataService, private router: Router) {}\r\n\r\n ngOnInit() {\r\n this.variants$ = this.dataService\r\n .query(GetProductVariantsQuickJumpDocument, {\r\n id: this.productId,\r\n })\r\n .mapSingle(data => data.product?.variants ?? []);\r\n }\r\n\r\n searchFn = (\r\n term: string,\r\n item: NonNullable<GetProductVariantsQuickJumpQuery['product']>['variants'][number],\r\n ) =>\r\n item.name.toLowerCase().includes(term.toLowerCase()) ||\r\n item.sku.toLowerCase().includes(term.toLowerCase());\r\n\r\n onSelect(item?: NonNullable<GetProductVariantsQuickJumpQuery['product']>['variants'][number]) {\r\n if (item) {\r\n this.router\r\n .navigate(['catalog', 'products', this.productId, 'variants', item.id])\r\n .then(() => (this.selectedVariantId = undefined));\r\n }\r\n }\r\n}\r\n","<vdr-page-block>\r\n <vdr-action-bar>\r\n <vdr-ab-left [grow]=\"true\">\r\n <div class=\"flex center\">\r\n <ng-container *ngIf=\"availableLanguages$ | async as availableLanguages\">\r\n <vdr-language-selector\r\n *ngIf=\"availableLanguages.length > 1\"\r\n class=\"mr-2\"\r\n [disabled]=\"isNew$ | async\"\r\n [availableLanguageCodes]=\"availableLanguages\"\r\n [currentLanguageCode]=\"languageCode$ | async\"\r\n (languageCodeChange)=\"setLanguage($event)\"\r\n ></vdr-language-selector>\r\n </ng-container>\r\n <vdr-product-variant-quick-jump [productId]=\"entity?.product.id\" />\r\n </div>\r\n </vdr-ab-left>\r\n\r\n <vdr-ab-right>\r\n <vdr-action-bar-items locationId=\"product-variant-detail\"></vdr-action-bar-items>\r\n <button\r\n *vdrIfPermissions=\"['UpdateCatalog', 'UpdateProduct']\"\r\n class=\"btn btn-primary\"\r\n (click)=\"save()\"\r\n [disabled]=\"\r\n (detailForm.invalid ||\r\n stockLevelsForm.invalid ||\r\n pricesForm.invalid ||\r\n (detailForm.pristine && stockLevelsForm.pristine && pricesForm.pristine)) &&\r\n !assetsChanged()\r\n \"\r\n >\r\n {{ 'common.update' | translate }}\r\n </button>\r\n </vdr-ab-right>\r\n </vdr-action-bar>\r\n</vdr-page-block>\r\n<form class=\"form\" [formGroup]=\"detailForm\" *ngIf=\"entity$ | async as variant\">\r\n <vdr-page-detail-layout>\r\n <vdr-page-detail-sidebar\r\n ><vdr-card>\r\n <vdr-form-field [label]=\"'catalog.visibility' | translate\" for=\"visibility\">\r\n <clr-toggle-wrapper *vdrIfPermissions=\"['UpdateCatalog', 'UpdateProduct']\">\r\n <input\r\n type=\"checkbox\"\r\n clrToggle\r\n name=\"enabled\"\r\n [formControl]=\"detailForm.get(['enabled'])\"\r\n />\r\n <label>{{ 'common.enabled' | translate }}</label>\r\n </clr-toggle-wrapper>\r\n </vdr-form-field>\r\n </vdr-card>\r\n <vdr-card *ngIf=\"variant.options.length\" [title]=\"'catalog.product-options' | translate\">\r\n <div class=\"options\">\r\n <vdr-chip\r\n *ngFor=\"let option of variant.options | sort : 'groupId'\"\r\n [colorFrom]=\"optionGroupCode(option.groupId)\"\r\n [invert]=\"true\"\r\n >\r\n <span>{{ optionGroupCode(option.groupId) }}:</span>\r\n {{ optionName(option) }}\r\n </vdr-chip>\r\n </div>\r\n <div>\r\n <a\r\n [routerLink]=\"['../../', 'options']\"\r\n class=\"button-small mt-2\"\r\n *vdrIfPermissions=\"updatePermissions\"\r\n >\r\n <clr-icon shape=\"pencil\"></clr-icon>\r\n {{ 'catalog.edit-options' | translate }}\r\n </a>\r\n </div>\r\n </vdr-card>\r\n <vdr-card [title]=\"'catalog.facets' | translate\">\r\n <div class=\"facets\">\r\n <vdr-facet-value-chip\r\n *ngFor=\"let facetValue of facetValues$ | async\"\r\n [facetValue]=\"facetValue\"\r\n [removable]=\"updatePermissions | hasPermission\"\r\n (remove)=\"removeFacetValue(facetValue.id)\"\r\n ></vdr-facet-value-chip>\r\n </div>\r\n <div>\r\n <button\r\n class=\"button-small mt-2\"\r\n *vdrIfPermissions=\"updatePermissions\"\r\n (click)=\"selectFacetValue()\"\r\n >\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.add-facets' | translate }}\r\n </button>\r\n </div>\r\n </vdr-card>\r\n\r\n <vdr-card>\r\n <vdr-page-entity-info *ngIf=\"entity$ | async as entity\" [entity]=\"entity\" />\r\n </vdr-card>\r\n </vdr-page-detail-sidebar>\r\n\r\n <vdr-page-block>\r\n <button type=\"submit\" hidden x-data=\"prevents enter key from triggering other buttons\"></button>\r\n <vdr-card>\r\n <div class=\"form-grid\">\r\n <vdr-form-field [label]=\"'common.name' | translate\" for=\"name\">\r\n <input\r\n id=\"name\"\r\n type=\"text\"\r\n formControlName=\"name\"\r\n [readonly]=\"!(['UpdateCatalog', 'UpdateProduct'] | hasPermission)\"\r\n />\r\n </vdr-form-field>\r\n <vdr-form-field [label]=\"'catalog.sku' | translate\" for=\"sku\">\r\n <input\r\n id=\"sku\"\r\n type=\"text\"\r\n formControlName=\"sku\"\r\n [readonly]=\"!(updatePermissions | hasPermission)\"\r\n />\r\n </vdr-form-field>\r\n </div>\r\n </vdr-card>\r\n <vdr-card [title]=\"'common.custom-fields' | translate\" *ngIf=\"customFields.length\">\r\n <vdr-tabbed-custom-fields\r\n entityName=\"ProductVariant\"\r\n [customFields]=\"customFields\"\r\n [customFieldsFormGroup]=\"detailForm.get('customFields')\"\r\n [readonly]=\"!(updatePermissions | hasPermission)\"\r\n />\r\n </vdr-card>\r\n <vdr-custom-detail-component-host\r\n locationId=\"product-variant-detail\"\r\n [entity$]=\"entity$\"\r\n [detailForm]=\"detailForm\"\r\n />\r\n <vdr-card [title]=\"'catalog.assets' | translate\">\r\n <vdr-assets\r\n [assets]=\"assetChanges.assets || variant.assets\"\r\n [featuredAsset]=\"assetChanges.featuredAsset || variant.featuredAsset\"\r\n [updatePermissions]=\"updatePermissions\"\r\n (change)=\"assetChanges = $event\"\r\n />\r\n </vdr-card>\r\n <vdr-card [title]=\"'catalog.price-and-tax' | translate\">\r\n <div class=\"form-grid\">\r\n <vdr-form-field [label]=\"'catalog.tax-category' | translate\" for=\"taxCategory\">\r\n <select name=\"taxCategory\" formControlName=\"taxCategoryId\">\r\n <option\r\n *ngFor=\"let taxCategory of taxCategories$ | async\"\r\n [value]=\"taxCategory.id\"\r\n >\r\n {{ taxCategory.name }}\r\n </option>\r\n </select>\r\n </vdr-form-field>\r\n </div>\r\n <div class=\"form-grid prices\" *ngFor=\"let price of pricesForm.controls\" [formGroup]=\"price\">\r\n <vdr-form-field\r\n [label]=\"\r\n ('catalog.price' | translate) +\r\n (1 < pricesForm.length ? ' (' + price.value.currencyCode + ')' : '')\r\n \"\r\n [tooltip]=\"\r\n 1 < pricesForm.length && price.value.currencyCode === channelDefaultCurrencyCode\r\n ? ('catalog.default-currency' | translate)\r\n : undefined\r\n \"\r\n for=\"price\"\r\n >\r\n <div class=\"price-wrapper\" [class.pending-deletion]=\"price.value.delete === true\">\r\n <vdr-currency-input\r\n name=\"price\"\r\n [currencyCode]=\"price.value.currencyCode\"\r\n [readonly]=\"\r\n !(updatePermissions | hasPermission) || price.value.delete === true\r\n \"\r\n formControlName=\"price\"\r\n />\r\n <div *ngIf=\"1 < pricesForm.controls.length\">\r\n <button\r\n class=\"button-small delete-button\"\r\n [disabled]=\"price.value.currencyCode === channelDefaultCurrencyCode\"\r\n (click)=\"toggleDeletePrice(price.get('delete'))\"\r\n >\r\n <clr-icon shape=\"trash\"></clr-icon>\r\n </button>\r\n </div>\r\n </div>\r\n </vdr-form-field>\r\n <vdr-variant-price-detail\r\n [price]=\"price.value.price\"\r\n [currencyCode]=\"price.value.currencyCode\"\r\n [priceIncludesTax]=\"channelPriceIncludesTax$ | async\"\r\n [taxCategoryId]=\"detailForm.get('taxCategoryId')!.value\"\r\n />\r\n </div>\r\n <ng-container *ngIf=\"unusedCurrencyCodes$ | async as unusedCurrencyCodes\">\r\n <div *ngIf=\"unusedCurrencyCodes.length\">\r\n <vdr-dropdown>\r\n <button class=\"button mt-2\" vdrDropdownTrigger>\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.add-price-in-another-currency' | translate }}\r\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu>\r\n <button\r\n vdrDropdownItem\r\n *ngFor=\"let currencyCode of unusedCurrencyCodes\"\r\n (click)=\"addPriceInCurrency(currencyCode)\"\r\n >\r\n {{ currencyCode | localeCurrencyName }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </div>\r\n </ng-container>\r\n </vdr-card>\r\n <vdr-card [title]=\"'catalog.stock-levels' | translate\">\r\n <div class=\"form-grid\">\r\n <vdr-form-field\r\n for=\"track-inventory\"\r\n [label]=\"'catalog.track-inventory' | translate\"\r\n [tooltip]=\"'catalog.track-inventory-tooltip' | translate\"\r\n >\r\n <select\r\n name=\"track-inventory\"\r\n formControlName=\"trackInventory\"\r\n [disabled]=\"!(updatePermissions | hasPermission)\"\r\n >\r\n <option [value]=\"GlobalFlag.TRUE\">\r\n {{ 'catalog.track-inventory-true' | translate }}\r\n </option>\r\n <option [value]=\"GlobalFlag.FALSE\">\r\n {{ 'catalog.track-inventory-false' | translate }}\r\n </option>\r\n <option [value]=\"GlobalFlag.INHERIT\">\r\n {{ 'catalog.track-inventory-inherit' | translate }}\r\n </option>\r\n </select>\r\n </vdr-form-field>\r\n\r\n <vdr-form-item\r\n [label]=\"'catalog.out-of-stock-threshold' | translate\"\r\n [tooltip]=\"'catalog.out-of-stock-threshold-tooltip' | translate\"\r\n >\r\n <input\r\n type=\"number\"\r\n formControlName=\"outOfStockThreshold\"\r\n [readonly]=\"!(updatePermissions | hasPermission)\"\r\n [vdrDisabled]=\"\r\n detailForm.get('useGlobalOutOfStockThreshold')?.value !== false ||\r\n inventoryIsNotTracked(detailForm)\r\n \"\r\n />\r\n <clr-toggle-wrapper>\r\n <input\r\n type=\"checkbox\"\r\n clrToggle\r\n name=\"useGlobalOutOfStockThreshold\"\r\n formControlName=\"useGlobalOutOfStockThreshold\"\r\n [vdrDisabled]=\"\r\n !(updatePermissions | hasPermission) || inventoryIsNotTracked(detailForm)\r\n \"\r\n />\r\n <label\r\n >{{ 'catalog.use-global-value' | translate }} ({{\r\n globalOutOfStockThreshold\r\n }})</label\r\n >\r\n </clr-toggle-wrapper>\r\n </vdr-form-item>\r\n </div>\r\n <div\r\n class=\"form-grid stock-levels\"\r\n *ngFor=\"let stockLevel of stockLevelsForm.controls\"\r\n [formGroup]=\"stockLevel\"\r\n >\r\n <vdr-form-field\r\n [label]=\"\r\n stockLevel.get('stockLocationName')?.value +\r\n ': ' +\r\n ('catalog.stock-on-hand' | translate)\r\n \"\r\n [for]=\"'stockOnHand_' + stockLevel.get('stockLocationId')?.value\"\r\n >\r\n <input\r\n [id]=\"'stockOnHand_' + stockLevel.get('stockLocationId')?.value\"\r\n type=\"number\"\r\n formControlName=\"stockOnHand\"\r\n [readonly]=\"!(updatePermissions | hasPermission)\"\r\n />\r\n </vdr-form-field>\r\n <vdr-form-item\r\n [label]=\"\r\n stockLevel.get('stockLocationName')?.value +\r\n ': ' +\r\n ('catalog.stock-allocated' | translate)\r\n \"\r\n >\r\n {{ stockLevel.get('stockAllocated')?.value }}\r\n </vdr-form-item>\r\n </div>\r\n <ng-container *ngIf=\"unusedStockLocation$ | async as unusedStockLocations\">\r\n <div *ngIf=\"unusedStockLocations.length\">\r\n <vdr-dropdown>\r\n <button class=\"button mt-2\" vdrDropdownTrigger>\r\n <clr-icon shape=\"plus\"></clr-icon>\r\n {{ 'catalog.add-stock-location' | translate }}\r\n <clr-icon shape=\"ellipsis-vertical\"></clr-icon>\r\n </button>\r\n <vdr-dropdown-menu>\r\n <button\r\n vdrDropdownItem\r\n *ngFor=\"let stockLocation of unusedStockLocations\"\r\n (click)=\"addStockLocation(stockLocation)\"\r\n >\r\n <clr-icon shape=\"map-marker\"></clr-icon> {{ stockLocation.name }}\r\n </button>\r\n </vdr-dropdown-menu>\r\n </vdr-dropdown>\r\n </div>\r\n </ng-container>\r\n </vdr-card>\r\n </vdr-page-block>\r\n </vdr-page-detail-layout>\r\n</form>\r\n","import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnDestroy, OnInit } from '@angular/core';\r\nimport { FormBuilder, FormControl, FormGroup, UntypedFormGroup } from '@angular/forms';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n Asset,\r\n CreateProductVariantInput,\r\n createUpdatedTranslatable,\r\n CurrencyCode,\r\n DataService,\r\n findTranslation,\r\n getCustomFieldsDefaults,\r\n GetProductVariantDetailDocument,\r\n GetProductVariantDetailQuery,\r\n GlobalFlag,\r\n ItemOf,\r\n LanguageCode,\r\n ModalService,\r\n NotificationService,\r\n Permission,\r\n ProductOptionFragment,\r\n ProductVariantUpdateMutationDocument,\r\n TypedBaseDetailComponent,\r\n UpdateProductVariantInput,\r\n} from '@vendure/admin-ui/core';\r\nimport { pick } from '@vendure/common/lib/pick';\r\nimport { unique } from '@vendure/common/lib/unique';\r\nimport { combineLatest, concat, Observable } from 'rxjs';\r\nimport {\r\n distinctUntilChanged,\r\n map,\r\n mergeMap,\r\n shareReplay,\r\n skip,\r\n switchMap,\r\n switchMapTo,\r\n take,\r\n tap,\r\n} from 'rxjs/operators';\r\nimport { ProductDetailService } from '../../providers/product-detail/product-detail.service';\r\nimport { ApplyFacetDialogComponent } from '../apply-facet-dialog/apply-facet-dialog.component';\r\n\r\ninterface SelectedAssets {\r\n assets?: Asset[];\r\n featuredAsset?: Asset;\r\n}\r\n\r\ninterface VariantFormValue {\r\n id: string;\r\n enabled: boolean;\r\n sku: string;\r\n name: string;\r\n taxCategoryId: string;\r\n stockOnHand: number;\r\n useGlobalOutOfStockThreshold: boolean;\r\n outOfStockThreshold: number;\r\n trackInventory: GlobalFlag;\r\n facetValueIds: string[][];\r\n customFields?: any;\r\n}\r\ntype T = NonNullable<GetProductVariantDetailQuery['productVariant']>;\r\ntype T1 = T['stockLevels'];\r\n@Component({\r\n selector: 'vdr-product-variant-detail',\r\n templateUrl: './product-variant-detail.component.html',\r\n styleUrls: ['./product-variant-detail.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ProductVariantDetailComponent\r\n extends TypedBaseDetailComponent<typeof GetProductVariantDetailDocument, 'productVariant'>\r\n implements OnInit, OnDestroy\r\n{\r\n public readonly updatePermissions = [Permission.UpdateCatalog, Permission.UpdateProduct];\r\n readonly customFields = this.getCustomFieldConfig('ProductVariant');\r\n readonly customOptionFields = this.getCustomFieldConfig('ProductOption');\r\n stockLevels$: Observable<NonNullable<GetProductVariantDetailQuery['productVariant']>['stockLevels']>;\r\n detailForm = this.formBuilder.group<VariantFormValue>({\r\n id: '',\r\n enabled: false,\r\n sku: '',\r\n name: '',\r\n taxCategoryId: '',\r\n stockOnHand: 0,\r\n useGlobalOutOfStockThreshold: true,\r\n outOfStockThreshold: 0,\r\n trackInventory: GlobalFlag.TRUE,\r\n facetValueIds: [],\r\n customFields: this.formBuilder.group(getCustomFieldsDefaults(this.customFields)),\r\n });\r\n stockLevelsForm = this.formBuilder.array<\r\n FormGroup<{\r\n stockLocationId: FormControl<string | null>;\r\n stockLocationName: FormControl<string | null>;\r\n stockOnHand: FormControl<number | null>;\r\n stockAllocated: FormControl<number | null>;\r\n }>\r\n >([]);\r\n pricesForm = this.formBuilder.array<\r\n FormGroup<{\r\n price: FormControl<number | null>;\r\n currencyCode: FormControl<CurrencyCode | null>;\r\n delete: FormControl<boolean | null>;\r\n }>\r\n >([]);\r\n assetChanges: SelectedAssets = {};\r\n taxCategories$: Observable<Array<ItemOf<GetProductVariantDetailQuery, 'taxCategories'>>>;\r\n unusedStockLocation$: Observable<Array<ItemOf<GetProductVariantDetailQuery, 'stockLocations'>>>;\r\n unusedCurrencyCodes$: Observable<string[]>;\r\n channelPriceIncludesTax$: Observable<boolean>;\r\n readonly GlobalFlag = GlobalFlag;\r\n globalTrackInventory: boolean;\r\n globalOutOfStockThreshold: number;\r\n facetValues$: Observable<NonNullable<GetProductVariantDetailQuery['productVariant']>['facetValues']>;\r\n channelDefaultCurrencyCode: CurrencyCode;\r\n\r\n constructor(\r\n private productDetailService: ProductDetailService,\r\n private formBuilder: FormBuilder,\r\n private modalService: ModalService,\r\n private notificationService: NotificationService,\r\n protected dataService: DataService,\r\n private changeDetector: ChangeDetectorRef,\r\n ) {\r\n super();\r\n }\r\n\r\n ngOnInit() {\r\n this.init();\r\n this.dataService.settings.getGlobalSettings('cache-first').single$.subscribe(({ globalSettings }) => {\r\n this.globalTrackInventory = globalSettings.trackInventory;\r\n this.globalOutOfStockThreshold = globalSettings.outOfStockThreshold;\r\n this.changeDetector.markForCheck();\r\n });\r\n this.taxCategories$ = this.result$.pipe(map(data => data.taxCategories.items));\r\n const availableCurrencyCodes$ = this.result$.pipe(\r\n tap(data => (this.channelDefaultCurrencyCode = data.activeChannel.defaultCurrencyCode)),\r\n map(data => data.activeChannel.availableCurrencyCodes),\r\n );\r\n this.unusedCurrencyCodes$ = combineLatest(this.pricesForm.valueChanges, availableCurrencyCodes$).pipe(\r\n map(([prices, currencyCodes]) =>\r\n currencyCodes.filter(code => !prices.map(p => p.currencyCode).includes(code)),\r\n ),\r\n );\r\n const stockLocations$ = this.result$.pipe(map(data => data.stockLocations.items));\r\n this.unusedStockLocation$ = combineLatest(this.entity$, stockLocations$).pipe(\r\n map(([entity, stockLocations]) => {\r\n const usedIds = entity.stockLevels.map(l => l.stockLocation.id);\r\n return stockLocations.filter(l => !usedIds.includes(l.id));\r\n }),\r\n );\r\n this.channelPriceIncludesTax$ = this.dataService.settings\r\n .getActiveChannel('cache-first')\r\n .refetchOnChannelChange()\r\n .mapStream(data => data.activeChannel.pricesIncludeTax)\r\n .pipe(shareReplay(1));\r\n this.stockLevels$ = this.entity$.pipe(map(entity => entity?.stockLevels ?? []));\r\n const facetValues$ = this.entity$.pipe(map(variant => variant.facetValues ?? []));\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n const formFacetValueIdChanges$ = this.detailForm.get('facetValueIds')!.valueChanges.pipe(\r\n skip(1),\r\n distinctUntilChanged(),\r\n switchMap(ids =>\r\n this.dataService.facet\r\n .getFacetValues({ filter: { id: { in: ids } } })\r\n .mapSingle(({ facetValues }) => facetValues.items),\r\n ),\r\n shareReplay(1),\r\n );\r\n this.facetValues$ = concat(\r\n facetValues$.pipe(take(1)),\r\n facetValues$.pipe(switchMapTo(formFacetValueIdChanges$)),\r\n );\r\n }\r\n\r\n ngOnDestroy() {\r\n this.destroy();\r\n }\r\n\r\n addPriceInCurrency(currencyCode: CurrencyCode) {\r\n this.pricesForm.push(\r\n this.formBuilder.group({\r\n currencyCode,\r\n price: 0,\r\n delete: false as boolean,\r\n }),\r\n );\r\n }\r\n\r\n toggleDeletePrice(deleteFormControl: FormControl) {\r\n deleteFormControl.setValue(!deleteFormControl.value);\r\n deleteFormControl.markAsDirty();\r\n }\r\n\r\n addStockLocation(stockLocation: ItemOf<GetProductVariantDetailQuery, 'stockLocations'>) {\r\n this.stockLevelsForm.push(\r\n this.formBuilder.group({\r\n stockLocationId: stockLocation.id,\r\n stockLocationName: stockLocation.name,\r\n stockOnHand: 0,\r\n stockAllocated: 0,\r\n }),\r\n );\r\n }\r\n\r\n save() {\r\n combineLatest(this.entity$, this.languageCode$)\r\n .pipe(\r\n take(1),\r\n mergeMap(([variant, languageCode]) => {\r\n const input = pick(\r\n this.getUpdatedVariant(\r\n variant,\r\n this.detailForm,\r\n languageCode,\r\n ) as UpdateProductVariantInput,\r\n [\r\n 'id',\r\n 'enabled',\r\n 'translations',\r\n 'sku',\r\n 'taxCategoryId',\r\n 'facetValueIds',\r\n 'featuredAssetId',\r\n 'assetIds',\r\n 'trackInventory',\r\n 'outOfStockThreshold',\r\n 'useGlobalOutOfStockThreshold',\r\n 'customFields',\r\n ],\r\n ) as UpdateProductVariantInput;\r\n if (this.stockLevelsForm.dirty) {\r\n input.stockLevels = this.stockLevelsForm.controls\r\n .filter(control => control.dirty)\r\n .map(control => ({\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n stockLocationId: control.value.stockLocationId!,\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n stockOnHand: control.value.stockOnHand!,\r\n }));\r\n }\r\n if (this.pricesForm.dirty) {\r\n input.prices = this.pricesForm.controls\r\n .filter(control => control.dirty)\r\n .map(control => ({\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n price: control.value.price!,\r\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\r\n currencyCode: control.value.currencyCode!,\r\n delete: control.value.delete === true,\r\n }));\r\n }\r\n return this.dataService.mutate(ProductVariantUpdateMutationDocument, {\r\n input: [input],\r\n });\r\n }),\r\n )\r\n .subscribe(\r\n result => {\r\n this.detailForm.markAsPristine();\r\n this.stockLevelsForm.markAsPristine();\r\n this.pricesForm.markAsPristine();\r\n this.assetChanges = {};\r\n this.notificationService.success(_('common.notify-update-success'), {\r\n entity: 'ProductVariant',\r\n });\r\n this.changeDetector.markForCheck();\r\n },\r\n err => {\r\n this.notificationService.error(_('common.notify-update-error'), {\r\n entity: 'ProductVariant',\r\n });\r\n },\r\n );\r\n }\r\n\r\n assetsChanged(): boolean {\r\n return !!Object.values(this.assetChanges).length;\r\n }\r\n\r\n inventoryIsNotTracked(formGroup: UntypedFormGroup): boolean {\r\n const trackInventory = formGroup.get('trackInventory')?.value;\r\n return (\r\n trackInventory === GlobalFlag.FALSE ||\r\n (trackInventory === GlobalFlag.INHERIT && this.globalTrackInventory === false)\r\n );\r\n }\r\n\r\n optionGroupCode(optionGroupId: string): string | undefined {\r\n const group = this.entity?.product.optionGroups.find(g => g.id === optionGroupId);\r\n return group?.code;\r\n }\r\n\r\n optionName(option: ProductOptionFragment) {\r\n const translation =\r\n option.translations.find(t => t.languageCode === this.languageCode) ?? option.translations[0];\r\n return translation.name;\r\n }\r\n\r\n removeFacetValue(facetValueId: string) {\r\n const productGroup = this.detailForm;\r\n const currentFacetValueIds = productGroup.value.facetValueIds ?? [];\r\n productGroup.patchValue({\r\n facetValueIds: currentFacetValueIds.filter(id => id !== facetValueId),\r\n });\r\n productGroup.markAsDirty();\r\n }\r\n\r\n selectFacetValue() {\r\n this.displayFacetValueModal().subscribe(facetValueIds => {\r\n if (facetValueIds) {\r\n const currentFacetValueIds = this.detailForm.value.facetValueIds ?? [];\r\n this.detailForm.patchValue({\r\n facetValueIds: unique([...currentFacetValueIds, ...facetValueIds]),\r\n });\r\n this.detailForm.markAsDirty();\r\n }\r\n });\r\n }\r\n\r\n private displayFacetValueModal(): Observable<string[] | undefined> {\r\n return this.modalService\r\n .fromComponent(ApplyFacetDialogComponent, {\r\n size: 'md',\r\n closable: true,\r\n })\r\n .pipe(map(facetValues => facetValues && facetValues.map(v => v.id)));\r\n }\r\n\r\n protected setFormValues(\r\n variant: NonNullable<GetProductVariantDetailQuery['productVariant']>,\r\n languageCode: LanguageCode,\r\n ): void {\r\n const variantTranslation = findTranslation(variant, languageCode);\r\n const facetValueIds = variant.facetValues.map(fv => fv.id);\r\n this.detailForm.patchValue({\r\n id: variant.id,\r\n enabled: variant.enabled,\r\n sku: variant.sku,\r\n name: variantTranslation ? variantTranslation.name : '',\r\n taxCategoryId: variant.taxCategory.id,\r\n stockOnHand: variant.stockLevels[0]?.stockOnHand ?? 0,\r\n useGlobalOutOfStockThreshold: variant.useGlobalOutOfStockThreshold,\r\n outOfStockThreshold: variant.outOfStockThreshold,\r\n trackInventory: variant.trackInventory,\r\n facetValueIds,\r\n });\r\n this.stockLevelsForm.clear();\r\n for (const stockLevel of variant.stockLevels) {\r\n this.stockLevelsForm.push(\r\n this.formBuilder.group({\r\n stockLocationId: stockLevel.stockLocation.id,\r\n stockLocationName: stockLevel.stockLocation.name,\r\n stockOnHand: stockLevel.stockOnHand,\r\n stockAllocated: stockLevel.stockAllocated,\r\n }),\r\n );\r\n }\r\n this.pricesForm.clear();\r\n for (const price of variant.prices) {\r\n this.pricesForm.push(\r\n this.formBuilder.group({\r\n price: price.price,\r\n currencyCode: price.currencyCode,\r\n delete: false as boolean,\r\n }),\r\n );\r\n }\r\n if (this.customFields.length) {\r\n this.setCustomFieldFormValues(\r\n this.customFields,\r\n this.detailForm.get('customFields'),\r\n variant,\r\n variantTranslation,\r\n );\r\n }\r\n }\r\n\r\n /**\r\n * Given a product and the value of the detailForm, this method creates an updated copy of the product which\r\n * can then be persisted to the API.\r\n */\r\n private getUpdatedVariant(\r\n variant: NonNullable<GetProductVariantDetailQuery['productVariant']>,\r\n variantFormGroup: typeof this.detailForm,\r\n languageCode: LanguageCode,\r\n ): UpdateProductVariantInput | CreateProductVariantInput {\r\n const updatedProduct = createUpdatedTranslatable({\r\n translatable: variant,\r\n updatedFields: variantFormGroup.value,\r\n customFieldConfig: this.customFields,\r\n languageCode,\r\n defaultTranslation: {\r\n languageCode,\r\n name: variant.name || '',\r\n },\r\n });\r\n return {\r\n ...updatedProduct,\r\n assetIds: this.assetChanges.assets?.map(a => a.id),\r\n featuredAssetId: this.assetChanges.featuredAsset?.id,\r\n facetValueIds: variantFormGroup.value.facetValueIds,\r\n taxCategoryId: variantFormGroup.value.taxCategoryId,\r\n } as UpdateProductVariantInput | CreateProductVariantInput;\r\n }\r\n}\r\n","import { switchMap } from './switchMap';\nimport { isFunction } from '../util/isFunction';\nexport function switchMapTo(innerObservable, resultSelector) {\n return isFunction(resultSelector) ? switchMap(() => innerObservable, resultSelector) : switchMap(() => innerObservable);\n}\n","import { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n BulkAction,\r\n DataService,\r\n DeletionResult,\r\n GetProductVariantListQuery,\r\n ItemOf,\r\n ModalService,\r\n NotificationService,\r\n Permission,\r\n createBulkRemoveFromChannelAction,\r\n isMultiChannel,\r\n ProductVariant,\r\n} from '@vendure/admin-ui/core';\r\nimport { unique } from '@vendure/common/lib/unique';\r\nimport { EMPTY } from 'rxjs';\r\nimport { map, switchMap } from 'rxjs/operators';\r\nimport { AssignProductsToChannelDialogComponent } from '../assign-products-to-channel-dialog/assign-products-to-channel-dialog.component';\r\nimport { ProductVariantListComponent } from './product-variant-list.component';\r\n\r\nexport const assignProductVariantsToChannelBulkAction: BulkAction<\r\n ItemOf<GetProductVariantListQuery, 'productVariants'>,\r\n ProductVariantListComponent\r\n> = {\r\n location: 'product-variant-list',\r\n label: _('catalog.assign-to-channel'),\r\n icon: 'layers',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.UpdateCatalog) ||\r\n userPermissions.includes(Permission.UpdateProduct),\r\n isVisible: ({ injector }) => isMultiChannel(injector.get(DataService)),\r\n onClick: ({ injector, selection, clearSelection }) => {\r\n const modalService = injector.get(ModalService);\r\n modalService\r\n .fromComponent(AssignProductsToChannelDialogComponent, {\r\n size: 'lg',\r\n locals: {\r\n productVariantIds: unique(selection.map(p => p.id)),\r\n currentChannelIds: [],\r\n },\r\n })\r\n .subscribe(result => {\r\n if (result) {\r\n clearSelection();\r\n }\r\n });\r\n },\r\n};\r\n\r\nexport const removeProductVariantsFromChannelBulkAction = createBulkRemoveFromChannelAction<\r\n ItemOf<GetProductVariantListQuery, 'productVariants'>\r\n>({\r\n location: 'product-variant-list',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.UpdateCatalog) ||\r\n userPermissions.includes(Permission.UpdateProduct),\r\n getItemName: item => item.name,\r\n bulkRemoveFromChannel: (dataService, ids, channelId) =>\r\n dataService.product\r\n .removeVariantsFromChannel({\r\n channelId: channelId,\r\n productVariantIds: ids,\r\n })\r\n .pipe(map(res => res.removeProductVariantsFromChannel)),\r\n});\r\n\r\nexport const deleteProductVariantsBulkAction: BulkAction<ProductVariant, ProductVariantListComponent> = {\r\n location: 'product-variant-list',\r\n label: _('common.delete'),\r\n icon: 'trash',\r\n iconClass: 'is-danger',\r\n requiresPermission: userPermissions =>\r\n userPermissions.includes(Permission.DeleteProduct) ||\r\n userPermissions.includes(Permission.DeleteCatalog),\r\n onClick: ({ injector, selection, hostComponent, clearSelection }) => {\r\n const modalService = injector.get(ModalService);\r\n const dataService = injector.get(DataService);\r\n const notificationService = injector.get(NotificationService);\r\n modalService\r\n .dialog({\r\n title: _('common.confirm-bulk-delete'),\r\n translationVars: {\r\n count: selection.length,\r\n },\r\n buttons: [\r\n { type: 'secondary', label: _('common.cancel') },\r\n { type: 'danger', label: _('common.delete'), returnValue: true },\r\n ],\r\n })\r\n .pipe(\r\n switchMap(response =>\r\n response\r\n ? dataService.product.deleteProductVariants(unique(selection.map(p => p.id)))\r\n : EMPTY,\r\n ),\r\n )\r\n .subscribe(result => {\r\n let deleted = 0;\r\n const errors: string[] = [];\r\n for (const item of result.deleteProductVariants) {\r\n if (item.result === DeletionResult.DELETED) {\r\n deleted++;\r\n } else if (item.message) {\r\n errors.push(item.message);\r\n }\r\n }\r\n if (0 < deleted) {\r\n notificationService.success(_('catalog.notify-bulk-delete-products-success'), {\r\n count: deleted,\r\n });\r\n }\r\n if (0 < errors.length) {\r\n notificationService.error(errors.join('\\n'));\r\n }\r\n hostComponent.refresh();\r\n clearSelection();\r\n });\r\n },\r\n};\r\n","<table class=\"table\">\r\n <thead>\r\n <tr>\r\n <th></th>\r\n <th>{{ 'common.name' | translate }}</th>\r\n <th>{{ 'catalog.sku' | translate }}</th>\r\n <ng-container *ngFor=\"let optionGroup of optionGroups | sort: 'id'\">\r\n <th>{{ optionGroup.name }}</th>\r\n </ng-container>\r\n <th>{{ 'catalog.price' | translate }}</th>\r\n <th>{{ 'catalog.stock-on-hand' | translate }}</th>\r\n <th>{{ 'common.enabled' | translate }}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr *ngFor=\"let variant of variants | paginate: paginationConfig; index as i; trackBy: trackByFn\">\r\n <ng-container *ngIf=\"formGroupMap.get(variant.id) as formGroup\" [formGroup]=\"formGroup\">\r\n <td class=\"left align-middle\" [class.disabled]=\"!formGroup.get('enabled')!.value\">\r\n <div class=\"card-img\">\r\n <div class=\"featured-asset\">\r\n <img\r\n *ngIf=\"getFeaturedAsset(variant) as featuredAsset; else placeholder\"\r\n [src]=\"featuredAsset | assetPreview: 'tiny'\"\r\n />\r\n <ng-template #placeholder>\r\n <div class=\"placeholder\">\r\n <clr-icon shape=\"image\" size=\"48\"></clr-icon>\r\n </div>\r\n </ng-template>\r\n </div>\r\n </div>\r\n </td>\r\n <td class=\"left align-middle\" [class.disabled]=\"!formGroup.get('enabled')!.value\">\r\n <clr-input-container>\r\n <input\r\n clrInput\r\n type=\"text\"\r\n formControlName=\"name\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n [placeholder]=\"'common.name' | translate\"\r\n />\r\n </clr-input-container>\r\n </td>\r\n <td class=\"left align-middle\" [class.disabled]=\"!formGroup.get('enabled')!.value\">\r\n <clr-input-container>\r\n <input\r\n clrInput\r\n type=\"text\"\r\n formControlName=\"sku\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n [placeholder]=\"'catalog.sku' | translate\"\r\n />\r\n </clr-input-container>\r\n </td>\r\n <ng-container *ngFor=\"let option of variant.options | sort: 'groupId'\">\r\n <td\r\n class=\"left align-middle\"\r\n [class.disabled]=\"!formGroup.get('enabled')!.value\"\r\n [style.color]=\"optionGroupName(option.groupId) | stringToColor\"\r\n >\r\n {{ option.name }}\r\n </td>\r\n </ng-container>\r\n <td class=\"left align-middle price\" [class.disabled]=\"!formGroup.get('enabled')!.value\">\r\n <clr-input-container>\r\n <vdr-currency-input\r\n *ngIf=\"!channelPriceIncludesTax\"\r\n clrInput\r\n [currencyCode]=\"variant.currencyCode\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n formControlName=\"price\"\r\n ></vdr-currency-input>\r\n <vdr-currency-input\r\n *ngIf=\"channelPriceIncludesTax\"\r\n clrInput\r\n [currencyCode]=\"variant.currencyCode\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n formControlName=\"priceWithTax\"\r\n ></vdr-currency-input>\r\n </clr-input-container>\r\n </td>\r\n <td class=\"left align-middle stock\" [class.disabled]=\"!formGroup.get('enabled')!.value\">\r\n <clr-input-container>\r\n <input\r\n clrInput\r\n type=\"number\"\r\n min=\"0\"\r\n step=\"1\"\r\n formControlName=\"stockOnHand\"\r\n [readonly]=\"!(updatePermission | hasPermission)\"\r\n />\r\n </clr-input-container>\r\n </td>\r\n <td class=\"left align-middle stock\" [class.disabled]=\"!formGroup.get('enabled')!.value\">\r\n <clr-toggle-wrapper>\r\n <input\r\n type=\"checkbox\"\r\n clrToggle\r\n name=\"enabled\"\r\n formControlName=\"enabled\"\r\n [vdrDisabled]=\"!(updatePermission | hasPermission)\"\r\n />\r\n </clr-toggle-wrapper>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n </tbody>\r\n</table>\r\n","import {\r\n ChangeDetectionStrategy,\r\n ChangeDetectorRef,\r\n Component,\r\n Input,\r\n OnDestroy,\r\n OnInit,\r\n} from '@angular/core';\r\nimport { UntypedFormArray, UntypedFormGroup } from '@angular/forms';\r\nimport { Asset, Permission, ProductDetailFragment, ProductVariantFragment } from '@vendure/admin-ui/core';\r\nimport { Subscription } from 'rxjs';\r\nimport { debounceTime, distinctUntilChanged, map } from 'rxjs/operators';\r\n\r\ninterface SelectedAssets {\r\n assets?: Asset[];\r\n featuredAsset?: Asset;\r\n}\r\n\r\ninterface PaginationConfig {\r\n totalItems: number;\r\n currentPage: number;\r\n itemsPerPage: number;\r\n}\r\n\r\n@Component({\r\n selector: 'vdr-product-variants-table',\r\n templateUrl: './product-variants-table.component.html',\r\n styleUrls: ['./product-variants-table.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class ProductVariantsTableComponent implements OnInit, OnDestroy {\r\n @Input('productVariantsFormArray') formArray: UntypedFormArray;\r\n @Input() variants: ProductVariantFragment[];\r\n @Input() paginationConfig: PaginationConfig;\r\n @Input() channelPriceIncludesTax: boolean;\r\n @Input() optionGroups: ProductDetailFragment['optionGroups'];\r\n @Input() pendingAssetChanges: { [variantId: string]: SelectedAssets };\r\n formGroupMap = new Map<string, UntypedFormGroup>();\r\n readonly updatePermission = [Permission.UpdateCatalog, Permission.UpdateProduct];\r\n private subscription: Subscription;\r\n\r\n constructor(private changeDetector: ChangeDetectorRef) {}\r\n\r\n ngOnInit() {\r\n this.subscription = this.formArray.valueChanges\r\n .pipe(\r\n map(value => value.length),\r\n debounceTime(1),\r\n distinctUntilChanged(),\r\n )\r\n .subscribe(() => {\r\n this.buildFormGroupMap();\r\n });\r\n\r\n this.buildFormGroupMap();\r\n }\r\n\r\n ngOnDestroy() {\r\n if (this.subscription) {\r\n this.subscription.unsubscribe();\r\n }\r\n }\r\n\r\n trackByFn(index: number, item: any) {\r\n if ((item as any).id != null) {\r\n return (item as any).id;\r\n } else {\r\n return index;\r\n }\r\n }\r\n\r\n getFeaturedAsset(variant: ProductVariantFragment) {\r\n return this.pendingAssetChanges[variant.id]?.featuredAsset || variant.featuredAsset;\r\n }\r\n\r\n optionGroupName(optionGroupId: string): string | undefined {\r\n const group = this.optionGroups.find(g => g.id === optionGroupId);\r\n return group && group.name;\r\n }\r\n\r\n private buildFormGroupMap() {\r\n this.formGroupMap.clear();\r\n for (const controlGroup of this.formArray.controls) {\r\n this.formGroupMap.set(controlGroup.value.id, controlGroup as UntypedFormGroup);\r\n }\r\n this.changeDetector.markForCheck();\r\n }\r\n}\r\n","<ng-template vdrDialogTitle>{{ 'catalog.update-product-option' | translate }}</ng-template>\r\n<vdr-form-field [label]=\"'catalog.option-name' | translate\" for=\"name\">\r\n <input\r\n id=\"name\"\r\n type=\"text\"\r\n #nameInput=\"ngModel\"\r\n [(ngModel)]=\"name\"\r\n required\r\n (input)=\"updateCode($event.target.value)\"\r\n />\r\n</vdr-form-field>\r\n<vdr-form-field [label]=\"'common.code' | translate\" for=\"code\">\r\n <input id=\"code\" type=\"text\" #codeInput=\"ngModel\" required [(ngModel)]=\"code\" pattern=\"[a-z0-9_-]+\" />\r\n</vdr-form-field>\r\n<clr-checkbox-wrapper>\r\n <input type=\"checkbox\" clrCheckbox [(ngModel)]=\"updateVariantName\" />\r\n <label>{{ 'catalog.auto-update-option-variant-name' | translate }}</label>\r\n</clr-checkbox-wrapper>\r\n<section *ngIf=\"customFields.length\">\r\n <label>{{ 'common.custom-fields' | translate }}</label>\r\n <vdr-tabbed-custom-fields\r\n entityName=\"ProductOption\"\r\n [customFields]=\"customFields\"\r\n [customFieldsFormGroup]=\"customFieldsForm\"\r\n [readonly]=\"!(['UpdateCatalog', 'UpdateProduct'] | hasPermission)\"\r\n ></vdr-tabbed-custom-fields>\r\n</section>\r\n\r\n<ng-template vdrDialogButtons>\r\n <button type=\"button\" class=\"btn\" (click)=\"cancel()\">{{ 'common.cancel' | translate }}</button>\r\n <button\r\n type=\"submit\"\r\n (click)=\"update()\"\r\n [disabled]=\"\r\n nameInput.invalid ||\r\n codeInput.invalid ||\r\n (nameInput.pristine && codeInput.pristine && customFieldsForm.pristine)\r\n \"\r\n class=\"btn btn-primary\"\r\n >\r\n {{ 'catalog.update-product-option' | translate }}\r\n </button>\r\n</ng-template>\r\n","import { ChangeDetectionStrategy, Component, OnInit } from '@angular/core';\r\nimport { UntypedFormControl, UntypedFormGroup } from '@angular/forms';\r\nimport {\r\n CustomFieldConfig,\r\n LanguageCode,\r\n ProductVariantFragment,\r\n UpdateProductOptionInput,\r\n createUpdatedTranslatable,\r\n Dialog,\r\n} from '@vendure/admin-ui/core';\r\n\r\nimport { normalizeString } from '@vendure/common/lib/normalize-string';\r\n\r\n@Component({\r\n selector: 'vdr-update-product-option-dialog',\r\n templateUrl: './update-product-option-dialog.component.html',\r\n styleUrls: ['./update-product-option-dialog.component.scss'],\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n})\r\nexport class UpdateProductOptionDialogComponent\r\n implements Dialog<UpdateProductOptionInput & { autoUpdate: boolean }>, OnInit\r\n{\r\n resolveWith: (result?: UpdateProductOptionInput & { autoUpdate: boolean }) => void;\r\n updateVariantName = true;\r\n // Provided by caller\r\n productOption: ProductVariantFragment['options'][number];\r\n activeLanguage: LanguageCode;\r\n name: string;\r\n code: string;\r\n customFields: CustomFieldConfig[];\r\n codeInputTouched = false;\r\n customFieldsForm: UntypedFormGroup;\r\n\r\n ngOnInit(): void {\r\n const currentTranslation = this.productOption.translations.find(\r\n t => t.languageCode === this.activeLanguage,\r\n );\r\n this.name = currentTranslation?.name ?? '';\r\n this.code = this.productOption.code;\r\n this.customFieldsForm = new UntypedFormGroup({});\r\n if (this.customFields) {\r\n const cfCurrentTranslation =\r\n (currentTranslation && (currentTranslation as any).customFields) || {};\r\n\r\n for (const fieldDef of this.customFields) {\r\n const key = fieldDef.name;\r\n const value =\r\n fieldDef.type === 'localeString'\r\n ? cfCurrentTranslation[key]\r\n : (this.productOption as any).customFields[key];\r\n this.customFieldsForm.addControl(fieldDef.name, new UntypedFormControl(value));\r\n }\r\n }\r\n }\r\n\r\n update() {\r\n const result = createUpdatedTranslatable({\r\n translatable: this.productOption,\r\n languageCode: this.activeLanguage,\r\n updatedFields: {\r\n code: this.code,\r\n name: this.name,\r\n customFields: this.customFieldsForm.value,\r\n },\r\n customFieldConfig: this.customFields,\r\n defaultTranslation: {\r\n languageCode: this.activeLanguage,\r\n name: '',\r\n },\r\n });\r\n this.resolveWith({ ...result, autoUpdate: this.updateVariantName });\r\n }\r\n\r\n cancel() {\r\n this.resolveWith();\r\n }\r\n\r\n updateCode(nameValue: string) {\r\n if (!this.codeInputTouched && !this.productOption.code) {\r\n this.code = normalizeString(nameValue, '-');\r\n }\r\n }\r\n}\r\n","import { NgModule } from '@angular/core';\r\nimport { RouterModule, ROUTES } from '@angular/router';\r\nimport { marker as _ } from '@biesbjerg/ngx-translate-extract-marker';\r\nimport {\r\n AssetDetailQueryDocument,\r\n BulkActionRegistryService,\r\n CollectionDetailQueryDocument,\r\n detailComponentWithResolver,\r\n GetFacetDetailDocument,\r\n GetProductDetailDocument,\r\n GetProductVariantDetailDocument,\r\n PageService,\r\n SharedModule,\r\n} from '@vendure/admin-ui/core';\r\n\r\nimport { createRoutes } from './catalog.routes';\r\nimport { ApplyFacetDialogComponent } from './components/apply-facet-dialog/apply-facet-dialog.component';\r\nimport { AssetDetailComponent } from './components/asset-detail/asset-detail.component';\r\nimport { AssetListComponent } from './components/asset-list/asset-list.component';\r\nimport { AssetsComponent } from './components/assets/assets.component';\r\nimport { AssignProductsToChannelDialogComponent } from './components/assign-products-to-channel-dialog/assign-products-to-channel-dialog.component';\r\nimport { BulkAddFacetValuesDialogComponent } from './components/bulk-add-facet-values-dialog/bulk-add-facet-values-dialog.component';\r\nimport { CollectionContentsComponent } from './components/collection-contents/collection-contents.component';\r\nimport { CollectionDataTableComponent } from './components/collection-data-table/collection-data-table.component';\r\nimport { CollectionDetailComponent } from './components/collection-detail/collection-detail.component';\r\nimport { CollectionBreadcrumbPipe } from './components/collection-list/collection-breadcrumb.pipe';\r\nimport {\r\n assignCollectionsToChannelBulkAction,\r\n deleteCollectionsBulkAction,\r\n moveCollectionsBulkAction,\r\n removeCollectionsFromChannelBulkAction,\r\n} from './components/collection-list/collection-list-bulk-actions';\r\nimport { CollectionListComponent } from './components/collection-list/collection-list.component';\r\nimport { CollectionTreeNodeComponent } from './components/collection-tree/collection-tree-node.component';\r\nimport { CollectionTreeComponent } from './components/collection-tree/collection-tree.component';\r\nimport { ConfirmVariantDeletionDialogComponent } from './components/confirm-variant-deletion-dialog/confirm-variant-deletion-dialog.component';\r\nimport { CreateProductOptionGroupDialogComponent } from './components/create-product-option-group-dialog/create-product-option-group-dialog.component';\r\nimport { CreateProductVariantDialogComponent } from './components/create-product-variant-dialog/create-product-variant-dialog.component';\r\nimport { FacetDetailComponent } from './components/facet-detail/facet-detail.component';\r\nimport {\r\n assignFacetsToChannelBulkAction,\r\n deleteFacetsBulkAction,\r\n removeFacetsFromChannelBulkAction,\r\n} from './components/facet-list/facet-list-bulk-actions';\r\nimport { FacetListComponent } from './components/facet-list/facet-list.component';\r\nimport { GenerateProductVariantsComponent } from './components/generate-product-variants/generate-product-variants.component';\r\nimport { MoveCollectionsDialogComponent } from './components/move-collections-dialog/move-collections-dialog.component';\r\nimport { OptionValueInputComponent } from './components/option-value-input/option-value-input.component';\r\nimport { ProductDetailComponent } from './components/product-detail/product-detail.component';\r\nimport {\r\n assignFacetValuesToProductsBulkAction,\r\n assignProductsToChannelBulkAction,\r\n deleteProductsBulkAction,\r\n removeProductsFromChannelBulkAction,\r\n} from './components/product-list/product-list-bulk-actions';\r\nimport { ProductListComponent } from './components/product-list/product-list.component';\r\nimport { ProductOptionsEditorComponent } from './components/product-options-editor/product-options-editor.component';\r\nimport { ProductVariantDetailComponent } from './components/product-variant-detail/product-variant-detail.component';\r\nimport {\r\n assignProductVariantsToChannelBulkAction,\r\n deleteProductVariantsBulkAction,\r\n removeProductVariantsFromChannelBulkAction,\r\n} from './components/product-variant-list/product-variant-list-bulk-actions';\r\nimport { ProductVariantListComponent } from './components/product-variant-list/product-variant-list.component';\r\nimport { ProductVariantQuickJumpComponent } from './components/product-variant-quick-jump/product-variant-quick-jump.component';\r\nimport { ProductVariantsEditorComponent } from './components/product-variants-editor/product-variants-editor.component';\r\nimport { ProductVariantsTableComponent } from './components/product-variants-table/product-variants-table.component';\r\nimport { UpdateProductOptionDialogComponent } from './components/update-product-option-dialog/update-product-option-dialog.component';\r\nimport { VariantPriceDetailComponent } from './components/variant-price-detail/variant-price-detail.component';\r\n\r\nconst CATALOG_COMPONENTS = [\r\n ProductListComponent,\r\n ProductDetailComponent,\r\n FacetListComponent,\r\n FacetDetailComponent,\r\n GenerateProductVariantsComponent,\r\n ApplyFacetDialogComponent,\r\n AssetListComponent,\r\n AssetsComponent,\r\n VariantPriceDetailComponent,\r\n CollectionListComponent,\r\n CollectionDetailComponent,\r\n CollectionTreeComponent,\r\n CollectionTreeNodeComponent,\r\n CollectionContentsComponent,\r\n ProductVariantsTableComponent,\r\n OptionValueInputComponent,\r\n UpdateProductOptionDialogComponent,\r\n ProductVariantsEditorComponent,\r\n AssignProductsToChannelDialogComponent,\r\n AssetDetailComponent,\r\n ConfirmVariantDeletionDialogComponent,\r\n ProductOptionsEditorComponent,\r\n BulkAddFacetValuesDialogComponent,\r\n CollectionDataTableComponent,\r\n CollectionBreadcrumbPipe,\r\n MoveCollectionsDialogComponent,\r\n ProductVariantListComponent,\r\n ProductDetailComponent,\r\n ProductVariantDetailComponent,\r\n CreateProductVariantDialogComponent,\r\n CreateProductOptionGroupDialogComponent,\r\n ProductVariantQuickJumpComponent,\r\n];\r\n\r\n@NgModule({\r\n imports: [SharedModule, RouterModule.forChild([])],\r\n exports: [...CATALOG_COMPONENTS],\r\n declarations: [...CATALOG_COMPONENTS],\r\n providers: [\r\n {\r\n provide: ROUTES,\r\n useFactory: (pageService: PageService) => createRoutes(pageService),\r\n multi: true,\r\n deps: [PageService],\r\n },\r\n ],\r\n})\r\nexport class CatalogModule {\r\n private static hasRegisteredTabsAndBulkActions = false;\r\n\r\n constructor(bulkActionRegistryService: BulkActionRegistryService, pageService: PageService) {\r\n if (CatalogModule.hasRegisteredTabsAndBulkActions) {\r\n return;\r\n }\r\n bulkActionRegistryService.registerBulkAction(assignFacetValuesToProductsBulkAction);\r\n bulkActionRegistryService.registerBulkAction(assignProductsToChannelBulkAction);\r\n bulkActionRegistryService.registerBulkAction(assignProductVariantsToChannelBulkAction);\r\n bulkActionRegistryService.registerBulkAction(removeProductsFromChannelBulkAction);\r\n bulkActionRegistryService.registerBulkAction(removeProductVariantsFromChannelBulkAction);\r\n bulkActionRegistryService.registerBulkAction(deleteProductsBulkAction);\r\n bulkActionRegistryService.registerBulkAction(deleteProductVariantsBulkAction);\r\n\r\n bulkActionRegistryService.registerBulkAction(assignFacetsToChannelBulkAction);\r\n bulkActionRegistryService.registerBulkAction(removeFacetsFromChannelBulkAction);\r\n bulkActionRegistryService.registerBulkAction(deleteFacetsBulkAction);\r\n\r\n bulkActionRegistryService.registerBulkAction(moveCollectionsBulkAction);\r\n bulkActionRegistryService.registerBulkAction(assignCollectionsToChannelBulkAction);\r\n bulkActionRegistryService.registerBulkAction(removeCollectionsFromChannelBulkAction);\r\n bulkActionRegistryService.registerBulkAction(deleteCollectionsBulkAction);\r\n\r\n pageService.registerPageTab({\r\n priority: 0,\r\n location: 'product-list',\r\n tab: _('catalog.products'),\r\n route: '',\r\n component: ProductListComponent,\r\n });\r\n pageService.registerPageTab({\r\n priority: 0,\r\n location: 'product-detail',\r\n tab: _('catalog.product'),\r\n route: '',\r\n component: detailComponentWithResolver({\r\n component: ProductDetailComponent,\r\n query: GetProductDetailDocument,\r\n entityKey: 'product',\r\n getBreadcrumbs: entity => [\r\n {\r\n label: entity ? entity.name : _('catalog.create-new-product'),\r\n link: [entity?.id],\r\n },\r\n ],\r\n }),\r\n });\r\n pageService.registerPageTab({\r\n priority: 0,\r\n location: 'product-list',\r\n tab: _('catalog.product-variants'),\r\n route: 'variants',\r\n component: ProductVariantListComponent,\r\n });\r\n pageService.registerPageTab({\r\n priority: 0,\r\n location: 'product-variant-detail',\r\n tab: _('catalog.product-variants'),\r\n route: '',\r\n component: detailComponentWithResolver({\r\n component: ProductVariantDetailComponent,\r\n query: GetProductVariantDetailDocument,\r\n entityKey: 'productVariant',\r\n getBreadcrumbs: entity => [\r\n {\r\n label: `${entity?.product.name}`,\r\n link: ['/catalog', 'products', entity?.product.id],\r\n },\r\n {\r\n label: `${entity?.name} (${entity?.sku})`,\r\n link: ['variants', entity?.id],\r\n },\r\n ],\r\n }),\r\n });\r\n pageService.registerPageTab({\r\n priority: 0,\r\n location: 'facet-list',\r\n tab: _('catalog.facets'),\r\n route: '',\r\n component: FacetListComponent,\r\n });\r\n pageService.registerPageTab({\r\n priority: 0,\r\n location: 'facet-detail',\r\n tab: _('catalog.facet'),\r\n route: '',\r\n component: detailComponentWithResolver({\r\n component: FacetDetailComponent,\r\n query: GetFacetDetailDocument,\r\n entityKey: 'facet',\r\n getBreadcrumbs: entity => [\r\n {\r\n label: entity ? entity.name : _('catalog.create-new-facet'),\r\n link: [entity?.id],\r\n },\r\n ],\r\n }),\r\n });\r\n pageService.registerPageTab({\r\n priority: 0,\r\n location: 'collection-list',\r\n tab: _('catalog.collections'),\r\n route: '',\r\n component: CollectionListComponent,\r\n });\r\n pageService.registerPageTab({\r\n priority: 0,\r\n location: 'collection-detail',\r\n tab: _('catalog.collection'),\r\n route: '',\r\n component: detailComponentWithResolver({\r\n component: CollectionDetailComponent,\r\n query: CollectionDetailQueryDocument,\r\n entityKey: 'collection',\r\n getBreadcrumbs: entity => [\r\n {\r\n label: entity ? entity.name : _('catalog.create-new-collection'),\r\n link: [entity?.id],\r\n },\r\n ],\r\n }),\r\n });\r\n pageService.registerPageTab({\r\n priority: 0,\r\n location: 'asset-list',\r\n tab: _('catalog.assets'),\r\n route: '',\r\n component: AssetListComponent,\r\n });\r\n pageService.registerPageTab({\r\n priority: 0,\r\n location: 'asset-detail',\r\n tab: _('catalog.asset'),\r\n route: '',\r\n component: detailComponentWithResolver({\r\n component: AssetDetailComponent,\r\n query: AssetDetailQueryDocument,\r\n entityKey: 'asset',\r\n getBreadcrumbs: entity => [\r\n {\r\n label: `${entity?.name}`,\r\n link: [entity?.id],\r\n },\r\n ],\r\n }),\r\n });\r\n CatalogModule.hasRegisteredTabsAndBulkActions = true;\r\n }\r\n}\r\n","import { gql } from 'apollo-angular';\r\n\r\nconst PRODUCT_LIST_QUERY_PRODUCT_FRAGMENT = gql`\r\n fragment ProductListQueryProductFragment on Product {\r\n id\r\n createdAt\r\n updatedAt\r\n enabled\r\n languageCode\r\n name\r\n slug\r\n featuredAsset {\r\n id\r\n createdAt\r\n updatedAt\r\n preview\r\n focalPoint {\r\n x\r\n y\r\n }\r\n }\r\n variantList {\r\n totalItems\r\n }\r\n }\r\n`;\r\n\r\nexport const PRODUCT_LIST_QUERY = gql`\r\n query ProductListQuery($options: ProductListOptions) {\r\n products(options: $options) {\r\n items {\r\n ...ProductListQueryProductFragment\r\n }\r\n totalItems\r\n }\r\n }\r\n ${PRODUCT_LIST_QUERY_PRODUCT_FRAGMENT}\r\n`;\r\n","import { ASSET_FRAGMENT, PRODUCT_OPTION_FRAGMENT } from '@vendure/admin-ui/core';\r\nimport { gql } from 'apollo-angular';\r\n\r\nexport const PRODUCT_VARIANT_DETAIL_QUERY_PRODUCT_VARIANT_FRAGMENT = gql`\r\n fragment ProductVariantDetailQueryProductVariantFragment on ProductVariant {\r\n id\r\n createdAt\r\n updatedAt\r\n enabled\r\n languageCode\r\n name\r\n price\r\n currencyCode\r\n prices {\r\n price\r\n currencyCode\r\n }\r\n priceWithTax\r\n stockOnHand\r\n stockAllocated\r\n trackInventory\r\n outOfStockThreshold\r\n useGlobalOutOfStockThreshold\r\n taxRateApplied {\r\n id\r\n name\r\n value\r\n }\r\n taxCategory {\r\n id\r\n name\r\n }\r\n sku\r\n options {\r\n ...ProductOption\r\n }\r\n stockLevels {\r\n id\r\n createdAt\r\n updatedAt\r\n stockOnHand\r\n stockAllocated\r\n stockLocationId\r\n stockLocation {\r\n id\r\n createdAt\r\n updatedAt\r\n name\r\n }\r\n }\r\n facetValues {\r\n id\r\n code\r\n name\r\n facet {\r\n id\r\n name\r\n }\r\n }\r\n featuredAsset {\r\n ...Asset\r\n }\r\n assets {\r\n ...Asset\r\n }\r\n translations {\r\n id\r\n languageCode\r\n name\r\n }\r\n channels {\r\n id\r\n code\r\n }\r\n product {\r\n id\r\n name\r\n optionGroups {\r\n id\r\n name\r\n code\r\n translations {\r\n id\r\n languageCode\r\n name\r\n }\r\n }\r\n }\r\n }\r\n`;\r\n\r\nexport const PRODUCT_VARIANT_DETAIL_QUERY = gql`\r\n query GetProductVariantDetail($id: ID!) {\r\n productVariant(id: $id) {\r\n ...ProductVariantDetailQueryProductVariantFragment\r\n }\r\n stockLocations(options: { take: 100 }) {\r\n items {\r\n id\r\n createdAt\r\n updatedAt\r\n name\r\n description\r\n }\r\n }\r\n taxCategories(options: { take: 100 }) {\r\n items {\r\n id\r\n createdAt\r\n updatedAt\r\n name\r\n isDefault\r\n }\r\n totalItems\r\n }\r\n activeChannel {\r\n id\r\n availableCurrencyCodes\r\n defaultCurrencyCode\r\n }\r\n }\r\n ${PRODUCT_VARIANT_DETAIL_QUERY_PRODUCT_VARIANT_FRAGMENT}\r\n`;\r\n\r\nexport const PRODUCT_VARIANT_UPDATE_MUTATION = gql`\r\n mutation ProductVariantUpdateMutation($input: [UpdateProductVariantInput!]!) {\r\n updateProductVariants(input: $input) {\r\n ...ProductVariantDetailQueryProductVariantFragment\r\n }\r\n }\r\n ${PRODUCT_VARIANT_DETAIL_QUERY_PRODUCT_VARIANT_FRAGMENT}\r\n`;\r\n","import { ASSET_FRAGMENT } from '@vendure/admin-ui/core';\r\nimport { gql } from 'apollo-angular';\r\n\r\nconst PRODUCT_VARIANT_LIST_QUERY_PRODUCT_VARIANT_FRAGMENT = gql`\r\n fragment ProductVariantListQueryProductVariantFragment on ProductVariant {\r\n id\r\n createdAt\r\n updatedAt\r\n productId\r\n enabled\r\n languageCode\r\n name\r\n price\r\n currencyCode\r\n priceWithTax\r\n trackInventory\r\n outOfStockThreshold\r\n stockLevels {\r\n id\r\n createdAt\r\n updatedAt\r\n stockLocationId\r\n stockOnHand\r\n stockAllocated\r\n stockLocation {\r\n id\r\n createdAt\r\n updatedAt\r\n name\r\n }\r\n }\r\n useGlobalOutOfStockThreshold\r\n sku\r\n featuredAsset {\r\n ...Asset\r\n }\r\n }\r\n\r\n ${ASSET_FRAGMENT}\r\n`;\r\n\r\nexport const PRODUCT_VARIANT_LIST_QUERY = gql`\r\n query ProductVariantListQuery($options: ProductVariantListOptions!) {\r\n productVariants(options: $options) {\r\n items {\r\n ...ProductVariantListQueryProductVariantFragment\r\n }\r\n totalItems\r\n }\r\n }\r\n ${PRODUCT_VARIANT_LIST_QUERY_PRODUCT_VARIANT_FRAGMENT}\r\n`;\r\n"],"x_google_ignoreList":[67]}
|