nuartz 0.1.4 → 0.1.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/backlinks.test.js +48 -50
- package/dist/__tests__/backlinks.test.js.map +1 -1
- package/dist/__tests__/fs.test.js +100 -105
- package/dist/__tests__/fs.test.js.map +1 -1
- package/dist/__tests__/markdown.test.js +61 -63
- package/dist/__tests__/markdown.test.js.map +1 -1
- package/dist/__tests__/search.test.js +52 -54
- package/dist/__tests__/search.test.js.map +1 -1
- package/dist/backlinks.js +2 -6
- package/dist/backlinks.js.map +1 -1
- package/dist/config.js +1 -4
- package/dist/config.js.map +1 -1
- package/dist/fs.js +16 -24
- package/dist/fs.js.map +1 -1
- package/dist/index.js +11 -28
- package/dist/index.js.map +1 -1
- package/dist/markdown.js +44 -50
- package/dist/markdown.js.map +1 -1
- package/dist/plugins/arrows.js +3 -7
- package/dist/plugins/arrows.js.map +1 -1
- package/dist/plugins/callout.js +3 -7
- package/dist/plugins/callout.js.map +1 -1
- package/dist/plugins/callout.test.js +39 -44
- package/dist/plugins/callout.test.js.map +1 -1
- package/dist/plugins/comment.js +3 -7
- package/dist/plugins/comment.js.map +1 -1
- package/dist/plugins/comment.test.js +32 -37
- package/dist/plugins/comment.test.js.map +1 -1
- package/dist/plugins/highlight.js +3 -7
- package/dist/plugins/highlight.js.map +1 -1
- package/dist/plugins/highlight.test.js +28 -33
- package/dist/plugins/highlight.test.js.map +1 -1
- package/dist/plugins/tag.js +3 -7
- package/dist/plugins/tag.js.map +1 -1
- package/dist/plugins/tag.test.js +42 -47
- package/dist/plugins/tag.test.js.map +1 -1
- package/dist/plugins/wikilink.js +3 -7
- package/dist/plugins/wikilink.js.map +1 -1
- package/dist/plugins/wikilink.test.js +54 -59
- package/dist/plugins/wikilink.test.js.map +1 -1
- package/dist/search.js +1 -4
- package/dist/search.js.map +1 -1
- package/dist/types.js +1 -2
- package/package.json +26 -6
- package/styles/prose.css +254 -0
|
@@ -1,7 +1,5 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
const vitest_1 = require("vitest");
|
|
4
|
-
const backlinks_1 = require("../backlinks");
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { buildBacklinkIndex, getBacklinks } from "../backlinks";
|
|
5
3
|
function mockPage(links, title, raw) {
|
|
6
4
|
return {
|
|
7
5
|
result: {
|
|
@@ -14,50 +12,50 @@ function mockPage(links, title, raw) {
|
|
|
14
12
|
raw,
|
|
15
13
|
};
|
|
16
14
|
}
|
|
17
|
-
|
|
18
|
-
|
|
15
|
+
describe("buildBacklinkIndex", () => {
|
|
16
|
+
it("builds index from pages with outgoing links", () => {
|
|
19
17
|
const pages = new Map([
|
|
20
18
|
["page-a", mockPage(["Page B"], "Page A", "Links to Page B")],
|
|
21
19
|
["page-b", mockPage(["Page A"], "Page B", "Links to Page A")],
|
|
22
20
|
]);
|
|
23
|
-
const index =
|
|
21
|
+
const index = buildBacklinkIndex(pages);
|
|
24
22
|
// "Page B" normalizes to "page-b"
|
|
25
23
|
const backlinksForB = index.get("page-b");
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
24
|
+
expect(backlinksForB).toBeDefined();
|
|
25
|
+
expect(backlinksForB).toHaveLength(1);
|
|
26
|
+
expect(backlinksForB[0].slug).toBe("page-a");
|
|
27
|
+
expect(backlinksForB[0].title).toBe("Page A");
|
|
30
28
|
});
|
|
31
|
-
|
|
29
|
+
it("normalizes target slugs: lowercase and spaces to hyphens", () => {
|
|
32
30
|
const pages = new Map([
|
|
33
31
|
["source", mockPage(["My Target Page"], "Source", "Content here")],
|
|
34
32
|
]);
|
|
35
|
-
const index =
|
|
36
|
-
|
|
33
|
+
const index = buildBacklinkIndex(pages);
|
|
34
|
+
expect(index.has("my-target-page")).toBe(true);
|
|
37
35
|
});
|
|
38
|
-
|
|
36
|
+
it("strips non-word/non-hyphen characters from target slug", () => {
|
|
39
37
|
const pages = new Map([
|
|
40
38
|
["source", mockPage(["Page (draft)"], "Source", "Content")],
|
|
41
39
|
]);
|
|
42
|
-
const index =
|
|
40
|
+
const index = buildBacklinkIndex(pages);
|
|
43
41
|
// "Page (draft)" -> "page-draft" (parens removed)
|
|
44
|
-
|
|
42
|
+
expect(index.has("page-draft")).toBe(true);
|
|
45
43
|
});
|
|
46
|
-
|
|
44
|
+
it("collects multiple backlinks for the same target", () => {
|
|
47
45
|
const pages = new Map([
|
|
48
46
|
["alpha", mockPage(["Target"], "Alpha", "Alpha links to target")],
|
|
49
47
|
["beta", mockPage(["Target"], "Beta", "Beta links to target")],
|
|
50
48
|
["gamma", mockPage(["Target"], "Gamma", "Gamma links to target")],
|
|
51
49
|
]);
|
|
52
|
-
const index =
|
|
50
|
+
const index = buildBacklinkIndex(pages);
|
|
53
51
|
const backlinks = index.get("target");
|
|
54
|
-
|
|
52
|
+
expect(backlinks).toHaveLength(3);
|
|
55
53
|
const slugs = backlinks.map((b) => b.slug);
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
54
|
+
expect(slugs).toContain("alpha");
|
|
55
|
+
expect(slugs).toContain("beta");
|
|
56
|
+
expect(slugs).toContain("gamma");
|
|
59
57
|
});
|
|
60
|
-
|
|
58
|
+
it("generates excerpt from raw content stripping frontmatter", () => {
|
|
61
59
|
const raw = `---
|
|
62
60
|
title: Source Page
|
|
63
61
|
---
|
|
@@ -66,23 +64,23 @@ This is the body content that should appear in the excerpt.`;
|
|
|
66
64
|
const pages = new Map([
|
|
67
65
|
["source", mockPage(["Target"], "Source Page", raw)],
|
|
68
66
|
]);
|
|
69
|
-
const index =
|
|
67
|
+
const index = buildBacklinkIndex(pages);
|
|
70
68
|
const backlinks = index.get("target");
|
|
71
|
-
|
|
72
|
-
|
|
69
|
+
expect(backlinks[0].excerpt).toContain("This is the body content");
|
|
70
|
+
expect(backlinks[0].excerpt).not.toContain("---");
|
|
73
71
|
});
|
|
74
|
-
|
|
72
|
+
it("truncates excerpt to 160 characters plus ellipsis", () => {
|
|
75
73
|
const longBody = "A".repeat(200);
|
|
76
74
|
const pages = new Map([
|
|
77
75
|
["source", mockPage(["Target"], "Source", longBody)],
|
|
78
76
|
]);
|
|
79
|
-
const index =
|
|
77
|
+
const index = buildBacklinkIndex(pages);
|
|
80
78
|
const backlinks = index.get("target");
|
|
81
79
|
// 160 chars + ellipsis character
|
|
82
|
-
|
|
83
|
-
|
|
80
|
+
expect(backlinks[0].excerpt.length).toBeLessThanOrEqual(161);
|
|
81
|
+
expect(backlinks[0].excerpt).toMatch(/\u2026$/);
|
|
84
82
|
});
|
|
85
|
-
|
|
83
|
+
it("uses slug as title fallback when no frontmatter title", () => {
|
|
86
84
|
const pages = new Map([
|
|
87
85
|
[
|
|
88
86
|
"no-title-page",
|
|
@@ -98,35 +96,35 @@ This is the body content that should appear in the excerpt.`;
|
|
|
98
96
|
},
|
|
99
97
|
],
|
|
100
98
|
]);
|
|
101
|
-
const index =
|
|
99
|
+
const index = buildBacklinkIndex(pages);
|
|
102
100
|
const backlinks = index.get("target");
|
|
103
|
-
|
|
101
|
+
expect(backlinks[0].title).toBe("no-title-page");
|
|
104
102
|
});
|
|
105
103
|
});
|
|
106
|
-
|
|
107
|
-
|
|
104
|
+
describe("getBacklinks", () => {
|
|
105
|
+
it("returns correct BacklinkEntry[] for known slug", () => {
|
|
108
106
|
const pages = new Map([
|
|
109
107
|
["source", mockPage(["Target"], "Source Title", "Content about target")],
|
|
110
108
|
]);
|
|
111
|
-
const index =
|
|
112
|
-
const backlinks =
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
109
|
+
const index = buildBacklinkIndex(pages);
|
|
110
|
+
const backlinks = getBacklinks(index, "target");
|
|
111
|
+
expect(backlinks).toHaveLength(1);
|
|
112
|
+
expect(backlinks[0].slug).toBe("source");
|
|
113
|
+
expect(backlinks[0].title).toBe("Source Title");
|
|
114
|
+
expect(backlinks[0].excerpt).toBeTruthy();
|
|
117
115
|
});
|
|
118
|
-
|
|
116
|
+
it("returns empty array for unknown slug", () => {
|
|
119
117
|
const pages = new Map([
|
|
120
118
|
["source", mockPage(["Target"], "Source", "Content")],
|
|
121
119
|
]);
|
|
122
|
-
const index =
|
|
123
|
-
const backlinks =
|
|
124
|
-
|
|
120
|
+
const index = buildBacklinkIndex(pages);
|
|
121
|
+
const backlinks = getBacklinks(index, "nonexistent");
|
|
122
|
+
expect(backlinks).toEqual([]);
|
|
125
123
|
});
|
|
126
|
-
|
|
127
|
-
const index =
|
|
128
|
-
const backlinks =
|
|
129
|
-
|
|
124
|
+
it("returns empty array for empty index", () => {
|
|
125
|
+
const index = buildBacklinkIndex(new Map());
|
|
126
|
+
const backlinks = getBacklinks(index, "anything");
|
|
127
|
+
expect(backlinks).toEqual([]);
|
|
130
128
|
});
|
|
131
129
|
});
|
|
132
130
|
//# sourceMappingURL=backlinks.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backlinks.test.js","sourceRoot":"","sources":["../../src/__tests__/backlinks.test.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"backlinks.test.js","sourceRoot":"","sources":["../../src/__tests__/backlinks.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,48 +1,43 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
const promises_1 = __importDefault(require("node:fs/promises"));
|
|
8
|
-
const node_os_1 = __importDefault(require("node:os"));
|
|
9
|
-
const node_path_1 = __importDefault(require("node:path"));
|
|
10
|
-
const fs_1 = require("../fs");
|
|
11
|
-
(0, vitest_1.describe)("getAllMarkdownFiles", () => {
|
|
1
|
+
import { describe, it, expect, beforeEach, afterEach } from "vitest";
|
|
2
|
+
import fs from "node:fs/promises";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { getAllMarkdownFiles, getMarkdownBySlug, buildFileTree } from "../fs";
|
|
6
|
+
describe("getAllMarkdownFiles", () => {
|
|
12
7
|
let tmpDir;
|
|
13
|
-
|
|
14
|
-
tmpDir = await
|
|
8
|
+
beforeEach(async () => {
|
|
9
|
+
tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "nuartz-fs-test-"));
|
|
15
10
|
});
|
|
16
|
-
|
|
17
|
-
await
|
|
11
|
+
afterEach(async () => {
|
|
12
|
+
await fs.rm(tmpDir, { recursive: true, force: true });
|
|
18
13
|
});
|
|
19
|
-
|
|
20
|
-
await
|
|
21
|
-
await
|
|
22
|
-
await
|
|
23
|
-
const files = await
|
|
14
|
+
it("returns all .md files recursively", async () => {
|
|
15
|
+
await fs.writeFile(path.join(tmpDir, "root.md"), "# Root");
|
|
16
|
+
await fs.mkdir(path.join(tmpDir, "sub"), { recursive: true });
|
|
17
|
+
await fs.writeFile(path.join(tmpDir, "sub", "nested.md"), "# Nested");
|
|
18
|
+
const files = await getAllMarkdownFiles(tmpDir);
|
|
24
19
|
const slugs = files.map((f) => f.slug);
|
|
25
|
-
|
|
26
|
-
|
|
20
|
+
expect(slugs).toContain("root");
|
|
21
|
+
expect(slugs).toContain("sub/nested");
|
|
27
22
|
});
|
|
28
|
-
|
|
29
|
-
await
|
|
30
|
-
await
|
|
31
|
-
const files = await
|
|
23
|
+
it("excludes files starting with _", async () => {
|
|
24
|
+
await fs.writeFile(path.join(tmpDir, "visible.md"), "# Visible");
|
|
25
|
+
await fs.writeFile(path.join(tmpDir, "_hidden.md"), "# Hidden");
|
|
26
|
+
const files = await getAllMarkdownFiles(tmpDir);
|
|
32
27
|
const slugs = files.map((f) => f.slug);
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
});
|
|
36
|
-
|
|
37
|
-
await
|
|
38
|
-
await
|
|
39
|
-
const files = await
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
});
|
|
45
|
-
|
|
28
|
+
expect(slugs).toContain("visible");
|
|
29
|
+
expect(slugs).not.toContain("_hidden");
|
|
30
|
+
});
|
|
31
|
+
it("returns MarkdownFile[] with correct slug format", async () => {
|
|
32
|
+
await fs.mkdir(path.join(tmpDir, "notes"), { recursive: true });
|
|
33
|
+
await fs.writeFile(path.join(tmpDir, "notes", "foo.md"), "# Foo");
|
|
34
|
+
const files = await getAllMarkdownFiles(tmpDir);
|
|
35
|
+
expect(files).toHaveLength(1);
|
|
36
|
+
expect(files[0].slug).toBe("notes/foo");
|
|
37
|
+
expect(files[0].filePath).toBe(path.join(tmpDir, "notes", "foo.md"));
|
|
38
|
+
expect(files[0].raw).toContain("# Foo");
|
|
39
|
+
});
|
|
40
|
+
it("parses frontmatter", async () => {
|
|
46
41
|
const content = `---
|
|
47
42
|
title: My Note
|
|
48
43
|
tags:
|
|
@@ -50,104 +45,104 @@ tags:
|
|
|
50
45
|
---
|
|
51
46
|
|
|
52
47
|
Body content`;
|
|
53
|
-
await
|
|
54
|
-
const files = await
|
|
55
|
-
|
|
56
|
-
|
|
48
|
+
await fs.writeFile(path.join(tmpDir, "note.md"), content);
|
|
49
|
+
const files = await getAllMarkdownFiles(tmpDir);
|
|
50
|
+
expect(files[0].frontmatter.title).toBe("My Note");
|
|
51
|
+
expect(files[0].frontmatter.tags).toEqual(["test"]);
|
|
57
52
|
});
|
|
58
|
-
|
|
59
|
-
const files = await
|
|
60
|
-
|
|
53
|
+
it("returns empty array for non-existent directory", async () => {
|
|
54
|
+
const files = await getAllMarkdownFiles(path.join(tmpDir, "nonexistent"));
|
|
55
|
+
expect(files).toEqual([]);
|
|
61
56
|
});
|
|
62
57
|
});
|
|
63
|
-
|
|
58
|
+
describe("getMarkdownBySlug", () => {
|
|
64
59
|
let tmpDir;
|
|
65
|
-
|
|
66
|
-
tmpDir = await
|
|
60
|
+
beforeEach(async () => {
|
|
61
|
+
tmpDir = await fs.mkdtemp(path.join(os.tmpdir(), "nuartz-slug-test-"));
|
|
67
62
|
});
|
|
68
|
-
|
|
69
|
-
await
|
|
63
|
+
afterEach(async () => {
|
|
64
|
+
await fs.rm(tmpDir, { recursive: true, force: true });
|
|
70
65
|
});
|
|
71
|
-
|
|
66
|
+
it("returns MarkdownFile for existing slug", async () => {
|
|
72
67
|
const content = `---
|
|
73
68
|
title: Hello
|
|
74
69
|
---
|
|
75
70
|
|
|
76
71
|
World`;
|
|
77
|
-
await
|
|
78
|
-
const file = await
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
const file = await
|
|
86
|
-
|
|
87
|
-
});
|
|
88
|
-
|
|
89
|
-
await
|
|
90
|
-
await
|
|
91
|
-
const file = await
|
|
92
|
-
|
|
93
|
-
|
|
72
|
+
await fs.writeFile(path.join(tmpDir, "hello.md"), content);
|
|
73
|
+
const file = await getMarkdownBySlug(tmpDir, "hello");
|
|
74
|
+
expect(file).not.toBeNull();
|
|
75
|
+
expect(file.slug).toBe("hello");
|
|
76
|
+
expect(file.frontmatter.title).toBe("Hello");
|
|
77
|
+
expect(file.raw).toContain("World");
|
|
78
|
+
});
|
|
79
|
+
it("returns null for non-existent slug", async () => {
|
|
80
|
+
const file = await getMarkdownBySlug(tmpDir, "does-not-exist");
|
|
81
|
+
expect(file).toBeNull();
|
|
82
|
+
});
|
|
83
|
+
it("works with nested slugs", async () => {
|
|
84
|
+
await fs.mkdir(path.join(tmpDir, "notes"), { recursive: true });
|
|
85
|
+
await fs.writeFile(path.join(tmpDir, "notes", "deep.md"), "# Deep");
|
|
86
|
+
const file = await getMarkdownBySlug(tmpDir, "notes/deep");
|
|
87
|
+
expect(file).not.toBeNull();
|
|
88
|
+
expect(file.slug).toBe("notes/deep");
|
|
94
89
|
});
|
|
95
90
|
});
|
|
96
|
-
|
|
97
|
-
|
|
91
|
+
describe("buildFileTree", () => {
|
|
92
|
+
it("builds tree from flat list of files", () => {
|
|
98
93
|
const files = [
|
|
99
94
|
{ slug: "alpha", filePath: "/alpha.md", frontmatter: { title: "Alpha" }, raw: "" },
|
|
100
95
|
{ slug: "beta", filePath: "/beta.md", frontmatter: { title: "Beta" }, raw: "" },
|
|
101
96
|
];
|
|
102
|
-
const tree =
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
});
|
|
109
|
-
|
|
97
|
+
const tree = buildFileTree(files);
|
|
98
|
+
expect(tree).toHaveLength(2);
|
|
99
|
+
expect(tree[0].name).toBe("Alpha");
|
|
100
|
+
expect(tree[0].type).toBe("file");
|
|
101
|
+
expect(tree[0].path).toBe("alpha");
|
|
102
|
+
expect(tree[1].name).toBe("Beta");
|
|
103
|
+
});
|
|
104
|
+
it("creates folder nodes for nested files", () => {
|
|
110
105
|
const files = [
|
|
111
106
|
{ slug: "notes/page1", filePath: "/notes/page1.md", frontmatter: { title: "Page 1" }, raw: "" },
|
|
112
107
|
{ slug: "notes/page2", filePath: "/notes/page2.md", frontmatter: { title: "Page 2" }, raw: "" },
|
|
113
108
|
];
|
|
114
|
-
const tree =
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
});
|
|
122
|
-
|
|
109
|
+
const tree = buildFileTree(files);
|
|
110
|
+
expect(tree).toHaveLength(1);
|
|
111
|
+
expect(tree[0].type).toBe("folder");
|
|
112
|
+
expect(tree[0].name).toBe("notes");
|
|
113
|
+
expect(tree[0].children).toHaveLength(2);
|
|
114
|
+
expect(tree[0].children[0].name).toBe("Page 1");
|
|
115
|
+
expect(tree[0].children[1].name).toBe("Page 2");
|
|
116
|
+
});
|
|
117
|
+
it("uses frontmatter.title for file display name", () => {
|
|
123
118
|
const files = [
|
|
124
119
|
{ slug: "my-file", filePath: "/my-file.md", frontmatter: { title: "Custom Title" }, raw: "" },
|
|
125
120
|
];
|
|
126
|
-
const tree =
|
|
127
|
-
|
|
121
|
+
const tree = buildFileTree(files);
|
|
122
|
+
expect(tree[0].name).toBe("Custom Title");
|
|
128
123
|
});
|
|
129
|
-
|
|
124
|
+
it("falls back to filename when no title", () => {
|
|
130
125
|
const files = [
|
|
131
126
|
{ slug: "my-file", filePath: "/my-file.md", frontmatter: {}, raw: "" },
|
|
132
127
|
];
|
|
133
|
-
const tree =
|
|
134
|
-
|
|
128
|
+
const tree = buildFileTree(files);
|
|
129
|
+
expect(tree[0].name).toBe("my-file");
|
|
135
130
|
});
|
|
136
|
-
|
|
131
|
+
it("handles deeply nested structures", () => {
|
|
137
132
|
const files = [
|
|
138
133
|
{ slug: "a/b/c", filePath: "/a/b/c.md", frontmatter: { title: "Deep" }, raw: "" },
|
|
139
134
|
];
|
|
140
|
-
const tree =
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
const tree =
|
|
150
|
-
|
|
135
|
+
const tree = buildFileTree(files);
|
|
136
|
+
expect(tree[0].type).toBe("folder");
|
|
137
|
+
expect(tree[0].name).toBe("a");
|
|
138
|
+
expect(tree[0].children[0].type).toBe("folder");
|
|
139
|
+
expect(tree[0].children[0].name).toBe("b");
|
|
140
|
+
expect(tree[0].children[0].children[0].type).toBe("file");
|
|
141
|
+
expect(tree[0].children[0].children[0].name).toBe("Deep");
|
|
142
|
+
});
|
|
143
|
+
it("returns empty array for empty input", () => {
|
|
144
|
+
const tree = buildFileTree([]);
|
|
145
|
+
expect(tree).toEqual([]);
|
|
151
146
|
});
|
|
152
147
|
});
|
|
153
148
|
//# sourceMappingURL=fs.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fs.test.js","sourceRoot":"","sources":["../../src/__tests__/fs.test.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"fs.test.js","sourceRoot":"","sources":["../../src/__tests__/fs.test.ts"],"names":[],"mappings":"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"}
|