@zeitvu97/cms-sdk 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +478 -0
- package/dist/chunks/_shared-48T7q0V3.js +26 -0
- package/dist/chunks/_shared-48T7q0V3.js.map +1 -0
- package/dist/chunks/auth.constant-DO7ZmsKg.js +68 -0
- package/dist/chunks/auth.constant-DO7ZmsKg.js.map +1 -0
- package/dist/chunks/mt5Retcode-DlZLQOLA.js +178 -0
- package/dist/chunks/mt5Retcode-DlZLQOLA.js.map +1 -0
- package/dist/chunks/storage.constant--64BDSPW.js +44 -0
- package/dist/chunks/storage.constant--64BDSPW.js.map +1 -0
- package/dist/common/constants/auth.constant.d.ts +54 -0
- package/dist/common/constants/auth.constant.d.ts.map +1 -0
- package/dist/common/constants/bars.constant.d.ts +15 -0
- package/dist/common/constants/bars.constant.d.ts.map +1 -0
- package/dist/common/constants/content-types.constant.d.ts +29 -0
- package/dist/common/constants/content-types.constant.d.ts.map +1 -0
- package/dist/common/constants/content.constant.d.ts +114 -0
- package/dist/common/constants/content.constant.d.ts.map +1 -0
- package/dist/common/constants/executions.constant.d.ts +56 -0
- package/dist/common/constants/executions.constant.d.ts.map +1 -0
- package/dist/common/constants/gov.constant.d.ts +118 -0
- package/dist/common/constants/gov.constant.d.ts.map +1 -0
- package/dist/common/constants/history.constant.d.ts +108 -0
- package/dist/common/constants/history.constant.d.ts.map +1 -0
- package/dist/common/constants/http.constant.d.ts +46 -0
- package/dist/common/constants/http.constant.d.ts.map +1 -0
- package/dist/common/constants/index.d.ts +16 -0
- package/dist/common/constants/index.d.ts.map +1 -0
- package/dist/common/constants/kalshi.constant.d.ts +35 -0
- package/dist/common/constants/kalshi.constant.d.ts.map +1 -0
- package/dist/common/constants/llm.constant.d.ts +37 -0
- package/dist/common/constants/llm.constant.d.ts.map +1 -0
- package/dist/common/constants/mt5-action.constant.d.ts +131 -0
- package/dist/common/constants/mt5-action.constant.d.ts.map +1 -0
- package/dist/common/constants/mt5.constant.d.ts +254 -0
- package/dist/common/constants/mt5.constant.d.ts.map +1 -0
- package/dist/common/constants/notifications.constant.d.ts +45 -0
- package/dist/common/constants/notifications.constant.d.ts.map +1 -0
- package/dist/common/constants/people.constant.d.ts +269 -0
- package/dist/common/constants/people.constant.d.ts.map +1 -0
- package/dist/common/constants/rules.constant.d.ts +14 -0
- package/dist/common/constants/rules.constant.d.ts.map +1 -0
- package/dist/common/constants/settings.constant.d.ts +17 -0
- package/dist/common/constants/settings.constant.d.ts.map +1 -0
- package/dist/common/constants/sort.constant.d.ts +14 -0
- package/dist/common/constants/sort.constant.d.ts.map +1 -0
- package/dist/common/constants/storage.constant.d.ts +74 -0
- package/dist/common/constants/storage.constant.d.ts.map +1 -0
- package/dist/common/helpers/format.d.ts +7 -0
- package/dist/common/helpers/format.d.ts.map +1 -0
- package/dist/common/helpers/format.js +20 -0
- package/dist/common/helpers/format.js.map +1 -0
- package/dist/common/helpers/mt5Retcode.d.ts +18 -0
- package/dist/common/helpers/mt5Retcode.d.ts.map +1 -0
- package/dist/common/helpers/mt5Retcode.js +2 -0
- package/dist/common/helpers/mt5Retcode.js.map +1 -0
- package/dist/common/utils/case.d.ts +12 -0
- package/dist/common/utils/case.d.ts.map +1 -0
- package/dist/common/utils/clone.d.ts +9 -0
- package/dist/common/utils/clone.d.ts.map +1 -0
- package/dist/composables/cbsStateKey.d.ts +27 -0
- package/dist/composables/cbsStateKey.d.ts.map +1 -0
- package/dist/core/createApi.d.ts +69 -0
- package/dist/core/createApi.d.ts.map +1 -0
- package/dist/core/createCmsSDK.d.ts +19 -0
- package/dist/core/createCmsSDK.d.ts.map +1 -0
- package/dist/core/credentials/TokenManager.d.ts +38 -0
- package/dist/core/credentials/TokenManager.d.ts.map +1 -0
- package/dist/core/credentials/credential.type.d.ts +16 -0
- package/dist/core/credentials/credential.type.d.ts.map +1 -0
- package/dist/core/credentials/resolveStorage.d.ts +6 -0
- package/dist/core/credentials/resolveStorage.d.ts.map +1 -0
- package/dist/core/credentials/storages/cookieStorage.d.ts +18 -0
- package/dist/core/credentials/storages/cookieStorage.d.ts.map +1 -0
- package/dist/core/credentials/storages/localStorageAdapter.d.ts +8 -0
- package/dist/core/credentials/storages/localStorageAdapter.d.ts.map +1 -0
- package/dist/core/credentials/storages/memoryStorage.d.ts +7 -0
- package/dist/core/credentials/storages/memoryStorage.d.ts.map +1 -0
- package/dist/core/errors.d.ts +26 -0
- package/dist/core/errors.d.ts.map +1 -0
- package/dist/core/sdk.type.d.ts +115 -0
- package/dist/core/sdk.type.d.ts.map +1 -0
- package/dist/core/ws/createEaeraWebSocket.d.ts +21 -0
- package/dist/core/ws/createEaeraWebSocket.d.ts.map +1 -0
- package/dist/core/ws/index.d.ts +4 -0
- package/dist/core/ws/index.d.ts.map +1 -0
- package/dist/core/ws/ws.constants.d.ts +246 -0
- package/dist/core/ws/ws.constants.d.ts.map +1 -0
- package/dist/core/ws/ws.events.d.ts +264 -0
- package/dist/core/ws/ws.events.d.ts.map +1 -0
- package/dist/core/ws/ws.type.d.ts +225 -0
- package/dist/core/ws/ws.type.d.ts.map +1 -0
- package/dist/index.d.ts +130 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +8416 -0
- package/dist/index.js.map +1 -0
- package/dist/nuxt.d.ts +49 -0
- package/dist/nuxt.d.ts.map +1 -0
- package/dist/nuxt.js +47 -0
- package/dist/nuxt.js.map +1 -0
- package/dist/runtime/plugin.d.ts +6 -0
- package/dist/runtime/plugin.js +188 -0
- package/dist/runtime/plugin.js.map +1 -0
- package/dist/server/auth/cbs-callback.post.js +42 -0
- package/dist/server/auth/cbs-callback.post.js.map +1 -0
- package/dist/server/auth/cbs-start.post.js +34 -0
- package/dist/server/auth/cbs-start.post.js.map +1 -0
- package/dist/server/auth/idp-callback.get.js +52 -0
- package/dist/server/auth/idp-callback.get.js.map +1 -0
- package/dist/server/auth/idp-link.post.js +38 -0
- package/dist/server/auth/idp-link.post.js.map +1 -0
- package/dist/server/auth/idp-login.get.js +42 -0
- package/dist/server/auth/idp-login.get.js.map +1 -0
- package/dist/server/auth/idp-unlink.delete.js +38 -0
- package/dist/server/auth/idp-unlink.delete.js.map +1 -0
- package/dist/server/auth/login.post.js +42 -0
- package/dist/server/auth/login.post.js.map +1 -0
- package/dist/server/auth/logout.post.js +31 -0
- package/dist/server/auth/logout.post.js.map +1 -0
- package/dist/server/auth/refresh.post.js +46 -0
- package/dist/server/auth/refresh.post.js.map +1 -0
- package/dist/server/clear-token.delete.js +12 -0
- package/dist/server/clear-token.delete.js.map +1 -0
- package/dist/server/persist.post.js +31 -0
- package/dist/server/persist.post.js.map +1 -0
- package/dist/server/set-token.post.js +27 -0
- package/dist/server/set-token.post.js.map +1 -0
- package/dist/services/auth/auth.type.d.ts +66 -0
- package/dist/services/auth/auth.type.d.ts.map +1 -0
- package/dist/services/auth/index.d.ts +127 -0
- package/dist/services/auth/index.d.ts.map +1 -0
- package/dist/services/auth/mock.d.ts +13 -0
- package/dist/services/auth/mock.d.ts.map +1 -0
- package/dist/services/bars/bars.type.d.ts +78 -0
- package/dist/services/bars/bars.type.d.ts.map +1 -0
- package/dist/services/bars/index.d.ts +24 -0
- package/dist/services/bars/index.d.ts.map +1 -0
- package/dist/services/bars/mock.d.ts +23 -0
- package/dist/services/bars/mock.d.ts.map +1 -0
- package/dist/services/content/content.type.d.ts +832 -0
- package/dist/services/content/content.type.d.ts.map +1 -0
- package/dist/services/content/filter.d.ts +46 -0
- package/dist/services/content/filter.d.ts.map +1 -0
- package/dist/services/content/index.d.ts +35 -0
- package/dist/services/content/index.d.ts.map +1 -0
- package/dist/services/content/mock.d.ts +16 -0
- package/dist/services/content/mock.d.ts.map +1 -0
- package/dist/services/content-types/content-types.type.d.ts +70 -0
- package/dist/services/content-types/content-types.type.d.ts.map +1 -0
- package/dist/services/content-types/index.d.ts +18 -0
- package/dist/services/content-types/index.d.ts.map +1 -0
- package/dist/services/content-types/mock.d.ts +15 -0
- package/dist/services/content-types/mock.d.ts.map +1 -0
- package/dist/services/executions/executions.type.d.ts +67 -0
- package/dist/services/executions/executions.type.d.ts.map +1 -0
- package/dist/services/executions/index.d.ts +30 -0
- package/dist/services/executions/index.d.ts.map +1 -0
- package/dist/services/executions/mock.d.ts +29 -0
- package/dist/services/executions/mock.d.ts.map +1 -0
- package/dist/services/gov/gov.type.d.ts +740 -0
- package/dist/services/gov/gov.type.d.ts.map +1 -0
- package/dist/services/gov/index.d.ts +84 -0
- package/dist/services/gov/index.d.ts.map +1 -0
- package/dist/services/history/history.type.d.ts +167 -0
- package/dist/services/history/history.type.d.ts.map +1 -0
- package/dist/services/history/index.d.ts +38 -0
- package/dist/services/history/index.d.ts.map +1 -0
- package/dist/services/history/mock.d.ts +21 -0
- package/dist/services/history/mock.d.ts.map +1 -0
- package/dist/services/kalshi/index.d.ts +19 -0
- package/dist/services/kalshi/index.d.ts.map +1 -0
- package/dist/services/kalshi/kalshi.type.d.ts +99 -0
- package/dist/services/kalshi/kalshi.type.d.ts.map +1 -0
- package/dist/services/kalshi/mock.d.ts +5 -0
- package/dist/services/kalshi/mock.d.ts.map +1 -0
- package/dist/services/llm/index.d.ts +38 -0
- package/dist/services/llm/index.d.ts.map +1 -0
- package/dist/services/llm/llm.type.d.ts +106 -0
- package/dist/services/llm/llm.type.d.ts.map +1 -0
- package/dist/services/notifications/index.d.ts +38 -0
- package/dist/services/notifications/index.d.ts.map +1 -0
- package/dist/services/notifications/mock.d.ts +39 -0
- package/dist/services/notifications/mock.d.ts.map +1 -0
- package/dist/services/notifications/notifications.type.d.ts +75 -0
- package/dist/services/notifications/notifications.type.d.ts.map +1 -0
- package/dist/services/people/_invoke.d.ts +26 -0
- package/dist/services/people/_invoke.d.ts.map +1 -0
- package/dist/services/people/copilot/index.d.ts +132 -0
- package/dist/services/people/copilot/index.d.ts.map +1 -0
- package/dist/services/people/identity/actions.d.ts +116 -0
- package/dist/services/people/identity/actions.d.ts.map +1 -0
- package/dist/services/people/identity/ct.types.d.ts +133 -0
- package/dist/services/people/identity/ct.types.d.ts.map +1 -0
- package/dist/services/people/identity/index.d.ts +14 -0
- package/dist/services/people/identity/index.d.ts.map +1 -0
- package/dist/services/people/identity/projections.d.ts +63 -0
- package/dist/services/people/identity/projections.d.ts.map +1 -0
- package/dist/services/people/index.d.ts +31 -0
- package/dist/services/people/index.d.ts.map +1 -0
- package/dist/services/people/legal/actions.d.ts +161 -0
- package/dist/services/people/legal/actions.d.ts.map +1 -0
- package/dist/services/people/legal/ct.types.d.ts +186 -0
- package/dist/services/people/legal/ct.types.d.ts.map +1 -0
- package/dist/services/people/legal/index.d.ts +15 -0
- package/dist/services/people/legal/index.d.ts.map +1 -0
- package/dist/services/people/packops/index.d.ts +70 -0
- package/dist/services/people/packops/index.d.ts.map +1 -0
- package/dist/services/people/packops/packops.type.d.ts +183 -0
- package/dist/services/people/packops/packops.type.d.ts.map +1 -0
- package/dist/services/people/perms/actions.d.ts +214 -0
- package/dist/services/people/perms/actions.d.ts.map +1 -0
- package/dist/services/people/perms/ct.types.d.ts +140 -0
- package/dist/services/people/perms/ct.types.d.ts.map +1 -0
- package/dist/services/people/perms/index.d.ts +14 -0
- package/dist/services/people/perms/index.d.ts.map +1 -0
- package/dist/services/people/perms/projections.d.ts +47 -0
- package/dist/services/people/perms/projections.d.ts.map +1 -0
- package/dist/services/people/process/actions.d.ts +154 -0
- package/dist/services/people/process/actions.d.ts.map +1 -0
- package/dist/services/people/process/ct.types.d.ts +304 -0
- package/dist/services/people/process/ct.types.d.ts.map +1 -0
- package/dist/services/people/process/index.d.ts +12 -0
- package/dist/services/people/process/index.d.ts.map +1 -0
- package/dist/services/people/shared.types.d.ts +36 -0
- package/dist/services/people/shared.types.d.ts.map +1 -0
- package/dist/services/rules/conditions.d.ts +264 -0
- package/dist/services/rules/conditions.d.ts.map +1 -0
- package/dist/services/rules/index.d.ts +49 -0
- package/dist/services/rules/index.d.ts.map +1 -0
- package/dist/services/rules/llm-rule.constant.d.ts +84 -0
- package/dist/services/rules/llm-rule.constant.d.ts.map +1 -0
- package/dist/services/rules/mock.d.ts +20 -0
- package/dist/services/rules/mock.d.ts.map +1 -0
- package/dist/services/rules/rules.type.d.ts +262 -0
- package/dist/services/rules/rules.type.d.ts.map +1 -0
- package/dist/services/rules/triggers.d.ts +140 -0
- package/dist/services/rules/triggers.d.ts.map +1 -0
- package/dist/services/settings/index.d.ts +36 -0
- package/dist/services/settings/index.d.ts.map +1 -0
- package/dist/services/settings/mock.d.ts +14 -0
- package/dist/services/settings/mock.d.ts.map +1 -0
- package/dist/services/settings/settings.type.d.ts +39 -0
- package/dist/services/settings/settings.type.d.ts.map +1 -0
- package/dist/stores/auth.d.ts +192 -0
- package/dist/stores/auth.d.ts.map +1 -0
- package/dist/stores/bars.d.ts +288 -0
- package/dist/stores/bars.d.ts.map +1 -0
- package/dist/stores/content.d.ts +4101 -0
- package/dist/stores/content.d.ts.map +1 -0
- package/dist/stores/executions.d.ts +249 -0
- package/dist/stores/executions.d.ts.map +1 -0
- package/dist/stores/gov.d.ts +238 -0
- package/dist/stores/gov.d.ts.map +1 -0
- package/dist/stores/history.d.ts +833 -0
- package/dist/stores/history.d.ts.map +1 -0
- package/dist/stores/index.d.ts +15 -0
- package/dist/stores/index.d.ts.map +1 -0
- package/dist/stores/kalshi.d.ts +728 -0
- package/dist/stores/kalshi.d.ts.map +1 -0
- package/dist/stores/llm-providers.d.ts +97 -0
- package/dist/stores/llm-providers.d.ts.map +1 -0
- package/dist/stores/llm.d.ts +102 -0
- package/dist/stores/llm.d.ts.map +1 -0
- package/dist/stores/people.d.ts +596 -0
- package/dist/stores/people.d.ts.map +1 -0
- package/dist/stores/persist.d.ts +58 -0
- package/dist/stores/persist.d.ts.map +1 -0
- package/dist/stores/rules.d.ts +485 -0
- package/dist/stores/rules.d.ts.map +1 -0
- package/dist/stores/settings.d.ts +36 -0
- package/dist/stores/settings.d.ts.map +1 -0
- package/dist/stores/ws.d.ts +66 -0
- package/dist/stores/ws.d.ts.map +1 -0
- package/package.json +90 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/common/constants/mt5.constant.ts","../src/common/utils/case.ts","../src/core/errors.ts","../src/core/createApi.ts","../src/common/utils/clone.ts","../src/services/auth/mock.ts","../src/services/auth/index.ts","../src/common/constants/bars.constant.ts","../src/services/bars/bars.type.ts","../src/services/bars/mock.ts","../src/services/bars/index.ts","../src/common/constants/content.constant.ts","../src/services/content/mock.ts","../src/services/content/index.ts","../src/common/constants/content-types.constant.ts","../src/services/content-types/mock.ts","../src/services/content-types/index.ts","../src/common/constants/executions.constant.ts","../src/common/constants/mt5-action.constant.ts","../src/services/executions/mock.ts","../src/services/executions/index.ts","../src/common/constants/gov.constant.ts","../src/services/gov/index.ts","../src/common/constants/history.constant.ts","../src/common/constants/sort.constant.ts","../src/services/history/mock.ts","../src/services/history/index.ts","../src/common/constants/kalshi.constant.ts","../src/services/kalshi/mock.ts","../src/services/kalshi/index.ts","../src/common/constants/llm.constant.ts","../src/services/llm/index.ts","../src/common/constants/notifications.constant.ts","../src/services/notifications/mock.ts","../src/services/notifications/index.ts","../src/common/constants/people.constant.ts","../src/services/people/_invoke.ts","../src/services/people/legal/actions.ts","../src/services/people/perms/actions.ts","../src/services/people/identity/actions.ts","../src/services/people/process/actions.ts","../src/services/people/copilot/index.ts","../src/services/people/packops/index.ts","../src/services/people/index.ts","../src/common/constants/rules.constant.ts","../src/services/rules/llm-rule.constant.ts","../src/services/rules/rules.type.ts","../src/services/rules/triggers.ts","../src/services/rules/mock.ts","../src/services/rules/index.ts","../src/common/constants/settings.constant.ts","../src/services/settings/mock.ts","../src/services/settings/index.ts","../src/core/credentials/storages/cookieStorage.ts","../src/core/credentials/storages/localStorageAdapter.ts","../src/core/credentials/storages/memoryStorage.ts","../src/core/credentials/resolveStorage.ts","../src/core/credentials/TokenManager.ts","../src/core/ws/createEaeraWebSocket.ts","../src/core/createCmsSDK.ts","../src/services/rules/conditions.ts","../src/core/ws/ws.events.ts","../src/stores/auth.ts","../src/stores/bars.ts","../src/stores/content.ts","../src/stores/history.ts","../src/stores/kalshi.ts","../src/stores/gov.ts","../src/stores/people.ts","../src/stores/rules.ts","../src/stores/executions.ts","../src/stores/settings.ts","../src/stores/llm.ts","../src/stores/llm-providers.ts","../src/stores/ws.ts","../src/stores/persist.ts","../src/composables/cbsStateKey.ts","../src/services/content/filter.ts"],"sourcesContent":["/**\n * MT5 domain constants.\n *\n * `MT5_SERVER_NAME` is the wire-format broker server name used to construct\n * WS topics (`symbol:<server>:<SYMBOL>`, `mt5:events:<server>:<type>`).\n * The literal value is significant — a server-segment mismatch in any\n * topic receives ZERO events [ws§6.2].\n *\n * In production the server name is `EAERA MT5 - Live` (3 spaces, 2 dashes).\n * Override per-env by setting `runtimeConfig.public.mt5ServerName` and\n * reading it through a CMS-derived accessor; this constant is the FE\n * fallback / default for clients that don't override.\n */\nexport const MT5_SERVER_NAME = 'EAERA MT5 - Live';\nexport type MT5ServerName = typeof MT5_SERVER_NAME;\n\n/** Chart interval enum from BE §4.6 (Mt5ChartBar.data.interval). */\nexport const MT5_INTERVAL = {\n M1: 'M1',\n M5: 'M5',\n M15: 'M15',\n M30: 'M30',\n H1: 'H1',\n H4: 'H4',\n D1: 'D1',\n W1: 'W1',\n MN1: 'MN1',\n} as const;\nexport type MT5Interval = (typeof MT5_INTERVAL)[keyof typeof MT5_INTERVAL];\n\n/** `MT5Account.data.status` lifecycle enum from BE §4.2. */\nexport const MT5_ACCOUNT_STATUS = {\n ACTIVE: 'active',\n DISABLED: 'disabled',\n CLOSED: 'closed',\n} as const;\nexport type MT5AccountStatus = (typeof MT5_ACCOUNT_STATUS)[keyof typeof MT5_ACCOUNT_STATUS];\n\n/** MT5 `order_type` int code → human string. From ws-guide §9.5. */\nexport const MT5_ORDER_TYPE = {\n BUY: 0,\n SELL: 1,\n BUY_LIMIT: 2,\n SELL_LIMIT: 3,\n BUY_STOP: 4,\n SELL_STOP: 5,\n BUY_STOP_LIMIT: 6,\n SELL_STOP_LIMIT: 7,\n} as const;\nexport type MT5OrderTypeCode = (typeof MT5_ORDER_TYPE)[keyof typeof MT5_ORDER_TYPE];\n\n/** `IMTConCommTier::EnCommissionMode` — commission charge unit. */\nexport const MT5_COMMISSION_MODE = {\n MONEY_DEPOSIT: 0,\n MONEY_SYMBOL_BASE: 1,\n MONEY_SYMBOL_PROFIT: 2,\n MONEY_SYMBOL_MARGIN: 3,\n PIPS: 4,\n PERCENT: 5,\n MONEY_SPECIFIED: 6,\n PERCENT_PROFIT: 7,\n} as const;\nexport type MT5CommissionMode = (typeof MT5_COMMISSION_MODE)[keyof typeof MT5_COMMISSION_MODE];\n\n/** `IMTConCommTier::EnCommissionVolumeType` — commission volume basis. */\nexport const MT5_COMMISSION_VOLUME_TYPE = {\n DEAL: 0,\n VOLUME: 1,\n} as const;\nexport type MT5CommissionVolumeType =\n (typeof MT5_COMMISSION_VOLUME_TYPE)[keyof typeof MT5_COMMISSION_VOLUME_TYPE];\n\n/** MT5 `state` int code → human string. From ws-guide §9.5. */\nexport const MT5_ORDER_STATE = {\n STARTED: 0,\n PLACED: 1,\n CANCELED: 2,\n PARTIAL: 3,\n FILLED: 4,\n REJECTED: 5,\n EXPIRED: 6,\n REQUEST_ADD: 7,\n REQUEST_MODIFY: 8,\n REQUEST_CANCEL: 9,\n} as const;\nexport type MT5OrderStateCode = (typeof MT5_ORDER_STATE)[keyof typeof MT5_ORDER_STATE];\n\n/**\n * Wire-decoded MT5 order-state STRINGS (`state_str`).\n *\n * The numeric `MT5_ORDER_STATE` codes are the broker-side representation;\n * the BE decodes them into these string labels and ships them on the wire\n * (see `Mt5OrderHistoryData.status` and the WS `state_str` field on order\n * events). Distinct from `HISTORY_ORDER_STATUS` which is the *terminal*\n * subset the history endpoint surfaces (and uses UK-spelled `CANCELLED`).\n */\nexport const MT5_ORDER_STATE_NAME = {\n STARTED: 'STARTED',\n PLACED: 'PLACED',\n CANCELED: 'CANCELED',\n PARTIAL: 'PARTIAL',\n FILLED: 'FILLED',\n REJECTED: 'REJECTED',\n EXPIRED: 'EXPIRED',\n REQUEST_ADD: 'REQUEST_ADD',\n REQUEST_MODIFY: 'REQUEST_MODIFY',\n REQUEST_CANCEL: 'REQUEST_CANCEL',\n} as const;\nexport type MT5OrderStateName = (typeof MT5_ORDER_STATE_NAME)[keyof typeof MT5_ORDER_STATE_NAME];\n\n/**\n * Escape hatch for the WS `state_str` decoder path: the broker can in\n * principle ship an unknown label, so consumers comparing against\n * `stateStr` should widen to `MT5OrderStateNameOrUnknown` rather than the\n * strict union.\n */\nexport type MT5OrderStateNameOrUnknown = MT5OrderStateName | (string & {});\n\n/**\n * Normalized order-kind categories used in CMS DTOs (`Mt5OrderHistoryData.type`,\n * `OrderHistoryItem.type`, trading-mock stores). Distinct from the numeric\n * `MT5_ORDER_TYPE` codes — these are the FE-facing names the CMS\n * decodes to.\n */\nexport const MT5_ORDER_KIND = {\n MARKET: 'MARKET',\n LIMIT: 'LIMIT',\n STOP: 'STOP',\n STOP_LIMIT: 'STOP_LIMIT',\n} as const;\nexport type MT5OrderKind = (typeof MT5_ORDER_KIND)[keyof typeof MT5_ORDER_KIND];\n\n/**\n * Order time-in-force / duration (`Mt5OrderHistoryData.duration`, action\n * `place_order.duration`). FE-facing labels — distinct from any numeric\n * broker codes.\n */\nexport const MT5_ORDER_DURATION = {\n DAY: 'DAY',\n GTC: 'GTC',\n SPECIFIED: 'SPECIFIED',\n SPECIFIED_DAY: 'SPECIFIED_DAY',\n} as const;\nexport type MT5OrderDuration = (typeof MT5_ORDER_DURATION)[keyof typeof MT5_ORDER_DURATION];\n\n/**\n * Domain-neutral trade side (`BUY` / `SELL`). Distinct from\n * `MT5_POSITION_TYPE` (which has the same values but is position-scoped\n * in its name) — `MT5_TRADE_SIDE` is for order `side`, deal `action`,\n * and tick `side` fields that all carry the same two-value vocabulary.\n */\nexport const MT5_TRADE_SIDE = {\n BUY: 'BUY',\n SELL: 'SELL',\n} as const;\nexport type MT5TradeSide = (typeof MT5_TRADE_SIDE)[keyof typeof MT5_TRADE_SIDE];\n\n/** Position-type enum (`BUY` / `SELL`). From BE ws-guide appendix A.3. */\nexport const MT5_POSITION_TYPE = MT5_TRADE_SIDE;\nexport type MT5PositionType = MT5TradeSide;\n\n/** Deal-entry enum (`IN` / `OUT` / `INOUT` / `OUT_BY`). From BE ws-guide appendix A.4. */\nexport const MT5_DEAL_ENTRY = {\n IN: 'IN',\n OUT: 'OUT',\n INOUT: 'INOUT',\n OUT_BY: 'OUT_BY',\n} as const;\nexport type MT5DealEntry = (typeof MT5_DEAL_ENTRY)[keyof typeof MT5_DEAL_ENTRY];\n\n/** `Mt5Symbol.data.trade_mode` enum. From BE §4.3. */\nexport const MT5_TRADE_MODE = {\n FULL: 'full',\n LONG_ONLY: 'long_only',\n SHORT_ONLY: 'short_only',\n CLOSE_ONLY: 'close_only',\n DISABLED: 'disabled',\n} as const;\nexport type MT5TradeMode = (typeof MT5_TRADE_MODE)[keyof typeof MT5_TRADE_MODE];\n\n/** `Mt5Symbol.data.market_status` enum. From BE §4.3. */\nexport const MT5_MARKET_STATUS = {\n ACTIVE: 'active',\n MARKET_CLOSED: 'market-closed',\n EXPIRED: 'expired',\n NOT_TRADABLE_YET: 'not-tradable-yet',\n} as const;\nexport type MT5MarketStatus = (typeof MT5_MARKET_STATUS)[keyof typeof MT5_MARKET_STATUS];\n\n/** `Mt5Symbol.data.execution_mode` enum. From BE §4.3. */\nexport const MT5_EXECUTION_MODE = {\n MARKET: 'market',\n EXCHANGE: 'exchange',\n REQUEST: 'request',\n INSTANT: 'instant',\n} as const;\nexport type MT5ExecutionMode = (typeof MT5_EXECUTION_MODE)[keyof typeof MT5_EXECUTION_MODE];\n\n/** `Mt5ChartBar.data.source` enum. From BE §4.6. */\nexport const MT5_CHART_BAR_SOURCE = {\n LIVE: 'live',\n MT5: 'mt5',\n CORRECTED: 'corrected',\n} as const;\nexport type MT5ChartBarSource = (typeof MT5_CHART_BAR_SOURCE)[keyof typeof MT5_CHART_BAR_SOURCE];\n\n/** `Mt5Server.data.state` lifecycle enum. From BE pack §content_types. */\nexport const MT5_SERVER_STATE = {\n PENDING: 'pending',\n DEPLOYING: 'deploying',\n ACTIVE: 'active',\n DEGRADED: 'degraded',\n STOPPING: 'stopping',\n STOPPED: 'stopped',\n} as const;\nexport type MT5ServerState = (typeof MT5_SERVER_STATE)[keyof typeof MT5_SERVER_STATE];\n\n/** `Mt5SyncState.data.phase` lifecycle enum. From BE pack §content_types. */\nexport const MT5_SYNC_PHASE = {\n IDLE: 'idle',\n SYNCING: 'syncing',\n BACKFILLING: 'backfilling',\n PAUSED: 'paused',\n FAILED: 'failed',\n COMPLETED: 'completed',\n} as const;\nexport type MT5SyncPhase = (typeof MT5_SYNC_PHASE)[keyof typeof MT5_SYNC_PHASE];\n\n/**\n * `KalshiServer.data.status` lifecycle enum (FEAT-010). The Kalshi pack\n * registers a different status alphabet from MT5 — kept separate so a\n * global `MT5_SERVER_STATE` search doesn't surface Kalshi rows.\n */\nexport const KALSHI_SERVER_STATUS = {\n ACTIVE: 'active',\n INACTIVE: 'inactive',\n ERROR: 'error',\n} as const;\nexport type KalshiServerStatus = (typeof KALSHI_SERVER_STATUS)[keyof typeof KALSHI_SERVER_STATUS];\n\n/**\n * `KalshiEvent.data.status` lifecycle (pack §2.2 / §2.4):\n * `open` while any child is active; `finalized` when settled; `closed` otherwise.\n */\nexport const KALSHI_LIFECYCLE_STATUS = {\n OPEN: 'open',\n CLOSED: 'closed',\n FINALIZED: 'finalized',\n /** @deprecated Use `FINALIZED`. */\n SETTLED: 'settled',\n} as const;\nexport type KalshiLifecycleStatus =\n (typeof KALSHI_LIFECYCLE_STATUS)[keyof typeof KALSHI_LIFECYCLE_STATUS];\n\n/**\n * `KalshiFuture.data.status` lifecycle (pack §2.3 / §2.4):\n * `active → closed → finalized`.\n */\nexport const KALSHI_FUTURE_STATUS = {\n ACTIVE: 'active',\n CLOSED: 'closed',\n FINALIZED: 'finalized',\n /** @deprecated Use `FINALIZED`. */\n SETTLED: 'settled',\n DISABLED: 'disabled',\n} as const;\nexport type KalshiFutureStatus = (typeof KALSHI_FUTURE_STATUS)[keyof typeof KALSHI_FUTURE_STATUS];\n\n/** Settled outcome on `KalshiFuture.data.result` (§4.13). */\nexport const KALSHI_SETTLEMENT_RESULT = {\n YES: 'yes',\n NO: 'no',\n SCALAR: 'scalar',\n} as const;\nexport type KalshiSettlementResult =\n (typeof KALSHI_SETTLEMENT_RESULT)[keyof typeof KALSHI_SETTLEMENT_RESULT];\n","/**\n * Deep-transform an object's own keys to snake_case. Values are left untouched\n * unless they are plain objects/arrays (recursed). Used by `createApi` when the\n * consumer opts into `requestCasing: 'snake'` so request bodies match a backend\n * expecting snake_case keys.\n *\n * Non-plain objects (URLSearchParams, FormData, Blob, Date, …) pass through.\n */\nexport function toSnakeCaseKeys<T>(value: T): T {\n if (Array.isArray(value)) {\n return value.map((v) => toSnakeCaseKeys(v)) as unknown as T;\n }\n if (isPlainObject(value)) {\n const out: Record<string, unknown> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n out[toSnake(k)] = toSnakeCaseKeys(v);\n }\n return out as unknown as T;\n }\n return value;\n}\n\nfunction isPlainObject(v: unknown): boolean {\n if (v === null || typeof v !== 'object') return false;\n const proto = Object.getPrototypeOf(v);\n return proto === null || proto === Object.prototype;\n}\n\n/** Convert a single camelCase / PascalCase key to snake_case. */\nexport function toSnake(key: string): string {\n // handle sequences of capitals (e.g. \"HTTPServer\" -> \"http_server\") then normal boundaries\n return key\n .replace(/([a-z0-9])([A-Z])/g, '$1_$2')\n .replace(/([A-Z]+)([A-Z][a-z])/g, '$1_$2')\n .toLowerCase();\n}\n","/**\n * Normalised SDK error. The `onResponseError` hook inspects the raw ofetch\n * error and converts it into this shape so consumers deal with ONE type.\n */\nexport class CmsError extends Error {\n readonly statusCode: number;\n readonly code: string;\n readonly fieldErrors?: Record<string, string>;\n readonly requestId?: string;\n readonly traceId?: string;\n\n constructor(input: {\n message: string;\n statusCode?: number;\n code?: string;\n fieldErrors?: Record<string, string>;\n requestId?: string;\n traceId?: string;\n cause?: unknown;\n }) {\n super(input.message, input.cause !== undefined ? { cause: input.cause } : undefined);\n this.name = 'CmsError';\n this.statusCode = input.statusCode ?? 0;\n this.code = input.code ?? 'unknown';\n this.fieldErrors = input.fieldErrors;\n this.requestId = input.requestId;\n this.traceId = input.traceId;\n }\n\n get isUnauthorized(): boolean {\n return this.statusCode === 401;\n }\n get isForbidden(): boolean {\n return this.statusCode === 403;\n }\n get isNotFound(): boolean {\n return this.statusCode === 404;\n }\n get isValidation(): boolean {\n return this.statusCode === 422;\n }\n get isNetwork(): boolean {\n return this.code === 'network' || this.statusCode === 0;\n }\n}\n","import type { $Fetch, FetchContext, FetchOptions, FetchResponse } from 'ofetch';\nimport { $fetch } from 'ofetch';\nimport {\n HTTP_DEFAULTS,\n HTTP_HEADER,\n HTTP_RETRY_STATUS_CODES,\n RESPONSE_CASING_VALUE,\n type RequestCasing,\n type ResponseCasing,\n} from '../common/constants/http.constant';\nimport { toSnakeCaseKeys } from '../common/utils/case';\nimport type { TokenManager } from './credentials/TokenManager';\nimport { CmsError } from './errors';\n\nexport interface IDeviceContext {\n deviceId?: string | (() => string | null);\n deviceIp?: string | (() => string | null);\n}\n\nexport interface ICreateApiOptions {\n baseURL: string;\n tokenManager: TokenManager;\n clientId?: string;\n device?: IDeviceContext;\n /** Default request timeout in ms. */\n timeout?: number;\n /** Retry count for transient failures. */\n retry?: number;\n /** Global handler invoked for every error AFTER normalisation. */\n onError?: (error: CmsError) => void;\n /** Invoked when a 401 is observed (e.g. force logout / redirect). */\n onUnauthorized?: (error: CmsError) => void;\n /**\n * Async hook called whenever the access token changes (login, refresh, 401).\n * When provided, the hook fully owns token storage updates (including the\n * underlying TokenManager). When omitted, createApi falls back to updating\n * TokenManager directly.\n */\n onToken?: (token: string | null) => void | Promise<void>;\n /**\n * Silent token refresh. When provided, a 401 triggers ONE refresh attempt:\n * the returned token replaces the access token and the request is replayed\n * (via ofetch's native retry). Return `null` to signal \"refresh failed\"\n * (the SDK then clears the session + fires `onUnauthorized`).\n */\n refresh?: () => Promise<string | null>;\n /**\n * Response casing to request from the backend. `'camel'` (default) sends no\n * header (matches the backend default + the SDK's DTOs); `'snake'` sends\n * `x-response-casing: snake`.\n */\n responseCasing?: ResponseCasing;\n /**\n * Request casing, declared to the backend via the `x-request-casing` header.\n * Default `'camel'` (no header; bodies keep the SDK's camelCase keys). `'snake'`\n * deep-converts request body keys to snake_case and sends the header.\n */\n requestCasing?: RequestCasing;\n /** Extra per-request middlewares (the \"dynamic interceptor\" escape hatch). */\n requestMiddlewares?: RequestMiddleware[];\n}\n\nexport interface IRequestContext {\n tokenManager: TokenManager;\n}\n\n/** Single request middleware. Return value is ignored; mutate `options`. */\nexport type RequestMiddleware = (options: FetchOptions, ctx: IRequestContext) => void;\n\n/**\n * Build a typed `$Fetch` instance for one endpoint (CMS, report, …).\n *\n * Hooks:\n * - `onRequest` → inject Authorization / DeviceID / DeviceIP / client_id\n * - `onResponse` → sliding-session token refresh from response header\n * - `onResponseError` → normalise to `CmsError`; on 401, silently refresh +\n * replay once (when `refresh` is provided), else trigger `onUnauthorized`\n *\n * Multiple endpoints share the same `tokenManager` so a refresh from one\n * backend is visible to all.\n */\nexport function createApi(opts: ICreateApiOptions): $Fetch {\n const {\n baseURL,\n tokenManager,\n clientId,\n device,\n timeout = HTTP_DEFAULTS.TIMEOUT_MS,\n retry = HTTP_DEFAULTS.RETRY,\n onError,\n onUnauthorized,\n onToken,\n refresh,\n responseCasing,\n requestCasing,\n requestMiddlewares = [],\n } = opts;\n\n const resolve = (v?: string | (() => string | null)): string | undefined => {\n if (!v) return undefined;\n return typeof v === 'function' ? (v() ?? undefined) : v;\n };\n\n return $fetch.create({\n baseURL,\n timeout,\n retry,\n // When a refresh handler is configured, 401 is retried so the refreshed\n // token gets a chance to replay the request (see onResponseError).\n retryStatusCodes: refresh ? [401, ...HTTP_RETRY_STATUS_CODES] : [...HTTP_RETRY_STATUS_CODES],\n async onRequest({ options }: FetchContext) {\n const headers = new Headers(options.headers as HeadersInit | undefined);\n\n const auth = tokenManager.getHeader();\n if (auth) headers.set(tokenManager.headerName, auth);\n\n const deviceId = resolve(device?.deviceId);\n if (deviceId) headers.set(HTTP_HEADER.DEVICE_ID, deviceId);\n const deviceIp = resolve(device?.deviceIp);\n if (deviceIp) headers.set(HTTP_HEADER.DEVICE_IP, deviceIp);\n if (clientId) headers.set(HTTP_HEADER.CLIENT_ID, clientId);\n\n // Opt into snake_case responses when configured (camel is the backend\n // default and matches the SDK's DTOs, so no header is sent otherwise).\n if (responseCasing === RESPONSE_CASING_VALUE.SNAKE) {\n headers.set(HTTP_HEADER.RESPONSE_CASING, RESPONSE_CASING_VALUE.SNAKE);\n }\n\n // Opt into snake_case request bodies when configured: declare it via the\n // header and deep-convert the body's keys (values are left untouched).\n if (requestCasing === RESPONSE_CASING_VALUE.SNAKE) {\n headers.set(HTTP_HEADER.REQUEST_CASING, RESPONSE_CASING_VALUE.SNAKE);\n if (options.body && typeof options.body === 'object') {\n options.body = toSnakeCaseKeys(options.body);\n }\n }\n\n options.headers = headers;\n\n // Custom middlewares (add/remove at runtime via requestMiddlewares array).\n for (const mw of requestMiddlewares) {\n mw(options as FetchOptions, { tokenManager });\n }\n },\n async onResponse(context: FetchContext) {\n // Sliding-session refresh: backend returns the rotated token here.\n const response = context.response;\n if (!response) return;\n const newToken = response.headers.get(tokenManager.headerName.toLowerCase());\n if (newToken) {\n const cleaned = newToken.startsWith(`${tokenManager.prefix}`)\n ? newToken.slice(tokenManager.prefix.length)\n : newToken;\n if (onToken) {\n // Caller owns token persistence (e.g. Nuxt httpOnly cookie sync).\n await onToken(cleaned);\n } else {\n tokenManager.set(cleaned);\n }\n }\n },\n async onResponseError(context: FetchContext) {\n if (!context.response) return;\n const err = _normaliseError(context.response as FetchResponse<unknown>);\n const opts = context.options as FetchOptions & {\n __cmsRefreshed?: boolean;\n __cmsFinalized?: boolean;\n };\n\n if (err.isUnauthorized) {\n // First 401 with a refresh handler: rotate the access token once, then\n // replay this request exactly once with the new token.\n if (refresh && !opts.__cmsRefreshed) {\n opts.__cmsRefreshed = true;\n try {\n const newToken = await refresh();\n if (newToken) {\n if (onToken) await onToken(newToken);\n else tokenManager.set(newToken);\n // Explicitly opt this single request back into ofetch's native\n // retry so it is replayed with the just-rotated token. The global\n // default (`retry: 0`) never retries a 401 on its own, so without\n // this the refreshed token would be stored but never used and the\n // original 401 would propagate to the caller. `onRequest` re-runs\n // on retry and re-injects the new header. If the replay 401s\n // again, `__cmsRefreshed` is already set and the finalize block\n // below runs.\n opts.retry = 1;\n return;\n }\n } catch {\n // refresh threw — fall through to finalize (treat as terminal).\n }\n }\n // Terminal 401: refresh unavailable, refresh returned no token, refresh\n // threw, or the post-refresh replay 401'd again. Give up exactly once.\n if (!opts.__cmsFinalized) {\n opts.__cmsFinalized = true;\n opts.retry = 0; // stop ofetch from retrying any further\n if (onToken) await onToken(null);\n else tokenManager.clear();\n onUnauthorized?.(err);\n onError?.(err);\n }\n return;\n }\n\n onError?.(err);\n },\n });\n}\n\nfunction _normaliseError(response: FetchResponse<unknown>): CmsError {\n const statusCode = response.status;\n const headers = response.headers as\n | Headers\n | Record<string, string | null | undefined>\n | undefined;\n const readHeader = (name: string): string | undefined => {\n if (!headers) return undefined;\n if (typeof (headers as Headers).get === 'function') {\n const v = (headers as Headers).get(name);\n return typeof v === 'string' && v.length > 0 ? v : undefined;\n }\n const v = (headers as Record<string, string | null | undefined>)[name.toLowerCase()];\n return typeof v === 'string' && v.length > 0 ? v : undefined;\n };\n const requestId = readHeader(HTTP_HEADER.REQUEST_ID);\n const traceId = readHeader('x-trace-id');\n\n let body: unknown;\n body = response._data ?? undefined;\n\n let message = `Request failed with status ${statusCode}`;\n let code = 'unknown';\n let fieldErrors: Record<string, string> | undefined;\n\n if (body && typeof body === 'object') {\n const b = body as Record<string, unknown>;\n message = (b.message as string) ?? (b.error as string) ?? message;\n code = (b.code as string) ?? code;\n if (b.errors && typeof b.errors === 'object') {\n fieldErrors = b.errors as Record<string, string>;\n }\n }\n\n if (statusCode === 0) {\n return new CmsError({\n message: 'Network error',\n statusCode: 0,\n code: 'network',\n requestId,\n traceId,\n });\n }\n\n return new CmsError({ message, statusCode, code, fieldErrors, requestId, traceId });\n}\n","/**\n * Structured deep clone for JSON-safe values.\n *\n * Used internally by mock resolvers so returned data can be mutated by the\n * caller without affecting the shared fake dataset. Not exported publicly —\n * it serves the SDK only.\n */\nexport function deepClone<T>(value: T): T {\n return JSON.parse(JSON.stringify(value)) as T;\n}\n","import type { IAuthSessionResponse, IAuthUser, IEmployee } from './auth.type';\n\n/**\n * Fake auth data for mock mode.\n *\n * NOTE: in mock mode the request never reaches the network, so the\n * `createApi` `onResponse` hook (which captures the token from the response\n * header) does NOT fire. To simulate a logged-in session under mock, call\n * `sdk.tokenManager.set('<fake-token>')` explicitly, or wire it from the\n * store's mock login branch.\n */\nexport const MOCK_AUTH_USER: IAuthUser = {\n id: 9001,\n email: 'trader@example.com',\n name: 'Demo Trader',\n firstName: 'Demo',\n lastName: 'Trader',\n phone: '+10000000000',\n country: 'US',\n state: 'active',\n allowRoutes: ['*'],\n kycId: 1,\n clientId: 1,\n};\n\nconst MOCK_EMPLOYEE: IEmployee | undefined = undefined;\n\nexport const MOCK_SESSION: IAuthSessionResponse = {\n user: MOCK_AUTH_USER,\n employee: MOCK_EMPLOYEE,\n};\n","import type { $Fetch } from 'ofetch';\nimport { AUTH_ENDPOINT, AUTH_PROXY_PATH } from '../../common/constants/auth.constant';\nimport { HTTP_HEADER } from '../../common/constants/http.constant';\nimport { deepClone } from '../../common/utils/clone';\nimport { MOCK_SESSION } from './mock';\nimport type { IAuthSessionResponse, ICmsUser, ILoginPayload, IUsersQuery } from './auth.type';\n\nexport interface IAuthServiceOptions {\n /** The CMS `$Fetch` instance (one of `sdk.apis`). */\n api: $Fetch;\n /**\n * Optional `$Fetch` for token-lifecycle flows (login/logout/token). The\n * Nuxt module points this at `/api/cms/*` server routes so those flows set\n * the httpOnly cookie atomically and return the token in the body. When\n * omitted, token-lifecycle flows call the backend directly via `api` (token\n * captured by the `createApi` `onResponse` hook).\n */\n routeApi?: $Fetch;\n /** Lazy flag — when true, the service returns fake data. */\n mock: () => boolean;\n}\n\n/** Session response possibly augmented with `token` (when served via a route). */\nexport type IAuthRouteResponse = IAuthSessionResponse & { token?: string };\n\n/** Response of the OAuth token (refresh) endpoint. */\nexport interface ITokenResponse {\n /** New access token (present when served via the Nuxt proxy). */\n token?: string;\n accessToken?: string;\n refreshToken?: string;\n [key: string]: unknown;\n}\n\n/** Response of `POST /api/v1/auth/oauth/cbs/start` (\"Login with CBS\" init). */\nexport interface ICbsStartResponse {\n /** CBS `/oauth/authorize` URL (carries the PKCE challenge) the browser navigates to. */\n authorizeUrl: string;\n /** Opaque handle echoed back to `/cbs-callback`; pairs the flow with the server-side PKCE/state. */\n stateKey: string;\n /** Same as `authorizeUrl` (kept for client-API symmetry). */\n redirectTarget: string;\n}\n\n/**\n * Registered IdP SSO provider names (api_references §2). Only providers the\n * engine has credentials for are active — others 404 on the login init.\n */\nexport type AuthIdpProvider = 'microsoft' | (string & {});\n\n/** Response of the IdP SSO login init (`GET /api/auth/{provider}/login`). */\nexport interface IIdpLoginStartResponse {\n /** Provider authorize URL (e.g. `login.microsoftonline.com/{tenant}/oauth2/v2.0/authorize`) — the browser navigates here. */\n authorizationUrl: string;\n /** One-use state bound to the flow (TTL 600s); echo it back on the callback. */\n state: string;\n}\n\n/**\n * Response of the IdP SSO callback (`GET /api/auth/{provider}/callback`).\n * The access token is a JWT resolved via JWKS — usable as a normal Bearer\n * credential for every protected API.\n */\nexport interface IIdpCallbackResponse extends IAuthSessionResponse {\n /** CMS user id behind the IdP identity. */\n userId?: number;\n /** True when the callback created a new CMS user. */\n isNewUser?: boolean;\n /** Provider name (e.g. `microsoft`). */\n provider?: string;\n /** Access token mirror (present when served via the Nuxt proxy). */\n token?: string;\n accessToken?: string;\n refreshToken?: string;\n /** Access-token lifetime in seconds. */\n expiresIn?: number;\n}\n\n/** Response of `GET /api/auth/users` — list envelope (paginated or bare array). */\nexport interface IUsersResponse {\n items: ICmsUser[];\n total?: number;\n page?: number;\n perPage?: number;\n}\n\nexport interface IAuthService {\n login(payload: ILoginPayload, userAgent?: string): Promise<IAuthRouteResponse>;\n logout(): Promise<unknown>;\n /** Exchange the refresh token for a new access token (`POST /api/oauth/token`). */\n token(): Promise<ITokenResponse>;\n /**\n * User registry (`GET /api/auth/users`) — the CMS auth users. Accepts\n * pagination + free-text search; normalizes bare-array responses into\n * `{ items }`.\n */\n users(query?: IUsersQuery): Promise<IUsersResponse>;\n /** Initialise a \"Login with CBS\" attempt (`POST /api/v1/auth/oauth/cbs/start`). */\n cbsStart(): Promise<ICbsStartResponse>;\n /** Complete a \"Login with CBS\" attempt (`POST /api/v1/auth/oauth/cbs/callback`). */\n cbsCallback(code: string, state: string, stateKey: string): Promise<IAuthRouteResponse>;\n /**\n * Initialise an IdP SSO login (`GET /api/auth/{provider}/login`). Returns the\n * provider authorize URL + one-use state; navigate the browser there.\n */\n idpLogin(provider: AuthIdpProvider, redirectUri: string): Promise<IIdpLoginStartResponse>;\n /**\n * Complete an IdP SSO login (`GET /api/auth/{provider}/callback`). Exchanges\n * `{code, state, redirectUri}` for a CMS JWT + refresh token; when served via\n * the Nuxt proxy the httpOnly cookies are already set and `token` mirrors the\n * access token.\n */\n idpCallback(\n provider: AuthIdpProvider,\n code: string,\n state: string,\n redirectUri: string\n ): Promise<IIdpCallbackResponse>;\n /** Link the signed-in user to the provider (`POST /api/auth/{provider}/link`). */\n idpLink(provider: AuthIdpProvider): Promise<unknown>;\n /** Unlink the provider from the signed-in user (`DELETE /api/auth/{provider}/unlink`). */\n idpUnlink(provider: AuthIdpProvider): Promise<unknown>;\n}\n\n/**\n * Auth domain service. Mirrors the CMS backend auth surface, which exposes\n * exactly three endpoints:\n *\n * POST /api/auth/login → login (confirmed — real backend)\n * POST /api/auth/logout → logout (confirmed — real backend, POST)\n * POST /api/oauth/token → token (confirmed — OAuth, grant_type=refresh_token)\n *\n * The access token is NOT returned in the login body — it travels in the\n * response header and is auto-captured by the `createApi` `onResponse` hook\n * into `TokenManager`. Callers therefore only deal with session domain data.\n * The `token()` method (refresh) returns the new access token in the body\n * (`{ token }`) so the caller can mirror it in memory.\n *\n * When a `routeApi` (Nuxt module) is configured, all three flows route through\n * the app-origin proxies (`/api/cms/login`, `/api/cms/logout`, `/api/cms/refresh`)\n * so the httpOnly cookies are set/cleared/rotated atomically.\n */\nexport function createAuthService(opts: IAuthServiceOptions): IAuthService {\n const { api, mock } = opts;\n\n // Token-lifecycle flows use `routeApi` when provided (Nuxt server routes that\n // set the httpOnly cookie); otherwise they call the backend directly via `api`.\n const tokenApi = opts.routeApi ?? api;\n\n const loginEndpoint = opts.routeApi ? AUTH_PROXY_PATH.LOGIN : AUTH_ENDPOINT.LOGIN;\n const logoutEndpoint = opts.routeApi ? AUTH_PROXY_PATH.LOGOUT : AUTH_ENDPOINT.LOGOUT;\n const refreshEndpoint = opts.routeApi ? AUTH_PROXY_PATH.REFRESH : AUTH_ENDPOINT.REFRESH;\n const cbsStartEndpoint = opts.routeApi ? AUTH_PROXY_PATH.CBS_START : AUTH_ENDPOINT.CBS_START;\n const cbsCallbackEndpoint = opts.routeApi\n ? AUTH_PROXY_PATH.CBS_CALLBACK\n : AUTH_ENDPOINT.CBS_CALLBACK;\n const idpLoginEndpoint = opts.routeApi ? AUTH_PROXY_PATH.IDP_LOGIN : null;\n const idpCallbackEndpoint = opts.routeApi ? AUTH_PROXY_PATH.IDP_CALLBACK : null;\n const idpLinkEndpoint = opts.routeApi ? AUTH_PROXY_PATH.IDP_LINK : null;\n const idpUnlinkEndpoint = opts.routeApi ? AUTH_PROXY_PATH.IDP_UNLINK : null;\n\n return {\n async login(payload, userAgent) {\n if (mock()) return deepClone(MOCK_SESSION);\n return tokenApi<IAuthRouteResponse>(loginEndpoint, {\n method: 'POST',\n body: payload,\n headers: _ua(userAgent),\n });\n },\n\n async logout() {\n if (mock()) return { success: true };\n // Real backend logout is a POST (not DELETE).\n return tokenApi(logoutEndpoint, { method: 'POST' });\n },\n\n async token() {\n if (mock()) return { token: 'mock-refreshed-jwt' };\n return tokenApi<ITokenResponse>(refreshEndpoint, { method: 'POST' });\n },\n\n async users(query: IUsersQuery = {}): Promise<IUsersResponse> {\n if (mock()) {\n return {\n items: [\n { id: 1, email: 'operator@eaera.com', name: 'Operator One' },\n { id: 2, email: 'admin@eaera.com', name: 'Admin Two' },\n ],\n total: 2,\n page: query.page ?? 1,\n perPage: query.perPage ?? 100,\n };\n }\n // Direct backend call (NOT the /api/cms proxy — only token-lifecycle\n // flows have proxies). The transport attaches the Bearer token.\n const httpQuery: Record<string, unknown> = {};\n if (query.page != null) httpQuery.page = query.page;\n if (query.perPage != null) {\n httpQuery.perPage = query.perPage;\n httpQuery.per_page = query.perPage;\n }\n if (query.search) {\n httpQuery.search = query.search;\n httpQuery.q = query.search;\n }\n const res = await api<ICmsUser[] | Record<string, unknown>>(AUTH_ENDPOINT.USERS, {\n query: Object.keys(httpQuery).length ? httpQuery : undefined,\n });\n // Bare array vs envelope — normalize so callers always see `{items}`.\n const raw = Array.isArray(res)\n ? res\n : ((res as { items?: ICmsUser[]; data?: ICmsUser[] }).items ??\n (res as { data?: ICmsUser[] }).data ??\n []);\n // Mounted routers answer snake_case label fields — camel them so the\n // DTO contract holds regardless of casing middleware.\n const items = raw.map(_camelUser);\n if (Array.isArray(res)) return { items };\n const env = res as { total?: number };\n return {\n items,\n total: env.total,\n page: (res as { page?: number }).page,\n perPage:\n (res as { perPage?: number; per_page?: number }).perPage ??\n (res as { per_page?: number }).per_page,\n };\n },\n\n async cbsStart() {\n if (mock()) {\n return {\n authorizeUrl: 'https://cbs.mock/oauth/authorize?mock=1',\n stateKey: 'mock-state-key',\n redirectTarget: 'https://cbs.mock/oauth/authorize?mock=1',\n };\n }\n return tokenApi<ICbsStartResponse>(cbsStartEndpoint, { method: 'POST', body: {} });\n },\n\n async cbsCallback(code, state, stateKey) {\n if (mock()) return deepClone(MOCK_SESSION);\n return tokenApi<IAuthRouteResponse>(cbsCallbackEndpoint, {\n method: 'POST',\n body: { code, state, stateKey },\n });\n },\n\n async idpLogin(provider, redirectUri) {\n if (mock()) {\n return {\n authorizationUrl: 'https://login.microsoftonline.com/mock/oauth2/v2.0/authorize?mock=1',\n state: 'mock-idp-state',\n };\n }\n const res = (await tokenApi(\n idpLoginEndpoint ?? AUTH_ENDPOINT.idpLogin(provider),\n idpLoginEndpoint\n ? // Proxied — the provider rides along as a query param.\n { query: { provider, redirect_uri: redirectUri } }\n : { query: { redirect_uri: redirectUri } }\n )) as Record<string, unknown>;\n return {\n authorizationUrl: (res.authorizationUrl ?? res.authorization_url) as string,\n state: res.state as string,\n };\n },\n\n async idpCallback(provider, code, state, redirectUri) {\n if (mock()) {\n return {\n ...deepClone(MOCK_SESSION),\n userId: 1,\n isNewUser: false,\n provider,\n token: 'mock-idp-jwt',\n accessToken: 'mock-idp-jwt',\n refreshToken: 'mock-idp-refresh',\n expiresIn: 3600,\n };\n }\n const res = (await tokenApi(idpCallbackEndpoint ?? AUTH_ENDPOINT.idpCallback(provider), {\n query: idpCallbackEndpoint\n ? { provider, code, state, redirect_uri: redirectUri }\n : { code, state, redirect_uri: redirectUri },\n })) as Record<string, unknown>;\n const token =\n (res.token as string | undefined) ??\n (res.accessToken as string | undefined) ??\n (res.access_token as string | undefined);\n return {\n user: (res.user ?? undefined) as IIdpCallbackResponse['user'],\n employee: (res.employee ?? undefined) as IIdpCallbackResponse['employee'],\n userId: (res.userId ?? res.user_id) as number | undefined,\n isNewUser: (res.isNewUser ?? res.is_new_user) as boolean | undefined,\n provider: (res.provider ?? provider) as string,\n token: token || undefined,\n accessToken: (res.accessToken ?? res.access_token) as string | undefined,\n refreshToken: (res.refreshToken ?? res.refresh_token) as string | undefined,\n expiresIn: (res.expiresIn ?? res.expires_in) as number | undefined,\n };\n },\n\n async idpLink(provider) {\n if (mock()) return { success: true, provider };\n return tokenApi(idpLinkEndpoint ?? AUTH_ENDPOINT.idpLink(provider), {\n method: 'POST',\n ...(idpLinkEndpoint ? { body: { provider } } : {}),\n });\n },\n\n async idpUnlink(provider) {\n if (mock()) return { success: true, provider };\n return tokenApi(idpUnlinkEndpoint ?? AUTH_ENDPOINT.idpUnlink(provider), {\n method: 'DELETE',\n ...(idpUnlinkEndpoint ? { query: { provider } } : {}),\n });\n },\n };\n}\n\n/* ----------------------------- file-private helpers ----------------------------- */\n\nfunction _ua(userAgent?: string): Record<string, string> | undefined {\n return userAgent ? { [HTTP_HEADER.USER_AGENT]: userAgent } : undefined;\n}\n\n/** Normalize a `GET /api/auth/users` row to the camelCase `ICmsUser` shape\n * (mounted routers answer snake_case; casing middleware may or may not be\n * active). Never invents fields — absent stays absent. */\nfunction _camelUser(row: ICmsUser): ICmsUser {\n const r = row as unknown as Record<string, unknown>;\n const pick = <T>(camel: string, snake: string): T | undefined =>\n (r[camel] as T | undefined) ?? (r[snake] as T | undefined);\n const out: ICmsUser = { id: Number(r.id) };\n const uuid = pick<string>('uuid', 'uuid');\n if (uuid) out.uuid = uuid;\n const email = pick<string>('email', 'email');\n if (email) out.email = email;\n const name = pick<string>('name', 'name');\n if (name) out.name = name;\n const firstName = pick<string>('firstName', 'first_name');\n if (firstName) out.firstName = firstName;\n const lastName = pick<string>('lastName', 'last_name');\n if (lastName) out.lastName = lastName;\n const username = pick<string>('username', 'username');\n if (username) out.username = username;\n const fullName = pick<string>('fullName', 'full_name');\n if (fullName) out.fullName = fullName;\n const phone = pick<string>('phone', 'phone');\n if (phone) out.phone = phone;\n const clientId = pick<number>('clientId', 'client_id');\n if (clientId != null) out.clientId = clientId;\n return out;\n}\n","/**\n * Chart-bars endpoints (`eaera_cms/chart/routes.py`).\n * The canonical OHLC read path for chart rendering of any timeframe.\n */\nexport const BARS_ENDPOINT = {\n BASE: '/api/v1/chart/bars',\n} as const;\n\n/** Chart-bars query defaults (doc §5.5.1). */\nexport const BARS_DEFAULTS = {\n LIMIT: 1000,\n LIMIT_MIN: 1,\n LIMIT_MAX: 5000,\n SORT_DIRECTION: 'asc' as const,\n} as const;\n","import { MT5_INTERVAL, type MT5Interval } from '../../common/constants/mt5.constant';\n\n/** Single source-interval value (always M1; doc §5.5.2). */\ntype M1Only = typeof MT5_INTERVAL.M1;\n\n/**\n * Chart-bars query — mirrors BE `GET /api/v1/chart/bars` (doc §5.5.1).\n * All fields use camelCase; the service forwards them verbatim to the backend.\n */\nexport interface BarsQuery {\n symbol: string;\n /**\n * Accepts FE-style ('1m','5m','15m','30m','1h','4h','1d','1w','1M')\n * OR MT5-style ('M1'…'MN1'). Passed through verbatim; the backend maps\n * both to the same bucket width.\n */\n interval: MT5Interval | ChartIntervalFe | (string & {});\n /** ISO-8601, inclusive lower bound. */\n fromTime: string;\n /** ISO-8601, exclusive upper bound, strictly > fromTime. */\n toTime: string;\n /** MT5 server filter. Defaults to MT5_SERVER_NAME when omitted. */\n serverName?: string;\n /** 1..5000, applied AFTER aggregation. Default 1000. */\n limit?: number;\n /** 'asc' (oldest first, default) | 'desc' (newest first). */\n sortDirection?: BarsSortDirection;\n}\n\nexport type BarsSortDirection = 'asc' | 'desc';\n\n/** Aggregation-source label for a derived bar (doc §5.5.2). Distinct from\n * MT5ChartBarSource (raw Mt5ChartBar.data.source, doc §4.6). */\nexport type BarsItemSource = 'aggregated' | 'live' | 'backfill';\n\nexport interface BarItem {\n symbol: string;\n /** Canonical MT5-style bucket width. */\n interval: MT5Interval;\n /** ISO-8601 UTC; bucket-start for aggregated bars. */\n mt5Ts: string;\n open: number;\n high: number;\n low: number;\n close: number;\n tickVolume: number | null;\n volume: number | null;\n spread: number | null;\n source: BarsItemSource | null;\n}\n\nexport interface BarsResponse {\n items: BarItem[];\n symbol: string;\n /** Canonical label returned by the backend. */\n interval: MT5Interval;\n /** ISO-8601 UTC (= parsed fromTime). */\n fromTime: string;\n /** ISO-8601 UTC (= parsed toTime). */\n toTime: string;\n /** Always 'M1' — the only persisted interval. */\n sourceInterval: M1Only;\n /** items.length. */\n count: number;\n /** true iff interval !== 'M1' and bucketing occurred. */\n aggregated: boolean;\n}\n\n/** FE-style timeframe labels accepted by GET /api/v1/chart/bars (doc §5.5.1). */\nexport const CHART_INTERVAL = {\n M1: '1m',\n M5: '5m',\n M15: '15m',\n M30: '30m',\n H1: '1h',\n H4: '4h',\n D1: '1d',\n W1: '1w',\n MN1: '1M',\n} as const;\n\nexport type ChartIntervalFe = (typeof CHART_INTERVAL)[keyof typeof CHART_INTERVAL];\n\n/** FE→MT5 reverse map (e.g. '1h' → 'H1'). */\nconst FE_TO_MT5: Record<string, MT5Interval> = {\n '1m': 'M1',\n '5m': 'M5',\n '15m': 'M15',\n '30m': 'M30',\n '1h': 'H1',\n '4h': 'H4',\n '1d': 'D1',\n '1w': 'W1',\n '1M': 'MN1',\n};\n\n/** Map either dialect to the canonical MT5 label. */\nexport function normalizeChartInterval(input: MT5Interval | ChartIntervalFe | string): MT5Interval {\n if (FE_TO_MT5[input]) return FE_TO_MT5[input];\n return input as MT5Interval;\n}\n","import type { BarItem, BarsResponse } from './bars.type';\nimport { normalizeChartInterval } from './bars.type';\nimport { MT5_INTERVAL } from '../../common/constants/mt5.constant';\n\n/**\n * Fake OHLC bars for EURUSD spanning both M1 and H1 buckets.\n * Includes rows with null fields to exercise nullability.\n */\nexport const MOCK_BARS: BarItem[] = [\n {\n symbol: 'EURUSD',\n interval: MT5_INTERVAL.M1,\n mt5Ts: '2026-07-19T12:00:00+00:00',\n open: 1.089,\n high: 1.0901,\n low: 1.0887,\n close: 1.0895,\n tickVolume: 630,\n volume: 0,\n spread: 0,\n source: 'live',\n },\n {\n symbol: 'EURUSD',\n interval: MT5_INTERVAL.M1,\n mt5Ts: '2026-07-19T12:01:00+00:00',\n open: 1.0895,\n high: 1.0905,\n low: 1.0892,\n close: 1.09,\n tickVolume: 512,\n volume: null,\n spread: null,\n source: 'live',\n },\n {\n symbol: 'EURUSD',\n interval: MT5_INTERVAL.H1,\n mt5Ts: '2026-07-19T12:00:00+00:00',\n open: 1.089,\n high: 1.0915,\n low: 1.0887,\n close: 1.0908,\n tickVolume: 4120,\n volume: 0,\n spread: 0,\n source: 'aggregated',\n },\n {\n symbol: 'EURUSD',\n interval: MT5_INTERVAL.H1,\n mt5Ts: '2026-07-19T13:00:00+00:00',\n open: 1.0908,\n high: 1.092,\n low: 1.0901,\n close: 1.0912,\n tickVolume: null,\n volume: null,\n spread: null,\n source: null,\n },\n];\n\ninterface MockBarsParams {\n symbol: string;\n interval: string;\n fromTime?: string;\n toTime?: string;\n serverName?: string;\n limit?: number;\n sortDirection?: 'asc' | 'desc';\n}\n\n/**\n * Build a fake BarsResponse matching the requested interval.\n * Filters MOCK_BARS by interval, echoes symbol/interval, sets\n * sourceInterval='M1', aggregated=(interval!=='M1'), count=items.length.\n */\nexport function mockBars(params: MockBarsParams): BarsResponse {\n const canonical = normalizeChartInterval(params.interval);\n const isM1 = canonical === MT5_INTERVAL.M1;\n const items = MOCK_BARS.filter((b) => b.interval === canonical);\n const sorted = params.sortDirection === 'desc' ? [...items].reverse() : items;\n const limited = params.limit ? sorted.slice(0, params.limit) : sorted;\n\n return {\n items: limited,\n symbol: params.symbol,\n interval: canonical,\n fromTime: params.fromTime ?? '2026-07-19T12:00:00+00:00',\n toTime: params.toTime ?? '2026-07-20T12:00:00+00:00',\n sourceInterval: MT5_INTERVAL.M1,\n count: limited.length,\n aggregated: !isM1,\n };\n}\n","import type { $Fetch } from 'ofetch';\nimport { BARS_ENDPOINT } from '../../common/constants/bars.constant';\nimport { MT5_SERVER_NAME } from '../../common/constants/mt5.constant';\nimport { mockBars } from './mock';\nimport type { BarsQuery, BarsResponse } from './bars.type';\n\nexport interface IBarsServiceOptions {\n /** The CMS `$Fetch` instance (one of `sdk.apis`). */\n api: $Fetch;\n /** Lazy flag — when true, the service returns fake data. */\n mock: () => boolean;\n}\n\nexport interface IBarsService {\n getBars(query: BarsQuery): Promise<BarsResponse>;\n}\n\n/**\n * Chart-bars service (read-only). Wraps `GET /api/v1/chart/bars` — the\n * canonical OHLC read path for chart rendering of any timeframe. Storage\n * is always M1; larger timeframes are derived on demand via bucket-and-reduce.\n *\n * Endpoint contract (`eaera_cms/chart/routes.py`, doc §5.5):\n * GET /api/v1/chart/bars → BarsResponse\n *\n * While `mock()` returns true, all methods resolve against the local fake\n * dataset and never touch `api`.\n */\nexport function createBarsService(opts: IBarsServiceOptions): IBarsService {\n const { api, mock } = opts;\n\n return {\n async getBars(query: BarsQuery): Promise<BarsResponse> {\n if (mock()) {\n return mockBars({\n symbol: query.symbol,\n interval: query.interval,\n fromTime: query.fromTime,\n toTime: query.toTime,\n serverName: query.serverName,\n limit: query.limit,\n sortDirection: query.sortDirection,\n });\n }\n\n const apiQuery: Record<string, unknown> = {\n symbol: query.symbol,\n interval: query.interval,\n fromTime: query.fromTime,\n toTime: query.toTime,\n serverName: query.serverName ?? MT5_SERVER_NAME,\n };\n\n if (query.limit !== undefined) {\n apiQuery.limit = query.limit;\n }\n if (query.sortDirection !== undefined) {\n apiQuery.sortDirection = query.sortDirection;\n }\n\n return api<BarsResponse>(BARS_ENDPOINT.BASE, { query: apiQuery });\n },\n };\n}\n","/**\n * CMS content CRUD endpoints (`eaera_cms/core/content/routes.py`).\n *\n * NOTE: the **singular** `/api/v1/content` namespace is the CRUD path.\n * The plural `/api/v1/contents` (`query/routes.py`) is a read-only query\n * path (list/search/count) and does NOT support `{uuid}` mutations.\n */\nexport const CONTENT_ENDPOINT = {\n BASE: '/api/v1/content',\n detail: (uuid: string): string => `/api/v1/content/${uuid}`,\n /** List available CT actions for a content item (GET). */\n actions: (uuid: string): string => `/api/v1/content/${uuid}/actions`,\n /** Invoke a CT action on a content item (POST). */\n action: (uuid: string, actionName: string): string =>\n `/api/v1/content/${uuid}/actions/${actionName}`,\n} as const;\n\n/** Content list defaults (`/api/v1/content` paginates with page/perPage). */\nexport const CONTENT_DEFAULTS = {\n PAGE: 1,\n PER_PAGE: 100,\n} as const;\n\n/**\n * Content Type names registered by the mt5 pack (`eaera_mt5/pack.yaml`).\n *\n * The SDK holds a typed slice per CT in `useContentStore` and a generic\n * `fetchByType(typeName, ...)` action that accepts any of these names.\n *\n * Full schema for each CT lives in `eaera-docs/cbs/eaera-mt5/data/data-design.md` §2\n * and the per-CT action inventory lives in\n * `eaera-docs/cbs/cms-sdk/services/content.md#content-types-registered-by-the-mt5-pack`.\n */\nexport const CONTENT_TYPE = {\n MT5_SERVER: 'Mt5Server',\n MT5_ACCOUNT: 'Mt5Account',\n MT5_GROUP: 'Mt5Group',\n MT5_SYNC_STATE: 'Mt5SyncState',\n REPORT_DEFINITION: 'ReportDefinition',\n LLM_CONVERSATION: 'LlmConversation',\n KALSHI_SERVER: 'KalshiServer',\n KALSHI_EVENT: 'KalshiEvent',\n KALSHI_FUTURE: 'KalshiFuture',\n // v1 pack webtrade CTs (FEAT-001 / FEAT-002 / FEAT-006 / FEAT-008 / FEAT-016).\n // Schema mirror: see eaera-mt5/eaera_mt5/pack.yaml §content_types and\n // eaera-docs/cbs/eaera-webtrade/eaera-cfd-webtrade/tradeapi/\n // api-inventory.md §B.4 for the canonical field shapes. The FE picks\n // the effective spread / margin / leverage via ``data.spread_by_group``\n // / ``margin_by_group`` / ``leverage_by_group`` for the active\n // account's group, falling back to the ``*_default`` columns.\n MT5_SYMBOL: 'Mt5Symbol',\n MT5_CATEGORY: 'Mt5Category',\n MT5_WATCHLIST: 'Mt5Watchlist',\n MT5_CHART_BAR: 'Mt5ChartBar',\n MT5_POSITION_HISTORY: 'Mt5PositionHistory',\n MT5_ORDER_HISTORY: 'Mt5OrderHistory',\n MT5_DEAL_HISTORY: 'Mt5DealHistory',\n MT5_DRAWING: 'Mt5Drawing',\n} as const;\n\n/**\n * Union of every CT name as a TypeScript string-literal type.\n * Use this when typing variables instead of importing the constants object.\n */\nexport type ContentTypeName = (typeof CONTENT_TYPE)[keyof typeof CONTENT_TYPE];\n\n/** Convenience: every CT name as a readonly array (iteration, validation). */\nexport const CONTENT_TYPE_NAMES: readonly ContentTypeName[] = Object.freeze(\n Object.values(CONTENT_TYPE) as ContentTypeName[]\n);\n\n/* ───────────────────────── Filter DSL operators ──────────────────────── */\n\n/**\n * Filter DSL operators accepted by the eaera-cms content filter param\n * (`?filter=field:op:value AND …`). Mirrors the backend `OPERATORS` dict in\n * `eaera_cms/.../parser` — see `eaera-docs/cbs/cms-sdk/services/query.md#filter-dsl`.\n *\n * The scalar subset (see {@link CONTENT_FILTER_SCALAR_OPERATOR}) is what the\n * `buildFilter()` helper serializes; the list / no-value / jsonb operators are\n * exported here for callers that hand-roll their DSL string.\n */\nexport const CONTENT_FILTER_OPERATOR = {\n EQ: 'eq',\n NEQ: 'neq',\n GT: 'gt',\n GTE: 'gte',\n LT: 'lt',\n LTE: 'lte',\n IN: 'in',\n NOT_IN: 'not_in',\n IS_NULL: 'is_null',\n IS_NOT_NULL: 'is_not_null',\n CONTAINS: 'contains',\n STARTS_WITH: 'starts_with',\n ENDS_WITH: 'ends_with',\n REGEX: 'regex',\n LIKE: 'like',\n ILIKE: 'ilike',\n BETWEEN: 'between',\n JSON_CONTAINS: 'json_contains',\n JSON_HAS_KEY: 'json_has_key',\n JSON_TYPE: 'json_type',\n} as const;\nexport type ContentFilterOperator =\n (typeof CONTENT_FILTER_OPERATOR)[keyof typeof CONTENT_FILTER_OPERATOR];\n\n/**\n * Operators supported by {@link buildFilter}: the scalar comparison +\n * text-pattern operators that take a single value, plus the list operator\n * `in` (comma-separated values — pass an array as the condition value).\n * Excludes the remaining list operators (`not_in`/`between`), the no-value\n * operators (`is_null`/`is_not_null`), and the jsonb operators (`json_*`) —\n * callers needing those build the DSL string manually with\n * {@link CONTENT_FILTER_OPERATOR}.\n */\nexport const CONTENT_FILTER_SCALAR_OPERATOR = {\n EQ: 'eq',\n NEQ: 'neq',\n GT: 'gt',\n GTE: 'gte',\n LT: 'lt',\n LTE: 'lte',\n IN: 'in',\n CONTAINS: 'contains',\n STARTS_WITH: 'starts_with',\n ENDS_WITH: 'ends_with',\n REGEX: 'regex',\n LIKE: 'like',\n ILIKE: 'ilike',\n} as const;\nexport type ContentFilterScalarOperator =\n (typeof CONTENT_FILTER_SCALAR_OPERATOR)[keyof typeof CONTENT_FILTER_SCALAR_OPERATOR];\n","import { CONTENT_DEFAULTS, CONTENT_TYPE } from '../../common/constants/content.constant';\nimport {\n KALSHI_FUTURE_STATUS,\n KALSHI_LIFECYCLE_STATUS,\n MT5_COMMISSION_MODE,\n MT5_COMMISSION_VOLUME_TYPE,\n} from '../../common/constants/mt5.constant';\nimport type {\n ContentItem,\n ContentQuery,\n KalshiEventData,\n KalshiFutureData,\n Mt5AccountData,\n Mt5GroupData,\n Mt5ServerData,\n} from './content.type';\n\n/**\n * Fake content dataset used while the CMS content endpoints are under\n * development. Shapes are 1:1 with the pack CTs so flipping mock off is a\n * no-op for consumers. Envelope `status` mirrors the CMS lifecycle field.\n *\n * All field names use camelCase to match the backend API response.\n */\n\nconst MOCK_SERVERS: ContentItem<Mt5ServerData>[] = [\n {\n id: 1,\n uuid: 'srv-eaera-demo',\n typeName: CONTENT_TYPE.MT5_SERVER,\n status: 'published',\n data: {\n name: 'EAERA-Demo',\n endpoint: 'demo.example.com:443',\n login: 1000,\n passwordEncrypted: 'aes-256-gcm:demo',\n state: 'active',\n syncIntervalSeconds: 60,\n statementIntervalSeconds: 10,\n tasksEnabled: ['sync', 'statement'],\n fxPairs: ['EURUSD', 'GBPUSD', 'USDJPY', 'XAUUSD', 'BTCUSD'],\n health: { ok: true },\n serverTimeOffsetSeconds: 0,\n },\n },\n {\n id: 2,\n uuid: 'srv-eaera-real',\n typeName: CONTENT_TYPE.MT5_SERVER,\n status: 'published',\n data: {\n name: 'EAERA-Real',\n endpoint: 'real.example.com:443',\n login: 2000,\n passwordEncrypted: 'aes-256-gcm:real',\n state: 'active',\n syncIntervalSeconds: 60,\n statementIntervalSeconds: 10,\n tasksEnabled: ['sync', 'statement'],\n fxPairs: ['EURUSD', 'GBPUSD', 'XAUUSD'],\n health: { ok: true },\n serverTimeOffsetSeconds: 7200,\n },\n },\n];\n\nconst MOCK_ACCOUNTS: ContentItem<Mt5AccountData>[] = [\n {\n id: 101,\n uuid: 'acc-1018935',\n typeName: CONTENT_TYPE.MT5_ACCOUNT,\n status: 'published',\n data: {\n serverName: 'EAERA-Real',\n login: 1018935,\n name: 'Nguyen Van An',\n email: 'an@example.com',\n group: 'real\\\\EAERA\\\\SILVER',\n leverage: 100,\n currency: 'USD',\n balance: 5200.5,\n equity: 5310.25,\n margin: 1200,\n marginFree: 4110.25,\n marginLevel: 442.52,\n profit: 109.75,\n floating: 109.75,\n status: 'active',\n inSync: true,\n rights: 1,\n enable: true,\n tags: ['vip'],\n calcStatus: 'ok',\n isPredictionAccount: false,\n },\n },\n {\n id: 102,\n uuid: 'acc-1020308',\n typeName: CONTENT_TYPE.MT5_ACCOUNT,\n status: 'published',\n data: {\n serverName: 'EAERA-Real',\n login: 1020308,\n name: 'Siti Aminah',\n email: 'siti@example.com',\n group: 'real\\\\EAERA\\\\PREDICTION',\n leverage: 200,\n currency: 'USD',\n balance: 12500.0,\n equity: 12410.0,\n margin: 3000,\n marginFree: 9410.0,\n marginLevel: 413.67,\n profit: -90.0,\n floating: -90.0,\n status: 'active',\n inSync: true,\n rights: 1,\n enable: true,\n tags: [],\n calcStatus: 'ok',\n isPredictionAccount: true,\n },\n },\n {\n id: 103,\n uuid: 'acc-1031719',\n typeName: CONTENT_TYPE.MT5_ACCOUNT,\n status: 'published',\n data: {\n serverName: 'EAERA-Demo',\n login: 1031719,\n name: 'Chen Wei',\n group: 'demo\\\\EAERA\\\\DEMO',\n leverage: 100,\n currency: 'USD',\n balance: 10000.0,\n equity: 10000.0,\n margin: 0,\n marginFree: 10000.0,\n marginLevel: 0,\n profit: 0,\n floating: 0,\n status: 'disabled',\n inSync: false,\n rights: 0,\n enable: false,\n tags: [],\n calcStatus: 'stale',\n isPredictionAccount: false,\n },\n },\n];\n\nconst MOCK_GROUPS: ContentItem<Mt5GroupData>[] = [\n {\n id: 201,\n uuid: 'grp-core-usd',\n typeName: CONTENT_TYPE.MT5_GROUP,\n status: 'active',\n data: {\n serverName: 'EAERA-Real',\n group: 'real\\\\EAERA\\\\SILVER',\n currency: 'USD',\n currencyDigits: 2,\n marginCall: 100,\n marginStopOut: 50,\n marginSoModeLabel: 'percent',\n tradeRights: ['swaps', 'trailing', 'experts'],\n limitOrders: 0,\n limitPositions: 0,\n commissions: [\n {\n tiers: [\n {\n mode: MT5_COMMISSION_MODE.PERCENT,\n type: MT5_COMMISSION_VOLUME_TYPE.DEAL,\n value: 0,\n currency: 'USD',\n },\n ],\n },\n ],\n },\n },\n {\n id: 202,\n uuid: 'grp-prediction',\n typeName: CONTENT_TYPE.MT5_GROUP,\n status: 'active',\n data: {\n serverName: 'EAERA-Real',\n group: 'real\\\\EAERA\\\\Global\\\\Prediction',\n currency: 'USD',\n currencyDigits: 2,\n marginCall: 0,\n marginStopOut: 0,\n tradeRights: ['fifo_close'],\n limitOrders: 200,\n limitPositions: 200,\n commissions: [\n {\n tiers: [\n {\n mode: MT5_COMMISSION_MODE.PERCENT,\n type: MT5_COMMISSION_VOLUME_TYPE.VOLUME,\n value: 3,\n rangeFrom: 0,\n rangeTo: 1000,\n },\n ],\n },\n ],\n },\n },\n];\n\nconst MOCK_KALSHI_EVENTS: ContentItem<KalshiEventData>[] = [\n {\n id: 501,\n uuid: 'kev-btc-15m',\n typeName: CONTENT_TYPE.KALSHI_EVENT,\n status: 'published',\n data: {\n eventTicker: 'KXBTC15M-26JUL291400',\n title: 'Bitcoin 15m — above strike?',\n seriesTicker: 'KXBTC15M',\n strikePeriod: '15M',\n frequency: 'fifteen_min',\n closeTime: '2026-07-29T14:00:00Z',\n status: KALSHI_LIFECYCLE_STATUS.OPEN,\n mutuallyExclusive: true,\n volume24hContracts: 0,\n volumeContracts: 5000,\n },\n },\n {\n id: 502,\n uuid: 'kev-wti-ladder',\n typeName: CONTENT_TYPE.KALSHI_EVENT,\n status: 'published',\n data: {\n eventTicker: 'KXWTI-26JUL2914',\n title: 'WTI crude — ladder',\n seriesTicker: 'KXWTI',\n strikePeriod: '1H',\n frequency: 'hourly',\n closeTime: '2026-07-29T14:00:00Z',\n status: KALSHI_LIFECYCLE_STATUS.OPEN,\n mutuallyExclusive: true,\n volume24hContracts: 0,\n volumeContracts: 11000,\n },\n },\n];\n\nconst MOCK_KALSHI_FUTURES: ContentItem<KalshiFutureData>[] = [\n {\n id: 601,\n uuid: 'kfu-btc-bin',\n typeName: CONTENT_TYPE.KALSHI_FUTURE,\n status: 'published',\n data: {\n marketTicker: 'KXBTC15M-26JUL291400-B',\n eventTicker: 'KXBTC15M-26JUL291400',\n seriesTicker: 'KXBTC15M',\n kalshiCategory: 'Crypto',\n title: 'Bitcoin above strike',\n yesSubTitle: 'Yes',\n mt5Symbol: 'KS-KXBTC15M-26JUL291400-B',\n serverName: 'EAERA-Demo',\n cadence: 'fifteen_min',\n marketType: 'binary',\n yesBidCents: 48,\n yesAskCents: 50,\n yesPriceCents: 49,\n noPriceCents: 51,\n spreadCents: 2,\n volume: 1200,\n volume24hContracts: 5000,\n volumeContracts: 1200,\n closeTime: '2026-07-29T14:00:00Z',\n status: KALSHI_FUTURE_STATUS.ACTIVE,\n enabled: true,\n feIncluded: true,\n },\n },\n {\n id: 602,\n uuid: 'kfu-wti-83',\n typeName: CONTENT_TYPE.KALSHI_FUTURE,\n status: 'published',\n data: {\n marketTicker: 'KXWTI-26JUL2914-T83.99',\n eventTicker: 'KXWTI-26JUL2914',\n seriesTicker: 'KXWTI',\n kalshiCategory: 'Commodities',\n title: 'WTI ≥ $83.99',\n yesSubTitle: '≥ $83.99',\n mt5Symbol: 'KS-KXWTI-26JUL2914-T83.99',\n serverName: 'EAERA-Demo',\n cadence: 'hourly',\n marketType: 'binary',\n yesBidCents: 25,\n yesAskCents: 27,\n yesPriceCents: 26,\n noPriceCents: 74,\n spreadCents: 2,\n volume: 2253,\n volume24hContracts: 8000,\n volumeContracts: 2253,\n closeTime: '2026-07-29T14:00:00Z',\n status: KALSHI_FUTURE_STATUS.ACTIVE,\n enabled: true,\n feIncluded: true,\n },\n },\n {\n id: 603,\n uuid: 'kfu-wti-85',\n typeName: CONTENT_TYPE.KALSHI_FUTURE,\n status: 'published',\n data: {\n marketTicker: 'KXWTI-26JUL2914-T85.00',\n eventTicker: 'KXWTI-26JUL2914',\n seriesTicker: 'KXWTI',\n kalshiCategory: 'Commodities',\n title: 'WTI ≥ $85.00',\n yesSubTitle: '≥ $85.00',\n mt5Symbol: 'KS-KXWTI-26JUL2914-T85.00',\n serverName: 'EAERA-Demo',\n cadence: 'hourly',\n marketType: 'binary',\n yesBidCents: 18,\n yesAskCents: 20,\n yesPriceCents: 19,\n noPriceCents: 81,\n spreadCents: 2,\n volume: 900,\n volume24hContracts: 3000,\n volumeContracts: 900,\n closeTime: '2026-07-29T14:00:00Z',\n status: KALSHI_FUTURE_STATUS.ACTIVE,\n enabled: true,\n feIncluded: true,\n },\n },\n {\n id: 604,\n uuid: 'kfu-hidden',\n typeName: CONTENT_TYPE.KALSHI_FUTURE,\n status: 'published',\n data: {\n marketTicker: 'KXWTI-26JUL2914-HIDDEN',\n eventTicker: 'KXWTI-26JUL2914',\n title: 'Hidden from FE',\n mt5Symbol: 'KS-KXWTI-26JUL2914-HIDDEN',\n serverName: 'EAERA-Demo',\n yesBidCents: 10,\n yesAskCents: 12,\n status: KALSHI_FUTURE_STATUS.ACTIVE,\n feIncluded: false,\n },\n },\n];\n\n/** Mutable in-memory store so mock CRUD round-trips within a session. */\nconst _store: ContentItem[] = [\n ...MOCK_SERVERS,\n ...MOCK_ACCOUNTS,\n ...MOCK_GROUPS,\n ...MOCK_KALSHI_EVENTS,\n ...MOCK_KALSHI_FUTURES,\n] as unknown as ContentItem[];\n\nlet _seq = 1000;\n\nexport function mockContentList(query: ContentQuery): {\n items: ContentItem[];\n total: number;\n page: number;\n perPage: number;\n} {\n const page = query.page ?? CONTENT_DEFAULTS.PAGE;\n const perPage = query.perPage ?? CONTENT_DEFAULTS.PER_PAGE;\n let rows = _store.slice();\n if (query.type) rows = rows.filter((i) => i.typeName === query.type);\n rows.sort((a, b) => a.id - b.id);\n const total = rows.length;\n const start = (page - 1) * perPage;\n const items = rows.slice(start, start + perPage);\n return { items, total, page, perPage };\n}\n\nexport function mockContentDetail(uuid: string): ContentItem | undefined {\n return _store.find((i) => i.uuid === uuid);\n}\n\nexport function mockContentCreate(item: ContentItem): ContentItem {\n _store.unshift(item);\n return item;\n}\n\nexport function mockContentUpdate(\n uuid: string,\n patch: { data?: Record<string, unknown>; slug?: string | null }\n): ContentItem | undefined {\n const item = _store.find((i) => i.uuid === uuid);\n if (!item) return undefined;\n if (patch.data) item.data = { ...item.data, ...patch.data } as ContentItem['data'];\n if (patch.slug !== undefined) item.slug = patch.slug;\n return item;\n}\n\nexport function mockContentRemove(uuid: string): boolean {\n const idx = _store.findIndex((i) => i.uuid === uuid);\n if (idx === -1) return false;\n _store.splice(idx, 1);\n return true;\n}\n\nexport function nextContentId(): number {\n return ++_seq;\n}\n","import type { $Fetch } from 'ofetch';\nimport { CONTENT_ENDPOINT } from '../../common/constants/content.constant';\nimport { deepClone } from '../../common/utils/clone';\nimport {\n mockContentCreate,\n mockContentDetail,\n mockContentList,\n mockContentRemove,\n mockContentUpdate,\n nextContentId,\n} from './mock';\nimport type {\n ActionInvokePayload,\n ActionResponse,\n AvailableActionsResponse,\n ContentAction,\n ContentCreatePayload,\n ContentItem,\n ContentListResponse,\n ContentQuery,\n ContentUpdatePayload,\n} from './content.type';\n\nexport interface IContentServiceOptions {\n /** The CMS `$Fetch` instance (one of `sdk.apis`). */\n api: $Fetch;\n /** Lazy flag — when true, the service returns fake data. */\n mock: () => boolean;\n}\n\nexport interface IContentService {\n list<T = Record<string, unknown>>(\n query?: ContentQuery\n ): Promise<ContentListResponse<ContentItem<T>>>;\n detail<T = Record<string, unknown>>(uuid: string): Promise<ContentItem<T>>;\n create<T = Record<string, unknown>>(payload: ContentCreatePayload<T>): Promise<ContentItem<T>>;\n update<T = Record<string, unknown>>(\n uuid: string,\n payload: ContentUpdatePayload<T>\n ): Promise<ContentItem<T>>;\n remove(uuid: string): Promise<void>;\n listActions(uuid: string): Promise<ContentAction[]>;\n invokeAction(\n uuid: string,\n actionName: string,\n payload?: ActionInvokePayload\n ): Promise<ActionResponse>;\n}\n\n/**\n * Generic CMS content service. CRUD over the **singular** `/api/v1/content`\n * namespace; type-specific reads use `query: { type }`. Returns `ContentItem<T>`.\n *\n * Endpoint contract (`eaera_cms/core/content/routes.py`):\n * GET /api/v1/content → ContentListResponse\n * GET /api/v1/content/{uuid} → single ContentResponse\n * POST /api/v1/content → create\n * PUT /api/v1/content/{uuid} → update (data/slug)\n * DELETE /api/v1/content/{uuid} → soft-delete\n * GET /api/v1/content/{uuid}/actions → AvailableActionsResponse\n * POST /api/v1/content/{uuid}/actions/{actionName} → ActionResponse\n *\n * While `mock()` returns true, all methods resolve against the local fake\n * dataset and never touch `api`.\n */\nexport function createContentService(opts: IContentServiceOptions): IContentService {\n const { api, mock } = opts;\n\n return {\n async list<T = Record<string, unknown>>(\n query: ContentQuery = {}\n ): Promise<ContentListResponse<ContentItem<T>>> {\n if (mock())\n return _okList(mockContentList(query)) as unknown as ContentListResponse<ContentItem<T>>;\n return api<ContentListResponse<ContentItem<T>>>(CONTENT_ENDPOINT.BASE, {\n query: _wireQuery(query),\n });\n },\n\n async detail<T = Record<string, unknown>>(uuid: string): Promise<ContentItem<T>> {\n if (mock()) return _mustFind(mockContentDetail(uuid), uuid) as ContentItem<T>;\n return api<ContentItem<T>>(CONTENT_ENDPOINT.detail(uuid));\n },\n\n async create<T = Record<string, unknown>>(\n payload: ContentCreatePayload<T>\n ): Promise<ContentItem<T>> {\n if (mock()) {\n const item: ContentItem = {\n id: nextContentId(),\n uuid: `mock-${payload.typeName.toLowerCase()}-${Date.now()}`,\n typeName: payload.typeName,\n status: payload.status ?? 'draft',\n data: payload.data as unknown as Record<string, unknown>,\n };\n return deepClone(mockContentCreate(item)) as ContentItem<T>;\n }\n return api<ContentItem<T>>(CONTENT_ENDPOINT.BASE, { method: 'POST', body: payload });\n },\n\n async update<T = Record<string, unknown>>(\n uuid: string,\n payload: ContentUpdatePayload<T>\n ): Promise<ContentItem<T>> {\n if (mock()) {\n return _mustFind(\n mockContentUpdate(uuid, {\n data: payload.data as unknown as Record<string, unknown> | undefined,\n slug: payload.slug,\n }),\n uuid\n ) as ContentItem<T>;\n }\n return api<ContentItem<T>>(CONTENT_ENDPOINT.detail(uuid), { method: 'PUT', body: payload });\n },\n\n async remove(uuid: string): Promise<void> {\n if (mock()) {\n mockContentRemove(uuid);\n return;\n }\n await api(CONTENT_ENDPOINT.detail(uuid), { method: 'DELETE' });\n },\n\n async listActions(uuid: string): Promise<ContentAction[]> {\n if (mock()) return [];\n const res = await api<AvailableActionsResponse>(CONTENT_ENDPOINT.actions(uuid));\n return res.availableActions ?? [];\n },\n\n async invokeAction(\n uuid: string,\n actionName: string,\n payload: ActionInvokePayload = {}\n ): Promise<ActionResponse> {\n if (mock()) {\n return { success: true, output: {}, error: '', durationMs: 0 };\n }\n return api<ActionResponse>(CONTENT_ENDPOINT.action(uuid, actionName), {\n method: 'POST',\n body: payload,\n });\n },\n };\n}\n\n/* ----------------------------- file-private helpers ----------------------------- */\n\n/**\n * Wire-casing for GET /content query params. The engine documents only\n * `sortBy`/`sortDirection`/`perPage` camelCase aliases (api_references §2.2)\n * — `pack_id` must be sent snake_case or the filter silently no-ops.\n */\nfunction _wireQuery(query: ContentQuery): Record<string, unknown> {\n const out: Record<string, unknown> = { ...query };\n if (out.packId !== undefined) {\n out.pack_id = out.packId;\n delete out.packId;\n }\n return out;\n}\n\nfunction _okList(rows: {\n items: ContentItem[];\n total: number;\n page: number;\n perPage: number;\n}): ContentListResponse<ContentItem> {\n return {\n items: rows.items.map(deepClone),\n total: rows.total,\n page: rows.page,\n perPage: rows.perPage,\n };\n}\n\nfunction _mustFind(item: ContentItem | undefined, uuid: string): ContentItem {\n if (!item) throw _notFound(`Content ${uuid} not found`);\n return deepClone(item);\n}\n\nfunction _notFound(message: string): Error {\n const e = new Error(message);\n (e as Error & { statusCode?: number }).statusCode = 404;\n return e;\n}\n","/**\n * Content-type metadata endpoints (engine `core/types/routes.py`).\n *\n * Source of truth: `eaera-docs/company-os/eaera-people/be-docs/api_references.md`\n * §7.1 — the portal renders forms, status badges and action availability\n * from CT metadata instead of hardcoding field lists.\n */\n\n/** `GET /api/v1/content-types` — list content types (optionally category-filtered). */\nexport const CONTENT_TYPES_ENDPOINT = {\n BASE: '/api/v1/content-types',\n /** `GET /api/v1/content-types/name/{name}` — one CT by wire name; unknown ⇒ 404. */\n byName: (name: string): string => `/api/v1/content-types/name/${name}`,\n} as const;\n\n/** Pagination defaults for the list route (mirrors the engine's). */\nexport const CONTENT_TYPES_DEFAULTS = {\n PAGE: 1,\n PER_PAGE: 100,\n} as const;\n\n/**\n * Known `category` values. Packs register their CTs under `pack`; the\n * engine's own types (users, settings, …) live under `core`. The union stays\n * open — packs may declare their own categories.\n */\nexport const CONTENT_TYPE_CATEGORY = {\n PACK: 'pack',\n CORE: 'core',\n} as const;\nexport type ContentTypeCategory =\n | (typeof CONTENT_TYPE_CATEGORY)[keyof typeof CONTENT_TYPE_CATEGORY]\n | (string & {});\n","/**\n * Content-types domain — mock dataset (used while `mock()` returns true).\n *\n * Two representative rows (one core mt5 CT, one People pack CT) so form and\n * badge rendering can be developed before the backend is reachable. All\n * returns are deep-cloned so callers may mutate freely.\n */\n\nimport { deepClone } from '../../common/utils/clone';\nimport type { ContentTypeResponse } from './content-types.type';\n\nconst MOCK_CONTENT_TYPES: ContentTypeResponse[] = [\n {\n id: 1,\n name: 'Mt5Account',\n label: 'MT5 Account',\n description: 'mt5 pack — trading account rows',\n category: 'pack',\n schemaDef: {\n fields: {\n login: { type: 'string', required: true },\n group: { type: 'string', required: true },\n status: { type: 'string', enum: ['active', 'disabled', 'closed'] },\n },\n state_machine: {\n states: ['active', 'disabled', 'closed'],\n transitions: [],\n },\n actions: [],\n },\n stateField: 'status',\n initialState: 'active',\n singleton: false,\n isActive: true,\n version: 1,\n packId: 'eaera-mt5',\n contentCount: 0,\n createdAt: '2026-01-01T00:00:00Z',\n updatedAt: '2026-01-01T00:00:00Z',\n },\n {\n id: 2,\n name: 'legal_entity',\n label: 'Legal Entity',\n description: 'People pack — company identity anchor (FEAT-001)',\n category: 'pack',\n schemaDef: {\n fields: {\n code: { type: 'string', required: true },\n display_name: { type: 'string', required: true },\n timezone: { type: 'string', required: true },\n state: { type: 'string', enum: ['active', 'closing', 'closed'] },\n },\n state_machine: {\n states: ['active', 'closing', 'closed'],\n transitions: [\n { from: 'active', to: 'closing' },\n { from: 'closing', to: 'closed' },\n ],\n },\n actions: [\n { name: 'register_legal_entity', scope: 'people:legal_entity:register_legal_entity' },\n { name: 'reactivate', scope: 'people:legal_entity:reactivate' },\n ],\n },\n stateField: 'state',\n initialState: 'active',\n singleton: false,\n isActive: true,\n version: 3,\n packId: 'eaera-people',\n contentCount: 12,\n createdAt: '2026-09-07T00:00:00Z',\n updatedAt: '2026-09-09T00:00:00Z',\n },\n];\n\n/** Mock `GET /content-types` — applies category + pagination. */\nexport function mockContentTypesList(query: {\n category?: string;\n page?: number;\n perPage?: number;\n}): { items: ContentTypeResponse[]; total: number; page: number; perPage: number } {\n let rows = MOCK_CONTENT_TYPES;\n if (query.category) rows = rows.filter((ct) => ct.category === query.category);\n const page = query.page ?? 1;\n const perPage = query.perPage ?? 100;\n const start = (page - 1) * perPage;\n const items = rows.slice(start, start + perPage);\n return { items: items.map(deepClone), total: rows.length, page, perPage };\n}\n\n/** Mock `GET /content-types/name/{name}` — undefined when unknown (caller 404s). */\nexport function mockContentTypesByName(name: string): ContentTypeResponse | undefined {\n const row = MOCK_CONTENT_TYPES.find((ct) => ct.name === name);\n return row ? deepClone(row) : undefined;\n}\n","/**\n * Content-types domain service — read-only CT metadata.\n *\n * Endpoint contract (`eaera_cms/core/types/routes.py`; People api_references §7.1):\n * GET /api/v1/content-types?category=&page=&per_page= → { items[], total, page, per_page }\n * GET /api/v1/content-types/name/{name} → ContentTypeResponse (unknown ⇒ 404)\n *\n * The portal renders pack forms, status badges and action availability from\n * CT metadata (`stateField` + `initialState` drive lifecycle UI) — never\n * hardcode field lists. CT write endpoints are engine-side only; this\n * service is strictly read-only.\n *\n * While `mock()` returns true, all methods resolve against the local fake\n * dataset and never touch `api`.\n */\n\nimport type { $Fetch } from 'ofetch';\nimport {\n CONTENT_TYPES_DEFAULTS,\n CONTENT_TYPES_ENDPOINT,\n} from '../../common/constants/content-types.constant';\nimport { mockContentTypesByName, mockContentTypesList } from './mock';\nimport type {\n ContentTypeListQuery,\n ContentTypeListResponse,\n ContentTypeResponse,\n} from './content-types.type';\n\nexport interface IContentTypesServiceOptions {\n /** The CMS `$Fetch` instance (one of `sdk.apis`). */\n api: $Fetch;\n /** Lazy flag — when true, the service returns fake data. */\n mock: () => boolean;\n}\n\nexport interface IContentTypesService {\n /** List content types, optionally category-filtered + paginated. */\n list(query?: ContentTypeListQuery): Promise<ContentTypeListResponse>;\n /** List pack-registered CTs (category=pack) — e.g. the People pack's 27. */\n listPack(query?: Omit<ContentTypeListQuery, 'category'>): Promise<ContentTypeListResponse>;\n /** Read one CT by wire name — unknown name raises (404). */\n getByName(name: string): Promise<ContentTypeResponse>;\n}\n\nexport function createContentTypesService(opts: IContentTypesServiceOptions): IContentTypesService {\n const { api, mock } = opts;\n\n // This route documents no camelCase alias — send snake_case query keys.\n const wireQuery = (query: ContentTypeListQuery = {}): Record<string, string | number> => {\n const q: Record<string, string | number> = {};\n if (query.category) q.category = query.category;\n q.page = query.page ?? CONTENT_TYPES_DEFAULTS.PAGE;\n q.per_page = query.perPage ?? CONTENT_TYPES_DEFAULTS.PER_PAGE;\n return q;\n };\n\n const list = async (query: ContentTypeListQuery = {}): Promise<ContentTypeListResponse> => {\n if (mock()) return mockContentTypesList(query);\n return api<ContentTypeListResponse>(CONTENT_TYPES_ENDPOINT.BASE, {\n query: wireQuery(query),\n });\n };\n\n return {\n list,\n\n async listPack(query = {}): Promise<ContentTypeListResponse> {\n return list({ ...query, category: 'pack' });\n },\n\n async getByName(name: string): Promise<ContentTypeResponse> {\n if (mock()) {\n const row = mockContentTypesByName(name);\n if (!row) throw _notFound(`Content type ${name} not found`);\n return row;\n }\n return api<ContentTypeResponse>(CONTENT_TYPES_ENDPOINT.byName(name));\n },\n };\n}\n\nfunction _notFound(message: string): Error {\n const e = new Error(message);\n (e as Error & { statusCode?: number }).statusCode = 404;\n return e;\n}\n","/**\n * Content-executions endpoints (`eaera_cms/core/executions/routes.py`).\n * Rule-scoped executions live under the rules namespace.\n */\nexport const EXECUTIONS_ENDPOINT = {\n BASE: '/api/v1/executions',\n detail: (uuid: string): string => `/api/v1/executions/${uuid}`,\n byContent: (id: number | string): string => `/api/v1/rules/content/${id}/executions`,\n} as const;\n\n/** Execution list query defaults. */\nexport const EXECUTIONS_DEFAULTS = {\n PAGE: 1,\n PER_PAGE: 50,\n} as const;\n\n/**\n * `transition_name` values written to `content_executions.transition_name`\n * by the rule engine and the content executor. The dashboard uses these\n * to project an execution row back into the action that actually ran.\n *\n * `action` — outer audit row, committed by the trigger pod /\n * API pod / cron evaluator when dispatch starts.\n * `__action__` — inner audit row, committed by the executor pod when\n * the pack handler returns (the row that proves the\n * handler actually ran).\n * `__update__` — generic content-field writer path used by\n * `executionType: 'set_field'`. The executor projects\n * this back to the friendly actionName `'set_field'`.\n */\nexport const EXECUTION_TRANSITION = {\n ACTION: 'action',\n INNER_ACTION: '__action__',\n INNER_UPDATE: '__update__',\n} as const;\n\nexport type ExecutionTransition = (typeof EXECUTION_TRANSITION)[keyof typeof EXECUTION_TRANSITION];\n\n/**\n * `ContentExecution.status` lifecycle values\n * (`eaera_cms/core/executions/routes.py` `ExecutionStatus` enum, mirrored\n * by the SDK's `ExecutionStatus` type in `cms-sdk/.../executions.type.ts`).\n *\n * Use this constant when you need the bare string (the type alone isn't\n * always importable from downstream utilities that don't depend on the\n * SDK).\n */\nexport const EXECUTION_STATUS = {\n PENDING: 'pending',\n RUNNING: 'running',\n COMPLETED: 'completed',\n FAILED: 'failed',\n TIMEOUT: 'timeout',\n ABORTED: 'aborted',\n CANCELLED: 'cancelled',\n} as const;\nexport type ExecutionStatus = (typeof EXECUTION_STATUS)[keyof typeof EXECUTION_STATUS];\n\n/** UI-ordered list for status filter dropdowns. */\nexport const EXECUTION_STATUSES: readonly (typeof EXECUTION_STATUS)[keyof typeof EXECUTION_STATUS][] =\n [\n EXECUTION_STATUS.PENDING,\n EXECUTION_STATUS.RUNNING,\n EXECUTION_STATUS.COMPLETED,\n EXECUTION_STATUS.FAILED,\n EXECUTION_STATUS.TIMEOUT,\n EXECUTION_STATUS.ABORTED,\n EXECUTION_STATUS.CANCELLED,\n ];\n","/**\n * Backend action-name values for the mt5 pack (`eaera_mt5/handlers/*`).\n *\n * Source of truth: `eaera-docs/cbs/eaera-cms/docs/eaera-cms-api-inventory.md`\n * §7.6 (\"26 actions total: 25 Mt5Account + 1 KalshiFuture\"). See §7.1 for\n * trading, §7.2 for financial, §7.3 for operational/admin, §7.4 for viewer,\n * and the cross-ref taxonomy in\n * `eaera-docs/cbs/eaera-cms/docs/eaera-cms-websocket-integration-guide.md`\n * §12 (narrower scope-grouped view).\n *\n * These are the wire-level `actionName` strings the dashboard and SDK use\n * when:\n *\n * - serializing a rule's `executionParams.actionName`,\n * - dispatching `POST /api/v1/content/{uuid}/actions/{actionName}`,\n * - resolving an `exec.operationName` back to a friendly label.\n *\n * The specialised values that ship in `ACTION_KINDS` (`cms-sdk/.../rules/\n * conditions.ts`) are sourced from this constant — `MOVE → CHANGE_GROUP`,\n * `LEVERAGE → CHANGE_LEVERAGE`, `TAG → TAG_ACCOUNT`, etc. Use this file\n * whenever you need the bare backend string (no view-model wrapping).\n *\n * The frontend `kind` view-model enum lives in `cms-sdk/.../rules/\n * conditions.ts` (`ACTION_KIND`); do NOT confuse `ACTION_KIND.TAG` (the\n * UI kind = `'tag'`) with `MT5_ACTION_NAME.TAG_ACCOUNT` (the backend\n * actionName = `'tag_account'`).\n *\n * Composition (BE §7.6, scope-grouped):\n *\n * | Scope | Count | Notes |\n * |-------------------|-------|------------------------------------------------------|\n * | mt5:trade | 13 | `place_order` (pending: limit/stop/stop_limit) + |\n * | | | `place_market_order` (market only) + 11 others + |\n * | | | `export_history` (local CH query) |\n * | mt5:financial | 2 | |\n * | mt5:admin | 8 | incl. `tag_account` & `provision_user` (local) |\n * | mt5:viewer | 2 | both local (no-bridge) |\n * | mt5:trade (local) | 1 | `export_history` — local CH query, scope mt5:trade |\n * | KalshiFuture | 1 | `update_spread` |\n * | TOTAL | 26 | 25 Mt5Account + 1 KalshiFuture |\n */\nexport const MT5_ACTION_NAME = {\n // ── Trading — mt5:trade (13, incl. `place_market_order`) ──\n /**\n * `eaera_mt5.handlers.trading:place_order` — entry point for **pending**\n * orders only (limit / stop / stop_limit). Accepts `type ∈ {limit, stop,\n * stop_limit}` and required `price` / `stop_price` per type. Market orders\n * are routed to {@link MT5_ACTION_NAME.PLACE_MARKET_ORDER} [BE §7.1.1].\n *\n * Success `output`: `{ order_id, ticket, type, side, symbol, volume, price,\n * stop_price, client_order_id }`.\n */\n PLACE_ORDER: 'place_order',\n /**\n * `eaera_mt5.handlers.trading:place_market_order` — canonical **market**\n * order action. Params `{ symbol, side, volume, comment? }` only; does NOT\n * accept `type` / `price` / `stop_price` / `duration` / `sl` / `tp` (market\n * orders carry no SL/TP under the current contract) [BE §7.1.2].\n *\n * Success `output`: `{ request_id, position_id }`.\n */\n PLACE_MARKET_ORDER: 'place_market_order',\n /** `eaera_mt5.handlers.trading:cancel_order` — FEAT-007 [BE §7.1.3]. */\n CANCEL_ORDER: 'cancel_order',\n /** `eaera_mt5.handlers.trading:cancel_all_orders` [BE §7.1.4]. */\n CANCEL_ALL_ORDERS: 'cancel_all_orders',\n /** `eaera_mt5.handlers.trading:flatten_all_orders` — close everything [BE §7.1.5]. */\n FLATTEN_ALL_ORDERS: 'flatten_all_orders',\n /** `eaera_mt5.handlers.trading:modify_order` [BE §7.1.6]. */\n MODIFY_ORDER: 'modify_order',\n /** `eaera_mt5.handlers.trading:modify_position` — FEAT-006 SL/TP editor [BE §7.1.7]. */\n MODIFY_POSITION: 'modify_position',\n /** `eaera_mt5.handlers.trading:close_position` [BE §7.1.8]. */\n CLOSE_POSITION: 'close_position',\n /** `eaera_mt5.handlers.trading:close_all_positions` [BE §7.1.9]. */\n CLOSE_ALL_POSITIONS: 'close_all_positions',\n /** `eaera_mt5.handlers.trading:join_bid` — one-tap BUY LIMIT at bid [BE §7.1.10]. */\n JOIN_BID: 'join_bid',\n /** `eaera_mt5.handlers.trading:join_ask` — one-tap SELL LIMIT at ask [BE §7.1.11]. */\n JOIN_ASK: 'join_ask',\n /** `eaera_mt5.handlers.trading:reverse` — close + open opposite [BE §7.1.12]. */\n REVERSE: 'reverse',\n /** `eaera_mt5.handlers.local:export_history` — local CH query, scope mt5:trade (NO bridge) [BE §7.1.13]. */\n EXPORT_HISTORY: 'export_history',\n\n // ── Financial — mt5:financial (2) ──\n /** `eaera_mt5.handlers.financial:deposit` [BE §7.2.1]. */\n DEPOSIT: 'deposit',\n /** `eaera_mt5.handlers.financial:withdraw` [BE §7.2.2]. */\n WITHDRAW: 'withdraw',\n\n // ── Admin / Operational — mt5:admin (8) ──\n /** `eaera_mt5.handlers.operational:disable_trade` [BE §7.3]. */\n DISABLE_TRADE: 'disable_trade',\n /** `eaera_mt5.handlers.operational:enable_trade` [BE §7.3]. */\n ENABLE_TRADE: 'enable_trade',\n /** `eaera_mt5.handlers.operational:change_group` [BE §7.3]. */\n CHANGE_GROUP: 'change_group',\n /** `eaera_mt5.handlers.operational:change_leverage` [BE §7.3]. */\n CHANGE_LEVERAGE: 'change_leverage',\n /** `eaera_mt5.handlers.operational:close_account` [BE §7.3]. */\n CLOSE_ACCOUNT: 'close_account',\n /** `eaera_mt5.handlers.operational:resync_deals` [BE §7.3]. */\n RESYNC_DEALS: 'resync_deals',\n /** `eaera_mt5.handlers.local:tag_account` — local (NO bridge) [BE §7.3]. */\n TAG_ACCOUNT: 'tag_account',\n /** `eaera_mt5.handlers.local:provision_user` — local (NO bridge); drives `user_sync` ContentRule [BE §7.3]. */\n PROVISION_USER: 'provision_user',\n\n // ── Viewer — mt5:viewer (2) ──\n /** `eaera_mt5.handlers.local:generate_report` — local (NO bridge) [BE §7.4]. */\n GENERATE_REPORT: 'generate_report',\n /** `eaera_mt5.handlers.local:generate_ai_summary` — local (NO bridge) [BE §7.4]. */\n GENERATE_AI_SUMMARY: 'generate_ai_summary',\n\n // ── KalshiFuture (1) ──\n /** `kalshi.handlers.future:update_spread` [BE §7]. */\n UPDATE_SPREAD: 'update_spread',\n} as const;\n\n/** Wire-level mt5 pack action-name union (snake_case BE strings). */\nexport type Mt5ActionName = (typeof MT5_ACTION_NAME)[keyof typeof MT5_ACTION_NAME];\n\n/** Trading actions — `mt5:trade` scope. Bridge to the MT5 worker via Redis-Stream, except `EXPORT_HISTORY` (local CH query). */\nexport const MT5_TRADING_ACTIONS: readonly Mt5ActionName[] = [\n MT5_ACTION_NAME.PLACE_ORDER,\n MT5_ACTION_NAME.PLACE_MARKET_ORDER,\n MT5_ACTION_NAME.CANCEL_ORDER,\n MT5_ACTION_NAME.CANCEL_ALL_ORDERS,\n MT5_ACTION_NAME.FLATTEN_ALL_ORDERS,\n MT5_ACTION_NAME.MODIFY_ORDER,\n MT5_ACTION_NAME.MODIFY_POSITION,\n MT5_ACTION_NAME.CLOSE_POSITION,\n MT5_ACTION_NAME.CLOSE_ALL_POSITIONS,\n MT5_ACTION_NAME.JOIN_BID,\n MT5_ACTION_NAME.JOIN_ASK,\n MT5_ACTION_NAME.REVERSE,\n MT5_ACTION_NAME.EXPORT_HISTORY,\n];\n\n/** Financial actions — `mt5:financial` scope. All bridge to the MT5 worker. */\nexport const MT5_FINANCIAL_ACTIONS: readonly Mt5ActionName[] = [\n MT5_ACTION_NAME.DEPOSIT,\n MT5_ACTION_NAME.WITHDRAW,\n];\n\n/** Operational / admin actions — `mt5:admin` scope. All bridge to the MT5 worker, except `TAG_ACCOUNT` and `PROVISION_USER` (local). */\nexport const MT5_OPERATIONAL_ACTIONS: readonly Mt5ActionName[] = [\n MT5_ACTION_NAME.DISABLE_TRADE,\n MT5_ACTION_NAME.ENABLE_TRADE,\n MT5_ACTION_NAME.CHANGE_GROUP,\n MT5_ACTION_NAME.CHANGE_LEVERAGE,\n MT5_ACTION_NAME.CLOSE_ACCOUNT,\n MT5_ACTION_NAME.RESYNC_DEALS,\n MT5_ACTION_NAME.TAG_ACCOUNT,\n MT5_ACTION_NAME.PROVISION_USER,\n];\n\n/** Viewer actions — `mt5:viewer` scope. Both local (NO bridge). */\nexport const MT5_VIEWER_ACTIONS: readonly Mt5ActionName[] = [\n MT5_ACTION_NAME.GENERATE_REPORT,\n MT5_ACTION_NAME.GENERATE_AI_SUMMARY,\n];\n\n/** Local (no-bridge) actions — direct PG/CH, no Redis-Stream dispatch. */\nexport const MT5_LOCAL_ACTIONS: readonly Mt5ActionName[] = [\n MT5_ACTION_NAME.EXPORT_HISTORY,\n MT5_ACTION_NAME.TAG_ACCOUNT,\n MT5_ACTION_NAME.PROVISION_USER,\n MT5_ACTION_NAME.GENERATE_REPORT,\n MT5_ACTION_NAME.GENERATE_AI_SUMMARY,\n];\n\n/** Every Mt5Account action name (25 — the union of the 4 scope-grouped arrays; BE §7.6). */\nexport const MT5_ALL_ACTIONS: readonly Mt5ActionName[] = [\n ...MT5_TRADING_ACTIONS,\n ...MT5_FINANCIAL_ACTIONS,\n ...MT5_OPERATIONAL_ACTIONS,\n ...MT5_VIEWER_ACTIONS,\n];\n\n/** Narrower scope-grouped unions (handy for action-menu UIs). */\nexport type Mt5TradingActionName = (typeof MT5_TRADING_ACTIONS)[number];\nexport type Mt5FinancialActionName = (typeof MT5_FINANCIAL_ACTIONS)[number];\nexport type Mt5OperationalActionName = (typeof MT5_OPERATIONAL_ACTIONS)[number];\nexport type Mt5ViewerActionName = (typeof MT5_VIEWER_ACTIONS)[number];\nexport type Mt5LocalActionName = (typeof MT5_LOCAL_ACTIONS)[number];\n","import { CONTENT_TYPE } from '../../common/constants/content.constant';\nimport {\n EXECUTION_STATUS,\n EXECUTION_TRANSITION,\n EXECUTIONS_DEFAULTS,\n} from '../../common/constants/executions.constant';\nimport { MT5_ACTION_NAME } from '../../common/constants/mt5-action.constant';\nimport { MT5_SERVER_NAME } from '../../common/constants/mt5.constant';\nimport type { ContentExecution } from './executions.type';\n\n/**\n * Fake executions dataset used while the CMS executions endpoints are under\n * development. Mixes detection (`llm_agent`) and action (`transition`) rows\n * to cover both FEAT-003 and FEAT-005. Includes diverse action types.\n *\n * The executions feed is **read-only**: status is the `ExecutionStatus` enum\n * and operator remediation is performed through content actions, not here.\n * Field names use camelCase to match the backend API response.\n */\n\nexport const MOCK_EXECUTIONS: ContentExecution[] = [\n {\n uuid: 'exec-det-001',\n contentUuid: 'acc-1018935',\n typeName: CONTENT_TYPE.MT5_ACCOUNT,\n operation: 'llm_agent',\n operationName: 'Detect martingale behavior',\n ruleId: 3,\n status: EXECUTION_STATUS.COMPLETED,\n result: {\n reason: 'Martingale pattern: 3 consecutive position doublings after losses',\n },\n retryCount: 0,\n durationMs: 1240,\n createdAt: '2026-06-19T08:55:00Z',\n updatedAt: '2026-06-19T08:55:01Z',\n },\n {\n uuid: 'exec-det-002',\n contentUuid: 'acc-1020308',\n typeName: CONTENT_TYPE.MT5_ACCOUNT,\n operation: 'llm_agent',\n operationName: 'High-frequency scalping',\n ruleId: 3,\n status: EXECUTION_STATUS.COMPLETED,\n result: {\n reason: '67 trades in 4 hours with average hold time 47 seconds',\n },\n retryCount: 0,\n durationMs: 980,\n createdAt: '2026-06-19T08:20:00Z',\n updatedAt: '2026-06-19T08:20:00Z',\n },\n {\n uuid: 'exec-act-001',\n contentUuid: 'acc-1018935',\n typeName: CONTENT_TYPE.MT5_ACCOUNT,\n operation: 'signal:metric_update',\n operationName: MT5_ACTION_NAME.CHANGE_GROUP,\n ruleId: 1,\n status: EXECUTION_STATUS.COMPLETED,\n result: {\n success: true,\n output: {\n login: 1018935,\n serverName: MT5_SERVER_NAME,\n newGroup: 'real\\\\EAERA\\\\GOLD',\n },\n handler: 'action_executor',\n },\n params: {\n signalName: 'metric_update',\n actionParams: { newGroup: 'real\\\\EAERA\\\\GOLD' },\n data: {\n login: 1018935,\n serverName: MT5_SERVER_NAME,\n group: 'real\\\\EAERA\\\\SILVER',\n },\n },\n actorId: 1,\n retryCount: 0,\n durationMs: 320,\n createdAt: '2026-06-19T08:12:00Z',\n updatedAt: '2026-06-19T08:12:01Z',\n },\n {\n uuid: 'exec-act-002',\n contentUuid: 'acc-1020308',\n typeName: CONTENT_TYPE.MT5_ACCOUNT,\n operation: 'signal:metric_update',\n operationName: MT5_ACTION_NAME.CHANGE_LEVERAGE,\n ruleId: 2,\n status: EXECUTION_STATUS.COMPLETED,\n result: {\n success: true,\n output: {\n login: 1020308,\n serverName: MT5_SERVER_NAME,\n newLeverage: 500,\n },\n handler: 'action_executor',\n },\n params: {\n signalName: 'metric_update',\n actionParams: { newLeverage: 500 },\n data: {\n login: 1020308,\n serverName: MT5_SERVER_NAME,\n group: 'real\\\\EAERA\\\\GOLD',\n },\n },\n retryCount: 0,\n durationMs: 280,\n createdAt: '2026-06-19T07:45:00Z',\n updatedAt: '2026-06-19T07:45:01Z',\n },\n {\n uuid: 'exec-act-003',\n contentUuid: 'acc-1018935',\n typeName: CONTENT_TYPE.MT5_ACCOUNT,\n operation: 'signal:metric_update',\n operationName: MT5_ACTION_NAME.TAG_ACCOUNT,\n ruleId: 4,\n status: EXECUTION_STATUS.COMPLETED,\n result: {\n success: true,\n output: {\n login: 1018935,\n serverName: MT5_SERVER_NAME,\n tags: ['high_drawdown', 'review'],\n mode: 'append',\n },\n handler: 'action_executor',\n },\n params: {\n signalName: 'metric_update',\n actionParams: { tags: ['high_drawdown', 'review'], mode: 'append' },\n data: {\n login: 1018935,\n serverName: MT5_SERVER_NAME,\n group: 'real\\\\EAERA\\\\GOLD',\n },\n },\n retryCount: 0,\n durationMs: 45,\n createdAt: '2026-06-19T07:30:00Z',\n updatedAt: '2026-06-19T07:30:00Z',\n },\n {\n uuid: 'exec-act-004',\n contentUuid: 'acc-1030500',\n typeName: CONTENT_TYPE.MT5_ACCOUNT,\n operation: 'signal:metric_update',\n operationName: MT5_ACTION_NAME.DEPOSIT,\n ruleId: 5,\n status: EXECUTION_STATUS.COMPLETED,\n result: {\n success: true,\n output: {\n login: 1030500,\n serverName: MT5_SERVER_NAME,\n amount: 5000,\n reason: 'Bonus credit',\n },\n handler: 'action_executor',\n },\n params: {\n signalName: 'metric_update',\n actionParams: { amount: 5000, reason: 'Bonus credit' },\n data: {\n login: 1030500,\n serverName: MT5_SERVER_NAME,\n group: 'real\\\\EAERA\\\\SILVER',\n },\n },\n actorId: 1,\n retryCount: 0,\n durationMs: 520,\n createdAt: '2026-06-19T06:00:00Z',\n updatedAt: '2026-06-19T06:00:01Z',\n },\n {\n uuid: 'exec-act-005',\n contentUuid: 'acc-1018935',\n typeName: CONTENT_TYPE.MT5_ACCOUNT,\n operation: EXECUTION_TRANSITION.INNER_ACTION,\n operationName: MT5_ACTION_NAME.DISABLE_TRADE,\n ruleId: 6,\n status: EXECUTION_STATUS.FAILED,\n result: {\n success: false,\n error: 'MT5 bridge timeout after 30s',\n handler: 'action_executor_error',\n },\n params: {\n actionParams: {},\n data: {\n login: 1018935,\n serverName: MT5_SERVER_NAME,\n group: 'real\\\\EAERA\\\\GOLD',\n },\n },\n retryCount: 1,\n durationMs: 30000,\n createdAt: '2026-06-18T22:15:00Z',\n updatedAt: '2026-06-18T22:15:30Z',\n },\n];\n\n/** Mutable in-memory store so mock reads reflect any session changes. */\nconst _store: ContentExecution[] = MOCK_EXECUTIONS.map((e) => ({ ...e }));\n\nexport function mockExecutionList(params?: {\n contentId?: number;\n contentUuid?: string;\n operation?: string;\n status?: string;\n sourceType?: string;\n page?: number;\n perPage?: number;\n offset?: number;\n limit?: number;\n}): { items: ContentExecution[]; total: number; page: number; perPage: number } {\n // byContent paginates with offset/limit; the base list uses page/perPage.\n const usingByContent = params?.contentId !== undefined;\n const page = params?.page ?? EXECUTIONS_DEFAULTS.PAGE;\n const perPage = params?.perPage ?? params?.limit ?? EXECUTIONS_DEFAULTS.PER_PAGE;\n const offset = params?.offset ?? (page - 1) * perPage;\n let rows = _store.slice().sort((a, b) => (a.createdAt < b.createdAt ? 1 : -1));\n if (params?.contentId) rows = rows.filter((e) => e.ruleId === params.contentId);\n if (params?.contentUuid) rows = rows.filter((e) => e.contentUuid === params.contentUuid);\n if (params?.operation) rows = rows.filter((e) => e.operation === params.operation);\n if (params?.status) rows = rows.filter((e) => e.status === params.status);\n const total = rows.length;\n const items = usingByContent\n ? rows.slice(offset, offset + perPage)\n : rows.slice((page - 1) * perPage, page * perPage);\n return {\n items,\n total,\n page: usingByContent ? Math.floor(offset / Math.max(perPage, 1)) + 1 : page,\n perPage,\n };\n}\n\nexport function mockExecutionDetail(uuid: string): ContentExecution | undefined {\n return _store.find((e) => e.uuid === uuid);\n}\n","import type { $Fetch } from 'ofetch';\nimport { EXECUTIONS_ENDPOINT } from '../../common/constants/executions.constant';\nimport { deepClone } from '../../common/utils/clone';\nimport { mockExecutionDetail, mockExecutionList } from './mock';\nimport type {\n ContentExecution,\n ExecutionListParams,\n ExecutionListResponse,\n} from './executions.type';\n\nexport interface IExecutionsServiceOptions {\n /** The CMS `$Fetch` instance (one of `sdk.apis`). */\n api: $Fetch;\n /** Lazy flag — when true, the service returns fake data. */\n mock: () => boolean;\n}\n\nexport interface IExecutionsService {\n list(params?: ExecutionListParams): Promise<ExecutionListResponse>;\n detail(uuid: string): Promise<ContentExecution>;\n}\n\n/**\n * Executions service (read-only). Backs both the FEAT-003 detection feed\n * (fetched on view mount; no polling) and the FEAT-005 action-history table.\n *\n * Endpoint contract (`eaera_cms/core/executions/routes.py` +\n * `core/rules/routes.py`):\n * GET /api/v1/executions → ExecutionListResponse\n * GET /api/v1/rules/content/{contentId}/executions → FLAT array (when `contentId` is set)\n * GET /api/v1/executions/{uuid} → single execution\n * POST /api/v1/executions/{uuid}/cancel → single execution (not used by current features)\n *\n * The executions feed is **read-only**: status is the `ExecutionStatus` enum.\n * Operator remediation (move group / set leverage) is performed through the\n * **content action router** (`content.invokeAction`), not here; \"dismiss\" is an\n * optional ephemeral client-side hide.\n */\nexport function createExecutionsService(opts: IExecutionsServiceOptions): IExecutionsService {\n const { api, mock } = opts;\n\n return {\n async list(params = {}) {\n if (mock()) {\n const res = mockExecutionList(params);\n return {\n items: res.items.map(deepClone),\n total: res.total,\n page: res.page,\n perPage: res.perPage,\n };\n }\n if (params.contentId) {\n // byContent returns a FLAT array (not ExecutionListResponse).\n const { contentId: _id, offset = 0, limit = 50, ...rest } = params;\n const rows = await api<ContentExecution[]>(\n EXECUTIONS_ENDPOINT.byContent(params.contentId),\n {\n query: { offset, limit, ...rest },\n }\n );\n const page = Math.floor(offset / Math.max(limit, 1)) + 1;\n return { items: rows, total: rows.length, page, perPage: limit };\n }\n const { contentId: _drop, offset: _o, limit: _l, sourceType: _s, ...query } = params;\n return api<ExecutionListResponse>(EXECUTIONS_ENDPOINT.BASE, { query });\n },\n\n async detail(uuid) {\n if (mock()) return _mustFind(mockExecutionDetail(uuid), uuid);\n return api<ContentExecution>(EXECUTIONS_ENDPOINT.detail(uuid));\n },\n };\n}\n\n/* ----------------------------- file-private helpers ----------------------------- */\n\nfunction _mustFind(exec: ContentExecution | undefined, uuid: string): ContentExecution {\n if (!exec) throw _notFound(`Execution ${uuid} not found`);\n return deepClone(exec);\n}\n\nfunction _notFound(message: string): Error {\n const e = new Error(message);\n (e as Error & { statusCode?: number }).statusCode = 404;\n return e;\n}\n","import { CONTENT_ENDPOINT } from './content.constant';\n\n/**\n * AI Government Portal pack (`eaera-agent-government`) — content types,\n * action names, and the portal REST endpoints mounted by the engine.\n *\n * Source of truth:\n * `eaera-docs/company-os/ai-government-portal/be-docs/api_references.md`.\n */ export const GOV_CONTENT_TYPE = {\n AGENT: 'gov.agent',\n AGENT_TYPE: 'gov.agent_type',\n TEAM: 'gov.team',\n PROJECT: 'gov.project',\n GATEWAY_PROVIDER: 'gov.gateway_provider',\n GATEWAY_ROUTE: 'gov.gateway_route',\n GATEWAY_CONSUMER: 'gov.gateway_consumer',\n CONTENT_POLICY: 'gov.content_policy',\n USAGE_RECORD: 'gov.usage_record',\n COST_REPORT: 'gov.cost_report',\n LIFECYCLE_EVENT: 'gov.lifecycle_event',\n ALERT: 'gov.alert',\n SETTING: 'setting.gov',\n} as const;\n\nexport type GovContentTypeName = (typeof GOV_CONTENT_TYPE)[keyof typeof GOV_CONTENT_TYPE];\n\nexport const GOV_CONTENT_TYPE_NAMES: readonly GovContentTypeName[] =\n Object.values(GOV_CONTENT_TYPE);\n\n/**\n * Portal REST reads (pack router, api_references §6). Mounted by the engine\n * from the pack.yaml `routers:` block. Plain lists (agents, providers) have\n * NO dedicated endpoint — they go through the generic content API\n * (`GET /api/v1/content?type=<ct>`, §3).\n */\nexport const GOV_ENDPOINT = {\n PROJECT_MATRIX: '/api/v1/projects/matrix',\n projectTasks: (name: string): string => `/api/v1/projects/${name}/tasks`,\n GATEWAY_PLUGINS: '/api/v1/gateway/plugins',\n /** Worker CR phase + Matrix MXID, realtime (needs the engine K8s client). */\n workerStatus: (name: string): string => `/api/v1/agents/${name}/worker-status`,\n /** Worker gateway key straight from Secret `agentteams-creds-<name>`. */\n workerGatewayKey: (name: string): string => `/api/v1/agents/${name}/gateway-key`,\n USAGE_COST: '/api/v1/usage/cost',\n USAGE_DASHBOARD: '/api/v1/usage/dashboard',\n USAGE_EXPORT: '/api/v1/usage/export',\n /** Generic action route — shared with the content service. */\n action: CONTENT_ENDPOINT.action,\n} as const;\n\n/** The 29 pack actions (api_references §5). */\nexport const GOV_ACTION_NAME = {\n ONBOARD: 'onboard',\n SUSPEND: 'suspend',\n RESUME: 'resume',\n DECOMMISSION: 'decommission',\n UPDATE_CONFIG: 'update_config',\n SYNC_AGENT_STATUS: 'sync_agent_status',\n RESOLVE_CONFIG: 'resolve_config',\n ENSURE_AGENT_TYPE_SEEDS: 'ensure_agent_type_seeds',\n ENSURE_COORDINATOR: 'ensure_coordinator',\n CREATE_CONSUMER: 'create_consumer',\n REVOKE_CONSUMER: 'revoke_consumer',\n SYNC_PROVIDER: 'sync_provider',\n DELETE_PROVIDER: 'delete_provider',\n SYNC_ROUTE: 'sync_route',\n DELETE_ROUTE: 'delete_route',\n SYNC_CONSUMER_LIMITS: 'sync_consumer_limits',\n PUBLISH_CONTENT_POLICY: 'publish_content_policy',\n ASSIGNMENT_MATRIX: 'assignment_matrix',\n AGGREGATE_TASKS: 'aggregate_tasks',\n RUN_MONITORING: 'run_monitoring',\n CREATE_TEAM: 'create_team',\n ARCHIVE_TEAM: 'archive_team',\n AGGREGATE_USAGE: 'aggregate_usage',\n GENERATE_COST_REPORT: 'generate_cost_report',\n COMPUTE_COST: 'compute_cost',\n DASHBOARD: 'dashboard',\n EXPORT_USAGE: 'export_usage',\n WORKER_STATUS: 'worker_status',\n WORKER_GATEWAY_KEY: 'worker_gateway_key',\n} as const;\n\nexport type GovActionName = (typeof GOV_ACTION_NAME)[keyof typeof GOV_ACTION_NAME];\n\n/**\n * Action-by-CT contract — every pack action is bound to one content type.\n * Invoking an action on a uuid of another CT returns a dispatcher error.\n */\nexport const GOV_ACTION_BY_CT: Record<GovContentTypeName, readonly GovActionName[]> = {\n [GOV_CONTENT_TYPE.AGENT]: [\n GOV_ACTION_NAME.ONBOARD,\n GOV_ACTION_NAME.SUSPEND,\n GOV_ACTION_NAME.RESUME,\n GOV_ACTION_NAME.DECOMMISSION,\n GOV_ACTION_NAME.UPDATE_CONFIG,\n GOV_ACTION_NAME.SYNC_AGENT_STATUS,\n GOV_ACTION_NAME.WORKER_STATUS,\n GOV_ACTION_NAME.WORKER_GATEWAY_KEY,\n ],\n [GOV_CONTENT_TYPE.AGENT_TYPE]: [GOV_ACTION_NAME.RESOLVE_CONFIG],\n [GOV_CONTENT_TYPE.TEAM]: [GOV_ACTION_NAME.CREATE_TEAM, GOV_ACTION_NAME.ARCHIVE_TEAM],\n [GOV_CONTENT_TYPE.PROJECT]: [\n GOV_ACTION_NAME.ASSIGNMENT_MATRIX,\n GOV_ACTION_NAME.AGGREGATE_TASKS,\n GOV_ACTION_NAME.RUN_MONITORING,\n ],\n [GOV_CONTENT_TYPE.GATEWAY_PROVIDER]: [\n GOV_ACTION_NAME.SYNC_PROVIDER,\n GOV_ACTION_NAME.DELETE_PROVIDER,\n ],\n [GOV_CONTENT_TYPE.GATEWAY_ROUTE]: [GOV_ACTION_NAME.SYNC_ROUTE, GOV_ACTION_NAME.DELETE_ROUTE],\n [GOV_CONTENT_TYPE.GATEWAY_CONSUMER]: [\n GOV_ACTION_NAME.CREATE_CONSUMER,\n GOV_ACTION_NAME.REVOKE_CONSUMER,\n GOV_ACTION_NAME.SYNC_CONSUMER_LIMITS,\n ],\n [GOV_CONTENT_TYPE.CONTENT_POLICY]: [GOV_ACTION_NAME.PUBLISH_CONTENT_POLICY],\n [GOV_CONTENT_TYPE.USAGE_RECORD]: [GOV_ACTION_NAME.AGGREGATE_USAGE],\n [GOV_CONTENT_TYPE.COST_REPORT]: [\n GOV_ACTION_NAME.GENERATE_COST_REPORT,\n GOV_ACTION_NAME.COMPUTE_COST,\n GOV_ACTION_NAME.DASHBOARD,\n GOV_ACTION_NAME.EXPORT_USAGE,\n ],\n [GOV_CONTENT_TYPE.LIFECYCLE_EVENT]: [],\n [GOV_CONTENT_TYPE.ALERT]: [],\n [GOV_CONTENT_TYPE.SETTING]: [\n GOV_ACTION_NAME.ENSURE_AGENT_TYPE_SEEDS,\n GOV_ACTION_NAME.ENSURE_COORDINATOR,\n ],\n};\n\n/** Time windows accepted by the usage endpoints (api_references §5/§6). */\nexport const GOV_USAGE_WINDOW = {\n TODAY: 'today',\n W24H: '24h',\n W7D: '7d',\n W30D: '30d',\n CUSTOM: 'custom',\n} as const;\n\nexport type GovUsageWindow = (typeof GOV_USAGE_WINDOW)[keyof typeof GOV_USAGE_WINDOW];\n\n/** Group-by dimensions for `GET /api/v1/usage/cost`. */\nexport const GOV_COST_GROUP = {\n AGENT: 'agent',\n PROJECT: 'project',\n PROVIDER: 'provider',\n MODEL: 'model',\n} as const;\n\nexport type GovCostGroup = (typeof GOV_COST_GROUP)[keyof typeof GOV_COST_GROUP];\n\n/** Backend defaults for the gov actions + usage REST reads. */\nexport const GOV_DEFAULTS = {\n USAGE_WINDOW: '24h',\n COST_GROUP: 'agent',\n /** aggregate_usage window_minutes. */\n WINDOW_MINUTES: 5,\n /** aggregate_usage spike_multiplier. */\n SPIKE_MULTIPLIER: 2.0,\n /** aggregate_usage report_type. */\n REPORT_TYPE: 'consumer',\n /** dashboard group_key. */\n GROUP_KEY: 'agent',\n /** dashboard top_n. */\n TOP_N: 10,\n /** run_monitoring timeout (seconds). */\n MONITOR_TIMEOUT_S: 10,\n /** export_usage filename. */\n EXPORT_FILENAME: 'usage.csv',\n} as const;\n","import type { $Fetch } from 'ofetch';\nimport {\n GOV_ACTION_NAME,\n GOV_DEFAULTS,\n GOV_ENDPOINT,\n type GovActionName,\n} from '../../common/constants/gov.constant';\nimport type { ActionResponse } from '../content/content.type';\nimport type {\n GovActionOpts,\n GovAggregateTasksParams,\n GovAggregateUsageParams,\n GovAssignmentMatrixParams,\n GovComputeCostParams,\n GovCreateConsumerParams,\n GovDeleteProviderParams,\n GovDeleteRouteParams,\n GovGenerateCostReportParams,\n GovLifecycleParams,\n GovMatrixRow,\n GovOnboardParams,\n GovPluginsResponse,\n GovProjectTasksOutput,\n GovPublishPolicyParams,\n GovResolveConfigParams,\n GovRevokeConsumerParams,\n GovRunMonitoringParams,\n GovSyncConsumerLimitsParams,\n GovSyncProviderParams,\n GovSyncRouteParams,\n GovSyncStatusParams,\n GovTeamParams,\n GovUpdateConfigParams,\n GovUsageCost,\n GovUsageDashboard,\n GovUsageDashboardParams,\n GovUsageExport,\n GovUsageExportParams,\n GovUsageQuery,\n GovWorkerGatewayKeyOutput,\n GovWorkerStatusOutput,\n} from './gov.type';\n\nexport interface IGovServiceOptions {\n /** The CMS `$Fetch` instance (one of `sdk.apis`). */\n api: $Fetch;\n}\n\nexport interface IGovService {\n /* Portal REST reads (api_references §6) */\n getAssignmentMatrix(): Promise<GovMatrixRow[]>;\n getProjectTasks(name: string): Promise<GovProjectTasksOutput>;\n /**\n * Gateway plugins currently deployed, read from the git source of truth\n * (`gateway/`). Plugins the portal manages carry a `portalEdit` hint\n * (CT + action); fleet plugins do not. Caller supplies `githubToken` only\n * to override the engine's configured token.\n */\n listPlugins(query?: { githubToken?: string }): Promise<GovPluginsResponse>;\n /**\n * Worker CR phase + Matrix MXID, realtime from the cluster (engine K8s\n * client required — `503` when missing). Read endpoint keyed by agent name.\n */\n getWorkerStatus(agent: string, query?: { namespace?: string }): Promise<GovWorkerStatusOutput>;\n /** Worker gateway key straight from Secret `agentteams-creds-<name>` — the DB copy may be rotated/stale. */\n getWorkerGatewayKey(agent: string): Promise<GovWorkerGatewayKeyOutput>;\n getUsageCost(query?: GovUsageQuery): Promise<GovUsageCost>;\n getUsageDashboard(query?: GovUsageQuery): Promise<GovUsageDashboard>;\n exportUsageCsv(query?: GovUsageQuery): Promise<GovUsageExport>;\n\n /* FEAT-001 — agent lifecycle (gov.agent) */\n onboard(uuid: string, params?: GovOnboardParams, opts?: GovActionOpts): Promise<ActionResponse>;\n suspend(uuid: string, params?: GovLifecycleParams, opts?: GovActionOpts): Promise<ActionResponse>;\n resume(uuid: string, params?: GovLifecycleParams, opts?: GovActionOpts): Promise<ActionResponse>;\n decommission(\n uuid: string,\n params?: GovLifecycleParams,\n opts?: GovActionOpts\n ): Promise<ActionResponse>;\n updateConfig(\n uuid: string,\n params?: GovUpdateConfigParams,\n opts?: GovActionOpts\n ): Promise<ActionResponse>;\n syncAgentStatus(\n uuid: string,\n params?: GovSyncStatusParams,\n opts?: GovActionOpts\n ): Promise<ActionResponse>;\n\n /* Realtime workers (gov.agent) — same payloads as the REST reads. */\n workerStatus(\n uuid: string,\n params?: { namespace?: string },\n opts?: GovActionOpts\n ): Promise<ActionResponse>;\n workerGatewayKey(uuid: string, opts?: GovActionOpts): Promise<ActionResponse>;\n\n /* FEAT-002 — agent types (gov.agent_type / setting.gov) */\n resolveConfig(\n uuid: string,\n params?: GovResolveConfigParams,\n opts?: GovActionOpts\n ): Promise<ActionResponse>;\n ensureAgentTypeSeeds(uuid: string, opts?: GovActionOpts): Promise<ActionResponse>;\n ensureCoordinator(uuid: string, opts?: GovActionOpts): Promise<ActionResponse>;\n\n /* FEAT-003 — gateway */\n createConsumer(\n uuid: string,\n params: GovCreateConsumerParams,\n opts?: GovActionOpts\n ): Promise<ActionResponse>;\n revokeConsumer(\n uuid: string,\n params: GovRevokeConsumerParams,\n opts?: GovActionOpts\n ): Promise<ActionResponse>;\n syncProvider(\n uuid: string,\n params?: GovSyncProviderParams,\n opts?: GovActionOpts\n ): Promise<ActionResponse>;\n deleteProvider(\n uuid: string,\n params?: GovDeleteProviderParams,\n opts?: GovActionOpts\n ): Promise<ActionResponse>;\n syncRoute(\n uuid: string,\n params?: GovSyncRouteParams,\n opts?: GovActionOpts\n ): Promise<ActionResponse>;\n deleteRoute(\n uuid: string,\n params: GovDeleteRouteParams,\n opts?: GovActionOpts\n ): Promise<ActionResponse>;\n syncConsumerLimits(\n uuid: string,\n params?: GovSyncConsumerLimitsParams,\n opts?: GovActionOpts\n ): Promise<ActionResponse>;\n\n /* FEAT-004 — content policy (gov.content_policy) */\n publishContentPolicy(\n uuid: string,\n params?: GovPublishPolicyParams,\n opts?: GovActionOpts\n ): Promise<ActionResponse>;\n\n /* FEAT-005 — projects (gov.project) */\n assignmentMatrix(\n uuid: string,\n params?: GovAssignmentMatrixParams,\n opts?: GovActionOpts\n ): Promise<ActionResponse>;\n aggregateTasks(\n uuid: string,\n params?: GovAggregateTasksParams,\n opts?: GovActionOpts\n ): Promise<ActionResponse>;\n runMonitoring(\n uuid: string,\n params?: GovRunMonitoringParams,\n opts?: GovActionOpts\n ): Promise<ActionResponse>;\n\n /* FEAT-006 — teams (gov.team) */\n createTeam(uuid: string, params?: GovTeamParams, opts?: GovActionOpts): Promise<ActionResponse>;\n archiveTeam(uuid: string, params?: GovTeamParams, opts?: GovActionOpts): Promise<ActionResponse>;\n\n /* FEAT-007 — usage & cost (gov.usage_record / gov.cost_report) */\n aggregateUsage(\n uuid: string,\n params?: GovAggregateUsageParams,\n opts?: GovActionOpts\n ): Promise<ActionResponse>;\n generateCostReport(\n uuid: string,\n params: GovGenerateCostReportParams,\n opts?: GovActionOpts\n ): Promise<ActionResponse>;\n computeCost(\n uuid: string,\n params: GovComputeCostParams,\n opts?: GovActionOpts\n ): Promise<ActionResponse>;\n usageDashboard(\n uuid: string,\n params?: GovUsageDashboardParams,\n opts?: GovActionOpts\n ): Promise<ActionResponse>;\n usageExport(\n uuid: string,\n params?: GovUsageExportParams,\n opts?: GovActionOpts\n ): Promise<ActionResponse>;\n}\n\n/**\n * AI Government Portal service — typed surface for the\n * `eaera-agent-government` pack.\n *\n * Two groups of calls:\n * 1. Portal REST reads mounted by the engine pack router (§6) —\n * matrix/tasks/usage aggregations + realtime worker status/gateway key.\n * Plain lists (agents, providers) have no dedicated endpoint; read them\n * via `useContentStore.fetchByType` with the `GOV_CONTENT_TYPE` names (§3).\n * 2. Typed wrappers (29) over the generic action route\n * `POST /api/v1/content/{uuid}/actions/{actionName}` (§5).\n *\n * Every wrapper returns the raw `ActionResponse` envelope — handler failures\n * arrive as HTTP 200 with `success: false`; check `success` before casting\n * `output` to the per-action type (e.g. `GovOnboardOutput`).\n *\n * This service does NOT participate in mock mode — the pack backend is live,\n * so every call goes to `api` regardless of `sdk.setMock()`.\n */\nexport function createGovService(opts: IGovServiceOptions): IGovService {\n const { api } = opts;\n\n const _invoke = (\n uuid: string,\n action: GovActionName,\n params?: object,\n actOpts?: GovActionOpts\n ): Promise<ActionResponse> =>\n api<ActionResponse>(GOV_ENDPOINT.action(uuid, action), {\n method: 'POST',\n body: {\n params: (params ?? {}) as Record<string, unknown>,\n intentionId: actOpts?.intentionId,\n expectedVersion: actOpts?.expectedVersion,\n },\n });\n\n return {\n async getAssignmentMatrix(): Promise<GovMatrixRow[]> {\n const res = await api<{ matrix: GovMatrixRow[] }>(GOV_ENDPOINT.PROJECT_MATRIX);\n return res.matrix ?? [];\n },\n\n async getProjectTasks(name: string): Promise<GovProjectTasksOutput> {\n return api<GovProjectTasksOutput>(GOV_ENDPOINT.projectTasks(name), { method: 'POST' });\n },\n\n async listPlugins(query: { githubToken?: string } = {}): Promise<GovPluginsResponse> {\n return api<GovPluginsResponse>(GOV_ENDPOINT.GATEWAY_PLUGINS, {\n query: query.githubToken ? { github_token: query.githubToken } : undefined,\n });\n },\n\n async getWorkerStatus(\n agent: string,\n query: { namespace?: string } = {}\n ): Promise<GovWorkerStatusOutput> {\n return api<GovWorkerStatusOutput>(GOV_ENDPOINT.workerStatus(agent), {\n query: query.namespace ? { namespace: query.namespace } : undefined,\n });\n },\n\n async getWorkerGatewayKey(agent: string): Promise<GovWorkerGatewayKeyOutput> {\n return api<GovWorkerGatewayKeyOutput>(GOV_ENDPOINT.workerGatewayKey(agent));\n },\n\n async getUsageCost(query: GovUsageQuery = {}): Promise<GovUsageCost> {\n return api<GovUsageCost>(GOV_ENDPOINT.USAGE_COST, {\n query: {\n group: query.group ?? GOV_DEFAULTS.COST_GROUP,\n window: query.window ?? GOV_DEFAULTS.USAGE_WINDOW,\n },\n });\n },\n\n async getUsageDashboard(query: GovUsageQuery = {}): Promise<GovUsageDashboard> {\n return api<GovUsageDashboard>(GOV_ENDPOINT.USAGE_DASHBOARD, {\n query: { window: query.window ?? GOV_DEFAULTS.USAGE_WINDOW },\n });\n },\n\n async exportUsageCsv(query: GovUsageQuery = {}): Promise<GovUsageExport> {\n return api<GovUsageExport>(GOV_ENDPOINT.USAGE_EXPORT, {\n query: { window: query.window ?? GOV_DEFAULTS.USAGE_WINDOW },\n });\n },\n\n onboard: (uuid, params, actOpts) => _invoke(uuid, GOV_ACTION_NAME.ONBOARD, params, actOpts),\n suspend: (uuid, params, actOpts) => _invoke(uuid, GOV_ACTION_NAME.SUSPEND, params, actOpts),\n resume: (uuid, params, actOpts) => _invoke(uuid, GOV_ACTION_NAME.RESUME, params, actOpts),\n decommission: (uuid, params, actOpts) =>\n _invoke(uuid, GOV_ACTION_NAME.DECOMMISSION, params, actOpts),\n updateConfig: (uuid, params, actOpts) =>\n _invoke(uuid, GOV_ACTION_NAME.UPDATE_CONFIG, params, actOpts),\n syncAgentStatus: (uuid, params, actOpts) =>\n _invoke(uuid, GOV_ACTION_NAME.SYNC_AGENT_STATUS, params, actOpts),\n\n resolveConfig: (uuid, params, actOpts) =>\n _invoke(uuid, GOV_ACTION_NAME.RESOLVE_CONFIG, params, actOpts),\n ensureAgentTypeSeeds: (uuid, actOpts) =>\n _invoke(uuid, GOV_ACTION_NAME.ENSURE_AGENT_TYPE_SEEDS, undefined, actOpts),\n ensureCoordinator: (uuid, actOpts) =>\n _invoke(uuid, GOV_ACTION_NAME.ENSURE_COORDINATOR, undefined, actOpts),\n\n createConsumer: (uuid, params, actOpts) =>\n _invoke(uuid, GOV_ACTION_NAME.CREATE_CONSUMER, params, actOpts),\n revokeConsumer: (uuid, params, actOpts) =>\n _invoke(uuid, GOV_ACTION_NAME.REVOKE_CONSUMER, params, actOpts),\n syncProvider: (uuid, params, actOpts) =>\n _invoke(uuid, GOV_ACTION_NAME.SYNC_PROVIDER, params, actOpts),\n deleteProvider: (uuid, params, actOpts) =>\n _invoke(uuid, GOV_ACTION_NAME.DELETE_PROVIDER, params, actOpts),\n syncRoute: (uuid, params, actOpts) =>\n _invoke(uuid, GOV_ACTION_NAME.SYNC_ROUTE, params, actOpts),\n deleteRoute: (uuid, params, actOpts) =>\n _invoke(uuid, GOV_ACTION_NAME.DELETE_ROUTE, params, actOpts),\n syncConsumerLimits: (uuid, params, actOpts) =>\n _invoke(uuid, GOV_ACTION_NAME.SYNC_CONSUMER_LIMITS, params, actOpts),\n\n publishContentPolicy: (uuid, params, actOpts) =>\n _invoke(uuid, GOV_ACTION_NAME.PUBLISH_CONTENT_POLICY, params, actOpts),\n\n assignmentMatrix: (uuid, params, actOpts) =>\n _invoke(uuid, GOV_ACTION_NAME.ASSIGNMENT_MATRIX, params, actOpts),\n aggregateTasks: (uuid, params, actOpts) =>\n _invoke(uuid, GOV_ACTION_NAME.AGGREGATE_TASKS, params, actOpts),\n runMonitoring: (uuid, params, actOpts) =>\n _invoke(uuid, GOV_ACTION_NAME.RUN_MONITORING, params, actOpts),\n\n createTeam: (uuid, params, actOpts) =>\n _invoke(uuid, GOV_ACTION_NAME.CREATE_TEAM, params, actOpts),\n archiveTeam: (uuid, params, actOpts) =>\n _invoke(uuid, GOV_ACTION_NAME.ARCHIVE_TEAM, params, actOpts),\n\n aggregateUsage: (uuid, params, actOpts) =>\n _invoke(uuid, GOV_ACTION_NAME.AGGREGATE_USAGE, params, actOpts),\n generateCostReport: (uuid, params, actOpts) =>\n _invoke(uuid, GOV_ACTION_NAME.GENERATE_COST_REPORT, params, actOpts),\n computeCost: (uuid, params, actOpts) =>\n _invoke(uuid, GOV_ACTION_NAME.COMPUTE_COST, params, actOpts),\n usageDashboard: (uuid, params, actOpts) =>\n _invoke(uuid, GOV_ACTION_NAME.DASHBOARD, params, actOpts),\n usageExport: (uuid, params, actOpts) =>\n _invoke(uuid, GOV_ACTION_NAME.EXPORT_USAGE, params, actOpts),\n\n workerStatus: (uuid, params, actOpts) =>\n _invoke(uuid, GOV_ACTION_NAME.WORKER_STATUS, params, actOpts),\n workerGatewayKey: (uuid, actOpts) =>\n _invoke(uuid, GOV_ACTION_NAME.WORKER_GATEWAY_KEY, undefined, actOpts),\n };\n}\n","/**\n * History endpoints (`eaera_cms/history/routes.py`, doc §5.6).\n *\n * ClickHouse-direct deal / position / order reads with email-bound authz:\n * the route resolves the caller's identity by **email** — it looks up\n * `users.email` for the JWT `sub`, then matches every `Mt5Account.data.email`\n * against that address. Callers do NOT pass accountUuid.\n *\n * The legacy CT-backed path (`/api/v1/content?type=Mt5*History`) still\n * works for backward compatibility but is no longer the recommended read\n * — see `eaera-docs/cbs/eaera-cms/docs/eaera-cms-api-inventory.md` §5.6.\n */\nexport const HISTORY_ENDPOINT = {\n DEALS: '/api/v1/history/deals',\n DEALS_SUMMARY: '/api/v1/history/deals/summary',\n DEALS_EXPORT: '/api/v1/history/deals/export',\n POSITIONS: '/api/v1/history/positions',\n POSITIONS_SUMMARY: '/api/v1/history/positions/summary',\n POSITIONS_EXPORT: '/api/v1/history/positions/export',\n ORDERS: '/api/v1/history/orders',\n ORDERS_SUMMARY: '/api/v1/history/orders/summary',\n ORDERS_EXPORT: '/api/v1/history/orders/export',\n} as const;\n\n/** History query defaults (doc §5.6.2). */\nexport const HISTORY_DEFAULTS = {\n PAGE: 1,\n SIZE: 50,\n SIZE_MIN: 1,\n SIZE_MAX: 500,\n SORT_DIRECTION: 'desc' as const,\n} as const;\n\n/**\n * Per-entity sort whitelist (doc §5.6.2). The backend rejects anything\n * outside this list with a 400 — this prevents SQL injection through the\n * `sortBy` query parameter.\n */\nexport const HISTORY_SORT_BY = {\n deals: ['deal_id', 'mt5_ts', 'price', 'volume', 'profit_loss'] as const,\n positions: ['position_id', 'mt5_ts_open', 'mt5_ts_close', 'volume', 'profit_loss'] as const,\n orders: ['order_id', 'mt5_ts_setup', 'mt5_ts_done', 'volume'] as const,\n} as const;\n\nexport type HistoryDealsSortBy = (typeof HISTORY_SORT_BY.deals)[number];\nexport type HistoryPositionsSortBy = (typeof HISTORY_SORT_BY.positions)[number];\nexport type HistoryOrdersSortBy = (typeof HISTORY_SORT_BY.orders)[number];\n\n/** Sort direction whitelist. */\nexport const HISTORY_SORT_DIRECTION = {\n ASC: 'asc',\n DESC: 'desc',\n} as const;\nexport type HistorySortDirection =\n (typeof HISTORY_SORT_DIRECTION)[keyof typeof HISTORY_SORT_DIRECTION];\n\n/**\n * Order status labels returned by the backend, decoded from `state_str`\n * (doc §5.6.2 row 3 + §5.6.5). Non-terminal states surface as `UNKNOWN`.\n */\nexport const HISTORY_ORDER_STATUS = {\n FILLED: 'FILLED',\n CANCELLED: 'CANCELLED',\n EXPIRED: 'EXPIRED',\n REJECTED: 'REJECTED',\n UNKNOWN: 'UNKNOWN',\n} as const;\nexport type HistoryOrderStatus = (typeof HISTORY_ORDER_STATUS)[keyof typeof HISTORY_ORDER_STATUS];\n\n/** Deal `entry` values (doc §5.6.2 + §4.9). */\nexport const HISTORY_DEAL_ENTRY = {\n IN: 'IN',\n OUT: 'OUT',\n INOUT: 'INOUT',\n OUT_BY: 'OUT_BY',\n} as const;\nexport type HistoryDealEntry = (typeof HISTORY_DEAL_ENTRY)[keyof typeof HISTORY_DEAL_ENTRY];\n\n/**\n * Deal `action` values (doc §4.9 + §5.6.2 row 3).\n * Trade deals use BUY/SELL; non-trade rows use BALANCE/CREDIT/etc.\n * The FE splits BALANCE rows into deposits (profit_loss > 0) and\n * withdrawals (profit_loss < 0) for the Funding tab.\n */\nexport const HISTORY_DEAL_ACTION = {\n BUY: 'BUY',\n SELL: 'SELL',\n BALANCE: 'BALANCE',\n CREDIT: 'CREDIT',\n CHARGE: 'CHARGE',\n CORRECTION: 'CORRECTION',\n BONUS: 'BONUS',\n COMMISSION: 'COMMISSION',\n COMMISSION_DAILY: 'COMMISSION_DAILY',\n COMMISSION_MONTHLY: 'COMMISSION_MONTHLY',\n AGENT_DAILY: 'AGENT_DAILY',\n AGENT_MONTHLY: 'AGENT_MONTHLY',\n INTERESTRATE: 'INTERESTRATE',\n BUY_CANCELED: 'BUY_CANCELED',\n SELL_CANCELED: 'SELL_CANCELED',\n DIVIDEND: 'DIVIDEND',\n DIVIDEND_FRANKED: 'DIVIDEND_FRANKED',\n TAX: 'TAX',\n AGENT: 'AGENT',\n SO_COMPENSATION: 'SO_COMPENSATION',\n SO_COMPENSATION_CREDIT: 'SO_COMPENSATION_CREDIT',\n} as const;\nexport type HistoryDealAction = (typeof HISTORY_DEAL_ACTION)[keyof typeof HISTORY_DEAL_ACTION];\n\n/** Tab identifier — discriminator for endpoints, mocks, and exports. */\nexport const HISTORY_TAB = {\n DEALS: 'deals',\n POSITIONS: 'positions',\n ORDERS: 'orders',\n} as const;\nexport type HistoryTab = (typeof HISTORY_TAB)[keyof typeof HISTORY_TAB];\n","/**\n * Generic sort-direction discriminator. Used by every endpoint that\n * accepts `?sortDirection=asc|desc` (history, bars, content list, rules,\n * executions, …) and by the FE table-column sort handlers.\n *\n * `HISTORY_SORT_DIRECTION` is a history-namespaced alias for backwards\n * compatibility — prefer `SORT_DIRECTION` in new code.\n */\nexport const SORT_DIRECTION = {\n ASC: 'asc',\n DESC: 'desc',\n} as const;\nexport type SortDirection = (typeof SORT_DIRECTION)[keyof typeof SORT_DIRECTION];\n","import {\n HISTORY_DEAL_ACTION,\n HISTORY_DEFAULTS,\n HISTORY_DEAL_ENTRY,\n HISTORY_ORDER_STATUS,\n HISTORY_TAB,\n type HistoryDealAction,\n type HistoryDealEntry,\n type HistoryOrderStatus,\n type HistoryTab,\n} from '../../common/constants/history.constant';\nimport { SORT_DIRECTION, type SortDirection } from '../../common/constants/sort.constant';\nimport { MT5_SERVER_NAME, MT5_TRADE_SIDE } from '../../common/constants/mt5.constant';\nimport type {\n DealHistoryItem,\n DealsSummaryResponse,\n HistoryDealsQuery,\n HistoryListResponse,\n HistoryOrdersQuery,\n HistoryPositionsQuery,\n OrderHistoryItem,\n OrdersSummaryResponse,\n PositionHistoryItem,\n PositionSummaryResponse,\n} from './history.type';\n\n/**\n * Fake history rows for development. The mocks are intentionally small\n * (~10 rows per tab) but cover every status / entry value the backend\n * can emit so the FE can exercise label rendering, sort, and pagination.\n */\n\nexport const MOCK_DEALS: DealHistoryItem[] = [\n {\n serverName: MT5_SERVER_NAME,\n login: 200223,\n dealId: 9001,\n orderId: 7001,\n positionId: 5001,\n mt5Ts: '2026-07-15T08:00:00+00:00',\n symbol: 'EURUSD',\n entry: HISTORY_DEAL_ENTRY.IN,\n action: MT5_TRADE_SIDE.BUY,\n volume: 0.1,\n price: 1.085,\n commission: -0.7,\n fee: 0,\n swap: 0,\n profitLoss: 0,\n comment: 'web',\n },\n {\n serverName: MT5_SERVER_NAME,\n login: 200223,\n dealId: 9002,\n orderId: 7001,\n positionId: 5001,\n mt5Ts: '2026-07-15T10:30:00+00:00',\n symbol: 'EURUSD',\n entry: HISTORY_DEAL_ENTRY.OUT,\n action: MT5_TRADE_SIDE.SELL,\n volume: 0.1,\n price: 1.0875,\n commission: -0.7,\n fee: 0,\n swap: -1.2,\n profitLoss: 25,\n comment: 'web',\n },\n {\n serverName: MT5_SERVER_NAME,\n login: 200223,\n dealId: 9003,\n orderId: 7002,\n positionId: 5002,\n mt5Ts: '2026-07-16T09:15:00+00:00',\n symbol: 'XAUUSD',\n entry: HISTORY_DEAL_ENTRY.INOUT,\n action: MT5_TRADE_SIDE.BUY,\n volume: 0.05,\n price: 2380.5,\n commission: -1.5,\n fee: 0,\n swap: 0,\n profitLoss: -12.4,\n comment: 'mobile',\n },\n {\n serverName: MT5_SERVER_NAME,\n login: 200223,\n dealId: 9004,\n orderId: 7003,\n positionId: null,\n mt5Ts: '2026-07-17T13:00:00+00:00',\n symbol: 'GBPUSD',\n entry: HISTORY_DEAL_ENTRY.OUT_BY,\n action: MT5_TRADE_SIDE.SELL,\n volume: 0.2,\n price: 1.278,\n commission: 0,\n fee: 0,\n swap: 0,\n profitLoss: 0,\n comment: 'stop-out',\n },\n {\n serverName: MT5_SERVER_NAME,\n login: 200223,\n dealId: 9005,\n orderId: 7004,\n positionId: 5003,\n mt5Ts: '2026-07-18T11:45:00+00:00',\n symbol: 'USDJPY',\n entry: HISTORY_DEAL_ENTRY.IN,\n action: MT5_TRADE_SIDE.SELL,\n volume: 0.3,\n price: 157.21,\n commission: -1.2,\n fee: 0,\n swap: 0,\n profitLoss: 0,\n comment: '',\n },\n // Cross-account rows (login !== 200223) — exercise the `login` filter.\n {\n serverName: MT5_SERVER_NAME,\n login: 100100,\n dealId: 9006,\n orderId: 7008,\n positionId: 5004,\n mt5Ts: '2026-07-16T12:00:00+00:00',\n symbol: 'EURUSD',\n entry: HISTORY_DEAL_ENTRY.IN,\n action: MT5_TRADE_SIDE.BUY,\n volume: 0.2,\n price: 1.086,\n commission: -0.9,\n fee: 0,\n swap: 0,\n profitLoss: 0,\n comment: 'web',\n },\n {\n serverName: MT5_SERVER_NAME,\n login: 100100,\n dealId: 9007,\n orderId: 7008,\n positionId: 5004,\n mt5Ts: '2026-07-16T15:30:00+00:00',\n symbol: 'EURUSD',\n entry: HISTORY_DEAL_ENTRY.OUT,\n action: MT5_TRADE_SIDE.SELL,\n volume: 0.2,\n price: 1.0865,\n commission: -0.9,\n fee: 0,\n swap: 0,\n profitLoss: 1,\n comment: 'web',\n },\n // Funding rows (action=BALANCE). The FE Funding tab filters by\n // `action='BALANCE'` and splits DP/WD by the sign of `profitLoss`.\n {\n serverName: MT5_SERVER_NAME,\n login: 200223,\n dealId: 9101,\n orderId: null,\n positionId: null,\n mt5Ts: '2026-07-15T09:00:00+00:00',\n symbol: '',\n entry: HISTORY_DEAL_ENTRY.IN,\n action: HISTORY_DEAL_ACTION.BALANCE,\n volume: 0,\n price: 0,\n commission: 0,\n fee: 0,\n swap: 0,\n profitLoss: 5000,\n comment: 'deposit',\n },\n {\n serverName: MT5_SERVER_NAME,\n login: 200223,\n dealId: 9102,\n orderId: null,\n positionId: null,\n mt5Ts: '2026-07-19T14:30:00+00:00',\n symbol: '',\n entry: HISTORY_DEAL_ENTRY.OUT,\n action: HISTORY_DEAL_ACTION.BALANCE,\n volume: 0,\n price: 0,\n commission: 0,\n fee: 0,\n swap: 0,\n profitLoss: -250,\n comment: 'withdrawal',\n },\n];\n\nexport const MOCK_POSITIONS: PositionHistoryItem[] = [\n {\n serverName: MT5_SERVER_NAME,\n login: 200223,\n positionId: 5001,\n mt5TsOpen: '2026-07-15T08:00:00+00:00',\n mt5TsClose: '2026-07-15T10:30:00+00:00',\n symbol: 'EURUSD',\n type: 'BUY',\n volume: 0.1,\n openPrice: 1.085,\n closePrice: 1.0875,\n stopLoss: 1.08,\n takeProfit: 1.09,\n commission: -1.4,\n swap: -1.2,\n profitLoss: 25,\n fee: 0,\n comment: 'web',\n currency: 'USD',\n balanceAfter: 10025.0,\n },\n {\n serverName: MT5_SERVER_NAME,\n login: 200223,\n positionId: 5002,\n mt5TsOpen: '2026-07-16T09:15:00+00:00',\n mt5TsClose: '2026-07-16T09:42:00+00:00',\n symbol: 'XAUUSD',\n type: 'BUY',\n volume: 0.05,\n openPrice: 2380.5,\n closePrice: 2377.0,\n stopLoss: null,\n takeProfit: null,\n commission: -3.0,\n swap: 0,\n profitLoss: -17.5,\n fee: 0,\n comment: 'mobile',\n currency: 'USD',\n balanceAfter: 10007.5,\n },\n {\n serverName: MT5_SERVER_NAME,\n login: 200223,\n positionId: 5003,\n mt5TsOpen: '2026-07-18T11:45:00+00:00',\n mt5TsClose: null,\n symbol: 'USDJPY',\n type: 'SELL',\n volume: 0.3,\n openPrice: 157.21,\n closePrice: null,\n stopLoss: 158.0,\n takeProfit: 156.0,\n commission: -2.4,\n swap: 0,\n profitLoss: 18.5,\n fee: 0,\n comment: '',\n currency: 'USD',\n balanceAfter: null,\n },\n // Cross-account row (login !== 200223) — exercise the `login` filter.\n {\n serverName: MT5_SERVER_NAME,\n login: 100100,\n positionId: 5004,\n mt5TsOpen: '2026-07-16T12:00:00+00:00',\n mt5TsClose: '2026-07-16T15:30:00+00:00',\n symbol: 'EURUSD',\n type: 'BUY',\n volume: 0.2,\n openPrice: 1.086,\n closePrice: 1.0865,\n stopLoss: null,\n takeProfit: null,\n commission: -1.8,\n swap: 0,\n profitLoss: 1,\n fee: 0,\n comment: 'web',\n currency: 'USD',\n balanceAfter: 10001.0,\n },\n];\n\nexport const MOCK_ORDERS: OrderHistoryItem[] = [\n {\n serverName: MT5_SERVER_NAME,\n login: 200223,\n orderId: 7001,\n mt5TsSetup: '2026-07-15T07:59:30+00:00',\n mt5TsDone: '2026-07-15T08:00:00+00:00',\n symbol: 'EURUSD',\n type: 'MARKET',\n side: MT5_TRADE_SIDE.BUY,\n volume: 0.1,\n executedPrice: 1.085,\n limitPrice: null,\n stopPrice: null,\n stopLoss: 1.08,\n takeProfit: 1.09,\n status: HISTORY_ORDER_STATUS.FILLED,\n comment: 'web',\n },\n {\n serverName: MT5_SERVER_NAME,\n login: 200223,\n orderId: 7002,\n mt5TsSetup: '2026-07-16T09:14:00+00:00',\n mt5TsDone: '2026-07-16T09:15:00+00:00',\n symbol: 'XAUUSD',\n type: 'MARKET',\n side: MT5_TRADE_SIDE.BUY,\n volume: 0.05,\n executedPrice: 2380.5,\n limitPrice: null,\n stopPrice: null,\n stopLoss: null,\n takeProfit: null,\n status: HISTORY_ORDER_STATUS.FILLED,\n comment: 'mobile',\n },\n {\n serverName: MT5_SERVER_NAME,\n login: 200223,\n orderId: 7003,\n mt5TsSetup: '2026-07-17T12:55:00+00:00',\n mt5TsDone: '2026-07-17T13:00:00+00:00',\n symbol: 'GBPUSD',\n type: 'STOP',\n side: MT5_TRADE_SIDE.SELL,\n volume: 0.2,\n executedPrice: 1.278,\n limitPrice: null,\n stopPrice: 1.278,\n stopLoss: null,\n takeProfit: null,\n status: HISTORY_ORDER_STATUS.FILLED,\n comment: 'stop triggered',\n },\n {\n serverName: MT5_SERVER_NAME,\n login: 200223,\n orderId: 7004,\n mt5TsSetup: '2026-07-18T11:40:00+00:00',\n mt5TsDone: null,\n symbol: 'USDJPY',\n type: 'LIMIT',\n side: MT5_TRADE_SIDE.SELL,\n volume: 0.3,\n executedPrice: null,\n limitPrice: 156.5,\n stopPrice: null,\n stopLoss: null,\n takeProfit: null,\n status: HISTORY_ORDER_STATUS.UNKNOWN,\n comment: 'pending',\n },\n {\n serverName: MT5_SERVER_NAME,\n login: 200223,\n orderId: 7005,\n mt5TsSetup: '2026-07-19T08:00:00+00:00',\n mt5TsDone: '2026-07-19T08:01:00+00:00',\n symbol: 'AUDUSD',\n type: 'LIMIT',\n side: MT5_TRADE_SIDE.BUY,\n volume: 0.05,\n executedPrice: null,\n limitPrice: 0.66,\n stopPrice: null,\n stopLoss: null,\n takeProfit: null,\n status: HISTORY_ORDER_STATUS.CANCELLED,\n comment: 'user cancel',\n },\n {\n serverName: MT5_SERVER_NAME,\n login: 200223,\n orderId: 7006,\n mt5TsSetup: '2026-07-20T08:00:00+00:00',\n mt5TsDone: '2026-07-20T17:00:00+00:00',\n symbol: 'USDCAD',\n type: 'LIMIT',\n side: MT5_TRADE_SIDE.SELL,\n volume: 0.1,\n executedPrice: null,\n limitPrice: 1.36,\n stopPrice: null,\n stopLoss: null,\n takeProfit: null,\n status: HISTORY_ORDER_STATUS.EXPIRED,\n comment: 'day order',\n },\n {\n serverName: MT5_SERVER_NAME,\n login: 200223,\n orderId: 7007,\n mt5TsSetup: '2026-07-21T09:00:00+00:00',\n mt5TsDone: '2026-07-21T09:00:01+00:00',\n symbol: 'NZDUSD',\n type: 'MARKET',\n side: MT5_TRADE_SIDE.BUY,\n volume: 0.05,\n executedPrice: null,\n limitPrice: null,\n stopPrice: null,\n stopLoss: null,\n takeProfit: null,\n status: HISTORY_ORDER_STATUS.REJECTED,\n comment: 'insufficient margin',\n },\n // Cross-account row (login !== 200223) — exercise the `login` filter.\n {\n serverName: MT5_SERVER_NAME,\n login: 100100,\n orderId: 7008,\n mt5TsSetup: '2026-07-16T11:59:30+00:00',\n mt5TsDone: '2026-07-16T12:00:00+00:00',\n symbol: 'EURUSD',\n type: 'MARKET',\n side: MT5_TRADE_SIDE.BUY,\n volume: 0.2,\n executedPrice: 1.086,\n limitPrice: null,\n stopPrice: null,\n stopLoss: null,\n takeProfit: null,\n status: HISTORY_ORDER_STATUS.FILLED,\n comment: 'web',\n },\n];\n\n// ─────────────────────────────────────────────────────────────────────\n// Builders\n// ─────────────────────────────────────────────────────────────────────\n\nconst _buildQuery = (q: HistoryDealsQuery | HistoryPositionsQuery | HistoryOrdersQuery) => ({\n fromTime: q.fromTime,\n toTime: q.toTime,\n symbol: q.symbol,\n login: q.login,\n sortBy: q.sortBy,\n sortDirection: q.sortDirection ?? HISTORY_DEFAULTS.SORT_DIRECTION,\n page: q.page ?? HISTORY_DEFAULTS.PAGE,\n size: q.size ?? HISTORY_DEFAULTS.SIZE,\n});\n\nconst _inRange = (mt5Ts: string, fromTime: string, toTime: string): boolean => {\n // Inclusive lower, exclusive upper (doc §5.6.2).\n return mt5Ts >= fromTime && mt5Ts < toTime;\n};\n\nconst _filterBySymbol = <T extends { symbol: string }>(\n rows: readonly T[],\n symbol: string | undefined\n): T[] => (symbol ? rows.filter((r) => r.symbol === symbol) : [...rows]);\n\nconst _filterByLogin = <T extends { login: number }>(\n rows: readonly T[],\n login: number | undefined\n): T[] => (login != null ? rows.filter((r) => r.login === login) : [...rows]);\n\nconst _filterByAction = <T extends { action: HistoryDealAction }>(\n rows: readonly T[],\n action: HistoryDealAction | undefined\n): T[] => (action ? rows.filter((r) => r.action === action) : [...rows]);\n\nconst _sortRows = <T>(rows: T[], sortBy: string | undefined, direction: SortDirection): T[] => {\n if (!sortBy) return rows;\n const out = [...rows].sort((a, b) => {\n const av = (a as Record<string, unknown>)[sortBy];\n const bv = (b as Record<string, unknown>)[sortBy];\n if (av === bv) return 0;\n if (av === undefined || av === null) return 1;\n if (bv === undefined || bv === null) return -1;\n return av < bv ? -1 : 1;\n });\n return direction === SORT_DIRECTION.ASC ? out : out.reverse();\n};\n\nconst _paginate = <T>(rows: T[], page: number, size: number): HistoryListResponse<T> => {\n const total = rows.length;\n const totalPages = Math.max(1, Math.ceil(total / size));\n const safePage = Math.min(Math.max(1, page), totalPages);\n const start = (safePage - 1) * size;\n return {\n items: rows.slice(start, start + size),\n page: safePage,\n size,\n total,\n totalPages,\n };\n};\n\nconst _resolveQuery = (q: HistoryDealsQuery | HistoryPositionsQuery | HistoryOrdersQuery) => {\n const built = _buildQuery(q);\n if (!built.fromTime || !built.toTime) {\n throw new Error('history mock: fromTime and toTime are required (doc §5.6.2)');\n }\n if (built.fromTime >= built.toTime) {\n throw new Error('history mock: fromTime must be strictly earlier than toTime');\n }\n return built;\n};\n\nexport function mockDeals(q: HistoryDealsQuery): HistoryListResponse<DealHistoryItem> {\n const built = _resolveQuery(q);\n let rows = MOCK_DEALS.filter((r) => _inRange(r.mt5Ts, built.fromTime, built.toTime));\n rows = _filterBySymbol(rows, built.symbol);\n rows = _filterByLogin(rows, built.login);\n rows = _filterByAction(rows, q.action);\n if (q.entry) rows = rows.filter((r) => r.entry === q.entry);\n rows = _sortRows(rows, built.sortBy, built.sortDirection);\n return _paginate(rows, built.page, built.size);\n}\n\nexport function mockPositions(q: HistoryPositionsQuery): HistoryListResponse<PositionHistoryItem> {\n const built = _resolveQuery(q);\n let rows: PositionHistoryItem[] = [];\n // Use mt5TsOpen as the bucket; closed rows are still matched if either\n // edge of their [open, close) window falls in range.\n for (const r of MOCK_POSITIONS) {\n const inRange =\n _inRange(r.mt5TsOpen, built.fromTime, built.toTime) ||\n (r.mt5TsClose !== null &&\n r.mt5TsClose !== undefined &&\n _inRange(r.mt5TsClose, built.fromTime, built.toTime));\n if (inRange) rows.push(r);\n }\n rows = _filterBySymbol(rows, built.symbol);\n rows = _filterByLogin(rows, built.login);\n // Sort field defaults differ for positions (doc §5.6.2).\n const sortBy = built.sortBy ?? 'mt5_ts_close';\n rows = _sortRows(rows, sortBy, built.sortDirection);\n return _paginate(rows, built.page, built.size);\n}\n\nexport function mockOrders(q: HistoryOrdersQuery): HistoryListResponse<OrderHistoryItem> {\n const built = _resolveQuery(q);\n let rows = MOCK_ORDERS.filter(\n (r) =>\n _inRange(r.mt5TsSetup, built.fromTime, built.toTime) ||\n (r.mt5TsDone !== null &&\n r.mt5TsDone !== undefined &&\n _inRange(r.mt5TsDone, built.fromTime, built.toTime))\n );\n rows = _filterBySymbol(rows, built.symbol);\n rows = _filterByLogin(rows, built.login);\n if (q.status) rows = rows.filter((r) => r.status === q.status);\n // Sort field defaults differ for orders (doc §5.6.2).\n const sortBy = built.sortBy ?? 'mt5_ts_done';\n rows = _sortRows(rows, sortBy, built.sortDirection);\n return _paginate(rows, built.page, built.size);\n}\n\nexport function mockDealsSummary(q: HistoryDealsQuery): DealsSummaryResponse {\n const rows = mockDeals({ ...q, page: 1, size: HISTORY_DEFAULTS.SIZE_MAX });\n const totalVolume = rows.items.reduce((s, r) => s + r.volume, 0);\n const totalProfit = rows.items.reduce((s, r) => s + (r.profitLoss ?? 0), 0);\n const totalCommission = rows.items.reduce((s, r) => s + (r.commission ?? 0) + (r.fee ?? 0), 0);\n return {\n totalCount: rows.total,\n totalVolume,\n totalProfit,\n totalCommission,\n totalPnl: totalProfit + totalCommission,\n };\n}\n\nexport function mockPositionsSummary(q: HistoryPositionsQuery): PositionSummaryResponse {\n const rows = mockPositions({ ...q, page: 1, size: HISTORY_DEFAULTS.SIZE_MAX });\n const totalVolume = rows.items.reduce((s, r) => s + r.volume, 0);\n const totalProfit = rows.items.reduce((s, r) => s + (r.profitLoss ?? 0), 0);\n const totalCommission = rows.items.reduce((s, r) => s + (r.commission ?? 0) + (r.fee ?? 0), 0);\n const totalSwap = rows.items.reduce((s, r) => s + (r.swap ?? 0), 0);\n return {\n totalCount: rows.total,\n totalVolume,\n totalProfit,\n totalCommission,\n totalPnl: totalProfit + totalCommission,\n totalSwap,\n };\n}\n\nexport function mockOrdersSummary(q: HistoryOrdersQuery): OrdersSummaryResponse {\n const rows = mockOrders({ ...q, page: 1, size: HISTORY_DEFAULTS.SIZE_MAX });\n const totalVolume = rows.items.reduce((s, r) => s + r.volume, 0);\n let totalFilled = 0;\n let totalCancelled = 0;\n let totalExpired = 0;\n let totalRejected = 0;\n for (const r of rows.items) {\n if (r.status === HISTORY_ORDER_STATUS.FILLED) totalFilled += 1;\n else if (r.status === HISTORY_ORDER_STATUS.CANCELLED) totalCancelled += 1;\n else if (r.status === HISTORY_ORDER_STATUS.EXPIRED) totalExpired += 1;\n else if (r.status === HISTORY_ORDER_STATUS.REJECTED) totalRejected += 1;\n }\n return {\n totalCount: rows.total,\n totalVolume,\n totalFilled,\n totalCancelled,\n totalExpired,\n totalRejected,\n };\n}\n\n/** Build a synthetic CSV Blob for the mock export path. */\nexport function mockExportCsv(\n tab: HistoryTab,\n q: HistoryDealsQuery | HistoryPositionsQuery | HistoryOrdersQuery\n): Blob {\n const built = _resolveQuery(q);\n let header: string;\n let rows: string[];\n if (tab === HISTORY_TAB.DEALS) {\n const items = mockDeals({\n ...(q as HistoryDealsQuery),\n page: 1,\n size: HISTORY_DEFAULTS.SIZE_MAX,\n }).items;\n header = 'server_name,login,deal_id,mt5_ts,symbol,entry,action,volume,price,profit_loss';\n rows = items.map(\n (r) =>\n `${r.serverName},${r.login},${r.dealId},${r.mt5Ts},${r.symbol},${r.entry},${r.action},${r.volume},${r.price},${r.profitLoss ?? ''}`\n );\n } else if (tab === HISTORY_TAB.POSITIONS) {\n const items = mockPositions({\n ...(q as HistoryPositionsQuery),\n page: 1,\n size: HISTORY_DEFAULTS.SIZE_MAX,\n }).items;\n header =\n 'server_name,login,position_id,mt5_ts_open,mt5_ts_close,symbol,type,volume,open_price,close_price,profit_loss';\n rows = items.map(\n (r) =>\n `${r.serverName},${r.login},${r.positionId},${r.mt5TsOpen},${r.mt5TsClose ?? ''},${r.symbol},${r.type},${r.volume},${r.openPrice},${r.closePrice ?? ''},${r.profitLoss ?? ''}`\n );\n } else {\n const items = mockOrders({\n ...(q as HistoryOrdersQuery),\n page: 1,\n size: HISTORY_DEFAULTS.SIZE_MAX,\n }).items;\n header = 'server_name,login,order_id,mt5_ts_setup,mt5_ts_done,symbol,type,side,volume,status';\n rows = items.map(\n (r) =>\n `${r.serverName},${r.login},${r.orderId},${r.mt5TsSetup},${r.mt5TsDone ?? ''},${r.symbol},${r.type},${r.side},${r.volume},${r.status}`\n );\n }\n // Reference `built` so the function signature honours its validator in\n // mock mode too (tests assert the throw on missing range).\n void built;\n return new Blob([[header, ...rows].join('\\n')], { type: 'text/csv' });\n}\n\n/** Tab discriminator for export. Re-exported from this module for convenience. */\nexport type { HistoryDealEntry, HistoryOrderStatus };\n","import type { $Fetch } from 'ofetch';\nimport {\n HISTORY_DEFAULTS,\n HISTORY_ENDPOINT,\n HISTORY_TAB,\n type HistoryTab,\n} from '../../common/constants/history.constant';\nimport { deepClone } from '../../common/utils/clone';\nimport {\n mockDeals,\n mockDealsSummary,\n mockExportCsv,\n mockOrders,\n mockOrdersSummary,\n mockPositions,\n mockPositionsSummary,\n} from './mock';\nimport type {\n DealHistoryItem,\n DealsSummaryResponse,\n HistoryDealsQuery,\n HistoryListResponse,\n HistoryOrdersQuery,\n HistoryPositionsQuery,\n OrderHistoryItem,\n OrdersSummaryResponse,\n PositionHistoryItem,\n PositionSummaryResponse,\n} from './history.type';\n\n/**\n * ofetch's `$Fetch` type is fixed to `R = 'json'` and forbids\n * `responseType: 'blob'` on the call site. We need the blob variant for the\n * CSV export path. The runtime accepts it without issue; we cast the option\n * object at the single call site instead of trying to widen the API surface.\n */\ntype FetchOptionsBlob = Parameters<$Fetch>[1] & { responseType: 'blob' };\n\nexport interface IHistoryServiceOptions {\n /** The CMS `$Fetch` instance (one of `sdk.apis`). */\n api: $Fetch;\n /** Lazy flag — when true, the service returns fake data. */\n mock: () => boolean;\n}\n\nexport interface IHistoryService {\n listDeals(q: HistoryDealsQuery): Promise<HistoryListResponse<DealHistoryItem>>;\n listPositions(q: HistoryPositionsQuery): Promise<HistoryListResponse<PositionHistoryItem>>;\n listOrders(q: HistoryOrdersQuery): Promise<HistoryListResponse<OrderHistoryItem>>;\n dealsSummary(q: HistoryDealsQuery): Promise<DealsSummaryResponse>;\n positionsSummary(q: HistoryPositionsQuery): Promise<PositionSummaryResponse>;\n ordersSummary(q: HistoryOrdersQuery): Promise<OrdersSummaryResponse>;\n exportCsv(\n tab: HistoryTab,\n q: HistoryDealsQuery | HistoryPositionsQuery | HistoryOrdersQuery\n ): Promise<Blob>;\n}\n\n/**\n * History service (read-only) — ClickHouse-direct deal/position/order reads\n * (`eaera_cms/history/routes.py`, doc §5.6).\n *\n * Authz is email-bound: the route resolves `Mt5Account.data.email` against\n * the JWT subject's `users.email`. Callers MAY additionally scope by\n * account via the optional `login` query param (`Mt5Account.data.login`).\n * Wire-level support lands with BE task #8531 (API ≥ v2.1); until then\n * the upstream CMS ignores the param and callers should still post-filter\n * on `login` client-side.\n *\n * Required params on every call: `fromTime`, `toTime` (ISO-8601 range). The\n * service throws on missing range — the backend would 400 anyway, and we\n * want a deterministic client error.\n *\n * While `mock()` returns true, every method resolves against the local fake\n * dataset (`./mock.ts`) and never touches `api`.\n */\nexport function createHistoryService(opts: IHistoryServiceOptions): IHistoryService {\n const { api, mock } = opts;\n\n const _assertRange = (\n q: HistoryDealsQuery | HistoryPositionsQuery | HistoryOrdersQuery\n ): void => {\n if (!q.fromTime || !q.toTime) {\n throw new Error('History: fromTime and toTime are required (doc §5.6.2)');\n }\n if (q.fromTime >= q.toTime) {\n throw new Error('History: fromTime must be strictly earlier than toTime');\n }\n };\n\n const _common = (\n q: HistoryDealsQuery | HistoryPositionsQuery | HistoryOrdersQuery\n ): Record<string, unknown> => {\n _assertRange(q);\n const out: Record<string, unknown> = {\n fromTime: q.fromTime,\n toTime: q.toTime,\n page: q.page ?? HISTORY_DEFAULTS.PAGE,\n size: q.size ?? HISTORY_DEFAULTS.SIZE,\n sortDirection: q.sortDirection ?? HISTORY_DEFAULTS.SORT_DIRECTION,\n };\n if (q.symbol !== undefined) out.symbol = q.symbol;\n if (q.sortBy !== undefined) out.sortBy = q.sortBy;\n if (q.login !== undefined) out.login = q.login;\n return out;\n };\n\n return {\n async listDeals(q) {\n if (mock()) return deepClone(mockDeals(q));\n const query = _common(q);\n if (q.entry !== undefined) query.entry = q.entry;\n if (q.action !== undefined) query.action = q.action;\n return api<HistoryListResponse<DealHistoryItem>>(HISTORY_ENDPOINT.DEALS, {\n query,\n });\n },\n\n async listPositions(q) {\n if (mock()) return deepClone(mockPositions(q));\n return api<HistoryListResponse<PositionHistoryItem>>(HISTORY_ENDPOINT.POSITIONS, {\n query: _common(q),\n });\n },\n\n async listOrders(q) {\n if (mock()) return deepClone(mockOrders(q));\n const query = _common(q);\n if (q.status !== undefined) query.status = q.status;\n return api<HistoryListResponse<OrderHistoryItem>>(HISTORY_ENDPOINT.ORDERS, {\n query,\n });\n },\n\n async dealsSummary(q) {\n if (mock()) return deepClone(mockDealsSummary(q));\n const query = _common(q);\n if (q.entry !== undefined) query.entry = q.entry;\n if (q.action !== undefined) query.action = q.action;\n return api<DealsSummaryResponse>(HISTORY_ENDPOINT.DEALS_SUMMARY, { query });\n },\n\n async positionsSummary(q) {\n if (mock()) return deepClone(mockPositionsSummary(q));\n return api<PositionSummaryResponse>(HISTORY_ENDPOINT.POSITIONS_SUMMARY, {\n query: _common(q),\n });\n },\n\n async ordersSummary(q) {\n if (mock()) return deepClone(mockOrdersSummary(q));\n const query = _common(q);\n if (q.status !== undefined) query.status = q.status;\n return api<OrdersSummaryResponse>(HISTORY_ENDPOINT.ORDERS_SUMMARY, { query });\n },\n\n async exportCsv(tab, q) {\n _assertRange(q);\n const query = _common(q);\n if (tab === HISTORY_TAB.DEALS) {\n const dq = q as HistoryDealsQuery;\n if (dq.entry !== undefined) query.entry = dq.entry;\n if (dq.action !== undefined) query.action = dq.action;\n }\n if (tab === HISTORY_TAB.ORDERS) {\n const oq = q as HistoryOrdersQuery;\n if (oq.status !== undefined) query.status = oq.status;\n }\n if (mock()) return mockExportCsv(tab, q);\n const path =\n tab === HISTORY_TAB.DEALS\n ? HISTORY_ENDPOINT.DEALS_EXPORT\n : tab === HISTORY_TAB.POSITIONS\n ? HISTORY_ENDPOINT.POSITIONS_EXPORT\n : HISTORY_ENDPOINT.ORDERS_EXPORT;\n return api(path, {\n query,\n responseType: 'blob',\n } as FetchOptionsBlob) as unknown as Promise<Blob>;\n },\n };\n}\n","/**\n * Kalshi prediction endpoints (BE pack `kalshi_api_spec_for_fe.md`).\n * Trending + symbol_ticks + last_ticks. Client history stays on `GET /api/v1/history/*`.\n */\nexport const KALSHI_ENDPOINT = {\n TRENDING: '/api/v1/kalshi/trending',\n SYMBOL_TICKS: '/api/v1/kalshi/symbol_ticks',\n LAST_TICKS: '/api/v1/kalshi/last_ticks',\n} as const;\n\n/** Defaults for `GET /api/v1/kalshi/symbol_ticks` (pack §2.8 / §2.10). */\nexport const KALSHI_SYMBOL_TICKS_DEFAULTS = {\n LIMIT: 5000,\n LIMIT_MIN: 1,\n LIMIT_MAX: 5000,\n} as const;\n\n/** Defaults for `GET /api/v1/kalshi/last_ticks` (pack §2.9). */\nexport const KALSHI_LAST_TICKS_DEFAULTS = {\n MAX_TICKERS: 100,\n} as const;\n\n/** Defaults for `GET /api/v1/kalshi/trending` (pack §2.1). Hard-capped at 8. */\nexport const KALSHI_TRENDING_DEFAULTS = {\n LIMIT: 8,\n LIMIT_MAX: 8,\n} as const;\n\n/**\n * Aggregation intervals for `GET /api/v1/kalshi/symbol_ticks` (pack §2.8).\n * Values are minutes: `1` (1min), `60` (1hour), `1440` (1day).\n */\nexport const KALSHI_CHART_INTERVAL = {\n M1: 1,\n H1: 60,\n D1: 1440,\n} as const;\n\nexport type KalshiChartInterval =\n (typeof KALSHI_CHART_INTERVAL)[keyof typeof KALSHI_CHART_INTERVAL];\n","import { KALSHI_CHART_INTERVAL } from '../../common/constants/kalshi.constant';\nimport type {\n KalshiLastTick,\n KalshiLastTicksQuery,\n KalshiLastTicksResponse,\n KalshiSymbolTickPoint,\n KalshiSymbolTicksQuery,\n KalshiSymbolTicksResponse,\n KalshiTrendingItem,\n KalshiTrendingQuery,\n KalshiTrendingResponse,\n} from './kalshi.type';\n\nconst MOCK_SERIES: KalshiSymbolTickPoint[] = [\n {\n timestampSec: 1770000000,\n yesBidCents: 51,\n yesAskCents: 53,\n lastPriceCents: 52,\n volumeContracts: 1234,\n },\n {\n timestampSec: 1770003600,\n yesBidCents: 52,\n yesAskCents: 54,\n lastPriceCents: 53,\n volumeContracts: 987,\n },\n {\n timestampSec: 1770007200,\n yesBidCents: 50,\n yesAskCents: 52,\n lastPriceCents: 51,\n volumeContracts: 1100,\n },\n];\n\nconst MOCK_TRENDING: KalshiTrendingItem[] = [\n {\n id: 101,\n uuid: 'f81d4fae-7dec-11d0-a765-00a0c91e6bf6',\n eventTicker: 'KXBTC-26DEC',\n title: 'Will Bitcoin reach $110,000 by Dec 31, 2026?',\n category: 'crypto',\n categoryBadge: 'Crypto',\n eventType: 'scalar',\n strikesCount: 12,\n spreadCents: 4,\n volumeContracts: 1250000,\n expirationTime: '2026-12-31T23:59:59Z',\n badge: 'Expiring Soon',\n representativeStrike: {\n strikeLabel: 'BTC ≥ $110,000',\n symbol: 'KS-KXBTCD-28DEC0617-T110099.99',\n yesBidCents: 44,\n yesAskCents: 46,\n },\n },\n];\n\nexport function mockTrending(query: KalshiTrendingQuery = {}): KalshiTrendingResponse {\n let items = [...MOCK_TRENDING];\n if (query.category) {\n items = items.filter((i) => i.category === query.category);\n }\n const limit = Math.min(query.limit ?? 8, 8);\n items = items.slice(0, limit);\n return { success: true, data: { items, total: items.length } };\n}\n\nexport function mockSymbolTicks(query: KalshiSymbolTicksQuery): KalshiSymbolTicksResponse {\n const limit = query.limit ?? MOCK_SERIES.length;\n const series = MOCK_SERIES.slice(0, Math.min(limit, MOCK_SERIES.length));\n const interval = typeof query.interval === 'number' ? query.interval : KALSHI_CHART_INTERVAL.H1;\n return {\n success: true,\n data: {\n symbol: query.symbol,\n marketTicker: query.symbol.replace(/^KS-/, ''),\n interval,\n fromTime: query.fromTime,\n toTime: query.toTime,\n series,\n },\n };\n}\n\nexport function mockLastTicks(query: KalshiLastTicksQuery): KalshiLastTicksResponse {\n const raw = Array.isArray(query.marketTickers)\n ? query.marketTickers\n : query.marketTickers.split(',');\n const point = MOCK_SERIES[0]!;\n const ticks: KalshiLastTick[] = [];\n const seen = new Set<string>();\n for (const part of raw) {\n const marketTicker = part.trim();\n if (!marketTicker || seen.has(marketTicker)) continue;\n seen.add(marketTicker);\n ticks.push({\n marketTicker,\n symbol: `KS-${marketTicker}`,\n serverName: query.serverName ?? 'EAERA MT5 - Live',\n timestampSec: point.timestampSec,\n yesBidCents: point.yesBidCents,\n yesAskCents: point.yesAskCents,\n lastPriceCents: point.lastPriceCents,\n volumeContracts: point.volumeContracts,\n });\n }\n return { success: true, data: { ticks } };\n}\n","import type { $Fetch } from 'ofetch';\nimport {\n KALSHI_ENDPOINT,\n KALSHI_LAST_TICKS_DEFAULTS,\n KALSHI_SYMBOL_TICKS_DEFAULTS,\n KALSHI_TRENDING_DEFAULTS,\n} from '../../common/constants/kalshi.constant';\nimport { MT5_SERVER_NAME } from '../../common/constants/mt5.constant';\nimport { mockLastTicks, mockSymbolTicks, mockTrending } from './mock';\nimport type {\n KalshiLastTicksQuery,\n KalshiLastTicksResponse,\n KalshiSymbolTicksQuery,\n KalshiSymbolTicksResponse,\n KalshiTrendingQuery,\n KalshiTrendingResponse,\n} from './kalshi.type';\n\nexport interface IKalshiServiceOptions {\n api: $Fetch;\n mock: () => boolean;\n}\n\nexport interface IKalshiService {\n getTrending(query?: KalshiTrendingQuery): Promise<KalshiTrendingResponse>;\n getSymbolTicks(query: KalshiSymbolTicksQuery): Promise<KalshiSymbolTicksResponse>;\n getLastTicks(query: KalshiLastTicksQuery): Promise<KalshiLastTicksResponse>;\n}\n\nfunction normalizeMarketTickers(input: string[] | string): string[] {\n const raw = Array.isArray(input) ? input : input.split(',');\n const seen = new Set<string>();\n const out: string[] = [];\n for (const part of raw) {\n const ticker = part.trim();\n if (!ticker || seen.has(ticker)) continue;\n seen.add(ticker);\n out.push(ticker);\n if (out.length >= KALSHI_LAST_TICKS_DEFAULTS.MAX_TICKERS) break;\n }\n return out;\n}\n\n/**\n * Kalshi prediction HTTP service (BE pack).\n * - `GET /api/v1/kalshi/trending` — Hot Widget\n * - `GET /api/v1/kalshi/symbol_ticks` — line chart (public-read)\n * - `GET /api/v1/kalshi/last_ticks` — batch latest YES bid/ask (public-read)\n */\nexport function createKalshiService(opts: IKalshiServiceOptions): IKalshiService {\n const { api, mock } = opts;\n\n return {\n async getTrending(query: KalshiTrendingQuery = {}): Promise<KalshiTrendingResponse> {\n if (mock()) return mockTrending(query);\n\n const rawLimit = query.limit ?? KALSHI_TRENDING_DEFAULTS.LIMIT;\n const apiQuery: Record<string, unknown> = {\n limit: Math.min(Math.max(rawLimit, 1), KALSHI_TRENDING_DEFAULTS.LIMIT_MAX),\n };\n if (query.category !== undefined) apiQuery.category = query.category;\n\n return api<KalshiTrendingResponse>(KALSHI_ENDPOINT.TRENDING, { query: apiQuery });\n },\n\n async getSymbolTicks(query: KalshiSymbolTicksQuery): Promise<KalshiSymbolTicksResponse> {\n if (mock()) return mockSymbolTicks(query);\n\n const apiQuery: Record<string, unknown> = {\n symbol: query.symbol,\n interval: query.interval,\n fromTime: query.fromTime,\n toTime: query.toTime,\n serverName: query.serverName ?? MT5_SERVER_NAME,\n };\n if (query.limit !== undefined) {\n apiQuery.limit = Math.min(\n Math.max(query.limit, KALSHI_SYMBOL_TICKS_DEFAULTS.LIMIT_MIN),\n KALSHI_SYMBOL_TICKS_DEFAULTS.LIMIT_MAX\n );\n }\n\n return api<KalshiSymbolTicksResponse>(KALSHI_ENDPOINT.SYMBOL_TICKS, { query: apiQuery });\n },\n\n async getLastTicks(query: KalshiLastTicksQuery): Promise<KalshiLastTicksResponse> {\n if (mock()) return mockLastTicks(query);\n\n const tickers = normalizeMarketTickers(query.marketTickers);\n if (!tickers.length) {\n throw new Error('getLastTicks: marketTickers is required (1–100 tickers)');\n }\n\n const apiQuery: Record<string, unknown> = {\n // Pack §2.9 documents snake_case query keys.\n market_tickers: tickers.join(','),\n };\n if (query.serverName !== undefined) apiQuery.server_name = query.serverName;\n\n return api<KalshiLastTicksResponse>(KALSHI_ENDPOINT.LAST_TICKS, { query: apiQuery });\n },\n };\n}\n","/**\n * LLM prompt-template endpoints (`eaera_cms/llm/routes.py`). Prompt templates\n * back the dashboard \"Skill\" page (FEAT-002) and are referenced from an\n * `llm_agent` rule via `trigger.sourceConfig.promptName`.\n *\n * NOTE: the generic content endpoint is **not** used for prompts — the CMS\n * retired that path (LT-13). Use these `/llm/prompts` routes.\n */\nexport const LLM_ENDPOINT = {\n /** GET/POST /api/v1/llm/prompts — list / create prompt templates. */\n collection: '/api/v1/llm/prompts',\n /** GET/PUT/DELETE /api/v1/llm/prompts/{name}. */\n detail: (name: string): string => `/api/v1/llm/prompts/${encodeURIComponent(name)}`,\n\n // ── LLM providers (`eaera_cms/llm/routes.py`) ──\n /** GET/POST /api/v1/llm/providers — list / register providers. */\n providers: '/api/v1/llm/providers',\n /**\n * GET/PUT/DELETE /api/v1/llm/providers/{name}/models — supported models +\n * health (GET); provider update (PUT) / unregister (DELETE) share the same\n * path on the backend.\n */\n providerModels: (name: string): string =>\n `/api/v1/llm/providers/${encodeURIComponent(name)}/models`,\n} as const;\n\n/**\n * Backend-supported LLM provider types (`eaera_cms/llm/`). Mirrors the\n * SDK `LlmProviderType` type in `cms-sdk/.../llm/llm.type.ts` — use the\n * constant when you need the bare string in mock data, dropdown options,\n * or guards.\n */\nexport const LLM_PROVIDER_TYPE = {\n OPENAI: 'openai',\n ANTHROPIC: 'anthropic',\n GOOGLE: 'google',\n OLLAMA: 'ollama',\n AZURE: 'azure',\n} as const;\nexport type LlmProviderType = (typeof LLM_PROVIDER_TYPE)[keyof typeof LLM_PROVIDER_TYPE];\n","import type { $Fetch } from 'ofetch';\nimport { LLM_ENDPOINT, LLM_PROVIDER_TYPE } from '../../common/constants/llm.constant';\nimport type {\n LlmProvider,\n LlmProviderCreatePayload,\n LlmProviderListResponse,\n LlmProviderModelsResponse,\n LlmProviderUpdatePayload,\n PromptCreatePayload,\n PromptListResponse,\n PromptMutationResponse,\n PromptTemplate,\n PromptUpdatePayload,\n} from './llm.type';\n\nexport interface ILlmServiceOptions {\n /** The CMS `$Fetch` instance (one of `sdk.apis`). */\n api: $Fetch;\n /** Lazy flag — when true, the service returns fake data. */\n mock: () => boolean;\n}\n\nexport interface ILlmService {\n listPrompts(): Promise<PromptTemplate[]>;\n getPrompt(name: string): Promise<PromptTemplate>;\n createPrompt(payload: PromptCreatePayload): Promise<PromptMutationResponse>;\n updatePrompt(name: string, payload: PromptUpdatePayload): Promise<PromptMutationResponse>;\n deletePrompt(name: string): Promise<void>;\n // ── providers ──\n listProviders(): Promise<LlmProvider[]>;\n registerProvider(payload: LlmProviderCreatePayload): Promise<LlmProvider>;\n updateProvider(name: string, payload: LlmProviderUpdatePayload): Promise<LlmProvider>;\n deleteProvider(name: string): Promise<void>;\n listProviderModels(name: string): Promise<LlmProviderModelsResponse>;\n}\n\n/**\n * LLM prompt-template service — backs the dashboard \"Skill\" page (FEAT-002).\n *\n * Endpoint contract (`eaera_cms/llm/routes.py`):\n * GET /api/v1/llm/prompts → { templates: PromptTemplate[] }\n * POST /api/v1/llm/prompts → { id, name, version }\n * GET /api/v1/llm/prompts/{name} → PromptTemplate (incl. content/systemPrompt)\n * PUT /api/v1/llm/prompts/{name} → { id, name, version }\n * DELETE /api/v1/llm/prompts/{name} → { status, name }\n *\n * The list response omits `content` / `systemPrompt`; call `getPrompt(name)`\n * to load those for the editor. Prompts are keyed by **name**.\n *\n * While `mock()` returns true, all methods resolve against a local fake dataset\n * and never touch `api`.\n */\nexport function createLlmService(opts: ILlmServiceOptions): ILlmService {\n const { api, mock } = opts;\n\n return {\n async listPrompts(): Promise<PromptTemplate[]> {\n if (mock()) return _mockList();\n const res = await api<PromptListResponse>(LLM_ENDPOINT.collection);\n return res?.templates ?? [];\n },\n\n async getPrompt(name: string): Promise<PromptTemplate> {\n if (mock()) return _mockGet(name);\n return api<PromptTemplate>(LLM_ENDPOINT.detail(name));\n },\n\n async createPrompt(payload: PromptCreatePayload): Promise<PromptMutationResponse> {\n if (mock()) return _mockCreate(payload);\n return api<PromptMutationResponse>(LLM_ENDPOINT.collection, {\n method: 'POST',\n body: payload,\n });\n },\n\n async updatePrompt(\n name: string,\n payload: PromptUpdatePayload\n ): Promise<PromptMutationResponse> {\n if (mock()) return _mockUpdate(name, payload);\n return api<PromptMutationResponse>(LLM_ENDPOINT.detail(name), {\n method: 'PUT',\n body: payload,\n });\n },\n\n async deletePrompt(name: string): Promise<void> {\n if (mock()) {\n _mockDelete(name);\n return;\n }\n await api(LLM_ENDPOINT.detail(name), { method: 'DELETE' });\n },\n\n async listProviders(): Promise<LlmProvider[]> {\n if (mock()) return _mockListProviders();\n const res = await api<LlmProviderListResponse>(LLM_ENDPOINT.providers);\n return res?.providers ?? [];\n },\n\n async registerProvider(payload: LlmProviderCreatePayload): Promise<LlmProvider> {\n if (mock()) return _mockRegisterProvider(payload);\n return api<LlmProvider>(LLM_ENDPOINT.providers, { method: 'POST', body: payload });\n },\n\n async updateProvider(name: string, payload: LlmProviderUpdatePayload): Promise<LlmProvider> {\n if (mock()) return _mockUpdateProvider(name, payload);\n return api<LlmProvider>(LLM_ENDPOINT.providerModels(name), {\n method: 'PUT',\n body: payload,\n });\n },\n\n async deleteProvider(name: string): Promise<void> {\n if (mock()) {\n _mockDeleteProvider(name);\n return;\n }\n await api(LLM_ENDPOINT.providerModels(name), { method: 'DELETE' });\n },\n\n async listProviderModels(name: string): Promise<LlmProviderModelsResponse> {\n if (mock()) return _mockProviderModels(name);\n return api<LlmProviderModelsResponse>(LLM_ENDPOINT.providerModels(name));\n },\n };\n}\n\n// ─── mock dataset (dev-only) ────────────────────────────────────────────────\n\nconst _MOCK_PROMPTS: PromptTemplate[] = [\n {\n id: 'mock-martingale',\n name: 'Martingale Detector',\n version: '1',\n description: 'Flags suspicious martingale behaviour.',\n model: 'gpt-4o-mini',\n variables: [],\n content: 'Decide whether the account shows a martingale pattern.',\n systemPrompt: 'You are a risk analyst.',\n },\n];\n\nfunction _mockList(): PromptTemplate[] {\n // List omits content/systemPrompt (matches the real backend).\n return _MOCK_PROMPTS.map(({ content: _c, systemPrompt: _s, ...rest }) => rest);\n}\nfunction _mockGet(name: string): PromptTemplate {\n return _MOCK_PROMPTS.find((p) => p.name === name) ?? _MOCK_PROMPTS[0];\n}\nfunction _mockCreate(payload: PromptCreatePayload): PromptMutationResponse {\n return { id: `mock-${payload.name}`, name: payload.name, version: '1' };\n}\nfunction _mockUpdate(name: string, _payload: PromptUpdatePayload): PromptMutationResponse {\n return { id: `mock-${name}`, name, version: '1' };\n}\nfunction _mockDelete(_name: string): void {\n /* no-op */\n}\n\n// ─── mock provider dataset (dev-only) ───────────────────────────────────────\n\nconst _MOCK_PROVIDERS: LlmProvider[] = [\n {\n name: 'openai-default',\n providerType: LLM_PROVIDER_TYPE.OPENAI,\n baseUrl: 'https://api.example-llm.test/v1',\n models: ['mimo-v2.5-pro', 'mimo-v2.5'],\n config: { timeout: 180 },\n isEnabled: true,\n isHealthy: true,\n },\n];\n\nfunction _mockListProviders(): LlmProvider[] {\n return _MOCK_PROVIDERS.map((p) => ({ ...p }));\n}\n\nfunction _mockRegisterProvider(payload: LlmProviderCreatePayload): LlmProvider {\n return {\n name: payload.name,\n providerType: payload.providerType,\n baseUrl: payload.baseUrl,\n models: payload.models ?? [],\n config: payload.config,\n isEnabled: payload.isEnabled ?? true,\n isHealthy: true,\n };\n}\n\nfunction _mockUpdateProvider(name: string, _payload: LlmProviderUpdatePayload): LlmProvider {\n return (\n _MOCK_PROVIDERS.find((p) => p.name === name) ??\n _mockRegisterProvider({ name, providerType: LLM_PROVIDER_TYPE.OPENAI })\n );\n}\n\nfunction _mockDeleteProvider(_name: string): void {\n /* no-op */\n}\n\nfunction _mockProviderModels(name: string): LlmProviderModelsResponse {\n const provider = _MOCK_PROVIDERS.find((p) => p.name === name);\n return { models: provider?.models ?? [], healthy: provider?.isHealthy ?? false };\n}\n","/**\n * Notification-template + report-template endpoints (CMS engine-owned).\n *\n * Source of truth: People api_references §7.3 (FEAT-012 — the pack only\n * seeds artifacts; CMS materializes and serves them). Writes require\n * `notify:templates:manage` (catalog published + role assigned, engine E14).\n */\n\n/** Notification-template lifecycle routes. */\nexport const NOTIFICATIONS_ENDPOINT = {\n /** `GET/POST /api/v1/notifications/templates` — list versions / create draft. */\n TEMPLATES: '/api/v1/notifications/templates',\n /** `GET/PUT/DELETE /api/v1/notifications/templates/{template_id}` — one version\n * (PUT draft only — enabled/archived return 409; DELETE = soft-archive). */\n template: (templateId: string | number): string =>\n `/api/v1/notifications/templates/${templateId}`,\n /** `GET /api/v1/notifications/templates/{name}/versions?locale=` — history. */\n templateVersions: (name: string): string => `/api/v1/notifications/templates/${name}/versions`,\n /** `POST /api/v1/notifications/templates/{template_id}/publish` — enable draft\n * + archive the previously enabled version. */\n templatePublish: (templateId: string | number): string =>\n `/api/v1/notifications/templates/${templateId}/publish`,\n /** `POST /api/v1/notifications/templates/render` — ad-hoc Mustache preview. */\n RENDER: '/api/v1/notifications/templates/render',\n} as const;\n\n/** Report-template routes (engine CRUD; People seed is pack-managed — read-only for the portal). */\nexport const REPORT_TEMPLATES_ENDPOINT = {\n BASE: '/api/v1/report-templates',\n detail: (templateId: string | number): string => `/api/v1/report-templates/${templateId}`,\n preview: (templateId: string | number): string =>\n `/api/v1/report-templates/${templateId}/preview`,\n} as const;\n\n/** `fallback_policy` — how rendering handles a missing locale variant\n * (resolved per recipient: `<name>.<audience>` + locale → base → company\n * default per the persisted policy; never send a wrong-language silently). */\nexport const NOTIFICATION_FALLBACK_POLICY = {\n FALLBACK: 'fallback',\n FALLBACK_WARN: 'fallback+warn',\n BLOCK: 'block',\n} as const;\nexport type NotificationFallbackPolicy =\n (typeof NOTIFICATION_FALLBACK_POLICY)[keyof typeof NOTIFICATION_FALLBACK_POLICY];\n\n/** Template-version states — PUT is draft-only; enabled/archived ⇒ 409. */\nexport const NOTIFICATION_TEMPLATE_STATE = {\n DRAFT: 'draft',\n ENABLED: 'enabled',\n ARCHIVED: 'archived',\n} as const;\nexport type NotificationTemplateState =\n (typeof NOTIFICATION_TEMPLATE_STATE)[keyof typeof NOTIFICATION_TEMPLATE_STATE];\n","/**\n * Notifications domain — mock dataset (FEAT-012, engine-owned backend).\n *\n * Mirrors the People pack seeds (`people.welcome` vi/en,\n * `people.access-review` vi) plus one enabled row so the draft → publish →\n * archive lifecycle round-trips in-memory while `mock()` returns true.\n */\n\nimport { deepClone } from '../../common/utils/clone';\nimport type { NotificationTemplateVersion, ReportTemplate } from './notifications.type';\n\nlet _nextId = 4;\n\nconst _rows: NotificationTemplateVersion[] = [\n {\n id: 1,\n name: 'people.welcome',\n locale: 'vi',\n subject: 'Chào mừng bạn gia nhập {{company_name}}',\n body: 'Chào {{person_name}}, ...',\n category: 'workflow',\n fallbackPolicy: 'fallback+warn',\n state: 'enabled',\n },\n {\n id: 2,\n name: 'people.welcome',\n locale: 'en',\n subject: 'Welcome to {{company_name}}',\n body: 'Hi {{person_name}}, ...',\n category: 'workflow',\n fallbackPolicy: 'fallback+warn',\n state: 'enabled',\n },\n {\n id: 3,\n name: 'people.access-review',\n locale: 'vi',\n subject: 'Kiểm soát quyền truy cập — {{cycle_label}}',\n body: 'Xin chào {{manager_name}}, ...',\n category: 'workflow',\n fallbackPolicy: 'fallback',\n state: 'enabled',\n },\n];\n\nconst _reportRows: ReportTemplate[] = [\n { id: 'people.access-review-report', name: 'people.access-review-report' },\n];\n\nexport function mockNotificationList(query: {\n name?: string;\n locale?: string;\n state?: string;\n category?: string;\n limit?: number;\n offset?: number;\n}): { items: NotificationTemplateVersion[]; total: number } {\n let rows = _rows;\n if (query.name) rows = rows.filter((t) => t.name === query.name);\n if (query.locale) rows = rows.filter((t) => t.locale === query.locale);\n if (query.state) rows = rows.filter((t) => t.state === query.state);\n if (query.category) rows = rows.filter((t) => t.category === query.category);\n const offset = query.offset ?? 0;\n const limit = query.limit ?? rows.length;\n return { items: rows.slice(offset, offset + limit).map(deepClone), total: rows.length };\n}\n\nexport function mockNotificationGet(id: string | number): NotificationTemplateVersion | undefined {\n const row = _rows.find((t) => String(t.id) === String(id));\n return row ? deepClone(row) : undefined;\n}\n\nexport function mockNotificationVersions(\n name: string,\n locale?: string\n): NotificationTemplateVersion[] {\n return mockNotificationList({ name, locale }).items;\n}\n\nexport function mockNotificationCreate(payload: {\n name: string;\n locale: string;\n subject?: string;\n body: string;\n category?: string;\n fallbackPolicy?: string;\n}): NotificationTemplateVersion {\n const row: NotificationTemplateVersion = {\n id: _nextId++,\n name: payload.name,\n locale: payload.locale,\n subject: payload.subject ?? '',\n body: payload.body,\n category: payload.category,\n fallbackPolicy: payload.fallbackPolicy as NotificationTemplateVersion['fallbackPolicy'],\n state: 'draft',\n };\n _rows.push(row);\n return deepClone(row);\n}\n\nexport function mockNotificationUpdate(\n id: string | number,\n patch: Record<string, unknown>\n): NotificationTemplateVersion | { conflict: true } {\n const row = _rows.find((t) => String(t.id) === String(id));\n if (!row) return { conflict: true };\n if (row.state !== 'draft') return { conflict: true }; // 409 — draft only\n Object.assign(row, patch);\n return deepClone(row);\n}\n\nexport function mockNotificationPublish(\n id: string | number\n): NotificationTemplateVersion | { conflict: true } {\n const row = _rows.find((t) => String(t.id) === String(id));\n if (!row || row.state !== 'draft') return { conflict: true };\n // Archive the previously enabled version of the same (name, locale).\n for (const other of _rows) {\n if (\n other !== row &&\n other.name === row.name &&\n other.locale === row.locale &&\n other.state === 'enabled'\n ) {\n other.state = 'archived';\n }\n }\n row.state = 'enabled';\n return deepClone(row);\n}\n\nexport function mockNotificationArchive(id: string | number): boolean {\n const row = _rows.find((t) => String(t.id) === String(id));\n if (!row) return false;\n row.state = 'archived';\n return true;\n}\n\nexport function mockRender(\n templateStr: string,\n context: Record<string, unknown>\n): { subject?: string; body: string } {\n const render = (tpl: string): string =>\n tpl.replace(/\\{\\{\\s*([\\w.]+)\\s*\\}\\}/g, (_, key: string) => String(context[key] ?? ''));\n return { body: render(templateStr) };\n}\n\nexport function mockReportTemplates(): { items: ReportTemplate[]; total: number } {\n return { items: _reportRows.map(deepClone), total: _reportRows.length };\n}\n\nexport function mockReportTemplate(id: string | number): ReportTemplate | undefined {\n const row = _reportRows.find((t) => String(t.id) === String(id));\n return row ? deepClone(row) : undefined;\n}\n","/**\n * Notifications service — FEAT-012 template lifecycle (engine-owned).\n *\n * Endpoint contract (People api_references §7.3 — the People pack only seeds\n * artifacts; CMS materializes and serves them):\n * GET /api/v1/notifications/templates?name=&locale=&state=&category=&limit=&offset=\n * POST /api/v1/notifications/templates (create Mustache draft)\n * GET /api/v1/notifications/templates/{template_id}\n * GET /api/v1/notifications/templates/{name}/versions?locale=\n * PUT /api/v1/notifications/templates/{template_id} (draft only — 409 otherwise)\n * POST /api/v1/notifications/templates/{template_id}/publish (enable + archive previous)\n * DELETE /api/v1/notifications/templates/{template_id} (soft-archive)\n * POST /api/v1/notifications/templates/render (ad-hoc preview)\n * GET /api/v1/report-templates/ · /{template_id} · POST /{template_id}/preview\n *\n * Writes require `notify:templates:manage` (catalog published + `people_admin`\n * assigned — engine E14 runtime). The People report seed is pack-managed —\n * read/preview only, never edit through this lane.\n *\n * While `mock()` returns true, all methods resolve against the local fake\n * dataset and never touch `api`.\n */\n\nimport type { $Fetch } from 'ofetch';\nimport {\n NOTIFICATIONS_ENDPOINT,\n REPORT_TEMPLATES_ENDPOINT,\n} from '../../common/constants/notifications.constant';\nimport {\n mockNotificationArchive,\n mockNotificationCreate,\n mockNotificationGet,\n mockNotificationList,\n mockNotificationPublish,\n mockNotificationUpdate,\n mockNotificationVersions,\n mockRender,\n mockReportTemplate,\n mockReportTemplates,\n} from './mock';\nimport type {\n NotificationRenderPayload,\n NotificationRenderResult,\n NotificationTemplateCreatePayload,\n NotificationTemplateListQuery,\n NotificationTemplateListResponse,\n NotificationTemplateUpdatePayload,\n NotificationTemplateVersion,\n ReportTemplate,\n ReportTemplatePreviewPayload,\n} from './notifications.type';\n\nexport interface INotificationsServiceOptions {\n /** The CMS `$Fetch` instance (one of `sdk.apis`). */\n api: $Fetch;\n /** Lazy flag — when true, the service returns fake data. */\n mock: () => boolean;\n}\n\nexport interface INotificationsService {\n /** List template versions — every query field is a filter (offset/limit paging). */\n list(query?: NotificationTemplateListQuery): Promise<NotificationTemplateListResponse>;\n /** Read one version by `{template_id}`. */\n get(templateId: string | number): Promise<NotificationTemplateVersion>;\n /** Version history for a name (+ locale variant). */\n versionsOf(name: string, locale?: string): Promise<NotificationTemplateVersion[]>;\n /** Create a Mustache draft (`notify:templates:manage`). */\n createDraft(payload: NotificationTemplateCreatePayload): Promise<NotificationTemplateVersion>;\n /** Edit a DRAFT only — enabled/archived return `409`; create a same-name/locale\n * draft for the next version instead. */\n updateDraft(\n templateId: string | number,\n payload: NotificationTemplateUpdatePayload\n ): Promise<NotificationTemplateVersion>;\n /** Enable a draft + archive the previously enabled version of the variant. */\n publish(templateId: string | number): Promise<NotificationTemplateVersion>;\n /** Soft-archive a version — audit history remains. */\n archive(templateId: string | number): Promise<void>;\n /** Ad-hoc Mustache preview — `{templateStr, context}`; no persistence. */\n render(payload: NotificationRenderPayload): Promise<NotificationRenderResult>;\n /** List report templates (People seed: `people.access-review-report`). */\n listReportTemplates(): Promise<{ items: ReportTemplate[]; total: number }>;\n /** Read one report definition. */\n getReportTemplate(templateId: string | number): Promise<ReportTemplate>;\n /** Preview a report definition with sample data (read-only lane). */\n previewReportTemplate(\n templateId: string | number,\n payload: ReportTemplatePreviewPayload\n ): Promise<unknown>;\n}\n\nexport function createNotificationsService(\n opts: INotificationsServiceOptions\n): INotificationsService {\n const { api, mock } = opts;\n\n const wireQuery = (query: NotificationTemplateListQuery = {}): Record<string, unknown> => {\n const q: Record<string, unknown> = {};\n if (query.name) q.name = query.name;\n if (query.namePrefix) q.name_prefix = query.namePrefix;\n if (query.locale) q.locale = query.locale;\n if (query.state) q.state = query.state;\n if (query.category) q.category = query.category;\n if (query.page != null) q.page = query.page;\n if (query.perPage != null) q.per_page = query.perPage;\n return q;\n };\n\n return {\n async list(query = {}) {\n if (mock()) return mockNotificationList(query);\n return api<NotificationTemplateListResponse>(NOTIFICATIONS_ENDPOINT.TEMPLATES, {\n query: wireQuery(query),\n });\n },\n\n async get(templateId) {\n if (mock()) return _mustMock(mockNotificationGet(templateId), templateId);\n return api<NotificationTemplateVersion>(NOTIFICATIONS_ENDPOINT.template(templateId));\n },\n\n async versionsOf(name, locale) {\n if (mock()) return mockNotificationVersions(name, locale);\n const res = await api<NotificationTemplateListResponse>(\n NOTIFICATIONS_ENDPOINT.templateVersions(name),\n { query: locale ? { locale } : undefined }\n );\n return res.items ?? [];\n },\n\n async createDraft(payload) {\n if (mock()) return mockNotificationCreate(payload);\n return api<NotificationTemplateVersion>(NOTIFICATIONS_ENDPOINT.TEMPLATES, {\n method: 'POST',\n body: payload,\n });\n },\n\n async updateDraft(templateId, payload) {\n if (mock()) {\n const row = mockNotificationUpdate(templateId, payload as Record<string, unknown>);\n if ('conflict' in row) throw _conflict(`Template ${templateId} is not a draft`);\n return row;\n }\n return api<NotificationTemplateVersion>(NOTIFICATIONS_ENDPOINT.template(templateId), {\n method: 'PUT',\n body: payload,\n });\n },\n\n async publish(templateId) {\n if (mock()) {\n const row = mockNotificationPublish(templateId);\n if ('conflict' in row) throw _conflict(`Template ${templateId} is not publishable`);\n return row;\n }\n return api<NotificationTemplateVersion>(NOTIFICATIONS_ENDPOINT.templatePublish(templateId), {\n method: 'POST',\n });\n },\n\n async archive(templateId) {\n if (mock()) {\n if (!mockNotificationArchive(templateId)) throw _notFound(`Template ${templateId}`);\n return;\n }\n await api(NOTIFICATIONS_ENDPOINT.template(templateId), { method: 'DELETE' });\n },\n\n async render(payload) {\n if (mock()) return mockRender(payload.templateStr, payload.context);\n return api<NotificationRenderResult>(NOTIFICATIONS_ENDPOINT.RENDER, {\n method: 'POST',\n body: payload,\n });\n },\n\n async listReportTemplates() {\n if (mock()) return mockReportTemplates();\n return api<{ items: ReportTemplate[]; total: number }>(REPORT_TEMPLATES_ENDPOINT.BASE);\n },\n\n async getReportTemplate(templateId) {\n if (mock()) {\n const row = mockReportTemplate(templateId);\n if (!row) throw _notFound(`Report template ${templateId}`);\n return row;\n }\n return api<ReportTemplate>(REPORT_TEMPLATES_ENDPOINT.detail(templateId));\n },\n\n async previewReportTemplate(templateId, payload) {\n if (mock()) return { preview: true };\n return api<unknown>(REPORT_TEMPLATES_ENDPOINT.preview(templateId), {\n method: 'POST',\n body: payload,\n });\n },\n };\n}\n\n/* ----------------------------- file-private helpers ----------------------------- */\n\nfunction _mustMock<T>(row: T | undefined, id: string | number): T {\n if (!row) throw _notFound(`Template ${id}`);\n return row;\n}\n\nfunction _notFound(message: string): Error {\n const e = new Error(message);\n (e as Error & { statusCode?: number }).statusCode = 404;\n return e;\n}\n\nfunction _conflict(message: string): Error {\n const e = new Error(message);\n (e as Error & { statusCode?: number }).statusCode = 409;\n return e;\n}\n","/**\n * People Hub pack (`eaera-people`) — content types, action names, and the\n * portal REST endpoints mounted by the engine.\n *\n * Source of truth:\n * `eaera-docs/company-os/eaera-people/architecture/ct-schema-registry.md` (CT\n * contracts) and `eaera-docs/company-os/eaera-people/be-docs/api_references.md`\n * (endpoint + action contract).\n */\n\nimport { CONTENT_ENDPOINT } from './content.constant';\n\n/** Pack id used with `content.fetchByType({ packId })`. Single source of truth\n * so the stores and services never drift. */\nexport const PEOPLE_PACK_ID = 'eaera-people';\n\n/**\n * Content Type names registered by the People pack. Wire names match the\n * `name:` field of each `pack/cts/*.yaml` verbatim (snake_case — the unified\n * 2026-09-09 rename, drift D-7). All 27 CTs are IMPLEMENTED (registry §3).\n */\nexport const PEOPLE_CONTENT_TYPE = {\n /* FEAT-001 — Company & Legal Entity (registry §3.1–§3.6) */\n LEGAL_ENTITY: 'legal_entity',\n REGISTERED_BRANCH: 'registered_branch',\n EFFECTIVE_REVISION: 'effective_revision',\n CLOSURE_CASE: 'closure_case',\n POLICY_ASSIGNMENT: 'policy_assignment',\n /** FEAT-011 registry handle — two faces, one artifact (registry §3.6). */\n POLICY: 'policy',\n\n /* FEAT-007 — Role / Permission / Data-Scope Catalog (registry §3.7–§3.8) */\n CATALOG_REVISION: 'catalog_revision',\n SCOPE_EXCEPTION: 'scope_exception',\n\n /* FEAT-009 — Identity Provisioning & Provider Sync (registry §3.9–§3.13) */\n PROVIDER_CONFIG: 'provider_config',\n PROVISIONING_ITEM: 'provisioning_item',\n EXTERNAL_BINDING: 'external_binding',\n DRIFT_FINDING: 'drift_finding',\n DEPROVISION_PLAN: 'deprovision_plan',\n\n /* FEAT-002 — Organization Structure (registry §3.14–§3.17) */\n ORG_UNIT: 'org_unit',\n POSITION: 'position',\n WORK_LOCATION: 'work_location',\n UNIT_TYPE: 'unit_type',\n WORK_LOCATION_TYPE: 'work_location_type',\n ORG_CHANGE_SET: 'org_change_set',\n\n /* FEAT-008 — Role Assignment Management (registry §3.21–§3.23) */\n ROLE_ASSIGNMENT: 'role_assignment',\n ASSIGNMENT_RULE: 'assignment_rule',\n ACCESS_REVIEW_CAMPAIGN: 'access_review_campaign',\n\n /* FEAT-010 — Request Engine (registry §3.19–§3.20) */\n REQUEST_TYPE: 'request_type',\n REGISTERED_CAPABILITY: 'registered_capability',\n\n /* FEAT-011 — Policy & Automation (registry §3.24) */\n GLUE_RULE: 'glue_rule',\n\n /* FEAT-014 — Process Container (registry §3.25–§3.26) */\n PROCESS_TYPE: 'process_type',\n PROCESS_INSTANCE: 'process_instance',\n} as const;\n\nexport type PeopleContentTypeName = (typeof PEOPLE_CONTENT_TYPE)[keyof typeof PEOPLE_CONTENT_TYPE];\n\nexport const PEOPLE_CONTENT_TYPE_NAMES: readonly PeopleContentTypeName[] = Object.freeze(\n Object.values(PEOPLE_CONTENT_TYPE) as PeopleContentTypeName[]\n);\n\n/**\n * `effective_revision.subjectKind` enum — registry §3.3.\n * Not all values are content-type names (the `*-type-config` ones are\n * per-LE configuration rows addressed through the same effective_revision\n * CT). This constant exists so callers routing through `PEOPLE_ACTION_BY_CT`\n * or filtering revisions don't reinvent the closed union.\n */\nexport const PEOPLE_SUBJECT_KIND = {\n LEGAL_ENTITY: 'legal_entity',\n REGISTERED_BRANCH: 'registered_branch',\n ORG_UNIT: 'org_unit',\n POSITION: 'position',\n WORK_LOCATION: 'work_location',\n UNIT_TYPE_CONFIG: 'unit_type_config',\n LOCATION_TYPE_CONFIG: 'location_type_config',\n} as const;\nexport type PeopleSubjectKind = (typeof PEOPLE_SUBJECT_KIND)[keyof typeof PEOPLE_SUBJECT_KIND];\n\n/**\n * `closure_case.targetType` / `policy_assignment.targetType` discriminators\n * — registry §3.4, §3.5.\n */\nexport const PEOPLE_TARGET_TYPE = {\n LEGAL_ENTITY: 'legal_entity',\n REGISTERED_BRANCH: 'registered_branch',\n} as const;\nexport type PeopleTargetType = (typeof PEOPLE_TARGET_TYPE)[keyof typeof PEOPLE_TARGET_TYPE];\n\n/**\n * Pack-mounted REST projections mounted by the engine from the pack's\n * `routers:` block (`be-docs/api_references.md` §6). 7 of the 9 owned\n * endpoints ship as routers today (access audit, provider health,\n * provisioning queue + the 4 FEAT-015 pack-ops reads); the 2 FEAT-016\n * copilot endpoints ship too but stay untyped here until their SDK cycle.\n *\n * Plain lists (legal_entity, registered_branch, org_unit, etc.) have NO\n * dedicated endpoint — they go through the generic content API\n * (`useContentStore.fetchByType` with the `PEOPLE_CONTENT_TYPE` names).\n */\nexport const PEOPLE_ENDPOINT = {\n /** `GET /api/v1/people/access/audit` — compliance Q-A/Q-B projection. */\n ACCESS_AUDIT: '/api/v1/people/access/audit',\n /** `GET /api/v1/people/providers/{key}/health` — path segment = business key. */\n providerHealth: (key: string): string => `/api/v1/people/providers/${key}/health`,\n /** `GET /api/v1/people/provisioning/queue` — heterogeneous, server-priority. */\n PROVISIONING_QUEUE: '/api/v1/people/provisioning/queue',\n /* ── FEAT-015 pack-ops read projections (api_references §6.4) ── */\n /** `GET /api/v1/people/pack-ops/registry` — CMS pack list + template catalog. */\n PACK_OPS_REGISTRY: '/api/v1/people/pack-ops/registry',\n /** `GET /api/v1/people/pack-ops/preflight?slug=&source=&ref=`. */\n PACK_OPS_PREFLIGHT: '/api/v1/people/pack-ops/preflight',\n /** `GET /api/v1/people/pack-ops/{slug}/upgrade-check`. */\n packOpsUpgradeCheck: (slug: string): string =>\n `/api/v1/people/pack-ops/${encodeURIComponent(slug)}/upgrade-check`,\n /** `GET /api/v1/people/pack-ops/{slug}/impact?ref=`. */\n packOpsImpact: (slug: string): string =>\n `/api/v1/people/pack-ops/${encodeURIComponent(slug)}/impact`,\n /** Re-use the engine's generic content-action route (like `GOV_ENDPOINT`). */\n action: CONTENT_ENDPOINT.action,\n /* ── engine pack API (FEAT-015 mutation authority + audit) ── */\n /** `/api/v1/packs` — install/rollback/PUT/DELETE live here (§6.4). */\n PACKS: '/api/v1/packs',\n /** `/api/v1/packs/audit-log` — pack transition trail (US7). */\n PACKS_AUDIT: '/api/v1/packs/audit-log',\n} as const;\n\n/** Bare `/api/v1/packs` prefix (kept for path building in packops service). */\nexport const PACKS_ENDPOINT = PEOPLE_ENDPOINT.PACKS;\nexport const PACKS_AUDIT_ENDPOINT = PEOPLE_ENDPOINT.PACKS_AUDIT;\n\n/**\n * The 53 pack actions the user-callable surface exposes today\n * (`api_references.md` §3.3 matrix). System-only actions live in\n * {@link PEOPLE_SYSTEM_ONLY_ACTIONS}.\n *\n * Grouped by FEAT for readability. Names mirror the registered action\n * handlers in `pack/actions/*.py` verbatim and are URL names (NOT handler\n * names — e.g. `execute_item`, not `execute`).\n */\nexport const PEOPLE_ACTION_NAME = {\n /* FEAT-001 — Company & Legal Entity */\n REGISTER_LEGAL_ENTITY: 'register_legal_entity',\n REACTIVATE: 'reactivate',\n ARCHIVE_VISIBILITY: 'archive_visibility',\n RESTORE_VISIBILITY: 'restore_visibility',\n SCHEDULE_BRANCH: 'schedule_branch',\n ACTIVATE_NOW: 'activate_now',\n CANCEL_BRANCH: 'cancel_branch',\n RESCHEDULE_BRANCH: 'reschedule_branch',\n CORRECT_CODE: 'correct_code',\n SCHEDULE_REVISION: 'schedule_revision',\n CANCEL_REVISION: 'cancel_revision',\n CLOSURE_SUBMIT: 'closure_submit',\n CLOSURE_APPROVE: 'closure_approve',\n CLOSURE_COMPLETE: 'closure_complete',\n CLOSURE_REJECT: 'closure_reject',\n CLOSURE_RETRY_FAILED: 'closure_retry_failed',\n CLOSURE_CANCEL: 'closure_cancel',\n SCHEDULE_ASSIGNMENT: 'schedule_assignment',\n CANCEL_ASSIGNMENT: 'cancel_assignment',\n\n /* FEAT-002 — Organization Structure */\n DISCONTINUE_UNIT_TYPE: 'discontinue_unit_type',\n RESTORE_UNIT_TYPE: 'restore_unit_type',\n DISCONTINUE_LOCATION_TYPE: 'discontinue_location_type',\n RESTORE_LOCATION_TYPE: 'restore_location_type',\n CS_SUBMIT: 'cs_submit',\n CS_RETURN_FOR_CORRECTION: 'cs_return_for_correction',\n CS_APPROVE: 'cs_approve',\n CS_REJECT: 'cs_reject',\n CS_SCHEDULE: 'cs_schedule',\n CS_APPLY: 'cs_apply',\n CS_RETRY_FAILED: 'cs_retry_failed',\n CS_CLOSE_FAILED: 'cs_close_failed',\n CS_CREATE_REPLACEMENT: 'cs_create_replacement',\n CS_CANCEL: 'cs_cancel',\n\n /* FEAT-007 — Access Catalog */\n VALIDATE_REVISION: 'validate_revision',\n PUBLISH_REVISION: 'publish_revision',\n FORK_DRAFT: 'fork_draft',\n DISCARD_DRAFT: 'discard_draft',\n SEED_MERGE: 'seed_merge',\n RECORD_SEED_ACK: 'record_seed_ack',\n GRANT_EXCEPTION: 'grant_exception',\n REVOKE_EXCEPTION: 'revoke_exception',\n AMEND_EXCEPTION_WINDOW: 'amend_exception_window',\n\n /* FEAT-008 — Role Assignment Management (registry §3.19–§3.21) */\n GRANT: 'grant',\n REVOKE: 'revoke',\n AMEND_WINDOW: 'amend_window',\n VALIDATE_RULE: 'validate_rule',\n PUBLISH_RULE: 'publish_rule',\n DISCARD_RULE: 'discard_rule',\n RECORD_DECISION: 'record_decision',\n GENERATE: 'generate',\n REMIND: 'remind',\n ESCALATE_REVIEW: 'escalate_review',\n COMPLETE: 'complete',\n\n /* FEAT-009 — Provisioning & provider sync */\n ACTIVATE_PROVIDER: 'activate_provider',\n DISABLE_PROVIDER: 'disable_provider',\n DISCARD_PROVIDER: 'discard_provider',\n PROBE: 'probe',\n RESOLVE_DESIRED: 'resolve_desired',\n EXECUTE_ITEM: 'execute_item',\n ACTIVATE_ITEM: 'activate_item',\n RETRY_ITEM: 'retry_item',\n RESOLVE_MANUALLY: 'resolve_manually',\n RELEASE_ITEM: 'release_item',\n CANCEL_ITEM: 'cancel_item',\n CLEANUP_PREPARED: 'cleanup_prepared',\n RESOLVE_BINDING: 'resolve_binding',\n MARK_DELETED_VERIFIED: 'mark_deleted_verified',\n ACKNOWLEDGE: 'acknowledge',\n REMEDIATE: 'remediate',\n ACCEPT_EXCEPTION: 'accept_exception',\n REGISTER_INTENDED: 'register_intended',\n ESCALATE: 'escalate',\n BUILD_PLAN: 'build_plan',\n AMEND_PLAN: 'amend_plan',\n CANCEL_PLAN: 'cancel_plan',\n COMPLETE_PLAN: 'complete_plan',\n\n /* FEAT-010 — Request Engine: request_type registry (registry §3.19) */\n EDIT_REQUEST_TYPE: 'edit_request_type',\n VALIDATE_REQUEST_TYPE: 'validate_request_type',\n SAFE_TEST_REQUEST_TYPE: 'safe_test_request_type',\n PUBLISH_REQUEST_TYPE: 'publish_request_type',\n SUPERSEDE_REQUEST_TYPE: 'supersede_request_type',\n DECOMMISSION_REQUEST_TYPE: 'decommission_request_type',\n VERIFY_REQUEST_TYPE: 'verify_request_type',\n\n /* FEAT-010 — Request Engine: registered_capability catalogue (§3.20) */\n PUBLISH_CAPABILITY: 'publish_capability',\n SUPERSEDE_CAPABILITY: 'supersede_capability',\n\n /* FEAT-010 — Request Engine: runtime dispatch (§3.19a; generated CTs) */\n RUNTIME_REQUEST_CREATE: 'runtime_request.create',\n RUNTIME_REQUEST_INVOKE: 'runtime_request.invoke_action',\n /** Generated per-flow actions authored in the definition (assignment lane). */\n CLAIM: 'claim',\n DELEGATE: 'delegate',\n\n /* FEAT-011 — Policy & Automation: policy registry handle (§3.6) */\n EDIT_POLICY: 'edit_policy',\n VALIDATE_POLICY: 'validate_policy',\n PUBLISH_POLICY: 'publish_policy',\n SUPERSEDE_POLICY: 'supersede_policy',\n ARCHIVE_POLICY: 'archive_policy',\n RESTORE_POLICY: 'restore_policy',\n TOGGLE_POLICY: 'toggle_policy',\n VERIFY_POLICY: 'verify_policy',\n\n /* FEAT-011 — Policy & Automation: glue_rule handle (§3.24, DC-06 toggle) */\n TOGGLE_GLUE_RULE: 'toggle_glue_rule',\n VERIFY_GLUE_RULE: 'verify_glue_rule',\n\n /* FEAT-014 — Process Container: process_type definition lane (§4.6) */\n EDIT_PROCESS: 'edit_process',\n VALIDATE_PROCESS: 'validate_process',\n PUBLISH_PROCESS: 'publish_process',\n SUPERSEDE_PROCESS: 'supersede_process',\n DECOMMISSION_PROCESS: 'decommission_process',\n VERIFY_PROCESS: 'verify_process',\n\n /* FEAT-014 — Process Container: process_instance lifecycle (§4.8) */\n CREATE_PROCESS: 'create_process',\n START_PROCESS: 'start_process',\n CANCEL_PROCESS: 'cancel_process',\n RETRY_PROCESS: 'retry_process',\n RETRY_SPAWN: 'retry_spawn',\n} as const;\n\nexport type PeopleActionName = (typeof PEOPLE_ACTION_NAME)[keyof typeof PEOPLE_ACTION_NAME];\n\n/**\n * System-only actions declared via `system_only: true` (engine E11b) —\n * `POST /content/{uuid}/actions/{name}` from a user returns `403\n * system_only_action`; rule/cron lanes bypass by construction. The UI MUST\n * never offer these to the operator and the portal MUST NOT invoke them.\n */\n/* FEAT-011 — runtime_policy T8 glue handler + FEAT-014 container handlers\n * (system: runtime_container.advance/spawn/deadline) */\nexport const PEOPLE_SYSTEM_ONLY_ACTIONS: ReadonlySet<string> = new Set<string>([\n /* FEAT-001 */\n 'apply_revision',\n 'spawn_branch_closures',\n 'apply_assignment',\n /* FEAT-002 */\n 'record_scope_status',\n /* FEAT-008 — role_assignment sweep lane (registry §3.19) */\n 'archive',\n 'activate',\n 'expire',\n /* FEAT-009 */\n 'probe_sweep',\n 'dispatch_event',\n 'timing_sweep',\n 'retry_due',\n 'reconcile_sweep',\n 'close_stale',\n 'reactivate_finding',\n 'execute_milestone',\n /* FEAT-010 — reaction/await/SLA runtime (§3.19a) */\n 'runtime_request.reaction_invoke',\n 'runtime_request.reaction_await',\n 'runtime_request.sla_check',\n /* FEAT-011 — T8 glue handler */\n 'runtime_policy.glue_invoke',\n /* FEAT-014 — container runtime (generated T1/T2/T3/T6 rules dispatch\n * these; phase transitions are NEVER invocable actions — RT-19) */\n 'runtime_container.advance',\n 'runtime_container.spawn',\n 'runtime_container.deadline',\n]);\n\n/** Guards for the type system + the renderer rail filter (`UNKNOWN_ACTIONS`\n * in `usePeopleStore` mirrors this shape). */\nexport function isSystemOnlyAction(action: string): boolean {\n return PEOPLE_SYSTEM_ONLY_ACTIONS.has(action);\n}\n\n/**\n * Action-by-CT contract — every pack action is bound to ONE content type\n * (engine dispatcher checks CT membership). Invoking an action on a\n * uuid of another CT returns a dispatcher error.\n *\n * System-only actions are listed alongside their bound CT for completeness;\n * the UI rail MUST filter them via {@link isSystemOnlyAction}.\n *\n * Planned CTs (FEAT-008/010/011/014) are included with empty arrays so the\n * rail renders an honest \"no actions yet\" once the CT installs.\n */\nexport const PEOPLE_ACTION_BY_CT: Record<PeopleContentTypeName, readonly PeopleActionName[]> = {\n /* FEAT-001 */\n [PEOPLE_CONTENT_TYPE.LEGAL_ENTITY]: [\n PEOPLE_ACTION_NAME.REGISTER_LEGAL_ENTITY,\n PEOPLE_ACTION_NAME.REACTIVATE,\n PEOPLE_ACTION_NAME.ARCHIVE_VISIBILITY,\n PEOPLE_ACTION_NAME.RESTORE_VISIBILITY,\n ],\n [PEOPLE_CONTENT_TYPE.REGISTERED_BRANCH]: [\n PEOPLE_ACTION_NAME.SCHEDULE_BRANCH,\n PEOPLE_ACTION_NAME.ACTIVATE_NOW,\n PEOPLE_ACTION_NAME.CANCEL_BRANCH,\n PEOPLE_ACTION_NAME.RESCHEDULE_BRANCH,\n PEOPLE_ACTION_NAME.CORRECT_CODE,\n PEOPLE_ACTION_NAME.REACTIVATE,\n PEOPLE_ACTION_NAME.ARCHIVE_VISIBILITY,\n PEOPLE_ACTION_NAME.RESTORE_VISIBILITY,\n ],\n [PEOPLE_CONTENT_TYPE.EFFECTIVE_REVISION]: [\n PEOPLE_ACTION_NAME.SCHEDULE_REVISION,\n PEOPLE_ACTION_NAME.CANCEL_REVISION,\n /* system: apply_revision */\n ],\n [PEOPLE_CONTENT_TYPE.CLOSURE_CASE]: [\n PEOPLE_ACTION_NAME.CLOSURE_SUBMIT,\n PEOPLE_ACTION_NAME.CLOSURE_APPROVE,\n PEOPLE_ACTION_NAME.CLOSURE_COMPLETE,\n PEOPLE_ACTION_NAME.CLOSURE_REJECT,\n PEOPLE_ACTION_NAME.CLOSURE_RETRY_FAILED,\n PEOPLE_ACTION_NAME.CLOSURE_CANCEL,\n /* system: spawn_branch_closures */\n ],\n [PEOPLE_CONTENT_TYPE.POLICY_ASSIGNMENT]: [\n PEOPLE_ACTION_NAME.SCHEDULE_ASSIGNMENT,\n PEOPLE_ACTION_NAME.CANCEL_ASSIGNMENT,\n /* system: apply_assignment */\n ],\n [PEOPLE_CONTENT_TYPE.POLICY]: [\n PEOPLE_ACTION_NAME.EDIT_POLICY,\n PEOPLE_ACTION_NAME.VALIDATE_POLICY,\n PEOPLE_ACTION_NAME.PUBLISH_POLICY,\n PEOPLE_ACTION_NAME.SUPERSEDE_POLICY,\n PEOPLE_ACTION_NAME.ARCHIVE_POLICY,\n PEOPLE_ACTION_NAME.RESTORE_POLICY,\n PEOPLE_ACTION_NAME.TOGGLE_POLICY,\n PEOPLE_ACTION_NAME.VERIFY_POLICY,\n ],\n\n /* FEAT-007 */\n [PEOPLE_CONTENT_TYPE.CATALOG_REVISION]: [\n PEOPLE_ACTION_NAME.VALIDATE_REVISION,\n PEOPLE_ACTION_NAME.PUBLISH_REVISION,\n PEOPLE_ACTION_NAME.FORK_DRAFT,\n PEOPLE_ACTION_NAME.DISCARD_DRAFT,\n PEOPLE_ACTION_NAME.SEED_MERGE,\n PEOPLE_ACTION_NAME.RECORD_SEED_ACK,\n ],\n [PEOPLE_CONTENT_TYPE.SCOPE_EXCEPTION]: [\n PEOPLE_ACTION_NAME.GRANT_EXCEPTION,\n PEOPLE_ACTION_NAME.REVOKE_EXCEPTION,\n PEOPLE_ACTION_NAME.AMEND_EXCEPTION_WINDOW,\n ],\n\n /* FEAT-009 */\n [PEOPLE_CONTENT_TYPE.PROVIDER_CONFIG]: [\n PEOPLE_ACTION_NAME.ACTIVATE_PROVIDER,\n PEOPLE_ACTION_NAME.DISABLE_PROVIDER,\n PEOPLE_ACTION_NAME.DISCARD_PROVIDER,\n PEOPLE_ACTION_NAME.PROBE,\n /* system: probe_sweep */\n ],\n [PEOPLE_CONTENT_TYPE.PROVISIONING_ITEM]: [\n PEOPLE_ACTION_NAME.EXECUTE_ITEM,\n PEOPLE_ACTION_NAME.ACTIVATE_ITEM,\n PEOPLE_ACTION_NAME.RETRY_ITEM,\n PEOPLE_ACTION_NAME.RESOLVE_MANUALLY,\n PEOPLE_ACTION_NAME.RELEASE_ITEM,\n PEOPLE_ACTION_NAME.CANCEL_ITEM,\n PEOPLE_ACTION_NAME.CLEANUP_PREPARED,\n /* system: dispatch_event, timing_sweep, retry_due, reconcile_sweep */\n ],\n [PEOPLE_CONTENT_TYPE.EXTERNAL_BINDING]: [\n PEOPLE_ACTION_NAME.RESOLVE_BINDING,\n PEOPLE_ACTION_NAME.MARK_DELETED_VERIFIED,\n ],\n [PEOPLE_CONTENT_TYPE.DRIFT_FINDING]: [\n PEOPLE_ACTION_NAME.ACKNOWLEDGE,\n PEOPLE_ACTION_NAME.REMEDIATE,\n PEOPLE_ACTION_NAME.ACCEPT_EXCEPTION,\n PEOPLE_ACTION_NAME.REGISTER_INTENDED,\n PEOPLE_ACTION_NAME.ESCALATE,\n /* system: close_stale, reactivate_finding */\n ],\n [PEOPLE_CONTENT_TYPE.DEPROVISION_PLAN]: [\n PEOPLE_ACTION_NAME.BUILD_PLAN,\n PEOPLE_ACTION_NAME.AMEND_PLAN,\n PEOPLE_ACTION_NAME.CANCEL_PLAN,\n PEOPLE_ACTION_NAME.COMPLETE_PLAN,\n /* system: execute_milestone */\n ],\n\n /* FEAT-002 — Organization Structure */\n [PEOPLE_CONTENT_TYPE.ORG_UNIT]: [], // archive_*_visibility + end/cancel on registry\n [PEOPLE_CONTENT_TYPE.POSITION]: [],\n [PEOPLE_CONTENT_TYPE.WORK_LOCATION]: [],\n [PEOPLE_CONTENT_TYPE.UNIT_TYPE]: [\n PEOPLE_ACTION_NAME.DISCONTINUE_UNIT_TYPE,\n PEOPLE_ACTION_NAME.RESTORE_UNIT_TYPE,\n ],\n [PEOPLE_CONTENT_TYPE.WORK_LOCATION_TYPE]: [\n PEOPLE_ACTION_NAME.DISCONTINUE_LOCATION_TYPE,\n PEOPLE_ACTION_NAME.RESTORE_LOCATION_TYPE,\n ],\n [PEOPLE_CONTENT_TYPE.ORG_CHANGE_SET]: [\n PEOPLE_ACTION_NAME.CS_SUBMIT,\n PEOPLE_ACTION_NAME.CS_RETURN_FOR_CORRECTION,\n PEOPLE_ACTION_NAME.CS_APPROVE,\n PEOPLE_ACTION_NAME.CS_REJECT,\n PEOPLE_ACTION_NAME.CS_SCHEDULE,\n PEOPLE_ACTION_NAME.CS_APPLY,\n PEOPLE_ACTION_NAME.CS_RETRY_FAILED,\n PEOPLE_ACTION_NAME.CS_CLOSE_FAILED,\n PEOPLE_ACTION_NAME.CS_CREATE_REPLACEMENT,\n PEOPLE_ACTION_NAME.CS_CANCEL,\n /* system: record_scope_status */\n ],\n\n /* FEAT-008 — Role Assignment Management (registry §3.19–§3.21) */\n [PEOPLE_CONTENT_TYPE.ROLE_ASSIGNMENT]: [\n PEOPLE_ACTION_NAME.GRANT,\n PEOPLE_ACTION_NAME.REVOKE,\n PEOPLE_ACTION_NAME.AMEND_WINDOW,\n /* system: archive, activate, expire (sweep lane) */\n ],\n [PEOPLE_CONTENT_TYPE.ASSIGNMENT_RULE]: [\n PEOPLE_ACTION_NAME.VALIDATE_RULE,\n PEOPLE_ACTION_NAME.PUBLISH_RULE,\n PEOPLE_ACTION_NAME.DISCARD_RULE,\n ],\n [PEOPLE_CONTENT_TYPE.ACCESS_REVIEW_CAMPAIGN]: [\n PEOPLE_ACTION_NAME.RECORD_DECISION,\n PEOPLE_ACTION_NAME.GENERATE,\n PEOPLE_ACTION_NAME.REMIND,\n PEOPLE_ACTION_NAME.ESCALATE_REVIEW,\n PEOPLE_ACTION_NAME.COMPLETE,\n ],\n\n /* FEAT-010 (registry §3.19–§3.20) */\n [PEOPLE_CONTENT_TYPE.REQUEST_TYPE]: [\n PEOPLE_ACTION_NAME.EDIT_REQUEST_TYPE,\n PEOPLE_ACTION_NAME.VALIDATE_REQUEST_TYPE,\n PEOPLE_ACTION_NAME.SAFE_TEST_REQUEST_TYPE,\n PEOPLE_ACTION_NAME.PUBLISH_REQUEST_TYPE,\n PEOPLE_ACTION_NAME.SUPERSEDE_REQUEST_TYPE,\n PEOPLE_ACTION_NAME.DECOMMISSION_REQUEST_TYPE,\n PEOPLE_ACTION_NAME.VERIFY_REQUEST_TYPE,\n ],\n [PEOPLE_CONTENT_TYPE.REGISTERED_CAPABILITY]: [\n PEOPLE_ACTION_NAME.PUBLISH_CAPABILITY,\n PEOPLE_ACTION_NAME.SUPERSEDE_CAPABILITY,\n ],\n\n /* FEAT-011 (registry §3.24) */\n [PEOPLE_CONTENT_TYPE.GLUE_RULE]: [\n PEOPLE_ACTION_NAME.TOGGLE_GLUE_RULE,\n PEOPLE_ACTION_NAME.VERIFY_GLUE_RULE,\n /* system: runtime_policy.glue_invoke */\n ],\n\n /* FEAT-014 — process_type definition lane + process_instance lifecycle\n * (registry §4.6/§4.8; runtime_container.* stay system-only) */\n [PEOPLE_CONTENT_TYPE.PROCESS_TYPE]: [\n PEOPLE_ACTION_NAME.EDIT_PROCESS,\n PEOPLE_ACTION_NAME.VALIDATE_PROCESS,\n PEOPLE_ACTION_NAME.PUBLISH_PROCESS,\n PEOPLE_ACTION_NAME.SUPERSEDE_PROCESS,\n PEOPLE_ACTION_NAME.DECOMMISSION_PROCESS,\n PEOPLE_ACTION_NAME.VERIFY_PROCESS,\n ],\n [PEOPLE_CONTENT_TYPE.PROCESS_INSTANCE]: [\n /* create_process is the FACTORY entry; start/cancel/retry row-scoped */\n PEOPLE_ACTION_NAME.START_PROCESS,\n PEOPLE_ACTION_NAME.CANCEL_PROCESS,\n PEOPLE_ACTION_NAME.RETRY_PROCESS,\n PEOPLE_ACTION_NAME.RETRY_SPAWN,\n /* factory: CREATE_PROCESS (content/types/process_instance/actions) */\n /* system: runtime_container.advance/spawn/deadline */\n ],\n};\n\n/**\n * Default tuning for People pack behavior — kept here (not in the BE) so the\n * FE doesn't hardcode magic numbers. Each value mirrors `pack/settings/people.yaml`.\n */\nexport const PEOPLE_DEFAULTS = {\n /* provider_config */\n RETRY_MAX_ATTEMPTS: 3,\n RETRY_BACKOFF_BASE_SECONDS: 300,\n HEALTH_WINDOW_MINUTES: 15,\n /* reconcile_sweep (cron `30 1 * * *`) */\n RECONCILE_TIMEOUT_OUTCOME_MINUTES: 60,\n /* deprovision milestone guard */\n DEPROVISION_PLAN_VERSION_GUARD: true,\n /* catalog consumers must pin \"latest published\" once per operation. */\n CATALOG_PIN_REQUIRED: true,\n} as const;\n","/**\n * Shared action-invocation helpers for the People service domains.\n *\n * - `_invokeRowAction` wraps a row-scoped action\n * (`POST /api/v1/content/{uuid}/actions/{actionName}`)\n * - `_invokeFactoryAction` wraps a factory action\n * (`POST /api/v1/content/types/{type}/actions/{actionName}`)\n *\n * Action verb strings are derived from `PEOPLE_ACTION_NAME` (the single\n * source of truth — cbs/cms-sdk/sdk-surface.md §1.10) so a typo at any call\n * site becomes a TypeScript error at compile time.\n */\n\nimport type { $Fetch } from 'ofetch';\nimport { CONTENT_ENDPOINT } from '../../common/constants/content.constant';\nimport type { ActionResponse } from '../content/content.type';\nimport { PEOPLE_ACTION_NAME, type PeopleActionName } from '../../common/constants/people.constant';\nimport type { PeopleActionOpts } from './shared.types';\n\nexport interface InvokeDeps {\n api: $Fetch;\n actionEndpoint: (uuid: string, actionName: string) => string;\n}\n\nexport interface InvokeBody extends PeopleActionOpts {\n params: Record<string, unknown>;\n}\n\nconst _buildBody = (params: object, opts?: PeopleActionOpts): InvokeBody => ({\n params: params as unknown as Record<string, unknown>,\n intentionId: opts?.intentionId,\n expectedVersion: opts?.expectedVersion,\n});\n\n/** Row-scoped: `POST /content/{uuid}/actions/{actionName}`. */\nexport function _invokeRowAction(\n deps: InvokeDeps,\n uuid: string,\n actionName: PeopleActionName,\n params?: object,\n opts?: PeopleActionOpts\n): Promise<ActionResponse> {\n return _invokeRowActionDynamic(deps, uuid, actionName, params, opts);\n}\n\n/**\n * Row-scoped with a **dynamic** action name — for GENERATED per-flow CTs\n * (FEAT-010) whose action keys are authored in the request-type definition\n * (e.g. `manager_approve`), not enumerated in `PEOPLE_ACTION_NAME`.\n */\nexport function _invokeRowActionDynamic(\n deps: InvokeDeps,\n uuid: string,\n actionName: string,\n params?: object,\n opts?: PeopleActionOpts\n): Promise<ActionResponse> {\n return deps.api<ActionResponse>(deps.actionEndpoint(uuid, actionName), {\n method: 'POST',\n body: _buildBody(params ?? {}, opts),\n });\n}\n\n/** Factory action: `POST /content/types/{type}/actions/{actionName}`. */\nexport function _invokeFactoryAction(\n deps: InvokeDeps,\n typeName: string,\n actionName: PeopleActionName,\n params?: object,\n opts?: PeopleActionOpts\n): Promise<ActionResponse> {\n return deps.api<ActionResponse>(_factoryEndpoint(typeName, actionName), {\n method: 'POST',\n body: _buildBody(params ?? {}, opts),\n });\n}\n\nfunction _factoryEndpoint(typeName: string, actionName: string): string {\n return `/api/v1/content/types/${typeName}/actions/${actionName}`;\n}\n\n/** Re-export the engine's generic endpoint for callers that want to spread\n * the SDK-internal helper rather than `CONTENT_ENDPOINT.action(uuid, …)`. */\nexport { CONTENT_ENDPOINT, PEOPLE_ACTION_NAME };\n","/**\n * Legal & Org domain — action params, outputs, and the build mixin that\n * composes them into the People service surface.\n *\n * FEAT-001 (Company & Legal Entity) — 22 actions:\n * - register_legal_entity (factory), reactivate, archive_visibility,\n * restore_visibility, schedule_branch, activate_now, cancel_branch,\n * reschedule_branch, correct_code, schedule_revision (row — draft\n * revision row created via POST /content first), cancel_revision,\n * closure_submit, closure_approve, closure_complete, closure_reject,\n * closure_retry_failed, closure_cancel, schedule_assignment (factory —\n * policy_assignment has no draft state; the action creates the row\n * directly in `scheduled`, grant_exception precedent), cancel_assignment.\n *\n * FEAT-002 (Organization Structure) — 16 actions:\n * - discontinue_unit_type, restore_unit_type, discontinue_location_type,\n * restore_location_type, cs_submit, cs_return_for_correction,\n * cs_approve, cs_reject, cs_schedule, cs_apply, cs_retry_failed,\n * cs_close_failed, cs_create_replacement, cs_cancel\n * (the latter 10 are the change-set lifecycle — approval correlation\n * lands with FEAT-010).\n *\n * Source: api_references §3.3 + registry §3/§4 + the FE-Data-Design §2.3.\n */\n\nimport type { ActionResponse } from '../../content/content.type';\nimport type { PeopleActionOpts } from '../shared.types';\nimport { _invokeFactoryAction, _invokeRowAction, type InvokeDeps } from '../_invoke';\nimport {\n PEOPLE_ACTION_NAME,\n type PeopleActionName,\n} from '../../../common/constants/people.constant';\nimport type { PeopleEffectiveRevisionData } from './ct.types';\n\n/* ════════════════════════════════════════════════\n * Action params\n * ════════════════════════════════════════════════ */\n\n/** `register_legal_entity` (factory on legal_entity). One atomic execution:\n * row creation + first effective_revision in one transaction. */\nexport interface PeopleRegisterLegalEntityParams {\n code: string;\n displayName: string;\n timezone: string;\n registeredAddress?: {\n lines?: string[];\n city?: string;\n country?: string;\n postalCode?: string;\n };\n legalIds?: Array<{\n kind: 'tax' | 'business_reg' | 'other';\n value: string;\n issuedBy?: string;\n }>;\n}\n\n/** `schedule_branch` (factory on registered_branch).\n * Carries the same v1 readiness snapshot as a separate `activate_now` review. */\nexport interface PeopleScheduleBranchParams {\n branchCode?: string;\n displayName?: string;\n readiness?: {\n valid?: boolean;\n licenseExpires?: string;\n checkedAt?: string;\n notes?: string;\n };\n effectiveFrom: string;\n}\n\n/** `reschedule_branch` mutates effectiveFrom (US2 TC16). */\nexport interface PeopleRescheduleBranchParams {\n effectiveFrom: string;\n}\n\n/** `correct_code` controlled post-activation branch-code correction. */\nexport interface PeopleCorrectCodeParams {\n branchCode: string;\n reason: string;\n}\n\n/** `reactivate` (LE or branch). Closed → Active. Reason required. */\nexport interface PeopleReactivateParams {\n reason: string;\n}\n\n/** `archive_visibility` / `restore_visibility` — operate on\n * `metadata.recordVisibility` (a FIELD, never a state). */\nexport interface PeopleArchiveVisibilityParams {\n reason?: string;\n}\n\n/** `schedule_revision` (factory on effective_revision). */\nexport type PeopleScheduleRevisionParams = Pick<\n PeopleEffectiveRevisionData,\n 'subjectKind' | 'subjectRef' | 'payload' | 'effectiveFrom' | 'effectiveTo' | 'timezoneRef'\n>;\n\n/** `closure_submit` requires explicit acknowledgement of non-empty impact. */\nexport interface PeopleClosureSubmitParams {\n acknowledged: boolean;\n}\n\n/** `closure_approve` may carry an optional decision note. */\nexport interface PeopleClosureApproveParams {\n decision?: string;\n}\n\n/** `closure_complete` may surface per-precondition detail in the output. */\nexport interface PeopleClosureCompleteOutput {\n closedBranches?: number;\n preconditionFailures?: string[];\n}\n\n/** `closure_reject` may carry a reason (audit). */\nexport interface PeopleClosureRejectParams {\n reason?: string;\n}\n\n/** `closure_cancel` — for LE targets, cascades to spawned branch drafts. */\nexport interface PeopleClosureCancelParams {\n reason?: string;\n}\n\n/** `schedule_assignment` (factory on policy_assignment). */\nexport interface PeopleScheduleAssignmentParams {\n policyRef: string;\n policyKind: string;\n targetType: 'legal_entity' | 'registered_branch';\n targetRef: string;\n effectiveFrom: string;\n effectiveTo?: string | null;\n overrideAllowed?: boolean;\n}\n\n/** `cs_submit` — author reason required; BE revalidates `changes[]`. */\nexport interface PeopleCsSubmitParams {\n reason: string;\n changes?: unknown[];\n}\n\n/** `cs_schedule` — Effective At required. */\nexport interface PeopleCsScheduleParams {\n effectiveAt: string;\n}\n\n/** `cs_cancel` — audited reason required (spec §4.4a: terminal\n * transitions carry an audited reason; guard `reason_required`). */\nexport interface PeopleCsCancelParams {\n reason: string;\n}\n\n/** `cs_close_failed` — \"close with reason\": the closure record carries\n * the operator's reason (FE dialog collects it as required input). */\nexport interface PeopleCsCloseFailedParams {\n reason: string;\n}\n\n/** `cs_reject` — approval lane (FEAT-010); may carry a reason. */\nexport interface PeopleCsRejectParams {\n reason?: string;\n}\n\n/** `cs_return_for_correction` — may carry the correction note. */\nexport interface PeopleCsReturnForCorrectionParams {\n reason?: string;\n}\n\n/** `cancel_branch` — may carry an audited reason. */\nexport interface PeopleCancelBranchParams {\n reason?: string;\n}\n\n/** `cancel_revision` — may carry an audited reason. */\nexport interface PeopleCancelRevisionParams {\n reason?: string;\n}\n\n/* ════════════════════════════════════════════════\n * Mixin shape — composes into the IPeopleService surface\n * ════════════════════════════════════════════════ */\n\nexport interface LegalAndOrgActions {\n /* ─── FEAT-001: Company & Legal Entity ─── */\n registerLegalEntity(\n params: PeopleRegisterLegalEntityParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n reactivate(\n leOrBranchUuid: string,\n params: PeopleReactivateParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n archiveVisibility(\n leOrBranchUuid: string,\n params?: PeopleArchiveVisibilityParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n restoreVisibility(\n leOrBranchUuid: string,\n params?: PeopleArchiveVisibilityParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n scheduleBranch(\n branchUuid: string,\n params: PeopleScheduleBranchParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n activateNow(branchUuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n cancelBranch(\n branchUuid: string,\n params?: PeopleCancelBranchParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n rescheduleBranch(\n branchUuid: string,\n params: PeopleRescheduleBranchParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n correctCode(\n branchUuid: string,\n params: PeopleCorrectCodeParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n scheduleRevision(\n revisionUuid: string,\n params?: PeopleScheduleRevisionParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n /** `schedule_revision` FACTORY lane on `effective_revision` — creates the\n * row + schedules it atomically (api_references §3.3; no pre-made draft). */\n createRevision(\n params: PeopleScheduleRevisionParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n cancelRevision(\n revisionUuid: string,\n params?: PeopleCancelRevisionParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n closureSubmit(\n caseUuid: string,\n params: PeopleClosureSubmitParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n closureApprove(\n caseUuid: string,\n params?: PeopleClosureApproveParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n closureComplete(caseUuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n closureReject(\n caseUuid: string,\n params?: PeopleClosureRejectParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n closureRetryFailed(caseUuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n closureCancel(\n caseUuid: string,\n params?: PeopleClosureCancelParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n scheduleAssignment(\n params: PeopleScheduleAssignmentParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n cancelAssignment(assignmentUuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n\n /* ─── FEAT-002: Organization Structure ─── */\n discontinueUnitType(unitTypeUuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n restoreUnitType(unitTypeUuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n discontinueLocationType(\n locationTypeUuid: string,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n restoreLocationType(locationTypeUuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n csSubmit(\n changeSetUuid: string,\n params: PeopleCsSubmitParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n csReturnForCorrection(\n changeSetUuid: string,\n params?: PeopleCsReturnForCorrectionParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n csApprove(changeSetUuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n csReject(\n changeSetUuid: string,\n params?: PeopleCsRejectParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n csSchedule(\n changeSetUuid: string,\n params: PeopleCsScheduleParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n csApply(changeSetUuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n csRetryFailed(changeSetUuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n csCloseFailed(\n changeSetUuid: string,\n params: PeopleCsCloseFailedParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n csCreateReplacement(changeSetUuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n csCancel(\n changeSetUuid: string,\n params: PeopleCsCancelParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n}\n\n/* ════════════════════════════════════════════════\n * Factory — `buildLegalActions({api})` returns the mixin\n * ════════════════════════════════════════════════ */\n\nexport function buildLegalActions(deps: InvokeDeps): LegalAndOrgActions {\n const invoke = (uuid: string, name: PeopleActionName, params?: object, opts?: PeopleActionOpts) =>\n _invokeRowAction(deps, uuid, name, params, opts);\n const factory = (\n typeName: string,\n name: PeopleActionName,\n params?: object,\n opts?: PeopleActionOpts\n ) => _invokeFactoryAction(deps, typeName, name, params, opts);\n\n return {\n /* ─── FEAT-001 ─── */\n\n registerLegalEntity: (params, opts) =>\n factory('legal_entity', PEOPLE_ACTION_NAME.REGISTER_LEGAL_ENTITY, params, opts),\n\n reactivate: (uuid, params, opts) => invoke(uuid, PEOPLE_ACTION_NAME.REACTIVATE, params, opts),\n archiveVisibility: (uuid, params, opts) =>\n invoke(uuid, PEOPLE_ACTION_NAME.ARCHIVE_VISIBILITY, params, opts),\n restoreVisibility: (uuid, params, opts) =>\n invoke(uuid, PEOPLE_ACTION_NAME.RESTORE_VISIBILITY, params, opts),\n\n scheduleBranch: (uuid, params, opts) =>\n invoke(uuid, PEOPLE_ACTION_NAME.SCHEDULE_BRANCH, params, opts),\n activateNow: (uuid, opts) => invoke(uuid, PEOPLE_ACTION_NAME.ACTIVATE_NOW, undefined, opts),\n cancelBranch: (uuid, params, opts) =>\n invoke(uuid, PEOPLE_ACTION_NAME.CANCEL_BRANCH, params, opts),\n rescheduleBranch: (uuid, params, opts) =>\n invoke(uuid, PEOPLE_ACTION_NAME.RESCHEDULE_BRANCH, params, opts),\n correctCode: (uuid, params, opts) =>\n invoke(uuid, PEOPLE_ACTION_NAME.CORRECT_CODE, params, opts),\n\n scheduleRevision: (revisionUuid, params, opts) =>\n invoke(revisionUuid, PEOPLE_ACTION_NAME.SCHEDULE_REVISION, params, opts),\n createRevision: (params, opts) =>\n factory('effective_revision', PEOPLE_ACTION_NAME.SCHEDULE_REVISION, params, opts),\n cancelRevision: (uuid, params, opts) =>\n invoke(uuid, PEOPLE_ACTION_NAME.CANCEL_REVISION, params, opts),\n\n closureSubmit: (uuid, params, opts) =>\n invoke(uuid, PEOPLE_ACTION_NAME.CLOSURE_SUBMIT, params, opts),\n closureApprove: (uuid, params, opts) =>\n invoke(uuid, PEOPLE_ACTION_NAME.CLOSURE_APPROVE, params, opts),\n closureComplete: (uuid, opts) =>\n invoke(uuid, PEOPLE_ACTION_NAME.CLOSURE_COMPLETE, undefined, opts),\n closureReject: (uuid, params, opts) =>\n invoke(uuid, PEOPLE_ACTION_NAME.CLOSURE_REJECT, params, opts),\n closureRetryFailed: (uuid, opts) =>\n invoke(uuid, PEOPLE_ACTION_NAME.CLOSURE_RETRY_FAILED, undefined, opts),\n closureCancel: (uuid, params, opts) =>\n invoke(uuid, PEOPLE_ACTION_NAME.CLOSURE_CANCEL, params, opts),\n\n scheduleAssignment: (params, opts) =>\n factory('policy_assignment', PEOPLE_ACTION_NAME.SCHEDULE_ASSIGNMENT, params, opts),\n cancelAssignment: (uuid, opts) =>\n invoke(uuid, PEOPLE_ACTION_NAME.CANCEL_ASSIGNMENT, undefined, opts),\n\n /* ─── FEAT-002 ─── */\n\n discontinueUnitType: (uuid, opts) =>\n invoke(uuid, PEOPLE_ACTION_NAME.DISCONTINUE_UNIT_TYPE, undefined, opts),\n restoreUnitType: (uuid, opts) =>\n invoke(uuid, PEOPLE_ACTION_NAME.RESTORE_UNIT_TYPE, undefined, opts),\n discontinueLocationType: (uuid, opts) =>\n invoke(uuid, PEOPLE_ACTION_NAME.DISCONTINUE_LOCATION_TYPE, undefined, opts),\n restoreLocationType: (uuid, opts) =>\n invoke(uuid, PEOPLE_ACTION_NAME.RESTORE_LOCATION_TYPE, undefined, opts),\n\n csSubmit: (uuid, params, opts) => invoke(uuid, PEOPLE_ACTION_NAME.CS_SUBMIT, params, opts),\n csReturnForCorrection: (uuid, params, opts) =>\n invoke(uuid, PEOPLE_ACTION_NAME.CS_RETURN_FOR_CORRECTION, params, opts),\n csApprove: (uuid, opts) => invoke(uuid, PEOPLE_ACTION_NAME.CS_APPROVE, undefined, opts),\n csReject: (uuid, params, opts) => invoke(uuid, PEOPLE_ACTION_NAME.CS_REJECT, params, opts),\n csSchedule: (uuid, params, opts) => invoke(uuid, PEOPLE_ACTION_NAME.CS_SCHEDULE, params, opts),\n csApply: (uuid, opts) => invoke(uuid, PEOPLE_ACTION_NAME.CS_APPLY, undefined, opts),\n csRetryFailed: (uuid, opts) =>\n invoke(uuid, PEOPLE_ACTION_NAME.CS_RETRY_FAILED, undefined, opts),\n csCloseFailed: (uuid, params, opts) =>\n invoke(uuid, PEOPLE_ACTION_NAME.CS_CLOSE_FAILED, params, opts),\n csCreateReplacement: (uuid, opts) =>\n invoke(uuid, PEOPLE_ACTION_NAME.CS_CREATE_REPLACEMENT, undefined, opts),\n csCancel: (uuid, params, opts) => invoke(uuid, PEOPLE_ACTION_NAME.CS_CANCEL, params, opts),\n };\n}\n","/**\n * Perms domain — action params, outputs, and the build mixin for FEAT-007 +\n * FEAT-008.\n *\n * FEAT-007: validate_revision, publish_revision, fork_draft (factory),\n * discard_draft, seed_merge (factory), record_seed_ack,\n * grant_exception (factory), revoke_exception, amend_exception_window.\n * FEAT-008 (registry §3.19–§3.21): grant, revoke, amend_window\n * (role_assignment — grant/revoke are row-scoped on a draft/prepared row);\n * validate_rule, publish_rule, discard_rule (assignment_rule);\n * record_decision, generate, remind, escalate_review, complete\n * (access_review_campaign).\n *\n * Wire convention: every key is camelCase (matches the engine response).\n */\n\nimport type { ActionResponse } from '../../content/content.type';\nimport type { PeopleActionOpts } from '../shared.types';\nimport { _invokeFactoryAction, _invokeRowAction, type InvokeDeps } from '../_invoke';\nimport {\n PEOPLE_ACTION_NAME,\n type PeopleActionName,\n} from '../../../common/constants/people.constant';\n\n/* ════════════════════════════════════════════════════════════════════════\n * Action params / outputs\n * ════════════════════════════════════════════════════════════════════════ */\n\n/** `validate_revision` — runs publish guards; writes `validationResult`. */\nexport interface PeopleValidateRevisionOutput {\n valid: boolean;\n errors: unknown[];\n checkedAt: string;\n}\n\n/** `fork_draft` (factory on catalog_revision). Duplicate `revisionLabel`\n * ⇒ `revision_label_conflict`. */\nexport interface PeopleForkDraftParams {\n revisionLabel: string;\n forkedFrom?: string;\n}\n\n/** `seed_merge` (factory on catalog_revision) — merges SETTING\n * `people.permissionSets` into a draft; idempotent by key, NEVER auto-publishes. */\nexport interface PeopleSeedMergeParams {\n permissionSets?: string[];\n draftUuid?: string;\n}\n\nexport interface PeopleSeedMergeOutput {\n draftUuid: string;\n noOp: boolean;\n added: Array<{ key: string }>;\n unchanged: Array<{ key: string }>;\n seedDrift: Array<{ key: string; expected: unknown; actual: unknown }>;\n}\n\n/** `publish_revision` (row on catalog_revision) — guard + atomic publish +\n * supersede previous in one execution; failure ⇒ `PEOPLE_CAT_DRAFT_MISMATCH`. */\nexport interface PeoplePublishRevisionOutput {\n revisionLabel: string;\n superseded: string[];\n events: Array<{ type: string; payload?: Record<string, unknown> }>;\n}\n\n/** `grant_exception` (factory on scope_exception). Creates directly `active`,\n * `origin: 'admin'`. Open-ended windows rejected. Grants only widen data-scope. */\nexport interface PeopleGrantExceptionParams {\n subjectRef: string;\n scopeKey: string;\n effect?: 'grant' | 'deny';\n window: { effectiveFrom: string; effectiveTo: string };\n justification: string;\n employmentRef?: string;\n}\n\nexport interface PeopleGrantExceptionOutput {\n exceptionUuid: string;\n subjectRef: string;\n scopeKey: string;\n effect: 'grant' | 'deny';\n origin: 'admin';\n state: 'active';\n}\n\n/** `amend_exception_window` — only the window is mutable; effect/scopeKey/\n * justification are locked to their original values. */\nexport interface PeopleAmendExceptionWindowParams {\n window: { effectiveFrom: string; effectiveTo: string };\n}\n\n/* ── FEAT-008 — role_assignment ────────────────────────────────────────── */\n\n/** `grant` guard order: RA11 context → catalog resolve → acting triple →\n * duplicate/idempotency NO_OP → SoD warn (never blocking) → write + inline\n * `user_roles` reflect. `accessContextState` is the eaera-hr projection\n * read the guard keys on: ended ⇒ PEOPLE_RA_CONTEXT_ENDED; scheduled ⇒ the\n * row starts `prepared` (no enforcement until the sweep activates it). */\nexport interface PeopleGrantParams {\n subjectRef: string;\n roleKey: string;\n accessContextRef: string;\n assignmentType: 'manual' | 'birthright' | 'requested' | 'emergency';\n accessContextState: 'active' | 'scheduled' | 'ended';\n purpose?: 'standard' | 'acting';\n effectiveFrom?: string;\n effectiveTo?: string;\n justification?: string;\n ticketRef?: string;\n idempotencyKey?: string;\n sodWarnPatterns?: string[];\n}\n\nexport interface PeopleGrantOutput {\n assignmentUuid: string;\n state: 'prepared' | 'active';\n sodWarnings: Array<{ pattern: string; detail?: string }>;\n noOp?: boolean;\n}\n\n/** `revoke` — reason required; birthright rows additionally write\n * `manual_override` (blocks re-grant until the rule republishes). */\nexport interface PeopleRevokeParams {\n reason: string;\n}\n\n/** `amend_window` — active rows only; never resurrects inactive rows\n * (renewal = a new grant). Early acting stop = effectiveTo = now. */\nexport interface PeopleAmendWindowParams {\n effectiveTo: string;\n}\n\n/* ── FEAT-008 — assignment_rule ────────────────────────────────────────── */\n\nexport interface PeopleValidateRuleOutput {\n valid: boolean;\n errors: unknown[];\n checkedAt: string;\n}\n\n/** `publish_rule` — guard re-run + supersede of the previous published\n * version of the same rule_key in ONE execution; conflict ⇒\n * PEOPLE_RA_RULE_CONFLICT. Emits the RA5 bulk re-evaluation event. */\nexport interface PeoplePublishRuleOutput {\n state: 'published';\n version: number;\n supersededUuid?: string;\n events: Array<{ type: string; payload?: Record<string, unknown> }>;\n}\n\n/* ── FEAT-008 — access_review_campaign ─────────────────────────────────── */\n\n/** `record_decision` — revoke requires a reason and invokes assignment\n * `revoke` inline on every assignmentRefs item (RA9); `revoked` carries\n * the per-outcome result. */\nexport interface PeopleRecordDecisionParams {\n memberRef: string;\n decision: 'keep' | 'revoke';\n reason?: string;\n}\n\nexport interface PeopleRecordDecisionOutput {\n decision: 'keep' | 'revoke';\n revoked: Array<{ assignmentUuid: string; ok: boolean; result?: unknown }>;\n}\n\n/** `generate` — builds items from a caller-supplied reporting line (the\n * eaera-hr projection supplies it, OQ-5). Idempotent per cycle: an\n * already-active campaign is a NO_OP; members without a resolvable manager\n * are created directly `escalated` (fail-soft). */\nexport interface PeopleGenerateParams {\n cycleConfig?: Record<string, unknown>;\n deadlineAt: string;\n reportingLine: Array<{\n managerRef: string;\n members: Array<{ memberRef: string; assignmentRefs: string[] }>;\n }>;\n}\n\nexport interface PeopleGenerateOutput {\n campaignUuid: string;\n itemCount: number;\n deadlineAt: string;\n}\n\n/** `remind` — bookkeeping count of still-pending items (RA8). */\nexport interface PeopleRemindOutput {\n reminded: number;\n}\n\n/** `escalate_review` — pending items past 2× the review window escalate to\n * the HR admin; NEVER auto-revokes (PM 2026-08-17). */\nexport interface PeopleEscalateReviewOutput {\n escalated: number;\n escalatedTo?: string;\n}\n\n/** `complete` — writes the US6 TC4 compliance evidence. */\nexport interface PeopleCompleteOutput {\n completionReport: {\n completedAt: string;\n totalItems: number;\n kept: number;\n revoked: number;\n escalated: number;\n reviews: unknown[];\n };\n}\n\n/* ════════════════════════════════════════════════════════════════════════\n * Mixin shape\n * ════════════════════════════════════════════════════════════════════════ */\n\nexport interface PermsActions {\n validateRevision(revisionUuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n publishRevision(revisionUuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n forkDraft(params: PeopleForkDraftParams, opts?: PeopleActionOpts): Promise<ActionResponse>;\n discardDraft(revisionUuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n seedMerge(params?: PeopleSeedMergeParams, opts?: PeopleActionOpts): Promise<ActionResponse>;\n recordSeedAck(revisionUuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n grantException(\n params: PeopleGrantExceptionParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n revokeException(exceptionUuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n amendExceptionWindow(\n exceptionUuid: string,\n window: { effectiveFrom: string; effectiveTo: string },\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n /* ── FEAT-008 — role_assignment ── */\n grant(\n assignmentUuid: string,\n params: PeopleGrantParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n revoke(\n assignmentUuid: string,\n params: PeopleRevokeParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n amendWindow(\n assignmentUuid: string,\n params: PeopleAmendWindowParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n /* ── FEAT-008 — assignment_rule ── */\n validateRule(ruleUuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n publishRule(ruleUuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n discardRule(ruleUuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n /* ── FEAT-008 — access_review_campaign ── */\n recordDecision(\n campaignUuid: string,\n params: PeopleRecordDecisionParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n generate(\n campaignUuid: string,\n params: PeopleGenerateParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n remind(campaignUuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n escalateReview(campaignUuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n complete(campaignUuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n}\n\nexport function buildPermsActions(deps: InvokeDeps): PermsActions {\n // Verb references go to PEOPLE_ACTION_NAME directly below —// no local alias.\n const invoke = (uuid: string, name: PeopleActionName, params?: object, opts?: PeopleActionOpts) =>\n _invokeRowAction(deps, uuid, name, params, opts);\n const factory = (\n typeName: string,\n name: PeopleActionName,\n params?: object,\n opts?: PeopleActionOpts\n ) => _invokeFactoryAction(deps, typeName, name, params, opts);\n\n return {\n validateRevision: (uuid, opts) =>\n invoke(uuid, PEOPLE_ACTION_NAME.VALIDATE_REVISION, undefined, opts),\n publishRevision: (uuid, opts) =>\n invoke(uuid, PEOPLE_ACTION_NAME.PUBLISH_REVISION, undefined, opts),\n forkDraft: (params, opts) =>\n factory('catalog_revision', PEOPLE_ACTION_NAME.FORK_DRAFT, params, opts),\n discardDraft: (uuid, opts) => invoke(uuid, PEOPLE_ACTION_NAME.DISCARD_DRAFT, undefined, opts),\n seedMerge: (params, opts) =>\n factory('catalog_revision', PEOPLE_ACTION_NAME.SEED_MERGE, params, opts),\n recordSeedAck: (uuid, opts) =>\n invoke(uuid, PEOPLE_ACTION_NAME.RECORD_SEED_ACK, undefined, opts),\n grantException: (params, opts) =>\n factory('scope_exception', PEOPLE_ACTION_NAME.GRANT_EXCEPTION, params, opts),\n revokeException: (uuid, opts) =>\n invoke(uuid, PEOPLE_ACTION_NAME.REVOKE_EXCEPTION, undefined, opts),\n amendExceptionWindow: (uuid, params, opts) =>\n invoke(uuid, PEOPLE_ACTION_NAME.AMEND_EXCEPTION_WINDOW, { window: params }, opts),\n\n /* ── FEAT-008 — role_assignment ── */\n grant: (uuid, params, opts) => invoke(uuid, PEOPLE_ACTION_NAME.GRANT, params, opts),\n revoke: (uuid, params, opts) => invoke(uuid, PEOPLE_ACTION_NAME.REVOKE, params, opts),\n amendWindow: (uuid, params, opts) =>\n invoke(uuid, PEOPLE_ACTION_NAME.AMEND_WINDOW, params, opts),\n\n /* ── FEAT-008 — assignment_rule ── */\n validateRule: (uuid, opts) => invoke(uuid, PEOPLE_ACTION_NAME.VALIDATE_RULE, undefined, opts),\n publishRule: (uuid, opts) => invoke(uuid, PEOPLE_ACTION_NAME.PUBLISH_RULE, undefined, opts),\n discardRule: (uuid, opts) => invoke(uuid, PEOPLE_ACTION_NAME.DISCARD_RULE, undefined, opts),\n\n /* ── FEAT-008 — access_review_campaign ── */\n recordDecision: (uuid, params, opts) =>\n invoke(uuid, PEOPLE_ACTION_NAME.RECORD_DECISION, params, opts),\n generate: (uuid, params, opts) => invoke(uuid, PEOPLE_ACTION_NAME.GENERATE, params, opts),\n remind: (uuid, opts) => invoke(uuid, PEOPLE_ACTION_NAME.REMIND, undefined, opts),\n escalateReview: (uuid, opts) =>\n invoke(uuid, PEOPLE_ACTION_NAME.ESCALATE_REVIEW, undefined, opts),\n complete: (uuid, opts) => invoke(uuid, PEOPLE_ACTION_NAME.COMPLETE, undefined, opts),\n };\n}\n","/**\n * Identity domain — action params, outputs, and the build mixin for FEAT-009.\n *\n * 22 user-callable actions:\n * provider_config (4) — activate/disable/discard_provider, probe\n * provisioning_item (6) — resolve_desired (factory), execute_item,\n * activate_item, retry_item, resolve_manually\n * (factory), release_item (factory), cancel_item,\n * cleanup_prepared\n * external_binding (2) — resolve_binding (factory),\n * mark_deleted_verified (factory)\n * drift_finding (5) — acknowledge, remediate, accept_exception\n * (factory), register_intended, escalate\n * deprovision_plan (4) — build_plan (factory), amend_plan,\n * cancel_plan, complete_plan\n */\n\nimport type { ActionResponse } from '../../content/content.type';\nimport type { PeopleActionOpts } from '../shared.types';\nimport { _invokeFactoryAction, _invokeRowAction, type InvokeDeps } from '../_invoke';\nimport {\n PEOPLE_ACTION_NAME,\n type PeopleActionName,\n} from '../../../common/constants/people.constant';\n\n/* ════════════════════════════════════════════════\n * Params / outputs\n * ════════════════════════════════════════════════ */\n\n/** `resolve_desired` — idempotent by `eventId` (repeat ⇒ NO_OP audited). */\nexport interface PeopleResolveDesiredParams {\n employmentRef: string;\n providerRef: string;\n employment: {\n ref: string;\n leRef: string;\n confirmedAt: string;\n startDate: string;\n };\n eventId?: string;\n}\n\nexport interface PeopleResolveDesiredOutput {\n itemsCreated: string[];\n packageSize: number;\n}\n\n/** `retry_item` — from `failed` only; exhausted ⇒ `retry_exhausted` +\n * `manual_resolution`. */\nexport interface PeopleRetryItemOutput {\n attempt: {\n count: number;\n max: number;\n nextRetryAt?: string | null;\n retryAfterRespected?: boolean;\n };\n}\n\n/** `resolve_manually` — `evidence_required` without evidence. The honest path. */\nexport interface PeopleResolveManuallyParams {\n itemRef: string;\n outcome: { evidence: Record<string, unknown> };\n}\n\n/** `release_item` — account resource with other employment still contributing\n * ⇒ `contributors_not_empty`. */\nexport interface PeopleReleaseItemParams {\n itemRef: string;\n}\n\n/** `resolve_binding` — 4-outcome rehire resolution, identity only\n * (entitlements flow through the new employment's Joiner pipeline, PM 9.5). */\nexport interface PeopleResolveBindingParams {\n canonicalPersonRef: string;\n providerRef: string;\n}\n\nexport type PeopleResolveBindingOutcome =\n | 'existing_active'\n | 'reactivate_identity'\n | 'new_binding'\n | 'no_account';\n\n/** `mark_deleted_verified` — eligible ≠ deleted ⇒ `verification_required`. */\nexport interface PeopleMarkDeletedVerifiedParams {\n bindingRef: string;\n verified: true;\n providerOperationReference?: string;\n}\n\n/** `accept_exception` (drift) — critical severity requires the emergency gate. */\nexport interface PeopleAcceptExceptionParams {\n findingRef: string;\n exception: {\n owner: string;\n approvedBy: string;\n effectiveFrom: string;\n expiresAt: string; // no open-ended accepts\n };\n emergency: boolean; // required when severity: critical\n}\n\nexport interface PeopleAcceptExceptionOutput {\n success: boolean;\n expiresAt: string;\n}\n\n/** `escalate` carries an optional target. */\nexport interface PeopleEscalateParams {\n escalatedTo?: string;\n}\n\n/** `build_plan` / `amend_plan` — dates belong to FEAT-004, never invented here. */\nexport interface PeopleBuildPlanParams {\n employmentRef: string;\n endingPlanRef: string;\n endingFacts: {\n lwd: string;\n endEffectiveAt: string;\n timezone: string;\n };\n policyRef?: string;\n policyVersion?: string;\n}\n\nexport interface PeopleBuildPlanOutput {\n plan: string; // uuid\n planVersion: number;\n}\n\n/* ════════════════════════════════════════════════\n * Mixin shape\n * ════════════════════════════════════════════════ */\n\nexport interface IdentityActions {\n /* provider_config — 4 actions */\n activateProvider(providerUuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n disableProvider(providerUuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n discardProvider(providerUuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n probe(providerUuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n\n /* provisioning_item — 7 actions */\n resolveDesired(\n params: PeopleResolveDesiredParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n executeItem(itemUuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n activateItem(itemUuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n retryItem(itemUuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n resolveManually(\n params: PeopleResolveManuallyParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n releaseItem(params: PeopleReleaseItemParams, opts?: PeopleActionOpts): Promise<ActionResponse>;\n cancelItem(itemUuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n cleanupPrepared(itemUuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n\n /* external_binding — 2 actions */\n resolveBinding(\n params: PeopleResolveBindingParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n markDeletedVerified(\n params: PeopleMarkDeletedVerifiedParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n\n /* drift_finding — 5 actions */\n acknowledge(findingUuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n remediate(findingUuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n acceptException(\n params: PeopleAcceptExceptionParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n registerIntended(findingUuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n escalate(\n findingUuid: string,\n params?: PeopleEscalateParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n\n /* deprovision_plan — 4 actions */\n buildPlan(params: PeopleBuildPlanParams, opts?: PeopleActionOpts): Promise<ActionResponse>;\n amendPlan(\n planUuid: string,\n params: PeopleBuildPlanParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n cancelPlan(planUuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n completePlan(planUuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n}\n\n/* ════════════════════════════════════════════════\n * Factory\n * ════════════════════════════════════════════════ */\n\nexport function buildIdentityActions(deps: InvokeDeps): IdentityActions {\n // Verb references go to PEOPLE_ACTION_NAME directly below —// no local alias.\n const invoke = (uuid: string, name: PeopleActionName, params?: object, opts?: PeopleActionOpts) =>\n _invokeRowAction(deps, uuid, name, params, opts);\n const factory = (\n typeName: string,\n name: PeopleActionName,\n params?: object,\n opts?: PeopleActionOpts\n ) => _invokeFactoryAction(deps, typeName, name, params, opts);\n\n return {\n /* provider_config */\n activateProvider: (uuid, opts) =>\n invoke(uuid, PEOPLE_ACTION_NAME.ACTIVATE_PROVIDER, undefined, opts),\n disableProvider: (uuid, opts) =>\n invoke(uuid, PEOPLE_ACTION_NAME.DISABLE_PROVIDER, undefined, opts),\n discardProvider: (uuid, opts) =>\n invoke(uuid, PEOPLE_ACTION_NAME.DISCARD_PROVIDER, undefined, opts),\n probe: (uuid, opts) => invoke(uuid, PEOPLE_ACTION_NAME.PROBE, undefined, opts),\n\n /* provisioning_item */\n resolveDesired: (params, opts) =>\n factory('provisioning_item', PEOPLE_ACTION_NAME.RESOLVE_DESIRED, params, opts),\n executeItem: (uuid, opts) => invoke(uuid, PEOPLE_ACTION_NAME.EXECUTE_ITEM, undefined, opts),\n activateItem: (uuid, opts) => invoke(uuid, PEOPLE_ACTION_NAME.ACTIVATE_ITEM, undefined, opts),\n retryItem: (uuid, opts) => invoke(uuid, PEOPLE_ACTION_NAME.RETRY_ITEM, undefined, opts),\n resolveManually: (params, opts) =>\n factory('provisioning_item', PEOPLE_ACTION_NAME.RESOLVE_MANUALLY, params, opts),\n releaseItem: (params, opts) =>\n factory('provisioning_item', PEOPLE_ACTION_NAME.RELEASE_ITEM, params, opts),\n cancelItem: (uuid, opts) => invoke(uuid, PEOPLE_ACTION_NAME.CANCEL_ITEM, undefined, opts),\n cleanupPrepared: (uuid, opts) =>\n invoke(uuid, PEOPLE_ACTION_NAME.CLEANUP_PREPARED, undefined, opts),\n\n /* external_binding */\n resolveBinding: (params, opts) =>\n factory('external_binding', PEOPLE_ACTION_NAME.RESOLVE_BINDING, params, opts),\n markDeletedVerified: (params, opts) =>\n factory('external_binding', PEOPLE_ACTION_NAME.MARK_DELETED_VERIFIED, params, opts),\n\n /* drift_finding */\n acknowledge: (uuid, opts) => invoke(uuid, PEOPLE_ACTION_NAME.ACKNOWLEDGE, undefined, opts),\n remediate: (uuid, opts) => invoke(uuid, PEOPLE_ACTION_NAME.REMEDIATE, undefined, opts),\n acceptException: (params, opts) =>\n factory('drift_finding', PEOPLE_ACTION_NAME.ACCEPT_EXCEPTION, params, opts),\n registerIntended: (uuid, opts) =>\n invoke(uuid, PEOPLE_ACTION_NAME.REGISTER_INTENDED, undefined, opts),\n escalate: (uuid, params, opts) => invoke(uuid, PEOPLE_ACTION_NAME.ESCALATE, params, opts),\n\n /* deprovision_plan */\n buildPlan: (params, opts) =>\n factory('deprovision_plan', PEOPLE_ACTION_NAME.BUILD_PLAN, params, opts),\n amendPlan: (uuid, params, opts) => invoke(uuid, PEOPLE_ACTION_NAME.AMEND_PLAN, params, opts),\n cancelPlan: (uuid, opts) => invoke(uuid, PEOPLE_ACTION_NAME.CANCEL_PLAN, undefined, opts),\n completePlan: (uuid, opts) => invoke(uuid, PEOPLE_ACTION_NAME.COMPLETE_PLAN, undefined, opts),\n };\n}\n","/**\n * Process domain — actions (FEAT-010 Request Engine + FEAT-011 Policy &\n * Automation + FEAT-014 Process Container).\n *\n * Grouped sub-objects keep the flat-surface convention collision-free\n * (`validate` exists for request types AND policies AND process types):\n *\n * sdk.people.reqType.edit(...) — request_type authoring lane\n * sdk.people.capability.publish(...) — registered_capability catalogue\n * sdk.people.policy.toggle(...) — policy registry handle (011)\n * sdk.people.glueRule.toggle(...) — instant toggle, EventGrade (DC-06)\n * sdk.people.runtimeRequest.create(...) — factory on GENERATED CTs\n * sdk.people.processType.publish(...) — process_type definition lane (014)\n * sdk.people.processInstance.start(...) — process_instance lifecycle (014)\n *\n * Source: BE api_references §3.3/§5d/§5e/§5f + fe-data-design §2.3.\n * All wrappers return the generic `ActionResponse` envelope — domain guard\n * rejections ride HTTP 200 (`success: false` + `PEOPLE_*`), narrow with\n * `PeopleActionResult`.\n */\n\nimport type { ActionResponse } from '../../content/content.type';\nimport type { PeopleActionOpts } from '../shared.types';\nimport {\n PEOPLE_ACTION_NAME,\n PEOPLE_CONTENT_TYPE,\n type PeopleActionName,\n} from '../../../common/constants/people.constant';\nimport {\n _invokeFactoryAction,\n _invokeRowAction,\n _invokeRowActionDynamic,\n type InvokeDeps,\n} from '../_invoke';\nimport type { PeopleProcessDefinition, PeopleRequestTypeDefinition } from './ct.types';\n\n/* ════════════════════════════════════════════════\n * Action params\n * ════════════════════════════════════════════════ */\n\n/** `edit_request_type` — draft/validated only; replaces `definition` and\n * re-stamps the canonical hash (validated → draft). */\nexport interface PeopleEditRequestTypeParams {\n definition: PeopleRequestTypeDefinition;\n}\n\n/** `safe_test_request_type` — sandbox scenario through the pure S1–S14\n * chain with simulated capabilities; no production mutation, no git effect,\n * no row state change. */\nexport interface PeopleSafeTestRequestTypeParams {\n scenario?: Record<string, unknown>;\n}\n\n/** `edit_policy` — human face takes title/body; machine face takes `artifact`. */\nexport interface PeopleEditPolicyParams {\n kind?:\n | 'document'\n | 'process-composition'\n | 'cross-domain-automation'\n | 'settings-guardrails'\n | (string & {});\n policyKey?: string;\n /** Human face (`kind: document`). */\n title?: string;\n body?: Record<string, unknown>;\n audience?: string;\n scope?: string;\n /** Machine face — the authored artifact tree (rides the row, drift D-5). */\n artifact?: Record<string, unknown>;\n}\n\n/** `publish_policy` — `confirmImpact: true` required when consumers hold the\n * old version (impact warning). */\nexport interface PeoplePublishPolicyParams {\n confirmImpact?: boolean;\n}\n\n/** `archive_policy` — `purge: true` on a referenced version ⇒\n * `PEOPLE_POLICY_VERSION_REFERENCED`. */\nexport interface PeopleArchivePolicyParams {\n purge?: boolean;\n}\n\n/** `toggle_policy` — machine face only: artifact-level `enabled` OR one\n * composition entry override. Structural fields ⇒ `PEOPLE_POLICY_TOGGLE_INVALID`. */\nexport interface PeopleTogglePolicyParams {\n enabled: boolean;\n entryKey?: string;\n}\n\n/** `toggle_glue_rule` — optional operator reason (incident bookkeeping). */\nexport interface PeopleToggleGlueRuleParams {\n reason?: string;\n}\n\n/** `runtime_request.create` — 7-step creation; snapshot pin at creation;\n * idempotent by `idempotencyKey` (RC-10 — pass a FRESH key per user submit). */\nexport interface PeopleRuntimeRequestCreateParams {\n input: unknown;\n subjectRef: string;\n requesterRef?: string;\n idempotencyKey?: string;\n}\n/* ════════════════════════════════════════════════\n * FEAT-014 — Process Container action params\n * ════════════════════════════════════════════════ */\n\n/** `edit_process` — draft rows only (published immutable, DC-06); replaces\n * the authored tree and re-stamps the canonical hash. */\nexport interface PeopleEditProcessParams {\n definition: PeopleProcessDefinition;\n repoRef?: string;\n artifactPath?: string;\n}\n\n/** `publish_process` — `confirmImpact: true` required when instances still\n * pin the previous version (RT-21 impact warning). */\nexport interface PeoplePublishProcessParams {\n confirmImpact?: boolean;\n repoRef?: string;\n}\n\n/** `supersede_process` — same impact belt as publish. */\nexport interface PeopleSupersedeProcessParams {\n confirmImpact?: boolean;\n reason?: string;\n}\n\n/** `decommission_process` — tombstone after supersede (DC-05). */\nexport interface PeopleDecommissionProcessParams {\n reason?: string;\n}\n\n/** `create_process` FACTORY — draft instance under the one-active-per-\n * (type, subject) guard; deferrals recordable only BEFORE start (US2). */\nexport interface PeopleCreateProcessParams {\n typeKey: string;\n subjectRef: string;\n deferDecisions?: Record<string, boolean>;\n}\n\n/** `cancel_process` — US6 controlled cancel; everything produced LISTED. */\nexport interface PeopleCancelProcessParams {\n reason?: string;\n}\n/* ════════════════════════════════════════════════\n * Mixin shape — composes into the IPeopleService surface\n * ════════════════════════════════════════════════ */\n\nexport interface ProcessActions {\n /** FEAT-010 — request_type authoring: edit → validate → safe-test → publish. */\n readonly reqType: {\n edit(\n uuid: string,\n params: PeopleEditRequestTypeParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n validate(uuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n safeTest(\n uuid: string,\n params?: PeopleSafeTestRequestTypeParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n publish(uuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n supersede(uuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n decommission(uuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n verify(uuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n };\n\n /** FEAT-010 — registered capability catalogue (9-field contract guard). */\n readonly capability: {\n publish(uuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n supersede(uuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n };\n\n /** FEAT-011 — policy registry handle (two faces, one artifact, one version). */\n readonly policy: {\n edit(\n uuid: string,\n params: PeopleEditPolicyParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n validate(uuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n publish(\n uuid: string,\n params?: PeoplePublishPolicyParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n supersede(uuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n archive(\n uuid: string,\n params?: PeopleArchivePolicyParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n restore(uuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n toggle(\n uuid: string,\n params: PeopleTogglePolicyParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n verify(uuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n };\n\n /** FEAT-011 — glue_rule handle: the ONLY instant operational toggle (DC-06). */\n readonly glueRule: {\n toggle(\n uuid: string,\n params?: PeopleToggleGlueRuleParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n verify(uuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n };\n\n /** FEAT-010 runtime on GENERATED per-flow CTs — needs the FEAT-015\n * registration path before row-scoped invocation works end-to-end. */\n readonly runtimeRequest: {\n /** Factory via the meta-CT alias: `POST\n * /content/types/request_type/actions/runtime_request.create`. */\n create(\n typeKey: string,\n params: PeopleRuntimeRequestCreateParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n /** Row action with a DYNAMIC key authored in the definition — runs the\n * canonical S1–S14 chain (RT-01..07 ⇒ `PEOPLE_REQ_*`). */\n invokeAction(\n uuid: string,\n actionKey: string,\n params?: Record<string, unknown>,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n };\n\n /** FEAT-014 — process_type definition lane (US1): edit → validate →\n * publish → supersede/decommission, plus the verify badge (US10). */\n readonly processType: {\n edit(\n uuid: string,\n params: PeopleEditProcessParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n validate(uuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n publish(\n uuid: string,\n params?: PeoplePublishProcessParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n supersede(\n uuid: string,\n params?: PeopleSupersedeProcessParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n decommission(\n uuid: string,\n params?: PeopleDecommissionProcessParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n verify(uuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n };\n\n /** FEAT-014 — process_instance lifecycle (US2/US4/US6): create (factory)\n * → start → cancel; retry/retry-spawn are the human-only recovery pair. */\n readonly processInstance: {\n /** FACTORY `create_process` on the process_instance CT. */\n create(params: PeopleCreateProcessParams, opts?: PeopleActionOpts): Promise<ActionResponse>;\n start(uuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n cancel(\n uuid: string,\n params?: PeopleCancelProcessParams,\n opts?: PeopleActionOpts\n ): Promise<ActionResponse>;\n retry(uuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n /** Degraded recovery — only the missing spawn part (PC-06). */\n retrySpawn(uuid: string, opts?: PeopleActionOpts): Promise<ActionResponse>;\n };\n}\n\n/* ════════════════════════════════════════════════\n * Factory — `buildProcessActions(deps)` returns the mixin\n * ════════════════════════════════════════════════ */\n\nexport function buildProcessActions(deps: InvokeDeps): ProcessActions {\n const invoke = (uuid: string, name: PeopleActionName, params?: object, opts?: PeopleActionOpts) =>\n _invokeRowAction(deps, uuid, name, params, opts);\n const factory = (\n typeName: string,\n name: PeopleActionName,\n params?: object,\n opts?: PeopleActionOpts\n ) => _invokeFactoryAction(deps, typeName, name, params, opts);\n const invokeDynamic = (uuid: string, name: string, params?: object, opts?: PeopleActionOpts) =>\n _invokeRowActionDynamic(deps, uuid, name, params, opts);\n const A = PEOPLE_ACTION_NAME;\n\n return {\n reqType: {\n edit: (uuid, params, opts) => invoke(uuid, A.EDIT_REQUEST_TYPE, params, opts),\n validate: (uuid, opts) => invoke(uuid, A.VALIDATE_REQUEST_TYPE, undefined, opts),\n safeTest: (uuid, params, opts) => invoke(uuid, A.SAFE_TEST_REQUEST_TYPE, params, opts),\n publish: (uuid, opts) => invoke(uuid, A.PUBLISH_REQUEST_TYPE, undefined, opts),\n supersede: (uuid, opts) => invoke(uuid, A.SUPERSEDE_REQUEST_TYPE, undefined, opts),\n decommission: (uuid, opts) => invoke(uuid, A.DECOMMISSION_REQUEST_TYPE, undefined, opts),\n verify: (uuid, opts) => invoke(uuid, A.VERIFY_REQUEST_TYPE, undefined, opts),\n },\n\n capability: {\n publish: (uuid, opts) => invoke(uuid, A.PUBLISH_CAPABILITY, undefined, opts),\n supersede: (uuid, opts) => invoke(uuid, A.SUPERSEDE_CAPABILITY, undefined, opts),\n },\n\n policy: {\n edit: (uuid, params, opts) => invoke(uuid, A.EDIT_POLICY, params, opts),\n validate: (uuid, opts) => invoke(uuid, A.VALIDATE_POLICY, undefined, opts),\n publish: (uuid, params, opts) => invoke(uuid, A.PUBLISH_POLICY, params, opts),\n supersede: (uuid, opts) => invoke(uuid, A.SUPERSEDE_POLICY, undefined, opts),\n archive: (uuid, params, opts) => invoke(uuid, A.ARCHIVE_POLICY, params, opts),\n restore: (uuid, opts) => invoke(uuid, A.RESTORE_POLICY, undefined, opts),\n toggle: (uuid, params, opts) => invoke(uuid, A.TOGGLE_POLICY, params, opts),\n verify: (uuid, opts) => invoke(uuid, A.VERIFY_POLICY, undefined, opts),\n },\n\n glueRule: {\n toggle: (uuid, params, opts) => invoke(uuid, A.TOGGLE_GLUE_RULE, params, opts),\n verify: (uuid, opts) => invoke(uuid, A.VERIFY_GLUE_RULE, undefined, opts),\n },\n\n processType: {\n edit: (uuid, params, opts) => invoke(uuid, A.EDIT_PROCESS, params, opts),\n validate: (uuid, opts) => invoke(uuid, A.VALIDATE_PROCESS, undefined, opts),\n publish: (uuid, params, opts) => invoke(uuid, A.PUBLISH_PROCESS, params, opts),\n supersede: (uuid, params, opts) => invoke(uuid, A.SUPERSEDE_PROCESS, params, opts),\n decommission: (uuid, params, opts) => invoke(uuid, A.DECOMMISSION_PROCESS, params, opts),\n verify: (uuid, opts) => invoke(uuid, A.VERIFY_PROCESS, undefined, opts),\n },\n\n processInstance: {\n create: (params, opts) =>\n factory(\n 'process_instance',\n A.CREATE_PROCESS,\n params as unknown as Record<string, unknown>,\n opts\n ),\n start: (uuid, opts) => invoke(uuid, A.START_PROCESS, undefined, opts),\n cancel: (uuid, params, opts) => invoke(uuid, A.CANCEL_PROCESS, params, opts),\n retry: (uuid, opts) => invoke(uuid, A.RETRY_PROCESS, undefined, opts),\n retrySpawn: (uuid, opts) => invoke(uuid, A.RETRY_SPAWN, undefined, opts),\n },\n\n runtimeRequest: {\n // Meta-CT alias — the factory lives on the `request_type` CT itself,\n // not on the generated per-flow CT: POST\n // /content/types/request_type/actions/runtime_request.create\n // (api_references §3.4 \"Create a request\"). `typeKey` rides params.\n create: (typeKey, params, opts) =>\n factory(\n PEOPLE_CONTENT_TYPE.REQUEST_TYPE,\n A.RUNTIME_REQUEST_CREATE,\n { ...params, typeKey },\n opts\n ),\n invokeAction: (uuid, actionKey, params, opts) => invokeDynamic(uuid, actionKey, params, opts),\n },\n };\n}\n","/**\n * FEAT-016 — Copilot Assist service (S-FEAT-016 §2, two-plane model D1).\n *\n * Pack-owned endpoints (registry §6.3; `eaera-people/pack/api/copilot.py`):\n * POST /api/v1/people/copilot/assist — op=start | op=record\n * GET /api/v1/people/copilot/sessions — lane/target/status projection\n *\n * Hard boundaries (spec §2.3) mirrored in the client surface:\n * - the route NEVER invokes a content action — confirm runs through the\n * engine action API under the confirming human's principal (D3). The\n * SDK therefore offers NO confirm shortcut; hosts call the regular\n * edit actions themselves and record the execution ref.\n * - the route NEVER calls a model — inference happens on the user's\n * personal agent; `transport: 'personal-agent'` is informational.\n */\nimport type { $Fetch } from 'ofetch';\n\n/* ── wire contracts (copilot.py — snake_case, mounted router) ─────────── */\n\n/** Copilot lanes (registry `_LANE_AUTHORING_SCOPES`). */\nexport type PeopleCopilotLane = 'request-type' | 'process-type' | 'policy' | 'machine-face-kind';\n\n/** Assist modes per lane (context_assembly — comprehend is read-only). */\nexport type PeopleCopilotMode = 'author' | 'amend' | 'comprehend' | (string & {});\n\n/** `op=start` request body. */\nexport interface PeopleCopilotStartParams {\n op: 'start';\n lane: PeopleCopilotLane;\n mode: PeopleCopilotMode;\n /** Content uuid of the T1 target row (request_type / process_type / policy). */\n target_ref: string;\n}\n\n/** Grounding bundle returned by `op=start` (advisory context only). */\nexport interface PeopleCopilotBundle {\n lane: string;\n mode: string;\n target_ref: string;\n rendered_grounding: string;\n catalogue_pin: string;\n schema_ref?: string | null;\n example_refs: string[];\n dry_run?: Record<string, unknown> | null;\n validation_errors: string[];\n status_warning?: string | null;\n prompt_hash: string;\n}\n\n/** `op=start` response. */\nexport interface PeopleCopilotStartResult {\n conversation_id: string;\n bundle: PeopleCopilotBundle;\n prompt_hash: string;\n transport: string;\n advisory: string;\n}\n\n/** A pending/confirmed/discarded proposal on the ledger (D2 contract). */\nexport interface PeopleCopilotProposal {\n id: string;\n kind: string;\n summary: string;\n proposal_hash: string;\n status: 'pending' | 'confirmed' | 'discarded' | (string & {});\n confirm_actor?: string | null;\n execution_ref?: string | null;\n commit_sha?: string | null;\n}\n\n/** `op=record` request body — mirror one user turn and/or transition a\n * proposal and/or end the session (pending ⇒ discarded on end). */\nexport interface PeopleCopilotRecordParams {\n op: 'record';\n conversation_id: number | string;\n /** Only user-authored turns accepted without a gateway receipt. */\n turn?: { role: 'user'; content: string };\n proposal?: {\n id: string;\n kind?: 'edit';\n summary?: string;\n /** The authored tree — `diff.after` is hashed into `proposal_hash`. */\n diff?: { after: Record<string, unknown> };\n status: 'pending' | 'confirmed' | 'discarded';\n /** Required when status=confirmed — the HUMAN edit execution uuid\n * (host ran the real action; the route verifies provenance). */\n execution_ref?: string;\n commit_sha?: string;\n };\n end?: boolean;\n}\n\n/** `op=record` response. */\nexport interface PeopleCopilotRecordResult {\n conversation_id: string;\n status: 'active' | 'completed';\n metadata_update_mode: 'metadata' | 'none';\n message: boolean;\n proposal: { id: string; status: string; ok: boolean } | null;\n ended: boolean;\n}\n\n/** One assist session row (E4a projection). */\nexport interface PeopleCopilotSession {\n conversation_id: string;\n user_id: number;\n status: 'active' | 'completed' | (string & {});\n lane: string;\n target_ref: string;\n mode: string;\n context_refs: Record<string, unknown>;\n proposals: PeopleCopilotProposal[];\n total_tokens: number;\n total_cost_usd: number;\n created_at: string | null;\n completed_at: string | null;\n}\n\n/** `GET /sessions` response. */\nexport interface PeopleCopilotSessionsResult {\n items: PeopleCopilotSession[];\n count: number;\n cursor: string | null;\n has_more: boolean;\n}\n\nexport interface IPeopleCopilotService {\n /** `op=start` — lane permission + spend-cap + context assembly; creates\n * the assist ledger row on engine `llm_conversations`. */\n start(params: PeopleCopilotStartParams): Promise<PeopleCopilotStartResult>;\n /** `op=record` — mirror a user turn / transition a proposal / end. */\n record(params: PeopleCopilotRecordParams): Promise<PeopleCopilotRecordResult>;\n /** Lane/target/status projection over the caller's assist ledger. */\n sessions(query?: {\n lane?: string;\n targetRef?: string;\n status?: string;\n limit?: number;\n cursor?: string;\n }): Promise<PeopleCopilotSessionsResult>;\n}\n\nexport interface IPeopleCopilotServiceOptions {\n /** The CMS `$Fetch` instance (one of `sdk.apis`). */\n api: $Fetch;\n}\n\nexport const PEOPLE_COPILOT_ENDPOINT = {\n ASSIST: '/api/v1/people/copilot/assist',\n SESSIONS: '/api/v1/people/copilot/sessions',\n} as const;\n\nexport function createPeopleCopilotService(\n opts: IPeopleCopilotServiceOptions\n): IPeopleCopilotService {\n const { api } = opts;\n return {\n async start(params) {\n return api<PeopleCopilotStartResult>(PEOPLE_COPILOT_ENDPOINT.ASSIST, {\n method: 'POST',\n body: params as unknown as Record<string, unknown>,\n });\n },\n async record(params) {\n return api<PeopleCopilotRecordResult>(PEOPLE_COPILOT_ENDPOINT.ASSIST, {\n method: 'POST',\n body: params as unknown as Record<string, unknown>,\n });\n },\n async sessions(query = {}) {\n const q: Record<string, unknown> = {};\n if (query.lane) q.lane = query.lane;\n if (query.targetRef) q.target_ref = query.targetRef;\n if (query.status) q.status = query.status;\n if (query.limit != null) q.limit = query.limit;\n if (query.cursor) q.cursor = query.cursor;\n return api<PeopleCopilotSessionsResult>(PEOPLE_COPILOT_ENDPOINT.SESSIONS, {\n query: Object.keys(q).length ? q : undefined,\n });\n },\n };\n}\n","/**\n * FEAT-015 pack-ops domain — projection reads + engine pack mutations.\n *\n * Reads hit the People pack projections (`/api/v1/people/pack-ops/*` —\n * read-only, scope `platform:pack:view`); mutations delegate to the engine\n * pack API (`/api/v1/packs/*` — the mutation authority, api_references §6.4\n * \"the engine install route remains the mutation authority\").\n *\n * The engine pack routes answer snake_case dicts (mounted routers, not the\n * camel content API); wire keys below are typed snake_case accordingly and\n * sent snake_case where the route documents them that way.\n *\n * Source of truth: be-docs/api_references.md §6.4 + eaera-cms\n * `eaera_cms/packs/routes.py` (install/rollback/archive/audit-log) and\n * `eaera-people/pack/api/packs.py` (projections).\n */\nimport type { $Fetch } from 'ofetch';\nimport {\n PACKS_AUDIT_ENDPOINT,\n PACKS_ENDPOINT,\n PEOPLE_ENDPOINT,\n} from '../../../common/constants/people.constant';\nimport type {\n PeoplePackAuditEntry,\n PeoplePackAuditQuery,\n PeoplePackConflictEntry,\n PeoplePackConflictPreview,\n PeoplePackImpact,\n PeoplePackPreflight,\n PeoplePackPreflightQuery,\n PeoplePackSyncLog,\n PeoplePackUpgradeCheck,\n PeoplePackOpsRegistry,\n} from './packops.type';\n\nexport interface IPeoplePackOpsServiceOptions {\n /** The CMS `$Fetch` instance (one of `sdk.apis`). */\n api: $Fetch;\n}\n\n/** FEAT-015 — pack-operation reads (projections) + engine pack mutations. */\nexport interface IPeoplePackOpsService {\n /** `GET /people/pack-ops/registry` — CMS packs + template catalog. */\n registry(): Promise<PeoplePackOpsRegistry>;\n /** `GET /people/pack-ops/preflight?slug=&source=&ref=` — no install. */\n preflight(query: PeoplePackPreflightQuery): Promise<PeoplePackPreflight>;\n /** `GET /people/pack-ops/{slug}/upgrade-check` — installed vs branch. */\n upgradeCheck(slug: string): Promise<PeoplePackUpgradeCheck>;\n /** `GET /people/pack-ops/{slug}/impact?ref=` — read-only target preview. */\n impact(slug: string, ref: string): Promise<PeoplePackImpact>;\n /** `GET /packs/audit-log` — every pack transition with actor (US7). */\n auditLog(query?: PeoplePackAuditQuery): Promise<PeoplePackAuditEntry[]>;\n\n /* ── engine pack mutations (the authority — 202/409 contracts) ── */\n /** `POST /packs/{slug}/install?ref=` — E8a gates run server-side. */\n install(slug: string, ref?: string): Promise<Record<string, unknown>>;\n /** `POST /packs` — register a pack (git remote + metadata) before install\n * (registry-catalog entries have no CMS row yet; 409 when the slug\n * exists — treat as registered and continue to preflight/install). */\n register(params: {\n slug: string;\n name?: string;\n source: string;\n branch?: string;\n }): Promise<Record<string, unknown>>;\n /** `POST /packs/{slug}/rollback?to_version=` — 202 accepted. */\n rollback(slug: string, toVersion?: string): Promise<Record<string, unknown>>;\n /**\n * `DELETE /packs/{slug}` (archive = uninstall) — engine belt rejects 409\n * `PEOPLE_PACK_REFERENCED_CONTENT` while CTs still own content unless\n * `force: true` (purge flow, two-layer confirm portal-side).\n */\n uninstall(slug: string, force?: boolean): Promise<void>;\n /**\n * `PUT /packs/{slug}` — metadata update. Disable is the People-pack\n * convention `metadata.kind`-preserving flag write\n * (`people.pack.disabled`, settings §6.1): soft-off, instantly reversible.\n */\n updateMetadata(\n slug: string,\n patch: { disabled?: boolean; metadata?: Record<string, unknown> }\n ): Promise<Record<string, unknown>>;\n\n /* ── template propagation + sync (US6 — engine conflict lane) ── */\n /** `GET /packs/{slug}/conflicts` — git-vs-DB drift per artifact. */\n conflicts(slug: string): Promise<PeoplePackConflictEntry[]>;\n /** `GET /packs/{slug}/conflicts/{artifact_id}/preview` — 3-way merge. */\n conflictPreview(slug: string, artifactId: number): Promise<PeoplePackConflictPreview>;\n /**\n * `POST /packs/{slug}/conflicts/{conflict_id}/resolve` — human decision.\n * `merge_manual` flags the artifact for human merge; neither side is\n * force-overwritten (US6: conflict → surface for human).\n */\n resolveConflict(\n slug: string,\n conflictId: number,\n resolution: 'git_wins' | 'db_wins' | 'merge_manual'\n ): Promise<{ conflict_id: number; resolution: string; resolved: boolean }>;\n /** `GET /packs/{slug}/sync-log` — cursor-paginated sync history. */\n syncLog(slug: string, query?: { cursor?: string; limit?: number }): Promise<PeoplePackSyncLog>;\n /** `GET /packs/{slug}/sync-jobs/{job_id}` — one job's detail. */\n syncJob(slug: string, jobId: string): Promise<Record<string, unknown>>;\n}\n\n/** Projection wire keys are snake_case — send query params as documented. */\nconst _preflightQuery = (q: PeoplePackPreflightQuery): Record<string, string> => {\n const out: Record<string, string> = { slug: q.slug, source: q.source };\n if (q.ref) out.ref = q.ref;\n return out;\n};\n\nconst _auditQuery = (q: PeoplePackAuditQuery = {}): Record<string, unknown> => {\n const out: Record<string, unknown> = {};\n if (q.action) out.action = q.action;\n if (q.resourceId) out.resource_id = q.resourceId;\n if (q.actorId != null) out.actor_id = q.actorId;\n if (q.limit != null) out.limit = q.limit;\n return out;\n};\n\nexport function createPeoplePackOpsService(\n opts: IPeoplePackOpsServiceOptions\n): IPeoplePackOpsService {\n const { api } = opts;\n return {\n async registry() {\n return api<PeoplePackOpsRegistry>(PEOPLE_ENDPOINT.PACK_OPS_REGISTRY);\n },\n async preflight(query) {\n return api<PeoplePackPreflight>(PEOPLE_ENDPOINT.PACK_OPS_PREFLIGHT, {\n query: _preflightQuery(query),\n });\n },\n async upgradeCheck(slug) {\n return api<PeoplePackUpgradeCheck>(PEOPLE_ENDPOINT.packOpsUpgradeCheck(slug));\n },\n async impact(slug, ref) {\n return api<PeoplePackImpact>(PEOPLE_ENDPOINT.packOpsImpact(slug), { query: { ref } });\n },\n async auditLog(query) {\n return api<PeoplePackAuditEntry[]>(PACKS_AUDIT_ENDPOINT, {\n query: _auditQuery(query),\n });\n },\n\n async install(slug, ref) {\n const query = ref ? { ref } : undefined;\n return api<Record<string, unknown>>(`${PACKS_ENDPOINT}/${encodeURIComponent(slug)}/install`, {\n method: 'POST',\n query,\n });\n },\n async register(params) {\n return api<Record<string, unknown>>(PACKS_ENDPOINT, {\n method: 'POST',\n body: {\n slug: params.slug,\n ...(params.name ? { name: params.name } : {}),\n source: params.source,\n ...(params.branch ? { branch: params.branch } : {}),\n },\n });\n },\n async rollback(slug, toVersion) {\n const query = toVersion ? { to_version: toVersion } : undefined;\n return api<Record<string, unknown>>(\n `${PACKS_ENDPOINT}/${encodeURIComponent(slug)}/rollback`,\n { method: 'POST', query }\n );\n },\n async uninstall(slug, force = false) {\n await api(`${PACKS_ENDPOINT}/${encodeURIComponent(slug)}`, {\n method: 'DELETE',\n body: force ? { force: true } : undefined,\n });\n },\n async updateMetadata(slug, patch) {\n const metadata = {\n ...(patch.metadata ?? {}),\n ...(patch.disabled !== undefined ? { 'people.pack.disabled': patch.disabled } : {}),\n };\n return api<Record<string, unknown>>(`${PACKS_ENDPOINT}/${encodeURIComponent(slug)}`, {\n method: 'PUT',\n body: { metadata },\n });\n },\n\n async conflicts(slug) {\n return api<PeoplePackConflictEntry[]>(\n `${PACKS_ENDPOINT}/${encodeURIComponent(slug)}/conflicts`\n );\n },\n async conflictPreview(slug, artifactId) {\n return api<PeoplePackConflictPreview>(\n `${PACKS_ENDPOINT}/${encodeURIComponent(slug)}/conflicts/${artifactId}/preview`\n );\n },\n async resolveConflict(slug, conflictId, resolution) {\n return api<{ conflict_id: number; resolution: string; resolved: boolean }>(\n `${PACKS_ENDPOINT}/${encodeURIComponent(slug)}/conflicts/${conflictId}/resolve`,\n { method: 'POST', body: { resolution } }\n );\n },\n async syncLog(slug, query = {}) {\n const q: Record<string, unknown> = {};\n if (query.cursor) q.cursor = query.cursor;\n if (query.limit != null) q.limit = query.limit;\n return api<PeoplePackSyncLog>(`${PACKS_ENDPOINT}/${encodeURIComponent(slug)}/sync-log`, {\n query: Object.keys(q).length ? q : undefined,\n });\n },\n async syncJob(slug, jobId) {\n return api<Record<string, unknown>>(\n `${PACKS_ENDPOINT}/${encodeURIComponent(slug)}/sync-jobs/${encodeURIComponent(jobId)}`\n );\n },\n };\n}\n","/**\n * People Hub domain service — typed surface for the `eaera-people` pack.\n *\n * The service is split across 4 business-domain folders; this facade composes\n * them into one service object on `sdk.people.*` (per SDK convention — the\n * service is one typed surface from the consumer's view).\n *\n * legal/ — FEAT-001 (Company & Legal Entity) + FEAT-002 (Org Structure)\n * perms/ — FEAT-007 (Access Catalog) + FEAT-008 (Role Assignment)\n * identity/ — FEAT-009 (Identity Provisioning & Provider Sync)\n * process/ — FEAT-010/011/014 (Request Engine + Policy + Process Container)\n *\n * No-CT features:\n * - FEAT-012 (Templates) — engine `notification_templates` admin API —\n * NOT a People service surface.\n * - FEAT-015 (Pack Management) — engine pack API + the 4 pack-ops\n * projections, composed as `sdk.people.packOps.*`.\n * - FEAT-016 (AI-Assisted Authoring) — engine `llm_conversations` +\n * planned `/people/copilot/*` endpoints (gap #7 in fe-data-design).\n *\n * The service does NOT participate in mock mode — the pack backend is live,\n * so every call goes through `api` regardless of `sdk.setMock()`. Same posture\n * as `gov`.\n *\n * Usage:\n * await sdk.people.registerLegalEntity({code, display_name, timezone})\n * await sdk.people.scheduleBranch(branchUuid, {effective_from})\n * await sdk.people.runAccessAudit({ mode: 'who-has-permission', target: '...' })\n * await sdk.people.getProvisionQueue({ state: 'failed' })\n * await sdk.people.buildPlan({ employment_ref, ending_plan_ref, ending_facts })\n */\n\nimport type { $Fetch } from 'ofetch';\nimport { _invokeFactoryAction, _invokeRowAction } from './_invoke';\nimport { buildLegalActions, type LegalAndOrgActions } from './legal/actions';\nimport { type PeopleAccessAuditQuery, type PeopleAccessAuditResult } from './perms/projections';\nimport { buildPermsActions, type PermsActions } from './perms/actions';\nimport {\n type PeopleProvisionQueue,\n type PeopleProvisionQueueQuery,\n type PeopleProviderHealth,\n} from './identity/projections';\nimport { buildIdentityActions, type IdentityActions } from './identity/actions';\nimport { buildProcessActions, type ProcessActions } from './process/actions';\nimport { createPeopleCopilotService, type IPeopleCopilotService } from './copilot';\nimport { createPeoplePackOpsService, type IPeoplePackOpsService } from './packops';\n\nexport interface IPeopleServiceOptions {\n /** The CMS `$Fetch` instance (one of `sdk.apis`). */\n api: $Fetch;\n}\n\n/**\n * People service surface — user-callable actions across the 4 domain mixins\n * + 3 REST projections. Composed flat for the legacy domains; the process\n * domain ships grouped sub-objects (`reqType` / `capability` / `policy` /\n * `glueRule` / `processType` / `processInstance` / `runtimeRequest`) so the\n * shared verbs (`validate`, `publish`, `verify`) never collide.\n */\nexport interface IPeopleService\n extends LegalAndOrgActions, PermsActions, IdentityActions, ProcessActions {\n /* ─── pack REST projections (3 of 9 shipped, api_references §6) ─── */\n runAccessAudit(query: PeopleAccessAuditQuery): Promise<PeopleAccessAuditResult>;\n getProviderHealth(key: string): Promise<PeopleProviderHealth>;\n getProvisionQueue(query?: PeopleProvisionQueueQuery): Promise<PeopleProvisionQueue>;\n /* ─── FEAT-015 pack-ops (4 projections + engine mutations) ─── */\n readonly packOps: IPeoplePackOpsService;\n /* ─── FEAT-016 copilot assist (advisory lane — never a content action) ─── */\n readonly copilot: IPeopleCopilotService;\n}\n\n/* ───────────────────────────────────────────────────────────────────────\n Factory — composes the 4 domain mixins into IPeopleService.\n ─────────────────────────────────────────────────────────────────────── */\n\nexport function createPeopleService(opts: IPeopleServiceOptions): IPeopleService {\n const { api } = opts;\n\n // Shared `_invoke` deps every domain uses. Keep actionEndpoint centralized\n // so a future backend rename (e.g. v2 routing) lands in one place.\n const invokeDeps = {\n api,\n actionEndpoint: (uuid: string, actionName: string): string => _actionEndpoint(uuid, actionName),\n };\n\n return {\n ...buildLegalActions(invokeDeps),\n ...buildPermsActions(invokeDeps),\n ...buildIdentityActions(invokeDeps),\n ...buildProcessActions(invokeDeps),\n /* ─── FEAT-015 ─── */\n packOps: createPeoplePackOpsService({ api }),\n /* ─── FEAT-016 ─── */\n copilot: createPeopleCopilotService({ api }),\n\n /* ─── projections ─── */\n\n async runAccessAudit(query) {\n return api<PeopleAccessAuditResult>('/api/v1/people/access/audit', { query });\n },\n\n async getProviderHealth(key) {\n return api<PeopleProviderHealth>(`/api/v1/people/providers/${key}/health`);\n },\n\n async getProvisionQueue(query = {}) {\n const q: Record<string, string> = {};\n if (query.provider) q.provider = query.provider;\n if (query.employment) q.employment = query.employment;\n if (query.state) q.state = query.state;\n return api<PeopleProvisionQueue>('/api/v1/people/provisioning/queue', { query: q });\n },\n };\n}\n\n/** Action endpoint helper — engine's generic `/api/v1/content/{uuid}/actions/{name}`. */\nfunction _actionEndpoint(uuid: string, actionName: string): string {\n return `/api/v1/content/${uuid}/actions/${actionName}`;\n}\n\n// Re-export the public action helpers so callers can use the same invoke\n// signature in extension code if they need to call a People action from a\n// custom router (uncommon but supported).\nexport { _invokeFactoryAction, _invokeRowAction };\n","/**\n * Content-rules endpoints (`eaera_cms/core/rules/routes.py`).\n */\nexport const RULES_ENDPOINT = {\n BASE: '/api/v1/rules',\n detail: (uuid: string): string => `/api/v1/rules/${uuid}`,\n /** POST /api/v1/rules/signals/fire — manually fire a signal rule. */\n fireSignal: '/api/v1/rules/signals/fire',\n} as const;\n\n/** Rule list query defaults. */\nexport const RULES_DEFAULTS = {\n LIST_LIMIT: 100,\n} as const;\n","/**\n * Constants for `conditionType: 'llm_agent'` rule configuration.\n *\n * The `llm_agent` rule is composed of two parts:\n * - **Prompt** — the user-facing Skill entity (`/api/v1/llm/prompts`).\n * Owned by the Skills page. The rule references it via\n * `trigger.sourceConfig.promptName`.\n * - **Rule** — the `ContentRule` (owned by the Fixed Rules editor).\n * Carries trigger mode, read-only MCP `queryTools` allowlist,\n * `executionParams.llmEval` knobs (`maxIterations` / `budgetUsd`),\n * and the `executionType`/`executionParams` shape (single action or\n * action chain — same shape the fixed-rule builder emits).\n *\n * Reference: `risk-rules-api-guide.md` §7.B (LLM evaluator behaviour),\n * §7.B Sample 7B.5 (canonical llm_agent payload), §8.B (rule editor knobs).\n */\n\n/** The full read-only MCP tool set the evaluator accepts. The dashboard\n * only ever offers these — the engine rejects anything else with\n * `tool '…' is not available (read-only)`. */\nexport const LLM_QUERY_TOOL = {\n CONTENT_QUERY: 'content_query',\n CONTENT_GET: 'content_get',\n EXECUTE_REPORT: 'execute_report',\n GET_SCHEMA: 'get_schema',\n LIST_CTS: 'list_cts',\n CH_QUERY: 'ch_query',\n} as const;\n\n/** Read-only MCP tool union — derived from {@link LLM_QUERY_TOOL}. */\nexport type LlmQueryTool = (typeof LLM_QUERY_TOOL)[keyof typeof LLM_QUERY_TOOL];\n\n/** Human-labelled option for the queryTools multi-select. */\nexport interface LlmQueryToolOption {\n label: string;\n value: LlmQueryTool;\n /** Short hint shown under the label — explains what the tool does. */\n hint: string;\n}\n\n/** All {@link LlmQueryTool} options in the canonical order. */\nexport const LLM_QUERY_TOOL_OPTIONS: readonly LlmQueryToolOption[] = [\n {\n label: 'content_query',\n value: LLM_QUERY_TOOL.CONTENT_QUERY,\n hint: 'List / filter content rows (DSL: eq/neq/gt/gte/lt/lte/in/not_in/like/contains/between/is_null/is_not_null/jsonb_path)',\n },\n {\n label: 'content_get',\n value: LLM_QUERY_TOOL.CONTENT_GET,\n hint: 'Fetch a single content row by uuid',\n },\n {\n label: 'execute_report',\n value: LLM_QUERY_TOOL.EXECUTE_REPORT,\n hint: 'Run a registered report and return its output',\n },\n {\n label: 'get_schema',\n value: LLM_QUERY_TOOL.GET_SCHEMA,\n hint: 'Return the content-type schema for a given type',\n },\n {\n label: 'list_cts',\n value: LLM_QUERY_TOOL.LIST_CTS,\n hint: 'List registered content types',\n },\n {\n label: 'ch_query',\n value: LLM_QUERY_TOOL.CH_QUERY,\n hint: 'Read aggregate metrics from ClickHouse (whitelisted tables: account_metric_by_deal, account_metric_daily, position_metric_by_deal, account_state, deal, account_symbol_metric_by_deal). Structured query — no raw SQL, only whitelisted columns',\n },\n];\n\n/** The minimum allowlist the engine recommends for scan-mode rules. */\nexport const DEFAULT_LLM_QUERY_TOOLS: readonly LlmQueryTool[] = [\n LLM_QUERY_TOOL.CONTENT_QUERY,\n LLM_QUERY_TOOL.CONTENT_GET,\n];\n\n/** Per-rule LLM-eval knobs. Bounds are enforced by\n * `eaera_cms/core/rules/llm_evaluator.py`: `maxIterations` defaults to 5\n * and is hard-capped at 20; `budgetUsd` defaults to 1.0 and is enforced\n * before every LLM call; `maxTokens` caps the per-completion token output\n * (no temperature — the backend does not accept it). */\nexport const LLM_EVAL_BOUNDS = {\n maxIterations: { min: 1, default: 5, max: 20 },\n budgetUsd: { min: 0, default: 1.0 },\n maxTokens: { min: 1, default: 1024, max: 32000 },\n} as const;\n\n/** Shape of `executionParams.llmEval` — the engine reads both fields at\n * `LLMConditionEvaluator.run_iteration()` time. */\nexport interface LlmEval {\n maxIterations: number;\n budgetUsd: number;\n /** Max tokens per completion. */\n maxTokens?: number;\n}\n\n/** Read `executionParams.llmEval` from a stored rule, with defaults. */\nexport const llmEvalOf = (executionParams: Record<string, unknown> | null | undefined): LlmEval => {\n const raw = (executionParams as { llmEval?: Partial<LlmEval> } | null | undefined)?.llmEval;\n return {\n maxIterations:\n typeof raw?.maxIterations === 'number'\n ? raw.maxIterations\n : LLM_EVAL_BOUNDS.maxIterations.default,\n budgetUsd:\n typeof raw?.budgetUsd === 'number' ? raw.budgetUsd : LLM_EVAL_BOUNDS.budgetUsd.default,\n maxTokens:\n typeof raw?.maxTokens === 'number' ? raw.maxTokens : LLM_EVAL_BOUNDS.maxTokens.default,\n };\n};\n\n/** Read `trigger.sourceConfig.queryTools` from a stored trigger.\n *\n * ⚠️ **Advisory only.** The dashboard persists the per-rule allowlist\n * here, but `LLMConditionEvaluator` (`eaera-cms/core/rules/llm_evaluator.py`)\n * uses its own hardcoded `_readonly_tool_names()` set today — the per-rule\n * value is NOT yet honoured by the engine. The UI shows the checkbox grid\n * and persists the choice so it's ready for the day the backend wires it\n * through; until then, restricting this list has no runtime effect on the\n * agent. Do not promise the user otherwise in the UI copy. */\nexport const queryToolsOf = (\n trigger: Record<string, unknown> | null | undefined\n): LlmQueryTool[] => {\n const raw = (trigger as { sourceConfig?: { queryTools?: unknown } } | null | undefined)\n ?.sourceConfig?.queryTools;\n if (!Array.isArray(raw)) return [...DEFAULT_LLM_QUERY_TOOLS];\n return raw.filter((t): t is LlmQueryTool =>\n Object.values(LLM_QUERY_TOOL).includes(t as LlmQueryTool)\n );\n};\n\n/** Read `trigger.sourceConfig.promptName` from a stored trigger. */\nexport const promptNameOf = (trigger: Record<string, unknown> | null | undefined): string => {\n const raw = (trigger as { sourceConfig?: { promptName?: unknown } } | null | undefined)\n ?.sourceConfig?.promptName;\n return typeof raw === 'string' ? raw : '';\n};\n","/**\n * Content-rule types — mirrors the LIVE behaviour of\n * `eaera_cms/core/rules/routes.py` (route + `ContentRuleResponse`) and\n * `TriggerAPIService.create_trigger()`.\n *\n * NOTE: the route accepts a FLAT schema (`TriggerCreateRequest`, `extra: allow`)\n * and `create_trigger()` reads flat top-level keys (`contentType`,\n * `conditionType`, `conditionExpr`, `executionType`, `executionParams`).\n * The nested `RuleCreateRequest` in `definitions.py` is NOT wired into the\n * route, so nested objects are dropped. These payloads use the flat shape that\n * actually works. The service also scopes on `contentType`, not `typeName`.\n *\n * All field names use camelCase to match the backend API response.\n */\n\nimport type { SerializationFormat } from '../../common/constants/http.constant';\nimport type { TriggerTypeValue } from './triggers';\n\n// Re-export so existing `import { TriggerType } from './rules.type'` keeps\n// resolving at the barrel. The canonical definition lives in `./triggers.ts`.\nexport type TriggerType = TriggerTypeValue;\n/**\n * Wire-level `trigger_type` union (schema-validated by\n * `eaera_cms/core/rules/definitions.py:33-39`).\n *\n * Note this is **different** from the `source_type` value the engine matcher\n * reads (`event_dto | cron | batch | stream | signal`). The canonical\n * pair for event rules is `trigger_type: \"event\"` +\n * `source_type: \"event_dto\"` — see `packs/registry.py:463-470` and the\n * SDK `TRIGGER_TYPE` / `TRIGGER_MODE` constants in `triggers.ts`.\n *\n * Aliased to `TriggerType` via the `index.ts` barrel for backwards\n * compatibility with consumers that imported it from this module.\n */\n// The actual definition lives in `./triggers.ts` as `TriggerTypeValue`.\n// We re-export it through the barrel as `TriggerType`.\n\n/**\n * One row in `trigger.conditions[]` — the flat AND list the engine evaluates\n * when `conditionType` is `'trigger_conds'` or omitted. The dashboard's visual\n * tree builder (`LogicTree.vue`) emits these; backend-authored packs (`*.yaml`)\n * emit them too. `field` is either a CH catalog key (`account_state.equity`),\n * a dotted event-payload path (`deal.profit`), or a flat event field\n * (`profit` — engine fallback).\n *\n * `operator` is one of the word forms exposed by the SDK\n * (`CONDITION_OPERATORS`: `gt`/`gte`/`lt`/`lte`/`eq`/`ne`/`in`/`not_in`/\n * `contains`/`startswith`/`endswith`/`is_null`/`is_not_null`) plus the\n * cron-specific `sum_within_days` (carries a numeric `days` window).\n *\n * `value` shape depends on the operator — see\n * `cms-sdk/src/services/rules/conditions.ts:CONDITION_OPERATOR_VALUE_KINDS`:\n * - numeric operators → number\n * - `in` / `not_in` → array of primitives\n * - string operators → string (entity is coerced via `str()`)\n * - `is_null` / `is_not_null` → ignored (send `null`)\n * - `sum_within_days` → number (threshold), `days` is the window\n */\nexport interface TriggerConditionRow {\n field: string;\n operator: string;\n value: unknown;\n /** Cron-only: window size for `sum_within_days`. */\n days?: number;\n}\n\nexport interface TriggerDefinition {\n /**\n * The backend SQL filter (`trigger_api.py:fire_signal`) and engine matcher\n * (`engine.py:_match_trigger`) read `trigger.source_type`, NOT\n * `trigger.trigger_type`. Builders in `triggers.ts` emit BOTH\n * `sourceType` and `triggerType` (camelCase) so the CMS casing middleware\n * produces both keys in the stored JSONB.\n *\n * IMPORTANT: for event rules the two values DIVERGE — see the canonical\n * contract documented on `TRIGGER_MODE` / `TRIGGER_TYPE` in\n * `cms-sdk/src/services/rules/triggers.ts`. `sourceType: 'event_dto'`\n * (engine matcher), `triggerType: 'event'` (schema validator). Earlier\n * SDK builds emitted both as `'event_dto'`, which drifted from the\n * pack-authored contract.\n */\n sourceType?: 'event_dto' | 'cron' | 'batch' | 'stream' | 'signal';\n triggerType: TriggerType;\n topic?: string;\n /**\n * Top-level AND condition list. Backend reads this when\n * `conditionType` is `'trigger_conds'` (or omitted). Dashboard tree\n * builder emits here; the Fixed Rules editor's `trigger_conds` path\n * goes through here too.\n */\n conditions?: TriggerConditionRow[];\n /**\n * Type-specific trigger config ONLY — e.g. `signalName`, `topic`, `schedule`,\n * `timezone`, `streamName`, `windowSeconds`, `contentTypes`, `eventTypes`,\n * `promptName` (LLM rules), `queryTools` (LLM rules).\n *\n * There is **no `scope` concept** on a rule. A rule is scoped by `contentType`\n * + trigger-source matching + the `conditionExpr`; do not write a `scope`\n * (`groups`/`symbols`/`logins`/`emails`) key here — the backend ignores it.\n */\n sourceConfig: Record<string, unknown>;\n}\n\n/** Value-level constants for ConditionType — single source of truth. */\nexport const CONDITION_TYPE = {\n EXPRESSION: 'expression',\n CODE: 'code',\n LLM_AGENT: 'llm_agent',\n TRIGGER_CONDS: 'trigger_conds',\n} as const;\n\n/** Condition type — derived from {@link CONDITION_TYPE}. */\nexport type ConditionType = (typeof CONDITION_TYPE)[keyof typeof CONDITION_TYPE];\n\n/** Value-level constants for ExecutionType — single source of truth. */\nexport const EXECUTION_TYPE = {\n ACTION: 'action',\n SET_FIELD: 'set_field',\n NOTIFY: 'notify',\n TRANSITION: 'transition',\n HTTP_CALL: 'http_call',\n CHAIN: 'chain',\n} as const;\n\n/** Execution type — derived from {@link EXECUTION_TYPE}. */\nexport type ExecutionType = (typeof EXECUTION_TYPE)[keyof typeof EXECUTION_TYPE];\n\n/**\n * One action invocation. The dispatcher reads `actionName` and a **nested**\n * `params`; e.g. a group move is `{ actionName: 'change_group', params: { newGroup } }`\n * and a leverage change is `{ actionName: 'change_leverage', params: { newLeverage } }`.\n */\nexport interface ActionExecutionParams {\n actionName: string;\n /** Action-specific payload (`{ newGroup }` / `{ newLeverage }`). */\n params: Record<string, unknown>;\n}\n\n/**\n * One step in an ordered action chain. Each step dispatches via its own\n * `type` (any `ExecutionType` except `chain`); an `action` step uses\n * {@link ActionExecutionParams} as its `params`.\n */\nexport interface ChainStep {\n type: Exclude<ExecutionType, typeof EXECUTION_TYPE.CHAIN>;\n params: Record<string, unknown>;\n}\n\n/**\n * Flat execution params stored on `ContentRule.executionParams`. The backend\n * dispatcher (`dispatch_target`) selects behaviour by `executionType`:\n *\n * - `action` → `{ actionName, params }`\n * - `set_field` → `{ field, value }`\n * - `notify` → `{ data?, notificationType?, recipient? }`\n * - `transition`→ `{ transitionName, params }`\n * - `http_call` → `{ url, method?, params?, headers?, timeout? }`\n * - `chain` → `{ steps: ChainStep[], stepParams?: Record<string, Record<string, unknown>> }`\n *\n * Action parameters are **nested** under `params` — `{ actionName, newGroup }`\n * (flat) is silently dropped. See {@link ActionExecutionParams}.\n */\nexport interface ExecutionParams {\n // action\n actionName?: string;\n params?: Record<string, unknown>;\n // set_field\n field?: string;\n value?: unknown;\n // notify\n data?: Record<string, unknown>;\n notificationType?: string;\n recipient?: string;\n // transition\n transitionName?: string;\n // http_call\n url?: string;\n method?: string;\n headers?: Record<string, string>;\n timeout?: number;\n // chain\n steps?: ChainStep[];\n stepParams?: Record<string, Record<string, unknown>>;\n [key: string]: unknown;\n}\n\n/** POST /api/v1/rules body (flat — matches `create_trigger()`). */\nexport interface RuleCreatePayload {\n name: string;\n description?: string;\n /** `null`/omitted = global rule. Backend reads `contentType`, not `typeName`. */\n contentType?: string | null;\n trigger: TriggerDefinition;\n /** Default `'expression'`. */\n conditionType?: ConditionType;\n /** Inline Python expression (conditionType=expression). */\n conditionExpr?: string | null;\n /** Full Python code block (conditionType=code). */\n conditionCode?: string | null;\n /** Default `'action'`. */\n executionType?: ExecutionType;\n executionParams?: ExecutionParams | null;\n cronSchedule?: string | null;\n cronTimeZone?: string | null;\n /** Default `0`. */\n priority?: number;\n /** Default `true`. */\n isActive?: boolean;\n /** 1-3600, default 30. */\n timeoutSeconds?: number;\n}\n\n/** PUT /api/v1/rules/{uuid} body (all optional, same flat keys). */\nexport interface RuleUpdatePayload {\n name?: string;\n description?: string;\n contentType?: string | null;\n trigger?: TriggerDefinition;\n conditionType?: ConditionType;\n conditionExpr?: string | null;\n conditionCode?: string | null;\n executionType?: ExecutionType;\n executionParams?: ExecutionParams | null;\n priority?: number;\n isActive?: boolean;\n timeoutSeconds?: number;\n}\n\n/** GET /api/v1/rules, GET /api/v1/rules/{uuid} (`ContentRuleResponse`). */\nexport interface ContentRule {\n id: number;\n uuid: string;\n name: string;\n description?: string | null;\n /** Echoes `contentType` on the response. */\n typeName?: string | null;\n /** Default `'python'`. */\n codeType: string;\n /** AES-256-GCM encrypted. */\n conditionCode?: string | null;\n conditionType?: ConditionType;\n conditionExpr?: string | null;\n /** Inline trigger JSONB (`{ sourceType, sourceConfig, conditions, settings }`). */\n trigger: Record<string, unknown>;\n executionType: ExecutionType;\n executionParams?: Record<string, unknown> | null;\n priority: number;\n isActive: boolean;\n timeoutSeconds: number;\n /** Cron: top-level normalized schedule. Dashboard emits via\n * `trigger.sourceConfig.schedule`; the backend reads both. */\n cronSchedule?: string | null;\n cronTimezone?: string | null;\n /** ISO 8601. */\n nextTriggerAt?: string | null;\n /** ISO 8601 — FEAT-004 sidebar \"last triggered\". */\n lastFiredAt?: string | null;\n packId?: string | null;\n createdBy?: number | null;\n updatedBy?: number | null;\n createdAt?: string | null;\n updatedAt?: string | null;\n}\n\nexport interface ContentRuleListResponse {\n items: ContentRule[];\n /** `=== items.length` — the list endpoint does NOT paginate. */\n total: number;\n}\n\n/**\n * Signal-fire context (`POST /api/v1/rules/signals/fire`). Carries the target\n * account + any extra payload the engine/condition evaluator reads. A `null`\n * `contentUuid` means scan-mode (the LLM discovers candidates itself).\n */\nexport interface SignalFireContext {\n /** Content type of the target (e.g. `'Mt5Account'`). */\n typeName?: string;\n /** Target account UUID, or `null` for scan-mode `llm_agent` rules. */\n contentUuid?: string | null;\n /** Extra payload (e.g. `{ serverName, login }`). */\n data?: Record<string, unknown>;\n}\n\n/** `POST /api/v1/rules/signals/fire` response. */\nexport interface SignalFireResponse {\n /** Number of rules that matched and were dispatched. */\n triggeredCount: number;\n /** UUIDs of the matched rules. */\n matchedRules: string[];\n}\n\n/** Query params for GET /api/v1/rules (route-level Query() params; no limit/offset). */\nexport interface RuleListQuery {\n sourceType?: string;\n executionType?: ExecutionType;\n /** contentType filter. */\n typeName?: string;\n isActive?: boolean;\n /** UUID or slug (FEAT-008 v1.1). */\n packId?: string;\n format?: SerializationFormat;\n}\n","/**\n * Trigger helpers for the rule/skill builders.\n *\n * A `ContentRule` trigger carries TWO related fields with DIFFERENT allowed\n * values on the wire:\n *\n * - `trigger_type` — the schema-validated field\n * (`eaera_cms/core/rules/definitions.py:33-39`).\n * Allowed values: `event | cron | signal | stream`.\n * - `source_type` — the JSONB column read by the engine matcher\n * (`eaera-cms/core/rules/engine.py:369`) and the SQL filter\n * (`eaera-cms/core/rules/trigger_api.py:65`).\n * Allowed values: `event_dto | cron | batch | stream | signal`.\n *\n * For event rules the canonical pair is `trigger_type: \"event\"` +\n * `source_type: \"event_dto\"` — see `packs/registry.py:463-470`. Earlier SDK\n * builds emitted both as `\"event_dto\"` which passed engine matching but\n * drifted from the canonical pack-authored contract; this file now emits\n * the canonical pair.\n *\n * The dashboard builders author three shapes:\n *\n * - **signal** — fires on the per-account metric stream (fixed rules' default).\n * - **cron** — fires on a schedule (skills, and fixed rules that need a\n * time-based re-evaluation instead of streaming).\n * - **event** — fires on a backend Kafka `content.events` topic\n * (e.g. `deal_close`, `statement`, `position`, `order`). Backend-authored\n * rules are common but the dashboard editor supports them for parity.\n *\n * `stream` triggers are backend-authored only and not surfaced in the dashboard\n * UI. {@link triggerModeOf} still classifies them so a stored `stream` rule\n * loads without crashing, but no `TRIGGER_MODE.STREAM` builder exists.\n *\n * These helpers build the flat `TriggerDefinition` the CMS route expects and\n * expose a small preset table so the UI can offer human cron presets.\n */\n\nimport type { TriggerDefinition, TriggerType } from './rules.type';\n\n/** Value-level constants for trigger modes (the *builder* view used by the\n * dashboard UI). Each entry's string is the *backend* `source_type` value\n * read off `ContentRule.trigger` by `engine.py:_match_trigger` and the SQL\n * filter at `trigger_api.py:fire_signal`:\n *\n * - `SIGNAL` → `\"signal\"` (API pod, `POST /api/v1/rules/signals/fire`).\n * - `CRON` → `\"cron\"` (cron evaluator pod).\n * - `EVENT` → `\"event_dto\"` (NOT `\"event\"` — the engine matcher reads\n * `source_type` as `\"event_dto\"`).\n *\n * Use {@link TRIGGER_TYPE} for the wire-level `trigger_type` value (which\n * uses `\"event\"`, not `\"event_dto\"`). */\nexport const TRIGGER_MODE = {\n SIGNAL: 'signal',\n CRON: 'cron',\n EVENT: 'event_dto',\n} as const;\n\n/** The trigger modes the dashboard builders author — derived from {@link TRIGGER_MODE}. */\nexport type TriggerMode = (typeof TRIGGER_MODE)[keyof typeof TRIGGER_MODE];\n\n/** Value-level constants for the *wire-level* `trigger_type` field (the\n * schema-validated field on `TriggerDefinition`,\n * `eaera_cms/core/rules/definitions.py:33-39`).\n *\n * For event rules the wire value is `\"event\"`, NOT `\"event_dto\"` — the\n * latter is the `source_type` value. The two diverge on purpose; the\n * pack loader emits `trigger_type: \"event\"` + `source_type: \"event_dto\"`\n * (`packs/registry.py:463-470`).\n *\n * - `SIGNAL` → `\"signal\"`\n * - `CRON` → `\"cron\"`\n * - `EVENT` → `\"event\"`\n * - `STREAM` → `\"stream\"` (backend-only — no SDK builder). */\nexport const TRIGGER_TYPE = {\n SIGNAL: 'signal',\n CRON: 'cron',\n EVENT: 'event',\n STREAM: 'stream',\n} as const;\n\n/** The wire-level `trigger_type` union — derived from {@link TRIGGER_TYPE}. */\nexport type TriggerTypeValue = (typeof TRIGGER_TYPE)[keyof typeof TRIGGER_TYPE];\n\n/** The Kafka `content.events` event types the trigger pod subscribes to.\n *\n * Authoritative list — `eaera-mt5/eaera_mt5/pipeline/event_publisher.py` (the\n * four MT5 pipeline publishers) and `eaera-mt5/worker/sync/account_sync.py`\n * (`_emit_account_upsert_events`). The CMS schema validator does not whitelist\n * the value (any string is accepted), but the engine matcher and the\n * `Mt5AccountSyncService` only act on these five. */\nexport const EVENT_TYPE = {\n DEAL_CLOSE: 'deal_close',\n STATEMENT: 'statement',\n POSITION: 'position',\n ORDER: 'order',\n /** FEAT-009 identity-provisioning bridge — emitted by the MT5 `account_sync`\n * worker whenever an account is upserted. The trigger service ALSO\n * auto-upserts an `Mt5Account` content row on `(server_name, login)` via\n * `Mt5AccountSyncService` before evaluating rules. Common use: provision\n * a CMS user when the account email is present (the live `user_sync` rule\n * uses `event: 'mt5_account_upsert'` + `trigger.conditions: [email contains '@']`). */\n MT5_ACCOUNT_UPSERT: 'mt5_account_upsert',\n} as const;\n\n/** Event type union — derived from {@link EVENT_TYPE}. */\nexport type EventType = (typeof EVENT_TYPE)[keyof typeof EVENT_TYPE];\n\n/** A labelled option for the event-payload picker. */\nexport interface EventTypeOption {\n label: string;\n value: EventType;\n /** Short human hint shown in tooltips / Data Set reference. */\n hint?: string;\n}\n\n/** Human labels for the {@link EVENT_TYPE} options. */\nexport const EVENT_TYPE_OPTIONS: readonly EventTypeOption[] = [\n { label: 'Deal close', value: EVENT_TYPE.DEAL_CLOSE },\n { label: 'Statement', value: EVENT_TYPE.STATEMENT },\n { label: 'Position', value: EVENT_TYPE.POSITION },\n { label: 'Order', value: EVENT_TYPE.ORDER },\n {\n label: 'Account upsert',\n value: EVENT_TYPE.MT5_ACCOUNT_UPSERT,\n hint: 'Emitted by MT5 account_sync; trigger service auto-upserts Mt5Account content row.',\n },\n];\n\n/** Helper: true iff the given string is a known event type. */\nexport const isKnownEventType = (raw: unknown): raw is EventType => {\n if (typeof raw !== 'string') return false;\n return (Object.values(EVENT_TYPE) as string[]).includes(raw);\n};\n\n/** Coerce an arbitrary event-type string (e.g. from a stored `sourceConfig.event`)\n * to a known {@link EventType}. Falls back to {@link EVENT_TYPE.DEAL_CLOSE} for\n * unknown / missing values so the rule editor always has a valid pick. */\nexport const coerceEventType = (raw: unknown): EventType =>\n isKnownEventType(raw) ? raw : EVENT_TYPE.DEAL_CLOSE;\n\n/** A labelled cron preset for the schedule picker. */\nexport interface CronPreset {\n label: string;\n value: string;\n}\n\n/** Human cron presets (standard 5-field expressions). */\nexport const CRON_PRESETS: readonly CronPreset[] = [\n { label: 'Every 1 min', value: '* * * * *' },\n { label: 'Every 5 min', value: '*/5 * * * *' },\n { label: 'Every 15 min', value: '*/15 * * * *' },\n { label: 'Every 30 min', value: '*/30 * * * *' },\n { label: 'Every hour', value: '0 * * * *' },\n { label: 'Every day (00:00)', value: '0 0 * * *' },\n];\n\n/** Default cron schedule when none is provided (skills' historical default). */\nexport const DEFAULT_CRON_SCHEDULE = '*/5 * * * *';\n\n/** Default Kafka topic for event triggers. Sourced from `CONTENT_TYPE.MT5_ACCOUNT`. */\nexport const DEFAULT_EVENT_CONTENT_TYPE = 'Mt5Account' as const;\n\n/** Build a signal trigger over the metric stream.\n *\n * Emits the canonical pair:\n * - `triggerType: 'signal'` (schema-validated)\n * - `sourceType: 'signal'` (engine matcher)\n *\n * Both are the same value for signal rules. */\nexport const buildSignalTrigger = (signalName: string): TriggerDefinition => ({\n sourceType: TRIGGER_MODE.SIGNAL,\n triggerType: TRIGGER_TYPE.SIGNAL,\n sourceConfig: { signalName },\n});\n\n/**\n * Build a cron trigger. `schedule` is a standard 5-field cron expression;\n * `extra` is merged into `sourceConfig` (e.g. skills pass `promptName` /\n * `queryTools`).\n *\n * Emits the canonical pair:\n * - `triggerType: 'cron'` (schema-validated)\n * - `sourceType: 'cron'` (engine matcher)\n */\nexport const buildCronTrigger = (\n schedule: string,\n extra: Record<string, unknown> = {},\n timezone?: string\n): TriggerDefinition => ({\n sourceType: TRIGGER_MODE.CRON,\n triggerType: TRIGGER_TYPE.CRON,\n sourceConfig: { schedule, ...extra, ...(timezone ? { timezone } : {}) },\n});\n\n/**\n * Build an event trigger on the Kafka `content.events` topic.\n *\n * Emits the canonical pair — NOT the same value on both fields:\n * - `triggerType: 'event'` (schema-validated, `definitions.py:36`)\n * - `sourceType: 'event_dto'` (engine matcher, `engine.py:369`)\n *\n * Earlier SDK builds emitted both as `\"event_dto\"`, which passed engine\n * matching but drifted from the canonical pack-authored contract\n * (`packs/registry.py:463-470`). This builder now emits the correct pair.\n *\n * The `event` (singular) and `eventTypes`/`contentTypes` (plural) shapes\n * are both stored so the engine reads either form.\n */\nexport const buildEventTrigger = (\n event: EventType,\n contentType: string = DEFAULT_EVENT_CONTENT_TYPE,\n extra: Record<string, unknown> = {}\n): TriggerDefinition => ({\n sourceType: TRIGGER_MODE.EVENT,\n triggerType: TRIGGER_TYPE.EVENT,\n sourceConfig: {\n event,\n eventTypes: [event],\n contentTypes: [contentType],\n ...extra,\n },\n});\n\n/** Derive the builder trigger mode from a stored `ContentRule.trigger`.\n *\n * Accepts BOTH the camelCase fields the SDK writes (`sourceType`,\n * `triggerType`) and the snake_case JSONB keys the backend reads\n * (`source_type`, `trigger_type`) so rules authored before the trigger\n * wire-shape fix still load in the Fixed Rules editor without showing up\n * as the wrong mode.\n *\n * Both `source_type === \"event_dto\"` (engine matcher) and `trigger_type\n * === \"event\"` (schema-validated) map to the builder's `EVENT` mode. */\nexport const triggerModeOf = (\n trigger: TriggerDefinition | Record<string, unknown> | null | undefined\n): TriggerMode => {\n const t = trigger as {\n sourceType?: string;\n triggerType?: string;\n source_type?: string;\n trigger_type?: string;\n } | null;\n const sourceType = t?.sourceType ?? t?.source_type ?? t?.triggerType ?? t?.trigger_type;\n if (sourceType === TRIGGER_MODE.SIGNAL || sourceType === TRIGGER_TYPE.SIGNAL)\n return TRIGGER_MODE.SIGNAL;\n if (sourceType === TRIGGER_MODE.CRON || sourceType === TRIGGER_TYPE.CRON)\n return TRIGGER_MODE.CRON;\n if (\n sourceType === TRIGGER_MODE.EVENT ||\n sourceType === TRIGGER_TYPE.EVENT ||\n sourceType === TRIGGER_TYPE.STREAM\n )\n return TRIGGER_MODE.EVENT;\n // Unknown/legacy `batch` and unrelated values fall through to signal.\n return TRIGGER_MODE.SIGNAL;\n};\n\n/** Read the cron `schedule` out of a stored `ContentRule.trigger`. */\nexport const scheduleOf = (\n trigger: TriggerDefinition | Record<string, unknown> | null | undefined\n): string => {\n const sourceConfig =\n (trigger as { sourceConfig?: Record<string, unknown> } | null)?.sourceConfig ?? {};\n const schedule = sourceConfig.schedule;\n return typeof schedule === 'string' && schedule ? schedule : '';\n};\n\n/** Read the signal `signalName` out of a stored `ContentRule.trigger`. */\nexport const signalNameOf = (\n trigger: TriggerDefinition | Record<string, unknown> | null | undefined\n): string => {\n const sourceConfig =\n (trigger as { sourceConfig?: Record<string, unknown> } | null)?.sourceConfig ?? {};\n const name = sourceConfig.signalName;\n return typeof name === 'string' ? name : '';\n};\n\nexport type { TriggerType };\nexport { TRIGGER_TYPE as TRIGGER_TYPE_VALUE };\n","import { CONTENT_TYPE } from '../../common/constants/content.constant';\nimport { LLM_QUERY_TOOL } from './llm-rule.constant';\nimport { MT5_ACTION_NAME } from '../../common/constants/mt5-action.constant';\nimport { CONDITION_TYPE, EXECUTION_TYPE } from './rules.type';\nimport { TRIGGER_MODE, TRIGGER_TYPE } from './triggers';\nimport type { ContentRule, RuleCreatePayload, RuleListQuery } from './rules.type';\n\n/**\n * Fake rules dataset used while the CMS rules endpoints are under\n * development. Covers both FEAT-002 (`llmAgent`) and FEAT-004\n * (expression/chain) rule shapes.\n *\n * Field names use camelCase to match the backend API response. Action\n * parameters are nested under `params` and `conditionExpr` references the\n * real condition-field catalog (`account_state.*` / `account_metric_by_deal.*`).\n */\n\nexport const MOCK_RULES: ContentRule[] = [\n {\n id: 1,\n uuid: 'rule-high-profit-alert',\n name: 'High daily profit alert',\n description: 'Promote accounts exceeding daily profit thresholds.',\n typeName: CONTENT_TYPE.MT5_ACCOUNT,\n codeType: 'python',\n conditionType: CONDITION_TYPE.EXPRESSION,\n conditionExpr:\n 'account_metric_by_deal.realized_pnl_daily > 500 and account_state.equity > 1000',\n trigger: {\n triggerType: TRIGGER_TYPE.SIGNAL,\n sourceType: TRIGGER_MODE.SIGNAL,\n sourceConfig: { signalName: 'metric_update' },\n },\n executionType: EXECUTION_TYPE.ACTION,\n executionParams: {\n actionName: MT5_ACTION_NAME.CHANGE_GROUP,\n params: { newGroup: 'real\\\\EAERA\\\\GOLD' },\n },\n priority: 10,\n isActive: true,\n timeoutSeconds: 30,\n lastFiredAt: '2026-06-19T08:12:00Z',\n createdAt: '2026-06-01T00:00:00Z',\n updatedAt: '2026-06-10T00:00:00Z',\n },\n {\n id: 2,\n uuid: 'rule-drawdown-protection',\n name: 'Excessive drawdown protection',\n description: 'Cut leverage then move accounts below the drawdown threshold.',\n typeName: CONTENT_TYPE.MT5_ACCOUNT,\n codeType: 'python',\n conditionType: CONDITION_TYPE.EXPRESSION,\n conditionExpr: 'account_metric_by_deal.max_relative_balance_drawdown > 0.3',\n trigger: {\n triggerType: TRIGGER_TYPE.SIGNAL,\n sourceType: TRIGGER_MODE.SIGNAL,\n sourceConfig: { signalName: 'metric_update' },\n },\n executionType: EXECUTION_TYPE.CHAIN,\n executionParams: {\n steps: [\n {\n type: EXECUTION_TYPE.ACTION,\n params: {\n actionName: MT5_ACTION_NAME.CHANGE_LEVERAGE,\n params: { newLeverage: 50 },\n },\n },\n {\n type: EXECUTION_TYPE.ACTION,\n params: {\n actionName: MT5_ACTION_NAME.CHANGE_GROUP,\n params: { newGroup: 'real\\\\EAERA\\\\SILVER' },\n },\n },\n ],\n },\n priority: 20,\n isActive: true,\n timeoutSeconds: 30,\n lastFiredAt: '2026-06-19T07:40:00Z',\n createdAt: '2026-06-02T00:00:00Z',\n updatedAt: '2026-06-09T00:00:00Z',\n },\n {\n id: 3,\n uuid: 'rule-martingale-skill',\n name: 'Detect martingale behavior',\n description: 'AI-agent skill that flags martingale position sizing.',\n typeName: CONTENT_TYPE.MT5_ACCOUNT,\n codeType: 'python',\n conditionType: CONDITION_TYPE.LLM_AGENT,\n trigger: {\n triggerType: TRIGGER_TYPE.CRON,\n sourceType: TRIGGER_MODE.CRON,\n sourceConfig: {\n schedule: '*/5 * * * *',\n promptName: 'Detect martingale behavior',\n queryTools: [LLM_QUERY_TOOL.CONTENT_QUERY, LLM_QUERY_TOOL.CONTENT_GET],\n },\n },\n executionType: EXECUTION_TYPE.SET_FIELD,\n executionParams: { field: 'risk_flag' },\n priority: 5,\n isActive: true,\n timeoutSeconds: 60,\n lastFiredAt: '2026-06-19T09:00:00Z',\n createdAt: '2026-06-05T00:00:00Z',\n updatedAt: '2026-06-12T00:00:00Z',\n },\n {\n id: 4,\n uuid: 'rule-scalping-skill',\n name: 'High-frequency scalping',\n description: 'AI-agent skill that flags high-frequency scalping.',\n typeName: CONTENT_TYPE.MT5_ACCOUNT,\n codeType: 'python',\n conditionType: CONDITION_TYPE.LLM_AGENT,\n trigger: {\n triggerType: TRIGGER_TYPE.CRON,\n sourceType: TRIGGER_MODE.CRON,\n sourceConfig: {\n schedule: '*/5 * * * *',\n promptName: 'High-frequency scalping',\n queryTools: [LLM_QUERY_TOOL.CONTENT_QUERY, LLM_QUERY_TOOL.CONTENT_GET],\n },\n },\n executionType: EXECUTION_TYPE.SET_FIELD,\n executionParams: { field: 'risk_flag' },\n priority: 5,\n isActive: false,\n timeoutSeconds: 60,\n createdAt: '2026-06-06T00:00:00Z',\n updatedAt: '2026-06-12T00:00:00Z',\n },\n];\n\n/** Mutable in-memory store so mock CRUD round-trips within a session. */\nconst _store: ContentRule[] = MOCK_RULES.map((r) => ({ ...r }));\n\nlet _seq = 1000;\n\nexport function mockRuleList(query?: RuleListQuery): {\n items: ContentRule[];\n total: number;\n} {\n let rows = _store.slice().sort((a, b) => a.id - b.id);\n if (query?.sourceType)\n rows = rows.filter(\n (r) => (r.trigger as { sourceType?: string }).sourceType === query.sourceType\n );\n if (query?.executionType) rows = rows.filter((r) => r.executionType === query.executionType);\n if (query?.typeName) rows = rows.filter((r) => r.typeName === query.typeName);\n if (query?.isActive !== undefined) rows = rows.filter((r) => r.isActive === query.isActive);\n return { items: rows, total: rows.length };\n}\n\nexport function mockRuleDetail(uuid: string): ContentRule | undefined {\n return _store.find((r) => r.uuid === uuid);\n}\n\nexport function mockRuleCreate(payload: RuleCreatePayload): ContentRule {\n const now = new Date().toISOString();\n const rule: ContentRule = {\n id: ++_seq,\n uuid: `rule-${payload.name.toLowerCase().replace(/\\s+/g, '-')}`,\n name: payload.name,\n description: payload.description ?? null,\n typeName: payload.contentType ?? null,\n codeType: 'python',\n conditionType: payload.conditionType ?? CONDITION_TYPE.EXPRESSION,\n conditionExpr: payload.conditionExpr ?? null,\n conditionCode: payload.conditionCode ?? null,\n trigger: payload.trigger as unknown as Record<string, unknown>,\n executionType: payload.executionType ?? EXECUTION_TYPE.ACTION,\n executionParams: payload.executionParams ?? null,\n priority: payload.priority ?? 0,\n isActive: payload.isActive ?? true,\n timeoutSeconds: payload.timeoutSeconds ?? 30,\n createdAt: now,\n updatedAt: now,\n };\n _store.push(rule);\n return rule;\n}\n\nexport function mockRuleUpdate(\n uuid: string,\n patch: Partial<RuleCreatePayload>\n): ContentRule | undefined {\n const rule = _store.find((r) => r.uuid === uuid);\n if (!rule) return undefined;\n if (patch.contentType !== undefined) rule.typeName = patch.contentType;\n if (patch.conditionType !== undefined) rule.conditionType = patch.conditionType;\n if (patch.conditionExpr !== undefined) rule.conditionExpr = patch.conditionExpr;\n if (patch.conditionCode !== undefined) rule.conditionCode = patch.conditionCode;\n if (patch.executionType !== undefined) rule.executionType = patch.executionType;\n if (patch.executionParams !== undefined) rule.executionParams = patch.executionParams;\n if (patch.trigger !== undefined)\n rule.trigger = patch.trigger as unknown as Record<string, unknown>;\n if (patch.priority !== undefined) rule.priority = patch.priority;\n if (patch.isActive !== undefined) rule.isActive = patch.isActive;\n if (patch.timeoutSeconds !== undefined) rule.timeoutSeconds = patch.timeoutSeconds;\n if (patch.name !== undefined) rule.name = patch.name;\n if (patch.description !== undefined) rule.description = patch.description;\n rule.updatedAt = new Date().toISOString();\n return rule;\n}\n\nexport function mockRuleRemove(uuid: string): boolean {\n const idx = _store.findIndex((r) => r.uuid === uuid);\n if (idx === -1) return false;\n _store.splice(idx, 1);\n return true;\n}\n","import type { $Fetch } from 'ofetch';\nimport { RULES_ENDPOINT } from '../../common/constants/rules.constant';\nimport { deepClone } from '../../common/utils/clone';\nimport {\n mockRuleCreate,\n mockRuleDetail,\n mockRuleList,\n mockRuleRemove,\n mockRuleUpdate,\n} from './mock';\nimport type {\n ContentRule,\n ContentRuleListResponse,\n RuleCreatePayload,\n RuleListQuery,\n RuleUpdatePayload,\n SignalFireContext,\n SignalFireResponse,\n} from './rules.type';\n\nexport interface IRulesServiceOptions {\n /** The CMS `$Fetch` instance (one of `sdk.apis`). */\n api: $Fetch;\n /** Lazy flag — when true, the service returns fake data. */\n mock: () => boolean;\n}\n\nexport interface IRulesService {\n list(query?: RuleListQuery): Promise<ContentRuleListResponse>;\n detail(uuid: string): Promise<ContentRule>;\n create(payload: RuleCreatePayload): Promise<ContentRule>;\n update(uuid: string, payload: RuleUpdatePayload): Promise<ContentRule>;\n remove(uuid: string): Promise<void>;\n /**\n * Manually fire a signal rule (`POST /api/v1/rules/signals/fire`). Runs\n * synchronously in the API pod — the canonical way to verify an action\n * handler works without scheduling cron (cron + action is currently broken\n * backend-side; see `risk-rules-api-guide.md` §8.F).\n *\n * Pass `options.timeoutMs` to override the SDK-wide 30s HTTP timeout\n * (the API pod runs the rule synchronously and a multi-step action chain\n * can exceed 30s on real traffic — the dashboard's \"Fire now\" dialog\n * raises the ceiling to 120s by default).\n */\n signalFire(\n signalName: string,\n context: SignalFireContext,\n options?: { timeoutMs?: number }\n ): Promise<SignalFireResponse>;\n}\n\n/**\n * Content-rules service. CRUD over `/api/v1/rules`. Serves both FEAT-002\n * (`conditionType: 'llm_agent'` skills) and FEAT-004 (expression/chain).\n *\n * Endpoint contract (`eaera_cms/core/rules/routes.py`):\n * GET /api/v1/rules → list (no pagination; `total === items.length`)\n * GET /api/v1/rules/{uuid} → single rule\n * POST /api/v1/rules → create (flat payload)\n * PUT /api/v1/rules/{uuid} → update\n * DELETE /api/v1/rules/{uuid} → remove\n * POST /api/v1/rules/signals/fire → fire a signal rule synchronously\n *\n * The route accepts the flat `RuleCreatePayload` (`TriggerCreateRequest`,\n * `extra: allow`) and the service reads flat top-level keys. See rules.type.ts.\n *\n * While `mock()` returns true, all methods resolve against the local fake\n * dataset and never touch `api`.\n */\nexport function createRulesService(opts: IRulesServiceOptions): IRulesService {\n const { api, mock } = opts;\n\n return {\n async list(query = {}) {\n if (mock()) {\n const res = mockRuleList(query);\n return { items: res.items.map(deepClone), total: res.total };\n }\n return api<ContentRuleListResponse>(RULES_ENDPOINT.BASE, { query });\n },\n\n async detail(uuid) {\n if (mock()) return _mustFind(mockRuleDetail(uuid), uuid);\n return api<ContentRule>(RULES_ENDPOINT.detail(uuid));\n },\n\n async create(payload) {\n if (mock()) return deepClone(mockRuleCreate(payload));\n return api<ContentRule>(RULES_ENDPOINT.BASE, { method: 'POST', body: payload });\n },\n\n async update(uuid, payload) {\n if (mock()) return _mustFind(mockRuleUpdate(uuid, payload), uuid);\n return api<ContentRule>(RULES_ENDPOINT.detail(uuid), { method: 'PUT', body: payload });\n },\n\n async remove(uuid) {\n if (mock()) {\n mockRuleRemove(uuid);\n return;\n }\n await api(RULES_ENDPOINT.detail(uuid), { method: 'DELETE' });\n },\n\n async signalFire(signalName, context, options) {\n if (mock()) return { triggeredCount: 1, matchedRules: ['mock-uuid'] };\n return api<SignalFireResponse>(RULES_ENDPOINT.fireSignal, {\n method: 'POST',\n body: { signalName, context },\n ...(options?.timeoutMs != null ? { timeout: options.timeoutMs } : {}),\n });\n },\n };\n}\n\n/* ----------------------------- file-private helpers ----------------------------- */\n\nfunction _mustFind(rule: ContentRule | undefined, uuid: string): ContentRule {\n if (!rule) throw _notFound(`Rule ${uuid} not found`);\n return deepClone(rule);\n}\n\nfunction _notFound(message: string): Error {\n const e = new Error(message);\n (e as Error & { statusCode?: number }).statusCode = 404;\n return e;\n}\n","/**\n * Dashboard settings endpoints (`eaera_cms/settings/routes.py`). Monitored\n * groups are persisted as a generic CMS setting of type\n * `setting.dashboard.monitored_groups` (requires that CT in the catalog).\n */\nexport const MONITORED_GROUPS_TYPE = 'setting.dashboard.monitored_groups';\n\n/**\n * Public markets setting type (api-inventory §5.7.5). Anonymous-readable\n * (no JWT required) — carries the UI defaults for logged-out users:\n * the default MT5 server id + the curated common-symbol list.\n */\nexport const PUBLIC_MARKETS_TYPE = 'setting.public.markets';\n\nexport const SETTINGS_ENDPOINT = {\n /** GET/PUT /api/v1/settings/{typeName}. */\n detail: (typeName: string): string => `/api/v1/settings/${typeName}`,\n} as const;\n","/** Fake monitored-groups set used while the settings endpoint is under development. */\nexport const MOCK_MONITORED_GROUPS: string[] = [\n 'real\\\\EAERA\\\\SILVER',\n 'real\\\\EAERA\\\\GOLD',\n 'real\\\\EAERA\\\\PLATINUM',\n];\n\n/** Mutable in-memory store so mock add/remove round-trips within a session. */\nlet _groups: string[] = MOCK_MONITORED_GROUPS.slice();\n\nexport function mockGetMonitoredGroups(): string[] {\n return _groups.slice();\n}\n\nexport function mockSetMonitoredGroups(groups: string[]): string[] {\n _groups = groups.slice();\n return _groups.slice();\n}\n\n/** Fake public-markets payload (mirrors the schema defaults in api-inventory §5.7.5). */\nexport const MOCK_PUBLIC_MARKETS = {\n defaultServer: 'live',\n commonSymbols: ['EURUSD', 'GBPUSD', 'USDJPY', 'XAUUSD', 'XAGUSD', 'BTCUSD', 'ETHUSD'],\n} as const;\n\nexport function mockGetPublicMarkets(): {\n defaultServer: string;\n commonSymbols: string[];\n} {\n return {\n defaultServer: MOCK_PUBLIC_MARKETS.defaultServer,\n commonSymbols: MOCK_PUBLIC_MARKETS.commonSymbols.slice(),\n };\n}\n","import type { $Fetch } from 'ofetch';\nimport {\n MONITORED_GROUPS_TYPE,\n PUBLIC_MARKETS_TYPE,\n SETTINGS_ENDPOINT,\n} from '../../common/constants/settings.constant';\nimport { mockGetMonitoredGroups, mockGetPublicMarkets, mockSetMonitoredGroups } from './mock';\nimport type {\n IMonitoredGroupsPayload,\n IMonitoredGroupsResponse,\n IPublicMarketsData,\n IPublicMarketsResponse,\n} from './settings.type';\n\nexport interface ISettingsServiceOptions {\n /** The CMS `$Fetch` instance (one of `sdk.apis`). */\n api: $Fetch;\n /** Lazy flag — when true, the service returns fake data. */\n mock: () => boolean;\n}\n\nexport interface ISettingsService {\n getMonitoredGroups(): Promise<string[]>;\n setMonitoredGroups(groups: string[]): Promise<string[]>;\n /**\n * Anonymous UI defaults from `setting.public.markets` (api-inventory §5.7.5):\n * the default MT5 server id + the curated common-symbol list (order is\n * significant). Readable without a JWT — the backend returns the schema\n * defaults when no record has been written yet.\n */\n getPublicMarkets(): Promise<IPublicMarketsData>;\n}\n\n/**\n * Settings service. The CMS is the source of truth for monitored groups;\n * the service reads/writes the generic setting\n * `setting.dashboard.monitored_groups`.\n *\n * Endpoint contract (`eaera_cms/settings/routes.py`):\n * GET /api/v1/settings/{typeName} → { typeName, displayName, data, exists }\n * PUT /api/v1/settings/{typeName} → { ..., data } (body = key/value pairs)\n *\n * NOTE: the CT `setting.dashboard.monitored_groups` (schema `{ groups: string[] }`)\n * must be registered in the CMS settings catalog for these calls to succeed.\n *\n * While `mock()` returns true, all methods resolve against the local fake\n * dataset and never touch `api`.\n */\nexport function createSettingsService(opts: ISettingsServiceOptions): ISettingsService {\n const { api, mock } = opts;\n\n return {\n async getMonitoredGroups() {\n if (mock()) return mockGetMonitoredGroups();\n const res = await api<IMonitoredGroupsResponse>(\n SETTINGS_ENDPOINT.detail(MONITORED_GROUPS_TYPE)\n );\n return res.data?.groups ?? [];\n },\n\n async setMonitoredGroups(groups) {\n if (mock()) return mockSetMonitoredGroups(groups);\n const payload: IMonitoredGroupsPayload = { groups };\n const res = await api<IMonitoredGroupsResponse>(\n SETTINGS_ENDPOINT.detail(MONITORED_GROUPS_TYPE),\n { method: 'PUT', body: payload }\n );\n return res.data?.groups ?? groups;\n },\n\n async getPublicMarkets() {\n if (mock()) return mockGetPublicMarkets();\n const res = await api<IPublicMarketsResponse>(SETTINGS_ENDPOINT.detail(PUBLIC_MARKETS_TYPE));\n return {\n defaultServer: res.data?.defaultServer ?? '',\n commonSymbols: res.data?.commonSymbols ?? [],\n };\n },\n };\n}\n","import {\n COOKIE_DEFAULTS,\n COOKIE_SAME_SITE,\n TOKEN_STORAGE_KEY,\n type CookieSameSite,\n} from '../../../common/constants/storage.constant';\nimport type { ITokenStorage } from '../credential.type';\n\nexport interface ICookieStorageOptions {\n key?: string;\n /** Seconds. Default = 30 days (see COOKIE_DEFAULTS). */\n maxAge?: number;\n domain?: string;\n path?: string;\n secure?: boolean;\n sameSite?: CookieSameSite;\n}\n\nconst DEFAULTS: Required<Omit<ICookieStorageOptions, 'domain'>> = {\n key: TOKEN_STORAGE_KEY,\n maxAge: COOKIE_DEFAULTS.MAX_AGE_SECONDS,\n path: COOKIE_DEFAULTS.PATH,\n secure: COOKIE_DEFAULTS.SECURE,\n sameSite: COOKIE_SAME_SITE.LAX,\n};\n\nfunction _readCookie(key: string): string | null {\n if (typeof document === 'undefined') return null;\n const match = document.cookie.match(new RegExp(`(?:^|; )${key}=([^;]*)`));\n return match ? decodeURIComponent(match[1]) : null;\n}\n\n/**\n * Cookie-backed token storage. Client-side only: it reads/writes\n * `document.cookie`, so it no-ops during SSR. For Nuxt SSR token sharing,\n * the `httpOnlyBridge` storage (delegating to a Nuxt server route) is planned.\n */\nexport function cookieStorage(opts: ICookieStorageOptions = {}): ITokenStorage {\n const cfg = { ...DEFAULTS, ...opts };\n return {\n get: () => _readCookie(cfg.key),\n set: (t) => {\n if (typeof document === 'undefined') return;\n const parts = [\n `${cfg.key}=${encodeURIComponent(t)}`,\n `Max-Age=${cfg.maxAge}`,\n `path=${cfg.path}`,\n cfg.secure ? 'Secure' : '',\n cfg.sameSite ? `SameSite=${cfg.sameSite}` : '',\n cfg.domain ? `Domain=${cfg.domain}` : '',\n ].filter(Boolean);\n document.cookie = parts.join('; ');\n },\n clear: () => {\n if (typeof document === 'undefined') return;\n document.cookie = `${cfg.key}=; Max-Age=0; path=${cfg.path}`;\n },\n };\n}\n","import { TOKEN_STORAGE_KEY } from '../../../common/constants/storage.constant';\nimport type { ITokenStorage } from '../credential.type';\n\nconst KEY = TOKEN_STORAGE_KEY;\n\n/**\n * localStorage-backed token storage. XSS-readable, so prefer `cookieStorage`\n * or an httpOnly bridge for production. Falls back to memory when `window`\n * is undefined (SSR).\n */\nexport function localStorageAdapter(): ITokenStorage {\n const canUse = typeof window !== 'undefined' && !!window.localStorage;\n return {\n get: () => (canUse ? window.localStorage.getItem(KEY) : null),\n set: (t) => {\n if (canUse) window.localStorage.setItem(KEY, t);\n },\n clear: () => {\n if (canUse) window.localStorage.removeItem(KEY);\n },\n };\n}\n","import type { ITokenStorage } from '../credential.type';\n\n/**\n * In-memory storage. Token vanishes on page reload — the safest default\n * and a guaranteed-safe fallback for SSR where no window exists.\n */\nexport function memoryStorage(): ITokenStorage {\n let token: string | null = null;\n return {\n get: () => token,\n set: (t) => {\n token = t;\n },\n clear: () => {\n token = null;\n },\n };\n}\n","import { type ICookieStorageOptions, cookieStorage } from './storages/cookieStorage';\nimport { localStorageAdapter } from './storages/localStorageAdapter';\nimport { memoryStorage } from './storages/memoryStorage';\nimport type { StorageName, ITokenStorage } from './credential.type';\n\n/** Pick a built-in storage by name. Pass options for the `cookie` backend. */\nexport function resolveStorage(\n name: StorageName,\n cookieOpts?: ICookieStorageOptions\n): ITokenStorage {\n switch (name) {\n case 'localStorage':\n return localStorageAdapter();\n case 'cookie':\n return cookieStorage(cookieOpts);\n case 'httpOnlyBridge':\n // Defer to the Nuxt server route bridge (see httpOnlyBridgeStorage).\n // Imported lazily so non-Nuxt consumers don't pull Nuxt kit.\n throw new Error(\n 'httpOnlyBridge requires the Nuxt module. Use createCmsSDK() inside a Nuxt app.'\n );\n case 'memory':\n default:\n return memoryStorage();\n }\n}\n\nexport type { ICookieStorageOptions } from './storages/cookieStorage';\n","import { ref, type Ref } from 'vue';\nimport { HTTP_HEADER } from '../../common/constants/http.constant';\nimport type { ITokenStorage } from './credential.type';\n\nexport interface ITokenManagerOptions {\n /** Called after every (re)set with the new token — e.g. to sync realtime socket. */\n onRefreshed?: (token: string) => void;\n /** Header name carrying the token. Default `Authorization`. */\n headerName?: string;\n /** Prefix prepended to the header value. Default `Bearer `. Pass `''` for raw. */\n prefix?: string;\n}\n\n/**\n * Single source of truth for the access token.\n *\n * The HTTP layer (createApi) reads via `getHeader()` in its `onRequest` hook\n * and refreshes via `set()` in `onResponse` (sliding-session pattern). Pinia\n * stores MUST NOT store the token — they read `currentToken` (a reactive Vue\n * ref) for reactive access (e.g. `isLoggedIn`), or call `has()` for a\n * one-shot check.\n */\nexport class TokenManager {\n readonly headerName: string;\n readonly prefix: string;\n private readonly onRefreshed?: (token: string) => void;\n private storage: ITokenStorage;\n /** Reactive mirror of the stored token — the only reactive way to observe it. */\n private readonly tokenRef: Ref<string | null>;\n\n constructor(storage: ITokenStorage, opts: ITokenManagerOptions = {}) {\n this.storage = storage;\n this.onRefreshed = opts.onRefreshed;\n this.headerName = opts.headerName ?? HTTP_HEADER.AUTHORIZATION;\n this.prefix = opts.prefix ?? '';\n this.tokenRef = ref(storage.get());\n }\n\n /** Reactive current token. Read this inside `computed` to track changes. */\n get currentToken(): string | null {\n return this.tokenRef.value;\n }\n\n get(): string | null {\n return this.storage.get();\n }\n\n /** Full header value ready to drop into a request (prefix + token). */\n getHeader(): string | null {\n const t = this.storage.get();\n return t ? `${this.prefix}${t}` : null;\n }\n\n has(): boolean {\n return this.storage.get() !== null;\n }\n\n set(token: string): void {\n if (!token) return;\n this.storage.set(token);\n this.tokenRef.value = token;\n this.onRefreshed?.(token);\n }\n\n clear(): void {\n this.storage.clear();\n this.tokenRef.value = null;\n }\n\n /** Replace the underlying storage (e.g. upgrade memory → cookie after first login). */\n swapStorage(storage: ITokenStorage): void {\n const current = this.storage.get();\n this.storage.clear();\n if (current) storage.set(current);\n this.storage = storage;\n this.tokenRef.value = storage.get();\n }\n}\n","import { ref, type Ref } from 'vue';\nimport {\n WS_AUTH_TIMEOUT_MS,\n WS_CLOSE_CODE,\n WS_CONNECTION_STATE,\n WS_MAX_RECONNECT_ATTEMPTS,\n WS_MAX_SUBSCRIPTIONS,\n WS_MESSAGE_TYPE,\n WS_PING_INTERVAL_MS,\n WS_PING_WATCHDOG_CHECK_MS,\n WS_PING_WATCHDOG_FACTOR,\n WS_RECONNECT_INITIAL_MS,\n WS_RECONNECT_JITTER_MS,\n WS_RECONNECT_MAX_MS,\n} from './ws.constants';\nimport type {\n IWsActionMessage,\n IWsActionResult,\n IWsAuthMessage,\n IWsClient,\n IWsClientOptions,\n IWsFetchResultMessage,\n IWsPongMessage,\n IWsSubscribeMessage,\n IWsUnsubscribeAllMessage,\n IWsUnsubscribeMessage,\n WsActionResultHandler,\n WsClientMessage,\n WsConnectionState,\n WsConnectionStateHandler,\n WsControlHandler,\n WsEventHandler,\n WsServerMessage,\n} from './ws.type';\n\n/**\n * Framework-agnostic EAERA CMS WebSocket client.\n *\n * Implements the protocol documented in\n * `eaera-docs/cbs/eaera-cms/docs/eaera-cms-websocket-integration-guide.md`:\n * open → auth → subscribe → events/heartbeats/action invocation/reconnect.\n *\n * Token source is intentionally pluggable. The SDK's Nuxt module wires this\n * to {@link TokenManager} + the silent `refresh()` flow, so sliding session\n * refreshes and 401-driven cookie syncs are transparent.\n *\n * Reconnect schedule: exponential backoff with jitter (0…WS_RECONNECT_JITTER_MS),\n * capped at `WS_RECONNECT_MAX_MS`. On `token_expired` / `auth_fail` mid-session\n * the injected `refresh()` is awaited once before reconnecting.\n *\n * SSR safety: pass `WebSocketCtor: undefined` (or skip `open()`); the\n * module's plugin only calls `open()` inside `if (import.meta.client)`.\n */\nexport function createEaeraWebSocket(options: IWsClientOptions): IWsClient {\n const {\n url,\n getToken,\n refresh,\n onToken,\n initialTopics,\n lazy,\n reconnect: reconnectCfg,\n WebSocketCtor,\n } = options;\n\n if (!url) throw new Error('createEaeraWebSocket: `url` is required');\n\n const initialMs = reconnectCfg?.initialMs ?? WS_RECONNECT_INITIAL_MS;\n const maxMs = reconnectCfg?.maxMs ?? WS_RECONNECT_MAX_MS;\n const WS: typeof WebSocket | undefined =\n WebSocketCtor ?? (typeof WebSocket !== 'undefined' ? WebSocket : undefined);\n\n const state: Ref<WsConnectionState> = ref(WS_CONNECTION_STATE.IDLE);\n\n const eventHandlers = new Set<WsEventHandler>();\n const actionResultHandlers = new Set<WsActionResultHandler>();\n const controlHandlers = new Set<WsControlHandler>();\n const stateHandlers = new Set<WsConnectionStateHandler>();\n\n const subscribed = new Set<string>();\n const pendingActions = new Map<string, (msg: IWsActionResult) => void>();\n\n let socket: WebSocket | null = null;\n let manualClose = false;\n let reconnectDelay = initialMs;\n let reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n let authTimer: ReturnType<typeof setTimeout> | null = null;\n\n // Task B: token the in-flight socket was opened with (captured at connect()).\n let inFlightToken: string | null = null;\n // Task E: server-ping watchdog (half-open detection).\n const pingIntervalMs = options.pingIntervalMs ?? WS_PING_INTERVAL_MS;\n let lastPingAt = 0;\n let pingWatchdogTimer: ReturnType<typeof setInterval> | null = null;\n // Task F: offline/online transport flag.\n let transportOffline = false;\n let listenersRegistered = false;\n // Task J: reconnect max-attempt cap → terminal CLOSED on prolonged outage.\n let reconnectAttempts = 0;\n\n const tokenProvider =\n getToken ??\n ((): string | null => {\n // Fallback — production callers wire `getToken: () => tokenManager.get()`.\n return null;\n });\n\n const setState = (next: WsConnectionState): void => {\n if (state.value === next) return;\n state.value = next;\n for (const h of stateHandlers) h(next);\n };\n\n const send = (msg: WsClientMessage): boolean => {\n if (!socket || socket.readyState !== WebSocket.OPEN) return false;\n try {\n socket.send(JSON.stringify(msg));\n return true;\n } catch {\n return false;\n }\n };\n\n const clearTimers = (): void => {\n if (reconnectTimer) {\n clearTimeout(reconnectTimer);\n reconnectTimer = null;\n }\n if (authTimer) {\n clearTimeout(authTimer);\n authTimer = null;\n }\n if (pingWatchdogTimer) {\n clearInterval(pingWatchdogTimer);\n pingWatchdogTimer = null;\n }\n };\n\n const flushSubscriptions = (): void => {\n if (subscribed.size === 0) return;\n const topics = [...subscribed];\n if (topics.length > WS_MAX_SUBSCRIPTIONS) {\n console.warn(\n `[cms-sdk/ws] ${topics.length} topics exceeds WS_MAX_SUBSCRIPTIONS (${WS_MAX_SUBSCRIPTIONS}); server will reject the overflow.`\n );\n }\n const payload: IWsSubscribeMessage = {\n type: WS_MESSAGE_TYPE.SUBSCRIBE,\n topics,\n };\n send(payload);\n };\n\n const handleOpen = (): void => {\n const token = tokenProvider();\n if (!token) {\n // No token to send — server will time us out and close. Surface state\n // for the consumer to react (e.g. wait for login).\n setState(WS_CONNECTION_STATE.AUTHENTICATING);\n return;\n }\n setState(WS_CONNECTION_STATE.AUTHENTICATING);\n const auth: IWsAuthMessage = { type: WS_MESSAGE_TYPE.AUTH, token };\n send(auth);\n if (authTimer) clearTimeout(authTimer);\n authTimer = setTimeout(() => {\n // Server is expected to close with auth_timeout; if it doesn't we\n // proactively drop the socket so the consumer can react.\n if (socket && socket.readyState === WebSocket.OPEN) {\n try {\n socket.close(WS_CLOSE_CODE.CLIENT_AUTH_TIMEOUT, 'client auth timeout');\n } catch {\n /* noop */\n }\n }\n }, WS_AUTH_TIMEOUT_MS);\n };\n\n const handleMessage = (raw: unknown): void => {\n let msg: WsServerMessage;\n try {\n msg =\n typeof raw === 'string' ? (JSON.parse(raw) as WsServerMessage) : (raw as WsServerMessage);\n } catch {\n return;\n }\n dispatch(msg);\n };\n\n const dispatch = (msg: WsServerMessage): void => {\n switch (msg.type) {\n case WS_MESSAGE_TYPE.AUTH_OK: {\n if (authTimer) {\n clearTimeout(authTimer);\n authTimer = null;\n }\n // Task J: a successful auth resets the outage attempt counter.\n reconnectAttempts = 0;\n reconnectDelay = initialMs;\n setState(WS_CONNECTION_STATE.OPEN);\n // Task E: seed the watchdog clock and start the interval now that the\n // connection is live (server `ping` arrives every `pingIntervalMs`).\n lastPingAt = Date.now();\n startPingWatchdog();\n flushSubscriptions();\n for (const h of controlHandlers) h(msg);\n return;\n }\n case WS_MESSAGE_TYPE.AUTH_FAIL: {\n // Bad token up-front — no point retrying until the token changes.\n manualClose = true;\n for (const h of controlHandlers) h(msg);\n try {\n socket?.close();\n } catch {\n /* noop */\n }\n setState(WS_CONNECTION_STATE.CLOSED);\n return;\n }\n case WS_MESSAGE_TYPE.AUTH_EXPIRED: {\n // Mid-session token expiry: try a single silent refresh first, then\n // reconnect. Consumers are notified ONLY if the refresh fails (session\n // is dead) — surfacing `auth_expired` before the refresh attempt would\n // trigger premature \"session expired\" UI for a session that was about\n // to be salvaged. See `handleTokenExpired`'s boolean return.\n void (async () => {\n const revived = await handleTokenExpired();\n if (!revived) for (const h of controlHandlers) h(msg);\n })();\n return;\n }\n case WS_MESSAGE_TYPE.PING: {\n // Task E: refresh the watchdog clock; the server is alive.\n lastPingAt = Date.now();\n const pong: IWsPongMessage = { type: WS_MESSAGE_TYPE.PONG };\n send(pong);\n return;\n }\n case WS_MESSAGE_TYPE.EVENT: {\n for (const h of eventHandlers) h(msg);\n return;\n }\n case WS_MESSAGE_TYPE.ACTION_RESULT: {\n const cb = pendingActions.get(msg.requestId);\n if (cb) {\n pendingActions.delete(msg.requestId);\n cb(msg);\n }\n for (const h of actionResultHandlers) h(msg);\n return;\n }\n case WS_MESSAGE_TYPE.ACTION_ACCEPTED:\n case WS_MESSAGE_TYPE.SUB_OK:\n case WS_MESSAGE_TYPE.SUB_ERROR:\n case WS_MESSAGE_TYPE.UNSUB_OK:\n case WS_MESSAGE_TYPE.ERROR:\n case WS_MESSAGE_TYPE.ADMIN_DISCONNECT: {\n for (const h of controlHandlers) h(msg);\n return;\n }\n default: {\n for (const h of controlHandlers) h(msg);\n }\n }\n };\n\n const handleTokenExpired = async (): Promise<boolean> => {\n manualClose = true;\n try {\n socket?.close();\n } catch {\n /* noop */\n }\n // Task A: null the socket synchronously so the pending `onclose` hits the\n // identity guard in handleClose instead of racing the `await refresh()`\n // below (which could otherwise double-trigger recovery).\n socket = null;\n clearTimers();\n if (!refresh) {\n setState(WS_CONNECTION_STATE.CLOSED);\n return false;\n }\n try {\n const next = await refresh();\n if (!next) {\n setState(WS_CONNECTION_STATE.CLOSED);\n return false;\n }\n // Persist the refreshed token so the reconnect's auth frame (read via\n // `tokenProvider`) carries the NEW token instead of re-sending the stale\n // one that triggered `auth_expired`. Without this the refresh is fetched\n // but discarded, producing an auth_expired loop.\n onToken?.(next);\n manualClose = false;\n setState(WS_CONNECTION_STATE.RECONNECTING);\n scheduleReconnect(0);\n return true;\n } catch {\n setState(WS_CONNECTION_STATE.CLOSED);\n return false;\n }\n };\n\n const handleClose = (closingSocket: WebSocket): void => {\n // Task A: ignore stale `onclose` from a socket that has already been\n // replaced by a newer one (reopen race) — it must not null the live\n // socket nor schedule a phantom reconnect.\n if (closingSocket !== socket) return;\n socket = null;\n clearTimers();\n if (manualClose || transportOffline) {\n setState(WS_CONNECTION_STATE.CLOSED);\n return;\n }\n scheduleReconnect(reconnectDelay);\n };\n\n const scheduleReconnect = (delay: number): void => {\n if (manualClose) return;\n // Task J: after too many failed attempts, give up to a terminal CLOSED so\n // consumers (e.g. the Nuxt recovery plugin) can surface \"connection lost\"\n // instead of looping forever on a prolonged outage.\n if (reconnectAttempts >= WS_MAX_RECONNECT_ATTEMPTS) {\n setState(WS_CONNECTION_STATE.CLOSED);\n return;\n }\n reconnectAttempts += 1;\n setState(WS_CONNECTION_STATE.RECONNECTING);\n if (reconnectTimer) clearTimeout(reconnectTimer);\n const jitter = Math.floor(Math.random() * WS_RECONNECT_JITTER_MS);\n reconnectTimer = setTimeout(connect, delay + jitter);\n reconnectDelay = Math.min(Math.max(delay * 2, initialMs), maxMs);\n };\n\n const startPingWatchdog = (): void => {\n if (typeof window === 'undefined') return; // SSR-safe (auth_ok only fires client-side anyway).\n if (pingWatchdogTimer) clearInterval(pingWatchdogTimer);\n pingWatchdogTimer = setInterval((): void => {\n // Task E: only check a live socket; a null/CLOSING/RECONNECTING socket\n // has its own lifecycle path.\n if (!socket || socket.readyState !== WebSocket.OPEN) return;\n const threshold = Math.max(WS_PING_INTERVAL_MS, pingIntervalMs) * WS_PING_WATCHDOG_FACTOR;\n if (Date.now() - lastPingAt > threshold) {\n try {\n socket.close(WS_CLOSE_CODE.NORMAL, 'client watchdog: ping timeout');\n } catch {\n /* noop */\n }\n }\n }, WS_PING_WATCHDOG_CHECK_MS);\n };\n\n // Task F: offline → close (no reconnect); online → re-establish. Registered\n // lazily from open() so the module body stays SSR-safe.\n const handleOffline = (): void => {\n transportOffline = true;\n if (socket) {\n try {\n socket.close(WS_CLOSE_CODE.NORMAL, 'transport offline');\n } catch {\n /* noop */\n }\n }\n setState(WS_CONNECTION_STATE.CLOSED);\n };\n const handleOnline = (): void => {\n transportOffline = false;\n open();\n };\n const registerTransportListeners = (): void => {\n if (listenersRegistered || typeof window === 'undefined') return;\n listenersRegistered = true;\n window.addEventListener('offline', handleOffline);\n window.addEventListener('online', handleOnline);\n };\n\n const connect = (): void => {\n if (!WS) return;\n // Task F: don't storm while booting offline — wait for the `online` event.\n if (typeof navigator !== 'undefined' && navigator.onLine === false) {\n setState(WS_CONNECTION_STATE.CLOSED);\n return;\n }\n if (\n socket &&\n (socket.readyState === WebSocket.OPEN || socket.readyState === WebSocket.CONNECTING)\n ) {\n return;\n }\n manualClose = false;\n // Task E: reset the watchdog clock for the new connection.\n lastPingAt = 0;\n setState(WS_CONNECTION_STATE.OPENING);\n let s: WebSocket;\n try {\n s = new WS(url);\n } catch {\n scheduleReconnect(initialMs);\n return;\n }\n // Task A: capture the socket identity in the closures so a stale `onclose`\n // from a replaced socket is ignored (see handleClose).\n socket = s;\n // Task B: capture the token this socket was opened with so reopen() can\n // collapse a burst of calls for the same token.\n inFlightToken = tokenProvider() ?? null;\n s.onopen = () => handleOpen();\n s.onmessage = (ev: MessageEvent) => handleMessage(ev.data);\n s.onerror = () => {\n // Errors are followed by a `close`; the close handler drives reconnect.\n };\n s.onclose = () => handleClose(s);\n };\n\n const open = (): void => {\n registerTransportListeners();\n manualClose = false;\n connect();\n };\n\n /**\n * Force a fresh handshake against the current token. Closes any existing\n * socket (suppressing the auto-reconnect) and opens a new one whose\n * `handleOpen` reads the CURRENT token from `tokenProvider`, so a fresh\n * login / token refresh is materialised as a brand-new auth frame.\n * Previously-subscribed topics are replayed automatically on `auth_ok`\n * via {@link flushSubscriptions} — the local `subscribed` cache is\n * intentionally preserved across close/reopen for exactly this reason.\n */\n const reopen = (): void => {\n // Task B: collapse a burst of reopen calls (e.g. silent login bumping both\n // loginEpoch and isLoggedIn) into one when the in-flight socket is already\n // being opened/authed with the current token.\n const cur = tokenProvider() ?? null;\n if (\n socket &&\n (socket.readyState === WebSocket.OPEN || socket.readyState === WebSocket.CONNECTING) &&\n cur === inFlightToken\n ) {\n return;\n }\n clearTimers();\n // Task A: the old socket's future `onclose` is ignored by handleClose's\n // identity guard (socket will already point to the new socket), so no\n // global `manualClose` toggle is needed to suppress phantom reconnects.\n if (socket) {\n try {\n socket.close(WS_CLOSE_CODE.NORMAL, 'client reopen');\n } catch {\n /* noop */\n }\n }\n socket = null;\n reconnectDelay = initialMs;\n setState(WS_CONNECTION_STATE.IDLE);\n connect();\n };\n\n const close = (reason?: string): void => {\n manualClose = true;\n clearTimers();\n if (socket) {\n try {\n socket.close(WS_CLOSE_CODE.NORMAL, reason);\n } catch {\n /* noop */\n }\n socket = null;\n }\n setState(WS_CONNECTION_STATE.CLOSED);\n };\n\n const subscribe = (topics: string[]): void => {\n const fresh: string[] = [];\n for (const t of topics) {\n if (!subscribed.has(t)) {\n subscribed.add(t);\n fresh.push(t);\n }\n }\n if (fresh.length === 0) return;\n const payload: IWsSubscribeMessage = {\n type: WS_MESSAGE_TYPE.SUBSCRIBE,\n topics: fresh,\n };\n send(payload);\n };\n\n const unsubscribe = (topics: string[]): void => {\n const present: string[] = [];\n for (const t of topics) {\n if (subscribed.delete(t)) present.push(t);\n }\n if (present.length === 0) return;\n const payload: IWsUnsubscribeMessage = {\n type: WS_MESSAGE_TYPE.UNSUBSCRIBE,\n topics: present,\n };\n send(payload);\n };\n\n const unsubscribeAll = (): void => {\n subscribed.clear();\n const payload: IWsUnsubscribeAllMessage = {\n type: WS_MESSAGE_TYPE.UNSUBSCRIBE_ALL,\n };\n send(payload);\n };\n\n const invokeAction = (\n contentUuid: string,\n action: string,\n params?: Record<string, unknown>\n ): string => {\n const requestId =\n typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function'\n ? crypto.randomUUID()\n : `req_${Date.now()}_${Math.random().toString(36).slice(2, 10)}`;\n const payload: IWsActionMessage = {\n type: WS_MESSAGE_TYPE.ACTION,\n requestId,\n contentUuid,\n action,\n params,\n };\n send(payload);\n return requestId;\n };\n\n const fetchResult = (requestId: string): void => {\n const payload: IWsFetchResultMessage = {\n type: WS_MESSAGE_TYPE.FETCH_RESULT,\n requestId,\n };\n send(payload);\n };\n\n /** Test/advanced: register a one-shot waiter for a specific request id. */\n const _waitForActionResult = (requestId: string): Promise<IWsActionResult> =>\n new Promise((resolve) => {\n pendingActions.set(requestId, resolve);\n });\n\n if (initialTopics) {\n for (const t of initialTopics) subscribed.add(t);\n }\n\n if (!lazy) {\n queueMicrotask(() => open());\n }\n\n const publicClient: IWsClient = {\n get state() {\n return state.value;\n },\n onState: (h: WsConnectionStateHandler) => {\n stateHandlers.add(h);\n h(state.value);\n return () => stateHandlers.delete(h);\n },\n onEvent: (h: WsEventHandler) => {\n eventHandlers.add(h);\n return () => eventHandlers.delete(h);\n },\n onActionResult: (h: WsActionResultHandler) => {\n actionResultHandlers.add(h);\n return () => actionResultHandlers.delete(h);\n },\n onControl: (h: WsControlHandler) => {\n controlHandlers.add(h);\n return () => controlHandlers.delete(h);\n },\n open,\n reopen,\n close,\n subscribe,\n unsubscribe,\n unsubscribeAll,\n invokeAction,\n fetchResult,\n };\n\n return Object.assign(publicClient, {\n /** @internal — exported on the instance for tests. */\n _waitForActionResult,\n }) as IWsClient & { _waitForActionResult: typeof _waitForActionResult };\n}\n","import type { $Fetch } from 'ofetch';\nimport { createAuthService } from '../services/auth';\nimport { createBarsService } from '../services/bars';\nimport { createContentService } from '../services/content';\nimport { createContentTypesService } from '../services/content-types';\nimport { createExecutionsService } from '../services/executions';\nimport { createGovService } from '../services/gov';\nimport { createHistoryService } from '../services/history';\nimport { createKalshiService } from '../services/kalshi';\nimport { createLlmService } from '../services/llm';\nimport { createNotificationsService } from '../services/notifications';\nimport { createPeopleService } from '../services/people';\nimport { createRulesService } from '../services/rules';\nimport { createSettingsService } from '../services/settings';\nimport { createApi, type RequestMiddleware } from './createApi';\nimport { resolveStorage } from './credentials/resolveStorage';\nimport { TokenManager } from './credentials/TokenManager';\nimport { createEaeraWebSocket } from './ws/createEaeraWebSocket';\nimport type { ApiMap, ICmsSDK, ICmsSDKOptions } from './sdk.type';\nimport type { IWsClient } from './ws/ws.type';\n\n/**\n * Build the CMS SDK facade.\n *\n * One call wires up: token storage → per-endpoint `$Fetch` instances\n * (sharing one token + hooks) → domain services → mock toggle.\n *\n * @example\n * ```ts\n * const sdk = createCmsSDK({\n * endpoints: { cms: 'https://cms.example.com', report: 'https://r.example.com' },\n * clientId: 'web',\n * credentials: { storage: 'cookie' },\n * mock: true,\n * })\n * ```\n */\nexport function createCmsSDK(options: ICmsSDKOptions): ICmsSDK {\n const cred = options.credentials ?? {};\n const storage = resolveStorage(cred.storage ?? 'cookie', cred.cookie);\n const tokenManager = new TokenManager(storage, {\n headerName: cred.headerName,\n // The CMS backend issues bearer tokens (`Authorization: Bearer <jwt>`).\n prefix: cred.prefix ?? 'Bearer ',\n onRefreshed: cred.onRefreshed,\n });\n\n const onToken = options.onToken;\n\n const syncToken = async (token: string | null): Promise<void> => {\n if (onToken) {\n await onToken(token);\n } else if (token) {\n tokenManager.set(token);\n } else {\n tokenManager.clear();\n }\n };\n\n // Single-flight refresh: when the access token expires, many concurrent HTTP\n // requests (and possibly the WS `auth_expired` path) can observe a 401 at\n // once. Without deduplication each caller independently invokes the refresh\n // endpoint — with a rotating refresh token this races, invalidates the first\n // caller's rotated token, and cascades into a 401 storm. This wrapper shares\n // one in-flight refresh across every caller (HTTP + WS) so the token rotates\n // exactly once and all queued callers observe the same result.\n let refreshInFlight: Promise<string | null> | null = null;\n const singleFlightRefresh = options.refresh\n ? (): Promise<string | null> => {\n if (!refreshInFlight) {\n refreshInFlight = options.refresh!().finally(() => {\n refreshInFlight = null;\n });\n }\n return refreshInFlight;\n }\n : undefined;\n\n // Per-endpoint middleware buckets (the \"dynamic interceptor\" escape hatch).\n const globalMiddlewares: RequestMiddleware[] = [];\n const perEndpointMiddlewares: Record<string, RequestMiddleware[]> = {};\n\n const buildApi = (name: string, baseURL: string): $Fetch =>\n createApi({\n baseURL,\n tokenManager,\n clientId: options.clientId,\n device: options.device,\n timeout: options.timeout,\n retry: options.retry,\n onError: options.onError,\n onUnauthorized: options.onUnauthorized,\n onToken,\n refresh: singleFlightRefresh,\n responseCasing: options.responseCasing,\n requestCasing: options.requestCasing,\n requestMiddlewares: [...globalMiddlewares, ...(perEndpointMiddlewares[name] ?? [])],\n });\n\n const apis: ApiMap = {};\n for (const [name, url] of Object.entries(options.endpoints)) {\n if (url) apis[name] = buildApi(name, url);\n }\n // Ensure `cms` always exists even if caller only provided it.\n if (!apis.cms) {\n throw new Error('createCmsSDK: endpoints.cms is required');\n }\n\n // Attach per-endpoint middlewares by wrapping each $Fetch.\n // ofetch hooks are fixed at creation; we emulate \"dynamic\" behaviour by\n // keeping our own array and re-creating the instance when needed.\n const rebuild = (name: string) => {\n if (options.endpoints[name]) {\n apis[name] = buildApi(name, options.endpoints[name] as string);\n }\n };\n const rebuildAll = () => {\n for (const [name, url] of Object.entries(options.endpoints)) {\n if (url) apis[name] = buildApi(name, url);\n }\n };\n\n const addRequestMiddleware = (target: string | 'all', mw: RequestMiddleware): (() => void) => {\n if (target === 'all') {\n globalMiddlewares.push(mw);\n rebuildAll();\n return () => {\n const idx = globalMiddlewares.indexOf(mw);\n if (idx >= 0) globalMiddlewares.splice(idx, 1);\n rebuildAll();\n };\n }\n let bucket = perEndpointMiddlewares[target];\n if (!bucket) {\n bucket = [];\n perEndpointMiddlewares[target] = bucket;\n }\n bucket.push(mw);\n rebuild(target);\n return () => {\n const idx = bucket.indexOf(mw);\n if (idx >= 0) bucket.splice(idx, 1);\n rebuild(target);\n };\n };\n\n // Mutable mock flag shared by domain services.\n const mockState = { enabled: Boolean(options.mock) };\n\n const auth = createAuthService({\n api: apis.cms,\n routeApi: options.authRoute,\n mock: () => mockState.enabled,\n });\n\n const content = createContentService({\n api: apis.cms,\n mock: () => mockState.enabled,\n });\n\n const rules = createRulesService({\n api: apis.cms,\n mock: () => mockState.enabled,\n });\n\n const executions = createExecutionsService({\n api: apis.cms,\n mock: () => mockState.enabled,\n });\n\n const settings = createSettingsService({\n api: apis.cms,\n mock: () => mockState.enabled,\n });\n\n const llm = createLlmService({\n api: apis.cms,\n mock: () => mockState.enabled,\n });\n\n const bars = createBarsService({\n api: apis.cms,\n mock: () => mockState.enabled,\n });\n\n const history = createHistoryService({\n api: apis.cms,\n mock: () => mockState.enabled,\n });\n\n const kalshi = createKalshiService({\n api: apis.cms,\n mock: () => mockState.enabled,\n });\n\n // Gov service never mocks — the pack backend is live, so it always calls\n // the real API regardless of the shared mock flag.\n const gov = createGovService({\n api: apis.cms,\n });\n\n // People service never mocks — the pack backend is live, so it always calls\n // the real API regardless of the shared mock flag (same posture as gov).\n const people = createPeopleService({\n api: apis.cms,\n });\n\n // CT metadata reads (forms/badges/action availability) participate in mock\n // mode — the mock rows let portals render before a pack installs.\n const contentTypes = createContentTypesService({\n api: apis.cms,\n mock: () => mockState.enabled,\n });\n\n // FEAT-012 templates — engine-owned backend; mock rows mirror the People\n // pack seeds so the editor is developable pre-backend.\n const notifications = createNotificationsService({\n api: apis.cms,\n mock: () => mockState.enabled,\n });\n\n // WebSocket client (FEAT-010). Built lazily so SSR-only consumers don't pay\n // the cost and so the absence of `endpoints.ws` is non-fatal.\n let ws: IWsClient | null = null;\n const getWs = (): IWsClient | null => {\n if (ws) return ws;\n const wsUrl = options.endpoints.ws;\n if (!wsUrl) return null;\n ws = createEaeraWebSocket({\n url: wsUrl,\n getToken: () => tokenManager.get(),\n // Mid-session `auth_expired` recovery: persist the refreshed token so the\n // reconnect's auth frame carries the new token (getToken reads it back).\n // The httpOnly cookie is already rotated by the refresh server route, so\n // only the in-memory token needs updating here.\n onToken: (token) => tokenManager.set(token),\n refresh: singleFlightRefresh,\n lazy: true,\n });\n return ws;\n };\n\n return {\n apis,\n tokenManager,\n auth,\n content,\n rules,\n executions,\n settings,\n llm,\n bars,\n history,\n kalshi,\n gov,\n people,\n contentTypes,\n notifications,\n /** Lazily-built WebSocket client. `null` when `endpoints.ws` is omitted. */\n get ws(): IWsClient | null {\n return getWs();\n },\n addRequestMiddleware,\n setMock: (enabled: boolean) => {\n mockState.enabled = enabled;\n },\n syncToken,\n };\n}\n","/**\n * Real condition-field catalog for the MT5 pack.\n *\n * Mirrors the metric columns defined in `eaera-mt5/eaera_mt5/models`\n * (`account_state`, `account_metric_by_deal`, `account_symbol_metric_by_deal`,\n * `account_metric_daily`, `position_metric_by_deal`) plus the raw `deal`\n * table. A fixed rule carries its checks as a flat AND\n * `trigger.conditions[]` over these fields; each field is resolved **per\n * account** from ClickHouse by the CMS evaluator. The UI metric dropdown is\n * sourced from this constant — it is not invented.\n */\n\nimport { MT5_ACTION_NAME } from '../../common/constants/mt5-action.constant';\nimport { EXECUTION_TYPE } from './rules.type';\nimport type { ExecutionType } from './rules.type';\n\nexport type ConditionValueType = 'float' | 'integer' | 'string';\n\n/** ClickHouse metric tables the CMS evaluator resolves condition fields from.\n * Mirrors the L1–L3a tables in `eaera_mt5/models` + the `deal` table. */\nexport type ConditionTable =\n | 'account_state'\n | 'account_metric_by_deal'\n | 'account_symbol_metric_by_deal'\n | 'account_metric_daily'\n | 'position_metric_by_deal'\n | 'deal';\n\nexport interface ConditionField {\n /** Backend key, e.g. `account_state.equity`. */\n key: string;\n /** Human label, e.g. `Account Equity`. */\n label: string;\n table: ConditionTable;\n column: string;\n valueType: ConditionValueType;\n description: string;\n unit: string;\n}\n\nexport const CONDITION_FIELDS: readonly ConditionField[] = [\n // ── L1: account_state ──\n {\n key: 'account_state.equity',\n label: 'Account Equity',\n table: 'account_state',\n column: 'equity',\n valueType: 'float',\n description: 'Current account equity (balance + floating P/L) in account currency.',\n unit: 'account currency',\n },\n {\n key: 'account_state.margin_level',\n label: 'Margin Level',\n table: 'account_state',\n column: 'margin_level',\n valueType: 'float',\n description: 'Margin level percentage (equity / margin_initial * 100).',\n unit: '%',\n },\n {\n key: 'account_state.margin_free',\n label: 'Free Margin',\n table: 'account_state',\n column: 'margin_free',\n valueType: 'float',\n description: 'Free margin available for new positions, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'account_state.profit',\n label: 'Realised P/L',\n table: 'account_state',\n column: 'profit',\n valueType: 'float',\n description: 'Realised profit/loss for the session, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'account_state.margin_leverage',\n label: 'Margin Leverage',\n table: 'account_state',\n column: 'margin_leverage',\n valueType: 'integer',\n description: 'Leverage configured on the account (e.g. 100 = 1:100).',\n unit: 'ratio',\n },\n {\n key: 'account_state.floating',\n label: 'Floating P/L',\n table: 'account_state',\n column: 'floating',\n valueType: 'float',\n description: 'Unrealised (floating) profit/loss across open positions, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'account_state.margin_initial',\n label: 'Initial Margin',\n table: 'account_state',\n column: 'margin_initial',\n valueType: 'float',\n description: 'Initial margin required by currently open positions, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'account_state.margin_maintenance',\n label: 'Maintenance Margin',\n table: 'account_state',\n column: 'margin_maintenance',\n valueType: 'float',\n description: 'Maintenance margin for currently open positions, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'account_state.open_positions',\n label: 'Open Positions',\n table: 'account_state',\n column: 'open_positions',\n valueType: 'integer',\n description: 'Number of positions currently open on the account.',\n unit: 'count',\n },\n {\n key: 'account_state.pending_orders',\n label: 'Pending Orders',\n table: 'account_state',\n column: 'pending_orders',\n valueType: 'integer',\n description: 'Number of pending orders on the account.',\n unit: 'count',\n },\n // ── L2: account_metric_by_deal ──\n {\n key: 'account_metric_by_deal.balance',\n label: 'Account Balance',\n table: 'account_metric_by_deal',\n column: 'balance',\n valueType: 'float',\n description: 'Account balance after the deal settled, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'account_metric_by_deal.net_profit',\n label: 'Net Profit',\n table: 'account_metric_by_deal',\n column: 'net_profit',\n valueType: 'float',\n description: 'Cumulative net profit (realised + closed-position delta) in account currency.',\n unit: 'account currency',\n },\n {\n key: 'account_metric_by_deal.relative_balance_drawdown',\n label: 'Relative Balance Drawdown',\n table: 'account_metric_by_deal',\n column: 'relative_balance_drawdown',\n valueType: 'float',\n description: 'Current balance drawdown as a fraction of the highest balance (0.0-1.0).',\n unit: 'fraction',\n },\n {\n key: 'account_metric_by_deal.max_relative_balance_drawdown',\n label: 'Max Relative Balance Drawdown',\n table: 'account_metric_by_deal',\n column: 'max_relative_balance_drawdown',\n valueType: 'float',\n description: 'Maximum relative drawdown observed since the account opened (0.0-1.0).',\n unit: 'fraction',\n },\n {\n key: 'account_metric_by_deal.realized_pnl_daily',\n label: 'Realised P/L (Today)',\n table: 'account_metric_by_deal',\n column: 'realized_pnl_daily',\n valueType: 'float',\n description:\n 'Realised profit/loss accumulated since the trading day opened, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'account_metric_by_deal.count_trades',\n label: 'Trade Count',\n table: 'account_metric_by_deal',\n column: 'count_trades',\n valueType: 'integer',\n description: 'Total number of deals executed by the account since open.',\n unit: 'count',\n },\n {\n key: 'account_metric_by_deal.consecutive_losses',\n label: 'Consecutive Losses',\n table: 'account_metric_by_deal',\n column: 'consecutive_losses',\n valueType: 'integer',\n description: 'Current run of consecutive losing deals (resets on a win).',\n unit: 'count',\n },\n {\n key: 'account_metric_by_deal.consecutive_wins',\n label: 'Consecutive Wins',\n table: 'account_metric_by_deal',\n column: 'consecutive_wins',\n valueType: 'integer',\n description: 'Current run of consecutive winning deals (resets on a loss).',\n unit: 'count',\n },\n {\n key: 'account_metric_by_deal.wins_ratio',\n label: 'Win Ratio',\n table: 'account_metric_by_deal',\n column: 'wins_ratio',\n valueType: 'float',\n description: 'Fraction of deals that closed in profit (0.0-1.0).',\n unit: 'fraction',\n },\n {\n key: 'account_metric_by_deal.deal_profit',\n label: 'Deal Profit',\n table: 'account_metric_by_deal',\n column: 'deal_profit',\n valueType: 'float',\n description: 'Raw profit of the deal that produced this metric row, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'account_metric_by_deal.highest_account_balance',\n label: 'Highest Account Balance',\n table: 'account_metric_by_deal',\n column: 'highest_account_balance',\n valueType: 'float',\n description: 'Peak account balance observed since the account opened, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'account_metric_by_deal.gross_profit',\n label: 'Gross Profit',\n table: 'account_metric_by_deal',\n column: 'gross_profit',\n valueType: 'float',\n description: 'Sum of all profitable deals (commissions excluded), in account currency.',\n unit: 'account currency',\n },\n {\n key: 'account_metric_by_deal.gross_loss',\n label: 'Gross Loss',\n table: 'account_metric_by_deal',\n column: 'gross_loss',\n valueType: 'float',\n description: 'Sum of all losing deals (commissions excluded), in account currency.',\n unit: 'account currency',\n },\n {\n key: 'account_metric_by_deal.eligible_profit',\n label: 'Eligible Profit',\n table: 'account_metric_by_deal',\n column: 'eligible_profit',\n valueType: 'float',\n description: 'Profit counted as eligible for payout/withdrawal criteria, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'account_metric_by_deal.closed_profit',\n label: 'Closed Profit',\n table: 'account_metric_by_deal',\n column: 'closed_profit',\n valueType: 'float',\n description: 'Cumulative profit from fully closed positions, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'account_metric_by_deal.abs_closed_profit',\n label: 'Absolute Closed Profit',\n table: 'account_metric_by_deal',\n column: 'abs_closed_profit',\n valueType: 'float',\n description: 'Absolute value of cumulative closed-position profit, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'account_metric_by_deal.daily_closed_profit',\n label: 'Daily Closed Profit',\n table: 'account_metric_by_deal',\n column: 'daily_closed_profit',\n valueType: 'float',\n description:\n 'Cumulative closed-position profit for the current trading day, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'account_metric_by_deal.max_daily_closed_profit',\n label: 'Max Daily Closed Profit',\n table: 'account_metric_by_deal',\n column: 'max_daily_closed_profit',\n valueType: 'float',\n description: 'Peak daily closed-position profit observed, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'account_metric_by_deal.count_long_trades',\n label: 'Long Trade Count',\n table: 'account_metric_by_deal',\n column: 'count_long_trades',\n valueType: 'integer',\n description: 'Total number of long (buy) deals executed by the account since open.',\n unit: 'count',\n },\n {\n key: 'account_metric_by_deal.count_short_trades',\n label: 'Short Trade Count',\n table: 'account_metric_by_deal',\n column: 'count_short_trades',\n valueType: 'integer',\n description: 'Total number of short (sell) deals executed by the account since open.',\n unit: 'count',\n },\n {\n key: 'account_metric_by_deal.count_profit_trades',\n label: 'Profitable Trade Count',\n table: 'account_metric_by_deal',\n column: 'count_profit_trades',\n valueType: 'integer',\n description: 'Total number of deals that closed in profit since open.',\n unit: 'count',\n },\n {\n key: 'account_metric_by_deal.count_loss_trades',\n label: 'Losing Trade Count',\n table: 'account_metric_by_deal',\n column: 'count_loss_trades',\n valueType: 'integer',\n description: 'Total number of deals that closed at a loss since open.',\n unit: 'count',\n },\n {\n key: 'account_metric_by_deal.total_volume',\n label: 'Total Volume',\n table: 'account_metric_by_deal',\n column: 'total_volume',\n valueType: 'float',\n description: 'Cumulative traded volume across all deals since open.',\n unit: 'lots',\n },\n {\n key: 'account_metric_by_deal.profit_long_trades',\n label: 'Long Trades Profit',\n table: 'account_metric_by_deal',\n column: 'profit_long_trades',\n valueType: 'float',\n description: 'Cumulative profit from long (buy) trades, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'account_metric_by_deal.profit_short_trades',\n label: 'Short Trades Profit',\n table: 'account_metric_by_deal',\n column: 'profit_short_trades',\n valueType: 'float',\n description: 'Cumulative profit from short (sell) trades, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'account_metric_by_deal.losses_ratio',\n label: 'Loss Ratio',\n table: 'account_metric_by_deal',\n column: 'losses_ratio',\n valueType: 'float',\n description: 'Fraction of deals that closed at a loss (0.0-1.0).',\n unit: 'fraction',\n },\n {\n key: 'account_metric_by_deal.best_trade',\n label: 'Best Trade',\n table: 'account_metric_by_deal',\n column: 'best_trade',\n valueType: 'float',\n description: 'Largest single-deal profit observed, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'account_metric_by_deal.worst_trade',\n label: 'Worst Trade',\n table: 'account_metric_by_deal',\n column: 'worst_trade',\n valueType: 'float',\n description: 'Largest single-deal loss observed, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'account_metric_by_deal.average_win',\n label: 'Average Win',\n table: 'account_metric_by_deal',\n column: 'average_win',\n valueType: 'float',\n description: 'Average profit per winning deal, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'account_metric_by_deal.average_loss',\n label: 'Average Loss',\n table: 'account_metric_by_deal',\n column: 'average_loss',\n valueType: 'float',\n description: 'Average loss per losing deal, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'account_metric_by_deal.max_daily_profit_loss',\n label: 'Max Daily Profit/Loss',\n table: 'account_metric_by_deal',\n column: 'max_daily_profit_loss',\n valueType: 'float',\n description: 'Largest single-day profit or loss observed, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'account_metric_by_deal.max_consecutive_wins',\n label: 'Max Consecutive Wins',\n table: 'account_metric_by_deal',\n column: 'max_consecutive_wins',\n valueType: 'integer',\n description: 'Longest run of consecutive winning deals observed since open.',\n unit: 'count',\n },\n {\n key: 'account_metric_by_deal.max_consecutive_losses',\n label: 'Max Consecutive Losses',\n table: 'account_metric_by_deal',\n column: 'max_consecutive_losses',\n valueType: 'integer',\n description: 'Longest run of consecutive losing deals observed since open.',\n unit: 'count',\n },\n {\n key: 'account_metric_by_deal.consecutive_wins_amount',\n label: 'Consecutive Wins Amount',\n table: 'account_metric_by_deal',\n column: 'consecutive_wins_amount',\n valueType: 'float',\n description: 'Cumulative profit of the current winning streak, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'account_metric_by_deal.max_consecutive_wins_amount',\n label: 'Max Consecutive Wins Amount',\n table: 'account_metric_by_deal',\n column: 'max_consecutive_wins_amount',\n valueType: 'float',\n description: 'Peak cumulative profit of any winning streak observed, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'account_metric_by_deal.consecutive_losses_amount',\n label: 'Consecutive Losses Amount',\n table: 'account_metric_by_deal',\n column: 'consecutive_losses_amount',\n valueType: 'float',\n description: 'Cumulative loss of the current losing streak, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'account_metric_by_deal.trading_days',\n label: 'Trading Days',\n table: 'account_metric_by_deal',\n column: 'trading_days',\n valueType: 'integer',\n description: 'Total number of calendar trading days with activity since open.',\n unit: 'count',\n },\n {\n key: 'account_metric_by_deal.profitable_trading_days',\n label: 'Profitable Trading Days',\n table: 'account_metric_by_deal',\n column: 'profitable_trading_days',\n valueType: 'integer',\n description: 'Number of trading days that closed in profit since open.',\n unit: 'count',\n },\n {\n key: 'account_metric_by_deal.active_trading_days_with_conditions',\n label: 'Active Trading Days (Conditional)',\n table: 'account_metric_by_deal',\n column: 'active_trading_days_with_conditions',\n valueType: 'integer',\n description: 'Number of active trading days meeting the configured activity conditions.',\n unit: 'count',\n },\n {\n key: 'account_metric_by_deal.max_recovery_time',\n label: 'Max Recovery Time',\n table: 'account_metric_by_deal',\n column: 'max_recovery_time',\n valueType: 'integer',\n description: 'Longest time taken to recover from a balance drawdown to a new high, in seconds.',\n unit: 'seconds',\n },\n {\n key: 'account_metric_by_deal.total_deposit',\n label: 'Total Deposit',\n table: 'account_metric_by_deal',\n column: 'total_deposit',\n valueType: 'float',\n description: 'Cumulative deposit (balance-in) amount since open, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'account_metric_by_deal.total_withdrawal',\n label: 'Total Withdrawal',\n table: 'account_metric_by_deal',\n column: 'total_withdrawal',\n valueType: 'float',\n description: 'Cumulative withdrawal (balance-out) amount since open, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'account_metric_by_deal.count_closed_positions',\n label: 'Closed Positions Count',\n table: 'account_metric_by_deal',\n column: 'count_closed_positions',\n valueType: 'integer',\n description: 'Total number of fully closed positions since open.',\n unit: 'count',\n },\n {\n key: 'account_metric_by_deal.total_trade_duration',\n label: 'Total Trade Duration',\n table: 'account_metric_by_deal',\n column: 'total_trade_duration',\n valueType: 'integer',\n description: 'Cumulative open duration across all closed positions, in seconds.',\n unit: 'seconds',\n },\n {\n key: 'account_metric_by_deal.average_trade_duration',\n label: 'Average Trade Duration',\n table: 'account_metric_by_deal',\n column: 'average_trade_duration',\n valueType: 'integer',\n description: 'Mean open duration per closed position, in seconds.',\n unit: 'seconds',\n },\n {\n key: 'account_metric_by_deal.rpp_abs',\n label: 'RPP (Absolute)',\n table: 'account_metric_by_deal',\n column: 'rpp_abs',\n valueType: 'float',\n description:\n 'Absolute relative profit potential (risk-adjusted exposure), in account currency.',\n unit: 'account currency',\n },\n {\n key: 'account_metric_by_deal.rpp_rel',\n label: 'RPP (Relative)',\n table: 'account_metric_by_deal',\n column: 'rpp_rel',\n valueType: 'float',\n description: 'Relative profit potential as a fraction of exposure (0.0-1.0+).',\n unit: 'fraction',\n },\n {\n key: 'account_metric_by_deal.cummulative_balance',\n label: 'Cumulative Balance',\n table: 'account_metric_by_deal',\n column: 'cummulative_balance',\n valueType: 'float',\n description: 'Running cumulative balance including deposits/withdrawals, in account currency.',\n unit: 'account currency',\n },\n // ── L3a: account_symbol_metric_by_deal ──\n {\n key: 'account_symbol_metric_by_deal.total_trades',\n label: 'Symbol Total Trades',\n table: 'account_symbol_metric_by_deal',\n column: 'total_trades',\n valueType: 'integer',\n description: 'Total number of deals for the symbol since open.',\n unit: 'count',\n },\n {\n key: 'account_symbol_metric_by_deal.total_profit',\n label: 'Symbol Total Profit',\n table: 'account_symbol_metric_by_deal',\n column: 'total_profit',\n valueType: 'float',\n description: 'Cumulative raw profit for the symbol since open, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'account_symbol_metric_by_deal.total_commission',\n label: 'Symbol Total Commission',\n table: 'account_symbol_metric_by_deal',\n column: 'total_commission',\n valueType: 'float',\n description: 'Cumulative commission paid for the symbol since open, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'account_symbol_metric_by_deal.total_storage',\n label: 'Symbol Total Storage (Swap)',\n table: 'account_symbol_metric_by_deal',\n column: 'total_storage',\n valueType: 'float',\n description: 'Cumulative storage/swap cost for the symbol since open, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'account_symbol_metric_by_deal.total_net_profit',\n label: 'Symbol Total Net Profit',\n table: 'account_symbol_metric_by_deal',\n column: 'total_net_profit',\n valueType: 'float',\n description:\n 'Cumulative net profit for the symbol (total_profit − total_commission − total_storage), in account currency.',\n unit: 'account currency',\n },\n // ── L3b: account_metric_daily ──\n {\n key: 'account_metric_daily.date',\n label: 'Daily Snapshot Date',\n table: 'account_metric_daily',\n column: 'date',\n valueType: 'string',\n description: 'Calendar date (YYYY-MM-DD) the daily snapshot row belongs to.',\n unit: 'date',\n },\n {\n key: 'account_metric_daily.balance',\n label: 'Daily Balance',\n table: 'account_metric_daily',\n column: 'balance',\n valueType: 'float',\n description: 'Account balance at the end of the snapshot day, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'account_metric_daily.equity',\n label: 'Daily Equity',\n table: 'account_metric_daily',\n column: 'equity',\n valueType: 'float',\n description: 'Account equity at the end of the snapshot day, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'account_metric_daily.profit_loss',\n label: 'Daily Profit/Loss',\n table: 'account_metric_daily',\n column: 'profit_loss',\n valueType: 'float',\n description: 'Realised profit/loss for the snapshot day, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'account_metric_daily.initial_deposit',\n label: 'Initial Deposit',\n table: 'account_metric_daily',\n column: 'initial_deposit',\n valueType: 'float',\n description: 'Initial deposit used as the baseline for the day, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'account_metric_daily.max_balance_equity',\n label: 'Max Balance/Equity',\n table: 'account_metric_daily',\n column: 'max_balance_equity',\n valueType: 'float',\n description: 'Peak balance or equity observed for the snapshot day, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'account_metric_daily.daily_drawdown_threshold',\n label: 'Daily Drawdown Threshold',\n table: 'account_metric_daily',\n column: 'daily_drawdown_threshold',\n valueType: 'float',\n description: 'Configured daily drawdown threshold for the snapshot day, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'account_metric_daily.yesterday_balance',\n label: \"Yesterday's Balance\",\n table: 'account_metric_daily',\n column: 'yesterday_balance',\n valueType: 'float',\n description: 'Closing balance of the previous day, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'account_metric_daily.days_elapsed',\n label: 'Days Elapsed',\n table: 'account_metric_daily',\n column: 'days_elapsed',\n valueType: 'integer',\n description: 'Number of days elapsed since the account started trading.',\n unit: 'count',\n },\n {\n key: 'account_metric_daily.days_left',\n label: 'Days Left',\n table: 'account_metric_daily',\n column: 'days_left',\n valueType: 'integer',\n description: 'Number of days remaining until the account expiry date.',\n unit: 'count',\n },\n {\n key: 'account_metric_daily.registration_date',\n label: 'Registration Date',\n table: 'account_metric_daily',\n column: 'registration_date',\n valueType: 'string',\n description: 'Date the account was first registered (YYYY-MM-DD).',\n unit: 'date',\n },\n {\n key: 'account_metric_daily.expiry_date',\n label: 'Expiry Date',\n table: 'account_metric_daily',\n column: 'expiry_date',\n valueType: 'string',\n description: 'Date the account is due to expire (YYYY-MM-DD).',\n unit: 'date',\n },\n // ── L2b: position_metric_by_deal ──\n {\n key: 'position_metric_by_deal.action',\n label: 'Position Deal Action',\n table: 'position_metric_by_deal',\n column: 'action',\n valueType: 'integer',\n description: 'MT5 deal action enum that updated the position (e.g. buy/sell/balance).',\n unit: 'enum',\n },\n {\n key: 'position_metric_by_deal.volume',\n label: 'Position Volume',\n table: 'position_metric_by_deal',\n column: 'volume',\n valueType: 'float',\n description: 'Current (remaining) volume of the position, in lots.',\n unit: 'lots',\n },\n {\n key: 'position_metric_by_deal.volume_closed',\n label: 'Volume Closed',\n table: 'position_metric_by_deal',\n column: 'volume_closed',\n valueType: 'float',\n description: 'Volume of the position already closed by partial fills, in lots.',\n unit: 'lots',\n },\n {\n key: 'position_metric_by_deal.volume_remaining',\n label: 'Volume Remaining',\n table: 'position_metric_by_deal',\n column: 'volume_remaining',\n valueType: 'float',\n description: 'Volume of the position still open, in lots.',\n unit: 'lots',\n },\n {\n key: 'position_metric_by_deal.profit',\n label: 'Position Profit',\n table: 'position_metric_by_deal',\n column: 'profit',\n valueType: 'float',\n description: 'Profit of the position after the deal, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'position_metric_by_deal.profit_raw',\n label: 'Position Raw Profit',\n table: 'position_metric_by_deal',\n column: 'profit_raw',\n valueType: 'float',\n description: 'Raw (pre-commission) profit of the position, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'position_metric_by_deal.net_profit',\n label: 'Position Net Profit',\n table: 'position_metric_by_deal',\n column: 'net_profit',\n valueType: 'float',\n description: 'Net profit of the position after commission, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'position_metric_by_deal.commission',\n label: 'Position Commission',\n table: 'position_metric_by_deal',\n column: 'commission',\n valueType: 'float',\n description: 'Commission charged on the position, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'position_metric_by_deal.rate_margin',\n label: 'Position Margin Rate',\n table: 'position_metric_by_deal',\n column: 'rate_margin',\n valueType: 'float',\n description: 'Margin rate applied to the position volume.',\n unit: 'ratio',\n },\n {\n key: 'position_metric_by_deal.storage',\n label: 'Position Storage (Swap)',\n table: 'position_metric_by_deal',\n column: 'storage',\n valueType: 'float',\n description: 'Accumulated storage/swap cost for the position, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'position_metric_by_deal.total_trade_duration',\n label: 'Position Trade Duration',\n table: 'position_metric_by_deal',\n column: 'total_trade_duration',\n valueType: 'integer',\n description: 'Total open duration of the position so far, in seconds.',\n unit: 'seconds',\n },\n {\n key: 'position_metric_by_deal.comment',\n label: 'Position Comment',\n table: 'position_metric_by_deal',\n column: 'comment',\n valueType: 'string',\n description: 'Free-text comment attached to the position/deal.',\n unit: 'string',\n },\n // ── deal ──\n {\n key: 'deal.action',\n label: 'Deal Action',\n table: 'deal',\n column: 'action',\n valueType: 'integer',\n description: 'MT5 deal action/type enum (e.g. buy, sell, balance, credit).',\n unit: 'enum',\n },\n {\n key: 'deal.entry',\n label: 'Deal Entry',\n table: 'deal',\n column: 'entry',\n valueType: 'integer',\n description: 'MT5 deal entry direction enum (in, out, inout).',\n unit: 'enum',\n },\n {\n key: 'deal.volume',\n label: 'Deal Volume',\n table: 'deal',\n column: 'volume',\n valueType: 'float',\n description: 'Executed volume of the deal, in lots.',\n unit: 'lots',\n },\n {\n key: 'deal.profit',\n label: 'Deal Profit',\n table: 'deal',\n column: 'profit',\n valueType: 'float',\n description: 'Profit of the deal, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'deal.commission',\n label: 'Deal Commission',\n table: 'deal',\n column: 'commission',\n valueType: 'float',\n description: 'Commission charged on the deal, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'deal.fee',\n label: 'Deal Fee',\n table: 'deal',\n column: 'fee',\n valueType: 'float',\n description: 'Fee charged on the deal, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'deal.storage',\n label: 'Deal Storage (Swap)',\n table: 'deal',\n column: 'storage',\n valueType: 'float',\n description: 'Storage/swap cost of the deal, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'deal.swap',\n label: 'Deal Swap',\n table: 'deal',\n column: 'swap',\n valueType: 'float',\n description: 'Swap value applied to the deal, in account currency.',\n unit: 'account currency',\n },\n {\n key: 'deal.comment',\n label: 'Deal Comment',\n table: 'deal',\n column: 'comment',\n valueType: 'string',\n description: 'Free-text comment attached to the deal.',\n unit: 'string',\n },\n {\n key: 'deal.reason',\n label: 'Deal Reason',\n table: 'deal',\n column: 'reason',\n valueType: 'integer',\n description: 'MT5 deal reason enum (e.g. client, SL, TP, margin call).',\n unit: 'enum',\n },\n];\n\n/** Comparison operators the condition builder emits into `trigger.conditions[]`.\n *\n * These are the **word forms** the CMS condition evaluator expects on the wire\n * (`eaera_cms/core/rules/conditions.py:_apply_operator`). The evaluator also\n * accepts the JSON-Logic symbol aliases (`==`, `!=`, `>`, `>=`, `<`, `<=`),\n * but the canonical contract uses the word forms — see the FEAT-006 testing\n * guide and `risk-rules-api-guide.md` §4.E.a.\n *\n * Operator kind, per the backend `value` semantics:\n * - `gt`, `gte`, `lt`, `lte` — numeric (`account_state.*`,\n * `account_metric_by_deal.*`)\n * - `eq`, `ne` — any (string / number / boolean)\n * - `in`, `not_in` — value MUST be a JSON list\n * - `contains`, `startswith`, `endswith` — string substring/affix;\n * backend coerces entity via `str()`\n * - `is_null`, `is_not_null` — `value` is IGNORED by the backend;\n * UI should hide the value input\n * - `sum_within_days` — CH-windowed SUM; carries a sibling\n * `days` window (defaults to 30).\n * Special — see {@link SUM_WITHIN_DAYS}\n * constant; not in {@link CONDITION_OPERATORS}.\n *\n * The UI renders the friendlier symbol for the 6 numeric word-forms via\n * {@link CONDITION_OPERATOR_LABELS}; the others have explicit text labels\n * (see {@link CONDITION_OPERATOR_LABELS} + {@link CONDITION_OPERATOR_LABELS_TEXT}).\n */\nexport const CONDITION_OPERATORS = [\n // numeric\n 'gt',\n 'gte',\n 'lt',\n 'lte',\n 'eq',\n 'ne',\n // list membership\n 'in',\n 'not_in',\n // string substring / affix\n 'contains',\n 'startswith',\n 'endswith',\n // null check\n 'is_null',\n 'is_not_null',\n] as const;\nexport type ConditionOperator = (typeof CONDITION_OPERATORS)[number];\n\n/** The CH-windowed SUM operator — special, NOT a member of\n * {@link CONDITION_OPERATORS} because it carries a sibling `days` key.\n * Authored through the rule YAML/expression path or directly via the API.\n * The dashboard does not surface this in the standard operator dropdown. */\nexport const SUM_WITHIN_DAYS = 'sum_within_days' as const;\nexport type SumWithinDaysOperator = typeof SUM_WITHIN_DAYS;\n\n/** Symbol label shown in the UI for each numeric word-form operator. */\nexport const CONDITION_OPERATOR_LABELS: Record<ConditionOperator, string> = {\n gt: '>',\n gte: '>=',\n lt: '<',\n lte: '<=',\n eq: '==',\n ne: '!=',\n in: 'in',\n not_in: 'not in',\n contains: 'contains',\n startswith: 'starts with',\n endswith: 'ends with',\n is_null: 'is null',\n is_not_null: 'is not null',\n};\n\n/** Per-operator value-type metadata. Drives the dashboard's value-input widget:\n * - `number` → numeric input\n * - `string` → single-line text input (substrings/affixes)\n * - `list` → JSON-array editor (CSV/JSON toggle recommended)\n * - `none` → value is ignored by the backend; UI should hide the input\n */\nexport type ConditionOperatorValueKind = 'number' | 'string' | 'list' | 'none';\n\nexport const CONDITION_OPERATOR_VALUE_KINDS: Record<ConditionOperator, ConditionOperatorValueKind> =\n {\n gt: 'number',\n gte: 'number',\n lt: 'number',\n lte: 'number',\n eq: 'number',\n ne: 'number',\n in: 'list',\n not_in: 'list',\n contains: 'string',\n startswith: 'string',\n endswith: 'string',\n is_null: 'none',\n is_not_null: 'none',\n };\n\n/** Symbol form → word form. The backend accepts both on the wire; the dashboard\n * canonicalises to the word form on save and on load (`useRuleBuilder`\n * `_normalizeOperator`). */\nexport const CONDITION_OPERATOR_SYMBOL_TO_WORD: Record<string, ConditionOperator> = {\n '>': 'gt',\n '>=': 'gte',\n '<': 'lt',\n '<=': 'lte',\n '==': 'eq',\n '=': 'eq',\n '!=': 'ne',\n '<>': 'ne',\n};\n\n/** Normalise any operator string (symbol, word, or unknown) to a word form.\n * Unknown inputs are returned as-is so the backend's `eq`-fallback semantics\n * remain the source of truth. */\nexport const normalizeConditionOperator = (raw: unknown): string => {\n const op = String(raw ?? 'gt')\n .trim()\n .toLowerCase();\n return CONDITION_OPERATOR_SYMBOL_TO_WORD[op] ?? op;\n};\n\n/**\n * Allowed MT5 leverage values for the `change_leverage` action. MT5 accepts a\n * constrained integer set; the rule builder offers these as a select rather\n * than a free-text input. The MT5 worker coerces the value to a positive int\n * (`worker/tasks/dispatcher.py:_change_leverage`); this list mirrors the\n * common broker-configured leverages.\n */\nexport const LEVERAGE_OPTIONS = [\n 1, 5, 10, 20, 25, 30, 40, 50, 100, 200, 300, 400, 500, 1000,\n] as const;\nexport type LeverageOption = (typeof LEVERAGE_OPTIONS)[number];\n\n/**\n * Builder action kinds → CMS action wiring. The fixed-rule action chain maps\n * a UI `kind` to its `actionName` + nested `params` key. Kept here so the FE\n * serializer (and the docs) stay in sync with the worker dispatcher contract.\n *\n * Specialized kinds (`move`, `leverage`, `tag`, `setField`) have dedicated UI\n * inputs. The `custom` kind is a fallback for any action not in this list — it\n * renders the `actionName` as read-only and exposes raw `params` as JSON.\n */\n\n/** Value-level constants for action kinds — single source of truth. */\nexport const ACTION_KIND = {\n MOVE: 'move',\n LEVERAGE: 'leverage',\n TAG: 'tag',\n SET_FIELD: 'setField',\n DISABLE_TRADE: 'disableTrade',\n ENABLE_TRADE: 'enableTrade',\n GENERATE_REPORT: 'generateReport',\n GENERATE_AI_SUMMARY: 'generateAiSummary',\n PROVISION_USER: 'provisionUser',\n CUSTOM: 'custom',\n} as const;\n\n/** Action kind type — derived from {@link ACTION_KIND}. */\nexport type RuleActionKind = (typeof ACTION_KIND)[keyof typeof ACTION_KIND];\n\nexport interface ActionKindDef {\n kind: RuleActionKind;\n actionName: string;\n /** Nested `params` key the worker dispatcher reads (camelCase; the CMS\n * casing middleware converts to snake_case before the worker sees it). */\n paramKey?: string;\n /** Default codeRef (pack handler path) for actions that require one. */\n defaultCodeRef?: string;\n /** Human label shown in the UI kind selector. */\n label: string;\n}\n\nexport const ACTION_KINDS: readonly ActionKindDef[] = [\n {\n kind: ACTION_KIND.MOVE,\n actionName: MT5_ACTION_NAME.CHANGE_GROUP,\n paramKey: 'newGroup',\n defaultCodeRef: 'eaera_mt5.handlers.operational:change_group',\n label: 'Move to group',\n },\n {\n kind: ACTION_KIND.LEVERAGE,\n actionName: MT5_ACTION_NAME.CHANGE_LEVERAGE,\n paramKey: 'newLeverage',\n defaultCodeRef: 'eaera_mt5.handlers.operational:change_leverage',\n label: 'Set leverage',\n },\n {\n kind: ACTION_KIND.TAG,\n actionName: MT5_ACTION_NAME.TAG_ACCOUNT,\n paramKey: 'tags',\n defaultCodeRef: 'eaera_mt5.handlers.local:tag_account',\n label: 'Tag account',\n },\n {\n kind: ACTION_KIND.SET_FIELD,\n actionName: EXECUTION_TYPE.SET_FIELD,\n paramKey: 'field',\n label: 'Set field',\n },\n {\n kind: ACTION_KIND.DISABLE_TRADE,\n actionName: MT5_ACTION_NAME.DISABLE_TRADE,\n paramKey: 'reason',\n defaultCodeRef: 'eaera_mt5.handlers.operational:disable_trade',\n label: 'Disable trading',\n },\n {\n kind: ACTION_KIND.ENABLE_TRADE,\n actionName: MT5_ACTION_NAME.ENABLE_TRADE,\n paramKey: 'reason',\n defaultCodeRef: 'eaera_mt5.handlers.operational:enable_trade',\n label: 'Enable trading',\n },\n {\n kind: ACTION_KIND.GENERATE_REPORT,\n actionName: MT5_ACTION_NAME.GENERATE_REPORT,\n defaultCodeRef: 'eaera_mt5.handlers.local:generate_report',\n label: 'Generate report',\n },\n {\n kind: ACTION_KIND.GENERATE_AI_SUMMARY,\n actionName: MT5_ACTION_NAME.GENERATE_AI_SUMMARY,\n defaultCodeRef: 'eaera_mt5.handlers.local:generate_ai_summary',\n label: 'Generate AI summary',\n },\n {\n kind: ACTION_KIND.PROVISION_USER,\n actionName: MT5_ACTION_NAME.PROVISION_USER,\n paramKey: 'field',\n defaultCodeRef: 'eaera_mt5.handlers.sync:user_sync',\n label: 'Provision user',\n },\n];\n\n/** Lookup an ActionKindDef by backend actionName. Returns undefined for unknown names. */\nexport const actionDefByActionName = (actionName: string): ActionKindDef | undefined =>\n ACTION_KINDS.find((def) => def.actionName === actionName);\n\n/** Per-action `result.output` field shapes — the authoritative reference for\n * what the CMS completion handler stores at `execution.result.output` after a\n * successful action.\n *\n * When the history/detection feeds fetch with `?exclude_params=true`, the\n * `params` JSONB is dropped entirely. The dashboard reads action details from\n * `result.output` (and `operationName`) instead. This map tells the dashboard\n * which keys to expect per action.\n *\n * Source: `eaera-mt5/worker/tasks/dispatcher.py` (worker return shape) +\n * `eaera-mt5/eaera_mt5/handlers/*.py` (handler ActionResult.output) +\n * `eaera-cms/eaera_cms/core/content/completion.py:427`\n * (`execution.result = {\"success\": True, \"output\": res.output}`).\n *\n * Each entry lists the keys the output dict carries. The values are always\n * primitives (string / number / boolean / string[]). */\nexport interface ActionResultField {\n /** Key in `result.output`. */\n key: string;\n /** Human label. */\n label: string;\n /** Value type. */\n type: 'string' | 'number' | 'boolean' | 'string[]';\n}\n\nexport const ACTION_RESULT_FIELDS: Record<string, readonly ActionResultField[]> = {\n change_group: [\n { key: 'old_group', label: 'Previous group', type: 'string' },\n { key: 'new_group', label: 'New group', type: 'string' },\n ],\n change_leverage: [\n { key: 'old_leverage', label: 'Previous leverage', type: 'number' },\n { key: 'new_leverage', label: 'New leverage', type: 'number' },\n ],\n disable_trade: [{ key: 'status', label: 'Status', type: 'string' }],\n enable_trade: [{ key: 'status', label: 'Status', type: 'string' }],\n close_account: [\n { key: 'status', label: 'Status', type: 'string' },\n { key: 'positions_closed', label: 'Positions closed', type: 'number' },\n ],\n tag_account: [{ key: 'tags', label: 'Tags', type: 'string[]' }],\n deposit: [\n { key: 'deal_id', label: 'Deal ID', type: 'number' },\n { key: 'new_balance', label: 'New balance', type: 'number' },\n ],\n withdraw: [\n { key: 'deal_id', label: 'Deal ID', type: 'number' },\n { key: 'new_balance', label: 'New balance', type: 'number' },\n ],\n place_market_order: [{ key: 'request_id', label: 'Request ID', type: 'number' }],\n modify_order: [{ key: 'request_id', label: 'Request ID', type: 'number' }],\n close_position: [\n { key: 'closed', label: 'Closed', type: 'boolean' },\n { key: 'ticket', label: 'Ticket', type: 'number' },\n ],\n close_all_positions: [{ key: 'closed', label: 'Positions closed', type: 'number' }],\n resync_deals: [{ key: 'deals_fetched', label: 'Deals fetched', type: 'number' }],\n generate_report: [{ key: 'status', label: 'Status', type: 'string' }],\n generate_ai_summary: [{ key: 'status', label: 'Status', type: 'string' }],\n provision_user: [\n { key: 'user_id', label: 'User ID', type: 'number' },\n { key: 'email', label: 'Email', type: 'string' },\n ],\n set_field: [\n { key: 'field', label: 'Field', type: 'string' },\n { key: 'value', label: 'Value', type: 'string' },\n ],\n};\n\n/** Extract a flat `{key: value}` dict from `result.output` for a given action.\n * Returns `{}` when output is missing or not an object. */\nexport const resultOutputOf = (\n result: Record<string, unknown> | null | undefined,\n actionName: string\n): Record<string, unknown> => {\n if (!result) return {};\n const output = result.output;\n if (output !== null && typeof output === 'object' && !Array.isArray(output)) {\n return output as Record<string, unknown>;\n }\n // Some legacy rows store the handler output flat at result level.\n const fields = ACTION_RESULT_FIELDS[actionName];\n if (!fields) return {};\n const out: Record<string, unknown> = {};\n for (const f of fields) {\n const val = (result as Record<string, unknown>)[f.key];\n if (val !== undefined && val !== null) out[f.key] = val;\n }\n return out;\n};\n\n/** Lookup an ActionKindDef by UI kind. Returns undefined for 'custom'. */\nexport const actionDefByKind = (kind: RuleActionKind): ActionKindDef | undefined =>\n ACTION_KINDS.find((def) => def.kind === kind);\n\n/** FE-only action step view-model. The single canonical shape used by both\n * the Fixed Rules editor and the LLM-rule (skill) editor. The dashboard\n * imports this from the SDK so the two editors serialize identically and\n * never diverge on what an action looks like. */\nexport interface RuleActionView {\n /** Local UI key — never sent to the backend. */\n id: string;\n /** FE-only action kind; maps 1:1 to {@link RuleActionKind}. */\n kind: RuleActionKind;\n /** Target group for `kind === 'move'`. */\n targetGroup?: string;\n /** Tags array for `kind === 'tag'`. */\n tags?: string[];\n /** Tag mode for `kind === 'tag'`. */\n tagMode?: 'append' | 'replace' | 'remove';\n /** Field name for `kind === 'setField'` / `kind === 'provisionUser'`. */\n field?: string;\n /** Value for `kind === 'leverage'` (numeric) or `kind === 'setField'`\n * (stringified). */\n value?: number | string;\n /** Report period start (ISO `YYYY-MM-DD`) for `kind === 'generateReport'`. */\n dateFrom?: string;\n /** Report period end (ISO `YYYY-MM-DD`) for `kind === 'generateReport'`. */\n dateTo?: string;\n /** Reason string for `kind === 'disableTrade' | 'enableTrade'`. */\n reason?: string;\n /** Backend actionName — auto-populated for specialized kinds; required for `custom`. */\n actionName?: string;\n /** Backend codeRef (handler path). Preserved on load, emitted on save. */\n codeRef?: string;\n /** Raw params object — used by `custom` and preserved for round-tripping. */\n params?: Record<string, unknown>;\n}\n\n/** Serialize the per-kind `params` payload for the CMS dispatcher.\n * Mirrors the historical `useRuleBuilder._serializeActionParams`.\n *\n * Critical contract:\n * - The dispatcher passes `params` through `ctx.data` to the worker handler.\n * - The MT5 worker reads snake_case keys (`from_time`, `new_group`,\n * `new_leverage`, …) and the CMS casing middleware converts our\n * camelCase keys to snake_case on the way in.\n * - Empty / zero required fields are omitted so the worker doesn't pick\n * up its default-0 placeholder and silently fail. The rule can be\n * saved with empty inputs; the action will then fail gracefully at\n * fire time with a clear error.\n * - Do NOT emit `login` / `serverName` placeholders — the runtime context\n * (trigger event or fire payload) carries those.\n */\nexport const serializeActionParams = (action: RuleActionView): Record<string, unknown> => {\n switch (action.kind) {\n case ACTION_KIND.MOVE: {\n const target = (action.targetGroup ?? '').trim();\n return target ? { newGroup: target } : {};\n }\n case ACTION_KIND.LEVERAGE: {\n const v = Number(action.value);\n return Number.isFinite(v) && v > 0 ? { newLeverage: v } : {};\n }\n case ACTION_KIND.TAG:\n return { mode: action.tagMode ?? 'append', tags: action.tags ?? [] };\n case ACTION_KIND.SET_FIELD: {\n const field = (action.field ?? '').trim();\n const value = action.value ?? '';\n if (!field) return {};\n return value ? { field, value } : { field };\n }\n case ACTION_KIND.DISABLE_TRADE:\n case ACTION_KIND.ENABLE_TRADE: {\n const reason = (action.reason ?? '').trim();\n return reason ? { reason } : {};\n }\n case ACTION_KIND.PROVISION_USER: {\n const field = (action.field ?? '').trim();\n return field ? { field } : {};\n }\n case ACTION_KIND.GENERATE_REPORT: {\n const out: Record<string, unknown> = {};\n if ((action.dateFrom ?? '').trim()) out.dateFrom = action.dateFrom;\n if ((action.dateTo ?? '').trim()) out.dateTo = action.dateTo;\n return out;\n }\n case ACTION_KIND.GENERATE_AI_SUMMARY:\n return {};\n default:\n return {};\n }\n};\n\n/** Serialize a single action view into the CMS wire shape\n * `{ actionName, codeRef?, params }` — used for both single-step and chain\n * rule executionParams. */\nexport const serializeAction = (\n action: RuleActionView\n): { actionName: string; codeRef?: string; params: Record<string, unknown> } => {\n const def = actionDefByKind(action.kind);\n if (def) {\n return {\n actionName: def.actionName,\n ...(def.defaultCodeRef ? { codeRef: def.defaultCodeRef } : {}),\n params: serializeActionParams(action),\n };\n }\n return {\n actionName: action.actionName ?? 'unknown',\n ...(action.codeRef ? { codeRef: action.codeRef } : {}),\n params: action.params ?? {},\n };\n};\n\n/** Build the `executionParams` payload from a list of actions.\n *\n * - 0 actions → `executionType: 'action'` with empty params.\n * - 1 action, kind `SET_FIELD` → `executionType: 'set_field'` with\n * `executionParams: { field, value }`. The CMS dispatcher (`_dispatch_target`'s\n * `set_field` branch) only takes this dedicated path — emitting it as a\n * plain `action` would land on the action-executor path, which requires a\n * `code_ref` that `set_field` does not have.\n * - 1 action, any other kind → `executionType: 'action'` with the\n * `serializeAction(...)` shape (actionName + optional codeRef + params).\n * - 2+ actions → `executionType: 'chain'` with `executionParams.steps[]`.\n */\nexport const actionsToExecutionParams = (\n actions: RuleActionView[]\n): {\n executionType: ExecutionType;\n executionParams: Record<string, unknown>;\n} => {\n if (!actions.length) {\n return { executionType: EXECUTION_TYPE.ACTION, executionParams: {} };\n }\n if (actions.length === 1) {\n const single = actions[0];\n if (single.kind === ACTION_KIND.SET_FIELD) {\n return {\n executionType: EXECUTION_TYPE.SET_FIELD,\n executionParams: { field: single.field ?? '', value: single.value ?? '' },\n };\n }\n return {\n executionType: EXECUTION_TYPE.ACTION,\n executionParams: serializeAction(single),\n };\n }\n return {\n executionType: EXECUTION_TYPE.CHAIN,\n executionParams: {\n steps: actions.map((a) => {\n // `set_field` inside a chain shares the same wire shape as the\n // top-level `executionType: 'set_field'` payload — flat\n // `{ field, value }` inside `params`, no `actionName` / `codeRef`.\n // The dispatcher would otherwise reject it because `set_field` has\n // no `code_ref` handler.\n if (a.kind === ACTION_KIND.SET_FIELD) {\n return {\n type: EXECUTION_TYPE.SET_FIELD,\n params: { field: a.field ?? '', value: a.value ?? '' },\n };\n }\n return { type: EXECUTION_TYPE.ACTION, params: serializeAction(a) };\n }),\n },\n };\n};\n\nconst _actionId = (prefix: string): string => `${prefix}-${Math.random().toString(36).slice(2, 9)}`;\n\n/** Project a single step's nested `params` + `actionName` into a\n * {@link RuleActionView}. */\nconst _viewFromStep = (\n actionName: string | undefined,\n rawParams: Record<string, unknown>,\n prefix: string\n): RuleActionView => {\n const def = actionName ? actionDefByActionName(actionName) : undefined;\n const kind = def?.kind ?? ACTION_KIND.CUSTOM;\n const base: RuleActionView = {\n id: _actionId(prefix),\n kind,\n actionName,\n codeRef: undefined,\n params: rawParams,\n };\n switch (kind) {\n case ACTION_KIND.MOVE:\n return { ...base, targetGroup: String(rawParams.newGroup ?? '') };\n case ACTION_KIND.LEVERAGE:\n return { ...base, value: Number(rawParams.newLeverage) || 0 };\n case ACTION_KIND.TAG: {\n const mode = rawParams.mode;\n return {\n ...base,\n tags: Array.isArray(rawParams.tags) ? (rawParams.tags as unknown[]).map(String) : [],\n tagMode:\n mode === 'replace' || mode === 'remove' ? (mode as 'replace' | 'remove') : 'append',\n };\n }\n case ACTION_KIND.SET_FIELD:\n return {\n ...base,\n field: String(rawParams.field ?? ''),\n value: String(rawParams.value ?? ''),\n };\n case ACTION_KIND.PROVISION_USER:\n return { ...base, field: String(rawParams.field ?? '') };\n case ACTION_KIND.DISABLE_TRADE:\n case ACTION_KIND.ENABLE_TRADE:\n return { ...base, reason: String(rawParams.reason ?? '') };\n case ACTION_KIND.GENERATE_REPORT:\n return {\n ...base,\n dateFrom: String(rawParams.dateFrom ?? rawParams.date_from ?? ''),\n dateTo: String(rawParams.dateTo ?? rawParams.date_to ?? ''),\n };\n default:\n return base;\n }\n};\n\n/** Read the action list back from a stored `ContentRule.executionParams`.\n * Supports `set_field`, single-step `action`, and multi-step `chain`\n * payloads. */\nexport const actionsFromExecution = (rule: {\n executionType: ExecutionType | string;\n executionParams?: Record<string, unknown> | null;\n}): RuleActionView[] => {\n const ep = rule.executionParams ?? {};\n if (rule.executionType === EXECUTION_TYPE.SET_FIELD) {\n return [\n _viewFromStep(\n EXECUTION_TYPE.SET_FIELD,\n { field: String((ep as { field?: string }).field ?? '') },\n 'ACT'\n ),\n ];\n }\n if (rule.executionType === EXECUTION_TYPE.CHAIN) {\n const steps = (\n ep as {\n steps?: Array<{\n type?: (typeof EXECUTION_TYPE)[keyof typeof EXECUTION_TYPE];\n params?: Record<string, unknown>;\n }>;\n }\n ).steps;\n if (!Array.isArray(steps)) return [];\n return steps.map((step) => {\n // `set_field` chain steps use the flat shape\n // `{ type: 'set_field', params: { field, value } }` — same as the\n // top-level `executionType: 'set_field'` payload. Read `field` and\n // `value` directly and synthesize the view, mirroring the\n // `executionType === 'set_field'` branch above.\n if (step.type === EXECUTION_TYPE.SET_FIELD) {\n const sp = (step.params ?? {}) as { field?: unknown; value?: unknown };\n return _viewFromStep(\n EXECUTION_TYPE.SET_FIELD,\n { field: String(sp.field ?? ''), value: String(sp.value ?? '') },\n 'ACT'\n );\n }\n const outer = (step.params ?? step) as Record<string, unknown>;\n return _viewFromStep(\n outer.actionName as string | undefined,\n (outer.params ?? {}) as Record<string, unknown>,\n 'ACT'\n );\n });\n }\n if (rule.executionType === EXECUTION_TYPE.ACTION) {\n const actionName = (ep as { actionName?: string }).actionName;\n if (typeof actionName !== 'string') return [];\n return [\n _viewFromStep(actionName, (ep as { params?: Record<string, unknown> }).params ?? {}, 'ACT'),\n ];\n }\n return [];\n};\n\n/**\n * Event-payload fields for `triggerType === 'event'` rules. The CMS\n * condition evaluator resolves dotted paths from the Kafka event payload\n * (`event.data.*`) with a fallback to flat fields\n * (`eaera_cms/core/rules/conditions.py:_resolve_field`). These are NOT\n * ClickHouse metric fields — they come from the event itself.\n *\n * The dashboard tree builder emits these verbatim so the engine can resolve\n * them at fire time. Source: `eaera-mt5/reference-v0/ch/ddl.py` payload\n * schemas + `eaera-mt5/worker/tasks/realtime.py` event shapes.\n */\n\n/** Top-level key of the event payload each field belongs to. */\nexport const EVENT_PAYLOAD_SOURCE = {\n DEAL: 'deal',\n POSITION: 'position',\n ORDER: 'order',\n} as const;\n\nexport type EventPayloadSource = (typeof EVENT_PAYLOAD_SOURCE)[keyof typeof EVENT_PAYLOAD_SOURCE];\n\nexport interface EventPayloadField {\n /** Backend dotted-path key, e.g. `deal.profit`. */\n key: string;\n /** Human label, e.g. `Deal Profit`. */\n label: string;\n /** Which event payload this field is sourced from. */\n source: EventPayloadSource;\n valueType: ConditionValueType;\n unit: string;\n}\n\nexport const EVENT_PAYLOAD_FIELDS: readonly EventPayloadField[] = [\n // ── Deal payload (event: deal_close) ──\n {\n key: 'deal.profit',\n label: 'Deal Profit',\n source: EVENT_PAYLOAD_SOURCE.DEAL,\n valueType: 'float',\n unit: 'account currency',\n },\n {\n key: 'deal.volume',\n label: 'Deal Volume',\n source: EVENT_PAYLOAD_SOURCE.DEAL,\n valueType: 'float',\n unit: 'lots',\n },\n {\n key: 'deal.symbol',\n label: 'Deal Symbol',\n source: EVENT_PAYLOAD_SOURCE.DEAL,\n valueType: 'integer',\n unit: 'string',\n },\n {\n key: 'deal.type',\n label: 'Deal Type',\n source: EVENT_PAYLOAD_SOURCE.DEAL,\n valueType: 'integer',\n unit: 'enum',\n },\n // ── Position payload (event: position) ──\n {\n key: 'position.volume',\n label: 'Position Volume',\n source: EVENT_PAYLOAD_SOURCE.POSITION,\n valueType: 'float',\n unit: 'lots',\n },\n {\n key: 'position.profit',\n label: 'Position Profit',\n source: EVENT_PAYLOAD_SOURCE.POSITION,\n valueType: 'float',\n unit: 'account currency',\n },\n {\n key: 'position.price_current',\n label: 'Position Price',\n source: EVENT_PAYLOAD_SOURCE.POSITION,\n valueType: 'float',\n unit: 'price',\n },\n // ── Order payload (event: order) ──\n {\n key: 'order.volume_initial',\n label: 'Order Initial Volume',\n source: EVENT_PAYLOAD_SOURCE.ORDER,\n valueType: 'float',\n unit: 'lots',\n },\n {\n key: 'order.price_trigger',\n label: 'Order Trigger Price',\n source: EVENT_PAYLOAD_SOURCE.ORDER,\n valueType: 'float',\n unit: 'price',\n },\n];\n\n/**\n * Filter the event-payload catalog to a subset appropriate for an event type.\n * The dashboard uses this to narrow the metric dropdown so a `deal_close`\n * rule can only select `deal.*` fields, etc. Returns all fields if the event\n * type doesn't have a known narrowing (e.g. `statement` falls back to CH\n * catalog fields).\n */\nexport const eventPayloadFieldsFor = (\n _eventType: string | null | undefined\n): readonly EventPayloadField[] => EVENT_PAYLOAD_FIELDS;\n","/**\n * Canonical camelCase event-payload types for the built-in WebSocket topics.\n *\n * The backend emits these payloads in camelCase natively (ws-guide §7.4 /\n * Appendix A), and the WS client hands each `event` frame's `data` straight to\n * `onEvent` handlers — no conversion layer in between. These interfaces are the\n * single source of truth for that shape, so consumers cast `event.data` to the\n * matching type instead of re-defining (and hand-mapping) their own. This\n * removes the need for the per-consumer mapping layers that previously lived in\n * `eaera-webtrade` (e.g. `toAccountState`, `normalizePositionEvent`).\n *\n * Field docs mirror `eaera-docs/…/eaera-cms-websocket-integration-guide.md`.\n *\n * Drift note: the guide (§7.4.1 / Appendix A.3) predates the BE adding the\n * position `swap` field — the field is real on the wire even though the guide\n * does not list it yet. See `swap` on {@link IAccountStatePosition} and\n * {@link IPositionEvent}.\n */\n\nimport { type MT5DealEntry, type MT5TradeSide } from '../../common/constants/mt5.constant';\n\n/* ───────────────────────── Payload discriminator ──────────────────────── */\n\n/**\n * `data.event` discriminator values emitted by the backend. Not every payload\n * carries one (e.g. the `tick` topic omits it — see {@link ITickEvent}); those\n * are dispatched on `topic` instead. Kept here so consumers can route without\n * hard-coding string literals.\n */\nexport const WS_EVENT_NAME = {\n ACCOUNT_STATE: 'account_state',\n POSITION: 'position',\n ORDER: 'order',\n DEAL: 'deal',\n SYMBOL_TICK: 'symbol_tick',\n LAST_TICK: 'last_tick',\n} as const;\nexport type WsEventName = (typeof WS_EVENT_NAME)[keyof typeof WS_EVENT_NAME];\n\n/* ───────────────────────── account:<uuid> (§7.4) ─────────────────────── */\n\n/**\n * Per-position row embedded inside an {@link IAccountStateEvent} snapshot\n * (ws-guide §7.4.1). The `server`, `login`, and `timestampServer` columns that\n * live on the parent envelope are stripped here by the CMS `account_bridge`.\n *\n * Note the `action` divergence: this snapshot uses the **numeric** MT5 type\n * (`0` = Buy, `1` = Sell), whereas the live {@link IPositionEvent} /\n * {@link IDealEvent} use the decoded **string** (`'BUY' | 'SELL'`). Consumers\n * that merge both feeds must coerce once at their boundary.\n */\nexport interface IAccountStatePosition {\n /** MT5 `Position` ticket — stable identity. */\n positionId: number;\n symbol: string;\n /** `0` = Buy, `1` = Sell (numeric — see interface note above). */\n action: number;\n /** Initial open lot size. */\n volume: number;\n /** Cumulative volume already closed by partial fills. */\n volumeClosed: number;\n /** Still-open size (`volume − volumeClosed`). */\n volumeRemaining: number;\n /** Current market price at `wave_ts`. */\n price: number;\n /** Entry / open price. */\n pricePosition: number;\n /** Stop-loss price; `0` if not set. */\n priceSl: number;\n /** Take-profit price; `0` if not set. */\n priceTp: number;\n /** Gross floating PnL (before swap/commission). */\n profit: number;\n /** Net floating PnL (after swap/commission/fee). */\n netProfit: number;\n /**\n * Swap/rollover accumulated on the open position. The BE emits this on the\n * wire but the ws-guide §7.4.1 field list has not been updated to include\n * it — optional so consumers on older BE envs stay honest.\n */\n swap?: number;\n /** Broker open-time, unix-**millisecond** tick. */\n timestampOpen: number;\n /** Wave snapshot time (ISO-8601). */\n timestamp: string;\n /** Broker comment (≤ 31 chars). */\n comment: string;\n}\n\n/**\n * Per-order row embedded inside an {@link IAccountStateEvent} snapshot\n * (ws-guide §7.4). The pending orders the account holds at `wave_ts`. The\n * `server` / `login` columns that live on the parent envelope are stripped\n * here by the CMS `account_bridge`, mirroring {@link IAccountStatePosition}.\n */\nexport interface IAccountStateOrder {\n /** MT5 `Order` ticket — stable identity. */\n orderId: number;\n symbol: string;\n /** Initial requested lot size. */\n volume: number;\n /** Limit / stop trigger price. */\n price: number;\n /** Order stop-loss level; `0` if not set. */\n priceSl: number;\n /** Order take-profit level; `0` if not set. */\n priceTp: number;\n /** Raw MT5 integer code; `orderTypeStr` is the decoded form. */\n orderType: number;\n /** Decoded order type, e.g. `'BUY_LIMIT' | 'SELL_STOP' | …`. */\n orderTypeStr: string;\n /** Raw MT5 integer state code; `stateStr` is the decoded form. */\n state: number;\n /** `PLACED` | `STARTED` | … (snapshot rows are pending). */\n stateStr: string;\n /** `'DAY' | 'GTC' | …`. */\n duration: string;\n /** Setup time, unix-**millisecond** integer. */\n timestampSetup: number;\n /** Wave snapshot time (ISO-8601). */\n timestamp: string;\n /** Broker comment (≤ 31 chars). */\n comment: string;\n}\n\n/**\n * Aggregate account-state payload delivered on topic `account:<Mt5Account.uuid>`\n * (ws-guide §7.4). Carries the balance/equity/margin summary **and** the\n * authoritative open-positions + pending-orders lists. This is the camelCase\n * form the SDK hands to `onEvent` handlers — consumers no longer need a\n * `toAccountState` adapter.\n */\nexport interface IAccountStateEvent {\n event: typeof WS_EVENT_NAME.ACCOUNT_STATE;\n /** `Mt5Account.uuid` — matches the topic suffix. */\n accountUuid: string;\n server: string;\n login: number;\n /** Statement wave's `wave_ts` (not the publish time). */\n timestamp: string;\n balance: number;\n equity: number;\n /** Used margin (in use by open positions). */\n margin: number;\n /** `equity − margin`. */\n marginFree: number;\n /** `equity / margin × 100` (percentage). */\n marginLevel: number;\n /** Closed-trade PnL. */\n profit: number;\n /** Unrealised PnL of all open positions. */\n floating: number;\n /** Wave-snapshot open-position count (should equal `positions.length`). */\n openPositions: number;\n /** Wave-snapshot pending-order count (should equal `orders.length`). */\n pendingOrders: number;\n positions: IAccountStatePosition[];\n /** Authoritative pending-orders list at `wave_ts`. */\n orders: IAccountStateOrder[];\n currency: string;\n currencyDigits: number;\n group: string;\n leverage: number;\n publisher: string;\n}\n\n/* ───────────────────────── mt5:events (Appendix A) ───────────────────── */\n\n/** Live position event (Appendix A.3, topic `mt5:events:<server>:position`). */\nexport interface IPositionEvent {\n event: typeof WS_EVENT_NAME.POSITION;\n eventId: string;\n server: string;\n login: number;\n positionId: number;\n symbol: string;\n action: MT5TradeSide;\n volume: number;\n volumeClosed: number;\n volumeRemaining: number;\n price: number | null;\n pricePosition: number;\n priceSl: number | null;\n priceTp: number | null;\n profit: number;\n netProfit: number;\n /** Swap/rollover — the wire key is `swap`. */\n swap: number;\n /** @deprecated Legacy key — the BE now emits `swap`. Optional for consumers still on older wires. */\n storage?: number;\n timestamp: string;\n timestampServer: number;\n /** Broker open-time, unix-**millisecond** integer. */\n timestampOpen: number;\n timestampOpenServer: number;\n durationOfPosition: number;\n comment: string;\n}\n\n/** Live order event (Appendix A.2, topic `mt5:events:<server>:order`). */\nexport interface IOrderEvent {\n event: typeof WS_EVENT_NAME.ORDER;\n eventId: string;\n server: string;\n login: number;\n orderId: number;\n symbol: string;\n volume: number;\n price: number;\n priceSl: number;\n priceTp: number;\n /** Raw MT5 integer code; `orderTypeStr` is the decoded form. */\n orderType: number;\n orderTypeStr: string;\n /** Raw MT5 integer code; `stateStr` is the decoded form. */\n state: number;\n stateStr: string;\n duration: string;\n timestampSetup: number;\n timestamp: string;\n comment: string;\n}\n\n/** Live deal event (Appendix A.4, topic `mt5:events:<server>:deal`). */\nexport interface IDealEvent {\n event: typeof WS_EVENT_NAME.DEAL;\n eventId: string;\n server: string;\n login: number;\n dealId: number;\n orderId: number;\n positionId: number;\n action: MT5TradeSide;\n entry: MT5DealEntry;\n symbol: string;\n volume: number;\n price: number;\n profit: number;\n commission: number;\n fee: number;\n storage: number;\n swap: number;\n comment: string;\n reason: number;\n externalId: string;\n timestamp: string;\n timestampServer: number;\n group: string;\n currency: string;\n}\n\n/**\n * Tick event (Appendix A.1, topic `mt5:events:<server>:tick` **or**\n * `symbol:<server>:<SYMBOL>`). Note: there is **no** `event` discriminator in\n * the payload — dispatch on `topic` (or on `data.event: \"symbol_tick\"`).\n */\nexport interface ITickEvent {\n eventId: string;\n server: string;\n symbol: string;\n bid: number;\n ask: number;\n last: number;\n volume: number;\n timestamp: string;\n flags: number;\n}\n\n/* ───────────────────────── market-data events ────────────────────────── */\n\n/**\n * Single depth-of-market (DOM) ladder level. The backend emits one DOM\n * snapshot per symbol; consumers aggregate the levels into a bid/ask ladder.\n */\nexport interface IDomEntry {\n price: number;\n quantity: number;\n}\n\n/**\n * Depth-of-market snapshot event. Delivered on a per-symbol DOM topic; there is\n * no `event` discriminator — dispatch on `topic` + the `symbol` field. The\n * ladder (`dom[]`) is the authoritative bid/ask depth at the snapshot time.\n */\nexport interface IDomEvent {\n symbol: string;\n dom: IDomEntry[];\n}\n\n/**\n * Time & sales (the tape) event. Each frame is one executed print for a symbol;\n * dispatched on `topic` (no `event` discriminator). `side` uses the decoded\n * `'BUY' | 'SELL'` form.\n */\nexport interface ITimeNSaleEvent {\n symbol: string;\n price: number;\n side: MT5TradeSide;\n quantity: number;\n timestamp: string;\n}\n","import { defineStore } from 'pinia';\nimport { computed, ref, shallowRef, watch } from 'vue';\nimport { PERSIST_KEY } from '../common/constants/storage.constant';\nimport type { ICmsSDK } from '../core/sdk.type';\nimport type { ICbsStartResponse, IIdpLoginStartResponse } from '../services/auth';\nimport type { IAuthSessionResponse, IAuthUser, IEmployee } from '../services/auth/auth.type';\n\nexport type { IAuthUser } from '../services/auth/auth.type';\n\n/**\n * Auth store — session domain state (user, employee, routes, access token\n * mirror).\n *\n * The access token's **source of truth** remains `TokenManager` (core). This\n * store keeps a reactive mirror (`accessToken`) so consumers can read it and\n * so Nuxt can serialize it to the SSR payload. The token is NEVER persisted by\n * Pinia; persistence is handled by the httpOnly cookie managed by the Nuxt\n * module.\n *\n * Mirrors the auth service surface (login / logout / token-refresh).\n */\nexport const useAuthStore = defineStore(\n 'cms-auth',\n () => {\n const sdk = shallowRef<ICmsSDK | null>(null);\n\n const authUser = ref<IAuthUser | null>(null);\n const employee = ref<IEmployee | null>(null);\n const allowRoutes = ref<string>('');\n const accessToken = ref<string>('');\n\n /**\n * Monotonic counter bumped on every EXPLICIT re-establishment of the\n * session (a `login()` while already authenticated, or a manual\n * `refreshToken()`). It is the signal consumers (e.g. the Nuxt module's\n * WS lifecycle watcher) use to re-handshake a live realtime socket with the\n * new token — the `isLoggedIn` boolean only transitions on login/logout,\n * so a re-auth that keeps the user \"logged in\" would otherwise leave the\n * socket on the stale token until the server pushes `auth_expired`.\n *\n * Sliding-session token rotation (handled in `createApi.onResponse` via\n * `onToken`, which bypasses these store actions) deliberately does NOT bump\n * the epoch, so it never triggers a socket re-handshake.\n */\n const loginEpoch = ref(0);\n\n // Mirror TokenManager.currentToken into store state so consumers can read\n // it and Nuxt can transfer it through the SSR payload.\n watch(\n () => sdk.value?.tokenManager.currentToken ?? null,\n (token) => {\n accessToken.value = token ?? '';\n },\n { immediate: true, flush: 'sync' }\n );\n\n const isLoggedIn = computed(() => !!accessToken.value);\n\n /** Parsed route permissions as an array (`['*']` for wildcard, `[]` if none). */\n const routeList = computed<string[]>(() => {\n if (!allowRoutes.value) return [];\n return allowRoutes.value === '*' ? ['*'] : allowRoutes.value.split(',');\n });\n\n const setSdk = (instance: ICmsSDK): void => {\n sdk.value = instance;\n };\n\n const _formatAllowRoutes = (routes: string[] | undefined): string => {\n if (!routes || routes.length === 0) return '';\n return routes.includes('*') ? '*' : routes.join(',');\n };\n\n // allowRoutes is derived from authUser.allowRoutes so that the persistence\n // plugin (which only persists authUser) keeps the menu in sync on hydrate.\n watch(\n () => authUser.value?.allowRoutes,\n (routes) => {\n allowRoutes.value = _formatAllowRoutes(routes);\n },\n { immediate: true, flush: 'sync' }\n );\n\n const _applySession = (res: IAuthSessionResponse): void => {\n authUser.value = res.user ?? authUser.value;\n allowRoutes.value = _formatAllowRoutes(res.user?.allowRoutes);\n employee.value = res.employee ?? null;\n };\n\n /**\n * Apply a session that may carry a `token` (server-route login). When\n * `token` is present it is written to TokenManager (the httpOnly cookie was\n * already set by the route). When absent (direct backend calls), the\n * `createApi` `onResponse`/`onToken` hook already captured the token.\n */\n const _applyTokenSession = (res: IAuthSessionResponse & { token?: string }): void => {\n if (res.token && sdk.value) sdk.value.tokenManager.set(res.token);\n _applySession(res);\n };\n\n /** Log a store-action failure (the action then rethrows). */\n const _logErr = (action: string, e: unknown): void => {\n console.error(`[cms-auth] ${action} failed:`, e);\n };\n\n const login = async (payload: Parameters<ICmsSDK['auth']['login']>[0]): Promise<void> => {\n if (!sdk.value) throw _noSdk();\n try {\n // Capture auth state BEFORE applying the new session so we can signal a\n // re-auth (logged-in → logged-in) distinctly from the initial login\n // (logged-out → logged-in), which the `isLoggedIn` watcher already\n // covers.\n const wasLoggedIn = sdk.value.tokenManager.has();\n const res = await sdk.value.auth.login(payload);\n _applyTokenSession(res);\n if (wasLoggedIn) loginEpoch.value++;\n } catch (e) {\n _logErr('login', e);\n throw e;\n }\n };\n\n /** Manually exchange the refresh token for a new access token. */\n const refreshToken = async (): Promise<void> => {\n if (!sdk.value) throw _noSdk();\n try {\n const res = await sdk.value.auth.token();\n if (res.token) await sdk.value.syncToken(res.token);\n // A manual refresh rotates the live token; bump the epoch so consumers\n // (e.g. the WS lifecycle) re-handshake with it.\n loginEpoch.value++;\n } catch (e) {\n _logErr('refreshToken', e);\n throw e;\n }\n };\n\n const logout = async (): Promise<void> => {\n if (!sdk.value) throw _noSdk();\n try {\n // The logout route (when configured) clears the httpOnly cookie +\n // calls the backend. In standalone it just calls the backend.\n await sdk.value.auth.logout();\n } catch (e) {\n // Best-effort: backend logout failure must not block local sign-out.\n _logErr('logout', e);\n } finally {\n sdk.value.tokenManager.clear();\n _reset();\n }\n };\n\n const _reset = (): void => {\n authUser.value = null;\n employee.value = null;\n allowRoutes.value = '';\n accessToken.value = '';\n };\n\n /**\n * Tear down local session state WITHOUT a backend call. Used by the\n * embedded boot purge: the iframe must not render/fetch with a stale\n * session, but the server-side session is left untouched (it expires on\n * its own or gets overwritten by the next silent login).\n */\n const clearLocalSession = (): void => {\n if (!sdk.value) throw _noSdk();\n sdk.value.tokenManager.clear();\n _reset();\n };\n\n /**\n * Initialise a \"Login with CBS\" attempt. Returns `{ authorizeUrl, stateKey,\n * redirectTarget }` from the backend; the caller persists `stateKey` and\n * navigates the browser (or a popup) to `authorizeUrl`.\n */\n const cbsStart = async (): Promise<ICbsStartResponse> => {\n if (!sdk.value) throw _noSdk();\n try {\n return await sdk.value.auth.cbsStart();\n } catch (e) {\n _logErr('cbsStart', e);\n throw e;\n }\n };\n\n /**\n * Complete a \"Login with CBS\" attempt: exchange `{ code, state, stateKey }`\n * for a CMS session. When served via the Nuxt proxy the httpOnly cookies\n * were already set by the route; the access token is mirrored into\n * TokenManager here.\n */\n const cbsCallback = async (code: string, state: string, stateKey: string): Promise<void> => {\n if (!sdk.value) throw _noSdk();\n try {\n const wasLoggedIn = sdk.value.tokenManager.has();\n const res = await sdk.value.auth.cbsCallback(code, state, stateKey);\n _applyTokenSession(res);\n if (wasLoggedIn) loginEpoch.value++;\n } catch (e) {\n _logErr('cbsCallback', e);\n throw e;\n }\n };\n\n /**\n * Inject an already-minted CMS session (silent-login handshake). The parent\n * (super-app) hands the iframe a CMS JWT + user snapshot obtained via the\n * \"Login with CBS\" popup; this writes the token to TokenManager and applies\n * the session profile WITHOUT a backend round-trip. The refresh token lives\n * in the httpOnly cookie set by the popup's `/cbs-callback` route (same\n * origin), so it is not needed here. Bumps `loginEpoch` so consumers (e.g.\n * the WS lifecycle) re-handshake with the new token.\n */\n const loginWithTokenAndUser = (payload: {\n token: string;\n user?: IAuthUser | null;\n employee?: IEmployee | null;\n }): void => {\n if (!sdk.value) throw _noSdk();\n // Capture auth state BEFORE applying the new session so a re-auth\n // (logged-in → logged-in) is signalled distinctly from the initial\n // login (logged-out → logged-in), which the `isLoggedIn` transition\n // watcher already covers. Mirrors `login()` / `cbsCallback()` so a silent\n // login from a logged-out state does NOT double-trigger `reopen()`\n // (the `isLoggedIn` transition watcher handles it once).\n const wasLoggedIn = sdk.value.tokenManager.has();\n sdk.value.tokenManager.set(payload.token);\n _applySession({\n user: payload.user ?? undefined,\n employee: payload.employee ?? undefined,\n });\n if (wasLoggedIn) loginEpoch.value++;\n };\n\n /**\n * Initialise an IdP SSO login (e.g. Microsoft). Returns the provider\n * authorize URL + one-use state; the caller navigates the browser there.\n * No token is applied here — the session lands on `idpCallback()`.\n */\n const idpLogin = async (\n provider: Parameters<ICmsSDK['auth']['idpLogin']>[0],\n redirectUri: string\n ): Promise<IIdpLoginStartResponse> => {\n if (!sdk.value) throw _noSdk();\n try {\n return await sdk.value.auth.idpLogin(provider, redirectUri);\n } catch (e) {\n _logErr('idpLogin', e);\n throw e;\n }\n };\n\n /**\n * Complete an IdP SSO login: exchange `{code, state, redirectUri}` for a\n * CMS JWT session. When served via the Nuxt proxy the httpOnly cookies\n * were already set by the route; the access token is mirrored into\n * TokenManager here.\n */\n const idpCallback = async (\n provider: Parameters<ICmsSDK['auth']['idpCallback']>[0],\n code: string,\n state: string,\n redirectUri: string\n ): Promise<void> => {\n if (!sdk.value) throw _noSdk();\n try {\n const wasLoggedIn = sdk.value.tokenManager.has();\n const res = await sdk.value.auth.idpCallback(provider, code, state, redirectUri);\n _applyTokenSession(res);\n if (wasLoggedIn) loginEpoch.value++;\n } catch (e) {\n _logErr('idpCallback', e);\n throw e;\n }\n };\n\n /** Link the signed-in user to an IdP provider (needs an active session). */\n const idpLink = (provider: Parameters<ICmsSDK['auth']['idpLink']>[0]): Promise<unknown> => {\n if (!sdk.value) throw _noSdk();\n return sdk.value.auth.idpLink(provider).catch((e: unknown) => {\n _logErr('idpLink', e);\n throw e;\n });\n };\n\n /** Unlink an IdP provider from the signed-in user. */\n const idpUnlink = (provider: Parameters<ICmsSDK['auth']['idpUnlink']>[0]): Promise<unknown> => {\n if (!sdk.value) throw _noSdk();\n return sdk.value.auth.idpUnlink(provider).catch((e: unknown) => {\n _logErr('idpUnlink', e);\n throw e;\n });\n };\n\n return {\n // state\n authUser,\n employee,\n allowRoutes,\n accessToken,\n loginEpoch,\n // getters\n isLoggedIn,\n routeList,\n // actions\n setSdk,\n login,\n refreshToken,\n logout,\n clearLocalSession,\n cbsStart,\n cbsCallback,\n loginWithTokenAndUser,\n idpLogin,\n idpCallback,\n idpLink,\n idpUnlink,\n };\n },\n {\n persist: {\n // Only the user profile is persisted (httpOnly cookie via the internal\n // plugin + /api/cms-sdk/persist). allowRoutes is derived from it above;\n // the token is NEVER persisted here (it lives in the httpOnly token cookie).\n key: PERSIST_KEY.AUTH,\n fields: { authUser: { httpOnly: true } },\n },\n }\n);\n\nfunction _noSdk(): Error {\n return new Error('Auth store: SDK not attached. Call setSdk() first.');\n}\n","import { defineStore } from 'pinia';\nimport { computed, ref, shallowRef } from 'vue';\nimport { STORE_PERSIST_KEY } from '../common/constants/storage.constant';\nimport type { ICmsSDK } from '../core/sdk.type';\nimport type { BarsQuery, BarsResponse, BarItem } from '../services/bars/bars.type';\n\n/**\n * Bars store — OHLC chart bars (`/api/v1/chart/bars`). READ-ONLY.\n * One store backs chart rendering across the FE; each chart view\n * re-fetches on mount (no background polling).\n *\n * State is ephemeral (chart data); only `lastQuery` is persisted\n * so the consumer can resume with the same timeframe on reload.\n */\nexport const useBarsStore = defineStore(\n 'cms-bars',\n () => {\n const sdk = shallowRef<ICmsSDK | null>(null);\n\n const items = ref<BarItem[]>([]);\n const response = ref<BarsResponse | null>(null);\n const isLoading = ref(false);\n const loadError = ref<Error | null>(null);\n const lastQuery = ref<BarsQuery | null>(null);\n\n const isEmpty = computed(() => !isLoading.value && items.value.length === 0);\n\n const setSdk = (instance: ICmsSDK): void => {\n sdk.value = instance;\n };\n\n /** Log a store-action failure (the action then rethrows). */\n const _logErr = (action: string, e: unknown): void => {\n console.error(`[cms-bars] ${action} failed:`, e);\n };\n\n const getBars = async (query: BarsQuery): Promise<void> => {\n if (!sdk.value) throw _noSdk();\n isLoading.value = true;\n loadError.value = null;\n lastQuery.value = query;\n try {\n const res = await sdk.value.bars.getBars(query);\n items.value = res.items;\n response.value = res;\n } catch (e) {\n loadError.value = e as Error;\n _logErr('getBars', e);\n throw e;\n } finally {\n isLoading.value = false;\n }\n };\n\n const reset = (): void => {\n items.value = [];\n response.value = null;\n loadError.value = null;\n lastQuery.value = null;\n };\n\n return {\n // state\n items,\n response,\n isLoading,\n loadError,\n lastQuery,\n // getters\n isEmpty,\n // actions\n setSdk,\n getBars,\n reset,\n };\n },\n {\n persist: {\n pick: [],\n key: STORE_PERSIST_KEY.BARS,\n },\n }\n);\n\nfunction _noSdk(): Error {\n return new Error('Bars store: SDK not attached. Call setSdk() first.');\n}\n","/**\n * # Content store\n *\n * Generic CMS content wrapper. Holds state as **9 typed slices** (one per CT\n * the mt5 pack registers) and exposes **7 generic actions** that delegate 1:1\n * to the underlying `content` service methods:\n *\n * | Store action | Service method | BE endpoint |\n * |-------------------|--------------------------------|------------------------------------------------|\n * | `fetchByType` | `content.list<T>` | `GET /api/v1/content` |\n * | `fetchByUuids` | `content.list<T>` (uuid filter)| `GET /api/v1/content?uuids=…` (batch) |\n * | `fetchOne` | `content.detail<T>` | `GET /api/v1/content/{uuid}` |\n * | `create` | `content.create<T>` | `POST /api/v1/content` |\n * | `update` | `content.update<T>` | `PUT /api/v1/content/{uuid}` |\n * | `remove` | `content.remove` | `DELETE /api/v1/content/{uuid}` |\n * | `fetchActions` | `content.listActions` | `GET /api/v1/content/{uuid}/actions` |\n * | `invokeAction` | `content.invokeAction` | `POST /api/v1/content/{uuid}/actions/{name}` |\n *\n * Every slice is typed with its CT-specific payload (no `any`). The\n * `SliceByType` map gives the slice type for every `ContentTypeName`, and\n * `fetchByType` uses it to keep the assignment into the correct ref type-safe.\n *\n * ## Action-by-CT contract\n *\n * Every mt5 pack action is **bound to one specific Content Type** — invoking\n * `place_market_order` on a `Mt5Server` row (or any non-`Mt5Account` row)\n * returns a dispatcher error from the CMS backend. The mapping below is the\n * source of truth for which actions are valid on which CT; it is exposed at\n * runtime via `getActionsForType(typeName)`.\n *\n * | CT | Actions (mt5 pack v1) |\n * |---------------------|--------------------------------------------------------------------------------------------------------|\n * | `Mt5Account` | 25 — trading / financial / operational / local (see `_ACTION_BY_CT` below) |\n * | `KalshiFuture` | 1 — `update_spread` |\n * | Other 7 CTs | none in v1 pack |\n *\n * The store does NOT enforce this mapping at runtime — passing a wrong\n * `(uuid, actionName)` pair is the caller's responsibility and will surface\n * as a CMS dispatcher error.\n *\n * ## Auto-refetch policy\n *\n * **No action auto-refetches the affected slice.** After `create`, `update`,\n * `remove`, or `invokeAction`, the caller is responsible for calling\n * `fetchByType(typeName)` if it wants the slice to reflect the change. This\n * keeps the store's coupling minimal and avoids hidden re-fetches.\n *\n * ## Usage example\n *\n * ```ts\n * const content = useContentStore();\n * content.setSdk(sdk);\n *\n * // 1. Fetch a typed slice (Mt5Account)\n * await content.fetchByType(CONTENT_TYPE.MT5_ACCOUNT, { perPage: 50 });\n *\n * // 2. Invoke a trading action — single entry point for ALL mt5 actions\n * const acc = content.mt5Accounts[0];\n * const out = await content.invokeAction(acc.uuid, MT5_ACTION_NAME.PLACE_MARKET_ORDER, {\n * params: { symbol: 'EURUSD', volume: 0.1, orderType: 'buy' },\n * expectedVersion: acc.version,\n * intentionId: crypto.randomUUID(),\n * });\n * if (out.success) await content.fetchByType(CONTENT_TYPE.MT5_ACCOUNT);\n * ```\n */\n\nimport { defineStore } from 'pinia';\nimport { computed, ref, shallowRef } from 'vue';\nimport {\n CONTENT_DEFAULTS,\n CONTENT_TYPE,\n CONTENT_TYPE_NAMES,\n type ContentTypeName,\n} from '../common/constants/content.constant';\nimport { MT5_ACTION_NAME, MT5_ALL_ACTIONS } from '../common/constants/mt5-action.constant';\nimport { STORE_PERSIST_KEY } from '../common/constants/storage.constant';\nimport type { ICmsSDK } from '../core/sdk.type';\nimport type {\n ActionInvokePayload,\n ActionResponse,\n ContentAction,\n ContentCreatePayload,\n ContentItem,\n ContentListResponse,\n ContentQuery,\n ContentUpdatePayload,\n KalshiEvent,\n KalshiFuture,\n KalshiServer,\n LlmConversation,\n Mt5Account,\n Mt5Category,\n Mt5ChartBar,\n Mt5DealHistory,\n Mt5Drawing,\n Mt5Group,\n Mt5OrderHistory,\n Mt5PositionHistory,\n Mt5Server,\n Mt5Symbol,\n Mt5SyncState,\n Mt5Watchlist,\n ReportDefinition,\n} from '../services/content/content.type';\n\n// ════════════════════════════════════════════════════════════════════════\n// Setup / file-private internals\n// ════════════════════════════════════════════════════════════════════════\n\nconst _NO_SDK_MSG = 'Content store: SDK not attached. Call setSdk() first.';\n\n/**\n * Action-by-CT inventory. ``Mt5Account`` carries all **25 Mt5Account\n * actions** from the mt5 pack — 13 trading (incl. `place_market_order`\n * legacy alias) + 2 financial + 8 operational + 2 viewer (see\n * ``MT5_ALL_ACTIONS``). ``KalshiFuture`` carries the 1 Kalshi action\n * (`update_spread`). The 14 other CTs in the v1 pack have none.\n *\n * Total: **26 actions** — `25 Mt5Account + 1 KalshiFuture`, per\n * `eaera-docs/cbs/eaera-cms/docs/eaera-cms-api-inventory.md` §7.6.\n *\n * This map is the runtime source of truth for `getActionsForType(typeName)`.\n * Keep in sync with the BE canonical contract (§7.1–§7.4) and the\n * alternative taxonomy in\n * `eaera-docs/cbs/eaera-cms/docs/eaera-cms-websocket-integration-guide.md`\n * §12.\n */\nconst _ACTION_BY_CT: Record<ContentTypeName, readonly string[]> = {\n Mt5Server: [],\n Mt5Account: [...MT5_ALL_ACTIONS],\n Mt5Group: [],\n Mt5SyncState: [],\n ReportDefinition: [],\n LlmConversation: [],\n KalshiServer: [],\n KalshiEvent: [],\n KalshiFuture: [MT5_ACTION_NAME.UPDATE_SPREAD],\n // FEAT-001 / FEAT-002 / FEAT-006 / FEAT-008 / FEAT-016 — webtrade CTs.\n // Read-only from the FE; mutations go through the lifecycle states\n // (active/disabled/closed) — no direct action inventories in v1.\n Mt5Symbol: [],\n Mt5Category: [],\n Mt5Watchlist: [],\n Mt5ChartBar: [],\n Mt5PositionHistory: [],\n Mt5OrderHistory: [],\n Mt5DealHistory: [],\n Mt5Drawing: [],\n};\n\n/**\n * Type mapping: ContentTypeName → its typed `ContentItem` alias. Lets us\n * look up the correct slice ref type from a runtime typeName without\n * `any`. Add new CTs here as they are typed.\n */\ntype SliceByType = {\n Mt5Server: Mt5Server;\n Mt5Account: Mt5Account;\n Mt5Group: Mt5Group;\n Mt5SyncState: Mt5SyncState;\n ReportDefinition: ReportDefinition;\n LlmConversation: LlmConversation;\n KalshiServer: KalshiServer;\n KalshiEvent: KalshiEvent;\n KalshiFuture: KalshiFuture;\n Mt5Symbol: Mt5Symbol;\n Mt5Category: Mt5Category;\n Mt5Watchlist: Mt5Watchlist;\n Mt5ChartBar: Mt5ChartBar;\n Mt5PositionHistory: Mt5PositionHistory;\n Mt5OrderHistory: Mt5OrderHistory;\n Mt5DealHistory: Mt5DealHistory;\n Mt5Drawing: Mt5Drawing;\n};\n\n/** Log a store-action failure (the action then rethrows). */\nconst _logErr = (action: string, e: unknown): void => {\n console.error(`[cms-content] ${action} failed:`, e);\n};\n\n// ════════════════════════════════════════════════════════════════════════\n// Store definition\n// ════════════════════════════════════════════════════════════════════════\n\nexport const useContentStore = defineStore(\n 'cms-content',\n () => {\n // ─────────────────────────────────────────────────────────────────────\n // State\n // ─────────────────────────────────────────────────────────────────────\n\n /** The injected SDK facade (set by the Nuxt module or by `setSdk`). */\n const sdk = shallowRef<ICmsSDK | null>(null);\n\n /**\n * 18 typed slices — one per CT the mt5 pack + webtrade modules\n * register. Empty arrays by default; populated by `fetchByType`.\n * Every slice uses its CT-specific payload type (no `any`).\n */\n const mt5Servers = ref<Mt5Server[]>([]);\n const mt5Accounts = ref<Mt5Account[]>([]);\n const mt5Groups = ref<Mt5Group[]>([]);\n const mt5SyncStates = ref<Mt5SyncState[]>([]);\n const reportDefinitions = ref<ReportDefinition[]>([]);\n const llmConversations = ref<LlmConversation[]>([]);\n const kalshiServers = ref<KalshiServer[]>([]);\n const kalshiEvents = ref<KalshiEvent[]>([]);\n const kalshiFutures = ref<KalshiFuture[]>([]);\n // FEAT-001 / FEAT-002 / FEAT-006 / FEAT-008 / FEAT-016 slices.\n const mt5Symbols = ref<Mt5Symbol[]>([]);\n const mt5Categories = ref<Mt5Category[]>([]);\n const mt5Watchlists = ref<Mt5Watchlist[]>([]);\n const mt5ChartBars = ref<Mt5ChartBar[]>([]);\n const mt5PositionHistories = ref<Mt5PositionHistory[]>([]);\n const mt5OrderHistories = ref<Mt5OrderHistory[]>([]);\n const mt5DealHistories = ref<Mt5DealHistory[]>([]);\n const mt5Drawings = ref<Mt5Drawing[]>([]);\n\n /**\n * Typed slice map: `typeName → { value: ContentItem<T>[] }`. Used by the\n * helpers below so the switch in `fetchByType` stays exhaustive and\n * the assignment is type-safe per branch.\n */\n const _sliceRefs = {\n Mt5Server: mt5Servers,\n Mt5Account: mt5Accounts,\n Mt5Group: mt5Groups,\n Mt5SyncState: mt5SyncStates,\n ReportDefinition: reportDefinitions,\n LlmConversation: llmConversations,\n KalshiServer: kalshiServers,\n KalshiEvent: kalshiEvents,\n KalshiFuture: kalshiFutures,\n Mt5Symbol: mt5Symbols,\n Mt5Category: mt5Categories,\n Mt5Watchlist: mt5Watchlists,\n Mt5ChartBar: mt5ChartBars,\n Mt5PositionHistory: mt5PositionHistories,\n Mt5OrderHistory: mt5OrderHistories,\n Mt5DealHistory: mt5DealHistories,\n Mt5Drawing: mt5Drawings,\n } satisfies Record<ContentTypeName, { value: SliceByType[ContentTypeName][] }>;\n\n /** Shared fetch state. */\n const isLoading = ref(false);\n const loadError = ref<Error | null>(null);\n\n /** Last query used per typeName — persisted across reloads. */\n const lastQueryByType = ref<Record<string, ContentQuery>>({});\n\n // ─────────────────────────────────────────────────────────────────────\n // Getters\n // ─────────────────────────────────────────────────────────────────────\n\n /** True when every typed slice is empty. */\n const isEmpty = computed(\n () =>\n !mt5Servers.value.length &&\n !mt5Accounts.value.length &&\n !mt5Groups.value.length &&\n !mt5SyncStates.value.length &&\n !reportDefinitions.value.length &&\n !llmConversations.value.length &&\n !kalshiServers.value.length &&\n !kalshiEvents.value.length &&\n !kalshiFutures.value.length &&\n !mt5Symbols.value.length &&\n !mt5Categories.value.length &&\n !mt5Watchlists.value.length &&\n !mt5ChartBars.value.length &&\n !mt5PositionHistories.value.length &&\n !mt5OrderHistories.value.length &&\n !mt5DealHistories.value.length &&\n !mt5Drawings.value.length\n );\n\n /**\n * Distinct group keys derived from `Mt5Server.data.name`.\n * (FEAT-004 scope + FEAT-006 list: every broker server is a group key.)\n */\n const groups = computed<string[]>(() =>\n Array.from(new Set(mt5Servers.value.map((s) => s.data.name)))\n );\n\n /**\n * Read-only view of the typed slice for a given CT. Returns the right\n * array type via `SliceByType[K]` lookup — no `any`.\n *\n * @example\n * const accs = computed(() =>\n * content.getByType(CONTENT_TYPE.MT5_ACCOUNT)\n * ); // typed: readonly Mt5Account[]\n */\n function getByType<K extends ContentTypeName>(typeName: K): readonly SliceByType[K][] {\n return _sliceRefs[typeName].value as SliceByType[K][];\n }\n\n /**\n * Returns the action names bound to the given CT (per the action-by-CT\n * contract). Use this to drive UI menus (\"what can I do on this row?\")\n * without hand-coding the mapping.\n */\n function getActionsForType(typeName: ContentTypeName): readonly string[] {\n return _ACTION_BY_CT[typeName];\n }\n\n /** Every CT name as a readonly array — convenience for iteration. */\n const knownTypes = CONTENT_TYPE_NAMES;\n\n // ─────────────────────────────────────────────────────────────────────\n // Actions\n // ─────────────────────────────────────────────────────────────────────\n\n /** Attach the SDK facade (called by the Nuxt module or by app code). */\n const setSdk = (instance: ICmsSDK): void => {\n sdk.value = instance;\n };\n\n /**\n * Fetch a typed slice by `typeName`. Writes the result into the matching\n * slice ref and persists the query into `lastQueryByType[typeName]`.\n *\n * The slice assignment is type-safe per CT via the exhaustive switch\n * below (verified by TypeScript — adding a new CT without updating\n * this switch will fail the build).\n *\n * Does NOT auto-refresh on mutation — call again to refresh.\n */\n const fetchByType = async <T = Record<string, unknown>>(\n typeName: ContentTypeName,\n query: ContentQuery = {}\n ): Promise<ContentListResponse<ContentItem<T>>> => {\n if (!sdk.value) throw new Error(_NO_SDK_MSG);\n isLoading.value = true;\n loadError.value = null;\n lastQueryByType.value[typeName] = query;\n try {\n const res = await sdk.value.content.list<T>({\n type: typeName,\n perPage: CONTENT_DEFAULTS.PER_PAGE,\n ...query,\n });\n switch (typeName) {\n case CONTENT_TYPE.MT5_SERVER:\n mt5Servers.value = res.items as Mt5Server[];\n break;\n case CONTENT_TYPE.MT5_ACCOUNT:\n mt5Accounts.value = res.items as Mt5Account[];\n break;\n case CONTENT_TYPE.MT5_GROUP:\n mt5Groups.value = res.items as Mt5Group[];\n break;\n case CONTENT_TYPE.MT5_SYNC_STATE:\n mt5SyncStates.value = res.items as Mt5SyncState[];\n break;\n case CONTENT_TYPE.REPORT_DEFINITION:\n reportDefinitions.value = res.items as ReportDefinition[];\n break;\n case CONTENT_TYPE.LLM_CONVERSATION:\n llmConversations.value = res.items as LlmConversation[];\n break;\n case CONTENT_TYPE.KALSHI_SERVER:\n kalshiServers.value = res.items as KalshiServer[];\n break;\n case CONTENT_TYPE.KALSHI_EVENT:\n kalshiEvents.value = res.items as KalshiEvent[];\n break;\n case CONTENT_TYPE.KALSHI_FUTURE:\n kalshiFutures.value = res.items as KalshiFuture[];\n break;\n case CONTENT_TYPE.MT5_SYMBOL:\n mt5Symbols.value = res.items as Mt5Symbol[];\n break;\n case CONTENT_TYPE.MT5_CATEGORY:\n mt5Categories.value = res.items as Mt5Category[];\n break;\n case CONTENT_TYPE.MT5_WATCHLIST:\n mt5Watchlists.value = res.items as Mt5Watchlist[];\n break;\n case CONTENT_TYPE.MT5_CHART_BAR:\n mt5ChartBars.value = res.items as Mt5ChartBar[];\n break;\n case CONTENT_TYPE.MT5_POSITION_HISTORY:\n mt5PositionHistories.value = res.items as Mt5PositionHistory[];\n break;\n case CONTENT_TYPE.MT5_ORDER_HISTORY:\n mt5OrderHistories.value = res.items as Mt5OrderHistory[];\n break;\n case CONTENT_TYPE.MT5_DEAL_HISTORY:\n mt5DealHistories.value = res.items as Mt5DealHistory[];\n break;\n case CONTENT_TYPE.MT5_DRAWING:\n mt5Drawings.value = res.items as Mt5Drawing[];\n break;\n }\n return res;\n } catch (e) {\n loadError.value = e as Error;\n _logErr('fetchByType', e);\n throw e;\n } finally {\n isLoading.value = false;\n }\n };\n\n /**\n * Batch UUID lookup — only fetches the rows that match the given uuid\n * list (wire: `?type=X&uuids=a&uuids=b&uuids=c`, per\n * `eaera_cms/core/content/routes.py:354-389`). The fetched rows are\n * **merged** into the matching typed slice by `uuid` — rows already\n * cached are overwritten with the fresh payload, others are left in\n * place. This is the inverse shape of `fetchByType` (which REPLACES\n * the whole slice); call `fetchByType` for a full refresh.\n *\n * Use this when you have a small known set of uuids (e.g. the uuids\n * referenced by a paged execution list) and want to avoid pulling the\n * full CT slice every page turn.\n *\n * Returns the fetched `ContentItem<T>` array (length ≤ `uuids.length`;\n * invalid uuids are skipped by the backend). Caller can inspect the\n * returned rows to decide whether to fall back to a full\n * `fetchByType` (e.g. when most of the requested uuids are missing).\n *\n * @deprecated Prefer fetching by a natural key via the filter DSL\n * (`buildFilter([{ field: 'data.symbol', op: 'in', value: [...] }])`)\n * instead of uuid batch lookups — uuids are unstable references for\n * cross-session data (e.g. watchlists) and the `in` filter round-trips\n * in a single page request.\n */\n const fetchByUuids = async <T = Record<string, unknown>>(\n typeName: ContentTypeName,\n uuids: readonly string[]\n ): Promise<ContentItem<T>[]> => {\n if (!sdk.value) throw new Error(_NO_SDK_MSG);\n if (!uuids.length) return [];\n // Dedupe + drop empties so the wire URL stays clean.\n const dedup = Array.from(new Set(uuids.filter((u) => typeof u === 'string' && u.length > 0)));\n if (!dedup.length) return [];\n isLoading.value = true;\n loadError.value = null;\n try {\n const res = await sdk.value.content.list<T>({\n type: typeName,\n uuids: dedup,\n perPage: Math.max(dedup.length, CONTENT_DEFAULTS.PER_PAGE),\n });\n const items = res.items;\n // Merge into the slice by uuid (latest wins). Preserves other rows\n // the caller may have cached already via `fetchByType`.\n switch (typeName) {\n case CONTENT_TYPE.MT5_SERVER: {\n const byId = new Map(mt5Servers.value.map((row) => [row.uuid, row]));\n for (const row of items as Mt5Server[]) byId.set(row.uuid, row);\n mt5Servers.value = Array.from(byId.values());\n break;\n }\n case CONTENT_TYPE.MT5_ACCOUNT: {\n const byId = new Map(mt5Accounts.value.map((row) => [row.uuid, row]));\n for (const row of items as Mt5Account[]) byId.set(row.uuid, row);\n mt5Accounts.value = Array.from(byId.values());\n break;\n }\n case CONTENT_TYPE.MT5_GROUP: {\n const byId = new Map(mt5Groups.value.map((row) => [row.uuid, row]));\n for (const row of items as Mt5Group[]) byId.set(row.uuid, row);\n mt5Groups.value = Array.from(byId.values());\n break;\n }\n case CONTENT_TYPE.MT5_SYNC_STATE: {\n const byId = new Map(mt5SyncStates.value.map((row) => [row.uuid, row]));\n for (const row of items as Mt5SyncState[]) byId.set(row.uuid, row);\n mt5SyncStates.value = Array.from(byId.values());\n break;\n }\n case CONTENT_TYPE.REPORT_DEFINITION: {\n const byId = new Map(reportDefinitions.value.map((row) => [row.uuid, row]));\n for (const row of items as ReportDefinition[]) byId.set(row.uuid, row);\n reportDefinitions.value = Array.from(byId.values());\n break;\n }\n case CONTENT_TYPE.LLM_CONVERSATION: {\n const byId = new Map(llmConversations.value.map((row) => [row.uuid, row]));\n for (const row of items as LlmConversation[]) byId.set(row.uuid, row);\n llmConversations.value = Array.from(byId.values());\n break;\n }\n case CONTENT_TYPE.KALSHI_SERVER: {\n const byId = new Map(kalshiServers.value.map((row) => [row.uuid, row]));\n for (const row of items as KalshiServer[]) byId.set(row.uuid, row);\n kalshiServers.value = Array.from(byId.values());\n break;\n }\n case CONTENT_TYPE.KALSHI_EVENT: {\n const byId = new Map(kalshiEvents.value.map((row) => [row.uuid, row]));\n for (const row of items as KalshiEvent[]) byId.set(row.uuid, row);\n kalshiEvents.value = Array.from(byId.values());\n break;\n }\n case CONTENT_TYPE.KALSHI_FUTURE: {\n const byId = new Map(kalshiFutures.value.map((row) => [row.uuid, row]));\n for (const row of items as KalshiFuture[]) byId.set(row.uuid, row);\n kalshiFutures.value = Array.from(byId.values());\n break;\n }\n case CONTENT_TYPE.MT5_SYMBOL: {\n const byId = new Map(mt5Symbols.value.map((row) => [row.uuid, row]));\n for (const row of items as Mt5Symbol[]) byId.set(row.uuid, row);\n mt5Symbols.value = Array.from(byId.values());\n break;\n }\n case CONTENT_TYPE.MT5_CATEGORY: {\n const byId = new Map(mt5Categories.value.map((row) => [row.uuid, row]));\n for (const row of items as Mt5Category[]) byId.set(row.uuid, row);\n mt5Categories.value = Array.from(byId.values());\n break;\n }\n case CONTENT_TYPE.MT5_WATCHLIST: {\n const byId = new Map(mt5Watchlists.value.map((row) => [row.uuid, row]));\n for (const row of items as Mt5Watchlist[]) byId.set(row.uuid, row);\n mt5Watchlists.value = Array.from(byId.values());\n break;\n }\n case CONTENT_TYPE.MT5_CHART_BAR: {\n const byId = new Map(mt5ChartBars.value.map((row) => [row.uuid, row]));\n for (const row of items as Mt5ChartBar[]) byId.set(row.uuid, row);\n mt5ChartBars.value = Array.from(byId.values());\n break;\n }\n case CONTENT_TYPE.MT5_POSITION_HISTORY: {\n const byId = new Map(mt5PositionHistories.value.map((row) => [row.uuid, row]));\n for (const row of items as Mt5PositionHistory[]) byId.set(row.uuid, row);\n mt5PositionHistories.value = Array.from(byId.values());\n break;\n }\n case CONTENT_TYPE.MT5_ORDER_HISTORY: {\n const byId = new Map(mt5OrderHistories.value.map((row) => [row.uuid, row]));\n for (const row of items as Mt5OrderHistory[]) byId.set(row.uuid, row);\n mt5OrderHistories.value = Array.from(byId.values());\n break;\n }\n case CONTENT_TYPE.MT5_DEAL_HISTORY: {\n const byId = new Map(mt5DealHistories.value.map((row) => [row.uuid, row]));\n for (const row of items as Mt5DealHistory[]) byId.set(row.uuid, row);\n mt5DealHistories.value = Array.from(byId.values());\n break;\n }\n case CONTENT_TYPE.MT5_DRAWING: {\n const byId = new Map(mt5Drawings.value.map((row) => [row.uuid, row]));\n for (const row of items as Mt5Drawing[]) byId.set(row.uuid, row);\n mt5Drawings.value = Array.from(byId.values());\n break;\n }\n }\n return items;\n } catch (e) {\n loadError.value = e as Error;\n _logErr('fetchByUuids', e);\n throw e;\n } finally {\n isLoading.value = false;\n }\n };\n\n /**\n * Fetch a single content item by uuid. Returns the typed `ContentItem<T>`.\n * Does NOT mutate any slice — caller decides whether to put it into a\n * slice or hold it locally.\n */\n const fetchOne = async <T = Record<string, unknown>>(uuid: string): Promise<ContentItem<T>> => {\n if (!sdk.value) throw new Error(_NO_SDK_MSG);\n try {\n return await sdk.value.content.detail<T>(uuid);\n } catch (e) {\n _logErr('fetchOne', e);\n throw e;\n }\n };\n\n /**\n * Create a new content item. Returns the created `ContentItem<T>` (with\n * server-assigned `id`, `uuid`, `version`). Does NOT auto-refetch the\n * slice — call `fetchByType(typeName)` if you need it.\n */\n const create = async <T = Record<string, unknown>>(\n payload: ContentCreatePayload<T>\n ): Promise<ContentItem<T>> => {\n if (!sdk.value) throw new Error(_NO_SDK_MSG);\n try {\n return await sdk.value.content.create<T>(payload);\n } catch (e) {\n _logErr('create', e);\n throw e;\n }\n };\n\n /**\n * Update a content item. Returns the updated `ContentItem<T>` (with new\n * `version` and `updatedAt`). Does NOT auto-refetch the slice.\n */\n const update = async <T = Record<string, unknown>>(\n uuid: string,\n payload: ContentUpdatePayload<T>\n ): Promise<ContentItem<T>> => {\n if (!sdk.value) throw new Error(_NO_SDK_MSG);\n try {\n return await sdk.value.content.update<T>(uuid, payload);\n } catch (e) {\n _logErr('update', e);\n throw e;\n }\n };\n\n /** Soft-delete a content item. Does NOT auto-refetch the slice. */\n const remove = async (uuid: string): Promise<void> => {\n if (!sdk.value) throw new Error(_NO_SDK_MSG);\n try {\n await sdk.value.content.remove(uuid);\n } catch (e) {\n _logErr('remove', e);\n throw e;\n }\n };\n\n /**\n * List the CT actions available on a content item.\n *\n * The backend returns the envelope `{contentUuid, typeName, status, availableActions}`;\n * the SDK service unwraps it to `ContentAction[]` (the SDK gap — the\n * envelope is not modeled). To get the envelope fields, call `fetchOne(uuid)`\n * separately.\n */\n const fetchActions = async (uuid: string): Promise<ContentAction[]> => {\n if (!sdk.value) throw new Error(_NO_SDK_MSG);\n try {\n return await sdk.value.content.listActions(uuid);\n } catch (e) {\n _logErr('fetchActions', e);\n throw e;\n }\n };\n\n /**\n * **Single entry point** for every mt5 pack action. The store does NOT\n * expose per-action wrappers (no `place_market_order`, `change_group`,\n * etc. on the store) — consumers pass the action name as a string and\n * the optional `params` payload.\n *\n * - `uuid` MUST belong to the action's target CT (e.g. `Mt5Account`\n * for the 25 mt5 actions; `KalshiFuture` for `update_spread`).\n * - `expectedVersion` is the optimistic-concurrency lock against the\n * row's `version` (fetch via `fetchOne` first).\n * - `intentionId` deduplicates retries (NFR-11).\n *\n * Does NOT auto-refetch the slice — call `fetchByType(typeName)` if the\n * mutation should be visible immediately.\n */\n const invokeAction = async (\n uuid: string,\n actionName: string,\n payload: ActionInvokePayload = {}\n ): Promise<ActionResponse> => {\n if (!sdk.value) throw new Error(_NO_SDK_MSG);\n try {\n return await sdk.value.content.invokeAction(uuid, actionName, payload);\n } catch (e) {\n _logErr('invokeAction', e);\n throw e;\n }\n };\n\n // ─────────────────────────────────────────────────────────────────────\n // Persist\n // ─────────────────────────────────────────────────────────────────────\n\n return {\n // state\n mt5Servers,\n mt5Accounts,\n mt5Groups,\n mt5SyncStates,\n reportDefinitions,\n llmConversations,\n kalshiServers,\n kalshiEvents,\n kalshiFutures,\n mt5Symbols,\n mt5Categories,\n mt5Watchlists,\n mt5ChartBars,\n mt5PositionHistories,\n mt5OrderHistories,\n mt5DealHistories,\n mt5Drawings,\n isLoading,\n loadError,\n lastQueryByType,\n // getters\n isEmpty,\n groups,\n getByType,\n getActionsForType,\n knownTypes,\n // actions\n setSdk,\n fetchByType,\n fetchByUuids,\n fetchOne,\n create,\n update,\n remove,\n fetchActions,\n invokeAction,\n };\n },\n {\n persist: {\n // Only the per-CT query filters survive reloads. The actual data is\n // always re-fetched; the access token is in the httpOnly cookie.\n // `pick` is the shorthand for non-httpOnly fields — equivalent to\n // `fields: { lastQueryByType: {} }`. Use `fields` instead if a field\n // ever needs `httpOnly: true`.\n pick: [],\n key: STORE_PERSIST_KEY.CONTENT,\n },\n }\n);\n","/**\n * # History store\n *\n * Thin reactive wrapper around the `history` service. Holds the most-recent\n * deal / position / order list responses and per-tab summaries so the\n * `<eaera-trading-table>` history dock can render without re-fetching on\n * every mount.\n *\n * | Store action | Service method | BE endpoint |\n * |------------------|-------------------------|--------------------------------------------|\n * | `fetchDeals` | `history.listDeals` | `GET /api/v1/history/deals` |\n * | `fetchPositions` | `history.listPositions` | `GET /api/v1/history/positions` |\n * | `fetchOrders` | `history.listOrders` | `GET /api/v1/history/orders` |\n * | `fetchDealsSummary` | `history.dealsSummary` | `GET /api/v1/history/deals/summary` |\n * | `fetchPositionsSummary` | `history.positionsSummary` | `GET /api/v1/history/positions/summary` |\n * | `fetchOrdersSummary` | `history.ordersSummary` | `GET /api/v1/history/orders/summary` |\n * | `exportCsv` | `history.exportCsv` | `GET /api/v1/history/{tab}/export` |\n *\n * **Prediction Mode (FEAT-025):** reuse `fetchPositions` / `positionList` only\n * (filter `KS-*` + closed in the app). Do **not** add a Pred-shaped history\n * client until BE confirms `GET /api/v1/kalshi/history` ships.\n *\n * Authz is email-bound (server-side) — the store may additionally pass\n * `login` to scope results to the active account.\n */\n\nimport { defineStore } from 'pinia';\nimport { computed, ref, shallowRef } from 'vue';\nimport { STORE_PERSIST_KEY } from '../common/constants/storage.constant';\nimport type { ICmsSDK } from '../core/sdk.type';\nimport type {\n DealHistoryItem,\n DealsSummaryResponse,\n HistoryDealsQuery,\n HistoryListResponse,\n HistoryOrdersQuery,\n HistoryPositionsQuery,\n OrderHistoryItem,\n OrdersSummaryResponse,\n PositionHistoryItem,\n PositionSummaryResponse,\n} from '../services/history/history.type';\nimport type { HistoryTab } from '../common/constants/history.constant';\n\nexport const useHistoryStore = defineStore(\n 'cms-history',\n () => {\n const sdk = shallowRef<ICmsSDK | null>(null);\n\n // ── State ───────────────────────────────────────────────────────────\n const dealList = ref<HistoryListResponse<DealHistoryItem> | null>(null);\n const positionList = ref<HistoryListResponse<PositionHistoryItem> | null>(null);\n const orderList = ref<HistoryListResponse<OrderHistoryItem> | null>(null);\n\n const dealsSummary = ref<DealsSummaryResponse | null>(null);\n const positionsSummary = ref<PositionSummaryResponse | null>(null);\n const ordersSummary = ref<OrdersSummaryResponse | null>(null);\n\n const isLoading = ref(false);\n const loadError = ref<Error | null>(null);\n\n const lastQuery = ref<{\n deals?: HistoryDealsQuery;\n positions?: HistoryPositionsQuery;\n orders?: HistoryOrdersQuery;\n }>({});\n\n // ── Getters ─────────────────────────────────────────────────────────\n const isEmpty = computed(\n () =>\n !dealList.value?.items.length &&\n !positionList.value?.items.length &&\n !orderList.value?.items.length\n );\n\n // ── Actions ─────────────────────────────────────────────────────────\n const setSdk = (instance: ICmsSDK): void => {\n sdk.value = instance;\n };\n\n const _logErr = (action: string, e: unknown): void => {\n console.error(`[cms-history] ${action} failed:`, e);\n };\n\n const fetchDeals = async (q: HistoryDealsQuery): Promise<void> => {\n if (!sdk.value) throw _noSdk();\n isLoading.value = true;\n loadError.value = null;\n lastQuery.value.deals = q;\n try {\n dealList.value = await sdk.value.history.listDeals(q);\n } catch (e) {\n loadError.value = e as Error;\n _logErr('fetchDeals', e);\n throw e;\n } finally {\n isLoading.value = false;\n }\n };\n\n const fetchPositions = async (q: HistoryPositionsQuery): Promise<void> => {\n if (!sdk.value) throw _noSdk();\n isLoading.value = true;\n loadError.value = null;\n lastQuery.value.positions = q;\n try {\n positionList.value = await sdk.value.history.listPositions(q);\n } catch (e) {\n loadError.value = e as Error;\n _logErr('fetchPositions', e);\n throw e;\n } finally {\n isLoading.value = false;\n }\n };\n\n const fetchOrders = async (q: HistoryOrdersQuery): Promise<void> => {\n if (!sdk.value) throw _noSdk();\n isLoading.value = true;\n loadError.value = null;\n lastQuery.value.orders = q;\n try {\n orderList.value = await sdk.value.history.listOrders(q);\n } catch (e) {\n loadError.value = e as Error;\n _logErr('fetchOrders', e);\n throw e;\n } finally {\n isLoading.value = false;\n }\n };\n\n const fetchDealsSummary = async (q: HistoryDealsQuery): Promise<void> => {\n if (!sdk.value) throw _noSdk();\n try {\n dealsSummary.value = await sdk.value.history.dealsSummary(q);\n } catch (e) {\n _logErr('fetchDealsSummary', e);\n throw e;\n }\n };\n\n const fetchPositionsSummary = async (q: HistoryPositionsQuery): Promise<void> => {\n if (!sdk.value) throw _noSdk();\n try {\n positionsSummary.value = await sdk.value.history.positionsSummary(q);\n } catch (e) {\n _logErr('fetchPositionsSummary', e);\n throw e;\n }\n };\n\n const fetchOrdersSummary = async (q: HistoryOrdersQuery): Promise<void> => {\n if (!sdk.value) throw _noSdk();\n try {\n ordersSummary.value = await sdk.value.history.ordersSummary(q);\n } catch (e) {\n _logErr('fetchOrdersSummary', e);\n throw e;\n }\n };\n\n const exportCsv = async (\n tab: HistoryTab,\n q: HistoryDealsQuery | HistoryPositionsQuery | HistoryOrdersQuery\n ): Promise<Blob> => {\n if (!sdk.value) throw _noSdk();\n try {\n return await sdk.value.history.exportCsv(tab, q);\n } catch (e) {\n _logErr('exportCsv', e);\n throw e;\n }\n };\n\n const reset = (): void => {\n dealList.value = null;\n positionList.value = null;\n orderList.value = null;\n dealsSummary.value = null;\n positionsSummary.value = null;\n ordersSummary.value = null;\n loadError.value = null;\n lastQuery.value = {};\n };\n\n return {\n // state\n dealList,\n positionList,\n orderList,\n dealsSummary,\n positionsSummary,\n ordersSummary,\n isLoading,\n loadError,\n lastQuery,\n // getters\n isEmpty,\n // actions\n setSdk,\n fetchDeals,\n fetchPositions,\n fetchOrders,\n fetchDealsSummary,\n fetchPositionsSummary,\n fetchOrdersSummary,\n exportCsv,\n reset,\n };\n },\n {\n persist: {\n pick: [],\n key: STORE_PERSIST_KEY.HISTORY,\n },\n }\n);\n\nfunction _noSdk(): Error {\n return new Error('History store: SDK not attached. Call setSdk() first.');\n}\n","import { defineStore } from 'pinia';\nimport { computed, ref, shallowRef } from 'vue';\nimport { STORE_PERSIST_KEY } from '../common/constants/storage.constant';\nimport type { ICmsSDK } from '../core/sdk.type';\nimport type {\n KalshiLastTick,\n KalshiLastTicksQuery,\n KalshiLastTicksResponse,\n KalshiSymbolTickPoint,\n KalshiSymbolTicksQuery,\n KalshiSymbolTicksResponse,\n KalshiTrendingItem,\n KalshiTrendingQuery,\n KalshiTrendingResponse,\n} from '../services/kalshi/kalshi.type';\n\n/**\n * Kalshi prediction store — trending + symbol_ticks + last_ticks (BE pack).\n * Client history uses cms-history (`GET /api/v1/history/*`), not this store.\n */\nexport const useKalshiStore = defineStore(\n 'cms-kalshi',\n () => {\n const sdk = shallowRef<ICmsSDK | null>(null);\n\n const trendingItems = ref<KalshiTrendingItem[]>([]);\n const trendingResponse = ref<KalshiTrendingResponse | null>(null);\n const tickSeries = ref<KalshiSymbolTickPoint[]>([]);\n const ticksResponse = ref<KalshiSymbolTicksResponse | null>(null);\n const lastTicks = ref<KalshiLastTick[]>([]);\n const lastTicksResponse = ref<KalshiLastTicksResponse | null>(null);\n const isLoading = ref(false);\n const loadError = ref<Error | null>(null);\n const lastTrendingQuery = ref<KalshiTrendingQuery | null>(null);\n const lastSymbolTicksQuery = ref<KalshiSymbolTicksQuery | null>(null);\n const lastLastTicksQuery = ref<KalshiLastTicksQuery | null>(null);\n\n const isTrendingEmpty = computed(() => !isLoading.value && trendingItems.value.length === 0);\n const isTicksEmpty = computed(() => !isLoading.value && tickSeries.value.length === 0);\n const isLastTicksEmpty = computed(() => !isLoading.value && lastTicks.value.length === 0);\n\n const setSdk = (instance: ICmsSDK): void => {\n sdk.value = instance;\n };\n\n const _logErr = (action: string, e: unknown): void => {\n console.error(`[cms-kalshi] ${action} failed:`, e);\n };\n\n const getTrending = async (query: KalshiTrendingQuery = {}): Promise<void> => {\n if (!sdk.value) throw _noSdk();\n isLoading.value = true;\n loadError.value = null;\n lastTrendingQuery.value = query;\n try {\n const res = await sdk.value.kalshi.getTrending(query);\n trendingItems.value = res.data.items;\n trendingResponse.value = res;\n } catch (e) {\n loadError.value = e as Error;\n _logErr('getTrending', e);\n throw e;\n } finally {\n isLoading.value = false;\n }\n };\n\n const getSymbolTicks = async (query: KalshiSymbolTicksQuery): Promise<void> => {\n if (!sdk.value) throw _noSdk();\n isLoading.value = true;\n loadError.value = null;\n lastSymbolTicksQuery.value = query;\n try {\n const res = await sdk.value.kalshi.getSymbolTicks(query);\n tickSeries.value = res.data.series;\n ticksResponse.value = res;\n } catch (e) {\n loadError.value = e as Error;\n _logErr('getSymbolTicks', e);\n throw e;\n } finally {\n isLoading.value = false;\n }\n };\n\n const getLastTicks = async (query: KalshiLastTicksQuery): Promise<void> => {\n if (!sdk.value) throw _noSdk();\n isLoading.value = true;\n loadError.value = null;\n lastLastTicksQuery.value = query;\n try {\n const res = await sdk.value.kalshi.getLastTicks(query);\n lastTicks.value = res.data.ticks;\n lastTicksResponse.value = res;\n } catch (e) {\n loadError.value = e as Error;\n _logErr('getLastTicks', e);\n throw e;\n } finally {\n isLoading.value = false;\n }\n };\n\n const reset = (): void => {\n trendingItems.value = [];\n trendingResponse.value = null;\n tickSeries.value = [];\n ticksResponse.value = null;\n lastTicks.value = [];\n lastTicksResponse.value = null;\n loadError.value = null;\n lastTrendingQuery.value = null;\n lastSymbolTicksQuery.value = null;\n lastLastTicksQuery.value = null;\n };\n\n return {\n trendingItems,\n trendingResponse,\n tickSeries,\n ticksResponse,\n lastTicks,\n lastTicksResponse,\n isLoading,\n loadError,\n lastTrendingQuery,\n /** @deprecated use lastSymbolTicksQuery — kept for callers that still read lastTicksQuery */\n lastTicksQuery: lastSymbolTicksQuery,\n lastSymbolTicksQuery,\n lastLastTicksQuery,\n isTrendingEmpty,\n isTicksEmpty,\n isLastTicksEmpty,\n setSdk,\n getTrending,\n getSymbolTicks,\n getLastTicks,\n reset,\n };\n },\n {\n persist: {\n pick: [],\n key: STORE_PERSIST_KEY.KALSHI,\n },\n }\n);\n\nfunction _noSdk(): Error {\n return new Error('Kalshi store: SDK not attached. Call setSdk() first.');\n}\n","import { defineStore } from 'pinia';\nimport { computed, ref, shallowRef } from 'vue';\nimport { STORE_PERSIST_KEY } from '../common/constants/storage.constant';\nimport type { ICmsSDK } from '../core/sdk.type';\nimport type {\n GovMatrixRow,\n GovProjectTasksOutput,\n GovUsageDashboard,\n GovUsageExport,\n GovUsageQuery,\n GovUsageCost,\n} from '../services/gov/gov.type';\n\n/**\n * Gov store — AI Government Portal pack surfaces (FEAT-001..007).\n *\n * Mirrors the pack's **portal REST reads** (assignment matrix, usage\n * cost/dashboard); pack actions are called directly on `sdk.gov` (typed\n * wrappers) and CT lists (agents, providers, …) go through\n * `useContentStore.fetchByType` with the `GOV_CONTENT_TYPE` names — this\n * store only owns the aggregation endpoints.\n *\n * No action auto-refetches the affected slice — after an action mutates\n * rows, call the matching `fetch*` if the state should reflect the change.\n */\nexport const useGovStore = defineStore(\n 'cms-gov',\n () => {\n const sdk = shallowRef<ICmsSDK | null>(null);\n\n const matrix = ref<GovMatrixRow[]>([]);\n const costBreakdown = ref<GovUsageCost | null>(null);\n const dashboard = ref<GovUsageDashboard | null>(null);\n const isLoading = ref(false);\n const loadError = ref<Error | null>(null);\n const lastUsageQuery = ref<GovUsageQuery>({});\n\n const hasUsageData = computed(() => !!dashboard.value && dashboard.value.recordCount > 0);\n\n const setSdk = (instance: ICmsSDK): void => {\n sdk.value = instance;\n };\n\n /** Log a store-action failure (the action then rethrows). */\n const _logErr = (action: string, e: unknown): void => {\n console.error(`[cms-gov] ${action} failed:`, e);\n };\n\n async function _loading<T>(label: string, fn: () => Promise<T>): Promise<T> {\n if (!sdk.value) throw _noSdk();\n isLoading.value = true;\n loadError.value = null;\n try {\n return await fn();\n } catch (e) {\n loadError.value = e as Error;\n _logErr(label, e);\n throw e;\n } finally {\n isLoading.value = false;\n }\n }\n\n const fetchMatrix = async (): Promise<void> => {\n matrix.value = await _loading('fetchMatrix', () => sdk.value!.gov.getAssignmentMatrix());\n };\n\n const fetchUsageCost = async (query: GovUsageQuery = {}): Promise<void> => {\n costBreakdown.value = await _loading('fetchUsageCost', () =>\n sdk.value!.gov.getUsageCost(query)\n );\n lastUsageQuery.value = query;\n };\n\n const fetchDashboard = async (query: GovUsageQuery = {}): Promise<void> => {\n dashboard.value = await _loading('fetchDashboard', () =>\n sdk.value!.gov.getUsageDashboard(query)\n );\n lastUsageQuery.value = query;\n };\n\n /** Aggregate a project's tasks (not persisted — caller holds the result). */\n const fetchProjectTasks = (name: string): Promise<GovProjectTasksOutput> =>\n _loading('fetchProjectTasks', () => sdk.value!.gov.getProjectTasks(name));\n\n /** CSV export (not persisted — caller triggers the download). */\n const exportUsageCsv = (query: GovUsageQuery = {}): Promise<GovUsageExport> =>\n _loading('exportUsageCsv', () => sdk.value!.gov.exportUsageCsv(query));\n\n return {\n // state\n matrix,\n costBreakdown,\n dashboard,\n isLoading,\n loadError,\n lastUsageQuery,\n // getters\n hasUsageData,\n // actions\n setSdk,\n fetchMatrix,\n fetchUsageCost,\n fetchDashboard,\n fetchProjectTasks,\n exportUsageCsv,\n };\n },\n {\n persist: {\n pick: ['lastUsageQuery'],\n key: STORE_PERSIST_KEY.GOV,\n },\n }\n);\n\nfunction _noSdk(): Error {\n return new Error('Gov store: SDK not attached. Call setSdk() first.');\n}\n","import { defineStore } from 'pinia';\nimport { computed, ref, shallowRef } from 'vue';\nimport { STORE_PERSIST_KEY } from '../common/constants/storage.constant';\nimport type { ICmsSDK } from '../core/sdk.type';\nimport type {\n PeopleAccessAuditQuery,\n PeopleAccessAuditResult,\n} from '../services/people/perms/projections';\nimport type {\n PeopleProvisionQueueEntry,\n PeopleProviderHealth,\n} from '../services/people/identity/projections';\nimport { isSystemOnlyAction, PEOPLE_ACTION_BY_CT } from '../common/constants/people.constant';\n\n/**\n * People store — People Hub pack surfaces (FEAT-001/002/007/008/009/010/011/014/015/016).\n *\n * Mirrors the pack's **3 REST projections** (access audit · provider health\n * · provisioning queue). Plain CT lists go through `useContentStore.fetchByType`\n * with the `PEOPLE_CONTENT_TYPE` names — this store only owns the\n * aggregation endpoints (same boundary as `useGovStore`).\n *\n * Pack actions are invoked via the typed wrappers on `sdk.people` — no\n * action auto-refetches the affected slice; call the matching `fetch*` if\n * the state should reflect the change.\n */\nexport const usePeopleStore = defineStore(\n 'cms-people',\n () => {\n const sdk = shallowRef<ICmsSDK | null>(null);\n\n const accessAudit = ref<PeopleAccessAuditResult | null>(null);\n const providerHealth = ref<PeopleProviderHealth | null>(null);\n const provisionQueue = ref<{\n count: number;\n items: PeopleProvisionQueueEntry[];\n } | null>(null);\n\n const isLoading = ref(false);\n const loadError = ref<Error | null>(null);\n\n const lastAccessAuditQuery = ref<PeopleAccessAuditQuery | null>(null);\n\n /** True when the audit query has been run at least once with results. */\n const hasAccessAuditData = computed(() => !!accessAudit.value && accessAudit.value.count > 0);\n\n const setSdk = (instance: ICmsSDK): void => {\n sdk.value = instance;\n };\n\n /** Log a store-action failure (the action then rethrows). */\n const _logErr = (action: string, e: unknown): void => {\n console.error(`[cms-people] ${action} failed:`, e);\n };\n\n async function _loading<T>(label: string, fn: () => Promise<T>): Promise<T> {\n if (!sdk.value) throw _noSdk();\n isLoading.value = true;\n loadError.value = null;\n try {\n return await fn();\n } catch (e) {\n loadError.value = e as Error;\n _logErr(label, e);\n throw e;\n } finally {\n isLoading.value = false;\n }\n }\n\n /* ─── projections ─── */\n\n const runAccessAudit = async (query: PeopleAccessAuditQuery): Promise<void> => {\n const res = await _loading('runAccessAudit', () => sdk.value!.people.runAccessAudit(query));\n accessAudit.value = res;\n lastAccessAuditQuery.value = query;\n };\n\n const getProviderHealth = async (key: string): Promise<PeopleProviderHealth | null> => {\n const res = await _loading('getProviderHealth', () =>\n sdk.value!.people.getProviderHealth(key)\n );\n providerHealth.value = res as PeopleProviderHealth;\n return providerHealth.value;\n };\n\n const getProvisionQueue = async (query?: {\n provider?: string;\n employment?: string;\n state?: string;\n }): Promise<{ count: number; items: PeopleProvisionQueueEntry[] } | null> => {\n const res = await _loading('getProvisionQueue', () =>\n sdk.value!.people.getProvisionQueue(query)\n );\n provisionQueue.value = res as { count: number; items: PeopleProvisionQueueEntry[] };\n return provisionQueue.value;\n };\n\n /* ─── derived helpers ─── */\n\n /** Filter a CT action list against {@link PEOPLE_SYSTEM_ONLY_ACTIONS}.\n * Used by the UI rail to never offer system-only actions. */\n const userCallableActions = (ctWireName: string): readonly string[] => {\n const bound = PEOPLE_ACTION_BY_CT[ctWireName as keyof typeof PEOPLE_ACTION_BY_CT];\n if (!bound) return [];\n return bound.filter((name) => !isSystemOnlyAction(name));\n };\n\n return {\n // state\n accessAudit,\n providerHealth,\n provisionQueue,\n isLoading,\n loadError,\n lastAccessAuditQuery,\n // getters\n hasAccessAuditData,\n // actions\n setSdk,\n runAccessAudit,\n getProviderHealth,\n getProvisionQueue,\n userCallableActions,\n };\n },\n {\n persist: {\n pick: ['lastAccessAuditQuery'],\n key: STORE_PERSIST_KEY.PEOPLE,\n },\n }\n);\n\nfunction _noSdk(): Error {\n return new Error('People store: SDK not attached. Call setSdk() first.');\n}\n","import { defineStore } from 'pinia';\nimport { computed, ref, shallowRef } from 'vue';\nimport { STORE_PERSIST_KEY } from '../common/constants/storage.constant';\nimport type { ICmsSDK } from '../core/sdk.type';\nimport type {\n ContentRule,\n ContentRuleListResponse,\n RuleCreatePayload,\n RuleListQuery,\n RuleUpdatePayload,\n SignalFireContext,\n SignalFireResponse,\n} from '../services/rules/rules.type';\n\n/**\n * Rules store — `ContentRule` CRUD (`/api/v1/rules`). Serves both FEAT-002\n * (`conditionType: 'llm_agent'` skills) and FEAT-004 (expression/chain).\n *\n * All field names use camelCase to match the backend API response.\n */\nexport const useRulesStore = defineStore(\n 'cms-rules',\n () => {\n const sdk = shallowRef<ICmsSDK | null>(null);\n\n const items = ref<ContentRule[]>([]);\n const total = ref(0);\n const isLoading = ref(false);\n const loadError = ref<Error | null>(null);\n const lastQuery = ref<Partial<RuleListQuery>>({});\n const selectedRule = ref<ContentRule | null>(null);\n\n const isEmpty = computed(() => !isLoading.value && items.value.length === 0);\n const activeRules = computed(() => items.value.filter((r) => r.isActive));\n\n const setSdk = (instance: ICmsSDK): void => {\n sdk.value = instance;\n };\n\n /** Log a store-action failure (the action then rethrows). */\n const _logErr = (action: string, e: unknown): void => {\n console.error(`[cms-rules] ${action} failed:`, e);\n };\n\n const fetch = async (query: Partial<RuleListQuery> = {}): Promise<void> => {\n if (!sdk.value) throw _noSdk();\n isLoading.value = true;\n loadError.value = null;\n lastQuery.value = query;\n try {\n const res = await sdk.value.rules.list(query);\n items.value = res.items;\n total.value = res.total;\n } catch (e) {\n loadError.value = e as Error;\n _logErr('fetch', e);\n throw e;\n } finally {\n isLoading.value = false;\n }\n };\n\n const select = (uuid: string | null): void => {\n selectedRule.value = items.value.find((r) => r.uuid === uuid) ?? null;\n };\n\n const create = async (payload: RuleCreatePayload): Promise<void> => {\n if (!sdk.value) throw _noSdk();\n try {\n await sdk.value.rules.create(payload);\n await fetch(lastQuery.value);\n } catch (e) {\n _logErr('create', e);\n throw e;\n }\n };\n\n const update = async (uuid: string, payload: RuleUpdatePayload): Promise<void> => {\n if (!sdk.value) throw _noSdk();\n try {\n await sdk.value.rules.update(uuid, payload);\n await fetch(lastQuery.value);\n } catch (e) {\n _logErr('update', e);\n throw e;\n }\n };\n\n const toggle = async (uuid: string, active: boolean): Promise<void> => {\n if (!sdk.value) throw _noSdk();\n try {\n await sdk.value.rules.update(uuid, { isActive: active });\n await fetch(lastQuery.value);\n } catch (e) {\n _logErr('toggle', e);\n throw e;\n }\n };\n\n const remove = async (uuid: string): Promise<void> => {\n if (!sdk.value) throw _noSdk();\n try {\n await sdk.value.rules.remove(uuid);\n await fetch(lastQuery.value);\n } catch (e) {\n _logErr('remove', e);\n throw e;\n }\n };\n\n /**\n * Manually fire a signal rule. Runs synchronously in the API pod; does NOT\n * refetch the list (it creates executions, not rule changes). Returns the\n * fire result so the caller can surface `triggeredCount`. Pass\n * `options.timeoutMs` to override the SDK's 30s default — multi-step\n * action chains routinely exceed 30s in production.\n */\n const signalFire = async (\n signalName: string,\n context: SignalFireContext,\n options?: { timeoutMs?: number }\n ): Promise<SignalFireResponse> => {\n if (!sdk.value) throw _noSdk();\n try {\n return await sdk.value.rules.signalFire(signalName, context, options);\n } catch (e) {\n _logErr('signalFire', e);\n throw e;\n }\n };\n\n return {\n // state\n items,\n total,\n isLoading,\n loadError,\n lastQuery,\n selectedRule,\n // getters\n isEmpty,\n activeRules,\n // actions\n setSdk,\n fetch,\n select,\n create,\n update,\n toggle,\n remove,\n signalFire,\n };\n },\n {\n persist: {\n pick: ['lastQuery'],\n key: STORE_PERSIST_KEY.RULES,\n },\n }\n);\n\nexport type { ContentRuleListResponse };\n\nfunction _noSdk(): Error {\n return new Error('Rules store: SDK not attached. Call setSdk() first.');\n}\n","import { defineStore } from 'pinia';\nimport { computed, ref, shallowRef } from 'vue';\nimport { STORE_PERSIST_KEY } from '../common/constants/storage.constant';\nimport type { ICmsSDK } from '../core/sdk.type';\nimport type { ContentExecution, ExecutionListParams } from '../services/executions/executions.type';\n\n/**\n * Executions store — `ContentExecution` queries (`/api/v1/executions`,\n * `/api/v1/rules/content/{id}/executions`). READ-ONLY. One store backs both the\n * FEAT-003 detection feed and the FEAT-005 action-history table; each view\n * re-fetches on mount (no background polling).\n *\n * There is **no** triage write endpoint (no `PUT /api/v1/executions/{uuid}`).\n * Operator triage (move group / set leverage) is performed through the **content\n * action router** (`useContentStore().invokeAction`); \"skip\" is a client-side\n * dismiss. Triage state is held in the FEAT-003 composable, not here.\n */\nexport const useExecutionsStore = defineStore(\n 'cms-executions',\n () => {\n const sdk = shallowRef<ICmsSDK | null>(null);\n\n const items = ref<ContentExecution[]>([]);\n const total = ref(0);\n const isLoading = ref(false);\n const loadError = ref<Error | null>(null);\n const lastParams = ref<ExecutionListParams>({});\n\n const isEmpty = computed(() => !isLoading.value && items.value.length === 0);\n\n const setSdk = (instance: ICmsSDK): void => {\n sdk.value = instance;\n };\n\n /** Log a store-action failure (the action then rethrows). */\n const _logErr = (action: string, e: unknown): void => {\n console.error(`[cms-executions] ${action} failed:`, e);\n };\n\n const list = async (params: ExecutionListParams = {}): Promise<void> => {\n if (!sdk.value) throw _noSdk();\n isLoading.value = true;\n loadError.value = null;\n lastParams.value = params;\n try {\n const res = await sdk.value.executions.list(params);\n items.value = res.items;\n total.value = res.total;\n } catch (e) {\n loadError.value = e as Error;\n _logErr('list', e);\n throw e;\n } finally {\n isLoading.value = false;\n }\n };\n\n /**\n * Upsert one or more `ContentExecution` rows into the current items\n * (FEAT-010). Used by consumers wiring the WS `risk:executions` feed:\n * a live event is prepended (or replaced in-place when the uuid is\n * already known) so the user sees new detections without a refetch.\n *\n * `total` is NOT incremented — pagination is server-side; the live row\n * is visible in the current view until the next `list()` refresh.\n */\n const merge = (incoming: ContentExecution[]): void => {\n if (!incoming.length) return;\n const byUuid = new Map<string, ContentExecution>();\n for (const row of incoming) byUuid.set(row.uuid, row);\n const kept: ContentExecution[] = [];\n for (const row of items.value) {\n const upd = byUuid.get(row.uuid);\n if (upd) {\n kept.push(upd);\n byUuid.delete(row.uuid);\n } else {\n kept.push(row);\n }\n }\n // Prepend brand-new rows in the original incoming order.\n const fresh = incoming.filter((row) => byUuid.has(row.uuid));\n items.value = [...fresh, ...kept];\n };\n\n return {\n // state\n items,\n total,\n isLoading,\n loadError,\n lastParams,\n // getters\n isEmpty,\n // actions\n setSdk,\n list,\n merge,\n };\n },\n {\n persist: {\n pick: ['lastParams'],\n key: STORE_PERSIST_KEY.EXECUTIONS,\n },\n }\n);\n\nfunction _noSdk(): Error {\n return new Error('Executions store: SDK not attached. Call setSdk() first.');\n}\n","import { defineStore } from 'pinia';\nimport { computed, ref, shallowRef } from 'vue';\nimport { STORE_PERSIST_KEY } from '../common/constants/storage.constant';\nimport type { ICmsSDK } from '../core/sdk.type';\n\n/**\n * Settings store — monitored-groups list (FEAT-006). The CMS is the source of\n * truth; the store mirrors it locally for fast UI and writes changes back\n * through `addGroup` / `removeGroup`. The mirrored list is persisted so the UI\n * is fast on reload (it is non-credential UI state).\n */\nexport const useSettingsStore = defineStore(\n 'cms-settings',\n () => {\n const sdk = shallowRef<ICmsSDK | null>(null);\n\n const monitoredGroups = ref<string[]>([]);\n const isLoading = ref(false);\n const loadError = ref<Error | null>(null);\n\n const isEmpty = computed(() => monitoredGroups.value.length === 0);\n\n const setSdk = (instance: ICmsSDK): void => {\n sdk.value = instance;\n };\n\n /** Log a store-action failure (the action then rethrows). */\n const _logErr = (action: string, e: unknown): void => {\n console.error(`[cms-settings] ${action} failed:`, e);\n };\n\n const fetchGroups = async (): Promise<void> => {\n if (!sdk.value) throw _noSdk();\n isLoading.value = true;\n loadError.value = null;\n try {\n monitoredGroups.value = await sdk.value.settings.getMonitoredGroups();\n } catch (e) {\n loadError.value = e as Error;\n _logErr('fetchGroups', e);\n throw e;\n } finally {\n isLoading.value = false;\n }\n };\n\n const _save = async (): Promise<void> => {\n if (!sdk.value) throw _noSdk();\n try {\n monitoredGroups.value = await sdk.value.settings.setMonitoredGroups(monitoredGroups.value);\n } catch (e) {\n _logErr('_save', e);\n throw e;\n }\n };\n\n const addGroup = async (group: string): Promise<void> => {\n if (!sdk.value) throw _noSdk();\n if (monitoredGroups.value.includes(group)) return;\n monitoredGroups.value = [...monitoredGroups.value, group];\n try {\n await _save();\n } catch (e) {\n // rollback the optimistic add\n monitoredGroups.value = monitoredGroups.value.filter((g) => g !== group);\n throw e;\n }\n };\n\n const removeGroup = async (group: string): Promise<void> => {\n if (!sdk.value) throw _noSdk();\n const prev = monitoredGroups.value;\n monitoredGroups.value = monitoredGroups.value.filter((g) => g !== group);\n try {\n await _save();\n } catch (e) {\n // rollback the optimistic remove\n monitoredGroups.value = prev;\n throw e;\n }\n };\n\n return {\n // state\n monitoredGroups,\n isLoading,\n loadError,\n // getters\n isEmpty,\n // actions\n setSdk,\n fetchGroups,\n addGroup,\n removeGroup,\n };\n },\n {\n persist: {\n pick: ['monitoredGroups'],\n key: STORE_PERSIST_KEY.SETTINGS,\n },\n }\n);\n\nfunction _noSdk(): Error {\n return new Error('Settings store: SDK not attached. Call setSdk() first.');\n}\n","import { defineStore } from 'pinia';\nimport { computed, ref, shallowRef } from 'vue';\nimport { STORE_PERSIST_KEY } from '../common/constants/storage.constant';\nimport type { ICmsSDK } from '../core/sdk.type';\nimport type {\n PromptCreatePayload,\n PromptTemplate,\n PromptUpdatePayload,\n} from '../services/llm/llm.type';\n\n/**\n * LLM prompt-template store — backs the dashboard \"Skill\" page (FEAT-002).\n *\n * Skills are managed through `/api/v1/llm/prompts` (NOT the generic content\n * endpoint — that path was retired in LT-13). A skill's on/off state lives on\n * its **linked `llm_agent` ContentRule** (`trigger.sourceConfig.promptName`),\n * not on the prompt; this store only mirrors the prompt catalog and CRUDs it.\n *\n * The list response omits `content` / `systemPrompt`; call `fetchDetail(name)`\n * before editing so the editor has the full template.\n */\nexport const useLlmStore = defineStore(\n 'cms-llm',\n () => {\n const sdk = shallowRef<ICmsSDK | null>(null);\n\n const prompts = ref<PromptTemplate[]>([]);\n const isLoading = ref(false);\n const loadError = ref<Error | null>(null);\n\n const isEmpty = computed(() => !isLoading.value && prompts.value.length === 0);\n\n const setSdk = (instance: ICmsSDK): void => {\n sdk.value = instance;\n };\n\n const _logErr = (action: string, e: unknown): void => {\n console.error(`[cms-llm] ${action} failed:`, e);\n };\n\n const fetchPrompts = async (): Promise<void> => {\n if (!sdk.value) throw _noSdk();\n isLoading.value = true;\n loadError.value = null;\n try {\n prompts.value = await sdk.value.llm.listPrompts();\n } catch (e) {\n loadError.value = e as Error;\n _logErr('fetchPrompts', e);\n throw e;\n } finally {\n isLoading.value = false;\n }\n };\n\n /** Load a single template with `content` / `systemPrompt` for editing. */\n const fetchDetail = async (name: string): Promise<PromptTemplate> => {\n if (!sdk.value) throw _noSdk();\n try {\n return await sdk.value.llm.getPrompt(name);\n } catch (e) {\n _logErr('fetchDetail', e);\n throw e;\n }\n };\n\n const create = async (payload: PromptCreatePayload): Promise<void> => {\n if (!sdk.value) throw _noSdk();\n try {\n await sdk.value.llm.createPrompt(payload);\n await fetchPrompts();\n } catch (e) {\n _logErr('create', e);\n throw e;\n }\n };\n\n const update = async (name: string, payload: PromptUpdatePayload): Promise<void> => {\n if (!sdk.value) throw _noSdk();\n try {\n await sdk.value.llm.updatePrompt(name, payload);\n await fetchPrompts();\n } catch (e) {\n _logErr('update', e);\n throw e;\n }\n };\n\n const remove = async (name: string): Promise<void> => {\n if (!sdk.value) throw _noSdk();\n try {\n await sdk.value.llm.deletePrompt(name);\n prompts.value = prompts.value.filter((p) => p.name !== name);\n } catch (e) {\n _logErr('remove', e);\n throw e;\n }\n };\n\n return {\n // state\n prompts,\n isLoading,\n loadError,\n // getters\n isEmpty,\n // actions\n setSdk,\n fetchPrompts,\n fetchDetail,\n create,\n update,\n remove,\n };\n },\n {\n persist: {\n pick: ['prompts'],\n key: STORE_PERSIST_KEY.LLM,\n },\n }\n);\n\nfunction _noSdk(): Error {\n return new Error('LLM store: SDK not attached. Call setSdk() first.');\n}\n","import { defineStore } from 'pinia';\nimport { computed, ref, shallowRef } from 'vue';\nimport { STORE_PERSIST_KEY } from '../common/constants/storage.constant';\nimport type { ICmsSDK } from '../core/sdk.type';\nimport type {\n LlmProvider,\n LlmProviderCreatePayload,\n LlmProviderModelsResponse,\n LlmProviderUpdatePayload,\n} from '../services/llm/llm.type';\n\n/**\n * LLM-provider store — backs the dashboard \"LLM Providers\" page (FEAT-002\n * provider admin). Providers are registered in-process on whichever pod\n * created them and are lost on restart unless env- or content-backed\n * (`risk-rules-api-guide.md` §7.C).\n *\n * A `llm_agent` rule silently produces zero targets when no provider is wired,\n * so the Skills page surfaces the {@link hasProvider} getter as a warning.\n */\nexport const useLlmProvidersStore = defineStore(\n 'cms-llm-providers',\n () => {\n const sdk = shallowRef<ICmsSDK | null>(null);\n\n const providers = ref<LlmProvider[]>([]);\n const isLoading = ref(false);\n const loadError = ref<Error | null>(null);\n\n const isEmpty = computed(() => !isLoading.value && providers.value.length === 0);\n const hasProvider = computed(() => providers.value.length > 0);\n\n const setSdk = (instance: ICmsSDK): void => {\n sdk.value = instance;\n };\n\n const _logErr = (action: string, e: unknown): void => {\n console.error(`[cms-llm-providers] ${action} failed:`, e);\n };\n\n const fetch = async (): Promise<void> => {\n if (!sdk.value) throw _noSdk();\n isLoading.value = true;\n loadError.value = null;\n try {\n providers.value = await sdk.value.llm.listProviders();\n } catch (e) {\n loadError.value = e as Error;\n _logErr('fetch', e);\n throw e;\n } finally {\n isLoading.value = false;\n }\n };\n\n const register = async (payload: LlmProviderCreatePayload): Promise<void> => {\n if (!sdk.value) throw _noSdk();\n try {\n await sdk.value.llm.registerProvider(payload);\n await fetch();\n } catch (e) {\n _logErr('register', e);\n throw e;\n }\n };\n\n const update = async (name: string, payload: LlmProviderUpdatePayload): Promise<void> => {\n if (!sdk.value) throw _noSdk();\n try {\n await sdk.value.llm.updateProvider(name, payload);\n await fetch();\n } catch (e) {\n _logErr('update', e);\n throw e;\n }\n };\n\n const remove = async (name: string): Promise<void> => {\n if (!sdk.value) throw _noSdk();\n try {\n await sdk.value.llm.deleteProvider(name);\n await fetch();\n } catch (e) {\n _logErr('remove', e);\n throw e;\n }\n };\n\n /** Load supported models + health for a single provider (not persisted). */\n const models = async (name: string): Promise<LlmProviderModelsResponse> => {\n if (!sdk.value) throw _noSdk();\n try {\n return await sdk.value.llm.listProviderModels(name);\n } catch (e) {\n _logErr('models', e);\n throw e;\n }\n };\n\n return {\n // state\n providers,\n isLoading,\n loadError,\n // getters\n isEmpty,\n hasProvider,\n // actions\n setSdk,\n fetch,\n register,\n update,\n remove,\n models,\n };\n },\n {\n persist: {\n pick: ['providers'],\n key: STORE_PERSIST_KEY.LLM_PROVIDERS,\n },\n }\n);\n\nfunction _noSdk(): Error {\n return new Error('LLM providers store: SDK not attached. Call setSdk() first.');\n}\n","import { defineStore } from 'pinia';\nimport { computed, ref, shallowRef } from 'vue';\nimport type { ICmsSDK } from '../core/sdk.type';\nimport type { IWsClient, WsConnectionState, IWsEvent } from '../core/ws/ws.type';\nimport { WS_CONNECTION_STATE } from '../core/ws/ws.constants';\n\n/**\n * WebSocket store — thin reactive facade over {@link IWsClient}. The SDK's\n * Nuxt module wires the SDK facade (which holds the WS client); standalone\n * consumers call {@link useWsStore.setSdk} once.\n *\n * The store is intentionally **non-persistent**: the WS connection is\n * per-session; subscriptions are rebuilt on every reconnect.\n *\n * Consumers typically do one of:\n *\n * - subscribe declaratively:\n * `useWsStore().subscribe(['risk:executions'])`\n * - listen for live events (via the Nuxt-injected WS client):\n * `useNuxtApp().$ws?.onEvent((e) => { ... })`\n * - dispatch an action:\n * `useWsStore().invokeAction(uuid, 'place_market_order', { ... })`\n */\nexport const useWsStore = defineStore(\n 'cms-ws',\n () => {\n const sdk = shallowRef<ICmsSDK | null>(null);\n const client = shallowRef<IWsClient | null>(null);\n\n const connectionState = ref<WsConnectionState>(WS_CONNECTION_STATE.IDLE);\n const lastEventAt = ref<string | null>(null);\n const subscribed = ref<Set<string>>(new Set());\n\n const isOpen = computed(() => connectionState.value === WS_CONNECTION_STATE.OPEN);\n const isReady = computed(\n () =>\n connectionState.value === WS_CONNECTION_STATE.OPEN ||\n connectionState.value === WS_CONNECTION_STATE.AUTHENTICATING\n );\n\n const setSdk = (instance: ICmsSDK): void => {\n sdk.value = instance;\n const ws = instance.ws;\n client.value = ws;\n if (!ws) return;\n\n ws.onState((s) => {\n connectionState.value = s;\n });\n ws.onEvent((e: IWsEvent) => {\n lastEventAt.value = e.ts ?? new Date().toISOString();\n });\n };\n\n const open = (): void => {\n client.value?.open();\n };\n\n /**\n * Force a fresh handshake — close the current socket and open a new one\n * that re-sends the auth frame with the current token + replays all\n * previously-subscribed topics. Use after a login / token change so the\n * server sees the new credentials without a page refresh.\n */\n const reopen = (): void => {\n client.value?.reopen();\n };\n\n const close = (reason?: string): void => {\n client.value?.close(reason);\n };\n\n const subscribe = (topics: string[]): void => {\n if (!client.value) return;\n client.value.subscribe(topics);\n const next = new Set(subscribed.value);\n for (const t of topics) next.add(t);\n subscribed.value = next;\n };\n\n const unsubscribe = (topics: string[]): void => {\n if (!client.value) return;\n client.value.unsubscribe(topics);\n const next = new Set(subscribed.value);\n for (const t of topics) next.delete(t);\n subscribed.value = next;\n };\n\n const unsubscribeAll = (): void => {\n client.value?.unsubscribeAll();\n subscribed.value = new Set();\n };\n\n const invokeAction = (\n contentUuid: string,\n action: string,\n params?: Record<string, unknown>\n ): string | null => {\n if (!client.value) return null;\n return client.value.invokeAction(contentUuid, action, params);\n };\n\n const fetchResult = (requestId: string): void => {\n client.value?.fetchResult(requestId);\n };\n\n return {\n // state\n connectionState,\n lastEventAt,\n subscribed,\n // getters\n isOpen,\n isReady,\n // actions\n setSdk,\n open,\n reopen,\n close,\n subscribe,\n unsubscribe,\n unsubscribeAll,\n invokeAction,\n fetchResult,\n };\n },\n {\n // Non-persistent by design — WS state is per-session only.\n persist: false,\n }\n);\n","import type { PiniaPlugin, PiniaPluginContext } from 'pinia';\n\n/** Per-state persistence options (declared inside a store's `persist.fields`). */\nexport interface IPersistFieldOptions {\n /**\n * When true, the field is written through the httpOnly server endpoint\n * (`/api/cms-sdk/persist`) instead of directly on the client. During SSR the\n * plugin still writes it directly via `storage` (server-side setCookie).\n * Default false.\n */\n httpOnly?: boolean;\n}\n\n/** Per-store persistence config (the `persist` option on a setup store). */\nexport interface IPersistConfig {\n /** Namespace prefix for this store's cookies. Each field → cookie `${key}.${field}`. */\n key: string;\n /** Explicit field → options map. Mutually tolerant with `pick` (both may be used). */\n fields?: Record<string, IPersistFieldOptions>;\n /**\n * Shorthand: list of field names to persist as non-httpOnly cookies. Equivalent\n * to `fields: { <name>: {} }` for each. Compatible with the `pick` convention.\n */\n pick?: string[];\n}\n\n/** Key-value storage the persistence plugin reads from / writes to. */\nexport interface IPersistStorage {\n getItem(key: string): string | null;\n setItem(key: string, value: string, opts?: { httpOnly?: boolean }): void;\n removeItem(key: string, opts?: { httpOnly?: boolean }): void;\n}\n\nexport interface ICreatePersistPluginOptions {\n storage: IPersistStorage;\n /**\n * Persist endpoint used for client-side httpOnly writes. If unset, httpOnly\n * client writes are skipped (e.g. standalone usage without a server).\n */\n httpEndpoint?: string;\n /** True during SSR — the plugin writes cookies directly via `storage`. */\n ssr?: boolean;\n /** Debounce window for writes on the client (ms). Default 150. */\n debounceMs?: number;\n}\n\n/**\n * Internal, dependency-free Pinia persistence plugin. Cookie-based, per-state,\n * with an optional `httpOnly` flag per state.\n *\n * - `httpOnly: false` (default) → written directly on the client (document.cookie).\n * - `httpOnly: true` → on the client, POSTed to `httpEndpoint` so the server\n * sets the httpOnly cookie; during SSR, written directly via `storage`.\n *\n * Only the states declared in `persist.fields` are persisted (never the whole\n * store, never credentials).\n */\nexport function createPersistPlugin(options: ICreatePersistPluginOptions): PiniaPlugin {\n const { storage, httpEndpoint, ssr = false, debounceMs = 150 } = options;\n\n return (ctx: PiniaPluginContext) => {\n const persist = (ctx.options as { persist?: IPersistConfig | false } | undefined)?.persist;\n if (!persist) return;\n\n const { key, pick } = persist;\n const fields: Record<string, IPersistFieldOptions> = { ...(persist.fields ?? {}) };\n // `pick` is a shorthand for non-httpOnly fields (compatible with the pick convention).\n if (pick) for (const f of pick) if (!(f in fields)) fields[f] = {};\n const fieldNames = Object.keys(fields);\n if (fieldNames.length === 0) return;\n\n const hydrate = (): void => {\n for (const field of fieldNames) {\n let raw: string | null = null;\n try {\n raw = storage.getItem(`${key}.${field}`);\n } catch {\n continue;\n }\n if (!raw) continue;\n try {\n const parsed = JSON.parse(raw);\n ctx.store.$patch((state) => {\n (state as Record<string, unknown>)[field] = parsed;\n });\n } catch {\n // corrupt stored value → ignore, do not crash the store.\n }\n }\n };\n\n const flush = (): void => {\n const state = ctx.store.$state as unknown as Record<string, unknown>;\n for (const field of fieldNames) {\n const cookieKey = `${key}.${field}`;\n const httpOnly = fields[field]?.httpOnly === true;\n const value = state[field];\n\n if (value === undefined || value === null) {\n if (ssr) {\n storage.removeItem(cookieKey, { httpOnly });\n } else if (httpOnly) {\n void _persistRemote(httpEndpoint, cookieKey, null);\n } else {\n storage.removeItem(cookieKey, { httpOnly: false });\n }\n continue;\n }\n\n let serialized: string;\n try {\n serialized = JSON.stringify(value);\n } catch {\n continue;\n }\n\n if (ssr) {\n storage.setItem(cookieKey, serialized, { httpOnly });\n } else if (httpOnly) {\n void _persistRemote(httpEndpoint, cookieKey, serialized);\n } else {\n storage.setItem(cookieKey, serialized, { httpOnly: false });\n }\n }\n };\n\n hydrate();\n\n let timer: ReturnType<typeof setTimeout> | null = null;\n ctx.store.$subscribe(\n () => {\n if (ssr || debounceMs <= 0) {\n flush();\n return;\n }\n if (timer) clearTimeout(timer);\n timer = setTimeout(flush, debounceMs);\n },\n { flush: 'sync' }\n );\n };\n}\n\n/** Fire-and-forget POST to the persist endpoint (client-side httpOnly writes). */\nasync function _persistRemote(\n endpoint: string | undefined,\n key: string,\n value: string | null\n): Promise<void> {\n if (!endpoint) return;\n try {\n await fetch(endpoint, {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({ key, value }),\n credentials: 'include',\n });\n } catch {\n // a failed persist must not break the app\n }\n}\n","/**\n * CBS silent-login shared constants + state-key helpers (direct-fetch variant).\n *\n * Used by the webtrade iframe receiver (`eaera-webtrade` →\n * `composables/useSilentLoginReceiver.ts`) when running embedded inside the\n * super-app parent. The iframe persists the `stateKey` returned by\n * `authStore.cbsStart()` here and reads it back when the parent posts the\n * `eaera:silent-login:callback` message.\n */\n\n/** localStorage key holding the CBS `stateKey`. */\nexport const CBS_STATE_KEY_STORAGE = 'cms_sdk_cbs_state_key';\n\n/** postMessage `type` discriminators for the silent-login handshake. */\nexport const SILENT_LOGIN_MESSAGE = {\n /** parent → iframe: kick off the handshake. */\n START: 'eaera:silent-login:start',\n /** iframe → parent: CBS `authorizeUrl` ready for the parent to fetch. */\n AUTHORIZE_READY: 'eaera:silent-login:authorize-ready',\n /** parent → iframe: handshake failed (`code`). */\n ERROR: 'eaera:silent-login:error',\n /** parent → iframe: user logged out of the parent; tear down the session. */\n LOGOUT: 'eaera:logout',\n} as const;\n\n/** Read the persisted CBS `stateKey` (empty string when absent / non-browser). */\nexport function readCbsStateKey(): string {\n return typeof localStorage !== 'undefined'\n ? (localStorage.getItem(CBS_STATE_KEY_STORAGE) ?? '')\n : '';\n}\n\n/** Clear the persisted CBS `stateKey` (call after `/cbs/callback` settles). */\nexport function clearCbsStateKey(): void {\n if (typeof localStorage !== 'undefined') localStorage.removeItem(CBS_STATE_KEY_STORAGE);\n}\n","import type { ContentFilterScalarOperator } from '../../common/constants/content.constant';\n\n/**\n * A single filter condition: `field:op:value`.\n *\n * `field` is the JSONB leaf (or built-in column) addressed with its **storage\n * casing** and, for JSONB leaves, the `data.` prefix — e.g. `'data.symbol'`,\n * `'data.category'`, `'data.user_id'`. The builder does not auto-prefix\n * `data.` so non-JSONB columns (e.g. `'created_at'`) can also be addressed.\n */\nexport interface ContentFilterCondition {\n field: string;\n op: ContentFilterScalarOperator;\n /**\n * A `string` or `number`; numbers are stringified, never quoted.\n *\n * For the `in` operator an array of values may be supplied instead — it is\n * serialized comma-separated (`v1,v2,v3`), with each item quoted\n * individually when it contains whitespace. Arrays are only valid with\n * `in` and must not be empty.\n */\n value: string | number | readonly (string | number)[];\n}\n\n/**\n * Serialize one condition's value: numbers → their string form (never quoted);\n * strings containing whitespace are wrapped in double quotes (per the filter\n * DSL contract — bare whitespace would break the tokenizer). Other characters\n * are emitted verbatim; callers MUST supply clean values (no embedded `\"`).\n */\nconst formatValue = (value: string | number): string => {\n const s = typeof value === 'number' ? String(value) : value;\n return /\\s/.test(s) ? `\"${s}\"` : s;\n};\n\nconst formatScalarOrList = (condition: ContentFilterCondition): string => {\n const { op, value } = condition;\n // Scalar fast-path first — `Array.isArray` cannot narrow a `readonly T[]`\n // out of the union, so check the scalar types instead.\n if (typeof value === 'string' || typeof value === 'number') return formatValue(value);\n if (op !== 'in') {\n throw new Error(\n `buildFilter: array value is only valid with the 'in' operator (got '${op}' on '${condition.field}')`\n );\n }\n if (value.length === 0) {\n throw new Error(`buildFilter: 'in' condition on '${condition.field}' has an empty value list`);\n }\n return value.map(formatValue).join(',');\n};\n\n/**\n * Build an eaera-cms filter DSL string from conditions joined by ` AND `.\n *\n * @example\n * buildFilter([{ field: 'data.symbol', op: 'eq', value: 'EURUSD' }])\n * // → 'data.symbol:eq:EURUSD'\n * @example\n * buildFilter([{ field: 'data.category', op: 'eq', value: 'CFDs on Stocks' }])\n * // → 'data.category:eq:\"CFDs on Stocks\"' (whitespace → quoted)\n * @example\n * buildFilter([\n * { field: 'data.symbol', op: 'contains', value: 'BTC' },\n * { field: 'data.category', op: 'neq', value: 'Kalshi' },\n * ])\n * // → 'data.symbol:contains:BTC AND data.category:neq:Kalshi'\n * @example\n * buildFilter([{ field: 'data.symbol', op: 'in', value: ['EURUSD', 'XAUUSD'] }])\n * // → 'data.symbol:in:EURUSD,XAUUSD'\n *\n * @returns the DSL string, or `undefined` for an empty list (so callers can\n * assign the result directly to a `filter?: string` param and omit it).\n */\nexport const buildFilter = (conditions: readonly ContentFilterCondition[]): string | undefined => {\n if (conditions.length === 0) return undefined;\n return conditions.map((c) => `${c.field}:${c.op}:${formatScalarOrList(c)}`).join(' AND ');\n};\n"],"names":["opts","v","_store","_seq","_mustFind","_notFound","_noSdk"],"mappings":";;;;;;;;;;;AAaO,MAAM,eAAA,GAAkB;AAIxB,MAAM,YAAA,GAAe;AAAA,EAC1B,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,GAAA,EAAK;AACP;AAIO,MAAM,kBAAA,GAAqB;AAAA,EAChC,MAAA,EAAQ,QAAA;AAAA,EACR,QAAA,EAAU,UAAA;AAAA,EACV,MAAA,EAAQ;AACV;AAIO,MAAM,cAAA,GAAiB;AAAA,EAC5B,GAAA,EAAK,CAAA;AAAA,EACL,IAAA,EAAM,CAAA;AAAA,EACN,SAAA,EAAW,CAAA;AAAA,EACX,UAAA,EAAY,CAAA;AAAA,EACZ,QAAA,EAAU,CAAA;AAAA,EACV,SAAA,EAAW,CAAA;AAAA,EACX,cAAA,EAAgB,CAAA;AAAA,EAChB,eAAA,EAAiB;AACnB;AAIO,MAAM,mBAAA,GAAsB;AAAA,EACjC,aAAA,EAAe,CAAA;AAAA,EACf,iBAAA,EAAmB,CAAA;AAAA,EACnB,mBAAA,EAAqB,CAAA;AAAA,EACrB,mBAAA,EAAqB,CAAA;AAAA,EACrB,IAAA,EAAM,CAAA;AAAA,EACN,OAAA,EAAS,CAAA;AAAA,EACT,eAAA,EAAiB,CAAA;AAAA,EACjB,cAAA,EAAgB;AAClB;AAIO,MAAM,0BAAA,GAA6B;AAAA,EACxC,IAAA,EAAM,CAAA;AAAA,EACN,MAAA,EAAQ;AACV;AAKO,MAAM,eAAA,GAAkB;AAAA,EAC7B,OAAA,EAAS,CAAA;AAAA,EACT,MAAA,EAAQ,CAAA;AAAA,EACR,QAAA,EAAU,CAAA;AAAA,EACV,OAAA,EAAS,CAAA;AAAA,EACT,MAAA,EAAQ,CAAA;AAAA,EACR,QAAA,EAAU,CAAA;AAAA,EACV,OAAA,EAAS,CAAA;AAAA,EACT,WAAA,EAAa,CAAA;AAAA,EACb,cAAA,EAAgB,CAAA;AAAA,EAChB,cAAA,EAAgB;AAClB;AAYO,MAAM,oBAAA,GAAuB;AAAA,EAClC,OAAA,EAAS,SAAA;AAAA,EACT,MAAA,EAAQ,QAAA;AAAA,EACR,QAAA,EAAU,UAAA;AAAA,EACV,OAAA,EAAS,SAAA;AAAA,EACT,MAAA,EAAQ,QAAA;AAAA,EACR,QAAA,EAAU,UAAA;AAAA,EACV,OAAA,EAAS,SAAA;AAAA,EACT,WAAA,EAAa,aAAA;AAAA,EACb,cAAA,EAAgB,gBAAA;AAAA,EAChB,cAAA,EAAgB;AAClB;AAiBO,MAAM,cAAA,GAAiB;AAAA,EAC5B,MAAA,EAAQ,QAAA;AAAA,EACR,KAAA,EAAO,OAAA;AAAA,EACP,IAAA,EAAM,MAAA;AAAA,EACN,UAAA,EAAY;AACd;AAQO,MAAM,kBAAA,GAAqB;AAAA,EAChC,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,SAAA,EAAW,WAAA;AAAA,EACX,aAAA,EAAe;AACjB;AASO,MAAM,cAAA,GAAiB;AAAA,EAC5B,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM;AACR;AAIO,MAAM,iBAAA,GAAoB;AAI1B,MAAM,cAAA,GAAiB;AAAA,EAC5B,EAAA,EAAI,IAAA;AAAA,EACJ,GAAA,EAAK,KAAA;AAAA,EACL,KAAA,EAAO,OAAA;AAAA,EACP,MAAA,EAAQ;AACV;AAIO,MAAM,cAAA,GAAiB;AAAA,EAC5B,IAAA,EAAM,MAAA;AAAA,EACN,SAAA,EAAW,WAAA;AAAA,EACX,UAAA,EAAY,YAAA;AAAA,EACZ,UAAA,EAAY,YAAA;AAAA,EACZ,QAAA,EAAU;AACZ;AAIO,MAAM,iBAAA,GAAoB;AAAA,EAC/B,MAAA,EAAQ,QAAA;AAAA,EACR,aAAA,EAAe,eAAA;AAAA,EACf,OAAA,EAAS,SAAA;AAAA,EACT,gBAAA,EAAkB;AACpB;AAIO,MAAM,kBAAA,GAAqB;AAAA,EAChC,MAAA,EAAQ,QAAA;AAAA,EACR,QAAA,EAAU,UAAA;AAAA,EACV,OAAA,EAAS,SAAA;AAAA,EACT,OAAA,EAAS;AACX;AAIO,MAAM,oBAAA,GAAuB;AAAA,EAClC,IAAA,EAAM,MAAA;AAAA,EACN,GAAA,EAAK,KAAA;AAAA,EACL,SAAA,EAAW;AACb;AAIO,MAAM,gBAAA,GAAmB;AAAA,EAC9B,OAAA,EAAS,SAAA;AAAA,EACT,SAAA,EAAW,WAAA;AAAA,EACX,MAAA,EAAQ,QAAA;AAAA,EACR,QAAA,EAAU,UAAA;AAAA,EACV,QAAA,EAAU,UAAA;AAAA,EACV,OAAA,EAAS;AACX;AAIO,MAAM,cAAA,GAAiB;AAAA,EAC5B,IAAA,EAAM,MAAA;AAAA,EACN,OAAA,EAAS,SAAA;AAAA,EACT,WAAA,EAAa,aAAA;AAAA,EACb,MAAA,EAAQ,QAAA;AAAA,EACR,MAAA,EAAQ,QAAA;AAAA,EACR,SAAA,EAAW;AACb;AAQO,MAAM,oBAAA,GAAuB;AAAA,EAClC,MAAA,EAAQ,QAAA;AAAA,EACR,QAAA,EAAU,UAAA;AAAA,EACV,KAAA,EAAO;AACT;AAOO,MAAM,uBAAA,GAA0B;AAAA,EACrC,IAAA,EAAM,MAAA;AAAA,EACN,MAAA,EAAQ,QAAA;AAAA,EACR,SAAA,EAAW,WAAA;AAAA;AAAA,EAEX,OAAA,EAAS;AACX;AAQO,MAAM,oBAAA,GAAuB;AAAA,EAClC,MAAA,EAAQ,QAAA;AAAA,EACR,MAAA,EAAQ,QAAA;AAAA,EACR,SAAA,EAAW,WAAA;AAAA;AAAA,EAEX,OAAA,EAAS,SAAA;AAAA,EACT,QAAA,EAAU;AACZ;AAIO,MAAM,wBAAA,GAA2B;AAAA,EACtC,GAAA,EAAK,KAAA;AAAA,EACL,EAAA,EAAI,IAAA;AAAA,EACJ,MAAA,EAAQ;AACV;;ACzQO,SAAS,gBAAmB,KAAA,EAAa;AAC9C,EAAA,IAAI,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,EAAG;AACxB,IAAA,OAAO,MAAM,GAAA,CAAI,CAAC,CAAA,KAAM,eAAA,CAAgB,CAAC,CAAC,CAAA;AAAA,EAC5C;AACA,EAAA,IAAI,aAAA,CAAc,KAAK,CAAA,EAAG;AACxB,IAAA,MAAM,MAA+B,EAAC;AACtC,IAAA,KAAA,MAAW,CAAC,CAAA,EAAG,CAAC,KAAK,MAAA,CAAO,OAAA,CAAQ,KAAgC,CAAA,EAAG;AACrE,MAAA,GAAA,CAAI,OAAA,CAAQ,CAAC,CAAC,CAAA,GAAI,gBAAgB,CAAC,CAAA;AAAA,IACrC;AACA,IAAA,OAAO,GAAA;AAAA,EACT;AACA,EAAA,OAAO,KAAA;AACT;AAEA,SAAS,cAAc,CAAA,EAAqB;AAC1C,EAAA,IAAI,CAAA,KAAM,IAAA,IAAQ,OAAO,CAAA,KAAM,UAAU,OAAO,KAAA;AAChD,EAAA,MAAM,KAAA,GAAQ,MAAA,CAAO,cAAA,CAAe,CAAC,CAAA;AACrC,EAAA,OAAO,KAAA,KAAU,IAAA,IAAQ,KAAA,KAAU,MAAA,CAAO,SAAA;AAC5C;AAGO,SAAS,QAAQ,GAAA,EAAqB;AAE3C,EAAA,OAAO,GAAA,CACJ,QAAQ,oBAAA,EAAsB,OAAO,EACrC,OAAA,CAAQ,uBAAA,EAAyB,OAAO,CAAA,CACxC,WAAA,EAAY;AACjB;;AC/BO,MAAM,iBAAiB,KAAA,CAAM;AAAA,EACzB,UAAA;AAAA,EACA,IAAA;AAAA,EACA,WAAA;AAAA,EACA,SAAA;AAAA,EACA,OAAA;AAAA,EAET,YAAY,KAAA,EAQT;AACD,IAAA,KAAA,CAAM,KAAA,CAAM,OAAA,EAAS,KAAA,CAAM,KAAA,KAAU,MAAA,GAAY,EAAE,KAAA,EAAO,KAAA,CAAM,KAAA,EAAM,GAAI,MAAS,CAAA;AACnF,IAAA,IAAA,CAAK,IAAA,GAAO,UAAA;AACZ,IAAA,IAAA,CAAK,UAAA,GAAa,MAAM,UAAA,IAAc,CAAA;AACtC,IAAA,IAAA,CAAK,IAAA,GAAO,MAAM,IAAA,IAAQ,SAAA;AAC1B,IAAA,IAAA,CAAK,cAAc,KAAA,CAAM,WAAA;AACzB,IAAA,IAAA,CAAK,YAAY,KAAA,CAAM,SAAA;AACvB,IAAA,IAAA,CAAK,UAAU,KAAA,CAAM,OAAA;AAAA,EACvB;AAAA,EAEA,IAAI,cAAA,GAA0B;AAC5B,IAAA,OAAO,KAAK,UAAA,KAAe,GAAA;AAAA,EAC7B;AAAA,EACA,IAAI,WAAA,GAAuB;AACzB,IAAA,OAAO,KAAK,UAAA,KAAe,GAAA;AAAA,EAC7B;AAAA,EACA,IAAI,UAAA,GAAsB;AACxB,IAAA,OAAO,KAAK,UAAA,KAAe,GAAA;AAAA,EAC7B;AAAA,EACA,IAAI,YAAA,GAAwB;AAC1B,IAAA,OAAO,KAAK,UAAA,KAAe,GAAA;AAAA,EAC7B;AAAA,EACA,IAAI,SAAA,GAAqB;AACvB,IAAA,OAAO,IAAA,CAAK,IAAA,KAAS,SAAA,IAAa,IAAA,CAAK,UAAA,KAAe,CAAA;AAAA,EACxD;AACF;;ACqCO,SAAS,UAAU,IAAA,EAAiC;AACzD,EAAA,MAAM;AAAA,IACJ,OAAA;AAAA,IACA,YAAA;AAAA,IACA,QAAA;AAAA,IACA,MAAA;AAAA,IACA,UAAU,aAAA,CAAc,UAAA;AAAA,IACxB,QAAQ,aAAA,CAAc,KAAA;AAAA,IACtB,OAAA;AAAA,IACA,cAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,cAAA;AAAA,IACA,aAAA;AAAA,IACA,qBAAqB;AAAC,GACxB,GAAI,IAAA;AAEJ,EAAA,MAAM,OAAA,GAAU,CAAC,CAAA,KAA2D;AAC1E,IAAA,IAAI,CAAC,GAAG,OAAO,MAAA;AACf,IAAA,OAAO,OAAO,CAAA,KAAM,UAAA,GAAc,CAAA,MAAO,MAAA,GAAa,CAAA;AAAA,EACxD,CAAA;AAEA,EAAA,OAAO,OAAO,MAAA,CAAO;AAAA,IACnB,OAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA;AAAA;AAAA,IAGA,gBAAA,EAAkB,UAAU,CAAC,GAAA,EAAK,GAAG,uBAAuB,CAAA,GAAI,CAAC,GAAG,uBAAuB,CAAA;AAAA,IAC3F,MAAM,SAAA,CAAU,EAAE,OAAA,EAAQ,EAAiB;AACzC,MAAA,MAAM,OAAA,GAAU,IAAI,OAAA,CAAQ,OAAA,CAAQ,OAAkC,CAAA;AAEtE,MAAA,MAAM,IAAA,GAAO,aAAa,SAAA,EAAU;AACpC,MAAA,IAAI,IAAA,EAAM,OAAA,CAAQ,GAAA,CAAI,YAAA,CAAa,YAAY,IAAI,CAAA;AAEnD,MAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,MAAA,EAAQ,QAAQ,CAAA;AACzC,MAAA,IAAI,QAAA,EAAU,OAAA,CAAQ,GAAA,CAAI,WAAA,CAAY,WAAW,QAAQ,CAAA;AACzD,MAAA,MAAM,QAAA,GAAW,OAAA,CAAQ,MAAA,EAAQ,QAAQ,CAAA;AACzC,MAAA,IAAI,QAAA,EAAU,OAAA,CAAQ,GAAA,CAAI,WAAA,CAAY,WAAW,QAAQ,CAAA;AACzD,MAAA,IAAI,QAAA,EAAU,OAAA,CAAQ,GAAA,CAAI,WAAA,CAAY,WAAW,QAAQ,CAAA;AAIzD,MAAA,IAAI,cAAA,KAAmB,sBAAsB,KAAA,EAAO;AAClD,QAAA,OAAA,CAAQ,GAAA,CAAI,WAAA,CAAY,eAAA,EAAiB,qBAAA,CAAsB,KAAK,CAAA;AAAA,MACtE;AAIA,MAAA,IAAI,aAAA,KAAkB,sBAAsB,KAAA,EAAO;AACjD,QAAA,OAAA,CAAQ,GAAA,CAAI,WAAA,CAAY,cAAA,EAAgB,qBAAA,CAAsB,KAAK,CAAA;AACnE,QAAA,IAAI,OAAA,CAAQ,IAAA,IAAQ,OAAO,OAAA,CAAQ,SAAS,QAAA,EAAU;AACpD,UAAA,OAAA,CAAQ,IAAA,GAAO,eAAA,CAAgB,OAAA,CAAQ,IAAI,CAAA;AAAA,QAC7C;AAAA,MACF;AAEA,MAAA,OAAA,CAAQ,OAAA,GAAU,OAAA;AAGlB,MAAA,KAAA,MAAW,MAAM,kBAAA,EAAoB;AACnC,QAAA,EAAA,CAAG,OAAA,EAAyB,EAAE,YAAA,EAAc,CAAA;AAAA,MAC9C;AAAA,IACF,CAAA;AAAA,IACA,MAAM,WAAW,OAAA,EAAuB;AAEtC,MAAA,MAAM,WAAW,OAAA,CAAQ,QAAA;AACzB,MAAA,IAAI,CAAC,QAAA,EAAU;AACf,MAAA,MAAM,WAAW,QAAA,CAAS,OAAA,CAAQ,IAAI,YAAA,CAAa,UAAA,CAAW,aAAa,CAAA;AAC3E,MAAA,IAAI,QAAA,EAAU;AACZ,QAAA,MAAM,OAAA,GAAU,QAAA,CAAS,UAAA,CAAW,CAAA,EAAG,YAAA,CAAa,MAAM,CAAA,CAAE,CAAA,GACxD,QAAA,CAAS,KAAA,CAAM,YAAA,CAAa,MAAA,CAAO,MAAM,CAAA,GACzC,QAAA;AACJ,QAAA,IAAI,OAAA,EAAS;AAEX,UAAA,MAAM,QAAQ,OAAO,CAAA;AAAA,QACvB,CAAA,MAAO;AACL,UAAA,YAAA,CAAa,IAAI,OAAO,CAAA;AAAA,QAC1B;AAAA,MACF;AAAA,IACF,CAAA;AAAA,IACA,MAAM,gBAAgB,OAAA,EAAuB;AAC3C,MAAA,IAAI,CAAC,QAAQ,QAAA,EAAU;AACvB,MAAA,MAAM,GAAA,GAAM,eAAA,CAAgB,OAAA,CAAQ,QAAkC,CAAA;AACtE,MAAA,MAAMA,QAAO,OAAA,CAAQ,OAAA;AAKrB,MAAA,IAAI,IAAI,cAAA,EAAgB;AAGtB,QAAA,IAAI,OAAA,IAAW,CAACA,KAAAA,CAAK,cAAA,EAAgB;AACnC,UAAAA,MAAK,cAAA,GAAiB,IAAA;AACtB,UAAA,IAAI;AACF,YAAA,MAAM,QAAA,GAAW,MAAM,OAAA,EAAQ;AAC/B,YAAA,IAAI,QAAA,EAAU;AACZ,cAAA,IAAI,OAAA,EAAS,MAAM,OAAA,CAAQ,QAAQ,CAAA;AAAA,mBAC9B,YAAA,CAAa,IAAI,QAAQ,CAAA;AAS9B,cAAAA,MAAK,KAAA,GAAQ,CAAA;AACb,cAAA;AAAA,YACF;AAAA,UACF,CAAA,CAAA,MAAQ;AAAA,UAER;AAAA,QACF;AAGA,QAAA,IAAI,CAACA,MAAK,cAAA,EAAgB;AACxB,UAAAA,MAAK,cAAA,GAAiB,IAAA;AACtB,UAAAA,MAAK,KAAA,GAAQ,CAAA;AACb,UAAA,IAAI,OAAA,EAAS,MAAM,OAAA,CAAQ,IAAI,CAAA;AAAA,4BACb,KAAA,EAAM;AACxB,UAAA,cAAA,GAAiB,GAAG,CAAA;AACpB,UAAA,OAAA,GAAU,GAAG,CAAA;AAAA,QACf;AACA,QAAA;AAAA,MACF;AAEA,MAAA,OAAA,GAAU,GAAG,CAAA;AAAA,IACf;AAAA,GACD,CAAA;AACH;AAEA,SAAS,gBAAgB,QAAA,EAA4C;AACnE,EAAA,MAAM,aAAa,QAAA,CAAS,MAAA;AAC5B,EAAA,MAAM,UAAU,QAAA,CAAS,OAAA;AAIzB,EAAA,MAAM,UAAA,GAAa,CAAC,IAAA,KAAqC;AACvD,IAAA,IAAI,CAAC,SAAS,OAAO,MAAA;AACrB,IAAA,IAAI,OAAQ,OAAA,CAAoB,GAAA,KAAQ,UAAA,EAAY;AAClD,MAAA,MAAMC,EAAAA,GAAK,OAAA,CAAoB,GAAA,CAAI,IAAI,CAAA;AACvC,MAAA,OAAO,OAAOA,EAAAA,KAAM,QAAA,IAAYA,EAAAA,CAAE,MAAA,GAAS,IAAIA,EAAAA,GAAI,MAAA;AAAA,IACrD;AACA,IAAA,MAAM,CAAA,GAAK,OAAA,CAAsD,IAAA,CAAK,WAAA,EAAa,CAAA;AACnF,IAAA,OAAO,OAAO,CAAA,KAAM,QAAA,IAAY,CAAA,CAAE,MAAA,GAAS,IAAI,CAAA,GAAI,MAAA;AAAA,EACrD,CAAA;AACA,EAAA,MAAM,SAAA,GAAY,UAAA,CAAW,WAAA,CAAY,UAAU,CAAA;AACnD,EAAA,MAAM,OAAA,GAAU,WAAW,YAAY,CAAA;AAEvC,EAAA,IAAI,IAAA;AACJ,EAAA,IAAA,GAAO,SAAS,KAAA,IAAS,MAAA;AAEzB,EAAA,IAAI,OAAA,GAAU,8BAA8B,UAAU,CAAA,CAAA;AACtD,EAAA,IAAI,IAAA,GAAO,SAAA;AACX,EAAA,IAAI,WAAA;AAEJ,EAAA,IAAI,IAAA,IAAQ,OAAO,IAAA,KAAS,QAAA,EAAU;AACpC,IAAA,MAAM,CAAA,GAAI,IAAA;AACV,IAAA,OAAA,GAAW,CAAA,CAAE,OAAA,IAAuB,CAAA,CAAE,KAAA,IAAoB,OAAA;AAC1D,IAAA,IAAA,GAAQ,EAAE,IAAA,IAAmB,IAAA;AAC7B,IAAA,IAAI,CAAA,CAAE,MAAA,IAAU,OAAO,CAAA,CAAE,WAAW,QAAA,EAAU;AAC5C,MAAA,WAAA,GAAc,CAAA,CAAE,MAAA;AAAA,IAClB;AAAA,EACF;AAEA,EAAA,IAAI,eAAe,CAAA,EAAG;AACpB,IAAA,OAAO,IAAI,QAAA,CAAS;AAAA,MAClB,OAAA,EAAS,eAAA;AAAA,MACT,UAAA,EAAY,CAAA;AAAA,MACZ,IAAA,EAAM,SAAA;AAAA,MACN,SAAA;AAAA,MACA;AAAA,KACD,CAAA;AAAA,EACH;AAEA,EAAA,OAAO,IAAI,SAAS,EAAE,OAAA,EAAS,YAAY,IAAA,EAAM,WAAA,EAAa,SAAA,EAAW,OAAA,EAAS,CAAA;AACpF;;AC1PO,SAAS,UAAa,KAAA,EAAa;AACxC,EAAA,OAAO,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AACzC;;ACEO,MAAM,cAAA,GAA4B;AAAA,EACvC,EAAA,EAAI,IAAA;AAAA,EACJ,KAAA,EAAO,oBAAA;AAAA,EACP,IAAA,EAAM,aAAA;AAAA,EACN,SAAA,EAAW,MAAA;AAAA,EACX,QAAA,EAAU,QAAA;AAAA,EACV,KAAA,EAAO,cAAA;AAAA,EACP,OAAA,EAAS,IAAA;AAAA,EACT,KAAA,EAAO,QAAA;AAAA,EACP,WAAA,EAAa,CAAC,GAAG,CAAA;AAAA,EACjB,KAAA,EAAO,CAAA;AAAA,EACP,QAAA,EAAU;AACZ,CAAA;AAEA,MAAM,aAAA,GAAuC,MAAA;AAEtC,MAAM,YAAA,GAAqC;AAAA,EAChD,IAAA,EAAM,cAAA;AAAA,EACN,QAAA,EAAU;AACZ,CAAA;;ACgHO,SAAS,kBAAkB,IAAA,EAAyC;AACzE,EAAA,MAAM,EAAE,GAAA,EAAK,IAAA,EAAK,GAAI,IAAA;AAItB,EAAA,MAAM,QAAA,GAAW,KAAK,QAAA,IAAY,GAAA;AAElC,EAAA,MAAM,aAAA,GAAgB,IAAA,CAAK,QAAA,GAAW,eAAA,CAAgB,QAAQ,aAAA,CAAc,KAAA;AAC5E,EAAA,MAAM,cAAA,GAAiB,IAAA,CAAK,QAAA,GAAW,eAAA,CAAgB,SAAS,aAAA,CAAc,MAAA;AAC9E,EAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,QAAA,GAAW,eAAA,CAAgB,UAAU,aAAA,CAAc,OAAA;AAChF,EAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,QAAA,GAAW,eAAA,CAAgB,YAAY,aAAA,CAAc,SAAA;AACnF,EAAA,MAAM,mBAAA,GAAsB,IAAA,CAAK,QAAA,GAC7B,eAAA,CAAgB,eAChB,aAAA,CAAc,YAAA;AAClB,EAAA,MAAM,gBAAA,GAAmB,IAAA,CAAK,QAAA,GAAW,eAAA,CAAgB,SAAA,GAAY,IAAA;AACrE,EAAA,MAAM,mBAAA,GAAsB,IAAA,CAAK,QAAA,GAAW,eAAA,CAAgB,YAAA,GAAe,IAAA;AAC3E,EAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,QAAA,GAAW,eAAA,CAAgB,QAAA,GAAW,IAAA;AACnE,EAAA,MAAM,iBAAA,GAAoB,IAAA,CAAK,QAAA,GAAW,eAAA,CAAgB,UAAA,GAAa,IAAA;AAEvE,EAAA,OAAO;AAAA,IACL,MAAM,KAAA,CAAM,OAAA,EAAS,SAAA,EAAW;AAC9B,MAAA,IAAI,IAAA,EAAK,EAAG,OAAO,SAAA,CAAU,YAAY,CAAA;AACzC,MAAA,OAAO,SAA6B,aAAA,EAAe;AAAA,QACjD,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM,OAAA;AAAA,QACN,OAAA,EAAS,IAAI,SAAS;AAAA,OACvB,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,MAAA,GAAS;AACb,MAAA,IAAI,IAAA,EAAK,EAAG,OAAO,EAAE,SAAS,IAAA,EAAK;AAEnC,MAAA,OAAO,QAAA,CAAS,cAAA,EAAgB,EAAE,MAAA,EAAQ,QAAQ,CAAA;AAAA,IACpD,CAAA;AAAA,IAEA,MAAM,KAAA,GAAQ;AACZ,MAAA,IAAI,IAAA,EAAK,EAAG,OAAO,EAAE,OAAO,oBAAA,EAAqB;AACjD,MAAA,OAAO,QAAA,CAAyB,eAAA,EAAiB,EAAE,MAAA,EAAQ,QAAQ,CAAA;AAAA,IACrE,CAAA;AAAA,IAEA,MAAM,KAAA,CAAM,KAAA,GAAqB,EAAC,EAA4B;AAC5D,MAAA,IAAI,MAAK,EAAG;AACV,QAAA,OAAO;AAAA,UACL,KAAA,EAAO;AAAA,YACL,EAAE,EAAA,EAAI,CAAA,EAAG,KAAA,EAAO,oBAAA,EAAsB,MAAM,cAAA,EAAe;AAAA,YAC3D,EAAE,EAAA,EAAI,CAAA,EAAG,KAAA,EAAO,iBAAA,EAAmB,MAAM,WAAA;AAAY,WACvD;AAAA,UACA,KAAA,EAAO,CAAA;AAAA,UACP,IAAA,EAAM,MAAM,IAAA,IAAQ,CAAA;AAAA,UACpB,OAAA,EAAS,MAAM,OAAA,IAAW;AAAA,SAC5B;AAAA,MACF;AAGA,MAAA,MAAM,YAAqC,EAAC;AAC5C,MAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,IAAA,EAAM,SAAA,CAAU,OAAO,KAAA,CAAM,IAAA;AAC/C,MAAA,IAAI,KAAA,CAAM,WAAW,IAAA,EAAM;AACzB,QAAA,SAAA,CAAU,UAAU,KAAA,CAAM,OAAA;AAC1B,QAAA,SAAA,CAAU,WAAW,KAAA,CAAM,OAAA;AAAA,MAC7B;AACA,MAAA,IAAI,MAAM,MAAA,EAAQ;AAChB,QAAA,SAAA,CAAU,SAAS,KAAA,CAAM,MAAA;AACzB,QAAA,SAAA,CAAU,IAAI,KAAA,CAAM,MAAA;AAAA,MACtB;AACA,MAAA,MAAM,GAAA,GAAM,MAAM,GAAA,CAA0C,aAAA,CAAc,KAAA,EAAO;AAAA,QAC/E,OAAO,MAAA,CAAO,IAAA,CAAK,SAAS,CAAA,CAAE,SAAS,SAAA,GAAY;AAAA,OACpD,CAAA;AAED,MAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,GAAG,CAAA,GACzB,MACE,GAAA,CAAkD,KAAA,IACnD,GAAA,CAA8B,IAAA,IAC/B,EAAC;AAGL,MAAA,MAAM,KAAA,GAAQ,GAAA,CAAI,GAAA,CAAI,UAAU,CAAA;AAChC,MAAA,IAAI,MAAM,OAAA,CAAQ,GAAG,CAAA,EAAG,OAAO,EAAE,KAAA,EAAM;AACvC,MAAA,MAAM,GAAA,GAAM,GAAA;AACZ,MAAA,OAAO;AAAA,QACL,KAAA;AAAA,QACA,OAAO,GAAA,CAAI,KAAA;AAAA,QACX,MAAO,GAAA,CAA0B,IAAA;AAAA,QACjC,OAAA,EACG,GAAA,CAAgD,OAAA,IAChD,GAAA,CAA8B;AAAA,OACnC;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,QAAA,GAAW;AACf,MAAA,IAAI,MAAK,EAAG;AACV,QAAA,OAAO;AAAA,UACL,YAAA,EAAc,yCAAA;AAAA,UACd,QAAA,EAAU,gBAAA;AAAA,UACV,cAAA,EAAgB;AAAA,SAClB;AAAA,MACF;AACA,MAAA,OAAO,QAAA,CAA4B,kBAAkB,EAAE,MAAA,EAAQ,QAAQ,IAAA,EAAM,IAAI,CAAA;AAAA,IACnF,CAAA;AAAA,IAEA,MAAM,WAAA,CAAY,IAAA,EAAM,KAAA,EAAO,QAAA,EAAU;AACvC,MAAA,IAAI,IAAA,EAAK,EAAG,OAAO,SAAA,CAAU,YAAY,CAAA;AACzC,MAAA,OAAO,SAA6B,mBAAA,EAAqB;AAAA,QACvD,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM,EAAE,IAAA,EAAM,KAAA,EAAO,QAAA;AAAS,OAC/B,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,QAAA,CAAS,QAAA,EAAU,WAAA,EAAa;AACpC,MAAA,IAAI,MAAK,EAAG;AACV,QAAA,OAAO;AAAA,UACL,gBAAA,EAAkB,qEAAA;AAAA,UAClB,KAAA,EAAO;AAAA,SACT;AAAA,MACF;AACA,MAAA,MAAM,MAAO,MAAM,QAAA;AAAA,QACjB,gBAAA,IAAoB,aAAA,CAAc,QAAA,CAAS,QAAQ,CAAA;AAAA,QACnD,gBAAA;AAAA;AAAA,UAEI,EAAE,KAAA,EAAO,EAAE,QAAA,EAAU,YAAA,EAAc,aAAY;AAAE,YACjD,EAAE,KAAA,EAAO,EAAE,YAAA,EAAc,aAAY;AAAE,OAC7C;AACA,MAAA,OAAO;AAAA,QACL,gBAAA,EAAmB,GAAA,CAAI,gBAAA,IAAoB,GAAA,CAAI,iBAAA;AAAA,QAC/C,OAAO,GAAA,CAAI;AAAA,OACb;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,WAAA,CAAY,QAAA,EAAU,IAAA,EAAM,OAAO,WAAA,EAAa;AACpD,MAAA,IAAI,MAAK,EAAG;AACV,QAAA,OAAO;AAAA,UACL,GAAG,UAAU,YAAY,CAAA;AAAA,UACzB,MAAA,EAAQ,CAAA;AAAA,UACR,SAAA,EAAW,KAAA;AAAA,UACX,QAAA;AAAA,UACA,KAAA,EAAO,cAAA;AAAA,UACP,WAAA,EAAa,cAAA;AAAA,UACb,YAAA,EAAc,kBAAA;AAAA,UACd,SAAA,EAAW;AAAA,SACb;AAAA,MACF;AACA,MAAA,MAAM,MAAO,MAAM,QAAA,CAAS,uBAAuB,aAAA,CAAc,WAAA,CAAY,QAAQ,CAAA,EAAG;AAAA,QACtF,KAAA,EAAO,mBAAA,GACH,EAAE,QAAA,EAAU,IAAA,EAAM,KAAA,EAAO,YAAA,EAAc,WAAA,EAAY,GACnD,EAAE,IAAA,EAAM,KAAA,EAAO,cAAc,WAAA;AAAY,OAC9C,CAAA;AACD,MAAA,MAAM,KAAA,GACH,GAAA,CAAI,KAAA,IACJ,GAAA,CAAI,eACJ,GAAA,CAAI,YAAA;AACP,MAAA,OAAO;AAAA,QACL,IAAA,EAAO,IAAI,IAAA,IAAQ,MAAA;AAAA,QACnB,QAAA,EAAW,IAAI,QAAA,IAAY,MAAA;AAAA,QAC3B,MAAA,EAAS,GAAA,CAAI,MAAA,IAAU,GAAA,CAAI,OAAA;AAAA,QAC3B,SAAA,EAAY,GAAA,CAAI,SAAA,IAAa,GAAA,CAAI,WAAA;AAAA,QACjC,QAAA,EAAW,IAAI,QAAA,IAAY,QAAA;AAAA,QAC3B,OAAO,KAAA,IAAS,MAAA;AAAA,QAChB,WAAA,EAAc,GAAA,CAAI,WAAA,IAAe,GAAA,CAAI,YAAA;AAAA,QACrC,YAAA,EAAe,GAAA,CAAI,YAAA,IAAgB,GAAA,CAAI,aAAA;AAAA,QACvC,SAAA,EAAY,GAAA,CAAI,SAAA,IAAa,GAAA,CAAI;AAAA,OACnC;AAAA,IACF,CAAA;AAAA,IAEA,MAAM,QAAQ,QAAA,EAAU;AACtB,MAAA,IAAI,MAAK,EAAG,OAAO,EAAE,OAAA,EAAS,MAAM,QAAA,EAAS;AAC7C,MAAA,OAAO,QAAA,CAAS,eAAA,IAAmB,aAAA,CAAc,OAAA,CAAQ,QAAQ,CAAA,EAAG;AAAA,QAClE,MAAA,EAAQ,MAAA;AAAA,QACR,GAAI,kBAAkB,EAAE,IAAA,EAAM,EAAE,QAAA,EAAS,KAAM;AAAC,OACjD,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,UAAU,QAAA,EAAU;AACxB,MAAA,IAAI,MAAK,EAAG,OAAO,EAAE,OAAA,EAAS,MAAM,QAAA,EAAS;AAC7C,MAAA,OAAO,QAAA,CAAS,iBAAA,IAAqB,aAAA,CAAc,SAAA,CAAU,QAAQ,CAAA,EAAG;AAAA,QACtE,MAAA,EAAQ,QAAA;AAAA,QACR,GAAI,oBAAoB,EAAE,KAAA,EAAO,EAAE,QAAA,EAAS,KAAM;AAAC,OACpD,CAAA;AAAA,IACH;AAAA,GACF;AACF;AAIA,SAAS,IAAI,SAAA,EAAwD;AACnE,EAAA,OAAO,YAAY,EAAE,CAAC,YAAY,UAAU,GAAG,WAAU,GAAI,MAAA;AAC/D;AAKA,SAAS,WAAW,GAAA,EAAyB;AAC3C,EAAA,MAAM,CAAA,GAAI,GAAA;AACV,EAAA,MAAM,IAAA,GAAO,CAAI,KAAA,EAAe,KAAA,KAC7B,EAAE,KAAK,CAAA,IAAwB,EAAE,KAAK,CAAA;AACzC,EAAA,MAAM,MAAgB,EAAE,EAAA,EAAI,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA,EAAE;AACzC,EAAA,MAAM,IAAA,GAAO,IAAA,CAAa,MAAA,EAAQ,MAAM,CAAA;AACxC,EAAA,IAAI,IAAA,MAAU,IAAA,GAAO,IAAA;AACrB,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAa,OAAA,EAAS,OAAO,CAAA;AAC3C,EAAA,IAAI,KAAA,MAAW,KAAA,GAAQ,KAAA;AACvB,EAAA,MAAM,IAAA,GAAO,IAAA,CAAa,MAAA,EAAQ,MAAM,CAAA;AACxC,EAAA,IAAI,IAAA,MAAU,IAAA,GAAO,IAAA;AACrB,EAAA,MAAM,SAAA,GAAY,IAAA,CAAa,WAAA,EAAa,YAAY,CAAA;AACxD,EAAA,IAAI,SAAA,MAAe,SAAA,GAAY,SAAA;AAC/B,EAAA,MAAM,QAAA,GAAW,IAAA,CAAa,UAAA,EAAY,WAAW,CAAA;AACrD,EAAA,IAAI,QAAA,MAAc,QAAA,GAAW,QAAA;AAC7B,EAAA,MAAM,QAAA,GAAW,IAAA,CAAa,UAAA,EAAY,UAAU,CAAA;AACpD,EAAA,IAAI,QAAA,MAAc,QAAA,GAAW,QAAA;AAC7B,EAAA,MAAM,QAAA,GAAW,IAAA,CAAa,UAAA,EAAY,WAAW,CAAA;AACrD,EAAA,IAAI,QAAA,MAAc,QAAA,GAAW,QAAA;AAC7B,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAa,OAAA,EAAS,OAAO,CAAA;AAC3C,EAAA,IAAI,KAAA,MAAW,KAAA,GAAQ,KAAA;AACvB,EAAA,MAAM,QAAA,GAAW,IAAA,CAAa,UAAA,EAAY,WAAW,CAAA;AACrD,EAAA,IAAI,QAAA,IAAY,IAAA,EAAM,GAAA,CAAI,QAAA,GAAW,QAAA;AACrC,EAAA,OAAO,GAAA;AACT;;AC/VO,MAAM,aAAA,GAAgB;AAAA,EAC3B,IAAA,EAAM;AACR;AAGO,MAAM,aAAA,GAAgB;AAAA,EAC3B,KAAA,EAAO,GAAA;AAAA,EACP,SAAA,EAAW,CAAA;AAAA,EACX,SAAA,EAAW,GAAA;AAAA,EACX,cAAA,EAAgB;AAClB;;ACuDO,MAAM,cAAA,GAAiB;AAAA,EAC5B,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,GAAA,EAAK,KAAA;AAAA,EACL,GAAA,EAAK,KAAA;AAAA,EACL,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,GAAA,EAAK;AACP;AAKA,MAAM,SAAA,GAAyC;AAAA,EAC7C,IAAA,EAAM,IAAA;AAAA,EACN,IAAA,EAAM,IAAA;AAAA,EACN,KAAA,EAAO,KAAA;AAAA,EACP,KAAA,EAAO,KAAA;AAAA,EACP,IAAA,EAAM,IAAA;AAAA,EACN,IAAA,EAAM,IAAA;AAAA,EACN,IAAA,EAAM,IAAA;AAAA,EACN,IAAA,EAAM,IAAA;AAAA,EACN,IAAA,EAAM;AACR,CAAA;AAGO,SAAS,uBAAuB,KAAA,EAA4D;AACjG,EAAA,IAAI,SAAA,CAAU,KAAK,CAAA,EAAG,OAAO,UAAU,KAAK,CAAA;AAC5C,EAAA,OAAO,KAAA;AACT;;AC5FO,MAAM,SAAA,GAAuB;AAAA,EAClC;AAAA,IACE,MAAA,EAAQ,QAAA;AAAA,IACR,UAAU,YAAA,CAAa,EAAA;AAAA,IACvB,KAAA,EAAO,2BAAA;AAAA,IACP,IAAA,EAAM,KAAA;AAAA,IACN,IAAA,EAAM,MAAA;AAAA,IACN,GAAA,EAAK,MAAA;AAAA,IACL,KAAA,EAAO,MAAA;AAAA,IACP,UAAA,EAAY,GAAA;AAAA,IACZ,MAAA,EAAQ,CAAA;AAAA,IACR,MAAA,EAAQ,CAAA;AAAA,IACR,MAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAQ,QAAA;AAAA,IACR,UAAU,YAAA,CAAa,EAAA;AAAA,IACvB,KAAA,EAAO,2BAAA;AAAA,IACP,IAAA,EAAM,MAAA;AAAA,IACN,IAAA,EAAM,MAAA;AAAA,IACN,GAAA,EAAK,MAAA;AAAA,IACL,KAAA,EAAO,IAAA;AAAA,IACP,UAAA,EAAY,GAAA;AAAA,IACZ,MAAA,EAAQ,IAAA;AAAA,IACR,MAAA,EAAQ,IAAA;AAAA,IACR,MAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAQ,QAAA;AAAA,IACR,UAAU,YAAA,CAAa,EAAA;AAAA,IACvB,KAAA,EAAO,2BAAA;AAAA,IACP,IAAA,EAAM,KAAA;AAAA,IACN,IAAA,EAAM,MAAA;AAAA,IACN,GAAA,EAAK,MAAA;AAAA,IACL,KAAA,EAAO,MAAA;AAAA,IACP,UAAA,EAAY,IAAA;AAAA,IACZ,MAAA,EAAQ,CAAA;AAAA,IACR,MAAA,EAAQ,CAAA;AAAA,IACR,MAAA,EAAQ;AAAA,GACV;AAAA,EACA;AAAA,IACE,MAAA,EAAQ,QAAA;AAAA,IACR,UAAU,YAAA,CAAa,EAAA;AAAA,IACvB,KAAA,EAAO,2BAAA;AAAA,IACP,IAAA,EAAM,MAAA;AAAA,IACN,IAAA,EAAM,KAAA;AAAA,IACN,GAAA,EAAK,MAAA;AAAA,IACL,KAAA,EAAO,MAAA;AAAA,IACP,UAAA,EAAY,IAAA;AAAA,IACZ,MAAA,EAAQ,IAAA;AAAA,IACR,MAAA,EAAQ,IAAA;AAAA,IACR,MAAA,EAAQ;AAAA;AAEZ,CAAA;AAiBO,SAAS,SAAS,MAAA,EAAsC;AAC7D,EAAA,MAAM,SAAA,GAAY,sBAAA,CAAuB,MAAA,CAAO,QAAQ,CAAA;AACxD,EAAA,MAAM,IAAA,GAAO,cAAc,YAAA,CAAa,EAAA;AACxC,EAAA,MAAM,QAAQ,SAAA,CAAU,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,aAAa,SAAS,CAAA;AAC9D,EAAA,MAAM,MAAA,GAAS,OAAO,aAAA,KAAkB,MAAA,GAAS,CAAC,GAAG,KAAK,CAAA,CAAE,OAAA,EAAQ,GAAI,KAAA;AACxE,EAAA,MAAM,OAAA,GAAU,OAAO,KAAA,GAAQ,MAAA,CAAO,MAAM,CAAA,EAAG,MAAA,CAAO,KAAK,CAAA,GAAI,MAAA;AAE/D,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,OAAA;AAAA,IACP,QAAQ,MAAA,CAAO,MAAA;AAAA,IACf,QAAA,EAAU,SAAA;AAAA,IACV,QAAA,EAAU,OAAO,QAAA,IAAY,2BAAA;AAAA,IAC7B,MAAA,EAAQ,OAAO,MAAA,IAAU,2BAAA;AAAA,IACzB,gBAAgB,YAAA,CAAa,EAAA;AAAA,IAC7B,OAAO,OAAA,CAAQ,MAAA;AAAA,IACf,YAAY,CAAC;AAAA,GACf;AACF;;ACnEO,SAAS,kBAAkB,IAAA,EAAyC;AACzE,EAAA,MAAM,EAAE,GAAA,EAAK,IAAA,EAAK,GAAI,IAAA;AAEtB,EAAA,OAAO;AAAA,IACL,MAAM,QAAQ,KAAA,EAAyC;AACrD,MAAA,IAAI,MAAK,EAAG;AACV,QAAA,OAAO,QAAA,CAAS;AAAA,UACd,QAAQ,KAAA,CAAM,MAAA;AAAA,UACd,UAAU,KAAA,CAAM,QAAA;AAAA,UAChB,UAAU,KAAA,CAAM,QAAA;AAAA,UAChB,QAAQ,KAAA,CAAM,MAAA;AAAA,UACd,YAAY,KAAA,CAAM,UAAA;AAAA,UAClB,OAAO,KAAA,CAAM,KAAA;AAAA,UACb,eAAe,KAAA,CAAM;AAAA,SACtB,CAAA;AAAA,MACH;AAEA,MAAA,MAAM,QAAA,GAAoC;AAAA,QACxC,QAAQ,KAAA,CAAM,MAAA;AAAA,QACd,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,QAAQ,KAAA,CAAM,MAAA;AAAA,QACd,UAAA,EAAY,MAAM,UAAA,IAAc;AAAA,OAClC;AAEA,MAAA,IAAI,KAAA,CAAM,UAAU,MAAA,EAAW;AAC7B,QAAA,QAAA,CAAS,QAAQ,KAAA,CAAM,KAAA;AAAA,MACzB;AACA,MAAA,IAAI,KAAA,CAAM,kBAAkB,MAAA,EAAW;AACrC,QAAA,QAAA,CAAS,gBAAgB,KAAA,CAAM,aAAA;AAAA,MACjC;AAEA,MAAA,OAAO,IAAkB,aAAA,CAAc,IAAA,EAAM,EAAE,KAAA,EAAO,UAAU,CAAA;AAAA,IAClE;AAAA,GACF;AACF;;ACxDO,MAAM,gBAAA,GAAmB;AAAA,EAC9B,IAAA,EAAM,iBAAA;AAAA,EACN,MAAA,EAAQ,CAAC,IAAA,KAAyB,CAAA,gBAAA,EAAmB,IAAI,CAAA,CAAA;AAAA;AAAA,EAEzD,OAAA,EAAS,CAAC,IAAA,KAAyB,CAAA,gBAAA,EAAmB,IAAI,CAAA,QAAA,CAAA;AAAA;AAAA,EAE1D,QAAQ,CAAC,IAAA,EAAc,eACrB,CAAA,gBAAA,EAAmB,IAAI,YAAY,UAAU,CAAA;AACjD;AAGO,MAAM,gBAAA,GAAmB;AAAA,EAC9B,IAAA,EAAM,CAAA;AAAA,EACN,QAAA,EAAU;AACZ;AAYO,MAAM,YAAA,GAAe;AAAA,EAC1B,UAAA,EAAY,WAAA;AAAA,EACZ,WAAA,EAAa,YAAA;AAAA,EACb,SAAA,EAAW,UAAA;AAAA,EACX,cAAA,EAAgB,cAAA;AAAA,EAChB,iBAAA,EAAmB,kBAAA;AAAA,EACnB,gBAAA,EAAkB,iBAAA;AAAA,EAClB,aAAA,EAAe,cAAA;AAAA,EACf,YAAA,EAAc,aAAA;AAAA,EACd,aAAA,EAAe,cAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQf,UAAA,EAAY,WAAA;AAAA,EACZ,YAAA,EAAc,aAAA;AAAA,EACd,aAAA,EAAe,cAAA;AAAA,EACf,aAAA,EAAe,aAAA;AAAA,EACf,oBAAA,EAAsB,oBAAA;AAAA,EACtB,iBAAA,EAAmB,iBAAA;AAAA,EACnB,gBAAA,EAAkB,gBAAA;AAAA,EAClB,WAAA,EAAa;AACf;AASO,MAAM,qBAAiD,MAAA,CAAO,MAAA;AAAA,EACnE,MAAA,CAAO,OAAO,YAAY;AAC5B;AAaO,MAAM,uBAAA,GAA0B;AAAA,EACrC,EAAA,EAAI,IAAA;AAAA,EACJ,GAAA,EAAK,KAAA;AAAA,EACL,EAAA,EAAI,IAAA;AAAA,EACJ,GAAA,EAAK,KAAA;AAAA,EACL,EAAA,EAAI,IAAA;AAAA,EACJ,GAAA,EAAK,KAAA;AAAA,EACL,EAAA,EAAI,IAAA;AAAA,EACJ,MAAA,EAAQ,QAAA;AAAA,EACR,OAAA,EAAS,SAAA;AAAA,EACT,WAAA,EAAa,aAAA;AAAA,EACb,QAAA,EAAU,UAAA;AAAA,EACV,WAAA,EAAa,aAAA;AAAA,EACb,SAAA,EAAW,WAAA;AAAA,EACX,KAAA,EAAO,OAAA;AAAA,EACP,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,OAAA,EAAS,SAAA;AAAA,EACT,aAAA,EAAe,eAAA;AAAA,EACf,YAAA,EAAc,cAAA;AAAA,EACd,SAAA,EAAW;AACb;AAaO,MAAM,8BAAA,GAAiC;AAAA,EAC5C,EAAA,EAAI,IAAA;AAAA,EACJ,GAAA,EAAK,KAAA;AAAA,EACL,EAAA,EAAI,IAAA;AAAA,EACJ,GAAA,EAAK,KAAA;AAAA,EACL,EAAA,EAAI,IAAA;AAAA,EACJ,GAAA,EAAK,KAAA;AAAA,EACL,EAAA,EAAI,IAAA;AAAA,EACJ,QAAA,EAAU,UAAA;AAAA,EACV,WAAA,EAAa,aAAA;AAAA,EACb,SAAA,EAAW,WAAA;AAAA,EACX,KAAA,EAAO,OAAA;AAAA,EACP,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO;AACT;;ACzGA,MAAM,YAAA,GAA6C;AAAA,EACjD;AAAA,IACE,EAAA,EAAI,CAAA;AAAA,IACJ,IAAA,EAAM,gBAAA;AAAA,IACN,UAAU,YAAA,CAAa,UAAA;AAAA,IACvB,MAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,IAAA,EAAM,YAAA;AAAA,MACN,QAAA,EAAU,sBAAA;AAAA,MACV,KAAA,EAAO,GAAA;AAAA,MACP,iBAAA,EAAmB,kBAAA;AAAA,MACnB,KAAA,EAAO,QAAA;AAAA,MACP,mBAAA,EAAqB,EAAA;AAAA,MACrB,wBAAA,EAA0B,EAAA;AAAA,MAC1B,YAAA,EAAc,CAAC,MAAA,EAAQ,WAAW,CAAA;AAAA,MAClC,SAAS,CAAC,QAAA,EAAU,QAAA,EAAU,QAAA,EAAU,UAAU,QAAQ,CAAA;AAAA,MAC1D,MAAA,EAAQ,EAAE,EAAA,EAAI,IAAA,EAAK;AAAA,MACnB,uBAAA,EAAyB;AAAA;AAC3B,GACF;AAAA,EACA;AAAA,IACE,EAAA,EAAI,CAAA;AAAA,IACJ,IAAA,EAAM,gBAAA;AAAA,IACN,UAAU,YAAA,CAAa,UAAA;AAAA,IACvB,MAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,IAAA,EAAM,YAAA;AAAA,MACN,QAAA,EAAU,sBAAA;AAAA,MACV,KAAA,EAAO,GAAA;AAAA,MACP,iBAAA,EAAmB,kBAAA;AAAA,MACnB,KAAA,EAAO,QAAA;AAAA,MACP,mBAAA,EAAqB,EAAA;AAAA,MACrB,wBAAA,EAA0B,EAAA;AAAA,MAC1B,YAAA,EAAc,CAAC,MAAA,EAAQ,WAAW,CAAA;AAAA,MAClC,OAAA,EAAS,CAAC,QAAA,EAAU,QAAA,EAAU,QAAQ,CAAA;AAAA,MACtC,MAAA,EAAQ,EAAE,EAAA,EAAI,IAAA,EAAK;AAAA,MACnB,uBAAA,EAAyB;AAAA;AAC3B;AAEJ,CAAA;AAEA,MAAM,aAAA,GAA+C;AAAA,EACnD;AAAA,IACE,EAAA,EAAI,GAAA;AAAA,IACJ,IAAA,EAAM,aAAA;AAAA,IACN,UAAU,YAAA,CAAa,WAAA;AAAA,IACvB,MAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,UAAA,EAAY,YAAA;AAAA,MACZ,KAAA,EAAO,OAAA;AAAA,MACP,IAAA,EAAM,eAAA;AAAA,MACN,KAAA,EAAO,gBAAA;AAAA,MACP,KAAA,EAAO,qBAAA;AAAA,MACP,QAAA,EAAU,GAAA;AAAA,MACV,QAAA,EAAU,KAAA;AAAA,MACV,OAAA,EAAS,MAAA;AAAA,MACT,MAAA,EAAQ,OAAA;AAAA,MACR,MAAA,EAAQ,IAAA;AAAA,MACR,UAAA,EAAY,OAAA;AAAA,MACZ,WAAA,EAAa,MAAA;AAAA,MACb,MAAA,EAAQ,MAAA;AAAA,MACR,QAAA,EAAU,MAAA;AAAA,MACV,MAAA,EAAQ,QAAA;AAAA,MACR,MAAA,EAAQ,IAAA;AAAA,MACR,MAAA,EAAQ,CAAA;AAAA,MACR,MAAA,EAAQ,IAAA;AAAA,MACR,IAAA,EAAM,CAAC,KAAK,CAAA;AAAA,MACZ,UAAA,EAAY,IAAA;AAAA,MACZ,mBAAA,EAAqB;AAAA;AACvB,GACF;AAAA,EACA;AAAA,IACE,EAAA,EAAI,GAAA;AAAA,IACJ,IAAA,EAAM,aAAA;AAAA,IACN,UAAU,YAAA,CAAa,WAAA;AAAA,IACvB,MAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,UAAA,EAAY,YAAA;AAAA,MACZ,KAAA,EAAO,OAAA;AAAA,MACP,IAAA,EAAM,aAAA;AAAA,MACN,KAAA,EAAO,kBAAA;AAAA,MACP,KAAA,EAAO,yBAAA;AAAA,MACP,QAAA,EAAU,GAAA;AAAA,MACV,QAAA,EAAU,KAAA;AAAA,MACV,OAAA,EAAS,KAAA;AAAA,MACT,MAAA,EAAQ,KAAA;AAAA,MACR,MAAA,EAAQ,GAAA;AAAA,MACR,UAAA,EAAY,IAAA;AAAA,MACZ,WAAA,EAAa,MAAA;AAAA,MACb,MAAA,EAAQ,GAAA;AAAA,MACR,QAAA,EAAU,GAAA;AAAA,MACV,MAAA,EAAQ,QAAA;AAAA,MACR,MAAA,EAAQ,IAAA;AAAA,MACR,MAAA,EAAQ,CAAA;AAAA,MACR,MAAA,EAAQ,IAAA;AAAA,MACR,MAAM,EAAC;AAAA,MACP,UAAA,EAAY,IAAA;AAAA,MACZ,mBAAA,EAAqB;AAAA;AACvB,GACF;AAAA,EACA;AAAA,IACE,EAAA,EAAI,GAAA;AAAA,IACJ,IAAA,EAAM,aAAA;AAAA,IACN,UAAU,YAAA,CAAa,WAAA;AAAA,IACvB,MAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,UAAA,EAAY,YAAA;AAAA,MACZ,KAAA,EAAO,OAAA;AAAA,MACP,IAAA,EAAM,UAAA;AAAA,MACN,KAAA,EAAO,mBAAA;AAAA,MACP,QAAA,EAAU,GAAA;AAAA,MACV,QAAA,EAAU,KAAA;AAAA,MACV,OAAA,EAAS,GAAA;AAAA,MACT,MAAA,EAAQ,GAAA;AAAA,MACR,MAAA,EAAQ,CAAA;AAAA,MACR,UAAA,EAAY,GAAA;AAAA,MACZ,WAAA,EAAa,CAAA;AAAA,MACb,MAAA,EAAQ,CAAA;AAAA,MACR,QAAA,EAAU,CAAA;AAAA,MACV,MAAA,EAAQ,UAAA;AAAA,MACR,MAAA,EAAQ,KAAA;AAAA,MACR,MAAA,EAAQ,CAAA;AAAA,MACR,MAAA,EAAQ,KAAA;AAAA,MACR,MAAM,EAAC;AAAA,MACP,UAAA,EAAY,OAAA;AAAA,MACZ,mBAAA,EAAqB;AAAA;AACvB;AAEJ,CAAA;AAEA,MAAM,WAAA,GAA2C;AAAA,EAC/C;AAAA,IACE,EAAA,EAAI,GAAA;AAAA,IACJ,IAAA,EAAM,cAAA;AAAA,IACN,UAAU,YAAA,CAAa,SAAA;AAAA,IACvB,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,UAAA,EAAY,YAAA;AAAA,MACZ,KAAA,EAAO,qBAAA;AAAA,MACP,QAAA,EAAU,KAAA;AAAA,MACV,cAAA,EAAgB,CAAA;AAAA,MAChB,UAAA,EAAY,GAAA;AAAA,MACZ,aAAA,EAAe,EAAA;AAAA,MACf,iBAAA,EAAmB,SAAA;AAAA,MACnB,WAAA,EAAa,CAAC,OAAA,EAAS,UAAA,EAAY,SAAS,CAAA;AAAA,MAC5C,WAAA,EAAa,CAAA;AAAA,MACb,cAAA,EAAgB,CAAA;AAAA,MAChB,WAAA,EAAa;AAAA,QACX;AAAA,UACE,KAAA,EAAO;AAAA,YACL;AAAA,cACE,MAAM,mBAAA,CAAoB,OAAA;AAAA,cAC1B,MAAM,0BAAA,CAA2B,IAAA;AAAA,cACjC,KAAA,EAAO,CAAA;AAAA,cACP,QAAA,EAAU;AAAA;AACZ;AACF;AACF;AACF;AACF,GACF;AAAA,EACA;AAAA,IACE,EAAA,EAAI,GAAA;AAAA,IACJ,IAAA,EAAM,gBAAA;AAAA,IACN,UAAU,YAAA,CAAa,SAAA;AAAA,IACvB,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,UAAA,EAAY,YAAA;AAAA,MACZ,KAAA,EAAO,iCAAA;AAAA,MACP,QAAA,EAAU,KAAA;AAAA,MACV,cAAA,EAAgB,CAAA;AAAA,MAChB,UAAA,EAAY,CAAA;AAAA,MACZ,aAAA,EAAe,CAAA;AAAA,MACf,WAAA,EAAa,CAAC,YAAY,CAAA;AAAA,MAC1B,WAAA,EAAa,GAAA;AAAA,MACb,cAAA,EAAgB,GAAA;AAAA,MAChB,WAAA,EAAa;AAAA,QACX;AAAA,UACE,KAAA,EAAO;AAAA,YACL;AAAA,cACE,MAAM,mBAAA,CAAoB,OAAA;AAAA,cAC1B,MAAM,0BAAA,CAA2B,MAAA;AAAA,cACjC,KAAA,EAAO,CAAA;AAAA,cACP,SAAA,EAAW,CAAA;AAAA,cACX,OAAA,EAAS;AAAA;AACX;AACF;AACF;AACF;AACF;AAEJ,CAAA;AAEA,MAAM,kBAAA,GAAqD;AAAA,EACzD;AAAA,IACE,EAAA,EAAI,GAAA;AAAA,IACJ,IAAA,EAAM,aAAA;AAAA,IACN,UAAU,YAAA,CAAa,YAAA;AAAA,IACvB,MAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,WAAA,EAAa,sBAAA;AAAA,MACb,KAAA,EAAO,6BAAA;AAAA,MACP,YAAA,EAAc,UAAA;AAAA,MACd,YAAA,EAAc,KAAA;AAAA,MACd,SAAA,EAAW,aAAA;AAAA,MACX,SAAA,EAAW,sBAAA;AAAA,MACX,QAAQ,uBAAA,CAAwB,IAAA;AAAA,MAChC,iBAAA,EAAmB,IAAA;AAAA,MACnB,kBAAA,EAAoB,CAAA;AAAA,MACpB,eAAA,EAAiB;AAAA;AACnB,GACF;AAAA,EACA;AAAA,IACE,EAAA,EAAI,GAAA;AAAA,IACJ,IAAA,EAAM,gBAAA;AAAA,IACN,UAAU,YAAA,CAAa,YAAA;AAAA,IACvB,MAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,WAAA,EAAa,iBAAA;AAAA,MACb,KAAA,EAAO,oBAAA;AAAA,MACP,YAAA,EAAc,OAAA;AAAA,MACd,YAAA,EAAc,IAAA;AAAA,MACd,SAAA,EAAW,QAAA;AAAA,MACX,SAAA,EAAW,sBAAA;AAAA,MACX,QAAQ,uBAAA,CAAwB,IAAA;AAAA,MAChC,iBAAA,EAAmB,IAAA;AAAA,MACnB,kBAAA,EAAoB,CAAA;AAAA,MACpB,eAAA,EAAiB;AAAA;AACnB;AAEJ,CAAA;AAEA,MAAM,mBAAA,GAAuD;AAAA,EAC3D;AAAA,IACE,EAAA,EAAI,GAAA;AAAA,IACJ,IAAA,EAAM,aAAA;AAAA,IACN,UAAU,YAAA,CAAa,aAAA;AAAA,IACvB,MAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,YAAA,EAAc,wBAAA;AAAA,MACd,WAAA,EAAa,sBAAA;AAAA,MACb,YAAA,EAAc,UAAA;AAAA,MACd,cAAA,EAAgB,QAAA;AAAA,MAChB,KAAA,EAAO,sBAAA;AAAA,MACP,WAAA,EAAa,KAAA;AAAA,MACb,SAAA,EAAW,2BAAA;AAAA,MACX,UAAA,EAAY,YAAA;AAAA,MACZ,OAAA,EAAS,aAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,WAAA,EAAa,EAAA;AAAA,MACb,WAAA,EAAa,EAAA;AAAA,MACb,aAAA,EAAe,EAAA;AAAA,MACf,YAAA,EAAc,EAAA;AAAA,MACd,WAAA,EAAa,CAAA;AAAA,MACb,MAAA,EAAQ,IAAA;AAAA,MACR,kBAAA,EAAoB,GAAA;AAAA,MACpB,eAAA,EAAiB,IAAA;AAAA,MACjB,SAAA,EAAW,sBAAA;AAAA,MACX,QAAQ,oBAAA,CAAqB,MAAA;AAAA,MAC7B,OAAA,EAAS,IAAA;AAAA,MACT,UAAA,EAAY;AAAA;AACd,GACF;AAAA,EACA;AAAA,IACE,EAAA,EAAI,GAAA;AAAA,IACJ,IAAA,EAAM,YAAA;AAAA,IACN,UAAU,YAAA,CAAa,aAAA;AAAA,IACvB,MAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,YAAA,EAAc,wBAAA;AAAA,MACd,WAAA,EAAa,iBAAA;AAAA,MACb,YAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAgB,aAAA;AAAA,MAChB,KAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAa,UAAA;AAAA,MACb,SAAA,EAAW,2BAAA;AAAA,MACX,UAAA,EAAY,YAAA;AAAA,MACZ,OAAA,EAAS,QAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,WAAA,EAAa,EAAA;AAAA,MACb,WAAA,EAAa,EAAA;AAAA,MACb,aAAA,EAAe,EAAA;AAAA,MACf,YAAA,EAAc,EAAA;AAAA,MACd,WAAA,EAAa,CAAA;AAAA,MACb,MAAA,EAAQ,IAAA;AAAA,MACR,kBAAA,EAAoB,GAAA;AAAA,MACpB,eAAA,EAAiB,IAAA;AAAA,MACjB,SAAA,EAAW,sBAAA;AAAA,MACX,QAAQ,oBAAA,CAAqB,MAAA;AAAA,MAC7B,OAAA,EAAS,IAAA;AAAA,MACT,UAAA,EAAY;AAAA;AACd,GACF;AAAA,EACA;AAAA,IACE,EAAA,EAAI,GAAA;AAAA,IACJ,IAAA,EAAM,YAAA;AAAA,IACN,UAAU,YAAA,CAAa,aAAA;AAAA,IACvB,MAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,YAAA,EAAc,wBAAA;AAAA,MACd,WAAA,EAAa,iBAAA;AAAA,MACb,YAAA,EAAc,OAAA;AAAA,MACd,cAAA,EAAgB,aAAA;AAAA,MAChB,KAAA,EAAO,cAAA;AAAA,MACP,WAAA,EAAa,UAAA;AAAA,MACb,SAAA,EAAW,2BAAA;AAAA,MACX,UAAA,EAAY,YAAA;AAAA,MACZ,OAAA,EAAS,QAAA;AAAA,MACT,UAAA,EAAY,QAAA;AAAA,MACZ,WAAA,EAAa,EAAA;AAAA,MACb,WAAA,EAAa,EAAA;AAAA,MACb,aAAA,EAAe,EAAA;AAAA,MACf,YAAA,EAAc,EAAA;AAAA,MACd,WAAA,EAAa,CAAA;AAAA,MACb,MAAA,EAAQ,GAAA;AAAA,MACR,kBAAA,EAAoB,GAAA;AAAA,MACpB,eAAA,EAAiB,GAAA;AAAA,MACjB,SAAA,EAAW,sBAAA;AAAA,MACX,QAAQ,oBAAA,CAAqB,MAAA;AAAA,MAC7B,OAAA,EAAS,IAAA;AAAA,MACT,UAAA,EAAY;AAAA;AACd,GACF;AAAA,EACA;AAAA,IACE,EAAA,EAAI,GAAA;AAAA,IACJ,IAAA,EAAM,YAAA;AAAA,IACN,UAAU,YAAA,CAAa,aAAA;AAAA,IACvB,MAAA,EAAQ,WAAA;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,YAAA,EAAc,wBAAA;AAAA,MACd,WAAA,EAAa,iBAAA;AAAA,MACb,KAAA,EAAO,gBAAA;AAAA,MACP,SAAA,EAAW,2BAAA;AAAA,MACX,UAAA,EAAY,YAAA;AAAA,MACZ,WAAA,EAAa,EAAA;AAAA,MACb,WAAA,EAAa,EAAA;AAAA,MACb,QAAQ,oBAAA,CAAqB,MAAA;AAAA,MAC7B,UAAA,EAAY;AAAA;AACd;AAEJ,CAAA;AAGA,MAAMC,QAAA,GAAwB;AAAA,EAC5B,GAAG,YAAA;AAAA,EACH,GAAG,aAAA;AAAA,EACH,GAAG,WAAA;AAAA,EACH,GAAG,kBAAA;AAAA,EACH,GAAG;AACL,CAAA;AAEA,IAAIC,MAAA,GAAO,GAAA;AAEJ,SAAS,gBAAgB,KAAA,EAK9B;AACA,EAAA,MAAM,IAAA,GAAO,KAAA,CAAM,IAAA,IAAQ,gBAAA,CAAiB,IAAA;AAC5C,EAAA,MAAM,OAAA,GAAU,KAAA,CAAM,OAAA,IAAW,gBAAA,CAAiB,QAAA;AAClD,EAAA,IAAI,IAAA,GAAOD,SAAO,KAAA,EAAM;AACxB,EAAA,IAAI,KAAA,CAAM,IAAA,EAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,KAAa,KAAA,CAAM,IAAI,CAAA;AACnE,EAAA,IAAA,CAAK,KAAK,CAAC,CAAA,EAAG,MAAM,CAAA,CAAE,EAAA,GAAK,EAAE,EAAE,CAAA;AAC/B,EAAA,MAAM,QAAQ,IAAA,CAAK,MAAA;AACnB,EAAA,MAAM,KAAA,GAAA,CAAS,OAAO,CAAA,IAAK,OAAA;AAC3B,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,QAAQ,OAAO,CAAA;AAC/C,EAAA,OAAO,EAAE,KAAA,EAAO,KAAA,EAAO,IAAA,EAAM,OAAA,EAAQ;AACvC;AAEO,SAAS,kBAAkB,IAAA,EAAuC;AACvE,EAAA,OAAOA,SAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AAC3C;AAEO,SAAS,kBAAkB,IAAA,EAAgC;AAChE,EAAAA,QAAA,CAAO,QAAQ,IAAI,CAAA;AACnB,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,iBAAA,CACd,MACA,KAAA,EACyB;AACzB,EAAA,MAAM,OAAOA,QAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AAC/C,EAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAClB,EAAA,IAAI,KAAA,CAAM,IAAA,EAAM,IAAA,CAAK,IAAA,GAAO,EAAE,GAAG,IAAA,CAAK,IAAA,EAAM,GAAG,KAAA,CAAM,IAAA,EAAK;AAC1D,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,EAAW,IAAA,CAAK,OAAO,KAAA,CAAM,IAAA;AAChD,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,kBAAkB,IAAA,EAAuB;AACvD,EAAA,MAAM,MAAMA,QAAA,CAAO,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AACnD,EAAA,IAAI,GAAA,KAAQ,IAAI,OAAO,KAAA;AACvB,EAAAA,QAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AACpB,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,aAAA,GAAwB;AACtC,EAAA,OAAO,EAAEC,MAAA;AACX;;ACvWO,SAAS,qBAAqB,IAAA,EAA+C;AAClF,EAAA,MAAM,EAAE,GAAA,EAAK,IAAA,EAAK,GAAI,IAAA;AAEtB,EAAA,OAAO;AAAA,IACL,MAAM,IAAA,CACJ,KAAA,GAAsB,EAAC,EACuB;AAC9C,MAAA,IAAI,IAAA,EAAK;AACP,QAAA,OAAO,OAAA,CAAQ,eAAA,CAAgB,KAAK,CAAC,CAAA;AACvC,MAAA,OAAO,GAAA,CAAyC,iBAAiB,IAAA,EAAM;AAAA,QACrE,KAAA,EAAO,WAAW,KAAK;AAAA,OACxB,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,OAAoC,IAAA,EAAuC;AAC/E,MAAA,IAAI,MAAK,EAAG,OAAOC,YAAU,iBAAA,CAAkB,IAAI,GAAG,IAAI,CAAA;AAC1D,MAAA,OAAO,GAAA,CAAoB,gBAAA,CAAiB,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,IAC1D,CAAA;AAAA,IAEA,MAAM,OACJ,OAAA,EACyB;AACzB,MAAA,IAAI,MAAK,EAAG;AACV,QAAA,MAAM,IAAA,GAAoB;AAAA,UACxB,IAAI,aAAA,EAAc;AAAA,UAClB,IAAA,EAAM,QAAQ,OAAA,CAAQ,QAAA,CAAS,aAAa,CAAA,CAAA,EAAI,IAAA,CAAK,GAAA,EAAK,CAAA,CAAA;AAAA,UAC1D,UAAU,OAAA,CAAQ,QAAA;AAAA,UAClB,MAAA,EAAQ,QAAQ,MAAA,IAAU,OAAA;AAAA,UAC1B,MAAM,OAAA,CAAQ;AAAA,SAChB;AACA,QAAA,OAAO,SAAA,CAAU,iBAAA,CAAkB,IAAI,CAAC,CAAA;AAAA,MAC1C;AACA,MAAA,OAAO,GAAA,CAAoB,iBAAiB,IAAA,EAAM,EAAE,QAAQ,MAAA,EAAQ,IAAA,EAAM,SAAS,CAAA;AAAA,IACrF,CAAA;AAAA,IAEA,MAAM,MAAA,CACJ,IAAA,EACA,OAAA,EACyB;AACzB,MAAA,IAAI,MAAK,EAAG;AACV,QAAA,OAAOA,WAAA;AAAA,UACL,kBAAkB,IAAA,EAAM;AAAA,YACtB,MAAM,OAAA,CAAQ,IAAA;AAAA,YACd,MAAM,OAAA,CAAQ;AAAA,WACf,CAAA;AAAA,UACD;AAAA,SACF;AAAA,MACF;AACA,MAAA,OAAO,GAAA,CAAoB,gBAAA,CAAiB,MAAA,CAAO,IAAI,CAAA,EAAG,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,OAAA,EAAS,CAAA;AAAA,IAC5F,CAAA;AAAA,IAEA,MAAM,OAAO,IAAA,EAA6B;AACxC,MAAA,IAAI,MAAK,EAAG;AACV,QAAA,iBAAA,CAAkB,IAAI,CAAA;AACtB,QAAA;AAAA,MACF;AACA,MAAA,MAAM,GAAA,CAAI,iBAAiB,MAAA,CAAO,IAAI,GAAG,EAAE,MAAA,EAAQ,UAAU,CAAA;AAAA,IAC/D,CAAA;AAAA,IAEA,MAAM,YAAY,IAAA,EAAwC;AACxD,MAAA,IAAI,IAAA,EAAK,EAAG,OAAO,EAAC;AACpB,MAAA,MAAM,MAAM,MAAM,GAAA,CAA8B,gBAAA,CAAiB,OAAA,CAAQ,IAAI,CAAC,CAAA;AAC9E,MAAA,OAAO,GAAA,CAAI,oBAAoB,EAAC;AAAA,IAClC,CAAA;AAAA,IAEA,MAAM,YAAA,CACJ,IAAA,EACA,UAAA,EACA,OAAA,GAA+B,EAAC,EACP;AACzB,MAAA,IAAI,MAAK,EAAG;AACV,QAAA,OAAO,EAAE,SAAS,IAAA,EAAM,MAAA,EAAQ,EAAC,EAAG,KAAA,EAAO,EAAA,EAAI,UAAA,EAAY,CAAA,EAAE;AAAA,MAC/D;AACA,MAAA,OAAO,GAAA,CAAoB,gBAAA,CAAiB,MAAA,CAAO,IAAA,EAAM,UAAU,CAAA,EAAG;AAAA,QACpE,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH;AAAA,GACF;AACF;AASA,SAAS,WAAW,KAAA,EAA8C;AAChE,EAAA,MAAM,GAAA,GAA+B,EAAE,GAAG,KAAA,EAAM;AAChD,EAAA,IAAI,GAAA,CAAI,WAAW,MAAA,EAAW;AAC5B,IAAA,GAAA,CAAI,UAAU,GAAA,CAAI,MAAA;AAClB,IAAA,OAAO,GAAA,CAAI,MAAA;AAAA,EACb;AACA,EAAA,OAAO,GAAA;AACT;AAEA,SAAS,QAAQ,IAAA,EAKoB;AACnC,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA;AAAA,IAC/B,OAAO,IAAA,CAAK,KAAA;AAAA,IACZ,MAAM,IAAA,CAAK,IAAA;AAAA,IACX,SAAS,IAAA,CAAK;AAAA,GAChB;AACF;AAEA,SAASA,WAAA,CAAU,MAA+B,IAAA,EAA2B;AAC3E,EAAA,IAAI,CAAC,IAAA,EAAM,MAAMC,WAAA,CAAU,CAAA,QAAA,EAAW,IAAI,CAAA,UAAA,CAAY,CAAA;AACtD,EAAA,OAAO,UAAU,IAAI,CAAA;AACvB;AAEA,SAASA,YAAU,OAAA,EAAwB;AACzC,EAAA,MAAM,CAAA,GAAI,IAAI,KAAA,CAAM,OAAO,CAAA;AAC3B,EAAC,EAAsC,UAAA,GAAa,GAAA;AACpD,EAAA,OAAO,CAAA;AACT;;AChLO,MAAM,sBAAA,GAAyB;AAAA,EACpC,IAAA,EAAM,uBAAA;AAAA;AAAA,EAEN,MAAA,EAAQ,CAAC,IAAA,KAAyB,CAAA,2BAAA,EAA8B,IAAI,CAAA;AACtE;AAGO,MAAM,sBAAA,GAAyB;AAAA,EACpC,IAAA,EAAM,CAAA;AAAA,EACN,QAAA,EAAU;AACZ;AAOO,MAAM,qBAAA,GAAwB;AAAA,EACnC,IAAA,EAAM,MAAA;AAAA,EACN,IAAA,EAAM;AACR;;AClBA,MAAM,kBAAA,GAA4C;AAAA,EAChD;AAAA,IACE,EAAA,EAAI,CAAA;AAAA,IACJ,IAAA,EAAM,YAAA;AAAA,IACN,KAAA,EAAO,aAAA;AAAA,IACP,WAAA,EAAa,iCAAA;AAAA,IACb,QAAA,EAAU,MAAA;AAAA,IACV,SAAA,EAAW;AAAA,MACT,MAAA,EAAQ;AAAA,QACN,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA,EAAK;AAAA,QACxC,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA,EAAK;AAAA,QACxC,MAAA,EAAQ,EAAE,IAAA,EAAM,QAAA,EAAU,MAAM,CAAC,QAAA,EAAU,UAAA,EAAY,QAAQ,CAAA;AAAE,OACnE;AAAA,MACA,aAAA,EAAe;AAAA,QACb,MAAA,EAAQ,CAAC,QAAA,EAAU,UAAA,EAAY,QAAQ,CAAA;AAAA,QACvC,aAAa;AAAC,OAChB;AAAA,MACA,SAAS;AAAC,KACZ;AAAA,IACA,UAAA,EAAY,QAAA;AAAA,IACZ,YAAA,EAAc,QAAA;AAAA,IACd,SAAA,EAAW,KAAA;AAAA,IACX,QAAA,EAAU,IAAA;AAAA,IACV,OAAA,EAAS,CAAA;AAAA,IACT,MAAA,EAAQ,WAAA;AAAA,IACR,YAAA,EAAc,CAAA;AAAA,IACd,SAAA,EAAW,sBAAA;AAAA,IACX,SAAA,EAAW;AAAA,GACb;AAAA,EACA;AAAA,IACE,EAAA,EAAI,CAAA;AAAA,IACJ,IAAA,EAAM,cAAA;AAAA,IACN,KAAA,EAAO,cAAA;AAAA,IACP,WAAA,EAAa,kDAAA;AAAA,IACb,QAAA,EAAU,MAAA;AAAA,IACV,SAAA,EAAW;AAAA,MACT,MAAA,EAAQ;AAAA,QACN,IAAA,EAAM,EAAE,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA,EAAK;AAAA,QACvC,YAAA,EAAc,EAAE,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA,EAAK;AAAA,QAC/C,QAAA,EAAU,EAAE,IAAA,EAAM,QAAA,EAAU,UAAU,IAAA,EAAK;AAAA,QAC3C,KAAA,EAAO,EAAE,IAAA,EAAM,QAAA,EAAU,MAAM,CAAC,QAAA,EAAU,SAAA,EAAW,QAAQ,CAAA;AAAE,OACjE;AAAA,MACA,aAAA,EAAe;AAAA,QACb,MAAA,EAAQ,CAAC,QAAA,EAAU,SAAA,EAAW,QAAQ,CAAA;AAAA,QACtC,WAAA,EAAa;AAAA,UACX,EAAE,IAAA,EAAM,QAAA,EAAU,EAAA,EAAI,SAAA,EAAU;AAAA,UAChC,EAAE,IAAA,EAAM,SAAA,EAAW,EAAA,EAAI,QAAA;AAAS;AAClC,OACF;AAAA,MACA,OAAA,EAAS;AAAA,QACP,EAAE,IAAA,EAAM,uBAAA,EAAyB,KAAA,EAAO,2CAAA,EAA4C;AAAA,QACpF,EAAE,IAAA,EAAM,YAAA,EAAc,KAAA,EAAO,gCAAA;AAAiC;AAChE,KACF;AAAA,IACA,UAAA,EAAY,OAAA;AAAA,IACZ,YAAA,EAAc,QAAA;AAAA,IACd,SAAA,EAAW,KAAA;AAAA,IACX,QAAA,EAAU,IAAA;AAAA,IACV,OAAA,EAAS,CAAA;AAAA,IACT,MAAA,EAAQ,cAAA;AAAA,IACR,YAAA,EAAc,EAAA;AAAA,IACd,SAAA,EAAW,sBAAA;AAAA,IACX,SAAA,EAAW;AAAA;AAEf,CAAA;AAGO,SAAS,qBAAqB,KAAA,EAI8C;AACjF,EAAA,IAAI,IAAA,GAAO,kBAAA;AACX,EAAA,IAAI,KAAA,CAAM,QAAA,EAAU,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,CAAC,EAAA,KAAO,EAAA,CAAG,QAAA,KAAa,KAAA,CAAM,QAAQ,CAAA;AAC7E,EAAA,MAAM,IAAA,GAAO,MAAM,IAAA,IAAQ,CAAA;AAC3B,EAAA,MAAM,OAAA,GAAU,MAAM,OAAA,IAAW,GAAA;AACjC,EAAA,MAAM,KAAA,GAAA,CAAS,OAAO,CAAA,IAAK,OAAA;AAC3B,EAAA,MAAM,KAAA,GAAQ,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,QAAQ,OAAO,CAAA;AAC/C,EAAA,OAAO,EAAE,KAAA,EAAO,KAAA,CAAM,GAAA,CAAI,SAAS,GAAG,KAAA,EAAO,IAAA,CAAK,MAAA,EAAQ,IAAA,EAAM,OAAA,EAAQ;AAC1E;AAGO,SAAS,uBAAuB,IAAA,EAA+C;AACpF,EAAA,MAAM,MAAM,kBAAA,CAAmB,IAAA,CAAK,CAAC,EAAA,KAAO,EAAA,CAAG,SAAS,IAAI,CAAA;AAC5D,EAAA,OAAO,GAAA,GAAM,SAAA,CAAU,GAAG,CAAA,GAAI,MAAA;AAChC;;ACpDO,SAAS,0BAA0B,IAAA,EAAyD;AACjG,EAAA,MAAM,EAAE,GAAA,EAAK,IAAA,EAAK,GAAI,IAAA;AAGtB,EAAA,MAAM,SAAA,GAAY,CAAC,KAAA,GAA8B,EAAC,KAAuC;AACvF,IAAA,MAAM,IAAqC,EAAC;AAC5C,IAAA,IAAI,KAAA,CAAM,QAAA,EAAU,CAAA,CAAE,QAAA,GAAW,KAAA,CAAM,QAAA;AACvC,IAAA,CAAA,CAAE,IAAA,GAAO,KAAA,CAAM,IAAA,IAAQ,sBAAA,CAAuB,IAAA;AAC9C,IAAA,CAAA,CAAE,QAAA,GAAW,KAAA,CAAM,OAAA,IAAW,sBAAA,CAAuB,QAAA;AACrD,IAAA,OAAO,CAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,IAAA,GAAO,OAAO,KAAA,GAA8B,EAAC,KAAwC;AACzF,IAAA,IAAI,IAAA,EAAK,EAAG,OAAO,oBAAA,CAAqB,KAAK,CAAA;AAC7C,IAAA,OAAO,GAAA,CAA6B,uBAAuB,IAAA,EAAM;AAAA,MAC/D,KAAA,EAAO,UAAU,KAAK;AAAA,KACvB,CAAA;AAAA,EACH,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IAEA,MAAM,QAAA,CAAS,KAAA,GAAQ,EAAC,EAAqC;AAC3D,MAAA,OAAO,KAAK,EAAE,GAAG,KAAA,EAAO,QAAA,EAAU,QAAQ,CAAA;AAAA,IAC5C,CAAA;AAAA,IAEA,MAAM,UAAU,IAAA,EAA4C;AAC1D,MAAA,IAAI,MAAK,EAAG;AACV,QAAA,MAAM,GAAA,GAAM,uBAAuB,IAAI,CAAA;AACvC,QAAA,IAAI,CAAC,GAAA,EAAK,MAAMA,WAAA,CAAU,CAAA,aAAA,EAAgB,IAAI,CAAA,UAAA,CAAY,CAAA;AAC1D,QAAA,OAAO,GAAA;AAAA,MACT;AACA,MAAA,OAAO,GAAA,CAAyB,sBAAA,CAAuB,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,IACrE;AAAA,GACF;AACF;AAEA,SAASA,YAAU,OAAA,EAAwB;AACzC,EAAA,MAAM,CAAA,GAAI,IAAI,KAAA,CAAM,OAAO,CAAA;AAC3B,EAAC,EAAsC,UAAA,GAAa,GAAA;AACpD,EAAA,OAAO,CAAA;AACT;;ACjFO,MAAM,mBAAA,GAAsB;AAAA,EACjC,IAAA,EAAM,oBAAA;AAAA,EACN,MAAA,EAAQ,CAAC,IAAA,KAAyB,CAAA,mBAAA,EAAsB,IAAI,CAAA,CAAA;AAAA,EAC5D,SAAA,EAAW,CAAC,EAAA,KAAgC,CAAA,sBAAA,EAAyB,EAAE,CAAA,WAAA;AACzE;AAGO,MAAM,mBAAA,GAAsB;AAAA,EACjC,IAAA,EAAM,CAAA;AAAA,EACN,QAAA,EAAU;AACZ;AAgBO,MAAM,oBAAA,GAAuB;AAAA,EAClC,MAAA,EAAQ,QAAA;AAAA,EACR,YAAA,EAAc,YAAA;AAAA,EACd,YAAA,EAAc;AAChB;AAaO,MAAM,gBAAA,GAAmB;AAAA,EAC9B,OAAA,EAAS,SAAA;AAAA,EACT,OAAA,EAAS,SAAA;AAAA,EACT,SAAA,EAAW,WAAA;AAAA,EACX,MAAA,EAAQ,QAAA;AAAA,EACR,OAAA,EAAS,SAAA;AAAA,EACT,OAAA,EAAS,SAAA;AAAA,EACT,SAAA,EAAW;AACb;AAIO,MAAM,kBAAA,GACX;AAAA,EACE,gBAAA,CAAiB,OAAA;AAAA,EACjB,gBAAA,CAAiB,OAAA;AAAA,EACjB,gBAAA,CAAiB,SAAA;AAAA,EACjB,gBAAA,CAAiB,MAAA;AAAA,EACjB,gBAAA,CAAiB,OAAA;AAAA,EACjB,gBAAA,CAAiB,OAAA;AAAA,EACjB,gBAAA,CAAiB;AACnB;;AC3BK,MAAM,eAAA,GAAkB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAW7B,WAAA,EAAa,aAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASb,kBAAA,EAAoB,oBAAA;AAAA;AAAA,EAEpB,YAAA,EAAc,cAAA;AAAA;AAAA,EAEd,iBAAA,EAAmB,mBAAA;AAAA;AAAA,EAEnB,kBAAA,EAAoB,oBAAA;AAAA;AAAA,EAEpB,YAAA,EAAc,cAAA;AAAA;AAAA,EAEd,eAAA,EAAiB,iBAAA;AAAA;AAAA,EAEjB,cAAA,EAAgB,gBAAA;AAAA;AAAA,EAEhB,mBAAA,EAAqB,qBAAA;AAAA;AAAA,EAErB,QAAA,EAAU,UAAA;AAAA;AAAA,EAEV,QAAA,EAAU,UAAA;AAAA;AAAA,EAEV,OAAA,EAAS,SAAA;AAAA;AAAA,EAET,cAAA,EAAgB,gBAAA;AAAA;AAAA;AAAA,EAIhB,OAAA,EAAS,SAAA;AAAA;AAAA,EAET,QAAA,EAAU,UAAA;AAAA;AAAA;AAAA,EAIV,aAAA,EAAe,eAAA;AAAA;AAAA,EAEf,YAAA,EAAc,cAAA;AAAA;AAAA,EAEd,YAAA,EAAc,cAAA;AAAA;AAAA,EAEd,eAAA,EAAiB,iBAAA;AAAA;AAAA,EAEjB,aAAA,EAAe,eAAA;AAAA;AAAA,EAEf,YAAA,EAAc,cAAA;AAAA;AAAA,EAEd,WAAA,EAAa,aAAA;AAAA;AAAA,EAEb,cAAA,EAAgB,gBAAA;AAAA;AAAA;AAAA,EAIhB,eAAA,EAAiB,iBAAA;AAAA;AAAA,EAEjB,mBAAA,EAAqB,qBAAA;AAAA;AAAA;AAAA,EAIrB,aAAA,EAAe;AACjB;AAMO,MAAM,mBAAA,GAAgD;AAAA,EAC3D,eAAA,CAAgB,WAAA;AAAA,EAChB,eAAA,CAAgB,kBAAA;AAAA,EAChB,eAAA,CAAgB,YAAA;AAAA,EAChB,eAAA,CAAgB,iBAAA;AAAA,EAChB,eAAA,CAAgB,kBAAA;AAAA,EAChB,eAAA,CAAgB,YAAA;AAAA,EAChB,eAAA,CAAgB,eAAA;AAAA,EAChB,eAAA,CAAgB,cAAA;AAAA,EAChB,eAAA,CAAgB,mBAAA;AAAA,EAChB,eAAA,CAAgB,QAAA;AAAA,EAChB,eAAA,CAAgB,QAAA;AAAA,EAChB,eAAA,CAAgB,OAAA;AAAA,EAChB,eAAA,CAAgB;AAClB;AAGO,MAAM,qBAAA,GAAkD;AAAA,EAC7D,eAAA,CAAgB,OAAA;AAAA,EAChB,eAAA,CAAgB;AAClB;AAGO,MAAM,uBAAA,GAAoD;AAAA,EAC/D,eAAA,CAAgB,aAAA;AAAA,EAChB,eAAA,CAAgB,YAAA;AAAA,EAChB,eAAA,CAAgB,YAAA;AAAA,EAChB,eAAA,CAAgB,eAAA;AAAA,EAChB,eAAA,CAAgB,aAAA;AAAA,EAChB,eAAA,CAAgB,YAAA;AAAA,EAChB,eAAA,CAAgB,WAAA;AAAA,EAChB,eAAA,CAAgB;AAClB;AAGO,MAAM,kBAAA,GAA+C;AAAA,EAC1D,eAAA,CAAgB,eAAA;AAAA,EAChB,eAAA,CAAgB;AAClB;AAGO,MAAM,iBAAA,GAA8C;AAAA,EACzD,eAAA,CAAgB,cAAA;AAAA,EAChB,eAAA,CAAgB,WAAA;AAAA,EAChB,eAAA,CAAgB,cAAA;AAAA,EAChB,eAAA,CAAgB,eAAA;AAAA,EAChB,eAAA,CAAgB;AAClB;AAGO,MAAM,eAAA,GAA4C;AAAA,EACvD,GAAG,mBAAA;AAAA,EACH,GAAG,qBAAA;AAAA,EACH,GAAG,uBAAA;AAAA,EACH,GAAG;AACL;;AC/JO,MAAM,eAAA,GAAsC;AAAA,EACjD;AAAA,IACE,IAAA,EAAM,cAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,UAAU,YAAA,CAAa,WAAA;AAAA,IACvB,SAAA,EAAW,WAAA;AAAA,IACX,aAAA,EAAe,4BAAA;AAAA,IACf,MAAA,EAAQ,CAAA;AAAA,IACR,QAAQ,gBAAA,CAAiB,SAAA;AAAA,IACzB,MAAA,EAAQ;AAAA,MACN,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,UAAA,EAAY,CAAA;AAAA,IACZ,UAAA,EAAY,IAAA;AAAA,IACZ,SAAA,EAAW,sBAAA;AAAA,IACX,SAAA,EAAW;AAAA,GACb;AAAA,EACA;AAAA,IACE,IAAA,EAAM,cAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,UAAU,YAAA,CAAa,WAAA;AAAA,IACvB,SAAA,EAAW,WAAA;AAAA,IACX,aAAA,EAAe,yBAAA;AAAA,IACf,MAAA,EAAQ,CAAA;AAAA,IACR,QAAQ,gBAAA,CAAiB,SAAA;AAAA,IACzB,MAAA,EAAQ;AAAA,MACN,MAAA,EAAQ;AAAA,KACV;AAAA,IACA,UAAA,EAAY,CAAA;AAAA,IACZ,UAAA,EAAY,GAAA;AAAA,IACZ,SAAA,EAAW,sBAAA;AAAA,IACX,SAAA,EAAW;AAAA,GACb;AAAA,EACA;AAAA,IACE,IAAA,EAAM,cAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,UAAU,YAAA,CAAa,WAAA;AAAA,IACvB,SAAA,EAAW,sBAAA;AAAA,IACX,eAAe,eAAA,CAAgB,YAAA;AAAA,IAC/B,MAAA,EAAQ,CAAA;AAAA,IACR,QAAQ,gBAAA,CAAiB,SAAA;AAAA,IACzB,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS,IAAA;AAAA,MACT,MAAA,EAAQ;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,UAAA,EAAY,eAAA;AAAA,QACZ,QAAA,EAAU;AAAA,OACZ;AAAA,MACA,OAAA,EAAS;AAAA,KACX;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,UAAA,EAAY,eAAA;AAAA,MACZ,YAAA,EAAc,EAAE,QAAA,EAAU,mBAAA,EAAoB;AAAA,MAC9C,IAAA,EAAM;AAAA,QACJ,KAAA,EAAO,OAAA;AAAA,QACP,UAAA,EAAY,eAAA;AAAA,QACZ,KAAA,EAAO;AAAA;AACT,KACF;AAAA,IACA,OAAA,EAAS,CAAA;AAAA,IACT,UAAA,EAAY,CAAA;AAAA,IACZ,UAAA,EAAY,GAAA;AAAA,IACZ,SAAA,EAAW,sBAAA;AAAA,IACX,SAAA,EAAW;AAAA,GACb;AAAA,EACA;AAAA,IACE,IAAA,EAAM,cAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,UAAU,YAAA,CAAa,WAAA;AAAA,IACvB,SAAA,EAAW,sBAAA;AAAA,IACX,eAAe,eAAA,CAAgB,eAAA;AAAA,IAC/B,MAAA,EAAQ,CAAA;AAAA,IACR,QAAQ,gBAAA,CAAiB,SAAA;AAAA,IACzB,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS,IAAA;AAAA,MACT,MAAA,EAAQ;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,UAAA,EAAY,eAAA;AAAA,QACZ,WAAA,EAAa;AAAA,OACf;AAAA,MACA,OAAA,EAAS;AAAA,KACX;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,UAAA,EAAY,eAAA;AAAA,MACZ,YAAA,EAAc,EAAE,WAAA,EAAa,GAAA,EAAI;AAAA,MACjC,IAAA,EAAM;AAAA,QACJ,KAAA,EAAO,OAAA;AAAA,QACP,UAAA,EAAY,eAAA;AAAA,QACZ,KAAA,EAAO;AAAA;AACT,KACF;AAAA,IACA,UAAA,EAAY,CAAA;AAAA,IACZ,UAAA,EAAY,GAAA;AAAA,IACZ,SAAA,EAAW,sBAAA;AAAA,IACX,SAAA,EAAW;AAAA,GACb;AAAA,EACA;AAAA,IACE,IAAA,EAAM,cAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,UAAU,YAAA,CAAa,WAAA;AAAA,IACvB,SAAA,EAAW,sBAAA;AAAA,IACX,eAAe,eAAA,CAAgB,WAAA;AAAA,IAC/B,MAAA,EAAQ,CAAA;AAAA,IACR,QAAQ,gBAAA,CAAiB,SAAA;AAAA,IACzB,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS,IAAA;AAAA,MACT,MAAA,EAAQ;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,UAAA,EAAY,eAAA;AAAA,QACZ,IAAA,EAAM,CAAC,eAAA,EAAiB,QAAQ,CAAA;AAAA,QAChC,IAAA,EAAM;AAAA,OACR;AAAA,MACA,OAAA,EAAS;AAAA,KACX;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,UAAA,EAAY,eAAA;AAAA,MACZ,YAAA,EAAc,EAAE,IAAA,EAAM,CAAC,iBAAiB,QAAQ,CAAA,EAAG,MAAM,QAAA,EAAS;AAAA,MAClE,IAAA,EAAM;AAAA,QACJ,KAAA,EAAO,OAAA;AAAA,QACP,UAAA,EAAY,eAAA;AAAA,QACZ,KAAA,EAAO;AAAA;AACT,KACF;AAAA,IACA,UAAA,EAAY,CAAA;AAAA,IACZ,UAAA,EAAY,EAAA;AAAA,IACZ,SAAA,EAAW,sBAAA;AAAA,IACX,SAAA,EAAW;AAAA,GACb;AAAA,EACA;AAAA,IACE,IAAA,EAAM,cAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,UAAU,YAAA,CAAa,WAAA;AAAA,IACvB,SAAA,EAAW,sBAAA;AAAA,IACX,eAAe,eAAA,CAAgB,OAAA;AAAA,IAC/B,MAAA,EAAQ,CAAA;AAAA,IACR,QAAQ,gBAAA,CAAiB,SAAA;AAAA,IACzB,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS,IAAA;AAAA,MACT,MAAA,EAAQ;AAAA,QACN,KAAA,EAAO,OAAA;AAAA,QACP,UAAA,EAAY,eAAA;AAAA,QACZ,MAAA,EAAQ,GAAA;AAAA,QACR,MAAA,EAAQ;AAAA,OACV;AAAA,MACA,OAAA,EAAS;AAAA,KACX;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,UAAA,EAAY,eAAA;AAAA,MACZ,YAAA,EAAc,EAAE,MAAA,EAAQ,GAAA,EAAM,QAAQ,cAAA,EAAe;AAAA,MACrD,IAAA,EAAM;AAAA,QACJ,KAAA,EAAO,OAAA;AAAA,QACP,UAAA,EAAY,eAAA;AAAA,QACZ,KAAA,EAAO;AAAA;AACT,KACF;AAAA,IACA,OAAA,EAAS,CAAA;AAAA,IACT,UAAA,EAAY,CAAA;AAAA,IACZ,UAAA,EAAY,GAAA;AAAA,IACZ,SAAA,EAAW,sBAAA;AAAA,IACX,SAAA,EAAW;AAAA,GACb;AAAA,EACA;AAAA,IACE,IAAA,EAAM,cAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,UAAU,YAAA,CAAa,WAAA;AAAA,IACvB,WAAW,oBAAA,CAAqB,YAAA;AAAA,IAChC,eAAe,eAAA,CAAgB,aAAA;AAAA,IAC/B,MAAA,EAAQ,CAAA;AAAA,IACR,QAAQ,gBAAA,CAAiB,MAAA;AAAA,IACzB,MAAA,EAAQ;AAAA,MACN,OAAA,EAAS,KAAA;AAAA,MACT,KAAA,EAAO,8BAAA;AAAA,MACP,OAAA,EAAS;AAAA,KACX;AAAA,IACA,MAAA,EAAQ;AAAA,MACN,cAAc,EAAC;AAAA,MACf,IAAA,EAAM;AAAA,QACJ,KAAA,EAAO,OAAA;AAAA,QACP,UAAA,EAAY,eAAA;AAAA,QACZ,KAAA,EAAO;AAAA;AACT,KACF;AAAA,IACA,UAAA,EAAY,CAAA;AAAA,IACZ,UAAA,EAAY,GAAA;AAAA,IACZ,SAAA,EAAW,sBAAA;AAAA,IACX,SAAA,EAAW;AAAA;AAEf,CAAA;AAGA,MAAMH,QAAA,GAA6B,gBAAgB,GAAA,CAAI,CAAC,OAAO,EAAE,GAAG,GAAE,CAAE,CAAA;AAEjE,SAAS,kBAAkB,MAAA,EAU8C;AAE9E,EAAA,MAAM,cAAA,GAAiB,QAAQ,SAAA,KAAc,MAAA;AAC7C,EAAA,MAAM,IAAA,GAAO,MAAA,EAAQ,IAAA,IAAQ,mBAAA,CAAoB,IAAA;AACjD,EAAA,MAAM,OAAA,GAAU,MAAA,EAAQ,OAAA,IAAW,MAAA,EAAQ,SAAS,mBAAA,CAAoB,QAAA;AACxE,EAAA,MAAM,MAAA,GAAS,MAAA,EAAQ,MAAA,IAAA,CAAW,IAAA,GAAO,CAAA,IAAK,OAAA;AAC9C,EAAA,IAAI,IAAA,GAAOA,QAAA,CAAO,KAAA,EAAM,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAO,CAAA,CAAE,SAAA,GAAY,CAAA,CAAE,SAAA,GAAY,IAAI,EAAG,CAAA;AAC7E,EAAA,IAAI,MAAA,EAAQ,SAAA,EAAW,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,MAAA,CAAO,SAAS,CAAA;AAC9E,EAAA,IAAI,MAAA,EAAQ,WAAA,EAAa,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,WAAA,KAAgB,MAAA,CAAO,WAAW,CAAA;AACvF,EAAA,IAAI,MAAA,EAAQ,SAAA,EAAW,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAA,KAAc,MAAA,CAAO,SAAS,CAAA;AACjF,EAAA,IAAI,MAAA,EAAQ,MAAA,EAAQ,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,MAAA,CAAO,MAAM,CAAA;AACxE,EAAA,MAAM,QAAQ,IAAA,CAAK,MAAA;AACnB,EAAA,MAAM,KAAA,GAAQ,cAAA,GACV,IAAA,CAAK,KAAA,CAAM,QAAQ,MAAA,GAAS,OAAO,CAAA,GACnC,IAAA,CAAK,KAAA,CAAA,CAAO,IAAA,GAAO,CAAA,IAAK,OAAA,EAAS,OAAO,OAAO,CAAA;AACnD,EAAA,OAAO;AAAA,IACL,KAAA;AAAA,IACA,KAAA;AAAA,IACA,IAAA,EAAM,cAAA,GAAiB,IAAA,CAAK,KAAA,CAAM,MAAA,GAAS,IAAA,CAAK,GAAA,CAAI,OAAA,EAAS,CAAC,CAAC,CAAA,GAAI,CAAA,GAAI,IAAA;AAAA,IACvE;AAAA,GACF;AACF;AAEO,SAAS,oBAAoB,IAAA,EAA4C;AAC9E,EAAA,OAAOA,SAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AAC3C;;ACjNO,SAAS,wBAAwB,IAAA,EAAqD;AAC3F,EAAA,MAAM,EAAE,GAAA,EAAK,IAAA,EAAK,GAAI,IAAA;AAEtB,EAAA,OAAO;AAAA,IACL,MAAM,IAAA,CAAK,MAAA,GAAS,EAAC,EAAG;AACtB,MAAA,IAAI,MAAK,EAAG;AACV,QAAA,MAAM,GAAA,GAAM,kBAAkB,MAAM,CAAA;AACpC,QAAA,OAAO;AAAA,UACL,KAAA,EAAO,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,SAAS,CAAA;AAAA,UAC9B,OAAO,GAAA,CAAI,KAAA;AAAA,UACX,MAAM,GAAA,CAAI,IAAA;AAAA,UACV,SAAS,GAAA,CAAI;AAAA,SACf;AAAA,MACF;AACA,MAAA,IAAI,OAAO,SAAA,EAAW;AAEpB,QAAA,MAAM,EAAE,WAAW,GAAA,EAAK,MAAA,GAAS,GAAG,KAAA,GAAQ,EAAA,EAAI,GAAG,IAAA,EAAK,GAAI,MAAA;AAC5D,QAAA,MAAM,OAAO,MAAM,GAAA;AAAA,UACjB,mBAAA,CAAoB,SAAA,CAAU,MAAA,CAAO,SAAS,CAAA;AAAA,UAC9C;AAAA,YACE,KAAA,EAAO,EAAE,MAAA,EAAQ,KAAA,EAAO,GAAG,IAAA;AAAK;AAClC,SACF;AACA,QAAA,MAAM,IAAA,GAAO,KAAK,KAAA,CAAM,MAAA,GAAS,KAAK,GAAA,CAAI,KAAA,EAAO,CAAC,CAAC,CAAA,GAAI,CAAA;AACvD,QAAA,OAAO,EAAE,OAAO,IAAA,EAAM,KAAA,EAAO,KAAK,MAAA,EAAQ,IAAA,EAAM,SAAS,KAAA,EAAM;AAAA,MACjE;AACA,MAAA,MAAM,EAAE,SAAA,EAAW,KAAA,EAAO,MAAA,EAAQ,EAAA,EAAI,KAAA,EAAO,EAAA,EAAI,UAAA,EAAY,EAAA,EAAI,GAAG,KAAA,EAAM,GAAI,MAAA;AAC9E,MAAA,OAAO,GAAA,CAA2B,mBAAA,CAAoB,IAAA,EAAM,EAAE,OAAO,CAAA;AAAA,IACvE,CAAA;AAAA,IAEA,MAAM,OAAO,IAAA,EAAM;AACjB,MAAA,IAAI,MAAK,EAAG,OAAOE,YAAU,mBAAA,CAAoB,IAAI,GAAG,IAAI,CAAA;AAC5D,MAAA,OAAO,GAAA,CAAsB,mBAAA,CAAoB,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,IAC/D;AAAA,GACF;AACF;AAIA,SAASA,WAAA,CAAU,MAAoC,IAAA,EAAgC;AACrF,EAAA,IAAI,CAAC,IAAA,EAAM,MAAMC,WAAA,CAAU,CAAA,UAAA,EAAa,IAAI,CAAA,UAAA,CAAY,CAAA;AACxD,EAAA,OAAO,UAAU,IAAI,CAAA;AACvB;AAEA,SAASA,YAAU,OAAA,EAAwB;AACzC,EAAA,MAAM,CAAA,GAAI,IAAI,KAAA,CAAM,OAAO,CAAA;AAC3B,EAAC,EAAsC,UAAA,GAAa,GAAA;AACpD,EAAA,OAAO,CAAA;AACT;;AC9EW,MAAM,gBAAA,GAAmB;AAAA,EAClC,KAAA,EAAO,WAAA;AAAA,EACP,UAAA,EAAY,gBAAA;AAAA,EACZ,IAAA,EAAM,UAAA;AAAA,EACN,OAAA,EAAS,aAAA;AAAA,EACT,gBAAA,EAAkB,sBAAA;AAAA,EAClB,aAAA,EAAe,mBAAA;AAAA,EACf,gBAAA,EAAkB,sBAAA;AAAA,EAClB,cAAA,EAAgB,oBAAA;AAAA,EAChB,YAAA,EAAc,kBAAA;AAAA,EACd,WAAA,EAAa,iBAAA;AAAA,EACb,eAAA,EAAiB,qBAAA;AAAA,EACjB,KAAA,EAAO,WAAA;AAAA,EACP,OAAA,EAAS;AACX;AAIO,MAAM,sBAAA,GACX,MAAA,CAAO,MAAA,CAAO,gBAAgB;AAQzB,MAAM,YAAA,GAAe;AAAA,EAC1B,cAAA,EAAgB,yBAAA;AAAA,EAChB,YAAA,EAAc,CAAC,IAAA,KAAyB,CAAA,iBAAA,EAAoB,IAAI,CAAA,MAAA,CAAA;AAAA,EAChE,eAAA,EAAiB,yBAAA;AAAA;AAAA,EAEjB,YAAA,EAAc,CAAC,IAAA,KAAyB,CAAA,eAAA,EAAkB,IAAI,CAAA,cAAA,CAAA;AAAA;AAAA,EAE9D,gBAAA,EAAkB,CAAC,IAAA,KAAyB,CAAA,eAAA,EAAkB,IAAI,CAAA,YAAA,CAAA;AAAA,EAClE,UAAA,EAAY,oBAAA;AAAA,EACZ,eAAA,EAAiB,yBAAA;AAAA,EACjB,YAAA,EAAc,sBAAA;AAAA;AAAA,EAEd,QAAQ,gBAAA,CAAiB;AAC3B;AAGO,MAAM,eAAA,GAAkB;AAAA,EAC7B,OAAA,EAAS,SAAA;AAAA,EACT,OAAA,EAAS,SAAA;AAAA,EACT,MAAA,EAAQ,QAAA;AAAA,EACR,YAAA,EAAc,cAAA;AAAA,EACd,aAAA,EAAe,eAAA;AAAA,EACf,iBAAA,EAAmB,mBAAA;AAAA,EACnB,cAAA,EAAgB,gBAAA;AAAA,EAChB,uBAAA,EAAyB,yBAAA;AAAA,EACzB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,eAAA,EAAiB,iBAAA;AAAA,EACjB,eAAA,EAAiB,iBAAA;AAAA,EACjB,aAAA,EAAe,eAAA;AAAA,EACf,eAAA,EAAiB,iBAAA;AAAA,EACjB,UAAA,EAAY,YAAA;AAAA,EACZ,YAAA,EAAc,cAAA;AAAA,EACd,oBAAA,EAAsB,sBAAA;AAAA,EACtB,sBAAA,EAAwB,wBAAA;AAAA,EACxB,iBAAA,EAAmB,mBAAA;AAAA,EACnB,eAAA,EAAiB,iBAAA;AAAA,EACjB,cAAA,EAAgB,gBAAA;AAAA,EAChB,WAAA,EAAa,aAAA;AAAA,EACb,YAAA,EAAc,cAAA;AAAA,EACd,eAAA,EAAiB,iBAAA;AAAA,EACjB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,YAAA,EAAc,cAAA;AAAA,EACd,SAAA,EAAW,WAAA;AAAA,EACX,YAAA,EAAc,cAAA;AAAA,EACd,aAAA,EAAe,eAAA;AAAA,EACf,kBAAA,EAAoB;AACtB;AAQO,MAAM,gBAAA,GAAyE;AAAA,EACpF,CAAC,gBAAA,CAAiB,KAAK,GAAG;AAAA,IACxB,eAAA,CAAgB,OAAA;AAAA,IAChB,eAAA,CAAgB,OAAA;AAAA,IAChB,eAAA,CAAgB,MAAA;AAAA,IAChB,eAAA,CAAgB,YAAA;AAAA,IAChB,eAAA,CAAgB,aAAA;AAAA,IAChB,eAAA,CAAgB,iBAAA;AAAA,IAChB,eAAA,CAAgB,aAAA;AAAA,IAChB,eAAA,CAAgB;AAAA,GAClB;AAAA,EACA,CAAC,gBAAA,CAAiB,UAAU,GAAG,CAAC,gBAAgB,cAAc,CAAA;AAAA,EAC9D,CAAC,iBAAiB,IAAI,GAAG,CAAC,eAAA,CAAgB,WAAA,EAAa,gBAAgB,YAAY,CAAA;AAAA,EACnF,CAAC,gBAAA,CAAiB,OAAO,GAAG;AAAA,IAC1B,eAAA,CAAgB,iBAAA;AAAA,IAChB,eAAA,CAAgB,eAAA;AAAA,IAChB,eAAA,CAAgB;AAAA,GAClB;AAAA,EACA,CAAC,gBAAA,CAAiB,gBAAgB,GAAG;AAAA,IACnC,eAAA,CAAgB,aAAA;AAAA,IAChB,eAAA,CAAgB;AAAA,GAClB;AAAA,EACA,CAAC,iBAAiB,aAAa,GAAG,CAAC,eAAA,CAAgB,UAAA,EAAY,gBAAgB,YAAY,CAAA;AAAA,EAC3F,CAAC,gBAAA,CAAiB,gBAAgB,GAAG;AAAA,IACnC,eAAA,CAAgB,eAAA;AAAA,IAChB,eAAA,CAAgB,eAAA;AAAA,IAChB,eAAA,CAAgB;AAAA,GAClB;AAAA,EACA,CAAC,gBAAA,CAAiB,cAAc,GAAG,CAAC,gBAAgB,sBAAsB,CAAA;AAAA,EAC1E,CAAC,gBAAA,CAAiB,YAAY,GAAG,CAAC,gBAAgB,eAAe,CAAA;AAAA,EACjE,CAAC,gBAAA,CAAiB,WAAW,GAAG;AAAA,IAC9B,eAAA,CAAgB,oBAAA;AAAA,IAChB,eAAA,CAAgB,YAAA;AAAA,IAChB,eAAA,CAAgB,SAAA;AAAA,IAChB,eAAA,CAAgB;AAAA,GAClB;AAAA,EACA,CAAC,gBAAA,CAAiB,eAAe,GAAG,EAAC;AAAA,EACrC,CAAC,gBAAA,CAAiB,KAAK,GAAG,EAAC;AAAA,EAC3B,CAAC,gBAAA,CAAiB,OAAO,GAAG;AAAA,IAC1B,eAAA,CAAgB,uBAAA;AAAA,IAChB,eAAA,CAAgB;AAAA;AAEpB;AAGO,MAAM,gBAAA,GAAmB;AAAA,EAC9B,KAAA,EAAO,OAAA;AAAA,EACP,IAAA,EAAM,KAAA;AAAA,EACN,GAAA,EAAK,IAAA;AAAA,EACL,IAAA,EAAM,KAAA;AAAA,EACN,MAAA,EAAQ;AACV;AAKO,MAAM,cAAA,GAAiB;AAAA,EAC5B,KAAA,EAAO,OAAA;AAAA,EACP,OAAA,EAAS,SAAA;AAAA,EACT,QAAA,EAAU,UAAA;AAAA,EACV,KAAA,EAAO;AACT;AAKO,MAAM,YAAA,GAAe;AAAA,EAC1B,YAAA,EAAc,KAAA;AAAA,EACd,UAAA,EAAY,OAAA;AAAA;AAAA,EAEZ,cAAA,EAAgB,CAAA;AAAA;AAAA,EAEhB,gBAAA,EAAkB,CAAA;AAAA;AAAA,EAElB,WAAA,EAAa,UAAA;AAAA;AAAA,EAEb,SAAA,EAAW,OAAA;AAAA;AAAA,EAEX,KAAA,EAAO,EAAA;AAAA;AAAA,EAEP,iBAAA,EAAmB,EAAA;AAAA;AAAA,EAEnB,eAAA,EAAiB;AACnB;;AC+CO,SAAS,iBAAiB,IAAA,EAAuC;AACtE,EAAA,MAAM,EAAE,KAAI,GAAI,IAAA;AAEhB,EAAA,MAAM,OAAA,GAAU,CACd,IAAA,EACA,MAAA,EACA,MAAA,EACA,OAAA,KAEA,GAAA,CAAoB,YAAA,CAAa,MAAA,CAAO,IAAA,EAAM,MAAM,CAAA,EAAG;AAAA,IACrD,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM;AAAA,MACJ,MAAA,EAAS,UAAU,EAAC;AAAA,MACpB,aAAa,OAAA,EAAS,WAAA;AAAA,MACtB,iBAAiB,OAAA,EAAS;AAAA;AAC5B,GACD,CAAA;AAEH,EAAA,OAAO;AAAA,IACL,MAAM,mBAAA,GAA+C;AACnD,MAAA,MAAM,GAAA,GAAM,MAAM,GAAA,CAAgC,YAAA,CAAa,cAAc,CAAA;AAC7E,MAAA,OAAO,GAAA,CAAI,UAAU,EAAC;AAAA,IACxB,CAAA;AAAA,IAEA,MAAM,gBAAgB,IAAA,EAA8C;AAClE,MAAA,OAAO,GAAA,CAA2B,aAAa,YAAA,CAAa,IAAI,GAAG,EAAE,MAAA,EAAQ,QAAQ,CAAA;AAAA,IACvF,CAAA;AAAA,IAEA,MAAM,WAAA,CAAY,KAAA,GAAkC,EAAC,EAAgC;AACnF,MAAA,OAAO,GAAA,CAAwB,aAAa,eAAA,EAAiB;AAAA,QAC3D,OAAO,KAAA,CAAM,WAAA,GAAc,EAAE,YAAA,EAAc,KAAA,CAAM,aAAY,GAAI;AAAA,OAClE,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,eAAA,CACJ,KAAA,EACA,KAAA,GAAgC,EAAC,EACD;AAChC,MAAA,OAAO,GAAA,CAA2B,YAAA,CAAa,YAAA,CAAa,KAAK,CAAA,EAAG;AAAA,QAClE,OAAO,KAAA,CAAM,SAAA,GAAY,EAAE,SAAA,EAAW,KAAA,CAAM,WAAU,GAAI;AAAA,OAC3D,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,oBAAoB,KAAA,EAAmD;AAC3E,MAAA,OAAO,GAAA,CAA+B,YAAA,CAAa,gBAAA,CAAiB,KAAK,CAAC,CAAA;AAAA,IAC5E,CAAA;AAAA,IAEA,MAAM,YAAA,CAAa,KAAA,GAAuB,EAAC,EAA0B;AACnE,MAAA,OAAO,GAAA,CAAkB,aAAa,UAAA,EAAY;AAAA,QAChD,KAAA,EAAO;AAAA,UACL,KAAA,EAAO,KAAA,CAAM,KAAA,IAAS,YAAA,CAAa,UAAA;AAAA,UACnC,MAAA,EAAQ,KAAA,CAAM,MAAA,IAAU,YAAA,CAAa;AAAA;AACvC,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,iBAAA,CAAkB,KAAA,GAAuB,EAAC,EAA+B;AAC7E,MAAA,OAAO,GAAA,CAAuB,aAAa,eAAA,EAAiB;AAAA,QAC1D,OAAO,EAAE,MAAA,EAAQ,KAAA,CAAM,MAAA,IAAU,aAAa,YAAA;AAAa,OAC5D,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,cAAA,CAAe,KAAA,GAAuB,EAAC,EAA4B;AACvE,MAAA,OAAO,GAAA,CAAoB,aAAa,YAAA,EAAc;AAAA,QACpD,OAAO,EAAE,MAAA,EAAQ,KAAA,CAAM,MAAA,IAAU,aAAa,YAAA;AAAa,OAC5D,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,OAAA,EAAS,CAAC,IAAA,EAAM,MAAA,EAAQ,OAAA,KAAY,QAAQ,IAAA,EAAM,eAAA,CAAgB,OAAA,EAAS,MAAA,EAAQ,OAAO,CAAA;AAAA,IAC1F,OAAA,EAAS,CAAC,IAAA,EAAM,MAAA,EAAQ,OAAA,KAAY,QAAQ,IAAA,EAAM,eAAA,CAAgB,OAAA,EAAS,MAAA,EAAQ,OAAO,CAAA;AAAA,IAC1F,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAA,EAAQ,OAAA,KAAY,QAAQ,IAAA,EAAM,eAAA,CAAgB,MAAA,EAAQ,MAAA,EAAQ,OAAO,CAAA;AAAA,IACxF,YAAA,EAAc,CAAC,IAAA,EAAM,MAAA,EAAQ,OAAA,KAC3B,QAAQ,IAAA,EAAM,eAAA,CAAgB,YAAA,EAAc,MAAA,EAAQ,OAAO,CAAA;AAAA,IAC7D,YAAA,EAAc,CAAC,IAAA,EAAM,MAAA,EAAQ,OAAA,KAC3B,QAAQ,IAAA,EAAM,eAAA,CAAgB,aAAA,EAAe,MAAA,EAAQ,OAAO,CAAA;AAAA,IAC9D,eAAA,EAAiB,CAAC,IAAA,EAAM,MAAA,EAAQ,OAAA,KAC9B,QAAQ,IAAA,EAAM,eAAA,CAAgB,iBAAA,EAAmB,MAAA,EAAQ,OAAO,CAAA;AAAA,IAElE,aAAA,EAAe,CAAC,IAAA,EAAM,MAAA,EAAQ,OAAA,KAC5B,QAAQ,IAAA,EAAM,eAAA,CAAgB,cAAA,EAAgB,MAAA,EAAQ,OAAO,CAAA;AAAA,IAC/D,oBAAA,EAAsB,CAAC,IAAA,EAAM,OAAA,KAC3B,QAAQ,IAAA,EAAM,eAAA,CAAgB,uBAAA,EAAyB,MAAA,EAAW,OAAO,CAAA;AAAA,IAC3E,iBAAA,EAAmB,CAAC,IAAA,EAAM,OAAA,KACxB,QAAQ,IAAA,EAAM,eAAA,CAAgB,kBAAA,EAAoB,MAAA,EAAW,OAAO,CAAA;AAAA,IAEtE,cAAA,EAAgB,CAAC,IAAA,EAAM,MAAA,EAAQ,OAAA,KAC7B,QAAQ,IAAA,EAAM,eAAA,CAAgB,eAAA,EAAiB,MAAA,EAAQ,OAAO,CAAA;AAAA,IAChE,cAAA,EAAgB,CAAC,IAAA,EAAM,MAAA,EAAQ,OAAA,KAC7B,QAAQ,IAAA,EAAM,eAAA,CAAgB,eAAA,EAAiB,MAAA,EAAQ,OAAO,CAAA;AAAA,IAChE,YAAA,EAAc,CAAC,IAAA,EAAM,MAAA,EAAQ,OAAA,KAC3B,QAAQ,IAAA,EAAM,eAAA,CAAgB,aAAA,EAAe,MAAA,EAAQ,OAAO,CAAA;AAAA,IAC9D,cAAA,EAAgB,CAAC,IAAA,EAAM,MAAA,EAAQ,OAAA,KAC7B,QAAQ,IAAA,EAAM,eAAA,CAAgB,eAAA,EAAiB,MAAA,EAAQ,OAAO,CAAA;AAAA,IAChE,SAAA,EAAW,CAAC,IAAA,EAAM,MAAA,EAAQ,OAAA,KACxB,QAAQ,IAAA,EAAM,eAAA,CAAgB,UAAA,EAAY,MAAA,EAAQ,OAAO,CAAA;AAAA,IAC3D,WAAA,EAAa,CAAC,IAAA,EAAM,MAAA,EAAQ,OAAA,KAC1B,QAAQ,IAAA,EAAM,eAAA,CAAgB,YAAA,EAAc,MAAA,EAAQ,OAAO,CAAA;AAAA,IAC7D,kBAAA,EAAoB,CAAC,IAAA,EAAM,MAAA,EAAQ,OAAA,KACjC,QAAQ,IAAA,EAAM,eAAA,CAAgB,oBAAA,EAAsB,MAAA,EAAQ,OAAO,CAAA;AAAA,IAErE,oBAAA,EAAsB,CAAC,IAAA,EAAM,MAAA,EAAQ,OAAA,KACnC,QAAQ,IAAA,EAAM,eAAA,CAAgB,sBAAA,EAAwB,MAAA,EAAQ,OAAO,CAAA;AAAA,IAEvE,gBAAA,EAAkB,CAAC,IAAA,EAAM,MAAA,EAAQ,OAAA,KAC/B,QAAQ,IAAA,EAAM,eAAA,CAAgB,iBAAA,EAAmB,MAAA,EAAQ,OAAO,CAAA;AAAA,IAClE,cAAA,EAAgB,CAAC,IAAA,EAAM,MAAA,EAAQ,OAAA,KAC7B,QAAQ,IAAA,EAAM,eAAA,CAAgB,eAAA,EAAiB,MAAA,EAAQ,OAAO,CAAA;AAAA,IAChE,aAAA,EAAe,CAAC,IAAA,EAAM,MAAA,EAAQ,OAAA,KAC5B,QAAQ,IAAA,EAAM,eAAA,CAAgB,cAAA,EAAgB,MAAA,EAAQ,OAAO,CAAA;AAAA,IAE/D,UAAA,EAAY,CAAC,IAAA,EAAM,MAAA,EAAQ,OAAA,KACzB,QAAQ,IAAA,EAAM,eAAA,CAAgB,WAAA,EAAa,MAAA,EAAQ,OAAO,CAAA;AAAA,IAC5D,WAAA,EAAa,CAAC,IAAA,EAAM,MAAA,EAAQ,OAAA,KAC1B,QAAQ,IAAA,EAAM,eAAA,CAAgB,YAAA,EAAc,MAAA,EAAQ,OAAO,CAAA;AAAA,IAE7D,cAAA,EAAgB,CAAC,IAAA,EAAM,MAAA,EAAQ,OAAA,KAC7B,QAAQ,IAAA,EAAM,eAAA,CAAgB,eAAA,EAAiB,MAAA,EAAQ,OAAO,CAAA;AAAA,IAChE,kBAAA,EAAoB,CAAC,IAAA,EAAM,MAAA,EAAQ,OAAA,KACjC,QAAQ,IAAA,EAAM,eAAA,CAAgB,oBAAA,EAAsB,MAAA,EAAQ,OAAO,CAAA;AAAA,IACrE,WAAA,EAAa,CAAC,IAAA,EAAM,MAAA,EAAQ,OAAA,KAC1B,QAAQ,IAAA,EAAM,eAAA,CAAgB,YAAA,EAAc,MAAA,EAAQ,OAAO,CAAA;AAAA,IAC7D,cAAA,EAAgB,CAAC,IAAA,EAAM,MAAA,EAAQ,OAAA,KAC7B,QAAQ,IAAA,EAAM,eAAA,CAAgB,SAAA,EAAW,MAAA,EAAQ,OAAO,CAAA;AAAA,IAC1D,WAAA,EAAa,CAAC,IAAA,EAAM,MAAA,EAAQ,OAAA,KAC1B,QAAQ,IAAA,EAAM,eAAA,CAAgB,YAAA,EAAc,MAAA,EAAQ,OAAO,CAAA;AAAA,IAE7D,YAAA,EAAc,CAAC,IAAA,EAAM,MAAA,EAAQ,OAAA,KAC3B,QAAQ,IAAA,EAAM,eAAA,CAAgB,aAAA,EAAe,MAAA,EAAQ,OAAO,CAAA;AAAA,IAC9D,gBAAA,EAAkB,CAAC,IAAA,EAAM,OAAA,KACvB,QAAQ,IAAA,EAAM,eAAA,CAAgB,kBAAA,EAAoB,MAAA,EAAW,OAAO;AAAA,GACxE;AACF;;AClVO,MAAM,gBAAA,GAAmB;AAAA,EAC9B,KAAA,EAAO,uBAAA;AAAA,EACP,aAAA,EAAe,+BAAA;AAAA,EACf,YAAA,EAAc,8BAAA;AAAA,EACd,SAAA,EAAW,2BAAA;AAAA,EACX,iBAAA,EAAmB,mCAAA;AAAA,EACnB,gBAAA,EAAkB,kCAAA;AAAA,EAClB,MAAA,EAAQ,wBAAA;AAAA,EACR,cAAA,EAAgB,gCAAA;AAAA,EAChB,aAAA,EAAe;AACjB;AAGO,MAAM,gBAAA,GAAmB;AAAA,EAC9B,IAAA,EAAM,CAAA;AAAA,EACN,IAAA,EAAM,EAAA;AAAA,EACN,QAAA,EAAU,CAAA;AAAA,EACV,QAAA,EAAU,GAAA;AAAA,EACV,cAAA,EAAgB;AAClB;AAOO,MAAM,eAAA,GAAkB;AAAA,EAC7B,OAAO,CAAC,SAAA,EAAW,QAAA,EAAU,OAAA,EAAS,UAAU,aAAa,CAAA;AAAA,EAC7D,WAAW,CAAC,aAAA,EAAe,aAAA,EAAe,cAAA,EAAgB,UAAU,aAAa,CAAA;AAAA,EACjF,MAAA,EAAQ,CAAC,UAAA,EAAY,cAAA,EAAgB,eAAe,QAAQ;AAC9D;AAOO,MAAM,sBAAA,GAAyB;AAAA,EACpC,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM;AACR;AAQO,MAAM,oBAAA,GAAuB;AAAA,EAClC,MAAA,EAAQ,QAAA;AAAA,EACR,SAAA,EAAW,WAAA;AAAA,EACX,OAAA,EAAS,SAAA;AAAA,EACT,QAAA,EAAU,UAAA;AAAA,EACV,OAAA,EAAS;AACX;AAIO,MAAM,kBAAA,GAAqB;AAAA,EAChC,EAAA,EAAI,IAAA;AAAA,EACJ,GAAA,EAAK,KAAA;AAAA,EACL,KAAA,EAAO,OAAA;AAAA,EACP,MAAA,EAAQ;AACV;AASO,MAAM,mBAAA,GAAsB;AAAA,EAGjC,OAAA,EAAS,SAmBX,CAAA;AAIO,MAAM,WAAA,GAAc;AAAA,EACzB,KAAA,EAAO,OAAA;AAAA,EACP,SAAA,EAAW,WAAA;AAAA,EACX,MAAA,EAAQ;AACV;;AC1GO,MAAM,cAAA,GAAiB;AAAA,EAC5B,GAAA,EAAK,KAAA;AAAA,EACL,IAAA,EAAM;AACR;;ACqBO,MAAM,UAAA,GAAgC;AAAA,EAC3C;AAAA,IACE,UAAA,EAAY,eAAA;AAAA,IACZ,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAS,IAAA;AAAA,IACT,UAAA,EAAY,IAAA;AAAA,IACZ,KAAA,EAAO,2BAAA;AAAA,IACP,MAAA,EAAQ,QAAA;AAAA,IACR,OAAO,kBAAA,CAAmB,EAAA;AAAA,IAC1B,QAAQ,cAAA,CAAe,GAAA;AAAA,IACvB,MAAA,EAAQ,GAAA;AAAA,IACR,KAAA,EAAO,KAAA;AAAA,IACP,UAAA,EAAY,IAAA;AAAA,IACZ,GAAA,EAAK,CAAA;AAAA,IACL,IAAA,EAAM,CAAA;AAAA,IACN,UAAA,EAAY,CAAA;AAAA,IACZ,OAAA,EAAS;AAAA,GACX;AAAA,EACA;AAAA,IACE,UAAA,EAAY,eAAA;AAAA,IACZ,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAS,IAAA;AAAA,IACT,UAAA,EAAY,IAAA;AAAA,IACZ,KAAA,EAAO,2BAAA;AAAA,IACP,MAAA,EAAQ,QAAA;AAAA,IACR,OAAO,kBAAA,CAAmB,GAAA;AAAA,IAC1B,QAAQ,cAAA,CAAe,IAAA;AAAA,IACvB,MAAA,EAAQ,GAAA;AAAA,IACR,KAAA,EAAO,MAAA;AAAA,IACP,UAAA,EAAY,IAAA;AAAA,IACZ,GAAA,EAAK,CAAA;AAAA,IACL,IAAA,EAAM,IAAA;AAAA,IACN,UAAA,EAAY,EAAA;AAAA,IACZ,OAAA,EAAS;AAAA,GACX;AAAA,EACA;AAAA,IACE,UAAA,EAAY,eAAA;AAAA,IACZ,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAS,IAAA;AAAA,IACT,UAAA,EAAY,IAAA;AAAA,IACZ,KAAA,EAAO,2BAAA;AAAA,IACP,MAAA,EAAQ,QAAA;AAAA,IACR,OAAO,kBAAA,CAAmB,KAAA;AAAA,IAC1B,QAAQ,cAAA,CAAe,GAAA;AAAA,IACvB,MAAA,EAAQ,IAAA;AAAA,IACR,KAAA,EAAO,MAAA;AAAA,IACP,UAAA,EAAY,IAAA;AAAA,IACZ,GAAA,EAAK,CAAA;AAAA,IACL,IAAA,EAAM,CAAA;AAAA,IACN,UAAA,EAAY,KAAA;AAAA,IACZ,OAAA,EAAS;AAAA,GACX;AAAA,EACA;AAAA,IACE,UAAA,EAAY,eAAA;AAAA,IACZ,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAS,IAAA;AAAA,IACT,UAAA,EAAY,IAAA;AAAA,IACZ,KAAA,EAAO,2BAAA;AAAA,IACP,MAAA,EAAQ,QAAA;AAAA,IACR,OAAO,kBAAA,CAAmB,MAAA;AAAA,IAC1B,QAAQ,cAAA,CAAe,IAAA;AAAA,IACvB,MAAA,EAAQ,GAAA;AAAA,IACR,KAAA,EAAO,KAAA;AAAA,IACP,UAAA,EAAY,CAAA;AAAA,IACZ,GAAA,EAAK,CAAA;AAAA,IACL,IAAA,EAAM,CAAA;AAAA,IACN,UAAA,EAAY,CAAA;AAAA,IACZ,OAAA,EAAS;AAAA,GACX;AAAA,EACA;AAAA,IACE,UAAA,EAAY,eAAA;AAAA,IACZ,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAS,IAAA;AAAA,IACT,UAAA,EAAY,IAAA;AAAA,IACZ,KAAA,EAAO,2BAAA;AAAA,IACP,MAAA,EAAQ,QAAA;AAAA,IACR,OAAO,kBAAA,CAAmB,EAAA;AAAA,IAC1B,QAAQ,cAAA,CAAe,IAAA;AAAA,IACvB,MAAA,EAAQ,GAAA;AAAA,IACR,KAAA,EAAO,MAAA;AAAA,IACP,UAAA,EAAY,IAAA;AAAA,IACZ,GAAA,EAAK,CAAA;AAAA,IACL,IAAA,EAAM,CAAA;AAAA,IACN,UAAA,EAAY,CAAA;AAAA,IACZ,OAAA,EAAS;AAAA,GACX;AAAA;AAAA,EAEA;AAAA,IACE,UAAA,EAAY,eAAA;AAAA,IACZ,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAS,IAAA;AAAA,IACT,UAAA,EAAY,IAAA;AAAA,IACZ,KAAA,EAAO,2BAAA;AAAA,IACP,MAAA,EAAQ,QAAA;AAAA,IACR,OAAO,kBAAA,CAAmB,EAAA;AAAA,IAC1B,QAAQ,cAAA,CAAe,GAAA;AAAA,IACvB,MAAA,EAAQ,GAAA;AAAA,IACR,KAAA,EAAO,KAAA;AAAA,IACP,UAAA,EAAY,IAAA;AAAA,IACZ,GAAA,EAAK,CAAA;AAAA,IACL,IAAA,EAAM,CAAA;AAAA,IACN,UAAA,EAAY,CAAA;AAAA,IACZ,OAAA,EAAS;AAAA,GACX;AAAA,EACA;AAAA,IACE,UAAA,EAAY,eAAA;AAAA,IACZ,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAS,IAAA;AAAA,IACT,UAAA,EAAY,IAAA;AAAA,IACZ,KAAA,EAAO,2BAAA;AAAA,IACP,MAAA,EAAQ,QAAA;AAAA,IACR,OAAO,kBAAA,CAAmB,GAAA;AAAA,IAC1B,QAAQ,cAAA,CAAe,IAAA;AAAA,IACvB,MAAA,EAAQ,GAAA;AAAA,IACR,KAAA,EAAO,MAAA;AAAA,IACP,UAAA,EAAY,IAAA;AAAA,IACZ,GAAA,EAAK,CAAA;AAAA,IACL,IAAA,EAAM,CAAA;AAAA,IACN,UAAA,EAAY,CAAA;AAAA,IACZ,OAAA,EAAS;AAAA,GACX;AAAA;AAAA;AAAA,EAGA;AAAA,IACE,UAAA,EAAY,eAAA;AAAA,IACZ,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAS,IAAA;AAAA,IACT,UAAA,EAAY,IAAA;AAAA,IACZ,KAAA,EAAO,2BAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,OAAO,kBAAA,CAAmB,EAAA;AAAA,IAC1B,QAAQ,mBAAA,CAAoB,OAAA;AAAA,IAC5B,MAAA,EAAQ,CAAA;AAAA,IACR,KAAA,EAAO,CAAA;AAAA,IACP,UAAA,EAAY,CAAA;AAAA,IACZ,GAAA,EAAK,CAAA;AAAA,IACL,IAAA,EAAM,CAAA;AAAA,IACN,UAAA,EAAY,GAAA;AAAA,IACZ,OAAA,EAAS;AAAA,GACX;AAAA,EACA;AAAA,IACE,UAAA,EAAY,eAAA;AAAA,IACZ,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAS,IAAA;AAAA,IACT,UAAA,EAAY,IAAA;AAAA,IACZ,KAAA,EAAO,2BAAA;AAAA,IACP,MAAA,EAAQ,EAAA;AAAA,IACR,OAAO,kBAAA,CAAmB,GAAA;AAAA,IAC1B,QAAQ,mBAAA,CAAoB,OAAA;AAAA,IAC5B,MAAA,EAAQ,CAAA;AAAA,IACR,KAAA,EAAO,CAAA;AAAA,IACP,UAAA,EAAY,CAAA;AAAA,IACZ,GAAA,EAAK,CAAA;AAAA,IACL,IAAA,EAAM,CAAA;AAAA,IACN,UAAA,EAAY,IAAA;AAAA,IACZ,OAAA,EAAS;AAAA;AAEb,CAAA;AAEO,MAAM,cAAA,GAAwC;AAAA,EACnD;AAAA,IACE,UAAA,EAAY,eAAA;AAAA,IACZ,KAAA,EAAO,MAAA;AAAA,IACP,UAAA,EAAY,IAAA;AAAA,IACZ,SAAA,EAAW,2BAAA;AAAA,IACX,UAAA,EAAY,2BAAA;AAAA,IACZ,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM,KAAA;AAAA,IACN,MAAA,EAAQ,GAAA;AAAA,IACR,SAAA,EAAW,KAAA;AAAA,IACX,UAAA,EAAY,MAAA;AAAA,IACZ,QAAA,EAAU,IAAA;AAAA,IACV,UAAA,EAAY,IAAA;AAAA,IACZ,UAAA,EAAY,IAAA;AAAA,IACZ,IAAA,EAAM,IAAA;AAAA,IACN,UAAA,EAAY,EAAA;AAAA,IACZ,GAAA,EAAK,CAAA;AAAA,IACL,OAAA,EAAS,KAAA;AAAA,IACT,QAAA,EAAU,KAAA;AAAA,IACV,YAAA,EAAc;AAAA,GAChB;AAAA,EACA;AAAA,IACE,UAAA,EAAY,eAAA;AAAA,IACZ,KAAA,EAAO,MAAA;AAAA,IACP,UAAA,EAAY,IAAA;AAAA,IACZ,SAAA,EAAW,2BAAA;AAAA,IACX,UAAA,EAAY,2BAAA;AAAA,IACZ,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM,KAAA;AAAA,IACN,MAAA,EAAQ,IAAA;AAAA,IACR,SAAA,EAAW,MAAA;AAAA,IACX,UAAA,EAAY,IAAA;AAAA,IACZ,QAAA,EAAU,IAAA;AAAA,IACV,UAAA,EAAY,IAAA;AAAA,IACZ,UAAA,EAAY,EAAA;AAAA,IACZ,IAAA,EAAM,CAAA;AAAA,IACN,UAAA,EAAY,KAAA;AAAA,IACZ,GAAA,EAAK,CAAA;AAAA,IACL,OAAA,EAAS,QAAA;AAAA,IACT,QAAA,EAAU,KAAA;AAAA,IACV,YAAA,EAAc;AAAA,GAChB;AAAA,EACA;AAAA,IACE,UAAA,EAAY,eAAA;AAAA,IACZ,KAAA,EAAO,MAAA;AAAA,IACP,UAAA,EAAY,IAAA;AAAA,IACZ,SAAA,EAAW,2BAAA;AAAA,IACX,UAAA,EAAY,IAAA;AAAA,IACZ,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,MAAA,EAAQ,GAAA;AAAA,IACR,SAAA,EAAW,MAAA;AAAA,IACX,UAAA,EAAY,IAAA;AAAA,IACZ,QAAA,EAAU,GAAA;AAAA,IACV,UAAA,EAAY,GAAA;AAAA,IACZ,UAAA,EAAY,IAAA;AAAA,IACZ,IAAA,EAAM,CAAA;AAAA,IACN,UAAA,EAAY,IAAA;AAAA,IACZ,GAAA,EAAK,CAAA;AAAA,IACL,OAAA,EAAS,EAAA;AAAA,IACT,QAAA,EAAU,KAAA;AAAA,IACV,YAAA,EAAc;AAAA,GAChB;AAAA;AAAA,EAEA;AAAA,IACE,UAAA,EAAY,eAAA;AAAA,IACZ,KAAA,EAAO,MAAA;AAAA,IACP,UAAA,EAAY,IAAA;AAAA,IACZ,SAAA,EAAW,2BAAA;AAAA,IACX,UAAA,EAAY,2BAAA;AAAA,IACZ,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM,KAAA;AAAA,IACN,MAAA,EAAQ,GAAA;AAAA,IACR,SAAA,EAAW,KAAA;AAAA,IACX,UAAA,EAAY,MAAA;AAAA,IACZ,QAAA,EAAU,IAAA;AAAA,IACV,UAAA,EAAY,IAAA;AAAA,IACZ,UAAA,EAAY,IAAA;AAAA,IACZ,IAAA,EAAM,CAAA;AAAA,IACN,UAAA,EAAY,CAAA;AAAA,IACZ,GAAA,EAAK,CAAA;AAAA,IACL,OAAA,EAAS,KAAA;AAAA,IACT,QAAA,EAAU,KAAA;AAAA,IACV,YAAA,EAAc;AAAA;AAElB,CAAA;AAEO,MAAM,WAAA,GAAkC;AAAA,EAC7C;AAAA,IACE,UAAA,EAAY,eAAA;AAAA,IACZ,KAAA,EAAO,MAAA;AAAA,IACP,OAAA,EAAS,IAAA;AAAA,IACT,UAAA,EAAY,2BAAA;AAAA,IACZ,SAAA,EAAW,2BAAA;AAAA,IACX,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM,QAAA;AAAA,IACN,MAAM,cAAA,CAAe,GAAA;AAAA,IACrB,MAAA,EAAQ,GAAA;AAAA,IACR,aAAA,EAAe,KAAA;AAAA,IACf,UAAA,EAAY,IAAA;AAAA,IACZ,SAAA,EAAW,IAAA;AAAA,IACX,QAAA,EAAU,IAAA;AAAA,IACV,UAAA,EAAY,IAAA;AAAA,IACZ,QAAQ,oBAAA,CAAqB,MAAA;AAAA,IAC7B,OAAA,EAAS;AAAA,GACX;AAAA,EACA;AAAA,IACE,UAAA,EAAY,eAAA;AAAA,IACZ,KAAA,EAAO,MAAA;AAAA,IACP,OAAA,EAAS,IAAA;AAAA,IACT,UAAA,EAAY,2BAAA;AAAA,IACZ,SAAA,EAAW,2BAAA;AAAA,IACX,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM,QAAA;AAAA,IACN,MAAM,cAAA,CAAe,GAAA;AAAA,IACrB,MAAA,EAAQ,IAAA;AAAA,IACR,aAAA,EAAe,MAAA;AAAA,IACf,UAAA,EAAY,IAAA;AAAA,IACZ,SAAA,EAAW,IAAA;AAAA,IACX,QAAA,EAAU,IAAA;AAAA,IACV,UAAA,EAAY,IAAA;AAAA,IACZ,QAAQ,oBAAA,CAAqB,MAAA;AAAA,IAC7B,OAAA,EAAS;AAAA,GACX;AAAA,EACA;AAAA,IACE,UAAA,EAAY,eAAA;AAAA,IACZ,KAAA,EAAO,MAAA;AAAA,IACP,OAAA,EAAS,IAAA;AAAA,IACT,UAAA,EAAY,2BAAA;AAAA,IACZ,SAAA,EAAW,2BAAA;AAAA,IACX,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM,MAAA;AAAA,IACN,MAAM,cAAA,CAAe,IAAA;AAAA,IACrB,MAAA,EAAQ,GAAA;AAAA,IACR,aAAA,EAAe,KAAA;AAAA,IACf,UAAA,EAAY,IAAA;AAAA,IACZ,SAAA,EAAW,KAAA;AAAA,IACX,QAAA,EAAU,IAAA;AAAA,IACV,UAAA,EAAY,IAAA;AAAA,IACZ,QAAQ,oBAAA,CAAqB,MAAA;AAAA,IAC7B,OAAA,EAAS;AAAA,GACX;AAAA,EACA;AAAA,IACE,UAAA,EAAY,eAAA;AAAA,IACZ,KAAA,EAAO,MAAA;AAAA,IACP,OAAA,EAAS,IAAA;AAAA,IACT,UAAA,EAAY,2BAAA;AAAA,IACZ,SAAA,EAAW,IAAA;AAAA,IACX,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM,OAAA;AAAA,IACN,MAAM,cAAA,CAAe,IAAA;AAAA,IACrB,MAAA,EAAQ,GAAA;AAAA,IACR,aAAA,EAAe,IAAA;AAAA,IACf,UAAA,EAAY,KAAA;AAAA,IACZ,SAAA,EAAW,IAAA;AAAA,IACX,QAAA,EAAU,IAAA;AAAA,IACV,UAAA,EAAY,IAAA;AAAA,IACZ,QAAQ,oBAAA,CAAqB,OAAA;AAAA,IAC7B,OAAA,EAAS;AAAA,GACX;AAAA,EACA;AAAA,IACE,UAAA,EAAY,eAAA;AAAA,IACZ,KAAA,EAAO,MAAA;AAAA,IACP,OAAA,EAAS,IAAA;AAAA,IACT,UAAA,EAAY,2BAAA;AAAA,IACZ,SAAA,EAAW,2BAAA;AAAA,IACX,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM,OAAA;AAAA,IACN,MAAM,cAAA,CAAe,GAAA;AAAA,IACrB,MAAA,EAAQ,IAAA;AAAA,IACR,aAAA,EAAe,IAAA;AAAA,IACf,UAAA,EAAY,IAAA;AAAA,IACZ,SAAA,EAAW,IAAA;AAAA,IACX,QAAA,EAAU,IAAA;AAAA,IACV,UAAA,EAAY,IAAA;AAAA,IACZ,QAAQ,oBAAA,CAAqB,SAAA;AAAA,IAC7B,OAAA,EAAS;AAAA,GACX;AAAA,EACA;AAAA,IACE,UAAA,EAAY,eAAA;AAAA,IACZ,KAAA,EAAO,MAAA;AAAA,IACP,OAAA,EAAS,IAAA;AAAA,IACT,UAAA,EAAY,2BAAA;AAAA,IACZ,SAAA,EAAW,2BAAA;AAAA,IACX,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM,OAAA;AAAA,IACN,MAAM,cAAA,CAAe,IAAA;AAAA,IACrB,MAAA,EAAQ,GAAA;AAAA,IACR,aAAA,EAAe,IAAA;AAAA,IACf,UAAA,EAAY,IAAA;AAAA,IACZ,SAAA,EAAW,IAAA;AAAA,IACX,QAAA,EAAU,IAAA;AAAA,IACV,UAAA,EAAY,IAAA;AAAA,IACZ,QAAQ,oBAAA,CAAqB,OAAA;AAAA,IAC7B,OAAA,EAAS;AAAA,GACX;AAAA,EACA;AAAA,IACE,UAAA,EAAY,eAAA;AAAA,IACZ,KAAA,EAAO,MAAA;AAAA,IACP,OAAA,EAAS,IAAA;AAAA,IACT,UAAA,EAAY,2BAAA;AAAA,IACZ,SAAA,EAAW,2BAAA;AAAA,IACX,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM,QAAA;AAAA,IACN,MAAM,cAAA,CAAe,GAAA;AAAA,IACrB,MAAA,EAAQ,IAAA;AAAA,IACR,aAAA,EAAe,IAAA;AAAA,IACf,UAAA,EAAY,IAAA;AAAA,IACZ,SAAA,EAAW,IAAA;AAAA,IACX,QAAA,EAAU,IAAA;AAAA,IACV,UAAA,EAAY,IAAA;AAAA,IACZ,QAAQ,oBAAA,CAAqB,QAAA;AAAA,IAC7B,OAAA,EAAS;AAAA,GACX;AAAA;AAAA,EAEA;AAAA,IACE,UAAA,EAAY,eAAA;AAAA,IACZ,KAAA,EAAO,MAAA;AAAA,IACP,OAAA,EAAS,IAAA;AAAA,IACT,UAAA,EAAY,2BAAA;AAAA,IACZ,SAAA,EAAW,2BAAA;AAAA,IACX,MAAA,EAAQ,QAAA;AAAA,IACR,IAAA,EAAM,QAAA;AAAA,IACN,MAAM,cAAA,CAAe,GAAA;AAAA,IACrB,MAAA,EAAQ,GAAA;AAAA,IACR,aAAA,EAAe,KAAA;AAAA,IACf,UAAA,EAAY,IAAA;AAAA,IACZ,SAAA,EAAW,IAAA;AAAA,IACX,QAAA,EAAU,IAAA;AAAA,IACV,UAAA,EAAY,IAAA;AAAA,IACZ,QAAQ,oBAAA,CAAqB,MAAA;AAAA,IAC7B,OAAA,EAAS;AAAA;AAEb,CAAA;AAMA,MAAM,WAAA,GAAc,CAAC,CAAA,MAAuE;AAAA,EAC1F,UAAU,CAAA,CAAE,QAAA;AAAA,EACZ,QAAQ,CAAA,CAAE,MAAA;AAAA,EACV,QAAQ,CAAA,CAAE,MAAA;AAAA,EACV,OAAO,CAAA,CAAE,KAAA;AAAA,EACT,QAAQ,CAAA,CAAE,MAAA;AAAA,EACV,aAAA,EAAe,CAAA,CAAE,aAAA,IAAiB,gBAAA,CAAiB,cAAA;AAAA,EACnD,IAAA,EAAM,CAAA,CAAE,IAAA,IAAQ,gBAAA,CAAiB,IAAA;AAAA,EACjC,IAAA,EAAM,CAAA,CAAE,IAAA,IAAQ,gBAAA,CAAiB;AACnC,CAAA,CAAA;AAEA,MAAM,QAAA,GAAW,CAAC,KAAA,EAAe,QAAA,EAAkB,MAAA,KAA4B;AAE7E,EAAA,OAAO,KAAA,IAAS,YAAY,KAAA,GAAQ,MAAA;AACtC,CAAA;AAEA,MAAM,eAAA,GAAkB,CACtB,IAAA,EACA,MAAA,KACS,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,MAAA,KAAW,MAAM,CAAA,GAAI,CAAC,GAAG,IAAI,CAAA;AAEtE,MAAM,iBAAiB,CACrB,IAAA,EACA,KAAA,KACS,KAAA,IAAS,OAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,KAAA,KAAU,KAAK,CAAA,GAAI,CAAC,GAAG,IAAI,CAAA;AAE3E,MAAM,eAAA,GAAkB,CACtB,IAAA,EACA,MAAA,KACS,SAAS,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,EAAE,MAAA,KAAW,MAAM,CAAA,GAAI,CAAC,GAAG,IAAI,CAAA;AAEtE,MAAM,SAAA,GAAY,CAAI,IAAA,EAAW,MAAA,EAA4B,SAAA,KAAkC;AAC7F,EAAA,IAAI,CAAC,QAAQ,OAAO,IAAA;AACpB,EAAA,MAAM,GAAA,GAAM,CAAC,GAAG,IAAI,EAAE,IAAA,CAAK,CAAC,GAAG,CAAA,KAAM;AACnC,IAAA,MAAM,EAAA,GAAM,EAA8B,MAAM,CAAA;AAChD,IAAA,MAAM,EAAA,GAAM,EAA8B,MAAM,CAAA;AAChD,IAAA,IAAI,EAAA,KAAO,IAAI,OAAO,CAAA;AACtB,IAAA,IAAI,EAAA,KAAO,MAAA,IAAa,EAAA,KAAO,IAAA,EAAM,OAAO,CAAA;AAC5C,IAAA,IAAI,EAAA,KAAO,MAAA,IAAa,EAAA,KAAO,IAAA,EAAM,OAAO,EAAA;AAC5C,IAAA,OAAO,EAAA,GAAK,KAAK,EAAA,GAAK,CAAA;AAAA,EACxB,CAAC,CAAA;AACD,EAAA,OAAO,SAAA,KAAc,cAAA,CAAe,GAAA,GAAM,GAAA,GAAM,IAAI,OAAA,EAAQ;AAC9D,CAAA;AAEA,MAAM,SAAA,GAAY,CAAI,IAAA,EAAW,IAAA,EAAc,IAAA,KAAyC;AACtF,EAAA,MAAM,QAAQ,IAAA,CAAK,MAAA;AACnB,EAAA,MAAM,UAAA,GAAa,KAAK,GAAA,CAAI,CAAA,EAAG,KAAK,IAAA,CAAK,KAAA,GAAQ,IAAI,CAAC,CAAA;AACtD,EAAA,MAAM,QAAA,GAAW,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,CAAA,EAAG,IAAI,GAAG,UAAU,CAAA;AACvD,EAAA,MAAM,KAAA,GAAA,CAAS,WAAW,CAAA,IAAK,IAAA;AAC/B,EAAA,OAAO;AAAA,IACL,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,KAAA,EAAO,QAAQ,IAAI,CAAA;AAAA,IACrC,IAAA,EAAM,QAAA;AAAA,IACN,IAAA;AAAA,IACA,KAAA;AAAA,IACA;AAAA,GACF;AACF,CAAA;AAEA,MAAM,aAAA,GAAgB,CAAC,CAAA,KAAsE;AAC3F,EAAA,MAAM,KAAA,GAAQ,YAAY,CAAC,CAAA;AAC3B,EAAA,IAAI,CAAC,KAAA,CAAM,QAAA,IAAY,CAAC,MAAM,MAAA,EAAQ;AACpC,IAAA,MAAM,IAAI,MAAM,6DAA6D,CAAA;AAAA,EAC/E;AACA,EAAA,IAAI,KAAA,CAAM,QAAA,IAAY,KAAA,CAAM,MAAA,EAAQ;AAClC,IAAA,MAAM,IAAI,MAAM,6DAA6D,CAAA;AAAA,EAC/E;AACA,EAAA,OAAO,KAAA;AACT,CAAA;AAEO,SAAS,UAAU,CAAA,EAA4D;AACpF,EAAA,MAAM,KAAA,GAAQ,cAAc,CAAC,CAAA;AAC7B,EAAA,IAAI,IAAA,GAAO,UAAA,CAAW,MAAA,CAAO,CAAC,CAAA,KAAM,QAAA,CAAS,CAAA,CAAE,KAAA,EAAO,KAAA,CAAM,QAAA,EAAU,KAAA,CAAM,MAAM,CAAC,CAAA;AACnF,EAAA,IAAA,GAAO,eAAA,CAAgB,IAAA,EAAM,KAAA,CAAM,MAAM,CAAA;AACzC,EAAA,IAAA,GAAO,cAAA,CAAe,IAAA,EAAM,KAAA,CAAM,KAAK,CAAA;AACvC,EAAA,IAAA,GAAO,eAAA,CAAgB,IAAA,EAAM,CAAA,CAAE,MAAM,CAAA;AACrC,EAAA,IAAI,CAAA,CAAE,KAAA,EAAO,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,CAAA,CAAE,KAAK,CAAA;AAC1D,EAAA,IAAA,GAAO,SAAA,CAAU,IAAA,EAAM,KAAA,CAAM,MAAA,EAAQ,MAAM,aAAa,CAAA;AACxD,EAAA,OAAO,SAAA,CAAU,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,MAAM,IAAI,CAAA;AAC/C;AAEO,SAAS,cAAc,CAAA,EAAoE;AAChG,EAAA,MAAM,KAAA,GAAQ,cAAc,CAAC,CAAA;AAC7B,EAAA,IAAI,OAA8B,EAAC;AAGnC,EAAA,KAAA,MAAW,KAAK,cAAA,EAAgB;AAC9B,IAAA,MAAM,OAAA,GACJ,SAAS,CAAA,CAAE,SAAA,EAAW,MAAM,QAAA,EAAU,KAAA,CAAM,MAAM,CAAA,IACjD,CAAA,CAAE,eAAe,IAAA,IAChB,CAAA,CAAE,eAAe,MAAA,IACjB,QAAA,CAAS,EAAE,UAAA,EAAY,KAAA,CAAM,QAAA,EAAU,KAAA,CAAM,MAAM,CAAA;AACvD,IAAA,IAAI,OAAA,EAAS,IAAA,CAAK,IAAA,CAAK,CAAC,CAAA;AAAA,EAC1B;AACA,EAAA,IAAA,GAAO,eAAA,CAAgB,IAAA,EAAM,KAAA,CAAM,MAAM,CAAA;AACzC,EAAA,IAAA,GAAO,cAAA,CAAe,IAAA,EAAM,KAAA,CAAM,KAAK,CAAA;AAEvC,EAAA,MAAM,MAAA,GAAS,MAAM,MAAA,IAAU,cAAA;AAC/B,EAAA,IAAA,GAAO,SAAA,CAAU,IAAA,EAAM,MAAA,EAAQ,KAAA,CAAM,aAAa,CAAA;AAClD,EAAA,OAAO,SAAA,CAAU,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,MAAM,IAAI,CAAA;AAC/C;AAEO,SAAS,WAAW,CAAA,EAA8D;AACvF,EAAA,MAAM,KAAA,GAAQ,cAAc,CAAC,CAAA;AAC7B,EAAA,IAAI,OAAO,WAAA,CAAY,MAAA;AAAA,IACrB,CAAC,MACC,QAAA,CAAS,CAAA,CAAE,YAAY,KAAA,CAAM,QAAA,EAAU,KAAA,CAAM,MAAM,CAAA,IAClD,CAAA,CAAE,cAAc,IAAA,IACf,CAAA,CAAE,cAAc,MAAA,IAChB,QAAA,CAAS,EAAE,SAAA,EAAW,KAAA,CAAM,QAAA,EAAU,KAAA,CAAM,MAAM;AAAA,GACxD;AACA,EAAA,IAAA,GAAO,eAAA,CAAgB,IAAA,EAAM,KAAA,CAAM,MAAM,CAAA;AACzC,EAAA,IAAA,GAAO,cAAA,CAAe,IAAA,EAAM,KAAA,CAAM,KAAK,CAAA;AACvC,EAAA,IAAI,CAAA,CAAE,MAAA,EAAQ,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,CAAA,CAAE,MAAM,CAAA;AAE7D,EAAA,MAAM,MAAA,GAAS,MAAM,MAAA,IAAU,aAAA;AAC/B,EAAA,IAAA,GAAO,SAAA,CAAU,IAAA,EAAM,MAAA,EAAQ,KAAA,CAAM,aAAa,CAAA;AAClD,EAAA,OAAO,SAAA,CAAU,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,MAAM,IAAI,CAAA;AAC/C;AAEO,SAAS,iBAAiB,CAAA,EAA4C;AAC3E,EAAA,MAAM,IAAA,GAAO,SAAA,CAAU,EAAE,GAAG,CAAA,EAAG,MAAM,CAAA,EAAG,IAAA,EAAM,gBAAA,CAAiB,QAAA,EAAU,CAAA;AACzE,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,MAAA,EAAQ,CAAC,CAAA;AAC/D,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,IAAK,CAAA,CAAE,UAAA,IAAc,CAAA,CAAA,EAAI,CAAC,CAAA;AAC1E,EAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,IAAK,CAAA,CAAE,UAAA,IAAc,CAAA,CAAA,IAAM,CAAA,CAAE,GAAA,IAAO,IAAI,CAAC,CAAA;AAC7F,EAAA,OAAO;AAAA,IACL,YAAY,IAAA,CAAK,KAAA;AAAA,IACjB,WAAA;AAAA,IACA,WAAA;AAAA,IACA,eAAA;AAAA,IACA,UAAU,WAAA,GAAc;AAAA,GAC1B;AACF;AAEO,SAAS,qBAAqB,CAAA,EAAmD;AACtF,EAAA,MAAM,IAAA,GAAO,aAAA,CAAc,EAAE,GAAG,CAAA,EAAG,MAAM,CAAA,EAAG,IAAA,EAAM,gBAAA,CAAiB,QAAA,EAAU,CAAA;AAC7E,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,MAAA,EAAQ,CAAC,CAAA;AAC/D,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,IAAK,CAAA,CAAE,UAAA,IAAc,CAAA,CAAA,EAAI,CAAC,CAAA;AAC1E,EAAA,MAAM,eAAA,GAAkB,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,IAAK,CAAA,CAAE,UAAA,IAAc,CAAA,CAAA,IAAM,CAAA,CAAE,GAAA,IAAO,IAAI,CAAC,CAAA;AAC7F,EAAA,MAAM,SAAA,GAAY,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,IAAK,CAAA,CAAE,IAAA,IAAQ,CAAA,CAAA,EAAI,CAAC,CAAA;AAClE,EAAA,OAAO;AAAA,IACL,YAAY,IAAA,CAAK,KAAA;AAAA,IACjB,WAAA;AAAA,IACA,WAAA;AAAA,IACA,eAAA;AAAA,IACA,UAAU,WAAA,GAAc,eAAA;AAAA,IACxB;AAAA,GACF;AACF;AAEO,SAAS,kBAAkB,CAAA,EAA8C;AAC9E,EAAA,MAAM,IAAA,GAAO,UAAA,CAAW,EAAE,GAAG,CAAA,EAAG,MAAM,CAAA,EAAG,IAAA,EAAM,gBAAA,CAAiB,QAAA,EAAU,CAAA;AAC1E,EAAA,MAAM,WAAA,GAAc,IAAA,CAAK,KAAA,CAAM,MAAA,CAAO,CAAC,GAAG,CAAA,KAAM,CAAA,GAAI,CAAA,CAAE,MAAA,EAAQ,CAAC,CAAA;AAC/D,EAAA,IAAI,WAAA,GAAc,CAAA;AAClB,EAAA,IAAI,cAAA,GAAiB,CAAA;AACrB,EAAA,IAAI,YAAA,GAAe,CAAA;AACnB,EAAA,IAAI,aAAA,GAAgB,CAAA;AACpB,EAAA,KAAA,MAAW,CAAA,IAAK,KAAK,KAAA,EAAO;AAC1B,IAAA,IAAI,CAAA,CAAE,MAAA,KAAW,oBAAA,CAAqB,MAAA,EAAQ,WAAA,IAAe,CAAA;AAAA,SAAA,IACpD,CAAA,CAAE,MAAA,KAAW,oBAAA,CAAqB,SAAA,EAAW,cAAA,IAAkB,CAAA;AAAA,SAAA,IAC/D,CAAA,CAAE,MAAA,KAAW,oBAAA,CAAqB,OAAA,EAAS,YAAA,IAAgB,CAAA;AAAA,SAAA,IAC3D,CAAA,CAAE,MAAA,KAAW,oBAAA,CAAqB,QAAA,EAAU,aAAA,IAAiB,CAAA;AAAA,EACxE;AACA,EAAA,OAAO;AAAA,IACL,YAAY,IAAA,CAAK,KAAA;AAAA,IACjB,WAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AACF;AAGO,SAAS,aAAA,CACd,KACA,CAAA,EACM;AACN,EAAc,cAAc,CAAC;AAC7B,EAAA,IAAI,MAAA;AACJ,EAAA,IAAI,IAAA;AACJ,EAAA,IAAI,GAAA,KAAQ,YAAY,KAAA,EAAO;AAC7B,IAAA,MAAM,QAAQ,SAAA,CAAU;AAAA,MACtB,GAAI,CAAA;AAAA,MACJ,IAAA,EAAM,CAAA;AAAA,MACN,MAAM,gBAAA,CAAiB;AAAA,KACxB,CAAA,CAAE,KAAA;AACH,IAAA,MAAA,GAAS,+EAAA;AACT,IAAA,IAAA,GAAO,KAAA,CAAM,GAAA;AAAA,MACX,CAAC,CAAA,KACC,CAAA,EAAG,CAAA,CAAE,UAAU,CAAA,CAAA,EAAI,CAAA,CAAE,KAAK,CAAA,CAAA,EAAI,CAAA,CAAE,MAAM,CAAA,CAAA,EAAI,CAAA,CAAE,KAAK,CAAA,CAAA,EAAI,CAAA,CAAE,MAAM,CAAA,CAAA,EAAI,CAAA,CAAE,KAAK,CAAA,CAAA,EAAI,CAAA,CAAE,MAAM,CAAA,CAAA,EAAI,CAAA,CAAE,MAAM,CAAA,CAAA,EAAI,CAAA,CAAE,KAAK,CAAA,CAAA,EAAI,CAAA,CAAE,cAAc,EAAE,CAAA;AAAA,KACrI;AAAA,EACF,CAAA,MAAA,IAAW,GAAA,KAAQ,WAAA,CAAY,SAAA,EAAW;AACxC,IAAA,MAAM,QAAQ,aAAA,CAAc;AAAA,MAC1B,GAAI,CAAA;AAAA,MACJ,IAAA,EAAM,CAAA;AAAA,MACN,MAAM,gBAAA,CAAiB;AAAA,KACxB,CAAA,CAAE,KAAA;AACH,IAAA,MAAA,GACE,8GAAA;AACF,IAAA,IAAA,GAAO,KAAA,CAAM,GAAA;AAAA,MACX,CAAC,CAAA,KACC,CAAA,EAAG,CAAA,CAAE,UAAU,IAAI,CAAA,CAAE,KAAK,CAAA,CAAA,EAAI,CAAA,CAAE,UAAU,CAAA,CAAA,EAAI,CAAA,CAAE,SAAS,CAAA,CAAA,EAAI,EAAE,UAAA,IAAc,EAAE,CAAA,CAAA,EAAI,CAAA,CAAE,MAAM,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,EAAE,MAAM,CAAA,CAAA,EAAI,CAAA,CAAE,SAAS,IAAI,CAAA,CAAE,UAAA,IAAc,EAAE,CAAA,CAAA,EAAI,CAAA,CAAE,cAAc,EAAE,CAAA;AAAA,KAChL;AAAA,EACF,CAAA,MAAO;AACL,IAAA,MAAM,QAAQ,UAAA,CAAW;AAAA,MACvB,GAAI,CAAA;AAAA,MACJ,IAAA,EAAM,CAAA;AAAA,MACN,MAAM,gBAAA,CAAiB;AAAA,KACxB,CAAA,CAAE,KAAA;AACH,IAAA,MAAA,GAAS,oFAAA;AACT,IAAA,IAAA,GAAO,KAAA,CAAM,GAAA;AAAA,MACX,CAAC,CAAA,KACC,CAAA,EAAG,CAAA,CAAE,UAAU,CAAA,CAAA,EAAI,CAAA,CAAE,KAAK,CAAA,CAAA,EAAI,CAAA,CAAE,OAAO,CAAA,CAAA,EAAI,CAAA,CAAE,UAAU,CAAA,CAAA,EAAI,CAAA,CAAE,SAAA,IAAa,EAAE,CAAA,CAAA,EAAI,CAAA,CAAE,MAAM,CAAA,CAAA,EAAI,EAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,IAAI,CAAA,CAAA,EAAI,CAAA,CAAE,MAAM,CAAA,CAAA,EAAI,EAAE,MAAM,CAAA;AAAA,KACxI;AAAA,EACF;AAIA,EAAA,OAAO,IAAI,IAAA,CAAK,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAA,EAAG,EAAE,IAAA,EAAM,YAAY,CAAA;AACtE;;ACvkBO,SAAS,qBAAqB,IAAA,EAA+C;AAClF,EAAA,MAAM,EAAE,GAAA,EAAK,IAAA,EAAK,GAAI,IAAA;AAEtB,EAAA,MAAM,YAAA,GAAe,CACnB,CAAA,KACS;AACT,IAAA,IAAI,CAAC,CAAA,CAAE,QAAA,IAAY,CAAC,EAAE,MAAA,EAAQ;AAC5B,MAAA,MAAM,IAAI,MAAM,wDAAwD,CAAA;AAAA,IAC1E;AACA,IAAA,IAAI,CAAA,CAAE,QAAA,IAAY,CAAA,CAAE,MAAA,EAAQ;AAC1B,MAAA,MAAM,IAAI,MAAM,wDAAwD,CAAA;AAAA,IAC1E;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,OAAA,GAAU,CACd,CAAA,KAC4B;AAC5B,IAAA,YAAA,CAAa,CAAC,CAAA;AACd,IAAA,MAAM,GAAA,GAA+B;AAAA,MACnC,UAAU,CAAA,CAAE,QAAA;AAAA,MACZ,QAAQ,CAAA,CAAE,MAAA;AAAA,MACV,IAAA,EAAM,CAAA,CAAE,IAAA,IAAQ,gBAAA,CAAiB,IAAA;AAAA,MACjC,IAAA,EAAM,CAAA,CAAE,IAAA,IAAQ,gBAAA,CAAiB,IAAA;AAAA,MACjC,aAAA,EAAe,CAAA,CAAE,aAAA,IAAiB,gBAAA,CAAiB;AAAA,KACrD;AACA,IAAA,IAAI,CAAA,CAAE,MAAA,KAAW,MAAA,EAAW,GAAA,CAAI,SAAS,CAAA,CAAE,MAAA;AAC3C,IAAA,IAAI,CAAA,CAAE,MAAA,KAAW,MAAA,EAAW,GAAA,CAAI,SAAS,CAAA,CAAE,MAAA;AAC3C,IAAA,IAAI,CAAA,CAAE,KAAA,KAAU,MAAA,EAAW,GAAA,CAAI,QAAQ,CAAA,CAAE,KAAA;AACzC,IAAA,OAAO,GAAA;AAAA,EACT,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,UAAU,CAAA,EAAG;AACjB,MAAA,IAAI,MAAK,EAAG,OAAO,SAAA,CAAU,SAAA,CAAU,CAAC,CAAC,CAAA;AACzC,MAAA,MAAM,KAAA,GAAQ,QAAQ,CAAC,CAAA;AACvB,MAAA,IAAI,CAAA,CAAE,KAAA,KAAU,MAAA,EAAW,KAAA,CAAM,QAAQ,CAAA,CAAE,KAAA;AAC3C,MAAA,IAAI,CAAA,CAAE,MAAA,KAAW,MAAA,EAAW,KAAA,CAAM,SAAS,CAAA,CAAE,MAAA;AAC7C,MAAA,OAAO,GAAA,CAA0C,iBAAiB,KAAA,EAAO;AAAA,QACvE;AAAA,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,cAAc,CAAA,EAAG;AACrB,MAAA,IAAI,MAAK,EAAG,OAAO,SAAA,CAAU,aAAA,CAAc,CAAC,CAAC,CAAA;AAC7C,MAAA,OAAO,GAAA,CAA8C,iBAAiB,SAAA,EAAW;AAAA,QAC/E,KAAA,EAAO,QAAQ,CAAC;AAAA,OACjB,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,WAAW,CAAA,EAAG;AAClB,MAAA,IAAI,MAAK,EAAG,OAAO,SAAA,CAAU,UAAA,CAAW,CAAC,CAAC,CAAA;AAC1C,MAAA,MAAM,KAAA,GAAQ,QAAQ,CAAC,CAAA;AACvB,MAAA,IAAI,CAAA,CAAE,MAAA,KAAW,MAAA,EAAW,KAAA,CAAM,SAAS,CAAA,CAAE,MAAA;AAC7C,MAAA,OAAO,GAAA,CAA2C,iBAAiB,MAAA,EAAQ;AAAA,QACzE;AAAA,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,aAAa,CAAA,EAAG;AACpB,MAAA,IAAI,MAAK,EAAG,OAAO,SAAA,CAAU,gBAAA,CAAiB,CAAC,CAAC,CAAA;AAChD,MAAA,MAAM,KAAA,GAAQ,QAAQ,CAAC,CAAA;AACvB,MAAA,IAAI,CAAA,CAAE,KAAA,KAAU,MAAA,EAAW,KAAA,CAAM,QAAQ,CAAA,CAAE,KAAA;AAC3C,MAAA,IAAI,CAAA,CAAE,MAAA,KAAW,MAAA,EAAW,KAAA,CAAM,SAAS,CAAA,CAAE,MAAA;AAC7C,MAAA,OAAO,GAAA,CAA0B,gBAAA,CAAiB,aAAA,EAAe,EAAE,OAAO,CAAA;AAAA,IAC5E,CAAA;AAAA,IAEA,MAAM,iBAAiB,CAAA,EAAG;AACxB,MAAA,IAAI,MAAK,EAAG,OAAO,SAAA,CAAU,oBAAA,CAAqB,CAAC,CAAC,CAAA;AACpD,MAAA,OAAO,GAAA,CAA6B,iBAAiB,iBAAA,EAAmB;AAAA,QACtE,KAAA,EAAO,QAAQ,CAAC;AAAA,OACjB,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,cAAc,CAAA,EAAG;AACrB,MAAA,IAAI,MAAK,EAAG,OAAO,SAAA,CAAU,iBAAA,CAAkB,CAAC,CAAC,CAAA;AACjD,MAAA,MAAM,KAAA,GAAQ,QAAQ,CAAC,CAAA;AACvB,MAAA,IAAI,CAAA,CAAE,MAAA,KAAW,MAAA,EAAW,KAAA,CAAM,SAAS,CAAA,CAAE,MAAA;AAC7C,MAAA,OAAO,GAAA,CAA2B,gBAAA,CAAiB,cAAA,EAAgB,EAAE,OAAO,CAAA;AAAA,IAC9E,CAAA;AAAA,IAEA,MAAM,SAAA,CAAU,GAAA,EAAK,CAAA,EAAG;AACtB,MAAA,YAAA,CAAa,CAAC,CAAA;AACd,MAAA,MAAM,KAAA,GAAQ,QAAQ,CAAC,CAAA;AACvB,MAAA,IAAI,GAAA,KAAQ,YAAY,KAAA,EAAO;AAC7B,QAAA,MAAM,EAAA,GAAK,CAAA;AACX,QAAA,IAAI,EAAA,CAAG,KAAA,KAAU,MAAA,EAAW,KAAA,CAAM,QAAQ,EAAA,CAAG,KAAA;AAC7C,QAAA,IAAI,EAAA,CAAG,MAAA,KAAW,MAAA,EAAW,KAAA,CAAM,SAAS,EAAA,CAAG,MAAA;AAAA,MACjD;AACA,MAAA,IAAI,GAAA,KAAQ,YAAY,MAAA,EAAQ;AAC9B,QAAA,MAAM,EAAA,GAAK,CAAA;AACX,QAAA,IAAI,EAAA,CAAG,MAAA,KAAW,MAAA,EAAW,KAAA,CAAM,SAAS,EAAA,CAAG,MAAA;AAAA,MACjD;AACA,MAAA,IAAI,IAAA,EAAK,EAAG,OAAO,aAAA,CAAc,KAAK,CAAC,CAAA;AACvC,MAAA,MAAM,IAAA,GACJ,GAAA,KAAQ,WAAA,CAAY,KAAA,GAChB,gBAAA,CAAiB,YAAA,GACjB,GAAA,KAAQ,WAAA,CAAY,SAAA,GAClB,gBAAA,CAAiB,gBAAA,GACjB,gBAAA,CAAiB,aAAA;AACzB,MAAA,OAAO,IAAI,IAAA,EAAM;AAAA,QACf,KAAA;AAAA,QACA,YAAA,EAAc;AAAA,OACK,CAAA;AAAA,IACvB;AAAA,GACF;AACF;;ACjLO,MAAM,eAAA,GAAkB;AAAA,EAC7B,QAAA,EAAU,yBAAA;AAAA,EACV,YAAA,EAAc,6BAAA;AAAA,EACd,UAAA,EAAY;AACd;AAGO,MAAM,4BAAA,GAA+B;AAAA,EAC1C,KAAA,EAAO,GAAA;AAAA,EACP,SAAA,EAAW,CAAA;AAAA,EACX,SAAA,EAAW;AACb;AAGO,MAAM,0BAAA,GAA6B;AAAA,EACxC,WAAA,EAAa;AACf;AAGO,MAAM,wBAAA,GAA2B;AAAA,EACtC,KAAA,EAAO,CAAA;AAAA,EACP,SAAA,EAAW;AACb;AAMO,MAAM,qBAAA,GAAwB;AAAA,EACnC,EAAA,EAAI,CAAA;AAAA,EACJ,EAAA,EAAI,EAAA;AAAA,EACJ,EAAA,EAAI;AACN;;ACvBA,MAAM,WAAA,GAAuC;AAAA,EAC3C;AAAA,IACE,YAAA,EAAc,KAAA;AAAA,IACd,WAAA,EAAa,EAAA;AAAA,IACb,WAAA,EAAa,EAAA;AAAA,IACb,cAAA,EAAgB,EAAA;AAAA,IAChB,eAAA,EAAiB;AAAA,GACnB;AAAA,EACA;AAAA,IACE,YAAA,EAAc,UAAA;AAAA,IACd,WAAA,EAAa,EAAA;AAAA,IACb,WAAA,EAAa,EAAA;AAAA,IACb,cAAA,EAAgB,EAAA;AAAA,IAChB,eAAA,EAAiB;AAAA,GACnB;AAAA,EACA;AAAA,IACE,YAAA,EAAc,UAAA;AAAA,IACd,WAAA,EAAa,EAAA;AAAA,IACb,WAAA,EAAa,EAAA;AAAA,IACb,cAAA,EAAgB,EAAA;AAAA,IAChB,eAAA,EAAiB;AAAA;AAErB,CAAA;AAEA,MAAM,aAAA,GAAsC;AAAA,EAC1C;AAAA,IACE,EAAA,EAAI,GAAA;AAAA,IACJ,IAAA,EAAM,sCAAA;AAAA,IACN,WAAA,EAAa,aAAA;AAAA,IACb,KAAA,EAAO,8CAAA;AAAA,IACP,QAAA,EAAU,QAAA;AAAA,IACV,aAAA,EAAe,QAAA;AAAA,IACf,SAAA,EAAW,QAAA;AAAA,IACX,YAAA,EAAc,EAAA;AAAA,IACd,WAAA,EAAa,CAAA;AAAA,IACb,eAAA,EAAiB,KAAA;AAAA,IACjB,cAAA,EAAgB,sBAAA;AAAA,IAChB,KAAA,EAAO,eAAA;AAAA,IACP,oBAAA,EAAsB;AAAA,MACpB,WAAA,EAAa,gBAAA;AAAA,MACb,MAAA,EAAQ,gCAAA;AAAA,MACR,WAAA,EAAa,EAAA;AAAA,MACb,WAAA,EAAa;AAAA;AACf;AAEJ,CAAA;AAEO,SAAS,YAAA,CAAa,KAAA,GAA6B,EAAC,EAA2B;AACpF,EAAA,IAAI,KAAA,GAAQ,CAAC,GAAG,aAAa,CAAA;AAC7B,EAAA,IAAI,MAAM,QAAA,EAAU;AAClB,IAAA,KAAA,GAAQ,MAAM,MAAA,CAAO,CAAC,MAAM,CAAA,CAAE,QAAA,KAAa,MAAM,QAAQ,CAAA;AAAA,EAC3D;AACA,EAAA,MAAM,QAAQ,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,KAAA,IAAS,GAAG,CAAC,CAAA;AAC1C,EAAA,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,CAAA,EAAG,KAAK,CAAA;AAC5B,EAAA,OAAO,EAAE,SAAS,IAAA,EAAM,IAAA,EAAM,EAAE,KAAA,EAAO,KAAA,EAAO,KAAA,CAAM,MAAA,EAAO,EAAE;AAC/D;AAEO,SAAS,gBAAgB,KAAA,EAA0D;AACxF,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,IAAS,WAAA,CAAY,MAAA;AACzC,EAAA,MAAM,MAAA,GAAS,YAAY,KAAA,CAAM,CAAA,EAAG,KAAK,GAAA,CAAI,KAAA,EAAO,WAAA,CAAY,MAAM,CAAC,CAAA;AACvE,EAAA,MAAM,WAAW,OAAO,KAAA,CAAM,aAAa,QAAA,GAAW,KAAA,CAAM,WAAW,qBAAA,CAAsB,EAAA;AAC7F,EAAA,OAAO;AAAA,IACL,OAAA,EAAS,IAAA;AAAA,IACT,IAAA,EAAM;AAAA,MACJ,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd,YAAA,EAAc,KAAA,CAAM,MAAA,CAAO,OAAA,CAAQ,QAAQ,EAAE,CAAA;AAAA,MAC7C,QAAA;AAAA,MACA,UAAU,KAAA,CAAM,QAAA;AAAA,MAChB,QAAQ,KAAA,CAAM,MAAA;AAAA,MACd;AAAA;AACF,GACF;AACF;AAEO,SAAS,cAAc,KAAA,EAAsD;AAClF,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,OAAA,CAAQ,KAAA,CAAM,aAAa,CAAA,GACzC,KAAA,CAAM,aAAA,GACN,KAAA,CAAM,aAAA,CAAc,KAAA,CAAM,GAAG,CAAA;AACjC,EAAA,MAAM,KAAA,GAAQ,YAAY,CAAC,CAAA;AAC3B,EAAA,MAAM,QAA0B,EAAC;AACjC,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,KAAA,MAAW,QAAQ,GAAA,EAAK;AACtB,IAAA,MAAM,YAAA,GAAe,KAAK,IAAA,EAAK;AAC/B,IAAA,IAAI,CAAC,YAAA,IAAgB,IAAA,CAAK,GAAA,CAAI,YAAY,CAAA,EAAG;AAC7C,IAAA,IAAA,CAAK,IAAI,YAAY,CAAA;AACrB,IAAA,KAAA,CAAM,IAAA,CAAK;AAAA,MACT,YAAA;AAAA,MACA,MAAA,EAAQ,MAAM,YAAY,CAAA,CAAA;AAAA,MAC1B,UAAA,EAAY,MAAM,UAAA,IAAc,kBAAA;AAAA,MAChC,cAAc,KAAA,CAAM,YAAA;AAAA,MACpB,aAAa,KAAA,CAAM,WAAA;AAAA,MACnB,aAAa,KAAA,CAAM,WAAA;AAAA,MACnB,gBAAgB,KAAA,CAAM,cAAA;AAAA,MACtB,iBAAiB,KAAA,CAAM;AAAA,KACxB,CAAA;AAAA,EACH;AACA,EAAA,OAAO,EAAE,OAAA,EAAS,IAAA,EAAM,IAAA,EAAM,EAAE,OAAM,EAAE;AAC1C;;ACjFA,SAAS,uBAAuB,KAAA,EAAoC;AAClE,EAAA,MAAM,GAAA,GAAM,MAAM,OAAA,CAAQ,KAAK,IAAI,KAAA,GAAQ,KAAA,CAAM,MAAM,GAAG,CAAA;AAC1D,EAAA,MAAM,IAAA,uBAAW,GAAA,EAAY;AAC7B,EAAA,MAAM,MAAgB,EAAC;AACvB,EAAA,KAAA,MAAW,QAAQ,GAAA,EAAK;AACtB,IAAA,MAAM,MAAA,GAAS,KAAK,IAAA,EAAK;AACzB,IAAA,IAAI,CAAC,MAAA,IAAU,IAAA,CAAK,GAAA,CAAI,MAAM,CAAA,EAAG;AACjC,IAAA,IAAA,CAAK,IAAI,MAAM,CAAA;AACf,IAAA,GAAA,CAAI,KAAK,MAAM,CAAA;AACf,IAAA,IAAI,GAAA,CAAI,MAAA,IAAU,0BAAA,CAA2B,WAAA,EAAa;AAAA,EAC5D;AACA,EAAA,OAAO,GAAA;AACT;AAQO,SAAS,oBAAoB,IAAA,EAA6C;AAC/E,EAAA,MAAM,EAAE,GAAA,EAAK,IAAA,EAAK,GAAI,IAAA;AAEtB,EAAA,OAAO;AAAA,IACL,MAAM,WAAA,CAAY,KAAA,GAA6B,EAAC,EAAoC;AAClF,MAAA,IAAI,IAAA,EAAK,EAAG,OAAO,YAAA,CAAa,KAAK,CAAA;AAErC,MAAA,MAAM,QAAA,GAAW,KAAA,CAAM,KAAA,IAAS,wBAAA,CAAyB,KAAA;AACzD,MAAA,MAAM,QAAA,GAAoC;AAAA,QACxC,KAAA,EAAO,KAAK,GAAA,CAAI,IAAA,CAAK,IAAI,QAAA,EAAU,CAAC,CAAA,EAAG,wBAAA,CAAyB,SAAS;AAAA,OAC3E;AACA,MAAA,IAAI,KAAA,CAAM,QAAA,KAAa,MAAA,EAAW,QAAA,CAAS,WAAW,KAAA,CAAM,QAAA;AAE5D,MAAA,OAAO,IAA4B,eAAA,CAAgB,QAAA,EAAU,EAAE,KAAA,EAAO,UAAU,CAAA;AAAA,IAClF,CAAA;AAAA,IAEA,MAAM,eAAe,KAAA,EAAmE;AACtF,MAAA,IAAI,IAAA,EAAK,EAAG,OAAO,eAAA,CAAgB,KAAK,CAAA;AAExC,MAAA,MAAM,QAAA,GAAoC;AAAA,QACxC,QAAQ,KAAA,CAAM,MAAA;AAAA,QACd,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,UAAU,KAAA,CAAM,QAAA;AAAA,QAChB,QAAQ,KAAA,CAAM,MAAA;AAAA,QACd,UAAA,EAAY,MAAM,UAAA,IAAc;AAAA,OAClC;AACA,MAAA,IAAI,KAAA,CAAM,UAAU,MAAA,EAAW;AAC7B,QAAA,QAAA,CAAS,QAAQ,IAAA,CAAK,GAAA;AAAA,UACpB,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,KAAA,EAAO,6BAA6B,SAAS,CAAA;AAAA,UAC5D,4BAAA,CAA6B;AAAA,SAC/B;AAAA,MACF;AAEA,MAAA,OAAO,IAA+B,eAAA,CAAgB,YAAA,EAAc,EAAE,KAAA,EAAO,UAAU,CAAA;AAAA,IACzF,CAAA;AAAA,IAEA,MAAM,aAAa,KAAA,EAA+D;AAChF,MAAA,IAAI,IAAA,EAAK,EAAG,OAAO,aAAA,CAAc,KAAK,CAAA;AAEtC,MAAA,MAAM,OAAA,GAAU,sBAAA,CAAuB,KAAA,CAAM,aAAa,CAAA;AAC1D,MAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACnB,QAAA,MAAM,IAAI,MAAM,yDAAyD,CAAA;AAAA,MAC3E;AAEA,MAAA,MAAM,QAAA,GAAoC;AAAA;AAAA,QAExC,cAAA,EAAgB,OAAA,CAAQ,IAAA,CAAK,GAAG;AAAA,OAClC;AACA,MAAA,IAAI,KAAA,CAAM,UAAA,KAAe,MAAA,EAAW,QAAA,CAAS,cAAc,KAAA,CAAM,UAAA;AAEjE,MAAA,OAAO,IAA6B,eAAA,CAAgB,UAAA,EAAY,EAAE,KAAA,EAAO,UAAU,CAAA;AAAA,IACrF;AAAA,GACF;AACF;;AC9FO,MAAM,YAAA,GAAe;AAAA;AAAA,EAE1B,UAAA,EAAY,qBAAA;AAAA;AAAA,EAEZ,QAAQ,CAAC,IAAA,KAAyB,CAAA,oBAAA,EAAuB,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA;AAAA;AAAA;AAAA,EAIjF,SAAA,EAAW,uBAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMX,gBAAgB,CAAC,IAAA,KACf,CAAA,sBAAA,EAAyB,kBAAA,CAAmB,IAAI,CAAC,CAAA,OAAA;AACrD;AAQO,MAAM,iBAAA,GAAoB;AAAA,EAC/B,MAAA,EAAQ,QAAA;AAAA,EACR,SAAA,EAAW,WAAA;AAAA,EACX,MAAA,EAAQ,QAAA;AAAA,EACR,MAAA,EAAQ,QAAA;AAAA,EACR,KAAA,EAAO;AACT;;ACcO,SAAS,iBAAiB,IAAA,EAAuC;AACtE,EAAA,MAAM,EAAE,GAAA,EAAK,IAAA,EAAK,GAAI,IAAA;AAEtB,EAAA,OAAO;AAAA,IACL,MAAM,WAAA,GAAyC;AAC7C,MAAA,IAAI,IAAA,EAAK,EAAG,OAAO,SAAA,EAAU;AAC7B,MAAA,MAAM,GAAA,GAAM,MAAM,GAAA,CAAwB,YAAA,CAAa,UAAU,CAAA;AACjE,MAAA,OAAO,GAAA,EAAK,aAAa,EAAC;AAAA,IAC5B,CAAA;AAAA,IAEA,MAAM,UAAU,IAAA,EAAuC;AACrD,MAAA,IAAI,IAAA,EAAK,EAAG,OAAO,QAAA,CAAS,IAAI,CAAA;AAChC,MAAA,OAAO,GAAA,CAAoB,YAAA,CAAa,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,IACtD,CAAA;AAAA,IAEA,MAAM,aAAa,OAAA,EAA+D;AAChF,MAAA,IAAI,IAAA,EAAK,EAAG,OAAO,WAAA,CAAY,OAAO,CAAA;AACtC,MAAA,OAAO,GAAA,CAA4B,aAAa,UAAA,EAAY;AAAA,QAC1D,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,YAAA,CACJ,IAAA,EACA,OAAA,EACiC;AACjC,MAAA,IAAI,IAAA,EAAK,EAAG,OAAO,WAAA,CAAY,IAAa,CAAA;AAC5C,MAAA,OAAO,GAAA,CAA4B,YAAA,CAAa,MAAA,CAAO,IAAI,CAAA,EAAG;AAAA,QAC5D,MAAA,EAAQ,KAAA;AAAA,QACR,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,aAAa,IAAA,EAA6B;AAC9C,MAAA,IAAI,MAAK,EAAG;AAEV,QAAA;AAAA,MACF;AACA,MAAA,MAAM,GAAA,CAAI,aAAa,MAAA,CAAO,IAAI,GAAG,EAAE,MAAA,EAAQ,UAAU,CAAA;AAAA,IAC3D,CAAA;AAAA,IAEA,MAAM,aAAA,GAAwC;AAC5C,MAAA,IAAI,IAAA,EAAK,EAAG,OAAO,kBAAA,EAAmB;AACtC,MAAA,MAAM,GAAA,GAAM,MAAM,GAAA,CAA6B,YAAA,CAAa,SAAS,CAAA;AACrE,MAAA,OAAO,GAAA,EAAK,aAAa,EAAC;AAAA,IAC5B,CAAA;AAAA,IAEA,MAAM,iBAAiB,OAAA,EAAyD;AAC9E,MAAA,IAAI,IAAA,EAAK,EAAG,OAAO,qBAAA,CAAsB,OAAO,CAAA;AAChD,MAAA,OAAO,GAAA,CAAiB,aAAa,SAAA,EAAW,EAAE,QAAQ,MAAA,EAAQ,IAAA,EAAM,SAAS,CAAA;AAAA,IACnF,CAAA;AAAA,IAEA,MAAM,cAAA,CAAe,IAAA,EAAc,OAAA,EAAyD;AAC1F,MAAA,IAAI,IAAA,EAAK,EAAG,OAAO,mBAAA,CAAoB,IAAa,CAAA;AACpD,MAAA,OAAO,GAAA,CAAiB,YAAA,CAAa,cAAA,CAAe,IAAI,CAAA,EAAG;AAAA,QACzD,MAAA,EAAQ,KAAA;AAAA,QACR,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,eAAe,IAAA,EAA6B;AAChD,MAAA,IAAI,MAAK,EAAG;AAEV,QAAA;AAAA,MACF;AACA,MAAA,MAAM,GAAA,CAAI,aAAa,cAAA,CAAe,IAAI,GAAG,EAAE,MAAA,EAAQ,UAAU,CAAA;AAAA,IACnE,CAAA;AAAA,IAEA,MAAM,mBAAmB,IAAA,EAAkD;AACzE,MAAA,IAAI,IAAA,EAAK,EAAG,OAAO,mBAAA,CAAoB,IAAI,CAAA;AAC3C,MAAA,OAAO,GAAA,CAA+B,YAAA,CAAa,cAAA,CAAe,IAAI,CAAC,CAAA;AAAA,IACzE;AAAA,GACF;AACF;AAIA,MAAM,aAAA,GAAkC;AAAA,EACtC;AAAA,IACE,EAAA,EAAI,iBAAA;AAAA,IACJ,IAAA,EAAM,qBAAA;AAAA,IACN,OAAA,EAAS,GAAA;AAAA,IACT,WAAA,EAAa,wCAAA;AAAA,IACb,KAAA,EAAO,aAAA;AAAA,IACP,WAAW,EAAC;AAAA,IACZ,OAAA,EAAS,wDAAA;AAAA,IACT,YAAA,EAAc;AAAA;AAElB,CAAA;AAEA,SAAS,SAAA,GAA8B;AAErC,EAAA,OAAO,aAAA,CAAc,GAAA,CAAI,CAAC,EAAE,OAAA,EAAS,EAAA,EAAI,YAAA,EAAc,EAAA,EAAI,GAAG,IAAA,EAAK,KAAM,IAAI,CAAA;AAC/E;AACA,SAAS,SAAS,IAAA,EAA8B;AAC9C,EAAA,OAAO,aAAA,CAAc,KAAK,CAAC,CAAA,KAAM,EAAE,IAAA,KAAS,IAAI,CAAA,IAAK,aAAA,CAAc,CAAC,CAAA;AACtE;AACA,SAAS,YAAY,OAAA,EAAsD;AACzE,EAAA,OAAO,EAAE,EAAA,EAAI,CAAA,KAAA,EAAQ,OAAA,CAAQ,IAAI,IAAI,IAAA,EAAM,OAAA,CAAQ,IAAA,EAAM,OAAA,EAAS,GAAA,EAAI;AACxE;AACA,SAAS,WAAA,CAAY,MAAc,QAAA,EAAuD;AACxF,EAAA,OAAO,EAAE,EAAA,EAAI,CAAA,KAAA,EAAQ,IAAI,CAAA,CAAA,EAAI,IAAA,EAAM,SAAS,GAAA,EAAI;AAClD;AAOA,MAAM,eAAA,GAAiC;AAAA,EACrC;AAAA,IACE,IAAA,EAAM,gBAAA;AAAA,IACN,cAAc,iBAAA,CAAkB,MAAA;AAAA,IAChC,OAAA,EAAS,iCAAA;AAAA,IACT,MAAA,EAAQ,CAAC,eAAA,EAAiB,WAAW,CAAA;AAAA,IACrC,MAAA,EAAQ,EAAE,OAAA,EAAS,GAAA,EAAI;AAAA,IACvB,SAAA,EAAW,IAAA;AAAA,IACX,SAAA,EAAW;AAAA;AAEf,CAAA;AAEA,SAAS,kBAAA,GAAoC;AAC3C,EAAA,OAAO,gBAAgB,GAAA,CAAI,CAAC,OAAO,EAAE,GAAG,GAAE,CAAE,CAAA;AAC9C;AAEA,SAAS,sBAAsB,OAAA,EAAgD;AAC7E,EAAA,OAAO;AAAA,IACL,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,cAAc,OAAA,CAAQ,YAAA;AAAA,IACtB,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,MAAA,EAAQ,OAAA,CAAQ,MAAA,IAAU,EAAC;AAAA,IAC3B,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,SAAA,EAAW,QAAQ,SAAA,IAAa,IAAA;AAAA,IAChC,SAAA,EAAW;AAAA,GACb;AACF;AAEA,SAAS,mBAAA,CAAoB,MAAc,QAAA,EAAiD;AAC1F,EAAA,OACE,eAAA,CAAgB,IAAA,CAAK,CAAC,CAAA,KAAM,EAAE,IAAA,KAAS,IAAI,CAAA,IAC3C,qBAAA,CAAsB,EAAE,IAAA,EAAM,YAAA,EAAc,iBAAA,CAAkB,QAAQ,CAAA;AAE1E;AAMA,SAAS,oBAAoB,IAAA,EAAyC;AACpE,EAAA,MAAM,WAAW,eAAA,CAAgB,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AAC5D,EAAA,OAAO,EAAE,QAAQ,QAAA,EAAU,MAAA,IAAU,EAAC,EAAG,OAAA,EAAS,QAAA,EAAU,SAAA,IAAa,KAAA,EAAM;AACjF;;ACnMO,MAAM,sBAAA,GAAyB;AAAA;AAAA,EAEpC,SAAA,EAAW,iCAAA;AAAA;AAAA;AAAA,EAGX,QAAA,EAAU,CAAC,UAAA,KACT,CAAA,gCAAA,EAAmC,UAAU,CAAA,CAAA;AAAA;AAAA,EAE/C,gBAAA,EAAkB,CAAC,IAAA,KAAyB,CAAA,gCAAA,EAAmC,IAAI,CAAA,SAAA,CAAA;AAAA;AAAA;AAAA,EAGnF,eAAA,EAAiB,CAAC,UAAA,KAChB,CAAA,gCAAA,EAAmC,UAAU,CAAA,QAAA,CAAA;AAAA;AAAA,EAE/C,MAAA,EAAQ;AACV;AAGO,MAAM,yBAAA,GAA4B;AAAA,EACvC,IAAA,EAAM,0BAAA;AAAA,EACN,MAAA,EAAQ,CAAC,UAAA,KAAwC,CAAA,yBAAA,EAA4B,UAAU,CAAA,CAAA;AAAA,EACvF,OAAA,EAAS,CAAC,UAAA,KACR,CAAA,yBAAA,EAA4B,UAAU,CAAA,QAAA;AAC1C;AAKO,MAAM,4BAAA,GAA+B;AAAA,EAC1C,QAAA,EAAU,UAAA;AAAA,EACV,aAAA,EAAe,eAAA;AAAA,EACf,KAAA,EAAO;AACT;AAKO,MAAM,2BAAA,GAA8B;AAAA,EACzC,KAAA,EAAO,OAAA;AAAA,EACP,OAAA,EAAS,SAAA;AAAA,EACT,QAAA,EAAU;AACZ;;ACvCA,IAAI,OAAA,GAAU,CAAA;AAEd,MAAM,KAAA,GAAuC;AAAA,EAC3C;AAAA,IACE,EAAA,EAAI,CAAA;AAAA,IACJ,IAAA,EAAM,gBAAA;AAAA,IACN,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAS,yCAAA;AAAA,IACT,IAAA,EAAM,2BAAA;AAAA,IACN,QAAA,EAAU,UAAA;AAAA,IACV,cAAA,EAAgB,eAAA;AAAA,IAChB,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,EAAA,EAAI,CAAA;AAAA,IACJ,IAAA,EAAM,gBAAA;AAAA,IACN,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAS,6BAAA;AAAA,IACT,IAAA,EAAM,yBAAA;AAAA,IACN,QAAA,EAAU,UAAA;AAAA,IACV,cAAA,EAAgB,eAAA;AAAA,IAChB,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,EAAA,EAAI,CAAA;AAAA,IACJ,IAAA,EAAM,sBAAA;AAAA,IACN,MAAA,EAAQ,IAAA;AAAA,IACR,OAAA,EAAS,4CAAA;AAAA,IACT,IAAA,EAAM,gCAAA;AAAA,IACN,QAAA,EAAU,UAAA;AAAA,IACV,cAAA,EAAgB,UAAA;AAAA,IAChB,KAAA,EAAO;AAAA;AAEX,CAAA;AAEA,MAAM,WAAA,GAAgC;AAAA,EACpC,EAAE,EAAA,EAAI,6BAAA,EAA+B,IAAA,EAAM,6BAAA;AAC7C,CAAA;AAEO,SAAS,qBAAqB,KAAA,EAOuB;AAC1D,EAAA,IAAI,IAAA,GAAO,KAAA;AACX,EAAA,IAAI,KAAA,CAAM,IAAA,EAAM,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,KAAA,CAAM,IAAI,CAAA;AAC/D,EAAA,IAAI,KAAA,CAAM,MAAA,EAAQ,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,MAAA,KAAW,KAAA,CAAM,MAAM,CAAA;AACrE,EAAA,IAAI,KAAA,CAAM,KAAA,EAAO,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,KAAA,KAAU,KAAA,CAAM,KAAK,CAAA;AAClE,EAAA,IAAI,KAAA,CAAM,QAAA,EAAU,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,KAAa,KAAA,CAAM,QAAQ,CAAA;AAC3E,EAAA,MAAM,MAAA,GAAS,MAAM,MAAA,IAAU,CAAA;AAC/B,EAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,IAAS,IAAA,CAAK,MAAA;AAClC,EAAA,OAAO,EAAE,KAAA,EAAO,IAAA,CAAK,KAAA,CAAM,MAAA,EAAQ,MAAA,GAAS,KAAK,CAAA,CAAE,GAAA,CAAI,SAAS,CAAA,EAAG,KAAA,EAAO,KAAK,MAAA,EAAO;AACxF;AAEO,SAAS,oBAAoB,EAAA,EAA8D;AAChG,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA,KAAM,MAAA,CAAO,EAAE,CAAC,CAAA;AACzD,EAAA,OAAO,GAAA,GAAM,SAAA,CAAU,GAAG,CAAA,GAAI,MAAA;AAChC;AAEO,SAAS,wBAAA,CACd,MACA,MAAA,EAC+B;AAC/B,EAAA,OAAO,oBAAA,CAAqB,EAAE,IAAA,EAAM,MAAA,EAAQ,CAAA,CAAE,KAAA;AAChD;AAEO,SAAS,uBAAuB,OAAA,EAOP;AAC9B,EAAA,MAAM,GAAA,GAAmC;AAAA,IACvC,EAAA,EAAI,OAAA,EAAA;AAAA,IACJ,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,OAAA,EAAS,QAAQ,OAAA,IAAW,EAAA;AAAA,IAC5B,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,UAAU,OAAA,CAAQ,QAAA;AAAA,IAClB,gBAAgB,OAAA,CAAQ,cAAA;AAAA,IACxB,KAAA,EAAO;AAAA,GACT;AACA,EAAA,KAAA,CAAM,KAAK,GAAG,CAAA;AACd,EAAA,OAAO,UAAU,GAAG,CAAA;AACtB;AAEO,SAAS,sBAAA,CACd,IACA,KAAA,EACkD;AAClD,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA,KAAM,MAAA,CAAO,EAAE,CAAC,CAAA;AACzD,EAAA,IAAI,CAAC,GAAA,EAAK,OAAO,EAAE,UAAU,IAAA,EAAK;AAClC,EAAA,IAAI,IAAI,KAAA,KAAU,OAAA,EAAS,OAAO,EAAE,UAAU,IAAA,EAAK;AACnD,EAAA,MAAA,CAAO,MAAA,CAAO,KAAK,KAAK,CAAA;AACxB,EAAA,OAAO,UAAU,GAAG,CAAA;AACtB;AAEO,SAAS,wBACd,EAAA,EACkD;AAClD,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA,KAAM,MAAA,CAAO,EAAE,CAAC,CAAA;AACzD,EAAA,IAAI,CAAC,OAAO,GAAA,CAAI,KAAA,KAAU,SAAS,OAAO,EAAE,UAAU,IAAA,EAAK;AAE3D,EAAA,KAAA,MAAW,SAAS,KAAA,EAAO;AACzB,IAAA,IACE,KAAA,KAAU,GAAA,IACV,KAAA,CAAM,IAAA,KAAS,GAAA,CAAI,IAAA,IACnB,KAAA,CAAM,MAAA,KAAW,GAAA,CAAI,MAAA,IACrB,KAAA,CAAM,KAAA,KAAU,SAAA,EAChB;AACA,MAAA,KAAA,CAAM,KAAA,GAAQ,UAAA;AAAA,IAChB;AAAA,EACF;AACA,EAAA,GAAA,CAAI,KAAA,GAAQ,SAAA;AACZ,EAAA,OAAO,UAAU,GAAG,CAAA;AACtB;AAEO,SAAS,wBAAwB,EAAA,EAA8B;AACpE,EAAA,MAAM,GAAA,GAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA,KAAM,MAAA,CAAO,EAAE,CAAC,CAAA;AACzD,EAAA,IAAI,CAAC,KAAK,OAAO,KAAA;AACjB,EAAA,GAAA,CAAI,KAAA,GAAQ,UAAA;AACZ,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,UAAA,CACd,aACA,OAAA,EACoC;AACpC,EAAA,MAAM,MAAA,GAAS,CAAC,GAAA,KACd,GAAA,CAAI,QAAQ,yBAAA,EAA2B,CAAC,CAAA,EAAG,GAAA,KAAgB,MAAA,CAAO,OAAA,CAAQ,GAAG,CAAA,IAAK,EAAE,CAAC,CAAA;AACvF,EAAA,OAAO,EAAE,IAAA,EAAM,MAAA,CAAO,WAAW,CAAA,EAAE;AACrC;AAEO,SAAS,mBAAA,GAAkE;AAChF,EAAA,OAAO,EAAE,OAAO,WAAA,CAAY,GAAA,CAAI,SAAS,CAAA,EAAG,KAAA,EAAO,YAAY,MAAA,EAAO;AACxE;AAEO,SAAS,mBAAmB,EAAA,EAAiD;AAClF,EAAA,MAAM,GAAA,GAAM,WAAA,CAAY,IAAA,CAAK,CAAC,CAAA,KAAM,MAAA,CAAO,CAAA,CAAE,EAAE,CAAA,KAAM,MAAA,CAAO,EAAE,CAAC,CAAA;AAC/D,EAAA,OAAO,GAAA,GAAM,SAAA,CAAU,GAAG,CAAA,GAAI,MAAA;AAChC;;ACjEO,SAAS,2BACd,IAAA,EACuB;AACvB,EAAA,MAAM,EAAE,GAAA,EAAK,IAAA,EAAK,GAAI,IAAA;AAEtB,EAAA,MAAM,SAAA,GAAY,CAAC,KAAA,GAAuC,EAAC,KAA+B;AACxF,IAAA,MAAM,IAA6B,EAAC;AACpC,IAAA,IAAI,KAAA,CAAM,IAAA,EAAM,CAAA,CAAE,IAAA,GAAO,KAAA,CAAM,IAAA;AAC/B,IAAA,IAAI,KAAA,CAAM,UAAA,EAAY,CAAA,CAAE,WAAA,GAAc,KAAA,CAAM,UAAA;AAC5C,IAAA,IAAI,KAAA,CAAM,MAAA,EAAQ,CAAA,CAAE,MAAA,GAAS,KAAA,CAAM,MAAA;AACnC,IAAA,IAAI,KAAA,CAAM,KAAA,EAAO,CAAA,CAAE,KAAA,GAAQ,KAAA,CAAM,KAAA;AACjC,IAAA,IAAI,KAAA,CAAM,QAAA,EAAU,CAAA,CAAE,QAAA,GAAW,KAAA,CAAM,QAAA;AACvC,IAAA,IAAI,KAAA,CAAM,IAAA,IAAQ,IAAA,EAAM,CAAA,CAAE,OAAO,KAAA,CAAM,IAAA;AACvC,IAAA,IAAI,KAAA,CAAM,OAAA,IAAW,IAAA,EAAM,CAAA,CAAE,WAAW,KAAA,CAAM,OAAA;AAC9C,IAAA,OAAO,CAAA;AAAA,EACT,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,MAAM,IAAA,CAAK,KAAA,GAAQ,EAAC,EAAG;AACrB,MAAA,IAAI,IAAA,EAAK,EAAG,OAAO,oBAAA,CAAqB,KAAK,CAAA;AAC7C,MAAA,OAAO,GAAA,CAAsC,uBAAuB,SAAA,EAAW;AAAA,QAC7E,KAAA,EAAO,UAAU,KAAK;AAAA,OACvB,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,IAAI,UAAA,EAAY;AACpB,MAAA,IAAI,MAAK,EAAG,OAAO,UAAU,mBAAA,CAAoB,UAAU,GAAG,UAAU,CAAA;AACxE,MAAA,OAAO,GAAA,CAAiC,sBAAA,CAAuB,QAAA,CAAS,UAAU,CAAC,CAAA;AAAA,IACrF,CAAA;AAAA,IAEA,MAAM,UAAA,CAAW,IAAA,EAAM,MAAA,EAAQ;AAC7B,MAAA,IAAI,IAAA,EAAK,EAAG,OAAO,wBAAA,CAAyB,MAAM,MAAM,CAAA;AACxD,MAAA,MAAM,MAAM,MAAM,GAAA;AAAA,QAChB,sBAAA,CAAuB,iBAAiB,IAAI,CAAA;AAAA,QAC5C,EAAE,KAAA,EAAO,MAAA,GAAS,EAAE,MAAA,KAAW,MAAA;AAAU,OAC3C;AACA,MAAA,OAAO,GAAA,CAAI,SAAS,EAAC;AAAA,IACvB,CAAA;AAAA,IAEA,MAAM,YAAY,OAAA,EAAS;AACzB,MAAA,IAAI,IAAA,EAAK,EAAG,OAAO,sBAAA,CAAuB,OAAO,CAAA;AACjD,MAAA,OAAO,GAAA,CAAiC,uBAAuB,SAAA,EAAW;AAAA,QACxE,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,WAAA,CAAY,UAAA,EAAY,OAAA,EAAS;AACrC,MAAA,IAAI,MAAK,EAAG;AACV,QAAA,MAAM,GAAA,GAAM,sBAAA,CAAuB,UAAA,EAAY,OAAkC,CAAA;AACjF,QAAA,IAAI,cAAc,GAAA,EAAK,MAAM,SAAA,CAAU,CAAA,SAAA,EAAY,UAAU,CAAA,eAAA,CAAiB,CAAA;AAC9E,QAAA,OAAO,GAAA;AAAA,MACT;AACA,MAAA,OAAO,GAAA,CAAiC,sBAAA,CAAuB,QAAA,CAAS,UAAU,CAAA,EAAG;AAAA,QACnF,MAAA,EAAQ,KAAA;AAAA,QACR,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,QAAQ,UAAA,EAAY;AACxB,MAAA,IAAI,MAAK,EAAG;AACV,QAAA,MAAM,GAAA,GAAM,wBAAwB,UAAU,CAAA;AAC9C,QAAA,IAAI,cAAc,GAAA,EAAK,MAAM,SAAA,CAAU,CAAA,SAAA,EAAY,UAAU,CAAA,mBAAA,CAAqB,CAAA;AAClF,QAAA,OAAO,GAAA;AAAA,MACT;AACA,MAAA,OAAO,GAAA,CAAiC,sBAAA,CAAuB,eAAA,CAAgB,UAAU,CAAA,EAAG;AAAA,QAC1F,MAAA,EAAQ;AAAA,OACT,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,QAAQ,UAAA,EAAY;AACxB,MAAA,IAAI,MAAK,EAAG;AACV,QAAA,IAAI,CAAC,wBAAwB,UAAU,CAAA,QAASA,WAAA,CAAU,CAAA,SAAA,EAAY,UAAU,CAAA,CAAE,CAAA;AAClF,QAAA;AAAA,MACF;AACA,MAAA,MAAM,GAAA,CAAI,uBAAuB,QAAA,CAAS,UAAU,GAAG,EAAE,MAAA,EAAQ,UAAU,CAAA;AAAA,IAC7E,CAAA;AAAA,IAEA,MAAM,OAAO,OAAA,EAAS;AACpB,MAAA,IAAI,MAAK,EAAG,OAAO,WAAW,OAAA,CAAQ,WAAA,EAAa,QAAQ,OAAO,CAAA;AAClE,MAAA,OAAO,GAAA,CAA8B,uBAAuB,MAAA,EAAQ;AAAA,QAClE,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,mBAAA,GAAsB;AAC1B,MAAA,IAAI,IAAA,EAAK,EAAG,OAAO,mBAAA,EAAoB;AACvC,MAAA,OAAO,GAAA,CAAgD,0BAA0B,IAAI,CAAA;AAAA,IACvF,CAAA;AAAA,IAEA,MAAM,kBAAkB,UAAA,EAAY;AAClC,MAAA,IAAI,MAAK,EAAG;AACV,QAAA,MAAM,GAAA,GAAM,mBAAmB,UAAU,CAAA;AACzC,QAAA,IAAI,CAAC,GAAA,EAAK,MAAMA,WAAA,CAAU,CAAA,gBAAA,EAAmB,UAAU,CAAA,CAAE,CAAA;AACzD,QAAA,OAAO,GAAA;AAAA,MACT;AACA,MAAA,OAAO,GAAA,CAAoB,yBAAA,CAA0B,MAAA,CAAO,UAAU,CAAC,CAAA;AAAA,IACzE,CAAA;AAAA,IAEA,MAAM,qBAAA,CAAsB,UAAA,EAAY,OAAA,EAAS;AAC/C,MAAA,IAAI,IAAA,EAAK,EAAG,OAAO,EAAE,SAAS,IAAA,EAAK;AACnC,MAAA,OAAO,GAAA,CAAa,yBAAA,CAA0B,OAAA,CAAQ,UAAU,CAAA,EAAG;AAAA,QACjE,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH;AAAA,GACF;AACF;AAIA,SAAS,SAAA,CAAa,KAAoB,EAAA,EAAwB;AAChE,EAAA,IAAI,CAAC,GAAA,EAAK,MAAMA,WAAA,CAAU,CAAA,SAAA,EAAY,EAAE,CAAA,CAAE,CAAA;AAC1C,EAAA,OAAO,GAAA;AACT;AAEA,SAASA,YAAU,OAAA,EAAwB;AACzC,EAAA,MAAM,CAAA,GAAI,IAAI,KAAA,CAAM,OAAO,CAAA;AAC3B,EAAC,EAAsC,UAAA,GAAa,GAAA;AACpD,EAAA,OAAO,CAAA;AACT;AAEA,SAAS,UAAU,OAAA,EAAwB;AACzC,EAAA,MAAM,CAAA,GAAI,IAAI,KAAA,CAAM,OAAO,CAAA;AAC3B,EAAC,EAAsC,UAAA,GAAa,GAAA;AACpD,EAAA,OAAO,CAAA;AACT;;AC5MO,MAAM,cAAA,GAAiB;AAOvB,MAAM,mBAAA,GAAsB;AAAA;AAAA,EAEjC,YAAA,EAAc,cAAA;AAAA,EACd,iBAAA,EAAmB,mBAAA;AAAA,EACnB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,YAAA,EAAc,cAAA;AAAA,EACd,iBAAA,EAAmB,mBAAA;AAAA;AAAA,EAEnB,MAAA,EAAQ,QAAA;AAAA;AAAA,EAGR,gBAAA,EAAkB,kBAAA;AAAA,EAClB,eAAA,EAAiB,iBAAA;AAAA;AAAA,EAGjB,eAAA,EAAiB,iBAAA;AAAA,EACjB,iBAAA,EAAmB,mBAAA;AAAA,EACnB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,aAAA,EAAe,eAAA;AAAA,EACf,gBAAA,EAAkB,kBAAA;AAAA;AAAA,EAGlB,QAAA,EAAU,UAAA;AAAA,EACV,QAAA,EAAU,UAAA;AAAA,EACV,aAAA,EAAe,eAAA;AAAA,EACf,SAAA,EAAW,WAAA;AAAA,EACX,kBAAA,EAAoB,oBAAA;AAAA,EACpB,cAAA,EAAgB,gBAAA;AAAA;AAAA,EAGhB,eAAA,EAAiB,iBAAA;AAAA,EACjB,eAAA,EAAiB,iBAAA;AAAA,EACjB,sBAAA,EAAwB,wBAAA;AAAA;AAAA,EAGxB,YAAA,EAAc,cAAA;AAAA,EACd,qBAAA,EAAuB,uBAAA;AAAA;AAAA,EAGvB,SAAA,EAAW,WAAA;AAAA;AAAA,EAGX,YAAA,EAAc,cAAA;AAAA,EACd,gBAAA,EAAkB;AACpB;AAIO,MAAM,4BAA8D,MAAA,CAAO,MAAA;AAAA,EAChF,MAAA,CAAO,OAAO,mBAAmB;AACnC;AASO,MAAM,mBAAA,GAAsB;AAAA,EACjC,YAAA,EAAc,cAAA;AAAA,EACd,iBAAA,EAAmB,mBAAA;AAAA,EACnB,QAAA,EAAU,UAAA;AAAA,EACV,QAAA,EAAU,UAAA;AAAA,EACV,aAAA,EAAe,eAAA;AAAA,EACf,gBAAA,EAAkB,kBAAA;AAAA,EAClB,oBAAA,EAAsB;AACxB;AAOO,MAAM,kBAAA,GAAqB;AAAA,EAChC,YAAA,EAAc,cAAA;AAAA,EACd,iBAAA,EAAmB;AACrB;AAcO,MAAM,eAAA,GAAkB;AAAA;AAAA,EAE7B,YAAA,EAAc,6BAAA;AAAA;AAAA,EAEd,cAAA,EAAgB,CAAC,GAAA,KAAwB,CAAA,yBAAA,EAA4B,GAAG,CAAA,OAAA,CAAA;AAAA;AAAA,EAExE,kBAAA,EAAoB,mCAAA;AAAA;AAAA;AAAA,EAGpB,iBAAA,EAAmB,kCAAA;AAAA;AAAA,EAEnB,kBAAA,EAAoB,mCAAA;AAAA;AAAA,EAEpB,qBAAqB,CAAC,IAAA,KACpB,CAAA,wBAAA,EAA2B,kBAAA,CAAmB,IAAI,CAAC,CAAA,cAAA,CAAA;AAAA;AAAA,EAErD,eAAe,CAAC,IAAA,KACd,CAAA,wBAAA,EAA2B,kBAAA,CAAmB,IAAI,CAAC,CAAA,OAAA,CAAA;AAAA;AAAA,EAErD,QAAQ,gBAAA,CAAiB,MAAA;AAAA;AAAA;AAAA,EAGzB,KAAA,EAAO,eAAA;AAAA;AAAA,EAEP,WAAA,EAAa;AACf;AAGO,MAAM,iBAAiB,eAAA,CAAgB;AACvC,MAAM,uBAAuB,eAAA,CAAgB;AAW7C,MAAM,kBAAA,GAAqB;AAAA;AAAA,EAEhC,qBAAA,EAAuB,uBAAA;AAAA,EACvB,UAAA,EAAY,YAAA;AAAA,EACZ,kBAAA,EAAoB,oBAAA;AAAA,EACpB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,eAAA,EAAiB,iBAAA;AAAA,EACjB,YAAA,EAAc,cAAA;AAAA,EACd,aAAA,EAAe,eAAA;AAAA,EACf,iBAAA,EAAmB,mBAAA;AAAA,EACnB,YAAA,EAAc,cAAA;AAAA,EACd,iBAAA,EAAmB,mBAAA;AAAA,EACnB,eAAA,EAAiB,iBAAA;AAAA,EACjB,cAAA,EAAgB,gBAAA;AAAA,EAChB,eAAA,EAAiB,iBAAA;AAAA,EACjB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,cAAA,EAAgB,gBAAA;AAAA,EAChB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,cAAA,EAAgB,gBAAA;AAAA,EAChB,mBAAA,EAAqB,qBAAA;AAAA,EACrB,iBAAA,EAAmB,mBAAA;AAAA;AAAA,EAGnB,qBAAA,EAAuB,uBAAA;AAAA,EACvB,iBAAA,EAAmB,mBAAA;AAAA,EACnB,yBAAA,EAA2B,2BAAA;AAAA,EAC3B,qBAAA,EAAuB,uBAAA;AAAA,EACvB,SAAA,EAAW,WAAA;AAAA,EACX,wBAAA,EAA0B,0BAAA;AAAA,EAC1B,UAAA,EAAY,YAAA;AAAA,EACZ,SAAA,EAAW,WAAA;AAAA,EACX,WAAA,EAAa,aAAA;AAAA,EACb,QAAA,EAAU,UAAA;AAAA,EACV,eAAA,EAAiB,iBAAA;AAAA,EACjB,eAAA,EAAiB,iBAAA;AAAA,EACjB,qBAAA,EAAuB,uBAAA;AAAA,EACvB,SAAA,EAAW,WAAA;AAAA;AAAA,EAGX,iBAAA,EAAmB,mBAAA;AAAA,EACnB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,UAAA,EAAY,YAAA;AAAA,EACZ,aAAA,EAAe,eAAA;AAAA,EACf,UAAA,EAAY,YAAA;AAAA,EACZ,eAAA,EAAiB,iBAAA;AAAA,EACjB,eAAA,EAAiB,iBAAA;AAAA,EACjB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,sBAAA,EAAwB,wBAAA;AAAA;AAAA,EAGxB,KAAA,EAAO,OAAA;AAAA,EACP,MAAA,EAAQ,QAAA;AAAA,EACR,YAAA,EAAc,cAAA;AAAA,EACd,aAAA,EAAe,eAAA;AAAA,EACf,YAAA,EAAc,cAAA;AAAA,EACd,YAAA,EAAc,cAAA;AAAA,EACd,eAAA,EAAiB,iBAAA;AAAA,EACjB,QAAA,EAAU,UAAA;AAAA,EACV,MAAA,EAAQ,QAAA;AAAA,EACR,eAAA,EAAiB,iBAAA;AAAA,EACjB,QAAA,EAAU,UAAA;AAAA;AAAA,EAGV,iBAAA,EAAmB,mBAAA;AAAA,EACnB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,KAAA,EAAO,OAAA;AAAA,EACP,eAAA,EAAiB,iBAAA;AAAA,EACjB,YAAA,EAAc,cAAA;AAAA,EACd,aAAA,EAAe,eAAA;AAAA,EACf,UAAA,EAAY,YAAA;AAAA,EACZ,gBAAA,EAAkB,kBAAA;AAAA,EAClB,YAAA,EAAc,cAAA;AAAA,EACd,WAAA,EAAa,aAAA;AAAA,EACb,gBAAA,EAAkB,kBAAA;AAAA,EAClB,eAAA,EAAiB,iBAAA;AAAA,EACjB,qBAAA,EAAuB,uBAAA;AAAA,EACvB,WAAA,EAAa,aAAA;AAAA,EACb,SAAA,EAAW,WAAA;AAAA,EACX,gBAAA,EAAkB,kBAAA;AAAA,EAClB,iBAAA,EAAmB,mBAAA;AAAA,EACnB,QAAA,EAAU,UAAA;AAAA,EACV,UAAA,EAAY,YAAA;AAAA,EACZ,UAAA,EAAY,YAAA;AAAA,EACZ,WAAA,EAAa,aAAA;AAAA,EACb,aAAA,EAAe,eAAA;AAAA;AAAA,EAGf,iBAAA,EAAmB,mBAAA;AAAA,EACnB,qBAAA,EAAuB,uBAAA;AAAA,EACvB,sBAAA,EAAwB,wBAAA;AAAA,EACxB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,sBAAA,EAAwB,wBAAA;AAAA,EACxB,yBAAA,EAA2B,2BAAA;AAAA,EAC3B,mBAAA,EAAqB,qBAAA;AAAA;AAAA,EAGrB,kBAAA,EAAoB,oBAAA;AAAA,EACpB,oBAAA,EAAsB,sBAAA;AAAA;AAAA,EAGtB,sBAAA,EAAwB,wBAAA;AAAA,EACxB,sBAAA,EAAwB,+BAAA;AAAA;AAAA,EAExB,KAAA,EAAO,OAAA;AAAA,EACP,QAAA,EAAU,UAAA;AAAA;AAAA,EAGV,WAAA,EAAa,aAAA;AAAA,EACb,eAAA,EAAiB,iBAAA;AAAA,EACjB,cAAA,EAAgB,gBAAA;AAAA,EAChB,gBAAA,EAAkB,kBAAA;AAAA,EAClB,cAAA,EAAgB,gBAAA;AAAA,EAChB,cAAA,EAAgB,gBAAA;AAAA,EAChB,aAAA,EAAe,eAAA;AAAA,EACf,aAAA,EAAe,eAAA;AAAA;AAAA,EAGf,gBAAA,EAAkB,kBAAA;AAAA,EAClB,gBAAA,EAAkB,kBAAA;AAAA;AAAA,EAGlB,YAAA,EAAc,cAAA;AAAA,EACd,gBAAA,EAAkB,kBAAA;AAAA,EAClB,eAAA,EAAiB,iBAAA;AAAA,EACjB,iBAAA,EAAmB,mBAAA;AAAA,EACnB,oBAAA,EAAsB,sBAAA;AAAA,EACtB,cAAA,EAAgB,gBAAA;AAAA;AAAA,EAGhB,cAAA,EAAgB,gBAAA;AAAA,EAChB,aAAA,EAAe,eAAA;AAAA,EACf,cAAA,EAAgB,gBAAA;AAAA,EAChB,aAAA,EAAe,eAAA;AAAA,EACf,WAAA,EAAa;AACf;AAYO,MAAM,0BAAA,uBAAsD,GAAA,CAAY;AAAA;AAAA,EAE7E,gBAAA;AAAA,EACA,uBAAA;AAAA,EACA,kBAAA;AAAA;AAAA,EAEA,qBAAA;AAAA;AAAA,EAEA,SAAA;AAAA,EACA,UAAA;AAAA,EACA,QAAA;AAAA;AAAA,EAEA,aAAA;AAAA,EACA,gBAAA;AAAA,EACA,cAAA;AAAA,EACA,WAAA;AAAA,EACA,iBAAA;AAAA,EACA,aAAA;AAAA,EACA,oBAAA;AAAA,EACA,mBAAA;AAAA;AAAA,EAEA,iCAAA;AAAA,EACA,gCAAA;AAAA,EACA,2BAAA;AAAA;AAAA,EAEA,4BAAA;AAAA;AAAA;AAAA,EAGA,2BAAA;AAAA,EACA,yBAAA;AAAA,EACA;AACF,CAAC;AAIM,SAAS,mBAAmB,MAAA,EAAyB;AAC1D,EAAA,OAAO,0BAAA,CAA2B,IAAI,MAAM,CAAA;AAC9C;AAaO,MAAM,mBAAA,GAAkF;AAAA;AAAA,EAE7F,CAAC,mBAAA,CAAoB,YAAY,GAAG;AAAA,IAClC,kBAAA,CAAmB,qBAAA;AAAA,IACnB,kBAAA,CAAmB,UAAA;AAAA,IACnB,kBAAA,CAAmB,kBAAA;AAAA,IACnB,kBAAA,CAAmB;AAAA,GACrB;AAAA,EACA,CAAC,mBAAA,CAAoB,iBAAiB,GAAG;AAAA,IACvC,kBAAA,CAAmB,eAAA;AAAA,IACnB,kBAAA,CAAmB,YAAA;AAAA,IACnB,kBAAA,CAAmB,aAAA;AAAA,IACnB,kBAAA,CAAmB,iBAAA;AAAA,IACnB,kBAAA,CAAmB,YAAA;AAAA,IACnB,kBAAA,CAAmB,UAAA;AAAA,IACnB,kBAAA,CAAmB,kBAAA;AAAA,IACnB,kBAAA,CAAmB;AAAA,GACrB;AAAA,EACA,CAAC,mBAAA,CAAoB,kBAAkB,GAAG;AAAA,IACxC,kBAAA,CAAmB,iBAAA;AAAA,IACnB,kBAAA,CAAmB;AAAA;AAAA,GAErB;AAAA,EACA,CAAC,mBAAA,CAAoB,YAAY,GAAG;AAAA,IAClC,kBAAA,CAAmB,cAAA;AAAA,IACnB,kBAAA,CAAmB,eAAA;AAAA,IACnB,kBAAA,CAAmB,gBAAA;AAAA,IACnB,kBAAA,CAAmB,cAAA;AAAA,IACnB,kBAAA,CAAmB,oBAAA;AAAA,IACnB,kBAAA,CAAmB;AAAA;AAAA,GAErB;AAAA,EACA,CAAC,mBAAA,CAAoB,iBAAiB,GAAG;AAAA,IACvC,kBAAA,CAAmB,mBAAA;AAAA,IACnB,kBAAA,CAAmB;AAAA;AAAA,GAErB;AAAA,EACA,CAAC,mBAAA,CAAoB,MAAM,GAAG;AAAA,IAC5B,kBAAA,CAAmB,WAAA;AAAA,IACnB,kBAAA,CAAmB,eAAA;AAAA,IACnB,kBAAA,CAAmB,cAAA;AAAA,IACnB,kBAAA,CAAmB,gBAAA;AAAA,IACnB,kBAAA,CAAmB,cAAA;AAAA,IACnB,kBAAA,CAAmB,cAAA;AAAA,IACnB,kBAAA,CAAmB,aAAA;AAAA,IACnB,kBAAA,CAAmB;AAAA,GACrB;AAAA;AAAA,EAGA,CAAC,mBAAA,CAAoB,gBAAgB,GAAG;AAAA,IACtC,kBAAA,CAAmB,iBAAA;AAAA,IACnB,kBAAA,CAAmB,gBAAA;AAAA,IACnB,kBAAA,CAAmB,UAAA;AAAA,IACnB,kBAAA,CAAmB,aAAA;AAAA,IACnB,kBAAA,CAAmB,UAAA;AAAA,IACnB,kBAAA,CAAmB;AAAA,GACrB;AAAA,EACA,CAAC,mBAAA,CAAoB,eAAe,GAAG;AAAA,IACrC,kBAAA,CAAmB,eAAA;AAAA,IACnB,kBAAA,CAAmB,gBAAA;AAAA,IACnB,kBAAA,CAAmB;AAAA,GACrB;AAAA;AAAA,EAGA,CAAC,mBAAA,CAAoB,eAAe,GAAG;AAAA,IACrC,kBAAA,CAAmB,iBAAA;AAAA,IACnB,kBAAA,CAAmB,gBAAA;AAAA,IACnB,kBAAA,CAAmB,gBAAA;AAAA,IACnB,kBAAA,CAAmB;AAAA;AAAA,GAErB;AAAA,EACA,CAAC,mBAAA,CAAoB,iBAAiB,GAAG;AAAA,IACvC,kBAAA,CAAmB,YAAA;AAAA,IACnB,kBAAA,CAAmB,aAAA;AAAA,IACnB,kBAAA,CAAmB,UAAA;AAAA,IACnB,kBAAA,CAAmB,gBAAA;AAAA,IACnB,kBAAA,CAAmB,YAAA;AAAA,IACnB,kBAAA,CAAmB,WAAA;AAAA,IACnB,kBAAA,CAAmB;AAAA;AAAA,GAErB;AAAA,EACA,CAAC,mBAAA,CAAoB,gBAAgB,GAAG;AAAA,IACtC,kBAAA,CAAmB,eAAA;AAAA,IACnB,kBAAA,CAAmB;AAAA,GACrB;AAAA,EACA,CAAC,mBAAA,CAAoB,aAAa,GAAG;AAAA,IACnC,kBAAA,CAAmB,WAAA;AAAA,IACnB,kBAAA,CAAmB,SAAA;AAAA,IACnB,kBAAA,CAAmB,gBAAA;AAAA,IACnB,kBAAA,CAAmB,iBAAA;AAAA,IACnB,kBAAA,CAAmB;AAAA;AAAA,GAErB;AAAA,EACA,CAAC,mBAAA,CAAoB,gBAAgB,GAAG;AAAA,IACtC,kBAAA,CAAmB,UAAA;AAAA,IACnB,kBAAA,CAAmB,UAAA;AAAA,IACnB,kBAAA,CAAmB,WAAA;AAAA,IACnB,kBAAA,CAAmB;AAAA;AAAA,GAErB;AAAA;AAAA,EAGA,CAAC,mBAAA,CAAoB,QAAQ,GAAG,EAAC;AAAA;AAAA,EACjC,CAAC,mBAAA,CAAoB,QAAQ,GAAG,EAAC;AAAA,EACjC,CAAC,mBAAA,CAAoB,aAAa,GAAG,EAAC;AAAA,EACtC,CAAC,mBAAA,CAAoB,SAAS,GAAG;AAAA,IAC/B,kBAAA,CAAmB,qBAAA;AAAA,IACnB,kBAAA,CAAmB;AAAA,GACrB;AAAA,EACA,CAAC,mBAAA,CAAoB,kBAAkB,GAAG;AAAA,IACxC,kBAAA,CAAmB,yBAAA;AAAA,IACnB,kBAAA,CAAmB;AAAA,GACrB;AAAA,EACA,CAAC,mBAAA,CAAoB,cAAc,GAAG;AAAA,IACpC,kBAAA,CAAmB,SAAA;AAAA,IACnB,kBAAA,CAAmB,wBAAA;AAAA,IACnB,kBAAA,CAAmB,UAAA;AAAA,IACnB,kBAAA,CAAmB,SAAA;AAAA,IACnB,kBAAA,CAAmB,WAAA;AAAA,IACnB,kBAAA,CAAmB,QAAA;AAAA,IACnB,kBAAA,CAAmB,eAAA;AAAA,IACnB,kBAAA,CAAmB,eAAA;AAAA,IACnB,kBAAA,CAAmB,qBAAA;AAAA,IACnB,kBAAA,CAAmB;AAAA;AAAA,GAErB;AAAA;AAAA,EAGA,CAAC,mBAAA,CAAoB,eAAe,GAAG;AAAA,IACrC,kBAAA,CAAmB,KAAA;AAAA,IACnB,kBAAA,CAAmB,MAAA;AAAA,IACnB,kBAAA,CAAmB;AAAA;AAAA,GAErB;AAAA,EACA,CAAC,mBAAA,CAAoB,eAAe,GAAG;AAAA,IACrC,kBAAA,CAAmB,aAAA;AAAA,IACnB,kBAAA,CAAmB,YAAA;AAAA,IACnB,kBAAA,CAAmB;AAAA,GACrB;AAAA,EACA,CAAC,mBAAA,CAAoB,sBAAsB,GAAG;AAAA,IAC5C,kBAAA,CAAmB,eAAA;AAAA,IACnB,kBAAA,CAAmB,QAAA;AAAA,IACnB,kBAAA,CAAmB,MAAA;AAAA,IACnB,kBAAA,CAAmB,eAAA;AAAA,IACnB,kBAAA,CAAmB;AAAA,GACrB;AAAA;AAAA,EAGA,CAAC,mBAAA,CAAoB,YAAY,GAAG;AAAA,IAClC,kBAAA,CAAmB,iBAAA;AAAA,IACnB,kBAAA,CAAmB,qBAAA;AAAA,IACnB,kBAAA,CAAmB,sBAAA;AAAA,IACnB,kBAAA,CAAmB,oBAAA;AAAA,IACnB,kBAAA,CAAmB,sBAAA;AAAA,IACnB,kBAAA,CAAmB,yBAAA;AAAA,IACnB,kBAAA,CAAmB;AAAA,GACrB;AAAA,EACA,CAAC,mBAAA,CAAoB,qBAAqB,GAAG;AAAA,IAC3C,kBAAA,CAAmB,kBAAA;AAAA,IACnB,kBAAA,CAAmB;AAAA,GACrB;AAAA;AAAA,EAGA,CAAC,mBAAA,CAAoB,SAAS,GAAG;AAAA,IAC/B,kBAAA,CAAmB,gBAAA;AAAA,IACnB,kBAAA,CAAmB;AAAA;AAAA,GAErB;AAAA;AAAA;AAAA,EAIA,CAAC,mBAAA,CAAoB,YAAY,GAAG;AAAA,IAClC,kBAAA,CAAmB,YAAA;AAAA,IACnB,kBAAA,CAAmB,gBAAA;AAAA,IACnB,kBAAA,CAAmB,eAAA;AAAA,IACnB,kBAAA,CAAmB,iBAAA;AAAA,IACnB,kBAAA,CAAmB,oBAAA;AAAA,IACnB,kBAAA,CAAmB;AAAA,GACrB;AAAA,EACA,CAAC,mBAAA,CAAoB,gBAAgB,GAAG;AAAA;AAAA,IAEtC,kBAAA,CAAmB,aAAA;AAAA,IACnB,kBAAA,CAAmB,cAAA;AAAA,IACnB,kBAAA,CAAmB,aAAA;AAAA,IACnB,kBAAA,CAAmB;AAAA;AAAA;AAAA;AAIvB;AAMO,MAAM,eAAA,GAAkB;AAAA;AAAA,EAE7B,kBAAA,EAAoB,CAAA;AAAA,EACpB,0BAAA,EAA4B,GAAA;AAAA,EAC5B,qBAAA,EAAuB,EAAA;AAAA;AAAA,EAEvB,iCAAA,EAAmC,EAAA;AAAA;AAAA,EAEnC,8BAAA,EAAgC,IAAA;AAAA;AAAA,EAEhC,oBAAA,EAAsB;AACxB;;AC9gBA,MAAM,UAAA,GAAa,CAAC,MAAA,EAAgB,IAAA,MAAyC;AAAA,EAC3E,MAAA;AAAA,EACA,aAAa,IAAA,EAAM,WAAA;AAAA,EACnB,iBAAiB,IAAA,EAAM;AACzB,CAAA,CAAA;AAGO,SAAS,gBAAA,CACd,IAAA,EACA,IAAA,EACA,UAAA,EACA,QACA,IAAA,EACyB;AACzB,EAAA,OAAO,uBAAA,CAAwB,IAAA,EAAM,IAAA,EAAM,UAAA,EAAY,QAAQ,IAAI,CAAA;AACrE;AAOO,SAAS,uBAAA,CACd,IAAA,EACA,IAAA,EACA,UAAA,EACA,QACA,IAAA,EACyB;AACzB,EAAA,OAAO,KAAK,GAAA,CAAoB,IAAA,CAAK,cAAA,CAAe,IAAA,EAAM,UAAU,CAAA,EAAG;AAAA,IACrE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,UAAA,CAAW,MAAA,IAAU,IAAI,IAAI;AAAA,GACpC,CAAA;AACH;AAGO,SAAS,oBAAA,CACd,IAAA,EACA,QAAA,EACA,UAAA,EACA,QACA,IAAA,EACyB;AACzB,EAAA,OAAO,IAAA,CAAK,GAAA,CAAoB,gBAAA,CAAiB,QAAA,EAAU,UAAU,CAAA,EAAG;AAAA,IACtE,MAAA,EAAQ,MAAA;AAAA,IACR,IAAA,EAAM,UAAA,CAAW,MAAA,IAAU,IAAI,IAAI;AAAA,GACpC,CAAA;AACH;AAEA,SAAS,gBAAA,CAAiB,UAAkB,UAAA,EAA4B;AACtE,EAAA,OAAO,CAAA,sBAAA,EAAyB,QAAQ,CAAA,SAAA,EAAY,UAAU,CAAA,CAAA;AAChE;;AC8OO,SAAS,kBAAkB,IAAA,EAAsC;AACtE,EAAA,MAAM,MAAA,GAAS,CAAC,IAAA,EAAc,IAAA,EAAwB,MAAA,EAAiB,IAAA,KACrE,gBAAA,CAAiB,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,IAAI,CAAA;AACjD,EAAA,MAAM,OAAA,GAAU,CACd,QAAA,EACA,IAAA,EACA,MAAA,EACA,IAAA,KACG,oBAAA,CAAqB,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,MAAA,EAAQ,IAAI,CAAA;AAE5D,EAAA,OAAO;AAAA;AAAA,IAGL,mBAAA,EAAqB,CAAC,MAAA,EAAQ,IAAA,KAC5B,QAAQ,cAAA,EAAgB,kBAAA,CAAmB,qBAAA,EAAuB,MAAA,EAAQ,IAAI,CAAA;AAAA,IAEhF,UAAA,EAAY,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,KAAS,OAAO,IAAA,EAAM,kBAAA,CAAmB,UAAA,EAAY,MAAA,EAAQ,IAAI,CAAA;AAAA,IAC5F,iBAAA,EAAmB,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,KAChC,OAAO,IAAA,EAAM,kBAAA,CAAmB,kBAAA,EAAoB,MAAA,EAAQ,IAAI,CAAA;AAAA,IAClE,iBAAA,EAAmB,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,KAChC,OAAO,IAAA,EAAM,kBAAA,CAAmB,kBAAA,EAAoB,MAAA,EAAQ,IAAI,CAAA;AAAA,IAElE,cAAA,EAAgB,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,KAC7B,OAAO,IAAA,EAAM,kBAAA,CAAmB,eAAA,EAAiB,MAAA,EAAQ,IAAI,CAAA;AAAA,IAC/D,WAAA,EAAa,CAAC,IAAA,EAAM,IAAA,KAAS,OAAO,IAAA,EAAM,kBAAA,CAAmB,YAAA,EAAc,MAAA,EAAW,IAAI,CAAA;AAAA,IAC1F,YAAA,EAAc,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,KAC3B,OAAO,IAAA,EAAM,kBAAA,CAAmB,aAAA,EAAe,MAAA,EAAQ,IAAI,CAAA;AAAA,IAC7D,gBAAA,EAAkB,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,KAC/B,OAAO,IAAA,EAAM,kBAAA,CAAmB,iBAAA,EAAmB,MAAA,EAAQ,IAAI,CAAA;AAAA,IACjE,WAAA,EAAa,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,KAC1B,OAAO,IAAA,EAAM,kBAAA,CAAmB,YAAA,EAAc,MAAA,EAAQ,IAAI,CAAA;AAAA,IAE5D,gBAAA,EAAkB,CAAC,YAAA,EAAc,MAAA,EAAQ,IAAA,KACvC,OAAO,YAAA,EAAc,kBAAA,CAAmB,iBAAA,EAAmB,MAAA,EAAQ,IAAI,CAAA;AAAA,IACzE,cAAA,EAAgB,CAAC,MAAA,EAAQ,IAAA,KACvB,QAAQ,oBAAA,EAAsB,kBAAA,CAAmB,iBAAA,EAAmB,MAAA,EAAQ,IAAI,CAAA;AAAA,IAClF,cAAA,EAAgB,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,KAC7B,OAAO,IAAA,EAAM,kBAAA,CAAmB,eAAA,EAAiB,MAAA,EAAQ,IAAI,CAAA;AAAA,IAE/D,aAAA,EAAe,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,KAC5B,OAAO,IAAA,EAAM,kBAAA,CAAmB,cAAA,EAAgB,MAAA,EAAQ,IAAI,CAAA;AAAA,IAC9D,cAAA,EAAgB,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,KAC7B,OAAO,IAAA,EAAM,kBAAA,CAAmB,eAAA,EAAiB,MAAA,EAAQ,IAAI,CAAA;AAAA,IAC/D,eAAA,EAAiB,CAAC,IAAA,EAAM,IAAA,KACtB,OAAO,IAAA,EAAM,kBAAA,CAAmB,gBAAA,EAAkB,MAAA,EAAW,IAAI,CAAA;AAAA,IACnE,aAAA,EAAe,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,KAC5B,OAAO,IAAA,EAAM,kBAAA,CAAmB,cAAA,EAAgB,MAAA,EAAQ,IAAI,CAAA;AAAA,IAC9D,kBAAA,EAAoB,CAAC,IAAA,EAAM,IAAA,KACzB,OAAO,IAAA,EAAM,kBAAA,CAAmB,oBAAA,EAAsB,MAAA,EAAW,IAAI,CAAA;AAAA,IACvE,aAAA,EAAe,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,KAC5B,OAAO,IAAA,EAAM,kBAAA,CAAmB,cAAA,EAAgB,MAAA,EAAQ,IAAI,CAAA;AAAA,IAE9D,kBAAA,EAAoB,CAAC,MAAA,EAAQ,IAAA,KAC3B,QAAQ,mBAAA,EAAqB,kBAAA,CAAmB,mBAAA,EAAqB,MAAA,EAAQ,IAAI,CAAA;AAAA,IACnF,gBAAA,EAAkB,CAAC,IAAA,EAAM,IAAA,KACvB,OAAO,IAAA,EAAM,kBAAA,CAAmB,iBAAA,EAAmB,MAAA,EAAW,IAAI,CAAA;AAAA;AAAA,IAIpE,mBAAA,EAAqB,CAAC,IAAA,EAAM,IAAA,KAC1B,OAAO,IAAA,EAAM,kBAAA,CAAmB,qBAAA,EAAuB,MAAA,EAAW,IAAI,CAAA;AAAA,IACxE,eAAA,EAAiB,CAAC,IAAA,EAAM,IAAA,KACtB,OAAO,IAAA,EAAM,kBAAA,CAAmB,iBAAA,EAAmB,MAAA,EAAW,IAAI,CAAA;AAAA,IACpE,uBAAA,EAAyB,CAAC,IAAA,EAAM,IAAA,KAC9B,OAAO,IAAA,EAAM,kBAAA,CAAmB,yBAAA,EAA2B,MAAA,EAAW,IAAI,CAAA;AAAA,IAC5E,mBAAA,EAAqB,CAAC,IAAA,EAAM,IAAA,KAC1B,OAAO,IAAA,EAAM,kBAAA,CAAmB,qBAAA,EAAuB,MAAA,EAAW,IAAI,CAAA;AAAA,IAExE,QAAA,EAAU,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,KAAS,OAAO,IAAA,EAAM,kBAAA,CAAmB,SAAA,EAAW,MAAA,EAAQ,IAAI,CAAA;AAAA,IACzF,qBAAA,EAAuB,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,KACpC,OAAO,IAAA,EAAM,kBAAA,CAAmB,wBAAA,EAA0B,MAAA,EAAQ,IAAI,CAAA;AAAA,IACxE,SAAA,EAAW,CAAC,IAAA,EAAM,IAAA,KAAS,OAAO,IAAA,EAAM,kBAAA,CAAmB,UAAA,EAAY,MAAA,EAAW,IAAI,CAAA;AAAA,IACtF,QAAA,EAAU,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,KAAS,OAAO,IAAA,EAAM,kBAAA,CAAmB,SAAA,EAAW,MAAA,EAAQ,IAAI,CAAA;AAAA,IACzF,UAAA,EAAY,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,KAAS,OAAO,IAAA,EAAM,kBAAA,CAAmB,WAAA,EAAa,MAAA,EAAQ,IAAI,CAAA;AAAA,IAC7F,OAAA,EAAS,CAAC,IAAA,EAAM,IAAA,KAAS,OAAO,IAAA,EAAM,kBAAA,CAAmB,QAAA,EAAU,MAAA,EAAW,IAAI,CAAA;AAAA,IAClF,aAAA,EAAe,CAAC,IAAA,EAAM,IAAA,KACpB,OAAO,IAAA,EAAM,kBAAA,CAAmB,eAAA,EAAiB,MAAA,EAAW,IAAI,CAAA;AAAA,IAClE,aAAA,EAAe,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,KAC5B,OAAO,IAAA,EAAM,kBAAA,CAAmB,eAAA,EAAiB,MAAA,EAAQ,IAAI,CAAA;AAAA,IAC/D,mBAAA,EAAqB,CAAC,IAAA,EAAM,IAAA,KAC1B,OAAO,IAAA,EAAM,kBAAA,CAAmB,qBAAA,EAAuB,MAAA,EAAW,IAAI,CAAA;AAAA,IACxE,QAAA,EAAU,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,KAAS,OAAO,IAAA,EAAM,kBAAA,CAAmB,SAAA,EAAW,MAAA,EAAQ,IAAI;AAAA,GAC3F;AACF;;ACtIO,SAAS,kBAAkB,IAAA,EAAgC;AAEhE,EAAA,MAAM,MAAA,GAAS,CAAC,IAAA,EAAc,IAAA,EAAwB,MAAA,EAAiB,IAAA,KACrE,gBAAA,CAAiB,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,IAAI,CAAA;AACjD,EAAA,MAAM,OAAA,GAAU,CACd,QAAA,EACA,IAAA,EACA,MAAA,EACA,IAAA,KACG,oBAAA,CAAqB,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,MAAA,EAAQ,IAAI,CAAA;AAE5D,EAAA,OAAO;AAAA,IACL,gBAAA,EAAkB,CAAC,IAAA,EAAM,IAAA,KACvB,OAAO,IAAA,EAAM,kBAAA,CAAmB,iBAAA,EAAmB,MAAA,EAAW,IAAI,CAAA;AAAA,IACpE,eAAA,EAAiB,CAAC,IAAA,EAAM,IAAA,KACtB,OAAO,IAAA,EAAM,kBAAA,CAAmB,gBAAA,EAAkB,MAAA,EAAW,IAAI,CAAA;AAAA,IACnE,SAAA,EAAW,CAAC,MAAA,EAAQ,IAAA,KAClB,QAAQ,kBAAA,EAAoB,kBAAA,CAAmB,UAAA,EAAY,MAAA,EAAQ,IAAI,CAAA;AAAA,IACzE,YAAA,EAAc,CAAC,IAAA,EAAM,IAAA,KAAS,OAAO,IAAA,EAAM,kBAAA,CAAmB,aAAA,EAAe,MAAA,EAAW,IAAI,CAAA;AAAA,IAC5F,SAAA,EAAW,CAAC,MAAA,EAAQ,IAAA,KAClB,QAAQ,kBAAA,EAAoB,kBAAA,CAAmB,UAAA,EAAY,MAAA,EAAQ,IAAI,CAAA;AAAA,IACzE,aAAA,EAAe,CAAC,IAAA,EAAM,IAAA,KACpB,OAAO,IAAA,EAAM,kBAAA,CAAmB,eAAA,EAAiB,MAAA,EAAW,IAAI,CAAA;AAAA,IAClE,cAAA,EAAgB,CAAC,MAAA,EAAQ,IAAA,KACvB,QAAQ,iBAAA,EAAmB,kBAAA,CAAmB,eAAA,EAAiB,MAAA,EAAQ,IAAI,CAAA;AAAA,IAC7E,eAAA,EAAiB,CAAC,IAAA,EAAM,IAAA,KACtB,OAAO,IAAA,EAAM,kBAAA,CAAmB,gBAAA,EAAkB,MAAA,EAAW,IAAI,CAAA;AAAA,IACnE,oBAAA,EAAsB,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,KACnC,MAAA,CAAO,IAAA,EAAM,kBAAA,CAAmB,sBAAA,EAAwB,EAAE,MAAA,EAAQ,MAAA,IAAU,IAAI,CAAA;AAAA;AAAA,IAGlF,KAAA,EAAO,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,KAAS,OAAO,IAAA,EAAM,kBAAA,CAAmB,KAAA,EAAO,MAAA,EAAQ,IAAI,CAAA;AAAA,IAClF,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,KAAS,OAAO,IAAA,EAAM,kBAAA,CAAmB,MAAA,EAAQ,MAAA,EAAQ,IAAI,CAAA;AAAA,IACpF,WAAA,EAAa,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,KAC1B,OAAO,IAAA,EAAM,kBAAA,CAAmB,YAAA,EAAc,MAAA,EAAQ,IAAI,CAAA;AAAA;AAAA,IAG5D,YAAA,EAAc,CAAC,IAAA,EAAM,IAAA,KAAS,OAAO,IAAA,EAAM,kBAAA,CAAmB,aAAA,EAAe,MAAA,EAAW,IAAI,CAAA;AAAA,IAC5F,WAAA,EAAa,CAAC,IAAA,EAAM,IAAA,KAAS,OAAO,IAAA,EAAM,kBAAA,CAAmB,YAAA,EAAc,MAAA,EAAW,IAAI,CAAA;AAAA,IAC1F,WAAA,EAAa,CAAC,IAAA,EAAM,IAAA,KAAS,OAAO,IAAA,EAAM,kBAAA,CAAmB,YAAA,EAAc,MAAA,EAAW,IAAI,CAAA;AAAA;AAAA,IAG1F,cAAA,EAAgB,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,KAC7B,OAAO,IAAA,EAAM,kBAAA,CAAmB,eAAA,EAAiB,MAAA,EAAQ,IAAI,CAAA;AAAA,IAC/D,QAAA,EAAU,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,KAAS,OAAO,IAAA,EAAM,kBAAA,CAAmB,QAAA,EAAU,MAAA,EAAQ,IAAI,CAAA;AAAA,IACxF,MAAA,EAAQ,CAAC,IAAA,EAAM,IAAA,KAAS,OAAO,IAAA,EAAM,kBAAA,CAAmB,MAAA,EAAQ,MAAA,EAAW,IAAI,CAAA;AAAA,IAC/E,cAAA,EAAgB,CAAC,IAAA,EAAM,IAAA,KACrB,OAAO,IAAA,EAAM,kBAAA,CAAmB,eAAA,EAAiB,MAAA,EAAW,IAAI,CAAA;AAAA,IAClE,QAAA,EAAU,CAAC,IAAA,EAAM,IAAA,KAAS,OAAO,IAAA,EAAM,kBAAA,CAAmB,QAAA,EAAU,MAAA,EAAW,IAAI;AAAA,GACrF;AACF;;ACxHO,SAAS,qBAAqB,IAAA,EAAmC;AAEtE,EAAA,MAAM,MAAA,GAAS,CAAC,IAAA,EAAc,IAAA,EAAwB,MAAA,EAAiB,IAAA,KACrE,gBAAA,CAAiB,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,IAAI,CAAA;AACjD,EAAA,MAAM,OAAA,GAAU,CACd,QAAA,EACA,IAAA,EACA,MAAA,EACA,IAAA,KACG,oBAAA,CAAqB,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,MAAA,EAAQ,IAAI,CAAA;AAE5D,EAAA,OAAO;AAAA;AAAA,IAEL,gBAAA,EAAkB,CAAC,IAAA,EAAM,IAAA,KACvB,OAAO,IAAA,EAAM,kBAAA,CAAmB,iBAAA,EAAmB,MAAA,EAAW,IAAI,CAAA;AAAA,IACpE,eAAA,EAAiB,CAAC,IAAA,EAAM,IAAA,KACtB,OAAO,IAAA,EAAM,kBAAA,CAAmB,gBAAA,EAAkB,MAAA,EAAW,IAAI,CAAA;AAAA,IACnE,eAAA,EAAiB,CAAC,IAAA,EAAM,IAAA,KACtB,OAAO,IAAA,EAAM,kBAAA,CAAmB,gBAAA,EAAkB,MAAA,EAAW,IAAI,CAAA;AAAA,IACnE,KAAA,EAAO,CAAC,IAAA,EAAM,IAAA,KAAS,OAAO,IAAA,EAAM,kBAAA,CAAmB,KAAA,EAAO,MAAA,EAAW,IAAI,CAAA;AAAA;AAAA,IAG7E,cAAA,EAAgB,CAAC,MAAA,EAAQ,IAAA,KACvB,QAAQ,mBAAA,EAAqB,kBAAA,CAAmB,eAAA,EAAiB,MAAA,EAAQ,IAAI,CAAA;AAAA,IAC/E,WAAA,EAAa,CAAC,IAAA,EAAM,IAAA,KAAS,OAAO,IAAA,EAAM,kBAAA,CAAmB,YAAA,EAAc,MAAA,EAAW,IAAI,CAAA;AAAA,IAC1F,YAAA,EAAc,CAAC,IAAA,EAAM,IAAA,KAAS,OAAO,IAAA,EAAM,kBAAA,CAAmB,aAAA,EAAe,MAAA,EAAW,IAAI,CAAA;AAAA,IAC5F,SAAA,EAAW,CAAC,IAAA,EAAM,IAAA,KAAS,OAAO,IAAA,EAAM,kBAAA,CAAmB,UAAA,EAAY,MAAA,EAAW,IAAI,CAAA;AAAA,IACtF,eAAA,EAAiB,CAAC,MAAA,EAAQ,IAAA,KACxB,QAAQ,mBAAA,EAAqB,kBAAA,CAAmB,gBAAA,EAAkB,MAAA,EAAQ,IAAI,CAAA;AAAA,IAChF,WAAA,EAAa,CAAC,MAAA,EAAQ,IAAA,KACpB,QAAQ,mBAAA,EAAqB,kBAAA,CAAmB,YAAA,EAAc,MAAA,EAAQ,IAAI,CAAA;AAAA,IAC5E,UAAA,EAAY,CAAC,IAAA,EAAM,IAAA,KAAS,OAAO,IAAA,EAAM,kBAAA,CAAmB,WAAA,EAAa,MAAA,EAAW,IAAI,CAAA;AAAA,IACxF,eAAA,EAAiB,CAAC,IAAA,EAAM,IAAA,KACtB,OAAO,IAAA,EAAM,kBAAA,CAAmB,gBAAA,EAAkB,MAAA,EAAW,IAAI,CAAA;AAAA;AAAA,IAGnE,cAAA,EAAgB,CAAC,MAAA,EAAQ,IAAA,KACvB,QAAQ,kBAAA,EAAoB,kBAAA,CAAmB,eAAA,EAAiB,MAAA,EAAQ,IAAI,CAAA;AAAA,IAC9E,mBAAA,EAAqB,CAAC,MAAA,EAAQ,IAAA,KAC5B,QAAQ,kBAAA,EAAoB,kBAAA,CAAmB,qBAAA,EAAuB,MAAA,EAAQ,IAAI,CAAA;AAAA;AAAA,IAGpF,WAAA,EAAa,CAAC,IAAA,EAAM,IAAA,KAAS,OAAO,IAAA,EAAM,kBAAA,CAAmB,WAAA,EAAa,MAAA,EAAW,IAAI,CAAA;AAAA,IACzF,SAAA,EAAW,CAAC,IAAA,EAAM,IAAA,KAAS,OAAO,IAAA,EAAM,kBAAA,CAAmB,SAAA,EAAW,MAAA,EAAW,IAAI,CAAA;AAAA,IACrF,eAAA,EAAiB,CAAC,MAAA,EAAQ,IAAA,KACxB,QAAQ,eAAA,EAAiB,kBAAA,CAAmB,gBAAA,EAAkB,MAAA,EAAQ,IAAI,CAAA;AAAA,IAC5E,gBAAA,EAAkB,CAAC,IAAA,EAAM,IAAA,KACvB,OAAO,IAAA,EAAM,kBAAA,CAAmB,iBAAA,EAAmB,MAAA,EAAW,IAAI,CAAA;AAAA,IACpE,QAAA,EAAU,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,KAAS,OAAO,IAAA,EAAM,kBAAA,CAAmB,QAAA,EAAU,MAAA,EAAQ,IAAI,CAAA;AAAA;AAAA,IAGxF,SAAA,EAAW,CAAC,MAAA,EAAQ,IAAA,KAClB,QAAQ,kBAAA,EAAoB,kBAAA,CAAmB,UAAA,EAAY,MAAA,EAAQ,IAAI,CAAA;AAAA,IACzE,SAAA,EAAW,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,KAAS,OAAO,IAAA,EAAM,kBAAA,CAAmB,UAAA,EAAY,MAAA,EAAQ,IAAI,CAAA;AAAA,IAC3F,UAAA,EAAY,CAAC,IAAA,EAAM,IAAA,KAAS,OAAO,IAAA,EAAM,kBAAA,CAAmB,WAAA,EAAa,MAAA,EAAW,IAAI,CAAA;AAAA,IACxF,YAAA,EAAc,CAAC,IAAA,EAAM,IAAA,KAAS,OAAO,IAAA,EAAM,kBAAA,CAAmB,aAAA,EAAe,MAAA,EAAW,IAAI;AAAA,GAC9F;AACF;;AC4BO,SAAS,oBAAoB,IAAA,EAAkC;AACpE,EAAA,MAAM,MAAA,GAAS,CAAC,IAAA,EAAc,IAAA,EAAwB,MAAA,EAAiB,IAAA,KACrE,gBAAA,CAAiB,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,IAAI,CAAA;AACjD,EAAA,MAAM,OAAA,GAAU,CACd,QAAA,EACA,IAAA,EACA,MAAA,EACA,IAAA,KACG,oBAAA,CAAqB,IAAA,EAAM,QAAA,EAAU,IAAA,EAAM,MAAA,EAAQ,IAAI,CAAA;AAC5D,EAAA,MAAM,aAAA,GAAgB,CAAC,IAAA,EAAc,IAAA,EAAc,MAAA,EAAiB,IAAA,KAClE,uBAAA,CAAwB,IAAA,EAAM,IAAA,EAAM,IAAA,EAAM,MAAA,EAAQ,IAAI,CAAA;AACxD,EAAA,MAAM,CAAA,GAAI,kBAAA;AAEV,EAAA,OAAO;AAAA,IACL,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,KAAS,OAAO,IAAA,EAAM,CAAA,CAAE,iBAAA,EAAmB,MAAA,EAAQ,IAAI,CAAA;AAAA,MAC5E,QAAA,EAAU,CAAC,IAAA,EAAM,IAAA,KAAS,OAAO,IAAA,EAAM,CAAA,CAAE,qBAAA,EAAuB,MAAA,EAAW,IAAI,CAAA;AAAA,MAC/E,QAAA,EAAU,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,KAAS,OAAO,IAAA,EAAM,CAAA,CAAE,sBAAA,EAAwB,MAAA,EAAQ,IAAI,CAAA;AAAA,MACrF,OAAA,EAAS,CAAC,IAAA,EAAM,IAAA,KAAS,OAAO,IAAA,EAAM,CAAA,CAAE,oBAAA,EAAsB,MAAA,EAAW,IAAI,CAAA;AAAA,MAC7E,SAAA,EAAW,CAAC,IAAA,EAAM,IAAA,KAAS,OAAO,IAAA,EAAM,CAAA,CAAE,sBAAA,EAAwB,MAAA,EAAW,IAAI,CAAA;AAAA,MACjF,YAAA,EAAc,CAAC,IAAA,EAAM,IAAA,KAAS,OAAO,IAAA,EAAM,CAAA,CAAE,yBAAA,EAA2B,MAAA,EAAW,IAAI,CAAA;AAAA,MACvF,MAAA,EAAQ,CAAC,IAAA,EAAM,IAAA,KAAS,OAAO,IAAA,EAAM,CAAA,CAAE,mBAAA,EAAqB,MAAA,EAAW,IAAI;AAAA,KAC7E;AAAA,IAEA,UAAA,EAAY;AAAA,MACV,OAAA,EAAS,CAAC,IAAA,EAAM,IAAA,KAAS,OAAO,IAAA,EAAM,CAAA,CAAE,kBAAA,EAAoB,MAAA,EAAW,IAAI,CAAA;AAAA,MAC3E,SAAA,EAAW,CAAC,IAAA,EAAM,IAAA,KAAS,OAAO,IAAA,EAAM,CAAA,CAAE,oBAAA,EAAsB,MAAA,EAAW,IAAI;AAAA,KACjF;AAAA,IAEA,MAAA,EAAQ;AAAA,MACN,IAAA,EAAM,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,KAAS,OAAO,IAAA,EAAM,CAAA,CAAE,WAAA,EAAa,MAAA,EAAQ,IAAI,CAAA;AAAA,MACtE,QAAA,EAAU,CAAC,IAAA,EAAM,IAAA,KAAS,OAAO,IAAA,EAAM,CAAA,CAAE,eAAA,EAAiB,MAAA,EAAW,IAAI,CAAA;AAAA,MACzE,OAAA,EAAS,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,KAAS,OAAO,IAAA,EAAM,CAAA,CAAE,cAAA,EAAgB,MAAA,EAAQ,IAAI,CAAA;AAAA,MAC5E,SAAA,EAAW,CAAC,IAAA,EAAM,IAAA,KAAS,OAAO,IAAA,EAAM,CAAA,CAAE,gBAAA,EAAkB,MAAA,EAAW,IAAI,CAAA;AAAA,MAC3E,OAAA,EAAS,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,KAAS,OAAO,IAAA,EAAM,CAAA,CAAE,cAAA,EAAgB,MAAA,EAAQ,IAAI,CAAA;AAAA,MAC5E,OAAA,EAAS,CAAC,IAAA,EAAM,IAAA,KAAS,OAAO,IAAA,EAAM,CAAA,CAAE,cAAA,EAAgB,MAAA,EAAW,IAAI,CAAA;AAAA,MACvE,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,KAAS,OAAO,IAAA,EAAM,CAAA,CAAE,aAAA,EAAe,MAAA,EAAQ,IAAI,CAAA;AAAA,MAC1E,MAAA,EAAQ,CAAC,IAAA,EAAM,IAAA,KAAS,OAAO,IAAA,EAAM,CAAA,CAAE,aAAA,EAAe,MAAA,EAAW,IAAI;AAAA,KACvE;AAAA,IAEA,QAAA,EAAU;AAAA,MACR,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,KAAS,OAAO,IAAA,EAAM,CAAA,CAAE,gBAAA,EAAkB,MAAA,EAAQ,IAAI,CAAA;AAAA,MAC7E,MAAA,EAAQ,CAAC,IAAA,EAAM,IAAA,KAAS,OAAO,IAAA,EAAM,CAAA,CAAE,gBAAA,EAAkB,MAAA,EAAW,IAAI;AAAA,KAC1E;AAAA,IAEA,WAAA,EAAa;AAAA,MACX,IAAA,EAAM,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,KAAS,OAAO,IAAA,EAAM,CAAA,CAAE,YAAA,EAAc,MAAA,EAAQ,IAAI,CAAA;AAAA,MACvE,QAAA,EAAU,CAAC,IAAA,EAAM,IAAA,KAAS,OAAO,IAAA,EAAM,CAAA,CAAE,gBAAA,EAAkB,MAAA,EAAW,IAAI,CAAA;AAAA,MAC1E,OAAA,EAAS,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,KAAS,OAAO,IAAA,EAAM,CAAA,CAAE,eAAA,EAAiB,MAAA,EAAQ,IAAI,CAAA;AAAA,MAC7E,SAAA,EAAW,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,KAAS,OAAO,IAAA,EAAM,CAAA,CAAE,iBAAA,EAAmB,MAAA,EAAQ,IAAI,CAAA;AAAA,MACjF,YAAA,EAAc,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,KAAS,OAAO,IAAA,EAAM,CAAA,CAAE,oBAAA,EAAsB,MAAA,EAAQ,IAAI,CAAA;AAAA,MACvF,MAAA,EAAQ,CAAC,IAAA,EAAM,IAAA,KAAS,OAAO,IAAA,EAAM,CAAA,CAAE,cAAA,EAAgB,MAAA,EAAW,IAAI;AAAA,KACxE;AAAA,IAEA,eAAA,EAAiB;AAAA,MACf,MAAA,EAAQ,CAAC,MAAA,EAAQ,IAAA,KACf,OAAA;AAAA,QACE,kBAAA;AAAA,QACA,CAAA,CAAE,cAAA;AAAA,QACF,MAAA;AAAA,QACA;AAAA,OACF;AAAA,MACF,KAAA,EAAO,CAAC,IAAA,EAAM,IAAA,KAAS,OAAO,IAAA,EAAM,CAAA,CAAE,aAAA,EAAe,MAAA,EAAW,IAAI,CAAA;AAAA,MACpE,MAAA,EAAQ,CAAC,IAAA,EAAM,MAAA,EAAQ,IAAA,KAAS,OAAO,IAAA,EAAM,CAAA,CAAE,cAAA,EAAgB,MAAA,EAAQ,IAAI,CAAA;AAAA,MAC3E,KAAA,EAAO,CAAC,IAAA,EAAM,IAAA,KAAS,OAAO,IAAA,EAAM,CAAA,CAAE,aAAA,EAAe,MAAA,EAAW,IAAI,CAAA;AAAA,MACpE,UAAA,EAAY,CAAC,IAAA,EAAM,IAAA,KAAS,OAAO,IAAA,EAAM,CAAA,CAAE,WAAA,EAAa,MAAA,EAAW,IAAI;AAAA,KACzE;AAAA,IAEA,cAAA,EAAgB;AAAA;AAAA;AAAA;AAAA;AAAA,MAKd,MAAA,EAAQ,CAAC,OAAA,EAAS,MAAA,EAAQ,IAAA,KACxB,OAAA;AAAA,QACE,mBAAA,CAAoB,YAAA;AAAA,QACpB,CAAA,CAAE,sBAAA;AAAA,QACF,EAAE,GAAG,MAAA,EAAQ,OAAA,EAAQ;AAAA,QACrB;AAAA,OACF;AAAA,MACF,YAAA,EAAc,CAAC,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,SAAS,aAAA,CAAc,IAAA,EAAM,SAAA,EAAW,MAAA,EAAQ,IAAI;AAAA;AAC9F,GACF;AACF;;ACzNO,MAAM,uBAAA,GAA0B;AAAA,EACrC,MAAA,EAAQ,+BAAA;AAAA,EACR,QAAA,EAAU;AACZ;AAEO,SAAS,2BACd,IAAA,EACuB;AACvB,EAAA,MAAM,EAAE,KAAI,GAAI,IAAA;AAChB,EAAA,OAAO;AAAA,IACL,MAAM,MAAM,MAAA,EAAQ;AAClB,MAAA,OAAO,GAAA,CAA8B,wBAAwB,MAAA,EAAQ;AAAA,QACnE,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH,CAAA;AAAA,IACA,MAAM,OAAO,MAAA,EAAQ;AACnB,MAAA,OAAO,GAAA,CAA+B,wBAAwB,MAAA,EAAQ;AAAA,QACpE,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM;AAAA,OACP,CAAA;AAAA,IACH,CAAA;AAAA,IACA,MAAM,QAAA,CAAS,KAAA,GAAQ,EAAC,EAAG;AACzB,MAAA,MAAM,IAA6B,EAAC;AACpC,MAAA,IAAI,KAAA,CAAM,IAAA,EAAM,CAAA,CAAE,IAAA,GAAO,KAAA,CAAM,IAAA;AAC/B,MAAA,IAAI,KAAA,CAAM,SAAA,EAAW,CAAA,CAAE,UAAA,GAAa,KAAA,CAAM,SAAA;AAC1C,MAAA,IAAI,KAAA,CAAM,MAAA,EAAQ,CAAA,CAAE,MAAA,GAAS,KAAA,CAAM,MAAA;AACnC,MAAA,IAAI,KAAA,CAAM,KAAA,IAAS,IAAA,EAAM,CAAA,CAAE,QAAQ,KAAA,CAAM,KAAA;AACzC,MAAA,IAAI,KAAA,CAAM,MAAA,EAAQ,CAAA,CAAE,MAAA,GAAS,KAAA,CAAM,MAAA;AACnC,MAAA,OAAO,GAAA,CAAiC,wBAAwB,QAAA,EAAU;AAAA,QACxE,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,CAAE,SAAS,CAAA,GAAI;AAAA,OACpC,CAAA;AAAA,IACH;AAAA,GACF;AACF;;AC5EA,MAAM,eAAA,GAAkB,CAAC,CAAA,KAAwD;AAC/E,EAAA,MAAM,MAA8B,EAAE,IAAA,EAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,EAAE,MAAA,EAAO;AACrE,EAAA,IAAI,CAAA,CAAE,GAAA,EAAK,GAAA,CAAI,GAAA,GAAM,CAAA,CAAE,GAAA;AACvB,EAAA,OAAO,GAAA;AACT,CAAA;AAEA,MAAM,WAAA,GAAc,CAAC,CAAA,GAA0B,EAAC,KAA+B;AAC7E,EAAA,MAAM,MAA+B,EAAC;AACtC,EAAA,IAAI,CAAA,CAAE,MAAA,EAAQ,GAAA,CAAI,MAAA,GAAS,CAAA,CAAE,MAAA;AAC7B,EAAA,IAAI,CAAA,CAAE,UAAA,EAAY,GAAA,CAAI,WAAA,GAAc,CAAA,CAAE,UAAA;AACtC,EAAA,IAAI,CAAA,CAAE,OAAA,IAAW,IAAA,EAAM,GAAA,CAAI,WAAW,CAAA,CAAE,OAAA;AACxC,EAAA,IAAI,CAAA,CAAE,KAAA,IAAS,IAAA,EAAM,GAAA,CAAI,QAAQ,CAAA,CAAE,KAAA;AACnC,EAAA,OAAO,GAAA;AACT,CAAA;AAEO,SAAS,2BACd,IAAA,EACuB;AACvB,EAAA,MAAM,EAAE,KAAI,GAAI,IAAA;AAChB,EAAA,OAAO;AAAA,IACL,MAAM,QAAA,GAAW;AACf,MAAA,OAAO,GAAA,CAA2B,gBAAgB,iBAAiB,CAAA;AAAA,IACrE,CAAA;AAAA,IACA,MAAM,UAAU,KAAA,EAAO;AACrB,MAAA,OAAO,GAAA,CAAyB,gBAAgB,kBAAA,EAAoB;AAAA,QAClE,KAAA,EAAO,gBAAgB,KAAK;AAAA,OAC7B,CAAA;AAAA,IACH,CAAA;AAAA,IACA,MAAM,aAAa,IAAA,EAAM;AACvB,MAAA,OAAO,GAAA,CAA4B,eAAA,CAAgB,mBAAA,CAAoB,IAAI,CAAC,CAAA;AAAA,IAC9E,CAAA;AAAA,IACA,MAAM,MAAA,CAAO,IAAA,EAAM,GAAA,EAAK;AACtB,MAAA,OAAO,GAAA,CAAsB,eAAA,CAAgB,aAAA,CAAc,IAAI,CAAA,EAAG,EAAE,KAAA,EAAO,EAAE,GAAA,EAAI,EAAG,CAAA;AAAA,IACtF,CAAA;AAAA,IACA,MAAM,SAAS,KAAA,EAAO;AACpB,MAAA,OAAO,IAA4B,oBAAA,EAAsB;AAAA,QACvD,KAAA,EAAO,YAAY,KAAK;AAAA,OACzB,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,OAAA,CAAQ,IAAA,EAAM,GAAA,EAAK;AACvB,MAAA,MAAM,KAAA,GAAQ,GAAA,GAAM,EAAE,GAAA,EAAI,GAAI,MAAA;AAC9B,MAAA,OAAO,IAA6B,CAAA,EAAG,cAAc,IAAI,kBAAA,CAAmB,IAAI,CAAC,CAAA,QAAA,CAAA,EAAY;AAAA,QAC3F,MAAA,EAAQ,MAAA;AAAA,QACR;AAAA,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IACA,MAAM,SAAS,MAAA,EAAQ;AACrB,MAAA,OAAO,IAA6B,cAAA,EAAgB;AAAA,QAClD,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM;AAAA,UACJ,MAAM,MAAA,CAAO,IAAA;AAAA,UACb,GAAI,OAAO,IAAA,GAAO,EAAE,MAAM,MAAA,CAAO,IAAA,KAAS,EAAC;AAAA,UAC3C,QAAQ,MAAA,CAAO,MAAA;AAAA,UACf,GAAI,OAAO,MAAA,GAAS,EAAE,QAAQ,MAAA,CAAO,MAAA,KAAW;AAAC;AACnD,OACD,CAAA;AAAA,IACH,CAAA;AAAA,IACA,MAAM,QAAA,CAAS,IAAA,EAAM,SAAA,EAAW;AAC9B,MAAA,MAAM,KAAA,GAAQ,SAAA,GAAY,EAAE,UAAA,EAAY,WAAU,GAAI,MAAA;AACtD,MAAA,OAAO,GAAA;AAAA,QACL,CAAA,EAAG,cAAc,CAAA,CAAA,EAAI,kBAAA,CAAmB,IAAI,CAAC,CAAA,SAAA,CAAA;AAAA,QAC7C,EAAE,MAAA,EAAQ,MAAA,EAAQ,KAAA;AAAM,OAC1B;AAAA,IACF,CAAA;AAAA,IACA,MAAM,SAAA,CAAU,IAAA,EAAM,KAAA,GAAQ,KAAA,EAAO;AACnC,MAAA,MAAM,IAAI,CAAA,EAAG,cAAc,IAAI,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA,EAAI;AAAA,QACzD,MAAA,EAAQ,QAAA;AAAA,QACR,IAAA,EAAM,KAAA,GAAQ,EAAE,KAAA,EAAO,MAAK,GAAI;AAAA,OACjC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,MAAM,cAAA,CAAe,IAAA,EAAM,KAAA,EAAO;AAChC,MAAA,MAAM,QAAA,GAAW;AAAA,QACf,GAAI,KAAA,CAAM,QAAA,IAAY,EAAC;AAAA,QACvB,GAAI,MAAM,QAAA,KAAa,MAAA,GAAY,EAAE,sBAAA,EAAwB,KAAA,CAAM,QAAA,EAAS,GAAI;AAAC,OACnF;AACA,MAAA,OAAO,IAA6B,CAAA,EAAG,cAAc,IAAI,kBAAA,CAAmB,IAAI,CAAC,CAAA,CAAA,EAAI;AAAA,QACnF,MAAA,EAAQ,KAAA;AAAA,QACR,IAAA,EAAM,EAAE,QAAA;AAAS,OAClB,CAAA;AAAA,IACH,CAAA;AAAA,IAEA,MAAM,UAAU,IAAA,EAAM;AACpB,MAAA,OAAO,GAAA;AAAA,QACL,CAAA,EAAG,cAAc,CAAA,CAAA,EAAI,kBAAA,CAAmB,IAAI,CAAC,CAAA,UAAA;AAAA,OAC/C;AAAA,IACF,CAAA;AAAA,IACA,MAAM,eAAA,CAAgB,IAAA,EAAM,UAAA,EAAY;AACtC,MAAA,OAAO,GAAA;AAAA,QACL,GAAG,cAAc,CAAA,CAAA,EAAI,mBAAmB,IAAI,CAAC,cAAc,UAAU,CAAA,QAAA;AAAA,OACvE;AAAA,IACF,CAAA;AAAA,IACA,MAAM,eAAA,CAAgB,IAAA,EAAM,UAAA,EAAY,UAAA,EAAY;AAClD,MAAA,OAAO,GAAA;AAAA,QACL,GAAG,cAAc,CAAA,CAAA,EAAI,mBAAmB,IAAI,CAAC,cAAc,UAAU,CAAA,QAAA,CAAA;AAAA,QACrE,EAAE,MAAA,EAAQ,MAAA,EAAQ,IAAA,EAAM,EAAE,YAAW;AAAE,OACzC;AAAA,IACF,CAAA;AAAA,IACA,MAAM,OAAA,CAAQ,IAAA,EAAM,KAAA,GAAQ,EAAC,EAAG;AAC9B,MAAA,MAAM,IAA6B,EAAC;AACpC,MAAA,IAAI,KAAA,CAAM,MAAA,EAAQ,CAAA,CAAE,MAAA,GAAS,KAAA,CAAM,MAAA;AACnC,MAAA,IAAI,KAAA,CAAM,KAAA,IAAS,IAAA,EAAM,CAAA,CAAE,QAAQ,KAAA,CAAM,KAAA;AACzC,MAAA,OAAO,IAAuB,CAAA,EAAG,cAAc,IAAI,kBAAA,CAAmB,IAAI,CAAC,CAAA,SAAA,CAAA,EAAa;AAAA,QACtF,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,CAAE,SAAS,CAAA,GAAI;AAAA,OACpC,CAAA;AAAA,IACH,CAAA;AAAA,IACA,MAAM,OAAA,CAAQ,IAAA,EAAM,KAAA,EAAO;AACzB,MAAA,OAAO,GAAA;AAAA,QACL,CAAA,EAAG,cAAc,CAAA,CAAA,EAAI,kBAAA,CAAmB,IAAI,CAAC,CAAA,WAAA,EAAc,kBAAA,CAAmB,KAAK,CAAC,CAAA;AAAA,OACtF;AAAA,IACF;AAAA,GACF;AACF;;AC9IO,SAAS,oBAAoB,IAAA,EAA6C;AAC/E,EAAA,MAAM,EAAE,KAAI,GAAI,IAAA;AAIhB,EAAA,MAAM,UAAA,GAAa;AAAA,IACjB,GAAA;AAAA,IACA,gBAAgB,CAAC,IAAA,EAAc,UAAA,KAA+B,eAAA,CAAgB,MAAM,UAAU;AAAA,GAChG;AAEA,EAAA,OAAO;AAAA,IACL,GAAG,kBAAkB,UAAU,CAAA;AAAA,IAC/B,GAAG,kBAAkB,UAAU,CAAA;AAAA,IAC/B,GAAG,qBAAqB,UAAU,CAAA;AAAA,IAClC,GAAG,oBAAoB,UAAU,CAAA;AAAA;AAAA,IAEjC,OAAA,EAAS,0BAAA,CAA2B,EAAE,GAAA,EAAK,CAAA;AAAA;AAAA,IAE3C,OAAA,EAAS,0BAAA,CAA2B,EAAE,GAAA,EAAK,CAAA;AAAA;AAAA,IAI3C,MAAM,eAAe,KAAA,EAAO;AAC1B,MAAA,OAAO,GAAA,CAA6B,6BAAA,EAA+B,EAAE,KAAA,EAAO,CAAA;AAAA,IAC9E,CAAA;AAAA,IAEA,MAAM,kBAAkB,GAAA,EAAK;AAC3B,MAAA,OAAO,GAAA,CAA0B,CAAA,yBAAA,EAA4B,GAAG,CAAA,OAAA,CAAS,CAAA;AAAA,IAC3E,CAAA;AAAA,IAEA,MAAM,iBAAA,CAAkB,KAAA,GAAQ,EAAC,EAAG;AAClC,MAAA,MAAM,IAA4B,EAAC;AACnC,MAAA,IAAI,KAAA,CAAM,QAAA,EAAU,CAAA,CAAE,QAAA,GAAW,KAAA,CAAM,QAAA;AACvC,MAAA,IAAI,KAAA,CAAM,UAAA,EAAY,CAAA,CAAE,UAAA,GAAa,KAAA,CAAM,UAAA;AAC3C,MAAA,IAAI,KAAA,CAAM,KAAA,EAAO,CAAA,CAAE,KAAA,GAAQ,KAAA,CAAM,KAAA;AACjC,MAAA,OAAO,GAAA,CAA0B,mCAAA,EAAqC,EAAE,KAAA,EAAO,GAAG,CAAA;AAAA,IACpF;AAAA,GACF;AACF;AAGA,SAAS,eAAA,CAAgB,MAAc,UAAA,EAA4B;AACjE,EAAA,OAAO,CAAA,gBAAA,EAAmB,IAAI,CAAA,SAAA,EAAY,UAAU,CAAA,CAAA;AACtD;;ACnHO,MAAM,cAAA,GAAiB;AAAA,EAC5B,IAAA,EAAM,eAAA;AAAA,EACN,MAAA,EAAQ,CAAC,IAAA,KAAyB,CAAA,cAAA,EAAiB,IAAI,CAAA,CAAA;AAAA;AAAA,EAEvD,UAAA,EAAY;AACd;AAGO,MAAM,cAAA,GAAiB;AAAA,EAC5B,UAAA,EAAY;AACd;;ACOO,MAAM,cAAA,GAAiB;AAAA,EAC5B,aAAA,EAAe,eAAA;AAAA,EACf,WAAA,EAAa,aAAA;AAAA,EACb,cAAA,EAAgB,gBAAA;AAAA,EAChB,UAAA,EAAY,YAAA;AAAA,EACZ,QAAA,EAAU,UAAA;AAAA,EACV,QAAA,EAAU;AACZ;AAcO,MAAM,sBAAA,GAAwD;AAAA,EACnE;AAAA,IACE,KAAA,EAAO,eAAA;AAAA,IACP,OAAO,cAAA,CAAe,aAAA;AAAA,IACtB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,KAAA,EAAO,aAAA;AAAA,IACP,OAAO,cAAA,CAAe,WAAA;AAAA,IACtB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,KAAA,EAAO,gBAAA;AAAA,IACP,OAAO,cAAA,CAAe,cAAA;AAAA,IACtB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,KAAA,EAAO,YAAA;AAAA,IACP,OAAO,cAAA,CAAe,UAAA;AAAA,IACtB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,KAAA,EAAO,UAAA;AAAA,IACP,OAAO,cAAA,CAAe,QAAA;AAAA,IACtB,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,KAAA,EAAO,UAAA;AAAA,IACP,OAAO,cAAA,CAAe,QAAA;AAAA,IACtB,IAAA,EAAM;AAAA;AAEV;AAGO,MAAM,uBAAA,GAAmD;AAAA,EAC9D,cAAA,CAAe,aAAA;AAAA,EACf,cAAA,CAAe;AACjB;AAOO,MAAM,eAAA,GAAkB;AAAA,EAC7B,eAAe,EAAE,GAAA,EAAK,GAAG,OAAA,EAAS,CAAA,EAAG,KAAK,EAAA,EAAG;AAAA,EAC7C,SAAA,EAAW,EAAE,GAAA,EAAK,CAAA,EAAG,SAAS,CAAA,EAAI;AAAA,EAClC,WAAW,EAAE,GAAA,EAAK,GAAG,OAAA,EAAS,IAAA,EAAM,KAAK,IAAA;AAC3C;AAYO,MAAM,SAAA,GAAY,CAAC,eAAA,KAAyE;AACjG,EAAA,MAAM,MAAO,eAAA,EAAuE,OAAA;AACpF,EAAA,OAAO;AAAA,IACL,aAAA,EACE,OAAO,GAAA,EAAK,aAAA,KAAkB,WAC1B,GAAA,CAAI,aAAA,GACJ,gBAAgB,aAAA,CAAc,OAAA;AAAA,IACpC,SAAA,EACE,OAAO,GAAA,EAAK,SAAA,KAAc,WAAW,GAAA,CAAI,SAAA,GAAY,gBAAgB,SAAA,CAAU,OAAA;AAAA,IACjF,SAAA,EACE,OAAO,GAAA,EAAK,SAAA,KAAc,WAAW,GAAA,CAAI,SAAA,GAAY,gBAAgB,SAAA,CAAU;AAAA,GACnF;AACF;AAWO,MAAM,YAAA,GAAe,CAC1B,OAAA,KACmB;AACnB,EAAA,MAAM,GAAA,GAAO,SACT,YAAA,EAAc,UAAA;AAClB,EAAA,IAAI,CAAC,MAAM,OAAA,CAAQ,GAAG,GAAG,OAAO,CAAC,GAAG,uBAAuB,CAAA;AAC3D,EAAA,OAAO,GAAA,CAAI,MAAA;AAAA,IAAO,CAAC,CAAA,KACjB,MAAA,CAAO,OAAO,cAAc,CAAA,CAAE,SAAS,CAAiB;AAAA,GAC1D;AACF;AAGO,MAAM,YAAA,GAAe,CAAC,OAAA,KAAgE;AAC3F,EAAA,MAAM,GAAA,GAAO,SACT,YAAA,EAAc,UAAA;AAClB,EAAA,OAAO,OAAO,GAAA,KAAQ,QAAA,GAAW,GAAA,GAAM,EAAA;AACzC;;ACpCO,MAAM,cAAA,GAAiB;AAAA,EAC5B,UAAA,EAAY,YAAA;AAAA,EACZ,IAAA,EAAM,MAAA;AAAA,EACN,SAAA,EAAW,WAAA;AAAA,EACX,aAAA,EAAe;AACjB;AAMO,MAAM,cAAA,GAAiB;AAAA,EAC5B,MAAA,EAAQ,QAAA;AAAA,EACR,SAAA,EAAW,WAAA;AAAA,EACX,MAAA,EAAQ,QAAA;AAAA,EACR,UAAA,EAAY,YAAA;AAAA,EACZ,SAAA,EAAW,WAAA;AAAA,EACX,KAAA,EAAO;AACT;;ACvEO,MAAM,YAAA,GAAe;AAAA,EAC1B,MAAA,EAAQ,QAAA;AAAA,EACR,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO;AACT;AAkBO,MAAM,YAAA,GAAe;AAAA,EAC1B,MAAA,EAAQ,QAAA;AAAA,EACR,IAAA,EAAM,MAAA;AAAA,EACN,KAAA,EAAO,OAAA;AAAA,EACP,MAAA,EAAQ;AACV;AAYO,MAAM,UAAA,GAAa;AAAA,EACxB,UAAA,EAAY,YAAA;AAAA,EACZ,SAAA,EAAW,WAAA;AAAA,EACX,QAAA,EAAU,UAAA;AAAA,EACV,KAAA,EAAO,OAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOP,kBAAA,EAAoB;AACtB;AAcO,MAAM,kBAAA,GAAiD;AAAA,EAC5D,EAAE,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,WAAW,UAAA,EAAW;AAAA,EACpD,EAAE,KAAA,EAAO,WAAA,EAAa,KAAA,EAAO,WAAW,SAAA,EAAU;AAAA,EAClD,EAAE,KAAA,EAAO,UAAA,EAAY,KAAA,EAAO,WAAW,QAAA,EAAS;AAAA,EAChD,EAAE,KAAA,EAAO,OAAA,EAAS,KAAA,EAAO,WAAW,KAAA,EAAM;AAAA,EAC1C;AAAA,IACE,KAAA,EAAO,gBAAA;AAAA,IACP,OAAO,UAAA,CAAW,kBAAA;AAAA,IAClB,IAAA,EAAM;AAAA;AAEV;AAGO,MAAM,gBAAA,GAAmB,CAAC,GAAA,KAAmC;AAClE,EAAA,IAAI,OAAO,GAAA,KAAQ,QAAA,EAAU,OAAO,KAAA;AACpC,EAAA,OAAQ,MAAA,CAAO,MAAA,CAAO,UAAU,CAAA,CAAe,SAAS,GAAG,CAAA;AAC7D;AAKO,MAAM,kBAAkB,CAAC,GAAA,KAC9B,iBAAiB,GAAG,CAAA,GAAI,MAAM,UAAA,CAAW;AASpC,MAAM,YAAA,GAAsC;AAAA,EACjD,EAAE,KAAA,EAAO,aAAA,EAAe,KAAA,EAAO,WAAA,EAAY;AAAA,EAC3C,EAAE,KAAA,EAAO,aAAA,EAAe,KAAA,EAAO,aAAA,EAAc;AAAA,EAC7C,EAAE,KAAA,EAAO,cAAA,EAAgB,KAAA,EAAO,cAAA,EAAe;AAAA,EAC/C,EAAE,KAAA,EAAO,cAAA,EAAgB,KAAA,EAAO,cAAA,EAAe;AAAA,EAC/C,EAAE,KAAA,EAAO,YAAA,EAAc,KAAA,EAAO,WAAA,EAAY;AAAA,EAC1C,EAAE,KAAA,EAAO,mBAAA,EAAqB,KAAA,EAAO,WAAA;AACvC;AAGO,MAAM,qBAAA,GAAwB;AAG9B,MAAM,0BAAA,GAA6B;AASnC,MAAM,kBAAA,GAAqB,CAAC,UAAA,MAA2C;AAAA,EAC5E,YAAY,YAAA,CAAa,MAAA;AAAA,EACzB,aAAa,YAAA,CAAa,MAAA;AAAA,EAC1B,YAAA,EAAc,EAAE,UAAA;AAClB,CAAA;AAWO,MAAM,mBAAmB,CAC9B,QAAA,EACA,KAAA,GAAiC,IACjC,QAAA,MACuB;AAAA,EACvB,YAAY,YAAA,CAAa,IAAA;AAAA,EACzB,aAAa,YAAA,CAAa,IAAA;AAAA,EAC1B,YAAA,EAAc,EAAE,QAAA,EAAU,GAAG,KAAA,EAAO,GAAI,QAAA,GAAW,EAAE,QAAA,EAAS,GAAI,EAAC;AACrE,CAAA;AAgBO,MAAM,oBAAoB,CAC/B,KAAA,EACA,cAAsB,0BAAA,EACtB,KAAA,GAAiC,EAAC,MACX;AAAA,EACvB,YAAY,YAAA,CAAa,KAAA;AAAA,EACzB,aAAa,YAAA,CAAa,KAAA;AAAA,EAC1B,YAAA,EAAc;AAAA,IACZ,KAAA;AAAA,IACA,UAAA,EAAY,CAAC,KAAK,CAAA;AAAA,IAClB,YAAA,EAAc,CAAC,WAAW,CAAA;AAAA,IAC1B,GAAG;AAAA;AAEP,CAAA;AAYO,MAAM,aAAA,GAAgB,CAC3B,OAAA,KACgB;AAChB,EAAA,MAAM,CAAA,GAAI,OAAA;AAMV,EAAA,MAAM,aAAa,CAAA,EAAG,UAAA,IAAc,GAAG,WAAA,IAAe,CAAA,EAAG,eAAe,CAAA,EAAG,YAAA;AAC3E,EAAA,IAAI,UAAA,KAAe,YAAA,CAAa,MAAA,IAAU,UAAA,KAAe,YAAA,CAAa,MAAA;AACpE,IAAA,OAAO,YAAA,CAAa,MAAA;AACtB,EAAA,IAAI,UAAA,KAAe,YAAA,CAAa,IAAA,IAAQ,UAAA,KAAe,YAAA,CAAa,IAAA;AAClE,IAAA,OAAO,YAAA,CAAa,IAAA;AACtB,EAAA,IACE,eAAe,YAAA,CAAa,KAAA,IAC5B,eAAe,YAAA,CAAa,KAAA,IAC5B,eAAe,YAAA,CAAa,MAAA;AAE5B,IAAA,OAAO,YAAA,CAAa,KAAA;AAEtB,EAAA,OAAO,YAAA,CAAa,MAAA;AACtB;AAGO,MAAM,UAAA,GAAa,CACxB,OAAA,KACW;AACX,EAAA,MAAM,YAAA,GACH,OAAA,EAA+D,YAAA,IAAgB,EAAC;AACnF,EAAA,MAAM,WAAW,YAAA,CAAa,QAAA;AAC9B,EAAA,OAAO,OAAO,QAAA,KAAa,QAAA,IAAY,QAAA,GAAW,QAAA,GAAW,EAAA;AAC/D;AAGO,MAAM,YAAA,GAAe,CAC1B,OAAA,KACW;AACX,EAAA,MAAM,YAAA,GACH,OAAA,EAA+D,YAAA,IAAgB,EAAC;AACnF,EAAA,MAAM,OAAO,YAAA,CAAa,UAAA;AAC1B,EAAA,OAAO,OAAO,IAAA,KAAS,QAAA,GAAW,IAAA,GAAO,EAAA;AAC3C;;AClQO,MAAM,UAAA,GAA4B;AAAA,EACvC;AAAA,IACE,EAAA,EAAI,CAAA;AAAA,IACJ,IAAA,EAAM,wBAAA;AAAA,IACN,IAAA,EAAM,yBAAA;AAAA,IACN,WAAA,EAAa,qDAAA;AAAA,IACb,UAAU,YAAA,CAAa,WAAA;AAAA,IACvB,QAAA,EAAU,QAAA;AAAA,IACV,eAAe,cAAA,CAAe,UAAA;AAAA,IAC9B,aAAA,EACE,iFAAA;AAAA,IACF,OAAA,EAAS;AAAA,MACP,aAAa,YAAA,CAAa,MAAA;AAAA,MAC1B,YAAY,YAAA,CAAa,MAAA;AAAA,MACzB,YAAA,EAAc,EAAE,UAAA,EAAY,eAAA;AAAgB,KAC9C;AAAA,IACA,eAAe,cAAA,CAAe,MAAA;AAAA,IAC9B,eAAA,EAAiB;AAAA,MACf,YAAY,eAAA,CAAgB,YAAA;AAAA,MAC5B,MAAA,EAAQ,EAAE,QAAA,EAAU,mBAAA;AAAoB,KAC1C;AAAA,IACA,QAAA,EAAU,EAAA;AAAA,IACV,QAAA,EAAU,IAAA;AAAA,IACV,cAAA,EAAgB,EAAA;AAAA,IAChB,WAAA,EAAa,sBAAA;AAAA,IACb,SAAA,EAAW,sBAAA;AAAA,IACX,SAAA,EAAW;AAAA,GACb;AAAA,EACA;AAAA,IACE,EAAA,EAAI,CAAA;AAAA,IACJ,IAAA,EAAM,0BAAA;AAAA,IACN,IAAA,EAAM,+BAAA;AAAA,IACN,WAAA,EAAa,+DAAA;AAAA,IACb,UAAU,YAAA,CAAa,WAAA;AAAA,IACvB,QAAA,EAAU,QAAA;AAAA,IACV,eAAe,cAAA,CAAe,UAAA;AAAA,IAC9B,aAAA,EAAe,4DAAA;AAAA,IACf,OAAA,EAAS;AAAA,MACP,aAAa,YAAA,CAAa,MAAA;AAAA,MAC1B,YAAY,YAAA,CAAa,MAAA;AAAA,MACzB,YAAA,EAAc,EAAE,UAAA,EAAY,eAAA;AAAgB,KAC9C;AAAA,IACA,eAAe,cAAA,CAAe,KAAA;AAAA,IAC9B,eAAA,EAAiB;AAAA,MACf,KAAA,EAAO;AAAA,QACL;AAAA,UACE,MAAM,cAAA,CAAe,MAAA;AAAA,UACrB,MAAA,EAAQ;AAAA,YACN,YAAY,eAAA,CAAgB,eAAA;AAAA,YAC5B,MAAA,EAAQ,EAAE,WAAA,EAAa,EAAA;AAAG;AAC5B,SACF;AAAA,QACA;AAAA,UACE,MAAM,cAAA,CAAe,MAAA;AAAA,UACrB,MAAA,EAAQ;AAAA,YACN,YAAY,eAAA,CAAgB,YAAA;AAAA,YAC5B,MAAA,EAAQ,EAAE,QAAA,EAAU,qBAAA;AAAsB;AAC5C;AACF;AACF,KACF;AAAA,IACA,QAAA,EAAU,EAAA;AAAA,IACV,QAAA,EAAU,IAAA;AAAA,IACV,cAAA,EAAgB,EAAA;AAAA,IAChB,WAAA,EAAa,sBAAA;AAAA,IACb,SAAA,EAAW,sBAAA;AAAA,IACX,SAAA,EAAW;AAAA,GACb;AAAA,EACA;AAAA,IACE,EAAA,EAAI,CAAA;AAAA,IACJ,IAAA,EAAM,uBAAA;AAAA,IACN,IAAA,EAAM,4BAAA;AAAA,IACN,WAAA,EAAa,uDAAA;AAAA,IACb,UAAU,YAAA,CAAa,WAAA;AAAA,IACvB,QAAA,EAAU,QAAA;AAAA,IACV,eAAe,cAAA,CAAe,SAAA;AAAA,IAC9B,OAAA,EAAS;AAAA,MACP,aAAa,YAAA,CAAa,IAAA;AAAA,MAC1B,YAAY,YAAA,CAAa,IAAA;AAAA,MACzB,YAAA,EAAc;AAAA,QACZ,QAAA,EAAU,aAAA;AAAA,QACV,UAAA,EAAY,4BAAA;AAAA,QACZ,UAAA,EAAY,CAAC,cAAA,CAAe,aAAA,EAAe,eAAe,WAAW;AAAA;AACvE,KACF;AAAA,IACA,eAAe,cAAA,CAAe,SAAA;AAAA,IAC9B,eAAA,EAAiB,EAAE,KAAA,EAAO,WAAA,EAAY;AAAA,IACtC,QAAA,EAAU,CAAA;AAAA,IACV,QAAA,EAAU,IAAA;AAAA,IACV,cAAA,EAAgB,EAAA;AAAA,IAChB,WAAA,EAAa,sBAAA;AAAA,IACb,SAAA,EAAW,sBAAA;AAAA,IACX,SAAA,EAAW;AAAA,GACb;AAAA,EACA;AAAA,IACE,EAAA,EAAI,CAAA;AAAA,IACJ,IAAA,EAAM,qBAAA;AAAA,IACN,IAAA,EAAM,yBAAA;AAAA,IACN,WAAA,EAAa,oDAAA;AAAA,IACb,UAAU,YAAA,CAAa,WAAA;AAAA,IACvB,QAAA,EAAU,QAAA;AAAA,IACV,eAAe,cAAA,CAAe,SAAA;AAAA,IAC9B,OAAA,EAAS;AAAA,MACP,aAAa,YAAA,CAAa,IAAA;AAAA,MAC1B,YAAY,YAAA,CAAa,IAAA;AAAA,MACzB,YAAA,EAAc;AAAA,QACZ,QAAA,EAAU,aAAA;AAAA,QACV,UAAA,EAAY,yBAAA;AAAA,QACZ,UAAA,EAAY,CAAC,cAAA,CAAe,aAAA,EAAe,eAAe,WAAW;AAAA;AACvE,KACF;AAAA,IACA,eAAe,cAAA,CAAe,SAAA;AAAA,IAC9B,eAAA,EAAiB,EAAE,KAAA,EAAO,WAAA,EAAY;AAAA,IACtC,QAAA,EAAU,CAAA;AAAA,IACV,QAAA,EAAU,KAAA;AAAA,IACV,cAAA,EAAgB,EAAA;AAAA,IAChB,SAAA,EAAW,sBAAA;AAAA,IACX,SAAA,EAAW;AAAA;AAEf,CAAA;AAGA,MAAM,MAAA,GAAwB,WAAW,GAAA,CAAI,CAAC,OAAO,EAAE,GAAG,GAAE,CAAE,CAAA;AAE9D,IAAI,IAAA,GAAO,GAAA;AAEJ,SAAS,aAAa,KAAA,EAG3B;AACA,EAAA,IAAI,IAAA,GAAO,MAAA,CAAO,KAAA,EAAM,CAAE,IAAA,CAAK,CAAC,CAAA,EAAG,CAAA,KAAM,CAAA,CAAE,EAAA,GAAK,CAAA,CAAE,EAAE,CAAA;AACpD,EAAA,IAAI,KAAA,EAAO,UAAA;AACT,IAAA,IAAA,GAAO,IAAA,CAAK,MAAA;AAAA,MACV,CAAC,CAAA,KAAO,CAAA,CAAE,OAAA,CAAoC,eAAe,KAAA,CAAM;AAAA,KACrE;AACF,EAAA,IAAI,KAAA,EAAO,aAAA,EAAe,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,aAAA,KAAkB,KAAA,CAAM,aAAa,CAAA;AAC3F,EAAA,IAAI,KAAA,EAAO,QAAA,EAAU,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,KAAa,KAAA,CAAM,QAAQ,CAAA;AAC5E,EAAA,IAAI,KAAA,EAAO,QAAA,KAAa,MAAA,EAAW,IAAA,GAAO,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,QAAA,KAAa,KAAA,CAAM,QAAQ,CAAA;AAC1F,EAAA,OAAO,EAAE,KAAA,EAAO,IAAA,EAAM,KAAA,EAAO,KAAK,MAAA,EAAO;AAC3C;AAEO,SAAS,eAAe,IAAA,EAAuC;AACpE,EAAA,OAAO,OAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AAC3C;AAEO,SAAS,eAAe,OAAA,EAAyC;AACtE,EAAA,MAAM,GAAA,GAAA,iBAAM,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACnC,EAAA,MAAM,IAAA,GAAoB;AAAA,IACxB,IAAI,EAAE,IAAA;AAAA,IACN,IAAA,EAAM,QAAQ,OAAA,CAAQ,IAAA,CAAK,aAAY,CAAE,OAAA,CAAQ,MAAA,EAAQ,GAAG,CAAC,CAAA,CAAA;AAAA,IAC7D,MAAM,OAAA,CAAQ,IAAA;AAAA,IACd,WAAA,EAAa,QAAQ,WAAA,IAAe,IAAA;AAAA,IACpC,QAAA,EAAU,QAAQ,WAAA,IAAe,IAAA;AAAA,IACjC,QAAA,EAAU,QAAA;AAAA,IACV,aAAA,EAAe,OAAA,CAAQ,aAAA,IAAiB,cAAA,CAAe,UAAA;AAAA,IACvD,aAAA,EAAe,QAAQ,aAAA,IAAiB,IAAA;AAAA,IACxC,aAAA,EAAe,QAAQ,aAAA,IAAiB,IAAA;AAAA,IACxC,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,aAAA,EAAe,OAAA,CAAQ,aAAA,IAAiB,cAAA,CAAe,MAAA;AAAA,IACvD,eAAA,EAAiB,QAAQ,eAAA,IAAmB,IAAA;AAAA,IAC5C,QAAA,EAAU,QAAQ,QAAA,IAAY,CAAA;AAAA,IAC9B,QAAA,EAAU,QAAQ,QAAA,IAAY,IAAA;AAAA,IAC9B,cAAA,EAAgB,QAAQ,cAAA,IAAkB,EAAA;AAAA,IAC1C,SAAA,EAAW,GAAA;AAAA,IACX,SAAA,EAAW;AAAA,GACb;AACA,EAAA,MAAA,CAAO,KAAK,IAAI,CAAA;AAChB,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,cAAA,CACd,MACA,KAAA,EACyB;AACzB,EAAA,MAAM,OAAO,MAAA,CAAO,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AAC/C,EAAA,IAAI,CAAC,MAAM,OAAO,MAAA;AAClB,EAAA,IAAI,KAAA,CAAM,WAAA,KAAgB,MAAA,EAAW,IAAA,CAAK,WAAW,KAAA,CAAM,WAAA;AAC3D,EAAA,IAAI,KAAA,CAAM,aAAA,KAAkB,MAAA,EAAW,IAAA,CAAK,gBAAgB,KAAA,CAAM,aAAA;AAClE,EAAA,IAAI,KAAA,CAAM,aAAA,KAAkB,MAAA,EAAW,IAAA,CAAK,gBAAgB,KAAA,CAAM,aAAA;AAClE,EAAA,IAAI,KAAA,CAAM,aAAA,KAAkB,MAAA,EAAW,IAAA,CAAK,gBAAgB,KAAA,CAAM,aAAA;AAClE,EAAA,IAAI,KAAA,CAAM,aAAA,KAAkB,MAAA,EAAW,IAAA,CAAK,gBAAgB,KAAA,CAAM,aAAA;AAClE,EAAA,IAAI,KAAA,CAAM,eAAA,KAAoB,MAAA,EAAW,IAAA,CAAK,kBAAkB,KAAA,CAAM,eAAA;AACtE,EAAA,IAAI,MAAM,OAAA,KAAY,MAAA;AACpB,IAAA,IAAA,CAAK,UAAU,KAAA,CAAM,OAAA;AACvB,EAAA,IAAI,KAAA,CAAM,QAAA,KAAa,MAAA,EAAW,IAAA,CAAK,WAAW,KAAA,CAAM,QAAA;AACxD,EAAA,IAAI,KAAA,CAAM,QAAA,KAAa,MAAA,EAAW,IAAA,CAAK,WAAW,KAAA,CAAM,QAAA;AACxD,EAAA,IAAI,KAAA,CAAM,cAAA,KAAmB,MAAA,EAAW,IAAA,CAAK,iBAAiB,KAAA,CAAM,cAAA;AACpE,EAAA,IAAI,KAAA,CAAM,IAAA,KAAS,MAAA,EAAW,IAAA,CAAK,OAAO,KAAA,CAAM,IAAA;AAChD,EAAA,IAAI,KAAA,CAAM,WAAA,KAAgB,MAAA,EAAW,IAAA,CAAK,cAAc,KAAA,CAAM,WAAA;AAC9D,EAAA,IAAA,CAAK,SAAA,GAAA,iBAAY,IAAI,IAAA,EAAK,EAAE,WAAA,EAAY;AACxC,EAAA,OAAO,IAAA;AACT;AAEO,SAAS,eAAe,IAAA,EAAuB;AACpD,EAAA,MAAM,MAAM,MAAA,CAAO,SAAA,CAAU,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AACnD,EAAA,IAAI,GAAA,KAAQ,IAAI,OAAO,KAAA;AACvB,EAAA,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AACpB,EAAA,OAAO,IAAA;AACT;;AClJO,SAAS,mBAAmB,IAAA,EAA2C;AAC5E,EAAA,MAAM,EAAE,GAAA,EAAK,IAAA,EAAK,GAAI,IAAA;AAEtB,EAAA,OAAO;AAAA,IACL,MAAM,IAAA,CAAK,KAAA,GAAQ,EAAC,EAAG;AACrB,MAAA,IAAI,MAAK,EAAG;AACV,QAAA,MAAM,GAAA,GAAM,aAAa,KAAK,CAAA;AAC9B,QAAA,OAAO,EAAE,OAAO,GAAA,CAAI,KAAA,CAAM,IAAI,SAAS,CAAA,EAAG,KAAA,EAAO,GAAA,CAAI,KAAA,EAAM;AAAA,MAC7D;AACA,MAAA,OAAO,GAAA,CAA6B,cAAA,CAAe,IAAA,EAAM,EAAE,OAAO,CAAA;AAAA,IACpE,CAAA;AAAA,IAEA,MAAM,OAAO,IAAA,EAAM;AACjB,MAAA,IAAI,MAAK,EAAG,OAAO,UAAU,cAAA,CAAe,IAAI,GAAG,IAAI,CAAA;AACvD,MAAA,OAAO,GAAA,CAAiB,cAAA,CAAe,MAAA,CAAO,IAAI,CAAC,CAAA;AAAA,IACrD,CAAA;AAAA,IAEA,MAAM,OAAO,OAAA,EAAS;AACpB,MAAA,IAAI,MAAK,EAAG,OAAO,SAAA,CAAU,cAAA,CAAe,OAAO,CAAC,CAAA;AACpD,MAAA,OAAO,GAAA,CAAiB,eAAe,IAAA,EAAM,EAAE,QAAQ,MAAA,EAAQ,IAAA,EAAM,SAAS,CAAA;AAAA,IAChF,CAAA;AAAA,IAEA,MAAM,MAAA,CAAO,IAAA,EAAM,OAAA,EAAS;AAC1B,MAAA,IAAI,IAAA,IAAQ,OAAO,SAAA,CAAU,eAAe,IAAA,EAAM,OAAO,GAAG,IAAI,CAAA;AAChE,MAAA,OAAO,GAAA,CAAiB,cAAA,CAAe,MAAA,CAAO,IAAI,CAAA,EAAG,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,OAAA,EAAS,CAAA;AAAA,IACvF,CAAA;AAAA,IAEA,MAAM,OAAO,IAAA,EAAM;AACjB,MAAA,IAAI,MAAK,EAAG;AACV,QAAA,cAAA,CAAe,IAAI,CAAA;AACnB,QAAA;AAAA,MACF;AACA,MAAA,MAAM,GAAA,CAAI,eAAe,MAAA,CAAO,IAAI,GAAG,EAAE,MAAA,EAAQ,UAAU,CAAA;AAAA,IAC7D,CAAA;AAAA,IAEA,MAAM,UAAA,CAAW,UAAA,EAAY,OAAA,EAAS,OAAA,EAAS;AAC7C,MAAA,IAAI,IAAA,IAAQ,OAAO,EAAE,gBAAgB,CAAA,EAAG,YAAA,EAAc,CAAC,WAAW,CAAA,EAAE;AACpE,MAAA,OAAO,GAAA,CAAwB,eAAe,UAAA,EAAY;AAAA,QACxD,MAAA,EAAQ,MAAA;AAAA,QACR,IAAA,EAAM,EAAE,UAAA,EAAY,OAAA,EAAQ;AAAA,QAC5B,GAAI,SAAS,SAAA,IAAa,IAAA,GAAO,EAAE,OAAA,EAAS,OAAA,CAAQ,SAAA,EAAU,GAAI;AAAC,OACpE,CAAA;AAAA,IACH;AAAA,GACF;AACF;AAIA,SAAS,SAAA,CAAU,MAA+B,IAAA,EAA2B;AAC3E,EAAA,IAAI,CAAC,IAAA,EAAM,MAAM,SAAA,CAAU,CAAA,KAAA,EAAQ,IAAI,CAAA,UAAA,CAAY,CAAA;AACnD,EAAA,OAAO,UAAU,IAAI,CAAA;AACvB;AAEA,SAAS,UAAU,OAAA,EAAwB;AACzC,EAAA,MAAM,CAAA,GAAI,IAAI,KAAA,CAAM,OAAO,CAAA;AAC3B,EAAC,EAAsC,UAAA,GAAa,GAAA;AACpD,EAAA,OAAO,CAAA;AACT;;ACzHO,MAAM,qBAAA,GAAwB;AAO9B,MAAM,mBAAA,GAAsB;AAE5B,MAAM,iBAAA,GAAoB;AAAA;AAAA,EAE/B,MAAA,EAAQ,CAAC,QAAA,KAA6B,CAAA,iBAAA,EAAoB,QAAQ,CAAA;AACpE;;AChBO,MAAM,qBAAA,GAAkC;AAAA,EAC7C,qBAAA;AAAA,EACA,mBAAA;AAAA,EACA;AACF,CAAA;AAGA,IAAI,OAAA,GAAoB,sBAAsB,KAAA,EAAM;AAE7C,SAAS,sBAAA,GAAmC;AACjD,EAAA,OAAO,QAAQ,KAAA,EAAM;AACvB;AAEO,SAAS,uBAAuB,MAAA,EAA4B;AACjE,EAAA,OAAA,GAAU,OAAO,KAAA,EAAM;AACvB,EAAA,OAAO,QAAQ,KAAA,EAAM;AACvB;AAGO,MAAM,mBAAA,GAAsB;AAAA,EACjC,aAAA,EAAe,MAAA;AAAA,EACf,aAAA,EAAe,CAAC,QAAA,EAAU,QAAA,EAAU,UAAU,QAAA,EAAU,QAAA,EAAU,UAAU,QAAQ;AACtF,CAAA;AAEO,SAAS,oBAAA,GAGd;AACA,EAAA,OAAO;AAAA,IACL,eAAe,mBAAA,CAAoB,aAAA;AAAA,IACnC,aAAA,EAAe,mBAAA,CAAoB,aAAA,CAAc,KAAA;AAAM,GACzD;AACF;;ACeO,SAAS,sBAAsB,IAAA,EAAiD;AACrF,EAAA,MAAM,EAAE,GAAA,EAAK,IAAA,EAAK,GAAI,IAAA;AAEtB,EAAA,OAAO;AAAA,IACL,MAAM,kBAAA,GAAqB;AACzB,MAAA,IAAI,IAAA,EAAK,EAAG,OAAO,sBAAA,EAAuB;AAC1C,MAAA,MAAM,MAAM,MAAM,GAAA;AAAA,QAChB,iBAAA,CAAkB,OAAO,qBAAqB;AAAA,OAChD;AACA,MAAA,OAAO,GAAA,CAAI,IAAA,EAAM,MAAA,IAAU,EAAC;AAAA,IAC9B,CAAA;AAAA,IAEA,MAAM,mBAAmB,MAAA,EAAQ;AAC/B,MAAA,IAAI,IAAA,EAAK,EAAG,OAAO,sBAAA,CAAuB,MAAM,CAAA;AAChD,MAAA,MAAM,OAAA,GAAmC,EAAE,MAAA,EAAO;AAClD,MAAA,MAAM,MAAM,MAAM,GAAA;AAAA,QAChB,iBAAA,CAAkB,OAAO,qBAAqB,CAAA;AAAA,QAC9C,EAAE,MAAA,EAAQ,KAAA,EAAO,IAAA,EAAM,OAAA;AAAQ,OACjC;AACA,MAAA,OAAO,GAAA,CAAI,MAAM,MAAA,IAAU,MAAA;AAAA,IAC7B,CAAA;AAAA,IAEA,MAAM,gBAAA,GAAmB;AACvB,MAAA,IAAI,IAAA,EAAK,EAAG,OAAO,oBAAA,EAAqB;AACxC,MAAA,MAAM,MAAM,MAAM,GAAA,CAA4B,iBAAA,CAAkB,MAAA,CAAO,mBAAmB,CAAC,CAAA;AAC3F,MAAA,OAAO;AAAA,QACL,aAAA,EAAe,GAAA,CAAI,IAAA,EAAM,aAAA,IAAiB,EAAA;AAAA,QAC1C,aAAA,EAAe,GAAA,CAAI,IAAA,EAAM,aAAA,IAAiB;AAAC,OAC7C;AAAA,IACF;AAAA,GACF;AACF;;AC7DA,MAAM,QAAA,GAA4D;AAAA,EAChE,GAAA,EAAK,iBAAA;AAAA,EACL,QAAQ,eAAA,CAAgB,eAAA;AAAA,EACxB,MAAM,eAAA,CAAgB,IAAA;AAAA,EACtB,QAAQ,eAAA,CAAgB,MAAA;AAAA,EACxB,UAAU,gBAAA,CAAiB;AAC7B,CAAA;AAEA,SAAS,YAAY,GAAA,EAA4B;AAC/C,EAAA,IAAI,OAAO,QAAA,KAAa,WAAA,EAAa,OAAO,IAAA;AAC5C,EAAA,MAAM,KAAA,GAAQ,SAAS,MAAA,CAAO,KAAA,CAAM,IAAI,MAAA,CAAO,CAAA,QAAA,EAAW,GAAG,CAAA,QAAA,CAAU,CAAC,CAAA;AACxE,EAAA,OAAO,KAAA,GAAQ,kBAAA,CAAmB,KAAA,CAAM,CAAC,CAAC,CAAA,GAAI,IAAA;AAChD;AAOO,SAAS,aAAA,CAAc,IAAA,GAA8B,EAAC,EAAkB;AAC7E,EAAA,MAAM,GAAA,GAAM,EAAE,GAAG,QAAA,EAAU,GAAG,IAAA,EAAK;AACnC,EAAA,OAAO;AAAA,IACL,GAAA,EAAK,MAAM,WAAA,CAAY,GAAA,CAAI,GAAG,CAAA;AAAA,IAC9B,GAAA,EAAK,CAAC,CAAA,KAAM;AACV,MAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACrC,MAAA,MAAM,KAAA,GAAQ;AAAA,QACZ,GAAG,GAAA,CAAI,GAAG,CAAA,CAAA,EAAI,kBAAA,CAAmB,CAAC,CAAC,CAAA,CAAA;AAAA,QACnC,CAAA,QAAA,EAAW,IAAI,MAAM,CAAA,CAAA;AAAA,QACrB,CAAA,KAAA,EAAQ,IAAI,IAAI,CAAA,CAAA;AAAA,QAChB,GAAA,CAAI,SAAS,QAAA,GAAW,EAAA;AAAA,QACxB,GAAA,CAAI,QAAA,GAAW,CAAA,SAAA,EAAY,GAAA,CAAI,QAAQ,CAAA,CAAA,GAAK,EAAA;AAAA,QAC5C,GAAA,CAAI,MAAA,GAAS,CAAA,OAAA,EAAU,GAAA,CAAI,MAAM,CAAA,CAAA,GAAK;AAAA,OACxC,CAAE,OAAO,OAAO,CAAA;AAChB,MAAA,QAAA,CAAS,MAAA,GAAS,KAAA,CAAM,IAAA,CAAK,IAAI,CAAA;AAAA,IACnC,CAAA;AAAA,IACA,OAAO,MAAM;AACX,MAAA,IAAI,OAAO,aAAa,WAAA,EAAa;AACrC,MAAA,QAAA,CAAS,SAAS,CAAA,EAAG,GAAA,CAAI,GAAG,CAAA,mBAAA,EAAsB,IAAI,IAAI,CAAA,CAAA;AAAA,IAC5D;AAAA,GACF;AACF;;ACvDA,MAAM,GAAA,GAAM,iBAAA;AAOL,SAAS,mBAAA,GAAqC;AACnD,EAAA,MAAM,SAAS,OAAO,MAAA,KAAW,WAAA,IAAe,CAAC,CAAC,MAAA,CAAO,YAAA;AACzD,EAAA,OAAO;AAAA,IACL,KAAK,MAAO,MAAA,GAAS,OAAO,YAAA,CAAa,OAAA,CAAQ,GAAG,CAAA,GAAI,IAAA;AAAA,IACxD,GAAA,EAAK,CAAC,CAAA,KAAM;AACV,MAAA,IAAI,MAAA,EAAQ,MAAA,CAAO,YAAA,CAAa,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAChD,CAAA;AAAA,IACA,OAAO,MAAM;AACX,MAAA,IAAI,MAAA,EAAQ,MAAA,CAAO,YAAA,CAAa,UAAA,CAAW,GAAG,CAAA;AAAA,IAChD;AAAA,GACF;AACF;;ACfO,SAAS,aAAA,GAA+B;AAC7C,EAAA,IAAI,KAAA,GAAuB,IAAA;AAC3B,EAAA,OAAO;AAAA,IACL,KAAK,MAAM,KAAA;AAAA,IACX,GAAA,EAAK,CAAC,CAAA,KAAM;AACV,MAAA,KAAA,GAAQ,CAAA;AAAA,IACV,CAAA;AAAA,IACA,OAAO,MAAM;AACX,MAAA,KAAA,GAAQ,IAAA;AAAA,IACV;AAAA,GACF;AACF;;ACXO,SAAS,cAAA,CACd,MACA,UAAA,EACe;AACf,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,cAAA;AACH,MAAA,OAAO,mBAAA,EAAoB;AAAA,IAC7B,KAAK,QAAA;AACH,MAAA,OAAO,cAAc,UAAU,CAAA;AAAA,IACjC,KAAK,gBAAA;AAGH,MAAA,MAAM,IAAI,KAAA;AAAA,QACR;AAAA,OACF;AAAA,IACF,KAAK,QAAA;AAAA,IACL;AACE,MAAA,OAAO,aAAA,EAAc;AAAA;AAE3B;;ACHO,MAAM,YAAA,CAAa;AAAA,EACf,UAAA;AAAA,EACA,MAAA;AAAA,EACQ,WAAA;AAAA,EACT,OAAA;AAAA;AAAA,EAES,QAAA;AAAA,EAEjB,WAAA,CAAY,OAAA,EAAwB,IAAA,GAA6B,EAAC,EAAG;AACnE,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,cAAc,IAAA,CAAK,WAAA;AACxB,IAAA,IAAA,CAAK,UAAA,GAAa,IAAA,CAAK,UAAA,IAAc,WAAA,CAAY,aAAA;AACjD,IAAA,IAAA,CAAK,MAAA,GAAS,KAAK,MAAA,IAAU,EAAA;AAC7B,IAAA,IAAA,CAAK,QAAA,GAAW,GAAA,CAAI,OAAA,CAAQ,GAAA,EAAK,CAAA;AAAA,EACnC;AAAA;AAAA,EAGA,IAAI,YAAA,GAA8B;AAChC,IAAA,OAAO,KAAK,QAAA,CAAS,KAAA;AAAA,EACvB;AAAA,EAEA,GAAA,GAAqB;AACnB,IAAA,OAAO,IAAA,CAAK,QAAQ,GAAA,EAAI;AAAA,EAC1B;AAAA;AAAA,EAGA,SAAA,GAA2B;AACzB,IAAA,MAAM,CAAA,GAAI,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAI;AAC3B,IAAA,OAAO,IAAI,CAAA,EAAG,IAAA,CAAK,MAAM,CAAA,EAAG,CAAC,CAAA,CAAA,GAAK,IAAA;AAAA,EACpC;AAAA,EAEA,GAAA,GAAe;AACb,IAAA,OAAO,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAI,KAAM,IAAA;AAAA,EAChC;AAAA,EAEA,IAAI,KAAA,EAAqB;AACvB,IAAA,IAAI,CAAC,KAAA,EAAO;AACZ,IAAA,IAAA,CAAK,OAAA,CAAQ,IAAI,KAAK,CAAA;AACtB,IAAA,IAAA,CAAK,SAAS,KAAA,GAAQ,KAAA;AACtB,IAAA,IAAA,CAAK,cAAc,KAAK,CAAA;AAAA,EAC1B;AAAA,EAEA,KAAA,GAAc;AACZ,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AACnB,IAAA,IAAA,CAAK,SAAS,KAAA,GAAQ,IAAA;AAAA,EACxB;AAAA;AAAA,EAGA,YAAY,OAAA,EAA8B;AACxC,IAAA,MAAM,OAAA,GAAU,IAAA,CAAK,OAAA,CAAQ,GAAA,EAAI;AACjC,IAAA,IAAA,CAAK,QAAQ,KAAA,EAAM;AACnB,IAAA,IAAI,OAAA,EAAS,OAAA,CAAQ,GAAA,CAAI,OAAO,CAAA;AAChC,IAAA,IAAA,CAAK,OAAA,GAAU,OAAA;AACf,IAAA,IAAA,CAAK,QAAA,CAAS,KAAA,GAAQ,OAAA,CAAQ,GAAA,EAAI;AAAA,EACpC;AACF;;ACxBO,SAAS,qBAAqB,OAAA,EAAsC;AACzE,EAAA,MAAM;AAAA,IACJ,GAAA;AAAA,IACA,QAAA;AAAA,IACA,OAAA;AAAA,IACA,OAAA;AAAA,IACA,aAAA;AAAA,IACA,IAAA;AAAA,IACA,SAAA,EAAW,YAAA;AAAA,IACX;AAAA,GACF,GAAI,OAAA;AAEJ,EAAA,IAAI,CAAC,GAAA,EAAK,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAEnE,EAAA,MAAM,SAAA,GAAY,cAAc,SAAA,IAAa,uBAAA;AAC7C,EAAA,MAAM,KAAA,GAAQ,cAAc,KAAA,IAAS,mBAAA;AACrC,EAAA,MAAM,EAAA,GACJ,aAAA,KAAkB,OAAO,SAAA,KAAc,cAAc,SAAA,GAAY,MAAA,CAAA;AAEnE,EAAA,MAAM,KAAA,GAAgC,GAAA,CAAI,mBAAA,CAAoB,IAAI,CAAA;AAElE,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAAoB;AAC9C,EAAA,MAAM,oBAAA,uBAA2B,GAAA,EAA2B;AAC5D,EAAA,MAAM,eAAA,uBAAsB,GAAA,EAAsB;AAClD,EAAA,MAAM,aAAA,uBAAoB,GAAA,EAA8B;AAExD,EAAA,MAAM,UAAA,uBAAiB,GAAA,EAAY;AACnC,EAAA,MAAM,cAAA,uBAAqB,GAAA,EAA4C;AAEvE,EAAA,IAAI,MAAA,GAA2B,IAAA;AAC/B,EAAA,IAAI,WAAA,GAAc,KAAA;AAClB,EAAA,IAAI,cAAA,GAAiB,SAAA;AACrB,EAAA,IAAI,cAAA,GAAuD,IAAA;AAC3D,EAAA,IAAI,SAAA,GAAkD,IAAA;AAGtD,EAAA,IAAI,aAAA,GAA+B,IAAA;AAEnC,EAAA,MAAM,cAAA,GAAiB,QAAQ,cAAA,IAAkB,mBAAA;AACjD,EAAA,IAAI,UAAA,GAAa,CAAA;AACjB,EAAA,IAAI,iBAAA,GAA2D,IAAA;AAE/D,EAAA,IAAI,gBAAA,GAAmB,KAAA;AACvB,EAAA,IAAI,mBAAA,GAAsB,KAAA;AAE1B,EAAA,IAAI,iBAAA,GAAoB,CAAA;AAExB,EAAA,MAAM,aAAA,GACJ,aACC,MAAqB;AAEpB,IAAA,OAAO,IAAA;AAAA,EACT,CAAA,CAAA;AAEF,EAAA,MAAM,QAAA,GAAW,CAAC,IAAA,KAAkC;AAClD,IAAA,IAAI,KAAA,CAAM,UAAU,IAAA,EAAM;AAC1B,IAAA,KAAA,CAAM,KAAA,GAAQ,IAAA;AACd,IAAA,KAAA,MAAW,CAAA,IAAK,aAAA,EAAe,CAAA,CAAE,IAAI,CAAA;AAAA,EACvC,CAAA;AAEA,EAAA,MAAM,IAAA,GAAO,CAAC,GAAA,KAAkC;AAC9C,IAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,UAAA,KAAe,SAAA,CAAU,MAAM,OAAO,KAAA;AAC5D,IAAA,IAAI;AACF,MAAA,MAAA,CAAO,IAAA,CAAK,IAAA,CAAK,SAAA,CAAU,GAAG,CAAC,CAAA;AAC/B,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,cAAc,MAAY;AAC9B,IAAA,IAAI,cAAA,EAAgB;AAClB,MAAA,YAAA,CAAa,cAAc,CAAA;AAC3B,MAAA,cAAA,GAAiB,IAAA;AAAA,IACnB;AACA,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,YAAA,CAAa,SAAS,CAAA;AACtB,MAAA,SAAA,GAAY,IAAA;AAAA,IACd;AACA,IAAA,IAAI,iBAAA,EAAmB;AACrB,MAAA,aAAA,CAAc,iBAAiB,CAAA;AAC/B,MAAA,iBAAA,GAAoB,IAAA;AAAA,IACtB;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,qBAAqB,MAAY;AACrC,IAAA,IAAI,UAAA,CAAW,SAAS,CAAA,EAAG;AAC3B,IAAA,MAAM,MAAA,GAAS,CAAC,GAAG,UAAU,CAAA;AAC7B,IAAA,IAAI,MAAA,CAAO,SAAS,oBAAA,EAAsB;AACxC,MAAA,OAAA,CAAQ,IAAA;AAAA,QACN,CAAA,aAAA,EAAgB,MAAA,CAAO,MAAM,CAAA,sCAAA,EAAyC,oBAAoB,CAAA,mCAAA;AAAA,OAC5F;AAAA,IACF;AACA,IAAA,MAAM,OAAA,GAA+B;AAAA,MACnC,MAAM,eAAA,CAAgB,SAAA;AAAA,MACtB;AAAA,KACF;AACA,IAAA,IAAA,CAAK,OAAO,CAAA;AAAA,EACd,CAAA;AAEA,EAAA,MAAM,aAAa,MAAY;AAC7B,IAAA,MAAM,QAAQ,aAAA,EAAc;AAC5B,IAAA,IAAI,CAAC,KAAA,EAAO;AAGV,MAAA,QAAA,CAAS,oBAAoB,cAAc,CAAA;AAC3C,MAAA;AAAA,IACF;AACA,IAAA,QAAA,CAAS,oBAAoB,cAAc,CAAA;AAC3C,IAAA,MAAM,IAAA,GAAuB,EAAE,IAAA,EAAM,eAAA,CAAgB,MAAM,KAAA,EAAM;AACjE,IAAA,IAAA,CAAK,IAAI,CAAA;AACT,IAAA,IAAI,SAAA,eAAwB,SAAS,CAAA;AACrC,IAAA,SAAA,GAAY,WAAW,MAAM;AAG3B,MAAA,IAAI,MAAA,IAAU,MAAA,CAAO,UAAA,KAAe,SAAA,CAAU,IAAA,EAAM;AAClD,QAAA,IAAI;AACF,UAAA,MAAA,CAAO,KAAA,CAAM,aAAA,CAAc,mBAAA,EAAqB,qBAAqB,CAAA;AAAA,QACvE,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF,GAAG,kBAAkB,CAAA;AAAA,EACvB,CAAA;AAEA,EAAA,MAAM,aAAA,GAAgB,CAAC,GAAA,KAAuB;AAC5C,IAAA,IAAI,GAAA;AACJ,IAAA,IAAI;AACF,MAAA,GAAA,GACE,OAAO,GAAA,KAAQ,QAAA,GAAY,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA,GAAyB,GAAA;AAAA,IACtE,CAAA,CAAA,MAAQ;AACN,MAAA;AAAA,IACF;AACA,IAAA,QAAA,CAAS,GAAG,CAAA;AAAA,EACd,CAAA;AAEA,EAAA,MAAM,QAAA,GAAW,CAAC,GAAA,KAA+B;AAC/C,IAAA,QAAQ,IAAI,IAAA;AAAM,MAChB,KAAK,gBAAgB,OAAA,EAAS;AAC5B,QAAA,IAAI,SAAA,EAAW;AACb,UAAA,YAAA,CAAa,SAAS,CAAA;AACtB,UAAA,SAAA,GAAY,IAAA;AAAA,QACd;AAEA,QAAA,iBAAA,GAAoB,CAAA;AACpB,QAAA,cAAA,GAAiB,SAAA;AACjB,QAAA,QAAA,CAAS,oBAAoB,IAAI,CAAA;AAGjC,QAAA,UAAA,GAAa,KAAK,GAAA,EAAI;AACtB,QAAA,iBAAA,EAAkB;AAClB,QAAA,kBAAA,EAAmB;AACnB,QAAA,KAAA,MAAW,CAAA,IAAK,eAAA,EAAiB,CAAA,CAAE,GAAG,CAAA;AACtC,QAAA;AAAA,MACF;AAAA,MACA,KAAK,gBAAgB,SAAA,EAAW;AAE9B,QAAA,WAAA,GAAc,IAAA;AACd,QAAA,KAAA,MAAW,CAAA,IAAK,eAAA,EAAiB,CAAA,CAAE,GAAG,CAAA;AACtC,QAAA,IAAI;AACF,UAAA,MAAA,EAAQ,KAAA,EAAM;AAAA,QAChB,CAAA,CAAA,MAAQ;AAAA,QAER;AACA,QAAA,QAAA,CAAS,oBAAoB,MAAM,CAAA;AACnC,QAAA;AAAA,MACF;AAAA,MACA,KAAK,gBAAgB,YAAA,EAAc;AAMjC,QAAA,KAAA,CAAM,YAAY;AAChB,UAAA,MAAM,OAAA,GAAU,MAAM,kBAAA,EAAmB;AACzC,UAAA,IAAI,CAAC,OAAA,EAAS,KAAA,MAAW,CAAA,IAAK,eAAA,IAAmB,GAAG,CAAA;AAAA,QACtD,CAAA,GAAG;AACH,QAAA;AAAA,MACF;AAAA,MACA,KAAK,gBAAgB,IAAA,EAAM;AAEzB,QAAA,UAAA,GAAa,KAAK,GAAA,EAAI;AACtB,QAAA,MAAM,IAAA,GAAuB,EAAE,IAAA,EAAM,eAAA,CAAgB,IAAA,EAAK;AAC1D,QAAA,IAAA,CAAK,IAAI,CAAA;AACT,QAAA;AAAA,MACF;AAAA,MACA,KAAK,gBAAgB,KAAA,EAAO;AAC1B,QAAA,KAAA,MAAW,CAAA,IAAK,aAAA,EAAe,CAAA,CAAE,GAAG,CAAA;AACpC,QAAA;AAAA,MACF;AAAA,MACA,KAAK,gBAAgB,aAAA,EAAe;AAClC,QAAA,MAAM,EAAA,GAAK,cAAA,CAAe,GAAA,CAAI,GAAA,CAAI,SAAS,CAAA;AAC3C,QAAA,IAAI,EAAA,EAAI;AACN,UAAA,cAAA,CAAe,MAAA,CAAO,IAAI,SAAS,CAAA;AACnC,UAAA,EAAA,CAAG,GAAG,CAAA;AAAA,QACR;AACA,QAAA,KAAA,MAAW,CAAA,IAAK,oBAAA,EAAsB,CAAA,CAAE,GAAG,CAAA;AAC3C,QAAA;AAAA,MACF;AAAA,MACA,KAAK,eAAA,CAAgB,eAAA;AAAA,MACrB,KAAK,eAAA,CAAgB,MAAA;AAAA,MACrB,KAAK,eAAA,CAAgB,SAAA;AAAA,MACrB,KAAK,eAAA,CAAgB,QAAA;AAAA,MACrB,KAAK,eAAA,CAAgB,KAAA;AAAA,MACrB,KAAK,gBAAgB,gBAAA,EAAkB;AACrC,QAAA,KAAA,MAAW,CAAA,IAAK,eAAA,EAAiB,CAAA,CAAE,GAAG,CAAA;AACtC,QAAA;AAAA,MACF;AAAA,MACA,SAAS;AACP,QAAA,KAAA,MAAW,CAAA,IAAK,eAAA,EAAiB,CAAA,CAAE,GAAG,CAAA;AAAA,MACxC;AAAA;AACF,EACF,CAAA;AAEA,EAAA,MAAM,qBAAqB,YAA8B;AACvD,IAAA,WAAA,GAAc,IAAA;AACd,IAAA,IAAI;AACF,MAAA,MAAA,EAAQ,KAAA,EAAM;AAAA,IAChB,CAAA,CAAA,MAAQ;AAAA,IAER;AAIA,IAAA,MAAA,GAAS,IAAA;AACT,IAAA,WAAA,EAAY;AACZ,IAAA,IAAI,CAAC,OAAA,EAAS;AACZ,MAAA,QAAA,CAAS,oBAAoB,MAAM,CAAA;AACnC,MAAA,OAAO,KAAA;AAAA,IACT;AACA,IAAA,IAAI;AACF,MAAA,MAAM,IAAA,GAAO,MAAM,OAAA,EAAQ;AAC3B,MAAA,IAAI,CAAC,IAAA,EAAM;AACT,QAAA,QAAA,CAAS,oBAAoB,MAAM,CAAA;AACnC,QAAA,OAAO,KAAA;AAAA,MACT;AAKA,MAAA,OAAA,GAAU,IAAI,CAAA;AACd,MAAA,WAAA,GAAc,KAAA;AACd,MAAA,QAAA,CAAS,oBAAoB,YAAY,CAAA;AACzC,MAAA,iBAAA,CAAkB,CAAC,CAAA;AACnB,MAAA,OAAO,IAAA;AAAA,IACT,CAAA,CAAA,MAAQ;AACN,MAAA,QAAA,CAAS,oBAAoB,MAAM,CAAA;AACnC,MAAA,OAAO,KAAA;AAAA,IACT;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,aAAA,KAAmC;AAItD,IAAA,IAAI,kBAAkB,MAAA,EAAQ;AAC9B,IAAA,MAAA,GAAS,IAAA;AACT,IAAA,WAAA,EAAY;AACZ,IAAA,IAAI,eAAe,gBAAA,EAAkB;AACnC,MAAA,QAAA,CAAS,oBAAoB,MAAM,CAAA;AACnC,MAAA;AAAA,IACF;AACA,IAAA,iBAAA,CAAkB,cAAc,CAAA;AAAA,EAClC,CAAA;AAEA,EAAA,MAAM,iBAAA,GAAoB,CAAC,KAAA,KAAwB;AACjD,IAAA,IAAI,WAAA,EAAa;AAIjB,IAAA,IAAI,qBAAqB,yBAAA,EAA2B;AAClD,MAAA,QAAA,CAAS,oBAAoB,MAAM,CAAA;AACnC,MAAA;AAAA,IACF;AACA,IAAA,iBAAA,IAAqB,CAAA;AACrB,IAAA,QAAA,CAAS,oBAAoB,YAAY,CAAA;AACzC,IAAA,IAAI,cAAA,eAA6B,cAAc,CAAA;AAC/C,IAAA,MAAM,SAAS,IAAA,CAAK,KAAA,CAAM,IAAA,CAAK,MAAA,KAAW,sBAAsB,CAAA;AAChE,IAAA,cAAA,GAAiB,UAAA,CAAW,OAAA,EAAS,KAAA,GAAQ,MAAM,CAAA;AACnD,IAAA,cAAA,GAAiB,IAAA,CAAK,IAAI,IAAA,CAAK,GAAA,CAAI,QAAQ,CAAA,EAAG,SAAS,GAAG,KAAK,CAAA;AAAA,EACjE,CAAA;AAEA,EAAA,MAAM,oBAAoB,MAAY;AACpC,IAAA,IAAI,OAAO,WAAW,WAAA,EAAa;AACnC,IAAA,IAAI,iBAAA,gBAAiC,iBAAiB,CAAA;AACtD,IAAA,iBAAA,GAAoB,YAAY,MAAY;AAG1C,MAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,UAAA,KAAe,UAAU,IAAA,EAAM;AACrD,MAAA,MAAM,SAAA,GAAY,IAAA,CAAK,GAAA,CAAI,mBAAA,EAAqB,cAAc,CAAA,GAAI,uBAAA;AAClE,MAAA,IAAI,IAAA,CAAK,GAAA,EAAI,GAAI,UAAA,GAAa,SAAA,EAAW;AACvC,QAAA,IAAI;AACF,UAAA,MAAA,CAAO,KAAA,CAAM,aAAA,CAAc,MAAA,EAAQ,+BAA+B,CAAA;AAAA,QACpE,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF,GAAG,yBAAyB,CAAA;AAAA,EAC9B,CAAA;AAIA,EAAA,MAAM,gBAAgB,MAAY;AAChC,IAAA,gBAAA,GAAmB,IAAA;AACnB,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAI;AACF,QAAA,MAAA,CAAO,KAAA,CAAM,aAAA,CAAc,MAAA,EAAQ,mBAAmB,CAAA;AAAA,MACxD,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AACA,IAAA,QAAA,CAAS,oBAAoB,MAAM,CAAA;AAAA,EACrC,CAAA;AACA,EAAA,MAAM,eAAe,MAAY;AAC/B,IAAA,gBAAA,GAAmB,KAAA;AACnB,IAAA,IAAA,EAAK;AAAA,EACP,CAAA;AACA,EAAA,MAAM,6BAA6B,MAAY;AAC7C,IAAA,IAAI,mBAAA,IAAuB,OAAO,MAAA,KAAW,WAAA,EAAa;AAC1D,IAAA,mBAAA,GAAsB,IAAA;AACtB,IAAA,MAAA,CAAO,gBAAA,CAAiB,WAAW,aAAa,CAAA;AAChD,IAAA,MAAA,CAAO,gBAAA,CAAiB,UAAU,YAAY,CAAA;AAAA,EAChD,CAAA;AAEA,EAAA,MAAM,UAAU,MAAY;AAC1B,IAAA,IAAI,CAAC,EAAA,EAAI;AAET,IAAA,IAAI,OAAO,SAAA,KAAc,WAAA,IAAe,SAAA,CAAU,WAAW,KAAA,EAAO;AAClE,MAAA,QAAA,CAAS,oBAAoB,MAAM,CAAA;AACnC,MAAA;AAAA,IACF;AACA,IAAA,IACE,MAAA,KACC,OAAO,UAAA,KAAe,SAAA,CAAU,QAAQ,MAAA,CAAO,UAAA,KAAe,UAAU,UAAA,CAAA,EACzE;AACA,MAAA;AAAA,IACF;AACA,IAAA,WAAA,GAAc,KAAA;AAEd,IAAA,UAAA,GAAa,CAAA;AACb,IAAA,QAAA,CAAS,oBAAoB,OAAO,CAAA;AACpC,IAAA,IAAI,CAAA;AACJ,IAAA,IAAI;AACF,MAAA,CAAA,GAAI,IAAI,GAAG,GAAG,CAAA;AAAA,IAChB,CAAA,CAAA,MAAQ;AACN,MAAA,iBAAA,CAAkB,SAAS,CAAA;AAC3B,MAAA;AAAA,IACF;AAGA,IAAA,MAAA,GAAS,CAAA;AAGT,IAAA,aAAA,GAAgB,eAAc,IAAK,IAAA;AACnC,IAAA,CAAA,CAAE,MAAA,GAAS,MAAM,UAAA,EAAW;AAC5B,IAAA,CAAA,CAAE,SAAA,GAAY,CAAC,EAAA,KAAqB,aAAA,CAAc,GAAG,IAAI,CAAA;AACzD,IAAA,CAAA,CAAE,UAAU,MAAM;AAAA,IAElB,CAAA;AACA,IAAA,CAAA,CAAE,OAAA,GAAU,MAAM,WAAA,CAAY,CAAC,CAAA;AAAA,EACjC,CAAA;AAEA,EAAA,MAAM,OAAO,MAAY;AACvB,IAAA,0BAAA,EAA2B;AAC3B,IAAA,WAAA,GAAc,KAAA;AACd,IAAA,OAAA,EAAQ;AAAA,EACV,CAAA;AAWA,EAAA,MAAM,SAAS,MAAY;AAIzB,IAAA,MAAM,GAAA,GAAM,eAAc,IAAK,IAAA;AAC/B,IAAA,IACE,MAAA,KACC,MAAA,CAAO,UAAA,KAAe,SAAA,CAAU,IAAA,IAAQ,OAAO,UAAA,KAAe,SAAA,CAAU,UAAA,CAAA,IACzE,GAAA,KAAQ,aAAA,EACR;AACA,MAAA;AAAA,IACF;AACA,IAAA,WAAA,EAAY;AAIZ,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAI;AACF,QAAA,MAAA,CAAO,KAAA,CAAM,aAAA,CAAc,MAAA,EAAQ,eAAe,CAAA;AAAA,MACpD,CAAA,CAAA,MAAQ;AAAA,MAER;AAAA,IACF;AACA,IAAA,MAAA,GAAS,IAAA;AACT,IAAA,cAAA,GAAiB,SAAA;AACjB,IAAA,QAAA,CAAS,oBAAoB,IAAI,CAAA;AACjC,IAAA,OAAA,EAAQ;AAAA,EACV,CAAA;AAEA,EAAA,MAAM,KAAA,GAAQ,CAAC,MAAA,KAA0B;AACvC,IAAA,WAAA,GAAc,IAAA;AACd,IAAA,WAAA,EAAY;AACZ,IAAA,IAAI,MAAA,EAAQ;AACV,MAAA,IAAI;AACF,QAAA,MAAA,CAAO,KAAA,CAAM,aAAA,CAAc,MAAA,EAAQ,MAAM,CAAA;AAAA,MAC3C,CAAA,CAAA,MAAQ;AAAA,MAER;AACA,MAAA,MAAA,GAAS,IAAA;AAAA,IACX;AACA,IAAA,QAAA,CAAS,oBAAoB,MAAM,CAAA;AAAA,EACrC,CAAA;AAEA,EAAA,MAAM,SAAA,GAAY,CAAC,MAAA,KAA2B;AAC5C,IAAA,MAAM,QAAkB,EAAC;AACzB,IAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,MAAA,IAAI,CAAC,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA,EAAG;AACtB,QAAA,UAAA,CAAW,IAAI,CAAC,CAAA;AAChB,QAAA,KAAA,CAAM,KAAK,CAAC,CAAA;AAAA,MACd;AAAA,IACF;AACA,IAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACxB,IAAA,MAAM,OAAA,GAA+B;AAAA,MACnC,MAAM,eAAA,CAAgB,SAAA;AAAA,MACtB,MAAA,EAAQ;AAAA,KACV;AACA,IAAA,IAAA,CAAK,OAAO,CAAA;AAAA,EACd,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,MAAA,KAA2B;AAC9C,IAAA,MAAM,UAAoB,EAAC;AAC3B,IAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,MAAA,IAAI,WAAW,MAAA,CAAO,CAAC,CAAA,EAAG,OAAA,CAAQ,KAAK,CAAC,CAAA;AAAA,IAC1C;AACA,IAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AAC1B,IAAA,MAAM,OAAA,GAAiC;AAAA,MACrC,MAAM,eAAA,CAAgB,WAAA;AAAA,MACtB,MAAA,EAAQ;AAAA,KACV;AACA,IAAA,IAAA,CAAK,OAAO,CAAA;AAAA,EACd,CAAA;AAEA,EAAA,MAAM,iBAAiB,MAAY;AACjC,IAAA,UAAA,CAAW,KAAA,EAAM;AACjB,IAAA,MAAM,OAAA,GAAoC;AAAA,MACxC,MAAM,eAAA,CAAgB;AAAA,KACxB;AACA,IAAA,IAAA,CAAK,OAAO,CAAA;AAAA,EACd,CAAA;AAEA,EAAA,MAAM,YAAA,GAAe,CACnB,WAAA,EACA,MAAA,EACA,MAAA,KACW;AACX,IAAA,MAAM,SAAA,GACJ,OAAO,MAAA,KAAW,WAAA,IAAe,OAAO,OAAO,UAAA,KAAe,UAAA,GAC1D,MAAA,CAAO,UAAA,EAAW,GAClB,CAAA,IAAA,EAAO,KAAK,GAAA,EAAK,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,QAAA,CAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,EAAE,CAAC,CAAA,CAAA;AAClE,IAAA,MAAM,OAAA,GAA4B;AAAA,MAChC,MAAM,eAAA,CAAgB,MAAA;AAAA,MACtB,SAAA;AAAA,MACA,WAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AACA,IAAA,IAAA,CAAK,OAAO,CAAA;AACZ,IAAA,OAAO,SAAA;AAAA,EACT,CAAA;AAEA,EAAA,MAAM,WAAA,GAAc,CAAC,SAAA,KAA4B;AAC/C,IAAA,MAAM,OAAA,GAAiC;AAAA,MACrC,MAAM,eAAA,CAAgB,YAAA;AAAA,MACtB;AAAA,KACF;AACA,IAAA,IAAA,CAAK,OAAO,CAAA;AAAA,EACd,CAAA;AAGA,EAAA,MAAM,uBAAuB,CAAC,SAAA,KAC5B,IAAI,OAAA,CAAQ,CAAC,OAAA,KAAY;AACvB,IAAA,cAAA,CAAe,GAAA,CAAI,WAAW,OAAO,CAAA;AAAA,EACvC,CAAC,CAAA;AAEH,EAAA,IAAI,aAAA,EAAe;AACjB,IAAA,KAAA,MAAW,CAAA,IAAK,aAAA,EAAe,UAAA,CAAW,GAAA,CAAI,CAAC,CAAA;AAAA,EACjD;AAEA,EAAA,IAAI,CAAC,IAAA,EAAM;AACT,IAAA,cAAA,CAAe,MAAM,MAAM,CAAA;AAAA,EAC7B;AAEA,EAAA,MAAM,YAAA,GAA0B;AAAA,IAC9B,IAAI,KAAA,GAAQ;AACV,MAAA,OAAO,KAAA,CAAM,KAAA;AAAA,IACf,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,CAAA,KAAgC;AACxC,MAAA,aAAA,CAAc,IAAI,CAAC,CAAA;AACnB,MAAA,CAAA,CAAE,MAAM,KAAK,CAAA;AACb,MAAA,OAAO,MAAM,aAAA,CAAc,MAAA,CAAO,CAAC,CAAA;AAAA,IACrC,CAAA;AAAA,IACA,OAAA,EAAS,CAAC,CAAA,KAAsB;AAC9B,MAAA,aAAA,CAAc,IAAI,CAAC,CAAA;AACnB,MAAA,OAAO,MAAM,aAAA,CAAc,MAAA,CAAO,CAAC,CAAA;AAAA,IACrC,CAAA;AAAA,IACA,cAAA,EAAgB,CAAC,CAAA,KAA6B;AAC5C,MAAA,oBAAA,CAAqB,IAAI,CAAC,CAAA;AAC1B,MAAA,OAAO,MAAM,oBAAA,CAAqB,MAAA,CAAO,CAAC,CAAA;AAAA,IAC5C,CAAA;AAAA,IACA,SAAA,EAAW,CAAC,CAAA,KAAwB;AAClC,MAAA,eAAA,CAAgB,IAAI,CAAC,CAAA;AACrB,MAAA,OAAO,MAAM,eAAA,CAAgB,MAAA,CAAO,CAAC,CAAA;AAAA,IACvC,CAAA;AAAA,IACA,IAAA;AAAA,IACA,MAAA;AAAA,IACA,KAAA;AAAA,IACA,SAAA;AAAA,IACA,WAAA;AAAA,IACA,cAAA;AAAA,IACA,YAAA;AAAA,IACA;AAAA,GACF;AAEA,EAAA,OAAO,MAAA,CAAO,OAAO,YAAA,EAAc;AAAA;AAAA,IAEjC;AAAA,GACD,CAAA;AACH;;ACtiBO,SAAS,aAAa,OAAA,EAAkC;AAC7D,EAAA,MAAM,IAAA,GAAO,OAAA,CAAQ,WAAA,IAAe,EAAC;AACrC,EAAA,MAAM,UAAU,cAAA,CAAe,IAAA,CAAK,OAAA,IAAW,QAAA,EAAU,KAAK,MAAM,CAAA;AACpE,EAAA,MAAM,YAAA,GAAe,IAAI,YAAA,CAAa,OAAA,EAAS;AAAA,IAC7C,YAAY,IAAA,CAAK,UAAA;AAAA;AAAA,IAEjB,MAAA,EAAQ,KAAK,MAAA,IAAU,SAAA;AAAA,IACvB,aAAa,IAAA,CAAK;AAAA,GACnB,CAAA;AAED,EAAA,MAAM,UAAU,OAAA,CAAQ,OAAA;AAExB,EAAA,MAAM,SAAA,GAAY,OAAO,KAAA,KAAwC;AAC/D,IAAA,IAAI,OAAA,EAAS;AACX,MAAA,MAAM,QAAQ,KAAK,CAAA;AAAA,IACrB,WAAW,KAAA,EAAO;AAChB,MAAA,YAAA,CAAa,IAAI,KAAK,CAAA;AAAA,IACxB,CAAA,MAAO;AACL,MAAA,YAAA,CAAa,KAAA,EAAM;AAAA,IACrB;AAAA,EACF,CAAA;AASA,EAAA,IAAI,eAAA,GAAiD,IAAA;AACrD,EAAA,MAAM,mBAAA,GAAsB,OAAA,CAAQ,OAAA,GAChC,MAA8B;AAC5B,IAAA,IAAI,CAAC,eAAA,EAAiB;AACpB,MAAA,eAAA,GAAkB,OAAA,CAAQ,OAAA,EAAS,CAAE,OAAA,CAAQ,MAAM;AACjD,QAAA,eAAA,GAAkB,IAAA;AAAA,MACpB,CAAC,CAAA;AAAA,IACH;AACA,IAAA,OAAO,eAAA;AAAA,EACT,CAAA,GACA,MAAA;AAGJ,EAAA,MAAM,oBAAyC,EAAC;AAChD,EAAA,MAAM,yBAA8D,EAAC;AAErE,EAAA,MAAM,QAAA,GAAW,CAAC,IAAA,EAAc,OAAA,KAC9B,SAAA,CAAU;AAAA,IACR,OAAA;AAAA,IACA,YAAA;AAAA,IACA,UAAU,OAAA,CAAQ,QAAA;AAAA,IAClB,QAAQ,OAAA,CAAQ,MAAA;AAAA,IAChB,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,OAAO,OAAA,CAAQ,KAAA;AAAA,IACf,SAAS,OAAA,CAAQ,OAAA;AAAA,IACjB,gBAAgB,OAAA,CAAQ,cAAA;AAAA,IACxB,OAAA;AAAA,IACA,OAAA,EAAS,mBAAA;AAAA,IACT,gBAAgB,OAAA,CAAQ,cAAA;AAAA,IACxB,eAAe,OAAA,CAAQ,aAAA;AAAA,IACvB,kBAAA,EAAoB,CAAC,GAAG,iBAAA,EAAmB,GAAI,sBAAA,CAAuB,IAAI,CAAA,IAAK,EAAG;AAAA,GACnF,CAAA;AAEH,EAAA,MAAM,OAAe,EAAC;AACtB,EAAA,KAAA,MAAW,CAAC,MAAM,GAAG,CAAA,IAAK,OAAO,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC3D,IAAA,IAAI,KAAK,IAAA,CAAK,IAAI,CAAA,GAAI,QAAA,CAAS,MAAM,GAAG,CAAA;AAAA,EAC1C;AAEA,EAAA,IAAI,CAAC,KAAK,GAAA,EAAK;AACb,IAAA,MAAM,IAAI,MAAM,yCAAyC,CAAA;AAAA,EAC3D;AAKA,EAAA,MAAM,OAAA,GAAU,CAAC,IAAA,KAAiB;AAChC,IAAA,IAAI,OAAA,CAAQ,SAAA,CAAU,IAAI,CAAA,EAAG;AAC3B,MAAA,IAAA,CAAK,IAAI,CAAA,GAAI,QAAA,CAAS,MAAM,OAAA,CAAQ,SAAA,CAAU,IAAI,CAAW,CAAA;AAAA,IAC/D;AAAA,EACF,CAAA;AACA,EAAA,MAAM,aAAa,MAAM;AACvB,IAAA,KAAA,MAAW,CAAC,MAAM,GAAG,CAAA,IAAK,OAAO,OAAA,CAAQ,OAAA,CAAQ,SAAS,CAAA,EAAG;AAC3D,MAAA,IAAI,KAAK,IAAA,CAAK,IAAI,CAAA,GAAI,QAAA,CAAS,MAAM,GAAG,CAAA;AAAA,IAC1C;AAAA,EACF,CAAA;AAEA,EAAA,MAAM,oBAAA,GAAuB,CAAC,MAAA,EAAwB,EAAA,KAAwC;AAC5F,IAAA,IAAI,WAAW,KAAA,EAAO;AACpB,MAAA,iBAAA,CAAkB,KAAK,EAAE,CAAA;AACzB,MAAA,UAAA,EAAW;AACX,MAAA,OAAO,MAAM;AACX,QAAA,MAAM,GAAA,GAAM,iBAAA,CAAkB,OAAA,CAAQ,EAAE,CAAA;AACxC,QAAA,IAAI,GAAA,IAAO,CAAA,EAAG,iBAAA,CAAkB,MAAA,CAAO,KAAK,CAAC,CAAA;AAC7C,QAAA,UAAA,EAAW;AAAA,MACb,CAAA;AAAA,IACF;AACA,IAAA,IAAI,MAAA,GAAS,uBAAuB,MAAM,CAAA;AAC1C,IAAA,IAAI,CAAC,MAAA,EAAQ;AACX,MAAA,MAAA,GAAS,EAAC;AACV,MAAA,sBAAA,CAAuB,MAAM,CAAA,GAAI,MAAA;AAAA,IACnC;AACA,IAAA,MAAA,CAAO,KAAK,EAAE,CAAA;AACd,IAAA,OAAA,CAAQ,MAAM,CAAA;AACd,IAAA,OAAO,MAAM;AACX,MAAA,MAAM,GAAA,GAAM,MAAA,CAAO,OAAA,CAAQ,EAAE,CAAA;AAC7B,MAAA,IAAI,GAAA,IAAO,CAAA,EAAG,MAAA,CAAO,MAAA,CAAO,KAAK,CAAC,CAAA;AAClC,MAAA,OAAA,CAAQ,MAAM,CAAA;AAAA,IAChB,CAAA;AAAA,EACF,CAAA;AAGA,EAAA,MAAM,YAAY,EAAE,OAAA,EAAS,OAAA,CAAQ,OAAA,CAAQ,IAAI,CAAA,EAAE;AAEnD,EAAA,MAAM,OAAO,iBAAA,CAAkB;AAAA,IAC7B,KAAK,IAAA,CAAK,GAAA;AAAA,IACV,UAAU,OAAA,CAAQ,SAAA;AAAA,IAClB,IAAA,EAAM,MAAM,SAAA,CAAU;AAAA,GACvB,CAAA;AAED,EAAA,MAAM,UAAU,oBAAA,CAAqB;AAAA,IACnC,KAAK,IAAA,CAAK,GAAA;AAAA,IACV,IAAA,EAAM,MAAM,SAAA,CAAU;AAAA,GACvB,CAAA;AAED,EAAA,MAAM,QAAQ,kBAAA,CAAmB;AAAA,IAC/B,KAAK,IAAA,CAAK,GAAA;AAAA,IACV,IAAA,EAAM,MAAM,SAAA,CAAU;AAAA,GACvB,CAAA;AAED,EAAA,MAAM,aAAa,uBAAA,CAAwB;AAAA,IACzC,KAAK,IAAA,CAAK,GAAA;AAAA,IACV,IAAA,EAAM,MAAM,SAAA,CAAU;AAAA,GACvB,CAAA;AAED,EAAA,MAAM,WAAW,qBAAA,CAAsB;AAAA,IACrC,KAAK,IAAA,CAAK,GAAA;AAAA,IACV,IAAA,EAAM,MAAM,SAAA,CAAU;AAAA,GACvB,CAAA;AAED,EAAA,MAAM,MAAM,gBAAA,CAAiB;AAAA,IAC3B,KAAK,IAAA,CAAK,GAAA;AAAA,IACV,IAAA,EAAM,MAAM,SAAA,CAAU;AAAA,GACvB,CAAA;AAED,EAAA,MAAM,OAAO,iBAAA,CAAkB;AAAA,IAC7B,KAAK,IAAA,CAAK,GAAA;AAAA,IACV,IAAA,EAAM,MAAM,SAAA,CAAU;AAAA,GACvB,CAAA;AAED,EAAA,MAAM,UAAU,oBAAA,CAAqB;AAAA,IACnC,KAAK,IAAA,CAAK,GAAA;AAAA,IACV,IAAA,EAAM,MAAM,SAAA,CAAU;AAAA,GACvB,CAAA;AAED,EAAA,MAAM,SAAS,mBAAA,CAAoB;AAAA,IACjC,KAAK,IAAA,CAAK,GAAA;AAAA,IACV,IAAA,EAAM,MAAM,SAAA,CAAU;AAAA,GACvB,CAAA;AAID,EAAA,MAAM,MAAM,gBAAA,CAAiB;AAAA,IAC3B,KAAK,IAAA,CAAK;AAAA,GACX,CAAA;AAID,EAAA,MAAM,SAAS,mBAAA,CAAoB;AAAA,IACjC,KAAK,IAAA,CAAK;AAAA,GACX,CAAA;AAID,EAAA,MAAM,eAAe,yBAAA,CAA0B;AAAA,IAC7C,KAAK,IAAA,CAAK,GAAA;AAAA,IACV,IAAA,EAAM,MAAM,SAAA,CAAU;AAAA,GACvB,CAAA;AAID,EAAA,MAAM,gBAAgB,0BAAA,CAA2B;AAAA,IAC/C,KAAK,IAAA,CAAK,GAAA;AAAA,IACV,IAAA,EAAM,MAAM,SAAA,CAAU;AAAA,GACvB,CAAA;AAID,EAAA,IAAI,EAAA,GAAuB,IAAA;AAC3B,EAAA,MAAM,QAAQ,MAAwB;AACpC,IAAA,IAAI,IAAI,OAAO,EAAA;AACf,IAAA,MAAM,KAAA,GAAQ,QAAQ,SAAA,CAAU,EAAA;AAChC,IAAA,IAAI,CAAC,OAAO,OAAO,IAAA;AACnB,IAAA,EAAA,GAAK,oBAAA,CAAqB;AAAA,MACxB,GAAA,EAAK,KAAA;AAAA,MACL,QAAA,EAAU,MAAM,YAAA,CAAa,GAAA,EAAI;AAAA;AAAA;AAAA;AAAA;AAAA,MAKjC,OAAA,EAAS,CAAC,KAAA,KAAU,YAAA,CAAa,IAAI,KAAK,CAAA;AAAA,MAC1C,OAAA,EAAS,mBAAA;AAAA,MACT,IAAA,EAAM;AAAA,KACP,CAAA;AACD,IAAA,OAAO,EAAA;AAAA,EACT,CAAA;AAEA,EAAA,OAAO;AAAA,IACL,IAAA;AAAA,IACA,YAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAA;AAAA,IACA,KAAA;AAAA,IACA,UAAA;AAAA,IACA,QAAA;AAAA,IACA,GAAA;AAAA,IACA,IAAA;AAAA,IACA,OAAA;AAAA,IACA,MAAA;AAAA,IACA,GAAA;AAAA,IACA,MAAA;AAAA,IACA,YAAA;AAAA,IACA,aAAA;AAAA;AAAA,IAEA,IAAI,EAAA,GAAuB;AACzB,MAAA,OAAO,KAAA,EAAM;AAAA,IACf,CAAA;AAAA,IACA,oBAAA;AAAA,IACA,OAAA,EAAS,CAAC,OAAA,KAAqB;AAC7B,MAAA,SAAA,CAAU,OAAA,GAAU,OAAA;AAAA,IACtB,CAAA;AAAA,IACA;AAAA,GACF;AACF;;ACpOO,MAAM,gBAAA,GAA8C;AAAA;AAAA,EAEzD;AAAA,IACE,GAAA,EAAK,sBAAA;AAAA,IACL,KAAA,EAAO,gBAAA;AAAA,IACP,KAAA,EAAO,eAAA;AAAA,IACP,MAAA,EAAQ,QAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,sEAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,4BAAA;AAAA,IACL,KAAA,EAAO,cAAA;AAAA,IACP,KAAA,EAAO,eAAA;AAAA,IACP,MAAA,EAAQ,cAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,0DAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,2BAAA;AAAA,IACL,KAAA,EAAO,aAAA;AAAA,IACP,KAAA,EAAO,eAAA;AAAA,IACP,MAAA,EAAQ,aAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,+DAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,sBAAA;AAAA,IACL,KAAA,EAAO,cAAA;AAAA,IACP,KAAA,EAAO,eAAA;AAAA,IACP,MAAA,EAAQ,QAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,4DAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,+BAAA;AAAA,IACL,KAAA,EAAO,iBAAA;AAAA,IACP,KAAA,EAAO,eAAA;AAAA,IACP,MAAA,EAAQ,iBAAA;AAAA,IACR,SAAA,EAAW,SAAA;AAAA,IACX,WAAA,EAAa,wDAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,wBAAA;AAAA,IACL,KAAA,EAAO,cAAA;AAAA,IACP,KAAA,EAAO,eAAA;AAAA,IACP,MAAA,EAAQ,UAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,+EAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,8BAAA;AAAA,IACL,KAAA,EAAO,gBAAA;AAAA,IACP,KAAA,EAAO,eAAA;AAAA,IACP,MAAA,EAAQ,gBAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,2EAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,kCAAA;AAAA,IACL,KAAA,EAAO,oBAAA;AAAA,IACP,KAAA,EAAO,eAAA;AAAA,IACP,MAAA,EAAQ,oBAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,uEAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,8BAAA;AAAA,IACL,KAAA,EAAO,gBAAA;AAAA,IACP,KAAA,EAAO,eAAA;AAAA,IACP,MAAA,EAAQ,gBAAA;AAAA,IACR,SAAA,EAAW,SAAA;AAAA,IACX,WAAA,EAAa,oDAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,8BAAA;AAAA,IACL,KAAA,EAAO,gBAAA;AAAA,IACP,KAAA,EAAO,eAAA;AAAA,IACP,MAAA,EAAQ,gBAAA;AAAA,IACR,SAAA,EAAW,SAAA;AAAA,IACX,WAAA,EAAa,0CAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA;AAAA,EAEA;AAAA,IACE,GAAA,EAAK,gCAAA;AAAA,IACL,KAAA,EAAO,iBAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,SAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,8DAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,mCAAA;AAAA,IACL,KAAA,EAAO,YAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,YAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,+EAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,kDAAA;AAAA,IACL,KAAA,EAAO,2BAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,2BAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,0EAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,sDAAA;AAAA,IACL,KAAA,EAAO,+BAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,+BAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,wEAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,2CAAA;AAAA,IACL,KAAA,EAAO,sBAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,oBAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EACE,qFAAA;AAAA,IACF,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,qCAAA;AAAA,IACL,KAAA,EAAO,aAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,cAAA;AAAA,IACR,SAAA,EAAW,SAAA;AAAA,IACX,WAAA,EAAa,2DAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,2CAAA;AAAA,IACL,KAAA,EAAO,oBAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,oBAAA;AAAA,IACR,SAAA,EAAW,SAAA;AAAA,IACX,WAAA,EAAa,4DAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,yCAAA;AAAA,IACL,KAAA,EAAO,kBAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,kBAAA;AAAA,IACR,SAAA,EAAW,SAAA;AAAA,IACX,WAAA,EAAa,8DAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,mCAAA;AAAA,IACL,KAAA,EAAO,WAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,YAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,oDAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,oCAAA;AAAA,IACL,KAAA,EAAO,aAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,aAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,4EAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,gDAAA;AAAA,IACL,KAAA,EAAO,yBAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,yBAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,8EAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,qCAAA;AAAA,IACL,KAAA,EAAO,cAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,cAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,0EAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,mCAAA;AAAA,IACL,KAAA,EAAO,YAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,YAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,sEAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,wCAAA;AAAA,IACL,KAAA,EAAO,iBAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,iBAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,iFAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,sCAAA;AAAA,IACL,KAAA,EAAO,eAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,eAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,qEAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,0CAAA;AAAA,IACL,KAAA,EAAO,wBAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,mBAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,2EAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,4CAAA;AAAA,IACL,KAAA,EAAO,qBAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,qBAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EACE,qFAAA;AAAA,IACF,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,gDAAA;AAAA,IACL,KAAA,EAAO,yBAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,yBAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,kEAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,0CAAA;AAAA,IACL,KAAA,EAAO,kBAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,mBAAA;AAAA,IACR,SAAA,EAAW,SAAA;AAAA,IACX,WAAA,EAAa,sEAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,2CAAA;AAAA,IACL,KAAA,EAAO,mBAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,oBAAA;AAAA,IACR,SAAA,EAAW,SAAA;AAAA,IACX,WAAA,EAAa,wEAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,4CAAA;AAAA,IACL,KAAA,EAAO,wBAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,qBAAA;AAAA,IACR,SAAA,EAAW,SAAA;AAAA,IACX,WAAA,EAAa,yDAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,0CAAA;AAAA,IACL,KAAA,EAAO,oBAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,mBAAA;AAAA,IACR,SAAA,EAAW,SAAA;AAAA,IACX,WAAA,EAAa,yDAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,qCAAA;AAAA,IACL,KAAA,EAAO,cAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,cAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,uDAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,2CAAA;AAAA,IACL,KAAA,EAAO,oBAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,oBAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,gEAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,4CAAA;AAAA,IACL,KAAA,EAAO,qBAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,qBAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,kEAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,qCAAA;AAAA,IACL,KAAA,EAAO,YAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,cAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,oDAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,mCAAA;AAAA,IACL,KAAA,EAAO,YAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,YAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,2DAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,oCAAA;AAAA,IACL,KAAA,EAAO,aAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,aAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,yDAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,oCAAA;AAAA,IACL,KAAA,EAAO,aAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,aAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,uDAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,qCAAA;AAAA,IACL,KAAA,EAAO,cAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,cAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,oDAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,8CAAA;AAAA,IACL,KAAA,EAAO,uBAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,uBAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,kEAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,6CAAA;AAAA,IACL,KAAA,EAAO,sBAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,sBAAA;AAAA,IACR,SAAA,EAAW,SAAA;AAAA,IACX,WAAA,EAAa,+DAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,+CAAA;AAAA,IACL,KAAA,EAAO,wBAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,wBAAA;AAAA,IACR,SAAA,EAAW,SAAA;AAAA,IACX,WAAA,EAAa,8DAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,gDAAA;AAAA,IACL,KAAA,EAAO,yBAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,yBAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,uEAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,oDAAA;AAAA,IACL,KAAA,EAAO,6BAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,6BAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,6EAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,kDAAA;AAAA,IACL,KAAA,EAAO,2BAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,2BAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,oEAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,qCAAA;AAAA,IACL,KAAA,EAAO,cAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,cAAA;AAAA,IACR,SAAA,EAAW,SAAA;AAAA,IACX,WAAA,EAAa,iEAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,gDAAA;AAAA,IACL,KAAA,EAAO,yBAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,yBAAA;AAAA,IACR,SAAA,EAAW,SAAA;AAAA,IACX,WAAA,EAAa,0DAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,4DAAA;AAAA,IACL,KAAA,EAAO,mCAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,qCAAA;AAAA,IACR,SAAA,EAAW,SAAA;AAAA,IACX,WAAA,EAAa,2EAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,0CAAA;AAAA,IACL,KAAA,EAAO,mBAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,mBAAA;AAAA,IACR,SAAA,EAAW,SAAA;AAAA,IACX,WAAA,EAAa,kFAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,sCAAA;AAAA,IACL,KAAA,EAAO,eAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,eAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,yEAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,yCAAA;AAAA,IACL,KAAA,EAAO,kBAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,kBAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,6EAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,+CAAA;AAAA,IACL,KAAA,EAAO,wBAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,wBAAA;AAAA,IACR,SAAA,EAAW,SAAA;AAAA,IACX,WAAA,EAAa,oDAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,6CAAA;AAAA,IACL,KAAA,EAAO,sBAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,sBAAA;AAAA,IACR,SAAA,EAAW,SAAA;AAAA,IACX,WAAA,EAAa,mEAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,+CAAA;AAAA,IACL,KAAA,EAAO,wBAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,wBAAA;AAAA,IACR,SAAA,EAAW,SAAA;AAAA,IACX,WAAA,EAAa,qDAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,gCAAA;AAAA,IACL,KAAA,EAAO,gBAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,SAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EACE,mFAAA;AAAA,IACF,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,gCAAA;AAAA,IACL,KAAA,EAAO,gBAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,SAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,iEAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,4CAAA;AAAA,IACL,KAAA,EAAO,oBAAA;AAAA,IACP,KAAA,EAAO,wBAAA;AAAA,IACP,MAAA,EAAQ,qBAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,iFAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA;AAAA,EAEA;AAAA,IACE,GAAA,EAAK,4CAAA;AAAA,IACL,KAAA,EAAO,qBAAA;AAAA,IACP,KAAA,EAAO,+BAAA;AAAA,IACP,MAAA,EAAQ,cAAA;AAAA,IACR,SAAA,EAAW,SAAA;AAAA,IACX,WAAA,EAAa,kDAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,4CAAA;AAAA,IACL,KAAA,EAAO,qBAAA;AAAA,IACP,KAAA,EAAO,+BAAA;AAAA,IACP,MAAA,EAAQ,cAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,uEAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,gDAAA;AAAA,IACL,KAAA,EAAO,yBAAA;AAAA,IACP,KAAA,EAAO,+BAAA;AAAA,IACP,MAAA,EAAQ,kBAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,4EAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,6CAAA;AAAA,IACL,KAAA,EAAO,6BAAA;AAAA,IACP,KAAA,EAAO,+BAAA;AAAA,IACP,MAAA,EAAQ,eAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,8EAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,gDAAA;AAAA,IACL,KAAA,EAAO,yBAAA;AAAA,IACP,KAAA,EAAO,+BAAA;AAAA,IACP,MAAA,EAAQ,kBAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EACE,8GAAA;AAAA,IACF,IAAA,EAAM;AAAA,GACR;AAAA;AAAA,EAEA;AAAA,IACE,GAAA,EAAK,2BAAA;AAAA,IACL,KAAA,EAAO,qBAAA;AAAA,IACP,KAAA,EAAO,sBAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,SAAA,EAAW,QAAA;AAAA,IACX,WAAA,EAAa,+DAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,8BAAA;AAAA,IACL,KAAA,EAAO,eAAA;AAAA,IACP,KAAA,EAAO,sBAAA;AAAA,IACP,MAAA,EAAQ,SAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,sEAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,6BAAA;AAAA,IACL,KAAA,EAAO,cAAA;AAAA,IACP,KAAA,EAAO,sBAAA;AAAA,IACP,MAAA,EAAQ,QAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,qEAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,kCAAA;AAAA,IACL,KAAA,EAAO,mBAAA;AAAA,IACP,KAAA,EAAO,sBAAA;AAAA,IACP,MAAA,EAAQ,aAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,iEAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,sCAAA;AAAA,IACL,KAAA,EAAO,iBAAA;AAAA,IACP,KAAA,EAAO,sBAAA;AAAA,IACP,MAAA,EAAQ,iBAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,wEAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,yCAAA;AAAA,IACL,KAAA,EAAO,oBAAA;AAAA,IACP,KAAA,EAAO,sBAAA;AAAA,IACP,MAAA,EAAQ,oBAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,4EAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,+CAAA;AAAA,IACL,KAAA,EAAO,0BAAA;AAAA,IACP,KAAA,EAAO,sBAAA;AAAA,IACP,MAAA,EAAQ,0BAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,gFAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,wCAAA;AAAA,IACL,KAAA,EAAO,qBAAA;AAAA,IACP,KAAA,EAAO,sBAAA;AAAA,IACP,MAAA,EAAQ,mBAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,2DAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,mCAAA;AAAA,IACL,KAAA,EAAO,cAAA;AAAA,IACP,KAAA,EAAO,sBAAA;AAAA,IACP,MAAA,EAAQ,cAAA;AAAA,IACR,SAAA,EAAW,SAAA;AAAA,IACX,WAAA,EAAa,2DAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,gCAAA;AAAA,IACL,KAAA,EAAO,WAAA;AAAA,IACP,KAAA,EAAO,sBAAA;AAAA,IACP,MAAA,EAAQ,WAAA;AAAA,IACR,SAAA,EAAW,SAAA;AAAA,IACX,WAAA,EAAa,yDAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,wCAAA;AAAA,IACL,KAAA,EAAO,mBAAA;AAAA,IACP,KAAA,EAAO,sBAAA;AAAA,IACP,MAAA,EAAQ,mBAAA;AAAA,IACR,SAAA,EAAW,QAAA;AAAA,IACX,WAAA,EAAa,qDAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,kCAAA;AAAA,IACL,KAAA,EAAO,aAAA;AAAA,IACP,KAAA,EAAO,sBAAA;AAAA,IACP,MAAA,EAAQ,aAAA;AAAA,IACR,SAAA,EAAW,QAAA;AAAA,IACX,WAAA,EAAa,iDAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA;AAAA,EAEA;AAAA,IACE,GAAA,EAAK,gCAAA;AAAA,IACL,KAAA,EAAO,sBAAA;AAAA,IACP,KAAA,EAAO,yBAAA;AAAA,IACP,MAAA,EAAQ,QAAA;AAAA,IACR,SAAA,EAAW,SAAA;AAAA,IACX,WAAA,EAAa,yEAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,gCAAA;AAAA,IACL,KAAA,EAAO,iBAAA;AAAA,IACP,KAAA,EAAO,yBAAA;AAAA,IACP,MAAA,EAAQ,QAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,sDAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,uCAAA;AAAA,IACL,KAAA,EAAO,eAAA;AAAA,IACP,KAAA,EAAO,yBAAA;AAAA,IACP,MAAA,EAAQ,eAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,kEAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,0CAAA;AAAA,IACL,KAAA,EAAO,kBAAA;AAAA,IACP,KAAA,EAAO,yBAAA;AAAA,IACP,MAAA,EAAQ,kBAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,6CAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,gCAAA;AAAA,IACL,KAAA,EAAO,iBAAA;AAAA,IACP,KAAA,EAAO,yBAAA;AAAA,IACP,MAAA,EAAQ,QAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,6DAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,oCAAA;AAAA,IACL,KAAA,EAAO,qBAAA;AAAA,IACP,KAAA,EAAO,yBAAA;AAAA,IACP,MAAA,EAAQ,YAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,mEAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,oCAAA;AAAA,IACL,KAAA,EAAO,qBAAA;AAAA,IACP,KAAA,EAAO,yBAAA;AAAA,IACP,MAAA,EAAQ,YAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,mEAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,oCAAA;AAAA,IACL,KAAA,EAAO,qBAAA;AAAA,IACP,KAAA,EAAO,yBAAA;AAAA,IACP,MAAA,EAAQ,YAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,0DAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,qCAAA;AAAA,IACL,KAAA,EAAO,sBAAA;AAAA,IACP,KAAA,EAAO,yBAAA;AAAA,IACP,MAAA,EAAQ,aAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,6CAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,iCAAA;AAAA,IACL,KAAA,EAAO,yBAAA;AAAA,IACP,KAAA,EAAO,yBAAA;AAAA,IACP,MAAA,EAAQ,SAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,sEAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,8CAAA;AAAA,IACL,KAAA,EAAO,yBAAA;AAAA,IACP,KAAA,EAAO,yBAAA;AAAA,IACP,MAAA,EAAQ,sBAAA;AAAA,IACR,SAAA,EAAW,SAAA;AAAA,IACX,WAAA,EAAa,yDAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,iCAAA;AAAA,IACL,KAAA,EAAO,kBAAA;AAAA,IACP,KAAA,EAAO,yBAAA;AAAA,IACP,MAAA,EAAQ,SAAA;AAAA,IACR,SAAA,EAAW,QAAA;AAAA,IACX,WAAA,EAAa,kDAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA;AAAA,EAEA;AAAA,IACE,GAAA,EAAK,aAAA;AAAA,IACL,KAAA,EAAO,aAAA;AAAA,IACP,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,QAAA;AAAA,IACR,SAAA,EAAW,SAAA;AAAA,IACX,WAAA,EAAa,8DAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,YAAA;AAAA,IACL,KAAA,EAAO,YAAA;AAAA,IACP,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,OAAA;AAAA,IACR,SAAA,EAAW,SAAA;AAAA,IACX,WAAA,EAAa,iDAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,aAAA;AAAA,IACL,KAAA,EAAO,aAAA;AAAA,IACP,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,QAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,uCAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,aAAA;AAAA,IACL,KAAA,EAAO,aAAA;AAAA,IACP,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,QAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,0CAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,iBAAA;AAAA,IACL,KAAA,EAAO,iBAAA;AAAA,IACP,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,YAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,sDAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,UAAA;AAAA,IACL,KAAA,EAAO,UAAA;AAAA,IACP,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,KAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,+CAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,cAAA;AAAA,IACL,KAAA,EAAO,qBAAA;AAAA,IACP,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,SAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,qDAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,WAAA;AAAA,IACL,KAAA,EAAO,WAAA;AAAA,IACP,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,MAAA;AAAA,IACR,SAAA,EAAW,OAAA;AAAA,IACX,WAAA,EAAa,sDAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,cAAA;AAAA,IACL,KAAA,EAAO,cAAA;AAAA,IACP,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,SAAA;AAAA,IACR,SAAA,EAAW,QAAA;AAAA,IACX,WAAA,EAAa,yCAAA;AAAA,IACb,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,aAAA;AAAA,IACL,KAAA,EAAO,aAAA;AAAA,IACP,KAAA,EAAO,MAAA;AAAA,IACP,MAAA,EAAQ,QAAA;AAAA,IACR,SAAA,EAAW,SAAA;AAAA,IACX,WAAA,EAAa,0DAAA;AAAA,IACb,IAAA,EAAM;AAAA;AAEV;AA4BO,MAAM,mBAAA,GAAsB;AAAA;AAAA,EAEjC,IAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,KAAA;AAAA,EACA,IAAA;AAAA,EACA,IAAA;AAAA;AAAA,EAEA,IAAA;AAAA,EACA,QAAA;AAAA;AAAA,EAEA,UAAA;AAAA,EACA,YAAA;AAAA,EACA,UAAA;AAAA;AAAA,EAEA,SAAA;AAAA,EACA;AACF;AAOO,MAAM,eAAA,GAAkB;AAIxB,MAAM,yBAAA,GAA+D;AAAA,EAC1E,EAAA,EAAI,GAAA;AAAA,EACJ,GAAA,EAAK,IAAA;AAAA,EACL,EAAA,EAAI,GAAA;AAAA,EACJ,GAAA,EAAK,IAAA;AAAA,EACL,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,EAAA,EAAI,IAAA;AAAA,EACJ,MAAA,EAAQ,QAAA;AAAA,EACR,QAAA,EAAU,UAAA;AAAA,EACV,UAAA,EAAY,aAAA;AAAA,EACZ,QAAA,EAAU,WAAA;AAAA,EACV,OAAA,EAAS,SAAA;AAAA,EACT,WAAA,EAAa;AACf;AAUO,MAAM,8BAAA,GACX;AAAA,EACE,EAAA,EAAI,QAAA;AAAA,EACJ,GAAA,EAAK,QAAA;AAAA,EACL,EAAA,EAAI,QAAA;AAAA,EACJ,GAAA,EAAK,QAAA;AAAA,EACL,EAAA,EAAI,QAAA;AAAA,EACJ,EAAA,EAAI,QAAA;AAAA,EACJ,EAAA,EAAI,MAAA;AAAA,EACJ,MAAA,EAAQ,MAAA;AAAA,EACR,QAAA,EAAU,QAAA;AAAA,EACV,UAAA,EAAY,QAAA;AAAA,EACZ,QAAA,EAAU,QAAA;AAAA,EACV,OAAA,EAAS,MAAA;AAAA,EACT,WAAA,EAAa;AACf;AAKK,MAAM,iCAAA,GAAuE;AAAA,EAClF,GAAA,EAAK,IAAA;AAAA,EACL,IAAA,EAAM,KAAA;AAAA,EACN,GAAA,EAAK,IAAA;AAAA,EACL,IAAA,EAAM,KAAA;AAAA,EACN,IAAA,EAAM,IAAA;AAAA,EACN,GAAA,EAAK,IAAA;AAAA,EACL,IAAA,EAAM,IAAA;AAAA,EACN,IAAA,EAAM;AACR;AAKO,MAAM,0BAAA,GAA6B,CAAC,GAAA,KAAyB;AAClE,EAAA,MAAM,KAAK,MAAA,CAAO,GAAA,IAAO,IAAI,CAAA,CAC1B,IAAA,GACA,WAAA,EAAY;AACf,EAAA,OAAO,iCAAA,CAAkC,EAAE,CAAA,IAAK,EAAA;AAClD;AASO,MAAM,gBAAA,GAAmB;AAAA,EAC9B,CAAA;AAAA,EAAG,CAAA;AAAA,EAAG,EAAA;AAAA,EAAI,EAAA;AAAA,EAAI,EAAA;AAAA,EAAI,EAAA;AAAA,EAAI,EAAA;AAAA,EAAI,EAAA;AAAA,EAAI,GAAA;AAAA,EAAK,GAAA;AAAA,EAAK,GAAA;AAAA,EAAK,GAAA;AAAA,EAAK,GAAA;AAAA,EAAK;AACzD;AAcO,MAAM,WAAA,GAAc;AAAA,EACzB,IAAA,EAAM,MAAA;AAAA,EACN,QAAA,EAAU,UAAA;AAAA,EACV,GAAA,EAAK,KAAA;AAAA,EACL,SAAA,EAAW,UAAA;AAAA,EACX,aAAA,EAAe,cAAA;AAAA,EACf,YAAA,EAAc,aAAA;AAAA,EACd,eAAA,EAAiB,gBAAA;AAAA,EACjB,mBAAA,EAAqB,mBAAA;AAAA,EACrB,cAAA,EAAgB,eAAA;AAAA,EAChB,MAAA,EAAQ;AACV;AAiBO,MAAM,YAAA,GAAyC;AAAA,EACpD;AAAA,IACE,MAAM,WAAA,CAAY,IAAA;AAAA,IAClB,YAAY,eAAA,CAAgB,YAAA;AAAA,IAC5B,QAAA,EAAU,UAAA;AAAA,IACV,cAAA,EAAgB,6CAAA;AAAA,IAChB,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,MAAM,WAAA,CAAY,QAAA;AAAA,IAClB,YAAY,eAAA,CAAgB,eAAA;AAAA,IAC5B,QAAA,EAAU,aAAA;AAAA,IACV,cAAA,EAAgB,gDAAA;AAAA,IAChB,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,MAAM,WAAA,CAAY,GAAA;AAAA,IAClB,YAAY,eAAA,CAAgB,WAAA;AAAA,IAC5B,QAAA,EAAU,MAAA;AAAA,IACV,cAAA,EAAgB,sCAAA;AAAA,IAChB,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,MAAM,WAAA,CAAY,SAAA;AAAA,IAClB,YAAY,cAAA,CAAe,SAAA;AAAA,IAC3B,QAAA,EAAU,OAAA;AAAA,IACV,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,MAAM,WAAA,CAAY,aAAA;AAAA,IAClB,YAAY,eAAA,CAAgB,aAAA;AAAA,IAC5B,QAAA,EAAU,QAAA;AAAA,IACV,cAAA,EAAgB,8CAAA;AAAA,IAChB,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,MAAM,WAAA,CAAY,YAAA;AAAA,IAClB,YAAY,eAAA,CAAgB,YAAA;AAAA,IAC5B,QAAA,EAAU,QAAA;AAAA,IACV,cAAA,EAAgB,6CAAA;AAAA,IAChB,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,MAAM,WAAA,CAAY,eAAA;AAAA,IAClB,YAAY,eAAA,CAAgB,eAAA;AAAA,IAC5B,cAAA,EAAgB,0CAAA;AAAA,IAChB,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,MAAM,WAAA,CAAY,mBAAA;AAAA,IAClB,YAAY,eAAA,CAAgB,mBAAA;AAAA,IAC5B,cAAA,EAAgB,8CAAA;AAAA,IAChB,KAAA,EAAO;AAAA,GACT;AAAA,EACA;AAAA,IACE,MAAM,WAAA,CAAY,cAAA;AAAA,IAClB,YAAY,eAAA,CAAgB,cAAA;AAAA,IAC5B,QAAA,EAAU,OAAA;AAAA,IACV,cAAA,EAAgB,mCAAA;AAAA,IAChB,KAAA,EAAO;AAAA;AAEX;AAGO,MAAM,qBAAA,GAAwB,CAAC,UAAA,KACpC,YAAA,CAAa,KAAK,CAAC,GAAA,KAAQ,GAAA,CAAI,UAAA,KAAe,UAAU;AA2BnD,MAAM,oBAAA,GAAqE;AAAA,EAChF,YAAA,EAAc;AAAA,IACZ,EAAE,GAAA,EAAK,WAAA,EAAa,KAAA,EAAO,gBAAA,EAAkB,MAAM,QAAA,EAAS;AAAA,IAC5D,EAAE,GAAA,EAAK,WAAA,EAAa,KAAA,EAAO,WAAA,EAAa,MAAM,QAAA;AAAS,GACzD;AAAA,EACA,eAAA,EAAiB;AAAA,IACf,EAAE,GAAA,EAAK,cAAA,EAAgB,KAAA,EAAO,mBAAA,EAAqB,MAAM,QAAA,EAAS;AAAA,IAClE,EAAE,GAAA,EAAK,cAAA,EAAgB,KAAA,EAAO,cAAA,EAAgB,MAAM,QAAA;AAAS,GAC/D;AAAA,EACA,aAAA,EAAe,CAAC,EAAE,GAAA,EAAK,UAAU,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,CAAA;AAAA,EAClE,YAAA,EAAc,CAAC,EAAE,GAAA,EAAK,UAAU,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,CAAA;AAAA,EACjE,aAAA,EAAe;AAAA,IACb,EAAE,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,MAAM,QAAA,EAAS;AAAA,IACjD,EAAE,GAAA,EAAK,kBAAA,EAAoB,KAAA,EAAO,kBAAA,EAAoB,MAAM,QAAA;AAAS,GACvE;AAAA,EACA,WAAA,EAAa,CAAC,EAAE,GAAA,EAAK,QAAQ,KAAA,EAAO,MAAA,EAAQ,IAAA,EAAM,UAAA,EAAY,CAAA;AAAA,EAC9D,OAAA,EAAS;AAAA,IACP,EAAE,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO,SAAA,EAAW,MAAM,QAAA,EAAS;AAAA,IACnD,EAAE,GAAA,EAAK,aAAA,EAAe,KAAA,EAAO,aAAA,EAAe,MAAM,QAAA;AAAS,GAC7D;AAAA,EACA,QAAA,EAAU;AAAA,IACR,EAAE,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO,SAAA,EAAW,MAAM,QAAA,EAAS;AAAA,IACnD,EAAE,GAAA,EAAK,aAAA,EAAe,KAAA,EAAO,aAAA,EAAe,MAAM,QAAA;AAAS,GAC7D;AAAA,EACA,kBAAA,EAAoB,CAAC,EAAE,GAAA,EAAK,cAAc,KAAA,EAAO,YAAA,EAAc,IAAA,EAAM,QAAA,EAAU,CAAA;AAAA,EAC/E,YAAA,EAAc,CAAC,EAAE,GAAA,EAAK,cAAc,KAAA,EAAO,YAAA,EAAc,IAAA,EAAM,QAAA,EAAU,CAAA;AAAA,EACzE,cAAA,EAAgB;AAAA,IACd,EAAE,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,MAAM,SAAA,EAAU;AAAA,IAClD,EAAE,GAAA,EAAK,QAAA,EAAU,KAAA,EAAO,QAAA,EAAU,MAAM,QAAA;AAAS,GACnD;AAAA,EACA,mBAAA,EAAqB,CAAC,EAAE,GAAA,EAAK,UAAU,KAAA,EAAO,kBAAA,EAAoB,IAAA,EAAM,QAAA,EAAU,CAAA;AAAA,EAClF,YAAA,EAAc,CAAC,EAAE,GAAA,EAAK,iBAAiB,KAAA,EAAO,eAAA,EAAiB,IAAA,EAAM,QAAA,EAAU,CAAA;AAAA,EAC/E,eAAA,EAAiB,CAAC,EAAE,GAAA,EAAK,UAAU,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,CAAA;AAAA,EACpE,mBAAA,EAAqB,CAAC,EAAE,GAAA,EAAK,UAAU,KAAA,EAAO,QAAA,EAAU,IAAA,EAAM,QAAA,EAAU,CAAA;AAAA,EACxE,cAAA,EAAgB;AAAA,IACd,EAAE,GAAA,EAAK,SAAA,EAAW,KAAA,EAAO,SAAA,EAAW,MAAM,QAAA,EAAS;AAAA,IACnD,EAAE,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,MAAM,QAAA;AAAS,GACjD;AAAA,EACA,SAAA,EAAW;AAAA,IACT,EAAE,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,MAAM,QAAA,EAAS;AAAA,IAC/C,EAAE,GAAA,EAAK,OAAA,EAAS,KAAA,EAAO,OAAA,EAAS,MAAM,QAAA;AAAS;AAEnD;AAIO,MAAM,cAAA,GAAiB,CAC5B,MAAA,EACA,UAAA,KAC4B;AAC5B,EAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,EAAC;AACrB,EAAA,MAAM,SAAS,MAAA,CAAO,MAAA;AACtB,EAAA,IAAI,MAAA,KAAW,QAAQ,OAAO,MAAA,KAAW,YAAY,CAAC,KAAA,CAAM,OAAA,CAAQ,MAAM,CAAA,EAAG;AAC3E,IAAA,OAAO,MAAA;AAAA,EACT;AAEA,EAAA,MAAM,MAAA,GAAS,qBAAqB,UAAU,CAAA;AAC9C,EAAA,IAAI,CAAC,MAAA,EAAQ,OAAO,EAAC;AACrB,EAAA,MAAM,MAA+B,EAAC;AACtC,EAAA,KAAA,MAAW,KAAK,MAAA,EAAQ;AACtB,IAAA,MAAM,GAAA,GAAO,MAAA,CAAmC,CAAA,CAAE,GAAG,CAAA;AACrD,IAAA,IAAI,QAAQ,MAAA,IAAa,GAAA,KAAQ,MAAM,GAAA,CAAI,CAAA,CAAE,GAAG,CAAA,GAAI,GAAA;AAAA,EACtD;AACA,EAAA,OAAO,GAAA;AACT;AAGO,MAAM,eAAA,GAAkB,CAAC,IAAA,KAC9B,YAAA,CAAa,KAAK,CAAC,GAAA,KAAQ,GAAA,CAAI,IAAA,KAAS,IAAI;AAmDvC,MAAM,qBAAA,GAAwB,CAAC,MAAA,KAAoD;AACxF,EAAA,QAAQ,OAAO,IAAA;AAAM,IACnB,KAAK,YAAY,IAAA,EAAM;AACrB,MAAA,MAAM,MAAA,GAAA,CAAU,MAAA,CAAO,WAAA,IAAe,EAAA,EAAI,IAAA,EAAK;AAC/C,MAAA,OAAO,MAAA,GAAS,EAAE,QAAA,EAAU,MAAA,KAAW,EAAC;AAAA,IAC1C;AAAA,IACA,KAAK,YAAY,QAAA,EAAU;AACzB,MAAA,MAAM,CAAA,GAAI,MAAA,CAAO,MAAA,CAAO,KAAK,CAAA;AAC7B,MAAA,OAAO,MAAA,CAAO,QAAA,CAAS,CAAC,CAAA,IAAK,CAAA,GAAI,IAAI,EAAE,WAAA,EAAa,CAAA,EAAE,GAAI,EAAC;AAAA,IAC7D;AAAA,IACA,KAAK,WAAA,CAAY,GAAA;AACf,MAAA,OAAO,EAAE,MAAM,MAAA,CAAO,OAAA,IAAW,UAAU,IAAA,EAAM,MAAA,CAAO,IAAA,IAAQ,EAAC,EAAE;AAAA,IACrE,KAAK,YAAY,SAAA,EAAW;AAC1B,MAAA,MAAM,KAAA,GAAA,CAAS,MAAA,CAAO,KAAA,IAAS,EAAA,EAAI,IAAA,EAAK;AACxC,MAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,IAAS,EAAA;AAC9B,MAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AACpB,MAAA,OAAO,QAAQ,EAAE,KAAA,EAAO,KAAA,EAAM,GAAI,EAAE,KAAA,EAAM;AAAA,IAC5C;AAAA,IACA,KAAK,WAAA,CAAY,aAAA;AAAA,IACjB,KAAK,YAAY,YAAA,EAAc;AAC7B,MAAA,MAAM,MAAA,GAAA,CAAU,MAAA,CAAO,MAAA,IAAU,EAAA,EAAI,IAAA,EAAK;AAC1C,MAAA,OAAO,MAAA,GAAS,EAAE,MAAA,EAAO,GAAI,EAAC;AAAA,IAChC;AAAA,IACA,KAAK,YAAY,cAAA,EAAgB;AAC/B,MAAA,MAAM,KAAA,GAAA,CAAS,MAAA,CAAO,KAAA,IAAS,EAAA,EAAI,IAAA,EAAK;AACxC,MAAA,OAAO,KAAA,GAAQ,EAAE,KAAA,EAAM,GAAI,EAAC;AAAA,IAC9B;AAAA,IACA,KAAK,YAAY,eAAA,EAAiB;AAChC,MAAA,MAAM,MAA+B,EAAC;AACtC,MAAA,IAAA,CAAK,OAAO,QAAA,IAAY,EAAA,EAAI,MAAK,EAAG,GAAA,CAAI,WAAW,MAAA,CAAO,QAAA;AAC1D,MAAA,IAAA,CAAK,OAAO,MAAA,IAAU,EAAA,EAAI,MAAK,EAAG,GAAA,CAAI,SAAS,MAAA,CAAO,MAAA;AACtD,MAAA,OAAO,GAAA;AAAA,IACT;AAAA,IACA,KAAK,WAAA,CAAY,mBAAA;AACf,MAAA,OAAO,EAAC;AAAA,IACV;AACE,MAAA,OAAO,EAAC;AAAA;AAEd;AAKO,MAAM,eAAA,GAAkB,CAC7B,MAAA,KAC8E;AAC9E,EAAA,MAAM,GAAA,GAAM,eAAA,CAAgB,MAAA,CAAO,IAAI,CAAA;AACvC,EAAA,IAAI,GAAA,EAAK;AACP,IAAA,OAAO;AAAA,MACL,YAAY,GAAA,CAAI,UAAA;AAAA,MAChB,GAAI,IAAI,cAAA,GAAiB,EAAE,SAAS,GAAA,CAAI,cAAA,KAAmB,EAAC;AAAA,MAC5D,MAAA,EAAQ,sBAAsB,MAAM;AAAA,KACtC;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,UAAA,EAAY,OAAO,UAAA,IAAc,SAAA;AAAA,IACjC,GAAI,OAAO,OAAA,GAAU,EAAE,SAAS,MAAA,CAAO,OAAA,KAAY,EAAC;AAAA,IACpD,MAAA,EAAQ,MAAA,CAAO,MAAA,IAAU;AAAC,GAC5B;AACF;AAcO,MAAM,wBAAA,GAA2B,CACtC,OAAA,KAIG;AACH,EAAA,IAAI,CAAC,QAAQ,MAAA,EAAQ;AACnB,IAAA,OAAO,EAAE,aAAA,EAAe,cAAA,CAAe,MAAA,EAAQ,eAAA,EAAiB,EAAC,EAAE;AAAA,EACrE;AACA,EAAA,IAAI,OAAA,CAAQ,WAAW,CAAA,EAAG;AACxB,IAAA,MAAM,MAAA,GAAS,QAAQ,CAAC,CAAA;AACxB,IAAA,IAAI,MAAA,CAAO,IAAA,KAAS,WAAA,CAAY,SAAA,EAAW;AACzC,MAAA,OAAO;AAAA,QACL,eAAe,cAAA,CAAe,SAAA;AAAA,QAC9B,eAAA,EAAiB,EAAE,KAAA,EAAO,MAAA,CAAO,SAAS,EAAA,EAAI,KAAA,EAAO,MAAA,CAAO,KAAA,IAAS,EAAA;AAAG,OAC1E;AAAA,IACF;AACA,IAAA,OAAO;AAAA,MACL,eAAe,cAAA,CAAe,MAAA;AAAA,MAC9B,eAAA,EAAiB,gBAAgB,MAAM;AAAA,KACzC;AAAA,EACF;AACA,EAAA,OAAO;AAAA,IACL,eAAe,cAAA,CAAe,KAAA;AAAA,IAC9B,eAAA,EAAiB;AAAA,MACf,KAAA,EAAO,OAAA,CAAQ,GAAA,CAAI,CAAC,CAAA,KAAM;AAMxB,QAAA,IAAI,CAAA,CAAE,IAAA,KAAS,WAAA,CAAY,SAAA,EAAW;AACpC,UAAA,OAAO;AAAA,YACL,MAAM,cAAA,CAAe,SAAA;AAAA,YACrB,MAAA,EAAQ,EAAE,KAAA,EAAO,CAAA,CAAE,SAAS,EAAA,EAAI,KAAA,EAAO,CAAA,CAAE,KAAA,IAAS,EAAA;AAAG,WACvD;AAAA,QACF;AACA,QAAA,OAAO,EAAE,IAAA,EAAM,cAAA,CAAe,QAAQ,MAAA,EAAQ,eAAA,CAAgB,CAAC,CAAA,EAAE;AAAA,MACnE,CAAC;AAAA;AACH,GACF;AACF;AAEA,MAAM,SAAA,GAAY,CAAC,MAAA,KAA2B,CAAA,EAAG,MAAM,CAAA,CAAA,EAAI,IAAA,CAAK,MAAA,EAAO,CAAE,SAAS,EAAE,CAAA,CAAE,KAAA,CAAM,CAAA,EAAG,CAAC,CAAC,CAAA,CAAA;AAIjG,MAAM,aAAA,GAAgB,CACpB,UAAA,EACA,SAAA,EACA,MAAA,KACmB;AACnB,EAAA,MAAM,GAAA,GAAM,UAAA,GAAa,qBAAA,CAAsB,UAAU,CAAA,GAAI,MAAA;AAC7D,EAAA,MAAM,IAAA,GAAO,GAAA,EAAK,IAAA,IAAQ,WAAA,CAAY,MAAA;AACtC,EAAA,MAAM,IAAA,GAAuB;AAAA,IAC3B,EAAA,EAAI,UAAU,MAAM,CAAA;AAAA,IACpB,IAAA;AAAA,IACA,UAAA;AAAA,IACA,OAAA,EAAS,MAAA;AAAA,IACT,MAAA,EAAQ;AAAA,GACV;AACA,EAAA,QAAQ,IAAA;AAAM,IACZ,KAAK,WAAA,CAAY,IAAA;AACf,MAAA,OAAO,EAAE,GAAG,IAAA,EAAM,WAAA,EAAa,OAAO,SAAA,CAAU,QAAA,IAAY,EAAE,CAAA,EAAE;AAAA,IAClE,KAAK,WAAA,CAAY,QAAA;AACf,MAAA,OAAO,EAAE,GAAG,IAAA,EAAM,KAAA,EAAO,OAAO,SAAA,CAAU,WAAW,KAAK,CAAA,EAAE;AAAA,IAC9D,KAAK,YAAY,GAAA,EAAK;AACpB,MAAA,MAAM,OAAO,SAAA,CAAU,IAAA;AACvB,MAAA,OAAO;AAAA,QACL,GAAG,IAAA;AAAA,QACH,IAAA,EAAM,KAAA,CAAM,OAAA,CAAQ,SAAA,CAAU,IAAI,CAAA,GAAK,SAAA,CAAU,IAAA,CAAmB,GAAA,CAAI,MAAM,CAAA,GAAI,EAAC;AAAA,QACnF,OAAA,EACE,IAAA,KAAS,SAAA,IAAa,IAAA,KAAS,WAAY,IAAA,GAAgC;AAAA,OAC/E;AAAA,IACF;AAAA,IACA,KAAK,WAAA,CAAY,SAAA;AACf,MAAA,OAAO;AAAA,QACL,GAAG,IAAA;AAAA,QACH,KAAA,EAAO,MAAA,CAAO,SAAA,CAAU,KAAA,IAAS,EAAE,CAAA;AAAA,QACnC,KAAA,EAAO,MAAA,CAAO,SAAA,CAAU,KAAA,IAAS,EAAE;AAAA,OACrC;AAAA,IACF,KAAK,WAAA,CAAY,cAAA;AACf,MAAA,OAAO,EAAE,GAAG,IAAA,EAAM,KAAA,EAAO,OAAO,SAAA,CAAU,KAAA,IAAS,EAAE,CAAA,EAAE;AAAA,IACzD,KAAK,WAAA,CAAY,aAAA;AAAA,IACjB,KAAK,WAAA,CAAY,YAAA;AACf,MAAA,OAAO,EAAE,GAAG,IAAA,EAAM,MAAA,EAAQ,OAAO,SAAA,CAAU,MAAA,IAAU,EAAE,CAAA,EAAE;AAAA,IAC3D,KAAK,WAAA,CAAY,eAAA;AACf,MAAA,OAAO;AAAA,QACL,GAAG,IAAA;AAAA,QACH,UAAU,MAAA,CAAO,SAAA,CAAU,QAAA,IAAY,SAAA,CAAU,aAAa,EAAE,CAAA;AAAA,QAChE,QAAQ,MAAA,CAAO,SAAA,CAAU,MAAA,IAAU,SAAA,CAAU,WAAW,EAAE;AAAA,OAC5D;AAAA,IACF;AACE,MAAA,OAAO,IAAA;AAAA;AAEb,CAAA;AAKO,MAAM,oBAAA,GAAuB,CAAC,IAAA,KAGb;AACtB,EAAA,MAAM,EAAA,GAAK,IAAA,CAAK,eAAA,IAAmB,EAAC;AACpC,EAAA,IAAI,IAAA,CAAK,aAAA,KAAkB,cAAA,CAAe,SAAA,EAAW;AACnD,IAAA,OAAO;AAAA,MACL,aAAA;AAAA,QACE,cAAA,CAAe,SAAA;AAAA,QACf,EAAE,KAAA,EAAO,MAAA,CAAQ,EAAA,CAA0B,KAAA,IAAS,EAAE,CAAA,EAAE;AAAA,QACxD;AAAA;AACF,KACF;AAAA,EACF;AACA,EAAA,IAAI,IAAA,CAAK,aAAA,KAAkB,cAAA,CAAe,KAAA,EAAO;AAC/C,IAAA,MAAM,QACJ,EAAA,CAMA,KAAA;AACF,IAAA,IAAI,CAAC,KAAA,CAAM,OAAA,CAAQ,KAAK,CAAA,SAAU,EAAC;AACnC,IAAA,OAAO,KAAA,CAAM,GAAA,CAAI,CAAC,IAAA,KAAS;AAMzB,MAAA,IAAI,IAAA,CAAK,IAAA,KAAS,cAAA,CAAe,SAAA,EAAW;AAC1C,QAAA,MAAM,EAAA,GAAM,IAAA,CAAK,MAAA,IAAU,EAAC;AAC5B,QAAA,OAAO,aAAA;AAAA,UACL,cAAA,CAAe,SAAA;AAAA,UACf,EAAE,KAAA,EAAO,MAAA,CAAO,EAAA,CAAG,KAAA,IAAS,EAAE,CAAA,EAAG,KAAA,EAAO,MAAA,CAAO,EAAA,CAAG,KAAA,IAAS,EAAE,CAAA,EAAE;AAAA,UAC/D;AAAA,SACF;AAAA,MACF;AACA,MAAA,MAAM,KAAA,GAAS,KAAK,MAAA,IAAU,IAAA;AAC9B,MAAA,OAAO,aAAA;AAAA,QACL,KAAA,CAAM,UAAA;AAAA,QACL,KAAA,CAAM,UAAU,EAAC;AAAA,QAClB;AAAA,OACF;AAAA,IACF,CAAC,CAAA;AAAA,EACH;AACA,EAAA,IAAI,IAAA,CAAK,aAAA,KAAkB,cAAA,CAAe,MAAA,EAAQ;AAChD,IAAA,MAAM,aAAc,EAAA,CAA+B,UAAA;AACnD,IAAA,IAAI,OAAO,UAAA,KAAe,QAAA,EAAU,OAAO,EAAC;AAC5C,IAAA,OAAO;AAAA,MACL,cAAc,UAAA,EAAa,EAAA,CAA4C,MAAA,IAAU,IAAI,KAAK;AAAA,KAC5F;AAAA,EACF;AACA,EAAA,OAAO,EAAC;AACV;AAeO,MAAM,oBAAA,GAAuB;AAAA,EAClC,IAAA,EAAM,MAAA;AAAA,EACN,QAAA,EAAU,UAAA;AAAA,EACV,KAAA,EAAO;AACT,CAAA;AAeO,MAAM,oBAAA,GAAqD;AAAA;AAAA,EAEhE;AAAA,IACE,GAAA,EAAK,aAAA;AAAA,IACL,KAAA,EAAO,aAAA;AAAA,IACP,QAAQ,oBAAA,CAAqB,IAAA;AAAA,IAC7B,SAAA,EAAW,OAAA;AAAA,IACX,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,aAAA;AAAA,IACL,KAAA,EAAO,aAAA;AAAA,IACP,QAAQ,oBAAA,CAAqB,IAAA;AAAA,IAC7B,SAAA,EAAW,OAAA;AAAA,IACX,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,aAAA;AAAA,IACL,KAAA,EAAO,aAAA;AAAA,IACP,QAAQ,oBAAA,CAAqB,IAAA;AAAA,IAC7B,SAAA,EAAW,SAAA;AAAA,IACX,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,WAAA;AAAA,IACL,KAAA,EAAO,WAAA;AAAA,IACP,QAAQ,oBAAA,CAAqB,IAAA;AAAA,IAC7B,SAAA,EAAW,SAAA;AAAA,IACX,IAAA,EAAM;AAAA,GACR;AAAA;AAAA,EAEA;AAAA,IACE,GAAA,EAAK,iBAAA;AAAA,IACL,KAAA,EAAO,iBAAA;AAAA,IACP,QAAQ,oBAAA,CAAqB,QAAA;AAAA,IAC7B,SAAA,EAAW,OAAA;AAAA,IACX,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,iBAAA;AAAA,IACL,KAAA,EAAO,iBAAA;AAAA,IACP,QAAQ,oBAAA,CAAqB,QAAA;AAAA,IAC7B,SAAA,EAAW,OAAA;AAAA,IACX,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,wBAAA;AAAA,IACL,KAAA,EAAO,gBAAA;AAAA,IACP,QAAQ,oBAAA,CAAqB,QAAA;AAAA,IAC7B,SAAA,EAAW,OAAA;AAAA,IACX,IAAA,EAAM;AAAA,GACR;AAAA;AAAA,EAEA;AAAA,IACE,GAAA,EAAK,sBAAA;AAAA,IACL,KAAA,EAAO,sBAAA;AAAA,IACP,QAAQ,oBAAA,CAAqB,KAAA;AAAA,IAC7B,SAAA,EAAW,OAAA;AAAA,IACX,IAAA,EAAM;AAAA,GACR;AAAA,EACA;AAAA,IACE,GAAA,EAAK,qBAAA;AAAA,IACL,KAAA,EAAO,qBAAA;AAAA,IACP,QAAQ,oBAAA,CAAqB,KAAA;AAAA,IAC7B,SAAA,EAAW,OAAA;AAAA,IACX,IAAA,EAAM;AAAA;AAEV;AASO,MAAM,qBAAA,GAAwB,CACnC,UAAA,KACiC;;ACllD5B,MAAM,aAAA,GAAgB;AAAA,EAC3B,aAAA,EAAe,eAAA;AAAA,EACf,QAAA,EAAU,UAAA;AAAA,EACV,KAAA,EAAO,OAAA;AAAA,EACP,IAAA,EAAM,MAAA;AAAA,EACN,WAAA,EAAa,aAAA;AAAA,EACb,SAAA,EAAW;AACb;;ACfO,MAAM,YAAA,GAAe,WAAA;AAAA,EAC1B,UAAA;AAAA,EACA,MAAM;AACJ,IAAA,MAAM,GAAA,GAAM,WAA2B,IAAI,CAAA;AAE3C,IAAA,MAAM,QAAA,GAAW,IAAsB,IAAI,CAAA;AAC3C,IAAA,MAAM,QAAA,GAAW,IAAsB,IAAI,CAAA;AAC3C,IAAA,MAAM,WAAA,GAAc,IAAY,EAAE,CAAA;AAClC,IAAA,MAAM,WAAA,GAAc,IAAY,EAAE,CAAA;AAelC,IAAA,MAAM,UAAA,GAAa,IAAI,CAAC,CAAA;AAIxB,IAAA,KAAA;AAAA,MACE,MAAM,GAAA,CAAI,KAAA,EAAO,YAAA,CAAa,YAAA,IAAgB,IAAA;AAAA,MAC9C,CAAC,KAAA,KAAU;AACT,QAAA,WAAA,CAAY,QAAQ,KAAA,IAAS,EAAA;AAAA,MAC/B,CAAA;AAAA,MACA,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,MAAA;AAAO,KACnC;AAEA,IAAA,MAAM,aAAa,QAAA,CAAS,MAAM,CAAC,CAAC,YAAY,KAAK,CAAA;AAGrD,IAAA,MAAM,SAAA,GAAY,SAAmB,MAAM;AACzC,MAAA,IAAI,CAAC,WAAA,CAAY,KAAA,EAAO,OAAO,EAAC;AAChC,MAAA,OAAO,WAAA,CAAY,UAAU,GAAA,GAAM,CAAC,GAAG,CAAA,GAAI,WAAA,CAAY,KAAA,CAAM,KAAA,CAAM,GAAG,CAAA;AAAA,IACxE,CAAC,CAAA;AAED,IAAA,MAAM,MAAA,GAAS,CAAC,QAAA,KAA4B;AAC1C,MAAA,GAAA,CAAI,KAAA,GAAQ,QAAA;AAAA,IACd,CAAA;AAEA,IAAA,MAAM,kBAAA,GAAqB,CAAC,MAAA,KAAyC;AACnE,MAAA,IAAI,CAAC,MAAA,IAAU,MAAA,CAAO,MAAA,KAAW,GAAG,OAAO,EAAA;AAC3C,MAAA,OAAO,OAAO,QAAA,CAAS,GAAG,IAAI,GAAA,GAAM,MAAA,CAAO,KAAK,GAAG,CAAA;AAAA,IACrD,CAAA;AAIA,IAAA,KAAA;AAAA,MACE,MAAM,SAAS,KAAA,EAAO,WAAA;AAAA,MACtB,CAAC,MAAA,KAAW;AACV,QAAA,WAAA,CAAY,KAAA,GAAQ,mBAAmB,MAAM,CAAA;AAAA,MAC/C,CAAA;AAAA,MACA,EAAE,SAAA,EAAW,IAAA,EAAM,KAAA,EAAO,MAAA;AAAO,KACnC;AAEA,IAAA,MAAM,aAAA,GAAgB,CAAC,GAAA,KAAoC;AACzD,MAAA,QAAA,CAAS,KAAA,GAAQ,GAAA,CAAI,IAAA,IAAQ,QAAA,CAAS,KAAA;AACtC,MAAA,WAAA,CAAY,KAAA,GAAQ,kBAAA,CAAmB,GAAA,CAAI,IAAA,EAAM,WAAW,CAAA;AAC5D,MAAA,QAAA,CAAS,KAAA,GAAQ,IAAI,QAAA,IAAY,IAAA;AAAA,IACnC,CAAA;AAQA,IAAA,MAAM,kBAAA,GAAqB,CAAC,GAAA,KAAyD;AACnF,MAAA,IAAI,GAAA,CAAI,SAAS,GAAA,CAAI,KAAA,MAAW,KAAA,CAAM,YAAA,CAAa,GAAA,CAAI,GAAA,CAAI,KAAK,CAAA;AAChE,MAAA,aAAA,CAAc,GAAG,CAAA;AAAA,IACnB,CAAA;AAGA,IAAA,MAAM,OAAA,GAAU,CAAC,MAAA,EAAgB,CAAA,KAAqB;AACpD,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,WAAA,EAAc,MAAM,CAAA,QAAA,CAAA,EAAY,CAAC,CAAA;AAAA,IACjD,CAAA;AAEA,IAAA,MAAM,KAAA,GAAQ,OAAO,OAAA,KAAoE;AACvF,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAMC,QAAA,EAAO;AAC7B,MAAA,IAAI;AAKF,QAAA,MAAM,WAAA,GAAc,GAAA,CAAI,KAAA,CAAM,YAAA,CAAa,GAAA,EAAI;AAC/C,QAAA,MAAM,MAAM,MAAM,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,MAAM,OAAO,CAAA;AAC9C,QAAA,kBAAA,CAAmB,GAAG,CAAA;AACtB,QAAA,IAAI,aAAa,UAAA,CAAW,KAAA,EAAA;AAAA,MAC9B,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,SAAS,CAAC,CAAA;AAClB,QAAA,MAAM,CAAA;AAAA,MACR;AAAA,IACF,CAAA;AAGA,IAAA,MAAM,eAAe,YAA2B;AAC9C,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAMA,QAAA,EAAO;AAC7B,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,GAAM,MAAM,GAAA,CAAI,KAAA,CAAM,KAAK,KAAA,EAAM;AACvC,QAAA,IAAI,IAAI,KAAA,EAAO,MAAM,IAAI,KAAA,CAAM,SAAA,CAAU,IAAI,KAAK,CAAA;AAGlD,QAAA,UAAA,CAAW,KAAA,EAAA;AAAA,MACb,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,gBAAgB,CAAC,CAAA;AACzB,QAAA,MAAM,CAAA;AAAA,MACR;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,SAAS,YAA2B;AACxC,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAMA,QAAA,EAAO;AAC7B,MAAA,IAAI;AAGF,QAAA,MAAM,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,MAAA,EAAO;AAAA,MAC9B,SAAS,CAAA,EAAG;AAEV,QAAA,OAAA,CAAQ,UAAU,CAAC,CAAA;AAAA,MACrB,CAAA,SAAE;AACA,QAAA,GAAA,CAAI,KAAA,CAAM,aAAa,KAAA,EAAM;AAC7B,QAAA,MAAA,EAAO;AAAA,MACT;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,SAAS,MAAY;AACzB,MAAA,QAAA,CAAS,KAAA,GAAQ,IAAA;AACjB,MAAA,QAAA,CAAS,KAAA,GAAQ,IAAA;AACjB,MAAA,WAAA,CAAY,KAAA,GAAQ,EAAA;AACpB,MAAA,WAAA,CAAY,KAAA,GAAQ,EAAA;AAAA,IACtB,CAAA;AAQA,IAAA,MAAM,oBAAoB,MAAY;AACpC,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAMA,QAAA,EAAO;AAC7B,MAAA,GAAA,CAAI,KAAA,CAAM,aAAa,KAAA,EAAM;AAC7B,MAAA,MAAA,EAAO;AAAA,IACT,CAAA;AAOA,IAAA,MAAM,WAAW,YAAwC;AACvD,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAMA,QAAA,EAAO;AAC7B,MAAA,IAAI;AACF,QAAA,OAAO,MAAM,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,QAAA,EAAS;AAAA,MACvC,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,YAAY,CAAC,CAAA;AACrB,QAAA,MAAM,CAAA;AAAA,MACR;AAAA,IACF,CAAA;AAQA,IAAA,MAAM,WAAA,GAAc,OAAO,IAAA,EAAc,KAAA,EAAe,QAAA,KAAoC;AAC1F,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAMA,QAAA,EAAO;AAC7B,MAAA,IAAI;AACF,QAAA,MAAM,WAAA,GAAc,GAAA,CAAI,KAAA,CAAM,YAAA,CAAa,GAAA,EAAI;AAC/C,QAAA,MAAM,GAAA,GAAM,MAAM,GAAA,CAAI,KAAA,CAAM,KAAK,WAAA,CAAY,IAAA,EAAM,OAAO,QAAQ,CAAA;AAClE,QAAA,kBAAA,CAAmB,GAAG,CAAA;AACtB,QAAA,IAAI,aAAa,UAAA,CAAW,KAAA,EAAA;AAAA,MAC9B,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,eAAe,CAAC,CAAA;AACxB,QAAA,MAAM,CAAA;AAAA,MACR;AAAA,IACF,CAAA;AAWA,IAAA,MAAM,qBAAA,GAAwB,CAAC,OAAA,KAInB;AACV,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAMA,QAAA,EAAO;AAO7B,MAAA,MAAM,WAAA,GAAc,GAAA,CAAI,KAAA,CAAM,YAAA,CAAa,GAAA,EAAI;AAC/C,MAAA,GAAA,CAAI,KAAA,CAAM,YAAA,CAAa,GAAA,CAAI,OAAA,CAAQ,KAAK,CAAA;AACxC,MAAA,aAAA,CAAc;AAAA,QACZ,IAAA,EAAM,QAAQ,IAAA,IAAQ,MAAA;AAAA,QACtB,QAAA,EAAU,QAAQ,QAAA,IAAY;AAAA,OAC/B,CAAA;AACD,MAAA,IAAI,aAAa,UAAA,CAAW,KAAA,EAAA;AAAA,IAC9B,CAAA;AAOA,IAAA,MAAM,QAAA,GAAW,OACf,QAAA,EACA,WAAA,KACoC;AACpC,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAMA,QAAA,EAAO;AAC7B,MAAA,IAAI;AACF,QAAA,OAAO,MAAM,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,QAAA,CAAS,UAAU,WAAW,CAAA;AAAA,MAC5D,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,YAAY,CAAC,CAAA;AACrB,QAAA,MAAM,CAAA;AAAA,MACR;AAAA,IACF,CAAA;AAQA,IAAA,MAAM,WAAA,GAAc,OAClB,QAAA,EACA,IAAA,EACA,OACA,WAAA,KACkB;AAClB,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAMA,QAAA,EAAO;AAC7B,MAAA,IAAI;AACF,QAAA,MAAM,WAAA,GAAc,GAAA,CAAI,KAAA,CAAM,YAAA,CAAa,GAAA,EAAI;AAC/C,QAAA,MAAM,GAAA,GAAM,MAAM,GAAA,CAAI,KAAA,CAAM,KAAK,WAAA,CAAY,QAAA,EAAU,IAAA,EAAM,KAAA,EAAO,WAAW,CAAA;AAC/E,QAAA,kBAAA,CAAmB,GAAG,CAAA;AACtB,QAAA,IAAI,aAAa,UAAA,CAAW,KAAA,EAAA;AAAA,MAC9B,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,eAAe,CAAC,CAAA;AACxB,QAAA,MAAM,CAAA;AAAA,MACR;AAAA,IACF,CAAA;AAGA,IAAA,MAAM,OAAA,GAAU,CAAC,QAAA,KAA0E;AACzF,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAMA,QAAA,EAAO;AAC7B,MAAA,OAAO,GAAA,CAAI,MAAM,IAAA,CAAK,OAAA,CAAQ,QAAQ,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,KAAe;AAC5D,QAAA,OAAA,CAAQ,WAAW,CAAC,CAAA;AACpB,QAAA,MAAM,CAAA;AAAA,MACR,CAAC,CAAA;AAAA,IACH,CAAA;AAGA,IAAA,MAAM,SAAA,GAAY,CAAC,QAAA,KAA4E;AAC7F,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAMA,QAAA,EAAO;AAC7B,MAAA,OAAO,GAAA,CAAI,MAAM,IAAA,CAAK,SAAA,CAAU,QAAQ,CAAA,CAAE,KAAA,CAAM,CAAC,CAAA,KAAe;AAC9D,QAAA,OAAA,CAAQ,aAAa,CAAC,CAAA;AACtB,QAAA,MAAM,CAAA;AAAA,MACR,CAAC,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,OAAO;AAAA;AAAA,MAEL,QAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA;AAAA;AAAA,MAEA,UAAA;AAAA,MACA,SAAA;AAAA;AAAA,MAEA,MAAA;AAAA,MACA,KAAA;AAAA,MACA,YAAA;AAAA,MACA,MAAA;AAAA,MACA,iBAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAA;AAAA,MACA,qBAAA;AAAA,MACA,QAAA;AAAA,MACA,WAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA;AAAA,EACA;AAAA,IACE,OAAA,EAAS;AAAA;AAAA;AAAA;AAAA,MAIP,KAAK,WAAA,CAAY,IAAA;AAAA,MACjB,QAAQ,EAAE,QAAA,EAAU,EAAE,QAAA,EAAU,MAAK;AAAE;AACzC;AAEJ;AAEA,SAASA,QAAA,GAAgB;AACvB,EAAA,OAAO,IAAI,MAAM,oDAAoD,CAAA;AACvE;;AC/TO,MAAM,YAAA,GAAe,WAAA;AAAA,EAC1B,UAAA;AAAA,EACA,MAAM;AACJ,IAAA,MAAM,GAAA,GAAM,WAA2B,IAAI,CAAA;AAE3C,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAe,EAAE,CAAA;AAC/B,IAAA,MAAM,QAAA,GAAW,IAAyB,IAAI,CAAA;AAC9C,IAAA,MAAM,SAAA,GAAY,IAAI,KAAK,CAAA;AAC3B,IAAA,MAAM,SAAA,GAAY,IAAkB,IAAI,CAAA;AACxC,IAAA,MAAM,SAAA,GAAY,IAAsB,IAAI,CAAA;AAE5C,IAAA,MAAM,OAAA,GAAU,SAAS,MAAM,CAAC,UAAU,KAAA,IAAS,KAAA,CAAM,KAAA,CAAM,MAAA,KAAW,CAAC,CAAA;AAE3E,IAAA,MAAM,MAAA,GAAS,CAAC,QAAA,KAA4B;AAC1C,MAAA,GAAA,CAAI,KAAA,GAAQ,QAAA;AAAA,IACd,CAAA;AAGA,IAAA,MAAM,OAAA,GAAU,CAAC,MAAA,EAAgB,CAAA,KAAqB;AACpD,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,WAAA,EAAc,MAAM,CAAA,QAAA,CAAA,EAAY,CAAC,CAAA;AAAA,IACjD,CAAA;AAEA,IAAA,MAAM,OAAA,GAAU,OAAO,KAAA,KAAoC;AACzD,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAMA,QAAA,EAAO;AAC7B,MAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAClB,MAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAClB,MAAA,SAAA,CAAU,KAAA,GAAQ,KAAA;AAClB,MAAA,IAAI;AACF,QAAA,MAAM,MAAM,MAAM,GAAA,CAAI,KAAA,CAAM,IAAA,CAAK,QAAQ,KAAK,CAAA;AAC9C,QAAA,KAAA,CAAM,QAAQ,GAAA,CAAI,KAAA;AAClB,QAAA,QAAA,CAAS,KAAA,GAAQ,GAAA;AAAA,MACnB,SAAS,CAAA,EAAG;AACV,QAAA,SAAA,CAAU,KAAA,GAAQ,CAAA;AAClB,QAAA,OAAA,CAAQ,WAAW,CAAC,CAAA;AACpB,QAAA,MAAM,CAAA;AAAA,MACR,CAAA,SAAE;AACA,QAAA,SAAA,CAAU,KAAA,GAAQ,KAAA;AAAA,MACpB;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,QAAQ,MAAY;AACxB,MAAA,KAAA,CAAM,QAAQ,EAAC;AACf,MAAA,QAAA,CAAS,KAAA,GAAQ,IAAA;AACjB,MAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAClB,MAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAAA,IACpB,CAAA;AAEA,IAAA,OAAO;AAAA;AAAA,MAEL,KAAA;AAAA,MACA,QAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA;AAAA,MAEA,OAAA;AAAA;AAAA,MAEA,MAAA;AAAA,MACA,OAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA;AAAA,EACA;AAAA,IACE,OAAA,EAAS;AAAA,MACP,MAAM,EAAC;AAAA,MACP,KAAK,iBAAA,CAAkB;AAAA;AACzB;AAEJ;AAEA,SAASA,QAAA,GAAgB;AACvB,EAAA,OAAO,IAAI,MAAM,oDAAoD,CAAA;AACvE;;ACwBA,MAAM,WAAA,GAAc,uDAAA;AAkBpB,MAAM,aAAA,GAA4D;AAAA,EAChE,WAAW,EAAC;AAAA,EACZ,UAAA,EAAY,CAAC,GAAG,eAAe,CAAA;AAAA,EAC/B,UAAU,EAAC;AAAA,EACX,cAAc,EAAC;AAAA,EACf,kBAAkB,EAAC;AAAA,EACnB,iBAAiB,EAAC;AAAA,EAClB,cAAc,EAAC;AAAA,EACf,aAAa,EAAC;AAAA,EACd,YAAA,EAAc,CAAC,eAAA,CAAgB,aAAa,CAAA;AAAA;AAAA;AAAA;AAAA,EAI5C,WAAW,EAAC;AAAA,EACZ,aAAa,EAAC;AAAA,EACd,cAAc,EAAC;AAAA,EACf,aAAa,EAAC;AAAA,EACd,oBAAoB,EAAC;AAAA,EACrB,iBAAiB,EAAC;AAAA,EAClB,gBAAgB,EAAC;AAAA,EACjB,YAAY;AACd,CAAA;AA4BA,MAAM,OAAA,GAAU,CAAC,MAAA,EAAgB,CAAA,KAAqB;AACpD,EAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,cAAA,EAAiB,MAAM,CAAA,QAAA,CAAA,EAAY,CAAC,CAAA;AACpD,CAAA;AAMO,MAAM,eAAA,GAAkB,WAAA;AAAA,EAC7B,aAAA;AAAA,EACA,MAAM;AAMJ,IAAA,MAAM,GAAA,GAAM,WAA2B,IAAI,CAAA;AAO3C,IAAA,MAAM,UAAA,GAAa,GAAA,CAAiB,EAAE,CAAA;AACtC,IAAA,MAAM,WAAA,GAAc,GAAA,CAAkB,EAAE,CAAA;AACxC,IAAA,MAAM,SAAA,GAAY,GAAA,CAAgB,EAAE,CAAA;AACpC,IAAA,MAAM,aAAA,GAAgB,GAAA,CAAoB,EAAE,CAAA;AAC5C,IAAA,MAAM,iBAAA,GAAoB,GAAA,CAAwB,EAAE,CAAA;AACpD,IAAA,MAAM,gBAAA,GAAmB,GAAA,CAAuB,EAAE,CAAA;AAClD,IAAA,MAAM,aAAA,GAAgB,GAAA,CAAoB,EAAE,CAAA;AAC5C,IAAA,MAAM,YAAA,GAAe,GAAA,CAAmB,EAAE,CAAA;AAC1C,IAAA,MAAM,aAAA,GAAgB,GAAA,CAAoB,EAAE,CAAA;AAE5C,IAAA,MAAM,UAAA,GAAa,GAAA,CAAiB,EAAE,CAAA;AACtC,IAAA,MAAM,aAAA,GAAgB,GAAA,CAAmB,EAAE,CAAA;AAC3C,IAAA,MAAM,aAAA,GAAgB,GAAA,CAAoB,EAAE,CAAA;AAC5C,IAAA,MAAM,YAAA,GAAe,GAAA,CAAmB,EAAE,CAAA;AAC1C,IAAA,MAAM,oBAAA,GAAuB,GAAA,CAA0B,EAAE,CAAA;AACzD,IAAA,MAAM,iBAAA,GAAoB,GAAA,CAAuB,EAAE,CAAA;AACnD,IAAA,MAAM,gBAAA,GAAmB,GAAA,CAAsB,EAAE,CAAA;AACjD,IAAA,MAAM,WAAA,GAAc,GAAA,CAAkB,EAAE,CAAA;AAOxC,IAAA,MAAM,UAAA,GAAa;AAAA,MACjB,SAAA,EAAW,UAAA;AAAA,MACX,UAAA,EAAY,WAAA;AAAA,MACZ,QAAA,EAAU,SAAA;AAAA,MACV,YAAA,EAAc,aAAA;AAAA,MACd,gBAAA,EAAkB,iBAAA;AAAA,MAClB,eAAA,EAAiB,gBAAA;AAAA,MACjB,YAAA,EAAc,aAAA;AAAA,MACd,WAAA,EAAa,YAAA;AAAA,MACb,YAAA,EAAc,aAAA;AAAA,MACd,SAAA,EAAW,UAAA;AAAA,MACX,WAAA,EAAa,aAAA;AAAA,MACb,YAAA,EAAc,aAAA;AAAA,MACd,WAAA,EAAa,YAAA;AAAA,MACb,kBAAA,EAAoB,oBAAA;AAAA,MACpB,eAAA,EAAiB,iBAAA;AAAA,MACjB,cAAA,EAAgB,gBAAA;AAAA,MAChB,UAAA,EAAY;AAAA,KACd;AAGA,IAAA,MAAM,SAAA,GAAY,IAAI,KAAK,CAAA;AAC3B,IAAA,MAAM,SAAA,GAAY,IAAkB,IAAI,CAAA;AAGxC,IAAA,MAAM,eAAA,GAAkB,GAAA,CAAkC,EAAE,CAAA;AAO5D,IAAA,MAAM,OAAA,GAAU,QAAA;AAAA,MACd,MACE,CAAC,UAAA,CAAW,KAAA,CAAM,MAAA,IAClB,CAAC,WAAA,CAAY,KAAA,CAAM,MAAA,IACnB,CAAC,SAAA,CAAU,KAAA,CAAM,UACjB,CAAC,aAAA,CAAc,KAAA,CAAM,MAAA,IACrB,CAAC,iBAAA,CAAkB,KAAA,CAAM,MAAA,IACzB,CAAC,gBAAA,CAAiB,KAAA,CAAM,MAAA,IACxB,CAAC,aAAA,CAAc,KAAA,CAAM,MAAA,IACrB,CAAC,aAAa,KAAA,CAAM,MAAA,IACpB,CAAC,aAAA,CAAc,KAAA,CAAM,MAAA,IACrB,CAAC,UAAA,CAAW,MAAM,MAAA,IAClB,CAAC,aAAA,CAAc,KAAA,CAAM,MAAA,IACrB,CAAC,aAAA,CAAc,KAAA,CAAM,UACrB,CAAC,YAAA,CAAa,KAAA,CAAM,MAAA,IACpB,CAAC,oBAAA,CAAqB,KAAA,CAAM,MAAA,IAC5B,CAAC,iBAAA,CAAkB,KAAA,CAAM,MAAA,IACzB,CAAC,gBAAA,CAAiB,KAAA,CAAM,MAAA,IACxB,CAAC,YAAY,KAAA,CAAM;AAAA,KACvB;AAMA,IAAA,MAAM,MAAA,GAAS,QAAA;AAAA,MAAmB,MAChC,KAAA,CAAM,IAAA,CAAK,IAAI,IAAI,UAAA,CAAW,KAAA,CAAM,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,CAAK,IAAI,CAAC,CAAC;AAAA,KAC9D;AAWA,IAAA,SAAS,UAAqC,QAAA,EAAwC;AACpF,MAAA,OAAO,UAAA,CAAW,QAAQ,CAAA,CAAE,KAAA;AAAA,IAC9B;AAOA,IAAA,SAAS,kBAAkB,QAAA,EAA8C;AACvE,MAAA,OAAO,cAAc,QAAQ,CAAA;AAAA,IAC/B;AAGA,IAAA,MAAM,UAAA,GAAa,kBAAA;AAOnB,IAAA,MAAM,MAAA,GAAS,CAAC,QAAA,KAA4B;AAC1C,MAAA,GAAA,CAAI,KAAA,GAAQ,QAAA;AAAA,IACd,CAAA;AAYA,IAAA,MAAM,WAAA,GAAc,OAClB,QAAA,EACA,KAAA,GAAsB,EAAC,KAC0B;AACjD,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAM,IAAI,MAAM,WAAW,CAAA;AAC3C,MAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAClB,MAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAClB,MAAA,eAAA,CAAgB,KAAA,CAAM,QAAQ,CAAA,GAAI,KAAA;AAClC,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,GAAM,MAAM,GAAA,CAAI,KAAA,CAAM,QAAQ,IAAA,CAAQ;AAAA,UAC1C,IAAA,EAAM,QAAA;AAAA,UACN,SAAS,gBAAA,CAAiB,QAAA;AAAA,UAC1B,GAAG;AAAA,SACJ,CAAA;AACD,QAAA,QAAQ,QAAA;AAAU,UAChB,KAAK,YAAA,CAAa,UAAA;AAChB,YAAA,UAAA,CAAW,QAAQ,GAAA,CAAI,KAAA;AACvB,YAAA;AAAA,UACF,KAAK,YAAA,CAAa,WAAA;AAChB,YAAA,WAAA,CAAY,QAAQ,GAAA,CAAI,KAAA;AACxB,YAAA;AAAA,UACF,KAAK,YAAA,CAAa,SAAA;AAChB,YAAA,SAAA,CAAU,QAAQ,GAAA,CAAI,KAAA;AACtB,YAAA;AAAA,UACF,KAAK,YAAA,CAAa,cAAA;AAChB,YAAA,aAAA,CAAc,QAAQ,GAAA,CAAI,KAAA;AAC1B,YAAA;AAAA,UACF,KAAK,YAAA,CAAa,iBAAA;AAChB,YAAA,iBAAA,CAAkB,QAAQ,GAAA,CAAI,KAAA;AAC9B,YAAA;AAAA,UACF,KAAK,YAAA,CAAa,gBAAA;AAChB,YAAA,gBAAA,CAAiB,QAAQ,GAAA,CAAI,KAAA;AAC7B,YAAA;AAAA,UACF,KAAK,YAAA,CAAa,aAAA;AAChB,YAAA,aAAA,CAAc,QAAQ,GAAA,CAAI,KAAA;AAC1B,YAAA;AAAA,UACF,KAAK,YAAA,CAAa,YAAA;AAChB,YAAA,YAAA,CAAa,QAAQ,GAAA,CAAI,KAAA;AACzB,YAAA;AAAA,UACF,KAAK,YAAA,CAAa,aAAA;AAChB,YAAA,aAAA,CAAc,QAAQ,GAAA,CAAI,KAAA;AAC1B,YAAA;AAAA,UACF,KAAK,YAAA,CAAa,UAAA;AAChB,YAAA,UAAA,CAAW,QAAQ,GAAA,CAAI,KAAA;AACvB,YAAA;AAAA,UACF,KAAK,YAAA,CAAa,YAAA;AAChB,YAAA,aAAA,CAAc,QAAQ,GAAA,CAAI,KAAA;AAC1B,YAAA;AAAA,UACF,KAAK,YAAA,CAAa,aAAA;AAChB,YAAA,aAAA,CAAc,QAAQ,GAAA,CAAI,KAAA;AAC1B,YAAA;AAAA,UACF,KAAK,YAAA,CAAa,aAAA;AAChB,YAAA,YAAA,CAAa,QAAQ,GAAA,CAAI,KAAA;AACzB,YAAA;AAAA,UACF,KAAK,YAAA,CAAa,oBAAA;AAChB,YAAA,oBAAA,CAAqB,QAAQ,GAAA,CAAI,KAAA;AACjC,YAAA;AAAA,UACF,KAAK,YAAA,CAAa,iBAAA;AAChB,YAAA,iBAAA,CAAkB,QAAQ,GAAA,CAAI,KAAA;AAC9B,YAAA;AAAA,UACF,KAAK,YAAA,CAAa,gBAAA;AAChB,YAAA,gBAAA,CAAiB,QAAQ,GAAA,CAAI,KAAA;AAC7B,YAAA;AAAA,UACF,KAAK,YAAA,CAAa,WAAA;AAChB,YAAA,WAAA,CAAY,QAAQ,GAAA,CAAI,KAAA;AACxB,YAAA;AAAA;AAEJ,QAAA,OAAO,GAAA;AAAA,MACT,SAAS,CAAA,EAAG;AACV,QAAA,SAAA,CAAU,KAAA,GAAQ,CAAA;AAClB,QAAA,OAAA,CAAQ,eAAe,CAAC,CAAA;AACxB,QAAA,MAAM,CAAA;AAAA,MACR,CAAA,SAAE;AACA,QAAA,SAAA,CAAU,KAAA,GAAQ,KAAA;AAAA,MACpB;AAAA,IACF,CAAA;AA0BA,IAAA,MAAM,YAAA,GAAe,OACnB,QAAA,EACA,KAAA,KAC8B;AAC9B,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAM,IAAI,MAAM,WAAW,CAAA;AAC3C,MAAA,IAAI,CAAC,KAAA,CAAM,MAAA,EAAQ,OAAO,EAAC;AAE3B,MAAA,MAAM,QAAQ,KAAA,CAAM,IAAA,CAAK,IAAI,GAAA,CAAI,MAAM,MAAA,CAAO,CAAC,CAAA,KAAM,OAAO,MAAM,QAAA,IAAY,CAAA,CAAE,MAAA,GAAS,CAAC,CAAC,CAAC,CAAA;AAC5F,MAAA,IAAI,CAAC,KAAA,CAAM,MAAA,EAAQ,OAAO,EAAC;AAC3B,MAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAClB,MAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAClB,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,GAAM,MAAM,GAAA,CAAI,KAAA,CAAM,QAAQ,IAAA,CAAQ;AAAA,UAC1C,IAAA,EAAM,QAAA;AAAA,UACN,KAAA,EAAO,KAAA;AAAA,UACP,SAAS,IAAA,CAAK,GAAA,CAAI,KAAA,CAAM,MAAA,EAAQ,iBAAiB,QAAQ;AAAA,SAC1D,CAAA;AACD,QAAA,MAAM,QAAQ,GAAA,CAAI,KAAA;AAGlB,QAAA,QAAQ,QAAA;AAAU,UAChB,KAAK,aAAa,UAAA,EAAY;AAC5B,YAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,UAAA,CAAW,KAAA,CAAM,GAAA,CAAI,CAAC,GAAA,KAAQ,CAAC,GAAA,CAAI,IAAA,EAAM,GAAG,CAAC,CAAC,CAAA;AACnE,YAAA,KAAA,MAAW,OAAO,KAAA,EAAsB,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,MAAM,GAAG,CAAA;AAC9D,YAAA,UAAA,CAAW,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA;AAC3C,YAAA;AAAA,UACF;AAAA,UACA,KAAK,aAAa,WAAA,EAAa;AAC7B,YAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,WAAA,CAAY,KAAA,CAAM,GAAA,CAAI,CAAC,GAAA,KAAQ,CAAC,GAAA,CAAI,IAAA,EAAM,GAAG,CAAC,CAAC,CAAA;AACpE,YAAA,KAAA,MAAW,OAAO,KAAA,EAAuB,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,MAAM,GAAG,CAAA;AAC/D,YAAA,WAAA,CAAY,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA;AAC5C,YAAA;AAAA,UACF;AAAA,UACA,KAAK,aAAa,SAAA,EAAW;AAC3B,YAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,SAAA,CAAU,KAAA,CAAM,GAAA,CAAI,CAAC,GAAA,KAAQ,CAAC,GAAA,CAAI,IAAA,EAAM,GAAG,CAAC,CAAC,CAAA;AAClE,YAAA,KAAA,MAAW,OAAO,KAAA,EAAqB,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,MAAM,GAAG,CAAA;AAC7D,YAAA,SAAA,CAAU,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA;AAC1C,YAAA;AAAA,UACF;AAAA,UACA,KAAK,aAAa,cAAA,EAAgB;AAChC,YAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,aAAA,CAAc,KAAA,CAAM,GAAA,CAAI,CAAC,GAAA,KAAQ,CAAC,GAAA,CAAI,IAAA,EAAM,GAAG,CAAC,CAAC,CAAA;AACtE,YAAA,KAAA,MAAW,OAAO,KAAA,EAAyB,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,MAAM,GAAG,CAAA;AACjE,YAAA,aAAA,CAAc,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA;AAC9C,YAAA;AAAA,UACF;AAAA,UACA,KAAK,aAAa,iBAAA,EAAmB;AACnC,YAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,iBAAA,CAAkB,KAAA,CAAM,GAAA,CAAI,CAAC,GAAA,KAAQ,CAAC,GAAA,CAAI,IAAA,EAAM,GAAG,CAAC,CAAC,CAAA;AAC1E,YAAA,KAAA,MAAW,OAAO,KAAA,EAA6B,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,MAAM,GAAG,CAAA;AACrE,YAAA,iBAAA,CAAkB,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA;AAClD,YAAA;AAAA,UACF;AAAA,UACA,KAAK,aAAa,gBAAA,EAAkB;AAClC,YAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,gBAAA,CAAiB,KAAA,CAAM,GAAA,CAAI,CAAC,GAAA,KAAQ,CAAC,GAAA,CAAI,IAAA,EAAM,GAAG,CAAC,CAAC,CAAA;AACzE,YAAA,KAAA,MAAW,OAAO,KAAA,EAA4B,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,MAAM,GAAG,CAAA;AACpE,YAAA,gBAAA,CAAiB,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA;AACjD,YAAA;AAAA,UACF;AAAA,UACA,KAAK,aAAa,aAAA,EAAe;AAC/B,YAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,aAAA,CAAc,KAAA,CAAM,GAAA,CAAI,CAAC,GAAA,KAAQ,CAAC,GAAA,CAAI,IAAA,EAAM,GAAG,CAAC,CAAC,CAAA;AACtE,YAAA,KAAA,MAAW,OAAO,KAAA,EAAyB,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,MAAM,GAAG,CAAA;AACjE,YAAA,aAAA,CAAc,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA;AAC9C,YAAA;AAAA,UACF;AAAA,UACA,KAAK,aAAa,YAAA,EAAc;AAC9B,YAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,YAAA,CAAa,KAAA,CAAM,GAAA,CAAI,CAAC,GAAA,KAAQ,CAAC,GAAA,CAAI,IAAA,EAAM,GAAG,CAAC,CAAC,CAAA;AACrE,YAAA,KAAA,MAAW,OAAO,KAAA,EAAwB,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,MAAM,GAAG,CAAA;AAChE,YAAA,YAAA,CAAa,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA;AAC7C,YAAA;AAAA,UACF;AAAA,UACA,KAAK,aAAa,aAAA,EAAe;AAC/B,YAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,aAAA,CAAc,KAAA,CAAM,GAAA,CAAI,CAAC,GAAA,KAAQ,CAAC,GAAA,CAAI,IAAA,EAAM,GAAG,CAAC,CAAC,CAAA;AACtE,YAAA,KAAA,MAAW,OAAO,KAAA,EAAyB,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,MAAM,GAAG,CAAA;AACjE,YAAA,aAAA,CAAc,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA;AAC9C,YAAA;AAAA,UACF;AAAA,UACA,KAAK,aAAa,UAAA,EAAY;AAC5B,YAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,UAAA,CAAW,KAAA,CAAM,GAAA,CAAI,CAAC,GAAA,KAAQ,CAAC,GAAA,CAAI,IAAA,EAAM,GAAG,CAAC,CAAC,CAAA;AACnE,YAAA,KAAA,MAAW,OAAO,KAAA,EAAsB,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,MAAM,GAAG,CAAA;AAC9D,YAAA,UAAA,CAAW,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA;AAC3C,YAAA;AAAA,UACF;AAAA,UACA,KAAK,aAAa,YAAA,EAAc;AAC9B,YAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,aAAA,CAAc,KAAA,CAAM,GAAA,CAAI,CAAC,GAAA,KAAQ,CAAC,GAAA,CAAI,IAAA,EAAM,GAAG,CAAC,CAAC,CAAA;AACtE,YAAA,KAAA,MAAW,OAAO,KAAA,EAAwB,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,MAAM,GAAG,CAAA;AAChE,YAAA,aAAA,CAAc,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA;AAC9C,YAAA;AAAA,UACF;AAAA,UACA,KAAK,aAAa,aAAA,EAAe;AAC/B,YAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,aAAA,CAAc,KAAA,CAAM,GAAA,CAAI,CAAC,GAAA,KAAQ,CAAC,GAAA,CAAI,IAAA,EAAM,GAAG,CAAC,CAAC,CAAA;AACtE,YAAA,KAAA,MAAW,OAAO,KAAA,EAAyB,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,MAAM,GAAG,CAAA;AACjE,YAAA,aAAA,CAAc,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA;AAC9C,YAAA;AAAA,UACF;AAAA,UACA,KAAK,aAAa,aAAA,EAAe;AAC/B,YAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,YAAA,CAAa,KAAA,CAAM,GAAA,CAAI,CAAC,GAAA,KAAQ,CAAC,GAAA,CAAI,IAAA,EAAM,GAAG,CAAC,CAAC,CAAA;AACrE,YAAA,KAAA,MAAW,OAAO,KAAA,EAAwB,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,MAAM,GAAG,CAAA;AAChE,YAAA,YAAA,CAAa,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA;AAC7C,YAAA;AAAA,UACF;AAAA,UACA,KAAK,aAAa,oBAAA,EAAsB;AACtC,YAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,oBAAA,CAAqB,KAAA,CAAM,GAAA,CAAI,CAAC,GAAA,KAAQ,CAAC,GAAA,CAAI,IAAA,EAAM,GAAG,CAAC,CAAC,CAAA;AAC7E,YAAA,KAAA,MAAW,OAAO,KAAA,EAA+B,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,MAAM,GAAG,CAAA;AACvE,YAAA,oBAAA,CAAqB,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA;AACrD,YAAA;AAAA,UACF;AAAA,UACA,KAAK,aAAa,iBAAA,EAAmB;AACnC,YAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,iBAAA,CAAkB,KAAA,CAAM,GAAA,CAAI,CAAC,GAAA,KAAQ,CAAC,GAAA,CAAI,IAAA,EAAM,GAAG,CAAC,CAAC,CAAA;AAC1E,YAAA,KAAA,MAAW,OAAO,KAAA,EAA4B,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,MAAM,GAAG,CAAA;AACpE,YAAA,iBAAA,CAAkB,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA;AAClD,YAAA;AAAA,UACF;AAAA,UACA,KAAK,aAAa,gBAAA,EAAkB;AAClC,YAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,gBAAA,CAAiB,KAAA,CAAM,GAAA,CAAI,CAAC,GAAA,KAAQ,CAAC,GAAA,CAAI,IAAA,EAAM,GAAG,CAAC,CAAC,CAAA;AACzE,YAAA,KAAA,MAAW,OAAO,KAAA,EAA2B,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,MAAM,GAAG,CAAA;AACnE,YAAA,gBAAA,CAAiB,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA;AACjD,YAAA;AAAA,UACF;AAAA,UACA,KAAK,aAAa,WAAA,EAAa;AAC7B,YAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,WAAA,CAAY,KAAA,CAAM,GAAA,CAAI,CAAC,GAAA,KAAQ,CAAC,GAAA,CAAI,IAAA,EAAM,GAAG,CAAC,CAAC,CAAA;AACpE,YAAA,KAAA,MAAW,OAAO,KAAA,EAAuB,IAAA,CAAK,GAAA,CAAI,GAAA,CAAI,MAAM,GAAG,CAAA;AAC/D,YAAA,WAAA,CAAY,KAAA,GAAQ,KAAA,CAAM,IAAA,CAAK,IAAA,CAAK,QAAQ,CAAA;AAC5C,YAAA;AAAA,UACF;AAAA;AAEF,QAAA,OAAO,KAAA;AAAA,MACT,SAAS,CAAA,EAAG;AACV,QAAA,SAAA,CAAU,KAAA,GAAQ,CAAA;AAClB,QAAA,OAAA,CAAQ,gBAAgB,CAAC,CAAA;AACzB,QAAA,MAAM,CAAA;AAAA,MACR,CAAA,SAAE;AACA,QAAA,SAAA,CAAU,KAAA,GAAQ,KAAA;AAAA,MACpB;AAAA,IACF,CAAA;AAOA,IAAA,MAAM,QAAA,GAAW,OAAoC,IAAA,KAA0C;AAC7F,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAM,IAAI,MAAM,WAAW,CAAA;AAC3C,MAAA,IAAI;AACF,QAAA,OAAO,MAAM,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,OAAU,IAAI,CAAA;AAAA,MAC/C,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,YAAY,CAAC,CAAA;AACrB,QAAA,MAAM,CAAA;AAAA,MACR;AAAA,IACF,CAAA;AAOA,IAAA,MAAM,MAAA,GAAS,OACb,OAAA,KAC4B;AAC5B,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAM,IAAI,MAAM,WAAW,CAAA;AAC3C,MAAA,IAAI;AACF,QAAA,OAAO,MAAM,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,OAAU,OAAO,CAAA;AAAA,MAClD,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,UAAU,CAAC,CAAA;AACnB,QAAA,MAAM,CAAA;AAAA,MACR;AAAA,IACF,CAAA;AAMA,IAAA,MAAM,MAAA,GAAS,OACb,IAAA,EACA,OAAA,KAC4B;AAC5B,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAM,IAAI,MAAM,WAAW,CAAA;AAC3C,MAAA,IAAI;AACF,QAAA,OAAO,MAAM,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAU,MAAM,OAAO,CAAA;AAAA,MACxD,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,UAAU,CAAC,CAAA;AACnB,QAAA,MAAM,CAAA;AAAA,MACR;AAAA,IACF,CAAA;AAGA,IAAA,MAAM,MAAA,GAAS,OAAO,IAAA,KAAgC;AACpD,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAM,IAAI,MAAM,WAAW,CAAA;AAC3C,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,MAAA,CAAO,IAAI,CAAA;AAAA,MACrC,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,UAAU,CAAC,CAAA;AACnB,QAAA,MAAM,CAAA;AAAA,MACR;AAAA,IACF,CAAA;AAUA,IAAA,MAAM,YAAA,GAAe,OAAO,IAAA,KAA2C;AACrE,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAM,IAAI,MAAM,WAAW,CAAA;AAC3C,MAAA,IAAI;AACF,QAAA,OAAO,MAAM,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,YAAY,IAAI,CAAA;AAAA,MACjD,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,gBAAgB,CAAC,CAAA;AACzB,QAAA,MAAM,CAAA;AAAA,MACR;AAAA,IACF,CAAA;AAiBA,IAAA,MAAM,eAAe,OACnB,IAAA,EACA,UAAA,EACA,OAAA,GAA+B,EAAC,KACJ;AAC5B,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAM,IAAI,MAAM,WAAW,CAAA;AAC3C,MAAA,IAAI;AACF,QAAA,OAAO,MAAM,GAAA,CAAI,KAAA,CAAM,QAAQ,YAAA,CAAa,IAAA,EAAM,YAAY,OAAO,CAAA;AAAA,MACvE,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,gBAAgB,CAAC,CAAA;AACzB,QAAA,MAAM,CAAA;AAAA,MACR;AAAA,IACF,CAAA;AAMA,IAAA,OAAO;AAAA;AAAA,MAEL,UAAA;AAAA,MACA,WAAA;AAAA,MACA,SAAA;AAAA,MACA,aAAA;AAAA,MACA,iBAAA;AAAA,MACA,gBAAA;AAAA,MACA,aAAA;AAAA,MACA,YAAA;AAAA,MACA,aAAA;AAAA,MACA,UAAA;AAAA,MACA,aAAA;AAAA,MACA,aAAA;AAAA,MACA,YAAA;AAAA,MACA,oBAAA;AAAA,MACA,iBAAA;AAAA,MACA,gBAAA;AAAA,MACA,WAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,eAAA;AAAA;AAAA,MAEA,OAAA;AAAA,MACA,MAAA;AAAA,MACA,SAAA;AAAA,MACA,iBAAA;AAAA,MACA,UAAA;AAAA;AAAA,MAEA,MAAA;AAAA,MACA,WAAA;AAAA,MACA,YAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA;AAAA,EACA;AAAA,IACE,OAAA,EAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAMP,MAAM,EAAC;AAAA,MACP,KAAK,iBAAA,CAAkB;AAAA;AACzB;AAEJ;;AC1qBO,MAAM,eAAA,GAAkB,WAAA;AAAA,EAC7B,aAAA;AAAA,EACA,MAAM;AACJ,IAAA,MAAM,GAAA,GAAM,WAA2B,IAAI,CAAA;AAG3C,IAAA,MAAM,QAAA,GAAW,IAAiD,IAAI,CAAA;AACtE,IAAA,MAAM,YAAA,GAAe,IAAqD,IAAI,CAAA;AAC9E,IAAA,MAAM,SAAA,GAAY,IAAkD,IAAI,CAAA;AAExE,IAAA,MAAM,YAAA,GAAe,IAAiC,IAAI,CAAA;AAC1D,IAAA,MAAM,gBAAA,GAAmB,IAAoC,IAAI,CAAA;AACjE,IAAA,MAAM,aAAA,GAAgB,IAAkC,IAAI,CAAA;AAE5D,IAAA,MAAM,SAAA,GAAY,IAAI,KAAK,CAAA;AAC3B,IAAA,MAAM,SAAA,GAAY,IAAkB,IAAI,CAAA;AAExC,IAAA,MAAM,SAAA,GAAY,GAAA,CAIf,EAAE,CAAA;AAGL,IAAA,MAAM,OAAA,GAAU,QAAA;AAAA,MACd,MACE,CAAC,QAAA,CAAS,KAAA,EAAO,MAAM,MAAA,IACvB,CAAC,YAAA,CAAa,KAAA,EAAO,KAAA,CAAM,MAAA,IAC3B,CAAC,SAAA,CAAU,OAAO,KAAA,CAAM;AAAA,KAC5B;AAGA,IAAA,MAAM,MAAA,GAAS,CAAC,QAAA,KAA4B;AAC1C,MAAA,GAAA,CAAI,KAAA,GAAQ,QAAA;AAAA,IACd,CAAA;AAEA,IAAA,MAAM,OAAA,GAAU,CAAC,MAAA,EAAgB,CAAA,KAAqB;AACpD,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,cAAA,EAAiB,MAAM,CAAA,QAAA,CAAA,EAAY,CAAC,CAAA;AAAA,IACpD,CAAA;AAEA,IAAA,MAAM,UAAA,GAAa,OAAO,CAAA,KAAwC;AAChE,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAMA,QAAA,EAAO;AAC7B,MAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAClB,MAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAClB,MAAA,SAAA,CAAU,MAAM,KAAA,GAAQ,CAAA;AACxB,MAAA,IAAI;AACF,QAAA,QAAA,CAAS,QAAQ,MAAM,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,UAAU,CAAC,CAAA;AAAA,MACtD,SAAS,CAAA,EAAG;AACV,QAAA,SAAA,CAAU,KAAA,GAAQ,CAAA;AAClB,QAAA,OAAA,CAAQ,cAAc,CAAC,CAAA;AACvB,QAAA,MAAM,CAAA;AAAA,MACR,CAAA,SAAE;AACA,QAAA,SAAA,CAAU,KAAA,GAAQ,KAAA;AAAA,MACpB;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,cAAA,GAAiB,OAAO,CAAA,KAA4C;AACxE,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAMA,QAAA,EAAO;AAC7B,MAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAClB,MAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAClB,MAAA,SAAA,CAAU,MAAM,SAAA,GAAY,CAAA;AAC5B,MAAA,IAAI;AACF,QAAA,YAAA,CAAa,QAAQ,MAAM,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,cAAc,CAAC,CAAA;AAAA,MAC9D,SAAS,CAAA,EAAG;AACV,QAAA,SAAA,CAAU,KAAA,GAAQ,CAAA;AAClB,QAAA,OAAA,CAAQ,kBAAkB,CAAC,CAAA;AAC3B,QAAA,MAAM,CAAA;AAAA,MACR,CAAA,SAAE;AACA,QAAA,SAAA,CAAU,KAAA,GAAQ,KAAA;AAAA,MACpB;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,WAAA,GAAc,OAAO,CAAA,KAAyC;AAClE,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAMA,QAAA,EAAO;AAC7B,MAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAClB,MAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAClB,MAAA,SAAA,CAAU,MAAM,MAAA,GAAS,CAAA;AACzB,MAAA,IAAI;AACF,QAAA,SAAA,CAAU,QAAQ,MAAM,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,WAAW,CAAC,CAAA;AAAA,MACxD,SAAS,CAAA,EAAG;AACV,QAAA,SAAA,CAAU,KAAA,GAAQ,CAAA;AAClB,QAAA,OAAA,CAAQ,eAAe,CAAC,CAAA;AACxB,QAAA,MAAM,CAAA;AAAA,MACR,CAAA,SAAE;AACA,QAAA,SAAA,CAAU,KAAA,GAAQ,KAAA;AAAA,MACpB;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,iBAAA,GAAoB,OAAO,CAAA,KAAwC;AACvE,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAMA,QAAA,EAAO;AAC7B,MAAA,IAAI;AACF,QAAA,YAAA,CAAa,QAAQ,MAAM,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,aAAa,CAAC,CAAA;AAAA,MAC7D,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,qBAAqB,CAAC,CAAA;AAC9B,QAAA,MAAM,CAAA;AAAA,MACR;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,qBAAA,GAAwB,OAAO,CAAA,KAA4C;AAC/E,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAMA,QAAA,EAAO;AAC7B,MAAA,IAAI;AACF,QAAA,gBAAA,CAAiB,QAAQ,MAAM,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,iBAAiB,CAAC,CAAA;AAAA,MACrE,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,yBAAyB,CAAC,CAAA;AAClC,QAAA,MAAM,CAAA;AAAA,MACR;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,kBAAA,GAAqB,OAAO,CAAA,KAAyC;AACzE,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAMA,QAAA,EAAO;AAC7B,MAAA,IAAI;AACF,QAAA,aAAA,CAAc,QAAQ,MAAM,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,cAAc,CAAC,CAAA;AAAA,MAC/D,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,sBAAsB,CAAC,CAAA;AAC/B,QAAA,MAAM,CAAA;AAAA,MACR;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,SAAA,GAAY,OAChB,GAAA,EACA,CAAA,KACkB;AAClB,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAMA,QAAA,EAAO;AAC7B,MAAA,IAAI;AACF,QAAA,OAAO,MAAM,GAAA,CAAI,KAAA,CAAM,OAAA,CAAQ,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,MACjD,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,aAAa,CAAC,CAAA;AACtB,QAAA,MAAM,CAAA;AAAA,MACR;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,QAAQ,MAAY;AACxB,MAAA,QAAA,CAAS,KAAA,GAAQ,IAAA;AACjB,MAAA,YAAA,CAAa,KAAA,GAAQ,IAAA;AACrB,MAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAClB,MAAA,YAAA,CAAa,KAAA,GAAQ,IAAA;AACrB,MAAA,gBAAA,CAAiB,KAAA,GAAQ,IAAA;AACzB,MAAA,aAAA,CAAc,KAAA,GAAQ,IAAA;AACtB,MAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAClB,MAAA,SAAA,CAAU,QAAQ,EAAC;AAAA,IACrB,CAAA;AAEA,IAAA,OAAO;AAAA;AAAA,MAEL,QAAA;AAAA,MACA,YAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA;AAAA,MACA,gBAAA;AAAA,MACA,aAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA;AAAA,MAEA,OAAA;AAAA;AAAA,MAEA,MAAA;AAAA,MACA,UAAA;AAAA,MACA,cAAA;AAAA,MACA,WAAA;AAAA,MACA,iBAAA;AAAA,MACA,qBAAA;AAAA,MACA,kBAAA;AAAA,MACA,SAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA;AAAA,EACA;AAAA,IACE,OAAA,EAAS;AAAA,MACP,MAAM,EAAC;AAAA,MACP,KAAK,iBAAA,CAAkB;AAAA;AACzB;AAEJ;AAEA,SAASA,QAAA,GAAgB;AACvB,EAAA,OAAO,IAAI,MAAM,uDAAuD,CAAA;AAC1E;;ACzMO,MAAM,cAAA,GAAiB,WAAA;AAAA,EAC5B,YAAA;AAAA,EACA,MAAM;AACJ,IAAA,MAAM,GAAA,GAAM,WAA2B,IAAI,CAAA;AAE3C,IAAA,MAAM,aAAA,GAAgB,GAAA,CAA0B,EAAE,CAAA;AAClD,IAAA,MAAM,gBAAA,GAAmB,IAAmC,IAAI,CAAA;AAChE,IAAA,MAAM,UAAA,GAAa,GAAA,CAA6B,EAAE,CAAA;AAClD,IAAA,MAAM,aAAA,GAAgB,IAAsC,IAAI,CAAA;AAChE,IAAA,MAAM,SAAA,GAAY,GAAA,CAAsB,EAAE,CAAA;AAC1C,IAAA,MAAM,iBAAA,GAAoB,IAAoC,IAAI,CAAA;AAClE,IAAA,MAAM,SAAA,GAAY,IAAI,KAAK,CAAA;AAC3B,IAAA,MAAM,SAAA,GAAY,IAAkB,IAAI,CAAA;AACxC,IAAA,MAAM,iBAAA,GAAoB,IAAgC,IAAI,CAAA;AAC9D,IAAA,MAAM,oBAAA,GAAuB,IAAmC,IAAI,CAAA;AACpE,IAAA,MAAM,kBAAA,GAAqB,IAAiC,IAAI,CAAA;AAEhE,IAAA,MAAM,eAAA,GAAkB,SAAS,MAAM,CAAC,UAAU,KAAA,IAAS,aAAA,CAAc,KAAA,CAAM,MAAA,KAAW,CAAC,CAAA;AAC3F,IAAA,MAAM,YAAA,GAAe,SAAS,MAAM,CAAC,UAAU,KAAA,IAAS,UAAA,CAAW,KAAA,CAAM,MAAA,KAAW,CAAC,CAAA;AACrF,IAAA,MAAM,gBAAA,GAAmB,SAAS,MAAM,CAAC,UAAU,KAAA,IAAS,SAAA,CAAU,KAAA,CAAM,MAAA,KAAW,CAAC,CAAA;AAExF,IAAA,MAAM,MAAA,GAAS,CAAC,QAAA,KAA4B;AAC1C,MAAA,GAAA,CAAI,KAAA,GAAQ,QAAA;AAAA,IACd,CAAA;AAEA,IAAA,MAAM,OAAA,GAAU,CAAC,MAAA,EAAgB,CAAA,KAAqB;AACpD,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,aAAA,EAAgB,MAAM,CAAA,QAAA,CAAA,EAAY,CAAC,CAAA;AAAA,IACnD,CAAA;AAEA,IAAA,MAAM,WAAA,GAAc,OAAO,KAAA,GAA6B,EAAC,KAAqB;AAC5E,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAMA,QAAA,EAAO;AAC7B,MAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAClB,MAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAClB,MAAA,iBAAA,CAAkB,KAAA,GAAQ,KAAA;AAC1B,MAAA,IAAI;AACF,QAAA,MAAM,MAAM,MAAM,GAAA,CAAI,KAAA,CAAM,MAAA,CAAO,YAAY,KAAK,CAAA;AACpD,QAAA,aAAA,CAAc,KAAA,GAAQ,IAAI,IAAA,CAAK,KAAA;AAC/B,QAAA,gBAAA,CAAiB,KAAA,GAAQ,GAAA;AAAA,MAC3B,SAAS,CAAA,EAAG;AACV,QAAA,SAAA,CAAU,KAAA,GAAQ,CAAA;AAClB,QAAA,OAAA,CAAQ,eAAe,CAAC,CAAA;AACxB,QAAA,MAAM,CAAA;AAAA,MACR,CAAA,SAAE;AACA,QAAA,SAAA,CAAU,KAAA,GAAQ,KAAA;AAAA,MACpB;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,cAAA,GAAiB,OAAO,KAAA,KAAiD;AAC7E,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAMA,QAAA,EAAO;AAC7B,MAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAClB,MAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAClB,MAAA,oBAAA,CAAqB,KAAA,GAAQ,KAAA;AAC7B,MAAA,IAAI;AACF,QAAA,MAAM,MAAM,MAAM,GAAA,CAAI,KAAA,CAAM,MAAA,CAAO,eAAe,KAAK,CAAA;AACvD,QAAA,UAAA,CAAW,KAAA,GAAQ,IAAI,IAAA,CAAK,MAAA;AAC5B,QAAA,aAAA,CAAc,KAAA,GAAQ,GAAA;AAAA,MACxB,SAAS,CAAA,EAAG;AACV,QAAA,SAAA,CAAU,KAAA,GAAQ,CAAA;AAClB,QAAA,OAAA,CAAQ,kBAAkB,CAAC,CAAA;AAC3B,QAAA,MAAM,CAAA;AAAA,MACR,CAAA,SAAE;AACA,QAAA,SAAA,CAAU,KAAA,GAAQ,KAAA;AAAA,MACpB;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,YAAA,GAAe,OAAO,KAAA,KAA+C;AACzE,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAMA,QAAA,EAAO;AAC7B,MAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAClB,MAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAClB,MAAA,kBAAA,CAAmB,KAAA,GAAQ,KAAA;AAC3B,MAAA,IAAI;AACF,QAAA,MAAM,MAAM,MAAM,GAAA,CAAI,KAAA,CAAM,MAAA,CAAO,aAAa,KAAK,CAAA;AACrD,QAAA,SAAA,CAAU,KAAA,GAAQ,IAAI,IAAA,CAAK,KAAA;AAC3B,QAAA,iBAAA,CAAkB,KAAA,GAAQ,GAAA;AAAA,MAC5B,SAAS,CAAA,EAAG;AACV,QAAA,SAAA,CAAU,KAAA,GAAQ,CAAA;AAClB,QAAA,OAAA,CAAQ,gBAAgB,CAAC,CAAA;AACzB,QAAA,MAAM,CAAA;AAAA,MACR,CAAA,SAAE;AACA,QAAA,SAAA,CAAU,KAAA,GAAQ,KAAA;AAAA,MACpB;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,QAAQ,MAAY;AACxB,MAAA,aAAA,CAAc,QAAQ,EAAC;AACvB,MAAA,gBAAA,CAAiB,KAAA,GAAQ,IAAA;AACzB,MAAA,UAAA,CAAW,QAAQ,EAAC;AACpB,MAAA,aAAA,CAAc,KAAA,GAAQ,IAAA;AACtB,MAAA,SAAA,CAAU,QAAQ,EAAC;AACnB,MAAA,iBAAA,CAAkB,KAAA,GAAQ,IAAA;AAC1B,MAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAClB,MAAA,iBAAA,CAAkB,KAAA,GAAQ,IAAA;AAC1B,MAAA,oBAAA,CAAqB,KAAA,GAAQ,IAAA;AAC7B,MAAA,kBAAA,CAAmB,KAAA,GAAQ,IAAA;AAAA,IAC7B,CAAA;AAEA,IAAA,OAAO;AAAA,MACL,aAAA;AAAA,MACA,gBAAA;AAAA,MACA,UAAA;AAAA,MACA,aAAA;AAAA,MACA,SAAA;AAAA,MACA,iBAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,iBAAA;AAAA;AAAA,MAEA,cAAA,EAAgB,oBAAA;AAAA,MAChB,oBAAA;AAAA,MACA,kBAAA;AAAA,MACA,eAAA;AAAA,MACA,YAAA;AAAA,MACA,gBAAA;AAAA,MACA,MAAA;AAAA,MACA,WAAA;AAAA,MACA,cAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA;AAAA,EACA;AAAA,IACE,OAAA,EAAS;AAAA,MACP,MAAM,EAAC;AAAA,MACP,KAAK,iBAAA,CAAkB;AAAA;AACzB;AAEJ;AAEA,SAASA,QAAA,GAAgB;AACvB,EAAA,OAAO,IAAI,MAAM,sDAAsD,CAAA;AACzE;;AC7HO,MAAM,WAAA,GAAc,WAAA;AAAA,EACzB,SAAA;AAAA,EACA,MAAM;AACJ,IAAA,MAAM,GAAA,GAAM,WAA2B,IAAI,CAAA;AAE3C,IAAA,MAAM,MAAA,GAAS,GAAA,CAAoB,EAAE,CAAA;AACrC,IAAA,MAAM,aAAA,GAAgB,IAAyB,IAAI,CAAA;AACnD,IAAA,MAAM,SAAA,GAAY,IAA8B,IAAI,CAAA;AACpD,IAAA,MAAM,SAAA,GAAY,IAAI,KAAK,CAAA;AAC3B,IAAA,MAAM,SAAA,GAAY,IAAkB,IAAI,CAAA;AACxC,IAAA,MAAM,cAAA,GAAiB,GAAA,CAAmB,EAAE,CAAA;AAE5C,IAAA,MAAM,YAAA,GAAe,QAAA,CAAS,MAAM,CAAC,CAAC,UAAU,KAAA,IAAS,SAAA,CAAU,KAAA,CAAM,WAAA,GAAc,CAAC,CAAA;AAExF,IAAA,MAAM,MAAA,GAAS,CAAC,QAAA,KAA4B;AAC1C,MAAA,GAAA,CAAI,KAAA,GAAQ,QAAA;AAAA,IACd,CAAA;AAGA,IAAA,MAAM,OAAA,GAAU,CAAC,MAAA,EAAgB,CAAA,KAAqB;AACpD,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,UAAA,EAAa,MAAM,CAAA,QAAA,CAAA,EAAY,CAAC,CAAA;AAAA,IAChD,CAAA;AAEA,IAAA,eAAe,QAAA,CAAY,OAAe,EAAA,EAAkC;AAC1E,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAMA,QAAA,EAAO;AAC7B,MAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAClB,MAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAClB,MAAA,IAAI;AACF,QAAA,OAAO,MAAM,EAAA,EAAG;AAAA,MAClB,SAAS,CAAA,EAAG;AACV,QAAA,SAAA,CAAU,KAAA,GAAQ,CAAA;AAClB,QAAA,OAAA,CAAQ,OAAO,CAAC,CAAA;AAChB,QAAA,MAAM,CAAA;AAAA,MACR,CAAA,SAAE;AACA,QAAA,SAAA,CAAU,KAAA,GAAQ,KAAA;AAAA,MACpB;AAAA,IACF;AAEA,IAAA,MAAM,cAAc,YAA2B;AAC7C,MAAA,MAAA,CAAO,KAAA,GAAQ,MAAM,QAAA,CAAS,aAAA,EAAe,MAAM,GAAA,CAAI,KAAA,CAAO,GAAA,CAAI,mBAAA,EAAqB,CAAA;AAAA,IACzF,CAAA;AAEA,IAAA,MAAM,cAAA,GAAiB,OAAO,KAAA,GAAuB,EAAC,KAAqB;AACzE,MAAA,aAAA,CAAc,QAAQ,MAAM,QAAA;AAAA,QAAS,gBAAA;AAAA,QAAkB,MACrD,GAAA,CAAI,KAAA,CAAO,GAAA,CAAI,aAAa,KAAK;AAAA,OACnC;AACA,MAAA,cAAA,CAAe,KAAA,GAAQ,KAAA;AAAA,IACzB,CAAA;AAEA,IAAA,MAAM,cAAA,GAAiB,OAAO,KAAA,GAAuB,EAAC,KAAqB;AACzE,MAAA,SAAA,CAAU,QAAQ,MAAM,QAAA;AAAA,QAAS,gBAAA;AAAA,QAAkB,MACjD,GAAA,CAAI,KAAA,CAAO,GAAA,CAAI,kBAAkB,KAAK;AAAA,OACxC;AACA,MAAA,cAAA,CAAe,KAAA,GAAQ,KAAA;AAAA,IACzB,CAAA;AAGA,IAAA,MAAM,iBAAA,GAAoB,CAAC,IAAA,KACzB,QAAA,CAAS,mBAAA,EAAqB,MAAM,GAAA,CAAI,KAAA,CAAO,GAAA,CAAI,eAAA,CAAgB,IAAI,CAAC,CAAA;AAG1E,IAAA,MAAM,cAAA,GAAiB,CAAC,KAAA,GAAuB,EAAC,KAC9C,QAAA,CAAS,gBAAA,EAAkB,MAAM,GAAA,CAAI,KAAA,CAAO,GAAA,CAAI,cAAA,CAAe,KAAK,CAAC,CAAA;AAEvE,IAAA,OAAO;AAAA;AAAA,MAEL,MAAA;AAAA,MACA,aAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,cAAA;AAAA;AAAA,MAEA,YAAA;AAAA;AAAA,MAEA,MAAA;AAAA,MACA,WAAA;AAAA,MACA,cAAA;AAAA,MACA,cAAA;AAAA,MACA,iBAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA;AAAA,EACA;AAAA,IACE,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,CAAC,gBAAgB,CAAA;AAAA,MACvB,KAAK,iBAAA,CAAkB;AAAA;AACzB;AAEJ;AAEA,SAASA,QAAA,GAAgB;AACvB,EAAA,OAAO,IAAI,MAAM,mDAAmD,CAAA;AACtE;;AC5FO,MAAM,cAAA,GAAiB,WAAA;AAAA,EAC5B,YAAA;AAAA,EACA,MAAM;AACJ,IAAA,MAAM,GAAA,GAAM,WAA2B,IAAI,CAAA;AAE3C,IAAA,MAAM,WAAA,GAAc,IAAoC,IAAI,CAAA;AAC5D,IAAA,MAAM,cAAA,GAAiB,IAAiC,IAAI,CAAA;AAC5D,IAAA,MAAM,cAAA,GAAiB,IAGb,IAAI,CAAA;AAEd,IAAA,MAAM,SAAA,GAAY,IAAI,KAAK,CAAA;AAC3B,IAAA,MAAM,SAAA,GAAY,IAAkB,IAAI,CAAA;AAExC,IAAA,MAAM,oBAAA,GAAuB,IAAmC,IAAI,CAAA;AAGpE,IAAA,MAAM,kBAAA,GAAqB,QAAA,CAAS,MAAM,CAAC,CAAC,YAAY,KAAA,IAAS,WAAA,CAAY,KAAA,CAAM,KAAA,GAAQ,CAAC,CAAA;AAE5F,IAAA,MAAM,MAAA,GAAS,CAAC,QAAA,KAA4B;AAC1C,MAAA,GAAA,CAAI,KAAA,GAAQ,QAAA;AAAA,IACd,CAAA;AAGA,IAAA,MAAM,OAAA,GAAU,CAAC,MAAA,EAAgB,CAAA,KAAqB;AACpD,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,aAAA,EAAgB,MAAM,CAAA,QAAA,CAAA,EAAY,CAAC,CAAA;AAAA,IACnD,CAAA;AAEA,IAAA,eAAe,QAAA,CAAY,OAAe,EAAA,EAAkC;AAC1E,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAMA,QAAA,EAAO;AAC7B,MAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAClB,MAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAClB,MAAA,IAAI;AACF,QAAA,OAAO,MAAM,EAAA,EAAG;AAAA,MAClB,SAAS,CAAA,EAAG;AACV,QAAA,SAAA,CAAU,KAAA,GAAQ,CAAA;AAClB,QAAA,OAAA,CAAQ,OAAO,CAAC,CAAA;AAChB,QAAA,MAAM,CAAA;AAAA,MACR,CAAA,SAAE;AACA,QAAA,SAAA,CAAU,KAAA,GAAQ,KAAA;AAAA,MACpB;AAAA,IACF;AAIA,IAAA,MAAM,cAAA,GAAiB,OAAO,KAAA,KAAiD;AAC7E,MAAA,MAAM,GAAA,GAAM,MAAM,QAAA,CAAS,gBAAA,EAAkB,MAAM,IAAI,KAAA,CAAO,MAAA,CAAO,cAAA,CAAe,KAAK,CAAC,CAAA;AAC1F,MAAA,WAAA,CAAY,KAAA,GAAQ,GAAA;AACpB,MAAA,oBAAA,CAAqB,KAAA,GAAQ,KAAA;AAAA,IAC/B,CAAA;AAEA,IAAA,MAAM,iBAAA,GAAoB,OAAO,GAAA,KAAsD;AACrF,MAAA,MAAM,MAAM,MAAM,QAAA;AAAA,QAAS,mBAAA;AAAA,QAAqB,MAC9C,GAAA,CAAI,KAAA,CAAO,MAAA,CAAO,kBAAkB,GAAG;AAAA,OACzC;AACA,MAAA,cAAA,CAAe,KAAA,GAAQ,GAAA;AACvB,MAAA,OAAO,cAAA,CAAe,KAAA;AAAA,IACxB,CAAA;AAEA,IAAA,MAAM,iBAAA,GAAoB,OAAO,KAAA,KAI4C;AAC3E,MAAA,MAAM,MAAM,MAAM,QAAA;AAAA,QAAS,mBAAA;AAAA,QAAqB,MAC9C,GAAA,CAAI,KAAA,CAAO,MAAA,CAAO,kBAAkB,KAAK;AAAA,OAC3C;AACA,MAAA,cAAA,CAAe,KAAA,GAAQ,GAAA;AACvB,MAAA,OAAO,cAAA,CAAe,KAAA;AAAA,IACxB,CAAA;AAMA,IAAA,MAAM,mBAAA,GAAsB,CAAC,UAAA,KAA0C;AACrE,MAAA,MAAM,KAAA,GAAQ,oBAAoB,UAA8C,CAAA;AAChF,MAAA,IAAI,CAAC,KAAA,EAAO,OAAO,EAAC;AACpB,MAAA,OAAO,MAAM,MAAA,CAAO,CAAC,SAAS,CAAC,kBAAA,CAAmB,IAAI,CAAC,CAAA;AAAA,IACzD,CAAA;AAEA,IAAA,OAAO;AAAA;AAAA,MAEL,WAAA;AAAA,MACA,cAAA;AAAA,MACA,cAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,oBAAA;AAAA;AAAA,MAEA,kBAAA;AAAA;AAAA,MAEA,MAAA;AAAA,MACA,cAAA;AAAA,MACA,iBAAA;AAAA,MACA,iBAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA;AAAA,EACA;AAAA,IACE,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,CAAC,sBAAsB,CAAA;AAAA,MAC7B,KAAK,iBAAA,CAAkB;AAAA;AACzB;AAEJ;AAEA,SAASA,QAAA,GAAgB;AACvB,EAAA,OAAO,IAAI,MAAM,sDAAsD,CAAA;AACzE;;ACpHO,MAAM,aAAA,GAAgB,WAAA;AAAA,EAC3B,WAAA;AAAA,EACA,MAAM;AACJ,IAAA,MAAM,GAAA,GAAM,WAA2B,IAAI,CAAA;AAE3C,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAmB,EAAE,CAAA;AACnC,IAAA,MAAM,KAAA,GAAQ,IAAI,CAAC,CAAA;AACnB,IAAA,MAAM,SAAA,GAAY,IAAI,KAAK,CAAA;AAC3B,IAAA,MAAM,SAAA,GAAY,IAAkB,IAAI,CAAA;AACxC,IAAA,MAAM,SAAA,GAAY,GAAA,CAA4B,EAAE,CAAA;AAChD,IAAA,MAAM,YAAA,GAAe,IAAwB,IAAI,CAAA;AAEjD,IAAA,MAAM,OAAA,GAAU,SAAS,MAAM,CAAC,UAAU,KAAA,IAAS,KAAA,CAAM,KAAA,CAAM,MAAA,KAAW,CAAC,CAAA;AAC3E,IAAA,MAAM,WAAA,GAAc,QAAA,CAAS,MAAM,KAAA,CAAM,KAAA,CAAM,OAAO,CAAC,CAAA,KAAM,CAAA,CAAE,QAAQ,CAAC,CAAA;AAExE,IAAA,MAAM,MAAA,GAAS,CAAC,QAAA,KAA4B;AAC1C,MAAA,GAAA,CAAI,KAAA,GAAQ,QAAA;AAAA,IACd,CAAA;AAGA,IAAA,MAAM,OAAA,GAAU,CAAC,MAAA,EAAgB,CAAA,KAAqB;AACpD,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,YAAA,EAAe,MAAM,CAAA,QAAA,CAAA,EAAY,CAAC,CAAA;AAAA,IAClD,CAAA;AAEA,IAAA,MAAM,KAAA,GAAQ,OAAO,KAAA,GAAgC,EAAC,KAAqB;AACzE,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAMA,QAAA,EAAO;AAC7B,MAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAClB,MAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAClB,MAAA,SAAA,CAAU,KAAA,GAAQ,KAAA;AAClB,MAAA,IAAI;AACF,QAAA,MAAM,MAAM,MAAM,GAAA,CAAI,KAAA,CAAM,KAAA,CAAM,KAAK,KAAK,CAAA;AAC5C,QAAA,KAAA,CAAM,QAAQ,GAAA,CAAI,KAAA;AAClB,QAAA,KAAA,CAAM,QAAQ,GAAA,CAAI,KAAA;AAAA,MACpB,SAAS,CAAA,EAAG;AACV,QAAA,SAAA,CAAU,KAAA,GAAQ,CAAA;AAClB,QAAA,OAAA,CAAQ,SAAS,CAAC,CAAA;AAClB,QAAA,MAAM,CAAA;AAAA,MACR,CAAA,SAAE;AACA,QAAA,SAAA,CAAU,KAAA,GAAQ,KAAA;AAAA,MACpB;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,MAAA,GAAS,CAAC,IAAA,KAA8B;AAC5C,MAAA,YAAA,CAAa,KAAA,GAAQ,MAAM,KAAA,CAAM,IAAA,CAAK,CAAC,CAAA,KAAM,CAAA,CAAE,IAAA,KAAS,IAAI,CAAA,IAAK,IAAA;AAAA,IACnE,CAAA;AAEA,IAAA,MAAM,MAAA,GAAS,OAAO,OAAA,KAA8C;AAClE,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAMA,QAAA,EAAO;AAC7B,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,CAAI,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO,OAAO,CAAA;AACpC,QAAA,MAAM,KAAA,CAAM,UAAU,KAAK,CAAA;AAAA,MAC7B,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,UAAU,CAAC,CAAA;AACnB,QAAA,MAAM,CAAA;AAAA,MACR;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,MAAA,GAAS,OAAO,IAAA,EAAc,OAAA,KAA8C;AAChF,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAMA,QAAA,EAAO;AAC7B,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,CAAI,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO,MAAM,OAAO,CAAA;AAC1C,QAAA,MAAM,KAAA,CAAM,UAAU,KAAK,CAAA;AAAA,MAC7B,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,UAAU,CAAC,CAAA;AACnB,QAAA,MAAM,CAAA;AAAA,MACR;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,MAAA,GAAS,OAAO,IAAA,EAAc,MAAA,KAAmC;AACrE,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAMA,QAAA,EAAO;AAC7B,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,CAAI,MAAM,KAAA,CAAM,MAAA,CAAO,MAAM,EAAE,QAAA,EAAU,QAAQ,CAAA;AACvD,QAAA,MAAM,KAAA,CAAM,UAAU,KAAK,CAAA;AAAA,MAC7B,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,UAAU,CAAC,CAAA;AACnB,QAAA,MAAM,CAAA;AAAA,MACR;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,MAAA,GAAS,OAAO,IAAA,KAAgC;AACpD,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAMA,QAAA,EAAO;AAC7B,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,CAAI,KAAA,CAAM,KAAA,CAAM,MAAA,CAAO,IAAI,CAAA;AACjC,QAAA,MAAM,KAAA,CAAM,UAAU,KAAK,CAAA;AAAA,MAC7B,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,UAAU,CAAC,CAAA;AACnB,QAAA,MAAM,CAAA;AAAA,MACR;AAAA,IACF,CAAA;AASA,IAAA,MAAM,UAAA,GAAa,OACjB,UAAA,EACA,OAAA,EACA,OAAA,KACgC;AAChC,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAMA,QAAA,EAAO;AAC7B,MAAA,IAAI;AACF,QAAA,OAAO,MAAM,GAAA,CAAI,KAAA,CAAM,MAAM,UAAA,CAAW,UAAA,EAAY,SAAS,OAAO,CAAA;AAAA,MACtE,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,cAAc,CAAC,CAAA;AACvB,QAAA,MAAM,CAAA;AAAA,MACR;AAAA,IACF,CAAA;AAEA,IAAA,OAAO;AAAA;AAAA,MAEL,KAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,YAAA;AAAA;AAAA,MAEA,OAAA;AAAA,MACA,WAAA;AAAA;AAAA,MAEA,MAAA;AAAA,MACA,KAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA;AAAA,EACA;AAAA,IACE,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,CAAC,WAAW,CAAA;AAAA,MAClB,KAAK,iBAAA,CAAkB;AAAA;AACzB;AAEJ;AAIA,SAASA,QAAA,GAAgB;AACvB,EAAA,OAAO,IAAI,MAAM,qDAAqD,CAAA;AACxE;;ACpJO,MAAM,kBAAA,GAAqB,WAAA;AAAA,EAChC,gBAAA;AAAA,EACA,MAAM;AACJ,IAAA,MAAM,GAAA,GAAM,WAA2B,IAAI,CAAA;AAE3C,IAAA,MAAM,KAAA,GAAQ,GAAA,CAAwB,EAAE,CAAA;AACxC,IAAA,MAAM,KAAA,GAAQ,IAAI,CAAC,CAAA;AACnB,IAAA,MAAM,SAAA,GAAY,IAAI,KAAK,CAAA;AAC3B,IAAA,MAAM,SAAA,GAAY,IAAkB,IAAI,CAAA;AACxC,IAAA,MAAM,UAAA,GAAa,GAAA,CAAyB,EAAE,CAAA;AAE9C,IAAA,MAAM,OAAA,GAAU,SAAS,MAAM,CAAC,UAAU,KAAA,IAAS,KAAA,CAAM,KAAA,CAAM,MAAA,KAAW,CAAC,CAAA;AAE3E,IAAA,MAAM,MAAA,GAAS,CAAC,QAAA,KAA4B;AAC1C,MAAA,GAAA,CAAI,KAAA,GAAQ,QAAA;AAAA,IACd,CAAA;AAGA,IAAA,MAAM,OAAA,GAAU,CAAC,MAAA,EAAgB,CAAA,KAAqB;AACpD,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,iBAAA,EAAoB,MAAM,CAAA,QAAA,CAAA,EAAY,CAAC,CAAA;AAAA,IACvD,CAAA;AAEA,IAAA,MAAM,IAAA,GAAO,OAAO,MAAA,GAA8B,EAAC,KAAqB;AACtE,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAMA,QAAA,EAAO;AAC7B,MAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAClB,MAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAClB,MAAA,UAAA,CAAW,KAAA,GAAQ,MAAA;AACnB,MAAA,IAAI;AACF,QAAA,MAAM,MAAM,MAAM,GAAA,CAAI,KAAA,CAAM,UAAA,CAAW,KAAK,MAAM,CAAA;AAClD,QAAA,KAAA,CAAM,QAAQ,GAAA,CAAI,KAAA;AAClB,QAAA,KAAA,CAAM,QAAQ,GAAA,CAAI,KAAA;AAAA,MACpB,SAAS,CAAA,EAAG;AACV,QAAA,SAAA,CAAU,KAAA,GAAQ,CAAA;AAClB,QAAA,OAAA,CAAQ,QAAQ,CAAC,CAAA;AACjB,QAAA,MAAM,CAAA;AAAA,MACR,CAAA,SAAE;AACA,QAAA,SAAA,CAAU,KAAA,GAAQ,KAAA;AAAA,MACpB;AAAA,IACF,CAAA;AAWA,IAAA,MAAM,KAAA,GAAQ,CAAC,QAAA,KAAuC;AACpD,MAAA,IAAI,CAAC,SAAS,MAAA,EAAQ;AACtB,MAAA,MAAM,MAAA,uBAAa,GAAA,EAA8B;AACjD,MAAA,KAAA,MAAW,OAAO,QAAA,EAAU,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,MAAM,GAAG,CAAA;AACpD,MAAA,MAAM,OAA2B,EAAC;AAClC,MAAA,KAAA,MAAW,GAAA,IAAO,MAAM,KAAA,EAAO;AAC7B,QAAA,MAAM,GAAA,GAAM,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,IAAI,CAAA;AAC/B,QAAA,IAAI,GAAA,EAAK;AACP,UAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AACb,UAAA,MAAA,CAAO,MAAA,CAAO,IAAI,IAAI,CAAA;AAAA,QACxB,CAAA,MAAO;AACL,UAAA,IAAA,CAAK,KAAK,GAAG,CAAA;AAAA,QACf;AAAA,MACF;AAEA,MAAA,MAAM,KAAA,GAAQ,SAAS,MAAA,CAAO,CAAC,QAAQ,MAAA,CAAO,GAAA,CAAI,GAAA,CAAI,IAAI,CAAC,CAAA;AAC3D,MAAA,KAAA,CAAM,KAAA,GAAQ,CAAC,GAAG,KAAA,EAAO,GAAG,IAAI,CAAA;AAAA,IAClC,CAAA;AAEA,IAAA,OAAO;AAAA;AAAA,MAEL,KAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA,MACA,UAAA;AAAA;AAAA,MAEA,OAAA;AAAA;AAAA,MAEA,MAAA;AAAA,MACA,IAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA;AAAA,EACA;AAAA,IACE,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,CAAC,YAAY,CAAA;AAAA,MACnB,KAAK,iBAAA,CAAkB;AAAA;AACzB;AAEJ;AAEA,SAASA,QAAA,GAAgB;AACvB,EAAA,OAAO,IAAI,MAAM,0DAA0D,CAAA;AAC7E;;ACnGO,MAAM,gBAAA,GAAmB,WAAA;AAAA,EAC9B,cAAA;AAAA,EACA,MAAM;AACJ,IAAA,MAAM,GAAA,GAAM,WAA2B,IAAI,CAAA;AAE3C,IAAA,MAAM,eAAA,GAAkB,GAAA,CAAc,EAAE,CAAA;AACxC,IAAA,MAAM,SAAA,GAAY,IAAI,KAAK,CAAA;AAC3B,IAAA,MAAM,SAAA,GAAY,IAAkB,IAAI,CAAA;AAExC,IAAA,MAAM,UAAU,QAAA,CAAS,MAAM,eAAA,CAAgB,KAAA,CAAM,WAAW,CAAC,CAAA;AAEjE,IAAA,MAAM,MAAA,GAAS,CAAC,QAAA,KAA4B;AAC1C,MAAA,GAAA,CAAI,KAAA,GAAQ,QAAA;AAAA,IACd,CAAA;AAGA,IAAA,MAAM,OAAA,GAAU,CAAC,MAAA,EAAgB,CAAA,KAAqB;AACpD,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,eAAA,EAAkB,MAAM,CAAA,QAAA,CAAA,EAAY,CAAC,CAAA;AAAA,IACrD,CAAA;AAEA,IAAA,MAAM,cAAc,YAA2B;AAC7C,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAMA,QAAA,EAAO;AAC7B,MAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAClB,MAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAClB,MAAA,IAAI;AACF,QAAA,eAAA,CAAgB,KAAA,GAAQ,MAAM,GAAA,CAAI,KAAA,CAAM,SAAS,kBAAA,EAAmB;AAAA,MACtE,SAAS,CAAA,EAAG;AACV,QAAA,SAAA,CAAU,KAAA,GAAQ,CAAA;AAClB,QAAA,OAAA,CAAQ,eAAe,CAAC,CAAA;AACxB,QAAA,MAAM,CAAA;AAAA,MACR,CAAA,SAAE;AACA,QAAA,SAAA,CAAU,KAAA,GAAQ,KAAA;AAAA,MACpB;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,QAAQ,YAA2B;AACvC,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAMA,QAAA,EAAO;AAC7B,MAAA,IAAI;AACF,QAAA,eAAA,CAAgB,QAAQ,MAAM,GAAA,CAAI,MAAM,QAAA,CAAS,kBAAA,CAAmB,gBAAgB,KAAK,CAAA;AAAA,MAC3F,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,SAAS,CAAC,CAAA;AAClB,QAAA,MAAM,CAAA;AAAA,MACR;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,QAAA,GAAW,OAAO,KAAA,KAAiC;AACvD,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAMA,QAAA,EAAO;AAC7B,MAAA,IAAI,eAAA,CAAgB,KAAA,CAAM,QAAA,CAAS,KAAK,CAAA,EAAG;AAC3C,MAAA,eAAA,CAAgB,KAAA,GAAQ,CAAC,GAAG,eAAA,CAAgB,OAAO,KAAK,CAAA;AACxD,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,EAAM;AAAA,MACd,SAAS,CAAA,EAAG;AAEV,QAAA,eAAA,CAAgB,QAAQ,eAAA,CAAgB,KAAA,CAAM,OAAO,CAAC,CAAA,KAAM,MAAM,KAAK,CAAA;AACvE,QAAA,MAAM,CAAA;AAAA,MACR;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,WAAA,GAAc,OAAO,KAAA,KAAiC;AAC1D,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAMA,QAAA,EAAO;AAC7B,MAAA,MAAM,OAAO,eAAA,CAAgB,KAAA;AAC7B,MAAA,eAAA,CAAgB,QAAQ,eAAA,CAAgB,KAAA,CAAM,OAAO,CAAC,CAAA,KAAM,MAAM,KAAK,CAAA;AACvE,MAAA,IAAI;AACF,QAAA,MAAM,KAAA,EAAM;AAAA,MACd,SAAS,CAAA,EAAG;AAEV,QAAA,eAAA,CAAgB,KAAA,GAAQ,IAAA;AACxB,QAAA,MAAM,CAAA;AAAA,MACR;AAAA,IACF,CAAA;AAEA,IAAA,OAAO;AAAA;AAAA,MAEL,eAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA;AAAA,MAEA,OAAA;AAAA;AAAA,MAEA,MAAA;AAAA,MACA,WAAA;AAAA,MACA,QAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA;AAAA,EACA;AAAA,IACE,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,CAAC,iBAAiB,CAAA;AAAA,MACxB,KAAK,iBAAA,CAAkB;AAAA;AACzB;AAEJ;AAEA,SAASA,QAAA,GAAgB;AACvB,EAAA,OAAO,IAAI,MAAM,wDAAwD,CAAA;AAC3E;;ACrFO,MAAM,WAAA,GAAc,WAAA;AAAA,EACzB,SAAA;AAAA,EACA,MAAM;AACJ,IAAA,MAAM,GAAA,GAAM,WAA2B,IAAI,CAAA;AAE3C,IAAA,MAAM,OAAA,GAAU,GAAA,CAAsB,EAAE,CAAA;AACxC,IAAA,MAAM,SAAA,GAAY,IAAI,KAAK,CAAA;AAC3B,IAAA,MAAM,SAAA,GAAY,IAAkB,IAAI,CAAA;AAExC,IAAA,MAAM,OAAA,GAAU,SAAS,MAAM,CAAC,UAAU,KAAA,IAAS,OAAA,CAAQ,KAAA,CAAM,MAAA,KAAW,CAAC,CAAA;AAE7E,IAAA,MAAM,MAAA,GAAS,CAAC,QAAA,KAA4B;AAC1C,MAAA,GAAA,CAAI,KAAA,GAAQ,QAAA;AAAA,IACd,CAAA;AAEA,IAAA,MAAM,OAAA,GAAU,CAAC,MAAA,EAAgB,CAAA,KAAqB;AACpD,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,UAAA,EAAa,MAAM,CAAA,QAAA,CAAA,EAAY,CAAC,CAAA;AAAA,IAChD,CAAA;AAEA,IAAA,MAAM,eAAe,YAA2B;AAC9C,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAMA,QAAA,EAAO;AAC7B,MAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAClB,MAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAClB,MAAA,IAAI;AACF,QAAA,OAAA,CAAQ,KAAA,GAAQ,MAAM,GAAA,CAAI,KAAA,CAAM,IAAI,WAAA,EAAY;AAAA,MAClD,SAAS,CAAA,EAAG;AACV,QAAA,SAAA,CAAU,KAAA,GAAQ,CAAA;AAClB,QAAA,OAAA,CAAQ,gBAAgB,CAAC,CAAA;AACzB,QAAA,MAAM,CAAA;AAAA,MACR,CAAA,SAAE;AACA,QAAA,SAAA,CAAU,KAAA,GAAQ,KAAA;AAAA,MACpB;AAAA,IACF,CAAA;AAGA,IAAA,MAAM,WAAA,GAAc,OAAO,IAAA,KAA0C;AACnE,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAMA,QAAA,EAAO;AAC7B,MAAA,IAAI;AACF,QAAA,OAAO,MAAM,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,UAAU,IAAI,CAAA;AAAA,MAC3C,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,eAAe,CAAC,CAAA;AACxB,QAAA,MAAM,CAAA;AAAA,MACR;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,MAAA,GAAS,OAAO,OAAA,KAAgD;AACpE,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAMA,QAAA,EAAO;AAC7B,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,YAAA,CAAa,OAAO,CAAA;AACxC,QAAA,MAAM,YAAA,EAAa;AAAA,MACrB,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,UAAU,CAAC,CAAA;AACnB,QAAA,MAAM,CAAA;AAAA,MACR;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,MAAA,GAAS,OAAO,IAAA,EAAc,OAAA,KAAgD;AAClF,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAMA,QAAA,EAAO;AAC7B,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,YAAA,CAAa,MAAM,OAAO,CAAA;AAC9C,QAAA,MAAM,YAAA,EAAa;AAAA,MACrB,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,UAAU,CAAC,CAAA;AACnB,QAAA,MAAM,CAAA;AAAA,MACR;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,MAAA,GAAS,OAAO,IAAA,KAAgC;AACpD,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAMA,QAAA,EAAO;AAC7B,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,YAAA,CAAa,IAAI,CAAA;AACrC,QAAA,OAAA,CAAQ,KAAA,GAAQ,QAAQ,KAAA,CAAM,MAAA,CAAO,CAAC,CAAA,KAAM,CAAA,CAAE,SAAS,IAAI,CAAA;AAAA,MAC7D,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,UAAU,CAAC,CAAA;AACnB,QAAA,MAAM,CAAA;AAAA,MACR;AAAA,IACF,CAAA;AAEA,IAAA,OAAO;AAAA;AAAA,MAEL,OAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA;AAAA,MAEA,OAAA;AAAA;AAAA,MAEA,MAAA;AAAA,MACA,YAAA;AAAA,MACA,WAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA;AAAA,EACA;AAAA,IACE,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,CAAC,SAAS,CAAA;AAAA,MAChB,KAAK,iBAAA,CAAkB;AAAA;AACzB;AAEJ;AAEA,SAASA,QAAA,GAAgB;AACvB,EAAA,OAAO,IAAI,MAAM,mDAAmD,CAAA;AACtE;;ACzGO,MAAM,oBAAA,GAAuB,WAAA;AAAA,EAClC,mBAAA;AAAA,EACA,MAAM;AACJ,IAAA,MAAM,GAAA,GAAM,WAA2B,IAAI,CAAA;AAE3C,IAAA,MAAM,SAAA,GAAY,GAAA,CAAmB,EAAE,CAAA;AACvC,IAAA,MAAM,SAAA,GAAY,IAAI,KAAK,CAAA;AAC3B,IAAA,MAAM,SAAA,GAAY,IAAkB,IAAI,CAAA;AAExC,IAAA,MAAM,OAAA,GAAU,SAAS,MAAM,CAAC,UAAU,KAAA,IAAS,SAAA,CAAU,KAAA,CAAM,MAAA,KAAW,CAAC,CAAA;AAC/E,IAAA,MAAM,cAAc,QAAA,CAAS,MAAM,SAAA,CAAU,KAAA,CAAM,SAAS,CAAC,CAAA;AAE7D,IAAA,MAAM,MAAA,GAAS,CAAC,QAAA,KAA4B;AAC1C,MAAA,GAAA,CAAI,KAAA,GAAQ,QAAA;AAAA,IACd,CAAA;AAEA,IAAA,MAAM,OAAA,GAAU,CAAC,MAAA,EAAgB,CAAA,KAAqB;AACpD,MAAA,OAAA,CAAQ,KAAA,CAAM,CAAA,oBAAA,EAAuB,MAAM,CAAA,QAAA,CAAA,EAAY,CAAC,CAAA;AAAA,IAC1D,CAAA;AAEA,IAAA,MAAM,QAAQ,YAA2B;AACvC,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAM,MAAA,EAAO;AAC7B,MAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAClB,MAAA,SAAA,CAAU,KAAA,GAAQ,IAAA;AAClB,MAAA,IAAI;AACF,QAAA,SAAA,CAAU,KAAA,GAAQ,MAAM,GAAA,CAAI,KAAA,CAAM,IAAI,aAAA,EAAc;AAAA,MACtD,SAAS,CAAA,EAAG;AACV,QAAA,SAAA,CAAU,KAAA,GAAQ,CAAA;AAClB,QAAA,OAAA,CAAQ,SAAS,CAAC,CAAA;AAClB,QAAA,MAAM,CAAA;AAAA,MACR,CAAA,SAAE;AACA,QAAA,SAAA,CAAU,KAAA,GAAQ,KAAA;AAAA,MACpB;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,QAAA,GAAW,OAAO,OAAA,KAAqD;AAC3E,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAM,MAAA,EAAO;AAC7B,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,gBAAA,CAAiB,OAAO,CAAA;AAC5C,QAAA,MAAM,KAAA,EAAM;AAAA,MACd,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,YAAY,CAAC,CAAA;AACrB,QAAA,MAAM,CAAA;AAAA,MACR;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,MAAA,GAAS,OAAO,IAAA,EAAc,OAAA,KAAqD;AACvF,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAM,MAAA,EAAO;AAC7B,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,cAAA,CAAe,MAAM,OAAO,CAAA;AAChD,QAAA,MAAM,KAAA,EAAM;AAAA,MACd,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,UAAU,CAAC,CAAA;AACnB,QAAA,MAAM,CAAA;AAAA,MACR;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,MAAA,GAAS,OAAO,IAAA,KAAgC;AACpD,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAM,MAAA,EAAO;AAC7B,MAAA,IAAI;AACF,QAAA,MAAM,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,cAAA,CAAe,IAAI,CAAA;AACvC,QAAA,MAAM,KAAA,EAAM;AAAA,MACd,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,UAAU,CAAC,CAAA;AACnB,QAAA,MAAM,CAAA;AAAA,MACR;AAAA,IACF,CAAA;AAGA,IAAA,MAAM,MAAA,GAAS,OAAO,IAAA,KAAqD;AACzE,MAAA,IAAI,CAAC,GAAA,CAAI,KAAA,EAAO,MAAM,MAAA,EAAO;AAC7B,MAAA,IAAI;AACF,QAAA,OAAO,MAAM,GAAA,CAAI,KAAA,CAAM,GAAA,CAAI,mBAAmB,IAAI,CAAA;AAAA,MACpD,SAAS,CAAA,EAAG;AACV,QAAA,OAAA,CAAQ,UAAU,CAAC,CAAA;AACnB,QAAA,MAAM,CAAA;AAAA,MACR;AAAA,IACF,CAAA;AAEA,IAAA,OAAO;AAAA;AAAA,MAEL,SAAA;AAAA,MACA,SAAA;AAAA,MACA,SAAA;AAAA;AAAA,MAEA,OAAA;AAAA,MACA,WAAA;AAAA;AAAA,MAEA,MAAA;AAAA,MACA,KAAA;AAAA,MACA,QAAA;AAAA,MACA,MAAA;AAAA,MACA,MAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA;AAAA,EACA;AAAA,IACE,OAAA,EAAS;AAAA,MACP,IAAA,EAAM,CAAC,WAAW,CAAA;AAAA,MAClB,KAAK,iBAAA,CAAkB;AAAA;AACzB;AAEJ;AAEA,SAAS,MAAA,GAAgB;AACvB,EAAA,OAAO,IAAI,MAAM,6DAA6D,CAAA;AAChF;;ACvGO,MAAM,UAAA,GAAa,WAAA;AAAA,EACxB,QAAA;AAAA,EACA,MAAM;AACJ,IAAA,MAAM,GAAA,GAAM,WAA2B,IAAI,CAAA;AAC3C,IAAA,MAAM,MAAA,GAAS,WAA6B,IAAI,CAAA;AAEhD,IAAA,MAAM,eAAA,GAAkB,GAAA,CAAuB,mBAAA,CAAoB,IAAI,CAAA;AACvE,IAAA,MAAM,WAAA,GAAc,IAAmB,IAAI,CAAA;AAC3C,IAAA,MAAM,UAAA,GAAa,GAAA,iBAAiB,IAAI,GAAA,EAAK,CAAA;AAE7C,IAAA,MAAM,SAAS,QAAA,CAAS,MAAM,eAAA,CAAgB,KAAA,KAAU,oBAAoB,IAAI,CAAA;AAChF,IAAA,MAAM,OAAA,GAAU,QAAA;AAAA,MACd,MACE,eAAA,CAAgB,KAAA,KAAU,oBAAoB,IAAA,IAC9C,eAAA,CAAgB,UAAU,mBAAA,CAAoB;AAAA,KAClD;AAEA,IAAA,MAAM,MAAA,GAAS,CAAC,QAAA,KAA4B;AAC1C,MAAA,GAAA,CAAI,KAAA,GAAQ,QAAA;AACZ,MAAA,MAAM,KAAK,QAAA,CAAS,EAAA;AACpB,MAAA,MAAA,CAAO,KAAA,GAAQ,EAAA;AACf,MAAA,IAAI,CAAC,EAAA,EAAI;AAET,MAAA,EAAA,CAAG,OAAA,CAAQ,CAAC,CAAA,KAAM;AAChB,QAAA,eAAA,CAAgB,KAAA,GAAQ,CAAA;AAAA,MAC1B,CAAC,CAAA;AACD,MAAA,EAAA,CAAG,OAAA,CAAQ,CAAC,CAAA,KAAgB;AAC1B,QAAA,WAAA,CAAY,QAAQ,CAAA,CAAE,EAAA,IAAA,iBAAM,IAAI,IAAA,IAAO,WAAA,EAAY;AAAA,MACrD,CAAC,CAAA;AAAA,IACH,CAAA;AAEA,IAAA,MAAM,OAAO,MAAY;AACvB,MAAA,MAAA,CAAO,OAAO,IAAA,EAAK;AAAA,IACrB,CAAA;AAQA,IAAA,MAAM,SAAS,MAAY;AACzB,MAAA,MAAA,CAAO,OAAO,MAAA,EAAO;AAAA,IACvB,CAAA;AAEA,IAAA,MAAM,KAAA,GAAQ,CAAC,MAAA,KAA0B;AACvC,MAAA,MAAA,CAAO,KAAA,EAAO,MAAM,MAAM,CAAA;AAAA,IAC5B,CAAA;AAEA,IAAA,MAAM,SAAA,GAAY,CAAC,MAAA,KAA2B;AAC5C,MAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACnB,MAAA,MAAA,CAAO,KAAA,CAAM,UAAU,MAAM,CAAA;AAC7B,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,UAAA,CAAW,KAAK,CAAA;AACrC,MAAA,KAAA,MAAW,CAAA,IAAK,MAAA,EAAQ,IAAA,CAAK,GAAA,CAAI,CAAC,CAAA;AAClC,MAAA,UAAA,CAAW,KAAA,GAAQ,IAAA;AAAA,IACrB,CAAA;AAEA,IAAA,MAAM,WAAA,GAAc,CAAC,MAAA,KAA2B;AAC9C,MAAA,IAAI,CAAC,OAAO,KAAA,EAAO;AACnB,MAAA,MAAA,CAAO,KAAA,CAAM,YAAY,MAAM,CAAA;AAC/B,MAAA,MAAM,IAAA,GAAO,IAAI,GAAA,CAAI,UAAA,CAAW,KAAK,CAAA;AACrC,MAAA,KAAA,MAAW,CAAA,IAAK,MAAA,EAAQ,IAAA,CAAK,MAAA,CAAO,CAAC,CAAA;AACrC,MAAA,UAAA,CAAW,KAAA,GAAQ,IAAA;AAAA,IACrB,CAAA;AAEA,IAAA,MAAM,iBAAiB,MAAY;AACjC,MAAA,MAAA,CAAO,OAAO,cAAA,EAAe;AAC7B,MAAA,UAAA,CAAW,KAAA,uBAAY,GAAA,EAAI;AAAA,IAC7B,CAAA;AAEA,IAAA,MAAM,YAAA,GAAe,CACnB,WAAA,EACA,MAAA,EACA,MAAA,KACkB;AAClB,MAAA,IAAI,CAAC,MAAA,CAAO,KAAA,EAAO,OAAO,IAAA;AAC1B,MAAA,OAAO,MAAA,CAAO,KAAA,CAAM,YAAA,CAAa,WAAA,EAAa,QAAQ,MAAM,CAAA;AAAA,IAC9D,CAAA;AAEA,IAAA,MAAM,WAAA,GAAc,CAAC,SAAA,KAA4B;AAC/C,MAAA,MAAA,CAAO,KAAA,EAAO,YAAY,SAAS,CAAA;AAAA,IACrC,CAAA;AAEA,IAAA,OAAO;AAAA;AAAA,MAEL,eAAA;AAAA,MACA,WAAA;AAAA,MACA,UAAA;AAAA;AAAA,MAEA,MAAA;AAAA,MACA,OAAA;AAAA;AAAA,MAEA,MAAA;AAAA,MACA,IAAA;AAAA,MACA,MAAA;AAAA,MACA,KAAA;AAAA,MACA,SAAA;AAAA,MACA,WAAA;AAAA,MACA,cAAA;AAAA,MACA,YAAA;AAAA,MACA;AAAA,KACF;AAAA,EACF,CAAA;AAAA,EACA;AAAA;AAAA,IAEE,OAAA,EAAS;AAAA;AAEb;;ACzEO,SAAS,oBAAoB,OAAA,EAAmD;AACrF,EAAA,MAAM,EAAE,OAAA,EAAS,YAAA,EAAc,MAAM,KAAA,EAAO,UAAA,GAAa,KAAI,GAAI,OAAA;AAEjE,EAAA,OAAO,CAAC,GAAA,KAA4B;AAClC,IAAA,MAAM,OAAA,GAAW,IAAI,OAAA,EAA8D,OAAA;AACnF,IAAA,IAAI,CAAC,OAAA,EAAS;AAEd,IAAA,MAAM,EAAE,GAAA,EAAK,IAAA,EAAK,GAAI,OAAA;AACtB,IAAA,MAAM,SAA+C,EAAE,GAAI,OAAA,CAAQ,MAAA,IAAU,EAAC,EAAG;AAEjF,IAAA,IAAI,IAAA,EAAA;AAAM,MAAA,KAAA,MAAW,CAAA,IAAK,MAAM,IAAI,EAAE,KAAK,MAAA,CAAA,EAAS,MAAA,CAAO,CAAC,CAAA,GAAI,EAAC;AAAA,IAAA;AACjE,IAAA,MAAM,UAAA,GAAa,MAAA,CAAO,IAAA,CAAK,MAAM,CAAA;AACrC,IAAA,IAAI,UAAA,CAAW,WAAW,CAAA,EAAG;AAE7B,IAAA,MAAM,UAAU,MAAY;AAC1B,MAAA,KAAA,MAAW,SAAS,UAAA,EAAY;AAC9B,QAAA,IAAI,GAAA,GAAqB,IAAA;AACzB,QAAA,IAAI;AACF,UAAA,GAAA,GAAM,QAAQ,OAAA,CAAQ,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,KAAK,CAAA,CAAE,CAAA;AAAA,QACzC,CAAA,CAAA,MAAQ;AACN,UAAA;AAAA,QACF;AACA,QAAA,IAAI,CAAC,GAAA,EAAK;AACV,QAAA,IAAI;AACF,UAAA,MAAM,MAAA,GAAS,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC7B,UAAA,GAAA,CAAI,KAAA,CAAM,MAAA,CAAO,CAAC,KAAA,KAAU;AAC1B,YAAC,KAAA,CAAkC,KAAK,CAAA,GAAI,MAAA;AAAA,UAC9C,CAAC,CAAA;AAAA,QACH,CAAA,CAAA,MAAQ;AAAA,QAER;AAAA,MACF;AAAA,IACF,CAAA;AAEA,IAAA,MAAM,QAAQ,MAAY;AACxB,MAAA,MAAM,KAAA,GAAQ,IAAI,KAAA,CAAM,MAAA;AACxB,MAAA,KAAA,MAAW,SAAS,UAAA,EAAY;AAC9B,QAAA,MAAM,SAAA,GAAY,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,KAAK,CAAA,CAAA;AACjC,QAAA,MAAM,QAAA,GAAW,MAAA,CAAO,KAAK,CAAA,EAAG,QAAA,KAAa,IAAA;AAC7C,QAAA,MAAM,KAAA,GAAQ,MAAM,KAAK,CAAA;AAEzB,QAAA,IAAI,KAAA,KAAU,MAAA,IAAa,KAAA,KAAU,IAAA,EAAM;AACzC,UAAA,IAAI,GAAA,EAAK;AACP,YAAA,OAAA,CAAQ,UAAA,CAAW,SAAA,EAAW,EAAE,QAAA,EAAU,CAAA;AAAA,UAC5C,WAAW,QAAA,EAAU;AACnB,YAAA,KAAK,cAAA,CAAe,YAAA,EAAc,SAAA,EAAW,IAAI,CAAA;AAAA,UACnD,CAAA,MAAO;AACL,YAAA,OAAA,CAAQ,UAAA,CAAW,SAAA,EAAW,EAAE,QAAA,EAAU,OAAO,CAAA;AAAA,UACnD;AACA,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,UAAA;AACJ,QAAA,IAAI;AACF,UAAA,UAAA,GAAa,IAAA,CAAK,UAAU,KAAK,CAAA;AAAA,QACnC,CAAA,CAAA,MAAQ;AACN,UAAA;AAAA,QACF;AAEA,QAAA,IAAI,GAAA,EAAK;AACP,UAAA,OAAA,CAAQ,OAAA,CAAQ,SAAA,EAAW,UAAA,EAAY,EAAE,UAAU,CAAA;AAAA,QACrD,WAAW,QAAA,EAAU;AACnB,UAAA,KAAK,cAAA,CAAe,YAAA,EAAc,SAAA,EAAW,UAAU,CAAA;AAAA,QACzD,CAAA,MAAO;AACL,UAAA,OAAA,CAAQ,QAAQ,SAAA,EAAW,UAAA,EAAY,EAAE,QAAA,EAAU,OAAO,CAAA;AAAA,QAC5D;AAAA,MACF;AAAA,IACF,CAAA;AAEA,IAAA,OAAA,EAAQ;AAER,IAAA,IAAI,KAAA,GAA8C,IAAA;AAClD,IAAA,GAAA,CAAI,KAAA,CAAM,UAAA;AAAA,MACR,MAAM;AACJ,QAAA,IAAI,GAAA,IAAO,cAAc,CAAA,EAAG;AAC1B,UAAA,KAAA,EAAM;AACN,UAAA;AAAA,QACF;AACA,QAAA,IAAI,KAAA,eAAoB,KAAK,CAAA;AAC7B,QAAA,KAAA,GAAQ,UAAA,CAAW,OAAO,UAAU,CAAA;AAAA,MACtC,CAAA;AAAA,MACA,EAAE,OAAO,MAAA;AAAO,KAClB;AAAA,EACF,CAAA;AACF;AAGA,eAAe,cAAA,CACb,QAAA,EACA,GAAA,EACA,KAAA,EACe;AACf,EAAA,IAAI,CAAC,QAAA,EAAU;AACf,EAAA,IAAI;AACF,IAAA,MAAM,MAAM,QAAA,EAAU;AAAA,MACpB,MAAA,EAAQ,MAAA;AAAA,MACR,OAAA,EAAS,EAAE,cAAA,EAAgB,kBAAA,EAAmB;AAAA,MAC9C,MAAM,IAAA,CAAK,SAAA,CAAU,EAAE,GAAA,EAAK,OAAO,CAAA;AAAA,MACnC,WAAA,EAAa;AAAA,KACd,CAAA;AAAA,EACH,CAAA,CAAA,MAAQ;AAAA,EAER;AACF;;ACrJO,MAAM,qBAAA,GAAwB;AAG9B,MAAM,oBAAA,GAAuB;AAAA;AAAA,EAElC,KAAA,EAAO,0BAAA;AAAA;AAAA,EAEP,eAAA,EAAiB,oCAAA;AAAA;AAAA,EAEjB,KAAA,EAAO,0BAAA;AAAA;AAAA,EAEP,MAAA,EAAQ;AACV;AAGO,SAAS,eAAA,GAA0B;AACxC,EAAA,OAAO,OAAO,YAAA,KAAiB,WAAA,GAC1B,aAAa,OAAA,CAAQ,qBAAqB,KAAK,EAAA,GAChD,EAAA;AACN;AAGO,SAAS,gBAAA,GAAyB;AACvC,EAAA,IAAI,OAAO,YAAA,KAAiB,WAAA,EAAa,YAAA,CAAa,WAAW,qBAAqB,CAAA;AACxF;;ACLA,MAAM,WAAA,GAAc,CAAC,KAAA,KAAmC;AACtD,EAAA,MAAM,IAAI,OAAO,KAAA,KAAU,QAAA,GAAW,MAAA,CAAO,KAAK,CAAA,GAAI,KAAA;AACtD,EAAA,OAAO,KAAK,IAAA,CAAK,CAAC,CAAA,GAAI,CAAA,CAAA,EAAI,CAAC,CAAA,CAAA,CAAA,GAAM,CAAA;AACnC,CAAA;AAEA,MAAM,kBAAA,GAAqB,CAAC,SAAA,KAA8C;AACxE,EAAA,MAAM,EAAE,EAAA,EAAI,KAAA,EAAM,GAAI,SAAA;AAGtB,EAAA,IAAI,OAAO,UAAU,QAAA,IAAY,OAAO,UAAU,QAAA,EAAU,OAAO,YAAY,KAAK,CAAA;AACpF,EAAA,IAAI,OAAO,IAAA,EAAM;AACf,IAAA,MAAM,IAAI,KAAA;AAAA,MACR,CAAA,oEAAA,EAAuE,EAAE,CAAA,MAAA,EAAS,SAAA,CAAU,KAAK,CAAA,EAAA;AAAA,KACnG;AAAA,EACF;AACA,EAAA,IAAI,KAAA,CAAM,WAAW,CAAA,EAAG;AACtB,IAAA,MAAM,IAAI,KAAA,CAAM,CAAA,gCAAA,EAAmC,SAAA,CAAU,KAAK,CAAA,yBAAA,CAA2B,CAAA;AAAA,EAC/F;AACA,EAAA,OAAO,KAAA,CAAM,GAAA,CAAI,WAAW,CAAA,CAAE,KAAK,GAAG,CAAA;AACxC,CAAA;AAwBO,MAAM,WAAA,GAAc,CAAC,UAAA,KAAsE;AAChG,EAAA,IAAI,UAAA,CAAW,MAAA,KAAW,CAAA,EAAG,OAAO,MAAA;AACpC,EAAA,OAAO,WAAW,GAAA,CAAI,CAAC,CAAA,KAAM,CAAA,EAAG,EAAE,KAAK,CAAA,CAAA,EAAI,CAAA,CAAE,EAAE,IAAI,kBAAA,CAAmB,CAAC,CAAC,CAAA,CAAE,CAAA,CAAE,KAAK,OAAO,CAAA;AAC1F;;;;"}
|