multiclone 0.2.1 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/README.md +4 -4
  2. package/agents/section-builder.md +5 -3
  3. package/commands/multiclone.md +2 -2
  4. package/dist/contracts/tools/session.js +9 -8
  5. package/dist/contracts/tools/session.js.map +1 -1
  6. package/dist/project/assets.js +15 -13
  7. package/dist/project/assets.js.map +1 -1
  8. package/dist/project/convert/attrs.js +318 -0
  9. package/dist/project/convert/attrs.js.map +1 -0
  10. package/dist/project/convert/convert.js +304 -0
  11. package/dist/project/convert/convert.js.map +1 -0
  12. package/dist/project/convert/css.js +299 -0
  13. package/dist/project/convert/css.js.map +1 -0
  14. package/dist/project/convert/html.js +425 -0
  15. package/dist/project/convert/html.js.map +1 -0
  16. package/dist/project/convert/jsx.js +335 -0
  17. package/dist/project/convert/jsx.js.map +1 -0
  18. package/dist/project/convert/locate.js +180 -0
  19. package/dist/project/convert/locate.js.map +1 -0
  20. package/dist/project/convert/scripts.js +214 -0
  21. package/dist/project/convert/scripts.js.map +1 -0
  22. package/dist/project/convert/styles.js +228 -0
  23. package/dist/project/convert/styles.js.map +1 -0
  24. package/dist/project/convert/write.js +142 -0
  25. package/dist/project/convert/write.js.map +1 -0
  26. package/dist/project/fonts.js +131 -0
  27. package/dist/project/fonts.js.map +1 -0
  28. package/dist/project/libraries.js +28 -0
  29. package/dist/project/libraries.js.map +1 -0
  30. package/dist/project/method.js +1 -1
  31. package/dist/project/method.js.map +1 -1
  32. package/dist/project/scaffold.js +33 -6
  33. package/dist/project/scaffold.js.map +1 -1
  34. package/dist/session/proc.js +29 -1
  35. package/dist/session/proc.js.map +1 -1
  36. package/dist/session/session.js +47 -4
  37. package/dist/session/session.js.map +1 -1
  38. package/dist/version.js +1 -1
  39. package/package.json +1 -1
  40. package/skills/multiclone/SKILL.md +15 -5
  41. package/templates/react-vite/index.html +1 -1
  42. package/templates/react-vite/src/main.tsx +2 -2
  43. package/templates/react-vite/src/styles/index.css +0 -1
  44. package/dist/project/draft.js +0 -860
  45. package/dist/project/draft.js.map +0 -1
  46. package/templates/react-vite/src/styles/draft.css +0 -1
