@taliesinb/mash 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +275 -2
- package/bin/mash.ts +253 -0
- package/dist/bin/mash.d.ts +39 -0
- package/dist/bin/mash.d.ts.map +1 -0
- package/dist/bin/mash.js +281 -0
- package/dist/bin/mash.js.map +1 -0
- package/dist/src/analysis/analyze.d.ts +97 -0
- package/dist/src/analysis/analyze.d.ts.map +1 -0
- package/dist/src/analysis/analyze.js +1406 -0
- package/dist/src/analysis/analyze.js.map +1 -0
- package/dist/src/analysis/fs.d.ts +39 -0
- package/dist/src/analysis/fs.d.ts.map +1 -0
- package/dist/src/analysis/fs.js +117 -0
- package/dist/src/analysis/fs.js.map +1 -0
- package/dist/src/analysis/outputs.d.ts +16 -0
- package/dist/src/analysis/outputs.d.ts.map +1 -0
- package/dist/src/analysis/outputs.js +277 -0
- package/dist/src/analysis/outputs.js.map +1 -0
- package/dist/src/analysis/value.d.ts +76 -0
- package/dist/src/analysis/value.d.ts.map +1 -0
- package/dist/src/analysis/value.js +248 -0
- package/dist/src/analysis/value.js.map +1 -0
- package/dist/src/behaviors/defs/core.d.ts +15 -0
- package/dist/src/behaviors/defs/core.d.ts.map +1 -0
- package/dist/src/behaviors/defs/core.js +1084 -0
- package/dist/src/behaviors/defs/core.js.map +1 -0
- package/dist/src/behaviors/defs/devtools.d.ts +9 -0
- package/dist/src/behaviors/defs/devtools.d.ts.map +1 -0
- package/dist/src/behaviors/defs/devtools.js +432 -0
- package/dist/src/behaviors/defs/devtools.js.map +1 -0
- package/dist/src/behaviors/defs/macos.d.ts +12 -0
- package/dist/src/behaviors/defs/macos.d.ts.map +1 -0
- package/dist/src/behaviors/defs/macos.js +454 -0
- package/dist/src/behaviors/defs/macos.js.map +1 -0
- package/dist/src/behaviors/defs/tools.d.ts +9 -0
- package/dist/src/behaviors/defs/tools.d.ts.map +1 -0
- package/dist/src/behaviors/defs/tools.js +639 -0
- package/dist/src/behaviors/defs/tools.js.map +1 -0
- package/dist/src/behaviors/dsl.d.ts +95 -0
- package/dist/src/behaviors/dsl.d.ts.map +1 -0
- package/dist/src/behaviors/dsl.js +267 -0
- package/dist/src/behaviors/dsl.js.map +1 -0
- package/dist/src/behaviors/index.d.ts +12 -0
- package/dist/src/behaviors/index.d.ts.map +1 -0
- package/dist/src/behaviors/index.js +18 -0
- package/dist/src/behaviors/index.js.map +1 -0
- package/dist/src/behaviors/registry.d.ts +45 -0
- package/dist/src/behaviors/registry.d.ts.map +1 -0
- package/dist/src/behaviors/registry.js +266 -0
- package/dist/src/behaviors/registry.js.map +1 -0
- package/dist/src/behaviors/roles.d.ts +29 -0
- package/dist/src/behaviors/roles.d.ts.map +1 -0
- package/dist/src/behaviors/roles.js +198 -0
- package/dist/src/behaviors/roles.js.map +1 -0
- package/dist/src/behaviors/types.d.ts +120 -0
- package/dist/src/behaviors/types.d.ts.map +1 -0
- package/dist/src/behaviors/types.js +12 -0
- package/dist/src/behaviors/types.js.map +1 -0
- package/dist/src/index.d.ts +27 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +24 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/integrations/deepsea.d.ts +121 -0
- package/dist/src/integrations/deepsea.d.ts.map +1 -0
- package/dist/src/integrations/deepsea.js +199 -0
- package/dist/src/integrations/deepsea.js.map +1 -0
- package/dist/src/machine.d.ts +139 -0
- package/dist/src/machine.d.ts.map +1 -0
- package/dist/src/machine.js +400 -0
- package/dist/src/machine.js.map +1 -0
- package/dist/src/parser/ast.d.ts +369 -0
- package/dist/src/parser/ast.d.ts.map +1 -0
- package/dist/src/parser/ast.js +17 -0
- package/dist/src/parser/ast.js.map +1 -0
- package/dist/src/parser/parser.d.ts +48 -0
- package/dist/src/parser/parser.d.ts.map +1 -0
- package/dist/src/parser/parser.js +1950 -0
- package/dist/src/parser/parser.js.map +1 -0
- package/dist/src/policy/effects.d.ts +86 -0
- package/dist/src/policy/effects.d.ts.map +1 -0
- package/dist/src/policy/effects.js +53 -0
- package/dist/src/policy/effects.js.map +1 -0
- package/dist/src/policy/policy.d.ts +130 -0
- package/dist/src/policy/policy.d.ts.map +1 -0
- package/dist/src/policy/policy.js +532 -0
- package/dist/src/policy/policy.js.map +1 -0
- package/dist/src/printer/doc.d.ts +151 -0
- package/dist/src/printer/doc.d.ts.map +1 -0
- package/dist/src/printer/doc.js +409 -0
- package/dist/src/printer/doc.js.map +1 -0
- package/dist/src/printer/highlight.d.ts +53 -0
- package/dist/src/printer/highlight.d.ts.map +1 -0
- package/dist/src/printer/highlight.js +339 -0
- package/dist/src/printer/highlight.js.map +1 -0
- package/dist/src/printer/html.d.ts +72 -0
- package/dist/src/printer/html.d.ts.map +1 -0
- package/dist/src/printer/html.js +423 -0
- package/dist/src/printer/html.js.map +1 -0
- package/dist/src/printer/print.d.ts +63 -0
- package/dist/src/printer/print.d.ts.map +1 -0
- package/dist/src/printer/print.js +484 -0
- package/dist/src/printer/print.js.map +1 -0
- package/dist/src/printer/summary.d.ts +50 -0
- package/dist/src/printer/summary.d.ts.map +1 -0
- package/dist/src/printer/summary.js +621 -0
- package/dist/src/printer/summary.js.map +1 -0
- package/dist/src/trace/events.d.ts +183 -0
- package/dist/src/trace/events.d.ts.map +1 -0
- package/dist/src/trace/events.js +9 -0
- package/dist/src/trace/events.js.map +1 -0
- package/dist/src/trace/progress.d.ts +58 -0
- package/dist/src/trace/progress.d.ts.map +1 -0
- package/dist/src/trace/progress.js +83 -0
- package/dist/src/trace/progress.js.map +1 -0
- package/dist/src/vm/arith.d.ts +29 -0
- package/dist/src/vm/arith.d.ts.map +1 -0
- package/dist/src/vm/arith.js +258 -0
- package/dist/src/vm/arith.js.map +1 -0
- package/dist/src/vm/builtins.d.ts +31 -0
- package/dist/src/vm/builtins.d.ts.map +1 -0
- package/dist/src/vm/builtins.js +1773 -0
- package/dist/src/vm/builtins.js.map +1 -0
- package/dist/src/vm/emulate.d.ts +75 -0
- package/dist/src/vm/emulate.d.ts.map +1 -0
- package/dist/src/vm/emulate.js +380 -0
- package/dist/src/vm/emulate.js.map +1 -0
- package/dist/src/vm/expand.d.ts +68 -0
- package/dist/src/vm/expand.d.ts.map +1 -0
- package/dist/src/vm/expand.js +744 -0
- package/dist/src/vm/expand.js.map +1 -0
- package/dist/src/vm/external.d.ts +34 -0
- package/dist/src/vm/external.d.ts.map +1 -0
- package/dist/src/vm/external.js +228 -0
- package/dist/src/vm/external.js.map +1 -0
- package/dist/src/vm/fifo.d.ts +66 -0
- package/dist/src/vm/fifo.d.ts.map +1 -0
- package/dist/src/vm/fifo.js +232 -0
- package/dist/src/vm/fifo.js.map +1 -0
- package/dist/src/vm/interp.d.ts +209 -0
- package/dist/src/vm/interp.d.ts.map +1 -0
- package/dist/src/vm/interp.js +1641 -0
- package/dist/src/vm/interp.js.map +1 -0
- package/dist/src/vm/io.d.ts +180 -0
- package/dist/src/vm/io.d.ts.map +1 -0
- package/dist/src/vm/io.js +502 -0
- package/dist/src/vm/io.js.map +1 -0
- package/dist/src/vm/pattern.d.ts +46 -0
- package/dist/src/vm/pattern.d.ts.map +1 -0
- package/dist/src/vm/pattern.js +498 -0
- package/dist/src/vm/pattern.js.map +1 -0
- package/dist/src/vm/proc.d.ts +94 -0
- package/dist/src/vm/proc.d.ts.map +1 -0
- package/dist/src/vm/proc.js +130 -0
- package/dist/src/vm/proc.js.map +1 -0
- package/dist/src/vm/state.d.ts +104 -0
- package/dist/src/vm/state.d.ts.map +1 -0
- package/dist/src/vm/state.js +233 -0
- package/dist/src/vm/state.js.map +1 -0
- package/dist/src/vm/test.d.ts +11 -0
- package/dist/src/vm/test.d.ts.map +1 -0
- package/dist/src/vm/test.js +277 -0
- package/dist/src/vm/test.js.map +1 -0
- package/package.json +63 -4
- package/src/analysis/analyze.ts +1395 -0
- package/src/analysis/fs.ts +121 -0
- package/src/analysis/outputs.ts +242 -0
- package/src/analysis/value.ts +264 -0
- package/src/behaviors/defs/core.ts +970 -0
- package/src/behaviors/defs/devtools.ts +400 -0
- package/src/behaviors/defs/macos.ts +426 -0
- package/src/behaviors/defs/tools.ts +596 -0
- package/src/behaviors/dsl.ts +293 -0
- package/src/behaviors/index.ts +19 -0
- package/src/behaviors/registry.ts +261 -0
- package/src/behaviors/roles.ts +187 -0
- package/src/behaviors/types.ts +127 -0
- package/src/index.ts +27 -0
- package/src/integrations/deepsea.ts +259 -0
- package/src/machine.ts +483 -0
- package/src/parser/ast.ts +472 -0
- package/src/parser/parser.ts +1826 -0
- package/src/policy/effects.ts +102 -0
- package/src/policy/policy.ts +578 -0
- package/src/printer/doc.ts +454 -0
- package/src/printer/highlight.ts +283 -0
- package/src/printer/html.ts +441 -0
- package/src/printer/print.ts +528 -0
- package/src/printer/summary.ts +601 -0
- package/src/trace/events.ts +102 -0
- package/src/trace/progress.ts +119 -0
- package/src/vm/arith.ts +236 -0
- package/src/vm/builtins.ts +1590 -0
- package/src/vm/emulate.ts +337 -0
- package/src/vm/expand.ts +721 -0
- package/src/vm/external.ts +265 -0
- package/src/vm/fifo.ts +226 -0
- package/src/vm/interp.ts +1623 -0
- package/src/vm/io.ts +570 -0
- package/src/vm/pattern.ts +477 -0
- package/src/vm/proc.ts +147 -0
- package/src/vm/state.ts +267 -0
- package/src/vm/test.ts +253 -0
|
@@ -0,0 +1,532 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Sandbox policy and effect checking.
|
|
3
|
+
*
|
|
4
|
+
* The file vocabulary mirrors the DeepSea harness (`SandboxExecutionPolicy`
|
|
5
|
+
* in dsh-sandbox): `read-only`, `workspace-write` (workspace root, extra
|
|
6
|
+
* roots, temp areas) and `danger-full-access`. mash adds optional network,
|
|
7
|
+
* command and read restrictions that the OS sandbox cannot express.
|
|
8
|
+
*
|
|
9
|
+
* Checking works on abstract paths: a verdict is `deny` only when EVERY
|
|
10
|
+
* possible concretisation violates the policy, `allow` only when every one is
|
|
11
|
+
* permitted, and `unknown` otherwise. Unknown substrings that may contain
|
|
12
|
+
* `/` or `..` therefore never produce a definite verdict — the runtime check
|
|
13
|
+
* on the concrete value decides.
|
|
14
|
+
*/
|
|
15
|
+
import * as fs from 'node:fs';
|
|
16
|
+
import * as os from 'node:os';
|
|
17
|
+
import * as path from 'node:path';
|
|
18
|
+
import { describe, isHole, isNameLike, isSlashFree } from "../analysis/value.js";
|
|
19
|
+
import { describeEffect } from "./effects.js";
|
|
20
|
+
/**
|
|
21
|
+
* Where credentials live: private keys, cloud and CLI tokens, keychains and
|
|
22
|
+
* password stores. Files and directories, relative to `home` unless absolute.
|
|
23
|
+
*/
|
|
24
|
+
export const CREDENTIAL_LOCATIONS = [
|
|
25
|
+
'.ssh', '.gnupg', '.aws', '.azure', '.config/gcloud', '.config/gh', '.config/hub', '.config/op', '.config/doctl',
|
|
26
|
+
'.kube', '.docker/config.json', '.netrc', '.git-credentials', '.npmrc', '.yarnrc.yml', '.pypirc', '.gem/credentials',
|
|
27
|
+
'.cargo/credentials', '.cargo/credentials.toml', '.terraform.d/credentials.tfrc.json', '.vault-token', '.password-store',
|
|
28
|
+
'.local/share/keyrings', 'Library/Keychains', '/Library/Keychains', '/etc/shadow', '/etc/gshadow', '/private/etc/master.passwd',
|
|
29
|
+
];
|
|
30
|
+
/**
|
|
31
|
+
* Non-secret files inside credential locations that stay readable (agents
|
|
32
|
+
* debug ssh setups): public keys, `config`, `known_hosts`, `authorized_keys`.
|
|
33
|
+
* Listing a credential directory (`ls ~/.ssh`) is allowed too.
|
|
34
|
+
*/
|
|
35
|
+
export const CREDENTIAL_READ_EXCEPTIONS = ['.ssh/*.pub', '.ssh/config', '.ssh/known_hosts', '.ssh/known_hosts.old', '.ssh/authorized_keys'];
|
|
36
|
+
/** Is every concretisation of `alt` one of the non-secret files (`dir/*.pub` or an exact name)? */
|
|
37
|
+
function isCredentialException(alt, home) {
|
|
38
|
+
for (const ex of CREDENTIAL_READ_EXCEPTIONS) {
|
|
39
|
+
const full = path.join(home, ex);
|
|
40
|
+
const star = full.indexOf('*');
|
|
41
|
+
if (star === -1) {
|
|
42
|
+
if (alt.length === 1 && typeof alt[0] === 'string' && path.normalize(alt[0]) === full)
|
|
43
|
+
return true;
|
|
44
|
+
continue;
|
|
45
|
+
}
|
|
46
|
+
// `dir/*suffix`: a literal `dir/`, then name-like holes and literals without `/`, ending in `suffix`
|
|
47
|
+
const dir = full.slice(0, star);
|
|
48
|
+
const suffix = full.slice(star + 1);
|
|
49
|
+
const first = alt[0];
|
|
50
|
+
if (typeof first !== 'string' || !first.startsWith(dir))
|
|
51
|
+
continue;
|
|
52
|
+
const rest = [first.slice(dir.length), ...alt.slice(1)];
|
|
53
|
+
if (rest.some((s) => (typeof s === 'string' ? s.includes('/') : !isNameLike(s.type))))
|
|
54
|
+
continue;
|
|
55
|
+
const last = rest[rest.length - 1];
|
|
56
|
+
const holes = rest.some((s) => typeof s !== 'string');
|
|
57
|
+
// a literal ending (with something before it), or a glob match whose pattern has the ending
|
|
58
|
+
if (typeof last === 'string' ? last.endsWith(suffix) && (holes || last.length > suffix.length) : last.pattern?.endsWith(suffix) === true)
|
|
59
|
+
return true;
|
|
60
|
+
}
|
|
61
|
+
return false;
|
|
62
|
+
}
|
|
63
|
+
/** {@link CREDENTIAL_LOCATIONS} resolved against a home directory. */
|
|
64
|
+
export function credentialReadRoots(home = os.homedir()) {
|
|
65
|
+
return CREDENTIAL_LOCATIONS.map((p) => (p.startsWith('/') ? p : path.join(home, p)));
|
|
66
|
+
}
|
|
67
|
+
/** Every read-denied root of a policy (explicit ones, plus credential stores when enabled), with realpaths. */
|
|
68
|
+
export function readDeniedRoots(policy) {
|
|
69
|
+
const roots = [...(policy.readDeniedRoots ?? [])];
|
|
70
|
+
if (policy.readDenyCredentials)
|
|
71
|
+
roots.push(...credentialReadRoots(policy.home ?? os.homedir()));
|
|
72
|
+
return withRealpaths(roots);
|
|
73
|
+
}
|
|
74
|
+
/** Paths every mode may write: sinks and terminals. */
|
|
75
|
+
const ALWAYS_WRITABLE = ['/dev/null', '/dev/stdout', '/dev/stderr', '/dev/tty', '/dev/fd', '/dev/zero'];
|
|
76
|
+
function tempRoots() {
|
|
77
|
+
const roots = new Set(['/tmp', '/private/tmp', '/var/tmp', '/private/var/tmp']);
|
|
78
|
+
const t = os.tmpdir();
|
|
79
|
+
roots.add(t);
|
|
80
|
+
try {
|
|
81
|
+
roots.add(fs.realpathSync(t));
|
|
82
|
+
}
|
|
83
|
+
catch {
|
|
84
|
+
// ignore
|
|
85
|
+
}
|
|
86
|
+
if (process.env.TMPDIR)
|
|
87
|
+
roots.add(process.env.TMPDIR.replace(/\/+$/, ''));
|
|
88
|
+
return [...roots];
|
|
89
|
+
}
|
|
90
|
+
function withRealpaths(roots) {
|
|
91
|
+
const out = new Set();
|
|
92
|
+
for (const r of roots) {
|
|
93
|
+
const n = path.resolve(r);
|
|
94
|
+
out.add(n);
|
|
95
|
+
try {
|
|
96
|
+
out.add(fs.realpathSync(n));
|
|
97
|
+
}
|
|
98
|
+
catch {
|
|
99
|
+
// ignore
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return [...out];
|
|
103
|
+
}
|
|
104
|
+
export function writableRoots(policy) {
|
|
105
|
+
if (policy.mode !== 'workspace-write')
|
|
106
|
+
return [];
|
|
107
|
+
const roots = [policy.workspaceRoot, ...(policy.additionalWritableRoots ?? [])];
|
|
108
|
+
if (policy.writableTemp !== false)
|
|
109
|
+
roots.push(...tempRoots());
|
|
110
|
+
return withRealpaths(roots);
|
|
111
|
+
}
|
|
112
|
+
const MAX_SHAPE_BRANCHES = 64;
|
|
113
|
+
/**
|
|
114
|
+
* Shapes of one alternative of an absolute (or cwd-relative already joined)
|
|
115
|
+
* path. Usually one shape; a component that may be `..` (a `segment` hole on
|
|
116
|
+
* its own) branches into the possible resolutions.
|
|
117
|
+
*/
|
|
118
|
+
export function altShapes(alt) {
|
|
119
|
+
const hint = alt.map((s) => (typeof s === 'string' ? s : `⟨${s.origin}⟩`)).join('');
|
|
120
|
+
const unknown = [{ kind: 'unknown', hint }];
|
|
121
|
+
if (alt.length === 0)
|
|
122
|
+
return unknown;
|
|
123
|
+
let start = [];
|
|
124
|
+
let i = 0;
|
|
125
|
+
const first = alt[0];
|
|
126
|
+
if (isHole(first)) {
|
|
127
|
+
if (first.type === 'path' && first.under) {
|
|
128
|
+
start = path.resolve(first.under).split('/').filter(Boolean);
|
|
129
|
+
start.push({ pattern: true, deep: true });
|
|
130
|
+
i = 1;
|
|
131
|
+
}
|
|
132
|
+
else {
|
|
133
|
+
return unknown;
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
else if (!first.startsWith('/')) {
|
|
137
|
+
return unknown;
|
|
138
|
+
}
|
|
139
|
+
// split into raw components
|
|
140
|
+
const raws = [];
|
|
141
|
+
let text = '';
|
|
142
|
+
let holes = false;
|
|
143
|
+
let nameLike = false;
|
|
144
|
+
const flush = () => {
|
|
145
|
+
if (!holes)
|
|
146
|
+
raws.push({ kind: 'lit', text });
|
|
147
|
+
else if (nameLike || /[^.]/.test(text))
|
|
148
|
+
raws.push({ kind: 'name' });
|
|
149
|
+
else
|
|
150
|
+
raws.push({ kind: 'ambiguous' });
|
|
151
|
+
text = '';
|
|
152
|
+
holes = false;
|
|
153
|
+
nameLike = false;
|
|
154
|
+
};
|
|
155
|
+
for (; i < alt.length; i++) {
|
|
156
|
+
const s = alt[i];
|
|
157
|
+
if (typeof s === 'string') {
|
|
158
|
+
for (const ch of s) {
|
|
159
|
+
if (ch === '/')
|
|
160
|
+
flush();
|
|
161
|
+
else
|
|
162
|
+
text += ch;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
else if (isSlashFree(s.type)) {
|
|
166
|
+
holes = true;
|
|
167
|
+
if (isNameLike(s.type))
|
|
168
|
+
nameLike = true;
|
|
169
|
+
}
|
|
170
|
+
else {
|
|
171
|
+
return unknown;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
flush();
|
|
175
|
+
// resolve `.`/`..`, branching on ambiguous components
|
|
176
|
+
const out = [];
|
|
177
|
+
let branches = 0;
|
|
178
|
+
const walk = (k, comps) => {
|
|
179
|
+
if (k === raws.length) {
|
|
180
|
+
if (++branches > MAX_SHAPE_BRANCHES)
|
|
181
|
+
return false;
|
|
182
|
+
out.push(finish(comps));
|
|
183
|
+
return true;
|
|
184
|
+
}
|
|
185
|
+
const r = raws[k];
|
|
186
|
+
const pop = () => {
|
|
187
|
+
const top = comps[comps.length - 1];
|
|
188
|
+
if (top !== undefined && typeof top !== 'string' && top.deep)
|
|
189
|
+
return null; // may escape the anchor
|
|
190
|
+
return comps.slice(0, -1);
|
|
191
|
+
};
|
|
192
|
+
if (r.kind === 'lit') {
|
|
193
|
+
if (r.text === '' || r.text === '.')
|
|
194
|
+
return walk(k + 1, comps);
|
|
195
|
+
if (r.text === '..') {
|
|
196
|
+
const next = pop();
|
|
197
|
+
return next !== null && walk(k + 1, next);
|
|
198
|
+
}
|
|
199
|
+
return walk(k + 1, [...comps, r.text]);
|
|
200
|
+
}
|
|
201
|
+
if (r.kind === 'name')
|
|
202
|
+
return walk(k + 1, [...comps, { pattern: true }]);
|
|
203
|
+
// ambiguous: a name, `.`/empty, or `..`
|
|
204
|
+
const next = pop();
|
|
205
|
+
return next !== null && walk(k + 1, [...comps, { pattern: true }]) && walk(k + 1, comps) && walk(k + 1, next);
|
|
206
|
+
};
|
|
207
|
+
if (!walk(0, start))
|
|
208
|
+
return unknown;
|
|
209
|
+
return out;
|
|
210
|
+
}
|
|
211
|
+
/** All-literal components are an exact path; otherwise the literal prefix up to the first pattern is a `below` directory. */
|
|
212
|
+
function finish(comps) {
|
|
213
|
+
const prefix = [];
|
|
214
|
+
for (const c of comps) {
|
|
215
|
+
if (typeof c !== 'string')
|
|
216
|
+
break;
|
|
217
|
+
prefix.push(c);
|
|
218
|
+
}
|
|
219
|
+
const dir = '/' + prefix.join('/');
|
|
220
|
+
return prefix.length === comps.length ? { kind: 'exact', path: dir } : { kind: 'below', dir };
|
|
221
|
+
}
|
|
222
|
+
/** The first shape of one alternative (see {@link altShapes}). */
|
|
223
|
+
export function altShape(alt) {
|
|
224
|
+
return altShapes(alt)[0];
|
|
225
|
+
}
|
|
226
|
+
export function shapesOf(v) {
|
|
227
|
+
return v.alts.flatMap(altShapes);
|
|
228
|
+
}
|
|
229
|
+
function isInside(p, root) {
|
|
230
|
+
return p === root || p.startsWith(root.endsWith('/') ? root : root + '/');
|
|
231
|
+
}
|
|
232
|
+
/** Is a shape inside `root`? */
|
|
233
|
+
function shapeInside(shape, root) {
|
|
234
|
+
switch (shape.kind) {
|
|
235
|
+
case 'exact':
|
|
236
|
+
return isInside(shape.path, root) ? 'yes' : 'no';
|
|
237
|
+
case 'below':
|
|
238
|
+
if (isInside(shape.dir, root))
|
|
239
|
+
return 'yes';
|
|
240
|
+
if (isInside(root, shape.dir))
|
|
241
|
+
return 'maybe';
|
|
242
|
+
return 'no';
|
|
243
|
+
case 'unknown':
|
|
244
|
+
return 'maybe';
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
function insideAny(shape, roots) {
|
|
248
|
+
let maybe = false;
|
|
249
|
+
for (const r of roots) {
|
|
250
|
+
const v = shapeInside(shape, r);
|
|
251
|
+
if (v === 'yes')
|
|
252
|
+
return 'yes';
|
|
253
|
+
if (v === 'maybe')
|
|
254
|
+
maybe = true;
|
|
255
|
+
}
|
|
256
|
+
return maybe ? 'maybe' : 'no';
|
|
257
|
+
}
|
|
258
|
+
function lexists(p) {
|
|
259
|
+
try {
|
|
260
|
+
fs.lstatSync(p);
|
|
261
|
+
return true;
|
|
262
|
+
}
|
|
263
|
+
catch {
|
|
264
|
+
return false;
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
function isFile(p) {
|
|
268
|
+
try {
|
|
269
|
+
return fs.statSync(p).isFile();
|
|
270
|
+
}
|
|
271
|
+
catch {
|
|
272
|
+
return false;
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
/** Resolve symlinks of the deepest existing ancestor of a concrete path. */
|
|
276
|
+
export function realpathLoose(p) {
|
|
277
|
+
let cur = p;
|
|
278
|
+
const tail = [];
|
|
279
|
+
for (;;) {
|
|
280
|
+
try {
|
|
281
|
+
const real = fs.realpathSync(cur);
|
|
282
|
+
return tail.length === 0 ? real : path.join(real, ...tail.reverse());
|
|
283
|
+
}
|
|
284
|
+
catch {
|
|
285
|
+
const parent = path.dirname(cur);
|
|
286
|
+
if (parent === cur)
|
|
287
|
+
return p;
|
|
288
|
+
tail.push(path.basename(cur));
|
|
289
|
+
cur = parent;
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
function checkWritePath(p, policy, opts) {
|
|
294
|
+
if (policy.mode === 'danger-full-access')
|
|
295
|
+
return { verdict: 'allow', reason: 'danger-full-access' };
|
|
296
|
+
const shapes = shapesOf(p);
|
|
297
|
+
const roots = [...writableRoots(policy), ...ALWAYS_WRITABLE];
|
|
298
|
+
let allYes = true;
|
|
299
|
+
let allNo = true;
|
|
300
|
+
for (const s of shapes) {
|
|
301
|
+
let v = insideAny(s, roots);
|
|
302
|
+
if (opts.runtime && s.kind === 'exact' && v === 'yes' && !ALWAYS_WRITABLE.some((r) => isInside(s.path, r))) {
|
|
303
|
+
// a symlink inside the workspace may point outside it
|
|
304
|
+
const real = realpathLoose(s.path);
|
|
305
|
+
if (real !== s.path)
|
|
306
|
+
v = insideAny({ kind: 'exact', path: real }, roots);
|
|
307
|
+
}
|
|
308
|
+
if (v !== 'yes')
|
|
309
|
+
allYes = false;
|
|
310
|
+
if (v !== 'no')
|
|
311
|
+
allNo = false;
|
|
312
|
+
}
|
|
313
|
+
const where = policy.mode === 'read-only' ? 'the policy is read-only' : `outside the writable roots (${[policy.workspaceRoot, ...(policy.additionalWritableRoots ?? [])].join(', ')}${policy.writableTemp !== false ? ', temp' : ''})`;
|
|
314
|
+
if (allYes)
|
|
315
|
+
return { verdict: 'allow', reason: 'inside a writable root' };
|
|
316
|
+
if (allNo)
|
|
317
|
+
return { verdict: 'deny', reason: `${describe(p)} is ${where}` };
|
|
318
|
+
return { verdict: 'unknown', reason: `${describe(p)} may be ${where}` };
|
|
319
|
+
}
|
|
320
|
+
/**
|
|
321
|
+
* Reads are denied inside read-denied roots. A recursive read (`grep -r`,
|
|
322
|
+
* `tar c`, `cp -r`) of a directory that contains a denied root reads into it,
|
|
323
|
+
* so it is denied too (`grep -r token ~`); when the directory is only possibly
|
|
324
|
+
* such a parent (an unknown path), it is `unknown`.
|
|
325
|
+
*/
|
|
326
|
+
function checkReadPath(p, policy, recursive, opts, names = false) {
|
|
327
|
+
const denied = readDeniedRoots(policy);
|
|
328
|
+
if (denied.length === 0)
|
|
329
|
+
return { verdict: 'allow', reason: 'reads are unrestricted' };
|
|
330
|
+
// listing names and metadata (find, ls -R, du) reveals no file contents
|
|
331
|
+
if (names)
|
|
332
|
+
return { verdict: 'allow', reason: 'lists names only' };
|
|
333
|
+
let anyMaybe = false;
|
|
334
|
+
let allYes = true;
|
|
335
|
+
const home = policy.home ?? os.homedir();
|
|
336
|
+
const shapes = p.alts.flatMap((alt) => (policy.readDenyCredentials && isCredentialException(alt, home) ? [] : altShapes(alt)));
|
|
337
|
+
if (shapes.length === 0)
|
|
338
|
+
return { verdict: 'allow', reason: 'a non-secret file in a credential location' };
|
|
339
|
+
for (const s of shapes) {
|
|
340
|
+
let v = insideAny(s, denied);
|
|
341
|
+
// listing a denied directory itself (`ls ~/.ssh`) reads names, not contents
|
|
342
|
+
if (v === 'yes' && !recursive && s.kind === 'exact' && denied.includes(s.path) && !isFile(s.path))
|
|
343
|
+
v = 'no';
|
|
344
|
+
// at runtime, a symlink may lead into a denied root
|
|
345
|
+
if (opts.runtime && s.kind === 'exact' && v === 'no') {
|
|
346
|
+
const real = realpathLoose(s.path);
|
|
347
|
+
if (real !== s.path) {
|
|
348
|
+
v = insideAny({ kind: 'exact', path: real }, denied);
|
|
349
|
+
if (v === 'no' && recursive && denied.some((r) => isInside(r, real)))
|
|
350
|
+
v = 'yes';
|
|
351
|
+
}
|
|
352
|
+
}
|
|
353
|
+
if (v === 'no' && recursive && s.kind === 'exact' && denied.some((r) => isInside(r, s.path)))
|
|
354
|
+
v = 'yes';
|
|
355
|
+
if (v !== 'yes')
|
|
356
|
+
allYes = false;
|
|
357
|
+
if (v !== 'no')
|
|
358
|
+
anyMaybe = true;
|
|
359
|
+
}
|
|
360
|
+
const what = 'a read-denied location';
|
|
361
|
+
if (allYes)
|
|
362
|
+
return { verdict: 'deny', reason: recursive ? `${describe(p)} is or contains ${what}` : `${describe(p)} is in ${what}` };
|
|
363
|
+
if (anyMaybe)
|
|
364
|
+
return { verdict: 'unknown', reason: `${describe(p)} may be in or contain ${what}` };
|
|
365
|
+
return { verdict: 'allow', reason: 'not in a read-denied location' };
|
|
366
|
+
}
|
|
367
|
+
// ---------------------------------------------------------------------------
|
|
368
|
+
// Network hosts
|
|
369
|
+
// ---------------------------------------------------------------------------
|
|
370
|
+
/**
|
|
371
|
+
* The host a network target names, when it is determined by the literal text
|
|
372
|
+
* of the value: `https://user@Host:8080/x` → `host`, `git@github.com:o/r` →
|
|
373
|
+
* `github.com`, `user@example.com` → `example.com`.
|
|
374
|
+
* Undefined when the host depends on an unknown part (`https://$H/x`), when
|
|
375
|
+
* there is none (`file:///x`), and for a bare word (`example.com`,
|
|
376
|
+
* `example.com/x`, `localhost:3000`): behaviors cannot always tell a host operand from an
|
|
377
|
+
* option's value (`ssh -i key host`, `git clone --depth 1 url`), so a bare
|
|
378
|
+
* word is never trusted for a definite verdict. Neither is anything that is
|
|
379
|
+
* not a host name or IP address (`BatchMode=yes`, `+short`, `8080`).
|
|
380
|
+
*/
|
|
381
|
+
export function targetHost(alt) {
|
|
382
|
+
const complete = alt.every((s) => typeof s === 'string');
|
|
383
|
+
const lit = typeof alt[0] === 'string' ? alt[0] : '';
|
|
384
|
+
const text = complete ? alt.join('') : lit;
|
|
385
|
+
// the literal part must reach past the end of the host (or be the whole value)
|
|
386
|
+
const upTo = (s, stops) => {
|
|
387
|
+
const m = stops.exec(s);
|
|
388
|
+
if (m)
|
|
389
|
+
return s.slice(0, m.index);
|
|
390
|
+
return complete ? s : undefined;
|
|
391
|
+
};
|
|
392
|
+
const scheme = /^([a-zA-Z][a-zA-Z0-9+.-]*):\/\//.exec(text);
|
|
393
|
+
let authority;
|
|
394
|
+
if (scheme) {
|
|
395
|
+
if (scheme[1].toLowerCase() === 'file')
|
|
396
|
+
return undefined;
|
|
397
|
+
authority = upTo(text.slice(scheme[0].length), /[/?#]/);
|
|
398
|
+
}
|
|
399
|
+
else {
|
|
400
|
+
// scp-like `user@host:path` (a `:` before any `/`), or `user@host`; without
|
|
401
|
+
// the `user@` it may be an option value (`ssh -L localhost:80:x:80 h`)
|
|
402
|
+
const scp = /^([^/:]*):(?!\/\/)/.exec(text);
|
|
403
|
+
authority = scp && !/^\[/.test(text) ? scp[1] : upTo(text, /[/?#]/);
|
|
404
|
+
if (authority !== undefined && !authority.includes('@'))
|
|
405
|
+
return undefined;
|
|
406
|
+
}
|
|
407
|
+
if (authority === undefined)
|
|
408
|
+
return undefined;
|
|
409
|
+
let host = authority.slice(authority.lastIndexOf('@') + 1);
|
|
410
|
+
if (host.startsWith('[')) {
|
|
411
|
+
const end = host.indexOf(']');
|
|
412
|
+
if (end === -1)
|
|
413
|
+
return undefined;
|
|
414
|
+
host = host.slice(1, end);
|
|
415
|
+
}
|
|
416
|
+
else
|
|
417
|
+
host = host.replace(/:\d*$/, '');
|
|
418
|
+
host = host.toLowerCase().replace(/\.$/, '');
|
|
419
|
+
const ipv6 = host.includes(':');
|
|
420
|
+
if (ipv6 ? !/^[0-9a-f:.]+$/.test(host) : !/^[a-z0-9_]([a-z0-9_-]*[a-z0-9_])?(\.[a-z0-9_]([a-z0-9_-]*[a-z0-9_])?)*$/.test(host) || /^\d+$/.test(host))
|
|
421
|
+
return undefined;
|
|
422
|
+
return host;
|
|
423
|
+
}
|
|
424
|
+
/** Does an allow-list entry match a host? */
|
|
425
|
+
export function hostMatches(host, entry) {
|
|
426
|
+
const e = entry.toLowerCase().replace(/\.$/, '');
|
|
427
|
+
if (e === '*')
|
|
428
|
+
return true;
|
|
429
|
+
if (e.startsWith('*.'))
|
|
430
|
+
return host.endsWith(e.slice(1)) && host.length > e.length - 1;
|
|
431
|
+
return host === e;
|
|
432
|
+
}
|
|
433
|
+
function checkHosts(target, allow) {
|
|
434
|
+
const list = allow.join(', ');
|
|
435
|
+
if (!target)
|
|
436
|
+
return { verdict: 'unknown', reason: `network access to hosts not known statically (allowed: ${list})` };
|
|
437
|
+
let allYes = true;
|
|
438
|
+
let allNo = true;
|
|
439
|
+
const bad = [];
|
|
440
|
+
for (const alt of target.alts) {
|
|
441
|
+
const host = targetHost(alt);
|
|
442
|
+
if (host === undefined) {
|
|
443
|
+
allYes = false;
|
|
444
|
+
allNo = false;
|
|
445
|
+
continue;
|
|
446
|
+
}
|
|
447
|
+
if (allow.some((e) => hostMatches(host, e)))
|
|
448
|
+
allNo = false;
|
|
449
|
+
else {
|
|
450
|
+
allYes = false;
|
|
451
|
+
bad.push(host);
|
|
452
|
+
}
|
|
453
|
+
}
|
|
454
|
+
if (allYes)
|
|
455
|
+
return { verdict: 'allow', reason: 'host allowed' };
|
|
456
|
+
if (allNo)
|
|
457
|
+
return { verdict: 'deny', reason: `network access to ${[...new Set(bad)].join(', ')} is not allowed (allowed: ${list})` };
|
|
458
|
+
return { verdict: 'unknown', reason: `network access to ${describe(target)} may not be allowed (allowed: ${list})` };
|
|
459
|
+
}
|
|
460
|
+
export function checkEffect(effect, policy, opts = {}) {
|
|
461
|
+
const f = (verdict, reason) => ({ effect, verdict, reason });
|
|
462
|
+
switch (effect.kind) {
|
|
463
|
+
case 'read': {
|
|
464
|
+
const r = checkReadPath(effect.path, policy, effect.recursive === true, opts, effect.names === true);
|
|
465
|
+
return f(effect.maybe && r.verdict === 'deny' ? 'unknown' : r.verdict, r.reason);
|
|
466
|
+
}
|
|
467
|
+
case 'write':
|
|
468
|
+
case 'delete': {
|
|
469
|
+
// `rm -f` of a path that does not exist does nothing
|
|
470
|
+
if (opts.runtime && effect.kind === 'delete' && effect.ifExists && policy.missingDeletes === 'allow' && effect.path.alts.every((a) => a.length === 1 && typeof a[0] === 'string' && !lexists(a[0]))) {
|
|
471
|
+
return f('allow', 'delete: nothing to delete (missing path, -f)');
|
|
472
|
+
}
|
|
473
|
+
const r = checkWritePath(effect.path, policy, opts);
|
|
474
|
+
const verb = effect.kind === 'delete' ? 'delete' : 'write';
|
|
475
|
+
if (effect.maybe && r.verdict === 'deny')
|
|
476
|
+
return f('unknown', `may ${verb}: ${r.reason}`);
|
|
477
|
+
return f(r.verdict, `${verb}: ${r.reason}`);
|
|
478
|
+
}
|
|
479
|
+
case 'network': {
|
|
480
|
+
if (policy.network === 'deny')
|
|
481
|
+
return f(effect.maybe ? 'unknown' : 'deny', `network access is denied (${describeEffect(effect)})`);
|
|
482
|
+
if (policy.network === undefined || policy.network === 'allow')
|
|
483
|
+
return f('allow', 'network allowed');
|
|
484
|
+
const r = checkHosts(effect.target, policy.network.allow);
|
|
485
|
+
return f(effect.maybe && r.verdict === 'deny' ? 'unknown' : r.verdict, r.reason);
|
|
486
|
+
}
|
|
487
|
+
case 'exec':
|
|
488
|
+
case 'chdir':
|
|
489
|
+
case 'process':
|
|
490
|
+
return f('allow', '');
|
|
491
|
+
case 'unknown':
|
|
492
|
+
if (policy.unknownCommands === 'deny' && policy.mode !== 'danger-full-access')
|
|
493
|
+
return f(effect.maybe ? 'unknown' : 'deny', `effects unknown: ${effect.detail}`);
|
|
494
|
+
return f('unknown', effect.detail);
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
export function checkCommandName(name, policy) {
|
|
498
|
+
const base = name.split('/').pop() ?? name;
|
|
499
|
+
if (policy.deniedCommands?.includes(base)) {
|
|
500
|
+
return { effect: { kind: 'exec', argv: [{ alts: [[name]] }] }, verdict: 'deny', reason: `command '${base}' is denied by policy` };
|
|
501
|
+
}
|
|
502
|
+
return null;
|
|
503
|
+
}
|
|
504
|
+
export function checkEffects(effects, policy, opts = {}) {
|
|
505
|
+
return effects.map((e) => checkEffect(e, policy, opts));
|
|
506
|
+
}
|
|
507
|
+
/** Denied command names among nested `exec` effects (a possible exec is only `unknown`). */
|
|
508
|
+
export function checkExecEffects(effects, policy) {
|
|
509
|
+
const out = [];
|
|
510
|
+
for (const e of effects) {
|
|
511
|
+
if (e.kind !== 'exec')
|
|
512
|
+
continue;
|
|
513
|
+
const first = e.argv[0];
|
|
514
|
+
const n = first && first.alts.length === 1 && first.alts[0].length === 1 && typeof first.alts[0][0] === 'string' ? first.alts[0][0] : undefined;
|
|
515
|
+
const f = n ? checkCommandName(n, policy) : null;
|
|
516
|
+
if (f)
|
|
517
|
+
out.push(e.maybe ? { effect: e, verdict: 'unknown', reason: `may run: ${f.reason}` } : { ...f, effect: e });
|
|
518
|
+
}
|
|
519
|
+
return out;
|
|
520
|
+
}
|
|
521
|
+
/** The most severe verdict. */
|
|
522
|
+
export function worstVerdict(findings) {
|
|
523
|
+
if (findings.some((f) => f.verdict === 'deny'))
|
|
524
|
+
return 'deny';
|
|
525
|
+
if (findings.some((f) => f.verdict === 'unknown'))
|
|
526
|
+
return 'unknown';
|
|
527
|
+
return 'allow';
|
|
528
|
+
}
|
|
529
|
+
export function defaultPolicy(workspaceRoot) {
|
|
530
|
+
return { mode: 'workspace-write', workspaceRoot, writableTemp: true, network: 'allow', unknownCommands: 'allow' };
|
|
531
|
+
}
|
|
532
|
+
//# sourceMappingURL=policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../../../src/policy/policy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AAEjC,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAA;AAEhF,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAwC7C;;;GAGG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAsB;IACrD,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,gBAAgB,EAAE,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,eAAe;IAChH,OAAO,EAAE,qBAAqB,EAAE,QAAQ,EAAE,kBAAkB,EAAE,QAAQ,EAAE,aAAa,EAAE,SAAS,EAAE,kBAAkB;IACpH,oBAAoB,EAAE,yBAAyB,EAAE,oCAAoC,EAAE,cAAc,EAAE,iBAAiB;IACxH,uBAAuB,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,aAAa,EAAE,cAAc,EAAE,4BAA4B;CAChI,CAAA;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAsB,CAAC,YAAY,EAAE,aAAa,EAAE,kBAAkB,EAAE,sBAAsB,EAAE,sBAAsB,CAAC,CAAA;AAE9J,mGAAmG;AACnG,SAAS,qBAAqB,CAAC,GAAU,EAAE,IAAY;IACrD,KAAK,MAAM,EAAE,IAAI,0BAA0B,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAA;QAChC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAC9B,IAAI,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC;YAChB,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAA;YAClG,SAAQ;QACV,CAAC;QACD,qGAAqG;QACrG,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,CAAA;QAC/B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,CAAC,CAAA;QACnC,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;QACpB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAQ;QACjE,MAAM,IAAI,GAAU,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;QAC9D,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;YAAE,SAAQ;QAC/F,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QAClC,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAA;QACrD,4FAA4F;QAC5F,IAAI,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,MAAM,CAAC,KAAK,IAAI;YAAE,OAAO,IAAI,CAAA;IACvJ,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,mBAAmB,CAAC,OAAe,EAAE,CAAC,OAAO,EAAE;IAC7D,OAAO,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAA;AACtF,CAAC;AAED,+GAA+G;AAC/G,MAAM,UAAU,eAAe,CAAC,MAAc;IAC5C,MAAM,KAAK,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,eAAe,IAAI,EAAE,CAAC,CAAC,CAAA;IACjD,IAAI,MAAM,CAAC,mBAAmB;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,mBAAmB,CAAC,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAA;IAC/F,OAAO,aAAa,CAAC,KAAK,CAAC,CAAA;AAC7B,CAAC;AAUD,uDAAuD;AACvD,MAAM,eAAe,GAAG,CAAC,WAAW,EAAE,aAAa,EAAE,aAAa,EAAE,UAAU,EAAE,SAAS,EAAE,WAAW,CAAC,CAAA;AAEvG,SAAS,SAAS;IAChB,MAAM,KAAK,GAAG,IAAI,GAAG,CAAS,CAAC,MAAM,EAAE,cAAc,EAAE,UAAU,EAAE,kBAAkB,CAAC,CAAC,CAAA;IACvF,MAAM,CAAC,GAAG,EAAE,CAAC,MAAM,EAAE,CAAA;IACrB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IACZ,IAAI,CAAC;QACH,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAA;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,SAAS;IACX,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM;QAAE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAA;IACzE,OAAO,CAAC,GAAG,KAAK,CAAC,CAAA;AACnB,CAAC;AAED,SAAS,aAAa,CAAC,KAAwB;IAC7C,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAA;IAC7B,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAA;QACzB,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;QACV,IAAI,CAAC;YACH,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAA;QAC7B,CAAC;QAAC,MAAM,CAAC;YACP,SAAS;QACX,CAAC;IACH,CAAC;IACD,OAAO,CAAC,GAAG,GAAG,CAAC,CAAA;AACjB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,MAAc;IAC1C,IAAI,MAAM,CAAC,IAAI,KAAK,iBAAiB;QAAE,OAAO,EAAE,CAAA;IAChD,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAC,CAAA;IAC/E,IAAI,MAAM,CAAC,YAAY,KAAK,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,SAAS,EAAE,CAAC,CAAA;IAC7D,OAAO,aAAa,CAAC,KAAK,CAAC,CAAA;AAC7B,CAAC;AAiCD,MAAM,kBAAkB,GAAG,EAAE,CAAA;AAE7B;;;;GAIG;AACH,MAAM,UAAU,SAAS,CAAC,GAAU;IAClC,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;IACnF,MAAM,OAAO,GAAgB,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IACxD,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,CAAA;IACpC,IAAI,KAAK,GAAW,EAAE,CAAA;IACtB,IAAI,CAAC,GAAG,CAAC,CAAA;IACT,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;IACpB,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC;QAClB,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC;YACzC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;YAC5D,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAA;YACzC,CAAC,GAAG,CAAC,CAAA;QACP,CAAC;aAAM,CAAC;YACN,OAAO,OAAO,CAAA;QAChB,CAAC;IACH,CAAC;SAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAClC,OAAO,OAAO,CAAA;IAChB,CAAC;IACD,4BAA4B;IAC5B,MAAM,IAAI,GAAc,EAAE,CAAA;IAC1B,IAAI,IAAI,GAAG,EAAE,CAAA;IACb,IAAI,KAAK,GAAG,KAAK,CAAA;IACjB,IAAI,QAAQ,GAAG,KAAK,CAAA;IACpB,MAAM,KAAK,GAAG,GAAS,EAAE;QACvB,IAAI,CAAC,KAAK;YAAE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAA;aACvC,IAAI,QAAQ,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAA;;YAC9D,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,CAAC,CAAA;QACrC,IAAI,GAAG,EAAE,CAAA;QACT,KAAK,GAAG,KAAK,CAAA;QACb,QAAQ,GAAG,KAAK,CAAA;IAClB,CAAC,CAAA;IACD,OAAO,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3B,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAA;QAChB,IAAI,OAAO,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC1B,KAAK,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;gBACnB,IAAI,EAAE,KAAK,GAAG;oBAAE,KAAK,EAAE,CAAA;;oBAClB,IAAI,IAAI,EAAE,CAAA;YACjB,CAAC;QACH,CAAC;aAAM,IAAI,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,KAAK,GAAG,IAAI,CAAA;YACZ,IAAI,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC;gBAAE,QAAQ,GAAG,IAAI,CAAA;QACzC,CAAC;aAAM,CAAC;YACN,OAAO,OAAO,CAAA;QAChB,CAAC;IACH,CAAC;IACD,KAAK,EAAE,CAAA;IACP,sDAAsD;IACtD,MAAM,GAAG,GAAgB,EAAE,CAAA;IAC3B,IAAI,QAAQ,GAAG,CAAC,CAAA;IAChB,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,KAAa,EAAW,EAAE;QACjD,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;YACtB,IAAI,EAAE,QAAQ,GAAG,kBAAkB;gBAAE,OAAO,KAAK,CAAA;YACjD,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAA;YACvB,OAAO,IAAI,CAAA;QACb,CAAC;QACD,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,MAAM,GAAG,GAAG,GAAkB,EAAE;YAC9B,MAAM,GAAG,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;YACnC,IAAI,GAAG,KAAK,SAAS,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,GAAG,CAAC,IAAI;gBAAE,OAAO,IAAI,CAAA,CAAC,wBAAwB;YAClG,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAA;QAC3B,CAAC,CAAA;QACD,IAAI,CAAC,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;YACrB,IAAI,CAAC,CAAC,IAAI,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,KAAK,GAAG;gBAAE,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAA;YAC9D,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;gBACpB,MAAM,IAAI,GAAG,GAAG,EAAE,CAAA;gBAClB,OAAO,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAA;YAC3C,CAAC;YACD,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;QACxC,CAAC;QACD,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QACxE,wCAAwC;QACxC,MAAM,IAAI,GAAG,GAAG,EAAE,CAAA;QAClB,OAAO,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAA;IAC/G,CAAC,CAAA;IACD,IAAI,CAAC,IAAI,CAAC,CAAC,EAAE,KAAK,CAAC;QAAE,OAAO,OAAO,CAAA;IACnC,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,6HAA6H;AAC7H,SAAS,MAAM,CAAC,KAAa;IAC3B,MAAM,MAAM,GAAa,EAAE,CAAA;IAC3B,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,MAAK;QAChC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IAChB,CAAC;IACD,MAAM,GAAG,GAAG,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;IAClC,OAAO,MAAM,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,CAAA;AAC/F,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,QAAQ,CAAC,GAAU;IACjC,OAAO,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAA;AAC1B,CAAC;AAED,MAAM,UAAU,QAAQ,CAAC,CAAS;IAChC,OAAO,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;AAClC,CAAC;AAED,SAAS,QAAQ,CAAC,CAAS,EAAE,IAAY;IACvC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,GAAG,CAAC,CAAA;AAC3E,CAAC;AAED,gCAAgC;AAChC,SAAS,WAAW,CAAC,KAAgB,EAAE,IAAY;IACjD,QAAQ,KAAK,CAAC,IAAI,EAAE,CAAC;QACnB,KAAK,OAAO;YACV,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAA;QAClD,KAAK,OAAO;YACV,IAAI,QAAQ,CAAC,KAAK,CAAC,GAAG,EAAE,IAAI,CAAC;gBAAE,OAAO,KAAK,CAAA;YAC3C,IAAI,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC;gBAAE,OAAO,OAAO,CAAA;YAC7C,OAAO,IAAI,CAAA;QACb,KAAK,SAAS;YACZ,OAAO,OAAO,CAAA;IAClB,CAAC;AACH,CAAC;AAED,SAAS,SAAS,CAAC,KAAgB,EAAE,KAAe;IAClD,IAAI,KAAK,GAAG,KAAK,CAAA;IACjB,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;QACtB,MAAM,CAAC,GAAG,WAAW,CAAC,KAAK,EAAE,CAAC,CAAC,CAAA;QAC/B,IAAI,CAAC,KAAK,KAAK;YAAE,OAAO,KAAK,CAAA;QAC7B,IAAI,CAAC,KAAK,OAAO;YAAE,KAAK,GAAG,IAAI,CAAA;IACjC,CAAC;IACD,OAAO,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAA;AAC/B,CAAC;AAED,SAAS,OAAO,CAAC,CAAS;IACxB,IAAI,CAAC;QACH,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;QACf,OAAO,IAAI,CAAA;IACb,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,SAAS,MAAM,CAAC,CAAS;IACvB,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,CAAA;IAChC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAA;IACd,CAAC;AACH,CAAC;AAED,4EAA4E;AAC5E,MAAM,UAAU,aAAa,CAAC,CAAS;IACrC,IAAI,GAAG,GAAG,CAAC,CAAA;IACX,MAAM,IAAI,GAAa,EAAE,CAAA;IACzB,SAAS,CAAC;QACR,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,CAAA;YACjC,OAAO,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;QACtE,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YAChC,IAAI,MAAM,KAAK,GAAG;gBAAE,OAAO,CAAC,CAAA;YAC5B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAA;YAC7B,GAAG,GAAG,MAAM,CAAA;QACd,CAAC;IACH,CAAC;AACH,CAAC;AAWD,SAAS,cAAc,CAAC,CAAS,EAAE,MAAc,EAAE,IAAkB;IACnE,IAAI,MAAM,CAAC,IAAI,KAAK,oBAAoB;QAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,oBAAoB,EAAE,CAAA;IACnG,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;IAC1B,MAAM,KAAK,GAAG,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,EAAE,GAAG,eAAe,CAAC,CAAA;IAC5D,IAAI,MAAM,GAAG,IAAI,CAAA;IACjB,IAAI,KAAK,GAAG,IAAI,CAAA;IAChB,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,KAAK,CAAC,CAAA;QAC3B,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAC3G,sDAAsD;YACtD,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;YAClC,IAAI,IAAI,KAAK,CAAC,CAAC,IAAI;gBAAE,CAAC,GAAG,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,KAAK,CAAC,CAAA;QAC1E,CAAC;QACD,IAAI,CAAC,KAAK,KAAK;YAAE,MAAM,GAAG,KAAK,CAAA;QAC/B,IAAI,CAAC,KAAK,IAAI;YAAE,KAAK,GAAG,KAAK,CAAA;IAC/B,CAAC;IACD,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,+BAA+B,CAAC,MAAM,CAAC,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,uBAAuB,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,YAAY,KAAK,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,GAAG,CAAA;IACtO,IAAI,MAAM;QAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAA;IACzE,IAAI,KAAK;QAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,OAAO,KAAK,EAAE,EAAE,CAAA;IAC3E,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,WAAW,KAAK,EAAE,EAAE,CAAA;AACzE,CAAC;AAED;;;;;GAKG;AACH,SAAS,aAAa,CAAC,CAAS,EAAE,MAAc,EAAE,SAAkB,EAAE,IAAkB,EAAE,KAAK,GAAG,KAAK;IACrG,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,CAAA;IACtC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,wBAAwB,EAAE,CAAA;IACtF,wEAAwE;IACxE,IAAI,KAAK;QAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAA;IAClE,IAAI,QAAQ,GAAG,KAAK,CAAA;IACpB,IAAI,MAAM,GAAG,IAAI,CAAA;IACjB,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC,OAAO,EAAE,CAAA;IACxC,MAAM,MAAM,GAAG,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,mBAAmB,IAAI,qBAAqB,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAA;IAC9H,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,4CAA4C,EAAE,CAAA;IAC1G,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,GAAG,SAAS,CAAC,CAAC,EAAE,MAAM,CAAC,CAAA;QAC5B,4EAA4E;QAC5E,IAAI,CAAC,KAAK,KAAK,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC;YAAE,CAAC,GAAG,IAAI,CAAA;QAC3G,oDAAoD;QACpD,IAAI,IAAI,CAAC,OAAO,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACrD,MAAM,IAAI,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;YAClC,IAAI,IAAI,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;gBACpB,CAAC,GAAG,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,MAAM,CAAC,CAAA;gBACpD,IAAI,CAAC,KAAK,IAAI,IAAI,SAAS,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC;oBAAE,CAAC,GAAG,KAAK,CAAA;YACjF,CAAC;QACH,CAAC;QACD,IAAI,CAAC,KAAK,IAAI,IAAI,SAAS,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YAAE,CAAC,GAAG,KAAK,CAAA;QACvG,IAAI,CAAC,KAAK,KAAK;YAAE,MAAM,GAAG,KAAK,CAAA;QAC/B,IAAI,CAAC,KAAK,IAAI;YAAE,QAAQ,GAAG,IAAI,CAAA;IACjC,CAAC;IACD,MAAM,IAAI,GAAG,wBAAwB,CAAA;IACrC,IAAI,MAAM;QAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,EAAE,CAAA;IACpI,IAAI,QAAQ;QAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,QAAQ,CAAC,CAAC,CAAC,yBAAyB,IAAI,EAAE,EAAE,CAAA;IAClG,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,+BAA+B,EAAE,CAAA;AACtE,CAAC;AAED,8EAA8E;AAC9E,gBAAgB;AAChB,8EAA8E;AAE9E;;;;;;;;;;GAUG;AACH,MAAM,UAAU,UAAU,CAAC,GAAU;IACnC,MAAM,QAAQ,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAA;IACxD,MAAM,GAAG,GAAG,OAAO,GAAG,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IACpD,MAAM,IAAI,GAAG,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAA;IAC1C,+EAA+E;IAC/E,MAAM,IAAI,GAAG,CAAC,CAAS,EAAE,KAAa,EAAsB,EAAE;QAC5D,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACvB,IAAI,CAAC;YAAE,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,CAAA;QACjC,OAAO,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;IACjC,CAAC,CAAA;IACD,MAAM,MAAM,GAAG,iCAAiC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC3D,IAAI,SAA6B,CAAA;IACjC,IAAI,MAAM,EAAE,CAAC;QACX,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM;YAAE,OAAO,SAAS,CAAA;QACxD,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,CAAA;IACzD,CAAC;SAAM,CAAC;QACN,4EAA4E;QAC5E,uEAAuE;QACvE,MAAM,GAAG,GAAG,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAC3C,SAAS,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAA;QACnE,IAAI,SAAS,KAAK,SAAS,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,OAAO,SAAS,CAAA;IAC3E,CAAC;IACD,IAAI,SAAS,KAAK,SAAS;QAAE,OAAO,SAAS,CAAA;IAC7C,IAAI,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;IAC1D,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACzB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;QAC7B,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,OAAO,SAAS,CAAA;QAChC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAA;IAC3B,CAAC;;QAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;IACvC,IAAI,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IAC5C,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;IAC/B,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,yEAAyE,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC;QAAE,OAAO,SAAS,CAAA;IACtK,OAAO,IAAI,CAAA;AACb,CAAC;AAED,6CAA6C;AAC7C,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,KAAa;IACrD,MAAM,CAAC,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAA;IAChD,IAAI,CAAC,KAAK,GAAG;QAAE,OAAO,IAAI,CAAA;IAC1B,IAAI,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,CAAA;IACtF,OAAO,IAAI,KAAK,CAAC,CAAA;AACnB,CAAC;AAED,SAAS,UAAU,CAAC,MAA0B,EAAE,KAAwB;IACtE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC7B,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,0DAA0D,IAAI,GAAG,EAAE,CAAA;IACrH,IAAI,MAAM,GAAG,IAAI,CAAA;IACjB,IAAI,KAAK,GAAG,IAAI,CAAA;IAChB,MAAM,GAAG,GAAa,EAAE,CAAA;IACxB,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,UAAU,CAAC,GAAG,CAAC,CAAA;QAC5B,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;YACvB,MAAM,GAAG,KAAK,CAAA;YACd,KAAK,GAAG,KAAK,CAAA;YACb,SAAQ;QACV,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;YAAE,KAAK,GAAG,KAAK,CAAA;aACrD,CAAC;YACJ,MAAM,GAAG,KAAK,CAAA;YACd,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;QAChB,CAAC;IACH,CAAC;IACD,IAAI,MAAM;QAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,cAAc,EAAE,CAAA;IAC/D,IAAI,KAAK;QAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,qBAAqB,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,6BAA6B,IAAI,GAAG,EAAE,CAAA;IACpI,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,qBAAqB,QAAQ,CAAC,MAAM,CAAC,iCAAiC,IAAI,GAAG,EAAE,CAAA;AACtH,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,MAAc,EAAE,MAAc,EAAE,OAAqB,EAAE;IACjF,MAAM,CAAC,GAAG,CAAC,OAAgB,EAAE,MAAc,EAAiB,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAA;IAC5F,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,MAAM,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,SAAS,KAAK,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,KAAK,IAAI,CAAC,CAAA;YACpG,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;QAClF,CAAC;QACD,KAAK,OAAO,CAAC;QACb,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,qDAAqD;YACrD,IAAI,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,cAAc,KAAK,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpM,OAAO,CAAC,CAAC,OAAO,EAAE,8CAA8C,CAAC,CAAA;YACnE,CAAC;YACD,MAAM,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,CAAA;YACnD,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAA;YAC1D,IAAI,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,KAAK,MAAM;gBAAE,OAAO,CAAC,CAAC,SAAS,EAAE,OAAO,IAAI,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAA;YACzF,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC,MAAM,EAAE,CAAC,CAAA;QAC7C,CAAC;QACD,KAAK,SAAS,CAAC,CAAC,CAAC;YACf,IAAI,MAAM,CAAC,OAAO,KAAK,MAAM;gBAAE,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,6BAA6B,cAAc,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;YAClI,IAAI,MAAM,CAAC,OAAO,KAAK,SAAS,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO;gBAAE,OAAO,CAAC,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAA;YACpG,MAAM,CAAC,GAAG,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAA;YACzD,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,CAAC,CAAA;QAClF,CAAC;QACD,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO,CAAC;QACb,KAAK,SAAS;YACZ,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAA;QACvB,KAAK,SAAS;YACZ,IAAI,MAAM,CAAC,eAAe,KAAK,MAAM,IAAI,MAAM,CAAC,IAAI,KAAK,oBAAoB;gBAAE,OAAO,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,EAAE,oBAAoB,MAAM,CAAC,MAAM,EAAE,CAAC,CAAA;YAC/J,OAAO,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,MAAM,CAAC,CAAA;IACtC,CAAC;AACH,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,MAAc;IAC3D,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,IAAI,CAAA;IAC1C,IAAI,MAAM,CAAC,cAAc,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,OAAO,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,YAAY,IAAI,uBAAuB,EAAE,CAAA;IACnI,CAAC;IACD,OAAO,IAAI,CAAA;AACb,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,OAAiB,EAAE,MAAc,EAAE,OAAqB,EAAE;IACrF,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC,CAAA;AACzD,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,gBAAgB,CAAC,OAAiB,EAAE,MAAc;IAChE,MAAM,GAAG,GAAoB,EAAE,CAAA;IAC/B,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;YAAE,SAAQ;QAC/B,MAAM,KAAK,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACvB,MAAM,CAAC,GAAG,KAAK,IAAI,KAAK,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAA;QAC/I,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAA;QAChD,IAAI,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAA;IACpH,CAAC;IACD,OAAO,GAAG,CAAA;AACZ,CAAC;AAED,+BAA+B;AAC/B,MAAM,UAAU,YAAY,CAAC,QAAyB;IACpD,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,MAAM,CAAC;QAAE,OAAO,MAAM,CAAA;IAC7D,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,SAAS,CAAC;QAAE,OAAO,SAAS,CAAA;IACnE,OAAO,OAAO,CAAA;AAChB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,aAAqB;IACjD,OAAO,EAAE,IAAI,EAAE,iBAAiB,EAAE,aAAa,EAAE,YAAY,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,OAAO,EAAE,CAAA;AACnH,CAAC"}
|