lexfold-mcp 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.
Files changed (62) hide show
  1. package/README.md +51 -2
  2. package/dist/bin.d.ts +11 -0
  3. package/dist/bin.js +27 -0
  4. package/dist/bin.js.map +1 -0
  5. package/dist/licenses/notices.d.ts +30 -0
  6. package/dist/licenses/notices.js +155 -0
  7. package/dist/licenses/notices.js.map +1 -0
  8. package/dist/licenses/npm.d.ts +14 -0
  9. package/dist/licenses/npm.js +126 -0
  10. package/dist/licenses/npm.js.map +1 -0
  11. package/dist/licenses/other.d.ts +17 -0
  12. package/dist/licenses/other.js +172 -0
  13. package/dist/licenses/other.js.map +1 -0
  14. package/dist/licenses/scan.d.ts +28 -0
  15. package/dist/licenses/scan.js +150 -0
  16. package/dist/licenses/scan.js.map +1 -0
  17. package/dist/licenses/types.d.ts +37 -0
  18. package/dist/licenses/types.js +46 -0
  19. package/dist/licenses/types.js.map +1 -0
  20. package/dist/policy/acknowledgment.d.ts +2 -0
  21. package/dist/policy/acknowledgment.js +4 -0
  22. package/dist/policy/acknowledgment.js.map +1 -0
  23. package/dist/policy/assemble.d.ts +53 -0
  24. package/dist/policy/assemble.js +265 -0
  25. package/dist/policy/assemble.js.map +1 -0
  26. package/dist/policy/clauses.d.ts +63 -0
  27. package/dist/policy/clauses.js +422 -0
  28. package/dist/policy/clauses.js.map +1 -0
  29. package/dist/policy/index.d.ts +9 -0
  30. package/dist/policy/index.js +6 -0
  31. package/dist/policy/index.js.map +1 -0
  32. package/dist/policy/leakage.d.ts +55 -0
  33. package/dist/policy/leakage.js +220 -0
  34. package/dist/policy/leakage.js.map +1 -0
  35. package/dist/policy/placeholders.d.ts +16 -0
  36. package/dist/policy/placeholders.js +29 -0
  37. package/dist/policy/placeholders.js.map +1 -0
  38. package/dist/policy/types.d.ts +80 -0
  39. package/dist/policy/types.js +18 -0
  40. package/dist/policy/types.js.map +1 -0
  41. package/dist/server/config.d.ts +29 -0
  42. package/dist/server/config.js +32 -0
  43. package/dist/server/config.js.map +1 -0
  44. package/dist/server/guidance.d.ts +15 -0
  45. package/dist/server/guidance.js +30 -0
  46. package/dist/server/guidance.js.map +1 -0
  47. package/dist/server/input-contract.d.ts +93 -0
  48. package/dist/server/input-contract.js +135 -0
  49. package/dist/server/input-contract.js.map +1 -0
  50. package/dist/server/licenses-tool.d.ts +48 -0
  51. package/dist/server/licenses-tool.js +119 -0
  52. package/dist/server/licenses-tool.js.map +1 -0
  53. package/dist/server/publish.d.ts +73 -0
  54. package/dist/server/publish.js +93 -0
  55. package/dist/server/publish.js.map +1 -0
  56. package/dist/server/server.d.ts +23 -0
  57. package/dist/server/server.js +82 -0
  58. package/dist/server/server.js.map +1 -0
  59. package/dist/server/tools.d.ts +73 -0
  60. package/dist/server/tools.js +110 -0
  61. package/dist/server/tools.js.map +1 -0
  62. package/package.json +43 -4
