@mseep/dembrandt 0.19.5

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 (139) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +408 -0
  3. package/dist/index.d.ts +8 -0
  4. package/dist/index.js +532 -0
  5. package/dist/index.js.map +1 -0
  6. package/dist/lib/browser.d.ts +16 -0
  7. package/dist/lib/browser.js +27 -0
  8. package/dist/lib/browser.js.map +1 -0
  9. package/dist/lib/colors.d.ts +101 -0
  10. package/dist/lib/colors.js +405 -0
  11. package/dist/lib/colors.js.map +1 -0
  12. package/dist/lib/compare.d.ts +31 -0
  13. package/dist/lib/compare.js +46 -0
  14. package/dist/lib/compare.js.map +1 -0
  15. package/dist/lib/discovery.d.ts +31 -0
  16. package/dist/lib/discovery.js +243 -0
  17. package/dist/lib/discovery.js.map +1 -0
  18. package/dist/lib/drift.d.ts +64 -0
  19. package/dist/lib/drift.js +383 -0
  20. package/dist/lib/drift.js.map +1 -0
  21. package/dist/lib/dtcg/validate.d.ts +51 -0
  22. package/dist/lib/dtcg/validate.js +1403 -0
  23. package/dist/lib/dtcg/validate.js.map +1 -0
  24. package/dist/lib/exit-codes.d.ts +29 -0
  25. package/dist/lib/exit-codes.js +26 -0
  26. package/dist/lib/exit-codes.js.map +1 -0
  27. package/dist/lib/extractors/breakpoints.d.ts +5 -0
  28. package/dist/lib/extractors/breakpoints.js +450 -0
  29. package/dist/lib/extractors/breakpoints.js.map +1 -0
  30. package/dist/lib/extractors/colors.d.ts +2 -0
  31. package/dist/lib/extractors/colors.js +657 -0
  32. package/dist/lib/extractors/colors.js.map +1 -0
  33. package/dist/lib/extractors/components.d.ts +4 -0
  34. package/dist/lib/extractors/components.js +370 -0
  35. package/dist/lib/extractors/components.js.map +1 -0
  36. package/dist/lib/extractors/index.d.ts +9 -0
  37. package/dist/lib/extractors/index.js +1257 -0
  38. package/dist/lib/extractors/index.js.map +1 -0
  39. package/dist/lib/extractors/logo.d.ts +2 -0
  40. package/dist/lib/extractors/logo.js +626 -0
  41. package/dist/lib/extractors/logo.js.map +1 -0
  42. package/dist/lib/extractors/spacing.d.ts +4 -0
  43. package/dist/lib/extractors/spacing.js +163 -0
  44. package/dist/lib/extractors/spacing.js.map +1 -0
  45. package/dist/lib/extractors/teach.d.ts +1 -0
  46. package/dist/lib/extractors/teach.js +66 -0
  47. package/dist/lib/extractors/teach.js.map +1 -0
  48. package/dist/lib/extractors/typography.d.ts +1 -0
  49. package/dist/lib/extractors/typography.js +163 -0
  50. package/dist/lib/extractors/typography.js.map +1 -0
  51. package/dist/lib/findings.d.ts +34 -0
  52. package/dist/lib/findings.js +166 -0
  53. package/dist/lib/findings.js.map +1 -0
  54. package/dist/lib/formatters/dtcg.d.ts +10 -0
  55. package/dist/lib/formatters/dtcg.js +416 -0
  56. package/dist/lib/formatters/dtcg.js.map +1 -0
  57. package/dist/lib/formatters/html.d.ts +25 -0
  58. package/dist/lib/formatters/html.js +479 -0
  59. package/dist/lib/formatters/html.js.map +1 -0
  60. package/dist/lib/formatters/markdown.d.ts +5 -0
  61. package/dist/lib/formatters/markdown.js +568 -0
  62. package/dist/lib/formatters/markdown.js.map +1 -0
  63. package/dist/lib/formatters/pdf.d.ts +12 -0
  64. package/dist/lib/formatters/pdf.js +1121 -0
  65. package/dist/lib/formatters/pdf.js.map +1 -0
  66. package/dist/lib/formatters/terminal.d.ts +6 -0
  67. package/dist/lib/formatters/terminal.js +954 -0
  68. package/dist/lib/formatters/terminal.js.map +1 -0
  69. package/dist/lib/formatters/theme.d.ts +35 -0
  70. package/dist/lib/formatters/theme.js +37 -0
  71. package/dist/lib/formatters/theme.js.map +1 -0
  72. package/dist/lib/merger.d.ts +14 -0
  73. package/dist/lib/merger.js +362 -0
  74. package/dist/lib/merger.js.map +1 -0
  75. package/dist/lib/normalize.d.ts +29 -0
  76. package/dist/lib/normalize.js +59 -0
  77. package/dist/lib/normalize.js.map +1 -0
  78. package/dist/lib/robots.d.ts +12 -0
  79. package/dist/lib/robots.js +110 -0
  80. package/dist/lib/robots.js.map +1 -0
  81. package/dist/lib/run-summary.d.ts +40 -0
  82. package/dist/lib/run-summary.js +64 -0
  83. package/dist/lib/run-summary.js.map +1 -0
  84. package/dist/lib/types.d.ts +329 -0
  85. package/dist/lib/types.js +7 -0
  86. package/dist/lib/types.js.map +1 -0
  87. package/dist/lib/version.d.ts +134 -0
  88. package/dist/lib/version.js +153 -0
  89. package/dist/lib/version.js.map +1 -0
  90. package/dist/mcp-server.d.ts +11 -0
  91. package/dist/mcp-server.js +311 -0
  92. package/dist/mcp-server.js.map +1 -0
  93. package/dist/package.json +106 -0
  94. package/dist/test/_vitest-shim.d.ts +13 -0
  95. package/dist/test/_vitest-shim.js +23 -0
  96. package/dist/test/_vitest-shim.js.map +1 -0
  97. package/dist/test/cli.test.d.ts +1 -0
  98. package/dist/test/cli.test.js +24 -0
  99. package/dist/test/cli.test.js.map +1 -0
  100. package/dist/test/colors.test.d.ts +1 -0
  101. package/dist/test/colors.test.js +64 -0
  102. package/dist/test/colors.test.js.map +1 -0
  103. package/dist/test/compare.test.d.ts +1 -0
  104. package/dist/test/compare.test.js +57 -0
  105. package/dist/test/compare.test.js.map +1 -0
  106. package/dist/test/drift.test.d.ts +1 -0
  107. package/dist/test/drift.test.js +53 -0
  108. package/dist/test/drift.test.js.map +1 -0
  109. package/dist/test/dtcg-formatter.test.d.ts +1 -0
  110. package/dist/test/dtcg-formatter.test.js +48 -0
  111. package/dist/test/dtcg-formatter.test.js.map +1 -0
  112. package/dist/test/dtcg-validate.test.d.ts +1 -0
  113. package/dist/test/dtcg-validate.test.js +2129 -0
  114. package/dist/test/dtcg-validate.test.js.map +1 -0
  115. package/dist/test/exit-codes.test.d.ts +1 -0
  116. package/dist/test/exit-codes.test.js +53 -0
  117. package/dist/test/exit-codes.test.js.map +1 -0
  118. package/dist/test/findings.test.d.ts +1 -0
  119. package/dist/test/findings.test.js +77 -0
  120. package/dist/test/findings.test.js.map +1 -0
  121. package/dist/test/html.test.d.ts +1 -0
  122. package/dist/test/html.test.js +95 -0
  123. package/dist/test/html.test.js.map +1 -0
  124. package/dist/test/markdown.test.d.ts +1 -0
  125. package/dist/test/markdown.test.js +145 -0
  126. package/dist/test/markdown.test.js.map +1 -0
  127. package/dist/test/merger.test.d.ts +1 -0
  128. package/dist/test/merger.test.js +98 -0
  129. package/dist/test/merger.test.js.map +1 -0
  130. package/dist/test/normalize.test.d.ts +1 -0
  131. package/dist/test/normalize.test.js +47 -0
  132. package/dist/test/normalize.test.js.map +1 -0
  133. package/dist/test/run-summary.test.d.ts +1 -0
  134. package/dist/test/run-summary.test.js +45 -0
  135. package/dist/test/run-summary.test.js.map +1 -0
  136. package/dist/test/version.test.d.ts +1 -0
  137. package/dist/test/version.test.js +73 -0
  138. package/dist/test/version.test.js.map +1 -0
  139. package/package.json +106 -0
