lean-spec 0.2.8 → 0.2.9-dev.20251205030455
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/dist/backfill-446GBTBC.js +5 -0
- package/dist/{backfill-QIQLXSUG.js.map → backfill-446GBTBC.js.map} +1 -1
- package/dist/{chunk-EBSQ7FUR.js → chunk-BJHJ6IUO.js} +101 -246
- package/dist/chunk-BJHJ6IUO.js.map +1 -0
- package/dist/{chunk-FUIUCGUV.js → chunk-CJMVV46H.js} +14 -87
- package/dist/chunk-CJMVV46H.js.map +1 -0
- package/dist/{chunk-A6JDTXPV.js → chunk-H5MCUMBK.js} +313 -16
- package/dist/chunk-H5MCUMBK.js.map +1 -0
- package/dist/{chunk-LXOJW2FE.js → chunk-RF5PKL6L.js} +3 -3
- package/dist/{chunk-LXOJW2FE.js.map → chunk-RF5PKL6L.js.map} +1 -1
- package/dist/{chunk-LVD7ZAVZ.js → chunk-VN5BUHTV.js} +5 -3
- package/dist/chunk-VN5BUHTV.js.map +1 -0
- package/dist/cli.js +5 -6
- package/dist/cli.js.map +1 -1
- package/dist/{frontmatter-R2DANL5X.js → frontmatter-6ZBAGOEU.js} +3 -3
- package/dist/{frontmatter-R2DANL5X.js.map → frontmatter-6ZBAGOEU.js.map} +1 -1
- package/dist/mcp-server.js +5 -5
- package/dist/validate-DIWYTDEF.js +5 -0
- package/dist/{validate-PT6GAS57.js.map → validate-DIWYTDEF.js.map} +1 -1
- package/package.json +2 -2
- package/templates/detailed/AGENTS.md +59 -105
- package/templates/standard/AGENTS.md +59 -105
- package/dist/backfill-QIQLXSUG.js +0 -5
- package/dist/chunk-A6JDTXPV.js.map +0 -1
- package/dist/chunk-EBSQ7FUR.js.map +0 -1
- package/dist/chunk-FUIUCGUV.js.map +0 -1
- package/dist/chunk-LVD7ZAVZ.js.map +0 -1
- package/dist/validate-PT6GAS57.js +0 -5
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/commands/check.ts","../src/utils/cli-helpers.ts","../src/commands/update.ts","../src/commands/agent.ts","../src/mcp/helpers.ts","../src/mcp/tools/agent.ts","../src/utils/variable-resolver.ts","../src/commands/link.ts","../src/commands/create.ts","../src/commands/archive.ts","../src/utils/pattern-detection.ts","../src/commands/list.ts","../src/commands/unlink.ts","../src/commands/templates.ts","../src/utils/template-helpers.ts","../src/utils/examples.ts","../src/commands/init.ts","../src/commands/files.ts","../src/commands/examples.ts","../src/commands/migrate.ts","../src/utils/completion.ts","../src/utils/velocity.ts","../src/commands/board.ts","../src/utils/spec-stats.ts","../src/utils/insights.ts","../src/commands/stats.ts","../src/commands/search.ts","../src/commands/deps.ts","../src/commands/timeline.ts","../src/commands/gantt.ts","../src/commands/tokens.ts","../src/commands/analyze.ts","../src/commands/split.ts","../src/commands/compact.ts","../src/commands/viewer.ts","../src/commands/mcp.ts","../src/utils/package-manager.ts","../src/commands/ui.ts","../src/mcp/tools/archive.ts","../src/mcp/tools/backfill.ts","../src/mcp/tools/board.ts","../src/mcp/tools/check.ts","../src/mcp/tools/create.ts","../src/mcp/tools/deps.ts","../src/mcp/tools/files.ts","../src/mcp/tools/link.ts","../src/mcp/tools/list.ts","../src/mcp/tools/search.ts","../src/mcp/tools/stats.ts","../src/mcp/tools/tokens.ts","../src/mcp/tools/unlink.ts","../src/mcp/tools/update.ts","../src/mcp/tools/validate.ts","../src/mcp/tools/view.ts","../src/mcp/tools/registry.ts","../src/mcp/resources/board.ts","../src/mcp/resources/spec.ts","../src/mcp/resources/stats.ts","../src/mcp/resources/registry.ts","../src/mcp/prompts/plan-project-roadmap.ts","../src/mcp/prompts/project-progress-overview.ts","../src/mcp/prompts/sdd-checkpoint.ts","../src/mcp/prompts/spec-creation-workflow.ts","../src/mcp/prompts/update-spec-status.ts","../src/mcp/prompts/registry.ts","../src/mcp-server.ts"],"names":["path","chalk","Command","path2","resolve","fs","path3","path4","fs2","packageJson","path5","parseFrontmatter","path6","fs3","stat","path7","fs4","path8","fs5","path9","path10","fs6","execSync","fs7","path11","getProjectName","spawn","projectName","path13","readmeStat","fs9","readmeContent","readmeTokens","listExamples","fs10","path14","copyDirectory","backfillCommand","validateSpecs","dayjs","showStats","showTimeline","labelWidth","barWidth","createBar","path15","STATUS_CONFIG","PRIORITY_CONFIG","specs","path16","path17","readFile","path20","writeFile","path21","validateNoOverlaps","displayDryRun","path22","fs11","detectPackageManager","join","existsSync","args","z","path23","output","path24","ResourceTemplate","fileURLToPath","__dirname","dirname","readFileSync","StdioServerTransport"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAWO,SAAS,YAAA,GAAwB;AACtC,EAAA,OAAO,IAAI,OAAA,CAAQ,OAAO,CAAA,CACvB,WAAA,CAAY,8BAA8B,CAAA,CAC1C,MAAA,CAAO,aAAA,EAAe,cAAc,EACpC,MAAA,CAAO,QAAA,EAAU,gBAAgB,CAAA,CACjC,MAAA,CAAO,OAAO,OAAA,KAAiD;AAC9D,IAAA,MAAM,cAAA,GAAiB,MAAM,UAAA,CAAW,OAAO,CAAA;AAC/C,IAAA,OAAA,CAAQ,IAAA,CAAK,cAAA,GAAiB,CAAA,GAAI,CAAC,CAAA;AAAA,EACrC,CAAC,CAAA;AACL;AAKA,eAAsB,UAAA,CAAW,OAAA,GAI7B,EAAC,EAAqB;AACxB,EAAA,MAAM,MAAA,GAAS,MAAM,UAAA,EAAW;AAChC,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AACxB,EAAsBA,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,MAAA,CAAO,QAAQ;AAG/C,EAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,EAAa;AACjC,EAAA,MAAM,WAAA,uBAAkB,GAAA,EAAsB;AAC9C,EAAA,MAAM,cAAc,oBAAA,EAAqB;AAEzC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AAExB,IAAA,MAAM,QAAA,GAAgBA,MAAA,CAAA,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA;AAExC,IAAA,MAAM,KAAA,GAAQ,QAAA,CAAS,KAAA,CAAM,WAAW,CAAA;AAExC,IAAA,IAAI,KAAA,EAAO;AACT,MAAA,MAAM,GAAA,GAAM,QAAA,CAAS,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA;AACjC,MAAA,IAAI,CAAC,KAAA,CAAM,GAAG,CAAA,IAAK,MAAM,CAAA,EAAG;AAC1B,QAAA,IAAI,CAAC,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA,EAAG;AACzB,UAAA,WAAA,CAAY,GAAA,CAAI,GAAA,EAAK,EAAE,CAAA;AAAA,QACzB;AACA,QAAA,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA,CAAG,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,MACtC;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,IAAA,CAAK,WAAA,CAAY,OAAA,EAAS,CAAA,CAC/C,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,KAAM,MAAM,MAAA,GAAS,CAAC,CAAA,CACvC,IAAA,CAAK,CAAC,CAAC,CAAC,CAAA,EAAG,CAAC,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC,CAAA;AAE3B,EAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,IAAA,IAAI,CAAC,OAAA,CAAQ,KAAA,IAAS,CAAC,QAAQ,MAAA,EAAQ;AACrC,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,EAAE,SAAA,EAAW,EAAC,EAAG,YAAA,EAAc,KAAA,EAAM,EAAG,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,MAC7E,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,GAAA,CAAIC,OAAA,CAAM,KAAA,CAAM,uCAAkC,CAAC,CAAA;AAAA,MAC7D;AAAA,IACF;AACA,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,MAAM,UAAA,GAAa;AAAA,MACjB,YAAA,EAAc,IAAA;AAAA,MACd,WAAW,SAAA,CAAU,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,MAAO;AAAA,QAC1C,QAAA,EAAU,GAAA;AAAA,QACV,KAAA,EAAO;AAAA,OACT,CAAE;AAAA,KACJ;AACA,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,UAAA,EAAY,IAAA,EAAM,CAAC,CAAC,CAAA;AAC/C,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACnB,IAAA,IAAI,CAAC,QAAQ,KAAA,EAAO;AAElB,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAA,CAAM,MAAA,CAAO,8CAAoC,CAAC,CAAA;AAE9D,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,SAAA,EAAW;AACpC,QAAA,OAAA,CAAQ,GAAA,CAAIA,OAAA,CAAM,GAAA,CAAI,CAAA,WAAA,EAAc,OAAO,GAAG,CAAA,CAAE,QAAA,CAAS,MAAA,CAAO,SAAA,CAAU,cAAA,EAAgB,GAAG,CAAC,GAAG,CAAC,CAAA;AAClG,QAAA,KAAA,MAAW,KAAK,KAAA,EAAO;AACrB,UAAA,OAAA,CAAQ,GAAA,CAAIA,QAAM,IAAA,CAAK,CAAA,MAAA,EAAS,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAA;AAAA,QACzD;AACA,QAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,MAChB;AAEA,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAA,CAAM,IAAA,CAAK,4CAA4C,CAAC,CAAA;AACpE,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAA,CAAM,IAAA,CAAK,sEAAiE,CAAC,CAAA;AACzF,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAA,CAAM,IAAA,CAAK,wCAAwC,CAAC,CAAA;AAChE,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,IAChB,CAAA,MAAO;AAEL,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,MAAA,OAAA,CAAQ,IAAIA,OAAA,CAAM,MAAA,CAAO,mCAAyB,SAAA,CAAU,MAAM,gCAAgC,CAAC,CAAA;AACnG,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAA,CAAM,IAAA,CAAK,sBAAsB,CAAC,CAAA;AAC9C,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,IAChB;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAKA,eAAsB,kBAAA,GAAoC;AACxD,EAAA,MAAM,MAAA,GAAS,MAAM,UAAA,EAAW;AAGhC,EAAA,IAAI,MAAA,CAAO,cAAc,KAAA,EAAO;AAC9B,IAAA;AAAA,EACF;AAGA,EAAA,IAAI;AACF,IAAA,MAAM,UAAA,CAAW,EAAE,KAAA,EAAO,IAAA,EAAM,CAAA;AAAA,EAClC,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;;;ACjIO,SAAS,wBAAwB,YAAA,EAAkD;AACxF,EAAA,MAAM,eAAwC,EAAC;AAE/C,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,OAAO,YAAA;AAAA,EACT;AAEA,EAAA,KAAA,MAAW,SAAS,YAAA,EAAc;AAChC,IAAA,MAAM,CAAC,GAAA,EAAK,GAAG,UAAU,CAAA,GAAI,KAAA,CAAM,MAAM,GAAG,CAAA;AAC5C,IAAA,IAAI,GAAA,IAAO,UAAA,CAAW,MAAA,GAAS,CAAA,EAAG;AAChC,MAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,IAAA,CAAK,GAAG,CAAA;AACjC,MAAA,YAAA,CAAa,GAAA,CAAI,IAAA,EAAM,CAAA,GAAI,MAAM,IAAA,EAAK;AAAA,IACxC;AAAA,EACF;AAEA,EAAA,OAAO,YAAA;AACT;;;ACPO,SAAS,aAAA,GAAyB;AACvC,EAAA,OAAO,IAAIC,OAAAA,CAAQ,QAAQ,CAAA,CACxB,YAAY,sBAAsB,CAAA,CAClC,QAAA,CAAS,QAAA,EAAU,gBAAgB,CAAA,CACnC,MAAA,CAAO,mBAAA,EAAqB,uDAAuD,EACnF,MAAA,CAAO,uBAAA,EAAyB,4CAA4C,CAAA,CAC5E,MAAA,CAAO,eAAA,EAAiB,4BAA4B,CAAA,CACpD,OAAO,mBAAA,EAAqB,cAAc,CAAA,CAC1C,MAAA,CAAO,2BAA2B,yCAAyC,CAAA,CAC3E,MAAA,CAAO,OAAO,UAAkB,OAAA,KAM3B;AACJ,IAAA,MAAM,YAAA,GAAe,uBAAA,CAAwB,OAAA,CAAQ,KAAK,CAAA;AAC1D,IAAA,MAAM,OAAA,GAMF;AAAA,MACF,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,IAAA,EAAM,OAAA,CAAQ,IAAA,GAAO,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,EAAM,CAAA,GAAI,MAAA;AAAA,MAClE,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,cAAc,MAAA,CAAO,IAAA,CAAK,YAAY,CAAA,CAAE,MAAA,GAAS,IAAI,YAAA,GAAe;AAAA,KACtE;AAEA,IAAA,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,OAAA,CAAQ,CAAA,GAAA,KAAO;AAClC,MAAA,IAAI,OAAA,CAAQ,GAA2B,CAAA,KAAM,MAAA,EAAW;AACtD,QAAA,OAAO,QAAQ,GAA2B,CAAA;AAAA,MAC5C;AAAA,IACF,CAAC,CAAA;AAED,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA,CAAE,WAAW,CAAA,EAAG;AACrC,MAAA,OAAA,CAAQ,MAAM,gGAAgG,CAAA;AAC9G,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,MAAM,UAAA,CAAW,UAAU,OAAO,CAAA;AAAA,EACpC,CAAC,CAAA;AACL;AAEA,eAAsB,UAAA,CACpB,QAAA,EACA,OAAA,EAOA,OAAA,GAA4B,EAAC,EACd;AAEf,EAAA,MAAM,kBAAA,EAAmB;AAEzB,EAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,GAAA,EAAI;AACvC,EAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,GAAG,CAAA;AACnC,EAAA,MAAM,QAAA,GAAgBC,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,MAAA,CAAO,QAAQ,CAAA;AAE/C,EAAA,MAAM,YAAA,GAAe,MAAM,eAAA,CAAgB,QAAA,EAAU,KAAK,QAAQ,CAAA;AAElE,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,iBAAA,CAAkB,QAAQ,CAAC,CAAA,SAAA,EAAY,iBAAA,CAAkB,QAAQ,CAAC,CAAA,QAAA,EAAW,iBAAA,CAAkB,QAAQ,CAAC,CAAA,mCAAA,CAAqC,CAAA;AAAA,EAClL;AAGA,EAAA,MAAM,WAAW,MAAM,WAAA,CAAY,YAAA,EAAc,MAAA,CAAO,UAAU,WAAW,CAAA;AAC7E,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,iBAAA,CAAkB,QAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,EACzE;AAGA,EAAA,MAAM,aAAsC,EAAC;AAG7C,EAAA,IAAI,OAAA,CAAQ,MAAA,KAAW,MAAA,EAAW,UAAA,CAAW,SAAS,OAAA,CAAQ,MAAA;AAC9D,EAAA,IAAI,OAAA,CAAQ,QAAA,KAAa,MAAA,EAAW,UAAA,CAAW,WAAW,OAAA,CAAQ,QAAA;AAClE,EAAA,IAAI,OAAA,CAAQ,IAAA,KAAS,MAAA,EAAW,UAAA,CAAW,OAAO,OAAA,CAAQ,IAAA;AAC1D,EAAA,IAAI,OAAA,CAAQ,QAAA,KAAa,MAAA,EAAW,UAAA,CAAW,WAAW,OAAA,CAAQ,QAAA;AAElE,EAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,IAAA,MAAA,CAAO,OAAA,CAAQ,QAAQ,YAAY,CAAA,CAAE,QAAQ,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM;AAC7D,MAAA,IAAI,UAAU,MAAA,EAAW;AACvB,QAAA,UAAA,CAAW,GAAG,CAAA,GAAI,KAAA;AAAA,MACpB;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,iBAAA,CAAkB,UAAU,UAAU,CAAA;AAE5C,EAAA,OAAA,CAAQ,GAAA,CAAIF,OAAAA,CAAM,KAAA,CAAM,CAAA,gBAAA,EAAc,iBAAA,CAAuBE,MAAA,CAAA,QAAA,CAAS,GAAA,EAAK,YAAY,CAAC,CAAC,CAAA,CAAE,CAAC,CAAA;AAG5F,EAAA,MAAM,aAAA,GAAgB,OAAO,IAAA,CAAK,OAAO,EAAE,MAAA,CAAO,CAAA,CAAA,KAAK,MAAM,cAAc,CAAA;AAC3E,EAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,IAAA,aAAA,CAAc,KAAK,GAAG,MAAA,CAAO,IAAA,CAAK,OAAA,CAAQ,YAAY,CAAC,CAAA;AAAA,EACzD;AACA,EAAA,OAAA,CAAQ,GAAA,CAAIF,QAAM,IAAA,CAAK,CAAA,UAAA,EAAa,cAAc,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAC,CAAA;AACjE;;;AClDA,IAAM,cAAA,uBAAgD,GAAA,EAAI;AAK1D,IAAM,cAAA,GAA8C;AAAA,EAClD,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,KAAA;AAAA,IACN,OAAA,EAAS,QAAA;AAAA,IACT,eAAA,EAAiB,CAAA;;AAAA;AAAA;AAAA;;AAAA,yGAAA;AAAA,GAOnB;AAAA,EACA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,KAAA;AAAA,IACN,OAAA,EAAS,IAAA;AAAA,IACT,IAAA,EAAM,CAAC,SAAA,EAAW,SAAS,CAAA;AAAA,IAC3B,eAAA,EAAiB,CAAA;;AAAA,cAAA;AAAA,GAGnB;AAAA,EACA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,KAAA;AAAA,IACN,OAAA,EAAS,OAAA;AAAA,IACT,IAAA,EAAM,CAAC,WAAW,CAAA;AAAA,IAClB,eAAA,EAAiB,CAAA;;AAAA,cAAA;AAAA,GAGnB;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,KAAA;AAAA,IACN,OAAA,EAAS,QAAA;AAAA,IACT,eAAA,EAAiB,CAAA;;AAAA,cAAA;AAAA,GAGnB;AAAA,EACA,WAAA,EAAa;AAAA,IACX,IAAA,EAAM,OAAA;AAAA,IACN,QAAA,EAAU;AAAA,GACZ;AAAA,EACA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,KAAA;AAAA,IACN,OAAA,EAAS,UAAA;AAAA,IACT,eAAA,EAAiB,CAAA,cAAA;AAAA;AAErB,CAAA;AAKA,SAAS,oBAAoB,MAAA,EAAkD;AAG7E,EAAA,MAAM,gBAAA,GAAmB,MAAA;AACzB,EAAA,OAAO,gBAAA,CAAiB,MAAA;AAC1B;AAKA,eAAsB,cAAA,CACpB,WACA,MAAA,EAC6B;AAE7B,EAAA,MAAM,UAAA,GAAa,oBAAoB,MAAM,CAAA;AAC7C,EAAA,MAAM,SAAA,GAAY,aAAa,SAAS,CAAA;AACxC,EAAA,IAAI,SAAA,IAAa,OAAO,SAAA,KAAc,QAAA,EAAU;AAC9C,IAAA,OAAO,EAAE,GAAG,cAAA,CAAe,SAAS,CAAA,EAAG,GAAG,SAAA,EAAU;AAAA,EACtD;AAGA,EAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,IAAA,OAAO,eAAe,SAAS,CAAA;AAAA,EACjC;AAEA,EAAA,OAAO,IAAA;AACT;AAKA,eAAsB,gBAAgB,MAAA,EAAyC;AAC7E,EAAA,MAAM,UAAA,GAAa,oBAAoB,MAAM,CAAA;AAC7C,EAAA,OAAO,YAAY,OAAA,IAAW,QAAA;AAChC;AAKA,eAAe,iBAAiB,WAAA,EAA4C;AAC1E,EAAA,IAAI,WAAA,CAAY,SAAS,OAAA,EAAS;AAEhC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,UAAU,WAAA,CAAY,OAAA;AAC5B,EAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AAErB,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACG,QAAAA,KAAY;AAC9B,IAAA,MAAM,KAAA,GAAQ,MAAM,OAAA,EAAS,CAAC,OAAO,CAAA,EAAG,EAAE,KAAA,EAAO,MAAA,EAAQ,CAAA;AACzD,IAAA,KAAA,CAAM,GAAG,OAAA,EAAS,CAAC,SAASA,QAAAA,CAAQ,IAAA,KAAS,CAAC,CAAC,CAAA;AAC/C,IAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,MAAMA,QAAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EACxC,CAAC,CAAA;AACH;AAKA,eAAe,gBAAgB,QAAA,EAAmC;AAChE,EAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,QAAQ,CAAA;AACnC,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,QAAQ,CAAA,CAAE,CAAA;AAAA,EAC/C;AAGA,EAAA,MAAM,UAAU,IAAA,CAAK,QAAA;AACrB,EAAA,IAAI,OAAA,GAAU,EAAA;AAGd,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,MAASC,GAAA,CAAA,OAAA,CAAQ,OAAO,CAAA;AACtC,IAAA,MAAM,UAAU,KAAA,CAAM,MAAA,CAAO,OAAK,CAAA,CAAE,QAAA,CAAS,KAAK,CAAC,CAAA;AAEnD,IAAA,KAAA,MAAW,QAAQ,OAAA,EAAS;AAC1B,MAAA,MAAM,QAAA,GAAgBC,MAAA,CAAA,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AACxC,MAAA,MAAM,WAAA,GAAc,MAASD,GAAA,CAAA,QAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AACvD,MAAA,OAAA,IAAW;;AAAA,IAAA,EAAW,IAAI;;AAAA,EAAO,WAAW,CAAA,CAAA;AAAA,IAC9C;AAAA,EACF,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAA,GAAU,MAASA,GAAA,CAAA,QAAA,CAAS,IAAA,CAAK,QAAA,EAAU,OAAO,CAAA;AAAA,EACpD;AAEA,EAAA,OAAO,OAAA;AACT;AAKA,eAAe,cAAA,CACb,QAAA,EACA,QAAA,EACA,GAAA,EACiB;AACjB,EAAA,MAAM,eAAoBC,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,YAAA,EAAc,CAAA,KAAA,EAAQ,QAAQ,CAAA,CAAE,CAAA;AACpE,EAAA,MAAM,UAAA,GAAa,WAAW,QAAQ,CAAA,CAAA;AAGtC,EAAA,MAASD,GAAA,CAAA,KAAA,CAAWC,YAAK,GAAA,EAAK,YAAY,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAEhE,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACF,QAAAA,EAAS,MAAA,KAAW;AACtC,IAAA,MAAM,KAAA,GAAQ,MAAM,KAAA,EAAO,CAAC,YAAY,KAAA,EAAO,YAAA,EAAc,IAAA,EAAM,UAAU,CAAA,EAAG;AAAA,MAC9E,GAAA;AAAA,MACA,KAAA,EAAO;AAAA,KACR,CAAA;AAED,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,KAAA,CAAM,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,KAAS;AACjC,MAAA,MAAA,IAAU,KAAK,QAAA,EAAS;AAAA,IAC1B,CAAC,CAAA;AAED,IAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,IAAA,KAAS;AAC1B,MAAA,IAAI,SAAS,CAAA,EAAG;AACd,QAAAA,SAAQ,YAAY,CAAA;AAAA,MACtB,CAAA,MAAO;AAEL,QAAA,IAAI,MAAA,CAAO,QAAA,CAAS,gBAAgB,CAAA,EAAG;AAErC,UAAA,MAAM,MAAA,GAAS,MAAM,KAAA,EAAO,CAAC,YAAY,KAAA,EAAO,YAAA,EAAc,UAAU,CAAA,EAAG;AAAA,YACzE,GAAA;AAAA,YACA,KAAA,EAAO;AAAA,WACR,CAAA;AACD,UAAA,MAAA,CAAO,EAAA,CAAG,OAAA,EAAS,CAAC,KAAA,KAAU;AAC5B,YAAA,IAAI,UAAU,CAAA,EAAG;AACf,cAAAA,SAAQ,YAAY,CAAA;AAAA,YACtB,CAAA,MAAO;AACL,cAAA,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,MAAM,EAAE,CAAC,CAAA;AAAA,YAC1D;AAAA,UACF,CAAC,CAAA;AAAA,QACH,CAAA,MAAO;AACL,UAAA,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,MAAM,EAAE,CAAC,CAAA;AAAA,QAC1D;AAAA,MACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAKA,eAAe,WAAA,CACb,QAAA,EACA,WAAA,EACA,YAAA,EACuB;AACvB,EAAA,MAAM,OAAA,GAAU,MAAM,eAAA,CAAgB,QAAQ,CAAA;AAC9C,EAAA,MAAM,UAAU,WAAA,CAAY,eAAA,EAAiB,OAAA,CAAQ,gBAAA,EAAkB,OAAO,CAAA,IAAK,OAAA;AAEnF,EAAA,MAAM,UAAU,WAAA,CAAY,OAAA;AAC5B,EAAA,MAAM,OAAO,CAAC,GAAI,WAAA,CAAY,IAAA,IAAQ,EAAG,CAAA;AAGzC,EAAA,IAAI,IAAA,CAAK,QAAA,CAAS,WAAW,CAAA,IAAK,YAAY,OAAA,EAAS;AACrD,IAAA,IAAA,CAAK,KAAK,OAAO,CAAA;AAAA,EACnB;AAEA,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,OAAA,EAAS,IAAA,EAAM;AAAA,IACjC,GAAA,EAAK,YAAA,IAAgB,OAAA,CAAQ,GAAA,EAAI;AAAA,IACjC,KAAA,EAAO,SAAA;AAAA,IACP,QAAA,EAAU;AAAA,GACX,CAAA;AAED,EAAA,OAAO,KAAA;AACT;AAKA,eAAe,aAAA,CACb,UACA,YAAA,EACe;AAMf,EAAA,OAAA,CAAQ,GAAA,CAAIH,OAAAA,CAAM,MAAA,CAAO,4DAA4D,CAAC,CAAA;AACtF,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,yDAAyD,CAAC,CAAA;AAEjF,EAAA,MAAM,OAAA,GAAU,MAAM,eAAA,CAAgB,QAAQ,CAAA;AAC9C,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,sCAAsC,CAAC,CAAA;AAC9D,EAAA,OAAA,CAAQ,GAAA,CAAI,OAAA,CAAQ,SAAA,CAAU,CAAA,EAAG,GAAG,KAAK,OAAA,CAAQ,MAAA,GAAS,GAAA,GAAM,KAAA,GAAQ,EAAA,CAAG,CAAA;AAC3E,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,6BAA6B,CAAC,CAAA;AACrD,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,kDAAkD,CAAC,CAAA;AAC1E,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,wCAAwC,CAAC,CAAA;AAChE,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,+CAA+C,CAAC,CAAA;AACzE;AAKO,SAAS,YAAA,GAAwB;AACtC,EAAA,MAAM,MAAM,IAAIC,OAAAA,CAAQ,OAAO,CAAA,CAC5B,YAAY,iEAAiE,CAAA;AAGhF,EAAA,GAAA,CAAI,OAAA,CAAQ,KAAK,CAAA,CACd,WAAA,CAAY,wCAAwC,CAAA,CACpD,QAAA,CAAS,YAAA,EAAc,oDAAoD,CAAA,CAC3E,MAAA,CAAO,gBAAA,EAAkB,0DAA0D,QAAQ,CAAA,CAC3F,MAAA,CAAO,YAAA,EAAc,8CAA8C,CAAA,CACnE,MAAA,CAAO,oBAAA,EAAsB,0CAA0C,CAAA,CACvE,MAAA,CAAO,WAAA,EAAa,2CAA2C,CAAA,CAC/D,MAAA,CAAO,OAAO,OAAiB,OAAA,KAK1B;AACJ,IAAA,MAAM,QAAA,CAAS,OAAO,OAAO,CAAA;AAAA,EAC/B,CAAC,CAAA;AAGH,EAAA,GAAA,CAAI,QAAQ,QAAQ,CAAA,CACjB,WAAA,CAAY,gCAAgC,EAC5C,QAAA,CAAS,QAAA,EAAU,mCAAmC,CAAA,CACtD,OAAO,QAAA,EAAU,gBAAgB,EACjC,MAAA,CAAO,OAAO,MAA0B,OAAA,KAAgC;AACvE,IAAA,MAAM,eAAA,CAAgB,MAAM,OAAO,CAAA;AAAA,EACrC,CAAC,CAAA;AAGH,EAAA,GAAA,CAAI,OAAA,CAAQ,MAAM,CAAA,CACf,WAAA,CAAY,0BAA0B,CAAA,CACtC,MAAA,CAAO,QAAA,EAAU,gBAAgB,CAAA,CACjC,MAAA,CAAO,OAAO,OAAA,KAAgC;AAC7C,IAAA,MAAM,WAAW,OAAO,CAAA;AAAA,EAC1B,CAAC,CAAA;AAGH,EAAA,GAAA,CAAI,OAAA,CAAQ,QAAQ,CAAA,CACjB,WAAA,CAAY,yBAAyB,CAAA,CACrC,QAAA,CAAS,SAAA,EAAW,8BAA8B,CAAA,CAClD,MAAA,CAAO,OAAO,KAAA,KAAkB;AAC/B,IAAA,MAAM,gBAAgB,KAAK,CAAA;AAAA,EAC7B,CAAC,CAAA;AAGH,EAAA,GAAA,CAAI,OAAO,MAAM;AACf,IAAA,GAAA,CAAI,IAAA,EAAK;AAAA,EACX,CAAC,CAAA;AAED,EAAA,OAAO,GAAA;AACT;AAKA,eAAsB,QAAA,CACpB,KAAA,EACA,OAAA,GAKI,EAAC,EACU;AACf,EAAA,MAAM,MAAA,GAAS,MAAM,UAAA,EAAW;AAChC,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AACxB,EAAA,MAAM,QAAA,GAAgBI,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,MAAA,CAAO,QAAQ,CAAA;AAG/C,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,KAAA,IAAS,MAAM,gBAAgB,MAAM,CAAA;AAC/D,EAAA,MAAM,WAAA,GAAc,MAAM,cAAA,CAAe,SAAA,EAAW,MAAM,CAAA;AAE1D,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAA,CAAQ,MAAML,OAAAA,CAAM,GAAA,CAAI,CAAA,eAAA,EAAkB,SAAS,EAAE,CAAC,CAAA;AACtD,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,6DAA6D,CAAC,CAAA;AACrF,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAGA,EAAA,MAAM,SAAA,GAAY,MAAM,gBAAA,CAAiB,WAAW,CAAA;AACpD,EAAA,IAAI,CAAC,SAAA,IAAa,WAAA,CAAY,SAAS,KAAA,IAAS,CAAC,QAAQ,MAAA,EAAQ;AAC/D,IAAA,OAAA,CAAQ,MAAMA,OAAAA,CAAM,GAAA,CAAI,oBAAoB,WAAA,CAAY,OAAO,EAAE,CAAC,CAAA;AAClE,IAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,IAAA,CAAK,aAAa,WAAA,CAAY,OAAO,iCAAiC,CAAC,CAAA;AACzF,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAEA,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,GAAA,CAAIA,QAAM,KAAA,CAAM,CAAA,yBAAA,EAAqBA,QAAM,IAAA,CAAK,SAAS,CAAC,CAAA,MAAA,CAAQ,CAAC,CAAA;AAC3E,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,EAAA,MAAM,gBAA0B,EAAC;AACjC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,QAAA,GAAW,MAAM,eAAA,CAAgB,IAAA,EAAM,KAAK,QAAQ,CAAA;AAC1D,IAAA,IAAI,CAAC,QAAA,EAAU;AACb,MAAA,OAAA,CAAQ,KAAA,CAAMA,QAAM,GAAA,CAAI,CAAA,gBAAA,EAAmB,kBAAkB,IAAI,CAAC,EAAE,CAAC,CAAA;AACrE,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AACA,IAAA,aAAA,CAAc,KAAK,QAAQ,CAAA;AAAA,EAC7B;AAGA,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,mBAAmB,CAAC,CAAA;AAC3C,EAAA,KAAA,MAAW,YAAY,aAAA,EAAe;AACpC,IAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,QAAQ,CAAA;AACnC,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AACzD,MAAA,OAAA,CAAQ,GAAA,CAAI,YAAO,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CAAA;AAAA,IAC7D,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,IAAI,CAAA,SAAA,EAAO,iBAAA,CAAuBK,gBAAS,QAAQ,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,IACjE;AAAA,EACF;AACA,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,OAAA,CAAQ,GAAA,CAAIL,OAAAA,CAAM,MAAA,CAAO,yCAAyC,CAAC,CAAA;AACnE,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,gBAAgB,CAAC,CAAA;AACxC,IAAA,KAAA,MAAW,YAAY,aAAA,EAAe;AACpC,MAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,QAAQ,CAAA;AACnC,MAAA,MAAM,QAAA,GAAW,IAAA,EAAM,IAAA,IAAaK,MAAA,CAAA,QAAA,CAAS,QAAQ,CAAA;AACrD,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,YAAA,EAAe,QAAQ,CAAA,sBAAA,CAAwB,CAAA;AAC3D,MAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,wCAAA,EAA2C,QAAQ,CAAA,CAAE,CAAA;AACjE,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,2BAAA,EAA8B,QAAQ,CAAA,CAAE,CAAA;AAAA,MACtD;AACA,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,OAAA,CAAQ,QAAA,GAAW,MAAM,GAAG,CAAA,SAAA,EAAY,SAAS,CAAA,wBAAA,CAA0B,CAAA;AAAA,IAC9F;AACA,IAAA;AAAA,EACF;AAGA,EAAA,KAAA,MAAW,YAAY,aAAA,EAAe;AACpC,IAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,QAAQ,CAAA;AACnC,IAAA,MAAM,QAAA,GAAW,IAAA,EAAM,IAAA,IAAaA,MAAA,CAAA,QAAA,CAAS,QAAQ,CAAA;AAErD,IAAA,OAAA,CAAQ,IAAIL,OAAAA,CAAM,IAAA,CAAK,CAAA,YAAA,EAAe,QAAQ,EAAE,CAAC,CAAA;AAGjD,IAAA,IAAI,OAAA,CAAQ,iBAAiB,KAAA,EAAO;AAClC,MAAA,IAAI;AACF,QAAA,MAAM,UAAA,CAAW,QAAA,EAAU,EAAE,MAAA,EAAQ,eAAe,CAAA;AACpD,QAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,KAAA,CAAM,CAAA,sCAAA,CAAmC,CAAC,CAAA;AAAA,MAC9D,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,MAAA,CAAO,qCAAiC,KAAA,CAAgB,OAAO,EAAE,CAAC,CAAA;AAAA,MACtF;AAAA,IACF;AAGA,IAAA,IAAI,YAAA;AACJ,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA,IAAI;AACF,QAAA,YAAA,GAAe,MAAM,cAAA,CAAe,QAAA,EAAU,QAAA,EAAU,GAAG,CAAA;AAC3D,QAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,KAAA,CAAM,CAAA,6BAAA,EAA2B,YAAY,EAAE,CAAC,CAAA;AAAA,MACpE,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,MAAA,CAAO,uCAAmC,KAAA,CAAgB,OAAO,EAAE,CAAC,CAAA;AAAA,MACxF;AAAA,IACF;AAGA,IAAA,MAAM,OAAA,GAAwB;AAAA,MAC5B,QAAA;AAAA,MACA,KAAA,EAAO,SAAA;AAAA,MACP,MAAA,EAAQ,SAAA;AAAA,MACR,SAAA,EAAA,iBAAW,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AAAA,MAClC,QAAA,EAAU;AAAA,KACZ;AAGA,IAAA,IAAI,WAAA,CAAY,SAAS,KAAA,EAAO;AAC9B,MAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,IAAA,CAAK,CAAA,mBAAA,EAAiB,SAAS,KAAK,CAAC,CAAA;AAEvD,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,MAAM,WAAA,CAAY,QAAA,EAAU,aAAa,YAAY,CAAA;AACnE,QAAA,OAAA,CAAQ,MAAM,KAAA,CAAM,GAAA;AACpB,QAAA,cAAA,CAAe,GAAA,CAAI,UAAU,OAAO,CAAA;AAEpC,QAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,IAAA,KAAS;AAC1B,UAAA,MAAM,IAAA,GAAO,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA;AACxC,UAAA,IAAI,IAAA,EAAM;AACR,YAAA,IAAA,CAAK,MAAA,GAAS,IAAA,KAAS,CAAA,GAAI,WAAA,GAAc,QAAA;AACzC,YAAA,IAAA,CAAK,WAAW,IAAA,IAAQ,KAAA,CAAA;AAAA,UAC1B;AAAA,QACF,CAAC,CAAA;AAED,QAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,KAAA,KAAU;AAC3B,UAAA,MAAM,IAAA,GAAO,cAAA,CAAe,GAAA,CAAI,QAAQ,CAAA;AACxC,UAAA,IAAI,IAAA,EAAM;AACR,YAAA,IAAA,CAAK,MAAA,GAAS,QAAA;AACd,YAAA,IAAA,CAAK,QAAQ,KAAA,CAAM,OAAA;AAAA,UACrB;AAAA,QACF,CAAC,CAAA;AAED,QAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,KAAA,CAAM,iCAA4B,KAAA,CAAM,GAAG,GAAG,CAAC,CAAA;AAAA,MACnE,SAAS,KAAA,EAAO;AACd,QAAA,OAAA,CAAQ,MAAA,GAAS,QAAA;AACjB,QAAA,OAAA,CAAQ,QAAS,KAAA,CAAgB,OAAA;AACjC,QAAA,cAAA,CAAe,GAAA,CAAI,UAAU,OAAO,CAAA;AACpC,QAAA,OAAA,CAAQ,MAAMA,OAAAA,CAAM,GAAA,CAAI,oCAAgC,KAAA,CAAgB,OAAO,EAAE,CAAC,CAAA;AAAA,MACpF;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,cAAA,CAAe,GAAA,CAAI,UAAU,OAAO,CAAA;AACpC,MAAA,MAAM,aAAA,CAAc,QAAqB,CAAA;AAAA,IAC3C;AAEA,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,EAChB;AAEA,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,KAAA,CAAM,gCAA2B,CAAC,CAAA;AACpD,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,gDAAgD,CAAC,CAAA;AAC1E;AAKA,eAAsB,eAAA,CACpB,IAAA,EACA,OAAA,GAA8B,EAAC,EAChB;AACf,EAAA,IAAI,IAAA,EAAM;AACR,IAAA,MAAM,OAAA,GAAU,cAAA,CAAe,GAAA,CAAI,IAAI,CAAA;AACvC,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,QAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,SAAA,CAAU,EAAE,OAAO,CAAA,4BAAA,EAA+B,IAAI,CAAA,CAAA,EAAI,CAAC,CAAA;AAAA,MAC9E,CAAA,MAAO;AACL,QAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,MAAA,CAAO,CAAA,4BAAA,EAA+B,IAAI,EAAE,CAAC,CAAA;AAAA,MACjE;AACA,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,IAC9C,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,MAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,IAAA,CAAK,CAAA,eAAA,EAAkB,IAAI,EAAE,CAAC,CAAA;AAChD,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,SAAA,EAAY,OAAA,CAAQ,KAAK,CAAA,CAAE,CAAA;AACvC,MAAA,OAAA,CAAQ,IAAI,CAAA,UAAA,EAAa,yBAAA,CAA0B,OAAA,CAAQ,MAAM,CAAC,CAAA,CAAE,CAAA;AACpE,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,WAAA,EAAc,OAAA,CAAQ,SAAS,CAAA,CAAE,CAAA;AAC7C,MAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,YAAA,EAAe,OAAA,CAAQ,QAAQ,CAAA,CAAE,CAAA;AAAA,MAC/C;AACA,MAAA,IAAI,QAAQ,GAAA,EAAK;AACf,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,OAAA,EAAU,OAAA,CAAQ,GAAG,CAAA,CAAE,CAAA;AAAA,MACrC;AACA,MAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,QAAA,OAAA,CAAQ,IAAI,CAAA,SAAA,EAAYA,OAAAA,CAAM,IAAI,OAAA,CAAQ,KAAK,CAAC,CAAA,CAAE,CAAA;AAAA,MACpD;AACA,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,IAChB;AACA,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,QAAA,GAAW,KAAA,CAAM,IAAA,CAAK,cAAA,CAAe,SAAS,CAAA;AAEpD,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,WAAA,CAAY,QAAQ,CAAA;AACxC,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAC,CAAA;AACzC,IAAA;AAAA,EACF;AAEA,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,0BAA0B,CAAC,CAAA;AAClD,IAAA;AAAA,EACF;AAEA,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,KAAA,CAAM,wBAAwB,CAAC,CAAA;AACjD,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,EAAA,KAAA,MAAW,CAAC,QAAA,EAAU,OAAO,CAAA,IAAK,QAAA,EAAU;AAC1C,IAAA,OAAA,CAAQ,IAAI,CAAA,EAAGA,OAAAA,CAAM,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAE,CAAA;AACrC,IAAA,OAAA,CAAQ,GAAA,CAAI,YAAY,OAAA,CAAQ,KAAK,cAAc,yBAAA,CAA0B,OAAA,CAAQ,MAAM,CAAC,CAAA,CAAE,CAAA;AAC9F,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA,OAAA,CAAQ,IAAI,CAAA,YAAA,EAAeA,OAAAA,CAAM,IAAI,OAAA,CAAQ,QAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,IAC1D;AAAA,EACF;AACA,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAChB;AAKA,SAAS,0BAA0B,MAAA,EAAwC;AACzE,EAAA,QAAQ,MAAA;AAAQ,IACd,KAAK,SAAA;AACH,MAAA,OAAOA,OAAAA,CAAM,KAAK,mBAAY,CAAA;AAAA,IAChC,KAAK,WAAA;AACH,MAAA,OAAOA,OAAAA,CAAM,MAAM,kBAAa,CAAA;AAAA,IAClC,KAAK,QAAA;AACH,MAAA,OAAOA,OAAAA,CAAM,IAAI,eAAU,CAAA;AAAA,IAC7B,KAAK,SAAA;AACH,MAAA,OAAOA,OAAAA,CAAM,OAAO,gBAAW,CAAA;AAAA,IACjC;AACE,MAAA,OAAO,MAAA;AAAA;AAEb;AAKA,eAAsB,UAAA,CAAW,OAAA,GAA8B,EAAC,EAAkB;AAChF,EAAA,MAAM,MAAA,GAAS,MAAM,UAAA,EAAW;AAChC,EAAA,MAAM,YAAA,GAAe,MAAM,eAAA,CAAgB,MAAM,CAAA;AAEjD,EAAA,MAAM,SAAwG,EAAC;AAE/G,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,WAAW,KAAK,MAAA,CAAO,OAAA,CAAQ,cAAc,CAAA,EAAG;AAChE,IAAA,MAAM,SAAA,GAAY,MAAM,gBAAA,CAAiB,WAAW,CAAA;AACpD,IAAA,MAAA,CAAO,IAAI,CAAA,GAAI;AAAA,MACb,MAAM,WAAA,CAAY,IAAA;AAAA,MAClB,SAAA;AAAA,MACA,WAAW,IAAA,KAAS,YAAA;AAAA,MACpB,SAAS,WAAA,CAAY;AAAA,KACvB;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAa,oBAAoB,MAAM,CAAA;AAC7C,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,KAAA,MAAW,CAAC,IAAA,EAAM,WAAW,KAAK,MAAA,CAAO,OAAA,CAAQ,UAAU,CAAA,EAAG;AAC5D,MAAA,IAAI,IAAA,KAAS,aAAa,CAAC,MAAA,CAAO,IAAI,CAAA,IAAK,WAAA,IAAe,OAAO,WAAA,KAAgB,QAAA,EAAU;AACzF,QAAA,MAAM,SAAA,GAAY,MAAM,gBAAA,CAAiB,WAAW,CAAA;AACpD,QAAA,MAAA,CAAO,IAAI,CAAA,GAAI;AAAA,UACb,MAAM,WAAA,CAAY,IAAA;AAAA,UAClB,SAAA;AAAA,UACA,WAAW,IAAA,KAAS,YAAA;AAAA,UACpB,SAAS,WAAA,CAAY;AAAA,SACvB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAC3C,IAAA;AAAA,EACF;AAEA,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,KAAA,CAAM,6BAA6B,CAAC,CAAA;AACtD,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,oBAAoB,CAAC,CAAA;AAC5C,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,IAAA,IAAI,IAAA,CAAK,SAAS,KAAA,EAAO;AACvB,MAAA,MAAM,gBAAgB,IAAA,CAAK,SAAA,GAAYA,OAAAA,CAAM,KAAA,CAAM,YAAY,CAAA,GAAI,EAAA;AACnE,MAAA,MAAM,eAAA,GAAkB,KAAK,SAAA,GAAYA,OAAAA,CAAM,MAAM,QAAG,CAAA,GAAIA,OAAAA,CAAM,GAAA,CAAI,QAAG,CAAA;AACzE,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAK,eAAe,CAAA,CAAA,EAAI,IAAI,CAAA,EAAG,aAAa,CAAA,CAAA,EAAIA,OAAAA,CAAM,IAAI,CAAA,CAAA,EAAI,IAAA,CAAK,OAAO,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAAA;AAAA,IAC9F;AAAA,EACF;AAEA,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,cAAc,CAAC,CAAA;AACtC,EAAA,KAAA,MAAW,CAAC,IAAA,EAAM,IAAI,KAAK,MAAA,CAAO,OAAA,CAAQ,MAAM,CAAA,EAAG;AACjD,IAAA,IAAI,IAAA,CAAK,SAAS,OAAA,EAAS;AACzB,MAAA,MAAM,gBAAgB,IAAA,CAAK,SAAA,GAAYA,OAAAA,CAAM,KAAA,CAAM,YAAY,CAAA,GAAI,EAAA;AACnE,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,SAAA,EAAO,IAAI,CAAA,EAAG,aAAa,CAAA,CAAE,CAAA;AAAA,IAC3C;AAAA,EACF;AAEA,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,6CAA6C,CAAC,CAAA;AACrE,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,yDAAyD,CAAC,CAAA;AACjF,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAChB;AAKA,eAAsB,gBAAgB,KAAA,EAA8B;AAClE,EAAA,MAAM,MAAA,GAAS,MAAM,UAAA,EAAW;AAGhC,EAAA,MAAM,WAAA,GAAc,MAAM,cAAA,CAAe,KAAA,EAAO,MAAM,CAAA;AACtD,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,OAAA,CAAQ,MAAMA,OAAAA,CAAM,GAAA,CAAI,CAAA,eAAA,EAAkB,KAAK,EAAE,CAAC,CAAA;AAClD,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,6DAA6D,CAAC,CAAA;AACrF,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAGA,EAAA,MAAM,gBAAA,GAAmB,MAAA;AACzB,EAAA,gBAAA,CAAiB,MAAA,GAAS,gBAAA,CAAiB,MAAA,IAAU,EAAC;AACtD,EAAA,gBAAA,CAAiB,OAAO,OAAA,GAAU,KAAA;AAClC,EAAA,MAAM,WAAW,gBAAgB,CAAA;AAEjC,EAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,KAAA,CAAM,CAAA,6BAAA,EAA2B,KAAK,EAAE,CAAC,CAAA;AAC7D;;;ACvrBO,SAAS,kBAAA,CAAmB,QAAgB,KAAA,EAAwB;AACzE,EAAA,MAAM,WAAW,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,OAAO,KAAK,CAAA;AACtE,EAAA,OAAO,CAAA,EAAG,MAAM,CAAA,EAAA,EAAK,QAAQ,CAAA,CAAA;AAC/B;AAcO,SAAS,aAAA,CAAc,KAAA,EAAkB,aAAA,GAAgB,CAAA,EAAgB;AAC9E,EAAA,MAAM,GAAA,uBAAU,IAAA,EAAK;AACrB,EAAA,MAAM,aAA0B,EAAC;AAEjC,EAAA,KAAA,MAAW,IAAA,IAAQ,KAAA,CAAM,OAAA,CAAQ,aAAa,CAAA,EAAG;AAE/C,IAAA,MAAM,YAAA,GAAe,IAAA,CAAK,UAAA,IAAc,IAAA,CAAK,OAAA;AAC7C,IAAA,IAAI,CAAC,YAAA,EAAc;AAEnB,IAAA,IAAI;AACF,MAAA,MAAM,YAAA,GAAe,IAAI,IAAA,CAAK,YAAY,CAAA;AAC1C,MAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,KAAA,CAAA,CAAO,GAAA,CAAI,OAAA,EAAQ,GAAI,YAAA,CAAa,OAAA,EAAQ,KAAM,GAAA,GAAO,EAAA,GAAK,EAAA,GAAK,EAAA,CAAG,CAAA;AAErG,MAAA,IAAI,qBAAqB,aAAA,EAAe;AACtC,QAAA,UAAA,CAAW,IAAA,CAAK;AAAA,UACd,MAAM,IAAA,CAAK,IAAA;AAAA,UACX,SAAA,EAAW;AAAA,SACZ,CAAA;AAAA,MACH;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,OAAO,UAAA;AACT;AAKO,SAAS,WAAW,IAAA,EAAqB;AAC9C,EAAA,OAAO;AAAA,IACL,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,MAAA,EAAQ,KAAK,WAAA,CAAY,MAAA;AAAA,IACzB,OAAA,EAAS,KAAK,WAAA,CAAY,OAAA;AAAA,IAC1B,KAAA,EAAO,KAAK,WAAA,CAAY,KAAA;AAAA,IACxB,IAAA,EAAM,KAAK,WAAA,CAAY,IAAA;AAAA,IACvB,QAAA,EAAU,KAAK,WAAA,CAAY,QAAA;AAAA,IAC3B,QAAA,EAAU,KAAK,WAAA,CAAY,QAAA;AAAA,IAC3B,WAAA,EAAa,KAAK,WAAA,CAAY,WAAA;AAAA,IAC9B,YAAA,EAAc,KAAK,WAAA,CAAY,MAAA;AAAA,IAC/B,UAAA,EAAY,KAAK,WAAA,CAAY;AAAA,GAC/B;AACF;AAeA,SAAS,UAAU,OAAA,EAAqC;AACtD,EAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,KAAA,CAAM,aAAa,CAAA;AAC3C,EAAA,OAAO,OAAA,GAAU,CAAC,CAAA,EAAG,IAAA,EAAK;AAC5B;AAKA,SAAS,WAAW,OAAA,EAAyB;AAC3C,EAAA,MAAM,EAAA,GAAK,UAAU,OAAO,CAAA;AAC5B,EAAA,IAAI,EAAA,EAAI;AACN,IAAA,OAAO,EAAA;AAAA,EACT;AAGA,EAAA,MAAM,kBAAA,GAAqB,OAAA,CAAQ,OAAA,CAAQ,mBAAA,EAAqB,EAAE,CAAA;AAClE,EAAA,MAAM,YAAY,kBAAA,CAAmB,IAAA,GAAO,KAAA,CAAM,IAAI,EAAE,CAAC,CAAA;AACzD,EAAA,OAAO,SAAA,CAAU,SAAS,GAAA,GAAM,SAAA,CAAU,UAAU,CAAA,EAAG,EAAE,IAAI,KAAA,GAAQ,SAAA;AACvE;AAMA,eAAsB,oBAAoB,OAAA,EAA8C;AACtF,EAAA,IAAI;AAEF,IAAA,MAAM,WAAW,MAAM,YAAA,CAAa,SAAS,EAAE,cAAA,EAAgB,MAAM,CAAA;AAGrE,IAAA,MAAM,YAAY,QAAA,CAAS,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,UAAU,CAAA;AAG5D,IAAA,MAAM,WAA+B,EAAC;AAEtC,IAAA,KAAA,MAAW,OAAO,SAAA,EAAW;AAE3B,MAAA,MAAM,UAAA,GAAa,MAAM,WAAA,CAAY,EAAE,SAAS,GAAA,CAAI,OAAA,IAAW,IAAI,CAAA;AAEnE,MAAA,MAAM,GAAA,GAAwB;AAAA,QAC5B,MAAM,GAAA,CAAI,IAAA;AAAA,QACV,QAAQ,UAAA,CAAW,KAAA;AAAA,QACnB,MAAM,GAAA,CAAI;AAAA,OACZ;AAGA,MAAA,IAAI,IAAI,OAAA,EAAS;AACf,QAAA,GAAA,CAAI,OAAA,GAAU,UAAA,CAAW,GAAA,CAAI,OAAO,CAAA;AAAA,MACtC;AAEA,MAAA,QAAA,CAAS,KAAK,GAAG,CAAA;AAAA,IACnB;AAEA,IAAA,OAAO,QAAA;AAAA,EACT,SAAS,KAAA,EAAO;AAEd,IAAA,OAAO,EAAC;AAAA,EACV;AACF;;;AC/HO,SAAS,YAAA,GAA+B;AAC7C,EAAA,OAAO;AAAA,IACL,WAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO,WAAA;AAAA,MACP,WAAA,EAAa,4JAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX,KAAA,EAAO,EAAE,KAAA,CAAM,CAAA,CAAE,QAAQ,CAAA,CAAE,SAAS,4CAA4C,CAAA;AAAA,QAChF,KAAA,EAAO,CAAA,CAAE,IAAA,CAAK,CAAC,UAAU,SAAA,EAAW,OAAA,EAAS,QAAA,EAAU,WAAA,EAAa,UAAU,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE,SAAS,0DAA0D,CAAA;AAAA,QAC/J,UAAU,CAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,kDAAkD,CAAA;AAAA,QAC5F,cAAc,CAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,mDAAmD,CAAA;AAAA,QACjG,QAAQ,CAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,2CAA2C;AAAA,OACrF;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,OAAA,EAAS,EAAE,OAAA,EAAQ;AAAA,QACnB,OAAA,EAAS,EAAE,MAAA,EAAO;AAAA,QAClB,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QAC7B,KAAA,EAAO,CAAA,CAAE,KAAA,CAAM,CAAA,CAAE,MAAA,CAAO;AAAA,UACtB,IAAA,EAAM,EAAE,MAAA,EAAO;AAAA,UACf,MAAA,EAAQ,EAAE,MAAA,EAAO;AAAA,UACjB,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,SAC/B,CAAC,CAAA,CAAE,QAAA;AAAS;AACf,KACF;AAAA,IACA,OAAO,OAAO,MAAA,KAAW;AACvB,MAAA,MAAM,cAAc,OAAA,CAAQ,GAAA;AAC5B,MAAA,MAAM,gBAAgB,OAAA,CAAQ,KAAA;AAC9B,MAAA,IAAI;AAEF,QAAA,IAAI,cAAA,GAAiB,EAAA;AACrB,QAAA,OAAA,CAAQ,GAAA,GAAM,IAAI,IAAA,KAAgB;AAChC,UAAA,cAAA,IAAkB,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,GAAI,IAAA;AAAA,QACrC,CAAA;AACA,QAAA,OAAA,CAAQ,KAAA,GAAQ,IAAI,IAAA,KAAgB;AAClC,UAAA,cAAA,IAAkB,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,GAAI,IAAA;AAAA,QACrC,CAAA;AAEA,QAAA,MAAM,QAAA,CAAS,MAAM,KAAA,EAAO;AAAA,UAC1B,OAAO,KAAA,CAAM,KAAA;AAAA,UACb,UAAU,KAAA,CAAM,QAAA;AAAA,UAChB,cAAc,KAAA,CAAM,YAAA;AAAA,UACpB,QAAQ,KAAA,CAAM;AAAA,SACf,CAAA;AAED,QAAA,MAAM,MAAA,GAAS;AAAA,UACb,OAAA,EAAS,IAAA;AAAA,UACT,OAAA,EAAS,cAAc,KAAA,CAAM,KAAA,CAAM,MAAM,CAAA,YAAA,EAAe,KAAA,CAAM,SAAS,SAAS,CAAA,MAAA,CAAA;AAAA,UAChF,OAAA,EAAS,eAAe,IAAA;AAAK,SAC/B;AAEA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA;AAAA,UAC1E,iBAAA,EAAmB;AAAA,SACrB;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,MAAA,GAAS;AAAA,UACb,OAAA,EAAS,KAAA;AAAA,UACT,OAAA,EAAS,kBAAA,CAAmB,qBAAA,EAAuB,KAAK;AAAA,SAC1D;AACA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA;AAAA,UAC1E,iBAAA,EAAmB;AAAA,SACrB;AAAA,MACF,CAAA,SAAE;AACA,QAAA,OAAA,CAAQ,GAAA,GAAM,WAAA;AACd,QAAA,OAAA,CAAQ,KAAA,GAAQ,aAAA;AAAA,MAClB;AAAA,IACF;AAAA,GACF;AACF;AAKO,SAAS,eAAA,GAAkC;AAChD,EAAA,OAAO;AAAA,IACL,cAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAa,iEAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX,MAAM,CAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,8CAA8C;AAAA,OACrF;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,OAAA,EAAS,EAAE,OAAA,EAAQ;AAAA,QACnB,QAAA,EAAU,CAAA,CAAE,MAAA,CAAO,CAAA,CAAE,MAAA,CAAO;AAAA,UAC1B,QAAA,EAAU,EAAE,MAAA,EAAO;AAAA,UACnB,KAAA,EAAO,EAAE,MAAA,EAAO;AAAA,UAChB,MAAA,EAAQ,EAAE,MAAA,EAAO;AAAA,UACjB,SAAA,EAAW,EAAE,MAAA,EAAO;AAAA,UACpB,QAAA,EAAU,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,UAC9B,GAAA,EAAK,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,SAC1B,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,QACb,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS;AAC/B,KACF;AAAA,IACA,OAAO,OAAO,MAAA,KAAW;AACvB,MAAA,MAAM,cAAc,OAAA,CAAQ,GAAA;AAC5B,MAAA,IAAI;AAEF,QAAA,IAAI,cAAA,GAAiB,EAAA;AACrB,QAAA,OAAA,CAAQ,GAAA,GAAM,IAAI,IAAA,KAAgB;AAChC,UAAA,cAAA,IAAkB,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,GAAI,IAAA;AAAA,QACrC,CAAA;AAEA,QAAA,MAAM,gBAAgB,KAAA,CAAM,IAAA,EAAM,EAAE,IAAA,EAAM,MAAM,CAAA;AAEhD,QAAA,IAAI;AACF,UAAA,MAAM,QAAA,GAAW,IAAA,CAAK,KAAA,CAAM,cAAA,CAAe,MAAM,CAAA;AACjD,UAAA,MAAM,MAAA,GAAS;AAAA,YACb,OAAA,EAAS,IAAA;AAAA,YACT;AAAA,WACF;AACA,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA;AAAA,YAC1E,iBAAA,EAAmB;AAAA,WACrB;AAAA,QACF,CAAA,CAAA,MAAQ;AACN,UAAA,MAAM,MAAA,GAAS;AAAA,YACb,OAAA,EAAS,IAAA;AAAA,YACT,OAAA,EAAS,cAAA,CAAe,IAAA,EAAK,IAAK;AAAA,WACpC;AACA,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA;AAAA,YAC1E,iBAAA,EAAmB;AAAA,WACrB;AAAA,QACF;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,MAAA,GAAS;AAAA,UACb,OAAA,EAAS,KAAA;AAAA,UACT,OAAA,EAAS,kBAAA,CAAmB,6BAAA,EAA+B,KAAK;AAAA,SAClE;AACA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA;AAAA,UAC1E,iBAAA,EAAmB;AAAA,SACrB;AAAA,MACF,CAAA,SAAE;AACA,QAAA,OAAA,CAAQ,GAAA,GAAM,WAAA;AAAA,MAChB;AAAA,IACF;AAAA,GACF;AACF;AAKO,SAAS,aAAA,GAAgC;AAC9C,EAAA,OAAO;AAAA,IACL,YAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO,aAAA;AAAA,MACP,WAAA,EAAa,iEAAA;AAAA,MACb,aAAa,EAAC;AAAA,MACd,YAAA,EAAc;AAAA,QACZ,OAAA,EAAS,EAAE,OAAA,EAAQ;AAAA,QACnB,MAAA,EAAQ,CAAA,CAAE,MAAA,CAAO,CAAA,CAAE,MAAA,CAAO;AAAA,UACxB,IAAA,EAAM,EAAE,MAAA,EAAO;AAAA,UACf,SAAA,EAAW,EAAE,OAAA,EAAQ;AAAA,UACrB,SAAA,EAAW,EAAE,OAAA,EAAQ;AAAA,UACrB,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS,SAC9B,CAAC,CAAA,CAAE,QAAA,EAAS;AAAA,QACb,OAAA,EAAS,CAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS;AAC/B,KACF;AAAA,IACA,OAAO,QAAQ,MAAA,KAAW;AACxB,MAAA,MAAM,cAAc,OAAA,CAAQ,GAAA;AAC5B,MAAA,IAAI;AAEF,QAAA,IAAI,cAAA,GAAiB,EAAA;AACrB,QAAA,OAAA,CAAQ,GAAA,GAAM,IAAI,IAAA,KAAgB;AAChC,UAAA,cAAA,IAAkB,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,GAAI,IAAA;AAAA,QACrC,CAAA;AAEA,QAAA,MAAM,UAAA,CAAW,EAAE,IAAA,EAAM,IAAA,EAAM,CAAA;AAE/B,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,cAAA,CAAe,MAAM,CAAA;AAC/C,UAAA,MAAM,MAAA,GAAS;AAAA,YACb,OAAA,EAAS,IAAA;AAAA,YACT;AAAA,WACF;AACA,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA;AAAA,YAC1E,iBAAA,EAAmB;AAAA,WACrB;AAAA,QACF,CAAA,CAAA,MAAQ;AACN,UAAA,MAAM,MAAA,GAAS;AAAA,YACb,OAAA,EAAS,KAAA;AAAA,YACT,OAAA,EAAS;AAAA,WACX;AACA,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA;AAAA,YAC1E,iBAAA,EAAmB;AAAA,WACrB;AAAA,QACF;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,MAAA,GAAS;AAAA,UACb,OAAA,EAAS,KAAA;AAAA,UACT,OAAA,EAAS,kBAAA,CAAmB,sBAAA,EAAwB,KAAK;AAAA,SAC3D;AACA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA;AAAA,UAC1E,iBAAA,EAAmB;AAAA,SACrB;AAAA,MACF,CAAA,SAAE;AACA,QAAA,OAAA,CAAQ,GAAA,GAAM,WAAA;AAAA,MAChB;AAAA,IACF;AAAA,GACF;AACF;AC7MA,eAAsB,UAAA,GAAsC;AAC1D,EAAA,IAAI;AACF,IAAA,MAAM,IAAA,GAAO,SAAS,sBAAA,EAAwB,EAAE,UAAU,OAAA,EAAS,EAAE,IAAA,EAAK;AAC1E,IAAA,MAAM,KAAA,GAAQ,SAAS,uBAAA,EAAyB,EAAE,UAAU,OAAA,EAAS,EAAE,IAAA,EAAK;AAG5E,IAAA,IAAI,IAAA,GAAO,EAAA;AACX,IAAA,IAAI;AACF,MAAA,MAAM,SAAA,GAAY,SAAS,oCAAA,EAAsC,EAAE,UAAU,OAAA,EAAS,EAAE,IAAA,EAAK;AAI7F,MAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,KAAA,CAAM,uBAAuB,CAAA;AACrD,MAAA,IAAI,KAAA,EAAO;AACT,QAAA,IAAA,GAAO,MAAM,CAAC,CAAA;AAAA,MAChB;AAAA,IACF,CAAA,CAAA,MAAQ;AAEN,MAAA,IAAA,GAAO,EAAA;AAAA,IACT;AAEA,IAAA,OAAO,EAAE,IAAA,EAAM,KAAA,EAAO,IAAA,EAAK;AAAA,EAC7B,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAKA,eAAsB,cAAA,CAAe,GAAA,GAAc,OAAA,CAAQ,GAAA,EAAI,EAA2B;AACxF,EAAA,IAAI;AACF,IAAA,MAAM,eAAA,GAAuBM,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,cAAc,CAAA;AACrD,IAAA,MAAM,OAAA,GAAU,MAASC,GAAA,CAAA,QAAA,CAAS,eAAA,EAAiB,OAAO,CAAA;AAC1D,IAAA,MAAMC,YAAAA,GAAc,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AACtC,IAAA,OAAOA,aAAY,IAAA,IAAQ,IAAA;AAAA,EAC7B,CAAA,CAAA,MAAQ;AAEN,IAAA,OAAO,IAAA;AAAA,EACT;AACF;AAKA,SAAS,aAAa,MAAA,EAAwB;AAC5C,EAAA,MAAM,SAAA,GAAoC;AAAA,IACxC,SAAA,EAAW,mBAAA;AAAA,IACX,aAAA,EAAe,oBAAA;AAAA,IACf,UAAA,EAAY,iBAAA;AAAA,IACZ,UAAA,EAAY;AAAA,GACd;AACA,EAAA,OAAO,SAAA,CAAU,MAAM,CAAA,IAAK,MAAA;AAC9B;AAKA,SAAS,eAAe,QAAA,EAA0B;AAChD,EAAA,OAAO,QAAA,CAAS,OAAO,CAAC,CAAA,CAAE,aAAY,GAAI,QAAA,CAAS,MAAM,CAAC,CAAA;AAC5D;AAKA,SAAS,sBAAA,CAAuB,KAAa,KAAA,EAAwB;AACnE,EAAA,IAAI,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,EAAW;AACzC,IAAA,OAAO,EAAA;AAAA,EACT;AAGA,EAAA,IAAI,GAAA,KAAQ,QAAA,IAAY,OAAO,KAAA,KAAU,QAAA,EAAU;AACjD,IAAA,OAAO,aAAa,KAAK,CAAA;AAAA,EAC3B;AAGA,EAAA,IAAI,GAAA,KAAQ,UAAA,IAAc,OAAO,KAAA,KAAU,QAAA,EAAU;AACnD,IAAA,OAAO,eAAe,KAAK,CAAA;AAAA,EAC7B;AAGA,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,EACxB;AAGA,EAAA,IAAI,OAAO,UAAU,QAAA,EAAU;AAC7B,IAAA,OAAO,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,EAC7B;AAGA,EAAA,OAAO,OAAO,KAAK,CAAA;AACrB;AAKO,SAAS,gBAAA,CACd,UACA,OAAA,EACQ;AACR,EAAA,IAAI,MAAA,GAAS,QAAA;AAGb,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,SAAA,EAAW,OAAA,CAAQ,IAAI,CAAA;AAAA,EACjD;AAEA,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,SAAA,EAAW,OAAA,CAAQ,IAAI,CAAA;AAAA,EACjD;AAEA,EAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,IAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,iBAAA,EAAmB,OAAA,CAAQ,WAAW,CAAA;AAAA,EAChE;AAGA,EAAA,IAAI,QAAQ,OAAA,EAAS;AACnB,IAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,WAAA,EAAa,OAAA,CAAQ,QAAQ,IAAI,CAAA;AACzD,IAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,aAAA,EAAe,OAAA,CAAQ,QAAQ,IAAI,CAAA;AAC3D,IAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,cAAA,EAAgB,OAAA,CAAQ,QAAQ,KAAK,CAAA;AAC7D,IAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,aAAA,EAAe,OAAA,CAAQ,QAAQ,IAAI,CAAA;AAAA,EAC7D;AAGA,EAAA,IAAI,QAAQ,eAAA,EAAiB;AAC3B,IAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,OAAA,CAAQ,eAAe,CAAA,EAAG;AAElE,MAAA,MAAM,UAAA,GAAa,GAAA,CAAI,OAAA,CAAQ,qBAAA,EAAuB,MAAM,CAAA;AAC5D,MAAA,MAAM,UAAU,IAAI,MAAA,CAAO,CAAA,GAAA,EAAM,UAAU,OAAO,GAAG,CAAA;AACrD,MAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,OAAA,EAAS,KAAK,CAAA;AAAA,IACxC;AAAA,EACF;AAGA,EAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,IAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC9D,MAAA,MAAM,cAAA,GAAiB,sBAAA,CAAuB,GAAA,EAAK,KAAK,CAAA;AAExD,MAAA,MAAM,UAAA,GAAa,GAAA,CAAI,OAAA,CAAQ,qBAAA,EAAuB,MAAM,CAAA;AAC5D,MAAA,MAAM,UAAU,IAAI,MAAA,CAAO,CAAA,GAAA,EAAM,UAAU,OAAO,GAAG,CAAA;AACrD,MAAA,MAAA,GAAS,MAAA,CAAO,OAAA,CAAQ,OAAA,EAAS,cAAc,CAAA;AAAA,IACjD;AAAA,EACF;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,eAAsB,oBAAA,CACpB,MAAA,EACA,OAAA,GAGI,EAAC,EACqB;AAC1B,EAAA,MAAM,OAAA,GAA2B;AAAA,IAC/B,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,IAAA,EAAM,OAAA,CAAQ,IAAA,IAAA,iBAAQ,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA;AAAA,IAC3D,eAAA,EAAiB,MAAA,CAAO,SAAA,IAAa;AAAC,GACxC;AAGA,EAAA,OAAA,CAAQ,WAAA,GAAe,MAAM,cAAA,EAAe,IAAM,MAAA;AAGlD,EAAA,OAAA,CAAQ,OAAA,GAAW,MAAM,UAAA,EAAW,IAAM,MAAA;AAE1C,EAAA,OAAO,OAAA;AACT;ACtLO,SAAS,WAAA,GAAuB;AACrC,EAAA,OAAO,IAAIP,QAAQ,MAAM,CAAA,CACtB,YAAY,uDAAuD,CAAA,CACnE,QAAA,CAAS,QAAA,EAAU,gBAAgB,CAAA,CACnC,OAAO,sBAAA,EAAwB,0DAA0D,EACzF,MAAA,CAAO,mBAAA,EAAqB,2DAA2D,CAAA,CACvF,MAAA,CAAO,OAAO,QAAA,EAAkB,OAAA,KAG3B;AACJ,IAAA,IAAI,CAAC,OAAA,CAAQ,SAAA,IAAa,CAAC,QAAQ,OAAA,EAAS;AAC1C,MAAA,OAAA,CAAQ,MAAM,4EAA4E,CAAA;AAC1F,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,MAAM,QAAA,CAAS,UAAU,OAAO,CAAA;AAAA,EAClC,CAAC,CAAA;AACL;AAEA,eAAsB,QAAA,CACpB,UACA,OAAA,EAIe;AAEf,EAAA,MAAM,kBAAA,EAAmB;AAEzB,EAAA,MAAM,MAAA,GAAS,MAAM,UAAA,EAAW;AAChC,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AACxB,EAAA,MAAM,QAAA,GAAgBQ,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,MAAA,CAAO,QAAQ,CAAA;AAG/C,EAAA,MAAM,YAAA,GAAe,MAAM,eAAA,CAAgB,QAAA,EAAU,KAAK,QAAQ,CAAA;AAClE,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,iBAAA,CAAkB,QAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,EAClE;AAGA,EAAA,MAAM,WAAW,MAAM,WAAA,CAAY,YAAA,EAAc,MAAA,CAAO,UAAU,WAAW,CAAA;AAC7E,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,iBAAA,CAAkB,QAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,EACzE;AAGA,EAAA,MAAM,WAAW,MAAM,YAAA,CAAa,EAAE,eAAA,EAAiB,MAAM,CAAA;AAC7D,EAAA,MAAM,OAAA,GAAU,IAAI,GAAA,CAAI,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,KAAK,CAAC,CAAA,CAAE,IAAA,EAAM,CAAC,CAAC,CAAC,CAAA;AAGtD,EAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,SAAA,GAAY,OAAA,CAAQ,UAAU,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,EAAM,IAAI,EAAC;AAC9F,EAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,OAAA,GAAU,OAAA,CAAQ,QAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,EAAM,IAAI,EAAC;AAGxF,EAAA,MAAM,cAAA,GAAsBA,gBAAS,YAAY,CAAA;AAGjD,EAAA,MAAM,oBAAA,GAAuB,CAAC,GAAG,cAAA,EAAgB,GAAG,YAAY,CAAA;AAChE,EAAA,MAAM,qBAAA,uBAA4B,GAAA,EAAoB;AAEtD,EAAA,KAAA,MAAW,WAAW,oBAAA,EAAsB;AAE1C,IAAA,IAAI,OAAA,KAAY,cAAA,IAAkB,OAAA,KAAY,QAAA,EAAU;AACtD,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,iBAAA,CAAkB,OAAO,CAAC,CAAA,CAAE,CAAA;AAAA,IAC7E;AAEA,IAAA,MAAM,eAAA,GAAkB,MAAM,eAAA,CAAgB,OAAA,EAAS,KAAK,QAAQ,CAAA;AACpE,IAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,iBAAA,CAAkB,OAAO,CAAC,CAAA,CAAE,CAAA;AAAA,IACjE;AAGA,IAAA,IAAI,oBAAoB,YAAA,EAAc;AACpC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,4BAAA,EAA+B,iBAAA,CAAkB,OAAO,CAAC,CAAA,CAAE,CAAA;AAAA,IAC7E;AAEA,IAAA,MAAM,WAAA,GAAmBA,gBAAS,eAAe,CAAA;AACjD,IAAA,qBAAA,CAAsB,GAAA,CAAI,SAAS,WAAW,CAAA;AAAA,EAChD;AAGA,EAAA,MAAM,EAAE,gBAAA,EAAAC,iBAAAA,EAAiB,GAAI,MAAM,OAAO,2BAAmB,CAAA;AAC7D,EAAA,MAAM,kBAAA,GAAqB,MAAMA,iBAAAA,CAAiB,QAAQ,CAAA;AAC1D,EAAA,MAAM,gBAAA,GAAmB,kBAAA,EAAoB,UAAA,IAAc,EAAC;AAC5D,EAAA,MAAM,cAAA,GAAiB,kBAAA,EAAoB,OAAA,IAAW,EAAC;AAGvD,EAAA,MAAM,UAAyD,EAAC;AAEhE,EAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,IAAA,MAAM,YAAA,GAAe,CAAC,GAAG,gBAAgB,CAAA;AACzC,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,KAAA,MAAW,QAAQ,cAAA,EAAgB;AACjC,MAAA,MAAM,YAAA,GAAe,qBAAA,CAAsB,GAAA,CAAI,IAAI,CAAA;AACnD,MAAA,IAAI,YAAA,IAAgB,CAAC,YAAA,CAAa,QAAA,CAAS,YAAY,CAAA,EAAG;AACxD,QAAA,YAAA,CAAa,KAAK,YAAY,CAAA;AAC9B,QAAA,KAAA,EAAA;AAAA,MACF;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,UAAA,GAAa,YAAA;AACrB,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,OAAA,CAAQ,GAAA,CAAIV,OAAAA,CAAM,IAAA,CAAK,CAAA,kDAAA,CAA+C,CAAC,CAAA;AAAA,IACzE;AAAA,EACF;AAEA,EAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,IAAA,MAAM,UAAA,GAAa,CAAC,GAAG,cAAc,CAAA;AACrC,IAAA,IAAI,KAAA,GAAQ,CAAA;AACZ,IAAA,MAAM,uBAAiC,EAAC;AAExC,IAAA,KAAA,MAAW,QAAQ,YAAA,EAAc;AAC/B,MAAA,MAAM,YAAA,GAAe,qBAAA,CAAsB,GAAA,CAAI,IAAI,CAAA;AACnD,MAAA,IAAI,YAAA,IAAgB,CAAC,UAAA,CAAW,QAAA,CAAS,YAAY,CAAA,EAAG;AACtD,QAAA,UAAA,CAAW,KAAK,YAAY,CAAA;AAC5B,QAAA,KAAA,EAAA;AACA,QAAA,oBAAA,CAAqB,KAAK,YAAY,CAAA;AAAA,MACxC;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,OAAA,GAAU,UAAA;AAGlB,IAAA,KAAA,MAAW,eAAe,oBAAA,EAAsB;AAC9C,MAAA,MAAM,WAAA,GAAc,MAAM,eAAA,CAAgB,WAAA,EAAa,KAAK,QAAQ,CAAA;AACpE,MAAA,IAAI,WAAA,EAAa;AACf,QAAA,MAAM,cAAc,MAAM,WAAA,CAAY,WAAA,EAAa,MAAA,CAAO,UAAU,WAAW,CAAA;AAC/E,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,MAAM,cAAA,GAAiB,MAAMU,iBAAAA,CAAiB,WAAW,CAAA;AACzD,UAAA,MAAM,iBAAA,GAAoB,cAAA,EAAgB,OAAA,IAAW,EAAC;AACtD,UAAA,IAAI,CAAC,iBAAA,CAAkB,QAAA,CAAS,cAAc,CAAA,EAAG;AAC/C,YAAA,MAAM,kBAAkB,WAAA,EAAa;AAAA,cACnC,OAAA,EAAS,CAAC,GAAG,iBAAA,EAAmB,cAAc;AAAA,aAC/C,CAAA;AACD,YAAA,OAAA,CAAQ,GAAA,CAAIV,QAAM,IAAA,CAAK,CAAA,WAAA,EAAc,kBAAkB,WAAW,CAAC,kBAAkB,CAAC,CAAA;AAAA,UACxF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,IAAI,UAAU,CAAA,EAAG;AACf,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,CAAA,mDAAA,CAAgD,CAAC,CAAA;AAAA,IAC1E;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,CAAQ,UAAA,IAAc,OAAA,CAAQ,UAAA,CAAW,SAAS,CAAA,EAAG;AACvD,IAAA,MAAM,MAAA,GAAS,YAAA,CAAa,cAAA,EAAgB,OAAA,CAAQ,YAAY,OAAO,CAAA;AACvE,IAAA,IAAI,MAAA,CAAO,SAAS,CAAA,EAAG;AACrB,MAAA,OAAA,CAAQ,GAAA,CAAIA,QAAM,MAAA,CAAO,CAAA,yCAAA,EAAkC,OAAO,IAAA,CAAK,UAAK,CAAC,CAAA,CAAE,CAAC,CAAA;AAAA,IAClF;AAAA,EACF;AAGA,EAAA,MAAM,iBAAA,CAAkB,UAAU,OAAO,CAAA;AAGzC,EAAA,MAAM,gBAA0B,EAAC;AACjC,EAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,IAAA,aAAA,CAAc,KAAK,CAAA,YAAA,EAAe,cAAA,CAAe,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EAC/D;AACA,EAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,IAAA,aAAA,CAAc,KAAK,CAAA,SAAA,EAAY,YAAA,CAAa,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,EAC1D;AAEA,EAAA,OAAA,CAAQ,GAAA,CAAIA,QAAM,KAAA,CAAM,CAAA,4BAAA,EAA0B,cAAc,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAC,CAAA;AAC7E,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,CAAA,WAAA,EAAc,iBAAA,CAAuBS,MAAA,CAAA,QAAA,CAAS,GAAA,EAAK,YAAY,CAAC,CAAC,CAAA,CAAE,CAAC,CAAA;AAC7F;AAKA,SAAS,YAAA,CACP,SAAA,EACA,SAAA,EACA,OAAA,EACA,OAAA,uBAA2B,GAAA,EAAI,EAC/BV,MAAAA,GAAiB,EAAC,EACR;AACV,EAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,SAAS,CAAA,EAAG;AAE1B,IAAA,MAAM,UAAA,GAAaA,MAAAA,CAAK,OAAA,CAAQ,SAAS,CAAA;AACzC,IAAA,IAAI,eAAe,EAAA,EAAI;AACrB,MAAA,OAAO,CAAC,GAAGA,MAAAA,CAAK,KAAA,CAAM,UAAU,GAAG,SAAS,CAAA;AAAA,IAC9C;AACA,IAAA,OAAO,EAAC;AAAA,EACV;AAEA,EAAA,OAAA,CAAQ,IAAI,SAAS,CAAA;AACrB,EAAAA,MAAAA,CAAK,KAAK,SAAS,CAAA;AAGnB,EAAA,KAAA,MAAW,OAAO,SAAA,EAAW;AAC3B,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,GAAG,CAAA;AAC/B,IAAA,IAAI,OAAA,IAAW,OAAA,CAAQ,WAAA,CAAY,UAAA,EAAY;AAC7C,MAAA,MAAM,KAAA,GAAQ,YAAA,CAAa,GAAA,EAAK,OAAA,CAAQ,YAAY,UAAA,EAAY,OAAA,EAAS,IAAI,GAAA,CAAI,OAAO,CAAA,EAAG,CAAC,GAAGA,MAAI,CAAC,CAAA;AACpG,MAAA,IAAI,KAAA,CAAM,SAAS,CAAA,EAAG;AACpB,QAAA,OAAO,KAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAC;AACV;;;ACnMO,SAAS,aAAA,GAAyB;AACvC,EAAA,OAAO,IAAIE,OAAAA,CAAQ,QAAQ,CAAA,CACxB,WAAA,CAAY,qCAAqC,CAAA,CACjD,QAAA,CAAS,QAAA,EAAU,kBAAkB,CAAA,CACrC,MAAA,CAAO,mBAAmB,kBAAkB,CAAA,CAC5C,MAAA,CAAO,sBAAA,EAAwB,yBAAyB,CAAA,CACxD,MAAA,CAAO,eAAA,EAAiB,4BAA4B,CAAA,CACpD,MAAA,CAAO,uBAAA,EAAyB,4CAA4C,CAAA,CAC5E,OAAO,mBAAA,EAAqB,cAAc,CAAA,CAC1C,MAAA,CAAO,uBAAA,EAAyB,yBAAyB,EACzD,MAAA,CAAO,yBAAA,EAA2B,yCAAyC,CAAA,CAC3E,MAAA,CAAO,aAAA,EAAe,qCAAqC,CAAA,CAC3D,MAAA,CAAO,sBAAA,EAAwB,0DAA0D,CAAA,CACzF,MAAA,CAAO,mBAAA,EAAqB,2DAA2D,CAAA,CACvF,MAAA,CAAO,OAAO,IAAA,EAAc,OAAA,KAWvB;AACJ,IAAA,MAAM,YAAA,GAAe,uBAAA,CAAwB,OAAA,CAAQ,KAAK,CAAA;AAC1D,IAAA,MAAM,aAAA,GAWF;AAAA,MACF,OAAO,OAAA,CAAQ,KAAA;AAAA,MACf,aAAa,OAAA,CAAQ,WAAA;AAAA,MACrB,IAAA,EAAM,OAAA,CAAQ,IAAA,GAAO,OAAA,CAAQ,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,EAAM,CAAA,GAAI,MAAA;AAAA,MAClE,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,cAAc,MAAA,CAAO,IAAA,CAAK,YAAY,CAAA,CAAE,MAAA,GAAS,IAAI,YAAA,GAAe,MAAA;AAAA,MACpE,QAAA,EAAU,QAAQ,MAAA,KAAW,KAAA;AAAA,MAC7B,SAAA,EAAW,OAAA,CAAQ,SAAA,GAAY,OAAA,CAAQ,SAAA,CAAU,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,EAAM,CAAA,GAAI,MAAA;AAAA,MACjF,OAAA,EAAS,OAAA,CAAQ,OAAA,GAAU,OAAA,CAAQ,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,EAAM,CAAA,GAAI;AAAA,KAC7E;AACA,IAAA,MAAM,UAAA,CAAW,MAAM,aAAa,CAAA;AAAA,EACtC,CAAC,CAAA;AACL;AAEA,eAAsB,UAAA,CAAW,IAAA,EAAc,OAAA,GAW3C,EAAC,EAAkB;AACrB,EAAA,MAAM,MAAA,GAAS,MAAM,UAAA,EAAW;AAChC,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AACxB,EAAA,MAAM,QAAA,GAAgBU,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,MAAA,CAAO,QAAQ,CAAA;AAG/C,EAAA,MAASC,GAAA,CAAA,KAAA,CAAM,QAAA,EAAU,EAAE,SAAA,EAAW,MAAM,CAAA;AAG5C,EAAA,MAAM,MAAM,MAAM,gBAAA,CAAiB,QAAA,EAAU,MAAA,CAAO,UAAU,cAAc,CAAA;AAG5E,EAAA,IAAI,gBAAA;AAEJ,EAAA,IAAI,MAAA,CAAO,SAAA,CAAU,OAAA,KAAY,MAAA,EAAQ;AAEvC,IAAA,MAAM,MAAA,GAAS,OAAA,CAAQ,QAAA,GACnB,EAAA,GACA,OAAO,SAAA,CAAU,MAAA,GACf,aAAA,CAAc,MAAA,CAAO,SAAA,CAAU,MAAA,EAAQ,MAAA,CAAO,SAAA,CAAU,UAAU,CAAA,GAClE,EAAA;AACN,IAAA,gBAAA,GAAmB,CAAA,EAAG,MAAM,CAAA,EAAG,GAAG,IAAI,IAAI,CAAA,CAAA;AAAA,EAC5C,CAAA,MAAA,IAAW,MAAA,CAAO,SAAA,CAAU,OAAA,KAAY,QAAA,EAAU;AAEhD,IAAA,IAAI,CAAC,MAAA,CAAO,SAAA,CAAU,cAAA,EAAgB;AACpC,MAAA,MAAM,IAAI,MAAM,4DAA4D,CAAA;AAAA,IAC9E;AAEA,IAAA,MAAM,KAAA,GAAQ,YAAA;AAAA,MACZ,OAAO,SAAA,CAAU,cAAA;AAAA,MACjB,OAAO,SAAA,CAAU,UAAA;AAAA,MACjB,OAAA,CAAQ,YAAA;AAAA,MACR,OAAO,SAAA,CAAU;AAAA,KACnB;AAEA,IAAA,gBAAA,GAAmB,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,GAAG,IAAI,IAAI,CAAA,CAAA;AAAA,EAC5C,CAAA,MAAO;AAEL,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,iBAAA,EAAoB,MAAA,CAAO,SAAA,CAAU,OAAO,CAAA,CAAE,CAAA;AAAA,EAChE;AAEA,EAAA,MAAM,OAAA,GAAeD,MAAA,CAAA,IAAA,CAAK,QAAA,EAAU,gBAAgB,CAAA;AACpD,EAAA,MAAM,QAAA,GAAgBA,MAAA,CAAA,IAAA,CAAK,OAAA,EAAS,MAAA,CAAO,UAAU,WAAW,CAAA;AAGhE,EAAA,IAAI;AACF,IAAA,MAASC,WAAO,OAAO,CAAA;AAEvB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,iBAAA,CAAkB,OAAO,CAAC,CAAA,CAAE,CAAA;AAAA,EACtE,SAAS,KAAA,EAAY;AAEnB,IAAA,IAAI,KAAA,CAAM,SAAS,QAAA,EAAU,CAE7B,MAAO;AAEL,MAAA,MAAM,KAAA;AAAA,IACR;AAAA,EACF;AAGA,EAAA,MAASA,GAAA,CAAA,KAAA,CAAM,OAAA,EAAS,EAAE,SAAA,EAAW,MAAM,CAAA;AAG3C,EAAA,MAAM,YAAA,GAAoBD,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,YAAA,EAAc,WAAW,CAAA;AAC7D,EAAA,IAAI,YAAA;AACJ,EAAA,IAAI,WAAA,GAA6B,IAAA;AAGjC,EAAA,IAAI,QAAQ,QAAA,EAAU;AAEpB,IAAA,IAAI,MAAA,CAAO,SAAA,GAAY,OAAA,CAAQ,QAAQ,CAAA,EAAG;AACxC,MAAA,YAAA,GAAe,MAAA,CAAO,SAAA,CAAU,OAAA,CAAQ,QAAQ,CAAA;AAAA,IAClD,CAAA,MAAO;AACL,MAAA,MAAM,SAAA,GAAY,OAAO,IAAA,CAAK,MAAA,CAAO,aAAa,EAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAC/D,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,QAAQ,QAAQ,CAAA,uBAAA,EAA0B,SAAS,CAAA,CAAE,CAAA;AAAA,IAC9F;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,YAAA,GAAe,OAAO,QAAA,IAAY,kBAAA;AAAA,EACpC;AAEA,EAAA,IAAI,YAAA,GAAoBA,MAAA,CAAA,IAAA,CAAK,YAAA,EAAc,YAAY,CAAA;AAGvD,EAAA,IAAI;AACF,IAAA,MAAME,KAAAA,GAAO,MAASD,GAAA,CAAA,IAAA,CAAK,YAAY,CAAA;AACvC,IAAA,IAAIC,KAAAA,CAAK,aAAY,EAAG;AAEtB,MAAA,WAAA,GAAc,YAAA;AACd,MAAA,YAAA,GAAoBF,MAAA,CAAA,IAAA,CAAK,aAAa,WAAW,CAAA;AAEjD,MAAA,MAASC,WAAO,YAAY,CAAA;AAAA,IAC9B;AAAA,EAEF,CAAA,CAAA,MAAQ;AAGN,IAAA,MAAM,UAAA,GAAkBD,MAAA,CAAA,IAAA,CAAK,YAAA,EAAc,kBAAkB,CAAA;AAC7D,IAAA,IAAI;AACF,MAAA,MAASC,WAAO,UAAU,CAAA;AAC1B,MAAA,YAAA,GAAe,UAAA;AACf,MAAA,YAAA,GAAe,kBAAA;AAAA,IACjB,CAAA,CAAA,MAAQ;AAEN,MAAA,MAAM,UAAA,GAAkBD,MAAA,CAAA,IAAA,CAAK,YAAA,EAAc,WAAW,CAAA;AACtD,MAAA,IAAI;AACF,QAAA,MAASC,WAAO,UAAU,CAAA;AAC1B,QAAA,YAAA,GAAe,UAAA;AACf,QAAA,YAAA,GAAe,WAAA;AAAA,MACjB,CAAA,CAAA,MAAQ;AACN,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,YAAY,CAAA,qBAAA,CAAuB,CAAA;AAAA,MAC5E;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,OAAA;AACJ,EAAA,IAAI,UAAA;AAEJ,EAAA,IAAI;AACF,IAAA,MAAM,QAAA,GAAW,MAASA,GAAA,CAAA,QAAA,CAAS,YAAA,EAAc,OAAO,CAAA;AACxD,IAAA,MAAM,IAAA,GAAA,qBAAW,IAAA,EAAK,EAAE,aAAY,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA;AAClD,IAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,IAAA;AAG/B,IAAA,UAAA,GAAa,MAAM,oBAAA,CAAqB,MAAA,EAAQ,EAAE,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AACrE,IAAA,OAAA,GAAU,gBAAA,CAAiB,UAAU,UAAU,CAAA;AAK/C,IAAA,MAAM,MAAA,GAAS,OAAO,OAAA,EAAS;AAAA,MAC7B,OAAA,EAAS;AAAA,QACP,IAAA,EAAM,CAAC,GAAA,KAAQ,IAAA,CAAK,IAAA,CAAK,KAAK,EAAE,MAAA,EAAQ,IAAA,CAAK,eAAA,EAAiB;AAAA;AAChE,KACD,CAAA;AAGD,IAAA,mBAAA,CAAoB,OAAO,IAAI,CAAA;AAG/B,IAAA,IAAI,OAAA,CAAQ,IAAA,IAAQ,OAAA,CAAQ,IAAA,CAAK,SAAS,CAAA,EAAG;AAC3C,MAAA,MAAA,CAAO,IAAA,CAAK,OAAO,OAAA,CAAQ,IAAA;AAAA,IAC7B;AAEA,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA,MAAA,CAAO,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AAAA,IACjC;AAEA,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA,MAAA,CAAO,IAAA,CAAK,WAAW,OAAA,CAAQ,QAAA;AAAA,IACjC;AAEA,IAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,MAAA,KAAA,MAAW,CAAC,KAAK,KAAK,CAAA,IAAK,OAAO,OAAA,CAAQ,OAAA,CAAQ,YAAY,CAAA,EAAG;AAC/D,QAAA,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,GAAI,KAAA;AAAA,MACrB;AAAA,IACF;AAKA,IAAA,MAAM,sBAAA,GAAyB;AAAA,MAC7B,GAAG,UAAA;AAAA,MACH,aAAa,MAAA,CAAO;AAAA,KACtB;AACA,IAAA,MAAA,CAAO,OAAA,GAAU,gBAAA,CAAiB,MAAA,CAAO,OAAA,EAAS,sBAAsB,CAAA;AAGxE,IAAA,MAAM,EAAE,oBAAA,EAAqB,GAAI,MAAM,OAAO,2BAAmB,CAAA;AACjE,IAAA,oBAAA,CAAqB,OAAO,IAAI,CAAA;AAGhC,IAAA,OAAA,GAAU,MAAA,CAAO,SAAA,CAAU,MAAA,CAAO,OAAA,EAAS,OAAO,IAAI,CAAA;AAGtD,IAAA,IAAI,QAAQ,WAAA,EAAa;AACvB,MAAA,OAAA,GAAU,OAAA,CAAQ,OAAA;AAAA,QAChB,wDAAA;AAAA,QACA,CAAA;;AAAA,EAAkB,QAAQ,WAAW,CAAA;AAAA,OACvC;AAAA,IACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,YAAY,CAAA,qBAAA,CAAuB,CAAA;AAAA,EAC5E;AAEA,EAAA,MAASA,GAAA,CAAA,SAAA,CAAU,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAI7C,EAAA,IAAI;AACF,IAAA,IAAI,kBAA4B,EAAC;AAEjC,IAAA,IAAI,WAAA,EAAa;AAEf,MAAA,MAAM,aAAA,GAAgB,MAASA,GAAA,CAAA,OAAA,CAAQ,WAAW,CAAA;AAClD,MAAA,eAAA,GAAkB,aAAA,CAAc,MAAA;AAAA,QAAO,CAAA,CAAA,KACrC,CAAA,CAAE,QAAA,CAAS,KAAK,KAAK,CAAA,KAAM;AAAA,OAC7B;AAAA,IACF;AAEA,IAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,MAAA,KAAA,MAAW,QAAQ,eAAA,EAAiB;AAClC,QAAA,MAAM,OAAA,GAAeD,MAAA,CAAA,IAAA,CAAK,WAAA,EAAc,IAAI,CAAA;AAC5C,QAAA,MAAM,QAAA,GAAgBA,MAAA,CAAA,IAAA,CAAK,OAAA,EAAS,IAAI,CAAA;AAGxC,QAAA,IAAI,WAAA,GAAc,MAASC,GAAA,CAAA,QAAA,CAAS,OAAA,EAAS,OAAO,CAAA;AAGpD,QAAA,WAAA,GAAc,gBAAA,CAAiB,aAAa,UAAU,CAAA;AAGtD,QAAA,MAASA,GAAA,CAAA,SAAA,CAAU,QAAA,EAAU,WAAA,EAAa,OAAO,CAAA;AAAA,MACnD;AACA,MAAA,OAAA,CAAQ,GAAA,CAAIZ,QAAM,KAAA,CAAM,CAAA,gBAAA,EAAc,kBAAkB,OAAO,CAAC,GAAG,CAAC,CAAA;AACpE,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAY,MAAA,CAAO,SAAA,CAAU,WAAW,CAAA,EAAA,EAAK,eAAA,CAAgB,IAAA,CAAK,IAAI,CAAC,EAAE,CAAC,CAAA;AAAA,IACnG,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,GAAA,CAAIA,QAAM,KAAA,CAAM,CAAA,gBAAA,EAAc,kBAAkB,OAAO,CAAC,GAAG,CAAC,CAAA;AACpE,MAAA,OAAA,CAAQ,GAAA,CAAIA,QAAM,IAAA,CAAK,CAAA,QAAA,EAAW,kBAAkB,QAAQ,CAAC,EAAE,CAAC,CAAA;AAAA,IAClE;AAAA,EACF,SAAS,KAAA,EAAO;AAEd,IAAA,OAAA,CAAQ,GAAA,CAAIA,QAAM,KAAA,CAAM,CAAA,gBAAA,EAAc,kBAAkB,OAAO,CAAC,GAAG,CAAC,CAAA;AACpE,IAAA,OAAA,CAAQ,GAAA,CAAIA,QAAM,IAAA,CAAK,CAAA,QAAA,EAAW,kBAAkB,QAAQ,CAAC,EAAE,CAAC,CAAA;AAAA,EAClE;AAGA,EAAA,MAAM,gBAAA,GAAoB,OAAA,CAAQ,SAAA,IAAa,OAAA,CAAQ,SAAA,CAAU,MAAA,GAAS,CAAA,IAChD,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,OAAA,CAAQ,MAAA,GAAS,CAAA;AACtE,EAAA,IAAI,gBAAA,EAAkB;AACpB,IAAA,MAAM,WAAA,GAAmBW,gBAAS,OAAO,CAAA;AACzC,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,WAAA,EAAa;AAAA,QAC1B,SAAA,EAAW,OAAA,CAAQ,SAAA,EAAW,IAAA,CAAK,GAAG,CAAA;AAAA,QACtC,OAAA,EAAS,OAAA,CAAQ,OAAA,EAAS,IAAA,CAAK,GAAG;AAAA,OACnC,CAAA;AAAA,IACH,SAAS,KAAA,EAAY;AACnB,MAAA,OAAA,CAAQ,IAAIX,OAAAA,CAAM,MAAA,CAAO,uDAA6C,KAAA,CAAM,OAAO,EAAE,CAAC,CAAA;AAAA,IACxF;AAAA,EACF;AAGA,EAAA,MAAM,kBAAA,EAAmB;AAC3B;AC3TO,SAAS,cAAA,GAA0B;AACxC,EAAA,OAAO,IAAIC,OAAAA,CAAQ,SAAS,CAAA,CACzB,WAAA,CAAY,wBAAwB,CAAA,CACpC,QAAA,CAAS,QAAA,EAAU,iBAAiB,CAAA,CACpC,MAAA,CAAO,OAAO,QAAA,KAAqB;AAClC,IAAA,MAAM,YAAY,QAAQ,CAAA;AAAA,EAC5B,CAAC,CAAA;AACL;AAEA,eAAsB,YAAY,QAAA,EAAiC;AAEjE,EAAA,MAAM,kBAAA,EAAmB;AAEzB,EAAA,MAAM,MAAA,GAAS,MAAM,UAAA,EAAW;AAChC,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AACxB,EAAA,MAAM,QAAA,GAAgBa,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,MAAA,CAAO,QAAQ,CAAA;AAG/C,EAAA,MAAM,YAAA,GAAe,MAAM,eAAA,CAAgB,QAAA,EAAU,KAAK,QAAQ,CAAA;AAElE,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,iBAAA,CAAkB,QAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,EAClE;AAGA,EAAA,MAAM,WAAW,MAAM,WAAA,CAAY,YAAA,EAAc,MAAA,CAAO,UAAU,WAAW,CAAA;AAC7E,EAAA,IAAI,QAAA,EAAU;AACZ,IAAA,MAAM,iBAAA,CAAkB,QAAA,EAAU,EAAE,MAAA,EAAQ,YAAY,CAAA;AAAA,EAC1D;AAGA,EAAA,MAAM,UAAA,GAAkBA,MAAA,CAAA,IAAA,CAAK,QAAA,EAAU,UAAU,CAAA;AACjD,EAAA,MAASC,GAAA,CAAA,KAAA,CAAM,UAAA,EAAY,EAAE,SAAA,EAAW,MAAM,CAAA;AAE9C,EAAA,MAAM,QAAA,GAAgBD,gBAAS,YAAY,CAAA;AAC3C,EAAA,MAAM,WAAA,GAAmBA,MAAA,CAAA,IAAA,CAAK,UAAA,EAAY,QAAQ,CAAA;AAElD,EAAA,MAASC,GAAA,CAAA,MAAA,CAAO,cAAc,WAAW,CAAA;AAEzC,EAAA,OAAA,CAAQ,GAAA,CAAIf,QAAM,KAAA,CAAM,CAAA,iBAAA,EAAe,kBAAkB,WAAW,CAAC,EAAE,CAAC,CAAA;AAC1E;;;AC7BO,SAAS,kBAAkB,MAAA,EAAqC;AACrE,EAAA,MAAM,EAAE,OAAA,EAAS,cAAA,EAAe,GAAI,MAAA,CAAO,SAAA;AAG3C,EAAA,IAAI,YAAY,MAAA,EAAQ;AACtB,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,MAAA;AAAA,MACN,WAAA,EAAa;AAAA,KACf;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,KAAY,YAAY,cAAA,EAAgB;AAG1C,IAAA,MAAM,WAAA,GAAc,eAAA,CAAgB,IAAA,CAAK,cAAc,CAAA;AAEvD,IAAA,OAAO;AAAA,MACL,IAAA,EAAM,cAAc,cAAA,GAAiB,gBAAA;AAAA,MACrC,WAAA,EAAa,IAAA;AAAA,MACb,cAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF;AAGA,EAAA,OAAO;AAAA,IACL,IAAA,EAAM,MAAA;AAAA,IACN,WAAA,EAAa;AAAA,GACf;AACF;;;ACrCO,SAAS,WAAA,GAAuB;AACrC,EAAA,OAAO,IAAIC,QAAQ,MAAM,CAAA,CACtB,YAAY,gBAAgB,CAAA,CAC5B,OAAO,YAAA,EAAc,wBAAwB,EAC7C,MAAA,CAAO,mBAAA,EAAqB,6DAA6D,CAAA,CACzF,MAAA,CAAO,kBAAkB,sCAAsC,CAAA,CAC/D,MAAA,CAAO,uBAAA,EAAyB,kDAAkD,CAAA,CAClF,OAAO,mBAAA,EAAqB,oBAAoB,EAChD,MAAA,CAAO,yBAAA,EAA2B,+CAA+C,CAAA,CACjF,MAAA,CAAO,gBAAA,EAAkB,qDAAA,EAAuD,IAAI,CAAA,CACpF,OAAO,iBAAA,EAAmB,wBAAA,EAA0B,MAAM,CAAA,CAC1D,MAAA,CAAO,UAAU,gBAAgB,CAAA,CACjC,MAAA,CAAO,OAAO,OAAA,KAUT;AACJ,IAAA,MAAM,YAAA,GAAe,uBAAA,CAAwB,OAAA,CAAQ,KAAK,CAAA;AAC1D,IAAA,MAAM,WAAA,GAUF;AAAA,MACF,cAAc,OAAA,CAAQ,QAAA;AAAA,MACtB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,MAAM,OAAA,CAAQ,GAAA;AAAA,MACd,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,cAAc,MAAA,CAAO,IAAA,CAAK,YAAY,CAAA,CAAE,MAAA,GAAS,IAAI,YAAA,GAAe,MAAA;AAAA,MACpE,MAAA,EAAQ,QAAQ,IAAA,IAAQ,IAAA;AAAA,MACxB,SAAA,EAAY,QAAQ,KAAA,IAA4B,MAAA;AAAA,MAChD,MAAM,OAAA,CAAQ;AAAA,KAChB;AACA,IAAA,MAAM,UAAU,WAAW,CAAA;AAAA,EAC7B,CAAC,CAAA;AACL;AAEA,eAAsB,SAAA,CAAU,OAAA,GAU5B,EAAC,EAAkB;AAErB,EAAA,MAAM,kBAAA,EAAmB;AAEzB,EAAA,MAAM,MAAA,GAAS,MAAM,UAAA,EAAW;AAChC,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AACxB,EAAA,MAAM,QAAA,GAAgBe,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,MAAA,CAAO,QAAQ,CAAA;AAE/C,EAAA,IAAI;AACF,IAAA,MAASC,WAAO,QAAQ,CAAA;AAAA,EAC1B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA,OAAA,CAAQ,IAAI,2DAA2D,CAAA;AACvE,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,SAA4B,EAAC;AACnC,EAAA,IAAI,OAAA,CAAQ,MAAA,EAAQ,MAAA,CAAO,MAAA,GAAS,OAAA,CAAQ,MAAA;AAC5C,EAAA,IAAI,OAAA,CAAQ,IAAA,EAAM,MAAA,CAAO,IAAA,GAAO,OAAA,CAAQ,IAAA;AACxC,EAAA,IAAI,OAAA,CAAQ,QAAA,EAAU,MAAA,CAAO,QAAA,GAAW,OAAA,CAAQ,QAAA;AAChD,EAAA,IAAI,OAAA,CAAQ,QAAA,EAAU,MAAA,CAAO,QAAA,GAAW,OAAA,CAAQ,QAAA;AAChD,EAAA,IAAI,OAAA,CAAQ,YAAA,EAAc,MAAA,CAAO,YAAA,GAAe,OAAA,CAAQ,YAAA;AAExD,EAAA,MAAM,QAAQ,MAAM,WAAA;AAAA,IAClB,kBAAA;AAAA,IACA,MAAM,YAAA,CAAa;AAAA,MACjB,eAAA,EAAiB,QAAQ,YAAA,IAAgB,KAAA;AAAA,MACzC,eAAA,EAAiB,IAAA;AAAA;AAAA,MACjB,MAAA;AAAA,MACA,MAAA,EAAQ,QAAQ,MAAA,IAAU,IAAA;AAAA,MAC1B,SAAA,EAAW,QAAQ,SAAA,IAAa;AAAA,KACjC;AAAA,GACH;AAEA,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,EAAC,EAAG,KAAA,EAAO,CAAA,EAAE,EAAG,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,IAC9D,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,GAAA,CAAIjB,OAAAA,CAAM,GAAA,CAAI,iBAAiB,CAAC,CAAA;AAAA,IAC1C;AACA,IAAA;AAAA,EACF;AAGA,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,MAAM,UAAA,GAAa;AAAA,MACjB,KAAA,EAAO,KAAA,CAAM,GAAA,CAAI,CAAA,IAAA,MAAS;AAAA,QACxB,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,MAAA,EAAQ,KAAK,WAAA,CAAY,MAAA;AAAA,QACzB,QAAA,EAAU,KAAK,WAAA,CAAY,QAAA;AAAA,QAC3B,IAAA,EAAM,KAAK,WAAA,CAAY,IAAA;AAAA,QACvB,QAAA,EAAU,KAAK,WAAA,CAAY,QAAA;AAAA,QAC3B,OAAA,EAAS,KAAK,WAAA,CAAY,OAAA;AAAA,QAC1B,SAAA,EAAW,KAAK,WAAA,CAAY,SAAA;AAAA,QAC5B,QAAA,EAAU,IAAA,CAAK,QAAA,EAAU,MAAA,IAAU;AAAA,OACrC,CAAE,CAAA;AAAA,MACF,OAAO,KAAA,CAAM,MAAA;AAAA,MACb,MAAA,EAAQ;AAAA,KACV;AACA,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,UAAA,EAAY,IAAA,EAAM,CAAC,CAAC,CAAA;AAC/C,IAAA;AAAA,EACF;AAGA,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,IAAA,CAAK,qBAAc,CAAC,CAAA;AAG3C,EAAA,MAAM,cAAwB,EAAC;AAC/B,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,MAAM,CAAA,GAAI,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,GAAG,CAAA,GAAI,OAAA,CAAQ,MAAA;AACrF,IAAA,WAAA,CAAY,IAAA,CAAK,CAAA,OAAA,EAAU,SAAS,CAAA,CAAE,CAAA;AAAA,EACxC;AACA,EAAA,IAAI,OAAA,CAAQ,IAAA,EAAM,WAAA,CAAY,IAAA,CAAK,CAAA,KAAA,EAAQ,QAAQ,IAAA,CAAK,IAAA,CAAK,GAAG,CAAC,CAAA,CAAE,CAAA;AACnE,EAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,QAAQ,CAAA,GAAI,OAAA,CAAQ,QAAA,CAAS,IAAA,CAAK,GAAG,CAAA,GAAI,OAAA,CAAQ,QAAA;AAC3F,IAAA,WAAA,CAAY,IAAA,CAAK,CAAA,SAAA,EAAY,WAAW,CAAA,CAAE,CAAA;AAAA,EAC5C;AACA,EAAA,IAAI,QAAQ,QAAA,EAAU,WAAA,CAAY,KAAK,CAAA,SAAA,EAAY,OAAA,CAAQ,QAAQ,CAAA,CAAE,CAAA;AAErE,EAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,IAAA,OAAA,CAAQ,GAAA,CAAIA,QAAM,GAAA,CAAI,CAAA,aAAA,EAAgB,YAAY,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAC,CAAA;AAAA,EACjE;AACA,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,EAAA,MAAM,WAAA,GAAc,kBAAkB,MAAM,CAAA;AAE5C,EAAA,IAAI,WAAA,CAAY,WAAA,IAAe,WAAA,CAAY,cAAA,EAAgB;AACzD,IAAA,iBAAA,CAAkB,KAAA,EAAO,YAAY,cAAc,CAAA;AAAA,EACrD,CAAA,MAAO;AACL,IAAA,cAAA,CAAe,KAAK,CAAA;AAAA,EACtB;AAEA,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,IAAA,CAAK,CAAA,OAAA,EAAUA,OAAAA,CAAM,MAAM,KAAA,CAAM,MAAM,CAAC,CAAA,KAAA,EAAQ,MAAM,MAAA,KAAW,CAAA,GAAI,GAAA,GAAM,EAAE,EAAE,CAAC,CAAA;AACpG;AAEA,SAAS,eAAe,KAAA,EAAyB;AAE/C,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,WAAA,GAAc,cAAA,CAAe,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AAC1D,IAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA;AAEhE,IAAA,IAAI,WAAA,GAAc,EAAA;AAClB,IAAA,IAAI,IAAA,CAAK,YAAY,QAAA,EAAU;AAC7B,MAAA,WAAA,GAAc,GAAA,GAAMA,QAAM,IAAA,CAAK,CAAA,CAAA,EAAI,kBAAkB,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,IACnF;AAEA,IAAA,IAAI,OAAA,GAAU,EAAA;AACd,IAAA,IAAI,IAAA,CAAK,WAAA,CAAY,IAAA,EAAM,MAAA,EAAQ;AACjC,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA,GAAI,IAAA,CAAK,WAAA,CAAY,IAAA,GAAO,EAAC;AAC7E,MAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,QAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,CAAA,CAAA,EAAI,iBAAA,CAAkB,GAAG,CAAC,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACrE,QAAA,OAAA,GAAU,MAAMA,OAAAA,CAAM,GAAA,CAAIA,OAAAA,CAAM,OAAA,CAAQ,MAAM,CAAC,CAAA;AAAA,MACjD;AAAA,IACF;AAGA,IAAA,IAAI,UAAA,GAAa,EAAA;AACjB,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,MAAM,QAAA,GAAW,KAAK,QAAA,CAAS,MAAA,CAAO,OAAK,CAAA,CAAE,IAAA,KAAS,UAAU,CAAA,CAAE,MAAA;AAClE,MAAA,IAAI,WAAW,CAAA,EAAG;AAChB,QAAA,UAAA,GAAa,GAAA,GAAMA,OAAAA,CAAM,GAAA,CAAIA,OAAAA,CAAM,MAAA,CAAO,CAAA,EAAA,EAAK,QAAQ,CAAA,SAAA,EAAY,QAAA,GAAW,CAAA,GAAI,GAAA,GAAM,EAAE,GAAG,CAAC,CAAA;AAAA,MAChG;AAAA,IACF;AAEA,IAAA,MAAM,cAAA,GAAiB,aAAA,GAAgB,CAAA,EAAG,aAAa,CAAA,CAAA,CAAA,GAAM,EAAA;AAC7D,IAAA,OAAA,CAAQ,IAAI,CAAA,EAAG,cAAc,GAAG,WAAW,CAAA,CAAA,EAAIA,QAAM,IAAA,CAAK,iBAAA,CAAkB,KAAK,IAAI,CAAC,CAAC,CAAA,EAAG,WAAW,GAAG,OAAO,CAAA,EAAG,UAAU,CAAA,CAAE,CAAA;AAAA,EAChI;AACF;AAEA,SAAS,iBAAA,CAAkB,OAAmB,cAAA,EAA8B;AAE1E,EAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,KAAA,CAAM,QAAQ,CAAA;AAGnD,EAAA,MAAM,MAAA,uBAAa,GAAA,EAAwB;AAE3C,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AAExB,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AACrC,IAAA,IAAI,KAAA,GAAQ,SAAA;AAEZ,IAAA,IAAI,SAAA,CAAU,SAAS,CAAA,EAAG;AAExB,MAAA,KAAA,GAAQ,UAAU,CAAC,CAAA;AAAA,IACrB,CAAA,MAAA,IAAW,aAAA,IAAiB,IAAA,CAAK,IAAA,EAAM;AAErC,MAAA,KAAA,GAAQ,IAAA,CAAK,IAAA;AAAA,IACf;AAEA,IAAA,IAAI,CAAC,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA,EAAG;AACtB,MAAA,MAAA,CAAO,GAAA,CAAI,KAAA,EAAO,EAAE,CAAA;AAAA,IACtB;AACA,IAAA,MAAA,CAAO,GAAA,CAAI,KAAK,CAAA,CAAG,IAAA,CAAK,IAAI,CAAA;AAAA,EAC9B;AAGA,EAAA,MAAM,YAAA,GAAe,KAAA,CAAM,IAAA,CAAK,MAAA,CAAO,IAAA,EAAM,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AAE5D,IAAA,IAAI,UAAU,IAAA,CAAK,CAAC,KAAK,SAAA,CAAU,IAAA,CAAK,CAAC,CAAA,EAAG;AAC1C,MAAA,OAAO,CAAA,CAAE,cAAc,CAAC,CAAA;AAAA,IAC1B;AAEA,IAAA,OAAO,CAAA,CAAE,cAAc,CAAC,CAAA;AAAA,EAC1B,CAAC,CAAA;AAGD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,YAAA,CAAa,QAAQ,CAAA,EAAA,EAAK;AAC5C,IAAA,MAAM,SAAA,GAAY,aAAa,CAAC,CAAA;AAChC,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,GAAA,CAAI,SAAS,CAAA;AAGvC,IAAA,MAAM,UAAA,GAAa,SAAA,CAAU,IAAA,CAAK,SAAS,CAAA,GAAI,cAC5B,SAAA,CAAU,UAAA,CAAW,WAAW,CAAA,GAAI,WAAA,GACpC,WAAA;AACnB,IAAA,OAAA,CAAQ,IAAI,CAAA,EAAGA,OAAAA,CAAM,KAAK,IAAA,CAAK,CAAA,EAAG,UAAU,CAAA,CAAA,EAAI,SAAS,GAAG,CAAC,CAAA,CAAA,EAAIA,QAAM,GAAA,CAAI,CAAA,CAAA,EAAI,WAAW,MAAM,CAAA,CAAA,CAAG,CAAC,CAAA,CAAE,CAAA;AACtG,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,IAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,MAAA,MAAM,WAAA,GAAc,cAAA,CAAe,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AAC1D,MAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA;AAGhE,MAAA,MAAM,cAAc,IAAA,CAAK,IAAA,CAAK,QAAA,CAAS,GAAG,IACtC,IAAA,CAAK,IAAA,CAAK,KAAA,CAAM,GAAG,EAAE,KAAA,CAAM,CAAC,EAAE,IAAA,CAAK,GAAG,IACtC,IAAA,CAAK,IAAA;AAET,MAAA,IAAI,WAAA,GAAc,EAAA;AAClB,MAAA,IAAI,IAAA,CAAK,YAAY,QAAA,EAAU;AAC7B,QAAA,WAAA,GAAc,GAAA,GAAMA,QAAM,IAAA,CAAK,CAAA,CAAA,EAAI,kBAAkB,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,MACnF;AAEA,MAAA,IAAI,OAAA,GAAU,EAAA;AACd,MAAA,IAAI,IAAA,CAAK,WAAA,CAAY,IAAA,EAAM,MAAA,EAAQ;AACjC,QAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA,GAAI,IAAA,CAAK,WAAA,CAAY,IAAA,GAAO,EAAC;AAC7E,QAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,CAAA,CAAA,EAAI,iBAAA,CAAkB,GAAG,CAAC,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACrE,UAAA,OAAA,GAAU,MAAMA,OAAAA,CAAM,GAAA,CAAIA,OAAAA,CAAM,OAAA,CAAQ,MAAM,CAAC,CAAA;AAAA,QACjD;AAAA,MACF;AAGA,MAAA,IAAI,UAAA,GAAa,EAAA;AACjB,MAAA,IAAI,KAAK,QAAA,EAAU;AACjB,QAAA,MAAM,QAAA,GAAW,KAAK,QAAA,CAAS,MAAA,CAAO,OAAK,CAAA,CAAE,IAAA,KAAS,UAAU,CAAA,CAAE,MAAA;AAClE,QAAA,IAAI,WAAW,CAAA,EAAG;AAChB,UAAA,UAAA,GAAa,GAAA,GAAMA,OAAAA,CAAM,GAAA,CAAIA,OAAAA,CAAM,MAAA,CAAO,CAAA,EAAA,EAAK,QAAQ,CAAA,SAAA,EAAY,QAAA,GAAW,CAAA,GAAI,GAAA,GAAM,EAAE,GAAG,CAAC,CAAA;AAAA,QAChG;AAAA,MACF;AAEA,MAAA,MAAM,cAAA,GAAiB,aAAA,GAAgB,CAAA,EAAG,aAAa,CAAA,CAAA,CAAA,GAAM,EAAA;AAC7D,MAAA,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAK,cAAc,GAAG,WAAW,CAAA,CAAA,EAAIA,QAAM,IAAA,CAAK,iBAAA,CAAkB,WAAW,CAAC,CAAC,CAAA,EAAG,WAAW,GAAG,OAAO,CAAA,EAAG,UAAU,CAAA,CAAE,CAAA;AAAA,IACpI;AAGA,IAAA,IAAI,CAAA,GAAI,YAAA,CAAa,MAAA,GAAS,CAAA,EAAG;AAC/B,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,IAChB;AAAA,EACF;AACF;AChSO,SAAS,aAAA,GAAyB;AACvC,EAAA,OAAO,IAAIC,OAAAA,CAAQ,QAAQ,CAAA,CACxB,WAAA,CAAY,0DAA0D,CAAA,CACtE,QAAA,CAAS,QAAA,EAAU,gBAAgB,CAAA,CACnC,MAAA,CAAO,sBAAA,EAAwB,gFAAgF,CAAA,CAC/G,MAAA,CAAO,mBAAA,EAAqB,iFAAiF,CAAA,CAC7G,MAAA,CAAO,OAAA,EAAS,mDAAmD,CAAA,CACnE,MAAA,CAAO,OAAO,QAAA,EAAkB,OAAA,KAI3B;AACJ,IAAA,IAAI,CAAC,OAAA,CAAQ,SAAA,IAAa,CAAC,QAAQ,OAAA,EAAS;AAC1C,MAAA,OAAA,CAAQ,MAAM,4EAA4E,CAAA;AAC1F,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAEA,IAAA,MAAM,UAAA,CAAW,UAAU,OAAO,CAAA;AAAA,EACpC,CAAC,CAAA;AACL;AAEA,eAAsB,UAAA,CACpB,UACA,OAAA,EAKe;AAEf,EAAA,MAAM,kBAAA,EAAmB;AAEzB,EAAA,MAAM,MAAA,GAAS,MAAM,UAAA,EAAW;AAChC,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AACxB,EAAA,MAAM,QAAA,GAAgBiB,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,MAAA,CAAO,QAAQ,CAAA;AAG/C,EAAA,MAAM,YAAA,GAAe,MAAM,eAAA,CAAgB,QAAA,EAAU,KAAK,QAAQ,CAAA;AAClE,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,iBAAA,CAAkB,QAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,EAClE;AAGA,EAAA,MAAM,WAAW,MAAM,WAAA,CAAY,YAAA,EAAc,MAAA,CAAO,UAAU,WAAW,CAAA;AAC7E,EAAA,IAAI,CAAC,QAAA,EAAU;AACb,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,uBAAA,EAA0B,iBAAA,CAAkB,QAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,EACzE;AAGA,EAAA,MAAM,cAAA,GAAsBA,gBAAS,YAAY,CAAA;AAGjD,EAAA,MAAM,EAAE,gBAAA,EAAAR,iBAAAA,EAAiB,GAAI,MAAM,OAAO,2BAAmB,CAAA;AAC7D,EAAA,MAAM,kBAAA,GAAqB,MAAMA,iBAAAA,CAAiB,QAAQ,CAAA;AAC1D,EAAA,MAAM,gBAAA,GAAmB,kBAAA,EAAoB,UAAA,IAAc,EAAC;AAC5D,EAAA,MAAM,cAAA,GAAiB,kBAAA,EAAoB,OAAA,IAAW,EAAC;AAGvD,EAAA,MAAM,UAAyD,EAAC;AAChE,EAAA,IAAI,YAAA,GAAe,CAAA;AAEnB,EAAA,IAAI,OAAA,CAAQ,cAAc,MAAA,EAAW;AACnC,IAAA,IAAI,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,SAAA,KAAc,IAAA,EAAM;AAE7C,MAAA,OAAA,CAAQ,aAAa,EAAC;AACtB,MAAA,YAAA,IAAgB,gBAAA,CAAiB,MAAA;AAAA,IACnC,CAAA,MAAO;AAEL,MAAA,MAAM,QAAA,GAAY,OAAA,CAAQ,SAAA,CAAqB,KAAA,CAAM,GAAG,EAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,EAAM,CAAA;AAC3E,MAAA,MAAM,gBAAA,uBAAuB,GAAA,EAAY;AAGzC,MAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,QAAA,MAAM,gBAAA,GAAmB,MAAM,eAAA,CAAgB,IAAA,EAAM,KAAK,QAAQ,CAAA;AAClE,QAAA,IAAI,gBAAA,EAAkB;AACpB,UAAA,gBAAA,CAAiB,GAAA,CAASQ,MAAA,CAAA,QAAA,CAAS,gBAAgB,CAAC,CAAA;AAAA,QACtD,CAAA,MAAO;AAEL,UAAA,gBAAA,CAAiB,IAAI,IAAI,CAAA;AAAA,QAC3B;AAAA,MACF;AAEA,MAAA,MAAM,YAAA,GAAe,iBAAiB,MAAA,CAAO,CAAA,GAAA,KAAO,CAAC,gBAAA,CAAiB,GAAA,CAAI,GAAG,CAAC,CAAA;AAC9E,MAAA,YAAA,IAAgB,gBAAA,CAAiB,SAAS,YAAA,CAAa,MAAA;AACvD,MAAA,OAAA,CAAQ,UAAA,GAAa,YAAA;AAAA,IACvB;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,CAAQ,YAAY,MAAA,EAAW;AACjC,IAAA,IAAI,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,OAAA,KAAY,IAAA,EAAM;AAE3C,MAAA,KAAA,MAAW,WAAW,cAAA,EAAgB;AACpC,QAAA,MAAM,WAAA,GAAc,MAAM,eAAA,CAAgB,OAAA,EAAS,KAAK,QAAQ,CAAA;AAChE,QAAA,IAAI,WAAA,EAAa;AACf,UAAA,MAAM,cAAc,MAAM,WAAA,CAAY,WAAA,EAAa,MAAA,CAAO,UAAU,WAAW,CAAA;AAC/E,UAAA,IAAI,WAAA,EAAa;AACf,YAAA,MAAM,cAAA,GAAiB,MAAMR,iBAAAA,CAAiB,WAAW,CAAA;AACzD,YAAA,MAAM,iBAAA,GAAoB,cAAA,EAAgB,OAAA,IAAW,EAAC;AACtD,YAAA,MAAM,aAAA,GAAgB,iBAAA,CAAkB,MAAA,CAAO,CAAA,CAAA,KAAK,MAAM,cAAc,CAAA;AACxE,YAAA,IAAI,aAAA,CAAc,MAAA,KAAW,iBAAA,CAAkB,MAAA,EAAQ;AACrD,cAAA,MAAM,kBAAkB,WAAA,EAAa;AAAA,gBACnC,OAAA,EAAS;AAAA,eACV,CAAA;AACD,cAAA,OAAA,CAAQ,GAAA,CAAIV,QAAM,IAAA,CAAK,CAAA,WAAA,EAAc,kBAAkB,OAAO,CAAC,kBAAkB,CAAC,CAAA;AAAA,YACpF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,MAAA,YAAA,IAAgB,cAAA,CAAe,MAAA;AAC/B,MAAA,OAAA,CAAQ,UAAU,EAAC;AAAA,IACrB,CAAA,MAAO;AAEL,MAAA,MAAM,QAAA,GAAY,OAAA,CAAQ,OAAA,CAAmB,KAAA,CAAM,GAAG,EAAE,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,EAAM,CAAA;AACzE,MAAA,MAAM,gBAAA,uBAAuB,GAAA,EAAY;AAGzC,MAAA,KAAA,MAAW,QAAQ,QAAA,EAAU;AAC3B,QAAA,MAAM,gBAAA,GAAmB,MAAM,eAAA,CAAgB,IAAA,EAAM,KAAK,QAAQ,CAAA;AAClE,QAAA,IAAI,gBAAA,EAAkB;AACpB,UAAA,MAAM,QAAA,GAAgBkB,gBAAS,gBAAgB,CAAA;AAC/C,UAAA,gBAAA,CAAiB,IAAI,QAAQ,CAAA;AAG7B,UAAA,MAAM,cAAc,MAAM,WAAA,CAAY,gBAAA,EAAkB,MAAA,CAAO,UAAU,WAAW,CAAA;AACpF,UAAA,IAAI,WAAA,EAAa;AACf,YAAA,MAAM,cAAA,GAAiB,MAAMR,iBAAAA,CAAiB,WAAW,CAAA;AACzD,YAAA,MAAM,iBAAA,GAAoB,cAAA,EAAgB,OAAA,IAAW,EAAC;AACtD,YAAA,MAAM,aAAA,GAAgB,iBAAA,CAAkB,MAAA,CAAO,CAAA,CAAA,KAAK,MAAM,cAAc,CAAA;AACxE,YAAA,IAAI,aAAA,CAAc,MAAA,KAAW,iBAAA,CAAkB,MAAA,EAAQ;AACrD,cAAA,MAAM,kBAAkB,WAAA,EAAa;AAAA,gBACnC,OAAA,EAAS;AAAA,eACV,CAAA;AACD,cAAA,OAAA,CAAQ,GAAA,CAAIV,QAAM,IAAA,CAAK,CAAA,WAAA,EAAc,kBAAkB,QAAQ,CAAC,kBAAkB,CAAC,CAAA;AAAA,YACrF;AAAA,UACF;AAAA,QACF,CAAA,MAAO;AAEL,UAAA,gBAAA,CAAiB,IAAI,IAAI,CAAA;AAAA,QAC3B;AAAA,MACF;AAEA,MAAA,MAAM,UAAA,GAAa,eAAe,MAAA,CAAO,CAAA,GAAA,KAAO,CAAC,gBAAA,CAAiB,GAAA,CAAI,GAAG,CAAC,CAAA;AAC1E,MAAA,YAAA,IAAgB,cAAA,CAAe,SAAS,UAAA,CAAW,MAAA;AACnD,MAAA,OAAA,CAAQ,OAAA,GAAU,UAAA;AAAA,IACpB;AAAA,EACF;AAGA,EAAA,MAAM,iBAAA,CAAkB,UAAU,OAAO,CAAA;AAGzC,EAAA,IAAI,iBAAiB,CAAA,EAAG;AACtB,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,CAAA,gDAAA,CAA6C,CAAC,CAAA;AAAA,EACvE,CAAA,MAAO;AACL,IAAA,MAAM,gBAA0B,EAAC;AACjC,IAAA,IAAI,OAAA,CAAQ,cAAc,MAAA,EAAW;AACnC,MAAA,aAAA,CAAc,KAAK,CAAA,UAAA,CAAY,CAAA;AAAA,IACjC;AACA,IAAA,IAAI,OAAA,CAAQ,YAAY,MAAA,EAAW;AACjC,MAAA,aAAA,CAAc,KAAK,CAAA,OAAA,CAAS,CAAA;AAAA,IAC9B;AACA,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,KAAA,CAAM,CAAA,8BAAA,EAA4B,aAAA,CAAc,IAAA,CAAK,IAAI,CAAC,CAAA,EAAA,EAAK,YAAY,CAAA,OAAA,CAAS,CAAC,CAAA;AACvG,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,CAAA,WAAA,EAAc,iBAAA,CAAuBkB,MAAA,CAAA,QAAA,CAAS,GAAA,EAAK,YAAY,CAAC,CAAC,CAAA,CAAE,CAAC,CAAA;AAAA,EAC7F;AACF;ACvKO,SAAS,gBAAA,GAA4B;AAC1C,EAAA,MAAM,MAAM,IAAIjB,OAAAA,CAAQ,WAAW,CAAA,CAChC,YAAY,uBAAuB,CAAA;AAEtC,EAAA,GAAA,CAAI,QAAQ,MAAM,CAAA,CACf,YAAY,0BAA0B,CAAA,CACtC,OAAO,YAAY;AAClB,IAAA,MAAM,aAAA,EAAc;AAAA,EACtB,CAAC,CAAA;AAEH,EAAA,GAAA,CAAI,OAAA,CAAQ,MAAM,CAAA,CACf,WAAA,CAAY,uBAAuB,CAAA,CACnC,QAAA,CAAS,QAAA,EAAU,eAAe,CAAA,CAClC,MAAA,CAAO,OAAO,IAAA,KAAiB;AAC9B,IAAA,MAAM,aAAa,IAAI,CAAA;AAAA,EACzB,CAAC,CAAA;AAEH,EAAA,GAAA,CAAI,QAAQ,KAAK,CAAA,CACd,WAAA,CAAY,qBAAqB,EACjC,QAAA,CAAS,QAAA,EAAU,eAAe,CAAA,CAClC,SAAS,QAAA,EAAU,oBAAoB,EACvC,MAAA,CAAO,OAAO,MAAc,IAAA,KAAiB;AAC5C,IAAA,MAAM,WAAA,CAAY,MAAM,IAAI,CAAA;AAAA,EAC9B,CAAC,CAAA;AAEH,EAAA,GAAA,CAAI,OAAA,CAAQ,QAAQ,CAAA,CACjB,WAAA,CAAY,uBAAuB,CAAA,CACnC,QAAA,CAAS,QAAA,EAAU,eAAe,CAAA,CAClC,MAAA,CAAO,OAAO,IAAA,KAAiB;AAC9B,IAAA,MAAM,eAAe,IAAI,CAAA;AAAA,EAC3B,CAAC,CAAA;AAEH,EAAA,GAAA,CAAI,QAAQ,MAAM,CAAA,CACf,WAAA,CAAY,qCAAqC,EACjD,QAAA,CAAS,UAAA,EAAY,sBAAsB,CAAA,CAC3C,SAAS,UAAA,EAAY,sBAAsB,EAC3C,MAAA,CAAO,OAAO,QAAgB,MAAA,KAAmB;AAChD,IAAA,MAAM,YAAA,CAAa,QAAQ,MAAM,CAAA;AAAA,EACnC,CAAC,CAAA;AAGH,EAAA,GAAA,CAAI,OAAO,YAAY;AACrB,IAAA,MAAM,aAAA,EAAc;AAAA,EACtB,CAAC,CAAA;AAED,EAAA,OAAO,GAAA;AACT;AAEA,eAAsB,aAAA,CAAc,GAAA,GAAc,OAAA,CAAQ,GAAA,EAAI,EAAkB;AAC9E,EAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,GAAG,CAAA;AACnC,EAAA,MAAM,YAAA,GAAoBkB,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,YAAA,EAAc,WAAW,CAAA;AAE7D,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,GAAA,CAAInB,OAAAA,CAAM,KAAA,CAAM,2BAA2B,CAAC,CAAA;AACpD,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,EAAA,IAAI;AACF,IAAA,MAASoB,WAAO,YAAY,CAAA;AAAA,EAC9B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAA,CAAQ,GAAA,CAAIpB,OAAAA,CAAM,MAAA,CAAO,+BAA+B,CAAC,CAAA;AACzD,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,qBAAqB,CAAC,CAAA;AAC7C,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,UAAU,MAASoB,GAAA,CAAA,OAAA,CAAQ,cAAc,EAAE,aAAA,EAAe,MAAM,CAAA;AACtE,EAAA,MAAM,aAAA,GAAgB,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,EAAO,IAAK,CAAA,CAAE,IAAA,CAAK,QAAA,CAAS,KAAK,CAAC,CAAA;AAChF,EAAA,MAAM,eAAe,OAAA,CAAQ,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,CAAA;AAE1D,EAAA,IAAI,aAAA,CAAc,MAAA,KAAW,CAAA,IAAK,YAAA,CAAa,WAAW,CAAA,EAAG;AAC3D,IAAA,OAAA,CAAQ,GAAA,CAAIpB,OAAAA,CAAM,MAAA,CAAO,qBAAqB,CAAC,CAAA;AAC/C,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA;AAAA,EACF;AAGA,EAAA,IAAI,MAAA,CAAO,aAAa,MAAA,CAAO,IAAA,CAAK,OAAO,SAAS,CAAA,CAAE,SAAS,CAAA,EAAG;AAChE,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,aAAa,CAAC,CAAA;AACrC,IAAA,KAAA,MAAW,CAAC,MAAM,IAAI,CAAA,IAAK,OAAO,OAAA,CAAQ,MAAA,CAAO,SAAS,CAAA,EAAG;AAC3D,MAAA,MAAM,SAAA,GAAY,OAAO,QAAA,KAAa,IAAA;AACtC,MAAA,MAAM,MAAA,GAAS,SAAA,GAAYA,OAAAA,CAAM,KAAA,CAAM,kBAAa,CAAA,GAAI,EAAA;AAGxD,MAAA,MAAM,YAAA,GAAoBmB,MAAA,CAAA,IAAA,CAAK,YAAA,EAAc,IAAI,CAAA;AACjD,MAAA,IAAI;AACF,QAAA,MAAMN,KAAAA,GAAO,MAASO,GAAA,CAAA,IAAA,CAAK,YAAY,CAAA;AACvC,QAAA,IAAIP,KAAAA,CAAK,aAAY,EAAG;AAEtB,UAAA,MAAM,QAAA,GAAW,MAASO,GAAA,CAAA,OAAA,CAAQ,YAAY,CAAA;AAC9C,UAAA,MAAM,UAAU,QAAA,CAAS,MAAA,CAAO,OAAK,CAAA,CAAE,QAAA,CAAS,KAAK,CAAC,CAAA;AACtD,UAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAKpB,OAAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,EAAA,EAAK,IAAI,CAAA,EAAA,EAAK,MAAM,CAAA,CAAE,CAAA;AACvD,UAAA,OAAA,CAAQ,GAAA,CAAIA,QAAM,IAAA,CAAK,CAAA,WAAA,EAAc,QAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAC,CAAA;AAAA,QAC5D,CAAA,MAAO;AACL,UAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAKA,OAAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CAAA;AAAA,QACxD;AAAA,MACF,CAAA,CAAA,MAAQ;AACN,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAKA,OAAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,EAAA,EAAK,IAAI,CAAA,CAAA,EAAI,MAAM,CAAA,CAAA,EAAIA,OAAAA,CAAM,GAAA,CAAI,WAAW,CAAC,CAAA,CAAE,CAAA;AAAA,MAClF;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,EAChB;AAGA,EAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,kBAAkB,CAAC,CAAA;AAC1C,IAAA,KAAA,MAAW,SAAS,aAAA,EAAe;AACjC,MAAA,MAAM,QAAA,GAAgBmB,MAAA,CAAA,IAAA,CAAK,YAAA,EAAc,KAAA,CAAM,IAAI,CAAA;AACnD,MAAA,MAAMN,KAAAA,GAAO,MAASO,GAAA,CAAA,IAAA,CAAK,QAAQ,CAAA;AACnC,MAAA,MAAM,MAAA,GAAA,CAAUP,KAAAA,CAAK,IAAA,GAAO,IAAA,EAAM,QAAQ,CAAC,CAAA;AAC3C,MAAA,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAK,KAAA,CAAM,IAAI,CAAA,EAAA,EAAK,MAAM,CAAA,IAAA,CAAM,CAAA;AAAA,IAC9C;AACA,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,EAChB;AAGA,EAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,IAAA,OAAA,CAAQ,GAAA,CAAIb,OAAAA,CAAM,IAAA,CAAK,+CAA+C,CAAC,CAAA;AACvE,IAAA,KAAA,MAAW,SAAS,YAAA,EAAc;AAChC,MAAA,MAAM,OAAA,GAAemB,MAAA,CAAA,IAAA,CAAK,YAAA,EAAc,KAAA,CAAM,IAAI,CAAA;AAClD,MAAA,MAAM,QAAA,GAAW,MAASC,GAAA,CAAA,OAAA,CAAQ,OAAO,CAAA;AACzC,MAAA,MAAM,UAAU,QAAA,CAAS,MAAA,CAAO,OAAK,CAAA,CAAE,QAAA,CAAS,KAAK,CAAC,CAAA;AACtD,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAK,KAAA,CAAM,IAAI,CAAA,GAAA,EAAM,OAAA,CAAQ,MAAM,CAAA,QAAA,EAAW,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,IACjF;AACA,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,EAChB;AAEA,EAAA,OAAA,CAAQ,GAAA,CAAIpB,OAAAA,CAAM,IAAA,CAAK,wEAAwE,CAAC,CAAA;AAChG,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAChB;AAEA,eAAsB,YAAA,CACpB,YAAA,EACA,GAAA,GAAc,OAAA,CAAQ,KAAI,EACX;AACf,EAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,GAAG,CAAA;AAEnC,EAAA,IAAI,CAAC,MAAA,CAAO,SAAA,GAAY,YAAY,CAAA,EAAG;AACrC,IAAA,OAAA,CAAQ,MAAMA,OAAAA,CAAM,GAAA,CAAI,CAAA,oBAAA,EAAuB,YAAY,EAAE,CAAC,CAAA;AAC9D,IAAA,OAAA,CAAQ,KAAA,CAAMA,OAAAA,CAAM,IAAA,CAAK,CAAA,WAAA,EAAc,OAAO,IAAA,CAAK,MAAA,CAAO,SAAA,IAAa,EAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,EAAE,CAAC,CAAA;AACxF,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAEA,EAAA,MAAM,YAAA,GAAoBmB,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,YAAA,EAAc,WAAW,CAAA;AAC7D,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,SAAA,CAAU,YAAY,CAAA;AAClD,EAAA,MAAM,YAAA,GAAoBA,MAAA,CAAA,IAAA,CAAK,YAAA,EAAc,YAAY,CAAA;AAEzD,EAAA,IAAI;AACF,IAAA,MAAMN,KAAAA,GAAO,MAASO,GAAA,CAAA,IAAA,CAAK,YAAY,CAAA;AAEvC,IAAA,IAAIP,KAAAA,CAAK,aAAY,EAAG;AAEtB,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,MAAA,OAAA,CAAQ,GAAA,CAAIb,QAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,YAAY,CAAA,EAAA,EAAK,YAAY,QAAQ,CAAC,CAAA;AAC9E,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,MAAA,MAAM,KAAA,GAAQ,MAASoB,GAAA,CAAA,OAAA,CAAQ,YAAY,CAAA;AAC3C,MAAA,MAAM,UAAU,KAAA,CAAM,MAAA,CAAO,OAAK,CAAA,CAAE,QAAA,CAAS,KAAK,CAAC,CAAA;AAEnD,MAAA,KAAA,MAAW,QAAQ,OAAA,EAAS;AAC1B,QAAA,MAAM,QAAA,GAAgBD,MAAA,CAAA,IAAA,CAAK,YAAA,EAAc,IAAI,CAAA;AAC7C,QAAA,MAAM,OAAA,GAAU,MAASC,GAAA,CAAA,QAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AACnD,QAAA,OAAA,CAAQ,IAAIpB,OAAAA,CAAM,MAAA,CAAO,CAAA,IAAA,EAAO,IAAI,MAAM,CAAC,CAAA;AAC3C,QAAA,OAAA,CAAQ,IAAI,OAAO,CAAA;AACnB,QAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,MAChB;AAAA,IACF,CAAA,MAAO;AAEL,MAAA,MAAM,OAAA,GAAU,MAASoB,GAAA,CAAA,QAAA,CAAS,YAAA,EAAc,OAAO,CAAA;AACvD,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,MAAA,OAAA,CAAQ,GAAA,CAAIpB,QAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,YAAY,CAAA,EAAA,EAAK,YAAY,OAAO,CAAC,CAAA;AAC7E,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,MAAA,OAAA,CAAQ,IAAI,OAAO,CAAA;AACnB,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,IAChB;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,MAAMA,OAAAA,CAAM,GAAA,CAAI,CAAA,wBAAA,EAA2B,YAAY,EAAE,CAAC,CAAA;AAClE,IAAA,OAAA,CAAQ,MAAM,KAAK,CAAA;AACnB,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AACF;AAEA,eAAsB,YACpB,IAAA,EACA,IAAA,EACA,GAAA,GAAc,OAAA,CAAQ,KAAI,EACX;AACf,EAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,GAAG,CAAA;AACnC,EAAA,MAAM,YAAA,GAAoBmB,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,YAAA,EAAc,WAAW,CAAA;AAC7D,EAAA,MAAM,YAAA,GAAoBA,MAAA,CAAA,IAAA,CAAK,YAAA,EAAc,IAAI,CAAA;AAGjD,EAAA,IAAI;AACF,IAAA,MAAMN,KAAAA,GAAO,MAASO,GAAA,CAAA,IAAA,CAAK,YAAY,CAAA;AACvC,IAAA,IAAIP,KAAAA,CAAK,aAAY,EAAG;AAEtB,MAAA,MAAM,QAAA,GAAgBM,MAAA,CAAA,IAAA,CAAK,YAAA,EAAc,WAAW,CAAA;AACpD,MAAA,IAAI;AACF,QAAA,MAASC,WAAO,QAAQ,CAAA;AAAA,MAC1B,CAAA,CAAA,MAAQ;AACN,QAAA,OAAA,CAAQ,MAAMpB,OAAAA,CAAM,GAAA,CAAI,CAAA,2CAAA,EAA8C,IAAI,GAAG,CAAC,CAAA;AAC9E,QAAA,OAAA,CAAQ,MAAMA,OAAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgB,QAAQ,EAAE,CAAC,CAAA;AACpD,QAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,MAChB;AAAA,IACF;AAAA,EACF,CAAA,CAAA,MAAQ;AACN,IAAA,OAAA,CAAQ,MAAMA,OAAAA,CAAM,GAAA,CAAI,CAAA,oBAAA,EAAuB,IAAI,EAAE,CAAC,CAAA;AACtD,IAAA,OAAA,CAAQ,MAAMA,OAAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgB,YAAY,EAAE,CAAC,CAAA;AACxD,IAAA,OAAA,CAAQ,KAAA;AAAA,MACNA,OAAAA,CAAM,OAAO,oFAAoF;AAAA,KACnG;AACA,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAGA,EAAA,IAAI,CAAC,OAAO,SAAA,EAAW;AACrB,IAAA,MAAA,CAAO,YAAY,EAAC;AAAA,EACtB;AAEA,EAAA,IAAI,MAAA,CAAO,SAAA,CAAU,IAAI,CAAA,EAAG;AAC1B,IAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,MAAA,CAAO,CAAA,mBAAA,EAAsB,IAAI,+BAA+B,CAAC,CAAA;AAAA,EACrF;AAEA,EAAA,MAAA,CAAO,SAAA,CAAU,IAAI,CAAA,GAAI,IAAA;AACzB,EAAA,MAAM,UAAA,CAAW,QAAQ,GAAG,CAAA;AAE5B,EAAA,OAAA,CAAQ,GAAA,CAAIA,QAAM,KAAA,CAAM,CAAA,uBAAA,EAAqB,IAAI,CAAA,QAAA,EAAM,IAAI,EAAE,CAAC,CAAA;AAC9D,EAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,IAAA,CAAK,CAAA,oDAAA,EAAuD,IAAI,EAAE,CAAC,CAAA;AACvF;AAEA,eAAsB,cAAA,CAAe,IAAA,EAAc,GAAA,GAAc,OAAA,CAAQ,KAAI,EAAkB;AAC7F,EAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,GAAG,CAAA;AAEnC,EAAA,IAAI,CAAC,MAAA,CAAO,SAAA,GAAY,IAAI,CAAA,EAAG;AAC7B,IAAA,OAAA,CAAQ,MAAMA,OAAAA,CAAM,GAAA,CAAI,CAAA,oBAAA,EAAuB,IAAI,EAAE,CAAC,CAAA;AACtD,IAAA,OAAA,CAAQ,KAAA,CAAMA,OAAAA,CAAM,IAAA,CAAK,CAAA,WAAA,EAAc,OAAO,IAAA,CAAK,MAAA,CAAO,SAAA,IAAa,EAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,EAAE,CAAC,CAAA;AACxF,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAEA,EAAA,IAAI,SAAS,SAAA,EAAW;AACtB,IAAA,OAAA,CAAQ,KAAA,CAAMA,OAAAA,CAAM,GAAA,CAAI,gCAAgC,CAAC,CAAA;AACzD,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAEA,EAAA,MAAM,IAAA,GAAO,MAAA,CAAO,SAAA,CAAU,IAAI,CAAA;AAClC,EAAA,OAAO,MAAA,CAAO,UAAU,IAAI,CAAA;AAC5B,EAAA,MAAM,UAAA,CAAW,QAAQ,GAAG,CAAA;AAE5B,EAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,KAAA,CAAM,CAAA,yBAAA,EAAuB,IAAI,EAAE,CAAC,CAAA;AACtD,EAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,IAAA,CAAK,CAAA,sBAAA,EAAyB,IAAI,wCAAwC,CAAC,CAAA;AAC/F;AAEA,eAAsB,aACpB,MAAA,EACA,MAAA,EACA,GAAA,GAAc,OAAA,CAAQ,KAAI,EACX;AACf,EAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,GAAG,CAAA;AACnC,EAAA,MAAM,YAAA,GAAoBmB,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,YAAA,EAAc,WAAW,CAAA;AAG7D,EAAA,IAAI,UAAA;AACJ,EAAA,IAAI,MAAA,CAAO,SAAA,GAAY,MAAM,CAAA,EAAG;AAC9B,IAAA,UAAA,GAAa,MAAA,CAAO,UAAU,MAAM,CAAA;AAAA,EACtC,CAAA,MAAO;AACL,IAAA,UAAA,GAAa,MAAA;AAAA,EACf;AAEA,EAAA,MAAM,UAAA,GAAkBA,MAAA,CAAA,IAAA,CAAK,YAAA,EAAc,UAAU,CAAA;AAGrD,EAAA,IAAI;AACF,IAAA,MAASC,WAAO,UAAU,CAAA;AAAA,EAC5B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAA,CAAQ,MAAMpB,OAAAA,CAAM,GAAA,CAAI,CAAA,2BAAA,EAA8B,MAAM,EAAE,CAAC,CAAA;AAC/D,IAAA,OAAA,CAAQ,MAAMA,OAAAA,CAAM,IAAA,CAAK,CAAA,aAAA,EAAgB,UAAU,EAAE,CAAC,CAAA;AACtD,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAGA,EAAA,MAAM,aAAa,MAAA,CAAO,QAAA,CAAS,KAAK,CAAA,GAAI,MAAA,GAAS,GAAG,MAAM,CAAA,GAAA,CAAA;AAC9D,EAAA,MAAM,UAAA,GAAkBmB,MAAA,CAAA,IAAA,CAAK,YAAA,EAAc,UAAU,CAAA;AAGrD,EAAA,MAASC,GAAA,CAAA,QAAA,CAAS,YAAY,UAAU,CAAA;AACxC,EAAA,OAAA,CAAQ,GAAA,CAAIpB,QAAM,KAAA,CAAM,CAAA,eAAA,EAAa,UAAU,CAAA,QAAA,EAAM,UAAU,EAAE,CAAC,CAAA;AAGlE,EAAA,IAAI,CAAC,OAAO,SAAA,EAAW;AACrB,IAAA,MAAA,CAAO,YAAY,EAAC;AAAA,EACtB;AAEA,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,OAAA,CAAQ,OAAA,EAAS,EAAE,CAAA;AAC/C,EAAA,MAAA,CAAO,SAAA,CAAU,YAAY,CAAA,GAAI,UAAA;AACjC,EAAA,MAAM,UAAA,CAAW,QAAQ,GAAG,CAAA;AAE5B,EAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,KAAA,CAAM,CAAA,4BAAA,EAA0B,YAAY,EAAE,CAAC,CAAA;AACjE,EAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,UAAU,EAAE,CAAC,CAAA;AAC/C,EAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,IAAA,CAAK,CAAA,oDAAA,EAAuD,YAAY,EAAE,CAAC,CAAA;AAC/F;AChRO,IAAM,eAAA,GAAmD;AAAA,EAC9D,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,WAAA;AAAA,IACN,WAAA,EAAa,wBAAA;AAAA,IACb,OAAA,EAAS,KAAA;AAAA,IACT,WAAA,EAAa,KAAA;AAAA,IACb,SAAA,EAAW;AAAA,MACT,QAAA,EAAU,CAAC,OAAO,CAAA;AAAA,MAClB,UAAA,EAAY,CAAC,QAAQ;AAAA,KACvB;AAAA,IACA,GAAA,EAAK;AAAA,MACH,OAAA,EAAS,OAAA;AAAA,MACT,UAAA,EAAY;AAAA;AAAA;AAEd,GACF;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,WAAA;AAAA,IACN,WAAA,EAAa,yBAAA;AAAA,IACb,OAAA,EAAS,IAAA;AAAA,IACT,WAAA,EAAa,IAAA;AAAA,IACb,SAAA,EAAW;AAAA,MACT,QAAA,EAAU,CAAC,QAAQ,CAAA;AAAA,MACnB,UAAA,EAAY,CAAC,SAAS,CAAA;AAAA,MACtB,OAAA,EAAS,CAAC,mBAAmB;AAAA,KAC/B;AAAA,IACA,GAAA,EAAK;AAAA,MACH,OAAA,EAAS,QAAA;AAAA,MACT,UAAA,EAAY,IAAA;AAAA;AAAA,MACZ,kBAAA,EAAoB,IAAA;AAAA;AAAA,MACpB,cAAA,EAAgB;AAAA;AAAA;AAClB,GACF;AAAA,EACA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,WAAA;AAAA,IACN,WAAA,EAAa,sCAAA;AAAA,IACb,OAAA,EAAS,KAAA;AAAA,IACT,WAAA,EAAa,KAAA;AAAA,IACb,SAAA,EAAW;AAAA,MACT,QAAA,EAAU,CAAC,OAAO,CAAA;AAAA,MAClB,UAAA,EAAY,CAAC,QAAQ,CAAA;AAAA,MACrB,OAAA,EAAS,CAAC,gBAAgB;AAAA;AAC5B,GACF;AAAA,EACA,OAAA,EAAS;AAAA,IACP,IAAA,EAAM,WAAA;AAAA,IACN,WAAA,EAAa,sCAAA;AAAA,IACb,OAAA,EAAS,IAAA;AAAA,IACT,WAAA,EAAa,KAAA;AAAA;AAAA,IACb,SAAA,EAAW;AAAA,MACT,QAAA,EAAU,CAAC,SAAS,CAAA;AAAA,MACpB,OAAA,EAAS,CAAC,cAAc;AAAA,KAC1B;AAAA,IACA,GAAA,EAAK;AAAA,MACH,OAAA,EAAS,SAAA;AAAA,MACT,UAAA,EAAY,IAAA;AAAA,MACZ,cAAA,EAAgB;AAAA;AAClB,GACF;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,WAAA;AAAA,IACN,WAAA,EAAa,yBAAA;AAAA,IACb,OAAA,EAAS,KAAA;AAAA,IACT,WAAA,EAAa,KAAA;AAAA,IACb,SAAA,EAAW;AAAA,MACT,UAAA,EAAY,CAAC,SAAA,EAAW,aAAa,CAAA;AAAA,MACrC,QAAA,EAAU,CAAC,QAAQ;AAAA;AACrB,GACF;AAAA,EACA,KAAA,EAAO;AAAA,IACL,IAAA,EAAM,WAAA;AAAA,IACN,WAAA,EAAa,mCAAA;AAAA,IACb,OAAA,EAAS,KAAA;AAAA,IACT,WAAA,EAAa,KAAA;AAAA,IACb,SAAA,EAAW;AAAA,MACT,QAAA,EAAU,CAAC,OAAO;AAAA;AACpB,GACF;AAAA,EACA,MAAA,EAAQ;AAAA,IACN,IAAA,EAAM,WAAA;AAAA,IACN,WAAA,EAAa,wBAAA;AAAA,IACb,OAAA,EAAS,KAAA;AAAA,IACT,WAAA,EAAa,IAAA;AAAA,IACb,SAAA,EAAW;AAAA,MACT,QAAA,EAAU,CAAC,QAAQ,CAAA;AAAA,MACnB,UAAA,EAAY,CAAC,SAAS,CAAA;AAAA,MACtB,OAAA,EAAS,CAAC,gBAAA,EAAkB,gBAAgB;AAAA,KAC9C;AAAA,IACA,GAAA,EAAK;AAAA,MACH,OAAA,EAAS,QAAA;AAAA,MACT,UAAA,EAAY,IAAA;AAAA;AAAA,MACZ,cAAA,EAAgB;AAAA;AAAA;AAClB,GACF;AAAA,EACA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,WAAA;AAAA,IACN,WAAA,EAAa,2BAAA;AAAA,IACb,OAAA,EAAS,KAAA;AAAA,IACT,WAAA,EAAa,KAAA;AAAA,IACb,SAAA,EAAW;AAAA,MACT,QAAA,EAAU,CAAC,UAAU,CAAA;AAAA,MACrB,UAAA,EAAY,CAAC,WAAW;AAAA;AAC1B,GACF;AAAA,EACA,QAAA,EAAU;AAAA,IACR,IAAA,EAAM,WAAA;AAAA,IACN,WAAA,EAAa,2BAAA;AAAA,IACb,OAAA,EAAS,KAAA;AAAA,IACT,WAAA,EAAa,KAAA;AAAA,IACb,SAAA,EAAW;AAAA,MACT,UAAA,EAAY,CAAC,WAAA,EAAa,gBAAgB,CAAA;AAAA,MAC1C,QAAA,EAAU,CAAC,UAAU;AAAA;AACvB;AAEJ,CAAA;AAKA,SAAS,cAAc,OAAA,EAA0B;AAC/C,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,QAAA,KAAa,OAAA,GAAU,OAAA,GAAU,OAAA;AACvD,IAAAqB,QAAAA,CAAS,GAAG,KAAK,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA,EAAI,EAAE,KAAA,EAAO,QAAA,EAAU,CAAA;AACnD,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAKA,eAAe,gBAAgB,OAAA,EAAmC;AAChE,EAAA,MAAM,UAAU,OAAA,CAAQ,GAAA,CAAI,IAAA,IAAQ,OAAA,CAAQ,IAAI,WAAA,IAAe,EAAA;AAC/D,EAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AAErB,EAAA,IAAI;AACF,IAAA,MAASC,GAAA,CAAA,MAAA,CAAYC,MAAA,CAAA,IAAA,CAAK,OAAA,EAAS,OAAO,CAAC,CAAA;AAC3C,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAKA,SAAS,aAAa,OAAA,EAA0B;AAC9C,EAAA,OAAO,CAAC,CAAC,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA;AAC9B;AAMA,eAAe,mBAAmB,WAAA,EAAuC;AACvE,EAAA,MAAM,UAAU,OAAA,CAAQ,GAAA,CAAI,IAAA,IAAQ,OAAA,CAAQ,IAAI,WAAA,IAAe,EAAA;AAC/D,EAAA,IAAI,CAAC,SAAS,OAAO,KAAA;AAGrB,EAAA,MAAM,aAAA,GAAgB;AAAA,IACfA,MAAA,CAAA,IAAA,CAAK,OAAA,EAAS,SAAA,EAAW,YAAY,CAAA;AAAA,IACrCA,MAAA,CAAA,IAAA,CAAK,OAAA,EAAS,gBAAA,EAAkB,YAAY,CAAA;AAAA,IAC5CA,MAAA,CAAA,IAAA,CAAK,OAAA,EAAS,SAAA,EAAW,YAAY;AAAA,GAC5C;AAEA,EAAA,KAAA,MAAW,UAAU,aAAA,EAAe;AAClC,IAAA,IAAI;AACF,MAAA,MAAM,OAAA,GAAU,MAASD,GAAA,CAAA,OAAA,CAAQ,MAAM,CAAA;AAEvC,MAAA,IAAI,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,WAAA,EAAY,CAAE,UAAA,CAAW,WAAA,CAAY,WAAA,EAAa,CAAC,CAAA,EAAG;AAC5E,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AAEA,EAAA,OAAO,KAAA;AACT;AAYA,eAAsB,sBAAA,GAAqD;AACzE,EAAA,MAAM,UAA6B,EAAC;AAEpC,EAAA,KAAA,MAAW,CAAC,OAAA,EAAS,MAAM,KAAK,MAAA,CAAO,OAAA,CAAQ,eAAe,CAAA,EAAG;AAC/D,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,MAAM,YAAY,MAAA,CAAO,SAAA;AAEzB,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,EAAsB,UAAU,KAAA,EAAO,OAAA,EAAS,EAAC,EAAG,CAAA;AACzE,MAAA;AAAA,IACF;AAGA,IAAA,IAAI,UAAU,QAAA,EAAU;AACtB,MAAA,KAAA,MAAW,GAAA,IAAO,UAAU,QAAA,EAAU;AACpC,QAAA,IAAI,aAAA,CAAc,GAAG,CAAA,EAAG;AACtB,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,EAAI,GAAG,CAAA,eAAA,CAAiB,CAAA;AAAA,QACvC;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,UAAU,UAAA,EAAY;AACxB,MAAA,KAAA,MAAW,GAAA,IAAO,UAAU,UAAA,EAAY;AACtC,QAAA,IAAI,MAAM,eAAA,CAAgB,GAAG,CAAA,EAAG;AAC9B,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,EAAA,EAAK,GAAG,CAAA,gBAAA,CAAkB,CAAA;AAAA,QACzC;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,UAAU,OAAA,EAAS;AACrB,MAAA,KAAA,MAAW,MAAA,IAAU,UAAU,OAAA,EAAS;AACtC,QAAA,IAAI,YAAA,CAAa,MAAM,CAAA,EAAG;AACxB,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,EAAG,MAAM,CAAA,YAAA,CAAc,CAAA;AAAA,QACtC;AAAA,MACF;AAAA,IACF;AAGA,IAAA,IAAI,UAAU,UAAA,EAAY;AACxB,MAAA,KAAA,MAAW,GAAA,IAAO,UAAU,UAAA,EAAY;AACtC,QAAA,IAAI,MAAM,kBAAA,CAAmB,GAAG,CAAA,EAAG;AACjC,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAA,EAAG,GAAG,CAAA,oBAAA,CAAsB,CAAA;AAAA,QAC3C;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,MACX,IAAA,EAAM,OAAA;AAAA,MACN,QAAA,EAAU,QAAQ,MAAA,GAAS,CAAA;AAAA,MAC3B;AAAA,KACD,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,OAAA;AACT;AAMA,eAAsB,yBAAA,GAA6F;AACjH,EAAA,MAAM,gBAAA,GAAmB,MAAM,sBAAA,EAAuB;AACtD,EAAA,MAAM,aAAA,GAAgB,gBAAA,CACnB,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,QAAQ,CAAA,CACtB,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAA;AAGlB,EAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAE5B,IAAA,MAAM,eAAA,GAAkB,aAAA,CAAc,QAAA,CAAS,SAAS,CAAA;AACxD,IAAA,IAAI,CAAC,eAAA,EAAiB;AAEpB,MAAA,MAAM,YAAA,GAAe,cAAc,IAAA,CAAK,CAAA,CAAA,KAAK,CAAC,eAAA,CAAgB,CAAC,EAAE,WAAW,CAAA;AAC5E,MAAA,IAAI,CAAC,YAAA,EAAc;AACjB,QAAA,aAAA,CAAc,KAAK,SAAS,CAAA;AAAA,MAC9B;AAAA,IACF;AACA,IAAA,OAAO,EAAE,QAAA,EAAU,aAAA,EAAe,QAAA,EAAU,gBAAA,EAAiB;AAAA,EAC/D;AAGA,EAAA,OAAO,EAAE,QAAA,EAAU,CAAC,SAAS,CAAA,EAAG,UAAU,gBAAA,EAAiB;AAC7D;AAYA,eAAsB,uBAAA,CACpB,KACA,aAAA,EAC0B;AAC1B,EAAA,MAAM,UAA2B,EAAC;AAClC,EAAA,MAAM,SAAA,GAAY,QAAQ,QAAA,KAAa,OAAA;AAGvC,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAY;AACtC,EAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAChC,IAAA,MAAM,MAAA,GAAS,gBAAgB,IAAI,CAAA;AACnC,IAAA,IAAI,OAAO,WAAA,EAAa;AACtB,MAAA,aAAA,CAAc,GAAA,CAAI,OAAO,IAAI,CAAA;AAAA,IAC/B;AAAA,EACF;AAEA,EAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAChC,IAAA,MAAM,UAAA,GAAkBC,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,IAAI,CAAA;AAEtC,IAAA,IAAI;AAEF,MAAA,IAAI;AACF,QAAA,MAASD,WAAO,UAAU,CAAA;AAC1B,QAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,EAAS,MAAM,CAAA;AACpC,QAAA;AAAA,MACF,CAAA,CAAA,MAAQ;AAAA,MAER;AAEA,MAAA,IAAI,SAAA,EAAW;AAGb,QAAA,MAAM,cAAA,GAAiB,KAAK,IAAI;;AAAA,mEAAA,EAE6B,IAAI,CAAA;AAAA;AAAA;AAAA,gCAAA,EAGvC,IAAI,CAAA;;AAAA;AAAA,CAAA;AAI9B,QAAA,MAASA,GAAA,CAAA,SAAA,CAAU,UAAA,EAAY,cAAA,EAAgB,OAAO,CAAA;AACtD,QAAA,OAAA,CAAQ,KAAK,EAAE,IAAA,EAAM,SAAS,IAAA,EAAM,KAAA,EAAO,6BAA6B,CAAA;AAAA,MAC1E,CAAA,MAAO;AAEL,QAAA,MAASA,GAAA,CAAA,OAAA,CAAQ,aAAa,UAAU,CAAA;AACxC,QAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAA,EAAM,OAAA,EAAS,MAAM,CAAA;AAAA,MACtC;AAAA,IACF,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,IAAA;AAAA,QACA,KAAA,EAAO,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU;AAAA,OACjD,CAAA;AAAA,IACH;AAAA,EACF;AAEA,EAAA,OAAO,OAAA;AACT;AAKA,eAAsB,4BAA4B,GAAA,EAAgC;AAChF,EAAA,MAAM,WAAA,GAAc;AAAA,IAClB,WAAA;AAAA,IACA,cAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,MAAM,QAAkB,EAAC;AACzB,EAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,IAAA,IAAI;AACF,MAAA,MAASA,GAAA,CAAA,MAAA,CAAYC,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,IAAI,CAAC,CAAA;AACpC,MAAA,KAAA,CAAM,KAAK,IAAI,CAAA;AAAA,IACjB,CAAA,CAAA,MAAQ;AAAA,IAER;AAAA,EACF;AACA,EAAA,OAAO,KAAA;AACT;AAKA,eAAsB,oBACpB,MAAA,EACA,aAAA,EACA,aACA,GAAA,EACA,SAAA,GAAoC,EAAC,EACtB;AACf,EAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAChC,IAAA,MAAM,QAAA,GAAgBA,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,IAAI,CAAA;AAEpC,IAAA,MAAM,gBAAA,GAAwBA,MAAA,CAAA,IAAA,CAAK,WAAA,EAAa,IAAI,CAAA;AAGpD,IAAA,IAAI;AACF,MAAA,MAASD,WAAO,gBAAgB,CAAA;AAAA,IAClC,CAAA,CAAA,MAAQ;AAEN,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,MAAA,KAAW,UAAA,IAAc,IAAA,KAAS,WAAA,EAAa;AAEjD,MAAA,MAAM,QAAA,GAAW,MAASA,GAAA,CAAA,QAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AACpD,MAAA,IAAI,QAAA,GAAW,MAASA,GAAA,CAAA,QAAA,CAAS,gBAAA,EAAkB,OAAO,CAAA;AAG1D,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,EAAG;AACpD,QAAA,QAAA,GAAW,QAAA,CAAS,QAAQ,IAAI,MAAA,CAAO,MAAM,GAAG,CAAA,GAAA,CAAA,EAAO,GAAG,CAAA,EAAG,KAAK,CAAA;AAAA,MACpE;AAGA,MAAA,MAAM,UAAA,GAAkBC,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,YAAA,EAAc,wBAAwB,CAAA;AACxE,MAAA,MAAM,QAAA,GAAW,CAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,EAgBrB,QAAQ;AAAA;;AAAA;AAAA;AAAA,EAKR,QAAQ;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,CAAA;AAWJ,MAAA,MAASD,UAAWC,MAAA,CAAA,OAAA,CAAQ,UAAU,GAAG,EAAE,SAAA,EAAW,MAAM,CAAA;AAC5D,MAAA,MAASD,GAAA,CAAA,SAAA,CAAU,UAAA,EAAY,QAAA,EAAU,OAAO,CAAA;AAEhD,MAAA,OAAA,CAAQ,GAAA,CAAItB,OAAAA,CAAM,KAAA,CAAM,CAAA,sCAAA,CAAmC,CAAC,CAAA;AAC5D,MAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAO,UAAU,EAAE,CAAC,CAAA;AAC3C,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,MAAA,CAAO,uBAAgB,CAAC,CAAA;AAC1C,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,6CAA6C,CAAC,CAAA;AACrE,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,yEAAyE,CAAC,CAAA;AACjG,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,+CAA+C,CAAC,CAAA;AACvE,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,mCAAmC,CAAC,CAAA;AAC3D,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,IAChB,CAAA,MAAA,IAAW,MAAA,KAAW,cAAA,IAAkB,IAAA,KAAS,WAAA,EAAa;AAE5D,MAAA,MAAM,QAAA,GAAW,MAASsB,GAAA,CAAA,QAAA,CAAS,QAAA,EAAU,OAAO,CAAA;AACpD,MAAA,IAAI,QAAA,GAAW,MAASA,GAAA,CAAA,QAAA,CAAS,gBAAA,EAAkB,OAAO,CAAA;AAG1D,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,EAAG;AACpD,QAAA,QAAA,GAAW,QAAA,CAAS,QAAQ,IAAI,MAAA,CAAO,MAAM,GAAG,CAAA,GAAA,CAAA,EAAO,GAAG,CAAA,EAAG,KAAK,CAAA;AAAA,MACpE;AAEA,MAAA,MAAM,MAAA,GAAS,GAAG,QAAQ;;AAAA;;AAAA;;AAAA,EAM9B,QAAA,CAAS,MAAM,IAAI,CAAA,CAAE,MAAM,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA;AAEpC,MAAA,MAASA,GAAA,CAAA,SAAA,CAAU,QAAA,EAAU,MAAA,EAAQ,OAAO,CAAA;AAC5C,MAAA,OAAA,CAAQ,IAAItB,OAAAA,CAAM,KAAA,CAAM,CAAA,oCAAA,EAAkC,IAAI,EAAE,CAAC,CAAA;AACjE,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,MAAA,CAAO,8DAAyD,CAAC,CAAA;AAAA,IACrF,CAAA,MAAA,IAAW,WAAW,WAAA,EAAa;AAEjC,MAAA,MAAM,UAAA,GAAa,GAAG,QAAQ,CAAA,OAAA,CAAA;AAC9B,MAAA,MAASsB,GAAA,CAAA,MAAA,CAAO,UAAU,UAAU,CAAA;AACpC,MAAA,OAAA,CAAQ,GAAA,CAAItB,QAAM,MAAA,CAAO,CAAA,iBAAA,EAAe,IAAI,CAAA,QAAA,EAAM,IAAI,SAAS,CAAC,CAAA;AAGhE,MAAA,IAAI,OAAA,GAAU,MAASsB,GAAA,CAAA,QAAA,CAAS,gBAAA,EAAkB,OAAO,CAAA;AAGzD,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,EAAG;AACpD,QAAA,OAAA,GAAU,OAAA,CAAQ,QAAQ,IAAI,MAAA,CAAO,MAAM,GAAG,CAAA,GAAA,CAAA,EAAO,GAAG,CAAA,EAAG,KAAK,CAAA;AAAA,MAClE;AAEA,MAAA,MAASA,GAAA,CAAA,SAAA,CAAU,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAC7C,MAAA,OAAA,CAAQ,IAAItB,OAAAA,CAAM,KAAA,CAAM,CAAA,mBAAA,EAAiB,IAAI,EAAE,CAAC,CAAA;AAChD,MAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,IAAA,CAAK,CAAA,kDAAA,EAA8C,IAAI,SAAS,CAAC,CAAA;AAAA,IACrF;AAAA,EAEF;AACF;AAKA,eAAsB,aAAA,CACpB,KACA,IAAA,EACA,SAAA,GAAsB,EAAC,EACvB,SAAA,GAAoC,EAAC,EACtB;AACf,EAAA,MAASsB,GAAA,CAAA,KAAA,CAAM,IAAA,EAAM,EAAE,SAAA,EAAW,MAAM,CAAA;AAExC,EAAA,MAAM,UAAU,MAASA,GAAA,CAAA,OAAA,CAAQ,KAAK,EAAE,aAAA,EAAe,MAAM,CAAA;AAE7D,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,MAAM,OAAA,GAAeC,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,KAAA,CAAM,IAAI,CAAA;AACzC,IAAA,MAAM,QAAA,GAAgBA,MAAA,CAAA,IAAA,CAAK,IAAA,EAAM,KAAA,CAAM,IAAI,CAAA;AAG3C,IAAA,IAAI,SAAA,CAAU,QAAA,CAAS,KAAA,CAAM,IAAI,CAAA,EAAG;AAClC,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,KAAA,CAAM,aAAY,EAAG;AACvB,MAAA,MAAM,aAAA,CAAc,OAAA,EAAS,QAAA,EAAU,SAAA,EAAW,SAAS,CAAA;AAAA,IAC7D,CAAA,MAAO;AAEL,MAAA,IAAI;AACF,QAAA,MAASD,WAAO,QAAQ,CAAA;AAAA,MAE1B,CAAA,CAAA,MAAQ;AAEN,QAAA,IAAI,OAAA,GAAU,MAASA,GAAA,CAAA,QAAA,CAAS,OAAA,EAAS,OAAO,CAAA;AAGhD,QAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,KAAK,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,EAAG;AACpD,UAAA,OAAA,GAAU,OAAA,CAAQ,QAAQ,IAAI,MAAA,CAAO,MAAM,GAAG,CAAA,GAAA,CAAA,EAAO,GAAG,CAAA,EAAG,KAAK,CAAA;AAAA,QAClE;AAEA,QAAA,MAASA,GAAA,CAAA,SAAA,CAAU,QAAA,EAAU,OAAA,EAAS,OAAO,CAAA;AAAA,MAC/C;AAAA,IACF;AAAA,EACF;AACF;AAKA,eAAsBE,gBAAe,GAAA,EAA8B;AACjE,EAAA,IAAI;AACF,IAAA,MAAM,eAAA,GAAuBD,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,cAAc,CAAA;AACrD,IAAA,MAAM,OAAA,GAAU,MAASD,GAAA,CAAA,QAAA,CAAS,eAAA,EAAiB,OAAO,CAAA;AAC1D,IAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA;AAC9B,IAAA,IAAI,IAAI,IAAA,EAAM;AACZ,MAAA,OAAO,GAAA,CAAI,IAAA;AAAA,IACb;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAGA,EAAA,OAAYC,gBAAS,GAAG,CAAA;AAC1B;AAeO,SAAS,iBAAA,CACd,KACA,UAAA,EACqC;AACrC,EAAA,MAAM,MAAA,GAAS,8BAA8B,UAAU,CAAA,6FAAA,CAAA;AAEvD,EAAA,MAAM,OAAiB,EAAC;AAExB,EAAA,IAAI,IAAI,kBAAA,EAAoB;AAE1B,IAAA,IAAA,CAAK,KAAK,MAAM,CAAA;AAChB,IAAA,IAAI,IAAI,UAAA,EAAY;AAClB,MAAA,IAAA,CAAK,IAAA,CAAK,IAAI,UAAU,CAAA;AAAA,IAC1B;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,IAAA,CAAK,IAAA,CAAK,IAAI,UAAU,CAAA;AACxB,IAAA,IAAA,CAAK,KAAK,MAAM,CAAA;AAAA,EAClB;AAGA,EAAA,IAAI,IAAI,cAAA,EAAgB;AAEtB,IAAA,MAAM,SAAA,GAAY,GAAA,CAAI,cAAA,CAAe,KAAA,CAAM,GAAG,CAAA;AAC9C,IAAA,IAAA,CAAK,IAAA,CAAK,GAAG,SAAS,CAAA;AAAA,EACxB;AAEA,EAAA,OAAO,EAAE,OAAA,EAAS,GAAA,CAAI,OAAA,EAAS,IAAA,EAAK;AACtC;AAUA,eAAsB,kBAAA,CACpB,GAAA,EACA,UAAA,EACA,IAAA,EACA,YAAY,IAAA,EACmB;AAC/B,EAAA,MAAM,MAAA,GAAS,gBAAgB,IAAI,CAAA;AAEnC,EAAA,IAAI,CAAC,OAAO,GAAA,EAAK;AACf,IAAA,OAAO;AAAA,MACL,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,QAAQ,IAAI,CAAA,gCAAA;AAAA,KACrB;AAAA,EACF;AAEA,EAAA,MAAM,EAAE,OAAA,EAAS,IAAA,KAAS,iBAAA,CAAkB,MAAA,CAAO,KAAK,UAAU,CAAA;AAGlE,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO;AAGjC,IAAA,IAAI,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,IAAK,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,IAAK,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,EAAG;AAC/D,MAAA,OAAO,CAAA,CAAA,EAAI,GAAA,CAAI,OAAA,CAAQ,IAAA,EAAM,OAAO,CAAC,CAAA,CAAA,CAAA;AAAA,IACvC;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAC,CAAA;AACD,EAAA,MAAM,cAAc,CAAA,EAAG,OAAO,IAAI,UAAA,CAAW,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAEtD,EAAA,OAAO,IAAI,OAAA,CAAQ,CAACpB,QAAAA,KAAY;AAC9B,IAAA,IAAI,MAAA,GAAS,EAAA;AACb,IAAA,IAAI,WAAA,GAAc,EAAA;AAClB,IAAA,IAAI,QAAA,GAAW,KAAA;AAEf,IAAA,MAAM,KAAA,GAAQsB,KAAAA,CAAM,WAAA,EAAa,EAAC,EAAG;AAAA,MACnC,GAAA;AAAA,MACA,KAAA,EAAO,IAAA;AAAA,MACP,KAAA,EAAO,CAAC,SAAA,EAAW,MAAA,EAAQ,MAAM;AAAA,KAClC,CAAA;AAGD,IAAA,MAAM,OAAA,GAAU,WAAW,MAAM;AAC/B,MAAA,QAAA,GAAW,IAAA;AACX,MAAA,KAAA,CAAM,KAAK,SAAS,CAAA;AAAA,IACtB,GAAG,SAAS,CAAA;AAEZ,IAAA,KAAA,CAAM,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,KAAS;AACjC,MAAA,MAAA,IAAU,KAAK,QAAA,EAAS;AAExB,MAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,IAAI,CAAA;AAAA,IAC3B,CAAC,CAAA;AAED,IAAA,KAAA,CAAM,MAAA,EAAQ,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,KAAS;AACjC,MAAA,WAAA,IAAe,KAAK,QAAA,EAAS;AAE7B,MAAA,OAAA,CAAQ,MAAA,CAAO,MAAM,IAAI,CAAA;AAAA,IAC3B,CAAC,CAAA;AAED,IAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,IAAA,KAAS;AAC1B,MAAA,YAAA,CAAa,OAAO,CAAA;AAEpB,MAAA,IAAI,QAAA,EAAU;AACZ,QAAAtB,QAAAA,CAAQ;AAAA,UACN,OAAA,EAAS,KAAA;AAAA,UACT,MAAA;AAAA,UACA,KAAA,EAAO,mBAAA;AAAA,UACP,QAAA,EAAU;AAAA,SACX,CAAA;AAAA,MACH,CAAA,MAAA,IAAW,SAAS,CAAA,EAAG;AACrB,QAAAA,QAAAA,CAAQ;AAAA,UACN,OAAA,EAAS,IAAA;AAAA,UACT;AAAA,SACD,CAAA;AAAA,MACH,CAAA,MAAO;AACL,QAAAA,QAAAA,CAAQ;AAAA,UACN,OAAA,EAAS,KAAA;AAAA,UACT,MAAA;AAAA,UACA,KAAA,EAAO,WAAA,IAAe,CAAA,yBAAA,EAA4B,IAAI,CAAA;AAAA,SACvD,CAAA;AAAA,MACH;AAAA,IACF,CAAC,CAAA;AAED,IAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,GAAA,KAAQ;AACzB,MAAA,YAAA,CAAa,OAAO,CAAA;AACpB,MAAAA,QAAAA,CAAQ;AAAA,QACN,OAAA,EAAS,KAAA;AAAA,QACT,OAAO,GAAA,CAAI;AAAA,OACZ,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH,CAAC,CAAA;AACH;AAMA,eAAsB,0BAAA,GAIjB;AACH,EAAA,MAAM,gBAAA,GAAmB,MAAM,sBAAA,EAAuB;AAGtD,EAAA,MAAM,gBAA6B,CAAC,SAAA,EAAW,QAAA,EAAU,QAAA,EAAU,SAAS,OAAO,CAAA;AAEnF,EAAA,MAAM,QAAA,GAAW,gBAAA,CACd,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,QAAA,IAAY,eAAA,CAAgB,CAAA,CAAE,IAAI,CAAA,CAAE,GAAG,CAAA,CACrD,IAAI,CAAA,CAAA,MAAM;AAAA,IACT,MAAM,CAAA,CAAE,IAAA;AAAA,IACR,MAAA,EAAQ,eAAA,CAAgB,CAAA,CAAE,IAAI,CAAA;AAAA,IAC9B,SAAS,CAAA,CAAE;AAAA,GACb,CAAE,CAAA;AAGJ,EAAA,QAAA,CAAS,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACtB,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAA;AAC3C,IAAA,MAAM,MAAA,GAAS,aAAA,CAAc,OAAA,CAAQ,CAAA,CAAE,IAAI,CAAA;AAE3C,IAAA,MAAM,SAAA,GAAY,MAAA,KAAW,EAAA,GAAK,GAAA,GAAM,MAAA;AACxC,IAAA,MAAM,SAAA,GAAY,MAAA,KAAW,EAAA,GAAK,GAAA,GAAM,MAAA;AACxC,IAAA,OAAO,SAAA,GAAY,SAAA;AAAA,EACrB,CAAC,CAAA;AAED,EAAA,OAAO,QAAA;AACT;AAKO,SAAS,iBAAA,CAAkB,MAAiB,UAAA,EAA4B;AAC7E,EAAA,MAAM,MAAA,GAAS,gBAAgB,IAAI,CAAA;AACnC,EAAA,IAAI,CAAC,MAAA,CAAO,GAAA,EAAK,OAAO,EAAA;AAExB,EAAA,MAAM,EAAE,OAAA,EAAS,IAAA,KAAS,iBAAA,CAAkB,MAAA,CAAO,KAAK,UAAU,CAAA;AAGlE,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,CAAC,KAAK,KAAA,KAAU;AAE3C,IAAA,MAAM,cAAc,MAAA,CAAO,GAAA,CAAK,kBAAA,GAC5B,KAAA,KAAU,IACV,KAAA,KAAU,CAAA;AAEd,IAAA,IAAI,WAAA,IAAe,GAAA,CAAI,QAAA,CAAS,GAAG,CAAA,EAAG;AACpC,MAAA,OAAO,IAAI,GAAG,CAAA,CAAA,CAAA;AAAA,IAChB;AACA,IAAA,OAAO,GAAA;AAAA,EACT,CAAC,CAAA;AAED,EAAA,OAAO,GAAG,OAAO,CAAA,CAAA,EAAI,WAAA,CAAY,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA;AAC5C;;;ACpwBO,IAAM,QAAA,GAA4C;AAAA,EACvD,YAAA,EAAc;AAAA,IACZ,IAAA,EAAM,YAAA;AAAA,IACN,KAAA,EAAO,oBAAA;AAAA,IACP,WAAA,EAAa,sEAAA;AAAA,IACb,UAAA,EAAY,UAAA;AAAA,IACZ,QAAA,EAAU,yBAAA;AAAA,IACV,WAAA,EAAa,yDAAA;AAAA,IACb,MAAM,CAAC,MAAA,EAAQ,KAAA,EAAO,YAAA,EAAc,YAAY,YAAY,CAAA;AAAA,IAC5D,KAAA,EAAO,CAAA;AAAA,IACP,KAAA,EAAO;AAAA,GACT;AAAA,EACA,mBAAA,EAAqB;AAAA,IACnB,IAAA,EAAM,mBAAA;AAAA,IACN,KAAA,EAAO,mBAAA;AAAA,IACP,WAAA,EAAa,iDAAA;AAAA,IACb,UAAA,EAAY,cAAA;AAAA,IACZ,QAAA,EAAU,4BAAA;AAAA,IACV,WAAA,EAAa,wDAAA;AAAA,IACb,IAAA,EAAM,CAAC,OAAA,EAAS,MAAM,CAAA;AAAA,IACtB,KAAA,EAAO,EAAA;AAAA,IACP,KAAA,EAAO;AAAA,GACT;AAAA,EACA,cAAA,EAAgB;AAAA,IACd,IAAA,EAAM,cAAA;AAAA,IACN,KAAA,EAAO,qBAAA;AAAA,IACP,WAAA,EAAa,kDAAA;AAAA,IACb,UAAA,EAAY,cAAA;AAAA,IACZ,QAAA,EAAU,wBAAA;AAAA,IACV,WAAA,EAAa,wDAAA;AAAA,IACb,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,IAChB,KAAA,EAAO,CAAA;AAAA,IACP,KAAA,EAAO;AAAA;AAEX,CAAA;AAEO,SAAS,eAAA,GAAqC;AACnD,EAAA,OAAO,MAAA,CAAO,OAAO,QAAQ,CAAA;AAC/B;AAEO,SAAS,WAAW,IAAA,EAA2C;AACpE,EAAA,OAAO,SAAS,IAAI,CAAA;AACtB;AAEO,SAAS,cAAc,IAAA,EAAuB;AACnD,EAAA,OAAO,IAAA,IAAQ,QAAA;AACjB;;;ACnCA,IAAM,SAAA,GAAiB,MAAA,CAAA,OAAA,CAAQ,aAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAC,CAAA;AAC7D,IAAM,aAAA,GAAqB,MAAA,CAAA,IAAA,CAAK,SAAA,EAAW,IAAA,EAAM,WAAW,CAAA;AAC5D,IAAM,YAAA,GAAoB,MAAA,CAAA,IAAA,CAAK,aAAA,EAAe,UAAU,CAAA;AAMxD,eAAe,gBAAA,CAAiB,GAAA,EAAa,UAAA,EAAoB,WAAA,EAAwC;AAEvG,EAAA,MAAM,QAAA,GAAW,MAAM,0BAAA,EAA2B;AAElD,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AAEzB,IAAA,OAAO,KAAA;AAAA,EACT;AAGA,EAAA,MAAM,IAAA,GAAO,SAAS,CAAC,CAAA;AACvB,EAAA,MAAM,UAAA,GAAa,iBAAA,CAAkB,IAAA,CAAK,IAAA,EAAM,UAAU,CAAA;AAE1D,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,GAAA,CAAIH,QAAM,IAAA,CAAK,CAAA,2BAAA,EAAuB,KAAK,MAAA,CAAO,WAAW,EAAE,CAAC,CAAA;AACxE,EAAA,KAAA,MAAW,MAAA,IAAU,KAAK,OAAA,EAAS;AACjC,IAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,IAAA,CAAK,CAAA,gBAAA,EAAS,MAAM,EAAE,CAAC,CAAA;AAAA,EAC3C;AACA,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,IAAA,CAAK,CAAA,SAAA,EAAY,UAAU,EAAE,CAAC,CAAA;AAChD,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,EAAA,IAAI,aAAA,GAAgB,WAAA;AAEpB,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,aAAA,GAAgB,MAAM,OAAA,CAAQ;AAAA,MAC5B,OAAA,EAAS,gDAAA;AAAA,MACT,OAAA,EAAS;AAAA,KACV,CAAA;AAAA,EACH;AAEA,EAAA,IAAI,CAAC,aAAA,EAAe;AAClB,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,+DAA+D,CAAC,CAAA;AACvF,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,wCAAiC,CAAC,CAAA;AACzD,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,6BAA6B,CAAC,CAAA;AACrD,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,EAAA,MAAM,SAAS,MAAM,kBAAA,CAAmB,GAAA,EAAK,UAAA,EAAY,KAAK,IAAI,CAAA;AAElE,EAAA,IAAI,OAAO,OAAA,EAAS;AAClB,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,KAAA,CAAM,uCAAkC,CAAC,CAAA;AAC3D,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,sCAAsC,CAAC,CAAA;AAC9D,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,MAAA,IAAW,OAAO,QAAA,EAAU;AAC1B,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,MAAA,CAAO,2DAAsD,CAAC,CAAA;AAChF,IAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,IAAA,CAAK,CAAA,GAAA,EAAM,UAAU,EAAE,CAAC,CAAA;AAC1C,IAAA,OAAO,KAAA;AAAA,EACT,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,MAAA,CAAO,2CAAsC,MAAA,CAAO,KAAK,EAAE,CAAC,CAAA;AAC9E,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,qCAAqC,CAAC,CAAA;AAC7D,IAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,IAAA,CAAK,CAAA,GAAA,EAAM,UAAU,EAAE,CAAC,CAAA;AAC1C,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAUA,eAAe,kBAAA,CAAmB,GAAA,EAAa,WAAA,EAAsB,WAAA,EAA+C;AAClH,EAAA,MAAM,QAAA,GAAgB,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,OAAO,CAAA;AACvC,EAAA,IAAI,SAAA,GAAY,CAAA;AAEhB,EAAA,IAAI;AACF,IAAA,MAAM,UAAU,MAAS,GAAA,CAAA,OAAA,CAAQ,UAAU,EAAE,aAAA,EAAe,MAAM,CAAA;AAClE,IAAA,SAAA,GAAY,QAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,WAAA,EAAa,CAAA,CAAE,MAAA;AAAA,EACnD,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,MAAA,CAAO,2DAAsD,CAAC,CAAA;AAEhF,EAAA,IAAI,YAAY,CAAA,EAAG;AACjB,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,SAAS,CAAA,KAAA,EAAQ,SAAA,GAAY,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,UAAA,CAAY,CAAC,CAAA;AAAA,EAC1F;AACA,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,iDAAiD,CAAC,CAAA;AACzE,IAAA,OAAO,cAAA;AAAA,EACT;AAGA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,oDAAoD,CAAC,CAAA;AAC5E,IAAA,OAAO,SAAA;AAAA,EACT;AAGA,EAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAuB;AAAA,IAC5C,OAAA,EAAS,4BAAA;AAAA,IACT,OAAA,EAAS;AAAA,MACP;AAAA,QACE,IAAA,EAAM,qCAAA;AAAA,QACN,KAAA,EAAO,SAAA;AAAA,QACP,WAAA,EAAa;AAAA,OACf;AAAA,MACA;AAAA,QACE,IAAA,EAAM,qBAAA;AAAA,QACN,KAAA,EAAO,cAAA;AAAA,QACP,WAAA,EAAa;AAAA,OACf;AAAA,MACA;AAAA,QACE,IAAA,EAAM,YAAA;AAAA,QACN,KAAA,EAAO,YAAA;AAAA,QACP,WAAA,EAAa;AAAA,OACf;AAAA,MACA;AAAA,QACE,IAAA,EAAM,QAAA;AAAA,QACN,KAAA,EAAO,QAAA;AAAA,QACP,WAAA,EAAa;AAAA;AACf;AACF,GACD,CAAA;AAGD,EAAA,IAAI,aAAa,YAAA,EAAc;AAC7B,IAAA,MAAM,WAAqB,EAAC;AAE5B,IAAA,IAAI,YAAY,CAAA,EAAG;AACjB,MAAA,QAAA,CAAS,IAAA,CAAK,GAAG,SAAS,CAAA,KAAA,EAAQ,YAAY,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,UAAA,CAAY,CAAA;AAAA,IACxE;AAEA,IAAA,IAAI;AACF,MAAA,MAAS,GAAA,CAAA,MAAA,CAAY,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,WAAW,CAAC,CAAA;AAC3C,MAAA,QAAA,CAAS,KAAK,WAAW,CAAA;AAAA,IAC3B,CAAA,CAAA,MAAQ;AAAA,IAAC;AAET,IAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,GAAA,CAAI,sCAAiC,CAAC,CAAA;AACxD,MAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,QAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,GAAA,CAAI,CAAA,IAAA,EAAO,OAAO,EAAE,CAAC,CAAA;AAAA,MACzC;AACA,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,MAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ;AAAA,QAC9B,OAAA,EAAS,oCAAA;AAAA,QACT,OAAA,EAAS;AAAA,OACV,CAAA;AAED,MAAA,IAAI,CAAC,SAAA,EAAW;AACd,QAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,YAAY,CAAC,CAAA;AACpC,QAAA,OAAO,QAAA;AAAA,MACT;AAAA,IACF;AAGA,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,0BAA0B,CAAC,CAAA;AAGlD,IAAA,MAAS,GAAA,CAAA,EAAA,CAAQ,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,YAAY,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,CAAA;AAC1E,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,uBAAuB,CAAC,CAAA;AAG/C,IAAA,IAAI;AACF,MAAA,MAAS,OAAG,QAAA,EAAU,EAAE,WAAW,IAAA,EAAM,KAAA,EAAO,MAAM,CAAA;AACtD,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,kBAAkB,CAAC,CAAA;AAAA,IAC5C,CAAA,CAAA,MAAQ;AAAA,IAAC;AAGT,IAAA,KAAA,MAAW,IAAA,IAAQ,CAAC,WAAA,EAAa,WAAA,EAAa,WAAW,CAAA,EAAG;AAC1D,MAAA,IAAI;AACF,QAAA,MAAS,GAAA,CAAA,EAAA,CAAQ,YAAK,GAAA,EAAK,IAAI,GAAG,EAAE,KAAA,EAAO,MAAM,CAAA;AACjD,QAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,IAAA,CAAK,CAAA,UAAA,EAAa,IAAI,EAAE,CAAC,CAAA;AAAA,MAC7C,CAAA,CAAA,MAAQ;AAAA,MAAC;AAAA,IACX;AAAA,EACF;AAEA,EAAA,OAAO,QAAA;AACT;AAMA,eAAe,cAAc,GAAA,EAA4B;AACvD,EAAA,MAAM,UAAA,GAAkB,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,YAAA,EAAc,aAAa,CAAA;AAG7D,EAAA,IAAI,cAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAS,GAAA,CAAA,QAAA,CAAS,UAAA,EAAY,OAAO,CAAA;AACrD,IAAA,cAAA,GAAiB,IAAA,CAAK,MAAM,OAAO,CAAA;AAAA,EACrC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAA,CAAQ,KAAA,CAAMA,OAAAA,CAAM,GAAA,CAAI,+BAA+B,CAAC,CAAA;AACxD,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAGA,EAAA,MAAM,kBAAA,GAA0B,MAAA,CAAA,IAAA,CAAK,aAAA,EAAe,UAAA,EAAY,aAAa,CAAA;AAC7E,EAAA,IAAI,cAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAS,GAAA,CAAA,QAAA,CAAS,kBAAA,EAAoB,OAAO,CAAA;AAC7D,IAAA,cAAA,GAAiB,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA,CAAE,MAAA;AAAA,EACvC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAA,CAAQ,KAAA,CAAMA,OAAAA,CAAM,GAAA,CAAI,+BAA+B,CAAC,CAAA;AACxD,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAGA,EAAA,MAAM,cAAA,GAAiC;AAAA,IACrC,GAAG,cAAA;AAAA,IACH,GAAG,cAAA;AAAA;AAAA,IAEH,SAAA,EAAW;AAAA,MACT,GAAG,cAAA,CAAe,SAAA;AAAA,MAClB,GAAG,cAAA,CAAe;AAAA;AACpB,GACF;AAGA,EAAA,MAAM,YAAA,GAAoB,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,YAAA,EAAc,WAAW,CAAA;AAC7D,EAAA,IAAI;AACF,IAAA,MAAS,GAAA,CAAA,KAAA,CAAM,YAAA,EAAc,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EAClD,CAAA,CAAA,MAAQ;AAAA,EAAC;AAGT,EAAA,MAAM,aAAA,GAAgB,CAAC,kBAAkB,CAAA;AACzC,EAAA,IAAI,gBAAA,GAAmB,KAAA;AAEvB,EAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAChC,IAAA,MAAM,QAAA,GAAgB,MAAA,CAAA,IAAA,CAAK,YAAA,EAAc,IAAI,CAAA;AAC7C,IAAA,IAAI;AACF,MAAA,MAAS,WAAO,QAAQ,CAAA;AAAA,IAE1B,CAAA,CAAA,MAAQ;AAEN,MAAA,MAAM,OAAA,GAAe,MAAA,CAAA,IAAA,CAAK,aAAA,EAAe,UAAA,EAAY,SAAS,WAAW,CAAA;AACzE,MAAA,IAAI;AACF,QAAA,MAAS,GAAA,CAAA,QAAA,CAAS,SAAS,QAAQ,CAAA;AACnC,QAAA,gBAAA,GAAmB,IAAA;AACnB,QAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,KAAA,CAAM,CAAA,+BAAA,EAA6B,IAAI,EAAE,CAAC,CAAA;AAAA,MAC9D,CAAA,CAAA,MAAQ;AAAA,MAAC;AAAA,IACX;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,GAAkB,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,WAAW,CAAA;AAC7C,EAAA,IAAI,aAAA,GAAgB,KAAA;AACpB,EAAA,IAAI,eAAA,GAAkB,KAAA;AAEtB,EAAA,IAAI;AACF,IAAA,MAAS,WAAO,UAAU,CAAA;AAC1B,IAAA,eAAA,GAAkB,IAAA;AAAA,EACpB,CAAA,CAAA,MAAQ;AAEN,IAAA,MAAM,WAAA,GAAmB,MAAA,CAAA,IAAA,CAAK,aAAA,EAAe,UAAU,CAAA;AACvD,IAAA,MAAM,gBAAA,GAAwB,MAAA,CAAA,IAAA,CAAK,WAAA,EAAa,WAAW,CAAA;AAE3D,IAAA,IAAI;AACF,MAAA,MAAM,WAAA,GAAc,MAAMwB,eAAAA,CAAe,GAAG,CAAA;AAC5C,MAAA,IAAI,aAAA,GAAgB,MAAS,GAAA,CAAA,QAAA,CAAS,gBAAA,EAAkB,OAAO,CAAA;AAC/D,MAAA,aAAA,GAAgB,aAAA,CAAc,OAAA,CAAQ,mBAAA,EAAqB,WAAW,CAAA;AACtE,MAAA,MAAS,GAAA,CAAA,SAAA,CAAU,UAAA,EAAY,aAAA,EAAe,OAAO,CAAA;AACrD,MAAA,aAAA,GAAgB,IAAA;AAChB,MAAA,OAAA,CAAQ,GAAA,CAAIxB,OAAAA,CAAM,KAAA,CAAM,kCAA6B,CAAC,CAAA;AAAA,IACxD,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,MAAA,CAAO,CAAA,mCAAA,EAAiC,KAAK,EAAE,CAAC,CAAA;AAAA,IACpE;AAAA,EACF;AAGA,EAAA,MAAM,UAAA,CAAW,gBAAgB,GAAG,CAAA;AAEpC,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,KAAA,CAAM,gCAA2B,CAAC,CAAA;AACpD,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,mBAAmB,CAAC,CAAA;AAC3C,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,wCAAwC,CAAC,CAAA;AAChE,EAAA,IAAI,gBAAA,EAAkB;AACpB,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,6BAA6B,CAAC,CAAA;AAAA,EACvD;AACA,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,qCAAqC,CAAC,CAAA;AAAA,EAC/D;AACA,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,qBAAqB,CAAC,CAAA;AAC7C,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,2BAA2B,CAAC,CAAA;AACnD,EAAA,IAAI,eAAA,EAAiB;AACnB,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,oBAAoB,CAAC,CAAA;AAAA,EAC9C;AACA,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,0BAA0B,CAAC,CAAA;AAClD,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAChB;AAKO,SAAS,WAAA,GAAuB;AACrC,EAAA,OAAO,IAAIC,OAAAA,CAAQ,MAAM,CAAA,CACtB,WAAA,CAAY,0CAA0C,CAAA,CACtD,MAAA,CAAO,WAAA,EAAa,oEAAoE,EACxF,MAAA,CAAO,aAAA,EAAe,sDAAsD,CAAA,CAC5E,OAAO,mBAAA,EAAqB,8CAA8C,CAAA,CAC1E,MAAA,CAAO,oBAAoB,6EAA6E,CAAA,CACxG,MAAA,CAAO,kBAAA,EAAoB,2CAA2C,CAAA,CACtE,MAAA,CAAO,QAAA,EAAU,iCAAiC,EAClD,MAAA,CAAO,uBAAA,EAAyB,6FAA6F,CAAA,CAC7H,MAAA,CAAO,OAAO,OAAA,KAAyI;AACtJ,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,MAAM,YAAA,EAAa;AACnB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,OAAA,CAAQ,YAAY,MAAA,EAAW;AACjC,MAAA,MAAM,eAAA,CAAgB,OAAA,CAAQ,OAAA,EAAS,OAAA,CAAQ,IAAI,CAAA;AACnD,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,WAAA,CAAY,QAAQ,GAAA,EAAK,OAAA,CAAQ,UAAU,OAAA,CAAQ,UAAA,EAAY,QAAQ,KAAK,CAAA;AAAA,EACpF,CAAC,CAAA;AACL;AAEA,eAAsB,YAAY,WAAA,GAAc,KAAA,EAAO,cAAA,EAAyB,gBAAA,EAA2B,cAAc,KAAA,EAAsB;AAC7I,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AAGxB,EAAA,MAAM,UAAA,GAAkB,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,YAAA,EAAc,aAAa,CAAA;AAC7D,EAAA,IAAI,oBAAA,GAAuB,KAAA;AAE3B,EAAA,IAAI;AACF,IAAA,MAAS,WAAO,UAAU,CAAA;AAC1B,IAAA,oBAAA,GAAuB,IAAA;AAAA,EACzB,CAAA,CAAA,MAAQ;AAAA,EAER;AAGA,EAAA,IAAI,oBAAA,EAAsB;AACxB,IAAA,MAAM,QAAA,GAAW,MAAM,kBAAA,CAAmB,GAAA,EAAK,aAAa,WAAW,CAAA;AAEvE,IAAA,IAAI,aAAa,QAAA,EAAU;AACzB,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,aAAa,SAAA,EAAW;AAC1B,MAAA,MAAM,cAAc,GAAG,CAAA;AACvB,MAAA;AAAA,IACF;AAIA,IAAA,IAAI,aAAa,cAAA,EAAgB;AAE/B,MAAA,MAAS,GAAA,CAAA,EAAA,CAAQ,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,YAAY,CAAA,EAAG,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,IAAA,EAAM,CAAA;AAC1E,MAAA,OAAA,CAAQ,GAAA,CAAID,OAAAA,CAAM,IAAA,CAAK,mCAAmC,CAAC,CAAA;AAAA,IAC7D;AAAA,EACF;AAEA,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,KAAA,CAAM,sBAAsB,CAAC,CAAA;AAC/C,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,EAAA,IAAI,SAAA,GAAY,OAAA;AAChB,EAAA,IAAI,eAAe,cAAA,IAAkB,UAAA;AACrC,EAAA,IAAI,qBAAkC,EAAC;AAGvC,EAAA,IAAI,gBAAA,EAAkB;AACpB,IAAA,IAAI,qBAAqB,KAAA,EAAO;AAC9B,MAAA,kBAAA,GAAqB,MAAA,CAAO,KAAK,eAAe,CAAA;AAAA,IAClD,CAAA,MAAA,IAAW,qBAAqB,MAAA,EAAQ;AACtC,MAAA,kBAAA,GAAqB,EAAC;AAAA,IACxB,CAAA,MAAO;AACL,MAAA,kBAAA,GAAqB,gBAAA,CAAiB,MAAM,GAAG,CAAA,CAAE,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,MAAM,CAAA;AAAA,IACpE;AAAA,EACF;AAGA,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,oDAAoD,CAAC,CAAA;AAE5E,IAAA,IAAI,CAAC,gBAAA,EAAkB;AACrB,MAAA,kBAAA,GAAqB,CAAC,SAAS,CAAA;AAAA,IACjC;AACA,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,EAChB,CAAA,MAAA,IAAW,CAAC,cAAA,EAAgB;AAG1B,IAAA,SAAA,GAAY,MAAM,MAAA,CAAO;AAAA,MACvB,OAAA,EAAS,+BAAA;AAAA,MACT,OAAA,EAAS;AAAA,QACP;AAAA,UACE,IAAA,EAAM,2BAAA;AAAA,UACN,KAAA,EAAO,OAAA;AAAA,UACP,WAAA,EAAa;AAAA,SACf;AAAA,QACA;AAAA,UACE,IAAA,EAAM,iBAAA;AAAA,UACN,KAAA,EAAO,UAAA;AAAA,UACP,WAAA,EAAa;AAAA;AACf;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOF,KACD,CAAA;AAED,IAAA,IAAI,cAAc,UAAA,EAAY;AAE5B,MAAA,YAAA,GAAe,MAAM,MAAA,CAAO;AAAA,QAC1B,OAAA,EAAS,kBAAA;AAAA,QACT,OAAA,EAAS;AAAA,UACP,EAAE,IAAA,EAAM,UAAA,EAAY,KAAA,EAAO,UAAA,EAAY,aAAa,gDAAA,EAAiD;AAAA,UACrG;AAAA,YACE,IAAA,EAAM,UAAA;AAAA,YACN,KAAA,EAAO,UAAA;AAAA,YACP,WAAA,EAAa;AAAA;AACf;AACF,OACD,CAAA;AAAA,IACH;AAAA,EACF;AAIA,EAAA,IAAI,iBAAiB,SAAA,EAAW;AAC9B,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,MAAA,CAAO,iDAA4C,CAAC,CAAA;AACtE,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,kEAAkE,CAAC,CAAA;AAC1F,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA,YAAA,GAAe,UAAA;AAAA,EACjB,CAAA,MAAA,IAAW,iBAAiB,YAAA,EAAc;AACxC,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,MAAA,CAAO,kEAA6D,CAAC,CAAA;AACvF,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,qEAAqE,CAAC,CAAA;AAC7F,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA,YAAA,GAAe,UAAA;AAAA,EACjB;AAGA,EAAA,MAAM,WAAA,GAAmB,MAAA,CAAA,IAAA,CAAK,aAAA,EAAe,YAAY,CAAA;AACzD,EAAA,MAAM,kBAAA,GAA0B,MAAA,CAAA,IAAA,CAAK,WAAA,EAAa,aAAa,CAAA;AAE/D,EAAA,IAAI,cAAA;AACJ,EAAA,IAAI;AACF,IAAA,MAAM,OAAA,GAAU,MAAS,GAAA,CAAA,QAAA,CAAS,kBAAA,EAAoB,OAAO,CAAA;AAC7D,IAAA,cAAA,GAAiB,IAAA,CAAK,KAAA,CAAM,OAAO,CAAA,CAAE,MAAA;AAAA,EACvC,CAAA,CAAA,MAAQ;AACN,IAAA,OAAA,CAAQ,MAAMA,OAAAA,CAAM,GAAA,CAAI,CAAA,2BAAA,EAA8B,YAAY,EAAE,CAAC,CAAA;AACrE,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAGA,EAAA,IAAI,aAAA,GAAgB,QAAA;AAEpB,EAAA,IAAI,SAAA,KAAc,OAAA,IAAW,CAAC,WAAA,EAAa;AACzC,IAAA,aAAA,GAAgB,MAAM,MAAA,CAAO;AAAA,MAC3B,OAAA,EAAS,wBAAA;AAAA,MACT,OAAA,EAAS;AAAA,QACP;AAAA,UACE,IAAA,EAAM,sBAAA;AAAA,UACN,KAAA,EAAO,QAAA;AAAA,UACP,WAAA,EAAa;AAAA,SACf;AAAA,QACA;AAAA,UACE,IAAA,EAAM,qCAAA;AAAA,UACN,KAAA,EAAO,cAAA;AAAA,UACP,WAAA,EAAa;AAAA,SACf;AAAA,QACA;AAAA,UACE,IAAA,EAAM,uCAAA;AAAA,UACN,KAAA,EAAO,aAAA;AAAA,UACP,WAAA,EAAa;AAAA,SACf;AAAA,QACA;AAAA,UACE,IAAA,EAAM,gBAAA;AAAA,UACN,KAAA,EAAO,QAAA;AAAA,UACP,WAAA,EAAa;AAAA;AACf;AACF,KACD,CAAA;AAAA,EACH;AAGA,EAAA,IAAI,kBAAkB,QAAA,EAAU;AAE9B,IAAA,cAAA,CAAe,UAAU,OAAA,GAAU,MAAA;AACnC,IAAA,cAAA,CAAe,UAAU,MAAA,GAAS,EAAA;AAAA,EACpC,CAAA,MAAA,IAAW,kBAAkB,cAAA,EAAgB;AAE3C,IAAA,cAAA,CAAe,UAAU,OAAA,GAAU,QAAA;AACnC,IAAA,cAAA,CAAe,UAAU,cAAA,GAAiB,YAAA;AAC1C,IAAA,cAAA,CAAe,UAAU,MAAA,GAAS,MAAA;AAAA,EACpC,CAAA,MAAA,IAAW,kBAAkB,aAAA,EAAe;AAE1C,IAAA,cAAA,CAAe,UAAU,OAAA,GAAU,MAAA;AACnC,IAAA,cAAA,CAAe,UAAU,MAAA,GAAS,aAAA;AAAA,EACpC,CAAA,MAAA,IAAW,kBAAkB,QAAA,EAAU;AAErC,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,MAAA,CAAO,qDAAgD,CAAC,CAAA;AAC1E,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,sEAAsE,CAAC,CAAA;AAC9F,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,iCAAiC,CAAC,CAAA;AACzD,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA,cAAA,CAAe,UAAU,OAAA,GAAU,MAAA;AACnC,IAAA,cAAA,CAAe,UAAU,MAAA,GAAS,EAAA;AAAA,EACpC;AAIA,EAAA,IAAI,CAAC,WAAA,IAAe,CAAC,gBAAA,EAAkB;AAErC,IAAA,MAAM,EAAE,QAAA,EAAU,gBAAA,EAAkB,UAAU,gBAAA,EAAiB,GAAI,MAAM,yBAAA,EAA0B;AACnG,IAAA,MAAM,WAAA,GAAc,gBAAA,CAAiB,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,QAAQ,CAAA;AAGzD,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,8BAAuB,CAAC,CAAA;AAC/C,MAAA,KAAA,MAAW,UAAU,gBAAA,EAAkB;AACrC,QAAA,IAAI,OAAO,QAAA,EAAU;AACnB,UAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,CAAA,GAAA,EAAM,eAAA,CAAgB,OAAO,IAAI,CAAA,CAAE,WAAW,CAAA,CAAE,CAAC,CAAA;AACxE,UAAA,KAAA,MAAW,MAAA,IAAU,OAAO,OAAA,EAAS;AACnC,YAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,IAAA,CAAK,CAAA,mBAAA,EAAY,MAAM,EAAE,CAAC,CAAA;AAAA,UAC9C;AAAA,QACF;AAAA,MACF;AACA,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,IAChB;AAIA,IAAA,MAAM,eAAe,MAAA,CAAO,OAAA,CAAQ,eAAe,CAAA,CAChD,MAAA,CAAO,CAAC,GAAG,MAAM,CAAA,KAAM,MAAA,CAAO,WAAW,CAAA,CACzC,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,MAAM,CAAA,MAAO;AAAA,MACvB,MAAM,MAAA,CAAO,WAAA;AAAA,MACb,KAAA,EAAO,GAAA;AAAA,MACP,OAAA,EAAS,gBAAA,CAAiB,QAAA,CAAS,GAAgB;AAAA,KACrD,CAAE,CAAA;AAGJ,IAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,4DAA4D,CAAC,CAAA;AACpF,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,kEAAkE,CAAC,CAAA;AAC1F,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,MAAA,MAAM,gBAAA,GAAmB,MAAM,QAAA,CAAS;AAAA,QACtC,OAAA,EAAS,0CAAA;AAAA,QACT,OAAA,EAAS;AAAA,OACV,CAAA;AACD,MAAA,kBAAA,GAAqB,gBAAA;AAAA,IACvB,CAAA,MAAO;AACL,MAAA,kBAAA,GAAqB,EAAC;AAAA,IACxB;AAAA,EACF;AAGA,EAAA,MAAM,YAAA,GAAoB,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,YAAA,EAAc,WAAW,CAAA;AAC7D,EAAA,IAAI;AACF,IAAA,MAAS,GAAA,CAAA,KAAA,CAAM,YAAA,EAAc,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EAClD,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAMA,OAAAA,CAAM,GAAA,CAAI,qCAAqC,GAAG,KAAK,CAAA;AACrE,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAGA,EAAA,MAAM,gBAAA,GAAwB,MAAA,CAAA,IAAA,CAAK,WAAA,EAAa,OAAO,CAAA;AAEvD,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,MAAS,GAAA,CAAA,OAAA,CAAQ,gBAAgB,CAAA;AAE/C,IAAA,IAAI,iBAAiB,UAAA,EAAY;AAE/B,MAAA,MAAM,UAAA,GAAkB,MAAA,CAAA,IAAA,CAAK,gBAAA,EAAkB,WAAW,CAAA;AAC1D,MAAA,MAAM,cAAA,GAAsB,MAAA,CAAA,IAAA,CAAK,YAAA,EAAc,kBAAkB,CAAA;AACjE,MAAA,MAAS,GAAA,CAAA,QAAA,CAAS,YAAY,cAAc,CAAA;AAC5C,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,KAAA,CAAM,sDAAiD,CAAC,CAAA;AAG1E,MAAA,cAAA,CAAe,QAAA,GAAW,kBAAA;AAC1B,MAAA,cAAA,CAAe,SAAA,GAAY;AAAA,QACzB,OAAA,EAAS;AAAA,OACX;AAAA,IACF,CAAA,MAAA,IAAW,iBAAiB,UAAA,EAAY;AAEtC,MAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,QAAA,MAAM,OAAA,GAAe,MAAA,CAAA,IAAA,CAAK,gBAAA,EAAkB,IAAI,CAAA;AAChD,QAAA,MAAM,QAAA,GAAgB,MAAA,CAAA,IAAA,CAAK,YAAA,EAAc,IAAI,CAAA;AAC7C,QAAA,MAAS,GAAA,CAAA,QAAA,CAAS,SAAS,QAAQ,CAAA;AAAA,MACrC;AACA,MAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,KAAA,CAAM,6CAAwC,KAAA,CAAM,MAAM,QAAQ,CAAC,CAAA;AACrF,MAAA,OAAA,CAAQ,GAAA,CAAIA,QAAM,IAAA,CAAK,CAAA,SAAA,EAAY,MAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAC,CAAA;AAGtD,MAAA,cAAA,CAAe,QAAA,GAAW,WAAA;AAC1B,MAAA,cAAA,CAAe,SAAA,GAAY;AAAA,QACzB,OAAA,EAAS;AAAA,OACX;AAAA,IACF;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAMA,OAAAA,CAAM,GAAA,CAAI,+BAA+B,GAAG,KAAK,CAAA;AAC/D,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAIA,EAAA,MAAM,UAAA,CAAW,gBAAgB,GAAG,CAAA;AACpC,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,KAAA,CAAM,uCAAkC,CAAC,CAAA;AAG3D,EAAA,MAAM,aAAA,GAAgB,MAAM,2BAAA,CAA4B,GAAG,CAAA;AAC3D,EAAA,IAAI,YAAsB,EAAC;AAC3B,EAAA,IAAI,cAAA,GAAiB,KAAA;AAErB,EAAA,IAAI,aAAA,CAAc,SAAS,CAAA,EAAG;AAC5B,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA,OAAA,CAAQ,GAAA,CAAIA,QAAM,MAAA,CAAO,CAAA,gBAAA,EAAmB,cAAc,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAC,CAAA;AAEvE,IAAA,IAAI,WAAA,EAAa;AAEf,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,gDAAgD,CAAC,CAAA;AACxE,MAAA,MAAM0B,YAAAA,GAAc,MAAMF,eAAAA,CAAe,GAAG,CAAA;AAC5C,MAAA,MAAM,mBAAA,CAAoB,YAAY,aAAA,EAAe,WAAA,EAAa,KAAK,EAAE,YAAA,EAAcE,cAAa,CAAA;AAGpG,MAAA,MAAM,UAAA,GAAkB,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,YAAA,EAAc,wBAAwB,CAAA;AACxE,MAAA,cAAA,GAAiB,MAAM,gBAAA;AAAA,QAAiB,GAAA;AAAA,QAAK,UAAA;AAAA,QAAY;AAAA;AAAA,OAAsB;AAAA,IACjF,CAAA,MAAO;AACL,MAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAA2D;AAAA,QAC9E,OAAA,EAAS,kDAAA;AAAA,QACT,OAAA,EAAS;AAAA,UACP;AAAA,YACE,IAAA,EAAM,iCAAA;AAAA,YACN,KAAA,EAAO,UAAA;AAAA,YACP,WAAA,EAAa;AAAA,WACf;AAAA,UACA;AAAA,YACE,IAAA,EAAM,eAAA;AAAA,YACN,KAAA,EAAO,cAAA;AAAA,YACP,WAAA,EAAa;AAAA,WACf;AAAA,UACA;AAAA,YACE,IAAA,EAAM,uBAAA;AAAA,YACN,KAAA,EAAO,WAAA;AAAA,YACP,WAAA,EAAa;AAAA,WACf;AAAA,UACA;AAAA,YACE,IAAA,EAAM,oBAAA;AAAA,YACN,KAAA,EAAO,MAAA;AAAA,YACP,WAAA,EAAa;AAAA;AACf;AACF,OACD,CAAA;AAGD,MAAA,MAAMA,YAAAA,GAAc,MAAMF,eAAAA,CAAe,GAAG,CAAA;AAE5C,MAAA,MAAM,mBAAA,CAAoB,QAAQ,aAAA,EAAe,WAAA,EAAa,KAAK,EAAE,YAAA,EAAcE,cAAa,CAAA;AAEhG,MAAA,IAAI,WAAW,MAAA,EAAQ;AACrB,QAAA,SAAA,GAAY,aAAA;AAAA,MACd,CAAA,MAAA,IAAW,WAAW,UAAA,EAAY;AAEhC,QAAA,MAAM,UAAA,GAAkB,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,YAAA,EAAc,wBAAwB,CAAA;AACxE,QAAA,cAAA,GAAiB,MAAM,gBAAA;AAAA,UAAiB,GAAA;AAAA,UAAK,UAAA;AAAA,UAAY;AAAA;AAAA,SAAuB;AAAA,MAClF;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,WAAA,GAAc,MAAMF,eAAAA,CAAe,GAAG,CAAA;AAG5C,EAAA,IAAI,CAAC,SAAA,CAAU,QAAA,CAAS,WAAW,CAAA,IAAK,CAAC,cAAA,EAAgB;AACvD,IAAA,MAAM,gBAAA,GAAwB,MAAA,CAAA,IAAA,CAAK,WAAA,EAAa,WAAW,CAAA;AAC3D,IAAA,MAAM,gBAAA,GAAwB,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,WAAW,CAAA;AAEnD,IAAA,IAAI;AACF,MAAA,IAAI,aAAA,GAAgB,MAAS,GAAA,CAAA,QAAA,CAAS,gBAAA,EAAkB,OAAO,CAAA;AAE/D,MAAA,aAAA,GAAgB,aAAA,CAAc,OAAA,CAAQ,mBAAA,EAAqB,WAAW,CAAA;AACtE,MAAA,MAAS,GAAA,CAAA,SAAA,CAAU,gBAAA,EAAkB,aAAA,EAAe,OAAO,CAAA;AAC3D,MAAA,OAAA,CAAQ,GAAA,CAAIxB,OAAAA,CAAM,KAAA,CAAM,0BAAqB,CAAC,CAAA;AAAA,IAChD,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAMA,OAAAA,CAAM,GAAA,CAAI,0BAA0B,GAAG,KAAK,CAAA;AAC1D,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAGA,IAAA,IAAI,kBAAA,CAAmB,SAAS,CAAA,EAAG;AACjC,MAAA,MAAM,cAAA,GAAiB,MAAM,uBAAA,CAAwB,GAAA,EAAK,kBAAkB,CAAA;AAC5E,MAAA,KAAA,MAAW,UAAU,cAAA,EAAgB;AACnC,QAAA,IAAI,OAAO,OAAA,EAAS;AAClB,UAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,KAAA,CAAM,kBAAa,MAAA,CAAO,IAAI,mBAAc,CAAC,CAAA;AAAA,QACjE,CAAA,MAAA,IAAW,OAAO,OAAA,EAAS;AACzB,UAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,MAAA,CAAO,kBAAa,MAAA,CAAO,IAAI,mBAAmB,CAAC,CAAA;AAAA,QACvE,CAAA,MAAA,IAAW,OAAO,KAAA,EAAO;AACvB,UAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,MAAA,CAAO,CAAA,wBAAA,EAAsB,MAAA,CAAO,IAAI,CAAA,EAAA,EAAK,MAAA,CAAO,KAAK,CAAA,CAAE,CAAC,CAAA;AAAA,QAChF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAIA,EAAA,MAAM,QAAA,GAAgB,MAAA,CAAA,IAAA,CAAK,WAAA,EAAa,OAAO,CAAA;AAC/C,EAAA,IAAI;AAEF,IAAA,MAAM,WAAA,GAAc,MAAS,GAAA,CAAA,OAAA,CAAQ,QAAQ,CAAA;AAC7C,IAAA,MAAM,gBAAgB,WAAA,CAAY,IAAA,CAAK,OAAK,CAAC,CAAA,CAAE,MAAM,UAAU,CAAA,IAAK,CAAC,CAAC,aAAa,WAAA,EAAa,SAAA,EAAW,SAAS,CAAA,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA;AAEjI,IAAA,IAAI,aAAA,EAAe;AACjB,MAAA,MAAM,aAAA,CAAc,QAAA,EAAU,GAAA,EAAK,CAAC,GAAG,SAAA,EAAW,WAAA,EAAa,WAAA,EAAa,SAAA,EAAW,SAAS,CAAA,EAAG,EAAE,YAAA,EAAc,aAAa,CAAA;AAAA,IAClI;AACA,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,KAAA,CAAM,sCAAiC,CAAC,CAAA;AAAA,EAC5D,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAMA,OAAAA,CAAM,GAAA,CAAI,+BAA+B,GAAG,KAAK,CAAA;AAC/D,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAGA,EAAA,MAAM,QAAA,GAAgB,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,OAAO,CAAA;AACvC,EAAA,IAAI;AACF,IAAA,MAAS,GAAA,CAAA,KAAA,CAAM,QAAA,EAAU,EAAE,SAAA,EAAW,MAAM,CAAA;AAC5C,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,KAAA,CAAM,iCAA4B,CAAC,CAAA;AAAA,EACvD,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAMA,OAAAA,CAAM,GAAA,CAAI,iCAAiC,GAAG,KAAK,CAAA;AACjE,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAEA,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,KAAA,CAAM,8BAAyB,CAAC,CAAA;AAClD,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,GAAA,CAAIA,QAAM,IAAA,CAAK,qBAAsB,IAAIA,OAAAA,CAAM,IAAA,CAAK,sDAAsD,CAAC,CAAA;AACnH,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,kDAAkD,CAAC,CAAA;AAC1E,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,8DAA8D,CAAC,CAAA;AACtF,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAChB;AAKA,eAAe,YAAA,GAA8B;AAC3C,EAAA,MAAM,WAAW,eAAA,EAAgB;AAEjC,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,qBAAqB,CAAC,CAAA;AAC7C,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAM,eAAA,GACJ,OAAA,CAAQ,UAAA,KAAe,UAAA,GAAaA,OAAAA,CAAM,KAAA,GAC1C,OAAA,CAAQ,UAAA,KAAe,cAAA,GAAiBA,OAAAA,CAAM,MAAA,GAC9CA,OAAAA,CAAM,GAAA;AAER,IAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,IAAA,CAAK,KAAK,OAAA,CAAQ,IAAI,EAAE,CAAC,CAAA;AAC3C,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,IAAA,EAAO,OAAA,CAAQ,WAAW,CAAA,CAAE,CAAA;AACxC,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,IAAA,EAAO,eAAA,CAAgB,OAAA,CAAQ,UAAU,CAAC,CAAA,QAAA,EAAM,OAAA,CAAQ,IAAA,CAAK,KAAK,IAAI,CAAC,CAAA,SAAA,EAAO,OAAA,CAAQ,KAAK,CAAA,MAAA,CAAQ,CAAA;AAC/G,IAAA,OAAA,CAAQ,IAAI,CAAA,cAAA,EAAiBA,OAAAA,CAAM,KAAK,OAAA,CAAQ,WAAW,CAAC,CAAA,CAAE,CAAA;AAC9D,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,EAChB;AAEA,EAAA,OAAA,CAAQ,IAAI,QAAQ,CAAA;AACpB,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,mCAAmC,CAAC,CAAA;AAC3D,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,uCAAuC,CAAC,CAAA;AAC/D,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAChB;AAKA,eAAe,eAAA,CAAgB,aAAqB,UAAA,EAAoC;AAEtF,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,WAAA,GAAc,MAAM,aAAA,EAAc;AAAA,EACpC;AAGA,EAAA,IAAI,CAAC,aAAA,CAAc,WAAW,CAAA,EAAG;AAC/B,IAAA,OAAA,CAAQ,MAAMA,OAAAA,CAAM,GAAA,CAAI,CAAA,gBAAA,EAAmB,WAAW,cAAc,CAAC,CAAA;AACrE,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA,OAAA,CAAQ,IAAI,qBAAqB,CAAA;AACjC,IAAA,eAAA,EAAgB,CAAE,QAAQ,CAAA,EAAA,KAAM;AAC9B,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,IAAA,EAAO,EAAA,CAAG,IAAI,CAAA,CAAE,CAAA;AAAA,IAC9B,CAAC,CAAA;AACD,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA,OAAA,CAAQ,IAAI,4BAA4B,CAAA;AACxC,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAEA,EAAA,MAAM,OAAA,GAAU,WAAW,WAAW,CAAA;AACtC,EAAA,MAAM,gBAAgB,UAAA,IAAc,WAAA;AACpC,EAAA,MAAM,UAAA,GAAkB,MAAA,CAAA,IAAA,CAAK,OAAA,CAAQ,GAAA,IAAO,aAAa,CAAA;AAGzD,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,MAAS,GAAA,CAAA,OAAA,CAAQ,UAAU,CAAA;AACzC,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,MAAA,CAAO,CAAA,CAAA,KAAK,MAAM,MAAM,CAAA;AAClD,IAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,MAAA,OAAA,CAAQ,MAAMA,OAAAA,CAAM,GAAA,CAAI,CAAA,kBAAA,EAAqB,aAAa,oCAAoC,CAAC,CAAA;AAC/F,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,6CAA6C,CAAC,CAAA;AACrE,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAEA,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,KAAA,CAAM,uBAAuB,OAAA,CAAQ,KAAK,EAAE,CAAC,CAAA;AAC/D,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,WAAW,CAAC,CAAA;AAC3C,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,EAAA,MAAS,GAAA,CAAA,KAAA,CAAM,UAAA,EAAY,EAAE,SAAA,EAAW,MAAM,CAAA;AAC9C,EAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,KAAA,CAAM,CAAA,0BAAA,EAAwB,aAAa,GAAG,CAAC,CAAA;AAGjE,EAAA,MAAM,WAAA,GAAmB,MAAA,CAAA,IAAA,CAAK,YAAA,EAAc,WAAW,CAAA;AACvD,EAAA,MAAM,sBAAA,CAAuB,aAAa,UAAU,CAAA;AACpD,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,KAAA,CAAM,+BAA0B,CAAC,CAAA;AAGnD,EAAA,MAAM,WAAA,GAAc,QAAQ,GAAA,EAAI;AAChC,EAAA,IAAI;AACF,IAAA,OAAA,CAAQ,MAAM,UAAU,CAAA;AACxB,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,0BAA0B,CAAC,CAAA;AAClD,IAAA,MAAM,YAAY,IAAI,CAAA;AACtB,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,KAAA,CAAM,6BAAwB,CAAC,CAAA;AAAA,EACnD,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAMA,OAAAA,CAAM,GAAA,CAAI,8BAA8B,GAAG,KAAK,CAAA;AAC9D,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB,CAAA,SAAE;AACA,IAAA,OAAA,CAAQ,MAAM,WAAW,CAAA;AAAA,EAC3B;AAGA,EAAA,MAAM,cAAA,GAAiB,MAAM,oBAAA,EAAqB;AAGlD,EAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,IAAA,CAAK,CAAA,6BAAA,EAAgC,cAAc,KAAK,CAAC,CAAA;AAC3E,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,QAAA,EAAAqB,SAAAA,EAAS,GAAI,MAAM,OAAO,eAAoB,CAAA;AACtD,IAAAA,SAAAA,CAAS,CAAA,EAAG,cAAc,CAAA,QAAA,CAAA,EAAY;AAAA,MACpC,GAAA,EAAK,UAAA;AAAA,MACL,KAAA,EAAO;AAAA,KACR,CAAA;AACD,IAAA,OAAA,CAAQ,GAAA,CAAIrB,OAAAA,CAAM,KAAA,CAAM,+BAA0B,CAAC,CAAA;AAAA,EACrD,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,MAAA,CAAO,qDAAgD,CAAC,CAAA;AAC1E,IAAA,OAAA,CAAQ,GAAA,CAAIA,QAAM,IAAA,CAAK,CAAA,UAAA,EAAa,aAAa,CAAA,IAAA,EAAO,cAAc,UAAU,CAAC,CAAA;AAAA,EACnF;AAGA,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,KAAA,CAAM,+BAA0B,CAAC,CAAA;AACnD,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,UAAU,CAAC,CAAA;AAClC,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,CAAA,sBAAA,EAAyB,OAAA,CAAQ,KAAK,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA;AAC3E,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,qDAAqD,CAAC,CAAA;AAC7E,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,IAAI,aAAa,CAAA;AACzB,EAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,IAAA,CAAK,CAAA,QAAA,EAAW,aAAa,EAAE,CAAC,CAAA;AAClD,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,uCAAuC,CAAC,CAAA;AAC/D,EAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,IAAA,CAAK,6BAA6B,OAAA,CAAQ,WAAW,EAAE,CAAC,CAAA;AAC1E,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,CAAA,6DAAA,CAA+D,CAAC,CAAA;AACvF,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAChB;AAKA,eAAe,aAAA,GAAiC;AAC9C,EAAA,MAAM,WAAW,eAAA,EAAgB;AAEjC,EAAA,MAAM,MAAA,GAAS,MAAM,MAAA,CAAO;AAAA,IAC1B,OAAA,EAAS,4BAAA;AAAA,IACT,OAAA,EAAS,QAAA,CAAS,GAAA,CAAI,CAAA,EAAA,KAAM;AAC1B,MAAA,MAAM,eAAA,GACJ,GAAG,UAAA,KAAe,UAAA,GAAa,uBAC/B,EAAA,CAAG,UAAA,KAAe,iBAAiB,oBAAA,GACnC,oBAAA;AAEF,MAAA,OAAO;AAAA,QACL,IAAA,EAAM,CAAA,EAAG,EAAA,CAAG,KAAK,KAAK,eAAe,CAAA,CAAA,CAAA;AAAA,QACrC,OAAO,EAAA,CAAG,IAAA;AAAA,QACV,WAAA,EAAa,GAAG,EAAA,CAAG,WAAW,WAAM,EAAA,CAAG,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC,CAAA;AAAA,OACxD;AAAA,IACF,CAAC;AAAA,GACF,CAAA;AAED,EAAA,OAAO,MAAA;AACT;AAKA,eAAe,sBAAA,CAAuB,KAAa,IAAA,EAA6B;AAC9E,EAAA,MAAM,UAAU,MAAS,GAAA,CAAA,OAAA,CAAQ,KAAK,EAAE,aAAA,EAAe,MAAM,CAAA;AAE7D,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,MAAM,OAAA,GAAe,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,KAAA,CAAM,IAAI,CAAA;AACzC,IAAA,MAAM,QAAA,GAAgB,MAAA,CAAA,IAAA,CAAK,IAAA,EAAM,KAAA,CAAM,IAAI,CAAA;AAE3C,IAAA,IAAI,KAAA,CAAM,aAAY,EAAG;AACvB,MAAA,MAAS,GAAA,CAAA,KAAA,CAAM,QAAA,EAAU,EAAE,SAAA,EAAW,MAAM,CAAA;AAC5C,MAAA,MAAM,sBAAA,CAAuB,SAAS,QAAQ,CAAA;AAAA,IAChD,CAAA,MAAO;AACL,MAAA,MAAS,GAAA,CAAA,QAAA,CAAS,SAAS,QAAQ,CAAA;AAAA,IACrC;AAAA,EACF;AACF;AAKA,eAAe,oBAAA,GAAwC;AACrD,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AAGxB,EAAA,IAAI;AACF,IAAA,MAAS,GAAA,CAAA,MAAA,CAAY,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,IAAA,EAAM,gBAAgB,CAAC,CAAA;AACtD,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AAAA,EAAC;AAET,EAAA,IAAI;AACF,IAAA,MAAS,GAAA,CAAA,MAAA,CAAY,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,IAAA,EAAM,WAAW,CAAC,CAAA;AACjD,IAAA,OAAO,MAAA;AAAA,EACT,CAAA,CAAA,MAAQ;AAAA,EAAC;AAGT,EAAA,OAAO,KAAA;AACT;AC37BO,SAAS,YAAA,CAAa,QAAA,EAAmB,OAAA,GAAwB,EAAC,EAA4B;AACnG,EAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,IAAA,OAAO,SAAA,CAAU,UAAU,OAAO,CAAA;AAAA,EACpC;AAEA,EAAA,OAAO,IAAIC,OAAAA,CAAQ,OAAO,CAAA,CACvB,WAAA,CAAY,sBAAsB,CAAA,CAClC,QAAA,CAAS,QAAA,EAAU,wBAAwB,CAAA,CAC3C,MAAA,CAAO,eAAA,EAAiB,8BAA8B,CAAA,CACtD,MAAA,CAAO,QAAA,EAAU,qBAAqB,CAAA,CACtC,MAAA,CAAO,QAAA,EAAU,gBAAgB,CAAA,CACjC,MAAA,CAAO,OAAO,MAAA,EAAgB,IAAA,KAAuB;AACpD,IAAA,MAAM,SAAA,CAAU,QAAQ,IAAI,CAAA;AAAA,EAC9B,CAAC,CAAA;AACL;AAEA,eAAsB,SAAA,CACpB,QAAA,EACA,OAAA,GAAwB,EAAC,EACV;AAEf,EAAA,MAAM,kBAAA,EAAmB;AAEzB,EAAA,MAAM,MAAA,GAAS,MAAM,UAAA,EAAW;AAChC,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AACxB,EAAA,MAAM,QAAA,GAAgB0B,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,MAAA,CAAO,QAAQ,CAAA;AAG/C,EAAA,MAAM,YAAA,GAAe,MAAM,eAAA,CAAgB,QAAA,EAAU,KAAK,QAAQ,CAAA;AAClE,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,iBAAA,CAAkB,QAAQ,CAAC,CAAA,0DAAA,CAA4D,CAAA;AAAA,EAC5H;AAGA,EAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,YAAY,CAAA;AACvC,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,qBAAA,EAAwB,iBAAA,CAAkB,QAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,EACvE;AAGA,EAAA,MAAM,QAAA,GAAW,MAAM,YAAA,CAAa,IAAA,CAAK,QAAQ,CAAA;AAGjD,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,MAAMC,WAAAA,GAAa,MAASC,GAAA,CAAA,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA;AAC9C,IAAA,MAAMC,cAAAA,GAAgB,MAASD,GAAA,CAAA,QAAA,CAAS,IAAA,CAAK,UAAU,OAAO,CAAA;AAC9D,IAAA,MAAME,gBAAe,MAAM,WAAA,CAAY,EAAE,OAAA,EAASD,gBAAe,CAAA;AAEjE,IAAA,MAAM,UAAA,GAAa;AAAA,MACjB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,MAAM,IAAA,CAAK,QAAA;AAAA,MACX,KAAA,EAAO;AAAA,QACL;AAAA,UACE,IAAA,EAAM,WAAA;AAAA,UACN,IAAA,EAAM,UAAA;AAAA,UACN,MAAMF,WAAAA,CAAW,IAAA;AAAA,UACjB,QAAQG,aAAAA,CAAa;AAAA,SACvB;AAAA,QACA,GAAG,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,UACpB,MAAM,CAAA,CAAE,IAAA;AAAA,UACR,MAAM,CAAA,CAAE,IAAA;AAAA,UACR,MAAM,CAAA,CAAE;AAAA,SACV,CAAE;AAAA,OACJ;AAAA,MACA,KAAA,EAAO,SAAS,MAAA,GAAS;AAAA,KAC3B;AACA,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,UAAA,EAAY,IAAA,EAAM,CAAC,CAAC,CAAA;AAC/C,IAAA;AAAA,EACF;AAEA,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,GAAA,CAAI/B,QAAM,IAAA,CAAK,CAAA,mBAAA,EAAe,kBAAkB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAC,CAAA;AACrE,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,KAAA,CAAM,WAAW,CAAC,CAAA;AACpC,EAAA,MAAM,UAAA,GAAa,MAAS6B,GAAA,CAAA,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA;AAC9C,EAAA,MAAM,UAAA,GAAa,UAAA,CAAW,UAAA,CAAW,IAAI,CAAA;AAC7C,EAAA,MAAM,aAAA,GAAgB,MAASA,GAAA,CAAA,QAAA,CAAS,IAAA,CAAK,UAAU,OAAO,CAAA;AAC9D,EAAA,MAAM,eAAe,MAAM,WAAA,CAAY,EAAE,OAAA,EAAS,eAAe,CAAA;AACjE,EAAA,OAAA,CAAQ,GAAA,CAAI7B,OAAAA,CAAM,KAAA,CAAM,CAAA,iCAAA,EAA+B,UAAU,CAAA,GAAA,EAAM,YAAA,CAAa,KAAA,CAAM,cAAA,EAAgB,CAAA,mBAAA,CAAqB,CAAC,CAAA;AAChI,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,EAAA,IAAI,aAAA,GAAgB,QAAA;AACpB,EAAA,IAAI,OAAA,CAAQ,SAAS,MAAA,EAAQ;AAC3B,IAAA,aAAA,GAAgB,SAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,UAAU,CAAA;AAAA,EAC9D,CAAA,MAAA,IAAW,OAAA,CAAQ,IAAA,KAAS,QAAA,EAAU;AACpC,IAAA,aAAA,GAAgB,SAAS,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,OAAO,CAAA;AAAA,EAC3D;AAEA,EAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAC9B,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,qBAAqB,CAAC,CAAA;AAC7C,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,YAAY,aAAA,CAAc,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,UAAU,CAAA;AACnE,EAAA,MAAM,SAAS,aAAA,CAAc,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,OAAO,CAAA;AAE7D,EAAA,IAAI,SAAA,CAAU,SAAS,CAAA,KAAM,CAAC,QAAQ,IAAA,IAAQ,OAAA,CAAQ,SAAS,MAAA,CAAA,EAAS;AACtE,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,YAAY,CAAC,CAAA;AACpC,IAAA,KAAA,MAAW,QAAQ,SAAA,EAAW;AAC5B,MAAA,MAAM,IAAA,GAAO,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA;AAEjC,MAAA,MAAM,OAAA,GAAU,MAAS6B,GAAA,CAAA,QAAA,CAAS,IAAA,CAAK,MAAM,OAAO,CAAA;AACpD,MAAA,MAAM,UAAA,GAAa,MAAM,WAAA,CAAY,EAAE,SAAS,CAAA;AAChD,MAAA,OAAA,CAAQ,IAAI7B,OAAAA,CAAM,IAAA,CAAK,YAAO,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA,CAAE,MAAA,CAAO,EAAE,CAAC,CAAA,EAAA,EAAK,IAAI,CAAA,GAAA,EAAM,UAAA,CAAW,MAAM,cAAA,EAAgB,UAAU,CAAC,CAAA;AAAA,IAClI;AACA,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,EAChB;AAEA,EAAA,IAAI,MAAA,CAAO,SAAS,CAAA,KAAM,CAAC,QAAQ,IAAA,IAAQ,OAAA,CAAQ,SAAS,QAAA,CAAA,EAAW;AACrE,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,MAAA,CAAO,SAAS,CAAC,CAAA;AACnC,IAAA,KAAA,MAAW,QAAQ,MAAA,EAAQ;AACzB,MAAA,MAAM,IAAA,GAAO,UAAA,CAAW,IAAA,CAAK,IAAI,CAAA;AACjC,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,MAAA,CAAO,CAAA,SAAA,EAAO,kBAAkB,IAAA,CAAK,IAAI,CAAA,CAAE,MAAA,CAAO,EAAE,CAAC,CAAA,EAAA,EAAK,IAAI,GAAG,CAAC,CAAA;AAAA,IACtF;AACA,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,EAChB;AAGA,EAAA,MAAM,UAAA,GAAa,cAAc,MAAA,GAAS,CAAA;AAC1C,EAAA,MAAM,SAAA,GAAY,UAAA;AAAA,IAChB,UAAA,CAAW,IAAA,GAAO,aAAA,CAAc,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,IAAA,EAAM,CAAC;AAAA,GACpE;AACA,EAAA,OAAA,CAAQ,GAAA,CAAIA,QAAM,IAAA,CAAK,CAAA,OAAA,EAAU,UAAU,CAAA,QAAA,EAAW,SAAS,EAAE,CAAC,CAAA;AAClE,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAChB;AAEA,SAAS,WAAW,KAAA,EAAuB;AACzC,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,OAAO,GAAG,KAAK,CAAA,EAAA,CAAA;AAAA,EACjB,CAAA,MAAA,IAAW,KAAA,GAAQ,IAAA,GAAO,IAAA,EAAM;AAC9B,IAAA,OAAO,CAAA,EAAA,CAAI,KAAA,GAAQ,IAAA,EAAM,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AAAA,EACrC,CAAA,MAAO;AACL,IAAA,OAAO,IAAI,KAAA,IAAS,IAAA,GAAO,IAAA,CAAA,EAAO,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAA,CAAA;AAAA,EAC9C;AACF;ACvJO,SAAS,eAAA,GAA2B;AACzC,EAAA,OAAO,IAAIC,QAAQ,UAAU,CAAA,CAC1B,YAAY,+CAA+C,CAAA,CAC3D,OAAO,YAAY;AAClB,IAAA,MAAM+B,aAAAA,EAAa;AAAA,EACrB,CAAC,CAAA;AACL;AAEA,eAAeA,aAAAA,GAA8B;AAC3C,EAAA,MAAM,WAAW,eAAA,EAAgB;AAEjC,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,GAAA,CAAIhC,OAAAA,CAAM,IAAA,CAAK,2BAA2B,CAAC,CAAA;AACnD,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,IAAI,yDAAyD,CAAA;AACrE,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,EAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,IAAA,MAAM,eAAA,GACJ,OAAA,CAAQ,UAAA,KAAe,UAAA,GAAaA,OAAAA,CAAM,KAAA,GAC1C,OAAA,CAAQ,UAAA,KAAe,cAAA,GAAiBA,OAAAA,CAAM,MAAA,GAC9CA,OAAAA,CAAM,GAAA;AAER,IAAA,MAAM,eAAA,GACJ,QAAQ,UAAA,KAAe,UAAA,GAAa,uBACpC,OAAA,CAAQ,UAAA,KAAe,iBAAiB,oBAAA,GACxC,oBAAA;AAEF,IAAA,OAAA,CAAQ,GAAA,CAAIA,QAAM,IAAA,CAAK,IAAA,CAAK,KAAK,OAAA,CAAQ,KAAK,EAAE,CAAC,CAAA;AACjD,IAAA,OAAA,CAAQ,IAAI,CAAA,IAAA,EAAOA,OAAAA,CAAM,KAAK,OAAA,CAAQ,IAAI,CAAC,CAAA,CAAE,CAAA;AAC7C,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,IAAA,EAAO,OAAA,CAAQ,WAAW,CAAA,CAAE,CAAA;AACxC,IAAA,OAAA,CAAQ,IAAI,CAAA,IAAA,EAAO,eAAA,CAAgB,eAAA,GAAkB,GAAA,GAAM,QAAQ,UAAU,CAAC,CAAA,QAAA,EAAM,OAAA,CAAQ,KAAK,IAAA,CAAK,IAAI,CAAC,CAAA,SAAA,EAAO,OAAA,CAAQ,KAAK,CAAA,MAAA,CAAQ,CAAA;AACvI,IAAA,OAAA,CAAQ,GAAA,CAAI,OAAOA,OAAAA,CAAM,IAAA,CAAK,WAAW,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,QAAQ,CAAA,CAAE,CAAA;AAChE,IAAA,OAAA,CAAQ,IAAI,CAAA,IAAA,EAAOA,OAAAA,CAAM,KAAK,OAAA,CAAQ,WAAW,CAAC,CAAA,CAAE,CAAA;AACpD,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,EAChB;AAEA,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,QAAQ,CAAC,CAAA;AAChC,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,IAAI,yBAAyB,CAAA;AACrC,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,mCAAmC,CAAC,CAAA;AAC3D,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,IAAI,2BAA2B,CAAA;AACvC,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,4BAA4B,CAAC,CAAA;AACpD,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,IAAI,2BAA2B,CAAA;AACvC,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,sDAAsD,CAAC,CAAA;AAC9E,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAChB;AC7BO,SAAS,cAAA,CAAe,SAAA,EAAoB,OAAA,GAAqC,EAAC,EAA4B;AACnH,EAAA,IAAI,OAAO,cAAc,QAAA,EAAU;AACjC,IAAA,OAAO,YAAA,CAAa,WAAW,OAAO,CAAA;AAAA,EACxC;AAEA,EAAA,OAAO,IAAIC,OAAAA,CAAQ,SAAS,CAAA,CACzB,WAAA,CAAY,+DAA+D,CAAA,CAC3E,QAAA,CAAS,cAAA,EAAgB,+CAA+C,EACxE,MAAA,CAAO,QAAA,EAAU,2EAA2E,CAAA,CAC5F,MAAA,CAAO,qBAAqB,iDAAiD,CAAA,CAC7E,MAAA,CAAO,WAAA,EAAa,gCAAgC,CAAA,CACpD,MAAA,CAAO,oBAAoB,0BAAA,EAA4B,QAAQ,EAC/D,MAAA,CAAO,mBAAA,EAAqB,gCAAgC,CAAA,CAC5D,OAAO,YAAA,EAAc,mCAAmC,EACxD,MAAA,CAAO,OAAO,QAAgB,IAAA,KAOzB;AACJ,IAAA,IAAI,IAAA,CAAK,IAAA,IAAQ,CAAC,CAAC,SAAA,EAAW,QAAA,EAAU,QAAQ,CAAA,CAAE,QAAA,CAAS,IAAA,CAAK,IAAI,CAAA,EAAG;AACrE,MAAA,OAAA,CAAQ,MAAM,mFAA8E,CAAA;AAC5F,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AACA,IAAA,MAAM,aAAa,MAAA,EAAQ;AAAA,MACzB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,YAAY,IAAA,CAAK,IAAA;AAAA,MACjB,QAAQ,IAAA,CAAK,MAAA;AAAA,MACb,WAAW,IAAA,CAAK,SAAA;AAAA,MAChB,gBAAgB,IAAA,CAAK,cAAA;AAAA,MACrB,UAAU,IAAA,CAAK;AAAA,KAChB,CAAA;AAAA,EACH,CAAC,CAAA;AACL;AAKA,eAAsB,YAAA,CAAa,SAAA,EAAmB,OAAA,GAAqC,EAAC,EAAkB;AAC5G,EAAA,MAAM,MAAA,GAAS,MAAM,UAAA,EAAW;AAGhC,EAAA,IAAI;AACF,IAAA,MAAM,KAAA,GAAQ,MAASgC,GAAA,CAAA,IAAA,CAAK,SAAS,CAAA;AACrC,IAAA,IAAI,CAAC,KAAA,CAAM,WAAA,EAAY,EAAG;AACxB,MAAA,OAAA,CAAQ,MAAM,6DAAwD,CAAA;AACtE,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,6CAAA,EAA2C,SAAS,CAAA,CAAE,CAAA;AACpE,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAGA,EAAA,OAAA,CAAQ,GAAA,CAAI,4BAA4B,SAAS;AAAA,CAAI,CAAA;AACrD,EAAA,MAAM,SAAA,GAAY,MAAM,aAAA,CAAc,SAAS,CAAA;AAE/C,EAAA,IAAI,SAAA,CAAU,WAAW,CAAA,EAAG;AAC1B,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,mDAAA,EAAiD,SAAS,CAAA,CAAE,CAAA;AAC1E,IAAA,OAAA,CAAQ,MAAM,6BAA6B,CAAA;AAC3C,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAEA,EAAA,OAAA,CAAQ,GAAA,CAAI,+BAA0B,SAAA,CAAU,MAAM,YAAY,SAAA,CAAU,MAAA,KAAW,CAAA,GAAI,EAAA,GAAK,GAAG;AAAA,CAAI,CAAA;AAGvG,EAAA,MAAM,MAAA,GAAS,MAAM,kBAAA,CAAmB,SAAA,EAAW,SAAS,CAAA;AAC5D,EAAA,OAAA,CAAQ,GAAA,CAAI,mCAAmC,MAAM;AAAA,CAAI,CAAA;AAGzD,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,MAAM,WAAA,CAAY,SAAA,EAAW,SAAA,EAAW,MAAA,EAAQ,QAAQ,OAAO,CAAA;AAC/D,IAAA;AAAA,EACF;AAGA,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,MAAM,aAAA,CAAc,SAAA,EAAW,SAAA,EAAW,OAA2B,CAAA;AAAA,EACvE,CAAA,MAAO;AAEL,IAAA,MAAM,wBAAA,CAAyB,SAAA,EAAW,SAAA,EAAW,MAAA,EAAQ,MAAM,CAAA;AAAA,EACrE;AACF;AAKA,eAAsB,cAAc,OAAA,EAA0C;AAC5E,EAAA,MAAM,YAA4B,EAAC;AAEnC,EAAA,eAAe,cAAc,WAAA,EAAoC;AAC/D,IAAA,MAAM,UAAU,MAASA,GAAA,CAAA,OAAA,CAAQ,aAAa,EAAE,aAAA,EAAe,MAAM,CAAA;AAErE,IAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,MAAA,MAAM,QAAA,GAAgBC,MAAA,CAAA,IAAA,CAAK,WAAA,EAAa,KAAA,CAAM,IAAI,CAAA;AAElD,MAAA,IAAI,KAAA,CAAM,aAAY,EAAG;AAEvB,QAAA,IAAI,CAAC,MAAM,IAAA,CAAK,UAAA,CAAW,GAAG,CAAA,IAAK,KAAA,CAAM,SAAS,cAAA,EAAgB;AAChE,UAAA,MAAM,cAAc,QAAQ,CAAA;AAAA,QAC9B;AAAA,MACF,CAAA,MAAA,IAAW,KAAA,CAAM,MAAA,EAAO,EAAG;AAEzB,QAAA,IAAI,KAAA,CAAM,KAAK,QAAA,CAAS,KAAK,KAAK,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,WAAW,CAAA,EAAG;AAClE,UAAA,MAAM,KAAA,GAAQ,MAASD,GAAA,CAAA,IAAA,CAAK,QAAQ,CAAA;AACpC,UAAA,SAAA,CAAU,IAAA,CAAK;AAAA,YACb,IAAA,EAAM,QAAA;AAAA,YACN,MAAM,KAAA,CAAM,IAAA;AAAA,YACZ,MAAM,KAAA,CAAM;AAAA,WACb,CAAA;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,EAAA,MAAM,cAAc,OAAO,CAAA;AAC3B,EAAA,OAAO,SAAA;AACT;AAKA,eAAsB,kBAAA,CAAmB,WAAmB,SAAA,EAAkD;AAE5G,EAAA,MAAM,aAAa,SAAA,CAAU,IAAA;AAAA,IAAK,OAChC,CAAA,CAAE,IAAA,CAAK,SAAS,UAAU,CAAA,IAAK,EAAE,IAAA,KAAS;AAAA,GAC5C;AACA,EAAA,IAAI,UAAA,EAAY;AACd,IAAA,OAAO,UAAA;AAAA,EACT;AAGA,EAAA,MAAM,WAAA,GAAc,UAAU,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,IAAA,CAAK,QAAA,CAAS,WAAW,CAAC,CAAA;AACpE,EAAA,IAAI,WAAA,EAAa;AACf,IAAA,OAAO,UAAA;AAAA,EACT;AAGA,EAAA,OAAO,SAAA;AACT;AAKA,eAAe,WAAA,CACb,SAAA,EACA,SAAA,EACA,MAAA,EACA,QACA,OAAA,EACe;AACf,EAAA,MAAM,WAAgBC,MAAA,CAAA,IAAA,CAAK,OAAA,CAAQ,KAAI,EAAG,MAAA,CAAO,YAAY,OAAO,CAAA;AACpE,EAAA,MAAM,SAAA,GAAY,KAAK,GAAA,EAAI;AAE3B,EAAA,OAAA,CAAQ,GAAA,CAAI,QAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA;AAC1B,EAAA,OAAA,CAAQ,IAAI,gDAAyC,CAAA;AACrD,EAAA,OAAA,CAAQ,GAAA,CAAI,QAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA;AAC1B,EAAA,OAAA,CAAQ,GAAA,EAAI;AAEZ,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,OAAA,CAAQ,IAAI,kEAAwD,CAAA;AAAA,EACtE;AAGA,EAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACnB,IAAA,MAASD,GAAA,CAAA,KAAA,CAAM,QAAA,EAAU,EAAE,SAAA,EAAW,MAAM,CAAA;AAAA,EAC9C;AAEA,EAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,EAAA,IAAI,YAAA,GAAe,CAAA;AAGnB,EAAA,IAAI,OAAA,GAAU,CAAA;AACd,EAAA,IAAI;AACF,IAAA,MAAM,aAAA,GAAgB,MAASA,GAAA,CAAA,OAAA,CAAQ,QAAQ,CAAA;AAC/C,IAAA,MAAM,UAAA,GAAa,aAAA,CAChB,GAAA,CAAI,CAAA,IAAA,KAAQ;AACX,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,SAAS,CAAA;AAClC,MAAA,OAAO,QAAQ,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA,EAAG,EAAE,CAAA,GAAI,CAAA;AAAA,IAC1C,CAAC,CAAA,CACA,MAAA,CAAO,CAAA,CAAA,KAAK,IAAI,CAAC,CAAA;AACpB,IAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,MAAA,OAAA,GAAU,IAAA,CAAK,GAAA,CAAI,GAAG,UAAU,CAAA,GAAI,CAAA;AAAA,IACtC;AAAA,EACF,CAAA,CAAA,MAAQ;AAAA,EAER;AAGA,EAAA,IAAI,WAAW,UAAA,EAAY;AAEzB,IAAA,OAAA,CAAQ,IAAI,+CAA+C,CAAA;AAG3D,IAAA,MAAM,cAAc,SAAA,CAAU,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,SAAS,CAAA;AAE9D,IAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,MAAA,MAAM,SAAA,GAAiBC,MAAA,CAAA,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AACvC,MAAA,MAAM,OAAA,GAAeA,gBAAS,SAAS,CAAA;AAGvC,MAAA,MAAM,MAAA,GAAS,SAAA,CAAU,IAAA,CAAK,OAAO,CAAA;AACrC,MAAA,MAAM,aAAA,GAAgB,MAAA,GAAS,OAAA,GAAU,CAAA,EAAG,MAAA,CAAO,OAAO,CAAA,CAAE,QAAA,CAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,EAAI,OAAO,CAAA,CAAA;AACvF,MAAA,MAAM,SAAA,GAAiBA,MAAA,CAAA,IAAA,CAAK,QAAA,EAAU,aAAa,CAAA;AAEnD,MAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AAEnB,QAAA,MAAMC,cAAAA,CAAc,WAAW,SAAS,CAAA;AAGxC,QAAA,MAAM,OAAA,GAAeD,MAAA,CAAA,IAAA,CAAK,SAAA,EAAW,SAAS,CAAA;AAC9C,QAAA,MAAM,OAAA,GAAeA,MAAA,CAAA,IAAA,CAAK,SAAA,EAAW,WAAW,CAAA;AAChD,QAAA,IAAI;AACF,UAAA,MAASD,GAAA,CAAA,MAAA,CAAO,SAAS,OAAO,CAAA;AAAA,QAClC,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAEA,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,wBAAA,EAAsB,OAAO,CAAA,QAAA,EAAM,aAAa,CAAA,CAAA,CAAG,CAAA;AAC/D,MAAA,aAAA,EAAA;AACA,MAAA,IAAI,CAAC,MAAA,EAAQ,OAAA,EAAA;AAAA,IACf;AAAA,EACF,CAAA,MAAA,IAAW,WAAW,UAAA,EAAY;AAEhC,IAAA,OAAA,CAAQ,IAAI,+CAA+C,CAAA;AAG3D,IAAA,MAAM,OAAA,uBAAc,GAAA,EAA4B;AAChD,IAAA,KAAA,MAAW,OAAO,SAAA,EAAW;AAC3B,MAAA,MAAM,SAAA,GAAiBC,MAAA,CAAA,OAAA,CAAQ,GAAA,CAAI,IAAI,CAAA;AACvC,MAAA,MAAM,UAAA,GAAkBA,gBAAS,SAAS,CAAA;AAC1C,MAAA,IAAI,CAAC,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA,EAAG;AAC5B,QAAA,OAAA,CAAQ,GAAA,CAAI,UAAA,EAAY,EAAE,CAAA;AAAA,MAC5B;AACA,MAAA,OAAA,CAAQ,GAAA,CAAI,UAAU,CAAA,CAAG,IAAA,CAAK,GAAG,CAAA;AAAA,IACnC;AAEA,IAAA,KAAA,MAAW,CAAC,UAAA,EAAY,IAAI,CAAA,IAAK,OAAA,EAAS;AAExC,MAAA,IAAI,CAAC,SAAS,SAAA,EAAW,SAAA,EAAW,UAAU,CAAA,CAAE,QAAA,CAAS,UAAU,CAAA,EAAG;AACpE,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,aAAA,GAAgB,CAAA,EAAG,MAAA,CAAO,OAAO,CAAA,CAAE,SAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,EAAI,UAAU,CAAA,CAAA;AACvE,MAAA,MAAM,SAAA,GAAiBA,MAAA,CAAA,IAAA,CAAK,QAAA,EAAU,aAAa,CAAA;AAEnD,MAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACnB,QAAA,MAASD,GAAA,CAAA,KAAA,CAAM,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAE7C,QAAA,KAAA,MAAW,OAAO,IAAA,EAAM;AACtB,UAAA,MAAM,UAAA,GAAa,GAAA,CAAI,IAAA,KAAS,SAAA,GAAY,cAAc,GAAA,CAAI,IAAA;AAC9D,UAAA,MAAM,UAAA,GAAkBC,MAAA,CAAA,IAAA,CAAK,SAAA,EAAW,UAAU,CAAA;AAClD,UAAA,MAASD,GAAA,CAAA,QAAA,CAAS,GAAA,CAAI,IAAA,EAAM,UAAU,CAAA;AAAA,QACxC;AAAA,MACF;AAEA,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,wBAAA,EAAsB,UAAU,CAAA,QAAA,EAAM,aAAa,CAAA,CAAA,CAAG,CAAA;AAClE,MAAA,aAAA,EAAA;AACA,MAAA,OAAA,EAAA;AAAA,IACF;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,OAAA,CAAQ,IAAI,sDAAsD,CAAA;AAElE,IAAA,KAAA,MAAW,OAAO,SAAA,EAAW;AAE3B,MAAA,MAAM,QAAA,GAAgBC,MAAA,CAAA,QAAA,CAAS,GAAA,CAAI,IAAA,EAAWA,MAAA,CAAA,OAAA,CAAQ,IAAI,IAAI,CAAC,CAAA,CAC5D,OAAA,CAAQ,OAAA,EAAS,EAAE,EACnB,OAAA,CAAQ,QAAA,EAAU,EAAE,CAAA,CACpB,WAAA,EAAY,CACZ,OAAA,CAAQ,aAAA,EAAe,GAAG,CAAA,CAC1B,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AAEpB,MAAA,IAAI,CAAC,QAAA,EAAU;AACb,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,iCAAA,EAA+B,GAAA,CAAI,IAAI,CAAA,eAAA,CAAiB,CAAA;AACpE,QAAA,YAAA,EAAA;AACA,QAAA;AAAA,MACF;AAEA,MAAA,MAAM,aAAA,GAAgB,CAAA,EAAG,MAAA,CAAO,OAAO,CAAA,CAAE,SAAS,CAAA,EAAG,GAAG,CAAC,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA;AACrE,MAAA,MAAM,SAAA,GAAiBA,MAAA,CAAA,IAAA,CAAK,QAAA,EAAU,aAAa,CAAA;AACnD,MAAA,MAAM,UAAA,GAAkBA,MAAA,CAAA,IAAA,CAAK,SAAA,EAAW,WAAW,CAAA;AAEnD,MAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACnB,QAAA,MAASD,GAAA,CAAA,KAAA,CAAM,SAAA,EAAW,EAAE,SAAA,EAAW,MAAM,CAAA;AAC7C,QAAA,MAASA,GAAA,CAAA,QAAA,CAAS,GAAA,CAAI,IAAA,EAAM,UAAU,CAAA;AAAA,MACxC;AAEA,MAAA,OAAA,CAAQ,IAAI,CAAA,wBAAA,EAAsB,GAAA,CAAI,IAAI,CAAA,QAAA,EAAM,aAAa,CAAA,UAAA,CAAY,CAAA;AACzE,MAAA,aAAA,EAAA;AACA,MAAA,OAAA,EAAA;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAA,CAAQ,GAAA,EAAI;AAGZ,EAAA,IAAA,CAAK,QAAQ,QAAA,IAAY,OAAA,CAAQ,IAAA,KAAS,CAAC,QAAQ,MAAA,EAAQ;AACzD,IAAA,OAAA,CAAQ,IAAI,oCAAoC,CAAA;AAChD,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,eAAA,EAAAG,gBAAAA,EAAgB,GAAI,MAAM,OAAO,wBAAe,CAAA;AAExD,MAAA,MAAM,MAAMA,gBAAAA,EAAgB;AAC5B,MAAA,MAAM,GAAA,CAAI,UAAA,CAAW,CAAC,MAAA,EAAQ,WAAA,EAAa,OAAA,EAAS,YAAY,CAAA,EAAG,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAA;AACnF,MAAA,OAAA,CAAQ,IAAI,2CAAsC,CAAA;AAAA,IACpD,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,IAAI,iFAA4E,CAAA;AAAA,IAC1F;AAAA,EACF;AAGA,EAAA,IAAI,CAAC,OAAA,CAAQ,cAAA,IAAkB,CAAC,QAAQ,MAAA,EAAQ;AAC9C,IAAA,OAAA,CAAQ,IAAI,8BAA8B,CAAA;AAC1C,IAAA,IAAI;AACF,MAAA,MAAM,EAAE,aAAA,EAAAC,cAAAA,EAAc,GAAI,MAAM,OAAO,wBAAe,CAAA;AACtD,MAAA,MAAMA,cAAAA,CAAc,EAAE,CAAA;AACtB,MAAA,OAAA,CAAQ,IAAI,6CAAwC,CAAA;AAAA,IACtD,CAAA,CAAA,MAAQ;AACN,MAAA,OAAA,CAAQ,IAAI,wEAAmE,CAAA;AAAA,IACjF;AAAA,EACF;AAEA,EAAA,MAAM,YAAY,IAAA,CAAK,GAAA,KAAQ,SAAA,IAAa,GAAA,EAAM,QAAQ,CAAC,CAAA;AAE3D,EAAA,OAAA,CAAQ,GAAA,CAAI,QAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA;AAC1B,EAAA,OAAA,CAAQ,IAAI,CAAA,yCAAA,CAAsC,CAAA;AAClD,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,YAAA,EAAe,aAAa,CAAA,MAAA,CAAQ,CAAA;AAChD,EAAA,IAAI,eAAe,CAAA,EAAG;AACpB,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,WAAA,EAAc,YAAY,CAAA,MAAA,CAAQ,CAAA;AAAA,EAChD;AACA,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,QAAA,EAAW,OAAO,CAAA,CAAA,CAAG,CAAA;AACjC,EAAA,OAAA,CAAQ,GAAA,CAAI,QAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA;AAC1B,EAAA,OAAA,CAAQ,GAAA,EAAI;AACZ,EAAA,OAAA,CAAQ,IAAI,aAAa,CAAA;AACzB,EAAA,OAAA,CAAQ,IAAI,0CAA0C,CAAA;AACtD,EAAA,OAAA,CAAQ,IAAI,2CAA2C,CAAA;AACzD;AAKA,eAAeF,cAAAA,CAAc,KAAa,IAAA,EAA6B;AACrE,EAAA,MAASF,GAAA,CAAA,KAAA,CAAM,IAAA,EAAM,EAAE,SAAA,EAAW,MAAM,CAAA;AACxC,EAAA,MAAM,UAAU,MAASA,GAAA,CAAA,OAAA,CAAQ,KAAK,EAAE,aAAA,EAAe,MAAM,CAAA;AAE7D,EAAA,KAAA,MAAW,SAAS,OAAA,EAAS;AAC3B,IAAA,MAAM,OAAA,GAAeC,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,KAAA,CAAM,IAAI,CAAA;AACzC,IAAA,MAAM,QAAA,GAAgBA,MAAA,CAAA,IAAA,CAAK,IAAA,EAAM,KAAA,CAAM,IAAI,CAAA;AAE3C,IAAA,IAAI,KAAA,CAAM,aAAY,EAAG;AACvB,MAAA,MAAMC,cAAAA,CAAc,SAAS,QAAQ,CAAA;AAAA,IACvC,CAAA,MAAO;AACL,MAAA,MAASF,GAAA,CAAA,QAAA,CAAS,SAAS,QAAQ,CAAA;AAAA,IACrC;AAAA,EACF;AACF;AAKA,eAAe,wBAAA,CACb,SAAA,EACA,SAAA,EACA,MAAA,EACA,MAAA,EACe;AACf,EAAiB,OAAO,QAAA,IAAY;AAEpC,EAAA,OAAA,CAAQ,GAAA,CAAI,QAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA;AAC1B,EAAA,OAAA,CAAQ,IAAI,iEAA0D,CAAA;AACtE,EAAA,OAAA,CAAQ,GAAA,CAAI,QAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA;AAC1B,EAAA,OAAA,CAAQ,GAAA,EAAI;AACZ,EAAA,OAAA,CAAQ,IAAI,gCAAgC,CAAA;AAC5C,EAAA,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAK,SAAS,CAAA,EAAA,EAAK,SAAA,CAAU,MAAM,CAAA,iBAAA,CAAmB,CAAA;AAClE,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,mBAAA,EAAsB,MAAM,CAAA,CAAE,CAAA;AAC1C,EAAA,OAAA,CAAQ,GAAA,EAAI;AACZ,EAAA,OAAA,CAAQ,IAAI,uCAAgC,CAAA;AAC5C,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,4BAAA,EAA+B,SAAS,CAAA,cAAA,CAAgB,CAAA;AACpE,EAAA,OAAA,CAAQ,IAAI,iEAAiE,CAAA;AAC7E,EAAA,OAAA,CAAQ,GAAA,EAAI;AACZ,EAAA,OAAA,CAAQ,IAAI,iCAAiC,CAAA;AAC7C,EAAA,OAAA,CAAQ,IAAI,2EAA2E,CAAA;AACvF,EAAA,OAAA,CAAQ,GAAA,EAAI;AACZ,EAAA,OAAA,CAAQ,GAAA,CAAI,QAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA;AAC1B,EAAA,OAAA,CAAQ,GAAA,EAAI;AACZ,EAAA,OAAA,CAAQ,IAAI,qEAAqE,CAAA;AACjF,EAAA,OAAA,CAAQ,GAAA,EAAI;AACZ,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,sBAAA,EAAyB,SAAS,CAAA,CAAE,CAAA;AAChD,EAAA,OAAA,CAAQ,GAAA,EAAI;AACZ,EAAA,OAAA,CAAQ,IAAI,0BAA0B,CAAA;AACtC,EAAA,OAAA,CAAQ,IAAI,0EAA0E,CAAA;AACtF,EAAA,OAAA,CAAQ,IAAI,gCAAgC,CAAA;AAC5C,EAAA,OAAA,CAAQ,IAAI,iBAAiB,CAAA;AAC7B,EAAA,OAAA,CAAQ,IAAI,gEAAgE,CAAA;AAC5E,EAAA,OAAA,CAAQ,IAAI,oBAAoB,CAAA;AAChC,EAAA,OAAA,CAAQ,IAAI,4BAA4B,CAAA;AACxC,EAAA,OAAA,CAAQ,IAAI,4BAA4B,CAAA;AACxC,EAAA,OAAA,CAAQ,IAAI,uCAAuC,CAAA;AACnD,EAAA,OAAA,CAAQ,GAAA,EAAI;AACZ,EAAA,OAAA,CAAQ,IAAI,qDAAqD,CAAA;AACjE,EAAA,OAAA,CAAQ,GAAA,EAAI;AACZ,EAAA,OAAA,CAAQ,IAAI,kBAAkB,CAAA;AAC9B,EAAA,OAAA,CAAQ,IAAI,4BAA4B,CAAA;AACxC,EAAA,OAAA,CAAQ,GAAA,EAAI;AACZ,EAAA,OAAA,CAAQ,IAAI,qDAAqD,CAAA;AACjE,EAAA,OAAA,CAAQ,IAAI,8CAA8C,CAAA;AAC1D,EAAA,OAAA,CAAQ,IAAI,kDAAkD,CAAA;AAC9D,EAAA,OAAA,CAAQ,IAAI,+CAA+C,CAAA;AAC3D,EAAA,OAAA,CAAQ,GAAA,EAAI;AACZ,EAAA,OAAA,CAAQ,IAAI,4CAA4C,CAAA;AACxD,EAAA,OAAA,CAAQ,IAAI,mDAAmD,CAAA;AAC/D,EAAA,OAAA,CAAQ,IAAI,gDAAgD,CAAA;AAC5D,EAAA,OAAA,CAAQ,IAAI,iDAAiD,CAAA;AAC7D,EAAA,OAAA,CAAQ,IAAI,mDAAmD,CAAA;AAC/D,EAAA,OAAA,CAAQ,IAAI,kDAAkD,CAAA;AAC9D,EAAA,OAAA,CAAQ,IAAI,4DAA4D,CAAA;AACxE,EAAA,OAAA,CAAQ,GAAA,EAAI;AACZ,EAAA,OAAA,CAAQ,IAAI,0BAA0B,CAAA;AACtC,EAAA,OAAA,CAAQ,GAAA,EAAI;AACZ,EAAA,OAAA,CAAQ,IAAI,2CAA2C,CAAA;AACvD,EAAA,OAAA,CAAQ,IAAI,2CAA2C,CAAA;AACvD,EAAA,OAAA,CAAQ,GAAA,EAAI;AACZ,EAAA,OAAA,CAAQ,IAAI,gCAAgC,CAAA;AAC5C,EAAA,OAAA,CAAQ,IAAI,2CAA2C,CAAA;AACvD,EAAA,OAAA,CAAQ,IAAI,+CAA+C,CAAA;AAC3D,EAAA,OAAA,CAAQ,IAAI,sEAAsE,CAAA;AAClF,EAAA,OAAA,CAAQ,IAAI,+DAA+D,CAAA;AAC3E,EAAA,OAAA,CAAQ,IAAI,gDAAgD,CAAA;AAC5D,EAAA,OAAA,CAAQ,GAAA,EAAI;AACZ,EAAA,OAAA,CAAQ,GAAA,CAAI,QAAA,CAAI,MAAA,CAAO,EAAE,CAAC,CAAA;AAC1B,EAAA,OAAA,CAAQ,GAAA,EAAI;AACZ,EAAA,OAAA,CAAQ,IAAI,2EAAsE,CAAA;AAClF,EAAA,OAAA,CAAQ,IAAI,2DAA2D,CAAA;AACvE,EAAA,OAAA,CAAQ,GAAA,EAAI;AACd;AAKA,eAAe,aAAA,CACb,SAAA,EACA,SAAA,EACA,OAAA,EACe;AACf,EAAA,MAAM,WAAW,OAAA,CAAQ,UAAA;AAEzB,EAAA,OAAA,CAAQ,GAAA,CAAI,mDAA4C,QAAQ;AAAA,CAAI,CAAA;AAGpE,EAAA,MAAM,IAAA,GAAO,MAAM,YAAA,CAAa,QAAQ,CAAA;AAExC,EAAA,IAAI,CAAC,KAAK,SAAA,EAAW;AACnB,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,eAAA,EAAa,IAAA,CAAK,IAAI,CAAA,qBAAA,CAAuB,CAAA;AAC3D,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,YAAA,EAAe,IAAA,CAAK,UAAU,CAAA,CAAE,CAAA;AAC9C,IAAA,OAAA,CAAQ,MAAM,uDAAuD,CAAA;AACrE,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAEA,EAAA,IAAI,CAAC,KAAK,UAAA,EAAY;AACpB,IAAA,OAAA,CAAQ,MAAM,CAAA,eAAA,EAAa,IAAA,CAAK,IAAI,CAAA,SAAA,EAAY,IAAA,CAAK,OAAO,CAAA,eAAA,CAAiB,CAAA;AAC7E,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,eAAA,EAAkB,IAAA,CAAK,UAAU,CAAA,CAAE,CAAA;AACjD,IAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,WAAA,EAAc,IAAA,CAAK,SAAS,CAAA,CAAE,CAAA;AAC5C,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AAEA,EAAA,OAAA,CAAQ,IAAI,CAAA,sBAAA,EAAoB,IAAA,CAAK,IAAI,CAAA,gBAAA,EAAmB,KAAK,OAAO,CAAA;AAAA,CAAK,CAAA;AAG7E,EAAA,OAAA,CAAQ,IAAI,0EAAqE,CAAA;AACjF,EAAA,OAAA,CAAQ,IAAI,uEAAuE,CAAA;AACnF,EAAA,OAAA,CAAQ,GAAA,EAAI;AACZ,EAAA,OAAA,CAAQ,IAAI,iFAAiF,CAAA;AAC7F,EAAA,OAAA,CAAQ,GAAA,EAAI;AACd;AAoBA,eAAe,aAAa,QAAA,EAA+D;AACzF,EAAA,MAAM,KAAA,GAAiF;AAAA,IACrF,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,oBAAA;AAAA,MACN,UAAA,EAAY,oBAAA;AAAA,MACZ,UAAA,EAAY,+CAAA;AAAA,MACZ,SAAA,EAAW,8CAAA;AAAA,MACX,UAAA,EAAY,8BAAA;AAAA,MACZ,UAAA,EAAY;AAAA,KACd;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,YAAA;AAAA,MACN,UAAA,EAAY,QAAA;AAAA,MACZ,UAAA,EAAY,wBAAA;AAAA,MACZ,SAAA,EAAW,kCAAA;AAAA,MACX,UAAA,EAAY,kBAAA;AAAA,MACZ,UAAA,EAAY;AAAA,KACd;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,YAAA;AAAA,MACN,UAAA,EAAY,YAAA;AAAA,MACZ,UAAA,EAAY,mCAAA;AAAA,MACZ,SAAA,EAAW,kCAAA;AAAA,MACX,UAAA,EAAY,sBAAA;AAAA,MACZ,UAAA,EAAY;AAAA;AACd,GACF;AAEA,EAAA,MAAM,OAAA,GAAU,MAAM,QAAQ,CAAA;AAG9B,EAAA,IAAI,SAAA,GAAY,KAAA;AAChB,EAAA,IAAI,OAAA;AAEJ,EAAA,IAAI;AACF,IAAA,MAAM,EAAE,QAAA,EAAAZ,SAAAA,EAAS,GAAI,MAAM,OAAO,eAAoB,CAAA;AAEtD,IAAAA,SAAAA,CAAS,SAAS,OAAA,CAAQ,UAAU,IAAI,EAAE,KAAA,EAAO,UAAU,CAAA;AAC3D,IAAA,SAAA,GAAY,IAAA;AAGZ,IAAA,IAAI;AACF,MAAA,MAAM,aAAA,GAAgBA,SAAAA,CAAS,OAAA,CAAQ,UAAA,EAAY;AAAA,QACjD,QAAA,EAAU,OAAA;AAAA,QACV,KAAA,EAAO,CAAC,QAAA,EAAU,MAAA,EAAQ,QAAQ;AAAA,OACnC,CAAA;AACD,MAAA,MAAM,YAAA,GAAe,aAAA,CAAc,KAAA,CAAM,iBAAiB,CAAA;AAC1D,MAAA,IAAI,YAAA,EAAc;AAChB,QAAA,OAAA,GAAU,aAAa,CAAC,CAAA;AAAA,MAC1B;AAAA,IACF,CAAA,CAAA,MAAQ;AAEN,MAAA,OAAA,GAAU,SAAA;AAAA,IACZ;AAAA,EACF,CAAA,CAAA,MAAQ;AAEN,IAAA,SAAA,GAAY,KAAA;AAAA,EACd;AAGA,EAAA,MAAM,UAAA,GAAa,cAAc,OAAA,KAAY,SAAA,IAAc,YAAY,MAAA,IAAa,gBAAA,CAAiB,OAAA,EAAS,OAAA,CAAQ,UAAU,CAAA,CAAA;AAEhI,EAAA,OAAO;AAAA,IACL,GAAG,OAAA;AAAA,IACH,SAAA;AAAA,IACA,OAAA;AAAA,IACA;AAAA,GACF;AACF;AAKA,SAAS,gBAAA,CAAiB,SAAiB,UAAA,EAA6B;AACtE,EAAA,MAAM,SAAS,OAAA,CAAQ,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,MAAM,CAAA;AAC5C,EAAA,MAAM,WAAW,UAAA,CAAW,KAAA,CAAM,GAAG,CAAA,CAAE,IAAI,MAAM,CAAA;AAEjD,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,CAAA,EAAG,CAAA,EAAA,EAAK;AAC1B,IAAA,MAAM,CAAA,GAAI,MAAA,CAAO,CAAC,CAAA,IAAK,CAAA;AACvB,IAAA,MAAM,GAAA,GAAM,QAAA,CAAS,CAAC,CAAA,IAAK,CAAA;AAE3B,IAAA,IAAI,CAAA,GAAI,KAAK,OAAO,IAAA;AACpB,IAAA,IAAI,CAAA,GAAI,KAAK,OAAO,KAAA;AAAA,EACtB;AAEA,EAAA,OAAO,IAAA;AACT;ACjlBA,SAAS,kBAAkB,IAAA,EAAyB;AAClD,EAAA,IAAI,KAAK,WAAA,CAAY,MAAA,KAAW,cAAc,IAAA,CAAK,WAAA,CAAY,WAAW,UAAA,EAAY;AACpF,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,CAAC,IAAA,CAAK,WAAA,CAAY,GAAA,EAAK;AACzB,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAA,GAAYiB,OAAM,IAAA,CAAK,WAAA,CAAY,GAAG,CAAA,CAAE,QAAA,CAASA,MAAA,EAAM,EAAG,KAAK,CAAA;AACrE,EAAA,MAAM,aAAa,IAAA,CAAK,WAAA,CAAY,aAAa,UAAA,IAAc,IAAA,CAAK,YAAY,QAAA,KAAa,MAAA;AAE7F,EAAA,OAAO,SAAA,IAAa,UAAA;AACtB;AAKA,SAAS,cAAc,IAAA,EAAyB;AAC9C,EAAA,IAAI,IAAA,CAAK,WAAA,CAAY,MAAA,KAAW,aAAA,EAAe;AAC7C,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,WAAA,CAAY,OAAA,IAAW,IAAA,CAAK,WAAA,CAAY,UAAA,IAAc,IAAA,CAAK,WAAA,CAAY,OAAA,IAAW,IAAA,CAAK,WAAA,CAAY,UAAA;AAE1H,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,MAAM,kBAAkBA,MAAA,EAAM,CAAE,KAAKA,MAAA,CAAM,SAAS,GAAG,KAAK,CAAA;AAC5D,EAAA,OAAO,eAAA,GAAkB,CAAA;AAC3B;AAMO,SAAS,oBAAoB,KAAA,EAAsC;AACxE,EAAA,MAAM,iBAA2B,EAAC;AAClC,EAAA,MAAM,WAAqB,EAAC;AAI5B,EAAA,MAAM,yBAAyB,KAAA,CAAM,MAAA;AAAA,IAAO,CAAA,CAAA,KAC1C,EAAE,WAAA,CAAY,MAAA,KAAW,cACzB,CAAC,CAAA,CAAE,IAAA,CAAK,UAAA,CAAW,WAAW;AAAA,GAChC;AAEA,EAAA,KAAA,MAAW,QAAQ,sBAAA,EAAwB;AAEzC,IAAA,IAAI,iBAAA,CAAkB,IAAI,CAAA,EAAG;AAC3B,MAAA,cAAA,CAAe,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,IAC/B;AAGA,IAAA,IAAI,aAAA,CAAc,IAAI,CAAA,EAAG;AACvB,MAAA,QAAA,CAAS,IAAA,CAAK,KAAK,IAAI,CAAA;AAAA,IACzB;AAAA,EACF;AAGA,EAAA,MAAM,cAAc,KAAA,CAAM,MAAA;AAAA,IACxB,CAAA,CAAA,KAAA,CAAM,CAAA,CAAE,WAAA,CAAY,MAAA,KAAW,SAAA,IAAa,CAAA,CAAE,WAAA,CAAY,MAAA,KAAW,aAAA,KAChE,CAAC,CAAA,CAAE,IAAA,CAAK,WAAW,WAAW;AAAA,GACrC;AACA,EAAA,MAAM,gBAAgB,KAAA,CAAM,MAAA;AAAA,IAAO,CAAA,CAAA,KACjC,EAAE,WAAA,CAAY,MAAA,KAAW,cACzB,CAAC,CAAA,CAAE,IAAA,CAAK,UAAA,CAAW,WAAW;AAAA,GAChC;AAGA,EAAA,MAAM,aAAa,sBAAA,CAAuB,MAAA;AAC1C,EAAA,MAAM,KAAA,GAAQ,aAAa,CAAA,GAAI,IAAA,CAAK,MAAO,aAAA,CAAc,MAAA,GAAS,UAAA,GAAc,GAAG,CAAA,GAAI,CAAA;AAEvF,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,UAAA;AAAA,IACA,aAAa,WAAA,CAAY,MAAA;AAAA,IACzB,eAAe,aAAA,CAAc,MAAA;AAAA,IAC7B,cAAA;AAAA,IACA;AAAA,GACF;AACF;AAKO,SAAS,oBAAoB,KAAA,EAAgE;AAClG,EAAA,IAAI,SAAS,EAAA,EAAI;AACf,IAAA,OAAO,EAAE,KAAA,EAAO,QAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,OAAO,OAAA,EAAQ;AAAA,EACrD,CAAA,MAAA,IAAW,SAAS,EAAA,EAAI;AACtB,IAAA,OAAO,EAAE,KAAA,EAAO,QAAA,EAAK,KAAA,EAAO,MAAA,EAAQ,OAAO,QAAA,EAAS;AAAA,EACtD,CAAA,MAAO;AACL,IAAA,OAAO,EAAE,KAAA,EAAO,QAAA,EAAK,KAAA,EAAO,iBAAA,EAAmB,OAAO,KAAA,EAAM;AAAA,EAC9D;AACF;AChFO,SAAS,mBAAmB,IAAA,EAA+B;AAChE,EAAA,IAAI,KAAK,WAAA,CAAY,MAAA,KAAW,cAAc,IAAA,CAAK,WAAA,CAAY,WAAW,UAAA,EAAY;AACpF,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,WAAA,CAAY,UAAA,IAAc,KAAK,WAAA,CAAY,OAAA;AAClE,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,WAAA,CAAY,YAAA,IAAgB,KAAK,WAAA,CAAY,SAAA;AAEtE,EAAA,IAAI,CAAC,SAAA,IAAa,CAAC,WAAA,EAAa;AAC9B,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,GAAUA,OAAM,SAAS,CAAA;AAC/B,EAAA,MAAM,SAAA,GAAYA,OAAM,WAAW,CAAA;AAEnC,EAAA,OAAO,SAAA,CAAU,IAAA,CAAK,OAAA,EAAS,KAAA,EAAO,IAAI,CAAA;AAC5C;AAKO,SAAS,iBAAA,CACd,IAAA,EACA,UAAA,EACA,QAAA,EACe;AACf,EAAA,MAAM,WAAA,GAAc,KAAK,WAAA,CAAY,WAAA;AACrC,EAAA,IAAI,CAAC,WAAA,IAAe,CAAC,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC/C,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,iBAAiB,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,UAAU,CAAA;AACtE,EAAA,MAAM,eAAe,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,WAAW,QAAQ,CAAA;AAElE,EAAA,IAAI,CAAC,cAAA,IAAkB,CAAC,YAAA,EAAc;AACpC,IAAA,OAAO,IAAA;AAAA,EACT;AAEA,EAAA,MAAM,IAAA,GAAOA,MAAAA,CAAM,cAAA,CAAe,EAAE,CAAA;AACpC,EAAA,MAAM,EAAA,GAAKA,MAAAA,CAAM,YAAA,CAAa,EAAE,CAAA;AAEhC,EAAA,OAAO,EAAA,CAAG,IAAA,CAAK,IAAA,EAAM,KAAA,EAAO,IAAI,CAAA;AAClC;AAKO,SAAS,mBAAA,CAAoB,OAAmB,IAAA,EAAsB;AAC3E,EAAA,MAAM,MAAA,GAASA,MAAAA,EAAM,CAAE,QAAA,CAAS,MAAM,KAAK,CAAA;AAE3C,EAAA,OAAO,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM;AACzB,IAAA,IAAI,EAAE,WAAA,CAAY,MAAA,KAAW,cAAc,CAAA,CAAE,WAAA,CAAY,WAAW,UAAA,EAAY;AAC9E,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,WAAA,GAAc,CAAA,CAAE,WAAA,CAAY,YAAA,IAAgB,EAAE,WAAA,CAAY,SAAA;AAChE,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAOA,MAAAA,CAAM,WAAW,CAAA,CAAE,OAAA,CAAQ,MAAM,CAAA;AAAA,EAC1C,CAAC,CAAA,CAAE,MAAA;AACL;AAKO,SAAS,YAAA,CAAa,KAAA,EAAmB,IAAA,GAAoBA,MAAAA,EAAM,EAAW;AACnF,EAAA,OAAO,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM;AACzB,IAAA,MAAM,SAAA,GAAY,CAAA,CAAE,WAAA,CAAY,UAAA,IAAc,EAAE,WAAA,CAAY,OAAA;AAC5D,IAAA,MAAM,OAAA,GAAUA,OAAM,SAAS,CAAA;AAG/B,IAAA,IAAI,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAA,EAAG;AACzB,MAAA,OAAO,KAAA;AAAA,IACT;AAGA,IAAA,MAAM,WAAA,GAAc,CAAA,CAAE,WAAA,CAAY,YAAA,IAAgB,EAAE,WAAA,CAAY,SAAA;AAChE,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,SAAA,GAAYA,OAAM,WAAW,CAAA;AACnC,MAAA,OAAO,SAAA,CAAU,QAAQ,IAAI,CAAA;AAAA,IAC/B;AAGA,IAAA,OAAO,EAAE,WAAA,CAAY,MAAA,KAAW,UAAA,IAAc,CAAA,CAAE,YAAY,MAAA,KAAW,UAAA;AAAA,EACzE,CAAC,CAAA,CAAE,MAAA;AACL;AAKO,SAAS,yBAAyB,KAAA,EAAoC;AAE3E,EAAA,MAAM,UAAA,GAAa,MAChB,GAAA,CAAI,CAAC,MAAM,kBAAA,CAAmB,CAAC,CAAC,CAAA,CAChC,MAAA,CAAO,CAAC,CAAA,KAAmB,CAAA,KAAM,IAAI,CAAA,CACrC,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,IAAI,CAAC,CAAA;AAEvB,EAAA,MAAM,gBAAA,GAAmB,UAAA,CAAW,MAAA,GAAS,CAAA,GACzC,WAAW,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,EAAG,CAAC,CAAA,GAAI,WAAW,MAAA,GACvD,CAAA;AAEJ,EAAA,MAAM,eAAA,GAAkB,UAAA,CAAW,MAAA,GAAS,CAAA,GACxC,UAAA,CAAW,MAAA,GAAS,CAAA,KAAM,CAAA,GAAA,CACvB,UAAA,CAAW,UAAA,CAAW,MAAA,GAAS,CAAA,GAAI,CAAC,CAAA,GAAI,UAAA,CAAW,UAAA,CAAW,MAAA,GAAS,CAAC,CAAA,IAAK,CAAA,GAC9E,UAAA,CAAW,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,MAAA,GAAS,CAAC,CAAC,CAAA,GAC9C,CAAA;AAEJ,EAAA,MAAM,eAAe,UAAA,CAAW,MAAA,GAAS,CAAA,GACrC,UAAA,CAAW,KAAK,GAAA,CAAI,IAAA,CAAK,KAAA,CAAM,UAAA,CAAW,SAAS,GAAG,CAAA,EAAG,WAAW,MAAA,GAAS,CAAC,CAAC,CAAA,GAC/E,CAAA;AAGJ,EAAA,MAAM,wBAAA,GAA2B,KAAA,CAC9B,GAAA,CAAI,CAAC,MAAM,iBAAA,CAAkB,CAAA,EAAG,SAAA,EAAW,aAAa,CAAC,CAAA,CACzD,MAAA,CAAO,CAAC,CAAA,KAAmB,MAAM,IAAI,CAAA;AAExC,EAAA,MAAM,yBAAA,GAA4B,KAAA,CAC/B,GAAA,CAAI,CAAC,MAAM,iBAAA,CAAkB,CAAA,EAAG,aAAA,EAAe,UAAU,CAAC,CAAA,CAC1D,MAAA,CAAO,CAAC,CAAA,KAAmB,MAAM,IAAI,CAAA;AAExC,EAAA,MAAM,sBAAA,GAAyB,wBAAA,CAAyB,MAAA,GAAS,CAAA,GAC7D,yBAAyB,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,EAAG,CAAC,CAAA,GAAI,yBAAyB,MAAA,GACnF,CAAA;AAEJ,EAAA,MAAM,uBAAA,GAA0B,yBAAA,CAA0B,MAAA,GAAS,CAAA,GAC/D,0BAA0B,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,EAAG,CAAC,CAAA,GAAI,0BAA0B,MAAA,GACrF,CAAA;AAGJ,EAAA,MAAM,cAAA,GAAiB,mBAAA,CAAoB,KAAA,EAAO,CAAC,CAAA;AACnD,EAAA,MAAM,eAAA,GAAkB,mBAAA,CAAoB,KAAA,EAAO,EAAE,CAAA;AAGrD,EAAA,MAAM,aAAA,GAAgBA,MAAAA,EAAM,CAAE,QAAA,CAAS,IAAI,KAAK,CAAA;AAChD,EAAA,MAAM,WAAA,GAAcA,MAAAA,EAAM,CAAE,QAAA,CAAS,GAAG,KAAK,CAAA;AAC7C,EAAA,MAAM,kBAAA,GAAqB,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM;AAC7C,IAAA,MAAM,WAAA,GAAc,CAAA,CAAE,WAAA,CAAY,YAAA,IAAgB,EAAE,WAAA,CAAY,SAAA;AAChE,IAAA,IAAI,CAAC,aAAa,OAAO,KAAA;AACzB,IAAA,MAAM,SAAA,GAAYA,OAAM,WAAW,CAAA;AACnC,IAAA,OAAO,UAAU,OAAA,CAAQ,aAAa,KAAK,CAAC,SAAA,CAAU,QAAQ,WAAW,CAAA;AAAA,EAC3E,CAAC,CAAA,CAAE,MAAA;AAEH,EAAA,MAAM,kBACJ,cAAA,GAAiB,kBAAA,GAAqB,IAAA,GACtC,cAAA,GAAiB,qBAAqB,MAAA,GAAS,QAAA;AAGjD,EAAA,MAAM,UAAA,GAAa,aAAa,KAAK,CAAA;AAGrC,EAAA,MAAM,aAAuB,EAAC;AAC9B,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,EAAA,EAAI,CAAA,EAAA,EAAK;AAC3B,IAAA,MAAM,UAAA,GAAaA,MAAAA,EAAM,CAAE,QAAA,CAAS,GAAG,KAAK,CAAA;AAC5C,IAAA,UAAA,CAAW,IAAA,CAAK,YAAA,CAAa,KAAA,EAAO,UAAU,CAAC,CAAA;AAAA,EACjD;AACA,EAAA,MAAM,MAAA,GAAS,UAAA,CAAW,MAAA,GAAS,CAAA,GAC/B,WAAW,MAAA,CAAO,CAAC,GAAA,EAAK,CAAA,KAAM,GAAA,GAAM,CAAA,EAAG,CAAC,CAAA,GAAI,WAAW,MAAA,GACvD,CAAA;AAEJ,EAAA,OAAO;AAAA,IACL,SAAA,EAAW;AAAA,MACT,OAAA,EAAS,IAAA,CAAK,KAAA,CAAM,gBAAA,GAAmB,EAAE,CAAA,GAAI,EAAA;AAAA,MAC7C,MAAA,EAAQ,IAAA,CAAK,KAAA,CAAM,eAAA,GAAkB,EAAE,CAAA,GAAI,EAAA;AAAA,MAC3C,GAAA,EAAK,IAAA,CAAK,KAAA,CAAM,YAAA,GAAe,EAAE,CAAA,GAAI;AAAA,KACvC;AAAA,IACA,QAAA,EAAU;AAAA,MACR,mBAAA,EAAqB,IAAA,CAAK,KAAA,CAAM,sBAAA,GAAyB,EAAE,CAAA,GAAI,EAAA;AAAA,MAC/D,oBAAA,EAAsB,IAAA,CAAK,KAAA,CAAM,uBAAA,GAA0B,EAAE,CAAA,GAAI;AAAA,KACnE;AAAA,IACA,UAAA,EAAY;AAAA,MACV,OAAA,EAAS,cAAA;AAAA,MACT,QAAA,EAAU,eAAA;AAAA,MACV,KAAA,EAAO;AAAA,KACT;AAAA,IACA,GAAA,EAAK;AAAA,MACH,OAAA,EAAS,UAAA;AAAA,MACT,OAAA,EAAS,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,EAAE,CAAA,GAAI;AAAA;AACrC,GACF;AACF;;;ACpMO,SAAS,YAAA,GAAwB;AACtC,EAAA,OAAO,IAAIrC,OAAAA,CAAQ,OAAO,CAAA,CACvB,YAAY,8DAA8D,CAAA,CAC1E,MAAA,CAAO,YAAA,EAAc,0CAA0C,CAAA,CAC/D,MAAA,CAAO,UAAA,EAAY,uCAAuC,CAAA,CAC1D,MAAA,CAAO,mBAAA,EAAqB,0CAA0C,CAAA,CACtE,MAAA,CAAO,aAAA,EAAe,eAAe,EACrC,MAAA,CAAO,mBAAA,EAAqB,oBAAoB,CAAA,CAChD,OAAO,QAAA,EAAU,gBAAgB,CAAA,CACjC,MAAA,CAAO,OAAO,OAAA,KAOT;AACJ,IAAA,MAAM,UAAU,OAAO,CAAA;AAAA,EACzB,CAAC,CAAA;AACL;AAEA,eAAsB,UAAU,OAAA,EAOd;AAEhB,EAAA,MAAM,kBAAA,EAAmB;AAGzB,EAAA,MAAM,SAA4B,EAAC;AACnC,EAAA,IAAI,QAAQ,GAAA,EAAK;AACf,IAAA,MAAA,CAAO,IAAA,GAAO,CAAC,OAAA,CAAQ,GAAG,CAAA;AAAA,EAC5B;AACA,EAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,IAAA,MAAA,CAAO,WAAW,OAAA,CAAQ,QAAA;AAAA,EAC5B;AAGA,EAAA,MAAM,QAAQ,MAAM,WAAA;AAAA,IAClB,kBAAA;AAAA,IACA,MAAM,YAAA,CAAa;AAAA,MACjB,eAAA,EAAiB,IAAA;AAAA,MACjB;AAAA,KACD;AAAA,GACH;AAEA,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,EAAE,OAAA,EAAS,EAAC,EAAG,KAAA,EAAO,CAAA,EAAE,EAAG,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,IAChE,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,GAAA,CAAID,OAAAA,CAAM,GAAA,CAAI,iBAAiB,CAAC,CAAA;AAAA,IAC1C;AACA,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,OAAA,GAA0C;AAAA,IAC9C,SAAS,EAAC;AAAA,IACV,eAAe,EAAC;AAAA,IAChB,UAAU,EAAC;AAAA,IACX,UAAU;AAAC,GACb;AAEA,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AAExB,IAAA,MAAM,MAAA,GAAS,QAAQ,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA,KAAM,MAAA,GAChD,IAAA,CAAK,WAAA,CAAY,MAAA,GACjB,SAAA;AAGJ,IAAA,IAAI,WAAW,UAAA,EAAY;AACzB,MAAA,OAAA,CAAQ,MAAM,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAAA,IAC3B;AAAA,EACF;AAGA,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,MAAM,iBAAA,GAAoB,oBAAoB,KAAK,CAAA;AACnD,IAAA,MAAM,eAAA,GAAkB,yBAAyB,KAAK,CAAA;AAEtD,IAAA,MAAM,UAAA,GAAa;AAAA,MACjB,OAAA,EAAS;AAAA,QACP,OAAA,EAAS,QAAQ,OAAA,CAAQ,GAAA,CAAI,QAAM,EAAE,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,EAAE,WAAA,CAAY,QAAA,EAAU,UAAU,CAAA,CAAE,WAAA,CAAY,UAAU,IAAA,EAAM,CAAA,CAAE,WAAA,CAAY,IAAA,EAAK,CAAE,CAAA;AAAA,QAClJ,aAAA,EAAe,QAAQ,aAAa,CAAA,CAAE,IAAI,CAAA,CAAA,MAAM,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,QAAA,EAAU,EAAE,WAAA,CAAY,QAAA,EAAU,UAAU,CAAA,CAAE,WAAA,CAAY,UAAU,IAAA,EAAM,CAAA,CAAE,WAAA,CAAY,IAAA,EAAK,CAAE,CAAA;AAAA,QAC/J,QAAA,EAAU,QAAQ,QAAA,CAAS,GAAA,CAAI,QAAM,EAAE,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,EAAE,WAAA,CAAY,QAAA,EAAU,UAAU,CAAA,CAAE,WAAA,CAAY,UAAU,IAAA,EAAM,CAAA,CAAE,WAAA,CAAY,IAAA,EAAK,CAAE;AAAA,OACtJ;AAAA,MACA,OAAA,EAAS;AAAA,QACP,OAAO,iBAAA,CAAkB,UAAA;AAAA,QACzB,QAAQ,iBAAA,CAAkB,WAAA;AAAA,QAC1B,UAAU,iBAAA,CAAkB,aAAA;AAAA,QAC5B,gBAAgB,iBAAA,CAAkB,KAAA;AAAA,QAClC,QAAA,EAAU;AAAA,UACR,YAAA,EAAc,gBAAgB,SAAA,CAAU,OAAA;AAAA,UACxC,iBAAA,EAAmB,eAAA,CAAgB,UAAA,CAAW,OAAA,GAAU,CAAA,GAAI;AAAA;AAC9D;AACF,KACF;AACA,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,UAAA,EAAY,IAAA,EAAM,CAAC,CAAC,CAAA;AAC/C,IAAA;AAAA,EACF;AAGA,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,IAAA,CAAK,6BAAsB,CAAC,CAAA;AAGnD,EAAA,IAAI,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,QAAA,EAAU;AACnC,IAAA,MAAM,cAAwB,EAAC;AAC/B,IAAA,IAAI,QAAQ,GAAA,EAAK,WAAA,CAAY,KAAK,CAAA,IAAA,EAAO,OAAA,CAAQ,GAAG,CAAA,CAAE,CAAA;AACtD,IAAA,IAAI,QAAQ,QAAA,EAAU,WAAA,CAAY,KAAK,CAAA,SAAA,EAAY,OAAA,CAAQ,QAAQ,CAAA,CAAE,CAAA;AACrE,IAAA,OAAA,CAAQ,GAAA,CAAIA,QAAM,GAAA,CAAI,CAAA,aAAA,EAAgB,YAAY,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAC,CAAA;AAAA,EACjE;AACA,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,EAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACnB,IAAA,MAAM,iBAAA,GAAoB,oBAAoB,KAAK,CAAA;AACnD,IAAA,MAAM,eAAA,GAAkB,yBAAyB,KAAK,CAAA;AACtD,IAAyB,mBAAA,CAAoB,iBAAA,CAAkB,KAAK;AAGpE,IAAA,MAAM,QAAA,GAAW,EAAA;AACjB,IAAA,MAAM,YAAY,QAAA,GAAM,QAAA,CAAI,MAAA,CAAO,QAAA,GAAW,CAAC,CAAA,GAAI,QAAA;AACnD,IAAA,MAAM,eAAe,QAAA,GAAM,QAAA,CAAI,MAAA,CAAO,QAAA,GAAW,CAAC,CAAA,GAAI,QAAA;AAGtD,IAAA,MAAM,OAAA,GAAU,CAAC,OAAA,KAA4B;AAC3C,MAAA,MAAM,aAAA,GAAgB,SAAA,CAAU,OAAO,CAAA,CAAE,MAAA;AACzC,MAAA,MAAM,OAAA,GAAU,WAAW,CAAA,GAAI,aAAA;AAC/B,MAAA,OAAO,UAAU,GAAA,CAAI,MAAA,CAAO,KAAK,GAAA,CAAI,CAAA,EAAG,OAAO,CAAC,CAAA;AAAA,IAClD,CAAA;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,GAAA,CAAI,SAAS,CAAC,CAAA;AAEhC,IAAA,MAAM,UAAA,GAAaA,OAAAA,CAAM,IAAA,CAAK,oBAAoB,CAAA;AAClD,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,GAAA,CAAI,QAAG,CAAA,GAAI,OAAA,CAAQ,UAAU,CAAA,GAAIA,OAAAA,CAAM,GAAA,CAAI,QAAG,CAAC,CAAA;AAGjE,IAAA,MAAM,eAAA,GAAkB,iBAAA,CAAkB,KAAA,IAAS,EAAA,GAAKA,OAAAA,CAAM,KAAA,GACvC,iBAAA,CAAkB,KAAA,IAAS,EAAA,GAAKA,OAAAA,CAAM,MAAA,GACtCA,OAAAA,CAAM,GAAA;AAE7B,IAAA,MAAM,QAAQ,CAAA,EAAA,EAAK,iBAAA,CAAkB,UAAU,CAAA,YAAA,EAAY,kBAAkB,WAAW,CAAA,aAAA,EAAa,iBAAA,CAAkB,aAAa,aAAa,eAAA,CAAgB,GAAA,GAAM,iBAAA,CAAkB,KAAA,GAAQ,IAAI,CAAC,CAAA,CAAA;AACtM,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,GAAA,CAAI,QAAG,CAAA,GAAI,OAAA,CAAQ,KAAK,CAAA,GAAIA,OAAAA,CAAM,GAAA,CAAI,QAAG,CAAC,CAAA;AAG5D,IAAA,IAAI,kBAAkB,cAAA,CAAe,MAAA,GAAS,KAAK,iBAAA,CAAkB,QAAA,CAAS,SAAS,CAAA,EAAG;AACxF,MAAA,MAAM,SAAmB,EAAC;AAC1B,MAAA,IAAI,iBAAA,CAAkB,cAAA,CAAe,MAAA,GAAS,CAAA,EAAG;AAC/C,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,iBAAA,CAAkB,cAAA,CAAe,MAAM,CAAA,iBAAA,CAAmB,CAAA;AAAA,MAC3E;AACA,MAAA,IAAI,iBAAA,CAAkB,QAAA,CAAS,MAAA,GAAS,CAAA,EAAG;AACzC,QAAA,MAAA,CAAO,IAAA,CAAK,CAAA,EAAG,iBAAA,CAAkB,QAAA,CAAS,MAAM,CAAA,mBAAA,CAAqB,CAAA;AAAA,MACvE;AACA,MAAA,MAAM,SAAA,GAAY,KAAKA,OAAAA,CAAM,MAAA,CAAO,mBAAS,MAAA,CAAO,IAAA,CAAK,QAAK,CAAC,CAAC,CAAA,CAAA;AAChE,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,GAAA,CAAI,QAAG,CAAA,GAAI,OAAA,CAAQ,SAAS,CAAA,GAAIA,OAAAA,CAAM,GAAA,CAAI,QAAG,CAAC,CAAA;AAAA,IAClE;AAGA,IAAA,MAAM,YAAA,GAAe,KAAKA,OAAAA,CAAM,IAAA,CAAK,qBAAc,CAAC,CAAA,CAAA,EAAI,gBAAgB,SAAA,CAAU,OAAA,CAAQ,QAAQ,CAAC,CAAC,qBAAkB,eAAA,CAAgB,UAAA,CAAW,UAAU,CAAA,GAAI,CAAA,EAAG,OAAA,CAAQ,CAAC,CAAC,CAAA,cAAA,CAAA;AAC5K,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,GAAA,CAAI,QAAG,CAAA,GAAI,OAAA,CAAQ,YAAY,CAAA,GAAIA,OAAAA,CAAM,GAAA,CAAI,QAAG,CAAC,CAAA;AAEnE,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,GAAA,CAAI,YAAY,CAAC,CAAA;AACnC,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,IAAA,IAAI,QAAQ,cAAA,EAAgB;AAC1B,MAAA;AAAA,IACF;AAAA,EACF;AACA,EAAA,YAAA,CAAa,aAAA,CAAc,OAAA,CAAQ,KAAA,EAAO,aAAA,CAAc,OAAA,CAAQ,KAAA,EAAO,OAAA,CAAQ,OAAA,EAAS,IAAA,EAAM,aAAA,CAAc,OAAA,CAAQ,OAAO,CAAA;AAG3H,EAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,GAAA,CAAI,SAAI,MAAA,CAAO,EAAE,CAAC,CAAC,CAAA;AACrC,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,EAAA,YAAA,CAAa,aAAA,CAAc,aAAa,CAAA,CAAE,KAAA,EAAO,cAAc,aAAa,CAAA,CAAE,KAAA,EAAO,OAAA,CAAQ,aAAa,CAAA,EAAG,IAAA,EAAM,aAAA,CAAc,aAAa,EAAE,OAAO,CAAA;AAGvJ,EAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,GAAA,CAAI,SAAI,MAAA,CAAO,EAAE,CAAC,CAAC,CAAA;AACrC,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,EAAA,YAAA,CAAa,aAAA,CAAc,QAAA,CAAS,KAAA,EAAO,aAAA,CAAc,QAAA,CAAS,KAAA,EAAO,OAAA,CAAQ,QAAA,EAAU,OAAA,CAAQ,QAAA,IAAY,KAAA,EAAO,aAAA,CAAc,SAAS,OAAO,CAAA;AACtJ;AAEA,SAAS,YAAA,CACP,KAAA,EACA,KAAA,EACA,KAAA,EACA,UACA,OAAA,EACM;AAEN,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,QAAQA,OAAAA,CAAM,IAAA,CAAK,CAAA,EAAG,KAAK,KAAK,KAAA,CAAM,MAAM,CAAA,CAAA,CAAG,CAAC,CAAC,CAAA,CAAE,CAAA;AAC3E,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,EAAA,IAAI,QAAA,IAAY,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAEhC,IAAA,MAAM,cAAA,GAA6C;AAAA,MACjD,UAAU,EAAC;AAAA,MACX,MAAM,EAAC;AAAA,MACP,QAAQ,EAAC;AAAA,MACT,KAAK,EAAC;AAAA,MACN,MAAM;AAAC,KACT;AAEA,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,QAAA,GAAW,IAAA,CAAK,WAAA,CAAY,QAAA,IAAY,MAAA;AAC9C,MAAA,cAAA,CAAe,QAAQ,CAAA,CAAE,IAAA,CAAK,IAAI,CAAA;AAAA,IACpC;AAGA,IAAA,MAAM,gBAAoD,CAAC,UAAA,EAAY,MAAA,EAAQ,QAAA,EAAU,OAAO,MAAM,CAAA;AACtG,IAAA,IAAI,UAAA,GAAa,IAAA;AAEjB,IAAA,KAAA,MAAW,YAAY,aAAA,EAAe;AACpC,MAAA,MAAM,UAAA,GAAa,eAAe,QAAQ,CAAA;AAC1C,MAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAG7B,MAAA,IAAI,CAAC,UAAA,EAAY;AACf,QAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,MAChB;AACA,MAAA,UAAA,GAAa,KAAA;AAGb,MAAA,MAAM,aAAA,GAAgB,QAAA,KAAa,MAAA,GAAS,aAAA,GAAgB,QAAA,CAAS,MAAA,CAAO,CAAC,CAAA,CAAE,WAAA,EAAY,GAAI,QAAA,CAAS,KAAA,CAAM,CAAC,CAAA;AAC/G,MAAA,MAAM,gBAAgB,QAAA,KAAa,MAAA,GAAS,QAAA,GAAM,eAAA,CAAgB,QAAwB,CAAA,CAAE,KAAA;AAC5F,MAAA,MAAM,gBAAgB,QAAA,KAAa,MAAA,GAASA,QAAM,GAAA,GAAM,eAAA,CAAgB,QAAwB,CAAA,CAAE,OAAA;AAElG,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,aAAA,CAAc,CAAA,EAAG,aAAa,CAAA,CAAA,EAAIA,OAAAA,CAAM,KAAK,aAAa,CAAC,IAAIA,OAAAA,CAAM,GAAA,CAAI,IAAI,UAAA,CAAW,MAAM,GAAG,CAAC,CAAA,CAAE,CAAC,CAAA,CAAE,CAAA;AAExH,MAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAE7B,QAAA,IAAI,WAAA,GAAc,EAAA;AAClB,QAAA,IAAI,IAAA,CAAK,YAAY,QAAA,EAAU;AAC7B,UAAA,WAAA,GAAc,GAAA,GAAMA,QAAM,IAAA,CAAK,CAAA,CAAA,EAAI,kBAAkB,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,QACnF;AAEA,QAAA,IAAI,OAAA,GAAU,EAAA;AACd,QAAA,IAAI,IAAA,CAAK,WAAA,CAAY,IAAA,EAAM,MAAA,EAAQ;AAEjC,UAAA,MAAM,IAAA,GAAO,KAAA,CAAM,OAAA,CAAQ,IAAA,CAAK,WAAA,CAAY,IAAI,CAAA,GAAI,IAAA,CAAK,WAAA,CAAY,IAAA,GAAO,EAAC;AAC7E,UAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,YAAA,MAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,CAAA,CAAA,EAAI,iBAAA,CAAkB,GAAG,CAAC,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,GAAG,CAAA;AACrE,YAAA,OAAA,GAAU,MAAMA,OAAAA,CAAM,GAAA,CAAIA,OAAAA,CAAM,OAAA,CAAQ,MAAM,CAAC,CAAA;AAAA,UACjD;AAAA,QACF;AAEA,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,IAAA,EAAOA,OAAAA,CAAM,IAAA,CAAK,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAC,CAAC,CAAA,EAAG,WAAW,CAAA,EAAG,OAAO,CAAA,CAAE,CAAA;AAAA,MACvF;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,EAChB,CAAA,MAAA,IAAW,CAAC,QAAA,IAAY,KAAA,CAAM,SAAS,CAAA,EAAG;AACxC,IAAA,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAKA,OAAAA,CAAM,GAAA,CAAI,uCAAuC,CAAC,CAAA,CAAE,CAAA;AACrE,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,EAChB,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAKA,OAAAA,CAAM,GAAA,CAAI,SAAS,CAAC,CAAA,CAAE,CAAA;AACvC,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,EAChB;AACF;AAGA,SAAS,UAAU,GAAA,EAAqB;AACtC,EAAA,OAAO,GAAA,CAAI,OAAA,CAAQ,eAAA,EAAiB,EAAE,CAAA;AACxC;;;ACrRO,SAAS,8BAA8B,KAAA,EAI5C;AACA,EAAA,MAAM,YAAA,GAA2C;AAAA,IAC/C,OAAA,EAAS,CAAA;AAAA,IACT,aAAA,EAAe,CAAA;AAAA,IACf,QAAA,EAAU,CAAA;AAAA,IACV,QAAA,EAAU;AAAA,GACZ;AAEA,EAAA,MAAM,cAAA,GAA+C;AAAA,IACnD,GAAA,EAAK,CAAA;AAAA,IACL,MAAA,EAAQ,CAAA;AAAA,IACR,IAAA,EAAM,CAAA;AAAA,IACN,QAAA,EAAU;AAAA,GACZ;AAEA,EAAA,MAAM,YAAoC,EAAC;AAE3C,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AAExB,IAAA,MAAM,kBAAA,GAAqB,IAAA,CAAK,IAAA,CAAK,UAAA,CAAW,WAAW,CAAA;AAC3D,IAAA,MAAM,MAAA,GAAS,kBAAA,GAAqB,UAAA,GAAa,IAAA,CAAK,WAAA,CAAY,MAAA;AAElE,IAAA,IAAI,MAAA,IAAU,UAAU,YAAA,EAAc;AACpC,MAAA,YAAA,CAAa,MAAM,CAAA,EAAA;AAAA,IACrB;AAEA,IAAA,MAAM,QAAA,GAAW,KAAK,WAAA,CAAY,QAAA;AAClC,IAAA,IAAI,QAAA,IAAY,YAAY,cAAA,EAAgB;AAC1C,MAAA,cAAA,CAAe,QAAQ,CAAA,EAAA;AAAA,IACzB;AAEA,IAAA,IAAI,IAAA,CAAK,YAAY,IAAA,EAAM;AACzB,MAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,WAAA,CAAY,IAAA,EAAM;AACvC,QAAA,SAAA,CAAU,GAAG,CAAA,GAAA,CAAK,SAAA,CAAU,GAAG,KAAK,CAAA,IAAK,CAAA;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,EAAE,YAAA,EAAc,cAAA,EAAgB,SAAA,EAAU;AACnD;ACrCO,SAAS,iBAAiB,KAAA,EAA8B;AAC7D,EAAA,MAAM,WAAsB,EAAC;AAG7B,EAAA,MAAM,kBAAkB,KAAA,CAAM,MAAA;AAAA,IAAO,CAAA,CAAA,KACnC,CAAA,CAAE,WAAA,CAAY,QAAA,KAAa,UAAA,IAC3B,EAAE,WAAA,CAAY,GAAA,IACdsC,MAAAA,CAAM,CAAA,CAAE,WAAA,CAAY,GAAG,EAAE,QAAA,CAASA,MAAAA,EAAM,EAAG,KAAK,CAAA,IAChD,CAAA,CAAE,YAAY,MAAA,KAAW,UAAA,IACzB,CAAA,CAAE,WAAA,CAAY,MAAA,KAAW;AAAA,GAC3B;AAEA,EAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,QAAA,EAAU,UAAA;AAAA,MACV,OAAA,EAAS,GAAG,eAAA,CAAgB,MAAM,iBAAiB,eAAA,CAAgB,MAAA,GAAS,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,QAAA,CAAA;AAAA,MACxF,KAAA,EAAO,eAAA,CAAgB,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,IAAI;AAAA,KACvC,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,cAAc,KAAA,CAAM,MAAA;AAAA,IAAO,CAAA,CAAA,KAC/B,CAAA,CAAE,WAAA,CAAY,QAAA,KAAa,MAAA,IAC3B,EAAE,WAAA,CAAY,GAAA,IACdA,MAAAA,CAAM,CAAA,CAAE,WAAA,CAAY,GAAG,EAAE,QAAA,CAASA,MAAAA,EAAM,EAAG,KAAK,CAAA,IAChD,CAAA,CAAE,YAAY,MAAA,KAAW,UAAA,IACzB,CAAA,CAAE,WAAA,CAAY,MAAA,KAAW;AAAA,GAC3B;AAEA,EAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,QAAA,EAAU,SAAA;AAAA,MACV,OAAA,EAAS,GAAG,WAAA,CAAY,MAAM,sBAAsB,WAAA,CAAY,MAAA,GAAS,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,QAAA,CAAA;AAAA,MACrF,KAAA,EAAO,WAAA,CAAY,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,IAAI;AAAA,KACnC,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,MAAA,CAAO,CAAA,CAAA,KAAK;AACpC,IAAA,IAAI,CAAA,CAAE,WAAA,CAAY,MAAA,KAAW,aAAA,EAAe;AAC1C,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,SAAA,GAAY,CAAA,CAAE,WAAA,CAAY,OAAA,IAAW,CAAA,CAAE,WAAA,CAAY,UAAA,IAAc,CAAA,CAAE,WAAA,CAAY,OAAA,IAAW,CAAA,CAAE,WAAA,CAAY,UAAA;AAE9G,IAAA,IAAI,CAAC,SAAA,EAAW;AACd,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,MAAM,kBAAkBA,MAAAA,EAAM,CAAE,KAAKA,MAAAA,CAAM,SAAS,GAAG,KAAK,CAAA;AAC5D,IAAA,OAAO,eAAA,GAAkB,CAAA;AAAA,EAC3B,CAAC,CAAA;AAED,EAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,QAAA,EAAU,SAAA;AAAA,MACV,OAAA,EAAS,GAAG,WAAA,CAAY,MAAM,QAAQ,WAAA,CAAY,MAAA,GAAS,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,qBAAA,CAAA;AAAA,MACvE,KAAA,EAAO,WAAA,CAAY,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,IAAI;AAAA,KACnC,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,qBAAqB,KAAA,CAAM,MAAA;AAAA,IAAO,OACtC,CAAA,CAAE,WAAA,CAAY,aAAa,UAAA,IAC3B,CAAA,CAAE,YAAY,MAAA,KAAW;AAAA,GAC3B;AAEA,EAAA,IAAI,kBAAA,CAAmB,SAAS,CAAA,EAAG;AACjC,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,QAAA,EAAU,SAAA;AAAA,MACV,OAAA,EAAS,GAAG,kBAAA,CAAmB,MAAM,iBAAiB,kBAAA,CAAmB,MAAA,GAAS,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,YAAA,CAAA;AAAA,MAC9F,KAAA,EAAO,kBAAA,CAAmB,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,IAAI;AAAA,KAC1C,CAAA;AAAA,EACH;AAGA,EAAA,MAAM,iBAAiB,KAAA,CAAM,MAAA;AAAA,IAAO,OAClC,CAAA,CAAE,WAAA,CAAY,aAAa,MAAA,IAC3B,CAAA,CAAE,YAAY,MAAA,KAAW;AAAA,GAC3B;AAEA,EAAA,IAAI,cAAA,CAAe,MAAA,GAAS,CAAA,IAAK,QAAA,CAAS,SAAS,CAAA,EAAG;AACpD,IAAA,QAAA,CAAS,IAAA,CAAK;AAAA,MACZ,QAAA,EAAU,MAAA;AAAA,MACV,OAAA,EAAS,GAAG,cAAA,CAAe,MAAM,sBAAsB,cAAA,CAAe,MAAA,GAAS,CAAA,GAAI,GAAA,GAAM,EAAE,CAAA,YAAA,CAAA;AAAA,MAC3F,KAAA,EAAO,cAAA,CAAe,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,IAAI;AAAA,KACtC,CAAA;AAAA,EACH;AAGA,EAAA,OAAO,QAAA,CAAS,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAC5B;AAKO,SAAS,sBAAsB,IAAA,EAA+B;AAEnE,EAAA,IAAI,IAAA,CAAK,YAAY,GAAA,IACjBA,MAAAA,CAAM,KAAK,WAAA,CAAY,GAAG,EAAE,QAAA,CAASA,MAAAA,IAAS,KAAK,CAAA,IACnD,KAAK,WAAA,CAAY,MAAA,KAAW,cAC5B,IAAA,CAAK,WAAA,CAAY,WAAW,UAAA,EAAY;AAC1C,IAAA,MAAM,WAAA,GAAcA,QAAM,CAAE,IAAA,CAAKA,OAAM,IAAA,CAAK,WAAA,CAAY,GAAG,CAAA,EAAG,KAAK,CAAA;AACnE,IAAA,OAAO,cAAc,WAAW,CAAA,IAAA,EAAO,WAAA,GAAc,CAAA,GAAI,MAAM,EAAE,CAAA,CAAA;AAAA,EACnE;AAGA,EAAA,IAAI,IAAA,CAAK,WAAA,CAAY,MAAA,KAAW,aAAA,EAAe;AAC7C,IAAA,MAAM,SAAA,GAAY,IAAA,CAAK,WAAA,CAAY,OAAA,IAAW,IAAA,CAAK,WAAA,CAAY,UAAA,IAAc,IAAA,CAAK,WAAA,CAAY,OAAA,IAAW,IAAA,CAAK,WAAA,CAAY,UAAA;AAE1H,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,MAAM,kBAAkBA,MAAAA,EAAM,CAAE,KAAKA,MAAAA,CAAM,SAAS,GAAG,KAAK,CAAA;AAC5D,MAAA,IAAI,kBAAkB,CAAA,EAAG;AACvB,QAAA,OAAO,mBAAmB,eAAe,CAAA,KAAA,CAAA;AAAA,MAC3C;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;;;ACrHO,SAAS,YAAA,GAAwB;AACtC,EAAA,OAAO,IAAIrC,OAAAA,CAAQ,OAAO,CAAA,CACvB,YAAY,sDAAsD,CAAA,CAClE,MAAA,CAAO,aAAA,EAAe,eAAe,CAAA,CACrC,MAAA,CAAO,mBAAA,EAAqB,oBAAoB,CAAA,CAChD,MAAA,CAAO,QAAA,EAAU,6CAA6C,CAAA,CAC9D,MAAA,CAAO,YAAA,EAAc,4BAA4B,EACjD,MAAA,CAAO,YAAA,EAAc,4BAA4B,CAAA,CACjD,OAAO,QAAA,EAAU,gBAAgB,CAAA,CACjC,MAAA,CAAO,OAAO,OAAA,KAOT;AACJ,IAAA,MAAM,UAAU,OAAO,CAAA;AAAA,EACzB,CAAC,CAAA;AACL;AAEA,eAAsB,UAAU,OAAA,EAOd;AAEhB,EAAA,MAAM,kBAAA,EAAmB;AAGzB,EAAA,MAAM,SAA4B,EAAC;AACnC,EAAA,IAAI,QAAQ,GAAA,EAAK;AACf,IAAA,MAAA,CAAO,IAAA,GAAO,CAAC,OAAA,CAAQ,GAAG,CAAA;AAAA,EAC5B;AACA,EAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,IAAA,MAAA,CAAO,WAAW,OAAA,CAAQ,QAAA;AAAA,EAC5B;AAGA,EAAA,MAAM,QAAQ,MAAM,WAAA;AAAA,IAClB,kBAAA;AAAA,IACA,MAAM,YAAA,CAAa;AAAA,MACjB,eAAA,EAAiB,IAAA;AAAA,MACjB;AAAA,KACD;AAAA,GACH;AAEA,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,OAAA,CAAQ,IAAI,iBAAiB,CAAA;AAC7B,IAAA;AAAA,EACF;AAMA,EAAiB,QAAQ,IAAA,IAAQ;AACjC,EAAA,MAAMsC,aAAY,OAAA,CAAQ,IAAA,IAAS,CAAC,OAAA,CAAQ,QAAA,IAAY,CAAC,OAAA,CAAQ,QAAA;AACjE,EAAA,MAAMC,aAAAA,GAAe,OAAA,CAAQ,QAAA,IAAY,OAAA,CAAQ,IAAA;AACjD,EAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,QAAA,IAAY,OAAA,CAAQ,IAAA;AACjD,EAAA,MAAM,cAAA,GAAiB,CAAC,OAAA,CAAQ,IAAA,IAAQ,CAAC,OAAA,CAAQ,QAAA,IAAY,CAAC,OAAA,CAAQ,QAAA;AAGtE,EAAA,MAAM,EAAE,YAAA,EAAc,cAAA,EAAgB,SAAA,EAAU,GAAI,8BAA8B,KAAK,CAAA;AACvF,EAAA,MAAM,eAAA,GAAkB,yBAAyB,KAAK,CAAA;AACtD,EAAA,MAAM,iBAAA,GAAoB,oBAAoB,KAAK,CAAA;AACnD,EAAA,MAAM,QAAA,GAAW,iBAAiB,KAAK,CAAA;AAGvC,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,MAAM,IAAA,GAAO;AAAA,MACX,OAAO,KAAA,CAAM,MAAA;AAAA,MACb,MAAA,EAAQ,YAAA;AAAA,MACR,QAAA,EAAU,cAAA;AAAA,MACV,IAAA,EAAM,SAAA;AAAA,MACN,UAAA,EAAY,iBAAA;AAAA,MACZ,QAAA,EAAU,eAAA;AAAA,MACV,QAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAC,CAAA;AACzC,IAAA;AAAA,EACF;AAGA,EAAA,OAAA,CAAQ,GAAA,CAAIxC,OAAAA,CAAM,IAAA,CAAK,IAAA,CAAK,sBAAe,CAAC,CAAA;AAC5C,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,EAAA,IAAI,OAAA,CAAQ,GAAA,IAAO,OAAA,CAAQ,QAAA,EAAU;AACnC,IAAA,MAAM,cAAwB,EAAC;AAC/B,IAAA,IAAI,QAAQ,GAAA,EAAK,WAAA,CAAY,KAAK,CAAA,IAAA,EAAO,OAAA,CAAQ,GAAG,CAAA,CAAE,CAAA;AACtD,IAAA,IAAI,QAAQ,QAAA,EAAU,WAAA,CAAY,KAAK,CAAA,SAAA,EAAY,OAAA,CAAQ,QAAQ,CAAA,CAAE,CAAA;AACrE,IAAA,OAAA,CAAQ,GAAA,CAAIA,QAAM,GAAA,CAAI,CAAA,aAAA,EAAgB,YAAY,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAC,CAAA;AAC/D,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,EAChB;AAKA,EAAA,IAAI,cAAA,EAAgB;AAElB,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,oBAAa,CAAC,CAAA;AACrC,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,IAAA,MAAM,gBAAA,GAAmB,mBAAA,CAAoB,iBAAA,CAAkB,KAAK,CAAA;AACpE,IAAA,MAAM,eAAA,GAAkB,gBAAA,CAAiB,KAAA,KAAU,OAAA,GAAUA,OAAAA,CAAM,KAAA,GAC5C,gBAAA,CAAiB,KAAA,KAAU,QAAA,GAAWA,OAAAA,CAAM,MAAA,GAC5CA,OAAAA,CAAM,GAAA;AAE7B,IAAA,OAAA,CAAQ,IAAI,CAAA,wBAAA,EAA2BA,OAAAA,CAAM,KAAK,iBAAA,CAAkB,UAAU,CAAC,CAAA,CAAE,CAAA;AACjF,IAAA,OAAA,CAAQ,IAAI,CAAA,wBAAA,EAA2BA,OAAAA,CAAM,OAAO,iBAAA,CAAkB,WAAW,CAAC,CAAA,CAAE,CAAA;AACpF,IAAA,OAAA,CAAQ,IAAI,CAAA,wBAAA,EAA2BA,OAAAA,CAAM,MAAM,iBAAA,CAAkB,aAAa,CAAC,CAAA,CAAE,CAAA;AACrF,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,wBAAA,EAA2B,eAAA,CAAgB,CAAA,EAAG,iBAAA,CAAkB,KAAK,CAAA,EAAA,EAAK,gBAAA,CAAiB,KAAK,CAAA,CAAE,CAAC,CAAA,CAAE,CAAA;AACjH,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,kBAAW,CAAC,CAAA;AACnC,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,IAAA,MAAMyC,WAAAA,GAAa,EAAA;AACnB,IAAA,MAAMC,SAAAA,GAAW,EAAA;AACjB,IAAA,MAAM,iBAAiB,IAAA,CAAK,GAAA,CAAI,GAAG,MAAA,CAAO,MAAA,CAAO,YAAY,CAAC,CAAA;AAC9D,IAAA,MAAMC,UAAAA,GAAY,CAAC,KAAA,EAAe,QAAA,EAAkB,OAAe,QAAA,KAAQ;AACzE,MAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAO,KAAA,GAAQ,WAAYD,SAAQ,CAAA;AACtD,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,KAAA,EAAOA,SAAQ,CAAA;AAC5C,MAAA,MAAM,aAAaA,SAAAA,GAAW,WAAA;AAC9B,MAAA,OAAO,IAAA,CAAK,OAAO,WAAW,CAAA,GAAI1C,QAAM,GAAA,CAAI,QAAG,CAAA,CAAE,MAAA,CAAO,UAAU,CAAA;AAAA,IACpE,CAAA;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAI,eAAQ,SAAA,CAAU,MAAA,CAAOyC,WAAU,CAAC,CAAA,EAAA,EAAKzC,QAAM,IAAA,CAAK2C,UAAAA,CAAU,aAAa,OAAA,EAAS,cAAc,CAAC,CAAC,CAAA,EAAA,EAAK3C,QAAM,IAAA,CAAK,YAAA,CAAa,OAAO,CAAC,CAAA,CAAE,CAAA;AACvJ,IAAA,OAAA,CAAQ,GAAA,CAAI,YAAO,aAAA,CAAc,MAAA,CAAOyC,WAAU,CAAC,CAAA,EAAA,EAAKzC,OAAAA,CAAM,MAAA,CAAO2C,UAAAA,CAAU,YAAA,CAAa,aAAa,CAAA,EAAG,cAAc,CAAC,CAAC,CAAA,EAAA,EAAK3C,OAAAA,CAAM,OAAO,YAAA,CAAa,aAAa,CAAC,CAAC,CAAA,CAAE,CAAA;AAC5K,IAAA,OAAA,CAAQ,GAAA,CAAI,YAAO,UAAA,CAAW,MAAA,CAAOyC,WAAU,CAAC,CAAA,EAAA,EAAKzC,QAAM,KAAA,CAAM2C,UAAAA,CAAU,aAAa,QAAA,EAAU,cAAc,CAAC,CAAC,CAAA,EAAA,EAAK3C,QAAM,KAAA,CAAM,YAAA,CAAa,QAAQ,CAAC,CAAA,CAAE,CAAA;AAC3J,IAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAC7B,MAAA,OAAA,CAAQ,GAAA,CAAI,eAAQ,UAAA,CAAW,MAAA,CAAOyC,WAAU,CAAC,CAAA,EAAA,EAAKzC,QAAM,GAAA,CAAI2C,UAAAA,CAAU,aAAa,QAAA,EAAU,cAAc,CAAC,CAAC,CAAA,EAAA,EAAK3C,QAAM,GAAA,CAAI,YAAA,CAAa,QAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,IAC1J;AACA,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,IAAA,MAAM,aAAA,GAAgB,eAAe,QAAA,IAAY,CAAA;AACjD,IAAA,MAAM,SAAA,GAAY,eAAe,IAAA,IAAQ,CAAA;AAEzC,IAAA,IAAI,aAAA,GAAgB,CAAA,IAAK,SAAA,GAAY,CAAA,EAAG;AACtC,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,0BAAmB,CAAC,CAAA;AAC3C,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,MAAA,IAAI,gBAAgB,CAAA,EAAG;AACrB,QAAA,MAAM,eAAA,GAAkB,KAAA,CAAM,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,WAAA,CAAY,QAAA,KAAa,UAAA,IAAc,CAAA,CAAE,WAAA,CAAY,MAAA,KAAW,SAAS,CAAA,CAAE,MAAA;AACvH,QAAA,MAAM,kBAAA,GAAqB,KAAA,CAAM,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,WAAA,CAAY,QAAA,KAAa,UAAA,IAAc,CAAA,CAAE,WAAA,CAAY,MAAA,KAAW,aAAa,CAAA,CAAE,MAAA;AAC9H,QAAA,MAAM,gBAAA,GAAmB,KAAA,CAAM,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,WAAA,CAAY,QAAA,KAAa,UAAA,IAAc,CAAA,CAAE,WAAA,CAAY,MAAA,KAAW,UAAU,CAAA,CAAE,MAAA;AACzH,QAAA,MAAM,kBAAkB,KAAA,CAAM,MAAA;AAAA,UAAO,CAAA,CAAA,KACnC,EAAE,WAAA,CAAY,QAAA,KAAa,cAC3B,CAAA,CAAE,WAAA,CAAY,OACdsC,MAAAA,CAAM,CAAA,CAAE,YAAY,GAAG,CAAA,CAAE,SAASA,MAAAA,EAAM,EAAG,KAAK,CAAA,IAChD,CAAA,CAAE,YAAY,MAAA,KAAW;AAAA,SAC3B,CAAE,MAAA;AAEF,QAAA,MAAM,QAAQ,EAAC;AACf,QAAA,IAAI,eAAA,GAAkB,GAAG,KAAA,CAAM,IAAA,CAAKtC,QAAM,GAAA,CAAI,CAAA,EAAG,eAAe,CAAA,QAAA,CAAU,CAAC,CAAA;AAC3E,QAAA,IAAI,qBAAqB,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,kBAAkB,CAAA,YAAA,CAAc,CAAA;AAC1E,QAAA,IAAI,gBAAA,GAAmB,GAAG,KAAA,CAAM,IAAA,CAAKA,QAAM,KAAA,CAAM,CAAA,EAAG,gBAAgB,CAAA,SAAA,CAAW,CAAC,CAAA;AAChF,QAAA,IAAI,eAAA,GAAkB,GAAG,KAAA,CAAM,IAAA,CAAKA,QAAM,GAAA,CAAI,CAAA,EAAG,eAAe,CAAA,SAAA,CAAW,CAAC,CAAA;AAE5E,QAAA,OAAA,CAAQ,IAAI,CAAA,0BAAA,EAAsBA,OAAAA,CAAM,GAAA,CAAI,aAAa,CAAC,CAAA,MAAA,EAAS,KAAA,CAAM,MAAA,GAAS,CAAA,GAAI,KAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,CAAE,CAAA;AAAA,MACvH;AAEA,MAAA,IAAI,YAAY,CAAA,EAAG;AACjB,QAAA,MAAM,WAAA,GAAc,KAAA,CAAM,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,WAAA,CAAY,QAAA,KAAa,MAAA,IAAU,CAAA,CAAE,WAAA,CAAY,MAAA,KAAW,SAAS,CAAA,CAAE,MAAA;AAC/G,QAAA,MAAM,cAAA,GAAiB,KAAA,CAAM,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,WAAA,CAAY,QAAA,KAAa,MAAA,IAAU,CAAA,CAAE,WAAA,CAAY,MAAA,KAAW,aAAa,CAAA,CAAE,MAAA;AACtH,QAAA,MAAM,YAAA,GAAe,KAAA,CAAM,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,WAAA,CAAY,QAAA,KAAa,MAAA,IAAU,CAAA,CAAE,WAAA,CAAY,MAAA,KAAW,UAAU,CAAA,CAAE,MAAA;AACjH,QAAA,MAAM,cAAc,KAAA,CAAM,MAAA;AAAA,UAAO,CAAA,CAAA,KAC/B,EAAE,WAAA,CAAY,QAAA,KAAa,UAC3B,CAAA,CAAE,WAAA,CAAY,OACdsC,MAAAA,CAAM,CAAA,CAAE,YAAY,GAAG,CAAA,CAAE,SAASA,MAAAA,EAAM,EAAG,KAAK,CAAA,IAChD,CAAA,CAAE,YAAY,MAAA,KAAW;AAAA,SAC3B,CAAE,MAAA;AAEF,QAAA,MAAM,QAAQ,EAAC;AACf,QAAA,IAAI,WAAA,GAAc,GAAG,KAAA,CAAM,IAAA,CAAKtC,QAAM,GAAA,CAAI,CAAA,EAAG,WAAW,CAAA,QAAA,CAAU,CAAC,CAAA;AACnE,QAAA,IAAI,iBAAiB,CAAA,EAAG,KAAA,CAAM,IAAA,CAAK,CAAA,EAAG,cAAc,CAAA,YAAA,CAAc,CAAA;AAClE,QAAA,IAAI,YAAA,GAAe,GAAG,KAAA,CAAM,IAAA,CAAKA,QAAM,KAAA,CAAM,CAAA,EAAG,YAAY,CAAA,SAAA,CAAW,CAAC,CAAA;AACxE,QAAA,IAAI,WAAA,GAAc,GAAG,KAAA,CAAM,IAAA,CAAKA,QAAM,MAAA,CAAO,CAAA,EAAG,WAAW,CAAA,QAAA,CAAU,CAAC,CAAA;AAEtE,QAAA,OAAA,CAAQ,IAAI,CAAA,0BAAA,EAAsBA,OAAAA,CAAM,IAAI,SAAS,CAAA,CAAE,SAAS,CAAC,CAAA,MAAA,EAAS,MAAM,MAAA,GAAS,CAAA,GAAI,KAAK,KAAA,CAAM,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,CAAE,CAAA;AAAA,MAC9H;AAEA,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,IAChB;AAGA,IAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,MAAA,CAAO,+BAAqB,CAAC,CAAA;AACpD,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,MAAA,KAAA,MAAW,WAAW,QAAA,EAAU;AAC9B,QAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,QAAA,KAAa,UAAA,GAAaA,OAAAA,CAAM,GAAA,GACzC,OAAA,CAAQ,QAAA,KAAa,SAAA,GAAYA,OAAAA,CAAM,MAAA,GACvCA,OAAAA,CAAM,IAAA;AAEnB,QAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,KAAA,CAAM,QAAG,CAAC,CAAA,CAAA,EAAI,OAAA,CAAQ,OAAO,CAAA,CAAE,CAAA;AAGhD,QAAA,KAAA,MAAW,YAAY,OAAA,CAAQ,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA,EAAG;AAChD,UAAA,MAAM,OAAO,KAAA,CAAM,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,QAAQ,CAAA;AAChD,UAAA,MAAM,OAAA,GAAU,IAAA,GAAO,qBAAA,CAAsB,IAAI,CAAA,GAAI,IAAA;AACrD,UAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,IAAA,EAAOA,OAAAA,CAAM,GAAA,CAAI,QAAQ,CAAC,CAAA,EAAG,OAAA,GAAUA,OAAAA,CAAM,IAAI,CAAA,EAAA,EAAK,OAAO,CAAA,CAAA,CAAG,CAAA,GAAI,EAAE,CAAA,CAAE,CAAA;AAAA,QACtF;AAEA,QAAA,IAAI,OAAA,CAAQ,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC5B,UAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,IAAA,EAAOA,OAAAA,CAAM,GAAA,CAAI,CAAA,OAAA,EAAU,OAAA,CAAQ,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA,KAAA,CAAO,CAAC,CAAA,CAAE,CAAA;AAAA,QAC3E;AAAA,MACF;AAEA,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,IAChB,WAAW,iBAAA,CAAkB,WAAA,KAAgB,CAAA,IAAK,iBAAA,CAAkB,gBAAgB,CAAA,EAAG;AAErF,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,KAAA,CAAM,+BAAwB,CAAC,CAAA;AACtD,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,MAAA,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAKA,OAAAA,CAAM,GAAA,CAAI,4CAA4C,CAAC,CAAA,CAAE,CAAA;AAC1E,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,IAChB,CAAA,MAAA,IAAW,iBAAA,CAAkB,WAAA,GAAc,CAAA,EAAG;AAE5C,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,KAAA,CAAM,mBAAc,CAAC,CAAA;AAC5C,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,MAAA,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAKA,OAAAA,CAAM,GAAA,CAAI,qDAAqD,CAAC,CAAA,CAAE,CAAA;AACnF,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,IAChB;AAGA,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,4BAAqB,CAAC,CAAA;AAC7C,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,IAAA,MAAM,eAAA,GAAkB,eAAA,CAAgB,SAAA,CAAU,OAAA,IAAW,CAAA,GAAIA,OAAAA,CAAM,KAAA,CAAM,QAAG,CAAA,GAAIA,OAAAA,CAAM,MAAA,CAAO,QAAG,CAAA;AACpG,IAAA,MAAM,kBAAkB,eAAA,CAAgB,UAAA,CAAW,UAAU,IAAA,GAAOA,OAAAA,CAAM,MAAM,QAAG,CAAA,GAC5D,gBAAgB,UAAA,CAAW,KAAA,KAAU,SAASA,OAAAA,CAAM,GAAA,CAAI,QAAG,CAAA,GAC3DA,OAAAA,CAAM,OAAO,QAAG,CAAA;AAEvC,IAAA,OAAA,CAAQ,GAAA,CAAI,sBAAsBA,OAAAA,CAAM,IAAA,CAAK,gBAAgB,SAAA,CAAU,OAAA,CAAQ,OAAA,CAAQ,CAAC,CAAC,CAAC,SAAS,eAAe,CAAA,EAAG,eAAA,CAAgB,SAAA,CAAU,OAAA,IAAW,CAAA,GAAIA,QAAM,GAAA,CAAI,eAAe,CAAA,GAAI,EAAE,CAAA,CAAE,CAAA;AAC/L,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,mBAAA,EAAsBA,OAAAA,CAAM,IAAA,CAAA,CAAM,gBAAgB,UAAA,CAAW,OAAA,GAAU,CAAA,GAAI,CAAA,EAAG,QAAQ,CAAC,CAAC,CAAC,CAAA,MAAA,EAAS,eAAe,CAAA,CAAE,CAAA;AAC/H,IAAA,OAAA,CAAQ,GAAA,CAAI,sBAAsBA,OAAAA,CAAM,MAAA,CAAO,gBAAgB,GAAA,CAAI,OAAO,CAAC,CAAA,MAAA,CAAQ,CAAA;AACnF,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,GAAA,CAAI,+DAAwD,CAAC,CAAA;AAC/E,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,GAAA,CAAI,4DAA4D,CAAC,CAAA;AACnF,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,GAAA,CAAI,2DAA2D,CAAC,CAAA;AAClF,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,IAAA;AAAA,EACF;AAMA,EAAA,MAAM,UAAA,GAAa,EAAA;AACnB,EAAA,MAAM,QAAA,GAAW,EAAA;AACjB,EAAA,MAAM,UAAA,GAAa,CAAA;AAGnB,EAAA,MAAM,SAAA,GAAY,CAAC,KAAA,EAAe,QAAA,EAAkB,OAAe,QAAA,KAAQ;AACzE,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAO,KAAA,GAAQ,WAAY,QAAQ,CAAA;AACtD,IAAA,OAAO,IAAA,CAAK,OAAO,KAAK,CAAA;AAAA,EAC1B,CAAA;AAKA,EAAA,IAAIuC,UAAAA,EAAW;AAEb,IAAA,MAAM,iBAAA,GAAoB,MAAA,CAAO,MAAA,CAAO,cAAc,CAAA,CAAE,MAAA;AAAA,MACtD,CAAC,GAAA,EAAK,KAAA,KAAU,GAAA,GAAM,KAAA;AAAA,MACtB;AAAA,KACF;AACA,IAAA,OAAA,CAAQ,GAAA,CAAIvC,OAAAA,CAAM,IAAA,CAAK,oBAAa,CAAC,CAAA;AACrC,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,EAAA,EAAK,SAAS,MAAA,CAAO,UAAU,CAAC,CAAA,EAAA,EAAK,OAAA,CAAQ,QAAA,CAAS,UAAU,CAAC,CAAA;AAAA,KACnE;AACA,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,EAAA,EAAKA,OAAAA,CAAM,GAAA,CAAI,QAAA,CAAI,OAAO,UAAU,CAAC,CAAC,CAAA,EAAA,EAAKA,QAAM,GAAA,CAAI,QAAA,CAAI,MAAA,CAAO,UAAU,CAAC,CAAC,CAAA;AAAA,KAC9E;AACA,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,EAAA,EAAK,aAAA,CAAc,MAAA,CAAO,UAAU,CAAC,CAAA,EAAA,EAAKA,OAAAA,CAAM,KAAA,CAAM,KAAA,CAAM,OAAO,QAAA,EAAS,CAAE,QAAA,CAAS,UAAU,CAAC,CAAC,CAAA;AAAA,KACrG;AACA,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,EAAA,EAAK,eAAA,CAAgB,MAAA,CAAO,UAAU,CAAC,CAAA,EAAA,EAAKA,OAAAA,CAAM,IAAA,CAAK,iBAAA,CAAkB,QAAA,EAAS,CAAE,QAAA,CAAS,UAAU,CAAC,CAAC,CAAA;AAAA,KAC3G;AACA,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,KAAK,aAAA,CAAc,MAAA,CAAO,UAAU,CAAC,CAAA,EAAA,EAAKA,QAAM,OAAA,CAAQ,MAAA,CAAO,IAAA,CAAK,SAAS,EAAE,MAAA,CAAO,QAAA,GAAW,QAAA,CAAS,UAAU,CAAC,CAAC,CAAA;AAAA,KACxH;AACA,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,+BAAwB,CAAC,CAAA;AAChD,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,IAAA,MAAM,iBAAiB,IAAA,CAAK,GAAA,CAAI,GAAG,MAAA,CAAO,MAAA,CAAO,YAAY,CAAC,CAAA;AAC9D,IAAA,MAAM,WAAW,QAAA,GAAW,CAAA;AAE5B,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,EAAA,EAAK,QAAA,CAAS,MAAA,CAAO,UAAU,CAAC,CAAA,EAAA,EAAKA,OAAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,QAAQ,CAAC,CAAC,CAAA;AAAA,KAC3E;AACA,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,EAAA,EAAKA,OAAAA,CAAM,GAAA,CAAI,QAAA,CAAI,OAAO,UAAU,CAAC,CAAC,CAAA,EAAA,EAAKA,QAAM,GAAA,CAAI,QAAA,CAAI,MAAA,CAAO,QAAQ,CAAC,CAAC,CAAA;AAAA,KAC5E;AACA,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,YAAA,EAAQ,SAAA,CAAU,MAAA,CAAO,UAAA,GAAa,CAAC,CAAC,CAAA,EAAA,EAAKA,OAAAA,CAAM,IAAA,CAAK,SAAA,CAAU,YAAA,CAAa,OAAA,EAAS,cAAc,CAAA,CAAE,MAAA,CAAO,QAAQ,CAAC,CAAC,CAAA,EAAGA,OAAAA,CAAM,IAAA,CAAK,YAAA,CAAa,OAAA,CAAQ,QAAA,EAAS,CAAE,QAAA,CAAS,CAAC,CAAC,CAAC,CAAA;AAAA,KACrL;AACA,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,SAAA,EAAO,aAAA,CAAc,MAAA,CAAO,UAAA,GAAa,CAAC,CAAC,CAAA,EAAA,EAAKA,OAAAA,CAAM,MAAA,CAAO,SAAA,CAAU,YAAA,CAAa,aAAa,GAAG,cAAc,CAAA,CAAE,MAAA,CAAO,QAAQ,CAAC,CAAC,CAAA,EAAGA,OAAAA,CAAM,MAAA,CAAO,YAAA,CAAa,aAAa,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,CAAC,CAAC,CAAC,CAAA;AAAA,KAC1M;AACA,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,SAAA,EAAO,UAAA,CAAW,MAAA,CAAO,UAAA,GAAa,CAAC,CAAC,CAAA,EAAA,EAAKA,OAAAA,CAAM,KAAA,CAAM,SAAA,CAAU,YAAA,CAAa,QAAA,EAAU,cAAc,CAAA,CAAE,MAAA,CAAO,QAAQ,CAAC,CAAC,CAAA,EAAGA,OAAAA,CAAM,KAAA,CAAM,YAAA,CAAa,QAAA,CAAS,QAAA,EAAS,CAAE,QAAA,CAAS,CAAC,CAAC,CAAC,CAAA;AAAA,KACzL;AACA,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,YAAA,EAAQ,UAAA,CAAW,MAAA,CAAO,UAAA,GAAa,CAAC,CAAC,CAAA,EAAA,EAAKA,OAAAA,CAAM,GAAA,CAAI,SAAA,CAAU,YAAA,CAAa,QAAA,EAAU,cAAc,CAAA,CAAE,MAAA,CAAO,QAAQ,CAAC,CAAC,CAAA,EAAGA,OAAAA,CAAM,GAAA,CAAI,YAAA,CAAa,QAAA,CAAS,QAAA,EAAS,CAAE,QAAA,CAAS,CAAC,CAAC,CAAC,CAAA;AAAA,KACtL;AACA,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,IAAA,IAAI,oBAAoB,CAAA,EAAG;AACzB,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,8BAAuB,CAAC,CAAA;AAC/C,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,MAAA,MAAM,mBAAmB,IAAA,CAAK,GAAA;AAAA,QAC5B,GAAG,OAAO,MAAA,CAAO,cAAc,EAAE,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,GAAI,CAAC;AAAA,OACtD;AAEA,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,CAAA,EAAA,EAAK,UAAA,CAAW,MAAA,CAAO,UAAU,CAAC,CAAA,EAAA,EAAKA,OAAAA,CAAM,IAAA,CAAK,OAAA,CAAQ,MAAA,CAAO,QAAQ,CAAC,CAAC,CAAA;AAAA,OAC7E;AACA,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,CAAA,EAAA,EAAKA,OAAAA,CAAM,GAAA,CAAI,QAAA,CAAI,OAAO,UAAU,CAAC,CAAC,CAAA,EAAA,EAAKA,QAAM,GAAA,CAAI,QAAA,CAAI,MAAA,CAAO,QAAQ,CAAC,CAAC,CAAA;AAAA,OAC5E;AAEA,MAAA,IAAI,cAAA,CAAe,WAAW,CAAA,EAAG;AAC/B,QAAA,OAAA,CAAQ,GAAA;AAAA,UACN,CAAA,YAAA,EAAQ,UAAA,CAAW,MAAA,CAAO,UAAA,GAAa,CAAC,CAAC,CAAA,EAAA,EAAKA,OAAAA,CAAM,GAAA,CAAI,SAAA,CAAU,cAAA,CAAe,QAAA,EAAU,gBAAgB,CAAA,CAAE,MAAA,CAAO,QAAQ,CAAC,CAAC,CAAA,EAAGA,OAAAA,CAAM,GAAA,CAAI,cAAA,CAAe,QAAA,CAAS,QAAA,EAAS,CAAE,QAAA,CAAS,CAAC,CAAC,CAAC,CAAA;AAAA,SAC5L;AAAA,MACF;AACA,MAAA,IAAI,cAAA,CAAe,OAAO,CAAA,EAAG;AAC3B,QAAA,OAAA,CAAQ,GAAA;AAAA,UACN,CAAA,YAAA,EAAQ,MAAA,CAAO,MAAA,CAAO,UAAA,GAAa,CAAC,CAAC,CAAA,EAAA,EAAKA,OAAAA,CAAM,GAAA,CAAI,SAAS,CAAA,CAAE,SAAA,CAAU,cAAA,CAAe,MAAM,gBAAgB,CAAA,CAAE,MAAA,CAAO,QAAQ,CAAC,CAAC,CAAA,EAAGA,OAAAA,CAAM,IAAI,SAAS,CAAA,CAAE,cAAA,CAAe,IAAA,CAAK,QAAA,EAAS,CAAE,QAAA,CAAS,CAAC,CAAC,CAAC,CAAA;AAAA,SACtM;AAAA,MACF;AACA,MAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,QAAA,OAAA,CAAQ,GAAA;AAAA,UACN,CAAA,YAAA,EAAQ,QAAA,CAAS,MAAA,CAAO,UAAA,GAAa,CAAC,CAAC,CAAA,EAAA,EAAKA,OAAAA,CAAM,MAAA,CAAO,SAAA,CAAU,cAAA,CAAe,MAAA,EAAQ,gBAAgB,CAAA,CAAE,MAAA,CAAO,QAAQ,CAAC,CAAC,CAAA,EAAGA,OAAAA,CAAM,MAAA,CAAO,cAAA,CAAe,MAAA,CAAO,QAAA,EAAS,CAAE,QAAA,CAAS,CAAC,CAAC,CAAC,CAAA;AAAA,SAC5L;AAAA,MACF;AACA,MAAA,IAAI,cAAA,CAAe,MAAM,CAAA,EAAG;AAC1B,QAAA,OAAA,CAAQ,GAAA;AAAA,UACN,CAAA,YAAA,EAAQ,KAAA,CAAM,MAAA,CAAO,UAAA,GAAa,CAAC,CAAC,CAAA,EAAA,EAAKA,OAAAA,CAAM,KAAA,CAAM,SAAA,CAAU,cAAA,CAAe,GAAA,EAAK,gBAAgB,CAAA,CAAE,MAAA,CAAO,QAAQ,CAAC,CAAC,CAAA,EAAGA,OAAAA,CAAM,KAAA,CAAM,cAAA,CAAe,GAAA,CAAI,QAAA,EAAS,CAAE,QAAA,CAAS,CAAC,CAAC,CAAC,CAAA;AAAA,SACjL;AAAA,MACF;AACA,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,IAChB;AAGA,IAAA,MAAM,UAAU,MAAA,CAAO,OAAA,CAAQ,SAAS,CAAA,CACrC,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,CAAC,IAAI,CAAA,CAAE,CAAC,CAAC,CAAA,CAC1B,KAAA,CAAM,GAAG,CAAC,CAAA;AAEb,IAAA,IAAI,OAAA,CAAQ,SAAS,CAAA,EAAG;AACtB,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,+BAAmB,CAAC,CAAA;AAC3C,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,MAAA,MAAM,WAAA,GAAc,IAAA,CAAK,GAAA,CAAI,GAAG,OAAA,CAAQ,GAAA,CAAI,CAAC,GAAG,KAAK,CAAA,KAAM,KAAK,CAAC,CAAA;AAEjE,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,CAAA,EAAA,EAAK,KAAA,CAAM,MAAA,CAAO,UAAU,CAAC,CAAA,EAAA,EAAKA,OAAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,MAAA,CAAO,QAAQ,CAAC,CAAC,CAAA;AAAA,OAC3E;AACA,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,CAAA,EAAA,EAAKA,OAAAA,CAAM,GAAA,CAAI,QAAA,CAAI,OAAO,UAAU,CAAC,CAAC,CAAA,EAAA,EAAKA,QAAM,GAAA,CAAI,QAAA,CAAI,MAAA,CAAO,QAAQ,CAAC,CAAC,CAAA;AAAA,OAC5E;AAEA,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,OAAA,EAAS;AAClC,QAAA,MAAM,YAAA,GACJ,GAAA,CAAI,MAAA,GAAS,UAAA,GAAa,GAAA,CAAI,UAAU,CAAA,EAAG,UAAA,GAAa,CAAC,CAAA,GAAI,QAAA,GAAM,GAAA;AACrE,QAAA,MAAM,GAAA,GAAM,SAAA,CAAU,KAAA,EAAO,WAAW,CAAA;AACxC,QAAA,OAAA,CAAQ,GAAA;AAAA,UACN,CAAA,EAAA,EAAK,aAAa,MAAA,CAAO,UAAU,CAAC,CAAA,EAAA,EAAKA,OAAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAC,CAAC,CAAA,EAAGA,QAAM,OAAA,CAAQ,KAAA,CAAM,UAAS,CAAE,QAAA,CAAS,CAAC,CAAC,CAAC,CAAA;AAAA,SAC5H;AAAA,MACF;AACA,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,IAChB;AAAA,EACF;AAKA,EAAA,IAAIwC,aAAAA,EAAc;AAChB,IAAA,MAAM,IAAA,GAAO,EAAA;AACb,IAAA,MAAM,QAAQF,MAAAA,EAAM;AACpB,IAAA,MAAM,SAAA,GAAY,KAAA,CAAM,QAAA,CAAS,IAAA,EAAM,KAAK,CAAA;AAG5C,IAAA,MAAM,gBAAwC,EAAC;AAC/C,IAAA,MAAM,kBAA0C,EAAC;AAEjD,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,OAAA,GAAUA,MAAAA,CAAM,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA;AAG9C,MAAA,IAAI,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC9B,QAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,YAAY,CAAA;AAC3C,QAAA,aAAA,CAAc,OAAO,CAAA,GAAA,CAAK,aAAA,CAAc,OAAO,KAAK,CAAA,IAAK,CAAA;AAAA,MAC3D;AAGA,MAAA,IAAI,IAAA,CAAK,YAAY,SAAA,EAAW;AAC9B,QAAA,MAAM,SAAA,GAAYA,MAAAA,CAAM,IAAA,CAAK,WAAA,CAAY,SAAS,CAAA;AAClD,QAAA,IAAI,SAAA,CAAU,OAAA,CAAQ,SAAS,CAAA,EAAG;AAChC,UAAA,MAAM,OAAA,GAAU,SAAA,CAAU,MAAA,CAAO,YAAY,CAAA;AAC7C,UAAA,eAAA,CAAgB,OAAO,CAAA,GAAA,CAAK,eAAA,CAAgB,OAAO,KAAK,CAAA,IAAK,CAAA;AAAA,QAC/D;AAAA,MACF;AAAA,IACF;AAGA,IAAA,MAAM,QAAA,uBAAe,GAAA,CAAI;AAAA,MACvB,GAAG,MAAA,CAAO,IAAA,CAAK,aAAa,CAAA;AAAA,MAC5B,GAAG,MAAA,CAAO,IAAA,CAAK,eAAe;AAAA,KAC/B,CAAA;AACD,IAAA,MAAM,WAAA,GAAc,KAAA,CAAM,IAAA,CAAK,QAAQ,EAAE,IAAA,EAAK;AAE9C,IAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,MAAA,OAAA,CAAQ,IAAItC,OAAAA,CAAM,IAAA,CAAK,CAAA,yBAAA,EAAqB,IAAI,QAAQ,CAAC,CAAA;AACzD,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,MAAA,MAAM,WAAW,QAAA,GAAW,CAAA;AAE5B,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,CAAA,EAAA,EAAK,OAAO,MAAA,CAAO,EAAE,CAAC,CAAA,EAAA,EAAKA,OAAAA,CAAM,KAAK,SAAA,CAAU,MAAA,CAAO,QAAQ,CAAC,CAAC,KAAKA,OAAAA,CAAM,KAAA,CAAM,YAAY,MAAA,CAAO,QAAQ,CAAC,CAAC,CAAA;AAAA,OACjH;AACA,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,CAAA,EAAA,EAAKA,QAAM,GAAA,CAAI,QAAA,CAAI,OAAO,EAAE,CAAC,CAAC,CAAA,EAAA,EAAKA,OAAAA,CAAM,GAAA,CAAI,SAAI,MAAA,CAAO,QAAQ,CAAC,CAAC,CAAA,EAAA,EAAKA,OAAAA,CAAM,IAAI,QAAA,CAAI,MAAA,CAAO,QAAQ,CAAC,CAAC,CAAA;AAAA,OACxG;AAEA,MAAA,MAAM,WAAW,IAAA,CAAK,GAAA;AAAA,QACpB,GAAG,MAAA,CAAO,MAAA,CAAO,aAAa,CAAA;AAAA,QAC9B,GAAG,MAAA,CAAO,MAAA,CAAO,eAAe;AAAA,OAClC;AAGA,MAAA,KAAA,MAAW,IAAA,IAAQ,WAAA,CAAY,KAAA,CAAM,GAAG,CAAA,EAAG;AACzC,QAAA,MAAM,OAAA,GAAU,aAAA,CAAc,IAAI,CAAA,IAAK,CAAA;AACvC,QAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,IAAI,CAAA,IAAK,CAAA;AAE3C,QAAA,MAAM,UAAA,GAAa,SAAA,CAAU,OAAA,EAAS,QAAA,EAAU,QAAG,CAAA;AACnD,QAAA,MAAM,YAAA,GAAe,SAAA,CAAU,SAAA,EAAW,QAAA,EAAU,QAAG,CAAA;AAEvD,QAAA,MAAM,UAAA,GAAa,CAAA,EAAG,UAAA,CAAW,MAAA,CAAO,QAAQ,CAAC,CAAA,EAAG,OAAA,CAAQ,QAAA,EAAS,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA,CAAA;AAClF,QAAA,MAAM,YAAA,GAAe,CAAA,EAAG,YAAA,CAAa,MAAA,CAAO,QAAQ,CAAC,CAAA,EAAG,SAAA,CAAU,QAAA,EAAS,CAAE,QAAA,CAAS,CAAC,CAAC,CAAA,CAAA;AAExF,QAAA,OAAA,CAAQ,GAAA;AAAA,UACN,KAAKA,OAAAA,CAAM,GAAA,CAAI,IAAA,CAAK,MAAA,CAAO,EAAE,CAAC,CAAC,CAAA,EAAA,EAAKA,OAAAA,CAAM,KAAK,UAAU,CAAC,KAAKA,OAAAA,CAAM,KAAA,CAAM,YAAY,CAAC,CAAA;AAAA,SAC1F;AAAA,MACF;AACA,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,IAChB;AAAA,EACF;AAKA,EAAA,IAAI,YAAA,EAAc;AAChB,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,4BAAqB,CAAC,CAAA;AAC7C,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,qDAAsC,CAAC,CAAA;AAC9D,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,EAAA,EAAK,SAAS,MAAA,CAAO,UAAU,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,QAAA,CAAS,UAAU,CAAC,CAAA;AAAA,KAClE;AACA,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,EAAA,EAAKA,OAAAA,CAAM,GAAA,CAAI,QAAA,CAAI,OAAO,UAAU,CAAC,CAAC,CAAA,EAAA,EAAKA,QAAM,GAAA,CAAI,QAAA,CAAI,MAAA,CAAO,UAAU,CAAC,CAAC,CAAA;AAAA,KAC9E;AACA,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,KAAK,SAAA,CAAU,MAAA,CAAO,UAAU,CAAC,KAAKA,OAAAA,CAAM,IAAA,CAAK,eAAA,CAAgB,SAAA,CAAU,QAAQ,OAAA,CAAQ,CAAC,EAAE,QAAA,CAAS,UAAU,CAAC,CAAC,CAAA;AAAA,KACrH;AACA,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,KAAK,QAAA,CAAS,MAAA,CAAO,UAAU,CAAC,KAAKA,OAAAA,CAAM,IAAA,CAAK,eAAA,CAAgB,SAAA,CAAU,OAAO,OAAA,CAAQ,CAAC,EAAE,QAAA,CAAS,UAAU,CAAC,CAAC,CAAA;AAAA,KACnH;AACA,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,KAAK,iBAAA,CAAkB,MAAA,CAAO,UAAU,CAAC,KAAKA,OAAAA,CAAM,MAAA,CAAO,eAAA,CAAgB,SAAA,CAAU,IAAI,OAAA,CAAQ,CAAC,EAAE,QAAA,CAAS,UAAU,CAAC,CAAC,CAAA;AAAA,KAC3H;AACA,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,sBAAe,CAAC,CAAA;AACvC,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,EAAA,EAAK,SAAS,MAAA,CAAO,UAAU,CAAC,CAAA,EAAA,EAAK,OAAA,CAAQ,QAAA,CAAS,UAAU,CAAC,CAAA;AAAA,KACnE;AACA,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,EAAA,EAAKA,OAAAA,CAAM,GAAA,CAAI,QAAA,CAAI,OAAO,UAAU,CAAC,CAAC,CAAA,EAAA,EAAKA,QAAM,GAAA,CAAI,QAAA,CAAI,MAAA,CAAO,UAAU,CAAC,CAAC,CAAA;AAAA,KAC9E;AACA,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,KAAK,aAAA,CAAc,MAAA,CAAO,UAAU,CAAC,KAAKA,OAAAA,CAAM,KAAA,CAAM,eAAA,CAAgB,UAAA,CAAW,QAAQ,QAAA,EAAS,CAAE,QAAA,CAAS,UAAU,CAAC,CAAC,CAAA;AAAA,KAC3H;AACA,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,KAAK,cAAA,CAAe,MAAA,CAAO,UAAU,CAAC,KAAKA,OAAAA,CAAM,KAAA,CAAM,eAAA,CAAgB,UAAA,CAAW,SAAS,QAAA,EAAS,CAAE,QAAA,CAAS,UAAU,CAAC,CAAC,CAAA;AAAA,KAC7H;AAEA,IAAA,MAAM,UAAA,GACJ,eAAA,CAAgB,UAAA,CAAW,KAAA,KAAU,IAAA,GACjCA,OAAAA,CAAM,KAAA,GACN,eAAA,CAAgB,UAAA,CAAW,KAAA,KAAU,MAAA,GACnCA,OAAAA,CAAM,MACNA,OAAAA,CAAM,MAAA;AACd,IAAA,MAAM,WAAA,GACJ,eAAA,CAAgB,UAAA,CAAW,KAAA,KAAU,IAAA,GACjC,WACA,eAAA,CAAgB,UAAA,CAAW,KAAA,KAAU,MAAA,GACnC,QAAA,GACA,QAAA;AACR,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,KAAK,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAC,KAAK,UAAA,CAAW,WAAA,GAAc,GAAA,GAAM,eAAA,CAAgB,WAAW,KAAA,CAAM,QAAA,CAAS,UAAA,GAAa,CAAC,CAAC,CAAC,CAAA;AAAA,KAC/H;AACA,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,4BAAqB,CAAC,CAAA;AAC7C,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,EAAA,EAAK,SAAS,MAAA,CAAO,UAAU,CAAC,CAAA,EAAA,EAAK,OAAA,CAAQ,QAAA,CAAS,UAAU,CAAC,CAAA;AAAA,KACnE;AACA,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,CAAA,EAAA,EAAKA,OAAAA,CAAM,GAAA,CAAI,QAAA,CAAI,OAAO,UAAU,CAAC,CAAC,CAAA,EAAA,EAAKA,QAAM,GAAA,CAAI,QAAA,CAAI,MAAA,CAAO,UAAU,CAAC,CAAC,CAAA;AAAA,KAC9E;AACA,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,KAAK,SAAA,CAAU,MAAA,CAAO,UAAU,CAAC,KAAKA,OAAAA,CAAM,MAAA,CAAO,eAAA,CAAgB,GAAA,CAAI,QAAQ,QAAA,EAAS,CAAE,QAAA,CAAS,UAAU,CAAC,CAAC,CAAA;AAAA,KACjH;AACA,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,KAAK,gBAAA,CAAiB,MAAA,CAAO,UAAU,CAAC,KAAKA,OAAAA,CAAM,IAAA,CAAK,eAAA,CAAgB,GAAA,CAAI,QAAQ,OAAA,CAAQ,CAAC,EAAE,QAAA,CAAS,UAAU,CAAC,CAAC,CAAA;AAAA,KACtH;AACA,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,IAAA,IACE,gBAAgB,QAAA,CAAS,mBAAA,GAAsB,KAC/C,eAAA,CAAgB,QAAA,CAAS,uBAAuB,CAAA,EAChD;AACA,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,8BAAuB,CAAC,CAAA;AAC/C,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,CAAA,EAAA,EAAK,QAAQ,MAAA,CAAO,UAAU,CAAC,CAAA,EAAA,EAAK,MAAA,CAAO,QAAA,CAAS,UAAU,CAAC,CAAA;AAAA,OACjE;AACA,MAAA,OAAA,CAAQ,GAAA;AAAA,QACN,CAAA,EAAA,EAAKA,OAAAA,CAAM,GAAA,CAAI,QAAA,CAAI,OAAO,UAAU,CAAC,CAAC,CAAA,EAAA,EAAKA,QAAM,GAAA,CAAI,QAAA,CAAI,MAAA,CAAO,UAAU,CAAC,CAAC,CAAA;AAAA,OAC9E;AACA,MAAA,IAAI,eAAA,CAAgB,QAAA,CAAS,mBAAA,GAAsB,CAAA,EAAG;AACpD,QAAA,OAAA,CAAQ,GAAA;AAAA,UACN,KAAK,4BAAA,CAAwB,MAAA,CAAO,UAAU,CAAC,KAAKA,OAAAA,CAAM,IAAA,CAAK,eAAA,CAAgB,QAAA,CAAS,oBAAoB,OAAA,CAAQ,CAAC,EAAE,QAAA,CAAS,UAAU,CAAC,CAAC,CAAA;AAAA,SAC9I;AAAA,MACF;AACA,MAAA,IAAI,eAAA,CAAgB,QAAA,CAAS,oBAAA,GAAuB,CAAA,EAAG;AACrD,QAAA,OAAA,CAAQ,GAAA;AAAA,UACN,KAAK,6BAAA,CAAyB,MAAA,CAAO,UAAU,CAAC,KAAKA,OAAAA,CAAM,KAAA,CAAM,eAAA,CAAgB,QAAA,CAAS,qBAAqB,OAAA,CAAQ,CAAC,EAAE,QAAA,CAAS,UAAU,CAAC,CAAC,CAAA;AAAA,SACjJ;AAAA,MACF;AACA,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,IAChB;AAAA,EACF;AACF;AC3jBO,SAAS,aAAA,GAAyB;AACvC,EAAA,OAAO,IAAIC,OAAAA,CAAQ,QAAQ,EACxB,WAAA,CAAY,6CAA6C,EACzD,QAAA,CAAS,SAAA,EAAW,2DAA2D,CAAA,CAC/E,MAAA,CAAO,qBAAqB,kBAAkB,CAAA,CAC9C,OAAO,aAAA,EAAe,eAAe,EACrC,MAAA,CAAO,uBAAA,EAAyB,oBAAoB,CAAA,CACpD,OAAO,mBAAA,EAAqB,oBAAoB,EAChD,MAAA,CAAO,yBAAA,EAA2B,+CAA+C,CAAA,CACjF,MAAA,CAAO,UAAU,gBAAgB,CAAA,CACjC,OAAO,eAAA,EAAiB,iCAAiC,EACzD,MAAA,CAAO,OAAO,OAA2B,OAAA,KAQpC;AAEJ,IAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,MAAA,OAAA,CAAQ,GAAA,CAAID,OAAAA,CAAM,IAAA,CAAK,wBAAwB,CAAC,CAAA;AAChD,MAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,IAAA,CAAK,SAAI,MAAA,CAAO,EAAE,CAAC,CAAC,CAAA;AACtC,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,MAAA,OAAA,CAAQ,GAAA,CAAI,qBAAqB,CAAA;AACjC,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,MAAA;AAAA,IACF;AAEA,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,MAAA,CAAO,iCAAiC,CAAC,CAAA;AAC3D,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,6CAA6C,CAAC,CAAA;AACrE,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,YAAA,GAAe,uBAAA,CAAwB,OAAA,CAAQ,KAAK,CAAA;AAC1D,IAAA,MAAM,cAAc,KAAA,EAAO;AAAA,MACzB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,KAAK,OAAA,CAAQ,GAAA;AAAA,MACb,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,cAAc,MAAA,CAAO,IAAA,CAAK,YAAY,CAAA,CAAE,MAAA,GAAS,IAAI,YAAA,GAAe,MAAA;AAAA,MACpE,MAAM,OAAA,CAAQ;AAAA,KACf,CAAA;AAAA,EACH,CAAC,CAAA;AACL;AAEA,eAAsB,aAAA,CAAc,OAAe,OAAA,EAOjC;AAEhB,EAAA,MAAM,kBAAA,EAAmB;AAGzB,EAAA,MAAM,SAA4B,EAAC;AACnC,EAAA,IAAI,OAAA,CAAQ,MAAA,EAAQ,MAAA,CAAO,MAAA,GAAS,OAAA,CAAQ,MAAA;AAC5C,EAAA,IAAI,QAAQ,GAAA,EAAK,MAAA,CAAO,IAAA,GAAO,CAAC,QAAQ,GAAG,CAAA;AAC3C,EAAA,IAAI,OAAA,CAAQ,QAAA,EAAU,MAAA,CAAO,QAAA,GAAW,OAAA,CAAQ,QAAA;AAChD,EAAA,IAAI,OAAA,CAAQ,QAAA,EAAU,MAAA,CAAO,QAAA,GAAW,OAAA,CAAQ,QAAA;AAChD,EAAA,IAAI,OAAA,CAAQ,YAAA,EAAc,MAAA,CAAO,YAAA,GAAe,OAAA,CAAQ,YAAA;AAGxD,EAAA,MAAM,QAAQ,MAAM,WAAA;AAAA,IAClB,oBAAA;AAAA,IACA,MAAM,YAAA,CAAa;AAAA,MACjB,eAAA,EAAiB,IAAA;AAAA,MACjB,cAAA,EAAgB,IAAA;AAAA,MAChB;AAAA,KACD;AAAA,GACH;AAEA,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,OAAA,CAAQ,IAAI,kCAAkC,CAAA;AAC9C,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,eAAA,GAAoC,KAAA,CAAM,GAAA,CAAI,CAAA,IAAA,MAAS;AAAA,IAC3D,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,MAAA,EAAQ,KAAK,WAAA,CAAY,MAAA;AAAA,IACzB,QAAA,EAAU,KAAK,WAAA,CAAY,QAAA;AAAA,IAC3B,IAAA,EAAM,KAAK,WAAA,CAAY,IAAA;AAAA,IACvB,KAAA,EAAO,OAAO,IAAA,CAAK,WAAA,CAAY,UAAU,QAAA,GAAW,IAAA,CAAK,YAAY,KAAA,GAAQ,MAAA;AAAA,IAC7E,WAAA,EAAa,OAAO,IAAA,CAAK,WAAA,CAAY,gBAAgB,QAAA,GAAW,IAAA,CAAK,YAAY,WAAA,GAAc,MAAA;AAAA,IAC/F,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,OAAA,EAAS,KAAK,WAAA,CAAY,OAAA;AAAA,IAC1B,OAAA,EAAS,KAAK,WAAA,CAAY,UAAA;AAAA,IAC1B,QAAA,EAAU,KAAK,WAAA,CAAY;AAAA,GAC7B,CAAE,CAAA;AAGF,EAAA,MAAM,YAAA,GAAe,mBAAA,CAAoB,KAAA,EAAO,eAAA,EAAiB;AAAA,IAC/D,iBAAA,EAAmB,CAAA;AAAA,IACnB,aAAA,EAAe;AAAA,GAChB,CAAA;AAED,EAAA,MAAM,EAAE,OAAA,EAAS,QAAA,EAAS,GAAI,YAAA;AAG9B,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,MAAM,UAAA,GAAa;AAAA,MACjB,KAAA;AAAA,MACA,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,QACzB,IAAA,EAAM,EAAE,IAAA,CAAK,IAAA;AAAA,QACb,OAAO,CAAA,CAAE,KAAA;AAAA,QACT,cAAc,CAAA,CAAE,YAAA;AAAA,QAChB,OAAA,EAAS,CAAA,CAAE,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,UAC3B,OAAO,CAAA,CAAE,KAAA;AAAA,UACT,MAAM,CAAA,CAAE,IAAA;AAAA,UACR,YAAY,CAAA,CAAE;AAAA,SAChB,CAAE;AAAA,OACJ,CAAE,CAAA;AAAA,MACF,QAAA;AAAA,MACA,OAAA,EAAS;AAAA,KACX;AACA,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,UAAA,EAAY,IAAA,EAAM,CAAC,CAAC,CAAA;AAC/C,IAAA;AAAA,EACF;AAGA,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA,OAAA,CAAQ,GAAA,CAAIA,QAAM,MAAA,CAAO,CAAA,mCAAA,EAA+B,kBAAkB,KAAK,CAAC,GAAG,CAAC,CAAA;AAGpF,IAAA,IAAI,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,SAAS,CAAA,EAAG;AAClC,MAAA,MAAM,UAAoB,EAAC;AAC3B,MAAA,IAAI,OAAA,CAAQ,QAAQ,OAAA,CAAQ,IAAA,CAAK,UAAU,iBAAA,CAAkB,OAAA,CAAQ,MAAM,CAAC,CAAA,CAAE,CAAA;AAC9E,MAAA,IAAI,OAAA,CAAQ,KAAK,OAAA,CAAQ,IAAA,CAAK,OAAO,iBAAA,CAAkB,OAAA,CAAQ,GAAG,CAAC,CAAA,CAAE,CAAA;AACrE,MAAA,IAAI,OAAA,CAAQ,UAAU,OAAA,CAAQ,IAAA,CAAK,YAAY,iBAAA,CAAkB,OAAA,CAAQ,QAAQ,CAAC,CAAA,CAAE,CAAA;AACpF,MAAA,IAAI,OAAA,CAAQ,UAAU,OAAA,CAAQ,IAAA,CAAK,YAAY,iBAAA,CAAkB,OAAA,CAAQ,QAAQ,CAAC,CAAA,CAAE,CAAA;AACpF,MAAA,OAAA,CAAQ,GAAA,CAAIA,QAAM,IAAA,CAAK,CAAA,cAAA,EAAiB,QAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAC,CAAA;AAAA,IAC/D;AACA,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA;AAAA,EACF;AAGA,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,KAAA,CAAM,CAAA,gBAAA,EAAY,OAAA,CAAQ,MAAM,CAAA,KAAA,EAAQ,OAAA,CAAQ,MAAA,KAAW,CAAA,GAAI,KAAK,GAAG,CAAA,WAAA,EAAc,kBAAkB,KAAK,CAAC,GAAG,CAAC,CAAA;AACnI,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,CAAA,YAAA,EAAe,QAAA,CAAS,aAAa,CAAA,UAAA,EAAa,QAAA,CAAS,UAAU,CAAA,EAAA,CAAI,CAAC,CAAA;AAGjG,EAAA,IAAI,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA,CAAE,SAAS,CAAA,EAAG;AAClC,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,IAAI,OAAA,CAAQ,QAAQ,OAAA,CAAQ,IAAA,CAAK,UAAU,iBAAA,CAAkB,OAAA,CAAQ,MAAM,CAAC,CAAA,CAAE,CAAA;AAC9E,IAAA,IAAI,OAAA,CAAQ,KAAK,OAAA,CAAQ,IAAA,CAAK,OAAO,iBAAA,CAAkB,OAAA,CAAQ,GAAG,CAAC,CAAA,CAAE,CAAA;AACrE,IAAA,IAAI,OAAA,CAAQ,UAAU,OAAA,CAAQ,IAAA,CAAK,YAAY,iBAAA,CAAkB,OAAA,CAAQ,QAAQ,CAAC,CAAA,CAAE,CAAA;AACpF,IAAA,IAAI,OAAA,CAAQ,UAAU,OAAA,CAAQ,IAAA,CAAK,YAAY,iBAAA,CAAkB,OAAA,CAAQ,QAAQ,CAAC,CAAA,CAAE,CAAA;AACpF,IAAA,OAAA,CAAQ,GAAA,CAAIA,QAAM,IAAA,CAAK,CAAA,iBAAA,EAAoB,QAAQ,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAC,CAAA;AAAA,EAClE;AACA,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAS,KAAA,EAAO,cAAa,GAAI,MAAA;AAG/C,IAAA,MAAM,WAAA,GAAc,KAAK,MAAA,KAAW,aAAA,GAAgB,cACjC,IAAA,CAAK,MAAA,KAAW,aAAa,QAAA,GAAM,WAAA;AACtD,IAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,IAAA,CAAK,GAAG,WAAW,CAAA,CAAA,EAAI,kBAAkB,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,EAAIA,QAAM,IAAA,CAAK,CAAA,CAAA,EAAI,KAAK,CAAA,QAAA,CAAU,CAAC,EAAE,CAAC,CAAA;AAG3G,IAAA,MAAM,OAAiB,EAAC;AACxB,IAAA,IAAI,KAAK,QAAA,EAAU;AACjB,MAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,QAAA,KAAa,UAAA,GAAa,WAAA,GAChC,IAAA,CAAK,QAAA,KAAa,MAAA,GAAS,WAAA,GAC3B,IAAA,CAAK,QAAA,KAAa,QAAA,GAAW,WAAA,GAAO,WAAA;AACzD,MAAA,IAAA,CAAK,IAAA,CAAK,GAAG,aAAa,CAAA,CAAA,EAAI,kBAAkB,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,IAClE;AACA,IAAA,IAAI,IAAA,CAAK,IAAA,IAAQ,IAAA,CAAK,IAAA,CAAK,SAAS,CAAA,EAAG;AACrC,MAAA,IAAA,CAAK,IAAA,CAAK,CAAA,CAAA,EAAI,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAO,iBAAA,CAAkB,GAAG,CAAC,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAA,CAAG,CAAA;AAAA,IAC1E;AACA,IAAA,IAAI,IAAA,CAAK,SAAS,CAAA,EAAG;AACnB,MAAA,OAAA,CAAQ,GAAA,CAAIA,QAAM,IAAA,CAAK,CAAA,GAAA,EAAM,KAAK,IAAA,CAAK,UAAK,CAAC,CAAA,CAAE,CAAC,CAAA;AAAA,IAClD;AAGA,IAAA,MAAM,aAAa,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,UAAU,OAAO,CAAA;AACxD,IAAA,IAAI,UAAA,EAAY;AACd,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,GAAA,EAAMA,OAAAA,CAAM,IAAA,CAAK,QAAQ,CAAC,CAAA,CAAA,EAAI,gBAAA,CAAiB,UAAA,CAAW,IAAA,EAAM,UAAA,CAAW,UAAU,CAAC,CAAA,CAAE,CAAA;AAAA,IACtG;AAGA,IAAA,MAAM,YAAY,OAAA,CAAQ,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,UAAU,aAAa,CAAA;AAC7D,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,GAAA,EAAMA,OAAAA,CAAM,IAAA,CAAK,cAAc,CAAC,CAAA,CAAA,EAAI,gBAAA,CAAiB,SAAA,CAAU,IAAA,EAAM,SAAA,CAAU,UAAU,CAAC,CAAA,CAAE,CAAA;AAAA,IAC1G;AAGA,IAAA,MAAM,aAAa,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,UAAU,MAAM,CAAA;AACzD,IAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,MAAA,OAAA,CAAQ,GAAA,CAAI,MAAMA,OAAAA,CAAM,IAAA,CAAK,OAAO,CAAC,CAAA,CAAA,EAAI,WAAW,GAAA,CAAI,CAAA,CAAA,KAAK,iBAAiB,CAAA,CAAE,IAAA,EAAM,EAAE,UAAU,CAAC,EAAE,IAAA,CAAK,IAAI,CAAC,CAAA,CAAE,CAAA;AAAA,IACnH;AAGA,IAAA,MAAM,iBAAiB,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,UAAU,SAAS,CAAA;AAChE,IAAA,IAAI,cAAA,CAAe,SAAS,CAAA,EAAG;AAC7B,MAAA,OAAA,CAAQ,IAAI,CAAA,GAAA,EAAMA,OAAAA,CAAM,IAAA,CAAK,kBAAkB,CAAC,CAAA,CAAE,CAAA;AAClD,MAAA,KAAA,MAAW,SAAS,cAAA,EAAgB;AAClC,QAAA,MAAM,QAAA,GAAW,MAAM,UAAA,GAAaA,OAAAA,CAAM,KAAK,CAAA,EAAA,EAAK,KAAA,CAAM,UAAU,CAAA,CAAA,CAAG,CAAA,GAAI,EAAA;AAC3E,QAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,GAAA,EAAM,QAAQ,CAAA,CAAA,EAAI,gBAAA,CAAiB,MAAM,IAAA,EAAM,KAAA,CAAM,UAAU,CAAC,CAAA,CAAE,CAAA;AAAA,MAChF;AAAA,IACF;AAEA,IAAA,IAAI,YAAA,GAAe,QAAQ,MAAA,EAAQ;AACjC,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,CAAA,WAAA,EAAc,eAAe,OAAA,CAAQ,MAAM,CAAA,WAAA,EAAc,YAAA,GAAe,QAAQ,MAAA,KAAW,CAAA,GAAI,EAAA,GAAK,IAAI,EAAE,CAAC,CAAA;AAAA,IACpI;AAEA,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,EAChB;AACF;AAKA,SAAS,gBAAA,CAAiB,MAAc,UAAA,EAA6C;AACnF,EAAA,IAAI,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAO,IAAA;AAEpC,EAAA,IAAI,MAAA,GAAS,EAAA;AACb,EAAA,IAAI,OAAA,GAAU,CAAA;AAEd,EAAA,KAAA,MAAW,CAAC,KAAA,EAAO,GAAG,CAAA,IAAK,UAAA,EAAY;AACrC,IAAA,MAAA,IAAU,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,KAAK,CAAA;AACvC,IAAA,MAAA,IAAUA,QAAM,MAAA,CAAO,IAAA,CAAK,SAAA,CAAU,KAAA,EAAO,GAAG,CAAC,CAAA;AACjD,IAAA,OAAA,GAAU,GAAA;AAAA,EACZ;AACA,EAAA,MAAA,IAAU,IAAA,CAAK,UAAU,OAAO,CAAA;AAEhC,EAAA,OAAO,MAAA;AACT;ACzOO,SAAS,WAAA,CAAY,QAAA,EAAmB,OAAA,GAAuB,EAAC,EAA4B;AACjG,EAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,IAAA,OAAO,QAAA,CAAS,UAAU,OAAO,CAAA;AAAA,EACnC;AAEA,EAAA,OAAO,IAAIC,OAAAA,CAAQ,MAAM,EACtB,WAAA,CAAY,0HAAgH,EAC5H,QAAA,CAAS,QAAA,EAAU,+BAA+B,CAAA,CAClD,MAAA,CAAO,eAAe,iCAAA,EAAmC,QAAQ,EACjE,MAAA,CAAO,SAAA,EAAW,2BAA2B,CAAA,CAC7C,MAAA,CAAO,UAAU,gBAAgB,CAAA,CACjC,OAAO,YAAA,EAAc,kDAAkD,EACvE,MAAA,CAAO,YAAA,EAAc,iCAAiC,CAAA,CACtD,MAAA,CAAO,gBAAgB,iCAAiC,CAAA,CACxD,OAAO,UAAA,EAAY,yCAAyC,EAC5D,MAAA,CAAO,OAAO,QAAgB,IAAA,KAAsB;AACnD,IAAA,MAAM,QAAA,CAAS,QAAQ,IAAI,CAAA;AAAA,EAC7B,CAAC,CAAA;AACL;AAEA,eAAsB,QAAA,CAAS,QAAA,EAAkB,OAAA,GAAuB,EAAC,EAAkB;AAEzF,EAAA,MAAM,kBAAA,EAAmB;AAGzB,EAAA,MAAM,MAAA,GAAS,MAAM,UAAA,EAAW;AAChC,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AACxB,EAAA,MAAM,QAAA,GAAgB2C,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,MAAA,CAAO,QAAQ,CAAA;AAC/C,EAAA,MAAM,YAAA,GAAe,MAAM,eAAA,CAAgB,QAAA,EAAU,KAAK,QAAQ,CAAA;AAElE,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,iBAAA,CAAkB,QAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,EAClE;AAEA,EAAA,MAAM,IAAA,GAAO,MAAM,OAAA,CAAQ,YAAY,CAAA;AAEvC,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,iBAAA,CAAkB,QAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,EAClE;AAGA,EAAA,MAAM,WAAW,MAAM,YAAA,CAAa,EAAE,eAAA,EAAiB,MAAM,CAAA;AAC7D,EAAA,MAAM,KAAA,GAAQ,IAAI,mBAAA,CAAoB,QAAQ,CAAA;AAG9C,EAAA,IAAI,IAAA,GAA0D,UAAA;AAC9D,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,IAAA,GAAO,OAAA,CAAQ,IAAA;AAAA,EACjB,CAAA,MAAA,IAAY,QAAgB,QAAA,EAAU;AACpC,IAAA,IAAA,GAAO,UAAA;AAAA,EACT,CAAA,MAAA,IAAY,QAAgB,UAAA,EAAY;AACtC,IAAA,IAAA,GAAO,YAAA;AAAA,EACT,CAAA,MAAA,IAAY,QAAgB,MAAA,EAAQ;AAClC,IAAA,IAAA,GAAO,QAAA;AAAA,EACT;AAEA,EAAA,MAAM,OAAA,uBAAc,GAAA,EAAsB;AAC1C,EAAA,KAAA,MAAW,KAAK,QAAA,EAAU;AACxB,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAE,IAAA,EAAM,CAAC,CAAA;AAAA,EACvB;AAGA,EAAA,IAAI,YAAwB,EAAC;AAC7B,EAAA,IAAI,aAAyB,EAAC;AAC9B,EAAA,IAAI,UAAsB,EAAC;AAE3B,EAAA,IAAI,SAAS,UAAA,EAAY;AACvB,IAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA;AACtD,IAAA,SAAA,GAAY,aAAA,CAAc,SAAA;AAC1B,IAAA,UAAA,GAAa,aAAA,CAAc,UAAA;AAC3B,IAAA,OAAA,GAAU,aAAA,CAAc,OAAA;AAAA,EAC1B,CAAA,MAAA,IAAW,SAAS,UAAA,EAAY;AAC9B,IAAA,SAAA,GAAY,MAAM,WAAA,CAAY,IAAA,CAAK,IAAA,EAAM,OAAA,CAAQ,SAAS,CAAC,CAAA;AAAA,EAC7D,CAAA,MAAA,IAAW,SAAS,YAAA,EAAc;AAChC,IAAA,UAAA,GAAa,MAAM,aAAA,CAAc,IAAA,CAAK,IAAA,EAAM,OAAA,CAAQ,SAAS,CAAC,CAAA;AAAA,EAChE,CAAA,MAAA,IAAW,SAAS,QAAA,EAAU;AAC5B,IAAA,MAAM,SAAS,KAAA,CAAM,eAAA,CAAgB,KAAK,IAAA,EAAM,OAAA,CAAQ,SAAS,CAAC,CAAA;AAClE,IAAA,SAAA,GAAY,MAAA,CAAO,QAAA;AACnB,IAAA,UAAA,GAAa,MAAA,CAAO,UAAA;AACpB,IAAA,OAAA,GAAU,MAAA,CAAO,OAAA;AAAA,EACnB;AAGA,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,MAAM,IAAA,GAAY;AAAA,MAChB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX;AAAA,KACF;AAEA,IAAA,IAAI,IAAA,KAAS,UAAA,IAAc,IAAA,KAAS,UAAA,IAAc,SAAS,QAAA,EAAU;AACnE,MAAA,IAAA,CAAK,SAAA,GAAY,SAAA,CAAU,GAAA,CAAI,CAAA,CAAA,MAAM,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,MAAA,EAAQ,CAAA,CAAE,WAAA,CAAY,MAAA,EAAO,CAAE,CAAA;AAAA,IACtF;AAEA,IAAA,IAAI,IAAA,KAAS,UAAA,IAAc,IAAA,KAAS,YAAA,IAAgB,SAAS,QAAA,EAAU;AACrE,MAAA,IAAA,CAAK,UAAA,GAAa,UAAA,CAAW,GAAA,CAAI,CAAA,CAAA,MAAM,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,MAAA,EAAQ,CAAA,CAAE,WAAA,CAAY,MAAA,EAAO,CAAE,CAAA;AAAA,IACxF;AAEA,IAAA,IAAI,IAAA,KAAS,UAAA,IAAc,IAAA,KAAS,QAAA,EAAU;AAC5C,MAAA,IAAA,CAAK,OAAA,GAAU,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,MAAM,EAAE,IAAA,EAAM,CAAA,CAAE,IAAA,EAAM,MAAA,EAAQ,CAAA,CAAE,WAAA,CAAY,MAAA,EAAO,CAAE,CAAA;AAAA,IAClF;AAEA,IAAA,IAAI,SAAS,UAAA,KAAe,OAAA,CAAQ,KAAA,IAAS,SAAA,CAAU,SAAS,CAAA,CAAA,EAAI;AAClE,MAAA,IAAA,CAAK,QAAQ,oBAAA,CAAqB,IAAA,EAAM,OAAA,EAAS,OAAA,CAAQ,SAAS,CAAC,CAAA;AAAA,IACrE;AAEA,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,IAAA,EAAM,IAAA,EAAM,CAAC,CAAC,CAAA;AACzC,IAAA;AAAA,EACF;AAGA,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,GAAA,CAAI5C,OAAAA,CAAM,KAAA,CAAM,CAAA,2BAAA,EAAuBA,OAAAA,CAAM,IAAA,CAAK,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAC,CAAC,CAAA,CAAE,CAAC,CAAA;AAC1F,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,EAAA,MAAM,mBAAA,GAAsB,UAAU,MAAA,GAAS,CAAA,IAAK,WAAW,MAAA,GAAS,CAAA,IAAK,QAAQ,MAAA,GAAS,CAAA;AAE9F,EAAA,IAAI,CAAC,mBAAA,EAAqB;AACxB,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,oCAAoC,CAAC,CAAA;AAC5D,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA;AAAA,EACF;AAGA,EAAA,IAAA,CAAK,IAAA,KAAS,cAAc,IAAA,KAAS,UAAA,IAAc,SAAS,QAAA,KAAa,SAAA,CAAU,SAAS,CAAA,EAAG;AAC7F,IAAA,MAAM,QAAQ,IAAA,KAAS,UAAA,GAAa,YAAA,GAAe,IAAA,KAAS,aAAa,uBAAA,GAA0B,mBAAA;AACnG,IAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,IAAA,CAAK,CAAA,EAAG,KAAK,GAAG,CAAC,CAAA;AACnC,IAAA,KAAA,MAAW,OAAO,SAAA,EAAW;AAC3B,MAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,GAAA,CAAI,WAAA,CAAY,MAAM,CAAA;AACxD,MAAA,OAAA,CAAQ,GAAA,CAAI,YAAO,iBAAA,CAAkB,GAAA,CAAI,IAAI,CAAC,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CAAA;AAAA,IAC5D;AACA,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,EAChB;AAGA,EAAA,IAAA,CAAK,IAAA,KAAS,cAAc,IAAA,KAAS,YAAA,IAAgB,SAAS,QAAA,KAAa,UAAA,CAAW,SAAS,CAAA,EAAG;AAChG,IAAA,MAAM,QAAQ,IAAA,KAAS,UAAA,GAAa,aAAA,GAAgB,IAAA,KAAS,eAAe,uBAAA,GAA0B,qBAAA;AACtG,IAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,IAAA,CAAK,CAAA,EAAG,KAAK,GAAG,CAAC,CAAA;AACnC,IAAA,KAAA,MAAW,WAAW,UAAA,EAAY;AAChC,MAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,OAAA,CAAQ,WAAA,CAAY,MAAM,CAAA;AAC5D,MAAA,OAAA,CAAQ,GAAA,CAAI,YAAO,iBAAA,CAAkB,OAAA,CAAQ,IAAI,CAAC,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CAAA;AAAA,IAChE;AACA,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,EAChB;AAGA,EAAA,IAAA,CAAK,SAAS,UAAA,IAAc,IAAA,KAAS,QAAA,KAAa,OAAA,CAAQ,SAAS,CAAA,EAAG;AACpE,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,gBAAgB,CAAC,CAAA;AACxC,IAAA,KAAA,MAAW,OAAO,OAAA,EAAS;AACzB,MAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,GAAA,CAAI,WAAA,CAAY,MAAM,CAAA;AACxD,MAAA,OAAA,CAAQ,GAAA,CAAI,YAAO,iBAAA,CAAkB,GAAA,CAAI,IAAI,CAAC,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CAAA;AAAA,IAC5D;AACA,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,EAChB;AAGA,EAAA,IAAI,SAAS,UAAA,KAAe,OAAA,CAAQ,KAAA,IAAS,SAAA,CAAU,SAAS,CAAA,CAAA,EAAI;AAClE,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,mBAAmB,CAAC,CAAA;AAC3C,IAAA,MAAM,QAAQ,oBAAA,CAAqB,IAAA,EAAM,OAAA,EAAS,OAAA,CAAQ,SAAS,CAAC,CAAA;AACpE,IAAA,YAAA,CAAa,OAAO,CAAC,CAAA;AACrB,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,EAChB;AAGA,EAAA,IAAI,SAAS,QAAA,EAAU;AACrB,IAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,MAAA,GAAS,UAAA,CAAW,SAAS,OAAA,CAAQ,MAAA;AAC7D,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,CAAA,eAAA,CAAiB,CAAC,CAAA;AACzC,IAAA,OAAA,CAAQ,IAAI,CAAA,6BAAA,EAAgCA,OAAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAA,YAAA,CAAc,CAAA;AAC7E,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,cAAA,EAAiB,SAAA,CAAU,MAAM,CAAA,eAAA,EAAkB,WAAW,MAAM,CAAA,YAAA,EAAe,OAAA,CAAQ,MAAM,CAAA,CAAE,CAAA;AAC/G,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,EAChB;AACF;AAOA,SAAS,oBAAA,CACP,MACA,OAAA,EACA,QAAA,EACA,eAAuB,CAAA,EACvB,OAAA,mBAAuB,IAAI,GAAA,EAAI,EACf;AAChB,EAAA,MAAM,IAAA,GAAuB;AAAA,IAC3B,IAAA;AAAA,IACA,cAAc;AAAC,GACjB;AAGA,EAAA,IAAI,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG;AAC1B,IAAA,OAAO,IAAA;AAAA,EACT;AACA,EAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,IAAI,CAAA;AAGrB,EAAA,IAAI,gBAAgB,QAAA,EAAU;AAC5B,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,IAAI,IAAA,CAAK,YAAY,UAAA,EAAY;AAC/B,IAAA,KAAA,MAAW,OAAA,IAAW,IAAA,CAAK,WAAA,CAAY,UAAA,EAAY;AACjD,MAAA,MAAM,GAAA,GAAM,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA;AAC/B,MAAA,IAAI,GAAA,EAAK;AACP,QAAA,IAAA,CAAK,YAAA,CAAa,KAAK,oBAAA,CAAqB,GAAA,EAAK,SAAS,QAAA,EAAU,YAAA,GAAe,CAAA,EAAG,OAAO,CAAC,CAAA;AAAA,MAChG;AAAA,IACF;AAAA,EACF;AAEA,EAAA,OAAO,IAAA;AACT;AAEA,SAAS,YAAA,CAAa,MAAsB,KAAA,EAAqB;AAC/D,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA;AAChC,EAAA,MAAM,MAAA,GAAS,kBAAA,CAAmB,IAAA,CAAK,IAAA,CAAK,YAAY,MAAM,CAAA;AAC9D,EAAA,MAAM,IAAA,GAAO,KAAA,KAAU,CAAA,GAAIA,OAAAA,CAAM,IAAA,CAAK,KAAK,IAAA,CAAK,IAAI,CAAA,GAAI,IAAA,CAAK,IAAA,CAAK,IAAA;AAElE,EAAA,OAAA,CAAQ,IAAI,CAAA,EAAG,MAAM,GAAG,IAAI,CAAA,CAAA,EAAI,MAAM,CAAA,CAAE,CAAA;AAExC,EAAA,KAAA,MAAW,GAAA,IAAO,KAAK,YAAA,EAAc;AACnC,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,KAAK,CAAA,GAAI,eAAA;AACpC,IAAA,MAAM,SAAA,GAAY,kBAAA,CAAmB,GAAA,CAAI,IAAA,CAAK,YAAY,MAAM,CAAA;AAChE,IAAA,OAAA,CAAQ,GAAA,CAAI,GAAG,MAAM,CAAA,EAAG,IAAI,IAAA,CAAK,IAAI,CAAA,CAAA,EAAI,SAAS,CAAA,CAAE,CAAA;AAGpD,IAAA,KAAA,MAAW,SAAA,IAAa,IAAI,YAAA,EAAc;AACxC,MAAA,YAAA,CAAa,SAAA,EAAW,QAAQ,CAAC,CAAA;AAAA,IACnC;AAAA,EACF;AACF;ACjPO,SAAS,eAAA,GAA2B;AACzC,EAAA,OAAO,IAAIC,OAAAA,CAAQ,UAAU,CAAA,CAC1B,WAAA,CAAY,oCAAoC,CAAA,CAChD,MAAA,CAAO,YAAA,EAAc,gCAAA,EAAkC,QAAQ,CAAA,CAC/D,MAAA,CAAO,YAAY,cAAc,CAAA,CACjC,MAAA,CAAO,eAAA,EAAiB,mBAAmB,CAAA,CAC3C,MAAA,CAAO,QAAA,EAAU,gBAAgB,CAAA,CACjC,MAAA,CAAO,OAAO,OAAA,KAAsF;AACnG,IAAA,MAAM,aAAa,OAAO,CAAA;AAAA,EAC5B,CAAC,CAAA;AACL;AAEA,eAAsB,aAAa,OAAA,EAKjB;AAEhB,EAAA,MAAM,kBAAA,EAAmB;AAGzB,EAAA,MAAM,YAAY,CAAC,KAAA,EAAe,QAAA,EAAkB,KAAA,EAAe,OAAe,QAAA,KAAQ;AACxF,IAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAO,KAAA,GAAQ,WAAY,KAAK,CAAA;AACpD,IAAA,OAAO,IAAA,CAAK,OAAO,MAAM,CAAA;AAAA,EAC3B,CAAA;AAEA,EAAA,MAAM,IAAA,GAAO,QAAQ,IAAA,IAAQ,EAAA;AAG7B,EAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,CAAa;AAAA,IAC/B,eAAA,EAAiB;AAAA,GAClB,CAAA;AAED,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,OAAA,CAAQ,IAAI,iBAAiB,CAAA;AAC7B,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,QAAQqC,MAAAA,EAAM;AACpB,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,QAAA,CAAS,IAAA,EAAM,KAAK,CAAA;AAG5C,EAAA,MAAM,gBAAwC,EAAC;AAC/C,EAAA,MAAM,kBAA0C,EAAC;AACjD,EAAA,MAAM,iBAAyC,EAAC;AAEhD,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,MAAM,OAAA,GAAUA,MAAAA,CAAM,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA;AAG9C,IAAA,IAAI,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC9B,MAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,YAAY,CAAA;AAC3C,MAAA,aAAA,CAAc,OAAO,CAAA,GAAA,CAAK,aAAA,CAAc,OAAO,KAAK,CAAA,IAAK,CAAA;AAAA,IAC3D;AAGA,IAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,MAAA,CAAO,UAAU,CAAA;AAC1C,IAAA,cAAA,CAAe,QAAQ,CAAA,GAAA,CAAK,cAAA,CAAe,QAAQ,KAAK,CAAA,IAAK,CAAA;AAG7D,IAAA,IAAI,IAAA,CAAK,YAAY,SAAA,EAAW;AAC9B,MAAA,MAAM,SAAA,GAAYA,MAAAA,CAAM,IAAA,CAAK,WAAA,CAAY,SAAS,CAAA;AAClD,MAAA,IAAI,SAAA,CAAU,OAAA,CAAQ,SAAS,CAAA,EAAG;AAChC,QAAA,MAAM,OAAA,GAAU,SAAA,CAAU,MAAA,CAAO,YAAY,CAAA;AAC7C,QAAA,eAAA,CAAgB,OAAO,CAAA,GAAA,CAAK,eAAA,CAAgB,OAAO,KAAK,CAAA,IAAK,CAAA;AAAA,MAC/D;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,MAAM,UAAA,GAAa;AAAA,MACjB,IAAA;AAAA,MACA,aAAA;AAAA,MACA,eAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,UAAA,EAAY,IAAA,EAAM,CAAC,CAAC,CAAA;AAC/C,IAAA;AAAA,EACF;AAGA,EAAA,OAAA,CAAQ,GAAA,CAAItC,OAAAA,CAAM,IAAA,CAAK,IAAA,CAAK,yBAAkB,CAAC,CAAA;AAC/C,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,EAAA,MAAM,QAAA,mBAAW,IAAI,GAAA,CAAI,CAAC,GAAG,MAAA,CAAO,IAAA,CAAK,aAAa,CAAA,EAAG,GAAG,MAAA,CAAO,IAAA,CAAK,eAAe,CAAC,CAAC,CAAA;AACzF,EAAA,MAAM,WAAA,GAAc,KAAA,CAAM,IAAA,CAAK,QAAQ,EAAE,IAAA,EAAK;AAE9C,EAAA,IAAI,WAAA,CAAY,SAAS,CAAA,EAAG;AAC1B,IAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,IAAA,CAAK,CAAA,yBAAA,EAAqB,IAAI,QAAQ,CAAC,CAAA;AACzD,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,IAAA,MAAMyC,WAAAA,GAAa,EAAA;AACnB,IAAA,MAAM,QAAA,GAAW,EAAA;AACjB,IAAA,MAAM,UAAA,GAAa,CAAA;AACnB,IAAA,MAAM,WAAW,QAAA,GAAW,UAAA;AAE5B,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,MAAA,CAAO,MAAA,CAAOA,WAAU,CAAC,CAAA,EAAA,EAAKzC,OAAAA,CAAM,IAAA,CAAK,SAAA,CAAU,MAAA,CAAO,QAAQ,CAAC,CAAC,KAAKA,OAAAA,CAAM,KAAA,CAAM,YAAY,MAAA,CAAO,QAAQ,CAAC,CAAC,CAAA,CAAE,CAAA;AACrI,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAKA,OAAAA,CAAM,GAAA,CAAI,QAAA,CAAI,OAAOyC,WAAU,CAAC,CAAC,CAAA,EAAA,EAAKzC,OAAAA,CAAM,GAAA,CAAI,SAAI,MAAA,CAAO,QAAQ,CAAC,CAAC,CAAA,EAAA,EAAKA,OAAAA,CAAM,GAAA,CAAI,QAAA,CAAI,MAAA,CAAO,QAAQ,CAAC,CAAC,CAAA,CAAE,CAAA;AAE5H,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,GAAG,MAAA,CAAO,MAAA,CAAO,aAAa,CAAA,EAAG,GAAG,MAAA,CAAO,MAAA,CAAO,eAAe,CAAC,CAAA;AAE5F,IAAA,KAAA,MAAW,QAAQ,WAAA,EAAa;AAC9B,MAAA,MAAM,OAAA,GAAU,aAAA,CAAc,IAAI,CAAA,IAAK,CAAA;AACvC,MAAA,MAAM,SAAA,GAAY,eAAA,CAAgB,IAAI,CAAA,IAAK,CAAA;AAE3C,MAAA,MAAM,UAAA,GAAa,SAAA,CAAU,OAAA,EAAS,QAAA,EAAU,QAAQ,CAAA;AACxD,MAAA,MAAM,YAAA,GAAe,SAAA,CAAU,SAAA,EAAW,QAAA,EAAU,QAAQ,CAAA;AAE5D,MAAA,MAAM,UAAA,GAAa,CAAA,EAAG,UAAA,CAAW,MAAA,CAAO,QAAQ,CAAC,CAAA,EAAG,OAAA,CAAQ,QAAA,EAAS,CAAE,QAAA,CAAS,UAAU,CAAC,CAAA,CAAA;AAC3F,MAAA,MAAM,YAAA,GAAe,CAAA,EAAG,YAAA,CAAa,MAAA,CAAO,QAAQ,CAAC,CAAA,EAAG,SAAA,CAAU,QAAA,EAAS,CAAE,QAAA,CAAS,UAAU,CAAC,CAAA,CAAA;AAEjG,MAAA,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAKA,OAAAA,CAAM,IAAI,IAAA,CAAK,MAAA,CAAOyC,WAAU,CAAC,CAAC,KAAKzC,OAAAA,CAAM,IAAA,CAAK,UAAU,CAAC,CAAA,EAAA,EAAKA,QAAM,KAAA,CAAM,YAAY,CAAC,CAAA,CAAE,CAAA;AAAA,IAChH;AACA,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,EAChB;AAGA,EAAA,MAAM,YAAA,GAAe,OAAO,OAAA,CAAQ,cAAc,EAC/C,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AACd,IAAA,MAAM,KAAA,GAAQsC,MAAAA,CAAM,CAAA,CAAE,CAAC,GAAG,UAAU,CAAA;AACpC,IAAA,MAAM,KAAA,GAAQA,MAAAA,CAAM,CAAA,CAAE,CAAC,GAAG,UAAU,CAAA;AACpC,IAAA,OAAO,KAAA,CAAM,KAAK,KAAK,CAAA;AAAA,EACzB,CAAC,CAAA,CACA,KAAA,CAAM,CAAA,EAAG,CAAC,CAAA;AAEb,EAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,IAAA,OAAA,CAAQ,GAAA,CAAItC,OAAAA,CAAM,IAAA,CAAK,4BAAqB,CAAC,CAAA;AAC7C,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,IAAA,MAAMyC,WAAAA,GAAa,EAAA;AACnB,IAAA,MAAM,QAAA,GAAW,EAAA;AACjB,IAAA,MAAM,UAAA,GAAa,CAAA;AACnB,IAAA,MAAM,WAAW,QAAA,GAAW,UAAA;AAE5B,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAK,OAAA,CAAQ,MAAA,CAAOA,WAAU,CAAC,CAAA,EAAA,EAAKzC,OAAAA,CAAM,OAAA,CAAQ,OAAA,CAAQ,MAAA,CAAO,QAAQ,CAAC,CAAC,CAAA,CAAE,CAAA;AACzF,IAAA,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAKA,OAAAA,CAAM,GAAA,CAAI,QAAA,CAAI,OAAOyC,WAAU,CAAC,CAAC,CAAA,EAAA,EAAKzC,QAAM,GAAA,CAAI,QAAA,CAAI,OAAO,QAAQ,CAAC,CAAC,CAAA,CAAE,CAAA;AAExF,IAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,GAAG,YAAA,CAAa,GAAA,CAAI,CAAC,GAAG,KAAK,CAAA,KAAM,KAAK,CAAC,CAAA;AACnE,IAAA,KAAA,MAAW,CAAC,KAAA,EAAO,KAAK,CAAA,IAAK,YAAA,EAAc;AACzC,MAAA,MAAM,GAAA,GAAM,SAAA,CAAU,KAAA,EAAO,QAAA,EAAU,QAAQ,CAAA;AAC/C,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAK,KAAA,CAAM,MAAA,CAAOyC,WAAU,CAAC,CAAA,EAAA,EAAKzC,OAAAA,CAAM,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,QAAQ,CAAC,CAAC,CAAA,EAAGA,OAAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,QAAA,GAAW,QAAA,CAAS,UAAU,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,IAC5I;AACA,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,EAChB;AAGA,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,MAAA,CAAO,CAAA,CAAA,KAAK;AAClC,IAAA,IAAI,CAAC,CAAA,CAAE,WAAA,CAAY,SAAA,EAAW,OAAO,KAAA;AACrC,IAAA,MAAM,SAAA,GAAYsC,MAAAA,CAAM,CAAA,CAAE,WAAA,CAAY,SAAS,CAAA;AAC/C,IAAA,OAAO,UAAU,OAAA,CAAQ,KAAA,CAAM,QAAA,CAAS,CAAA,EAAG,KAAK,CAAC,CAAA;AAAA,EACnD,CAAC,CAAA,CAAE,MAAA;AAEH,EAAA,MAAM,UAAA,GAAa,KAAA,CAAM,MAAA,CAAO,CAAA,CAAA,KAAK;AACnC,IAAA,IAAI,CAAC,CAAA,CAAE,WAAA,CAAY,SAAA,EAAW,OAAO,KAAA;AACrC,IAAA,MAAM,SAAA,GAAYA,MAAAA,CAAM,CAAA,CAAE,WAAA,CAAY,SAAS,CAAA;AAC/C,IAAA,OAAO,UAAU,OAAA,CAAQ,KAAA,CAAM,QAAA,CAAS,EAAA,EAAI,KAAK,CAAC,CAAA;AAAA,EACpD,CAAC,CAAA,CAAE,MAAA;AAEH,EAAA,OAAA,CAAQ,GAAA,CAAItC,OAAAA,CAAM,IAAA,CAAK,wBAAmB,CAAC,CAAA;AAC3C,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,EAAA,MAAM,UAAA,GAAa,EAAA;AACnB,EAAA,MAAM,UAAA,GAAa,CAAA;AAEnB,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,EAAA,EAAK,QAAA,CAAS,MAAA,CAAO,UAAU,CAAC,CAAA,EAAA,EAAK,OAAA,CAAQ,QAAA,CAAS,UAAU,CAAC,CAAA,CAAE,CAAA;AAC/E,EAAA,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAKA,OAAAA,CAAM,GAAA,CAAI,QAAA,CAAI,OAAO,UAAU,CAAC,CAAC,CAAA,EAAA,EAAKA,QAAM,GAAA,CAAI,QAAA,CAAI,OAAO,UAAU,CAAC,CAAC,CAAA,CAAE,CAAA;AAC1F,EAAA,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAK,aAAA,CAAc,MAAA,CAAO,UAAU,CAAC,CAAA,EAAA,EAAKA,OAAAA,CAAM,KAAA,CAAM,SAAA,CAAU,UAAS,CAAE,QAAA,CAAS,UAAU,CAAC,CAAC,CAAA,CAAE,CAAA;AAC9G,EAAA,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAK,cAAA,CAAe,MAAA,CAAO,UAAU,CAAC,CAAA,EAAA,EAAKA,OAAAA,CAAM,KAAA,CAAM,UAAA,CAAW,UAAS,CAAE,QAAA,CAAS,UAAU,CAAC,CAAC,CAAA,CAAE,CAAA;AAChH,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,EAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,IAAA,MAAM,WAAmE,EAAC;AAE1E,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,OAAA,GAAUsC,MAAAA,CAAM,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA;AAC9C,MAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAA;AAE3C,MAAA,IAAI,SAAA,IAAa,IAAA,CAAK,WAAA,CAAY,IAAA,EAAM;AACtC,QAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,WAAA,CAAY,IAAA,EAAM;AACvC,UAAA,IAAI,CAAC,QAAA,CAAS,GAAG,CAAA,EAAG,QAAA,CAAS,GAAG,CAAA,GAAI,EAAE,OAAA,EAAS,CAAA,EAAG,SAAA,EAAW,CAAA,EAAE;AAC/D,UAAA,QAAA,CAAS,GAAG,CAAA,CAAE,OAAA,EAAA;AAEd,UAAA,IAAI,IAAA,CAAK,YAAY,SAAA,EAAW;AAC9B,YAAA,MAAM,SAAA,GAAYA,MAAAA,CAAM,IAAA,CAAK,WAAA,CAAY,SAAS,CAAA;AAClD,YAAA,IAAI,SAAA,CAAU,OAAA,CAAQ,SAAS,CAAA,EAAG;AAChC,cAAA,QAAA,CAAS,GAAG,CAAA,CAAE,SAAA,EAAA;AAAA,YAChB;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,UAAA,GAAa,OAAO,OAAA,CAAQ,QAAQ,EACvC,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,CAAE,OAAA,GAAU,EAAE,CAAC,CAAA,CAAE,OAAO,CAAA,CAC1C,KAAA,CAAM,GAAG,EAAE,CAAA;AAEd,IAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,MAAA,OAAA,CAAQ,GAAA,CAAItC,OAAAA,CAAM,IAAA,CAAK,yBAAa,CAAC,CAAA;AACrC,MAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,UAAA,EAAY;AACrC,QAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,OAAAA,CAAM,GAAA,CAAI,GAAG,CAAC,CAAA,EAAG,GAAA,CAAI,MAAA,CAAO,EAAE,CAAC,IAAIA,OAAAA,CAAM,IAAA,CAAK,KAAA,CAAM,OAAO,CAAC,CAAA,cAAA,EAAcA,QAAM,KAAA,CAAM,KAAA,CAAM,SAAS,CAAC,CAAA,UAAA,CAAY,CAAA;AAAA,MACrI;AACA,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,IAChB;AAAA,EACF;AAGA,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,MAAM,gBAAwE,EAAC;AAE/E,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,IAAI,CAAC,IAAA,CAAK,WAAA,CAAY,QAAA,EAAU;AAEhC,MAAA,MAAM,OAAA,GAAUsC,MAAAA,CAAM,IAAA,CAAK,WAAA,CAAY,OAAO,CAAA;AAC9C,MAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAA;AAE3C,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,MAAM,QAAA,GAAW,KAAK,WAAA,CAAY,QAAA;AAClC,QAAA,IAAI,CAAC,aAAA,CAAc,QAAQ,CAAA,EAAG,aAAA,CAAc,QAAQ,CAAA,GAAI,EAAE,OAAA,EAAS,CAAA,EAAG,SAAA,EAAW,CAAA,EAAE;AACnF,QAAA,aAAA,CAAc,QAAQ,CAAA,CAAE,OAAA,EAAA;AAExB,QAAA,IAAI,IAAA,CAAK,YAAY,SAAA,EAAW;AAC9B,UAAA,MAAM,SAAA,GAAYA,MAAAA,CAAM,IAAA,CAAK,WAAA,CAAY,SAAS,CAAA;AAClD,UAAA,IAAI,SAAA,CAAU,OAAA,CAAQ,SAAS,CAAA,EAAG;AAChC,YAAA,aAAA,CAAc,QAAQ,CAAA,CAAE,SAAA,EAAA;AAAA,UAC1B;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAEA,IAAA,MAAM,kBAAkB,MAAA,CAAO,OAAA,CAAQ,aAAa,CAAA,CACjD,KAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,CAAC,CAAA,CAAE,OAAA,GAAU,CAAA,CAAE,CAAC,EAAE,OAAO,CAAA;AAE7C,IAAA,IAAI,eAAA,CAAgB,SAAS,CAAA,EAAG;AAC9B,MAAA,OAAA,CAAQ,GAAA,CAAItC,OAAAA,CAAM,IAAA,CAAK,uBAAgB,CAAC,CAAA;AACxC,MAAA,KAAA,MAAW,CAAC,QAAA,EAAU,KAAK,CAAA,IAAK,eAAA,EAAiB;AAC/C,QAAA,OAAA,CAAQ,GAAA,CAAI,KAAKA,OAAAA,CAAM,GAAA,CAAI,GAAG,CAAC,CAAA,EAAG,QAAA,CAAS,MAAA,CAAO,EAAE,CAAC,IAAIA,OAAAA,CAAM,IAAA,CAAK,KAAA,CAAM,OAAO,CAAC,CAAA,cAAA,EAAcA,QAAM,KAAA,CAAM,KAAA,CAAM,SAAS,CAAC,CAAA,UAAA,CAAY,CAAA;AAAA,MAC1I;AACA,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,IAChB;AAAA,EACF;AACF;ACxPA,IAAM,iBAAA,GAAoB,EAAA;AAC1B,IAAM,gBAAA,GAAmB,IAAA;AACzB,IAAM,WAAA,GAAc,IAAA;AAGpB,IAAM,eAAA,GAAkB,QAAA;AACxB,IAAM,cAAA,GAAiB,QAAA;AAEvB,IAAM6C,cAAAA,GAAsE;AAAA,EAC1E,OAAA,EAAS,EAAE,KAAA,EAAO,WAAA,EAAM,OAAO,MAAA,EAAO;AAAA,EACtC,aAAA,EAAe,EAAE,KAAA,EAAO,QAAA,EAAK,OAAO,QAAA,EAAS;AAAA,EAC7C,QAAA,EAAU,EAAE,KAAA,EAAO,QAAA,EAAK,OAAO,OAAA,EAAQ;AAAA,EACvC,QAAA,EAAU,EAAE,KAAA,EAAO,WAAA,EAAM,OAAO,MAAA;AAClC,CAAA;AAEA,IAAMC,gBAAAA,GAA0G;AAAA,EAC9G,QAAA,EAAU,EAAE,KAAA,EAAO,WAAA,EAAM,OAAO,UAAA,EAAY,OAAA,EAAS9C,QAAM,GAAA,EAAI;AAAA,EAC/D,IAAA,EAAM,EAAE,KAAA,EAAO,WAAA,EAAM,KAAA,EAAO,QAAQ,OAAA,EAASA,OAAAA,CAAM,GAAA,CAAI,SAAS,CAAA,EAAE;AAAA,EAClE,MAAA,EAAQ,EAAE,KAAA,EAAO,WAAA,EAAM,OAAO,QAAA,EAAU,OAAA,EAASA,QAAM,MAAA,EAAO;AAAA,EAC9D,GAAA,EAAK,EAAE,KAAA,EAAO,WAAA,EAAM,OAAO,KAAA,EAAO,OAAA,EAASA,QAAM,KAAA;AACnD,CAAA;AAKO,SAAS,YAAA,GAAwB;AACtC,EAAA,OAAO,IAAIC,OAAAA,CAAQ,OAAO,CAAA,CACvB,WAAA,CAAY,iCAAiC,CAAA,CAC7C,MAAA,CAAO,aAAA,EAAe,2BAAA,EAA6B,QAAQ,CAAA,CAC3D,MAAA,CAAO,mBAAmB,yBAAyB,CAAA,CACnD,MAAA,CAAO,iBAAA,EAAmB,yBAAyB,CAAA,CACnD,MAAA,CAAO,QAAA,EAAU,gBAAgB,CAAA,CACjC,MAAA,CAAO,OAAO,OAAA,KAAgG;AAC7G,IAAA,MAAM,UAAU,OAAO,CAAA;AAAA,EACzB,CAAC,CAAA;AACL;AAEA,eAAsB,UAAU,OAAA,EAKd;AAEhB,EAAA,MAAM,kBAAA,EAAmB;AAEzB,EAAA,MAAM,KAAA,GAAQ,QAAQ,KAAA,IAAS,CAAA;AAC/B,EAAA,MAAM,sBAAsB,KAAA,GAAQ,CAAA;AAGpC,EAAA,MAAM,QAAQ,MAAM,WAAA;AAAA,IAClB,kBAAA;AAAA,IACA,MAAM,YAAA,CAAa;AAAA,MACjB,eAAA,EAAiB;AAAA,KAClB;AAAA,GACH;AAEA,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,OAAA,CAAQ,IAAI,iBAAiB,CAAA;AAC7B,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,MAAA,CAAO,CAAA,IAAA,KAAQ;AAEzC,IAAA,IAAI,CAAC,OAAA,CAAQ,YAAA,IAAgB,IAAA,CAAK,WAAA,CAAY,WAAW,UAAA,EAAY;AACnE,MAAA,OAAO,KAAA;AAAA,IACT;AAEA,IAAA,OAAO,IAAA,CAAK,YAAY,MAAA,KAAW,UAAA;AAAA,EACrC,CAAC,CAAA;AAED,EAAA,IAAI,aAAA,CAAc,WAAW,CAAA,EAAG;AAC9B,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,OAAA,CAAQ,GAAA,CAAI,IAAA,CAAK,SAAA,CAAU,EAAE,KAAA,EAAO,EAAC,EAAG,KAAA,EAAM,EAAG,IAAA,EAAM,CAAC,CAAC,CAAA;AAAA,IAC3D,CAAA,MAAO;AACL,MAAA,OAAA,CAAQ,GAAA,CAAID,OAAAA,CAAM,GAAA,CAAI,wBAAwB,CAAC,CAAA;AAC/C,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,GAAA,CAAI,sDAAsD,CAAC,CAAA;AAAA,IAC/E;AACA,IAAA;AAAA,EACF;AAGA,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,MAAM,UAAA,GAAa;AAAA,MACjB,KAAA;AAAA,MACA,KAAA,EAAO,aAAA,CAAc,GAAA,CAAI,CAAA,IAAA,MAAS;AAAA,QAChC,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,MAAA,EAAQ,KAAK,WAAA,CAAY,MAAA;AAAA,QACzB,QAAA,EAAU,KAAK,WAAA,CAAY,QAAA;AAAA,QAC3B,OAAA,EAAS,KAAK,WAAA,CAAY,OAAA;AAAA,QAC1B,SAAA,EAAW,KAAK,WAAA,CAAY,SAAA;AAAA,QAC5B,GAAA,EAAK,KAAK,WAAA,CAAY,GAAA;AAAA,QACtB,SAAA,EAAW,KAAK,WAAA,CAAY;AAAA,OAC9B,CAAE;AAAA,KACJ;AACA,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,UAAA,EAAY,IAAA,EAAM,CAAC,CAAC,CAAA;AAC/C,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,YAAA,GAAiD;AAAA,IACrD,UAAU,EAAC;AAAA,IACX,MAAM,EAAC;AAAA,IACP,QAAQ,EAAC;AAAA,IACT,KAAK;AAAC,GACR;AAIA,EAAA,KAAA,MAAW,QAAQ,aAAA,EAAe;AAChC,IAAA,IAAI,KAAK,WAAA,CAAY,QAAA,IAAY,IAAA,CAAK,WAAA,CAAY,YAAY,YAAA,EAAc;AAC1E,MAAA,YAAA,CAAa,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA,CAAE,KAAK,IAAI,CAAA;AAAA,IACnD;AAEA,EACF;AAGA,EAAA,MAAM,SAAA,GAAY,CAAC+C,MAAAA,KAAsB;AACvC,IAAA,OAAO,CAAC,GAAGA,MAAK,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AAC/B,MAAA,MAAM,cAAc,EAAE,aAAA,EAAe,GAAG,SAAA,EAAW,CAAA,EAAG,YAAY,CAAA,EAAE;AACpE,MAAA,MAAM,MAAA,GAAS,WAAA,CAAY,CAAA,CAAE,WAAA,CAAY,MAAkC,CAAA,IAAK,CAAA;AAChF,MAAA,MAAM,MAAA,GAAS,WAAA,CAAY,CAAA,CAAE,WAAA,CAAY,MAAkC,CAAA,IAAK,CAAA;AAEhF,MAAA,IAAI,MAAA,KAAW,MAAA,EAAQ,OAAO,MAAA,GAAS,MAAA;AAEvC,MAAA,IAAI,EAAE,WAAA,CAAY,GAAA,IAAO,CAAC,CAAA,CAAE,WAAA,CAAY,KAAK,OAAO,EAAA;AACpD,MAAA,IAAI,CAAC,CAAA,CAAE,WAAA,CAAY,OAAO,CAAA,CAAE,WAAA,CAAY,KAAK,OAAO,CAAA;AACpD,MAAA,IAAI,CAAA,CAAE,WAAA,CAAY,GAAA,IAAO,CAAA,CAAE,YAAY,GAAA,EAAK;AAC1C,QAAA,OAAOT,MAAAA,CAAM,CAAA,CAAE,WAAA,CAAY,GAAG,CAAA,CAAE,KAAKA,MAAAA,CAAM,CAAA,CAAE,WAAA,CAAY,GAAG,CAAC,CAAA;AAAA,MAC/D;AAEA,MAAA,OAAO,CAAA;AAAA,IACT,CAAC,CAAA;AAAA,EACH,CAAA;AAGA,EAAA,MAAM,QAAQA,MAAAA,EAAM;AACpB,EAAA,MAAM,SAAA,GAAY,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA;AACtC,EAAA,MAAM,OAAA,GAAU,SAAA,CAAU,GAAA,CAAI,KAAA,EAAO,MAAM,CAAA;AAG3C,EAAA,MAAM,UAAA,GAAa,cAAc,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,WAAA,CAAY,MAAA,KAAW,aAAa,CAAA,CAAE,MAAA;AACrF,EAAA,MAAM,OAAA,GAAU,cAAc,MAAA,CAAO,CAAA,CAAA,KAAK,EAAE,WAAA,CAAY,MAAA,KAAW,SAAS,CAAA,CAAE,MAAA;AAC9E,EAAA,MAAM,UAAU,aAAA,CAAc,MAAA;AAAA,IAAO,CAAA,CAAA,KACnC,CAAA,CAAE,WAAA,CAAY,GAAA,IACdA,OAAM,CAAA,CAAE,WAAA,CAAY,GAAG,CAAA,CAAE,QAAA,CAAS,KAAK,CAAA,IACvC,CAAA,CAAE,YAAY,MAAA,KAAW;AAAA,GAC3B,CAAE,MAAA;AAGF,EAAA,OAAA,CAAQ,GAAA,CAAItC,OAAAA,CAAM,IAAA,CAAK,IAAA,CAAK,CAAA,uBAAA,EAAmB,KAAK,CAAA,YAAA,EAAe,SAAA,CAAU,MAAA,CAAO,aAAa,CAAC,CAAA,CAAA,CAAG,CAAC,CAAA;AACtG,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,EAAA,MAAM,UAAA,GAAa,MAAA,CAAO,MAAA,CAAO,iBAAiB,CAAA;AAClD,EAAA,MAAM,cAAA,GAAiB,UAAA;AACvB,EAAA,OAAA,CAAQ,GAAA,CAAI,UAAA,GAAa,gBAAA,GAAmB,cAAc,CAAA;AAG1D,EAAA,MAAM,gBAA0B,EAAC;AACjC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,EAAO,CAAA,EAAA,EAAK;AAC9B,IAAA,MAAM,IAAA,GAAO,SAAA,CAAU,GAAA,CAAI,CAAA,EAAG,MAAM,CAAA;AACpC,IAAA,MAAM,UAAU,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,CAAE,OAAO,CAAC,CAAA;AAC7C,IAAA,aAAA,CAAc,KAAK,OAAO,CAAA;AAAA,EAC5B;AACA,EAAA,MAAM,OAAA,GAAU,IAAI,MAAA,CAAO,iBAAiB,IAAI,gBAAA,GAAmB,aAAA,CAAc,KAAK,EAAE,CAAA;AACxF,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,GAAA,CAAI,OAAO,CAAC,CAAA;AAG9B,EAAA,MAAM,aAAA,GAAgB,QAAA,CAAI,MAAA,CAAO,iBAAiB,CAAA;AAClD,EAAA,MAAM,iBAAA,GAAoB,QAAA,CAAI,MAAA,CAAO,mBAAmB,CAAA;AACxD,EAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,GAAA,CAAI,aAAA,GAAgB,gBAAA,GAAmB,iBAAiB,CAAC,CAAA;AAG3E,EAAA,MAAM,eAAA,GAAkB,KAAA,CAAM,IAAA,CAAK,SAAA,EAAW,MAAM,CAAA;AACpD,EAAA,MAAM,iBAAiB,eAAA,GAAkB,CAAA;AACzC,EAAA,IAAI,WAAA,GAAc,GAAA,CAAI,MAAA,CAAO,iBAAiB,CAAA,GAAI,gBAAA;AAClD,EAAA,IAAI,cAAA,IAAkB,CAAA,IAAK,cAAA,GAAiB,mBAAA,EAAqB;AAC/D,IAAA,WAAA,IAAe,GAAA,CAAI,MAAA,CAAO,cAAc,CAAA,GAAI,cAAA;AAAA,EAC9C;AACA,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,GAAA,CAAI,WAAW,CAAC,CAAA;AAClC,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,EAAA,MAAM,UAAA,GAA6B,CAAC,UAAA,EAAY,MAAA,EAAQ,UAAU,KAAK,CAAA;AAEvE,EAAA,KAAA,MAAW,YAAY,UAAA,EAAY;AACjC,IAAA,MAAM,YAAA,GAAe,SAAA,CAAU,YAAA,CAAa,QAAQ,CAAC,CAAA;AAGrD,IAAA,IAAI,YAAA,CAAa,WAAW,CAAA,EAAG;AAC7B,MAAA;AAAA,IACF;AAEA,IAAA,MAAM,MAAA,GAAS8C,iBAAgB,QAAQ,CAAA;AAGvC,IAAA,OAAA,CAAQ,GAAA,CAAI,MAAA,CAAO,OAAA,CAAQ,CAAA,EAAG,MAAA,CAAO,KAAK,CAAA,CAAA,EAAI,MAAA,CAAO,KAAK,CAAA,EAAA,EAAK,YAAA,CAAa,MAAM,GAAG,CAAC,CAAA;AAGtF,IAAA,KAAA,MAAW,QAAQ,YAAA,EAAc;AAC/B,MAAA,aAAA,CAAc,IAAA,EAAM,SAAA,EAAW,OAAA,EAAS,KAAA,EAAO,KAAK,CAAA;AAAA,IACtD;AAEA,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,EAChB;AAGA,EAAA,MAAM,eAAyB,EAAC;AAChC,EAAA,IAAI,aAAa,CAAA,EAAG,YAAA,CAAa,IAAA,CAAK,CAAA,EAAG,UAAU,CAAA,YAAA,CAAc,CAAA;AACjE,EAAA,IAAI,UAAU,CAAA,EAAG,YAAA,CAAa,IAAA,CAAK,CAAA,EAAG,OAAO,CAAA,QAAA,CAAU,CAAA;AACvD,EAAA,IAAI,OAAA,GAAU,GAAG,YAAA,CAAa,IAAA,CAAK9C,QAAM,GAAA,CAAI,CAAA,EAAG,OAAO,CAAA,QAAA,CAAU,CAAC,CAAA;AAElE,EAAA,OAAA,CAAQ,GAAA,CAAIA,QAAM,IAAA,CAAK,WAAW,IAAI,YAAA,CAAa,IAAA,CAAK,QAAK,CAAC,CAAA;AAC9D,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,GAAA,CAAI,2EAAoE,CAAC,CAAA;AAC7F;AAEA,SAAS,aAAA,CACP,IAAA,EACA,SAAA,EACA,OAAA,EACA,OACA,KAAA,EACM;AACN,EAAA,MAAM,YAAA,GAAe6C,cAAAA,CAAc,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA;AAK1D,EAAA,MAAM,QAAQ,YAAA,CAAa,KAAA;AAC3B,EAAA,MAAM,gBAAgB,iBAAA,GAAoB,CAAA;AAC1C,EAAA,IAAI,WAAW,IAAA,CAAK,IAAA;AAGpB,EAAA,IAAI,QAAA,CAAS,SAAS,aAAA,EAAe;AACnC,IAAA,QAAA,GAAW,QAAA,CAAS,SAAA,CAAU,CAAA,EAAG,aAAA,GAAgB,CAAC,CAAA,GAAI,QAAA;AAAA,EACxD;AAEA,EAAA,MAAM,UAAA,GAAa,GAAG,WAAW,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,CAAG,MAAA,CAAO,iBAAiB,CAAA;AAGhF,EAAA,IAAI,cAAA;AAEJ,EAAA,IAAI,CAAC,IAAA,CAAK,WAAA,CAAY,GAAA,EAAK;AAEzB,IAAA,cAAA,GAAiB7C,OAAAA,CAAM,IAAI,mBAAmB,CAAA;AAAA,EAChD,CAAA,MAAO;AAEL,IAAA,cAAA,GAAiB,iBAAA,CAAkB,IAAA,EAAM,SAAA,EAAW,OAAA,EAAS,OAAO,KAAK,CAAA;AAAA,EAC3E;AAEA,EAAA,OAAA,CAAQ,GAAA,CAAI,UAAA,GAAa,gBAAA,GAAmB,cAAc,CAAA;AAC5D;AAEA,SAAS,iBAAA,CACP,IAAA,EACA,SAAA,EACA,OAAA,EACA,OACA,KAAA,EACQ;AACR,EAAA,MAAM,YAAA,GAAe,CAAA;AACrB,EAAA,MAAM,aAAa,KAAA,GAAQ,YAAA;AAE3B,EAAA,MAAM,GAAA,GAAMsC,MAAAA,CAAM,IAAA,CAAK,WAAA,CAAY,GAAI,CAAA;AACvC,EAAA,MAAM,SAAA,GAAY,KAAA;AAGlB,EAAA,MAAM,kBAAA,GAAqB,SAAA,CAAU,IAAA,CAAK,SAAA,EAAW,KAAK,CAAA;AAC1D,EAAA,MAAM,gBAAA,GAAmB,GAAA,CAAI,IAAA,CAAK,SAAA,EAAW,KAAK,CAAA;AAElD,EAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,KAAA,CAAO,kBAAA,GAAqB,CAAA,GAAK,YAAY,CAAC,CAAA;AAChF,EAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAO,gBAAA,GAAmB,IAAK,YAAY,CAAA;AAG/D,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,QAAQ,CAAA;AACrC,EAAA,MAAM,MAAA,GAAS,KAAK,GAAA,CAAI,UAAA,EAAY,KAAK,GAAA,CAAI,QAAA,EAAU,MAAM,CAAC,CAAA;AAC9D,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,CAAA,EAAG,SAAS,QAAQ,CAAA;AAG/C,EAAA,IAAI,MAAA,GAAS,EAAA;AAGb,EAAA,IAAI,WAAW,CAAA,EAAG;AAChB,IAAA,MAAA,IAAU,GAAA,CAAI,OAAO,QAAQ,CAAA;AAAA,EAC/B;AAGA,EAAA,IAAI,IAAA,CAAK,WAAA,CAAY,MAAA,KAAW,UAAA,EAAY;AAC1C,IAAA,MAAA,IAAUtC,OAAAA,CAAM,KAAA,CAAM,eAAA,CAAgB,MAAA,CAAO,SAAS,CAAC,CAAA;AAAA,EACzD,CAAA,MAAA,IAAW,IAAA,CAAK,WAAA,CAAY,MAAA,KAAW,aAAA,EAAe;AAEpD,IAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAM,SAAA,GAAY,CAAC,CAAA;AAC3C,IAAA,MAAA,IAAUA,OAAAA,CAAM,MAAA,CAAO,eAAA,CAAgB,MAAA,CAAO,UAAU,CAAC,CAAA;AACzD,IAAA,MAAA,IAAUA,QAAM,GAAA,CAAI,cAAA,CAAe,MAAA,CAAO,SAAA,GAAY,UAAU,CAAC,CAAA;AAAA,EACnE,CAAA,MAAO;AAEL,IAAA,MAAA,IAAUA,OAAAA,CAAM,GAAA,CAAI,cAAA,CAAe,MAAA,CAAO,SAAS,CAAC,CAAA;AAAA,EACtD;AAGA,EAAA,MAAM,gBAAgB,UAAA,GAAa,MAAA;AACnC,EAAA,IAAI,gBAAgB,CAAA,EAAG;AACrB,IAAA,MAAA,IAAU,GAAA,CAAI,OAAO,aAAa,CAAA;AAAA,EACpC;AAEA,EAAA,OAAO,MAAA;AACT;ACrSO,SAAS,aAAA,CAAc,QAAA,EAAmB,OAAA,GAAyB,EAAC,EAA4B;AACrG,EAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,IAAA,OAAO,eAAA,CAAgB,UAAU,OAAO,CAAA;AAAA,EAC1C;AAEA,EAAA,OAAO,IAAIC,OAAAA,CAAQ,QAAQ,CAAA,CACxB,YAAY,oDAAoD,CAAA,CAChE,QAAA,CAAS,QAAA,EAAU,qCAAqC,CAAA,CACxD,MAAA,CAAO,YAAA,EAAc,mDAAmD,EACxE,MAAA,CAAO,qBAAA,EAAuB,4CAA4C,CAAA,CAC1E,MAAA,CAAO,OAAA,EAAS,yCAAyC,CAAA,CACzD,OAAO,mBAAA,EAAqB,gDAAgD,CAAA,CAC5E,MAAA,CAAO,UAAU,gBAAgB,CAAA,CACjC,MAAA,CAAO,OAAO,aAAiC,IAAA,KAAwB;AACtE,IAAA,IAAI,WAAA,EAAa;AACf,MAAA,MAAM,eAAA,CAAgB,aAAa,IAAI,CAAA;AAAA,IACzC,CAAA,MAAO;AACL,MAAA,MAAM,iBAAiB,IAAI,CAAA;AAAA,IAC7B;AAAA,EACF,CAAC,CAAA;AACL;AAKA,eAAsB,eAAA,CAAgB,QAAA,EAAkB,OAAA,GAAyB,EAAC,EAAkB;AAClG,EAAA,MAAM,kBAAA,EAAmB;AAEzB,EAAA,MAAM,OAAA,GAAU,IAAI,YAAA,EAAa;AAEjC,EAAA,IAAI;AAEF,IAAA,MAAM,MAAA,GAAS,MAAM,UAAA,EAAW;AAChC,IAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AACxB,IAAA,MAAM,QAAA,GAAgB+C,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,MAAA,CAAO,QAAQ,CAAA;AAC/C,IAAA,MAAM,YAAA,GAAe,MAAM,eAAA,CAAgB,QAAA,EAAU,KAAK,QAAQ,CAAA;AAElE,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,iBAAA,CAAkB,QAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,IAClE;AAGA,IAAA,MAAM,QAAA,GAAgBA,gBAAS,YAAY,CAAA;AAG3C,IAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,SAAA,CAAU,YAAA,EAAc;AAAA,MACnD,UAAU,OAAA,CAAQ,QAAA;AAAA,MAClB,iBAAiB,OAAA,CAAQ;AAAA,KAC1B,CAAA;AAGD,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,SAAA,CAAU;AAAA,QACzB,IAAA,EAAM,QAAA;AAAA,QACN,IAAA,EAAM,YAAA;AAAA,QACN,GAAG;AAAA,OACL,EAAG,IAAA,EAAM,CAAC,CAAC,CAAA;AACX,MAAA;AAAA,IACF;AAGA,IAAA,OAAA,CAAQ,IAAIhD,OAAAA,CAAM,IAAA,CAAK,KAAK,CAAA,uBAAA,EAAmB,QAAQ,EAAE,CAAC,CAAA;AAC1D,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,wBAAA,CAAyB,MAAA,CAAO,KAAK,CAAA;AAChE,IAAA,MAAM,UAAA,GAAa,UAAA,CAAW,KAAA,KAAU,WAAA,GAAc,QAAA,GACpC,UAAA,CAAW,KAAA,KAAU,MAAA,GAAS,WAAA,GAC9B,UAAA,CAAW,KAAA,KAAU,SAAA,GAAY,cAAA,GAAO,WAAA;AAE1D,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,SAAA,EAAYA,OAAAA,CAAM,IAAA,CAAK,MAAA,CAAO,KAAA,CAAM,cAAA,EAAgB,CAAC,CAAA,QAAA,EAAW,UAAU,CAAA,CAAE,CAAA;AACxF,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,IAAA,IAAI,MAAA,CAAO,KAAA,CAAM,MAAA,GAAS,CAAA,IAAK,QAAQ,QAAA,EAAU;AAC/C,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,QAAQ,CAAC,CAAA;AAChC,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,MAAA,KAAA,MAAW,IAAA,IAAQ,OAAO,KAAA,EAAO;AAC/B,QAAA,MAAM,QAAA,GAAW,KAAK,KAAA,GAAQA,OAAAA,CAAM,IAAI,CAAA,EAAA,EAAK,IAAA,CAAK,KAAK,CAAA,OAAA,CAAS,CAAA,GAAI,EAAA;AACpE,QAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,IAAA,CAAK,IAAA,CAAK,OAAO,EAAE,CAAC,KAAKA,OAAAA,CAAM,IAAA,CAAK,KAAK,MAAA,CAAO,cAAA,GAAiB,QAAA,CAAS,CAAC,CAAC,CAAC,CAAA,OAAA,EAAU,QAAQ,CAAA,CAAE,CAAA;AAAA,MACpH;AACA,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,IAChB;AAGA,IAAA,IAAI,OAAA,CAAQ,QAAA,IAAY,MAAA,CAAO,SAAA,EAAW;AACxC,MAAA,MAAM,IAAI,MAAA,CAAO,SAAA;AACjB,MAAA,MAAM,QAAQ,CAAA,CAAE,IAAA,GAAO,EAAE,KAAA,GAAQ,CAAA,CAAE,SAAS,CAAA,CAAE,WAAA;AAE9C,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,oBAAoB,CAAC,CAAA;AAC5C,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,cAAA,EAAiBA,OAAAA,CAAM,IAAA,CAAK,CAAA,CAAE,MAAM,cAAA,EAAe,CAAE,QAAA,CAAS,CAAC,CAAC,CAAC,YAAYA,OAAAA,CAAM,GAAA,CAAI,CAAA,CAAA,EAAI,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,KAAA,GAAQ,KAAA,GAAQ,GAAG,CAAC,CAAA,EAAA,CAAI,CAAC,CAAA,CAAE,CAAA;AAC/I,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,cAAA,EAAiBA,OAAAA,CAAM,IAAA,CAAK,CAAA,CAAE,KAAK,cAAA,EAAe,CAAE,QAAA,CAAS,CAAC,CAAC,CAAC,YAAYA,OAAAA,CAAM,GAAA,CAAI,CAAA,CAAA,EAAI,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,IAAA,GAAO,KAAA,GAAQ,GAAG,CAAC,CAAA,EAAA,CAAI,CAAC,CAAA,CAAE,CAAA;AAC7I,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,cAAA,EAAiBA,OAAAA,CAAM,IAAA,CAAK,CAAA,CAAE,OAAO,cAAA,EAAe,CAAE,QAAA,CAAS,CAAC,CAAC,CAAC,YAAYA,OAAAA,CAAM,GAAA,CAAI,CAAA,CAAA,EAAI,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,MAAA,GAAS,KAAA,GAAQ,GAAG,CAAC,CAAA,EAAA,CAAI,CAAC,CAAA,CAAE,CAAA;AACjJ,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,cAAA,EAAiBA,OAAAA,CAAM,IAAA,CAAK,CAAA,CAAE,YAAY,cAAA,EAAe,CAAE,QAAA,CAAS,CAAC,CAAC,CAAC,YAAYA,OAAAA,CAAM,GAAA,CAAI,CAAA,CAAA,EAAI,IAAA,CAAK,KAAA,CAAM,CAAA,CAAE,WAAA,GAAc,KAAA,GAAQ,GAAG,CAAC,CAAA,EAAA,CAAI,CAAC,CAAA,CAAE,CAAA;AAC3J,MAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,IAChB;AAGA,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,yBAAyB,CAAC,CAAA;AACjD,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,IAAA,MAAM,SAAA,GAAY,UAAA,CAAW,cAAA,GAAiB,CAAA,GAAIA,OAAAA,CAAM,KAAA,GACvC,UAAA,CAAW,cAAA,GAAiB,CAAA,GAAIA,OAAAA,CAAM,MAAA,GACtCA,OAAAA,CAAM,GAAA;AACvB,IAAA,MAAM,kBAAA,GAAqB,UAAA,CAAW,aAAA,IAAiB,EAAA,GAAKA,OAAAA,CAAM,KAAA,GACxC,UAAA,CAAW,aAAA,IAAiB,EAAA,GAAKA,OAAAA,CAAM,MAAA,GACvCA,OAAAA,CAAM,GAAA;AAEhC,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,oBAAA,EAAuB,SAAA,CAAU,CAAA,EAAG,UAAA,CAAW,cAAc,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,EAAIA,OAAAA,CAAM,GAAA,CAAI,yBAAyB,CAAC,CAAA,CAAE,CAAA;AACvH,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,oBAAA,EAAuB,kBAAA,CAAmB,CAAA,CAAA,EAAI,UAAA,CAAW,aAAa,CAAA,CAAA,CAAG,CAAC,CAAA,CAAA,EAAIA,OAAAA,CAAM,GAAA,CAAI,cAAc,CAAC,CAAA,CAAE,CAAA;AACrH,IAAA,OAAA,CAAQ,IAAI,CAAA,oBAAA,EAAuB,UAAU,CAAA,CAAA,EAAI,UAAA,CAAW,cAAc,CAAA,CAAE,CAAA;AAC5E,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,IAAA,IAAI,CAAC,OAAA,CAAQ,eAAA,IAAmB,MAAA,CAAO,KAAA,CAAM,WAAW,CAAA,EAAG;AACzD,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,GAAA,CAAI,iEAA0D,CAAC,CAAA;AAAA,IACnF;AAAA,EACF,CAAA,SAAE;AACA,IAAA,OAAA,CAAQ,OAAA,EAAQ;AAAA,EAClB;AACF;AAKA,eAAsB,gBAAA,CAAiB,OAAA,GAAyB,EAAC,EAAkB;AACjF,EAAA,MAAM,kBAAA,EAAmB;AAGzB,EAAA,MAAM,QAAQ,MAAM,WAAA;AAAA,IAClB,kBAAA;AAAA,IACA,MAAM,YAAA,CAAa,EAAE,eAAA,EAAiB,OAAO;AAAA,GAC/C;AAEA,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,OAAA,CAAQ,IAAI,iBAAiB,CAAA;AAC7B,IAAA;AAAA,EACF;AAGA,EAAA,MAAM,OAAA,GAAU,IAAI,YAAA,EAAa;AACjC,EAAA,MAAM,UAMD,EAAC;AAEN,EAAA,IAAI;AACF,IAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,MAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,SAAA,CAAU,KAAK,QAAA,EAAU;AAAA,QACpD,iBAAiB,OAAA,CAAQ;AAAA,OAC1B,CAAA;AAED,MAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,wBAAA,CAAyB,MAAA,CAAO,KAAK,CAAA;AAChE,MAAA,MAAM,UAAA,GAAa,MAAA,CAAO,KAAA,CAAM,MAAA,CAAO,CAAC,GAAA,EAAa,CAAA,KAA0B,GAAA,IAAO,CAAA,CAAE,KAAA,IAAS,CAAA,CAAA,EAAI,CAAC,CAAA;AAEtG,MAAA,OAAA,CAAQ,IAAA,CAAK;AAAA,QACX,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,MAAM,IAAA,CAAK,QAAA;AAAA,QACX,QAAQ,MAAA,CAAO,KAAA;AAAA,QACf,KAAA,EAAO,UAAA;AAAA,QACP,OAAO,UAAA,CAAW;AAAA,OACnB,CAAA;AAAA,IACH;AAAA,EACF,CAAA,SAAE;AACA,IAAA,OAAA,CAAQ,OAAA,EAAQ;AAAA,EAClB;AAGA,EAAA,MAAM,MAAA,GAAS,QAAQ,MAAA,IAAU,QAAA;AACjC,EAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM;AACrB,IAAA,IAAI,MAAA,KAAW,QAAA,EAAU,OAAO,CAAA,CAAE,SAAS,CAAA,CAAE,MAAA;AAC7C,IAAA,IAAI,MAAA,KAAW,OAAA,EAAS,OAAO,CAAA,CAAE,QAAQ,CAAA,CAAE,KAAA;AAC3C,IAAA,OAAO,CAAA,CAAE,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAA;AAAA,EACpC,CAAC,CAAA;AAGD,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,OAAA,EAAS,IAAA,EAAM,CAAC,CAAC,CAAA;AAC5C,IAAA;AAAA,EACF;AAGA,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,IAAA,CAAK,wBAAiB,CAAC,CAAA;AAC9C,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,GAAA,CAAI,CAAA,WAAA,EAAc,MAAM,EAAE,CAAC,CAAA;AAC7C,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,EAAA,MAAM,WAAA,GAAc,QAAQ,MAAA,CAAO,CAAC,KAAK,CAAA,KAAM,GAAA,GAAM,CAAA,CAAE,MAAA,EAAQ,CAAC,CAAA;AAChE,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,WAAA,GAAc,QAAQ,MAAM,CAAA;AACzD,EAAA,MAAM,YAAA,GAAe,OAAA,CAAQ,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,UAAU,SAAA,IAAa,CAAA,CAAE,KAAA,KAAU,SAAS,CAAA,CAAE,MAAA;AAGzF,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,UAAU,CAAC,CAAA;AAClC,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,IAAI,CAAA,kBAAA,EAAqBA,OAAAA,CAAM,KAAK,OAAA,CAAQ,MAAM,CAAC,CAAA,CAAE,CAAA;AAC7D,EAAA,OAAA,CAAQ,GAAA,CAAI,qBAAqBA,OAAAA,CAAM,IAAA,CAAK,YAAY,cAAA,EAAgB,CAAC,CAAA,CAAE,CAAA;AAC3E,EAAA,OAAA,CAAQ,GAAA,CAAI,qBAAqBA,OAAAA,CAAM,IAAA,CAAK,UAAU,cAAA,EAAgB,CAAC,CAAA,CAAE,CAAA;AAEzE,EAAA,IAAI,eAAe,CAAA,EAAG;AACpB,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,kBAAA,EAAqBA,OAAAA,CAAM,MAAA,CAAO,YAAY,CAAC,CAAA,OAAA,EAAUA,OAAAA,CAAM,GAAA,CAAI,8BAAa,CAAC,CAAA,CAAE,CAAA;AAAA,EACjG;AACA,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,EAAA,MAAM,OAAA,GAAU,EAAA;AAChB,EAAA,MAAM,SAAA,GAAY,EAAA;AAClB,EAAA,MAAM,QAAA,GAAW,CAAA;AAEjB,EAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,IAAA;AAAA,IAChB,MAAA,CAAO,MAAA,CAAO,OAAO,CAAA,GACrB,QAAA,CAAS,QAAA,CAAS,SAAS,CAAA,GAC3B,OAAA,CAAQ,QAAA,CAAS,QAAQ,CAAA,GACzB;AAAA,GACD,CAAA;AACD,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,GAAA,CAAI,QAAA,CAAI,MAAA,CAAO,UAAU,SAAA,GAAY,QAAA,GAAW,EAAE,CAAC,CAAC,CAAA;AAGtE,EAAA,MAAM,YAAA,GAAe,QAAQ,GAAA,GAAM,OAAA,CAAQ,SAAS,IAAA,CAAK,GAAA,CAAI,EAAA,EAAI,OAAA,CAAQ,MAAM,CAAA;AAE/E,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,YAAA,EAAc,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,CAAA,GAAI,QAAQ,CAAC,CAAA;AACnB,IAAA,MAAM,KAAA,GAAQ,CAAA,CAAE,KAAA,KAAU,WAAA,GAAc,QAAA,GAC3B,CAAA,CAAE,KAAA,KAAU,MAAA,GAAS,WAAA,GACrB,CAAA,CAAE,KAAA,KAAU,SAAA,GAAY,cAAA,GAAO,WAAA;AAE5C,IAAA,MAAM,WAAA,GAAc,CAAA,CAAE,KAAA,KAAU,WAAA,IAAe,EAAE,KAAA,KAAU,MAAA,GAASA,OAAAA,CAAM,IAAA,GACvD,CAAA,CAAE,KAAA,KAAU,SAAA,GAAYA,OAAAA,CAAM,SAC9BA,OAAAA,CAAM,GAAA;AAEzB,IAAA,MAAM,IAAA,GAAO,CAAA,CAAE,IAAA,CAAK,MAAA,GAAS,UAAU,CAAA,GAAI,CAAA,CAAE,IAAA,CAAK,SAAA,CAAU,CAAA,EAAG,OAAA,GAAU,CAAC,CAAA,GAAI,WAAM,CAAA,CAAE,IAAA;AAEtF,IAAA,OAAA,CAAQ,GAAA;AAAA,MACN,IAAA,CAAK,MAAA,CAAO,OAAO,CAAA,GACnB,WAAA,CAAY,EAAE,MAAA,CAAO,cAAA,EAAe,CAAE,QAAA,CAAS,SAAS,CAAC,IACzDA,OAAAA,CAAM,GAAA,CAAI,CAAA,CAAE,KAAA,CAAM,QAAA,EAAS,CAAE,SAAS,QAAQ,CAAC,CAAA,GAC/C,CAAA,EAAA,EAAK,KAAK,CAAA;AAAA,KACZ;AAAA,EACF;AAEA,EAAA,IAAI,OAAA,CAAQ,SAAS,YAAA,EAAc;AACjC,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,IAAA,OAAA,CAAQ,GAAA,CAAIA,QAAM,GAAA,CAAI,CAAA,QAAA,EAAW,QAAQ,MAAA,GAAS,YAAY,aAAa,CAAC,CAAA;AAC5E,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,GAAA,CAAI,CAAA,2BAAA,CAA6B,CAAC,CAAA;AAAA,EACtD;AAEA,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,GAAA,CAAI,iHAAoF,CAAC,CAAA;AAC3G,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAChB;AC3PO,SAAS,cAAA,GAA0B;AACxC,EAAA,OAAO,IAAIC,QAAQ,SAAS,CAAA,CACzB,YAAY,kDAAkD,CAAA,CAC9D,QAAA,CAAS,QAAA,EAAU,iBAAiB,CAAA,CACpC,OAAO,QAAA,EAAU,8BAA8B,EAC/C,MAAA,CAAO,WAAA,EAAa,oCAAoC,CAAA,CACxD,MAAA,CAAO,OAAO,QAAA,EAAkB,OAAA,KAAmD;AAClF,IAAA,MAAM,WAAA,CAAY,UAAU,OAAO,CAAA;AAAA,EACrC,CAAC,CAAA;AACL;AA2CA,eAAsB,WAAA,CAAY,QAAA,EAAkB,OAAA,GAA0B,EAAC,EAAkB;AAC/F,EAAA,MAAM,kBAAA,EAAmB;AAEzB,EAAA,MAAM,OAAA,GAAU,IAAI,YAAA,EAAa;AAEjC,EAAA,IAAI;AAEF,IAAA,MAAM,MAAA,GAAS,MAAM,UAAA,EAAW;AAChC,IAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AACxB,IAAA,MAAM,QAAA,GAAgBgD,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,MAAA,CAAO,QAAQ,CAAA;AAC/C,IAAA,MAAM,YAAA,GAAe,MAAM,eAAA,CAAgB,QAAA,EAAU,KAAK,QAAQ,CAAA;AAElE,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,iBAAA,CAAkB,QAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,IAClE;AAGA,IAAA,MAAM,QAAA,GAAgBA,gBAAS,YAAY,CAAA;AAC3C,IAAA,MAAM,UAAA,GAAkBA,MAAA,CAAA,IAAA,CAAK,YAAA,EAAc,WAAW,CAAA;AACtD,IAAA,MAAM,OAAA,GAAU,MAAMC,QAAAA,CAAS,UAAA,EAAY,OAAO,CAAA;AAGlD,IAAA,MAAM,SAAA,GAAY,yBAAyB,OAAO,CAAA;AAGlD,IAAA,MAAM,WAAA,GAAc,MAAM,OAAA,CAAQ,SAAA,CAAU,YAAA,EAAc;AAAA,MACxD,QAAA,EAAU,IAAA;AAAA,MACV,eAAA,EAAiB;AAAA;AAAA,KAClB,CAAA;AAGD,IAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,wBAAA,CAAyB,WAAA,CAAY,KAAK,CAAA;AAGrE,IAAA,MAAM,kBAAA,GAAqB,MAAM,OAAA,CAAQ,GAAA;AAAA,MACvC,SAAA,CAAU,WAAA,CAAY,GAAA,CAAI,OAAO,OAAA,KAAY;AAC3C,QAAA,MAAM,cAAA,GAAiB,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,CAAE,KAAA,CAAM,OAAA,CAAQ,SAAA,GAAY,CAAA,EAAG,OAAA,CAAQ,OAAO,CAAA,CAAE,KAAK,IAAI,CAAA;AAClG,QAAA,MAAM,aAAA,GAAgB,MAAM,OAAA,CAAQ,oBAAA,CAAqB,cAAc,CAAA;AAEvE,QAAA,OAAO;AAAA,UACL,SAAS,OAAA,CAAQ,KAAA;AAAA,UACjB,OAAO,OAAA,CAAQ,KAAA;AAAA,UACf,SAAA,EAAW,CAAC,OAAA,CAAQ,SAAA,EAAW,QAAQ,OAAO,CAAA;AAAA,UAC9C,MAAA,EAAQ,aAAA;AAAA,UACR,aAAa,OAAA,CAAQ,WAAA,CAAY,GAAA,CAAI,CAAA,CAAA,KAAK,EAAE,KAAK;AAAA,SACnD;AAAA,MACF,CAAC;AAAA,KACH;AAGA,IAAA,MAAM,iBAAiB,sBAAA,CAAuB,WAAA,CAAY,KAAA,EAAO,SAAA,EAAW,WAAW,KAAK,CAAA;AAG5F,IAAA,MAAM,MAAA,GAAwB;AAAA,MAC5B,IAAA,EAAM,QAAA;AAAA,MACN,IAAA,EAAM,YAAA;AAAA,MACN,OAAA,EAAS;AAAA,QACP,QAAQ,WAAA,CAAY,KAAA;AAAA,QACpB,OAAO,SAAA,CAAU,KAAA;AAAA,QACjB,YAAY,OAAA,CAAQ,MAAA;AAAA,QACpB,UAAU,SAAA,CAAU,eAAA;AAAA,QACpB,YAAY,SAAA,CAAU,UAAA;AAAA,QACtB,YAAY,SAAA,CAAU;AAAA,OACxB;AAAA,MACA,SAAA,EAAW;AAAA,QACT,QAAQ,UAAA,CAAW,KAAA;AAAA,QACnB,KAAA,EAAO,iBAAA,CAAkB,UAAA,CAAW,KAAK,CAAA;AAAA,QACzC,SAAS,UAAA,CAAW;AAAA,OACtB;AAAA,MACA,SAAA,EAAW,kBAAA;AAAA,MACX;AAAA,KACF;AAGA,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAC,CAAA;AAC3C,MAAA;AAAA,IACF;AAGA,IAAA,eAAA,CAAgB,MAAA,EAAQ,QAAQ,OAAO,CAAA;AAAA,EAEzC,CAAA,SAAE;AACA,IAAA,OAAA,CAAQ,OAAA,EAAQ;AAAA,EAClB;AACF;AAKA,SAAS,sBAAA,CACP,MAAA,EACA,SAAA,EACA,KAAA,EACiC;AAEjC,EAAA,IAAI,SAAS,GAAA,EAAM;AACjB,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,MAAA;AAAA,MACR,MAAA,EAAQ,sCAAA;AAAA,MACR,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAGA,EAAA,IAAI,SAAS,IAAA,EAAM;AACjB,IAAA,OAAO;AAAA,MACL,MAAA,EAAQ,SAAA;AAAA,MACR,MAAA,EAAQ,6CAAA;AAAA,MACR,UAAA,EAAY;AAAA,KACd;AAAA,EACF;AAGA,EAAA,IAAI,SAAS,GAAA,EAAM;AAEjB,IAAA,MAAM,OAAA,GAAU,UAAU,eAAA,CAAgB,EAAA;AAE1C,IAAA,IAAI,WAAW,CAAA,EAAG;AAChB,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,OAAA;AAAA,QACR,MAAA,EAAQ,sCAAsC,OAAO,CAAA,SAAA,CAAA;AAAA,QACrD,UAAA,EAAY;AAAA,OACd;AAAA,IACF,CAAA,MAAO;AACL,MAAA,OAAO;AAAA,QACL,MAAA,EAAQ,OAAA;AAAA,QACR,MAAA,EAAQ,+BAAA;AAAA,QACR,UAAA,EAAY;AAAA,OACd;AAAA,IACF;AAAA,EACF;AAGA,EAAA,OAAO;AAAA,IACL,MAAA,EAAQ,OAAA;AAAA,IACR,MAAA,EAAQ,+CAAA;AAAA,IACR,UAAA,EAAY;AAAA,GACd;AACF;AAKA,SAAS,kBAAkB,KAAA,EAAuB;AAChD,EAAA,QAAQ,KAAA;AAAO,IACb,KAAK,WAAA;AAAa,MAAA,OAAO,GAAA;AAAA,IACzB,KAAK,MAAA;AAAQ,MAAA,OAAO,IAAA;AAAA,IACpB,KAAK,SAAA;AAAW,MAAA,OAAO,GAAA;AAAA,IACvB,KAAK,SAAA;AAAW,MAAA,OAAO,GAAA;AAAA,IACvB;AAAS,MAAA,OAAO,GAAA;AAAA;AAEpB;AAKA,SAAS,eAAA,CAAgB,QAAuB,OAAA,EAAyB;AACvE,EAAA,OAAA,CAAQ,GAAA,CAAIlD,QAAM,IAAA,CAAK,IAAA,CAAK,4BAAqB,MAAA,CAAO,IAAI,EAAE,CAAC,CAAA;AAC/D,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,EAAA,MAAM,WAAA,GAAc,MAAA,CAAO,SAAA,CAAU,MAAA,KAAW,cAAc,QAAA,GAC3C,MAAA,CAAO,SAAA,CAAU,MAAA,KAAW,SAAS,WAAA,GACrC,MAAA,CAAO,SAAA,CAAU,MAAA,KAAW,YAAY,cAAA,GAAO,WAAA;AAElE,EAAA,MAAM,aAAa,MAAA,CAAO,SAAA,CAAU,MAAA,KAAW,WAAA,IAAe,OAAO,SAAA,CAAU,MAAA,KAAW,MAAA,GAASA,OAAAA,CAAM,OACvF,MAAA,CAAO,SAAA,CAAU,WAAW,SAAA,GAAYA,OAAAA,CAAM,SAC9CA,OAAAA,CAAM,GAAA;AAExB,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,cAAc,CAAA,EAAG,UAAA,CAAW,MAAA,CAAO,OAAA,CAAQ,MAAA,CAAO,cAAA,EAAgB,CAAA,EAAG,UAAU,WAAW,CAAA;AACjH,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,GAAA,CAAI,CAAA,aAAA,EAAgB,MAAA,CAAO,UAAU,KAAA,CAAM,cAAA,EAAgB,CAAA,OAAA,CAAS,CAAC,CAAA;AACvF,EAAA,OAAA,CAAQ,GAAA,CAAIA,QAAM,GAAA,CAAI,CAAA,UAAA,EAAa,OAAO,SAAA,CAAU,OAAO,EAAE,CAAC,CAAA;AAC9D,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,YAAY,CAAC,CAAA;AACpC,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,SAAA,EAAYA,OAAAA,CAAM,IAAA,CAAK,MAAA,CAAO,QAAQ,KAAA,CAAM,cAAA,EAAgB,CAAC,CAAA,CAAE,CAAA;AAC3E,EAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,YAAA,EAAeA,OAAAA,CAAM,IAAA,CAAK,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,KAAK,CAAC,CAAA,KAAA,EAAQ,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,EAAE,CAAA,KAAA,EAAQ,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,EAAE,CAAA,KAAA,EAAQ,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,EAAE,CAAA,KAAA,EAAQ,MAAA,CAAO,OAAA,CAAQ,QAAA,CAAS,EAAE,CAAA,CAAA,CAAG,CAAA;AAC/M,EAAA,OAAA,CAAQ,GAAA,CAAI,kBAAkBA,OAAAA,CAAM,IAAA,CAAK,OAAO,OAAA,CAAQ,UAAU,CAAC,CAAA,CAAE,CAAA;AACrE,EAAA,OAAA,CAAQ,GAAA,CAAI,kBAAkBA,OAAAA,CAAM,IAAA,CAAK,OAAO,OAAA,CAAQ,UAAU,CAAC,CAAA,OAAA,CAAS,CAAA;AAC5E,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,EAAA,IAAI,OAAA,IAAW,MAAA,CAAO,SAAA,CAAU,MAAA,GAAS,CAAA,EAAG;AAC1C,IAAA,MAAM,WAAA,GAAc,OAAO,SAAA,CACxB,MAAA,CAAO,OAAK,CAAA,CAAE,KAAA,IAAS,CAAC,CAAA,CACxB,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,MAAA,GAAS,CAAA,CAAE,MAAM,CAAA,CAClC,KAAA,CAAM,GAAG,CAAC,CAAA;AAEb,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,uBAAuB,CAAC,CAAA;AAC/C,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,IAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,WAAA,CAAY,QAAQ,CAAA,EAAA,EAAK;AAC3C,MAAA,MAAM,CAAA,GAAI,YAAY,CAAC,CAAA;AACvB,MAAA,MAAM,UAAA,GAAa,KAAK,KAAA,CAAO,CAAA,CAAE,SAAS,MAAA,CAAO,OAAA,CAAQ,SAAU,GAAG,CAAA;AACtE,MAAA,MAAM,MAAA,GAAS,IAAA,CAAK,MAAA,CAAO,CAAA,CAAE,QAAQ,CAAC,CAAA;AAEtC,MAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,CAAA,GAAI,CAAC,KAAK,MAAM,CAAA,EAAG,CAAA,CAAE,OAAO,CAAA,CAAE,CAAA;AAC/C,MAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,KAAA,EAAQA,OAAAA,CAAM,IAAA,CAAK,CAAA,CAAE,MAAA,CAAO,cAAA,EAAgB,CAAC,CAAA,UAAA,EAAa,CAAA,CAAE,SAAA,CAAU,CAAC,IAAI,CAAA,CAAE,SAAA,CAAU,CAAC,CAAA,GAAI,CAAC,CAAA,OAAA,EAAUA,OAAAA,CAAM,GAAA,CAAI,CAAA,CAAA,EAAI,UAAU,CAAA,EAAA,CAAI,CAAC,CAAA,CAAE,CAAA;AAClJ,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,GAAA,CAAI,CAAA,WAAA,EAAc,EAAE,SAAA,CAAU,CAAC,CAAC,CAAA,CAAA,EAAI,CAAA,CAAE,SAAA,CAAU,CAAC,CAAC,EAAE,CAAC,CAAA;AAAA,IACzE;AACA,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,EAChB;AAGA,EAAA,MAAM,cAAc,MAAA,CAAO,cAAA,CAAe,WAAW,MAAA,GAASA,OAAAA,CAAM,QACjD,MAAA,CAAO,cAAA,CAAe,WAAW,SAAA,GAAYA,OAAAA,CAAM,SACnD,MAAA,CAAO,cAAA,CAAe,WAAW,OAAA,GAAUA,OAAAA,CAAM,MACjDA,OAAAA,CAAM,IAAA;AAEzB,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,iBAAiB,CAAA,EAAG,WAAA,CAAY,MAAA,CAAO,cAAA,CAAe,MAAA,CAAO,WAAA,EAAa,CAAC,CAAA;AAClG,EAAA,OAAA,CAAQ,GAAA,CAAIA,QAAM,GAAA,CAAI,CAAA,EAAA,EAAK,OAAO,cAAA,CAAe,MAAM,EAAE,CAAC,CAAA;AAC1D,EAAA,OAAA,CAAQ,GAAA,CAAIA,QAAM,GAAA,CAAI,CAAA,cAAA,EAAiB,OAAO,cAAA,CAAe,UAAU,EAAE,CAAC,CAAA;AAC1E,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,EAAA,IAAI,MAAA,CAAO,cAAA,CAAe,MAAA,KAAW,OAAA,EAAS;AAC5C,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,GAAA,CAAI,6DAAsD,CAAC,CAAA;AAC7E,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,GAAA,CAAI,wDAAiD,CAAC,CAAA;AAAA,EAC1E,CAAA,MAAA,IAAW,MAAA,CAAO,cAAA,CAAe,MAAA,KAAW,SAAA,EAAW;AACrD,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,GAAA,CAAI,wDAAiD,CAAC,CAAA;AAAA,EAC1E;AAEA,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAChB;ACvQA,SAAS,cAAA,CAAe,OAAe,QAAA,EAA8B;AACnE,EAAA,OAAO,QAAA,CAAS,MAAA,CAAO,CAAC,KAAK,CAAC,CAAA;AAChC;AAKO,SAAS,YAAA,GAAwB;AACtC,EAAA,OAAO,IAAIC,OAAAA,CAAQ,OAAO,CAAA,CACvB,YAAY,0DAA0D,CAAA,CACtE,QAAA,CAAS,QAAA,EAAU,eAAe,CAAA,CAClC,MAAA,CAAO,uBAAA,EAAyB,uDAAuD,cAAA,EAAgB,EAAE,CAAA,CACzG,MAAA,CAAO,eAAA,EAAiB,sCAAsC,CAAA,CAC9D,OAAO,WAAA,EAAa,mDAAmD,CAAA,CACvE,MAAA,CAAO,WAAW,0BAA0B,CAAA,CAC5C,MAAA,CAAO,OAAO,UAAkB,OAAA,KAK3B;AACJ,IAAA,MAAM,OAAA,GAAU,OAAA,CAAQ,MAAA,CAAO,GAAA,CAAI,CAAC,GAAA,KAAgB;AAClD,MAAA,MAAM,CAAC,IAAA,EAAM,KAAK,CAAA,GAAI,GAAA,CAAI,MAAM,GAAG,CAAA;AACnC,MAAA,IAAI,CAAC,IAAA,IAAQ,CAAC,KAAA,EAAO;AACnB,QAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,GAAG,CAAA,yBAAA,CAA2B,CAAA;AAAA,MAC5E;AACA,MAAA,OAAO,EAAE,MAAM,KAAA,EAAM;AAAA,IACvB,CAAC,CAAA;AACD,IAAA,MAAM,UAAU,QAAA,EAAU;AAAA,MACxB,OAAA;AAAA,MACA,YAAY,OAAA,CAAQ,UAAA;AAAA,MACpB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,OAAO,OAAA,CAAQ;AAAA,KAChB,CAAA;AAAA,EACH,CAAC,CAAA;AACL;AAKA,eAAsB,SAAA,CAAU,UAAkB,OAAA,EAAsC;AACtF,EAAA,MAAM,kBAAA,EAAmB;AAEzB,EAAA,IAAI;AAEF,IAAA,IAAI,CAAC,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,OAAA,CAAQ,WAAW,CAAA,EAAG;AACpD,MAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAAA,IAC5D;AAGA,IAAA,MAAM,MAAA,GAAS,MAAM,UAAA,EAAW;AAChC,IAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AACxB,IAAA,MAAM,QAAA,GAAgBkD,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,MAAA,CAAO,QAAQ,CAAA;AAC/C,IAAA,MAAM,YAAA,GAAe,MAAM,eAAA,CAAgB,QAAA,EAAU,KAAK,QAAQ,CAAA;AAElE,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,iBAAA,CAAkB,QAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,IAClE;AAGA,IAAA,MAAM,QAAA,GAAgBA,gBAAS,YAAY,CAAA;AAC3C,IAAA,MAAM,UAAA,GAAkBA,MAAA,CAAA,IAAA,CAAK,YAAA,EAAc,WAAW,CAAA;AACtD,IAAA,MAAM,OAAA,GAAU,MAAMD,QAAAA,CAAS,UAAA,EAAY,OAAO,CAAA;AAGlD,IAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,OAAA,CAAQ,OAAO,CAAA;AAGtD,IAAA,kBAAA,CAAmB,aAAa,CAAA;AAGhC,IAAA,MAAM,cAKD,EAAC;AAEN,IAAA,KAAA,MAAW,UAAU,aAAA,EAAe;AAClC,MAAA,MAAM,YAAY,YAAA,CAAa,OAAA,EAAS,MAAA,CAAO,SAAA,EAAW,OAAO,OAAO,CAAA;AACxE,MAAA,MAAM,SAAA,GAAY,WAAW,SAAS,CAAA;AAEtC,MAAA,WAAA,CAAY,IAAA,CAAK;AAAA,QACf,MAAM,MAAA,CAAO,IAAA;AAAA,QACb,OAAA,EAAS,SAAA;AAAA,QACT,MAAA,EAAQ,CAAA;AAAA;AAAA,QACR,KAAA,EAAO;AAAA,OACR,CAAA;AAAA,IACH;AAGA,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,MAAM,aAAA,CAAc,UAAU,WAAW,CAAA;AACzC,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,YAAA,CAAa,YAAA,EAAc,QAAA,EAAU,OAAA,EAAS,aAAa,OAAO,CAAA;AAAA,EAE1E,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,MAAA,OAAA,CAAQ,MAAMlD,OAAAA,CAAM,GAAA,CAAI,UAAU,KAAA,CAAM,OAAO,EAAE,CAAC,CAAA;AAAA,IACpD;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAKA,SAAS,iBAAiB,OAAA,EAAkD;AAC1E,EAAA,MAAM,SAAyB,EAAC;AAEhC,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAE5B,IAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,KAAA,CAAM,KAAA,CAAM,eAAe,CAAA;AAEhD,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,MAAA,CAAO,KAAK,CAAA,0BAAA,CAA4B,CAAA;AAAA,IACxF;AAEA,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA;AACvC,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA;AAErC,IAAA,IAAI,SAAA,GAAY,CAAA,IAAK,OAAA,GAAU,SAAA,EAAW;AACxC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,MAAA,CAAO,KAAK,CAAA,CAAE,CAAA;AAAA,IACvD;AAEA,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,MAAM,MAAA,CAAO,IAAA;AAAA,MACb,SAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAAS,mBAAmB,OAAA,EAA+B;AACzD,EAAA,MAAM,MAAA,GAAS,CAAC,GAAG,OAAO,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE,SAAS,CAAA;AAEpE,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AAC1C,IAAA,MAAM,OAAA,GAAU,OAAO,CAAC,CAAA;AACxB,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA;AAEzB,IAAA,IAAI,OAAA,CAAQ,OAAA,IAAW,IAAA,CAAK,SAAA,EAAW;AACrC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,4BAA4B,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAK,OAAA,CAAQ,SAAS,CAAA,CAAA,EAAI,OAAA,CAAQ,OAAO,CAAA,gBAAA,EAChE,KAAK,IAAI,CAAA,EAAA,EAAK,KAAK,SAAS,CAAA,CAAA,EAAI,KAAK,OAAO,CAAA,CAAA;AAAA,OAC/D;AAAA,IACF;AAAA,EACF;AACF;AAKA,eAAe,aAAA,CACb,UACA,WAAA,EACe;AACf,EAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,IAAA,CAAK,KAAK,CAAA,yBAAA,EAAqB,QAAQ,EAAE,CAAC,CAAA;AAC5D,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,eAAe,CAAC,CAAA;AACvC,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,EAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,IAAA,OAAA,CAAQ,IAAI,CAAA,EAAA,EAAKA,OAAAA,CAAM,KAAK,GAAA,CAAI,IAAI,CAAC,CAAA,CAAE,CAAA;AACvC,IAAA,OAAA,CAAQ,GAAA,CAAI,CAAA,WAAA,EAAc,GAAA,CAAI,KAAK,CAAA,CAAE,CAAA;AAGrC,IAAA,MAAM,YAAA,GAAe,IAAI,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA;AACvD,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,GAAA,CAAI,cAAc,CAAC,CAAA;AACrC,IAAA,KAAA,MAAW,QAAQ,YAAA,EAAc;AAC/B,MAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,GAAA,CAAI,CAAA,MAAA,EAAS,IAAA,CAAK,UAAU,CAAA,EAAG,EAAE,CAAC,CAAA,EAAG,KAAK,MAAA,GAAS,EAAA,GAAK,KAAA,GAAQ,EAAE,EAAE,CAAC,CAAA;AAAA,IACzF;AACA,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,EAChB;AAEA,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,GAAA,CAAI,6BAA6B,CAAC,CAAA;AACpD,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,GAAA,CAAI,wCAAwC,CAAC,CAAA;AAC/D,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAChB;AAKA,eAAe,YAAA,CACb,QAAA,EACA,QAAA,EACA,eAAA,EACA,aACA,OAAA,EACe;AACf,EAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,IAAA,CAAK,KAAK,CAAA,yBAAA,EAAkB,QAAQ,EAAE,CAAC,CAAA;AACzD,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,EAAA,MAAM,WAAA,GAAc,2BAA2B,eAAe,CAAA;AAG9D,EAAA,KAAA,MAAW,OAAO,WAAA,EAAa;AAC7B,IAAA,MAAM,UAAA,GAAkBmD,MAAA,CAAA,IAAA,CAAK,QAAA,EAAU,GAAA,CAAI,IAAI,CAAA;AAG/C,IAAA,IAAI,eAAe,GAAA,CAAI,OAAA;AACvB,IAAA,IAAI,GAAA,CAAI,IAAA,KAAS,WAAA,IAAe,WAAA,EAAa;AAE3C,MAAA,MAAM,EAAE,OAAA,EAAS,sBAAA,EAAuB,GAAI,wBAAA;AAAA,QAC1C,GAAA,CAAI,OAAA;AAAA,QACJ;AAAA,OACF;AACA,MAAA,YAAA,GAAe,sBAAA;AAAA,IACjB;AAEA,IAAA,MAAMC,SAAAA,CAAU,UAAA,EAAY,YAAA,EAAc,OAAO,CAAA;AAEjD,IAAA,OAAA,CAAQ,GAAA,CAAIpD,OAAAA,CAAM,KAAA,CAAM,CAAA,eAAA,EAAa,GAAA,CAAI,IAAI,CAAA,EAAA,EAAK,GAAA,CAAI,KAAK,CAAA,OAAA,CAAS,CAAC,CAAA;AAAA,EACvE;AAGA,EAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,IAAA,MAAM,UAAA,GAAkBmD,MAAA,CAAA,IAAA,CAAK,QAAA,EAAU,WAAW,CAAA;AAClD,IAAA,MAAM,aAAA,GAAgB,MAAMD,QAAAA,CAAS,UAAA,EAAY,OAAO,CAAA;AAGxD,IAAA,MAAM,gBAAgB,MAAM,eAAA;AAAA,MAC1B,aAAA;AAAA,MACA,WAAA,CAAY,IAAI,CAAA,CAAA,KAAK,CAAA,CAAE,IAAI,CAAA,CAAE,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,KAAM,WAAW;AAAA,KAC5D;AAEA,IAAA,MAAME,SAAAA,CAAU,UAAA,EAAY,aAAA,EAAe,OAAO,CAAA;AAClD,IAAA,OAAA,CAAQ,GAAA,CAAIpD,OAAAA,CAAM,KAAA,CAAM,CAAA,4CAAA,CAAyC,CAAC,CAAA;AAAA,EACpE;AAEA,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,KAAA,CAAM,iBAAiB,CAAC,CAAA;AAC/C,EAAA,OAAA,CAAQ,GAAA,CAAIA,QAAM,GAAA,CAAI,CAAA,QAAA,EAAW,YAAY,MAAM,CAAA,UAAA,EAAa,QAAQ,CAAA,CAAE,CAAC,CAAA;AAC3E,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAChB;AAKA,eAAe,eAAA,CAAgB,SAAiB,QAAA,EAAqC;AACnF,EAAA,IAAI,QAAA,CAAS,WAAW,CAAA,EAAG;AACzB,IAAA,OAAO,OAAA;AAAA,EACT;AAGA,EAAA,IAAI,QAAQ,QAAA,CAAS,cAAc,KAAK,OAAA,CAAQ,QAAA,CAAS,cAAc,CAAA,EAAG;AAExE,IAAA,OAAO,OAAA;AAAA,EACT;AAGA,EAAA,MAAM,KAAA,GAAQ,OAAA,CAAQ,KAAA,CAAM,IAAI,CAAA;AAChC,EAAA,IAAI,WAAA,GAAc,EAAA;AAGlB,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,KAAA,CAAM,QAAQ,CAAA,EAAA,EAAK;AACrC,IAAA,MAAM,IAAA,GAAO,KAAA,CAAM,CAAC,CAAA,CAAE,WAAA,EAAY;AAClC,IAAA,IAAI,IAAA,CAAK,QAAA,CAAS,mBAAmB,CAAA,IACjC,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA,IACvB,IAAA,CAAK,QAAA,CAAS,SAAS,CAAA,EAAG;AAC5B,MAAA,WAAA,GAAc,CAAA;AACd,MAAA;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,gBAAgB,EAAA,EAAI;AACtB,IAAA,WAAA,GAAc,KAAA,CAAM,MAAA;AAAA,EACtB;AAGA,EAAA,MAAM,eAAA,GAAkB;AAAA,IACtB,EAAA;AAAA,IACA,cAAA;AAAA,IACA,EAAA;AAAA,IACA,8CAAA;AAAA,IACA,EAAA;AAAA,IACA,GAAG,QAAA,CAAS,GAAA,CAAI,CAAA,IAAA,KAAQ;AACtB,MAAA,MAAM,IAAA,GAAO,IAAA,CAAK,OAAA,CAAQ,KAAA,EAAO,EAAE,CAAA;AACnC,MAAA,OAAO,QAAQ,IAAI,CAAA,IAAA,EAAO,IAAI,CAAA,MAAA,EAAS,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA;AAAA,IACjE,CAAC,CAAA;AAAA,IACD;AAAA,GACF;AAGA,EAAA,KAAA,CAAM,MAAA,CAAO,WAAA,EAAa,CAAA,EAAG,GAAG,eAAe,CAAA;AAE/C,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAKA,SAAS,mBAAmB,IAAA,EAAsB;AAChD,EAAA,MAAM,KAAA,GAAQ,KAAK,WAAA,EAAY;AAE/B,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,QAAQ,CAAA,EAAG,OAAO,iCAAA;AACrC,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,gBAAgB,CAAA,EAAG,OAAO,gCAAA;AAC7C,EAAA,IAAI,KAAA,CAAM,SAAS,SAAS,CAAA,IAAK,MAAM,QAAA,CAAS,MAAM,GAAG,OAAO,yBAAA;AAChE,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,WAAW,CAAA,EAAG,OAAO,gCAAA;AACxC,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA,EAAG,OAAO,mBAAA;AAClC,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,WAAW,CAAA,EAAG,OAAO,6BAAA;AACxC,EAAA,IAAI,KAAA,CAAM,QAAA,CAAS,SAAS,CAAA,EAAG,OAAO,sBAAA;AAEtC,EAAA,OAAO,0BAAA;AACT;ACnUA,SAAS,cAAA,CAAe,OAAe,QAAA,EAA8B;AACnE,EAAA,OAAO,QAAA,CAAS,MAAA,CAAO,CAAC,KAAK,CAAC,CAAA;AAChC;AAKO,SAAS,cAAA,GAA0B;AACxC,EAAA,OAAO,IAAIC,OAAAA,CAAQ,SAAS,CAAA,CACzB,WAAA,CAAY,mDAAmD,CAAA,CAC/D,QAAA,CAAS,QAAA,EAAU,iBAAiB,CAAA,CACpC,MAAA,CAAO,kBAAA,EAAoB,sCAAA,EAAwC,cAAA,EAAgB,EAAE,CAAA,CACrF,MAAA,CAAO,WAAA,EAAa,mDAAmD,CAAA,CACvE,MAAA,CAAO,SAAA,EAAW,mBAAmB,CAAA,CACrC,MAAA,CAAO,OAAO,UAAkB,OAAA,KAAqE;AACpG,IAAA,MAAM,YAAY,QAAA,EAAU;AAAA,MAC1B,SAAS,OAAA,CAAQ,MAAA;AAAA,MACjB,QAAQ,OAAA,CAAQ,MAAA;AAAA,MAChB,OAAO,OAAA,CAAQ;AAAA,KAChB,CAAA;AAAA,EACH,CAAC,CAAA;AACL;AAKA,eAAsB,WAAA,CAAY,UAAkB,OAAA,EAAwC;AAC1F,EAAA,MAAM,kBAAA,EAAmB;AAEzB,EAAA,IAAI;AAEF,IAAA,IAAI,CAAC,OAAA,CAAQ,OAAA,IAAW,OAAA,CAAQ,OAAA,CAAQ,WAAW,CAAA,EAAG;AACpD,MAAA,MAAM,IAAI,MAAM,0CAA0C,CAAA;AAAA,IAC5D;AAGA,IAAA,MAAM,MAAA,GAAS,MAAM,UAAA,EAAW;AAChC,IAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AACxB,IAAA,MAAM,QAAA,GAAgBoD,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,MAAA,CAAO,QAAQ,CAAA;AAC/C,IAAA,MAAM,YAAA,GAAe,MAAM,eAAA,CAAgB,QAAA,EAAU,KAAK,QAAQ,CAAA;AAElE,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,iBAAA,CAAkB,QAAQ,CAAC,CAAA,CAAE,CAAA;AAAA,IAClE;AAGA,IAAA,MAAM,QAAA,GAAgBA,gBAAS,YAAY,CAAA;AAC3C,IAAA,MAAM,UAAA,GAAkBA,MAAA,CAAA,IAAA,CAAK,YAAA,EAAc,WAAW,CAAA;AACtD,IAAA,MAAM,OAAA,GAAU,MAAMH,QAAAA,CAAS,UAAA,EAAY,OAAO,CAAA;AAGlD,IAAA,MAAM,aAAA,GAAgB,gBAAA,CAAiB,OAAA,CAAQ,OAAO,CAAA;AAGtD,IAAAI,oBAAmB,aAAa,CAAA;AAGhC,IAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,MAAA,MAAMC,cAAAA,CAAc,QAAA,EAAU,OAAA,EAAS,aAAa,CAAA;AACpD,MAAA;AAAA,IACF;AAGA,IAAA,MAAM,cAAA,CAAe,UAAA,EAAY,QAAA,EAAU,OAAA,EAAS,aAAa,CAAA;AAAA,EAEnE,SAAS,KAAA,EAAO;AACd,IAAA,IAAI,iBAAiB,KAAA,EAAO;AAC1B,MAAA,OAAA,CAAQ,MAAMvD,OAAAA,CAAM,GAAA,CAAI,UAAU,KAAA,CAAM,OAAO,EAAE,CAAC,CAAA;AAAA,IACpD;AACA,IAAA,MAAM,KAAA;AAAA,EACR;AACF;AAKA,SAAS,iBAAiB,OAAA,EAAmC;AAC3D,EAAA,MAAM,SAAyB,EAAC;AAEhC,EAAA,KAAA,IAAS,CAAA,GAAI,CAAA,EAAG,CAAA,GAAI,OAAA,CAAQ,QAAQ,CAAA,EAAA,EAAK;AACvC,IAAA,MAAM,IAAA,GAAO,QAAQ,CAAC,CAAA;AAGtB,IAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,eAAe,CAAA;AAExC,IAAA,IAAI,CAAC,KAAA,EAAO;AACV,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,IAAI,CAAA,4BAAA,CAA8B,CAAA;AAAA,IAClF;AAEA,IAAA,MAAM,SAAA,GAAY,QAAA,CAAS,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA;AACvC,IAAA,MAAM,OAAA,GAAU,QAAA,CAAS,KAAA,CAAM,CAAC,GAAG,EAAE,CAAA;AAErC,IAAA,IAAI,SAAA,GAAY,CAAA,IAAK,OAAA,GAAU,SAAA,EAAW;AACxC,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,oBAAA,EAAuB,IAAI,CAAA,CAAE,CAAA;AAAA,IAC/C;AAEA,IAAA,MAAA,CAAO,IAAA,CAAK;AAAA,MACV,SAAA;AAAA,MACA,OAAA;AAAA,MACA,aAAA,EAAe;AAAA,KAChB,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,MAAA;AACT;AAKA,SAASsD,oBAAmB,OAAA,EAA+B;AACzD,EAAA,MAAM,MAAA,GAAS,CAAC,GAAG,OAAO,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE,SAAS,CAAA;AAEpE,EAAA,KAAA,IAAS,IAAI,CAAA,EAAG,CAAA,GAAI,MAAA,CAAO,MAAA,GAAS,GAAG,CAAA,EAAA,EAAK;AAC1C,IAAA,MAAM,OAAA,GAAU,OAAO,CAAC,CAAA;AACxB,IAAA,MAAM,IAAA,GAAO,MAAA,CAAO,CAAA,GAAI,CAAC,CAAA;AAEzB,IAAA,IAAI,OAAA,CAAQ,OAAA,IAAW,IAAA,CAAK,SAAA,EAAW;AACrC,MAAA,MAAM,IAAI,KAAA;AAAA,QACR,CAAA,yBAAA,EAA4B,OAAA,CAAQ,SAAS,CAAA,CAAA,EAAI,OAAA,CAAQ,OAAO,CAAA,eAAA,EAC/C,IAAA,CAAK,SAAS,CAAA,CAAA,EAAI,IAAA,CAAK,OAAO,CAAA;AAAA,OACjD;AAAA,IACF;AAAA,EACF;AACF;AAKA,eAAeC,cAAAA,CACb,QAAA,EACA,OAAA,EACA,OAAA,EACe;AACf,EAAA,OAAA,CAAQ,IAAIvD,OAAAA,CAAM,IAAA,CAAK,KAAK,CAAA,2BAAA,EAAuB,QAAQ,EAAE,CAAC,CAAA;AAC9D,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,eAAe,CAAC,CAAA;AACvC,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,EAAA,IAAI,UAAA,GAAa,CAAA;AAEjB,EAAA,KAAA,MAAW,UAAU,OAAA,EAAS;AAC5B,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,OAAA,GAAU,MAAA,CAAO,SAAA,GAAY,CAAA;AACtD,IAAA,UAAA,IAAc,SAAA;AAGd,IAAA,MAAM,iBAAiB,YAAA,CAAa,OAAA,EAAS,MAAA,CAAO,SAAA,EAAW,OAAO,OAAO,CAAA;AAC7E,IAAA,MAAM,eAAe,cAAA,CAAe,KAAA,CAAM,IAAI,CAAA,CAAE,KAAA,CAAM,GAAG,CAAC,CAAA;AAE1D,IAAA,OAAA,CAAQ,GAAA,CAAI,WAAW,MAAA,CAAO,SAAS,IAAI,MAAA,CAAO,OAAO,CAAA,EAAA,EAAK,SAAS,CAAA,OAAA,CAAS,CAAA;AAChF,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,GAAA,CAAI,cAAc,CAAC,CAAA;AACrC,IAAA,KAAA,MAAW,QAAQ,YAAA,EAAc;AAC/B,MAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,GAAA,CAAI,CAAA,MAAA,EAAS,IAAA,CAAK,UAAU,CAAA,EAAG,EAAE,CAAC,CAAA,EAAG,KAAK,MAAA,GAAS,EAAA,GAAK,KAAA,GAAQ,EAAE,EAAE,CAAC,CAAA;AAAA,IACzF;AACA,IAAA,IAAI,cAAA,CAAe,KAAA,CAAM,IAAI,CAAA,CAAE,SAAS,CAAA,EAAG;AACzC,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,GAAA,CAAI,CAAA,WAAA,EAAc,cAAA,CAAe,KAAA,CAAM,IAAI,CAAA,CAAE,MAAA,GAAS,CAAC,CAAA,YAAA,CAAc,CAAC,CAAA;AAAA,IAC1F;AACA,IAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAAA,EAChB;AAGA,EAAA,MAAM,aAAA,GAAgB,WAAW,OAAO,CAAA;AACxC,EAAA,MAAM,iBAAiB,aAAA,GAAgB,UAAA;AACvC,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAO,UAAA,GAAa,gBAAiB,GAAG,CAAA;AAEhE,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,UAAU,CAAC,CAAA;AAClC,EAAA,OAAA,CAAQ,IAAI,CAAA,mBAAA,EAAsBA,OAAAA,CAAM,IAAA,CAAK,aAAa,CAAC,CAAA,CAAE,CAAA;AAC7D,EAAA,OAAA,CAAQ,GAAA,CAAI,sBAAsBA,OAAAA,CAAM,MAAA,CAAO,UAAU,CAAC,CAAA,QAAA,EAAW,UAAU,CAAA,EAAA,CAAI,CAAA;AACnF,EAAA,OAAA,CAAQ,IAAI,CAAA,mBAAA,EAAsBA,OAAAA,CAAM,IAAA,CAAK,cAAc,CAAC,CAAA,CAAE,CAAA;AAC9D,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAEd,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,GAAA,CAAI,6BAA6B,CAAC,CAAA;AACpD,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,GAAA,CAAI,wCAAwC,CAAC,CAAA;AAC/D,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAChB;AAKA,eAAe,cAAA,CACb,UAAA,EACA,QAAA,EACA,OAAA,EACA,OAAA,EACe;AACf,EAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,IAAA,CAAK,KAAK,CAAA,6BAAA,EAAoB,QAAQ,EAAE,CAAC,CAAA;AAC3D,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAGd,EAAA,MAAM,MAAA,GAAS,CAAC,GAAG,OAAO,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE,SAAS,CAAA;AAGpE,EAAA,IAAI,cAAA,GAAiB,OAAA;AACrB,EAAA,IAAI,YAAA,GAAe,CAAA;AAEnB,EAAA,KAAA,MAAW,UAAU,MAAA,EAAQ;AAC3B,IAAA,MAAM,SAAA,GAAY,MAAA,CAAO,OAAA,GAAU,MAAA,CAAO,SAAA,GAAY,CAAA;AACtD,IAAA,cAAA,GAAiB,WAAA,CAAY,cAAA,EAAgB,MAAA,CAAO,SAAA,EAAW,OAAO,OAAO,CAAA;AAC7E,IAAA,YAAA,IAAgB,SAAA;AAEhB,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,KAAA,CAAM,CAAA,qBAAA,EAAmB,MAAA,CAAO,SAAS,CAAA,CAAA,EAAI,MAAA,CAAO,OAAO,CAAA,EAAA,EAAK,SAAS,CAAA,OAAA,CAAS,CAAC,CAAA;AAAA,EACvG;AAGA,EAAA,MAAMoD,SAAAA,CAAU,UAAA,EAAY,cAAA,EAAgB,OAAO,CAAA;AAGnD,EAAA,MAAM,aAAA,GAAgB,WAAW,OAAO,CAAA;AACxC,EAAA,MAAM,UAAA,GAAa,WAAW,cAAc,CAAA;AAC5C,EAAA,MAAM,UAAA,GAAa,IAAA,CAAK,KAAA,CAAO,YAAA,GAAe,gBAAiB,GAAG,CAAA;AAElE,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AACd,EAAA,OAAA,CAAQ,GAAA,CAAIpD,OAAAA,CAAM,IAAA,CAAK,KAAA,CAAM,sBAAsB,CAAC,CAAA;AACpD,EAAA,OAAA,CAAQ,GAAA,CAAIA,QAAM,GAAA,CAAI,CAAA,QAAA,EAAW,YAAY,CAAA,QAAA,EAAW,UAAU,IAAI,CAAC,CAAA;AACvE,EAAA,OAAA,CAAQ,GAAA,CAAIA,QAAM,GAAA,CAAI,CAAA,EAAG,aAAa,CAAA,QAAA,EAAM,UAAU,QAAQ,CAAC,CAAA;AAC/D,EAAA,OAAA,CAAQ,IAAI,EAAE,CAAA;AAChB;AC7OA,MAAA,CAAO,GAAA,CAAI,gBAAoD,CAAA;AAqB/D,eAAsB,eAAA,CACpB,QAAA,EACA,GAAA,GAAc,OAAA,CAAQ,KAAI,EACG;AAC7B,EAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,GAAG,CAAA;AACnC,EAAA,MAAM,QAAA,GAAgBwD,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,MAAA,CAAO,QAAQ,CAAA;AAG/C,EAAA,IAAI,YAAA,GAA8B,IAAA;AAClC,EAAA,IAAI,UAAA,GAA4B,IAAA;AAGhC,EAAA,MAAM,YAAY,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,CAAO,OAAK,CAAC,CAAA;AAEnD,EAAA,IAAI,SAAA,CAAU,MAAA,GAAS,CAAA,IAAK,SAAA,CAAU,SAAA,CAAU,SAAS,CAAC,CAAA,CAAE,QAAA,CAAS,KAAK,CAAA,EAAG;AAE3E,IAAA,MAAM,WAAW,SAAA,CAAU,KAAA,CAAM,GAAG,EAAE,CAAA,CAAE,KAAK,GAAG,CAAA;AAChD,IAAA,MAAM,QAAA,GAAW,SAAA,CAAU,SAAA,CAAU,MAAA,GAAS,CAAC,CAAA;AAE/C,IAAA,YAAA,GAAe,MAAM,eAAA,CAAgB,QAAA,EAAU,GAAA,EAAK,QAAQ,CAAA;AAC5D,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,UAAA,GAAkBA,MAAA,CAAA,IAAA,CAAK,cAAc,QAAQ,CAAA;AAG7C,MAAA,IAAI;AACF,QAAA,MAASC,WAAO,UAAU,CAAA;AAAA,MAC5B,CAAA,CAAA,MAAQ;AAEN,QAAA,OAAO,IAAA;AAAA,MACT;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,YAAA,GAAe,MAAM,eAAA,CAAgB,QAAA,EAAU,GAAA,EAAK,QAAQ,CAAA;AAE5D,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,OAAO,IAAA;AAAA,IACT;AAGA,IAAA,UAAA,GAAa,MAAM,WAAA,CAAY,YAAA,EAAc,MAAA,CAAO,UAAU,WAAW,CAAA;AAEzE,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF;AAGA,EAAA,IAAI,CAAC,UAAA,EAAY;AACf,IAAA,OAAO,IAAA;AAAA,EACT;AAGA,EAAA,MAAM,UAAA,GAAa,MAASA,GAAA,CAAA,QAAA,CAAS,UAAA,EAAY,OAAO,CAAA;AACxD,EAAA,MAAM,QAAA,GAAgBD,gBAAS,UAAU,CAAA;AACzC,EAAA,MAAM,SAAA,GAAY,QAAA,KAAa,MAAA,CAAO,SAAA,CAAU,WAAA;AAGhD,EAAA,IAAI,WAAA,GAAsC,IAAA;AAE1C,EAAA,IAAI,CAAC,SAAA,EAAW;AACd,IAAA,WAAA,GAAc,MAAM,gBAAA,CAAiB,UAAA,EAAY,MAAM,CAAA;AACvD,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,CAAA,MAAO;AAEL,IAAA,MAAM,eAAe,MAAM,WAAA,CAAY,YAAA,EAAc,MAAA,CAAO,UAAU,WAAW,CAAA;AACjF,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,WAAA,GAAc,MAAM,gBAAA,CAAiB,YAAA,EAAc,MAAM,CAAA;AAAA,IAC3D;AAGA,IAAA,IAAI,CAAC,WAAA,EAAa;AAChB,MAAA,WAAA,GAAc;AAAA,QACZ,MAAA,EAAQ,SAAA;AAAA,QACR,OAAA,EAAA,qBAAa,IAAA,EAAK,EAAE,aAAY,CAAE,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC;AAAA,OAChD;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,KAAA,GAAQ,UAAA,CAAW,KAAA,CAAM,IAAI,CAAA;AACnC,EAAA,IAAI,iBAAA,GAAoB,CAAA;AAGxB,EAAA,IAAI,CAAC,SAAA,IAAa,KAAA,CAAM,CAAC,MAAM,KAAA,EAAO;AACpC,IAAA,MAAM,YAAA,GAAe,MAAM,SAAA,CAAU,CAAC,MAAM,CAAA,KAAM,CAAA,GAAI,CAAA,IAAK,IAAA,KAAS,KAAK,CAAA;AACzE,IAAA,IAAI,eAAe,CAAA,EAAG;AACpB,MAAA,iBAAA,GAAoB,YAAA,GAAe,CAAA;AAAA,IACrC;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAU,MAAM,KAAA,CAAM,iBAAiB,EAAE,IAAA,CAAK,IAAI,EAAE,IAAA,EAAK;AAC/D,EAAA,MAAM,QAAA,GAAgBA,gBAAS,YAAY,CAAA;AAC3C,EAAA,MAAM,cAAc,SAAA,GAAY,CAAA,EAAG,QAAQ,CAAA,CAAA,EAAI,QAAQ,CAAA,CAAA,GAAK,QAAA;AAE5D,EAAA,OAAO;AAAA,IACL,WAAA;AAAA,IACA,OAAA;AAAA,IACA,UAAA;AAAA,IACA,IAAA,EAAM,YAAA;AAAA,IACN,IAAA,EAAM,WAAA;AAAA,IACN,QAAA,EAAU;AAAA;AAAA,GACZ;AACF;AAKA,SAAS,kBAAkB,WAAA,EAAsC;AAC/D,EAAA,MAAM,QAAkB,EAAC;AAGzB,EAAA,MAAM,YAAA,GAAe;AAAA,IACnB,OAAA,EAAS,WAAA;AAAA,IACT,aAAA,EAAe,WAAA;AAAA,IACf,QAAA,EAAU,QAAA;AAAA,IACV,OAAA,EAAS,WAAA;AAAA,IACT,SAAA,EAAW,QAAA;AAAA,IACX,QAAA,EAAU;AAAA,GACZ;AACA,EAAA,MAAM,WAAA,GAAc,YAAA,CAAa,WAAA,CAAY,MAAM,CAAA,IAAK,WAAA;AACxD,EAAA,KAAA,CAAM,IAAA,CAAKxD,OAAAA,CAAM,IAAA,CAAK,CAAA,EAAG,WAAW,CAAA,SAAA,CAAW,CAAA,GAAIA,OAAAA,CAAM,IAAA,CAAK,WAAA,CAAY,MAAM,CAAC,CAAA;AAGjF,EAAA,IAAI,YAAY,QAAA,EAAU;AACxB,IAAA,MAAM,cAAA,GAAiB;AAAA,MACrB,GAAA,EAAK,WAAA;AAAA,MACL,MAAA,EAAQ,WAAA;AAAA,MACR,IAAA,EAAM,WAAA;AAAA,MACN,QAAA,EAAU;AAAA,KACZ;AACA,IAAA,MAAM,aAAA,GAAgB,cAAA,CAAe,WAAA,CAAY,QAAQ,CAAA,IAAK,EAAA;AAC9D,IAAA,KAAA,CAAM,IAAA,CAAKA,OAAAA,CAAM,IAAA,CAAK,CAAA,EAAG,aAAa,CAAA,WAAA,CAAa,CAAA,GAAIA,OAAAA,CAAM,MAAA,CAAO,WAAA,CAAY,QAAQ,CAAC,CAAA;AAAA,EAC3F;AAGA,EAAA,IAAI,YAAY,OAAA,EAAS;AACvB,IAAA,KAAA,CAAM,IAAA,CAAKA,OAAAA,CAAM,IAAA,CAAK,qBAAc,CAAA,GAAIA,OAAAA,CAAM,IAAA,CAAK,MAAA,CAAO,WAAA,CAAY,OAAO,CAAC,CAAC,CAAA;AAAA,EACjF;AAGA,EAAA,IAAI,WAAA,CAAY,IAAA,IAAQ,WAAA,CAAY,IAAA,CAAK,SAAS,CAAA,EAAG;AACnD,IAAA,MAAM,MAAA,GAAS,WAAA,CAAY,IAAA,CAAK,GAAA,CAAI,CAAA,GAAA,KAAOA,OAAAA,CAAM,IAAA,CAAK,CAAA,CAAA,EAAI,GAAG,CAAA,CAAE,CAAC,CAAA,CAAE,KAAK,GAAG,CAAA;AAC1E,IAAA,KAAA,CAAM,IAAA,CAAKA,OAAAA,CAAM,IAAA,CAAK,yBAAa,IAAI,MAAM,CAAA;AAAA,EAC/C;AAGA,EAAA,IAAI,YAAY,QAAA,EAAU;AACxB,IAAA,KAAA,CAAM,IAAA,CAAKA,QAAM,IAAA,CAAK,sBAAe,IAAIA,OAAAA,CAAM,KAAA,CAAM,WAAA,CAAY,QAAQ,CAAC,CAAA;AAAA,EAC5E;AAGA,EAAA,MAAM,iBAAiB,CAAC,QAAA,EAAU,UAAA,EAAY,SAAA,EAAW,QAAQ,UAAU,CAAA;AAC3E,EAAA,MAAM,YAAA,GAAe,MAAA,CAAO,OAAA,CAAQ,WAAW,CAAA,CAC5C,OAAO,CAAC,CAAC,GAAG,CAAA,KAAM,CAAC,cAAA,CAAe,SAAS,GAAG,CAAC,CAAA,CAC/C,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,KAAM,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAI,CAAA;AAE/D,EAAA,IAAI,YAAA,CAAa,SAAS,CAAA,EAAG;AAC3B,IAAA,KAAA,CAAM,KAAK,EAAE,CAAA;AACb,IAAA,KAAA,CAAM,IAAA,CAAKA,OAAAA,CAAM,IAAA,CAAK,gBAAgB,CAAC,CAAA;AACvC,IAAA,KAAA,MAAW,CAAC,GAAA,EAAK,KAAK,CAAA,IAAK,YAAA,EAAc;AACvC,MAAA,KAAA,CAAM,IAAA,CAAK,CAAA,EAAA,EAAKA,OAAAA,CAAM,IAAA,CAAK,GAAG,CAAC,CAAA,EAAA,EAAKA,OAAAA,CAAM,KAAA,CAAM,MAAA,CAAO,KAAK,CAAC,CAAC,CAAA,CAAE,CAAA;AAAA,IAClE;AAAA,EACF;AAEA,EAAA,OAAO,KAAA,CAAM,KAAK,IAAI,CAAA;AACxB;AAKA,SAAS,qBAAqB,IAAA,EAA2B;AACvD,EAAA,MAAM,SAAmB,EAAC;AAG1B,EAAA,MAAA,CAAO,KAAK,EAAE,CAAA;AACd,EAAA,MAAA,CAAO,IAAA,CAAKA,QAAM,IAAA,CAAK,IAAA,CAAK,sBAAO,IAAA,CAAK,IAAI,qBAAM,CAAC,CAAA;AACnD,EAAA,MAAA,CAAO,KAAK,EAAE,CAAA;AAGd,EAAA,MAAA,CAAO,IAAA,CAAK,iBAAA,CAAkB,IAAA,CAAK,WAAW,CAAC,CAAA;AAC/C,EAAA,MAAA,CAAO,KAAK,EAAE,CAAA;AACd,EAAA,MAAA,CAAO,KAAKA,OAAAA,CAAM,IAAA,CAAK,SAAI,MAAA,CAAO,EAAE,CAAC,CAAC,CAAA;AACtC,EAAA,MAAA,CAAO,KAAK,EAAE,CAAA;AAEd,EAAA,OAAO,MAAA,CAAO,KAAK,IAAI,CAAA;AACzB;AAIO,SAAS,WAAA,CAAY,QAAA,EAAmB,OAAA,GAAuB,EAAC,EAA4B;AACjG,EAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,IAAA,OAAO,QAAA,CAAS,UAAU,OAAO,CAAA;AAAA,EACnC;AAEA,EAAA,OAAO,IAAIC,OAAAA,CAAQ,MAAM,CAAA,CACtB,WAAA,CAAY,6DAA6D,CAAA,CACzE,QAAA,CAAS,QAAA,EAAU,cAAc,CAAA,CACjC,MAAA,CAAO,OAAA,EAAS,4CAA4C,CAAA,CAC5D,MAAA,CAAO,QAAA,EAAU,gBAAgB,CAAA,CACjC,MAAA,CAAO,YAAA,EAAc,gBAAgB,CAAA,CACrC,MAAA,CAAO,OAAO,MAAA,EAAgB,IAAA,KAA6D;AAC1F,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAA,EAAQ;AAAA,QACrB,KAAK,IAAA,CAAK,GAAA;AAAA,QACV,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,OAAA,EAAS,KAAK,KAAA,KAAU;AAAA,OACzB,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAC7F,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF,CAAC,CAAA;AACL;AAMA,eAAsB,QAAA,CACpB,QAAA,EACA,OAAA,GAAuB,EAAC,EACT;AACf,EAAA,MAAM,OAAO,MAAM,eAAA,CAAgB,QAAA,EAAU,OAAA,CAAQ,KAAK,CAAA;AAE1D,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,QAAQ,CAAA,qBAAA,CAAuB,CAAA;AAAA,EACpE;AAGA,EAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,IAAA,MAAM,UAAA,GAAa;AAAA,MACjB,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,MAAM,IAAA,CAAK,IAAA;AAAA,MACX,aAAa,IAAA,CAAK,WAAA;AAAA,MAClB,SAAS,IAAA,CAAK;AAAA,KAChB;AACA,IAAA,OAAA,CAAQ,IAAI,IAAA,CAAK,SAAA,CAAU,UAAA,EAAY,IAAA,EAAM,CAAC,CAAC,CAAA;AAC/C,IAAA;AAAA,EACF;AAGA,EAAA,IAAI,QAAQ,GAAA,EAAK;AACf,IAAA,OAAA,CAAQ,GAAA,CAAI,KAAK,UAAU,CAAA;AAC3B,IAAA;AAAA,EACF;AAGA,EAAA,OAAA,CAAQ,GAAA,CAAI,oBAAA,CAAqB,IAAI,CAAC,CAAA;AAGtC,EAAA,MAAM,QAAA,GAAW,MAAM,MAAA,CAAO,IAAA,CAAK,OAAO,CAAA;AAC1C,EAAA,OAAA,CAAQ,IAAI,QAAQ,CAAA;AACtB;AAWO,SAAS,WAAA,CAAY,QAAA,EAAmB,OAAA,GAAuB,EAAC,EAA4B;AACjG,EAAA,IAAI,OAAO,aAAa,QAAA,EAAU;AAChC,IAAA,OAAO,QAAA,CAAS,UAAU,OAAO,CAAA;AAAA,EACnC;AAEA,EAAA,OAAO,IAAIA,OAAAA,CAAQ,MAAM,EACtB,WAAA,CAAY,qBAAqB,EACjC,QAAA,CAAS,QAAA,EAAU,cAAc,CAAA,CACjC,OAAO,mBAAA,EAAqB,wBAAwB,EACpD,MAAA,CAAO,OAAO,QAAgB,IAAA,KAAsB;AACnD,IAAA,IAAI;AACF,MAAA,MAAM,SAAS,MAAA,EAAQ;AAAA,QACrB,QAAQ,IAAA,CAAK;AAAA,OACd,CAAA;AAAA,IACH,SAAS,KAAA,EAAO;AACd,MAAA,OAAA,CAAQ,KAAA,CAAM,yBAAyB,KAAA,YAAiB,KAAA,GAAQ,MAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA;AAC7F,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF,CAAC,CAAA;AACL;AAMA,eAAsB,QAAA,CACpB,QAAA,EACA,OAAA,GAAuB,EAAC,EACT;AACf,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AACxB,EAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,GAAG,CAAA;AACnC,EAAA,MAAM,QAAA,GAAgBuD,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,MAAA,CAAO,QAAQ,CAAA;AAG/C,EAAA,IAAI,YAAA,GAA8B,IAAA;AAClC,EAAA,IAAI,UAAA,GAA4B,IAAA;AAEhC,EAAA,MAAM,YAAY,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,MAAA,CAAO,OAAK,CAAC,CAAA;AAEnD,EAAA,IAAI,SAAA,CAAU,MAAA,GAAS,CAAA,IAAK,SAAA,CAAU,SAAA,CAAU,SAAS,CAAC,CAAA,CAAE,QAAA,CAAS,KAAK,CAAA,EAAG;AAE3E,IAAA,MAAM,WAAW,SAAA,CAAU,KAAA,CAAM,GAAG,EAAE,CAAA,CAAE,KAAK,GAAG,CAAA;AAChD,IAAA,MAAM,QAAA,GAAW,SAAA,CAAU,SAAA,CAAU,MAAA,GAAS,CAAC,CAAA;AAE/C,IAAA,YAAA,GAAe,MAAM,eAAA,CAAgB,QAAA,EAAU,GAAA,EAAK,QAAQ,CAAA;AAC5D,IAAA,IAAI,YAAA,EAAc;AAChB,MAAA,UAAA,GAAkBA,MAAA,CAAA,IAAA,CAAK,cAAc,QAAQ,CAAA;AAG7C,MAAA,IAAI;AACF,QAAA,MAASC,WAAO,UAAU,CAAA;AAAA,MAC5B,CAAA,CAAA,MAAQ;AACN,QAAA,UAAA,GAAa,IAAA;AAAA,MACf;AAAA,IACF;AAAA,EACF;AAGA,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,YAAA,GAAe,MAAM,eAAA,CAAgB,QAAA,EAAU,GAAA,EAAK,QAAQ,CAAA;AAE5D,IAAA,IAAI,CAAC,YAAA,EAAc;AACjB,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,QAAQ,CAAA,CAAE,CAAA;AAAA,IAC/C;AAEA,IAAA,UAAA,GAAa,MAAM,WAAA,CAAY,YAAA,EAAc,MAAA,CAAO,UAAU,WAAW,CAAA;AAEzE,IAAA,IAAI,CAAC,UAAA,EAAY;AACf,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,YAAY,CAAA,CAAE,CAAA;AAAA,IAC3D;AAAA,EACF,CAAA,MAAA,IAAW,CAAC,UAAA,EAAY;AACtB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,yBAAA,EAA4B,QAAQ,CAAA,CAAE,CAAA;AAAA,EACxD;AAKA,EAAA,IAAI,SAAS,OAAA,CAAQ,MAAA;AAErB,EAAA,IAAI,CAAC,MAAA,EAAQ;AAEX,IAAA,MAAA,GAAS,OAAA,CAAQ,GAAA,CAAI,MAAA,IAAU,OAAA,CAAQ,GAAA,CAAI,MAAA;AAAA,EAC7C;AAEA,EAAA,IAAI,CAAC,MAAA,EAAQ;AAEX,IAAA,MAAM,WAAW,OAAA,CAAQ,QAAA;AACzB,IAAA,IAAI,aAAa,QAAA,EAAU;AACzB,MAAA,MAAA,GAAS,MAAA;AAAA,IACX,CAAA,MAAA,IAAW,aAAa,OAAA,EAAS;AAC/B,MAAA,MAAA,GAAS,OAAA;AAAA,IACX,CAAA,MAAO;AACL,MAAA,MAAA,GAAS,UAAA;AAAA,IACX;AAAA,EACF;AAEA,EAAA,OAAA,CAAQ,GAAA,CAAIzD,QAAM,IAAA,CAAK,CAAA,QAAA,EAAW,UAAU,CAAA,MAAA,EAAS,MAAM,KAAK,CAAC,CAAA;AAGjE,EAAA,MAAM,KAAA,GAAQyB,KAAAA,CAAM,MAAA,EAAQ,CAAC,UAAU,CAAA,EAAG;AAAA,IACxC,KAAA,EAAO,SAAA;AAAA,IACP,KAAA,EAAO;AAAA,GACR,CAAA;AAGD,EAAA,MAAM,aAAa,CAAC,MAAA,EAAQ,SAAS,UAAA,EAAY,MAAA,EAAQ,QAAQ,MAAM,CAAA;AACvE,EAAA,MAAM,gBAAgB,MAAA,CAAO,IAAA,GAAO,KAAA,CAAM,GAAG,EAAE,CAAC,CAAA;AAChD,EAAA,IAAI,aAAA,IAAiB,UAAA,CAAW,QAAA,CAAS,aAAa,CAAA,EAAG;AAEvD,IAAA,OAAO,IAAI,OAAA,CAAc,CAACtB,QAAAA,EAAS,MAAA,KAAW;AAC5C,MAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,KAAA,KAAU;AAC3B,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,KAAA,CAAM,OAAO,EAAE,CAAC,CAAA;AAAA,MAC5D,CAAC,CAAA;AAED,MAAA,KAAA,CAAM,KAAA,EAAM;AACZ,MAAAA,QAAAA,EAAQ;AAAA,IACV,CAAC,CAAA;AAAA,EACH,CAAA,MAAO;AAEL,IAAA,OAAO,IAAI,OAAA,CAAc,CAACA,QAAAA,EAAS,MAAA,KAAW;AAC5C,MAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,KAAA,KAAU;AAC3B,QAAA,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,sBAAA,EAAyB,KAAA,CAAM,OAAO,EAAE,CAAC,CAAA;AAAA,MAC5D,CAAC,CAAA;AACD,MAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,IAAA,KAAS;AAC1B,QAAA,IAAI,SAAS,CAAA,EAAG;AACd,UAAAA,QAAAA,EAAQ;AAAA,QACV,CAAA,MAAO;AACL,UAAA,MAAA,CAAO,IAAI,KAAA,CAAM,CAAA,wBAAA,EAA2B,IAAI,EAAE,CAAC,CAAA;AAAA,QACrD;AAAA,MACF,CAAC,CAAA;AAAA,IACH,CAAC,CAAA;AAAA,EACH;AACF;ACpaO,SAAS,UAAA,GAAsB;AACpC,EAAA,OAAO,IAAIF,QAAQ,KAAK,CAAA,CACrB,YAAY,kEAAkE,CAAA,CAC9E,OAAO,YAAY;AAClB,IAAA,MAAM,cAAA,EAAe;AAAA,EACvB,CAAC,CAAA;AACL;AAEA,eAAsB,cAAA,GAAgC;AACpD,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,eAAA,EAAgB;AACrC,IAAA,MAAM,SAAA,GAAY,IAAI,oBAAA,EAAqB;AAC3C,IAAA,MAAM,MAAA,CAAO,QAAQ,SAAS,CAAA;AAG9B,IAAA,OAAA,CAAQ,MAAM,0CAA0C,CAAA;AAAA,EAC1D,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,wCAAwC,KAAK,CAAA;AAC3D,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AACF;AC7BO,SAASyD,qBAAAA,CAAqB,OAAA,GAAkB,OAAA,CAAQ,GAAA,EAAI,EAAmB;AACpF,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,GAAA,CAAI,qBAAA,IAAyB,EAAA;AAEvD,EAAA,IAAI,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA,EAAG;AAC9B,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,SAAA,CAAU,QAAA,CAAS,MAAM,CAAA,EAAG;AAC9B,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,SAAA,CAAU,QAAA,CAAS,KAAK,CAAA,EAAG;AAC7B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI,UAAA,CAAWC,IAAAA,CAAK,OAAA,EAAS,gBAAgB,CAAC,CAAA,EAAG;AAC/C,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,UAAA,CAAWA,IAAAA,CAAK,OAAA,EAAS,WAAW,CAAC,CAAA,EAAG;AAC1C,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,IAAI,UAAA,CAAWA,IAAAA,CAAK,OAAA,EAAS,mBAAmB,CAAC,CAAA,EAAG;AAClD,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,OAAO,KAAA;AACT;;;ACrBO,SAAS,SAAA,GAAqB;AACnC,EAAA,OAAO,IAAI1D,OAAAA,CAAQ,IAAI,EACpB,WAAA,CAAY,wCAAwC,EACpD,MAAA,CAAO,mBAAA,EAAqB,kDAAkD,CAAA,CAC9E,MAAA,CAAO,qBAAqB,gBAAA,EAAkB,MAAM,EACpD,MAAA,CAAO,WAAA,EAAa,kCAAkC,CAAA,CACtD,MAAA,CAAO,iBAAA,EAAmB,2BAA2B,EACrD,MAAA,CAAO,sBAAA,EAAwB,yCAAyC,CAAA,CACxE,MAAA,CAAO,qBAAqB,8CAA8C,CAAA,CAC1E,OAAO,OAAA,EAAS,2DAA2D,EAC3E,MAAA,CAAO,WAAA,EAAa,uCAAuC,CAAA,CAC3D,MAAA,CAAO,OAAO,OAAA,KAST;AACJ,IAAA,IAAI;AACF,MAAA,MAAM,QAAQ,OAAO,CAAA;AAAA,IACvB,SAAS,KAAA,EAAO;AAEd,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChB;AAAA,EACF,CAAC,CAAA;AACL;AAKA,eAAsB,QAAQ,OAAA,EASZ;AAEhB,EAAA,MAAM,OAAA,GAAU,QAAA,CAAS,OAAA,CAAQ,IAAA,EAAM,EAAE,CAAA;AACzC,EAAA,IAAI,MAAM,OAAO,CAAA,IAAK,OAAA,GAAU,CAAA,IAAK,UAAU,KAAA,EAAO;AACpD,IAAA,OAAA,CAAQ,MAAMD,OAAAA,CAAM,GAAA,CAAI,+BAA0B,OAAA,CAAQ,IAAI,EAAE,CAAC,CAAA;AACjE,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,GAAA,CAAI,kCAAkC,CAAC,CAAA;AACzD,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,cAAA,EAAiB,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAA;AAAA,EACjD;AAEA,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AAGxB,EAAA,MAAM,SAAA,GAAY,OAAA,CAAQ,YAAA,GAAe,eAAA,GAAkB,YAAA;AAG3D,EAAA,IAAI,QAAA,GAAmB,EAAA;AACvB,EAAA,IAAI,CAAC,QAAQ,YAAA,EAAc;AACzB,IAAA,IAAI,QAAQ,KAAA,EAAO;AACjB,MAAA,QAAA,GAAW,OAAA,CAAQ,GAAA,EAAK,OAAA,CAAQ,KAAK,CAAA;AAAA,IACvC,CAAA,MAAO;AAEL,MAAA,MAAM,MAAA,GAAS,MAAM,UAAA,CAAW,GAAG,CAAA;AACnC,MAAA,QAAA,GAAW2D,IAAAA,CAAK,GAAA,EAAK,MAAA,CAAO,QAAQ,CAAA;AAAA,IACtC;AAGA,IAAA,IAAI,CAACC,UAAAA,CAAW,QAAQ,CAAA,EAAG;AACzB,MAAA,OAAA,CAAQ,MAAM5D,OAAAA,CAAM,GAAA,CAAI,CAAA,kCAAA,EAAgC,QAAQ,EAAE,CAAC,CAAA;AACnE,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,GAAA,CAAI,kEAAkE,CAAC,CAAA;AACzF,MAAA,MAAM,IAAI,KAAA,CAAM,CAAA,2BAAA,EAA8B,QAAQ,CAAA,CAAE,CAAA;AAAA,IAC1D;AAAA,EACF,CAAA,MAAO;AACL,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,mCAA8B,CAAC,CAAA;AAGtD,IAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,MAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,GAAA,CAAI,qBAAqB,OAAA,CAAQ,UAAU,EAAE,CAAC,CAAA;AAAA,IAElE;AAGA,IAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,MAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,GAAA,CAAI,gCAAgC,OAAA,CAAQ,QAAQ,EAAE,CAAC,CAAA;AAAA,IAE3E;AAAA,EACF;AAGA,EAAA,IAAI,QAAQ,GAAA,EAAK;AACf,IAAA,MAAM,kBAAA,GAAqB,wBAAwB,GAAG,CAAA;AACtD,IAAA,IAAI,CAAC,kBAAA,EAAoB;AACvB,MAAA,OAAA,CAAQ,KAAA,CAAMA,OAAAA,CAAM,GAAA,CAAI,CAAA,2DAAA,CAAwD,CAAC,CAAA;AACjF,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,GAAA,CAAI,0CAA0C,CAAC,CAAA;AACjE,MAAA,MAAM,IAAI,MAAM,0BAA0B,CAAA;AAAA,IAC5C;AACA,IAAA,MAAM,UAAA,GAAa2D,IAAAA,CAAK,GAAA,EAAK,aAAa,CAAA;AAC1C,IAAA,OAAO,WAAA,CAAY,UAAA,EAAY,QAAA,EAAU,SAAA,EAAW,OAAO,CAAA;AAAA,EAC7D;AAGA,EAAA,OAAO,cAAA,CAAe,GAAA,EAAK,QAAA,EAAU,SAAA,EAAW,OAAO,CAAA;AACzD;AAQA,SAAS,wBAAwB,GAAA,EAAsB;AAErD,EAAA,MAAM,UAAA,GAAaA,IAAAA,CAAK,GAAA,EAAK,aAAa,CAAA;AAC1C,EAAA,MAAM,aAAA,GAAgBA,IAAAA,CAAK,UAAA,EAAY,cAAc,CAAA;AAErD,EAAA,IAAI,CAACC,UAAAA,CAAW,aAAa,CAAA,EAAG;AAC9B,IAAA,OAAO,KAAA;AAAA,EACT;AAEA,EAAA,IAAI;AACF,IAAA,MAAMpD,eAAc,IAAA,CAAK,KAAA,CAAM,YAAA,CAAa,aAAA,EAAe,OAAO,CAAC,CAAA;AAEnE,IAAA,OAAOA,aAAY,IAAA,KAAS,cAAA;AAAA,EAC9B,CAAA,CAAA,MAAQ;AACN,IAAA,OAAO,KAAA;AAAA,EACT;AACF;AAaA,eAAe,WAAA,CACb,KAAA,EACA,QAAA,EACA,SAAA,EACA,OAAA,EASe;AACf,EAAA,OAAA,CAAQ,GAAA,CAAIR,OAAAA,CAAM,GAAA,CAAI,6DAAwD,CAAC,CAAA;AAE/E,EAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,KAAA,EAAO,IAAA,EAAM,IAAI,CAAA;AAC1C,EAAA,MAAM,cAAA,GAAiB0D,sBAAqB,QAAQ,CAAA;AAEpD,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,OAAA,CAAQ,GAAA,CAAI1D,OAAAA,CAAM,IAAA,CAAK,YAAY,CAAC,CAAA;AACpC,IAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,GAAA,CAAI,CAAA,KAAA,EAAQ,KAAK,EAAE,CAAC,CAAA;AAEtC,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,GAAA,CAAI,CAAA,aAAA,EAAgB,SAAS,CAAA,WAAA,EAAc,QAAQ,CAAA,MAAA,EAAS,OAAA,CAAQ,IAAI,CAAA,CAAA,EAAI,cAAc,UAAU,CAAC,CAAA;AACvH,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,GAAA,CAAI,2BAA2B,OAAA,CAAQ,IAAI,EAAE,CAAC,CAAA;AAAA,IAClE;AACA,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,OAAA,GAAU,GAAA,CAAI,oBAAoB,CAAA,CAAE,KAAA,EAAM;AAGhD,EAAA,MAAM,GAAA,GAAM;AAAA,IACV,GAAG,OAAA,CAAQ,GAAA;AAAA,IACX,UAAA,EAAY,SAAA;AAAA,IACZ,WAAW,QAAA,IAAY,EAAA;AAAA,IACvB,MAAM,OAAA,CAAQ;AAAA,GAChB;AAEA,EAAA,MAAM,QAAQyB,KAAAA,CAAM,cAAA,EAAgB,CAAC,KAAA,EAAO,KAAK,CAAA,EAAG;AAAA,IAClD,GAAA,EAAK,KAAA;AAAA,IACL,KAAA,EAAO,SAAA;AAAA,IACP,GAAA;AAAA,IACA,QAAA,EAAU;AAAA,GACX,CAAA;AAGD,EAAA,MAAM,YAAA,GAAe,WAAW,YAAY;AAC1C,IAAA,OAAA,CAAQ,QAAQ,gBAAgB,CAAA;AAChC,IAAA,OAAA,CAAQ,GAAA,CAAIzB,QAAM,KAAA,CAAM;AAAA,qCAAA,EAAqC,QAAQ,IAAI;AAAA,CAAI,CAAC,CAAA;AAE9E,IAAA,IAAI,QAAQ,YAAA,EAAc;AACxB,MAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,IAAA,CAAK,8BAA8B,CAAC,CAAA;AAGtD,MAAA,IAAI,QAAQ,UAAA,EAAY;AACtB,QAAA,IAAI;AACF,UAAA,MAAM,MAAM,MAAM,KAAA,CAAM,CAAA,iBAAA,EAAoB,OAAA,CAAQ,IAAI,CAAA,aAAA,CAAA,EAAiB;AAAA,YACvE,MAAA,EAAQ,MAAA;AAAA,YACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,YAC9C,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,OAAA,CAAQ,YAAY;AAAA,WAClD,CAAA;AACD,UAAA,IAAI,IAAI,EAAA,EAAI;AACV,YAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,KAAA,CAAM,2BAAsB,OAAA,CAAQ,UAAU,EAAE,CAAC,CAAA;AAAA,UACrE,CAAA,MAAO;AACL,YAAA,OAAA,CAAQ,MAAMA,OAAAA,CAAM,GAAA,CAAI,mCAA8B,OAAA,CAAQ,UAAU,EAAE,CAAC,CAAA;AAAA,UAC7E;AAAA,QACF,SAAS,CAAA,EAAG;AACV,UAAA,OAAA,CAAQ,KAAA,CAAMA,OAAAA,CAAM,GAAA,CAAI,CAAA,uDAAA,CAAoD,CAAC,CAAA;AAAA,QAC/E;AAAA,MACF;AAGA,MAAA,IAAI,QAAQ,QAAA,EAAU;AACpB,QAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,GAAA,CAAI,8BAA8B,OAAA,CAAQ,QAAQ,KAAK,CAAC,CAAA;AAC1E,QAAA,IAAI;AACF,UAAA,MAAM,MAAM,MAAM,KAAA,CAAM,CAAA,iBAAA,EAAoB,OAAA,CAAQ,IAAI,CAAA,4BAAA,CAAA,EAAgC;AAAA,YACtF,MAAA,EAAQ,MAAA;AAAA,YACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,YAC9C,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,OAAA,CAAQ,UAAU;AAAA,WAChD,CAAA;AAED,UAAA,IAAI,IAAI,EAAA,EAAI;AACV,YAAA,MAAM,IAAA,GAAO,MAAM,GAAA,CAAI,IAAA,EAAK;AAC5B,YAAA,MAAM,UAAA,GAAa,IAAA,CAAK,UAAA,IAAc,EAAC;AACvC,YAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,KAAA,CAAM,kBAAa,UAAA,CAAW,MAAM,WAAW,CAAC,CAAA;AAGlE,YAAA,KAAA,MAAW,KAAK,UAAA,EAAY;AAC1B,cAAA,MAAM,SAAS,MAAM,KAAA,CAAM,CAAA,iBAAA,EAAoB,OAAA,CAAQ,IAAI,CAAA,aAAA,CAAA,EAAiB;AAAA,gBAC1E,MAAA,EAAQ,MAAA;AAAA,gBACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,gBAC9C,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,IAAA,EAAM,CAAA,CAAE,MAAM;AAAA,eACtC,CAAA;AACD,cAAA,IAAI,OAAO,EAAA,EAAI;AACb,gBAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,GAAA,CAAI,CAAA,aAAA,EAAgB,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,CAAA,CAAE,IAAI,CAAA,CAAA,CAAG,CAAC,CAAA;AAAA,cAC7D;AAAA,YACF;AAAA,UACF,CAAA,MAAO;AACL,YAAA,OAAA,CAAQ,KAAA,CAAMA,OAAAA,CAAM,GAAA,CAAI,CAAA,oCAAA,CAAiC,CAAC,CAAA;AAAA,UAC5D;AAAA,QACF,SAAS,CAAA,EAAG;AACV,UAAA,OAAA,CAAQ,KAAA,CAAMA,OAAAA,CAAM,GAAA,CAAI,CAAA,kDAAA,CAA+C,CAAC,CAAA;AAAA,QAC1E;AAAA,MACF;AAAA,IACF;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,GAAA,CAAI,0BAA0B,CAAC,CAAA;AAEjD,IAAA,IAAI,QAAQ,IAAA,EAAM;AAChB,MAAA,IAAI;AAEF,QAAA,MAAM,UAAA,GAAa,MAAM,OAAO,MAAM,CAAA;AACtC,QAAA,MAAM,OAAO,UAAA,CAAW,OAAA;AACxB,QAAA,MAAM,IAAA,CAAK,CAAA,iBAAA,EAAoB,OAAA,CAAQ,IAAI,CAAA,CAAE,CAAA;AAAA,MAC/C,SAAS,KAAA,EAAO;AAEd,QAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,MAAA,CAAO,6CAAwC,CAAC,CAAA;AAClE,QAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,GAAA,CAAI,uCAAuC,CAAC,CAAA;AAC9D,QAAA,OAAA,CAAQ,KAAA,CAAMA,OAAAA,CAAM,GAAA,CAAI,CAAA,OAAA,EAAU,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,CAAC,CAAA;AAAA,MAC7F;AAAA,IACF;AAAA,EACF,GAAG,GAAI,CAAA;AAGP,EAAA,MAAM,QAAA,GAAW,CAAC,MAAA,KAA4B;AAC5C,IAAA,YAAA,CAAa,YAAY,CAAA;AACzB,IAAA,OAAA,CAAQ,IAAA,EAAK;AACb,IAAA,IAAI;AACF,MAAA,IAAI,KAAA,IAAS,MAAM,GAAA,EAAK;AAEtB,QAAA,IAAI;AACF,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,KAAA,CAAM,GAAA,EAAK,UAAU,SAAS,CAAA;AAAA,QAC9C,SAAS,GAAA,EAAK;AAEZ,UAAA,KAAA,CAAM,IAAA,CAAK,UAAU,SAAS,CAAA;AAAA,QAChC;AAAA,MACF;AAAA,IACF,SAAS,GAAA,EAAK;AAAA,IAEd;AAEA,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,GAAA,CAAI,yBAAoB,CAAC,CAAA;AAE3C,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB,CAAA;AAEA,EAAA,OAAA,CAAQ,IAAA,CAAK,QAAA,EAAU,MAAM,QAAA,CAAS,QAAQ,CAAC,CAAA;AAC/C,EAAA,OAAA,CAAQ,IAAA,CAAK,SAAA,EAAW,MAAM,QAAA,CAAS,SAAS,CAAC,CAAA;AACjD,EAAA,OAAA,CAAQ,IAAA,CAAK,QAAA,EAAU,MAAM,QAAA,CAAS,QAAQ,CAAC,CAAA;AAG/C,EAAA,IAAI,OAAA,CAAQ,KAAA,IAAS,CAAC,OAAA,CAAQ,MAAM,SAAA,EAAW;AAC7C,IAAA,OAAA,CAAQ,MAAM,IAAA,CAAK,KAAA,EAAO,MAAM,QAAA,CAAS,SAAS,CAAC,CAAA;AAAA,EACrD;AAGA,EAAA,KAAA,CAAM,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,KAAS;AACzB,IAAA,YAAA,CAAa,YAAY,CAAA;AACzB,IAAA,OAAA,CAAQ,IAAA,EAAK;AACb,IAAA,IAAI,IAAA,KAAS,CAAA,IAAK,IAAA,KAAS,IAAA,EAAM;AAC/B,MAAA,OAAA,CAAQ,KAAK,wBAAwB,CAAA;AACrC,MAAA,OAAA,CAAQ,KAAA,CAAMA,QAAM,GAAA,CAAI;AAAA,yBAAA,EAA8B,IAAI,EAAE,CAAC,CAAA;AAC7D,MAAA,OAAA,CAAQ,KAAK,IAAI,CAAA;AAAA,IACnB;AAEA,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB,CAAC,CAAA;AACH;AAEA,eAAe,cAAA,CACb,GAAA,EACA,QAAA,EACA,SAAA,EACA,OAAA,EASe;AACf,EAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,GAAA,CAAI,+CAA0C,CAAC,CAAA;AAEjE,EAAA,MAAM,cAAA,GAAiB0D,sBAAqB,GAAG,CAAA;AAC/C,EAAA,MAAM,EAAE,OAAA,EAAS,IAAA,EAAM,OAAA,KAAY,aAAA,CAAc,cAAA,EAAgB,QAAA,EAAU,SAAA,EAAW,OAAA,CAAQ,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAM,QAAQ,YAAY,CAAA;AAEtI,EAAA,IAAI,QAAQ,MAAA,EAAQ;AAClB,IAAA,OAAA,CAAQ,GAAA,CAAI1D,OAAAA,CAAM,IAAA,CAAK,YAAY,CAAC,CAAA;AACpC,IAAA,OAAA,CAAQ,IAAIA,OAAAA,CAAM,GAAA,CAAI,CAAA,EAAA,EAAK,OAAO,EAAE,CAAC,CAAA;AACrC,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,KAAA,GAAQyB,KAAAA,CAAM,OAAA,EAAS,IAAA,EAAM;AAAA,IACjC,KAAA,EAAO,SAAA;AAAA,IACP,KAAK,OAAA,CAAQ,GAAA;AAAA,IACb,QAAA,EAAU;AAAA,GACX,CAAA;AAED,EAAA,MAAM,iBAAA,GAAoB,CAAC,MAAA,KAA4B;AACrD,IAAA,IAAI;AACF,MAAA,IAAI,KAAA,IAAS,MAAM,GAAA,EAAK;AACtB,QAAA,IAAI;AACF,UAAA,OAAA,CAAQ,IAAA,CAAK,CAAC,KAAA,CAAM,GAAA,EAAK,UAAU,QAAQ,CAAA;AAAA,QAC7C,SAAS,GAAA,EAAK;AACZ,UAAA,KAAA,CAAM,IAAA,CAAK,UAAU,QAAQ,CAAA;AAAA,QAC/B;AAAA,MACF;AAAA,IACF,SAAS,GAAA,EAAK;AAAA,IAEd;AACA,IAAA,OAAA,CAAQ,GAAA,CAAIzB,OAAAA,CAAM,GAAA,CAAI,yBAAoB,CAAC,CAAA;AAC3C,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB,CAAA;AAEA,EAAA,OAAA,CAAQ,IAAA,CAAK,QAAA,EAAU,MAAM,iBAAA,CAAkB,QAAQ,CAAC,CAAA;AACxD,EAAA,OAAA,CAAQ,IAAA,CAAK,SAAA,EAAW,MAAM,iBAAA,CAAkB,SAAS,CAAC,CAAA;AAC1D,EAAA,OAAA,CAAQ,IAAA,CAAK,QAAA,EAAU,MAAM,iBAAA,CAAkB,QAAQ,CAAC,CAAA;AACxD,EAAA,IAAI,OAAA,CAAQ,KAAA,IAAS,CAAC,OAAA,CAAQ,MAAM,SAAA,EAAW;AAC7C,IAAA,OAAA,CAAQ,MAAM,IAAA,CAAK,KAAA,EAAO,MAAM,iBAAA,CAAkB,SAAS,CAAC,CAAA;AAAA,EAC9D;AAEA,EAAA,KAAA,CAAM,EAAA,CAAG,MAAA,EAAQ,CAAC,IAAA,KAAS;AACzB,IAAA,IAAI,IAAA,KAAS,CAAA,IAAK,IAAA,KAAS,IAAA,EAAM;AAC/B,MAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AACd,MAAA;AAAA,IACF;AACA,IAAA,OAAA,CAAQ,KAAA,CAAMA,QAAM,GAAA,CAAI;AAAA,8BAAA,EAAmC,IAAI,EAAE,CAAC,CAAA;AAClE,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,GAAA,CAAI,uFAAuF,CAAC,CAAA;AAC9G,IAAA,OAAA,CAAQ,KAAK,IAAI,CAAA;AAAA,EACnB,CAAC,CAAA;AAED,EAAA,KAAA,CAAM,EAAA,CAAG,OAAA,EAAS,CAAC,KAAA,KAAU;AAC3B,IAAA,OAAA,CAAQ,KAAA,CAAMA,OAAAA,CAAM,GAAA,CAAI,CAAA,+BAAA,EAAkC,KAAA,YAAiB,KAAA,GAAQ,KAAA,CAAM,OAAA,GAAU,MAAA,CAAO,KAAK,CAAC,CAAA,CAAE,CAAC,CAAA;AACnH,IAAA,OAAA,CAAQ,GAAA,CAAIA,OAAAA,CAAM,GAAA,CAAI,oEAAoE,CAAC,CAAA;AAC3F,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB,CAAC,CAAA;AACH;AAEA,SAAS,cACP,cAAA,EACA,QAAA,EACA,SAAA,EACA,IAAA,EACA,aACA,YAAA,EACsD;AACtD,EAAA,MAAM,MAAA,GAAS,CAAC,cAAc,CAAA;AAE9B,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,MAAA,CAAO,IAAA,CAAK,WAAW,QAAQ,CAAA;AAAA,EACjC,CAAA,MAAO;AACL,IAAA,MAAA,CAAO,KAAK,iBAAiB,CAAA;AAAA,EAC/B;AAEA,EAAA,MAAA,CAAO,IAAA,CAAK,UAAU,IAAI,CAAA;AAE1B,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,MAAA,CAAO,KAAK,WAAW,CAAA;AAAA,EACzB;AAEA,EAAA,IAAI,mBAAmB,MAAA,EAAQ;AAC7B,IAAA,MAAM6D,KAAAA,GAAO,CAAC,KAAA,EAAO,GAAG,MAAM,CAAA;AAC9B,IAAA,OAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,IAAA,EAAAA,KAAAA,EAAM,OAAA,EAAS,CAAA,KAAA,EAAQA,KAAAA,CAAK,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,EAAG;AAAA,EACpE;AAEA,EAAA,IAAI,mBAAmB,MAAA,EAAQ;AAC7B,IAAA,MAAMA,KAAAA,GAAO,CAAC,KAAA,EAAO,GAAG,MAAM,CAAA;AAC9B,IAAA,OAAO,EAAE,OAAA,EAAS,MAAA,EAAQ,IAAA,EAAAA,KAAAA,EAAM,OAAA,EAAS,CAAA,KAAA,EAAQA,KAAAA,CAAK,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,EAAG;AAAA,EACpE;AAEA,EAAA,MAAM,IAAA,GAAO,CAAC,OAAA,EAAS,GAAG,MAAM,CAAA;AAChC,EAAA,OAAO,EAAE,OAAA,EAAS,KAAA,EAAO,IAAA,EAAM,OAAA,EAAS,OAAO,IAAA,CAAK,IAAA,CAAK,GAAG,CAAC,CAAA,CAAA,EAAG;AAClE;;;AChaO,SAAS,WAAA,GAA8B;AAC5C,EAAA,OAAO;AAAA,IACL,SAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAa,gJAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX,QAAA,EAAUC,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,iKAAiK;AAAA,OACjM;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,OAAA,EAASA,EAAE,OAAA,EAAQ;AAAA,QACnB,OAAA,EAASA,EAAE,MAAA;AAAO;AACpB,KACF;AAAA,IACA,OAAO,OAAO,MAAA,KAAW;AACvB,MAAA,MAAM,cAAc,OAAA,CAAQ,GAAA;AAC5B,MAAA,IAAI;AACF,QAAA,IAAI,cAAA,GAAiB,EAAA;AACrB,QAAA,OAAA,CAAQ,GAAA,GAAM,IAAI,IAAA,KAAgB;AAChC,UAAA,cAAA,IAAkB,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,GAAI,IAAA;AAAA,QACrC,CAAA;AAEA,QAAA,MAAM,WAAA,CAAY,MAAM,QAAQ,CAAA;AAEhC,QAAA,MAAM,MAAA,GAAS;AAAA,UACb,OAAA,EAAS,IAAA;AAAA,UACT,OAAA,EAAS,CAAA,0BAAA;AAAA,SACX;AAEA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA;AAAA,UAC1E,iBAAA,EAAmB;AAAA,SACrB;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,MAAA,GAAS;AAAA,UACb,OAAA,EAAS,KAAA;AAAA,UACT,OAAA,EAAS,kBAAA,CAAmB,sBAAA,EAAwB,KAAK;AAAA,SAC3D;AACA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA;AAAA,UAC1E,iBAAA,EAAmB;AAAA,SACrB;AAAA,MACF,CAAA,SAAE;AACA,QAAA,OAAA,CAAQ,GAAA,GAAM,WAAA;AAAA,MAChB;AAAA,IACF;AAAA,GACF;AACF;AC/CO,SAAS,YAAA,GAA+B;AAC7C,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO,qBAAA;AAAA,MACP,WAAA,EAAa,0KAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX,KAAA,EAAOA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,8DAA8D,CAAA;AAAA,QAC7G,QAAQA,CAAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,yDAAyD,CAAA;AAAA,QACjG,OAAOA,CAAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,uDAAuD,CAAA;AAAA,QAC9F,iBAAiBA,CAAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,8DAA8D,CAAA;AAAA,QAC/G,oBAAoBA,CAAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,0DAA0D;AAAA,OAChH;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,OAAA,EAASA,EAAE,OAAA,EAAQ;AAAA,QACnB,SAASA,CAAAA,CAAE,KAAA,CAAMA,EAAE,MAAA,EAAQ,EAAE,QAAA,EAAS;AAAA,QACtC,OAAA,EAASA,EAAE,MAAA;AAAO;AACpB,KACF;AAAA,IACA,OAAO,OAAO,MAAA,KAAW;AACvB,MAAA,MAAM,cAAc,OAAA,CAAQ,GAAA;AAC5B,MAAA,MAAM,gBAAgB,OAAA,CAAQ,KAAA;AAC9B,MAAA,IAAI;AACF,QAAA,IAAI,cAAA,GAAiB,EAAA;AACrB,QAAA,OAAA,CAAQ,GAAA,GAAM,IAAI,IAAA,KAAgB;AAChC,UAAA,cAAA,IAAkB,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,GAAI,IAAA;AAAA,QACrC,CAAA;AACA,QAAA,OAAA,CAAQ,KAAA,GAAQ,IAAI,IAAA,KAAgB;AAClC,UAAA,cAAA,IAAkB,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,GAAI,IAAA;AAAA,QACrC,CAAA;AAEA,QAAA,MAAM,kBAAA,CAAmB;AAAA,UACvB,OAAO,KAAA,CAAM,KAAA;AAAA,UACb,QAAQ,KAAA,CAAM,MAAA;AAAA,UACd,OAAO,KAAA,CAAM,KAAA;AAAA,UACb,iBAAiB,KAAA,CAAM,eAAA;AAAA,UACvB,oBAAoB,KAAA,CAAM;AAAA,SAC3B,CAAA;AAGD,QAAA,MAAM,OAAA,GAAU,cAAA,CACb,KAAA,CAAM,IAAI,EACV,MAAA,CAAO,CAAC,CAAA,KAAc,CAAA,CAAE,QAAA,CAAS,UAAU,CAAA,IAAK,CAAA,CAAE,SAAS,QAAG,CAAC,CAAA,CAC/D,GAAA,CAAI,CAAC,CAAA,KAAc,CAAA,CAAE,OAAA,CAAQ,iBAAiB,EAAE,CAAA,CAAE,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA,CAAE,IAAA,EAAM,CAAA,CAC5E,OAAO,OAAO,CAAA;AAEjB,QAAA,MAAM,MAAA,GAAS;AAAA,UACb,OAAA,EAAS,IAAA;AAAA,UACT,OAAA,EAAS,OAAA,CAAQ,MAAA,GAAS,CAAA,GAAI,OAAA,GAAU,KAAA,CAAA;AAAA,UACxC,OAAA,EAAS,MAAM,MAAA,GACX,CAAA,kBAAA,EAAqB,QAAQ,MAAM,CAAA,uBAAA,CAAA,GACnC,CAAA,mBAAA,EAAsB,OAAA,CAAQ,MAAM,CAAA,cAAA;AAAA,SAC1C;AAEA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA;AAAA,UAC1E,iBAAA,EAAmB;AAAA,SACrB;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,YAAA,GAAe,kBAAA,CAAmB,8BAAA,EAAgC,KAAK,CAAA;AAC7E,QAAA,OAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,cAAc,CAAA;AAAA,UACvD,OAAA,EAAS;AAAA,SACX;AAAA,MACF,CAAA,SAAE;AACA,QAAA,OAAA,CAAQ,GAAA,GAAM,WAAA;AACd,QAAA,OAAA,CAAQ,KAAA,GAAQ,aAAA;AAAA,MAClB;AAAA,IACF;AAAA,GACF;AACF;ACtEA,eAAsB,YAAA,GAAmC;AACvD,EAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,CAAa;AAAA,IAC/B,eAAA,EAAiB;AAAA,GAClB,CAAA;AAED,EAAA,MAAM,OAAA,GAAgC;AAAA,IACpC,SAAS,EAAC;AAAA,IACV,eAAe,EAAC;AAAA,IAChB,UAAU,EAAC;AAAA,IACX,UAAU;AAAC,GACb;AAEA,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,OAAA,CAAQ,KAAK,WAAA,CAAY,MAAM,EAAE,IAAA,CAAK,UAAA,CAAW,IAAI,CAAC,CAAA;AAAA,EACxD;AAEA,EAAA,OAAO,EAAE,OAAA,EAAQ;AACnB;AAKO,SAAS,SAAA,GAA4B;AAC1C,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO,kBAAA;AAAA,MACP,WAAA,EAAa,oNAAA;AAAA,MACb,aAAa,EAAC;AAAA,MACd,YAAA,EAAc;AAAA,QACZ,KAAA,EAAOA,EAAE,GAAA,EAAI;AAAA,QACb,UAAUA,CAAAA,CAAE,KAAA,CAAMA,EAAE,MAAA,EAAQ,EAAE,QAAA;AAAS;AACzC,KACF;AAAA,IACA,OAAO,QAAQ,MAAA,KAAW;AACxB,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,EAAa;AAGjC,QAAA,MAAM,UAAA,GAAa,cAAc,KAAK,CAAA;AACtC,QAAA,MAAM,WAAqB,EAAC;AAE5B,QAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AACzB,UAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,YAAA,QAAA,CAAS,KAAK,CAAA,mBAAA,EAAY,IAAA,CAAK,IAAI,CAAA,2BAAA,EAA8B,IAAA,CAAK,SAAS,CAAA,gCAAA,CAAkC,CAAA;AAAA,UACnH;AAAA,QACF;AAEA,QAAA,MAAM,MAAA,GAAS;AAAA,UACb,KAAA;AAAA,UACA,GAAI,QAAA,CAAS,MAAA,GAAS,IAAI,EAAE,QAAA,KAAa;AAAC,SAC5C;AAEA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA;AAAA,UAC1E,iBAAA,EAAmB;AAAA,SACrB;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,YAAA,GAAe,kBAAA,CAAmB,qBAAA,EAAuB,KAAK,CAAA;AACpE,QAAA,OAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,cAAc,CAAA;AAAA,UACvD,OAAA,EAAS;AAAA,SACX;AAAA,MACF;AAAA,IACF;AAAA,GACF;AACF;AClEO,SAAS,SAAA,GAA4B;AAC1C,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO,0BAAA;AAAA,MACP,WAAA,EAAa,+JAAA;AAAA,MACb,aAAa,EAAC;AAAA,MACd,YAAA,EAAc;AAAA,QACZ,YAAA,EAAcA,EAAE,OAAA,EAAQ;AAAA,QACxB,WAAWA,CAAAA,CAAE,KAAA,CAAMA,EAAE,GAAA,EAAK,EAAE,QAAA,EAAS;AAAA,QACrC,OAAA,EAASA,EAAE,MAAA;AAAO;AACpB,KACF;AAAA,IACA,OAAO,QAAQ,MAAA,KAAW;AACxB,MAAA,MAAM,cAAc,OAAA,CAAQ,GAAA;AAC5B,MAAA,MAAM,gBAAgB,OAAA,CAAQ,KAAA;AAC9B,MAAA,IAAI;AACF,QAAA,IAAI,cAAA,GAAiB,EAAA;AACrB,QAAA,OAAA,CAAQ,GAAA,GAAM,IAAI,IAAA,KAAgB;AAChC,UAAA,cAAA,IAAkB,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,GAAI,IAAA;AAAA,QACrC,CAAA;AACA,QAAA,OAAA,CAAQ,KAAA,GAAQ,IAAI,IAAA,KAAgB;AAClC,UAAA,cAAA,IAAkB,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,GAAI,IAAA;AAAA,QACrC,CAAA;AAEA,QAAA,MAAM,iBAAiB,MAAM,UAAA,CAAW,EAAE,KAAA,EAAO,OAAO,CAAA;AAExD,QAAA,MAAM,MAAA,GAAS;AAAA,UACb,cAAc,CAAC,cAAA;AAAA,UACf,OAAA,EAAS,iBAAiB,6BAAA,GAAgC,6BAAA;AAAA,UAC1D,SAAA,EAAW,CAAC,cAAA,GAAiB,cAAA,CAAe,KAAA,CAAM,IAAI,CAAA,CAAE,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,IAAA,EAAM,CAAA,GAAI,KAAA;AAAA,SAClF;AAEA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA;AAAA,UAC1E,iBAAA,EAAmB;AAAA,SACrB;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,YAAA,GAAe,kBAAA,CAAmB,sBAAA,EAAwB,KAAK,CAAA;AACrE,QAAA,OAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,cAAc,CAAA;AAAA,UACvD,OAAA,EAAS;AAAA,SACX;AAAA,MACF,CAAA,SAAE;AACA,QAAA,OAAA,CAAQ,GAAA,GAAM,WAAA;AACd,QAAA,OAAA,CAAQ,KAAA,GAAQ,aAAA;AAAA,MAClB;AAAA,IACF;AAAA,GACF;AACF;AChDO,SAAS,UAAA,GAA6B;AAC3C,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO,aAAA;AAAA,MACP,WAAA,EAAa,wKAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX,IAAA,EAAMA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,+JAA+J,CAAA;AAAA,QACzL,OAAOA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,+EAA+E,CAAA;AAAA,QACrH,aAAaA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,0DAA0D,CAAA;AAAA,QACtG,IAAA,EAAMA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,kEAAkE,CAAA;AAAA,QAChH,QAAA,EAAUA,CAAAA,CAAE,IAAA,CAAK,CAAC,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,UAAU,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE,SAAS,qEAAqE,CAAA;AAAA,QACjJ,UAAUA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,mCAAmC,CAAA;AAAA,QAC5E,UAAUA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,yFAAyF,CAAA;AAAA,QAClI,SAAA,EAAWA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,kGAAkG,CAAA;AAAA,QACrJ,OAAA,EAASA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,8EAA8E;AAAA,OACjI;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,OAAA,EAASA,EAAE,OAAA,EAAQ;AAAA,QACnB,IAAA,EAAMA,EAAE,MAAA,EAAO;AAAA,QACf,OAAA,EAASA,EAAE,MAAA,EAAO;AAAA,QAClB,QAAA,EAAUA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS;AAChC,KACF;AAAA,IACA,OAAO,OAAO,MAAA,KAAW;AACvB,MAAA,MAAM,cAAc,OAAA,CAAQ,GAAA;AAC5B,MAAA,IAAI;AAEF,QAAA,IAAI,cAAA,GAAiB,EAAA;AACrB,QAAA,OAAA,CAAQ,GAAA,GAAM,IAAI,IAAA,KAAgB;AAChC,UAAA,cAAA,IAAkB,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,GAAI,IAAA;AAAA,QACrC,CAAA;AAEA,QAAA,MAAM,UAAA,CAAW,MAAM,IAAA,EAAM;AAAA,UAC3B,OAAO,KAAA,CAAM,KAAA;AAAA,UACb,aAAa,KAAA,CAAM,WAAA;AAAA,UACnB,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,UAAU,KAAA,CAAM,QAAA;AAAA,UAChB,UAAU,KAAA,CAAM,QAAA;AAAA,UAChB,UAAU,KAAA,CAAM,QAAA;AAAA,UAChB,WAAW,KAAA,CAAM,SAAA;AAAA,UACjB,SAAS,KAAA,CAAM;AAAA,SAChB,CAAA;AAED,QAAA,MAAM,MAAA,GAAS;AAAA,UACb,OAAA,EAAS,IAAA;AAAA,UACT,MAAM,cAAA,CAAe,QAAA,CAAS,UAAU,CAAA,GAAI,eAAe,KAAA,CAAM,UAAU,CAAA,CAAE,CAAC,EAAE,KAAA,CAAM,IAAI,EAAE,CAAC,CAAA,CAAE,MAAK,GAAI,EAAA;AAAA,UACxG,OAAA,EAAS,CAAA,MAAA,EAAS,KAAA,CAAM,IAAI,CAAA,sBAAA,CAAA;AAAA,UAC5B,QAAA,EAAU;AAAA,SACZ;AAEA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA;AAAA,UAC1E,iBAAA,EAAmB;AAAA,SACrB;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,MAAA,GAAS;AAAA,UACb,OAAA,EAAS,KAAA;AAAA,UACT,IAAA,EAAM,EAAA;AAAA,UACN,OAAA,EAAS,kBAAA,CAAmB,qBAAA,EAAuB,KAAK;AAAA,SAC1D;AACA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA;AAAA,UAC1E,iBAAA,EAAmB;AAAA,SACrB;AAAA,MACF,CAAA,SAAE;AACA,QAAA,OAAA,CAAQ,GAAA,GAAM,WAAA;AAAA,MAChB;AAAA,IACF;AAAA,GACF;AACF;ACnEA,eAAsB,WAAA,CAAY,QAAA,EAAkB,IAAA,GAAe,UAAA,EAA0B;AAE3F,EAAA,MAAM,MAAA,GAAS,MAAM,UAAA,EAAW;AAChC,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AACxB,EAAA,MAAM,QAAA,GAAgBC,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,MAAA,CAAO,QAAQ,CAAA;AAC/C,EAAA,MAAM,YAAA,GAAe,MAAM,eAAA,CAAgB,QAAA,EAAU,KAAK,QAAQ,CAAA;AAElE,EAAA,IAAI,CAAC,YAAA,EAAc;AACjB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,QAAQ,CAAA,CAAE,CAAA;AAAA,EAC/C;AAGA,EAAA,MAAM,WAAW,MAAM,YAAA,CAAa,EAAE,eAAA,EAAiB,MAAM,CAAA;AAC7D,EAAA,MAAM,KAAA,GAAQ,IAAI,mBAAA,CAAoB,QAAQ,CAAA;AAG9C,EAAA,MAAM,OAAO,QAAA,CAAS,IAAA,CAAK,CAAA,CAAA,KAAK,CAAA,CAAE,SAAS,YAAY,CAAA;AACvD,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,QAAQ,CAAA,CAAE,CAAA;AAAA,EAC/C;AAEA,EAAA,IAAI,SAAS,UAAA,EAAY;AACvB,IAAA,MAAM,aAAA,GAAgB,KAAA,CAAM,gBAAA,CAAiB,IAAA,CAAK,IAAI,CAAA;AACtD,IAAA,OAAO;AAAA,MACL,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,cAAc,OAAA,CAAQ,IAAA;AAAA,QAC5B,MAAA,EAAQ,aAAA,CAAc,OAAA,CAAQ,WAAA,CAAY,MAAA;AAAA,QAC1C,QAAA,EAAU,aAAA,CAAc,OAAA,CAAQ,WAAA,CAAY;AAAA,OAC9C;AAAA,MACA,SAAA,EAAW,aAAA,CAAc,SAAA,CAAU,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,QAC3C,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,MAAA,EAAQ,EAAE,WAAA,CAAY,MAAA;AAAA,QACtB,QAAA,EAAU,EAAE,WAAA,CAAY;AAAA,OAC1B,CAAE,CAAA;AAAA,MACF,UAAA,EAAY,aAAA,CAAc,UAAA,CAAW,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,QAC7C,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,MAAA,EAAQ,EAAE,WAAA,CAAY,MAAA;AAAA,QACtB,QAAA,EAAU,EAAE,WAAA,CAAY;AAAA,OAC1B,CAAE,CAAA;AAAA,MACF,OAAA,EAAS,aAAA,CAAc,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,QACvC,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,MAAA,EAAQ,EAAE,WAAA,CAAY,MAAA;AAAA,QACtB,QAAA,EAAU,EAAE,WAAA,CAAY;AAAA,OAC1B,CAAE;AAAA,KACJ;AAAA,EACF,CAAA,MAAA,IAAW,SAAS,UAAA,EAAY;AAC9B,IAAA,MAAM,QAAA,GAAW,KAAA,CAAM,WAAA,CAAY,IAAA,CAAK,MAAM,CAAC,CAAA;AAC/C,IAAA,OAAO;AAAA,MACL,IAAA,EAAM;AAAA,QACJ,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,MAAA,EAAQ,KAAK,WAAA,CAAY,MAAA;AAAA,QACzB,QAAA,EAAU,KAAK,WAAA,CAAY;AAAA,OAC7B;AAAA,MACA,SAAA,EAAW,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,QAC5B,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,MAAA,EAAQ,EAAE,WAAA,CAAY,MAAA;AAAA,QACtB,QAAA,EAAU,EAAE,WAAA,CAAY;AAAA,OAC1B,CAAE;AAAA,KACJ;AAAA,EACF,CAAA,MAAA,IAAW,SAAS,YAAA,EAAc;AAChC,IAAA,MAAM,UAAA,GAAa,KAAA,CAAM,aAAA,CAAc,IAAA,CAAK,MAAM,CAAC,CAAA;AACnD,IAAA,OAAO;AAAA,MACL,IAAA,EAAM;AAAA,QACJ,MAAM,IAAA,CAAK,IAAA;AAAA,QACX,MAAA,EAAQ,KAAK,WAAA,CAAY,MAAA;AAAA,QACzB,QAAA,EAAU,KAAK,WAAA,CAAY;AAAA,OAC7B;AAAA,MACA,UAAA,EAAY,UAAA,CAAW,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,QAC/B,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,MAAA,EAAQ,EAAE,WAAA,CAAY,MAAA;AAAA,QACtB,QAAA,EAAU,EAAE,WAAA,CAAY;AAAA,OAC1B,CAAE;AAAA,KACJ;AAAA,EACF,CAAA,MAAA,IAAW,SAAS,QAAA,EAAU;AAC5B,IAAA,MAAM,MAAA,GAAS,KAAA,CAAM,eAAA,CAAgB,IAAA,CAAK,MAAM,CAAC,CAAA;AACjD,IAAA,OAAO;AAAA,MACL,IAAA,EAAM;AAAA,QACJ,IAAA,EAAM,OAAO,OAAA,CAAQ,IAAA;AAAA,QACrB,MAAA,EAAQ,MAAA,CAAO,OAAA,CAAQ,WAAA,CAAY,MAAA;AAAA,QACnC,QAAA,EAAU,MAAA,CAAO,OAAA,CAAQ,WAAA,CAAY;AAAA,OACvC;AAAA,MACA,QAAA,EAAU,MAAA,CAAO,QAAA,CAAS,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,QAClC,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,MAAA,EAAQ,EAAE,WAAA,CAAY,MAAA;AAAA,QACtB,QAAA,EAAU,EAAE,WAAA,CAAY;AAAA,OAC1B,CAAE,CAAA;AAAA,MACF,UAAA,EAAY,MAAA,CAAO,UAAA,CAAW,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,QACtC,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,MAAA,EAAQ,EAAE,WAAA,CAAY,MAAA;AAAA,QACtB,QAAA,EAAU,EAAE,WAAA,CAAY;AAAA,OAC1B,CAAE,CAAA;AAAA,MACF,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,CAAA,CAAA,MAAM;AAAA,QAChC,MAAM,CAAA,CAAE,IAAA;AAAA,QACR,MAAA,EAAQ,EAAE,WAAA,CAAY,MAAA;AAAA,QACtB,QAAA,EAAU,EAAE,WAAA,CAAY;AAAA,OAC1B,CAAE,CAAA;AAAA,MACF,KAAA,EAAO,OAAO,QAAA,CAAS,MAAA,GAAS,OAAO,UAAA,CAAW,MAAA,GAAS,OAAO,OAAA,CAAQ;AAAA,KAC5E;AAAA,EACF;AAGA,EAAA,OAAO,WAAA,CAAY,UAAU,UAAU,CAAA;AACzC;AAKO,SAAS,QAAA,GAA2B;AACzC,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO,kBAAA;AAAA,MACP,WAAA,EAAa,2PAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX,QAAA,EAAUD,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,iKAAiK,CAAA;AAAA,QAC/L,IAAA,EAAMA,CAAAA,CAAE,IAAA,CAAK,CAAC,UAAA,EAAY,UAAA,EAAY,YAAA,EAAc,QAAQ,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE,SAAS,sKAAsK;AAAA,OAC3P;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,YAAA,EAAcA,EAAE,GAAA;AAAI;AACtB,KACF;AAAA,IACA,OAAO,OAAO,MAAA,KAAW;AAEvB,MAAA,IAAI;AACF,QAAA,MAAM,IAAA,GAAO,MAAM,IAAA,IAAQ,UAAA;AAC3B,QAAA,MAAM,IAAA,GAAO,MAAM,WAAA,CAAY,KAAA,CAAM,UAAU,IAAI,CAAA;AACnD,QAAA,MAAM,MAAA,GAAS,EAAE,YAAA,EAAc,IAAA,EAAM,IAAA,EAAK;AAC1C,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA;AAAA,UAC1E,iBAAA,EAAmB;AAAA,SACrB;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,YAAA,GAAe,kBAAA,CAAmB,4BAAA,EAA8B,KAAK,CAAA;AAC3E,QAAA,OAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,cAAc,CAAA;AAAA,UACvD,OAAA,EAAS;AAAA,SACX;AAAA,MACF;AAAA,IACF;AAAA,GACF;AACF;AChJO,SAAS,SAAA,GAA4B;AAC1C,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO,iBAAA;AAAA,MACP,WAAA,EAAa,sIAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX,QAAA,EAAUA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,wKAAwK,CAAA;AAAA,QACtM,IAAA,EAAMA,CAAAA,CAAE,IAAA,CAAK,CAAC,MAAA,EAAQ,QAAQ,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,+EAA+E;AAAA,OACtI;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,KAAA,EAAOA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,KAAK;AAAA;AACxB,KACF;AAAA,IACA,OAAO,OAAO,MAAA,KAAW;AACvB,MAAA,MAAM,cAAc,OAAA,CAAQ,GAAA;AAC5B,MAAA,MAAM,gBAAgB,OAAA,CAAQ,KAAA;AAC9B,MAAA,IAAI;AACF,QAAA,IAAI,cAAA,GAAiB,EAAA;AACrB,QAAA,OAAA,CAAQ,GAAA,GAAM,IAAI,IAAA,KAAgB;AAChC,UAAA,cAAA,IAAkB,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,GAAI,IAAA;AAAA,QACrC,CAAA;AACA,QAAA,OAAA,CAAQ,KAAA,GAAQ,IAAI,IAAA,KAAgB;AAClC,UAAA,cAAA,IAAkB,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,GAAI,IAAA;AAAA,QACrC,CAAA;AAEA,QAAA,MAAM,SAAA,CAAU,MAAM,QAAA,EAAU;AAAA,UAC9B,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,IAAA,EAAM;AAAA,SACP,CAAA;AAGD,QAAA,MAAM,KAAA,GAAQ,cAAA,CAAe,KAAA,CAAM,IAAI,CAAA,CAAE,OAAO,CAAC,CAAA,KAAc,CAAA,CAAE,IAAA,EAAM,CAAA;AACvE,QAAA,MAAM,KAAA,GAAQ,KAAA,CACX,MAAA,CAAO,CAAC,CAAA,KAAc,CAAA,CAAE,QAAA,CAAS,oBAAK,CAAA,IAAK,CAAA,CAAE,QAAA,CAAS,oBAAK,CAAA,IAAK,CAAA,CAAE,KAAA,CAAM,UAAU,CAAC,CAAA,CACnF,GAAA,CAAI,CAAC,CAAA,KAAc,CAAA,CAAE,OAAA,CAAQ,cAAA,EAAgB,EAAE,CAAA,CAAE,IAAA,EAAM,CAAA;AAE1D,QAAA,MAAM,MAAA,GAAS,EAAE,KAAA,EAAM;AACvB,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA;AAAA,UAC1E,iBAAA,EAAmB;AAAA,SACrB;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,YAAA,GAAe,kBAAA,CAAmB,qBAAA,EAAuB,KAAK,CAAA;AACpE,QAAA,OAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,cAAc,CAAA;AAAA,UACvD,OAAA,EAAS;AAAA,SACX;AAAA,MACF,CAAA,SAAE;AACA,QAAA,OAAA,CAAQ,GAAA,GAAM,WAAA;AACd,QAAA,OAAA,CAAQ,KAAA,GAAQ,aAAA;AAAA,MAClB;AAAA,IACF;AAAA,GACF;AACF;ACtDO,SAAS,QAAA,GAA2B;AACzC,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO,YAAA;AAAA,MACP,WAAA,EAAa,2MAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX,QAAA,EAAUA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,8KAA8K,CAAA;AAAA,QAC5M,WAAWA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,kHAAkH,CAAA;AAAA,QAC5J,SAASA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,mIAAmI;AAAA,OAC7K;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,OAAA,EAASA,EAAE,OAAA,EAAQ;AAAA,QACnB,OAAA,EAASA,EAAE,MAAA,EAAO;AAAA,QAClB,SAASA,CAAAA,CAAE,KAAA,CAAMA,EAAE,MAAA,EAAQ,EAAE,QAAA;AAAS;AACxC,KACF;AAAA,IACA,OAAO,OAAO,MAAA,KAAW;AACvB,MAAA,MAAM,cAAc,OAAA,CAAQ,GAAA;AAC5B,MAAA,IAAI;AAEF,QAAA,IAAI,CAAC,KAAA,CAAM,SAAA,IAAa,CAAC,MAAM,OAAA,EAAS;AACtC,UAAA,MAAME,OAAAA,GAAS;AAAA,YACb,OAAA,EAAS,KAAA;AAAA,YACT,OAAA,EAAS;AAAA,WACX;AACA,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAUA,OAAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA;AAAA,YAC1E,iBAAA,EAAmBA;AAAA,WACrB;AAAA,QACF;AAGA,QAAA,MAAM,eAAyB,EAAC;AAChC,QAAA,OAAA,CAAQ,GAAA,GAAM,IAAI,IAAA,KAAgB;AAChC,UAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAEzB,UAAA,IAAI,GAAA,CAAI,QAAA,CAAS,UAAU,CAAA,EAAG;AAC5B,YAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,kBAAkB,CAAA;AAC1C,YAAA,IAAI,KAAA,EAAO;AACT,cAAA,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,YAC5B;AAAA,UACF;AAAA,QACF,CAAA;AAEA,QAAA,MAAM,QAAA,CAAS,MAAM,QAAA,EAAU;AAAA,UAC7B,WAAW,KAAA,CAAM,SAAA;AAAA,UACjB,SAAS,KAAA,CAAM;AAAA,SAChB,CAAA;AAED,QAAA,MAAM,MAAA,GAAS;AAAA,UACb,OAAA,EAAS,IAAA;AAAA,UACT,OAAA,EAAS,CAAA,6BAAA,EAAgC,KAAA,CAAM,QAAQ,CAAA,CAAA,CAAA;AAAA,UACvD,OAAA,EAAS,YAAA,CAAa,MAAA,GAAS,CAAA,GAAI,YAAA,GAAe,KAAA;AAAA,SACpD;AAEA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA;AAAA,UAC1E,iBAAA,EAAmB;AAAA,SACrB;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,MAAA,GAAS;AAAA,UACb,OAAA,EAAS,KAAA;AAAA,UACT,OAAA,EAAS,kBAAA,CAAmB,qBAAA,EAAuB,KAAK;AAAA,SAC1D;AACA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA;AAAA,UAC1E,iBAAA,EAAmB;AAAA,SACrB;AAAA,MACF,CAAA,SAAE;AACA,QAAA,OAAA,CAAQ,GAAA,GAAM,WAAA;AAAA,MAChB;AAAA,IACF;AAAA,GACF;AACF;ACzEA,eAAsB,cAAc,OAAA,EAOZ;AACtB,EAAA,MAAM,SAA4B,EAAC;AACnC,EAAA,IAAI,OAAA,CAAQ,MAAA,EAAQ,MAAA,CAAO,MAAA,GAAS,OAAA,CAAQ,MAAA;AAC5C,EAAA,IAAI,OAAA,CAAQ,IAAA,EAAM,MAAA,CAAO,IAAA,GAAO,OAAA,CAAQ,IAAA;AACxC,EAAA,IAAI,OAAA,CAAQ,QAAA,EAAU,MAAA,CAAO,QAAA,GAAW,OAAA,CAAQ,QAAA;AAChD,EAAA,IAAI,OAAA,CAAQ,QAAA,EAAU,MAAA,CAAO,QAAA,GAAW,OAAA,CAAQ,QAAA;AAChD,EAAA,IAAI,OAAA,CAAQ,YAAA,EAAc,MAAA,CAAO,YAAA,GAAe,OAAA,CAAQ,YAAA;AAExD,EAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,CAAa;AAAA,IAC/B,eAAA,EAAiB,QAAQ,eAAA,IAAmB,KAAA;AAAA,IAC5C;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,SAAA,GAAY,MAAM,OAAA,CAAQ,GAAA;AAAA,IAC9B,KAAA,CAAM,GAAA,CAAI,OAAO,IAAA,KAAS;AACxB,MAAA,MAAM,IAAA,GAAO,WAAW,IAAI,CAAA;AAG5B,MAAA,MAAM,QAAA,GAAW,MAAM,mBAAA,CAAoB,IAAA,CAAK,QAAQ,CAAA;AACxD,MAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,QAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,MAClB;AAEA,MAAA,OAAO,IAAA;AAAA,IACT,CAAC;AAAA,GACH;AAEA,EAAA,OAAO,SAAA;AACT;AAKO,SAAS,QAAA,GAA2B;AACzC,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO,YAAA;AAAA,MACP,WAAA,EAAa,iMAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX,MAAA,EAAQF,CAAAA,CAAE,IAAA,CAAK,CAAC,SAAA,EAAW,aAAA,EAAe,UAAA,EAAY,UAAU,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE,SAAS,+DAA+D,CAAA;AAAA,QACtJ,IAAA,EAAMA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,kGAAkG,CAAA;AAAA,QAChJ,QAAA,EAAUA,CAAAA,CAAE,IAAA,CAAK,CAAC,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,UAAU,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE,SAAS,kEAAkE,CAAA;AAAA,QAC9I,UAAUA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,2EAA2E,CAAA;AAAA,QACpH,iBAAiBA,CAAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,iGAAiG;AAAA,OACpJ;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,KAAA,EAAOA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,KAAK,CAAA;AAAA,QACtB,UAAUA,CAAAA,CAAE,KAAA,CAAMA,EAAE,MAAA,EAAQ,EAAE,QAAA;AAAS;AACzC,KACF;AAAA,IACA,OAAO,OAAO,MAAA,KAAW;AAEvB,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,MAAM,aAAA,CAAc;AAAA,UAChC,QAAQ,KAAA,CAAM,MAAA;AAAA,UACd,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,UAAU,KAAA,CAAM,QAAA;AAAA,UAChB,UAAU,KAAA,CAAM,QAAA;AAAA,UAChB,iBAAiB,KAAA,CAAM;AAAA,SACxB,CAAA;AAGD,QAAA,MAAM,WAAqB,EAAC;AAC5B,QAAA,IAAI,CAAC,MAAM,MAAA,EAAQ;AAEjB,UAAA,MAAM,kBAAkB,KAAA,CAAM,MAAA,CAAO,CAAA,CAAA,KAAK,CAAA,CAAE,WAAW,aAAa,CAAA;AACpE,UAAA,MAAM,SAAA,GAAuB;AAAA,YAC3B,OAAA,EAAS;AAAA,cACP,SAAS,EAAC;AAAA,cACV,aAAA,EAAe,eAAA;AAAA,cACf,UAAU,EAAC;AAAA,cACX,UAAU;AAAC;AACb,WACF;AACA,UAAA,MAAM,UAAA,GAAa,cAAc,SAAS,CAAA;AAC1C,UAAA,KAAA,MAAW,QAAQ,UAAA,EAAY;AAC7B,YAAA,QAAA,CAAS,KAAK,CAAA,mBAAA,EAAY,IAAA,CAAK,IAAI,CAAA,2BAAA,EAA8B,IAAA,CAAK,SAAS,CAAA,gCAAA,CAAkC,CAAA;AAAA,UACnH;AAAA,QACF;AAEA,QAAA,MAAM,MAAA,GAAS;AAAA,UACb,KAAA;AAAA,UACA,GAAI,QAAA,CAAS,MAAA,GAAS,IAAI,EAAE,QAAA,KAAa;AAAC,SAC5C;AACA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA;AAAA,UAC1E,iBAAA,EAAmB;AAAA,SACrB;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,YAAA,GAAe,kBAAA,CAAmB,qBAAA,EAAuB,KAAK,CAAA;AACpE,QAAA,OAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,cAAc,CAAA;AAAA,UACvD,OAAA,EAAS;AAAA,SACX;AAAA,MACF;AAAA,IACF;AAAA,GACF;AACF;ACzGA,eAAsB,eAAA,CAAgB,OAAe,OAAA,EAyBlD;AACD,EAAA,MAAM,SAA4B,EAAC;AACnC,EAAA,IAAI,OAAA,CAAQ,MAAA,EAAQ,MAAA,CAAO,MAAA,GAAS,OAAA,CAAQ,MAAA;AAC5C,EAAA,IAAI,OAAA,CAAQ,IAAA,EAAM,MAAA,CAAO,IAAA,GAAO,OAAA,CAAQ,IAAA;AACxC,EAAA,IAAI,OAAA,CAAQ,QAAA,EAAU,MAAA,CAAO,QAAA,GAAW,OAAA,CAAQ,QAAA;AAChD,EAAA,IAAI,OAAA,CAAQ,QAAA,EAAU,MAAA,CAAO,QAAA,GAAW,OAAA,CAAQ,QAAA;AAChD,EAAA,IAAI,OAAA,CAAQ,YAAA,EAAc,MAAA,CAAO,YAAA,GAAe,OAAA,CAAQ,YAAA;AAExD,EAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,CAAa;AAAA,IAC/B,eAAA,EAAiB,IAAA;AAAA,IACjB,cAAA,EAAgB,IAAA;AAAA,IAChB;AAAA,GACD,CAAA;AAGD,EAAA,MAAM,eAAA,GAAoC,KAAA,CAAM,GAAA,CAAI,CAAA,IAAA,MAAS;AAAA,IAC3D,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,MAAA,EAAQ,KAAK,WAAA,CAAY,MAAA;AAAA,IACzB,QAAA,EAAU,KAAK,WAAA,CAAY,QAAA;AAAA,IAC3B,IAAA,EAAM,KAAK,WAAA,CAAY,IAAA;AAAA,IACvB,KAAA,EAAO,KAAK,WAAA,CAAY,KAAA;AAAA,IACxB,WAAA,EAAa,KAAK,WAAA,CAAY,WAAA;AAAA,IAC9B,SAAS,IAAA,CAAK,OAAA;AAAA,IACd,OAAA,EAAS,KAAK,WAAA,CAAY,OAAA;AAAA,IAC1B,OAAA,EAAS,KAAK,WAAA,CAAY,UAAA;AAAA,IAC1B,QAAA,EAAU,KAAK,WAAA,CAAY;AAAA,GAC7B,CAAE,CAAA;AAGF,EAAA,MAAM,YAAA,GAAe,mBAAA,CAAoB,KAAA,EAAO,eAAA,EAAiB;AAAA,IAC/D,iBAAA,EAAmB,CAAA;AAAA,IACnB,aAAA,EAAe;AAAA,GAChB,CAAA;AAGD,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,CAAQ,GAAA;AAAA,IAC5B,YAAA,CAAa,OAAA,CAAQ,GAAA,CAAI,OAAO,MAAA,KAAW;AACzC,MAAA,MAAM,QAAA,GAAW,MAAM,IAAA,CAAK,CAAA,CAAA,KAAK,EAAE,IAAA,KAAS,MAAA,CAAO,KAAK,IAAI,CAAA;AAE5D,MAAA,MAAM,IAAA,GAAiB;AAAA,QACrB,IAAA,EAAM,OAAO,IAAA,CAAK,IAAA;AAAA,QAClB,IAAA,EAAM,OAAO,IAAA,CAAK,IAAA;AAAA,QAClB,MAAA,EAAQ,OAAO,IAAA,CAAK,MAAA;AAAA,QACpB,OAAA,EAAS,QAAA,EAAU,WAAA,CAAY,OAAA,IAAW,EAAA;AAAA,QAC1C,KAAA,EAAO,OAAO,IAAA,CAAK,KAAA;AAAA,QACnB,IAAA,EAAM,OAAO,IAAA,CAAK,IAAA;AAAA,QAClB,QAAA,EAAU,OAAO,IAAA,CAAK,QAAA;AAAA,QACtB,QAAA,EAAU,UAAU,WAAA,CAAY,QAAA;AAAA,QAChC,WAAA,EAAa,OAAO,IAAA,CAAK,WAAA;AAAA,QACzB,YAAA,EAAc,UAAU,WAAA,CAAY;AAAA,OACtC;AAGA,MAAA,IAAI,UAAU,QAAA,EAAU;AACtB,QAAA,MAAM,QAAA,GAAW,MAAM,mBAAA,CAAoB,QAAA,CAAS,QAAQ,CAAA;AAC5D,QAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,UAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,QAClB;AAAA,MACF;AAEA,MAAA,OAAO;AAAA,QACL,IAAA;AAAA,QACA,OAAO,MAAA,CAAO,KAAA;AAAA,QACd,cAAc,MAAA,CAAO,YAAA;AAAA,QACrB,OAAA,EAAS,MAAA,CAAO,OAAA,CAAQ,GAAA,CAAI,CAAA,KAAA,MAAU;AAAA,UACpC,OAAO,KAAA,CAAM,KAAA;AAAA,UACb,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,YAAY,KAAA,CAAM,UAAA;AAAA,UAClB,OAAO,KAAA,CAAM,KAAA;AAAA,UACb,YAAY,KAAA,CAAM;AAAA,SACpB,CAAE;AAAA,OACJ;AAAA,IACF,CAAC;AAAA,GACH;AAEA,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,UAAU,YAAA,CAAa;AAAA,GACzB;AACF;AAKO,SAAS,UAAA,GAA6B;AAC3C,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAa,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,iFAAA,CAAA;AAAA,MAuBb,WAAA,EAAa;AAAA,QACX,KAAA,EAAOA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,mOAAmO,CAAA;AAAA,QAC9P,MAAA,EAAQA,CAAAA,CAAE,IAAA,CAAK,CAAC,SAAA,EAAW,aAAA,EAAe,UAAA,EAAY,UAAU,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE,SAAS,sDAAsD,CAAA;AAAA,QAC7I,IAAA,EAAMA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,oDAAoD,CAAA;AAAA,QAClG,QAAA,EAAUA,CAAAA,CAAE,IAAA,CAAK,CAAC,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,UAAU,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE,SAAS,wDAAwD;AAAA,OACtI;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,OAAA,EAASA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,CAAO;AAAA,UACxB,IAAA,EAAMA,EAAE,GAAA,EAAI;AAAA,UACZ,KAAA,EAAOA,EAAE,MAAA,EAAO;AAAA,UAChB,YAAA,EAAcA,EAAE,MAAA,EAAO;AAAA,UACvB,OAAA,EAASA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,CAAO;AAAA,YACxB,KAAA,EAAOA,EAAE,MAAA,EAAO;AAAA,YAChB,IAAA,EAAMA,EAAE,MAAA,EAAO;AAAA,YACf,UAAA,EAAYA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,YAChC,KAAA,EAAOA,EAAE,MAAA,EAAO;AAAA,YAChB,UAAA,EAAYA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,KAAA,CAAM,CAACA,CAAAA,CAAE,MAAA,EAAO,EAAGA,CAAAA,CAAE,MAAA,EAAQ,CAAC,CAAC;AAAA,WACtD,CAAC;AAAA,SACH,CAAC,CAAA;AAAA,QACF,QAAA,EAAUA,EAAE,MAAA,CAAO;AAAA,UACjB,YAAA,EAAcA,EAAE,MAAA,EAAO;AAAA,UACvB,UAAA,EAAYA,EAAE,MAAA,EAAO;AAAA,UACrB,KAAA,EAAOA,EAAE,MAAA,EAAO;AAAA,UAChB,aAAA,EAAeA,EAAE,MAAA;AAAO,SACzB;AAAA;AACH,KACF;AAAA,IACA,OAAO,OAAO,MAAA,KAAW;AAEvB,MAAA,IAAI;AACF,QAAA,MAAM,YAAA,GAAe,MAAM,eAAA,CAAgB,KAAA,CAAM,KAAA,EAAO;AAAA,UACtD,QAAQ,KAAA,CAAM,MAAA;AAAA,UACd,MAAM,KAAA,CAAM,IAAA;AAAA,UACZ,UAAU,KAAA,CAAM;AAAA,SACjB,CAAA;AAED,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,YAAA,EAAc,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA;AAAA,UAChF,iBAAA,EAAmB;AAAA,SACrB;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,YAAA,GAAe,kBAAA,CAAmB,uBAAA,EAAyB,KAAK,CAAA;AACtE,QAAA,OAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,cAAc,CAAA;AAAA,UACvD,OAAA,EAAS;AAAA,SACX;AAAA,MACF;AAAA,IACF;AAAA,GACF;AACF;AC5LA,eAAsB,YAAA,GAAmC;AACvD,EAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,CAAa;AAAA,IAC/B,eAAA,EAAiB;AAAA,GAClB,CAAA;AAED,EAAA,MAAM,QAAA,GAAuC;AAAA,IAC3C,OAAA,EAAS,CAAA;AAAA,IACT,aAAA,EAAe,CAAA;AAAA,IACf,QAAA,EAAU,CAAA;AAAA,IACV,QAAA,EAAU;AAAA,GACZ;AAEA,EAAA,MAAM,UAAA,GAA2C;AAAA,IAC/C,GAAA,EAAK,CAAA;AAAA,IACL,MAAA,EAAQ,CAAA;AAAA,IACR,IAAA,EAAM,CAAA;AAAA,IACN,QAAA,EAAU;AAAA,GACZ;AAEA,EAAA,MAAM,QAAgC,EAAC;AAEvC,EAAA,KAAA,MAAW,QAAQ,KAAA,EAAO;AACxB,IAAA,QAAA,CAAS,IAAA,CAAK,YAAY,MAAM,CAAA,GAAA,CAAK,SAAS,IAAA,CAAK,WAAA,CAAY,MAAM,CAAA,IAAK,CAAA,IAAK,CAAA;AAC/E,IAAA,IAAI,IAAA,CAAK,YAAY,QAAA,EAAU;AAC7B,MAAA,UAAA,CAAW,IAAA,CAAK,YAAY,QAAQ,CAAA,GAAA,CAAK,WAAW,IAAA,CAAK,WAAA,CAAY,QAAQ,CAAA,IAAK,CAAA,IAAK,CAAA;AAAA,IACzF;AACA,IAAA,IAAI,IAAA,CAAK,YAAY,IAAA,EAAM;AACzB,MAAA,KAAA,MAAW,GAAA,IAAO,IAAA,CAAK,WAAA,CAAY,IAAA,EAAM;AACvC,QAAA,KAAA,CAAM,GAAG,CAAA,GAAA,CAAK,KAAA,CAAM,GAAG,KAAK,CAAA,IAAK,CAAA;AAAA,MACnC;AAAA,IACF;AAAA,EACF;AAGA,EAAA,MAAM,kBAAkB,KAAA,CACrB,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,EAAE,IAAA,CAAK,aAAA,CAAc,CAAA,CAAE,IAAI,CAAC,CAAA,CAC3C,KAAA,CAAM,GAAG,CAAC,CAAA,CACV,IAAI,UAAU,CAAA;AAEjB,EAAA,OAAO;AAAA,IACL,OAAO,KAAA,CAAM,MAAA;AAAA,IACb,QAAA;AAAA,IACA,UAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACF;AAKO,SAAS,SAAA,GAA4B;AAC1C,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO,gBAAA;AAAA,MACP,WAAA,EAAa,oMAAA;AAAA,MACb,aAAa,EAAC;AAAA,MACd,YAAA,EAAc;AAAA,QACZ,KAAA,EAAOA,EAAE,GAAA;AAAI;AACf,KACF;AAAA,IACA,OAAO,QAAQ,MAAA,KAAW;AACxB,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,EAAa;AACjC,QAAA,MAAM,MAAA,GAAS,EAAE,KAAA,EAAM;AACvB,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA;AAAA,UAC1E,iBAAA,EAAmB;AAAA,SACrB;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,YAAA,GAAe,kBAAA,CAAmB,qBAAA,EAAuB,KAAK,CAAA;AACpE,QAAA,OAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,cAAc,CAAA;AAAA,UACvD,OAAA,EAAS;AAAA,SACX;AAAA,MACF;AAAA,IACF;AAAA,GACF;AACF;AC7EO,SAAS,UAAA,GAA6B;AAC3C,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAa,oIAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX,QAAA,EAAUA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,qFAAqF,CAAA;AAAA,QACnH,iBAAiBA,CAAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,sDAAsD,CAAA;AAAA,QACvG,UAAUA,CAAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,qEAAqE;AAAA,OACjH;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,IAAA,EAAMA,EAAE,MAAA,EAAO;AAAA,QACf,KAAA,EAAOA,EAAE,MAAA,EAAO;AAAA,QAChB,KAAA,EAAOA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,KAAK,CAAA;AAAA,QACtB,SAAA,EAAWA,CAAAA,CAAE,GAAA,EAAI,CAAE,QAAA,EAAS;AAAA,QAC5B,WAAA,EAAaA,CAAAA,CAAE,GAAA,EAAI,CAAE,QAAA,EAAS;AAAA,QAC9B,cAAA,EAAgBA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS;AACtC,KACF;AAAA,IACA,OAAO,KAAA,KAAU;AACf,MAAA,MAAM,OAAA,GAAU,IAAI,YAAA,EAAa;AAEjC,MAAA,IAAI;AAEF,QAAA,MAAM,MAAA,GAAS,MAAM,UAAA,EAAW;AAChC,QAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AACxB,QAAA,MAAM,QAAA,GAAgBG,MAAA,CAAA,IAAA,CAAK,GAAA,EAAK,MAAA,CAAO,QAAQ,CAAA;AAC/C,QAAA,MAAM,eAAe,MAAM,eAAA,CAAgB,KAAA,CAAM,QAAA,EAAU,KAAK,QAAQ,CAAA;AAExE,QAAA,IAAI,CAAC,YAAA,EAAc;AACjB,UAAA,OAAO;AAAA,YACL,SAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,KAAK,SAAA,CAAU;AAAA,cACtD,KAAA,EAAO,CAAA,gBAAA,EAAmB,KAAA,CAAM,QAAQ,CAAA,CAAA;AAAA,cACxC,IAAA,EAAM;AAAA,aACR,EAAG,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA;AAAA,YACb,OAAA,EAAS;AAAA,WACX;AAAA,QACF;AAGA,QAAA,MAAM,QAAA,GAAgBA,gBAAS,YAAY,CAAA;AAG3C,QAAA,MAAM,MAAA,GAAS,MAAM,OAAA,CAAQ,SAAA,CAAU,YAAA,EAAc;AAAA,UACnD,UAAU,KAAA,CAAM,QAAA;AAAA,UAChB,iBAAiB,KAAA,CAAM;AAAA,SACxB,CAAA;AAGD,QAAA,MAAM,MAAA,GAAc;AAAA,UAClB,IAAA,EAAM,QAAA;AAAA,UACN,OAAO,MAAA,CAAO,KAAA;AAAA,UACd,OAAO,MAAA,CAAO;AAAA,SAChB;AAGA,QAAA,IAAI,KAAA,CAAM,QAAA,IAAY,MAAA,CAAO,SAAA,EAAW;AACtC,UAAA,MAAA,CAAO,YAAY,MAAA,CAAO,SAAA;AAG1B,UAAA,MAAM,UAAA,GAAa,OAAA,CAAQ,wBAAA,CAAyB,MAAA,CAAO,KAAK,CAAA;AAChE,UAAA,MAAA,CAAO,WAAA,GAAc;AAAA,YACnB,OAAO,UAAA,CAAW,KAAA;AAAA,YAClB,gBAAgB,UAAA,CAAW,cAAA;AAAA,YAC3B,eAAe,UAAA,CAAW,aAAA;AAAA,YAC1B,gBAAgB,UAAA,CAAW;AAAA,WAC7B;AAAA,QACF;AAGA,QAAA,IAAI,MAAA,CAAO,QAAQ,GAAA,EAAM;AACvB,UAAA,MAAA,CAAO,cAAA,GAAiB,iEAAA;AAAA,QAC1B,CAAA,MAAA,IAAW,MAAA,CAAO,KAAA,GAAQ,IAAA,EAAM;AAC9B,UAAA,MAAA,CAAO,cAAA,GAAiB,gEAAA;AAAA,QAC1B;AAEA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA;AAAA,UAC1E,iBAAA,EAAmB;AAAA,SACrB;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,YAAA,GAAe,kBAAA,CAAmB,uBAAA,EAAyB,KAAK,CAAA;AACtE,QAAA,OAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,cAAc,CAAA;AAAA,UACvD,OAAA,EAAS;AAAA,SACX;AAAA,MACF,CAAA,SAAE;AACA,QAAA,OAAA,CAAQ,OAAA,EAAQ;AAAA,MAClB;AAAA,IACF;AAAA,GACF;AACF;AC/FO,SAAS,UAAA,GAA6B;AAC3C,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAa,oKAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX,QAAA,EAAUH,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,mLAAmL,CAAA;AAAA,QACjN,WAAWA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,uHAAuH,CAAA;AAAA,QACjK,SAASA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,yIAAyI,CAAA;AAAA,QACjL,WAAWA,CAAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,yHAAyH;AAAA,OACtK;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,OAAA,EAASA,EAAE,OAAA,EAAQ;AAAA,QACnB,OAAA,EAASA,EAAE,MAAA,EAAO;AAAA,QAClB,OAAA,EAASA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA,EAAS;AAAA,QAC7B,SAASA,CAAAA,CAAE,KAAA,CAAMA,EAAE,MAAA,EAAQ,EAAE,QAAA;AAAS;AACxC,KACF;AAAA,IACA,OAAO,OAAO,MAAA,KAAW;AACvB,MAAA,MAAM,cAAc,OAAA,CAAQ,GAAA;AAC5B,MAAA,IAAI;AAEF,QAAA,IAAI,CAAC,MAAM,SAAA,IAAa,CAAC,MAAM,OAAA,IAAW,CAAC,MAAM,SAAA,EAAW;AAC1D,UAAA,MAAME,OAAAA,GAAS;AAAA,YACb,OAAA,EAAS,KAAA;AAAA,YACT,OAAA,EAAS;AAAA,WACX;AACA,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAUA,OAAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA;AAAA,YAC1E,iBAAA,EAAmBA;AAAA,WACrB;AAAA,QACF;AAGA,QAAA,MAAM,eAAyB,EAAC;AAChC,QAAA,IAAI,YAAA,GAAe,CAAA;AACnB,QAAA,OAAA,CAAQ,GAAA,GAAM,IAAI,IAAA,KAAgB;AAChC,UAAA,MAAM,GAAA,GAAM,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAEzB,UAAA,IAAI,GAAA,CAAI,QAAA,CAAS,UAAU,CAAA,EAAG;AAC5B,YAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,KAAA,CAAM,kBAAkB,CAAA;AAC1C,YAAA,IAAI,KAAA,EAAO;AACT,cAAA,YAAA,CAAa,IAAA,CAAK,KAAA,CAAM,CAAC,CAAC,CAAA;AAAA,YAC5B;AAAA,UACF;AAEA,UAAA,MAAM,UAAA,GAAa,GAAA,CAAI,KAAA,CAAM,iBAAiB,CAAA;AAC9C,UAAA,IAAI,UAAA,EAAY;AACd,YAAA,YAAA,GAAe,QAAA,CAAS,UAAA,CAAW,CAAC,CAAA,EAAG,EAAE,CAAA;AAAA,UAC3C;AAAA,QACF,CAAA;AAGA,QAAA,MAAM,OAAA,GAIF;AAAA,UACF,KAAK,KAAA,CAAM;AAAA,SACb;AAGA,QAAA,IAAI,KAAA,CAAM,cAAc,KAAA,CAAA,EAAW;AACjC,UAAA,OAAA,CAAQ,SAAA,GAAY,MAAM,SAAA,IAAa,IAAA;AAAA,QACzC,CAAA,MAAA,IAAW,MAAM,SAAA,EAAW;AAAA,QAE5B;AAGA,QAAA,IAAI,KAAA,CAAM,YAAY,KAAA,CAAA,EAAW;AAC/B,UAAA,OAAA,CAAQ,OAAA,GAAU,MAAM,OAAA,IAAW,IAAA;AAAA,QACrC;AAEA,QAAA,MAAM,UAAA,CAAW,KAAA,CAAM,QAAA,EAAU,OAAO,CAAA;AAExC,QAAA,MAAM,MAAA,GAAS;AAAA,UACb,OAAA,EAAS,IAAA;AAAA,UACT,OAAA,EAAS,YAAA,GAAe,CAAA,GACpB,CAAA,QAAA,EAAW,YAAY,CAAA,4BAAA,EAA+B,KAAA,CAAM,QAAQ,CAAA,CAAA,CAAA,GACpE,CAAA,gDAAA,EAAmD,KAAA,CAAM,QAAQ,CAAA,CAAA,CAAA;AAAA,UACrE,OAAA,EAAS,YAAA;AAAA,UACT,OAAA,EAAS,YAAA,CAAa,MAAA,GAAS,CAAA,GAAI,YAAA,GAAe,KAAA;AAAA,SACpD;AAEA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA;AAAA,UAC1E,iBAAA,EAAmB;AAAA,SACrB;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,MAAA,GAAS;AAAA,UACb,OAAA,EAAS,KAAA;AAAA,UACT,OAAA,EAAS,kBAAA,CAAmB,uBAAA,EAAyB,KAAK;AAAA,SAC5D;AACA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA;AAAA,UAC1E,iBAAA,EAAmB;AAAA,SACrB;AAAA,MACF,CAAA,SAAE;AACA,QAAA,OAAA,CAAQ,GAAA,GAAM,WAAA;AAAA,MAChB;AAAA,IACF;AAAA,GACF;AACF;ACtGA,SAAS,kBAAkB,SAAA,EAA4C;AACrE,EAAA,QAAQ,SAAA;AAAW,IACjB,KAAK,aAAA;AACH,MAAA,OAAO,gIAAA;AAAA,IACT,KAAK,UAAA;AACH,MAAA,OAAO,6GAAA;AAAA,IACT,KAAK,SAAA;AACH,MAAA,OAAO,0FAAA;AAAA,IACT;AACE,MAAA,OAAO,MAAA;AAAA;AAEb;AAKO,SAAS,UAAA,GAA6B;AAC3C,EAAA,OAAO;AAAA,IACL,QAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO,aAAA;AAAA,MACP,WAAA,EAAa,6KAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX,QAAA,EAAUF,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,gKAAgK,CAAA;AAAA,QAC9L,MAAA,EAAQA,CAAAA,CAAE,IAAA,CAAK,CAAC,SAAA,EAAW,aAAA,EAAe,UAAA,EAAY,UAAU,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE,SAAS,mFAAmF,CAAA;AAAA,QAC1K,QAAA,EAAUA,CAAAA,CAAE,IAAA,CAAK,CAAC,KAAA,EAAO,QAAA,EAAU,MAAA,EAAQ,UAAU,CAAC,CAAA,CAAE,QAAA,EAAS,CAAE,SAAS,4BAA4B,CAAA;AAAA,QACxG,IAAA,EAAMA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,mGAAmG,CAAA;AAAA,QACjJ,UAAUA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,0CAA0C;AAAA,OACrF;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,OAAA,EAASA,EAAE,OAAA,EAAQ;AAAA,QACnB,OAAA,EAASA,EAAE,MAAA,EAAO;AAAA,QAClB,QAAA,EAAUA,CAAAA,CAAE,MAAA,EAAO,CAAE,QAAA;AAAS;AAChC,KACF;AAAA,IACA,OAAO,OAAO,MAAA,KAAW;AACvB,MAAA,MAAM,cAAc,OAAA,CAAQ,GAAA;AAC5B,MAAA,IAAI;AAEF,QAAA,IAAI,cAAA,GAAiB,EAAA;AACrB,QAAA,OAAA,CAAQ,GAAA,GAAM,IAAI,IAAA,KAAgB;AAChC,UAAA,cAAA,IAAkB,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,GAAI,IAAA;AAAA,QACrC,CAAA;AAGA,QAAA,MAAM,UAAmC,EAAC;AAC1C,QAAA,IAAI,KAAA,CAAM,MAAA,KAAW,KAAA,CAAA,EAAW,OAAA,CAAQ,SAAS,KAAA,CAAM,MAAA;AACvD,QAAA,IAAI,KAAA,CAAM,QAAA,KAAa,KAAA,CAAA,EAAW,OAAA,CAAQ,WAAW,KAAA,CAAM,QAAA;AAC3D,QAAA,IAAI,KAAA,CAAM,IAAA,KAAS,KAAA,CAAA,EAAW,OAAA,CAAQ,OAAO,KAAA,CAAM,IAAA;AACnD,QAAA,IAAI,KAAA,CAAM,QAAA,KAAa,KAAA,CAAA,EAAW,OAAA,CAAQ,WAAW,KAAA,CAAM,QAAA;AAE3D,QAAA,MAAM,UAAA,CAAW,KAAA,CAAM,QAAA,EAAU,OAAO,CAAA;AAExC,QAAA,MAAM,QAAA,GAAW,iBAAA,CAAkB,KAAA,CAAM,MAAgC,CAAA;AACzE,QAAA,MAAM,MAAA,GAAS;AAAA,UACb,OAAA,EAAS,IAAA;AAAA,UACT,OAAA,EAAS,CAAA,yBAAA,CAAA;AAAA,UACT,GAAI,QAAA,GAAW,EAAE,QAAA,KAAa;AAAC,SACjC;AAEA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA;AAAA,UAC1E,iBAAA,EAAmB;AAAA,SACrB;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,MAAA,GAAS;AAAA,UACb,OAAA,EAAS,KAAA;AAAA,UACT,OAAA,EAAS,kBAAA,CAAmB,qBAAA,EAAuB,KAAK;AAAA,SAC1D;AACA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA;AAAA,UAC1E,iBAAA,EAAmB;AAAA,SACrB;AAAA,MACF,CAAA,SAAE;AACA,QAAA,OAAA,CAAQ,GAAA,GAAM,WAAA;AAAA,MAChB;AAAA,IACF;AAAA,GACF;AACF;AC/EO,SAAS,YAAA,GAA+B;AAC7C,EAAA,OAAO;AAAA,IACL,UAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO,gBAAA;AAAA,MACP,WAAA,EAAa,mPAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX,KAAA,EAAOA,CAAAA,CAAE,KAAA,CAAMA,CAAAA,CAAE,MAAA,EAAQ,CAAA,CAAE,QAAA,EAAS,CAAE,QAAA,CAAS,6EAA6E,CAAA;AAAA,QAC5H,UAAUA,CAAAA,CAAE,MAAA,GAAS,QAAA,EAAS,CAAE,SAAS,+DAA+D,CAAA;AAAA,QACxG,WAAWA,CAAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,6KAA6K;AAAA,OAC1N;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,MAAA,EAAQA,EAAE,OAAA,EAAQ;AAAA,QAClB,QAAQA,CAAAA,CAAE,KAAA,CAAMA,EAAE,GAAA,EAAK,EAAE,QAAA,EAAS;AAAA,QAClC,OAAA,EAASA,EAAE,MAAA;AAAO;AACpB,KACF;AAAA,IACA,OAAO,OAAO,MAAA,KAAW;AACvB,MAAA,MAAM,cAAc,OAAA,CAAQ,GAAA;AAC5B,MAAA,MAAM,gBAAgB,OAAA,CAAQ,KAAA;AAC9B,MAAA,IAAI;AACF,QAAA,IAAI,cAAA,GAAiB,EAAA;AACrB,QAAA,OAAA,CAAQ,GAAA,GAAM,IAAI,IAAA,KAAgB;AAChC,UAAA,cAAA,IAAkB,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,GAAI,IAAA;AAAA,QACrC,CAAA;AACA,QAAA,OAAA,CAAQ,KAAA,GAAQ,IAAI,IAAA,KAAgB;AAClC,UAAA,cAAA,IAAkB,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,GAAI,IAAA;AAAA,QACrC,CAAA;AAEA,QAAA,MAAM,MAAA,GAAS,MAAM,aAAA,CAAc;AAAA,UACjC,UAAU,KAAA,CAAM,QAAA;AAAA,UAChB,OAAO,KAAA,CAAM,KAAA;AAAA,UACb,WAAW,KAAA,CAAM;AAAA,SAClB,CAAA;AAED,QAAA,MAAM,MAAA,GAAS;AAAA,UACb,MAAA;AAAA,UACA,OAAA,EAAS,SAAS,6BAAA,GAAgC,mCAAA;AAAA,UAClD,MAAA,EAAQ,CAAC,MAAA,GAAS,cAAA,CAAe,KAAA,CAAM,IAAI,CAAA,CAAE,MAAA,CAAO,CAAC,CAAA,KAAc,CAAA,CAAE,IAAA,EAAM,CAAA,GAAI,KAAA;AAAA,SACjF;AAEA,QAAA,OAAO;AAAA,UACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA;AAAA,UAC1E,iBAAA,EAAmB;AAAA,SACrB;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,YAAA,GAAe,kBAAA,CAAmB,wBAAA,EAA0B,KAAK,CAAA;AACvE,QAAA,OAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,cAAc,CAAA;AAAA,UACvD,OAAA,EAAS;AAAA,SACX;AAAA,MACF,CAAA,SAAE;AACA,QAAA,OAAA,CAAQ,GAAA,GAAM,WAAA;AACd,QAAA,OAAA,CAAQ,KAAA,GAAQ,aAAA;AAAA,MAClB;AAAA,IACF;AAAA,GACF;AACF;ACzDA,eAAsB,aAAa,QAAA,EAAgE;AACjG,EAAA,MAAM,GAAA,GAAM,QAAQ,GAAA,EAAI;AAGxB,EAAA,MAAM,WAAA,GAAc,MAAM,eAAA,CAAgB,QAAA,EAAU,GAAG,CAAA;AAEvD,EAAA,IAAI,CAAC,WAAA,EAAa;AAChB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gBAAA,EAAmB,QAAQ,CAAA,CAAE,CAAA;AAAA,EAC/C;AAEA,EAAA,MAAM,IAAA,GAAiB;AAAA,IACrB,MAAM,WAAA,CAAY,IAAA;AAAA,IAClB,MAAM,WAAA,CAAY,IAAA;AAAA,IAClB,MAAA,EAAQ,YAAY,WAAA,CAAY,MAAA;AAAA,IAChC,OAAA,EAAS,MAAA,CAAO,WAAA,CAAY,WAAA,CAAY,OAAO,CAAA;AAAA,IAC/C,QAAA,EAAU,YAAY,WAAA,CAAY,QAAA;AAAA,IAClC,IAAA,EAAM,YAAY,WAAA,CAAY,IAAA;AAAA,IAC9B,QAAA,EAAU,YAAY,WAAA,CAAY;AAAA,GACpC;AAIA,EAAA,MAAM,aAAA,GAAgB,QAAA,CAAS,QAAA,CAAS,GAAG,CAAA,IAAK,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,CAAC,CAAA,CAAE,QAAA,CAAS,GAAG,CAAA;AAEnF,EAAA,IAAI,CAAC,aAAA,IAAiB,WAAA,CAAY,QAAA,EAAU;AAE1C,IAAA,MAAM,QAAA,GAAW,MAAM,mBAAA,CAAoB,WAAA,CAAY,QAAQ,CAAA;AAC/D,IAAA,IAAI,QAAA,CAAS,SAAS,CAAA,EAAG;AACvB,MAAA,IAAA,CAAK,QAAA,GAAW,QAAA;AAAA,IAClB;AAAA,EACF;AAEA,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,SAAS,WAAA,CAAY;AAAA,GACvB;AACF;AAKO,SAAS,QAAA,GAA2B;AACzC,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO,WAAA;AAAA,MACP,WAAA,EAAa,gLAAA;AAAA,MACb,WAAA,EAAa;AAAA,QACX,QAAA,EAAUA,CAAAA,CAAE,MAAA,EAAO,CAAE,SAAS,uOAAuO,CAAA;AAAA,QACrQ,KAAKA,CAAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,0CAA0C,CAAA;AAAA,QAC/E,MAAMA,CAAAA,CAAE,OAAA,GAAU,QAAA,EAAS,CAAE,SAAS,qCAAqC;AAAA,OAC7E;AAAA,MACA,YAAA,EAAc;AAAA,QACZ,IAAA,EAAMA,EAAE,GAAA,EAAI;AAAA,QACZ,OAAA,EAASA,EAAE,MAAA;AAAO;AACpB,KACF;AAAA,IACA,OAAO,OAAO,MAAA,KAAW;AAEvB,MAAA,IAAI;AACF,QAAA,MAAM,MAAA,GAAS,MAAM,YAAA,CAAa,KAAA,CAAM,QAAQ,CAAA;AAGhD,QAAA,IAAI,MAAM,IAAA,EAAM;AACd,UAAA,OAAO;AAAA,YACL,OAAA,EAAS,CAAC,EAAE,IAAA,EAAM,MAAA,EAAiB,IAAA,EAAM,IAAA,CAAK,SAAA,CAAU,MAAA,EAAQ,IAAA,EAAM,CAAC,CAAA,EAAG,CAAA;AAAA,YAC1E,iBAAA,EAAmB;AAAA,WACrB;AAAA,QACF;AAGA,QAAA,IAAI,MAAM,GAAA,EAAK;AACb,UAAA,MAAM,WAAA,GAAc,CAAA;AAAA,QAAA,EAAgB,MAAA,CAAO,KAAK,MAAM;AAAA,SAAA,EAAc,MAAA,CAAO,KAAK,OAAO;AAAA,EAAK,OAAO,IAAA,CAAK,QAAA,GAAW,CAAA,UAAA,EAAa,MAAA,CAAO,KAAK,QAAQ;AAAA,CAAA,GAAO,EAAE,CAAA,EAAG,MAAA,CAAO,IAAA,CAAK,IAAA,GAAO,CAAA;AAAA,EAAU,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,GAAA,CAAI,CAAA,CAAA,KAAK,CAAA,IAAA,EAAO,CAAC,CAAA,CAAE,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC;AAAA,CAAA,GAAO,EAAE,GAAG,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,UAAA,EAAa,MAAA,CAAO,KAAK,QAAQ;AAAA,CAAA,GAAO,EAAE,CAAA;;AAAA,EAAU,OAAO,OAAO,CAAA,CAAA;AAClV,UAAA,OAAO;AAAA,YACL,SAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,aAAa,CAAA;AAAA,YACtD,iBAAA,EAAmB;AAAA,WACrB;AAAA,QACF;AAGA,QAAA,MAAM,SAAA,GAAY,CAAA,EAAA,EAAK,MAAA,CAAO,IAAA,CAAK,IAAI;;AAAA,QAAA,EAAe,MAAA,CAAO,KAAK,MAAM;AAAA,SAAA,EAAc,MAAA,CAAO,KAAK,OAAO;AAAA,EAAK,OAAO,IAAA,CAAK,QAAA,GAAW,CAAA,UAAA,EAAa,MAAA,CAAO,KAAK,QAAQ;AAAA,CAAA,GAAO,EAAE,CAAA,EAAG,MAAA,CAAO,IAAA,CAAK,IAAA,GAAO,CAAA,MAAA,EAAS,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC;AAAA,CAAA,GAAO,EAAE,GAAG,MAAA,CAAO,IAAA,CAAK,WAAW,CAAA,UAAA,EAAa,MAAA,CAAO,KAAK,QAAQ;AAAA,CAAA,GAAO,EAAE;;AAAA,EAAO,OAAO,OAAO,CAAA,CAAA;AAC3U,QAAA,OAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,WAAW,CAAA;AAAA,UACpD,iBAAA,EAAmB;AAAA,SACrB;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,YAAA,GAAe,kBAAA,CAAmB,oBAAA,EAAsB,KAAK,CAAA;AACnE,QAAA,OAAO;AAAA,UACL,SAAS,CAAC,EAAE,MAAM,MAAA,EAAiB,IAAA,EAAM,cAAc,CAAA;AAAA,UACvD,OAAA,EAAS;AAAA,SACX;AAAA,MACF;AAAA,IACF;AAAA,GACF;AACF;;;AChFO,SAAS,cAAc,MAAA,EAAyB;AAKrD,EAAA,MAAM,CAAC,aAAA,EAAe,eAAA,EAAiB,gBAAgB,IAAI,aAAA,EAAc;AACzE,EAAA,MAAA,CAAO,YAAA,CAAa,aAAA,EAAe,eAAA,EAAiB,gBAAuB,CAAA;AAE3E,EAAA,MAAM,CAAC,YAAA,EAAc,cAAA,EAAgB,eAAe,IAAI,YAAA,EAAa;AACrE,EAAA,MAAA,CAAO,YAAA,CAAa,YAAA,EAAc,cAAA,EAAgB,eAAsB,CAAA;AAExE,EAAA,MAAM,CAAC,eAAA,EAAiB,iBAAA,EAAmB,kBAAkB,IAAI,eAAA,EAAgB;AACjF,EAAA,MAAA,CAAO,YAAA,CAAa,eAAA,EAAiB,iBAAA,EAAmB,kBAAyB,CAAA;AAEjF,EAAA,MAAM,CAAC,KAAA,EAAO,OAAA,EAAS,QAAQ,IAAI,WAAA,EAAY;AAC/C,EAAA,MAAA,CAAO,YAAA,CAAa,KAAA,EAAO,OAAA,EAAS,QAAe,CAAA;AAEnD,EAAA,MAAM,CAAC,KAAA,EAAO,OAAA,EAAS,QAAQ,IAAI,YAAA,EAAa;AAChD,EAAA,MAAA,CAAO,YAAA,CAAa,KAAA,EAAO,OAAA,EAAS,QAAe,CAAA;AAEnD,EAAA,MAAM,CAAC,KAAA,EAAO,OAAA,EAAS,QAAQ,IAAI,SAAA,EAAU;AAC7C,EAAA,MAAA,CAAO,YAAA,CAAa,KAAA,EAAO,OAAA,EAAS,QAAe,CAAA;AAEnD,EAAA,MAAM,CAAC,KAAA,EAAO,OAAA,EAAS,QAAQ,IAAI,SAAA,EAAU;AAC7C,EAAA,MAAA,CAAO,YAAA,CAAa,KAAA,EAAO,OAAA,EAAS,QAAe,CAAA;AAEnD,EAAA,MAAM,CAAC,KAAA,EAAO,OAAA,EAAS,QAAQ,IAAI,UAAA,EAAW;AAC9C,EAAA,MAAA,CAAO,YAAA,CAAa,KAAA,EAAO,OAAA,EAAS,QAAe,CAAA;AAEnD,EAAA,MAAM,CAAC,KAAA,EAAO,OAAA,EAAS,QAAQ,IAAI,QAAA,EAAS;AAC5C,EAAA,MAAA,CAAO,YAAA,CAAa,KAAA,EAAO,OAAA,EAAS,QAAe,CAAA;AAEnD,EAAA,MAAM,CAAC,KAAA,EAAO,OAAA,EAAS,QAAQ,IAAI,SAAA,EAAU;AAC7C,EAAA,MAAA,CAAO,YAAA,CAAa,KAAA,EAAO,OAAA,EAAS,QAAe,CAAA;AAEnD,EAAA,MAAM,CAAC,QAAA,EAAU,UAAA,EAAY,WAAW,IAAI,QAAA,EAAS;AACrD,EAAA,MAAA,CAAO,YAAA,CAAa,QAAA,EAAU,UAAA,EAAY,WAAkB,CAAA;AAE5D,EAAA,MAAM,CAAC,KAAA,EAAO,OAAA,EAAS,QAAQ,IAAI,QAAA,EAAS;AAC5C,EAAA,MAAA,CAAO,YAAA,CAAa,KAAA,EAAO,OAAA,EAAS,QAAe,CAAA;AAEnD,EAAA,MAAM,CAAC,KAAA,EAAO,OAAA,EAAS,QAAQ,IAAI,UAAA,EAAW;AAC9C,EAAA,MAAA,CAAO,YAAA,CAAa,KAAA,EAAO,OAAA,EAAS,QAAe,CAAA;AAEnD,EAAA,MAAM,CAAC,MAAA,EAAQ,QAAA,EAAU,SAAS,IAAI,SAAA,EAAU;AAChD,EAAA,MAAA,CAAO,YAAA,CAAa,MAAA,EAAQ,QAAA,EAAU,SAAgB,CAAA;AAEtD,EAAA,MAAM,CAAC,MAAA,EAAQ,QAAA,EAAU,SAAS,IAAI,UAAA,EAAW;AACjD,EAAA,MAAA,CAAO,YAAA,CAAa,MAAA,EAAQ,QAAA,EAAU,SAAgB,CAAA;AAEtD,EAAA,MAAM,CAAC,UAAA,EAAY,YAAA,EAAc,aAAa,IAAI,UAAA,EAAW;AAC7D,EAAA,MAAA,CAAO,YAAA,CAAa,UAAA,EAAY,YAAA,EAAc,aAAoB,CAAA;AAElE,EAAA,MAAM,CAAC,MAAA,EAAQ,QAAA,EAAU,SAAS,IAAI,UAAA,EAAW;AACjD,EAAA,MAAA,CAAO,YAAA,CAAa,MAAA,EAAQ,QAAA,EAAU,SAAgB,CAAA;AAEtD,EAAA,MAAM,CAAC,MAAA,EAAQ,QAAA,EAAU,SAAS,IAAI,YAAA,EAAa;AACnD,EAAA,MAAA,CAAO,YAAA,CAAa,MAAA,EAAQ,QAAA,EAAU,SAAgB,CAAA;AAEtD,EAAA,MAAM,CAAC,MAAA,EAAQ,QAAA,EAAU,SAAS,IAAI,QAAA,EAAS;AAC/C,EAAA,MAAA,CAAO,YAAA,CAAa,MAAA,EAAQ,QAAA,EAAU,SAAgB,CAAA;AACxD;AC5EO,SAAS,aAAA,GAAgB;AAC9B,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,IAAI,gBAAA,CAAiB,gBAAA,EAAkB,EAAE,IAAA,EAAM,QAAW,CAAA;AAAA,IAC1D;AAAA,MACE,KAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAa;AAAA,KACf;AAAA,IACA,OAAO,GAAA,EAAU,UAAA,EAA+C,MAAA,KAAgB;AAC9E,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,EAAa;AACjC,QAAA,MAAM,IAAA,GAAO,MAAA,CAAO,OAAA,CAAQ,KAAA,CAAM,OAAO,CAAA,CACtC,GAAA,CAAI,CAAC,CAAC,MAAA,EAAQ,KAAK,CAAA,KAAM;AACxB,UAAA,MAAM,SAAS,CAAA,GAAA,EAAM,MAAA,CAAO,aAAa,CAAA,EAAA,EAAK,MAAM,MAAM,CAAA,CAAA,CAAA;AAC1D,UAAA,MAAM,QAAQ,KAAA,CAAM,GAAA,CAAI,OAAK,CAAA,EAAA,EAAK,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,QAAA,GAAW,CAAA,CAAA,EAAI,EAAE,QAAQ,CAAA,CAAA,CAAA,GAAM,EAAE,CAAA,CAAE,CAAA,CAAE,KAAK,IAAI,CAAA;AAC5F,UAAA,OAAO,GAAG,MAAM;AAAA,EAAK,SAAS,SAAS,CAAA,CAAA;AAAA,QACzC,CAAC,CAAA,CACA,IAAA,CAAK,MAAM,CAAA;AAEd,QAAA,OAAO;AAAA,UACL,QAAA,EAAU;AAAA,YACR;AAAA,cACE,KAAK,GAAA,CAAI,IAAA;AAAA,cACT,IAAA;AAAA,cACA,QAAA,EAAU;AAAA;AACZ;AACF,SACF;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,IAAI,KAAA,CAAM,kBAAA,CAAmB,8BAAA,EAAgC,KAAK,CAAC,CAAA;AAAA,MAC3E;AAAA,IACF;AAAA,GACF;AACF;ACjCO,SAAS,YAAA,GAAe;AAC7B,EAAA,OAAO;AAAA,IACL,MAAA;AAAA,IACA,IAAII,gBAAAA,CAAiB,mBAAA,EAAqB,EAAE,IAAA,EAAM,QAAW,CAAA;AAAA,IAC7D;AAAA,MACE,KAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAa;AAAA,KACf;AAAA,IACA,OAAO,GAAA,EAAU,SAAA,EAA8C,MAAA,KAAgB;AAC7E,MAAA,IAAI;AACF,QAAA,MAAM,WAAW,SAAA,CAAU,QAAA;AAC3B,QAAA,MAAM,aAAa,KAAA,CAAM,OAAA,CAAQ,QAAQ,CAAA,GAAI,QAAA,CAAS,CAAC,CAAA,GAAI,QAAA;AAC3D,QAAA,MAAM,EAAE,IAAA,EAAM,OAAA,EAAQ,GAAI,MAAM,aAAa,UAAU,CAAA;AACvD,QAAA,OAAO;AAAA,UACL,QAAA,EAAU;AAAA,YACR;AAAA,cACE,KAAK,GAAA,CAAI,IAAA;AAAA,cACT,IAAA,EAAM,CAAA,EAAA,EAAK,IAAA,CAAK,IAAI;;AAAA,QAAA,EAAe,KAAK,MAAM;AAAA,SAAA,EAAc,KAAK,OAAO;AAAA,EAAK,IAAA,CAAK,QAAA,GAAW,CAAA,UAAA,EAAa,IAAA,CAAK,QAAQ;AAAA,CAAA,GAAO,EAAE,GAAG,IAAA,CAAK,IAAA,GAAO,SAAS,IAAA,CAAK,IAAA,CAAK,IAAA,CAAK,IAAI,CAAC;AAAA,CAAA,GAAO,EAAE;;AAAA,EAAO,OAAO,CAAA,CAAA;AAAA,cACnM,QAAA,EAAU;AAAA;AACZ;AACF,SACF;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,IAAI,KAAA,CAAM,kBAAA,CAAmB,8BAAA,EAAgC,KAAK,CAAC,CAAA;AAAA,MAC3E;AAAA,IACF;AAAA,GACF;AACF;AC3BO,SAAS,aAAA,GAAgB;AAC9B,EAAA,OAAO;AAAA,IACL,OAAA;AAAA,IACA,IAAIA,gBAAAA,CAAiB,kBAAA,EAAoB,EAAE,IAAA,EAAM,QAAW,CAAA;AAAA,IAC5D;AAAA,MACE,KAAA,EAAO,oBAAA;AAAA,MACP,WAAA,EAAa;AAAA,KACf;AAAA,IACA,OAAO,GAAA,EAAU,UAAA,EAA+C,MAAA,KAAgB;AAC9E,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,GAAQ,MAAM,YAAA,EAAa;AAEjC,QAAA,MAAM,gBAAgB,MAAA,CAAO,OAAA,CAAQ,MAAM,QAAQ,CAAA,CAChD,IAAI,CAAC,CAAC,QAAQ,KAAK,CAAA,KAAM,KAAK,MAAM,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA,CAChD,KAAK,IAAI,CAAA;AAEZ,QAAA,MAAM,eAAA,GAAkB,MAAA,CAAO,OAAA,CAAQ,KAAA,CAAM,UAAU,CAAA,CACpD,MAAA,CAAO,CAAC,CAAC,CAAA,EAAG,KAAK,CAAA,KAAM,KAAA,GAAQ,CAAC,CAAA,CAChC,GAAA,CAAI,CAAC,CAAC,QAAA,EAAU,KAAK,CAAA,KAAM,CAAA,EAAA,EAAK,QAAQ,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA,CACpD,IAAA,CAAK,IAAI,CAAA;AAEZ,QAAA,MAAM,UAAA,GAAa,MAAA,CAAO,OAAA,CAAQ,KAAA,CAAM,KAAK,CAAA,CAC1C,IAAA,CAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,CAAC,CAAA,GAAI,CAAA,CAAE,CAAC,CAAC,CAAA,CAC1B,KAAA,CAAM,CAAA,EAAG,EAAE,CAAA,CACX,GAAA,CAAI,CAAC,CAAC,GAAA,EAAK,KAAK,CAAA,KAAM,CAAA,EAAA,EAAK,GAAG,CAAA,EAAA,EAAK,KAAK,CAAA,CAAE,CAAA,CAC1C,KAAK,IAAI,CAAA;AAEZ,QAAA,MAAM,IAAA,GAAO,CAAA;;AAAA,gBAAA,EAEH,MAAM,KAAK;;AAAA;AAAA,EAG3B,aAAa;;AAAA;AAAA,EAGb,mBAAmB,QAAQ;;AAAA;AAAA,EAG3B,cAAc,QAAQ;;AAAA;AAAA,EAGtB,KAAA,CAAM,eAAA,CAAgB,GAAA,CAAI,CAAA,CAAA,KAAK,KAAK,CAAA,CAAE,IAAI,CAAA,EAAA,EAAK,CAAA,CAAE,MAAM,CAAA,CAAA,CAAG,CAAA,CAAE,IAAA,CAAK,IAAI,KAAK,QAAQ,CAAA,CAAA;AAE5E,QAAA,OAAO;AAAA,UACL,QAAA,EAAU;AAAA,YACR;AAAA,cACE,KAAK,GAAA,CAAI,IAAA;AAAA,cACT,IAAA;AAAA,cACA,QAAA,EAAU;AAAA;AACZ;AACF,SACF;AAAA,MACF,SAAS,KAAA,EAAO;AACd,QAAA,MAAM,IAAI,KAAA,CAAM,kBAAA,CAAmB,8BAAA,EAAgC,KAAK,CAAC,CAAA;AAAA,MAC3E;AAAA,IACF;AAAA,GACF;AACF;;;ACxDO,SAAS,kBAAkB,MAAA,EAAyB;AACzD,EAAA,MAAA,CAAO,gBAAA,CAAiB,GAAG,aAAA,EAAe,CAAA;AAC1C,EAAA,MAAA,CAAO,gBAAA,CAAiB,GAAG,YAAA,EAAc,CAAA;AACzC,EAAA,MAAA,CAAO,gBAAA,CAAiB,GAAG,aAAA,EAAe,CAAA;AAC5C;ACPO,SAAS,wBAAA,GAA2B;AACzC,EAAA,OAAO;AAAA,IACL,sBAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO,sBAAA;AAAA,MACP,WAAA,EAAa,mEAAA;AAAA,MACb,UAAA,EAAY;AAAA,QACV,IAAA,EAAMJ,EAAE,MAAA;AAAO;AACjB,KACF;AAAA,IACA,CAAC,EAAE,IAAA,EAAK,MAAyB;AAAA,MAC/B,QAAA,EAAU;AAAA,QACR;AAAA,UACE,IAAA,EAAM,MAAA;AAAA,UACN,OAAA,EAAS;AAAA,YACP,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM,+BAA+B,IAAI;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,8CAAA;AAAA;AAuB3C;AACF;AACF,KACF;AAAA,GACF;AACF;;;AC9CO,SAAS,6BAAA,GAAgC;AAC9C,EAAA,OAAO;AAAA,IACL,2BAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO,2BAAA;AAAA,MACP,WAAA,EAAa;AAAA,KACf;AAAA,IACA,OAAO;AAAA,MACL,QAAA,EAAU;AAAA,QACR;AAAA,UACE,IAAA,EAAM,MAAA;AAAA,UACN,OAAA,EAAS;AAAA,YACP,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM,CAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,wFAAA;AAAA;AAiBR;AACF;AACF,KACF;AAAA,GACF;AACF;;;AClCO,SAAS,mBAAA,GAAsB;AACpC,EAAA,OAAO;AAAA,IACL,YAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO,2BAAA;AAAA,MACP,WAAA,EAAa;AAAA,KACf;AAAA,IACA,OAAO;AAAA,MACL,QAAA,EAAU;AAAA,QACR;AAAA,UACE,IAAA,EAAM,MAAA;AAAA,UACN,OAAA,EAAS;AAAA,YACP,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM,CAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA,yDAAA;AAAA;AA+CR;AACF;AACF,KACF;AAAA,GACF;AACF;;;ACjEO,SAAS,0BAAA,GAA6B;AAC3C,EAAA,OAAO;AAAA,IACL,aAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO,+BAAA;AAAA,MACP,WAAA,EAAa;AAAA,KACf;AAAA,IACA,OAAO;AAAA,MACL,QAAA,EAAU;AAAA,QACR;AAAA,UACE,IAAA,EAAM,MAAA;AAAA,UACN,OAAA,EAAS;AAAA,YACP,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM,CAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;;AAAA;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA,wDAAA;AAAA;AAsDR;AACF;AACF,KACF;AAAA,GACF;AACF;ACvEO,SAAS,sBAAA,GAAyB;AACvC,EAAA,OAAO;AAAA,IACL,oBAAA;AAAA,IACA;AAAA,MACE,KAAA,EAAO,oBAAA;AAAA,MACP,WAAA,EAAa,+CAAA;AAAA,MACb,UAAA,EAAY;AAAA,QACV,QAAA,EAAUA,EAAE,MAAA,EAAO;AAAA,QACnB,MAAA,EAAQA,EAAE,IAAA,CAAK,CAAC,WAAW,aAAA,EAAe,UAAA,EAAY,UAAU,CAAC;AAAA;AACnE,KACF;AAAA,IACA,CAAC,EAAE,QAAA,EAAU,MAAA,EAAO,MAA6C;AAAA,MAC/D,QAAA,EAAU;AAAA,QACR;AAAA,UACE,IAAA,EAAM,MAAA;AAAA,UACN,OAAA,EAAS;AAAA,YACP,IAAA,EAAM,MAAA;AAAA,YACN,IAAA,EAAM,CAAA,2BAAA,EAA8B,QAAQ,CAAA,MAAA,EAAS,MAAM,CAAA;;AAAA,kDAAA,EAEnB,MAAM,CAAA,EAAA;AAAA;AAChD;AACF;AACF,KACF;AAAA,GACF;AACF;;;ACpBO,SAAS,gBAAgB,MAAA,EAAyB;AACvD,EAAA,MAAA,CAAO,cAAA,CAAe,GAAG,6BAAA,EAA+B,CAAA;AACxD,EAAA,MAAA,CAAO,cAAA,CAAe,GAAG,wBAAA,EAA0B,CAAA;AACnD,EAAA,MAAA,CAAO,cAAA,CAAe,GAAG,mBAAA,EAAqB,CAAA;AAC9C,EAAA,MAAA,CAAO,cAAA,CAAe,GAAG,0BAAA,EAA4B,CAAA;AACrD,EAAA,MAAA,CAAO,cAAA,CAAe,GAAG,sBAAA,EAAwB,CAAA;AACnD;;;ACFA,IAAM,UAAA,GAAaK,aAAAA,CAAc,MAAA,CAAA,IAAA,CAAY,GAAG,CAAA;AAChD,IAAMC,UAAAA,GAAYC,QAAQ,UAAU,CAAA;AACpC,IAAM,cAAc,IAAA,CAAK,KAAA;AAAA,EACvBC,YAAAA,CAAaX,IAAAA,CAAKS,UAAAA,EAAW,iBAAiB,GAAG,OAAO;AAC1D,CAAA;AAKA,eAAe,eAAA,GAAsC;AACnD,EAAA,MAAM,MAAA,GAAS,IAAI,SAAA,CAAU;AAAA,IAC3B,IAAA,EAAM,WAAA;AAAA,IACN,SAAS,WAAA,CAAY;AAAA,GACtB,CAAA;AAGD,EAAA,aAAA,CAAc,MAAM,CAAA;AACpB,EAAA,iBAAA,CAAkB,MAAM,CAAA;AACxB,EAAA,eAAA,CAAgB,MAAM,CAAA;AAEtB,EAAA,OAAO,MAAA;AACT;AAKA,eAAe,IAAA,GAAO;AACpB,EAAA,IAAI;AACF,IAAA,MAAM,MAAA,GAAS,MAAM,eAAA,EAAgB;AACrC,IAAA,MAAM,SAAA,GAAY,IAAIG,oBAAAA,EAAqB;AAC3C,IAAA,MAAM,MAAA,CAAO,QAAQ,SAAS,CAAA;AAG9B,IAAA,OAAA,CAAQ,MAAM,0CAA0C,CAAA;AAAA,EAC1D,SAAS,KAAA,EAAO;AACd,IAAA,OAAA,CAAQ,KAAA,CAAM,wCAAwC,KAAK,CAAA;AAC3D,IAAA,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,EAChB;AACF;AAKA,IAAI,YAAY,GAAA,KAAQ,CAAA,OAAA,EAAU,QAAQ,IAAA,CAAK,CAAC,CAAC,CAAA,CAAA,EAAI;AACnD,EAAA,IAAA,EAAK,CAAE,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA;AAC5B","file":"chunk-EBSQ7FUR.js","sourcesContent":["import * as path from 'node:path';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport { loadConfig } from '../config.js';\nimport { loadAllSpecs } from '../spec-loader.js';\nimport { createSpecDirPattern } from '../utils/path-helpers.js';\nimport { sanitizeUserInput } from '../utils/ui.js';\n\n/**\n * Check command - check for sequence conflicts\n */\nexport function checkCommand(): Command {\n return new Command('check')\n .description('Check for sequence conflicts')\n .option('-q, --quiet', 'Brief output')\n .option('--json', 'Output as JSON')\n .action(async (options: { quiet?: boolean; json?: boolean }) => {\n const hasNoConflicts = await checkSpecs(options);\n process.exit(hasNoConflicts ? 0 : 1);\n });\n}\n\n/**\n * Check for sequence conflicts in specs\n */\nexport async function checkSpecs(options: {\n quiet?: boolean;\n silent?: boolean;\n json?: boolean;\n} = {}): Promise<boolean> {\n const config = await loadConfig();\n const cwd = process.cwd();\n const specsDir = path.join(cwd, config.specsDir);\n \n // Find all specs with sequence numbers\n const specs = await loadAllSpecs();\n const sequenceMap = new Map<number, string[]>();\n const specPattern = createSpecDirPattern();\n \n for (const spec of specs) {\n // Extract sequence number from spec name\n const specName = path.basename(spec.path);\n // Use the same pattern as path-helpers to ensure consistency\n const match = specName.match(specPattern);\n \n if (match) {\n const seq = parseInt(match[1], 10);\n if (!isNaN(seq) && seq > 0) {\n if (!sequenceMap.has(seq)) {\n sequenceMap.set(seq, []);\n }\n sequenceMap.get(seq)!.push(spec.path);\n }\n }\n }\n \n // Find conflicts (sequences with multiple specs)\n const conflicts = Array.from(sequenceMap.entries())\n .filter(([_, paths]) => paths.length > 1)\n .sort(([a], [b]) => a - b);\n \n if (conflicts.length === 0) {\n if (!options.quiet && !options.silent) {\n if (options.json) {\n console.log(JSON.stringify({ conflicts: [], hasConflicts: false }, null, 2));\n } else {\n console.log(chalk.green('✓ No sequence conflicts detected'));\n }\n }\n return true;\n }\n \n // JSON output\n if (options.json) {\n const jsonOutput = {\n hasConflicts: true,\n conflicts: conflicts.map(([seq, paths]) => ({\n sequence: seq,\n specs: paths,\n })),\n };\n console.log(JSON.stringify(jsonOutput, null, 2));\n return false;\n }\n \n // Report conflicts\n if (!options.silent) {\n if (!options.quiet) {\n // Full output\n console.log('');\n console.log(chalk.yellow('⚠️ Sequence conflicts detected:\\n'));\n \n for (const [seq, paths] of conflicts) {\n console.log(chalk.red(` Sequence ${String(seq).padStart(config.structure.sequenceDigits, '0')}:`));\n for (const p of paths) {\n console.log(chalk.gray(` - ${sanitizeUserInput(p)}`));\n }\n console.log('');\n }\n \n console.log(chalk.cyan('Tip: Use date prefix to prevent conflicts:'));\n console.log(chalk.gray(' Edit .lean-spec/config.json → structure.prefix: \"{YYYYMMDD}-\"'));\n console.log('');\n console.log(chalk.cyan('Or rename folders manually to resolve.'));\n console.log('');\n } else {\n // Brief warning (for auto-check)\n console.log('');\n console.log(chalk.yellow(`⚠️ Conflict warning: ${conflicts.length} sequence conflict(s) detected`));\n console.log(chalk.gray('Run: lean-spec check'));\n console.log('');\n }\n }\n \n return false;\n}\n\n/**\n * Helper for auto-check in other commands\n */\nexport async function autoCheckIfEnabled(): Promise<void> {\n const config = await loadConfig();\n \n // Check if auto-check is disabled\n if (config.autoCheck === false) {\n return;\n }\n \n // Run check in quiet mode (brief warning only)\n try {\n await checkSpecs({ quiet: true });\n } catch {\n // Ignore errors in auto-check\n }\n}\n","/**\n * Parse custom fields from CLI --field options\n * @param fieldOptions Array of \"name=value\" strings\n * @returns Record of parsed field names and values\n */\nexport function parseCustomFieldOptions(fieldOptions?: string[]): Record<string, unknown> {\n const customFields: Record<string, unknown> = {};\n \n if (!fieldOptions) {\n return customFields;\n }\n \n for (const field of fieldOptions) {\n const [key, ...valueParts] = field.split('=');\n if (key && valueParts.length > 0) {\n const value = valueParts.join('='); // Handle values with '=' in them\n customFields[key.trim()] = value.trim();\n }\n }\n \n return customFields;\n}\n","import * as path from 'node:path';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport { loadConfig } from '../config.js';\nimport { getSpecFile, updateFrontmatter } from '../frontmatter.js';\nimport { resolveSpecPath } from '../utils/path-helpers.js';\nimport type { SpecStatus, SpecPriority } from '../frontmatter.js';\nimport { autoCheckIfEnabled } from './check.js';\nimport { sanitizeUserInput } from '../utils/ui.js';\nimport { parseCustomFieldOptions } from '../utils/cli-helpers.js';\n\n/**\n * Update command - update spec metadata\n */\nexport function updateCommand(): Command {\n return new Command('update')\n .description('Update spec metadata')\n .argument('<spec>', 'Spec to update')\n .option('--status <status>', 'Set status (planned, in-progress, complete, archived)')\n .option('--priority <priority>', 'Set priority (low, medium, high, critical)')\n .option('--tags <tags>', 'Set tags (comma-separated)')\n .option('--assignee <name>', 'Set assignee')\n .option('--field <name=value...>', 'Set custom field (can specify multiple)')\n .action(async (specPath: string, options: {\n status?: SpecStatus;\n priority?: SpecPriority;\n tags?: string;\n assignee?: string;\n field?: string[];\n }) => {\n const customFields = parseCustomFieldOptions(options.field);\n const updates: {\n status?: SpecStatus;\n priority?: SpecPriority;\n tags?: string[];\n assignee?: string;\n customFields?: Record<string, unknown>;\n } = {\n status: options.status,\n priority: options.priority,\n tags: options.tags ? options.tags.split(',').map(t => t.trim()) : undefined,\n assignee: options.assignee,\n customFields: Object.keys(customFields).length > 0 ? customFields : undefined,\n };\n \n Object.keys(updates).forEach(key => {\n if (updates[key as keyof typeof updates] === undefined) {\n delete updates[key as keyof typeof updates];\n }\n });\n \n if (Object.keys(updates).length === 0) {\n console.error('Error: At least one update option required (--status, --priority, --tags, --assignee, --field)');\n process.exit(1);\n }\n \n await updateSpec(specPath, updates);\n });\n}\n\nexport async function updateSpec(\n specPath: string,\n updates: {\n status?: SpecStatus;\n priority?: SpecPriority;\n tags?: string[];\n assignee?: string;\n customFields?: Record<string, unknown>;\n },\n options: { cwd?: string } = {}\n): Promise<void> {\n // Auto-check for conflicts before update\n await autoCheckIfEnabled();\n \n const cwd = options.cwd ?? process.cwd();\n const config = await loadConfig(cwd);\n const specsDir = path.join(cwd, config.specsDir);\n \n const resolvedPath = await resolveSpecPath(specPath, cwd, specsDir);\n\n if (!resolvedPath) {\n throw new Error(`Spec not found: ${sanitizeUserInput(specPath)}. Tried: ${sanitizeUserInput(specPath)}, specs/${sanitizeUserInput(specPath)}, and searching in date directories`);\n }\n\n // Get spec file\n const specFile = await getSpecFile(resolvedPath, config.structure.defaultFile);\n if (!specFile) {\n throw new Error(`No spec file found in: ${sanitizeUserInput(specPath)}`);\n }\n\n // Merge custom fields into updates object, filtering out undefined values\n const allUpdates: Record<string, unknown> = {};\n \n // Only add defined values\n if (updates.status !== undefined) allUpdates.status = updates.status;\n if (updates.priority !== undefined) allUpdates.priority = updates.priority;\n if (updates.tags !== undefined) allUpdates.tags = updates.tags;\n if (updates.assignee !== undefined) allUpdates.assignee = updates.assignee;\n \n if (updates.customFields) {\n Object.entries(updates.customFields).forEach(([key, value]) => {\n if (value !== undefined) {\n allUpdates[key] = value;\n }\n });\n }\n\n // Update frontmatter\n await updateFrontmatter(specFile, allUpdates);\n\n console.log(chalk.green(`✓ Updated: ${sanitizeUserInput(path.relative(cwd, resolvedPath))}`));\n \n // Show what was updated\n const updatedFields = Object.keys(updates).filter(k => k !== 'customFields');\n if (updates.customFields) {\n updatedFields.push(...Object.keys(updates.customFields));\n }\n console.log(chalk.gray(` Fields: ${updatedFields.join(', ')}`));\n}\n","/**\n * Agent command - Dispatch specs to AI coding agents\n * \n * Implements spec 123: AI Coding Agent Integration for Automated Spec Orchestration\n * \n * This command enables dispatching specs to various AI coding agents like:\n * - Claude Code (CLI-based, local)\n * - GitHub Copilot CLI (CLI-based, local)\n * - Aider (CLI-based, local)\n * - GitHub Coding Agent (cloud-based, creates PRs)\n */\n\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport { spawn, type ChildProcess } from 'node:child_process';\nimport { loadConfig, saveConfig, type LeanSpecConfig } from '../config.js';\nimport { getSpec, loadAllSpecs } from '../spec-loader.js';\nimport { updateSpec } from './update.js';\nimport { resolveSpecPath } from '../utils/path-helpers.js';\nimport { sanitizeUserInput } from '../utils/ui.js';\nimport { getStatusIndicator } from '../utils/colors.js';\n\n/**\n * Supported agent types\n */\nexport type AgentType = 'claude' | 'copilot' | 'aider' | 'gemini' | 'gh-coding' | 'continue';\n\n/**\n * Agent execution mode\n */\nexport type AgentMode = 'cli' | 'cloud';\n\n/**\n * Agent configuration in config file\n */\nexport interface AgentConfig {\n type: AgentMode;\n command?: string;\n args?: string[];\n contextTemplate?: string;\n provider?: string; // For cloud agents\n}\n\n/**\n * Extended config with agents\n */\ninterface AgentsConfig {\n default?: string;\n [key: string]: AgentConfig | string | undefined;\n}\n\n/**\n * Agent session status\n */\nexport interface AgentSession {\n specPath: string;\n agent: AgentType;\n status: 'running' | 'completed' | 'failed' | 'pending';\n startedAt: string;\n worktree?: string;\n pid?: number;\n exitCode?: number;\n error?: string;\n}\n\n// Track active sessions in memory (could be persisted to disk for real implementation)\nconst activeSessions: Map<string, AgentSession> = new Map();\n\n/**\n * Default agent configurations\n */\nconst DEFAULT_AGENTS: Record<string, AgentConfig> = {\n claude: {\n type: 'cli',\n command: 'claude',\n contextTemplate: `Implement the following LeanSpec specification:\n\n---\n{spec_content}\n---\n\nPlease follow the spec's design, plan, and test sections. Update the spec status to 'complete' when done.`,\n },\n copilot: {\n type: 'cli',\n command: 'gh',\n args: ['copilot', 'suggest'],\n contextTemplate: `Help implement this specification:\n\n{spec_content}`,\n },\n aider: {\n type: 'cli',\n command: 'aider',\n args: ['--message'],\n contextTemplate: `Implement the following spec:\n\n{spec_content}`,\n },\n gemini: {\n type: 'cli',\n command: 'gemini',\n contextTemplate: `Implement the following specification:\n\n{spec_content}`,\n },\n 'gh-coding': {\n type: 'cloud',\n provider: 'github',\n },\n continue: {\n type: 'cli',\n command: 'continue',\n contextTemplate: `{spec_content}`,\n },\n};\n\n/**\n * Get agents config from LeanSpec config with type safety\n */\nfunction getAgentsFromConfig(config: LeanSpecConfig): AgentsConfig | undefined {\n // The agents property may exist on config but is not in the base interface\n // It's added dynamically when agents are configured\n const configWithAgents = config as LeanSpecConfig & { agents?: AgentsConfig };\n return configWithAgents.agents;\n}\n\n/**\n * Get agent configuration, merging defaults with user config\n */\nexport async function getAgentConfig(\n agentName: string,\n config: LeanSpecConfig\n): Promise<AgentConfig | null> {\n // Check user-defined agents first\n const userAgents = getAgentsFromConfig(config);\n const userAgent = userAgents?.[agentName];\n if (userAgent && typeof userAgent !== 'string') {\n return { ...DEFAULT_AGENTS[agentName], ...userAgent };\n }\n \n // Fall back to defaults\n if (DEFAULT_AGENTS[agentName]) {\n return DEFAULT_AGENTS[agentName];\n }\n \n return null;\n}\n\n/**\n * Get default agent from config or use 'claude' as fallback\n */\nexport async function getDefaultAgent(config: LeanSpecConfig): Promise<string> {\n const userAgents = getAgentsFromConfig(config);\n return userAgents?.default || 'claude';\n}\n\n/**\n * Check if an agent command is available in PATH\n */\nasync function isAgentAvailable(agentConfig: AgentConfig): Promise<boolean> {\n if (agentConfig.type === 'cloud') {\n // Cloud agents don't need local command\n return true;\n }\n \n const command = agentConfig.command;\n if (!command) return false;\n \n return new Promise((resolve) => {\n const child = spawn('which', [command], { stdio: 'pipe' });\n child.on('close', (code) => resolve(code === 0));\n child.on('error', () => resolve(false));\n });\n}\n\n/**\n * Load spec content for agent context\n */\nasync function loadSpecContent(specPath: string): Promise<string> {\n const spec = await getSpec(specPath);\n if (!spec) {\n throw new Error(`Spec not found: ${specPath}`);\n }\n \n // Use fullPath from spec info which is the directory path\n const specDir = spec.fullPath;\n let content = '';\n \n // Read all markdown files in spec directory\n try {\n const files = await fs.readdir(specDir);\n const mdFiles = files.filter(f => f.endsWith('.md'));\n \n for (const file of mdFiles) {\n const filePath = path.join(specDir, file);\n const fileContent = await fs.readFile(filePath, 'utf-8');\n content += `\\n\\n### ${file}\\n\\n${fileContent}`;\n }\n } catch {\n // Single file spec - use filePath from spec info\n content = await fs.readFile(spec.filePath, 'utf-8');\n }\n \n return content;\n}\n\n/**\n * Create git worktree for parallel spec implementation\n */\nasync function createWorktree(\n specPath: string,\n specName: string,\n cwd: string\n): Promise<string> {\n const worktreePath = path.join(cwd, '.worktrees', `spec-${specName}`);\n const branchName = `feature/${specName}`;\n \n // Create .worktrees directory if needed\n await fs.mkdir(path.join(cwd, '.worktrees'), { recursive: true });\n \n return new Promise((resolve, reject) => {\n const child = spawn('git', ['worktree', 'add', worktreePath, '-b', branchName], {\n cwd,\n stdio: 'pipe',\n });\n \n let stderr = '';\n child.stderr?.on('data', (data) => {\n stderr += data.toString();\n });\n \n child.on('close', (code) => {\n if (code === 0) {\n resolve(worktreePath);\n } else {\n // Check if branch already exists\n if (stderr.includes('already exists')) {\n // Try to add worktree with existing branch\n const child2 = spawn('git', ['worktree', 'add', worktreePath, branchName], {\n cwd,\n stdio: 'pipe',\n });\n child2.on('close', (code2) => {\n if (code2 === 0) {\n resolve(worktreePath);\n } else {\n reject(new Error(`Failed to create worktree: ${stderr}`));\n }\n });\n } else {\n reject(new Error(`Failed to create worktree: ${stderr}`));\n }\n }\n });\n });\n}\n\n/**\n * Run CLI-based agent\n */\nasync function runCliAgent(\n specPath: string,\n agentConfig: AgentConfig,\n worktreePath?: string\n): Promise<ChildProcess> {\n const content = await loadSpecContent(specPath);\n const context = agentConfig.contextTemplate?.replace('{spec_content}', content) || content;\n \n const command = agentConfig.command!;\n const args = [...(agentConfig.args || [])];\n \n // For agents that take message as argument\n if (args.includes('--message') || command === 'aider') {\n args.push(context);\n }\n \n const child = spawn(command, args, {\n cwd: worktreePath || process.cwd(),\n stdio: 'inherit',\n detached: false,\n });\n \n return child;\n}\n\n/**\n * Run cloud-based agent (GitHub Coding Agent)\n */\nasync function runCloudAgent(\n specPath: string,\n _agentConfig: AgentConfig\n): Promise<void> {\n // For cloud agents, we'd typically:\n // 1. Create an issue from the spec (if not exists)\n // 2. Trigger the cloud agent via API\n // 3. Monitor for PR creation\n \n console.log(chalk.yellow('Cloud agent integration requires GitHub API configuration.'));\n console.log(chalk.gray('The spec content has been prepared for manual dispatch.'));\n \n const content = await loadSpecContent(specPath);\n console.log('');\n console.log(chalk.cyan('=== Spec Content for Cloud Agent ==='));\n console.log(content.substring(0, 500) + (content.length > 500 ? '...' : ''));\n console.log('');\n console.log(chalk.gray('To use GitHub Coding Agent:'));\n console.log(chalk.gray(' 1. Create a GitHub Issue with the spec content'));\n console.log(chalk.gray(' 2. Assign to the GitHub Coding Agent'));\n console.log(chalk.gray(' 3. The agent will create a PR automatically'));\n}\n\n/**\n * Agent command implementation\n */\nexport function agentCommand(): Command {\n const cmd = new Command('agent')\n .description('Dispatch specs to AI coding agents for automated implementation');\n\n // Run subcommand\n cmd.command('run')\n .description('Dispatch spec(s) to an AI coding agent')\n .argument('<specs...>', 'Spec(s) to dispatch (e.g., \"045\" or \"045 047 048\")')\n .option('--agent <type>', 'Agent type (claude, copilot, aider, gemini, gh-coding)', 'claude')\n .option('--parallel', 'Create worktrees for parallel implementation')\n .option('--no-status-update', 'Do not update spec status to in-progress')\n .option('--dry-run', 'Show what would be done without executing')\n .action(async (specs: string[], options: { \n agent: string; \n parallel?: boolean;\n statusUpdate?: boolean;\n dryRun?: boolean;\n }) => {\n await runAgent(specs, options);\n });\n\n // Status subcommand\n cmd.command('status')\n .description('Check status of agent sessions')\n .argument('[spec]', 'Specific spec to check (optional)')\n .option('--json', 'Output as JSON')\n .action(async (spec: string | undefined, options: { json?: boolean }) => {\n await showAgentStatus(spec, options);\n });\n\n // List subcommand\n cmd.command('list')\n .description('List available AI agents')\n .option('--json', 'Output as JSON')\n .action(async (options: { json?: boolean }) => {\n await listAgents(options);\n });\n\n // Config subcommand\n cmd.command('config')\n .description('Configure default agent')\n .argument('<agent>', 'Agent name to set as default')\n .action(async (agent: string) => {\n await setDefaultAgent(agent);\n });\n\n // Default action (show help)\n cmd.action(() => {\n cmd.help();\n });\n\n return cmd;\n}\n\n/**\n * Run agent for spec(s)\n */\nexport async function runAgent(\n specs: string[],\n options: {\n agent?: string;\n parallel?: boolean;\n statusUpdate?: boolean;\n dryRun?: boolean;\n } = {}\n): Promise<void> {\n const config = await loadConfig();\n const cwd = process.cwd();\n const specsDir = path.join(cwd, config.specsDir);\n \n // Determine agent to use\n const agentName = options.agent || await getDefaultAgent(config);\n const agentConfig = await getAgentConfig(agentName, config);\n \n if (!agentConfig) {\n console.error(chalk.red(`Unknown agent: ${agentName}`));\n console.log(chalk.gray('Available agents: claude, copilot, aider, gemini, gh-coding'));\n process.exit(1);\n }\n \n // Check agent availability (skip in dry-run mode)\n const available = await isAgentAvailable(agentConfig);\n if (!available && agentConfig.type === 'cli' && !options.dryRun) {\n console.error(chalk.red(`Agent not found: ${agentConfig.command}`));\n console.log(chalk.gray(`Make sure ${agentConfig.command} is installed and in your PATH.`));\n process.exit(1);\n }\n \n console.log('');\n console.log(chalk.green(`🤖 Dispatching to ${chalk.cyan(agentName)} agent`));\n console.log('');\n \n // Resolve spec paths\n const resolvedSpecs: string[] = [];\n for (const spec of specs) {\n const resolved = await resolveSpecPath(spec, cwd, specsDir);\n if (!resolved) {\n console.error(chalk.red(`Spec not found: ${sanitizeUserInput(spec)}`));\n process.exit(1);\n }\n resolvedSpecs.push(resolved);\n }\n \n // Show what will be done\n console.log(chalk.bold('Specs to process:'));\n for (const specPath of resolvedSpecs) {\n const spec = await getSpec(specPath);\n if (spec) {\n const status = getStatusIndicator(spec.frontmatter.status);\n console.log(` • ${sanitizeUserInput(spec.name)} ${status}`);\n } else {\n console.log(` • ${sanitizeUserInput(path.basename(specPath))}`);\n }\n }\n console.log('');\n \n if (options.dryRun) {\n console.log(chalk.yellow('Dry run mode - no actions will be taken'));\n console.log('');\n console.log(chalk.cyan('Would execute:'));\n for (const specPath of resolvedSpecs) {\n const spec = await getSpec(specPath);\n const specName = spec?.name || path.basename(specPath);\n console.log(` 1. Update ${specName} status to in-progress`);\n if (options.parallel) {\n console.log(` 2. Create worktree at .worktrees/spec-${specName}`);\n console.log(` 3. Create branch feature/${specName}`);\n }\n console.log(` ${options.parallel ? '4' : '2'}. Launch ${agentName} agent with spec context`);\n }\n return;\n }\n \n // Process each spec\n for (const specPath of resolvedSpecs) {\n const spec = await getSpec(specPath);\n const specName = spec?.name || path.basename(specPath);\n \n console.log(chalk.bold(`Processing: ${specName}`));\n \n // Update status to in-progress\n if (options.statusUpdate !== false) {\n try {\n await updateSpec(specName, { status: 'in-progress' });\n console.log(chalk.green(` ✓ Updated status to in-progress`));\n } catch (error) {\n console.log(chalk.yellow(` ⚠ Could not update status: ${(error as Error).message}`));\n }\n }\n \n // Create worktree for parallel development\n let worktreePath: string | undefined;\n if (options.parallel) {\n try {\n worktreePath = await createWorktree(specPath, specName, cwd);\n console.log(chalk.green(` ✓ Created worktree at ${worktreePath}`));\n } catch (error) {\n console.log(chalk.yellow(` ⚠ Could not create worktree: ${(error as Error).message}`));\n }\n }\n \n // Create session\n const session: AgentSession = {\n specPath,\n agent: agentName as AgentType,\n status: 'running',\n startedAt: new Date().toISOString(),\n worktree: worktreePath,\n };\n \n // Dispatch to agent\n if (agentConfig.type === 'cli') {\n console.log(chalk.cyan(` → Launching ${agentName}...`));\n \n try {\n const child = await runCliAgent(specPath, agentConfig, worktreePath);\n session.pid = child.pid;\n activeSessions.set(specName, session);\n \n child.on('close', (code) => {\n const sess = activeSessions.get(specName);\n if (sess) {\n sess.status = code === 0 ? 'completed' : 'failed';\n sess.exitCode = code ?? undefined;\n }\n });\n \n child.on('error', (error) => {\n const sess = activeSessions.get(specName);\n if (sess) {\n sess.status = 'failed';\n sess.error = error.message;\n }\n });\n \n console.log(chalk.green(` ✓ Agent launched (PID: ${child.pid})`));\n } catch (error) {\n session.status = 'failed';\n session.error = (error as Error).message;\n activeSessions.set(specName, session);\n console.error(chalk.red(` ✗ Failed to launch agent: ${(error as Error).message}`));\n }\n } else {\n // Cloud agent\n activeSessions.set(specName, session);\n await runCloudAgent(specPath, agentConfig);\n }\n \n console.log('');\n }\n \n console.log(chalk.green('✨ Agent dispatch complete'));\n console.log(chalk.gray('Use `lean-spec agent status` to check progress'));\n}\n\n/**\n * Show agent session status\n */\nexport async function showAgentStatus(\n spec: string | undefined,\n options: { json?: boolean } = {}\n): Promise<void> {\n if (spec) {\n const session = activeSessions.get(spec);\n if (!session) {\n if (options.json) {\n console.log(JSON.stringify({ error: `No active session for spec: ${spec}` }));\n } else {\n console.log(chalk.yellow(`No active session for spec: ${spec}`));\n }\n return;\n }\n \n if (options.json) {\n console.log(JSON.stringify(session, null, 2));\n } else {\n console.log('');\n console.log(chalk.cyan(`Agent Session: ${spec}`));\n console.log(` Agent: ${session.agent}`);\n console.log(` Status: ${getSessionStatusIndicator(session.status)}`);\n console.log(` Started: ${session.startedAt}`);\n if (session.worktree) {\n console.log(` Worktree: ${session.worktree}`);\n }\n if (session.pid) {\n console.log(` PID: ${session.pid}`);\n }\n if (session.error) {\n console.log(` Error: ${chalk.red(session.error)}`);\n }\n console.log('');\n }\n return;\n }\n \n // Show all sessions\n const sessions = Array.from(activeSessions.entries());\n \n if (options.json) {\n const data = Object.fromEntries(sessions);\n console.log(JSON.stringify(data, null, 2));\n return;\n }\n \n if (sessions.length === 0) {\n console.log(chalk.gray('No active agent sessions'));\n return;\n }\n \n console.log('');\n console.log(chalk.green('=== Agent Sessions ==='));\n console.log('');\n \n for (const [specName, session] of sessions) {\n console.log(`${chalk.bold(specName)}`);\n console.log(` Agent: ${session.agent} | Status: ${getSessionStatusIndicator(session.status)}`);\n if (session.worktree) {\n console.log(` Worktree: ${chalk.dim(session.worktree)}`);\n }\n }\n console.log('');\n}\n\n/**\n * Get colored status indicator for agent session\n */\nfunction getSessionStatusIndicator(status: AgentSession['status']): string {\n switch (status) {\n case 'running':\n return chalk.blue('🔄 Running');\n case 'completed':\n return chalk.green('✅ Completed');\n case 'failed':\n return chalk.red('❌ Failed');\n case 'pending':\n return chalk.yellow('⏳ Pending');\n default:\n return status;\n }\n}\n\n/**\n * List available agents\n */\nexport async function listAgents(options: { json?: boolean } = {}): Promise<void> {\n const config = await loadConfig();\n const defaultAgent = await getDefaultAgent(config);\n \n const agents: Record<string, { type: AgentMode; available: boolean; isDefault: boolean; command?: string }> = {};\n \n for (const [name, agentConfig] of Object.entries(DEFAULT_AGENTS)) {\n const available = await isAgentAvailable(agentConfig);\n agents[name] = {\n type: agentConfig.type,\n available,\n isDefault: name === defaultAgent,\n command: agentConfig.command,\n };\n }\n \n // Add user-defined agents\n const userAgents = getAgentsFromConfig(config);\n if (userAgents) {\n for (const [name, agentConfig] of Object.entries(userAgents)) {\n if (name !== 'default' && !agents[name] && agentConfig && typeof agentConfig !== 'string') {\n const available = await isAgentAvailable(agentConfig);\n agents[name] = {\n type: agentConfig.type,\n available,\n isDefault: name === defaultAgent,\n command: agentConfig.command,\n };\n }\n }\n }\n \n if (options.json) {\n console.log(JSON.stringify(agents, null, 2));\n return;\n }\n \n console.log('');\n console.log(chalk.green('=== Available AI Agents ==='));\n console.log('');\n \n console.log(chalk.bold('CLI-based (local):'));\n for (const [name, info] of Object.entries(agents)) {\n if (info.type === 'cli') {\n const defaultMarker = info.isDefault ? chalk.green(' (default)') : '';\n const availableMarker = info.available ? chalk.green('✓') : chalk.red('✗');\n console.log(` ${availableMarker} ${name}${defaultMarker} ${chalk.dim(`(${info.command})`)}`);\n }\n }\n \n console.log('');\n console.log(chalk.bold('Cloud-based:'));\n for (const [name, info] of Object.entries(agents)) {\n if (info.type === 'cloud') {\n const defaultMarker = info.isDefault ? chalk.green(' (default)') : '';\n console.log(` • ${name}${defaultMarker}`);\n }\n }\n \n console.log('');\n console.log(chalk.gray('Set default: lean-spec agent config <agent>'));\n console.log(chalk.gray('Run agent: lean-spec agent run <spec> --agent <agent>'));\n console.log('');\n}\n\n/**\n * Set default agent in config\n */\nexport async function setDefaultAgent(agent: string): Promise<void> {\n const config = await loadConfig();\n \n // Check if agent exists\n const agentConfig = await getAgentConfig(agent, config);\n if (!agentConfig) {\n console.error(chalk.red(`Unknown agent: ${agent}`));\n console.log(chalk.gray('Available agents: claude, copilot, aider, gemini, gh-coding'));\n process.exit(1);\n }\n \n // Update config with proper typing\n const configWithAgents = config as LeanSpecConfig & { agents?: AgentsConfig };\n configWithAgents.agents = configWithAgents.agents || {};\n configWithAgents.agents.default = agent;\n await saveConfig(configWithAgents);\n \n console.log(chalk.green(`✓ Default agent set to: ${agent}`));\n}\n","/**\n * Helper functions for MCP server modules\n */\n\nimport * as fs from 'node:fs/promises';\nimport { countTokens } from '@leanspec/core';\nimport { loadSubFiles } from '../spec-loader.js';\nimport type { SpecData, SubSpecReference, BoardData } from './types.js';\n\n/**\n * Format error messages for MCP responses\n */\nexport function formatErrorMessage(prefix: string, error: unknown): string {\n const errorMsg = error instanceof Error ? error.message : String(error);\n return `${prefix}: ${errorMsg}`;\n}\n\n/**\n * Stale spec information\n */\nexport interface StaleSpec {\n name: string;\n daysStale: number;\n}\n\n/**\n * Get specs that have been in-progress for too long\n * Default threshold: 7 days\n */\nexport function getStaleSpecs(board: BoardData, thresholdDays = 7): StaleSpec[] {\n const now = new Date();\n const staleSpecs: StaleSpec[] = [];\n \n for (const spec of board.columns['in-progress']) {\n // Check updated_at first, then fall back to created date\n const lastActivity = spec.updated_at || spec.created;\n if (!lastActivity) continue;\n \n try {\n const activityDate = new Date(lastActivity);\n const daysSinceActivity = Math.floor((now.getTime() - activityDate.getTime()) / (1000 * 60 * 60 * 24));\n \n if (daysSinceActivity >= thresholdDays) {\n staleSpecs.push({\n name: spec.name,\n daysStale: daysSinceActivity,\n });\n }\n } catch {\n // Invalid date format, skip\n }\n }\n \n return staleSpecs;\n}\n\n/**\n * Convert spec info to serializable SpecData format\n */\nexport function specToData(spec: any): SpecData {\n return {\n name: spec.name,\n path: spec.path,\n status: spec.frontmatter.status,\n created: spec.frontmatter.created,\n title: spec.frontmatter.title,\n tags: spec.frontmatter.tags,\n priority: spec.frontmatter.priority,\n assignee: spec.frontmatter.assignee,\n description: spec.frontmatter.description,\n customFields: spec.frontmatter.custom,\n updated_at: spec.frontmatter.updated_at,\n };\n}\n\n/**\n * Regex pattern for detecting spec references in content.\n * Matches patterns like:\n * - \"spec: 001-feature\"\n * - \"specs: 023-something\"\n * - \"depends on: 042-dependency\"\n * The pattern expects at least 3 digits followed by optional hyphens and word characters.\n */\nexport const SPEC_REFERENCE_REGEX = /(?:spec[s]?[:\\s]+|depends on[:\\s]+)([0-9]{3,}[-\\w]+)/gi;\n\n/**\n * Extract H1 heading from markdown content\n */\nfunction extractH1(content: string): string | undefined {\n const h1Match = content.match(/^#\\s+(.+)$/m);\n return h1Match?.[1]?.trim();\n}\n\n/**\n * Get summary from content (H1 heading or first 100 chars)\n */\nfunction getSummary(content: string): string {\n const h1 = extractH1(content);\n if (h1) {\n return h1;\n }\n \n // Fall back to first 100 chars (remove frontmatter if present)\n const withoutFrontmatter = content.replace(/^---[\\s\\S]*?---\\n/, '');\n const firstLine = withoutFrontmatter.trim().split('\\n')[0];\n return firstLine.length > 100 ? firstLine.substring(0, 97) + '...' : firstLine;\n}\n\n/**\n * Load sub-spec metadata for progressive disclosure\n * See spec 084: Sub-Spec File Visibility in MCP Tools and Commands\n */\nexport async function loadSubSpecMetadata(specDir: string): Promise<SubSpecReference[]> {\n try {\n // Load all sub-files (documents only, no assets for metadata)\n const subFiles = await loadSubFiles(specDir, { includeContent: true });\n \n // Filter to only document files (.md)\n const documents = subFiles.filter(f => f.type === 'document');\n \n // Build metadata for each document\n const metadata: SubSpecReference[] = [];\n \n for (const doc of documents) {\n // Count tokens using core utility\n const tokenCount = await countTokens({ content: doc.content || '' });\n \n const ref: SubSpecReference = {\n name: doc.name,\n tokens: tokenCount.total,\n size: doc.size,\n };\n \n // Add summary if content is available\n if (doc.content) {\n ref.summary = getSummary(doc.content);\n }\n \n metadata.push(ref);\n }\n \n return metadata;\n } catch (error) {\n // Spec has no sub-files or directory doesn't exist\n return [];\n }\n}\n","/**\n * Agent tools - MCP tools for AI agent orchestration\n * \n * Implements spec 123: AI Coding Agent Integration for Automated Spec Orchestration\n */\n\nimport { z } from 'zod';\nimport {\n runAgent,\n showAgentStatus,\n listAgents,\n type AgentType,\n} from '../../commands/agent.js';\nimport { formatErrorMessage } from '../helpers.js';\nimport type { ToolDefinition } from '../types.js';\n\n/**\n * Agent run tool definition\n */\nexport function agentRunTool(): ToolDefinition {\n return [\n 'agent_run',\n {\n title: 'Run Agent',\n description: 'Dispatch spec(s) to an AI coding agent for implementation. The agent will receive the spec content as context and can start working on the implementation.',\n inputSchema: {\n specs: z.array(z.string()).describe('Spec(s) to dispatch (e.g., [\"045\", \"047\"])'),\n agent: z.enum(['claude', 'copilot', 'aider', 'gemini', 'gh-coding', 'continue']).optional().describe('Agent type to use. Defaults to configured default agent.'),\n parallel: z.boolean().optional().describe('Create git worktrees for parallel implementation'),\n statusUpdate: z.boolean().optional().describe('Update spec status to in-progress (default: true)'),\n dryRun: z.boolean().optional().describe('Show what would be done without executing'),\n },\n outputSchema: {\n success: z.boolean(),\n message: z.string(),\n details: z.string().optional(),\n specs: z.array(z.object({\n name: z.string(),\n status: z.string(),\n worktree: z.string().optional(),\n })).optional(),\n },\n },\n async (input, _extra) => {\n const originalLog = console.log;\n const originalError = console.error;\n try {\n // Capture output\n let capturedOutput = '';\n console.log = (...args: any[]) => {\n capturedOutput += args.join(' ') + '\\n';\n };\n console.error = (...args: any[]) => {\n capturedOutput += args.join(' ') + '\\n';\n };\n\n await runAgent(input.specs, {\n agent: input.agent,\n parallel: input.parallel,\n statusUpdate: input.statusUpdate,\n dryRun: input.dryRun,\n });\n\n const output = {\n success: true,\n message: `Dispatched ${input.specs.length} spec(s) to ${input.agent || 'default'} agent`,\n details: capturedOutput.trim(),\n };\n\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } catch (error) {\n const output = {\n success: false,\n message: formatErrorMessage('Error running agent', error),\n };\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } finally {\n console.log = originalLog;\n console.error = originalError;\n }\n }\n ];\n}\n\n/**\n * Agent status tool definition\n */\nexport function agentStatusTool(): ToolDefinition {\n return [\n 'agent_status',\n {\n title: 'Agent Status',\n description: 'Check the status of AI agent sessions for spec implementations.',\n inputSchema: {\n spec: z.string().optional().describe('Specific spec to check status for (optional)'),\n },\n outputSchema: {\n success: z.boolean(),\n sessions: z.record(z.object({\n specPath: z.string(),\n agent: z.string(),\n status: z.string(),\n startedAt: z.string(),\n worktree: z.string().optional(),\n pid: z.number().optional(),\n })).optional(),\n message: z.string().optional(),\n },\n },\n async (input, _extra) => {\n const originalLog = console.log;\n try {\n // Capture JSON output\n let capturedOutput = '';\n console.log = (...args: any[]) => {\n capturedOutput += args.join(' ') + '\\n';\n };\n\n await showAgentStatus(input.spec, { json: true });\n\n try {\n const sessions = JSON.parse(capturedOutput.trim());\n const output = {\n success: true,\n sessions,\n };\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } catch {\n const output = {\n success: true,\n message: capturedOutput.trim() || 'No active sessions',\n };\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n }\n } catch (error) {\n const output = {\n success: false,\n message: formatErrorMessage('Error checking agent status', error),\n };\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } finally {\n console.log = originalLog;\n }\n }\n ];\n}\n\n/**\n * Agent list tool definition\n */\nexport function agentListTool(): ToolDefinition {\n return [\n 'agent_list',\n {\n title: 'List Agents',\n description: 'List available AI coding agents and their configuration status.',\n inputSchema: {},\n outputSchema: {\n success: z.boolean(),\n agents: z.record(z.object({\n type: z.string(),\n available: z.boolean(),\n isDefault: z.boolean(),\n command: z.string().optional(),\n })).optional(),\n message: z.string().optional(),\n },\n },\n async (_input, _extra) => {\n const originalLog = console.log;\n try {\n // Capture JSON output\n let capturedOutput = '';\n console.log = (...args: any[]) => {\n capturedOutput += args.join(' ') + '\\n';\n };\n\n await listAgents({ json: true });\n\n try {\n const agents = JSON.parse(capturedOutput.trim());\n const output = {\n success: true,\n agents,\n };\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } catch {\n const output = {\n success: false,\n message: 'Failed to parse agents list',\n };\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n }\n } catch (error) {\n const output = {\n success: false,\n message: formatErrorMessage('Error listing agents', error),\n };\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } finally {\n console.log = originalLog;\n }\n }\n ];\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { execSync } from 'node:child_process';\nimport type { LeanSpecConfig } from '../config.js';\n\nexport interface GitInfo {\n user: string;\n email: string;\n repo: string;\n}\n\nexport interface VariableContext {\n name?: string;\n date?: string;\n projectName?: string;\n gitInfo?: GitInfo;\n customVariables?: Record<string, string>;\n frontmatter?: Record<string, unknown>;\n}\n\n/**\n * Get git information from the repository\n */\nexport async function getGitInfo(): Promise<GitInfo | null> {\n try {\n const user = execSync('git config user.name', { encoding: 'utf-8' }).trim();\n const email = execSync('git config user.email', { encoding: 'utf-8' }).trim();\n \n // Get repository name from remote URL\n let repo = '';\n try {\n const remoteUrl = execSync('git config --get remote.origin.url', { encoding: 'utf-8' }).trim();\n // Extract repo name from various formats:\n // https://github.com/user/repo.git -> repo\n // git@github.com:user/repo.git -> repo\n const match = remoteUrl.match(/\\/([^/]+?)(?:\\.git)?$/);\n if (match) {\n repo = match[1];\n }\n } catch {\n // No remote configured\n repo = '';\n }\n \n return { user, email, repo };\n } catch {\n // Git not configured or not in a git repository\n return null;\n }\n}\n\n/**\n * Get project name from package.json\n */\nexport async function getProjectName(cwd: string = process.cwd()): Promise<string | null> {\n try {\n const packageJsonPath = path.join(cwd, 'package.json');\n const content = await fs.readFile(packageJsonPath, 'utf-8');\n const packageJson = JSON.parse(content);\n return packageJson.name || null;\n } catch {\n // No package.json or invalid JSON\n return null;\n }\n}\n\n/**\n * Format status for display (with emoji and label)\n */\nfunction formatStatus(status: string): string {\n const statusMap: Record<string, string> = {\n 'planned': '📅 Planned',\n 'in-progress': '⏳ In progress',\n 'complete': '✅ Complete',\n 'archived': '📦 Archived',\n };\n return statusMap[status] || status;\n}\n\n/**\n * Format priority for display (capitalize)\n */\nfunction formatPriority(priority: string): string {\n return priority.charAt(0).toUpperCase() + priority.slice(1);\n}\n\n/**\n * Format a frontmatter value for display in template body\n */\nfunction formatFrontmatterValue(key: string, value: unknown): string {\n if (value === null || value === undefined) {\n return '';\n }\n \n // Handle special formatting for status\n if (key === 'status' && typeof value === 'string') {\n return formatStatus(value);\n }\n \n // Handle special formatting for priority\n if (key === 'priority' && typeof value === 'string') {\n return formatPriority(value);\n }\n \n // Handle arrays (e.g., tags)\n if (Array.isArray(value)) {\n return value.join(', ');\n }\n \n // Handle objects - convert to JSON string\n if (typeof value === 'object') {\n return JSON.stringify(value);\n }\n \n // Convert everything else to string\n return String(value);\n}\n\n/**\n * Resolve variables in a string\n */\nexport function resolveVariables(\n template: string,\n context: VariableContext\n): string {\n let result = template;\n \n // Built-in variables\n if (context.name) {\n result = result.replace(/{name}/g, context.name);\n }\n \n if (context.date) {\n result = result.replace(/{date}/g, context.date);\n }\n \n if (context.projectName) {\n result = result.replace(/{project_name}/g, context.projectName);\n }\n \n // Git variables\n if (context.gitInfo) {\n result = result.replace(/{author}/g, context.gitInfo.user);\n result = result.replace(/{git_user}/g, context.gitInfo.user);\n result = result.replace(/{git_email}/g, context.gitInfo.email);\n result = result.replace(/{git_repo}/g, context.gitInfo.repo);\n }\n \n // Custom variables from config\n if (context.customVariables) {\n for (const [key, value] of Object.entries(context.customVariables)) {\n // Escape special regex characters in key to prevent RegExp injection\n const escapedKey = key.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const pattern = new RegExp(`\\\\{${escapedKey}\\\\}`, 'g');\n result = result.replace(pattern, value);\n }\n }\n \n // Frontmatter field variables\n if (context.frontmatter) {\n for (const [key, value] of Object.entries(context.frontmatter)) {\n const formattedValue = formatFrontmatterValue(key, value);\n // Escape special regex characters in key to prevent RegExp injection\n const escapedKey = key.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const pattern = new RegExp(`\\\\{${escapedKey}\\\\}`, 'g');\n result = result.replace(pattern, formattedValue);\n }\n }\n \n return result;\n}\n\n/**\n * Build a complete variable context\n */\nexport async function buildVariableContext(\n config: LeanSpecConfig,\n options: {\n name?: string;\n date?: string;\n } = {}\n): Promise<VariableContext> {\n const context: VariableContext = {\n name: options.name,\n date: options.date || new Date().toISOString().split('T')[0],\n customVariables: config.variables || {},\n };\n \n // Load project name\n context.projectName = (await getProjectName()) ?? undefined;\n \n // Load git info\n context.gitInfo = (await getGitInfo()) ?? undefined;\n \n return context;\n}\n","import * as path from 'node:path';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport { loadConfig } from '../config.js';\nimport { getSpecFile, updateFrontmatter } from '../frontmatter.js';\nimport { resolveSpecPath } from '../utils/path-helpers.js';\nimport { autoCheckIfEnabled } from './check.js';\nimport { sanitizeUserInput } from '../utils/ui.js';\nimport { loadAllSpecs } from '../spec-loader.js';\n\n/**\n * Link command - add relationships between specs\n */\nexport function linkCommand(): Command {\n return new Command('link')\n .description('Add relationships between specs (depends_on, related)')\n .argument('<spec>', 'Spec to update')\n .option('--depends-on <specs>', 'Add dependencies (comma-separated spec numbers or names)')\n .option('--related <specs>', 'Add related specs (comma-separated spec numbers or names)')\n .action(async (specPath: string, options: {\n dependsOn?: string;\n related?: string;\n }) => {\n if (!options.dependsOn && !options.related) {\n console.error('Error: At least one relationship type required (--depends-on or --related)');\n process.exit(1);\n }\n\n await linkSpec(specPath, options);\n });\n}\n\nexport async function linkSpec(\n specPath: string,\n options: {\n dependsOn?: string;\n related?: string;\n }\n): Promise<void> {\n // Auto-check for conflicts before update\n await autoCheckIfEnabled();\n\n const config = await loadConfig();\n const cwd = process.cwd();\n const specsDir = path.join(cwd, config.specsDir);\n\n // Resolve the target spec path\n const resolvedPath = await resolveSpecPath(specPath, cwd, specsDir);\n if (!resolvedPath) {\n throw new Error(`Spec not found: ${sanitizeUserInput(specPath)}`);\n }\n\n // Get spec file\n const specFile = await getSpecFile(resolvedPath, config.structure.defaultFile);\n if (!specFile) {\n throw new Error(`No spec file found in: ${sanitizeUserInput(specPath)}`);\n }\n\n // Load all specs for validation\n const allSpecs = await loadAllSpecs({ includeArchived: true });\n const specMap = new Map(allSpecs.map(s => [s.path, s]));\n\n // Parse relationship specs\n const dependsOnSpecs = options.dependsOn ? options.dependsOn.split(',').map(s => s.trim()) : [];\n const relatedSpecs = options.related ? options.related.split(',').map(s => s.trim()) : [];\n\n // Get the target spec's short name for self-reference check\n const targetSpecName = path.basename(resolvedPath);\n\n // Validate all relationship specs exist and aren't self-references\n const allRelationshipSpecs = [...dependsOnSpecs, ...relatedSpecs];\n const resolvedRelationships = new Map<string, string>();\n\n for (const relSpec of allRelationshipSpecs) {\n // Check for self-reference\n if (relSpec === targetSpecName || relSpec === specPath) {\n throw new Error(`Cannot link spec to itself: ${sanitizeUserInput(relSpec)}`);\n }\n\n const relResolvedPath = await resolveSpecPath(relSpec, cwd, specsDir);\n if (!relResolvedPath) {\n throw new Error(`Spec not found: ${sanitizeUserInput(relSpec)}`);\n }\n\n // Check for self-reference after resolution\n if (relResolvedPath === resolvedPath) {\n throw new Error(`Cannot link spec to itself: ${sanitizeUserInput(relSpec)}`);\n }\n\n const relSpecName = path.basename(relResolvedPath);\n resolvedRelationships.set(relSpec, relSpecName);\n }\n\n // Read current frontmatter to get existing relationships\n const { parseFrontmatter } = await import('../frontmatter.js');\n const currentFrontmatter = await parseFrontmatter(specFile);\n const currentDependsOn = currentFrontmatter?.depends_on || [];\n const currentRelated = currentFrontmatter?.related || [];\n\n // Build updated relationships (add new ones, keep existing)\n const updates: { depends_on?: string[]; related?: string[] } = {};\n\n if (dependsOnSpecs.length > 0) {\n const newDependsOn = [...currentDependsOn];\n let added = 0;\n for (const spec of dependsOnSpecs) {\n const resolvedName = resolvedRelationships.get(spec);\n if (resolvedName && !newDependsOn.includes(resolvedName)) {\n newDependsOn.push(resolvedName);\n added++;\n }\n }\n updates.depends_on = newDependsOn;\n if (added === 0) {\n console.log(chalk.gray(`ℹ Dependencies already exist, no changes made`));\n }\n }\n\n if (relatedSpecs.length > 0) {\n const newRelated = [...currentRelated];\n let added = 0;\n const bidirectionalUpdates: string[] = [];\n\n for (const spec of relatedSpecs) {\n const resolvedName = resolvedRelationships.get(spec);\n if (resolvedName && !newRelated.includes(resolvedName)) {\n newRelated.push(resolvedName);\n added++;\n bidirectionalUpdates.push(resolvedName);\n }\n }\n updates.related = newRelated;\n\n // Update related specs bidirectionally\n for (const relSpecName of bidirectionalUpdates) {\n const relSpecPath = await resolveSpecPath(relSpecName, cwd, specsDir);\n if (relSpecPath) {\n const relSpecFile = await getSpecFile(relSpecPath, config.structure.defaultFile);\n if (relSpecFile) {\n const relFrontmatter = await parseFrontmatter(relSpecFile);\n const relCurrentRelated = relFrontmatter?.related || [];\n if (!relCurrentRelated.includes(targetSpecName)) {\n await updateFrontmatter(relSpecFile, {\n related: [...relCurrentRelated, targetSpecName],\n });\n console.log(chalk.gray(` Updated: ${sanitizeUserInput(relSpecName)} (bidirectional)`));\n }\n }\n }\n }\n\n if (added === 0) {\n console.log(chalk.gray(`ℹ Related specs already exist, no changes made`));\n }\n }\n\n // Check for dependency cycles (warn, don't block)\n if (updates.depends_on && updates.depends_on.length > 0) {\n const cycles = detectCycles(targetSpecName, updates.depends_on, specMap);\n if (cycles.length > 0) {\n console.log(chalk.yellow(`⚠️ Dependency cycle detected: ${cycles.join(' → ')}`));\n }\n }\n\n // Update frontmatter\n await updateFrontmatter(specFile, updates);\n\n // Success message\n const updatedFields: string[] = [];\n if (dependsOnSpecs.length > 0) {\n updatedFields.push(`depends_on: ${dependsOnSpecs.join(', ')}`);\n }\n if (relatedSpecs.length > 0) {\n updatedFields.push(`related: ${relatedSpecs.join(', ')}`);\n }\n\n console.log(chalk.green(`✓ Added relationships: ${updatedFields.join(', ')}`));\n console.log(chalk.gray(` Updated: ${sanitizeUserInput(path.relative(cwd, resolvedPath))}`));\n}\n\n/**\n * Detect dependency cycles\n */\nfunction detectCycles(\n startSpec: string,\n dependsOn: string[],\n specMap: Map<string, any>,\n visited: Set<string> = new Set(),\n path: string[] = []\n): string[] {\n if (visited.has(startSpec)) {\n // Found a cycle\n const cycleStart = path.indexOf(startSpec);\n if (cycleStart !== -1) {\n return [...path.slice(cycleStart), startSpec];\n }\n return [];\n }\n\n visited.add(startSpec);\n path.push(startSpec);\n\n // Check each dependency\n for (const dep of dependsOn) {\n const depSpec = specMap.get(dep);\n if (depSpec && depSpec.frontmatter.depends_on) {\n const cycle = detectCycles(dep, depSpec.frontmatter.depends_on, specMap, new Set(visited), [...path]);\n if (cycle.length > 0) {\n return cycle;\n }\n }\n }\n\n return [];\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport chalk from 'chalk';\nimport matter from 'gray-matter';\nimport yaml from 'js-yaml';\nimport { Command } from 'commander';\nimport { loadConfig, extractGroup, resolvePrefix } from '../config.js';\nimport { getGlobalNextSeq } from '../utils/path-helpers.js';\nimport { buildVariableContext, resolveVariables, type VariableContext } from '../utils/variable-resolver.js';\nimport type { SpecPriority } from '../frontmatter.js';\nimport { normalizeDateFields } from '../frontmatter.js';\nimport { autoCheckIfEnabled } from './check.js';\nimport { sanitizeUserInput } from '../utils/ui.js';\nimport { parseCustomFieldOptions } from '../utils/cli-helpers.js';\nimport { linkSpec } from './link.js';\n\n/**\n * Create command - create new spec\n */\nexport function createCommand(): Command {\n return new Command('create')\n .description('Create new spec in folder structure')\n .argument('<name>', 'Name of the spec')\n .option('--title <title>', 'Set custom title')\n .option('--description <desc>', 'Set initial description')\n .option('--tags <tags>', 'Set tags (comma-separated)')\n .option('--priority <priority>', 'Set priority (low, medium, high, critical)')\n .option('--assignee <name>', 'Set assignee')\n .option('--template <template>', 'Use a specific template')\n .option('--field <name=value...>', 'Set custom field (can specify multiple)')\n .option('--no-prefix', 'Skip date prefix even if configured')\n .option('--depends-on <specs>', 'Add dependencies (comma-separated spec numbers or names)')\n .option('--related <specs>', 'Add related specs (comma-separated spec numbers or names)')\n .action(async (name: string, options: {\n title?: string;\n description?: string;\n tags?: string;\n priority?: SpecPriority;\n assignee?: string;\n template?: string;\n field?: string[];\n prefix?: boolean;\n dependsOn?: string;\n related?: string;\n }) => {\n const customFields = parseCustomFieldOptions(options.field);\n const createOptions: {\n title?: string;\n description?: string;\n tags?: string[];\n priority?: SpecPriority;\n assignee?: string;\n template?: string;\n customFields?: Record<string, unknown>;\n noPrefix?: boolean;\n dependsOn?: string[];\n related?: string[];\n } = {\n title: options.title,\n description: options.description,\n tags: options.tags ? options.tags.split(',').map(t => t.trim()) : undefined,\n priority: options.priority,\n assignee: options.assignee,\n template: options.template,\n customFields: Object.keys(customFields).length > 0 ? customFields : undefined,\n noPrefix: options.prefix === false,\n dependsOn: options.dependsOn ? options.dependsOn.split(',').map(s => s.trim()) : undefined,\n related: options.related ? options.related.split(',').map(s => s.trim()) : undefined,\n };\n await createSpec(name, createOptions);\n });\n}\n\nexport async function createSpec(name: string, options: { \n title?: string; \n description?: string;\n tags?: string[];\n priority?: SpecPriority;\n assignee?: string;\n template?: string;\n customFields?: Record<string, unknown>;\n noPrefix?: boolean;\n dependsOn?: string[];\n related?: string[];\n} = {}): Promise<void> {\n const config = await loadConfig();\n const cwd = process.cwd();\n const specsDir = path.join(cwd, config.specsDir);\n\n // Ensure specs directory exists\n await fs.mkdir(specsDir, { recursive: true });\n\n // Get global next sequence number\n const seq = await getGlobalNextSeq(specsDir, config.structure.sequenceDigits);\n \n // Resolve the spec path based on pattern\n let specRelativePath: string;\n \n if (config.structure.pattern === 'flat') {\n // Flat pattern: optional prefix on folder name\n const prefix = options.noPrefix \n ? ''\n : config.structure.prefix \n ? resolvePrefix(config.structure.prefix, config.structure.dateFormat)\n : '';\n specRelativePath = `${prefix}${seq}-${name}`;\n } else if (config.structure.pattern === 'custom') {\n // Custom pattern: extract group from extractor string\n if (!config.structure.groupExtractor) {\n throw new Error('Custom pattern requires structure.groupExtractor in config');\n }\n \n const group = extractGroup(\n config.structure.groupExtractor,\n config.structure.dateFormat,\n options.customFields,\n config.structure.groupFallback\n );\n \n specRelativePath = `${group}/${seq}-${name}`;\n } else {\n // Unknown pattern\n throw new Error(`Unknown pattern: ${config.structure.pattern}`);\n }\n\n const specDir = path.join(specsDir, specRelativePath);\n const specFile = path.join(specDir, config.structure.defaultFile);\n\n // Check if directory exists\n try {\n await fs.access(specDir);\n // If we get here, directory exists\n throw new Error(`Spec already exists: ${sanitizeUserInput(specDir)}`);\n } catch (error: any) {\n // If error is ENOENT, directory doesn't exist - that's good, continue\n if (error.code === 'ENOENT') {\n // Directory doesn't exist, continue\n } else {\n // Some other error or the \"already exists\" error we threw\n throw error;\n }\n }\n\n // Create spec directory\n await fs.mkdir(specDir, { recursive: true });\n\n // Resolve template path from .lean-spec/templates/\n const templatesDir = path.join(cwd, '.lean-spec', 'templates');\n let templateName: string;\n let templateDir: string | null = null; // If template is a directory, this will be set\n \n // Determine which template to use\n if (options.template) {\n // User specified a template\n if (config.templates?.[options.template]) {\n templateName = config.templates[options.template];\n } else {\n const available = Object.keys(config.templates || {}).join(', ');\n throw new Error(`Template not found: ${options.template}. Available templates: ${available}`);\n }\n } else {\n // Use default template\n templateName = config.template || 'spec-template.md';\n }\n \n let templatePath = path.join(templatesDir, templateName);\n\n // Check if template is a directory or file\n try {\n const stat = await fs.stat(templatePath);\n if (stat.isDirectory()) {\n // Template is a directory - use README.md as main file, copy all .md files\n templateDir = templatePath;\n templatePath = path.join(templateDir, 'README.md');\n // Verify main template file exists\n await fs.access(templatePath);\n }\n // If it's a file, templatePath is already correct\n } catch {\n // Template not found at configured path, try fallbacks\n // Try spec-template.md first (legacy)\n const legacyPath = path.join(templatesDir, 'spec-template.md');\n try {\n await fs.access(legacyPath);\n templatePath = legacyPath;\n templateName = 'spec-template.md';\n } catch {\n // Try README.md as fallback\n const readmePath = path.join(templatesDir, 'README.md');\n try {\n await fs.access(readmePath);\n templatePath = readmePath;\n templateName = 'README.md';\n } catch {\n throw new Error(`Template not found: ${templatePath}. Run: lean-spec init`);\n }\n }\n }\n\n // Load spec template from .lean-spec/templates/\n let content: string;\n let varContext: VariableContext;\n \n try {\n const template = await fs.readFile(templatePath, 'utf-8');\n const date = new Date().toISOString().split('T')[0];\n const title = options.title || name;\n \n // Build variable context and resolve all variables in template\n varContext = await buildVariableContext(config, { name: title, date });\n content = resolveVariables(template, varContext);\n \n // Parse frontmatter to get the resolved values (always needed for variable resolution)\n // Even with no custom options, we need to parse frontmatter to resolve variables like\n // {status}, {priority} in the body content with their default values from the template\n const parsed = matter(content, {\n engines: {\n yaml: (str) => yaml.load(str, { schema: yaml.FAILSAFE_SCHEMA }) as Record<string, unknown>\n }\n });\n \n // Ensure date fields remain as strings (gray-matter auto-parses YYYY-MM-DD as Date objects)\n normalizeDateFields(parsed.data);\n \n // Update frontmatter with provided metadata and custom fields (if any)\n if (options.tags && options.tags.length > 0) {\n parsed.data.tags = options.tags;\n }\n \n if (options.priority) {\n parsed.data.priority = options.priority;\n }\n \n if (options.assignee) {\n parsed.data.assignee = options.assignee;\n }\n \n if (options.customFields) {\n for (const [key, value] of Object.entries(options.customFields)) {\n parsed.data[key] = value;\n }\n }\n \n // Resolve frontmatter variables in the body content\n // This ensures that variables like {status}, {priority}, {tags} in the body\n // are replaced with the actual frontmatter values\n const contextWithFrontmatter = {\n ...varContext,\n frontmatter: parsed.data,\n };\n parsed.content = resolveVariables(parsed.content, contextWithFrontmatter);\n \n // Enrich with timestamps (created_at, etc.)\n const { enrichWithTimestamps } = await import('../frontmatter.js');\n enrichWithTimestamps(parsed.data);\n \n // Stringify back with updated frontmatter and resolved body content\n content = matter.stringify(parsed.content, parsed.data);\n \n // Add description to Overview section if provided\n if (options.description) {\n content = content.replace(\n /## Overview\\s+<!-- What are we solving\\? Why now\\? -->/,\n `## Overview\\n\\n${options.description}`\n );\n }\n } catch (error) {\n throw new Error(`Template not found: ${templatePath}. Run: lean-spec init`);\n }\n\n await fs.writeFile(specFile, content, 'utf-8');\n\n // Copy additional template files if template is a directory\n // This supports multi-file templates (e.g., detailed template with DESIGN.md, PLAN.md, TEST.md)\n try {\n let additionalFiles: string[] = [];\n \n if (templateDir) {\n // Template is a directory - copy all .md files except the main template (README.md)\n const templateFiles = await fs.readdir(templateDir);\n additionalFiles = templateFiles.filter(f => \n f.endsWith('.md') && f !== 'README.md'\n );\n }\n \n if (additionalFiles.length > 0) {\n for (const file of additionalFiles) {\n const srcPath = path.join(templateDir!, file);\n const destPath = path.join(specDir, file);\n \n // Read template file and process variables\n let fileContent = await fs.readFile(srcPath, 'utf-8');\n \n // Replace variables in the file\n fileContent = resolveVariables(fileContent, varContext);\n \n // Write to spec directory\n await fs.writeFile(destPath, fileContent, 'utf-8');\n }\n console.log(chalk.green(`✓ Created: ${sanitizeUserInput(specDir)}/`));\n console.log(chalk.gray(` Files: ${config.structure.defaultFile}, ${additionalFiles.join(', ')}`));\n } else {\n console.log(chalk.green(`✓ Created: ${sanitizeUserInput(specDir)}/`));\n console.log(chalk.gray(` Edit: ${sanitizeUserInput(specFile)}`));\n }\n } catch (error) {\n // If reading directory fails, just show the main file\n console.log(chalk.green(`✓ Created: ${sanitizeUserInput(specDir)}/`));\n console.log(chalk.gray(` Edit: ${sanitizeUserInput(specFile)}`));\n }\n \n // Add dependencies and related specs if specified\n const hasRelationships = (options.dependsOn && options.dependsOn.length > 0) || \n (options.related && options.related.length > 0);\n if (hasRelationships) {\n const newSpecName = path.basename(specDir);\n try {\n await linkSpec(newSpecName, {\n dependsOn: options.dependsOn?.join(','),\n related: options.related?.join(','),\n });\n } catch (error: any) {\n console.log(chalk.yellow(`⚠️ Warning: Failed to add relationships: ${error.message}`));\n }\n }\n \n // Auto-check for conflicts after creation\n await autoCheckIfEnabled();\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport { loadConfig } from '../config.js';\nimport { resolveSpecPath } from '../utils/path-helpers.js';\nimport { autoCheckIfEnabled } from './check.js';\nimport { sanitizeUserInput } from '../utils/ui.js';\nimport { getSpecFile, updateFrontmatter } from '../frontmatter.js';\n\n/**\n * Archive command - move spec to archived/\n */\nexport function archiveCommand(): Command {\n return new Command('archive')\n .description('Move spec to archived/')\n .argument('<spec>', 'Spec to archive')\n .action(async (specPath: string) => {\n await archiveSpec(specPath);\n });\n}\n\nexport async function archiveSpec(specPath: string): Promise<void> {\n // Auto-check for conflicts before archive\n await autoCheckIfEnabled();\n \n const config = await loadConfig();\n const cwd = process.cwd();\n const specsDir = path.join(cwd, config.specsDir);\n \n // Resolve the spec path using the helper\n const resolvedPath = await resolveSpecPath(specPath, cwd, specsDir);\n \n if (!resolvedPath) {\n throw new Error(`Spec not found: ${sanitizeUserInput(specPath)}`);\n }\n\n // Update frontmatter to archived status before moving\n const specFile = await getSpecFile(resolvedPath, config.structure.defaultFile);\n if (specFile) {\n await updateFrontmatter(specFile, { status: 'archived' });\n }\n\n // Archive to flat structure in specs/archived/ regardless of original pattern\n const archiveDir = path.join(specsDir, 'archived');\n await fs.mkdir(archiveDir, { recursive: true });\n\n const specName = path.basename(resolvedPath);\n const archivePath = path.join(archiveDir, specName);\n\n await fs.rename(resolvedPath, archivePath);\n\n console.log(chalk.green(`✓ Archived: ${sanitizeUserInput(archivePath)}`));\n}\n","import type { LeanSpecConfig } from '../config.js';\n\n/**\n * Detect the type of folder pattern being used\n */\nexport type PatternType = 'flat' | 'date-grouped' | 'custom-grouped';\n\nexport interface PatternInfo {\n type: PatternType;\n shouldGroup: boolean;\n groupExtractor?: string;\n isDateBased?: boolean;\n}\n\n/**\n * Analyze the configured pattern and determine how specs should be displayed\n * \n * @param config - The LeanSpec configuration\n * @returns {PatternInfo} Object containing:\n * - type: Pattern type ('flat', 'date-grouped', 'custom-grouped')\n * - shouldGroup: Whether specs should be displayed in groups\n * - groupExtractor: Optional group extraction pattern\n * - isDateBased: Optional flag indicating if grouping is date-based\n */\nexport function detectPatternType(config: LeanSpecConfig): PatternInfo {\n const { pattern, groupExtractor } = config.structure;\n\n // Case 1: Explicit flat pattern\n if (pattern === 'flat') {\n return {\n type: 'flat',\n shouldGroup: false,\n };\n }\n\n // Case 2: Custom pattern with grouping\n if (pattern === 'custom' && groupExtractor) {\n // Detect if it's date-based grouping\n // Matches any date format in braces: {YYYYMMDD}, {YYYY-MM-DD}, {YYYY-MM}, {YYYY}, etc.\n const isDateBased = /\\{YYYY[^}]*\\}/.test(groupExtractor);\n \n return {\n type: isDateBased ? 'date-grouped' : 'custom-grouped',\n shouldGroup: true,\n groupExtractor,\n isDateBased,\n };\n }\n\n // Case 3: Legacy or unknown pattern - default to flat\n return {\n type: 'flat',\n shouldGroup: false,\n };\n}\n\n/**\n * Check if a pattern uses date-based grouping\n * \n * @param config - The LeanSpec configuration\n * @returns true if the pattern groups specs by date\n */\nexport function isDateGroupedPattern(config: LeanSpecConfig): boolean {\n const info = detectPatternType(config);\n return info.type === 'date-grouped';\n}\n\n/**\n * Check if specs should be grouped when listed\n * \n * @param config - The LeanSpec configuration\n * @returns true if specs should be displayed in groups\n */\nexport function shouldGroupSpecs(config: LeanSpecConfig): boolean {\n const info = detectPatternType(config);\n return info.shouldGroup;\n}\n","import chalk from 'chalk';\nimport * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport { loadConfig } from '../config.js';\nimport { withSpinner, sanitizeUserInput } from '../utils/ui.js';\nimport { loadAllSpecs } from '../spec-loader.js';\nimport type { SpecInfo } from '../spec-loader.js';\nimport type { SpecFilterOptions, SpecStatus, SpecPriority } from '../frontmatter.js';\nimport { autoCheckIfEnabled } from './check.js';\nimport { detectPatternType } from '../utils/pattern-detection.js';\nimport { PRIORITY_CONFIG, getStatusEmoji, getPriorityEmoji } from '../utils/colors.js';\nimport { parseCustomFieldOptions } from '../utils/cli-helpers.js';\n\n/**\n * List command - list all specs\n */\nexport function listCommand(): Command {\n return new Command('list')\n .description('List all specs')\n .option('--archived', 'Include archived specs')\n .option('--status <status>', 'Filter by status (planned, in-progress, complete, archived)')\n .option('--tag <tag...>', 'Filter by tag (can specify multiple)')\n .option('--priority <priority>', 'Filter by priority (low, medium, high, critical)')\n .option('--assignee <name>', 'Filter by assignee')\n .option('--field <name=value...>', 'Filter by custom field (can specify multiple)')\n .option('--sort <field>', 'Sort by field (id, created, name, status, priority)', 'id')\n .option('--order <order>', 'Sort order (asc, desc)', 'desc')\n .option('--json', 'Output as JSON')\n .action(async (options: {\n archived?: boolean;\n status?: SpecStatus;\n tag?: string[];\n priority?: SpecPriority;\n assignee?: string;\n field?: string[];\n sort?: string;\n order?: string;\n json?: boolean;\n }) => {\n const customFields = parseCustomFieldOptions(options.field);\n const listOptions: {\n showArchived?: boolean;\n status?: SpecStatus;\n tags?: string[];\n priority?: SpecPriority;\n assignee?: string;\n customFields?: Record<string, unknown>;\n sortBy?: string;\n sortOrder?: 'asc' | 'desc';\n json?: boolean;\n } = {\n showArchived: options.archived,\n status: options.status,\n tags: options.tag,\n priority: options.priority,\n assignee: options.assignee,\n customFields: Object.keys(customFields).length > 0 ? customFields : undefined,\n sortBy: options.sort || 'id',\n sortOrder: (options.order as 'asc' | 'desc') || 'desc',\n json: options.json,\n };\n await listSpecs(listOptions);\n });\n}\n\nexport async function listSpecs(options: {\n showArchived?: boolean;\n status?: SpecStatus | SpecStatus[];\n tags?: string[];\n priority?: SpecPriority | SpecPriority[];\n assignee?: string;\n customFields?: Record<string, unknown>;\n sortBy?: string;\n sortOrder?: 'asc' | 'desc';\n json?: boolean;\n} = {}): Promise<void> {\n // Auto-check for conflicts before listing\n await autoCheckIfEnabled();\n \n const config = await loadConfig();\n const cwd = process.cwd();\n const specsDir = path.join(cwd, config.specsDir);\n \n try {\n await fs.access(specsDir);\n } catch {\n console.log('');\n console.log('No specs directory found. Initialize with: lean-spec init');\n console.log('');\n return;\n }\n\n // Build filter options\n const filter: SpecFilterOptions = {};\n if (options.status) filter.status = options.status;\n if (options.tags) filter.tags = options.tags;\n if (options.priority) filter.priority = options.priority;\n if (options.assignee) filter.assignee = options.assignee;\n if (options.customFields) filter.customFields = options.customFields;\n\n const specs = await withSpinner(\n 'Loading specs...',\n () => loadAllSpecs({\n includeArchived: options.showArchived || false,\n includeSubFiles: true, // Load sub-file info for display\n filter,\n sortBy: options.sortBy || 'id',\n sortOrder: options.sortOrder || 'desc',\n })\n );\n\n if (specs.length === 0) {\n if (options.json) {\n console.log(JSON.stringify({ specs: [], total: 0 }, null, 2));\n } else {\n console.log(chalk.dim('No specs found.'));\n }\n return;\n }\n\n // JSON output\n if (options.json) {\n const jsonOutput = {\n specs: specs.map(spec => ({\n path: spec.path,\n name: spec.name,\n status: spec.frontmatter.status,\n priority: spec.frontmatter.priority,\n tags: spec.frontmatter.tags,\n assignee: spec.frontmatter.assignee,\n created: spec.frontmatter.created,\n completed: spec.frontmatter.completed,\n subFiles: spec.subFiles?.length || 0,\n })),\n total: specs.length,\n filter: options,\n };\n console.log(JSON.stringify(jsonOutput, null, 2));\n return;\n }\n\n // Display header\n console.log(chalk.bold.cyan('📄 Spec List'));\n \n // Filter info\n const filterParts: string[] = [];\n if (options.status) {\n const statusStr = Array.isArray(options.status) ? options.status.join(',') : options.status;\n filterParts.push(`status=${statusStr}`);\n }\n if (options.tags) filterParts.push(`tags=${options.tags.join(',')}`);\n if (options.priority) {\n const priorityStr = Array.isArray(options.priority) ? options.priority.join(',') : options.priority;\n filterParts.push(`priority=${priorityStr}`);\n }\n if (options.assignee) filterParts.push(`assignee=${options.assignee}`);\n \n if (filterParts.length > 0) {\n console.log(chalk.dim(`Filtered by: ${filterParts.join(', ')}`));\n }\n console.log('');\n\n // Detect pattern type and decide whether to group specs\n const patternInfo = detectPatternType(config);\n\n if (patternInfo.shouldGroup && patternInfo.groupExtractor) {\n renderGroupedList(specs, patternInfo.groupExtractor);\n } else {\n renderFlatList(specs);\n }\n\n console.log('');\n console.log(chalk.bold(`Total: ${chalk.green(specs.length)} spec${specs.length !== 1 ? 's' : ''}`));\n}\n\nfunction renderFlatList(specs: SpecInfo[]): void {\n // Simple flat list - no grouping\n for (const spec of specs) {\n const statusEmoji = getStatusEmoji(spec.frontmatter.status);\n const priorityEmoji = getPriorityEmoji(spec.frontmatter.priority);\n \n let assigneeStr = '';\n if (spec.frontmatter.assignee) {\n assigneeStr = ' ' + chalk.cyan(`@${sanitizeUserInput(spec.frontmatter.assignee)}`);\n }\n \n let tagsStr = '';\n if (spec.frontmatter.tags?.length) {\n const tags = Array.isArray(spec.frontmatter.tags) ? spec.frontmatter.tags : [];\n if (tags.length > 0) {\n const tagStr = tags.map(tag => `#${sanitizeUserInput(tag)}`).join(' ');\n tagsStr = ' ' + chalk.dim(chalk.magenta(tagStr));\n }\n }\n\n // Add sub-spec indicator if present\n let subSpecStr = '';\n if (spec.subFiles) {\n const docCount = spec.subFiles.filter(f => f.type === 'document').length;\n if (docCount > 0) {\n subSpecStr = ' ' + chalk.dim(chalk.yellow(`(+${docCount} sub-spec${docCount > 1 ? 's' : ''})`));\n }\n }\n\n const priorityPrefix = priorityEmoji ? `${priorityEmoji} ` : '';\n console.log(`${priorityPrefix}${statusEmoji} ${chalk.cyan(sanitizeUserInput(spec.path))}${assigneeStr}${tagsStr}${subSpecStr}`);\n }\n}\n\nfunction renderGroupedList(specs: SpecInfo[], groupExtractor: string): void {\n // Extract group pattern (e.g., \"{YYYYMMDD}\" or \"milestone-{milestone}\")\n const isDatePattern = groupExtractor.match(/\\{YYYY/);\n\n // Group specs by their folder/group\n const groups = new Map<string, SpecInfo[]>();\n \n for (const spec of specs) {\n // Extract group from path (first part before spec name)\n const pathParts = spec.path.split('/');\n let group = 'unknown';\n \n if (pathParts.length > 1) {\n // Has a parent folder (e.g., \"20251103/001-spec\" or \"milestone-1/001-spec\")\n group = pathParts[0];\n } else if (isDatePattern && spec.date) {\n // No folder but we have date metadata\n group = spec.date;\n }\n \n if (!groups.has(group)) {\n groups.set(group, []);\n }\n groups.get(group)!.push(spec);\n }\n\n // Sort groups (dates descending, others ascending)\n const sortedGroups = Array.from(groups.keys()).sort((a, b) => {\n // If looks like dates (8 digits), sort descending (newest first)\n if (/^\\d{8}$/.test(a) && /^\\d{8}$/.test(b)) {\n return b.localeCompare(a);\n }\n // Otherwise alphabetically ascending\n return a.localeCompare(b);\n });\n\n // Render each group\n for (let i = 0; i < sortedGroups.length; i++) {\n const groupName = sortedGroups[i];\n const groupSpecs = groups.get(groupName)!;\n\n // Group header\n const groupEmoji = /^\\d{8}$/.test(groupName) ? '📅' : \n groupName.startsWith('milestone') ? '🎯' :\n '📁';\n console.log(`${chalk.bold.cyan(`${groupEmoji} ${groupName}/`)} ${chalk.dim(`(${groupSpecs.length})`)}`);\n console.log('');\n\n // Render specs in this group - simple flat list\n for (const spec of groupSpecs) {\n const statusEmoji = getStatusEmoji(spec.frontmatter.status);\n const priorityEmoji = getPriorityEmoji(spec.frontmatter.priority);\n \n // Remove group prefix from display path\n const displayPath = spec.path.includes('/') \n ? spec.path.split('/').slice(1).join('/')\n : spec.path;\n \n let assigneeStr = '';\n if (spec.frontmatter.assignee) {\n assigneeStr = ' ' + chalk.cyan(`@${sanitizeUserInput(spec.frontmatter.assignee)}`);\n }\n \n let tagsStr = '';\n if (spec.frontmatter.tags?.length) {\n const tags = Array.isArray(spec.frontmatter.tags) ? spec.frontmatter.tags : [];\n if (tags.length > 0) {\n const tagStr = tags.map(tag => `#${sanitizeUserInput(tag)}`).join(' ');\n tagsStr = ' ' + chalk.dim(chalk.magenta(tagStr));\n }\n }\n\n // Add sub-spec indicator if present\n let subSpecStr = '';\n if (spec.subFiles) {\n const docCount = spec.subFiles.filter(f => f.type === 'document').length;\n if (docCount > 0) {\n subSpecStr = ' ' + chalk.dim(chalk.yellow(`(+${docCount} sub-spec${docCount > 1 ? 's' : ''})`));\n }\n }\n\n const priorityPrefix = priorityEmoji ? `${priorityEmoji} ` : '';\n console.log(` ${priorityPrefix}${statusEmoji} ${chalk.cyan(sanitizeUserInput(displayPath))}${assigneeStr}${tagsStr}${subSpecStr}`);\n }\n\n // Spacing between groups\n if (i < sortedGroups.length - 1) {\n console.log('');\n }\n }\n}\n","import * as path from 'node:path';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport { loadConfig } from '../config.js';\nimport { getSpecFile, updateFrontmatter } from '../frontmatter.js';\nimport { resolveSpecPath } from '../utils/path-helpers.js';\nimport { autoCheckIfEnabled } from './check.js';\nimport { sanitizeUserInput } from '../utils/ui.js';\n\n/**\n * Unlink command - remove relationships between specs\n */\nexport function unlinkCommand(): Command {\n return new Command('unlink')\n .description('Remove relationships between specs (depends_on, related)')\n .argument('<spec>', 'Spec to update')\n .option('--depends-on [specs]', 'Remove dependencies (comma-separated spec numbers or names, or use with --all)')\n .option('--related [specs]', 'Remove related specs (comma-separated spec numbers or names, or use with --all)')\n .option('--all', 'Remove all relationships of the specified type(s)')\n .action(async (specPath: string, options: {\n dependsOn?: string | boolean;\n related?: string | boolean;\n all?: boolean;\n }) => {\n if (!options.dependsOn && !options.related) {\n console.error('Error: At least one relationship type required (--depends-on or --related)');\n process.exit(1);\n }\n\n await unlinkSpec(specPath, options);\n });\n}\n\nexport async function unlinkSpec(\n specPath: string,\n options: {\n dependsOn?: string | boolean;\n related?: string | boolean;\n all?: boolean;\n }\n): Promise<void> {\n // Auto-check for conflicts before update\n await autoCheckIfEnabled();\n\n const config = await loadConfig();\n const cwd = process.cwd();\n const specsDir = path.join(cwd, config.specsDir);\n\n // Resolve the target spec path\n const resolvedPath = await resolveSpecPath(specPath, cwd, specsDir);\n if (!resolvedPath) {\n throw new Error(`Spec not found: ${sanitizeUserInput(specPath)}`);\n }\n\n // Get spec file\n const specFile = await getSpecFile(resolvedPath, config.structure.defaultFile);\n if (!specFile) {\n throw new Error(`No spec file found in: ${sanitizeUserInput(specPath)}`);\n }\n\n // Get the target spec's short name\n const targetSpecName = path.basename(resolvedPath);\n\n // Read current frontmatter\n const { parseFrontmatter } = await import('../frontmatter.js');\n const currentFrontmatter = await parseFrontmatter(specFile);\n const currentDependsOn = currentFrontmatter?.depends_on || [];\n const currentRelated = currentFrontmatter?.related || [];\n\n // Build updated relationships\n const updates: { depends_on?: string[]; related?: string[] } = {};\n let removedCount = 0;\n\n if (options.dependsOn !== undefined) {\n if (options.all || options.dependsOn === true) {\n // Remove all dependencies (when --all or --depends-on used without value)\n updates.depends_on = [];\n removedCount += currentDependsOn.length;\n } else {\n // Remove specific dependencies\n const toRemove = (options.dependsOn as string).split(',').map(s => s.trim());\n const resolvedToRemove = new Set<string>();\n\n // Resolve each spec to remove\n for (const spec of toRemove) {\n const resolvedSpecPath = await resolveSpecPath(spec, cwd, specsDir);\n if (resolvedSpecPath) {\n resolvedToRemove.add(path.basename(resolvedSpecPath));\n } else {\n // Also try to match by spec name directly\n resolvedToRemove.add(spec);\n }\n }\n\n const newDependsOn = currentDependsOn.filter(dep => !resolvedToRemove.has(dep));\n removedCount += currentDependsOn.length - newDependsOn.length;\n updates.depends_on = newDependsOn;\n }\n }\n\n if (options.related !== undefined) {\n if (options.all || options.related === true) {\n // Remove all related specs and update them bidirectionally (when --all or --related used without value)\n for (const relSpec of currentRelated) {\n const relSpecPath = await resolveSpecPath(relSpec, cwd, specsDir);\n if (relSpecPath) {\n const relSpecFile = await getSpecFile(relSpecPath, config.structure.defaultFile);\n if (relSpecFile) {\n const relFrontmatter = await parseFrontmatter(relSpecFile);\n const relCurrentRelated = relFrontmatter?.related || [];\n const relNewRelated = relCurrentRelated.filter(r => r !== targetSpecName);\n if (relNewRelated.length !== relCurrentRelated.length) {\n await updateFrontmatter(relSpecFile, {\n related: relNewRelated,\n });\n console.log(chalk.gray(` Updated: ${sanitizeUserInput(relSpec)} (bidirectional)`));\n }\n }\n }\n }\n removedCount += currentRelated.length;\n updates.related = [];\n } else {\n // Remove specific related specs\n const toRemove = (options.related as string).split(',').map(s => s.trim());\n const resolvedToRemove = new Set<string>();\n\n // Resolve each spec to remove and update bidirectionally\n for (const spec of toRemove) {\n const resolvedSpecPath = await resolveSpecPath(spec, cwd, specsDir);\n if (resolvedSpecPath) {\n const specName = path.basename(resolvedSpecPath);\n resolvedToRemove.add(specName);\n\n // Update the related spec to remove reverse relationship\n const relSpecFile = await getSpecFile(resolvedSpecPath, config.structure.defaultFile);\n if (relSpecFile) {\n const relFrontmatter = await parseFrontmatter(relSpecFile);\n const relCurrentRelated = relFrontmatter?.related || [];\n const relNewRelated = relCurrentRelated.filter(r => r !== targetSpecName);\n if (relNewRelated.length !== relCurrentRelated.length) {\n await updateFrontmatter(relSpecFile, {\n related: relNewRelated,\n });\n console.log(chalk.gray(` Updated: ${sanitizeUserInput(specName)} (bidirectional)`));\n }\n }\n } else {\n // Try to match by spec name directly\n resolvedToRemove.add(spec);\n }\n }\n\n const newRelated = currentRelated.filter(rel => !resolvedToRemove.has(rel));\n removedCount += currentRelated.length - newRelated.length;\n updates.related = newRelated;\n }\n }\n\n // Update frontmatter\n await updateFrontmatter(specFile, updates);\n\n // Success message\n if (removedCount === 0) {\n console.log(chalk.gray(`ℹ No matching relationships found to remove`));\n } else {\n const updatedFields: string[] = [];\n if (options.dependsOn !== undefined) {\n updatedFields.push(`depends_on`);\n }\n if (options.related !== undefined) {\n updatedFields.push(`related`);\n }\n console.log(chalk.green(`✓ Removed relationships: ${updatedFields.join(', ')} (${removedCount} total)`));\n console.log(chalk.gray(` Updated: ${sanitizeUserInput(path.relative(cwd, resolvedPath))}`));\n }\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport { loadConfig, saveConfig } from '../config.js';\n\n/**\n * Templates command - manage spec templates\n */\nexport function templatesCommand(): Command {\n const cmd = new Command('templates')\n .description('Manage spec templates');\n\n cmd.command('list')\n .description('List available templates')\n .action(async () => {\n await listTemplates();\n });\n\n cmd.command('show')\n .description('Show template content')\n .argument('<name>', 'Template name')\n .action(async (name: string) => {\n await showTemplate(name);\n });\n\n cmd.command('add')\n .description('Register a template')\n .argument('<name>', 'Template name')\n .argument('<file>', 'Template file path')\n .action(async (name: string, file: string) => {\n await addTemplate(name, file);\n });\n\n cmd.command('remove')\n .description('Unregister a template')\n .argument('<name>', 'Template name')\n .action(async (name: string) => {\n await removeTemplate(name);\n });\n\n cmd.command('copy')\n .description('Copy a template to create a new one')\n .argument('<source>', 'Source template name')\n .argument('<target>', 'Target template name')\n .action(async (source: string, target: string) => {\n await copyTemplate(source, target);\n });\n\n // Default action (list)\n cmd.action(async () => {\n await listTemplates();\n });\n\n return cmd;\n}\n\nexport async function listTemplates(cwd: string = process.cwd()): Promise<void> {\n const config = await loadConfig(cwd);\n const templatesDir = path.join(cwd, '.lean-spec', 'templates');\n\n console.log('');\n console.log(chalk.green('=== Project Templates ==='));\n console.log('');\n\n try {\n await fs.access(templatesDir);\n } catch {\n console.log(chalk.yellow('No templates directory found.'));\n console.log(chalk.gray('Run: lean-spec init'));\n console.log('');\n return;\n }\n\n const entries = await fs.readdir(templatesDir, { withFileTypes: true });\n const templateFiles = entries.filter((e) => e.isFile() && e.name.endsWith('.md'));\n const templateDirs = entries.filter((e) => e.isDirectory());\n\n if (templateFiles.length === 0 && templateDirs.length === 0) {\n console.log(chalk.yellow('No templates found.'));\n console.log('');\n return;\n }\n\n // Show registered templates first\n if (config.templates && Object.keys(config.templates).length > 0) {\n console.log(chalk.cyan('Registered:'));\n for (const [name, file] of Object.entries(config.templates)) {\n const isDefault = config.template === file;\n const marker = isDefault ? chalk.green('✓ (default)') : '';\n \n // Check if it's a directory-based template\n const templatePath = path.join(templatesDir, file);\n try {\n const stat = await fs.stat(templatePath);\n if (stat.isDirectory()) {\n // List files in the directory\n const dirFiles = await fs.readdir(templatePath);\n const mdFiles = dirFiles.filter(f => f.endsWith('.md'));\n console.log(` ${chalk.bold(name)}: ${file}/ ${marker}`);\n console.log(chalk.gray(` Files: ${mdFiles.join(', ')}`));\n } else {\n console.log(` ${chalk.bold(name)}: ${file} ${marker}`);\n }\n } catch {\n console.log(` ${chalk.bold(name)}: ${file} ${marker} ${chalk.red('(missing)')}`);\n }\n }\n console.log('');\n }\n\n // Show all available template files\n if (templateFiles.length > 0) {\n console.log(chalk.cyan('Available files:'));\n for (const entry of templateFiles) {\n const filePath = path.join(templatesDir, entry.name);\n const stat = await fs.stat(filePath);\n const sizeKB = (stat.size / 1024).toFixed(1);\n console.log(` ${entry.name} (${sizeKB} KB)`);\n }\n console.log('');\n }\n\n // Show available template directories (multi-file templates)\n if (templateDirs.length > 0) {\n console.log(chalk.cyan('Available directories (multi-file templates):'));\n for (const entry of templateDirs) {\n const dirPath = path.join(templatesDir, entry.name);\n const dirFiles = await fs.readdir(dirPath);\n const mdFiles = dirFiles.filter(f => f.endsWith('.md'));\n console.log(` ${entry.name}/ (${mdFiles.length} files: ${mdFiles.join(', ')})`);\n }\n console.log('');\n }\n\n console.log(chalk.gray('Use templates with: lean-spec create <name> --template=<template-name>'));\n console.log('');\n}\n\nexport async function showTemplate(\n templateName: string,\n cwd: string = process.cwd(),\n): Promise<void> {\n const config = await loadConfig(cwd);\n\n if (!config.templates?.[templateName]) {\n console.error(chalk.red(`Template not found: ${templateName}`));\n console.error(chalk.gray(`Available: ${Object.keys(config.templates || {}).join(', ')}`));\n process.exit(1);\n }\n\n const templatesDir = path.join(cwd, '.lean-spec', 'templates');\n const templateFile = config.templates[templateName];\n const templatePath = path.join(templatesDir, templateFile);\n\n try {\n const stat = await fs.stat(templatePath);\n \n if (stat.isDirectory()) {\n // Directory-based template - show all files\n console.log('');\n console.log(chalk.cyan(`=== Template: ${templateName} (${templateFile}/) ===`));\n console.log('');\n \n const files = await fs.readdir(templatePath);\n const mdFiles = files.filter(f => f.endsWith('.md'));\n \n for (const file of mdFiles) {\n const filePath = path.join(templatePath, file);\n const content = await fs.readFile(filePath, 'utf-8');\n console.log(chalk.yellow(`--- ${file} ---`));\n console.log(content);\n console.log('');\n }\n } else {\n // Single file template\n const content = await fs.readFile(templatePath, 'utf-8');\n console.log('');\n console.log(chalk.cyan(`=== Template: ${templateName} (${templateFile}) ===`));\n console.log('');\n console.log(content);\n console.log('');\n }\n } catch (error) {\n console.error(chalk.red(`Error reading template: ${templateFile}`));\n console.error(error);\n process.exit(1);\n }\n}\n\nexport async function addTemplate(\n name: string,\n file: string,\n cwd: string = process.cwd(),\n): Promise<void> {\n const config = await loadConfig(cwd);\n const templatesDir = path.join(cwd, '.lean-spec', 'templates');\n const templatePath = path.join(templatesDir, file);\n\n // Check if file or directory exists\n try {\n const stat = await fs.stat(templatePath);\n if (stat.isDirectory()) {\n // Verify it has a README.md (main template file)\n const mainFile = path.join(templatePath, 'README.md');\n try {\n await fs.access(mainFile);\n } catch {\n console.error(chalk.red(`Directory template must contain README.md: ${file}/`));\n console.error(chalk.gray(`Expected at: ${mainFile}`));\n process.exit(1);\n }\n }\n } catch {\n console.error(chalk.red(`Template not found: ${file}`));\n console.error(chalk.gray(`Expected at: ${templatePath}`));\n console.error(\n chalk.yellow('Create the file/directory first or use: lean-spec templates copy <source> <target>'),\n );\n process.exit(1);\n }\n\n // Add to config\n if (!config.templates) {\n config.templates = {};\n }\n\n if (config.templates[name]) {\n console.log(chalk.yellow(`Warning: Template '${name}' already exists, updating...`));\n }\n\n config.templates[name] = file;\n await saveConfig(config, cwd);\n\n console.log(chalk.green(`✓ Added template: ${name} → ${file}`));\n console.log(chalk.gray(` Use with: lean-spec create <spec-name> --template=${name}`));\n}\n\nexport async function removeTemplate(name: string, cwd: string = process.cwd()): Promise<void> {\n const config = await loadConfig(cwd);\n\n if (!config.templates?.[name]) {\n console.error(chalk.red(`Template not found: ${name}`));\n console.error(chalk.gray(`Available: ${Object.keys(config.templates || {}).join(', ')}`));\n process.exit(1);\n }\n\n if (name === 'default') {\n console.error(chalk.red('Cannot remove default template'));\n process.exit(1);\n }\n\n const file = config.templates[name];\n delete config.templates[name];\n await saveConfig(config, cwd);\n\n console.log(chalk.green(`✓ Removed template: ${name}`));\n console.log(chalk.gray(` Note: Template file ${file} still exists in .lean-spec/templates/`));\n}\n\nexport async function copyTemplate(\n source: string,\n target: string,\n cwd: string = process.cwd(),\n): Promise<void> {\n const config = await loadConfig(cwd);\n const templatesDir = path.join(cwd, '.lean-spec', 'templates');\n\n // Resolve source template\n let sourceFile: string;\n if (config.templates?.[source]) {\n sourceFile = config.templates[source];\n } else {\n sourceFile = source;\n }\n\n const sourcePath = path.join(templatesDir, sourceFile);\n\n // Check if source exists\n try {\n await fs.access(sourcePath);\n } catch {\n console.error(chalk.red(`Source template not found: ${source}`));\n console.error(chalk.gray(`Expected at: ${sourcePath}`));\n process.exit(1);\n }\n\n // Determine target filename\n const targetFile = target.endsWith('.md') ? target : `${target}.md`;\n const targetPath = path.join(templatesDir, targetFile);\n\n // Copy file\n await fs.copyFile(sourcePath, targetPath);\n console.log(chalk.green(`✓ Copied: ${sourceFile} → ${targetFile}`));\n\n // Optionally register the new template\n if (!config.templates) {\n config.templates = {};\n }\n\n const templateName = target.replace(/\\.md$/, '');\n config.templates[templateName] = targetFile;\n await saveConfig(config, cwd);\n\n console.log(chalk.green(`✓ Registered template: ${templateName}`));\n console.log(chalk.gray(` Edit: ${targetPath}`));\n console.log(chalk.gray(` Use with: lean-spec create <spec-name> --template=${templateName}`));\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { execSync, spawn } from 'node:child_process';\nimport chalk from 'chalk';\n\n/**\n * CLI execution configuration for AI tools\n */\nexport interface AIToolCliConfig {\n command: string; // Primary CLI command\n promptFlag: string; // Flag for inline prompts (e.g., '-p' for copilot) or empty string for positional\n allowToolsFlag?: string; // Flag to enable tool use (e.g., '--allow-all-tools')\n promptIsPositional?: boolean; // If true, prompt is a positional argument (e.g., claude \"prompt\")\n}\n\n/**\n * AI Tool configuration for symlink generation\n * Maps tool keys to their expected instruction file names\n */\nexport interface AIToolConfig {\n file: string; // The filename expected by the tool (e.g., 'CLAUDE.md')\n description: string; // Human-readable description for prompts\n default: boolean; // Whether to include by default in quick start\n usesSymlink: boolean; // Whether this tool uses a symlink (false for AGENTS.md itself)\n detection?: { // Optional auto-detection configuration\n commands?: string[]; // CLI commands to check (e.g., ['claude', 'claude-code'])\n configDirs?: string[]; // Config directories to check (e.g., ['.claude'])\n envVars?: string[]; // Environment variables to check (e.g., ['ANTHROPIC_API_KEY'])\n extensions?: string[]; // VS Code extension IDs to check\n };\n cli?: AIToolCliConfig; // Optional CLI execution configuration\n}\n\nexport type AIToolKey = 'aider' | 'claude' | 'codex' | 'copilot' | 'cursor' | 'droid' | 'gemini' | 'opencode' | 'windsurf';\n\nexport const AI_TOOL_CONFIGS: Record<AIToolKey, AIToolConfig> = {\n aider: {\n file: 'AGENTS.md',\n description: 'Aider (uses AGENTS.md)',\n default: false,\n usesSymlink: false,\n detection: {\n commands: ['aider'],\n configDirs: ['.aider'],\n },\n cli: {\n command: 'aider',\n promptFlag: '--message',\n // Aider doesn't have a simple allow-all flag, uses different interaction model\n },\n },\n claude: {\n file: 'CLAUDE.md',\n description: 'Claude Code (CLAUDE.md)',\n default: true,\n usesSymlink: true,\n detection: {\n commands: ['claude'],\n configDirs: ['.claude'],\n envVars: ['ANTHROPIC_API_KEY'],\n },\n cli: {\n command: 'claude',\n promptFlag: '-p', // -p is the print/non-interactive flag\n promptIsPositional: true, // Prompt is positional argument\n allowToolsFlag: '--permission-mode acceptEdits', // Auto-accept edit operations\n },\n },\n codex: {\n file: 'AGENTS.md',\n description: 'Codex CLI by OpenAI (uses AGENTS.md)',\n default: false,\n usesSymlink: false,\n detection: {\n commands: ['codex'],\n configDirs: ['.codex'],\n envVars: ['OPENAI_API_KEY'],\n },\n },\n copilot: {\n file: 'AGENTS.md',\n description: 'GitHub Copilot (AGENTS.md - default)',\n default: true,\n usesSymlink: false, // Primary file, no symlink needed\n detection: {\n commands: ['copilot'],\n envVars: ['GITHUB_TOKEN'],\n },\n cli: {\n command: 'copilot',\n promptFlag: '-p',\n allowToolsFlag: '--allow-all-tools',\n },\n },\n cursor: {\n file: 'AGENTS.md',\n description: 'Cursor (uses AGENTS.md)',\n default: false,\n usesSymlink: false,\n detection: {\n configDirs: ['.cursor', '.cursorules'],\n commands: ['cursor'],\n },\n },\n droid: {\n file: 'AGENTS.md',\n description: 'Droid by Factory (uses AGENTS.md)',\n default: false,\n usesSymlink: false,\n detection: {\n commands: ['droid'],\n },\n },\n gemini: {\n file: 'GEMINI.md',\n description: 'Gemini CLI (GEMINI.md)',\n default: false,\n usesSymlink: true,\n detection: {\n commands: ['gemini'],\n configDirs: ['.gemini'],\n envVars: ['GOOGLE_API_KEY', 'GEMINI_API_KEY'],\n },\n cli: {\n command: 'gemini',\n promptFlag: '-p', // Note: deprecated but still works\n allowToolsFlag: '-y', // YOLO mode\n },\n },\n opencode: {\n file: 'AGENTS.md',\n description: 'OpenCode (uses AGENTS.md)',\n default: false,\n usesSymlink: false,\n detection: {\n commands: ['opencode'],\n configDirs: ['.opencode'],\n },\n },\n windsurf: {\n file: 'AGENTS.md',\n description: 'Windsurf (uses AGENTS.md)',\n default: false,\n usesSymlink: false,\n detection: {\n configDirs: ['.windsurf', '.windsurfrules'],\n commands: ['windsurf'],\n },\n },\n};\n\n/**\n * Check if a command exists in PATH\n */\nfunction commandExists(command: string): boolean {\n try {\n const which = process.platform === 'win32' ? 'where' : 'which';\n execSync(`${which} ${command}`, { stdio: 'ignore' });\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if a directory exists in the user's home directory\n */\nasync function configDirExists(dirName: string): Promise<boolean> {\n const homeDir = process.env.HOME || process.env.USERPROFILE || '';\n if (!homeDir) return false;\n \n try {\n await fs.access(path.join(homeDir, dirName));\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Check if an environment variable is set\n */\nfunction envVarExists(varName: string): boolean {\n return !!process.env[varName];\n}\n\n/**\n * Check if a VS Code extension is installed\n * Note: This is a best-effort check - may not work in all environments\n */\nasync function extensionInstalled(extensionId: string): Promise<boolean> {\n const homeDir = process.env.HOME || process.env.USERPROFILE || '';\n if (!homeDir) return false;\n \n // Check common VS Code extension directories\n const extensionDirs = [\n path.join(homeDir, '.vscode', 'extensions'),\n path.join(homeDir, '.vscode-server', 'extensions'),\n path.join(homeDir, '.cursor', 'extensions'),\n ];\n \n for (const extDir of extensionDirs) {\n try {\n const entries = await fs.readdir(extDir);\n // Extension folders are named like 'github.copilot-1.234.567'\n if (entries.some(e => e.toLowerCase().startsWith(extensionId.toLowerCase()))) {\n return true;\n }\n } catch {\n // Directory doesn't exist or not readable\n }\n }\n \n return false;\n}\n\nexport interface DetectionResult {\n tool: AIToolKey;\n detected: boolean;\n reasons: string[];\n}\n\n/**\n * Auto-detect installed AI tools\n * Returns detection results with reasons for each tool\n */\nexport async function detectInstalledAITools(): Promise<DetectionResult[]> {\n const results: DetectionResult[] = [];\n \n for (const [toolKey, config] of Object.entries(AI_TOOL_CONFIGS)) {\n const reasons: string[] = [];\n const detection = config.detection;\n \n if (!detection) {\n results.push({ tool: toolKey as AIToolKey, detected: false, reasons: [] });\n continue;\n }\n \n // Check commands\n if (detection.commands) {\n for (const cmd of detection.commands) {\n if (commandExists(cmd)) {\n reasons.push(`'${cmd}' command found`);\n }\n }\n }\n \n // Check config directories\n if (detection.configDirs) {\n for (const dir of detection.configDirs) {\n if (await configDirExists(dir)) {\n reasons.push(`~/${dir} directory found`);\n }\n }\n }\n \n // Check environment variables\n if (detection.envVars) {\n for (const envVar of detection.envVars) {\n if (envVarExists(envVar)) {\n reasons.push(`${envVar} env var set`);\n }\n }\n }\n \n // Check VS Code extensions\n if (detection.extensions) {\n for (const ext of detection.extensions) {\n if (await extensionInstalled(ext)) {\n reasons.push(`${ext} extension installed`);\n }\n }\n }\n \n results.push({\n tool: toolKey as AIToolKey,\n detected: reasons.length > 0,\n reasons,\n });\n }\n \n return results;\n}\n\n/**\n * Get default selection for AI tools based on auto-detection\n * Falls back to copilot only (AGENTS.md) if nothing is detected\n */\nexport async function getDefaultAIToolSelection(): Promise<{ defaults: AIToolKey[]; detected: DetectionResult[] }> {\n const detectionResults = await detectInstalledAITools();\n const detectedTools = detectionResults\n .filter(r => r.detected)\n .map(r => r.tool);\n \n // If any tools detected, use those as defaults\n if (detectedTools.length > 0) {\n // Always include copilot if it's detected or nothing else is (AGENTS.md is primary)\n const copilotDetected = detectedTools.includes('copilot');\n if (!copilotDetected) {\n // Check if any detected tool uses AGENTS.md\n const usesAgentsMd = detectedTools.some(t => !AI_TOOL_CONFIGS[t].usesSymlink);\n if (!usesAgentsMd) {\n detectedTools.push('copilot');\n }\n }\n return { defaults: detectedTools, detected: detectionResults };\n }\n \n // Fall back to copilot only (AGENTS.md is the primary file)\n return { defaults: ['copilot'], detected: detectionResults };\n}\n\nexport interface SymlinkResult {\n file: string;\n created?: boolean;\n skipped?: boolean;\n error?: string;\n}\n\n/**\n * Create symlinks for selected AI tools pointing to AGENTS.md\n */\nexport async function createAgentToolSymlinks(\n cwd: string,\n selectedTools: AIToolKey[]\n): Promise<SymlinkResult[]> {\n const results: SymlinkResult[] = [];\n const isWindows = process.platform === 'win32';\n\n // Get unique files that need symlinks (exclude AGENTS.md itself)\n const filesToCreate = new Set<string>();\n for (const tool of selectedTools) {\n const config = AI_TOOL_CONFIGS[tool];\n if (config.usesSymlink) {\n filesToCreate.add(config.file);\n }\n }\n\n for (const file of filesToCreate) {\n const targetPath = path.join(cwd, file);\n \n try {\n // Check if file already exists\n try {\n await fs.access(targetPath);\n results.push({ file, skipped: true });\n continue;\n } catch {\n // File doesn't exist, good to create\n }\n\n if (isWindows) {\n // Windows: Create a copy instead of symlink (symlinks require admin privileges)\n // The copy will be a regular file pointing users to edit AGENTS.md instead\n const windowsContent = `# ${file}\n\n> **Note**: This file is a copy of AGENTS.md for tools that expect ${file}.\n> \n> **Important**: Edit AGENTS.md instead. Then run \\`lean-spec init\\` to regenerate this file,\n> or manually copy AGENTS.md to ${file}.\n\nSee AGENTS.md for the full LeanSpec AI agent instructions.\n`;\n await fs.writeFile(targetPath, windowsContent, 'utf-8');\n results.push({ file, created: true, error: 'created as copy (Windows)' });\n } else {\n // Unix: Create symbolic link\n await fs.symlink('AGENTS.md', targetPath);\n results.push({ file, created: true });\n }\n } catch (error) {\n results.push({ \n file, \n error: error instanceof Error ? error.message : 'Unknown error' \n });\n }\n }\n\n return results;\n}\n\n/**\n * Detect common system prompt files in a directory\n */\nexport async function detectExistingSystemPrompts(cwd: string): Promise<string[]> {\n const commonFiles = [\n 'AGENTS.md',\n '.cursorrules',\n '.github/copilot-instructions.md',\n ];\n\n const found: string[] = [];\n for (const file of commonFiles) {\n try {\n await fs.access(path.join(cwd, file));\n found.push(file);\n } catch {\n // File doesn't exist\n }\n }\n return found;\n}\n\n/**\n * Handle existing system prompt files based on user's chosen action\n */\nexport async function handleExistingFiles(\n action: 'merge-ai' | 'merge-append' | 'overwrite' | 'skip',\n existingFiles: string[],\n templateDir: string,\n cwd: string,\n variables: Record<string, string> = {}\n): Promise<void> {\n for (const file of existingFiles) {\n const filePath = path.join(cwd, file);\n // AGENTS.md is now at template root, not in files/ subdirectory\n const templateFilePath = path.join(templateDir, file);\n\n // Check if template has this file\n try {\n await fs.access(templateFilePath);\n } catch {\n // Template doesn't have this file, skip\n continue;\n }\n\n if (action === 'merge-ai' && file === 'AGENTS.md') {\n // Create consolidation prompt for AI to merge intelligently\n const existing = await fs.readFile(filePath, 'utf-8');\n let template = await fs.readFile(templateFilePath, 'utf-8');\n \n // Replace variables in template\n for (const [key, value] of Object.entries(variables)) {\n template = template.replace(new RegExp(`\\\\{${key}\\\\}`, 'g'), value);\n }\n\n // Create AI consolidation prompt file\n const promptPath = path.join(cwd, '.lean-spec', 'MERGE-AGENTS-PROMPT.md');\n const aiPrompt = `# AI Prompt: Consolidate AGENTS.md\n\n## Task\nConsolidate the existing AGENTS.md with LeanSpec instructions into a single, coherent document.\n\n## Instructions\n1. Read both documents below\n2. Merge them intelligently:\n - Preserve ALL existing project-specific information (workflows, SOPs, architecture, conventions)\n - Integrate LeanSpec sections where they fit naturally\n - Remove redundancy and ensure coherent flow\n - Keep the tone and style consistent\n3. Replace the existing AGENTS.md with the consolidated version\n\n## Existing AGENTS.md\n\\`\\`\\`markdown\n${existing}\n\\`\\`\\`\n\n## LeanSpec Instructions to Integrate\n\\`\\`\\`markdown\n${template}\n\\`\\`\\`\n\n## Output\nCreate a single consolidated AGENTS.md that:\n- Keeps all existing project context and workflows\n- Adds LeanSpec commands and principles where appropriate\n- Maintains clear structure and readability\n- Removes any duplicate or conflicting guidance\n`;\n\n await fs.mkdir(path.dirname(promptPath), { recursive: true });\n await fs.writeFile(promptPath, aiPrompt, 'utf-8');\n \n console.log(chalk.green(`✓ Created AI consolidation prompt`));\n console.log(chalk.cyan(` → ${promptPath}`));\n console.log('');\n console.log(chalk.yellow('📝 Next steps:'));\n console.log(chalk.gray(' 1. Open .lean-spec/MERGE-AGENTS-PROMPT.md'));\n console.log(chalk.gray(' 2. Send it to your AI coding assistant (GitHub Copilot, Cursor, etc.)'));\n console.log(chalk.gray(' 3. Let AI create the consolidated AGENTS.md'));\n console.log(chalk.gray(' 4. Review and commit the result'));\n console.log('');\n } else if (action === 'merge-append' && file === 'AGENTS.md') {\n // Simple append: add LeanSpec section to existing AGENTS.md\n const existing = await fs.readFile(filePath, 'utf-8');\n let template = await fs.readFile(templateFilePath, 'utf-8');\n \n // Replace variables in template\n for (const [key, value] of Object.entries(variables)) {\n template = template.replace(new RegExp(`\\\\{${key}\\\\}`, 'g'), value);\n }\n\n const merged = `${existing}\n\n---\n\n## LeanSpec Integration\n\n${template.split('\\n').slice(1).join('\\n')}`;\n\n await fs.writeFile(filePath, merged, 'utf-8');\n console.log(chalk.green(`✓ Appended LeanSpec section to ${file}`));\n console.log(chalk.yellow(' ⚠ Note: May be verbose. Consider consolidating later.'));\n } else if (action === 'overwrite') {\n // Backup existing file and create fresh one\n const backupPath = `${filePath}.backup`;\n await fs.rename(filePath, backupPath);\n console.log(chalk.yellow(`✓ Backed up ${file} → ${file}.backup`));\n\n // Copy template file with variable substitution\n let content = await fs.readFile(templateFilePath, 'utf-8');\n \n // Replace variables in content\n for (const [key, value] of Object.entries(variables)) {\n content = content.replace(new RegExp(`\\\\{${key}\\\\}`, 'g'), value);\n }\n \n await fs.writeFile(filePath, content, 'utf-8');\n console.log(chalk.green(`✓ Created new ${file}`));\n console.log(chalk.gray(` 💡 Your original content is preserved in ${file}.backup`));\n }\n // If skip, do nothing with this file\n }\n}\n\n/**\n * Recursively copy directory with variable substitution and skip list\n */\nexport async function copyDirectory(\n src: string,\n dest: string,\n skipFiles: string[] = [],\n variables: Record<string, string> = {}\n): Promise<void> {\n await fs.mkdir(dest, { recursive: true });\n\n const entries = await fs.readdir(src, { withFileTypes: true });\n\n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n\n // Check if this file should be skipped\n if (skipFiles.includes(entry.name)) {\n continue;\n }\n\n if (entry.isDirectory()) {\n await copyDirectory(srcPath, destPath, skipFiles, variables);\n } else {\n // Only copy if file doesn't exist\n try {\n await fs.access(destPath);\n // File exists, skip it\n } catch {\n // File doesn't exist, copy it with variable substitution\n let content = await fs.readFile(srcPath, 'utf-8');\n \n // Replace variables in content\n for (const [key, value] of Object.entries(variables)) {\n content = content.replace(new RegExp(`\\\\{${key}\\\\}`, 'g'), value);\n }\n \n await fs.writeFile(destPath, content, 'utf-8');\n }\n }\n }\n}\n\n/**\n * Get project name from package.json or directory name\n */\nexport async function getProjectName(cwd: string): Promise<string> {\n try {\n const packageJsonPath = path.join(cwd, 'package.json');\n const content = await fs.readFile(packageJsonPath, 'utf-8');\n const pkg = JSON.parse(content);\n if (pkg.name) {\n return pkg.name;\n }\n } catch {\n // package.json not found or invalid\n }\n \n // Fallback to directory name\n return path.basename(cwd);\n}\n\n/**\n * Result of attempting to execute an AI merge\n */\nexport interface MergeExecutionResult {\n success: boolean;\n output?: string;\n error?: string;\n timedOut?: boolean;\n}\n\n/**\n * Build the CLI command for AI-assisted merge\n */\nexport function buildMergeCommand(\n cli: AIToolCliConfig,\n promptPath: string\n): { command: string; args: string[] } {\n const prompt = `Follow the instructions in ${promptPath} to consolidate AGENTS.md. Read the prompt file, then edit AGENTS.md with the merged content.`;\n \n const args: string[] = [];\n \n if (cli.promptIsPositional) {\n // For CLIs like claude where prompt is positional: claude \"prompt\" -p --flags\n args.push(prompt);\n if (cli.promptFlag) {\n args.push(cli.promptFlag);\n }\n } else {\n // For CLIs like copilot where prompt follows a flag: copilot -p \"prompt\"\n args.push(cli.promptFlag);\n args.push(prompt);\n }\n \n // Add allow-all-tools flag if available\n if (cli.allowToolsFlag) {\n // Handle flags that might have spaces (e.g., \"--permission-mode acceptEdits\")\n const flagParts = cli.allowToolsFlag.split(' ');\n args.push(...flagParts);\n }\n \n return { command: cli.command, args };\n}\n\n/**\n * Execute AI-assisted merge using detected CLI tool\n * \n * @param cwd - Working directory for the command\n * @param promptPath - Path to the merge prompt file\n * @param tool - AI tool key to use\n * @param timeoutMs - Timeout in milliseconds (default: 120000 = 2 minutes)\n */\nexport async function executeMergeWithAI(\n cwd: string,\n promptPath: string,\n tool: AIToolKey,\n timeoutMs = 120000\n): Promise<MergeExecutionResult> {\n const config = AI_TOOL_CONFIGS[tool];\n \n if (!config.cli) {\n return {\n success: false,\n error: `Tool ${tool} does not have CLI configuration`,\n };\n }\n \n const { command, args } = buildMergeCommand(config.cli, promptPath);\n \n // Build the full command string with proper quoting for shell execution\n const quotedArgs = args.map(arg => {\n // If arg contains spaces or special chars, wrap in single quotes\n // and escape any single quotes within\n if (arg.includes(' ') || arg.includes('\"') || arg.includes(\"'\")) {\n return `'${arg.replace(/'/g, \"'\\\\''\")}'`;\n }\n return arg;\n });\n const fullCommand = `${command} ${quotedArgs.join(' ')}`;\n \n return new Promise((resolve) => {\n let output = '';\n let errorOutput = '';\n let timedOut = false;\n \n const child = spawn(fullCommand, [], {\n cwd,\n shell: true,\n stdio: ['inherit', 'pipe', 'pipe'],\n });\n \n // Set up timeout\n const timeout = setTimeout(() => {\n timedOut = true;\n child.kill('SIGTERM');\n }, timeoutMs);\n \n child.stdout?.on('data', (data) => {\n output += data.toString();\n // Stream output to console\n process.stdout.write(data);\n });\n \n child.stderr?.on('data', (data) => {\n errorOutput += data.toString();\n // Stream errors to console\n process.stderr.write(data);\n });\n \n child.on('close', (code) => {\n clearTimeout(timeout);\n \n if (timedOut) {\n resolve({\n success: false,\n output,\n error: 'Command timed out',\n timedOut: true,\n });\n } else if (code === 0) {\n resolve({\n success: true,\n output,\n });\n } else {\n resolve({\n success: false,\n output,\n error: errorOutput || `Process exited with code ${code}`,\n });\n }\n });\n \n child.on('error', (err) => {\n clearTimeout(timeout);\n resolve({\n success: false,\n error: err.message,\n });\n });\n });\n}\n\n/**\n * Get AI tools that have CLI capabilities and are detected\n * Sorted by preference: copilot > gemini > claude > others\n */\nexport async function getCliCapableDetectedTools(): Promise<{\n tool: AIToolKey;\n config: AIToolConfig;\n reasons: string[];\n}[]> {\n const detectionResults = await detectInstalledAITools();\n \n // Priority order for CLI tools\n const priorityOrder: AIToolKey[] = ['copilot', 'gemini', 'claude', 'aider', 'codex'];\n \n const detected = detectionResults\n .filter(r => r.detected && AI_TOOL_CONFIGS[r.tool].cli)\n .map(r => ({\n tool: r.tool,\n config: AI_TOOL_CONFIGS[r.tool],\n reasons: r.reasons,\n }));\n \n // Sort by priority\n detected.sort((a, b) => {\n const aIndex = priorityOrder.indexOf(a.tool);\n const bIndex = priorityOrder.indexOf(b.tool);\n // If not in priority list, put at end\n const aPriority = aIndex === -1 ? 999 : aIndex;\n const bPriority = bIndex === -1 ? 999 : bIndex;\n return aPriority - bPriority;\n });\n \n return detected;\n}\n\n/**\n * Get display-friendly command string for showing to user\n */\nexport function getDisplayCommand(tool: AIToolKey, promptPath: string): string {\n const config = AI_TOOL_CONFIGS[tool];\n if (!config.cli) return '';\n \n const { command, args } = buildMergeCommand(config.cli, promptPath);\n \n // Quote the prompt argument for display\n const displayArgs = args.map((arg, index) => {\n // Quote the prompt text (first arg for positional, second arg for flagged)\n const isPromptArg = config.cli!.promptIsPositional \n ? index === 0 \n : index === 1;\n \n if (isPromptArg && arg.includes(' ')) {\n return `\"${arg}\"`;\n }\n return arg;\n });\n \n return `${command} ${displayArgs.join(' ')}`;\n}\n","/**\n * Example project templates for tutorials\n */\n\nexport interface ExampleMetadata {\n name: string;\n title: string;\n description: string;\n difficulty: 'beginner' | 'intermediate' | 'advanced';\n tutorial: string;\n tutorialUrl: string;\n tech: string[];\n files: number;\n lines: number;\n}\n\nexport const EXAMPLES: Record<string, ExampleMetadata> = {\n 'dark-theme': {\n name: 'dark-theme',\n title: 'Dark Theme Support',\n description: 'Add dark theme support to a professional admin dashboard with charts',\n difficulty: 'beginner',\n tutorial: 'Your First Spec with AI',\n tutorialUrl: 'https://lean-spec.dev/docs/tutorials/first-spec-with-ai',\n tech: ['HTML', 'CSS', 'JavaScript', 'Chart.js', 'Express.js'],\n files: 6,\n lines: 420,\n },\n 'dashboard-widgets': {\n name: 'dashboard-widgets',\n title: 'Dashboard Widgets',\n description: 'Add three new widgets to an analytics dashboard',\n difficulty: 'intermediate',\n tutorial: 'Managing Multiple Features',\n tutorialUrl: 'https://lean-spec.dev/docs/tutorials/multiple-features',\n tech: ['React', 'Vite'],\n files: 17,\n lines: 300,\n },\n 'api-refactor': {\n name: 'api-refactor',\n title: 'API Client Refactor',\n description: 'Extract reusable API client from monolithic code',\n difficulty: 'intermediate',\n tutorial: 'Refactoring with Specs',\n tutorialUrl: 'https://lean-spec.dev/docs/tutorials/refactoring-specs',\n tech: ['Node.js'],\n files: 7,\n lines: 250,\n },\n};\n\nexport function getExamplesList(): ExampleMetadata[] {\n return Object.values(EXAMPLES);\n}\n\nexport function getExample(name: string): ExampleMetadata | undefined {\n return EXAMPLES[name];\n}\n\nexport function exampleExists(name: string): boolean {\n return name in EXAMPLES;\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport { select, checkbox, confirm } from '@inquirer/prompts';\nimport { saveConfig, type LeanSpecConfig } from '../config.js';\nimport {\n detectExistingSystemPrompts,\n handleExistingFiles,\n copyDirectory,\n getProjectName,\n createAgentToolSymlinks,\n AI_TOOL_CONFIGS,\n getDefaultAIToolSelection,\n getCliCapableDetectedTools,\n executeMergeWithAI,\n getDisplayCommand,\n type AIToolKey,\n} from '../utils/template-helpers.js';\nimport { \n getExamplesList, \n getExample, \n exampleExists,\n type ExampleMetadata \n} from '../utils/examples.js';\n\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\nconst TEMPLATES_DIR = path.join(__dirname, '..', 'templates');\nconst EXAMPLES_DIR = path.join(TEMPLATES_DIR, 'examples');\n\n/**\n * Attempt to auto-merge AGENTS.md using detected AI CLI tool\n * Returns true if merge was successfully completed\n */\nasync function attemptAutoMerge(cwd: string, promptPath: string, autoExecute: boolean): Promise<boolean> {\n // Check for CLI-capable AI tools\n const cliTools = await getCliCapableDetectedTools();\n \n if (cliTools.length === 0) {\n // No CLI tools detected, fall back to manual instructions\n return false;\n }\n \n // Use first detected CLI-capable tool\n const tool = cliTools[0];\n const displayCmd = getDisplayCommand(tool.tool, promptPath);\n \n console.log('');\n console.log(chalk.cyan(`🔍 Detected AI CLI: ${tool.config.description}`));\n for (const reason of tool.reasons) {\n console.log(chalk.gray(` └─ ${reason}`));\n }\n console.log('');\n console.log(chalk.gray(`Command: ${displayCmd}`));\n console.log('');\n \n let shouldExecute = autoExecute;\n \n if (!autoExecute) {\n shouldExecute = await confirm({\n message: 'Run merge automatically using detected AI CLI?',\n default: true,\n });\n }\n \n if (!shouldExecute) {\n console.log(chalk.gray('Skipping auto-merge. Run the command above manually to merge.'));\n return false;\n }\n \n console.log('');\n console.log(chalk.cyan('🤖 Running AI-assisted merge...'));\n console.log(chalk.gray(' (This may take a moment)'));\n console.log('');\n \n const result = await executeMergeWithAI(cwd, promptPath, tool.tool);\n \n if (result.success) {\n console.log('');\n console.log(chalk.green('✓ AGENTS.md merged successfully!'));\n console.log(chalk.gray(' Review changes: git diff AGENTS.md'));\n return true;\n } else if (result.timedOut) {\n console.log('');\n console.log(chalk.yellow('⚠ Merge timed out. Try running the command manually:'));\n console.log(chalk.gray(` ${displayCmd}`));\n return false;\n } else {\n console.log('');\n console.log(chalk.yellow(`⚠ Auto-merge encountered an issue: ${result.error}`));\n console.log(chalk.gray(' Try running the command manually:'));\n console.log(chalk.gray(` ${displayCmd}`));\n return false;\n }\n}\n\n/**\n * Re-initialization strategy options\n */\ntype ReinitStrategy = 'upgrade' | 'reset-config' | 'full-reset' | 'cancel';\n\n/**\n * Handle re-initialization when LeanSpec is already initialized\n */\nasync function handleReinitialize(cwd: string, skipPrompts: boolean, forceReinit: boolean): Promise<ReinitStrategy> {\n const specsDir = path.join(cwd, 'specs');\n let specCount = 0;\n \n try {\n const entries = await fs.readdir(specsDir, { withFileTypes: true });\n specCount = entries.filter(e => e.isDirectory()).length;\n } catch {\n // specs/ doesn't exist\n }\n \n console.log('');\n console.log(chalk.yellow('⚠ LeanSpec is already initialized in this directory.'));\n \n if (specCount > 0) {\n console.log(chalk.cyan(` Found ${specCount} spec${specCount > 1 ? 's' : ''} in specs/`));\n }\n console.log('');\n \n // Force flag: reset config but preserve specs (safe default)\n if (forceReinit) {\n console.log(chalk.gray('Force flag detected. Resetting configuration...'));\n return 'reset-config';\n }\n \n // With -y flag, default to upgrade (safest)\n if (skipPrompts) {\n console.log(chalk.gray('Using safe upgrade (preserving all existing files)'));\n return 'upgrade';\n }\n \n // Interactive mode: let user choose\n const strategy = await select<ReinitStrategy>({\n message: 'What would you like to do?',\n choices: [\n {\n name: 'Upgrade configuration (recommended)',\n value: 'upgrade',\n description: 'Update config to latest version. Keeps specs and AGENTS.md untouched.',\n },\n {\n name: 'Reset configuration',\n value: 'reset-config', \n description: 'Fresh config from template. Keeps specs/ directory.',\n },\n {\n name: 'Full reset',\n value: 'full-reset',\n description: 'Remove .lean-spec/, specs/, and AGENTS.md. Start completely fresh.',\n },\n {\n name: 'Cancel',\n value: 'cancel',\n description: 'Exit without changes.',\n },\n ],\n });\n \n // Confirm destructive actions\n if (strategy === 'full-reset') {\n const warnings: string[] = [];\n \n if (specCount > 0) {\n warnings.push(`${specCount} spec${specCount > 1 ? 's' : ''} in specs/`);\n }\n \n try {\n await fs.access(path.join(cwd, 'AGENTS.md'));\n warnings.push('AGENTS.md');\n } catch {}\n \n if (warnings.length > 0) {\n console.log('');\n console.log(chalk.red('⚠ This will permanently delete:'));\n for (const warning of warnings) {\n console.log(chalk.red(` - ${warning}`));\n }\n console.log('');\n \n const confirmed = await confirm({\n message: 'Are you sure you want to continue?',\n default: false,\n });\n \n if (!confirmed) {\n console.log(chalk.gray('Cancelled.'));\n return 'cancel';\n }\n }\n \n // Perform full reset\n console.log(chalk.gray('Performing full reset...'));\n \n // Remove .lean-spec/\n await fs.rm(path.join(cwd, '.lean-spec'), { recursive: true, force: true });\n console.log(chalk.gray(' Removed .lean-spec/'));\n \n // Remove specs/\n try {\n await fs.rm(specsDir, { recursive: true, force: true });\n console.log(chalk.gray(' Removed specs/'));\n } catch {}\n \n // Remove AGENTS.md and symlinks\n for (const file of ['AGENTS.md', 'CLAUDE.md', 'GEMINI.md']) {\n try {\n await fs.rm(path.join(cwd, file), { force: true });\n console.log(chalk.gray(` Removed ${file}`));\n } catch {}\n }\n }\n \n return strategy;\n}\n\n/**\n * Upgrade existing LeanSpec configuration\n * This preserves all user content (specs, AGENTS.md) while updating config\n */\nasync function upgradeConfig(cwd: string): Promise<void> {\n const configPath = path.join(cwd, '.lean-spec', 'config.json');\n \n // Read existing config\n let existingConfig: LeanSpecConfig;\n try {\n const content = await fs.readFile(configPath, 'utf-8');\n existingConfig = JSON.parse(content);\n } catch {\n console.error(chalk.red('Error reading existing config'));\n process.exit(1);\n }\n \n // Load standard template config as reference for defaults\n const templateConfigPath = path.join(TEMPLATES_DIR, 'standard', 'config.json');\n let templateConfig: LeanSpecConfig;\n try {\n const content = await fs.readFile(templateConfigPath, 'utf-8');\n templateConfig = JSON.parse(content).config;\n } catch {\n console.error(chalk.red('Error reading template config'));\n process.exit(1);\n }\n \n // Merge configs - preserve user settings, add new defaults\n const upgradedConfig: LeanSpecConfig = {\n ...templateConfig,\n ...existingConfig,\n // Deep merge structure\n structure: {\n ...templateConfig.structure,\n ...existingConfig.structure,\n },\n };\n \n // Ensure templates directory exists\n const templatesDir = path.join(cwd, '.lean-spec', 'templates');\n try {\n await fs.mkdir(templatesDir, { recursive: true });\n } catch {}\n \n // Check if templates need updating\n const templateFiles = ['spec-template.md'];\n let templatesUpdated = false;\n \n for (const file of templateFiles) {\n const destPath = path.join(templatesDir, file);\n try {\n await fs.access(destPath);\n // File exists, don't overwrite\n } catch {\n // File doesn't exist, copy from template\n const srcPath = path.join(TEMPLATES_DIR, 'standard', 'files', 'README.md');\n try {\n await fs.copyFile(srcPath, destPath);\n templatesUpdated = true;\n console.log(chalk.green(`✓ Added missing template: ${file}`));\n } catch {}\n }\n }\n \n // Check if AGENTS.md exists, create if missing\n const agentsPath = path.join(cwd, 'AGENTS.md');\n let agentsCreated = false;\n let agentsPreserved = false;\n \n try {\n await fs.access(agentsPath);\n agentsPreserved = true;\n } catch {\n // AGENTS.md doesn't exist, create from template\n const templateDir = path.join(TEMPLATES_DIR, 'standard');\n const agentsSourcePath = path.join(templateDir, 'AGENTS.md');\n \n try {\n const projectName = await getProjectName(cwd);\n let agentsContent = await fs.readFile(agentsSourcePath, 'utf-8');\n agentsContent = agentsContent.replace(/\\{project_name\\}/g, projectName);\n await fs.writeFile(agentsPath, agentsContent, 'utf-8');\n agentsCreated = true;\n console.log(chalk.green('✓ Created missing AGENTS.md'));\n } catch (error) {\n console.log(chalk.yellow(`⚠ Could not create AGENTS.md: ${error}`));\n }\n }\n \n // Save upgraded config\n await saveConfig(upgradedConfig, cwd);\n \n console.log('');\n console.log(chalk.green('✓ Configuration upgraded!'));\n console.log('');\n console.log(chalk.gray('What was updated:'));\n console.log(chalk.gray(' - Config merged with latest defaults'));\n if (templatesUpdated) {\n console.log(chalk.gray(' - Missing templates added'));\n }\n if (agentsCreated) {\n console.log(chalk.gray(' - AGENTS.md created (was missing)'));\n }\n console.log('');\n console.log(chalk.gray('What was preserved:'));\n console.log(chalk.gray(' - Your specs/ directory'));\n if (agentsPreserved) {\n console.log(chalk.gray(' - Your AGENTS.md'));\n }\n console.log(chalk.gray(' - Your custom settings'));\n console.log('');\n}\n\n/**\n * Init command - initialize LeanSpec in current directory\n */\nexport function initCommand(): Command {\n return new Command('init')\n .description('Initialize LeanSpec in current directory')\n .option('-y, --yes', 'Skip prompts and use defaults (quick start with standard template)')\n .option('-f, --force', 'Force re-initialization (resets config, keeps specs)')\n .option('--template <name>', 'Use specific template (standard or detailed)')\n .option('--example [name]', 'Scaffold an example project for tutorials (interactive if no name provided)')\n .option('--name <dirname>', 'Custom directory name for example project')\n .option('--list', 'List available example projects')\n .option('--agent-tools <tools>', 'AI tools to create symlinks for (comma-separated: claude,gemini,copilot or \"all\" or \"none\")')\n .action(async (options: { yes?: boolean; force?: boolean; template?: string; example?: string; name?: string; list?: boolean; agentTools?: string }) => {\n if (options.list) {\n await listExamples();\n return;\n }\n \n if (options.example !== undefined) {\n await scaffoldExample(options.example, options.name);\n return;\n }\n \n await initProject(options.yes, options.template, options.agentTools, options.force);\n });\n}\n\nexport async function initProject(skipPrompts = false, templateOption?: string, agentToolsOption?: string, forceReinit = false): Promise<void> {\n const cwd = process.cwd();\n\n // Check if already initialized\n const configPath = path.join(cwd, '.lean-spec', 'config.json');\n let isAlreadyInitialized = false;\n \n try {\n await fs.access(configPath);\n isAlreadyInitialized = true;\n } catch {\n // Not initialized, continue with fresh init\n }\n\n // Handle re-initialization\n if (isAlreadyInitialized) {\n const strategy = await handleReinitialize(cwd, skipPrompts, forceReinit);\n \n if (strategy === 'cancel') {\n return;\n }\n \n if (strategy === 'upgrade') {\n await upgradeConfig(cwd);\n return;\n }\n \n // For 'reset-config' and 'full-reset', we continue with normal init flow\n // but 'full-reset' will have already cleaned up the directory\n if (strategy === 'reset-config') {\n // Just remove config, keep specs\n await fs.rm(path.join(cwd, '.lean-spec'), { recursive: true, force: true });\n console.log(chalk.gray('Removed .lean-spec/ configuration'));\n }\n }\n\n console.log('');\n console.log(chalk.green('Welcome to LeanSpec!'));\n console.log('');\n\n let setupMode = 'quick';\n let templateName = templateOption || 'standard'; // Use provided template or default to standard\n let selectedAgentTools: AIToolKey[] = [];\n\n // Parse agent tools option if provided\n if (agentToolsOption) {\n if (agentToolsOption === 'all') {\n selectedAgentTools = Object.keys(AI_TOOL_CONFIGS) as AIToolKey[];\n } else if (agentToolsOption === 'none') {\n selectedAgentTools = [];\n } else {\n selectedAgentTools = agentToolsOption.split(',').map(t => t.trim()) as AIToolKey[];\n }\n }\n\n // Skip prompts if -y flag is used\n if (skipPrompts) {\n console.log(chalk.gray('Using defaults: quick start with standard template'));\n // Default to Copilot only (AGENTS.md) when using -y\n if (!agentToolsOption) {\n selectedAgentTools = ['copilot'];\n }\n console.log('');\n } else if (!templateOption) {\n // Only show setup mode prompt if no template was explicitly provided\n // Main question: How to set up?\n setupMode = await select({\n message: 'How would you like to set up?',\n choices: [\n {\n name: 'Quick start (recommended)',\n value: 'quick',\n description: 'Use standard template, start immediately',\n },\n {\n name: 'Choose template',\n value: 'template',\n description: 'Pick from: standard, detailed',\n },\n // TODO: Re-enable when custom setup mode is implemented\n // {\n // name: 'Customize everything',\n // value: 'custom',\n // description: 'Full control over structure and settings',\n // },\n ],\n });\n\n if (setupMode === 'template') {\n // Let user choose template\n templateName = await select({\n message: 'Select template:',\n choices: [\n { name: 'standard', value: 'standard', description: 'Recommended - single-file specs with AGENTS.md' },\n {\n name: 'detailed',\n value: 'detailed',\n description: 'Complex specs with sub-spec structure (DESIGN, PLAN, TEST)',\n },\n ],\n });\n }\n }\n // Note: setupMode === 'custom' branch removed - will be implemented in future\n\n // Handle legacy template names\n if (templateName === 'minimal') {\n console.log(chalk.yellow('⚠ The \"minimal\" template has been removed.'));\n console.log(chalk.gray(' Using \"standard\" template instead (same lightweight approach).'));\n console.log('');\n templateName = 'standard';\n } else if (templateName === 'enterprise') {\n console.log(chalk.yellow('⚠ The \"enterprise\" template has been renamed to \"detailed\".'));\n console.log(chalk.gray(' Using \"detailed\" template (sub-spec structure for complex specs).'));\n console.log('');\n templateName = 'detailed';\n }\n\n // Load template config\n const templateDir = path.join(TEMPLATES_DIR, templateName);\n const templateConfigPath = path.join(templateDir, 'config.json');\n\n let templateConfig: LeanSpecConfig;\n try {\n const content = await fs.readFile(templateConfigPath, 'utf-8');\n templateConfig = JSON.parse(content).config;\n } catch {\n console.error(chalk.red(`Error: Template not found: ${templateName}`));\n process.exit(1);\n }\n\n // Pattern selection (skip for quick start or if -y flag is used)\n let patternChoice = 'simple'; // Default for quick start\n\n if (setupMode !== 'quick' && !skipPrompts) {\n patternChoice = await select({\n message: 'Select folder pattern:',\n choices: [\n {\n name: 'Simple: 001-my-spec/',\n value: 'simple',\n description: 'Global sequential numbering (recommended)',\n },\n {\n name: 'Date-grouped: 20251105/001-my-spec/',\n value: 'date-grouped',\n description: 'Group specs by creation date (good for teams)',\n },\n {\n name: 'Flat with date: 20251105-001-my-spec/',\n value: 'date-prefix',\n description: 'Date prefix with global numbering',\n },\n {\n name: 'Custom pattern',\n value: 'custom',\n description: 'Enter your own pattern',\n },\n ],\n });\n }\n\n // Apply pattern choice to config\n if (patternChoice === 'simple') {\n // Default: flat pattern with no prefix\n templateConfig.structure.pattern = 'flat';\n templateConfig.structure.prefix = '';\n } else if (patternChoice === 'date-grouped') {\n // Custom pattern with date grouping\n templateConfig.structure.pattern = 'custom';\n templateConfig.structure.groupExtractor = '{YYYYMMDD}';\n templateConfig.structure.prefix = undefined;\n } else if (patternChoice === 'date-prefix') {\n // Flat pattern with date prefix\n templateConfig.structure.pattern = 'flat';\n templateConfig.structure.prefix = '{YYYYMMDD}-';\n } else if (patternChoice === 'custom') {\n // Custom pattern not yet implemented - fall back to simple\n console.log('');\n console.log(chalk.yellow('⚠ Custom pattern input is not yet implemented.'));\n console.log(chalk.gray(' You can manually edit .lean-spec/config.json after initialization.'));\n console.log(chalk.gray(' Using simple pattern for now.'));\n console.log('');\n templateConfig.structure.pattern = 'flat';\n templateConfig.structure.prefix = '';\n }\n\n // AI tool selection (skip only if -y flag is used or --agent-tools was provided)\n // Quick start should still ask this question - it's important for AI tool UX\n if (!skipPrompts && !agentToolsOption) {\n // Auto-detect installed AI tools for smart defaults\n const { defaults: detectedDefaults, detected: detectionResults } = await getDefaultAIToolSelection();\n const anyDetected = detectionResults.some(r => r.detected);\n \n // Show detection info if any tools were found\n if (anyDetected) {\n console.log('');\n console.log(chalk.cyan('🔍 Detected AI tools:'));\n for (const result of detectionResults) {\n if (result.detected) {\n console.log(chalk.gray(` ${AI_TOOL_CONFIGS[result.tool].description}`));\n for (const reason of result.reasons) {\n console.log(chalk.gray(` └─ ${reason}`));\n }\n }\n }\n console.log('');\n }\n\n // Only show tools that require symlinks (Claude, Gemini)\n // Filter to only show tools that require symlinks\n const symlinkTools = Object.entries(AI_TOOL_CONFIGS)\n .filter(([, config]) => config.usesSymlink)\n .map(([key, config]) => ({\n name: config.description,\n value: key as AIToolKey,\n checked: detectedDefaults.includes(key as AIToolKey),\n }));\n\n // Ask about symlinks only if there are tools that need them\n if (symlinkTools.length > 0) {\n console.log('');\n console.log(chalk.gray('AGENTS.md will be created as the primary instruction file.'));\n console.log(chalk.gray('Some AI tools (Claude Code, Gemini CLI) use their own filenames.'));\n console.log('');\n \n const symlinkSelection = await checkbox({\n message: 'Create symlinks for additional AI tools?',\n choices: symlinkTools,\n });\n selectedAgentTools = symlinkSelection;\n } else {\n selectedAgentTools = [];\n }\n }\n\n // Create .lean-spec/templates/ directory\n const templatesDir = path.join(cwd, '.lean-spec', 'templates');\n try {\n await fs.mkdir(templatesDir, { recursive: true });\n } catch (error) {\n console.error(chalk.red('Error creating templates directory:'), error);\n process.exit(1);\n }\n \n // Copy spec templates from template/files/ to .lean-spec/templates/\n const templateFilesDir = path.join(templateDir, 'files');\n \n try {\n const files = await fs.readdir(templateFilesDir);\n \n if (templateName === 'standard') {\n // Standard template: Copy files/README.md as spec-template.md (backward compat)\n const readmePath = path.join(templateFilesDir, 'README.md');\n const targetSpecPath = path.join(templatesDir, 'spec-template.md');\n await fs.copyFile(readmePath, targetSpecPath);\n console.log(chalk.green('✓ Created .lean-spec/templates/spec-template.md'));\n \n // Update config to use spec-template.md\n templateConfig.template = 'spec-template.md';\n templateConfig.templates = {\n default: 'spec-template.md',\n };\n } else if (templateName === 'detailed') {\n // Detailed template: Copy all files preserving names\n for (const file of files) {\n const srcPath = path.join(templateFilesDir, file);\n const destPath = path.join(templatesDir, file);\n await fs.copyFile(srcPath, destPath);\n }\n console.log(chalk.green(`✓ Created .lean-spec/templates/ with ${files.length} files`));\n console.log(chalk.gray(` Files: ${files.join(', ')}`));\n \n // Update config to use README.md as main template\n templateConfig.template = 'README.md';\n templateConfig.templates = {\n default: 'README.md',\n };\n }\n } catch (error) {\n console.error(chalk.red('Error copying template files:'), error);\n process.exit(1);\n }\n \n\n // Save config\n await saveConfig(templateConfig, cwd);\n console.log(chalk.green('✓ Created .lean-spec/config.json'));\n\n // Check for existing system prompt files\n const existingFiles = await detectExistingSystemPrompts(cwd);\n let skipFiles: string[] = [];\n let mergeCompleted = false;\n\n if (existingFiles.length > 0) {\n console.log('');\n console.log(chalk.yellow(`Found existing: ${existingFiles.join(', ')}`));\n\n if (skipPrompts) {\n // With -y flag, use AI-Assisted Merge as default for existing files\n console.log(chalk.gray('Using AI-Assisted Merge for existing AGENTS.md'));\n const projectName = await getProjectName(cwd);\n await handleExistingFiles('merge-ai', existingFiles, templateDir, cwd, { project_name: projectName });\n \n // Auto-execute merge if CLI tool is available\n const promptPath = path.join(cwd, '.lean-spec', 'MERGE-AGENTS-PROMPT.md');\n mergeCompleted = await attemptAutoMerge(cwd, promptPath, true /* skipPrompts */);\n } else {\n const action = await select<'merge-ai' | 'merge-append' | 'overwrite' | 'skip'>({\n message: 'How would you like to handle existing AGENTS.md?',\n choices: [\n {\n name: 'AI-Assisted Merge (recommended)',\n value: 'merge-ai',\n description: 'Creates prompt for AI to intelligently consolidate both files',\n },\n {\n name: 'Simple Append',\n value: 'merge-append',\n description: 'Quickly appends LeanSpec section (may be verbose)',\n },\n {\n name: 'Replace with LeanSpec',\n value: 'overwrite',\n description: 'Backs up existing, creates fresh AGENTS.md from template',\n },\n {\n name: 'Keep Existing Only',\n value: 'skip',\n description: 'Skips AGENTS.md, only adds .lean-spec config and specs/',\n },\n ],\n });\n\n // Get project name for variable substitution\n const projectName = await getProjectName(cwd);\n \n await handleExistingFiles(action, existingFiles, templateDir, cwd, { project_name: projectName });\n\n if (action === 'skip') {\n skipFiles = existingFiles;\n } else if (action === 'merge-ai') {\n // Offer auto-merge if CLI tool is available\n const promptPath = path.join(cwd, '.lean-spec', 'MERGE-AGENTS-PROMPT.md');\n mergeCompleted = await attemptAutoMerge(cwd, promptPath, false /* skipPrompts */);\n }\n }\n }\n\n // Get project name for variable substitution\n const projectName = await getProjectName(cwd);\n\n // Copy AGENTS.md from template root to project root (unless skipping or already merged)\n if (!skipFiles.includes('AGENTS.md') && !mergeCompleted) {\n const agentsSourcePath = path.join(templateDir, 'AGENTS.md');\n const agentsTargetPath = path.join(cwd, 'AGENTS.md');\n \n try {\n let agentsContent = await fs.readFile(agentsSourcePath, 'utf-8');\n // Replace variables in AGENTS.md\n agentsContent = agentsContent.replace(/\\{project_name\\}/g, projectName);\n await fs.writeFile(agentsTargetPath, agentsContent, 'utf-8');\n console.log(chalk.green('✓ Created AGENTS.md'));\n } catch (error) {\n console.error(chalk.red('Error copying AGENTS.md:'), error);\n process.exit(1);\n }\n\n // Create symlinks for selected AI tools\n if (selectedAgentTools.length > 0) {\n const symlinkResults = await createAgentToolSymlinks(cwd, selectedAgentTools);\n for (const result of symlinkResults) {\n if (result.created) {\n console.log(chalk.green(`✓ Created ${result.file} → AGENTS.md`));\n } else if (result.skipped) {\n console.log(chalk.yellow(`⚠ Skipped ${result.file} (already exists)`));\n } else if (result.error) {\n console.log(chalk.yellow(`⚠ Could not create ${result.file}: ${result.error}`));\n }\n }\n }\n }\n\n // Copy any other template files from files/ directory (excluding those we're skipping)\n // Note: files/ directory no longer contains AGENTS.md\n const filesDir = path.join(templateDir, 'files');\n try {\n // Check if files/ directory has any files to copy (besides the spec templates already copied)\n const filesToCopy = await fs.readdir(filesDir);\n const hasOtherFiles = filesToCopy.some(f => !f.match(/\\.(md)$/i) || !['README.md', 'DESIGN.md', 'PLAN.md', 'TEST.md'].includes(f));\n \n if (hasOtherFiles) {\n await copyDirectory(filesDir, cwd, [...skipFiles, 'README.md', 'DESIGN.md', 'PLAN.md', 'TEST.md'], { project_name: projectName });\n }\n console.log(chalk.green('✓ Initialized project structure'));\n } catch (error) {\n console.error(chalk.red('Error copying template files:'), error);\n process.exit(1);\n }\n\n // Create empty specs/ directory\n const specsDir = path.join(cwd, 'specs');\n try {\n await fs.mkdir(specsDir, { recursive: true });\n console.log(chalk.green('✓ Created specs/ directory'));\n } catch (error) {\n console.error(chalk.red('Error creating specs directory:'), error);\n process.exit(1);\n }\n\n console.log('');\n console.log(chalk.green('✓ LeanSpec initialized!'));\n console.log('');\n console.log(chalk.cyan('You\\'re ready to go!') + chalk.gray(' Ask your AI to create a spec for your next feature.'));\n console.log('');\n console.log(chalk.gray('Example: \"Create a spec for user authentication\"'));\n console.log(chalk.gray('Learn more: https://lean-spec.dev/docs/guide/getting-started'));\n console.log('');\n}\n\n/**\n * List available example projects\n */\nasync function listExamples(): Promise<void> {\n const examples = getExamplesList();\n \n console.log('');\n console.log(chalk.bold('Available Examples:'));\n console.log('');\n \n for (const example of examples) {\n const difficultyColor = \n example.difficulty === 'beginner' ? chalk.green :\n example.difficulty === 'intermediate' ? chalk.yellow :\n chalk.red;\n \n console.log(chalk.cyan(` ${example.name}`));\n console.log(` ${example.description}`);\n console.log(` ${difficultyColor(example.difficulty)} • ${example.tech.join(', ')} • ~${example.lines} lines`);\n console.log(` Tutorial: ${chalk.gray(example.tutorialUrl)}`);\n console.log('');\n }\n \n console.log('Usage:');\n console.log(chalk.gray(' lean-spec init --example <name>'));\n console.log(chalk.gray(' lean-spec init --example dark-theme'));\n console.log('');\n}\n\n/**\n * Scaffold an example project\n */\nasync function scaffoldExample(exampleName: string, customName?: string): Promise<void> {\n // If no example name provided, show interactive selection\n if (!exampleName) {\n exampleName = await selectExample();\n }\n \n // Validate example exists\n if (!exampleExists(exampleName)) {\n console.error(chalk.red(`Error: Example \"${exampleName}\" not found.`));\n console.log('');\n console.log('Available examples:');\n getExamplesList().forEach(ex => {\n console.log(` - ${ex.name}`);\n });\n console.log('');\n console.log('Use: lean-spec init --list');\n process.exit(1);\n }\n \n const example = getExample(exampleName)!;\n const targetDirName = customName || exampleName;\n const targetPath = path.join(process.cwd(), targetDirName);\n \n // Check if directory already exists and is not empty\n try {\n const files = await fs.readdir(targetPath);\n const nonGitFiles = files.filter(f => f !== '.git');\n if (nonGitFiles.length > 0) {\n console.error(chalk.red(`Error: Directory \"${targetDirName}\" already exists and is not empty.`));\n console.log(chalk.gray('Choose a different name with --name option.'));\n process.exit(1);\n }\n } catch {\n // Directory doesn't exist, that's fine\n }\n \n console.log('');\n console.log(chalk.green(`Setting up example: ${example.title}`));\n console.log(chalk.gray(example.description));\n console.log('');\n \n // Create target directory\n await fs.mkdir(targetPath, { recursive: true });\n console.log(chalk.green(`✓ Created directory: ${targetDirName}/`));\n \n // Copy example template\n const examplePath = path.join(EXAMPLES_DIR, exampleName);\n await copyDirectoryRecursive(examplePath, targetPath);\n console.log(chalk.green('✓ Copied example project'));\n \n // Initialize LeanSpec in the new directory\n const originalCwd = process.cwd();\n try {\n process.chdir(targetPath);\n console.log(chalk.gray('Initializing LeanSpec...'));\n await initProject(true); // Use -y flag for defaults (standard template)\n console.log(chalk.green('✓ Initialized LeanSpec'));\n } catch (error) {\n console.error(chalk.red('Error initializing LeanSpec:'), error);\n process.exit(1);\n } finally {\n process.chdir(originalCwd);\n }\n \n // Detect package manager\n const packageManager = await detectPackageManager();\n \n // Install dependencies\n console.log(chalk.gray(`Installing dependencies with ${packageManager}...`));\n try {\n const { execSync } = await import('node:child_process');\n execSync(`${packageManager} install`, { \n cwd: targetPath, \n stdio: 'inherit' \n });\n console.log(chalk.green('✓ Installed dependencies'));\n } catch (error) {\n console.log(chalk.yellow('⚠ Failed to install dependencies automatically'));\n console.log(chalk.gray(` Run: cd ${targetDirName} && ${packageManager} install`));\n }\n \n // Show next steps\n console.log('');\n console.log(chalk.green('✓ Example project ready!'));\n console.log('');\n console.log(chalk.gray('Created:'));\n console.log(chalk.gray(` - Application code (${example.tech.join(', ')})`));\n console.log(chalk.gray(' - LeanSpec files (AGENTS.md, .lean-spec/, specs/)'));\n console.log('');\n console.log('Next steps:');\n console.log(chalk.cyan(` 1. cd ${targetDirName}`));\n console.log(chalk.cyan(' 2. Open this project in your editor'));\n console.log(chalk.cyan(` 3. Follow the tutorial: ${example.tutorialUrl}`));\n console.log(chalk.cyan(` 4. Ask your AI: \"Help me with this tutorial using LeanSpec\"`));\n console.log('');\n}\n\n/**\n * Interactive example selection\n */\nasync function selectExample(): Promise<string> {\n const examples = getExamplesList();\n \n const choice = await select({\n message: 'Select an example project:',\n choices: examples.map(ex => {\n const difficultyLabel = \n ex.difficulty === 'beginner' ? '★☆☆' :\n ex.difficulty === 'intermediate' ? '★★☆' :\n '★★★';\n \n return {\n name: `${ex.title} (${difficultyLabel})`,\n value: ex.name,\n description: `${ex.description} • ${ex.tech.join(', ')}`,\n };\n }),\n });\n \n return choice;\n}\n\n/**\n * Copy directory recursively\n */\nasync function copyDirectoryRecursive(src: string, dest: string): Promise<void> {\n const entries = await fs.readdir(src, { withFileTypes: true });\n \n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n \n if (entry.isDirectory()) {\n await fs.mkdir(destPath, { recursive: true });\n await copyDirectoryRecursive(srcPath, destPath);\n } else {\n await fs.copyFile(srcPath, destPath);\n }\n }\n}\n\n/**\n * Detect package manager (pnpm > yarn > npm)\n */\nasync function detectPackageManager(): Promise<string> {\n const cwd = process.cwd();\n \n // Check for lockfiles in parent directory\n try {\n await fs.access(path.join(cwd, '..', 'pnpm-lock.yaml'));\n return 'pnpm';\n } catch {}\n \n try {\n await fs.access(path.join(cwd, '..', 'yarn.lock'));\n return 'yarn';\n } catch {}\n \n // Default to npm\n return 'npm';\n}\n\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport { getSpec, loadSubFiles } from '../spec-loader.js';\nimport { resolveSpecPath } from '../utils/path-helpers.js';\nimport { loadConfig } from '../config.js';\nimport { autoCheckIfEnabled } from './check.js';\nimport { sanitizeUserInput } from '../utils/ui.js';\nimport { countTokens } from '@leanspec/core';\n\nexport interface FilesOptions {\n type?: 'docs' | 'assets';\n tree?: boolean;\n json?: boolean;\n}\n\nexport function filesCommand(): Command;\nexport function filesCommand(specPath: string, options?: FilesOptions): Promise<void>;\nexport function filesCommand(specPath?: string, options: FilesOptions = {}): Command | Promise<void> {\n if (typeof specPath === 'string') {\n return showFiles(specPath, options);\n }\n\n return new Command('files')\n .description('List files in a spec')\n .argument('<spec>', 'Spec to list files for')\n .option('--type <type>', 'Filter by type: docs, assets')\n .option('--tree', 'Show tree structure')\n .option('--json', 'Output as JSON')\n .action(async (target: string, opts: FilesOptions) => {\n await showFiles(target, opts);\n });\n}\n\nexport async function showFiles(\n specPath: string,\n options: FilesOptions = {}\n): Promise<void> {\n // Auto-check for conflicts before display\n await autoCheckIfEnabled();\n \n const config = await loadConfig();\n const cwd = process.cwd();\n const specsDir = path.join(cwd, config.specsDir);\n\n // Resolve spec path\n const resolvedPath = await resolveSpecPath(specPath, cwd, specsDir);\n if (!resolvedPath) {\n throw new Error(`Spec not found: ${sanitizeUserInput(specPath)}. Try using the full path or spec name (e.g., 001-my-spec)`);\n }\n\n // Load spec info\n const spec = await getSpec(resolvedPath);\n if (!spec) {\n throw new Error(`Could not load spec: ${sanitizeUserInput(specPath)}`);\n }\n\n // Load sub-files\n const subFiles = await loadSubFiles(spec.fullPath);\n\n // JSON output\n if (options.json) {\n const readmeStat = await fs.stat(spec.filePath);\n const readmeContent = await fs.readFile(spec.filePath, 'utf-8');\n const readmeTokens = await countTokens({ content: readmeContent });\n \n const jsonOutput = {\n spec: spec.name,\n path: spec.fullPath,\n files: [\n {\n name: 'README.md',\n type: 'required',\n size: readmeStat.size,\n tokens: readmeTokens.total,\n },\n ...subFiles.map(f => ({\n name: f.name,\n type: f.type,\n size: f.size,\n })),\n ],\n total: subFiles.length + 1,\n };\n console.log(JSON.stringify(jsonOutput, null, 2));\n return;\n }\n\n console.log('');\n console.log(chalk.cyan(`📄 Files in ${sanitizeUserInput(spec.name)}`));\n console.log('');\n\n // Show README.md (required)\n console.log(chalk.green('Required:'));\n const readmeStat = await fs.stat(spec.filePath);\n const readmeSize = formatSize(readmeStat.size);\n const readmeContent = await fs.readFile(spec.filePath, 'utf-8');\n const readmeTokens = await countTokens({ content: readmeContent });\n console.log(chalk.green(` ✓ README.md (${readmeSize}, ~${readmeTokens.total.toLocaleString()} tokens) Main spec`));\n console.log('');\n\n // Filter by type if requested\n let filteredFiles = subFiles;\n if (options.type === 'docs') {\n filteredFiles = subFiles.filter((f) => f.type === 'document');\n } else if (options.type === 'assets') {\n filteredFiles = subFiles.filter((f) => f.type === 'asset');\n }\n\n if (filteredFiles.length === 0) {\n console.log(chalk.gray('No additional files'));\n console.log('');\n return;\n }\n\n // Group by type\n const documents = filteredFiles.filter((f) => f.type === 'document');\n const assets = filteredFiles.filter((f) => f.type === 'asset');\n\n if (documents.length > 0 && (!options.type || options.type === 'docs')) {\n console.log(chalk.cyan('Documents:'));\n for (const file of documents) {\n const size = formatSize(file.size);\n // Count tokens for document files\n const content = await fs.readFile(file.path, 'utf-8');\n const tokenCount = await countTokens({ content });\n console.log(chalk.cyan(` ✓ ${sanitizeUserInput(file.name).padEnd(20)} (${size}, ~${tokenCount.total.toLocaleString()} tokens)`));\n }\n console.log('');\n }\n\n if (assets.length > 0 && (!options.type || options.type === 'assets')) {\n console.log(chalk.yellow('Assets:'));\n for (const file of assets) {\n const size = formatSize(file.size);\n console.log(chalk.yellow(` ✓ ${sanitizeUserInput(file.name).padEnd(20)} (${size})`));\n }\n console.log('');\n }\n\n // Show totals\n const totalFiles = filteredFiles.length + 1; // +1 for README.md\n const totalSize = formatSize(\n readmeStat.size + filteredFiles.reduce((sum, f) => sum + f.size, 0)\n );\n console.log(chalk.gray(`Total: ${totalFiles} files, ${totalSize}`));\n console.log('');\n}\n\nfunction formatSize(bytes: number): string {\n if (bytes < 1024) {\n return `${bytes} B`;\n } else if (bytes < 1024 * 1024) {\n return `${(bytes / 1024).toFixed(1)} KB`;\n } else {\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\n }\n}\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { getExamplesList } from '../utils/examples.js';\n\n/**\n * Examples command - list available example projects\n */\nexport function examplesCommand(): Command {\n return new Command('examples')\n .description('List available example projects for tutorials')\n .action(async () => {\n await listExamples();\n });\n}\n\nasync function listExamples(): Promise<void> {\n const examples = getExamplesList();\n \n console.log('');\n console.log(chalk.bold('LeanSpec Example Projects'));\n console.log('');\n console.log('Scaffold complete example projects to follow tutorials:');\n console.log('');\n \n for (const example of examples) {\n const difficultyColor = \n example.difficulty === 'beginner' ? chalk.green :\n example.difficulty === 'intermediate' ? chalk.yellow :\n chalk.red;\n \n const difficultyStars = \n example.difficulty === 'beginner' ? '★☆☆' :\n example.difficulty === 'intermediate' ? '★★☆' :\n '★★★';\n \n console.log(chalk.cyan.bold(` ${example.title}`));\n console.log(` ${chalk.gray(example.name)}`);\n console.log(` ${example.description}`);\n console.log(` ${difficultyColor(difficultyStars + ' ' + example.difficulty)} • ${example.tech.join(', ')} • ~${example.lines} lines`);\n console.log(` ${chalk.gray('Tutorial:')} ${example.tutorial}`);\n console.log(` ${chalk.gray(example.tutorialUrl)}`);\n console.log('');\n }\n \n console.log(chalk.bold('Usage:'));\n console.log('');\n console.log(' # Scaffold an example');\n console.log(chalk.cyan(' lean-spec init --example <name>'));\n console.log('');\n console.log(' # Interactive selection');\n console.log(chalk.cyan(' lean-spec init --example'));\n console.log('');\n console.log(' # Custom directory name');\n console.log(chalk.cyan(' lean-spec init --example dark-theme --name my-demo'));\n console.log('');\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport { loadConfig } from '../config.js';\n\nexport interface MigrationOptions {\n inputPath: string;\n aiProvider?: 'copilot' | 'claude' | 'gemini';\n auto?: boolean;\n dryRun?: boolean;\n batchSize?: number;\n skipValidation?: boolean;\n backfill?: boolean;\n}\n\nexport interface DocumentInfo {\n path: string;\n name: string;\n size: number;\n format?: 'spec-kit' | 'openspec' | 'adr' | 'generic';\n}\n\nexport type SourceFormat = 'spec-kit' | 'openspec' | 'generic';\n\nexport function migrateCommand(): Command;\nexport function migrateCommand(inputPath: string, options?: Partial<MigrationOptions>): Promise<void>;\nexport function migrateCommand(inputPath?: string, options: Partial<MigrationOptions> = {}): Command | Promise<void> {\n if (typeof inputPath === 'string') {\n return migrateSpecs(inputPath, options);\n }\n\n return new Command('migrate')\n .description('Migrate specs from other SDD tools (OpenSpec, spec-kit, etc.)')\n .argument('<input-path>', 'Path to directory containing specs to migrate')\n .option('--auto', 'Automatic migration: detect format, restructure, and backfill in one shot')\n .option('--with <provider>', 'AI-assisted migration (copilot, claude, gemini)')\n .option('--dry-run', 'Preview without making changes')\n .option('--batch-size <n>', 'Process N docs at a time', parseInt)\n .option('--skip-validation', \"Don't validate after migration\")\n .option('--backfill', 'Auto-run backfill after migration')\n .action(async (target: string, opts: {\n auto?: boolean;\n with?: string;\n dryRun?: boolean;\n batchSize?: number;\n skipValidation?: boolean;\n backfill?: boolean;\n }) => {\n if (opts.with && !['copilot', 'claude', 'gemini'].includes(opts.with)) {\n console.error('\\x1b[31m❌ Error:\\x1b[0m Invalid AI provider. Use: copilot, claude, or gemini');\n process.exit(1);\n }\n await migrateSpecs(target, {\n auto: opts.auto,\n aiProvider: opts.with as 'copilot' | 'claude' | 'gemini' | undefined,\n dryRun: opts.dryRun,\n batchSize: opts.batchSize,\n skipValidation: opts.skipValidation,\n backfill: opts.backfill,\n });\n });\n}\n\n/**\n * Main migration command - generates instructions for migrating specs from other tools\n */\nexport async function migrateSpecs(inputPath: string, options: Partial<MigrationOptions> = {}): Promise<void> {\n const config = await loadConfig();\n \n // Validate input path exists\n try {\n const stats = await fs.stat(inputPath);\n if (!stats.isDirectory()) {\n console.error('\\x1b[31m❌ Error:\\x1b[0m Input path must be a directory');\n process.exit(1);\n }\n } catch (error) {\n console.error(`\\x1b[31m❌ Error:\\x1b[0m Path not found: ${inputPath}`);\n process.exit(1);\n }\n \n // Scan for documents\n console.log(`\\x1b[36mScanning:\\x1b[0m ${inputPath}\\n`);\n const documents = await scanDocuments(inputPath);\n \n if (documents.length === 0) {\n console.error(`\\x1b[31m❌ Error:\\x1b[0m No documents found in ${inputPath}`);\n console.error(' Check path and try again');\n process.exit(1);\n }\n \n console.log(`\\x1b[32m✓\\x1b[0m Found ${documents.length} document${documents.length === 1 ? '' : 's'}\\n`);\n \n // Detect source format\n const format = await detectSourceFormat(inputPath, documents);\n console.log(`\\x1b[36mDetected format:\\x1b[0m ${format}\\n`);\n \n // Auto mode: one-shot migration\n if (options.auto) {\n await migrateAuto(inputPath, documents, format, config, options);\n return;\n }\n \n // If AI provider specified, verify and execute\n if (options.aiProvider) {\n await migrateWithAI(inputPath, documents, options as MigrationOptions);\n } else {\n // Default: Output manual migration instructions\n await outputManualInstructions(inputPath, documents, config, format);\n }\n}\n\n/**\n * Scan directory for markdown documents (format-agnostic)\n */\nexport async function scanDocuments(dirPath: string): Promise<DocumentInfo[]> {\n const documents: DocumentInfo[] = [];\n \n async function scanRecursive(currentPath: string): Promise<void> {\n const entries = await fs.readdir(currentPath, { withFileTypes: true });\n \n for (const entry of entries) {\n const fullPath = path.join(currentPath, entry.name);\n \n if (entry.isDirectory()) {\n // Skip node_modules, .git, etc.\n if (!entry.name.startsWith('.') && entry.name !== 'node_modules') {\n await scanRecursive(fullPath);\n }\n } else if (entry.isFile()) {\n // Look for markdown files\n if (entry.name.endsWith('.md') || entry.name.endsWith('.markdown')) {\n const stats = await fs.stat(fullPath);\n documents.push({\n path: fullPath,\n name: entry.name,\n size: stats.size,\n });\n }\n }\n }\n }\n \n await scanRecursive(dirPath);\n return documents;\n}\n\n/**\n * Detect source format based on directory structure and file patterns\n */\nexport async function detectSourceFormat(inputPath: string, documents: DocumentInfo[]): Promise<SourceFormat> {\n // Check for spec-kit pattern: .specify/specs/ with spec.md files\n const hasSpecKit = documents.some(d => \n d.path.includes('.specify') || d.name === 'spec.md'\n );\n if (hasSpecKit) {\n return 'spec-kit';\n }\n \n // Check for OpenSpec pattern: openspec/ directory with specs/ and changes/\n const hasOpenSpec = documents.some(d => d.path.includes('openspec/'));\n if (hasOpenSpec) {\n return 'openspec';\n }\n \n // Default to generic markdown\n return 'generic';\n}\n\n/**\n * Auto migration - one-shot migration with format detection\n */\nasync function migrateAuto(\n inputPath: string,\n documents: DocumentInfo[],\n format: SourceFormat,\n config: any,\n options: Partial<MigrationOptions>\n): Promise<void> {\n const specsDir = path.join(process.cwd(), config.specsDir || 'specs');\n const startTime = Date.now();\n \n console.log('═'.repeat(70));\n console.log('\\x1b[1m\\x1b[36m🚀 Auto Migration\\x1b[0m');\n console.log('═'.repeat(70));\n console.log();\n \n if (options.dryRun) {\n console.log('\\x1b[33m⚠️ DRY RUN - No changes will be made\\x1b[0m\\n');\n }\n \n // Ensure specs directory exists\n if (!options.dryRun) {\n await fs.mkdir(specsDir, { recursive: true });\n }\n \n let migratedCount = 0;\n let skippedCount = 0;\n \n // Get existing spec numbers for sequencing\n let nextSeq = 1;\n try {\n const existingSpecs = await fs.readdir(specsDir);\n const seqNumbers = existingSpecs\n .map(name => {\n const match = name.match(/^(\\d+)-/);\n return match ? parseInt(match[1], 10) : 0;\n })\n .filter(n => n > 0);\n if (seqNumbers.length > 0) {\n nextSeq = Math.max(...seqNumbers) + 1;\n }\n } catch {\n // specs dir doesn't exist yet\n }\n \n // Batch operations based on format\n if (format === 'spec-kit') {\n // spec-kit: Folders already structured, just rename spec.md -> README.md\n console.log('\\x1b[36mMigrating spec-kit format...\\x1b[0m\\n');\n \n // Find all spec.md files and their parent directories\n const specMdFiles = documents.filter(d => d.name === 'spec.md');\n \n for (const doc of specMdFiles) {\n const sourceDir = path.dirname(doc.path);\n const dirName = path.basename(sourceDir);\n \n // Check if already has sequence number\n const hasSeq = /^\\d{3}-/.test(dirName);\n const targetDirName = hasSeq ? dirName : `${String(nextSeq).padStart(3, '0')}-${dirName}`;\n const targetDir = path.join(specsDir, targetDirName);\n \n if (!options.dryRun) {\n // Copy entire directory\n await copyDirectory(sourceDir, targetDir);\n \n // Rename spec.md to README.md\n const oldPath = path.join(targetDir, 'spec.md');\n const newPath = path.join(targetDir, 'README.md');\n try {\n await fs.rename(oldPath, newPath);\n } catch {\n // spec.md might not exist if already README.md\n }\n }\n \n console.log(` \\x1b[32m✓\\x1b[0m ${dirName} → ${targetDirName}/`);\n migratedCount++;\n if (!hasSeq) nextSeq++;\n }\n } else if (format === 'openspec') {\n // OpenSpec: Merge specs/ and changes/archive/, restructure\n console.log('\\x1b[36mMigrating OpenSpec format...\\x1b[0m\\n');\n \n // Group documents by their containing folder\n const folders = new Map<string, DocumentInfo[]>();\n for (const doc of documents) {\n const parentDir = path.dirname(doc.path);\n const folderName = path.basename(parentDir);\n if (!folders.has(folderName)) {\n folders.set(folderName, []);\n }\n folders.get(folderName)!.push(doc);\n }\n \n for (const [folderName, docs] of folders) {\n // Skip if it's a container folder\n if (['specs', 'archive', 'changes', 'openspec'].includes(folderName)) {\n continue;\n }\n \n const targetDirName = `${String(nextSeq).padStart(3, '0')}-${folderName}`;\n const targetDir = path.join(specsDir, targetDirName);\n \n if (!options.dryRun) {\n await fs.mkdir(targetDir, { recursive: true });\n \n for (const doc of docs) {\n const targetName = doc.name === 'spec.md' ? 'README.md' : doc.name;\n const targetPath = path.join(targetDir, targetName);\n await fs.copyFile(doc.path, targetPath);\n }\n }\n \n console.log(` \\x1b[32m✓\\x1b[0m ${folderName} → ${targetDirName}/`);\n migratedCount++;\n nextSeq++;\n }\n } else {\n // Generic: Create folder for each markdown file\n console.log('\\x1b[36mMigrating generic markdown files...\\x1b[0m\\n');\n \n for (const doc of documents) {\n // Extract name from filename (remove extension and leading numbers)\n const baseName = path.basename(doc.name, path.extname(doc.name))\n .replace(/^\\d+-/, '') // Remove leading numbers\n .replace(/^[_-]+/, '') // Remove leading separators\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-') // Normalize to kebab-case\n .replace(/-+$/, ''); // Remove trailing dashes\n \n if (!baseName) {\n console.log(` \\x1b[33m⚠\\x1b[0m Skipped: ${doc.name} (invalid name)`);\n skippedCount++;\n continue;\n }\n \n const targetDirName = `${String(nextSeq).padStart(3, '0')}-${baseName}`;\n const targetDir = path.join(specsDir, targetDirName);\n const targetPath = path.join(targetDir, 'README.md');\n \n if (!options.dryRun) {\n await fs.mkdir(targetDir, { recursive: true });\n await fs.copyFile(doc.path, targetPath);\n }\n \n console.log(` \\x1b[32m✓\\x1b[0m ${doc.name} → ${targetDirName}/README.md`);\n migratedCount++;\n nextSeq++;\n }\n }\n \n console.log();\n \n // Run backfill if requested or in auto mode\n if ((options.backfill || options.auto) && !options.dryRun) {\n console.log('\\x1b[36mRunning backfill...\\x1b[0m');\n try {\n const { backfillCommand } = await import('./backfill.js');\n // Create command and run with options\n const cmd = backfillCommand();\n await cmd.parseAsync(['node', 'lean-spec', '--all', '--assignee'], { from: 'user' });\n console.log('\\x1b[32m✓\\x1b[0m Backfill complete\\n');\n } catch (error) {\n console.log('\\x1b[33m⚠\\x1b[0m Backfill failed, run manually: lean-spec backfill --all\\n');\n }\n }\n \n // Run validation if not skipped\n if (!options.skipValidation && !options.dryRun) {\n console.log('\\x1b[36mValidating...\\x1b[0m');\n try {\n const { validateSpecs } = await import('./validate.js');\n await validateSpecs({});\n console.log('\\x1b[32m✓\\x1b[0m Validation complete\\n');\n } catch {\n console.log('\\x1b[33m⚠\\x1b[0m Validation had issues, run: lean-spec validate\\n');\n }\n }\n \n const elapsed = ((Date.now() - startTime) / 1000).toFixed(1);\n \n console.log('═'.repeat(70));\n console.log(`\\x1b[32m✓ Migration complete!\\x1b[0m`);\n console.log(` Migrated: ${migratedCount} specs`);\n if (skippedCount > 0) {\n console.log(` Skipped: ${skippedCount} files`);\n }\n console.log(` Time: ${elapsed}s`);\n console.log('═'.repeat(70));\n console.log();\n console.log('Next steps:');\n console.log(' lean-spec board # View your specs');\n console.log(' lean-spec validate # Check for issues');\n}\n\n/**\n * Copy directory recursively\n */\nasync function copyDirectory(src: string, dest: string): Promise<void> {\n await fs.mkdir(dest, { recursive: true });\n const entries = await fs.readdir(src, { withFileTypes: true });\n \n for (const entry of entries) {\n const srcPath = path.join(src, entry.name);\n const destPath = path.join(dest, entry.name);\n \n if (entry.isDirectory()) {\n await copyDirectory(srcPath, destPath);\n } else {\n await fs.copyFile(srcPath, destPath);\n }\n }\n}\n\n/**\n * Output manual migration instructions (default mode)\n */\nasync function outputManualInstructions(\n inputPath: string,\n documents: DocumentInfo[],\n config: any,\n format: SourceFormat\n): Promise<void> {\n const specsDir = config.specsDir || 'specs';\n \n console.log('═'.repeat(70));\n console.log('\\x1b[1m\\x1b[36m📋 LeanSpec Migration Instructions\\x1b[0m');\n console.log('═'.repeat(70));\n console.log();\n console.log('\\x1b[1mSource Location:\\x1b[0m');\n console.log(` ${inputPath} (${documents.length} documents found)`);\n console.log(` Detected format: ${format}`);\n console.log();\n console.log('\\x1b[1m💡 Quick Option:\\x1b[0m');\n console.log(` \\x1b[36mlean-spec migrate ${inputPath} --auto\\x1b[0m`);\n console.log(' This will automatically restructure and backfill in one shot.');\n console.log();\n console.log('\\x1b[1mMigration Prompt:\\x1b[0m');\n console.log(' Copy this prompt to your AI assistant (Copilot, Claude, ChatGPT, etc.):');\n console.log();\n console.log('─'.repeat(70));\n console.log();\n console.log('You are helping migrate specification documents to LeanSpec format.');\n console.log();\n console.log(`\\x1b[1mSource:\\x1b[0m ${inputPath}`);\n console.log();\n console.log('\\x1b[1mYour Task:\\x1b[0m');\n console.log('1. Analyze the source documents to understand their format and structure');\n console.log('2. For each document, extract:');\n console.log(' - Title/name');\n console.log(' - Status (map to: planned, in-progress, complete, archived)');\n console.log(' - Creation date');\n console.log(' - Priority (if present)');\n console.log(' - Main content sections');\n console.log(' - Relationships to other documents');\n console.log();\n console.log('3. Migrate each document by running these commands:');\n console.log();\n console.log(' # Create spec');\n console.log(' lean-spec create <name>');\n console.log();\n console.log(' # Set metadata (NEVER edit frontmatter manually)');\n console.log(' lean-spec update <name> --status <status>');\n console.log(' lean-spec update <name> --priority <priority>');\n console.log(' lean-spec update <name> --tags <tag1,tag2>');\n console.log();\n console.log(' # Edit content with your preferred tool');\n console.log(' # Map original sections to LeanSpec structure:');\n console.log(' # - Overview: Problem statement and context');\n console.log(' # - Design: Technical approach and decisions');\n console.log(' # - Plan: Implementation steps (if applicable)');\n console.log(' # - Test: Validation criteria (if applicable)');\n console.log(' # - Notes: Additional context, trade-offs, alternatives');\n console.log();\n console.log('4. After migration, run:');\n console.log();\n console.log(' lean-spec validate # Check for issues');\n console.log(' lean-spec board # Verify migration');\n console.log();\n console.log('\\x1b[1mImportant Rules:\\x1b[0m');\n console.log('- Preserve decision rationale and context');\n console.log('- Map status appropriately to LeanSpec states');\n console.log('- Link related specs using `related` field (manual frontmatter edit)');\n console.log('- Follow LeanSpec first principles: clarity over completeness');\n console.log('- Keep specs under 400 lines (split if needed)');\n console.log();\n console.log('─'.repeat(70));\n console.log();\n console.log('\\x1b[36mℹ\\x1b[0m \\x1b[1mTip:\\x1b[0m For AI-assisted migration, use:');\n console.log(' \\x1b[90mlean-spec migrate <path> --with copilot\\x1b[0m');\n console.log();\n}\n\n/**\n * AI-assisted migration (when --with flag specified)\n */\nasync function migrateWithAI(\n inputPath: string,\n documents: DocumentInfo[],\n options: MigrationOptions\n): Promise<void> {\n const provider = options.aiProvider!;\n \n console.log(`\\x1b[36m🤖 AI-Assisted Migration:\\x1b[0m ${provider}\\n`);\n \n // Verify AI CLI tool\n const tool = await verifyAITool(provider);\n \n if (!tool.installed) {\n console.error(`\\x1b[31m❌ ${tool.name} CLI not found\\x1b[0m`);\n console.error(` Install: ${tool.installCmd}`);\n console.error(' Or run without --with flag for manual instructions');\n process.exit(1);\n }\n \n if (!tool.compatible) {\n console.error(`\\x1b[31m❌ ${tool.name} version ${tool.version} too old\\x1b[0m`);\n console.error(` Required: >=${tool.minVersion}`);\n console.error(` Update: ${tool.updateCmd}`);\n process.exit(1);\n }\n \n console.log(`\\x1b[32m✓\\x1b[0m ${tool.name} CLI verified (v${tool.version})\\n`);\n \n // AI-assisted mode is a placeholder for future implementation\n console.log('\\x1b[33m⚠ AI-assisted migration is not yet fully implemented\\x1b[0m');\n console.log(' This feature will automatically execute migration via AI CLI tools.');\n console.log();\n console.log(' For now, use manual mode (without --with flag) to get migration instructions.');\n console.log();\n}\n\n/**\n * AI CLI tool definitions\n */\ninterface AICliTool {\n name: string;\n cliCommand: string;\n installCmd: string;\n updateCmd: string;\n versionCmd: string;\n minVersion: string;\n installed: boolean;\n version?: string;\n compatible: boolean;\n}\n\n/**\n * Verify AI CLI tool is installed and compatible\n */\nasync function verifyAITool(provider: 'copilot' | 'claude' | 'gemini'): Promise<AICliTool> {\n const tools: Record<string, Omit<AICliTool, 'installed' | 'version' | 'compatible'>> = {\n copilot: {\n name: 'GitHub Copilot CLI',\n cliCommand: 'github-copilot-cli',\n installCmd: 'npm install -g @githubnext/github-copilot-cli',\n updateCmd: 'npm update -g @githubnext/github-copilot-cli',\n versionCmd: 'github-copilot-cli --version',\n minVersion: '0.1.0',\n },\n claude: {\n name: 'Claude CLI',\n cliCommand: 'claude',\n installCmd: 'pip install claude-cli',\n updateCmd: 'pip install --upgrade claude-cli',\n versionCmd: 'claude --version',\n minVersion: '1.0.0',\n },\n gemini: {\n name: 'Gemini CLI',\n cliCommand: 'gemini-cli',\n installCmd: 'npm install -g @google/gemini-cli',\n updateCmd: 'npm update -g @google/gemini-cli',\n versionCmd: 'gemini-cli --version',\n minVersion: '1.0.0',\n },\n };\n \n const toolDef = tools[provider];\n \n // Check if installed\n let installed = false;\n let version: string | undefined;\n \n try {\n const { execSync } = await import('node:child_process');\n // Check if command exists\n execSync(`which ${toolDef.cliCommand}`, { stdio: 'ignore' });\n installed = true;\n \n // Get version\n try {\n const versionOutput = execSync(toolDef.versionCmd, { \n encoding: 'utf-8',\n stdio: ['ignore', 'pipe', 'ignore']\n });\n const versionMatch = versionOutput.match(/(\\d+\\.\\d+\\.\\d+)/);\n if (versionMatch) {\n version = versionMatch[1];\n }\n } catch {\n // Version check failed, but tool is installed\n version = 'unknown';\n }\n } catch {\n // Command not found\n installed = false;\n }\n \n // Check compatibility\n const compatible = installed && (version === 'unknown' || (version !== undefined && satisfiesVersion(version, toolDef.minVersion)));\n \n return {\n ...toolDef,\n installed,\n version,\n compatible,\n };\n}\n\n/**\n * Simple semver comparison\n */\nfunction satisfiesVersion(version: string, minVersion: string): boolean {\n const vParts = version.split('.').map(Number);\n const minParts = minVersion.split('.').map(Number);\n \n for (let i = 0; i < 3; i++) {\n const v = vParts[i] || 0;\n const min = minParts[i] || 0;\n \n if (v > min) return true;\n if (v < min) return false;\n }\n \n return true; // equal\n}\n","import dayjs from 'dayjs';\nimport type { SpecInfo } from '../spec-loader.js';\n\nexport interface CompletionMetrics {\n score: number; // 0-100 (simple completion rate: complete/total * 100)\n totalSpecs: number;\n activeSpecs: number;\n completeSpecs: number;\n criticalIssues: string[];\n warnings: string[];\n}\n\n/**\n * Check if a spec is critical and overdue\n */\nfunction isCriticalOverdue(spec: SpecInfo): boolean {\n if (spec.frontmatter.status === 'complete' || spec.frontmatter.status === 'archived') {\n return false;\n }\n \n if (!spec.frontmatter.due) {\n return false;\n }\n \n const isOverdue = dayjs(spec.frontmatter.due).isBefore(dayjs(), 'day');\n const isCritical = spec.frontmatter.priority === 'critical' || spec.frontmatter.priority === 'high';\n \n return isOverdue && isCritical;\n}\n\n/**\n * Check if a spec has been in progress for too long (> 7 days)\n */\nfunction isLongRunning(spec: SpecInfo): boolean {\n if (spec.frontmatter.status !== 'in-progress') {\n return false;\n }\n \n const updatedAt = spec.frontmatter.updated || spec.frontmatter.updated_at || spec.frontmatter.created || spec.frontmatter.created_at;\n \n if (!updatedAt) {\n return false;\n }\n \n const daysSinceUpdate = dayjs().diff(dayjs(updatedAt), 'day');\n return daysSinceUpdate > 7;\n}\n\n/**\n * Calculate completion metrics for a set of specs\n * Score is simple completion rate: (complete / total) * 100\n */\nexport function calculateCompletion(specs: SpecInfo[]): CompletionMetrics {\n const criticalIssues: string[] = [];\n const warnings: string[] = [];\n \n // Filter out archived specs (by path or status)\n // Specs in archived/ folder may have status: complete, so check path too\n const activeAndCompleteSpecs = specs.filter(s => \n s.frontmatter.status !== 'archived' && \n !s.path.startsWith('archived/')\n );\n \n for (const spec of activeAndCompleteSpecs) {\n // Detect critical issues\n if (isCriticalOverdue(spec)) {\n criticalIssues.push(spec.path);\n }\n \n // Detect warnings (long-running WIP)\n if (isLongRunning(spec)) {\n warnings.push(spec.path);\n }\n }\n \n // Count active and complete specs (excluding archived by path and status)\n const activeSpecs = specs.filter(\n s => (s.frontmatter.status === 'planned' || s.frontmatter.status === 'in-progress') &&\n !s.path.startsWith('archived/')\n );\n const completeSpecs = specs.filter(s => \n s.frontmatter.status === 'complete' && \n !s.path.startsWith('archived/')\n );\n \n // Calculate simple completion rate (avoid division by zero)\n const totalSpecs = activeAndCompleteSpecs.length;\n const score = totalSpecs > 0 ? Math.round((completeSpecs.length / totalSpecs) * 100) : 0;\n \n return {\n score,\n totalSpecs,\n activeSpecs: activeSpecs.length,\n completeSpecs: completeSpecs.length,\n criticalIssues,\n warnings,\n };\n}\n\n/**\n * Get a completion status indicator based on score\n */\nexport function getCompletionStatus(score: number): { emoji: string; label: string; color: string } {\n if (score >= 70) {\n return { emoji: '✓', label: 'Good', color: 'green' };\n } else if (score >= 40) {\n return { emoji: '⚠', label: 'Fair', color: 'yellow' };\n } else {\n return { emoji: '✗', label: 'Needs Attention', color: 'red' };\n }\n}\n","import dayjs from 'dayjs';\nimport type { SpecInfo } from '../spec-loader.js';\n\n/**\n * Velocity metrics for measuring SDD effectiveness\n */\nexport interface VelocityMetrics {\n cycleTime: {\n average: number; // Average days from created to completed\n median: number;\n p90: number; // 90th percentile\n };\n leadTime: {\n plannedToInProgress: number; // Average days in planned\n inProgressToComplete: number; // Average days in progress\n };\n throughput: {\n perWeek: number;\n perMonth: number;\n trend: 'up' | 'down' | 'stable';\n };\n wip: {\n current: number; // Current work in progress\n average: number; // Average WIP over time\n };\n}\n\n/**\n * Calculate cycle time (created → completed) in days\n */\nexport function calculateCycleTime(spec: SpecInfo): number | null {\n if (spec.frontmatter.status !== 'complete' && spec.frontmatter.status !== 'archived') {\n return null;\n }\n\n const createdAt = spec.frontmatter.created_at || spec.frontmatter.created;\n const completedAt = spec.frontmatter.completed_at || spec.frontmatter.completed;\n\n if (!createdAt || !completedAt) {\n return null;\n }\n\n const created = dayjs(createdAt);\n const completed = dayjs(completedAt);\n\n return completed.diff(created, 'day', true);\n}\n\n/**\n * Calculate lead time for a specific stage\n */\nexport function calculateLeadTime(\n spec: SpecInfo,\n fromStatus: string,\n toStatus: string\n): number | null {\n const transitions = spec.frontmatter.transitions;\n if (!transitions || !Array.isArray(transitions)) {\n return null;\n }\n\n const fromTransition = transitions.find((t) => t.status === fromStatus);\n const toTransition = transitions.find((t) => t.status === toStatus);\n\n if (!fromTransition || !toTransition) {\n return null;\n }\n\n const from = dayjs(fromTransition.at);\n const to = dayjs(toTransition.at);\n\n return to.diff(from, 'day', true);\n}\n\n/**\n * Calculate throughput (completed specs in a time period)\n */\nexport function calculateThroughput(specs: SpecInfo[], days: number): number {\n const cutoff = dayjs().subtract(days, 'day');\n\n return specs.filter((s) => {\n if (s.frontmatter.status !== 'complete' && s.frontmatter.status !== 'archived') {\n return false;\n }\n\n const completedAt = s.frontmatter.completed_at || s.frontmatter.completed;\n if (!completedAt) {\n return false;\n }\n\n return dayjs(completedAt).isAfter(cutoff);\n }).length;\n}\n\n/**\n * Calculate work in progress at a specific point in time\n */\nexport function calculateWIP(specs: SpecInfo[], date: dayjs.Dayjs = dayjs()): number {\n return specs.filter((s) => {\n const createdAt = s.frontmatter.created_at || s.frontmatter.created;\n const created = dayjs(createdAt);\n\n // Must be created before the target date\n if (created.isAfter(date)) {\n return false;\n }\n\n // Check if completed after the target date (or not completed)\n const completedAt = s.frontmatter.completed_at || s.frontmatter.completed;\n if (completedAt) {\n const completed = dayjs(completedAt);\n return completed.isAfter(date);\n }\n\n // Not completed yet - check if still active\n return s.frontmatter.status !== 'complete' && s.frontmatter.status !== 'archived';\n }).length;\n}\n\n/**\n * Calculate comprehensive velocity metrics\n */\nexport function calculateVelocityMetrics(specs: SpecInfo[]): VelocityMetrics {\n // Calculate cycle times for completed specs\n const cycleTimes = specs\n .map((s) => calculateCycleTime(s))\n .filter((t): t is number => t !== null)\n .sort((a, b) => a - b);\n\n const averageCycleTime = cycleTimes.length > 0\n ? cycleTimes.reduce((sum, t) => sum + t, 0) / cycleTimes.length\n : 0;\n\n const medianCycleTime = cycleTimes.length > 0\n ? cycleTimes.length % 2 === 0\n ? (cycleTimes[cycleTimes.length / 2 - 1] + cycleTimes[cycleTimes.length / 2]) / 2\n : cycleTimes[Math.floor(cycleTimes.length / 2)]\n : 0;\n\n const p90CycleTime = cycleTimes.length > 0\n ? cycleTimes[Math.min(Math.floor(cycleTimes.length * 0.9), cycleTimes.length - 1)]\n : 0;\n\n // Calculate lead times (if transition data available)\n const plannedToInProgressTimes = specs\n .map((s) => calculateLeadTime(s, 'planned', 'in-progress'))\n .filter((t): t is number => t !== null);\n\n const inProgressToCompleteTimes = specs\n .map((s) => calculateLeadTime(s, 'in-progress', 'complete'))\n .filter((t): t is number => t !== null);\n\n const avgPlannedToInProgress = plannedToInProgressTimes.length > 0\n ? plannedToInProgressTimes.reduce((sum, t) => sum + t, 0) / plannedToInProgressTimes.length\n : 0;\n\n const avgInProgressToComplete = inProgressToCompleteTimes.length > 0\n ? inProgressToCompleteTimes.reduce((sum, t) => sum + t, 0) / inProgressToCompleteTimes.length\n : 0;\n\n // Calculate throughput\n const throughputWeek = calculateThroughput(specs, 7);\n const throughputMonth = calculateThroughput(specs, 30);\n \n // Calculate throughput for previous week for trend\n const prevWeekStart = dayjs().subtract(14, 'day');\n const prevWeekEnd = dayjs().subtract(7, 'day');\n const throughputPrevWeek = specs.filter((s) => {\n const completedAt = s.frontmatter.completed_at || s.frontmatter.completed;\n if (!completedAt) return false;\n const completed = dayjs(completedAt);\n return completed.isAfter(prevWeekStart) && !completed.isAfter(prevWeekEnd);\n }).length;\n\n const throughputTrend: 'up' | 'down' | 'stable' =\n throughputWeek > throughputPrevWeek ? 'up' :\n throughputWeek < throughputPrevWeek ? 'down' : 'stable';\n\n // Calculate WIP\n const currentWIP = calculateWIP(specs);\n\n // Calculate average WIP over last 30 days\n const wipSamples: number[] = [];\n for (let i = 0; i < 30; i++) {\n const sampleDate = dayjs().subtract(i, 'day');\n wipSamples.push(calculateWIP(specs, sampleDate));\n }\n const avgWIP = wipSamples.length > 0\n ? wipSamples.reduce((sum, w) => sum + w, 0) / wipSamples.length\n : 0;\n\n return {\n cycleTime: {\n average: Math.round(averageCycleTime * 10) / 10,\n median: Math.round(medianCycleTime * 10) / 10,\n p90: Math.round(p90CycleTime * 10) / 10,\n },\n leadTime: {\n plannedToInProgress: Math.round(avgPlannedToInProgress * 10) / 10,\n inProgressToComplete: Math.round(avgInProgressToComplete * 10) / 10,\n },\n throughput: {\n perWeek: throughputWeek,\n perMonth: throughputMonth,\n trend: throughputTrend,\n },\n wip: {\n current: currentWIP,\n average: Math.round(avgWIP * 10) / 10,\n },\n };\n}\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { loadAllSpecs } from '../spec-loader.js';\nimport type { SpecInfo } from '../spec-loader.js';\nimport type { SpecFilterOptions, SpecStatus, SpecPriority } from '../frontmatter.js';\nimport { withSpinner } from '../utils/ui.js';\nimport { autoCheckIfEnabled } from './check.js';\nimport { sanitizeUserInput } from '../utils/ui.js';\nimport { calculateCompletion, getCompletionStatus } from '../utils/completion.js';\nimport { calculateVelocityMetrics } from '../utils/velocity.js';\nimport { STATUS_CONFIG, PRIORITY_CONFIG } from '../utils/colors.js';\n\n/**\n * Board command - show Kanban-style board view\n */\nexport function boardCommand(): Command {\n return new Command('board')\n .description('Show Kanban-style board view with project completion summary')\n .option('--complete', 'Include complete specs (default: hidden)')\n .option('--simple', 'Hide completion summary (kanban only)')\n .option('--completion-only', 'Show only completion summary (no kanban)')\n .option('--tag <tag>', 'Filter by tag')\n .option('--assignee <name>', 'Filter by assignee')\n .option('--json', 'Output as JSON')\n .action(async (options: {\n complete?: boolean;\n simple?: boolean;\n completionOnly?: boolean;\n tag?: string;\n assignee?: string;\n json?: boolean;\n }) => {\n await showBoard(options);\n });\n}\n\nexport async function showBoard(options: {\n complete?: boolean;\n simple?: boolean;\n completionOnly?: boolean;\n tag?: string;\n assignee?: string;\n json?: boolean;\n}): Promise<void> {\n // Auto-check for conflicts before display\n await autoCheckIfEnabled();\n \n // Build filter\n const filter: SpecFilterOptions = {};\n if (options.tag) {\n filter.tags = [options.tag];\n }\n if (options.assignee) {\n filter.assignee = options.assignee;\n }\n\n // Load all specs with spinner (include archived for accurate metrics, but don't display in columns)\n const specs = await withSpinner(\n 'Loading specs...',\n () => loadAllSpecs({\n includeArchived: true,\n filter,\n })\n );\n\n if (specs.length === 0) {\n if (options.json) {\n console.log(JSON.stringify({ columns: {}, total: 0 }, null, 2));\n } else {\n console.log(chalk.dim('No specs found.'));\n }\n return;\n }\n\n // Group specs by status (we loaded archived for metrics, but don't show them in board columns)\n const columns: Record<SpecStatus, SpecInfo[]> = {\n planned: [],\n 'in-progress': [],\n complete: [],\n archived: [],\n };\n\n for (const spec of specs) {\n // Handle invalid status by treating as 'planned'\n const status = columns[spec.frontmatter.status] !== undefined \n ? spec.frontmatter.status \n : 'planned';\n \n // Only add to columns if not archived (archived specs are included in metrics but not displayed)\n if (status !== 'archived') {\n columns[status].push(spec);\n }\n }\n\n // JSON output\n if (options.json) {\n const completionMetrics = calculateCompletion(specs);\n const velocityMetrics = calculateVelocityMetrics(specs);\n \n const jsonOutput = {\n columns: {\n planned: columns.planned.map(s => ({ path: s.path, priority: s.frontmatter.priority, assignee: s.frontmatter.assignee, tags: s.frontmatter.tags })),\n 'in-progress': columns['in-progress'].map(s => ({ path: s.path, priority: s.frontmatter.priority, assignee: s.frontmatter.assignee, tags: s.frontmatter.tags })),\n complete: columns.complete.map(s => ({ path: s.path, priority: s.frontmatter.priority, assignee: s.frontmatter.assignee, tags: s.frontmatter.tags })),\n },\n summary: {\n total: completionMetrics.totalSpecs,\n active: completionMetrics.activeSpecs,\n complete: completionMetrics.completeSpecs,\n completionRate: completionMetrics.score,\n velocity: {\n avgCycleTime: velocityMetrics.cycleTime.average,\n throughputPerWeek: velocityMetrics.throughput.perWeek / 7 * 7,\n },\n },\n };\n console.log(JSON.stringify(jsonOutput, null, 2));\n return;\n }\n\n // Display header\n console.log(chalk.bold.cyan('📋 Spec Kanban Board'));\n \n // Filter info\n if (options.tag || options.assignee) {\n const filterParts: string[] = [];\n if (options.tag) filterParts.push(`tag=${options.tag}`);\n if (options.assignee) filterParts.push(`assignee=${options.assignee}`);\n console.log(chalk.dim(`Filtered by: ${filterParts.join(', ')}`));\n }\n console.log('');\n\n // Show completion summary unless --simple flag is set\n if (!options.simple) {\n const completionMetrics = calculateCompletion(specs);\n const velocityMetrics = calculateVelocityMetrics(specs);\n const completionStatus = getCompletionStatus(completionMetrics.score);\n \n // Health summary box\n const boxWidth = 62;\n const topBorder = '╔' + '═'.repeat(boxWidth - 2) + '╗';\n const bottomBorder = '╚' + '═'.repeat(boxWidth - 2) + '╝';\n \n // Helper to pad line with ANSI code awareness\n const padLine = (content: string): string => {\n const visibleLength = stripAnsi(content).length;\n const padding = boxWidth - 2 - visibleLength;\n return content + ' '.repeat(Math.max(0, padding));\n };\n \n console.log(chalk.dim(topBorder));\n \n const headerLine = chalk.bold(' Project Overview');\n console.log(chalk.dim('║') + padLine(headerLine) + chalk.dim('║'));\n \n // Completion rate percentage\n const percentageColor = completionMetrics.score >= 70 ? chalk.green : \n completionMetrics.score >= 40 ? chalk.yellow : \n chalk.red;\n \n const line1 = ` ${completionMetrics.totalSpecs} total · ${completionMetrics.activeSpecs} active · ${completionMetrics.completeSpecs} complete ${percentageColor('(' + completionMetrics.score + '%)')}`;\n console.log(chalk.dim('║') + padLine(line1) + chalk.dim('║'));\n \n // Alerts line\n if (completionMetrics.criticalIssues.length > 0 || completionMetrics.warnings.length > 0) {\n const alerts: string[] = [];\n if (completionMetrics.criticalIssues.length > 0) {\n alerts.push(`${completionMetrics.criticalIssues.length} critical overdue`);\n }\n if (completionMetrics.warnings.length > 0) {\n alerts.push(`${completionMetrics.warnings.length} specs WIP > 7 days`);\n }\n const alertLine = ` ${chalk.yellow('⚠️ ' + alerts.join(' · '))}`;\n console.log(chalk.dim('║') + padLine(alertLine) + chalk.dim('║'));\n }\n \n // Velocity line\n const velocityLine = ` ${chalk.cyan('🚀 Velocity:')} ${velocityMetrics.cycleTime.average.toFixed(1)}d avg cycle · ${(velocityMetrics.throughput.perWeek / 7 * 7).toFixed(1)}/wk throughput`;\n console.log(chalk.dim('║') + padLine(velocityLine) + chalk.dim('║'));\n \n console.log(chalk.dim(bottomBorder));\n console.log('');\n\n // If --completion-only, stop here\n if (options.completionOnly) {\n return;\n }\n } // Render columns\n renderColumn(STATUS_CONFIG.planned.label, STATUS_CONFIG.planned.emoji, columns.planned, true, STATUS_CONFIG.planned.colorFn);\n \n // Separator between status sections\n console.log(chalk.dim('━'.repeat(70)));\n console.log('');\n \n renderColumn(STATUS_CONFIG['in-progress'].label, STATUS_CONFIG['in-progress'].emoji, columns['in-progress'], true, STATUS_CONFIG['in-progress'].colorFn);\n \n // Separator between status sections\n console.log(chalk.dim('━'.repeat(70)));\n console.log('');\n \n renderColumn(STATUS_CONFIG.complete.label, STATUS_CONFIG.complete.emoji, columns.complete, options.complete || false, STATUS_CONFIG.complete.colorFn);\n}\n\nfunction renderColumn(\n title: string,\n emoji: string,\n specs: SpecInfo[],\n expanded: boolean,\n colorFn: (s: string) => string\n): void {\n // Column header\n console.log(`${emoji} ${colorFn(chalk.bold(`${title} (${specs.length})`))}`);\n console.log('');\n\n if (expanded && specs.length > 0) {\n // Group specs by priority\n const priorityGroups: Record<string, SpecInfo[]> = {\n critical: [],\n high: [],\n medium: [],\n low: [],\n none: []\n };\n\n for (const spec of specs) {\n const priority = spec.frontmatter.priority || 'none';\n priorityGroups[priority].push(spec);\n }\n\n // Render each priority group\n const priorityOrder: Array<keyof typeof priorityGroups> = ['critical', 'high', 'medium', 'low', 'none'];\n let firstGroup = true;\n\n for (const priority of priorityOrder) {\n const groupSpecs = priorityGroups[priority];\n if (groupSpecs.length === 0) continue;\n\n // Add spacing between groups\n if (!firstGroup) {\n console.log('');\n }\n firstGroup = false;\n\n // Priority group header - minimal, modern style\n const priorityLabel = priority === 'none' ? 'No Priority' : priority.charAt(0).toUpperCase() + priority.slice(1);\n const priorityEmoji = priority === 'none' ? '⚪' : PRIORITY_CONFIG[priority as SpecPriority].emoji;\n const priorityColor = priority === 'none' ? chalk.dim : PRIORITY_CONFIG[priority as SpecPriority].colorFn;\n \n console.log(` ${priorityColor(`${priorityEmoji} ${chalk.bold(priorityLabel)} ${chalk.dim(`(${groupSpecs.length})`)}`)}`);;\n\n for (const spec of groupSpecs) {\n // Build spec line with metadata\n let assigneeStr = '';\n if (spec.frontmatter.assignee) {\n assigneeStr = ' ' + chalk.cyan(`@${sanitizeUserInput(spec.frontmatter.assignee)}`);\n }\n \n let tagsStr = '';\n if (spec.frontmatter.tags?.length) {\n // Defensive check: ensure tags is an array\n const tags = Array.isArray(spec.frontmatter.tags) ? spec.frontmatter.tags : [];\n if (tags.length > 0) {\n const tagStr = tags.map(tag => `#${sanitizeUserInput(tag)}`).join(' ');\n tagsStr = ' ' + chalk.dim(chalk.magenta(tagStr));\n }\n }\n\n console.log(` ${chalk.cyan(sanitizeUserInput(spec.path))}${assigneeStr}${tagsStr}`);\n }\n }\n\n console.log('');\n } else if (!expanded && specs.length > 0) {\n console.log(` ${chalk.dim('(collapsed, use --complete to expand)')}`);\n console.log('');\n } else {\n console.log(` ${chalk.dim('(empty)')}`);\n console.log('');\n }\n}\n\n// Helper function to strip ANSI codes for accurate length calculation\nfunction stripAnsi(str: string): string {\n return str.replace(/\\u001b\\[\\d+m/g, '');\n}\n","import type { SpecInfo } from '../spec-loader.js';\nimport type { SpecStatus, SpecPriority } from '../frontmatter.js';\n\n/**\n * Count specs by status and priority\n * Shared utility to avoid duplication between analytics and dashboard\n */\nexport function countSpecsByStatusAndPriority(specs: SpecInfo[]): {\n statusCounts: Record<SpecStatus, number>;\n priorityCounts: Record<SpecPriority, number>;\n tagCounts: Record<string, number>;\n} {\n const statusCounts: Record<SpecStatus, number> = {\n planned: 0,\n 'in-progress': 0,\n complete: 0,\n archived: 0,\n };\n\n const priorityCounts: Record<SpecPriority, number> = {\n low: 0,\n medium: 0,\n high: 0,\n critical: 0,\n };\n\n const tagCounts: Record<string, number> = {};\n\n for (const spec of specs) {\n // Specs in archived/ folder should be counted as archived, regardless of frontmatter status\n const isInArchivedFolder = spec.path.startsWith('archived/');\n const status = isInArchivedFolder ? 'archived' : spec.frontmatter.status;\n \n if (status && status in statusCounts) {\n statusCounts[status]++;\n }\n\n const priority = spec.frontmatter.priority;\n if (priority && priority in priorityCounts) {\n priorityCounts[priority]++;\n }\n\n if (spec.frontmatter.tags) {\n for (const tag of spec.frontmatter.tags) {\n tagCounts[tag] = (tagCounts[tag] || 0) + 1;\n }\n }\n }\n\n return { statusCounts, priorityCounts, tagCounts };\n}\n","import dayjs from 'dayjs';\nimport type { SpecInfo } from '../spec-loader.js';\n\nexport interface Insight {\n severity: 'critical' | 'warning' | 'info';\n message: string;\n specs: string[];\n}\n\n/**\n * Generate smart insights for specs that need attention\n * Returns top 5 most important insights\n */\nexport function generateInsights(specs: SpecInfo[]): Insight[] {\n const insights: Insight[] = [];\n \n // 1. Critical overdue specs\n const criticalOverdue = specs.filter(s => \n s.frontmatter.priority === 'critical' &&\n s.frontmatter.due && \n dayjs(s.frontmatter.due).isBefore(dayjs(), 'day') &&\n s.frontmatter.status !== 'complete' &&\n s.frontmatter.status !== 'archived'\n );\n \n if (criticalOverdue.length > 0) {\n insights.push({\n severity: 'critical',\n message: `${criticalOverdue.length} critical spec${criticalOverdue.length > 1 ? 's' : ''} overdue`,\n specs: criticalOverdue.map(s => s.path),\n });\n }\n \n // 2. High priority overdue specs\n const highOverdue = specs.filter(s => \n s.frontmatter.priority === 'high' &&\n s.frontmatter.due && \n dayjs(s.frontmatter.due).isBefore(dayjs(), 'day') &&\n s.frontmatter.status !== 'complete' &&\n s.frontmatter.status !== 'archived'\n );\n \n if (highOverdue.length > 0) {\n insights.push({\n severity: 'warning',\n message: `${highOverdue.length} high priority spec${highOverdue.length > 1 ? 's' : ''} overdue`,\n specs: highOverdue.map(s => s.path),\n });\n }\n \n // 3. Long-running WIP (in-progress > 7 days)\n const longRunning = specs.filter(s => {\n if (s.frontmatter.status !== 'in-progress') {\n return false;\n }\n \n const updatedAt = s.frontmatter.updated || s.frontmatter.updated_at || s.frontmatter.created || s.frontmatter.created_at;\n \n if (!updatedAt) {\n return false;\n }\n \n const daysSinceUpdate = dayjs().diff(dayjs(updatedAt), 'day');\n return daysSinceUpdate > 7;\n });\n \n if (longRunning.length > 0) {\n insights.push({\n severity: 'warning',\n message: `${longRunning.length} spec${longRunning.length > 1 ? 's' : ''} in-progress > 7 days`,\n specs: longRunning.map(s => s.path),\n });\n }\n \n // 4. Critical specs not started\n const criticalNotStarted = specs.filter(s =>\n s.frontmatter.priority === 'critical' &&\n s.frontmatter.status === 'planned'\n );\n \n if (criticalNotStarted.length > 0) {\n insights.push({\n severity: 'warning',\n message: `${criticalNotStarted.length} critical spec${criticalNotStarted.length > 1 ? 's' : ''} not started`,\n specs: criticalNotStarted.map(s => s.path),\n });\n }\n \n // 5. High priority specs not started (if we have room)\n const highNotStarted = specs.filter(s =>\n s.frontmatter.priority === 'high' &&\n s.frontmatter.status === 'planned'\n );\n \n if (highNotStarted.length > 0 && insights.length < 5) {\n insights.push({\n severity: 'info',\n message: `${highNotStarted.length} high priority spec${highNotStarted.length > 1 ? 's' : ''} not started`,\n specs: highNotStarted.map(s => s.path),\n });\n }\n \n // Return top 5 insights\n return insights.slice(0, 5);\n}\n\n/**\n * Get detailed insight for a specific spec (with days overdue, etc.)\n */\nexport function getSpecInsightDetails(spec: SpecInfo): string | null {\n // Check if overdue\n if (spec.frontmatter.due && \n dayjs(spec.frontmatter.due).isBefore(dayjs(), 'day') &&\n spec.frontmatter.status !== 'complete' &&\n spec.frontmatter.status !== 'archived') {\n const daysOverdue = dayjs().diff(dayjs(spec.frontmatter.due), 'day');\n return `overdue by ${daysOverdue} day${daysOverdue > 1 ? 's' : ''}`;\n }\n \n // Check if long-running\n if (spec.frontmatter.status === 'in-progress') {\n const updatedAt = spec.frontmatter.updated || spec.frontmatter.updated_at || spec.frontmatter.created || spec.frontmatter.created_at;\n \n if (updatedAt) {\n const daysSinceUpdate = dayjs().diff(dayjs(updatedAt), 'day');\n if (daysSinceUpdate > 7) {\n return `in-progress for ${daysSinceUpdate} days`;\n }\n }\n }\n \n return null;\n}\n","import chalk from 'chalk';\nimport dayjs from 'dayjs';\nimport { Command } from 'commander';\nimport { loadAllSpecs } from '../spec-loader.js';\nimport type { SpecStatus, SpecPriority, SpecFilterOptions } from '../frontmatter.js';\nimport { withSpinner } from '../utils/ui.js';\nimport { autoCheckIfEnabled } from './check.js';\nimport { calculateVelocityMetrics } from '../utils/velocity.js';\nimport { countSpecsByStatusAndPriority } from '../utils/spec-stats.js';\nimport { calculateCompletion, getCompletionStatus } from '../utils/completion.js';\nimport { generateInsights, getSpecInsightDetails } from '../utils/insights.js';\n\n/**\n * Stats command - show aggregate statistics\n */\nexport function statsCommand(): Command {\n return new Command('stats')\n .description('Show aggregate statistics (default: simplified view)')\n .option('--tag <tag>', 'Filter by tag')\n .option('--assignee <name>', 'Filter by assignee')\n .option('--full', 'Show full detailed analytics (all sections)')\n .option('--timeline', 'Show only timeline section')\n .option('--velocity', 'Show only velocity section')\n .option('--json', 'Output as JSON')\n .action(async (options: {\n tag?: string;\n assignee?: string;\n full?: boolean;\n timeline?: boolean;\n velocity?: boolean;\n json?: boolean;\n }) => {\n await showStats(options);\n });\n}\n\nexport async function showStats(options: {\n tag?: string;\n assignee?: string;\n full?: boolean;\n timeline?: boolean;\n velocity?: boolean;\n json?: boolean;\n}): Promise<void> {\n // Auto-check for conflicts before stats\n await autoCheckIfEnabled();\n \n // Build filter\n const filter: SpecFilterOptions = {};\n if (options.tag) {\n filter.tags = [options.tag];\n }\n if (options.assignee) {\n filter.assignee = options.assignee;\n }\n\n // Load all specs with spinner (including archived for total count)\n const specs = await withSpinner(\n 'Loading specs...',\n () => loadAllSpecs({\n includeArchived: true,\n filter,\n })\n );\n\n if (specs.length === 0) {\n console.log('No specs found.');\n return;\n }\n\n // Determine what sections to show\n // --full shows everything (like old analytics)\n // --timeline or --velocity shows specific section\n // Default (no flags): show simplified view with insights\n const showFull = options.full || false;\n const showStats = options.full || (!options.timeline && !options.velocity);\n const showTimeline = options.timeline || options.full;\n const showVelocity = options.velocity || options.full;\n const showSimplified = !options.full && !options.timeline && !options.velocity;\n\n // Calculate all metrics upfront\n const { statusCounts, priorityCounts, tagCounts } = countSpecsByStatusAndPriority(specs);\n const velocityMetrics = calculateVelocityMetrics(specs);\n const completionMetrics = calculateCompletion(specs);\n const insights = generateInsights(specs);\n\n // JSON output\n if (options.json) {\n const data = {\n total: specs.length,\n status: statusCounts,\n priority: priorityCounts,\n tags: tagCounts,\n completion: completionMetrics,\n velocity: velocityMetrics,\n insights: insights,\n filter,\n };\n console.log(JSON.stringify(data, null, 2));\n return;\n }\n\n // Display statistics\n console.log(chalk.bold.cyan('📊 Spec Stats'));\n console.log('');\n\n // Filter info\n if (options.tag || options.assignee) {\n const filterParts: string[] = [];\n if (options.tag) filterParts.push(`tag=${options.tag}`);\n if (options.assignee) filterParts.push(`assignee=${options.assignee}`);\n console.log(chalk.dim(`Filtered by: ${filterParts.join(', ')}`));\n console.log('');\n }\n\n // ============================================================\n // SIMPLIFIED VIEW (Default)\n // ============================================================\n if (showSimplified) {\n // Overview with completion rate\n console.log(chalk.bold('📈 Overview'));\n console.log('');\n \n const completionStatus = getCompletionStatus(completionMetrics.score);\n const completionColor = completionStatus.color === 'green' ? chalk.green : \n completionStatus.color === 'yellow' ? chalk.yellow : \n chalk.red;\n \n console.log(` Total Specs ${chalk.cyan(completionMetrics.totalSpecs)}`);\n console.log(` Active (Planned+WIP) ${chalk.yellow(completionMetrics.activeSpecs)}`);\n console.log(` Complete ${chalk.green(completionMetrics.completeSpecs)}`);\n console.log(` Completion Rate ${completionColor(`${completionMetrics.score}% ${completionStatus.emoji}`)}`);\n console.log('');\n\n // Status (simplified)\n console.log(chalk.bold('📊 Status'));\n console.log('');\n \n const labelWidth = 15;\n const barWidth = 20;\n const maxStatusCount = Math.max(...Object.values(statusCounts));\n const createBar = (count: number, maxCount: number, char: string = '█') => {\n const width = Math.round((count / maxCount) * barWidth);\n const filledWidth = Math.min(width, barWidth);\n const emptyWidth = barWidth - filledWidth;\n return char.repeat(filledWidth) + chalk.dim('░').repeat(emptyWidth);\n };\n \n console.log(` 📅 ${'Planned'.padEnd(labelWidth)} ${chalk.cyan(createBar(statusCounts.planned, maxStatusCount))} ${chalk.cyan(statusCounts.planned)}`);\n console.log(` ⏳ ${'In Progress'.padEnd(labelWidth)} ${chalk.yellow(createBar(statusCounts['in-progress'], maxStatusCount))} ${chalk.yellow(statusCounts['in-progress'])}`);\n console.log(` ✅ ${'Complete'.padEnd(labelWidth)} ${chalk.green(createBar(statusCounts.complete, maxStatusCount))} ${chalk.green(statusCounts.complete)}`);\n if (statusCounts.archived > 0) {\n console.log(` 📦 ${'Archived'.padEnd(labelWidth)} ${chalk.dim(createBar(statusCounts.archived, maxStatusCount))} ${chalk.dim(statusCounts.archived)}`);\n }\n console.log('');\n\n // Priority Focus (only critical/high with issues)\n const criticalCount = priorityCounts.critical || 0;\n const highCount = priorityCounts.high || 0;\n \n if (criticalCount > 0 || highCount > 0) {\n console.log(chalk.bold('🎯 Priority Focus'));\n console.log('');\n \n if (criticalCount > 0) {\n const criticalPlanned = specs.filter(s => s.frontmatter.priority === 'critical' && s.frontmatter.status === 'planned').length;\n const criticalInProgress = specs.filter(s => s.frontmatter.priority === 'critical' && s.frontmatter.status === 'in-progress').length;\n const criticalComplete = specs.filter(s => s.frontmatter.priority === 'critical' && s.frontmatter.status === 'complete').length;\n const criticalOverdue = specs.filter(s => \n s.frontmatter.priority === 'critical' && \n s.frontmatter.due && \n dayjs(s.frontmatter.due).isBefore(dayjs(), 'day') &&\n s.frontmatter.status !== 'complete'\n ).length;\n \n const parts = [];\n if (criticalPlanned > 0) parts.push(chalk.dim(`${criticalPlanned} planned`));\n if (criticalInProgress > 0) parts.push(`${criticalInProgress} in-progress`);\n if (criticalComplete > 0) parts.push(chalk.green(`${criticalComplete} complete`));\n if (criticalOverdue > 0) parts.push(chalk.red(`${criticalOverdue} overdue!`));\n \n console.log(` 🔴 Critical ${chalk.red(criticalCount)} specs${parts.length > 0 ? ` (${parts.join(', ')})` : ''}`);\n }\n \n if (highCount > 0) {\n const highPlanned = specs.filter(s => s.frontmatter.priority === 'high' && s.frontmatter.status === 'planned').length;\n const highInProgress = specs.filter(s => s.frontmatter.priority === 'high' && s.frontmatter.status === 'in-progress').length;\n const highComplete = specs.filter(s => s.frontmatter.priority === 'high' && s.frontmatter.status === 'complete').length;\n const highOverdue = specs.filter(s => \n s.frontmatter.priority === 'high' && \n s.frontmatter.due && \n dayjs(s.frontmatter.due).isBefore(dayjs(), 'day') &&\n s.frontmatter.status !== 'complete'\n ).length;\n \n const parts = [];\n if (highPlanned > 0) parts.push(chalk.dim(`${highPlanned} planned`));\n if (highInProgress > 0) parts.push(`${highInProgress} in-progress`);\n if (highComplete > 0) parts.push(chalk.green(`${highComplete} complete`));\n if (highOverdue > 0) parts.push(chalk.yellow(`${highOverdue} overdue`));\n \n console.log(` 🟠 High ${chalk.hex('#FFA500')(highCount)} specs${parts.length > 0 ? ` (${parts.join(', ')})` : ''}`);\n }\n \n console.log('');\n }\n\n // Needs Attention (insights)\n if (insights.length > 0) {\n console.log(chalk.bold.yellow('⚠️ Needs Attention'));\n console.log('');\n \n for (const insight of insights) {\n const color = insight.severity === 'critical' ? chalk.red :\n insight.severity === 'warning' ? chalk.yellow :\n chalk.cyan;\n \n console.log(` ${color('•')} ${insight.message}`);\n \n // Show up to 3 spec examples\n for (const specPath of insight.specs.slice(0, 3)) {\n const spec = specs.find(s => s.path === specPath);\n const details = spec ? getSpecInsightDetails(spec) : null;\n console.log(` ${chalk.dim(specPath)}${details ? chalk.dim(` (${details})`) : ''}`);\n }\n \n if (insight.specs.length > 3) {\n console.log(` ${chalk.dim(`...and ${insight.specs.length - 3} more`)}`);\n }\n }\n \n console.log('');\n } else if (completionMetrics.activeSpecs === 0 && completionMetrics.completeSpecs > 0) {\n // Celebrate completion!\n console.log(chalk.bold.green('🎉 All Specs Complete!'));\n console.log('');\n console.log(` ${chalk.dim('Great work! All active specs are complete.')}`);\n console.log('');\n } else if (completionMetrics.activeSpecs > 0) {\n // Positive message\n console.log(chalk.bold.green('✨ All Clear!'));\n console.log('');\n console.log(` ${chalk.dim('No critical issues detected. Keep up the good work!')}`);\n console.log('');\n }\n\n // Velocity Summary\n console.log(chalk.bold('🚀 Velocity Summary'));\n console.log('');\n \n const cycleTimeStatus = velocityMetrics.cycleTime.average <= 7 ? chalk.green('✓') : chalk.yellow('⚠');\n const throughputTrend = velocityMetrics.throughput.trend === 'up' ? chalk.green('↑') : \n velocityMetrics.throughput.trend === 'down' ? chalk.red('↓') : \n chalk.yellow('→');\n \n console.log(` Avg Cycle Time ${chalk.cyan(velocityMetrics.cycleTime.average.toFixed(1))} days ${cycleTimeStatus}${velocityMetrics.cycleTime.average <= 7 ? chalk.dim(' (target: 7d)') : ''}`);\n console.log(` Throughput ${chalk.cyan((velocityMetrics.throughput.perWeek / 7 * 7).toFixed(1))}/week ${throughputTrend}`);\n console.log(` WIP ${chalk.yellow(velocityMetrics.wip.current)} specs`);\n console.log('');\n\n // Prompt for full view\n console.log(chalk.dim('💡 Use `lean-spec stats --full` for detailed analytics'));\n console.log(chalk.dim(' Use `lean-spec stats --velocity` for velocity breakdown'));\n console.log(chalk.dim(' Use `lean-spec stats --timeline` for activity timeline'));\n console.log('');\n \n return;\n }\n\n // ============================================================\n // FULL VIEW (--full or specific flags)\n // ============================================================\n // Common layout constants\n const labelWidth = 20;\n const barWidth = 20;\n const valueWidth = 5;\n\n // Helper to create bars\n const createBar = (count: number, maxCount: number, char: string = '━') => {\n const width = Math.round((count / maxCount) * barWidth);\n return char.repeat(width);\n };\n\n // ============================================================\n // STATS SECTION\n // ============================================================\n if (showStats) {\n // Overview\n const totalWithPriority = Object.values(priorityCounts).reduce(\n (sum, count) => sum + count,\n 0\n );\n console.log(chalk.bold('📈 Overview'));\n console.log('');\n\n console.log(\n ` ${'Metric'.padEnd(labelWidth)} ${'Value'.padStart(valueWidth)}`\n );\n console.log(\n ` ${chalk.dim('─'.repeat(labelWidth))} ${chalk.dim('─'.repeat(valueWidth))}`\n );\n console.log(\n ` ${'Total Specs'.padEnd(labelWidth)} ${chalk.green(specs.length.toString().padStart(valueWidth))}`\n );\n console.log(\n ` ${'With Priority'.padEnd(labelWidth)} ${chalk.cyan(totalWithPriority.toString().padStart(valueWidth))}`\n );\n console.log(\n ` ${'Unique Tags'.padEnd(labelWidth)} ${chalk.magenta(Object.keys(tagCounts).length.toString().padStart(valueWidth))}`\n );\n console.log('');\n\n // Status Distribution\n console.log(chalk.bold('📊 Status Distribution'));\n console.log('');\n\n const maxStatusCount = Math.max(...Object.values(statusCounts));\n const colWidth = barWidth + 3;\n\n console.log(\n ` ${'Status'.padEnd(labelWidth)} ${chalk.cyan('Count'.padEnd(colWidth))}`\n );\n console.log(\n ` ${chalk.dim('─'.repeat(labelWidth))} ${chalk.dim('─'.repeat(colWidth))}`\n );\n console.log(\n ` 📋 ${'Planned'.padEnd(labelWidth - 3)} ${chalk.cyan(createBar(statusCounts.planned, maxStatusCount).padEnd(barWidth))}${chalk.cyan(statusCounts.planned.toString().padStart(3))}`\n );\n console.log(\n ` ⏳ ${'In Progress'.padEnd(labelWidth - 3)} ${chalk.yellow(createBar(statusCounts['in-progress'], maxStatusCount).padEnd(barWidth))}${chalk.yellow(statusCounts['in-progress'].toString().padStart(3))}`\n );\n console.log(\n ` ✅ ${'Complete'.padEnd(labelWidth - 3)} ${chalk.green(createBar(statusCounts.complete, maxStatusCount).padEnd(barWidth))}${chalk.green(statusCounts.complete.toString().padStart(3))}`\n );\n console.log(\n ` 📦 ${'Archived'.padEnd(labelWidth - 3)} ${chalk.dim(createBar(statusCounts.archived, maxStatusCount).padEnd(barWidth))}${chalk.dim(statusCounts.archived.toString().padStart(3))}`\n );\n console.log('');\n\n // Priority Breakdown\n if (totalWithPriority > 0) {\n console.log(chalk.bold('🎯 Priority Breakdown'));\n console.log('');\n\n const maxPriorityCount = Math.max(\n ...Object.values(priorityCounts).filter((c) => c > 0)\n );\n\n console.log(\n ` ${'Priority'.padEnd(labelWidth)} ${chalk.cyan('Count'.padEnd(colWidth))}`\n );\n console.log(\n ` ${chalk.dim('─'.repeat(labelWidth))} ${chalk.dim('─'.repeat(colWidth))}`\n );\n\n if (priorityCounts.critical > 0) {\n console.log(\n ` 🔴 ${'Critical'.padEnd(labelWidth - 3)} ${chalk.red(createBar(priorityCounts.critical, maxPriorityCount).padEnd(barWidth))}${chalk.red(priorityCounts.critical.toString().padStart(3))}`\n );\n }\n if (priorityCounts.high > 0) {\n console.log(\n ` 🟠 ${'High'.padEnd(labelWidth - 3)} ${chalk.hex('#FFA500')(createBar(priorityCounts.high, maxPriorityCount).padEnd(barWidth))}${chalk.hex('#FFA500')(priorityCounts.high.toString().padStart(3))}`\n );\n }\n if (priorityCounts.medium > 0) {\n console.log(\n ` 🟡 ${'Medium'.padEnd(labelWidth - 3)} ${chalk.yellow(createBar(priorityCounts.medium, maxPriorityCount).padEnd(barWidth))}${chalk.yellow(priorityCounts.medium.toString().padStart(3))}`\n );\n }\n if (priorityCounts.low > 0) {\n console.log(\n ` 🟢 ${'Low'.padEnd(labelWidth - 3)} ${chalk.green(createBar(priorityCounts.low, maxPriorityCount).padEnd(barWidth))}${chalk.green(priorityCounts.low.toString().padStart(3))}`\n );\n }\n console.log('');\n }\n\n // Top Tags\n const topTags = Object.entries(tagCounts)\n .sort((a, b) => b[1] - a[1])\n .slice(0, 5);\n\n if (topTags.length > 0) {\n console.log(chalk.bold('🏷️ Popular Tags'));\n console.log('');\n\n const maxTagCount = Math.max(...topTags.map(([, count]) => count));\n\n console.log(\n ` ${'Tag'.padEnd(labelWidth)} ${chalk.magenta('Count'.padEnd(colWidth))}`\n );\n console.log(\n ` ${chalk.dim('─'.repeat(labelWidth))} ${chalk.dim('─'.repeat(colWidth))}`\n );\n\n for (const [tag, count] of topTags) {\n const truncatedTag =\n tag.length > labelWidth ? tag.substring(0, labelWidth - 1) + '…' : tag;\n const bar = createBar(count, maxTagCount);\n console.log(\n ` ${truncatedTag.padEnd(labelWidth)} ${chalk.magenta(bar.padEnd(barWidth))}${chalk.magenta(count.toString().padStart(3))}`\n );\n }\n console.log('');\n }\n }\n\n // ============================================================\n // TIMELINE SECTION\n // ============================================================\n if (showTimeline) {\n const days = 30;\n const today = dayjs();\n const startDate = today.subtract(days, 'day');\n\n // Count specs by date\n const createdByDate: Record<string, number> = {};\n const completedByDate: Record<string, number> = {};\n\n for (const spec of specs) {\n const created = dayjs(spec.frontmatter.created);\n\n // Count created specs within date range\n if (created.isAfter(startDate)) {\n const dateKey = created.format('YYYY-MM-DD');\n createdByDate[dateKey] = (createdByDate[dateKey] || 0) + 1;\n }\n\n // Count completed specs\n if (spec.frontmatter.completed) {\n const completed = dayjs(spec.frontmatter.completed);\n if (completed.isAfter(startDate)) {\n const dateKey = completed.format('YYYY-MM-DD');\n completedByDate[dateKey] = (completedByDate[dateKey] || 0) + 1;\n }\n }\n }\n\n // Display timeline\n const allDates = new Set([\n ...Object.keys(createdByDate),\n ...Object.keys(completedByDate),\n ]);\n const sortedDates = Array.from(allDates).sort();\n\n if (sortedDates.length > 0) {\n console.log(chalk.bold(`📅 Activity (Last ${days} Days)`));\n console.log('');\n\n const colWidth = barWidth + 3;\n\n console.log(\n ` ${'Date'.padEnd(15)} ${chalk.cyan('Created'.padEnd(colWidth))} ${chalk.green('Completed'.padEnd(colWidth))}`\n );\n console.log(\n ` ${chalk.dim('─'.repeat(15))} ${chalk.dim('─'.repeat(colWidth))} ${chalk.dim('─'.repeat(colWidth))}`\n );\n\n const maxCount = Math.max(\n ...Object.values(createdByDate),\n ...Object.values(completedByDate)\n );\n\n // Show only last 10 days with activity\n for (const date of sortedDates.slice(-10)) {\n const created = createdByDate[date] || 0;\n const completed = completedByDate[date] || 0;\n\n const createdBar = createBar(created, maxCount, '━');\n const completedBar = createBar(completed, maxCount, '━');\n\n const createdCol = `${createdBar.padEnd(barWidth)}${created.toString().padStart(3)}`;\n const completedCol = `${completedBar.padEnd(barWidth)}${completed.toString().padStart(3)}`;\n\n console.log(\n ` ${chalk.dim(date.padEnd(15))} ${chalk.cyan(createdCol)} ${chalk.green(completedCol)}`\n );\n }\n console.log('');\n }\n }\n\n // ============================================================\n // VELOCITY SECTION\n // ============================================================\n if (showVelocity) {\n console.log(chalk.bold('🚀 Velocity Metrics'));\n console.log('');\n\n // Cycle Time\n console.log(chalk.bold('⏱️ Cycle Time (Created → Completed)'));\n console.log('');\n console.log(\n ` ${'Metric'.padEnd(labelWidth)} ${'Days'.padStart(valueWidth)}`\n );\n console.log(\n ` ${chalk.dim('─'.repeat(labelWidth))} ${chalk.dim('─'.repeat(valueWidth))}`\n );\n console.log(\n ` ${'Average'.padEnd(labelWidth)} ${chalk.cyan(velocityMetrics.cycleTime.average.toFixed(1).padStart(valueWidth))}`\n );\n console.log(\n ` ${'Median'.padEnd(labelWidth)} ${chalk.cyan(velocityMetrics.cycleTime.median.toFixed(1).padStart(valueWidth))}`\n );\n console.log(\n ` ${'90th Percentile'.padEnd(labelWidth)} ${chalk.yellow(velocityMetrics.cycleTime.p90.toFixed(1).padStart(valueWidth))}`\n );\n console.log('');\n\n // Throughput\n console.log(chalk.bold('📦 Throughput'));\n console.log('');\n console.log(\n ` ${'Period'.padEnd(labelWidth)} ${'Specs'.padStart(valueWidth)}`\n );\n console.log(\n ` ${chalk.dim('─'.repeat(labelWidth))} ${chalk.dim('─'.repeat(valueWidth))}`\n );\n console.log(\n ` ${'Last 7 days'.padEnd(labelWidth)} ${chalk.green(velocityMetrics.throughput.perWeek.toString().padStart(valueWidth))}`\n );\n console.log(\n ` ${'Last 30 days'.padEnd(labelWidth)} ${chalk.green(velocityMetrics.throughput.perMonth.toString().padStart(valueWidth))}`\n );\n\n const trendColor =\n velocityMetrics.throughput.trend === 'up'\n ? chalk.green\n : velocityMetrics.throughput.trend === 'down'\n ? chalk.red\n : chalk.yellow;\n const trendSymbol =\n velocityMetrics.throughput.trend === 'up'\n ? '↑'\n : velocityMetrics.throughput.trend === 'down'\n ? '↓'\n : '→';\n console.log(\n ` ${'Trend'.padEnd(labelWidth)} ${trendColor(trendSymbol + ' ' + velocityMetrics.throughput.trend.padStart(valueWidth - 2))}`\n );\n console.log('');\n\n // WIP\n console.log(chalk.bold('🔄 Work In Progress'));\n console.log('');\n console.log(\n ` ${'Metric'.padEnd(labelWidth)} ${'Specs'.padStart(valueWidth)}`\n );\n console.log(\n ` ${chalk.dim('─'.repeat(labelWidth))} ${chalk.dim('─'.repeat(valueWidth))}`\n );\n console.log(\n ` ${'Current'.padEnd(labelWidth)} ${chalk.yellow(velocityMetrics.wip.current.toString().padStart(valueWidth))}`\n );\n console.log(\n ` ${'30-day Average'.padEnd(labelWidth)} ${chalk.cyan(velocityMetrics.wip.average.toFixed(1).padStart(valueWidth))}`\n );\n console.log('');\n\n // Lead Time (if available)\n if (\n velocityMetrics.leadTime.plannedToInProgress > 0 ||\n velocityMetrics.leadTime.inProgressToComplete > 0\n ) {\n console.log(chalk.bold('🔀 Lead Time by Stage'));\n console.log('');\n console.log(\n ` ${'Stage'.padEnd(labelWidth)} ${'Days'.padStart(valueWidth)}`\n );\n console.log(\n ` ${chalk.dim('─'.repeat(labelWidth))} ${chalk.dim('─'.repeat(valueWidth))}`\n );\n if (velocityMetrics.leadTime.plannedToInProgress > 0) {\n console.log(\n ` ${'Planned → In Progress'.padEnd(labelWidth)} ${chalk.cyan(velocityMetrics.leadTime.plannedToInProgress.toFixed(1).padStart(valueWidth))}`\n );\n }\n if (velocityMetrics.leadTime.inProgressToComplete > 0) {\n console.log(\n ` ${'In Progress → Complete'.padEnd(labelWidth)} ${chalk.green(velocityMetrics.leadTime.inProgressToComplete.toFixed(1).padStart(valueWidth))}`\n );\n }\n console.log('');\n }\n }\n}\n","import React from 'react';\nimport { render } from 'ink';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport { loadAllSpecs } from '../spec-loader.js';\nimport type { SpecStatus, SpecPriority, SpecFilterOptions } from '../frontmatter.js';\nimport { withSpinner } from '../utils/ui.js';\nimport { autoCheckIfEnabled } from './check.js';\nimport { sanitizeUserInput } from '../utils/ui.js';\nimport { advancedSearchSpecs, getSearchSyntaxHelp, type SearchableSpec } from '@leanspec/core';\nimport { parseCustomFieldOptions } from '../utils/cli-helpers.js';\n\n/**\n * Search command - full-text search with metadata filters and advanced query syntax\n */\nexport function searchCommand(): Command {\n return new Command('search')\n .description('Full-text search with advanced query syntax')\n .argument('[query]', 'Search query (supports AND, OR, NOT, field:value, fuzzy~)')\n .option('--status <status>', 'Filter by status')\n .option('--tag <tag>', 'Filter by tag')\n .option('--priority <priority>', 'Filter by priority')\n .option('--assignee <name>', 'Filter by assignee')\n .option('--field <name=value...>', 'Filter by custom field (can specify multiple)')\n .option('--json', 'Output as JSON')\n .option('--help-syntax', 'Show advanced query syntax help')\n .action(async (query: string | undefined, options: {\n status?: SpecStatus;\n tag?: string;\n priority?: SpecPriority;\n assignee?: string;\n field?: string[];\n json?: boolean;\n helpSyntax?: boolean;\n }) => {\n // Show syntax help\n if (options.helpSyntax) {\n console.log('');\n console.log(chalk.cyan('Advanced Search Syntax'));\n console.log(chalk.gray('─'.repeat(60)));\n console.log('');\n console.log(getSearchSyntaxHelp());\n console.log('');\n return;\n }\n\n if (!query) {\n console.log(chalk.yellow('Usage: lean-spec search <query>'));\n console.log(chalk.gray('Use --help-syntax for advanced query syntax'));\n return;\n }\n\n const customFields = parseCustomFieldOptions(options.field);\n await performSearch(query, {\n status: options.status,\n tag: options.tag,\n priority: options.priority,\n assignee: options.assignee,\n customFields: Object.keys(customFields).length > 0 ? customFields : undefined,\n json: options.json,\n });\n });\n}\n\nexport async function performSearch(query: string, options: {\n status?: SpecStatus;\n tag?: string;\n priority?: SpecPriority;\n assignee?: string;\n customFields?: Record<string, unknown>;\n json?: boolean;\n}): Promise<void> {\n // Auto-check for conflicts before search\n await autoCheckIfEnabled();\n \n // Build filter\n const filter: SpecFilterOptions = {};\n if (options.status) filter.status = options.status;\n if (options.tag) filter.tags = [options.tag];\n if (options.priority) filter.priority = options.priority;\n if (options.assignee) filter.assignee = options.assignee;\n if (options.customFields) filter.customFields = options.customFields;\n\n // Load all specs with content and spinner\n const specs = await withSpinner(\n 'Searching specs...',\n () => loadAllSpecs({\n includeArchived: true,\n includeContent: true,\n filter,\n })\n );\n\n if (specs.length === 0) {\n console.log('No specs found matching filters.');\n return;\n }\n\n // Convert to searchable format\n const searchableSpecs: SearchableSpec[] = specs.map(spec => ({\n path: spec.path,\n name: spec.path,\n status: spec.frontmatter.status,\n priority: spec.frontmatter.priority,\n tags: spec.frontmatter.tags,\n title: typeof spec.frontmatter.title === 'string' ? spec.frontmatter.title : undefined,\n description: typeof spec.frontmatter.description === 'string' ? spec.frontmatter.description : undefined,\n content: spec.content,\n created: spec.frontmatter.created,\n updated: spec.frontmatter.updated_at,\n assignee: spec.frontmatter.assignee,\n }));\n\n // Use advanced search engine (supports boolean operators, field filters, fuzzy matching)\n const searchResult = advancedSearchSpecs(query, searchableSpecs, {\n maxMatchesPerSpec: 5,\n contextLength: 80,\n });\n\n const { results, metadata } = searchResult;\n\n // JSON output\n if (options.json) {\n const jsonOutput = {\n query,\n results: results.map(r => ({\n spec: r.spec.path,\n score: r.score,\n totalMatches: r.totalMatches,\n matches: r.matches.map(m => ({\n field: m.field,\n text: m.text,\n lineNumber: m.lineNumber,\n })),\n })),\n metadata,\n filters: filter,\n };\n console.log(JSON.stringify(jsonOutput, null, 2));\n return;\n }\n\n // Display results\n if (results.length === 0) {\n console.log('');\n console.log(chalk.yellow(`🔍 No specs found matching \"${sanitizeUserInput(query)}\"`));\n \n // Show active filters\n if (Object.keys(filter).length > 0) {\n const filters: string[] = [];\n if (options.status) filters.push(`status=${sanitizeUserInput(options.status)}`);\n if (options.tag) filters.push(`tag=${sanitizeUserInput(options.tag)}`);\n if (options.priority) filters.push(`priority=${sanitizeUserInput(options.priority)}`);\n if (options.assignee) filters.push(`assignee=${sanitizeUserInput(options.assignee)}`);\n console.log(chalk.gray(`With filters: ${filters.join(', ')}`));\n }\n console.log('');\n return;\n }\n\n // Show summary header with metadata\n console.log('');\n console.log(chalk.green(`🔍 Found ${results.length} spec${results.length === 1 ? '' : 's'} matching \"${sanitizeUserInput(query)}\"`));\n console.log(chalk.gray(` Searched ${metadata.specsSearched} specs in ${metadata.searchTime}ms`));\n \n // Show active filters\n if (Object.keys(filter).length > 0) {\n const filters: string[] = [];\n if (options.status) filters.push(`status=${sanitizeUserInput(options.status)}`);\n if (options.tag) filters.push(`tag=${sanitizeUserInput(options.tag)}`);\n if (options.priority) filters.push(`priority=${sanitizeUserInput(options.priority)}`);\n if (options.assignee) filters.push(`assignee=${sanitizeUserInput(options.assignee)}`);\n console.log(chalk.gray(` With filters: ${filters.join(', ')}`));\n }\n console.log('');\n\n // Display each result with matches\n for (const result of results) {\n const { spec, matches, score, totalMatches } = result;\n \n // Spec header with relevance score\n const statusEmoji = spec.status === 'in-progress' ? '🔨' : \n spec.status === 'complete' ? '✅' : '📅';\n console.log(chalk.cyan(`${statusEmoji} ${sanitizeUserInput(spec.path)} ${chalk.gray(`(${score}% match)`)}`));\n \n // Metadata\n const meta: string[] = [];\n if (spec.priority) {\n const priorityEmoji = spec.priority === 'critical' ? '🔴' : \n spec.priority === 'high' ? '🟡' :\n spec.priority === 'medium' ? '🟠' : '🟢';\n meta.push(`${priorityEmoji} ${sanitizeUserInput(spec.priority)}`);\n }\n if (spec.tags && spec.tags.length > 0) {\n meta.push(`[${spec.tags.map(tag => sanitizeUserInput(tag)).join(', ')}]`);\n }\n if (meta.length > 0) {\n console.log(chalk.gray(` ${meta.join(' • ')}`));\n }\n \n // Show title if it matched\n const titleMatch = matches.find(m => m.field === 'title');\n if (titleMatch) {\n console.log(` ${chalk.bold('Title:')} ${highlightMatches(titleMatch.text, titleMatch.highlights)}`);\n }\n \n // Show description if it matched\n const descMatch = matches.find(m => m.field === 'description');\n if (descMatch) {\n console.log(` ${chalk.bold('Description:')} ${highlightMatches(descMatch.text, descMatch.highlights)}`);\n }\n \n // Show tag matches\n const tagMatches = matches.filter(m => m.field === 'tags');\n if (tagMatches.length > 0) {\n console.log(` ${chalk.bold('Tags:')} ${tagMatches.map(m => highlightMatches(m.text, m.highlights)).join(', ')}`);\n }\n \n // Show content matches\n const contentMatches = matches.filter(m => m.field === 'content');\n if (contentMatches.length > 0) {\n console.log(` ${chalk.bold('Content matches:')}`);\n for (const match of contentMatches) {\n const lineInfo = match.lineNumber ? chalk.gray(`[L${match.lineNumber}]`) : '';\n console.log(` ${lineInfo} ${highlightMatches(match.text, match.highlights)}`);\n }\n }\n \n if (totalMatches > matches.length) {\n console.log(chalk.gray(` ... and ${totalMatches - matches.length} more match${totalMatches - matches.length === 1 ? '' : 'es'}`));\n }\n \n console.log('');\n }\n}\n\n/**\n * Highlight matches in text using character ranges\n */\nfunction highlightMatches(text: string, highlights: Array<[number, number]>): string {\n if (highlights.length === 0) return text;\n\n let result = '';\n let lastEnd = 0;\n\n for (const [start, end] of highlights) {\n result += text.substring(lastEnd, start);\n result += chalk.yellow(text.substring(start, end));\n lastEnd = end;\n }\n result += text.substring(lastEnd);\n\n return result;\n}\n","import chalk from 'chalk';\nimport { Command } from 'commander';\nimport { getSpec, loadAllSpecs, type SpecInfo } from '../spec-loader.js';\nimport { autoCheckIfEnabled } from './check.js';\nimport { sanitizeUserInput } from '../utils/ui.js';\nimport { resolveSpecPath } from '../utils/path-helpers.js';\nimport { loadConfig } from '../config.js';\nimport * as path from 'node:path';\nimport { getStatusIndicator } from '../utils/colors.js';\nimport { SpecDependencyGraph } from '@leanspec/core';\n\nexport interface DepsOptions {\n depth?: number;\n graph?: boolean;\n json?: boolean;\n mode?: 'complete' | 'upstream' | 'downstream' | 'impact';\n}\n\nexport function depsCommand(): Command;\nexport function depsCommand(specPath: string, options?: DepsOptions): Promise<void>;\nexport function depsCommand(specPath?: string, options: DepsOptions = {}): Command | Promise<void> {\n if (typeof specPath === 'string') {\n return showDeps(specPath, options);\n }\n\n return new Command('deps')\n .description('Show dependency graph for a spec. Related specs (⟷) are shown bidirectionally, depends_on (→) are directional.')\n .argument('<spec>', 'Spec to show dependencies for')\n .option('--depth <n>', 'Show N levels deep (default: 3)', parseInt)\n .option('--graph', 'ASCII graph visualization')\n .option('--json', 'Output as JSON')\n .option('--complete', 'Show complete graph (default: all relationships)')\n .option('--upstream', 'Show only upstream dependencies')\n .option('--downstream', 'Show only downstream dependents')\n .option('--impact', 'Show impact radius (all affected specs)')\n .action(async (target: string, opts: DepsOptions) => {\n await showDeps(target, opts);\n });\n}\n\nexport async function showDeps(specPath: string, options: DepsOptions = {}): Promise<void> {\n // Auto-check for conflicts before display\n await autoCheckIfEnabled();\n \n // Resolve spec path (handles numbers like \"14\" or \"014\")\n const config = await loadConfig();\n const cwd = process.cwd();\n const specsDir = path.join(cwd, config.specsDir);\n const resolvedPath = await resolveSpecPath(specPath, cwd, specsDir);\n \n if (!resolvedPath) {\n throw new Error(`Spec not found: ${sanitizeUserInput(specPath)}`);\n }\n \n const spec = await getSpec(resolvedPath);\n \n if (!spec) {\n throw new Error(`Spec not found: ${sanitizeUserInput(specPath)}`);\n }\n\n // Load all specs and build dependency graph\n const allSpecs = await loadAllSpecs({ includeArchived: true });\n const graph = new SpecDependencyGraph(allSpecs);\n \n // Determine mode from options (explicit flags take precedence)\n let mode: 'complete' | 'upstream' | 'downstream' | 'impact' = 'complete';\n if (options.mode) {\n mode = options.mode;\n } else if ((options as any).upstream) {\n mode = 'upstream';\n } else if ((options as any).downstream) {\n mode = 'downstream';\n } else if ((options as any).impact) {\n mode = 'impact';\n }\n \n const specMap = new Map<string, SpecInfo>();\n for (const s of allSpecs) {\n specMap.set(s.path, s);\n }\n\n // Get dependency information based on mode\n let dependsOn: SpecInfo[] = [];\n let requiredBy: SpecInfo[] = [];\n let related: SpecInfo[] = [];\n \n if (mode === 'complete') {\n const completeGraph = graph.getCompleteGraph(spec.path);\n dependsOn = completeGraph.dependsOn;\n requiredBy = completeGraph.requiredBy;\n related = completeGraph.related;\n } else if (mode === 'upstream') {\n dependsOn = graph.getUpstream(spec.path, options.depth || 3);\n } else if (mode === 'downstream') {\n requiredBy = graph.getDownstream(spec.path, options.depth || 3);\n } else if (mode === 'impact') {\n const impact = graph.getImpactRadius(spec.path, options.depth || 3);\n dependsOn = impact.upstream;\n requiredBy = impact.downstream;\n related = impact.related;\n }\n\n // Output as JSON if requested\n if (options.json) {\n const data: any = {\n spec: spec.path,\n mode,\n };\n \n if (mode === 'complete' || mode === 'upstream' || mode === 'impact') {\n data.dependsOn = dependsOn.map(s => ({ path: s.path, status: s.frontmatter.status }));\n }\n \n if (mode === 'complete' || mode === 'downstream' || mode === 'impact') {\n data.requiredBy = requiredBy.map(s => ({ path: s.path, status: s.frontmatter.status }));\n }\n \n if (mode === 'complete' || mode === 'impact') {\n data.related = related.map(s => ({ path: s.path, status: s.frontmatter.status }));\n }\n \n if (mode === 'complete' && (options.graph || dependsOn.length > 0)) {\n data.chain = buildDependencyChain(spec, specMap, options.depth || 3);\n }\n \n console.log(JSON.stringify(data, null, 2));\n return;\n }\n\n // Display dependencies\n console.log('');\n console.log(chalk.green(`📦 Dependencies for ${chalk.cyan(sanitizeUserInput(spec.path))}`));\n console.log('');\n\n // Check if there are any relationships at all\n const hasAnyRelationships = dependsOn.length > 0 || requiredBy.length > 0 || related.length > 0;\n \n if (!hasAnyRelationships) {\n console.log(chalk.gray(' No dependencies or relationships'));\n console.log('');\n return;\n }\n\n // Depends On section (Upstream)\n if ((mode === 'complete' || mode === 'upstream' || mode === 'impact') && dependsOn.length > 0) {\n const label = mode === 'complete' ? 'Depends On' : mode === 'upstream' ? 'Upstream Dependencies' : 'Upstream (Impact)';\n console.log(chalk.bold(`${label}:`));\n for (const dep of dependsOn) {\n const status = getStatusIndicator(dep.frontmatter.status);\n console.log(` → ${sanitizeUserInput(dep.path)} ${status}`);\n }\n console.log('');\n }\n\n // Required By section (Downstream)\n if ((mode === 'complete' || mode === 'downstream' || mode === 'impact') && requiredBy.length > 0) {\n const label = mode === 'complete' ? 'Required By' : mode === 'downstream' ? 'Downstream Dependents' : 'Downstream (Impact)';\n console.log(chalk.bold(`${label}:`));\n for (const blocked of requiredBy) {\n const status = getStatusIndicator(blocked.frontmatter.status);\n console.log(` ← ${sanitizeUserInput(blocked.path)} ${status}`);\n }\n console.log('');\n }\n\n // Related Specs section (bidirectional)\n if ((mode === 'complete' || mode === 'impact') && related.length > 0) {\n console.log(chalk.bold('Related Specs:'));\n for (const rel of related) {\n const status = getStatusIndicator(rel.frontmatter.status);\n console.log(` ⟷ ${sanitizeUserInput(rel.path)} ${status}`);\n }\n console.log('');\n }\n\n // Dependency chain (tree view) - only for complete mode or when graph is requested\n if (mode === 'complete' && (options.graph || dependsOn.length > 0)) {\n console.log(chalk.bold('Dependency Chain:'));\n const chain = buildDependencyChain(spec, specMap, options.depth || 3);\n displayChain(chain, 0);\n console.log('');\n }\n \n // Impact summary for impact mode\n if (mode === 'impact') {\n const total = dependsOn.length + requiredBy.length + related.length;\n console.log(chalk.bold(`Impact Summary:`));\n console.log(` Changing this spec affects ${chalk.yellow(total)} specs total`);\n console.log(` Upstream: ${dependsOn.length} | Downstream: ${requiredBy.length} | Related: ${related.length}`);\n console.log('');\n }\n}\n\ninterface DependencyNode {\n spec: SpecInfo;\n dependencies: DependencyNode[];\n}\n\nfunction buildDependencyChain(\n spec: SpecInfo,\n specMap: Map<string, SpecInfo>,\n maxDepth: number,\n currentDepth: number = 0,\n visited: Set<string> = new Set()\n): DependencyNode {\n const node: DependencyNode = {\n spec,\n dependencies: [],\n };\n \n // Prevent infinite loops\n if (visited.has(spec.path)) {\n return node;\n }\n visited.add(spec.path);\n \n // Stop at max depth\n if (currentDepth >= maxDepth) {\n return node;\n }\n \n // Find dependencies from frontmatter\n if (spec.frontmatter.depends_on) {\n for (const depPath of spec.frontmatter.depends_on) {\n const dep = specMap.get(depPath);\n if (dep) {\n node.dependencies.push(buildDependencyChain(dep, specMap, maxDepth, currentDepth + 1, visited));\n }\n }\n }\n \n return node;\n}\n\nfunction displayChain(node: DependencyNode, level: number): void {\n const indent = ' '.repeat(level);\n const status = getStatusIndicator(node.spec.frontmatter.status);\n const name = level === 0 ? chalk.cyan(node.spec.path) : node.spec.path;\n \n console.log(`${indent}${name} ${status}`);\n \n for (const dep of node.dependencies) {\n const prefix = ' '.repeat(level) + '└─ ';\n const depStatus = getStatusIndicator(dep.spec.frontmatter.status);\n console.log(`${prefix}${dep.spec.path} ${depStatus}`);\n \n // Recursively display nested dependencies with increased indent\n for (const nestedDep of dep.dependencies) {\n displayChain(nestedDep, level + 2);\n }\n }\n}\n","import chalk from 'chalk';\nimport dayjs from 'dayjs';\nimport { Command } from 'commander';\nimport { loadAllSpecs } from '../spec-loader.js';\nimport type { SpecFilterOptions } from '../frontmatter.js';\nimport { autoCheckIfEnabled } from './check.js';\n\n/**\n * Timeline command - show creation/completion over time\n */\nexport function timelineCommand(): Command {\n return new Command('timeline')\n .description('Show creation/completion over time')\n .option('--days <n>', 'Show last N days (default: 30)', parseInt)\n .option('--by-tag', 'Group by tag')\n .option('--by-assignee', 'Group by assignee')\n .option('--json', 'Output as JSON')\n .action(async (options: { days?: number; byTag?: boolean; byAssignee?: boolean; json?: boolean }) => {\n await showTimeline(options);\n });\n}\n\nexport async function showTimeline(options: {\n days?: number;\n byTag?: boolean;\n byAssignee?: boolean;\n json?: boolean;\n}): Promise<void> {\n // Auto-check for conflicts before display\n await autoCheckIfEnabled();\n \n // Helper to create bars\n const createBar = (count: number, maxCount: number, width: number, char: string = '━') => {\n const barLen = Math.round((count / maxCount) * width);\n return char.repeat(barLen);\n };\n \n const days = options.days || 30;\n \n // Load all specs (including archived for completion history)\n const specs = await loadAllSpecs({\n includeArchived: true,\n });\n\n if (specs.length === 0) {\n console.log('No specs found.');\n return;\n }\n\n // Calculate date range\n const today = dayjs();\n const startDate = today.subtract(days, 'day');\n\n // Count specs by date\n const createdByDate: Record<string, number> = {};\n const completedByDate: Record<string, number> = {};\n const createdByMonth: Record<string, number> = {};\n\n for (const spec of specs) {\n const created = dayjs(spec.frontmatter.created);\n \n // Count created specs within date range\n if (created.isAfter(startDate)) {\n const dateKey = created.format('YYYY-MM-DD');\n createdByDate[dateKey] = (createdByDate[dateKey] || 0) + 1;\n }\n\n // Count by month for all time\n const monthKey = created.format('MMM YYYY');\n createdByMonth[monthKey] = (createdByMonth[monthKey] || 0) + 1;\n\n // Count completed specs\n if (spec.frontmatter.completed) {\n const completed = dayjs(spec.frontmatter.completed);\n if (completed.isAfter(startDate)) {\n const dateKey = completed.format('YYYY-MM-DD');\n completedByDate[dateKey] = (completedByDate[dateKey] || 0) + 1;\n }\n }\n }\n\n // JSON output\n if (options.json) {\n const jsonOutput = {\n days,\n createdByDate,\n completedByDate,\n createdByMonth,\n };\n console.log(JSON.stringify(jsonOutput, null, 2));\n return;\n }\n\n // Display timeline\n console.log(chalk.bold.cyan('📈 Spec Timeline'));\n console.log('');\n\n // Show daily activity (only days with activity)\n const allDates = new Set([...Object.keys(createdByDate), ...Object.keys(completedByDate)]);\n const sortedDates = Array.from(allDates).sort();\n\n if (sortedDates.length > 0) {\n console.log(chalk.bold(`📅 Activity (Last ${days} Days)`));\n console.log('');\n \n // Column headers - aligned with stats.ts\n const labelWidth = 15;\n const barWidth = 20;\n const specsWidth = 3;\n const colWidth = barWidth + specsWidth;\n \n console.log(` ${'Date'.padEnd(labelWidth)} ${chalk.cyan('Created'.padEnd(colWidth))} ${chalk.green('Completed'.padEnd(colWidth))}`);\n console.log(` ${chalk.dim('─'.repeat(labelWidth))} ${chalk.dim('─'.repeat(colWidth))} ${chalk.dim('─'.repeat(colWidth))}`);\n \n const maxCount = Math.max(...Object.values(createdByDate), ...Object.values(completedByDate));\n \n for (const date of sortedDates) {\n const created = createdByDate[date] || 0;\n const completed = completedByDate[date] || 0;\n \n const createdBar = createBar(created, maxCount, barWidth);\n const completedBar = createBar(completed, maxCount, barWidth);\n \n const createdCol = `${createdBar.padEnd(barWidth)}${created.toString().padStart(specsWidth)}`;\n const completedCol = `${completedBar.padEnd(barWidth)}${completed.toString().padStart(specsWidth)}`;\n \n console.log(` ${chalk.dim(date.padEnd(labelWidth))} ${chalk.cyan(createdCol)} ${chalk.green(completedCol)}`);\n }\n console.log('');\n }\n\n // Show creation by month (all time)\n const sortedMonths = Object.entries(createdByMonth)\n .sort((a, b) => {\n const dateA = dayjs(a[0], 'MMM YYYY');\n const dateB = dayjs(b[0], 'MMM YYYY');\n return dateB.diff(dateA);\n })\n .slice(0, 6); // Last 6 months\n\n if (sortedMonths.length > 0) {\n console.log(chalk.bold('📊 Monthly Overview'));\n console.log('');\n \n // Aligned with stats.ts\n const labelWidth = 15;\n const barWidth = 20;\n const specsWidth = 3;\n const colWidth = barWidth + specsWidth;\n \n console.log(` ${'Month'.padEnd(labelWidth)} ${chalk.magenta('Specs'.padEnd(colWidth))}`);\n console.log(` ${chalk.dim('─'.repeat(labelWidth))} ${chalk.dim('─'.repeat(colWidth))}`);\n \n const maxCount = Math.max(...sortedMonths.map(([, count]) => count));\n for (const [month, count] of sortedMonths) {\n const bar = createBar(count, maxCount, barWidth);\n console.log(` ${month.padEnd(labelWidth)} ${chalk.magenta(bar.padEnd(barWidth))}${chalk.magenta(count.toString().padStart(specsWidth))}`);\n }\n console.log('');\n }\n\n // Completion rate\n const last7Days = specs.filter(s => {\n if (!s.frontmatter.completed) return false;\n const completed = dayjs(s.frontmatter.completed);\n return completed.isAfter(today.subtract(7, 'day'));\n }).length;\n\n const last30Days = specs.filter(s => {\n if (!s.frontmatter.completed) return false;\n const completed = dayjs(s.frontmatter.completed);\n return completed.isAfter(today.subtract(30, 'day'));\n }).length;\n\n console.log(chalk.bold('✅ Completion Rate'));\n console.log('');\n \n // Aligned with stats.ts\n const labelWidth = 15;\n const valueWidth = 5;\n \n console.log(` ${'Period'.padEnd(labelWidth)} ${'Specs'.padStart(valueWidth)}`);\n console.log(` ${chalk.dim('─'.repeat(labelWidth))} ${chalk.dim('─'.repeat(valueWidth))}`);\n console.log(` ${'Last 7 days'.padEnd(labelWidth)} ${chalk.green(last7Days.toString().padStart(valueWidth))}`);\n console.log(` ${'Last 30 days'.padEnd(labelWidth)} ${chalk.green(last30Days.toString().padStart(valueWidth))}`);\n console.log('');\n\n // By tag breakdown (if requested)\n if (options.byTag) {\n const tagStats: Record<string, { created: number; completed: number }> = {};\n \n for (const spec of specs) {\n const created = dayjs(spec.frontmatter.created);\n const isInRange = created.isAfter(startDate);\n \n if (isInRange && spec.frontmatter.tags) {\n for (const tag of spec.frontmatter.tags) {\n if (!tagStats[tag]) tagStats[tag] = { created: 0, completed: 0 };\n tagStats[tag].created++;\n \n if (spec.frontmatter.completed) {\n const completed = dayjs(spec.frontmatter.completed);\n if (completed.isAfter(startDate)) {\n tagStats[tag].completed++;\n }\n }\n }\n }\n }\n \n const sortedTags = Object.entries(tagStats)\n .sort((a, b) => b[1].created - a[1].created)\n .slice(0, 10);\n \n if (sortedTags.length > 0) {\n console.log(chalk.bold('🏷️ By Tag'));\n for (const [tag, stats] of sortedTags) {\n console.log(` ${chalk.dim('#')}${tag.padEnd(20)} ${chalk.cyan(stats.created)} created · ${chalk.green(stats.completed)} completed`);\n }\n console.log('');\n }\n }\n\n // By assignee breakdown (if requested)\n if (options.byAssignee) {\n const assigneeStats: Record<string, { created: number; completed: number }> = {};\n \n for (const spec of specs) {\n if (!spec.frontmatter.assignee) continue;\n \n const created = dayjs(spec.frontmatter.created);\n const isInRange = created.isAfter(startDate);\n \n if (isInRange) {\n const assignee = spec.frontmatter.assignee;\n if (!assigneeStats[assignee]) assigneeStats[assignee] = { created: 0, completed: 0 };\n assigneeStats[assignee].created++;\n \n if (spec.frontmatter.completed) {\n const completed = dayjs(spec.frontmatter.completed);\n if (completed.isAfter(startDate)) {\n assigneeStats[assignee].completed++;\n }\n }\n }\n }\n \n const sortedAssignees = Object.entries(assigneeStats)\n .sort((a, b) => b[1].created - a[1].created);\n \n if (sortedAssignees.length > 0) {\n console.log(chalk.bold('👤 By Assignee'));\n for (const [assignee, stats] of sortedAssignees) {\n console.log(` ${chalk.dim('@')}${assignee.padEnd(20)} ${chalk.cyan(stats.created)} created · ${chalk.green(stats.completed)} completed`);\n }\n console.log('');\n }\n }\n}\n","import chalk from 'chalk';\nimport dayjs from 'dayjs';\nimport { Command } from 'commander';\nimport { loadAllSpecs } from '../spec-loader.js';\nimport type { SpecInfo } from '../spec-loader.js';\nimport type { SpecStatus, SpecPriority } from '../frontmatter.js';\nimport { withSpinner } from '../utils/ui.js';\nimport { autoCheckIfEnabled } from './check.js';\n\n// Column width constants (aligned with stats.ts and timeline.ts)\nconst SPEC_COLUMN_WIDTH = 43; // Includes status emoji + 1 space + spec name\nconst COLUMN_SEPARATOR = ' '; // 2 spaces between columns\nconst SPEC_INDENT = ' '; // 2 spaces for spec indentation within priority groups\n\n// Timeline bar characters\nconst FILLED_BAR_CHAR = '█';\nconst EMPTY_BAR_CHAR = '░';\n\nconst STATUS_CONFIG: Record<SpecStatus, { emoji: string; color: string }> = {\n planned: { emoji: '📅', color: 'gray' },\n 'in-progress': { emoji: '⏳', color: 'yellow' },\n complete: { emoji: '✅', color: 'green' },\n archived: { emoji: '📦', color: 'gray' },\n};\n\nconst PRIORITY_CONFIG: Record<SpecPriority, { emoji: string; label: string; colorFn: (s: string) => string }> = {\n critical: { emoji: '🔴', label: 'CRITICAL', colorFn: chalk.red },\n high: { emoji: '🟠', label: 'HIGH', colorFn: chalk.hex('#FFA500') },\n medium: { emoji: '🟡', label: 'MEDIUM', colorFn: chalk.yellow },\n low: { emoji: '🟢', label: 'LOW', colorFn: chalk.green },\n};\n\n/**\n * Gantt command - show timeline with dependencies\n */\nexport function ganttCommand(): Command {\n return new Command('gantt')\n .description('Show timeline with dependencies')\n .option('--weeks <n>', 'Show N weeks (default: 4)', parseInt)\n .option('--show-complete', 'Include completed specs')\n .option('--critical-path', 'Highlight critical path')\n .option('--json', 'Output as JSON')\n .action(async (options: { weeks?: number; showComplete?: boolean; criticalPath?: boolean; json?: boolean }) => {\n await showGantt(options);\n });\n}\n\nexport async function showGantt(options: {\n weeks?: number;\n showComplete?: boolean;\n criticalPath?: boolean;\n json?: boolean;\n}): Promise<void> {\n // Auto-check for conflicts before display\n await autoCheckIfEnabled();\n \n const weeks = options.weeks || 4;\n const timelineColumnWidth = weeks * 8; // 8 chars per week\n \n // Load all specs with spinner\n const specs = await withSpinner(\n 'Loading specs...',\n () => loadAllSpecs({\n includeArchived: false,\n })\n );\n\n if (specs.length === 0) {\n console.log('No specs found.');\n return;\n }\n\n // Filter relevant specs\n const relevantSpecs = specs.filter(spec => {\n // Hide completed specs unless explicitly requested\n if (!options.showComplete && spec.frontmatter.status === 'complete') {\n return false;\n }\n // Show all non-archived specs (planned, in-progress, complete with flag)\n return spec.frontmatter.status !== 'archived';\n });\n\n if (relevantSpecs.length === 0) {\n if (options.json) {\n console.log(JSON.stringify({ specs: [], weeks }, null, 2));\n } else {\n console.log(chalk.dim('No active specs found.'));\n console.log(chalk.dim('Tip: Use --show-complete to include completed specs.'));\n }\n return;\n }\n\n // JSON output\n if (options.json) {\n const jsonOutput = {\n weeks,\n specs: relevantSpecs.map(spec => ({\n path: spec.path,\n status: spec.frontmatter.status,\n priority: spec.frontmatter.priority,\n created: spec.frontmatter.created,\n completed: spec.frontmatter.completed,\n due: spec.frontmatter.due,\n dependsOn: spec.frontmatter.depends_on,\n })),\n };\n console.log(JSON.stringify(jsonOutput, null, 2));\n return;\n }\n\n // Group specs by priority\n const groupedSpecs: Record<SpecPriority, SpecInfo[]> = {\n critical: [],\n high: [],\n medium: [],\n low: [],\n };\n \n const noPrioritySpecs: SpecInfo[] = [];\n \n for (const spec of relevantSpecs) {\n if (spec.frontmatter.priority && spec.frontmatter.priority in groupedSpecs) {\n groupedSpecs[spec.frontmatter.priority].push(spec);\n } else {\n noPrioritySpecs.push(spec);\n }\n }\n \n // Sort specs within each group by status (in-progress first), then by due date\n const sortSpecs = (specs: SpecInfo[]) => {\n return [...specs].sort((a, b) => {\n const statusOrder = { 'in-progress': 0, 'planned': 1, 'complete': 2 };\n const aOrder = statusOrder[a.frontmatter.status as keyof typeof statusOrder] ?? 3;\n const bOrder = statusOrder[b.frontmatter.status as keyof typeof statusOrder] ?? 3;\n \n if (aOrder !== bOrder) return aOrder - bOrder;\n \n if (a.frontmatter.due && !b.frontmatter.due) return -1;\n if (!a.frontmatter.due && b.frontmatter.due) return 1;\n if (a.frontmatter.due && b.frontmatter.due) {\n return dayjs(a.frontmatter.due).diff(dayjs(b.frontmatter.due));\n }\n \n return 0;\n });\n };\n\n // Calculate date range (start from today)\n const today = dayjs();\n const startDate = today.startOf('week');\n const endDate = startDate.add(weeks, 'week');\n\n // Calculate stats\n const inProgress = relevantSpecs.filter(s => s.frontmatter.status === 'in-progress').length;\n const planned = relevantSpecs.filter(s => s.frontmatter.status === 'planned').length;\n const overdue = relevantSpecs.filter(s => \n s.frontmatter.due && \n dayjs(s.frontmatter.due).isBefore(today) && \n s.frontmatter.status !== 'complete'\n ).length;\n\n // Display header\n console.log(chalk.bold.cyan(`📅 Gantt Chart (${weeks} weeks from ${startDate.format('MMM D, YYYY')})`));\n console.log('');\n\n // Column headers\n const specHeader = 'Spec'.padEnd(SPEC_COLUMN_WIDTH);\n const timelineHeader = 'Timeline';\n console.log(specHeader + COLUMN_SEPARATOR + timelineHeader);\n \n // Calendar dates in timeline header (right-aligned to column)\n const calendarDates: string[] = [];\n for (let i = 0; i < weeks; i++) {\n const date = startDate.add(i, 'week');\n const dateStr = date.format('MMM D').padEnd(8);\n calendarDates.push(dateStr);\n }\n const dateRow = ' '.repeat(SPEC_COLUMN_WIDTH) + COLUMN_SEPARATOR + calendarDates.join('');\n console.log(chalk.dim(dateRow));\n \n // Separator line\n const specSeparator = '─'.repeat(SPEC_COLUMN_WIDTH);\n const timelineSeparator = '─'.repeat(timelineColumnWidth);\n console.log(chalk.dim(specSeparator + COLUMN_SEPARATOR + timelineSeparator));\n \n // Today marker (aligned to current week)\n const todayWeekOffset = today.diff(startDate, 'week');\n const todayMarkerPos = todayWeekOffset * 8;\n let todayMarker = ' '.repeat(SPEC_COLUMN_WIDTH) + COLUMN_SEPARATOR;\n if (todayMarkerPos >= 0 && todayMarkerPos < timelineColumnWidth) {\n todayMarker += ' '.repeat(todayMarkerPos) + '│ Today';\n }\n console.log(chalk.dim(todayMarker));\n console.log('');\n\n // Display priority groups\n const priorities: SpecPriority[] = ['critical', 'high', 'medium', 'low'];\n \n for (const priority of priorities) {\n const specsInGroup = sortSpecs(groupedSpecs[priority]);\n \n // Skip empty priority groups\n if (specsInGroup.length === 0) {\n continue;\n }\n \n const config = PRIORITY_CONFIG[priority];\n \n // Show priority header with count\n console.log(config.colorFn(`${config.emoji} ${config.label} (${specsInGroup.length})`));\n \n // Display specs in this priority group\n for (const spec of specsInGroup) {\n renderSpecRow(spec, startDate, endDate, weeks, today);\n }\n \n console.log('');\n }\n\n // Summary\n const summaryParts: string[] = [];\n if (inProgress > 0) summaryParts.push(`${inProgress} in-progress`);\n if (planned > 0) summaryParts.push(`${planned} planned`);\n if (overdue > 0) summaryParts.push(chalk.red(`${overdue} overdue`));\n \n console.log(chalk.bold('Summary: ') + summaryParts.join(' · '));\n console.log(chalk.dim('💡 Tip: Add \"due: YYYY-MM-DD\" to frontmatter for timeline planning'));\n}\n\nfunction renderSpecRow(\n spec: SpecInfo,\n startDate: dayjs.Dayjs,\n endDate: dayjs.Dayjs,\n weeks: number,\n today: dayjs.Dayjs\n): void {\n const statusConfig = STATUS_CONFIG[spec.frontmatter.status];\n const timelineColumnWidth = weeks * 8;\n \n // Format spec name with status emoji\n // Format: {emoji} {spec-name} (must be exactly SPEC_COLUMN_WIDTH chars)\n const emoji = statusConfig.emoji;\n const maxNameLength = SPEC_COLUMN_WIDTH - 2; // 2 chars for emoji + space\n let specName = spec.name; // Use spec.name instead of spec.path\n \n // Truncate name if too long\n if (specName.length > maxNameLength) {\n specName = specName.substring(0, maxNameLength - 1) + '…';\n }\n \n const specColumn = `${SPEC_INDENT}${emoji} ${specName}`.padEnd(SPEC_COLUMN_WIDTH);\n \n // Build timeline column\n let timelineColumn: string;\n \n if (!spec.frontmatter.due) {\n // No due date set\n timelineColumn = chalk.dim('(no due date set)');\n } else {\n // Render timeline bar\n timelineColumn = renderTimelineBar(spec, startDate, endDate, weeks, today);\n }\n \n console.log(specColumn + COLUMN_SEPARATOR + timelineColumn);\n}\n\nfunction renderTimelineBar(\n spec: SpecInfo,\n startDate: dayjs.Dayjs,\n endDate: dayjs.Dayjs,\n weeks: number,\n today: dayjs.Dayjs\n): string {\n const charsPerWeek = 8;\n const totalChars = weeks * charsPerWeek;\n \n const due = dayjs(spec.frontmatter.due!);\n const specStart = today; // Start from today, not creation date\n \n // Calculate bar position\n const startDaysFromStart = specStart.diff(startDate, 'day');\n const dueDaysFromStart = due.diff(startDate, 'day');\n \n const startPos = Math.max(0, Math.floor((startDaysFromStart / 7) * charsPerWeek));\n const duePos = Math.floor((dueDaysFromStart / 7) * charsPerWeek);\n \n // Clamp to visible range\n const barStart = Math.max(0, startPos);\n const barEnd = Math.min(totalChars, Math.max(barStart, duePos));\n const barLength = Math.max(0, barEnd - barStart);\n \n // Build bar string\n let result = '';\n \n // Leading space\n if (barStart > 0) {\n result += ' '.repeat(barStart);\n }\n \n // Bar content based on status\n if (spec.frontmatter.status === 'complete') {\n result += chalk.green(FILLED_BAR_CHAR.repeat(barLength));\n } else if (spec.frontmatter.status === 'in-progress') {\n // Half-filled bar\n const halfLength = Math.floor(barLength / 2);\n result += chalk.yellow(FILLED_BAR_CHAR.repeat(halfLength));\n result += chalk.dim(EMPTY_BAR_CHAR.repeat(barLength - halfLength));\n } else {\n // Planned - light shade bar\n result += chalk.dim(EMPTY_BAR_CHAR.repeat(barLength));\n }\n \n // Trailing space\n const trailingSpace = totalChars - barEnd;\n if (trailingSpace > 0) {\n result += ' '.repeat(trailingSpace);\n }\n \n return result;\n}\n","/**\n * Tokens command - count tokens in specs and sub-specs\n * \n * Implements spec 069: Token Counting Utilities\n */\n\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport { TokenCounter, type TokenCount } from '@leanspec/core';\nimport { loadAllSpecs } from '../spec-loader.js';\nimport { resolveSpecPath } from '../utils/path-helpers.js';\nimport { sanitizeUserInput, withSpinner } from '../utils/ui.js';\nimport { autoCheckIfEnabled } from './check.js';\nimport { loadConfig } from '../config.js';\nimport * as path from 'node:path';\n\nexport interface TokensOptions {\n detailed?: boolean; // Show content breakdown\n includeSubSpecs?: boolean; // Count sub-spec files\n all?: boolean; // Show all specs\n sortBy?: 'tokens' | 'lines' | 'name'; // Sort order\n json?: boolean; // JSON output\n}\n\nexport function tokensCommand(): Command;\nexport function tokensCommand(specPath: string, options?: TokensOptions): Promise<void>;\nexport function tokensCommand(specPath?: string, options: TokensOptions = {}): Command | Promise<void> {\n if (typeof specPath === 'string') {\n return countSpecTokens(specPath, options);\n }\n\n return new Command('tokens')\n .description('Count tokens in spec(s) for LLM context management')\n .argument('[spec]', 'Spec to count tokens for (optional)')\n .option('--detailed', 'Show content type breakdown (code, prose, tables)')\n .option('--include-sub-specs', 'Count all sub-spec files (DESIGN.md, etc.)')\n .option('--all', 'Show all specs (when [spec] is omitted)')\n .option('--sort-by <field>', 'Sort by: tokens, lines, name (default: tokens)')\n .option('--json', 'Output as JSON')\n .action(async (specPathArg: string | undefined, opts: TokensOptions) => {\n if (specPathArg) {\n await countSpecTokens(specPathArg, opts);\n } else {\n await tokensAllCommand(opts);\n }\n });\n}\n\n/**\n * Count tokens in a single spec\n */\nexport async function countSpecTokens(specPath: string, options: TokensOptions = {}): Promise<void> {\n await autoCheckIfEnabled();\n\n const counter = new TokenCounter();\n \n try {\n // Resolve spec path (handles numbers like \"14\" or \"014\")\n const config = await loadConfig();\n const cwd = process.cwd();\n const specsDir = path.join(cwd, config.specsDir);\n const resolvedPath = await resolveSpecPath(specPath, cwd, specsDir);\n \n if (!resolvedPath) {\n throw new Error(`Spec not found: ${sanitizeUserInput(specPath)}`);\n }\n\n // Extract spec name from path\n const specName = path.basename(resolvedPath);\n \n // Count tokens\n const result = await counter.countSpec(resolvedPath, {\n detailed: options.detailed,\n includeSubSpecs: options.includeSubSpecs,\n });\n\n // JSON output\n if (options.json) {\n console.log(JSON.stringify({\n spec: specName,\n path: resolvedPath,\n ...result,\n }, null, 2));\n return;\n }\n\n // Display results\n console.log(chalk.bold.cyan(`📊 Token Count: ${specName}`));\n console.log('');\n \n // Total\n const indicators = counter.getPerformanceIndicators(result.total);\n const levelEmoji = indicators.level === 'excellent' ? '✅' :\n indicators.level === 'good' ? '👍' :\n indicators.level === 'warning' ? '⚠️' : '🔴';\n \n console.log(` Total: ${chalk.cyan(result.total.toLocaleString())} tokens ${levelEmoji}`);\n console.log('');\n\n // Files breakdown\n if (result.files.length > 1 || options.detailed) {\n console.log(chalk.bold('Files:'));\n console.log('');\n \n for (const file of result.files) {\n const lineInfo = file.lines ? chalk.dim(` (${file.lines} lines)`) : '';\n console.log(` ${file.path.padEnd(25)} ${chalk.cyan(file.tokens.toLocaleString().padStart(6))} tokens${lineInfo}`);\n }\n console.log('');\n }\n\n // Content breakdown\n if (options.detailed && result.breakdown) {\n const b = result.breakdown;\n const total = b.code + b.prose + b.tables + b.frontmatter;\n \n console.log(chalk.bold('Content Breakdown:'));\n console.log('');\n console.log(` Prose ${chalk.cyan(b.prose.toLocaleString().padStart(6))} tokens ${chalk.dim(`(${Math.round(b.prose / total * 100)}%)`)}`);\n console.log(` Code ${chalk.cyan(b.code.toLocaleString().padStart(6))} tokens ${chalk.dim(`(${Math.round(b.code / total * 100)}%)`)}`);\n console.log(` Tables ${chalk.cyan(b.tables.toLocaleString().padStart(6))} tokens ${chalk.dim(`(${Math.round(b.tables / total * 100)}%)`)}`);\n console.log(` Frontmatter ${chalk.cyan(b.frontmatter.toLocaleString().padStart(6))} tokens ${chalk.dim(`(${Math.round(b.frontmatter / total * 100)}%)`)}`);\n console.log('');\n }\n\n // Performance indicators\n console.log(chalk.bold('Performance Indicators:'));\n console.log('');\n \n const costColor = indicators.costMultiplier < 2 ? chalk.green :\n indicators.costMultiplier < 4 ? chalk.yellow :\n chalk.red;\n const effectivenessColor = indicators.effectiveness >= 95 ? chalk.green :\n indicators.effectiveness >= 85 ? chalk.yellow :\n chalk.red;\n \n console.log(` Cost multiplier: ${costColor(`${indicators.costMultiplier}x`)} ${chalk.dim('vs 1,200 token baseline')}`);\n console.log(` AI effectiveness: ${effectivenessColor(`~${indicators.effectiveness}%`)} ${chalk.dim('(hypothesis)')}`);\n console.log(` Context Economy: ${levelEmoji} ${indicators.recommendation}`);\n console.log('');\n\n // Show hint about sub-specs\n if (!options.includeSubSpecs && result.files.length === 1) {\n console.log(chalk.dim('💡 Use `--include-sub-specs` to count all sub-spec files'));\n }\n } finally {\n counter.dispose();\n }\n}\n\n/**\n * Show token counts for all specs\n */\nexport async function tokensAllCommand(options: TokensOptions = {}): Promise<void> {\n await autoCheckIfEnabled();\n\n // Load all specs\n const specs = await withSpinner(\n 'Loading specs...',\n () => loadAllSpecs({ includeArchived: false })\n );\n\n if (specs.length === 0) {\n console.log('No specs found.');\n return;\n }\n\n // Count tokens for each spec\n const counter = new TokenCounter();\n const results: Array<{\n name: string;\n path: string;\n tokens: number;\n lines: number;\n level: string;\n }> = [];\n\n try {\n for (const spec of specs) {\n const result = await counter.countSpec(spec.fullPath, {\n includeSubSpecs: options.includeSubSpecs,\n });\n \n const indicators = counter.getPerformanceIndicators(result.total);\n const totalLines = result.files.reduce((sum: number, f: { lines?: number }) => sum + (f.lines || 0), 0);\n \n results.push({\n name: spec.name,\n path: spec.fullPath,\n tokens: result.total,\n lines: totalLines,\n level: indicators.level,\n });\n }\n } finally {\n counter.dispose();\n }\n\n // Sort results\n const sortBy = options.sortBy || 'tokens';\n results.sort((a, b) => {\n if (sortBy === 'tokens') return b.tokens - a.tokens;\n if (sortBy === 'lines') return b.lines - a.lines;\n return a.name.localeCompare(b.name);\n });\n\n // JSON output\n if (options.json) {\n console.log(JSON.stringify(results, null, 2));\n return;\n }\n\n // Display results\n console.log(chalk.bold.cyan('📊 Token Counts'));\n console.log('');\n console.log(chalk.dim(`Sorted by: ${sortBy}`));\n console.log('');\n\n // Calculate stats\n const totalTokens = results.reduce((sum, r) => sum + r.tokens, 0);\n const avgTokens = Math.round(totalTokens / results.length);\n const warningCount = results.filter(r => r.level === 'warning' || r.level === 'problem').length;\n\n // Summary\n console.log(chalk.bold('Summary:'));\n console.log('');\n console.log(` Total specs: ${chalk.cyan(results.length)}`);\n console.log(` Total tokens: ${chalk.cyan(totalTokens.toLocaleString())}`);\n console.log(` Average tokens: ${chalk.cyan(avgTokens.toLocaleString())}`);\n \n if (warningCount > 0) {\n console.log(` Needs review: ${chalk.yellow(warningCount)} specs ${chalk.dim('(⚠️ or 🔴)')}`);\n }\n console.log('');\n\n // Table header\n const nameCol = 35;\n const tokensCol = 10;\n const linesCol = 8;\n \n console.log(chalk.bold(\n 'Spec'.padEnd(nameCol) + \n 'Tokens'.padStart(tokensCol) + \n 'Lines'.padStart(linesCol) + \n ' Status'\n ));\n console.log(chalk.dim('─'.repeat(nameCol + tokensCol + linesCol + 10)));\n\n // Table rows (show top 20 or all if --all)\n const displayCount = options.all ? results.length : Math.min(20, results.length);\n \n for (let i = 0; i < displayCount; i++) {\n const r = results[i];\n const emoji = r.level === 'excellent' ? '✅' :\n r.level === 'good' ? '👍' :\n r.level === 'warning' ? '⚠️' : '🔴';\n \n const tokensColor = r.level === 'excellent' || r.level === 'good' ? chalk.cyan :\n r.level === 'warning' ? chalk.yellow :\n chalk.red;\n \n const name = r.name.length > nameCol - 2 ? r.name.substring(0, nameCol - 3) + '…' : r.name;\n \n console.log(\n name.padEnd(nameCol) +\n tokensColor(r.tokens.toLocaleString().padStart(tokensCol)) +\n chalk.dim(r.lines.toString().padStart(linesCol)) +\n ` ${emoji}`\n );\n }\n\n if (results.length > displayCount) {\n console.log('');\n console.log(chalk.dim(`... and ${results.length - displayCount} more specs`));\n console.log(chalk.dim(`Use --all to show all specs`));\n }\n\n console.log('');\n console.log(chalk.dim('Legend: ✅ excellent (<2K) | 👍 good (<3.5K) | ⚠️ warning (<5K) | 🔴 problem (>5K)'));\n console.log('');\n}\n","/**\n * Analyze command - programmatic spec analysis for AI agents\n * \n * Implements spec 059: Programmatic Spec Management\n * \n * Returns structured data about spec complexity and structure.\n * AI agents use this to decide transformation strategies.\n * \n * No semantic analysis - just mechanical structure parsing.\n */\n\nimport chalk from 'chalk';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport { TokenCounter, analyzeMarkdownStructure, type Section } from '@leanspec/core';\nimport { loadConfig } from '../config.js';\nimport { resolveSpecPath } from '../utils/path-helpers.js';\nimport { sanitizeUserInput } from '../utils/ui.js';\nimport { autoCheckIfEnabled } from './check.js';\nimport { readFile } from 'node:fs/promises';\n\nexport interface AnalyzeOptions {\n json?: boolean; // Output as JSON for AI agents\n verbose?: boolean; // Include detailed breakdown\n}\n\n/**\n * Analyze command - analyze spec complexity and structure\n */\nexport function analyzeCommand(): Command {\n return new Command('analyze')\n .description('Analyze spec complexity and structure (spec 059)')\n .argument('<spec>', 'Spec to analyze')\n .option('--json', 'Output as JSON for AI agents')\n .option('--verbose', 'Include detailed section breakdown')\n .action(async (specPath: string, options: { json?: boolean; verbose?: boolean }) => {\n await analyzeSpec(specPath, options);\n });\n}\n\nexport interface AnalyzeResult {\n spec: string;\n path: string;\n metrics: {\n tokens: number;\n lines: number;\n characters: number;\n sections: {\n h1: number;\n h2: number;\n h3: number;\n h4: number;\n h5: number;\n h6: number;\n total: number;\n };\n codeBlocks: number;\n maxNesting: number;\n };\n threshold: {\n status: 'excellent' | 'good' | 'warning' | 'problem';\n limit: number;\n message: string;\n };\n structure: Array<{\n section: string;\n level: number;\n lineRange: [number, number];\n tokens: number;\n subsections: string[];\n }>;\n recommendation: {\n action: 'none' | 'compact' | 'split' | 'review';\n reason: string;\n confidence: 'low' | 'medium' | 'high';\n };\n}\n\n/**\n * Analyze spec complexity and structure\n */\nexport async function analyzeSpec(specPath: string, options: AnalyzeOptions = {}): Promise<void> {\n await autoCheckIfEnabled();\n\n const counter = new TokenCounter();\n \n try {\n // Resolve spec path\n const config = await loadConfig();\n const cwd = process.cwd();\n const specsDir = path.join(cwd, config.specsDir);\n const resolvedPath = await resolveSpecPath(specPath, cwd, specsDir);\n \n if (!resolvedPath) {\n throw new Error(`Spec not found: ${sanitizeUserInput(specPath)}`);\n }\n\n // Read spec content\n const specName = path.basename(resolvedPath);\n const readmePath = path.join(resolvedPath, 'README.md');\n const content = await readFile(readmePath, 'utf-8');\n \n // Analyze structure\n const structure = analyzeMarkdownStructure(content);\n \n // Count tokens\n const tokenResult = await counter.countSpec(resolvedPath, {\n detailed: true,\n includeSubSpecs: false, // Only analyze README.md for structure\n });\n \n // Get performance indicators\n const indicators = counter.getPerformanceIndicators(tokenResult.total);\n \n // Calculate tokens per section (estimate based on line count)\n const sectionsWithTokens = await Promise.all(\n structure.allSections.map(async (section) => {\n const sectionContent = content.split('\\n').slice(section.startLine - 1, section.endLine).join('\\n');\n const sectionTokens = await counter.countTokensInContent(sectionContent);\n \n return {\n section: section.title,\n level: section.level,\n lineRange: [section.startLine, section.endLine] as [number, number],\n tokens: sectionTokens,\n subsections: section.subsections.map(s => s.title),\n };\n })\n );\n \n // Generate recommendation\n const recommendation = generateRecommendation(tokenResult.total, structure, indicators.level);\n \n // Build result\n const result: AnalyzeResult = {\n spec: specName,\n path: resolvedPath,\n metrics: {\n tokens: tokenResult.total,\n lines: structure.lines,\n characters: content.length,\n sections: structure.sectionsByLevel,\n codeBlocks: structure.codeBlocks,\n maxNesting: structure.maxNesting,\n },\n threshold: {\n status: indicators.level,\n limit: getThresholdLimit(indicators.level),\n message: indicators.recommendation,\n },\n structure: sectionsWithTokens,\n recommendation,\n };\n\n // Output as JSON\n if (options.json) {\n console.log(JSON.stringify(result, null, 2));\n return;\n }\n\n // Display human-readable output\n displayAnalysis(result, options.verbose);\n \n } finally {\n counter.dispose();\n }\n}\n\n/**\n * Generate transformation recommendation\n */\nfunction generateRecommendation(\n tokens: number,\n structure: ReturnType<typeof analyzeMarkdownStructure>,\n level: string\n): AnalyzeResult['recommendation'] {\n // Excellent - no action needed\n if (tokens < 2000) {\n return {\n action: 'none',\n reason: 'Spec is under 2,000 tokens (optimal)',\n confidence: 'high',\n };\n }\n \n // Good - might benefit from compaction\n if (tokens < 3500) {\n return {\n action: 'compact',\n reason: 'Spec could benefit from removing redundancy',\n confidence: 'medium',\n };\n }\n \n // Warning - should split\n if (tokens < 5000) {\n // Check if we have clear concerns (h2 sections)\n const h2Count = structure.sectionsByLevel.h2;\n \n if (h2Count >= 3) {\n return {\n action: 'split',\n reason: `Exceeds 3,500 token threshold with ${h2Count} concerns`,\n confidence: 'high',\n };\n } else {\n return {\n action: 'split',\n reason: 'Exceeds 3,500 token threshold',\n confidence: 'medium',\n };\n }\n }\n \n // Problem - must split\n return {\n action: 'split',\n reason: 'Critically oversized - must split immediately',\n confidence: 'high',\n };\n}\n\n/**\n * Get threshold limit for status\n */\nfunction getThresholdLimit(level: string): number {\n switch (level) {\n case 'excellent': return 2000;\n case 'good': return 3500;\n case 'warning': return 5000;\n case 'problem': return 5000;\n default: return 2000;\n }\n}\n\n/**\n * Display analysis in human-readable format\n */\nfunction displayAnalysis(result: AnalyzeResult, verbose?: boolean): void {\n console.log(chalk.bold.cyan(`📊 Spec Analysis: ${result.spec}`));\n console.log('');\n \n // Token count with status indicator\n const statusEmoji = result.threshold.status === 'excellent' ? '✅' :\n result.threshold.status === 'good' ? '👍' :\n result.threshold.status === 'warning' ? '⚠️' : '🔴';\n \n const tokenColor = result.threshold.status === 'excellent' || result.threshold.status === 'good' ? chalk.cyan :\n result.threshold.status === 'warning' ? chalk.yellow :\n chalk.red;\n \n console.log(chalk.bold('Token Count:'), tokenColor(result.metrics.tokens.toLocaleString()), 'tokens', statusEmoji);\n console.log(chalk.dim(` Threshold: ${result.threshold.limit.toLocaleString()} tokens`));\n console.log(chalk.dim(` Status: ${result.threshold.message}`));\n console.log('');\n \n // Structure metrics\n console.log(chalk.bold('Structure:'));\n console.log(` Lines: ${chalk.cyan(result.metrics.lines.toLocaleString())}`);\n console.log(` Sections: ${chalk.cyan(result.metrics.sections.total)} (H1:${result.metrics.sections.h1}, H2:${result.metrics.sections.h2}, H3:${result.metrics.sections.h3}, H4:${result.metrics.sections.h4})`);\n console.log(` Code blocks: ${chalk.cyan(result.metrics.codeBlocks)}`);\n console.log(` Max nesting: ${chalk.cyan(result.metrics.maxNesting)} levels`);\n console.log('');\n \n // Top sections by size\n if (verbose && result.structure.length > 0) {\n const topSections = result.structure\n .filter(s => s.level <= 2) // Only show h1 and h2\n .sort((a, b) => b.tokens - a.tokens)\n .slice(0, 5);\n \n console.log(chalk.bold('Top Sections by Size:'));\n console.log('');\n \n for (let i = 0; i < topSections.length; i++) {\n const s = topSections[i];\n const percentage = Math.round((s.tokens / result.metrics.tokens) * 100);\n const indent = ' '.repeat(s.level - 1);\n \n console.log(` ${i + 1}. ${indent}${s.section}`);\n console.log(` ${chalk.cyan(s.tokens.toLocaleString())} tokens / ${s.lineRange[1] - s.lineRange[0] + 1} lines ${chalk.dim(`(${percentage}%)`)}`);\n console.log(chalk.dim(` Lines ${s.lineRange[0]}-${s.lineRange[1]}`));\n }\n console.log('');\n }\n \n // Recommendation\n const actionColor = result.recommendation.action === 'none' ? chalk.green :\n result.recommendation.action === 'compact' ? chalk.yellow :\n result.recommendation.action === 'split' ? chalk.red :\n chalk.blue;\n \n console.log(chalk.bold('Recommendation:'), actionColor(result.recommendation.action.toUpperCase()));\n console.log(chalk.dim(` ${result.recommendation.reason}`));\n console.log(chalk.dim(` Confidence: ${result.recommendation.confidence}`));\n console.log('');\n \n // Hints\n if (result.recommendation.action === 'split') {\n console.log(chalk.dim('💡 Use `lean-spec split` to partition into sub-specs'));\n console.log(chalk.dim('💡 Consider splitting by H2 sections (concerns)'));\n } else if (result.recommendation.action === 'compact') {\n console.log(chalk.dim('💡 Use `lean-spec compact` to remove redundancy'));\n }\n \n console.log('');\n}\n","/**\n * Split command - partition spec into sub-spec files\n * \n * Implements spec 059: Programmatic Spec Management\n * \n * Mechanically splits spec based on explicit line ranges.\n * AI agents decide what goes where, this tool executes.\n * \n * No semantic analysis - just mechanical file operations.\n */\n\nimport chalk from 'chalk';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport { readFile, writeFile, mkdir } from 'node:fs/promises';\nimport { \n extractLines, \n countLines,\n parseFrontmatterFromString,\n createUpdatedFrontmatter,\n} from '@leanspec/core';\nimport { loadConfig } from '../config.js';\nimport { resolveSpecPath } from '../utils/path-helpers.js';\nimport { sanitizeUserInput } from '../utils/ui.js';\nimport { autoCheckIfEnabled } from './check.js';\n\nexport interface SplitOptions {\n outputs: Array<{\n file: string;\n lines: string; // Format: \"1-150\" or \"151-528\"\n }>;\n updateRefs?: boolean; // Update cross-references in README\n dryRun?: boolean; // Show what would be created\n force?: boolean; // Overwrite existing files\n}\n\ninterface ParsedOutput {\n file: string;\n startLine: number;\n endLine: number;\n}\n\n// Helper function to collect multiple --output options\nfunction collectOutputs(value: string, previous: string[]): string[] {\n return previous.concat([value]);\n}\n\n/**\n * Split command - split spec into multiple files\n */\nexport function splitCommand(): Command {\n return new Command('split')\n .description('Split spec into multiple files by line ranges (spec 059)')\n .argument('<spec>', 'Spec to split')\n .option('--output <file:lines>', 'Output file with line range (e.g., README.md:1-150)', collectOutputs, [])\n .option('--update-refs', 'Update cross-references in README.md')\n .option('--dry-run', 'Show what would be created without making changes')\n .option('--force', 'Overwrite existing files')\n .action(async (specPath: string, options: { \n output: Array<string>;\n updateRefs?: boolean;\n dryRun?: boolean;\n force?: boolean;\n }) => {\n const outputs = options.output.map((opt: string) => {\n const [file, lines] = opt.split(':');\n if (!file || !lines) {\n throw new Error(`Invalid --output format: ${opt}. Expected: file.md:1-150`);\n }\n return { file, lines };\n });\n await splitSpec(specPath, {\n outputs,\n updateRefs: options.updateRefs,\n dryRun: options.dryRun,\n force: options.force,\n });\n });\n}\n\n/**\n * Split spec into multiple files\n */\nexport async function splitSpec(specPath: string, options: SplitOptions): Promise<void> {\n await autoCheckIfEnabled();\n \n try {\n // Validate options\n if (!options.outputs || options.outputs.length === 0) {\n throw new Error('At least one --output option is required');\n }\n \n // Resolve spec path\n const config = await loadConfig();\n const cwd = process.cwd();\n const specsDir = path.join(cwd, config.specsDir);\n const resolvedPath = await resolveSpecPath(specPath, cwd, specsDir);\n \n if (!resolvedPath) {\n throw new Error(`Spec not found: ${sanitizeUserInput(specPath)}`);\n }\n\n // Read source spec\n const specName = path.basename(resolvedPath);\n const readmePath = path.join(resolvedPath, 'README.md');\n const content = await readFile(readmePath, 'utf-8');\n \n // Parse output specifications\n const parsedOutputs = parseOutputSpecs(options.outputs);\n \n // Validate no overlapping ranges\n validateNoOverlaps(parsedOutputs);\n \n // Extract content for each output\n const extractions: Array<{\n file: string;\n content: string;\n tokens: number;\n lines: number;\n }> = [];\n \n for (const output of parsedOutputs) {\n const extracted = extractLines(content, output.startLine, output.endLine);\n const lineCount = countLines(extracted);\n \n extractions.push({\n file: output.file,\n content: extracted,\n tokens: 0, // Will be calculated in dry-run or actual execution\n lines: lineCount,\n });\n }\n \n // Dry run mode\n if (options.dryRun) {\n await displayDryRun(specName, extractions);\n return;\n }\n \n // Execute split\n await executeSplit(resolvedPath, specName, content, extractions, options);\n \n } catch (error) {\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n throw error;\n }\n}\n\n/**\n * Parse output specifications from command line\n */\nfunction parseOutputSpecs(outputs: SplitOptions['outputs']): ParsedOutput[] {\n const parsed: ParsedOutput[] = [];\n \n for (const output of outputs) {\n // Format: \"file.md:1-150\" or \"file.md:151-528\"\n const match = output.lines.match(/^(\\d+)-(\\d+)$/);\n \n if (!match) {\n throw new Error(`Invalid line range format: ${output.lines}. Expected format: \"1-150\"`);\n }\n \n const startLine = parseInt(match[1], 10);\n const endLine = parseInt(match[2], 10);\n \n if (startLine < 1 || endLine < startLine) {\n throw new Error(`Invalid line range: ${output.lines}`);\n }\n \n parsed.push({\n file: output.file,\n startLine,\n endLine,\n });\n }\n \n return parsed;\n}\n\n/**\n * Validate no overlapping line ranges\n */\nfunction validateNoOverlaps(outputs: ParsedOutput[]): void {\n const sorted = [...outputs].sort((a, b) => a.startLine - b.startLine);\n \n for (let i = 0; i < sorted.length - 1; i++) {\n const current = sorted[i];\n const next = sorted[i + 1];\n \n if (current.endLine >= next.startLine) {\n throw new Error(\n `Overlapping line ranges: ${current.file} (${current.startLine}-${current.endLine}) ` +\n `overlaps with ${next.file} (${next.startLine}-${next.endLine})`\n );\n }\n }\n}\n\n/**\n * Display dry-run output\n */\nasync function displayDryRun(\n specName: string,\n extractions: Array<{ file: string; content: string; lines: number }>\n): Promise<void> {\n console.log(chalk.bold.cyan(`📋 Split Preview: ${specName}`));\n console.log('');\n \n console.log(chalk.bold('Would create:'));\n console.log('');\n \n for (const ext of extractions) {\n console.log(` ${chalk.cyan(ext.file)}`);\n console.log(` Lines: ${ext.lines}`);\n \n // Show first few lines as preview\n const previewLines = ext.content.split('\\n').slice(0, 3);\n console.log(chalk.dim(' Preview:'));\n for (const line of previewLines) {\n console.log(chalk.dim(` ${line.substring(0, 60)}${line.length > 60 ? '...' : ''}`));\n }\n console.log('');\n }\n \n console.log(chalk.dim('No files modified (dry run)'));\n console.log(chalk.dim('Run without --dry-run to apply changes'));\n console.log('');\n}\n\n/**\n * Execute the split operation\n */\nasync function executeSplit(\n specPath: string,\n specName: string,\n originalContent: string,\n extractions: Array<{ file: string; content: string; lines: number }>,\n options: SplitOptions\n): Promise<void> {\n console.log(chalk.bold.cyan(`✂️ Splitting: ${specName}`));\n console.log('');\n \n // Parse frontmatter from original\n const frontmatter = parseFrontmatterFromString(originalContent);\n \n // Create each output file\n for (const ext of extractions) {\n const outputPath = path.join(specPath, ext.file);\n \n // For README.md, include frontmatter\n let finalContent = ext.content;\n if (ext.file === 'README.md' && frontmatter) {\n // Rebuild with frontmatter\n const { content: contentWithFrontmatter } = createUpdatedFrontmatter(\n ext.content,\n frontmatter\n );\n finalContent = contentWithFrontmatter;\n }\n \n await writeFile(outputPath, finalContent, 'utf-8');\n \n console.log(chalk.green(`✓ Created ${ext.file} (${ext.lines} lines)`));\n }\n \n // Update README.md to add sub-spec links if requested\n if (options.updateRefs) {\n const readmePath = path.join(specPath, 'README.md');\n const readmeContent = await readFile(readmePath, 'utf-8');\n \n // Add sub-specs section if it doesn't exist\n const updatedReadme = await addSubSpecLinks(\n readmeContent,\n extractions.map(e => e.file).filter(f => f !== 'README.md')\n );\n \n await writeFile(readmePath, updatedReadme, 'utf-8');\n console.log(chalk.green(`✓ Updated README.md with sub-spec links`));\n }\n \n console.log('');\n console.log(chalk.bold.green('Split complete!'));\n console.log(chalk.dim(`Created ${extractions.length} files in ${specName}`));\n console.log('');\n}\n\n/**\n * Add sub-spec links to README\n */\nasync function addSubSpecLinks(content: string, subSpecs: string[]): Promise<string> {\n if (subSpecs.length === 0) {\n return content;\n }\n \n // Check if sub-specs section already exists\n if (content.includes('## Sub-Specs') || content.includes('## Sub-specs')) {\n // Section exists, don't modify\n return content;\n }\n \n // Find a good place to insert (after overview/decision, before implementation)\n const lines = content.split('\\n');\n let insertIndex = -1;\n \n // Look for common section markers\n for (let i = 0; i < lines.length; i++) {\n const line = lines[i].toLowerCase();\n if (line.includes('## implementation') || \n line.includes('## plan') || \n line.includes('## test')) {\n insertIndex = i;\n break;\n }\n }\n \n // If no good spot found, add at end\n if (insertIndex === -1) {\n insertIndex = lines.length;\n }\n \n // Build sub-specs section\n const subSpecsSection = [\n '',\n '## Sub-Specs',\n '',\n 'This spec is organized using sub-spec files:',\n '',\n ...subSpecs.map(file => {\n const name = file.replace('.md', '');\n return `- **[${name}](./${file})** - ${getFileDescription(file)}`;\n }),\n '',\n ];\n \n // Insert section\n lines.splice(insertIndex, 0, ...subSpecsSection);\n \n return lines.join('\\n');\n}\n\n/**\n * Get description for common sub-spec files\n */\nfunction getFileDescription(file: string): string {\n const lower = file.toLowerCase();\n \n if (lower.includes('design')) return 'Architecture and design details';\n if (lower.includes('implementation')) return 'Implementation plan and phases';\n if (lower.includes('testing') || lower.includes('test')) return 'Test strategy and cases';\n if (lower.includes('rationale')) return 'Design rationale and decisions';\n if (lower.includes('api')) return 'API specification';\n if (lower.includes('migration')) return 'Migration plan and strategy';\n if (lower.includes('context')) return 'Context and research';\n \n return 'Additional documentation';\n}\n","/**\n * Compact command - remove specified content\n * \n * Implements spec 059: Programmatic Spec Management\n * \n * Mechanically removes specified line ranges.\n * AI agents identify redundancy, this tool executes removal.\n * \n * No semantic analysis - just mechanical deletion.\n */\n\nimport chalk from 'chalk';\nimport * as path from 'node:path';\nimport { Command } from 'commander';\nimport { readFile, writeFile } from 'node:fs/promises';\nimport { removeLines, countLines, extractLines } from '@leanspec/core';\nimport { loadConfig } from '../config.js';\nimport { resolveSpecPath } from '../utils/path-helpers.js';\nimport { sanitizeUserInput } from '../utils/ui.js';\nimport { autoCheckIfEnabled } from './check.js';\n\nexport interface CompactOptions {\n removes: string[]; // Array of line ranges like \"145-153\"\n dryRun?: boolean; // Show what would be removed\n force?: boolean; // Skip confirmation\n}\n\ninterface ParsedRemove {\n startLine: number;\n endLine: number;\n originalIndex: number; // Track original order for better reporting\n}\n\n// Helper function to collect multiple --remove options\nfunction collectRemoves(value: string, previous: string[]): string[] {\n return previous.concat([value]);\n}\n\n/**\n * Compact command - remove specified line ranges\n */\nexport function compactCommand(): Command {\n return new Command('compact')\n .description('Remove specified line ranges from spec (spec 059)')\n .argument('<spec>', 'Spec to compact')\n .option('--remove <lines>', 'Line range to remove (e.g., 145-153)', collectRemoves, [])\n .option('--dry-run', 'Show what would be removed without making changes')\n .option('--force', 'Skip confirmation')\n .action(async (specPath: string, options: { remove: string[]; dryRun?: boolean; force?: boolean }) => {\n await compactSpec(specPath, {\n removes: options.remove,\n dryRun: options.dryRun,\n force: options.force,\n });\n });\n}\n\n/**\n * Compact spec by removing specified line ranges\n */\nexport async function compactSpec(specPath: string, options: CompactOptions): Promise<void> {\n await autoCheckIfEnabled();\n \n try {\n // Validate options\n if (!options.removes || options.removes.length === 0) {\n throw new Error('At least one --remove option is required');\n }\n \n // Resolve spec path\n const config = await loadConfig();\n const cwd = process.cwd();\n const specsDir = path.join(cwd, config.specsDir);\n const resolvedPath = await resolveSpecPath(specPath, cwd, specsDir);\n \n if (!resolvedPath) {\n throw new Error(`Spec not found: ${sanitizeUserInput(specPath)}`);\n }\n\n // Read source spec\n const specName = path.basename(resolvedPath);\n const readmePath = path.join(resolvedPath, 'README.md');\n const content = await readFile(readmePath, 'utf-8');\n \n // Parse remove specifications\n const parsedRemoves = parseRemoveSpecs(options.removes);\n \n // Validate no overlapping ranges\n validateNoOverlaps(parsedRemoves);\n \n // Dry run mode\n if (options.dryRun) {\n await displayDryRun(specName, content, parsedRemoves);\n return;\n }\n \n // Execute compaction\n await executeCompact(readmePath, specName, content, parsedRemoves);\n \n } catch (error) {\n if (error instanceof Error) {\n console.error(chalk.red(`Error: ${error.message}`));\n }\n throw error;\n }\n}\n\n/**\n * Parse remove specifications from command line\n */\nfunction parseRemoveSpecs(removes: string[]): ParsedRemove[] {\n const parsed: ParsedRemove[] = [];\n \n for (let i = 0; i < removes.length; i++) {\n const spec = removes[i];\n \n // Format: \"145-153\" or \"234-256\"\n const match = spec.match(/^(\\d+)-(\\d+)$/);\n \n if (!match) {\n throw new Error(`Invalid line range format: ${spec}. Expected format: \"145-153\"`);\n }\n \n const startLine = parseInt(match[1], 10);\n const endLine = parseInt(match[2], 10);\n \n if (startLine < 1 || endLine < startLine) {\n throw new Error(`Invalid line range: ${spec}`);\n }\n \n parsed.push({\n startLine,\n endLine,\n originalIndex: i,\n });\n }\n \n return parsed;\n}\n\n/**\n * Validate no overlapping line ranges\n */\nfunction validateNoOverlaps(removes: ParsedRemove[]): void {\n const sorted = [...removes].sort((a, b) => a.startLine - b.startLine);\n \n for (let i = 0; i < sorted.length - 1; i++) {\n const current = sorted[i];\n const next = sorted[i + 1];\n \n if (current.endLine >= next.startLine) {\n throw new Error(\n `Overlapping line ranges: ${current.startLine}-${current.endLine} ` +\n `overlaps with ${next.startLine}-${next.endLine}`\n );\n }\n }\n}\n\n/**\n * Display dry-run output\n */\nasync function displayDryRun(\n specName: string,\n content: string,\n removes: ParsedRemove[]\n): Promise<void> {\n console.log(chalk.bold.cyan(`📋 Compact Preview: ${specName}`));\n console.log('');\n \n console.log(chalk.bold('Would remove:'));\n console.log('');\n \n let totalLines = 0;\n \n for (const remove of removes) {\n const lineCount = remove.endLine - remove.startLine + 1;\n totalLines += lineCount;\n \n // Extract content to show what will be removed\n const removedContent = extractLines(content, remove.startLine, remove.endLine);\n const previewLines = removedContent.split('\\n').slice(0, 3);\n \n console.log(` Lines ${remove.startLine}-${remove.endLine} (${lineCount} lines)`);\n console.log(chalk.dim(' Preview:'));\n for (const line of previewLines) {\n console.log(chalk.dim(` ${line.substring(0, 60)}${line.length > 60 ? '...' : ''}`));\n }\n if (removedContent.split('\\n').length > 3) {\n console.log(chalk.dim(` ... (${removedContent.split('\\n').length - 3} more lines)`));\n }\n console.log('');\n }\n \n // Calculate stats\n const originalLines = countLines(content);\n const remainingLines = originalLines - totalLines;\n const percentage = Math.round((totalLines / originalLines) * 100);\n \n console.log(chalk.bold('Summary:'));\n console.log(` Original lines: ${chalk.cyan(originalLines)}`);\n console.log(` Removing: ${chalk.yellow(totalLines)} lines (${percentage}%)`);\n console.log(` Remaining lines: ${chalk.cyan(remainingLines)}`);\n console.log('');\n \n console.log(chalk.dim('No files modified (dry run)'));\n console.log(chalk.dim('Run without --dry-run to apply changes'));\n console.log('');\n}\n\n/**\n * Execute the compaction operation\n */\nasync function executeCompact(\n readmePath: string,\n specName: string,\n content: string,\n removes: ParsedRemove[]\n): Promise<void> {\n console.log(chalk.bold.cyan(`🗜️ Compacting: ${specName}`));\n console.log('');\n \n // Sort removes in reverse order to maintain line numbers during removal\n const sorted = [...removes].sort((a, b) => b.startLine - a.startLine);\n \n // Apply each removal\n let updatedContent = content;\n let totalRemoved = 0;\n \n for (const remove of sorted) {\n const lineCount = remove.endLine - remove.startLine + 1;\n updatedContent = removeLines(updatedContent, remove.startLine, remove.endLine);\n totalRemoved += lineCount;\n \n console.log(chalk.green(`✓ Removed lines ${remove.startLine}-${remove.endLine} (${lineCount} lines)`));\n }\n \n // Write updated content\n await writeFile(readmePath, updatedContent, 'utf-8');\n \n // Calculate final stats\n const originalLines = countLines(content);\n const finalLines = countLines(updatedContent);\n const percentage = Math.round((totalRemoved / originalLines) * 100);\n \n console.log('');\n console.log(chalk.bold.green('Compaction complete!'));\n console.log(chalk.dim(`Removed ${totalRemoved} lines (${percentage}%)`));\n console.log(chalk.dim(`${originalLines} → ${finalLines} lines`));\n console.log('');\n}\n","import * as fs from 'node:fs/promises';\nimport * as path from 'node:path';\nimport chalk from 'chalk';\nimport { Command } from 'commander';\nimport { marked } from 'marked';\nimport { markedTerminal } from 'marked-terminal';\nimport { loadConfig } from '../config.js';\nimport { resolveSpecPath } from '../utils/path-helpers.js';\nimport { getSpecFile, parseFrontmatter } from '../frontmatter.js';\nimport type { SpecFrontmatter } from '../frontmatter.js';\nimport { spawn } from 'node:child_process';\n\n// Configure marked for terminal output\nmarked.use(markedTerminal() as Parameters<typeof marked.use>[0]);\n\ninterface SpecContent {\n frontmatter: SpecFrontmatter;\n content: string;\n rawContent: string;\n path: string;\n name: string;\n fullPath?: string; // Full absolute path to spec directory for sub-spec loading\n}\n\nexport interface ViewOptions {\n raw?: boolean;\n json?: boolean;\n noColor?: boolean;\n}\n\n/**\n * Read and parse a spec by path/name/number\n * Supports sub-spec files like: \"045/DESIGN.md\" or \"045-dashboard/TESTING.md\"\n */\nexport async function readSpecContent(\n specPath: string,\n cwd: string = process.cwd()\n): Promise<SpecContent | null> {\n const config = await loadConfig(cwd);\n const specsDir = path.join(cwd, config.specsDir);\n\n // Check if specPath includes a sub-file (e.g., \"045/DESIGN.md\" or \"045-dashboard/TESTING.md\")\n let resolvedPath: string | null = null;\n let targetFile: string | null = null;\n \n // Split path to check for sub-file\n const pathParts = specPath.split('/').filter(p => p);\n \n if (pathParts.length > 1 && pathParts[pathParts.length - 1].endsWith('.md')) {\n // Last part looks like a file, try to resolve the directory\n const specPart = pathParts.slice(0, -1).join('/');\n const filePart = pathParts[pathParts.length - 1];\n \n resolvedPath = await resolveSpecPath(specPart, cwd, specsDir);\n if (resolvedPath) {\n targetFile = path.join(resolvedPath, filePart);\n \n // Verify the sub-file exists\n try {\n await fs.access(targetFile);\n } catch {\n // Sub-file doesn't exist\n return null;\n }\n }\n }\n \n // If no sub-file detected or resolution failed, try normal spec resolution\n if (!resolvedPath) {\n resolvedPath = await resolveSpecPath(specPath, cwd, specsDir);\n \n if (!resolvedPath) {\n return null;\n }\n\n // Get the default spec file (README.md)\n targetFile = await getSpecFile(resolvedPath, config.structure.defaultFile);\n \n if (!targetFile) {\n return null;\n }\n }\n\n // Ensure targetFile is not null before proceeding\n if (!targetFile) {\n return null;\n }\n\n // Read file content\n const rawContent = await fs.readFile(targetFile, 'utf-8');\n const fileName = path.basename(targetFile);\n const isSubSpec = fileName !== config.structure.defaultFile;\n\n // Parse frontmatter (only exists in main spec file)\n let frontmatter: SpecFrontmatter | null = null;\n \n if (!isSubSpec) {\n frontmatter = await parseFrontmatter(targetFile, config);\n if (!frontmatter) {\n return null;\n }\n } else {\n // Sub-spec files don't have frontmatter, load from main spec\n const mainSpecFile = await getSpecFile(resolvedPath, config.structure.defaultFile);\n if (mainSpecFile) {\n frontmatter = await parseFrontmatter(mainSpecFile, config);\n }\n \n // If we still can't get frontmatter, create a minimal one\n if (!frontmatter) {\n frontmatter = {\n status: 'planned',\n created: new Date().toISOString().split('T')[0],\n };\n }\n }\n\n // Extract content without frontmatter (if present)\n const lines = rawContent.split('\\n');\n let contentStartIndex = 0;\n \n // Skip frontmatter if present (only in main spec)\n if (!isSubSpec && lines[0] === '---') {\n const closingIndex = lines.findIndex((line, i) => i > 0 && line === '---');\n if (closingIndex > 0) {\n contentStartIndex = closingIndex + 1;\n }\n }\n \n const content = lines.slice(contentStartIndex).join('\\n').trim();\n const specName = path.basename(resolvedPath);\n const displayName = isSubSpec ? `${specName}/${fileName}` : specName;\n\n return {\n frontmatter,\n content,\n rawContent,\n path: resolvedPath,\n name: displayName,\n fullPath: resolvedPath, // Add fullPath for sub-spec loading\n };\n}\n\n/**\n * Format frontmatter for display\n */\nfunction formatFrontmatter(frontmatter: SpecFrontmatter): string {\n const lines: string[] = [];\n \n // Status with emoji\n const statusEmojis = {\n planned: '📅',\n 'in-progress': '🔨',\n complete: '✅',\n blocked: '🚫',\n cancelled: '❌',\n archived: '📦',\n };\n const statusEmoji = statusEmojis[frontmatter.status] || '📄';\n lines.push(chalk.bold(`${statusEmoji} Status: `) + chalk.cyan(frontmatter.status));\n\n // Priority with emoji\n if (frontmatter.priority) {\n const priorityEmojis = {\n low: '🟢',\n medium: '🟠',\n high: '🟡',\n critical: '🔴',\n };\n const priorityEmoji = priorityEmojis[frontmatter.priority] || '';\n lines.push(chalk.bold(`${priorityEmoji} Priority: `) + chalk.yellow(frontmatter.priority));\n }\n\n // Created date\n if (frontmatter.created) {\n lines.push(chalk.bold('📆 Created: ') + chalk.gray(String(frontmatter.created)));\n }\n\n // Tags\n if (frontmatter.tags && frontmatter.tags.length > 0) {\n const tagStr = frontmatter.tags.map(tag => chalk.blue(`#${tag}`)).join(' ');\n lines.push(chalk.bold('🏷️ Tags: ') + tagStr);\n }\n\n // Assignee\n if (frontmatter.assignee) {\n lines.push(chalk.bold('👤 Assignee: ') + chalk.green(frontmatter.assignee));\n }\n\n // Custom fields\n const standardFields = ['status', 'priority', 'created', 'tags', 'assignee'];\n const customFields = Object.entries(frontmatter)\n .filter(([key]) => !standardFields.includes(key))\n .filter(([_, value]) => value !== undefined && value !== null);\n\n if (customFields.length > 0) {\n lines.push('');\n lines.push(chalk.bold('Custom Fields:'));\n for (const [key, value] of customFields) {\n lines.push(` ${chalk.gray(key)}: ${chalk.white(String(value))}`);\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Display spec with formatted output\n */\nfunction displayFormattedSpec(spec: SpecContent): string {\n const output: string[] = [];\n \n // Header\n output.push('');\n output.push(chalk.bold.cyan(`━━━ ${spec.name} ━━━`));\n output.push('');\n \n // Frontmatter\n output.push(formatFrontmatter(spec.frontmatter));\n output.push('');\n output.push(chalk.gray('─'.repeat(60)));\n output.push('');\n \n return output.join('\\n');\n}\n\nexport function viewCommand(): Command;\nexport function viewCommand(specPath: string, options?: ViewOptions): Promise<void>;\nexport function viewCommand(specPath?: string, options: ViewOptions = {}): Command | Promise<void> {\n if (typeof specPath === 'string') {\n return viewSpec(specPath, options);\n }\n\n return new Command('view')\n .description('View spec content (supports sub-specs like \"045/DESIGN.md\")')\n .argument('<spec>', 'Spec to view')\n .option('--raw', 'Output raw markdown (for piping/scripting)')\n .option('--json', 'Output as JSON')\n .option('--no-color', 'Disable colors')\n .action(async (target: string, opts: { raw?: boolean; json?: boolean; color?: boolean }) => {\n try {\n await viewSpec(target, {\n raw: opts.raw,\n json: opts.json,\n noColor: opts.color === false,\n });\n } catch (error) {\n console.error('\\x1b[31mError:\\x1b[0m', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n}\n\n/**\n * lean-spec view <spec-name>\n * Display spec with rendered markdown, or output raw/json\n */\nexport async function viewSpec(\n specPath: string,\n options: ViewOptions = {}\n): Promise<void> {\n const spec = await readSpecContent(specPath, process.cwd());\n \n if (!spec) {\n throw new Error(`Spec not found: ${specPath}. Try: lean-spec list`);\n }\n\n // Handle JSON output\n if (options.json) {\n const jsonOutput = {\n name: spec.name,\n path: spec.path,\n frontmatter: spec.frontmatter,\n content: spec.content,\n };\n console.log(JSON.stringify(jsonOutput, null, 2));\n return;\n }\n\n // Handle raw markdown output\n if (options.raw) {\n console.log(spec.rawContent);\n return;\n }\n\n // Default: Display formatted header and frontmatter\n console.log(displayFormattedSpec(spec));\n \n // Render markdown content\n const rendered = await marked(spec.content);\n console.log(rendered);\n}\n\n/**\n * Open command - open spec in editor\n */\nexport interface OpenOptions {\n editor?: string;\n}\n\nexport function openCommand(): Command;\nexport function openCommand(specPath: string, options?: OpenOptions): Promise<void>;\nexport function openCommand(specPath?: string, options: OpenOptions = {}): Command | Promise<void> {\n if (typeof specPath === 'string') {\n return openSpec(specPath, options);\n }\n\n return new Command('open')\n .description('Open spec in editor')\n .argument('<spec>', 'Spec to open')\n .option('--editor <editor>', 'Specify editor command')\n .action(async (target: string, opts: OpenOptions) => {\n try {\n await openSpec(target, {\n editor: opts.editor,\n });\n } catch (error) {\n console.error('\\x1b[31mError:\\x1b[0m', error instanceof Error ? error.message : String(error));\n process.exit(1);\n }\n });\n}\n\n/**\n * lean-spec open <spec-name>\n * Open spec in editor\n */\nexport async function openSpec(\n specPath: string,\n options: OpenOptions = {}\n): Promise<void> {\n const cwd = process.cwd();\n const config = await loadConfig(cwd);\n const specsDir = path.join(cwd, config.specsDir);\n\n // Check if specPath includes a sub-file\n let resolvedPath: string | null = null;\n let targetFile: string | null = null;\n \n const pathParts = specPath.split('/').filter(p => p);\n \n if (pathParts.length > 1 && pathParts[pathParts.length - 1].endsWith('.md')) {\n // Last part looks like a file\n const specPart = pathParts.slice(0, -1).join('/');\n const filePart = pathParts[pathParts.length - 1];\n \n resolvedPath = await resolveSpecPath(specPart, cwd, specsDir);\n if (resolvedPath) {\n targetFile = path.join(resolvedPath, filePart);\n \n // Verify the sub-file exists\n try {\n await fs.access(targetFile);\n } catch {\n targetFile = null;\n }\n }\n }\n \n // If no sub-file detected, use default file\n if (!resolvedPath) {\n resolvedPath = await resolveSpecPath(specPath, cwd, specsDir);\n \n if (!resolvedPath) {\n throw new Error(`Spec not found: ${specPath}`);\n }\n\n targetFile = await getSpecFile(resolvedPath, config.structure.defaultFile);\n \n if (!targetFile) {\n throw new Error(`Spec file not found in: ${resolvedPath}`);\n }\n } else if (!targetFile) {\n throw new Error(`Sub-spec file not found: ${specPath}`);\n }\n \n const specFile = targetFile;\n\n // Determine editor\n let editor = options.editor;\n \n if (!editor) {\n // Check environment variables\n editor = process.env.VISUAL || process.env.EDITOR;\n }\n\n if (!editor) {\n // Fall back to system defaults\n const platform = process.platform;\n if (platform === 'darwin') {\n editor = 'open';\n } else if (platform === 'win32') {\n editor = 'start';\n } else {\n editor = 'xdg-open';\n }\n }\n\n console.log(chalk.gray(`Opening ${targetFile} with ${editor}...`));\n\n // Spawn editor process - wrap in promise to handle errors properly\n const child = spawn(editor, [targetFile], {\n stdio: 'inherit',\n shell: true,\n });\n\n // Don't wait for editor to close for GUI editors\n const guiEditors = ['open', 'start', 'xdg-open', 'code', 'atom', 'subl'];\n const editorCommand = editor.trim().split(' ')[0];\n if (editorCommand && guiEditors.includes(editorCommand)) {\n // For GUI editors, handle spawn errors but don't wait for close\n return new Promise<void>((resolve, reject) => {\n child.on('error', (error) => {\n reject(new Error(`Error opening editor: ${error.message}`));\n });\n // Resolve immediately after spawn for GUI editors\n child.unref();\n resolve();\n });\n } else {\n // Wait for terminal editors\n return new Promise<void>((resolve, reject) => {\n child.on('error', (error) => {\n reject(new Error(`Error opening editor: ${error.message}`));\n });\n child.on('close', (code) => {\n if (code === 0) {\n resolve();\n } else {\n reject(new Error(`Editor exited with code ${code}`));\n }\n });\n });\n }\n}\n\n","/**\n * MCP Server Command\n * \n * Starts the LeanSpec MCP (Model Context Protocol) server for integration\n * with AI assistants like Claude Desktop, Cline, and other MCP clients.\n */\n\nimport { Command } from 'commander';\nimport { createMcpServer } from '../mcp-server.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\n\n/**\n * MCP command - start MCP server\n */\nexport function mcpCommand(): Command {\n return new Command('mcp')\n .description('Start MCP server for AI assistants (Claude Desktop, Cline, etc.)')\n .action(async () => {\n await startMcpServer();\n });\n}\n\nexport async function startMcpServer(): Promise<void> {\n try {\n const server = await createMcpServer();\n const transport = new StdioServerTransport();\n await server.connect(transport);\n \n // Log to stderr so it doesn't interfere with MCP protocol on stdout\n console.error('LeanSpec MCP Server started successfully');\n } catch (error) {\n console.error('Failed to start LeanSpec MCP Server:', error);\n process.exit(1);\n }\n}\n","import { existsSync } from 'node:fs';\nimport { join } from 'node:path';\n\nexport type PackageManager = 'pnpm' | 'yarn' | 'npm';\n\nexport function detectPackageManager(baseDir: string = process.cwd()): PackageManager {\n const userAgent = process.env.npm_config_user_agent || '';\n\n if (userAgent.includes('pnpm')) {\n return 'pnpm';\n }\n\n if (userAgent.includes('yarn')) {\n return 'yarn';\n }\n\n if (userAgent.includes('npm')) {\n return 'npm';\n }\n\n if (existsSync(join(baseDir, 'pnpm-lock.yaml'))) {\n return 'pnpm';\n }\n\n if (existsSync(join(baseDir, 'yarn.lock'))) {\n return 'yarn';\n }\n\n if (existsSync(join(baseDir, 'package-lock.json'))) {\n return 'npm';\n }\n\n return 'npm';\n}\n","import { Command } from 'commander';\nimport { spawn } from 'node:child_process';\nimport { existsSync, readFileSync } from 'node:fs';\nimport { resolve, join } from 'node:path';\nimport chalk from 'chalk';\nimport ora from 'ora';\nimport { loadConfig } from '../config.js';\nimport { detectPackageManager, PackageManager } from '../utils/package-manager.js';\n\n/**\n * UI command - start local web UI for spec management\n */\nexport function uiCommand(): Command {\n return new Command('ui')\n .description('Start local web UI for spec management')\n .option('-s, --specs <dir>', 'Specs directory (auto-detected if not specified)')\n .option('-p, --port <port>', 'Port to run on', '3000')\n .option('--no-open', \"Don't open browser automatically\")\n .option('--multi-project', 'Enable multi-project mode')\n .option('--add-project <path>', 'Add a project to multi-project registry')\n .option('--discover <path>', 'Discover LeanSpec projects in directory tree')\n .option('--dev', 'Run in development mode (only works in LeanSpec monorepo)')\n .option('--dry-run', 'Show what would run without executing')\n .action(async (options: {\n specs?: string;\n port: string;\n open: boolean;\n multiProject?: boolean;\n addProject?: string;\n discover?: string;\n dev?: boolean;\n dryRun?: boolean;\n }) => {\n try {\n await startUi(options);\n } catch (error) {\n // Error message already printed, just exit\n process.exit(1);\n }\n });\n}\n\n/**\n * Start the web UI\n */\nexport async function startUi(options: {\n specs?: string;\n port: string;\n open: boolean;\n multiProject?: boolean;\n addProject?: string;\n discover?: string;\n dev?: boolean;\n dryRun?: boolean;\n}): Promise<void> {\n // Validate port\n const portNum = parseInt(options.port, 10);\n if (isNaN(portNum) || portNum < 1 || portNum > 65535) {\n console.error(chalk.red(`✗ Invalid port number: ${options.port}`));\n console.log(chalk.dim('Port must be between 1 and 65535'));\n throw new Error(`Invalid port: ${options.port}`);\n }\n\n const cwd = process.cwd();\n\n // Determine mode based on flags\n const specsMode = options.multiProject ? 'multi-project' : 'filesystem';\n\n // Determine specs directory (only for single-project mode)\n let specsDir: string = '';\n if (!options.multiProject) {\n if (options.specs) {\n specsDir = resolve(cwd, options.specs);\n } else {\n // Auto-detect from config\n const config = await loadConfig(cwd);\n specsDir = join(cwd, config.specsDir);\n }\n\n // Verify specs directory exists\n if (!existsSync(specsDir)) {\n console.error(chalk.red(`✗ Specs directory not found: ${specsDir}`));\n console.log(chalk.dim('\\nRun `lean-spec init` to initialize LeanSpec in this directory.'));\n throw new Error(`Specs directory not found: ${specsDir}`);\n }\n } else {\n console.log(chalk.cyan('→ Multi-project mode enabled'));\n \n // Handle --add-project flag\n if (options.addProject) {\n console.log(chalk.dim(` Adding project: ${options.addProject}`));\n // The project will be added via API after UI starts\n }\n \n // Handle --discover flag\n if (options.discover) {\n console.log(chalk.dim(` Will discover projects in: ${options.discover}`));\n // Projects will be discovered via API after UI starts\n }\n }\n\n // Check if --dev flag is set and we're in LeanSpec monorepo\n if (options.dev) {\n const isLeanSpecMonorepo = checkIsLeanSpecMonorepo(cwd);\n if (!isLeanSpecMonorepo) {\n console.error(chalk.red(`✗ Development mode only works in the LeanSpec monorepo`));\n console.log(chalk.dim('Remove --dev flag to use production mode'));\n throw new Error('Not in LeanSpec monorepo');\n }\n const localUiDir = join(cwd, 'packages/ui');\n return runLocalWeb(localUiDir, specsDir, specsMode, options);\n }\n\n // Production mode: use published @leanspec/ui\n return runPublishedUI(cwd, specsDir, specsMode, options);\n}\n\n/**\n * Check if we're in the LeanSpec monorepo\n * \n * This is more specific than just checking for packages/ui to avoid\n * false positives in other projects with similar structure.\n */\nfunction checkIsLeanSpecMonorepo(cwd: string): boolean {\n // Check for LeanSpec-specific markers\n const localUiDir = join(cwd, 'packages/ui');\n const uiPackageJson = join(localUiDir, 'package.json');\n \n if (!existsSync(uiPackageJson)) {\n return false;\n }\n \n try {\n const packageJson = JSON.parse(readFileSync(uiPackageJson, 'utf-8'));\n // Check if it's the @leanspec/ui package\n return packageJson.name === '@leanspec/ui';\n } catch {\n return false;\n }\n}\n\n/**\n * Run local ui package (monorepo dev mode)\n * \n * Spawns the ui dev server as a child process with appropriate environment\n * variables. Only works within the LeanSpec monorepo structure.\n * \n * @param uiDir - Absolute path to packages/ui directory\n * @param specsDir - Absolute path to specs directory\n * @param options - Command options including port, open, and dryRun flags\n * @throws {Error} If server fails to start\n */\nasync function runLocalWeb(\n uiDir: string,\n specsDir: string,\n specsMode: string,\n options: {\n port: string;\n open: boolean;\n multiProject?: boolean;\n addProject?: string;\n discover?: string;\n dev?: boolean;\n dryRun?: boolean;\n }\n): Promise<void> {\n console.log(chalk.dim('→ Detected LeanSpec monorepo, using local ui package\\n'));\n\n const repoRoot = resolve(uiDir, '..', '..');\n const packageManager = detectPackageManager(repoRoot);\n\n if (options.dryRun) {\n console.log(chalk.cyan('Would run:'));\n console.log(chalk.dim(` cd ${uiDir}`));\n\n console.log(chalk.dim(` SPECS_MODE=${specsMode} SPECS_DIR=${specsDir} PORT=${options.port} ${packageManager} run dev`));\n if (options.open) {\n console.log(chalk.dim(` open http://localhost:${options.port}`));\n }\n return;\n }\n\n const spinner = ora('Starting web UI...').start();\n\n // Set environment variables for the web server\n const env = {\n ...process.env,\n SPECS_MODE: specsMode,\n SPECS_DIR: specsDir || '',\n PORT: options.port,\n };\n\n const child = spawn(packageManager, ['run', 'dev'], {\n cwd: uiDir,\n stdio: 'inherit',\n env,\n detached: true,\n });\n\n // Wait for server to be ready\n const readyTimeout = setTimeout(async () => {\n spinner.succeed('Web UI running');\n console.log(chalk.green(`\\n✨ LeanSpec UI: http://localhost:${options.port}\\n`));\n \n if (options.multiProject) {\n console.log(chalk.cyan('Multi-project mode is active'));\n \n // Handle addProject\n if (options.addProject) {\n try {\n const res = await fetch(`http://localhost:${options.port}/api/projects`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ path: options.addProject }),\n });\n if (res.ok) {\n console.log(chalk.green(` ✓ Added project: ${options.addProject}`));\n } else {\n console.error(chalk.red(` ✗ Failed to add project: ${options.addProject}`));\n }\n } catch (e) {\n console.error(chalk.red(` ✗ Failed to connect to server for adding project`));\n }\n }\n\n // Handle discover\n if (options.discover) {\n console.log(chalk.dim(` Discovering projects in: ${options.discover}...`));\n try {\n const res = await fetch(`http://localhost:${options.port}/api/local-projects/discover`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ path: options.discover }),\n });\n \n if (res.ok) {\n const data = await res.json() as any;\n const discovered = data.discovered || [];\n console.log(chalk.green(` ✓ Found ${discovered.length} projects`));\n \n // Add discovered projects\n for (const p of discovered) {\n const addRes = await fetch(`http://localhost:${options.port}/api/projects`, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ path: p.path }),\n });\n if (addRes.ok) {\n console.log(chalk.dim(` + Added: ${p.name} (${p.path})`));\n }\n }\n } else {\n console.error(chalk.red(` ✗ Failed to discover projects`));\n }\n } catch (e) {\n console.error(chalk.red(` ✗ Failed to connect to server for discovery`));\n }\n }\n }\n\n console.log(chalk.dim('\\nPress Ctrl+C to stop\\n'));\n\n if (options.open) {\n try {\n // Dynamic import of open package\n const openModule = await import('open');\n const open = openModule.default;\n await open(`http://localhost:${options.port}`);\n } catch (error) {\n // If open package not available, just show the URL\n console.log(chalk.yellow('⚠ Could not open browser automatically'));\n console.log(chalk.dim('Please visit the URL above manually\\n'));\n console.error(chalk.dim(`Debug: ${error instanceof Error ? error.message : String(error)}`));\n }\n }\n }, 3000);\n\n // Handle shutdown gracefully (forward signals to child process group)\n const shutdown = (signal?: NodeJS.Signals) => {\n clearTimeout(readyTimeout);\n spinner.stop();\n try {\n if (child && child.pid) {\n // Try killing the whole process group (POSIX)\n try {\n process.kill(-child.pid, signal ?? 'SIGTERM');\n } catch (err) {\n // Fallback to killing the child directly\n child.kill(signal ?? 'SIGTERM');\n }\n }\n } catch (err) {\n // ignore failures to kill\n }\n\n console.log(chalk.dim('\\n✓ Web UI stopped'));\n // Ensure we exit after cleanup\n process.exit(0);\n };\n\n process.once('SIGINT', () => shutdown('SIGINT'));\n process.once('SIGTERM', () => shutdown('SIGTERM'));\n process.once('SIGHUP', () => shutdown('SIGHUP'));\n\n // If stdin closes (Ctrl+D) treat it as an exit request\n if (process.stdin && !process.stdin.destroyed) {\n process.stdin.once('end', () => shutdown('SIGTERM'));\n }\n\n // Handle child process exit\n child.on('exit', (code) => {\n clearTimeout(readyTimeout);\n spinner.stop();\n if (code !== 0 && code !== null) {\n spinner.fail('Web UI failed to start');\n console.error(chalk.red(`\\nProcess exited with code ${code}`));\n process.exit(code);\n }\n // If child exited cleanly, exit too\n process.exit(0);\n });\n}\n\nasync function runPublishedUI(\n cwd: string,\n specsDir: string,\n specsMode: string,\n options: {\n port: string;\n open: boolean;\n multiProject?: boolean;\n addProject?: string;\n discover?: string;\n dev?: boolean;\n dryRun?: boolean;\n }\n): Promise<void> {\n console.log(chalk.dim('→ Using published @leanspec/ui package\\n'));\n\n const packageManager = detectPackageManager(cwd);\n const { command, args, preview } = buildUiRunner(packageManager, specsDir, specsMode, options.port, options.open, options.multiProject);\n\n if (options.dryRun) {\n console.log(chalk.cyan('Would run:'));\n console.log(chalk.dim(` ${preview}`));\n return;\n }\n\n const child = spawn(command, args, {\n stdio: 'inherit',\n env: process.env,\n detached: true,\n });\n\n const shutdownPublished = (signal?: NodeJS.Signals) => {\n try {\n if (child && child.pid) {\n try {\n process.kill(-child.pid, signal ?? 'SIGINT');\n } catch (err) {\n child.kill(signal ?? 'SIGINT');\n }\n }\n } catch (err) {\n // ignore\n }\n console.log(chalk.dim('\\n✓ Web UI stopped'));\n process.exit(0);\n };\n\n process.once('SIGINT', () => shutdownPublished('SIGINT'));\n process.once('SIGTERM', () => shutdownPublished('SIGTERM'));\n process.once('SIGHUP', () => shutdownPublished('SIGHUP'));\n if (process.stdin && !process.stdin.destroyed) {\n process.stdin.once('end', () => shutdownPublished('SIGTERM'));\n }\n\n child.on('exit', (code) => {\n if (code === 0 || code === null) {\n process.exit(0);\n return;\n }\n console.error(chalk.red(`\\n@leanspec/ui exited with code ${code}`));\n console.log(chalk.dim('Make sure npm can download @leanspec/ui (https://www.npmjs.com/package/@leanspec/ui).'));\n process.exit(code);\n });\n\n child.on('error', (error) => {\n console.error(chalk.red(`Failed to launch @leanspec/ui: ${error instanceof Error ? error.message : String(error)}`));\n console.log(chalk.dim('You can also run it manually with `npx @leanspec/ui --specs <dir>`'));\n process.exit(1);\n });\n}\n\nfunction buildUiRunner(\n packageManager: PackageManager,\n specsDir: string,\n specsMode: string,\n port: string,\n openBrowser: boolean,\n multiProject?: boolean\n): { command: string; args: string[]; preview: string } {\n const uiArgs = ['@leanspec/ui'];\n \n if (!multiProject) {\n uiArgs.push('--specs', specsDir);\n } else {\n uiArgs.push('--multi-project');\n }\n \n uiArgs.push('--port', port);\n \n if (!openBrowser) {\n uiArgs.push('--no-open');\n }\n\n if (packageManager === 'pnpm') {\n const args = ['dlx', ...uiArgs];\n return { command: 'pnpm', args, preview: `pnpm ${args.join(' ')}` };\n }\n\n if (packageManager === 'yarn') {\n const args = ['dlx', ...uiArgs];\n return { command: 'yarn', args, preview: `yarn ${args.join(' ')}` };\n }\n\n const args = ['--yes', ...uiArgs];\n return { command: 'npx', args, preview: `npx ${args.join(' ')}` };\n}\n","/**\n * Archive tool - Move a spec to archived directory\n */\n\nimport { z } from 'zod';\nimport { archiveSpec } from '../../commands/index.js';\nimport { formatErrorMessage } from '../helpers.js';\nimport type { ToolDefinition } from '../types.js';\n\n/**\n * Archive tool definition\n */\nexport function archiveTool(): ToolDefinition {\n return [\n 'archive',\n {\n title: 'Archive Spec',\n description: 'Move a specification to the archived/ directory. Use this when a spec is complete or no longer active. The spec will be moved but not deleted.',\n inputSchema: {\n specPath: z.string().describe('The spec to archive. Can be: spec name (e.g., \"unified-dashboard\"), sequence number (e.g., \"045\" or \"45\"), or full folder name (e.g., \"045-unified-dashboard\").'),\n },\n outputSchema: {\n success: z.boolean(),\n message: z.string(),\n },\n },\n async (input, _extra) => {\n const originalLog = console.log;\n try {\n let capturedOutput = '';\n console.log = (...args: any[]) => {\n capturedOutput += args.join(' ') + '\\n';\n };\n\n await archiveSpec(input.specPath);\n\n const output = {\n success: true,\n message: `Spec archived successfully`,\n };\n\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } catch (error) {\n const output = {\n success: false,\n message: formatErrorMessage('Error archiving spec', error),\n };\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } finally {\n console.log = originalLog;\n }\n }\n ];\n}\n","/**\n * Backfill tool - Backfill missing timestamps from git history\n */\n\nimport { z } from 'zod';\nimport { backfillTimestamps } from '../../commands/index.js';\nimport { formatErrorMessage } from '../helpers.js';\nimport type { ToolDefinition } from '../types.js';\n\n/**\n * Backfill tool definition\n */\nexport function backfillTool(): ToolDefinition {\n return [\n 'backfill',\n {\n title: 'Backfill Timestamps',\n description: 'Backfill missing timestamps and metadata from git history. Use this to populate created/completed dates, assignees, or status transitions for specs that lack this data.',\n inputSchema: {\n specs: z.array(z.string()).optional().describe('Specific specs to backfill. If omitted, processes all specs.'),\n dryRun: z.boolean().optional().describe('Preview changes without applying them (default: false).'),\n force: z.boolean().optional().describe('Overwrite existing timestamp values (default: false).'),\n includeAssignee: z.boolean().optional().describe('Backfill assignee from first commit author (default: false).'),\n includeTransitions: z.boolean().optional().describe('Include full status transition history (default: false).'),\n },\n outputSchema: {\n success: z.boolean(),\n updated: z.array(z.string()).optional(),\n message: z.string(),\n },\n },\n async (input, _extra) => {\n const originalLog = console.log;\n const originalError = console.error;\n try {\n let capturedOutput = '';\n console.log = (...args: any[]) => {\n capturedOutput += args.join(' ') + '\\n';\n };\n console.error = (...args: any[]) => {\n capturedOutput += args.join(' ') + '\\n';\n };\n\n await backfillTimestamps({\n specs: input.specs,\n dryRun: input.dryRun,\n force: input.force,\n includeAssignee: input.includeAssignee,\n includeTransitions: input.includeTransitions,\n });\n\n // Parse output to extract updated specs\n const updated = capturedOutput\n .split('\\n')\n .filter((l: string) => l.includes('Updated:') || l.includes('✓'))\n .map((l: string) => l.replace(/.*Updated:\\s*/, '').replace(/✓\\s*/, '').trim())\n .filter(Boolean);\n\n const output = {\n success: true,\n updated: updated.length > 0 ? updated : undefined,\n message: input.dryRun \n ? `Dry run complete. ${updated.length} specs would be updated`\n : `Backfill complete. ${updated.length} specs updated`,\n };\n\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } catch (error) {\n const errorMessage = formatErrorMessage('Error backfilling timestamps', error);\n return {\n content: [{ type: 'text' as const, text: errorMessage }],\n isError: true,\n };\n } finally {\n console.log = originalLog;\n console.error = originalError;\n }\n }\n ];\n}\n","/**\n * Board tool - Get Kanban board view\n */\n\nimport { z } from 'zod';\nimport { loadAllSpecs } from '../../spec-loader.js';\nimport { formatErrorMessage, specToData, getStaleSpecs } from '../helpers.js';\nimport type { ToolDefinition, BoardData } from '../types.js';\n\n/**\n * Get Kanban board view\n */\nexport async function getBoardData(): Promise<BoardData> {\n const specs = await loadAllSpecs({\n includeArchived: false,\n });\n\n const columns: BoardData['columns'] = {\n planned: [],\n 'in-progress': [],\n complete: [],\n archived: [],\n };\n\n for (const spec of specs) {\n columns[spec.frontmatter.status].push(specToData(spec));\n }\n\n return { columns };\n}\n\n/**\n * Board tool definition\n */\nexport function boardTool(): ToolDefinition {\n return [\n 'board',\n {\n title: 'Get Kanban Board',\n description: 'Get Kanban board view of all specs organized by status. Use this to visualize workflow, see what\\'s in progress, or identify bottlenecks. Returns specs grouped into planned/in-progress/complete/archived columns.',\n inputSchema: {},\n outputSchema: {\n board: z.any(),\n warnings: z.array(z.string()).optional(),\n },\n },\n async (_input, _extra) => {\n try {\n const board = await getBoardData();\n \n // Check for stale specs (in-progress for > 7 days)\n const staleSpecs = getStaleSpecs(board);\n const warnings: string[] = [];\n \n if (staleSpecs.length > 0) {\n for (const spec of staleSpecs) {\n warnings.push(`⚠️ Spec \"${spec.name}\" has been in-progress for ${spec.daysStale} days. Consider updating status.`);\n }\n }\n \n const output = { \n board,\n ...(warnings.length > 0 ? { warnings } : {}),\n };\n \n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } catch (error) {\n const errorMessage = formatErrorMessage('Error getting board', error);\n return {\n content: [{ type: 'text' as const, text: errorMessage }],\n isError: true,\n };\n }\n }\n ];\n}\n","/**\n * Check tool - Check for sequence number conflicts\n */\n\nimport { z } from 'zod';\nimport { checkSpecs } from '../../commands/index.js';\nimport { formatErrorMessage } from '../helpers.js';\nimport type { ToolDefinition } from '../types.js';\n\n/**\n * Check tool definition\n */\nexport function checkTool(): ToolDefinition {\n return [\n 'check',\n {\n title: 'Check Sequence Conflicts',\n description: 'Check for sequence number conflicts in the specs directory. Use this to detect duplicate sequence numbers or naming issues. Returns list of conflicts if any.',\n inputSchema: {},\n outputSchema: {\n hasConflicts: z.boolean(),\n conflicts: z.array(z.any()).optional(),\n message: z.string(),\n },\n },\n async (_input, _extra) => {\n const originalLog = console.log;\n const originalError = console.error;\n try {\n let capturedOutput = '';\n console.log = (...args: any[]) => {\n capturedOutput += args.join(' ') + '\\n';\n };\n console.error = (...args: any[]) => {\n capturedOutput += args.join(' ') + '\\n';\n };\n\n const hasNoConflicts = await checkSpecs({ quiet: false });\n\n const output = {\n hasConflicts: !hasNoConflicts,\n message: hasNoConflicts ? 'No sequence conflicts found' : 'Sequence conflicts detected',\n conflicts: !hasNoConflicts ? capturedOutput.split('\\n').filter(l => l.trim()) : undefined,\n };\n\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } catch (error) {\n const errorMessage = formatErrorMessage('Error checking specs', error);\n return {\n content: [{ type: 'text' as const, text: errorMessage }],\n isError: true,\n };\n } finally {\n console.log = originalLog;\n console.error = originalError;\n }\n }\n ];\n}\n","/**\n * Create tool - Create a new specification\n */\n\nimport { z } from 'zod';\nimport { createSpec } from '../../commands/index.js';\nimport type { SpecPriority } from '../../frontmatter.js';\nimport { formatErrorMessage } from '../helpers.js';\nimport type { ToolDefinition } from '../types.js';\n\n/**\n * Create tool definition\n */\nexport function createTool(): ToolDefinition {\n return [\n 'create',\n {\n title: 'Create Spec',\n description: 'Create a new specification for a feature, design, or project. Use this when starting new work that needs documentation. The system auto-generates the sequence number.',\n inputSchema: {\n name: z.string().describe('The spec name/slug only (e.g., \"unified-dashboard\"). Do NOT include sequence numbers like \"045-\". The system automatically prepends the next sequence number.'),\n title: z.string().optional().describe('Human-readable title for the spec. If omitted, the name is used as the title.'),\n description: z.string().optional().describe('Initial description text to add to the Overview section.'),\n tags: z.array(z.string()).optional().describe('Tags to categorize the spec (e.g., [\"api\", \"frontend\", \"v2.0\"]).'),\n priority: z.enum(['low', 'medium', 'high', 'critical']).optional().describe('Priority level for the spec. Defaults to \"medium\" if not specified.'),\n assignee: z.string().optional().describe('Person responsible for this spec.'),\n template: z.string().optional().describe('Template name to use (e.g., \"minimal\", \"enterprise\"). Uses default template if omitted.'),\n dependsOn: z.array(z.string()).optional().describe('Specs this depends on (e.g., [\"045-api-design\", \"046-database\"]). Creates upstream dependencies.'),\n related: z.array(z.string()).optional().describe('Related specs (e.g., [\"047-frontend\"]). Creates bidirectional relationships.'),\n },\n outputSchema: {\n success: z.boolean(),\n path: z.string(),\n message: z.string(),\n reminder: z.string().optional(),\n },\n },\n async (input, _extra) => {\n const originalLog = console.log;\n try {\n // Capture output\n let capturedOutput = '';\n console.log = (...args: any[]) => {\n capturedOutput += args.join(' ') + '\\n';\n };\n\n await createSpec(input.name, {\n title: input.title,\n description: input.description,\n tags: input.tags,\n priority: input.priority as SpecPriority | undefined,\n assignee: input.assignee,\n template: input.template,\n dependsOn: input.dependsOn,\n related: input.related,\n });\n\n const output = {\n success: true,\n path: capturedOutput.includes('Created:') ? capturedOutput.split('Created:')[1].split('\\n')[0].trim() : '',\n message: `Spec '${input.name}' created successfully`,\n reminder: \"💡 Remember to update status to 'in-progress' when you start implementing! Use: update tool with status='in-progress'\",\n };\n\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } catch (error) {\n const output = {\n success: false,\n path: '',\n message: formatErrorMessage('Error creating spec', error),\n };\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } finally {\n console.log = originalLog;\n }\n }\n ];\n}\n","/**\n * Deps tool - Analyze spec dependencies\n */\n\nimport { z } from 'zod';\nimport { formatErrorMessage } from '../helpers.js';\nimport { loadAllSpecs } from '../../spec-loader.js';\nimport { resolveSpecPath } from '../../utils/path-helpers.js';\nimport { loadConfig } from '../../config.js';\nimport { SpecDependencyGraph } from '@leanspec/core';\nimport type { ToolDefinition } from '../types.js';\nimport * as path from 'node:path';\n\n/**\n * Get spec dependencies using the complete dependency graph\n */\nexport async function getDepsData(specPath: string, mode: string = 'complete'): Promise<any> {\n // Resolve spec path\n const config = await loadConfig();\n const cwd = process.cwd();\n const specsDir = path.join(cwd, config.specsDir);\n const resolvedPath = await resolveSpecPath(specPath, cwd, specsDir);\n \n if (!resolvedPath) {\n throw new Error(`Spec not found: ${specPath}`);\n }\n \n // Load all specs and build dependency graph\n const allSpecs = await loadAllSpecs({ includeArchived: true });\n const graph = new SpecDependencyGraph(allSpecs);\n \n // Get dependency information based on mode\n const spec = allSpecs.find(s => s.path === resolvedPath);\n if (!spec) {\n throw new Error(`Spec not found: ${specPath}`);\n }\n \n if (mode === 'complete') {\n const completeGraph = graph.getCompleteGraph(spec.path);\n return {\n spec: {\n path: completeGraph.current.path,\n status: completeGraph.current.frontmatter.status,\n priority: completeGraph.current.frontmatter.priority,\n },\n dependsOn: completeGraph.dependsOn.map(s => ({\n path: s.path,\n status: s.frontmatter.status,\n priority: s.frontmatter.priority,\n })),\n requiredBy: completeGraph.requiredBy.map(s => ({\n path: s.path,\n status: s.frontmatter.status,\n priority: s.frontmatter.priority,\n })),\n related: completeGraph.related.map(s => ({\n path: s.path,\n status: s.frontmatter.status,\n priority: s.frontmatter.priority,\n })),\n };\n } else if (mode === 'upstream') {\n const upstream = graph.getUpstream(spec.path, 3);\n return {\n spec: {\n path: spec.path,\n status: spec.frontmatter.status,\n priority: spec.frontmatter.priority,\n },\n dependsOn: upstream.map(s => ({\n path: s.path,\n status: s.frontmatter.status,\n priority: s.frontmatter.priority,\n })),\n };\n } else if (mode === 'downstream') {\n const downstream = graph.getDownstream(spec.path, 3);\n return {\n spec: {\n path: spec.path,\n status: spec.frontmatter.status,\n priority: spec.frontmatter.priority,\n },\n requiredBy: downstream.map(s => ({\n path: s.path,\n status: s.frontmatter.status,\n priority: s.frontmatter.priority,\n })),\n };\n } else if (mode === 'impact') {\n const impact = graph.getImpactRadius(spec.path, 3);\n return {\n spec: {\n path: impact.current.path,\n status: impact.current.frontmatter.status,\n priority: impact.current.frontmatter.priority,\n },\n upstream: impact.upstream.map(s => ({\n path: s.path,\n status: s.frontmatter.status,\n priority: s.frontmatter.priority,\n })),\n downstream: impact.downstream.map(s => ({\n path: s.path,\n status: s.frontmatter.status,\n priority: s.frontmatter.priority,\n })),\n related: impact.related.map(s => ({\n path: s.path,\n status: s.frontmatter.status,\n priority: s.frontmatter.priority,\n })),\n total: impact.upstream.length + impact.downstream.length + impact.related.length,\n };\n }\n \n // Default to complete\n return getDepsData(specPath, 'complete');\n}\n\n/**\n * Deps tool definition\n */\nexport function depsTool(): ToolDefinition {\n return [\n 'deps',\n {\n title: 'Get Dependencies',\n description: 'Analyze complete spec dependency graph (upstream, downstream, bidirectional). Shows which specs this depends on (dependsOn), which depend on this spec (requiredBy), and related work (related). Use this to understand impact of changes and work order.',\n inputSchema: {\n specPath: z.string().describe('The spec to analyze. Can be: spec name (e.g., \"unified-dashboard\"), sequence number (e.g., \"045\" or \"45\"), or full folder name (e.g., \"045-unified-dashboard\").'),\n mode: z.enum(['complete', 'upstream', 'downstream', 'impact']).optional().describe('View mode: complete (all relationships), upstream (dependencies only), downstream (dependents only), impact (full impact radius with summary). Defaults to complete.'),\n },\n outputSchema: {\n dependencies: z.any(),\n },\n },\n async (input, _extra) => {\n const originalLog = console.log;\n try {\n const mode = input.mode || 'complete';\n const deps = await getDepsData(input.specPath, mode);\n const output = { dependencies: deps, mode };\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } catch (error) {\n const errorMessage = formatErrorMessage('Error getting dependencies', error);\n return {\n content: [{ type: 'text' as const, text: errorMessage }],\n isError: true,\n };\n }\n }\n ];\n}\n","/**\n * Files tool - List all files in a specification directory\n */\n\nimport { z } from 'zod';\nimport { showFiles } from '../../commands/files.js';\nimport { formatErrorMessage } from '../helpers.js';\nimport type { ToolDefinition } from '../types.js';\n\n/**\n * Files tool definition\n */\nexport function filesTool(): ToolDefinition {\n return [\n 'files',\n {\n title: 'List Spec Files',\n description: 'List all files in a specification directory. Use this to explore sub-specs, assets, or supplementary documentation in complex specs.',\n inputSchema: {\n specPath: z.string().describe('The spec to list files for. Can be: spec name (e.g., \"unified-dashboard\"), sequence number (e.g., \"045\" or \"45\"), or full folder name (e.g., \"045-unified-dashboard\").'),\n type: z.enum(['docs', 'assets']).optional().describe('Filter by file type: \"docs\" for markdown files, \"assets\" for images/diagrams.'),\n },\n outputSchema: {\n files: z.array(z.any()),\n },\n },\n async (input, _extra) => {\n const originalLog = console.log;\n const originalError = console.error;\n try {\n let capturedOutput = '';\n console.log = (...args: any[]) => {\n capturedOutput += args.join(' ') + '\\n';\n };\n console.error = (...args: any[]) => {\n capturedOutput += args.join(' ') + '\\n';\n };\n\n await showFiles(input.specPath, {\n type: input.type as 'docs' | 'assets' | undefined,\n tree: false,\n });\n\n // Parse the captured output to extract file list\n const lines = capturedOutput.split('\\n').filter((l: string) => l.trim());\n const files = lines\n .filter((l: string) => l.includes('├──') || l.includes('└──') || l.match(/^\\s*[-•]/))\n .map((l: string) => l.replace(/[├└│─•-]\\s*/g, '').trim());\n\n const output = { files };\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } catch (error) {\n const errorMessage = formatErrorMessage('Error listing files', error);\n return {\n content: [{ type: 'text' as const, text: errorMessage }],\n isError: true,\n };\n } finally {\n console.log = originalLog;\n console.error = originalError;\n }\n }\n ];\n}\n","/**\n * Link tool - Add relationships between specs\n */\n\nimport { z } from 'zod';\nimport { linkSpec } from '../../commands/link.js';\nimport { formatErrorMessage } from '../helpers.js';\nimport type { ToolDefinition } from '../types.js';\n\n/**\n * Link tool definition\n */\nexport function linkTool(): ToolDefinition {\n return [\n 'link',\n {\n title: 'Link Specs',\n description: 'Add relationships between specs (depends_on for dependencies, related for bidirectional links). Use this after creating a spec to connect it to related specs, or to add relationships to existing specs.',\n inputSchema: {\n specPath: z.string().describe('The spec to add relationships to. Can be: spec name (e.g., \"unified-dashboard\"), sequence number (e.g., \"045\" or \"45\"), or full folder name (e.g., \"045-unified-dashboard\").'),\n dependsOn: z.string().optional().describe('Comma-separated specs this depends on (e.g., \"045,046\" or \"api-design,database\"). Creates upstream dependencies.'),\n related: z.string().optional().describe('Comma-separated related specs (e.g., \"047,frontend\"). Creates bidirectional relationships - both specs will reference each other.'),\n },\n outputSchema: {\n success: z.boolean(),\n message: z.string(),\n updated: z.array(z.string()).optional(),\n },\n },\n async (input, _extra) => {\n const originalLog = console.log;\n try {\n // Validate at least one relationship type is provided\n if (!input.dependsOn && !input.related) {\n const output = {\n success: false,\n message: 'At least one relationship type required (dependsOn or related)',\n };\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n }\n\n // Capture output\n const updatedSpecs: string[] = [];\n console.log = (...args: any[]) => {\n const msg = args.join(' ');\n // Parse updated specs from output\n if (msg.includes('Updated:')) {\n const match = msg.match(/Updated:\\s*(\\S+)/);\n if (match) {\n updatedSpecs.push(match[1]);\n }\n }\n };\n\n await linkSpec(input.specPath, {\n dependsOn: input.dependsOn,\n related: input.related,\n });\n\n const output = {\n success: true,\n message: `Relationships added to spec '${input.specPath}'`,\n updated: updatedSpecs.length > 0 ? updatedSpecs : undefined,\n };\n\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } catch (error) {\n const output = {\n success: false,\n message: formatErrorMessage('Error linking specs', error),\n };\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } finally {\n console.log = originalLog;\n }\n }\n ];\n}\n","/**\n * List tool - List all specifications with optional filtering\n */\n\nimport { z } from 'zod';\nimport { loadAllSpecs } from '../../spec-loader.js';\nimport type { SpecStatus, SpecPriority, SpecFilterOptions } from '../../frontmatter.js';\nimport { formatErrorMessage, specToData, loadSubSpecMetadata, getStaleSpecs } from '../helpers.js';\nimport type { ToolDefinition, SpecData, BoardData } from '../types.js';\n\n/**\n * List specs with optional filtering\n */\nexport async function listSpecsData(options: {\n status?: SpecStatus | SpecStatus[];\n tags?: string[];\n priority?: SpecPriority | SpecPriority[];\n assignee?: string;\n customFields?: Record<string, unknown>;\n includeArchived?: boolean;\n}): Promise<SpecData[]> {\n const filter: SpecFilterOptions = {};\n if (options.status) filter.status = options.status;\n if (options.tags) filter.tags = options.tags;\n if (options.priority) filter.priority = options.priority;\n if (options.assignee) filter.assignee = options.assignee;\n if (options.customFields) filter.customFields = options.customFields;\n\n const specs = await loadAllSpecs({\n includeArchived: options.includeArchived || false,\n filter,\n });\n\n // Convert specs to data and add sub-spec metadata\n const specsData = await Promise.all(\n specs.map(async (spec) => {\n const data = specToData(spec);\n \n // Load sub-spec metadata for progressive disclosure\n const subSpecs = await loadSubSpecMetadata(spec.fullPath);\n if (subSpecs.length > 0) {\n data.subSpecs = subSpecs;\n }\n \n return data;\n })\n );\n\n return specsData;\n}\n\n/**\n * List tool definition\n */\nexport function listTool(): ToolDefinition {\n return [\n 'list',\n {\n title: 'List Specs',\n description: 'List all specifications with optional filtering. Use this to get an overview of the project, find specs by status/priority, or discover what specs exist. Returns basic metadata for each spec.',\n inputSchema: {\n status: z.enum(['planned', 'in-progress', 'complete', 'archived']).optional().describe('Filter by spec status. Use to find specs in a specific state.'),\n tags: z.array(z.string()).optional().describe('Filter by tags (e.g., [\"api\", \"frontend\"]). Only specs with ALL specified tags will be returned.'),\n priority: z.enum(['low', 'medium', 'high', 'critical']).optional().describe('Filter by priority level. Use to find urgent or important specs.'),\n assignee: z.string().optional().describe('Filter by assignee name. Use to find specs assigned to a specific person.'),\n includeArchived: z.boolean().optional().describe('Include archived specs in results (default: false). Set to true to see completed/archived work.'),\n },\n outputSchema: {\n specs: z.array(z.any()),\n warnings: z.array(z.string()).optional(),\n },\n },\n async (input, _extra) => {\n const originalLog = console.log;\n try {\n const specs = await listSpecsData({\n status: input.status as SpecStatus | undefined,\n tags: input.tags,\n priority: input.priority as SpecPriority | undefined,\n assignee: input.assignee,\n includeArchived: input.includeArchived,\n });\n\n // Check for stale specs (only when not filtering by status)\n const warnings: string[] = [];\n if (!input.status) {\n // Build a minimal board structure for stale detection\n const inProgressSpecs = specs.filter(s => s.status === 'in-progress');\n const mockBoard: BoardData = {\n columns: {\n planned: [],\n 'in-progress': inProgressSpecs,\n complete: [],\n archived: [],\n },\n };\n const staleSpecs = getStaleSpecs(mockBoard);\n for (const spec of staleSpecs) {\n warnings.push(`⚠️ Spec \"${spec.name}\" has been in-progress for ${spec.daysStale} days. Consider updating status.`);\n }\n }\n\n const output = { \n specs,\n ...(warnings.length > 0 ? { warnings } : {}),\n };\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } catch (error) {\n const errorMessage = formatErrorMessage('Error listing specs', error);\n return {\n content: [{ type: 'text' as const, text: errorMessage }],\n isError: true,\n };\n }\n }\n ];\n}\n","/**\n * Search tool - Intelligent relevance-ranked search across spec content\n */\n\nimport { z } from 'zod';\nimport { loadAllSpecs } from '../../spec-loader.js';\nimport type { SpecStatus, SpecPriority, SpecFilterOptions } from '../../frontmatter.js';\nimport { advancedSearchSpecs, type SearchableSpec } from '@leanspec/core';\nimport { formatErrorMessage, loadSubSpecMetadata } from '../helpers.js';\nimport type { ToolDefinition, SpecData } from '../types.js';\n\n/**\n * Search specs for a query\n */\nexport async function searchSpecsData(query: string, options: {\n status?: SpecStatus;\n tags?: string[];\n priority?: SpecPriority;\n assignee?: string;\n customFields?: Record<string, unknown>;\n}): Promise<{\n results: Array<{\n spec: SpecData;\n score: number;\n totalMatches: number;\n matches: Array<{\n field: string;\n text: string;\n lineNumber?: number;\n score: number;\n highlights: Array<[number, number]>;\n }>;\n }>;\n metadata: {\n totalResults: number;\n searchTime: number;\n query: string;\n specsSearched: number;\n };\n}> {\n const filter: SpecFilterOptions = {};\n if (options.status) filter.status = options.status;\n if (options.tags) filter.tags = options.tags;\n if (options.priority) filter.priority = options.priority;\n if (options.assignee) filter.assignee = options.assignee;\n if (options.customFields) filter.customFields = options.customFields;\n\n const specs = await loadAllSpecs({\n includeArchived: true,\n includeContent: true,\n filter,\n });\n\n // Convert to searchable format\n const searchableSpecs: SearchableSpec[] = specs.map(spec => ({\n path: spec.path,\n name: spec.path,\n status: spec.frontmatter.status,\n priority: spec.frontmatter.priority,\n tags: spec.frontmatter.tags,\n title: spec.frontmatter.title as string | undefined,\n description: spec.frontmatter.description as string | undefined,\n content: spec.content,\n created: spec.frontmatter.created,\n updated: spec.frontmatter.updated_at,\n assignee: spec.frontmatter.assignee,\n }));\n\n // Use advanced search engine (supports boolean operators, field filters, fuzzy matching)\n const searchResult = advancedSearchSpecs(query, searchableSpecs, {\n maxMatchesPerSpec: 5,\n contextLength: 80,\n });\n\n // Convert to MCP format\n const results = await Promise.all(\n searchResult.results.map(async (result) => {\n const specInfo = specs.find(s => s.path === result.spec.path);\n \n const spec: SpecData = {\n name: result.spec.name,\n path: result.spec.path,\n status: result.spec.status as SpecStatus,\n created: specInfo?.frontmatter.created || '',\n title: result.spec.title,\n tags: result.spec.tags,\n priority: result.spec.priority as SpecPriority | undefined,\n assignee: specInfo?.frontmatter.assignee,\n description: result.spec.description,\n customFields: specInfo?.frontmatter.custom as Record<string, unknown> | undefined,\n };\n \n // Add sub-spec metadata for progressive disclosure\n if (specInfo?.fullPath) {\n const subSpecs = await loadSubSpecMetadata(specInfo.fullPath);\n if (subSpecs.length > 0) {\n spec.subSpecs = subSpecs;\n }\n }\n \n return {\n spec,\n score: result.score,\n totalMatches: result.totalMatches,\n matches: result.matches.map(match => ({\n field: match.field,\n text: match.text,\n lineNumber: match.lineNumber,\n score: match.score,\n highlights: match.highlights,\n })),\n };\n })\n );\n\n return {\n results,\n metadata: searchResult.metadata,\n };\n}\n\n/**\n * Search tool definition\n */\nexport function searchTool(): ToolDefinition {\n return [\n 'search',\n {\n title: 'Search Specs',\n description: `Advanced search across all specification content with support for boolean operators, field filters, date ranges, and fuzzy matching.\n\n**Query Syntax:**\n- Simple terms: \\`api authentication\\` (implicit AND)\n- Boolean: \\`api AND auth\\`, \\`frontend OR backend\\`, \\`api NOT deprecated\\`\n- Field filters: \\`status:in-progress\\`, \\`tag:api\\`, \\`priority:high\\`, \\`title:dashboard\\`\n- Date filters: \\`created:>2025-11-01\\`, \\`created:2025-01..2025-11-15\\`\n- Fuzzy matching: \\`authetication~\\` (matches \"authentication\" despite typo)\n- Exact phrases: \\`\"token refresh\"\\`\n- Grouping: \\`(frontend OR backend) AND api\\`\n\n**Query Tips:**\n- Use 2-4 specific terms for best results\n- Cross-field matching: terms can span title, tags, description, content\n- Combine field filters with search terms: \\`tag:api status:planned oauth\\`\n\n**Examples:**\n- \\`api authentication\\` - Find specs with both terms\n- \\`status:in-progress tag:api\\` - API specs being worked on\n- \\`created:>2025-11-01\\` - Recently created specs\n- \\`\"user session\" OR \"token refresh\"\\` - Either phrase\n\nReturns matching specs with relevance scores, highlighted excerpts, and metadata.`,\n inputSchema: {\n query: z.string().describe('Search query with optional advanced syntax. Supports: boolean operators (AND/OR/NOT), field filters (status:, tag:, priority:, title:, created:), fuzzy matching (term~), exact phrases (\"phrase\"), and parentheses for grouping.'),\n status: z.enum(['planned', 'in-progress', 'complete', 'archived']).optional().describe('Pre-filter by status (applied before query parsing).'),\n tags: z.array(z.string()).optional().describe('Pre-filter by tags (applied before query parsing).'),\n priority: z.enum(['low', 'medium', 'high', 'critical']).optional().describe('Pre-filter by priority (applied before query parsing).'),\n },\n outputSchema: {\n results: z.array(z.object({\n spec: z.any(),\n score: z.number(),\n totalMatches: z.number(),\n matches: z.array(z.object({\n field: z.string(),\n text: z.string(),\n lineNumber: z.number().optional(),\n score: z.number(),\n highlights: z.array(z.tuple([z.number(), z.number()])),\n })),\n })),\n metadata: z.object({\n totalResults: z.number(),\n searchTime: z.number(),\n query: z.string(),\n specsSearched: z.number(),\n }),\n },\n },\n async (input, _extra) => {\n const originalLog = console.log;\n try {\n const searchResult = await searchSpecsData(input.query, {\n status: input.status as SpecStatus | undefined,\n tags: input.tags,\n priority: input.priority as SpecPriority | undefined,\n });\n\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(searchResult, null, 2) }],\n structuredContent: searchResult,\n };\n } catch (error) {\n const errorMessage = formatErrorMessage('Error searching specs', error);\n return {\n content: [{ type: 'text' as const, text: errorMessage }],\n isError: true,\n };\n }\n }\n ];\n}\n","/**\n * Stats tool - Get project statistics and metrics\n */\n\nimport { z } from 'zod';\nimport { loadAllSpecs } from '../../spec-loader.js';\nimport type { SpecStatus, SpecPriority } from '../../frontmatter.js';\nimport { formatErrorMessage, specToData } from '../helpers.js';\nimport type { ToolDefinition, StatsData } from '../types.js';\n\n/**\n * Get project statistics\n */\nexport async function getStatsData(): Promise<StatsData> {\n const specs = await loadAllSpecs({\n includeArchived: false,\n });\n\n const byStatus: Record<SpecStatus, number> = {\n planned: 0,\n 'in-progress': 0,\n complete: 0,\n archived: 0,\n };\n\n const byPriority: Record<SpecPriority, number> = {\n low: 0,\n medium: 0,\n high: 0,\n critical: 0,\n };\n\n const byTag: Record<string, number> = {};\n\n for (const spec of specs) {\n byStatus[spec.frontmatter.status] = (byStatus[spec.frontmatter.status] || 0) + 1;\n if (spec.frontmatter.priority) {\n byPriority[spec.frontmatter.priority] = (byPriority[spec.frontmatter.priority] || 0) + 1;\n }\n if (spec.frontmatter.tags) {\n for (const tag of spec.frontmatter.tags) {\n byTag[tag] = (byTag[tag] || 0) + 1;\n }\n }\n }\n\n // Get recently updated (sort by path which includes date in many configs)\n const recentlyUpdated = specs\n .sort((a, b) => b.path.localeCompare(a.path))\n .slice(0, 5)\n .map(specToData);\n\n return {\n total: specs.length,\n byStatus,\n byPriority,\n byTag,\n recentlyUpdated,\n };\n}\n\n/**\n * Stats tool definition\n */\nexport function statsTool(): ToolDefinition {\n return [\n 'stats',\n {\n title: 'Get Statistics',\n description: 'Get project statistics and metrics. Use this to understand project completion, workload distribution, or get a high-level overview. Returns counts by status, priority, tags, and recent activity.',\n inputSchema: {},\n outputSchema: {\n stats: z.any(),\n },\n },\n async (_input, _extra) => {\n try {\n const stats = await getStatsData();\n const output = { stats };\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } catch (error) {\n const errorMessage = formatErrorMessage('Error getting stats', error);\n return {\n content: [{ type: 'text' as const, text: errorMessage }],\n isError: true,\n };\n }\n }\n ];\n}\n","/**\n * Tokens tool - Count tokens in spec for LLM context management\n */\n\nimport { z } from 'zod';\nimport * as path from 'node:path';\nimport { loadConfig } from '../../config.js';\nimport { resolveSpecPath } from '../../utils/path-helpers.js';\nimport { TokenCounter } from '@leanspec/core';\nimport { formatErrorMessage } from '../helpers.js';\nimport type { ToolDefinition } from '../types.js';\n\n/**\n * Tokens tool definition\n */\nexport function tokensTool(): ToolDefinition {\n return [\n 'tokens',\n {\n title: 'Count Tokens',\n description: 'Count tokens in spec or sub-spec for LLM context management. Use this before loading specs to check if they fit in context budget.',\n inputSchema: {\n specPath: z.string().describe('Spec name, number, or file path (e.g., \"059\", \"unified-dashboard\", \"059/DESIGN.md\")'),\n includeSubSpecs: z.boolean().optional().describe('Include all sub-spec files in count (default: false)'),\n detailed: z.boolean().optional().describe('Return breakdown by content type (code, prose, tables, frontmatter)'),\n },\n outputSchema: {\n spec: z.string(),\n total: z.number(),\n files: z.array(z.any()),\n breakdown: z.any().optional(),\n performance: z.any().optional(),\n recommendation: z.string().optional(),\n },\n },\n async (input) => {\n const counter = new TokenCounter();\n \n try {\n // Resolve spec path\n const config = await loadConfig();\n const cwd = process.cwd();\n const specsDir = path.join(cwd, config.specsDir);\n const resolvedPath = await resolveSpecPath(input.specPath, cwd, specsDir);\n \n if (!resolvedPath) {\n return {\n content: [{ type: 'text' as const, text: JSON.stringify({ \n error: `Spec not found: ${input.specPath}`,\n code: 'SPEC_NOT_FOUND'\n }, null, 2) }],\n isError: true,\n };\n }\n\n // Get spec name from path\n const specName = path.basename(resolvedPath);\n \n // Count tokens\n const result = await counter.countSpec(resolvedPath, {\n detailed: input.detailed,\n includeSubSpecs: input.includeSubSpecs,\n });\n\n // Build response\n const output: any = {\n spec: specName,\n total: result.total,\n files: result.files,\n };\n\n // Add detailed breakdown if requested\n if (input.detailed && result.breakdown) {\n output.breakdown = result.breakdown;\n \n // Add performance indicators\n const indicators = counter.getPerformanceIndicators(result.total);\n output.performance = {\n level: indicators.level,\n costMultiplier: indicators.costMultiplier,\n effectiveness: indicators.effectiveness,\n recommendation: indicators.recommendation,\n };\n }\n\n // Add recommendation for large specs\n if (result.total > 5000) {\n output.recommendation = '⚠️ Total >5K tokens - consider loading README.md only';\n } else if (result.total > 3500) {\n output.recommendation = '⚠️ Total >3.5K tokens - consider loading in sections';\n }\n\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } catch (error) {\n const errorMessage = formatErrorMessage('Error counting tokens', error);\n return {\n content: [{ type: 'text' as const, text: errorMessage }],\n isError: true,\n };\n } finally {\n counter.dispose();\n }\n }\n ];\n}\n","/**\n * Unlink tool - Remove relationships between specs\n */\n\nimport { z } from 'zod';\nimport { unlinkSpec } from '../../commands/unlink.js';\nimport { formatErrorMessage } from '../helpers.js';\nimport type { ToolDefinition } from '../types.js';\n\n/**\n * Unlink tool definition\n */\nexport function unlinkTool(): ToolDefinition {\n return [\n 'unlink',\n {\n title: 'Unlink Specs',\n description: 'Remove relationships between specs. Can remove specific relationships or all relationships of a type. Related links are removed bidirectionally (from both specs).',\n inputSchema: {\n specPath: z.string().describe('The spec to remove relationships from. Can be: spec name (e.g., \"unified-dashboard\"), sequence number (e.g., \"045\" or \"45\"), or full folder name (e.g., \"045-unified-dashboard\").'),\n dependsOn: z.string().optional().describe('Comma-separated dependencies to remove (e.g., \"045,046\"). Leave empty with removeAll=true to remove all dependencies.'),\n related: z.string().optional().describe('Comma-separated related specs to remove (e.g., \"047,frontend\"). Removes bidirectionally. Leave empty with removeAll=true to remove all.'),\n removeAll: z.boolean().optional().describe('When true, removes ALL relationships of the specified type(s). Use with dependsOn or related to clear all of that type.'),\n },\n outputSchema: {\n success: z.boolean(),\n message: z.string(),\n removed: z.number().optional(),\n updated: z.array(z.string()).optional(),\n },\n },\n async (input, _extra) => {\n const originalLog = console.log;\n try {\n // Validate at least one relationship type is provided\n if (!input.dependsOn && !input.related && !input.removeAll) {\n const output = {\n success: false,\n message: 'At least one relationship type required (dependsOn or related)',\n };\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n }\n\n // Capture output\n const updatedSpecs: string[] = [];\n let removedCount = 0;\n console.log = (...args: any[]) => {\n const msg = args.join(' ');\n // Parse updated specs from output\n if (msg.includes('Updated:')) {\n const match = msg.match(/Updated:\\s*(\\S+)/);\n if (match) {\n updatedSpecs.push(match[1]);\n }\n }\n // Parse removed count\n const countMatch = msg.match(/\\((\\d+) total\\)/);\n if (countMatch) {\n removedCount = parseInt(countMatch[1], 10);\n }\n };\n\n // Build options for unlinkSpec\n const options: {\n dependsOn?: string | boolean;\n related?: string | boolean;\n all?: boolean;\n } = {\n all: input.removeAll,\n };\n\n // Handle dependsOn - if removeAll is true and dependsOn is provided but empty, use boolean\n if (input.dependsOn !== undefined) {\n options.dependsOn = input.dependsOn || true;\n } else if (input.removeAll) {\n // If removeAll without specific field, we need explicit opt-in\n }\n\n // Handle related similarly\n if (input.related !== undefined) {\n options.related = input.related || true;\n }\n\n await unlinkSpec(input.specPath, options);\n\n const output = {\n success: true,\n message: removedCount > 0 \n ? `Removed ${removedCount} relationship(s) from spec '${input.specPath}'`\n : `No matching relationships found to remove from '${input.specPath}'`,\n removed: removedCount,\n updated: updatedSpecs.length > 0 ? updatedSpecs : undefined,\n };\n\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } catch (error) {\n const output = {\n success: false,\n message: formatErrorMessage('Error unlinking specs', error),\n };\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } finally {\n console.log = originalLog;\n }\n }\n ];\n}\n","/**\n * Update tool - Update specification metadata\n */\n\nimport { z } from 'zod';\nimport { updateSpec } from '../../commands/index.js';\nimport type { SpecStatus, SpecPriority } from '../../frontmatter.js';\nimport { formatErrorMessage } from '../helpers.js';\nimport type { ToolDefinition } from '../types.js';\n\n/**\n * Get contextual reminder based on status change\n */\nfunction getStatusReminder(newStatus?: SpecStatus): string | undefined {\n switch (newStatus) {\n case 'in-progress':\n return \"💡 Spec marked in-progress. Remember to document decisions in the spec as you work, and update to 'complete' when done!\";\n case 'complete':\n return \"✅ Spec marked complete! Consider: Did you document what you learned? Are there follow-up specs needed?\";\n case 'planned':\n return \"📋 Spec marked as planned. Update to 'in-progress' before you start implementing!\";\n default:\n return undefined;\n }\n}\n\n/**\n * Update tool definition\n */\nexport function updateTool(): ToolDefinition {\n return [\n 'update',\n {\n title: 'Update Spec',\n description: 'Update specification metadata (status, priority, tags, assignee). Use this to track progress, change priorities, or reassign work. Does NOT modify the spec content itself.',\n inputSchema: {\n specPath: z.string().describe('The spec to update. Can be: spec name (e.g., \"unified-dashboard\"), sequence number (e.g., \"045\" or \"45\"), or full folder name (e.g., \"045-unified-dashboard\").'),\n status: z.enum(['planned', 'in-progress', 'complete', 'archived']).optional().describe('Update the spec status. Use \"in-progress\" when work starts, \"complete\" when done.'),\n priority: z.enum(['low', 'medium', 'high', 'critical']).optional().describe('Update the priority level.'),\n tags: z.array(z.string()).optional().describe('Replace tags entirely with this new array. To add/remove individual tags, read first then update.'),\n assignee: z.string().optional().describe('Update who is responsible for this spec.'),\n },\n outputSchema: {\n success: z.boolean(),\n message: z.string(),\n reminder: z.string().optional(),\n },\n },\n async (input, _extra) => {\n const originalLog = console.log;\n try {\n // Capture output\n let capturedOutput = '';\n console.log = (...args: any[]) => {\n capturedOutput += args.join(' ') + '\\n';\n };\n\n // Filter out undefined values to prevent YAML serialization errors\n const updates: Record<string, unknown> = {};\n if (input.status !== undefined) updates.status = input.status as SpecStatus;\n if (input.priority !== undefined) updates.priority = input.priority as SpecPriority;\n if (input.tags !== undefined) updates.tags = input.tags;\n if (input.assignee !== undefined) updates.assignee = input.assignee;\n\n await updateSpec(input.specPath, updates);\n\n const reminder = getStatusReminder(input.status as SpecStatus | undefined);\n const output = {\n success: true,\n message: `Spec updated successfully`,\n ...(reminder ? { reminder } : {}),\n };\n\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } catch (error) {\n const output = {\n success: false,\n message: formatErrorMessage('Error updating spec', error),\n };\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } finally {\n console.log = originalLog;\n }\n }\n ];\n}\n","/**\n * Validate tool - Validate specs for quality issues\n */\n\nimport { z } from 'zod';\nimport { validateSpecs } from '../../commands/validate.js';\nimport { formatErrorMessage } from '../helpers.js';\nimport type { ToolDefinition } from '../types.js';\n\n/**\n * Validate tool definition\n */\nexport function validateTool(): ToolDefinition {\n return [\n 'validate',\n {\n title: 'Validate Specs',\n description: 'Validate specifications for quality issues like excessive length, missing sections, or complexity problems. Use this before committing changes or for project health checks. Use checkDeps to detect content/frontmatter dependency misalignment.',\n inputSchema: {\n specs: z.array(z.string()).optional().describe('Specific specs to validate. If omitted, validates all specs in the project.'),\n maxLines: z.number().optional().describe('Custom line limit for complexity checks (default: 400 lines).'),\n checkDeps: z.boolean().optional().describe('Check for content/frontmatter dependency alignment. Detects when spec content references other specs but those references are not in frontmatter depends_on/related fields.'),\n },\n outputSchema: {\n passed: z.boolean(),\n issues: z.array(z.any()).optional(),\n message: z.string(),\n },\n },\n async (input, _extra) => {\n const originalLog = console.log;\n const originalError = console.error;\n try {\n let capturedOutput = '';\n console.log = (...args: any[]) => {\n capturedOutput += args.join(' ') + '\\n';\n };\n console.error = (...args: any[]) => {\n capturedOutput += args.join(' ') + '\\n';\n };\n\n const passed = await validateSpecs({\n maxLines: input.maxLines,\n specs: input.specs,\n checkDeps: input.checkDeps,\n });\n\n const output = {\n passed,\n message: passed ? 'All specs passed validation' : 'Some specs have validation issues',\n issues: !passed ? capturedOutput.split('\\n').filter((l: string) => l.trim()) : undefined,\n };\n\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(output, null, 2) }],\n structuredContent: output,\n };\n } catch (error) {\n const errorMessage = formatErrorMessage('Error validating specs', error);\n return {\n content: [{ type: 'text' as const, text: errorMessage }],\n isError: true,\n };\n } finally {\n console.log = originalLog;\n console.error = originalError;\n }\n }\n ];\n}\n","/**\n * View tool - Read complete content of a specification\n */\n\nimport { z } from 'zod';\nimport { readSpecContent } from '../../commands/viewer.js';\nimport { formatErrorMessage, loadSubSpecMetadata } from '../helpers.js';\nimport type { ToolDefinition, SpecData } from '../types.js';\n\n/**\n * Read full spec content (supports sub-spec files like \"045/DESIGN.md\")\n */\nexport async function readSpecData(specPath: string): Promise<{ spec: SpecData; content: string }> {\n const cwd = process.cwd();\n \n // Use readSpecContent which handles both main specs and sub-spec files\n const specContent = await readSpecContent(specPath, cwd);\n \n if (!specContent) {\n throw new Error(`Spec not found: ${specPath}`);\n }\n\n const spec: SpecData = {\n name: specContent.name,\n path: specContent.path,\n status: specContent.frontmatter.status,\n created: String(specContent.frontmatter.created),\n priority: specContent.frontmatter.priority,\n tags: specContent.frontmatter.tags,\n assignee: specContent.frontmatter.assignee,\n };\n\n // Only include subSpecs when viewing main spec (not a sub-spec file)\n // Check if the specPath contains a slash (indicates sub-spec file like \"045/DESIGN.md\")\n const isSubSpecFile = specPath.includes('/') && specPath.split('/')[1].includes('.');\n \n if (!isSubSpecFile && specContent.fullPath) {\n // Load sub-spec metadata for progressive disclosure\n const subSpecs = await loadSubSpecMetadata(specContent.fullPath);\n if (subSpecs.length > 0) {\n spec.subSpecs = subSpecs;\n }\n }\n\n return {\n spec,\n content: specContent.content,\n };\n}\n\n/**\n * View tool definition\n */\nexport function viewTool(): ToolDefinition {\n return [\n 'view',\n {\n title: 'View Spec',\n description: 'Read the complete content of a specification. Use this to understand spec details, review design decisions, or check implementation status. Returns metadata and full content.',\n inputSchema: {\n specPath: z.string().describe('The spec to view. Can be: spec name (e.g., \"unified-dashboard\"), sequence number (e.g., \"045\" or \"45\"), full folder name (e.g., \"045-unified-dashboard\"), or sub-spec file (e.g., \"045/DESIGN.md\" or \"unified-dashboard/TESTING.md\").'),\n raw: z.boolean().optional().describe('Output raw markdown instead of formatted'),\n json: z.boolean().optional().describe('Output as JSON instead of formatted'),\n },\n outputSchema: {\n spec: z.any(),\n content: z.string(),\n },\n },\n async (input, _extra) => {\n const originalLog = console.log;\n try {\n const result = await readSpecData(input.specPath);\n \n // If json flag is set, return structured data\n if (input.json) {\n return {\n content: [{ type: 'text' as const, text: JSON.stringify(result, null, 2) }],\n structuredContent: result,\n };\n }\n \n // If raw flag is set, return raw markdown but include structured content\n if (input.raw) {\n const rawMarkdown = `---\\nstatus: ${result.spec.status}\\ncreated: ${result.spec.created}\\n${result.spec.priority ? `priority: ${result.spec.priority}\\n` : ''}${result.spec.tags ? `tags:\\n${result.spec.tags.map(t => ` - ${t}`).join('\\n')}\\n` : ''}${result.spec.assignee ? `assignee: ${result.spec.assignee}\\n` : ''}---\\n\\n${result.content}`;\n return {\n content: [{ type: 'text' as const, text: rawMarkdown }],\n structuredContent: result,\n };\n }\n \n // Default: formatted output with structured content\n const formatted = `# ${result.spec.name}\\n\\nStatus: ${result.spec.status}\\nCreated: ${result.spec.created}\\n${result.spec.priority ? `Priority: ${result.spec.priority}\\n` : ''}${result.spec.tags ? `Tags: ${result.spec.tags.join(', ')}\\n` : ''}${result.spec.assignee ? `Assignee: ${result.spec.assignee}\\n` : ''}\\n\\n${result.content}`;\n return {\n content: [{ type: 'text' as const, text: formatted }],\n structuredContent: result,\n };\n } catch (error) {\n const errorMessage = formatErrorMessage('Error viewing spec', error);\n return {\n content: [{ type: 'text' as const, text: errorMessage }],\n isError: true,\n };\n }\n }\n ];\n}\n","/**\n * Tool registry - Register all MCP tools in alphabetical order\n */\n\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { agentListTool, agentRunTool, agentStatusTool } from './agent.js';\nimport { archiveTool } from './archive.js';\nimport { backfillTool } from './backfill.js';\nimport { boardTool } from './board.js';\nimport { checkTool } from './check.js';\nimport { createTool } from './create.js';\nimport { depsTool } from './deps.js';\nimport { filesTool } from './files.js';\nimport { linkTool } from './link.js';\nimport { listTool } from './list.js';\nimport { searchTool } from './search.js';\nimport { statsTool } from './stats.js';\nimport { tokensTool } from './tokens.js';\nimport { unlinkTool } from './unlink.js';\nimport { updateTool } from './update.js';\nimport { validateTool } from './validate.js';\nimport { viewTool } from './view.js';\n\n/**\n * Register all tools with the MCP server in alphabetical order\n */\nexport function registerTools(server: McpServer): void {\n // Alphabetically sorted tool registration \n // Note: Using any cast to work around MCP SDK type narrowing issues\n \n // Agent tools (spec 123)\n const [agentListName, agentListConfig, agentListHandler] = agentListTool();\n server.registerTool(agentListName, agentListConfig, agentListHandler as any);\n \n const [agentRunName, agentRunConfig, agentRunHandler] = agentRunTool();\n server.registerTool(agentRunName, agentRunConfig, agentRunHandler as any);\n \n const [agentStatusName, agentStatusConfig, agentStatusHandler] = agentStatusTool();\n server.registerTool(agentStatusName, agentStatusConfig, agentStatusHandler as any);\n \n const [name1, config1, handler1] = archiveTool();\n server.registerTool(name1, config1, handler1 as any);\n \n const [name2, config2, handler2] = backfillTool();\n server.registerTool(name2, config2, handler2 as any);\n \n const [name3, config3, handler3] = boardTool();\n server.registerTool(name3, config3, handler3 as any);\n \n const [name4, config4, handler4] = checkTool();\n server.registerTool(name4, config4, handler4 as any);\n \n const [name5, config5, handler5] = createTool();\n server.registerTool(name5, config5, handler5 as any);\n \n const [name6, config6, handler6] = depsTool();\n server.registerTool(name6, config6, handler6 as any);\n \n const [name7, config7, handler7] = filesTool();\n server.registerTool(name7, config7, handler7 as any);\n \n const [linkName, linkConfig, linkHandler] = linkTool();\n server.registerTool(linkName, linkConfig, linkHandler as any);\n \n const [name8, config8, handler8] = listTool();\n server.registerTool(name8, config8, handler8 as any);\n \n const [name9, config9, handler9] = searchTool();\n server.registerTool(name9, config9, handler9 as any);\n \n const [name10, config10, handler10] = statsTool();\n server.registerTool(name10, config10, handler10 as any);\n \n const [name11, config11, handler11] = tokensTool();\n server.registerTool(name11, config11, handler11 as any);\n \n const [unlinkName, unlinkConfig, unlinkHandler] = unlinkTool();\n server.registerTool(unlinkName, unlinkConfig, unlinkHandler as any);\n \n const [name12, config12, handler12] = updateTool();\n server.registerTool(name12, config12, handler12 as any);\n \n const [name13, config13, handler13] = validateTool();\n server.registerTool(name13, config13, handler13 as any);\n \n const [name14, config14, handler14] = viewTool();\n server.registerTool(name14, config14, handler14 as any);\n}\n","/**\n * Board resource - Kanban board view\n */\n\nimport { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { formatErrorMessage } from '../helpers.js';\nimport { getBoardData } from '../tools/board.js';\n\n/**\n * Board resource definition\n */\nexport function boardResource() {\n return [\n 'board',\n new ResourceTemplate('board://kanban', { list: undefined }),\n {\n title: 'Kanban Board',\n description: 'Current Kanban board state organized by status',\n },\n async (uri: URL, _variables: Record<string, string | string[]>, _extra: any) => {\n try {\n const board = await getBoardData();\n const text = Object.entries(board.columns)\n .map(([status, specs]) => {\n const header = `## ${status.toUpperCase()} (${specs.length})`;\n const items = specs.map(s => `- ${s.name} ${s.priority ? `[${s.priority}]` : ''}`).join('\\n');\n return `${header}\\n${items || '(empty)'}`;\n })\n .join('\\n\\n');\n\n return {\n contents: [\n {\n uri: uri.href,\n text,\n mimeType: 'text/markdown',\n },\n ],\n };\n } catch (error) {\n throw new Error(formatErrorMessage('Failed to get board resource', error));\n }\n }\n ] as const;\n}\n","/**\n * Spec resource - Read individual specification content\n */\n\nimport { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { formatErrorMessage } from '../helpers.js';\nimport { readSpecData } from '../tools/view.js';\n\n/**\n * Spec resource definition\n */\nexport function specResource() {\n return [\n 'spec',\n new ResourceTemplate('spec://{specPath}', { list: undefined }),\n {\n title: 'Spec Content',\n description: 'Read individual specification content by path or name',\n },\n async (uri: URL, variables: Record<string, string | string[]>, _extra: any) => {\n try {\n const specPath = variables.specPath;\n const pathString = Array.isArray(specPath) ? specPath[0] : specPath;\n const { spec, content } = await readSpecData(pathString);\n return {\n contents: [\n {\n uri: uri.href,\n text: `# ${spec.name}\\n\\nStatus: ${spec.status}\\nCreated: ${spec.created}\\n${spec.priority ? `Priority: ${spec.priority}\\n` : ''}${spec.tags ? `Tags: ${spec.tags.join(', ')}\\n` : ''}\\n\\n${content}`,\n mimeType: 'text/markdown',\n },\n ],\n };\n } catch (error) {\n throw new Error(formatErrorMessage('Failed to read spec resource', error));\n }\n }\n ] as const;\n}\n","/**\n * Stats resource - Project statistics overview\n */\n\nimport { ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { formatErrorMessage } from '../helpers.js';\nimport { getStatsData } from '../tools/stats.js';\n\n/**\n * Stats resource definition\n */\nexport function statsResource() {\n return [\n 'stats',\n new ResourceTemplate('stats://overview', { list: undefined }),\n {\n title: 'Project Statistics',\n description: 'Overview of project statistics',\n },\n async (uri: URL, _variables: Record<string, string | string[]>, _extra: any) => {\n try {\n const stats = await getStatsData();\n \n const statusSection = Object.entries(stats.byStatus)\n .map(([status, count]) => `- ${status}: ${count}`)\n .join('\\n');\n \n const prioritySection = Object.entries(stats.byPriority)\n .filter(([_, count]) => count > 0)\n .map(([priority, count]) => `- ${priority}: ${count}`)\n .join('\\n');\n \n const tagSection = Object.entries(stats.byTag)\n .sort((a, b) => b[1] - a[1])\n .slice(0, 10)\n .map(([tag, count]) => `- ${tag}: ${count}`)\n .join('\\n');\n\n const text = `# Project Statistics\n\n## Total Specs: ${stats.total}\n\n## By Status\n${statusSection}\n\n## By Priority\n${prioritySection || '(none)'}\n\n## Top Tags\n${tagSection || '(none)'}\n\n## Recently Updated\n${stats.recentlyUpdated.map(s => `- ${s.name} (${s.status})`).join('\\n') || '(none)'}`;\n\n return {\n contents: [\n {\n uri: uri.href,\n text,\n mimeType: 'text/markdown',\n },\n ],\n };\n } catch (error) {\n throw new Error(formatErrorMessage('Failed to get stats resource', error));\n }\n }\n ] as const;\n}\n","/**\n * Resource registry - Register all MCP resources\n */\n\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { boardResource } from './board.js';\nimport { specResource } from './spec.js';\nimport { statsResource } from './stats.js';\n\n/**\n * Register all resources with the MCP server\n */\nexport function registerResources(server: McpServer): void {\n server.registerResource(...boardResource());\n server.registerResource(...specResource());\n server.registerResource(...statsResource());\n}\n","/**\n * Plan project roadmap prompt\n */\n\nimport { z } from 'zod';\n\n/**\n * Plan project roadmap prompt definition\n */\nexport function planProjectRoadmapPrompt() {\n return [\n 'plan-project-roadmap',\n {\n title: 'Plan Project Roadmap',\n description: 'Interactive roadmap planning with phases, tasks, and dependencies',\n argsSchema: {\n goal: z.string(),\n },\n },\n ({ goal }: { goal: string }) => ({\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `Plan a project roadmap for: ${goal}\n\n1. **Review Existing Work**: Analyze current specs using \\`list\\`/\\`board\\`, identify what's already planned/in-progress, assess how existing work relates to the new goal\n2. **Break Down Goal**: Decompose the goal into logical phases or milestones\n3. **Identify Tasks**: List key tasks and work items for each phase\n4. **Map Dependencies**: Establish dependencies between tasks (what must be done first)\n5. **Create Specs**: Create specification documents for major work items using the \\`create\\` tool\n6. **Set Relationships**: Use \\`link\\` tool to establish \\`depends_on\\` and \\`related\\` relationships\n7. **Timeline Estimation**: Provide realistic timeline based on task complexity and project velocity\n8. **Risk Analysis**: Identify risks, unknowns, and mitigation strategies\n\nUse the following tools to build the roadmap:\n- \\`list\\` / \\`board\\` / \\`stats\\` - Understand current project state\n- \\`create\\` - Create new specs for roadmap items\n- \\`link\\` - Establish dependencies between specs\n- \\`update\\` - Set priority and metadata\n\nProvide a clear roadmap with:\n- Phases/milestones with descriptions\n- Key specs to create\n- Dependency relationships\n- Recommended execution order\n- Actionable next steps to implement this plan`,\n },\n },\n ],\n })\n ] as const;\n}\n","/**\n * Project progress overview prompt\n */\n\n/**\n * Project progress overview prompt definition\n */\nexport function projectProgressOverviewPrompt() {\n return [\n 'project-progress-overview',\n {\n title: 'Project Progress Overview',\n description: 'Generate comprehensive project status report combining specs, git history, and metrics',\n },\n () => ({\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `Analyze project progress and provide a comprehensive overview:\n\n1. **Spec Analysis**: Review all specs using \\`board\\` and \\`stats\\`, group by status (planned/in-progress/complete), highlight any blockers or dependencies\n2. **Recent Activity**: Examine git commit history (last 2 weeks), identify key changes and development patterns\n3. **Current State**: Assess what's actively being worked on, what's completed, what's planned\n4. **Velocity Metrics**: Calculate completion rates, average time in each status, and throughput trends\n5. **Risk Assessment**: Identify stalled specs, missing dependencies, potential bottlenecks\n6. **Next Steps**: Recommend priority actions based on current project state\n\nUse the following tools to gather data:\n- \\`board\\` - Get Kanban view of specs by status\n- \\`stats\\` - Get project metrics\n- \\`list\\` - List specs with filters\n- \\`deps\\` - Analyze dependencies for critical specs\n- Terminal git commands - Analyze recent commit history\n\nProvide a clear, actionable summary that helps understand project health and next steps.`,\n },\n },\n ],\n })\n ] as const;\n}\n","/**\n * SDD Checkpoint prompt - Periodic reminder for SDD compliance\n */\n\n/**\n * SDD Checkpoint prompt definition\n * Call this periodically during long sessions to maintain SDD compliance\n */\nexport function sddCheckpointPrompt() {\n return [\n 'checkpoint',\n {\n title: 'SDD Compliance Checkpoint',\n description: 'Periodic reminder to verify SDD workflow compliance - check spec status, update progress, ensure specs are in sync',\n },\n () => ({\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `## SDD Checkpoint ✅\n\n**Before continuing, let's verify SDD compliance:**\n\n### Step 1: Review Current State\nUse the \\`board\\` tool to see project status and identify:\n- Specs marked \"in-progress\" - are they still being worked on?\n- Specs that should be \"complete\" but aren't marked\n- Any work being done without a spec\n\n### Step 2: Check Your Current Task\nFor the work you're currently doing:\n- **Is there a spec for it?** If not, create one with \\`create\\`\n- **Is the status correct?** Update with \\`update\\` if needed\n- **Have you documented decisions?** Add notes to the spec\n\n### Step 3: Update Progress\nFor any specs you've worked on:\n1. Update status if changed (\\`planned\\` → \\`in-progress\\` → \\`complete\\`)\n2. Document key decisions or changes in the spec content\n3. Link related specs if you discovered connections\n\n### Step 4: Validate (Before Completing)\nBefore marking any spec as complete, run validation:\n\\`\\`\\`\nvalidate { \"checkDeps\": true }\n\\`\\`\\`\n\nThis checks:\n- Spec structure and frontmatter\n- Content/frontmatter dependency alignment\n- Any referenced specs are properly linked\n\nFix any warnings before marking specs complete.\n\n### Action Items\nBased on the board review:\n1. List any specs with stale status\n2. Identify work being done without specs\n3. Suggest status updates needed\n4. Fix any dependency alignment warnings\n\n**Remember:** \n- Specs track implementation, not documentation\n- Update status BEFORE starting work, AFTER completing\n- Keep specs in sync with actual progress\n- Always validate with \\`--check-deps\\` before completing`,\n },\n },\n ],\n })\n ] as const;\n}\n","/**\n * Spec Creation Workflow prompt - Guide complete spec creation with dependency linking\n */\n\n/**\n * Spec Creation Workflow prompt definition\n * Use this when creating new specs to ensure proper dependency linking\n */\nexport function specCreationWorkflowPrompt() {\n return [\n 'create-spec',\n {\n title: 'Create Spec with Dependencies',\n description: 'Complete workflow for creating a new spec including proper dependency linking. Prevents the common issue of content referencing specs without frontmatter links.',\n },\n () => ({\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `## Create Spec Workflow 📝\n\nFollow these steps to create a well-linked spec:\n\n### Step 1: Pre-Creation Research\nBefore creating, use \\`search\\` to find related specs:\n- Search for similar features or components\n- Identify potential dependencies\n- Note specs to reference\n\n### Step 2: Create the Spec\nUse \\`create\\` with the spec details:\n\\`\\`\\`\ncreate {\n \"name\": \"your-spec-name\",\n \"title\": \"Human Readable Title\",\n \"description\": \"Initial overview content...\",\n \"priority\": \"medium\",\n \"tags\": [\"relevant\", \"tags\"]\n}\n\\`\\`\\`\n\n### Step 3: Link Dependencies (CRITICAL)\nAfter creating, **immediately** link any referenced specs:\n\nFor each spec mentioned in content:\n- \"Depends on spec 045\" → \\`link { \"spec\": \"your-spec\", \"dependsOn\": [\"045\"] }\\`\n- \"Related to spec 072\" → \\`link { \"spec\": \"your-spec\", \"related\": [\"072\"] }\\`\n- \"See spec 110\" → \\`link { \"spec\": \"your-spec\", \"related\": [\"110\"] }\\`\n\n### Step 4: Verify\nUse \\`deps\\` to verify all links are in place:\n\\`\\`\\`\ndeps { \"spec\": \"your-spec\" }\n\\`\\`\\`\n\n### Step 5: Validate (REQUIRED)\nRun dependency alignment check to ensure content matches frontmatter:\n\\`\\`\\`\nvalidate { \"specs\": [\"your-spec\"], \"checkDeps\": true }\n\\`\\`\\`\n\n⚠️ **Do not consider spec creation complete until validation passes with 0 dependency warnings!**\n\n### Common Patterns to Link\n\n| Content Pattern | Link Type |\n|----------------|-----------|\n| \"depends on\", \"blocked by\", \"requires\" | dependsOn |\n| \"related to\", \"see also\", \"similar to\" | related |\n| \"builds on\" | dependsOn (if blocking) or related |\n| \"## Related Specs\" section | related (link each one) |\n\n**Remember:** Content and frontmatter must stay aligned!`,\n },\n },\n ],\n })\n ] as const;\n}\n","/**\n * Update spec status prompt\n */\n\nimport { z } from 'zod';\n\n/**\n * Update spec status prompt definition\n */\nexport function updateSpecStatusPrompt() {\n return [\n 'update-spec-status',\n {\n title: 'Update Spec Status',\n description: 'Quick workflow to update specification status',\n argsSchema: {\n specPath: z.string(),\n status: z.enum(['planned', 'in-progress', 'complete', 'archived']),\n },\n },\n ({ specPath, status }: { specPath: string; status: string }) => ({\n messages: [\n {\n role: 'user' as const,\n content: {\n type: 'text' as const,\n text: `Update the status of spec \"${specPath}\" to \"${status}\".\n\nUse the \\`update\\` tool: \\`update <spec> --status ${status}\\``,\n },\n },\n ],\n })\n ] as const;\n}\n","/**\n * Prompt registry - Register all MCP prompts\n */\n\nimport type { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { planProjectRoadmapPrompt } from './plan-project-roadmap.js';\nimport { projectProgressOverviewPrompt } from './project-progress-overview.js';\nimport { sddCheckpointPrompt } from './sdd-checkpoint.js';\nimport { specCreationWorkflowPrompt } from './spec-creation-workflow.js';\nimport { updateSpecStatusPrompt } from './update-spec-status.js';\n\n/**\n * Register all prompts with the MCP server\n */\nexport function registerPrompts(server: McpServer): void {\n server.registerPrompt(...projectProgressOverviewPrompt());\n server.registerPrompt(...planProjectRoadmapPrompt());\n server.registerPrompt(...sddCheckpointPrompt());\n server.registerPrompt(...specCreationWorkflowPrompt());\n server.registerPrompt(...updateSpecStatusPrompt());\n}\n","#!/usr/bin/env node\n/**\n * LeanSpec MCP Server\n * \n * Model Context Protocol server that exposes LeanSpec functionality to AI assistants.\n * This enables AI agents to interact with LeanSpec projects directly from their environment.\n */\n\nimport { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { readFileSync } from 'fs';\nimport { fileURLToPath } from 'url';\nimport { dirname, join } from 'path';\nimport { registerTools } from './mcp/tools/registry.js';\nimport { registerResources } from './mcp/resources/registry.js';\nimport { registerPrompts } from './mcp/prompts/registry.js';\n\n// Get version from package.json\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\nconst packageJson = JSON.parse(\n readFileSync(join(__dirname, '../package.json'), 'utf-8')\n);\n\n/**\n * Create the MCP server with all tools, resources, and prompts\n */\nasync function createMcpServer(): Promise<McpServer> {\n const server = new McpServer({\n name: 'lean-spec',\n version: packageJson.version,\n });\n\n // Register all components\n registerTools(server);\n registerResources(server);\n registerPrompts(server);\n\n return server;\n}\n\n/**\n * Main entry point\n */\nasync function main() {\n try {\n const server = await createMcpServer();\n const transport = new StdioServerTransport();\n await server.connect(transport);\n \n // Log to stderr so it doesn't interfere with MCP protocol on stdout\n console.error('LeanSpec MCP Server started successfully');\n } catch (error) {\n console.error('Failed to start LeanSpec MCP Server:', error);\n process.exit(1);\n }\n}\n\nexport { createMcpServer };\n\n// Run if executed directly\nif (import.meta.url === `file://${process.argv[1]}`) {\n main().catch(console.error);\n}\n"]}
|