odf-kit 0.9.9 → 0.10.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 (39) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/README.md +97 -4
  3. package/dist/docx/body-reader.d.ts +54 -0
  4. package/dist/docx/body-reader.d.ts.map +1 -0
  5. package/dist/docx/body-reader.js +1124 -0
  6. package/dist/docx/body-reader.js.map +1 -0
  7. package/dist/docx/converter.d.ts +51 -0
  8. package/dist/docx/converter.d.ts.map +1 -0
  9. package/dist/docx/converter.js +799 -0
  10. package/dist/docx/converter.js.map +1 -0
  11. package/dist/docx/index.d.ts +81 -0
  12. package/dist/docx/index.d.ts.map +1 -0
  13. package/dist/docx/index.js +69 -0
  14. package/dist/docx/index.js.map +1 -0
  15. package/dist/docx/numbering.d.ts +42 -0
  16. package/dist/docx/numbering.d.ts.map +1 -0
  17. package/dist/docx/numbering.js +236 -0
  18. package/dist/docx/numbering.js.map +1 -0
  19. package/dist/docx/reader.d.ts +38 -0
  20. package/dist/docx/reader.d.ts.map +1 -0
  21. package/dist/docx/reader.js +512 -0
  22. package/dist/docx/reader.js.map +1 -0
  23. package/dist/docx/relationships.d.ts +27 -0
  24. package/dist/docx/relationships.d.ts.map +1 -0
  25. package/dist/docx/relationships.js +89 -0
  26. package/dist/docx/relationships.js.map +1 -0
  27. package/dist/docx/styles.d.ts +46 -0
  28. package/dist/docx/styles.d.ts.map +1 -0
  29. package/dist/docx/styles.js +383 -0
  30. package/dist/docx/styles.js.map +1 -0
  31. package/dist/docx/types.d.ts +266 -0
  32. package/dist/docx/types.d.ts.map +1 -0
  33. package/dist/docx/types.js +38 -0
  34. package/dist/docx/types.js.map +1 -0
  35. package/dist/index.d.ts +2 -0
  36. package/dist/index.d.ts.map +1 -1
  37. package/dist/index.js +1 -0
  38. package/dist/index.js.map +1 -1
  39. package/package.json +36 -1
