albex 0.1.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/albex.js ADDED
@@ -0,0 +1,479 @@
1
+ /**
2
+ * Albex — local full-text search engine.
3
+ *
4
+ * Zero-dependency TypeScript/ESM wrapper around albex_wasm_bg.wasm and
5
+ * (optionally) albex_pdf.wasm. All text stays in-browser; nothing is sent
6
+ * to any server.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * const engine = new AlbexEngine({ wasmUrl: './wasm/pkg/albex_wasm_bg.wasm' });
11
+ * await engine.init();
12
+ * await engine.indexFile(myFile);
13
+ * const results = engine.search('contrato marco');
14
+ * ```
15
+ */
16
+ function tokenize(q) {
17
+ return q.trim().split(/\s+/).filter(t => t.length > 0);
18
+ }
19
+ function parseQuery(q) {
20
+ const trimmed = q.trim();
21
+ // OR: "term1 | term2" or "phrase one | phrase two"
22
+ if (trimmed.includes('|')) {
23
+ const branches = trimmed.split('|')
24
+ .map(p => tokenize(p.replace(/"/g, '')))
25
+ .filter(b => b.length > 0);
26
+ return { kind: 'or', branches };
27
+ }
28
+ // Phrase: "exact phrase here"
29
+ const phraseMatch = /^"(.+)"$/.exec(trimmed);
30
+ if (phraseMatch) {
31
+ const inner = phraseMatch[1] ?? '';
32
+ const tokens = tokenize(inner);
33
+ return { kind: 'phrase', tokens, raw: inner };
34
+ }
35
+ return { kind: 'simple', tokens: tokenize(trimmed) };
36
+ }
37
+ /**
38
+ * Reconstruct a WASM-compatible query string from parsed tokens.
39
+ * The WASM engine accepts up to 4 space-separated tokens (AND semantics).
40
+ */
41
+ function tokensToWasmQuery(tokens) {
42
+ return tokens.slice(0, 4).join(' ');
43
+ }
44
+ // ─────────────────────────────────────────────────────────────────────────────
45
+ // Phrase post-filter
46
+ // ─────────────────────────────────────────────────────────────────────────────
47
+ /**
48
+ * Returns true if `snippet` contains the phrase formed by `tokens` in order,
49
+ * with at most `maxGap` characters between consecutive tokens.
50
+ * Comparison is case- and accent-insensitive.
51
+ */
52
+ function containsPhrase(snippet, tokens, maxGap = 30) {
53
+ const norm = (s) => s.toLowerCase().normalize('NFKD').replace(/[̀-ͯ]/g, '');
54
+ const text = norm(snippet);
55
+ const normTokens = tokens.map(norm).filter(t => t.length > 0);
56
+ if (normTokens.length === 0)
57
+ return true;
58
+ let pos = 0;
59
+ for (let t = 0; t < normTokens.length; t++) {
60
+ const tok = normTokens[t] ?? '';
61
+ if (!tok)
62
+ continue;
63
+ const idx = text.indexOf(tok, pos);
64
+ if (idx === -1)
65
+ return false;
66
+ if (t > 0 && idx - pos > maxGap)
67
+ return false;
68
+ pos = idx + tok.length;
69
+ }
70
+ return true;
71
+ }
72
+ // ─────────────────────────────────────────────────────────────────────────────
73
+ // ZIP helpers (DOCX + XLSX)
74
+ // ─────────────────────────────────────────────────────────────────────────────
75
+ const _enc = new TextEncoder();
76
+ const _dec = new TextDecoder();
77
+ function zipCentralDir(bytes) {
78
+ const v = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);
79
+ let p = bytes.length - 22;
80
+ while (p >= 0 && v.getUint32(p, true) !== 0x06054b50)
81
+ p--;
82
+ if (p < 0)
83
+ throw new Error('Not a ZIP file');
84
+ return { v, cdOff: v.getUint32(p + 16, true), cdN: v.getUint16(p + 10, true) };
85
+ }
86
+ function listZipEntries(bytes) {
87
+ const { v, cdOff, cdN } = zipCentralDir(bytes);
88
+ const names = [];
89
+ let cp = cdOff;
90
+ for (let i = 0; i < cdN; i++) {
91
+ if (v.getUint32(cp, true) !== 0x02014b50)
92
+ break;
93
+ const nl = v.getUint16(cp + 28, true), xl = v.getUint16(cp + 30, true), cl = v.getUint16(cp + 32, true);
94
+ names.push(_dec.decode(bytes.subarray(cp + 46, cp + 46 + nl)));
95
+ cp += 46 + nl + xl + cl;
96
+ }
97
+ return names;
98
+ }
99
+ async function findZipEntry(bytes, name) {
100
+ const { v, cdOff, cdN } = zipCentralDir(bytes);
101
+ let cp = cdOff;
102
+ for (let i = 0; i < cdN; i++) {
103
+ if (v.getUint32(cp, true) !== 0x02014b50)
104
+ break;
105
+ const nl = v.getUint16(cp + 28, true), xl = v.getUint16(cp + 30, true), cl = v.getUint16(cp + 32, true);
106
+ const off = v.getUint32(cp + 42, true), compSz = v.getUint32(cp + 20, true);
107
+ if (_dec.decode(bytes.subarray(cp + 46, cp + 46 + nl)) === name) {
108
+ return decompEntry(bytes, v, off, compSz);
109
+ }
110
+ cp += 46 + nl + xl + cl;
111
+ }
112
+ throw new Error(`Entry "${name}" not found in ZIP`);
113
+ }
114
+ async function decompEntry(bytes, v, off, compSize) {
115
+ const meth = v.getUint16(off + 8, true);
116
+ const nl = v.getUint16(off + 26, true);
117
+ const xl = v.getUint16(off + 28, true);
118
+ const ds = off + 30 + nl + xl;
119
+ // Use central-directory size (reliable even for streaming ZIPs with local-header=0).
120
+ const cs = compSize > 0 ? compSize : v.getUint32(off + 18, true);
121
+ const data = bytes.subarray(ds, ds + cs);
122
+ if (meth === 0)
123
+ return data;
124
+ if (meth === 8) {
125
+ const s = new DecompressionStream('deflate-raw');
126
+ const w = s.writable.getWriter();
127
+ const r = s.readable.getReader();
128
+ // Slice to a plain ArrayBuffer-backed Uint8Array to satisfy strict DOM types.
129
+ const plain = data.slice();
130
+ w.write(plain).catch(() => { });
131
+ w.close().catch(() => { });
132
+ const chunks = [];
133
+ let len = 0;
134
+ for (;;) {
135
+ const { done, value } = await r.read();
136
+ if (done)
137
+ break;
138
+ chunks.push(value);
139
+ len += value.length;
140
+ }
141
+ const out = new Uint8Array(len);
142
+ let o = 0;
143
+ for (const c of chunks) {
144
+ out.set(c, o);
145
+ o += c.length;
146
+ }
147
+ return out;
148
+ }
149
+ throw new Error(`Unsupported ZIP compression method ${meth}`);
150
+ }
151
+ // ─────────────────────────────────────────────────────────────────────────────
152
+ // WASM memory helpers (internal)
153
+ // ─────────────────────────────────────────────────────────────────────────────
154
+ const FEED_SIZE = 32768; // 32 KB — fits in 64 KB scratchpad
155
+ // ─────────────────────────────────────────────────────────────────────────────
156
+ // PDF WASM imports shim
157
+ // ─────────────────────────────────────────────────────────────────────────────
158
+ function makePdfWasmImports(getPdfMem) {
159
+ const heap = [];
160
+ let freeIdx = -1;
161
+ return {
162
+ __wbindgen_placeholder__: {
163
+ __wbindgen_describe: () => { },
164
+ __wbg_getRandomValues_3f44b700395062e5: (ptr, len) => {
165
+ const mem = getPdfMem();
166
+ crypto.getRandomValues(new Uint8Array(mem.buffer, ptr >>> 0, len >>> 0));
167
+ },
168
+ __wbindgen_object_drop_ref: (idx) => {
169
+ heap[idx] = freeIdx;
170
+ freeIdx = idx;
171
+ },
172
+ },
173
+ __wbindgen_externref_xform__: {
174
+ __wbindgen_externref_table_grow: (delta) => {
175
+ const old = heap.length;
176
+ for (let i = 0; i < delta; i++)
177
+ heap.push(undefined);
178
+ return old;
179
+ },
180
+ __wbindgen_externref_table_set_null: (idx) => { heap[idx] = undefined; },
181
+ },
182
+ };
183
+ }
184
+ // ─────────────────────────────────────────────────────────────────────────────
185
+ // AlbexEngine
186
+ // ─────────────────────────────────────────────────────────────────────────────
187
+ export class AlbexEngine {
188
+ constructor(opts) {
189
+ // ── PDF WASM (lazy) ──
190
+ this._pdfWasm = null;
191
+ this._pdfMem = null;
192
+ this._docs = [];
193
+ this._lastSearch = null;
194
+ this._opts = opts;
195
+ }
196
+ /** Load and initialise the main WASM module. Must be called before any other method. */
197
+ async init() {
198
+ const res = await fetch(this._opts.wasmUrl);
199
+ if (!res.ok)
200
+ throw new Error(`Failed to fetch WASM: ${res.status}`);
201
+ const { instance } = await WebAssembly.instantiateStreaming(res, {});
202
+ this._wasm = instance.exports;
203
+ this._mem = instance.exports.memory;
204
+ this._wasm.init();
205
+ }
206
+ // ── Internal helpers ──────────────────────────────────────────────────────
207
+ _u8(off, n) {
208
+ return new Uint8Array(this._mem.buffer, off, n);
209
+ }
210
+ _writePad(b) {
211
+ const ptr = this._wasm.getBuffer(b.length);
212
+ if (!ptr)
213
+ throw new Error('Scratchpad too small for this chunk');
214
+ this._u8(ptr, b.length).set(b);
215
+ return ptr;
216
+ }
217
+ _writeStr(s) {
218
+ const b = _enc.encode(s);
219
+ this._writePad(b);
220
+ return b.length;
221
+ }
222
+ _readPad(n) {
223
+ const ptr = this._wasm.getBuffer(0);
224
+ return _dec.decode(this._u8(ptr, n));
225
+ }
226
+ _feedText(text) {
227
+ const b = _enc.encode(text);
228
+ for (let i = 0; i < b.length; i += FEED_SIZE) {
229
+ const c = b.subarray(i, i + FEED_SIZE);
230
+ this._writePad(c);
231
+ this._wasm.feedText(c.length);
232
+ }
233
+ }
234
+ _feedXmlBytes(xml, fn) {
235
+ for (let i = 0; i < xml.length; i += FEED_SIZE) {
236
+ const c = xml.subarray(i, i + FEED_SIZE);
237
+ this._writePad(c);
238
+ this._wasm[fn](c.length);
239
+ }
240
+ }
241
+ // ── PDF WASM (lazy load) ─────────────────────────────────────────────────
242
+ async _ensurePdfWasm() {
243
+ if (this._pdfWasm)
244
+ return;
245
+ if (!this._opts.pdfWasmUrl)
246
+ throw new Error('pdfWasmUrl not set in AlbexOptions');
247
+ const res = await fetch(this._opts.pdfWasmUrl);
248
+ if (!res.ok)
249
+ throw new Error(`Failed to fetch PDF WASM: ${res.status}`);
250
+ const imports = makePdfWasmImports(() => this._pdfMem);
251
+ const { instance } = await WebAssembly.instantiateStreaming(res, imports);
252
+ this._pdfWasm = instance.exports;
253
+ this._pdfMem = instance.exports.memory;
254
+ }
255
+ // ── Indexers ──────────────────────────────────────────────────────────────
256
+ async _indexDocx(file) {
257
+ const bytes = new Uint8Array(await file.arrayBuffer());
258
+ const xml = await findZipEntry(bytes, 'word/document.xml');
259
+ this._wasm.setDocumentName(this._writeStr(file.name));
260
+ this._wasm.beginDocument();
261
+ this._feedXmlBytes(xml, 'feedXmlBytes');
262
+ return this._wasm.endDocument();
263
+ }
264
+ async _indexXlsx(file) {
265
+ const bytes = new Uint8Array(await file.arrayBuffer());
266
+ this._wasm.setDocumentName(this._writeStr(file.name));
267
+ this._wasm.beginXlsx();
268
+ try {
269
+ const xml = await findZipEntry(bytes, 'xl/sharedStrings.xml');
270
+ this._feedXmlBytes(xml, 'feedXlsxBytes');
271
+ }
272
+ catch { /* workbook may have no shared strings */ }
273
+ const sheets = listZipEntries(bytes).filter(n => /^xl\/worksheets\/sheet\d+\.xml$/.test(n));
274
+ for (const name of sheets) {
275
+ try {
276
+ const xml = await findZipEntry(bytes, name);
277
+ this._feedXmlBytes(xml, 'feedXlsxBytes');
278
+ }
279
+ catch { /* skip corrupt/missing sheet */ }
280
+ }
281
+ return this._wasm.endDocument();
282
+ }
283
+ async _indexPdf(file) {
284
+ await this._ensurePdfWasm();
285
+ const pw = this._pdfWasm;
286
+ const pm = this._pdfMem;
287
+ const bytes = new Uint8Array(await file.arrayBuffer());
288
+ const inPtr = pw.allocInput(bytes.length);
289
+ new Uint8Array(pm.buffer, inPtr, bytes.length).set(bytes);
290
+ const pageCount = pw.extractPdf(bytes.length);
291
+ this._wasm.setDocumentName(this._writeStr(file.name));
292
+ this._wasm.beginDocument();
293
+ if (pageCount === -2) {
294
+ // Image-only PDF — register doc with zero chunks.
295
+ return this._wasm.endDocument();
296
+ }
297
+ if (pageCount < 0) {
298
+ const errLen = pw.getErrorLen();
299
+ const errPtr = pw.getErrorPtr();
300
+ const msg = errLen > 0
301
+ ? new TextDecoder().decode(new Uint8Array(pm.buffer, errPtr, errLen))
302
+ : 'PDF parse error';
303
+ throw new Error(msg);
304
+ }
305
+ for (let p = 0; p < pageCount; p++) {
306
+ const len = pw.getPageLen(p);
307
+ if (!len)
308
+ continue;
309
+ const text = new TextDecoder('utf-8').decode(new Uint8Array(pm.buffer, pw.getPagePtr(p), len));
310
+ this._feedText(text);
311
+ this._wasm.flushParagraph();
312
+ }
313
+ return this._wasm.endDocument();
314
+ }
315
+ async _indexTxt(file) {
316
+ const text = await file.text();
317
+ this._wasm.setDocumentName(this._writeStr(file.name));
318
+ this._wasm.beginDocument();
319
+ for (const para of text.split(/\n{2,}/)) {
320
+ const l = para.replace(/\n/g, ' ').trim();
321
+ if (l) {
322
+ this._feedText(l);
323
+ this._wasm.flushParagraph();
324
+ }
325
+ }
326
+ return this._wasm.endDocument();
327
+ }
328
+ async _indexXml(file) {
329
+ const plain = (await file.text())
330
+ .replace(/<[^]*?>/g, '\n')
331
+ .replace(/&amp;/g, '&').replace(/&lt;/g, '<').replace(/&gt;/g, '>')
332
+ .replace(/&quot;/g, '"').replace(/&apos;/g, "'")
333
+ .replace(/[ \t]+/g, ' ').trim();
334
+ this._wasm.setDocumentName(this._writeStr(file.name));
335
+ this._wasm.beginDocument();
336
+ for (const seg of plain.split(/\n{2,}/)) {
337
+ const l = seg.replace(/\n/g, ' ').trim();
338
+ if (l) {
339
+ this._feedText(l);
340
+ this._wasm.flushParagraph();
341
+ }
342
+ }
343
+ return this._wasm.endDocument();
344
+ }
345
+ // ── Public API ────────────────────────────────────────────────────────────
346
+ /**
347
+ * Index a file. Supported formats: DOCX, XLSX, PDF, TXT, XML.
348
+ * Throws for unsupported formats or parse errors.
349
+ */
350
+ async indexFile(file) {
351
+ const ext = file.name.split('.').pop()?.toLowerCase() ?? '';
352
+ const indexer = AlbexEngine._INDEXERS[ext];
353
+ if (!indexer)
354
+ throw new Error(`Unsupported format: .${ext}`);
355
+ const t0 = performance.now();
356
+ const textPre = this._wasm.getTextUsed();
357
+ const chunks = await indexer(this, file);
358
+ const doc = {
359
+ name: file.name,
360
+ ext,
361
+ chunks,
362
+ indexTimeMs: performance.now() - t0,
363
+ textBytes: this._wasm.getTextUsed() - textPre,
364
+ };
365
+ this._docs.push(doc);
366
+ return doc;
367
+ }
368
+ /**
369
+ * Search the index. Supports:
370
+ * - Simple queries: `contrato` (AND of tokens, accent-insensitive)
371
+ * - Phrase queries: `"contrato marco"` (must appear as phrase)
372
+ * - OR queries: `contrato | acuerdo` (union of two searches)
373
+ */
374
+ search(query) {
375
+ const parsed = parseQuery(query);
376
+ if (parsed.kind === 'or') {
377
+ return this._searchOr(parsed.branches, query);
378
+ }
379
+ const results = this._runSearch(tokensToWasmQuery(parsed.tokens), query);
380
+ if (parsed.kind === 'phrase') {
381
+ return results.filter(r => containsPhrase(r.snippet, parsed.tokens));
382
+ }
383
+ return results;
384
+ }
385
+ _searchOr(branches, rawQuery) {
386
+ const seen = new Set();
387
+ const all = [];
388
+ for (const tokens of branches) {
389
+ const q = tokensToWasmQuery(tokens);
390
+ if (!q)
391
+ continue;
392
+ const results = this._runSearch(q, rawQuery);
393
+ for (const r of results) {
394
+ const key = `${r.documentName}:${r.location}:${r.matchStart}`;
395
+ if (!seen.has(key)) {
396
+ seen.add(key);
397
+ all.push(r);
398
+ }
399
+ }
400
+ }
401
+ // Re-rank the merged list by score descending.
402
+ all.sort((a, b) => b.score - a.score);
403
+ return all;
404
+ }
405
+ _runSearch(wasmQuery, displayQuery) {
406
+ const ql = this._writeStr(wasmQuery);
407
+ this._wasm.setPattern(ql);
408
+ const t0 = performance.now();
409
+ const count = this._wasm.search();
410
+ const ms = performance.now() - t0;
411
+ this._lastSearch = {
412
+ query: displayQuery,
413
+ timeMs: ms,
414
+ results: count,
415
+ bloomTested: this._wasm.getStatBloomTested(),
416
+ bloomPassed: this._wasm.getStatBloomPassed(),
417
+ bitapMatched: this._wasm.getStatBitapMatched(),
418
+ };
419
+ const results = [];
420
+ for (let i = 0; i < count; i++) {
421
+ const score = this._wasm.getResultScore(i);
422
+ const location = this._wasm.getResultLocation(i);
423
+ const matchStart = this._wasm.getResultStart(i);
424
+ const matchEnd = this._wasm.getResultEnd(i);
425
+ const nl = this._wasm.getResultDocName(i);
426
+ const name = nl > 0 ? this._readPad(nl) : '?';
427
+ const sl = this._wasm.getSnippet(i);
428
+ const snippet = sl > 0 ? this._readPad(sl) : '';
429
+ results.push({ documentName: name, location, score, snippet, matchStart, matchEnd });
430
+ }
431
+ return results;
432
+ }
433
+ /** Returns current engine statistics. */
434
+ getStats() {
435
+ return {
436
+ documents: this._docs.length,
437
+ chunks: this._wasm.getChunkCount(),
438
+ textUsed: this._wasm.getTextUsed(),
439
+ textCapacity: this._wasm.getTextCapacity(),
440
+ wasmMemoryBytes: this._mem.buffer.byteLength,
441
+ };
442
+ }
443
+ /** Returns stats from the most recent search, or null. */
444
+ getLastSearchStats() {
445
+ return this._lastSearch;
446
+ }
447
+ /** Returns the list of indexed documents. */
448
+ get documents() {
449
+ return this._docs;
450
+ }
451
+ /** Supported file extensions. */
452
+ static get supportedExtensions() {
453
+ return Object.keys(AlbexEngine._INDEXERS);
454
+ }
455
+ /** Configure search sensitivity. */
456
+ setMaxErrors(errors) {
457
+ this._wasm.setMaxErrors(errors);
458
+ }
459
+ setThreshold(threshold) {
460
+ this._wasm.setThreshold(Math.max(0, Math.min(1000, threshold)));
461
+ }
462
+ setMaxResults(max) {
463
+ this._wasm.setMaxResults(Math.max(1, Math.min(200, max)));
464
+ }
465
+ /** Full reset — clears all indexed documents and chunks. */
466
+ reset() {
467
+ this._wasm.init();
468
+ this._docs = [];
469
+ this._lastSearch = null;
470
+ }
471
+ }
472
+ AlbexEngine._INDEXERS = {
473
+ docx: (e, f) => e._indexDocx(f),
474
+ xlsx: (e, f) => e._indexXlsx(f),
475
+ pdf: (e, f) => e._indexPdf(f),
476
+ txt: (e, f) => e._indexTxt(f),
477
+ xml: (e, f) => e._indexXml(f),
478
+ };
479
+ //# sourceMappingURL=albex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"albex.js","sourceRoot":"","sources":["../src/albex.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AA6DH,SAAS,QAAQ,CAAC,CAAS;IACzB,OAAO,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,UAAU,CAAC,CAAS;IAC3B,MAAM,OAAO,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IAEzB,mDAAmD;IACnD,IAAI,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC;aAChC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC;aACvC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QAC7B,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;IAClC,CAAC;IAED,8BAA8B;IAC9B,MAAM,WAAW,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC7C,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,MAAM,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC/B,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;IAChD,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;AACvD,CAAC;AAED;;;GAGG;AACH,SAAS,iBAAiB,CAAC,MAAgB;IACzC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACtC,CAAC;AAED,gFAAgF;AAChF,qBAAqB;AACrB,gFAAgF;AAEhF;;;;GAIG;AACH,SAAS,cAAc,CAAC,OAAe,EAAE,MAAgB,EAAE,MAAM,GAAG,EAAE;IACpE,MAAM,IAAI,GAAG,CAAC,CAAS,EAAU,EAAE,CACjC,CAAC,CAAC,WAAW,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAE1D,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IAC3B,MAAM,UAAU,GAAG,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAC9D,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEzC,IAAI,GAAG,GAAG,CAAC,CAAC;IACZ,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,GAAG,GAAG,UAAU,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAChC,IAAI,CAAC,GAAG;YAAE,SAAS;QACnB,MAAM,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACnC,IAAI,GAAG,KAAK,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7B,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,GAAG,GAAG,MAAM;YAAE,OAAO,KAAK,CAAC;QAC9C,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC;IACzB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,gFAAgF;AAChF,4BAA4B;AAC5B,gFAAgF;AAEhF,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC;AAC/B,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC;AAE/B,SAAS,aAAa,CAAC,KAAiB;IACtC,MAAM,CAAC,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,CAAC;IACzE,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC;IAC1B,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,UAAU;QAAE,CAAC,EAAE,CAAC;IAC1D,IAAI,CAAC,GAAG,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,gBAAgB,CAAC,CAAC;IAC7C,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC,SAAS,CAAC,CAAC,GAAG,EAAE,EAAE,IAAI,CAAC,EAAE,CAAC;AACjF,CAAC;AAED,SAAS,cAAc,CAAC,KAAiB;IACvC,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IAC/C,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,EAAE,GAAG,KAAK,CAAC;IACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,IAAI,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,UAAU;YAAE,MAAM;QAChD,MAAM,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;QACxG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/D,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAC1B,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,KAAiB,EAAE,IAAY;IACzD,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC;IAC/C,IAAI,EAAE,GAAG,KAAK,CAAC;IACf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;QAC7B,IAAI,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,UAAU;YAAE,MAAM;QAChD,MAAM,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;QACxG,MAAM,GAAG,GAAG,CAAC,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,SAAS,CAAC,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;QAC5E,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAChE,OAAO,WAAW,CAAC,KAAK,EAAE,CAAC,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC;QAC5C,CAAC;QACD,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAC1B,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,UAAU,IAAI,oBAAoB,CAAC,CAAC;AACtD,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,KAAiB,EAAE,CAAW,EAAE,GAAW,EAAE,QAAgB;IACtF,MAAM,IAAI,GAAG,CAAC,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;IACxC,MAAM,EAAE,GAAK,CAAC,CAAC,SAAS,CAAC,GAAG,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;IACzC,MAAM,EAAE,GAAK,CAAC,CAAC,SAAS,CAAC,GAAG,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;IACzC,MAAM,EAAE,GAAK,GAAG,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,CAAC;IAChC,qFAAqF;IACrF,MAAM,EAAE,GAAK,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,GAAG,EAAE,EAAE,IAAI,CAAC,CAAC;IACnE,MAAM,IAAI,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;IAEzC,IAAI,IAAI,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC5B,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;QACf,MAAM,CAAC,GAAG,IAAI,mBAAmB,CAAC,aAAa,CAAC,CAAC;QACjD,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;QACjC,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;QACjC,8EAA8E;QAC9E,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC3B,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAAC,CAAC,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAC1D,MAAM,MAAM,GAAiB,EAAE,CAAC;QAAC,IAAI,GAAG,GAAG,CAAC,CAAC;QAC7C,SAAS,CAAC;YAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YAAC,IAAI,IAAI;gBAAE,MAAM;YAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAAC,GAAG,IAAI,KAAK,CAAC,MAAM,CAAC;QAAC,CAAC;QAC9G,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;QAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC3C,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;YAAC,GAAG,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC;QAAC,CAAC;QACzD,OAAO,GAAG,CAAC;IACb,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,sCAAsC,IAAI,EAAE,CAAC,CAAC;AAChE,CAAC;AAED,gFAAgF;AAChF,iCAAiC;AACjC,gFAAgF;AAEhF,MAAM,SAAS,GAAG,KAAM,CAAC,CAAC,mCAAmC;AAE7D,gFAAgF;AAChF,wBAAwB;AACxB,gFAAgF;AAEhF,SAAS,kBAAkB,CAAC,SAAmC;IAC7D,MAAM,IAAI,GAAc,EAAE,CAAC;IAC3B,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC;IACjB,OAAO;QACL,wBAAwB,EAAE;YACxB,mBAAmB,EAAE,GAAG,EAAE,GAAE,CAAC;YAC7B,sCAAsC,EAAE,CAAC,GAAW,EAAE,GAAW,EAAE,EAAE;gBACnE,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;gBACxB,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,GAAG,KAAK,CAAC,EAAE,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YAC3E,CAAC;YACD,0BAA0B,EAAE,CAAC,GAAW,EAAE,EAAE;gBAC1C,IAAI,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC;gBAAC,OAAO,GAAG,GAAG,CAAC;YACrC,CAAC;SACF;QACD,4BAA4B,EAAE;YAC5B,+BAA+B,EAAE,CAAC,KAAa,EAAE,EAAE;gBACjD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC;gBACxB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE;oBAAE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACrD,OAAO,GAAG,CAAC;YACb,CAAC;YACD,mCAAmC,EAAE,CAAC,GAAW,EAAE,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;SACjF;KACF,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,cAAc;AACd,gFAAgF;AAEhF,MAAM,OAAO,WAAW;IAatB,YAAY,IAAkB;QAR9B,wBAAwB;QAChB,aAAQ,GAA+B,IAAI,CAAC;QAC5C,YAAO,GAA8B,IAAI,CAAC;QAE1C,UAAK,GAAsB,EAAE,CAAC;QAC9B,gBAAW,GAAuB,IAAI,CAAC;QAI7C,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAED,wFAAwF;IACxF,KAAK,CAAC,IAAI;QACR,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5C,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACpE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,WAAW,CAAC,oBAAoB,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QACrE,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,OAAO,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAI,QAAQ,CAAC,OAAO,CAAC,MAA4B,CAAC;QAC1D,IAAI,CAAC,KAAK,CAAC,IAAiB,EAAE,CAAC;IAClC,CAAC;IAED,6EAA6E;IAErE,GAAG,CAAC,GAAW,EAAE,CAAS;QAChC,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC;IAClD,CAAC;IAEO,SAAS,CAAC,CAAa;QAC7B,MAAM,GAAG,GAAI,IAAI,CAAC,KAAK,CAAC,SAAsB,CAAC,CAAC,CAAC,MAAM,CAAW,CAAC;QACnE,IAAI,CAAC,GAAG;YAAE,MAAM,IAAI,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACjE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC/B,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,SAAS,CAAC,CAAS;QACzB,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACzB,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAClB,OAAO,CAAC,CAAC,MAAM,CAAC;IAClB,CAAC;IAEO,QAAQ,CAAC,CAAS;QACxB,MAAM,GAAG,GAAI,IAAI,CAAC,KAAK,CAAC,SAAsB,CAAC,CAAC,CAAW,CAAC;QAC5D,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IACvC,CAAC;IAEO,SAAS,CAAC,IAAY;QAC5B,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC5B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;YAC7C,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC;YACvC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YACjB,IAAI,CAAC,KAAK,CAAC,QAAqB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QAC9C,CAAC;IACH,CAAC;IAEO,aAAa,CAAC,GAAe,EAAE,EAAoC;QACzE,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,EAAE,CAAC,IAAI,SAAS,EAAE,CAAC;YAC/C,MAAM,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC;YACzC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;YACjB,IAAI,CAAC,KAAK,CAAC,EAAE,CAAc,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;QACzC,CAAC;IACH,CAAC;IAED,4EAA4E;IAEpE,KAAK,CAAC,cAAc;QAC1B,IAAI,IAAI,CAAC,QAAQ;YAAE,OAAO;QAC1B,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU;YAAE,MAAM,IAAI,KAAK,CAAC,oCAAoC,CAAC,CAAC;QAClF,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QAC/C,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,CAAC,MAAM,EAAE,CAAC,CAAC;QACxE,MAAM,OAAO,GAAG,kBAAkB,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,OAAQ,CAAC,CAAC;QACxD,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,WAAW,CAAC,oBAAoB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC1E,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC;QACjC,IAAI,CAAC,OAAO,GAAI,QAAQ,CAAC,OAAO,CAAC,MAA4B,CAAC;IAChE,CAAC;IAED,6EAA6E;IAErE,KAAK,CAAC,UAAU,CAAC,IAAU;QACjC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACvD,MAAM,GAAG,GAAK,MAAM,YAAY,CAAC,KAAK,EAAE,mBAAmB,CAAC,CAAC;QAC5D,IAAI,CAAC,KAAK,CAAC,eAA4B,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACnE,IAAI,CAAC,KAAK,CAAC,aAA0B,EAAE,CAAC;QACzC,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,cAAc,CAAC,CAAC;QACxC,OAAQ,IAAI,CAAC,KAAK,CAAC,WAAwB,EAAY,CAAC;IAC1D,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,IAAU;QACjC,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QACtD,IAAI,CAAC,KAAK,CAAC,eAA4B,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACnE,IAAI,CAAC,KAAK,CAAC,SAAsB,EAAE,CAAC;QAErC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,sBAAsB,CAAC,CAAC;YAC9D,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC,CAAC,yCAAyC,CAAC,CAAC;QAErD,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,iCAAiC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5F,KAAK,MAAM,IAAI,IAAI,MAAM,EAAE,CAAC;YAC1B,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;gBAC5C,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;YAC3C,CAAC;YAAC,MAAM,CAAC,CAAC,gCAAgC,CAAC,CAAC;QAC9C,CAAC;QAED,OAAQ,IAAI,CAAC,KAAK,CAAC,WAAwB,EAAY,CAAC;IAC1D,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,IAAU;QAChC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5B,MAAM,EAAE,GAAK,IAAI,CAAC,QAAS,CAAC;QAC5B,MAAM,EAAE,GAAK,IAAI,CAAC,OAAQ,CAAC;QAC3B,MAAM,KAAK,GAAG,IAAI,UAAU,CAAC,MAAM,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAEvD,MAAM,KAAK,GAAO,EAAE,CAAC,UAAuB,CAAC,KAAK,CAAC,MAAM,CAAW,CAAC;QACrE,IAAI,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC1D,MAAM,SAAS,GAAI,EAAE,CAAC,UAAuB,CAAC,KAAK,CAAC,MAAM,CAAW,CAAC;QAErE,IAAI,CAAC,KAAK,CAAC,eAA4B,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACnE,IAAI,CAAC,KAAK,CAAC,aAA0B,EAAE,CAAC;QAEzC,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;YACrB,kDAAkD;YAClD,OAAQ,IAAI,CAAC,KAAK,CAAC,WAAwB,EAAY,CAAC;QAC1D,CAAC;QACD,IAAI,SAAS,GAAG,CAAC,EAAE,CAAC;YAClB,MAAM,MAAM,GAAI,EAAE,CAAC,WAAwB,EAAY,CAAC;YACxD,MAAM,MAAM,GAAI,EAAE,CAAC,WAAwB,EAAY,CAAC;YACxD,MAAM,GAAG,GAAG,MAAM,GAAG,CAAC;gBACpB,CAAC,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;gBACrE,CAAC,CAAC,iBAAiB,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;QACvB,CAAC;QAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,MAAM,GAAG,GAAI,EAAE,CAAC,UAAuB,CAAC,CAAC,CAAW,CAAC;YACrD,IAAI,CAAC,GAAG;gBAAE,SAAS;YACnB,MAAM,IAAI,GAAG,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,CAC1C,IAAI,UAAU,CAAC,EAAE,CAAC,MAAM,EAAG,EAAE,CAAC,UAAuB,CAAC,CAAC,CAAW,EAAE,GAAG,CAAC,CACzE,CAAC;YACF,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACpB,IAAI,CAAC,KAAK,CAAC,cAA2B,EAAE,CAAC;QAC5C,CAAC;QAED,OAAQ,IAAI,CAAC,KAAK,CAAC,WAAwB,EAAY,CAAC;IAC1D,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,IAAU;QAChC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,eAA4B,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACnE,IAAI,CAAC,KAAK,CAAC,aAA0B,EAAE,CAAC;QACzC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxC,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YAC1C,IAAI,CAAC,EAAE,CAAC;gBAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBAAE,IAAI,CAAC,KAAK,CAAC,cAA2B,EAAE,CAAC;YAAC,CAAC;QAC1E,CAAC;QACD,OAAQ,IAAI,CAAC,KAAK,CAAC,WAAwB,EAAY,CAAC;IAC1D,CAAC;IAEO,KAAK,CAAC,SAAS,CAAC,IAAU;QAChC,MAAM,KAAK,GAAG,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,CAAC;aAC9B,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC;aACzB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;aAClE,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;aAC/C,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;QACjC,IAAI,CAAC,KAAK,CAAC,eAA4B,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;QACnE,IAAI,CAAC,KAAK,CAAC,aAA0B,EAAE,CAAC;QACzC,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC;YACxC,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;YACzC,IAAI,CAAC,EAAE,CAAC;gBAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;gBAAE,IAAI,CAAC,KAAK,CAAC,cAA2B,EAAE,CAAC;YAAC,CAAC;QAC1E,CAAC;QACD,OAAQ,IAAI,CAAC,KAAK,CAAC,WAAwB,EAAY,CAAC;IAC1D,CAAC;IAUD,6EAA6E;IAE7E;;;OAGG;IACH,KAAK,CAAC,SAAS,CAAC,IAAU;QACxB,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QAC5D,MAAM,OAAO,GAAG,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC3C,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,wBAAwB,GAAG,EAAE,CAAC,CAAC;QAE7D,MAAM,EAAE,GAAO,WAAW,CAAC,GAAG,EAAE,CAAC;QACjC,MAAM,OAAO,GAAI,IAAI,CAAC,KAAK,CAAC,WAAwB,EAAY,CAAC;QACjE,MAAM,MAAM,GAAI,MAAM,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC1C,MAAM,GAAG,GAAoB;YAC3B,IAAI,EAAS,IAAI,CAAC,IAAI;YACtB,GAAG;YACH,MAAM;YACN,WAAW,EAAE,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE;YACnC,SAAS,EAAM,IAAI,CAAC,KAAK,CAAC,WAAwB,EAAa,GAAG,OAAO;SAC1E,CAAC;QACF,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACrB,OAAO,GAAG,CAAC;IACb,CAAC;IAED;;;;;OAKG;IACH,MAAM,CAAC,KAAa;QAClB,MAAM,MAAM,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QAEjC,IAAI,MAAM,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAChD,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,CAAC,CAAC;QAEzE,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,OAAO,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;QACvE,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC;IAEO,SAAS,CAAC,QAAoB,EAAE,QAAgB;QACtD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,MAAM,GAAG,GAAmB,EAAE,CAAC;QAE/B,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;YAC9B,MAAM,CAAC,GAAG,iBAAiB,CAAC,MAAM,CAAC,CAAC;YACpC,IAAI,CAAC,CAAC;gBAAE,SAAS;YACjB,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;YAC7C,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;gBACxB,MAAM,GAAG,GAAG,GAAG,CAAC,CAAC,YAAY,IAAI,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;gBAC9D,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;oBAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAAC,CAAC;YACrD,CAAC;QACH,CAAC;QAED,+CAA+C;QAC/C,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;QACtC,OAAO,GAAG,CAAC;IACb,CAAC;IAEO,UAAU,CAAC,SAAiB,EAAE,YAAoB;QACxD,MAAM,EAAE,GAAI,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,CAAC,UAAuB,CAAC,EAAE,CAAC,CAAC;QAExC,MAAM,EAAE,GAAM,WAAW,CAAC,GAAG,EAAE,CAAC;QAChC,MAAM,KAAK,GAAI,IAAI,CAAC,KAAK,CAAC,MAAmB,EAAY,CAAC;QAC1D,MAAM,EAAE,GAAM,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;QAErC,IAAI,CAAC,WAAW,GAAG;YACjB,KAAK,EAAS,YAAY;YAC1B,MAAM,EAAQ,EAAE;YAChB,OAAO,EAAO,KAAK;YACnB,WAAW,EAAI,IAAI,CAAC,KAAK,CAAC,kBAA+B,EAAY;YACrE,WAAW,EAAI,IAAI,CAAC,KAAK,CAAC,kBAA+B,EAAY;YACrE,YAAY,EAAG,IAAI,CAAC,KAAK,CAAC,mBAAgC,EAAY;SACvE,CAAC;QAEF,MAAM,OAAO,GAAmB,EAAE,CAAC;QACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAO,IAAI,CAAC,KAAK,CAAC,cAA8B,CAAC,CAAC,CAAW,CAAC;YACzE,MAAM,QAAQ,GAAI,IAAI,CAAC,KAAK,CAAC,iBAA8B,CAAC,CAAC,CAAW,CAAC;YACzE,MAAM,UAAU,GAAI,IAAI,CAAC,KAAK,CAAC,cAA4B,CAAC,CAAC,CAAW,CAAC;YACzE,MAAM,QAAQ,GAAM,IAAI,CAAC,KAAK,CAAC,YAA4B,CAAC,CAAC,CAAW,CAAC;YACzE,MAAM,EAAE,GAAY,IAAI,CAAC,KAAK,CAAC,gBAA6B,CAAC,CAAC,CAAW,CAAC;YAC1E,MAAM,IAAI,GAAS,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;YACpD,MAAM,EAAE,GAAY,IAAI,CAAC,KAAK,CAAC,UAA4B,CAAC,CAAC,CAAW,CAAC;YACzE,MAAM,OAAO,GAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAEnD,OAAO,CAAC,IAAI,CAAC,EAAE,YAAY,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC,CAAC;QACvF,CAAC;QACD,OAAO,OAAO,CAAC;IACjB,CAAC;IAED,yCAAyC;IACzC,QAAQ;QACN,OAAO;YACL,SAAS,EAAO,IAAI,CAAC,KAAK,CAAC,MAAM;YACjC,MAAM,EAAW,IAAI,CAAC,KAAK,CAAC,aAA6B,EAAY;YACrE,QAAQ,EAAS,IAAI,CAAC,KAAK,CAAC,WAA6B,EAAY;YACrE,YAAY,EAAK,IAAI,CAAC,KAAK,CAAC,eAA6B,EAAY;YACrE,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU;SAC7C,CAAC;IACJ,CAAC;IAED,0DAA0D;IAC1D,kBAAkB;QAChB,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;IAED,6CAA6C;IAC7C,IAAI,SAAS;QACX,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,iCAAiC;IACjC,MAAM,KAAK,mBAAmB;QAC5B,OAAO,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;IAC5C,CAAC;IAED,oCAAoC;IACpC,YAAY,CAAC,MAAqB;QAC/B,IAAI,CAAC,KAAK,CAAC,YAAyB,CAAC,MAAM,CAAC,CAAC;IAChD,CAAC;IAED,YAAY,CAAC,SAAiB;QAC3B,IAAI,CAAC,KAAK,CAAC,YAAyB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IAChF,CAAC;IAED,aAAa,CAAC,GAAW;QACtB,IAAI,CAAC,KAAK,CAAC,aAA0B,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,4DAA4D;IAC5D,KAAK;QACF,IAAI,CAAC,KAAK,CAAC,IAAiB,EAAE,CAAC;QAChC,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;IAC1B,CAAC;;AAvJuB,qBAAS,GAAyE;IACxG,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;IAC/B,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC;IAC/B,GAAG,EAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAC9B,GAAG,EAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;IAC9B,GAAG,EAAG,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;CAC/B,AANgC,CAM/B"}
package/package.json ADDED
@@ -0,0 +1,57 @@
1
+ {
2
+ "name": "albex",
3
+ "version": "0.1.0",
4
+ "description": "Local full-text search engine — documents never leave the browser",
5
+ "type": "module",
6
+ "main": "./dist/albex.js",
7
+ "module": "./dist/albex.js",
8
+ "types": "./dist/albex.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "import": "./dist/albex.js",
12
+ "types": "./dist/albex.d.ts"
13
+ }
14
+ },
15
+ "files": [
16
+ "dist/",
17
+ "src/",
18
+ "wasm/pkg/albex_wasm_bg.wasm",
19
+ "wasm/pkg/albex_pdf.wasm"
20
+ ],
21
+ "scripts": {
22
+ "build": "tsc",
23
+ "prepublishOnly": "npm run build",
24
+ "build:wasm": "cd wasm && cargo build --target wasm32-unknown-unknown --release && cp ../target/wasm32-unknown-unknown/release/albex_wasm.wasm pkg/albex_wasm_bg.wasm",
25
+ "build:pdf-wasm": "cd pdf-wasm && cargo build --target wasm32-unknown-unknown --release && cp ../target/wasm32-unknown-unknown/release/albex_pdf.wasm ../wasm/pkg/albex_pdf.wasm",
26
+ "build:all": "npm run build:wasm && npm run build:pdf-wasm && npm run build",
27
+ "typecheck": "tsc --noEmit"
28
+ },
29
+ "repository": {
30
+ "type": "git",
31
+ "url": "https://github.com/RafaCalRob/Albex.git"
32
+ },
33
+ "homepage": "https://github.com/RafaCalRob/Albex#readme",
34
+ "bugs": {
35
+ "url": "https://github.com/RafaCalRob/Albex/issues"
36
+ },
37
+ "keywords": [
38
+ "search",
39
+ "full-text",
40
+ "wasm",
41
+ "browser",
42
+ "offline",
43
+ "docx",
44
+ "pdf",
45
+ "xlsx",
46
+ "fuzzy",
47
+ "privacy"
48
+ ],
49
+ "author": "RafaCalRob",
50
+ "license": "MIT",
51
+ "engines": {
52
+ "node": ">=18"
53
+ },
54
+ "devDependencies": {
55
+ "typescript": "^5.4.0"
56
+ }
57
+ }