@keymanapp/kmc-analyze 18.0.41-alpha → 18.0.46-alpha
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/build/src/index.d.ts +7 -7
- package/build/src/index.js +8 -11
- package/build/src/index.js.map +1 -1
- package/build/src/messages.d.ts +15 -15
- package/build/src/messages.d.ts.map +1 -1
- package/build/src/messages.js +20 -23
- package/build/src/messages.js.map +1 -1
- package/build/src/osk-character-use/index.d.ts +86 -86
- package/build/src/osk-character-use/index.js +281 -284
- package/build/src/osk-character-use/index.js.map +1 -1
- package/build/src/osk-rewrite-pua/index.d.ts +40 -40
- package/build/src/osk-rewrite-pua/index.js +129 -132
- package/build/src/osk-rewrite-pua/index.js.map +1 -1
- package/build/src/util/get-osk-from-kmn-file.d.ts +5 -5
- package/build/src/util/get-osk-from-kmn-file.js +30 -33
- package/build/src/util/get-osk-from-kmn-file.js.map +1 -1
- package/package.json +5 -5
|
@@ -1,284 +1,281 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
*
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
//
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
*
|
|
41
|
-
*
|
|
42
|
-
*
|
|
43
|
-
*
|
|
44
|
-
*
|
|
45
|
-
*
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
//
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
//
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
let
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
const
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
scanPlatform(source.
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
//
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
let
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
str
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
*
|
|
213
|
-
*
|
|
214
|
-
*
|
|
215
|
-
*
|
|
216
|
-
*
|
|
217
|
-
*
|
|
218
|
-
*
|
|
219
|
-
*
|
|
220
|
-
*
|
|
221
|
-
*
|
|
222
|
-
*
|
|
223
|
-
*
|
|
224
|
-
*
|
|
225
|
-
*
|
|
226
|
-
*
|
|
227
|
-
*
|
|
228
|
-
*
|
|
229
|
-
*
|
|
230
|
-
*
|
|
231
|
-
*
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
case '.
|
|
239
|
-
return AnalyzeOskCharacterUse.
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
}
|
|
283
|
-
//# sourceMappingURL=index.js.map
|
|
284
|
-
//# debugId=f9a7a0ad-0a19-5873-822c-07a700ee3287
|
|
1
|
+
import { KeymanFileTypes, KvksFileReader, TouchLayoutFileReader } from "@keymanapp/common-types";
|
|
2
|
+
import { CompilerMessages } from '@keymanapp/kmc-kmn';
|
|
3
|
+
import { escapeMarkdownChar } from '@keymanapp/developer-utils';
|
|
4
|
+
import { getOskFromKmnFile } from "../util/get-osk-from-kmn-file.js";
|
|
5
|
+
import { AnalyzerMessages } from "../messages.js";
|
|
6
|
+
const defaultOptions = {
|
|
7
|
+
puaBase: 0xF100,
|
|
8
|
+
stripDottedCircle: false,
|
|
9
|
+
includeCounts: false,
|
|
10
|
+
};
|
|
11
|
+
/**
|
|
12
|
+
* @public
|
|
13
|
+
* Analyze the characters used in On Screen Keyboard files (.kvks,
|
|
14
|
+
* .keyman-touch-layout) for use with `&displayMap`.
|
|
15
|
+
*/
|
|
16
|
+
export class AnalyzeOskCharacterUse {
|
|
17
|
+
callbacks;
|
|
18
|
+
_strings = {};
|
|
19
|
+
options;
|
|
20
|
+
constructor(callbacks, options) {
|
|
21
|
+
this.callbacks = callbacks;
|
|
22
|
+
this.options = { ...defaultOptions, ...options };
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Clears analysis data collected from previous calls to
|
|
26
|
+
* {@link AnalyzeOskCharacterUse.analyze}
|
|
27
|
+
*/
|
|
28
|
+
clear() {
|
|
29
|
+
this._strings = {};
|
|
30
|
+
}
|
|
31
|
+
//
|
|
32
|
+
// Analyze a single file
|
|
33
|
+
//
|
|
34
|
+
/**
|
|
35
|
+
* Analyzes a single source file for Unicode character usage. Can parse .kmn,
|
|
36
|
+
* .kvks, .keyman-touch-layout file formats. Can be called multiple times to
|
|
37
|
+
* collect results from more than one file. Use
|
|
38
|
+
* {@link AnalyzeOskCharacterUse.getStrings} to retrieve results.
|
|
39
|
+
*
|
|
40
|
+
* Note: `analyze()` collects key cap data, so calling this for a .kmn file
|
|
41
|
+
* will retrieve the key caps from the .kvks and .keyman-touch-layout files
|
|
42
|
+
* that it references, rather than key cap data from the .kmn file itself.
|
|
43
|
+
*
|
|
44
|
+
* @param file - relative or absolute path to a Keyman source file
|
|
45
|
+
* @returns true if the file is successfully loaded and parsed
|
|
46
|
+
*/
|
|
47
|
+
async analyze(file) {
|
|
48
|
+
switch (KeymanFileTypes.sourceTypeFromFilename(file)) {
|
|
49
|
+
case ".kvks" /* KeymanFileTypes.Source.VisualKeyboard */: {
|
|
50
|
+
let strings = this.scanVisualKeyboard(file);
|
|
51
|
+
if (!strings) {
|
|
52
|
+
return false;
|
|
53
|
+
}
|
|
54
|
+
this.addStrings(strings, file);
|
|
55
|
+
break;
|
|
56
|
+
}
|
|
57
|
+
case ".keyman-touch-layout" /* KeymanFileTypes.Source.TouchLayout */: {
|
|
58
|
+
let strings = this.scanTouchLayout(file);
|
|
59
|
+
if (!strings) {
|
|
60
|
+
return false;
|
|
61
|
+
}
|
|
62
|
+
this.addStrings(strings, file);
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
case ".kpj" /* KeymanFileTypes.Source.Project */:
|
|
66
|
+
throw new Error('Passing a project to analyze is not permitted');
|
|
67
|
+
break;
|
|
68
|
+
case ".kmn" /* KeymanFileTypes.Source.KeymanKeyboard */:
|
|
69
|
+
// The cleanest way to do this is to compile the .kmn to find the .kvks
|
|
70
|
+
// and .keyman-touch-layout from the &VISUALKEYBOARD and &LAYOUTFILE
|
|
71
|
+
// system stores
|
|
72
|
+
if (!await this.analyzeKmnKeyboard(file)) {
|
|
73
|
+
return false;
|
|
74
|
+
}
|
|
75
|
+
break;
|
|
76
|
+
case ".xml" /* KeymanFileTypes.Source.LdmlKeyboard */:
|
|
77
|
+
// TODO: await this.analyzeLdmlKeyboard(file);
|
|
78
|
+
// note, will need to skip .xml files that are not ldml keyboards
|
|
79
|
+
break;
|
|
80
|
+
default:
|
|
81
|
+
// Ignore any other file types; this way we can analyze project files/folders
|
|
82
|
+
// easily also
|
|
83
|
+
}
|
|
84
|
+
return true;
|
|
85
|
+
}
|
|
86
|
+
async analyzeKmnKeyboard(filename) {
|
|
87
|
+
this.callbacks.reportMessage(AnalyzerMessages.Info_ScanningFile({ type: 'keyboard source', name: filename }));
|
|
88
|
+
let osk = await getOskFromKmnFile(this.callbacks, filename);
|
|
89
|
+
if (osk.kvksFilename) {
|
|
90
|
+
let strings = this.scanVisualKeyboard(osk.kvksFilename);
|
|
91
|
+
if (!strings) {
|
|
92
|
+
return false;
|
|
93
|
+
}
|
|
94
|
+
this.addStrings(strings, osk.kvksFilename);
|
|
95
|
+
}
|
|
96
|
+
if (osk.touchLayoutFilename) {
|
|
97
|
+
let strings = this.scanTouchLayout(osk.touchLayoutFilename);
|
|
98
|
+
if (!strings) {
|
|
99
|
+
return false;
|
|
100
|
+
}
|
|
101
|
+
this.addStrings(strings, osk.touchLayoutFilename);
|
|
102
|
+
}
|
|
103
|
+
return true;
|
|
104
|
+
}
|
|
105
|
+
addStrings(strings, filename) {
|
|
106
|
+
// Reduce all references to get usage count per file
|
|
107
|
+
let reducedStrings = [...new Set(strings)].map(e => ({
|
|
108
|
+
str: e,
|
|
109
|
+
usages: [{ filename: this.callbacks.path.basename(filename), count: strings.filter(n => n === e).length }]
|
|
110
|
+
}));
|
|
111
|
+
// Merge result with existing found strings
|
|
112
|
+
for (let e of reducedStrings) {
|
|
113
|
+
this._strings[e.str] = [].concat(this._strings[e.str] ?? [], ...e.usages);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
cleanString(s) {
|
|
117
|
+
if (this.options.stripDottedCircle) {
|
|
118
|
+
s = s.replace(/\u25cc/g, '');
|
|
119
|
+
}
|
|
120
|
+
return s.trim();
|
|
121
|
+
}
|
|
122
|
+
//
|
|
123
|
+
// On Screen Keyboard file scanning
|
|
124
|
+
//
|
|
125
|
+
scanVisualKeyboard(filename) {
|
|
126
|
+
this.callbacks.reportMessage(AnalyzerMessages.Info_ScanningFile({ type: 'visual keyboard', name: filename }));
|
|
127
|
+
let strings = [];
|
|
128
|
+
const reader = new KvksFileReader();
|
|
129
|
+
let source;
|
|
130
|
+
try {
|
|
131
|
+
source = reader.read(this.callbacks.loadFile(filename));
|
|
132
|
+
}
|
|
133
|
+
catch (e) {
|
|
134
|
+
this.callbacks.reportMessage(CompilerMessages.Error_InvalidKvksFile({ filename, e }));
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
let invalidKeys = [];
|
|
138
|
+
const vk = reader.transform(source, invalidKeys);
|
|
139
|
+
if (!vk) {
|
|
140
|
+
this.callbacks.reportMessage(CompilerMessages.Error_InvalidKvksFile({ filename, e: null }));
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
for (let key of vk.keys) {
|
|
144
|
+
if (key.text) {
|
|
145
|
+
strings.push(this.cleanString(key.text));
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return strings;
|
|
149
|
+
}
|
|
150
|
+
scanTouchLayout(filename) {
|
|
151
|
+
this.callbacks.reportMessage(AnalyzerMessages.Info_ScanningFile({ type: 'touch layout', name: filename }));
|
|
152
|
+
let strings = [];
|
|
153
|
+
const reader = new TouchLayoutFileReader();
|
|
154
|
+
const source = reader.read(this.callbacks.loadFile(filename));
|
|
155
|
+
const scanKey = (key) => {
|
|
156
|
+
if (!key.text) {
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
if (key.text.length > 2 && key.text[0] == '*' && key.text[key.text.length - 1] == '*') {
|
|
160
|
+
// Don't add '*special*' key captions
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
strings.push(this.cleanString(key.text));
|
|
164
|
+
};
|
|
165
|
+
const scanPlatform = (platform) => {
|
|
166
|
+
if (!platform) {
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
for (let layer of platform.layer) {
|
|
170
|
+
for (let row of layer.row) {
|
|
171
|
+
for (let key of row.key) {
|
|
172
|
+
scanKey(key);
|
|
173
|
+
let f;
|
|
174
|
+
for (f in key.flick ?? {}) {
|
|
175
|
+
scanKey(key.flick[f]);
|
|
176
|
+
}
|
|
177
|
+
for (let sk of key.sk ?? []) {
|
|
178
|
+
scanKey(sk);
|
|
179
|
+
}
|
|
180
|
+
for (let mt of key.multitap ?? []) {
|
|
181
|
+
scanKey(mt);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
};
|
|
187
|
+
scanPlatform(source.desktop);
|
|
188
|
+
scanPlatform(source.phone);
|
|
189
|
+
scanPlatform(source.tablet);
|
|
190
|
+
return strings;
|
|
191
|
+
}
|
|
192
|
+
//
|
|
193
|
+
// Results reporting
|
|
194
|
+
//
|
|
195
|
+
prepareResults(strings) {
|
|
196
|
+
let result = [];
|
|
197
|
+
let pua = this.options.puaBase;
|
|
198
|
+
for (let str of Object.keys(strings)) {
|
|
199
|
+
result.push({
|
|
200
|
+
pua: pua.toString(16).toUpperCase(),
|
|
201
|
+
str,
|
|
202
|
+
unicode: AnalyzeOskCharacterUse.stringToUnicodeSequence(str, false),
|
|
203
|
+
usages: this.options.includeCounts ? strings[str] : strings[str].map(item => item.filename)
|
|
204
|
+
});
|
|
205
|
+
pua++;
|
|
206
|
+
}
|
|
207
|
+
return result;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Returns the collected results from earlier calls to
|
|
211
|
+
* {@link AnalyzeOskCharacterUse.analyze}. This generates a mapping from a key
|
|
212
|
+
* cap (one or more characters) to a PUA code, for use with `&displayMap`.
|
|
213
|
+
*
|
|
214
|
+
* Three output formats are supported:
|
|
215
|
+
*
|
|
216
|
+
* - .txt: tab-separated string format, with three columns: PUA, Key Cap, and
|
|
217
|
+
* plain string. The PUA and Key Cap columns are formatted as Unicode Scalar
|
|
218
|
+
* Values, e.g. U+0061, and the plain string is the original key cap string.
|
|
219
|
+
*
|
|
220
|
+
* - .md: formatted for documentation purposes. Generates a Markdown table
|
|
221
|
+
* (GFM) with PUA, Key Cap, and plain string. The PUA and Key Cap columns
|
|
222
|
+
* are formatted as Unicode Scalar Values, e.g. U+0061, and the plain string
|
|
223
|
+
* is the original key cap string.
|
|
224
|
+
*
|
|
225
|
+
* - .json: returns the final aggregated data as an array of strings, which
|
|
226
|
+
* can be joined to form a JSON blob of an object with a single member,
|
|
227
|
+
* `map`, which is an array of {@link Osk.StringResult} objects.
|
|
228
|
+
*
|
|
229
|
+
* @param format - file format to return - can be '.txt', '.md', or '.json'
|
|
230
|
+
* @returns an array of strings, formatted according to the `format`
|
|
231
|
+
* parameter.
|
|
232
|
+
*/
|
|
233
|
+
getStrings(format) {
|
|
234
|
+
const final = this.prepareResults(this._strings);
|
|
235
|
+
switch (format) {
|
|
236
|
+
case '.md':
|
|
237
|
+
return AnalyzeOskCharacterUse.getStringsAsMarkdown(final);
|
|
238
|
+
case '.json':
|
|
239
|
+
return AnalyzeOskCharacterUse.getStringsAsJson(final);
|
|
240
|
+
}
|
|
241
|
+
return AnalyzeOskCharacterUse.getStringsAsText(final);
|
|
242
|
+
}
|
|
243
|
+
// Following functions are static so that we can keep them pure
|
|
244
|
+
// and potentially refactor into separate reporting class later
|
|
245
|
+
static getStringsAsText(strings) {
|
|
246
|
+
// Text result only returns PUA, unicode sequence, and plain string
|
|
247
|
+
let lines = [];
|
|
248
|
+
for (let s of strings) {
|
|
249
|
+
const ux = this.stringToUnicodeSequence(s.str);
|
|
250
|
+
lines.push('U+' + s.pua + '\t' + ux + '\t' + s.str);
|
|
251
|
+
}
|
|
252
|
+
return lines;
|
|
253
|
+
}
|
|
254
|
+
static getStringsAsMarkdown(strings) {
|
|
255
|
+
// Markdown result only returns PUA, unicode sequence, and plain string
|
|
256
|
+
let lines = [];
|
|
257
|
+
lines.push('PUA | Code Points | Key Caps');
|
|
258
|
+
lines.push('-------|-------------|---------');
|
|
259
|
+
for (let s of strings) {
|
|
260
|
+
const ux = this.stringToUnicodeSequence(s.str);
|
|
261
|
+
lines.push('U+' + s.pua + ' | ' + ux + ' | ' + escapeMarkdownChar(s.str, true));
|
|
262
|
+
}
|
|
263
|
+
return lines;
|
|
264
|
+
}
|
|
265
|
+
static getStringsAsJson(strings) {
|
|
266
|
+
// For future expansion, we wrap the array in a 'map' property
|
|
267
|
+
let map = { "map": strings };
|
|
268
|
+
return JSON.stringify(map, null, 2).split('\n');
|
|
269
|
+
}
|
|
270
|
+
static stringToUnicodeSequence(s, addUPlusPrefix = true) {
|
|
271
|
+
let result = [];
|
|
272
|
+
for (let ch of s) {
|
|
273
|
+
let c = ch.codePointAt(0).toString(16).toUpperCase();
|
|
274
|
+
if (c.length < 4)
|
|
275
|
+
c = '0'.repeat(4 - c.length) + c;
|
|
276
|
+
result.push((addUPlusPrefix ? 'U+' : '') + c);
|
|
277
|
+
}
|
|
278
|
+
return result.join(' ');
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../src/osk-character-use/index.ts"],"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/osk-character-use/index.ts"],"names":[],"mappings":"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"}
|