md2cv 1.0.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 (87) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/LICENSE +674 -0
  3. package/README.md +219 -0
  4. package/dist/bin.d.ts +6 -0
  5. package/dist/bin.d.ts.map +1 -0
  6. package/dist/bin.js +10 -0
  7. package/dist/bin.js.map +1 -0
  8. package/dist/cli/index.d.ts +50 -0
  9. package/dist/cli/index.d.ts.map +1 -0
  10. package/dist/cli/index.js +278 -0
  11. package/dist/cli/index.js.map +1 -0
  12. package/dist/generator/index.d.ts +36 -0
  13. package/dist/generator/index.d.ts.map +1 -0
  14. package/dist/generator/index.js +302 -0
  15. package/dist/generator/index.js.map +1 -0
  16. package/dist/generator/resume_en.d.ts +22 -0
  17. package/dist/generator/resume_en.d.ts.map +1 -0
  18. package/dist/generator/resume_en.js +524 -0
  19. package/dist/generator/resume_en.js.map +1 -0
  20. package/dist/generator/resume_ja.d.ts +22 -0
  21. package/dist/generator/resume_ja.d.ts.map +1 -0
  22. package/dist/generator/resume_ja.js +440 -0
  23. package/dist/generator/resume_ja.js.map +1 -0
  24. package/dist/generator/rirekisho/components.d.ts +83 -0
  25. package/dist/generator/rirekisho/components.d.ts.map +1 -0
  26. package/dist/generator/rirekisho/components.js +405 -0
  27. package/dist/generator/rirekisho/components.js.map +1 -0
  28. package/dist/generator/rirekisho/data.d.ts +18 -0
  29. package/dist/generator/rirekisho/data.d.ts.map +1 -0
  30. package/dist/generator/rirekisho/data.js +274 -0
  31. package/dist/generator/rirekisho/data.js.map +1 -0
  32. package/dist/generator/rirekisho/index.d.ts +20 -0
  33. package/dist/generator/rirekisho/index.d.ts.map +1 -0
  34. package/dist/generator/rirekisho/index.js +67 -0
  35. package/dist/generator/rirekisho/index.js.map +1 -0
  36. package/dist/generator/rirekisho/layout.d.ts +20 -0
  37. package/dist/generator/rirekisho/layout.d.ts.map +1 -0
  38. package/dist/generator/rirekisho/layout.js +354 -0
  39. package/dist/generator/rirekisho/layout.js.map +1 -0
  40. package/dist/generator/rirekisho/styles.d.ts +9 -0
  41. package/dist/generator/rirekisho/styles.d.ts.map +1 -0
  42. package/dist/generator/rirekisho/styles.js +362 -0
  43. package/dist/generator/rirekisho/styles.js.map +1 -0
  44. package/dist/generator/rirekisho/types.d.ts +163 -0
  45. package/dist/generator/rirekisho/types.d.ts.map +1 -0
  46. package/dist/generator/rirekisho/types.js +80 -0
  47. package/dist/generator/rirekisho/types.js.map +1 -0
  48. package/dist/index.d.ts +10 -0
  49. package/dist/index.d.ts.map +1 -0
  50. package/dist/index.js +10 -0
  51. package/dist/index.js.map +1 -0
  52. package/dist/parser/index.d.ts +21 -0
  53. package/dist/parser/index.d.ts.map +1 -0
  54. package/dist/parser/index.js +639 -0
  55. package/dist/parser/index.js.map +1 -0
  56. package/dist/types/config.d.ts +64 -0
  57. package/dist/types/config.d.ts.map +1 -0
  58. package/dist/types/config.js +5 -0
  59. package/dist/types/config.js.map +1 -0
  60. package/dist/types/errors.d.ts +78 -0
  61. package/dist/types/errors.d.ts.map +1 -0
  62. package/dist/types/errors.js +146 -0
  63. package/dist/types/errors.js.map +1 -0
  64. package/dist/types/index.d.ts +9 -0
  65. package/dist/types/index.d.ts.map +1 -0
  66. package/dist/types/index.js +9 -0
  67. package/dist/types/index.js.map +1 -0
  68. package/dist/types/metadata.d.ts +55 -0
  69. package/dist/types/metadata.d.ts.map +1 -0
  70. package/dist/types/metadata.js +136 -0
  71. package/dist/types/metadata.js.map +1 -0
  72. package/dist/types/result.d.ts +50 -0
  73. package/dist/types/result.d.ts.map +1 -0
  74. package/dist/types/result.js +74 -0
  75. package/dist/types/result.js.map +1 -0
  76. package/dist/types/sections.d.ts +168 -0
  77. package/dist/types/sections.d.ts.map +1 -0
  78. package/dist/types/sections.js +122 -0
  79. package/dist/types/sections.js.map +1 -0
  80. package/dist/validator/index.d.ts +20 -0
  81. package/dist/validator/index.d.ts.map +1 -0
  82. package/dist/validator/index.js +67 -0
  83. package/dist/validator/index.js.map +1 -0
  84. package/examples/example-cv-en.md +77 -0
  85. package/examples/example-cv-ja.md +116 -0
  86. package/examples/sample-photo.png +0 -0
  87. package/package.json +93 -0
