docrev 0.10.2 → 0.11.1

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.
Files changed (86) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/README.md +2 -0
  3. package/dist/lib/anchor-match.d.ts +3 -1
  4. package/dist/lib/anchor-match.d.ts.map +1 -1
  5. package/dist/lib/anchor-match.js +5 -7
  6. package/dist/lib/anchor-match.js.map +1 -1
  7. package/dist/lib/annotations.d.ts +0 -6
  8. package/dist/lib/annotations.d.ts.map +1 -1
  9. package/dist/lib/annotations.js +26 -8
  10. package/dist/lib/annotations.js.map +1 -1
  11. package/dist/lib/build.d.ts +52 -0
  12. package/dist/lib/build.d.ts.map +1 -1
  13. package/dist/lib/build.js +135 -6
  14. package/dist/lib/build.js.map +1 -1
  15. package/dist/lib/commands/build.d.ts.map +1 -1
  16. package/dist/lib/commands/build.js +39 -12
  17. package/dist/lib/commands/build.js.map +1 -1
  18. package/dist/lib/commands/doi.d.ts.map +1 -1
  19. package/dist/lib/commands/doi.js +14 -2
  20. package/dist/lib/commands/doi.js.map +1 -1
  21. package/dist/lib/commands/sync.d.ts.map +1 -1
  22. package/dist/lib/commands/sync.js +24 -11
  23. package/dist/lib/commands/sync.js.map +1 -1
  24. package/dist/lib/comment-realign.d.ts +12 -21
  25. package/dist/lib/comment-realign.d.ts.map +1 -1
  26. package/dist/lib/comment-realign.js +40 -348
  27. package/dist/lib/comment-realign.js.map +1 -1
  28. package/dist/lib/dependencies.d.ts +10 -0
  29. package/dist/lib/dependencies.d.ts.map +1 -1
  30. package/dist/lib/dependencies.js +41 -9
  31. package/dist/lib/dependencies.js.map +1 -1
  32. package/dist/lib/doi.d.ts.map +1 -1
  33. package/dist/lib/doi.js +68 -80
  34. package/dist/lib/doi.js.map +1 -1
  35. package/dist/lib/errors.d.ts.map +1 -1
  36. package/dist/lib/errors.js +3 -1
  37. package/dist/lib/errors.js.map +1 -1
  38. package/dist/lib/import.d.ts +7 -4
  39. package/dist/lib/import.d.ts.map +1 -1
  40. package/dist/lib/import.js +58 -62
  41. package/dist/lib/import.js.map +1 -1
  42. package/dist/lib/ooxml.d.ts +207 -0
  43. package/dist/lib/ooxml.d.ts.map +1 -0
  44. package/dist/lib/ooxml.js +634 -0
  45. package/dist/lib/ooxml.js.map +1 -0
  46. package/dist/lib/rate-limiter.d.ts +8 -0
  47. package/dist/lib/rate-limiter.d.ts.map +1 -1
  48. package/dist/lib/rate-limiter.js +41 -4
  49. package/dist/lib/rate-limiter.js.map +1 -1
  50. package/dist/lib/trackchanges.d.ts +41 -25
  51. package/dist/lib/trackchanges.d.ts.map +1 -1
  52. package/dist/lib/trackchanges.js +90 -151
  53. package/dist/lib/trackchanges.js.map +1 -1
  54. package/dist/lib/types.d.ts +9 -8
  55. package/dist/lib/types.d.ts.map +1 -1
  56. package/dist/lib/word-extraction.d.ts.map +1 -1
  57. package/dist/lib/word-extraction.js +48 -307
  58. package/dist/lib/word-extraction.js.map +1 -1
  59. package/dist/lib/word.d.ts.map +1 -1
  60. package/dist/lib/word.js +80 -175
  61. package/dist/lib/word.js.map +1 -1
  62. package/dist/lib/wordcomments.d.ts.map +1 -1
  63. package/dist/lib/wordcomments.js +53 -92
  64. package/dist/lib/wordcomments.js.map +1 -1
  65. package/lib/anchor-match.ts +6 -7
  66. package/lib/annotations.ts +28 -8
  67. package/lib/build.ts +196 -6
  68. package/lib/commands/build.ts +42 -12
  69. package/lib/commands/doi.ts +17 -1
  70. package/lib/commands/sync.ts +26 -13
  71. package/lib/comment-realign.ts +46 -464
  72. package/lib/dependencies.ts +43 -9
  73. package/lib/doi.ts +76 -94
  74. package/lib/errors.ts +5 -1
  75. package/lib/import.ts +65 -70
  76. package/lib/ooxml.ts +768 -0
  77. package/lib/rate-limiter.ts +37 -4
  78. package/lib/trackchanges.ts +102 -183
  79. package/lib/types.ts +9 -13
  80. package/lib/word-extraction.ts +49 -330
  81. package/lib/word.ts +86 -203
  82. package/lib/wordcomments.ts +53 -104
  83. package/package.json +137 -137
  84. package/skill/REFERENCE.md +14 -3
  85. package/skill/SKILL.md +12 -5
  86. package/types/index.d.ts +16 -10
package/dist/lib/word.js CHANGED
@@ -4,9 +4,7 @@
4
4
  */
5
5
  import * as fs from 'fs';
6
6
  import AdmZip from 'adm-zip';
7
- import { parseString } from 'xml2js';
8
- import { promisify } from 'util';
9
- const parseXml = promisify(parseString);
7
+ import { openDocx, readPartText, buildCommentAnchorModel, extractComments, walkBody, } from './ooxml.js';
10
8
  // =============================================================================
11
9
  // Constants
12
10
  // =============================================================================
