@cyberluke/three-particles 4.0.1
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/LICENSE +21 -0
- package/README.md +197 -0
- package/dist/index.d.ts +2970 -0
- package/dist/index.js +3138 -0
- package/dist/index.js.map +1 -0
- package/dist/three-particles.min.js +1 -0
- package/dist/three-particles.min.js.map +1 -0
- package/dist/webgpu.js +2522 -0
- package/dist/webgpu.js.map +1 -0
- package/llms-full.txt +1005 -0
- package/llms.txt +339 -0
- package/package.json +111 -0
- package/webgpu.d.ts +98 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/js/effects/three-particles/version.ts","../src/js/effects/three-particles/color-utils.ts","../src/js/effects/three-particles/three-particles-bezier.ts","../src/js/effects/three-particles/three-particles-curves.ts","../src/js/effects/three-particles/three-particles-enums.ts","../src/js/effects/three-particles/three-particles-constants.ts","../src/js/effects/three-particles/three-particles-utils.ts","../src/js/effects/three-particles/three-particles-modifiers.ts","../src/js/effects/three-particles/three-particles-renderer-detect.ts","../src/js/effects/three-particles/three-particles.ts","../src/js/effects/three-particles/three-particles-serialization.ts"],"names":["CurveFunctionId","SimulationSpace","Shape","EmitFrom","TimeMode","LifeTimeCurve","SubEmitterTrigger","ForceFieldType","RendererType","ForceFieldFalloff","CollisionPlaneMode","SimulationBackend","THREE","THREE2","n","posIdx","px","py","pz","THREE4"],"mappings":";;;;;;AAaO,IAAM,QAAA,GAEP,OAAA;AAGN,IAAI,OAAO,eAAe,WAAA,EAAa;AACrC,EAAA,MAAM,CAAA,GAAI,UAAA;AACV,EAAA,IAAI,CAAA,CAAE,mBAAA,IAAuB,CAAA,CAAE,mBAAA,KAAwB,QAAA,EAAU;AAE/D,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN;AAAA,KACF;AAAA,EACF,CAAA,MAAO;AACL,IAAA,CAAA,CAAE,mBAAA,GAAsB,QAAA;AAAA,EAC1B;AACF;;;AClBO,IAAM,YAAA,GAAe,CAAC,CAAA,KAC3B,CAAA,GAAI,OAAA,GAAU,CAAA,GAAI,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAA,CAAK,CAAA,GAAI,KAAA,IAAS,KAAA,EAAO,GAAG;AAOtD,IAAM,YAAA,GAAe,CAAC,CAAA,KAC3B,CAAA,GAAI,QAAA,GAAY,CAAA,GAAI,KAAA,GAAQ,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,GAAI,GAAG,CAAA,GAAI;AAStD,IAAM,eAAA,GAAkB,CAAC,CAAA,MAIY;AAAA,EAC1C,CAAA,EAAG,YAAA,CAAa,CAAA,CAAE,CAAA,IAAK,CAAC,CAAA;AAAA,EACxB,CAAA,EAAG,YAAA,CAAa,CAAA,CAAE,CAAA,IAAK,CAAC,CAAA;AAAA,EACxB,CAAA,EAAG,YAAA,CAAa,CAAA,CAAE,CAAA,IAAK,CAAC;AAC1B,CAAA;;;AClCA,IAAM,QAID,EAAC;AAEN,IAAM,GAAA,GAAM,CAAC,CAAA,EAAW,CAAA,KAAc;AACpC,EAAA,IAAI,CAAA,GAAI,CAAA;AACR,EAAA,KAAA,IAAS,CAAA,GAAI,GAAG,CAAA,IAAK,CAAA,EAAG,KAAK,CAAA,IAAA,CAAM,CAAA,GAAI,IAAI,CAAA,IAAK,CAAA;AAChD,EAAA,OAAO,CAAA;AACT,CAAA;AAEO,IAAM,yBAAA,GAA4B,CACvC,gBAAA,EACA,YAAA,KACG;AACH,EAAA,MAAM,aAAa,KAAA,CAAM,IAAA,CAAK,CAAC,IAAA,KAAS,IAAA,CAAK,iBAAiB,YAAY,CAAA;AAE1E,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,IAAI,CAAC,UAAA,CAAW,YAAA,CAAa,QAAA,CAAS,gBAAgB,CAAA;AACpD,MAAA,UAAA,CAAW,YAAA,CAAa,KAAK,gBAAgB,CAAA;AAC/C,IAAA,OAAO,UAAA,CAAW,aAAA;AAAA,EACpB;AAEA,EAAA,MAAM,KAAA,GAAQ;AAAA,IACZ,YAAA,EAAc,CAAC,gBAAgB,CAAA;AAAA,IAC/B,YAAA;AAAA,IACA,aAAA,EAAe,CAAC,UAAA,KAA+B;AAC7C,MAAA,IAAI,UAAA,GAAa,CAAA,EAAG,OAAO,YAAA,CAAa,CAAC,CAAA,CAAE,CAAA;AAC3C,MAAA,IAAI,aAAa,CAAA,EAAG,OAAO,aAAa,YAAA,CAAa,MAAA,GAAS,CAAC,CAAA,CAAE,CAAA;AAEjE,MAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,MAAA,IAAI,IAAA,GAAO,aAAa,MAAA,GAAS,CAAA;AAIjC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,YAAA,CAAa,QAAQ,CAAA,EAAA,EAAK;AAC5C,QAAA,MAAM,KAAA,GAAQ,aAAa,CAAC,CAAA;AAC5B,QAAA,IAAI,UAAA,IAAc,KAAA,CAAM,UAAA,IAAc,CAAA,CAAA,EAAI;AACxC,UAAA,IAAA,GAAO,CAAA;AACP,UAAA;AAAA,QACF;AACA,QAAA,IAAI,KAAA,CAAM,UAAA,KAAe,MAAA,EAAW,KAAA,GAAQ,CAAA;AAAA,MAC9C;AAEA,MAAA,MAAM,IAAI,IAAA,GAAO,KAAA;AACjB,MAAA,MAAM,oBAAA,GAAA,CACH,UAAA,IAAc,YAAA,CAAa,KAAK,EAAE,UAAA,IAAc,CAAA,CAAA,KAAA,CAC/C,YAAA,CAAa,IAAI,EAAE,UAAA,IAAc,CAAA,KAChC,YAAA,CAAa,KAAK,EAAE,UAAA,IAAc,CAAA,CAAA,CAAA;AAEvC,MAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,IAAK,CAAA,EAAG,CAAA,EAAA,EAAK;AAC3B,QAAA,MAAM,CAAA,GAAI,YAAA,CAAa,KAAA,GAAQ,CAAC,CAAA;AAChC,QAAA,MAAM,CAAA,GACJ,GAAA,CAAI,CAAA,EAAG,CAAC,IACR,IAAA,CAAK,GAAA,CAAI,CAAA,GAAI,oBAAA,EAAsB,IAAI,CAAC,CAAA,GACxC,IAAA,CAAK,GAAA,CAAI,sBAAsB,CAAC,CAAA;AAClC,QAAA,KAAA,IAAS,IAAI,CAAA,CAAE,CAAA;AAAA,MACjB;AACA,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,GACF;AAEA,EAAA,KAAA,CAAM,KAAK,KAAK,CAAA;AAChB,EAAA,OAAO,KAAA,CAAM,aAAA;AACf;AAEO,IAAM,yBAAA,GAA4B,CAAC,gBAAA,KAA6B;AACrE,EAAA,OAAO,IAAA,EAAM;AACX,IAAA,MAAM,QAAQ,KAAA,CAAM,SAAA;AAAA,MAAU,CAAC,IAAA,KAC7B,IAAA,CAAK,YAAA,CAAa,SAAS,gBAAgB;AAAA,KAC7C;AACA,IAAA,IAAI,UAAU,EAAA,EAAI;AAClB,IAAA,MAAM,KAAA,GAAQ,MAAM,KAAK,CAAA;AACzB,IAAA,KAAA,CAAM,YAAA,GAAe,MAAM,YAAA,CAAa,MAAA;AAAA,MACtC,CAAC,OAAO,EAAA,KAAO;AAAA,KACjB;AACA,IAAA,IAAI,MAAM,YAAA,CAAa,MAAA,KAAW,GAAG,KAAA,CAAM,MAAA,CAAO,OAAO,CAAC,CAAA;AAAA,EAC5D;AACF;AAEO,IAAM,kBAAA,GAAqB,MAAM,KAAA,CAAM;ACnEvC,IAAW,eAAA,qBAAAA,gBAAAA,KAAX;AAEL,EAAAA,iBAAA,QAAA,CAAA,GAAS,QAAA;AAGT,EAAAA,iBAAA,QAAA,CAAA,GAAS,QAAA;AAGT,EAAAA,iBAAA,cAAA,CAAA,GAAe,cAAA;AAEf,EAAAA,iBAAA,eAAA,CAAA,GAAgB,eAAA;AAEhB,EAAAA,iBAAA,kBAAA,CAAA,GAAmB,kBAAA;AAGnB,EAAAA,iBAAA,UAAA,CAAA,GAAW,UAAA;AAEX,EAAAA,iBAAA,WAAA,CAAA,GAAY,WAAA;AAEZ,EAAAA,iBAAA,cAAA,CAAA,GAAe,cAAA;AAGf,EAAAA,iBAAA,YAAA,CAAA,GAAa,YAAA;AAEb,EAAAA,iBAAA,aAAA,CAAA,GAAc,aAAA;AAEd,EAAAA,iBAAA,gBAAA,CAAA,GAAiB,gBAAA;AAGjB,EAAAA,iBAAA,YAAA,CAAA,GAAa,YAAA;AAEb,EAAAA,iBAAA,aAAA,CAAA,GAAc,aAAA;AAEd,EAAAA,iBAAA,gBAAA,CAAA,GAAiB,gBAAA;AAGjB,EAAAA,iBAAA,eAAA,CAAA,GAAgB,eAAA;AAEhB,EAAAA,iBAAA,gBAAA,CAAA,GAAiB,gBAAA;AAEjB,EAAAA,iBAAA,mBAAA,CAAA,GAAoB,mBAAA;AAGpB,EAAAA,iBAAA,gBAAA,CAAA,GAAiB,gBAAA;AAEjB,EAAAA,iBAAA,iBAAA,CAAA,GAAkB,iBAAA;AAElB,EAAAA,iBAAA,oBAAA,CAAA,GAAqB,oBAAA;AAGrB,EAAAA,iBAAA,aAAA,CAAA,GAAc,aAAA;AAEd,EAAAA,iBAAA,cAAA,CAAA,GAAe,cAAA;AAEf,EAAAA,iBAAA,iBAAA,CAAA,GAAkB,iBAAA;AAGlB,EAAAA,iBAAA,YAAA,CAAA,GAAa,YAAA;AAEb,EAAAA,iBAAA,aAAA,CAAA,GAAc,aAAA;AAEd,EAAAA,iBAAA,gBAAA,CAAA,GAAiB,gBAAA;AAGjB,EAAAA,iBAAA,SAAA,CAAA,GAAU,SAAA;AAEV,EAAAA,iBAAA,UAAA,CAAA,GAAW,UAAA;AAEX,EAAAA,iBAAA,aAAA,CAAA,GAAc,aAAA;AAGd,EAAAA,iBAAA,WAAA,CAAA,GAAY,WAAA;AAEZ,EAAAA,iBAAA,YAAA,CAAA,GAAa,YAAA;AAEb,EAAAA,iBAAA,eAAA,CAAA,GAAgB,eAAA;AA3EA,EAAA,OAAAA,gBAAAA;AAAA,CAAA,EAAA,eAAA,IAAA,EAAA;AA8EX,IAAM,kBAAA,GAET;AAAA,EACF,CAAC,QAAA,gBAAyB,MAAA,CAAO,MAAA,CAAO,IAAA;AAAA,EACxC,CAAC,cAAA,sBAA+B,MAAA,CAAO,SAAA,CAAU,EAAA;AAAA,EACjD,CAAC,eAAA,uBAAgC,MAAA,CAAO,SAAA,CAAU,GAAA;AAAA,EAClD,CAAC,kBAAA,0BAAmC,MAAA,CAAO,SAAA,CAAU,KAAA;AAAA,EACrD,CAAC,UAAA,kBAA2B,MAAA,CAAO,KAAA,CAAM,EAAA;AAAA,EACzC,CAAC,WAAA,mBAA4B,MAAA,CAAO,KAAA,CAAM,GAAA;AAAA,EAC1C,CAAC,cAAA,sBAA+B,MAAA,CAAO,KAAA,CAAM,KAAA;AAAA,EAC7C,CAAC,YAAA,oBAA6B,MAAA,CAAO,OAAA,CAAQ,EAAA;AAAA,EAC7C,CAAC,aAAA,qBAA8B,MAAA,CAAO,OAAA,CAAQ,GAAA;AAAA,EAC9C,CAAC,gBAAA,wBAAiC,MAAA,CAAO,OAAA,CAAQ,KAAA;AAAA,EACjD,CAAC,YAAA,oBAA6B,MAAA,CAAO,OAAA,CAAQ,EAAA;AAAA,EAC7C,CAAC,aAAA,qBAA8B,MAAA,CAAO,OAAA,CAAQ,GAAA;AAAA,EAC9C,CAAC,gBAAA,wBAAiC,MAAA,CAAO,OAAA,CAAQ,KAAA;AAAA,EACjD,CAAC,eAAA,uBAAgC,MAAA,CAAO,UAAA,CAAW,EAAA;AAAA,EACnD,CAAC,gBAAA,wBAAiC,MAAA,CAAO,UAAA,CAAW,GAAA;AAAA,EACpD,CAAC,mBAAA,2BAAoC,MAAA,CAAO,UAAA,CAAW,KAAA;AAAA,EACvD,CAAC,gBAAA,wBAAiC,MAAA,CAAO,WAAA,CAAY,EAAA;AAAA,EACrD,CAAC,iBAAA,yBAAkC,MAAA,CAAO,WAAA,CAAY,GAAA;AAAA,EACtD,CAAC,oBAAA,4BAAqC,MAAA,CAAO,WAAA,CAAY,KAAA;AAAA,EACzD,CAAC,aAAA,qBAA8B,MAAA,CAAO,QAAA,CAAS,EAAA;AAAA,EAC/C,CAAC,cAAA,sBAA+B,MAAA,CAAO,QAAA,CAAS,GAAA;AAAA,EAChD,CAAC,iBAAA,yBAAkC,MAAA,CAAO,QAAA,CAAS,KAAA;AAAA,EACnD,CAAC,YAAA,oBAA6B,MAAA,CAAO,OAAA,CAAQ,EAAA;AAAA,EAC7C,CAAC,aAAA,qBAA8B,MAAA,CAAO,OAAA,CAAQ,GAAA;AAAA,EAC9C,CAAC,gBAAA,wBAAiC,MAAA,CAAO,OAAA,CAAQ,KAAA;AAAA,EACjD,CAAC,SAAA,iBAA0B,MAAA,CAAO,IAAA,CAAK,EAAA;AAAA,EACvC,CAAC,UAAA,kBAA2B,MAAA,CAAO,IAAA,CAAK,GAAA;AAAA,EACxC,CAAC,aAAA,qBAA8B,MAAA,CAAO,IAAA,CAAK,KAAA;AAAA,EAC3C,CAAC,WAAA,mBAA4B,MAAA,CAAO,MAAA,CAAO,EAAA;AAAA,EAC3C,CAAC,YAAA,oBAA6B,MAAA,CAAO,MAAA,CAAO,GAAA;AAAA,EAC5C,CAAC,eAAA,uBAAgC,MAAA,CAAO,MAAA,CAAO;AACjD;AA2BO,IAAM,gBAAA,GAAmB,CAC9B,eAAA,KAEA,OAAO,oBAAoB,UAAA,GACvB,eAAA,GACA,mBAAmB,eAAe;;;AC5JjC,IAAW,eAAA,qBAAAC,gBAAAA,KAAX;AAML,EAAAA,iBAAA,OAAA,CAAA,GAAQ,OAAA;AAOR,EAAAA,iBAAA,OAAA,CAAA,GAAQ,OAAA;AAbQ,EAAA,OAAAA,gBAAAA;AAAA,CAAA,EAAA,eAAA,IAAA,EAAA;AAqBX,IAAW,KAAA,qBAAAC,MAAAA,KAAX;AAKL,EAAAA,OAAA,QAAA,CAAA,GAAS,QAAA;AAOT,EAAAA,OAAA,MAAA,CAAA,GAAO,MAAA;AAOP,EAAAA,OAAA,KAAA,CAAA,GAAM,KAAA;AAON,EAAAA,OAAA,QAAA,CAAA,GAAS,QAAA;AAOT,EAAAA,OAAA,WAAA,CAAA,GAAY,WAAA;AAjCI,EAAA,OAAAA,MAAAA;AAAA,CAAA,EAAA,KAAA,IAAA,EAAA;AA0CX,IAAW,QAAA,qBAAAC,SAAAA,KAAX;AAKL,EAAAA,UAAA,QAAA,CAAA,GAAS,QAAA;AAMT,EAAAA,UAAA,OAAA,CAAA,GAAQ,OAAA;AAMR,EAAAA,UAAA,MAAA,CAAA,GAAO,MAAA;AAjBS,EAAA,OAAAA,SAAAA;AAAA,CAAA,EAAA,QAAA,IAAA,EAAA;AAyBX,IAAW,QAAA,qBAAAC,SAAAA,KAAX;AAKL,EAAAA,UAAA,UAAA,CAAA,GAAW,UAAA;AAMX,EAAAA,UAAA,KAAA,CAAA,GAAM,KAAA;AAXU,EAAA,OAAAA,SAAAA;AAAA,CAAA,EAAA,QAAA,IAAA,EAAA;AAmBX,IAAW,aAAA,qBAAAC,cAAAA,KAAX;AAML,EAAAA,eAAA,QAAA,CAAA,GAAS,QAAA;AAOT,EAAAA,eAAA,QAAA,CAAA,GAAS,QAAA;AAbO,EAAA,OAAAA,cAAAA;AAAA,CAAA,EAAA,aAAA,IAAA,EAAA;AAqBX,IAAW,iBAAA,qBAAAC,kBAAAA,KAAX;AAKL,EAAAA,mBAAA,OAAA,CAAA,GAAQ,OAAA;AAMR,EAAAA,mBAAA,OAAA,CAAA,GAAQ,OAAA;AAXQ,EAAA,OAAAA,kBAAAA;AAAA,CAAA,EAAA,iBAAA,IAAA,EAAA;AAmBX,IAAW,cAAA,qBAAAC,eAAAA,KAAX;AAML,EAAAA,gBAAA,OAAA,CAAA,GAAQ,OAAA;AAMR,EAAAA,gBAAA,aAAA,CAAA,GAAc,aAAA;AAZE,EAAA,OAAAA,eAAAA;AAAA,CAAA,EAAA,cAAA,IAAA,EAAA;AAoBX,IAAW,YAAA,qBAAAC,aAAAA,KAAX;AAML,EAAAA,cAAA,QAAA,CAAA,GAAS,QAAA;AAQT,EAAAA,cAAA,WAAA,CAAA,GAAY,WAAA;AAYZ,EAAAA,cAAA,OAAA,CAAA,GAAQ,OAAA;AAiBR,EAAAA,cAAA,MAAA,CAAA,GAAO,MAAA;AA3CS,EAAA,OAAAA,aAAAA;AAAA,CAAA,EAAA,YAAA,IAAA,EAAA;AAoDX,IAAW,iBAAA,qBAAAC,kBAAAA,KAAX;AAIL,EAAAA,mBAAA,MAAA,CAAA,GAAO,MAAA;AAKP,EAAAA,mBAAA,QAAA,CAAA,GAAS,QAAA;AAMT,EAAAA,mBAAA,WAAA,CAAA,GAAY,WAAA;AAfI,EAAA,OAAAA,kBAAAA;AAAA,CAAA,EAAA,iBAAA,IAAA,EAAA;AAuBX,IAAW,kBAAA,qBAAAC,mBAAAA,KAAX;AAML,EAAAA,oBAAA,MAAA,CAAA,GAAO,MAAA;AAOP,EAAAA,oBAAA,OAAA,CAAA,GAAQ,OAAA;AAOR,EAAAA,oBAAA,QAAA,CAAA,GAAS,QAAA;AApBO,EAAA,OAAAA,mBAAAA;AAAA,CAAA,EAAA,kBAAA,IAAA,EAAA;AA4BX,IAAW,iBAAA,qBAAAC,kBAAAA,KAAX;AAUL,EAAAA,mBAAA,MAAA,CAAA,GAAO,MAAA;AAMP,EAAAA,mBAAA,KAAA,CAAA,GAAM,KAAA;AAON,EAAAA,mBAAA,KAAA,CAAA,GAAM,KAAA;AAvBU,EAAA,OAAAA,kBAAAA;AAAA,CAAA,EAAA,iBAAA,IAAA,EAAA;;;ACrQX,IAAM,aAAA,GAAgB;AAGtB,IAAM,WAAA,GAAc;AAGpB,IAAM,UAAA,GAAa;AAGnB,IAAM,gBAAA,GAAmB;AAGzB,IAAM,aAAA,GAAgB;AAGtB,IAAM,MAAA,GAAS;AAGf,IAAM,UAAA,GAAa;AAGnB,IAAM,SAAA,GAAY;AAGlB,IAAM,SAAA,GAAY;AAGlB,IAAM,SAAA,GAAY;AAGlB,IAAM,SAAA,GAAY;ACXlB,IAAM,0CAAA,GAA6C,CACxD,QAAA,EACA,UAAA,EACA,UACA,KAAA,EACA;AAAA,EACE,MAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAA,KACG;AACH,EAAA,MAAM,CAAA,GAAI,IAAA,CAAK,MAAA,EAAO,IAAK,GAAA,GAAM,GAAA,CAAA;AACjC,EAAA,MAAM,CAAA,GAAI,KAAK,MAAA,EAAO;AACtB,EAAA,MAAM,uBAAA,GAA0B,KAAK,MAAA,EAAO;AAC5C,EAAA,MAAM,KAAA,GAAQ,CAAA,GAAI,IAAA,CAAK,EAAA,GAAK,CAAA;AAC5B,EAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,CAAA,GAAI,IAAI,CAAC,CAAA;AAC/B,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAE3B,EAAA,MAAM,UAAA,GAAa,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AAC1C,EAAA,MAAM,UAAA,GAAa,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AAC1C,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AAC/B,EAAA,MAAM,sBAAsB,CAAA,GAAI,eAAA;AAEhC,EAAA,QAAA,CAAS,IACP,MAAA,GAAS,mBAAA,GAAsB,UAAA,GAC/B,MAAA,GAAS,kBAAkB,uBAAA,GAA0B,UAAA;AACvD,EAAA,QAAA,CAAS,IACP,MAAA,GAAS,mBAAA,GAAsB,UAAA,GAC/B,MAAA,GAAS,kBAAkB,uBAAA,GAA0B,UAAA;AACvD,EAAA,QAAA,CAAS,IACP,MAAA,GAAS,mBAAA,GAAsB,UAAA,GAC/B,MAAA,GAAS,kBAAkB,uBAAA,GAA0B,UAAA;AAEvD,EAAA,QAAA,CAAS,gBAAgB,UAAU,CAAA;AAEnC,EAAA,MAAM,yBAAA,GAA4B,CAAA,GAAI,QAAA,CAAS,MAAA,EAAO;AACtD,EAAA,QAAA,CAAS,GAAA;AAAA,IACP,QAAA,CAAS,IAAI,yBAAA,GAA4B,KAAA;AAAA,IACzC,QAAA,CAAS,IAAI,yBAAA,GAA4B,KAAA;AAAA,IACzC,QAAA,CAAS,IAAI,yBAAA,GAA4B;AAAA,GAC3C;AACA,EAAA,QAAA,CAAS,gBAAgB,UAAU,CAAA;AACrC;AA4BO,IAAM,wCAAA,GAA2C,CACtD,QAAA,EACA,UAAA,EACA,UACA,KAAA,EACA;AAAA,EACE,MAAA;AAAA,EACA,eAAA;AAAA,EACA,GAAA;AAAA,EACA,KAAA,GAAQ;AACV,CAAA,KAMG;AACH,EAAA,MAAM,QAAQ,CAAA,GAAI,IAAA,CAAK,KAAK,IAAA,CAAK,MAAA,MAAY,GAAA,GAAM,GAAA,CAAA;AACnD,EAAA,MAAM,uBAAA,GAA0B,KAAK,MAAA,EAAO;AAE5C,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AACjC,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AACjC,EAAA,MAAM,sBAAsB,CAAA,GAAI,eAAA;AAEhC,EAAA,QAAA,CAAS,IACP,MAAA,GAAS,mBAAA,GAAsB,UAAA,GAC/B,MAAA,GAAS,kBAAkB,uBAAA,GAA0B,UAAA;AACvD,EAAA,QAAA,CAAS,IACP,MAAA,GAAS,mBAAA,GAAsB,UAAA,GAC/B,MAAA,GAAS,kBAAkB,uBAAA,GAA0B,UAAA;AACvD,EAAA,QAAA,CAAS,CAAA,GAAI,CAAA;AAEb,EAAA,QAAA,CAAS,gBAAgB,UAAU,CAAA;AAEnC,EAAA,MAAM,cAAA,GAAiB,SAAS,MAAA,EAAO;AACvC,EAAA,MAAM,kBAAkB,IAAA,CAAK,GAAA;AAAA,IAC1B,cAAA,GAAiB,MAAA,GAAgBC,MAAA,CAAA,SAAA,CAAU,QAAA,CAAS,KAAK;AAAA,GAC5D;AACA,EAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,GAAA,CAAI,eAAe,CAAA;AAEnD,EAAA,MAAM,4BAA4B,CAAA,GAAI,cAAA;AACtC,EAAA,QAAA,CAAS,GAAA;AAAA,IACP,QAAA,CAAS,CAAA,GAAI,kBAAA,GAAqB,yBAAA,GAA4B,KAAA;AAAA,IAC9D,QAAA,CAAS,CAAA,GAAI,kBAAA,GAAqB,yBAAA,GAA4B,KAAA;AAAA,IAC9D,IAAA,CAAK,GAAA,CAAI,eAAe,CAAA,GAAI;AAAA,GAC9B;AACA,EAAA,QAAA,CAAS,gBAAgB,UAAU,CAAA;AACrC;AA6BO,IAAM,uCAAA,GAA0C,CACrD,QAAA,EACA,UAAA,EACA,UACA,KAAA,EACA,EAAE,KAAA,EAAO,QAAA,EAAS,KACf;AACH,EAAA,MAAM,MAAA,GAAS,KAAA;AACf,EAAA,QAAQ,QAAA;AAAU,IAChB,KAAA,QAAA;AACE,MAAA,QAAA,CAAS,IAAI,IAAA,CAAK,MAAA,KAAW,MAAA,CAAO,CAAA,GAAI,OAAO,CAAA,GAAI,CAAA;AACnD,MAAA,QAAA,CAAS,IAAI,IAAA,CAAK,MAAA,KAAW,MAAA,CAAO,CAAA,GAAI,OAAO,CAAA,GAAI,CAAA;AACnD,MAAA,QAAA,CAAS,IAAI,IAAA,CAAK,MAAA,KAAW,MAAA,CAAO,CAAA,GAAI,OAAO,CAAA,GAAI,CAAA;AACnD,MAAA;AAAA,IAEF,KAAA,OAAA;AACE,MAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,KAAW,CAAC,CAAA;AACzC,MAAA,MAAM,oBAAoB,IAAA,GAAO,CAAA;AACjC,MAAA,MAAM,cAAc,EAAC;AACrB,MAAA,WAAA,CAAY,iBAAiB,CAAA,GAAI,IAAA,GAAO,CAAA,GAAI,CAAA,GAAI,CAAA;AAChD,MAAA,WAAA,CAAA,CAAa,iBAAA,GAAoB,CAAA,IAAK,CAAC,CAAA,GAAI,KAAK,MAAA,EAAO;AACvD,MAAA,WAAA,CAAA,CAAa,iBAAA,GAAoB,CAAA,IAAK,CAAC,CAAA,GAAI,KAAK,MAAA,EAAO;AACvD,MAAA,QAAA,CAAS,IAAI,WAAA,CAAY,CAAC,IAAI,MAAA,CAAO,CAAA,GAAI,OAAO,CAAA,GAAI,CAAA;AACpD,MAAA,QAAA,CAAS,IAAI,WAAA,CAAY,CAAC,IAAI,MAAA,CAAO,CAAA,GAAI,OAAO,CAAA,GAAI,CAAA;AACpD,MAAA,QAAA,CAAS,IAAI,WAAA,CAAY,CAAC,IAAI,MAAA,CAAO,CAAA,GAAI,OAAO,CAAA,GAAI,CAAA;AACpD,MAAA;AAAA,IAEF,KAAA,MAAA;AACE,MAAA,MAAM,QAAQ,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,KAAW,CAAC,CAAA;AAC1C,MAAA,MAAM,qBAAqB,KAAA,GAAQ,CAAA;AACnC,MAAA,MAAM,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,KAAW,CAAC,CAAA;AACzC,MAAA,MAAM,aAAa,EAAC;AACpB,MAAA,UAAA,CAAW,kBAAkB,CAAA,GAAI,KAAA,GAAQ,CAAA,GAAI,CAAA,GAAI,CAAA;AACjD,MAAA,UAAA,CAAA,CAAY,kBAAA,GAAqB,KAAK,CAAC,CAAA,GACrC,OAAO,CAAA,GAAI,IAAA,CAAK,MAAA,EAAO,GAAI,IAAA,GAAO,CAAA;AACpC,MAAA,UAAA,CAAA,CAAY,kBAAA,GAAqB,KAAK,CAAC,CAAA,GACrC,OAAO,CAAA,GAAI,IAAA,GAAO,KAAK,MAAA,EAAO;AAChC,MAAA,QAAA,CAAS,IAAI,UAAA,CAAW,CAAC,IAAI,MAAA,CAAO,CAAA,GAAI,OAAO,CAAA,GAAI,CAAA;AACnD,MAAA,QAAA,CAAS,IAAI,UAAA,CAAW,CAAC,IAAI,MAAA,CAAO,CAAA,GAAI,OAAO,CAAA,GAAI,CAAA;AACnD,MAAA,QAAA,CAAS,IAAI,UAAA,CAAW,CAAC,IAAI,MAAA,CAAO,CAAA,GAAI,OAAO,CAAA,GAAI,CAAA;AACnD,MAAA;AAAA;AAGJ,EAAA,QAAA,CAAS,gBAAgB,UAAU,CAAA;AAEnC,EAAA,QAAA,CAAS,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA;AACxB,EAAA,QAAA,CAAS,gBAAgB,UAAU,CAAA;AACrC;AA0BO,IAAM,0CAAA,GAA6C,CACxD,QAAA,EACA,UAAA,EACA,UACA,KAAA,EACA;AAAA,EACE,MAAA;AAAA,EACA,eAAA;AAAA,EACA;AACF,CAAA,KACG;AACH,EAAA,MAAM,QAAQ,CAAA,GAAI,IAAA,CAAK,KAAK,IAAA,CAAK,MAAA,MAAY,GAAA,GAAM,GAAA,CAAA;AACnD,EAAA,MAAM,uBAAA,GAA0B,KAAK,MAAA,EAAO;AAE5C,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AACjC,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,KAAK,CAAA;AACjC,EAAA,MAAM,sBAAsB,CAAA,GAAI,eAAA;AAEhC,EAAA,QAAA,CAAS,IACP,MAAA,GAAS,mBAAA,GAAsB,UAAA,GAC/B,MAAA,GAAS,kBAAkB,uBAAA,GAA0B,UAAA;AACvD,EAAA,QAAA,CAAS,IACP,MAAA,GAAS,mBAAA,GAAsB,UAAA,GAC/B,MAAA,GAAS,kBAAkB,uBAAA,GAA0B,UAAA;AACvD,EAAA,QAAA,CAAS,CAAA,GAAI,CAAA;AAEb,EAAA,QAAA,CAAS,gBAAgB,UAAU,CAAA;AAEnC,EAAA,MAAM,cAAA,GAAiB,SAAS,MAAA,EAAO;AACvC,EAAA,MAAM,4BAA4B,CAAA,GAAI,cAAA;AACtC,EAAA,QAAA,CAAS,GAAA;AAAA,IACP,QAAA,CAAS,IAAI,yBAAA,GAA4B,KAAA;AAAA,IACzC,QAAA,CAAS,IAAI,yBAAA,GAA4B,KAAA;AAAA,IACzC;AAAA,GACF;AACA,EAAA,QAAA,CAAS,gBAAgB,UAAU,CAAA;AACrC;AA0BO,IAAM,6CAAA,GAAgD,CAC3D,QAAA,EACA,UAAA,EACA,UACA,KAAA,EACA,EAAE,QAAA,EAAU,KAAA,EAAM,KACf;AACH,EAAA,MAAM,MAAA,GAAS,KAAA;AACf,EAAA,MAAM,SAAA,GAAY,QAAA;AAElB,EAAA,MAAM,UAAU,IAAA,CAAK,MAAA,KAAW,MAAA,CAAO,CAAA,GAAI,OAAO,CAAA,GAAI,CAAA;AACtD,EAAA,MAAM,UAAU,IAAA,CAAK,MAAA,KAAW,MAAA,CAAO,CAAA,GAAI,OAAO,CAAA,GAAI,CAAA;AACtD,EAAA,MAAM,SAAA,GAAkBA,MAAA,CAAA,SAAA,CAAU,QAAA,CAAS,SAAA,CAAU,CAAC,CAAA;AACtD,EAAA,MAAM,SAAA,GAAkBA,MAAA,CAAA,SAAA,CAAU,QAAA,CAAS,SAAA,CAAU,CAAC,CAAA;AACtD,EAAA,QAAA,CAAS,CAAA,GAAI,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA;AACzC,EAAA,QAAA,CAAS,CAAA,GAAI,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA;AACzC,EAAA,QAAA,CAAS,CAAA,GAAI,UAAU,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA,GAAI,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,SAAS,CAAA;AAEzE,EAAA,QAAA,CAAS,gBAAgB,UAAU,CAAA;AAEnC,EAAA,QAAA,CAAS,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,KAAK,CAAA;AACxB,EAAA,QAAA,CAAS,gBAAgB,UAAU,CAAA;AACrC;AAQO,IAAM,2BAA2B,MAAkC;AACxE,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,IAAA,MAAA,CAAO,KAAA,GAAQ,CAAA;AACf,IAAA,MAAA,CAAO,MAAA,GAAS,CAAA;AAChB,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AACtC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,OAAA,CAAQ,SAAA,GAAY,OAAA;AACpB,MAAA,OAAA,CAAQ,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAC3B,MAAA,MAAM,OAAA,GAAU,IAAUA,MAAA,CAAA,aAAA,CAAc,MAAM,CAAA;AAC9C,MAAA,OAAA,CAAQ,WAAA,GAAc,IAAA;AACtB,MAAA,OAAO,OAAA;AAAA,IACT;AACA,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAMO,IAAM,+BAA+B,MAAkC;AAC5E,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,IAAA,MAAM,IAAA,GAAO,EAAA;AACb,IAAA,MAAA,CAAO,KAAA,GAAQ,IAAA;AACf,IAAA,MAAA,CAAO,MAAA,GAAS,IAAA;AAChB,IAAA,MAAM,OAAA,GAAU,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AACtC,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,UAAU,IAAA,GAAO,CAAA;AACvB,MAAA,MAAM,UAAU,IAAA,GAAO,CAAA;AACvB,MAAA,MAAM,MAAA,GAAS,OAAO,CAAA,GAAI,CAAA;AAE1B,MAAA,OAAA,CAAQ,SAAA,EAAU;AAClB,MAAA,OAAA,CAAQ,GAAA,CAAI,SAAS,OAAA,EAAS,MAAA,EAAQ,GAAG,CAAA,GAAI,IAAA,CAAK,IAAI,KAAK,CAAA;AAC3D,MAAA,OAAA,CAAQ,SAAA,GAAY,OAAA;AACpB,MAAA,OAAA,CAAQ,IAAA,EAAK;AACb,MAAA,MAAM,OAAA,GAAU,IAAUA,MAAA,CAAA,aAAA,CAAc,MAAM,CAAA;AAC9C,MAAA,OAAA,CAAQ,WAAA,GAAc,IAAA;AACtB,MAAA,OAAO,OAAA;AAAA,IACT,CAAA,MAAO;AAEL,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN;AAAA,OACF;AACA,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,SAAS,KAAA,EAAO;AAGd,IAAA,OAAA,CAAQ,IAAA,CAAK,4CAA4C,KAAK,CAAA;AAC9D,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAEO,IAAM,eAAA,GAAkB,CAC7B,KAAA,KAC2B;AAC3B,EAAA,OAAO,OAAO,KAAA,KAAU,QAAA,IAAY,MAAA,IAAU,KAAA;AAChD;AAEO,IAAM,0BAAA,GAA6B,CACxC,gBAAA,EACA,aAAA,KACG;AACH,EAAA,IAAI,cAAc,IAAA,KAAA,QAAA,eAA+B;AAC/C,IAAA,OAAO,yBAAA;AAAA,MACL,gBAAA;AAAA,MACA,aAAA,CAAc;AAAA,KAChB;AAAA,EACF;AAEA,EAAA,IAAI,cAAc,IAAA,KAAA,QAAA,eAA+B;AAC/C,IAAA,OAAO,aAAA,CAAc,aAAA;AAAA,EACvB;AAKA,EAAA,MAAM,GAAA,GAAM,aAAA;AAIZ,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,YAAY,CAAA,EAAG;AACnC,IAAA,OAAO,yBAAA;AAAA,MACL,gBAAA;AAAA,MACA,GAAA,CAAI;AAAA,KACN;AAAA,EACF;AACA,EAAA,IAAI,OAAO,GAAA,CAAI,aAAA,KAAkB,UAAA,EAAY;AAC3C,IAAA,OAAO,GAAA,CAAI,aAAA;AAAA,EACb;AAEA,EAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,aAAa,CAAA,CAAE,CAAA;AAC5D;AAEO,IAAM,cAAA,GAAiB,CAC5B,gBAAA,EACA,KAAA,EACA,OAAe,CAAA,KACJ;AACX,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,KAAA,IAAS,KAAA,IAAS,KAAA,IAAS,KAAA,EAAO;AACpC,IAAA,IAAI,KAAA,CAAM,GAAA,KAAQ,KAAA,CAAM,GAAA,EAAK;AAC3B,MAAA,OAAO,MAAM,GAAA,IAAO,CAAA;AAAA,IACtB;AACA,IAAA,OAAaA,iBAAU,SAAA,CAAU,KAAA,CAAM,OAAO,CAAA,EAAG,KAAA,CAAM,OAAO,CAAC,CAAA;AAAA,EACjE;AAEA,EAAA,MAAM,aAAA,GAAgB,KAAA;AACtB,EAAA,OACE,2BAA2B,gBAAA,EAAkB,aAAa,EAAE,IAAI,CAAA,IAC/D,cAAc,KAAA,IAAS,CAAA,CAAA;AAE5B;;;AC7bA,IAAM,UAAA,GAAa,IAAUC,MAAA,CAAA,OAAA,CAAQ,CAAA,EAAG,GAAG,CAAC,CAAA;AAC5C,IAAM,YAAA,GAAe,IAAUA,MAAA,CAAA,KAAA,EAAM;AAgE9B,IAAM,iBAAiB,CAAC;AAAA,EAC7B,KAAA;AAAA,EACA,WAAA;AAAA,EACA,gBAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,0BAAA;AAAA,EACA,aAAA;AAAA,EACA;AACF,CAAA,KAeM;AACJ,EAAA,MAAM;AAAA,IACJ,gBAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA,kBAAA;AAAA,IACA,mBAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF,GAAI,WAAA;AAEJ,EAAA,MAAM,gBAAgB,aAAA,GAAgB,CAAA;AACtC,EAAA,MAAM,WAAA,GAAc,WAAW,QAAA,CAAS,KAAA;AACxC,EAAA,MAAM,OAAO,aAAA,GAAgB,aAAA;AAE7B,EAAA,IAAI,kBAAA,EAAoB;AACtB,IAAA,MAAM,EAAE,KAAA,EAAO,cAAA,EAAe,GAAI,mBAAmB,aAAa,CAAA;AAElE,IAAA,MAAM,mBAAmB,cAAA,CAAe,CAAA,GACpC,eAAe,CAAA,CAAE,0BAA0B,IAC3C,KAAA,CAAM,CAAA;AAEV,IAAA,MAAM,mBAAmB,cAAA,CAAe,CAAA,GACpC,eAAe,CAAA,CAAE,0BAA0B,IAC3C,KAAA,CAAM,CAAA;AAEV,IAAA,MAAM,mBAAmB,cAAA,CAAe,CAAA,GACpC,eAAe,CAAA,CAAE,0BAA0B,IAC3C,KAAA,CAAM,CAAA;AAEV,IAAA,WAAA,CAAY,aAAa,KAAK,gBAAA,GAAmB,KAAA;AACjD,IAAA,WAAA,CAAY,aAAA,GAAgB,CAAC,CAAA,IAAK,gBAAA,GAAmB,KAAA;AACrD,IAAA,WAAA,CAAY,aAAA,GAAgB,CAAC,CAAA,IAAK,gBAAA,GAAmB,KAAA;AAErD,IAAA,IAAI,WAAA,cAAyB,QAAA,GAAW,IAAA;AAAA,SACnC,UAAA,CAAW,SAAS,WAAA,GAAc,IAAA;AAAA,EACzC;AAEA,EAAA,IAAI,mBAAA,EAAqB;AACvB,IAAA,MAAM,EAAE,KAAA,EAAO,cAAA,EAAgB,cAAA,EAAe,GAC5C,oBAAoB,aAAa,CAAA;AAEnC,IAAA,WAAA,CAAY,aAAa,KAAK,cAAA,CAAe,CAAA;AAC7C,IAAA,WAAA,CAAY,aAAA,GAAgB,CAAC,CAAA,IAAK,cAAA,CAAe,CAAA;AACjD,IAAA,WAAA,CAAY,aAAA,GAAgB,CAAC,CAAA,IAAK,cAAA,CAAe,CAAA;AAEjD,IAAA,MAAM,mBAAmB,cAAA,CAAe,CAAA,GACpC,eAAe,CAAA,CAAE,0BAA0B,IAC3C,KAAA,CAAM,CAAA;AAEV,IAAA,MAAM,mBAAmB,cAAA,CAAe,CAAA,GACpC,eAAe,CAAA,CAAE,0BAA0B,IAC3C,KAAA,CAAM,CAAA;AAEV,IAAA,MAAM,mBAAmB,cAAA,CAAe,CAAA,GACpC,eAAe,CAAA,CAAE,0BAA0B,IAC3C,KAAA,CAAM,CAAA;AAEV,IAAA,YAAA,CAAa,GAAA;AAAA,MACX,gBAAA,GAAmB,KAAA;AAAA,MACnB,gBAAA,GAAmB,KAAA;AAAA,MACnB,gBAAA,GAAmB;AAAA,KACrB;AACA,IAAA,cAAA,CAAe,WAAW,YAAY,CAAA;AAEtC,IAAA,WAAA,CAAY,aAAa,KAAK,cAAA,CAAe,CAAA;AAC7C,IAAA,WAAA,CAAY,aAAA,GAAgB,CAAC,CAAA,IAAK,cAAA,CAAe,CAAA;AACjD,IAAA,WAAA,CAAY,aAAA,GAAgB,CAAC,CAAA,IAAK,cAAA,CAAe,CAAA;AAEjD,IAAA,IAAI,WAAA,cAAyB,QAAA,GAAW,IAAA;AAAA,SACnC,UAAA,CAAW,SAAS,WAAA,GAAc,IAAA;AAAA,EACzC;AAOA,EAAA,IAAI,gBAAA,CAAiB,iBAAiB,QAAA,EAAU;AAC9C,IAAA,MAAM,aAAa,cAAA,EAAgB,IAAA,GAC/B,cAAA,CAAe,IAAA,CAAK,0BAA0B,CAAA,GAC9C,cAAA;AAAA,MACE,gBAAA;AAAA,MACA,iBAAiB,gBAAA,CAAiB,aAAA;AAAA,MAClC;AAAA,KACF;AACJ,IAAA,WAAA,CAAY,OAAO,MAAM,CAAA,GACvB,WAAA,CAAY,SAAA,CAAU,aAAa,CAAA,GAAI,UAAA;AAAA,EAC3C;AAEA,EAAA,IAAI,gBAAA,CAAiB,oBAAoB,QAAA,EAAU;AACjD,IAAA,MAAM,aAAa,cAAA,EAAgB,OAAA,GAC/B,cAAA,CAAe,OAAA,CAAQ,0BAA0B,CAAA,GACjD,cAAA;AAAA,MACE,gBAAA;AAAA,MACA,iBAAiB,mBAAA,CAAoB,aAAA;AAAA,MACrC;AAAA,KACF;AACJ,IAAA,WAAA,CAAY,OAAO,SAAS,CAAA,GAC1B,WAAA,CAAY,YAAA,CAAa,aAAa,CAAA,GAAI,UAAA;AAAA,EAC9C;AAEA,EAAA,IAAI,gBAAA,CAAiB,kBAAkB,QAAA,EAAU;AAC/C,IAAA,MAAM,cAAc,cAAA,EAAgB,MAAA,GAChC,cAAA,CAAe,MAAA,CAAO,0BAA0B,CAAA,GAChD,cAAA;AAAA,MACE,gBAAA;AAAA,MACA,iBAAiB,iBAAA,CAAkB,CAAA;AAAA,MACnC;AAAA,KACF;AACJ,IAAA,MAAM,cAAc,cAAA,EAAgB,MAAA,GAChC,cAAA,CAAe,MAAA,CAAO,0BAA0B,CAAA,GAChD,cAAA;AAAA,MACE,gBAAA;AAAA,MACA,iBAAiB,iBAAA,CAAkB,CAAA;AAAA,MACnC;AAAA,KACF;AACJ,IAAA,MAAM,cAAc,cAAA,EAAgB,MAAA,GAChC,cAAA,CAAe,MAAA,CAAO,0BAA0B,CAAA,GAChD,cAAA;AAAA,MACE,gBAAA;AAAA,MACA,iBAAiB,iBAAA,CAAkB,CAAA;AAAA,MACnC;AAAA,KACF;AAEJ,IAAA,WAAA,CAAY,OAAO,SAAS,CAAA,GAC1B,WAAA,CAAY,WAAA,CAAY,aAAa,CAAA,GAAI,WAAA;AAC3C,IAAA,WAAA,CAAY,OAAO,SAAS,CAAA,GAC1B,WAAA,CAAY,WAAA,CAAY,aAAa,CAAA,GAAI,WAAA;AAC3C,IAAA,WAAA,CAAY,OAAO,SAAS,CAAA,GAC1B,WAAA,CAAY,WAAA,CAAY,aAAa,CAAA,GAAI,WAAA;AAAA,EAC7C;AAEA,EAAA,IAAI,eAAe,oBAAA,EAAsB;AACvC,IAAA,WAAA,CAAY,OAAO,UAAU,CAAA,IAC3B,eAAe,oBAAA,CAAqB,aAAa,IAAI,KAAA,GAAQ,IAAA;AAAA,EACjE;AAEA,EAAA,IAAI,MAAM,QAAA,EAAU;AAClB,IAAA,MAAM;AAAA,MACJ,OAAA;AAAA,MACA,QAAA;AAAA,MACA,UAAA;AAAA,MACA,OAAA;AAAA,MACA,cAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACF,GAAI,KAAA;AACJ,IAAA,IAAI,eAAA;AAEJ,IAAA,MAAM,iBACH,0BAAA,IAA8B,OAAA,GAAU,QAAQ,aAAa,CAAA,GAAI,MAClE,EAAA,GACA,QAAA;AAEF,IAAA,UAAA,CAAW,GAAA,CAAI,aAAA,EAAe,CAAA,EAAG,CAAC,CAAA;AAClC,IAAA,eAAA,GAAkB,OAAA,CAAS,KAAK,UAAU,CAAA;AAC1C,IAAA,WAAA,CAAY,aAAa,CAAA,IAAK,eAAA,GAAkB,UAAA,GAAa,cAAA;AAE7D,IAAA,IAAI,mBAAmB,CAAA,EAAG;AACxB,MAAA,WAAA,CAAY,IAAA,GAAO,UAAU,CAAA,IAC3B,eAAA,GAAkB,UAAA,GAAa,cAAA;AAAA,IACnC;AAEA,IAAA,IAAI,eAAe,CAAA,EAAG;AACpB,MAAA,WAAA,CAAY,IAAA,GAAO,MAAM,CAAA,IAAK,eAAA,GAAkB,UAAA,GAAa,UAAA;AAAA,IAC/D;AAEA,IAAA,UAAA,CAAW,GAAA,CAAI,aAAA,EAAe,aAAA,EAAe,CAAC,CAAA;AAC9C,IAAA,eAAA,GAAkB,OAAA,CAAS,KAAK,UAAU,CAAA;AAC1C,IAAA,WAAA,CAAY,aAAA,GAAgB,CAAC,CAAA,IAC3B,eAAA,GAAkB,UAAA,GAAa,cAAA;AAEjC,IAAA,UAAA,CAAW,GAAA,CAAI,aAAA,EAAe,aAAA,EAAe,aAAa,CAAA;AAC1D,IAAA,eAAA,GAAkB,OAAA,CAAS,KAAK,UAAU,CAAA;AAC1C,IAAA,WAAA,CAAY,aAAA,GAAgB,CAAC,CAAA,IAC3B,eAAA,GAAkB,UAAA,GAAa,cAAA;AAEjC,IAAA,IAAI,WAAA,cAAyB,QAAA,GAAW,IAAA;AAAA,SACnC,UAAA,CAAW,SAAS,WAAA,GAAc,IAAA;AAAA,EACzC;AAIA,EAAA,IAAI,WAAW,IAAA,EAAM;AACnB,IAAA,MAAM,IAAA,GAAO,WAAA,CAAY,IAAA,GAAO,UAAU,CAAA;AAC1C,IAAA,MAAM,QAAQ,IAAA,GAAO,GAAA;AACrB,IAAA,MAAM,KAAK,aAAA,GAAgB,CAAA;AAC3B,IAAA,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,EAAE,CAAA,GAAI,CAAA;AAC5B,IAAA,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,EAAA,GAAK,CAAC,CAAA,GAAI,CAAA;AAChC,IAAA,UAAA,CAAW,KAAK,KAAA,CAAM,EAAA,GAAK,CAAC,CAAA,GAAI,IAAA,CAAK,IAAI,KAAK,CAAA;AAC9C,IAAA,UAAA,CAAW,KAAK,KAAA,CAAM,EAAA,GAAK,CAAC,CAAA,GAAI,IAAA,CAAK,IAAI,KAAK,CAAA;AAC9C,IAAA,IAAI,WAAA,cAAyB,IAAA,GAAO,IAAA;AAAA,SAC/B,UAAA,CAAW,KAAK,WAAA,GAAc,IAAA;AAAA,EACrC;AACF;;;AClSO,SAAS,yBAAyB,QAAA,EAA4B;AACnE,EAAA,OACE,aAAa,IAAA,IACb,QAAA,KAAa,MAAA,IACb,OAAO,aAAa,QAAA,IACpB,SAAA,IAAa,QAAA,IACb,OAAQ,SAAqC,OAAA,KAAY,UAAA,IACzD,gBAAgB,QAAA,IAChB,OAAQ,SAAqC,UAAA,KAAe,UAAA;AAEhE;AAgBO,SAAS,wBAAA,CACd,UACA,UAAA,GAAA,MAAA,aAC+C;AAC/C,EAAA,MAAM,UAAA,GAAa,yBAAyB,QAAQ,CAAA;AAEpD,EAAA,IAAI,UAAA,KAAA,KAAA,YAAsC;AACxC,IAAA,OAAA,KAAA;AAAA,EACF;AAEA,EAAA,IAAI,UAAA,KAAA,KAAA,YAAsC;AACxC,IAAA,OAAO,UAAA,GAAA,KAAA,aAAA,KAAA;AAAA,EACT;AAGA,EAAA,OAAO,UAAA,GAAA,KAAA,aAAA,KAAA;AACT;ACqBO,SAAS,mCACd,SAAA,EACc;AACd,EAAA,QAAQ,SAAA;AAAW,IACjB,KAAA,WAAA;AACE,MAAA,OAAA,WAAA;AAAA,IACF,KAAA,OAAA;AACE,MAAA,OAAA,OAAA;AAAA,IACF,KAAA,MAAA;AACE,MAAA,OAAA,MAAA;AAAA,IACF,KAAA,QAAA;AAAA,IACA;AACE,MAAA,OAAA,QAAA;AAAA;AAEN;AAsDA,IAAI,iBAAA,GAAoB,CAAA;AACxB,IAAI,yBAAwD,EAAC;AAoE7D,IAAI,mBAAA,GAAiD,IAAA;AACrD,IAAI,qBAAA,GAAwB,IAAA;AAE5B,IAAI,oBAAA,GAAuB,KAAA;AAC3B,IAAM,+BAA+B,MAAY;AAC/C,EAAA,oBAAA,GAAuB,IAAA;AAEvB,EAAA,OAAA,CAAQ,IAAA;AAAA,IACN;AAAA,GACF;AACF,CAAA;AA0CO,IAAM,0BAAA,GAA6B,CACxC,OAAA,EACA,OAAA,KACY;AAKZ,EAAA,IACE,WACA,UAAA,IAAc,OAAA,IACd,CAAC,wBAAA,CAAyB,OAAA,CAAQ,QAAQ,CAAA,EAC1C;AAEA,IAAA,OAAA,CAAQ,IAAA;AAAA,MACN;AAAA,KAGF;AACA,IAAA,OAAO,KAAA;AAAA,EACT;AACA,EAAA,mBAAA,GAAsB,OAAA;AACtB,EAAA,IAAI,OAAA,IAAW,cAAc,OAAA,EAAS;AACpC,IAAA,qBAAA,GAAwB,CAAC,CAAE,OAAA,CAAQ,QAAA,EAC/B,OAAA,EAAS,eAAA;AAAA,EACf,CAAA,MAAO;AACL,IAAA,qBAAA,GAAwB,IAAA;AAAA,EAC1B;AACA,EAAA,OAAO,IAAA;AACT;AAG4B,IAAU,MAAA,CAAA,OAAA;AACZ,IAAU,MAAA,CAAA,OAAA;AACR,IAAU,MAAA,CAAA,KAAA,CAAM,CAAA,EAAG,CAAA,EAAG,GAAG,KAAK;AAC1D,IAAM,0BAAA,GAA6B,IAAU,MAAA,CAAA,OAAA,EAAQ;AAEzB,IAAU,MAAA,CAAA,OAAA;AACV,IAAU,MAAA,CAAA,OAAA;AACjB,IAAU,MAAA,CAAA,UAAA;AASxB,IAAM,WAAA,GAAc,CAAC,IAAA,EAAe,OAAA,KAA0B;AACnE,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,OAAO,CAAA,CAAE,CAAA;AAAA,EAC/C;AACF;AAMO,IAAM,qBAAA,GAAwB,CACnC,GAAA,EACA,QAAA,EACA,KAAA,KACkB;AAClB,EAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,GAAA,KAAQ,IAAA,EAAM;AACrC,IAAA,OAAO,IAAU,MAAA,CAAA,OAAA,CAAQ,QAAA,CAAS,CAAC,CAAA,EAAG,QAAA,CAAS,CAAC,CAAC,CAAA;AAAA,EACnD;AACA,EAAA,IAAI,GAAA,YAAqB,gBAAS,OAAO,GAAA;AACzC,EAAA,IAAI,EAAA;AACJ,EAAA,IAAI,EAAA;AACJ,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtB,IAAA,EAAA,GAAK,MAAA,CAAQ,GAAA,CAAiB,CAAC,CAAC,CAAA;AAChC,IAAA,EAAA,GAAK,MAAA,CAAQ,GAAA,CAAiB,CAAC,CAAC,CAAA;AAAA,EAClC,CAAA,MAAA,IAAW,OAAO,GAAA,KAAQ,QAAA,EAAU;AAClC,IAAA,MAAM,CAAA,GAAI,GAAA;AACV,IAAA,EAAA,GAAK,CAAA,CAAE,CAAA,KAAM,MAAA,GAAY,MAAA,CAAO,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAA,KAAM,MAAA,GAAY,MAAA,CAAO,CAAA,CAAE,CAAC,CAAA,GAAI,MAAA;AACzE,IAAA,EAAA,GAAK,CAAA,CAAE,CAAA,KAAM,MAAA,GAAY,MAAA,CAAO,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAA,KAAM,MAAA,GAAY,MAAA,CAAO,CAAA,CAAE,CAAC,CAAA,GAAI,MAAA;AAAA,EAC3E;AACA,EAAA,WAAA;AAAA,IACE,EAAA,KAAO,MAAA,IAAa,EAAA,KAAO,MAAA,IAAa,MAAA,CAAO,SAAS,EAAE,CAAA,IAAK,MAAA,CAAO,QAAA,CAAS,EAAE,CAAA;AAAA,IACjF,GAAG,KAAK,CAAA,sDAAA;AAAA,GACV;AACA,EAAA,OAAO,IAAU,MAAA,CAAA,OAAA,CAAQ,EAAA,EAAc,EAAY,CAAA;AACrD;AAIO,IAAM,qBAAA,GAAwB,CACnC,GAAA,EACA,KAAA,KACyB;AACzB,EAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,GAAA,KAAQ,IAAA,EAAM,OAAO,IAAA;AAC9C,EAAA,WAAA;AAAA,IACE,OAAO,GAAA,KAAQ,QAAA,IAAY,OAAA,IAAY,GAAA;AAAA,IACvC,CAAA,EAAG,KAAK,CAAA,mDAAA,EAAsD,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA;AAAA,GAC3E;AACA,EAAA,OAAO,GAAA;AACT;AAGO,IAAM,0BAAA,GAA6B,CAAC,GAAA,EAAc,KAAA,KAAwC;AAC/F,EAAA,IAAI,GAAA,KAAQ,MAAA,IAAa,GAAA,KAAQ,IAAA,EAAM,OAAO,IAAA;AAC9C,EAAA,WAAA;AAAA,IACE,OAAO,GAAA,KAAQ,QAAA,IAAY,OAAA,IAAY,GAAA;AAAA,IACvC,CAAA,EAAG,KAAK,CAAA,oDAAA,EAAuD,MAAA,CAAO,GAAG,CAAC,CAAA,CAAA;AAAA,GAC5E;AACA,EAAA,OAAO,GAAA;AACT;AAMO,IAAM,4BAAA,GAA+B,CAC1C,GAAA,EACA,KAAA,KACkB;AAClB,EAAA,IAAI,GAAA,KAAQ,UAAa,GAAA,KAAQ,IAAA,SAAa,IAAU,MAAA,CAAA,OAAA,CAAQ,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AACvE,EAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,IAAA,MAAM,CAAA,GAAI,IAAU,MAAA,CAAA,KAAA,CAAM,GAAG,CAAA;AAC7B,IAAA,OAAO,IAAU,MAAA,CAAA,OAAA,CAAQ,CAAA,CAAE,GAAG,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,EACxC;AACA,EAAA,IAAI,OAAO,QAAQ,QAAA,EAAU;AAC3B,IAAA,MAAM,CAAA,GAAI,IAAI,IAAA,EAAK;AACnB,IAAA,MAAM,CAAA,GAAI,IAAU,MAAA,CAAA,KAAA,CAAM,CAAA,CAAE,UAAA,CAAW,GAAG,CAAA,GAAI,CAAA,GAAI,CAAA,CAAA,EAAI,CAAC,CAAA,CAAE,CAAA;AACzD,IAAA,WAAA;AAAA,MACE,MAAA,CAAO,QAAA,CAAS,CAAA,CAAE,CAAC,CAAA,IAAK,MAAA,CAAO,QAAA,CAAS,CAAA,CAAE,CAAC,CAAA,IAAK,MAAA,CAAO,QAAA,CAAS,EAAE,CAAC,CAAA;AAAA,MACnE,GAAG,KAAK,CAAA,gCAAA;AAAA,KACV;AACA,IAAA,OAAO,IAAU,MAAA,CAAA,OAAA,CAAQ,CAAA,CAAE,GAAG,CAAA,CAAE,CAAA,EAAG,EAAE,CAAC,CAAA;AAAA,EACxC;AACA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,EAAG;AACtB,IAAA,MAAM,CAAC,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,GAAI,GAAA;AAClB,IAAA,WAAA;AAAA,MACE,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,IAAK,MAAA,CAAO,SAAS,CAAC,CAAA,IAAK,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA;AAAA,MAC7D,GAAG,KAAK,CAAA,wCAAA;AAAA,KACV;AACA,IAAA,OAAO,IAAU,MAAA,CAAA,OAAA,CAAQ,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAA,EAClC;AACA,EAAA,MAAM,CAAA,GAAI,GAAA;AACV,EAAA,WAAA;AAAA,IACE,OAAO,QAAA,CAAS,MAAA,CAAO,EAAE,CAAC,CAAC,KAAK,MAAA,CAAO,QAAA,CAAS,OAAO,CAAA,CAAE,CAAC,CAAC,CAAA,IAAK,MAAA,CAAO,SAAS,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAA;AAAA,IAC3F,GAAG,KAAK,CAAA,iCAAA;AAAA,GACV;AACA,EAAA,OAAO,IAAU,MAAA,CAAA,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAE,CAAC,CAAA,EAAG,MAAA,CAAO,CAAA,CAAE,CAAC,CAAA,EAAG,MAAA,CAAO,CAAA,CAAE,CAAC,CAAC,CAAA;AAChE;AAsBgC,IAAU,MAAA,CAAA,OAAA;AACP,IAAU,MAAA,CAAA,OAAA;AAG3B,IAAU,MAAA,CAAA,OAAA;AACT,IAAU,MAAA,CAAA,OAAA;AACT,IAAU,MAAA,CAAA,OAAA;AAuCR,IAAU,MAAA,CAAA,OAAA;AAShC,IAAM,YAAY,CAChB,CAAA,EACA,aAEA,CAAA,GAAI,IAAU,eAAQ,CAAA,CAAE,CAAA,IAAK,CAAA,EAAG,CAAA,CAAE,KAAK,CAAA,EAAG,CAAA,CAAE,KAAK,CAAC,CAAA,GAAI,SAAS,KAAA,EAAM;AAKvE,IAAM,oBAAA,GAAuB,CAC3B,cAAA,KAAA,CAEC,cAAA,IAAkB,EAAC,EAAG,GAAA,CAAI,CAAC,EAAA,MAA0B;AAAA,EACpD,QAAA,EAAU,GAAG,QAAA,IAAY,IAAA;AAAA,EACzB,MAAM,EAAA,CAAG,IAAA,IAAA,OAAA;AAAA,EACT,QAAA,EAAU,UAAU,EAAA,CAAG,QAAA,EAAU,IAAU,MAAA,CAAA,OAAA,CAAQ,CAAA,EAAG,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,EAC3D,SAAA,EAAW,SAAA,CAAU,EAAA,CAAG,SAAA,EAAW,IAAU,MAAA,CAAA,OAAA,CAAQ,CAAA,EAAG,CAAA,EAAG,CAAC,CAAC,CAAA,CAAE,SAAA,EAAU;AAAA,EACzE,QAAA,EAAU,GAAG,QAAA,IAAY,CAAA;AAAA,EACzB,OAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,EAAA,CAAG,SAAS,QAAQ,CAAA;AAAA,EACvC,SAAS,EAAA,CAAG,OAAA,IAAA,QAAA;AACd,CAAA,CAAE,CAAA;AAKJ,IAAM,wBAAA,GAA2B,CAC/B,SAAA,KAAA,CAEC,SAAA,IAAa,EAAC,EAAG,GAAA,CAAI,CAAC,EAAA,MAA8B;AAAA,EACnD,QAAA,EAAU,GAAG,QAAA,IAAY,IAAA;AAAA,EACzB,QAAA,EAAU,UAAU,EAAA,CAAG,QAAA,EAAU,IAAU,MAAA,CAAA,OAAA,CAAQ,CAAA,EAAG,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,EAC3D,MAAA,EAAQ,SAAA,CAAU,EAAA,CAAG,MAAA,EAAQ,IAAU,MAAA,CAAA,OAAA,CAAQ,CAAA,EAAG,CAAA,EAAG,CAAC,CAAC,CAAA,CAAE,SAAA,EAAU;AAAA,EACnE,MAAM,EAAA,CAAG,IAAA,IAAA,MAAA;AAAA,EACT,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG,EAAA,CAAG,MAAA,IAAU,GAAG,CAAC,CAAA;AAAA,EACjD,YAAA,EAAc,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAG,EAAA,CAAG,YAAA,IAAgB,CAAC,CAAC;AAC7D,CAAA,CAAE,CAAA;AAiBG,IAAM,WAAA,GAAc;AAAA,EACzB,kBAAA,EAA0B,MAAA,CAAA,UAAA;AAAA,EAC1B,sBAAA,EAA8B,MAAA,CAAA,cAAA;AAAA,EAC9B,wBAAA,EAAgC,MAAA,CAAA,gBAAA;AAAA,EAChC,2BAAA,EAAmC,MAAA,CAAA,mBAAA;AAAA,EACnC,wBAAA,EAAgC,MAAA,CAAA;AAClC;AAOA,IAAM,kBAAA,GAAqB,CAAC,CAAA,KAA+B;AACzD,EAAA,IAAI,OAAO,CAAA,KAAM,QAAA,EAAU,OAAO,CAAA;AAClC,EAAA,IAAI,OAAO,MAAM,QAAA,EAAU;AACzB,IAAA,MAAM,MAAM,CAAA,CAAE,UAAA,CAAW,QAAQ,CAAA,GAAI,CAAA,GAAI,SAAS,CAAC,CAAA,CAAA;AACnD,IAAA,MAAM,MAAA,GAAU,YAA0D,GAAG,CAAA;AAC7E,IAAA,IAAI,MAAA,KAAW,QAAW,OAAO,MAAA;AAAA,EACnC;AACA,EAAA,OAAa,MAAA,CAAA,cAAA;AACf,CAAA;AAuBO,IAAM,iCAAiC,MAC5C,IAAA,CAAK,MAAM,IAAA,CAAK,SAAA,CAAU,8BAA8B,CAAC;AAE3D,IAAM,8BAAA,GAAuD;AAAA,EAC3D,SAAA,EAAW;AAAA,IACT,QAAA,EAAU,IAAU,MAAA,CAAA,OAAA,EAAQ;AAAA,IAC5B,QAAA,EAAU,IAAU,MAAA,CAAA,OAAA,EAAQ;AAAA,IAC5B,KAAA,EAAO,IAAU,MAAA,CAAA,OAAA,CAAQ,CAAA,EAAG,GAAG,CAAC;AAAA,GAClC;AAAA,EACA,QAAA,EAAU,CAAA;AAAA,EACV,OAAA,EAAS,IAAA;AAAA,EACT,UAAA,EAAY,CAAA;AAAA,EACZ,aAAA,EAAe,CAAA;AAAA,EACf,UAAA,EAAY,CAAA;AAAA,EACZ,SAAA,EAAW,CAAA;AAAA,EACX,YAAA,EAAc,CAAA;AAAA,EACd,aAAA,EAAe,CAAA;AAAA,EACf,UAAA,EAAY;AAAA,IACV,KAAK,EAAE,CAAA,EAAG,GAAK,CAAA,EAAG,CAAA,EAAK,GAAG,CAAA,EAAI;AAAA,IAC9B,KAAK,EAAE,CAAA,EAAG,GAAK,CAAA,EAAG,CAAA,EAAK,GAAG,CAAA;AAAI,GAChC;AAAA,EACA,OAAA,EAAS,CAAA;AAAA,EACT,eAAA,EAAA,OAAA;AAAA,EACA,iBAAA,EAAA,MAAA;AAAA,EACA,YAAA,EAAc,GAAA;AAAA,EACd,QAAA,EAAU;AAAA,IACR,YAAA,EAAc,EAAA;AAAA,IACd,gBAAA,EAAkB,CAAA;AAAA,IAClB,QAAQ;AAAC,GACX;AAAA,EACA,KAAA,EAAO;AAAA,IACL,KAAA,EAAA,QAAA;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,MAAA,EAAQ,CAAA;AAAA,MACR,eAAA,EAAiB,CAAA;AAAA,MACjB,GAAA,EAAK;AAAA,KACP;AAAA,IACA,IAAA,EAAM;AAAA,MACJ,KAAA,EAAO,EAAA;AAAA,MACP,MAAA,EAAQ,CAAA;AAAA,MACR,eAAA,EAAiB,CAAA;AAAA,MACjB,GAAA,EAAK;AAAA,KACP;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,MAAA,EAAQ,CAAA;AAAA,MACR,eAAA,EAAiB,CAAA;AAAA,MACjB,GAAA,EAAK;AAAA,KACP;AAAA,IACA,SAAA,EAAW;AAAA,MACT,UAAU,EAAE,CAAA,EAAG,GAAK,CAAA,EAAG,CAAA,EAAK,GAAG,CAAA,EAAI;AAAA,MACnC,KAAA,EAAO,EAAE,CAAA,EAAG,CAAA,EAAK,GAAG,CAAA;AAAI,KAC1B;AAAA,IACA,GAAA,EAAK;AAAA,MACH,OAAO,EAAE,CAAA,EAAG,GAAK,CAAA,EAAG,CAAA,EAAK,GAAG,CAAA,EAAI;AAAA,MAChC,QAAA,EAAA,QAAA;AAAA;AACF,GACF;AAAA,EACA,GAAA,EAAK,MAAA;AAAA,EACL,QAAA,EAAU;AAAA,IACR,QAAA,EAAgB,MAAA,CAAA,cAAA;AAAA,IAChB,sBAAA,EAAwB,KAAA;AAAA,IACxB,wBAAA,EAA0B,CAAA;AAAA,IAC1B,iBAAiB,EAAE,CAAA,EAAG,GAAK,CAAA,EAAG,CAAA,EAAK,GAAG,CAAA,EAAI;AAAA,IAC1C,WAAA,EAAa,IAAA;AAAA,IACb,SAAA,EAAW,IAAA;AAAA,IACX,UAAA,EAAY,KAAA;AAAA,IACZ,aAAA,EAAe;AAAA,MACb,OAAA,EAAS,KAAA;AAAA,MACT,SAAA,EAAW;AAAA;AACb,GACF;AAAA,EACA,oBAAA,EAAsB;AAAA,IACpB,QAAA,EAAU,KAAA;AAAA,IACV,MAAA,EAAQ;AAAA,MACN,CAAA,EAAG,CAAA;AAAA,MACH,CAAA,EAAG,CAAA;AAAA,MACH,CAAA,EAAG;AAAA,KACL;AAAA,IACA,OAAA,EAAS;AAAA,MACP,CAAA,EAAG,CAAA;AAAA,MACH,CAAA,EAAG,CAAA;AAAA,MACH,CAAA,EAAG;AAAA;AACL,GACF;AAAA,EACA,gBAAA,EAAkB;AAAA,IAChB,QAAA,EAAU,KAAA;AAAA,IACV,aAAA,EAAe;AAAA,MACb,IAAA,EAAA,QAAA;AAAA,MACA,KAAA,EAAO,CAAA;AAAA,MACP,YAAA,EAAc;AAAA,QACZ,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,YAAY,CAAA,EAAE;AAAA,QAC5B,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,YAAY,CAAA;AAAE;AAC9B;AACF,GACF;AAAA,EACA,iBAAA,EAAmB;AAAA,IACjB,QAAA,EAAU,KAAA;AAAA,IACV,CAAA,EAAG;AAAA,MACD,IAAA,EAAA,QAAA;AAAA,MACA,KAAA,EAAO,CAAA;AAAA,MACP,YAAA,EAAc;AAAA,QACZ,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,YAAY,CAAA,EAAE;AAAA,QAC5B,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,YAAY,CAAA;AAAE;AAC9B,KACF;AAAA,IACA,CAAA,EAAG;AAAA,MACD,IAAA,EAAA,QAAA;AAAA,MACA,KAAA,EAAO,CAAA;AAAA,MACP,YAAA,EAAc;AAAA,QACZ,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,YAAY,CAAA,EAAE;AAAA,QAC5B,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,YAAY,CAAA;AAAE;AAC9B,KACF;AAAA,IACA,CAAA,EAAG;AAAA,MACD,IAAA,EAAA,QAAA;AAAA,MACA,KAAA,EAAO,CAAA;AAAA,MACP,YAAA,EAAc;AAAA,QACZ,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,YAAY,CAAA,EAAE;AAAA,QAC5B,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,YAAY,CAAA;AAAE;AAC9B;AACF,GACF;AAAA,EACA,mBAAA,EAAqB;AAAA,IACnB,QAAA,EAAU,KAAA;AAAA,IACV,aAAA,EAAe;AAAA,MACb,IAAA,EAAA,QAAA;AAAA,MACA,KAAA,EAAO,CAAA;AAAA,MACP,YAAA,EAAc;AAAA,QACZ,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,YAAY,CAAA,EAAE;AAAA,QAC5B,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,YAAY,CAAA;AAAE;AAC9B;AACF,GACF;AAAA,EACA,oBAAA,EAAsB;AAAA,IACpB,QAAA,EAAU,KAAA;AAAA,IACV,GAAA,EAAK,CAAA;AAAA,IACL,GAAA,EAAK;AAAA,GACP;AAAA,EACA,KAAA,EAAO;AAAA,IACL,QAAA,EAAU,KAAA;AAAA,IACV,eAAA,EAAiB,KAAA;AAAA,IACjB,QAAA,EAAU,CAAA;AAAA,IACV,SAAA,EAAW,GAAA;AAAA,IACX,OAAA,EAAS,CAAA;AAAA,IACT,cAAA,EAAgB,CAAA;AAAA,IAChB,cAAA,EAAgB,CAAA;AAAA,IAChB,UAAA,EAAY;AAAA,GACd;AAAA,EACA,qBAAA,EAAuB;AAAA,IACrB,KAAA,EAAO,IAAU,MAAA,CAAA,OAAA,CAAQ,CAAA,EAAK,CAAG,CAAA;AAAA,IACjC,QAAA,EAAA,UAAA;AAAA,IACA,GAAA,EAAK,EAAA;AAAA,IACL,UAAA,EAAY;AAAA,GACd;AAAA,EACA,aAAa,EAAC;AAAA,EACd,iBAAiB;AACnB,CAAA;AAoEA,IAAM,qBAAA,GAAwB,CAAC,cAAA,KAA8C;AAC3E,EAAA,sBAAA,GAAyB,sBAAA,CAAuB,MAAA;AAAA,IAC9C,CAAC;AAAA,MACC,cAAA,EAAgB,mBAAA;AAAA,MAChB,SAAA;AAAA,MACA,WAAA,EAAa,EAAE,gBAAA;AAAiB,KAClC,KAAM;AACJ,MAAA,IAAI,wBAAwB,cAAA,EAAgB;AAC1C,QAAA,OAAO,IAAA;AAAA,MACT;AAEA,MAAA,yBAAA,CAA0B,gBAAgB,CAAA;AAG1C,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,SAAA,CAAU,SAAS,OAAA,EAAQ;AAC3B,QAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,SAAA,CAAU,QAAQ,CAAA;AAClC,UAAA,SAAA,CAAU,SAAS,OAAA,CAAQ,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,CAAA;AAAA,aAC1C,SAAA,CAAU,SAAS,OAAA,EAAQ;AAChC,QAAA,IAAI,SAAA,CAAU,MAAA,EAAQ,SAAA,CAAU,MAAA,CAAO,OAAO,SAAS,CAAA;AAAA,MACzD;AAEA,MAAA,mBAAA,CAAoB,SAAS,OAAA,EAAQ;AACrC,MAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,mBAAA,CAAoB,QAAQ,CAAA;AAC5C,QAAA,mBAAA,CAAoB,SAAS,OAAA,CAAQ,CAAC,QAAA,KAAa,QAAA,CAAS,SAAS,CAAA;AAAA,WAClE,mBAAA,CAAoB,SAAS,OAAA,EAAQ;AAE1C,MAAA,IAAI,mBAAA,CAAoB,MAAA;AACtB,QAAA,mBAAA,CAAoB,MAAA,CAAO,OAAO,mBAAmB,CAAA;AACvD,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,GACF;AACF,CAAA;AA4GA,IAAI,eAAA,GAAwC,IAAA;AAC5C,IAAM,oBAAoB,MAA4B;AACpD,EAAA,IAAI,iBAAiB,OAAO,eAAA;AAC5B,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,IAAA;AAC5C,EAAA,MAAM,MAAA,GAAS,QAAA,CAAS,aAAA,CAAc,QAAQ,CAAA;AAC9C,EAAA,MAAA,CAAO,KAAA,GAAQ,CAAA;AAAG,EAAA,MAAA,CAAO,MAAA,GAAS,CAAA;AAClC,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,IAAI,CAAA;AAClC,EAAA,IAAI,GAAA,EAAK;AAAE,IAAA,GAAA,CAAI,SAAA,GAAY,SAAA;AAAW,IAAA,GAAA,CAAI,QAAA,CAAS,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAAA,EAAG;AAChE,EAAA,eAAA,GAAkB,IAAU,eAAQ,MAAmC,CAAA;AACvE,EAAA,eAAA,CAAgB,WAAA,GAAc,IAAA;AAC9B,EAAA,OAAO,eAAA;AACT,CAAA;AAUO,IAAM,oBAAA,GAAuB,CAClC,MAAA,GAA+B,8BAAA,EAC/B,WAAA,KACmB;AACnB,EAAA,MAAM,GAAA,GAAM,WAAA,IAAe,IAAA,CAAK,GAAA,EAAI;AAGpC,EAAA,MAAM,SAAS,mBAAA,KAAwB,IAAA;AACvC,EAAA,IAAI,CAAC,MAAA,EAAQ;AACX,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAGF;AAAA,EACF;AACA,EAAA,IAAI,CAAC,qBAAA,EAAuB;AAC1B,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAEF;AAAA,EACF;AACA,EAAA,MAAM,OAAA,GAAU,mBAAA;AAChB,EAAA,IAAI,CAAC,QAAQ,qBAAA,EAAuB;AAClC,IAAA,MAAM,IAAI,KAAA;AAAA,MACR;AAAA,KAEF;AAAA,EACF;AAEA,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,YAAA,IAAgB,8BAAA,CAA+B,YAAA;AAC3E,EAAA,MAAM,mBAAmB,WAAA,CAAY,SAAA;AAAA,IACnC,8BAAA;AAAA,IACA,MAAA;AAAA,IACA,EAAE,kBAAA,EAAoB,KAAA,EAAO,iBAAA,EAAmB,EAAC;AAAE,GACrD;AAIA,EAAA,IAAK,gBAAA,CAAiB,sBAAiC,KAAA,EAAO;AAC5D,IAAA,IAAI,CAAC,oBAAA,EAAsB;AACzB,MAAA,4BAAA,EAA6B;AAAA,IAC/B;AACA,IAAA,gBAAA,CAAiB,iBAAA,GAAA,KAAA;AAAA,EACnB;AAEA,EAAA,MAAM,qBAAA,GACJ,iBAAiB,QAAA,CAAS,YAAA,IAAA,QAAA;AAM5B,EAAA,MAAM,qBAAA,GAAwB,kCAAA;AAAA,IAC5B;AAAA,GACF;AACA,EAAA,MAAM,MAAA,GAAS,qBAAA;AACf,EAAA,MAAM,gBACJ,qBAAA,KAAA,WAAA,oBACA,qBAAA,KAAA,MAAA;AAGF,EAAA,MAAM,WAAA,GAAc,iBAAiB,QAAA,CAAS,KAAA;AAC9C,EAAA,MAAM,WAAA,GAAc,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,WAAA,EAAa,MAAA,IAAU,EAAE,CAAC,CAAA;AACrE,EAAA,MAAM,qBAAA,GACJ,iCACI,IAAI,sBAAA;AAAA,IACF,IAAI,YAAA,CAAa,YAAA,IAAgB,WAAA,GAAc,KAAK,CAAC,CAAA;AAAA,IACrD;AAAA,GACF,GACA,IAAA;AACN,EAAA,MAAM,YAMK,qBAAA,GACP;AAAA,IACE,SAAA,EAAW,qBAAA;AAAA,IACX,IAAA,EAAM,IAAA;AAAA,IACN,MAAA,EAAQ,WAAA;AAAA,IACR,iBAAA,EAAmB,aAAa,iBAAA,IAAqB,CAAA;AAAA,IACrD,OAAA,EAAA,CAAU,WAAA,EAAa,OAAA,IAAW,CAAA,IAAK;AAAA,GACzC,GACA,IAAA;AAGJ,EAAA,MAAM,iBAAA,GAAoB,gBAAA,CAAiB,WAAA,IAAe,EAAC;AAQ3D,EAAA,MAAM,KAAA,GAAqB,iBAAA,CAAkB,GAAA,CAAI,CAAC,EAAA,KAAO;AACvD,IAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAM,EAAA,CAAG,YAAA,IAAgB,EAAE,CAAC,CAAA;AAC9D,IAAA,MAAM,CAAA,GAAI,OAAA,CAAQ,6BAAA,CAA+B,QAAQ,CAAA;AACzD,IAAA,CAAA,CAAE,OAAA,GAAW,EAAA,CAAG,OAAA,KAAY,OAAA,GAAU,CAAA,GAAI,CAAA;AAC1C,IAAA,OAAO,CAAA;AAAA,EACT,CAAC,CAAA;AAED,EAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,UAAU,CAAA,EAAG,CAAC,CAAA;AAE1E,EAAA,MAAM,WAAA,GAAc,oBAAA,CAAqB,gBAAA,CAAiB,WAAW,CAAA;AACrE,EAAA,MAAM,eAAA,GAAkB,wBAAA,CAAyB,gBAAA,CAAiB,eAAe,CAAA;AAGjF,EAAA,MAAM,WAAmE,OAAA,CAAQ,qBAAA;AAAA,IAC/E,YAAA;AAAA,IACA,aAAA;AAAA,IACA,gBAAA;AAAA,IACA,iBAAA;AAAA;AAAA,IACA,WAAA,CAAY,MAAA;AAAA,IACZ,eAAA,CAAgB,MAAA;AAAA,IAChB,KAAA;AAAA,IACA,SAAA,IAAa;AAAA,GACf;AAGA,EAAA,MAAM,cAAA,GASK,SAAA,GACP,OAAA,CAAQ,uBAAA,CAAyB;AAAA,IAC/B,UAAU,IAAI,sBAAA;AAAA,MACZ,IAAI,YAAA,CAAa,YAAA,GAAe,WAAA,GAAc,IAAI,CAAC,CAAA;AAAA,MACnD;AAAA,KACF;AAAA,IACA,MAAM,IAAI,sBAAA;AAAA,MACR,IAAI,YAAA,CAAa,YAAA,GAAe,WAAA,GAAc,IAAI,CAAC,CAAA;AAAA,MACnD;AAAA,KACF;AAAA,IACA,UAAU,IAAI,sBAAA;AAAA,MACZ,IAAI,YAAA,CAAa,YAAA,GAAe,WAAA,GAAc,IAAI,CAAC,CAAA;AAAA,MACnD;AAAA,KACF;AAAA,IACA,QAAQ,IAAI,sBAAA;AAAA,MACV,IAAI,YAAA,CAAa,YAAA,GAAe,WAAA,GAAc,IAAI,CAAC,CAAA;AAAA,MACnD;AAAA,KACF;AAAA,IACA,SAAS,SAAA,CAAU,SAAA;AAAA,IACnB,MAAM,SAAA,CAAU,IAAA;AAAA,IAChB,aAAA,EAAe,SAAS,OAAA,CAAQ,KAAA;AAAA,IAChC,QAAA,EAAU;AAAA,MACR,OAAO,WAAA,EAAa,cAAA,GAChB,2BAA2B,iBAAA,EAAmB,WAAA,CAAY,cAAc,CAAA,GACxE,MAAA;AAAA,MACJ,SAAS,WAAA,EAAa,gBAAA,GAClB,2BAA2B,iBAAA,EAAmB,WAAA,CAAY,gBAAgB,CAAA,GAC1E,MAAA;AAAA,MACJ,MAAA,EAAQ,aAAa,cAAA,EAAgB,QAAA,GACjC,2BAA2B,iBAAA,EAAmB,WAAA,CAAY,cAAA,CAAe,CAA6B,CAAA,GACtG,MAAA;AAAA,MACJ,MAAA,EAAQ,aAAa,cAAA,EAAgB,QAAA,GACjC,2BAA2B,iBAAA,EAAmB,WAAA,CAAY,cAAA,CAAe,CAA6B,CAAA,GACtG,MAAA;AAAA,MACJ,MAAA,EAAQ,aAAa,cAAA,EAAgB,QAAA,GACjC,2BAA2B,iBAAA,EAAmB,WAAA,CAAY,cAAA,CAAe,CAA6B,CAAA,GACtG;AAAA,KACN;AAAA,IACA,KAAA,EAAO,aAAa,KAAA,IAAS,CAAA;AAAA,IAC7B,MAAA,EAAQ,WAAA;AAAA,IACR,SAAS,SAAA,CAAU,OAAA;AAAA,IACnB;AAAA,GACD,CAAA,GACD,IAAA;AAkCJ,EAAA,MAAM,aAAyB,EAAC;AAChC,EAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,iBAAA,CAAkB,QAAQ,EAAA,EAAA,EAAM;AACpD,IAAA,MAAM,EAAA,GAAK,kBAAkB,EAAE,CAAA;AAC/B,IAAA,MAAM,IAAA,GAAO,MAAM,EAAE,CAAA;AACrB,IAAA,MAAM,WAAW,WAAA,CAAY,SAAA;AAAA,MAC3B,8BAAA,EAA+B;AAAA,MAC7B,EAAA,CAAG,UAAU,EAAC;AAAA,MAChB,EAAE,kBAAA,EAAoB,KAAA,EAAO,iBAAA,EAAmB,EAAC;AAAE,KACrD;AAEA,IAAA,MAAM,UAAA,GAAa,QAAA,CAAS,QAAA,EAAU,MAAA,GAAS,CAAC,CAAA;AAChD,IAAA,MAAM,UAAA,GAAa,aACf,IAAA,CAAK,GAAA;AAAA,MACH,CAAA;AAAA,MACA,IAAA,CAAK,IAAA;AAAA,QACH,cAAA;AAAA,UACE,oBAAoB,CAAA,GAAI,EAAA;AAAA,UACxB,UAAA,CAAW,KAAA;AAAA,UACX;AAAA,SACF,IAAK,WAAW,MAAA,IAAU,CAAA;AAAA;AAC5B,KACF,GACA,CAAA;AACJ,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,UAAA,EAAY,KAAK,QAAQ,CAAA;AACnD,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,IAAA,CAAK,IAAI,QAAA,GAAW,IAAA,CAAK,QAAA,EAAU,KAAK,CAAC,CAAA;AAKtE,IAAA,MAAM,0BAAA,GAA6B,SAAS,QAAA,EAAU,YAAA;AACtD,IAAA,MAAM,0BAAA,GAA6B,kCAAA;AAAA,MACjC;AAAA,KACF;AACA,IAAA,MAAM,iBACJ,0BAAA,KAAA,WAAA,oBACA,0BAAA,KAAA,MAAA;AACF,IAAA,MAAM,gBAAgB,OAAA,CAAQ,qBAAA;AAAA,MAC5B,QAAA;AAAA,MACA,cAAA;AAAA,MACA,QAAA;AAAA,MACA,oBAAoB,CAAA,GAAI,EAAA;AAAA,MACxB,CAAA;AAAA,MACA,CAAA;AAAA,MACA,EAAC;AAAA,MACD;AAAA,KACF;AACA,IAAA,MAAM,mBAAmB,OAAA,CAAQ,qBAAA;AAAA,MAC/B,QAAA;AAAA,MACA,oBAAoB,CAAA,GAAI;AAAA,KAC1B;AACA,IAAA,MAAM,WAAW,QAAA,CAAS,oBAAA;AAC1B,IAAA,MAAM,OAAO,OAAA,CAAQ,0BAAA;AAAA,MACnB,aAAA,CAAc,OAAA;AAAA,MACd,QAAA;AAAA,MACA,gBAAA;AAAA,MACA,QAAA,CAAS,OAAA;AAAA,MACT,YAAA;AAAA,MACA,IAAA;AAAA,MACA,GAAG,eAAA,IAAmB,CAAA;AAAA,MACtB,QAAA;AAAA,MACA;AAAA,QACE,MAAA,EAAQ,CAAC,QAAA,EAAU,MAAA,EAAQ,CAAA,EAAY,UAAU,MAAA,EAAQ,CAAA,EAAY,QAAA,EAAU,MAAA,EAAQ,CAAU,CAAA;AAAA,QACjG,OAAA,EAAS,CAAC,QAAA,EAAU,OAAA,EAAS,CAAA,EAAY,UAAU,OAAA,EAAS,CAAA,EAAY,QAAA,EAAU,OAAA,EAAS,CAAU;AAAA;AACvG,KACF;AAgBA,IAAA,UAAA,CAAW,IAAA,CAAK;AAAA,MACd,IAAA;AAAA,MACA,QAAA,EAAU,aAAA;AAAA,MACV,IAAA;AAAA,MACA,SAAA,EAAW,cAAA;AAAA,MACX,qBAAA,EAAuB,0BAAA;AAAA,MACvB,qBAAA,EAAuB,0BAAA;AAAA,MACvB,GAAA,EAAK,QAAA;AAAA,MACL,MAAA,EAAQ,IAAA;AAAA,MACR,QAAA;AAAA,MACA,SAAS,QAAA,CAAS,OAAA;AAAA,MAClB,KAAA,EAAO,QAAA,CAAS,KAAA,EAAO,QAAA,GACnB;AAAA,QACE,QAAA,EAAU,IAAA;AAAA,QACV,QAAA,EAAU,SAAS,KAAA,CAAM,QAAA;AAAA,QACxB,UAAA,EACE,IAAA,GAAO,QAAA,CAAS,KAAA,CAAM,QAAA;AAAA,QACzB,SAAA,EAAW,SAAS,KAAA,CAAM,SAAA;AAAA,QAC1B,cAAA,EAAgB,SAAS,KAAA,CAAM,cAAA;AAAA,QAC/B,cAAA,EAAgB,SAAS,KAAA,CAAM,cAAA;AAAA,QAC/B,UAAA,EAAY,SAAS,KAAA,CAAM,UAAA;AAAA,QAC3B,MAAA,EAAQ,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAC,QAAA,CAAS,MAAM,OAAO;AAAA,OACjD,GACA,IAAA;AAAA,MACJ,IAAA,EAAM,QAAA,CAAS,QAAA,EAAU,YAAA,GACrB,cAAA,CAAe,iBAAA,GAAoB,CAAA,GAAI,EAAA,EAAI,QAAA,CAAS,QAAA,CAAS,YAAA,EAAc,CAAC,CAAA,GAC5E,CAAA;AAAA,MACJ,GAAA,EAAK,CAAA;AAAA,MACL,QAAA,EAAU,CAAA;AAAA,MACV,QAAA,EAAU,MAAA;AAAA,MACV,QAAA,EAAU,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,GAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,EAAA,EAAI,CAAA,EAAG,OAAA,EAAS,QAAA,CAAS,eAAA,KAAA,OAAA,eAA4C,CAAA,GAAI,CAAA;AAAE,KACpJ,CAAA;AAAA,EACH;AAKA,EAAA,MAAM,mBAAA,GAAuB,iBAAiB,QAAA,CAC3C,aAAA;AACH,EAAA,MAAM,WAAA,GAAc,iBAAiB,qBAAA,EAAuB,KAAA;AAC5D,EAAA,MAAM,cAAA,GAAoC,EAAE,KAAA,EAAO,CAAA,EAAE;AACrD,EAAA,MAAM,cAAA,GAAsD;AAAA,IAC1D,OAAA,EAAS,cAAA;AAAA,IACT,cAAA,EAAgB,EAAE,KAAA,EAAO,GAAA,EAAI;AAAA,IAC7B,aAAA,EAAe;AAAA,MACb,KAAA,EAAO,qBAAA;AAAA,QACL,mBAAA;AAAA,QACA,CAAC,KAAK,GAAI,CAAA;AAAA,QACV;AAAA;AACF,KACF;AAAA,IACA,aAAA,EAAe,EAAE,KAAA,EAAO,aAAA,EAAc;AAAA,IACtC,oBAAA,EAAsB,EAAE,KAAA,EAAO,CAAC,CAAC,gBAAA,CAAiB,QAAA,CAAS,eAAe,OAAA,EAAQ;AAAA,IAClF,sBAAA,EAAwB;AAAA,MACtB,KAAA,EAAO,KAAK,GAAA,CAAI,gBAAA,CAAiB,SAAS,aAAA,EAAe,SAAA,IAAa,GAAG,IAAK;AAAA,KAChF;AAAA,IACA,iBAAA,EAAmB;AAAA,MACjB,KAAA,EAAO,0BAAA;AAAA,QACL,gBAAA,CAAiB,SAAS,aAAA,EAAe,YAAA;AAAA,QACzC;AAAA;AACF,KACF;AAAA,IACA,wBAAwB,EAAE,KAAA,EAAO,CAAC,CAAC,gBAAA,CAAiB,SAAS,sBAAA,EAAuB;AAAA,IACpF,iBAAiB,EAAE,KAAA,EAAO,IAAU,MAAA,CAAA,KAAA,CAAM,QAAQ,CAAA,EAAE;AAAA,IACpD,0BAA0B,EAAE,KAAA,EAAO,gBAAA,CAAiB,QAAA,CAAS,4BAA4B,CAAA,EAAE;AAAA,IAC3F,GAAA,EAAK;AAAA,MACH,KAAA,EAAO,qBAAA;AAAA,QACL,gBAAA,CAAiB,OAAO,iBAAA,EAAkB;AAAA,QAC1C;AAAA;AACF,KACF;AAAA,IACA,aAAA,EAAe,EAAE,KAAA,EAAO,CAAA,EAAE;AAAA,IAC1B,SAAA,EAAW,EAAE,KAAA,EAAO,CAAA,EAAE;AAAA,IACtB,aAAA,EAAe,EAAE,KAAA,EAAO,CAAA,EAAE;AAAA,IAC1B,YAAA,EAAc,EAAE,KAAA,EAAO,CAAA,EAAE;AAAA,IACzB,UAAA,EAAY,EAAE,KAAA,EAAO,IAAU,aAAM,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,EAAE;AAAA,IAC9C,QAAA,EAAU,EAAE,KAAA,EAAO,CAAA,EAAE;AAAA,IACrB,KAAA,EAAO,EAAE,KAAA,EAAO,IAAU,aAAM,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA,EAAE;AAAA;AAAA,IAEzC,KAAK,EAAE,KAAA,EAAO,gBAAA,CAAiB,qBAAA,EAAuB,OAAO,EAAA,EAAK;AAAA,IAClE,mBAAA,EAAqB;AAAA,MACnB,KAAA,EAAO,iBAAiB,qBAAA,EAAuB,QAAA,KAAA,KAAA;AAAA,KACjD;AAAA,IACA,KAAA,EAAO;AAAA;AAAA;AAAA;AAAA,MAIL,KAAA,EAAO,qBAAA;AAAA,QACL,WAAA;AAAA,QACA,CAAC,GAAG,CAAC,CAAA;AAAA,QACL;AAAA;AACF;AACF,GACF;AACA,EAAA,MAAM,KAAA,GAAQ,4BAAA;AAAA,IACZ,iBAAiB,QAAA,CAAS,eAAA;AAAA,IAC1B;AAAA,GACF;AACA,EAAC,cAAA,CAAe,gBAAgB,KAAA,CAAsB,MAAA,CAAO,MAAM,CAAA,EAAG,KAAA,CAAM,CAAA,EAAG,KAAA,CAAM,CAAC,CAAA;AAEtF,EAAA,MAAM,cAAA,GAKF;AAAA,IACF,WAAA,EAAa,CAAC,CAAC,gBAAA,CAAiB,QAAA,CAAS,WAAA;AAAA,IACzC,QAAA,EAAU,kBAAA,CAAmB,gBAAA,CAAiB,QAAA,CAAS,QAAQ,CAAA;AAAA,IAC/D,SAAA,EAAW,gBAAA,CAAiB,QAAA,CAAS,SAAA,KAAc,KAAA;AAAA,IACnD,UAAA,EAAY,gBAAA,CAAiB,QAAA,CAAS,UAAA,KAAe;AAAA,GACvD;AACA,EAAA,MAAM,WAAW,OAAA,CAAQ,yBAAA;AAAA,IACvB,MAAA;AAAA,IACA,cAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACF;AAGA,EAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AACzB,EAAA,IAAI,QAAA;AACJ,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,MAAM,CAAA,GAAI,IAAU,MAAA,CAAA,uBAAA,EAAwB;AAC5C,IAAA,MAAM,YAAA,GAAe,gBAAA,CAAiB,QAAA,CAAS,IAAA,EAAM,QAAA;AACrD,IAAA,MAAM,YAAA,GACJ,MAAA,KAAA,MAAA,eAAgC,YAAA,GAC5B,YAAA,GACA,IAAU,MAAA,CAAA,cAAA,EAAe;AAC/B,IAAA,IAAI,MAAA,KAAA,MAAA,eAAgC,CAAC,YAAA,EAAc;AACjD,MAAA,MAAM,OAAO,IAAI,YAAA,CAAa,CAAC,IAAA,EAAM,MAAM,CAAA,EAAG,GAAA,EAAK,IAAA,EAAM,CAAA,EAAG,KAAK,GAAA,EAAK,CAAA,EAAG,IAAA,EAAM,GAAA,EAAK,CAAC,CAAC,CAAA;AACtF,MAAA,MAAM,MAAA,GAAS,IAAI,YAAA,CAAa,CAAC,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAC,CAAA;AACxD,MAAA,MAAM,aAAa,IAAI,YAAA,CAAa,CAAC,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAC,CAAA;AACxE,MAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAY,CAAC,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAC,CAAA;AAC9C,MAAA,YAAA,CAAa,aAAa,UAAA,EAAY,IAAU,MAAA,CAAA,eAAA,CAAgB,IAAA,EAAM,CAAC,CAAC,CAAA;AAExE,MAAA,YAAA,CAAa,aAAa,IAAA,EAAM,IAAU,MAAA,CAAA,eAAA,CAAgB,MAAA,EAAQ,CAAC,CAAC,CAAA;AACpE,MAAA,YAAA,CAAa,aAAa,QAAA,EAAU,IAAU,MAAA,CAAA,eAAA,CAAgB,UAAA,EAAY,CAAC,CAAC,CAAA;AAC5E,MAAA,YAAA,CAAa,QAAA,CAAS,IAAU,MAAA,CAAA,eAAA,CAAgB,GAAA,EAAK,CAAC,CAAC,CAAA;AAAA,IACzD;AACA,IAAA,CAAA,CAAE,YAAA,CAAa,UAAA,EAAY,YAAA,CAAa,YAAA,CAAa,UAAU,CAAC,CAAA;AAChE,IAAA,IAAI,aAAa,KAAA,KAAU,IAAA,EAAM,CAAA,CAAE,QAAA,CAAS,aAAa,KAAK,CAAA;AAC9D,IAAA,CAAA,CAAE,aAAA,GAAgB,YAAA;AAGlB,IAAA,CAAA,CAAE,YAAA,CAAa,gBAAA,EAAkB,OAAA,CAAQ,QAAQ,CAAA;AACjD,IAAA,CAAA,CAAE,YAAA,CAAa,eAAA,EAAiB,OAAA,CAAQ,KAAK,CAAA;AAC7C,IAAA,CAAA,CAAE,YAAA,CAAa,uBAAA,EAAyB,OAAA,CAAQ,aAAa,CAAA;AAC7D,IAAA,CAAA,CAAE,YAAA,CAAa,qBAAA,EAAuB,OAAA,CAAQ,WAAW,CAAA;AACzD,IAAA,QAAA,GAAW,CAAA;AAAA,EACb,CAAA,MAAO;AACL,IAAA,MAAM,CAAA,GAAI,IAAU,MAAA,CAAA,cAAA,EAAe;AACnC,IAAA,CAAA,CAAE,YAAA,CAAa,UAAA,EAAY,OAAA,CAAQ,QAAQ,CAAA;AAC3C,IAAA,CAAA,CAAE,YAAA,CAAa,OAAA,EAAS,OAAA,CAAQ,KAAK,CAAA;AACrC,IAAA,CAAA,CAAE,YAAA,CAAa,eAAA,EAAiB,OAAA,CAAQ,aAAa,CAAA;AACrD,IAAA,CAAA,CAAE,YAAA,CAAa,aAAA,EAAe,OAAA,CAAQ,WAAW,CAAA;AACjD,IAAA,CAAA,CAAE,YAAA,CAAa,GAAG,YAAY,CAAA;AAC9B,IAAA,QAAA,GAAW,CAAA;AACX,IAAC,EAA2C,aAAA,GAAgB,YAAA;AAAA,EAC9D;AAGA,EAAA,IAAI,aAAA,GAA6C,IAAA;AACjD,EAAA,IAAI,kBAAkB,SAAA,EAAW;AAC/B,IAAA,MAAM,KAAK,cAAA,CAAe,OAAA;AAC1B,IAAA,MAAM,CAAA,GAAI,IAAU,MAAA,CAAA,cAAA,EAAe;AACnC,IAAA,CAAA,CAAE,YAAA,CAAa,UAAA,EAAY,EAAA,CAAG,QAAQ,CAAA;AACtC,IAAA,CAAA,CAAE,YAAA,CAAa,WAAA,EAAa,EAAA,CAAG,IAAI,CAAA;AACnC,IAAA,CAAA,CAAE,YAAA,CAAa,cAAA,EAAgB,EAAA,CAAG,QAAQ,CAAA;AAC1C,IAAA,CAAA,CAAE,YAAA,CAAa,cAAA,EAAgB,EAAA,CAAG,MAAM,CAAA;AACxC,IAAA,MAAM,MAAM,IAAI,WAAA,CAAY,YAAA,IAAgB,WAAA,GAAc,KAAK,CAAC,CAAA;AAChE,IAAA,IAAI,CAAA,GAAI,CAAA;AACR,IAAA,KAAA,IAAS,IAAA,GAAO,CAAA,EAAG,IAAA,GAAO,YAAA,EAAc,IAAA,EAAA,EAAQ;AAC9C,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,GAAc,GAAG,CAAA,EAAA,EAAK;AACxC,QAAA,MAAM,CAAA,GAAI,IAAA,GAAO,WAAA,GAAc,CAAA,GAAI,CAAA,GAAI,CAAA;AACvC,QAAA,GAAA,CAAI,GAAG,CAAA,GAAI,CAAA;AAAG,QAAA,GAAA,CAAI,CAAA,EAAG,IAAI,CAAA,GAAI,CAAA;AAAG,QAAA,GAAA,CAAI,CAAA,EAAG,IAAI,CAAA,GAAI,CAAA;AAC/C,QAAA,GAAA,CAAI,CAAA,EAAG,IAAI,CAAA,GAAI,CAAA;AAAG,QAAA,GAAA,CAAI,CAAA,EAAG,IAAI,CAAA,GAAI,CAAA;AAAG,QAAA,GAAA,CAAI,CAAA,EAAG,IAAI,CAAA,GAAI,CAAA;AAAA,MACrD;AAAA,IACF;AACA,IAAA,CAAA,CAAE,QAAA,CAAS,IAAU,MAAA,CAAA,eAAA,CAAgB,GAAA,EAAK,CAAC,CAAC,CAAA;AAC5C,IAAA,CAAA,CAAE,YAAA,CAAa,CAAA,EAAG,YAAA,GAAe,WAAA,GAAc,CAAC,CAAA;AAChD,IAAA,aAAA,GAAgB,CAAA;AAAA,EAClB;AAGA,EAAA,MAAM,aAAA,GAAgB,gBAClB,OAAA,CAAQ,sBAAA;AAAA,IACN;AAAA,MACE,KAAK,EAAE,KAAA,EAAQ,gBAAA,CAAiB,GAAA,IAAO,mBAAkB,EAA+B;AAAA,MACxF,QAAQ,EAAE,KAAA,EAAO,CAAC,CAAC,iBAAiB,GAAA,EAAI;AAAA,MACxC,wBAAwB,EAAE,KAAA,EAAO,CAAC,CAAC,gBAAA,CAAiB,SAAS,sBAAA,EAAuB;AAAA,MACpF,eAAA,EAAiB,EAAE,KAAA,EAAO,gBAAA,CAAiB,QAAA,CAAS,eAAA,IAAmB,EAAE,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,GAAE,EAAE;AAAA,MAC5F,0BAA0B,EAAE,KAAA,EAAO,gBAAA,CAAiB,QAAA,CAAS,4BAA4B,CAAA,EAAE;AAAA,MAC3F,oBAAA,EAAsB,EAAE,KAAA,EAAO,CAAC,CAAC,gBAAA,CAAiB,QAAA,CAAS,eAAe,OAAA,EAAQ;AAAA,MAClF,sBAAA,EAAwB;AAAA,QACtB,KAAA,EAAO,KAAK,GAAA,CAAI,gBAAA,CAAiB,SAAS,aAAA,EAAe,SAAA,IAAa,GAAG,IAAK;AAAA,OAChF;AAAA,MACA,iBAAA,EAAmB;AAAA,QACjB,KAAA,EAAQ,gBAAA,CAAiB,QAAA,CAAS,aAAA,EAAe,YAAA,IAAgB;AAAA,OACnE;AAAA,MACA,eAAe,EAAE,KAAA,EAAO,IAAU,MAAA,CAAA,OAAA,CAAQ,GAAA,EAAK,GAAI,CAAA;AAAE,KACvD;AAAA,IACA;AAAA,MACE,WAAA,EAAa,CAAC,CAAC,gBAAA,CAAiB,QAAA,CAAS,WAAA;AAAA,MACzC,QAAA,EAAU,kBAAA,CAAmB,gBAAA,CAAiB,QAAA,CAAS,QAAQ,CAAA;AAAA,MAC/D,SAAA,EAAW,gBAAA,CAAiB,QAAA,CAAS,SAAA,KAAc,KAAA;AAAA,MACnD,UAAA,EAAY,gBAAA,CAAiB,QAAA,CAAS,UAAA,KAAe;AAAA;AACvD,GACF,GACA,IAAA;AACJ,EAAA,MAAM,iBAA4C,aAAA,GAC9C,IAAU,MAAA,CAAA,IAAA,CAAK,aAAA,EAAe,aAA+B,CAAA,GAC7D,aAAA,GACE,IAAU,MAAA,CAAA,IAAA,CAAK,UAAU,QAAQ,CAAA,GACjC,IAAU,MAAA,CAAA,MAAA,CAAO,UAAU,QAAQ,CAAA;AACzC,EAAA,cAAA,CAAe,aAAA,GAAgB,KAAA;AAG/B,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,MAAM,EAAA,GAAK,EAAE,QAAA,CAAS,OAAA;AACtB,IAAA,MAAM,QAAA,GAAY,CAAA,CAAE,QAAA,CAAS,cAAA,GAA4B,CAAA;AACzD,IAAA,MAAM,aAAA,GAAsE,CAAA,CAAE,SAAA,GAAA,CACzE,MAAM;AACL,MAAA,MAAM,CAAA,GAAI,IAAU,MAAA,CAAA,uBAAA,EAAwB;AAC5C,MAAA,MAAM,OAAO,IAAI,YAAA,CAAa,CAAC,IAAA,EAAM,MAAM,CAAA,EAAG,GAAA,EAAK,IAAA,EAAM,CAAA,EAAG,KAAK,GAAA,EAAK,CAAA,EAAG,IAAA,EAAM,GAAA,EAAK,CAAC,CAAC,CAAA;AACtF,MAAA,MAAM,GAAA,GAAM,IAAI,WAAA,CAAY,CAAC,CAAA,EAAG,GAAG,CAAA,EAAG,CAAA,EAAG,CAAA,EAAG,CAAC,CAAC,CAAA;AAC9C,MAAA,CAAA,CAAE,aAAa,UAAA,EAAY,IAAU,MAAA,CAAA,eAAA,CAAgB,IAAA,EAAM,CAAC,CAAC,CAAA;AAC7D,MAAA,CAAA,CAAE,QAAA,CAAS,IAAU,MAAA,CAAA,eAAA,CAAgB,GAAA,EAAK,CAAC,CAAC,CAAA;AAC5C,MAAA,CAAA,CAAE,aAAA,GAAgB,QAAA;AAClB,MAAA,CAAA,CAAE,YAAA,CAAa,gBAAA,EAAkB,EAAA,CAAG,QAAQ,CAAA;AAC5C,MAAA,CAAA,CAAE,YAAA,CAAa,eAAA,EAAiB,EAAA,CAAG,KAAK,CAAA;AACxC,MAAA,CAAA,CAAE,YAAA,CAAa,uBAAA,EAAyB,EAAA,CAAG,aAAa,CAAA;AACxD,MAAA,CAAA,CAAE,YAAA,CAAa,qBAAA,EAAuB,EAAA,CAAG,WAAW,CAAA;AACpD,MAAA,OAAO,CAAA;AAAA,IACT,CAAA,OACC,MAAM;AACL,MAAA,MAAM,CAAA,GAAI,IAAU,MAAA,CAAA,cAAA,EAAe;AACnC,MAAA,CAAA,CAAE,YAAA,CAAa,UAAA,EAAY,EAAA,CAAG,QAAQ,CAAA;AACtC,MAAA,CAAA,CAAE,YAAA,CAAa,OAAA,EAAS,EAAA,CAAG,KAAK,CAAA;AAChC,MAAA,CAAA,CAAE,YAAA,CAAa,eAAA,EAAiB,EAAA,CAAG,aAAa,CAAA;AAChD,MAAA,CAAA,CAAE,YAAA,CAAa,aAAA,EAAe,EAAA,CAAG,WAAW,CAAA;AAC5C,MAAA,CAAA,CAAE,YAAA,CAAa,GAAG,QAAQ,CAAA;AAC1B,MAAA,OAAO,CAAA;AAAA,IACT,CAAA,GAAG;AACP,IAAA,MAAM,aAAA,GAAqD;AAAA,MACzD,GAAG,cAAA;AAAA,MACH,aAAA,EAAe,EAAE,KAAA,EAAO,CAAA,CAAE,SAAA;AAAU,KACtC;AACA,IAAA,MAAM,gBAAgB,OAAA,CAAQ,yBAAA;AAAA,MAC5B,CAAA,CAAE,qBAAA;AAAA,MACF,aAAA;AAAA,MACA,cAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,MAAM,WAAA,GAAyC,CAAA,CAAE,SAAA,GAC7C,IAAU,MAAA,CAAA,IAAA,CAAK,aAAA,EAAe,aAAa,CAAA,GAC3C,IAAU,MAAA,CAAA,MAAA,CAAO,aAAA,EAAe,aAAa,CAAA;AACjD,IAAA,WAAA,CAAY,aAAA,GAAgB,KAAA;AAC5B,IAAA,cAAA,CAAe,IAAI,WAAW,CAAA;AAC9B,IAAA,CAAA,CAAE,MAAA,GAAS,WAAA;AAAA,EACb;AAIA,EAAA,IAAK,MAAA,CAAA,IAAA,CAAuD,GAAA,EAAK,GAAA,KAAQ,KAAA,EAAO;AAC9E,IAAA,MAAM,WAAW,aAAA,GACb;AAAA,MACE,UAAA;AAAA;AAAA,MACA,gBAAA;AAAA;AAAA,MACA,eAAA;AAAA;AAAA,MACA,uBAAA;AAAA;AAAA,MACA;AAAA;AAAA,KACF,GACA,CAAC,UAAA,EAAY,OAAA,EAAS,iBAAiB,aAAa,CAAA;AACxD,IAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,MAAA,IAAI,CAAC,QAAA,CAAS,YAAA,CAAa,IAAI,CAAA,EAAG;AAChC,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,mBAAA,IAAuB,aAAA,GAAgB,WAAA,GAAc,QAAA,CAAA,GAAY,eAAe,IAAA,GAAO;AAAA,SACzF;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,mBAA6C,aAAA,GAC/C;AAAA,MACE,CAAC,gBAAA,EAAkB,OAAA,CAAQ,QAAQ,CAAA;AAAA,MACnC,CAAC,eAAA,EAAiB,OAAA,CAAQ,KAAK,CAAA;AAAA,MAC/B,CAAC,uBAAA,EAAyB,OAAA,CAAQ,aAAa,CAAA;AAAA,MAC/C,CAAC,qBAAA,EAAuB,OAAA,CAAQ,WAAW;AAAA,KAC7C,GACA;AAAA,MACE,CAAC,UAAA,EAAY,OAAA,CAAQ,QAAQ,CAAA;AAAA,MAC7B,CAAC,OAAA,EAAS,OAAA,CAAQ,KAAK,CAAA;AAAA,MACvB,CAAC,eAAA,EAAiB,OAAA,CAAQ,aAAa,CAAA;AAAA,MACvC,CAAC,aAAA,EAAe,OAAA,CAAQ,WAAW;AAAA,KACrC;AACJ,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,GAAG,CAAA,IAAK,gBAAA,EAAkB;AAC1C,MAAA,IAAI,QAAA,CAAS,YAAA,CAAa,IAAI,CAAA,KAAM,GAAA,EAAK;AACvC,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,+BAA+B,IAAI,CAAA,0CAAA;AAAA,SACrC;AAAA,MACF;AAAA,IACF;AACA,IAAA,MAAM,IAAA,GAAQ,QAAA,CAAS,aAAA,CACpB,SAAA,CAAU,KAAA;AACb,IAAA,IAAI,EAAE,IAAA,IAAQ,CAAA,IAAK,IAAA,IAAQ,CAAA,CAAA,EAAI;AAC7B,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,iCAAiC,IAAI,CAAA,4BAAA;AAAA,OACvC;AAAA,IACF;AACA,IAAA,IAAI,EAAE,eAAe,CAAA,CAAA,EAAI;AACvB,MAAA,MAAM,IAAI,MAAM,4CAA4C,CAAA;AAAA,IAC9D;AACA,IAAA,IAAI,QAAA,CAAS,cAAA,KAAmB,YAAA,GAAe,CAAA,EAAG;AAChD,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF;AAUA,IAAA,MAAM,WAAA,GAAc;AAAA,MAClB,GAAM,QAAA,CAAS,WAAA,IAAe,EAAC;AAAA,MAC/B,GAAM,cAAA,EAAgB,WAAA,IAAe,EAAC;AAAA,MACtC,GAAG,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAA,KAAM;AAAA,QAC3B,GAAM,CAAA,CAAE,IAAA,CAAK,WAAA,IAAe,EAAC;AAAA,QAC7B,GAAA,CAAM,CAAA,CAAE,QAAA,CAAS,WAAA,IAAe,EAAC,EAAiC,GAAA;AAAA,UAChE,CAAC,OAAO,EAAE,GAAG,GAAG,IAAA,EAAM,CAAA,MAAA,EAAS,CAAA,CAAE,IAAI,CAAA,CAAA,EAAG;AAAA;AAC1C,OACD;AAAA,KACH;AACA,IAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,MAAA,IAAI,IAAA,CAAK,kBAAkB,CAAA,EAAG;AAC5B,QAAA,MAAM,IAAI,KAAA;AAAA,UACR,CAAA,EAAG,IAAA,CAAK,IAAI,CAAA,EAAA,EAAK,KAAK,eAAe,CAAA,qCAAA;AAAA,SACvC;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,SAAA,IAAa,SAAA,CAAU,IAAA,KAAS,QAAA,CAAS,SAAA,EAAW;AACtD,MAAA,MAAM,IAAI,MAAM,mDAAmD,CAAA;AAAA,IACrE;AACA,IAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,MAAA,MAAM,CAAA,GAAK,CAAA,CAAE,OAAA,CAAQ,KAAA,CAAsB,MAAA;AAC3C,MAAA,IAAI,MAAM,CAAA,EAAG;AACX,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AACA,MAAA,MAAM,CAAA,GAAK,CAAA,CAAE,OAAA,CAAQ,KAAA,CAAuB,MAAA;AAC5C,MAAA,IAAI,CAAA,KAAM,CAAA,GAAI,CAAA,GAAI,CAAA,CAAE,QAAA,EAAU;AAC5B,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAQA,EAAA,MAAM,MAAA,GAAS,CAAC,CAAA,EAAY,CAAA,KAC1B,OAAO,CAAA,KAAM,QAAA,IAAY,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,GAAI,CAAA,GAAI,CAAA;AACpD,EAAA,MAAM,QAAQ,gBAAA,CAAiB,SAAA;AAK/B,EAAA,IAAI,OAAO,QAAA,EAAU;AACnB,IAAA,cAAA,CAAe,QAAA,CAAS,GAAA;AAAA,MACtB,MAAA,CAAO,KAAA,CAAM,QAAA,CAAS,CAAA,EAAG,CAAC,CAAA;AAAA,MAC1B,MAAA,CAAO,KAAA,CAAM,QAAA,CAAS,CAAA,EAAG,CAAC,CAAA;AAAA,MAC1B,MAAA,CAAO,KAAA,CAAM,QAAA,CAAS,CAAA,EAAG,CAAC;AAAA,KAC5B;AAAA,EACF;AACA,EAAA,IAAI,OAAO,QAAA,EAAU;AACnB,IAAA,cAAA,CAAe,QAAA,CAAS,GAAA;AAAA,MAChB,iBAAU,QAAA,CAAS,MAAA,CAAO,MAAM,QAAA,CAAS,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,MAC9C,iBAAU,QAAA,CAAS,MAAA,CAAO,MAAM,QAAA,CAAS,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,MAC9C,iBAAU,QAAA,CAAS,MAAA,CAAO,MAAM,QAAA,CAAS,CAAA,EAAG,CAAC,CAAC;AAAA,KACtD;AAAA,EACF;AACA,EAAA,IAAI,OAAO,KAAA,EAAO;AAChB,IAAA,cAAA,CAAe,KAAA,CAAM,GAAA;AAAA,MACnB,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAAA,MACvB,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAAA,MACvB,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAC;AAAA,KACzB;AAAA,EACF;AACA,EAAA,cAAA,CAAe,YAAA,EAAa;AAC5B,EAAA,cAAA,CAAe,kBAAkB,IAAI,CAAA;AAErC,EAAA,IAAI,iBAAiB,eAAA,KAAA,OAAA,cAA2C;AAC9D,IAAA,cAAA,CAAe,qBAAA,GAAwB,KAAA;AACvC,IAAA,cAAA,CAAe,YAAY,QAAA,EAAS;AAAA,EACtC;AAGA,EAAA,MAAM,WAAA,GAA2B;AAAA,IAC/B,gBAAA,EAAkB,iBAAA,EAAA;AAAA,IAClB,4BAAA,EAA8B,CAAA;AAAA,IAC9B,8BAAA,EAAgC,CAAA;AAAA,IAChC,iBAAA,EAAmB,IAAU,MAAA,CAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,IAC3C,oBAAA,EAAsB,IAAU,MAAA,CAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,IAC9C,mBAAA,EAAqB,IAAU,MAAA,CAAA,OAAA,EAAQ;AAAA,IACvC,iBAAA,EAAmB,IAAU,MAAA,CAAA,OAAA,EAAQ;AAAA,IACrC,eAAA,EAAiB,IAAU,MAAA,CAAA,UAAA,EAAW;AAAA,IACtC,iBAAA,EAAmB,IAAU,MAAA,CAAA,UAAA,EAAW;AAAA,IACxC,UAAA,EAAY,IAAU,MAAA,CAAA,OAAA,CAAQ,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,IACrC,UAAA,EAAY,IAAU,MAAA,CAAA,KAAA,EAAM;AAAA,IAC5B,eAAA,EAAiB,IAAU,MAAA,CAAA,OAAA,CAAQ,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,IAC1C,aAAa,EAAC;AAAA,IACd,kBAAA,EAAoB,MAAA;AAAA,IACpB,mBAAA,EAAqB,MAAA;AAAA,IACrB,gBAAgB,EAAC;AAAA,IACjB,aAAA,EAAe,IAAI,YAAA,CAAa,CAAC,CAAA;AAAA,IACjC,yBAAA,EAA2B,EAAA;AAAA,IAC3B,cAAA,EAAgB,CAAA;AAAA,IAChB,KAAA,EAAO;AAAA,MACL,QAAA,EAAU,iBAAiB,KAAA,CAAM,QAAA;AAAA,MACjC,QAAA,EAAU,iBAAiB,KAAA,CAAM,QAAA;AAAA;AAAA;AAAA,MAGjC,UAAA,EAAY,IAAA,GAAO,gBAAA,CAAiB,KAAA,CAAM,QAAA;AAAA,MAC1C,SAAA,EAAW,iBAAiB,KAAA,CAAM,SAAA;AAAA,MAClC,cAAA,EAAgB,iBAAiB,KAAA,CAAM,cAAA;AAAA,MACvC,cAAA,EAAgB,iBAAiB,KAAA,CAAM,cAAA;AAAA,MACvC,UAAA,EAAY,iBAAiB,KAAA,CAAM,UAAA;AAAA,MACnC,MAAA,EAAQ,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAC,gBAAA,CAAiB,MAAM,OAAO;AAAA,KACzD;AAAA,IACA,SAAA,EAAW,IAAA;AAAA,IACX,WAAA,EAAa,iBAAiB,QAAA,CAAS,MAAA,EAAQ,SAC3C,gBAAA,CAAiB,QAAA,CAAS,MAAA,CAAO,GAAA,CAAI,OAAO;AAAA,MAC1C,cAAA,EAAgB,CAAA;AAAA,MAChB,aAAA,EAAe,CAAA;AAAA,MACf,iBAAA,EAAmB;AAAA,MACnB,CAAA,GACF;AAAA,GACN;AAGA,EAAA,MAAM,KAAA,GAAgC;AAAA,IACpC,cAAA;AAAA,IACA,gBAAA,EAAkB;AAAA,MAChB,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,UAAU,OAAA,CAAQ,eAAA;AAAA,MAClB,UAAU,OAAA,CAAQ,aAAA;AAAA,MAClB,eAAe,OAAA,CAAQ,WAAA;AAAA,MACvB,YAAY,OAAA,CAAQ,aAAA;AAAA,MACpB,MAAM,OAAA,CAAQ,aAAA;AAAA,MACd,UAAU,OAAA,CAAQ,aAAA;AAAA,MAClB,OAAO,OAAA,CAAQ;AAAA,KACjB;AAAA;AAAA;AAAA;AAAA;AAAA,IAKA,WAAA,EAAa,IAAI,YAAA,CAAa,CAAC,CAAA;AAAA,IAC/B,yBAAyB,IAAU,MAAA,CAAA,iBAAA;AAAA,MACjC,IAAI,aAAa,CAAC,CAAA;AAAA,MAClB;AAAA,KACF;AAAA,IACA,cAAA;AAAA,IACA,WAAA;AAAA,IACA,UAAU,MAAM;AAAA,IAAC,CAAA;AAAA,IACjB,YAAY,MAAM;AAAA,IAAC,CAAA;AAAA,IACnB,YAAA,EAAc,GAAA,IAAQ,gBAAA,CAAiB,UAAA,IAAyB,CAAA,CAAA;AAAA,IAChE,gBAAA,EAAkB,GAAA;AAAA,IAClB,mBAAA,EAAqB,CAAA;AAAA,IACrB,UAAU,gBAAA,CAAiB,QAAA;AAAA,IAC3B,SAAS,gBAAA,CAAiB,OAAA;AAAA,IAC1B,iBAAiB,gBAAA,CAAiB,eAAA;AAAA,IAClC,SAAS,gBAAA,CAAiB,OAAA;AAAA,IAC1B,qBAAA,EAAuB,WAAA;AAAA,IACvB,yBAAA,EAA2B,eAAA;AAAA,IAC3B,UAAU,gBAAA,CAAiB,QAAA;AAAA,IAC3B,gBAAA;AAAA,IACA,cAAA,EAAgB,CAAA;AAAA,IAChB,YAAY,EAAC;AAAA,IACb,UAAU,EAAC;AAAA,IACX,oBAAoB,MAAM;AAAA,IAAC,CAAA;AAAA,IAC3B,cAAc,MAAM;AAAA,IAAC,CAAA;AAAA,IACrB,kBAAkB,MAAM;AAAA,IAAC,CAAA;AAAA,IACzB,eAAA,EAAiB,QAAA;AAAA,IACjB,aAAA,EAAe,IAAA;AAAA,IACf,oBAAA,EAAsB,KAAA;AAAA,IACtB,YAAA;AAAA,IACA,QAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,qBAAA;AAAA,IACA,qBAAA,EAAuB,MAAA;AAAA,IACvB,cAAA;AAAA,IACA,eAAA,EAAiB;AAAA,MACf,GAAK,QAAA,CAAS,YAAA,IAAgB,EAAC;AAAA,MAC/B,GAAI,cAAA,GAAiB,CAAC,cAAA,CAAe,UAAU,IAAI,EAAC;AAAA,MACpD,GAAG,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAA,KAAM;AAAA,QAC3B,EAAE,IAAA,CAAK,gBAAA;AAAA,QACP,EAAE,IAAA,CAAK,aAAA;AAAA,QACP,GAAI,CAAA,CAAE,IAAA,CAAK,gBAAA,IAAoB,IAAA,GAC3B,CAAC,CAAA,CAAE,IAAA,CAAK,gBAAgB,CAAA,GACxB,EAAC;AAAA,QACL,GAAM,CAAA,CAAE,QAAA,CAAS,YAAA,IAAgB;AAAC,OACnC;AAAA,KACH;AAAA,IACA,SAAA,EAAW;AAAA,MACT,GAAM,QAAA,CAAS,SAAA,IAAa,CAAC,QAAQ,UAAU,CAAA;AAAA,MAC/C,GAAI,cAAA,GAAiB,CAAC,cAAc,IAAI,EAAC;AAAA,MACzC,GAAG,UAAA,CAAW,OAAA,CAAQ,CAAC,GAAG,EAAA,KAAO;AAAA,QAC/B,MAAM,EAAE,CAAA,cAAA,CAAA;AAAA,QACR,MAAM,EAAE,CAAA,WAAA,CAAA;AAAA,QACR,MAAM,EAAE,CAAA,cAAA,CAAA;AAAA,QACR,MAAM,EAAE,CAAA,WAAA,CAAA;AAAA,QACR,MAAM,EAAE,CAAA,UAAA;AAAA,OACT;AAAA,KACH;AAAA,IACA,cAAA;AAAA,IACA,cAAA,EAAgB,cAAA,GACX,cAAA,CAAe,QAAA,GAChB,MAAA;AAAA,IACJ,aAAA,EAAe,cAAA,GACV,cAAA,CAAe,OAAA,GAChB,MAAA;AAAA,IACJ,WAAA,EAAa,CAAA;AAAA,IACb,UAAA,EAAY,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,MACjC,IAAA,EAAM,EAAE,QAAA,EAAU,CAAA,CAAE,KAAK,QAAA,EAAU,UAAA,EAAY,CAAA,CAAE,IAAA,CAAK,UAAA,EAAW;AAAA,MACjE,uBAAuB,CAAA,CAAE,qBAAA;AAAA,MACzB,uBAAuB,CAAA,CAAE,qBAAA;AAAA,MACzB,UAAU,CAAA,CAAE,QAAA;AAAA,MACZ,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,SAAS,CAAA,CAAE,OAAA;AAAA,MACX,OAAO,CAAA,CAAE,KAAA;AAAA,MACT,MAAM,CAAA,CAAE,IAAA;AAAA,MACR,GAAA,EAAK,CAAA;AAAA,MACL,OAAA,EAAS,EAAE,QAAA,CAAS,OAAA;AAAA,MACpB,IAAA,EAAM,CAAC,CAAA,CAAE,QAAA,CAAS,EAAA,EAAI,CAAA,CAAE,QAAA,CAAS,EAAA,EAAI,CAAA,CAAE,QAAA,CAAS,EAAA,EAAI,CAAA,CAAE,SAAS,EAAE,CAAA;AAAA,MACjE,KAAA,EAAO,CAAC,CAAA,CAAE,QAAA,CAAS,EAAA,EAAI,EAAE,QAAA,CAAS,EAAA,EAAI,CAAA,CAAE,QAAA,CAAS,EAAE,CAAA;AAAA,MACnD,QAAA,EAAU;AAAA,QACR,OAAQ,CAAA,CAAE,GAAA,CAAI,SAAA,EAAgF,QAAA,EAAU,GAAG,CAAC,CAAA;AAAA,QAC5G,OAAQ,CAAA,CAAE,GAAA,CAAI,SAAA,EAAgF,QAAA,EAAU,GAAG,CAAC,CAAA;AAAA,QAC5G,OAAQ,CAAA,CAAE,GAAA,CAAI,SAAA,EAAgF,QAAA,EAAU,GAAG,CAAC;AAAA;AAC9G,KACF,CAAE;AAAA,GACJ;AAEA,EAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,IAAA,IAAI,CAAC,EAAE,MAAA,EAAQ;AACf,IAAA,MAAM,EAAA,GAAK,EAAE,GAAA,CAAI,SAAA;AAKjB,IAAA,IAAI,IAAI,QAAA,EAAU;AAChB,MAAA,CAAA,CAAE,OAAO,QAAA,CAAS,GAAA;AAAA,QAChB,MAAA,CAAO,EAAA,CAAG,QAAA,CAAS,CAAA,EAAG,CAAC,CAAA;AAAA,QACvB,MAAA,CAAO,EAAA,CAAG,QAAA,CAAS,CAAA,EAAG,CAAC,CAAA;AAAA,QACvB,MAAA,CAAO,EAAA,CAAG,QAAA,CAAS,CAAA,EAAG,CAAC;AAAA,OACzB;AAAA,IACF;AACA,IAAA,IAAI,IAAI,QAAA,EAAU;AAChB,MAAA,CAAA,CAAE,OAAO,QAAA,CAAS,GAAA;AAAA,QACV,iBAAU,QAAA,CAAS,MAAA,CAAO,GAAG,QAAA,CAAS,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,QAC3C,iBAAU,QAAA,CAAS,MAAA,CAAO,GAAG,QAAA,CAAS,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,QAC3C,iBAAU,QAAA,CAAS,MAAA,CAAO,GAAG,QAAA,CAAS,CAAA,EAAG,CAAC,CAAC;AAAA,OACnD;AAAA,IACF;AACA,IAAA,IAAI,IAAI,KAAA,EAAO;AACb,MAAA,CAAA,CAAE,OAAO,KAAA,CAAM,GAAA;AAAA,QACb,MAAA,CAAO,EAAA,CAAG,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAAA,QACpB,MAAA,CAAO,EAAA,CAAG,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAAA,QACpB,MAAA,CAAO,EAAA,CAAG,KAAA,CAAM,CAAA,EAAG,CAAC;AAAA,OACtB;AAAA,IACF;AACA,IAAA,CAAA,CAAE,OAAO,YAAA,EAAa;AACtB,IAAA,MAAM,CAAA,GAAI,IAAU,MAAA,CAAA,UAAA,EAAW,CAAE,YAAA;AAAA,MAC/B,IAAU,MAAA,CAAA,KAAA;AAAA,QACF,iBAAU,QAAA,CAAS,MAAA,CAAQ,IAAI,QAAA,EAAiD,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,QACrF,iBAAU,QAAA,CAAS,MAAA,CAAQ,IAAI,QAAA,EAAiD,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,QACrF,iBAAU,QAAA,CAAS,MAAA,CAAQ,IAAI,QAAA,EAAiD,CAAA,EAAG,CAAC,CAAC,CAAA;AAAA,QAC3F;AAAA;AACF,KACF;AACA,IAAA,MAAM,QAAQ,KAAA,CAAM,UAAA,GAAa,UAAA,CAAW,OAAA,CAAQ,CAAC,CAAC,CAAA;AACtD,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,KAAA,CAAM,IAAA,GAAO,CAAC,CAAA,CAAE,CAAA,EAAG,EAAE,CAAA,EAAG,CAAA,CAAE,CAAA,EAAG,CAAA,CAAE,CAAC,CAAA;AAChC,MAAA,KAAA,CAAM,KAAA,GAAQ;AAAA,QACZ,MAAA,CAAO,EAAA,EAAI,KAAA,EAAO,CAAA,EAAG,CAAC,CAAA;AAAA,QACtB,MAAA,CAAO,EAAA,EAAI,KAAA,EAAO,CAAA,EAAG,CAAC,CAAA;AAAA,QACtB,MAAA,CAAO,EAAA,EAAI,KAAA,EAAO,CAAA,EAAG,CAAC;AAAA,OACxB;AAAA,IACF;AAAA,EACF;AACA,EAAA,sBAAA,CAAuB,KAAK,KAAK,CAAA;AASjC,EAAA,MAAM,cAAA,GAA0C;AAAA,IAC9C,GAAA,CAAK,QAAA,CAAS,WAAA,IAAe,EAAC,EAAwD,GAAA;AAAA,MACpF,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,IAAA,EAAM,EAAE,eAAe;AAAA,KACnC;AAAA,IACA,GAAA,CAAK,cAAA,EAAgB,WAAA,IAAe,EAAC,EAAwD,GAAA;AAAA,MAC3F,CAAC,CAAA,KAAM,CAAC,CAAA,CAAE,IAAA,EAAM,EAAE,eAAe;AAAA,KACnC;AAAA,IACA,GAAG,UAAA,CAAW,OAAA,CAAQ,CAAC,GAAG,EAAA,KAAgC;AAAA,MACxD,GAAA,CAAI,CAAA,CAAE,IAAA,CAAK,WAAA,IAAe,EAAC,EAAG,GAAA;AAAA,QAC5B,CAAC,CAAA,KAAM,CAAC,CAAA,GAAA,EAAM,EAAE,IAAI,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,eAAe;AAAA,OACjD;AAAA,MACA,GAAA,CAAI,CAAA,CAAE,QAAA,CAAS,WAAA,IAAe,EAAC,EAAG,GAAA;AAAA,QAChC,CAAC,CAAA,KAAM,CAAC,CAAA,GAAA,EAAM,EAAE,IAAI,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,eAAe;AAAA;AACjD,KACD;AAAA,GACH;AACA,EAAA,MAAM,WAAA,GAAc,cAAA,CAAe,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,CAAA,CAAE,CAAC,CAAC,GAAG,CAAC,CAAA;AAKxE,EAAA,IAAI,OAAO,OAAA,KAAY,WAAA,IAAe,OAAA,CAAQ,GAAA,EAAK;AACjD,IAAA,MAAM,MAAA,GAAS,gBAAA;AACf,IAAA,MAAM,OAAO,QAAA,CAAS,aAAA;AAItB,IAAA,MAAM,KAAK,MAAA,CAAO,WAAA;AAClB,IAAA,MAAM,IAAI,QAAA,CAAS,QAAA;AAInB,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,oBAAA,EAAuB,WAAA,CAAY,gBAAgB,CAAA,CAAA,EAAI;AAAA,MACjE,YAAA,EAAc,MAAA;AAAA,MACd,qBAAA;AAAA,MACA,qBAAA,EAAuB,MAAA;AAAA,MACvB,iBAAiB,gBAAA,CAAiB,eAAA;AAAA,MAClC,YAAA;AAAA,MACA;AAAA,KACD,CAAA;AACD,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,oBAAA,EAAuB,WAAA,CAAY,gBAAgB,CAAA,CAAA,EAAI;AAAA,MACjE,KAAA,EAAO;AAAA,QACL,UAAA,EAAY,MAAA,CAAO,KAAA,EAAO,KAAA,IAAS,IAAA;AAAA,QACnC,YAAA,EAAc,IAAA,CAAK,SAAA,EAAW,KAAA,IAAS,CAAA;AAAA,QACvC,QAAQ,IAAA,CAAK,MAAA,EAAQ,KAAA,IAAS,MAAA,CAAO,OAAO,MAAA,IAAU,IAAA;AAAA,QACtD,eAAA,EAAiB,IAAA,CAAK,eAAA,EAAiB,KAAA,IAAS,IAAA;AAAA,QAChD,MAAA,EAAQ,IAAA,CAAK,MAAA,EAAQ,KAAA,IAAS,IAAA;AAAA,QAC9B,YAAA,EAAc,IAAA,CAAK,YAAA,EAAc,KAAA,IAAS,IAAA;AAAA,QAC1C,WAAW,CAAC,IAAA,CAAK,YAAY,KAAA,EAAO,IAAA,CAAK,YAAY,KAAK,CAAA;AAAA,QAC1D,iBAAiB,CAAC,IAAA,CAAK,aAAa,KAAA,EAAO,IAAA,CAAK,aAAa,KAAK,CAAA;AAAA,QAClE,QAAA,EAAU,CAAC,IAAA,CAAK,KAAA,EAAO,KAAA,EAAO,KAAK,KAAA,EAAO,KAAA,EAAO,IAAA,CAAK,KAAA,EAAO,KAAK,CAAA;AAAA,QAClE,WAAA,EAAa,IAAA,CAAK,WAAA,EAAa,KAAA,IAAS;AAAA,OAC1C;AAAA,MACA,SAAA,EAAW;AAAA,QACT,QAAA,EAAU,OAAO,QAAA,IAAY,IAAA;AAAA,QAC7B,QAAA,EAAU,OAAO,QAAA,IAAY,IAAA;AAAA,QAC7B,KAAA,EAAO,OAAO,KAAA,IAAS;AAAA,OACzB;AAAA,MACA,QAAA,EAAU;AAAA,QACR,YAAA,EAAc,MAAA,CAAO,QAAA,EAAU,YAAA,IAAgB,CAAA;AAAA,QAC/C,gBAAA,EAAkB,MAAA,CAAO,QAAA,EAAU,gBAAA,IAAoB,CAAA;AAAA,QACvD,MAAA,EAAQ,MAAA,CAAO,QAAA,EAAU,MAAA,EAAQ,MAAA,IAAU;AAAA,OAC7C;AAAA,MACA,WAAA,EAAa;AAAA,QACX,QAAA,EAAU,IAAI,aAAA,IAAiB,IAAA;AAAA,QAC/B,KAAA,EAAO,IAAI,UAAA,IAAc,IAAA;AAAA,QACzB,IAAA,EAAM,IAAI,SAAA,IAAa,IAAA;AAAA,QACvB,QAAA,EAAU,IAAI,aAAA,IAAiB,IAAA;AAAA,QAC/B,KAAA,EAAO,IAAI,UAAA,IAAc,IAAA;AAAA,QACzB,OAAA,EAAS,IAAI,YAAA,IAAgB;AAAA,OAC/B;AAAA,MACA,SAAA,EACG,MAAA,CAAkC,SAAA,IAClC,MAAA,CAAoD,aACjD,SAAA,IACJ,IAAA;AAAA,MACF,eAAA,EAAiB,CAAC,CAAC,gBAAA,CAAiB,GAAA;AAAA,MACpC,iBAAiB,WAAA,CAAY,MAAA;AAAA,MAC7B,qBAAqB,eAAA,CAAgB,MAAA;AAAA,MACrC,eAAA,EAAA,CAAkB,gBAAA,CAAiB,WAAA,IAAe,EAAC,EAAG,MAAA;AAAA,MACtD,YAAA,EAAc,CAAC,CAAC,SAAA;AAAA,MAChB,SAAA,EAAW;AAAA,QACT,cAAA,EACE,CAAC,CAAC,MAAA,CAAO,sBAAsB,QAAA,KAC9B,CAAA,CAAE,UAAA,KAAe,MAAA,IAChB,CAAA,CAAE,WAAA,KAAgB,UAClB,CAAC,EAAE,OAAO,oBAAA,EAAsB,MAAA,IAC9B,OAAO,MAAA,CAAO,MAAA,CAAO,oBAAA,CAAqB,MAAM,CAAA,CAAE,IAAA;AAAA,UAChD,CAAC,KAAA,KAAe,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU;AAAA,SACnD,CAAA,CAAA;AAAA,QACN,iBACE,CAAC,CAAC,MAAA,CAAO,oBAAA,EAAsB,YAC/B,CAAC,EAAE,MAAA,CAAO,oBAAA,EAAsB,WAC9B,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,oBAAA,CAAqB,OAAO,CAAA,CAAE,IAAA;AAAA,UACjD,CAAC,KAAA,KAAe,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU;AAAA,SACnD,CAAA;AAAA,QACJ,gBAAA,EAAkB,CAAC,CAAC,gBAAA,CAAiB,gBAAA,EAAkB,QAAA;AAAA,QACvD,mBAAA,EAAqB,CAAC,CAAC,gBAAA,CAAiB,mBAAA,EAAqB,QAAA;AAAA,QAC7D,iBAAA,EAAmB,CAAC,CAAC,gBAAA,CAAiB,iBAAA,EAAmB,QAAA;AAAA,QACzD,oBAAA,EAAsB,CAAC,CAAC,gBAAA,CAAiB,oBAAA,EAAsB,QAAA;AAAA,QAC/D,KAAA,EAAO,CAAC,CAAC,gBAAA,CAAiB,KAAA,EAAO;AAAA;AACnC,KACD,CAAA;AACD,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,sBAAA,EAAyB,WAAA,CAAY,gBAAgB,CAAA,EAAA,EAAA,CAC9C,MAAM,SAAA,IAAa,EAAC,EAAgB,IAAA,CAAK,MAAM,CAAA,IAAK,kBAAkB,CAAA,mBAAA,EACrD,cAAA,CAAe,IAAI,CAAC,CAAA,KAAM,CAAA,EAAG,CAAA,CAAE,CAAC,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,CAAC,CAAC,CAAA,OAAA,CAAI,CAAA,CAAE,IAAA,CAAK,GAAG,CAAC,CAAA,gBAAA,EAC1D,QAAA,CAAS,OAAA,CAAQ,UAAA,EAA+C,UAAU,CAAC,CAAA;AAAA,KACnG;AAAA,EACF;AAMA,EAAA,MAAM,MAAA,GAAS,CAAC,SAAA,KAA+B;AAC7C,IAAA,4BAAA,CAA6B,OAAO,SAAS,CAAA;AACtB,EACzB,CAAA;AAEA,EAAA,MAAM,gBAAgB,MAAY;AAAE,IAAA,WAAA,CAAY,SAAA,GAAY,IAAA;AAAA,EAAM,CAAA;AAClE,EAAA,MAAM,eAAe,MAAY;AAAE,IAAA,WAAA,CAAY,SAAA,GAAY,KAAA;AAAA,EAAO,CAAA;AAClE,EAAA,MAAM,UAAU,MAAY;AAAE,IAAA,qBAAA,CAAsB,cAAc,CAAA;AAAA,EAAG,CAAA;AACrE,EAAA,MAAM,YAAA,GAAe,CAAC,OAAA,KAAiD;AACrE,IAAA,WAAA,CAAY,SAAA,CAAU,kBAAkB,OAAA,EAAS;AAAA,MAC/C,kBAAA,EAAoB,IAAA;AAAA,MACpB,mBAAmB;AAAC,KACrB,CAAA;AAAA,EAIH,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,QAAA,EAAU,cAAA;AAAA,IACV,aAAA;AAAA,IACA,YAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,YAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAOA,wBAAwB,MAAM,EAAA;AAAA,IAC9B,WAAA,EACE,KAAA,CAAM,eAAA,IAAmB,KAAA,CAAM,eAAA,CAAgB,MAAA,GAAS,CAAA,GACpD,KAAA,CAAM,eAAA,GACL,QAAA,CAAS,YAAA,IAAgB,QAAA,CAAS,WAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQzC,QAAA,EAAU;AAAA,MACR,YAAA;AAAA,MACA,gBAAgB,QAAA,CAAS,cAAA;AAAA;AAAA,MAEzB,qBAAA;AAAA,MACA,qBAAA,EAAuB,MAAA;AAAA;AAAA,MAEvB,UAAA,EACG,QAAA,CAAS,QAAA,CAAgD,IAAA,CAG1D,KAAA;AAAA,MACF,SAAS,QAAA,CAAS,OAAA;AAAA,MAClB,UAAU,QAAA,CAAS,QAAA;AAAA,MACnB,SAAS,QAAA,CAAS,OAAA;AAAA,MAClB,SAAA,EAAY,QAAA,CAAS,SAAA,IAAa,CAAC,QAAQ,UAAU,CAAA;AAAA,MACrD,YAAA,EAAe,KAAA,CAAM,SAAA,IAAa,EAAC;AAAA,MACnC,mBAAA,EAAqB,WAAA;AAAA,MACrB,iBAAA,EAAmB,cAAA;AAAA,MACnB,aAAA,EAAe,MACZ,QAAA,CAAS,QAAA,CAAS,SAAA,CAAgC,KAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAKrD,cAAc,UAAA,IAAc,EAAC,EAAG,GAAA,CAAI,CAAC,CAAA,MAAO;AAAA,QAC1C,qBAAA,EAAuB,EAAE,qBAAA,IAAyB,IAAA;AAAA,QAClD,uBAAuB,CAAA,CAAE,qBAAA;AAAA,QACzB,UAAU,CAAA,CAAE;AAAA,OACd,CAAE,CAAA;AAAA;AAAA,MAEF,UAAU,MAAM;AACd,QAAA,MAAM,MAAM,gBAAA,CAAiB,KAAA;AAO7B,QAAA,MAAM,MAAA,GACJ,GAAA,CAAI,KAAA,KAAU,MAAA,GACV,GAAA,CAAI,IAAA,GACJ,GAAA,CAAI,KAAA,KAAU,QAAA,GACZ,GAAA,CAAI,MAAA,GACJ,GAAA,CAAI,MAAA;AACZ,QAAA,MAAM,MAAM,gBAAA,CAAiB,GAAA;AAG7B,QAAA,OAAO;AAAA,UACL,UAAU,WAAA,CAAY,gBAAA;AAAA;AAAA,UAEtB,qBAAA,EAAuB,MAAA;AAAA,UACvB,qBAAA;AAAA,UACA,YAAA,EAAc,MAAA;AAAA,UACd,iBAAiB,gBAAA,CAAiB,eAAA;AAAA,UAClC,YAAA;AAAA,UACA,KAAA,EAAO;AAAA,YACL,aAAa,GAAA,CAAI,KAAA;AAAA,YACjB,YAAA,EACG,QAAA,CAAS,aAAA,EACN,SAAA,EAAW,KAAA,IAAS,CAAA;AAAA,YAC1B,MAAA,EAAQ,QAAQ,MAAA,IAAU,IAAA;AAAA,YAC1B,eAAA,EAAiB,QAAQ,eAAA,IAAmB,IAAA;AAAA,YAC5C,MAAA,EAAQ,QAAQ,GAAA,IAAO,IAAA;AAAA,YACvB,cAAc,GAAA,CAAI,KAAA,KAAU,SAAS,GAAA,CAAI,IAAA,EAAM,SAAS,IAAA,GAAO,IAAA;AAAA,YAC/D,SAAA,EAAW,GAAA,CAAI,SAAA,EAAW,KAAA,IAAS,IAAA;AAAA,YACnC,YAAA,EAAc,GAAA,CAAI,SAAA,EAAW,QAAA,IAAY,IAAA;AAAA,YACzC,QAAA,EAAU,GAAA,CAAI,GAAA,EAAK,KAAA,IAAS,IAAA;AAAA,YAC5B,WAAA,EAAa,GAAA,CAAI,GAAA,EAAK,QAAA,IAAY;AAAA,WACpC;AAAA,UACA,SAAA,EACG,MAAA,CAAkC,SAAA,IAClC,MAAA,CAAoD,aACjD,SAAA,IACJ,IAAA;AAAA,UACF,eAAA,EAAiB,CAAC,CAAC,gBAAA,CAAiB,GAAA;AAAA,UACpC,iBAAA,EAAmB,GAAA,EAAK,KAAA,GACpB,CAAC,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,CAAA,EAAG,GAAA,CAAI,KAAA,CAAM,MAAA,IAAU,CAAC,CAAA,GAC5C,IAAA;AAAA,UACJ,eAAA,EAAA,CAAkB,gBAAA,CAAiB,WAAA,IAAe,EAAC,EAAG,MAAA;AAAA,UACtD,mBAAA,EAAA,CAAsB,gBAAA,CAAiB,eAAA,IAAmB,EAAC,EAAG,MAAA;AAAA,UAC9D,eAAA,EAAA,CAAkB,gBAAA,CAAiB,WAAA,IAAe,EAAC,EAAG,MAAA;AAAA,UACtD,YAAA,EAAc,CAAC,CAAE,gBAAA,CAAiB,QAAA,CAC/B;AAAA,SACL;AAAA,MACF;AAAA;AACF,GACF;AACF;AAIA,IAAM,mBAAA,uBAA0B,OAAA,EAAuD;AAEvF,IAAM,cAAA,uBAAqB,OAAA,EAAgB;AAC3C,IAAM,+BAA+B,CACnC,KAAA,EACA,EAAE,GAAA,EAAK,KAAA,EAAO,SAAQ,KACb;AACT,EAAA,MAAM;AAAA,IACJ,WAAA;AAAA,IACA,gBAAA;AAAA,IACA,cAAA;AAAA,IACA,cAAA;AAAA,IACA,YAAA;AAAA,IACA,qBAAA;AAAA,IACA,yBAAA;AAAA,IACA,QAAA;AAAA,IACA,eAAA,EAAiB,QAAA;AAAA,IACjB,YAAA,GAAe,CAAA;AAAA,IACf,eAAA;AAAA,IACA,UAAA;AAAA,IACA,cAAA,GAAiB,CAAA;AAAA,IACjB;AAAA,GACF,GAAI,KAAA;AACJ,EAAA,IAAI,CAAC,QAAA,EAAU;AACf,EAAA,MAAM,IAAI,QAAA,CAAS,QAAA;AACnB,EAAA,MAAM,MAAM,gBAAA,CAAiB,QAAA;AAC7B,EAAA,MAAM,WAAW,GAAA,GAAM,YAAA;AACvB,EAAA,MAAM,OAAO,gBAAA,CAAiB,OAAA;AAC9B,EAAA,MAAM,eAAA,GAAkB,IAAA,GAAO,QAAA,IAAY,GAAA,GAAM,GAAA,CAAA,GAAQ,QAAA;AACzD,EAAA,WAAA,CAAY,4BAAA,GAA+B,IAAA,CAAK,GAAA,CAAI,IAAA,CAAK,GAAA,CAAK,kBAAkB,GAAA,GAAQ,GAAA,EAAK,CAAC,CAAA,EAAG,CAAC,CAAA;AAClG,EAAC,eAAqC,KAAA,GAAQ,OAAA;AAM9C,EAAA,MAAM,KAAK,WAAA,CAAY,eAAA;AACvB,EAAA,EAAA,CAAG,GAAA,CAAI,CAAA,EAAG,gBAAA,CAAiB,OAAA,EAAS,CAAC,CAAA;AACrC,EAAA,IAAI,iBAAiB,eAAA,KAAA,OAAA,cAA2C;AAC9D,IAAA,cAAA,CAAe,YAAA,EAAa;AAC5B,IAAA,MAAA,CAAO,IAAA,CAAK,eAAe,MAAM,CAAA;AACjC,IAAA,IAAI,eAAe,MAAA,EAAQ;AACzB,MAAA,cAAA,CAAe,OAAO,iBAAA,EAAkB;AACxC,MAAA,MAAA,CAAO,WAAA,CAAY,cAAA,CAAe,MAAA,CAAO,WAAW,CAAA;AAAA,IACtD;AACA,IAAA,MAAA,CAAO,SAAA;AAAA,MACL,WAAA,CAAY,oBAAA;AAAA,MACZ,WAAA,CAAY,eAAA;AAAA,MACZ,WAAA,CAAY;AAAA,KACd;AAAA,EACF,CAAA,MAAO;AACL,IAAA,cAAA,CAAe,iBAAA,EAAkB;AACjC,IAAA,cAAA,CAAe,gBAAA,CAAiB,YAAY,oBAAoB,CAAA;AAChE,IAAA,cAAA,CAAe,kBAAA,CAAmB,YAAY,eAAe,CAAA;AAC7D,IAAA,cAAA,CAAe,aAAA,CAAc,YAAY,UAAU,CAAA;AACnD,IAAA,MAAA,CAAO,IAAA,CAAK,WAAA,CAAY,eAAe,CAAA,CAAE,MAAA,EAAO;AAChD,IAAA,EAAA,CAAG,gBAAgB,MAAM,CAAA;AACzB,IAAA,EAAA,CAAG,CAAA,IAAK,WAAA,CAAY,UAAA,CAAW,CAAA,IAAK,CAAA;AACpC,IAAA,EAAA,CAAG,CAAA,IAAK,WAAA,CAAY,UAAA,CAAW,CAAA,IAAK,CAAA;AACpC,IAAA,EAAA,CAAG,CAAA,IAAK,WAAA,CAAY,UAAA,CAAW,CAAA,IAAK,CAAA;AAAA,EACtC;AAGA,EAAA,IAAI,WAAA,CAAY,iBAAA,CAAkB,CAAA,KAAM,MAAA,EAAQ;AAC9C,IAAA,0BAAA,CAA2B,IAAA,CAAK,YAAY,iBAAiB,CAAA;AAC7D,IAAA,WAAA,CAAY,8BAAA,IACV,0BAAA,CAA2B,UAAA,CAAW,WAAA,CAAY,oBAAoB,CAAA;AAAA,EAC1E;AACA,EAAA,WAAA,CAAY,iBAAA,CAAkB,IAAA,CAAK,WAAA,CAAY,oBAAoB,CAAA;AAGnE,EAAA,IAAI,SAAA,GAAY,CAAA;AAChB,EAAA,IAAI,WAAA,CAAY,SAAA,KAAc,IAAA,IAAQ,eAAA,GAAkB,MAAM,GAAA,CAAA,EAAO;AACnE,IAAA,MAAM,WAAW,KAAA,CAAM,gBAAA;AACvB,IAAA,MAAM,gBAAgB,GAAA,GAAM,QAAA;AAC5B,IAAA,IAAI,gBAAgB,CAAA,EAAG;AACrB,MAAA,KAAA,CAAM,gBAAA,GAAmB,GAAA;AACzB,MAAA,IAAI,SAAS,YAAA,EAAc;AACzB,QAAA,KAAA,CAAM,mBAAA,IAAuB,cAAA;AAAA,UAC3B,WAAA,CAAY,gBAAA;AAAA,UACZ,QAAA,CAAS,YAAA;AAAA,UACT,WAAA,CAAY;AAAA,aACT,aAAA,GAAgB,GAAA,CAAA;AAAA,MACvB;AAAA,IACF;AACA,IAAA,SAAA,IAAa,IAAA,CAAK,KAAA,CAAM,KAAA,CAAM,mBAAmB,CAAA;AACjD,IAAA,IAAI,SAAA,GAAY,CAAA,EAAG,KAAA,CAAM,mBAAA,IAAuB,SAAA;AAChD,IAAA,IAAI,QAAA,CAAS,gBAAA,IAAoB,WAAA,CAAY,8BAAA,GAAiC,CAAA,EAAG;AAC/E,MAAA,MAAM,CAAA,GAAI,cAAA;AAAA,QACR,WAAA,CAAY,gBAAA;AAAA,QACZ,QAAA,CAAS,gBAAA;AAAA,QACT,WAAA,CAAY;AAAA,OACd;AACA,MAAA,IAAI,IAAI,CAAA,EAAG;AACT,QAAA,MAAMC,EAAAA,GAAI,IAAA,CAAK,KAAA,CAAM,WAAA,CAAY,iCAAiC,CAAC,CAAA;AACnE,QAAA,SAAA,IAAaA,EAAAA;AACb,QAAA,WAAA,CAAY,iCAAiC,IAAA,CAAK,GAAA;AAAA,UAChD,WAAA,CAAY,iCAAiCA,EAAAA,GAAI,CAAA;AAAA,UACjD;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,QAAA,CAAS,MAAA,IAAU,WAAA,CAAY,WAAA,EAAa;AAC9C,MAAA,MAAM,SAAS,QAAA,CAAS,MAAA;AACxB,MAAA,MAAM,SAAS,WAAA,CAAY,WAAA;AAC3B,MAAA,MAAM,OAAO,eAAA,GAAkB,GAAA;AAC/B,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,QAAQ,CAAA,EAAA,EAAK;AACtC,QAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,QAAA,MAAM,CAAA,GAAI,OAAO,CAAC,CAAA;AAClB,QAAA,MAAM,GAAA,GAAM,EAAE,MAAA,IAAU,CAAA;AACxB,QAAA,MAAM,EAAA,GAAM,EAAE,QAAA,IAAY,CAAA;AAC1B,QAAA,MAAM,IAAA,GAAO,EAAE,WAAA,IAAe,CAAA;AAC9B,QAAA,IAAI,QAAQ,IAAA,IAAQ,CAAA,CAAE,QAAQ,CAAA,CAAA,IAAM,CAAA,CAAE,iBAAiB,CAAA,EAAG;AACxD,UAAA,CAAA,CAAE,cAAA,GAAiB,CAAA;AAAG,UAAA,CAAA,CAAE,aAAA,GAAgB,CAAA;AAAG,UAAA,CAAA,CAAE,iBAAA,GAAoB,KAAA;AAAA,QACnE;AACA,QAAA,IAAI,CAAA,CAAE,kBAAkB,GAAA,EAAK;AAC7B,QAAA,MAAM,IAAA,GAAA,CAAQ,CAAA,CAAE,IAAA,IAAQ,CAAA,IAAK,EAAE,cAAA,GAAiB,EAAA;AAChD,QAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,UAAA,IAAI,EAAE,cAAA,KAAmB,CAAA,IAAK,iBAAA,GAAoB,IAAA,CAAK,QAAO,GAAI,IAAA;AAClE,UAAA,IAAI,EAAE,iBAAA,EAAmB;AACvB,YAAA,SAAA,IAAa,IAAA,CAAK,KAAA;AAAA,cAChB,eAAe,WAAA,CAAY,gBAAA,EAAkB,CAAA,CAAE,KAAA,EAAO,YAAY,4BAA4B;AAAA,aAChG;AAAA,UACF;AACA,UAAA,CAAA,CAAE,cAAA,EAAA;AAAkB,UAAA,CAAA,CAAE,aAAA,GAAgB,IAAA;AAAA,QACxC;AAAA,MACF;AAAA,IACF;AACA,IAAA,IAAI,SAAA,GAAY,cAAc,SAAA,GAAY,YAAA;AAAA,EAC5C;AAGA,EAAC,CAAA,CAAE,MAA4B,KAAA,GAAQ,KAAA;AACvC,EAAC,CAAA,CAAE,OAAA,CAA8B,KAAA,GAAQ,KAAA,GAAQ,GAAA;AACjD,EAAE,CAAA,CAAE,eAAA,CAA6C,KAAA,CAAO,IAAA,CAAK,EAAE,CAAA;AAC/D,EAAC,CAAA,CAAE,UAAgC,KAAA,GAAQ,SAAA;AAM3C,EAAC,SAAS,QAAA,CAA0C,KAAA,GAAQ,IAAA,CAAK,GAAA,CAAI,GAAG,SAAS,CAAA;AAEjF,EAAA,IAAI,SAAS,kBAAA,EAAoB;AAC/B,IAAC,SAAS,kBAAA,CAAoD,KAAA,GAC5D,IAAA,CAAK,GAAA,CAAI,GAAG,SAAS,CAAA;AAAA,EACzB;AAEA,EAAA,MAAM,IAAI,WAAA,CAAY,KAAA;AACtB,EAAA,IAAI,EAAE,aAAA,EAAgB,CAAA,CAAE,aAAA,CAAoC,QAAQ,CAAA,CAAE,QAAA;AACtE,EAAA,IAAI,EAAE,UAAA,EAAa,CAAA,CAAE,UAAA,CAAiC,QAAQ,CAAA,CAAE,UAAA;AAChE,EAAA,IAAI,EAAE,cAAA,EAAiB,CAAA,CAAE,cAAA,CAAqC,QAAQ,CAAA,CAAE,SAAA;AACxE,EAAA,IAAI,EAAE,mBAAA,EAAsB,CAAA,CAAE,mBAAA,CAA0C,QAAQ,CAAA,CAAE,cAAA;AAClF,EAAA,IAAI,EAAE,mBAAA,EAAsB,CAAA,CAAE,mBAAA,CAA0C,QAAQ,CAAA,CAAE,cAAA;AAClF,EAAA,IAAI,EAAE,eAAA,EAAkB,CAAA,CAAE,eAAA,CAAsC,QAAQ,CAAA,CAAE,UAAA;AAO1E,EAAA,MAAM,OAAO,QAAA,CAAS,WAAA;AAOtB,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,IAAI,iBAAiB,eAAA,KAAA,OAAA,cAA2C;AAC9D,MAAA,cAAA,CAAe,YAAA,EAAa;AAC5B,MAAA,MAAA,CAAO,IAAA,CAAK,eAAe,MAAM,CAAA;AACjC,MAAA,IAAI,eAAe,MAAA,EAAQ;AACzB,QAAA,cAAA,CAAe,OAAO,iBAAA,EAAkB;AACxC,QAAA,MAAA,CAAO,WAAA,CAAY,cAAA,CAAe,MAAA,CAAO,WAAW,CAAA;AAAA,MACtD;AACA,MAAA,MAAA,CAAO,SAAA,CAAU,MAAA,EAAQ,MAAA,EAAQ,MAAM,CAAA;AACvC,MAAA,IAAA,CAAK,SAAA,CAAU,MAAM,GAAA,CAAI,MAAA,CAAO,GAAG,MAAA,CAAO,CAAA,EAAG,MAAA,CAAO,CAAA,EAAG,CAAC,CAAA;AACxD,MAAA,IAAA,CAAK,WAAA,CAAY,KAAA,CAAM,GAAA,CAAI,MAAA,CAAO,CAAA,EAAG,OAAO,CAAA,EAAG,MAAA,CAAO,CAAA,EAAG,MAAA,CAAO,CAAC,CAAA;AACjE,MAAA,IAAA,CAAK,UAAA,CAAW,KAAA,CAAM,GAAA,CAAI,MAAA,CAAO,CAAA,IAAK,CAAA,EAAG,MAAA,CAAO,CAAA,IAAK,CAAA,EAAG,MAAA,CAAO,CAAA,IAAK,CAAC,CAAA;AAAA,IACvE,CAAA,MAAO;AACL,MAAA,IAAA,CAAK,UAAU,KAAA,CAAM,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AACnC,MAAA,IAAA,CAAK,YAAY,KAAA,CAAM,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AACrC,MAAA,IAAA,CAAK,UAAA,CAAW,KAAA,CAAM,GAAA,CAAI,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,IACnC;AAAA,EACF;AAKA,EAAA,MAAM,MAAA,GAAA,CAAU,KAAA,CAAM,WAAA,IAAe,CAAA,IAAK,CAAA;AAC1C,EAAA,MAAM,QAAA,GAAW,MAAA;AACjB,EAAA,IAAI,CAAA,CAAE,QAAA,EAAW,CAAA,CAAE,SAA+B,KAAA,GAAQ,QAAA;AAC1D,EAAA,IAAI,CAAA,CAAE,KAAA,EAAQ,CAAA,CAAE,MAA4B,KAAA,GAAQ,GAAA;AACpD,EAAA,IAAI,cAAA,EAAgB,KAAA,EAAO,cAAA,CAAe,KAAA,CAAM,KAAA,GAAQ,GAAA;AAGxD,EAAA,KAAA,MAAW,CAAA,IAAK,UAAA,IAAc,EAAC,EAAG;AAChC,IAAA,MAAM,KAAK,CAAA,CAAE,QAAA;AAUb,IAAA,IAAI,CAAC,EAAA,EAAI;AACT,IAAA,MAAM,KAAK,EAAA,CAAG,QAAA;AACd,IAAA,IAAI,EAAA,CAAG,KAAA,EAAQ,EAAA,CAAG,MAA4B,KAAA,GAAQ,KAAA;AACtD,IAAA,IAAI,GAAG,OAAA,EAAU,EAAA,CAAG,OAAA,CAA8B,QAAQ,KAAA,GAAQ,GAAA;AAClE,IAAA,IAAI,EAAA,CAAG,KAAA,EAAQ,EAAA,CAAG,MAA4B,KAAA,GAAQ,GAAA;AAEtD,IAAA,IAAI,GAAG,eAAA,EAAiB;AACtB,MAAE,EAAA,CAAG,gBAA6C,KAAA,CAAO,GAAA;AAAA,QACvD,CAAA;AAAA,QACA,CAAA,CAAE,OAAA;AAAA,QACF;AAAA,OACF;AAAA,IACF;AACA,IAAA,IAAI,EAAE,KAAA,EAAO;AACX,MAAA,IAAI,GAAG,aAAA,EAAgB,GAAG,aAAA,CAAoC,KAAA,GAAQ,EAAE,KAAA,CAAM,QAAA;AAC9E,MAAA,IAAI,GAAG,UAAA,EAAa,GAAG,UAAA,CAAiC,KAAA,GAAQ,EAAE,KAAA,CAAM,UAAA;AACxE,MAAA,IAAI,GAAG,cAAA,EAAiB,GAAG,cAAA,CAAqC,KAAA,GAAQ,EAAE,KAAA,CAAM,SAAA;AAChF,MAAA,IAAI,GAAG,mBAAA,EAAsB,GAAG,mBAAA,CAA0C,KAAA,GAAQ,EAAE,KAAA,CAAM,cAAA;AAC1F,MAAA,IAAI,GAAG,mBAAA,EAAsB,GAAG,mBAAA,CAA0C,KAAA,GAAQ,EAAE,KAAA,CAAM,cAAA;AAC1F,MAAA,IAAI,GAAG,eAAA,EAAkB,GAAG,eAAA,CAAsC,KAAA,GAAQ,EAAE,KAAA,CAAM,UAAA;AAAA,IACpF;AACA,IAAA,IAAI,EAAA,CAAG,QAAA,EAAW,EAAA,CAAG,SAA+B,KAAA,GAAQ,QAAA;AAE5D,IAAA,IAAI,CAAA,CAAE,KAAK,QAAA,CAAS,QAAA,IAAY,IAAA,CAAK,QAAA,CAAS,SAAS,KAAA,GAAQ,QAAA;AAE/D,IAAA,IAAI,SAAA,GAAY,CAAA;AAChB,IAAA,IAAI,CAAA,CAAE,OAAO,CAAA,EAAG;AACd,MAAA,CAAA,CAAE,GAAA,IAAQ,CAAA,CAAE,IAAA,GAAO,KAAA,GAAS,CAAA;AAC5B,MAAA,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,GAAG,CAAA;AAC5B,MAAA,IAAI,SAAA,GAAY,CAAA,EAAG,CAAA,CAAE,GAAA,IAAO,SAAA;AAAA,IAC9B;AACA,IAAA,MAAM,gBAAgB,IAAA,CAAK,GAAA,CAAI,IAAI,EAAA,CAAG,cAAA,IAAkB,KAAK,CAAC,CAAA;AAC9D,IAAA,IAAI,SAAA,GAAY,eAAe,SAAA,GAAY,aAAA;AAC3C,IAAA,IAAI,EAAA,CAAG,UAAU,EAAA,CAAG,QAAA,CAAS,QAAQ,IAAA,CAAK,GAAA,CAAI,GAAG,SAAS,CAAA;AAC1D,IAAA,IAAI,EAAA,CAAG,SAAA,EAAY,EAAA,CAAG,UAAgC,KAAA,GAAQ,SAAA;AAG9D,IAAA,MAAM,QAAQ,EAAA,CAAG,WAAA;AACjB,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,IAAI,CAAA,CAAE,YAAY,CAAA,EAAG;AACnB,QAAA,KAAA,CAAM,SAAA,CAAU,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,SAAS,CAAC,CAAA,EAAG,CAAA,CAAE,QAAA,CAAS,CAAC,CAAA,EAAG,CAAA,CAAE,QAAA,CAAS,CAAC,GAAG,CAAC,CAAA;AACxE,QAAA,KAAA,CAAM,YAAY,KAAA,CAAM,GAAA,CAAI,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,CAAC,CAAA;AACtE,QAAA,KAAA,CAAM,UAAA,CAAW,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,MAAM,CAAC,CAAA,EAAG,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,EAAG,CAAA,CAAE,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,MAC/D,CAAA,MAAO;AACL,QAAA,KAAA,CAAM,UAAU,KAAA,CAAM,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AACpC,QAAA,KAAA,CAAM,YAAY,KAAA,CAAM,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AACtC,QAAA,KAAA,CAAM,UAAA,CAAW,KAAA,CAAM,GAAA,CAAI,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,MACpC;AAAA,IACF;AACA,IAAA,MAAM,EAAA,GAAK,EAAE,IAAA,CAAK,QAAA;AAIlB,IAAA,IAAI,EAAA,CAAG,SAAA,IAAa,EAAA,CAAG,WAAA,EAAa;AAClC,MAAA,IAAI,CAAA,CAAE,YAAY,CAAA,EAAG;AACnB,QAAA,EAAA,CAAG,SAAA,CAAU,KAAA,CAAM,GAAA,CAAI,CAAA,CAAE,SAAS,CAAC,CAAA,EAAG,CAAA,CAAE,QAAA,CAAS,CAAC,CAAA,EAAG,CAAA,CAAE,QAAA,CAAS,CAAC,GAAG,CAAC,CAAA;AACrE,QAAA,EAAA,CAAG,YAAY,KAAA,CAAM,GAAA,CAAI,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,CAAE,IAAA,CAAK,CAAC,CAAC,CAAA;AAAA,MACrE,CAAA,MAAO;AACL,QAAA,EAAA,CAAG,UAAU,KAAA,CAAM,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AACjC,QAAA,EAAA,CAAG,YAAY,KAAA,CAAM,GAAA,CAAI,CAAA,EAAG,CAAA,EAAG,GAAG,CAAC,CAAA;AAAA,MACrC;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,SAAS,QAAA,CAAS,cAAA;AACxB,EAAA,MAAM,KAAA,GAAS,SAAS,kBAAA,IAAsB,IAAA;AAC9C,EAAA,IAAA,CAAK,MAAA,IAAU,UAAU,mBAAA,EAAqB;AAG5C,IAAA,MAAM,KAAA,GAAQ,SAAS,OAAA,CAAQ,UAAA;AAC/B,IAAA,MAAM,SAAS,QAAA,CAAS,cAAA;AAIxB,IAAA,IAAI,MAAA,IAAU,qBAAA,CAAsB,MAAA,GAAS,CAAA,EAAG;AAC9C,MAAA,MAAM,QAAQ,mBAAA,CAAoB,uBAAA,CAAyB,uBAAuB,WAAA,CAAY,gBAAA,EAAkB,YAAY,4BAA4B,CAAA;AACxJ,MAAA,IAAI,SAAA,GAAY,KAAA;AAChB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK,IAAI,KAAA,CAAM,MAAA,CAAO,MAAA,GAAS,CAAC,CAAA,KAAM,KAAA,CAAM,CAAC,CAAA,EAAG;AAAE,QAAA,SAAA,GAAY,IAAA;AAAM,QAAA;AAAA,MAAO;AAC7G,MAAA,IAAI,SAAA,EAAW;AAAE,QAAA,KAAA,CAAM,GAAA,CAAI,KAAA,EAAO,MAAA,CAAO,MAAM,CAAA;AAAG,QAAA,MAAA,CAAO,cAAA,CAAe,MAAA,CAAO,MAAA,EAAQ,KAAA,CAAM,MAAM,CAAA;AAAG,QAAA,MAAA,CAAO,WAAA,GAAc,IAAA;AAAA,MAAM;AACjI,MAAA,MAAA,CAAO,YAAA,CAAa,QAAQ,qBAAA,CAAsB,MAAA;AAAA,IACpD;AACA,IAAA,IAAI,KAAA,IAAS,yBAAA,CAA0B,MAAA,GAAS,CAAA,EAAG;AACjD,MAAA,MAAM,KAAA,GAAQ,mBAAA,CAAoB,2BAAA,CAA6B,yBAAyB,CAAA;AACxF,MAAA,IAAI,SAAA,GAAY,KAAA;AAChB,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK,IAAI,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,KAAM,KAAA,CAAM,CAAC,CAAA,EAAG;AAAE,QAAA,SAAA,GAAY,IAAA;AAAM,QAAA;AAAA,MAAO;AAC5G,MAAA,IAAI,SAAA,EAAW;AAAE,QAAA,KAAA,CAAM,GAAA,CAAI,KAAA,EAAO,KAAA,CAAM,MAAM,CAAA;AAAG,QAAA,MAAA,CAAO,cAAA,CAAe,KAAA,CAAM,MAAA,EAAQ,KAAA,CAAM,MAAM,CAAA;AAAG,QAAA,MAAA,CAAO,WAAA,GAAc,IAAA;AAAA,MAAM;AAC/H,MAAA,KAAA,CAAM,YAAA,CAAa,QAAQ,yBAAA,CAA0B,MAAA;AAAA,IACvD;AAAA,EACF;AAIA,EAAA,MAAM,OAAO,QAAA,CAAS,OAAA;AACtB,EAAA,IAAI,KAAA,GAAQ,mBAAA,CAAoB,GAAA,CAAI,IAAI,CAAA;AACxC,EAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,CAAA,EAAG;AACtC,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,IAAI,CAAA,EAAG;AACnC,MAAA,MAAM,CAAA,GAAI,KAAK,GAAG,CAAA;AAClB,MAAA,IAAI,CAAA,IAAK,aAAA,IAAiB,CAAA,EAAG,CAAA,CAAE,WAAA,GAAc,IAAA;AAAA,IAC/C;AACA,IAAA,mBAAA,CAAoB,GAAA,CAAI,MAAM,CAAC,CAAA;AAAA,EACjC,CAAA,MAAO;AACL,IAAA,mBAAA,CAAoB,GAAA,CAAI,IAAA,EAAM,KAAA,GAAQ,CAAC,CAAA;AAAA,EACzC;AAIA,EAAA,KAAA,MAAW,CAAA,IAAK,UAAA,IAAc,EAAC,EAAG;AAChC,IAAA,MAAM,EAAA,GAAM,EAAE,QAAA,EACV,OAAA;AACJ,IAAA,IAAI,EAAA,IAAM,CAAC,mBAAA,CAAoB,GAAA,CAAI,EAAsD,CAAA,EAAG;AAC1F,MAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,EAAG;AACjC,QAAA,MAAM,CAAA,GAAI,GAAG,GAAG,CAAA;AAChB,QAAA,IAAI,CAAA,IAAK,aAAA,IAAiB,CAAA,EAAG,CAAA,CAAE,WAAA,GAAc,IAAA;AAAA,MAC/C;AACA,MAAA,mBAAA,CAAoB,GAAA,CAAI,IAAwD,CAAC,CAAA;AAAA,IACnF;AACA,IAAA,MAAM,GAAA,GAAM,EAAE,IAAA,CAAK,aAAA;AACnB,IAAA,IAAI,OAAO,aAAA,IAAiB,GAAA,IAAO,CAAC,cAAA,CAAe,GAAA,CAAI,GAAG,CAAA,EAAG;AAC3D,MAAA,GAAA,CAAI,WAAA,GAAc,IAAA;AAClB,MAAA,cAAA,CAAe,IAAI,GAAG,CAAA;AAAA,IACxB;AAAA,EACF;AACA,EAAA,MAAM,KAAM,KAAA,CACT,aAAA;AACH,EAAA,IAAI,EAAA,IAAM,CAAC,mBAAA,CAAoB,GAAA,CAAI,EAAE,CAAA,EAAG;AACtC,IAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,EAAE,CAAA,EAAG;AACjC,MAAA,MAAM,CAAA,GAAI,GAAG,GAAG,CAAA;AAChB,MAAA,IAAI,CAAA,IAAK,aAAA,IAAiB,CAAA,EAAG,CAAA,CAAE,WAAA,GAAc,IAAA;AAAA,IAC/C;AACA,IAAA,mBAAA,CAAoB,GAAA,CAAI,IAAI,CAAC,CAAA;AAAA,EAC/B;AAGA,EAAA,KAAA,CAAM,oBAAA,GAAuB,IAAA;AAG7B,EAAA,KAAA,CAAM,cAAA,EAAA;AACN,EAAA,KAAA,CAAM,WAAA,GAAA,CAAe,KAAA,CAAM,WAAA,IAAe,CAAA,IAAK,CAAA;AAG/C,EAAA,IAAI,KAAA,CAAM,SAAA,EAAW,mBAAA,CAAoB,KAAA,EAAO,GAAG,CAAA;AACrD,CAAA;AAGA,IAAM,MAAA,GAAS,IAAU,MAAA,CAAA,UAAA,EAAW;AACpC,IAAM,MAAA,GAAS,IAAU,MAAA,CAAA,OAAA,EAAQ;AACjC,IAAM,MAAA,GAAS,IAAU,MAAA,CAAA,OAAA,EAAQ;AACjC,IAAM,MAAA,GAAS,IAAU,MAAA,CAAA,OAAA,EAAQ;AAKjC,IAAM,aAAa,CACjB,GAAA,EACA,MAAA,EACA,GAAA,EACA,KACA,GAAA,EACA,GAAA,EACA,GAAA,EACA,GAAA,EACA,KACA,GAAA,EACA,GAAA,EACA,GAAA,EACA,GAAA,EACA,KACA,CAAA,KACG;AACH,EAAA,MAAM,KAAK,CAAA,GAAI,CAAA;AACf,EAAA,MAAM,KAAK,EAAA,GAAK,CAAA;AAChB,EAAA,GAAA,CAAI,MAAM,IACR,GAAA,IACC,CAAA,GAAI,OACF,CAAC,GAAA,GAAM,GAAA,IAAO,CAAA,GAAA,CACd,CAAA,GAAI,GAAA,GAAM,IAAI,GAAA,GAAM,CAAA,GAAI,GAAA,GAAM,GAAA,IAAO,EAAA,GAAA,CACrC,CAAC,MAAM,CAAA,GAAI,GAAA,GAAM,CAAA,GAAI,GAAA,GAAM,GAAA,IAAO,EAAA,CAAA;AACvC,EAAA,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,GACZ,GAAA,IACC,CAAA,GAAI,OACF,CAAC,GAAA,GAAM,GAAA,IAAO,CAAA,GAAA,CACd,CAAA,GAAI,GAAA,GAAM,IAAI,GAAA,GAAM,CAAA,GAAI,GAAA,GAAM,GAAA,IAAO,EAAA,GAAA,CACrC,CAAC,MAAM,CAAA,GAAI,GAAA,GAAM,CAAA,GAAI,GAAA,GAAM,GAAA,IAAO,EAAA,CAAA;AACvC,EAAA,GAAA,CAAI,MAAA,GAAS,CAAC,CAAA,GACZ,GAAA,IACC,CAAA,GAAI,OACF,CAAC,GAAA,GAAM,GAAA,IAAO,CAAA,GAAA,CACd,CAAA,GAAI,GAAA,GAAM,IAAI,GAAA,GAAM,CAAA,GAAI,GAAA,GAAM,GAAA,IAAO,EAAA,GAAA,CACrC,CAAC,MAAM,CAAA,GAAI,GAAA,GAAM,CAAA,GAAI,GAAA,GAAM,GAAA,IAAO,EAAA,CAAA;AACzC,CAAA;AAGA,IAAM,gBAAA,GAAmB,CACvB,IAAA,EACA,IAAA,EACA,MACA,KAAA,EACA,WAAA,EACA,YAAA,EACA,iBAAA,EACA,UAAA,EACA,aAAA,EACA,aAAA,EACA,SAAA,EACA,WACA,SAAA,KACG;AACH,EAAA,WAAA,CAAY,IAAI,CAAA,GAAI,SAAA;AACpB,EAAA,WAAA,CAAY,IAAA,GAAO,CAAC,CAAA,GAAI,SAAA;AACxB,EAAA,WAAA,CAAY,IAAA,GAAO,CAAC,CAAA,GAAI,SAAA;AACxB,EAAA,WAAA,CAAY,IAAA,GAAO,CAAC,CAAA,GAAI,SAAA;AACxB,EAAA,WAAA,CAAY,IAAA,GAAO,CAAC,CAAA,GAAI,SAAA;AACxB,EAAA,WAAA,CAAY,IAAA,GAAO,CAAC,CAAA,GAAI,SAAA;AACxB,EAAA,YAAA,CAAa,IAAI,CAAA,GAAI,SAAA;AACrB,EAAA,YAAA,CAAa,IAAA,GAAO,CAAC,CAAA,GAAI,SAAA;AACzB,EAAA,YAAA,CAAa,IAAA,GAAO,CAAC,CAAA,GAAI,SAAA;AACzB,EAAA,YAAA,CAAa,IAAA,GAAO,CAAC,CAAA,GAAI,SAAA;AACzB,EAAA,YAAA,CAAa,IAAA,GAAO,CAAC,CAAA,GAAI,SAAA;AACzB,EAAA,YAAA,CAAa,IAAA,GAAO,CAAC,CAAA,GAAI,SAAA;AACzB,EAAA,iBAAA,CAAkB,IAAI,CAAA,GAAI,CAAA;AAC1B,EAAA,iBAAA,CAAkB,IAAA,GAAO,CAAC,CAAA,GAAI,CAAA;AAC9B,EAAA,UAAA,CAAW,KAAK,CAAA,GAAI,CAAA;AACpB,EAAA,UAAA,CAAW,KAAA,GAAQ,CAAC,CAAA,GAAI,CAAA;AACxB,EAAA,UAAA,CAAW,KAAA,GAAQ,CAAC,CAAA,GAAI,CAAA;AACxB,EAAA,UAAA,CAAW,KAAA,GAAQ,CAAC,CAAA,GAAI,CAAA;AACxB,EAAA,aAAA,CAAc,IAAI,CAAA,GAAI,CAAA;AACtB,EAAA,aAAA,CAAc,IAAA,GAAO,CAAC,CAAA,GAAI,CAAA;AAC1B,EAAA,aAAA,CAAc,IAAI,CAAA,GAAI,CAAA;AACtB,EAAA,aAAA,CAAc,IAAA,GAAO,CAAC,CAAA,GAAI,CAAA;AAC1B,EAAA,aAAA,CAAc,IAAA,GAAO,CAAC,CAAA,GAAI,CAAA;AAC1B,EAAA,aAAA,CAAc,IAAA,GAAO,CAAC,CAAA,GAAI,CAAA;AAC1B,EAAA,aAAA,CAAc,IAAA,GAAO,CAAC,CAAA,GAAI,CAAA;AAC1B,EAAA,aAAA,CAAc,IAAA,GAAO,CAAC,CAAA,GAAI,CAAA;AAC1B,EAAA,aAAA,CAAc,IAAA,GAAO,CAAC,CAAA,GAAI,CAAA;AAC1B,EAAA,aAAA,CAAc,IAAA,GAAO,CAAC,CAAA,GAAI,CAAA;AAC5B,CAAA;AAKA,IAAM,gBAAA,GAAmB,CACvB,IAAA,EACA,IAAA,EACA,IAAA,EACA,OACA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EACA,WACA,CAAA,EACA,KAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EACA,EAAA,EACA,aACA,YAAA,EACA,iBAAA,EACA,UAAA,EACA,aAAA,EACA,aAAA,KACG;AACH,EAAA,WAAA,CAAY,IAAI,CAAA,GAAI,EAAA;AACpB,EAAA,WAAA,CAAY,IAAA,GAAO,CAAC,CAAA,GAAI,EAAA;AACxB,EAAA,WAAA,CAAY,IAAA,GAAO,CAAC,CAAA,GAAI,EAAA;AACxB,EAAA,WAAA,CAAY,IAAA,GAAO,CAAC,CAAA,GAAI,EAAA;AACxB,EAAA,WAAA,CAAY,IAAA,GAAO,CAAC,CAAA,GAAI,EAAA;AACxB,EAAA,WAAA,CAAY,IAAA,GAAO,CAAC,CAAA,GAAI,EAAA;AACxB,EAAA,YAAA,CAAa,IAAI,CAAA,GAAI,EAAA;AACrB,EAAA,YAAA,CAAa,IAAA,GAAO,CAAC,CAAA,GAAI,EAAA;AACzB,EAAA,YAAA,CAAa,IAAA,GAAO,CAAC,CAAA,GAAI,EAAA;AACzB,EAAA,YAAA,CAAa,IAAA,GAAO,CAAC,CAAA,GAAI,EAAA;AACzB,EAAA,YAAA,CAAa,IAAA,GAAO,CAAC,CAAA,GAAI,EAAA;AACzB,EAAA,YAAA,CAAa,IAAA,GAAO,CAAC,CAAA,GAAI,EAAA;AACzB,EAAA,iBAAA,CAAkB,IAAI,CAAA,GAAI,SAAA;AAC1B,EAAA,iBAAA,CAAkB,IAAA,GAAO,CAAC,CAAA,GAAI,SAAA;AAC9B,EAAA,UAAA,CAAW,KAAK,CAAA,GAAI,CAAA;AACpB,EAAA,UAAA,CAAW,KAAA,GAAQ,CAAC,CAAA,GAAI,CAAA;AACxB,EAAA,UAAA,CAAW,KAAA,GAAQ,CAAC,CAAA,GAAI,CAAA;AACxB,EAAA,UAAA,CAAW,KAAA,GAAQ,CAAC,CAAA,GAAI,CAAA;AACxB,EAAA,aAAA,CAAc,IAAI,CAAA,GAAI,KAAA;AACtB,EAAA,aAAA,CAAc,IAAA,GAAO,CAAC,CAAA,GAAI,KAAA;AAC1B,EAAA,aAAA,CAAc,IAAI,CAAA,GAAI,EAAA;AACtB,EAAA,aAAA,CAAc,IAAA,GAAO,CAAC,CAAA,GAAI,EAAA;AAC1B,EAAA,aAAA,CAAc,IAAA,GAAO,CAAC,CAAA,GAAI,EAAA;AAC1B,EAAA,aAAA,CAAc,IAAA,GAAO,CAAC,CAAA,GAAI,EAAA;AAC1B,EAAA,aAAA,CAAc,IAAA,GAAO,CAAC,CAAA,GAAI,EAAA;AAC1B,EAAA,aAAA,CAAc,IAAA,GAAO,CAAC,CAAA,GAAI,EAAA;AAC1B,EAAA,aAAA,CAAc,IAAA,GAAO,CAAC,CAAA,GAAI,EAAA;AAC1B,EAAA,aAAA,CAAc,IAAA,GAAO,CAAC,CAAA,GAAI,EAAA;AAC5B,CAAA;AAGA,IAAI,UAAA,GAAkC,IAAA;AACtC,IAAI,cAAA,GAAiB,CAAA;AACrB,IAAI,eAAA,GAAuC,IAAA;AAC3C,IAAI,mBAAA,GAAsB,CAAA;AAG1B,IAAI,cAAA,GAAqC,IAAA;AACzC,IAAI,kBAAA,GAAqB,CAAA;AACzB,IAAI,YAAA,GAAe,CAAA;AAanB,IAAM,mBAAA,GAAsB,CAAC,KAAA,EAA+B,GAAA,KAAgB;AAC1E,EAAA,MAAM;AAAA,IACJ,WAAA;AAAA,IACA,iBAAA;AAAA,IACA,cAAA;AAAA,IACA,cAAA;AAAA,IACA,aAAA,EAAe,mBAAA;AAAA,IACf,kBAAA,EAAoB,wBAAA;AAAA,IACpB,WAAA,EAAa,iBAAA;AAAA,IACb,iBAAA;AAAA,IACA,mBAAA;AAAA,IACA,sBAAA;AAAA,IACA,WAAA;AAAA,IACA,gBAAA,EAAkB;AAAA,GACpB,GAAI,KAAA;AAEJ,EAAA,IACE,CAAC,iBAAA,IACD,CAAC,cAAA,IACD,CAAC,kBACD,CAAC,mBAAA,IACD,CAAC,wBAAA,IACD,CAAC,iBAAA,IACD,CAAC,iBAAA,IACD,CAAC,mBAAA,IACD,CAAC,WAAA,IACD,CAAC,WAAA,CAAY,eAAA,IACb,CAAC,WAAA,CAAY,oBAAA,IACb,CAAC,WAAA,CAAY,oBAAA;AAEb,IAAA;AAEF,EAAA,MAAM,cAAc,WAAA,CAAY,MAAA;AAChC,EAAA,MAAM,kBAAkB,WAAA,CAAY,eAAA;AACpC,EAAA,MAAM,eAAe,WAAA,CAAY,oBAAA;AACjC,EAAA,MAAM,eAAe,WAAA,CAAY,oBAAA;AACjC,EAAA,MAAM,cAAc,WAAA,CAAY,gBAAA;AAChC,EAAA,MAAM,iBAAiB,WAAA,CAAY,wBAAA;AACnC,EAAA,MAAM,aAAa,WAAA,CAAY,eAAA;AAC/B,EAAA,MAAM,gBAAgB,WAAA,CAAY,iBAAA;AAClC,EAAA,MAAM,kBAAkB,aAAA,GAAgB,aAAA;AACxC,EAAA,MAAM,UAAU,WAAA,CAAY,OAAA;AAC5B,EAAA,MAAM,YAAY,OAAA,GAAU,GAAA;AAC5B,EAAA,MAAM,eAAe,WAAA,CAAY,SAAA;AACjC,EAAA,MAAM,eAAe,WAAA,CAAY,qBAAA;AACjC,EAAA,MAAM,qBAAqB,WAAA,CAAY,eAAA;AACvC,EAAA,MAAM,WAAW,WAAA,CAAY,QAAA;AAE7B,EAAA,MAAM,iBAAiB,KAAA,CAAM,WAAA;AAC7B,EAAA,MAAM,WAAA,GAAc,GAAG,QAAA,CAAS,KAAA;AAIhC,EAAA,MAAM,aAAa,WAAA,CAAY,oBAAA;AAE/B,EAAA,MAAM,cAAc,iBAAA,CAAkB,KAAA;AACtC,EAAA,MAAM,gBAAgB,cAAA,CAAe,KAAA;AACrC,EAAA,MAAM,gBAAgB,cAAA,CAAe,KAAA;AACrC,EAAA,MAAM,eAAe,mBAAA,CAAoB,KAAA;AACzC,EAAA,MAAM,aAAa,iBAAA,CAAkB,KAAA;AACrC,EAAA,MAAM,oBAAoB,wBAAA,CAAyB,KAAA;AACnD,EAAA,MAAM,sBAAsB,WAAA,GAAc,CAAA;AAC1C,EAAA,MAAM,MAAM,WAAA,CAAY,cAAA;AACxB,EAAA,MAAM,mBAAA,GAAsB,GAAA,GAAM,CAAA,GAAI,GAAA,GAAM,YAAY,aAAA,CAAc,MAAA;AACtE,EAAA,IAAI,UAAA,GAAa,KAAA;AAGjB,EAAA,MAAM,YAAY,QAAA,KAAa,MAAA;AAC/B,EAAA,IAAI,YAAA,GAAe,EAAA;AACnB,EAAA,IAAI,SAAA,EAAW;AAEb,IAAA,IAAI,CAAC,cAAA,IAAkB,kBAAA,GAAqB,mBAAA,EAAqB;AAC/D,MAAA,cAAA,GAAiB,IAAI,YAAY,mBAAmB,CAAA;AACpD,MAAA,kBAAA,GAAqB,mBAAA;AAAA,IACvB;AACA,IAAA,YAAA,GAAe,CAAA;AACf,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,mBAAA,EAAqB,CAAA,EAAA,EAAK;AAC5C,MAAA,IAAI,cAAA,CAAe,CAAA,GAAI,aAAA,GAAgB,WAAW,CAAA;AAChD,QAAA,cAAA,CAAe,cAAc,CAAA,GAAI,CAAA;AAAA,IACrC;AAEA,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,YAAA,EAAc,CAAA,EAAA,EAAK;AACrC,MAAA,MAAM,GAAA,GAAM,eAAe,CAAC,CAAA;AAC5B,MAAA,MAAM,OAAA,GAAU,WAAA,CAAY,aAAA,CAAc,GAAG,CAAA;AAC7C,MAAA,IAAI,IAAI,CAAA,GAAI,CAAA;AACZ,MAAA,OAAO,CAAA,IAAK,KAAK,WAAA,CAAY,aAAA,CAAc,eAAe,CAAC,CAAC,IAAI,OAAA,EAAS;AACvE,QAAA,cAAA,CAAe,CAAA,GAAI,CAAC,CAAA,GAAI,cAAA,CAAe,CAAC,CAAA;AACxC,QAAA,CAAA,EAAA;AAAA,MACF;AACA,MAAA,cAAA,CAAe,CAAA,GAAI,CAAC,CAAA,GAAI,GAAA;AAAA,IAC1B;AACA,IAAA,IAAI,YAAA,GAAe,CAAA,EAAG,YAAA,GAAe,cAAA,CAAe,CAAC,CAAA;AAAA,EACvD;AAEA,EAAA,KAAA,IAAS,KAAA,GAAQ,CAAA,EAAG,KAAA,GAAQ,mBAAA,EAAqB,KAAA,EAAA,EAAS;AACxD,IAAA,MAAM,WAAW,KAAA,GAAQ,mBAAA;AAEzB,IAAA,IAAI,cAAA,CAAe,KAAA,GAAQ,aAAA,GAAgB,WAAW,CAAA,EAAG;AAGvD,MAAA,IAAI,SAAA,IAAa,YAAA,IAAgB,CAAA,IAAK,KAAA,KAAU,YAAA,EAAc;AAE5D,QAAA,MAAMC,UAAS,KAAA,GAAQ,CAAA;AACvB,QAAA,MAAMC,GAAAA,GAAK,YAAYD,OAAM,CAAA;AAC7B,QAAA,MAAME,GAAAA,GAAK,WAAA,CAAYF,OAAAA,GAAS,CAAC,CAAA;AACjC,QAAA,MAAMG,GAAAA,GAAK,WAAA,CAAYH,OAAAA,GAAS,CAAC,CAAA;AACjC,QAAA,MAAM,QAAA,GAAA,CAAY,KAAA,GAAQ,WAAA,GAAc,YAAA,CAAa,KAAK,CAAA,IAAK,CAAA;AAC/D,QAAA,eAAA,CAAgB,QAAQ,CAAA,GAAIC,GAAAA;AAC5B,QAAA,eAAA,CAAgB,QAAA,GAAW,CAAC,CAAA,GAAIC,GAAAA;AAChC,QAAA,eAAA,CAAgB,QAAA,GAAW,CAAC,CAAA,GAAIC,GAAAA;AAChC,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,WAAA,CAAY,KAAA,GAAQ,WAAA,GAAc,YAAA,CAAa,KAAK,CAAC,CAAA,GAAI,GAAA;AAAA,QAC3D;AACA,QAAA,YAAA,CAAa,KAAK,CAAA,GAAA,CAAK,YAAA,CAAa,KAAK,IAAI,CAAA,IAAK,WAAA;AAClD,QAAA,IAAI,YAAA,CAAa,KAAK,CAAA,GAAI,WAAA,eAA0B,KAAK,CAAA,EAAA;AACzD,QAAA;AAAA,MACF;AACA,MAAA,UAAA,GAAa,IAAA;AACb,MAAA,MAAM,SAAS,KAAA,GAAQ,CAAA;AACvB,MAAA,MAAM,EAAA,GAAK,YAAY,MAAM,CAAA;AAC7B,MAAA,MAAM,EAAA,GAAK,WAAA,CAAY,MAAA,GAAS,CAAC,CAAA;AACjC,MAAA,MAAM,EAAA,GAAK,WAAA,CAAY,MAAA,GAAS,CAAC,CAAA;AAGjC,MAAA,IAAI,YAAA,GAAe,IAAA;AACnB,MAAA,IAAI,gBAAgB,CAAA,IAAK,cAAA,IAAkB,YAAA,CAAa,KAAK,IAAI,CAAA,EAAG;AAClE,QAAA,MAAM,QAAQ,KAAA,GAAQ,CAAA;AACtB,QAAA,MAAM,EAAA,GAAK,EAAA,GAAK,cAAA,CAAe,KAAK,CAAA;AACpC,QAAA,MAAM,EAAA,GAAK,EAAA,GAAK,cAAA,CAAe,KAAA,GAAQ,CAAC,CAAA;AACxC,QAAA,MAAM,EAAA,GAAK,EAAA,GAAK,cAAA,CAAe,KAAA,GAAQ,CAAC,CAAA;AACxC,QAAA,IAAI,KAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,KAAK,eAAA,EAAiB;AACjD,UAAA,YAAA,GAAe,KAAA;AAAA,QACjB;AAAA,MACF;AAEA,MAAA,IAAI,YAAA,EAAc;AAEhB,QAAA,MAAM,QAAA,GAAA,CAAY,KAAA,GAAQ,WAAA,GAAc,YAAA,CAAa,KAAK,CAAA,IAAK,CAAA;AAC/D,QAAA,eAAA,CAAgB,QAAQ,CAAA,GAAI,EAAA;AAC5B,QAAA,eAAA,CAAgB,QAAA,GAAW,CAAC,CAAA,GAAI,EAAA;AAChC,QAAA,eAAA,CAAgB,QAAA,GAAW,CAAC,CAAA,GAAI,EAAA;AAGhC,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,WAAA,CAAY,KAAA,GAAQ,WAAA,GAAc,YAAA,CAAa,KAAK,CAAC,CAAA,GAAI,GAAA;AAAA,QAC3D;AAEA,QAAA,YAAA,CAAa,KAAK,CAAA,GAAA,CAAK,YAAA,CAAa,KAAK,IAAI,CAAA,IAAK,WAAA;AAClD,QAAA,IAAI,YAAA,CAAa,KAAK,CAAA,GAAI,WAAA,eAA0B,KAAK,CAAA,EAAA;AAGzD,QAAA,IAAI,cAAA,EAAgB;AAClB,UAAA,MAAM,QAAQ,KAAA,GAAQ,CAAA;AACtB,UAAA,cAAA,CAAe,KAAK,CAAA,GAAI,EAAA;AACxB,UAAA,cAAA,CAAe,KAAA,GAAQ,CAAC,CAAA,GAAI,EAAA;AAC5B,UAAA,cAAA,CAAe,KAAA,GAAQ,CAAC,CAAA,GAAI,EAAA;AAAA,QAC9B;AAAA,MACF;AAGA,MAAA,IAAI,QAAA,GAAW,aAAa,KAAK,CAAA;AACjC,MAAA,IAAI,cAAA,GAAiB,QAAA;AACrB,MAAA,IAAI,OAAA,GAAU,CAAA,IAAK,WAAA,IAAe,QAAA,GAAW,CAAA,EAAG;AAC9C,QAAA,MAAM,aAAa,KAAA,GAAQ,WAAA;AAC3B,QAAA,cAAA,GAAiB,CAAA;AACjB,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,QAAA,EAAU,CAAA,EAAA,EAAK;AACjC,UAAA,MAAM,cACH,YAAA,CAAa,KAAK,IAAI,CAAA,GAAI,CAAA,GAAI,cAAc,CAAA,IAAK,WAAA;AACpD,UAAA,MAAM,GAAA,GAAM,GAAA,GAAM,WAAA,CAAY,UAAA,GAAa,UAAU,CAAA;AACrD,UAAA,IAAI,OAAO,SAAA,EAAW;AACpB,YAAA,cAAA,EAAA;AAAA,UACF,CAAA,MAAO;AACL,YAAA;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,GAAQ,cAAA;AACd,MAAA,MAAM,cAAc,WAAA,CAAY,KAAA;AAGhC,MAAA,MAAM,YAAY,KAAA,GAAQ,aAAA;AAC1B,MAAA,MAAM,EAAA,GAAK,cAAA,CAAe,SAAA,GAAY,SAAS,CAAA;AAC/C,MAAA,MAAM,EAAA,GAAK,cAAA,CAAe,SAAA,GAAY,SAAS,CAAA;AAC/C,MAAA,MAAM,EAAA,GAAK,cAAA,CAAe,SAAA,GAAY,SAAS,CAAA;AAC/C,MAAA,MAAM,EAAA,GAAK,cAAA,CAAe,SAAA,GAAY,SAAS,CAAA;AAE/C,MAAA,MAAM,OAAA,GAAU,QAAQ,WAAA,GAAc,CAAA;AAMtC,MAAA,MAAM,aAAa,KAAA,GAAQ,CAAA;AAE3B,MAAA,IAAI,CAAC,UAAA,IAAc,cAAA,GAAiB,UAAA,EAAY;AAC9C,QAAA,UAAA,GAAa,IAAI,aAAa,UAAU,CAAA;AACxC,QAAA,cAAA,GAAiB,UAAA;AAAA,MACnB;AACA,MAAA,MAAM,MAAA,GAAS,UAAA;AACf,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,QAAA,MAAM,QAAA,GAAA,CACF,aAAa,KAAK,CAAA,GAAI,IAAI,CAAA,GAAI,WAAA,GAAc,CAAA,IAAK,WAAA,GAAe,CAAA,GAClE,OAAA;AACF,QAAA,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA,GAAI,eAAA,CAAgB,QAAQ,CAAA;AACxC,QAAA,MAAA,CAAO,IAAI,CAAA,GAAI,CAAC,CAAA,GAAI,eAAA,CAAgB,WAAW,CAAC,CAAA;AAChD,QAAA,MAAA,CAAO,IAAI,CAAA,GAAI,CAAC,CAAA,GAAI,eAAA,CAAgB,WAAW,CAAC,CAAA;AAAA,MAClD;AAGA,MAAA,IAAI,QAAA;AACJ,MAAA,IAAI,UAAA;AAEJ,MAAA,IAAI,YAAA,IAAgB,SAAS,CAAA,EAAG;AAE9B,QAAA,MAAM,eAAe,KAAA,GAAQ,CAAA;AAC7B,QAAA,UAAA,GAAa,eAAe,YAAA,GAAe,CAAA;AAC3C,QAAA,MAAM,aAAa,UAAA,GAAa,CAAA;AAGhC,QAAA,IAAI,CAAC,eAAA,IAAmB,mBAAA,GAAsB,UAAA,EAAY;AACxD,UAAA,eAAA,GAAkB,IAAI,aAAa,UAAU,CAAA;AAC7C,UAAA,mBAAA,GAAsB,UAAA;AAAA,QACxB;AACA,QAAA,QAAA,GAAW,eAAA;AAEX,QAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,YAAA,EAAc,GAAA,EAAA,EAAO;AAE3C,UAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAM,CAAC,CAAA;AAC9B,UAAA,MAAM,EAAA,GAAK,GAAA;AACX,UAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,KAAA,GAAQ,CAAA,EAAG,MAAM,CAAC,CAAA;AACtC,UAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,KAAA,GAAQ,CAAA,EAAG,MAAM,CAAC,CAAA;AAEtC,UAAA,MAAM,GAAA,GAAM,MAAA,CAAO,EAAA,GAAK,CAAC,GACvB,GAAA,GAAM,MAAA,CAAO,EAAA,GAAK,CAAA,GAAI,CAAC,CAAA,EACvB,GAAA,GAAM,MAAA,CAAO,EAAA,GAAK,IAAI,CAAC,CAAA;AACzB,UAAA,MAAM,GAAA,GAAM,MAAA,CAAO,EAAA,GAAK,CAAC,GACvB,GAAA,GAAM,MAAA,CAAO,EAAA,GAAK,CAAA,GAAI,CAAC,CAAA,EACvB,GAAA,GAAM,MAAA,CAAO,EAAA,GAAK,IAAI,CAAC,CAAA;AACzB,UAAA,MAAM,GAAA,GAAM,MAAA,CAAO,EAAA,GAAK,CAAC,GACvB,GAAA,GAAM,MAAA,CAAO,EAAA,GAAK,CAAA,GAAI,CAAC,CAAA,EACvB,GAAA,GAAM,MAAA,CAAO,EAAA,GAAK,IAAI,CAAC,CAAA;AACzB,UAAA,MAAM,GAAA,GAAM,MAAA,CAAO,EAAA,GAAK,CAAC,GACvB,GAAA,GAAM,MAAA,CAAO,EAAA,GAAK,CAAA,GAAI,CAAC,CAAA,EACvB,GAAA,GAAM,MAAA,CAAO,EAAA,GAAK,IAAI,CAAC,CAAA;AAEzB,UAAA,KAAA,IAAS,GAAA,GAAM,CAAA,EAAG,GAAA,GAAM,YAAA,EAAc,GAAA,EAAA,EAAO;AAC3C,YAAA,MAAM,IAAI,GAAA,GAAM,YAAA;AAChB,YAAA,MAAM,MAAA,GAAA,CAAU,GAAA,GAAM,YAAA,GAAe,GAAA,IAAO,CAAA;AAC5C,YAAA,UAAA;AAAA,cACE,QAAA;AAAA,cACA,MAAA;AAAA,cACA,GAAA;AAAA,cACA,GAAA;AAAA,cACA,GAAA;AAAA,cACA,GAAA;AAAA,cACA,GAAA;AAAA,cACA,GAAA;AAAA,cACA,GAAA;AAAA,cACA,GAAA;AAAA,cACA,GAAA;AAAA,cACA,GAAA;AAAA,cACA,GAAA;AAAA,cACA,GAAA;AAAA,cACA;AAAA,aACF;AAAA,UACF;AAAA,QACF;AAEA,QAAA,MAAM,UAAA,GAAA,CAAc,aAAa,CAAA,IAAK,CAAA;AACtC,QAAA,QAAA,CAAS,UAAU,CAAA,GAAI,MAAA,CAAA,CAAQ,KAAA,GAAQ,KAAK,CAAC,CAAA;AAC7C,QAAA,QAAA,CAAS,aAAa,CAAC,CAAA,GAAI,QAAQ,KAAA,GAAQ,CAAA,IAAK,IAAI,CAAC,CAAA;AACrD,QAAA,QAAA,CAAS,aAAa,CAAC,CAAA,GAAI,QAAQ,KAAA,GAAQ,CAAA,IAAK,IAAI,CAAC,CAAA;AAAA,MACvD,CAAA,MAAO;AACL,QAAA,QAAA,GAAW,MAAA;AACX,QAAA,UAAA,GAAa,KAAA;AAAA,MACf;AAGA,MAAA,IAAI,UAAA,GAAa,aAAa,UAAA,GAAa,WAAA;AAK3C,MAAA,IAAI,YAAA,IAAgB,cAAc,CAAA,EAAG;AACnC,QAAA,MAAM,kBAAkB,IAAA,GAAS,IAAA;AACjC,QAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,EAAY,CAAA,EAAA,EAAK;AACnC,UAAA,MAAM,EAAA,GAAA,CAAM,IAAI,CAAA,IAAK,CAAA;AACrB,UAAA,MAAM,KAAK,CAAA,GAAI,CAAA;AACf,UAAA,MAAM,EAAA,GAAK,QAAA,CAAS,EAAE,CAAA,GAAI,SAAS,EAAE,CAAA;AACrC,UAAA,MAAM,KAAK,QAAA,CAAS,EAAA,GAAK,CAAC,CAAA,GAAI,QAAA,CAAS,KAAK,CAAC,CAAA;AAC7C,UAAA,MAAM,KAAK,QAAA,CAAS,EAAA,GAAK,CAAC,CAAA,GAAI,QAAA,CAAS,KAAK,CAAC,CAAA;AAC7C,UAAA,IAAI,KAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,KAAK,eAAA,EAAiB;AAGjD,YAAA,QAAA,CAAS,EAAE,CAAA,GAAI,QAAA,CAAS,EAAE,CAAA;AAC1B,YAAA,QAAA,CAAS,EAAA,GAAK,CAAC,CAAA,GAAI,QAAA,CAAS,KAAK,CAAC,CAAA;AAClC,YAAA,QAAA,CAAS,EAAA,GAAK,CAAC,CAAA,GAAI,QAAA,CAAS,KAAK,CAAC,CAAA;AAAA,UACpC;AAAA,QACF;AAAA,MACF;AAGA,MAAA,MAAM,eAAA,GAAkB,UAAA,GAAa,UAAA,CAAW,KAAK,CAAA,GAAI,WAAA;AACzD,MAAA,IAAI,UAAA,EAAY,UAAA,CAAW,KAAK,CAAA,GAAI,UAAA;AACpC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,EAAa,CAAA,EAAA,EAAK;AACpC,QAAA,MAAM,IAAA,GAAA,CAAQ,QAAA,GAAW,CAAA,GAAI,CAAA,IAAK,CAAA;AAClC,QAAA,MAAM,IAAA,GAAA,CAAQ,QAAA,GAAW,CAAA,GAAI,CAAA,IAAK,CAAA;AAClC,QAAA,MAAM,IAAA,GAAO,WAAW,CAAA,GAAI,CAAA;AAC5B,QAAA,MAAM,SAAA,GAAA,CAAa,QAAA,GAAW,CAAA,GAAI,CAAA,IAAK,CAAA;AAEvC,QAAA,IAAI,KAAK,UAAA,EAAY;AAEnB,UAAA,IAAI,KAAK,eAAA,EAAiB;AAC1B,UAAA,gBAAA;AAAA,YACE,IAAA;AAAA,YACA,IAAA;AAAA,YACA,IAAA;AAAA,YACA,SAAA;AAAA,YACA,WAAA;AAAA,YACA,YAAA;AAAA,YACA,iBAAA;AAAA,YACA,UAAA;AAAA,YACA,aAAA;AAAA,YACA,aAAA;AAAA,YACA,EAAA;AAAA,YACA,EAAA;AAAA,YACA;AAAA,WACF;AACA,UAAA;AAAA,QACF;AAEA,QAAA,MAAM,EAAA,GAAK,QAAA,CAAS,CAAA,GAAI,CAAC,CAAA;AACzB,QAAA,MAAM,EAAA,GAAK,QAAA,CAAS,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA;AAC7B,QAAA,MAAM,EAAA,GAAK,QAAA,CAAS,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA;AAM7B,QAAA,IAAI,IAAY,EAAA,EAAY,EAAA;AAC5B,QAAA,IAAI,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,UAAA,GAAa,CAAA,EAAG;AAE/B,UAAA,MAAM,GAAA,GAAM,QAAA,CAAA,CAAU,CAAA,GAAI,CAAA,IAAK,CAAC,CAAA;AAChC,UAAA,MAAM,GAAA,GAAM,QAAA,CAAA,CAAU,CAAA,GAAI,CAAA,IAAK,IAAI,CAAC,CAAA;AACpC,UAAA,MAAM,GAAA,GAAM,QAAA,CAAA,CAAU,CAAA,GAAI,CAAA,IAAK,IAAI,CAAC,CAAA;AACpC,UAAA,MAAM,GAAA,GAAM,QAAA,CAAA,CAAU,CAAA,GAAI,CAAA,IAAK,CAAC,CAAA;AAChC,UAAA,MAAM,GAAA,GAAM,QAAA,CAAA,CAAU,CAAA,GAAI,CAAA,IAAK,IAAI,CAAC,CAAA;AACpC,UAAA,MAAM,GAAA,GAAM,QAAA,CAAA,CAAU,CAAA,GAAI,CAAA,IAAK,IAAI,CAAC,CAAA;AAEpC,UAAA,MAAM,MAAM,GAAA,GAAM,GAAA;AAClB,UAAA,MAAM,MAAM,GAAA,GAAM,GAAA;AAClB,UAAA,MAAM,MAAM,GAAA,GAAM,GAAA;AAClB,UAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,CAAK,GAAA,GAAM,MAAM,GAAA,GAAM,GAAA,GAAM,MAAM,GAAG,CAAA;AACzD,UAAA,IAAI,QAAQ,IAAA,EAAQ;AAElB,YAAA,EAAA,GAAK,KAAK,GAAA,GAAM,KAAA;AAChB,YAAA,EAAA,GAAK,KAAK,GAAA,GAAM,KAAA;AAChB,YAAA,EAAA,GAAK,KAAK,GAAA,GAAM,KAAA;AAAA,UAClB,CAAA,MAAO;AACL,YAAA,EAAA,GAAK,QAAA,CAAA,CAAU,CAAA,GAAI,CAAA,IAAK,CAAC,CAAA;AACzB,YAAA,EAAA,GAAK,QAAA,CAAA,CAAU,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAC,CAAA;AAC7B,YAAA,EAAA,GAAK,QAAA,CAAA,CAAU,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAC,CAAA;AAAA,UAC/B;AAAA,QACF,CAAA,MAAA,IAAW,CAAA,GAAI,UAAA,GAAa,CAAA,EAAG;AAE7B,UAAA,EAAA,GAAK,QAAA,CAAA,CAAU,CAAA,GAAI,CAAA,IAAK,CAAC,CAAA;AACzB,UAAA,EAAA,GAAK,QAAA,CAAA,CAAU,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAC,CAAA;AAC7B,UAAA,EAAA,GAAK,QAAA,CAAA,CAAU,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAC,CAAA;AAAA,QAC/B,CAAA,MAAA,IAAW,cAAc,CAAA,EAAG;AAI1B,UAAA,MAAM,KAAA,GAAQ,QAAA,CAAA,CAAU,CAAA,GAAI,CAAA,IAAK,CAAC,CAAA;AAClC,UAAA,MAAM,KAAA,GAAQ,QAAA,CAAA,CAAU,CAAA,GAAI,CAAA,IAAK,IAAI,CAAC,CAAA;AACtC,UAAA,MAAM,KAAA,GAAQ,QAAA,CAAA,CAAU,CAAA,GAAI,CAAA,IAAK,IAAI,CAAC,CAAA;AACtC,UAAA,EAAA,GAAK,MAAM,EAAA,GAAK,KAAA,CAAA;AAChB,UAAA,EAAA,GAAK,MAAM,EAAA,GAAK,KAAA,CAAA;AAChB,UAAA,EAAA,GAAK,MAAM,EAAA,GAAK,KAAA,CAAA;AAAA,QAClB,CAAA,MAAO;AAEL,UAAA,EAAA,GAAK,EAAA;AACL,UAAA,EAAA,GAAK,EAAA,GAAK,IAAA;AACV,UAAA,EAAA,GAAK,EAAA;AAAA,QACP;AAGA,QAAA,MAAM,CAAA,GAAI,UAAA,GAAa,CAAA,GAAI,CAAA,IAAK,aAAa,CAAA,CAAA,GAAK,CAAA;AAGlD,QAAA,IAAI,QAAA,GAAW,CAAA;AACf,QAAA,IAAI,OAAA,GAAU,CAAA,IAAK,WAAA,IAAe,cAAA,GAAiB,CAAA,EAAG;AAIpD,UAAA,MAAM,aAAa,KAAA,GAAQ,WAAA;AAC3B,UAAA,IAAI,YAAA,IAAgB,YAAY,CAAA,EAAG;AACjC,YAAA,MAAM,IAAA,GAAQ,IAAI,IAAA,CAAK,GAAA,CAAI,aAAa,CAAA,EAAG,CAAC,KAAM,QAAA,GAAW,CAAA,CAAA;AAC7D,YAAA,MAAM,KAAA,GAAQ,KAAK,GAAA,CAAI,IAAA,CAAK,MAAM,IAAI,CAAA,EAAG,WAAW,CAAC,CAAA;AACrD,YAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,GAAQ,CAAA,EAAG,WAAW,CAAC,CAAA;AAC9C,YAAA,MAAM,OAAO,IAAA,GAAO,KAAA;AACpB,YAAA,MAAM,UACH,YAAA,CAAa,KAAK,IAAI,CAAA,GAAI,KAAA,GAAQ,cAAc,CAAA,IAAK,WAAA;AACxD,YAAA,MAAM,UACH,YAAA,CAAa,KAAK,IAAI,CAAA,GAAI,KAAA,GAAQ,cAAc,CAAA,IAAK,WAAA;AACxD,YAAA,MAAM,KAAA,GAAQ,GAAA,GAAM,WAAA,CAAY,UAAA,GAAa,MAAM,CAAA;AACnD,YAAA,MAAM,KAAA,GAAQ,GAAA,GAAM,WAAA,CAAY,UAAA,GAAa,MAAM,CAAA;AACnD,YAAA,MAAM,GAAA,GAAM,KAAA,GAAA,CAAS,KAAA,GAAQ,KAAA,IAAS,IAAA;AACtC,YAAA,QAAA,GAAW,CAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,WAAW,CAAG,CAAA;AAAA,UAChD,CAAA,MAAO;AACL,YAAA,MAAM,IAAA,GAAO,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,WAAW,CAAC,CAAA;AACrC,YAAA,MAAM,cACH,YAAA,CAAa,KAAK,IAAI,CAAA,GAAI,IAAA,GAAO,cAAc,CAAA,IAAK,WAAA;AACvD,YAAA,MAAM,GAAA,GAAM,GAAA,GAAM,WAAA,CAAY,UAAA,GAAa,UAAU,CAAA;AACrD,YAAA,QAAA,GAAW,CAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,WAAW,CAAG,CAAA;AAAA,UAChD;AAAA,QACF;AAEA,QAAA,MAAM,UAAA,GAAa,kBAAkB,CAAC,CAAA;AACtC,QAAA,MAAM,YAAA,GAAe,oBAAoB,CAAC,CAAA;AAC1C,QAAA,MAAM,SAAA,GAAY,cAAc,UAAA,GAAa,GAAA;AAC7C,QAAA,MAAM,KAAA,GAAQ,KAAK,YAAA,GAAe,QAAA;AAElC,QAAA,MAAM,KAAK,sBAAA,GACP,EAAA,GAAK,sBAAA,CAAuB,CAAA,CAAE,CAAC,CAAA,GAC/B,EAAA;AACJ,QAAA,MAAM,KAAK,sBAAA,GACP,EAAA,GAAK,sBAAA,CAAuB,CAAA,CAAE,CAAC,CAAA,GAC/B,EAAA;AACJ,QAAA,MAAM,KAAK,sBAAA,GACP,EAAA,GAAK,sBAAA,CAAuB,CAAA,CAAE,CAAC,CAAA,GAC/B,EAAA;AAEJ,QAAA,gBAAA;AAAA,UACE,IAAA;AAAA,UACA,IAAA;AAAA,UACA,IAAA;AAAA,UACA,SAAA;AAAA,UACA,EAAA;AAAA,UACA,EAAA;AAAA,UACA,EAAA;AAAA,UACA,EAAA;AAAA,UACA,EAAA;AAAA,UACA,EAAA;AAAA,UACA,SAAA;AAAA,UACA,CAAA;AAAA,UACA,KAAA;AAAA,UACA,EAAA;AAAA,UACA,EAAA;AAAA,UACA,EAAA;AAAA,UACA,EAAA;AAAA,UACA,WAAA;AAAA,UACA,YAAA;AAAA,UACA,iBAAA;AAAA,UACA,UAAA;AAAA,UACA,aAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAMA,MAAA,IAAI,kBAAA,IAAsB,UAAA,IAAc,UAAA,IAAc,CAAA,EAAG;AACvD,QAAA,MAAM,OAAO,KAAA,GAAQ,CAAA;AAErB,QAAA,MAAM,EAAA,GAAK,QAAA,CAAS,CAAC,CAAA,GAAI,SAAS,CAAC,CAAA;AACnC,QAAA,MAAM,EAAA,GAAK,QAAA,CAAS,CAAC,CAAA,GAAI,SAAS,CAAC,CAAA;AACnC,QAAA,MAAM,EAAA,GAAK,QAAA,CAAS,CAAC,CAAA,GAAI,SAAS,CAAC,CAAA;AACnC,QAAA,MAAM,IAAA,GAAO,KAAK,IAAA,CAAK,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AAClD,QAAA,IAAI,OAAO,IAAA,EAAQ;AACjB,UAAA,MAAM,MAAM,EAAA,GAAK,IAAA;AACjB,UAAA,MAAM,MAAM,EAAA,GAAK,IAAA;AACjB,UAAA,MAAM,MAAM,EAAA,GAAK,IAAA;AAEjB,UAAA,IAAI,GAAA,GAAM,CAAA,EACR,GAAA,GAAM,CAAA,EACN,GAAA,GAAM,CAAA;AACR,UAAA,MAAM,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,MAAM,GAAA,GAAM,GAAA;AAC1C,UAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,GAAI,KAAA,EAAO;AACzB,YAAA,GAAA,GAAM,CAAA;AACN,YAAA,GAAA,GAAM,CAAA;AACN,YAAA,GAAA,GAAM,CAAA;AAAA,UACR;AAEA,UAAA,IAAI,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,GAAA;AAC5B,UAAA,IAAI,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,GAAA;AAC5B,UAAA,IAAI,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,GAAA;AAC5B,UAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,CAAK,GAAA,GAAM,MAAM,GAAA,GAAM,GAAA,GAAM,MAAM,GAAG,CAAA;AACzD,UAAA,IAAI,QAAQ,IAAA,EAAQ;AAClB,YAAA,GAAA,IAAO,KAAA;AACP,YAAA,GAAA,IAAO,KAAA;AACP,YAAA,GAAA,IAAO,KAAA;AAAA,UACT;AAGA,UAAA,MAAM,MAAA,GAAS,WAAW,IAAI,CAAA;AAC9B,UAAA,MAAM,MAAA,GAAS,UAAA,CAAW,IAAA,GAAO,CAAC,CAAA;AAClC,UAAA,MAAM,MAAA,GAAS,UAAA,CAAW,IAAA,GAAO,CAAC,CAAA;AAClC,UAAA,MAAM,OAAA,GAAU,MAAA,KAAW,CAAA,IAAK,MAAA,KAAW,KAAK,MAAA,KAAW,CAAA;AAC3D,UAAA,IAAI,OAAA,EAAS;AACX,YAAA,MAAM,SAAA,GAAY,GAAA,GAAM,MAAA,GAAS,GAAA,GAAM,SAAS,GAAA,GAAM,MAAA;AACtD,YAAA,IAAI,YAAY,CAAA,EAAG;AAEjB,cAAA,KAAA,IAAS,CAAA,GAAI,GAAG,CAAA,GAAI,IAAA,CAAK,IAAI,UAAA,EAAY,WAAW,GAAG,CAAA,EAAA,EAAK;AAC1D,gBAAA,MAAM,IAAA,GAAO,WAAW,CAAA,GAAI,CAAA;AAC5B,gBAAA,MAAM,EAAA,GAAK,kBAAkB,IAAI,CAAA;AACjC,gBAAA,iBAAA,CAAkB,IAAI,IAAI,CAAC,EAAA;AAC3B,gBAAA,iBAAA,CAAkB,IAAA,GAAO,CAAC,CAAA,GAAI,CAAC,EAAA;AAAA,cACjC;AAEA,cAAA,GAAA,GAAM,CAAC,GAAA;AACP,cAAA,GAAA,GAAM,CAAC,GAAA;AACP,cAAA,GAAA,GAAM,CAAC,GAAA;AAAA,YACT;AAAA,UACF;AAGA,UAAA,UAAA,CAAW,IAAI,CAAA,GAAI,GAAA;AACnB,UAAA,UAAA,CAAW,IAAA,GAAO,CAAC,CAAA,GAAI,GAAA;AACvB,UAAA,UAAA,CAAW,IAAA,GAAO,CAAC,CAAA,GAAI,GAAA;AAAA,QACzB;AAAA,MACF;AAAA,IACF,CAAA,MAAA,IACE,aAAa,KAAK,CAAA,GAAI,KACrB,UAAA,IAAc,UAAA,CAAW,KAAK,CAAA,GAAI,CAAA,EACnC;AAEA,MAAA,UAAA,GAAa,IAAA;AACb,MAAA,YAAA,CAAa,KAAK,CAAA,GAAI,CAAA;AACtB,MAAA,YAAA,CAAa,KAAK,CAAA,GAAI,CAAA;AACtB,MAAA,MAAM,UAAA,GAAa,UAAA,GAAa,UAAA,CAAW,KAAK,CAAA,GAAI,WAAA;AACpD,MAAA,IAAI,UAAA,EAAY,UAAA,CAAW,KAAK,CAAA,GAAI,CAAA;AACpC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,UAAA,EAAY,CAAA,EAAA,EAAK;AACnC,QAAA,MAAM,IAAA,GAAA,CAAQ,QAAA,GAAW,CAAA,GAAI,CAAA,IAAK,CAAA;AAClC,QAAA,MAAM,IAAA,GAAA,CAAQ,QAAA,GAAW,CAAA,GAAI,CAAA,IAAK,CAAA;AAClC,QAAA,MAAM,IAAA,GAAO,WAAW,CAAA,GAAI,CAAA;AAC5B,QAAA,MAAM,SAAA,GAAA,CAAa,QAAA,GAAW,CAAA,GAAI,CAAA,IAAK,CAAA;AACvC,QAAA,gBAAA;AAAA,UACE,IAAA;AAAA,UACA,IAAA;AAAA,UACA,IAAA;AAAA,UACA,SAAA;AAAA,UACA,WAAA;AAAA,UACA,YAAA;AAAA,UACA,iBAAA;AAAA,UACA,UAAA;AAAA,UACA,aAAA;AAAA,UACA,aAAA;AAAA,UACA,CAAA;AAAA,UACA,CAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,SAAA,IAAa,YAAA,IAAgB,CAAA,IAAK,cAAA,EAAgB;AACpD,IAAA,UAAA,GAAa,IAAA;AACb,IAAA,MAAM,MAAA,GAAS,eAAe,CAAC,CAAA;AAC/B,IAAA,MAAM,iBAAiB,MAAA,GAAS,mBAAA;AAKhC,IAAA,MAAM,YAAA,GAAe,YAAA;AACrB,IAAA,MAAM,cAAc,IAAA,CAAK,GAAA;AAAA,MACvB,WAAA;AAAA,MACA,IAAA,CAAK,GAAA,CAAI,YAAA,GAAe,CAAA,EAAG,YAAY;AAAA,KACzC;AACA,IAAA,MAAM,YAAY,WAAA,GAAc,CAAA;AAChC,IAAA,IAAI,CAAC,UAAA,IAAc,cAAA,GAAiB,SAAA,EAAW;AAC7C,MAAA,UAAA,GAAa,IAAI,aAAa,SAAS,CAAA;AACvC,MAAA,cAAA,GAAiB,SAAA;AAAA,IACnB;AAEA,IAAA,IAAI,iBAAiB,CAAA,EAAG;AAEtB,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,CAAC,CAAA,GAAI,CAAA;AAClC,MAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,CAAC,CAAA,GAAI,CAAA;AAClC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,EAAa,CAAA,EAAA,EAAK;AACpC,QAAA,MAAM,CAAA,GAAI,KAAK,WAAA,GAAc,CAAA,CAAA;AAC7B,QAAA,UAAA,CAAW,CAAA,GAAI,CAAC,CAAA,GACd,WAAA,CAAY,KAAK,CAAA,GAAI,CAAA,IAAK,WAAA,CAAY,KAAK,CAAA,GAAI,WAAA,CAAY,KAAK,CAAA,CAAA;AAClE,QAAA,UAAA,CAAW,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,GAClB,YAAY,KAAA,GAAQ,CAAC,CAAA,GACrB,CAAA,IAAK,YAAY,KAAA,GAAQ,CAAC,CAAA,GAAI,WAAA,CAAY,QAAQ,CAAC,CAAA,CAAA;AACrD,QAAA,UAAA,CAAW,CAAA,GAAI,CAAA,GAAI,CAAC,CAAA,GAClB,YAAY,KAAA,GAAQ,CAAC,CAAA,GACrB,CAAA,IAAK,YAAY,KAAA,GAAQ,CAAC,CAAA,GAAI,WAAA,CAAY,QAAQ,CAAC,CAAA,CAAA;AAAA,MACvD;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,MAAM,WAAW,YAAA,GAAe,CAAA;AAChC,MAAA,MAAM,SAAA,GAAY,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAA,CAAO,WAAA,GAAc,CAAA,IAAK,QAAQ,CAAC,CAAA;AACtE,MAAA,IAAI,EAAA,GAAK,CAAA;AACT,MAAA,KAAA,IAAS,MAAM,CAAA,EAAG,GAAA,GAAM,QAAA,IAAY,EAAA,GAAK,aAAa,GAAA,EAAA,EAAO;AAC3D,QAAA,MAAM,EAAA,GAAK,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,MAAM,CAAC,CAAA;AAC9B,QAAA,MAAM,EAAA,GAAK,GAAA;AACX,QAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,YAAA,GAAe,CAAA,EAAG,MAAM,CAAC,CAAA;AAC7C,QAAA,MAAM,KAAK,IAAA,CAAK,GAAA,CAAI,YAAA,GAAe,CAAA,EAAG,MAAM,CAAC,CAAA;AAC7C,QAAA,MAAM,GAAA,GAAM,cAAA,CAAe,EAAE,CAAA,GAAI,CAAA;AACjC,QAAA,MAAM,GAAA,GAAM,cAAA,CAAe,EAAE,CAAA,GAAI,CAAA;AACjC,QAAA,MAAM,GAAA,GAAM,cAAA,CAAe,EAAE,CAAA,GAAI,CAAA;AACjC,QAAA,MAAM,GAAA,GAAM,cAAA,CAAe,EAAE,CAAA,GAAI,CAAA;AACjC,QAAA,MAAM,QAAA,GAAW,GAAA,KAAQ,QAAA,GAAW,CAAA,GAAI,cAAc,EAAA,GAAK,SAAA;AAC3D,QAAA,KAAA,IAAS,MAAM,CAAA,EAAG,GAAA,GAAM,QAAA,IAAY,EAAA,GAAK,aAAa,GAAA,EAAA,EAAO;AAC3D,UAAA,MAAM,IAAI,GAAA,GAAM,QAAA;AAChB,UAAA,UAAA;AAAA,YACE,UAAA;AAAA,YACA,EAAA,GAAK,CAAA;AAAA,YACL,YAAY,GAAG,CAAA;AAAA,YACf,WAAA,CAAY,MAAM,CAAC,CAAA;AAAA,YACnB,WAAA,CAAY,MAAM,CAAC,CAAA;AAAA,YACnB,YAAY,GAAG,CAAA;AAAA,YACf,WAAA,CAAY,MAAM,CAAC,CAAA;AAAA,YACnB,WAAA,CAAY,MAAM,CAAC,CAAA;AAAA,YACnB,YAAY,GAAG,CAAA;AAAA,YACf,WAAA,CAAY,MAAM,CAAC,CAAA;AAAA,YACnB,WAAA,CAAY,MAAM,CAAC,CAAA;AAAA,YACnB,YAAY,GAAG,CAAA;AAAA,YACf,WAAA,CAAY,MAAM,CAAC,CAAA;AAAA,YACnB,WAAA,CAAY,MAAM,CAAC,CAAA;AAAA,YACnB;AAAA,WACF;AACA,UAAA,EAAA,EAAA;AAAA,QACF;AAAA,MACF;AAEA,MAAA,IAAI,KAAK,CAAA,EAAG;AACV,QAAA,MAAM,QAAA,GAAW,cAAA,CAAe,YAAA,GAAe,CAAC,CAAA,GAAI,CAAA;AACpD,QAAA,UAAA,CAAA,CAAY,EAAA,GAAK,CAAA,IAAK,CAAC,CAAA,GAAI,YAAY,QAAQ,CAAA;AAC/C,QAAA,UAAA,CAAA,CAAY,KAAK,CAAA,IAAK,CAAA,GAAI,CAAC,CAAA,GAAI,WAAA,CAAY,WAAW,CAAC,CAAA;AACvD,QAAA,UAAA,CAAA,CAAY,KAAK,CAAA,IAAK,CAAA,GAAI,CAAC,CAAA,GAAI,WAAA,CAAY,WAAW,CAAC,CAAA;AAAA,MACzD;AAAA,IACF;AAEA,IAAA,MAAM,aAAa,MAAA,GAAS,aAAA;AAC5B,IAAA,MAAM,QAAA,GAAW,cAAA,CAAe,UAAA,GAAa,SAAS,CAAA;AACtD,IAAA,MAAM,QAAA,GAAW,cAAA,CAAe,UAAA,GAAa,SAAS,CAAA;AACtD,IAAA,MAAM,QAAA,GAAW,cAAA,CAAe,UAAA,GAAa,SAAS,CAAA;AACtD,IAAA,MAAM,QAAA,GAAW,cAAA,CAAe,UAAA,GAAa,SAAS,CAAA;AAEtD,IAAA,MAAM,gBAAA,GAAmB,UAAA,GAAa,UAAA,CAAW,MAAM,CAAA,GAAI,WAAA;AAC3D,IAAA,IAAI,UAAA,EAAY,UAAA,CAAW,MAAM,CAAA,GAAI,WAAA;AACrC,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,EAAa,CAAA,EAAA,EAAK;AACpC,MAAA,MAAM,IAAA,GAAA,CAAQ,cAAA,GAAiB,CAAA,GAAI,CAAA,IAAK,CAAA;AACxC,MAAA,MAAM,IAAA,GAAA,CAAQ,cAAA,GAAiB,CAAA,GAAI,CAAA,IAAK,CAAA;AACxC,MAAA,MAAM,IAAA,GAAO,iBAAiB,CAAA,GAAI,CAAA;AAClC,MAAA,MAAM,SAAA,GAAA,CAAa,cAAA,GAAiB,CAAA,GAAI,CAAA,IAAK,CAAA;AAE7C,MAAA,IAAI,KAAK,WAAA,EAAa;AAEpB,QAAA,IAAI,KAAK,gBAAA,EAAkB;AAC3B,QAAA,gBAAA;AAAA,UACE,IAAA;AAAA,UACA,IAAA;AAAA,UACA,IAAA;AAAA,UACA,SAAA;AAAA,UACA,WAAA;AAAA,UACA,YAAA;AAAA,UACA,iBAAA;AAAA,UACA,UAAA;AAAA,UACA,aAAA;AAAA,UACA,aAAA;AAAA,UACA,CAAA;AAAA,UACA,CAAA;AAAA,UACA;AAAA,SACF;AACA,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,QAAQ,CAAA,GAAI,CAAA;AAClB,MAAA,MAAM,GAAA,GAAM,WAAW,KAAK,CAAA;AAC5B,MAAA,MAAM,GAAA,GAAM,UAAA,CAAW,KAAA,GAAQ,CAAC,CAAA;AAChC,MAAA,MAAM,GAAA,GAAM,UAAA,CAAW,KAAA,GAAQ,CAAC,CAAA;AAGhC,MAAA,IAAI,IAAY,EAAA,EAAY,EAAA;AAC5B,MAAA,IAAI,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,WAAA,GAAc,CAAA,EAAG;AAChC,QAAA,MAAM,GAAA,GAAM,UAAA,CAAA,CAAY,CAAA,GAAI,CAAA,IAAK,CAAC,CAAA;AAClC,QAAA,MAAM,GAAA,GAAM,UAAA,CAAA,CAAY,CAAA,GAAI,CAAA,IAAK,IAAI,CAAC,CAAA;AACtC,QAAA,MAAM,GAAA,GAAM,UAAA,CAAA,CAAY,CAAA,GAAI,CAAA,IAAK,IAAI,CAAC,CAAA;AACtC,QAAA,MAAM,GAAA,GAAM,UAAA,CAAA,CAAY,CAAA,GAAI,CAAA,IAAK,CAAC,CAAA;AAClC,QAAA,MAAM,GAAA,GAAM,UAAA,CAAA,CAAY,CAAA,GAAI,CAAA,IAAK,IAAI,CAAC,CAAA;AACtC,QAAA,MAAM,GAAA,GAAM,UAAA,CAAA,CAAY,CAAA,GAAI,CAAA,IAAK,IAAI,CAAC,CAAA;AACtC,QAAA,MAAM,MAAM,GAAA,GAAM,GAAA;AAClB,QAAA,MAAM,MAAM,GAAA,GAAM,GAAA;AAClB,QAAA,MAAM,MAAM,GAAA,GAAM,GAAA;AAClB,QAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,CAAK,GAAA,GAAM,MAAM,GAAA,GAAM,GAAA,GAAM,MAAM,GAAG,CAAA;AACzD,QAAA,IAAI,QAAQ,IAAA,EAAQ;AAClB,UAAA,EAAA,GAAK,MAAM,GAAA,GAAM,KAAA;AACjB,UAAA,EAAA,GAAK,MAAM,GAAA,GAAM,KAAA;AACjB,UAAA,EAAA,GAAK,MAAM,GAAA,GAAM,KAAA;AAAA,QACnB,CAAA,MAAO;AACL,UAAA,EAAA,GAAK,UAAA,CAAA,CAAY,CAAA,GAAI,CAAA,IAAK,CAAC,CAAA;AAC3B,UAAA,EAAA,GAAK,UAAA,CAAA,CAAY,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAC,CAAA;AAC/B,UAAA,EAAA,GAAK,UAAA,CAAA,CAAY,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAC,CAAA;AAAA,QACjC;AAAA,MACF,CAAA,MAAA,IAAW,CAAA,GAAI,WAAA,GAAc,CAAA,EAAG;AAC9B,QAAA,EAAA,GAAK,UAAA,CAAA,CAAY,CAAA,GAAI,CAAA,IAAK,CAAC,CAAA;AAC3B,QAAA,EAAA,GAAK,UAAA,CAAA,CAAY,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAC,CAAA;AAC/B,QAAA,EAAA,GAAK,UAAA,CAAA,CAAY,CAAA,GAAI,CAAA,IAAK,CAAA,GAAI,CAAC,CAAA;AAAA,MACjC,CAAA,MAAA,IAAW,eAAe,CAAA,EAAG;AAE3B,QAAA,MAAM,KAAA,GAAQ,UAAA,CAAA,CAAY,CAAA,GAAI,CAAA,IAAK,CAAC,CAAA;AACpC,QAAA,MAAM,KAAA,GAAQ,UAAA,CAAA,CAAY,CAAA,GAAI,CAAA,IAAK,IAAI,CAAC,CAAA;AACxC,QAAA,MAAM,KAAA,GAAQ,UAAA,CAAA,CAAY,CAAA,GAAI,CAAA,IAAK,IAAI,CAAC,CAAA;AACxC,QAAA,EAAA,GAAK,OAAO,GAAA,GAAM,KAAA,CAAA;AAClB,QAAA,EAAA,GAAK,OAAO,GAAA,GAAM,KAAA,CAAA;AAClB,QAAA,EAAA,GAAK,OAAO,GAAA,GAAM,KAAA,CAAA;AAAA,MACpB,CAAA,MAAO;AACL,QAAA,EAAA,GAAK,GAAA;AACL,QAAA,EAAA,GAAK,GAAA,GAAM,IAAA;AACX,QAAA,EAAA,GAAK,GAAA;AAAA,MACP;AAEA,MAAA,MAAM,CAAA,GAAI,WAAA,GAAc,CAAA,GAAI,CAAA,IAAK,cAAc,CAAA,CAAA,GAAK,CAAA;AAGpD,MAAA,IAAI,cAAA,GAAiB,CAAA;AACrB,MAAA,IAAI,OAAA,GAAU,CAAA,IAAK,YAAA,IAAgB,CAAA,EAAG;AAGpC,QAAA,MAAM,KAAA,GAAQ,KAAK,YAAA,GAAe,CAAA,CAAA;AAClC,QAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,IAAA,CAAK,MAAM,KAAK,CAAA,EAAG,eAAe,CAAC,CAAA;AAC3D,QAAA,MAAM,SAAS,IAAA,CAAK,GAAA,CAAI,MAAA,GAAS,CAAA,EAAG,eAAe,CAAC,CAAA;AACpD,QAAA,MAAM,OAAO,KAAA,GAAQ,MAAA;AACrB,QAAA,MAAM,QAAQ,GAAA,GAAM,WAAA,CAAY,aAAA,CAAc,cAAA,CAAe,MAAM,CAAC,CAAA;AACpE,QAAA,MAAM,QAAQ,GAAA,GAAM,WAAA,CAAY,aAAA,CAAc,cAAA,CAAe,MAAM,CAAC,CAAA;AACpE,QAAA,MAAM,GAAA,GAAM,KAAA,GAAA,CAAS,KAAA,GAAQ,KAAA,IAAS,IAAA;AACtC,QAAA,cAAA,GAAiB,CAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAA,GAAM,WAAW,CAAG,CAAA;AAAA,MACtD;AAEA,MAAA,MAAM,UAAA,GAAa,kBAAkB,CAAC,CAAA;AACtC,MAAA,MAAM,YAAA,GAAe,oBAAoB,CAAC,CAAA;AAC1C,MAAA,MAAM,SAAA,GAAY,WAAA,CAAY,KAAA,GAAQ,UAAA,GAAa,GAAA;AACnD,MAAA,MAAM,KAAA,GAAQ,WAAW,YAAA,GAAe,cAAA;AACxC,MAAA,MAAM,KAAK,sBAAA,GACP,QAAA,GAAW,sBAAA,CAAuB,CAAA,CAAE,CAAC,CAAA,GACrC,QAAA;AACJ,MAAA,MAAM,KAAK,sBAAA,GACP,QAAA,GAAW,sBAAA,CAAuB,CAAA,CAAE,CAAC,CAAA,GACrC,QAAA;AACJ,MAAA,MAAM,KAAK,sBAAA,GACP,QAAA,GAAW,sBAAA,CAAuB,CAAA,CAAE,CAAC,CAAA,GACrC,QAAA;AAEJ,MAAA,gBAAA;AAAA,QACE,IAAA;AAAA,QACA,IAAA;AAAA,QACA,IAAA;AAAA,QACA,SAAA;AAAA,QACA,GAAA;AAAA,QACA,GAAA;AAAA,QACA,GAAA;AAAA,QACA,EAAA;AAAA,QACA,EAAA;AAAA,QACA,EAAA;AAAA,QACA,SAAA;AAAA,QACA,CAAA;AAAA,QACA,KAAA;AAAA,QACA,EAAA;AAAA,QACA,EAAA;AAAA,QACA,EAAA;AAAA,QACA,QAAA;AAAA,QACA,WAAA;AAAA,QACA,YAAA;AAAA,QACA,iBAAA;AAAA,QACA,UAAA;AAAA,QACA,aAAA;AAAA,QACA;AAAA,OACF;AAAA,IACF;AAGA,IAAA,IAAI,kBAAA,IAAsB,UAAA,IAAc,WAAA,IAAe,CAAA,EAAG;AACxD,MAAA,MAAM,OAAO,MAAA,GAAS,CAAA;AACtB,MAAA,MAAM,EAAA,GAAK,UAAA,CAAW,CAAC,CAAA,GAAI,WAAW,CAAC,CAAA;AACvC,MAAA,MAAM,EAAA,GAAK,UAAA,CAAW,CAAC,CAAA,GAAI,WAAW,CAAC,CAAA;AACvC,MAAA,MAAM,EAAA,GAAK,UAAA,CAAW,CAAC,CAAA,GAAI,WAAW,CAAC,CAAA;AACvC,MAAA,MAAM,IAAA,GAAO,KAAK,IAAA,CAAK,EAAA,GAAK,KAAK,EAAA,GAAK,EAAA,GAAK,KAAK,EAAE,CAAA;AAClD,MAAA,IAAI,OAAO,IAAA,EAAQ;AACjB,QAAA,MAAM,MAAM,EAAA,GAAK,IAAA;AACjB,QAAA,MAAM,MAAM,EAAA,GAAK,IAAA;AACjB,QAAA,MAAM,MAAM,EAAA,GAAK,IAAA;AACjB,QAAA,IAAI,GAAA,GAAM,CAAA,EACR,GAAA,GAAM,CAAA,EACN,GAAA,GAAM,CAAA;AACR,QAAA,MAAM,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,MAAM,GAAA,GAAM,GAAA;AAC1C,QAAA,IAAI,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA,GAAI,KAAA,EAAO;AACzB,UAAA,GAAA,GAAM,CAAA;AACN,UAAA,GAAA,GAAM,CAAA;AACN,UAAA,GAAA,GAAM,CAAA;AAAA,QACR;AACA,QAAA,IAAI,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,GAAA;AAC5B,QAAA,IAAI,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,GAAA;AAC5B,QAAA,IAAI,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,GAAA,GAAM,GAAA;AAC5B,QAAA,MAAM,KAAA,GAAQ,KAAK,IAAA,CAAK,GAAA,GAAM,MAAM,GAAA,GAAM,GAAA,GAAM,MAAM,GAAG,CAAA;AACzD,QAAA,IAAI,QAAQ,IAAA,EAAQ;AAClB,UAAA,GAAA,IAAO,KAAA;AACP,UAAA,GAAA,IAAO,KAAA;AACP,UAAA,GAAA,IAAO,KAAA;AAAA,QACT;AACA,QAAA,MAAM,MAAA,GAAS,WAAW,IAAI,CAAA;AAC9B,QAAA,MAAM,MAAA,GAAS,UAAA,CAAW,IAAA,GAAO,CAAC,CAAA;AAClC,QAAA,MAAM,MAAA,GAAS,UAAA,CAAW,IAAA,GAAO,CAAC,CAAA;AAClC,QAAA,MAAM,OAAA,GAAU,MAAA,KAAW,CAAA,IAAK,MAAA,KAAW,KAAK,MAAA,KAAW,CAAA;AAC3D,QAAA,IAAI,OAAA,EAAS;AACX,UAAA,MAAM,SAAA,GAAY,GAAA,GAAM,MAAA,GAAS,GAAA,GAAM,SAAS,GAAA,GAAM,MAAA;AACtD,UAAA,IAAI,YAAY,CAAA,EAAG;AACjB,YAAA,KAAA,IAAS,CAAA,GAAI,GAAG,CAAA,GAAI,IAAA,CAAK,IAAI,WAAA,EAAa,WAAW,GAAG,CAAA,EAAA,EAAK;AAC3D,cAAA,MAAM,IAAA,GAAO,iBAAiB,CAAA,GAAI,CAAA;AAClC,cAAA,MAAM,EAAA,GAAK,kBAAkB,IAAI,CAAA;AACjC,cAAA,iBAAA,CAAkB,IAAI,IAAI,CAAC,EAAA;AAC3B,cAAA,iBAAA,CAAkB,IAAA,GAAO,CAAC,CAAA,GAAI,CAAC,EAAA;AAAA,YACjC;AACA,YAAA,GAAA,GAAM,CAAC,GAAA;AACP,YAAA,GAAA,GAAM,CAAC,GAAA;AACP,YAAA,GAAA,GAAM,CAAC,GAAA;AAAA,UACT;AAAA,QACF;AACA,QAAA,UAAA,CAAW,IAAI,CAAA,GAAI,GAAA;AACnB,QAAA,UAAA,CAAW,IAAA,GAAO,CAAC,CAAA,GAAI,GAAA;AACvB,QAAA,UAAA,CAAW,IAAA,GAAO,CAAC,CAAA,GAAI,GAAA;AAAA,MACzB;AAAA,IACF;AAIA,IAAA,KAAA,IAAS,EAAA,GAAK,CAAA,EAAG,EAAA,GAAK,YAAA,EAAc,EAAA,EAAA,EAAM;AACxC,MAAA,MAAM,IAAA,GAAO,eAAe,EAAE,CAAA;AAC9B,MAAA,MAAM,YAAY,IAAA,GAAO,mBAAA;AACzB,MAAA,MAAM,WAAA,GAAc,UAAA,GAAa,UAAA,CAAW,IAAI,CAAA,GAAI,WAAA;AACpD,MAAA,IAAI,UAAA,EAAY,UAAA,CAAW,IAAI,CAAA,GAAI,CAAA;AACnC,MAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,EAAa,CAAA,EAAA,EAAK;AACpC,QAAA,MAAM,IAAA,GAAA,CAAQ,SAAA,GAAY,CAAA,GAAI,CAAA,IAAK,CAAA;AACnC,QAAA,MAAM,IAAA,GAAA,CAAQ,SAAA,GAAY,CAAA,GAAI,CAAA,IAAK,CAAA;AACnC,QAAA,MAAM,IAAA,GAAO,YAAY,CAAA,GAAI,CAAA;AAC7B,QAAA,MAAM,SAAA,GAAA,CAAa,SAAA,GAAY,CAAA,GAAI,CAAA,IAAK,CAAA;AACxC,QAAA,gBAAA;AAAA,UACE,IAAA;AAAA,UACA,IAAA;AAAA,UACA,IAAA;AAAA,UACA,SAAA;AAAA,UACA,WAAA;AAAA,UACA,YAAA;AAAA,UACA,iBAAA;AAAA,UACA,UAAA;AAAA,UACA,aAAA;AAAA,UACA,aAAA;AAAA,UACA,CAAA;AAAA,UACA,CAAA;AAAA,UACA;AAAA,SACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,iBAAA,CAAkB,WAAA,GAAc,IAAA;AAChC,IAAA,cAAA,CAAe,WAAA,GAAc,IAAA;AAC7B,IAAA,cAAA,CAAe,WAAA,GAAc,IAAA;AAC7B,IAAA,mBAAA,CAAoB,WAAA,GAAc,IAAA;AAClC,IAAA,wBAAA,CAAyB,WAAA,GAAc,IAAA;AACvC,IAAA,iBAAA,CAAkB,WAAA,GAAc,IAAA;AAAA,EAClC;AACF,CAAA;AAEO,IAAM,qBAAA,GAAwB,CAAC,SAAA,KAAyB;AAC7D,EAAA,sBAAA,CAAuB,OAAA;AAAA,IAAQ,CAAC,KAAA,KAC9B,4BAAA,CAA6B,KAAA,EAAO,SAAS;AAAA,GAC/C;AACF;;;AC/5GA,IAAM,qBAAA,GAAwB,CAAA;AAM9B,IAAM,qBAAqB,IAAI,GAAA;AAAA,EAC5B,MAAA,CAAO,QAAQ,WAAW,CAAA,CAA8B,IAAI,CAAC,CAAC,CAAA,EAAG,CAAC,CAAA,KAAM;AAAA,IACvE,CAAA;AAAA,IACA;AAAA,GACD;AACH,CAAA;AAGA,IAAM,uBAAA,uBAA8B,GAAA,EAA2B;AAC/D,KAAA,MAAW,CAAC,EAAA,EAAI,EAAE,KAAK,MAAA,CAAO,OAAA,CAAQ,kBAAkB,CAAA,EAGnD;AACH,EAAA,IAAI,EAAA,EAAI,uBAAA,CAAwB,GAAA,CAAI,EAAA,EAAI,EAAE,CAAA;AAC5C;AAIA,SAAS,YAAA,CAAa,OAAgB,GAAA,EAAuB;AAC3D,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW,OAAO,KAAA;AAClD,EAAA,IAAI,KAAA,YAAuBC,MAAA,CAAA,OAAA;AACzB,IAAA,OAAO,EAAE,GAAG,KAAA,CAAM,CAAA,EAAG,GAAG,KAAA,CAAM,CAAA,EAAG,CAAA,EAAG,KAAA,CAAM,CAAA,EAAE;AAC9C,EAAA,IAAI,KAAA,YAAuBA,gBAAS,OAAO,EAAE,GAAG,KAAA,CAAM,CAAA,EAAG,CAAA,EAAG,KAAA,CAAM,CAAA,EAAE;AACpE,EAAA,IAAI,KAAA,YAAuBA,gBAAS,OAAO,MAAA;AAC3C,EAAA,IAAI,OAAO,KAAA,KAAU,UAAA,EAAY,OAAO,MAAA;AACxC,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS,YAAA,CAAa,IAAI,CAAC,CAAA;AACvE,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,MAAM,GAAA,GAAM,KAAA;AAGZ,IAAA,IACE,IAAI,MAAM,CAAA,KAAA,QAAA,iBACV,OAAO,GAAA,CAAI,eAAe,MAAM,UAAA,EAChC;AACA,MAAA,MAAM,KAAK,uBAAA,CAAwB,GAAA;AAAA,QACjC,IAAI,eAAe;AAAA,OACrB;AACA,MAAA,IAAI,CAAC,EAAA,EAAI;AACP,QAAA,MAAM,IAAI,KAAA;AAAA,UACR;AAAA,SACF;AAAA,MACF;AACA,MAAA,OAAO;AAAA,QACL,IAAA,EAAA,QAAA;AAAA,QACA,eAAA,EAAiB,EAAA;AAAA,QACjB,GAAI,GAAA,CAAI,OAAO,CAAA,KAAM,MAAA,GAAY,EAAE,KAAA,EAAO,GAAA,CAAI,OAAO,CAAA,EAAE,GAAI;AAAC,OAC9D;AAAA,IACF;AAEA,IAAA,MAAM,SAAoB,EAAC;AAC3B,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,EAAG;AACxC,MAAA,IAAI,CAAA,KAAM,UAAA,IAAc,CAAA,KAAM,YAAA,EAAc;AAC5C,MAAA,IAAI,CAAA,KAAM,UAAA,IAAc,OAAO,CAAA,KAAM,QAAA,EAAU;AAC7C,QAAA,MAAA,CAAO,CAAC,CAAA,GAAI,kBAAA,CAAmB,GAAA,CAAI,CAAmB,CAAA,IAAK,CAAA;AAC3D,QAAA;AAAA,MACF;AACA,MAAA,MAAM,UAAA,GAAa,YAAA,CAAa,CAAI,CAAA;AACpC,MAAA,IAAI,UAAA,KAAe,MAAA,EAAW,MAAA,CAAO,CAAC,CAAA,GAAI,UAAA;AAAA,IAC5C;AACA,IAAA,OAAO,MAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;AAyBO,SAAS,wBAAwB,MAAA,EAAsC;AAC5E,EAAA,MAAM,UAAA,GAAa,aAAa,MAAM,CAAA;AACtC,EAAA,OAAO,KAAK,SAAA,CAAU,EAAE,UAAU,qBAAA,EAAuB,GAAG,YAAY,CAAA;AAC1E;AAWA,SAAS,iBAAiB,GAAA,EAA6B;AACrD,EAAA,MAAM,GAAA,GAAM,GAAA;AAGZ,EAAA,IAAI,KAAA,CAAM,QAAQ,GAAA,CAAI,cAAc,CAAC,CAAA,IAAK,CAAC,GAAA,CAAI,MAAM,CAAA,EAAG;AACtD,IAAA,OAAO,EAAE,IAAA,EAAA,QAAA,eAA4B,GAAG,GAAA,EAAI;AAAA,EAC9C;AAEA,EAAA,IAAI,GAAA,CAAI,MAAM,CAAA,KAAA,QAAA,eAA4B;AACxC,IAAA,MAAM,EAAA,GAAK,IAAI,iBAAiB,CAAA;AAChC,IAAA,MAAM,EAAA,GAAK,iBAAiB,EAAE,CAAA;AAC9B,IAAA,IAAI,CAAC,EAAA,EAAI;AACP,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,6BAA6B,EAAE,CAAA,oCAAA;AAAA,OACjC;AAAA,IACF;AACA,IAAA,MAAM,KAAA,GAAqB;AAAA,MACzB,IAAA,EAAA,QAAA;AAAA,MACA,aAAA,EAAe;AAAA,KACjB;AACA,IAAA,IAAI,IAAI,OAAO,CAAA,KAAM,QAAW,KAAA,CAAM,KAAA,GAAQ,IAAI,OAAO,CAAA;AACzD,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,OAAO,GAAA;AACT;AAMA,SAAS,wBACP,KAAA,EAC8D;AAC9D,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,EAAU,OAAO,KAAA;AACtC,EAAA,IAAI,CAAC,KAAA,IAAS,OAAO,KAAA,KAAU,UAAU,OAAO,KAAA;AAChD,EAAA,MAAM,GAAA,GAAM,KAAA;AACZ,EAAA,MAAM,iBACJ,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,cAAc,CAAC,CAAA,IACjC,GAAA,CAAI,MAAM,CAAA,KAAA,QAAA,iBACV,IAAI,MAAM,CAAA,KAAA,QAAA,iBACV,OAAO,GAAA,CAAI,iBAAiB,CAAA,KAAM,QAAA;AACpC,EAAA,IAAI,cAAA,EAAgB,OAAO,gBAAA,CAAiB,GAAG,CAAA;AAC/C,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,mBAAmB,GAAA,EAAyC;AACnE,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,UAAU,OAAO,MAAA;AAC5C,EAAA,MAAM,EAAE,CAAA,GAAI,CAAA,EAAG,IAAI,CAAA,EAAG,CAAA,GAAI,GAAE,GAAI,GAAA;AAChC,EAAA,OAAO,IAAUA,MAAA,CAAA,OAAA,CAAQ,CAAA,EAAG,CAAA,EAAG,CAAC,CAAA;AAClC;AAEA,SAAS,mBAAmB,GAAA,EAAyC;AACnE,EAAA,IAAI,CAAC,GAAA,IAAO,OAAO,GAAA,KAAQ,UAAU,OAAO,MAAA;AAC5C,EAAA,MAAM,EAAE,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,GAAE,GAAI,GAAA;AACzB,EAAA,OAAO,IAAUA,MAAA,CAAA,OAAA,CAAQ,CAAA,EAAG,CAAC,CAAA;AAC/B;AAEA,SAAS,kBAAkB,GAAA,EAAsC;AAC/D,EAAA,MAAM,SAA+B,EAAC;AAGtC,EAAA,IAAI,IAAI,WAAW,CAAA,IAAK,OAAO,GAAA,CAAI,WAAW,MAAM,QAAA,EAAU;AAC5D,IAAA,MAAM,CAAA,GAAI,IAAI,WAAW,CAAA;AACzB,IAAA,MAAA,CAAO,SAAA,GAAY;AAAA,MACjB,QAAA,EAAU,kBAAA,CAAmB,CAAA,CAAE,UAAU,CAAC,CAAA;AAAA,MAC1C,QAAA,EAAU,kBAAA,CAAmB,CAAA,CAAE,UAAU,CAAC,CAAA;AAAA,MAC1C,KAAA,EAAO,kBAAA,CAAmB,CAAA,CAAE,OAAO,CAAC;AAAA,KACtC;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,KAAA,IAAS;AAAA,IAClB,UAAA;AAAA,IACA,SAAA;AAAA,IACA,SAAA;AAAA,IACA,iBAAA;AAAA,IACA,mBAAA;AAAA,IACA;AAAA,GACF,EAAY;AACV,IAAA,IAAI,SAAS,GAAA,EAAM,OAAqB,KAAK,CAAA,GAAI,IAAI,KAAK,CAAA;AAAA,EAC5D;AAGA,EAAA,KAAA,MAAW,KAAA,IAAS;AAAA,IAClB,YAAA;AAAA,IACA,eAAA;AAAA,IACA,YAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACF,EAAY;AACV,IAAA,IAAI,KAAA,IAAS,GAAA;AACX,MAAC,OAAqB,KAAK,CAAA,GAAI,uBAAA,CAAwB,GAAA,CAAI,KAAK,CAAC,CAAA;AAAA,EACrE;AAGA,EAAA,IAAI,YAAA,IAAgB,GAAA;AAClB,IAAA,MAAA,CAAO,UAAA,GAAa,IAAI,YAAY,CAAA;AAGtC,EAAA,IAAI,IAAI,UAAU,CAAA,IAAK,OAAO,GAAA,CAAI,UAAU,MAAM,QAAA,EAAU;AAC1D,IAAA,MAAM,CAAA,GAAI,IAAI,UAAU,CAAA;AACxB,IAAA,MAAA,CAAO,QAAA,GAAW;AAAA,MAChB,YAAA,EAAc,uBAAA,CAAwB,CAAA,CAAE,cAAc,CAAC,CAAA;AAAA,MAGvD,gBAAA,EAAkB,uBAAA;AAAA,QAChB,EAAE,kBAAkB;AAAA,OACtB;AAAA,MACA,MAAA,EAAQ,KAAA,CAAM,OAAA,CAAQ,CAAA,CAAE,QAAQ,CAAC,CAAA,GAC5B,CAAA,CAAE,QAAQ,CAAA,GAGX;AAAC,KACP;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,IAAW,GAAA;AACb,IAAA,MAAA,CAAO,KAAA,GAAQ,IAAI,OAAO,CAAA;AAG5B,EAAA,IAAI,IAAI,UAAU,CAAA,IAAK,OAAO,GAAA,CAAI,UAAU,MAAM,QAAA,EAAU;AAC1D,IAAA,MAAM,CAAA,GAAI,IAAI,UAAU,CAAA;AACxB,IAAA,MAAM,QAAA,GACJ,OAAO,CAAA,CAAE,UAAU,MAAM,QAAA,GACpB,WAAA,CAAY,CAAA,CAAE,UAAU,CAAgB,CAAA,IAAWA,MAAA,CAAA,cAAA,GAClD,CAAA,CAAE,UAAU,CAAA,IAAkCA,MAAA,CAAA,cAAA;AACtD,IAAA,MAAA,CAAO,QAAA,GAAW,EAAE,GAAG,CAAA,EAAG,QAAA,EAAS;AAAA,EACrC;AAGA,EAAA,IACE,IAAI,sBAAsB,CAAA,IAC1B,OAAO,GAAA,CAAI,sBAAsB,MAAM,QAAA,EACvC;AACA,IAAA,MAAM,GAAA,GAAM,IAAI,sBAAsB,CAAA;AACtC,IAAA,MAAM,eAAA,GAAkB,CACtB,IAAA,KAC8C;AAC9C,MAAA,IAAI,CAAC,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,SAAiB,EAAC;AAC/C,MAAA,MAAM,CAAA,GAAI,IAAA;AACV,MAAA,OAAO;AAAA,QACL,GAAI,CAAA,CAAE,GAAG,CAAA,KAAM,MAAA,GAAY,EAAE,CAAA,EAAG,uBAAA,CAAwB,CAAA,CAAE,GAAG,CAAC,CAAA,KAAM,EAAC;AAAA,QACrE,GAAI,CAAA,CAAE,GAAG,CAAA,KAAM,MAAA,GAAY,EAAE,CAAA,EAAG,uBAAA,CAAwB,CAAA,CAAE,GAAG,CAAC,CAAA,KAAM,EAAC;AAAA,QACrE,GAAI,CAAA,CAAE,GAAG,CAAA,KAAM,MAAA,GAAY,EAAE,CAAA,EAAG,uBAAA,CAAwB,CAAA,CAAE,GAAG,CAAC,CAAA,KAAM;AAAC,OACvE;AAAA,IACF,CAAA;AACA,IAAA,MAAA,CAAO,oBAAA,GAAuB;AAAA,MAC5B,QAAA,EAAW,GAAA,CAAI,UAAU,CAAA,IAAiB,KAAA;AAAA,MAC1C,MAAA,EAAQ,eAAA,CAAgB,GAAA,CAAI,QAAQ,CAAC,CAAA;AAAA,MAGrC,OAAA,EAAS,eAAA,CAAgB,GAAA,CAAI,SAAS,CAAC;AAAA,KAGzC;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,KAAA,IAAS,CAAC,kBAAA,EAAoB,qBAAqB,CAAA,EAAY;AACxE,IAAA,IAAI,IAAI,KAAK,CAAA,IAAK,OAAO,GAAA,CAAI,KAAK,MAAM,QAAA,EAAU;AAChD,MAAA,MAAM,CAAA,GAAI,IAAI,KAAK,CAAA;AACnB,MAAC,MAAA,CAAqB,KAAK,CAAA,GAAI;AAAA,QAC7B,QAAA,EAAW,CAAA,CAAE,UAAU,CAAA,IAAiB,KAAA;AAAA,QACxC,aAAA,EAAe,gBAAA,CAAiB,CAAA,CAAE,eAAe,CAAC;AAAA,OACpD;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IACE,IAAI,mBAAmB,CAAA,IACvB,OAAO,GAAA,CAAI,mBAAmB,MAAM,QAAA,EACpC;AACA,IAAA,MAAM,GAAA,GAAM,IAAI,mBAAmB,CAAA;AACnC,IAAA,MAAA,CAAO,iBAAA,GAAoB;AAAA,MACzB,QAAA,EAAW,GAAA,CAAI,UAAU,CAAA,IAAiB,IAAA;AAAA,MAC1C,CAAA,EAAG,gBAAA,CAAiB,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,MAC5B,CAAA,EAAG,gBAAA,CAAiB,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,MAC5B,CAAA,EAAG,gBAAA,CAAiB,GAAA,CAAI,GAAG,CAAC;AAAA,KAC9B;AAAA,EACF;AAGA,EAAA,IACE,IAAI,sBAAsB,CAAA,IAC1B,OAAO,GAAA,CAAI,sBAAsB,MAAM,QAAA,EACvC;AACA,IAAA,MAAA,CAAO,oBAAA,GAAuB,IAC5B,sBACF,CAAA;AAAA,EACF;AAGA,EAAA,IAAI,IAAI,OAAO,CAAA,IAAK,OAAO,GAAA,CAAI,OAAO,MAAM,QAAA,EAAU;AACpD,IAAA,MAAA,CAAO,KAAA,GAAQ,IAAI,OAAO,CAAA;AAAA,EAC5B;AAGA,EAAA,IACE,IAAI,uBAAuB,CAAA,IAC3B,OAAO,GAAA,CAAI,uBAAuB,MAAM,QAAA,EACxC;AACA,IAAA,MAAM,GAAA,GAAM,IAAI,uBAAuB,CAAA;AACvC,IAAA,MAAA,CAAO,qBAAA,GAAwB;AAAA,MAC7B,GAAI,GAAA;AAAA,MACJ,KAAA,EAAO,kBAAA,CAAmB,GAAA,CAAI,OAAO,CAAC,CAAA;AAAA,MACtC,UAAA,EAAY,uBAAA,CAAwB,GAAA,CAAI,YAAY,CAAC;AAAA,KAGvD;AAAA,EACF;AAGA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAC,CAAA,EAAG;AACrC,IAAA,MAAA,CAAO,cAAe,GAAA,CAAI,aAAa,CAAA,CAAkB,GAAA,CAAI,CAAC,EAAA,MAAQ;AAAA,MACpE,GAAI,EAAA;AAAA,MACJ,MAAA,EAAQ,iBAAA,CAAkB,EAAA,CAAG,QAAQ,CAAc;AAAA,KACrD,CAAE,CAAA;AAAA,EACJ;AAGA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,aAAa,CAAC,CAAA,EAAG;AACrC,IAAA,MAAA,CAAO,cAAe,GAAA,CAAI,aAAa,CAAA,CAAkB,GAAA,CAAI,CAAC,EAAA,KAAO;AACnE,MAAA,MAAM,SAA2B,EAAC;AAClC,MAAA,IAAI,UAAA,IAAc,EAAA,EAAI,MAAA,CAAO,QAAA,GAAW,GAAG,UAAU,CAAA;AACrD,MAAA,IAAI,MAAA,IAAU,EAAA,EAAI,MAAA,CAAO,IAAA,GAAO,GAAG,MAAM,CAAA;AACzC,MAAA,IAAI,EAAA,CAAG,UAAU,CAAA,EAAG,MAAA,CAAO,WAAW,kBAAA,CAAmB,EAAA,CAAG,UAAU,CAAC,CAAA;AACvE,MAAA,IAAI,GAAG,WAAW,CAAA;AAChB,QAAA,MAAA,CAAO,SAAA,GAAY,kBAAA,CAAmB,EAAA,CAAG,WAAW,CAAC,CAAA;AACvD,MAAA,IAAI,UAAA,IAAc,EAAA;AAChB,QAAA,MAAA,CAAO,QAAA,GAAW,uBAAA;AAAA,UAChB,GAAG,UAAU;AAAA,SACf;AACF,MAAA,IAAI,OAAA,IAAW,EAAA;AACb,QAAA,MAAA,CAAO,QACL,EAAA,CAAG,OAAO,MAAM,IAAA,GAAO,QAAA,GAAY,GAAG,OAAO,CAAA;AACjD,MAAA,IAAI,SAAA,IAAa,EAAA,EAAI,MAAA,CAAO,OAAA,GAAU,GAAG,SAAS,CAAA;AAClD,MAAA,OAAO,MAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,iBAAiB,CAAC,CAAA,EAAG;AACzC,IAAA,MAAA,CAAO,eAAA,GAAmB,GAAA,CAAI,iBAAiB,CAAA,CAAkB,GAAA;AAAA,MAC/D,CAAC,EAAA,KAAO;AACN,QAAA,MAAM,SAA+B,EAAC;AACtC,QAAA,IAAI,UAAA,IAAc,EAAA,EAAI,MAAA,CAAO,QAAA,GAAW,GAAG,UAAU,CAAA;AACrD,QAAA,IAAI,MAAA,IAAU,EAAA,EAAI,MAAA,CAAO,IAAA,GAAO,GAAG,MAAM,CAAA;AACzC,QAAA,IAAI,GAAG,UAAU,CAAA;AACf,UAAA,MAAA,CAAO,QAAA,GAAW,kBAAA,CAAmB,EAAA,CAAG,UAAU,CAAC,CAAA;AACrD,QAAA,IAAI,EAAA,CAAG,QAAQ,CAAA,EAAG,MAAA,CAAO,SAAS,kBAAA,CAAmB,EAAA,CAAG,QAAQ,CAAC,CAAA;AACjE,QAAA,IAAI,QAAA,IAAY,EAAA,EAAI,MAAA,CAAO,MAAA,GAAS,GAAG,QAAQ,CAAA;AAC/C,QAAA,IAAI,cAAA,IAAkB,EAAA;AACpB,UAAA,MAAA,CAAO,YAAA,GAAe,GAAG,cAAc,CAAA;AACzC,QAAA,OAAO,MAAA;AAAA,MACT;AAAA,KACF;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,GAAA,IAAO,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,EAAG;AAClC,IAAA,IAAI,EAAE,OAAO,MAAA,CAAA,IAAW,GAAA,KAAQ,cAAc,GAAA,CAAI,GAAG,MAAM,IAAA,EAAM;AAC/D,MAAC,MAAA,CAAqB,GAAG,CAAA,GAAI,GAAA,CAAI,GAAG,CAAA;AAAA,IACtC;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AA0BO,SAAS,0BAA0B,IAAA,EAAoC;AAC5E,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,IAAI,CAAA;AAE9B,EAAA,MAAM,EAAE,QAAA,EAAU,CAAA,EAAG,GAAG,KAAI,GAAI,MAAA;AAChC,EAAA,OAAO,kBAAkB,GAAG,CAAA;AAC9B","file":"index.js","sourcesContent":["/**\n * The semver version of `@cyberluke/three-particles`, injected at build time\n * from `package.json` via `tsup`'s `define` option (see `tsup.config.ts`).\n *\n * Exposed for runtime introspection (debugging, bug reports). Mirrors the\n * three.js `REVISION` + `window.__THREE__` pattern.\n *\n * In test environments (jest/ts-jest) the build-time define isn't applied,\n * so `__THREE_PARTICLES_VERSION__` is undefined; we fall back to `'0.0.0-dev'`\n * so imports don't throw.\n */\ndeclare const __THREE_PARTICLES_VERSION__: string;\n\nexport const REVISION: string =\n typeof __THREE_PARTICLES_VERSION__ !== 'undefined'\n ? __THREE_PARTICLES_VERSION__\n : '0.0.0-dev';\n\nif (typeof globalThis !== 'undefined') {\n const g = globalThis as { __THREE_PARTICLES__?: string };\n if (g.__THREE_PARTICLES__ && g.__THREE_PARTICLES__ !== REVISION) {\n // eslint-disable-next-line no-console\n console.warn(\n 'WARNING: Multiple instances of @cyberluke/three-particles being imported.'\n );\n } else {\n g.__THREE_PARTICLES__ = REVISION;\n }\n}\n","/**\n * Standard IEC 61966-2-1 sRGB → linear transfer function.\n * Matches `THREE.ColorManagement.SRGBToLinear` and the GLSL\n * `ShaderChunk.colorspace_fragment` implementation, so that user-provided\n * colors go through the exact same conversion the rest of the Three.js\n * pipeline uses for sRGB-tagged inputs.\n *\n * Input: a channel value in [0, 1] interpreted as sRGB.\n * Output: the corresponding linear value in [0, 1].\n */\nexport const sRGBToLinear = (c: number): number =>\n c < 0.04045 ? c / 12.92 : Math.pow((c + 0.055) / 1.055, 2.4);\n\n/**\n * Standard IEC 61966-2-1 linear → sRGB transfer function.\n * Inverse of {@link sRGBToLinear}. Useful for one-shot migration of\n * legacy color values that were authored under the old raw-byte pipeline.\n */\nexport const linearToSRGB = (c: number): number =>\n c < 0.0031308 ? c * 12.92 : 1.055 * Math.pow(c, 1 / 2.4) - 0.055;\n\n/**\n * Converts an sRGB {r, g, b} triplet to linear space.\n * Used when uploading user-authored colors (e.g. `backgroundColor`) as\n * shader uniforms that must match the linear-space texture samples and\n * vertex colors used elsewhere in the pipeline. Missing channels default\n * to 0 to mirror the permissive shape of the `Rgb` config type.\n */\nexport const rgbSRGBToLinear = (c: {\n r?: number;\n g?: number;\n b?: number;\n}): { r: number; g: number; b: number } => ({\n r: sRGBToLinear(c.r ?? 0),\n g: sRGBToLinear(c.g ?? 0),\n b: sRGBToLinear(c.b ?? 0),\n});\n","import { BezierPoint, CurveFunction } from './types.js';\n\nconst cache: Array<{\n bezierPoints: Array<BezierPoint>;\n curveFunction: CurveFunction;\n referencedBy: Array<number>;\n}> = [];\n\nconst nCr = (n: number, k: number) => {\n let z = 1;\n for (let i = 1; i <= k; i++) z *= (n + 1 - i) / i;\n return z;\n};\n\nexport const createBezierCurveFunction = (\n particleSystemId: number,\n bezierPoints: Array<BezierPoint>\n) => {\n const cacheEntry = cache.find((item) => item.bezierPoints === bezierPoints);\n\n if (cacheEntry) {\n if (!cacheEntry.referencedBy.includes(particleSystemId))\n cacheEntry.referencedBy.push(particleSystemId);\n return cacheEntry.curveFunction;\n }\n\n const entry = {\n referencedBy: [particleSystemId],\n bezierPoints,\n curveFunction: (percentage: number): number => {\n if (percentage < 0) return bezierPoints[0].y;\n if (percentage > 1) return bezierPoints[bezierPoints.length - 1].y;\n\n let start = 0;\n let stop = bezierPoints.length - 1;\n\n // Plain loop instead of Array.find — this runs per particle per frame,\n // so it must not allocate a callback closure.\n for (let i = 0; i < bezierPoints.length; i++) {\n const point = bezierPoints[i];\n if (percentage < (point.percentage ?? 0)) {\n stop = i;\n break;\n }\n if (point.percentage !== undefined) start = i;\n }\n\n const n = stop - start;\n const calculatedPercentage =\n (percentage - (bezierPoints[start].percentage ?? 0)) /\n ((bezierPoints[stop].percentage ?? 1) -\n (bezierPoints[start].percentage ?? 0));\n\n let value = 0;\n for (let i = 0; i <= n; i++) {\n const p = bezierPoints[start + i];\n const c =\n nCr(n, i) *\n Math.pow(1 - calculatedPercentage, n - i) *\n Math.pow(calculatedPercentage, i);\n value += c * p.y;\n }\n return value;\n },\n };\n\n cache.push(entry);\n return entry.curveFunction;\n};\n\nexport const removeBezierCurveFunction = (particleSystemId: number) => {\n while (true) {\n const index = cache.findIndex((item) =>\n item.referencedBy.includes(particleSystemId)\n );\n if (index === -1) break;\n const entry = cache[index];\n entry.referencedBy = entry.referencedBy.filter(\n (id) => id !== particleSystemId\n );\n if (entry.referencedBy.length === 0) cache.splice(index, 1);\n }\n};\n\nexport const getBezierCacheSize = () => cache.length;\n","import Easing from 'easing-functions';\nimport { CurveFunction } from './types.js';\n\n/**\n * Predefined easing function identifiers for animating particle properties\n * over their lifetime.\n *\n * These functions control the rate of change and create different animation\n * feels. Each type has three variants:\n * - **IN**: Starts slow, accelerates toward the end\n * - **OUT**: Starts fast, decelerates toward the end\n * - **IN_OUT**: Combines both, slow at start and end, fast in middle\n *\n * @enum {string}\n *\n * @see {@link https://easings.net/} - Visual reference for easing functions\n */\nexport const enum CurveFunctionId {\n /** Use custom Bezier curve (not an easing function) */\n BEZIER = 'BEZIER',\n\n /** Linear interpolation with constant rate of change */\n LINEAR = 'LINEAR',\n\n /** Quadratic (t??) easing - gentle acceleration */\n QUADRATIC_IN = 'QUADRATIC_IN',\n /** Quadratic (t??) easing - gentle deceleration */\n QUADRATIC_OUT = 'QUADRATIC_OUT',\n /** Quadratic (t??) easing - gentle acceleration then deceleration */\n QUADRATIC_IN_OUT = 'QUADRATIC_IN_OUT',\n\n /** Cubic (t??) easing - moderate acceleration */\n CUBIC_IN = 'CUBIC_IN',\n /** Cubic (t??) easing - moderate deceleration */\n CUBIC_OUT = 'CUBIC_OUT',\n /** Cubic (t??) easing - moderate acceleration then deceleration */\n CUBIC_IN_OUT = 'CUBIC_IN_OUT',\n\n /** Quartic (t???) easing - strong acceleration */\n QUARTIC_IN = 'QUARTIC_IN',\n /** Quartic (t???) easing - strong deceleration */\n QUARTIC_OUT = 'QUARTIC_OUT',\n /** Quartic (t???) easing - strong acceleration then deceleration */\n QUARTIC_IN_OUT = 'QUARTIC_IN_OUT',\n\n /** Quintic (t???) easing - very strong acceleration */\n QUINTIC_IN = 'QUINTIC_IN',\n /** Quintic (t???) easing - very strong deceleration */\n QUINTIC_OUT = 'QUINTIC_OUT',\n /** Quintic (t???) easing - very strong acceleration then deceleration */\n QUINTIC_IN_OUT = 'QUINTIC_IN_OUT',\n\n /** Sinusoidal easing - smooth, natural acceleration */\n SINUSOIDAL_IN = 'SINUSOIDAL_IN',\n /** Sinusoidal easing - smooth, natural deceleration */\n SINUSOIDAL_OUT = 'SINUSOIDAL_OUT',\n /** Sinusoidal easing - smooth acceleration then deceleration */\n SINUSOIDAL_IN_OUT = 'SINUSOIDAL_IN_OUT',\n\n /** Exponential easing - dramatic, explosive acceleration */\n EXPONENTIAL_IN = 'EXPONENTIAL_IN',\n /** Exponential easing - dramatic, explosive deceleration */\n EXPONENTIAL_OUT = 'EXPONENTIAL_OUT',\n /** Exponential easing - dramatic acceleration then deceleration */\n EXPONENTIAL_IN_OUT = 'EXPONENTIAL_IN_OUT',\n\n /** Circular easing - sharp acceleration with curved trajectory */\n CIRCULAR_IN = 'CIRCULAR_IN',\n /** Circular easing - sharp deceleration with curved trajectory */\n CIRCULAR_OUT = 'CIRCULAR_OUT',\n /** Circular easing - sharp acceleration then deceleration */\n CIRCULAR_IN_OUT = 'CIRCULAR_IN_OUT',\n\n /** Elastic easing - oscillates back before accelerating (spring-like) */\n ELASTIC_IN = 'ELASTIC_IN',\n /** Elastic easing - overshoots then oscillates back (spring-like) */\n ELASTIC_OUT = 'ELASTIC_OUT',\n /** Elastic easing - oscillates at both ends (spring-like) */\n ELASTIC_IN_OUT = 'ELASTIC_IN_OUT',\n\n /** Back easing - pulls back before accelerating forward */\n BACK_IN = 'BACK_IN',\n /** Back easing - overshoots forward then pulls back */\n BACK_OUT = 'BACK_OUT',\n /** Back easing - pulls back, overshoots, then settles */\n BACK_IN_OUT = 'BACK_IN_OUT',\n\n /** Bounce easing - bounces at the start */\n BOUNCE_IN = 'BOUNCE_IN',\n /** Bounce easing - bounces at the end (like a ball landing) */\n BOUNCE_OUT = 'BOUNCE_OUT',\n /** Bounce easing - bounces at both start and end */\n BOUNCE_IN_OUT = 'BOUNCE_IN_OUT',\n}\n\nexport const curveFunctionIdMap: Partial<\n Record<CurveFunctionId, CurveFunction>\n> = {\n [CurveFunctionId.LINEAR]: Easing.Linear.None,\n [CurveFunctionId.QUADRATIC_IN]: Easing.Quadratic.In,\n [CurveFunctionId.QUADRATIC_OUT]: Easing.Quadratic.Out,\n [CurveFunctionId.QUADRATIC_IN_OUT]: Easing.Quadratic.InOut,\n [CurveFunctionId.CUBIC_IN]: Easing.Cubic.In,\n [CurveFunctionId.CUBIC_OUT]: Easing.Cubic.Out,\n [CurveFunctionId.CUBIC_IN_OUT]: Easing.Cubic.InOut,\n [CurveFunctionId.QUARTIC_IN]: Easing.Quartic.In,\n [CurveFunctionId.QUARTIC_OUT]: Easing.Quartic.Out,\n [CurveFunctionId.QUARTIC_IN_OUT]: Easing.Quartic.InOut,\n [CurveFunctionId.QUINTIC_IN]: Easing.Quintic.In,\n [CurveFunctionId.QUINTIC_OUT]: Easing.Quintic.Out,\n [CurveFunctionId.QUINTIC_IN_OUT]: Easing.Quintic.InOut,\n [CurveFunctionId.SINUSOIDAL_IN]: Easing.Sinusoidal.In,\n [CurveFunctionId.SINUSOIDAL_OUT]: Easing.Sinusoidal.Out,\n [CurveFunctionId.SINUSOIDAL_IN_OUT]: Easing.Sinusoidal.InOut,\n [CurveFunctionId.EXPONENTIAL_IN]: Easing.Exponential.In,\n [CurveFunctionId.EXPONENTIAL_OUT]: Easing.Exponential.Out,\n [CurveFunctionId.EXPONENTIAL_IN_OUT]: Easing.Exponential.InOut,\n [CurveFunctionId.CIRCULAR_IN]: Easing.Circular.In,\n [CurveFunctionId.CIRCULAR_OUT]: Easing.Circular.Out,\n [CurveFunctionId.CIRCULAR_IN_OUT]: Easing.Circular.InOut,\n [CurveFunctionId.ELASTIC_IN]: Easing.Elastic.In,\n [CurveFunctionId.ELASTIC_OUT]: Easing.Elastic.Out,\n [CurveFunctionId.ELASTIC_IN_OUT]: Easing.Elastic.InOut,\n [CurveFunctionId.BACK_IN]: Easing.Back.In,\n [CurveFunctionId.BACK_OUT]: Easing.Back.Out,\n [CurveFunctionId.BACK_IN_OUT]: Easing.Back.InOut,\n [CurveFunctionId.BOUNCE_IN]: Easing.Bounce.In,\n [CurveFunctionId.BOUNCE_OUT]: Easing.Bounce.Out,\n [CurveFunctionId.BOUNCE_IN_OUT]: Easing.Bounce.InOut,\n};\n\n/**\n * Resolves a curve function from an identifier or returns the function itself.\n *\n * This utility function allows you to use either a {@link CurveFunctionId} string\n * identifier or a custom function directly.\n *\n * @param curveFunctionId - Either a {@link CurveFunctionId} enum value or a\n * custom {@link CurveFunction} implementation\n * @returns The actual easing function that takes a normalized time value (0-1)\n * and returns the eased value\n *\n * @example\n * ```typescript\n * import { getCurveFunction, CurveFunctionId } from '@cyberluke/three-particles';\n *\n * // Using a predefined easing function\n * const easingFunc = getCurveFunction(CurveFunctionId.CUBIC_OUT);\n * console.log(easingFunc(0.5)); // Returns eased value at 50% progress\n *\n * // Using a custom function\n * const customEasing = (t: number) => t * t; // Quadratic\n * const customFunc = getCurveFunction(customEasing);\n * console.log(customFunc(0.5)); // Returns 0.25\n * ```\n */\nexport const getCurveFunction = (\n curveFunctionId: CurveFunctionId | CurveFunction\n): CurveFunction =>\n typeof curveFunctionId === 'function'\n ? curveFunctionId\n : curveFunctionIdMap[curveFunctionId]!;\n","/**\n * Defines the coordinate space in which particles are simulated.\n *\n * @enum {string}\n */\nexport const enum SimulationSpace {\n /**\n * Particles move relative to the emitter's local coordinate system.\n * When the emitter moves or rotates, particles move with it.\n * Ideal for effects attached to moving objects (e.g., engine trails, character auras).\n */\n LOCAL = 'LOCAL',\n\n /**\n * Particles move in world space and are independent of the emitter's transform.\n * Once emitted, particles remain stationary or move according to their velocity in world coordinates.\n * Ideal for environmental effects (e.g., smoke, explosions, ambient particles).\n */\n WORLD = 'WORLD',\n}\n\n/**\n * Defines the geometric shape from which particles are emitted.\n *\n * @enum {string}\n */\nexport const enum Shape {\n /**\n * Emit particles from a spherical volume or shell.\n * Configure with {@link Sphere} properties (radius, arc, radiusThickness).\n */\n SPHERE = 'SPHERE',\n\n /**\n * Emit particles from a conical volume or shell.\n * Configure with {@link Cone} properties (angle, radius, arc, radiusThickness).\n * Useful for directional effects like fire, smoke plumes, or spray effects.\n */\n CONE = 'CONE',\n\n /**\n * Emit particles from a box volume, shell, or edges.\n * Configure with {@link Box} properties (scale, emitFrom).\n * Useful for area-based effects like dust clouds or rain.\n */\n BOX = 'BOX',\n\n /**\n * Emit particles from a circular area or edge.\n * Configure with {@link Circle} properties (radius, arc, radiusThickness).\n * Useful for ground impacts, rings, or radial effects.\n */\n CIRCLE = 'CIRCLE',\n\n /**\n * Emit particles from a rectangular area.\n * Configure with {@link Rectangle} properties (scale, rotation).\n * Useful for planar effects like rain on a surface or screen effects.\n */\n RECTANGLE = 'RECTANGLE',\n}\n\n/**\n * Defines where on a shape particles are emitted from.\n * Not all shapes support all emit modes.\n *\n * @enum {string}\n */\nexport const enum EmitFrom {\n /**\n * Emit particles from random positions within the entire volume of the shape.\n * Supported by: SPHERE, CONE, BOX.\n */\n VOLUME = 'VOLUME',\n\n /**\n * Emit particles from the surface/shell of the shape.\n * Supported by: SPHERE, CONE, BOX.\n */\n SHELL = 'SHELL',\n\n /**\n * Emit particles from the edges of the shape.\n * Supported by: BOX.\n */\n EDGE = 'EDGE',\n}\n\n/**\n * Defines how texture sheet animation is timed.\n *\n * @enum {string}\n */\nexport const enum TimeMode {\n /**\n * Animation frames are based on the particle's lifetime percentage.\n * The animation completes once over the particle's lifetime.\n */\n LIFETIME = 'LIFETIME',\n\n /**\n * Animation frames are based on frames per second (FPS).\n * The animation runs at a fixed speed regardless of particle lifetime.\n */\n FPS = 'FPS',\n}\n\n/**\n * Defines the type of curve function used for animating values over a particle's lifetime.\n *\n * @enum {string}\n */\nexport const enum LifeTimeCurve {\n /**\n * Use custom Bezier curves with control points.\n * Provides maximum control over the animation curve shape.\n * See {@link BezierCurve} for configuration.\n */\n BEZIER = 'BEZIER',\n\n /**\n * Use predefined easing functions (e.g., easeInQuad, easeOutCubic).\n * Convenient for common animation patterns.\n * See {@link EasingCurve} and {@link CurveFunctionId} for available functions.\n */\n EASING = 'EASING',\n}\n\n/**\n * Defines when a sub-emitter is triggered relative to a particle's lifecycle.\n *\n * @enum {string}\n */\nexport const enum SubEmitterTrigger {\n /**\n * Trigger the sub-emitter when a particle is born (activated).\n * Useful for trail effects that start immediately with each particle.\n */\n BIRTH = 'BIRTH',\n\n /**\n * Trigger the sub-emitter when a particle dies (reaches end of lifetime).\n * Useful for cascading effects like explosions spawning smoke.\n */\n DEATH = 'DEATH',\n}\n\n/**\n * Defines the type of force field that affects particles.\n *\n * @enum {string}\n */\nexport const enum ForceFieldType {\n /**\n * Attract or repel particles toward/from a point in space.\n * Positive strength attracts, negative strength repels.\n * Configure with position, strength, range, and falloff.\n */\n POINT = 'POINT',\n\n /**\n * Apply a constant directional force to all particles (like wind).\n * Configure with direction and strength.\n */\n DIRECTIONAL = 'DIRECTIONAL',\n}\n\n/**\n * Defines the rendering technique used for particles.\n *\n * @enum {string}\n */\nexport const enum RendererType {\n /**\n * Render particles as point sprites using `THREE.Points`.\n * This is the default renderer, efficient for small to medium particle counts.\n * Note: point size is limited by `gl_PointSize` hardware caps (typically 64–256 px).\n */\n POINTS = 'POINTS',\n\n /**\n * Render particles as camera-facing quads using `THREE.InstancedBufferGeometry`.\n * Removes the `gl_PointSize` hardware limit, supports stretched billboards,\n * and enables batching multiple emitters into fewer draw calls.\n * Recommended for 10 000+ particles or when large on-screen particle sizes are needed.\n */\n INSTANCED = 'INSTANCED',\n\n /**\n * Render each particle as a ribbon trail connecting its current and previous positions.\n * Each particle stores a configurable number of position history samples, and the\n * renderer builds a camera-facing triangle-strip ribbon through those samples.\n *\n * Trail width and opacity can taper along the ribbon length for effects like\n * sword slashes, magic missiles, comet tails, and speed lines.\n *\n * Configure trail-specific properties via {@link TrailConfig} on the renderer.\n */\n TRAIL = 'TRAIL',\n\n /**\n * Render each particle as a 3D mesh using GPU instancing (`InstancedBufferGeometry`).\n * Instead of flat billboard sprites, particles are rendered as real 3D geometry\n * (e.g., cubes, spheres, tori, or any custom `THREE.BufferGeometry`).\n *\n * Key differences from billboard renderers:\n * - **3D rotation**: Particles rotate in all three axes (quaternion-based).\n * - **Normals**: Mesh geometry retains normals, enabling basic lighting.\n * - **Arbitrary geometry**: Any `THREE.BufferGeometry` can be used per particle.\n *\n * All existing modifiers (sizeOverLifetime, colorOverLifetime, noise, force fields,\n * sub-emitters) work with mesh particles.\n *\n * Configure mesh-specific properties via {@link MeshConfig} on the renderer.\n */\n MESH = 'MESH',\n}\n\n/**\n * Defines how force diminishes with distance from a POINT force field center.\n * Only applicable to {@link ForceFieldType.POINT} force fields.\n *\n * @enum {string}\n */\nexport const enum ForceFieldFalloff {\n /**\n * No falloff — force is constant within range.\n */\n NONE = 'NONE',\n\n /**\n * Force decreases linearly with distance: `1 - d/range`.\n */\n LINEAR = 'LINEAR',\n\n /**\n * Force decreases with the square of distance: `1 - (d/range)²`.\n * More physically realistic than linear fallback.\n */\n QUADRATIC = 'QUADRATIC',\n}\n\n/**\n * Defines the behavior when a particle crosses a collision plane.\n *\n * @enum {string}\n */\nexport const enum CollisionPlaneMode {\n /**\n * Kill the particle immediately when it crosses the plane.\n * The particle is deactivated and returned to the free list.\n * Ideal for boundaries like water surfaces where bubbles pop.\n */\n KILL = 'KILL',\n\n /**\n * Clamp the particle's position to the plane surface.\n * The velocity component along the plane normal is zeroed.\n * The particle stays alive and slides along the plane.\n */\n CLAMP = 'CLAMP',\n\n /**\n * Bounce the particle off the plane.\n * The velocity is reflected across the plane normal and dampened.\n * Use `dampen` to control energy loss on bounce.\n */\n BOUNCE = 'BOUNCE',\n}\n\n/**\n * Defines the simulation backend used for particle updates.\n *\n * @enum {string}\n */\nexport const enum SimulationBackend {\n /**\n * Use GPU compute when the WebGPU path has been registered via\n * `enableWebGPU()` / `registerTSLMaterialFactory()`, otherwise CPU.\n *\n * Note: the library does not inspect the renderer itself — pass your\n * renderer to `enableWebGPU(renderer)` so registration (and therefore the\n * GPU backend) is automatically skipped when the renderer cannot dispatch\n * compute shaders.\n */\n AUTO = 'AUTO',\n\n /**\n * Force CPU-based simulation (JavaScript update loop).\n * Always available regardless of renderer type.\n */\n CPU = 'CPU',\n\n /**\n * Use GPU compute shader simulation. Behaves like {@link SimulationBackend.AUTO}:\n * the GPU backend requires the WebGPU path to be registered via\n * `enableWebGPU()`; without it the system runs on the CPU.\n */\n GPU = 'GPU',\n}\n","/**\n * Interleaved scalar buffer layout constants.\n *\n * All per-particle float attributes (except position and quat) are packed\n * into a single InterleavedBuffer to stay within the WebGPU vertex buffer\n * limit of 8.\n *\n * Buffer layout per particle (stride = 10 floats):\n * ```\n * [isActive, lifetime, startLifetime, startFrame, size, rotation, colorR, colorG, colorB, colorA]\n * ```\n */\n\n/** Number of float32 elements per particle in the interleaved scalar buffer. */\nexport const SCALAR_STRIDE = 10;\n\n/** Offset for the isActive flag (0 = inactive, 1 = active). */\nexport const S_IS_ACTIVE = 0;\n\n/** Offset for the current lifetime of the particle in milliseconds. */\nexport const S_LIFETIME = 1;\n\n/** Offset for the total lifetime of the particle in milliseconds. */\nexport const S_START_LIFETIME = 2;\n\n/** Offset for the texture sheet animation start frame index. */\nexport const S_START_FRAME = 3;\n\n/** Offset for the particle size. */\nexport const S_SIZE = 4;\n\n/** Offset for the particle rotation (radians). */\nexport const S_ROTATION = 5;\n\n/** Offset for the red color channel (0..1). */\nexport const S_COLOR_R = 6;\n\n/** Offset for the green color channel (0..1). */\nexport const S_COLOR_G = 7;\n\n/** Offset for the blue color channel (0..1). */\nexport const S_COLOR_B = 8;\n\n/** Offset for the alpha (opacity) channel (0..1). */\nexport const S_COLOR_A = 9;\n\n// ─── Shared rendering constants ─────────────────────────────────────────────\n\n/** Scale factor converting particle size to pixel-equivalent point size. */\nexport const POINT_SIZE_SCALE = 100.0;\n\n/** Minimum alpha below which fragments are discarded. */\nexport const ALPHA_DISCARD_THRESHOLD = 0.001;\n","import * as THREE from 'three';\n\nimport { createBezierCurveFunction } from './three-particles-bezier.js';\nimport { EmitFrom, LifeTimeCurve } from './three-particles-enums.js';\nimport {\n Constant,\n LifetimeCurve,\n Point3D,\n RandomBetweenTwoConstants,\n} from './types.js';\n\n/**\n * Calculates random position and velocity for particles emitted from a sphere.\n *\n * Supports emission from the entire volume or just the shell of the sphere.\n * Uses spherical coordinates for uniform distribution across the surface.\n *\n * @param position - Output vector for the particle's starting position\n * @param quaternion - Rotation to apply to the emission shape\n * @param velocity - Output vector for the particle's initial velocity\n * @param speed - Speed multiplier for the velocity\n * @param params - Sphere configuration\n * @param params.radius - Radius of the sphere\n * @param params.radiusThickness - Controls emission from volume (1.0) vs shell (0.0)\n * @param params.arc - Arc angle in degrees (360 = full sphere, 180 = hemisphere)\n *\n * @remarks\n * - `radiusThickness = 1.0`: Emit from entire volume\n * - `radiusThickness = 0.0`: Emit only from surface shell\n * - Particles are emitted radially outward from the center\n *\n * @see {@link Sphere} - Configuration type for sphere shape\n */\nexport const calculateRandomPositionAndVelocityOnSphere = (\n position: THREE.Vector3,\n quaternion: THREE.Quaternion,\n velocity: THREE.Vector3,\n speed: number,\n {\n radius,\n radiusThickness,\n arc,\n }: { radius: number; radiusThickness: number; arc: number }\n) => {\n const u = Math.random() * (arc / 360);\n const v = Math.random();\n const randomizedDistanceRatio = Math.random();\n const theta = 2 * Math.PI * u;\n const phi = Math.acos(2 * v - 1);\n const sinPhi = Math.sin(phi);\n\n const xDirection = sinPhi * Math.cos(theta);\n const yDirection = sinPhi * Math.sin(theta);\n const zDirection = Math.cos(phi);\n const normalizedThickness = 1 - radiusThickness;\n\n position.x =\n radius * normalizedThickness * xDirection +\n radius * radiusThickness * randomizedDistanceRatio * xDirection;\n position.y =\n radius * normalizedThickness * yDirection +\n radius * radiusThickness * randomizedDistanceRatio * yDirection;\n position.z =\n radius * normalizedThickness * zDirection +\n radius * radiusThickness * randomizedDistanceRatio * zDirection;\n\n position.applyQuaternion(quaternion);\n\n const speedMultiplierByPosition = 1 / position.length();\n velocity.set(\n position.x * speedMultiplierByPosition * speed,\n position.y * speedMultiplierByPosition * speed,\n position.z * speedMultiplierByPosition * speed\n );\n velocity.applyQuaternion(quaternion);\n};\n\n/**\n * Calculates random position and velocity for particles emitted from a cone.\n *\n * Useful for directional particle effects like fire, smoke plumes, fountains,\n * or spray effects. The cone emits particles in a spreading pattern.\n *\n * @param position - Output vector for the particle's starting position\n * @param quaternion - Rotation to apply to the emission shape\n * @param velocity - Output vector for the particle's initial velocity\n * @param speed - Speed multiplier for the velocity\n * @param params - Cone configuration\n * @param params.radius - Base radius of the cone\n * @param params.radiusThickness - Controls emission from volume (1.0) vs shell (0.0)\n * @param params.arc - Arc angle in degrees (360 = full cone, 180 = half cone)\n * @param params.angle - Cone opening angle in degrees (default: 90)\n * Smaller values create tighter cones\n *\n * @remarks\n * - The cone emits from its base (circular area) outward\n * - Particles travel in a conical spread pattern\n * - `angle = 0`: Straight line (no spread)\n * - `angle = 90`: Wide cone\n * - Common for fire (10-30°), smoke (30-60°), explosions (60-90°)\n *\n * @see {@link Cone} - Configuration type for cone shape\n */\nexport const calculateRandomPositionAndVelocityOnCone = (\n position: THREE.Vector3,\n quaternion: THREE.Quaternion,\n velocity: THREE.Vector3,\n speed: number,\n {\n radius,\n radiusThickness,\n arc,\n angle = 90,\n }: {\n radius: number;\n radiusThickness: number;\n arc: number;\n angle?: number;\n }\n) => {\n const theta = 2 * Math.PI * Math.random() * (arc / 360);\n const randomizedDistanceRatio = Math.random();\n\n const xDirection = Math.cos(theta);\n const yDirection = Math.sin(theta);\n const normalizedThickness = 1 - radiusThickness;\n\n position.x =\n radius * normalizedThickness * xDirection +\n radius * radiusThickness * randomizedDistanceRatio * xDirection;\n position.y =\n radius * normalizedThickness * yDirection +\n radius * radiusThickness * randomizedDistanceRatio * yDirection;\n position.z = 0;\n\n position.applyQuaternion(quaternion);\n\n const positionLength = position.length();\n const normalizedAngle = Math.abs(\n (positionLength / radius) * THREE.MathUtils.degToRad(angle)\n );\n const sinNormalizedAngle = Math.sin(normalizedAngle);\n\n const speedMultiplierByPosition = 1 / positionLength;\n velocity.set(\n position.x * sinNormalizedAngle * speedMultiplierByPosition * speed,\n position.y * sinNormalizedAngle * speedMultiplierByPosition * speed,\n Math.cos(normalizedAngle) * speed\n );\n velocity.applyQuaternion(quaternion);\n};\n\n/**\n * Calculates random position and velocity for particles emitted from a box.\n *\n * Supports three emission modes: volume, shell (surface), and edges.\n * Useful for area-based effects like dust clouds, rain, or geometric patterns.\n *\n * @param position - Output vector for the particle's starting position\n * @param quaternion - Rotation to apply to the emission shape\n * @param velocity - Output vector for the particle's initial velocity\n * @param speed - Speed multiplier for the velocity\n * @param params - Box configuration\n * @param params.scale - Size of the box on each axis (width, height, depth)\n * @param params.emitFrom - Emission mode:\n * - `VOLUME`: Random positions throughout the entire box volume\n * - `SHELL`: Random positions on the 6 faces (surface)\n * - `EDGE`: Random positions along the 12 edges\n *\n * @remarks\n * - All particles emit with velocity along the +Z axis (forward)\n * - Box is centered at the origin before rotation\n * - VOLUME mode: Best for rain, snow, or volumetric clouds\n * - SHELL mode: Best for hollow effects or surface particles\n * - EDGE mode: Best for wireframe effects or particle outlines\n *\n * @see {@link Box} - Configuration type for box shape\n * @see {@link EmitFrom} - Emission mode enum\n */\nexport const calculateRandomPositionAndVelocityOnBox = (\n position: THREE.Vector3,\n quaternion: THREE.Quaternion,\n velocity: THREE.Vector3,\n speed: number,\n { scale, emitFrom }: { scale: Point3D; emitFrom: EmitFrom }\n) => {\n const _scale = scale as Required<Point3D>;\n switch (emitFrom) {\n case EmitFrom.VOLUME:\n position.x = Math.random() * _scale.x - _scale.x / 2;\n position.y = Math.random() * _scale.y - _scale.y / 2;\n position.z = Math.random() * _scale.z - _scale.z / 2;\n break;\n\n case EmitFrom.SHELL:\n const side = Math.floor(Math.random() * 6);\n const perpendicularAxis = side % 3;\n const shellResult = [];\n shellResult[perpendicularAxis] = side > 2 ? 1 : 0;\n shellResult[(perpendicularAxis + 1) % 3] = Math.random();\n shellResult[(perpendicularAxis + 2) % 3] = Math.random();\n position.x = shellResult[0] * _scale.x - _scale.x / 2;\n position.y = shellResult[1] * _scale.y - _scale.y / 2;\n position.z = shellResult[2] * _scale.z - _scale.z / 2;\n break;\n\n case EmitFrom.EDGE:\n const side2 = Math.floor(Math.random() * 6);\n const perpendicularAxis2 = side2 % 3;\n const edge = Math.floor(Math.random() * 4);\n const edgeResult = [];\n edgeResult[perpendicularAxis2] = side2 > 2 ? 1 : 0;\n edgeResult[(perpendicularAxis2 + 1) % 3] =\n edge < 2 ? Math.random() : edge - 2;\n edgeResult[(perpendicularAxis2 + 2) % 3] =\n edge < 2 ? edge : Math.random();\n position.x = edgeResult[0] * _scale.x - _scale.x / 2;\n position.y = edgeResult[1] * _scale.y - _scale.y / 2;\n position.z = edgeResult[2] * _scale.z - _scale.z / 2;\n break;\n }\n\n position.applyQuaternion(quaternion);\n\n velocity.set(0, 0, speed);\n velocity.applyQuaternion(quaternion);\n};\n\n/**\n * Calculates random position and velocity for particles emitted from a circle.\n *\n * Emits particles from a circular area or ring. Useful for ground impacts,\n * radial effects, magic circles, or any circular planar emission.\n *\n * @param position - Output vector for the particle's starting position\n * @param quaternion - Rotation to apply to the emission shape\n * @param velocity - Output vector for the particle's initial velocity\n * @param speed - Speed multiplier for the velocity\n * @param params - Circle configuration\n * @param params.radius - Radius of the circle\n * @param params.radiusThickness - Controls emission from area (1.0) vs edge (0.0)\n * @param params.arc - Arc angle in degrees (360 = full circle, 180 = semicircle)\n *\n * @remarks\n * - Circle lies in the XY plane by default (Z = 0)\n * - Particles emit along the +Z axis (perpendicular to circle)\n * - `radiusThickness = 1.0`: Filled circle (disc)\n * - `radiusThickness = 0.0`: Ring (circle edge only)\n * - Good for ground impact effects, teleport circles, or radial bursts\n *\n * @see {@link Circle} - Configuration type for circle shape\n */\nexport const calculateRandomPositionAndVelocityOnCircle = (\n position: THREE.Vector3,\n quaternion: THREE.Quaternion,\n velocity: THREE.Vector3,\n speed: number,\n {\n radius,\n radiusThickness,\n arc,\n }: { radius: number; radiusThickness: number; arc: number }\n) => {\n const theta = 2 * Math.PI * Math.random() * (arc / 360);\n const randomizedDistanceRatio = Math.random();\n\n const xDirection = Math.cos(theta);\n const yDirection = Math.sin(theta);\n const normalizedThickness = 1 - radiusThickness;\n\n position.x =\n radius * normalizedThickness * xDirection +\n radius * radiusThickness * randomizedDistanceRatio * xDirection;\n position.y =\n radius * normalizedThickness * yDirection +\n radius * radiusThickness * randomizedDistanceRatio * yDirection;\n position.z = 0;\n\n position.applyQuaternion(quaternion);\n\n const positionLength = position.length();\n const speedMultiplierByPosition = 1 / positionLength;\n velocity.set(\n position.x * speedMultiplierByPosition * speed,\n position.y * speedMultiplierByPosition * speed,\n 0\n );\n velocity.applyQuaternion(quaternion);\n};\n\n/**\n * Calculates random position and velocity for particles emitted from a rectangle.\n *\n * Emits particles from a rectangular planar area. Useful for rain on a surface,\n * screen-space effects, or any planar emission pattern.\n *\n * @param position - Output vector for the particle's starting position\n * @param quaternion - Rotation to apply to the emission shape\n * @param velocity - Output vector for the particle's initial velocity\n * @param speed - Speed multiplier for the velocity\n * @param params - Rectangle configuration\n * @param params.rotation - Local rotation of the rectangle (degrees) before\n * applying quaternion\n * @param params.scale - Size of the rectangle (width and height)\n *\n * @remarks\n * - Rectangle lies in the XY plane by default\n * - Particles emit along the +Z axis (perpendicular to rectangle)\n * - The rotation parameter allows tilting the rectangle before the main\n * quaternion rotation is applied\n * - Good for rain effects, screen particles, or planar area emissions\n *\n * @see {@link Rectangle} - Configuration type for rectangle shape\n */\nexport const calculateRandomPositionAndVelocityOnRectangle = (\n position: THREE.Vector3,\n quaternion: THREE.Quaternion,\n velocity: THREE.Vector3,\n speed: number,\n { rotation, scale }: { rotation: Point3D; scale: Point3D }\n) => {\n const _scale = scale as Required<Point3D>;\n const _rotation = rotation as Required<Point3D>;\n\n const xOffset = Math.random() * _scale.x - _scale.x / 2;\n const yOffset = Math.random() * _scale.y - _scale.y / 2;\n const rotationX = THREE.MathUtils.degToRad(_rotation.x);\n const rotationY = THREE.MathUtils.degToRad(_rotation.y);\n position.x = xOffset * Math.cos(rotationY);\n position.y = yOffset * Math.cos(rotationX);\n position.z = xOffset * Math.sin(rotationY) - yOffset * Math.sin(rotationX);\n\n position.applyQuaternion(quaternion);\n\n velocity.set(0, 0, speed);\n velocity.applyQuaternion(quaternion);\n};\n\n/**\n * Creates a solid white 1x1 texture for mesh particles.\n * Unlike the circle texture used by point/billboard renderers, mesh particles\n * need a neutral texture so the geometry shape is visible.\n * @returns {THREE.CanvasTexture | null} The generated texture or null if context fails.\n */\nexport const createDefaultMeshTexture = (): THREE.CanvasTexture | null => {\n try {\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const context = canvas.getContext('2d');\n if (context) {\n context.fillStyle = 'white';\n context.fillRect(0, 0, 1, 1);\n const texture = new THREE.CanvasTexture(canvas);\n texture.needsUpdate = true;\n return texture;\n }\n return null;\n } catch {\n return null;\n }\n};\n\n/**\n * Creates a default white circle texture using CanvasTexture.\n * @returns {THREE.CanvasTexture | null} The generated texture or null if context fails.\n */\nexport const createDefaultParticleTexture = (): THREE.CanvasTexture | null => {\n try {\n const canvas = document.createElement('canvas');\n const size = 64;\n canvas.width = size;\n canvas.height = size;\n const context = canvas.getContext('2d');\n if (context) {\n const centerX = size / 2;\n const centerY = size / 2;\n const radius = size / 2 - 2; // Small padding\n\n context.beginPath();\n context.arc(centerX, centerY, radius, 0, 2 * Math.PI, false);\n context.fillStyle = 'white';\n context.fill();\n const texture = new THREE.CanvasTexture(canvas);\n texture.needsUpdate = true;\n return texture;\n } else {\n // eslint-disable-next-line no-console\n console.warn(\n 'Could not get 2D context to generate default particle texture.'\n );\n return null;\n }\n } catch (error) {\n // Handle potential errors (e.g., document not available in non-browser env)\n // eslint-disable-next-line no-console\n console.warn('Error creating default particle texture:', error);\n return null;\n }\n};\n\nexport const isLifeTimeCurve = (\n value: Constant | RandomBetweenTwoConstants | LifetimeCurve\n): value is LifetimeCurve => {\n return typeof value !== 'number' && 'type' in value;\n};\n\nexport const getCurveFunctionFromConfig = (\n particleSystemId: number,\n lifetimeCurve: LifetimeCurve\n) => {\n if (lifetimeCurve.type === LifeTimeCurve.BEZIER) {\n return createBezierCurveFunction(\n particleSystemId,\n lifetimeCurve.bezierPoints\n ); // Bézier curve\n }\n\n if (lifetimeCurve.type === LifeTimeCurve.EASING) {\n return lifetimeCurve.curveFunction; // Easing curve\n }\n\n // Serialized (type-elided) configs: infer from the present payload. The\n // shared JSON examples omit `type` because the editor converters normally\n // fill it in; the runtime accepts both forms.\n const raw = lifetimeCurve as unknown as {\n bezierPoints?: unknown;\n curveFunction?: unknown;\n };\n if (Array.isArray(raw.bezierPoints)) {\n return createBezierCurveFunction(\n particleSystemId,\n raw.bezierPoints as Parameters<typeof createBezierCurveFunction>[1]\n );\n }\n if (typeof raw.curveFunction === 'function') {\n return raw.curveFunction as (t: number) => number;\n }\n\n throw new Error(`Unsupported value type: ${lifetimeCurve}`);\n};\n\nexport const calculateValue = (\n particleSystemId: number,\n value: Constant | RandomBetweenTwoConstants | LifetimeCurve,\n time: number = 0\n): number => {\n if (typeof value === 'number') {\n return value; // Constant value\n }\n\n if ('min' in value && 'max' in value) {\n if (value.min === value.max) {\n return value.min ?? 0; // Constant value\n }\n return THREE.MathUtils.randFloat(value.min ?? 0, value.max ?? 1); // Random range\n }\n\n const lifetimeCurve = value as LifetimeCurve;\n return (\n getCurveFunctionFromConfig(particleSystemId, lifetimeCurve)(time) *\n (lifetimeCurve.scale ?? 1)\n );\n};\n","import * as THREE from 'three';\n\nimport {\n SCALAR_STRIDE,\n S_SIZE,\n S_ROTATION,\n S_COLOR_R,\n S_COLOR_G,\n S_COLOR_B,\n S_COLOR_A,\n} from './three-particles-constants.js';\nimport { calculateValue } from './three-particles-utils.js';\nimport {\n GeneralData,\n MappedAttributes,\n NormalizedParticleSystemConfig,\n} from './types.js';\n\nconst noiseInput = new THREE.Vector3(0, 0, 0);\nconst orbitalEuler = new THREE.Euler();\n\n/**\n * Applies all active modifiers to a single particle during the update cycle.\n *\n * This function handles the animation and modification of particle properties over its lifetime,\n * including velocity (linear and orbital), size, opacity, color, rotation, and noise-based effects.\n * It is called once per particle per frame by the {@link updateParticleSystems} function.\n *\n * @param params - Configuration object containing:\n * @param params.delta - Time elapsed since the last frame in seconds. Used for velocity and rotation calculations.\n * @param params.generalData - Internal particle system state and cached values.\n * @param params.normalizedConfig - The normalized particle system configuration with all modifiers.\n * @param params.attributes - Three.js buffer attributes for position, size, rotation, and color.\n * @param params.particleLifetimePercentage - Normalized lifetime of the particle (0.0 to 1.0).\n * - 0.0 = particle just born\n * - 1.0 = particle at end of life\n * @param params.particleIndex - Index of the particle in the buffer arrays.\n *\n * @remarks\n * The function modifies the following particle properties based on configuration:\n *\n * - **Linear Velocity**: Moves particles in a straight line (velocityOverLifetime.linear)\n * - **Orbital Velocity**: Rotates particles around their emission point (velocityOverLifetime.orbital)\n * - **Size Over Lifetime**: Scales particle size based on lifetime curve (sizeOverLifetime)\n * - **Opacity Over Lifetime**: Fades particles in/out based on lifetime curve (opacityOverLifetime)\n * - **Color Over Lifetime**: Animates RGB channels independently based on lifetime curves (colorOverLifetime)\n * - **Rotation Over Lifetime**: Rotates particles around their center (rotationOverLifetime)\n * - **Noise**: Adds organic, turbulent motion to position, rotation, and size (noise)\n *\n * Each modifier only runs if it's active in the configuration, optimizing performance for simple effects.\n *\n * @example\n * ```typescript\n * // This function is called internally by updateParticleSystems\n * // You typically don't need to call it directly\n *\n * // However, understanding its behavior helps configure particle systems:\n * const config = {\n * sizeOverLifetime: {\n * isActive: true,\n * lifetimeCurve: {\n * type: 'BEZIER',\n * bezierPoints: [\n * { x: 0, y: 0, percentage: 0 }, // Start at 0% size\n * { x: 0.5, y: 1, percentage: 0.5 }, // Grow to 100% at midlife\n * { x: 1, y: 0, percentage: 1 } // Shrink to 0% at end\n * ]\n * }\n * },\n * opacityOverLifetime: {\n * isActive: true,\n * lifetimeCurve: {\n * type: 'EASING',\n * curveFunction: 'easeOutQuad'\n * }\n * }\n * };\n * ```\n *\n * @see {@link updateParticleSystems} - Calls this function for each active particle\n * @see {@link VelocityOverLifetime} - Configuration for velocity modifiers\n * @see {@link NoiseConfig} - Configuration for noise-based effects\n */\nexport const applyModifiers = ({\n delta,\n generalData,\n normalizedConfig,\n attributes,\n scalarArray,\n particleLifetimePercentage,\n particleIndex,\n updateFlags,\n}: {\n delta: number;\n generalData: GeneralData;\n normalizedConfig: NormalizedParticleSystemConfig;\n attributes: MappedAttributes;\n scalarArray: Float32Array;\n particleLifetimePercentage: number;\n particleIndex: number;\n /**\n * Optional aggregation target for attribute dirty flags. When provided,\n * `position`/`quat` are set to `true` here instead of writing\n * `attribute.needsUpdate` — the caller flushes once per frame rather than\n * bumping the attribute version once per particle.\n */\n updateFlags?: { position: boolean; quat: boolean };\n}) => {\n const {\n particleSystemId,\n startValues,\n lifetimeValues,\n linearVelocityData,\n orbitalVelocityData,\n noise,\n modifierCurves,\n } = generalData;\n\n const positionIndex = particleIndex * 3;\n const positionArr = attributes.position.array;\n const base = particleIndex * SCALAR_STRIDE;\n\n if (linearVelocityData) {\n const { speed, valueModifiers } = linearVelocityData[particleIndex];\n\n const normalizedXSpeed = valueModifiers.x\n ? valueModifiers.x(particleLifetimePercentage)\n : speed.x;\n\n const normalizedYSpeed = valueModifiers.y\n ? valueModifiers.y(particleLifetimePercentage)\n : speed.y;\n\n const normalizedZSpeed = valueModifiers.z\n ? valueModifiers.z(particleLifetimePercentage)\n : speed.z;\n\n positionArr[positionIndex] += normalizedXSpeed * delta;\n positionArr[positionIndex + 1] += normalizedYSpeed * delta;\n positionArr[positionIndex + 2] += normalizedZSpeed * delta;\n\n if (updateFlags) updateFlags.position = true;\n else attributes.position.needsUpdate = true;\n }\n\n if (orbitalVelocityData) {\n const { speed, positionOffset, valueModifiers } =\n orbitalVelocityData[particleIndex];\n\n positionArr[positionIndex] -= positionOffset.x;\n positionArr[positionIndex + 1] -= positionOffset.y;\n positionArr[positionIndex + 2] -= positionOffset.z;\n\n const normalizedXSpeed = valueModifiers.x\n ? valueModifiers.x(particleLifetimePercentage)\n : speed.x;\n\n const normalizedYSpeed = valueModifiers.y\n ? valueModifiers.y(particleLifetimePercentage)\n : speed.y;\n\n const normalizedZSpeed = valueModifiers.z\n ? valueModifiers.z(particleLifetimePercentage)\n : speed.z;\n\n orbitalEuler.set(\n normalizedXSpeed * delta,\n normalizedZSpeed * delta,\n normalizedYSpeed * delta\n );\n positionOffset.applyEuler(orbitalEuler);\n\n positionArr[positionIndex] += positionOffset.x;\n positionArr[positionIndex + 1] += positionOffset.y;\n positionArr[positionIndex + 2] += positionOffset.z;\n\n if (updateFlags) updateFlags.position = true;\n else attributes.position.needsUpdate = true;\n }\n\n // Size/opacity/color prefer the curve functions pre-resolved at system\n // creation (see resolveModifierCurves) — calculateValue re-resolves the\n // curve on every call, which is too expensive per particle per frame.\n // The calculateValue fallback covers constant / random-range values and\n // externally-constructed generalData without modifierCurves.\n if (normalizedConfig.sizeOverLifetime.isActive) {\n const multiplier = modifierCurves?.size\n ? modifierCurves.size(particleLifetimePercentage)\n : calculateValue(\n particleSystemId,\n normalizedConfig.sizeOverLifetime.lifetimeCurve,\n particleLifetimePercentage\n );\n scalarArray[base + S_SIZE] =\n startValues.startSize[particleIndex] * multiplier;\n }\n\n if (normalizedConfig.opacityOverLifetime.isActive) {\n const multiplier = modifierCurves?.opacity\n ? modifierCurves.opacity(particleLifetimePercentage)\n : calculateValue(\n particleSystemId,\n normalizedConfig.opacityOverLifetime.lifetimeCurve,\n particleLifetimePercentage\n );\n scalarArray[base + S_COLOR_A] =\n startValues.startOpacity[particleIndex] * multiplier;\n }\n\n if (normalizedConfig.colorOverLifetime.isActive) {\n const rMultiplier = modifierCurves?.colorR\n ? modifierCurves.colorR(particleLifetimePercentage)\n : calculateValue(\n particleSystemId,\n normalizedConfig.colorOverLifetime.r,\n particleLifetimePercentage\n );\n const gMultiplier = modifierCurves?.colorG\n ? modifierCurves.colorG(particleLifetimePercentage)\n : calculateValue(\n particleSystemId,\n normalizedConfig.colorOverLifetime.g,\n particleLifetimePercentage\n );\n const bMultiplier = modifierCurves?.colorB\n ? modifierCurves.colorB(particleLifetimePercentage)\n : calculateValue(\n particleSystemId,\n normalizedConfig.colorOverLifetime.b,\n particleLifetimePercentage\n );\n\n scalarArray[base + S_COLOR_R] =\n startValues.startColorR[particleIndex] * rMultiplier;\n scalarArray[base + S_COLOR_G] =\n startValues.startColorG[particleIndex] * gMultiplier;\n scalarArray[base + S_COLOR_B] =\n startValues.startColorB[particleIndex] * bMultiplier;\n }\n\n if (lifetimeValues.rotationOverLifetime) {\n scalarArray[base + S_ROTATION] +=\n lifetimeValues.rotationOverLifetime[particleIndex] * delta * 0.02;\n }\n\n if (noise.isActive) {\n const {\n sampler,\n strength,\n noisePower,\n offsets,\n positionAmount,\n rotationAmount,\n sizeAmount,\n } = noise;\n let noiseOnPosition;\n\n const noisePosition =\n (particleLifetimePercentage + (offsets ? offsets[particleIndex] : 0)) *\n 10 *\n strength;\n\n noiseInput.set(noisePosition, 0, 0);\n noiseOnPosition = sampler!.get3(noiseInput);\n positionArr[positionIndex] += noiseOnPosition * noisePower * positionAmount;\n\n if (rotationAmount !== 0) {\n scalarArray[base + S_ROTATION] +=\n noiseOnPosition * noisePower * rotationAmount;\n }\n\n if (sizeAmount !== 0) {\n scalarArray[base + S_SIZE] += noiseOnPosition * noisePower * sizeAmount;\n }\n\n noiseInput.set(noisePosition, noisePosition, 0);\n noiseOnPosition = sampler!.get3(noiseInput);\n positionArr[positionIndex + 1] +=\n noiseOnPosition * noisePower * positionAmount;\n\n noiseInput.set(noisePosition, noisePosition, noisePosition);\n noiseOnPosition = sampler!.get3(noiseInput);\n positionArr[positionIndex + 2] +=\n noiseOnPosition * noisePower * positionAmount;\n\n if (updateFlags) updateFlags.position = true;\n else attributes.position.needsUpdate = true;\n }\n\n // Sync packed quaternion vec4 from scalar rotation for mesh particles.\n // This runs after noise so the quaternion reflects the final rotation value.\n if (attributes.quat) {\n const rotZ = scalarArray[base + S_ROTATION];\n const halfZ = rotZ * 0.5;\n const qi = particleIndex * 4;\n attributes.quat.array[qi] = 0;\n attributes.quat.array[qi + 1] = 0;\n attributes.quat.array[qi + 2] = Math.sin(halfZ);\n attributes.quat.array[qi + 3] = Math.cos(halfZ);\n if (updateFlags) updateFlags.quat = true;\n else attributes.quat.needsUpdate = true;\n }\n};\n","import { SimulationBackend } from './three-particles-enums.js';\n\n/**\n * Checks whether the given renderer supports GPU compute dispatches.\n *\n * Uses duck-typing: a renderer is considered WebGPU-capable when it exposes\n * a `.compute()` method and a `.hasFeature()` method (both present on\n * `THREE.WebGPURenderer` but absent from `THREE.WebGLRenderer`).\n *\n * @param renderer - Any Three.js renderer instance.\n * @returns `true` when the renderer supports compute shaders.\n */\nexport function isComputeCapableRenderer(renderer: unknown): boolean {\n return (\n renderer !== null &&\n renderer !== undefined &&\n typeof renderer === 'object' &&\n 'compute' in renderer &&\n typeof (renderer as Record<string, unknown>).compute === 'function' &&\n 'hasFeature' in renderer &&\n typeof (renderer as Record<string, unknown>).hasFeature === 'function'\n );\n}\n\n/**\n * Resolves the effective simulation backend based on the user's preference\n * and the capabilities of the provided renderer.\n *\n * | Preference | WebGPURenderer | WebGLRenderer |\n * |------------|---------------|---------------|\n * | `AUTO` | `GPU` | `CPU` |\n * | `CPU` | `CPU` | `CPU` |\n * | `GPU` | `GPU` | `CPU` (fallback) |\n *\n * @param renderer - The Three.js renderer instance used for rendering.\n * @param preference - The user-specified simulation backend preference.\n * @returns The resolved {@link SimulationBackend} (`CPU` or `GPU`).\n */\nexport function resolveSimulationBackend(\n renderer: unknown,\n preference: SimulationBackend = SimulationBackend.AUTO\n): SimulationBackend.CPU | SimulationBackend.GPU {\n const gpuCapable = isComputeCapableRenderer(renderer);\n\n if (preference === SimulationBackend.CPU) {\n return SimulationBackend.CPU;\n }\n\n if (preference === SimulationBackend.GPU) {\n return gpuCapable ? SimulationBackend.GPU : SimulationBackend.CPU;\n }\n\n // AUTO: use GPU when available\n return gpuCapable ? SimulationBackend.GPU : SimulationBackend.CPU;\n}\n","import { ObjectUtils } from '@newkrok/three-utils';\nimport * as THREE from 'three';\nimport { StorageBufferAttribute } from 'three/webgpu';\nimport { FBM } from 'three-noise/build/three-noise.module.js';\nimport { rgbSRGBToLinear, sRGBToLinear } from './color-utils.js';\nimport InstancedParticleFragmentShader from './shaders/instanced-particle-fragment-shader.glsl.js';\nimport InstancedParticleVertexShader from './shaders/instanced-particle-vertex-shader.glsl.js';\nimport MeshParticleFragmentShader from './shaders/mesh-particle-fragment-shader.glsl.js';\nimport MeshParticleVertexShader from './shaders/mesh-particle-vertex-shader.glsl.js';\nimport ParticleSystemFragmentShader from './shaders/particle-system-fragment-shader.glsl.js';\nimport ParticleSystemVertexShader from './shaders/particle-system-vertex-shader.glsl.js';\nimport TrailFragmentShader from './shaders/trail-fragment-shader.glsl.js';\nimport TrailVertexShader from './shaders/trail-vertex-shader.glsl.js';\nimport { removeBezierCurveFunction } from './three-particles-bezier.js';\nimport { applyCollisionPlanes } from './three-particles-collision.js';\nimport {\n SCALAR_STRIDE,\n S_IS_ACTIVE,\n S_LIFETIME,\n S_START_LIFETIME,\n S_START_FRAME,\n S_SIZE,\n S_ROTATION,\n S_COLOR_R,\n S_COLOR_G,\n S_COLOR_B,\n S_COLOR_A,\n} from './three-particles-constants.js';\nimport {\n CollisionPlaneMode,\n EmitFrom,\n ForceFieldFalloff,\n ForceFieldType,\n LifeTimeCurve,\n RendererType,\n Shape,\n SimulationBackend,\n SimulationSpace,\n SubEmitterTrigger,\n TimeMode,\n} from './three-particles-enums';\nimport { applyForceFields } from './three-particles-forces.js';\nimport { applyModifiers } from './three-particles-modifiers.js';\nimport { isComputeCapableRenderer } from './three-particles-renderer-detect.js';\nimport {\n calculateRandomPositionAndVelocityOnBox,\n calculateRandomPositionAndVelocityOnCircle,\n calculateRandomPositionAndVelocityOnCone,\n calculateRandomPositionAndVelocityOnRectangle,\n calculateRandomPositionAndVelocityOnSphere,\n calculateValue,\n getCurveFunctionFromConfig,\n isLifeTimeCurve,\n createDefaultMeshTexture,\n createDefaultParticleTexture,\n} from './three-particles-utils.js';\n\n/**\n * `resolveWebGPUEffectiveRendererType` — canonical mapping between the four\n * requested `rendererType` values and the four effective GPU render paths\n * (native runtime classes in parentheses).\n *\n * requested POINTS -> effective POINTS (billboard quad + `THREE.Points`).\n * POINTS IS a supported runtime class in this build: the billboard quad\n * is drawn as a non-instanced `THREE.Points`; the TSL point material uses\n * `pointUV` (r186 provides it for `PointsNodeMaterial`).\n * requested INSTANCED -> effective INSTANCED (quad/box + `THREE.Mesh` with\n * `InstancedBufferGeometry`).\n * requested TRAIL -> effective TRAIL (ribbon strip + `THREE.Mesh`).\n * requested MESH -> effective MESH (mesh/reused geometry +\n * `THREE.Mesh`).\n *\n * A missing / unknown request resolves to POINTS because `POINTS` is the\n * default value of `renderer.rendererType` in the merged default config.\n */\nexport function resolveWebGPUEffectiveRendererType(\n requested: RendererType | string | undefined\n): RendererType {\n switch (requested) {\n case RendererType.INSTANCED:\n return RendererType.INSTANCED;\n case RendererType.TRAIL:\n return RendererType.TRAIL;\n case RendererType.MESH:\n return RendererType.MESH;\n case RendererType.POINTS:\n default:\n return RendererType.POINTS;\n }\n}\n\nimport {\n CollisionPlaneConfig,\n Constant,\n CurveFunction,\n CycleData,\n ForceFieldConfig,\n GeneralData,\n LifetimeCurve,\n MappedAttributes,\n NormalizedCollisionPlaneConfig,\n NormalizedForceFieldConfig,\n NormalizedParticleSystemConfig,\n ParticleSystem,\n ParticleSystemConfig,\n ParticleSystemInstance,\n Point3D,\n RandomBetweenTwoConstants,\n ShapeConfig,\n SubEmitterConfig,\n MeshConfig,\n TrailConfig,\n} from './types.js';\n\nexport * from './types.js';\n\nconst normalizeTrailCurve = (\n curve: LifetimeCurve | undefined,\n defaultCurve: LifetimeCurve\n): LifetimeCurve => {\n if (!curve) return defaultCurve;\n const raw = curve as Record<string, unknown>;\n if (!raw.type && Array.isArray(raw.bezierPoints)) {\n return { type: LifeTimeCurve.BEZIER, ...raw } as LifetimeCurve;\n }\n return curve;\n};\n\n// Re-export so downstream consumers can access stride constants from the main module.\nexport {\n SCALAR_STRIDE,\n S_IS_ACTIVE,\n S_LIFETIME,\n S_START_LIFETIME,\n S_START_FRAME,\n S_SIZE,\n S_ROTATION,\n S_COLOR_R,\n S_COLOR_G,\n S_COLOR_B,\n S_COLOR_A,\n} from './three-particles-constants.js';\n\nlet _particleSystemId = 0;\nlet createdParticleSystems: Array<ParticleSystemInstance> = [];\n\n// ????????? GPU Compute Uniform Helpers ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????\n// Centralise the `as unknown as` casts for setting TSL uniform values.\n// The TSL uniform nodes expose `.value` at runtime but their TypeScript\n// type (`ShaderNodeObject<Node>`) does not declare it.\n\n/** Sets a TSL float uniform's value. */\nconst setUniformFloat = (u: unknown, v: number): void => {\n (u as { value: number }).value = v;\n};\n\n/** Sets a TSL vec3 uniform's value. */\nconst setUniformVec3 = (u: unknown, x: number, y: number, z: number): void => {\n (\n u as { value: { set: (x: number, y: number, z: number) => void } }\n ).value.set(x, y, z);\n};\n\n// ????????? WebGPU TSL Material Support (opt-in via registerTSLMaterialFactory) ???????????????\n\ntype TSLMaterialFactory = {\n createTSLParticleMaterial: (\n rendererType: RendererType,\n sharedUniforms: Record<string, { value: unknown }>,\n rendererConfig: {\n transparent: boolean;\n blending: THREE.Blending;\n depthTest: boolean;\n depthWrite: boolean;\n },\n gpuCompute?: boolean\n ) => THREE.Material;\n createTSLTrailMaterial: (\n trailUniforms: Record<string, { value: unknown }>,\n rendererConfig: {\n transparent: boolean;\n blending: THREE.Blending;\n depthTest: boolean;\n depthWrite: boolean;\n }\n ) => THREE.Material;\n // GPU compute functions ??? use opaque types to avoid pulling WebGPU/TSL\n // types into the DTS output.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n createComputePipeline?: (...args: any[]) => any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n writeParticleToModifierBuffers?: (...args: any[]) => void;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n deactivateParticleInModifierBuffers?: (...args: any[]) => void;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n flushEmitQueue?: (...args: any[]) => number;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n registerCurveDataLength?: (...args: any[]) => void;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n encodeForceFieldsForGPU?: (...args: any[]) => Float32Array;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n encodeCollisionPlanesForGPU?: (...args: any[]) => Float32Array;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n createSubEmitterFifoAttribute?: (...args: any[]) => any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n createSubEmitterInitUpdate?: (...args: any[]) => any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n createTrailRibbonUpdate?: (...args: any[]) => any;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n encodeShapeEmitParams?: (...args: any[]) => any;\n};\n\nlet _tslMaterialFactory: TSLMaterialFactory | null = null;\nlet _rendererBackendIsGPU = true;\n/** One-shot note that the serialized `'CPU'` preference maps to the GPU kernel. */\nlet _cpuPreferenceWarned = false;\nconst _cpuPreferencePreferenceWarn = (): void => {\n _cpuPreferenceWarned = true;\n // eslint-disable-next-line no-console\n console.warn(\n \"three-particles: simulationBackend 'CPU' maps to the GPU kernel in 4.0.0 (GPU-only build).\"\n );\n};\nconst _rendererBackendIsWebGPU = (): boolean => _rendererBackendIsGPU;\n\n/**\n * Registers the TSL (Three Shading Language) material factory for WebGPU support.\n *\n * Call this **once** before creating any particle systems that use WebGPU rendering.\n * The factory functions are imported from the `@cyberluke/three-particles/webgpu` sub-module.\n *\n * When registered, all particle systems will use TSL-based `NodeMaterial` (compiles to WGSL)\n * instead of GLSL `ShaderMaterial`. If the factory also includes the GPU compute functions\n * (`createComputePipeline`, `writeParticleToModifierBuffers`, etc.), particle systems with\n * `simulationBackend: 'AUTO'` or `'GPU'` will run physics and modifiers on the GPU.\n *\n * @param factory - Object containing TSL material creators and optional GPU compute helpers.\n *\n * @example\n * ```typescript\n * import { registerTSLMaterialFactory } from '@cyberluke/three-particles';\n * import {\n * createTSLParticleMaterial,\n * createTSLTrailMaterial,\n * createComputePipeline,\n * writeParticleToModifierBuffers,\n * deactivateParticleInModifierBuffers,\n * flushEmitQueue,\n * registerCurveDataLength,\n * encodeForceFieldsForGPU,\n * } from '@cyberluke/three-particles/webgpu';\n *\n * registerTSLMaterialFactory({\n * createTSLParticleMaterial,\n * createTSLTrailMaterial,\n * createComputePipeline,\n * writeParticleToModifierBuffers,\n * deactivateParticleInModifierBuffers,\n * flushEmitQueue,\n * registerCurveDataLength,\n * encodeForceFieldsForGPU,\n * });\n * ```\n */\nexport const registerTSLMaterialFactory = (\n factory: TSLMaterialFactory,\n options?: { renderer?: unknown }\n): boolean => {\n // When a renderer is provided, verify it can actually run TSL materials +\n // compute dispatches. Registering the factory alongside a plain\n // WebGLRenderer would produce NodeMaterials and a compute pipeline that\n // can never be dispatched.\n if (\n options &&\n 'renderer' in options &&\n !isComputeCapableRenderer(options.renderer)\n ) {\n // eslint-disable-next-line no-console\n console.warn(\n 'three-particles: registerTSLMaterialFactory skipped ??? the provided ' +\n 'renderer does not support compute dispatches (expected ' +\n 'THREE.WebGPURenderer). Particle systems will use the CPU/GLSL path.'\n );\n return false;\n }\n _tslMaterialFactory = factory;\n if (options && \"renderer\" in options) {\n _rendererBackendIsGPU = !!(options.renderer as { backend?: { isWebGPUBackend?: boolean } })\n ?.backend?.isWebGPUBackend;\n } else {\n _rendererBackendIsGPU = true;\n }\n return true;\n};\n\n// Pre-allocated objects for updateParticleSystemInstance to avoid GC pressure\nconst _subEmitterPosition = new THREE.Vector3();\nconst _subLocalPosition = new THREE.Vector3();\nconst _shadowOrbitalEuler = new THREE.Euler(0, 0, 0, 'XYZ');\nconst _lastWorldPositionSnapshot = new THREE.Vector3();\n// Force field local-space conversion helpers (reused across frames)\nconst _localForceFieldPos = new THREE.Vector3();\nconst _localForceFieldDir = new THREE.Vector3();\nconst _inverseQuat = new THREE.Quaternion();\n\n// ─── §10 TSL-uniform boundary normalization (single source of truth) ──────\n// The TSL material factory is the only real material path in the v4 GPU-only\n// build, so every value crossing into it must already be exact. These module\n// helpers implement the canonical shapes; the first mismatch throws one named\n// error and construction stops immediately (no empty / vague messages).\n\n/** Throw the first fatal, named (never empty) normalization error. */\nexport const assertNamed = (cond: unknown, message: string): void => {\n if (!cond) {\n throw new Error(`three-particles: ${message}`);\n }\n};\n\n/**\n * Canonical `Vector2` input: `THREE.Vector2 | [x,y] | [u,v] | {x,y} | {u,v}`\n * (or undefined/null => fallback). Anything else throws a labeled error.\n */\nexport const normalizeVector2Value = (\n raw: unknown,\n fallback: [number, number],\n label: string\n): THREE.Vector2 => {\n if (raw === undefined || raw === null) {\n return new THREE.Vector2(fallback[0], fallback[1]);\n }\n if (raw instanceof THREE.Vector2) return raw;\n let n1: number | undefined;\n let n2: number | undefined;\n if (Array.isArray(raw)) {\n n1 = Number((raw as number[])[0]);\n n2 = Number((raw as number[])[1]);\n } else if (typeof raw === \"object\") {\n const o = raw as { x?: number; y?: number; u?: number; v?: number };\n n1 = o.x !== undefined ? Number(o.x) : o.u !== undefined ? Number(o.u) : undefined;\n n2 = o.y !== undefined ? Number(o.y) : o.v !== undefined ? Number(o.v) : undefined;\n }\n assertNamed(\n n1 !== undefined && n2 !== undefined && Number.isFinite(n1) && Number.isFinite(n2),\n `${label} must be one of: Vector2, [x,y], [u,v], {x,y} or {u,v}`\n );\n return new THREE.Vector2(n1 as number, n2 as number);\n};\n\n/** Canonical map slot: `null` (no map -> white dummy in the material) or a\n * texture object with `.image`. Anything else throws a labeled error. */\nexport const normalizeTextureValue = (\n raw: unknown,\n label: string\n): THREE.Texture | null => {\n if (raw === undefined || raw === null) return null;\n assertNamed(\n typeof raw === \"object\" && \"image\" in (raw as object),\n `${label} must be null or a texture object with .image (got ${String(raw)})`\n );\n return raw as THREE.Texture;\n};\n\n/** `null` (absent) or a texture object with `.image` — nothing else. */\nexport const normalizeDepthTextureValue = (raw: unknown, label: string): THREE.Texture | null => {\n if (raw === undefined || raw === null) return null;\n assertNamed(\n typeof raw === \"object\" && \"image\" in (raw as object),\n `${label} must be a texture object with .image when set (got ${String(raw)})`\n );\n return raw as THREE.Texture;\n};\n\n/**\n * Background color from serialized data: `{r,g,b,a?}` object, `0x` number,\n * `#rgb`/`#rrggbb` string, or `[r,g,b]` array -> `Vector3`.\n */\nexport const normalizeBackgroundToVector3 = (\n raw: unknown,\n label: string\n): THREE.Vector3 => {\n if (raw === undefined || raw === null) return new THREE.Vector3(1, 1, 1);\n if (typeof raw === \"number\") {\n const c = new THREE.Color(raw);\n return new THREE.Vector3(c.r, c.g, c.b);\n }\n if (typeof raw === \"string\") {\n const s = raw.trim();\n const c = new THREE.Color(s.startsWith(\"#\") ? s : `#${s}`);\n assertNamed(\n Number.isFinite(c.r) && Number.isFinite(c.g) && Number.isFinite(c.b),\n `${label} is not a valid hex color string`\n );\n return new THREE.Vector3(c.r, c.g, c.b);\n }\n if (Array.isArray(raw)) {\n const [r, g, b] = raw as number[];\n assertNamed(\n Number.isFinite(r) && Number.isFinite(g) && Number.isFinite(b),\n `${label} array must contain three finite numbers`\n );\n return new THREE.Vector3(r, g, b);\n }\n const o = raw as { r?: number; g?: number; b?: number };\n assertNamed(\n Number.isFinite(Number(o.r)) && Number.isFinite(Number(o.g)) && Number.isFinite(Number(o.b)),\n `${label} object must provide finite r/g/b`\n );\n return new THREE.Vector3(Number(o.r), Number(o.g), Number(o.b));\n};\n\n/**\n * Compares two typed-array slices for value equality.\n * Used to gate GPU buffer `needsUpdate` flagging so we only re-upload when\n * the encoded data actually changed. See the force-field / collision-plane\n * upload block in `updateParticleSystemInstance` for the reasoning.\n */\nconst arraySlicesEqual = (\n a: Float32Array,\n aOffset: number,\n b: Float32Array,\n bOffset: number,\n length: number\n): boolean => {\n for (let i = 0; i < length; i++) {\n if (a[aOffset + i] !== b[bOffset + i]) return false;\n }\n return true;\n};\nlet _localForceFields: Array<NormalizedForceFieldConfig> = [];\n// Collision plane local-space conversion helpers (reused across frames)\nconst _localCollisionPlanePos = new THREE.Vector3();\nconst _localCollisionPlaneNormal = new THREE.Vector3();\nlet _localCollisionPlanes: Array<NormalizedCollisionPlaneConfig> = [];\n// Trail ribbon helpers (reused across frames to avoid allocations)\nconst _trailDir = new THREE.Vector3();\nconst _trailPerp = new THREE.Vector3();\nconst _trailToCam = new THREE.Vector3();\nconst _distanceStep = { x: 0, y: 0, z: 0 };\nconst _tempPosition = { x: 0, y: 0, z: 0 };\n// Aggregated needsUpdate flags filled by applyModifiers ??? the attribute\n// version counter is bumped once per frame instead of once per particle.\nconst _modifierUpdateFlags = { position: false, quat: false };\nconst _modifierParams = {\n delta: 0,\n generalData: null as unknown as GeneralData,\n normalizedConfig: null as unknown as NormalizedParticleSystemConfig,\n attributes: null as unknown as MappedAttributes,\n scalarArray: null as unknown as Float32Array,\n particleLifetimePercentage: 0,\n particleIndex: 0,\n updateFlags: _modifierUpdateFlags,\n};\n// Reusable parameter objects for the per-particle force-field / collision\n// hot loops (avoids one or two object allocations per particle per frame).\nconst _forceFieldParams = {\n particleSystemId: 0,\n forceFields: null as unknown as Array<NormalizedForceFieldConfig>,\n velocity: null as unknown as THREE.Vector3,\n positionArr: null as unknown as THREE.TypedArray,\n positionIndex: 0,\n delta: 0,\n systemLifetimePercentage: 0,\n};\nconst _collisionParams = {\n collisionPlanes: null as unknown as Array<NormalizedCollisionPlaneConfig>,\n velocity: null as unknown as THREE.Vector3,\n positionArr: null as unknown as THREE.TypedArray,\n positionIndex: 0,\n scalarArr: null as unknown as Float32Array,\n scalarBase: 0,\n deactivateParticle: null as unknown as (particleIndex: number) => void,\n particleIndex: 0,\n};\n// Scratch vector for onBeforeRender viewport queries (avoids a Vector2\n// allocation every rendered frame).\nconst _viewportSize = new THREE.Vector2();\n// Timestamp of the frame currently being processed by\n// updateParticleSystemInstance ??? read by the per-system killParticle\n// callbacks so they don't need a per-frame closure.\nlet _frameNow = 0;\n\n/**\n * Converts a plain {x, y, z} object to a THREE.Vector3, using the fallback if undefined.\n */\nconst toVector3 = (\n v: { x?: number; y?: number; z?: number } | undefined,\n fallback: THREE.Vector3\n): THREE.Vector3 =>\n v ? new THREE.Vector3(v.x ?? 0, v.y ?? 0, v.z ?? 0) : fallback.clone();\n\n/**\n * Normalizes raw force field configs into the internal representation with THREE.Vector3 fields.\n */\nconst normalizeForceFields = (\n rawForceFields: Array<ForceFieldConfig> | undefined\n): Array<NormalizedForceFieldConfig> =>\n (rawForceFields ?? []).map((ff: ForceFieldConfig) => ({\n isActive: ff.isActive ?? true,\n type: ff.type ?? ForceFieldType.POINT,\n position: toVector3(ff.position, new THREE.Vector3(0, 0, 0)),\n direction: toVector3(ff.direction, new THREE.Vector3(0, 1, 0)).normalize(),\n strength: ff.strength ?? 1,\n range: Math.max(0, ff.range ?? Infinity),\n falloff: ff.falloff ?? ForceFieldFalloff.LINEAR,\n }));\n\n/**\n * Normalizes raw collision plane configs into the internal representation with THREE.Vector3 fields.\n */\nconst normalizeCollisionPlanes = (\n rawPlanes: Array<CollisionPlaneConfig> | undefined\n): Array<NormalizedCollisionPlaneConfig> =>\n (rawPlanes ?? []).map((cp: CollisionPlaneConfig) => ({\n isActive: cp.isActive ?? true,\n position: toVector3(cp.position, new THREE.Vector3(0, 0, 0)),\n normal: toVector3(cp.normal, new THREE.Vector3(0, 1, 0)).normalize(),\n mode: cp.mode ?? CollisionPlaneMode.KILL,\n dampen: Math.max(0, Math.min(1, cp.dampen ?? 0.5)),\n lifetimeLoss: Math.max(0, Math.min(1, cp.lifetimeLoss ?? 0)),\n }));\n\n/**\n * Mapping of blending mode string identifiers to Three.js blending constants.\n *\n * Used for converting serialized particle system configurations (e.g., from JSON)\n * to actual Three.js blending mode constants.\n *\n * @example\n * ```typescript\n * import { blendingMap } from '@cyberluke/three-particles';\n *\n * // Convert string to Three.js constant\n * const blending = blendingMap['THREE.AdditiveBlending'];\n * // blending === THREE.AdditiveBlending\n * ```\n */\nexport const blendingMap = {\n 'THREE.NoBlending': THREE.NoBlending,\n 'THREE.NormalBlending': THREE.NormalBlending,\n 'THREE.AdditiveBlending': THREE.AdditiveBlending,\n 'THREE.SubtractiveBlending': THREE.SubtractiveBlending,\n 'THREE.MultiplyBlending': THREE.MultiplyBlending,\n};\n\n/**\n * Normalizes a blending value from either a numeric `THREE.Blending` constant\n * or the serialized string form used by the JSON example configs\n * (`\"THREE.AdditiveBlending\"` / `\"AdditiveBlending\"`).\n */\nconst toBlendingConstant = (v: unknown): THREE.Blending => {\n if (typeof v === 'number') return v as THREE.Blending;\n if (typeof v === 'string') {\n const key = v.startsWith('THREE.') ? v : `THREE.${v}`;\n const mapped = (blendingMap as unknown as Record<string, THREE.Blending>)[key];\n if (mapped !== undefined) return mapped;\n }\n return THREE.NormalBlending;\n};\n\n/**\n * Returns a deep copy of the default particle system configuration.\n *\n * This is useful when you want to start with default settings and modify specific properties\n * without affecting the internal default configuration object.\n *\n * @returns A new object containing all default particle system settings\n *\n * @example\n * ```typescript\n * import { getDefaultParticleSystemConfig, createParticleSystem } from '@cyberluke/three-particles';\n *\n * // Get default config and modify it\n * const config = getDefaultParticleSystemConfig();\n * config.emission.rateOverTime = 100;\n * config.startColor.min = { r: 1, g: 0, b: 0 };\n *\n * const { instance } = createParticleSystem(config);\n * scene.add(instance);\n * ```\n */\nexport const getDefaultParticleSystemConfig = () =>\n JSON.parse(JSON.stringify(DEFAULT_PARTICLE_SYSTEM_CONFIG));\n\nconst DEFAULT_PARTICLE_SYSTEM_CONFIG: ParticleSystemConfig = {\n transform: {\n position: new THREE.Vector3(),\n rotation: new THREE.Vector3(),\n scale: new THREE.Vector3(1, 1, 1),\n },\n duration: 5.0,\n looping: true,\n startDelay: 0,\n startLifetime: 5.0,\n startSpeed: 1.0,\n startSize: 1.0,\n startOpacity: 1.0,\n startRotation: 0.0,\n startColor: {\n min: { r: 1.0, g: 1.0, b: 1.0 },\n max: { r: 1.0, g: 1.0, b: 1.0 },\n },\n gravity: 0.0,\n simulationSpace: SimulationSpace.LOCAL,\n simulationBackend: SimulationBackend.AUTO,\n maxParticles: 100.0,\n emission: {\n rateOverTime: 10.0,\n rateOverDistance: 0.0,\n bursts: [],\n },\n shape: {\n shape: Shape.SPHERE,\n sphere: {\n radius: 1.0,\n radiusThickness: 1.0,\n arc: 360.0,\n },\n cone: {\n angle: 25.0,\n radius: 1.0,\n radiusThickness: 1.0,\n arc: 360.0,\n },\n circle: {\n radius: 1.0,\n radiusThickness: 1.0,\n arc: 360.0,\n },\n rectangle: {\n rotation: { x: 0.0, y: 0.0, z: 0.0 },\n scale: { x: 1.0, y: 1.0 },\n },\n box: {\n scale: { x: 1.0, y: 1.0, z: 1.0 },\n emitFrom: EmitFrom.VOLUME,\n },\n },\n map: undefined,\n renderer: {\n blending: THREE.NormalBlending,\n discardBackgroundColor: false,\n backgroundColorTolerance: 1.0,\n backgroundColor: { r: 1.0, g: 1.0, b: 1.0 },\n transparent: true,\n depthTest: true,\n depthWrite: false,\n softParticles: {\n enabled: false,\n intensity: 1.0,\n },\n },\n velocityOverLifetime: {\n isActive: false,\n linear: {\n x: 0,\n y: 0,\n z: 0,\n },\n orbital: {\n x: 0,\n y: 0,\n z: 0,\n },\n },\n sizeOverLifetime: {\n isActive: false,\n lifetimeCurve: {\n type: LifeTimeCurve.BEZIER,\n scale: 1,\n bezierPoints: [\n { x: 0, y: 0, percentage: 0 },\n { x: 1, y: 1, percentage: 1 },\n ],\n },\n },\n colorOverLifetime: {\n isActive: false,\n r: {\n type: LifeTimeCurve.BEZIER,\n scale: 1,\n bezierPoints: [\n { x: 0, y: 1, percentage: 0 },\n { x: 1, y: 1, percentage: 1 },\n ],\n },\n g: {\n type: LifeTimeCurve.BEZIER,\n scale: 1,\n bezierPoints: [\n { x: 0, y: 1, percentage: 0 },\n { x: 1, y: 1, percentage: 1 },\n ],\n },\n b: {\n type: LifeTimeCurve.BEZIER,\n scale: 1,\n bezierPoints: [\n { x: 0, y: 1, percentage: 0 },\n { x: 1, y: 1, percentage: 1 },\n ],\n },\n },\n opacityOverLifetime: {\n isActive: false,\n lifetimeCurve: {\n type: LifeTimeCurve.BEZIER,\n scale: 1,\n bezierPoints: [\n { x: 0, y: 0, percentage: 0 },\n { x: 1, y: 1, percentage: 1 },\n ],\n },\n },\n rotationOverLifetime: {\n isActive: false,\n min: 0.0,\n max: 0.0,\n },\n noise: {\n isActive: false,\n useRandomOffset: false,\n strength: 1.0,\n frequency: 0.5,\n octaves: 1,\n positionAmount: 1.0,\n rotationAmount: 0.0,\n sizeAmount: 0.0,\n },\n textureSheetAnimation: {\n tiles: new THREE.Vector2(1.0, 1.0),\n timeMode: TimeMode.LIFETIME,\n fps: 30.0,\n startFrame: 0,\n },\n forceFields: [],\n collisionPlanes: [],\n};\n\nconst calculatePositionAndVelocity = (\n generalData: GeneralData,\n { shape, sphere, cone, circle, rectangle, box }: ShapeConfig,\n startSpeed: Constant | RandomBetweenTwoConstants | LifetimeCurve,\n position: THREE.Vector3,\n velocity: THREE.Vector3\n) => {\n const calculatedStartSpeed = calculateValue(\n generalData.particleSystemId,\n startSpeed,\n generalData.normalizedLifetimePercentage\n );\n\n switch (shape) {\n case Shape.SPHERE:\n calculateRandomPositionAndVelocityOnSphere(\n position,\n generalData.wrapperQuaternion,\n velocity,\n calculatedStartSpeed,\n sphere as Required<NonNullable<ShapeConfig['sphere']>>\n );\n break;\n\n case Shape.CONE:\n calculateRandomPositionAndVelocityOnCone(\n position,\n generalData.wrapperQuaternion,\n velocity,\n calculatedStartSpeed,\n cone as Required<NonNullable<ShapeConfig['cone']>>\n );\n break;\n\n case Shape.CIRCLE:\n calculateRandomPositionAndVelocityOnCircle(\n position,\n generalData.wrapperQuaternion,\n velocity,\n calculatedStartSpeed,\n circle as Required<NonNullable<ShapeConfig['circle']>>\n );\n break;\n\n case Shape.RECTANGLE:\n calculateRandomPositionAndVelocityOnRectangle(\n position,\n generalData.wrapperQuaternion,\n velocity,\n calculatedStartSpeed,\n rectangle as Required<NonNullable<ShapeConfig['rectangle']>>\n );\n break;\n\n case Shape.BOX:\n calculateRandomPositionAndVelocityOnBox(\n position,\n generalData.wrapperQuaternion,\n velocity,\n calculatedStartSpeed,\n box as Required<NonNullable<ShapeConfig['box']>>\n );\n break;\n }\n};\n\nconst destroyParticleSystem = (particleSystem: THREE.Points | THREE.Mesh) => {\n createdParticleSystems = createdParticleSystems.filter(\n ({\n particleSystem: savedParticleSystem,\n trailMesh,\n generalData: { particleSystemId },\n }) => {\n if (savedParticleSystem !== particleSystem) {\n return true;\n }\n\n removeBezierCurveFunction(particleSystemId);\n\n // Dispose trail mesh if present\n if (trailMesh) {\n trailMesh.geometry.dispose();\n if (Array.isArray(trailMesh.material))\n trailMesh.material.forEach((m) => m.dispose());\n else trailMesh.material.dispose();\n if (trailMesh.parent) trailMesh.parent.remove(trailMesh);\n }\n\n savedParticleSystem.geometry.dispose();\n if (Array.isArray(savedParticleSystem.material))\n savedParticleSystem.material.forEach((material) => material.dispose());\n else savedParticleSystem.material.dispose();\n\n if (savedParticleSystem.parent)\n savedParticleSystem.parent.remove(savedParticleSystem);\n return false;\n }\n );\n};\n\n/**\n * Creates a new particle system with the specified configuration.\n *\n * This is the primary function for instantiating particle effects. It handles the complete\n * setup of a particle system including geometry creation, material configuration, shader setup,\n * and initialization of all particle properties.\n *\n * @param config - Configuration object for the particle system. If not provided, uses default settings.\n * See {@link ParticleSystemConfig} for all available options.\n * @param externalNow - Optional custom timestamp in milliseconds. If not provided, uses `Date.now()`.\n * Useful for synchronized particle systems or testing.\n *\n * @returns A {@link ParticleSystem} object containing:\n * - `instance`: The THREE.Object3D that should be added to your scene\n * - `resumeEmitter()`: Function to resume particle emission\n * - `pauseEmitter()`: Function to pause particle emission\n * - `dispose()`: Function to clean up resources and remove the particle system\n *\n * @example\n * ```typescript\n * import { createParticleSystem, updateParticleSystems } from '@cyberluke/three-particles';\n *\n * // Create a basic particle system with default settings\n * const { instance, dispose } = createParticleSystem();\n * scene.add(instance);\n *\n * // Create a custom fire effect\n * const fireEffect = createParticleSystem({\n * duration: 2.0,\n * looping: true,\n * startLifetime: { min: 0.5, max: 1.5 },\n * startSpeed: { min: 2, max: 4 },\n * startSize: { min: 0.5, max: 1.5 },\n * startColor: {\n * min: { r: 1.0, g: 0.3, b: 0.0 },\n * max: { r: 1.0, g: 0.8, b: 0.0 }\n * },\n * emission: { rateOverTime: 50 },\n * shape: {\n * shape: Shape.CONE,\n * cone: { angle: 10, radius: 0.2 }\n * }\n * });\n * scene.add(fireEffect.instance);\n *\n * // In your animation loop\n * function animate(time) {\n * updateParticleSystems({ now: time, delta: deltaTime, elapsed: elapsedTime });\n * renderer.render(scene, camera);\n * }\n *\n * // Clean up when done\n * fireEffect.dispose();\n * ```\n *\n * @see {@link updateParticleSystems} - Required function to call in your animation loop\n * @see {@link ParticleSystemConfig} - Complete configuration options\n */\n// ?? GPU-only helper functions (small scalar writers; NO per-particle loops) ??\ntype _ReusableArrayHelper = {\n src: Array<NormalizedForceFieldConfig>;\n dst: Array<NormalizedForceFieldConfig>;\n _pos: THREE.Vector3;\n _dir: THREE.Vector3;\n};\n\nconst _uploadFFAndCollisionTails = (\n pipeline: any,\n generalData: GeneralData,\n config: NormalizedParticleSystemConfig,\n scratch: _ReusableArrayHelper\n): void => {\n const info = pipeline.forceFieldInfo;\n const cinfo = pipeline.collisionPlaneInfo;\n if (!info && !cinfo) return;\n // Packed read-mostly f32 table (uniform buffer, non-atomic).\n const arr = pipeline.buffers.packedData as Float32Array;\n const cd = pipeline.packedDataNode as {\n addUpdateRange(start: number, count: number): void;\n needsUpdate: boolean;\n };\n if (info && config.forceFields.length > 0) {\n const encoded = _tslMaterialFactory!.encodeForceFieldsForGPU!(scratch.src, generalData.particleSystemId, generalData.normalizedLifetimePercentage);\n const off = info.offset;\n let changed = false;\n for (let i = 0; i < encoded.length; i++) if (arr[off + i] !== encoded[i]) { changed = true; break; }\n if (changed) { arr.set(encoded, off); cd.addUpdateRange(off, encoded.length); cd.needsUpdate = true; }\n (info.countUniform as { value: number }).value = config.forceFields.length;\n }\n if (cinfo && config.collisionPlanes.length > 0) {\n const encoded2 = _tslMaterialFactory!.encodeCollisionPlanesForGPU!(config.collisionPlanes as never);\n const off2 = cinfo.offset;\n let changed2 = false;\n for (let i = 0; i < encoded2.length; i++) if (arr[off2 + i] !== encoded2[i]) { changed2 = true; break; }\n if (changed2) { arr.set(encoded2, off2); cd.addUpdateRange(off2, encoded2.length); cd.needsUpdate = true; }\n (cinfo.countUniform as { value: number }).value = config.collisionPlanes.length;\n }\n};\n\n// After the sim kernel writes the GPU-side storage buffers, we simply flag\n// the CPU-side typed arrays so three.js WebGPU backend will upload them\n// before the render pass. (The compute kernels themselves run against these\n// same GPU buffers; the upload is only needed on the FIRST frame.)\nconst _markBufferAttributeUploads = (buffers: Record<string, THREE.BufferAttribute>): void => {};\n\n// Default texture fallback (single white 1?1 pixel; matches upstream @newkrok).\nlet _defaultTexture: THREE.Texture | null = null;\nconst getDefaultTexture = (): THREE.Texture | null => {\n if (_defaultTexture) return _defaultTexture;\n if (typeof document === 'undefined') return null;\n const canvas = document.createElement('canvas');\n canvas.width = 1; canvas.height = 1;\n const ctx = canvas.getContext('2d');\n if (ctx) { ctx.fillStyle = '#ffffff'; ctx.fillRect(0, 0, 1, 1); }\n _defaultTexture = new THREE.Texture(canvas as unknown as TexImageSource);\n _defaultTexture.needsUpdate = true;\n return _defaultTexture;\n};\n/**\n * Create a new particle system (GPU-only). Every per-particle slot lives\n * on the GPU inside the 8 storage buffers that the WebGPU compute kernels\n * read/write. The CPU only:\n * - merges the incoming config,\n * - creates the TSL material + pipeline,\n * - writes ~12 scalar uniforms per frame,\n * - dispatches [emitNode, simNode] via renderer.compute(...).\n */\nexport const createParticleSystem = (\n config: ParticleSystemConfig = DEFAULT_PARTICLE_SYSTEM_CONFIG,\n externalNow?: number\n): ParticleSystem => {\n const now = externalNow || Date.now();\n\n // ?? 1. strict GPU-only guards ??\n const useTSL = _tslMaterialFactory !== null;\n if (!useTSL) {\n throw new Error(\n 'three-particles: WebGPU TSL material factory not registered. ' +\n 'Call enableWebGPU(renderer) immediately after creating a WebGPURenderer. ' +\n '@cyberluke/three-particles 4.0.0 is GPU-only - no CPU fallback path exists.'\n );\n }\n if (!_rendererBackendIsGPU) {\n throw new Error(\n 'three-particles: renderer is not a native WebGPU backend. ' +\n 'This build has no WebGL2 fallback. Use a new THREE.WebGPURenderer().'\n );\n }\n const factory = _tslMaterialFactory!;\n if (!factory.createComputePipeline) {\n throw new Error(\n 'three-particles: active WebGPU renderer does not provide a complete TSL compute pipeline ' +\n '(createComputePipeline missing). No CPU fallback exists; install a WebGPU-capable backend.'\n );\n }\n\n const maxParticles = config.maxParticles || DEFAULT_PARTICLE_SYSTEM_CONFIG.maxParticles!;\n const normalizedConfig = ObjectUtils.deepMerge(\n DEFAULT_PARTICLE_SYSTEM_CONFIG as unknown as NormalizedParticleSystemConfig,\n config,\n { applyToFirstObject: false, skippedProperties: [] }\n ) as NormalizedParticleSystemConfig;\n\n // The v4 build is GPU-only, so a serialized `'CPU'` preference is accepted as\n // the (identical) GPU path instead of failing.\n if ((normalizedConfig.simulationBackend as string) === 'CPU') {\n if (!_cpuPreferenceWarned) {\n _cpuPreferencePreferenceWarn();\n }\n normalizedConfig.simulationBackend = SimulationBackend.GPU as typeof normalizedConfig.simulationBackend;\n }\n\n const requestedRendererType =\n normalizedConfig.renderer.rendererType || RendererType.POINTS;\n // `resolveWebGPUEffectiveRendererType`: the GPU-only v4 renderer builds 4\n // material/geometry classes. POINTS is NOT a runtime point-sprite path\n // (PointsNodeMaterial + THREE.Points would sample pointUV where WGSL has\n // no `gl_PointCoord`); it is the BILLBOARD quad implementation, while\n // INSTANCED selects `InstancedBufferGeometry` + instanced TSL material.\n const effectiveRendererType = resolveWebGPUEffectiveRendererType(\n requestedRendererType\n );\n const rrType = effectiveRendererType;\n const useInstancing =\n effectiveRendererType === RendererType.INSTANCED ||\n effectiveRendererType === RendererType.MESH;\n\n // ?? 1b. Trail history ring (GPU-native, filled by the simulation kernel) ??\n const trailConfig = normalizedConfig.renderer.trail;\n const trailLength = Math.max(2, Math.round(trailConfig?.length ?? 20));\n const trailHistoryAttribute: StorageBufferAttribute | null =\n rrType === RendererType.TRAIL\n ? new StorageBufferAttribute(\n new Float32Array(maxParticles * (trailLength + 1) * 4),\n 4\n )\n : null;\n const trailDesc: {\n attribute: StorageBufferAttribute;\n meta: StorageBufferAttribute | null;\n length: number;\n minVertexDistance: number;\n maxTime: number;\n } | null = trailHistoryAttribute\n ? {\n attribute: trailHistoryAttribute,\n meta: null,\n length: trailLength,\n minVertexDistance: trailConfig?.minVertexDistance ?? 0,\n maxTime: (trailConfig?.maxTime ?? 0) * 1000,\n }\n : null;\n\n // ?? 1c. Sub-emitter event FIFOs (integer counters + plain f32 payloads) ??\n const subEmitterConfigs = normalizedConfig.subEmitters ?? [];\n type FifoEntry = {\n counter: StorageBufferAttribute;\n payload: StorageBufferAttribute;\n trigger: 0 | 1;\n capacity: number;\n windowSize: number;\n };\n const fifos: FifoEntry[] = subEmitterConfigs.map((se) => {\n const capacity = Math.max(1, Math.round(se.maxInstances ?? 32));\n const f = factory.createSubEmitterFifoAttribute!(capacity) as FifoEntry;\n f.trigger = (se.trigger === 'BIRTH' ? 0 : 1) as 0 | 1;\n return f;\n });\n // One shared ping-pong window size per system (single `fifoBase` index).\n const fifoBaseStride = fifos.reduce((m, f) => Math.max(m, f.windowSize), 0);\n\n const forceFields = normalizeForceFields(normalizedConfig.forceFields);\n const collisionPlanes = normalizeCollisionPlanes(normalizedConfig.collisionPlanes);\n\n // ?? 2. GPU compute pipeline (emit + simulation kernels) ??\n const pipeline: NonNullable<ParticleSystemInstance['computePipeline']> = factory.createComputePipeline(\n maxParticles,\n useInstancing,\n normalizedConfig,\n _particleSystemId, // pre-increment inside generalData below would be off by 1; use the raw next id\n forceFields.length,\n collisionPlanes.length,\n fifos,\n trailDesc ?? undefined\n );\n\n // ?? 2b. Trail ribbon expansion kernel (history ring -> ribbon vertices) ??\n const ribbonPipeline: {\n ribbonNode: unknown;\n passLayouts: Array<{\n name: string;\n storageBindings: number;\n uniformBindings: number;\n }>;\n uniforms: Record<string, { value: unknown }>;\n buffers: Record<string, THREE.BufferAttribute>;\n } | null = trailDesc\n ? factory.createTrailRibbonUpdate!({\n position: new StorageBufferAttribute(\n new Float32Array(maxParticles * trailLength * 2 * 4),\n 4\n ),\n next: new StorageBufferAttribute(\n new Float32Array(maxParticles * trailLength * 2 * 4),\n 4\n ),\n uvColorA: new StorageBufferAttribute(\n new Float32Array(maxParticles * trailLength * 2 * 4),\n 4\n ),\n colorB: new StorageBufferAttribute(\n new Float32Array(maxParticles * trailLength * 2 * 4),\n 4\n ),\n history: trailDesc.attribute,\n meta: trailDesc.meta as StorageBufferAttribute,\n particleColor: pipeline.buffers.color as StorageBufferAttribute,\n curveFns: {\n width: trailConfig?.widthOverTrail\n ? getCurveFunctionFromConfig(_particleSystemId, trailConfig.widthOverTrail)\n : undefined,\n opacity: trailConfig?.opacityOverTrail\n ? getCurveFunctionFromConfig(_particleSystemId, trailConfig.opacityOverTrail)\n : undefined,\n colorR: trailConfig?.colorOverTrail?.isActive\n ? getCurveFunctionFromConfig(_particleSystemId, trailConfig.colorOverTrail.r as unknown as LifetimeCurve)\n : undefined,\n colorG: trailConfig?.colorOverTrail?.isActive\n ? getCurveFunctionFromConfig(_particleSystemId, trailConfig.colorOverTrail.g as unknown as LifetimeCurve)\n : undefined,\n colorB: trailConfig?.colorOverTrail?.isActive\n ? getCurveFunctionFromConfig(_particleSystemId, trailConfig.colorOverTrail.b as unknown as LifetimeCurve)\n : undefined,\n },\n width: trailConfig?.width ?? 1,\n length: trailLength,\n maxTime: trailDesc.maxTime,\n maxParticles,\n })\n : null;\n\n // ?? 2c. Sub-emitter child pools (event-driven, GPU-owned) ??\n type SubEntry = {\n fifo: FifoEntry;\n pipeline: NonNullable<ParticleSystemInstance['computePipeline']>;\n init: {\n commandBuildNode: unknown;\n childInitNode: unknown;\n counterClearNode: unknown;\n commandBuffer: StorageBufferAttribute;\n passLayouts: Array<{\n name: string;\n storageBindings: number;\n uniformBindings: number;\n }>;\n passName: string;\n counterClearPassName: string;\n uniforms: Record<string, { value: unknown }>;\n };\n instanced: boolean;\n requestedRendererType: RendererType | undefined;\n effectiveRendererType: RendererType;\n cfg: NormalizedParticleSystemConfig;\n object: THREE.Points | THREE.Mesh | null;\n perEvent: number;\n gravity: number;\n noise: GeneralData['noise'] | null;\n rate: number;\n acc: number;\n lastEmit: number;\n poseFrom: 'parent' | 'self';\n selfPose: { x: number; y: number; z: number; qx: number; qy: number; qz: number; qw: number; sx: number; sy: number; sz: number; isWorld: 0 | 1 };\n };\n const subEntries: SubEntry[] = [];\n for (let fi = 0; fi < subEmitterConfigs.length; fi++) {\n const se = subEmitterConfigs[fi];\n const fifo = fifos[fi];\n const childCfg = ObjectUtils.deepMerge(\n getDefaultParticleSystemConfig() as unknown as NormalizedParticleSystemConfig,\n ((se.config ?? {}) as unknown) as NormalizedParticleSystemConfig,\n { applyToFirstObject: false, skippedProperties: [] }\n ) as NormalizedParticleSystemConfig;\n // Particles created per event: first burst count (max bound), else 1.\n const firstBurst = childCfg.emission?.bursts?.[0];\n const burstCount = firstBurst\n ? Math.max(\n 1,\n Math.ceil(\n calculateValue(\n _particleSystemId + 1 + fi,\n firstBurst.count,\n 0\n ) * (firstBurst.cycles ?? 1)\n )\n )\n : 1;\n const perEvent = Math.min(burstCount, fifo.capacity);\n const childMax = Math.max(2, Math.min(perEvent * fifo.capacity, 65536));\n // Child renderer classes are resolved from the CHILD config itself\n // (recursive `resolveWebGPUEffectiveRendererType`, §2): material, object\n // type, InstancedBufferGeometry choice and the compute instancing flag\n // all use the child's effective type.\n const childRequestedRendererType = childCfg.renderer?.rendererType;\n const childEffectiveRendererType = resolveWebGPUEffectiveRendererType(\n childRequestedRendererType\n );\n const childInstanced =\n childEffectiveRendererType === RendererType.INSTANCED ||\n childEffectiveRendererType === RendererType.MESH;\n const childPipeline = factory.createComputePipeline(\n childMax,\n childInstanced,\n childCfg,\n _particleSystemId + 1 + fi,\n 0,\n 0,\n [],\n undefined\n ) as NonNullable<ParticleSystemInstance['computePipeline']>;\n const childShapeParams = factory.encodeShapeEmitParams!(\n childCfg,\n _particleSystemId + 1 + fi\n );\n const childVel = childCfg.velocityOverLifetime;\n const init = factory.createSubEmitterInitUpdate!(\n childPipeline.buffers,\n childMax,\n childShapeParams,\n pipeline.buffers,\n maxParticles,\n fifo,\n se.inheritVelocity ?? 0,\n perEvent,\n {\n linear: [childVel?.linear?.x as never, childVel?.linear?.y as never, childVel?.linear?.z as never],\n orbital: [childVel?.orbital?.x as never, childVel?.orbital?.y as never, childVel?.orbital?.z as never],\n }\n ) as {\n commandBuildNode: unknown;\n childInitNode: unknown;\n counterClearNode: unknown;\n commandBuffer: StorageBufferAttribute;\n passLayouts: Array<{\n name: string;\n storageBindings: number;\n uniformBindings: number;\n }>;\n passName: string;\n counterClearPassName: string;\n uniforms: Record<string, { value: unknown }>;\n };\n\n // Child render object is built after `rendererConfig` exists (below).\n subEntries.push({\n fifo,\n pipeline: childPipeline,\n init,\n instanced: childInstanced,\n requestedRendererType: childRequestedRendererType,\n effectiveRendererType: childEffectiveRendererType,\n cfg: childCfg,\n object: null,\n perEvent,\n gravity: childCfg.gravity,\n noise: childCfg.noise?.isActive\n ? {\n isActive: true,\n strength: childCfg.noise.strength,\n noisePower:\n 0.15 * childCfg.noise.strength,\n frequency: childCfg.noise.frequency,\n positionAmount: childCfg.noise.positionAmount,\n rotationAmount: childCfg.noise.rotationAmount,\n sizeAmount: childCfg.noise.sizeAmount,\n fbmMax: 2 - Math.pow(2, -childCfg.noise.octaves),\n }\n : null,\n rate: childCfg.emission?.rateOverTime\n ? calculateValue(_particleSystemId + 1 + fi, childCfg.emission.rateOverTime, 0)\n : 0,\n acc: 0,\n lastEmit: 0,\n poseFrom: 'self',\n selfPose: { x: 0, y: 0, z: 0, qx: 0, qy: 0, qz: 0, qw: 1, sx: 1, sy: 1, sz: 1, isWorld: childCfg.simulationSpace === SimulationSpace.WORLD ? 1 : 0 },\n });\n }\n\n // ?? 3. shared uniform table (TSL) ??\n // §10 normalization happens through the module-level helpers\n // (`normalizeVector2Value` etc.) defined above `createParticleSystem`.\n const cameraNearFarSource = (normalizedConfig.renderer as unknown as Record<string, unknown>)\n .cameraNearFar;\n const tilesSource = normalizedConfig.textureSheetAnimation?.tiles;\n const elapsedUniform: { value: number } = { value: 0 };\n const sharedUniforms: { [k: string]: { value: unknown } } = {\n elapsed: elapsedUniform,\n viewportHeight: { value: 720 },\n cameraNearFar: {\n value: normalizeVector2Value(\n cameraNearFarSource,\n [0.1, 1000],\n \"renderer.cameraNearFar\"\n ),\n },\n useInstancing: { value: useInstancing },\n softParticlesEnabled: { value: !!normalizedConfig.renderer.softParticles?.enabled },\n softParticlesIntensity: {\n value: Math.max(normalizedConfig.renderer.softParticles?.intensity ?? 1, 0.001),\n },\n sceneDepthTexture: {\n value: normalizeDepthTextureValue(\n normalizedConfig.renderer.softParticles?.depthTexture,\n \"renderer.softParticles.depthTexture\"\n ),\n },\n discardBackgroundColor: { value: !!normalizedConfig.renderer.discardBackgroundColor },\n backgroundColor: { value: new THREE.Color(0xffffff) },\n backgroundColorTolerance: { value: normalizedConfig.renderer.backgroundColorTolerance ?? 0 },\n map: {\n value: normalizeTextureValue(\n normalizedConfig.map ?? getDefaultTexture(),\n \"map\"\n ),\n },\n startLifetime: { value: 0 },\n startSize: { value: 1 },\n startRotation: { value: 0 },\n startOpacity: { value: 1 },\n startColor: { value: new THREE.Color(1, 1, 1) },\n lifetime: { value: 0 },\n color: { value: new THREE.Color(1, 1, 1) },\n // Sprite-sheet animation fields consumed by tsl-shared.createParticleUniforms.\n fps: { value: normalizedConfig.textureSheetAnimation?.fps || 30.0 },\n useFPSForFrameIndex: {\n value: normalizedConfig.textureSheetAnimation?.timeMode === TimeMode.FPS,\n },\n tiles: {\n // The ONLY normalizer: `tiles` reaches the TSL factory as a Vector2\n // (also {u,v} pairs are accepted per §10). The engine's own default is\n // already (1,1) via the merged default config.\n value: normalizeVector2Value(\n tilesSource,\n [1, 1],\n \"textureSheetAnimation.tiles\"\n ),\n },\n };\n const bgVec = normalizeBackgroundToVector3(\n normalizedConfig.renderer.backgroundColor,\n \"renderer.backgroundColor\"\n );\n (sharedUniforms.backgroundColor.value as THREE.Color).setRGB(bgVec.x, bgVec.y, bgVec.z);\n\n const rendererConfig: {\n transparent: boolean;\n blending: THREE.Blending;\n depthTest: boolean;\n depthWrite: boolean;\n } = {\n transparent: !!normalizedConfig.renderer.transparent,\n blending: toBlendingConstant(normalizedConfig.renderer.blending),\n depthTest: normalizedConfig.renderer.depthTest !== false,\n depthWrite: normalizedConfig.renderer.depthWrite !== false,\n };\n const material = factory.createTSLParticleMaterial(\n rrType,\n sharedUniforms,\n rendererConfig,\n true\n );\n\n // ?? 4. GPU-backed geometry ??\n const buffers = pipeline.buffers as Record<string, THREE.BufferAttribute>;\n let geometry: THREE.BufferGeometry | THREE.InstancedBufferGeometry;\n if (useInstancing) {\n const g = new THREE.InstancedBufferGeometry();\n const meshGeometry = normalizedConfig.renderer.mesh?.geometry;\n const baseGeometry =\n rrType === RendererType.MESH && meshGeometry\n ? meshGeometry\n : new THREE.BufferGeometry();\n if (rrType !== RendererType.MESH || !meshGeometry) {\n const quad = new Float32Array([-0.5, -0.5, 0, 0.5, -0.5, 0, 0.5, 0.5, 0, -0.5, 0.5, 0]);\n const quadUV = new Float32Array([0, 0, 1, 0, 1, 1, 0, 1]);\n const quadNormal = new Float32Array([0, 0, 1, 0, 0, 1, 0, 0, 1, 0, 0, 1]);\n const idx = new Uint16Array([0, 1, 2, 0, 2, 3]);\n baseGeometry.setAttribute('position', new THREE.BufferAttribute(quad, 3));\n // MESH node materials sample the sprite map via `uv` and read `normal`.\n baseGeometry.setAttribute('uv', new THREE.BufferAttribute(quadUV, 2));\n baseGeometry.setAttribute('normal', new THREE.BufferAttribute(quadNormal, 3));\n baseGeometry.setIndex(new THREE.BufferAttribute(idx, 1));\n }\n g.setAttribute('position', baseGeometry.getAttribute('position'));\n if (baseGeometry.index !== null) g.setIndex(baseGeometry.index);\n g.instanceCount = maxParticles;\n // Exact TSL attribute contract of the instanced / mesh particle materials\n // (`attribute('<name>')` resolves against `geometry.getAttribute(<name>)`).\n g.setAttribute('instanceOffset', buffers.position);\n g.setAttribute('instanceColor', buffers.color);\n g.setAttribute('instanceParticleState', buffers.particleState);\n g.setAttribute('instanceStartValues', buffers.startValues);\n geometry = g;\n } else {\n const g = new THREE.BufferGeometry();\n g.setAttribute('position', buffers.position);\n g.setAttribute('color', buffers.color);\n g.setAttribute('particleState', buffers.particleState);\n g.setAttribute('startValues', buffers.startValues);\n g.setDrawRange(0, maxParticles);\n geometry = g;\n (g as unknown as { instanceCount: number }).instanceCount = maxParticles;\n }\n\n // ?? 4b. TRAIL renderer: indexed ribbon geometry + ribbon TSL material ??\n let trailGeometry: THREE.BufferGeometry | null = null;\n if (ribbonPipeline && trailDesc) {\n const rb = ribbonPipeline.buffers as unknown as Record<string, THREE.BufferAttribute>;\n const g = new THREE.BufferGeometry();\n g.setAttribute('position', rb.position);\n g.setAttribute('trailNext', rb.next);\n g.setAttribute('trailUVColor', rb.uvColorA);\n g.setAttribute('trailColorBA', rb.colorB);\n const idx = new Uint32Array(maxParticles * (trailLength - 1) * 6);\n let o = 0;\n for (let pIdx = 0; pIdx < maxParticles; pIdx++) {\n for (let s = 0; s < trailLength - 1; s++) {\n const b = pIdx * trailLength * 2 + s * 2;\n idx[o++] = b; idx[o++] = b + 1; idx[o++] = b + 2;\n idx[o++] = b + 1; idx[o++] = b + 3; idx[o++] = b + 2;\n }\n }\n g.setIndex(new THREE.BufferAttribute(idx, 1));\n g.setDrawRange(0, maxParticles * trailLength * 2);\n trailGeometry = g;\n }\n\n // Main render object: TRAIL uses the ribbon geometry + ribbon material.\n const trailMaterial = trailGeometry\n ? factory.createTSLTrailMaterial(\n {\n map: { value: (normalizedConfig.map ?? getDefaultTexture()) as unknown as THREE.Texture },\n useMap: { value: !!normalizedConfig.map },\n discardBackgroundColor: { value: !!normalizedConfig.renderer.discardBackgroundColor },\n backgroundColor: { value: normalizedConfig.renderer.backgroundColor ?? { r: 1, g: 1, b: 1 } },\n backgroundColorTolerance: { value: normalizedConfig.renderer.backgroundColorTolerance ?? 0 },\n softParticlesEnabled: { value: !!normalizedConfig.renderer.softParticles?.enabled },\n softParticlesIntensity: {\n value: Math.max(normalizedConfig.renderer.softParticles?.intensity ?? 1, 0.001),\n },\n sceneDepthTexture: {\n value: (normalizedConfig.renderer.softParticles?.depthTexture ?? null) as unknown as THREE.Texture,\n },\n cameraNearFar: { value: new THREE.Vector2(0.1, 1000) },\n },\n {\n transparent: !!normalizedConfig.renderer.transparent,\n blending: toBlendingConstant(normalizedConfig.renderer.blending),\n depthTest: normalizedConfig.renderer.depthTest !== false,\n depthWrite: normalizedConfig.renderer.depthWrite !== false,\n }\n )\n : null;\n const particleSystem: THREE.Points | THREE.Mesh = trailGeometry\n ? new THREE.Mesh(trailGeometry, trailMaterial as THREE.Material)\n : useInstancing\n ? new THREE.Mesh(geometry, material)\n : new THREE.Points(geometry, material);\n particleSystem.frustumCulled = false;\n\n // ?? 4c. Sub-emitter child render objects ??\n for (const e of subEntries) {\n const cb = e.pipeline.buffers as Record<string, THREE.BufferAttribute>;\n const childMax = (e.pipeline.allocatorCount as number) - 1;\n const childGeometry: THREE.BufferGeometry | THREE.InstancedBufferGeometry = e.instanced\n ? (() => {\n const g = new THREE.InstancedBufferGeometry();\n const quad = new Float32Array([-0.5, -0.5, 0, 0.5, -0.5, 0, 0.5, 0.5, 0, -0.5, 0.5, 0]);\n const idx = new Uint16Array([0, 1, 2, 0, 2, 3]);\n g.setAttribute('position', new THREE.BufferAttribute(quad, 3));\n g.setIndex(new THREE.BufferAttribute(idx, 1));\n g.instanceCount = childMax;\n g.setAttribute('instanceOffset', cb.position);\n g.setAttribute('instanceColor', cb.color);\n g.setAttribute('instanceParticleState', cb.particleState);\n g.setAttribute('instanceStartValues', cb.startValues);\n return g;\n })()\n : (() => {\n const g = new THREE.BufferGeometry();\n g.setAttribute('position', cb.position);\n g.setAttribute('color', cb.color);\n g.setAttribute('particleState', cb.particleState);\n g.setAttribute('startValues', cb.startValues);\n g.setDrawRange(0, childMax);\n return g;\n })();\n const childUniforms: { [k: string]: { value: unknown } } = {\n ...sharedUniforms,\n useInstancing: { value: e.instanced },\n };\n const childMaterial = factory.createTSLParticleMaterial(\n e.effectiveRendererType,\n childUniforms,\n rendererConfig,\n true\n );\n const childObject: THREE.Points | THREE.Mesh = e.instanced\n ? new THREE.Mesh(childGeometry, childMaterial)\n : new THREE.Points(childGeometry, childMaterial);\n childObject.frustumCulled = false;\n particleSystem.add(childObject);\n e.object = childObject;\n }\n\n // ?? Construction-time attribute-contract assertion (development only) ????\n // Runs once per particle system; no per-frame work and no particle scan.\n if ((import.meta as unknown as { env?: { DEV?: boolean } }).env?.DEV !== false) {\n const required = useInstancing\n ? [\n 'position', // quad / mesh vertex positions\n 'instanceOffset', // GPU particle position\n 'instanceColor', // GPU particle RGBA\n 'instanceParticleState', // GPU packed state vec4\n 'instanceStartValues' // GPU packed initial-state vec4\n ]\n : ['position', 'color', 'particleState', 'startValues'];\n for (const name of required) {\n if (!geometry.getAttribute(name)) {\n throw new Error(\n 'three-particles: ' + (useInstancing ? 'instanced' : 'POINTS') + ' geometry ' + name + ' is missing its required contract attribute.'\n );\n }\n }\n // Attribute identity: the renderer attributes must point at the SAME\n // GPU storage buffers the compute kernels own (no mirror copies).\n const contractIdentity: Array<[string, unknown]> = useInstancing\n ? [\n ['instanceOffset', buffers.position],\n ['instanceColor', buffers.color],\n ['instanceParticleState', buffers.particleState],\n ['instanceStartValues', buffers.startValues],\n ]\n : [\n ['position', buffers.position],\n ['color', buffers.color],\n ['particleState', buffers.particleState],\n ['startValues', buffers.startValues],\n ];\n for (const [name, buf] of contractIdentity) {\n if (geometry.getAttribute(name) !== buf) {\n throw new Error(\n `three-particles: attribute \"${name}\" is not the compute-owned storage buffer.`\n );\n }\n }\n const kind = (pipeline.shapeUniforms as Record<string, { value: number }>)\n .shapeKind.value;\n if (!(kind >= 0 && kind <= 4)) {\n throw new Error(\n `three-particles: gpuShapeKind ${kind} outside 0..4 (SPHERE..BOX).`\n );\n }\n if (!(maxParticles > 0)) {\n throw new Error('three-particles: maxParticles must be > 0.');\n }\n if (pipeline.allocatorCount !== maxParticles + 1) {\n throw new Error(\n 'three-particles: allocator capacity must equal maxParticles + 1.'\n );\n }\n // Hard per-pass storage-budget assertion. The WebGPU guaranteed per-stage\n // limit is `maxStorageBuffersPerShaderStage = 8` (portable guarantee; we\n // never request 16). After the pass decomposition, every compute pass\n // reports its REAL budget from its own bound resources — no synthetic\n // totals. The base emit/sim pool stays at exactly bindings 1..8\n // (position, velocity, color, particleState, startValues,\n // startColorsExt, orbitalIsActive, allocator); trail and the sub-emitter\n // FIFO resources live in their own dedicated passes.\n type PassLayoutT = { name: string; storageBindings: number; uniformBindings: number };\n const passLayouts = [\n ...(((pipeline.passLayouts ?? []) as unknown) as PassLayoutT[]),\n ...(((ribbonPipeline?.passLayouts ?? []) as unknown) as PassLayoutT[]),\n ...subEntries.flatMap((e) => [\n ...(((e.init.passLayouts ?? []) as unknown) as PassLayoutT[]),\n ...(((e.pipeline.passLayouts ?? []) as unknown) as PassLayoutT[]).map(\n (p) => ({ ...p, name: `child:${p.name}` })\n ),\n ]),\n ];\n for (const pass of passLayouts) {\n if (pass.storageBindings > 8) {\n throw new Error(\n `${pass.name}: ${pass.storageBindings} storage buffers > guaranteed limit 8`\n );\n }\n }\n if (trailDesc && trailDesc.meta !== pipeline.trailMeta) {\n throw new Error('three-particles: trail ring meta buffer mismatch.');\n }\n for (const f of fifos) {\n const n = (f.counter.array as Uint32Array).length;\n if (n !== 2) {\n throw new Error(\n 'three-particles: sub-emitter FIFO must expose exactly 2 ping-pong counter slots.'\n );\n }\n const p = (f.payload.array as Float32Array).length;\n if (p !== 2 * 6 * f.capacity) {\n throw new Error(\n 'three-particles: sub-emitter FIFO payload length must be 2 * 6 * capacity.'\n );\n }\n }\n }\n\n // ?? Emitter transform ??\n // Matches the CPU oracle: position passthrough, rotation in DEGREES, scale\n // passthrough. Missing components fall back to the defaults of the shared\n // default config (0 / 0 / 0 / 1). In LOCAL simulation space the object matrix\n // carries the transform; in WORLD simulation space matrixWorld is identity and\n // the pose is delivered to the kernels through the emitter-pose uniforms.\n const _numOr = (v: unknown, d: number): number =>\n typeof v === 'number' && Number.isFinite(v) ? v : d;\n const xform = normalizedConfig.transform as unknown as {\n position?: Partial<THREE.Vector3>;\n rotation?: Partial<THREE.Vector3>;\n scale?: Partial<THREE.Vector3>;\n } | undefined;\n if (xform?.position) {\n particleSystem.position.set(\n _numOr(xform.position.x, 0),\n _numOr(xform.position.y, 0),\n _numOr(xform.position.z, 0)\n );\n }\n if (xform?.rotation) {\n particleSystem.rotation.set(\n THREE.MathUtils.degToRad(_numOr(xform.rotation.x, 0)),\n THREE.MathUtils.degToRad(_numOr(xform.rotation.y, 0)),\n THREE.MathUtils.degToRad(_numOr(xform.rotation.z, 0))\n );\n }\n if (xform?.scale) {\n particleSystem.scale.set(\n _numOr(xform.scale.x, 1),\n _numOr(xform.scale.y, 1),\n _numOr(xform.scale.z, 1)\n );\n }\n particleSystem.updateMatrix();\n particleSystem.updateMatrixWorld(true);\n\n if (normalizedConfig.simulationSpace === SimulationSpace.WORLD) {\n particleSystem.matrixWorldAutoUpdate = false;\n particleSystem.matrixWorld.identity();\n }\n\n // ?? 5. general data ??\n const generalData: GeneralData = {\n particleSystemId: _particleSystemId++,\n normalizedLifetimePercentage: 0,\n distanceFromLastEmitByDistance: 0,\n lastWorldPosition: new THREE.Vector3(-99999),\n currentWorldPosition: new THREE.Vector3(-99999),\n worldPositionChange: new THREE.Vector3(),\n sourceWorldMatrix: new THREE.Matrix4(),\n worldQuaternion: new THREE.Quaternion(),\n wrapperQuaternion: new THREE.Quaternion(),\n worldScale: new THREE.Vector3(1, 1, 1),\n worldEuler: new THREE.Euler(),\n gravityVelocity: new THREE.Vector3(0, 0, 0),\n startValues: {},\n linearVelocityData: undefined,\n orbitalVelocityData: undefined,\n lifetimeValues: {},\n creationTimes: new Float32Array(0),\n cpuDirtyParticleWatermark: -1,\n highWaterIndex: 0,\n noise: {\n isActive: normalizedConfig.noise.isActive,\n strength: normalizedConfig.noise.strength,\n // Oracle `0.15 * strength`; the single fbmMax division lives inside the\n // FBM sum (CPU: FBM.get3; GPU: the octave loop amp / fbmMax).\n noisePower: 0.15 * normalizedConfig.noise.strength,\n frequency: normalizedConfig.noise.frequency,\n positionAmount: normalizedConfig.noise.positionAmount,\n rotationAmount: normalizedConfig.noise.rotationAmount,\n sizeAmount: normalizedConfig.noise.sizeAmount,\n fbmMax: 2 - Math.pow(2, -normalizedConfig.noise.octaves),\n },\n isEnabled: true,\n burstStates: normalizedConfig.emission.bursts?.length\n ? normalizedConfig.emission.bursts.map(() => ({\n cyclesExecuted: 0,\n lastCycleTime: 0,\n probabilityPassed: false,\n }))\n : undefined,\n };\n\n // ?? 6. ParticleSystemInstance for the update loop ??\n const props: ParticleSystemInstance = {\n particleSystem,\n mappedAttributes: {\n position: buffers.position as unknown as THREE.BufferAttribute,\n isActive: buffers.orbitalIsActive as unknown as THREE.BufferAttribute,\n lifetime: buffers.particleState as unknown as THREE.BufferAttribute,\n startLifetime: buffers.startValues as unknown as THREE.BufferAttribute,\n startFrame: buffers.particleState as unknown as THREE.BufferAttribute,\n size: buffers.particleState as unknown as THREE.BufferAttribute,\n rotation: buffers.particleState as unknown as THREE.BufferAttribute,\n color: buffers.color as unknown as THREE.BufferAttribute,\n },\n // ?? Deprecated zero-size sentinels (GPU-only v4) ????\n // These legacy CPU particle-state fields are not authoritative anymore: the\n // compute kernels own the state in GPU storage. Only the TRAIL path (which\n // throws in v4) consumed them, so they are 0-length placeholders.\n scalarArray: new Float32Array(0),\n scalarInterleavedBuffer: new THREE.InterleavedBuffer(\n new Float32Array(0),\n SCALAR_STRIDE\n ),\n elapsedUniform,\n generalData,\n onUpdate: () => {},\n onComplete: () => {},\n creationTime: now + ((normalizedConfig.startDelay as number) || 0),\n lastEmissionTime: now,\n emissionAccumulator: 0,\n duration: normalizedConfig.duration,\n looping: normalizedConfig.looping,\n simulationSpace: normalizedConfig.simulationSpace,\n gravity: normalizedConfig.gravity,\n normalizedForceFields: forceFields,\n normalizedCollisionPlanes: collisionPlanes,\n emission: normalizedConfig.emission,\n normalizedConfig,\n iterationCount: 0,\n velocities: [],\n freeList: [],\n deactivateParticle: () => {},\n killParticle: () => {},\n activateParticle: () => {},\n computePipeline: pipeline,\n useGPUCompute: true,\n computeDispatchReady: false,\n maxParticles,\n material,\n geometry,\n rrType,\n requestedRendererType,\n effectiveRendererType: rrType,\n sharedUniforms,\n allComputeNodes: [\n ...((pipeline.computeNodes ?? []) as unknown[]),\n ...(ribbonPipeline ? [ribbonPipeline.ribbonNode] : []),\n ...subEntries.flatMap((e) => [\n e.init.commandBuildNode,\n e.init.childInitNode,\n ...(e.init.counterClearNode != null\n ? [e.init.counterClearNode]\n : []),\n ...(((e.pipeline.computeNodes ?? []) as unknown[])),\n ]),\n ],\n passNames: [\n ...(((pipeline.passNames ?? ['emit', 'simulate']) as string[])),\n ...(ribbonPipeline ? ['trail-ribbon'] : []),\n ...subEntries.flatMap((e, ei) => [\n `sub${ei}:command-build`,\n `sub${ei}:child-init`,\n `sub${ei}:counter-clear`,\n `sub${ei}:child-emit`,\n `sub${ei}:child-sim`,\n ]),\n ],\n fifoBaseStride,\n ribbonUniforms: ribbonPipeline\n ? (ribbonPipeline.uniforms as Record<string, { value: unknown }>)\n : undefined,\n ribbonBuffers: ribbonPipeline\n ? (ribbonPipeline.buffers as unknown as Record<string, THREE.BufferAttribute>)\n : undefined,\n frameParity: 0,\n subEntries: subEntries.map((e) => ({\n fifo: { capacity: e.fifo.capacity, windowSize: e.fifo.windowSize },\n requestedRendererType: e.requestedRendererType,\n effectiveRendererType: e.effectiveRendererType,\n pipeline: e.pipeline as unknown as Record<string, any>,\n init: e.init,\n gravity: e.gravity,\n noise: e.noise,\n rate: e.rate,\n acc: 0,\n isWorld: e.selfPose.isWorld,\n quat: [e.selfPose.qx, e.selfPose.qy, e.selfPose.qz, e.selfPose.qw] as [number, number, number, number],\n scale: [e.selfPose.sx, e.selfPose.sy, e.selfPose.sz] as [number, number, number],\n position: [\n _numOr((e.cfg.transform as unknown as { position?: { x?: number; y?: number; z?: number } })?.position?.x, 0),\n _numOr((e.cfg.transform as unknown as { position?: { x?: number; y?: number; z?: number } })?.position?.y, 0),\n _numOr((e.cfg.transform as unknown as { position?: { x?: number; y?: number; z?: number } })?.position?.z, 0),\n ] as [number, number, number],\n })),\n };\n // Self transform of each child object (LOCAL space) mirrors the main path.\n for (const e of subEntries) {\n if (!e.object) continue;\n const tf = e.cfg.transform as unknown as {\n position?: Partial<THREE.Vector3>;\n rotation?: Partial<THREE.Vector3>;\n scale?: Partial<THREE.Vector3>;\n } | undefined;\n if (tf?.position) {\n e.object.position.set(\n _numOr(tf.position.x, 0),\n _numOr(tf.position.y, 0),\n _numOr(tf.position.z, 0)\n );\n }\n if (tf?.rotation) {\n e.object.rotation.set(\n THREE.MathUtils.degToRad(_numOr(tf.rotation.x, 0)),\n THREE.MathUtils.degToRad(_numOr(tf.rotation.y, 0)),\n THREE.MathUtils.degToRad(_numOr(tf.rotation.z, 0))\n );\n }\n if (tf?.scale) {\n e.object.scale.set(\n _numOr(tf.scale.x, 1),\n _numOr(tf.scale.y, 1),\n _numOr(tf.scale.z, 1)\n );\n }\n e.object.updateMatrix();\n const q = new THREE.Quaternion().setFromEuler(\n new THREE.Euler(\n THREE.MathUtils.degToRad(_numOr((tf?.rotation as Partial<THREE.Vector3> | undefined)?.x, 0)),\n THREE.MathUtils.degToRad(_numOr((tf?.rotation as Partial<THREE.Vector3> | undefined)?.y, 0)),\n THREE.MathUtils.degToRad(_numOr((tf?.rotation as Partial<THREE.Vector3> | undefined)?.z, 0)),\n 'XYZ'\n )\n );\n const entry = props.subEntries?.[subEntries.indexOf(e)];\n if (entry) {\n entry.quat = [q.x, q.y, q.z, q.w];\n entry.scale = [\n _numOr(tf?.scale?.x, 1),\n _numOr(tf?.scale?.y, 1),\n _numOr(tf?.scale?.z, 1),\n ];\n }\n }\n createdParticleSystems.push(props);\n\n // Binding budgets per compute pass, derived from each pass's actual\n // resources (`passLayouts` of the owning pipelines; guaranteed WebGPU\n // per-stage storage limit = 8, never 16). The base emit/sim pool is\n // exactly the 8 per-particle buffers; trail + sub-emitter FIFOs live in\n // dedicated passes (trail-history, sub-birth/death-events, sub-command-\n // build, sub-child-init, sub-counter-clear); velocity-axis values are\n // seed-derived (no extra buffer).\n const _dbgPassCounts: Array<[string, number]> = [\n ...((pipeline.passLayouts ?? []) as Array<{ name: string; storageBindings: number }>).map(\n (p) => [p.name, p.storageBindings] as [string, number]\n ),\n ...((ribbonPipeline?.passLayouts ?? []) as Array<{ name: string; storageBindings: number }>).map(\n (p) => [p.name, p.storageBindings] as [string, number]\n ),\n ...subEntries.flatMap((e, ei): Array<[string, number]> => [\n ...(e.init.passLayouts ?? []).map(\n (p) => [`sub${ei}:${p.name}`, p.storageBindings] as [string, number]\n ),\n ...(e.pipeline.passLayouts ?? []).map(\n (p) => [`sub${ei}:${p.name}`, p.storageBindings] as [string, number]\n ),\n ]),\n ];\n const _dbgMaxPass = _dbgPassCounts.reduce((m, p) => Math.max(m, p[1]), 0);\n\n // ?? One-shot construction diagnostics (visible without DevTools commands) ??\n // `[PS:create]`, `[PS:config]` and `[PS:pipeline]` are logged exactly once\n // per system; the milestone probes themselves live in the examples harness.\n if (typeof console !== 'undefined' && console.log) {\n const logCfg = normalizedConfig as unknown as Record<string, any>;\n const shpU = pipeline.shapeUniforms as unknown as Record<\n string,\n { value: number } | undefined\n >;\n const sv = logCfg.startValues as Record<string, unknown> | undefined;\n const u = pipeline.uniforms as unknown as Record<\n string,\n { value: number } | undefined\n >;\n console.log(`[PS:create] system #${generalData.particleSystemId}`, {\n rendererType: rrType,\n requestedRendererType,\n effectiveRendererType: rrType,\n simulationSpace: normalizedConfig.simulationSpace,\n maxParticles,\n useInstancing,\n });\n console.log(`[PS:config] system #${generalData.particleSystemId}`, {\n shape: {\n publicKind: logCfg.shape?.shape ?? null,\n gpuShapeKind: shpU.shapeKind?.value ?? 0,\n radius: shpU.radius?.value ?? logCfg.shape?.radius ?? null,\n radiusThickness: shpU.radiusThickness?.value ?? null,\n arcDeg: shpU.arcDeg?.value ?? null,\n coneAngleDeg: shpU.coneAngleDeg?.value ?? null,\n rectScale: [shpU.rectScaleX?.value, shpU.rectScaleY?.value],\n rectRotationDeg: [shpU.rectRotXDeg?.value, shpU.rectRotYDeg?.value],\n boxScale: [shpU.boxSX?.value, shpU.boxSY?.value, shpU.boxSZ?.value],\n boxEmitFrom: shpU.boxEmitFrom?.value ?? null,\n },\n transform: {\n position: xform?.position ?? null,\n rotation: xform?.rotation ?? null,\n scale: xform?.scale ?? null,\n },\n emission: {\n rateOverTime: logCfg.emission?.rateOverTime ?? 0,\n rateOverDistance: logCfg.emission?.rateOverDistance ?? 0,\n bursts: logCfg.emission?.bursts?.length ?? 0,\n },\n startValues: {\n lifetime: sv?.startLifetime ?? null,\n speed: sv?.startSpeed ?? null,\n size: sv?.startSize ?? null,\n rotation: sv?.startRotation ?? null,\n color: sv?.startColor ?? null,\n opacity: sv?.startOpacity ?? null,\n },\n textureId:\n (config as { textureId?: string }).textureId ??\n (config as { _editorData?: { textureId?: string } })._editorData\n ?.textureId ??\n null,\n textureResolved: !!normalizedConfig.map,\n forceFieldCount: forceFields.length,\n collisionPlaneCount: collisionPlanes.length,\n subEmitterCount: (normalizedConfig.subEmitters ?? []).length,\n trailEnabled: !!trailDesc,\n modifiers: {\n linearVelocity:\n !!logCfg.velocityOverLifetime?.isActive &&\n (u.linearVelX !== undefined ||\n u.axisLinXMin !== undefined ||\n !!(logCfg.velocityOverLifetime?.linear &&\n Object.values(logCfg.velocityOverLifetime.linear).some(\n (value: any) => value !== undefined && value !== 0\n ))),\n orbitalVelocity:\n !!logCfg.velocityOverLifetime?.isActive &&\n !!(logCfg.velocityOverLifetime?.orbital &&\n Object.values(logCfg.velocityOverLifetime.orbital).some(\n (value: any) => value !== undefined && value !== 0\n )),\n sizeOverLifetime: !!normalizedConfig.sizeOverLifetime?.isActive,\n opacityOverLifetime: !!normalizedConfig.opacityOverLifetime?.isActive,\n colorOverLifetime: !!normalizedConfig.colorOverLifetime?.isActive,\n rotationOverLifetime: !!normalizedConfig.rotationOverLifetime?.isActive,\n noise: !!normalizedConfig.noise?.isActive,\n },\n });\n console.log(\n `[PS:pipeline] system #${generalData.particleSystemId}: ` +\n `${((props.passNames ?? []) as string[]).join(' -> ') || 'emit -> simulate'}` +\n ` | storageBindings=${_dbgPassCounts.map((p) => `${p[0]}=${p[1]}≤8`).join(' ')}` +\n ` | packedFloats=${(pipeline.buffers.packedData as unknown as { length?: number })?.length ?? 0}`\n );\n }\n\n // Emission count scratch so bursts + rate-over-distance don't allocate\n // closures / objects per frame.\n let lastSeed = Math.random();\n\n const update = (cycleData: CycleData): void => {\n updateParticleSystemInstance(props, cycleData);\n lastSeed = Math.random();\n };\n\n const resumeEmitter = (): void => { generalData.isEnabled = true; };\n const pauseEmitter = (): void => { generalData.isEnabled = false; };\n const dispose = (): void => { destroyParticleSystem(particleSystem); };\n const updateConfig = (partial: Partial<ParticleSystemConfig>): void => {\n ObjectUtils.deepMerge(normalizedConfig, partial, {\n applyToFirstObject: true,\n skippedProperties: [],\n });\n // Scalars (gravity, duration, looping, noise params, emission rates, burst counts)\n // are read every frame straight from `normalizedConfig` in `updateParticleSystemInstance`\n // so no explicit copy is required below.\n };\n\n return {\n instance: particleSystem,\n resumeEmitter,\n pauseEmitter,\n dispose,\n update,\n updateConfig,\n /**\n * ?? Deprecated synchronous active count ????\n * Returns -1 (= unsupported) in the GPU-only engine: the authoritative count\n * is `maxParticles - allocator[0]` which lives in GPU storage and is only\n * available through an explicit (throttled) `getArrayBufferAsync` read-back.\n */\n getActiveParticleCount: () => -1,\n computeNode:\n props.allComputeNodes && props.allComputeNodes.length > 0\n ? props.allComputeNodes\n : (pipeline.computeNodes ?? pipeline.computeNode),\n /**\n * ?? Temporary one-shot GPU debug handle (deprecated, no per-frame cost) ????\n * getActiveParticleCount() stays -1; this object is the raw material for an\n * explicit \renderer.getArrayBufferAsync(...) read-back (bytes, multiples of 4).\n * lastEmitCount() mirrors uEmitCount, the u32 count written per frame.\n */\n gpuDebug: {\n maxParticles,\n allocatorCount: pipeline.allocatorCount as number,\n /** Canonical requested vs effective GPU renderer classes (§2). */\n requestedRendererType,\n effectiveRendererType: rrType,\n /** u32 birth system seed for this pipeline (written ONCE at create). */\n systemSeed: (\n (pipeline.uniforms as Record<string, { value: unknown }>).seed as {\n value: unknown;\n }\n ).value as number,\n buffers: pipeline.buffers as unknown as Record<string, THREE.BufferAttribute>,\n emitNode: pipeline.emitNode,\n simNode: pipeline.simNode,\n passNames: (pipeline.passNames ?? ['emit', 'simulate']) as string[],\n allPassNames: (props.passNames ?? []) as string[],\n storageBindingCount: _dbgMaxPass,\n passBindingCounts: _dbgPassCounts,\n lastEmitCount: () =>\n (pipeline.uniforms.emitCount as { value: number }).value as number,\n /**\n * Per-sub-emitter-child canonical pairs (§2/§21): each child pool's own\n * requested vs effective renderer class + its events-per-frame.\n */\n subEmitters: (subEntries ?? []).map((e) => ({\n requestedRendererType: e.requestedRendererType ?? null,\n effectiveRendererType: e.effectiveRendererType,\n perEvent: e.perEvent,\n })),\n /** Decode summary for the `[PS:config]` / `[PS:pipeline]` logs. */\n snapshot: () => {\n const shp = normalizedConfig.shape as ShapeConfig & {\n sphere?: { radius?: number; radiusThickness?: number; arc?: number };\n cone?: { radius?: number; radiusThickness?: number; arc?: number; angle?: number };\n circle?: { radius?: number; radiusThickness?: number; arc?: number };\n rectangle?: { scale?: { x?: number; y?: number }; rotation?: { x?: number; y?: number } };\n box?: { scale?: unknown; emitFrom?: string };\n };\n const branch =\n shp.shape === 'CONE'\n ? shp.cone\n : shp.shape === 'CIRCLE'\n ? shp.circle\n : shp.sphere;\n const tex = normalizedConfig.map as unknown as\n | { image?: { width?: number; height?: number } | null }\n | undefined;\n return {\n systemId: generalData.particleSystemId,\n // Canonical effective + original requested renderer classes (§2).\n effectiveRendererType: rrType,\n requestedRendererType,\n rendererType: rrType,\n simulationSpace: normalizedConfig.simulationSpace,\n maxParticles,\n shape: {\n publicShape: shp.shape,\n gpuShapeKind:\n (pipeline.shapeUniforms as Record<string, { value: number }>)\n ?.shapeKind?.value ?? 0,\n radius: branch?.radius ?? null,\n radiusThickness: branch?.radiusThickness ?? null,\n arcDeg: branch?.arc ?? null,\n coneAngleDeg: shp.shape === 'CONE' ? shp.cone?.angle ?? null : null,\n rectScale: shp.rectangle?.scale ?? null,\n rectRotation: shp.rectangle?.rotation ?? null,\n boxScale: shp.box?.scale ?? null,\n boxEmitFrom: shp.box?.emitFrom ?? null,\n },\n textureId:\n (config as { textureId?: string }).textureId ??\n (config as { _editorData?: { textureId?: string } })._editorData\n ?.textureId ??\n null,\n textureResolved: !!normalizedConfig.map,\n textureDimensions: tex?.image\n ? [tex.image.width ?? 0, tex.image.height ?? 0]\n : null,\n forceFieldCount: (normalizedConfig.forceFields ?? []).length,\n collisionPlaneCount: (normalizedConfig.collisionPlanes ?? []).length,\n subEmitterCount: (normalizedConfig.subEmitters ?? []).length,\n trailEnabled: !!(normalizedConfig.renderer as { trail?: unknown })\n .trail,\n };\n },\n },\n } as ParticleSystem;\n};\n\n// ?? GPU-only per-frame path: writes ~12 scalar uniforms + 2 dispatches ??\n// No per-particle JS loop anywhere in this function.\nconst _lastUploadStampMap = new WeakMap<Record<string, THREE.BufferAttribute>, number>();\n/** One-shot first-frame upload marker for the sub-emitter command buffers. */\nconst _cmdUploadSeen = new WeakSet<object>();\nconst updateParticleSystemInstance = (\n props: ParticleSystemInstance,\n { now, delta, elapsed }: CycleData\n): void => {\n const {\n generalData,\n normalizedConfig,\n particleSystem,\n elapsedUniform,\n creationTime,\n normalizedForceFields,\n normalizedCollisionPlanes,\n emission,\n computePipeline: pipeline,\n maxParticles = 0,\n allComputeNodes,\n subEntries,\n fifoBaseStride = 0,\n ribbonUniforms,\n } = props;\n if (!pipeline) return;\n const u = pipeline.uniforms as Record<string, { value: unknown }>;\n const dur = normalizedConfig.duration;\n const lifetime = now - creationTime;\n const loop = normalizedConfig.looping;\n const iterationTimeMs = loop ? lifetime % (dur * 1000) : lifetime;\n generalData.normalizedLifetimePercentage = Math.max(Math.min((iterationTimeMs / 1000) / dur, 1), 0);\n (elapsedUniform as { value: number }).value = elapsed;\n\n // Emitter pose + gravity reference frame (oracle parity, scalar-only work).\n // WORLD: decompose the parent-composed source matrix; buffer is world space.\n // LOCAL: query matrixWorld; gravity is rotated by the inverse world\n // rotation and divided PER AXIS by the world scale.\n const gv = generalData.gravityVelocity;\n gv.set(0, normalizedConfig.gravity, 0);\n if (normalizedConfig.simulationSpace === SimulationSpace.WORLD) {\n particleSystem.updateMatrix();\n _tmpM1.copy(particleSystem.matrix);\n if (particleSystem.parent) {\n particleSystem.parent.updateMatrixWorld();\n _tmpM1.premultiply(particleSystem.parent.matrixWorld);\n }\n _tmpM1.decompose(\n generalData.currentWorldPosition,\n generalData.worldQuaternion,\n generalData.worldScale\n );\n } else {\n particleSystem.updateMatrixWorld();\n particleSystem.getWorldPosition(generalData.currentWorldPosition);\n particleSystem.getWorldQuaternion(generalData.worldQuaternion);\n particleSystem.getWorldScale(generalData.worldScale);\n _tmpQ1.copy(generalData.worldQuaternion).invert();\n gv.applyQuaternion(_tmpQ1);\n gv.x /= generalData.worldScale.x || 1;\n gv.y /= generalData.worldScale.y || 1;\n gv.z /= generalData.worldScale.z || 1;\n }\n\n // Rate-over-distance travel (same world-position delta the oracle uses).\n if (generalData.lastWorldPosition.x !== -99999) {\n _lastWorldPositionSnapshot.copy(generalData.lastWorldPosition);\n generalData.distanceFromLastEmitByDistance +=\n _lastWorldPositionSnapshot.distanceTo(generalData.currentWorldPosition);\n }\n generalData.lastWorldPosition.copy(generalData.currentWorldPosition);\n\n // Emission scalar count (rate over time + rate over distance + bursts).\n let emitCount = 0;\n if (generalData.isEnabled && (loop || iterationTimeMs < dur * 1000)) {\n const lastEmit = props.lastEmissionTime;\n const emissionDelta = now - lastEmit;\n if (emissionDelta > 0) {\n props.lastEmissionTime = now;\n if (emission.rateOverTime) {\n props.emissionAccumulator += calculateValue(\n generalData.particleSystemId,\n emission.rateOverTime,\n generalData.normalizedLifetimePercentage\n ) * (emissionDelta / 1000);\n }\n }\n emitCount += Math.floor(props.emissionAccumulator);\n if (emitCount > 0) props.emissionAccumulator -= emitCount;\n if (emission.rateOverDistance && generalData.distanceFromLastEmitByDistance > 0) {\n const r = calculateValue(\n generalData.particleSystemId,\n emission.rateOverDistance,\n generalData.normalizedLifetimePercentage\n );\n if (r > 0) {\n const n = Math.floor(generalData.distanceFromLastEmitByDistance * r);\n emitCount += n;\n generalData.distanceFromLastEmitByDistance = Math.max(\n generalData.distanceFromLastEmitByDistance - n / r,\n 0\n );\n }\n }\n // Bursts (advance internal cycle counters, add their counts).\n if (emission.bursts && generalData.burstStates) {\n const bursts = emission.bursts;\n const states = generalData.burstStates;\n const tSec = iterationTimeMs / 1000;\n for (let i = 0; i < bursts.length; i++) {\n const b = bursts[i];\n const s = states[i];\n const cyc = b.cycles ?? 1;\n const iv = (b.interval ?? 0);\n const prob = b.probability ?? 1;\n if (loop && tSec < (b.time ?? 0) && s.cyclesExecuted > 0) {\n s.cyclesExecuted = 0; s.lastCycleTime = 0; s.probabilityPassed = false;\n }\n if (s.cyclesExecuted >= cyc) continue;\n const next = (b.time ?? 0) + s.cyclesExecuted * iv;\n if (tSec >= next) {\n if (s.cyclesExecuted === 0) s.probabilityPassed = Math.random() < prob;\n if (s.probabilityPassed) {\n emitCount += Math.floor(\n calculateValue(generalData.particleSystemId, b.count, generalData.normalizedLifetimePercentage)\n );\n }\n s.cyclesExecuted++; s.lastCycleTime = tSec;\n }\n }\n }\n if (emitCount > maxParticles) emitCount = maxParticles;\n }\n\n // Uniform writes (scalars only) ? no per-particle loops anywhere.\n (u.delta as { value: number }).value = delta;\n (u.deltaMs as { value: number }).value = delta * 1000;\n ((u.gravityVelocity as { value: THREE.Vector3 }).value).copy(gv);\n (u.emitCount as { value: number }).value = emitCount;\n // Dynamic emit dispatch: the numeric `ComputeNode.count` is the real dispatch\n // size and also feeds the generated `instanceIndex >= count` bound guard.\n // Never dispatch 0 workgroups (r186 warns about it): the host always runs at\n // least one invocation and uEmitCount (u32) bounds the useful work inside\n // the kernel. See If(i.lessThan(uEmitCount), ...) in the emit kernel.\n (pipeline.emitNode as unknown as { count: number }).count = Math.max(1, emitCount);\n // The dedicated BIRTH event pass consumes exactly this frame's born slots.\n if (pipeline.subBirthEventsNode) {\n (pipeline.subBirthEventsNode as unknown as { count: number }).count =\n Math.max(1, emitCount);\n }\n // uSystemSeed is written ONCE at pipeline creation (§5): no per-frame seed.\n const n = generalData.noise;\n if (u.noiseStrength) (u.noiseStrength as { value: number }).value = n.strength;\n if (u.noisePower) (u.noisePower as { value: number }).value = n.noisePower;\n if (u.noiseFrequency) (u.noiseFrequency as { value: number }).value = n.frequency;\n if (u.noisePositionAmount) (u.noisePositionAmount as { value: number }).value = n.positionAmount;\n if (u.noiseRotationAmount) (u.noiseRotationAmount as { value: number }).value = n.rotationAmount;\n if (u.noiseSizeAmount) (u.noiseSizeAmount as { value: number }).value = n.sizeAmount;\n\n // ?? Emitter pose for the emit kernel (scalar/vector writes only) ??\n // LOCAL: identity quaternion, zero translation, unit scale ? the drawn object's\n // matrixWorld applies the transform.\n // WORLD: matrixWorld is identity, so the full emitter pose is handed to the\n // kernel directly (translation + world rotation + per-axis world scale).\n const pose = pipeline.emitterPose as\n | {\n positionW: { value: THREE.Vector4 };\n wrapperQuat: { value: THREE.Vector4 };\n worldScale: { value: THREE.Vector3 };\n }\n | undefined;\n if (pose) {\n if (normalizedConfig.simulationSpace === SimulationSpace.WORLD) {\n particleSystem.updateMatrix();\n _tmpM1.copy(particleSystem.matrix);\n if (particleSystem.parent) {\n particleSystem.parent.updateMatrixWorld();\n _tmpM1.premultiply(particleSystem.parent.matrixWorld);\n }\n _tmpM1.decompose(_tmpV1, _tmpQ1, _tmpV2);\n pose.positionW.value.set(_tmpV1.x, _tmpV1.y, _tmpV1.z, 1);\n pose.wrapperQuat.value.set(_tmpQ1.x, _tmpQ1.y, _tmpQ1.z, _tmpQ1.w);\n pose.worldScale.value.set(_tmpV2.x || 1, _tmpV2.y || 1, _tmpV2.z || 1);\n } else {\n pose.positionW.value.set(0, 0, 0, 0);\n pose.wrapperQuat.value.set(0, 0, 0, 1);\n pose.worldScale.value.set(1, 1, 1);\n }\n }\n\n // ?? FIFO ping-pong window index + trail clock ??\n // The integer counter attribute has exactly two slots (window 0/1); the\n // payload base is `index * channelWindowSize` computed inside the kernels.\n const parity = (props.frameParity ?? 0) % 2;\n const fifoBase = parity;\n if (u.fifoBase) (u.fifoBase as { value: number }).value = fifoBase;\n if (u.nowMs) (u.nowMs as { value: number }).value = now;\n if (ribbonUniforms?.nowMs) ribbonUniforms.nowMs.value = now;\n\n // ?? Sub-emitter children: scalar writes + their own continuous emission ??\n for (const e of subEntries ?? []) {\n const cp = e.pipeline as unknown as {\n emitNode?: { count: number };\n uniforms: Record<string, { value: unknown }>;\n emitterPose?: {\n positionW: { value: THREE.Vector4 };\n wrapperQuat: { value: THREE.Vector4 };\n worldScale: { value: THREE.Vector3 };\n };\n allocatorCount?: number;\n } | undefined;\n if (!cp) continue;\n const cu = cp.uniforms;\n if (cu.delta) (cu.delta as { value: number }).value = delta;\n if (cu.deltaMs) (cu.deltaMs as { value: number }).value = delta * 1000;\n if (cu.nowMs) (cu.nowMs as { value: number }).value = now;\n // child uSystemSeed: written ONCE at pipeline creation (no per-frame seed).\n if (cu.gravityVelocity) {\n ((cu.gravityVelocity as { value: THREE.Vector3 }).value).set(\n 0,\n e.gravity,\n 0\n );\n }\n if (e.noise) {\n if (cu.noiseStrength) (cu.noiseStrength as { value: number }).value = e.noise.strength;\n if (cu.noisePower) (cu.noisePower as { value: number }).value = e.noise.noisePower;\n if (cu.noiseFrequency) (cu.noiseFrequency as { value: number }).value = e.noise.frequency;\n if (cu.noisePositionAmount) (cu.noisePositionAmount as { value: number }).value = e.noise.positionAmount;\n if (cu.noiseRotationAmount) (cu.noiseRotationAmount as { value: number }).value = e.noise.rotationAmount;\n if (cu.noiseSizeAmount) (cu.noiseSizeAmount as { value: number }).value = e.noise.sizeAmount;\n }\n if (cu.fifoBase) (cu.fifoBase as { value: number }).value = fifoBase;\n // child-init pipeline system seed: written ONCE at creation.\n if (e.init.uniforms.fifoBase) e.init.uniforms.fifoBase.value = fifoBase;\n // Continuous rate-over-time of the child (bursts come from the events).\n let childEmit = 0;\n if (e.rate > 0) {\n e.acc += (e.rate * delta) / 1;\n childEmit = Math.floor(e.acc);\n if (childEmit > 0) e.acc -= childEmit;\n }\n const childCapacity = Math.max(2, (cp.allocatorCount ?? 2) - 1);\n if (childEmit > childCapacity) childEmit = childCapacity;\n if (cp.emitNode) cp.emitNode.count = Math.max(1, childEmit);\n if (cu.emitCount) (cu.emitCount as { value: number }).value = childEmit;\n // Child emitter pose: LOCAL relies on the object matrix; WORLD uses the\n // child's own transform on top of the (already world) event positions.\n const cpose = cp.emitterPose;\n if (cpose) {\n if (e.isWorld === 1) {\n cpose.positionW.value.set(e.position[0], e.position[1], e.position[2], 1);\n cpose.wrapperQuat.value.set(e.quat[0], e.quat[1], e.quat[2], e.quat[3]);\n cpose.worldScale.value.set(e.scale[0], e.scale[1], e.scale[2]);\n } else {\n cpose.positionW.value.set(0, 0, 0, 0);\n cpose.wrapperQuat.value.set(0, 0, 0, 1);\n cpose.worldScale.value.set(1, 1, 1);\n }\n }\n const ip = e.init.uniforms as Record<string, { value: unknown }> & {\n positionW?: { value: THREE.Vector4 };\n wrapperQuat?: { value: THREE.Vector4 };\n };\n if (ip.positionW && ip.wrapperQuat) {\n if (e.isWorld === 1) {\n ip.positionW.value.set(e.position[0], e.position[1], e.position[2], 1);\n ip.wrapperQuat.value.set(e.quat[0], e.quat[1], e.quat[2], e.quat[3]);\n } else {\n ip.positionW.value.set(0, 0, 0, 0);\n ip.wrapperQuat.value.set(0, 0, 0, 1);\n }\n }\n }\n\n // Force-field / collision-plane records in the packed f32 uniform table.\n const ffInfo = pipeline.forceFieldInfo as { offset: number; countUniform: { value: number } } | null;\n const cInfo = (pipeline.collisionPlaneInfo ?? null) as { offset: number; countUniform: { value: number } } | null;\n if ((ffInfo || cInfo) && _tslMaterialFactory) {\n // Read-mostly uniform buffer (non-atomic f32): the CPU owns these record\n // regions, the kernels only load them.\n const cdArr = pipeline.buffers.packedData as Float32Array;\n const cdNode = pipeline.packedDataNode as unknown as {\n addUpdateRange(start: number, count: number): void;\n needsUpdate: boolean;\n };\n if (ffInfo && normalizedForceFields.length > 0) {\n const encFF = _tslMaterialFactory.encodeForceFieldsForGPU!(normalizedForceFields, generalData.particleSystemId, generalData.normalizedLifetimePercentage);\n let changedFF = false;\n for (let k = 0; k < encFF.length; k++) if (cdArr[ffInfo.offset + k] !== encFF[k]) { changedFF = true; break; }\n if (changedFF) { cdArr.set(encFF, ffInfo.offset); cdNode.addUpdateRange(ffInfo.offset, encFF.length); cdNode.needsUpdate = true; }\n ffInfo.countUniform.value = normalizedForceFields.length;\n }\n if (cInfo && normalizedCollisionPlanes.length > 0) {\n const encCP = _tslMaterialFactory.encodeCollisionPlanesForGPU!(normalizedCollisionPlanes);\n let changedCP = false;\n for (let k = 0; k < encCP.length; k++) if (cdArr[cInfo.offset + k] !== encCP[k]) { changedCP = true; break; }\n if (changedCP) { cdArr.set(encCP, cInfo.offset); cdNode.addUpdateRange(cInfo.offset, encCP.length); cdNode.needsUpdate = true; }\n cInfo.countUniform.value = normalizedCollisionPlanes.length;\n }\n }\n\n // First-frame buffer upload: storage attributes start with their CPU Float32Array\n // contents; after that the compute kernels own all changes on the GPU.\n const bufs = pipeline.buffers as unknown as Record<string, THREE.BufferAttribute>;\n let stamp = _lastUploadStampMap.get(bufs);\n if (stamp === undefined || stamp === 0) {\n for (const key of Object.keys(bufs)) {\n const a = bufs[key];\n if (a && 'needsUpdate' in a) a.needsUpdate = true;\n }\n _lastUploadStampMap.set(bufs, 1);\n } else {\n _lastUploadStampMap.set(bufs, stamp + 1);\n }\n\n // First-frame upload for the child pools, sub-emitter command buffers and\n // trail ribbon streams as well.\n for (const e of subEntries ?? []) {\n const cb = (e.pipeline as unknown as { buffers?: Record<string, THREE.BufferAttribute> })\n ?.buffers;\n if (cb && !_lastUploadStampMap.has(cb as unknown as Record<string, THREE.BufferAttribute>)) {\n for (const key of Object.keys(cb)) {\n const a = cb[key];\n if (a && 'needsUpdate' in a) a.needsUpdate = true;\n }\n _lastUploadStampMap.set(cb as unknown as Record<string, THREE.BufferAttribute>, 1);\n }\n const cmd = e.init.commandBuffer as THREE.BufferAttribute | undefined;\n if (cmd && 'needsUpdate' in cmd && !_cmdUploadSeen.has(cmd)) {\n cmd.needsUpdate = true;\n _cmdUploadSeen.add(cmd);\n }\n }\n const rb = (props as unknown as { ribbonBuffers?: Record<string, THREE.BufferAttribute> })\n .ribbonBuffers;\n if (rb && !_lastUploadStampMap.has(rb)) {\n for (const key of Object.keys(rb)) {\n const a = rb[key];\n if (a && 'needsUpdate' in a) a.needsUpdate = true;\n }\n _lastUploadStampMap.set(rb, 1);\n }\n\n // Emit + mark dispatch ready (editor does the actual `renderer.compute(...)`).\n props.computeDispatchReady = true;\n\n // Iteration counter (scalar) + FIFO ping-pong parity.\n props.iterationCount++;\n props.frameParity = (props.frameParity ?? 0) ^ 1;\n\n // Trail step (if the system uses TRAIL ? see `updateTrailGeometry` below).\n if (props.trailMesh) updateTrailGeometry(props, now);\n};\n\n// Tiny scratch for the world-space gravity transform above.\nconst _tmpQ1 = new THREE.Quaternion();\nconst _tmpV1 = new THREE.Vector3();\nconst _tmpV2 = new THREE.Vector3();\nconst _tmpM1 = new THREE.Matrix4();\n/**\n * Evaluates a Catmull-Rom spline at parameter `t` (0..1) between points p1 and p2,\n * using p0 and p3 as control points. Writes result into `out`.\n */\nconst catmullRom = (\n out: Float32Array,\n outIdx: number,\n p0x: number,\n p0y: number,\n p0z: number,\n p1x: number,\n p1y: number,\n p1z: number,\n p2x: number,\n p2y: number,\n p2z: number,\n p3x: number,\n p3y: number,\n p3z: number,\n t: number\n) => {\n const t2 = t * t;\n const t3 = t2 * t;\n out[outIdx] =\n 0.5 *\n (2 * p1x +\n (-p0x + p2x) * t +\n (2 * p0x - 5 * p1x + 4 * p2x - p3x) * t2 +\n (-p0x + 3 * p1x - 3 * p2x + p3x) * t3);\n out[outIdx + 1] =\n 0.5 *\n (2 * p1y +\n (-p0y + p2y) * t +\n (2 * p0y - 5 * p1y + 4 * p2y - p3y) * t2 +\n (-p0y + 3 * p1y - 3 * p2y + p3y) * t3);\n out[outIdx + 2] =\n 0.5 *\n (2 * p1z +\n (-p0z + p2z) * t +\n (2 * p0z - 5 * p1z + 4 * p2z - p3z) * t2 +\n (-p0z + 3 * p1z - 3 * p2z + p3z) * t3);\n};\n\n/** Zeroes out a single trail vertex (both left+right sides). */\nconst clearTrailVertex = (\n vIdx: number,\n cIdx: number,\n aIdx: number,\n uvIdx: number,\n trailPosArr: Float32Array,\n trailNextArr: Float32Array,\n trailHalfWidthArr: Float32Array,\n trailUVArr: Float32Array,\n trailAlphaArr: Float32Array,\n trailColorArr: Float32Array,\n fallbackX: number,\n fallbackY: number,\n fallbackZ: number\n) => {\n trailPosArr[vIdx] = fallbackX;\n trailPosArr[vIdx + 1] = fallbackY;\n trailPosArr[vIdx + 2] = fallbackZ;\n trailPosArr[vIdx + 3] = fallbackX;\n trailPosArr[vIdx + 4] = fallbackY;\n trailPosArr[vIdx + 5] = fallbackZ;\n trailNextArr[vIdx] = fallbackX;\n trailNextArr[vIdx + 1] = fallbackY;\n trailNextArr[vIdx + 2] = fallbackZ;\n trailNextArr[vIdx + 3] = fallbackX;\n trailNextArr[vIdx + 4] = fallbackY;\n trailNextArr[vIdx + 5] = fallbackZ;\n trailHalfWidthArr[aIdx] = 0;\n trailHalfWidthArr[aIdx + 1] = 0;\n trailUVArr[uvIdx] = 0;\n trailUVArr[uvIdx + 1] = 0;\n trailUVArr[uvIdx + 2] = 0;\n trailUVArr[uvIdx + 3] = 0;\n trailAlphaArr[aIdx] = 0;\n trailAlphaArr[aIdx + 1] = 0;\n trailColorArr[cIdx] = 0;\n trailColorArr[cIdx + 1] = 0;\n trailColorArr[cIdx + 2] = 0;\n trailColorArr[cIdx + 3] = 0;\n trailColorArr[cIdx + 4] = 0;\n trailColorArr[cIdx + 5] = 0;\n trailColorArr[cIdx + 6] = 0;\n trailColorArr[cIdx + 7] = 0;\n};\n\n/**\n * Writes a single trail ribbon vertex pair (left+right) into the typed arrays.\n */\nconst writeTrailVertex = (\n vIdx: number,\n cIdx: number,\n aIdx: number,\n uvIdx: number,\n hx: number,\n hy: number,\n hz: number,\n nx: number,\n ny: number,\n nz: number,\n halfWidth: number,\n t: number,\n alpha: number,\n fr: number,\n fg: number,\n fb: number,\n ca: number,\n trailPosArr: Float32Array,\n trailNextArr: Float32Array,\n trailHalfWidthArr: Float32Array,\n trailUVArr: Float32Array,\n trailAlphaArr: Float32Array,\n trailColorArr: Float32Array\n) => {\n trailPosArr[vIdx] = hx;\n trailPosArr[vIdx + 1] = hy;\n trailPosArr[vIdx + 2] = hz;\n trailPosArr[vIdx + 3] = hx;\n trailPosArr[vIdx + 4] = hy;\n trailPosArr[vIdx + 5] = hz;\n trailNextArr[vIdx] = nx;\n trailNextArr[vIdx + 1] = ny;\n trailNextArr[vIdx + 2] = nz;\n trailNextArr[vIdx + 3] = nx;\n trailNextArr[vIdx + 4] = ny;\n trailNextArr[vIdx + 5] = nz;\n trailHalfWidthArr[aIdx] = halfWidth;\n trailHalfWidthArr[aIdx + 1] = halfWidth;\n trailUVArr[uvIdx] = 0;\n trailUVArr[uvIdx + 1] = t;\n trailUVArr[uvIdx + 2] = 1;\n trailUVArr[uvIdx + 3] = t;\n trailAlphaArr[aIdx] = alpha;\n trailAlphaArr[aIdx + 1] = alpha;\n trailColorArr[cIdx] = fr;\n trailColorArr[cIdx + 1] = fg;\n trailColorArr[cIdx + 2] = fb;\n trailColorArr[cIdx + 3] = ca;\n trailColorArr[cIdx + 4] = fr;\n trailColorArr[cIdx + 5] = fg;\n trailColorArr[cIdx + 6] = fb;\n trailColorArr[cIdx + 7] = ca;\n};\n\n// Scratch buffers reused each frame to avoid per-particle allocations\nlet _rawPoints: Float32Array | null = null;\nlet _rawPointsSize = 0;\nlet _smoothedPoints: Float32Array | null = null;\nlet _smoothedPointsSize = 0;\n// Scratch buffer for connected ribbon particle indices (reused each frame).\n// Uint32 so systems with more than 65535 particles don't silently wrap.\nlet _ribbonIndices: Uint32Array | null = null;\nlet _ribbonIndicesSize = 0;\nlet _ribbonCount = 0;\n\n/**\n * Records current particle positions into the history ring buffer,\n * then rebuilds the triangle-strip ribbon geometry for all active particles.\n *\n * Supports:\n * - Adaptive sampling (minVertexDistance): frame-rate independent trail density\n * - Max time (maxTime): time-based trail expiry\n * - Catmull-Rom smoothing: eliminates sharp kinks between samples\n * - Twist prevention: consistent ribbon orientation during rapid direction changes\n * - Connected ribbons (ribbonId): multiple particles forming a single ribbon\n */\nconst updateTrailGeometry = (props: ParticleSystemInstance, now: number) => {\n const {\n generalData,\n trailPositionAttr,\n trailAlphaAttr,\n trailColorAttr,\n trailNextAttr: trailNextAttrCached,\n trailHalfWidthAttr: trailHalfWidthAttrCached,\n trailUVAttr: trailUVAttrCached,\n trailWidthCurveFn,\n trailOpacityCurveFn,\n trailColorOverTrailFns,\n trailConfig,\n mappedAttributes: ma,\n } = props;\n\n if (\n !trailPositionAttr ||\n !trailAlphaAttr ||\n !trailColorAttr ||\n !trailNextAttrCached ||\n !trailHalfWidthAttrCached ||\n !trailUVAttrCached ||\n !trailWidthCurveFn ||\n !trailOpacityCurveFn ||\n !trailConfig ||\n !generalData.positionHistory ||\n !generalData.positionHistoryIndex ||\n !generalData.positionHistoryCount\n )\n return;\n\n const trailLength = trailConfig.length;\n const positionHistory = generalData.positionHistory;\n const historyIndex = generalData.positionHistoryIndex;\n const historyCount = generalData.positionHistoryCount;\n const sampleTimes = generalData.trailSampleTimes;\n const lastSampledPos = generalData.trailLastSampledPosition;\n const prevNormal = generalData.trailPrevNormal;\n const minVertexDist = trailConfig.minVertexDistance;\n const minVertexDistSq = minVertexDist * minVertexDist;\n const maxTime = trailConfig.maxTime;\n const maxTimeMs = maxTime * 1000;\n const useSmoothing = trailConfig.smoothing;\n const subdivisions = trailConfig.smoothingSubdivisions;\n const useTwistPrevention = trailConfig.twistPrevention;\n const ribbonId = trailConfig.ribbonId;\n\n const trailScalarArr = props.scalarArray;\n const positionArr = ma.position.array;\n // Vertex-buffer fill counts from the previous frame ??? cleared slots stay\n // cleared (zero alpha/half-width), so re-clearing them every frame is\n // redundant work proportional to maxParticles ?? trailLength.\n const prevFilled = generalData.trailPrevFilledCount;\n\n const trailPosArr = trailPositionAttr.array as Float32Array;\n const trailAlphaArr = trailAlphaAttr.array as Float32Array;\n const trailColorArr = trailColorAttr.array as Float32Array;\n const trailNextArr = trailNextAttrCached.array as Float32Array;\n const trailUVArr = trailUVAttrCached.array as Float32Array;\n const trailHalfWidthArr = trailHalfWidthAttrCached.array as Float32Array;\n const verticesPerParticle = trailLength * 2;\n const hwm = generalData.highWaterIndex;\n const creationTimesLength = hwm > 0 ? hwm : generalData.creationTimes.length;\n let hasUpdates = false;\n\n // --- Connected Ribbons: collect particles sharing the same ribbonId ---\n const useRibbon = ribbonId !== undefined;\n let ribbonLeader = -1;\n if (useRibbon) {\n // Pre-allocate scratch buffer for ribbon indices\n if (!_ribbonIndices || _ribbonIndicesSize < creationTimesLength) {\n _ribbonIndices = new Uint32Array(creationTimesLength);\n _ribbonIndicesSize = creationTimesLength;\n }\n _ribbonCount = 0;\n for (let i = 0; i < creationTimesLength; i++) {\n if (trailScalarArr[i * SCALAR_STRIDE + S_IS_ACTIVE])\n _ribbonIndices[_ribbonCount++] = i;\n }\n // Insertion sort by creation time (typically nearly-sorted, O(n) best case)\n for (let i = 1; i < _ribbonCount; i++) {\n const key = _ribbonIndices[i];\n const keyTime = generalData.creationTimes[key];\n let j = i - 1;\n while (j >= 0 && generalData.creationTimes[_ribbonIndices[j]] > keyTime) {\n _ribbonIndices[j + 1] = _ribbonIndices[j];\n j--;\n }\n _ribbonIndices[j + 1] = key;\n }\n if (_ribbonCount > 0) ribbonLeader = _ribbonIndices[0];\n }\n\n for (let index = 0; index < creationTimesLength; index++) {\n const vertBase = index * verticesPerParticle;\n\n if (trailScalarArr[index * SCALAR_STRIDE + S_IS_ACTIVE]) {\n // Skip individual trail build for non-leader ribbon particles\n // (the leader's trail will be built by the connected ribbon section)\n if (useRibbon && _ribbonCount >= 2 && index !== ribbonLeader) {\n // Still record position history for this particle (needed for sampling)\n const posIdx = index * 3;\n const px = positionArr[posIdx];\n const py = positionArr[posIdx + 1];\n const pz = positionArr[posIdx + 2];\n const histBase = (index * trailLength + historyIndex[index]) * 3;\n positionHistory[histBase] = px;\n positionHistory[histBase + 1] = py;\n positionHistory[histBase + 2] = pz;\n if (sampleTimes) {\n sampleTimes[index * trailLength + historyIndex[index]] = now;\n }\n historyIndex[index] = (historyIndex[index] + 1) % trailLength;\n if (historyCount[index] < trailLength) historyCount[index]++;\n continue;\n }\n hasUpdates = true;\n const posIdx = index * 3;\n const px = positionArr[posIdx];\n const py = positionArr[posIdx + 1];\n const pz = positionArr[posIdx + 2];\n\n // --- Adaptive Sampling: only push a new sample if distance threshold met ---\n let shouldSample = true;\n if (minVertexDist > 0 && lastSampledPos && historyCount[index] > 0) {\n const lsIdx = index * 3;\n const dx = px - lastSampledPos[lsIdx];\n const dy = py - lastSampledPos[lsIdx + 1];\n const dz = pz - lastSampledPos[lsIdx + 2];\n if (dx * dx + dy * dy + dz * dz < minVertexDistSq) {\n shouldSample = false;\n }\n }\n\n if (shouldSample) {\n // Record the sample\n const histBase = (index * trailLength + historyIndex[index]) * 3;\n positionHistory[histBase] = px;\n positionHistory[histBase + 1] = py;\n positionHistory[histBase + 2] = pz;\n\n // Record timestamp for maxTime\n if (sampleTimes) {\n sampleTimes[index * trailLength + historyIndex[index]] = now;\n }\n\n historyIndex[index] = (historyIndex[index] + 1) % trailLength;\n if (historyCount[index] < trailLength) historyCount[index]++;\n\n // Update last sampled position\n if (lastSampledPos) {\n const lsIdx = index * 3;\n lastSampledPos[lsIdx] = px;\n lastSampledPos[lsIdx + 1] = py;\n lastSampledPos[lsIdx + 2] = pz;\n }\n }\n\n // --- MaxTime: determine effective count (expire old segments) ---\n let rawCount = historyCount[index];\n let effectiveCount = rawCount;\n if (maxTime > 0 && sampleTimes && rawCount > 0) {\n const sampleBase = index * trailLength;\n effectiveCount = 0;\n for (let s = 0; s < rawCount; s++) {\n const sampleSlot =\n (historyIndex[index] - 1 - s + trailLength * 2) % trailLength;\n const age = now - sampleTimes[sampleBase + sampleSlot];\n if (age <= maxTimeMs) {\n effectiveCount++;\n } else {\n break; // older samples are even older, stop\n }\n }\n }\n\n const count = effectiveCount;\n const ribbonWidth = trailConfig.width;\n\n // Get particle color from interleaved scalar buffer\n const trailBase = index * SCALAR_STRIDE;\n const cr = trailScalarArr[trailBase + S_COLOR_R];\n const cg = trailScalarArr[trailBase + S_COLOR_G];\n const cb = trailScalarArr[trailBase + S_COLOR_B];\n const ca = trailScalarArr[trailBase + S_COLOR_A];\n\n const ringOff = index * trailLength * 3;\n\n // --- Collect raw history points for this particle ---\n // We need them for both smoothing and the ribbon build.\n // rawPts: flat array of [x, y, z, x, y, z, ...] for count entries\n // rawPts[0..2] = head (most recent), rawPts[(count-1)*3..(count-1)*3+2] = tail\n const rawPtsSize = count * 3;\n // Reuse a scratch float array for raw points\n if (!_rawPoints || _rawPointsSize < rawPtsSize) {\n _rawPoints = new Float32Array(rawPtsSize);\n _rawPointsSize = rawPtsSize;\n }\n const rawPts = _rawPoints;\n for (let s = 0; s < count; s++) {\n const histSlot =\n ((historyIndex[index] - 1 - s + trailLength * 2) % trailLength) * 3 +\n ringOff;\n rawPts[s * 3] = positionHistory[histSlot];\n rawPts[s * 3 + 1] = positionHistory[histSlot + 1];\n rawPts[s * 3 + 2] = positionHistory[histSlot + 2];\n }\n\n // --- Catmull-Rom Smoothing ---\n let finalPts: Float32Array;\n let finalCount: number;\n\n if (useSmoothing && count >= 3) {\n // Interpolate between each pair of raw points with subdivisions\n const segmentCount = count - 1;\n finalCount = segmentCount * subdivisions + 1;\n const neededSize = finalCount * 3;\n\n // Resize global scratch buffer if needed\n if (!_smoothedPoints || _smoothedPointsSize < neededSize) {\n _smoothedPoints = new Float32Array(neededSize);\n _smoothedPointsSize = neededSize;\n }\n finalPts = _smoothedPoints;\n\n for (let seg = 0; seg < segmentCount; seg++) {\n // Control points: p0, p1, p2, p3\n const i0 = Math.max(0, seg - 1);\n const i1 = seg;\n const i2 = Math.min(count - 1, seg + 1);\n const i3 = Math.min(count - 1, seg + 2);\n\n const p0x = rawPts[i0 * 3],\n p0y = rawPts[i0 * 3 + 1],\n p0z = rawPts[i0 * 3 + 2];\n const p1x = rawPts[i1 * 3],\n p1y = rawPts[i1 * 3 + 1],\n p1z = rawPts[i1 * 3 + 2];\n const p2x = rawPts[i2 * 3],\n p2y = rawPts[i2 * 3 + 1],\n p2z = rawPts[i2 * 3 + 2];\n const p3x = rawPts[i3 * 3],\n p3y = rawPts[i3 * 3 + 1],\n p3z = rawPts[i3 * 3 + 2];\n\n for (let sub = 0; sub < subdivisions; sub++) {\n const t = sub / subdivisions;\n const outIdx = (seg * subdivisions + sub) * 3;\n catmullRom(\n finalPts,\n outIdx,\n p0x,\n p0y,\n p0z,\n p1x,\n p1y,\n p1z,\n p2x,\n p2y,\n p2z,\n p3x,\n p3y,\n p3z,\n t\n );\n }\n }\n // Last point = last raw point\n const lastOutIdx = (finalCount - 1) * 3;\n finalPts[lastOutIdx] = rawPts[(count - 1) * 3];\n finalPts[lastOutIdx + 1] = rawPts[(count - 1) * 3 + 1];\n finalPts[lastOutIdx + 2] = rawPts[(count - 1) * 3 + 2];\n } else {\n finalPts = rawPts;\n finalCount = count;\n }\n\n // Limit final count to the number of slots we can fill\n if (finalCount > trailLength) finalCount = trailLength;\n\n // Collapse degenerate segments: when two consecutive smoothed points are\n // nearly identical the shader tangent becomes zero, producing distorted\n // \"squished\" ribbon quads. Shift such points to the next distinct neighbor.\n if (useSmoothing && finalCount >= 2) {\n const MIN_SEG_DIST_SQ = 0.0001 * 0.0001;\n for (let d = 1; d < finalCount; d++) {\n const pi = (d - 1) * 3;\n const ci = d * 3;\n const dx = finalPts[ci] - finalPts[pi];\n const dy = finalPts[ci + 1] - finalPts[pi + 1];\n const dz = finalPts[ci + 2] - finalPts[pi + 2];\n if (dx * dx + dy * dy + dz * dz < MIN_SEG_DIST_SQ) {\n // Snap to previous point ??? the shader will get a near-zero tangent\n // but the vertex pair collapses to the same position, hiding it\n finalPts[ci] = finalPts[pi];\n finalPts[ci + 1] = finalPts[pi + 1];\n finalPts[ci + 2] = finalPts[pi + 2];\n }\n }\n }\n\n // --- Build ribbon vertices ---\n const prevFilledSlots = prevFilled ? prevFilled[index] : trailLength;\n if (prevFilled) prevFilled[index] = finalCount;\n for (let s = 0; s < trailLength; s++) {\n const vIdx = (vertBase + s * 2) * 3;\n const cIdx = (vertBase + s * 2) * 4;\n const aIdx = vertBase + s * 2;\n const uvIdxBase = (vertBase + s * 2) * 2;\n\n if (s >= finalCount) {\n // Slots at or beyond the previous fill count are already cleared.\n if (s >= prevFilledSlots) break;\n clearTrailVertex(\n vIdx,\n cIdx,\n aIdx,\n uvIdxBase,\n trailPosArr,\n trailNextArr,\n trailHalfWidthArr,\n trailUVArr,\n trailAlphaArr,\n trailColorArr,\n px,\n py,\n pz\n );\n continue;\n }\n\n const hx = finalPts[s * 3];\n const hy = finalPts[s * 3 + 1];\n const hz = finalPts[s * 3 + 2];\n\n // Compute an averaged tangent direction for the shader.\n // At interior points we average the forward and backward segment\n // directions so the billboard plane transitions smoothly through\n // bends instead of snapping per-segment.\n let nx: number, ny: number, nz: number;\n if (s > 0 && s < finalCount - 1) {\n // Interior: average of (prev???current) and (current???next)\n const px2 = finalPts[(s - 1) * 3];\n const py2 = finalPts[(s - 1) * 3 + 1];\n const pz2 = finalPts[(s - 1) * 3 + 2];\n const nx2 = finalPts[(s + 1) * 3];\n const ny2 = finalPts[(s + 1) * 3 + 1];\n const nz2 = finalPts[(s + 1) * 3 + 2];\n // Averaged tangent = (current - prev) + (next - current) = next - prev\n const atx = nx2 - px2;\n const aty = ny2 - py2;\n const atz = nz2 - pz2;\n const atLen = Math.sqrt(atx * atx + aty * aty + atz * atz);\n if (atLen > 0.0001) {\n // trailNext = current + normalized averaged tangent (shader computes tangent as trailNext - position)\n nx = hx + atx / atLen;\n ny = hy + aty / atLen;\n nz = hz + atz / atLen;\n } else {\n nx = finalPts[(s + 1) * 3];\n ny = finalPts[(s + 1) * 3 + 1];\n nz = finalPts[(s + 1) * 3 + 2];\n }\n } else if (s < finalCount - 1) {\n // Head: use forward direction\n nx = finalPts[(s + 1) * 3];\n ny = finalPts[(s + 1) * 3 + 1];\n nz = finalPts[(s + 1) * 3 + 2];\n } else if (finalCount >= 2) {\n // Tail: reuse the direction from the previous segment so the\n // ribbon end keeps the same orientation as the last real segment\n // instead of collapsing when the tangent aligns with the Y axis.\n const prevX = finalPts[(s - 1) * 3];\n const prevY = finalPts[(s - 1) * 3 + 1];\n const prevZ = finalPts[(s - 1) * 3 + 2];\n nx = hx + (hx - prevX);\n ny = hy + (hy - prevY);\n nz = hz + (hz - prevZ);\n } else {\n // Single point: nudge to avoid zero tangent\n nx = hx;\n ny = hy + 0.001;\n nz = hz;\n }\n\n // Trail percentage (0=head, 1=tail)\n const t = finalCount > 1 ? s / (finalCount - 1) : 0;\n\n // --- MaxTime: apply additional age-based fade ---\n let timeFade = 1.0;\n if (maxTime > 0 && sampleTimes && effectiveCount > 0) {\n // Map the current smoothed vertex back to the raw sample timeline.\n // When smoothing is active we interpolate between the two bracketing\n // raw samples' timestamps so the fade is smooth instead of stepping.\n const sampleBase = index * trailLength;\n if (useSmoothing && rawCount >= 2) {\n const rawF = (s / Math.max(finalCount - 1, 1)) * (rawCount - 1);\n const rawLo = Math.min(Math.floor(rawF), rawCount - 1);\n const rawHi = Math.min(rawLo + 1, rawCount - 1);\n const frac = rawF - rawLo;\n const slotLo =\n (historyIndex[index] - 1 - rawLo + trailLength * 2) % trailLength;\n const slotHi =\n (historyIndex[index] - 1 - rawHi + trailLength * 2) % trailLength;\n const ageLo = now - sampleTimes[sampleBase + slotLo];\n const ageHi = now - sampleTimes[sampleBase + slotHi];\n const age = ageLo + (ageHi - ageLo) * frac;\n timeFade = 1.0 - Math.min(age / maxTimeMs, 1.0);\n } else {\n const rawS = Math.min(s, rawCount - 1);\n const sampleSlot =\n (historyIndex[index] - 1 - rawS + trailLength * 2) % trailLength;\n const age = now - sampleTimes[sampleBase + sampleSlot];\n timeFade = 1.0 - Math.min(age / maxTimeMs, 1.0);\n }\n }\n\n const widthScale = trailWidthCurveFn(t);\n const opacityScale = trailOpacityCurveFn(t);\n const halfWidth = ribbonWidth * widthScale * 0.5;\n const alpha = ca * opacityScale * timeFade;\n\n const fr = trailColorOverTrailFns\n ? cr * trailColorOverTrailFns.r(t)\n : cr;\n const fg = trailColorOverTrailFns\n ? cg * trailColorOverTrailFns.g(t)\n : cg;\n const fb = trailColorOverTrailFns\n ? cb * trailColorOverTrailFns.b(t)\n : cb;\n\n writeTrailVertex(\n vIdx,\n cIdx,\n aIdx,\n uvIdxBase,\n hx,\n hy,\n hz,\n nx,\n ny,\n nz,\n halfWidth,\n t,\n alpha,\n fr,\n fg,\n fb,\n ca,\n trailPosArr,\n trailNextArr,\n trailHalfWidthArr,\n trailUVArr,\n trailAlphaArr,\n trailColorArr\n );\n }\n\n // --- Twist Prevention ---\n // After building the ribbon, ensure ribbon normals are consistent.\n // We compare the implied normal direction of consecutive segments and\n // flip if the dot product with the previous frame's normal is negative.\n if (useTwistPrevention && prevNormal && finalCount >= 2) {\n const nIdx = index * 3;\n // Compute current head tangent\n const tx = finalPts[3] - finalPts[0];\n const ty = finalPts[4] - finalPts[1];\n const tz = finalPts[5] - finalPts[2];\n const tLen = Math.sqrt(tx * tx + ty * ty + tz * tz);\n if (tLen > 0.0001) {\n const ntx = tx / tLen;\n const nty = ty / tLen;\n const ntz = tz / tLen;\n // Use a consistent up vector to compute a reference normal\n let upx = 0,\n upy = 1,\n upz = 0;\n const dot = ntx * upx + nty * upy + ntz * upz;\n if (Math.abs(dot) > 0.999) {\n upx = 1;\n upy = 0;\n upz = 0;\n }\n // cross(tangent, up) = normal\n let cnx = nty * upz - ntz * upy;\n let cny = ntz * upx - ntx * upz;\n let cnz = ntx * upy - nty * upx;\n const cnLen = Math.sqrt(cnx * cnx + cny * cny + cnz * cnz);\n if (cnLen > 0.0001) {\n cnx /= cnLen;\n cny /= cnLen;\n cnz /= cnLen;\n }\n\n // Check dot product with previous normal ??? if negative, flip\n const prevNx = prevNormal[nIdx];\n const prevNy = prevNormal[nIdx + 1];\n const prevNz = prevNormal[nIdx + 2];\n const hasPrev = prevNx !== 0 || prevNy !== 0 || prevNz !== 0;\n if (hasPrev) {\n const normalDot = cnx * prevNx + cny * prevNy + cnz * prevNz;\n if (normalDot < 0) {\n // Flip all ribbon offsets for this particle by swapping left/right half-widths\n for (let s = 0; s < Math.min(finalCount, trailLength); s++) {\n const aIdx = vertBase + s * 2;\n const hw = trailHalfWidthArr[aIdx];\n trailHalfWidthArr[aIdx] = -hw;\n trailHalfWidthArr[aIdx + 1] = -hw;\n }\n // Also flip the stored normal for next frame\n cnx = -cnx;\n cny = -cny;\n cnz = -cnz;\n }\n }\n\n // Store current normal for next frame\n prevNormal[nIdx] = cnx;\n prevNormal[nIdx + 1] = cny;\n prevNormal[nIdx + 2] = cnz;\n }\n }\n } else if (\n historyCount[index] > 0 ||\n (prevFilled && prevFilled[index] > 0)\n ) {\n // Particle just became inactive ??? collapse ribbon and clear history once\n hasUpdates = true;\n historyCount[index] = 0;\n historyIndex[index] = 0;\n const clearSlots = prevFilled ? prevFilled[index] : trailLength;\n if (prevFilled) prevFilled[index] = 0;\n for (let s = 0; s < clearSlots; s++) {\n const vIdx = (vertBase + s * 2) * 3;\n const cIdx = (vertBase + s * 2) * 4;\n const aIdx = vertBase + s * 2;\n const uvIdxBase = (vertBase + s * 2) * 2;\n clearTrailVertex(\n vIdx,\n cIdx,\n aIdx,\n uvIdxBase,\n trailPosArr,\n trailNextArr,\n trailHalfWidthArr,\n trailUVArr,\n trailAlphaArr,\n trailColorArr,\n 0,\n 0,\n 0\n );\n }\n }\n }\n\n // --- Connected Ribbons: chain particle positions with Catmull-Rom interpolation ---\n if (useRibbon && _ribbonCount >= 2 && _ribbonIndices) {\n hasUpdates = true;\n const leader = _ribbonIndices[0];\n const leaderVertBase = leader * verticesPerParticle;\n\n // The ribbon uses each particle's current position as a control point,\n // then fills `trailLength` vertices by Catmull-Rom interpolation between them.\n // This produces a smooth, continuous ribbon through all particle positions.\n const controlCount = _ribbonCount;\n const filledCount = Math.min(\n trailLength,\n Math.max(controlCount * 4, controlCount)\n );\n const chainSize = filledCount * 3;\n if (!_rawPoints || _rawPointsSize < chainSize) {\n _rawPoints = new Float32Array(chainSize);\n _rawPointsSize = chainSize;\n }\n\n if (controlCount === 2) {\n // Only 2 particles: linearly interpolate between them\n const p0Idx = _ribbonIndices[0] * 3;\n const p1Idx = _ribbonIndices[1] * 3;\n for (let i = 0; i < filledCount; i++) {\n const t = i / (filledCount - 1);\n _rawPoints[i * 3] =\n positionArr[p0Idx] + t * (positionArr[p1Idx] - positionArr[p0Idx]);\n _rawPoints[i * 3 + 1] =\n positionArr[p0Idx + 1] +\n t * (positionArr[p1Idx + 1] - positionArr[p0Idx + 1]);\n _rawPoints[i * 3 + 2] =\n positionArr[p0Idx + 2] +\n t * (positionArr[p1Idx + 2] - positionArr[p0Idx + 2]);\n }\n } else {\n // 3+ particles: Catmull-Rom interpolation through all control points\n const segments = controlCount - 1;\n const ptsPerSeg = Math.max(1, Math.floor((filledCount - 1) / segments));\n let wi = 0;\n for (let seg = 0; seg < segments && wi < filledCount; seg++) {\n const i0 = Math.max(0, seg - 1);\n const i1 = seg;\n const i2 = Math.min(controlCount - 1, seg + 1);\n const i3 = Math.min(controlCount - 1, seg + 2);\n const p0i = _ribbonIndices[i0] * 3;\n const p1i = _ribbonIndices[i1] * 3;\n const p2i = _ribbonIndices[i2] * 3;\n const p3i = _ribbonIndices[i3] * 3;\n const subCount = seg === segments - 1 ? filledCount - wi : ptsPerSeg;\n for (let sub = 0; sub < subCount && wi < filledCount; sub++) {\n const t = sub / subCount;\n catmullRom(\n _rawPoints,\n wi * 3,\n positionArr[p0i],\n positionArr[p0i + 1],\n positionArr[p0i + 2],\n positionArr[p1i],\n positionArr[p1i + 1],\n positionArr[p1i + 2],\n positionArr[p2i],\n positionArr[p2i + 1],\n positionArr[p2i + 2],\n positionArr[p3i],\n positionArr[p3i + 1],\n positionArr[p3i + 2],\n t\n );\n wi++;\n }\n }\n // Ensure last point is the last particle's position\n if (wi > 0) {\n const lastPIdx = _ribbonIndices[controlCount - 1] * 3;\n _rawPoints[(wi - 1) * 3] = positionArr[lastPIdx];\n _rawPoints[(wi - 1) * 3 + 1] = positionArr[lastPIdx + 1];\n _rawPoints[(wi - 1) * 3 + 2] = positionArr[lastPIdx + 2];\n }\n }\n\n const leaderBase = leader * SCALAR_STRIDE;\n const leaderCr = trailScalarArr[leaderBase + S_COLOR_R];\n const leaderCg = trailScalarArr[leaderBase + S_COLOR_G];\n const leaderCb = trailScalarArr[leaderBase + S_COLOR_B];\n const leaderCa = trailScalarArr[leaderBase + S_COLOR_A];\n\n const leaderPrevFilled = prevFilled ? prevFilled[leader] : trailLength;\n if (prevFilled) prevFilled[leader] = filledCount;\n for (let s = 0; s < trailLength; s++) {\n const vIdx = (leaderVertBase + s * 2) * 3;\n const cIdx = (leaderVertBase + s * 2) * 4;\n const aIdx = leaderVertBase + s * 2;\n const uvIdxBase = (leaderVertBase + s * 2) * 2;\n\n if (s >= filledCount) {\n // Slots at or beyond the previous fill count are already cleared.\n if (s >= leaderPrevFilled) break;\n clearTrailVertex(\n vIdx,\n cIdx,\n aIdx,\n uvIdxBase,\n trailPosArr,\n trailNextArr,\n trailHalfWidthArr,\n trailUVArr,\n trailAlphaArr,\n trailColorArr,\n 0,\n 0,\n 0\n );\n continue;\n }\n\n const ptIdx = s * 3;\n const ptx = _rawPoints[ptIdx];\n const pty = _rawPoints[ptIdx + 1];\n const ptz = _rawPoints[ptIdx + 2];\n\n // Averaged tangent for interior points\n let nx: number, ny: number, nz: number;\n if (s > 0 && s < filledCount - 1) {\n const px2 = _rawPoints[(s - 1) * 3];\n const py2 = _rawPoints[(s - 1) * 3 + 1];\n const pz2 = _rawPoints[(s - 1) * 3 + 2];\n const nx2 = _rawPoints[(s + 1) * 3];\n const ny2 = _rawPoints[(s + 1) * 3 + 1];\n const nz2 = _rawPoints[(s + 1) * 3 + 2];\n const atx = nx2 - px2;\n const aty = ny2 - py2;\n const atz = nz2 - pz2;\n const atLen = Math.sqrt(atx * atx + aty * aty + atz * atz);\n if (atLen > 0.0001) {\n nx = ptx + atx / atLen;\n ny = pty + aty / atLen;\n nz = ptz + atz / atLen;\n } else {\n nx = _rawPoints[(s + 1) * 3];\n ny = _rawPoints[(s + 1) * 3 + 1];\n nz = _rawPoints[(s + 1) * 3 + 2];\n }\n } else if (s < filledCount - 1) {\n nx = _rawPoints[(s + 1) * 3];\n ny = _rawPoints[(s + 1) * 3 + 1];\n nz = _rawPoints[(s + 1) * 3 + 2];\n } else if (filledCount >= 2) {\n // Tail: reuse previous segment direction\n const prevX = _rawPoints[(s - 1) * 3];\n const prevY = _rawPoints[(s - 1) * 3 + 1];\n const prevZ = _rawPoints[(s - 1) * 3 + 2];\n nx = ptx + (ptx - prevX);\n ny = pty + (pty - prevY);\n nz = ptz + (ptz - prevZ);\n } else {\n nx = ptx;\n ny = pty + 0.001;\n nz = ptz;\n }\n\n const t = filledCount > 1 ? s / (filledCount - 1) : 0;\n\n // --- MaxTime: apply age-based fade to connected ribbon ---\n let ribbonTimeFade = 1.0;\n if (maxTime > 0 && controlCount >= 2) {\n // Map the vertex to the nearest control point(s) and use\n // their creation times to compute an interpolated age.\n const ctrlF = t * (controlCount - 1);\n const ctrlLo = Math.min(Math.floor(ctrlF), controlCount - 1);\n const ctrlHi = Math.min(ctrlLo + 1, controlCount - 1);\n const frac = ctrlF - ctrlLo;\n const ageLo = now - generalData.creationTimes[_ribbonIndices[ctrlLo]];\n const ageHi = now - generalData.creationTimes[_ribbonIndices[ctrlHi]];\n const age = ageLo + (ageHi - ageLo) * frac;\n ribbonTimeFade = 1.0 - Math.min(age / maxTimeMs, 1.0);\n }\n\n const widthScale = trailWidthCurveFn(t);\n const opacityScale = trailOpacityCurveFn(t);\n const halfWidth = trailConfig.width * widthScale * 0.5;\n const alpha = leaderCa * opacityScale * ribbonTimeFade;\n const fr = trailColorOverTrailFns\n ? leaderCr * trailColorOverTrailFns.r(t)\n : leaderCr;\n const fg = trailColorOverTrailFns\n ? leaderCg * trailColorOverTrailFns.g(t)\n : leaderCg;\n const fb = trailColorOverTrailFns\n ? leaderCb * trailColorOverTrailFns.b(t)\n : leaderCb;\n\n writeTrailVertex(\n vIdx,\n cIdx,\n aIdx,\n uvIdxBase,\n ptx,\n pty,\n ptz,\n nx,\n ny,\n nz,\n halfWidth,\n t,\n alpha,\n fr,\n fg,\n fb,\n leaderCa,\n trailPosArr,\n trailNextArr,\n trailHalfWidthArr,\n trailUVArr,\n trailAlphaArr,\n trailColorArr\n );\n }\n\n // --- Twist Prevention for connected ribbon (applied to leader) ---\n if (useTwistPrevention && prevNormal && filledCount >= 2) {\n const nIdx = leader * 3;\n const tx = _rawPoints[3] - _rawPoints[0];\n const ty = _rawPoints[4] - _rawPoints[1];\n const tz = _rawPoints[5] - _rawPoints[2];\n const tLen = Math.sqrt(tx * tx + ty * ty + tz * tz);\n if (tLen > 0.0001) {\n const ntx = tx / tLen;\n const nty = ty / tLen;\n const ntz = tz / tLen;\n let upx = 0,\n upy = 1,\n upz = 0;\n const dot = ntx * upx + nty * upy + ntz * upz;\n if (Math.abs(dot) > 0.999) {\n upx = 1;\n upy = 0;\n upz = 0;\n }\n let cnx = nty * upz - ntz * upy;\n let cny = ntz * upx - ntx * upz;\n let cnz = ntx * upy - nty * upx;\n const cnLen = Math.sqrt(cnx * cnx + cny * cny + cnz * cnz);\n if (cnLen > 0.0001) {\n cnx /= cnLen;\n cny /= cnLen;\n cnz /= cnLen;\n }\n const prevNx = prevNormal[nIdx];\n const prevNy = prevNormal[nIdx + 1];\n const prevNz = prevNormal[nIdx + 2];\n const hasPrev = prevNx !== 0 || prevNy !== 0 || prevNz !== 0;\n if (hasPrev) {\n const normalDot = cnx * prevNx + cny * prevNy + cnz * prevNz;\n if (normalDot < 0) {\n for (let s = 0; s < Math.min(filledCount, trailLength); s++) {\n const aIdx = leaderVertBase + s * 2;\n const hw = trailHalfWidthArr[aIdx];\n trailHalfWidthArr[aIdx] = -hw;\n trailHalfWidthArr[aIdx + 1] = -hw;\n }\n cnx = -cnx;\n cny = -cny;\n cnz = -cnz;\n }\n }\n prevNormal[nIdx] = cnx;\n prevNormal[nIdx + 1] = cny;\n prevNormal[nIdx + 2] = cnz;\n }\n }\n\n // Clear non-leader ribbon particles' trail vertices (only the slots that\n // were actually filled ??? already-cleared buffers are skipped entirely)\n for (let ri = 1; ri < _ribbonCount; ri++) {\n const pIdx = _ribbonIndices[ri];\n const pVertBase = pIdx * verticesPerParticle;\n const pClearSlots = prevFilled ? prevFilled[pIdx] : trailLength;\n if (prevFilled) prevFilled[pIdx] = 0;\n for (let s = 0; s < pClearSlots; s++) {\n const vIdx = (pVertBase + s * 2) * 3;\n const cIdx = (pVertBase + s * 2) * 4;\n const aIdx = pVertBase + s * 2;\n const uvIdxBase = (pVertBase + s * 2) * 2;\n clearTrailVertex(\n vIdx,\n cIdx,\n aIdx,\n uvIdxBase,\n trailPosArr,\n trailNextArr,\n trailHalfWidthArr,\n trailUVArr,\n trailAlphaArr,\n trailColorArr,\n 0,\n 0,\n 0\n );\n }\n }\n }\n\n if (hasUpdates) {\n trailPositionAttr.needsUpdate = true;\n trailAlphaAttr.needsUpdate = true;\n trailColorAttr.needsUpdate = true;\n trailNextAttrCached.needsUpdate = true;\n trailHalfWidthAttrCached.needsUpdate = true;\n trailUVAttrCached.needsUpdate = true;\n }\n};\n\nexport const updateParticleSystems = (cycleData: CycleData) => {\n createdParticleSystems.forEach((props) =>\n updateParticleSystemInstance(props, cycleData)\n );\n};\n\n","import * as THREE from 'three';\nimport {\n CurveFunctionId,\n curveFunctionIdMap,\n getCurveFunction,\n} from './three-particles-curves.js';\nimport {\n CollisionPlaneMode,\n ForceFieldFalloff,\n ForceFieldType,\n LifeTimeCurve,\n} from './three-particles-enums.js';\nimport { blendingMap } from './three-particles.js';\nimport type {\n BezierCurve,\n CollisionPlaneConfig,\n CurveFunction,\n EasingCurve,\n ForceFieldConfig,\n LifetimeCurve,\n ParticleSystemConfig,\n} from './types.js';\n\n/** Current serialization format version */\nconst SERIALIZATION_VERSION = 1;\n\ntype BlendingKey = keyof typeof blendingMap;\ntype RawObject = Record<string, unknown>;\n\n// Reverse blending map: THREE.Blending number ??? string key\nconst reverseBlendingMap = new Map<number, BlendingKey>(\n (Object.entries(blendingMap) as [BlendingKey, number][]).map(([k, v]) => [\n v,\n k,\n ])\n);\n\n// Reverse curve function map: function reference ??? CurveFunctionId string\nconst reverseCurveFunctionMap = new Map<CurveFunction, string>();\nfor (const [id, fn] of Object.entries(curveFunctionIdMap) as [\n string,\n CurveFunction,\n][]) {\n if (fn) reverseCurveFunctionMap.set(fn, id);\n}\n\n// ????????? SERIALIZATION ?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????\n\nfunction serializeAny(value: unknown, key?: string): unknown {\n if (value === null || value === undefined) return value;\n if (value instanceof THREE.Vector3)\n return { x: value.x, y: value.y, z: value.z };\n if (value instanceof THREE.Vector2) return { x: value.x, y: value.y };\n if (value instanceof THREE.Texture) return undefined;\n if (typeof value === 'function') return undefined;\n if (Array.isArray(value)) return value.map((item) => serializeAny(item));\n if (typeof value === 'object') {\n const obj = value as RawObject;\n\n // EasingCurve: replace curveFunction with curveFunctionId\n if (\n obj['type'] === LifeTimeCurve.EASING &&\n typeof obj['curveFunction'] === 'function'\n ) {\n const id = reverseCurveFunctionMap.get(\n obj['curveFunction'] as CurveFunction\n );\n if (!id) {\n throw new Error(\n 'Cannot serialize a custom curveFunction. Use a predefined CurveFunctionId instead.'\n );\n }\n return {\n type: LifeTimeCurve.EASING,\n curveFunctionId: id,\n ...(obj['scale'] !== undefined ? { scale: obj['scale'] } : {}),\n };\n }\n\n const result: RawObject = {};\n for (const [k, v] of Object.entries(obj)) {\n if (k === 'onUpdate' || k === 'onComplete') continue;\n if (k === 'blending' && typeof v === 'number') {\n result[k] = reverseBlendingMap.get(v as THREE.Blending) ?? v;\n continue;\n }\n const serialized = serializeAny(v, k);\n if (serialized !== undefined) result[k] = serialized;\n }\n return result;\n }\n return value;\n}\n\n/**\n * Serializes a `ParticleSystemConfig` to a JSON string.\n *\n * - `THREE.Vector3` / `THREE.Vector2` are converted to plain `{x, y, z}` / `{x, y}` objects.\n * - `renderer.blending` is converted to its string identifier (e.g. `\"THREE.AdditiveBlending\"`).\n * - `EasingCurve.curveFunction` is replaced by a `curveFunctionId` string.\n * Only predefined `CurveFunctionId` functions can be serialized; custom functions throw.\n * - `THREE.Texture` (`map`), callback fields (`onUpdate`, `onComplete`) are omitted.\n * - An `_editorData` field and other unknown fields are preserved as-is.\n * - A `_version` field is added for forward-compatibility.\n *\n * @param config - The particle system configuration to serialize.\n * @returns A JSON string representation of the config.\n * @throws If the config contains a custom (non-predefined) `curveFunction`.\n *\n * @example\n * ```typescript\n * import { serializeParticleSystem } from '@cyberluke/three-particles';\n *\n * const json = serializeParticleSystem(config);\n * localStorage.setItem('myEffect', json);\n * ```\n */\nexport function serializeParticleSystem(config: ParticleSystemConfig): string {\n const serialized = serializeAny(config) as RawObject;\n return JSON.stringify({ _version: SERIALIZATION_VERSION, ...serialized });\n}\n\n// ????????? DESERIALIZATION ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????\n\n/**\n * Reconstructs a `LifetimeCurve` from its serialized form.\n * Handles:\n * - Legacy editor format: `{ bezierPoints: [...] }` (no `type` field ??? treated as BEZIER)\n * - Normal BEZIER: `{ type: \"BEZIER\", bezierPoints: [...] }`\n * - Serialized EASING: `{ type: \"EASING\", curveFunctionId: \"...\" }`\n */\nfunction deserializeCurve(raw: unknown): LifetimeCurve {\n const obj = raw as RawObject;\n\n // Legacy format from editor: bezierPoints present but no type\n if (Array.isArray(obj['bezierPoints']) && !obj['type']) {\n return { type: LifeTimeCurve.BEZIER, ...obj } as BezierCurve;\n }\n\n if (obj['type'] === LifeTimeCurve.EASING) {\n const id = obj['curveFunctionId'] as CurveFunctionId;\n const fn = getCurveFunction(id);\n if (!fn) {\n throw new Error(\n `Unknown curveFunctionId: \"${id}\". Use a value from CurveFunctionId.`\n );\n }\n const curve: EasingCurve = {\n type: LifeTimeCurve.EASING,\n curveFunction: fn,\n };\n if (obj['scale'] !== undefined) curve.scale = obj['scale'] as number;\n return curve;\n }\n\n // BEZIER (explicit type) or passthrough\n return obj as BezierCurve;\n}\n\n/**\n * Deserializes a value that can be `Constant | RandomBetweenTwoConstants | LifetimeCurve`.\n * Numbers pass through; objects are inspected for curve shape.\n */\nfunction deserializeCurveOrValue(\n value: unknown\n): number | Record<string, unknown> | LifetimeCurve | undefined {\n if (typeof value === 'number') return value;\n if (!value || typeof value !== 'object') return value as undefined;\n const obj = value as RawObject;\n const looksLikeCurve =\n Array.isArray(obj['bezierPoints']) ||\n obj['type'] === LifeTimeCurve.BEZIER ||\n obj['type'] === LifeTimeCurve.EASING ||\n typeof obj['curveFunctionId'] === 'string';\n if (looksLikeCurve) return deserializeCurve(obj);\n return obj; // RandomBetweenTwoConstants or other plain object\n}\n\nfunction deserializeVector3(raw: unknown): THREE.Vector3 | undefined {\n if (!raw || typeof raw !== 'object') return undefined;\n const { x = 0, y = 0, z = 0 } = raw as { x?: number; y?: number; z?: number };\n return new THREE.Vector3(x, y, z);\n}\n\nfunction deserializeVector2(raw: unknown): THREE.Vector2 | undefined {\n if (!raw || typeof raw !== 'object') return undefined;\n const { x = 1, y = 1 } = raw as { x?: number; y?: number };\n return new THREE.Vector2(x, y);\n}\n\nfunction deserializeConfig(raw: RawObject): ParticleSystemConfig {\n const config: ParticleSystemConfig = {};\n\n // transform\n if (raw['transform'] && typeof raw['transform'] === 'object') {\n const t = raw['transform'] as RawObject;\n config.transform = {\n position: deserializeVector3(t['position']),\n rotation: deserializeVector3(t['rotation']),\n scale: deserializeVector3(t['scale']),\n };\n }\n\n // scalar / enum fields (pass through)\n for (const field of [\n 'duration',\n 'looping',\n 'gravity',\n 'simulationSpace',\n 'simulationBackend',\n 'maxParticles',\n ] as const) {\n if (field in raw) (config as RawObject)[field] = raw[field];\n }\n\n // start value fields (Constant | RandomBetweenTwoConstants | LifetimeCurve)\n for (const field of [\n 'startDelay',\n 'startLifetime',\n 'startSpeed',\n 'startSize',\n 'startOpacity',\n 'startRotation',\n ] as const) {\n if (field in raw)\n (config as RawObject)[field] = deserializeCurveOrValue(raw[field]);\n }\n\n // startColor (plain MinMaxColor ??? no reconstruction needed)\n if ('startColor' in raw)\n config.startColor = raw['startColor'] as ParticleSystemConfig['startColor'];\n\n // emission\n if (raw['emission'] && typeof raw['emission'] === 'object') {\n const e = raw['emission'] as RawObject;\n config.emission = {\n rateOverTime: deserializeCurveOrValue(e['rateOverTime']) as NonNullable<\n ParticleSystemConfig['emission']\n >['rateOverTime'],\n rateOverDistance: deserializeCurveOrValue(\n e['rateOverDistance']\n ) as NonNullable<ParticleSystemConfig['emission']>['rateOverDistance'],\n bursts: Array.isArray(e['bursts'])\n ? (e['bursts'] as NonNullable<\n ParticleSystemConfig['emission']\n >['bursts'])\n : [],\n };\n }\n\n // shape (plain object with enum string values ??? no reconstruction needed)\n if ('shape' in raw)\n config.shape = raw['shape'] as ParticleSystemConfig['shape'];\n\n // renderer: convert blending string ??? THREE.Blending number\n if (raw['renderer'] && typeof raw['renderer'] === 'object') {\n const r = raw['renderer'] as RawObject;\n const blending =\n typeof r['blending'] === 'string'\n ? (blendingMap[r['blending'] as BlendingKey] ?? THREE.NormalBlending)\n : ((r['blending'] as number | undefined) ?? THREE.NormalBlending);\n config.renderer = { ...r, blending } as ParticleSystemConfig['renderer'];\n }\n\n // velocityOverLifetime\n if (\n raw['velocityOverLifetime'] &&\n typeof raw['velocityOverLifetime'] === 'object'\n ) {\n const vol = raw['velocityOverLifetime'] as RawObject;\n const deserializeAxis = (\n axis: unknown\n ): { x?: unknown; y?: unknown; z?: unknown } => {\n if (!axis || typeof axis !== 'object') return {};\n const a = axis as RawObject;\n return {\n ...(a['x'] !== undefined ? { x: deserializeCurveOrValue(a['x']) } : {}),\n ...(a['y'] !== undefined ? { y: deserializeCurveOrValue(a['y']) } : {}),\n ...(a['z'] !== undefined ? { z: deserializeCurveOrValue(a['z']) } : {}),\n };\n };\n config.velocityOverLifetime = {\n isActive: (vol['isActive'] as boolean) ?? false,\n linear: deserializeAxis(vol['linear']) as NonNullable<\n ParticleSystemConfig['velocityOverLifetime']\n >['linear'],\n orbital: deserializeAxis(vol['orbital']) as NonNullable<\n ParticleSystemConfig['velocityOverLifetime']\n >['orbital'],\n };\n }\n\n // sizeOverLifetime / opacityOverLifetime ??? both have isActive + lifetimeCurve\n for (const field of ['sizeOverLifetime', 'opacityOverLifetime'] as const) {\n if (raw[field] && typeof raw[field] === 'object') {\n const m = raw[field] as RawObject;\n (config as RawObject)[field] = {\n isActive: (m['isActive'] as boolean) ?? false,\n lifetimeCurve: deserializeCurve(m['lifetimeCurve']),\n };\n }\n }\n\n // colorOverLifetime ??? r/g/b are LifetimeCurves; isActive defaults to true when present\n if (\n raw['colorOverLifetime'] &&\n typeof raw['colorOverLifetime'] === 'object'\n ) {\n const col = raw['colorOverLifetime'] as RawObject;\n config.colorOverLifetime = {\n isActive: (col['isActive'] as boolean) ?? true,\n r: deserializeCurve(col['r']),\n g: deserializeCurve(col['g']),\n b: deserializeCurve(col['b']),\n };\n }\n\n // rotationOverLifetime (isActive + RandomBetweenTwoConstants ??? no curves)\n if (\n raw['rotationOverLifetime'] &&\n typeof raw['rotationOverLifetime'] === 'object'\n ) {\n config.rotationOverLifetime = raw[\n 'rotationOverLifetime'\n ] as ParticleSystemConfig['rotationOverLifetime'];\n }\n\n // noise (NoiseConfig is plain data ??? no reconstruction needed)\n if (raw['noise'] && typeof raw['noise'] === 'object') {\n config.noise = raw['noise'] as ParticleSystemConfig['noise'];\n }\n\n // textureSheetAnimation ??? reconstruct tiles Vector2, deserialize startFrame\n if (\n raw['textureSheetAnimation'] &&\n typeof raw['textureSheetAnimation'] === 'object'\n ) {\n const tsa = raw['textureSheetAnimation'] as RawObject;\n config.textureSheetAnimation = {\n ...(tsa as ParticleSystemConfig['textureSheetAnimation']),\n tiles: deserializeVector2(tsa['tiles']),\n startFrame: deserializeCurveOrValue(tsa['startFrame']) as NonNullable<\n ParticleSystemConfig['textureSheetAnimation']\n >['startFrame'],\n };\n }\n\n // subEmitters ??? recursively deserialize nested configs\n if (Array.isArray(raw['subEmitters'])) {\n config.subEmitters = (raw['subEmitters'] as RawObject[]).map((se) => ({\n ...(se as NonNullable<ParticleSystemConfig['subEmitters']>[number]),\n config: deserializeConfig(se['config'] as RawObject),\n }));\n }\n\n // forceFields ??? array of ForceFieldConfig objects\n if (Array.isArray(raw['forceFields'])) {\n config.forceFields = (raw['forceFields'] as RawObject[]).map((ff) => {\n const result: ForceFieldConfig = {};\n if ('isActive' in ff) result.isActive = ff['isActive'] as boolean;\n if ('type' in ff) result.type = ff['type'] as ForceFieldType;\n if (ff['position']) result.position = deserializeVector3(ff['position']);\n if (ff['direction'])\n result.direction = deserializeVector3(ff['direction']);\n if ('strength' in ff)\n result.strength = deserializeCurveOrValue(\n ff['strength']\n ) as ForceFieldConfig['strength'];\n if ('range' in ff)\n result.range =\n ff['range'] === null ? Infinity : (ff['range'] as number);\n if ('falloff' in ff) result.falloff = ff['falloff'] as ForceFieldFalloff;\n return result;\n });\n }\n\n // collisionPlanes ??? array of CollisionPlaneConfig objects\n if (Array.isArray(raw['collisionPlanes'])) {\n config.collisionPlanes = (raw['collisionPlanes'] as RawObject[]).map(\n (cp) => {\n const result: CollisionPlaneConfig = {};\n if ('isActive' in cp) result.isActive = cp['isActive'] as boolean;\n if ('mode' in cp) result.mode = cp['mode'] as CollisionPlaneMode;\n if (cp['position'])\n result.position = deserializeVector3(cp['position']);\n if (cp['normal']) result.normal = deserializeVector3(cp['normal']);\n if ('dampen' in cp) result.dampen = cp['dampen'] as number;\n if ('lifetimeLoss' in cp)\n result.lifetimeLoss = cp['lifetimeLoss'] as number;\n return result;\n }\n );\n }\n\n // _editorData and any other unknown fields ??? preserve as-is\n for (const key of Object.keys(raw)) {\n if (!(key in config) && key !== '_version' && raw[key] !== null) {\n (config as RawObject)[key] = raw[key];\n }\n }\n\n return config;\n}\n\n/**\n * Deserializes a JSON string produced by `serializeParticleSystem` (or by the\n * three-particles-editor) into a `ParticleSystemConfig` object.\n *\n * - Blending strings (e.g. `\"THREE.AdditiveBlending\"`) are converted back to\n * `THREE.Blending` constants.\n * - `{x, y, z}` objects under `transform` are reconstructed as `THREE.Vector3`.\n * - `{x, y}` objects under `textureSheetAnimation.tiles` are reconstructed as `THREE.Vector2`.\n * - Legacy B??zier curves without a `type` field (editor format) are normalized.\n * - Easing curves stored as `{ type: \"EASING\", curveFunctionId }` have their\n * `curveFunction` resolved from the predefined map.\n * - `_editorData` and other unknown fields are preserved.\n *\n * @param json - A JSON string produced by `serializeParticleSystem` or the editor.\n * @returns A fully reconstructed `ParticleSystemConfig`.\n *\n * @example\n * ```typescript\n * import { deserializeParticleSystem } from '@cyberluke/three-particles';\n *\n * const config = deserializeParticleSystem(localStorage.getItem('myEffect')!);\n * createParticleSystem(config);\n * ```\n */\nexport function deserializeParticleSystem(json: string): ParticleSystemConfig {\n const parsed = JSON.parse(json) as RawObject & { _version?: number };\n\n const { _version: _, ...raw } = parsed;\n return deserializeConfig(raw);\n}\n"]}
|