@@ -0,0 +1,304 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { copyFile, rm, writeFile } from 'node:fs/promises';
3
+ import { join, resolve } from 'node:path';
4
+ import { ensureDir, readJson } from '../../core/files.js';
5
+ import { log } from '../../core/log.js';
6
+ import { mcError, TaggedError } from '../../domain/result.js';
7
+ import { RunFolder } from '../../store/run.js';
8
+ import { exportAssets, mediaPath } from '../assets.js';
9
+ import { SHARED } from './css.js';
10
+ import { attr, decodeEntities, elementChildren, parseDocument, textContent, } from './html.js';
11
+ import { newJsxState, renderChildren, renderElement, } from './jsx.js';
12
+ import { componentName, fallbackSections, locateSections, } from './locate.js';
13
+ import { planScripts, RUNTIME_SOURCE } from './scripts.js';
14
+ import { buildStyles } from './styles.js';
15
+ import { originalSource, pageSource, pretty, registerPages, sectionSource, writeApp, writeElementTypes, } from './write.js';
16
+ /**
17
+ * Converts a captured page into React sections that keep the original markup, class names, CSS
18
+ * and scripts, so the clone looks and moves like the original from the first render.
19
+ */
20
+ export async function convertPage(options) {
21
+ const opened = await RunFolder.open(options.capture);
22
+ if (!opened.ok)
23
+ throw new TaggedError(opened.error);
24
+ const run = opened.value;
25
+ const project = resolve(options.project);
26
+ const route = normalizeRoute(options.route ?? '/');
27
+ const warnings = [];
28
+ const primary = run.viewports[0] ?? 'desktop';
29
+ const pageUrl = run.manifest.finalUrl || run.manifest.url;
30
+ const origin = new URL(pageUrl).origin;
31
+ const network = await run.network();
32
+ const { doc, hydrated, source } = await pickDocument(run, network, pageUrl, primary);
33
+ if (source === 'rendered')
34
+ warnings.push("The server sent an almost empty page (client-rendered site); converted the DOM after the site's JS ran, without its app bundle.");
35
+ const slug = route === '/'
36
+ ? 'home'
37
+ : route
38
+ .slice(1)
39
+ .replace(/[^a-z0-9]+/gi, '-')
40
+ .toLowerCase();
41
+ const sectionsDir = join(project, 'src', 'sections', slug);
42
+ if (existsSync(sectionsDir)) {
43
+ if (options.overwrite !== true)
44
+ throw new TaggedError(mcError('invalid-input', `${route} is already converted in src/sections/${slug}.`, 'Pass overwrite to replace it (this discards edits to those files).'));
45
+ await rm(sectionsDir, { recursive: true, force: true });
46
+ }
47
+ for (const stale of [
48
+ join(project, 'src', 'styles', 'original', slug),
49
+ join(project, 'public', 'original', slug),
50
+ ])
51
+ await rm(stale, { recursive: true, force: true });
52
+ const index = await run.json('sections/index.json', []);
53
+ let located = locateSections(doc, index, primary, hydrated);
54
+ if (!located.length) {
55
+ located = fallbackSections(doc);
56
+ warnings.push('No section split matched this page; split it by its top-level blocks.');
57
+ }
58
+ // URLs: captured files are served locally, same-site links stay relative, the rest stays remote.
59
+ const mapFile = join(project, 'src', 'content', 'asset-map.json');
60
+ const noMap = {};
61
+ let assetMap = await readJson(mapFile).catch(() => noMap);
62
+ if (!Object.keys(assetMap).length) {
63
+ await exportAssets(run.dir, project);
64
+ assetMap = await readJson(mapFile).catch(() => noMap);
65
+ }
66
+ const captured = new Map(network.filter((entry) => entry.file).map((entry) => [entry.url, entry]));
67
+ const extra = new Map();
68
+ const local = (absolute) => {
69
+ const known = assetMap[absolute] ?? assetMap[absolute.split('#')[0] ?? ''];
70
+ if (known)
71
+ return known;
72
+ const entry = captured.get(absolute);
73
+ if (!entry?.file || entry.mimeType.includes('text/html'))
74
+ return null;
75
+ const path = mediaPath(new URL(absolute), entry.file);
76
+ extra.set(absolute, { file: entry.file, local: path });
77
+ return path;
78
+ };
79
+ const baseHref = (() => {
80
+ const base = elementChildren(doc.head).find((node) => node.tag === 'base');
81
+ const href = base ? attr(base, 'href') : null;
82
+ try {
83
+ return href ? new URL(href, pageUrl).href : pageUrl;
84
+ }
85
+ catch {
86
+ return pageUrl;
87
+ }
88
+ })();
89
+ const sameSite = (url) => url.origin === origin ||
90
+ url.hostname.replace(/^www\./, '') === new URL(origin).hostname.replace(/^www\./, '');
91
+ const rewrite = (raw, kind) => {
92
+ let url;
93
+ try {
94
+ url = new URL(raw.trim(), baseHref);
95
+ }
96
+ catch {
97
+ return raw;
98
+ }
99
+ if (url.protocol !== 'http:' && url.protocol !== 'https:')
100
+ return raw;
101
+ const mapped = local(url.href);
102
+ if (kind === 'link') {
103
+ if (mapped)
104
+ return mapped;
105
+ return sameSite(url) ? `${url.pathname}${url.search}${url.hash}` || '/' : url.href;
106
+ }
107
+ return mapped ?? url.href;
108
+ };
109
+ // Section ownership of every class/id, for splitting the CSS.
110
+ const ownerOf = new Map(located.map((section, i) => [section.element, i]));
111
+ const elementsTokens = [];
112
+ const collect = (node, owner) => {
113
+ const own = ownerOf.get(node) ?? owner;
114
+ const tokens = (attr(node, 'class') ?? '')
115
+ .split(/\s+/)
116
+ .filter(Boolean)
117
+ .map((name) => `.${name}`);
118
+ const id = attr(node, 'id');
119
+ if (id)
120
+ tokens.push(`#${id}`);
121
+ elementsTokens.push({ tag: node.tag.toLowerCase(), tokens, owner: own });
122
+ for (const child of elementChildren(node))
123
+ collect(child, own);
124
+ };
125
+ collect(doc.body, SHARED);
126
+ const styleElements = [
127
+ ...allOf(doc.head, isStyleSource),
128
+ ...allOf(doc.body, (node) => node.tag === 'link' && isStyleSource(node)),
129
+ ];
130
+ const styles = await buildStyles({
131
+ elements: styleElements,
132
+ pageUrl: baseHref,
133
+ network,
134
+ readBody: (file) => run.text(file),
135
+ local,
136
+ elementsTokens,
137
+ });
138
+ const scripts = await planScripts({
139
+ elements: allOf(doc.root, (node) => node.tag === 'script'),
140
+ pageUrl: baseHref,
141
+ network,
142
+ stack: run.manifest.stack.map((signal) => signal.id),
143
+ readBody: (file) => run.text(file),
144
+ publicDir: `original/${slug}`,
145
+ project,
146
+ });
147
+ if (scripts.dropped.length)
148
+ log(`kept ${String(scripts.kept)} original scripts, left out ${String(scripts.dropped.length)} (tracking, consent, app runtime)`);
149
+ // Sections → components.
150
+ const taken = new Set();
151
+ const unknownTags = new Set();
152
+ const sections = [];
153
+ const nameOf = new Map();
154
+ for (const [i, section] of located.entries()) {
155
+ const name = componentName(labelOf(section), 'Section', taken);
156
+ nameOf.set(section.element, name);
157
+ const state = newJsxState();
158
+ const jsxOptions = { url: rewrite };
159
+ const root = {
160
+ ...section.element,
161
+ attrs: [...section.element.attrs, ['data-mc-section', section.id]],
162
+ };
163
+ const jsx = renderElement(root, jsxOptions, state);
164
+ for (const tag of state.unknownTags)
165
+ unknownTags.add(tag);
166
+ const css = styles.sections.get(i);
167
+ const dir = join(sectionsDir, name);
168
+ await ensureDir(dir);
169
+ if (css)
170
+ await writeFile(join(dir, `${name}.css`), await pretty(css, 'css'));
171
+ await writeFile(join(dir, `${name}.tsx`), await pretty(sectionSource({
172
+ name,
173
+ label: section.label,
174
+ origin: pageUrl,
175
+ jsx,
176
+ css: css !== undefined,
177
+ cssProperties: state.cssProperties,
178
+ }), 'typescript'));
179
+ sections.push({
180
+ name,
181
+ label: section.label,
182
+ file: `src/sections/${slug}/${name}/${name}.tsx`,
183
+ elements: countElements(section.element),
184
+ truncated: false,
185
+ });
186
+ }
187
+ // The page: everything outside the sections stays in place around them.
188
+ const pageName = componentName(route === '/' ? 'home' : route, 'Page', new Set());
189
+ const pageState = newJsxState();
190
+ const pageJsx = renderChildren(doc.body, {
191
+ url: rewrite,
192
+ replace: (element) => {
193
+ const name = nameOf.get(element);
194
+ return name ? `<${name} />` : null;
195
+ },
196
+ }, pageState);
197
+ for (const tag of pageState.unknownTags)
198
+ unknownTags.add(tag);
199
+ await ensureDir(join(project, 'src', 'pages'));
200
+ await writeFile(join(project, 'src', 'pages', `${pageName}.tsx`), await pretty(pageSource({
201
+ name: pageName,
202
+ slug,
203
+ route,
204
+ origin: pageUrl,
205
+ sections: sections.map((section) => section.name),
206
+ jsx: pageJsx,
207
+ cssProperties: pageState.cssProperties,
208
+ }), 'typescript'));
209
+ const stylesDir = join(project, 'src', 'styles', 'original', slug);
210
+ await ensureDir(stylesDir);
211
+ await writeFile(join(stylesDir, 'base.css'), `/* Original stylesheets of ${pageUrl}, URLs pointed at local copies. Rules used by only one section live next to it. */\n#mc-root {\n display: contents;\n}\n\n${styles.base}`);
212
+ await ensureDir(join(project, 'src', 'original'));
213
+ await ensureDir(join(project, 'src', 'lib'));
214
+ await writeFile(join(project, 'src', 'lib', 'original.ts'), await pretty(RUNTIME_SOURCE, 'typescript'));
215
+ await writeFile(join(project, 'src', 'original', `${slug}.ts`), await pretty(originalSource({
216
+ html: attributes(doc.html),
217
+ body: attributes(doc.body),
218
+ scripts: scripts.scripts,
219
+ }), 'typescript'));
220
+ await writeElementTypes(project, unknownTags);
221
+ for (const { file, local: path } of extra.values()) {
222
+ const target = join(project, 'public', ...path.split('/').filter(Boolean));
223
+ await ensureDir(join(target, '..'));
224
+ await copyFile(run.path(file), target).catch(() => undefined);
225
+ }
226
+ await writeApp(project);
227
+ const routes = [...new Set([route, ...(options.aliases ?? []).map(normalizeRoute)])];
228
+ await registerPages(project, routes.map((path) => ({ route: path, component: pageName, file: `@/pages/${pageName}` })));
229
+ if (styles.remote.length)
230
+ warnings.push(`${String(styles.remote.length)} stylesheet(s) were not captured and load from the original site.`);
231
+ log(`converted ${String(sections.length)} sections → src/sections/${slug} (route ${route}); CSS: ${String(styles.sheets)} sheets, ${String(styles.moved)} rules moved into sections`);
232
+ return {
233
+ route,
234
+ page: `src/pages/${pageName}.tsx`,
235
+ sections,
236
+ warnings,
237
+ source,
238
+ scripts: { kept: scripts.kept, dropped: scripts.dropped.length },
239
+ css: { sheets: styles.sheets, sectionRules: styles.moved, sharedRules: styles.kept },
240
+ };
241
+ }
242
+ /** The HTML the server sent, unless the page is client-rendered; then the DOM after JS ran. */
243
+ async function pickDocument(run, network, pageUrl, viewport) {
244
+ const strip = (url) => url.split('#')[0] ?? url;
245
+ const documents = network.filter((entry) => entry.resourceType === 'Document' && entry.file && entry.status < 400);
246
+ const entry = documents.find((item) => strip(item.url) === strip(pageUrl)) ??
247
+ documents.find((item) => item.mimeType.includes('html'));
248
+ const rawText = entry?.file ? await run.text(entry.file) : null;
249
+ const domText = (await run.text(`dom/${viewport}.html`)) ?? (await run.text('dom/desktop.html'));
250
+ const raw = rawText !== null ? parseDocument(rawText) : null;
251
+ const hydrated = domText !== null ? parseDocument(domText) : null;
252
+ if (raw && hydrated) {
253
+ const rawWords = textContent(raw.body).replace(/\s+/g, ' ').length;
254
+ const domWords = textContent(hydrated.body).replace(/\s+/g, ' ').length;
255
+ return rawWords >= domWords * 0.5
256
+ ? { doc: raw, hydrated, source: 'original' }
257
+ : { doc: hydrated, hydrated, source: 'rendered' };
258
+ }
259
+ if (raw)
260
+ return { doc: raw, hydrated: null, source: 'original' };
261
+ if (hydrated)
262
+ return { doc: hydrated, hydrated, source: 'rendered' };
263
+ throw new Error(`The capture in ${run.dir} has neither the page HTML nor a DOM snapshot.`);
264
+ }
265
+ function isStyleSource(node) {
266
+ if (node.tag === 'style')
267
+ return true;
268
+ if (node.tag !== 'link')
269
+ return false;
270
+ const rel = (attr(node, 'rel') ?? '').toLowerCase();
271
+ return rel.includes('stylesheet') || (rel.includes('preload') && attr(node, 'as') === 'style');
272
+ }
273
+ function allOf(root, test) {
274
+ const out = [];
275
+ const walk = (node) => {
276
+ if (test(node))
277
+ out.push(node);
278
+ for (const child of elementChildren(node))
279
+ walk(child);
280
+ };
281
+ walk(root);
282
+ return out;
283
+ }
284
+ function attributes(node) {
285
+ const out = {};
286
+ for (const [name, value] of node.attrs) {
287
+ if (/^[a-zA-Z_][\w\-:.]*$/.test(name) && !/^on/i.test(name))
288
+ out[name.toLowerCase()] = decodeEntities(value);
289
+ }
290
+ return out;
291
+ }
292
+ function countElements(node) {
293
+ return elementChildren(node).reduce((sum, child) => sum + countElements(child), 1);
294
+ }
295
+ function labelOf(section) {
296
+ return /^(block|section)[- ]?\d+$/i.test(section.label)
297
+ ? (attr(section.element, 'id') ?? section.label)
298
+ : section.label;
299
+ }
300
+ function normalizeRoute(route) {
301
+ const path = route.startsWith('/') ? route : `/${route}`;
302
+ return path.length > 1 ? path.replace(/\/+$/, '') : '/';
303
+ }
304
+ //# sourceMappingURL=convert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert.js","sourceRoot":"","sources":["../../../src/project/convert/convert.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACrC,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE9D,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AACvD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EACL,IAAI,EACJ,cAAc,EACd,eAAe,EACf,aAAa,EACb,WAAW,GAGZ,MAAM,WAAW,CAAC;AACnB,OAAO,EACL,WAAW,EACX,cAAc,EACd,aAAa,GAGd,MAAM,UAAU,CAAC;AAClB,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,cAAc,GAGf,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAsB,MAAM,aAAa,CAAC;AAC9D,OAAO,EACL,cAAc,EACd,UAAU,EACV,MAAM,EACN,aAAa,EACb,aAAa,EACb,QAAQ,EACR,iBAAiB,GAClB,MAAM,YAAY,CAAC;AAsCpB;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,OAAuB;IACvD,MAAM,MAAM,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACrD,IAAI,CAAC,MAAM,CAAC,EAAE;QAAE,MAAM,IAAI,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACpD,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC;IACzB,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,cAAc,CAAC,OAAO,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC;IACnD,MAAM,QAAQ,GAAa,EAAE,CAAC;IAC9B,MAAM,OAAO,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC;IAC9C,MAAM,OAAO,GAAG,GAAG,CAAC,QAAQ,CAAC,QAAQ,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC;IAC1D,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IACvC,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC;IAEpC,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IACrF,IAAI,MAAM,KAAK,UAAU;QACvB,QAAQ,CAAC,IAAI,CACX,iIAAiI,CAClI,CAAC;IAEJ,MAAM,IAAI,GACR,KAAK,KAAK,GAAG;QACX,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,KAAK;aACF,KAAK,CAAC,CAAC,CAAC;aACR,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC;aAC5B,WAAW,EAAE,CAAC;IACvB,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;IAC3D,IAAI,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,SAAS,KAAK,IAAI;YAC5B,MAAM,IAAI,WAAW,CACnB,OAAO,CACL,eAAe,EACf,GAAG,KAAK,yCAAyC,IAAI,GAAG,EACxD,oEAAoE,CACrE,CACF,CAAC;QACJ,MAAM,EAAE,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAC1D,CAAC;IACD,KAAK,MAAM,KAAK,IAAI;QAClB,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC;QAChD,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC;KAC1C;QACC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IAEpD,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC,IAAI,CAAsB,qBAAqB,EAAE,EAAE,CAAC,CAAC;IAC7E,IAAI,OAAO,GAAG,cAAc,CAAC,GAAG,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC5D,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,OAAO,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAChC,QAAQ,CAAC,IAAI,CAAC,uEAAuE,CAAC,CAAC;IACzF,CAAC;IAED,iGAAiG;IACjG,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC;IAClE,MAAM,KAAK,GAA2B,EAAE,CAAC;IACzC,IAAI,QAAQ,GAAG,MAAM,QAAQ,CAAyB,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;IAClF,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC;QAClC,MAAM,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACrC,QAAQ,GAAG,MAAM,QAAQ,CAAyB,OAAO,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,CAAC;IAChF,CAAC;IACD,MAAM,QAAQ,GAAG,IAAI,GAAG,CACtB,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CACzE,CAAC;IACF,MAAM,KAAK,GAAG,IAAI,GAAG,EAA2C,CAAC;IACjE,MAAM,KAAK,GAAG,CAAC,QAAgB,EAAiB,EAAE;QAChD,MAAM,KAAK,GAAG,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3E,IAAI,KAAK;YAAE,OAAO,KAAK,CAAC;QACxB,MAAM,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QACrC,IAAI,CAAC,KAAK,EAAE,IAAI,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC;YAAE,OAAO,IAAI,CAAC;QACtE,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACtD,KAAK,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,OAAO,IAAI,CAAC;IACd,CAAC,CAAC;IACF,MAAM,QAAQ,GAAG,CAAC,GAAG,EAAE;QACrB,MAAM,IAAI,GAAG,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,MAAM,CAAC,CAAC;QAC3E,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9C,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC;QACtD,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,OAAO,CAAC;QACjB,CAAC;IACH,CAAC,CAAC,EAAE,CAAC;IACL,MAAM,QAAQ,GAAG,CAAC,GAAQ,EAAW,EAAE,CACrC,GAAG,CAAC,MAAM,KAAK,MAAM;QACrB,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,KAAK,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC;IACxF,MAAM,OAAO,GAAG,CAAC,GAAW,EAAE,IAAa,EAAU,EAAE;QACrD,IAAI,GAAQ,CAAC;QACb,IAAI,CAAC;YACH,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;QACtC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,GAAG,CAAC;QACb,CAAC;QACD,IAAI,GAAG,CAAC,QAAQ,KAAK,OAAO,IAAI,GAAG,CAAC,QAAQ,KAAK,QAAQ;YAAE,OAAO,GAAG,CAAC;QACtE,MAAM,MAAM,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;YACpB,IAAI,MAAM;gBAAE,OAAO,MAAM,CAAC;YAC1B,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,MAAM,GAAG,GAAG,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC;QACrF,CAAC;QACD,OAAO,MAAM,IAAI,GAAG,CAAC,IAAI,CAAC;IAC5B,CAAC,CAAC;IAEF,8DAA8D;IAC9D,MAAM,OAAO,GAAG,IAAI,GAAG,CAAsB,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAChG,MAAM,cAAc,GAAoB,EAAE,CAAC;IAC3C,MAAM,OAAO,GAAG,CAAC,IAAiB,EAAE,KAAa,EAAQ,EAAE;QACzD,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC;QACvC,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC;aACvC,KAAK,CAAC,KAAK,CAAC;aACZ,MAAM,CAAC,OAAO,CAAC;aACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;QAC7B,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC5B,IAAI,EAAE;YAAE,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC9B,cAAc,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QACzE,KAAK,MAAM,KAAK,IAAI,eAAe,CAAC,IAAI,CAAC;YAAE,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IACjE,CAAC,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAE1B,MAAM,aAAa,GAAG;QACpB,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,aAAa,CAAC;QACjC,GAAG,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,MAAM,IAAI,aAAa,CAAC,IAAI,CAAC,CAAC;KACzE,CAAC;IACF,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC;QAC/B,QAAQ,EAAE,aAAa;QACvB,OAAO,EAAE,QAAQ;QACjB,OAAO;QACP,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;QAClC,KAAK;QACL,cAAc;KACf,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC;QAChC,QAAQ,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,KAAK,QAAQ,CAAC;QAC1D,OAAO,EAAE,QAAQ;QACjB,OAAO;QACP,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;QACpD,QAAQ,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;QAClC,SAAS,EAAE,YAAY,IAAI,EAAE;QAC7B,OAAO;KACR,CAAC,CAAC;IACH,IAAI,OAAO,CAAC,OAAO,CAAC,MAAM;QACxB,GAAG,CACD,QAAQ,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,+BAA+B,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,mCAAmC,CAC7H,CAAC;IAEJ,yBAAyB;IACzB,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IACtC,MAAM,QAAQ,GAAuB,EAAE,CAAC;IACxC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAuB,CAAC;IAC9C,KAAK,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QAC7C,MAAM,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,SAAS,EAAE,KAAK,CAAC,CAAC;QAC/D,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAClC,MAAM,KAAK,GAAG,WAAW,EAAE,CAAC;QAC5B,MAAM,UAAU,GAAe,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;QAChD,MAAM,IAAI,GAAgB;YACxB,GAAG,OAAO,CAAC,OAAO;YAClB,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC,iBAAiB,EAAE,OAAO,CAAC,EAAE,CAAC,CAAC;SACnE,CAAC;QACF,MAAM,GAAG,GAAG,aAAa,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QACnD,KAAK,MAAM,GAAG,IAAI,KAAK,CAAC,WAAW;YAAE,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1D,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QACnC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;QACpC,MAAM,SAAS,CAAC,GAAG,CAAC,CAAC;QACrB,IAAI,GAAG;YAAE,MAAM,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,MAAM,CAAC,EAAE,MAAM,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;QAC7E,MAAM,SAAS,CACb,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,MAAM,CAAC,EACxB,MAAM,MAAM,CACV,aAAa,CAAC;YACZ,IAAI;YACJ,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,MAAM,EAAE,OAAO;YACf,GAAG;YACH,GAAG,EAAE,GAAG,KAAK,SAAS;YACtB,aAAa,EAAE,KAAK,CAAC,aAAa;SACnC,CAAC,EACF,YAAY,CACb,CACF,CAAC;QACF,QAAQ,CAAC,IAAI,CAAC;YACZ,IAAI;YACJ,KAAK,EAAE,OAAO,CAAC,KAAK;YACpB,IAAI,EAAE,gBAAgB,IAAI,IAAI,IAAI,IAAI,IAAI,MAAM;YAChD,QAAQ,EAAE,aAAa,CAAC,OAAO,CAAC,OAAO,CAAC;YACxC,SAAS,EAAE,KAAK;SACjB,CAAC,CAAC;IACL,CAAC;IAED,wEAAwE;IACxE,MAAM,QAAQ,GAAG,aAAa,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;IAClF,MAAM,SAAS,GAAG,WAAW,EAAE,CAAC;IAChC,MAAM,OAAO,GAAG,cAAc,CAC5B,GAAG,CAAC,IAAI,EACR;QACE,GAAG,EAAE,OAAO;QACZ,OAAO,EAAE,CAAC,OAAO,EAAE,EAAE;YACnB,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;YACjC,OAAO,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;QACrC,CAAC;KACF,EACD,SAAS,CACV,CAAC;IACF,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,WAAW;QAAE,WAAW,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC9D,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IAC/C,MAAM,SAAS,CACb,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,QAAQ,MAAM,CAAC,EAChD,MAAM,MAAM,CACV,UAAU,CAAC;QACT,IAAI,EAAE,QAAQ;QACd,IAAI;QACJ,KAAK;QACL,MAAM,EAAE,OAAO;QACf,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC;QACjD,GAAG,EAAE,OAAO;QACZ,aAAa,EAAE,SAAS,CAAC,aAAa;KACvC,CAAC,EACF,YAAY,CACb,CACF,CAAC;IAEF,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;IACnE,MAAM,SAAS,CAAC,SAAS,CAAC,CAAC;IAC3B,MAAM,SAAS,CACb,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,EAC3B,8BAA8B,OAAO,8HAA8H,MAAM,CAAC,IAAI,EAAE,CACjL,CAAC;IAEF,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,UAAU,CAAC,CAAC,CAAC;IAClD,MAAM,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC;IAC7C,MAAM,SAAS,CACb,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,aAAa,CAAC,EAC1C,MAAM,MAAM,CAAC,cAAc,EAAE,YAAY,CAAC,CAC3C,CAAC;IACF,MAAM,SAAS,CACb,IAAI,CAAC,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,IAAI,KAAK,CAAC,EAC9C,MAAM,MAAM,CACV,cAAc,CAAC;QACb,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;QAC1B,IAAI,EAAE,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;QAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC,EACF,YAAY,CACb,CACF,CAAC;IACF,MAAM,iBAAiB,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC;IAE9C,KAAK,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,IAAI,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;QACnD,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC;QAC3E,MAAM,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC;QACpC,MAAM,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IAChE,CAAC;IAED,MAAM,QAAQ,CAAC,OAAO,CAAC,CAAC;IACxB,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC;IACrF,MAAM,aAAa,CACjB,OAAO,EACP,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,QAAQ,EAAE,EAAE,CAAC,CAAC,CAC1F,CAAC;IACF,IAAI,MAAM,CAAC,MAAM,CAAC,MAAM;QACtB,QAAQ,CAAC,IAAI,CACX,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,mEAAmE,CACnG,CAAC;IACJ,GAAG,CACD,aAAa,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,4BAA4B,IAAI,WAAW,KAAK,WAAW,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,YAAY,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,CACjL,CAAC;IACF,OAAO;QACL,KAAK;QACL,IAAI,EAAE,aAAa,QAAQ,MAAM;QACjC,QAAQ;QACR,QAAQ;QACR,MAAM;QACN,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE;QAChE,GAAG,EAAE,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,CAAC,IAAI,EAAE;KACrF,CAAC;AACJ,CAAC;AAED,+FAA+F;AAC/F,KAAK,UAAU,YAAY,CACzB,GAAc,EACd,OAAgC,EAChC,OAAe,EACf,QAAgB;IAEhB,MAAM,KAAK,GAAG,CAAC,GAAW,EAAU,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC;IAChE,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAC9B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,YAAY,KAAK,UAAU,IAAI,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,GAAG,GAAG,CACjF,CAAC;IACF,MAAM,KAAK,GACT,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,OAAO,CAAC,CAAC;QAC5D,SAAS,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3D,MAAM,OAAO,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAChE,MAAM,OAAO,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,OAAO,QAAQ,OAAO,CAAC,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;IACjG,MAAM,GAAG,GAAG,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAC7D,MAAM,QAAQ,GAAG,OAAO,KAAK,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClE,IAAI,GAAG,IAAI,QAAQ,EAAE,CAAC;QACpB,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC;QACnE,MAAM,QAAQ,GAAG,WAAW,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC;QACxE,OAAO,QAAQ,IAAI,QAAQ,GAAG,GAAG;YAC/B,CAAC,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE;YAC5C,CAAC,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IACtD,CAAC;IACD,IAAI,GAAG;QAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IACjE,IAAI,QAAQ;QAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;IACrE,MAAM,IAAI,KAAK,CAAC,kBAAkB,GAAG,CAAC,GAAG,gDAAgD,CAAC,CAAC;AAC7F,CAAC;AAED,SAAS,aAAa,CAAC,IAAiB;IACtC,IAAI,IAAI,CAAC,GAAG,KAAK,OAAO;QAAE,OAAO,IAAI,CAAC;IACtC,IAAI,IAAI,CAAC,GAAG,KAAK,MAAM;QAAE,OAAO,KAAK,CAAC;IACtC,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACpD,OAAO,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,OAAO,CAAC,CAAC;AACjG,CAAC;AAED,SAAS,KAAK,CAAC,IAAiB,EAAE,IAAoC;IACpE,MAAM,GAAG,GAAkB,EAAE,CAAC;IAC9B,MAAM,IAAI,GAAG,CAAC,IAAiB,EAAQ,EAAE;QACvC,IAAI,IAAI,CAAC,IAAI,CAAC;YAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/B,KAAK,MAAM,KAAK,IAAI,eAAe,CAAC,IAAI,CAAC;YAAE,IAAI,CAAC,KAAK,CAAC,CAAC;IACzD,CAAC,CAAC;IACF,IAAI,CAAC,IAAI,CAAC,CAAC;IACX,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,UAAU,CAAC,IAAiB;IACnC,MAAM,GAAG,GAA2B,EAAE,CAAC;IACvC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;QACvC,IAAI,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;YACzD,GAAG,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,cAAc,CAAC,KAAK,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAS,aAAa,CAAC,IAAiB;IACtC,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,KAAK,EAAE,EAAE,CAAC,GAAG,GAAG,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC;AACrF,CAAC;AAED,SAAS,OAAO,CAAC,OAAuB;IACtC,OAAO,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QACrD,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC;QAChD,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;AACpB,CAAC;AAED,SAAS,cAAc,CAAC,KAAa;IACnC,MAAM,IAAI,GAAG,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,EAAE,CAAC;IACzD,OAAO,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;AAC1D,CAAC"}
@@ -0,0 +1,299 @@
1
+ /**
2
+ * Just enough CSS structure for the converter: a rule tree (brace matching that respects
3
+ * strings and comments), url() rewriting, and splitting rules between a shared sheet and
4
+ * per-section sheets by the class and id names each selector needs.
5
+ */
6
+ const GROUPING = /^@(media|supports|layer|container|document|scope|starting-style)\b/i;
7
+ /** Parses a stylesheet into rules. Unbalanced input ends the current block instead of throwing. */
8
+ export function parseCss(source) {
9
+ const text = stripComments(source);
10
+ let index = 0;
11
+ const parseBlock = () => {
12
+ const rules = [];
13
+ let start = index;
14
+ while (index < text.length) {
15
+ const ch = text[index];
16
+ if (ch === '"' || ch === "'") {
17
+ index = skipString(text, index);
18
+ continue;
19
+ }
20
+ if (ch === '}') {
21
+ index++;
22
+ return rules;
23
+ }
24
+ if (ch === ';') {
25
+ const statement = text.slice(start, index).trim();
26
+ if (statement.startsWith('@'))
27
+ rules.push({ prelude: statement, body: '', children: null });
28
+ index++;
29
+ start = index;
30
+ continue;
31
+ }
32
+ if (ch === '{') {
33
+ const prelude = text.slice(start, index).trim();
34
+ index++;
35
+ if (GROUPING.test(prelude)) {
36
+ rules.push({ prelude, body: '', children: parseBlock() });
37
+ }
38
+ else {
39
+ const bodyStart = index;
40
+ index = matchBrace(text, index);
41
+ rules.push({ prelude, body: text.slice(bodyStart, index).trim(), children: null });
42
+ index++;
43
+ }
44
+ start = index;
45
+ continue;
46
+ }
47
+ index++;
48
+ }
49
+ return rules;
50
+ };
51
+ return parseBlock();
52
+ }
53
+ export function printCss(rules, indent = '') {
54
+ const out = [];
55
+ for (const rule of rules) {
56
+ if (rule.children) {
57
+ const inner = printCss(rule.children, `${indent} `);
58
+ if (inner.trim())
59
+ out.push(`${indent}${rule.prelude} {\n${inner}\n${indent}}`);
60
+ }
61
+ else if (!rule.body && rule.prelude.startsWith('@') && !rule.prelude.includes('{')) {
62
+ out.push(`${indent}${rule.prelude};`);
63
+ }
64
+ else {
65
+ const decls = splitDeclarations(rule.body);
66
+ const body = decls.length
67
+ ? decls.map((decl) => `${indent} ${decl};`).join('\n')
68
+ : `${indent} ${rule.body}`;
69
+ out.push(`${indent}${rule.prelude.replace(/\s+/g, ' ')} {\n${body}\n${indent}}`);
70
+ }
71
+ }
72
+ return out.join('\n\n');
73
+ }
74
+ /** Declarations of a rule body; nested blocks (keyframe steps, CSS nesting) stay whole. */
75
+ function splitDeclarations(body) {
76
+ if (body.includes('{'))
77
+ return [];
78
+ const out = [];
79
+ let start = 0;
80
+ let depth = 0;
81
+ for (let i = 0; i < body.length; i++) {
82
+ const ch = body[i];
83
+ if (ch === '"' || ch === "'") {
84
+ i = skipString(body, i) - 1;
85
+ continue;
86
+ }
87
+ if (ch === '(')
88
+ depth++;
89
+ else if (ch === ')')
90
+ depth = Math.max(0, depth - 1);
91
+ else if (ch === ';' && depth === 0) {
92
+ const decl = body.slice(start, i).trim();
93
+ if (decl)
94
+ out.push(decl);
95
+ start = i + 1;
96
+ }
97
+ }
98
+ const last = body.slice(start).trim();
99
+ if (last)
100
+ out.push(last);
101
+ return out;
102
+ }
103
+ function stripComments(source) {
104
+ let out = '';
105
+ let i = 0;
106
+ while (i < source.length) {
107
+ const ch = source[i];
108
+ if (ch === '"' || ch === "'") {
109
+ const end = skipString(source, i);
110
+ out += source.slice(i, end);
111
+ i = end;
112
+ continue;
113
+ }
114
+ if (ch === '/' && source[i + 1] === '*') {
115
+ const end = source.indexOf('*/', i + 2);
116
+ i = end === -1 ? source.length : end + 2;
117
+ continue;
118
+ }
119
+ out += ch ?? '';
120
+ i++;
121
+ }
122
+ return out;
123
+ }
124
+ function skipString(text, start) {
125
+ const quote = text[start];
126
+ let i = start + 1;
127
+ while (i < text.length) {
128
+ const ch = text[i];
129
+ if (ch === '\\')
130
+ i += 2;
131
+ else if (ch === quote || ch === '\n')
132
+ return i + 1;
133
+ else
134
+ i++;
135
+ }
136
+ return text.length;
137
+ }
138
+ /** Index of the `}` closing a block that starts at `start` (just after its `{`). */
139
+ function matchBrace(text, start) {
140
+ let depth = 1;
141
+ let i = start;
142
+ while (i < text.length) {
143
+ const ch = text[i];
144
+ if (ch === '"' || ch === "'") {
145
+ i = skipString(text, i);
146
+ continue;
147
+ }
148
+ if (ch === '{')
149
+ depth++;
150
+ else if (ch === '}' && --depth === 0)
151
+ return i;
152
+ i++;
153
+ }
154
+ return text.length;
155
+ }
156
+ /** Rewrites every url(...) (and @import "...") through `map`; unmapped URLs stay as they were. */
157
+ export function rewriteCssUrls(source, map) {
158
+ const swap = (raw) => {
159
+ const url = raw.trim();
160
+ if (!url || url.startsWith('data:') || url.startsWith('#'))
161
+ return null;
162
+ return map(url);
163
+ };
164
+ return source
165
+ .replace(/url\(\s*(["']?)([^"')]*)\1\s*\)/gi, (match, _quote, url) => {
166
+ const local = swap(url);
167
+ return local === null ? match : `url('${local}')`;
168
+ })
169
+ .replace(/@import\s+(["'])([^"']+)\1/gi, (match, _quote, url) => {
170
+ const local = swap(url);
171
+ return local === null ? match : `@import '${local}'`;
172
+ });
173
+ }
174
+ /** Class and id names a selector needs, ignoring functional pseudo-classes and attributes. */
175
+ export function selectorTokens(selector) {
176
+ let text = selector;
177
+ for (let guard = 0; guard < 6 && /:[\w-]+\(/.test(text); guard++) {
178
+ text = text.replace(/:[\w-]+\((?:[^()]|\([^()]*\))*\)/g, '');
179
+ }
180
+ text = text.replace(/\[[^\]]*\]/g, '').replace(/::?[\w-]+/g, '');
181
+ const tokens = [];
182
+ for (const match of text.matchAll(/([.#])((?:[\w-]|\\.)+)/g)) {
183
+ const name = (match[2] ?? '').replace(/\\(.)/g, '$1');
184
+ if (name)
185
+ tokens.push(`${match[1] ?? ''}${name}`);
186
+ }
187
+ return tokens;
188
+ }
189
+ /** Splits a selector list at top-level commas. */
190
+ export function splitSelectors(prelude) {
191
+ const out = [];
192
+ let depth = 0;
193
+ let start = 0;
194
+ for (let i = 0; i < prelude.length; i++) {
195
+ const ch = prelude[i];
196
+ if (ch === '(' || ch === '[')
197
+ depth++;
198
+ else if (ch === ')' || ch === ']')
199
+ depth = Math.max(0, depth - 1);
200
+ else if (ch === ',' && depth === 0) {
201
+ out.push(prelude.slice(start, i).trim());
202
+ start = i + 1;
203
+ }
204
+ }
205
+ out.push(prelude.slice(start).trim());
206
+ return out.filter(Boolean);
207
+ }
208
+ export const SHARED = -1;
209
+ /**
210
+ * Splits rules into a shared sheet and one sheet per section. `owners` maps `.class`/`#id` to
211
+ * the sections whose elements carry it (SHARED when page-level elements carry it too). A rule
212
+ * moves into a section only when every selector in it belongs to that one section, so shared
213
+ * styling and cascade order between sections never change.
214
+ */
215
+ export function splitRules(rules, owners) {
216
+ const shared = [];
217
+ const sections = new Map();
218
+ const push = (owner, rule, into) => {
219
+ if (owner === SHARED) {
220
+ (into ?? shared).push(rule);
221
+ return;
222
+ }
223
+ const list = sections.get(owner) ?? [];
224
+ sections.set(owner, list);
225
+ list.push(rule);
226
+ };
227
+ for (const rule of rules) {
228
+ if (rule.children && /^@(media|supports|container)\b/i.test(rule.prelude)) {
229
+ const inner = splitRules(rule.children, owners);
230
+ if (inner.shared.length)
231
+ shared.push({ ...rule, children: inner.shared });
232
+ for (const [owner, list] of inner.sections) {
233
+ push(owner, { ...rule, children: list }, null);
234
+ }
235
+ continue;
236
+ }
237
+ push(rule.children || rule.prelude.startsWith('@') ? SHARED : ruleOwner(rule.prelude, owners), rule, null);
238
+ }
239
+ return { shared, sections };
240
+ }
241
+ export function ruleOwner(prelude, owners) {
242
+ let result = null;
243
+ for (const selector of splitSelectors(prelude)) {
244
+ const owner = selectorOwner(selector, owners);
245
+ if (owner === SHARED || (result !== null && owner !== result))
246
+ return SHARED;
247
+ result = owner;
248
+ }
249
+ return result ?? SHARED;
250
+ }
251
+ function selectorOwner(selector, owners) {
252
+ const tokens = selectorTokens(selector);
253
+ if (!tokens.length)
254
+ return SHARED;
255
+ let candidates = null;
256
+ let narrowest = null;
257
+ for (const token of tokens) {
258
+ const set = owners.get(token);
259
+ if (!set)
260
+ continue;
261
+ if (set.has(SHARED))
262
+ return SHARED;
263
+ if (!narrowest || set.size < narrowest.size)
264
+ narrowest = set;
265
+ const next = new Set();
266
+ for (const owner of candidates ?? set)
267
+ if (set.has(owner))
268
+ next.add(owner);
269
+ candidates = next;
270
+ }
271
+ if (candidates?.size === 1)
272
+ return [...candidates][0] ?? SHARED;
273
+ // Class combinations that only appear once scripts run (`.menu.is-open`): follow the rarest name.
274
+ if (candidates?.size === 0 && narrowest?.size === 1)
275
+ return [...narrowest][0] ?? SHARED;
276
+ return SHARED;
277
+ }
278
+ /** Font families declared by @font-face rules. */
279
+ export function declaredFamilies(rules) {
280
+ const families = new Set();
281
+ for (const rule of rules) {
282
+ if (rule.children)
283
+ for (const family of declaredFamilies(rule.children))
284
+ families.add(family);
285
+ else if (/^@font-face/i.test(rule.prelude)) {
286
+ const match = /font-family\s*:\s*([^;]+)/i.exec(rule.body);
287
+ if (match?.[1])
288
+ families.add(unquote(match[1]));
289
+ }
290
+ }
291
+ return families;
292
+ }
293
+ export function unquote(value) {
294
+ return value
295
+ .trim()
296
+ .replace(/^["']|["']$/g, '')
297
+ .trim();
298
+ }
299
+ //# sourceMappingURL=css.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"css.js","sourceRoot":"","sources":["../../../src/project/convert/css.ts"],"names":[],"mappings":"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"}