@@ -31,44 +29,10 @@ export async function extractWordComments(docxPath) {
31
29
  if (!fs.existsSync(docxPath)) {
32
30
  throw new Error(`File not found: ${docxPath}`);
33
31
  }
34
- const zip = new AdmZip(docxPath);
35
- const commentsEntry = zip.getEntry('word/comments.xml');
36
- if (!commentsEntry) {
37
- return []; // No comments in document
38
- }
39
- const commentsXml = zip.readAsText(commentsEntry);
40
- const parsed = await parseXml(commentsXml);
41
- if (!parsed?.['w:comments'] || !parsed['w:comments']['w:comment']) {
42
- return [];
43
- }
44
- const comments = [];
45
- const rawComments = parsed['w:comments']['w:comment'];
46
- for (const comment of rawComments) {
47
- const id = comment.$?.['w:id'];
48
- const author = comment.$?.['w:author'] || 'Unknown';
49
- const date = comment.$?.['w:date'];
50
- // Extract text from all paragraphs in comment
51
- let text = '';
52
- const paragraphs = comment['w:p'] || [];
53
- for (const para of paragraphs) {
54
- const runs = para['w:r'] || [];
55
- for (const run of runs) {
56
- const texts = run['w:t'] || [];
57
- for (const t of texts) {
58
- text += typeof t === 'string' ? t : (t._ || '');
59
- }
60
- }
61
- }
62
- if (id && text.trim()) {
63
- comments.push({
64
- id,
65
- author,
66
- date,
67
- text: text.trim(),
68
- });
69
- }
70
- }
71
- return comments;
32
+ const zip = openDocx(docxPath);
33
+ return extractComments(zip)
34
+ .filter((c) => c.id && c.text)
35
+ .map((c) => ({ id: c.id, author: c.author, date: c.date, text: c.text }));
72
36
  }
