dirvi-lib 0.4.0 → 0.6.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/domain/posix-node.d.ts +29 -0
- package/dist/domain/posix-node.d.ts.map +1 -0
- package/dist/domain/posix-node.js +20 -0
- package/dist/domain/unix-path.d.ts +1 -1
- package/dist/domain/unix-path.js +6 -9
- package/dist/index.d.ts +9 -14
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +8 -13
- package/dist/tree-surfer/cursor.d.ts +24 -0
- package/dist/tree-surfer/cursor.d.ts.map +1 -0
- package/dist/tree-surfer/cursor.js +65 -0
- package/dist/tree-surfer/fold-node/fold-node.impl.d.ts +5 -0
- package/dist/tree-surfer/fold-node/fold-node.impl.d.ts.map +1 -0
- package/dist/tree-surfer/fold-node/fold-node.impl.js +143 -0
- package/dist/tree-surfer/fold-node/fold-node.types.d.ts +70 -0
- package/dist/tree-surfer/fold-node/fold-node.types.d.ts.map +1 -0
- package/dist/tree-surfer/fold-node/fold-node.types.js +1 -0
- package/dist/tree-surfer/index.d.ts +9 -0
- package/dist/tree-surfer/index.d.ts.map +1 -0
- package/dist/tree-surfer/index.js +8 -0
- package/dist/tree-surfer/nav-node/nav-node.impl.d.ts +6 -0
- package/dist/tree-surfer/nav-node/nav-node.impl.d.ts.map +1 -0
- package/dist/tree-surfer/nav-node/nav-node.impl.js +191 -0
- package/dist/tree-surfer/nav-node/nav-node.types.d.ts +42 -0
- package/dist/tree-surfer/nav-node/nav-node.types.d.ts.map +1 -0
- package/dist/tree-surfer/nav-node/nav-node.types.js +3 -0
- package/dist/tree-surfer/state.d.ts +19 -0
- package/dist/tree-surfer/state.d.ts.map +1 -0
- package/dist/tree-surfer/state.js +109 -0
- package/dist/tree-surfer/tree-node/tree-node.arb.d.ts +31 -0
- package/dist/tree-surfer/tree-node/tree-node.arb.d.ts.map +1 -0
- package/dist/tree-surfer/tree-node/tree-node.arb.js +80 -0
- package/dist/tree-surfer/tree-node/tree-node.impl.d.ts +14 -0
- package/dist/tree-surfer/tree-node/tree-node.impl.d.ts.map +1 -0
- package/dist/tree-surfer/tree-node/tree-node.impl.js +89 -0
- package/dist/tree-surfer/tree-node/tree-node.test.d.ts +2 -0
- package/dist/tree-surfer/tree-node/tree-node.test.d.ts.map +1 -0
- package/dist/tree-surfer/tree-node/tree-node.test.js +117 -0
- package/dist/tree-surfer/tree-node/tree-node.types.d.ts +184 -0
- package/dist/tree-surfer/tree-node/tree-node.types.d.ts.map +1 -0
- package/dist/tree-surfer/tree-node/tree-node.types.js +12 -0
- package/dist/tree-surfer-ui/application/index.d.ts +3 -0
- package/dist/tree-surfer-ui/application/index.d.ts.map +1 -0
- package/dist/tree-surfer-ui/application/index.js +2 -0
- package/dist/tree-surfer-ui/application/intent-to-effect-no-state.test.d.ts +2 -0
- package/dist/tree-surfer-ui/application/intent-to-effect-no-state.test.d.ts.map +1 -0
- package/dist/tree-surfer-ui/application/intent-to-effect-no-state.test.js +192 -0
- package/dist/tree-surfer-ui/application/intent-to-effect.d.ts +6 -0
- package/dist/tree-surfer-ui/application/intent-to-effect.d.ts.map +1 -0
- package/dist/tree-surfer-ui/application/intent-to-effect.js +139 -0
- package/dist/tree-surfer-ui/application/user-input-to-intent.d.ts +3 -0
- package/dist/tree-surfer-ui/application/user-input-to-intent.d.ts.map +1 -0
- package/dist/tree-surfer-ui/application/user-input-to-intent.js +98 -0
- package/dist/tree-surfer-ui/application/user-input-to-intent.test.d.ts +2 -0
- package/dist/tree-surfer-ui/application/user-input-to-intent.test.d.ts.map +1 -0
- package/dist/tree-surfer-ui/application/user-input-to-intent.test.js +118 -0
- package/dist/tree-surfer-ui/domain/effect.d.ts +35 -0
- package/dist/tree-surfer-ui/domain/effect.d.ts.map +1 -0
- package/dist/tree-surfer-ui/domain/index.d.ts +5 -0
- package/dist/tree-surfer-ui/domain/index.d.ts.map +1 -0
- package/dist/tree-surfer-ui/domain/index.js +4 -0
- package/dist/tree-surfer-ui/domain/input-state.d.ts +8 -0
- package/dist/tree-surfer-ui/domain/input-state.d.ts.map +1 -0
- package/dist/tree-surfer-ui/domain/intent.d.ts +25 -0
- package/dist/tree-surfer-ui/domain/intent.d.ts.map +1 -0
- package/dist/tree-surfer-ui/domain/user-input.d.ts +19 -0
- package/dist/tree-surfer-ui/domain/user-input.d.ts.map +1 -0
- package/package.json +3 -2
- package/dist/application/intent-to-effect-no-state.test.d.ts +0 -2
- package/dist/application/intent-to-effect-no-state.test.d.ts.map +0 -1
- package/dist/application/intent-to-effect-no-state.test.js +0 -178
- package/dist/application/intent-to-effect.d.ts +0 -8
- package/dist/application/intent-to-effect.d.ts.map +0 -1
- package/dist/application/intent-to-effect.js +0 -142
- package/dist/application/intent-to-effect.test-no-state.d.ts +0 -2
- package/dist/application/intent-to-effect.test-no-state.d.ts.map +0 -1
- package/dist/application/intent-to-effect.test-no-state.js +0 -178
- package/dist/application/user-input-to-intent.d.ts +0 -8
- package/dist/application/user-input-to-intent.d.ts.map +0 -1
- package/dist/application/user-input-to-intent.js +0 -98
- package/dist/application/user-input-to-intent.test.d.ts +0 -2
- package/dist/application/user-input-to-intent.test.d.ts.map +0 -1
- package/dist/application/user-input-to-intent.test.js +0 -125
- package/dist/domain/cursor.d.ts +0 -19
- package/dist/domain/cursor.d.ts.map +0 -1
- package/dist/domain/cursor.js +0 -46
- package/dist/domain/display-row.d.ts +0 -34
- package/dist/domain/display-row.d.ts.map +0 -1
- package/dist/domain/display-row.js +0 -33
- package/dist/domain/effect.d.ts +0 -48
- package/dist/domain/effect.d.ts.map +0 -1
- package/dist/domain/fold-node.d.ts +0 -25
- package/dist/domain/fold-node.d.ts.map +0 -1
- package/dist/domain/fold-node.js +0 -93
- package/dist/domain/input-state.d.ts +0 -10
- package/dist/domain/input-state.d.ts.map +0 -1
- package/dist/domain/intent.d.ts +0 -34
- package/dist/domain/intent.d.ts.map +0 -1
- package/dist/domain/navigation-node.d.ts +0 -58
- package/dist/domain/navigation-node.d.ts.map +0 -1
- package/dist/domain/navigation-node.js +0 -210
- package/dist/domain/state.d.ts +0 -12
- package/dist/domain/state.d.ts.map +0 -1
- package/dist/domain/state.js +0 -12
- package/dist/domain/unix-entry.d.ts +0 -44
- package/dist/domain/unix-entry.d.ts.map +0 -1
- package/dist/domain/unix-entry.js +0 -108
- package/dist/domain/user-input.d.ts +0 -27
- package/dist/domain/user-input.d.ts.map +0 -1
- package/dist/infrastructure/get-cwd.d.ts +0 -3
- package/dist/infrastructure/get-cwd.d.ts.map +0 -1
- package/dist/infrastructure/get-cwd.js +0 -15
- package/dist/infrastructure/get-dir-lazy-entries.d.ts +0 -6
- package/dist/infrastructure/get-dir-lazy-entries.d.ts.map +0 -1
- package/dist/infrastructure/get-dir-lazy-entries.js +0 -40
- /package/dist/{domain → tree-surfer-ui/domain}/effect.js +0 -0
- /package/dist/{domain → tree-surfer-ui/domain}/input-state.js +0 -0
- /package/dist/{domain → tree-surfer-ui/domain}/intent.js +0 -0
- /package/dist/{domain → tree-surfer-ui/domain}/user-input.js +0 -0
|
@@ -1,33 +0,0 @@
|
|
|
1
|
-
import { UnixEntryPath } from './unix-entry.js';
|
|
2
|
-
import { entryNamesEqual } from './unix-entry.js';
|
|
3
|
-
export const DisplayEntry = {
|
|
4
|
-
fromUnixEntry(entry) {
|
|
5
|
-
if (entry.kind === 'directory') {
|
|
6
|
-
return {
|
|
7
|
-
kind: 'directory',
|
|
8
|
-
name: entry.name,
|
|
9
|
-
};
|
|
10
|
-
}
|
|
11
|
-
return entry;
|
|
12
|
-
},
|
|
13
|
-
};
|
|
14
|
-
export const DisplayRow = {
|
|
15
|
-
equal(firstRow, secondRow) {
|
|
16
|
-
if (firstRow.kind !== secondRow.kind) {
|
|
17
|
-
return false;
|
|
18
|
-
}
|
|
19
|
-
if (firstRow.kind === 'fold' && secondRow.kind === 'fold') {
|
|
20
|
-
return (
|
|
21
|
-
UnixEntryPath.equal(firstRow.parentPath, secondRow.parentPath) &&
|
|
22
|
-
entryNamesEqual(firstRow.entryNames, secondRow.entryNames)
|
|
23
|
-
);
|
|
24
|
-
}
|
|
25
|
-
if (firstRow.kind === 'entry' && secondRow.kind === 'entry') {
|
|
26
|
-
return (
|
|
27
|
-
UnixEntryPath.equal(firstRow.parentPath, secondRow.parentPath) &&
|
|
28
|
-
firstRow.entry.name === secondRow.entry.name
|
|
29
|
-
);
|
|
30
|
-
}
|
|
31
|
-
return false;
|
|
32
|
-
},
|
|
33
|
-
};
|
package/dist/domain/effect.d.ts
DELETED
|
@@ -1,48 +0,0 @@
|
|
|
1
|
-
import { UnixEntry, UnixEntryPath } from './unix-entry.js';
|
|
2
|
-
import { InputState } from './input-state.js';
|
|
3
|
-
export type Effect =
|
|
4
|
-
| {
|
|
5
|
-
effectType: 'dispatchEffectAction';
|
|
6
|
-
action: EffectAction;
|
|
7
|
-
}
|
|
8
|
-
| {
|
|
9
|
-
effectType: 'loadDir';
|
|
10
|
-
path: UnixEntryPath;
|
|
11
|
-
}
|
|
12
|
-
| {
|
|
13
|
-
effectType: 'printFile';
|
|
14
|
-
path: UnixEntryPath;
|
|
15
|
-
}
|
|
16
|
-
| {
|
|
17
|
-
effectType: 'quit';
|
|
18
|
-
exitMessage: string;
|
|
19
|
-
}
|
|
20
|
-
| {
|
|
21
|
-
effectType: 'setInputState';
|
|
22
|
-
inputState: InputState;
|
|
23
|
-
};
|
|
24
|
-
export type EffectAction =
|
|
25
|
-
| {
|
|
26
|
-
effectActionType: 'nextEntry';
|
|
27
|
-
}
|
|
28
|
-
| {
|
|
29
|
-
effectActionType: 'prevEntry';
|
|
30
|
-
}
|
|
31
|
-
| {
|
|
32
|
-
effectActionType: 'updateDir';
|
|
33
|
-
path: UnixEntryPath;
|
|
34
|
-
entries: UnixEntry[] | undefined;
|
|
35
|
-
}
|
|
36
|
-
| {
|
|
37
|
-
effectActionType: 'outDir';
|
|
38
|
-
}
|
|
39
|
-
| {
|
|
40
|
-
effectActionType: 'fold';
|
|
41
|
-
}
|
|
42
|
-
| {
|
|
43
|
-
effectActionType: 'unfold';
|
|
44
|
-
}
|
|
45
|
-
| {
|
|
46
|
-
effectActionType: 'toggleFold';
|
|
47
|
-
};
|
|
48
|
-
//# sourceMappingURL=effect.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"effect.d.ts","sourceRoot":"","sources":["../../src/domain/effect.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC3D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAG9C,MAAM,MAAM,MAAM,GACd;IACE,UAAU,EAAE,sBAAsB,CAAC;IACnC,MAAM,EAAE,YAAY,CAAC;CACtB,GACD;IACE,UAAU,EAAE,SAAS,CAAC;IACtB,IAAI,EAAE,aAAa,CAAC;CACrB,GACD;IACE,UAAU,EAAE,WAAW,CAAC;IACxB,IAAI,EAAE,aAAa,CAAC;CACrB,GACD;IACE,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;CACrB,GACD;IACE,UAAU,EAAE,eAAe,CAAC;IAC5B,UAAU,EAAE,UAAU,CAAC;CACxB,CAAC;AAGN,MAAM,MAAM,YAAY,GACpB;IACE,gBAAgB,EAAE,WAAW,CAAC;CAC/B,GACD;IACE,gBAAgB,EAAE,WAAW,CAAC;CAC/B,GACD;IACE,gBAAgB,EAAE,WAAW,CAAC;IAC9B,IAAI,EAAE,aAAa,CAAC;IACpB,OAAO,EAAE,SAAS,EAAE,GAAG,SAAS,CAAC;CAClC,GACD;IACE,gBAAgB,EAAE,QAAQ,CAAC;CAC5B,GACD;IACE,gBAAgB,EAAE,MAAM,CAAC;CAC1B,GACD;IACE,gBAAgB,EAAE,QAAQ,CAAC;CAC5B,GACD;IACE,gBAAgB,EAAE,YAAY,CAAC;CAChC,CAAC"}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { UnixEntry, UnixEntryName, UnixEntryPath } from './unix-entry.js';
|
|
2
|
-
export type FoldNode = {
|
|
3
|
-
children: Record<UnixEntryName, FoldNode>;
|
|
4
|
-
folds: UnixEntryName[];
|
|
5
|
-
};
|
|
6
|
-
export declare const FoldNode: {
|
|
7
|
-
getAtPath(rootNode: FoldNode, path: UnixEntryPath): FoldNode | undefined;
|
|
8
|
-
getIfEntryFolded(node: FoldNode | undefined, entry: UnixEntry): boolean;
|
|
9
|
-
modifyAtPath(
|
|
10
|
-
rootNode: FoldNode,
|
|
11
|
-
path: UnixEntryName[],
|
|
12
|
-
modifier: (targetNode: FoldNode) => FoldNode,
|
|
13
|
-
): FoldNode;
|
|
14
|
-
addFoldedEntry(node: FoldNode, entry: UnixEntry): FoldNode;
|
|
15
|
-
addFoldedEntryAtPath(
|
|
16
|
-
rootNode: FoldNode,
|
|
17
|
-
path: UnixEntryName[],
|
|
18
|
-
entry: UnixEntry,
|
|
19
|
-
): FoldNode;
|
|
20
|
-
createEmpty(): FoldNode;
|
|
21
|
-
setFoldedEntries(node: FoldNode, entries: UnixEntry[]): FoldNode;
|
|
22
|
-
removeFoldedEntry(node: FoldNode, entry: UnixEntry): FoldNode;
|
|
23
|
-
clearFoldedEntries(node: FoldNode): FoldNode;
|
|
24
|
-
};
|
|
25
|
-
//# sourceMappingURL=fold-node.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"fold-node.d.ts","sourceRoot":"","sources":["../../src/domain/fold-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAE1E,MAAM,MAAM,QAAQ,GAAG;IACrB,QAAQ,EAAE,MAAM,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;IAC1C,KAAK,EAAE,aAAa,EAAE,CAAC;CACxB,CAAC;AAEF,eAAO,MAAM,QAAQ;wBAEC,QAAQ,QAAQ,aAAa,GAAG,QAAQ,GAAG,SAAS;2BAgBjD,QAAQ,GAAG,SAAS,SAAS,SAAS,GAAG,OAAO;2BAM3D,QAAQ,QACZ,aAAa,EAAE,YACX,CAAC,UAAU,EAAE,QAAQ,KAAK,QAAQ,GAC3C,QAAQ;yBAwBU,QAAQ,SAAS,SAAS,GAAG,QAAQ;mCAU9C,QAAQ,QACZ,aAAa,EAAE,SACd,SAAS,GACf,QAAQ;mBAMI,QAAQ;2BAOA,QAAQ,WAAW,SAAS,EAAE,GAAG,QAAQ;4BAOxC,QAAQ,SAAS,SAAS,GAAG,QAAQ;6BAWpC,QAAQ,GAAG,QAAQ;CAO7C,CAAC"}
|
package/dist/domain/fold-node.js
DELETED
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
export const FoldNode = {
|
|
2
|
-
// Query-Like
|
|
3
|
-
getAtPath(rootNode, path) {
|
|
4
|
-
const [currentName, ...remainingPath] = path;
|
|
5
|
-
if (currentName === undefined) {
|
|
6
|
-
return rootNode;
|
|
7
|
-
}
|
|
8
|
-
const childNode = rootNode.children[currentName];
|
|
9
|
-
if (childNode === undefined) {
|
|
10
|
-
return undefined;
|
|
11
|
-
}
|
|
12
|
-
return FoldNode.getAtPath(childNode, remainingPath);
|
|
13
|
-
},
|
|
14
|
-
getIfEntryFolded(node, entry) {
|
|
15
|
-
return node !== undefined && hasFoldedEntryNamed(node, entry.name);
|
|
16
|
-
},
|
|
17
|
-
// Command/Modifer-Like
|
|
18
|
-
modifyAtPath(rootNode, path, modifier) {
|
|
19
|
-
const [currentName, ...remainingPath] = path;
|
|
20
|
-
// Base case
|
|
21
|
-
if (currentName === undefined) {
|
|
22
|
-
return modifier(rootNode);
|
|
23
|
-
}
|
|
24
|
-
// Create childNode to create path in tree to the needed node
|
|
25
|
-
const childNode = rootNode.children[currentName] ?? FoldNode.createEmpty();
|
|
26
|
-
return {
|
|
27
|
-
...rootNode,
|
|
28
|
-
children: {
|
|
29
|
-
...rootNode.children,
|
|
30
|
-
[currentName]: FoldNode.modifyAtPath(
|
|
31
|
-
childNode,
|
|
32
|
-
remainingPath,
|
|
33
|
-
modifier,
|
|
34
|
-
),
|
|
35
|
-
},
|
|
36
|
-
};
|
|
37
|
-
},
|
|
38
|
-
addFoldedEntry(node, entry) {
|
|
39
|
-
// Avoid duplicates
|
|
40
|
-
if (hasFoldedEntryNamed(node, entry.name)) {
|
|
41
|
-
return node;
|
|
42
|
-
}
|
|
43
|
-
return setFoldedEntriesNamed(node, [...node.folds, entry.name]);
|
|
44
|
-
},
|
|
45
|
-
addFoldedEntryAtPath(rootNode, path, entry) {
|
|
46
|
-
return FoldNode.modifyAtPath(rootNode, path, (node) =>
|
|
47
|
-
FoldNode.addFoldedEntry(node, entry),
|
|
48
|
-
);
|
|
49
|
-
},
|
|
50
|
-
createEmpty() {
|
|
51
|
-
return {
|
|
52
|
-
children: Object.create(null),
|
|
53
|
-
folds: [],
|
|
54
|
-
};
|
|
55
|
-
},
|
|
56
|
-
setFoldedEntries(node, entries) {
|
|
57
|
-
return setFoldedEntriesNamed(
|
|
58
|
-
node,
|
|
59
|
-
entries.map((entry) => entry.name),
|
|
60
|
-
);
|
|
61
|
-
},
|
|
62
|
-
removeFoldedEntry(node, entry) {
|
|
63
|
-
if (!hasFoldedEntryNamed(node, entry.name)) {
|
|
64
|
-
return node;
|
|
65
|
-
}
|
|
66
|
-
return setFoldedEntriesNamed(
|
|
67
|
-
node,
|
|
68
|
-
node.folds.filter((entryName) => entryName !== entry.name),
|
|
69
|
-
);
|
|
70
|
-
},
|
|
71
|
-
clearFoldedEntries(node) {
|
|
72
|
-
if (node.folds.length === 0) {
|
|
73
|
-
return node;
|
|
74
|
-
}
|
|
75
|
-
return setFoldedEntriesNamed(node, []);
|
|
76
|
-
},
|
|
77
|
-
};
|
|
78
|
-
// PRIVATE HELPERS
|
|
79
|
-
// Queries
|
|
80
|
-
function hasFoldedEntryNamed(node, entryName) {
|
|
81
|
-
return node.folds.includes(entryName);
|
|
82
|
-
}
|
|
83
|
-
function uniqueEntryNames(entryNames) {
|
|
84
|
-
return [...new Set(entryNames)];
|
|
85
|
-
}
|
|
86
|
-
// Adding
|
|
87
|
-
function setFoldedEntriesNamed(node, entryNames) {
|
|
88
|
-
const uniqueNames = uniqueEntryNames(entryNames);
|
|
89
|
-
return {
|
|
90
|
-
...node,
|
|
91
|
-
folds: uniqueNames,
|
|
92
|
-
};
|
|
93
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"input-state.d.ts","sourceRoot":"","sources":["../../src/domain/input-state.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAClB;IACE,SAAS,EAAE,QAAQ,CAAC;IACpB,YAAY,EAAE,MAAM,CAAC;CACtB,GACD;IACE,SAAS,EAAE,SAAS,CAAC;IACrB,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC"}
|
package/dist/domain/intent.d.ts
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
export type Intent = NormalModeIntent | CommandLineIntent;
|
|
2
|
-
export type NormalModeIntent =
|
|
3
|
-
| {
|
|
4
|
-
intentType: 'normalRight';
|
|
5
|
-
}
|
|
6
|
-
| {
|
|
7
|
-
intentType: 'normalLeft';
|
|
8
|
-
}
|
|
9
|
-
| {
|
|
10
|
-
intentType: 'normalDown';
|
|
11
|
-
}
|
|
12
|
-
| {
|
|
13
|
-
intentType: 'normalUp';
|
|
14
|
-
}
|
|
15
|
-
| {
|
|
16
|
-
intentType: 'setNormalBuffer';
|
|
17
|
-
normalBuffer: string;
|
|
18
|
-
};
|
|
19
|
-
export type CommandLineIntent =
|
|
20
|
-
| {
|
|
21
|
-
intentType: 'enterCommandLineMode';
|
|
22
|
-
}
|
|
23
|
-
| {
|
|
24
|
-
intentType: 'setCommandLine';
|
|
25
|
-
commandLine: string;
|
|
26
|
-
}
|
|
27
|
-
| {
|
|
28
|
-
intentType: 'executeCommandLine';
|
|
29
|
-
commandLine: string;
|
|
30
|
-
}
|
|
31
|
-
| {
|
|
32
|
-
intentType: 'exitCommandLineMode';
|
|
33
|
-
};
|
|
34
|
-
//# sourceMappingURL=intent.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"intent.d.ts","sourceRoot":"","sources":["../../src/domain/intent.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,MAAM,GAAG,gBAAgB,GAAG,iBAAiB,CAAC;AAE1D,MAAM,MAAM,gBAAgB,GACxB;IACE,UAAU,EAAE,aAAa,CAAC;CAC3B,GACD;IACE,UAAU,EAAE,YAAY,CAAC;CAC1B,GACD;IACE,UAAU,EAAE,YAAY,CAAC;CAC1B,GACD;IACE,UAAU,EAAE,UAAU,CAAC;CACxB,GACD;IACE,UAAU,EAAE,iBAAiB,CAAC;IAC9B,YAAY,EAAE,MAAM,CAAC;CACtB,CAAC;AAEN,MAAM,MAAM,iBAAiB,GACzB;IACE,UAAU,EAAE,sBAAsB,CAAC;CACpC,GACD;IACE,UAAU,EAAE,gBAAgB,CAAC;IAC7B,WAAW,EAAE,MAAM,CAAC;CACrB,GACD;IACE,UAAU,EAAE,oBAAoB,CAAC;IACjC,WAAW,EAAE,MAAM,CAAC;CACrB,GACD;IACE,UAAU,EAAE,qBAAqB,CAAC;CACnC,CAAC"}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import { UnixEntry, UnixEntryName, UnixEntryPath } from './unix-entry.js';
|
|
2
|
-
import { UnixPath } from './unix-path.js';
|
|
3
|
-
import { FoldNode } from './fold-node.js';
|
|
4
|
-
import { Cursor } from './cursor.js';
|
|
5
|
-
export type NavigationEntry =
|
|
6
|
-
| {
|
|
7
|
-
kind: 'file';
|
|
8
|
-
name: UnixEntryName;
|
|
9
|
-
}
|
|
10
|
-
| {
|
|
11
|
-
kind: 'symlink';
|
|
12
|
-
name: UnixEntryName;
|
|
13
|
-
target: UnixPath;
|
|
14
|
-
}
|
|
15
|
-
| {
|
|
16
|
-
/**
|
|
17
|
-
* Undefined node means the directory has not been loaded.
|
|
18
|
-
*/
|
|
19
|
-
kind: 'directory';
|
|
20
|
-
name: UnixEntryName;
|
|
21
|
-
node?: NavigationNode;
|
|
22
|
-
};
|
|
23
|
-
/**
|
|
24
|
-
* A directory as navigated: list of visible entries and folded entries.
|
|
25
|
-
*/
|
|
26
|
-
export type NavigationNode = {
|
|
27
|
-
/**
|
|
28
|
-
* Currently visible entries.
|
|
29
|
-
*/
|
|
30
|
-
entries: NavigationEntry[];
|
|
31
|
-
/**
|
|
32
|
-
* Currently loaded entries hidden by this directory's fold.
|
|
33
|
-
*/
|
|
34
|
-
foldedEntries: NavigationEntry[];
|
|
35
|
-
};
|
|
36
|
-
export declare const NavigationNode: {
|
|
37
|
-
from(
|
|
38
|
-
entries: UnixEntry[] | undefined,
|
|
39
|
-
foldNode: FoldNode | undefined,
|
|
40
|
-
): NavigationNode;
|
|
41
|
-
getNodeAtPath(
|
|
42
|
-
navigation: NavigationNode,
|
|
43
|
-
path: UnixEntryPath,
|
|
44
|
-
): NavigationNode | undefined;
|
|
45
|
-
getEntryAtPath(
|
|
46
|
-
navigation: NavigationNode,
|
|
47
|
-
path: UnixEntryPath,
|
|
48
|
-
): NavigationEntry | undefined;
|
|
49
|
-
nextCursor(rootNode: NavigationNode, cursor: Cursor): Cursor | undefined;
|
|
50
|
-
previousCursor(rootNode: NavigationNode, cursor: Cursor): Cursor | undefined;
|
|
51
|
-
cursorAfterFold(rootNode: NavigationNode, cursor: Cursor): Cursor | undefined;
|
|
52
|
-
parentCursor(navigation: NavigationNode, cursor: Cursor): Cursor | undefined;
|
|
53
|
-
visibleFilesPaths(
|
|
54
|
-
navigation: NavigationNode,
|
|
55
|
-
parentPath?: UnixEntryPath,
|
|
56
|
-
): UnixEntryPath[];
|
|
57
|
-
};
|
|
58
|
-
//# sourceMappingURL=navigation-node.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"navigation-node.d.ts","sourceRoot":"","sources":["../../src/domain/navigation-node.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,MAAM,eAAe,GACvB;IACE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,aAAa,CAAC;CACrB,GACD;IACE,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,aAAa,CAAC;IACpB,MAAM,EAAE,QAAQ,CAAC;CAClB,GACD;IACE;;OAEG;IACH,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,aAAa,CAAC;IACpB,IAAI,CAAC,EAAE,cAAc,CAAC;CACvB,CAAC;AAEN;;GAEG;AACH,MAAM,MAAM,cAAc,GAAG;IAC3B;;OAEG;IACH,OAAO,EAAE,eAAe,EAAE,CAAC;IAE3B;;OAEG;IACH,aAAa,EAAE,eAAe,EAAE,CAAC;CAClC,CAAC;AAEF,eAAO,MAAM,cAAc;kBAEd,SAAS,EAAE,GAAG,SAAS,YACtB,QAAQ,GAAG,SAAS,GAC7B,cAAc;8BA4DH,cAAc,QACpB,aAAa,GAClB,cAAc,GAAG,SAAS;+BAyBf,cAAc,QACpB,aAAa,GAClB,eAAe,GAAG,SAAS;yBA0BT,cAAc,UAAU,MAAM,GAAG,MAAM,GAAG,SAAS;6BAc/C,cAAc,UAAU,MAAM,GAAG,MAAM,GAAG,SAAS;8BAehE,cAAc,UAChB,MAAM,GACb,MAAM,GAAG,SAAS;6BAsCI,cAAc,UAAU,MAAM,GAAG,MAAM,GAAG,SAAS;kCA6B9D,cAAc,eACd,aAAa,GACxB,aAAa,EAAE;CA2BnB,CAAC"}
|
|
@@ -1,210 +0,0 @@
|
|
|
1
|
-
import { UnixEntryPath } from './unix-entry.js';
|
|
2
|
-
import { Cursor } from './cursor.js';
|
|
3
|
-
export const NavigationNode = {
|
|
4
|
-
from(entries, foldNode) {
|
|
5
|
-
if (entries === undefined) {
|
|
6
|
-
return {
|
|
7
|
-
entries: [],
|
|
8
|
-
foldedEntries: [],
|
|
9
|
-
};
|
|
10
|
-
}
|
|
11
|
-
const foldedNames = new Set(foldNode?.folds ?? []);
|
|
12
|
-
const visibleEntries = [];
|
|
13
|
-
const foldedEntries = [];
|
|
14
|
-
for (const entry of entries) {
|
|
15
|
-
let navigationEntry;
|
|
16
|
-
switch (entry.kind) {
|
|
17
|
-
case 'file':
|
|
18
|
-
navigationEntry = {
|
|
19
|
-
kind: 'file',
|
|
20
|
-
name: entry.name,
|
|
21
|
-
};
|
|
22
|
-
break;
|
|
23
|
-
case 'symlink':
|
|
24
|
-
navigationEntry = {
|
|
25
|
-
kind: 'symlink',
|
|
26
|
-
name: entry.name,
|
|
27
|
-
target: entry.target,
|
|
28
|
-
};
|
|
29
|
-
break;
|
|
30
|
-
case 'directory': {
|
|
31
|
-
const childFoldNode = foldNode?.children[entry.name];
|
|
32
|
-
navigationEntry = {
|
|
33
|
-
kind: 'directory',
|
|
34
|
-
name: entry.name,
|
|
35
|
-
node:
|
|
36
|
-
entry.entries === undefined
|
|
37
|
-
? undefined
|
|
38
|
-
: NavigationNode.from(entry.entries, childFoldNode),
|
|
39
|
-
};
|
|
40
|
-
break;
|
|
41
|
-
}
|
|
42
|
-
}
|
|
43
|
-
if (foldedNames.has(entry.name)) {
|
|
44
|
-
foldedEntries.push(navigationEntry);
|
|
45
|
-
} else {
|
|
46
|
-
visibleEntries.push(navigationEntry);
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
return {
|
|
50
|
-
entries: visibleEntries,
|
|
51
|
-
foldedEntries,
|
|
52
|
-
};
|
|
53
|
-
},
|
|
54
|
-
getNodeAtPath(navigation, path) {
|
|
55
|
-
const [currentName, ...remainingPath] = path;
|
|
56
|
-
// An empty path identifies the current node.
|
|
57
|
-
if (currentName === undefined) {
|
|
58
|
-
return navigation;
|
|
59
|
-
}
|
|
60
|
-
const entry = [...navigation.entries, ...navigation.foldedEntries].find(
|
|
61
|
-
(candidate) => candidate.name === currentName,
|
|
62
|
-
);
|
|
63
|
-
if (entry === undefined || entry.kind !== 'directory') {
|
|
64
|
-
return undefined;
|
|
65
|
-
}
|
|
66
|
-
// The directory has not been loaded/opened.
|
|
67
|
-
if (entry.node === undefined) {
|
|
68
|
-
return undefined;
|
|
69
|
-
}
|
|
70
|
-
return NavigationNode.getNodeAtPath(entry.node, remainingPath);
|
|
71
|
-
},
|
|
72
|
-
getEntryAtPath(navigation, path) {
|
|
73
|
-
const [currentName, ...remainingPath] = path;
|
|
74
|
-
if (currentName === undefined) {
|
|
75
|
-
return undefined;
|
|
76
|
-
}
|
|
77
|
-
const entry = [...navigation.entries, ...navigation.foldedEntries].find(
|
|
78
|
-
(candidate) => candidate.name === currentName,
|
|
79
|
-
);
|
|
80
|
-
if (entry === undefined) {
|
|
81
|
-
return undefined;
|
|
82
|
-
}
|
|
83
|
-
if (remainingPath.length === 0) {
|
|
84
|
-
return entry;
|
|
85
|
-
}
|
|
86
|
-
if (entry.kind !== 'directory' || entry.node === undefined) {
|
|
87
|
-
return undefined;
|
|
88
|
-
}
|
|
89
|
-
return NavigationNode.getEntryAtPath(entry.node, remainingPath);
|
|
90
|
-
},
|
|
91
|
-
nextCursor(rootNode, cursor) {
|
|
92
|
-
const cursors = cursorsInNode(rootNode, []);
|
|
93
|
-
const currentIndex = cursors.findIndex((candidate) =>
|
|
94
|
-
Cursor.equal(candidate, cursor),
|
|
95
|
-
);
|
|
96
|
-
if (currentIndex === -1 || currentIndex === cursors.length - 1) {
|
|
97
|
-
return undefined;
|
|
98
|
-
}
|
|
99
|
-
return cursors[currentIndex + 1];
|
|
100
|
-
},
|
|
101
|
-
previousCursor(rootNode, cursor) {
|
|
102
|
-
const cursors = cursorsInNode(rootNode, []);
|
|
103
|
-
const currentIndex = cursors.findIndex((candidate) =>
|
|
104
|
-
Cursor.equal(candidate, cursor),
|
|
105
|
-
);
|
|
106
|
-
if (currentIndex <= 0) {
|
|
107
|
-
return undefined;
|
|
108
|
-
}
|
|
109
|
-
return cursors[currentIndex - 1];
|
|
110
|
-
},
|
|
111
|
-
cursorAfterFold(rootNode, cursor) {
|
|
112
|
-
if (cursor.kind === 'fold') {
|
|
113
|
-
return undefined;
|
|
114
|
-
}
|
|
115
|
-
const cursors = cursorsInNode(rootNode, []);
|
|
116
|
-
const currentIndex = cursors.findIndex((candidate) =>
|
|
117
|
-
Cursor.equal(candidate, cursor),
|
|
118
|
-
);
|
|
119
|
-
if (currentIndex === -1) {
|
|
120
|
-
return undefined;
|
|
121
|
-
}
|
|
122
|
-
const foldedPath = [...cursor.parentPath, cursor.entryName];
|
|
123
|
-
for (let index = currentIndex + 1; index < cursors.length; index += 1) {
|
|
124
|
-
const candidate = cursors[index];
|
|
125
|
-
if (candidate === undefined) {
|
|
126
|
-
continue;
|
|
127
|
-
}
|
|
128
|
-
if (cursorBelongsToSubtree(candidate, foldedPath)) {
|
|
129
|
-
continue;
|
|
130
|
-
}
|
|
131
|
-
return candidate;
|
|
132
|
-
}
|
|
133
|
-
// The fold row will be created at the end of this directory.
|
|
134
|
-
return {
|
|
135
|
-
kind: 'fold',
|
|
136
|
-
parentPath: cursor.parentPath,
|
|
137
|
-
};
|
|
138
|
-
},
|
|
139
|
-
parentCursor(navigation, cursor) {
|
|
140
|
-
const parentPath = cursor.parentPath;
|
|
141
|
-
// The cursor is already in the root directory.
|
|
142
|
-
if (parentPath.length === 0) {
|
|
143
|
-
return undefined;
|
|
144
|
-
}
|
|
145
|
-
const entryName = parentPath.at(-1);
|
|
146
|
-
if (entryName === undefined) {
|
|
147
|
-
return undefined;
|
|
148
|
-
}
|
|
149
|
-
const containingPath = parentPath.slice(0, -1);
|
|
150
|
-
const entry = NavigationNode.getEntryAtPath(navigation, parentPath);
|
|
151
|
-
if (entry === undefined || entry.kind !== 'directory') {
|
|
152
|
-
return undefined;
|
|
153
|
-
}
|
|
154
|
-
return {
|
|
155
|
-
kind: 'entry',
|
|
156
|
-
parentPath: containingPath,
|
|
157
|
-
entryName,
|
|
158
|
-
};
|
|
159
|
-
},
|
|
160
|
-
visibleFilesPaths(navigation, parentPath = []) {
|
|
161
|
-
const paths = [];
|
|
162
|
-
for (const entry of navigation.entries) {
|
|
163
|
-
const entryPath = [...parentPath, entry.name];
|
|
164
|
-
switch (entry.kind) {
|
|
165
|
-
case 'file':
|
|
166
|
-
paths.push(entryPath);
|
|
167
|
-
break;
|
|
168
|
-
case 'symlink':
|
|
169
|
-
// Do not recurse through symlinks.
|
|
170
|
-
break;
|
|
171
|
-
case 'directory':
|
|
172
|
-
if (entry.node !== undefined) {
|
|
173
|
-
paths.push(
|
|
174
|
-
...NavigationNode.visibleFilesPaths(entry.node, entryPath),
|
|
175
|
-
);
|
|
176
|
-
}
|
|
177
|
-
break;
|
|
178
|
-
}
|
|
179
|
-
}
|
|
180
|
-
return paths;
|
|
181
|
-
},
|
|
182
|
-
};
|
|
183
|
-
function cursorsInNode(node, parentPath) {
|
|
184
|
-
const cursors = [];
|
|
185
|
-
for (const entry of node.entries) {
|
|
186
|
-
cursors.push({
|
|
187
|
-
kind: 'entry',
|
|
188
|
-
parentPath,
|
|
189
|
-
entryName: entry.name,
|
|
190
|
-
});
|
|
191
|
-
if (entry.kind !== 'directory' || entry.node === undefined) {
|
|
192
|
-
continue;
|
|
193
|
-
}
|
|
194
|
-
cursors.push(...cursorsInNode(entry.node, [...parentPath, entry.name]));
|
|
195
|
-
}
|
|
196
|
-
if (node.foldedEntries.length > 0) {
|
|
197
|
-
cursors.push({
|
|
198
|
-
kind: 'fold',
|
|
199
|
-
parentPath,
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
|
-
return cursors;
|
|
203
|
-
}
|
|
204
|
-
function cursorBelongsToSubtree(cursor, entryPath) {
|
|
205
|
-
if (cursor.kind === 'fold') {
|
|
206
|
-
return UnixEntryPath.isStrictPathPrefix(entryPath, cursor.parentPath);
|
|
207
|
-
}
|
|
208
|
-
const cursorPath = [...cursor.parentPath, cursor.entryName];
|
|
209
|
-
return UnixEntryPath.isStrictPathPrefix(entryPath, cursorPath);
|
|
210
|
-
}
|
package/dist/domain/state.d.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { UnixEntry } from './unix-entry.js';
|
|
2
|
-
import type { FoldNode } from './fold-node.js';
|
|
3
|
-
import { Cursor } from './cursor.js';
|
|
4
|
-
export type State = {
|
|
5
|
-
buffer: UnixEntry[];
|
|
6
|
-
folds: FoldNode;
|
|
7
|
-
cursor: Cursor;
|
|
8
|
-
};
|
|
9
|
-
export declare const View: {
|
|
10
|
-
getEntryAtCursor(view: State): UnixEntry | undefined;
|
|
11
|
-
};
|
|
12
|
-
//# sourceMappingURL=state.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"state.d.ts","sourceRoot":"","sources":["../../src/domain/state.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAErC,MAAM,MAAM,KAAK,GAAG;IAClB,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,KAAK,EAAE,QAAQ,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,eAAO,MAAM,IAAI;2BACQ,KAAK,GAAG,SAAS,GAAG,SAAS;CAUrD,CAAC"}
|
package/dist/domain/state.js
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import { UnixEntry } from './unix-entry.js';
|
|
2
|
-
import { Cursor } from './cursor.js';
|
|
3
|
-
export const View = {
|
|
4
|
-
getEntryAtCursor(view) {
|
|
5
|
-
const path = Cursor.getPath(view.cursor);
|
|
6
|
-
// Nothing on folds
|
|
7
|
-
if (path === undefined) {
|
|
8
|
-
return undefined;
|
|
9
|
-
}
|
|
10
|
-
return UnixEntry.getEntryAtPath(view.buffer, path);
|
|
11
|
-
},
|
|
12
|
-
};
|
|
@@ -1,44 +0,0 @@
|
|
|
1
|
-
import { z } from 'zod';
|
|
2
|
-
import { UnixPath } from './unix-path.js';
|
|
3
|
-
export declare const UnixEntryNameSchema: z.ZodString;
|
|
4
|
-
export type UnixEntryName = z.output<typeof UnixEntryNameSchema>;
|
|
5
|
-
export declare function entryNamesEqual(
|
|
6
|
-
left: UnixEntryName[],
|
|
7
|
-
right: UnixEntryName[],
|
|
8
|
-
): boolean;
|
|
9
|
-
export type UnixEntry =
|
|
10
|
-
| {
|
|
11
|
-
kind: 'file';
|
|
12
|
-
name: UnixEntryName;
|
|
13
|
-
}
|
|
14
|
-
| {
|
|
15
|
-
kind: 'symlink';
|
|
16
|
-
name: UnixEntryName;
|
|
17
|
-
target: UnixPath;
|
|
18
|
-
}
|
|
19
|
-
| {
|
|
20
|
-
kind: 'directory';
|
|
21
|
-
name: UnixEntryName;
|
|
22
|
-
entries?: UnixEntry[];
|
|
23
|
-
};
|
|
24
|
-
export declare const UnixEntry: {
|
|
25
|
-
getEntryAtPath(
|
|
26
|
-
entries: UnixEntry[],
|
|
27
|
-
path: UnixEntryPath,
|
|
28
|
-
): UnixEntry | undefined;
|
|
29
|
-
getEntriesAtPath(
|
|
30
|
-
entries: UnixEntry[],
|
|
31
|
-
path: UnixEntryPath,
|
|
32
|
-
): UnixEntry[] | undefined;
|
|
33
|
-
setEntriesAtPath(
|
|
34
|
-
entries: UnixEntry[],
|
|
35
|
-
path: UnixEntryPath,
|
|
36
|
-
newEntries: UnixEntry[] | undefined,
|
|
37
|
-
): UnixEntry[];
|
|
38
|
-
};
|
|
39
|
-
export type UnixEntryPath = UnixEntryName[];
|
|
40
|
-
export declare const UnixEntryPath: {
|
|
41
|
-
equal(left: UnixEntryPath, right: UnixEntryPath): boolean;
|
|
42
|
-
isStrictPathPrefix(prefix: UnixEntryPath, path: UnixEntryPath): boolean;
|
|
43
|
-
};
|
|
44
|
-
//# sourceMappingURL=unix-entry.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"unix-entry.d.ts","sourceRoot":"","sources":["../../src/domain/unix-entry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG1C,eAAO,MAAM,mBAAmB,aAQ5B,CAAC;AAEL,MAAM,MAAM,aAAa,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,mBAAmB,CAAC,CAAC;AAEjE,wBAAgB,eAAe,CAC7B,IAAI,EAAE,aAAa,EAAE,EACrB,KAAK,EAAE,aAAa,EAAE,GACrB,OAAO,CAKT;AAED,MAAM,MAAM,SAAS,GACjB;IACE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,aAAa,CAAC;CACrB,GACD;IACE,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,aAAa,CAAC;IACpB,MAAM,EAAE,QAAQ,CAAC;CAClB,GACD;IACE,IAAI,EAAE,WAAW,CAAC;IAClB,IAAI,EAAE,aAAa,CAAC;IAEpB,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;CACvB,CAAC;AAEN,eAAO,MAAM,SAAS;4BAGT,SAAS,EAAE,QACd,aAAa,GAClB,SAAS,GAAG,SAAS;8BA6Bb,SAAS,EAAE,QACd,aAAa,GAClB,SAAS,EAAE,GAAG,SAAS;8BAgBf,SAAS,EAAE,QACd,aAAa,cACP,SAAS,EAAE,GAAG,SAAS,GAClC,SAAS,EAAE;CAyDf,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,aAAa,EAAE,CAAC;AAE5C,eAAO,MAAM,aAAa;gBACZ,aAAa,SAAS,aAAa,GAAG,OAAO;+BAI9B,aAAa,QAAQ,aAAa,GAAG,OAAO;CAOxE,CAAC"}
|