@principles/core 1.196.0 → 1.198.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/dist/runtime-v2/__tests__/architecture-regression.test.js +2 -0
- package/dist/runtime-v2/__tests__/architecture-regression.test.js.map +1 -1
- package/dist/runtime-v2/feature-flags/__tests__/rulecode-context-v2-flag.test.d.ts +2 -0
- package/dist/runtime-v2/feature-flags/__tests__/rulecode-context-v2-flag.test.d.ts.map +1 -0
- package/dist/runtime-v2/feature-flags/__tests__/rulecode-context-v2-flag.test.js +74 -0
- package/dist/runtime-v2/feature-flags/__tests__/rulecode-context-v2-flag.test.js.map +1 -0
- package/dist/runtime-v2/feature-flags/feature-flag-contract.d.ts.map +1 -1
- package/dist/runtime-v2/feature-flags/feature-flag-contract.js +7 -0
- package/dist/runtime-v2/feature-flags/feature-flag-contract.js.map +1 -1
- package/dist/runtime-v2/index.d.ts +2 -0
- package/dist/runtime-v2/index.d.ts.map +1 -1
- package/dist/runtime-v2/index.js +1 -0
- package/dist/runtime-v2/index.js.map +1 -1
- package/dist/runtime-v2/internalization/__tests__/rule-context-v2.test.d.ts +2 -0
- package/dist/runtime-v2/internalization/__tests__/rule-context-v2.test.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/__tests__/rule-context-v2.test.js +449 -0
- package/dist/runtime-v2/internalization/__tests__/rule-context-v2.test.js.map +1 -0
- package/dist/runtime-v2/internalization/rule-context-v2.d.ts +61 -0
- package/dist/runtime-v2/internalization/rule-context-v2.d.ts.map +1 -0
- package/dist/runtime-v2/internalization/rule-context-v2.js +301 -0
- package/dist/runtime-v2/internalization/rule-context-v2.js.map +1 -0
- package/dist/runtime-v2/internalization/rule-host-contracts.d.ts +9 -0
- package/dist/runtime-v2/internalization/rule-host-contracts.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* PRI-480 — Phase 1 Core ABI (rule-context-v2.ts)
|
|
3
|
+
*
|
|
4
|
+
* Pure logic: types + canonicalize + validators + behavior-facts computation.
|
|
5
|
+
* Zero I/O — this module MUST NOT import node:fs / node:path / better-sqlite3 /
|
|
6
|
+
* any network module. The runtime-v2 architecture-regression test enforces the
|
|
7
|
+
* file boundary.
|
|
8
|
+
*
|
|
9
|
+
* Err-prevention:
|
|
10
|
+
* - ERR-001 (validate-as-unknown): every public validator takes `unknown` and
|
|
11
|
+
* validates structurally. No `as` bypass on parsed input.
|
|
12
|
+
* - ERR-076 (prototype-pollution / host-realm independence): structural checks
|
|
13
|
+
* use Object.keys + a PROTO_KEYS set. We never touch the host realm's
|
|
14
|
+
* prototype chain (no `instanceof`, no `in`).
|
|
15
|
+
* - rc-2: no `as` casts on parsed input.
|
|
16
|
+
* - rc-5: Object.hasOwn / Object.keys over the `in` operator.
|
|
17
|
+
*
|
|
18
|
+
* Spec: docs/superpowers/specs/2026-06-27-rulecode-context-vision-design.md §4.
|
|
19
|
+
*/
|
|
20
|
+
// ── internal constants ─────────────────────────────────────────────────────
|
|
21
|
+
const CANONICAL_KINDS = new Set([
|
|
22
|
+
'read',
|
|
23
|
+
'search',
|
|
24
|
+
'write',
|
|
25
|
+
'execute',
|
|
26
|
+
'agent',
|
|
27
|
+
'other',
|
|
28
|
+
]);
|
|
29
|
+
const EVIDENCE_STATES = new Set(['yes', 'no', 'unknown']);
|
|
30
|
+
const TOOL_OUTCOMES = new Set(['success', 'failure', 'blocked']);
|
|
31
|
+
const HISTORY_STATUSES = new Set(['available', 'unavailable']);
|
|
32
|
+
const PROTO_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
|
|
33
|
+
const OK_RESULT = { valid: true, errors: [] };
|
|
34
|
+
function fail(errors) {
|
|
35
|
+
return errors.length === 0 ? OK_RESULT : { valid: false, errors };
|
|
36
|
+
}
|
|
37
|
+
function isPlainObjectLike(value) {
|
|
38
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
39
|
+
}
|
|
40
|
+
function hasNoProtoKeys(value) {
|
|
41
|
+
for (const key of Object.keys(value)) {
|
|
42
|
+
if (PROTO_KEYS.has(key))
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
function isFiniteNumber(value) {
|
|
48
|
+
return typeof value === 'number' && Number.isFinite(value);
|
|
49
|
+
}
|
|
50
|
+
function isNullOrNonNegativeFinite(value) {
|
|
51
|
+
return value === null || (typeof value === 'number' && Number.isFinite(value) && value >= 0);
|
|
52
|
+
}
|
|
53
|
+
// ── canonicalizeToolKind (static alias table, spec §4.4) ────────────────────
|
|
54
|
+
//
|
|
55
|
+
// NOTE: the authoritative source for canonical kinds SHOULD be a host declaration
|
|
56
|
+
// (spec §4.4 anti-drift note), so that `core` never owns a growing hardcoded
|
|
57
|
+
// tool list. The first version uses a static alias table (ticket-bounded); a
|
|
58
|
+
// later phase will let hosts declare `ruleCanonicalKind` overrides. core only
|
|
59
|
+
// owns the CLOSED CanonicalKind enum + this pure lookup function.
|
|
60
|
+
const TOOL_ALIAS = {
|
|
61
|
+
read: 'read',
|
|
62
|
+
read_file: 'read',
|
|
63
|
+
read_many_files: 'read',
|
|
64
|
+
grep: 'search',
|
|
65
|
+
grep_search: 'search',
|
|
66
|
+
search_file_content: 'search',
|
|
67
|
+
glob: 'search',
|
|
68
|
+
write: 'write',
|
|
69
|
+
write_file: 'write',
|
|
70
|
+
edit: 'write',
|
|
71
|
+
edit_file: 'write',
|
|
72
|
+
replace: 'write',
|
|
73
|
+
apply_patch: 'write',
|
|
74
|
+
bash: 'execute',
|
|
75
|
+
exec: 'execute',
|
|
76
|
+
execute: 'execute',
|
|
77
|
+
run_shell_command: 'execute',
|
|
78
|
+
sessions_spawn: 'agent',
|
|
79
|
+
};
|
|
80
|
+
export function canonicalizeToolKind(toolName) {
|
|
81
|
+
if (typeof toolName !== 'string')
|
|
82
|
+
return 'other';
|
|
83
|
+
// ERR-076: Object.hasOwn guards against inherited Object.prototype keys
|
|
84
|
+
// (__proto__, constructor, toString, hasOwnProperty, ...) that direct
|
|
85
|
+
// indexing would otherwise leak as non-CanonicalKind values (e.g. the
|
|
86
|
+
// Object.prototype object, the Object constructor function). Without this
|
|
87
|
+
// guard `TOOL_ALIAS['__proto__']` returns Object.prototype, not undefined.
|
|
88
|
+
if (!Object.hasOwn(TOOL_ALIAS, toolName))
|
|
89
|
+
return 'other';
|
|
90
|
+
const hit = TOOL_ALIAS[toolName];
|
|
91
|
+
return hit !== undefined ? hit : 'other';
|
|
92
|
+
}
|
|
93
|
+
// ── validators ─────────────────────────────────────────────────────────────
|
|
94
|
+
export function validateRuleToolCallRecord(value) {
|
|
95
|
+
if (!isPlainObjectLike(value)) {
|
|
96
|
+
return { valid: false, errors: ['record must be a plain object'] };
|
|
97
|
+
}
|
|
98
|
+
if (!hasNoProtoKeys(value)) {
|
|
99
|
+
return { valid: false, errors: ['record must not carry prototype-pollution keys'] };
|
|
100
|
+
}
|
|
101
|
+
const errors = [];
|
|
102
|
+
if (!isFiniteNumber(value.sequenceId)) {
|
|
103
|
+
errors.push('sequenceId must be a finite number');
|
|
104
|
+
}
|
|
105
|
+
const { toolName } = value;
|
|
106
|
+
if (typeof toolName !== 'string' || toolName.length === 0) {
|
|
107
|
+
errors.push('toolName must be a non-empty string');
|
|
108
|
+
}
|
|
109
|
+
const { canonicalKind } = value;
|
|
110
|
+
if (typeof canonicalKind !== 'string' || !CANONICAL_KINDS.has(canonicalKind)) {
|
|
111
|
+
errors.push('canonicalKind must be a valid CanonicalKind');
|
|
112
|
+
}
|
|
113
|
+
const { normalizedPath } = value;
|
|
114
|
+
if (normalizedPath !== null && typeof normalizedPath !== 'string') {
|
|
115
|
+
errors.push('normalizedPath must be a string or null');
|
|
116
|
+
}
|
|
117
|
+
if (!isPlainObjectLike(value.paramsSummary)) {
|
|
118
|
+
errors.push('paramsSummary must be a plain object');
|
|
119
|
+
}
|
|
120
|
+
const { outcome } = value;
|
|
121
|
+
if (typeof outcome !== 'string' || !TOOL_OUTCOMES.has(outcome)) {
|
|
122
|
+
errors.push('outcome must be success | failure | blocked');
|
|
123
|
+
}
|
|
124
|
+
return fail(errors);
|
|
125
|
+
}
|
|
126
|
+
export function validateRuleHistoryWindow(value) {
|
|
127
|
+
if (!isPlainObjectLike(value)) {
|
|
128
|
+
return { valid: false, errors: ['history window must be a plain object'] };
|
|
129
|
+
}
|
|
130
|
+
if (!hasNoProtoKeys(value)) {
|
|
131
|
+
return { valid: false, errors: ['history window must not carry prototype-pollution keys'] };
|
|
132
|
+
}
|
|
133
|
+
const errors = [];
|
|
134
|
+
const { status } = value;
|
|
135
|
+
if (typeof status !== 'string' || !HISTORY_STATUSES.has(status)) {
|
|
136
|
+
errors.push('status must be available | unavailable');
|
|
137
|
+
}
|
|
138
|
+
const { unavailableReason } = value;
|
|
139
|
+
if (unavailableReason !== undefined && typeof unavailableReason !== 'string') {
|
|
140
|
+
errors.push('unavailableReason must be a string or undefined');
|
|
141
|
+
}
|
|
142
|
+
if (typeof value.truncated !== 'boolean') {
|
|
143
|
+
errors.push('truncated must be a boolean');
|
|
144
|
+
}
|
|
145
|
+
const { calls } = value;
|
|
146
|
+
if (!Array.isArray(calls)) {
|
|
147
|
+
errors.push('calls must be an array');
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
for (let i = 0; i < calls.length; i++) {
|
|
151
|
+
const recordResult = validateRuleToolCallRecord(calls[i]);
|
|
152
|
+
if (!recordResult.valid) {
|
|
153
|
+
errors.push(`calls[${i}] invalid: ${recordResult.errors.join('; ')}`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return fail(errors);
|
|
158
|
+
}
|
|
159
|
+
export function validateRuleBehaviorFacts(value) {
|
|
160
|
+
if (!isPlainObjectLike(value)) {
|
|
161
|
+
return { valid: false, errors: ['facts must be a plain object'] };
|
|
162
|
+
}
|
|
163
|
+
if (!hasNoProtoKeys(value)) {
|
|
164
|
+
return { valid: false, errors: ['facts must not carry prototype-pollution keys'] };
|
|
165
|
+
}
|
|
166
|
+
const errors = [];
|
|
167
|
+
const { priorReadOfTarget } = value;
|
|
168
|
+
if (typeof priorReadOfTarget !== 'string' || !EVIDENCE_STATES.has(priorReadOfTarget)) {
|
|
169
|
+
errors.push('priorReadOfTarget must be yes | no | unknown');
|
|
170
|
+
}
|
|
171
|
+
if (!isNullOrNonNegativeFinite(value.readCount)) {
|
|
172
|
+
errors.push('readCount must be a non-negative finite number or null');
|
|
173
|
+
}
|
|
174
|
+
if (!isNullOrNonNegativeFinite(value.writeCount)) {
|
|
175
|
+
errors.push('writeCount must be a non-negative finite number or null');
|
|
176
|
+
}
|
|
177
|
+
if (!isNullOrNonNegativeFinite(value.uniqueWritePathCount)) {
|
|
178
|
+
errors.push('uniqueWritePathCount must be a non-negative finite number or null');
|
|
179
|
+
}
|
|
180
|
+
if (!isNullOrNonNegativeFinite(value.sameActionBlockCount)) {
|
|
181
|
+
errors.push('sameActionBlockCount must be a non-negative finite number or null');
|
|
182
|
+
}
|
|
183
|
+
return fail(errors);
|
|
184
|
+
}
|
|
185
|
+
export function validateRuleContextV2(value) {
|
|
186
|
+
if (!isPlainObjectLike(value)) {
|
|
187
|
+
return { valid: false, errors: ['context must be a plain object'] };
|
|
188
|
+
}
|
|
189
|
+
if (!hasNoProtoKeys(value)) {
|
|
190
|
+
return { valid: false, errors: ['context must not carry prototype-pollution keys'] };
|
|
191
|
+
}
|
|
192
|
+
const errors = [];
|
|
193
|
+
if (value.version !== 2) {
|
|
194
|
+
errors.push('version must be 2');
|
|
195
|
+
}
|
|
196
|
+
const historyResult = validateRuleHistoryWindow(value.history);
|
|
197
|
+
if (!historyResult.valid) {
|
|
198
|
+
errors.push(`history invalid: ${historyResult.errors.join('; ')}`);
|
|
199
|
+
}
|
|
200
|
+
const factsResult = validateRuleBehaviorFacts(value.facts);
|
|
201
|
+
if (!factsResult.valid) {
|
|
202
|
+
errors.push(`facts invalid: ${factsResult.errors.join('; ')}`);
|
|
203
|
+
}
|
|
204
|
+
// Unavailable invariant (acceptance C): when history.status === 'unavailable',
|
|
205
|
+
// facts MUST be the canonical unavailable posture — priorReadOfTarget='unknown'
|
|
206
|
+
// and every count null. Any drift is rejected so downstream gates can't be
|
|
207
|
+
// fooled by a host that fabricates numbers while claiming history is missing.
|
|
208
|
+
const { history } = value;
|
|
209
|
+
const { facts } = value;
|
|
210
|
+
if (historyResult.valid &&
|
|
211
|
+
factsResult.valid &&
|
|
212
|
+
isPlainObjectLike(history) &&
|
|
213
|
+
isPlainObjectLike(facts) &&
|
|
214
|
+
history.status === 'unavailable') {
|
|
215
|
+
if (facts.priorReadOfTarget !== 'unknown') {
|
|
216
|
+
errors.push('unavailable invariant: priorReadOfTarget must be "unknown" when history is unavailable');
|
|
217
|
+
}
|
|
218
|
+
if (facts.readCount !== null) {
|
|
219
|
+
errors.push('unavailable invariant: readCount must be null when history is unavailable');
|
|
220
|
+
}
|
|
221
|
+
if (facts.writeCount !== null) {
|
|
222
|
+
errors.push('unavailable invariant: writeCount must be null when history is unavailable');
|
|
223
|
+
}
|
|
224
|
+
if (facts.uniqueWritePathCount !== null) {
|
|
225
|
+
errors.push('unavailable invariant: uniqueWritePathCount must be null when history is unavailable');
|
|
226
|
+
}
|
|
227
|
+
if (facts.sameActionBlockCount !== null) {
|
|
228
|
+
errors.push('unavailable invariant: sameActionBlockCount must be null when history is unavailable');
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
return fail(errors);
|
|
232
|
+
}
|
|
233
|
+
// ── computeBehaviorFacts (pure) ────────────────────────────────────────────
|
|
234
|
+
export function computeBehaviorFacts(window, targetPath, sameActionBlockCount) {
|
|
235
|
+
if (window.status === 'unavailable') {
|
|
236
|
+
return {
|
|
237
|
+
priorReadOfTarget: 'unknown',
|
|
238
|
+
readCount: null,
|
|
239
|
+
writeCount: null,
|
|
240
|
+
uniqueWritePathCount: null,
|
|
241
|
+
sameActionBlockCount: null,
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
let readCount = 0;
|
|
245
|
+
let writeCount = 0;
|
|
246
|
+
const writePaths = new Set();
|
|
247
|
+
let priorReadOfTarget = targetPath === null ? 'unknown' : 'no';
|
|
248
|
+
const { calls } = window;
|
|
249
|
+
for (const call of calls) {
|
|
250
|
+
const kind = call.canonicalKind;
|
|
251
|
+
if (kind === 'read' || kind === 'search') {
|
|
252
|
+
readCount++;
|
|
253
|
+
if (targetPath !== null && call.normalizedPath === targetPath) {
|
|
254
|
+
priorReadOfTarget = 'yes';
|
|
255
|
+
}
|
|
256
|
+
}
|
|
257
|
+
else if (kind === 'write') {
|
|
258
|
+
writeCount++;
|
|
259
|
+
if (typeof call.normalizedPath === 'string') {
|
|
260
|
+
writePaths.add(call.normalizedPath);
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
return {
|
|
265
|
+
priorReadOfTarget,
|
|
266
|
+
readCount,
|
|
267
|
+
writeCount,
|
|
268
|
+
uniqueWritePathCount: writePaths.size,
|
|
269
|
+
sameActionBlockCount,
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
// ── UNAVAILABLE_RULE_CONTEXT sentinel (deep-frozen) ────────────────────────
|
|
273
|
+
//
|
|
274
|
+
// The canonical "host gave us no history" context. Downstream code compares
|
|
275
|
+
// against this (or checks history.status) instead of null-checking, so the
|
|
276
|
+
// unavailable posture is always well-typed. Deep-frozen so a buggy host cannot
|
|
277
|
+
// mutate the shared sentinel and poison every subsequent rule evaluation.
|
|
278
|
+
const _UNAVAILABLE_FACTS = {
|
|
279
|
+
priorReadOfTarget: 'unknown',
|
|
280
|
+
readCount: null,
|
|
281
|
+
writeCount: null,
|
|
282
|
+
uniqueWritePathCount: null,
|
|
283
|
+
sameActionBlockCount: null,
|
|
284
|
+
};
|
|
285
|
+
Object.freeze(_UNAVAILABLE_FACTS);
|
|
286
|
+
const _UNAVAILABLE_HISTORY = {
|
|
287
|
+
status: 'unavailable',
|
|
288
|
+
unavailableReason: 'host did not provide a history window',
|
|
289
|
+
truncated: false,
|
|
290
|
+
calls: [],
|
|
291
|
+
};
|
|
292
|
+
Object.freeze(_UNAVAILABLE_HISTORY.calls);
|
|
293
|
+
Object.freeze(_UNAVAILABLE_HISTORY);
|
|
294
|
+
const _UNAVAILABLE_VALUE = {
|
|
295
|
+
version: 2,
|
|
296
|
+
history: _UNAVAILABLE_HISTORY,
|
|
297
|
+
facts: _UNAVAILABLE_FACTS,
|
|
298
|
+
};
|
|
299
|
+
Object.freeze(_UNAVAILABLE_VALUE);
|
|
300
|
+
export const UNAVAILABLE_RULE_CONTEXT = _UNAVAILABLE_VALUE;
|
|
301
|
+
//# sourceMappingURL=rule-context-v2.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rule-context-v2.js","sourceRoot":"","sources":["../../../src/runtime-v2/internalization/rule-context-v2.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
* - No filesystem, process, require, dynamic import, eval, or network access
|
|
12
12
|
*/
|
|
13
13
|
import type { CorrectionProposal } from './correction-proposal.js';
|
|
14
|
+
import type { RuleContextV2 } from './rule-context-v2.js';
|
|
14
15
|
export interface RuleHostInput {
|
|
15
16
|
action: {
|
|
16
17
|
toolName: string;
|
|
@@ -34,6 +35,14 @@ export interface RuleHostInput {
|
|
|
34
35
|
estimatedLineChanges: number;
|
|
35
36
|
bashRisk: 'safe' | 'normal' | 'dangerous' | 'unknown';
|
|
36
37
|
};
|
|
38
|
+
/**
|
|
39
|
+
* PRI-480 (RuleContext v2 — Phase 1): optional structured context describing
|
|
40
|
+
* the recent tool-call history and derived behavior facts. Optional on purpose
|
|
41
|
+
* — v1 rule implementations that never read this field see `undefined` and
|
|
42
|
+
* behave exactly as before. Hosts opt in by populating the field; downstream
|
|
43
|
+
* phases will gate new rule behavior on `context?.history.status === 'available'`.
|
|
44
|
+
*/
|
|
45
|
+
context?: RuleContextV2;
|
|
37
46
|
}
|
|
38
47
|
export type RuleHostDecision = 'allow' | 'block' | 'requireApproval' | 'auto_correct';
|
|
39
48
|
export interface RuleHostMeta {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rule-host-contracts.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/internalization/rule-host-contracts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;
|
|
1
|
+
{"version":3,"file":"rule-host-contracts.d.ts","sourceRoot":"","sources":["../../../src/runtime-v2/internalization/rule-host-contracts.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAC;AACnE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAM1D,MAAM,WAAW,aAAa;IAC5B,MAAM,EAAE;QACN,QAAQ,EAAE,MAAM,CAAC;QACjB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;QAC9B,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACxC,CAAC;IACF,SAAS,EAAE;QACT,UAAU,EAAE,OAAO,CAAC;QACpB,UAAU,EAAE,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,SAAS,CAAC;QACnD,WAAW,EAAE,OAAO,CAAC;KACtB,CAAC;IACF,OAAO,EAAE;QACP,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,MAAM,CAAC;QACnB,cAAc,EAAE,OAAO,CAAC;KACzB,CAAC;IACF,SAAS,EAAE;QACT,MAAM,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,OAAO,EAAE;QACP,oBAAoB,EAAE,MAAM,CAAC;QAC7B,QAAQ,EAAE,MAAM,GAAG,QAAQ,GAAG,WAAW,GAAG,SAAS,CAAC;KACvD,CAAC;IACF;;;;;;OAMG;IACH,OAAO,CAAC,EAAE,aAAa,CAAC;CACzB;AAMD,MAAM,MAAM,gBAAgB,GAAG,OAAO,GAAG,OAAO,GAAG,iBAAiB,GAAG,cAAc,CAAC;AAMtF,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;CACzB;AAMD,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uFAAuF;IACvF,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;CACzC;AAMD,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,YAAY,CAAC;IACnB,QAAQ,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK,cAAc,CAAC;CACrD"}
|