@opengroundplan/core 0.1.1 → 0.2.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/README.md +1 -1
- package/dist/agent-runtime.d.ts +81 -0
- package/dist/agent-runtime.js +108 -0
- package/dist/agent-runtime.js.map +1 -0
- package/dist/analysis.d.ts +36 -0
- package/dist/analysis.js +106 -0
- package/dist/analysis.js.map +1 -0
- package/dist/analyze.d.ts +26 -0
- package/dist/analyze.js +155 -0
- package/dist/analyze.js.map +1 -0
- package/dist/assessment.d.ts +39 -0
- package/dist/assessment.js +81 -0
- package/dist/assessment.js.map +1 -0
- package/dist/autoplan.d.ts +60 -0
- package/dist/autoplan.js +219 -0
- package/dist/autoplan.js.map +1 -0
- package/dist/blueprint.d.ts +102 -0
- package/dist/blueprint.js +490 -0
- package/dist/blueprint.js.map +1 -0
- package/dist/config.d.ts +11 -0
- package/dist/config.js +18 -0
- package/dist/config.js.map +1 -1
- package/dist/graph.d.ts +20 -0
- package/dist/graph.js +84 -0
- package/dist/graph.js.map +1 -0
- package/dist/improve.d.ts +20 -0
- package/dist/improve.js +50 -0
- package/dist/improve.js.map +1 -0
- package/dist/index.d.ts +15 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -1
- package/dist/infer-llm.d.ts +29 -0
- package/dist/infer-llm.js +114 -0
- package/dist/infer-llm.js.map +1 -0
- package/dist/intent.js +24 -1
- package/dist/intent.js.map +1 -1
- package/dist/knowledge.d.ts +23 -0
- package/dist/knowledge.js +61 -0
- package/dist/knowledge.js.map +1 -0
- package/dist/library.d.ts +25 -0
- package/dist/library.js +89 -0
- package/dist/library.js.map +1 -0
- package/dist/loader.js +23 -5
- package/dist/loader.js.map +1 -1
- package/dist/pipeline.d.ts +25 -0
- package/dist/pipeline.js +37 -0
- package/dist/pipeline.js.map +1 -0
- package/dist/schema.d.ts +113 -113
- package/dist/simulate.d.ts +15 -0
- package/dist/simulate.js +89 -0
- package/dist/simulate.js.map +1 -0
- package/dist/variables.d.ts +7 -0
- package/dist/variables.js +37 -0
- package/dist/variables.js.map +1 -0
- package/dist/verification.d.ts +23 -0
- package/dist/verification.js +61 -0
- package/dist/verification.js.map +1 -0
- package/package.json +7 -4
- package/templates/bases/fastapi-service/blueprint.yaml +2 -3
- package/templates/layers/auth-jwt/blueprint.yaml +3 -0
- package/templates/layers/auth-oidc/blueprint.yaml +1 -0
- package/templates/layers/db-mongo/blueprint.yaml +1 -0
- package/templates/layers/db-postgres/blueprint.yaml +3 -0
- package/templates/layers/db-sqlite/blueprint.yaml +1 -0
package/dist/library.js
ADDED
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
export const INDUSTRY_BLUEPRINTS = [
|
|
2
|
+
{
|
|
3
|
+
id: 'saas',
|
|
4
|
+
name: 'SaaS platform',
|
|
5
|
+
keywords: ['saas', 'multi-tenant', 'subscription', 'b2b', 'workspace', 'seats'],
|
|
6
|
+
recommends: ['authentication', 'authorization', 'multi-tenancy', 'billing & subscriptions', 'audit logging', 'observability', 'usage metering'],
|
|
7
|
+
dna: { security: 'elevated', compliance: 'none', scale: 'growing' },
|
|
8
|
+
patterns: ['Tenant isolation at the data layer', 'Feature flags per plan', 'Async webhooks for integrations'],
|
|
9
|
+
antiPatterns: ['Shared mutable global state across tenants', 'Building billing from scratch'],
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
id: 'marketplace',
|
|
13
|
+
name: 'Marketplace',
|
|
14
|
+
keywords: ['marketplace', 'buyers', 'sellers', 'listings', 'two-sided', 'vendors', 'handmade'],
|
|
15
|
+
recommends: ['authentication', 'listings & search', 'payments & payouts (escrow)', 'reviews & ratings', 'audit logging', 'fraud/abuse controls', 'notifications'],
|
|
16
|
+
dna: { security: 'elevated', compliance: 'none', scale: 'growing' },
|
|
17
|
+
patterns: ['Escrow / delayed payout', 'Idempotent payment webhooks', 'Search separate from the transactional store'],
|
|
18
|
+
antiPatterns: ['Synchronous payment in the request path', 'One table for buyers and sellers with a role flag only'],
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
id: 'ecommerce',
|
|
22
|
+
name: 'E-commerce',
|
|
23
|
+
keywords: ['e-commerce', 'ecommerce', 'store', 'storefront', 'cart', 'checkout', 'catalog', 'shop'],
|
|
24
|
+
recommends: ['catalog & inventory', 'cart & checkout', 'payments', 'order management', 'search', 'caching', 'observability'],
|
|
25
|
+
dna: { security: 'elevated', compliance: 'none', scale: 'growing' },
|
|
26
|
+
patterns: ['Inventory reservation on checkout', 'CDN + cache for the catalog', 'Idempotent order creation'],
|
|
27
|
+
antiPatterns: ['Overselling from unlocked inventory', 'Storing card data yourself'],
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
id: 'fintech',
|
|
31
|
+
name: 'Fintech',
|
|
32
|
+
keywords: ['fintech', 'banking', 'payments', 'wallet', 'lending', 'trading', 'ledger', 'financial'],
|
|
33
|
+
recommends: ['strong authentication', 'authorization', 'double-entry ledger', 'audit logging (immutable)', 'idempotency', 'observability', 'reconciliation'],
|
|
34
|
+
dna: { security: 'elevated', compliance: 'regulated', scale: 'growing' },
|
|
35
|
+
patterns: ['Immutable append-only ledger', 'Idempotency keys on every mutation', 'Segregation of duties'],
|
|
36
|
+
antiPatterns: ['Floating-point money', 'Mutable transaction history', 'PII/secrets in logs'],
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
id: 'healthcare',
|
|
40
|
+
name: 'Healthcare',
|
|
41
|
+
keywords: ['healthcare', 'medical', 'hipaa', 'patient', 'clinical', 'ehr', 'telehealth'],
|
|
42
|
+
recommends: ['authentication', 'fine-grained authorization', 'audit logging', 'encryption at rest & in transit', 'data retention controls', 'observability'],
|
|
43
|
+
dna: { security: 'elevated', compliance: 'regulated', scale: 'growing' },
|
|
44
|
+
patterns: ['Minimum-necessary access (RBAC/ABAC)', 'Full audit trail of PHI access', 'Encrypted, region-pinned storage'],
|
|
45
|
+
antiPatterns: ['PHI in analytics or logs', 'Broad service accounts'],
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
id: 'ai-platform',
|
|
49
|
+
name: 'AI application',
|
|
50
|
+
keywords: ['ai', 'llm', 'agent', 'chatbot', 'rag', 'copilot', 'recommendation', 'ml'],
|
|
51
|
+
recommends: ['LLM provider integration', 'evals & quality tracking', 'observability/tracing', 'prompt & cost controls', 'caching', 'rate limiting'],
|
|
52
|
+
dna: { security: 'standard', compliance: 'none', scale: 'growing' },
|
|
53
|
+
patterns: ['Provider abstraction (swap models by role)', 'Golden-set evals in CI', 'Token & cost budgets per request'],
|
|
54
|
+
antiPatterns: ['A hardcoded model id at the call site', 'No eval harness', 'Unbounded context growth'],
|
|
55
|
+
},
|
|
56
|
+
{
|
|
57
|
+
id: 'social',
|
|
58
|
+
name: 'Social network',
|
|
59
|
+
keywords: ['social', 'feed', 'followers', 'posts', 'community', 'messaging', 'timeline'],
|
|
60
|
+
recommends: ['authentication', 'feed/timeline service', 'caching', 'queue/fan-out', 'moderation', 'observability', 'notifications'],
|
|
61
|
+
dna: { security: 'standard', compliance: 'none', scale: 'large' },
|
|
62
|
+
patterns: ['Fan-out on write for feeds', 'Aggressive caching', 'Async moderation pipeline'],
|
|
63
|
+
antiPatterns: ['Fan-out on read at scale', 'Synchronous notification delivery'],
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
id: 'booking',
|
|
67
|
+
name: 'Booking / scheduling',
|
|
68
|
+
keywords: ['booking', 'reservation', 'scheduling', 'appointments', 'calendar', 'availability'],
|
|
69
|
+
recommends: ['authentication', 'availability & inventory', 'payments', 'notifications', 'audit logging', 'idempotency'],
|
|
70
|
+
dna: { security: 'standard', compliance: 'none', scale: 'growing' },
|
|
71
|
+
patterns: ['Overbooking guards with locks/reservations', 'Idempotent booking creation', 'Reminders via a queue'],
|
|
72
|
+
antiPatterns: ['Double-booking from race conditions', 'Synchronous reminder sending'],
|
|
73
|
+
},
|
|
74
|
+
];
|
|
75
|
+
/** Match an idea to the best-fitting industry blueprint, or null when nothing scores. */
|
|
76
|
+
export function matchIndustry(idea) {
|
|
77
|
+
const text = idea.toLowerCase();
|
|
78
|
+
let best = null;
|
|
79
|
+
let bestScore = 0;
|
|
80
|
+
for (const bp of INDUSTRY_BLUEPRINTS) {
|
|
81
|
+
const score = bp.keywords.filter((k) => text.includes(k)).length;
|
|
82
|
+
if (score > bestScore) {
|
|
83
|
+
best = bp;
|
|
84
|
+
bestScore = score;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return best;
|
|
88
|
+
}
|
|
89
|
+
//# sourceMappingURL=library.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"library.js","sourceRoot":"","sources":["../src/library.ts"],"names":[],"mappings":"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"}
|
package/dist/loader.js
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
* rather than surfacing as a confusing error mid-generation.
|
|
5
5
|
*/
|
|
6
6
|
import fs from 'node:fs/promises';
|
|
7
|
+
import fsSync from 'node:fs';
|
|
7
8
|
import path from 'node:path';
|
|
8
9
|
import { glob } from 'glob';
|
|
9
10
|
import YAML from 'yaml';
|
|
@@ -26,6 +27,18 @@ async function loadAll(pattern, cwd, schema) {
|
|
|
26
27
|
const files = await glob(pattern, { cwd, absolute: true });
|
|
27
28
|
return Promise.all(files.sort().map((file) => loadYaml(file, schema)));
|
|
28
29
|
}
|
|
30
|
+
/**
|
|
31
|
+
* Load a pattern from the core directory and every plugin that ships the same subdir, then
|
|
32
|
+
* concatenate — `index` catches a plugin that redefines a core id, so a plugin extends the
|
|
33
|
+
* catalog but can never silently replace it. Plugins (`GROUNDPLAN_PLUGINS`) may add architectures,
|
|
34
|
+
* adapters, and registry items; template blueprints stay core-only for now (the plan path resolves
|
|
35
|
+
* files from a single root).
|
|
36
|
+
*/
|
|
37
|
+
async function loadWithPlugins(pattern, subdir, coreDir, pluginRoots, schema) {
|
|
38
|
+
const dirs = [coreDir, ...pluginRoots.map((root) => path.join(root, subdir))].filter((dir) => fsSync.existsSync(dir));
|
|
39
|
+
const loaded = await Promise.all(dirs.map((dir) => loadAll(pattern, dir, schema)));
|
|
40
|
+
return loaded.flat();
|
|
41
|
+
}
|
|
29
42
|
/**
|
|
30
43
|
* Body filename per kind. A hook has none: it is a pair of scripts an adapter registers by
|
|
31
44
|
* path, never markdown an adapter inlines, so requiring one would reject a valid item.
|
|
@@ -42,8 +55,11 @@ const BODY_FILES = {
|
|
|
42
55
|
* shape their tool expects, so an item whose body never loaded emits an empty rule file. It
|
|
43
56
|
* was never loaded at all until now, which is why the whole adapter layer produced nothing.
|
|
44
57
|
*/
|
|
45
|
-
async function loadRegistry(
|
|
46
|
-
const
|
|
58
|
+
async function loadRegistry(dirs) {
|
|
59
|
+
const present = dirs.filter((dir) => fsSync.existsSync(dir));
|
|
60
|
+
const files = (await Promise.all(present.map((cwd) => glob('*/*/*.yaml', { cwd, absolute: true }))))
|
|
61
|
+
.flat()
|
|
62
|
+
.sort();
|
|
47
63
|
return Promise.all(files.map(async (file) => {
|
|
48
64
|
const item = await loadYaml(file, RegistryItem);
|
|
49
65
|
const dir = path.dirname(file);
|
|
@@ -59,11 +75,13 @@ async function loadRegistry(cwd) {
|
|
|
59
75
|
}));
|
|
60
76
|
}
|
|
61
77
|
export async function loadCatalog(config) {
|
|
78
|
+
const plugins = config.pluginRoots;
|
|
62
79
|
const [architectures, blueprints, adapters, registry] = await Promise.all([
|
|
63
|
-
|
|
80
|
+
loadWithPlugins('architectures/*.yaml', config.catalogDir, config.paths.catalog, plugins, ArchitectureEntry),
|
|
81
|
+
// Template blueprints stay core-only: the plan path resolves files from a single root.
|
|
64
82
|
loadAll('*/*/blueprint.yaml', config.paths.templates, Blueprint),
|
|
65
|
-
|
|
66
|
-
loadRegistry(config.paths.registry),
|
|
83
|
+
loadWithPlugins('*/adapter.yaml', config.adaptersDir, config.paths.adapters, plugins, Adapter),
|
|
84
|
+
loadRegistry([config.paths.registry, ...plugins.map((root) => path.join(root, config.registryDir))]),
|
|
67
85
|
]);
|
|
68
86
|
const catalog = {
|
|
69
87
|
architectures: index(architectures),
|
package/dist/loader.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAC5B,OAAO,IAAI,MAAM,MAAM,CAAC;AAExB,OAAO,EAAE,OAAO,EAAE,iBAAiB,EAAE,SAAS,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAGrG,MAAM,OAAO,SAAU,SAAQ,KAAK;IAClC,YAAY,IAAY,EAAE,MAAc;QACtC,KAAK,CAAC,WAAW,IAAI,KAAK,MAAM,EAAE,CAAC,CAAC;IACtC,CAAC;CACF;AAED,KAAK,UAAU,QAAQ,CAAyB,IAAY,EAAE,MAAS;IACrE,MAAM,GAAG,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACjD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,QAAQ,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACjG,MAAM,IAAI,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/C,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC;AAED,KAAK,UAAU,OAAO,CACpB,OAAe,EACf,GAAW,EACX,MAAS;IAET,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3D,OAAO,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;AACzE,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,GAA6B;IAC3C,KAAK,EAAE,CAAC,UAAU,CAAC;IACnB,OAAO,EAAE,CAAC,YAAY,CAAC;IACvB,KAAK,EAAE,CAAC,UAAU,CAAC;IACnB,IAAI,EAAE,EAAE;CACT,CAAC;AAEF;;;;;GAKG;AACH,KAAK,UAAU,YAAY,CAAC,
|
|
1
|
+
{"version":3,"file":"loader.js","sourceRoot":"","sources":["../src/loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one place a project idea becomes a selection. Every command — `new`, `blueprint`, and
|
|
3
|
+
* whatever consumes them next — runs the same inference here: the model (when configured)
|
|
4
|
+
* proposes catalog-constrained overrides, explicit overrides always win, and the deterministic
|
|
5
|
+
* planner fills the rest. Centralising it is what keeps the reasoning single-sourced; the model
|
|
6
|
+
* override mapping used to be copy-pasted in two commands.
|
|
7
|
+
*/
|
|
8
|
+
import { type AutoOverrides, type AutoSelection } from './autoplan.js';
|
|
9
|
+
import type { Catalog } from './loader.js';
|
|
10
|
+
import type { GroundplanConfig } from './config.js';
|
|
11
|
+
export interface Inference {
|
|
12
|
+
selection: AutoSelection;
|
|
13
|
+
/** Capabilities the brief needs that no catalog entry covers. */
|
|
14
|
+
gaps: string[];
|
|
15
|
+
/** The model + flag overrides that produced the selection — reuse for interactive re-runs. */
|
|
16
|
+
baseOverrides: AutoOverrides;
|
|
17
|
+
/** True when a model shaped the selection, false for the pure deterministic path. */
|
|
18
|
+
viaModel: boolean;
|
|
19
|
+
}
|
|
20
|
+
export interface InferOptions {
|
|
21
|
+
overrides?: AutoOverrides;
|
|
22
|
+
/** Set false to force the offline deterministic path even when a model is configured. */
|
|
23
|
+
useModel?: boolean;
|
|
24
|
+
}
|
|
25
|
+
export declare function inferSelection(idea: string, catalog: Catalog, config: GroundplanConfig, opts?: InferOptions): Promise<Inference>;
|
package/dist/pipeline.js
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The one place a project idea becomes a selection. Every command — `new`, `blueprint`, and
|
|
3
|
+
* whatever consumes them next — runs the same inference here: the model (when configured)
|
|
4
|
+
* proposes catalog-constrained overrides, explicit overrides always win, and the deterministic
|
|
5
|
+
* planner fills the rest. Centralising it is what keeps the reasoning single-sourced; the model
|
|
6
|
+
* override mapping used to be copy-pasted in two commands.
|
|
7
|
+
*/
|
|
8
|
+
import { autoSelect } from './autoplan.js';
|
|
9
|
+
import { inferWithModel } from './infer-llm.js';
|
|
10
|
+
export async function inferSelection(idea, catalog, config, opts = {}) {
|
|
11
|
+
const flagOverrides = opts.overrides ?? {};
|
|
12
|
+
const model = opts.useModel === false ? null : await modelOverrides(idea, catalog, config);
|
|
13
|
+
const baseOverrides = { ...(model?.overrides ?? {}), ...flagOverrides };
|
|
14
|
+
const selection = autoSelect(idea, catalog, { defaultAdapters: config.defaultAdapters, overrides: baseOverrides });
|
|
15
|
+
return { selection, gaps: model?.gaps ?? [], baseOverrides, viaModel: Boolean(model) };
|
|
16
|
+
}
|
|
17
|
+
/** Ask the model to read the brief and map its catalog-constrained answer to planner overrides. */
|
|
18
|
+
async function modelOverrides(idea, catalog, config) {
|
|
19
|
+
const inference = await inferWithModel(idea, catalog, config);
|
|
20
|
+
if (!inference)
|
|
21
|
+
return null;
|
|
22
|
+
const overrides = {};
|
|
23
|
+
if (inference.stack)
|
|
24
|
+
overrides.stack = inference.stack;
|
|
25
|
+
if (inference.architecture)
|
|
26
|
+
overrides.architecture = inference.architecture;
|
|
27
|
+
if (inference.layers.length)
|
|
28
|
+
overrides.layers = inference.layers;
|
|
29
|
+
if (inference.adapters.length)
|
|
30
|
+
overrides.adapters = inference.adapters;
|
|
31
|
+
if (inference.teamSize)
|
|
32
|
+
overrides.teamSize = inference.teamSize;
|
|
33
|
+
if (Object.keys(inference.priorities).length)
|
|
34
|
+
overrides.priorities = inference.priorities;
|
|
35
|
+
return { overrides, gaps: inference.gaps };
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=pipeline.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pipeline.js","sourceRoot":"","sources":["../src/pipeline.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,UAAU,EAA0C,MAAM,eAAe,CAAC;AACnF,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAoBhD,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,IAAY,EACZ,OAAgB,EAChB,MAAwB,EACxB,OAAqB,EAAE;IAEvB,MAAM,aAAa,GAAG,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC3F,MAAM,aAAa,GAAkB,EAAE,GAAG,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC,EAAE,GAAG,aAAa,EAAE,CAAC;IACvF,MAAM,SAAS,GAAG,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,eAAe,EAAE,MAAM,CAAC,eAAe,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC,CAAC;IACnH,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,IAAI,EAAE,EAAE,aAAa,EAAE,QAAQ,EAAE,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;AACzF,CAAC;AAED,mGAAmG;AACnG,KAAK,UAAU,cAAc,CAC3B,IAAY,EACZ,OAAgB,EAChB,MAAwB;IAExB,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IAC9D,IAAI,CAAC,SAAS;QAAE,OAAO,IAAI,CAAC;IAE5B,MAAM,SAAS,GAAkB,EAAE,CAAC;IACpC,IAAI,SAAS,CAAC,KAAK;QAAE,SAAS,CAAC,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;IACvD,IAAI,SAAS,CAAC,YAAY;QAAE,SAAS,CAAC,YAAY,GAAG,SAAS,CAAC,YAAY,CAAC;IAC5E,IAAI,SAAS,CAAC,MAAM,CAAC,MAAM;QAAE,SAAS,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;IACjE,IAAI,SAAS,CAAC,QAAQ,CAAC,MAAM;QAAE,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC;IACvE,IAAI,SAAS,CAAC,QAAQ;QAAE,SAAS,CAAC,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC;IAChE,IAAI,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,MAAM;QAAE,SAAS,CAAC,UAAU,GAAG,SAAS,CAAC,UAAU,CAAC;IAC1F,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,CAAC,IAAI,EAAE,CAAC;AAC7C,CAAC"}
|