@avclabs.ai/media-mcp 0.3.0 → 0.4.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/README.md +15 -14
- package/README_CN.md +13 -12
- package/dist/config.d.ts +36 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +25 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +5 -0
- package/dist/index.js.map +1 -0
- package/dist/server.d.ts +5 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +32 -104
- package/dist/server.js.map +1 -1
- package/package.json +20 -28
- package/dist/image-enhancement.d.ts +0 -3
- package/dist/image-enhancement.d.ts.map +0 -1
- package/dist/image-enhancement.js +0 -185
- package/dist/image-enhancement.js.map +0 -1
- package/dist/sam3.d.ts +0 -10
- package/dist/sam3.d.ts.map +0 -1
- package/dist/sam3.js +0 -211
- package/dist/sam3.js.map +0 -1
- package/dist/service-config.d.ts +0 -62
- package/dist/service-config.d.ts.map +0 -1
- package/dist/service-config.js +0 -58
- package/dist/service-config.js.map +0 -1
- package/dist/tooling.d.ts +0 -42
- package/dist/tooling.d.ts.map +0 -1
- package/dist/tooling.js +0 -153
- package/dist/tooling.js.map +0 -1
- package/dist/tos.d.ts +0 -35
- package/dist/tos.d.ts.map +0 -1
- package/dist/tos.js +0 -281
- package/dist/tos.js.map +0 -1
- package/dist/upload.d.ts +0 -79
- package/dist/upload.d.ts.map +0 -1
- package/dist/upload.js +0 -190
- package/dist/upload.js.map +0 -1
- package/dist/video-enhancement.d.ts +0 -3
- package/dist/video-enhancement.d.ts.map +0 -1
- package/dist/video-enhancement.js +0 -156
- package/dist/video-enhancement.js.map +0 -1
package/dist/upload.js
DELETED
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
import axios from 'axios';
|
|
2
|
-
import * as fs from 'fs';
|
|
3
|
-
import * as path from 'path';
|
|
4
|
-
import FormData from 'form-data';
|
|
5
|
-
export function createAxiosSignatureTransport(config) {
|
|
6
|
-
const client = axios.create({
|
|
7
|
-
baseURL: config.baseUrl.replace(/\/$/, ''),
|
|
8
|
-
headers: config.auth === 'bearer'
|
|
9
|
-
? { Authorization: `Bearer ${config.apiKey}`, 'Content-Type': 'application/json' }
|
|
10
|
-
: { 'X-API-Key': config.apiKey, 'Content-Type': 'application/json' },
|
|
11
|
-
timeout: 60000,
|
|
12
|
-
});
|
|
13
|
-
return {
|
|
14
|
-
async post(requestPath, payload) {
|
|
15
|
-
try {
|
|
16
|
-
const response = await client.post(requestPath, payload);
|
|
17
|
-
return response.data;
|
|
18
|
-
}
|
|
19
|
-
catch (error) {
|
|
20
|
-
// Surface the host's own diagnostics, not axios's one-liner.
|
|
21
|
-
const detail = error.response
|
|
22
|
-
? `status=${error.response.status} data=${JSON.stringify(error.response.data)}`
|
|
23
|
-
: error.message;
|
|
24
|
-
throw new Error(detail);
|
|
25
|
-
}
|
|
26
|
-
},
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
export function createAxiosStorageTransport() {
|
|
30
|
-
return {
|
|
31
|
-
async submit(uploadUrl, form) {
|
|
32
|
-
try {
|
|
33
|
-
await axios.post(uploadUrl, form, {
|
|
34
|
-
headers: form.getHeaders(),
|
|
35
|
-
maxBodyLength: Infinity,
|
|
36
|
-
maxContentLength: Infinity,
|
|
37
|
-
});
|
|
38
|
-
}
|
|
39
|
-
catch (error) {
|
|
40
|
-
const detail = error.response
|
|
41
|
-
? `status=${error.response.status} statusText=${error.response.statusText} data=${JSON.stringify(error.response.data)} url=${uploadUrl.substring(0, 80)}...`
|
|
42
|
-
: error.message;
|
|
43
|
-
throw new Error(`TOS upload failed: ${detail}`);
|
|
44
|
-
}
|
|
45
|
-
},
|
|
46
|
-
};
|
|
47
|
-
}
|
|
48
|
-
const ENHANCE_SIGNATURE_PATH = '/api/v3/contents/generations/tos-signature';
|
|
49
|
-
const SAM3_SIGNATURE_PATH = '/get_postsignature_url';
|
|
50
|
-
/**
|
|
51
|
-
* The enhancement host serves images and videos from one signature endpoint; only `file_type`
|
|
52
|
-
* separates them.
|
|
53
|
-
*/
|
|
54
|
-
export function createEnhanceSignatureAdapter(deps) {
|
|
55
|
-
return {
|
|
56
|
-
async prepareUpload(fileName) {
|
|
57
|
-
const body = await deps.transport.post(ENHANCE_SIGNATURE_PATH, {
|
|
58
|
-
file_type: deps.fileType,
|
|
59
|
-
file_name: fileName,
|
|
60
|
-
});
|
|
61
|
-
if (body.code !== 0 && body.code !== 200) {
|
|
62
|
-
throw new Error(body.message || 'Failed to get TOS signature');
|
|
63
|
-
}
|
|
64
|
-
const signature = body.data;
|
|
65
|
-
return {
|
|
66
|
-
uploadUrl: signature.url,
|
|
67
|
-
formFields: { key: keyFromUploadUrl(signature.url), ...normalizeSignatureFields(signature) },
|
|
68
|
-
};
|
|
69
|
-
},
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
/** The SAM3 host always sends images. Only the failure message convention differs from enhance. */
|
|
73
|
-
export function createSam3SignatureAdapter(deps) {
|
|
74
|
-
return {
|
|
75
|
-
async prepareUpload(fileName) {
|
|
76
|
-
const body = await deps.transport.post(SAM3_SIGNATURE_PATH, {
|
|
77
|
-
file_type: 'image',
|
|
78
|
-
file_name: fileName,
|
|
79
|
-
});
|
|
80
|
-
if (body.code !== 0 && body.code !== 200) {
|
|
81
|
-
throw new Error(`get_postsignature_url error: ${body.message || 'unknown error'}`);
|
|
82
|
-
}
|
|
83
|
-
const signature = body.data;
|
|
84
|
-
if (!signature?.url) {
|
|
85
|
-
throw new Error('Missing upload URL in post signature response');
|
|
86
|
-
}
|
|
87
|
-
return {
|
|
88
|
-
uploadUrl: signature.url,
|
|
89
|
-
formFields: { key: keyFromPolicyOrUploadUrl(signature), ...normalizeSignatureFields(signature) },
|
|
90
|
-
};
|
|
91
|
-
},
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
export async function uploadObject(deps) {
|
|
95
|
-
const form = await deps.adapter.prepareUpload(deps.fileName);
|
|
96
|
-
const payload = new FormData();
|
|
97
|
-
for (const [name, value] of Object.entries(form.formFields)) {
|
|
98
|
-
payload.append(name, value);
|
|
99
|
-
}
|
|
100
|
-
payload.append('file', deps.body, deps.fileName);
|
|
101
|
-
await deps.storage.submit(form.uploadUrl, payload);
|
|
102
|
-
return { fileId: parseFileIdFromUrl(form.uploadUrl), uploadUrl: form.uploadUrl };
|
|
103
|
-
}
|
|
104
|
-
export function createMediaUploader(deps) {
|
|
105
|
-
return async (body, fileName) => {
|
|
106
|
-
const { fileId } = await uploadObject({ ...deps, body, fileName });
|
|
107
|
-
return { fileId };
|
|
108
|
-
};
|
|
109
|
-
}
|
|
110
|
-
// ── shared, host-agnostic helpers ─────────────────────────────────────────────
|
|
111
|
-
/** Fields that describe the authorization itself rather than the storage form. */
|
|
112
|
-
const NOT_FORM_FIELDS = new Set(['url', 'file_id', 'key']);
|
|
113
|
-
/** Bare names the hosts hand back, and the `x-tos-` name storage actually wants. */
|
|
114
|
-
const TOS_FIELD_ALIASES = {
|
|
115
|
-
algorithm: 'x-tos-algorithm',
|
|
116
|
-
credential: 'x-tos-credential',
|
|
117
|
-
date: 'x-tos-date',
|
|
118
|
-
signature: 'x-tos-signature',
|
|
119
|
-
};
|
|
120
|
-
/**
|
|
121
|
-
* Canonicalise a signature response into storage-form fields.
|
|
122
|
-
*
|
|
123
|
-
* Never returns `key`: each host derives the object key differently, so the adapter supplies
|
|
124
|
-
* it. Tolerates both hosts' naming conventions, so a response that arrives in the other
|
|
125
|
-
* convention still yields a usable form.
|
|
126
|
-
*/
|
|
127
|
-
export function normalizeSignatureFields(response) {
|
|
128
|
-
const hasPolicy = Object.prototype.hasOwnProperty.call(response, 'policy');
|
|
129
|
-
const fields = {};
|
|
130
|
-
for (const [name, raw] of Object.entries(response)) {
|
|
131
|
-
if (NOT_FORM_FIELDS.has(name))
|
|
132
|
-
continue;
|
|
133
|
-
if (name === 'origin_policy') {
|
|
134
|
-
// The policy in its original JSON form. Only needed when the host did not already hand
|
|
135
|
-
// back a ready-to-post `policy`; taking both would duplicate the field.
|
|
136
|
-
if (!hasPolicy)
|
|
137
|
-
fields.policy = encodePolicy(raw);
|
|
138
|
-
continue;
|
|
139
|
-
}
|
|
140
|
-
fields[TOS_FIELD_ALIASES[name] ?? name] = String(raw);
|
|
141
|
-
}
|
|
142
|
-
return fields;
|
|
143
|
-
}
|
|
144
|
-
/**
|
|
145
|
-
* Storage accepts the policy either Base64-encoded or as raw JSON; volcengine-tos SDK versions
|
|
146
|
-
* differ in which one they hand back. Normalise to Base64.
|
|
147
|
-
*/
|
|
148
|
-
function encodePolicy(raw) {
|
|
149
|
-
const value = String(raw);
|
|
150
|
-
return value.trim().startsWith('{') ? Buffer.from(value, 'utf-8').toString('base64') : value;
|
|
151
|
-
}
|
|
152
|
-
/** Last path segment of the upload URL, percent-decoded. */
|
|
153
|
-
export function parseFileIdFromUrl(uploadUrl) {
|
|
154
|
-
const segments = new URL(uploadUrl).pathname.split('/');
|
|
155
|
-
return decodeURIComponent(segments.pop() || '');
|
|
156
|
-
}
|
|
157
|
-
function keyFromUploadUrl(uploadUrl) {
|
|
158
|
-
return decodeURIComponent(new URL(uploadUrl).pathname.slice(1));
|
|
159
|
-
}
|
|
160
|
-
/**
|
|
161
|
-
* The object key the SAM3 host authorises lives inside its policy conditions. If the policy is
|
|
162
|
-
* opaque (Base64, or missing entirely) the upload URL carries the same key.
|
|
163
|
-
*/
|
|
164
|
-
function keyFromPolicyOrUploadUrl(signature) {
|
|
165
|
-
const raw = signature.origin_policy ?? signature.policy;
|
|
166
|
-
if (typeof raw === 'string') {
|
|
167
|
-
try {
|
|
168
|
-
const parsed = JSON.parse(raw);
|
|
169
|
-
const entry = parsed?.conditions?.find((c) => c && typeof c === 'object' && 'key' in c);
|
|
170
|
-
if (entry?.key)
|
|
171
|
-
return String(entry.key);
|
|
172
|
-
}
|
|
173
|
-
catch {
|
|
174
|
-
// Opaque policy; the upload URL below carries the same key.
|
|
175
|
-
}
|
|
176
|
-
}
|
|
177
|
-
return keyFromUploadUrl(signature.url);
|
|
178
|
-
}
|
|
179
|
-
export function checkLocalFile(filePath) {
|
|
180
|
-
if (!fs.existsSync(filePath)) {
|
|
181
|
-
throw new Error(`File does not exist: ${filePath}`);
|
|
182
|
-
}
|
|
183
|
-
const stats = fs.statSync(filePath);
|
|
184
|
-
const maxSize = 100 * 1024 * 1024;
|
|
185
|
-
if (stats.size > maxSize) {
|
|
186
|
-
throw new Error('File size exceeds 100MB limit');
|
|
187
|
-
}
|
|
188
|
-
return { filePath, fileName: path.basename(filePath) };
|
|
189
|
-
}
|
|
190
|
-
//# sourceMappingURL=upload.js.map
|
package/dist/upload.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"upload.js","sourceRoot":"","sources":["../src/upload.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"video-enhancement.d.ts","sourceRoot":"","sources":["../src/video-enhancement.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAmCpE,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAkEnG"}
|
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
import axios from 'axios';
|
|
2
|
-
import * as fs from 'fs';
|
|
3
|
-
import { z } from 'zod';
|
|
4
|
-
import { checkLocalFile, formatRequestError, parseTosSignature, unwrapEnvelope, uploadToTos, } from './tos.js';
|
|
5
|
-
import { classifyStatus, POLL_REQUEST_TIMEOUT_MS, pollUntilTerminal, registerTool } from './tooling.js';
|
|
6
|
-
const PollIntervalSchema = z.number().min(0.5).max(30).default(5).describe('Polling interval in seconds (0.5-30), default 5');
|
|
7
|
-
const SyncTimeoutSchema = z.number().min(1).max(45).default(45).describe('Synchronous wait timeout in seconds (1-45), default 45. Returns task_id early when exceeded, use the task status tool to continue polling');
|
|
8
|
-
// Schemas
|
|
9
|
-
const CreateTaskSchema = z.object({
|
|
10
|
-
video_source: z.string().describe('Video URL or local file path (URL must be publicly accessible, login or signed links are not supported)'),
|
|
11
|
-
type: z.enum(['url', 'local']).default('url').describe('Upload type: url=remote video, local=local file'),
|
|
12
|
-
resolution: z.enum(['480p', '540p', '720p', '1080p', '2k']).default('720p').describe('Target resolution, default 720p'),
|
|
13
|
-
});
|
|
14
|
-
const GetTaskStatusSchema = z.object({
|
|
15
|
-
task_id: z.string().describe('Task ID'),
|
|
16
|
-
});
|
|
17
|
-
const EnhanceVideoSyncSchema = z.object({
|
|
18
|
-
video_source: z.string().describe('Video URL or local file path (URL must be publicly accessible, login or signed links are not supported)'),
|
|
19
|
-
type: z.enum(['url', 'local']).default('url').describe('Upload type: url=remote video, local=local file'),
|
|
20
|
-
resolution: z.enum(['480p', '540p', '720p', '1080p', '2k']).default('720p').describe('Target resolution, default 720p'),
|
|
21
|
-
poll_interval: PollIntervalSchema,
|
|
22
|
-
timeout: SyncTimeoutSchema,
|
|
23
|
-
});
|
|
24
|
-
export function setupVideoEnhancementTools(server, baseUrl, apiKey) {
|
|
25
|
-
const client = axios.create({
|
|
26
|
-
baseURL: baseUrl.replace(/\/$/, ''),
|
|
27
|
-
headers: {
|
|
28
|
-
'Authorization': `Bearer ${apiKey}`,
|
|
29
|
-
'Content-Type': 'application/json',
|
|
30
|
-
},
|
|
31
|
-
timeout: 60000,
|
|
32
|
-
});
|
|
33
|
-
registerTool(server, 'create_task', `Create a video enhancement task (asynchronous).
|
|
34
|
-
|
|
35
|
-
Two upload methods are supported:
|
|
36
|
-
1. URL upload: provide a video URL
|
|
37
|
-
2. Local upload: provide a local file path, the MCP Server will auto-upload to TOS object storage
|
|
38
|
-
|
|
39
|
-
Parameters:
|
|
40
|
-
- video_source: video URL or local file path
|
|
41
|
-
- type: "url" or "local"
|
|
42
|
-
- resolution: target resolution
|
|
43
|
-
|
|
44
|
-
After creating a task, a task_id is returned immediately. Use get_task_status to poll for results until status becomes "completed" or "failed".`, CreateTaskSchema.shape, async (args) => createTask(client, args.video_source, args.type, args.resolution));
|
|
45
|
-
registerTool(server, 'get_task_status', 'Query video enhancement task status. The status field can be: processing, completed, or failed. If status is processing, wait a few seconds and call this tool again to poll.', GetTaskStatusSchema.shape, async (args) => {
|
|
46
|
-
const result = await getTaskStatus(client, args.task_id);
|
|
47
|
-
return {
|
|
48
|
-
...result,
|
|
49
|
-
// registerTool marks isError on success===false: a terminal failed
|
|
50
|
-
// status is a failed query outcome, not a healthy poll tick.
|
|
51
|
-
success: classifyStatus(result.status) !== 'failed',
|
|
52
|
-
message: result.status === 'processing' ? 'Task is still processing, please check again later' : undefined,
|
|
53
|
-
};
|
|
54
|
-
});
|
|
55
|
-
registerTool(server, 'enhance_video_sync', `Synchronously enhance video (blocks until completion).
|
|
56
|
-
|
|
57
|
-
Two upload methods are supported:
|
|
58
|
-
1. URL upload: provide a video URL
|
|
59
|
-
2. Local upload: provide a local file path, the MCP Server will auto-upload to TOS object storage
|
|
60
|
-
|
|
61
|
-
Parameters:
|
|
62
|
-
- video_source: video URL or local file path
|
|
63
|
-
- type: "url" or "local"
|
|
64
|
-
- resolution: target resolution
|
|
65
|
-
- poll_interval: polling interval in seconds
|
|
66
|
-
- timeout: synchronous wait timeout in seconds, default 45
|
|
67
|
-
|
|
68
|
-
Best for short videos (estimated processing time < 1 minute). If the task is not completed within the timeout, the tool returns early with a task_id. Use get_task_status to continue polling.`, EnhanceVideoSyncSchema.shape, async (args) => enhanceVideoSync(client, args.video_source, args.type, args.resolution, args.poll_interval, args.timeout));
|
|
69
|
-
}
|
|
70
|
-
async function getTosSignature(client, fileName) {
|
|
71
|
-
const response = await client.post('/api/v3/contents/generations/tos-signature', {
|
|
72
|
-
file_type: 'video',
|
|
73
|
-
file_name: fileName,
|
|
74
|
-
});
|
|
75
|
-
const unwrapped = unwrapEnvelope(response);
|
|
76
|
-
if (!unwrapped.ok) {
|
|
77
|
-
throw new Error(unwrapped.error);
|
|
78
|
-
}
|
|
79
|
-
return unwrapped.data;
|
|
80
|
-
}
|
|
81
|
-
async function createTask(client, videoSource, sourceType, resolution) {
|
|
82
|
-
let contentItem;
|
|
83
|
-
if (sourceType === 'local') {
|
|
84
|
-
const fileInfo = checkLocalFile(videoSource, 'video');
|
|
85
|
-
// Step 1: Get TOS signature
|
|
86
|
-
let target;
|
|
87
|
-
try {
|
|
88
|
-
target = parseTosSignature(await getTosSignature(client, fileInfo.fileName));
|
|
89
|
-
}
|
|
90
|
-
catch (error) {
|
|
91
|
-
throw new Error(`[Step 1: TOS signature failed] ${formatRequestError(error)}`);
|
|
92
|
-
}
|
|
93
|
-
// Step 2: Upload to TOS
|
|
94
|
-
try {
|
|
95
|
-
await uploadToTos(target, fs.createReadStream(videoSource), fileInfo.fileName);
|
|
96
|
-
}
|
|
97
|
-
catch (error) {
|
|
98
|
-
throw new Error(`[Step 2: TOS upload failed] ${error.message}`);
|
|
99
|
-
}
|
|
100
|
-
contentItem = { type: 'video_file', file_id: target.fileId, file_name: fileInfo.fileName };
|
|
101
|
-
}
|
|
102
|
-
else {
|
|
103
|
-
contentItem = { type: 'video_url', video_url: { url: videoSource } };
|
|
104
|
-
}
|
|
105
|
-
// Step 3: Call video API
|
|
106
|
-
const payload = { model: 'avc-enhance', content: [contentItem], resolution };
|
|
107
|
-
let response;
|
|
108
|
-
try {
|
|
109
|
-
response = await client.post('/api/v3/contents/generations/tasks', payload);
|
|
110
|
-
}
|
|
111
|
-
catch (error) {
|
|
112
|
-
throw new Error(`[Step 3: API call failed] ${formatRequestError(error)}`);
|
|
113
|
-
}
|
|
114
|
-
const unwrapped = unwrapEnvelope(response);
|
|
115
|
-
if (!unwrapped.ok) {
|
|
116
|
-
return { success: false, error: unwrapped.error };
|
|
117
|
-
}
|
|
118
|
-
return { success: true, task_id: unwrapped.data.task_id, status: unwrapped.data.status };
|
|
119
|
-
}
|
|
120
|
-
async function getTaskStatus(client, taskId, signal) {
|
|
121
|
-
const response = await client.get(`/api/v3/contents/generations/tasks/${encodeURIComponent(taskId)}`, {
|
|
122
|
-
timeout: POLL_REQUEST_TIMEOUT_MS,
|
|
123
|
-
signal,
|
|
124
|
-
});
|
|
125
|
-
const unwrapped = unwrapEnvelope(response);
|
|
126
|
-
if (!unwrapped.ok) {
|
|
127
|
-
throw new Error(unwrapped.error);
|
|
128
|
-
}
|
|
129
|
-
const result = unwrapped.data;
|
|
130
|
-
return {
|
|
131
|
-
task_id: result.task_id,
|
|
132
|
-
status: result.status,
|
|
133
|
-
progress: result.progress ?? 0,
|
|
134
|
-
video_url: result.video_url,
|
|
135
|
-
error_message: result.error_message,
|
|
136
|
-
created_at: result.created_at,
|
|
137
|
-
updated_at: result.updated_at,
|
|
138
|
-
};
|
|
139
|
-
}
|
|
140
|
-
async function enhanceVideoSync(client, videoSource, sourceType, resolution, pollInterval, timeout) {
|
|
141
|
-
const createResult = await createTask(client, videoSource, sourceType, resolution);
|
|
142
|
-
if (!createResult.success) {
|
|
143
|
-
return createResult;
|
|
144
|
-
}
|
|
145
|
-
return pollUntilTerminal({
|
|
146
|
-
taskId: createResult.task_id,
|
|
147
|
-
timeoutSeconds: timeout,
|
|
148
|
-
pollIntervalSeconds: pollInterval,
|
|
149
|
-
continueHint: 'get_task_status',
|
|
150
|
-
fetchStatus: async (signal) => {
|
|
151
|
-
const { task_id, status, ...payload } = await getTaskStatus(client, createResult.task_id, signal);
|
|
152
|
-
return { status, payload };
|
|
153
|
-
},
|
|
154
|
-
});
|
|
155
|
-
}
|
|
156
|
-
//# sourceMappingURL=video-enhancement.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"video-enhancement.js","sourceRoot":"","sources":["../src/video-enhancement.ts"],"names":[],"mappings":"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"}
|