package/CHANGELOG.md CHANGED
@@ -5,6 +5,45 @@ All notable changes to odf-kit will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [0.10.0] - 2026-04-12
9
+
10
+ ### Added
11
+
12
+ - **`docxToOdt()`** — Convert `.docx` files directly to `.odt`. Pure ESM, zero new dependencies, runs in Node.js 22+ and browsers. No CommonJS, no LibreOffice, no intermediate HTML step. Available via `odf-kit/docx`.
13
+ - **Native DOCX parser** — Reads the full DOCX ZIP structure: `word/document.xml`, `word/styles.xml`, `word/numbering.xml`, `word/_rels/document.xml.rels`, `word/footnotes.xml`, `word/endnotes.xml`, `word/header*.xml`, `word/footer*.xml`, `word/settings.xml`, `word/media/*`, `docProps/core.xml`.
14
+ - **Content preserved:** paragraphs, headings (style-name and outlineLvl detection), bold, italic, underline, strikethrough, superscript/subscript, small caps, all caps, font size, font family, text color, highlight color, text alignment, paragraph spacing (before/after), line height, indentation (left, right, first-line/hanging), bullet lists, numbered lists (decimal, roman, alpha), nested lists, tables (column widths, merged cells — colSpan and rowSpan, cell background color, vertical alignment), hyperlinks (external and internal anchor), bookmarks (two-pass cross-paragraph resolution), images (actual EMU dimensions, not defaulted to 10cm), page layout (size, margins, orientation from `w:sectPr`), headers and footers, footnotes and endnotes, page breaks, tabs, line breaks, tracked changes (final-text mode — insertions included, deletions skipped).
15
+ - **Metadata** — title, creator, description read from `docProps/core.xml` (Dublin Core / OCP core properties).
16
+ - **Style inheritance** — `w:basedOn` chain walked at conversion time; each style layer correctly overrides its parent.
17
+ - **Complex fields** — `w:fldChar`/`w:instrText` HYPERLINK fields handled via state machine in addition to `w:hyperlink` elements. `w:fldSimple` fields (including in headers/footers) also handled.
18
+ - **`w:pict` legacy VML images** — Dimensions parsed from `v:shape style` attribute; image bytes loaded via `v:imagedata r:id`.
19
+ - **`w:sdt` structured document tags** — Always unwrapped and processed; checkboxes rendered as ☐/☑.
20
+ - **`pageBreakBefore`** paragraph property respected — emits a page break before the affected paragraph.
21
+ - **`DocxToOdtOptions`** — `pageFormat`, `orientation`, `preservePageLayout` (default: true), `styleMap` (custom style name → heading level), `metadata` override.
22
+ - **`DocxToOdtResult`** — `{ bytes: Uint8Array, warnings: string[] }`. Warnings report content that could not be fully converted (unrecognised fields, missing images, mid-document section breaks, etc.).
23
+ - **`odf-kit/docx`** sub-export added.
24
+ - **Deprecates** `@odf-kit/docx-to-odt` (CommonJS, browser-incompatible) — use `odf-kit/docx` instead.
25
+ - Spec-validated against ECMA-376 5th edition Part 1 (WordprocessingML). Every XSD schema element verified against the authoritative spec PDF.
26
+ - 117 new tests (1053 total, 23 test suites).
27
+ - Landing page updated: eleven modes, all 11 code examples, updated stats.
28
+ - New guide: [Convert DOCX to ODT in JavaScript](https://githubnewbie0.github.io/odf-kit/guides/docx-to-odt.html).
29
+ - All 7 tool pages now linked from README and landing page footer.
30
+
31
+ ## [0.9.9] - 2026-04-11
32
+
33
+ ### Added
34
+
35
+ - **`xlsxToOds()`** — Convert an `.xlsx` file to an `.ods` file. Available via `odf-kit/xlsx`. Zero new dependencies — parses XLSX XML directly using fflate (already present) and odf-kit's existing XML parser.
36
+ - **XLSX parser** — Reads `xl/workbook.xml`, `xl/_rels/workbook.xml.rels`, `xl/sharedStrings.xml`, `xl/styles.xml`, and `xl/worksheets/sheet*.xml`. No dependency on SheetJS or any external library.
37
+ - **Cell types supported:** string, number, boolean, date (with Excel serial → `Date` conversion including Lotus 1900 leap year bug correction), formula (cached result + formula string), error (as string).
38
+ - **Date detection** — Built-in XLSX date format IDs (14–17, 22, 27–36, 45–47, 50–58) plus custom format code analysis.
39
+ - **Merged cells** — `colSpan`/`rowSpan` preserved via `<mergeCells>` parsing.
40
+ - **Freeze rows/columns** — Detected from `<pane state="frozen">` in sheet XML.
41
+ - **Multi-sheet workbooks** — All sheets converted in tab order.
42
+ - **`readXlsx()`** — Lower-level function returning an `XlsxWorkbook` intermediate model. Exported from `odf-kit/xlsx` for callers who need the parsed model directly.
43
+ - **`odf-kit/xlsx`** sub-export added.
44
+ - Supports `.xlsx` and `.xlsm` (macro-enabled, same XML structure). Does not support legacy `.xls` (binary) or `.xlsb` (binary XML).
45
+ - 47 new tests (936 total).
46
+
8
47
  ## [0.9.8] - 2026-04-10
9
48
 
10
49
  ### Added
@@ -186,6 +225,8 @@ Initial release. Complete ODT generation support.
186
225
  - Tables, page layout, headers/footers, page breaks, lists, tab stops.
187
226
  - Method chaining. Full TypeScript types. ESM-only, Node.js 22+. 102 tests.
188
227
 
228
+ [0.10.0]: https://github.com/GitHubNewbie0/odf-kit/releases/tag/v0.10.0
229
+ [0.9.9]: https://github.com/GitHubNewbie0/odf-kit/releases/tag/v0.9.9
189
230
  [0.9.8]: https://github.com/GitHubNewbie0/odf-kit/releases/tag/v0.9.8
190
231
  [0.9.7]: https://github.com/GitHubNewbie0/odf-kit/releases/tag/v0.9.7
191
232
  [0.9.6]: https://github.com/GitHubNewbie0/odf-kit/releases/tag/v0.9.6
@@ -204,3 +245,4 @@ Initial release. Complete ODT generation support.
204
245
  [0.3.0]: https://github.com/GitHubNewbie0/odf-kit/releases/tag/v0.3.0
205
246
  [0.2.0]: https://github.com/GitHubNewbie0/odf-kit/releases/tag/v0.2.0
206
247
  [0.1.0]: https://github.com/GitHubNewbie0/odf-kit/releases/tag/v0.1.0
248
+
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # odf-kit
2
2
 
3
- Generate, fill, read, and convert OpenDocument Format files (.odt, .ods) in TypeScript and JavaScript. Convert HTML, Markdown, and TipTap JSON to ODT. Works in Node.js and browsers. No LibreOffice dependency — pure spec-compliant ODF.
3
+ Generate, fill, read, and convert OpenDocument Format files (.odt, .ods) in TypeScript and JavaScript. Convert HTML, Markdown, TipTap JSON, and DOCX to ODT. Works in Node.js and browsers. No LibreOffice dependency — pure spec-compliant ODF.
4
4
 
5
5
  **[Documentation & examples →](https://githubnewbie0.github.io/odf-kit/)**
6
6
 
@@ -8,7 +8,7 @@ Generate, fill, read, and convert OpenDocument Format files (.odt, .ods) in Type
8
8
  npm install odf-kit
9
9
  ```
10
10
 
11
- ## Nine ways to work with ODF files
11
+ ## Eleven ways to work with ODF files
12
12
 
13
13
  ```typescript
14
14
  // 1. Build an ODT document from scratch
@@ -128,7 +128,15 @@ const html = odsToHtml(bytes); // HTML table string
128
128
  ```
129
129
 
130
130
  ```typescript
131
- // 9. Convert .odt to Typst for PDF generation
131
+ // 9. Convert .xlsx to .ods no external dependencies
132
+ import { xlsxToOds } from "odf-kit/xlsx"
133
+
134
+ const bytes = await xlsxToOds(readFileSync("report.xlsx"))
135
+ writeFileSync("report.ods", bytes)
136
+ ```
137
+
138
+ ```typescript
139
+ // 10. Convert .odt to Typst for PDF generation
132
140
  import { odtToTypst } from "odf-kit/typst";
133
141
  import { execSync } from "child_process";
134
142
 
@@ -137,6 +145,21 @@ writeFileSync("letter.typ", typst);
137
145
  execSync("typst compile letter.typ letter.pdf");
138
146
  ```
139
147
 
148
+ ```typescript
149
+ // 11. Convert .docx to .odt — pure ESM, zero new dependencies, browser-safe
150
+ import { docxToOdt } from "odf-kit/docx";
151
+
152
+ const { bytes, warnings } = await docxToOdt(readFileSync("report.docx"));
153
+ writeFileSync("report.odt", bytes);
154
+ if (warnings.length > 0) console.warn(warnings);
155
+
156
+ // With options
157
+ const { bytes: bytes2 } = await docxToOdt(readFileSync("report.docx"), {
158
+ pageFormat: "letter",
159
+ styleMap: { "Section Title": 1 }, // map custom Word style → heading level
160
+ });
161
+ ```
162
+
140
163
  ---
141
164
 
142
165
  ## Installation
@@ -152,6 +175,7 @@ import { OdtDocument, OdsDocument, htmlToOdt, markdownToOdt, tiptapToOdt, fillTe
152
175
  import { readOdt, odtToHtml } from "odf-kit/odt-reader";
153
176
  import { readOds, odsToHtml } from "odf-kit/ods-reader";
154
177
  import { odtToTypst, modelToTypst } from "odf-kit/typst";
178
+ import { docxToOdt } from "odf-kit/docx";
155
179
  ```
156
180
 
157
181
  Works in Node.js, browsers, Deno, Bun, and Cloudflare Workers. Runtime dependencies: [fflate](https://github.com/101arrowz/fflate) for ZIP, [marked](https://marked.js.org/) for Markdown parsing.
@@ -680,6 +704,43 @@ Primary cells have `colSpan` and/or `rowSpan`. Covered cells have `type: "covere
680
704
 
681
705
  ---
682
706
 
707
+ ## Convert: XLSX → ODS
708
+
709
+ `odf-kit/xlsx` converts `.xlsx` spreadsheets to `.ods` with no external dependencies — parses XLSX XML directly using fflate (already in odf-kit) and our own XML parser. Supports `.xlsx` and `.xlsm`. Does not support legacy `.xls` (binary format).
710
+
711
+ ```typescript
712
+ import { xlsxToOds } from "odf-kit/xlsx"
713
+ import { readFileSync, writeFileSync } from "fs"
714
+
715
+ // Simple conversion
716
+ const bytes = await xlsxToOds(readFileSync("report.xlsx"))
717
+ writeFileSync("report.ods", bytes)
718
+
719
+ // With options
720
+ const bytes2 = await xlsxToOds(readFileSync("report.xlsx"), {
721
+ dateFormat: "DD/MM/YYYY",
722
+ metadata: { title: "Q4 Report", creator: "Alice" },
723
+ })
724
+
725
+ // Works with ArrayBuffer too (browser-friendly)
726
+ const bytes3 = await xlsxToOds(arrayBuffer)
727
+ ```
728
+
729
+ **What is preserved:**
730
+ - All sheets in tab order, with their names
731
+ - Cell values: strings, numbers, booleans, dates, formula cached results
732
+ - Formula strings
733
+ - Merged cells (colSpan/rowSpan)
734
+ - Freeze rows/columns
735
+ - Multiple sheets
736
+
737
+ **What is not preserved** (out of scope for v0.9.9):
738
+ - Cell formatting (colors, fonts, borders)
739
+ - Column widths and row heights
740
+ - Charts, images, pivot tables
741
+
742
+ ---
743
+
683
744
  ## Typst: ODT to PDF
684
745
 
685
746
  ```typescript
@@ -694,6 +755,27 @@ execSync("typst compile letter.typ letter.pdf");
694
755
 
695
756
  ## API Reference
696
757
 
758
+ ### docxToOdt
759
+
760
+ ```typescript
761
+ import { docxToOdt } from "odf-kit/docx"
762
+
763
+ const { bytes, warnings } = await docxToOdt(input, options?)
764
+
765
+ interface DocxToOdtOptions {
766
+ pageFormat?: "A4" | "letter" | "legal" | "A3" | "A5";
767
+ orientation?: "portrait" | "landscape";
768
+ preservePageLayout?: boolean; // default: true — read layout from DOCX
769
+ styleMap?: Record<string, number>; // custom style name → heading level
770
+ metadata?: { title?: string; creator?: string; description?: string };
771
+ }
772
+
773
+ interface DocxToOdtResult {
774
+ bytes: Uint8Array; // the .odt file
775
+ warnings: string[]; // content that could not be fully converted
776
+ }
777
+ ```
778
+
697
779
  ### htmlToOdt / markdownToOdt
698
780
 
699
781
  ```typescript
@@ -817,7 +899,7 @@ ESM only. Zero Node-specific APIs in the library source — enforced at the Type
817
899
  - **Two runtime dependencies** — fflate (ZIP) and marked (Markdown parsing). No transitive dependencies.
818
900
  - **Spec-compliant output** — every generated file passes the OASIS ODF validator. Enforced on every commit by CI.
819
901
  - **Multiple ODF formats** — ODT documents and ODS spreadsheets from the same library.
820
- - **Eight complete capability modes** — build ODT, build ODS, convert HTML→ODT, convert Markdown→ODT, convert TipTap JSON→ODT, fill templates, read, convert to Typst/PDF.
902
+ - **Nine complete capability modes** — build ODT, build ODS, convert HTML→ODT, convert Markdown→ODT, convert TipTap JSON→ODT, convert DOCX→ODT, fill templates, read, convert to Typst/PDF.
821
903
  - **TipTap/ProseMirror integration** — direct JSON→ODT conversion for any TipTap-based editor, no intermediate HTML step.
822
904
  - **Zero-dependency Typst emitter** — the only JavaScript library with built-in ODT→Typst conversion for PDF generation.
823
905
  - **TypeScript-first** — full types across all sub-exports.
@@ -834,6 +916,7 @@ ESM only. Zero Node-specific APIs in the library source — enforced at the Type
834
916
  | Convert HTML → ODT | ✅ | ❌ | ❌ |
835
917
  | Convert Markdown → ODT | ✅ | ❌ | ❌ |
836
918
  | Convert TipTap JSON → ODT | ✅ | ❌ | ❌ |
919
+ | Convert DOCX → ODT | ✅ native, browser-safe | ❌ | ❌ |
837
920
  | Fill .odt templates | ✅ | ❌ | ✅ .docx only |
838
921
  | Read .odt files | ✅ | ❌ | ❌ |
839
922
  | Convert to HTML | ✅ | ❌ | ❌ |
@@ -852,6 +935,10 @@ odf-kit targets ODF 1.2 (ISO/IEC 26300). Generated files include proper ZIP pack
852
935
 
853
936
  ## Version history
854
937
 
938
+ **v0.10.0** — `docxToOdt()` via `odf-kit/docx`. Native DOCX→ODT converter — pure ESM, zero new dependencies, browser-safe. Preserves text, headings, formatting, tables, lists, images (actual dimensions), hyperlinks, bookmarks, footnotes, page layout, headers/footers, and tracked changes. Spec-validated against ECMA-376 5th edition. 1053 tests passing.
939
+
940
+ **v0.9.9** — `xlsxToOds()` via `odf-kit/xlsx`. XLSX→ODS conversion with zero new dependencies. 936 tests passing.
941
+
855
942
  **v0.9.8** — ODS reader: `readOds()` and `odsToHtml()` via `odf-kit/ods-reader`. Typed values, formula strings, merged cell handling, formatting, metadata. `odf-kit/odt-reader` alias added. 889 tests passing.
856
943
 
857
944
  **v0.9.7** — ODS enhancements: number formats (integer, decimal:N, percentage, currency), merged cells (colSpan/rowSpan), freeze rows/columns, hyperlinks in cells, sheet tab color. 849 tests passing.
@@ -886,14 +973,20 @@ odf-kit targets ODF 1.2 (ISO/IEC 26300). Generated files include proper ZIP pack
886
973
  - [Generate ODT files in the browser](https://githubnewbie0.github.io/odf-kit/guides/generate-odt-browser.html)
887
974
  - [Fill ODT templates in JavaScript](https://githubnewbie0.github.io/odf-kit/guides/fill-odt-template-javascript.html)
888
975
  - [Convert ODT to HTML in JavaScript](https://githubnewbie0.github.io/odf-kit/guides/odt-to-html-javascript.html)
976
+ - [Convert DOCX to ODT in JavaScript](https://githubnewbie0.github.io/odf-kit/guides/docx-to-odt.html)
889
977
  - [ODT to PDF via Typst](https://githubnewbie0.github.io/odf-kit/guides/odt-to-typst-pdf.html)
890
978
  - [Generate ODT without LibreOffice](https://githubnewbie0.github.io/odf-kit/guides/generate-odt-without-libreoffice.html)
891
979
  - [ODF government compliance](https://githubnewbie0.github.io/odf-kit/guides/odf-government-compliance.html)
892
980
  - [simple-odf alternative](https://githubnewbie0.github.io/odf-kit/guides/simple-odf-alternative.html)
893
981
  - [docxtemplater alternative for ODF](https://githubnewbie0.github.io/odf-kit/guides/docxtemplater-odf-alternative.html)
894
982
  - [ODT JavaScript ecosystem](https://githubnewbie0.github.io/odf-kit/guides/odt-javascript-ecosystem.html)
983
+ - [Free DOCX to ODT converter (online tool)](https://githubnewbie0.github.io/odf-kit/tools/docx-to-odt.html)
895
984
  - [Free ODT to HTML converter (online tool)](https://githubnewbie0.github.io/odf-kit/tools/odt-to-html.html)
896
985
  - [Free ODT to PDF converter (online tool)](https://githubnewbie0.github.io/odf-kit/tools/odt-to-pdf.html)
986
+ - [Free XLSX to ODS converter (online tool)](https://githubnewbie0.github.io/odf-kit/tools/xlsx-to-ods.html)
987
+ - [Free Markdown to ODT converter (online tool)](https://githubnewbie0.github.io/odf-kit/tools/markdown-to-odt.html)
988
+ - [Free HTML to ODT converter (online tool)](https://githubnewbie0.github.io/odf-kit/tools/html-to-odt.html)
989
+ - [Free ODS to HTML converter (online tool)](https://githubnewbie0.github.io/odf-kit/tools/ods-to-html.html)
897
990
 
898
991
  ---
899
992
 
@@ -0,0 +1,54 @@
1
+ /**
2
+ * odf-kit — DOCX body reader
3
+ *
4
+ * Walks the w:body element from word/document.xml and converts it into the
5
+ * DocxBodyElement[] model. Also used to parse footnote/endnote/header/footer
6
+ * XML bodies, which share the same paragraph/table structure.
7
+ *
8
+ * Design decisions:
9
+ * - Only explicitly present XML properties are stored — no style inheritance
10
+ * resolution. The converter walks the basedOn chain at conversion time.
11
+ * - Mid-paragraph page breaks split the paragraph:
12
+ * [DocxParagraph (before), DocxPageBreak, DocxParagraph (after)]
13
+ * - Field state machine runs on every paragraph — handles both w:hyperlink
14
+ * elements and complex HYPERLINK fields (w:fldChar / w:instrText).
15
+ * - w:pict (legacy VML) images are fully handled via v:imagedata + v:shape.
16
+ * - w:sdt content is always processed; checkboxes get special rendering.
17
+ * - Tracked changes: w:ins / w:moveTo children are processed;
18
+ * w:del / w:moveFrom children are skipped.
19
+ * - Two-pass bookmark resolution: pass 1 collects all bookmark id→name
20
+ * mappings across the entire body; pass 2 emits bookmark elements using
21
+ * the pre-built map. This correctly handles cross-paragraph bookmarks.
22
+ * - Spec reference: ECMA-376 5th edition Part 1, §17 (WordprocessingML).
23
+ * CT_Body child elements validated against §17.2.2.
24
+ */
25
+ import type { DocxBodyElement, DocxNote, RelationshipMap, StyleMap, NumberingMap } from "./types.js";
26
+ export interface BodyReaderContext {
27
+ styles: StyleMap;
28
+ numbering: NumberingMap;
29
+ relationships: RelationshipMap;
30
+ /** id → name map built by collectBookmarkNames() before the main walk. */
31
+ bookmarkNames: Map<string, string>;
32
+ warnings: string[];
33
+ }
34
+ /**
35
+ * Parse a body XML string into a DocxBodyElement array.
36
+ *
37
+ * Used for: word/document.xml (rootTag="body"), word/header*.xml (rootTag="hdr"),
38
+ * word/footer*.xml (rootTag="ftr"). Footnote/endnote XML uses readNotes().
39
+ *
40
+ * @param xml - Raw XML string.
41
+ * @param rootTag - Local name of the container element, e.g. "body", "hdr", "ftr".
42
+ * @param ctx - Shared reader context.
43
+ */
44
+ export declare function readBody(xml: string, rootTag: string, ctx: BodyReaderContext): DocxBodyElement[];
45
+ /**
46
+ * Parse footnote/endnote XML into a Map<id, DocxNote>.
47
+ * Handles both word/footnotes.xml and word/endnotes.xml.
48
+ *
49
+ * @param xml - Raw XML string.
50
+ * @param noteTag - "footnote" | "endnote".
51
+ * @param ctx - Shared reader context.
52
+ */
53
+ export declare function readNotes(xml: string, noteTag: "footnote" | "endnote", ctx: BodyReaderContext): Map<string, DocxNote>;
54
+ //# sourceMappingURL=body-reader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"body-reader.d.ts","sourceRoot":"","sources":["../../src/docx/body-reader.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAMH,OAAO,KAAK,EACV,eAAe,EAcf,QAAQ,EAGR,eAAe,EACf,QAAQ,EACR,YAAY,EACb,MAAM,YAAY,CAAC;AAOpB,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,QAAQ,CAAC;IACjB,SAAS,EAAE,YAAY,CAAC;IACxB,aAAa,EAAE,eAAe,CAAC;IAC/B,0EAA0E;IAC1E,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACnC,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAMD;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,iBAAiB,GAAG,eAAe,EAAE,CAShG;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CACvB,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,UAAU,GAAG,SAAS,EAC/B,GAAG,EAAE,iBAAiB,GACrB,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CA0BvB"}