@@ -0,0 +1,524 @@
1
+ /**
2
+ * English CV Generator
3
+ * Generates HTML for English CV format with Times font family
4
+ */
5
+ /**
6
+ * Page size dimensions in mm
7
+ */
8
+ const PAGE_SIZES = {
9
+ a3: { width: 420, height: 297 },
10
+ a4: { width: 210, height: 297 },
11
+ b4: { width: 364, height: 257 },
12
+ b5: { width: 176, height: 250 },
13
+ letter: { width: 215.9, height: 279.4 },
14
+ };
15
+ /**
16
+ * Escape HTML special characters
17
+ */
18
+ function escapeHtml(text) {
19
+ return text
20
+ .replace(/&/g, '&')
21
+ .replace(/</g, '&lt;')
22
+ .replace(/>/g, '&gt;')
23
+ .replace(/"/g, '&quot;')
24
+ .replace(/'/g, '&#039;');
25
+ }
26
+ /**
27
+ * Format date for display
28
+ */
29
+ function formatDate(date) {
30
+ if (!date)
31
+ return '';
32
+ const months = [
33
+ 'Jan',
34
+ 'Feb',
35
+ 'Mar',
36
+ 'Apr',
37
+ 'May',
38
+ 'Jun',
39
+ 'Jul',
40
+ 'Aug',
41
+ 'Sep',
42
+ 'Oct',
43
+ 'Nov',
44
+ 'Dec',
45
+ ];
46
+ return `${months[date.getMonth()]} ${date.getFullYear()}`;
47
+ }
48
+ /**
49
+ * Format end date which can be Date or 'present'
50
+ */
51
+ function formatEndDate(end) {
52
+ if (!end)
53
+ return '';
54
+ if (end === 'present')
55
+ return 'Present';
56
+ return formatDate(end);
57
+ }
58
+ /**
59
+ * Format date range
60
+ */
61
+ function formatDateRange(start, end) {
62
+ const startStr = formatDate(start);
63
+ const endStr = formatEndDate(end);
64
+ if (startStr && endStr)
65
+ return `${startStr} - ${endStr}`;
66
+ if (startStr)
67
+ return startStr;
68
+ return '';
69
+ }
70
+ /**
71
+ * Generate base CSS styles
72
+ */
73
+ function generateStyles(paperSize) {
74
+ const size = PAGE_SIZES[paperSize];
75
+ return `
76
+ @page {
77
+ size: ${size.width}mm ${size.height}mm;
78
+ margin: 15mm;
79
+ }
80
+ * {
81
+ margin: 0;
82
+ padding: 0;
83
+ box-sizing: border-box;
84
+ }
85
+ body {
86
+ font-family: "Times New Roman", Times, serif;
87
+ font-size: 11pt;
88
+ line-height: 1.4;
89
+ color: #333;
90
+ background: #fff;
91
+ max-width: 800px;
92
+ margin: 0 auto;
93
+ padding: 20px;
94
+ }
95
+ header {
96
+ text-align: center;
97
+ margin-bottom: 16px;
98
+ padding-bottom: 12px;
99
+ }
100
+ h1 {
101
+ font-size: 20pt;
102
+ font-weight: bold;
103
+ margin-bottom: 6px;
104
+ color: #000;
105
+ }
106
+ .contact-info {
107
+ font-size: 10pt;
108
+ color: #333;
109
+ }
110
+ .contact-info a {
111
+ color: #333;
112
+ text-decoration: none;
113
+ }
114
+ .contact-info a:hover {
115
+ text-decoration: underline;
116
+ }
117
+ section {
118
+ margin-bottom: 14px;
119
+ page-break-inside: avoid;
120
+ break-inside: avoid;
121
+ }
122
+ .entry {
123
+ page-break-inside: avoid;
124
+ break-inside: avoid;
125
+ }
126
+ h2 {
127
+ font-size: 12pt;
128
+ font-weight: bold;
129
+ text-transform: uppercase;
130
+ border-bottom: 1px solid #333;
131
+ padding-bottom: 2px;
132
+ margin-bottom: 8px;
133
+ color: #000;
134
+ }
135
+ .entry {
136
+ margin-bottom: 10px;
137
+ }
138
+ .entry-header {
139
+ display: flex;
140
+ justify-content: space-between;
141
+ align-items: baseline;
142
+ flex-wrap: wrap;
143
+ }
144
+ .entry-title {
145
+ font-weight: bold;
146
+ color: #000;
147
+ }
148
+ .entry-subtitle {
149
+ font-style: italic;
150
+ color: #333;
151
+ font-size: 10pt;
152
+ }
153
+ .entry-date {
154
+ color: #333;
155
+ font-size: 10pt;
156
+ }
157
+ .entry-location {
158
+ color: #555;
159
+ font-size: 10pt;
160
+ }
161
+ .entry-summary {
162
+ margin-top: 3px;
163
+ font-size: 10pt;
164
+ }
165
+ ul {
166
+ margin-left: 18px;
167
+ margin-top: 3px;
168
+ }
169
+ li {
170
+ margin-bottom: 2px;
171
+ font-size: 10pt;
172
+ }
173
+ p {
174
+ margin-bottom: 6px;
175
+ font-size: 10pt;
176
+ }
177
+ .role {
178
+ margin-bottom: 8px;
179
+ }
180
+ .role-header {
181
+ display: flex;
182
+ justify-content: space-between;
183
+ align-items: baseline;
184
+ }
185
+ .project {
186
+ margin-left: 15px;
187
+ margin-top: 4px;
188
+ }
189
+ .project-name {
190
+ font-weight: 500;
191
+ font-size: 10pt;
192
+ }
193
+ .competency-entry {
194
+ margin-bottom: 4px;
195
+ font-size: 10pt;
196
+ }
197
+ .competency-header {
198
+ font-weight: bold;
199
+ }
200
+ .skills-grid {
201
+ display: grid;
202
+ grid-template-columns: 1fr 1fr 1fr;
203
+ gap: 2px 20px;
204
+ }
205
+ .skill-item {
206
+ font-size: 10pt;
207
+ }
208
+ .skill-category {
209
+ margin-bottom: 4px;
210
+ font-size: 10pt;
211
+ }
212
+ .skill-category-name {
213
+ font-weight: bold;
214
+ }
215
+ .cert-item {
216
+ font-size: 9pt;
217
+ color: #000;
218
+ margin-bottom: 2px;
219
+ }
220
+ .lang-item {
221
+ font-size: 9pt;
222
+ }
223
+ @media print {
224
+ body {
225
+ padding: 0;
226
+ max-width: none;
227
+ }
228
+ }
229
+ `;
230
+ }
231
+ /**
232
+ * Render education section
233
+ * Format:
234
+ * <school> —— <start - end>
235
+ * <degree> — <location>
236
+ * <details>
237
+ */
238
+ function renderEducation(entries) {
239
+ return entries
240
+ .map((entry) => {
241
+ const dateRange = formatDateRange(entry.start, entry.end);
242
+ let html = '<div class="entry">';
243
+ // Title line: <school> —— <date range>
244
+ html += '<div class="entry-header">';
245
+ html += `<span class="entry-title">${escapeHtml(entry.school)}</span>`;
246
+ if (dateRange) {
247
+ html += `<span class="entry-date">${escapeHtml(dateRange)}</span>`;
248
+ }
249
+ html += '</div>';
250
+ // Subtitle line: <degree> — <location>
251
+ const subtitleParts = [];
252
+ if (entry.degree) {
253
+ subtitleParts.push(escapeHtml(entry.degree));
254
+ }
255
+ if (entry.location) {
256
+ subtitleParts.push(escapeHtml(entry.location));
257
+ }
258
+ if (subtitleParts.length > 0) {
259
+ html += `<div class="entry-subtitle">${subtitleParts.join(' — ')}</div>`;
260
+ }
261
+ // Details
262
+ if (entry.details && entry.details.length > 0) {
263
+ html += '<ul>';
264
+ for (const detail of entry.details) {
265
+ html += `<li>${escapeHtml(detail)}</li>`;
266
+ }
267
+ html += '</ul>';
268
+ }
269
+ html += '</div>';
270
+ return html;
271
+ })
272
+ .join('\n');
273
+ }
274
+ /**
275
+ * Render experience section
276
+ * Format:
277
+ * <company name> -- <role> <start - end>
278
+ * <team_name> -- <location>
279
+ * <summary>
280
+ * <highlights>
281
+ */
282
+ function renderExperience(entries) {
283
+ return entries
284
+ .flatMap((entry) => {
285
+ return entry.roles.map((role) => {
286
+ const dateRange = formatDateRange(role.start, role.end);
287
+ let html = '<div class="entry">';
288
+ // Section title: <company> —— <role> <date range>
289
+ html += '<div class="entry-header">';
290
+ html += `<span class="entry-title">${escapeHtml(entry.company)} —— ${escapeHtml(role.title)}</span>`;
291
+ if (dateRange) {
292
+ html += `<span class="entry-date">${escapeHtml(dateRange)}</span>`;
293
+ }
294
+ html += '</div>';
295
+ // Sub title: <team> — <location>
296
+ const subtitleParts = [];
297
+ if (role.team) {
298
+ subtitleParts.push(escapeHtml(role.team));
299
+ }
300
+ if (entry.location) {
301
+ subtitleParts.push(escapeHtml(entry.location));
302
+ }
303
+ if (subtitleParts.length > 0) {
304
+ html += `<div class="entry-subtitle">${subtitleParts.join(' — ')}</div>`;
305
+ }
306
+ // Summary
307
+ if (role.summary && role.summary.length > 0) {
308
+ html += '<div class="entry-summary">';
309
+ html += role.summary.map((s) => escapeHtml(s)).join(' ');
310
+ html += '</div>';
311
+ }
312
+ // Highlights
313
+ if (role.highlights && role.highlights.length > 0) {
314
+ html += '<ul>';
315
+ for (const highlight of role.highlights) {
316
+ html += `<li>${escapeHtml(highlight)}</li>`;
317
+ }
318
+ html += '</ul>';
319
+ }
320
+ // Projects
321
+ if (role.projects && role.projects.length > 0) {
322
+ for (const project of role.projects) {
323
+ const projDateRange = formatDateRange(project.start, project.end);
324
+ html += '<div class="project">';
325
+ html += `<span class="project-name">${escapeHtml(project.name)}</span>`;
326
+ if (projDateRange) {
327
+ html += ` <span class="entry-date">(${escapeHtml(projDateRange)})</span>`;
328
+ }
329
+ if (project.bullets && project.bullets.length > 0) {
330
+ html += '<ul>';
331
+ for (const bullet of project.bullets) {
332
+ html += `<li>${escapeHtml(bullet)}</li>`;
333
+ }
334
+ html += '</ul>';
335
+ }
336
+ html += '</div>';
337
+ }
338
+ }
339
+ html += '</div>';
340
+ return html;
341
+ });
342
+ })
343
+ .join('\n');
344
+ }
345
+ /**
346
+ * Render certifications section
347
+ */
348
+ function renderCertifications(entries) {
349
+ return entries
350
+ .map((entry) => {
351
+ let html = `<div class="cert-item">• ${escapeHtml(entry.name)}`;
352
+ if (entry.date) {
353
+ html += ` (${escapeHtml(formatDate(entry.date))})`;
354
+ }
355
+ html += '</div>';
356
+ return html;
357
+ })
358
+ .join('\n');
359
+ }
360
+ /**
361
+ * Default number of columns for skills grid
362
+ */
363
+ const DEFAULT_SKILLS_COLUMNS = 3;
364
+ /**
365
+ * Render skills section - supports grid and categorized formats
366
+ */
367
+ function renderSkills(entries, options) {
368
+ // Check if categorized format (entries have non-empty category with description)
369
+ const isCategorized = options.format === 'categorized' ||
370
+ entries.some(e => e.category && (e.description || e.items.length > 0));
371
+ if (isCategorized && entries.some(e => e.category)) {
372
+ // Categorized format: • <category>: <description or items>
373
+ return entries
374
+ .filter(e => e.category)
375
+ .map((entry) => {
376
+ const content = entry.description || entry.items.join(', ');
377
+ return `<div class="skill-category">• <span class="skill-category-name">${escapeHtml(entry.category)}:</span> ${escapeHtml(content)}</div>`;
378
+ })
379
+ .join('\n');
380
+ }
381
+ // Grid format: flatten all items
382
+ const allItems = [];
383
+ for (const entry of entries) {
384
+ for (const item of entry.items) {
385
+ allItems.push(item);
386
+ }
387
+ }
388
+ if (allItems.length === 0) {
389
+ return '';
390
+ }
391
+ const columns = options.columns ?? DEFAULT_SKILLS_COLUMNS;
392
+ let html = `<div class="skills-grid" style="grid-template-columns: repeat(${columns}, 1fr);">`;
393
+ for (const item of allItems) {
394
+ html += `<div class="skill-item">• ${escapeHtml(item)}</div>`;
395
+ }
396
+ html += '</div>';
397
+ return html;
398
+ }
399
+ /**
400
+ * Render skills from list content as grid
401
+ */
402
+ function renderSkillsList(items, columns = DEFAULT_SKILLS_COLUMNS) {
403
+ if (items.length === 0) {
404
+ return '';
405
+ }
406
+ let html = `<div class="skills-grid" style="grid-template-columns: repeat(${columns}, 1fr);">`;
407
+ for (const item of items) {
408
+ html += `<div class="skill-item">• ${escapeHtml(item)}</div>`;
409
+ }
410
+ html += '</div>';
411
+ return html;
412
+ }
413
+ /**
414
+ * Render core competencies section
415
+ */
416
+ function renderCompetencies(entries) {
417
+ return entries
418
+ .map((entry) => {
419
+ return `<div class="competency-entry"><span class="competency-header">${escapeHtml(entry.header)}:</span> ${escapeHtml(entry.description)}</div>`;
420
+ })
421
+ .join('\n');
422
+ }
423
+ /**
424
+ * Render languages section
425
+ */
426
+ function renderLanguages(entries) {
427
+ return entries
428
+ .map((entry) => {
429
+ let html = `<span class="lang-item">${escapeHtml(entry.language)}`;
430
+ if (entry.level) {
431
+ html += ` (${escapeHtml(entry.level)})`;
432
+ }
433
+ html += '</span>';
434
+ return html;
435
+ })
436
+ .join(' • ');
437
+ }
438
+ /**
439
+ * Render section content
440
+ */
441
+ function renderSectionContent(content, sectionId) {
442
+ switch (content.type) {
443
+ case 'text':
444
+ return `<p>${escapeHtml(content.text)}</p>`;
445
+ case 'list':
446
+ // For skills section, render as grid
447
+ if (sectionId === 'skills') {
448
+ return renderSkillsList(content.items);
449
+ }
450
+ return ('<ul>' + content.items.map((item) => `<li>${escapeHtml(item)}</li>`).join('\n') + '</ul>');
451
+ case 'education':
452
+ return renderEducation(content.entries);
453
+ case 'experience':
454
+ return renderExperience(content.entries);
455
+ case 'certifications':
456
+ return renderCertifications(content.entries);
457
+ case 'skills':
458
+ return renderSkills(content.entries, content.options);
459
+ case 'competencies':
460
+ return renderCompetencies(content.entries);
461
+ case 'languages':
462
+ return renderLanguages(content.entries);
463
+ case 'table':
464
+ // Tables are mainly for rirekisho, render as list for resume
465
+ return ('<ul>' +
466
+ content.rows.map((row) => `<li>${escapeHtml(row.content)}</li>`).join('\n') +
467
+ '</ul>');
468
+ default:
469
+ return '';
470
+ }
471
+ }
472
+ /**
473
+ * Render contact info line: home_address | phone_number | email | linkedin
474
+ */
475
+ function renderContactInfo(cv) {
476
+ const parts = [];
477
+ if (cv.metadata.home_address) {
478
+ parts.push(escapeHtml(cv.metadata.home_address));
479
+ }
480
+ parts.push(escapeHtml(cv.metadata.phone_number));
481
+ parts.push(`<a href="mailto:${escapeHtml(cv.metadata.email_address)}">${escapeHtml(cv.metadata.email_address)}</a>`);
482
+ if (cv.metadata.linkedin) {
483
+ const linkedinUrl = cv.metadata.linkedin;
484
+ parts.push(`<a href="${escapeHtml(linkedinUrl)}">${escapeHtml(linkedinUrl)}</a>`);
485
+ }
486
+ return parts.join(' | ');
487
+ }
488
+ /**
489
+ * Generate English HTML CV
490
+ */
491
+ export function generateCVEnHTML(cv, options) {
492
+ const styles = generateStyles(options.paperSize);
493
+ const name = cv.metadata.name;
494
+ const contactHtml = renderContactInfo(cv);
495
+ // Use sections in the order provided (already filtered and ordered by generator/index.ts)
496
+ const sectionsHtml = cv.sections
497
+ .map((section) => {
498
+ return `
499
+ <section>
500
+ <h2>${escapeHtml(section.title)}</h2>
501
+ ${renderSectionContent(section.content, section.id)}
502
+ </section>`;
503
+ })
504
+ .join('\n');
505
+ return `<!DOCTYPE html>
506
+ <html lang="en">
507
+ <head>
508
+ <meta charset="UTF-8">
509
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
510
+ <title>${escapeHtml(name)} - CV</title>
511
+ <style>${styles}</style>
512
+ </head>
513
+ <body>
514
+ <header>
515
+ <h1>${escapeHtml(name)}</h1>
516
+ <div class="contact-info">${contactHtml}</div>
517
+ </header>
518
+ <main>
519
+ ${sectionsHtml}
520
+ </main>
521
+ </body>
522
+ </html>`;
523
+ }
524
+ //# sourceMappingURL=resume_en.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume_en.js","sourceRoot":"","sources":["../../src/generator/resume_en.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Japanese CV Generator (職務経歴書スタイル)
3
+ * Generates HTML for Japanese CV format with Mincho font
4
+ */
5
+ import type { PaperSize } from '../types/config.js';
6
+ import type { CVMetadata } from '../types/metadata.js';
7
+ import type { ParsedSection } from '../types/sections.js';
8
+ export interface CVJaOptions {
9
+ readonly paperSize: PaperSize;
10
+ }
11
+ /**
12
+ * Input for CV generation
13
+ */
14
+ export interface CVInput {
15
+ readonly metadata: CVMetadata;
16
+ readonly sections: readonly ParsedSection[];
17
+ }
18
+ /**
19
+ * Generate Japanese HTML CV
20
+ */
21
+ export declare function generateCVJaHTML(cv: CVInput, options: CVJaOptions): string;
22
+ //# sourceMappingURL=resume_ja.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resume_ja.d.ts","sourceRoot":"","sources":["../../src/generator/resume_ja.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAKV,aAAa,EAId,MAAM,sBAAsB,CAAC;AAG9B,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;CAC7C;AAyaD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,GAAG,MAAM,CAuC1E"}