@powerhousedao/vetra 6.0.0-dev.50 → 6.0.0-dev.53
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/subgraphs/index.d.ts +0 -5
- package/dist/subgraphs/index.d.ts.map +1 -1
- package/dist/subgraphs/index.js +0 -5
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +16 -16
- package/dist/subgraphs/__tests__/app-module-permissions.test.d.ts +0 -2
- package/dist/subgraphs/__tests__/app-module-permissions.test.d.ts.map +0 -1
- package/dist/subgraphs/__tests__/app-module-permissions.test.js +0 -436
- package/dist/subgraphs/app-module/index.d.ts +0 -11
- package/dist/subgraphs/app-module/index.d.ts.map +0 -1
- package/dist/subgraphs/app-module/index.js +0 -11
- package/dist/subgraphs/app-module/resolvers.d.ts +0 -3
- package/dist/subgraphs/app-module/resolvers.d.ts.map +0 -1
- package/dist/subgraphs/app-module/resolvers.js +0 -188
- package/dist/subgraphs/app-module/schema.d.ts +0 -3
- package/dist/subgraphs/app-module/schema.d.ts.map +0 -1
- package/dist/subgraphs/app-module/schema.js +0 -78
- package/dist/subgraphs/document-editor/index.d.ts +0 -11
- package/dist/subgraphs/document-editor/index.d.ts.map +0 -1
- package/dist/subgraphs/document-editor/index.js +0 -11
- package/dist/subgraphs/document-editor/resolvers.d.ts +0 -3
- package/dist/subgraphs/document-editor/resolvers.d.ts.map +0 -1
- package/dist/subgraphs/document-editor/resolvers.js +0 -158
- package/dist/subgraphs/document-editor/schema.d.ts +0 -3
- package/dist/subgraphs/document-editor/schema.d.ts.map +0 -1
- package/dist/subgraphs/document-editor/schema.js +0 -59
- package/dist/subgraphs/processor-module/index.d.ts +0 -10
- package/dist/subgraphs/processor-module/index.d.ts.map +0 -1
- package/dist/subgraphs/processor-module/index.js +0 -11
- package/dist/subgraphs/processor-module/resolvers.d.ts +0 -3
- package/dist/subgraphs/processor-module/resolvers.d.ts.map +0 -1
- package/dist/subgraphs/processor-module/resolvers.js +0 -173
- package/dist/subgraphs/processor-module/schema.d.ts +0 -3
- package/dist/subgraphs/processor-module/schema.d.ts.map +0 -1
- package/dist/subgraphs/processor-module/schema.js +0 -67
- package/dist/subgraphs/subgraph-module/index.d.ts +0 -10
- package/dist/subgraphs/subgraph-module/index.d.ts.map +0 -1
- package/dist/subgraphs/subgraph-module/index.js +0 -11
- package/dist/subgraphs/subgraph-module/resolvers.d.ts +0 -3
- package/dist/subgraphs/subgraph-module/resolvers.d.ts.map +0 -1
- package/dist/subgraphs/subgraph-module/resolvers.js +0 -128
- package/dist/subgraphs/subgraph-module/schema.d.ts +0 -3
- package/dist/subgraphs/subgraph-module/schema.d.ts.map +0 -1
- package/dist/subgraphs/subgraph-module/schema.js +0 -42
- package/dist/subgraphs/vetra-package/index.d.ts +0 -10
- package/dist/subgraphs/vetra-package/index.d.ts.map +0 -1
- package/dist/subgraphs/vetra-package/index.js +0 -11
- package/dist/subgraphs/vetra-package/resolvers.d.ts +0 -3
- package/dist/subgraphs/vetra-package/resolvers.d.ts.map +0 -1
- package/dist/subgraphs/vetra-package/resolvers.js +0 -248
- package/dist/subgraphs/vetra-package/schema.d.ts +0 -3
- package/dist/subgraphs/vetra-package/schema.d.ts.map +0 -1
- package/dist/subgraphs/vetra-package/schema.js +0 -108
|
@@ -1,248 +0,0 @@
|
|
|
1
|
-
import { addFile } from "document-drive";
|
|
2
|
-
import { setName } from "document-model";
|
|
3
|
-
import { GraphQLError } from "graphql";
|
|
4
|
-
import { actions, vetraPackageDocumentType, } from "@powerhousedao/vetra/document-models/vetra-package";
|
|
5
|
-
import { assertCanRead, assertCanWrite, assertCanExecuteOperation, canReadDocument, hasGlobalReadAccess, hasGlobalWriteAccess, } from "../permission-utils.js";
|
|
6
|
-
export const getResolvers = (subgraph) => {
|
|
7
|
-
const reactor = subgraph.reactor;
|
|
8
|
-
return {
|
|
9
|
-
Query: {
|
|
10
|
-
VetraPackage: (_, __, ctx) => {
|
|
11
|
-
return {
|
|
12
|
-
getDocument: async (args) => {
|
|
13
|
-
const { docId, driveId } = args;
|
|
14
|
-
if (!docId) {
|
|
15
|
-
throw new Error("Document id is required");
|
|
16
|
-
}
|
|
17
|
-
// Check read permission before accessing document
|
|
18
|
-
await assertCanRead(subgraph, docId, ctx);
|
|
19
|
-
if (driveId) {
|
|
20
|
-
const docIds = await reactor.getDocuments(driveId);
|
|
21
|
-
if (!docIds.includes(docId)) {
|
|
22
|
-
throw new Error(`Document with id ${docId} is not part of ${driveId}`);
|
|
23
|
-
}
|
|
24
|
-
}
|
|
25
|
-
const doc = await reactor.getDocument(docId);
|
|
26
|
-
return {
|
|
27
|
-
driveId: driveId,
|
|
28
|
-
...doc,
|
|
29
|
-
...doc.header,
|
|
30
|
-
created: doc.header.createdAtUtcIso,
|
|
31
|
-
lastModified: doc.header.lastModifiedAtUtcIso,
|
|
32
|
-
state: doc.state.global,
|
|
33
|
-
stateJSON: doc.state.global,
|
|
34
|
-
revision: doc.header?.revision?.global ?? 0,
|
|
35
|
-
};
|
|
36
|
-
},
|
|
37
|
-
getDocuments: async (args) => {
|
|
38
|
-
const { driveId } = args;
|
|
39
|
-
// Check read permission on drive before listing documents
|
|
40
|
-
await assertCanRead(subgraph, driveId, ctx);
|
|
41
|
-
const docsIds = await reactor.getDocuments(driveId);
|
|
42
|
-
const docs = await Promise.all(docsIds.map(async (docId) => {
|
|
43
|
-
const doc = await reactor.getDocument(docId);
|
|
44
|
-
return {
|
|
45
|
-
driveId: driveId,
|
|
46
|
-
...doc,
|
|
47
|
-
...doc.header,
|
|
48
|
-
created: doc.header.createdAtUtcIso,
|
|
49
|
-
lastModified: doc.header.lastModifiedAtUtcIso,
|
|
50
|
-
state: doc.state.global,
|
|
51
|
-
stateJSON: doc.state.global,
|
|
52
|
-
revision: doc.header?.revision?.global ?? 0,
|
|
53
|
-
};
|
|
54
|
-
}));
|
|
55
|
-
const filteredByType = docs.filter((doc) => doc.header.documentType === vetraPackageDocumentType);
|
|
56
|
-
// If user doesn't have global read access, filter by document-level permissions
|
|
57
|
-
if (!hasGlobalReadAccess(ctx) &&
|
|
58
|
-
subgraph.documentPermissionService) {
|
|
59
|
-
const filteredDocs = [];
|
|
60
|
-
for (const doc of filteredByType) {
|
|
61
|
-
const canRead = await canReadDocument(subgraph, doc.id, ctx);
|
|
62
|
-
if (canRead) {
|
|
63
|
-
filteredDocs.push(doc);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
return filteredDocs;
|
|
67
|
-
}
|
|
68
|
-
return filteredByType;
|
|
69
|
-
},
|
|
70
|
-
};
|
|
71
|
-
},
|
|
72
|
-
},
|
|
73
|
-
Mutation: {
|
|
74
|
-
VetraPackage_createDocument: async (_, args, ctx) => {
|
|
75
|
-
const { driveId, name } = args;
|
|
76
|
-
// If creating under a drive, check write permission on drive
|
|
77
|
-
if (driveId) {
|
|
78
|
-
await assertCanWrite(subgraph, driveId, ctx);
|
|
79
|
-
}
|
|
80
|
-
else if (!hasGlobalWriteAccess(ctx)) {
|
|
81
|
-
throw new GraphQLError("Forbidden: insufficient permissions to create documents");
|
|
82
|
-
}
|
|
83
|
-
const document = await reactor.addDocument(vetraPackageDocumentType);
|
|
84
|
-
if (driveId) {
|
|
85
|
-
await reactor.addAction(driveId, addFile({
|
|
86
|
-
name,
|
|
87
|
-
id: document.header.id,
|
|
88
|
-
documentType: vetraPackageDocumentType,
|
|
89
|
-
}));
|
|
90
|
-
}
|
|
91
|
-
if (name) {
|
|
92
|
-
await reactor.addAction(document.header.id, setName(name));
|
|
93
|
-
}
|
|
94
|
-
return document.header.id;
|
|
95
|
-
},
|
|
96
|
-
VetraPackage_setPackageName: async (_, args, ctx) => {
|
|
97
|
-
const { docId, input } = args;
|
|
98
|
-
// Check write permission before mutating document
|
|
99
|
-
await assertCanWrite(subgraph, docId, ctx);
|
|
100
|
-
await assertCanExecuteOperation(subgraph, docId, "SET_PACKAGE_NAME", ctx);
|
|
101
|
-
const doc = await reactor.getDocument(docId);
|
|
102
|
-
if (!doc) {
|
|
103
|
-
throw new Error("Document not found");
|
|
104
|
-
}
|
|
105
|
-
const result = await reactor.addAction(docId, actions.setPackageName(input));
|
|
106
|
-
if (result.status !== "SUCCESS") {
|
|
107
|
-
throw new Error(result.error?.message ?? "Failed to setPackageName");
|
|
108
|
-
}
|
|
109
|
-
return true;
|
|
110
|
-
},
|
|
111
|
-
VetraPackage_setPackageDescription: async (_, args, ctx) => {
|
|
112
|
-
const { docId, input } = args;
|
|
113
|
-
// Check write permission before mutating document
|
|
114
|
-
await assertCanWrite(subgraph, docId, ctx);
|
|
115
|
-
await assertCanExecuteOperation(subgraph, docId, "SET_PACKAGE_DESCRIPTION", ctx);
|
|
116
|
-
const doc = await reactor.getDocument(docId);
|
|
117
|
-
if (!doc) {
|
|
118
|
-
throw new Error("Document not found");
|
|
119
|
-
}
|
|
120
|
-
const result = await reactor.addAction(docId, actions.setPackageDescription(input));
|
|
121
|
-
if (result.status !== "SUCCESS") {
|
|
122
|
-
throw new Error(result.error?.message ?? "Failed to setPackageDescription");
|
|
123
|
-
}
|
|
124
|
-
return true;
|
|
125
|
-
},
|
|
126
|
-
VetraPackage_setPackageCategory: async (_, args, ctx) => {
|
|
127
|
-
const { docId, input } = args;
|
|
128
|
-
// Check write permission before mutating document
|
|
129
|
-
await assertCanWrite(subgraph, docId, ctx);
|
|
130
|
-
await assertCanExecuteOperation(subgraph, docId, "SET_PACKAGE_CATEGORY", ctx);
|
|
131
|
-
const doc = await reactor.getDocument(docId);
|
|
132
|
-
if (!doc) {
|
|
133
|
-
throw new Error("Document not found");
|
|
134
|
-
}
|
|
135
|
-
const result = await reactor.addAction(docId, actions.setPackageCategory(input));
|
|
136
|
-
if (result.status !== "SUCCESS") {
|
|
137
|
-
throw new Error(result.error?.message ?? "Failed to setPackageCategory");
|
|
138
|
-
}
|
|
139
|
-
return true;
|
|
140
|
-
},
|
|
141
|
-
VetraPackage_setPackageAuthor: async (_, args, ctx) => {
|
|
142
|
-
const { docId, input } = args;
|
|
143
|
-
// Check write permission before mutating document
|
|
144
|
-
await assertCanWrite(subgraph, docId, ctx);
|
|
145
|
-
await assertCanExecuteOperation(subgraph, docId, "SET_PACKAGE_AUTHOR", ctx);
|
|
146
|
-
const doc = await reactor.getDocument(docId);
|
|
147
|
-
if (!doc) {
|
|
148
|
-
throw new Error("Document not found");
|
|
149
|
-
}
|
|
150
|
-
const result = await reactor.addAction(docId, actions.setPackageAuthor(input));
|
|
151
|
-
if (result.status !== "SUCCESS") {
|
|
152
|
-
throw new Error(result.error?.message ?? "Failed to setPackageAuthor");
|
|
153
|
-
}
|
|
154
|
-
return true;
|
|
155
|
-
},
|
|
156
|
-
VetraPackage_setPackageAuthorName: async (_, args, ctx) => {
|
|
157
|
-
const { docId, input } = args;
|
|
158
|
-
// Check write permission before mutating document
|
|
159
|
-
await assertCanWrite(subgraph, docId, ctx);
|
|
160
|
-
await assertCanExecuteOperation(subgraph, docId, "SET_PACKAGE_AUTHOR_NAME", ctx);
|
|
161
|
-
const doc = await reactor.getDocument(docId);
|
|
162
|
-
if (!doc) {
|
|
163
|
-
throw new Error("Document not found");
|
|
164
|
-
}
|
|
165
|
-
const result = await reactor.addAction(docId, actions.setPackageAuthorName(input));
|
|
166
|
-
if (result.status !== "SUCCESS") {
|
|
167
|
-
throw new Error(result.error?.message ?? "Failed to setPackageAuthorName");
|
|
168
|
-
}
|
|
169
|
-
return true;
|
|
170
|
-
},
|
|
171
|
-
VetraPackage_setPackageAuthorWebsite: async (_, args, ctx) => {
|
|
172
|
-
const { docId, input } = args;
|
|
173
|
-
// Check write permission before mutating document
|
|
174
|
-
await assertCanWrite(subgraph, docId, ctx);
|
|
175
|
-
await assertCanExecuteOperation(subgraph, docId, "SET_PACKAGE_AUTHOR_WEBSITE", ctx);
|
|
176
|
-
const doc = await reactor.getDocument(docId);
|
|
177
|
-
if (!doc) {
|
|
178
|
-
throw new Error("Document not found");
|
|
179
|
-
}
|
|
180
|
-
const result = await reactor.addAction(docId, actions.setPackageAuthorWebsite(input));
|
|
181
|
-
if (result.status !== "SUCCESS") {
|
|
182
|
-
throw new Error(result.error?.message ?? "Failed to setPackageAuthorWebsite");
|
|
183
|
-
}
|
|
184
|
-
return true;
|
|
185
|
-
},
|
|
186
|
-
VetraPackage_addPackageKeyword: async (_, args, ctx) => {
|
|
187
|
-
const { docId, input } = args;
|
|
188
|
-
// Check write permission before mutating document
|
|
189
|
-
await assertCanWrite(subgraph, docId, ctx);
|
|
190
|
-
await assertCanExecuteOperation(subgraph, docId, "ADD_PACKAGE_KEYWORD", ctx);
|
|
191
|
-
const doc = await reactor.getDocument(docId);
|
|
192
|
-
if (!doc) {
|
|
193
|
-
throw new Error("Document not found");
|
|
194
|
-
}
|
|
195
|
-
const result = await reactor.addAction(docId, actions.addPackageKeyword(input));
|
|
196
|
-
if (result.status !== "SUCCESS") {
|
|
197
|
-
throw new Error(result.error?.message ?? "Failed to addPackageKeyword");
|
|
198
|
-
}
|
|
199
|
-
return true;
|
|
200
|
-
},
|
|
201
|
-
VetraPackage_removePackageKeyword: async (_, args, ctx) => {
|
|
202
|
-
const { docId, input } = args;
|
|
203
|
-
// Check write permission before mutating document
|
|
204
|
-
await assertCanWrite(subgraph, docId, ctx);
|
|
205
|
-
await assertCanExecuteOperation(subgraph, docId, "REMOVE_PACKAGE_KEYWORD", ctx);
|
|
206
|
-
const doc = await reactor.getDocument(docId);
|
|
207
|
-
if (!doc) {
|
|
208
|
-
throw new Error("Document not found");
|
|
209
|
-
}
|
|
210
|
-
const result = await reactor.addAction(docId, actions.removePackageKeyword(input));
|
|
211
|
-
if (result.status !== "SUCCESS") {
|
|
212
|
-
throw new Error(result.error?.message ?? "Failed to removePackageKeyword");
|
|
213
|
-
}
|
|
214
|
-
return true;
|
|
215
|
-
},
|
|
216
|
-
VetraPackage_setPackageGithubUrl: async (_, args, ctx) => {
|
|
217
|
-
const { docId, input } = args;
|
|
218
|
-
// Check write permission before mutating document
|
|
219
|
-
await assertCanWrite(subgraph, docId, ctx);
|
|
220
|
-
await assertCanExecuteOperation(subgraph, docId, "SET_PACKAGE_GITHUB_URL", ctx);
|
|
221
|
-
const doc = await reactor.getDocument(docId);
|
|
222
|
-
if (!doc) {
|
|
223
|
-
throw new Error("Document not found");
|
|
224
|
-
}
|
|
225
|
-
const result = await reactor.addAction(docId, actions.setPackageGithubUrl(input));
|
|
226
|
-
if (result.status !== "SUCCESS") {
|
|
227
|
-
throw new Error(result.error?.message ?? "Failed to setPackageGithubUrl");
|
|
228
|
-
}
|
|
229
|
-
return true;
|
|
230
|
-
},
|
|
231
|
-
VetraPackage_setPackageNpmUrl: async (_, args, ctx) => {
|
|
232
|
-
const { docId, input } = args;
|
|
233
|
-
// Check write permission before mutating document
|
|
234
|
-
await assertCanWrite(subgraph, docId, ctx);
|
|
235
|
-
await assertCanExecuteOperation(subgraph, docId, "SET_PACKAGE_NPM_URL", ctx);
|
|
236
|
-
const doc = await reactor.getDocument(docId);
|
|
237
|
-
if (!doc) {
|
|
238
|
-
throw new Error("Document not found");
|
|
239
|
-
}
|
|
240
|
-
const result = await reactor.addAction(docId, actions.setPackageNpmUrl(input));
|
|
241
|
-
if (result.status !== "SUCCESS") {
|
|
242
|
-
throw new Error(result.error?.message ?? "Failed to setPackageNpmUrl");
|
|
243
|
-
}
|
|
244
|
-
return true;
|
|
245
|
-
},
|
|
246
|
-
},
|
|
247
|
-
};
|
|
248
|
-
};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../subgraphs/vetra-package/schema.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,eAAO,MAAM,MAAM,EAAE,YA0GpB,CAAC"}
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
import { gql } from "graphql-tag";
|
|
2
|
-
export const schema = gql `
|
|
3
|
-
"""
|
|
4
|
-
Queries: VetraPackage Document
|
|
5
|
-
"""
|
|
6
|
-
type VetraPackageQueries {
|
|
7
|
-
getDocument(docId: PHID!, driveId: PHID): VetraPackage
|
|
8
|
-
getDocuments(driveId: String!): [VetraPackage!]
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
type Query {
|
|
12
|
-
VetraPackage: VetraPackageQueries
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
"""
|
|
16
|
-
Mutations: VetraPackage
|
|
17
|
-
"""
|
|
18
|
-
type Mutation {
|
|
19
|
-
VetraPackage_createDocument(name: String!, driveId: String): String
|
|
20
|
-
|
|
21
|
-
VetraPackage_setPackageName(
|
|
22
|
-
driveId: String
|
|
23
|
-
docId: PHID
|
|
24
|
-
input: VetraPackage_SetPackageNameInput
|
|
25
|
-
): Int
|
|
26
|
-
VetraPackage_setPackageDescription(
|
|
27
|
-
driveId: String
|
|
28
|
-
docId: PHID
|
|
29
|
-
input: VetraPackage_SetPackageDescriptionInput
|
|
30
|
-
): Int
|
|
31
|
-
VetraPackage_setPackageCategory(
|
|
32
|
-
driveId: String
|
|
33
|
-
docId: PHID
|
|
34
|
-
input: VetraPackage_SetPackageCategoryInput
|
|
35
|
-
): Int
|
|
36
|
-
VetraPackage_setPackageAuthor(
|
|
37
|
-
driveId: String
|
|
38
|
-
docId: PHID
|
|
39
|
-
input: VetraPackage_SetPackageAuthorInput
|
|
40
|
-
): Int
|
|
41
|
-
VetraPackage_setPackageAuthorName(
|
|
42
|
-
driveId: String
|
|
43
|
-
docId: PHID
|
|
44
|
-
input: VetraPackage_SetPackageAuthorNameInput
|
|
45
|
-
): Int
|
|
46
|
-
VetraPackage_setPackageAuthorWebsite(
|
|
47
|
-
driveId: String
|
|
48
|
-
docId: PHID
|
|
49
|
-
input: VetraPackage_SetPackageAuthorWebsiteInput
|
|
50
|
-
): Int
|
|
51
|
-
VetraPackage_addPackageKeyword(
|
|
52
|
-
driveId: String
|
|
53
|
-
docId: PHID
|
|
54
|
-
input: VetraPackage_AddPackageKeywordInput
|
|
55
|
-
): Int
|
|
56
|
-
VetraPackage_removePackageKeyword(
|
|
57
|
-
driveId: String
|
|
58
|
-
docId: PHID
|
|
59
|
-
input: VetraPackage_RemovePackageKeywordInput
|
|
60
|
-
): Int
|
|
61
|
-
VetraPackage_setPackageGithubUrl(
|
|
62
|
-
driveId: String
|
|
63
|
-
docId: PHID
|
|
64
|
-
input: VetraPackage_SetPackageGithubUrlInput
|
|
65
|
-
): Int
|
|
66
|
-
VetraPackage_setPackageNpmUrl(
|
|
67
|
-
driveId: String
|
|
68
|
-
docId: PHID
|
|
69
|
-
input: VetraPackage_SetPackageNpmUrlInput
|
|
70
|
-
): Int
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
"""
|
|
74
|
-
Module: BaseOperations
|
|
75
|
-
"""
|
|
76
|
-
input VetraPackage_SetPackageNameInput {
|
|
77
|
-
name: String!
|
|
78
|
-
}
|
|
79
|
-
input VetraPackage_SetPackageDescriptionInput {
|
|
80
|
-
description: String!
|
|
81
|
-
}
|
|
82
|
-
input VetraPackage_SetPackageCategoryInput {
|
|
83
|
-
category: String!
|
|
84
|
-
}
|
|
85
|
-
input VetraPackage_SetPackageAuthorInput {
|
|
86
|
-
name: OID
|
|
87
|
-
website: URL
|
|
88
|
-
}
|
|
89
|
-
input VetraPackage_SetPackageAuthorNameInput {
|
|
90
|
-
name: String!
|
|
91
|
-
}
|
|
92
|
-
input VetraPackage_SetPackageAuthorWebsiteInput {
|
|
93
|
-
website: URL!
|
|
94
|
-
}
|
|
95
|
-
input VetraPackage_AddPackageKeywordInput {
|
|
96
|
-
id: String!
|
|
97
|
-
label: String!
|
|
98
|
-
}
|
|
99
|
-
input VetraPackage_RemovePackageKeywordInput {
|
|
100
|
-
id: String!
|
|
101
|
-
}
|
|
102
|
-
input VetraPackage_SetPackageGithubUrlInput {
|
|
103
|
-
url: URL!
|
|
104
|
-
}
|
|
105
|
-
input VetraPackage_SetPackageNpmUrlInput {
|
|
106
|
-
url: URL!
|
|
107
|
-
}
|
|
108
|
-
`;
|