73
37
  /**
74
38
  * Extract comment anchors (where comments are attached) from document.xml
@@ -82,53 +46,16 @@ export async function extractCommentAnchors(docxPath) {
82
46
  if (typeof docxPath !== 'string') {
83
47
  throw new TypeError(`docxPath must be a string, got ${typeof docxPath}`);
84
48
  }
85
- const zip = new AdmZip(docxPath);
86
- const documentEntry = zip.getEntry('word/document.xml');
87
- if (!documentEntry) {
49
+ const zip = openDocx(docxPath);
50
+ if (!zip.getEntry('word/document.xml')) {
88
51
  throw new Error('Invalid docx: no document.xml');
89
52
  }
90
- const documentXml = zip.readAsText(documentEntry);
53
+ const { fullDocText, comments } = buildCommentAnchorModel(zip);
91
54
  const anchors = new Map();
92
- // Find commentRangeStart and commentRangeEnd pairs
93
- // The text between them is what the comment is anchored to
94
- const startPattern = /<w:commentRangeStart w:id="(\d+)"\/>/g;
95
- const endPattern = /<w:commentRangeEnd w:id="(\d+)"\/>/g;
96
- let match;
97
- const starts = new Map();
98
- const ends = new Map();
99
- while ((match = startPattern.exec(documentXml)) !== null) {
100
- if (match[1]) {
101
- starts.set(match[1], match.index);
102
- }
103
- }
104
- while ((match = endPattern.exec(documentXml)) !== null) {
105
- if (match[1]) {
106
- ends.set(match[1], match.index);
107
- }
108
- }
109
- // For each comment, extract the text between start and end
110
- for (const [id, startPos] of starts) {
111
- const endPos = ends.get(id);
112
- if (!endPos)
113
- continue;
114
- const segment = documentXml.slice(startPos, endPos);
115
- // Extract all text content from the segment
116
- const textPattern = /<w:t[^>]*>([^<]*)<\/w:t>/g;
117
- let text = '';
118
- let textMatch;
119
- while ((textMatch = textPattern.exec(segment)) !== null) {
120
- text += textMatch[1] ?? '';
121
- }
122
- // Get surrounding context (text before the anchor)
123
- const contextStart = Math.max(0, startPos - CONTEXT_BEFORE_SIZE);
124
- const contextSegment = documentXml.slice(contextStart, startPos);
125
- let context = '';
126
- while ((textMatch = textPattern.exec(contextSegment)) !== null) {
127
- context += textMatch[1] ?? '';
128
- }
129
- anchors.set(id, {
130
- text: text.trim(),
131
- context: context.slice(-ANCHOR_CONTEXT_SIZE),
55
+ for (const range of comments) {
56
+ anchors.set(range.id, {
57
+ text: range.anchor,
58
+ context: fullDocText.slice(Math.max(0, range.start - CONTEXT_BEFORE_SIZE), range.start).slice(-ANCHOR_CONTEXT_SIZE),
132
59
  });
133
60
  }
134
61
  return anchors;
@@ -392,104 +319,82 @@ export async function extractPlainTextWithTrackChanges(docxPath) {
392
319
  if (!fs.existsSync(docxPath)) {
393
320
  throw new Error(`File not found: ${docxPath}`);
394
321
  }
395
- const zip = new AdmZip(docxPath);
396
- const docEntry = zip.getEntry('word/document.xml');
397
- if (!docEntry) {
322
+ const zip = openDocx(docxPath);
323
+ const docXml = readPartText(zip, 'word/document.xml');
324
+ if (docXml === null) {
398
325
  throw new Error('Invalid docx: no document.xml');
399
326
  }
400
- let xml = docEntry.getData().toString('utf8');
401
327
  let insertions = 0;
402
328
  let deletions = 0;
403
- // Use unique markers (null bytes) that won't appear in normal text
404
- const INS_S = '\x00IS\x00';
405
- const INS_E = '\x00IE\x00';
406
- const DEL_S = '\x00DS\x00';
407
- const DEL_E = '\x00DE\x00';
408
- // Step 1: Replace <w:ins> with marker-wrapped text injected as <w:t>
409
- // Whitespace-only insertions are kept as plain text (not markers) to preserve spacing.
410
- xml = xml.replace(/<w:ins\b[^>]*>([\s\S]*?)<\/w:ins>/g, (_match, content) => {
411
- const texts = [];
412
- const tPat = /<w:t[^>]*>([^<]*)<\/w:t>/g;
413
- let m;
414
- while ((m = tPat.exec(content)) !== null) {
415
- texts.push(m[1] || '');
416
- }
417
- const text = texts.join('');
418
- if (text.trim()) {
419
- insertions++;
420
- return `<w:r><w:t>${INS_S}${text}${INS_E}</w:t></w:r>`;
421
- }
422
- // Whitespace-only: preserve as plain text for spacing
423
- if (text.length > 0) {
424
- return `<w:r><w:t>${text}</w:t></w:r>`;
329
+ const paragraphs = [];
330
+ // One ordered walk drives everything: paragraph and heading boundaries,
331
+ // run text (entities already decoded, tabs/breaks rendered), and the
332
+ // track-change spans that become CriticMarkup. Field codes (w:instrText)
333
+ // never reach the text because the walker only reads w:t / w:delText.
334
+ let paraOut = '';
335
+ let headingLevel = 0;
336
+ let mode = 'normal';
337
+ let buffer = '';
338
+ const flushSpan = (open, close, isIns) => {
339
+ if (buffer.trim()) {
340
+ if (isIns)
341
+ insertions++;
342
+ else
343
+ deletions++;
344
+ paraOut += `${open}${buffer}${close}`;
425
345
  }
426
- return '';
427
- });
428
- // Step 2: Replace <w:del> similarly (uses w:delText inside)
429
- // Whitespace-only deletions are kept as plain text to preserve spacing.
430
- xml = xml.replace(/<w:del\b[^>]*>([\s\S]*?)<\/w:del>/g, (_match, content) => {
431
- const texts = [];
432
- const tPat = /<w:delText[^>]*>([^<]*)<\/w:delText>|<w:t[^>]*>([^<]*)<\/w:t>/g;
433
- let m;
434
- while ((m = tPat.exec(content)) !== null) {
435
- texts.push(m[1] || m[2] || '');
346
+ else if (buffer.length > 0) {
347
+ // Whitespace-only edits are kept as plain text to preserve spacing.
348
+ paraOut += buffer;
436
349
  }
437
- const text = texts.join('');
350
+ buffer = '';
351
+ };
352
+ const endParagraph = () => {
353
+ let text = mergeAdjacentMarkers(paraOut);
354
+ text = text.replace(/ {2,}/g, ' ');
438
355
  if (text.trim()) {
439
- deletions++;
440
- return `<w:r><w:t>${DEL_S}${text}${DEL_E}</w:t></w:r>`;
441
- }
442
- // Whitespace-only: preserve as plain text for spacing
443
- if (text.length > 0) {
444
- return `<w:r><w:t>${text}</w:t></w:r>`;
356
+ paragraphs.push(headingLevel >= 1 && headingLevel <= 6 ? '#'.repeat(headingLevel) + ' ' + text.trim() : text);
445
357
  }
446
- return '';
447
- });
448
- // Step 3: Extract text paragraph by paragraph
449
- const paragraphs = [];
450
- const paraPattern = /<w:p\b[^>]*>([\s\S]*?)<\/w:p>/g;
451
- let pm;
452
- while ((pm = paraPattern.exec(xml)) !== null) {
453
- const paraXml = pm[1];
454
- // Detect heading level from paragraph style
455
- let headingLevel = 0;
456
- const styleMatch = paraXml.match(/<w:pStyle\s+w:val="Heading(\d)"/i);
457
- if (styleMatch && styleMatch[1]) {
458
- headingLevel = parseInt(styleMatch[1], 10);
459
- }
460
- // Extract all <w:t> text in order
461
- const texts = [];
462
- const tPat = /<w:t[^>]*>([^<]*)<\/w:t>/g;
463
- let tm;
464
- while ((tm = tPat.exec(paraXml)) !== null) {
465
- texts.push(tm[1] || '');
466
- }
467
- let paraText = texts.join('');
468
- // Decode XML entities
469
- paraText = paraText
470
- .replace(/&amp;/g, '&')
471
- .replace(/&lt;/g, '<')
472
- .replace(/&gt;/g, '>')
473
- .replace(/&quot;/g, '"')
474
- .replace(/&apos;/g, "'");
475
- // Convert markers to CriticMarkup
476
- paraText = paraText
477
- .split(INS_S).join('{++')
478
- .split(INS_E).join('++}')
479
- .split(DEL_S).join('{--')
480
- .split(DEL_E).join('--}');
481
- // Merge adjacent del+ins (or ins+del) into substitutions.
482
- // Uses a scanner instead of regex to avoid backtracking across marker boundaries.
483
- paraText = mergeAdjacentMarkers(paraText);
484
- // Collapse runs of multiple spaces into single space
485
- paraText = paraText.replace(/ {2,}/g, ' ');
486
- if (paraText.trim()) {
487
- if (headingLevel > 0 && headingLevel <= 6) {
488
- paragraphs.push('#'.repeat(headingLevel) + ' ' + paraText.trim());
489
- }
490
- else {
491
- paragraphs.push(paraText);
492
- }
358
+ paraOut = '';
359
+ headingLevel = 0;
360
+ mode = 'normal';
361
+ buffer = '';
362
+ };
363
+ for (const item of walkBody(docXml)) {
364
+ switch (item.kind) {
365
+ case 'paraStart':
366
+ paraOut = '';
367
+ headingLevel = item.level;
368
+ mode = 'normal';
369
+ buffer = '';
370
+ break;
371
+ case 'paraEnd':
372
+ endParagraph();
373
+ break;
374
+ case 'text':
375
+ if (mode === 'normal')
376
+ paraOut += item.text;
377
+ else
378
+ buffer += item.text;
379
+ break;
380
+ case 'insStart':
381
+ mode = 'ins';
382
+ buffer = '';
383
+ break;
384
+ case 'insEnd':
385
+ flushSpan('{++', '++}', true);
386
+ mode = 'normal';
387
+ break;
388
+ case 'delStart':
389
+ mode = 'del';
390
+ buffer = '';
391
+ break;
392
+ case 'delEnd':
393
+ flushSpan('{--', '--}', false);
394
+ mode = 'normal';
395
+ break;
396
+ default:
397
+ break;
493
398
  }
494
399
  }
495
400
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"word.js","sourceRoot":"","sources":["../../lib/word.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AAEzB,OAAO,MAAM,MAAM,SAAS,CAAC;AAC7B,OAAO,EAAE,WAAW,EAAE,MAAM,QAAQ,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAGjC,MAAM,QAAQ,GAAG,SAAS,CAAC,WAAW,CAAC,CAAC;AAExC,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAEhF,8DAA8D;AAC9D,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAEhC,uDAAuD;AACvD,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAEhC,gFAAgF;AAChF,aAAa;AACb,gFAAgF;AAEhF;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,QAAgB;IACxD,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,IAAI,SAAS,CAAC,kCAAkC,OAAO,QAAQ,EAAE,CAAC,CAAC;IAC3E,CAAC;IACD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC;IACjC,MAAM,aAAa,GAAG,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IAExD,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,OAAO,EAAE,CAAC,CAAC,0BAA0B;IACvC,CAAC;IAED,MAAM,WAAW,GAAG,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IAClD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,WAAW,CAAQ,CAAC;IAElD,IAAI,CAAC,MAAM,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,EAAE,CAAC;QAClE,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,MAAM,WAAW,GAAG,MAAM,CAAC,YAAY,CAAC,CAAC,WAAW,CAAC,CAAC;IAEtD,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;QAClC,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;QAC/B,MAAM,MAAM,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,SAAS,CAAC;QACpD,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;QAEnC,8CAA8C;QAC9C,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACxC,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;YAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAC/B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;gBAC/B,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;oBACtB,IAAI,IAAI,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;gBAClD,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YACtB,QAAQ,CAAC,IAAI,CAAC;gBACZ,EAAE;gBACF,MAAM;gBACN,IAAI;gBACJ,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;aAClB,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,QAAgB;IAC1D,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,IAAI,SAAS,CAAC,kCAAkC,OAAO,QAAQ,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC;IACjC,MAAM,aAAa,GAAG,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IAExD,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACnD,CAAC;IAED,MAAM,WAAW,GAAG,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,IAAI,GAAG,EAAyB,CAAC;IAEjD,mDAAmD;IACnD,2DAA2D;IAC3D,MAAM,YAAY,GAAG,uCAAuC,CAAC;IAC7D,MAAM,UAAU,GAAG,qCAAqC,CAAC;IAEzD,IAAI,KAA6B,CAAC;IAClC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAkB,CAAC;IAEvC,OAAO,CAAC,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACzD,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACb,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,OAAO,CAAC,KAAK,GAAG,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACvD,IAAI,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;YACb,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,2DAA2D;IAC3D,KAAK,MAAM,CAAC,EAAE,EAAE,QAAQ,CAAC,IAAI,MAAM,EAAE,CAAC;QACpC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5B,IAAI,CAAC,MAAM;YAAE,SAAS;QAEtB,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAEpD,4CAA4C;QAC5C,MAAM,WAAW,GAAG,2BAA2B,CAAC;QAChD,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,IAAI,SAAiC,CAAC;QACtC,OAAO,CAAC,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACxD,IAAI,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7B,CAAC;QAED,mDAAmD;QACnD,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,mBAAmB,CAAC,CAAC;QACjE,MAAM,cAAc,GAAG,WAAW,CAAC,KAAK,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QACjE,IAAI,OAAO,GAAG,EAAE,CAAC;QACjB,OAAO,CAAC,SAAS,GAAG,WAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC/D,OAAO,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAChC,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE;YACd,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;YACjB,OAAO,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC,mBAAmB,CAAC;SAC7C,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,QAAgB;IACxD,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,IAAI,SAAS,CAAC,kCAAkC,OAAO,QAAQ,EAAE,CAAC,CAAC;IAC3E,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,gCAAgC,CAAC,QAAQ,CAAC,CAAC;IAChE,+EAA+E;IAC/E,IAAI,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;IACvB,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,yBAAyB,EAAE,IAAI,CAAC,CAAC,CAAE,sBAAsB;IAC7E,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,sBAAsB,EAAE,IAAI,CAAC,CAAC,CAAM,oBAAoB;IAC5E,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,EAAE,CAAC,CAAC,CAAe,qBAAqB;IAC9E,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAgB;IACpD,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,MAAM,IAAI,SAAS,CAAC,kCAAkC,OAAO,QAAQ,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC;IACjC,MAAM,SAAS,GAAG,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IAEpD,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAG,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAiB,EAAE,CAAC;IAElC,iCAAiC;IACjC,MAAM,QAAQ,GAA2B;QACvC,KAAK,EAAE,+BAA+B;QACtC,MAAM,EAAE,mCAAmC;QAC3C,OAAO,EAAE,kDAAkD;QAC3D,QAAQ,EAAE,oDAAoD;KAC/D,CAAC;IAEF,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACrC,IAAI,KAAK,EAAE,CAAC;YACT,QAAgB,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;IAED,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,QAAgB;IAC7C,IAAI,OAAO,QAAQ,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAC3C,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,OAAO,CAAC;QAAE,OAAO,KAAK,CAAC;IAE5D,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC;QACjC,OAAO,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,KAAK,IAAI,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,SAAS,kBAAkB,CAAC,GAAW;IACrC,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,oCAAoC;IACpC,MAAM,WAAW,GAAG,2BAA2B,CAAC;IAChD,IAAI,KAA6B,CAAC;IAClC,OAAO,CAAC,KAAK,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAChD,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC;IACD,sCAAsC;IACtC,MAAM,cAAc,GAAG,uCAAuC,CAAC;IAC/D,OAAO,CAAC,KAAK,GAAG,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACnD,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC;IACnB,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,QAAgB;IACxD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC;IACjC,MAAM,aAAa,GAAG,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IAExD,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,GAAG,GAAG,GAAG,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;IACxC,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,uCAAuC;IACvC,MAAM,aAAa,GAAG,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAC9C,MAAM,YAAY,GAAG,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IAE7C,IAAI,CAAC,aAAa,IAAI,CAAC,YAAY,EAAE,CAAC;QACpC,OAAO,EAAE,eAAe,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,UAAU,EAAE,CAAC,EAAE,SAAS,EAAE,CAAC,EAAE,EAAE,CAAC;IAC3F,CAAC;IAED,0DAA0D;IAC1D,wDAAwD;IACxD,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,oCAAoC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACzE,MAAM,IAAI,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YAChB,UAAU,EAAE,CAAC;YACb,OAAO,MAAM,IAAI,KAAK,CAAC;QACzB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC,CAAC;IAEH,yDAAyD;IACzD,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,oCAAoC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACzE,MAAM,IAAI,GAAG,kBAAkB,CAAC,OAAO,CAAC,CAAC;QACzC,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YAChB,SAAS,EAAE,CAAC;YACZ,OAAO,MAAM,IAAI,KAAK,CAAC;QACzB,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IAEH,OAAO;QACL,eAAe,EAAE,IAAI;QACrB,OAAO,EAAE,GAAG;QACZ,KAAK,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE;KACjC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,aAAa,CAAC,IAAY,EAAE,CAAS,EAAE,IAAY,EAAE,KAAa;IACzE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IAC3C,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IAC9B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IAC5C,IAAI,QAAQ,KAAK,CAAC,CAAC;QAAE,OAAO,IAAI,CAAC;IACjC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,EAAE,GAAG,EAAE,QAAQ,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;AAChF,CAAC;AAED;;;GAGG;AACH,SAAS,kBAAkB,CAAC,IAAY,EAAE,CAAS,EAAE,IAAY,EAAE,KAAa;IAC9E,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;IAClD,IAAI,CAAC,KAAK;QAAE,OAAO,IAAI,CAAC;IAExB,IAAI,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC5B,IAAI,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;IAEpB,OAAO,GAAG,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,aAAa,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;QACnD,IAAI,CAAC,IAAI;YAAE,MAAM;QACjB,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC;QACxB,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;IACjB,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC;AAC1B,CAAC;AAED;;;;;;GAMG;AACH,SAAS,oBAAoB,CAAC,IAAY;IACxC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,CAAC,GAAG,CAAC,CAAC;IAEV,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,yBAAyB;QACzB,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,kBAAkB,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YACtD,IAAI,CAAC,GAAG,EAAE,CAAC;gBAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;gBAAC,CAAC,EAAE,CAAC;gBAAC,SAAS;YAAC,CAAC;YAE/C,iDAAiD;YACjD,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC;YAChB,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG;gBAAE,CAAC,EAAE,CAAC;YAE/C,MAAM,GAAG,GAAG,kBAAkB,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YACtD,IAAI,GAAG,EAAE,CAAC;gBACR,0BAA0B;gBAC1B,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBACxE,MAAM,IAAI,MAAM,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBAC3F,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC;YACd,CAAC;iBAAM,CAAC;gBACN,uBAAuB;gBACvB,MAAM,IAAI,MAAM,GAAG,CAAC,OAAO,KAAK,CAAC;gBACjC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC;YACd,CAAC;YACD,SAAS;QACX,CAAC;QAED,0BAA0B;QAC1B,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,kBAAkB,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YACtD,IAAI,CAAC,GAAG,EAAE,CAAC;gBAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;gBAAC,CAAC,EAAE,CAAC;gBAAC,SAAS;YAAC,CAAC;YAE/C,gDAAgD;YAChD,IAAI,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC;YAChB,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG;gBAAE,CAAC,EAAE,CAAC;YAE/C,MAAM,GAAG,GAAG,kBAAkB,CAAC,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;YACtD,IAAI,GAAG,EAAE,CAAC;gBACR,sDAAsD;gBACtD,MAAM,QAAQ,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;gBACxE,MAAM,IAAI,MAAM,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBAC3F,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC;YACd,CAAC;iBAAM,CAAC;gBACN,wBAAwB;gBACxB,MAAM,IAAI,MAAM,GAAG,CAAC,OAAO,KAAK,CAAC;gBACjC,CAAC,GAAG,GAAG,CAAC,GAAG,CAAC;YACd,CAAC;YACD,SAAS;QACX,CAAC;QAED,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC,EAAE,CAAC;IACN,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,gCAAgC,CAAC,QAAgB;IAKrE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,MAAM,CAAC,QAAQ,CAAC,CAAC;IACjC,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IAEnD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;IACnD,CAAC;IAED,IAAI,GAAG,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9C,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,mEAAmE;IACnE,MAAM,KAAK,GAAG,YAAY,CAAC;IAC3B,MAAM,KAAK,GAAG,YAAY,CAAC;IAC3B,MAAM,KAAK,GAAG,YAAY,CAAC;IAC3B,MAAM,KAAK,GAAG,YAAY,CAAC;IAE3B,qEAAqE;IACrE,uFAAuF;IACvF,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,oCAAoC,EAAE,CAAC,MAAM,EAAE,OAAe,EAAE,EAAE;QAClF,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,2BAA2B,CAAC;QACzC,IAAI,CAAyB,CAAC;QAC9B,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACzC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACzB,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5B,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YAChB,UAAU,EAAE,CAAC;YACb,OAAO,aAAa,KAAK,GAAG,IAAI,GAAG,KAAK,cAAc,CAAC;QACzD,CAAC;QACD,sDAAsD;QACtD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,OAAO,aAAa,IAAI,cAAc,CAAC;QACzC,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IAEH,4DAA4D;IAC5D,wEAAwE;IACxE,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,oCAAoC,EAAE,CAAC,MAAM,EAAE,OAAe,EAAE,EAAE;QAClF,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,gEAAgE,CAAC;QAC9E,IAAI,CAAyB,CAAC;QAC9B,OAAO,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACzC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QACjC,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAC5B,IAAI,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;YAChB,SAAS,EAAE,CAAC;YACZ,OAAO,aAAa,KAAK,GAAG,IAAI,GAAG,KAAK,cAAc,CAAC;QACzD,CAAC;QACD,sDAAsD;QACtD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpB,OAAO,aAAa,IAAI,cAAc,CAAC;QACzC,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IAEH,8CAA8C;IAC9C,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,MAAM,WAAW,GAAG,gCAAgC,CAAC;IACrD,IAAI,EAA0B,CAAC;IAE/B,OAAO,CAAC,EAAE,GAAG,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC7C,MAAM,OAAO,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;QAEtB,4CAA4C;QAC5C,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,MAAM,UAAU,GAAG,OAAO,CAAC,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACrE,IAAI,UAAU,IAAI,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;YAChC,YAAY,GAAG,QAAQ,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7C,CAAC;QAED,kCAAkC;QAClC,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,2BAA2B,CAAC;QACzC,IAAI,EAA0B,CAAC;QAC/B,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC1C,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC1B,CAAC;QAED,IAAI,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAE9B,sBAAsB;QACtB,QAAQ,GAAG,QAAQ;aAChB,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC;aACtB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;aACrB,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC;aACrB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;aACvB,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC;QAE3B,kCAAkC;QAClC,QAAQ,GAAG,QAAQ;aAChB,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;aACxB,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;aACxB,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;aACxB,KAAK,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE5B,0DAA0D;QAC1D,kFAAkF;QAClF,QAAQ,GAAG,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QAE1C,qDAAqD;QACrD,QAAQ,GAAG,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAE3C,IAAI,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;YACpB,IAAI,YAAY,GAAG,CAAC,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;gBAC1C,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,YAAY,CAAC,GAAG,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;YACpE,CAAC;iBAAM,CAAC;gBACN,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO;QACL,IAAI,EAAE,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;QAC7B,eAAe,EAAE,UAAU,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC;QAChD,KAAK,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE;KACjC,CAAC;AACJ,CAAC;AAMD;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,QAAgB,EAChB,UAA0C,EAAE;IAE5C,MAAM,EAAE,QAAQ,EAAE,GAAG,OAAO,CAAC;IAE7B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,eAAe,CAAC,CAAC;IAEnD,gEAAgE;IAChE,4FAA4F;IAC5F,IAAI,UAAU,GAAG,IAAI,QAAQ,+CAA+C,CAAC;IAC7E,IAAI,QAAQ,EAAE,CAAC;QACb,UAAU,IAAI,qBAAqB,QAAQ,GAAG,CAAC;IACjD,CAAC;IAED,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,QAAQ,CAAC,UAAU,UAAU,EAAE,EAAE;YACtC,QAAQ,EAAE,OAAO;YACjB,SAAS,EAAE,EAAE,GAAG,IAAI,GAAG,IAAI;SAC5B,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,GAAQ,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CAAC,6BAA6B,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;IAC9D,CAAC;IAED,yCAAyC;IACzC,IAAI,UAAU,GAAG,CAAC,CAAC;IACnB,IAAI,SAAS,GAAG,CAAC,CAAC;IAElB,mCAAmC;IACnC,2CAA2C;IAC3C,yCAAyC;IAEzC,uDAAuD;IACvD,mDAAmD;IACnD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,mCAAmC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QAC1E,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YACnB,UAAU,EAAE,CAAC;YACb,OAAO,MAAM,OAAO,KAAK,CAAC;QAC5B,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IAEH,iDAAiD;IACjD,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,kCAAkC,EAAE,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;QACzE,IAAI,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC;YACnB,SAAS,EAAE,CAAC;YACZ,OAAO,MAAM,OAAO,KAAK,CAAC;QAC5B,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC,CAAC;IAEH,MAAM,eAAe,GAAG,UAAU,GAAG,CAAC,IAAI,SAAS,GAAG,CAAC,CAAC;IAExD,OAAO;QACL,IAAI;QACJ,eAAe;QACf,KAAK,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE;KACjC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"word.js","sourceRoot":"","sources":["../../lib/word.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"wordcomments.d.ts","sourceRoot":"","sources":["../../lib/wordcomments.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAUH,UAAU,aAAa;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,eAAgB,SAAQ,aAAa;IAC7C,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,UAAU,aAAa;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAUD,UAAU,eAAe;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAUD;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CAiN1E;AA4ID;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,eAAe,EAAE,EAC3B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,eAAe,CAAC,CA0Z1B"}
1
+ {"version":3,"file":"wordcomments.d.ts","sourceRoot":"","sources":["../../lib/wordcomments.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAWH,UAAU,aAAa;IACrB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,eAAgB,SAAQ,aAAa;IAC7C,OAAO,EAAE,OAAO,CAAC;IACjB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,mBAAmB,CAAC,EAAE,OAAO,CAAC;CAC/B;AAED,UAAU,aAAa;IACrB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,eAAe,EAAE,CAAC;CAC7B;AAUD,UAAU,eAAe;IACvB,OAAO,EAAE,OAAO,CAAC;IACjB,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAUD;;;;;;GAMG;AACH,wBAAgB,0BAA0B,CAAC,QAAQ,EAAE,MAAM,GAAG,aAAa,CAiN1E;AA4ID;;GAEG;AACH,wBAAsB,uBAAuB,CAC3C,QAAQ,EAAE,MAAM,EAChB,QAAQ,EAAE,eAAe,EAAE,EAC3B,UAAU,EAAE,MAAM,GACjB,OAAO,CAAC,eAAe,CAAC,CAsW1B"}
@@ -12,6 +12,7 @@
12
12
  import * as fs from 'fs';
13
13
  import AdmZip from 'adm-zip';
14
14
  import { escapeXml } from './utils.js';
15
+ import { indexTextRuns } from './ooxml.js';
15
16
  const MARKER_START_PREFIX = '⟦CMS:';
16
17
  const MARKER_END_PREFIX = '⟦CME:';
17
18
  const MARKER_SUFFIX = '⟧';
@@ -383,7 +384,25 @@ export async function injectCommentsAtMarkers(docxPath, comments, outputPath) {
383
384
  }
384
385
  }
385
386
  const injectedIds = new Set();
386
- // Process only parent comments (non-replies) for document ranges
387
+ // Locate the enclosing run of each marker structurally, so placement never
388
+ // scans backwards for the nearest `<w:r`. Markers that pandoc duplicated
389
+ // into attributes (e.g. <wp:docPr descr="...">) are not inside a <w:t>, so
390
+ // they never appear in the index and cannot mislead the placement.
391
+ // See: https://github.com/gcol33/docrev/issues/4
392
+ //
393
+ // The index is rebuilt each iteration against the current document: two
394
+ // markers can share one run, so splicing one run invalidates offsets into
395
+ // it for the next marker.
396
+ const findMarkerSlot = (slots, marker) => {
397
+ for (const slot of slots) {
398
+ const rel = slot.content.indexOf(marker);
399
+ if (rel >= 0)
400
+ return { slot, rel };
401
+ }
402
+ return null;
403
+ };
404
+ // Process only parent comments (non-replies) for document ranges, from the
405
+ // last document position backwards.
387
406
  const parentComments = commentsWithIds.filter(c => !c.isReply);
388
407
  for (let i = parentComments.length - 1; i >= 0; i--) {
389
408
  const comment = parentComments[i];
@@ -392,71 +411,17 @@ export async function injectCommentsAtMarkers(docxPath, comments, outputPath) {
392
411
  const idx = comment.commentIdx;
393
412
  const startMarker = `${MARKER_START_PREFIX}${idx}${MARKER_SUFFIX}`;
394
413
  const endMarker = `${MARKER_END_PREFIX}${idx}${MARKER_SUFFIX}`;
395
- // Pandoc duplicates inline image alt-text into <wp:docPr descr="...">
396
- // metadata attributes AND into the visible caption paragraph. A naive
397
- // indexOf hits the metadata-attribute occurrence first, where there is
398
- // no <w:t> element so dissectRun fails. Skip occurrences whose position
399
- // is inside an XML tag (last unbalanced '<' before position).
400
- // See: https://github.com/gcol33/docrev/issues/4
401
- function findInTextContent(haystack, needle, fromIdx = 0) {
402
- let i = fromIdx;
403
- while (true) {
404
- const p = haystack.indexOf(needle, i);
405
- if (p < 0)
406
- return -1;
407
- const lastLt = haystack.lastIndexOf('<', p);
408
- const lastGt = haystack.lastIndexOf('>', p);
409
- if (lastLt > lastGt) {
410
- i = p + 1;
411
- continue;
412
- }
413
- return p;
414
- }
415
- }
416
- const startPos = findInTextContent(documentXml, startMarker);
417
- const endPos = startPos === -1
418
- ? -1
419
- : findInTextContent(documentXml, endMarker, startPos + startMarker.length);
420
- if (startPos === -1 || endPos === -1)
421
- continue;
422
- // Find the runs containing each marker. Pandoc may split a single
423
- // markdown anchor across multiple <w:r> blocks when it applies styling
424
- // mid-anchor (smart-quote substitution, *italic*, `code`, **bold**).
425
- // The same-run path (current happy path) collapses into the multi-run
426
- // path when start and end runs coincide.
427
- const startRunOpen = Math.max(documentXml.lastIndexOf('<w:r>', startPos), documentXml.lastIndexOf('<w:r ', startPos));
428
- const startRunCloseIdx = documentXml.indexOf('</w:r>', startPos);
429
- const endRunOpen = Math.max(documentXml.lastIndexOf('<w:r>', endPos), documentXml.lastIndexOf('<w:r ', endPos));
430
- const endRunCloseIdx = documentXml.indexOf('</w:r>', endPos);
431
- if (startRunOpen === -1 || startRunCloseIdx === -1 ||
432
- endRunOpen === -1 || endRunCloseIdx === -1)
414
+ const slots = indexTextRuns(documentXml);
415
+ const startHit = findMarkerSlot(slots, startMarker);
416
+ const endHit = startHit ? findMarkerSlot(slots, endMarker) : null;
417
+ if (!startHit || !endHit)
433
418
  continue;
434
- const startRunClose = startRunCloseIdx + '</w:r>'.length;
435
- const endRunClose = endRunCloseIdx + '</w:r>'.length;
436
- const startRunFull = documentXml.slice(startRunOpen, startRunClose);
437
- const endRunFull = documentXml.slice(endRunOpen, endRunClose);
438
- // Extract <w:rPr> and <w:t> element shape from each run. Both pieces
439
- // are needed verbatim so a textBefore split keeps its original styling
440
- // and so the post-anchor textAfter render keeps the end run's styling.
441
- function dissectRun(runXml, marker) {
442
- const rPrMatch = runXml.match(/<w:rPr>[\s\S]*?<\/w:rPr>/);
443
- const tMatch = runXml.match(/<w:t[^>]*>([\s\S]*?)<\/w:t>/);
444
- if (!tMatch)
445
- return null;
446
- const tOpenMatch = tMatch[0].match(/<w:t[^>]*>/);
447
- if (!tOpenMatch)
448
- return null;
449
- const tContent = tMatch[1] ?? '';
450
- const markerInT = tContent.indexOf(marker);
451
- if (markerInT === -1)
452
- return null;
453
- return {
454
- rPr: rPrMatch ? rPrMatch[0] : '',
455
- tElement: tOpenMatch[0],
456
- textBefore: tContent.slice(0, markerInT),
457
- textAfter: tContent.slice(markerInT + marker.length),
458
- };
459
- }
419
+ const startSlot = startHit.slot;
420
+ const endSlot = endHit.slot;
421
+ const startRunOpen = startSlot.runOpenStart;
422
+ const startRunClose = startSlot.runCloseEnd;
423
+ const endRunOpen = endSlot.runOpenStart;
424
+ const endRunClose = endSlot.runCloseEnd;
460
425
  let replacement = '';
461
426
  const replies = commentsWithIds.filter(c => c.isReply && c.parentIdx === comment?.commentIdx);
462
427
  const emitRangeStarts = () => {
@@ -475,18 +440,16 @@ export async function injectCommentsAtMarkers(docxPath, comments, outputPath) {
475
440
  }
476
441
  };
477
442
  if (startRunOpen === endRunOpen) {
478
- // Same-run path: both markers live inside one <w:t>. Original logic.
479
- const startInfo = dissectRun(startRunFull, startMarker);
480
- if (!startInfo)
481
- continue;
482
- const fullText = startInfo.textBefore + startMarker + startInfo.textAfter;
483
- const endInTextRel = startInfo.textAfter.indexOf(endMarker);
443
+ // Same-run path: both markers live inside one <w:t>.
444
+ const rPr = startSlot.rPr;
445
+ const tElement = startSlot.tOpenTag;
446
+ const afterStart = startSlot.content.slice(startHit.rel + startMarker.length);
447
+ const endInTextRel = afterStart.indexOf(endMarker);
484
448
  if (endInTextRel === -1)
485
449
  continue;
486
- const anchorTextSame = startInfo.textAfter.slice(0, endInTextRel);
487
- let textAfter = startInfo.textAfter.slice(endInTextRel + endMarker.length);
488
- let anchorText = anchorTextSame;
489
- let textBefore = startInfo.textBefore;
450
+ let textBefore = startSlot.content.slice(0, startHit.rel);
451
+ let anchorText = afterStart.slice(0, endInTextRel);
452
+ let textAfter = afterStart.slice(endInTextRel + endMarker.length);
490
453
  // Empty anchor: borrow the next word so the comment has something
491
454
  // to anchor on. Then normalize the trailing double space.
492
455
  if (!anchorText && textAfter) {
@@ -499,18 +462,16 @@ export async function injectCommentsAtMarkers(docxPath, comments, outputPath) {
499
462
  if (!anchorText && textBefore.endsWith(' ') && textAfter.startsWith(' ')) {
500
463
  textAfter = textAfter.slice(1);
501
464
  }
502
- // Suppress unused warning for pre-empty-anchor fullText var
503
- void fullText;
504
465
  if (textBefore) {
505
- replacement += `<w:r>${startInfo.rPr}${startInfo.tElement}${textBefore}</w:t></w:r>`;
466
+ replacement += `<w:r>${rPr}${tElement}${textBefore}</w:t></w:r>`;
506
467
  }
507
468
  emitRangeStarts();
508
469
  if (anchorText) {
509
- replacement += `<w:r>${startInfo.rPr}${startInfo.tElement}${anchorText}</w:t></w:r>`;
470
+ replacement += `<w:r>${rPr}${tElement}${anchorText}</w:t></w:r>`;
510
471
  }
511
472
  emitRangeEnds();
512
473
  if (textAfter) {
513
- replacement += `<w:r>${startInfo.rPr}${startInfo.tElement}${textAfter}</w:t></w:r>`;
474
+ replacement += `<w:r>${rPr}${tElement}${textAfter}</w:t></w:r>`;
514
475
  }
515
476
  documentXml = documentXml.slice(0, startRunOpen) + replacement + documentXml.slice(startRunClose);
516
477
  injectedIds.add(comment.id);
@@ -520,25 +481,25 @@ export async function injectCommentsAtMarkers(docxPath, comments, outputPath) {
520
481
  // applied mid-anchor styling. Split the start run at the start marker,
521
482
  // keep all middle runs verbatim (they carry the styled anchor portions),
522
483
  // split the end run at the end marker.
523
- const startInfo = dissectRun(startRunFull, startMarker);
524
- const endInfo = dissectRun(endRunFull, endMarker);
525
- if (!startInfo || !endInfo)
526
- continue;
484
+ const startTextBefore = startSlot.content.slice(0, startHit.rel);
485
+ const startTextAfter = startSlot.content.slice(startHit.rel + startMarker.length);
486
+ const endTextBefore = endSlot.content.slice(0, endHit.rel);
487
+ const endTextAfter = endSlot.content.slice(endHit.rel + endMarker.length);
527
488
  const middle = documentXml.slice(startRunClose, endRunOpen);
528
- if (startInfo.textBefore) {
529
- replacement += `<w:r>${startInfo.rPr}${startInfo.tElement}${startInfo.textBefore}</w:t></w:r>`;
489
+ if (startTextBefore) {
490
+ replacement += `<w:r>${startSlot.rPr}${startSlot.tOpenTag}${startTextBefore}</w:t></w:r>`;
530
491
  }
531
492
  emitRangeStarts();
532
- if (startInfo.textAfter) {
533
- replacement += `<w:r>${startInfo.rPr}${startInfo.tElement}${startInfo.textAfter}</w:t></w:r>`;
493
+ if (startTextAfter) {
494
+ replacement += `<w:r>${startSlot.rPr}${startSlot.tOpenTag}${startTextAfter}</w:t></w:r>`;
534
495
  }
535
496
  replacement += middle;
536
- if (endInfo.textBefore) {
537
- replacement += `<w:r>${endInfo.rPr}${endInfo.tElement}${endInfo.textBefore}</w:t></w:r>`;
497
+ if (endTextBefore) {
498
+ replacement += `<w:r>${endSlot.rPr}${endSlot.tOpenTag}${endTextBefore}</w:t></w:r>`;
538
499
  }
539
500
  emitRangeEnds();
540
- if (endInfo.textAfter) {
541
- replacement += `<w:r>${endInfo.rPr}${endInfo.tElement}${endInfo.textAfter}</w:t></w:r>`;
501
+ if (endTextAfter) {
502
+ replacement += `<w:r>${endSlot.rPr}${endSlot.tOpenTag}${endTextAfter}</w:t></w:r>`;
542
503
  }
543
504
  documentXml = documentXml.slice(0, startRunOpen) + replacement + documentXml.slice(endRunClose);
544
505
  injectedIds.add(comment.id);