@dsh-enhanced/plugin-control-plane 0.1.32 → 0.1.34
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 +352 -4
- package/bin/dsh-local-release-adapter.js +80 -16
- package/bin/dsh-npm-registry-adapter.js +613 -0
- package/bin/dsh-source-adoption-authority.js +12 -0
- package/bin/dsh-source-approval-authority.js +16 -0
- package/bin/dsh-source-release-authority.js +12 -0
- package/bin/dsh-systemd-host-attestor.js +707 -0
- package/bin/dsh-task-observation-authority.js +15 -0
- package/lib/adapter-process.d.ts +23 -0
- package/lib/adapter-process.d.ts.map +1 -0
- package/lib/adapter-process.js +305 -0
- package/lib/adapter-process.js.map +1 -0
- package/lib/adoption-coordinator.d.ts +63 -0
- package/lib/adoption-coordinator.d.ts.map +1 -0
- package/lib/adoption-coordinator.js +241 -0
- package/lib/adoption-coordinator.js.map +1 -0
- package/lib/adoption-handoff.d.ts +16 -0
- package/lib/adoption-handoff.d.ts.map +1 -0
- package/lib/adoption-handoff.js +11 -0
- package/lib/adoption-handoff.js.map +1 -0
- package/lib/attestation.d.ts.map +1 -1
- package/lib/attestation.js +49 -1
- package/lib/attestation.js.map +1 -1
- package/lib/catalog.d.ts.map +1 -1
- package/lib/catalog.js +29 -2
- package/lib/catalog.js.map +1 -1
- package/lib/cli.d.ts +33 -9
- package/lib/cli.d.ts.map +1 -1
- package/lib/cli.js +624 -178
- package/lib/cli.js.map +1 -1
- package/lib/deployment-readiness.d.ts +38 -0
- package/lib/deployment-readiness.d.ts.map +1 -0
- package/lib/deployment-readiness.js +154 -0
- package/lib/deployment-readiness.js.map +1 -0
- package/lib/effect-blocked-replay.d.ts +81 -0
- package/lib/effect-blocked-replay.d.ts.map +1 -0
- package/lib/effect-blocked-replay.js +259 -0
- package/lib/effect-blocked-replay.js.map +1 -0
- package/lib/errors.d.ts +6 -0
- package/lib/errors.d.ts.map +1 -0
- package/lib/errors.js +9 -0
- package/lib/errors.js.map +1 -0
- package/lib/foreground-deployment-runtime.d.ts +20 -0
- package/lib/foreground-deployment-runtime.d.ts.map +1 -0
- package/lib/foreground-deployment-runtime.js +79 -0
- package/lib/foreground-deployment-runtime.js.map +1 -0
- package/lib/foreground-deployment.d.ts +17 -0
- package/lib/foreground-deployment.d.ts.map +1 -0
- package/lib/foreground-deployment.js +43 -0
- package/lib/foreground-deployment.js.map +1 -0
- package/lib/host-attestor.d.ts +1 -1
- package/lib/host-attestor.d.ts.map +1 -1
- package/lib/host-attestor.js +51 -57
- package/lib/host-attestor.js.map +1 -1
- package/lib/index.d.ts +25 -2
- package/lib/index.d.ts.map +1 -1
- package/lib/index.js +11 -2
- package/lib/index.js.map +1 -1
- package/lib/npm-publish.d.ts +25 -0
- package/lib/npm-publish.d.ts.map +1 -0
- package/lib/npm-publish.js +280 -0
- package/lib/npm-publish.js.map +1 -0
- package/lib/owner-task-gap-types.d.ts +21 -0
- package/lib/owner-task-gap-types.d.ts.map +1 -0
- package/lib/owner-task-gap-types.js +2 -0
- package/lib/owner-task-gap-types.js.map +1 -0
- package/lib/owner-task-gaps.d.ts +24 -0
- package/lib/owner-task-gaps.d.ts.map +1 -0
- package/lib/owner-task-gaps.js +74 -0
- package/lib/owner-task-gaps.js.map +1 -0
- package/lib/post-activation.d.ts +33 -0
- package/lib/post-activation.d.ts.map +1 -0
- package/lib/post-activation.js +219 -0
- package/lib/post-activation.js.map +1 -0
- package/lib/registry-fetch.d.ts +50 -0
- package/lib/registry-fetch.d.ts.map +1 -0
- package/lib/registry-fetch.js +267 -0
- package/lib/registry-fetch.js.map +1 -0
- package/lib/release.d.ts +4 -4
- package/lib/release.d.ts.map +1 -1
- package/lib/release.js +142 -56
- package/lib/release.js.map +1 -1
- package/lib/replay-endpoint-protocol.d.ts +65 -0
- package/lib/replay-endpoint-protocol.d.ts.map +1 -0
- package/lib/replay-endpoint-protocol.js +183 -0
- package/lib/replay-endpoint-protocol.js.map +1 -0
- package/lib/replay-endpoint.d.ts +7 -0
- package/lib/replay-endpoint.d.ts.map +1 -0
- package/lib/replay-endpoint.js +193 -0
- package/lib/replay-endpoint.js.map +1 -0
- package/lib/replay-grant.d.ts +62 -0
- package/lib/replay-grant.d.ts.map +1 -0
- package/lib/replay-grant.js +208 -0
- package/lib/replay-grant.js.map +1 -0
- package/lib/replay-journal.d.ts +25 -0
- package/lib/replay-journal.d.ts.map +1 -0
- package/lib/replay-journal.js +275 -0
- package/lib/replay-journal.js.map +1 -0
- package/lib/runtime-observer-protocol.d.ts +63 -0
- package/lib/runtime-observer-protocol.d.ts.map +1 -0
- package/lib/runtime-observer-protocol.js +280 -0
- package/lib/runtime-observer-protocol.js.map +1 -0
- package/lib/runtime-observer.d.ts +8 -0
- package/lib/runtime-observer.d.ts.map +1 -0
- package/lib/runtime-observer.js +182 -0
- package/lib/runtime-observer.js.map +1 -0
- package/lib/service.d.ts +145 -1
- package/lib/service.d.ts.map +1 -1
- package/lib/service.js +734 -6
- package/lib/service.js.map +1 -1
- package/lib/source-adoption-authority.d.ts +65 -0
- package/lib/source-adoption-authority.d.ts.map +1 -0
- package/lib/source-adoption-authority.js +271 -0
- package/lib/source-adoption-authority.js.map +1 -0
- package/lib/source-adoption-runner.d.ts +28 -0
- package/lib/source-adoption-runner.d.ts.map +1 -0
- package/lib/source-adoption-runner.js +197 -0
- package/lib/source-adoption-runner.js.map +1 -0
- package/lib/source-approval-authority.d.ts +50 -0
- package/lib/source-approval-authority.d.ts.map +1 -0
- package/lib/source-approval-authority.js +412 -0
- package/lib/source-approval-authority.js.map +1 -0
- package/lib/source-approval-client.d.ts +32 -0
- package/lib/source-approval-client.d.ts.map +1 -0
- package/lib/source-approval-client.js +175 -0
- package/lib/source-approval-client.js.map +1 -0
- package/lib/source-build.d.ts +60 -0
- package/lib/source-build.d.ts.map +1 -0
- package/lib/source-build.js +311 -0
- package/lib/source-build.js.map +1 -0
- package/lib/source-context.d.ts +24 -0
- package/lib/source-context.d.ts.map +1 -0
- package/lib/source-context.js +99 -0
- package/lib/source-context.js.map +1 -0
- package/lib/source-job-types.d.ts +87 -0
- package/lib/source-job-types.d.ts.map +1 -0
- package/lib/source-job-types.js +2 -0
- package/lib/source-job-types.js.map +1 -0
- package/lib/source-jobs.d.ts +113 -0
- package/lib/source-jobs.d.ts.map +1 -0
- package/lib/source-jobs.js +535 -0
- package/lib/source-jobs.js.map +1 -0
- package/lib/source-release-authority.d.ts +35 -0
- package/lib/source-release-authority.d.ts.map +1 -0
- package/lib/source-release-authority.js +271 -0
- package/lib/source-release-authority.js.map +1 -0
- package/lib/source-release-client.d.ts +10 -0
- package/lib/source-release-client.d.ts.map +1 -0
- package/lib/source-release-client.js +24 -0
- package/lib/source-release-client.js.map +1 -0
- package/lib/source-release-runner.d.ts +31 -0
- package/lib/source-release-runner.d.ts.map +1 -0
- package/lib/source-release-runner.js +125 -0
- package/lib/source-release-runner.js.map +1 -0
- package/lib/source-versioning.d.ts +24 -0
- package/lib/source-versioning.d.ts.map +1 -0
- package/lib/source-versioning.js +213 -0
- package/lib/source-versioning.js.map +1 -0
- package/lib/source-workspace.d.ts +117 -0
- package/lib/source-workspace.d.ts.map +1 -0
- package/lib/source-workspace.js +458 -0
- package/lib/source-workspace.js.map +1 -0
- package/lib/sqlite.d.ts +1 -1
- package/lib/sqlite.d.ts.map +1 -1
- package/lib/sqlite.js +509 -7
- package/lib/sqlite.js.map +1 -1
- package/lib/store.d.ts +229 -6
- package/lib/store.d.ts.map +1 -1
- package/lib/store.js +2431 -383
- package/lib/store.js.map +1 -1
- package/lib/task-observation-authority.d.ts +29 -0
- package/lib/task-observation-authority.d.ts.map +1 -0
- package/lib/task-observation-authority.js +370 -0
- package/lib/task-observation-authority.js.map +1 -0
- package/lib/task-observation-client.d.ts +4 -0
- package/lib/task-observation-client.d.ts.map +1 -0
- package/lib/task-observation-client.js +20 -0
- package/lib/task-observation-client.js.map +1 -0
- package/lib/task-observation-runtime.d.ts +59 -0
- package/lib/task-observation-runtime.d.ts.map +1 -0
- package/lib/task-observation-runtime.js +331 -0
- package/lib/task-observation-runtime.js.map +1 -0
- package/lib/task-observation-store.d.ts +17 -0
- package/lib/task-observation-store.d.ts.map +1 -0
- package/lib/task-observation-store.js +115 -0
- package/lib/task-observation-store.js.map +1 -0
- package/lib/task-observation-types.d.ts +67 -0
- package/lib/task-observation-types.d.ts.map +1 -0
- package/lib/task-observation-types.js +2 -0
- package/lib/task-observation-types.js.map +1 -0
- package/lib/trust.d.ts +3 -0
- package/lib/trust.d.ts.map +1 -1
- package/lib/trust.js +0 -0
- package/lib/trust.js.map +1 -1
- package/lib/types.d.ts +275 -8
- package/lib/types.d.ts.map +1 -1
- package/lib/version.d.ts +1 -1
- package/lib/version.js +1 -1
- package/package.json +40 -5
|
@@ -0,0 +1,458 @@
|
|
|
1
|
+
import { createHash } from 'node:crypto';
|
|
2
|
+
import { spawn } from 'node:child_process';
|
|
3
|
+
import { constants as fsConstants } from 'node:fs';
|
|
4
|
+
import { lstat, mkdir, mkdtemp, open, realpath, rm } from 'node:fs/promises';
|
|
5
|
+
import { tmpdir } from 'node:os';
|
|
6
|
+
import { delimiter, dirname, isAbsolute, join, relative, resolve } from 'node:path';
|
|
7
|
+
import { ControlPlaneCliError } from './errors.js';
|
|
8
|
+
// 工程层、非真实供应商证据:本模块产出的 prepared evidence 只来自隔离
|
|
9
|
+
// worktree 内实际执行的 frozen 构建命令与 git 快照摘要;假 pnpm 壳仅可在
|
|
10
|
+
// 测试中经 PATH 注入,测试名与注释须标注工程层用途。
|
|
11
|
+
const pluginCatalogScope = 'plugins/README.md';
|
|
12
|
+
/**
|
|
13
|
+
* Modify plans in these statuses still own a prepared worktree that nobody else
|
|
14
|
+
* can act on; once their TTL expires the worktree is garbage. Plans in any
|
|
15
|
+
* later status (ready-for-human-review and beyond) are left for the owner's
|
|
16
|
+
* release workflow regardless of TTL.
|
|
17
|
+
*/
|
|
18
|
+
const GC_ELIGIBLE_SOURCE_STATUSES = new Set(['pending-approval', 'approved', 'expired']);
|
|
19
|
+
const MAX_PREPARED_FILES = 64;
|
|
20
|
+
const MAX_PREPARED_FILE_BYTES = 65_536;
|
|
21
|
+
const MAX_PREPARED_TOTAL_BYTES = 262_144;
|
|
22
|
+
const MAX_COMMAND_OUTPUT_BYTES = 8_388_608;
|
|
23
|
+
const COMMAND_TAIL_BYTES = 4_096;
|
|
24
|
+
/**
|
|
25
|
+
* T3 安全根插件绝不允许经成长执行体的隔离区窄口改写——即使产物只是待批
|
|
26
|
+
* pending plan。命中即拒绝,不进入 worktree 流程。
|
|
27
|
+
*/
|
|
28
|
+
export const PROTECTED_PLUGIN_DENYLIST = new Set([
|
|
29
|
+
'assistant-policy', // 策略规则、授权寿命、急停根
|
|
30
|
+
'credentials-keychain', // 凭据根
|
|
31
|
+
'assistant-evaluation', // 评测答案根
|
|
32
|
+
'assistant-verifier', // 验证/私钥评测根
|
|
33
|
+
'assistant-deepseek-budget', // 预算上限根
|
|
34
|
+
'assistant-super-relay-budget', // 预算上限根
|
|
35
|
+
'assistant-skills', // sealed holdout 私钥与 holdout 数据集
|
|
36
|
+
'assistant-isolation', // 隔离沙箱机制本身
|
|
37
|
+
'assistant-web-owner', // owner 安全控制台
|
|
38
|
+
'plugin-control-plane', // 审批/激活控制面本身(自举提权面)
|
|
39
|
+
]);
|
|
40
|
+
export function assertPluginModificationAllowed(name) {
|
|
41
|
+
if (PROTECTED_PLUGIN_DENYLIST.has(name)) {
|
|
42
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', `plugin ${JSON.stringify(name)} is a protected safety root and cannot be modified by growth proposals`);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
export async function resolveLocalExecutable(command, environment) {
|
|
46
|
+
const candidates = command === 'git' ? ['/usr/bin/git', '/bin/git'] : [join(dirname(process.execPath), 'pnpm'),
|
|
47
|
+
...(environment.PATH ?? '').split(delimiter).filter(isAbsolute).map(directory => join(directory, 'pnpm'))];
|
|
48
|
+
const uid = process.getuid?.();
|
|
49
|
+
for (const candidate of candidates) {
|
|
50
|
+
try {
|
|
51
|
+
const canonical = await realpath(candidate);
|
|
52
|
+
const value = await lstat(canonical);
|
|
53
|
+
const directory = await lstat(dirname(canonical));
|
|
54
|
+
if (value.isFile() && !value.isSymbolicLink() && (value.mode & 0o111) !== 0 && (value.mode & 0o022) === 0
|
|
55
|
+
&& (uid === undefined || value.uid === 0 || value.uid === uid) && directory.isDirectory() && (directory.mode & 0o002) === 0)
|
|
56
|
+
return canonical;
|
|
57
|
+
}
|
|
58
|
+
catch { /* next candidate */ }
|
|
59
|
+
}
|
|
60
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', `registered local ${command} executable is unavailable`);
|
|
61
|
+
}
|
|
62
|
+
const DEFAULT_COMMAND_TIMEOUT_MS = 60_000;
|
|
63
|
+
const DEFAULT_COMMAND_OUTPUT_BYTES = 65_536;
|
|
64
|
+
async function runLocalBounded(command, args, cwd, environment, options = {}) {
|
|
65
|
+
const executable = await resolveLocalExecutable(command, environment);
|
|
66
|
+
const capture = options.capture ?? false;
|
|
67
|
+
const maximumOutput = options.maximumOutput ?? DEFAULT_COMMAND_OUTPUT_BYTES;
|
|
68
|
+
const timeoutMs = options.timeoutMs ?? DEFAULT_COMMAND_TIMEOUT_MS;
|
|
69
|
+
return new Promise((resolvePromise, reject) => {
|
|
70
|
+
options.signal?.throwIfAborted();
|
|
71
|
+
const child = spawn(executable, args, { cwd, env: environment, stdio: ['ignore', 'pipe', 'pipe'], shell: false });
|
|
72
|
+
const stdout = [];
|
|
73
|
+
const stderrChunks = [];
|
|
74
|
+
let stdoutBytes = 0;
|
|
75
|
+
let stderrBytes = 0;
|
|
76
|
+
let outputLimit = false;
|
|
77
|
+
let timedOut = false;
|
|
78
|
+
child.stdout.on('data', (chunk) => {
|
|
79
|
+
if (!capture)
|
|
80
|
+
return; // drain only: uncaptured output must never bound or kill (legacy localCommand semantics)
|
|
81
|
+
stdoutBytes += chunk.length;
|
|
82
|
+
if (stdoutBytes > maximumOutput) {
|
|
83
|
+
if (!outputLimit) {
|
|
84
|
+
outputLimit = true;
|
|
85
|
+
child.kill('SIGKILL');
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
else
|
|
89
|
+
stdout.push(chunk);
|
|
90
|
+
});
|
|
91
|
+
child.stderr.on('data', (chunk) => {
|
|
92
|
+
// Keep only a bounded sliding tail of stderr; it exists purely for the
|
|
93
|
+
// diagnostic suffix and the content-free log digest.
|
|
94
|
+
stderrBytes += chunk.length;
|
|
95
|
+
stderrChunks.push(chunk);
|
|
96
|
+
while (stderrChunks.length > 1 && stderrBytes - stderrChunks[0].length >= COMMAND_TAIL_BYTES) {
|
|
97
|
+
stderrBytes -= stderrChunks[0].length;
|
|
98
|
+
stderrChunks.shift();
|
|
99
|
+
}
|
|
100
|
+
});
|
|
101
|
+
const started = Date.now();
|
|
102
|
+
const cancel = () => { child.kill('SIGKILL'); };
|
|
103
|
+
const timer = setTimeout(() => { timedOut = true; cancel(); }, timeoutMs);
|
|
104
|
+
options.signal?.addEventListener('abort', cancel, { once: true });
|
|
105
|
+
child.once('error', () => { clearTimeout(timer); options.signal?.removeEventListener('abort', cancel); reject(new ControlPlaneCliError('EXECUTOR_FAILED', `local ${command} could not start`)); });
|
|
106
|
+
child.once('close', code => {
|
|
107
|
+
clearTimeout(timer);
|
|
108
|
+
options.signal?.removeEventListener('abort', cancel);
|
|
109
|
+
const durationMs = Date.now() - started;
|
|
110
|
+
const stdoutBuffer = Buffer.concat(stdout);
|
|
111
|
+
const stdoutText = stdoutBuffer.toString('utf8');
|
|
112
|
+
const stderrTail = Buffer.concat(stderrChunks).toString('utf8').slice(-COMMAND_TAIL_BYTES);
|
|
113
|
+
const logDigest = createHash('sha256').update(stdoutText).update('\0').update(stderrTail).digest('hex');
|
|
114
|
+
if (options.signal?.aborted) {
|
|
115
|
+
reject(options.signal.reason);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
if (timedOut) {
|
|
119
|
+
reject(new ControlPlaneCliError('EXECUTOR_TIMEOUT', `local ${command} ${JSON.stringify(args[0] ?? '')} exceeded its ${timeoutMs}ms deadline (log ${logDigest})`));
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
if (outputLimit) {
|
|
123
|
+
reject(new ControlPlaneCliError('EXECUTOR_OUTPUT_LIMIT', `local ${command} ${JSON.stringify(args[0] ?? '')} exceeded the ${maximumOutput}-byte output bound (log ${logDigest})`));
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
if (code !== 0) {
|
|
127
|
+
reject(new ControlPlaneCliError('EXECUTOR_FAILED', `local ${command} ${JSON.stringify(args[0] ?? '')} exited ${code} (log ${logDigest})${stderrTail === '' ? '' : `: ${stderrTail.trimEnd()}`}`));
|
|
128
|
+
return;
|
|
129
|
+
}
|
|
130
|
+
resolvePromise({ stdout: stdoutText, stdoutBuffer, stderrTail, durationMs, logDigest });
|
|
131
|
+
});
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
export async function runLocalBuffer(command, args, cwd, environment, options = {}) {
|
|
135
|
+
return (await runLocalBounded(command, args, cwd, environment, { ...options, capture: true })).stdoutBuffer;
|
|
136
|
+
}
|
|
137
|
+
export async function runLocalCommand(command, args, cwd, environment, options = {}) {
|
|
138
|
+
const result = await runLocalBounded(command, args, cwd, environment, options);
|
|
139
|
+
return options.capture === true ? result.stdout : '';
|
|
140
|
+
}
|
|
141
|
+
export async function changedSourcePaths(worktree, baseCommit, environment, signal) {
|
|
142
|
+
const tracked = await runLocalCommand('git', ['--literal-pathspecs', '-c', 'core.quotepath=false', 'diff', '--no-renames',
|
|
143
|
+
'--name-only', '-z', baseCommit, '--'], worktree, environment, { capture: true, maximumOutput: MAX_COMMAND_OUTPUT_BYTES, ...(signal ? { signal } : {}) });
|
|
144
|
+
const untracked = await runLocalCommand('git', ['--literal-pathspecs', '-c', 'core.quotepath=false', 'ls-files', '--others',
|
|
145
|
+
'--exclude-standard', '-z'], worktree, environment, { capture: true, maximumOutput: MAX_COMMAND_OUTPUT_BYTES, ...(signal ? { signal } : {}) });
|
|
146
|
+
return [...new Set(`${tracked}${untracked}`.split('\0').filter(Boolean))].sort();
|
|
147
|
+
}
|
|
148
|
+
export function sourcePathAllowed(path, name, mode = 'modify') {
|
|
149
|
+
const pluginRoot = `plugins/${name}`;
|
|
150
|
+
const withinPluginTree = path === pluginRoot || path.startsWith(`${pluginRoot}/`);
|
|
151
|
+
return mode === 'create' ? (withinPluginTree || path === pluginCatalogScope) : withinPluginTree;
|
|
152
|
+
}
|
|
153
|
+
export async function checkedSourceSnapshot(worktree, baseCommit, scopeInput, environment, preparedTree, signal) {
|
|
154
|
+
const temporary = await mkdtemp(join(tmpdir(), 'dsh-plugin-control-index-'));
|
|
155
|
+
try {
|
|
156
|
+
const scope = [...new Set(scopeInput.map(value => value.normalize('NFC').trim()))].sort();
|
|
157
|
+
if (scope.length === 0 || scope.some(value => value === ''))
|
|
158
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', 'checked source scope is invalid');
|
|
159
|
+
const snapshotEnvironment = { ...environment, GIT_INDEX_FILE: join(temporary, 'index') };
|
|
160
|
+
await runLocalCommand('git', ['read-tree', preparedTree ?? baseCommit], worktree, snapshotEnvironment, signal ? { signal } : {});
|
|
161
|
+
if (preparedTree === undefined)
|
|
162
|
+
await runLocalCommand('git', ['--literal-pathspecs', 'add', '--all', '--', ...scope], worktree, snapshotEnvironment, signal ? { signal } : {});
|
|
163
|
+
const tree = await runLocalCommand('git', ['--literal-pathspecs', '-c', 'core.quotepath=false', 'ls-files', '--stage', '-z',
|
|
164
|
+
'--', ...scope], worktree, snapshotEnvironment, { capture: true, maximumOutput: MAX_COMMAND_OUTPUT_BYTES, ...(signal ? { signal } : {}) });
|
|
165
|
+
const patch = await runLocalCommand('git', ['--literal-pathspecs', '-c', 'core.quotepath=false', 'diff', '--cached', '--binary',
|
|
166
|
+
'--full-index', '--no-color', baseCommit, '--', ...scope], worktree, snapshotEnvironment, { capture: true, maximumOutput: MAX_COMMAND_OUTPUT_BYTES, ...(signal ? { signal } : {}) });
|
|
167
|
+
const binding = `${baseCommit}\0${JSON.stringify(scope)}\0`;
|
|
168
|
+
return {
|
|
169
|
+
checkedTreeDigest: createHash('sha256').update('dsh-source-tree-v2\0').update(binding).update(tree).digest('hex'),
|
|
170
|
+
checkedPatchDigest: createHash('sha256').update('dsh-source-patch-v2\0').update(binding).update(patch).digest('hex'),
|
|
171
|
+
};
|
|
172
|
+
}
|
|
173
|
+
finally {
|
|
174
|
+
await rm(temporary, { recursive: true, force: true });
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
/** Recheck the immutable prepared tree without rebuilding or executing candidate code. */
|
|
178
|
+
export async function verifyPreparedSourceWorktree(plan, environment, signal) {
|
|
179
|
+
signal?.throwIfAborted();
|
|
180
|
+
if (plan.mode !== 'modify' || !plan.sourceCheck || plan.scope.length !== 1 || plan.scope[0] !== `plugins/${plan.name}`
|
|
181
|
+
|| await realpath(plan.repository) !== plan.repository || await realpath(plan.worktree) !== plan.worktree) {
|
|
182
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', 'prepared source paths or scope changed');
|
|
183
|
+
}
|
|
184
|
+
if ((await runLocalCommand('git', ['rev-parse', 'HEAD'], plan.worktree, environment, { capture: true, ...(signal ? { signal } : {}) })).trim() !== plan.baseCommit) {
|
|
185
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', 'prepared worktree HEAD changed');
|
|
186
|
+
}
|
|
187
|
+
const changes = await changedSourcePaths(plan.worktree, plan.baseCommit, environment, signal);
|
|
188
|
+
if (changes.some(path => !sourcePathAllowed(path, plan.name, plan.mode))) {
|
|
189
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', 'prepared modification is outside its approved scope');
|
|
190
|
+
}
|
|
191
|
+
const checked = await checkedSourceSnapshot(plan.worktree, plan.baseCommit, plan.scope, environment, undefined, signal);
|
|
192
|
+
signal?.throwIfAborted();
|
|
193
|
+
if (checked.checkedTreeDigest !== plan.sourceCheck.treeDigest || checked.checkedPatchDigest !== plan.sourceCheck.patchDigest) {
|
|
194
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', 'prepared source digests changed');
|
|
195
|
+
}
|
|
196
|
+
return checked;
|
|
197
|
+
}
|
|
198
|
+
async function assertOwnerDirectory(path) {
|
|
199
|
+
const metadata = await lstat(path);
|
|
200
|
+
const uid = process.getuid?.();
|
|
201
|
+
if (metadata.isSymbolicLink() || !metadata.isDirectory()
|
|
202
|
+
|| (uid !== undefined && metadata.uid !== 0 && metadata.uid !== uid)
|
|
203
|
+
|| (metadata.mode & 0o022) !== 0) {
|
|
204
|
+
throw new ControlPlaneCliError('FILESYSTEM_STATE', `source state directory ${JSON.stringify(path)} is not an owner-owned non-symlink directory`);
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
/**
|
|
208
|
+
* Create a throwaway linked git worktree under the control-plane state root,
|
|
209
|
+
* detached at exactly baseCommit. Removal prunes the worktree registration and
|
|
210
|
+
* falls back to deleting the directory.
|
|
211
|
+
*/
|
|
212
|
+
export async function createIsolatedWorktree(input) {
|
|
213
|
+
if (!/^[a-f0-9]{40}$/u.test(input.baseCommit))
|
|
214
|
+
throw new ControlPlaneCliError('INVALID_ARGUMENT', 'base commit must be a 40-hex commit id');
|
|
215
|
+
await mkdir(input.stateRoot, { recursive: true, mode: 0o700 });
|
|
216
|
+
await assertOwnerDirectory(input.stateRoot);
|
|
217
|
+
const repository = await realpath(input.repository);
|
|
218
|
+
if (resolve(repository) !== repository)
|
|
219
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', 'repository path must be canonical');
|
|
220
|
+
const verified = (await runLocalCommand('git', ['rev-parse', '--verify', `${input.baseCommit}^{commit}`], repository, input.environment, { capture: true })).trim();
|
|
221
|
+
if (verified !== input.baseCommit)
|
|
222
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', 'base commit did not resolve to itself');
|
|
223
|
+
if (input.worktreeName !== undefined && !/^worktree-job-[a-f0-9]{64}$/u.test(input.worktreeName))
|
|
224
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', 'invalid durable worktree name');
|
|
225
|
+
const worktree = input.worktreeName === undefined
|
|
226
|
+
? await mkdtemp(join(input.stateRoot, 'worktree-')) : join(input.stateRoot, input.worktreeName);
|
|
227
|
+
// Exclusive creation: a crash residue never becomes a fresh build workspace.
|
|
228
|
+
if (input.worktreeName !== undefined)
|
|
229
|
+
await mkdir(worktree, { mode: 0o700 });
|
|
230
|
+
try {
|
|
231
|
+
await runLocalCommand('git', ['worktree', 'add', '--detach', worktree, input.baseCommit], repository, input.environment);
|
|
232
|
+
}
|
|
233
|
+
catch (error) {
|
|
234
|
+
if (input.worktreeName === undefined)
|
|
235
|
+
await rm(worktree, { recursive: true, force: true });
|
|
236
|
+
// Durable acquisition failures retain ambiguous residue for explicit
|
|
237
|
+
// reconciliation; its persisted job remains unknown and occupies capacity.
|
|
238
|
+
throw error;
|
|
239
|
+
}
|
|
240
|
+
let removed = false;
|
|
241
|
+
const remove = async () => {
|
|
242
|
+
if (removed)
|
|
243
|
+
return;
|
|
244
|
+
if (input.worktreeName !== undefined) {
|
|
245
|
+
await removeSourceJobWorktree({ ...input, repository, worktree });
|
|
246
|
+
removed = true;
|
|
247
|
+
return;
|
|
248
|
+
}
|
|
249
|
+
removed = true;
|
|
250
|
+
try {
|
|
251
|
+
await runLocalCommand('git', ['worktree', 'remove', '--force', worktree], repository, input.environment);
|
|
252
|
+
await runLocalCommand('git', ['worktree', 'prune'], repository, input.environment).catch(() => undefined);
|
|
253
|
+
}
|
|
254
|
+
catch {
|
|
255
|
+
await rm(worktree, { recursive: true, force: true });
|
|
256
|
+
await runLocalCommand('git', ['worktree', 'prune'], repository, input.environment).catch(() => undefined);
|
|
257
|
+
}
|
|
258
|
+
};
|
|
259
|
+
return { worktree: await realpath(worktree), remove };
|
|
260
|
+
}
|
|
261
|
+
/** Host-only reconciliation of the exact durable resource; never rebuilds it. */
|
|
262
|
+
export async function removeSourceJobWorktree(input) {
|
|
263
|
+
if (dirname(input.worktree) !== resolve(input.stateRoot)
|
|
264
|
+
|| !/^worktree-job-[a-f0-9]{64}$/u.test(input.worktree.slice(input.stateRoot.length + 1))) {
|
|
265
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', 'durable worktree is outside its private root');
|
|
266
|
+
}
|
|
267
|
+
await mkdir(input.stateRoot, { recursive: true, mode: 0o700 });
|
|
268
|
+
await assertOwnerDirectory(input.stateRoot);
|
|
269
|
+
const metadata = await lstat(input.worktree).catch((error) => {
|
|
270
|
+
if (error.code === 'ENOENT')
|
|
271
|
+
return undefined;
|
|
272
|
+
throw error;
|
|
273
|
+
});
|
|
274
|
+
if (metadata !== undefined) {
|
|
275
|
+
await assertOwnerDirectory(input.worktree);
|
|
276
|
+
const listing = await runLocalCommand('git', ['worktree', 'list', '--porcelain', '-z'], input.repository, input.environment, { capture: true });
|
|
277
|
+
const registration = listing.split('\0\0').find(entry => entry.split('\0')[0] === `worktree ${input.worktree}`);
|
|
278
|
+
if (registration === undefined) {
|
|
279
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', 'durable worktree registration is unproven; operator inspection required');
|
|
280
|
+
}
|
|
281
|
+
else {
|
|
282
|
+
if (!registration.split('\0').includes(`HEAD ${input.baseCommit}`))
|
|
283
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', 'durable worktree base identity changed');
|
|
284
|
+
const common = async (cwd) => (await runLocalCommand('git', ['rev-parse', '--path-format=absolute', '--git-common-dir'], cwd, input.environment, { capture: true })).trim();
|
|
285
|
+
const top = (await runLocalCommand('git', ['rev-parse', '--show-toplevel'], input.worktree, input.environment, { capture: true })).trim();
|
|
286
|
+
if (top !== input.worktree || await common(input.worktree) !== await common(input.repository))
|
|
287
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', 'durable worktree repository identity changed');
|
|
288
|
+
await runLocalCommand('git', ['worktree', 'remove', '--force', input.worktree], input.repository, input.environment);
|
|
289
|
+
}
|
|
290
|
+
}
|
|
291
|
+
await runLocalCommand('git', ['worktree', 'prune'], input.repository, input.environment);
|
|
292
|
+
const listing = await runLocalCommand('git', ['worktree', 'list', '--porcelain', '-z'], input.repository, input.environment, { capture: true });
|
|
293
|
+
const remains = await lstat(input.worktree).then(() => true, (error) => {
|
|
294
|
+
if (error.code === 'ENOENT')
|
|
295
|
+
return false;
|
|
296
|
+
throw error;
|
|
297
|
+
});
|
|
298
|
+
if (remains || listing.split('\0').includes(`worktree ${input.worktree}`))
|
|
299
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', 'durable worktree cleanup is unproven');
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Write a bounded set of plugin files through O_NOFOLLOW handles. Every path is
|
|
303
|
+
* constrained to plugins/<name>/; the plugin root must already exist at the
|
|
304
|
+
* base commit (modify never creates a plugin root, and never touches
|
|
305
|
+
* plugins/README.md).
|
|
306
|
+
*/
|
|
307
|
+
export async function writeScopedPluginFiles(input) {
|
|
308
|
+
const { worktree, name, files } = input;
|
|
309
|
+
validateScopedPluginFiles(files);
|
|
310
|
+
await writeValidatedPluginFiles(worktree, name, files);
|
|
311
|
+
}
|
|
312
|
+
/** Validate bytes and paths before persisting a durable source job. */
|
|
313
|
+
export function validateScopedPluginFiles(files) {
|
|
314
|
+
if (!Array.isArray(files))
|
|
315
|
+
throw new ControlPlaneCliError('INVALID_ARGUMENT', 'prepared files must be an array');
|
|
316
|
+
if (files.length < 1 || files.length > MAX_PREPARED_FILES) {
|
|
317
|
+
throw new ControlPlaneCliError('INVALID_ARGUMENT', `a prepared modification must carry 1..${MAX_PREPARED_FILES} files`);
|
|
318
|
+
}
|
|
319
|
+
const seen = new Set();
|
|
320
|
+
let totalBytes = 0;
|
|
321
|
+
for (const file of files) {
|
|
322
|
+
if (file === null || typeof file !== 'object' || typeof file.path !== 'string' || typeof file.content !== 'string')
|
|
323
|
+
throw new ControlPlaneCliError('INVALID_ARGUMENT', 'prepared file must contain text path and content');
|
|
324
|
+
const normalized = file.path.normalize('NFC');
|
|
325
|
+
if (normalized === '' || isAbsolute(normalized) || normalized.includes('\\')
|
|
326
|
+
|| normalized.split('/').some(segment => segment === '' || segment === '.' || segment === '..')) {
|
|
327
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', `prepared file path escapes the plugin tree: ${JSON.stringify(file.path)}`);
|
|
328
|
+
}
|
|
329
|
+
if (normalized.split('/').some(segment => segment === '.gitattributes' || segment === '.gitmodules' || segment === '.git')) {
|
|
330
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', `prepared file changes Git archive control data: ${JSON.stringify(file.path)}`);
|
|
331
|
+
}
|
|
332
|
+
if (seen.has(normalized))
|
|
333
|
+
throw new ControlPlaneCliError('INVALID_ARGUMENT', `duplicate prepared file path: ${JSON.stringify(normalized)}`);
|
|
334
|
+
seen.add(normalized);
|
|
335
|
+
const bytes = Buffer.byteLength(file.content, 'utf8');
|
|
336
|
+
if (bytes > MAX_PREPARED_FILE_BYTES)
|
|
337
|
+
throw new ControlPlaneCliError('INVALID_ARGUMENT', `prepared file ${JSON.stringify(normalized)} exceeds the ${MAX_PREPARED_FILE_BYTES}-byte bound`);
|
|
338
|
+
totalBytes += bytes;
|
|
339
|
+
if (totalBytes > MAX_PREPARED_TOTAL_BYTES)
|
|
340
|
+
throw new ControlPlaneCliError('INVALID_ARGUMENT', `prepared files exceed the ${MAX_PREPARED_TOTAL_BYTES}-byte total bound`);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
async function writeValidatedPluginFiles(worktree, name, files) {
|
|
344
|
+
const pluginRoot = resolve(worktree, 'plugins', name);
|
|
345
|
+
const rootMetadata = await lstat(pluginRoot).catch((error) => {
|
|
346
|
+
if (error.code === 'ENOENT')
|
|
347
|
+
return undefined;
|
|
348
|
+
throw error;
|
|
349
|
+
});
|
|
350
|
+
if (rootMetadata === undefined || rootMetadata.isSymbolicLink() || !rootMetadata.isDirectory()) {
|
|
351
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', `plugin ${JSON.stringify(name)} root must already exist in the base commit; prepared modifications cannot create a plugin`);
|
|
352
|
+
}
|
|
353
|
+
for (const file of files) {
|
|
354
|
+
const normalized = file.path.normalize('NFC');
|
|
355
|
+
const segments = normalized.split('/');
|
|
356
|
+
// Every parent segment must be an existing non-symlink directory at the
|
|
357
|
+
// base commit; modify never creates directories.
|
|
358
|
+
let parent = pluginRoot;
|
|
359
|
+
for (const segment of segments.slice(0, -1)) {
|
|
360
|
+
parent = join(parent, segment);
|
|
361
|
+
const metadata = await lstat(parent).catch((error) => {
|
|
362
|
+
if (error.code === 'ENOENT')
|
|
363
|
+
return undefined;
|
|
364
|
+
throw error;
|
|
365
|
+
});
|
|
366
|
+
if (metadata === undefined || metadata.isSymbolicLink() || !metadata.isDirectory()) {
|
|
367
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', `prepared file parent directory must already exist and must not be a symlink: ${JSON.stringify(normalized)}`);
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
const target = join(parent, segments[segments.length - 1]);
|
|
371
|
+
const outside = relative(pluginRoot, target);
|
|
372
|
+
if (outside === '' || outside.startsWith('..') || isAbsolute(outside)) {
|
|
373
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', `prepared file path escapes the plugin tree: ${JSON.stringify(file.path)}`);
|
|
374
|
+
}
|
|
375
|
+
const targetMetadata = await lstat(target).catch((error) => {
|
|
376
|
+
if (error.code === 'ENOENT')
|
|
377
|
+
return undefined;
|
|
378
|
+
throw error;
|
|
379
|
+
});
|
|
380
|
+
if (targetMetadata !== undefined && targetMetadata.isSymbolicLink()) {
|
|
381
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', `symlinked source path is forbidden: ${JSON.stringify(normalized)}`);
|
|
382
|
+
}
|
|
383
|
+
let handle;
|
|
384
|
+
try {
|
|
385
|
+
handle = await open(target, fsConstants.O_WRONLY | fsConstants.O_CREAT | fsConstants.O_TRUNC | fsConstants.O_NOFOLLOW, 0o644);
|
|
386
|
+
}
|
|
387
|
+
catch (error) {
|
|
388
|
+
// O_NOFOLLOW reports a trailing symlink as ELOOP.
|
|
389
|
+
if (error.code === 'ELOOP') {
|
|
390
|
+
throw new ControlPlaneCliError('SOURCE_BOUNDARY', `symlinked source path is forbidden: ${JSON.stringify(normalized)}`);
|
|
391
|
+
}
|
|
392
|
+
throw error;
|
|
393
|
+
}
|
|
394
|
+
try {
|
|
395
|
+
await handle.truncate(0);
|
|
396
|
+
await handle.writeFile(file.content, 'utf8');
|
|
397
|
+
}
|
|
398
|
+
finally {
|
|
399
|
+
await handle.close();
|
|
400
|
+
}
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
/**
|
|
404
|
+
* A prepared modify worktree is garbage only while its plan is still waiting on
|
|
405
|
+
* the owner (pending/approved) and the plan's TTL has elapsed. Plans that
|
|
406
|
+
* reached ready-for-human-review or a release phase are retained for the
|
|
407
|
+
* owner's release workflow.
|
|
408
|
+
*/
|
|
409
|
+
export function preparedWorktreeIsGarbage(plan, now) {
|
|
410
|
+
return GC_ELIGIBLE_SOURCE_STATUSES.has(plan.status) && plan.expiresAt < now;
|
|
411
|
+
}
|
|
412
|
+
/** Parse `git worktree list --porcelain` into canonical linked-worktree paths. */
|
|
413
|
+
export async function linkedWorktrees(repository, environment) {
|
|
414
|
+
const porcelain = await runLocalCommand('git', ['worktree', 'list', '--porcelain'], repository, environment, { capture: true, maximumOutput: MAX_COMMAND_OUTPUT_BYTES });
|
|
415
|
+
return porcelain.split('\n').filter(line => line.startsWith('worktree ')).map(line => resolve(line.slice('worktree '.length)));
|
|
416
|
+
}
|
|
417
|
+
/**
|
|
418
|
+
* Remove a prepared worktree registered against `repository`. Idempotent: an
|
|
419
|
+
* already-unregistered or missing directory resolves successfully after
|
|
420
|
+
* pruning. The caller is responsible for proving the path is still inside the
|
|
421
|
+
* control-plane state root.
|
|
422
|
+
*/
|
|
423
|
+
export async function pruneRegisteredWorktree(input) {
|
|
424
|
+
try {
|
|
425
|
+
await runLocalCommand('git', ['worktree', 'remove', '--force', input.worktree], input.repository, input.environment);
|
|
426
|
+
}
|
|
427
|
+
catch {
|
|
428
|
+
await rm(input.worktree, { recursive: true, force: true });
|
|
429
|
+
}
|
|
430
|
+
await runLocalCommand('git', ['worktree', 'prune'], input.repository, input.environment).catch(() => undefined);
|
|
431
|
+
}
|
|
432
|
+
/**
|
|
433
|
+
* Remove prepared modify worktrees whose plans expired while still waiting on
|
|
434
|
+
* the owner. Every removed path must (1) belong to a modify plan, (2) be a
|
|
435
|
+
* descendant of the control-plane state root and (3) still be a linked
|
|
436
|
+
* worktree of the plan's repository; anything outside those proofs is left
|
|
437
|
+
* untouched. Idempotent. Shared by the service and the owner CLI.
|
|
438
|
+
*/
|
|
439
|
+
export async function gcPreparedModifyWorktrees(input) {
|
|
440
|
+
const stateRoot = resolve(join(input.statePath, 'source-worktrees'));
|
|
441
|
+
const removed = [];
|
|
442
|
+
for (const plan of input.store.listModifySourcePlans()) {
|
|
443
|
+
if (!preparedWorktreeIsGarbage(plan, input.now))
|
|
444
|
+
continue;
|
|
445
|
+
const worktree = resolve(plan.worktree);
|
|
446
|
+
const inside = relative(stateRoot, worktree);
|
|
447
|
+
if (inside === '' || inside.startsWith('..') || isAbsolute(inside))
|
|
448
|
+
continue;
|
|
449
|
+
const linked = await linkedWorktrees(plan.repository, input.environment).catch(() => []);
|
|
450
|
+
if (!linked.includes(worktree))
|
|
451
|
+
continue;
|
|
452
|
+
input.store.expirePreparedSourcePlan({ planId: plan.id, expectedRevision: plan.revision, now: input.now });
|
|
453
|
+
await pruneRegisteredWorktree({ repository: plan.repository, worktree, environment: input.environment });
|
|
454
|
+
removed.push(worktree);
|
|
455
|
+
}
|
|
456
|
+
return Object.freeze({ removed: Object.freeze(removed) });
|
|
457
|
+
}
|
|
458
|
+
//# sourceMappingURL=source-workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"source-workspace.js","sourceRoot":"","sources":["../src/source-workspace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAE,SAAS,IAAI,WAAW,EAAE,MAAM,SAAS,CAAA;AAClD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAA;AAC5E,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAA;AAChC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,WAAW,CAAA;AACnF,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAA;AAIlD,8CAA8C;AAC9C,oDAAoD;AACpD,+BAA+B;AAE/B,MAAM,kBAAkB,GAAG,mBAAmB,CAAA;AAE9C;;;;;GAKG;AACH,MAAM,2BAA2B,GAAwB,IAAI,GAAG,CAAC,CAAC,kBAAkB,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC,CAAA;AAC7G,MAAM,kBAAkB,GAAG,EAAE,CAAA;AAC7B,MAAM,uBAAuB,GAAG,MAAM,CAAA;AACtC,MAAM,wBAAwB,GAAG,OAAO,CAAA;AACxC,MAAM,wBAAwB,GAAG,SAAS,CAAA;AAC1C,MAAM,kBAAkB,GAAG,KAAK,CAAA;AAEhC;;;GAGG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAwB,IAAI,GAAG,CAAC;IACpE,kBAAkB,EAAE,gBAAgB;IACpC,sBAAsB,EAAE,MAAM;IAC9B,sBAAsB,EAAE,QAAQ;IAChC,oBAAoB,EAAE,WAAW;IACjC,2BAA2B,EAAE,QAAQ;IACrC,8BAA8B,EAAE,QAAQ;IACxC,kBAAkB,EAAE,iCAAiC;IACrD,qBAAqB,EAAE,WAAW;IAClC,qBAAqB,EAAE,cAAc;IACrC,sBAAsB,EAAE,oBAAoB;CAC7C,CAAC,CAAA;AAaF,MAAM,UAAU,+BAA+B,CAAC,IAAY;IAC1D,IAAI,yBAAyB,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,IAAI,oBAAoB,CAAC,iBAAiB,EAAE,UAAU,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,wEAAwE,CAAC,CAAA;IAC3J,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,OAAuB,EAAE,WAA8B;IAClG,MAAM,UAAU,GAAG,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,cAAc,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;QAC5G,GAAG,CAAC,WAAW,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,CAAA;IAC5G,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAA;IAC9B,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,SAAS,CAAC,CAAC;YAAC,MAAM,KAAK,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC;YAAC,MAAM,SAAS,GAAG,MAAM,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAA;YACpI,IAAI,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;mBACpG,CAAC,GAAG,KAAK,SAAS,IAAI,KAAK,CAAC,GAAG,KAAK,CAAC,IAAI,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,IAAI,SAAS,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC;gBAAE,OAAO,SAAS,CAAA;QACjJ,CAAC;QAAC,MAAM,CAAC,CAAC,oBAAoB,CAAC,CAAC;IAClC,CAAC;IACD,MAAM,IAAI,oBAAoB,CAAC,iBAAiB,EAAE,oBAAoB,OAAO,4BAA4B,CAAC,CAAA;AAC5G,CAAC;AAED,MAAM,0BAA0B,GAAG,MAAM,CAAA;AACzC,MAAM,4BAA4B,GAAG,MAAM,CAAA;AAkB3C,KAAK,UAAU,eAAe,CAAC,OAAuB,EAAE,IAAuB,EAAE,GAAW,EAC1F,WAA8B,EAAE,UAA2B,EAAE;IAC7D,MAAM,UAAU,GAAG,MAAM,sBAAsB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAA;IACrE,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,KAAK,CAAA;IACxC,MAAM,aAAa,GAAG,OAAO,CAAC,aAAa,IAAI,4BAA4B,CAAA;IAC3E,MAAM,SAAS,GAAG,OAAO,CAAC,SAAS,IAAI,0BAA0B,CAAA;IACjE,OAAO,IAAI,OAAO,CAAC,CAAC,cAAc,EAAE,MAAM,EAAE,EAAE;QAC5C,OAAO,CAAC,MAAM,EAAE,cAAc,EAAE,CAAA;QAChC,MAAM,KAAK,GAAG,KAAK,CAAC,UAAU,EAAE,IAAI,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAA;QACjH,MAAM,MAAM,GAAa,EAAE,CAAA;QAC3B,MAAM,YAAY,GAAa,EAAE,CAAA;QACjC,IAAI,WAAW,GAAG,CAAC,CAAC;QAAC,IAAI,WAAW,GAAG,CAAC,CAAC;QAAC,IAAI,WAAW,GAAG,KAAK,CAAC;QAAC,IAAI,QAAQ,GAAG,KAAK,CAAA;QACvF,KAAK,CAAC,MAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACzC,IAAI,CAAC,OAAO;gBAAE,OAAM,CAAC,yFAAyF;YAC9G,WAAW,IAAI,KAAK,CAAC,MAAM,CAAA;YAC3B,IAAI,WAAW,GAAG,aAAa,EAAE,CAAC;gBAAC,IAAI,CAAC,WAAW,EAAE,CAAC;oBAAC,WAAW,GAAG,IAAI,CAAC;oBAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA;gBAAC,CAAC;YAAC,CAAC;;gBAC/F,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;QACzB,CAAC,CAAC,CAAA;QACF,KAAK,CAAC,MAAO,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACzC,uEAAuE;YACvE,qDAAqD;YACrD,WAAW,IAAI,KAAK,CAAC,MAAM,CAAC;YAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YACrD,OAAO,YAAY,CAAC,MAAM,GAAG,CAAC,IAAI,WAAW,GAAG,YAAY,CAAC,CAAC,CAAE,CAAC,MAAM,IAAI,kBAAkB,EAAE,CAAC;gBAC9F,WAAW,IAAI,YAAY,CAAC,CAAC,CAAE,CAAC,MAAM,CAAC;gBAAC,YAAY,CAAC,KAAK,EAAE,CAAA;YAC9D,CAAC;QACH,CAAC,CAAC,CAAA;QACF,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,CAAA;QAC1B,MAAM,MAAM,GAAG,GAAS,EAAE,GAAG,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAA,CAAC,CAAC,CAAA;QACpD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,GAAG,QAAQ,GAAG,IAAI,CAAC,CAAC,MAAM,EAAE,CAAA,CAAC,CAAC,EAAE,SAAS,CAAC,CAAA;QACxE,OAAO,CAAC,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;QACjE,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,oBAAoB,CAAC,iBAAiB,EAAE,SAAS,OAAO,kBAAkB,CAAC,CAAC,CAAA,CAAC,CAAC,CAAC,CAAA;QACjM,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,EAAE;YACzB,YAAY,CAAC,KAAK,CAAC,CAAC;YAAC,OAAO,CAAC,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;YACzE,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAA;YACvC,MAAM,YAAY,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YAAC,MAAM,UAAU,GAAG,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAA;YAC5F,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,kBAAkB,CAAC,CAAA;YAC1F,MAAM,SAAS,GAAG,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;YACvG,IAAI,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;gBAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAAC,OAAM;YAAC,CAAC;YACtE,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,CAAC,IAAI,oBAAoB,CAAC,kBAAkB,EAAE,SAAS,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,iBAAiB,SAAS,oBAAoB,SAAS,GAAG,CAAC,CAAC,CAAA;gBACjK,OAAM;YACR,CAAC;YACD,IAAI,WAAW,EAAE,CAAC;gBAChB,MAAM,CAAC,IAAI,oBAAoB,CAAC,uBAAuB,EAAE,SAAS,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,iBAAiB,aAAa,2BAA2B,SAAS,GAAG,CAAC,CAAC,CAAA;gBACjL,OAAM;YACR,CAAC;YACD,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBACf,MAAM,CAAC,IAAI,oBAAoB,CAAC,iBAAiB,EAC/C,SAAS,OAAO,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,IAAI,SAAS,SAAS,IAAI,UAAU,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,CAAA;gBAChJ,OAAM;YACR,CAAC;YACD,cAAc,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAA;QACzF,CAAC,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAuB,EAAE,IAAuB,EAAE,GAAW,EAChG,WAA8B,EAAE,UAA2B,EAAE;IAC7D,OAAO,CAAC,MAAM,eAAe,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,EAAE,GAAG,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,YAAY,CAAA;AAC7G,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,OAAuB,EAAE,IAAuB,EAAE,GAAW,EACjG,WAA8B,EAAE,UAA2B,EAAE;IAC7D,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,OAAO,CAAC,CAAA;IAC9E,OAAO,OAAO,CAAC,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;AACtD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,QAAgB,EAAE,UAAkB,EAAE,WAA8B,EAAE,MAAoB;IACjI,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,KAAK,EAAE,CAAC,qBAAqB,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,cAAc;QACvH,aAAa,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,wBAAwB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;IAC3J,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,KAAK,EAAE,CAAC,qBAAqB,EAAE,IAAI,EAAE,sBAAsB,EAAE,UAAU,EAAE,UAAU;QACzH,oBAAoB,EAAE,IAAI,CAAC,EAAE,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,wBAAwB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;IAChJ,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,OAAO,GAAG,SAAS,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;AAClF,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY,EAAE,IAAY,EAAE,OAA4B,QAAQ;IAChG,MAAM,UAAU,GAAG,WAAW,IAAI,EAAE,CAAA;IACpC,MAAM,gBAAgB,GAAG,IAAI,KAAK,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,UAAU,GAAG,CAAC,CAAA;IACjF,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,gBAAgB,IAAI,IAAI,KAAK,kBAAkB,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAA;AACjG,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,QAAgB,EAAE,UAAkB,EAAE,UAA6B,EAC7G,WAA8B,EAAE,YAAqB,EAAE,MAAoB;IAC3E,MAAM,SAAS,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,2BAA2B,CAAC,CAAC,CAAA;IAC5E,IAAI,CAAC;QACH,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;QACzF,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,KAAK,EAAE,CAAC;YAAE,MAAM,IAAI,oBAAoB,CAAC,iBAAiB,EAAE,iCAAiC,CAAC,CAAA;QACjJ,MAAM,mBAAmB,GAAG,EAAE,GAAG,WAAW,EAAE,cAAc,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,CAAA;QACxF,MAAM,eAAe,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,YAAY,IAAI,UAAU,CAAC,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAChI,IAAI,YAAY,KAAK,SAAS;YAAE,MAAM,eAAe,CAAC,KAAK,EAAE,CAAC,qBAAqB,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,EAAE,QAAQ,EAAE,mBAAmB,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAA;QAC9K,MAAM,IAAI,GAAG,MAAM,eAAe,CAAC,KAAK,EAAE,CAAC,qBAAqB,EAAE,IAAI,EAAE,sBAAsB,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI;YACzH,IAAI,EAAE,GAAG,KAAK,CAAC,EAAE,QAAQ,EAAE,mBAAmB,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,wBAAwB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAC5I,MAAM,KAAK,GAAG,MAAM,eAAe,CAAC,KAAK,EAAE,CAAC,qBAAqB,EAAE,IAAI,EAAE,sBAAsB,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU;YAC7H,cAAc,EAAE,YAAY,EAAE,UAAU,EAAE,IAAI,EAAE,GAAG,KAAK,CAAC,EAAE,QAAQ,EAAE,mBAAmB,EACxF,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,wBAAwB,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;QAC5F,MAAM,OAAO,GAAG,GAAG,UAAU,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAA;QAC3D,OAAO;YACL,iBAAiB,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;YACjH,kBAAkB,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,uBAAuB,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SACrH,CAAA;IACH,CAAC;YAAS,CAAC;QAAC,MAAM,EAAE,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IAAC,CAAC;AACrE,CAAC;AAED,0FAA0F;AAC1F,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAC,IAAsB,EAAE,WAA8B,EACvG,MAAoB;IACpB,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,WAAW,IAAI,CAAC,IAAI,EAAE;WACjH,MAAM,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,IAAI,CAAC,UAAU,IAAI,MAAM,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC5G,MAAM,IAAI,oBAAoB,CAAC,iBAAiB,EAAE,wCAAwC,CAAC,CAAA;IAC7F,CAAC;IACD,IAAI,CAAC,MAAM,eAAe,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,IAAI,CAAC,UAAU,EAAE,CAAC;QACnK,MAAM,IAAI,oBAAoB,CAAC,iBAAiB,EAAE,gCAAgC,CAAC,CAAA;IACrF,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,kBAAkB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,MAAM,CAAC,CAAA;IAC7F,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;QACzE,MAAM,IAAI,oBAAoB,CAAC,iBAAiB,EAAE,qDAAqD,CAAC,CAAA;IAC1G,CAAC;IACD,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC,CAAA;IACvH,MAAM,EAAE,cAAc,EAAE,CAAA;IACxB,IAAI,OAAO,CAAC,iBAAiB,KAAK,IAAI,CAAC,WAAW,CAAC,UAAU,IAAI,OAAO,CAAC,kBAAkB,KAAK,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC;QAC7H,MAAM,IAAI,oBAAoB,CAAC,iBAAiB,EAAE,iCAAiC,CAAC,CAAA;IACtF,CAAC;IACD,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,KAAK,UAAU,oBAAoB,CAAC,IAAY;IAC9C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,CAAA;IAClC,MAAM,GAAG,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAA;IAC9B,IAAI,QAAQ,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE;WACnD,CAAC,GAAG,KAAK,SAAS,IAAI,QAAQ,CAAC,GAAG,KAAK,CAAC,IAAI,QAAQ,CAAC,GAAG,KAAK,GAAG,CAAC;WACjE,CAAC,QAAQ,CAAC,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC;QACnC,MAAM,IAAI,oBAAoB,CAAC,kBAAkB,EAAE,0BAA0B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAA;IAClJ,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,KAE5C;IACC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC;QAAE,MAAM,IAAI,oBAAoB,CAAC,kBAAkB,EAAE,wCAAwC,CAAC,CAAA;IAC3I,MAAM,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IAC9D,MAAM,oBAAoB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IAC3C,MAAM,UAAU,GAAG,MAAM,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;IACnD,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,UAAU;QAAE,MAAM,IAAI,oBAAoB,CAAC,iBAAiB,EAAE,mCAAmC,CAAC,CAAA;IAC9H,MAAM,QAAQ,GAAG,CAAC,MAAM,eAAe,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC,UAAU,WAAW,CAAC,EAAE,UAAU,EAClH,KAAK,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;IAC/C,IAAI,QAAQ,KAAK,KAAK,CAAC,UAAU;QAAE,MAAM,IAAI,oBAAoB,CAAC,iBAAiB,EAAE,uCAAuC,CAAC,CAAA;IAC7H,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;QAAE,MAAM,IAAI,oBAAoB,CAAC,iBAAiB,EAAE,+BAA+B,CAAC,CAAA;IACpL,MAAM,QAAQ,GAAG,KAAK,CAAC,YAAY,KAAK,SAAS;QAC/C,CAAC,CAAC,MAAM,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,YAAY,CAAC,CAAA;IACjG,6EAA6E;IAC7E,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS;QAAE,MAAM,KAAK,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IAC5E,IAAI,CAAC;QACH,MAAM,eAAe,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,WAAW,CAAC,CAAA;IAC1H,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS;YAAE,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;QAC1F,qEAAqE;QACrE,2EAA2E;QAC3E,MAAM,KAAK,CAAA;IACb,CAAC;IACD,IAAI,OAAO,GAAG,KAAK,CAAA;IACnB,MAAM,MAAM,GAAG,KAAK,IAAmB,EAAE;QACvC,IAAI,OAAO;YAAE,OAAM;QACnB,IAAI,KAAK,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YACrC,MAAM,uBAAuB,CAAC,EAAE,GAAG,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAA;YACjE,OAAO,GAAG,IAAI,CAAA;YACd,OAAM;QACR,CAAC;QACD,OAAO,GAAG,IAAI,CAAA;QACd,IAAI,CAAC;YACH,MAAM,eAAe,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,WAAW,CAAC,CAAA;YACxG,MAAM,eAAe,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;QAC3G,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;YACpD,MAAM,eAAe,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;QAC3G,CAAC;IACH,CAAC,CAAA;IACD,OAAO,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAA;AACvD,CAAC;AAED,iFAAiF;AACjF,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,KAE7C;IACC,IAAI,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC;WACnD,CAAC,8BAA8B,CAAC,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC5F,MAAM,IAAI,oBAAoB,CAAC,iBAAiB,EAAE,8CAA8C,CAAC,CAAA;IACnG,CAAC;IACD,MAAM,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IAC9D,MAAM,oBAAoB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;IAC3C,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,KAA4B,EAAE,EAAE;QAClF,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAA;QAC7C,MAAM,KAAK,CAAA;IACb,CAAC,CAAC,CAAA;IACF,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,oBAAoB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;QAC1C,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;QAC/I,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,YAAY,KAAK,CAAC,QAAQ,EAAE,CAAC,CAAA;QAC/G,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;YAC/B,MAAM,IAAI,oBAAoB,CAAC,iBAAiB,EAAE,yEAAyE,CAAC,CAAA;QAC9H,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,QAAQ,KAAK,CAAC,UAAU,EAAE,CAAC;gBAAE,MAAM,IAAI,oBAAoB,CAAC,iBAAiB,EAAE,wCAAwC,CAAC,CAAA;YAC/J,MAAM,MAAM,GAAG,KAAK,EAAE,GAAW,EAAmB,EAAE,CAAC,CAAC,MAAM,eAAe,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,wBAAwB,EAAE,kBAAkB,CAAC,EAAE,GAAG,EAAE,KAAK,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;YACpM,MAAM,GAAG,GAAG,CAAC,MAAM,eAAe,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,iBAAiB,CAAC,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAA;YACzI,IAAI,GAAG,KAAK,KAAK,CAAC,QAAQ,IAAI,MAAM,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,KAAK,MAAM,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC;gBAAE,MAAM,IAAI,oBAAoB,CAAC,iBAAiB,EAAE,8CAA8C,CAAC,CAAA;YAChM,MAAM,eAAe,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,WAAW,CAAC,CAAA;QACtH,CAAC;IACH,CAAC;IACD,MAAM,eAAe,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,WAAW,CAAC,CAAA;IACxF,MAAM,OAAO,GAAG,MAAM,eAAe,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,EAAE,IAAI,CAAC,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;IAC/I,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,KAA4B,EAAE,EAAE;QAC5F,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAA;QACzC,MAAM,KAAK,CAAA;IACb,CAAC,CAAC,CAAA;IACF,IAAI,OAAO,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,YAAY,KAAK,CAAC,QAAQ,EAAE,CAAC;QAAE,MAAM,IAAI,oBAAoB,CAAC,iBAAiB,EAAE,sCAAsC,CAAC,CAAA;AACtK,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,KAE5C;IACC,MAAM,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,KAAK,CAAA;IACvC,yBAAyB,CAAC,KAAK,CAAC,CAAA;IAChC,MAAM,yBAAyB,CAAC,QAAQ,EAAE,IAAI,EAAE,KAAK,CAAC,CAAA;AACxD,CAAC;AAED,uEAAuE;AACvE,MAAM,UAAU,yBAAyB,CAAC,KAAkC;IAC1E,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,oBAAoB,CAAC,kBAAkB,EAAE,iCAAiC,CAAC,CAAA;IAChH,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,IAAI,KAAK,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;QAC1D,MAAM,IAAI,oBAAoB,CAAC,kBAAkB,EAAE,yCAAyC,kBAAkB,QAAQ,CAAC,CAAA;IACzH,CAAC;IACD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAA;IAC9B,IAAI,UAAU,GAAG,CAAC,CAAA;IAClB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ;YAAE,MAAM,IAAI,oBAAoB,CAAC,kBAAkB,EAAE,kDAAkD,CAAC,CAAA;QAC1N,MAAM,UAAU,GAAW,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;QACrD,IAAI,UAAU,KAAK,EAAE,IAAI,UAAU,CAAC,UAAU,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC;eACvE,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,KAAK,EAAE,IAAI,OAAO,KAAK,GAAG,IAAI,OAAO,KAAK,IAAI,CAAC,EAAE,CAAC;YAClG,MAAM,IAAI,oBAAoB,CAAC,iBAAiB,EAAE,+CAA+C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC/H,CAAC;QACD,IAAI,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,KAAK,gBAAgB,IAAI,OAAO,KAAK,aAAa,IAAI,OAAO,KAAK,MAAM,CAAC,EAAE,CAAC;YAC3H,MAAM,IAAI,oBAAoB,CAAC,iBAAiB,EAAE,mDAAmD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACnI,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC;YAAE,MAAM,IAAI,oBAAoB,CAAC,kBAAkB,EAAE,iCAAiC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;QAC3I,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,CAAA;QACpB,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QACrD,IAAI,KAAK,GAAG,uBAAuB;YAAE,MAAM,IAAI,oBAAoB,CAAC,kBAAkB,EAAE,iBAAiB,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,gBAAgB,uBAAuB,aAAa,CAAC,CAAA;QACxL,UAAU,IAAI,KAAK,CAAA;QACnB,IAAI,UAAU,GAAG,wBAAwB;YAAE,MAAM,IAAI,oBAAoB,CAAC,kBAAkB,EAAE,6BAA6B,wBAAwB,mBAAmB,CAAC,CAAA;IACzK,CAAC;AACH,CAAC;AAED,KAAK,UAAU,yBAAyB,CAAC,QAAgB,EAAE,IAAY,EAAE,KAAkC;IACzG,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,CAAA;IACrD,MAAM,YAAY,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,CAAC,KAAK,CAAC,CAAC,KAA4B,EAAE,EAAE;QAClF,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,SAAS,CAAA;QAC7C,MAAM,KAAK,CAAA;IACb,CAAC,CAAC,CAAA;IACF,IAAI,YAAY,KAAK,SAAS,IAAI,YAAY,CAAC,cAAc,EAAE,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,EAAE,CAAC;QAC/F,MAAM,IAAI,oBAAoB,CAAC,iBAAiB,EAAE,UAAU,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,4FAA4F,CAAC,CAAA;IAC/K,CAAC;IACD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAA;QAC7C,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACtC,wEAAwE;QACxE,iDAAiD;QACjD,IAAI,MAAM,GAAG,UAAU,CAAA;QACvB,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5C,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;YAC9B,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,KAA4B,EAAE,EAAE;gBAC1E,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;oBAAE,OAAO,SAAS,CAAA;gBAC7C,MAAM,KAAK,CAAA;YACb,CAAC,CAAC,CAAA;YACF,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,CAAC,cAAc,EAAE,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC;gBACnF,MAAM,IAAI,oBAAoB,CAAC,iBAAiB,EAAE,gFAAgF,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;YACjK,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAE,CAAC,CAAA;QAC3D,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC,CAAA;QAC5C,IAAI,OAAO,KAAK,EAAE,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;YACtE,MAAM,IAAI,oBAAoB,CAAC,iBAAiB,EAAE,+CAA+C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QAC/H,CAAC;QACD,MAAM,cAAc,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,KAA4B,EAAE,EAAE;YAChF,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,SAAS,CAAA;YAC7C,MAAM,KAAK,CAAA;QACb,CAAC,CAAC,CAAA;QACF,IAAI,cAAc,KAAK,SAAS,IAAI,cAAc,CAAC,cAAc,EAAE,EAAE,CAAC;YACpE,MAAM,IAAI,oBAAoB,CAAC,iBAAiB,EAAE,uCAAuC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;QACxH,CAAC;QACD,IAAI,MAAM,CAAA;QACV,IAAI,CAAC;YACH,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,EACxB,WAAW,CAAC,QAAQ,GAAG,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,UAAU,EAAE,KAAK,CAAC,CAAA;QACrG,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,kDAAkD;YAClD,IAAK,KAA+B,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBACtD,MAAM,IAAI,oBAAoB,CAAC,iBAAiB,EAAE,uCAAuC,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;YACxH,CAAC;YACD,MAAM,KAAK,CAAA;QACb,CAAC;QACD,IAAI,CAAC;YAAC,MAAM,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAAC,MAAM,MAAM,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;QAAC,CAAC;gBAAS,CAAC;YAAC,MAAM,MAAM,CAAC,KAAK,EAAE,CAAA;QAAC,CAAC;IACjH,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,yBAAyB,CAAC,IAA2C,EAAE,GAAW;IAChG,OAAO,2BAA2B,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,GAAG,GAAG,CAAA;AAC7E,CAAC;AAED,kFAAkF;AAClF,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,UAAkB,EAAE,WAA8B;IACtF,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,MAAM,EAAE,aAAa,CAAC,EAAE,UAAU,EAC5F,WAAW,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,wBAAwB,EAAE,CAAC,CAAA;IAC1E,OAAO,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,CAAA;AAChI,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,KAE7C;IACC,IAAI,CAAC;QACH,MAAM,eAAe,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,QAAQ,EAAE,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,WAAW,CAAC,CAAA;IACtH,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,EAAE,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;IAC5D,CAAC;IACD,MAAM,eAAe,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAA;AACjH,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,KAK/C;IACC,MAAM,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC,CAAA;IACpE,MAAM,OAAO,GAAa,EAAE,CAAA;IAC5B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,CAAC,qBAAqB,EAAwB,EAAE,CAAC;QAC7E,IAAI,CAAC,yBAAyB,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC;YAAE,SAAQ;QACzD,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;QACvC,MAAM,MAAM,GAAG,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAA;QAC5C,IAAI,MAAM,KAAK,EAAE,IAAI,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,UAAU,CAAC,MAAM,CAAC;YAAE,SAAQ;QAC5E,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,KAAK,CAAC,GAAsB,EAAE,CAAC,EAAE,CAAC,CAAA;QAC3G,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC;YAAE,SAAQ;QACxC,KAAK,CAAC,KAAK,CAAC,wBAAwB,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,EAAE,gBAAgB,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,CAAA;QAC1G,MAAM,uBAAuB,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAA;QACxG,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACxB,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;AAC3D,CAAC"}
|
package/lib/sqlite.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { DatabaseSync } from 'node:sqlite';
|
|
2
|
-
export declare const controlPlaneSchemaVersion =
|
|
2
|
+
export declare const controlPlaneSchemaVersion = 23;
|
|
3
3
|
export declare function controlPlaneOperationReceiptDigest(idempotencyKey: string, operation: string, inputDigest: string, resultJson: string, createdAt: number): string;
|
|
4
4
|
export declare class ControlPlaneDatabaseError extends Error {
|
|
5
5
|
readonly code: 'invalid-path' | 'schema-too-new' | 'unsafe-file';
|
package/lib/sqlite.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../src/sqlite.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,eAAO,MAAM,yBAAyB,KAAK,CAAA;
|
|
1
|
+
{"version":3,"file":"sqlite.d.ts","sourceRoot":"","sources":["../src/sqlite.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,eAAO,MAAM,yBAAyB,KAAK,CAAA;AAyC3C,wBAAgB,kCAAkC,CAAC,cAAc,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,EAC/G,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAE/C;AAED,qBAAa,yBAA0B,SAAQ,KAAK;IACtC,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,gBAAgB,GAAG,aAAa;gBAAvD,IAAI,EAAE,cAAc,GAAG,gBAAgB,GAAG,aAAa,EAAE,OAAO,EAAE,MAAM;CAI9F;AAmjCD,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,CAoDnE"}
|