package/README.md CHANGED
@@ -1,3 +1,52 @@
1
- # Temporary Holding Version
1
+ # lexfold-mcp
2
2
 
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
3
+ An [MCP](https://modelcontextprotocol.io) server that lets your AI coding tool draft your privacy and legal policies and send them to [Lexfold](https://lexfold.com) for review.
4
+
5
+ It runs on your machine. Your AI tool describes what the product does in abstract terms (for example "uses a payment processor" or "collects crash reports"). Source code, secrets and personal data are never sent.
6
+
7
+ ## Tools
8
+
9
+ | Tool | What it does |
10
+ |---|---|
11
+ | `draft_policy` | Drafts a policy locally from abstracted product facts. Nothing is sent. |
12
+ | `submit_policy` | Sends the draft to your Lexfold workspace as a **draft**. A person on your team reviews and publishes it from the dashboard. |
13
+ | `scan_licenses` | Reads your lockfiles (npm, PyPI, pub, Cargo, Go), rates each dependency's license and flags risky or missing ones. Local preview by default; uploads the dependency list only when you say yes. |
14
+
15
+ ## Setup
16
+
17
+ 1. In Lexfold, open **Developers → API keys** and create a key.
18
+ 2. Add the server to your MCP client. For Claude Code:
19
+
20
+ ```sh
21
+ claude mcp add lexfold -e LEXFOLD_API_KEY=your_key -- npx -y lexfold-mcp
22
+ ```
23
+
24
+ Or in any client's JSON config:
25
+
26
+ ```json
27
+ {
28
+ "mcpServers": {
29
+ "lexfold": {
30
+ "command": "npx",
31
+ "args": ["-y", "lexfold-mcp"],
32
+ "env": { "LEXFOLD_API_KEY": "your_key" }
33
+ }
34
+ }
35
+ }
36
+ ```
37
+
38
+ `draft_policy` and a local `scan_licenses` preview work without a key.
39
+
40
+ ## Configuration
41
+
42
+ | Variable | Required | Default |
43
+ |---|---|---|
44
+ | `LEXFOLD_API_KEY` | For `submit_policy` and license uploads | – |
45
+ | `LEXFOLD_BASE_URL` | No | `https://lexfold.com` |
46
+
47
+ The key is never written to logs.
48
+
49
+ ## Notes
50
+
51
+ - Lexfold is not a law firm, and drafts are not legal advice. Have a lawyer review your policies.
52
+ - Requires Node.js 18 or later.
package/dist/bin.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Lexfold MCP — stdio entrypoint (policy-mcp R1).
4
+ *
5
+ * Runs in the developer's own environment. Connects the configured server over
6
+ * stdio so an MCP client (e.g. the developer's AI tool) can enumerate and call
7
+ * `draft_policy` and `submit_policy`.
8
+ *
9
+ * Diagnostics go to stderr and never include the credential.
10
+ */
11
+ export {};
package/dist/bin.js ADDED
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Lexfold MCP — stdio entrypoint (policy-mcp R1).
4
+ *
5
+ * Runs in the developer's own environment. Connects the configured server over
6
+ * stdio so an MCP client (e.g. the developer's AI tool) can enumerate and call
7
+ * `draft_policy` and `submit_policy`.
8
+ *
9
+ * Diagnostics go to stderr and never include the credential.
10
+ */
11
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
12
+ import { createServer } from "./server/server.js";
13
+ import { loadConfig, describeConfig } from "./server/config.js";
14
+ async function main() {
15
+ const config = loadConfig();
16
+ const server = createServer({ config });
17
+ const transport = new StdioServerTransport();
18
+ await server.connect(transport);
19
+ // Redacted startup diagnostics (never the credential).
20
+ const redacted = describeConfig(config);
21
+ process.stderr.write(`lexfold-mcp ready · baseUrl=${redacted.baseUrl} · credential=${redacted.hasApiKey ? "configured" : "not configured"}\n`);
22
+ }
23
+ main().catch((err) => {
24
+ process.stderr.write(`lexfold-mcp failed to start: ${String(err)}\n`);
25
+ process.exit(1);
26
+ });
27
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../src/bin.ts"],"names":[],"mappings":";AACA;;;;;;;;GAQG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEhE,KAAK,UAAU,IAAI;IACjB,MAAM,MAAM,GAAG,UAAU,EAAE,CAAC;IAC5B,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IACxC,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAC;IAC7C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,uDAAuD;IACvD,MAAM,QAAQ,GAAG,cAAc,CAAC,MAAM,CAAC,CAAC;IACxC,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,+BAA+B,QAAQ,CAAC,OAAO,iBAAiB,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,gBAAgB,IAAI,CACzH,CAAC;AACJ,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IAC5B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gCAAgC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACtE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC,CAAC,CAAC"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Collect copyright lines ("Copyright (c) 2014 Jane Doe") from the license
3
+ * files of installed packages, so the attribution page can reproduce them, as
4
+ * MIT, BSD and similar licenses require.
5
+ *
6
+ * Reads only LICENSE / LICENCE / COPYING / NOTICE files of packages already on
7
+ * this machine: the project's node_modules and Python virtualenv, and the
8
+ * standard pub, Cargo and Go caches. Only the matching copyright lines (public
9
+ * text from public packages) are kept; nothing else from the file is sent.
10
+ * Best effort: a package whose files aren't installed simply has no notice.
11
+ */
12
+ import type { Dependency } from "./types.js";
13
+ export declare const MAX_NOTICE_LINES = 5;
14
+ export declare const MAX_NOTICE_CHARS = 200;
15
+ /** Pull real copyright lines out of a license file's text. */
16
+ export declare function extractCopyright(text: string): string[];
17
+ /** Copyright lines from the license files directly inside `dir`. */
18
+ export declare function noticesInDir(dir: string): Promise<string[]>;
19
+ export interface NoticeLocations {
20
+ readonly home?: string;
21
+ readonly env?: Readonly<Record<string, string | undefined>>;
22
+ }
23
+ /** Go module cache path escaping: uppercase letters become "!" + lowercase. */
24
+ export declare function goEscape(path: string): string;
25
+ /**
26
+ * Attach copyright lines to every shipped (non-dev) dependency whose license
27
+ * files are installed locally. Dev-only packages are skipped: they don't ship,
28
+ * so the attribution page doesn't list them.
29
+ */
30
+ export declare function collectNotices(root: string, deps: readonly Dependency[], loc?: NoticeLocations): Promise<Dependency[]>;
@@ -0,0 +1,155 @@
1
+ /**
2
+ * Collect copyright lines ("Copyright (c) 2014 Jane Doe") from the license
3
+ * files of installed packages, so the attribution page can reproduce them, as
4
+ * MIT, BSD and similar licenses require.
5
+ *
6
+ * Reads only LICENSE / LICENCE / COPYING / NOTICE files of packages already on
7
+ * this machine: the project's node_modules and Python virtualenv, and the
8
+ * standard pub, Cargo and Go caches. Only the matching copyright lines (public
9
+ * text from public packages) are kept; nothing else from the file is sent.
10
+ * Best effort: a package whose files aren't installed simply has no notice.
11
+ */
12
+ import { readdir, readFile, stat } from "node:fs/promises";
13
+ import { homedir } from "node:os";
14
+ import { join } from "node:path";
15
+ export const MAX_NOTICE_LINES = 5;
16
+ export const MAX_NOTICE_CHARS = 200;
17
+ const MAX_LICENSE_FILE_BYTES = 256 * 1024;
18
+ const LICENSE_FILE_RE = /^(licen[cs]e|copying|notice)([-._].*)?$/i;
19
+ /** Lines that are template placeholders or license boilerplate, not a real notice. */
20
+ const BOILERPLATE_RE = /[<>[\]{}]|copyright notice|copyright holders?\b|copyright owner|copyright law|copyright and license|the copyright|this copyright|yyyy/i;
21
+ const NOTICE_RE = /^\s*(?:copyright\b|\(c\)\s|©)/i;
22
+ /** Pull real copyright lines out of a license file's text. */
23
+ export function extractCopyright(text) {
24
+ const out = [];
25
+ for (const raw of text.split(/\r?\n/)) {
26
+ if (!NOTICE_RE.test(raw))
27
+ continue;
28
+ const line = raw.replace(/\s+/g, " ").trim();
29
+ if (BOILERPLATE_RE.test(line) || !/\d{4}|[A-Za-z]{2,}\s+[A-Za-z]{2,}/.test(line.replace(/^copyright\b/i, "")))
30
+ continue;
31
+ const clipped = line.slice(0, MAX_NOTICE_CHARS);
32
+ if (!out.includes(clipped))
33
+ out.push(clipped);
34
+ if (out.length >= MAX_NOTICE_LINES)
35
+ break;
36
+ }
37
+ return out;
38
+ }
39
+ async function isDir(path) {
40
+ try {
41
+ return (await stat(path)).isDirectory();
42
+ }
43
+ catch {
44
+ return false;
45
+ }
46
+ }
47
+ /** Copyright lines from the license files directly inside `dir`. */
48
+ export async function noticesInDir(dir) {
49
+ let names;
50
+ try {
51
+ names = (await readdir(dir)).filter((n) => LICENSE_FILE_RE.test(n)).sort();
52
+ }
53
+ catch {
54
+ return [];
55
+ }
56
+ const lines = [];
57
+ for (const name of names) {
58
+ try {
59
+ const path = join(dir, name);
60
+ const s = await stat(path);
61
+ if (!s.isFile() || s.size > MAX_LICENSE_FILE_BYTES)
62
+ continue;
63
+ for (const l of extractCopyright(await readFile(path, "utf8")))
64
+ if (!lines.includes(l))
65
+ lines.push(l);
66
+ }
67
+ catch {
68
+ // Unreadable license file: skip it, the package just has fewer notices.
69
+ }
70
+ if (lines.length >= MAX_NOTICE_LINES)
71
+ break;
72
+ }
73
+ return lines.slice(0, MAX_NOTICE_LINES);
74
+ }
75
+ /** Go module cache path escaping: uppercase letters become "!" + lowercase. */
76
+ export function goEscape(path) {
77
+ return path.replace(/[A-Z]/g, (c) => `!${c.toLowerCase()}`);
78
+ }
79
+ /** Python normalises dist names: "Foo_Bar" ships as foo_bar-1.0.dist-info. */
80
+ function pyDistName(name) {
81
+ return name.toLowerCase().replace(/[-.]+/g, "_");
82
+ }
83
+ async function sitePackages(root) {
84
+ const out = [];
85
+ for (const venv of [".venv", "venv"]) {
86
+ const lib = join(root, venv, "lib");
87
+ let pys = [];
88
+ try {
89
+ pys = (await readdir(lib)).filter((n) => n.startsWith("python"));
90
+ }
91
+ catch {
92
+ continue;
93
+ }
94
+ for (const py of pys)
95
+ if (await isDir(join(lib, py, "site-packages")))
96
+ out.push(join(lib, py, "site-packages"));
97
+ }
98
+ return out;
99
+ }
100
+ /** Candidate folders that may hold this package's license files. */
101
+ async function candidateDirs(root, d, loc, site) {
102
+ const env = loc.env;
103
+ switch (d.ecosystem) {
104
+ case "npm":
105
+ return [join(root, "node_modules", d.name)];
106
+ case "pub": {
107
+ const cache = env.PUB_CACHE ?? join(loc.home, ".pub-cache");
108
+ return [join(cache, "hosted", "pub.dev", `${d.name}-${d.version}`), join(cache, "hosted", "pub.dartlang.org", `${d.name}-${d.version}`)];
109
+ }
110
+ case "cargo": {
111
+ const src = join(env.CARGO_HOME ?? join(loc.home, ".cargo"), "registry", "src");
112
+ let regs = [];
113
+ try {
114
+ regs = await readdir(src);
115
+ }
116
+ catch {
117
+ return [];
118
+ }
119
+ return regs.map((r) => join(src, r, `${d.name}-${d.version}`));
120
+ }
121
+ case "go": {
122
+ const cache = env.GOMODCACHE ?? join(env.GOPATH ?? join(loc.home, "go"), "pkg", "mod");
123
+ return [join(cache, `${goEscape(d.name)}@${goEscape(d.version)}`)];
124
+ }
125
+ case "pypi": {
126
+ const dist = `${pyDistName(d.name)}-${d.version}.dist-info`;
127
+ return site.flatMap((s) => [join(s, dist), join(s, dist, "licenses")]);
128
+ }
129
+ }
130
+ }
131
+ /**
132
+ * Attach copyright lines to every shipped (non-dev) dependency whose license
133
+ * files are installed locally. Dev-only packages are skipped: they don't ship,
134
+ * so the attribution page doesn't list them.
135
+ */
136
+ export async function collectNotices(root, deps, loc = {}) {
137
+ const full = { home: loc.home ?? homedir(), env: loc.env ?? process.env };
138
+ const site = deps.some((d) => d.ecosystem === "pypi") ? await sitePackages(root) : [];
139
+ const out = [];
140
+ for (let i = 0; i < deps.length; i += 32) {
141
+ const batch = deps.slice(i, i + 32);
142
+ out.push(...(await Promise.all(batch.map(async (d) => {
143
+ if (d.dev || !d.version)
144
+ return d;
145
+ for (const dir of await candidateDirs(root, d, full, site)) {
146
+ const lines = await noticesInDir(dir);
147
+ if (lines.length)
148
+ return { ...d, copyright: lines };
149
+ }
150
+ return d;
151
+ }))));
152
+ }
153
+ return out;
154
+ }
155
+ //# sourceMappingURL=notices.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"notices.js","sourceRoot":"","sources":["../../src/licenses/notices.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * npm-family lockfile readers: package-lock.json (v1–v3), pnpm-lock.yaml
3
+ * (v5–v9) and yarn.lock (classic v1 and Berry). Text parsing only; nothing is
4
+ * executed or installed. `direct`/`dev` come from package.json when given.
5
+ */
6
+ import { type Dependency } from "./types.js";
7
+ export interface NpmManifest {
8
+ readonly dependencies?: Readonly<Record<string, string>>;
9
+ readonly devDependencies?: Readonly<Record<string, string>>;
10
+ readonly optionalDependencies?: Readonly<Record<string, string>>;
11
+ }
12
+ export declare function parsePackageLock(text: string, manifest: NpmManifest | null): Dependency[];
13
+ export declare function parsePnpmLock(text: string, manifest: NpmManifest | null): Dependency[];
14
+ export declare function parseYarnLock(text: string, manifest: NpmManifest | null): Dependency[];
@@ -0,0 +1,126 @@
1
+ /**
2
+ * npm-family lockfile readers: package-lock.json (v1–v3), pnpm-lock.yaml
3
+ * (v5–v9) and yarn.lock (classic v1 and Berry). Text parsing only; nothing is
4
+ * executed or installed. `direct`/`dev` come from package.json when given.
5
+ */
6
+ import { isValidCoordinate } from "./types.js";
7
+ function directSets(manifest) {
8
+ return {
9
+ prod: new Set([...Object.keys(manifest?.dependencies ?? {}), ...Object.keys(manifest?.optionalDependencies ?? {})]),
10
+ dev: new Set(Object.keys(manifest?.devDependencies ?? {})),
11
+ };
12
+ }
13
+ function make(name, version, sets, license, devHint) {
14
+ if (!isValidCoordinate(name, version))
15
+ return null;
16
+ const direct = sets.prod.has(name) || sets.dev.has(name);
17
+ const dev = devHint ?? (sets.dev.has(name) && !sets.prod.has(name));
18
+ const lic = typeof license === "string" && license.trim() ? license.trim().slice(0, 200) : undefined;
19
+ return { ecosystem: "npm", name, version, direct, dev, ...(lic ? { license: lic } : {}) };
20
+ }
21
+ function walkV1(deps, sets, out) {
22
+ if (!deps || typeof deps !== "object")
23
+ return;
24
+ for (const [name, raw] of Object.entries(deps)) {
25
+ if (typeof raw?.version !== "string")
26
+ continue;
27
+ const d = make(name, raw.version, sets, undefined, raw.dev === true);
28
+ if (d)
29
+ out.push(d);
30
+ walkV1(raw.dependencies, sets, out);
31
+ }
32
+ }
33
+ export function parsePackageLock(text, manifest) {
34
+ const json = JSON.parse(text);
35
+ const sets = directSets(manifest);
36
+ const out = [];
37
+ if (json.packages && typeof json.packages === "object") {
38
+ for (const [path, entry] of Object.entries(json.packages)) {
39
+ if (!path || entry.link === true || typeof entry.version !== "string")
40
+ continue;
41
+ const idx = path.lastIndexOf("node_modules/");
42
+ if (idx < 0)
43
+ continue;
44
+ const name = path.slice(idx + "node_modules/".length);
45
+ const d = make(name, entry.version, sets, entry.license, entry.dev === true);
46
+ if (d)
47
+ out.push(d);
48
+ }
49
+ return out;
50
+ }
51
+ walkV1(json.dependencies, sets, out);
52
+ return out;
53
+ }
54
+ /* ---- pnpm-lock.yaml ---- */
55
+ /** "/@scope/name@1.2.3(peer@1)" | "name@1.2.3" | "/name/1.2.3" → [name, version]. */
56
+ function splitPnpmKey(rawKey) {
57
+ let key = rawKey.trim().replace(/^['"]|['"]$/g, "").replace(/:$/, "").replace(/^['"]|['"]$/g, "");
58
+ key = key.replace(/^\//, "").replace(/\(.*$/, "");
59
+ const at = key.lastIndexOf("@");
60
+ if (at > 0)
61
+ return [key.slice(0, at), key.slice(at + 1)];
62
+ const slash = key.lastIndexOf("/");
63
+ return slash > 0 ? [key.slice(0, slash), key.slice(slash + 1)] : null;
64
+ }
65
+ export function parsePnpmLock(text, manifest) {
66
+ const sets = directSets(manifest);
67
+ const out = [];
68
+ let inPackages = false;
69
+ let current = null;
70
+ const flush = () => {
71
+ if (!current)
72
+ return;
73
+ const d = make(current.name, current.version, sets, undefined, current.dev);
74
+ if (d)
75
+ out.push(d);
76
+ current = null;
77
+ };
78
+ for (const line of text.split(/\r?\n/)) {
79
+ if (/^\S/.test(line)) {
80
+ flush();
81
+ inPackages = line.startsWith("packages:");
82
+ continue;
83
+ }
84
+ if (!inPackages)
85
+ continue;
86
+ const top = /^ {2}(\S.*):\s*$/.exec(line);
87
+ if (top?.[1]) {
88
+ flush();
89
+ const parts = splitPnpmKey(top[1]);
90
+ current = parts ? { name: parts[0], version: parts[1] } : null;
91
+ continue;
92
+ }
93
+ const dev = /^ {4}dev:\s*(true|false)/.exec(line);
94
+ if (dev && current)
95
+ current = { ...current, dev: dev[1] === "true" };
96
+ }
97
+ flush();
98
+ return out;
99
+ }
100
+ /* ---- yarn.lock (v1 + Berry) ---- */
101
+ function yarnName(spec) {
102
+ const s = spec.trim().replace(/^"|"$/g, "");
103
+ const at = s.indexOf("@", 1);
104
+ return at > 0 ? s.slice(0, at) : null;
105
+ }
106
+ export function parseYarnLock(text, manifest) {
107
+ const sets = directSets(manifest);
108
+ const out = [];
109
+ let name = null;
110
+ for (const line of text.split(/\r?\n/)) {
111
+ if (/^\S/.test(line) && line.trimEnd().endsWith(":") && !line.startsWith("#")) {
112
+ const first = line.slice(0, -1).split(",")[0] ?? "";
113
+ name = first.includes("@workspace:") || first.startsWith("__metadata") ? null : yarnName(first);
114
+ continue;
115
+ }
116
+ const v = /^ {2}version:?\s+"?([^"\s]+)"?/.exec(line);
117
+ if (v?.[1] && name) {
118
+ const d = make(name, v[1], sets);
119
+ if (d)
120
+ out.push(d);
121
+ name = null;
122
+ }
123
+ }
124
+ return out;
125
+ }
126
+ //# sourceMappingURL=npm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npm.js","sourceRoot":"","sources":["../../src/licenses/npm.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Lockfile/manifest readers for Flutter/Dart (pubspec.lock), Python (uv.lock,
3
+ * poetry.lock, requirements.txt), Go (go.mod) and Rust (Cargo.lock). Line-based
4
+ * text parsing of each format's regular shape; nothing is executed.
5
+ */
6
+ import { type Dependency } from "./types.js";
7
+ export declare function parsePubspecLock(text: string): Dependency[];
8
+ export declare function parseUvLock(text: string, direct: ReadonlySet<string>): Dependency[];
9
+ export declare function parsePoetryLock(text: string, direct: ReadonlySet<string>): Dependency[];
10
+ /** `name==1.2`, `name[extra]==1.2 ; marker`, unpinned `name>=1` (version ""). */
11
+ export declare function parseRequirements(text: string): Dependency[];
12
+ /** Direct dependency names from pyproject.toml ([project] dependencies + Poetry tables). */
13
+ export declare function pyprojectDirect(text: string): Set<string>;
14
+ export declare function parseGoMod(text: string): Dependency[];
15
+ export declare function parseCargoLock(text: string, direct: ReadonlySet<string>): Dependency[];
16
+ /** Direct crate names from Cargo.toml dependency tables. */
17
+ export declare function cargoDirect(text: string): Set<string>;
@@ -0,0 +1,172 @@
1
+ /**
2
+ * Lockfile/manifest readers for Flutter/Dart (pubspec.lock), Python (uv.lock,
3
+ * poetry.lock, requirements.txt), Go (go.mod) and Rust (Cargo.lock). Line-based
4
+ * text parsing of each format's regular shape; nothing is executed.
5
+ */
6
+ import { isValidCoordinate } from "./types.js";
7
+ function make(ecosystem, name, version, direct, dev) {
8
+ return isValidCoordinate(name, version) ? { ecosystem, name, version, direct, dev } : null;
9
+ }
10
+ const unquote = (v) => v.trim().replace(/^["']|["']$/g, "");
11
+ /* ---- pubspec.lock ---- */
12
+ export function parsePubspecLock(text) {
13
+ const out = [];
14
+ let inPackages = false;
15
+ let cur = null;
16
+ const flush = () => {
17
+ if (cur?.version && cur.source !== "sdk") {
18
+ const kind = cur.dependency ?? "transitive";
19
+ const d = make("pub", cur.name, cur.version, kind.startsWith("direct"), kind.includes("dev"));
20
+ if (d)
21
+ out.push(d);
22
+ }
23
+ cur = null;
24
+ };
25
+ for (const line of text.split(/\r?\n/)) {
26
+ if (/^\S/.test(line)) {
27
+ flush();
28
+ inPackages = line.startsWith("packages:");
29
+ continue;
30
+ }
31
+ if (!inPackages)
32
+ continue;
33
+ const pkg = /^ {2}([A-Za-z0-9_]+):\s*$/.exec(line);
34
+ if (pkg?.[1]) {
35
+ flush();
36
+ cur = { name: pkg[1] };
37
+ continue;
38
+ }
39
+ const field = /^ {4}(dependency|source|version):\s*(.+)$/.exec(line);
40
+ if (field?.[1] && field[2] !== undefined && cur) {
41
+ cur = { ...cur, [field[1]]: unquote(field[2]) };
42
+ }
43
+ }
44
+ flush();
45
+ return out;
46
+ }
47
+ function tomlPackages(text) {
48
+ const pkgs = [];
49
+ let cur = null;
50
+ for (const line of text.split(/\r?\n/)) {
51
+ if (/^\[\[package\]\]\s*$/.test(line)) {
52
+ if (cur)
53
+ pkgs.push(cur);
54
+ cur = {};
55
+ continue;
56
+ }
57
+ if (/^\[/.test(line)) {
58
+ if (cur)
59
+ pkgs.push(cur);
60
+ cur = null;
61
+ continue;
62
+ }
63
+ const kv = /^(name|version|source|category)\s*=\s*(.+)$/.exec(line);
64
+ if (cur && kv?.[1] && kv[2] !== undefined)
65
+ cur[kv[1]] = kv[2].trim().startsWith("{") ? kv[2].trim() : unquote(kv[2]);
66
+ }
67
+ if (cur)
68
+ pkgs.push(cur);
69
+ return pkgs;
70
+ }
71
+ /** Lower-case + PEP 503 normalisation so names match the registry. */
72
+ const pep503 = (name) => name.toLowerCase().replace(/[-_.]+/g, "-");
73
+ export function parseUvLock(text, direct) {
74
+ return tomlPackages(text)
75
+ .filter((p) => p.name && p.version && !/editable|virtual|directory/.test(p.source ?? ""))
76
+ .map((p) => make("pypi", pep503(p.name), p.version, direct.has(pep503(p.name)), false))
77
+ .filter((d) => d !== null);
78
+ }
79
+ export function parsePoetryLock(text, direct) {
80
+ return tomlPackages(text)
81
+ .filter((p) => p.name && p.version)
82
+ .map((p) => {
83
+ const name = pep503(p.name);
84
+ return make("pypi", name, p.version, direct.has(name), p.category === "dev");
85
+ })
86
+ .filter((d) => d !== null);
87
+ }
88
+ /** `name==1.2`, `name[extra]==1.2 ; marker`, unpinned `name>=1` (version ""). */
89
+ export function parseRequirements(text) {
90
+ const out = [];
91
+ for (const raw of text.split(/\r?\n/)) {
92
+ const line = raw.replace(/\s+#.*$/, "").split(";")[0]?.trim() ?? "";
93
+ if (!line || line.startsWith("#") || line.startsWith("-") || line.includes("://"))
94
+ continue;
95
+ const m = /^([A-Za-z0-9][A-Za-z0-9._-]*)(\[[^\]]*\])?\s*(==\s*([A-Za-z0-9.+!*-]+))?/.exec(line);
96
+ if (!m?.[1])
97
+ continue;
98
+ const d = make("pypi", pep503(m[1]), m[4] ?? "", true, false);
99
+ if (d)
100
+ out.push(d);
101
+ }
102
+ return out;
103
+ }
104
+ /** Direct dependency names from pyproject.toml ([project] dependencies + Poetry tables). */
105
+ export function pyprojectDirect(text) {
106
+ const names = new Set();
107
+ const arr = /dependencies\s*=\s*\[([\s\S]*?)\]/g;
108
+ for (const m of text.matchAll(arr)) {
109
+ for (const s of (m[1] ?? "").matchAll(/["']([A-Za-z0-9][A-Za-z0-9._-]*)/g))
110
+ if (s[1])
111
+ names.add(pep503(s[1]));
112
+ }
113
+ let inPoetryDeps = false;
114
+ for (const line of text.split(/\r?\n/)) {
115
+ if (/^\[/.test(line)) {
116
+ inPoetryDeps = /^\[tool\.poetry\.(dev-)?dependencies\]|^\[tool\.poetry\.group\.[^.]+\.dependencies\]/.test(line);
117
+ continue;
118
+ }
119
+ const k = inPoetryDeps ? /^([A-Za-z0-9][A-Za-z0-9._-]*)\s*=/.exec(line) : null;
120
+ if (k?.[1] && k[1] !== "python")
121
+ names.add(pep503(k[1]));
122
+ }
123
+ return names;
124
+ }
125
+ /* ---- go.mod ---- */
126
+ export function parseGoMod(text) {
127
+ const out = [];
128
+ let inBlock = false;
129
+ for (const raw of text.split(/\r?\n/)) {
130
+ const line = raw.trim();
131
+ if (/^require\s*\($/.test(line)) {
132
+ inBlock = true;
133
+ continue;
134
+ }
135
+ if (inBlock && line === ")") {
136
+ inBlock = false;
137
+ continue;
138
+ }
139
+ const body = inBlock ? line : (/^require\s+(.+)$/.exec(line)?.[1] ?? "");
140
+ const m = /^(\S+)\s+(v\S+)(.*)$/.exec(body);
141
+ if (!m?.[1] || !m[2])
142
+ continue;
143
+ const d = make("go", m[1], m[2], !/\/\/\s*indirect/.test(m[3] ?? ""), false);
144
+ if (d)
145
+ out.push(d);
146
+ }
147
+ return out;
148
+ }
149
+ /* ---- Cargo.lock ---- */
150
+ export function parseCargoLock(text, direct) {
151
+ return tomlPackages(text)
152
+ // Packages without a `source` are the project's own workspace crates.
153
+ .filter((p) => p.name && p.version && p.source)
154
+ .map((p) => make("cargo", p.name, p.version, direct.has(p.name), false))
155
+ .filter((d) => d !== null);
156
+ }
157
+ /** Direct crate names from Cargo.toml dependency tables. */
158
+ export function cargoDirect(text) {
159
+ const names = new Set();
160
+ let inDeps = false;
161
+ for (const line of text.split(/\r?\n/)) {
162
+ if (/^\[/.test(line)) {
163
+ inDeps = /^\[(dev-|build-)?dependencies\]|^\[target\..+\.(dev-|build-)?dependencies\]|^\[workspace\.dependencies\]/.test(line);
164
+ continue;
165
+ }
166
+ const k = inDeps ? /^([A-Za-z0-9_-]+)\s*=/.exec(line) : null;
167
+ if (k?.[1])
168
+ names.add(k[1]);
169
+ }
170
+ return names;
171
+ }
172
+ //# sourceMappingURL=other.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"other.js","sourceRoot":"","sources":["../../src/licenses/other.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,iBAAiB,EAAmC,MAAM,YAAY,CAAC;AAEhF,SAAS,IAAI,CAAC,SAAoB,EAAE,IAAY,EAAE,OAAe,EAAE,MAAe,EAAE,GAAY;IAC9F,OAAO,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;AAC7F,CAAC;AAED,MAAM,OAAO,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;AAE5E,4BAA4B;AAE5B,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,MAAM,GAAG,GAAiB,EAAE,CAAC;IAC7B,IAAI,UAAU,GAAG,KAAK,CAAC;IACvB,IAAI,GAAG,GAAoF,IAAI,CAAC;IAChG,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,IAAI,GAAG,EAAE,OAAO,IAAI,GAAG,CAAC,MAAM,KAAK,KAAK,EAAE,CAAC;YACzC,MAAM,IAAI,GAAG,GAAG,CAAC,UAAU,IAAI,YAAY,CAAC;YAC5C,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;YAC9F,IAAI,CAAC;gBAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrB,CAAC;QACD,GAAG,GAAG,IAAI,CAAC;IACb,CAAC,CAAC;IACF,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,KAAK,EAAE,CAAC;YACR,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,CAAC;YAC1C,SAAS;QACX,CAAC;QACD,IAAI,CAAC,UAAU;YAAE,SAAS;QAC1B,MAAM,GAAG,GAAG,2BAA2B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnD,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACb,KAAK,EAAE,CAAC;YACR,GAAG,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;YACvB,SAAS;QACX,CAAC;QACD,MAAM,KAAK,GAAG,2CAA2C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrE,IAAI,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,GAAG,EAAE,CAAC;YAChD,GAAG,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAClD,CAAC;IACH,CAAC;IACD,KAAK,EAAE,CAAC;IACR,OAAO,GAAG,CAAC;AACb,CAAC;AAYD,SAAS,YAAY,CAAC,IAAY;IAChC,MAAM,IAAI,GAAkB,EAAE,CAAC;IAC/B,IAAI,GAAG,GAAkC,IAAI,CAAC;IAC9C,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,IAAI,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,IAAI,GAAG;gBAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACxB,GAAG,GAAG,EAAE,CAAC;YACT,SAAS;QACX,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,IAAI,GAAG;gBAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACxB,GAAG,GAAG,IAAI,CAAC;YACX,SAAS;QACX,CAAC;QACD,MAAM,EAAE,GAAG,6CAA6C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpE,IAAI,GAAG,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,KAAK,SAAS;YAAE,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACvH,CAAC;IACD,IAAI,GAAG;QAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACxB,OAAO,IAAI,CAAC;AACd,CAAC;AAED,sEAAsE;AACtE,MAAM,MAAM,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;AAEpF,MAAM,UAAU,WAAW,CAAC,IAAY,EAAE,MAA2B;IACnE,OAAO,YAAY,CAAC,IAAI,CAAC;SACtB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC;SACxF,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,IAAc,CAAC,EAAE,CAAC,CAAC,OAAiB,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAc,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;SACpH,MAAM,CAAC,CAAC,CAAC,EAAmB,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,MAA2B;IACvE,OAAO,YAAY,CAAC,IAAI,CAAC;SACtB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,CAAC;SAClC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,IAAc,CAAC,CAAC;QACtC,OAAO,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,OAAiB,EAAE,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,QAAQ,KAAK,KAAK,CAAC,CAAC;IACzF,CAAC,CAAC;SACD,MAAM,CAAC,CAAC,CAAC,EAAmB,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;AAChD,CAAC;AAED,iFAAiF;AACjF,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,MAAM,GAAG,GAAiB,EAAE,CAAC;IAC7B,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACpE,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,SAAS;QAC5F,MAAM,CAAC,GAAG,0EAA0E,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAChG,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAAE,SAAS;QACtB,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QAC9D,IAAI,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,MAAM,GAAG,GAAG,oCAAoC,CAAC;IACjD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACnC,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,mCAAmC,CAAC;YAAE,IAAI,CAAC,CAAC,CAAC,CAAC;gBAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChH,CAAC;IACD,IAAI,YAAY,GAAG,KAAK,CAAC;IACzB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,YAAY,GAAG,sFAAsF,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjH,SAAS;QACX,CAAC;QACD,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,mCAAmC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/E,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,QAAQ;YAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,sBAAsB;AAEtB,MAAM,UAAU,UAAU,CAAC,IAAY;IACrC,MAAM,GAAG,GAAiB,EAAE,CAAC;IAC7B,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC;QACxB,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,OAAO,GAAG,IAAI,CAAC;YACf,SAAS;QACX,CAAC;QACD,IAAI,OAAO,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;YAC5B,OAAO,GAAG,KAAK,CAAC;YAChB,SAAS;QACX,CAAC;QACD,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACzE,MAAM,CAAC,GAAG,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;YAAE,SAAS;QAC/B,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QAC7E,IAAI,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,0BAA0B;AAE1B,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,MAA2B;IACtE,OAAO,YAAY,CAAC,IAAI,CAAC;QACvB,sEAAsE;SACrE,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,MAAM,CAAC;SAC9C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAC,IAAc,EAAE,CAAC,CAAC,OAAiB,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,IAAc,CAAC,EAAE,KAAK,CAAC,CAAC;SACrG,MAAM,CAAC,CAAC,CAAC,EAAmB,EAAE,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC;AAChD,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,WAAW,CAAC,IAAY;IACtC,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,IAAI,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,MAAM,GAAG,0GAA0G,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC/H,SAAS;QACX,CAAC;QACD,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC7D,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}