@shuji-bonji/pdf-spec-mcp 0.3.2 → 0.4.2

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 (77) hide show
  1. package/README.ja.md +11 -4
  2. package/README.md +11 -4
  3. package/dist/config.d.ts +22 -0
  4. package/dist/config.d.ts.map +1 -1
  5. package/dist/config.js +32 -1
  6. package/dist/config.js.map +1 -1
  7. package/dist/errors.d.ts +69 -5
  8. package/dist/errors.d.ts.map +1 -1
  9. package/dist/errors.js +70 -9
  10. package/dist/errors.js.map +1 -1
  11. package/dist/index.d.ts +1 -1
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +5 -42
  14. package/dist/index.js.map +1 -1
  15. package/dist/server.d.ts +18 -0
  16. package/dist/server.d.ts.map +1 -0
  17. package/dist/server.js +59 -0
  18. package/dist/server.js.map +1 -0
  19. package/dist/services/compare-service.d.ts +1 -1
  20. package/dist/services/compare-service.d.ts.map +1 -1
  21. package/dist/services/compare-service.js +2 -2
  22. package/dist/services/compare-service.js.map +1 -1
  23. package/dist/services/content-extractor.d.ts +65 -0
  24. package/dist/services/content-extractor.d.ts.map +1 -1
  25. package/dist/services/content-extractor.js +142 -10
  26. package/dist/services/content-extractor.js.map +1 -1
  27. package/dist/services/outline-resolver.d.ts +1 -1
  28. package/dist/services/outline-resolver.d.ts.map +1 -1
  29. package/dist/services/pdf-loader.d.ts +12 -2
  30. package/dist/services/pdf-loader.d.ts.map +1 -1
  31. package/dist/services/pdf-loader.js +21 -13
  32. package/dist/services/pdf-loader.js.map +1 -1
  33. package/dist/services/pdf-registry.d.ts.map +1 -1
  34. package/dist/services/pdf-registry.js +16 -8
  35. package/dist/services/pdf-registry.js.map +1 -1
  36. package/dist/services/pdf-service.d.ts +13 -1
  37. package/dist/services/pdf-service.d.ts.map +1 -1
  38. package/dist/services/pdf-service.js +79 -72
  39. package/dist/services/pdf-service.js.map +1 -1
  40. package/dist/services/requirement-extractor.d.ts +1 -1
  41. package/dist/services/requirement-extractor.d.ts.map +1 -1
  42. package/dist/services/requirement-extractor.js +40 -4
  43. package/dist/services/requirement-extractor.js.map +1 -1
  44. package/dist/services/search-index.d.ts +8 -1
  45. package/dist/services/search-index.d.ts.map +1 -1
  46. package/dist/services/search-index.js +48 -18
  47. package/dist/services/search-index.js.map +1 -1
  48. package/dist/services/table-collector.d.ts +19 -0
  49. package/dist/services/table-collector.d.ts.map +1 -0
  50. package/dist/services/table-collector.js +106 -0
  51. package/dist/services/table-collector.js.map +1 -0
  52. package/dist/tools/definitions.d.ts +26 -3
  53. package/dist/tools/definitions.d.ts.map +1 -1
  54. package/dist/tools/definitions.js +47 -114
  55. package/dist/tools/definitions.js.map +1 -1
  56. package/dist/tools/handlers.d.ts +18 -9
  57. package/dist/tools/handlers.d.ts.map +1 -1
  58. package/dist/tools/handlers.js +57 -38
  59. package/dist/tools/handlers.js.map +1 -1
  60. package/dist/types/index.d.ts +28 -33
  61. package/dist/types/index.d.ts.map +1 -1
  62. package/dist/utils/cache.d.ts.map +1 -1
  63. package/dist/utils/cache.js +4 -0
  64. package/dist/utils/cache.js.map +1 -1
  65. package/dist/utils/stdout-guard.d.ts +24 -0
  66. package/dist/utils/stdout-guard.d.ts.map +1 -0
  67. package/dist/utils/stdout-guard.js +27 -0
  68. package/dist/utils/stdout-guard.js.map +1 -0
  69. package/dist/utils/validation.d.ts +96 -14
  70. package/dist/utils/validation.d.ts.map +1 -1
  71. package/dist/utils/validation.js +152 -94
  72. package/dist/utils/validation.js.map +1 -1
  73. package/package.json +14 -11
  74. package/dist/container.d.ts +0 -25
  75. package/dist/container.d.ts.map +0 -1
  76. package/dist/container.js +0 -25
  77. package/dist/container.js.map +0 -1
@@ -5,8 +5,8 @@
5
5
  * All public functions accept an optional `specId` parameter.
6
6
  * When omitted, the default spec (iso32000-2) is used via resolveSpecId().
7
7
  */
8
- import type { SectionIndex, SectionResult, SearchHit, RequirementsResult, ISORequirementLevel, DefinitionsResult, TablesResult, OutlineEntry } from '../types/index.js';
9
8
  import type { PDFDocumentProxy } from 'pdfjs-dist/types/src/display/api.js';
9
+ import type { DefinitionsResult, ISORequirementLevel, OutlineEntry, RequirementsResult, SearchHit, SectionIndex, SectionResult, TablesResult } from '../types/index.js';
10
10
  /**
11
11
  * Service class for PDF specification operations.
12
12
  * Encapsulates all state management and caching logic.
@@ -49,6 +49,18 @@ declare class PDFSpecService {
49
49
  * Get section content by section identifier
50
50
  */
51
51
  getSectionContent(sectionId: string, specId?: string): Promise<SectionResult>;
52
+ /**
53
+ * This section's tail, stranded on the next section's first page.
54
+ *
55
+ * See extractOrphanedStrip for what the strip is and why adopting it cannot
56
+ * double-count. The condition here is the structural half: a seam exists only when the
57
+ * next section begins on the page right after this one's last.
58
+ *
59
+ * When two sections share a page (`endPage === page`, since endPage is
60
+ * `max(page, next.page - 1)`), `endPage + 1` is a page the *next* section owns outright,
61
+ * not a seam — reading it here would steal that section's content.
62
+ */
63
+ private adoptOrphanedStrip;
52
64
  /**
53
65
  * Search the specification
54
66
  */