@@ -0,0 +1,479 @@
1
+ /**
2
+ * HTML report formatter — a single self-contained HTML file (inline CSS, no
3
+ * external fetches) that renders an extraction and, optionally, a drift diff.
4
+ *
5
+ * This is the pre-platform bridge (DEM-94): a CI artifact you can open offline
6
+ * and attach to a PR, before the hosted dashboard exists. It is a *view* over
7
+ * the same deterministic data the platform will later diff server-side — it
8
+ * renders structured tokens and single-render contrast only, never re-derives
9
+ * drift from rendered CSS. Mode B reuses the canonical `computeDrift` engine.
10
+ *
11
+ * The summary header is Lighthouse-style: big score gauges, each backed by a
12
+ * concrete finding (lib/findings.ts) so no number is a vanity metric. The file
13
+ * is the rendered view only — the machine-readable form is `--json-only`.
14
+ */
15
+ import { computeFindings } from "../findings.js";
16
+ /* ------------------------------- escaping ------------------------------- */
17
+ /** Escape text for HTML body / attribute context. */
18
+ function esc(s) {
19
+ return String(s ?? "")
20
+ .replace(/&/g, "&")
21
+ .replace(/</g, "&lt;")
22
+ .replace(/>/g, "&gt;")
23
+ .replace(/"/g, "&quot;")
24
+ .replace(/'/g, "&#39;");
25
+ }
26
+ /**
27
+ * Allow only safe CSS color/length-ish tokens into inline style values, so
28
+ * extracted site CSS cannot inject `}` / `<` / `url()` etc. into the report.
29
+ * Anything outside the allowlist is dropped.
30
+ */
31
+ function safeCss(value) {
32
+ const v = String(value ?? "").trim();
33
+ if (!v)
34
+ return "";
35
+ // hex, rgb/rgba, hsl/hsla, named-ish words, numbers+units, commas, %, spaces, parens, dots, slashes (for line-height font shorthand)
36
+ if (/^[#0-9a-zA-Z().,%\s/\-+]+$/.test(v) && !/[<>{};]/.test(v))
37
+ return v;
38
+ return "";
39
+ }
40
+ /* -------------------------------- styles -------------------------------- */
41
+ // Dembrandt design system (dark, Linear-inspired). This is the report's *chrome* —
42
+ // a Dembrandt report looks like Dembrandt. The extracted site's tokens are content
43
+ /*
44
+ * Dark by default (matching the App at /app), with a CSS-only light toggle — no
45
+ * JS, just `:root:has(#theme:checked)` flipping the token block. System fonts,
46
+ * no embedded JSON: stays small at scale. Typography is generic/system on
47
+ * purpose (no Red Hat Display / web fonts — keeps the file light); the fluid
48
+ * type scale, brand surfaces, #38BDF8 accent and tight Linear radii still mirror
49
+ * the App's design system (dembrandt-next/app/globals.css). color-scheme is
50
+ * pinned per theme so a browser's own dark mode can't repaint it. Type steps
51
+ * stay >=14px (the App's 2xs/xs at 11-13px are dropped for the no-sub-14px rule).
52
+ */
53
+ const STYLE = `
54
+ :root{color-scheme:dark;--bg:#000;--surface:#0D0D0D;--elevated:#1A1A1A;--line:#242424;--ink:#fff;--muted:#8A8F98;--tertiary:#5E6772;--accent:#38BDF8;--accent-hover:#7dd3fc;--good:#4ade80;--avg:#fbbf24;--bad:#ef4444;--swring:rgba(255,255,255,.12);--sans:system-ui,-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,sans-serif;--mono:ui-monospace,SFMono-Regular,Menlo,monospace;--t-sm:clamp(0.875rem,0.85rem + 0.15vw,0.938rem);--t-base:clamp(1rem,0.975rem + 0.125vw,1.063rem);--t-md:clamp(1.125rem,1.075rem + 0.25vw,1.25rem);--t-lg:clamp(1.25rem,1.175rem + 0.375vw,1.5rem);--t-xl:clamp(1.5rem,1.375rem + 0.625vw,1.875rem);--t-2xl:clamp(1.875rem,1.675rem + 1vw,2.5rem)}
55
+ :root:has(#theme:checked){color-scheme:light;--bg:#F5F5F7;--surface:#ffffff;--elevated:#ECECEF;--line:#D8D8DE;--ink:#111827;--muted:#5E6772;--tertiary:#8A8F98;--accent:#0C6AE0;--accent-hover:#0a55b5;--good:#0a8c4a;--avg:#b36b00;--bad:#c0392b;--swring:rgba(0,0,0,.12)}
56
+ *{box-sizing:border-box}
57
+ html{background:var(--bg)}
58
+ body{margin:0;background:var(--bg);color:var(--ink);font-family:var(--sans);font-size:var(--t-base);line-height:1.55;-webkit-font-smoothing:antialiased}
59
+ a{color:var(--accent);text-decoration:none}
60
+ a:hover{color:var(--accent-hover);text-decoration:underline;text-underline-offset:3px}
61
+ .mono{font-family:var(--mono)}
62
+ .muted{color:var(--muted)}
63
+ .sub{color:var(--muted);font-size:var(--t-sm)}
64
+ .row{display:flex;align-items:center;gap:16px;flex-wrap:wrap}
65
+ .kvs{display:flex;flex-wrap:wrap;gap:8px 22px;font-size:var(--t-sm)}
66
+ .kvs span{white-space:nowrap}
67
+ .topbar{position:sticky;top:0;z-index:10;background:var(--bg);border-bottom:1px solid var(--line);padding:8px 24px;display:flex;align-items:center;gap:12px}
68
+ .topbar .bm{display:inline-flex;align-items:center;color:var(--ink);flex:none}
69
+ .topbar .bm svg{height:16px;width:auto;display:block}
70
+ .tt{position:absolute;width:0;height:0;opacity:0;pointer-events:none}
71
+ .ttl{cursor:pointer;font-size:var(--t-sm);color:var(--muted);user-select:none}
72
+ .ttl:hover{color:var(--ink)}
73
+ .ttl::after{content:"Light"}
74
+ :root:has(#theme:checked) .ttl::after{content:"Dark"}
75
+ .counts{text-align:center;color:var(--muted);font-size:var(--t-sm);margin:0;padding:14px 24px 0}
76
+ .topbar .u{flex:1;min-width:0;color:var(--muted);font-family:var(--mono);font-size:var(--t-sm);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
77
+ .topbar .meta{margin-left:auto;color:var(--muted);font-size:var(--t-sm);white-space:nowrap}
78
+ .wrap{max-width:960px;margin:0 auto;padding:8px 24px 80px}
79
+ .gauges{display:flex;flex-wrap:wrap;gap:34px;justify-content:center;padding:18px 0 28px;border-bottom:1px solid var(--line)}
80
+ .gauge{display:flex;flex-direction:column;align-items:center;gap:9px;text-decoration:none;color:inherit}
81
+ a.gauge:hover .glabel{text-decoration:underline}
82
+ .fgroup{margin-bottom:16px}
83
+ .fgroup:last-child{margin-bottom:0}
84
+ .fgrouph{font-size:var(--t-sm);font-weight:600;text-transform:uppercase;letter-spacing:.04em;color:var(--muted);padding-bottom:8px;border-bottom:1px solid var(--line);margin-bottom:10px}
85
+ .findings{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:8px}
86
+ .findings li{display:grid;grid-template-columns:56px 1fr;gap:12px;align-items:baseline;font-size:var(--t-sm)}
87
+ .conf{font-size:var(--t-sm);font-weight:600}
88
+ .c-high{color:var(--good)}.c-med{color:var(--avg)}.c-low{color:var(--muted)}
89
+ .sev{font-size:var(--t-sm);font-weight:700;text-transform:uppercase;letter-spacing:.03em}
90
+ .s-err{color:var(--bad)}.s-warn{color:var(--avg)}
91
+ .gring{width:84px;height:84px}
92
+ .gring .gbg{fill:none;stroke:var(--line);stroke-width:8}
93
+ .gring .gfg{fill:none;stroke-width:8;stroke-linecap:round}
94
+ .gring.g-pass .gfg{stroke:var(--good)}.gring.g-pass .gnum{fill:var(--good)}
95
+ .gring.g-avg .gfg{stroke:var(--avg)}.gring.g-avg .gnum{fill:var(--avg)}
96
+ .gring.g-fail .gfg{stroke:var(--bad)}.gring.g-fail .gnum{fill:var(--bad)}
97
+ .gnum{font-weight:700;font-size:var(--t-2xl)}
98
+ .glabel{font-size:var(--t-sm);color:var(--ink);font-weight:600}
99
+ .gsub{font-size:var(--t-sm);color:var(--muted)}
100
+ details.card{border:1px solid var(--line);border-radius:8px;padding:16px 20px;margin:14px 0}
101
+ details.card>summary{cursor:pointer;list-style:none;display:flex;align-items:center;gap:10px;font-size:var(--t-sm);font-weight:600;text-transform:uppercase;letter-spacing:.05em;color:var(--muted)}
102
+ details.card>summary::-webkit-details-marker{display:none}
103
+ details.card>summary::after{content:"";margin-left:auto;width:8px;height:8px;border-right:2px solid var(--muted);border-bottom:2px solid var(--muted);transform:rotate(45deg);transition:transform .15s}
104
+ details.card[open]>summary::after{transform:rotate(-135deg)}
105
+ details.card>summary:hover::after{border-color:var(--accent)}
106
+ .cardbody{margin-top:16px}
107
+ .cardrow{display:flex;gap:14px;flex-wrap:wrap;margin:14px 0}
108
+ .cardrow>details.card{flex:1 1 280px;margin:0}
109
+ .colors{display:flex;flex-wrap:wrap;gap:14px}
110
+ .color{display:flex;flex-direction:column;gap:5px;align-items:center;text-align:center}
111
+ .color .sw2{width:36px;height:36px;border-radius:6px;box-shadow:inset 0 0 0 1px var(--swring)}
112
+ .color .hex{font-family:var(--mono);font-size:var(--t-sm);color:var(--ink)}
113
+ .color .cmeta{font-size:var(--t-sm);color:var(--muted);display:flex;align-items:center;gap:6px;white-space:nowrap}
114
+ .color .role{color:var(--accent);font-size:var(--t-sm);text-transform:uppercase;letter-spacing:.03em}
115
+ .chips{display:flex;flex-wrap:wrap;gap:8px}
116
+ .tok{background:var(--surface);border:1px solid var(--line);border-radius:6px;padding:6px 12px;font-family:var(--mono);font-size:var(--t-sm);color:var(--ink)}
117
+ table{width:100%;border-collapse:collapse;font-size:var(--t-sm)}
118
+ th,td{text-align:left;padding:8px 12px;vertical-align:top}
119
+ thead th{border-bottom:1px solid var(--line);color:var(--muted);font-weight:600;font-size:var(--t-sm);text-transform:uppercase;letter-spacing:.04em}
120
+ .badge{display:inline-block;padding:2px 10px;border-radius:999px;font-size:var(--t-sm);font-weight:600}
121
+ .b-good{background:rgba(10,140,74,.14);color:var(--good)}
122
+ .b-warn{background:rgba(179,107,0,.16);color:var(--avg)}
123
+ .b-bad{background:rgba(192,57,43,.14);color:var(--bad)}
124
+ .b-mut{background:var(--surface);color:var(--muted)}
125
+ .badgepv{display:inline-block;padding:3px 12px;border:1px solid var(--line);border-radius:999px;font-size:var(--t-sm)}
126
+ .drift{border:1px solid var(--line);border-radius:8px;padding:20px 22px;margin:14px 0}
127
+ .drift.is-drift{border-color:var(--bad)}
128
+ .drift.is-stable{border-color:var(--good)}
129
+ .score{font-size:var(--t-2xl);font-weight:700;line-height:1;letter-spacing:-.02em}
130
+ .previewbtn{cursor:pointer}
131
+ .shadowbox{width:84px;height:52px;border-radius:8px;background:#fff;display:inline-block;border:1px solid var(--line)}
132
+ .shadowpanel{background:#f0f0f0;border-radius:8px;padding:18px;display:flex;flex-wrap:wrap;gap:18px;align-items:center}
133
+ .shadowpanel .sb{width:56px;height:56px;border-radius:8px;background:#fff}
134
+ footer{margin-top:48px;color:var(--muted);font-size:var(--t-sm);text-align:center}
135
+ `;
136
+ // Dembrandt brand mark (from dembrandt-next/components/AppMarkIcon.tsx). Inlined,
137
+ // fill=currentColor so it inherits the topbar accent. Self-contained — no asset fetch.
138
+ const LOGO = `<svg viewBox="0 0 316.6 310.01" fill="currentColor" aria-hidden="true"><path d="M81.48,20.83h-34.92C20.85,20.83,0,41.68,0,67.39v175.22c0,25.72,20.85,46.56,46.56,46.56h34.92c2.3,0,4.17-1.87,4.17-4.17V25c0-2.3-1.87-4.17-4.17-4.17Z"/><path d="M268.66,0H110.47c-2.3,0-4.17,1.87-4.17,4.17v301.67c0,2.3,1.87,4.17,4.17,4.17h158.18c26.48,0,47.95-21.47,47.95-47.95V47.95c0-26.48-21.47-47.95-47.95-47.95Z"/></svg>`;
139
+ /* ------------------------------ components ------------------------------ */
140
+ function confBadge(c) {
141
+ const cls = c === "high" ? "c-high" : c === "medium" ? "c-med" : "c-low";
142
+ return `<span class="conf ${cls}">${esc(c ?? "low")}</span>`;
143
+ }
144
+ // Collapsible section card (Lighthouse-style, native <details> — no JS, stays
145
+ // self-contained). Open by default; the user can collapse any section.
146
+ function section(title, body, id) {
147
+ if (!body.trim())
148
+ return "";
149
+ return `<details class="card"${id ? ` id="${esc(id)}"` : ""} open><summary>${esc(title)}</summary><div class="cardbody">${body}</div></details>`;
150
+ }
151
+ /** Lay two (or more) small cards side by side — related scales read together. */
152
+ function cardRow(...cards) {
153
+ const present = cards.filter((c) => c.trim());
154
+ if (present.length < 2)
155
+ return present.join("");
156
+ return `<div class="cardrow">${present.join("")}</div>`;
157
+ }
158
+ /** A Lighthouse-style circular score gauge (0-100), coloured by threshold. */
159
+ function gauge(value, label, sub, invert = false, href) {
160
+ const v = Math.max(0, Math.min(100, Math.round(value)));
161
+ const cls = (invert ? v <= 10 : v >= 90) ? "g-pass" : (invert ? v <= 40 : v >= 50) ? "g-avg" : "g-fail";
162
+ const C = 339.292; // 2πr, r=54
163
+ const arc = ((C * v) / 100).toFixed(1);
164
+ const inner = `<svg viewBox="0 0 120 120" class="gring ${cls}" role="img" aria-label="${esc(label)} ${v} of 100"><circle class="gbg" cx="60" cy="60" r="54"/><circle class="gfg" cx="60" cy="60" r="54" stroke-dasharray="${arc} ${C}" transform="rotate(-90 60 60)"/><text class="gnum" x="60" y="60" text-anchor="middle" dominant-baseline="central">${v}</text></svg><span class="glabel">${esc(label)}</span>${sub ? `<span class="gsub">${esc(sub)}</span>` : ""}`;
165
+ return href
166
+ ? `<a class="gauge" href="${esc(href)}">${inner}</a>`
167
+ : `<div class="gauge">${inner}</div>`;
168
+ }
169
+ /** A Lighthouse-style fraction tile (e.g. token coverage 6/6). */
170
+ /**
171
+ * The top "ranking" row — Dembrandt's axes, not Lighthouse's. Drift (did it
172
+ * change vs a baseline) and Contrast (WCAG AA) appear only when that data
173
+ * exists; Consistency is always computable. Every gauge links to the card that
174
+ * explains it, so no number is a mystery.
175
+ */
176
+ function summaryGauges(result, fr, drift) {
177
+ const g = [];
178
+ if (drift) {
179
+ g.push(gauge(drift.score, "Drift", drift.status === "drift" ? "vs baseline" : "stable", true, "#drift"));
180
+ }
181
+ const cIssues = fr.findings.filter((f) => f.category !== "contrast").length;
182
+ g.push(gauge(fr.consistency, "Consistency", cIssues ? `${cIssues} issue${cIssues === 1 ? "" : "s"}` : "clean", false, "#findings"));
183
+ // Contrast is always present: real WCAG pairs when --wcag ran, else the
184
+ // self-computed contrast findings.
185
+ const wcag = result.wcag ?? [];
186
+ if (wcag.length) {
187
+ const passed = wcag.filter((p) => p.aa).length;
188
+ g.push(gauge((100 * passed) / wcag.length, "Contrast", `${passed}/${wcag.length} pairs AA`, false, "#wcag"));
189
+ }
190
+ else {
191
+ const xIssues = fr.findings.filter((f) => f.category === "contrast").length;
192
+ g.push(gauge(fr.contrast, "Contrast", xIssues ? `${xIssues} issue${xIssues === 1 ? "" : "s"}` : "clean", false, "#findings"));
193
+ }
194
+ return `<div class="gauges">${g.join("")}</div>`;
195
+ }
196
+ /** An at-a-glance executive line of token counts — honest, no score. */
197
+ function summaryCounts(result) {
198
+ const n = (a) => (Array.isArray(a) ? a.length : 0);
199
+ const plural = (c, one, many = one + "s") => `${c} ${c === 1 ? one : many}`;
200
+ const parts = [];
201
+ const colors = n(result.colors?.palette);
202
+ if (colors)
203
+ parts.push(plural(colors, "color"));
204
+ const styles = n(result.typography?.styles);
205
+ if (styles)
206
+ parts.push(plural(styles, "text style"));
207
+ const spacing = n(result.spacing?.commonValues);
208
+ if (spacing)
209
+ parts.push(`${spacing} spacing`);
210
+ const radii = n(result.borderRadius?.values);
211
+ if (radii)
212
+ parts.push(plural(radii, "radius", "radii"));
213
+ const shadows = n(result.shadows);
214
+ if (shadows)
215
+ parts.push(plural(shadows, "shadow"));
216
+ const bps = n(result.breakpoints);
217
+ if (bps)
218
+ parts.push(plural(bps, "breakpoint"));
219
+ return parts.length ? `<p class="counts">${esc(parts.join(" · "))}</p>` : "";
220
+ }
221
+ /** Actionable findings — the audits behind the scores, Lighthouse-style. */
222
+ function findingsSection(fr) {
223
+ if (!fr.findings.length)
224
+ return "";
225
+ const sev = (s) => s === "error" ? `<span class="sev s-err">error</span>` : `<span class="sev s-warn">warn</span>`;
226
+ // Group by display group (Gestalt proximity) so the list reads as Color /
227
+ // Typography / Spacing / Contrast rather than a flat mixed stream.
228
+ const groups = new Map();
229
+ for (const f of fr.findings) {
230
+ const arr = groups.get(f.group) ?? [];
231
+ arr.push(f);
232
+ groups.set(f.group, arr);
233
+ }
234
+ const blocks = [...groups.entries()]
235
+ .map(([group, items]) => {
236
+ const rows = items
237
+ .map((f) => `<li>${sev(f.severity)}<span>${esc(f.message)}</span></li>`)
238
+ .join("");
239
+ return `<div class="fgroup"><div class="fgrouph">${esc(group)} <span class="muted">${items.length}</span></div><ul class="findings">${rows}</ul></div>`;
240
+ })
241
+ .join("");
242
+ return `<details class="card" id="findings" open><summary>Findings (${fr.findings.length})</summary><div class="cardbody">${blocks}</div></details>`;
243
+ }
244
+ function paletteSection(result) {
245
+ const palette = result.colors?.palette ?? [];
246
+ if (!palette.length)
247
+ return "";
248
+ // role lookup: hex -> role from semantic map
249
+ const roleByHex = new Map();
250
+ for (const [role, hex] of Object.entries(result.colors?.semantic ?? {})) {
251
+ if (hex)
252
+ roleByHex.set(String(hex).toLowerCase(), role);
253
+ }
254
+ const cards = palette
255
+ .map((c) => {
256
+ const hex = c.normalized || c.color;
257
+ const role = roleByHex.get(String(hex).toLowerCase());
258
+ return `<div class="color"><div class="sw2" style="background:${safeCss(hex) || "transparent"}"></div><div class="hex">${esc(hex)}</div>${role ? `<div class="role">${esc(role)}</div>` : `<div class="cmeta">${confBadge(c.confidence)}</div>`}</div>`;
259
+ })
260
+ .join("");
261
+ return section("Palette", `<div class="colors">${cards}</div>`);
262
+ }
263
+ function semanticSection(result) {
264
+ const sem = Object.entries(result.colors?.semantic ?? {}).filter(([, v]) => v);
265
+ if (!sem.length)
266
+ return "";
267
+ const chips = sem
268
+ .map(([role, hex]) => `<div class="color"><div class="sw2" style="background:${safeCss(hex) || "transparent"}"></div><div class="role">${esc(role)}</div><div class="hex">${esc(hex)}</div></div>`)
269
+ .join("");
270
+ return section("Semantic colors", `<div class="colors">${chips}</div>`);
271
+ }
272
+ function typographySection(result) {
273
+ const styles = result.typography?.styles ?? [];
274
+ if (!styles.length)
275
+ return "";
276
+ const rows = styles
277
+ .map((s) => `<tr><td>${esc(s.context)}</td><td>${esc((s.family ?? "").split(",")[0])}</td><td class="mono">${esc(s.size)}</td><td class="mono">${esc(s.weight)}</td><td class="mono">${esc(s.lineHeight ?? "")}</td></tr>`)
278
+ .join("");
279
+ const srcs = result.typography?.sources ?? {};
280
+ const fams = [
281
+ ...(srcs.googleFonts ?? []),
282
+ ...(Array.isArray(srcs.adobeFonts) ? srcs.adobeFonts : []),
283
+ ...(srcs.customFonts ?? []),
284
+ ...(srcs.selfHostedFonts ?? []),
285
+ ];
286
+ const srcLine = fams.length ? `<p class="sub">Sources: ${esc(fams.join(", "))}</p>` : "";
287
+ return section("Typography", `<table><thead><tr><th>Context</th><th>Family</th><th>Size</th><th>Weight</th><th>Line height</th></tr></thead><tbody>${rows}</tbody></table>${srcLine}`);
288
+ }
289
+ /** Numeric px of a token value, for ordering a scale low → high. */
290
+ function tokenPx(v) {
291
+ if (typeof v.numericValue === "number")
292
+ return v.numericValue;
293
+ if (typeof v.px === "number")
294
+ return v.px;
295
+ const m = String(v.display ?? v.value ?? v.px ?? "").match(/-?\d+(?:\.\d+)?/);
296
+ return m ? parseFloat(m[0]) : Number.POSITIVE_INFINITY;
297
+ }
298
+ /** Sort token values ascending so a scale reads in order. */
299
+ function sortByPx(values) {
300
+ return [...values].sort((a, b) => tokenPx(a) - tokenPx(b));
301
+ }
302
+ function tokenChips(values) {
303
+ return values
304
+ .map((v) => {
305
+ // px may already be a string like "2px" (pre-1.1.0 extractions); don't
306
+ // re-append the unit.
307
+ const label = v.display ?? v.value ?? (typeof v.px === "string" ? v.px : v.px != null ? `${v.px}px` : "");
308
+ if (!label)
309
+ return "";
310
+ return `<span class="tok">${esc(label)}${v.count != null ? ` <span class="muted">${esc(v.count)}×</span>` : ""}</span>`;
311
+ })
312
+ .join("");
313
+ }
314
+ function spacingSection(result) {
315
+ const vals = result.spacing?.commonValues ?? [];
316
+ if (!vals.length)
317
+ return "";
318
+ const scale = result.spacing?.scaleType ? `<p class="sub">Scale: ${esc(result.spacing.scaleType)}</p>` : "";
319
+ return section("Spacing", `<div class="chips">${tokenChips(sortByPx(vals))}</div>${scale}`);
320
+ }
321
+ function radiusSection(result) {
322
+ const vals = result.borderRadius?.values ?? [];
323
+ if (!vals.length)
324
+ return "";
325
+ return section("Border radius", `<div class="chips">${tokenChips(sortByPx(vals))}</div>`);
326
+ }
327
+ function shadowsSection(result) {
328
+ const shadows = result.shadows ?? [];
329
+ if (!shadows.length)
330
+ return "";
331
+ const boxes = shadows.map((s) => `<span class="sb" style="box-shadow:${safeCss(s.shadow)}"></span>`).join("");
332
+ const list = shadows.map((s) => `<div class="mono sub">${esc(s.shadow)}</div>`).join("");
333
+ return section("Shadows", `<div class="shadowpanel">${boxes}</div><div style="margin-top:12px;display:grid;gap:4px">${list}</div>`);
334
+ }
335
+ function buttonsSection(result) {
336
+ const buttons = result.components?.buttons ?? [];
337
+ if (!buttons.length)
338
+ return "";
339
+ const previews = buttons
340
+ .slice(0, 12)
341
+ .map((b) => {
342
+ const st = b.states?.default ?? {};
343
+ const style = [
344
+ st.backgroundColor ? `background:${safeCss(st.backgroundColor)}` : "",
345
+ st.color ? `color:${safeCss(st.color)}` : "",
346
+ st.borderRadius ? `border-radius:${safeCss(st.borderRadius)}` : "",
347
+ st.padding ? `padding:${safeCss(st.padding)}` : "padding:8px 14px",
348
+ st.border ? `border:${safeCss(st.border)}` : "",
349
+ b.fontWeight ? `font-weight:${safeCss(b.fontWeight)}` : "",
350
+ b.fontSize ? `font-size:${safeCss(b.fontSize)}` : "",
351
+ ]
352
+ .filter(Boolean)
353
+ .join(";");
354
+ return `<button class="previewbtn" style="${esc(style)}">${esc(b.text || "Button")}</button>`;
355
+ })
356
+ .join(" ");
357
+ return section("Buttons", `<div class="row">${previews}</div>`);
358
+ }
359
+ function badgesSection(result) {
360
+ const raw = result.components?.badges;
361
+ const list = Array.isArray(raw) ? raw : raw?.all ?? [];
362
+ if (!list.length)
363
+ return "";
364
+ const chips = list
365
+ .slice(0, 16)
366
+ .map((bd) => {
367
+ const style = [
368
+ bd.backgroundColor ? `background:${safeCss(bd.backgroundColor)}` : "",
369
+ bd.color ? `color:${safeCss(bd.color)}` : "",
370
+ bd.borderRadius ? `border-radius:${safeCss(bd.borderRadius)}` : "",
371
+ ]
372
+ .filter(Boolean)
373
+ .join(";");
374
+ return `<span class="badgepv" style="${esc(style)}">${esc(bd.styleType || "badge")}</span>`;
375
+ })
376
+ .join(" ");
377
+ return section("Badges", `<div class="row">${chips}</div>`);
378
+ }
379
+ function wcagSection(result) {
380
+ const pairs = result.wcag ?? [];
381
+ if (!pairs.length)
382
+ return "";
383
+ const rows = pairs
384
+ .slice(0, 60)
385
+ .map((p) => {
386
+ const verdict = p.aa ? `<span class="badge b-good">AA</span>` : p.aaLarge ? `<span class="badge b-warn">AA Large</span>` : `<span class="badge b-bad">Fail</span>`;
387
+ return `<tr><td><span class="shadowbox" style="width:22px;height:22px;border-radius:4px;background:${safeCss(p.bg)};border:1px solid var(--line)"></span></td><td class="mono">${esc(p.fg)}</td><td class="mono">${esc(p.bg)}</td><td class="mono">${esc(p.ratio?.toFixed ? p.ratio.toFixed(2) : p.ratio)}</td><td>${verdict}</td></tr>`;
388
+ })
389
+ .join("");
390
+ return section("WCAG contrast", `<table><thead><tr><th>bg</th><th>Foreground</th><th>Background</th><th>Ratio</th><th>AA</th></tr></thead><tbody>${rows}</tbody></table>`, "wcag");
391
+ }
392
+ function metaSection(result) {
393
+ const fw = (result.frameworks ?? []).map((f) => f.name);
394
+ const icons = (result.iconSystem ?? []).map((i) => i.name);
395
+ const bps = (result.breakpoints ?? []).map((b) => {
396
+ // b.px may be a bare number (360) or already a CSS length ("360px", "20rem").
397
+ // Only append the unit when it is a bare number, else we get "360pxpx".
398
+ const s = String(b.px).trim();
399
+ return /^\d+(\.\d+)?$/.test(s) ? `${s}px` : s;
400
+ });
401
+ const items = [];
402
+ if (fw.length)
403
+ items.push(`<span><span class="muted">Frameworks:</span> ${esc(fw.join(", "))}</span>`);
404
+ if (icons.length)
405
+ items.push(`<span><span class="muted">Icons:</span> ${esc(icons.join(", "))}</span>`);
406
+ if (bps.length)
407
+ items.push(`<span><span class="muted">Breakpoints:</span> ${esc(bps.join(", "))}</span>`);
408
+ if (!items.length)
409
+ return "";
410
+ return section("Detected", `<div class="kvs">${items.join("")}</div>`);
411
+ }
412
+ /* -------------------------------- drift --------------------------------- */
413
+ function driftSection(drift, baselineLabel) {
414
+ const cls = drift.status === "drift" ? "is-drift" : "is-stable";
415
+ const verdict = drift.status === "drift"
416
+ ? `<span class="badge b-bad">DRIFT</span>`
417
+ : `<span class="badge b-good">STABLE</span>`;
418
+ const cats = drift.categories
419
+ .filter((c) => c.changed + c.added + c.removed > 0)
420
+ .map((c) => `<tr><td>${esc(c.category)}</td><td>${esc(Math.round(c.score * 100))}</td><td>${esc(c.changed)}</td><td>${esc(c.added)}</td><td>${esc(c.removed)}</td></tr>`)
421
+ .join("");
422
+ const changes = drift.changes
423
+ .slice(0, 120)
424
+ .map((ch) => {
425
+ const kindCls = ch.kind === "added" ? "b-good" : ch.kind === "removed" ? "b-bad" : "b-warn";
426
+ const detail = ch.before && ch.after ? `${esc(ch.before)} → ${esc(ch.after)}` : esc(ch.before ?? ch.after ?? "");
427
+ return `<tr><td>${esc(ch.category)}</td><td><span class="badge ${kindCls}">${esc(ch.kind)}</span></td><td class="mono">${esc(ch.label)}</td><td class="mono">${detail}</td><td class="mono">${ch.delta != null ? esc(ch.delta) : ""}</td></tr>`;
428
+ })
429
+ .join("");
430
+ const more = drift.changes.length > 120 ? `<p class="sub">… ${drift.changes.length - 120} more changes</p>` : "";
431
+ return `<div class="drift ${cls}" id="drift"><div class="row"><div class="score">${esc(drift.score)}</div><div><div>${verdict} <span class="sub">threshold ${esc(drift.threshold)}</span></div><div class="sub">${esc(drift.summary.changed)} changed · ${esc(drift.summary.added)} added · ${esc(drift.summary.removed)} removed${baselineLabel ? ` · vs ${esc(baselineLabel)}` : ""}</div></div></div>${cats ? `<table style="margin-top:14px"><thead><tr><th>Category</th><th>Score</th><th>Δ</th><th>+</th><th>−</th></tr></thead><tbody>${cats}</tbody></table>` : ""}${changes ? `<table style="margin-top:10px"><thead><tr><th>Category</th><th>Kind</th><th>Token</th><th>Change</th><th>Δ</th></tr></thead><tbody>${changes}</tbody></table>${more}` : ""}</div>`;
432
+ }
433
+ /* -------------------------------- entry --------------------------------- */
434
+ export function generateHtmlReport(result, options = {}) {
435
+ let domain = result.url;
436
+ try {
437
+ domain = new URL(result.url).hostname.replace(/^www\./, "");
438
+ }
439
+ catch {
440
+ /* leave as-is */
441
+ }
442
+ const version = options.version ?? result.meta?.dembrandtVersion ?? "";
443
+ const fr = computeFindings(result);
444
+ const body = [
445
+ options.drift ? driftSection(options.drift, options.baselineLabel) : "",
446
+ findingsSection(fr),
447
+ paletteSection(result),
448
+ semanticSection(result),
449
+ typographySection(result),
450
+ cardRow(spacingSection(result), radiusSection(result)),
451
+ shadowsSection(result),
452
+ buttonsSection(result),
453
+ badgesSection(result),
454
+ wcagSection(result),
455
+ metaSection(result),
456
+ ].join("\n");
457
+ const gauges = summaryGauges(result, fr, options.drift);
458
+ return `<!doctype html>
459
+ <html lang="en">
460
+ <head>
461
+ <meta charset="utf-8">
462
+ <meta name="viewport" content="width=device-width,initial-scale=1">
463
+ <meta name="generator" content="dembrandt${version ? " " + esc(version) : ""}">
464
+ <title>Dembrandt report — ${esc(domain)}</title>
465
+ <style>${STYLE}</style>
466
+ </head>
467
+ <body>
468
+ <input type="checkbox" id="theme" class="tt">
469
+ <div class="topbar"><span class="bm">${LOGO}</span><span class="u">${esc(result.url)}</span><span class="meta">${esc(result.extractedAt)}${version ? " · v" + esc(version) : ""}</span><label for="theme" class="ttl" title="Toggle light / dark"></label></div>
470
+ <div class="wrap">
471
+ ${gauges}
472
+ ${summaryCounts(result)}
473
+ ${body}
474
+ <footer>Generated by <a href="https://github.com/dembrandt/dembrandt">Dembrandt</a>${version ? " " + esc(version) : ""} · <a href="https://github.com/dembrandt/dembrandt/issues">File an issue</a></footer>
475
+ </div>
476
+ </body>
477
+ </html>`;
478
+ }
479
+ //# sourceMappingURL=html.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"html.js","sourceRoot":"","sources":["../../../lib/formatters/html.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAYH,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAYjD,8EAA8E;AAE9E,qDAAqD;AACrD,SAAS,GAAG,CAAC,CAAU;IACrB,OAAO,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;SACnB,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AAC5B,CAAC;AAED;;;;GAIG;AACH,SAAS,OAAO,CAAC,KAAc;IAC7B,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,IAAI,CAAC,CAAC;QAAE,OAAO,EAAE,CAAC;IAClB,qIAAqI;IACrI,IAAI,4BAA4B,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC;QAAE,OAAO,CAAC,CAAC;IACzE,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,8EAA8E;AAE9E,mFAAmF;AACnF,mFAAmF;AACnF;;;;;;;;;GASG;AACH,MAAM,KAAK,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkFb,CAAC;AAEF,kFAAkF;AAClF,uFAAuF;AACvF,MAAM,IAAI,GAAG,qZAAqZ,CAAC;AAEna,8EAA8E;AAE9E,SAAS,SAAS,CAAC,CAAU;IAC3B,MAAM,GAAG,GAAG,CAAC,KAAK,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC;IACzE,OAAO,qBAAqB,GAAG,KAAK,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC;AAC/D,CAAC;AAED,8EAA8E;AAC9E,uEAAuE;AACvE,SAAS,OAAO,CAAC,KAAa,EAAE,IAAY,EAAE,EAAW;IACvD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC;IAC5B,OAAO,wBAAwB,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,kBAAkB,GAAG,CAAC,KAAK,CAAC,mCAAmC,IAAI,kBAAkB,CAAC;AACnJ,CAAC;AAED,iFAAiF;AACjF,SAAS,OAAO,CAAC,GAAG,KAAe;IACjC,MAAM,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9C,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChD,OAAO,wBAAwB,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC;AAC1D,CAAC;AAED,8EAA8E;AAC9E,SAAS,KAAK,CAAC,KAAa,EAAE,KAAa,EAAE,GAAY,EAAE,MAAM,GAAG,KAAK,EAAE,IAAa;IACtF,MAAM,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACxD,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;IACxG,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,YAAY;IAC/B,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,2CAA2C,GAAG,4BAA4B,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,qHAAqH,GAAG,IAAI,CAAC,sHAAsH,CAAC,qCAAqC,GAAG,CAAC,KAAK,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,sBAAsB,GAAG,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;IACzc,OAAO,IAAI;QACT,CAAC,CAAC,0BAA0B,GAAG,CAAC,IAAI,CAAC,KAAK,KAAK,MAAM;QACrD,CAAC,CAAC,sBAAsB,KAAK,QAAQ,CAAC;AAC1C,CAAC;AAED,kEAAkE;AAClE;;;;;GAKG;AACH,SAAS,aAAa,CAAC,MAAsB,EAAE,EAAkB,EAAE,KAAmB;IACpF,MAAM,CAAC,GAAa,EAAE,CAAC;IACvB,IAAI,KAAK,EAAE,CAAC;QACV,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;IAC3G,CAAC;IACD,MAAM,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,MAAM,CAAC;IAC5E,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,aAAa,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,SAAS,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;IACpI,wEAAwE;IACxE,mCAAmC;IACnC,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;IAC/B,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC;QAC/C,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,IAAI,IAAI,CAAC,MAAM,WAAW,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/G,CAAC;SAAM,CAAC;QACN,MAAM,OAAO,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,UAAU,CAAC,CAAC,MAAM,CAAC;QAC5E,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,QAAQ,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,SAAS,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC;IAChI,CAAC;IACD,OAAO,uBAAuB,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC;AACnD,CAAC;AAED,wEAAwE;AACxE,SAAS,aAAa,CAAC,MAAsB;IAC3C,MAAM,CAAC,GAAG,CAAC,CAAU,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,CAAC,CAAS,EAAE,GAAW,EAAE,IAAI,GAAG,GAAG,GAAG,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC5F,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACzC,IAAI,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,CAAC,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;IAC5C,IAAI,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC;IACrD,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IAChD,IAAI,OAAO;QAAE,KAAK,CAAC,IAAI,CAAC,GAAG,OAAO,UAAU,CAAC,CAAC;IAC9C,MAAM,KAAK,GAAG,CAAC,CAAC,MAAM,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IAC7C,IAAI,KAAK;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;IACxD,MAAM,OAAO,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAClC,IAAI,OAAO;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;IACnD,MAAM,GAAG,GAAG,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IAClC,IAAI,GAAG;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC,CAAC;IAC/C,OAAO,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,qBAAqB,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;AAC/E,CAAC;AAED,4EAA4E;AAC5E,SAAS,eAAe,CAAC,EAAkB;IACzC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IACnC,MAAM,GAAG,GAAG,CAAC,CAAsB,EAAE,EAAE,CACrC,CAAC,KAAK,OAAO,CAAC,CAAC,CAAC,sCAAsC,CAAC,CAAC,CAAC,sCAAsC,CAAC;IAClG,0EAA0E;IAC1E,mEAAmE;IACnE,MAAM,MAAM,GAAG,IAAI,GAAG,EAAqB,CAAC;IAC5C,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACtC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACZ,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC3B,CAAC;IACD,MAAM,MAAM,GAAG,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;SACjC,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE;QACtB,MAAM,IAAI,GAAG,KAAK;aACf,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,CAAC;aACvE,IAAI,CAAC,EAAE,CAAC,CAAC;QACZ,OAAO,4CAA4C,GAAG,CAAC,KAAK,CAAC,wBAAwB,KAAK,CAAC,MAAM,qCAAqC,IAAI,aAAa,CAAC;IAC1J,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,OAAO,+DAA+D,EAAE,CAAC,QAAQ,CAAC,MAAM,oCAAoC,MAAM,kBAAkB,CAAC;AACvJ,CAAC;AAED,SAAS,cAAc,CAAC,MAAsB;IAC5C,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC;IAC7C,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAC/B,6CAA6C;IAC7C,MAAM,SAAS,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC5C,KAAK,MAAM,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,IAAI,EAAE,CAAC,EAAE,CAAC;QACxE,IAAI,GAAG;YAAE,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,CAAC;IAC1D,CAAC;IACD,MAAM,KAAK,GAAG,OAAO;SAClB,GAAG,CAAC,CAAC,CAAe,EAAE,EAAE;QACvB,MAAM,GAAG,GAAG,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,KAAK,CAAC;QACpC,MAAM,IAAI,GAAG,SAAS,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QACtD,OAAO,yDAAyD,OAAO,CAAC,GAAG,CAAC,IAAI,aAAa,4BAA4B,GAAG,CAAC,GAAG,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,qBAAqB,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,sBAAsB,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,QAAQ,CAAC;IAC1P,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,OAAO,OAAO,CAAC,SAAS,EAAE,uBAAuB,KAAK,QAAQ,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,eAAe,CAAC,MAAsB;IAC7C,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/E,IAAI,CAAC,GAAG,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAC3B,MAAM,KAAK,GAAG,GAAG;SACd,GAAG,CACF,CAAC,CAAC,IAAI,EAAE,GAAG,CAAC,EAAE,EAAE,CACd,yDAAyD,OAAO,CAAC,GAAG,CAAC,IAAI,aAAa,6BAA6B,GAAG,CAAC,IAAI,CAAC,0BAA0B,GAAG,CAAC,GAAG,CAAC,cAAc,CAC/K;SACA,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,OAAO,OAAO,CAAC,iBAAiB,EAAE,uBAAuB,KAAK,QAAQ,CAAC,CAAC;AAC1E,CAAC;AAED,SAAS,iBAAiB,CAAC,MAAsB;IAC/C,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,EAAE,MAAM,IAAI,EAAE,CAAC;IAC/C,IAAI,CAAC,MAAM,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,MAAM;SAChB,GAAG,CACF,CAAC,CAAkB,EAAE,EAAE,CACrB,WAAW,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,yBAAyB,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,yBAAyB,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,yBAAyB,GAAG,CAAC,CAAC,CAAC,UAAU,IAAI,EAAE,CAAC,YAAY,CACjN;SACA,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,EAAE,OAAO,IAAI,EAAE,CAAC;IAC9C,MAAM,IAAI,GAAG;QACX,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;QAC3B,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QAC1D,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;QAC3B,GAAG,CAAC,IAAI,CAAC,eAAe,IAAI,EAAE,CAAC;KAChC,CAAC;IACF,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,2BAA2B,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IACzF,OAAO,OAAO,CACZ,YAAY,EACZ,wHAAwH,IAAI,mBAAmB,OAAO,EAAE,CACzJ,CAAC;AACJ,CAAC;AAID,oEAAoE;AACpE,SAAS,OAAO,CAAC,CAAa;IAC5B,IAAI,OAAO,CAAC,CAAC,YAAY,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC,YAAY,CAAC;IAC9D,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ;QAAE,OAAO,CAAC,CAAC,EAAE,CAAC;IAC1C,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,iBAAiB,CAAC,CAAC;IAC9E,OAAO,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,iBAAiB,CAAC;AACzD,CAAC;AAED,6DAA6D;AAC7D,SAAS,QAAQ,CAAC,MAAoB;IACpC,OAAO,CAAC,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,UAAU,CAAC,MAAoB;IACtC,OAAO,MAAM;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,uEAAuE;QACvE,sBAAsB;QACtB,MAAM,KAAK,GAAG,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1G,IAAI,CAAC,KAAK;YAAE,OAAO,EAAE,CAAC;QACtB,OAAO,qBAAqB,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,wBAAwB,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC;IAC1H,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED,SAAS,cAAc,CAAC,MAAsB;IAC5C,MAAM,IAAI,GAAG,MAAM,CAAC,OAAO,EAAE,YAAY,IAAI,EAAE,CAAC;IAChD,IAAI,CAAC,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC,yBAAyB,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5G,OAAO,OAAO,CAAC,SAAS,EAAE,sBAAsB,UAAU,CAAC,QAAQ,CAAC,IAAoB,CAAC,CAAC,SAAS,KAAK,EAAE,CAAC,CAAC;AAC9G,CAAC;AAED,SAAS,aAAa,CAAC,MAAsB;IAC3C,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,EAAE,MAAM,IAAI,EAAE,CAAC;IAC/C,IAAI,CAAC,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAC5B,OAAO,OAAO,CAAC,eAAe,EAAE,sBAAsB,UAAU,CAAC,QAAQ,CAAC,IAAoB,CAAC,CAAC,QAAQ,CAAC,CAAC;AAC5G,CAAC;AAED,SAAS,cAAc,CAAC,MAAsB;IAC5C,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;IACrC,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,sCAAsC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC9G,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,yBAAyB,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzF,OAAO,OAAO,CAAC,SAAS,EAAE,4BAA4B,KAAK,2DAA2D,IAAI,QAAQ,CAAC,CAAC;AACtI,CAAC;AAED,SAAS,cAAc,CAAC,MAAsB;IAC5C,MAAM,OAAO,GAAG,MAAM,CAAC,UAAU,EAAE,OAAO,IAAI,EAAE,CAAC;IACjD,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAC/B,MAAM,QAAQ,GAAG,OAAO;SACrB,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;SACZ,GAAG,CAAC,CAAC,CAAc,EAAE,EAAE;QACtB,MAAM,EAAE,GAAa,CAAC,CAAC,MAAM,EAAE,OAAO,IAAI,EAAE,CAAC;QAC7C,MAAM,KAAK,GAAG;YACZ,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,cAAc,OAAO,CAAC,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;YACrE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;YAC5C,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,iBAAiB,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;YAClE,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,kBAAkB;YAClE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,OAAO,CAAC,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;YAC/C,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,eAAe,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;YAC1D,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;SACrD;aACE,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CAAC,GAAG,CAAC,CAAC;QACb,OAAO,qCAAqC,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,IAAI,QAAQ,CAAC,WAAW,CAAC;IAChG,CAAC,CAAC;SACD,IAAI,CAAC,GAAG,CAAC,CAAC;IACb,OAAO,OAAO,CAAC,SAAS,EAAE,oBAAoB,QAAQ,QAAQ,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,aAAa,CAAC,MAAsB;IAC3C,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC;IACtC,MAAM,IAAI,GAAiB,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,GAAG,IAAI,EAAE,CAAC;IACrE,IAAI,CAAC,IAAI,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAC5B,MAAM,KAAK,GAAG,IAAI;SACf,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;SACZ,GAAG,CAAC,CAAC,EAAc,EAAE,EAAE;QACtB,MAAM,KAAK,GAAG;YACZ,EAAE,CAAC,eAAe,CAAC,CAAC,CAAC,cAAc,OAAO,CAAC,EAAE,CAAC,eAAe,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;YACrE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,OAAO,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;YAC5C,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,iBAAiB,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE;SACnE;aACE,MAAM,CAAC,OAAO,CAAC;aACf,IAAI,CAAC,GAAG,CAAC,CAAC;QACb,OAAO,gCAAgC,GAAG,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,CAAC;IAC9F,CAAC,CAAC;SACD,IAAI,CAAC,GAAG,CAAC,CAAC;IACb,OAAO,OAAO,CAAC,QAAQ,EAAE,oBAAoB,KAAK,QAAQ,CAAC,CAAC;AAC9D,CAAC;AAED,SAAS,WAAW,CAAC,MAAsB;IACzC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;IAChC,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAC7B,MAAM,IAAI,GAAG,KAAK;SACf,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;SACZ,GAAG,CAAC,CAAC,CAAW,EAAE,EAAE;QACnB,MAAM,OAAO,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,sCAAsC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,4CAA4C,CAAC,CAAC,CAAC,uCAAuC,CAAC;QACnK,OAAO,8FAA8F,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,+DAA+D,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,yBAAyB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,yBAAyB,GAAG,CAAC,CAAC,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,OAAO,YAAY,CAAC;IAC3U,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,OAAO,OAAO,CACZ,eAAe,EACf,mHAAmH,IAAI,kBAAkB,EACzI,MAAM,CACP,CAAC;AACJ,CAAC;AAED,SAAS,WAAW,CAAC,MAAsB;IACzC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IACxD,MAAM,KAAK,GAAG,CAAC,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC3D,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,WAAW,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC/C,8EAA8E;QAC9E,wEAAwE;QACxE,MAAM,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9B,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IACH,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,EAAE,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,gDAAgD,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC;IACvG,IAAI,KAAK,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,2CAA2C,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC;IACxG,IAAI,GAAG,CAAC,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,iDAAiD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,SAAS,CAAC,CAAC;IAC1G,IAAI,CAAC,KAAK,CAAC,MAAM;QAAE,OAAO,EAAE,CAAC;IAC7B,OAAO,OAAO,CAAC,UAAU,EAAE,oBAAoB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;AACzE,CAAC;AAED,8EAA8E;AAE9E,SAAS,YAAY,CAAC,KAAkB,EAAE,aAAsB;IAC9D,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,WAAW,CAAC;IAChE,MAAM,OAAO,GACX,KAAK,CAAC,MAAM,KAAK,OAAO;QACtB,CAAC,CAAC,wCAAwC;QAC1C,CAAC,CAAC,0CAA0C,CAAC;IACjD,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU;SAC1B,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,OAAO,GAAG,CAAC,CAAC;SAClD,GAAG,CACF,CAAC,CAAC,EAAE,EAAE,CACJ,WAAW,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAC/J;SACA,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO;SAC1B,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;SACb,GAAG,CAAC,CAAC,EAAe,EAAE,EAAE;QACvB,MAAM,OAAO,GAAG,EAAE,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,QAAQ,CAAC;QAC5F,MAAM,MAAM,GAAG,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,IAAI,EAAE,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;QACjH,OAAO,WAAW,GAAG,CAAC,EAAE,CAAC,QAAQ,CAAC,+BAA+B,OAAO,KAAK,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,gCAAgC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,yBAAyB,MAAM,yBAAyB,EAAE,CAAC,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC;IAClP,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,oBAAoB,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,mBAAmB,CAAC,CAAC,CAAC,EAAE,CAAC;IACjH,OAAO,qBAAqB,GAAG,oDAAoD,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,mBAAmB,OAAO,gCAAgC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,iCAAiC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,cAAc,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,YAAY,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,aAAa,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,qBACnX,IAAI,CAAC,CAAC,CAAC,8HAA8H,IAAI,kBAAkB,CAAC,CAAC,CAAC,EAChK,GACE,OAAO,CAAC,CAAC,CAAC,sIAAsI,OAAO,mBAAmB,IAAI,EAAE,CAAC,CAAC,CAAC,EACrL,QAAQ,CAAC;AACX,CAAC;AAED,8EAA8E;AAE9E,MAAM,UAAU,kBAAkB,CAAC,MAAsB,EAAE,UAA6B,EAAE;IACxF,IAAI,MAAM,GAAG,MAAM,CAAC,GAAG,CAAC;IACxB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IAC9D,CAAC;IAAC,MAAM,CAAC;QACP,iBAAiB;IACnB,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,EAAE,gBAAgB,IAAI,EAAE,CAAC;IACvE,MAAM,EAAE,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAEnC,MAAM,IAAI,GAAG;QACX,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,YAAY,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,EAAE;QACvE,eAAe,CAAC,EAAE,CAAC;QACnB,cAAc,CAAC,MAAM,CAAC;QACtB,eAAe,CAAC,MAAM,CAAC;QACvB,iBAAiB,CAAC,MAAM,CAAC;QACzB,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,aAAa,CAAC,MAAM,CAAC,CAAC;QACtD,cAAc,CAAC,MAAM,CAAC;QACtB,cAAc,CAAC,MAAM,CAAC;QACtB,aAAa,CAAC,MAAM,CAAC;QACrB,WAAW,CAAC,MAAM,CAAC;QACnB,WAAW,CAAC,MAAM,CAAC;KACpB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEb,MAAM,MAAM,GAAG,aAAa,CAAC,MAAM,EAAE,EAAE,EAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAExD,OAAO;;;;;2CAKkC,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;4BAChD,GAAG,CAAC,MAAM,CAAC;SAC9B,KAAK;;;;uCAIyB,IAAI,0BAA0B,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,6BAA6B,GAAG,CAAC,MAAM,CAAC,WAAW,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;;EAE7K,MAAM;EACN,aAAa,CAAC,MAAM,CAAC;EACrB,IAAI;qFAC+E,OAAO,CAAC,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;;;QAG9G,CAAC;AACT,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * @param {object} result - dembrandt extraction result
3
+ * @returns {string} DESIGN.md content
4
+ */
5
+ export declare function generateDesignMd(result: any): string;