@@ -1 +1 @@
1
- {"version":3,"file":"pdf-service.d.ts","sourceRoot":"","sources":["../../src/services/pdf-service.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pdf-service.d.ts","sourceRoot":"","sources":["../../src/services/pdf-service.ts"],"names":[],"mappings":"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"}
@@ -6,17 +6,18 @@
6
6
  * When omitted, the default spec (iso32000-2) is used via resolveSpecId().
7
7
  */
8
8
  import { CACHE_CONFIG, CONCURRENCY } from '../config.js';
9
- import { mapConcurrent } from '../utils/concurrency.js';
10
- import { ContentError } from '../errors.js';
9
+ import { ContentError, NEXT_ACTIONS } from '../errors.js';
11
10
  import { LRUCache } from '../utils/cache.js';
11
+ import { mapConcurrent } from '../utils/concurrency.js';
12
12
  import { logger } from '../utils/logger.js';
13
- import { loadDocument, reloadDocument, getOutlineWithPages } from './pdf-loader.js';
13
+ import { extractOrphanedStrip, extractSectionContent } from './content-extractor.js';
14
+ import { extractAllDefinitions } from './definition-extractor.js';
14
15
  import { buildSectionIndex, findSection } from './outline-resolver.js';
15
- import { extractSectionContent } from './content-extractor.js';
16
- import { buildSearchIndex, searchTextIndex } from './search-index.js';
16
+ import { getOutlineWithPages, loadDocument, reloadDocument } from './pdf-loader.js';
17
+ import { enrichSpecInfo, getSpecPath, resolveSpecId } from './pdf-registry.js';
17
18
  import { extractRequirementsFromContent } from './requirement-extractor.js';
18
- import { extractAllDefinitions } from './definition-extractor.js';
19
- import { getSpecPath, resolveSpecId, enrichSpecInfo } from './pdf-registry.js';
19
+ import { buildSearchIndex, searchTextIndex } from './search-index.js';
20
+ import { collectStructTreeTables } from './table-collector.js';
20
21
  // ========================================
21
22
  // PDFSpecService Class
22
23
  // ========================================
@@ -62,10 +63,13 @@ class PDFSpecService {
62
63
  */
63
64
  async getSectionIndex(specId) {
64
65
  const id = this.registry.resolveSpecId(specId);
65
- if (!this.sectionIndexMap.has(id)) {
66
- this.sectionIndexMap.set(id, this.initSectionIndex(id));
66
+ // Hold the memoised promise in a local: one lookup, and no non-null assertion.
67
+ let index = this.sectionIndexMap.get(id);
68
+ if (!index) {
69
+ index = this.initSectionIndex(id);
70
+ this.sectionIndexMap.set(id, index);
67
71
  }
68
- return this.sectionIndexMap.get(id);
72
+ return index;
69
73
  }
70
74
  /**
71
75
  * Initialize section index for a spec
@@ -98,7 +102,10 @@ class PDFSpecService {
98
102
  const msg = suggestions.length > 0
99
103
  ? `Section "${sectionId}" not found. Did you mean: ${suggestions.join(', ')}?`
100
104
  : `Section "${sectionId}" not found. Use get_structure to see available sections.`;
101
- throw new ContentError(msg);
105
+ throw new ContentError(msg, {
106
+ next_actions: [NEXT_ACTIONS.getStructure()],
107
+ retryable: true,
108
+ });
102
109
  }
103
110
  // Check content cache (keyed with specId prefix)
104
111
  const cacheKey = `${id}:${section.sectionNumber}:${section.page}-${section.endPage}`;
@@ -113,7 +120,10 @@ class PDFSpecService {
113
120
  }
114
121
  const pdfPath = this.registry.getSpecPath(id);
115
122
  const doc = await this.loader.loadDocument(pdfPath);
116
- const content = await extractSectionContent(doc, section.page, section.endPage, section.sectionNumber);
123
+ const content = [
124
+ ...(await extractSectionContent(doc, section.page, section.endPage, section.sectionNumber)),
125
+ ...(await this.adoptOrphanedStrip(doc, index, section)),
126
+ ];
117
127
  this.sectionContentCache.set(cacheKey, content);
118
128
  return {
119
129
  sectionNumber: section.sectionNumber,
@@ -122,6 +132,24 @@ class PDFSpecService {
122
132
  content,
123
133
  };
124
134
  }
135
+ /**
136
+ * This section's tail, stranded on the next section's first page.
137
+ *
138
+ * See extractOrphanedStrip for what the strip is and why adopting it cannot
139
+ * double-count. The condition here is the structural half: a seam exists only when the
140
+ * next section begins on the page right after this one's last.
141
+ *
142
+ * When two sections share a page (`endPage === page`, since endPage is
143
+ * `max(page, next.page - 1)`), `endPage + 1` is a page the *next* section owns outright,
144
+ * not a seam — reading it here would steal that section's content.
145
+ */
146
+ async adoptOrphanedStrip(doc, index, section) {
147
+ const position = index.flatOrder.indexOf(section);
148
+ const next = position === -1 ? undefined : index.flatOrder[position + 1];
149
+ if (!next || next.page !== section.endPage + 1)
150
+ return [];
151
+ return extractOrphanedStrip(doc, next.page, next.sectionNumber);
152
+ }
125
153
  // ========================================
126
154
  // Search (public)
127
155
  // ========================================
@@ -131,15 +159,17 @@ class PDFSpecService {
131
159
  async searchSpec(query, maxResults, specId) {
132
160
  const id = this.registry.resolveSpecId(specId);
133
161
  const index = await this.getSectionIndex(id);
134
- if (!this.searchIndexMap.has(id)) {
162
+ let searchIndexPromise = this.searchIndexMap.get(id);
163
+ if (!searchIndexPromise) {
135
164
  const pdfPath = this.registry.getSpecPath(id);
136
165
  // Force-reload to reset pdfjs-dist PagesMapper singleton state.
137
166
  // Without this, getPage() fails for pages beyond the LAST-loaded document's numPages.
138
167
  const doc = await this.loader.reloadDocument(pdfPath);
139
168
  logger.info('PDFService', `[${id}] Building search index (this may take a few seconds)...`);
140
- this.searchIndexMap.set(id, buildSearchIndex(doc, index));
169
+ searchIndexPromise = buildSearchIndex(doc, index);
170
+ this.searchIndexMap.set(id, searchIndexPromise);
141
171
  }
142
- const searchIdx = await this.searchIndexMap.get(id);
172
+ const searchIdx = await searchIndexPromise;
143
173
  return searchTextIndex(searchIdx, query, maxResults, index);
144
174
  }
145
175
  // ========================================
@@ -156,9 +186,9 @@ class PDFSpecService {
156
186
  if (section) {
157
187
  // Fast path: extract from specific section + subsections
158
188
  const index = await this.getSectionIndex(id);
159
- const matchingSections = index.flatOrder.filter((s) => s.sectionNumber === section || s.sectionNumber.startsWith(section + '.'));
189
+ const matchingSections = index.flatOrder.filter((s) => s.sectionNumber === section || s.sectionNumber.startsWith(`${section}.`));
160
190
  if (matchingSections.length === 0) {
161
- throw new ContentError(`Section "${section}" not found. Use get_structure to see available sections.`);
191
+ throw new ContentError(`Section "${section}" not found. Use get_structure to see available sections.`, { next_actions: [NEXT_ACTIONS.getStructure()], retryable: true });
162
192
  }
163
193
  // Only extract from leaf sections to avoid duplicates
164
194
  const matchingNumbers = new Set(matchingSections.map((s) => s.sectionNumber));
@@ -172,11 +202,13 @@ class PDFSpecService {
172
202
  }
173
203
  else {
174
204
  // Full scan: build or reuse cached index
175
- if (!this.requirementsIndexMap.has(id)) {
205
+ let requirementsPromise = this.requirementsIndexMap.get(id);
206
+ if (!requirementsPromise) {
176
207
  logger.info('PDFService', `[${id}] Building requirements index (this may take a while)...`);
177
- this.requirementsIndexMap.set(id, this.buildRequirementsIndex(id));
208
+ requirementsPromise = this.buildRequirementsIndex(id);
209
+ this.requirementsIndexMap.set(id, requirementsPromise);
178
210
  }
179
- allRequirements = await this.requirementsIndexMap.get(id);
211
+ allRequirements = await requirementsPromise;
180
212
  }
181
213
  // Apply level filter
182
214
  const filtered = level ? allRequirements.filter((r) => r.level === level) : allRequirements;
@@ -224,13 +256,24 @@ class PDFSpecService {
224
256
  // Guard: definition extraction requires compatible Section 3 structure
225
257
  if (!PDFSpecService.DEFINITIONS_SUPPORTED_SPECS.has(id)) {
226
258
  throw new ContentError(`get_definitions is only supported for ISO 32000-2 and PDF 1.7. ` +
227
- `For "${id}", use get_section with section "3" instead.`);
259
+ `For "${id}", use get_section with section "3" instead.`, {
260
+ hint: 'Other specs do not share the Section 3 "Terms and definitions" structure this parses.',
261
+ next_actions: [
262
+ {
263
+ action: 'call_get_section',
264
+ reason: `Call get_section with section "3" on "${id}" to read its terms verbatim.`,
265
+ },
266
+ ],
267
+ retryable: true,
268
+ });
228
269
  }
229
- if (!this.definitionsMap.has(id)) {
270
+ let definitionsPromise = this.definitionsMap.get(id);
271
+ if (!definitionsPromise) {
230
272
  logger.info('PDFService', `[${id}] Extracting definitions from Section 3...`);
231
- this.definitionsMap.set(id, extractAllDefinitions((sectionId) => this.getSectionContent(sectionId, id)));
273
+ definitionsPromise = extractAllDefinitions((sectionId) => this.getSectionContent(sectionId, id));
274
+ this.definitionsMap.set(id, definitionsPromise);
232
275
  }
233
- let definitions = await this.definitionsMap.get(id);
276
+ let definitions = await definitionsPromise;
234
277
  if (term) {
235
278
  const searchTerm = term.toLowerCase();
236
279
  definitions = definitions.filter((d) => d.term.toLowerCase().includes(searchTerm) ||
@@ -252,7 +295,9 @@ class PDFSpecService {
252
295
  async getTables(sectionId, tableIndex, specId) {
253
296
  const id = this.registry.resolveSpecId(specId);
254
297
  const result = await this.getSectionContent(sectionId, id);
255
- // Collect tables from StructTree (type: 'table')
298
+ // Rows that spill onto the next section's first page arrive with the section's content
299
+ // (getSectionContent adopts the orphaned strip), so the continuation rule below merges
300
+ // them like any other. Nothing table-specific is needed here.
256
301
  let tables = collectStructTreeTables(result.content);
257
302
  // Fallback: text-based table detection if StructTree has no tables
258
303
  if (tables.length === 0) {
@@ -260,7 +305,15 @@ class PDFSpecService {
260
305
  }
261
306
  if (tableIndex !== undefined) {
262
307
  if (tableIndex >= tables.length) {
263
- throw new ContentError(`table_index ${tableIndex} out of range. Section "${sectionId}" has ${tables.length} table(s).`);
308
+ throw new ContentError(`table_index ${tableIndex} out of range. Section "${sectionId}" has ${tables.length} table(s).`, {
309
+ next_actions: [
310
+ {
311
+ action: 'omit_table_index',
312
+ reason: `Call get_tables without table_index to see all ${tables.length} table(s) in this section.`,
313
+ },
314
+ ],
315
+ retryable: true,
316
+ });
264
317
  }
265
318
  return {
266
319
  section: result.sectionNumber,
@@ -280,52 +333,6 @@ class PDFSpecService {
280
333
  // ========================================
281
334
  // Module-level helper functions (stateless)
282
335
  // ========================================
283
- /**
284
- * Collect tables from StructTree-extracted content (type: 'table').
285
- */
286
- function collectStructTreeTables(content) {
287
- const tables = [];
288
- for (let i = 0; i < content.length; i++) {
289
- const element = content[i];
290
- if (element.type !== 'table')
291
- continue;
292
- // Check for caption in preceding paragraph
293
- let caption = null;
294
- if (i > 0) {
295
- const prev = content[i - 1];
296
- if (prev.type === 'paragraph' && /^Table\s+\d+/.test(prev.text)) {
297
- caption = prev.text;
298
- }
299
- }
300
- // Merge with previous table if this is a continuation (same headers, no caption)
301
- if (!caption &&
302
- tables.length > 0 &&
303
- element.headers.length > 0 &&
304
- arraysEqual(tables[tables.length - 1].headers, element.headers)) {
305
- tables[tables.length - 1].rows.push(...element.rows);
306
- continue;
307
- }
308
- tables.push({
309
- index: tables.length,
310
- caption,
311
- headers: element.headers,
312
- rows: element.rows,
313
- });
314
- }
315
- return tables;
316
- }
317
- /**
318
- * Check if two string arrays are equal
319
- */
320
- function arraysEqual(a, b) {
321
- if (a.length !== b.length)
322
- return false;
323
- for (let i = 0; i < a.length; i++) {
324
- if (a[i] !== b[i])
325
- return false;
326
- }
327
- return true;
328
- }
329
336
  /**
330
337
  * Text-based fallback: detect tables from paragraph patterns.
331
338
  */
@@ -1 +1 @@
1
- {"version":3,"file":"pdf-service.js","sourceRoot":"","sources":["../../src/services/pdf-service.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AACpF,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AACvE,OAAO,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACtE,OAAO,EAAE,8BAA8B,EAAE,MAAM,4BAA4B,CAAC;AAC5E,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAkB/E,2CAA2C;AAC3C,uBAAuB;AACvB,2CAA2C;AAE3C;;;GAGG;AACH,MAAM,cAAc;IAuBR;IAKA;IA3BV,4CAA4C;IACpC,eAAe,CAAqC;IACpD,cAAc,CAAkC;IAChD,oBAAoB,CAAsC;IAC1D,cAAc,CAAqC;IAE3D,wEAAwE;IAChE,mBAAmB,CAAqC;IAEhE,wFAAwF;IAChF,MAAM,CAAU,2BAA2B,GAAgB,IAAI,GAAG,CAAC;QACzE,YAAY;QACZ,iBAAiB;QACjB,OAAO;KACR,CAAC,CAAC;IAEH;;;;OAIG;IACH,YACU,QAIP,EACO,MAIP;QATO,aAAQ,GAAR,QAAQ,CAIf;QACO,WAAM,GAAN,MAAM,CAIb;QAED,IAAI,CAAC,eAAe,GAAG,IAAI,GAAG,EAAE,CAAC;QACjC,IAAI,CAAC,cAAc,GAAG,IAAI,GAAG,EAAE,CAAC;QAChC,IAAI,CAAC,oBAAoB,GAAG,IAAI,GAAG,EAAE,CAAC;QACtC,IAAI,CAAC,cAAc,GAAG,IAAI,GAAG,EAAE,CAAC;QAChC,IAAI,CAAC,mBAAmB,GAAG,IAAI,QAAQ,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;IACvE,CAAC;IAED,2CAA2C;IAC3C,yBAAyB;IACzB,2CAA2C;IAE3C;;OAEG;IACI,KAAK,CAAC,eAAe,CAAC,MAAe;QAC1C,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YAClC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,gBAAgB,CAAC,EAAE,CAAC,CAAC,CAAC;QAC1D,CAAC;QACD,OAAO,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC;IACvC,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,gBAAgB,CAAC,MAAc;QAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,mBAAmB,CAAC,GAAG,CAAC,CAAC;QAC3D,MAAM,KAAK,GAAG,iBAAiB,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;QAEvD,wCAAwC;QACxC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,MAAM,EAAE;YACnC,KAAK,EAAE,GAAG,CAAC,QAAQ;YACnB,cAAc,EAAE,KAAK,CAAC,QAAQ,CAAC,IAAI;SACpC,CAAC,CAAC;QAEH,MAAM,CAAC,IAAI,CACT,YAAY,EACZ,IAAI,MAAM,0BAA0B,KAAK,CAAC,QAAQ,CAAC,IAAI,cAAc,GAAG,CAAC,QAAQ,QAAQ,CAC1F,CAAC;QACF,OAAO,KAAK,CAAC;IACf,CAAC;IAED,2CAA2C;IAC3C,2BAA2B;IAC3B,2CAA2C;IAE3C;;OAEG;IACI,KAAK,CAAC,iBAAiB,CAAC,SAAiB,EAAE,MAAe;QAC/D,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QAC7C,MAAM,OAAO,GAAG,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAE9C,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,WAAW,GAAG,mBAAmB,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YAC1D,MAAM,GAAG,GACP,WAAW,CAAC,MAAM,GAAG,CAAC;gBACpB,CAAC,CAAC,YAAY,SAAS,8BAA8B,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;gBAC9E,CAAC,CAAC,YAAY,SAAS,2DAA2D,CAAC;YACvF,MAAM,IAAI,YAAY,CAAC,GAAG,CAAC,CAAC;QAC9B,CAAC;QAED,iDAAiD;QACjD,MAAM,QAAQ,GAAG,GAAG,EAAE,IAAI,OAAO,CAAC,aAAa,IAAI,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;QACrF,MAAM,MAAM,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACtD,IAAI,MAAM,EAAE,CAAC;YACX,OAAO;gBACL,aAAa,EAAE,OAAO,CAAC,aAAa;gBACpC,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,SAAS,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE;gBACxD,OAAO,EAAE,MAAM;aAChB,CAAC;QACJ,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC;QACpD,MAAM,OAAO,GAAG,MAAM,qBAAqB,CACzC,GAAG,EACH,OAAO,CAAC,IAAI,EACZ,OAAO,CAAC,OAAO,EACf,OAAO,CAAC,aAAa,CACtB,CAAC;QAEF,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAEhD,OAAO;YACL,aAAa,EAAE,OAAO,CAAC,aAAa;YACpC,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,SAAS,EAAE,EAAE,KAAK,EAAE,OAAO,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE;YACxD,OAAO;SACR,CAAC;IACJ,CAAC;IAED,2CAA2C;IAC3C,kBAAkB;IAClB,2CAA2C;IAE3C;;OAEG;IACI,KAAK,CAAC,UAAU,CACrB,KAAa,EACb,UAAkB,EAClB,MAAe;QAEf,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;QAE7C,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACjC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;YAC9C,gEAAgE;YAChE,sFAAsF;YACtF,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,cAAc,CAAC,OAAO,CAAC,CAAC;YACtD,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,0DAA0D,CAAC,CAAC;YAC5F,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,EAAE,gBAAgB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;QAC5D,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC;QACrD,OAAO,eAAe,CAAC,SAAS,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;IAC9D,CAAC;IAED,2CAA2C;IAC3C,wBAAwB;IACxB,2CAA2C;IAE3C;;;;OAIG;IACI,KAAK,CAAC,eAAe,CAC1B,OAAgB,EAChB,KAA2B,EAC3B,MAAe;QAEf,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC/C,IAAI,eAA8B,CAAC;QAEnC,IAAI,OAAO,EAAE,CAAC;YACZ,yDAAyD;YACzD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC;YAC7C,MAAM,gBAAgB,GAAG,KAAK,CAAC,SAAS,CAAC,MAAM,CAC7C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,KAAK,OAAO,IAAI,CAAC,CAAC,aAAa,CAAC,UAAU,CAAC,OAAO,GAAG,GAAG,CAAC,CAChF,CAAC;YAEF,IAAI,gBAAgB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAClC,MAAM,IAAI,YAAY,CACpB,YAAY,OAAO,2DAA2D,CAC/E,CAAC;YACJ,CAAC;YAED,sDAAsD;YACtD,MAAM,eAAe,GAAG,IAAI,GAAG,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;YAC9E,MAAM,YAAY,GAAG,gBAAgB,CAAC,MAAM,CAC1C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAC/D,CAAC;YAEF,eAAe,GAAG,EAAE,CAAC;YACrB,KAAK,MAAM,GAAG,IAAI,YAAY,EAAE,CAAC;gBAC/B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,aAAa,EAAE,EAAE,CAAC,CAAC;gBACnE,MAAM,IAAI,GAAG,8BAA8B,CACzC,MAAM,CAAC,OAAO,EACd,GAAG,CAAC,aAAa,EACjB,MAAM,CAAC,KAAK,CACb,CAAC;gBACF,eAAe,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;YAChC,CAAC;QACH,CAAC;aAAM,CAAC;YACN,yCAAyC;YACzC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;gBACvC,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,0DAA0D,CAAC,CAAC;gBAC5F,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,EAAE,IAAI,CAAC,sBAAsB,CAAC,EAAE,CAAC,CAAC,CAAC;YACrE,CAAC;YACD,eAAe,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC;QAC7D,CAAC;QAED,qBAAqB;QACrB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,eAAe,CAAC;QAE5F,mBAAmB;QACnB,MAAM,UAAU,GAA2B,EAAE,CAAC;QAC9C,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;QAC3D,CAAC;QAED,OAAO;YACL,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,IAAI,KAAK,EAAE,KAAK,EAAE,KAAK,IAAI,KAAK,EAAE;YAC5D,iBAAiB,EAAE,QAAQ,CAAC,MAAM;YAClC,UAAU;YACV,YAAY,EAAE,QAAQ;SACvB,CAAC;IACJ,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,sBAAsB,CAAC,MAAc;QACjD,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;QAEjD,wDAAwD;QACxD,MAAM,OAAO,GAAG,MAAM,aAAa,CACjC,KAAK,CAAC,SAAS,EACf,KAAK,EAAE,GAAG,EAAE,EAAE;YACZ,IAAI,CAAC;gBACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,CAAC;gBACvE,OAAO,8BAA8B,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,aAAa,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;YACzF,CAAC;YAAC,MAAM,CAAC;gBACP,qCAAqC;gBACrC,OAAO,EAAE,CAAC;YACZ,CAAC;QACH,CAAC,EACD,WAAW,CAAC,iBAAiB,CAC9B,CAAC;QAEF,MAAM,eAAe,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;QAEvC,MAAM,CAAC,IAAI,CACT,YAAY,EACZ,IAAI,MAAM,+BAA+B,eAAe,CAAC,MAAM,eAAe,CAC/E,CAAC;QACF,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,2CAA2C;IAC3C,uBAAuB;IACvB,2CAA2C;IAE3C;;;OAGG;IACI,KAAK,CAAC,cAAc,CAAC,IAAa,EAAE,MAAe;QACxD,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAE/C,uEAAuE;QACvE,IAAI,CAAC,cAAc,CAAC,2BAA2B,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACxD,MAAM,IAAI,YAAY,CACpB,iEAAiE;gBAC/D,QAAQ,EAAE,8CAA8C,CAC3D,CAAC;QACJ,CAAC;QAED,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACjC,MAAM,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,EAAE,4CAA4C,CAAC,CAAC;YAC9E,IAAI,CAAC,cAAc,CAAC,GAAG,CACrB,EAAE,EACF,qBAAqB,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,CAC5E,CAAC;QACJ,CAAC;QAED,IAAI,WAAW,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,EAAE,CAAE,CAAC;QAErD,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;YACtC,WAAW,GAAG,WAAW,CAAC,MAAM,CAC9B,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;gBACzC,CAAC,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAClD,CAAC;QACJ,CAAC;QAED,OAAO;YACL,gBAAgB,EAAE,WAAW,CAAC,MAAM;YACpC,UAAU,EAAE,IAAI;YAChB,WAAW;SACZ,CAAC;IACJ,CAAC;IAED,2CAA2C;IAC3C,kBAAkB;IAClB,2CAA2C;IAE3C;;;OAGG;IACI,KAAK,CAAC,SAAS,CACpB,SAAiB,EACjB,UAAmB,EACnB,MAAe;QAEf,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;QAC/C,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QAE3D,iDAAiD;QACjD,IAAI,MAAM,GAAgB,uBAAuB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAElE,mEAAmE;QACnE,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,MAAM,GAAG,oBAAoB,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAChD,CAAC;QAED,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;YAC7B,IAAI,UAAU,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAChC,MAAM,IAAI,YAAY,CACpB,eAAe,UAAU,2BAA2B,SAAS,SAAS,MAAM,CAAC,MAAM,YAAY,CAChG,CAAC;YACJ,CAAC;YACD,OAAO;gBACL,OAAO,EAAE,MAAM,CAAC,aAAa;gBAC7B,YAAY,EAAE,MAAM,CAAC,KAAK;gBAC1B,WAAW,EAAE,CAAC;gBACd,MAAM,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;aAC7B,CAAC;QACJ,CAAC;QAED,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,aAAa;YAC7B,YAAY,EAAE,MAAM,CAAC,KAAK;YAC1B,WAAW,EAAE,MAAM,CAAC,MAAM;YAC1B,MAAM;SACP,CAAC;IACJ,CAAC;;AAGH,2CAA2C;AAC3C,4CAA4C;AAC5C,2CAA2C;AAE3C;;GAEG;AACH,SAAS,uBAAuB,CAAC,OAAyB;IACxD,MAAM,MAAM,GAAgB,EAAE,CAAC;IAE/B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,OAAO,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,OAAO,CAAC,IAAI,KAAK,OAAO;YAAE,SAAS;QAEvC,2CAA2C;QAC3C,IAAI,OAAO,GAAkB,IAAI,CAAC;QAClC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACV,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAC5B,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW,IAAI,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChE,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC;YACtB,CAAC;QACH,CAAC;QAED,iFAAiF;QACjF,IACE,CAAC,OAAO;YACR,MAAM,CAAC,MAAM,GAAG,CAAC;YACjB,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;YAC1B,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,EAC/D,CAAC;YACD,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;YACrD,SAAS;QACX,CAAC;QAED,MAAM,CAAC,IAAI,CAAC;YACV,KAAK,EAAE,MAAM,CAAC,MAAM;YACpB,OAAO;YACP,OAAO,EAAE,OAAO,CAAC,OAAO;YACxB,IAAI,EAAE,OAAO,CAAC,IAAI;SACnB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,CAAW,EAAE,CAAW;IAC3C,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM;QAAE,OAAO,KAAK,CAAC;IACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;IAClC,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAAC,OAAyB;IACrD,MAAM,MAAM,GAAgB,EAAE,CAAC;IAC/B,MAAM,gBAAgB,GAAG,+BAA+B,CAAC;IAEzD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,EAAE,CAAC,IAAI,KAAK,WAAW;YAAE,SAAS;QAEtC,MAAM,YAAY,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QACrD,IAAI,CAAC,YAAY;YAAE,SAAS;QAE5B,MAAM,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC;QAExB,MAAM,IAAI,GAAe,EAAE,CAAC;QAC5B,IAAI,OAAO,GAAa,EAAE,CAAC;QAC3B,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAEd,OAAO,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YAC1B,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YACxB,IAAI,IAAI,CAAC,IAAI,KAAK,WAAW;gBAAE,MAAM;YACrC,IAAI,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;gBAAE,MAAM;YAC5C,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAAE,MAAM;YAE/D,IAAI,KAAe,CAAC;YACpB,IAAI,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC7B,KAAK,GAAG,IAAI,CAAC,IAAI;qBACd,KAAK,CAAC,IAAI,CAAC;qBACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;qBACpB,MAAM,CAAC,OAAO,CAAC,CAAC;YACrB,CAAC;iBAAM,CAAC;gBACN,KAAK,GAAG,IAAI,CAAC,IAAI;qBACd,KAAK,CAAC,QAAQ,CAAC;qBACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;qBACpB,MAAM,CAAC,OAAO,CAAC,CAAC;YACrB,CAAC;YAED,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,EAAE,CAAC;gBACtB,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBACzB,OAAO,GAAG,KAAK,CAAC;gBAClB,CAAC;qBAAM,CAAC;oBACN,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,MAAM;YACR,CAAC;YACD,CAAC,EAAE,CAAC;QACN,CAAC;QAED,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1C,MAAM,CAAC,IAAI,CAAC;gBACV,KAAK,EAAE,MAAM,CAAC,MAAM;gBACpB,OAAO;gBACP,OAAO;gBACP,IAAI;aACL,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;GAEG;AACH,SAAS,mBAAmB,CAAC,KAAmB,EAAE,KAAa;IAC7D,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;IAClC,MAAM,WAAW,GAAa,EAAE,CAAC;IAEjC,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC;QAC7C,IAAI,GAAG,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YACnD,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;YACrC,IAAI,WAAW,CAAC,MAAM,IAAI,CAAC;gBAAE,MAAM;QACrC,CAAC;IACH,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,2CAA2C;AAC3C,mDAAmD;AACnD,2CAA2C;AAE3C;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,cAAc,CACjD,EAAE,WAAW,EAAE,aAAa,EAAE,cAAc,EAAE,EAC9C,EAAE,YAAY,EAAE,cAAc,EAAE,mBAAmB,EAAE,CACtD,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAAe;IACnD,OAAO,iBAAiB,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,SAAiB,EACjB,MAAe;IAEf,OAAO,iBAAiB,CAAC,iBAAiB,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;AAChE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,KAAa,EACb,UAAkB,EAClB,MAAe;IAEf,OAAO,iBAAiB,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;AACjE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,OAAgB,EAChB,KAA2B,EAC3B,MAAe;IAEf,OAAO,iBAAiB,CAAC,eAAe,CAAC,OAAO,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC;AACnE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,IAAa,EAAE,MAAe;IACjE,OAAO,iBAAiB,CAAC,cAAc,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,SAAiB,EACjB,UAAmB,EACnB,MAAe;IAEf,OAAO,iBAAiB,CAAC,SAAS,CAAC,SAAS,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;AACpE,CAAC;AAED,8CAA8C;AAC9C,OAAO,EAAE,cAAc,EAAE,CAAC"}
1
+ {"version":3,"file":"pdf-service.js","sourceRoot":"","sources":["../../src/services/pdf-service.ts"],"names":[],"mappings":"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"}
@@ -12,7 +12,7 @@ import type { ContentElement, Requirement } from '../types/index.js';
12
12
  export declare function extractSentence(text: string, position: number): string;
13
13
  /**
14
14
  * Extract all normative requirements from ContentElement[].
15
- * Scans paragraphs, list items, and notes for ISO keywords.
15
+ * Scans paragraphs, list items, notes, and table cells for ISO keywords.
16
16
  */
17
17
  export declare function extractRequirementsFromContent(content: ContentElement[], sectionNumber: string, sectionTitle: string): Requirement[];
18
18
  //# sourceMappingURL=requirement-extractor.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"requirement-extractor.d.ts","sourceRoot":"","sources":["../../src/services/requirement-extractor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAuB,MAAM,mBAAmB,CAAC;AAqB1F;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CA2CtE;AAqCD;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,cAAc,EAAE,EACzB,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,GACnB,WAAW,EAAE,CAqBf"}
1
+ {"version":3,"file":"requirement-extractor.d.ts","sourceRoot":"","sources":["../../src/services/requirement-extractor.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAuB,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAsB1F;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CA2CtE;AA0CD;;;GAGG;AACH,wBAAgB,8BAA8B,CAC5C,OAAO,EAAE,cAAc,EAAE,EACzB,aAAa,EAAE,MAAM,EACrB,YAAY,EAAE,MAAM,GACnB,WAAW,EAAE,CAuBf"}
@@ -3,6 +3,7 @@
3
3
  * Extracts normative requirements (shall/should/may) from ContentElement arrays.
4
4
  * Operates at the semantic level on already-extracted content.
5
5
  */
6
+ import { collectStructTreeTables } from './table-collector.js';
6
7
  /**
7
8
  * ISO requirement keywords ordered longest-first for greedy regex matching.
8
9
  */
@@ -68,12 +69,12 @@ export function extractSentence(text, position) {
68
69
  /**
69
70
  * Extract requirements from a single text string.
70
71
  */
71
- function extractFromText(text, sectionNumber, sectionTitle, idCounter) {
72
+ function extractFromText(text, sectionNumber, sectionTitle, idCounter, context) {
72
73
  const requirements = [];
73
74
  const regex = createISORequirementRegex();
74
75
  const seen = new Set(); // deduplicate by sentence text
75
- let match;
76
- while ((match = regex.exec(text)) !== null) {
76
+ // regex is global (see createISORequirementRegex), so matchAll walks every hit.
77
+ for (const match of text.matchAll(regex)) {
77
78
  const level = match[1].toLowerCase();
78
79
  const sentence = extractSentence(text, match.index);
79
80
  // Deduplicate: same sentence may be matched multiple times
@@ -87,13 +88,14 @@ function extractFromText(text, sectionNumber, sectionTitle, idCounter) {
87
88
  text: sentence,
88
89
  section: sectionNumber,
89
90
  sectionTitle,
91
+ ...context,
90
92
  });
91
93
  }
92
94
  return requirements;
93
95
  }
94
96
  /**
95
97
  * Extract all normative requirements from ContentElement[].
96
- * Scans paragraphs, list items, and notes for ISO keywords.
98
+ * Scans paragraphs, list items, notes, and table cells for ISO keywords.
97
99
  */
98
100
  export function extractRequirementsFromContent(content, sectionNumber, sectionTitle) {
99
101
  const requirements = [];
@@ -113,6 +115,40 @@ export function extractRequirementsFromContent(content, sectionNumber, sectionTi
113
115
  break;
114
116
  }
115
117
  }
118
+ requirements.push(...extractFromTables(content, sectionNumber, sectionTitle, idCounter));
119
+ return requirements;
120
+ }
121
+ /**
122
+ * Requirements stated inside tables.
123
+ *
124
+ * ISO puts a great deal of normative text in table cells — "(Required) The type of
125
+ * annotation ... shall be Highlight, Underline, ..." — and scanning only prose misses all
126
+ * of it: 1540 cells across 333 sections of ISO 32000-2, roughly 3000 keyword occurrences.
127
+ *
128
+ * Tables are re-assembled with collectStructTreeTables rather than read element by element,
129
+ * so that a caption is attributed the same way get_tables attributes it, and a table split
130
+ * across pages yields one set of requirements rather than several headless fragments.
131
+ *
132
+ * Only StructTree tables are considered. Text-detected tables (detectTablesFromText) are
133
+ * made of `paragraph` elements that the prose loop above already scanned; taking those too
134
+ * would count every sentence twice.
135
+ */
136
+ function extractFromTables(content, sectionNumber, sectionTitle, idCounter) {
137
+ const requirements = [];
138
+ for (const table of collectStructTreeTables(content)) {
139
+ for (const row of table.rows) {
140
+ // Row label ("Subtype", "Length", the bit number ...). Without it a lifted sentence
141
+ // cannot be traced back to what it constrains.
142
+ const key = row[0];
143
+ for (const cell of row) {
144
+ requirements.push(...extractFromText(cell, sectionNumber, sectionTitle, idCounter, {
145
+ source: 'table',
146
+ ...(table.caption ? { table: table.caption } : {}),
147
+ ...(key ? { key } : {}),
148
+ }));
149
+ }
150
+ }
151
+ }
116
152
  return requirements;
117
153
  }
118
154
  //# sourceMappingURL=requirement-extractor.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"requirement-extractor.js","sourceRoot":"","sources":["../../src/services/requirement-extractor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"requirement-extractor.js","sourceRoot":"","sources":["../../src/services/requirement-extractor.ts"],"names":[],"mappings":"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"}
@@ -2,11 +2,18 @@
2
2
  * Search Index
3
3
  * Full-text search over PDF specification pages
4
4
  */
5
- import type { SectionIndex, TextIndex, SearchHit } from '../types/index.js';
5
+ import type { SearchHit, SectionIndex, TextIndex } from '../types/index.js';
6
6
  import type { PDFDocumentProxy } from './pdf-loader.js';
7
7
  /**
8
8
  * Build full-text search index from all PDF pages.
9
9
  * Uses chunked parallel processing for improved performance.
10
+ *
11
+ * A page where sections start is indexed as one entry per section segment, cut at the
12
+ * section headings by extractPageSegments (S-8). Handing the whole page to a single
13
+ * section misattributed the strip above the first heading — the tail of the previous
14
+ * section — to the next one, so search pointed at sections where the term cannot be
15
+ * found by get_section / get_tables. Pages where no section starts stay on the fast
16
+ * raw-text path: they belong entirely to the section flowing through them.
10
17
  */
11
18
  export declare function buildSearchIndex(doc: PDFDocumentProxy, sectionIndex: SectionIndex): Promise<TextIndex>;
12
19
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"search-index.d.ts","sourceRoot":"","sources":["../../src/services/search-index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAY,SAAS,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACtF,OAAO,KAAK,EAAE,gBAAgB,EAAY,MAAM,iBAAiB,CAAC;AAKlE;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,gBAAgB,EACrB,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC,SAAS,CAAC,CAmCpB;AAYD;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,YAAY,GACzB,SAAS,EAAE,CA2Eb"}
1
+ {"version":3,"file":"search-index.d.ts","sourceRoot":"","sources":["../../src/services/search-index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAY,SAAS,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAItF,OAAO,KAAK,EAAE,gBAAgB,EAAY,MAAM,iBAAiB,CAAC;AAElE;;;;;;;;;;GAUG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,gBAAgB,EACrB,YAAY,EAAE,YAAY,GACzB,OAAO,CAAC,SAAS,CAAC,CA2DpB;AAYD;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,SAAS,EAChB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,YAAY,GACzB,SAAS,EAAE,CA2Eb"}
@@ -5,29 +5,59 @@
5
5
  import { CONCURRENCY } from '../config.js';
6
6
  import { mapConcurrent } from '../utils/concurrency.js';
7
7
  import { logger } from '../utils/logger.js';
8
+ import { extractPageSegments } from './content-extractor.js';
8
9
  /**
9
10
  * Build full-text search index from all PDF pages.
10
11
  * Uses chunked parallel processing for improved performance.
12
+ *
13
+ * A page where sections start is indexed as one entry per section segment, cut at the
14
+ * section headings by extractPageSegments (S-8). Handing the whole page to a single
15
+ * section misattributed the strip above the first heading — the tail of the previous
16
+ * section — to the next one, so search pointed at sections where the term cannot be
17
+ * found by get_section / get_tables. Pages where no section starts stay on the fast
18
+ * raw-text path: they belong entirely to the section flowing through them.
11
19
  */
12
20
  export async function buildSearchIndex(doc, sectionIndex) {
13
21
  const start = Date.now();
14
22
  const totalPages = doc.numPages;
15
23
  logger.info('SearchIndex', `Building search index for ${totalPages} pages (concurrency: ${CONCURRENCY.searchIndex})...`);
24
+ // Sections starting on each page, in document order (flatOrder is document-ordered).
25
+ const startsByPage = new Map();
26
+ for (const info of sectionIndex.flatOrder) {
27
+ const arr = startsByPage.get(info.page);
28
+ if (arr) {
29
+ arr.push(info.sectionNumber);
30
+ }
31
+ else {
32
+ startsByPage.set(info.page, [info.sectionNumber]);
33
+ }
34
+ }
16
35
  const pageNumbers = Array.from({ length: totalPages }, (_, i) => i + 1);
17
- const pages = await mapConcurrent(pageNumbers, async (pageNum) => {
18
- const page = await doc.getPage(pageNum);
19
- const textContent = await page.getTextContent();
20
- const text = textContent.items
21
- .filter((item) => 'str' in item)
22
- .map((item) => item.str)
23
- .join(' ');
24
- const section = findSectionForPage(sectionIndex, pageNum);
25
- return {
36
+ const pagesNested = await mapConcurrent(pageNumbers, async (pageNum) => {
37
+ const startingSections = startsByPage.get(pageNum);
38
+ if (!startingSections) {
39
+ // No section starts here — the page belongs to the section flowing through it.
40
+ const page = await doc.getPage(pageNum);
41
+ const textContent = await page.getTextContent();
42
+ const text = textContent.items
43
+ .filter((item) => 'str' in item)
44
+ .map((item) => item.str)
45
+ .join(' ');
46
+ const section = findSectionForPage(sectionIndex, pageNum);
47
+ return [{ page: pageNum, section: section?.sectionNumber || '', text }];
48
+ }
49
+ // Sections start on this page — cut it at their headings. A null owner is the
50
+ // strip above the first heading: it belongs to the section flowing in from the
51
+ // previous page.
52
+ const flowingIn = findSectionForPage(sectionIndex, pageNum - 1);
53
+ const segments = await extractPageSegments(doc, pageNum, startingSections);
54
+ return segments.map((seg) => ({
26
55
  page: pageNum,
27
- section: section?.sectionNumber || '',
28
- text,
29
- };
56
+ section: seg.section ?? flowingIn?.sectionNumber ?? '',
57
+ text: seg.text,
58
+ }));
30
59
  }, CONCURRENCY.searchIndex);
60
+ const pages = pagesNested.flat();
31
61
  const buildTime = Date.now() - start;
32
62
  logger.info('SearchIndex', `Search index built in ${buildTime}ms (${totalPages} pages)`);
33
63
  return { pages, buildTime };
@@ -56,10 +86,10 @@ export function searchTextIndex(index, query, maxResults, sectionIndex) {
56
86
  let score = 0;
57
87
  if (idx !== -1) {
58
88
  // Count exact phrase occurrences
59
- let searchIdx = 0;
60
- while ((searchIdx = normalizedText.indexOf(normalizedQuery, searchIdx)) !== -1) {
89
+ let searchIdx = normalizedText.indexOf(normalizedQuery);
90
+ while (searchIdx !== -1) {
61
91
  score += 3; // exact phrase match scores higher than AND
62
- searchIdx += normalizedQuery.length;
92
+ searchIdx = normalizedText.indexOf(normalizedQuery, searchIdx + normalizedQuery.length);
63
93
  }
64
94
  }
65
95
  else if (queryWords.length > 1) {
@@ -69,10 +99,10 @@ export function searchTextIndex(index, query, maxResults, sectionIndex) {
69
99
  continue;
70
100
  // Score = sum of individual word occurrences
71
101
  for (const word of queryWords) {
72
- let searchIdx = 0;
73
- while ((searchIdx = normalizedText.indexOf(word, searchIdx)) !== -1) {
102
+ let searchIdx = normalizedText.indexOf(word);
103
+ while (searchIdx !== -1) {
74
104
  score++;
75
- searchIdx += word.length;
105
+ searchIdx = normalizedText.indexOf(word, searchIdx + word.length);
76
106
  }
77
107
  }
78
108
  // Find best snippet position (first occurrence of any query word)