@rivi-software/agentic-seo-check 0.4.0 → 0.5.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.
- package/README.md +29 -5
- package/dist/cli.js +20 -0
- package/dist/cli.js.map +1 -1
- package/dist/core/aeo/audit.d.ts +8 -0
- package/dist/core/aeo/audit.js +101 -17
- package/dist/core/aeo/audit.js.map +1 -1
- package/dist/core/aeo/bots.d.ts +48 -0
- package/dist/core/aeo/bots.js +151 -5
- package/dist/core/aeo/bots.js.map +1 -1
- package/dist/core/aeo/fixes.d.ts +38 -0
- package/dist/core/aeo/fixes.js +111 -0
- package/dist/core/aeo/fixes.js.map +1 -0
- package/dist/core/aeo/site-rules.d.ts +5 -0
- package/dist/core/aeo/site-rules.js +293 -10
- package/dist/core/aeo/site-rules.js.map +1 -1
- package/dist/core/audit.d.ts +8 -0
- package/dist/core/audit.js +144 -25
- package/dist/core/audit.js.map +1 -1
- package/dist/core/crawl.js +43 -4
- package/dist/core/crawl.js.map +1 -1
- package/dist/core/html/answer.d.ts +5 -2
- package/dist/core/html/answer.js +25 -7
- package/dist/core/html/answer.js.map +1 -1
- package/dist/core/html/dom.d.ts +13 -1
- package/dist/core/html/dom.js +30 -2
- package/dist/core/html/dom.js.map +1 -1
- package/dist/core/html/extract.js +122 -30
- package/dist/core/html/extract.js.map +1 -1
- package/dist/core/html/head.js +114 -19
- package/dist/core/html/head.js.map +1 -1
- package/dist/core/html/resources.js +15 -7
- package/dist/core/html/resources.js.map +1 -1
- package/dist/core/html/structured-data.js +21 -5
- package/dist/core/html/structured-data.js.map +1 -1
- package/dist/core/lighthouse.d.ts +2 -5
- package/dist/core/lighthouse.js +290 -5
- package/dist/core/lighthouse.js.map +1 -1
- package/dist/core/performance-fixes.d.ts +25 -0
- package/dist/core/performance-fixes.js +446 -0
- package/dist/core/performance-fixes.js.map +1 -0
- package/dist/core/performance-rules.js +56 -8
- package/dist/core/performance-rules.js.map +1 -1
- package/dist/core/recheck.d.ts +68 -0
- package/dist/core/recheck.js +247 -0
- package/dist/core/recheck.js.map +1 -0
- package/dist/core/render-fixes.d.ts +27 -0
- package/dist/core/render-fixes.js +164 -0
- package/dist/core/render-fixes.js.map +1 -0
- package/dist/core/render-rules.js +60 -21
- package/dist/core/render-rules.js.map +1 -1
- package/dist/core/report/markdown.js +68 -1
- package/dist/core/report/markdown.js.map +1 -1
- package/dist/core/robots.d.ts +5 -0
- package/dist/core/robots.js +8 -0
- package/dist/core/robots.js.map +1 -1
- package/dist/core/rules/aeo.js +339 -25
- package/dist/core/rules/aeo.js.map +1 -1
- package/dist/core/rules/canonical.js +107 -11
- package/dist/core/rules/canonical.js.map +1 -1
- package/dist/core/rules/content.js +65 -7
- package/dist/core/rules/content.js.map +1 -1
- package/dist/core/rules/document.js +73 -8
- package/dist/core/rules/document.js.map +1 -1
- package/dist/core/rules/fix.d.ts +55 -0
- package/dist/core/rules/fix.js +159 -0
- package/dist/core/rules/fix.js.map +1 -0
- package/dist/core/rules/head.js +81 -4
- package/dist/core/rules/head.js.map +1 -1
- package/dist/core/rules/headings.js +92 -9
- package/dist/core/rules/headings.js.map +1 -1
- package/dist/core/rules/hreflang.js +79 -9
- package/dist/core/rules/hreflang.js.map +1 -1
- package/dist/core/rules/images.js +49 -0
- package/dist/core/rules/images.js.map +1 -1
- package/dist/core/rules/index.d.ts +11 -0
- package/dist/core/rules/index.js +21 -1
- package/dist/core/rules/index.js.map +1 -1
- package/dist/core/rules/indexing.js +108 -1
- package/dist/core/rules/indexing.js.map +1 -1
- package/dist/core/rules/keyword.js +91 -1
- package/dist/core/rules/keyword.js.map +1 -1
- package/dist/core/rules/links.js +42 -0
- package/dist/core/rules/links.js.map +1 -1
- package/dist/core/rules/loading.js +54 -1
- package/dist/core/rules/loading.js.map +1 -1
- package/dist/core/rules/meta.js +36 -5
- package/dist/core/rules/meta.js.map +1 -1
- package/dist/core/rules/page-fixes.d.ts +39 -0
- package/dist/core/rules/page-fixes.js +107 -0
- package/dist/core/rules/page-fixes.js.map +1 -0
- package/dist/core/rules/quoted-tags.d.ts +23 -0
- package/dist/core/rules/quoted-tags.js +79 -0
- package/dist/core/rules/quoted-tags.js.map +1 -0
- package/dist/core/rules/response.js +71 -7
- package/dist/core/rules/response.js.map +1 -1
- package/dist/core/rules/rule.d.ts +17 -4
- package/dist/core/rules/rule.js +11 -2
- package/dist/core/rules/rule.js.map +1 -1
- package/dist/core/rules/social.js +101 -10
- package/dist/core/rules/social.js.map +1 -1
- package/dist/core/rules/structured-data-fixes.d.ts +33 -0
- package/dist/core/rules/structured-data-fixes.js +469 -0
- package/dist/core/rules/structured-data-fixes.js.map +1 -0
- package/dist/core/rules/structured-data-values.js +242 -31
- package/dist/core/rules/structured-data-values.js.map +1 -1
- package/dist/core/rules/structured-data.js +171 -4
- package/dist/core/rules/structured-data.js.map +1 -1
- package/dist/core/rules/title.js +39 -5
- package/dist/core/rules/title.js.map +1 -1
- package/dist/core/rules/urls.js +166 -0
- package/dist/core/rules/urls.js.map +1 -1
- package/dist/core/site-fixes.d.ts +111 -0
- package/dist/core/site-fixes.js +650 -0
- package/dist/core/site-fixes.js.map +1 -0
- package/dist/core/site-rules.js +474 -53
- package/dist/core/site-rules.js.map +1 -1
- package/dist/core/sitemap.d.ts +16 -0
- package/dist/core/sitemap.js +34 -0
- package/dist/core/sitemap.js.map +1 -1
- package/dist/core/types.d.ts +223 -3
- package/dist/core/types.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/mcp.js +16 -2
- package/dist/mcp.js.map +1 -1
- package/package.json +1 -1
- package/skills/seo-audit/SKILL.md +22 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"social.js","sourceRoot":"","sources":["../../../src/core/rules/social.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"social.js","sourceRoot":"","sources":["../../../src/core/rules/social.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fixes for structured data: the JSON-LD (or microdata) to add for a missing property, dates and
|
|
3
|
+
* prices rewritten in the form Google reads, and broken JSON repaired where the repair is certain.
|
|
4
|
+
*/
|
|
5
|
+
import type { ExtractedPage, FixEdit, PageSource, StructuredDataItem } from "../types.js";
|
|
6
|
+
/** What the slots in a structured data fix need, for `write`. */
|
|
7
|
+
export declare const STRUCTURED_SLOTS_WRITE = "Fill each {{\u2026}} with this page's own value as it appears on the page: dates in ISO 8601 (2026-03-14 or 2026-03-14T09:30:00+01:00), prices as plain numbers with a dot (19.99), currencies as ISO 4217 codes (EUR), URLs absolute.";
|
|
8
|
+
interface PropertyContext {
|
|
9
|
+
page: ExtractedPage;
|
|
10
|
+
source: PageSource;
|
|
11
|
+
type: string;
|
|
12
|
+
path: string;
|
|
13
|
+
}
|
|
14
|
+
/** The edit that adds missing properties to a JSON-LD object or a microdata item. */
|
|
15
|
+
export declare const addPropertiesEdit: (item: StructuredDataItem, missing: string[], ctx: PropertyContext) => FixEdit;
|
|
16
|
+
/**
|
|
17
|
+
* A date written another way, as ISO 8601: 14/03/2026, 2026/3/14, March 14, 2026, 14 March 2026.
|
|
18
|
+
* Null when the form is ambiguous (03/04/2026 is March or April) or unknown.
|
|
19
|
+
*/
|
|
20
|
+
export declare const isoDate: (value: string) => string | null;
|
|
21
|
+
/**
|
|
22
|
+
* A price as a plain number with a dot: "€19,99" → "19.99", "1.299,00 EUR" → "1299.00". Null when
|
|
23
|
+
* unsure, so the fix asks for the price instead of writing a wrong one.
|
|
24
|
+
*/
|
|
25
|
+
export declare const plainPrice: (value: string) => string | null;
|
|
26
|
+
/** The ISO 4217 code a currency value means, or null when it could be several ($, ¥, kr). */
|
|
27
|
+
export declare const currencyCode: (value: string) => string | null;
|
|
28
|
+
/**
|
|
29
|
+
* Edits for a JSON-LD script that does not parse: one per trailing comma when removing them makes
|
|
30
|
+
* the JSON valid, else a rewrite of the whole block with the parser's message.
|
|
31
|
+
*/
|
|
32
|
+
export declare const invalidJsonEdits: (text: string, tag: string | undefined, message: string) => FixEdit[];
|
|
33
|
+
export {};
|
|
@@ -0,0 +1,469 @@
|
|
|
1
|
+
import { addHtml, replaceHtml, slot } from "./fix.js";
|
|
2
|
+
import { json, jsonLdAt, productionOrigin } from "./page-fixes.js";
|
|
3
|
+
/** What the slots in a structured data fix need, for `write`. */
|
|
4
|
+
export const STRUCTURED_SLOTS_WRITE = "Fill each {{…}} with this page's own value as it appears on the page: dates in ISO 8601 (2026-03-14 or 2026-03-14T09:30:00+01:00), prices as plain numbers with a dot (19.99), currencies as ISO 4217 codes (EUR), URLs absolute.";
|
|
5
|
+
/** A JSON string with a slot in it: `"{{hint}}"`. */
|
|
6
|
+
const s = (hint) => `"${slot(hint)}"`;
|
|
7
|
+
/** A JSON object written with a space inside each brace, so "}}" only ever closes a slot. */
|
|
8
|
+
const object = (type, props) => `{ "@type": "${type}", ${props.map(([k, v]) => `"${k}": ${v}`).join(", ")} }`;
|
|
9
|
+
const PERSON = object("Person", [
|
|
10
|
+
["name", s("name")],
|
|
11
|
+
["url", s("URL of their profile page")],
|
|
12
|
+
]);
|
|
13
|
+
const ORGANIZATION = object("Organization", [
|
|
14
|
+
["name", s("organization name")],
|
|
15
|
+
["url", s("its website URL")],
|
|
16
|
+
]);
|
|
17
|
+
const POSTAL_ADDRESS = object("PostalAddress", [
|
|
18
|
+
["streetAddress", s("street and number")],
|
|
19
|
+
["addressLocality", s("city")],
|
|
20
|
+
["postalCode", s("postal code")],
|
|
21
|
+
["addressCountry", s("two-letter country code, e.g. NL")],
|
|
22
|
+
]);
|
|
23
|
+
const ISO_DATE_SLOT = s("ISO 8601 date, e.g. 2026-03-14");
|
|
24
|
+
const DATE_TIME_SLOT = s("ISO 8601 date and time, e.g. 2026-03-14T19:30:00+01:00");
|
|
25
|
+
const DURATION_SLOT = s("ISO 8601 duration, e.g. PT30M");
|
|
26
|
+
/** JSON for a property whose value is an object, an array, a URL, a date or a fixed term. */
|
|
27
|
+
const SKELETONS = new Map([
|
|
28
|
+
["author", PERSON],
|
|
29
|
+
["creator", PERSON],
|
|
30
|
+
["performer", PERSON],
|
|
31
|
+
["organizer", ORGANIZATION],
|
|
32
|
+
["publisher", ORGANIZATION],
|
|
33
|
+
["provider", ORGANIZATION],
|
|
34
|
+
["hiringOrganization", ORGANIZATION],
|
|
35
|
+
["brand", object("Brand", [["name", s("brand name")]])],
|
|
36
|
+
[
|
|
37
|
+
"offers",
|
|
38
|
+
object("Offer", [
|
|
39
|
+
["price", s("price, e.g. 19.99")],
|
|
40
|
+
["priceCurrency", s("currency code, e.g. EUR")],
|
|
41
|
+
["availability", '"https://schema.org/InStock"'],
|
|
42
|
+
]),
|
|
43
|
+
],
|
|
44
|
+
[
|
|
45
|
+
"aggregateRating",
|
|
46
|
+
object("AggregateRating", [
|
|
47
|
+
["ratingValue", slot("average rating, e.g. 4.6")],
|
|
48
|
+
["reviewCount", slot("number of reviews")],
|
|
49
|
+
]),
|
|
50
|
+
],
|
|
51
|
+
[
|
|
52
|
+
"review",
|
|
53
|
+
object("Review", [
|
|
54
|
+
["reviewRating", object("Rating", [["ratingValue", slot("rating")]])],
|
|
55
|
+
["author", PERSON],
|
|
56
|
+
]),
|
|
57
|
+
],
|
|
58
|
+
["reviewRating", object("Rating", [["ratingValue", slot("rating, e.g. 4")]])],
|
|
59
|
+
["itemReviewed", object("Thing", [["name", s("what is reviewed")]])],
|
|
60
|
+
["address", POSTAL_ADDRESS],
|
|
61
|
+
[
|
|
62
|
+
"location",
|
|
63
|
+
object("Place", [
|
|
64
|
+
["name", s("venue name")],
|
|
65
|
+
["address", POSTAL_ADDRESS],
|
|
66
|
+
]),
|
|
67
|
+
],
|
|
68
|
+
["jobLocation", object("Place", [["address", POSTAL_ADDRESS]])],
|
|
69
|
+
[
|
|
70
|
+
"geo",
|
|
71
|
+
object("GeoCoordinates", [
|
|
72
|
+
["latitude", slot("latitude")],
|
|
73
|
+
["longitude", slot("longitude")],
|
|
74
|
+
]),
|
|
75
|
+
],
|
|
76
|
+
[
|
|
77
|
+
"openingHoursSpecification",
|
|
78
|
+
`[ ${object("OpeningHoursSpecification", [
|
|
79
|
+
["dayOfWeek", `[ ${s("days, e.g. Monday")} ]`],
|
|
80
|
+
["opens", s("opening time, e.g. 09:00")],
|
|
81
|
+
["closes", s("closing time, e.g. 17:00")],
|
|
82
|
+
])} ]`,
|
|
83
|
+
],
|
|
84
|
+
[
|
|
85
|
+
"itemListElement",
|
|
86
|
+
`[ ${object("ListItem", [
|
|
87
|
+
["position", "1"],
|
|
88
|
+
["name", s("first item name")],
|
|
89
|
+
["item", s("first item URL")],
|
|
90
|
+
])}, ${object("ListItem", [
|
|
91
|
+
["position", "2"],
|
|
92
|
+
["name", s("second item name")],
|
|
93
|
+
["item", s("second item URL")],
|
|
94
|
+
])} ]`,
|
|
95
|
+
],
|
|
96
|
+
[
|
|
97
|
+
"mainEntity",
|
|
98
|
+
`[ ${object("Question", [
|
|
99
|
+
["name", s("question as the page asks it")],
|
|
100
|
+
[
|
|
101
|
+
"acceptedAnswer",
|
|
102
|
+
object("Answer", [["text", s("answer as the page gives it")]]),
|
|
103
|
+
],
|
|
104
|
+
])} ]`,
|
|
105
|
+
],
|
|
106
|
+
[
|
|
107
|
+
"acceptedAnswer",
|
|
108
|
+
object("Answer", [["text", s("answer as the page gives it")]]),
|
|
109
|
+
],
|
|
110
|
+
[
|
|
111
|
+
"suggestedAnswer",
|
|
112
|
+
object("Answer", [["text", s("answer as the page gives it")]]),
|
|
113
|
+
],
|
|
114
|
+
["step", `[ ${object("HowToStep", [["text", s("first step")]])} ]`],
|
|
115
|
+
[
|
|
116
|
+
"recipeInstructions",
|
|
117
|
+
`[ ${object("HowToStep", [["text", s("first step")]])} ]`,
|
|
118
|
+
],
|
|
119
|
+
["recipeIngredient", `[ ${s("first ingredient with its amount")} ]`],
|
|
120
|
+
[
|
|
121
|
+
"baseSalary",
|
|
122
|
+
object("MonetaryAmount", [
|
|
123
|
+
["currency", s("currency code, e.g. EUR")],
|
|
124
|
+
[
|
|
125
|
+
"value",
|
|
126
|
+
object("QuantitativeValue", [
|
|
127
|
+
["value", slot("amount")],
|
|
128
|
+
["unitText", s("HOUR, MONTH or YEAR")],
|
|
129
|
+
]),
|
|
130
|
+
],
|
|
131
|
+
]),
|
|
132
|
+
],
|
|
133
|
+
[
|
|
134
|
+
"identifier",
|
|
135
|
+
object("PropertyValue", [
|
|
136
|
+
["name", s("employer name")],
|
|
137
|
+
["value", s("job id")],
|
|
138
|
+
]),
|
|
139
|
+
],
|
|
140
|
+
[
|
|
141
|
+
"distribution",
|
|
142
|
+
object("DataDownload", [
|
|
143
|
+
["encodingFormat", s("file type, e.g. CSV")],
|
|
144
|
+
["contentUrl", s("download URL")],
|
|
145
|
+
]),
|
|
146
|
+
],
|
|
147
|
+
[
|
|
148
|
+
"sameAs",
|
|
149
|
+
`[ ${s("URL of the profile on another site, e.g. Wikipedia or LinkedIn")} ]`,
|
|
150
|
+
],
|
|
151
|
+
["eventStatus", '"https://schema.org/EventScheduled"'],
|
|
152
|
+
["eventAttendanceMode", '"https://schema.org/OfflineEventAttendanceMode"'],
|
|
153
|
+
["availability", '"https://schema.org/InStock"'],
|
|
154
|
+
["datePublished", ISO_DATE_SLOT],
|
|
155
|
+
["dateModified", ISO_DATE_SLOT],
|
|
156
|
+
["datePosted", ISO_DATE_SLOT],
|
|
157
|
+
["validThrough", DATE_TIME_SLOT],
|
|
158
|
+
["priceValidUntil", ISO_DATE_SLOT],
|
|
159
|
+
["startDate", DATE_TIME_SLOT],
|
|
160
|
+
["endDate", DATE_TIME_SLOT],
|
|
161
|
+
["uploadDate", DATE_TIME_SLOT],
|
|
162
|
+
["duration", DURATION_SLOT],
|
|
163
|
+
["prepTime", DURATION_SLOT],
|
|
164
|
+
["cookTime", DURATION_SLOT],
|
|
165
|
+
["totalTime", DURATION_SLOT],
|
|
166
|
+
["price", s("price, e.g. 19.99")],
|
|
167
|
+
["lowPrice", s("lowest price, e.g. 9.99")],
|
|
168
|
+
["highPrice", s("highest price, e.g. 49.99")],
|
|
169
|
+
["priceCurrency", s("currency code, e.g. EUR")],
|
|
170
|
+
["ratingValue", slot("rating, e.g. 4.6")],
|
|
171
|
+
["bestRating", slot("highest rating on the scale, e.g. 5")],
|
|
172
|
+
["worstRating", slot("lowest rating on the scale, e.g. 1")],
|
|
173
|
+
["ratingCount", slot("number of ratings")],
|
|
174
|
+
["reviewCount", slot("number of reviews")],
|
|
175
|
+
["offerCount", slot("number of offers")],
|
|
176
|
+
["employmentType", s("FULL_TIME, PART_TIME, CONTRACTOR, ...")],
|
|
177
|
+
["image", s("absolute URL of an image")],
|
|
178
|
+
["logo", s("absolute URL of the logo")],
|
|
179
|
+
["thumbnailUrl", s("absolute URL of the thumbnail")],
|
|
180
|
+
["contentUrl", s("absolute URL of the file")],
|
|
181
|
+
["embedUrl", s("absolute URL of the player")],
|
|
182
|
+
["license", s("URL of the license")],
|
|
183
|
+
]);
|
|
184
|
+
/** Types whose `name` (or `headline`) is the page's main heading when the object is the page's subject. */
|
|
185
|
+
const HEADLINE_TYPES = new Set([
|
|
186
|
+
"Article",
|
|
187
|
+
"NewsArticle",
|
|
188
|
+
"BlogPosting",
|
|
189
|
+
"TechArticle",
|
|
190
|
+
"Product",
|
|
191
|
+
"Event",
|
|
192
|
+
"Recipe",
|
|
193
|
+
"Course",
|
|
194
|
+
"SoftwareApplication",
|
|
195
|
+
"Dataset",
|
|
196
|
+
"HowTo",
|
|
197
|
+
"JobPosting",
|
|
198
|
+
"VideoObject",
|
|
199
|
+
"LocalBusiness",
|
|
200
|
+
]);
|
|
201
|
+
/** A value the page already states for a property of its main subject, or null. */
|
|
202
|
+
const statedValue = (prop, ctx) => {
|
|
203
|
+
const { page, type } = ctx;
|
|
204
|
+
// The main heading names the subject; a <title> often adds the site name or is a placeholder.
|
|
205
|
+
const [heading] = page.h1s;
|
|
206
|
+
const image = page.og["image"] ?? "";
|
|
207
|
+
if (["name", "headline", "title"].includes(prop)) {
|
|
208
|
+
return HEADLINE_TYPES.has(type) && heading ? json(heading) : null;
|
|
209
|
+
}
|
|
210
|
+
if (prop === "description") {
|
|
211
|
+
return page.metaDescription ? json(page.metaDescription) : null;
|
|
212
|
+
}
|
|
213
|
+
if (prop === "url") {
|
|
214
|
+
return json(page.canonical ?? page.url);
|
|
215
|
+
}
|
|
216
|
+
return prop === "image" && /^https?:\/\//iu.test(image) ? json(image) : null;
|
|
217
|
+
};
|
|
218
|
+
/** The value of a missing property: what the page already states, or a skeleton with slots. */
|
|
219
|
+
const valueFor = (prop, ctx) => {
|
|
220
|
+
const { page, source, type, path } = ctx;
|
|
221
|
+
if (prop === "url" && (type === "WebSite" || type === "Organization")) {
|
|
222
|
+
const origin = productionOrigin(page, source);
|
|
223
|
+
return origin.includes("{{") ? `"${origin}/"` : json(`${origin}/`);
|
|
224
|
+
}
|
|
225
|
+
const root = path === "" || path === "(root)";
|
|
226
|
+
const stated = root ? statedValue(prop, ctx) : null;
|
|
227
|
+
if (stated !== null) {
|
|
228
|
+
return stated;
|
|
229
|
+
}
|
|
230
|
+
// A ListItem's position is its place in the list, which the path names.
|
|
231
|
+
const index = /\[(?<i>\d+)\]$/u.exec(path)?.groups?.i;
|
|
232
|
+
if (prop === "position" && index !== undefined) {
|
|
233
|
+
return String(Number(index) + 1);
|
|
234
|
+
}
|
|
235
|
+
return SKELETONS.get(prop) ?? s(prop);
|
|
236
|
+
};
|
|
237
|
+
/** The first alternative of a "one of: a | b" requirement, the one most pages have data for. */
|
|
238
|
+
const propertyName = (missing) => missing.startsWith("one of: ")
|
|
239
|
+
? (missing.slice("one of: ".length).split(" | ")[0] ?? missing)
|
|
240
|
+
: missing;
|
|
241
|
+
/** The edit that adds missing properties to a JSON-LD object or a microdata item. */
|
|
242
|
+
export const addPropertiesEdit = (item, missing, ctx) => {
|
|
243
|
+
const props = missing.map(propertyName);
|
|
244
|
+
const alternatives = missing.filter((m) => m.startsWith("one of: "));
|
|
245
|
+
const either = alternatives.length > 0
|
|
246
|
+
? ` For "${alternatives.join('", "')}", one of them is enough; this adds the first.`
|
|
247
|
+
: "";
|
|
248
|
+
if (item.source === "microdata") {
|
|
249
|
+
return addHtml(`[itemtype*="${ctx.type}"]`, props
|
|
250
|
+
.map((p) => `<meta itemprop="${p}" content="${slot(p)}">`)
|
|
251
|
+
.join("\n"), `${STRUCTURED_SLOTS_WRITE} Properties that hold an object (an Offer, a Person) take an element with itemprop, itemscope and itemtype instead of a <meta>.${either}`);
|
|
252
|
+
}
|
|
253
|
+
const lines = props.map((p) => `"${p}": ${valueFor(p, ctx)}`);
|
|
254
|
+
const code = lines.join(",\n");
|
|
255
|
+
return addHtml(jsonLdAt(ctx.type, ctx.path), code, code.includes("{{")
|
|
256
|
+
? `Add these properties to the object. ${STRUCTURED_SLOTS_WRITE}${either}`
|
|
257
|
+
: `Add these properties to the object.${either}`);
|
|
258
|
+
};
|
|
259
|
+
const MONTHS = [
|
|
260
|
+
"jan",
|
|
261
|
+
"feb",
|
|
262
|
+
"mar",
|
|
263
|
+
"apr",
|
|
264
|
+
"may",
|
|
265
|
+
"jun",
|
|
266
|
+
"jul",
|
|
267
|
+
"aug",
|
|
268
|
+
"sep",
|
|
269
|
+
"oct",
|
|
270
|
+
"nov",
|
|
271
|
+
"dec",
|
|
272
|
+
];
|
|
273
|
+
const pad = (n) => String(n).padStart(2, "0");
|
|
274
|
+
const isoOf = (year, month, day) => month >= 1 && month <= 12 && day >= 1 && day <= 31
|
|
275
|
+
? `${year}-${pad(month)}-${pad(day)}`
|
|
276
|
+
: null;
|
|
277
|
+
const monthOf = (name) => MONTHS.indexOf(name.slice(0, 3).toLowerCase()) + 1;
|
|
278
|
+
/**
|
|
279
|
+
* A date written another way, as ISO 8601: 14/03/2026, 2026/3/14, March 14, 2026, 14 March 2026.
|
|
280
|
+
* Null when the form is ambiguous (03/04/2026 is March or April) or unknown.
|
|
281
|
+
*/
|
|
282
|
+
export const isoDate = (value) => {
|
|
283
|
+
const v = value.trim();
|
|
284
|
+
const numeric = /^(?<a>\d{1,2})[./-](?<b>\d{1,2})[./-](?<y>\d{4})$/u.exec(v)?.groups;
|
|
285
|
+
if (numeric) {
|
|
286
|
+
const a = Number(numeric["a"]);
|
|
287
|
+
const b = Number(numeric["b"]);
|
|
288
|
+
const y = Number(numeric["y"]);
|
|
289
|
+
if (a > 12) {
|
|
290
|
+
return isoOf(y, b, a);
|
|
291
|
+
}
|
|
292
|
+
return b > 12 ? isoOf(y, a, b) : null;
|
|
293
|
+
}
|
|
294
|
+
const yearFirst = /^(?<y>\d{4})[./-](?<m>\d{1,2})[./-](?<d>\d{1,2})$/u.exec(v)?.groups;
|
|
295
|
+
if (yearFirst) {
|
|
296
|
+
return isoOf(Number(yearFirst["y"]), Number(yearFirst["m"]), Number(yearFirst["d"]));
|
|
297
|
+
}
|
|
298
|
+
const monthFirst = /^(?<m>[A-Za-z]{3,9})\.? (?<d>\d{1,2})(?:st|nd|rd|th)?,? (?<y>\d{4})$/u.exec(v)?.groups;
|
|
299
|
+
const dayFirst = /^(?<d>\d{1,2})(?:st|nd|rd|th)?\.? (?<m>[A-Za-z]{3,9})\.?,? (?<y>\d{4})$/u.exec(v)?.groups;
|
|
300
|
+
const named = monthFirst ?? dayFirst;
|
|
301
|
+
if (named) {
|
|
302
|
+
const month = monthOf(named["m"] ?? "");
|
|
303
|
+
return month > 0
|
|
304
|
+
? isoOf(Number(named["y"]), month, Number(named["d"]))
|
|
305
|
+
: null;
|
|
306
|
+
}
|
|
307
|
+
return null;
|
|
308
|
+
};
|
|
309
|
+
/**
|
|
310
|
+
* A price as a plain number with a dot: "€19,99" → "19.99", "1.299,00 EUR" → "1299.00". Null when
|
|
311
|
+
* unsure, so the fix asks for the price instead of writing a wrong one.
|
|
312
|
+
*/
|
|
313
|
+
export const plainPrice = (value) => {
|
|
314
|
+
// One number only: "€19 - €29" or "€19,99 incl. 21% VAT" would otherwise join their digits.
|
|
315
|
+
const numbers = value.match(/\d[\d.,]*/gu) ?? [];
|
|
316
|
+
const digits = numbers.length === 1 ? (numbers[0] ?? "") : "";
|
|
317
|
+
if (!/\d/u.test(digits)) {
|
|
318
|
+
return null;
|
|
319
|
+
}
|
|
320
|
+
const lastComma = digits.lastIndexOf(",");
|
|
321
|
+
const lastDot = digits.lastIndexOf(".");
|
|
322
|
+
if (lastComma !== -1 && lastDot !== -1) {
|
|
323
|
+
const decimal = lastComma > lastDot ? "," : ".";
|
|
324
|
+
const thousands = decimal === "," ? "." : ",";
|
|
325
|
+
const plain = digits.replaceAll(thousands, "").replace(decimal, ".");
|
|
326
|
+
// "1.299,-" leaves "1299.", which is still not a plain number.
|
|
327
|
+
return /^\d+(?:\.\d+)?$/u.test(plain) ? plain : null;
|
|
328
|
+
}
|
|
329
|
+
if (lastComma !== -1) {
|
|
330
|
+
if (/^\d+,\d{1,2}$/u.test(digits)) {
|
|
331
|
+
return digits.replace(",", ".");
|
|
332
|
+
}
|
|
333
|
+
return /^\d{1,3}(?:,\d{3})+$/u.test(digits)
|
|
334
|
+
? digits.replaceAll(",", "")
|
|
335
|
+
: null;
|
|
336
|
+
}
|
|
337
|
+
// "1.299" is over a thousand in much of Europe and just over one elsewhere: a slot, not a guess.
|
|
338
|
+
return /^\d+(?:\.\d+)?$/u.test(digits) &&
|
|
339
|
+
!/^\d{1,3}(?:\.\d{3})+$/u.test(digits)
|
|
340
|
+
? digits
|
|
341
|
+
: null;
|
|
342
|
+
};
|
|
343
|
+
/** ISO 4217 codes for currency signs and names that name one currency. */
|
|
344
|
+
const CURRENCIES = new Map([
|
|
345
|
+
["€", "EUR"],
|
|
346
|
+
["euro", "EUR"],
|
|
347
|
+
["euros", "EUR"],
|
|
348
|
+
["£", "GBP"],
|
|
349
|
+
["us$", "USD"],
|
|
350
|
+
["usd$", "USD"],
|
|
351
|
+
["₹", "INR"],
|
|
352
|
+
["₩", "KRW"],
|
|
353
|
+
["₺", "TRY"],
|
|
354
|
+
["zł", "PLN"],
|
|
355
|
+
["kč", "CZK"],
|
|
356
|
+
["chf", "CHF"],
|
|
357
|
+
]);
|
|
358
|
+
/** The ISO 4217 code a currency value means, or null when it could be several ($, ¥, kr). */
|
|
359
|
+
export const currencyCode = (value) => CURRENCIES.get(value.trim().toLowerCase()) ?? null;
|
|
360
|
+
/** The offsets of commas that end a JSON object or array, read outside strings. */
|
|
361
|
+
const trailingCommas = (text) => {
|
|
362
|
+
const commas = [];
|
|
363
|
+
let inString = false;
|
|
364
|
+
let pending = -1;
|
|
365
|
+
for (let i = 0; i < text.length; i += 1) {
|
|
366
|
+
const ch = text[i];
|
|
367
|
+
if (inString) {
|
|
368
|
+
if (ch === "\\") {
|
|
369
|
+
i += 1;
|
|
370
|
+
}
|
|
371
|
+
else if (ch === '"') {
|
|
372
|
+
inString = false;
|
|
373
|
+
}
|
|
374
|
+
continue;
|
|
375
|
+
}
|
|
376
|
+
if (ch === '"') {
|
|
377
|
+
inString = true;
|
|
378
|
+
pending = -1;
|
|
379
|
+
}
|
|
380
|
+
else if (ch === ",") {
|
|
381
|
+
pending = i;
|
|
382
|
+
}
|
|
383
|
+
else if (ch === "}" || ch === "]") {
|
|
384
|
+
if (pending !== -1) {
|
|
385
|
+
commas.push(pending);
|
|
386
|
+
}
|
|
387
|
+
pending = -1;
|
|
388
|
+
}
|
|
389
|
+
else if (ch !== " " && ch !== "\t" && ch !== "\n" && ch !== "\r") {
|
|
390
|
+
pending = -1;
|
|
391
|
+
}
|
|
392
|
+
}
|
|
393
|
+
return commas;
|
|
394
|
+
};
|
|
395
|
+
/** Characters quoted before a trailing comma, so the quote is unique enough to find. */
|
|
396
|
+
const CONTEXT_CHARS = 30;
|
|
397
|
+
/**
|
|
398
|
+
* The text to quote around each trailing comma: from its line's start, or 30 characters before it
|
|
399
|
+
* on a long line, to the bracket after it. Commas whose quotes would overlap share one, since the
|
|
400
|
+
* first edit applied would change the text the second one quotes.
|
|
401
|
+
*/
|
|
402
|
+
const commaSpans = (body, commas) => {
|
|
403
|
+
const spans = [];
|
|
404
|
+
for (const i of commas) {
|
|
405
|
+
const lineStart = body.lastIndexOf("\n", i) + 1;
|
|
406
|
+
const start = i - lineStart <= 80 ? lineStart : i - CONTEXT_CHARS;
|
|
407
|
+
const end = body.slice(i + 1).search(/[\]}]/u) + i + 2;
|
|
408
|
+
const last = spans.at(-1);
|
|
409
|
+
if (last && start < last.end) {
|
|
410
|
+
last.end = Math.max(last.end, end);
|
|
411
|
+
last.commas.push(i);
|
|
412
|
+
}
|
|
413
|
+
else {
|
|
414
|
+
spans.push({ start, end, commas: [i] });
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
return spans;
|
|
418
|
+
};
|
|
419
|
+
/**
|
|
420
|
+
* Edits for a JSON-LD script that does not parse: one per trailing comma when removing them makes
|
|
421
|
+
* the JSON valid, else a rewrite of the whole block with the parser's message.
|
|
422
|
+
*/
|
|
423
|
+
export const invalidJsonEdits = (text, tag, message) => {
|
|
424
|
+
const at = 'script[type="application/ld+json"]';
|
|
425
|
+
const body = text.trim();
|
|
426
|
+
if (!body) {
|
|
427
|
+
return [
|
|
428
|
+
{
|
|
429
|
+
in: "html",
|
|
430
|
+
action: "remove",
|
|
431
|
+
at,
|
|
432
|
+
current: `${tag ?? '<script type="application/ld+json">'}${text}</script>`,
|
|
433
|
+
},
|
|
434
|
+
];
|
|
435
|
+
}
|
|
436
|
+
const commas = trailingCommas(body);
|
|
437
|
+
let repaired = body;
|
|
438
|
+
for (const i of commas.toReversed()) {
|
|
439
|
+
repaired = repaired.slice(0, i) + repaired.slice(i + 1);
|
|
440
|
+
}
|
|
441
|
+
let parses = false;
|
|
442
|
+
try {
|
|
443
|
+
JSON.parse(repaired);
|
|
444
|
+
parses = commas.length > 0;
|
|
445
|
+
}
|
|
446
|
+
catch {
|
|
447
|
+
parses = false;
|
|
448
|
+
}
|
|
449
|
+
// A short block is quoted whole; a long one gets an edit per comma, quoted from its line.
|
|
450
|
+
if (parses && body.length <= 500) {
|
|
451
|
+
return [replaceHtml(body, repaired, { at })];
|
|
452
|
+
}
|
|
453
|
+
if (parses) {
|
|
454
|
+
return commaSpans(body, commas).map(({ start, end, commas: inSpan }) => {
|
|
455
|
+
let code = body.slice(start, end);
|
|
456
|
+
for (const i of inSpan.toReversed()) {
|
|
457
|
+
code = code.slice(0, i - start) + code.slice(i - start + 1);
|
|
458
|
+
}
|
|
459
|
+
return replaceHtml(body.slice(start, end), code, { at });
|
|
460
|
+
});
|
|
461
|
+
}
|
|
462
|
+
return [
|
|
463
|
+
replaceHtml(body.length > 500 ? `${body.slice(0, 499)}…` : body, slot("the same data as valid JSON"), {
|
|
464
|
+
at,
|
|
465
|
+
write: `${message}. Write the block out again as valid JSON with the same data, best generated with JSON.stringify from the data the page renders rather than written by hand.`,
|
|
466
|
+
}),
|
|
467
|
+
];
|
|
468
|
+
};
|
|
469
|
+
//# sourceMappingURL=structured-data-fixes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"structured-data-fixes.js","sourceRoot":"","sources":["../../../src/core/rules/structured-data-fixes.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AACtD,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEnE,iEAAiE;AACjE,MAAM,CAAC,MAAM,sBAAsB,GACjC,mOAAmO,CAAC;AAEtO,qDAAqD;AACrD,MAAM,CAAC,GAAG,CAAC,IAAY,EAAU,EAAE,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;AAEtD,6FAA6F;AAC7F,MAAM,MAAM,GAAG,CAAC,IAAY,EAAE,KAAyB,EAAU,EAAE,CACjE,eAAe,IAAI,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;AAEhF,MAAM,MAAM,GAAG,MAAM,CAAC,QAAQ,EAAE;IAC9B,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IACnB,CAAC,KAAK,EAAE,CAAC,CAAC,2BAA2B,CAAC,CAAC;CACxC,CAAC,CAAC;AAEH,MAAM,YAAY,GAAG,MAAM,CAAC,cAAc,EAAE;IAC1C,CAAC,MAAM,EAAE,CAAC,CAAC,mBAAmB,CAAC,CAAC;IAChC,CAAC,KAAK,EAAE,CAAC,CAAC,iBAAiB,CAAC,CAAC;CAC9B,CAAC,CAAC;AAEH,MAAM,cAAc,GAAG,MAAM,CAAC,eAAe,EAAE;IAC7C,CAAC,eAAe,EAAE,CAAC,CAAC,mBAAmB,CAAC,CAAC;IACzC,CAAC,iBAAiB,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC,YAAY,EAAE,CAAC,CAAC,aAAa,CAAC,CAAC;IAChC,CAAC,gBAAgB,EAAE,CAAC,CAAC,kCAAkC,CAAC,CAAC;CAC1D,CAAC,CAAC;AAEH,MAAM,aAAa,GAAG,CAAC,CAAC,gCAAgC,CAAC,CAAC;AAE1D,MAAM,cAAc,GAAG,CAAC,CACtB,wDAAwD,CACzD,CAAC;AAEF,MAAM,aAAa,GAAG,CAAC,CAAC,+BAA+B,CAAC,CAAC;AAEzD,6FAA6F;AAC7F,MAAM,SAAS,GAAG,IAAI,GAAG,CAAiB;IACxC,CAAC,QAAQ,EAAE,MAAM,CAAC;IAClB,CAAC,SAAS,EAAE,MAAM,CAAC;IACnB,CAAC,WAAW,EAAE,MAAM,CAAC;IACrB,CAAC,WAAW,EAAE,YAAY,CAAC;IAC3B,CAAC,WAAW,EAAE,YAAY,CAAC;IAC3B,CAAC,UAAU,EAAE,YAAY,CAAC;IAC1B,CAAC,oBAAoB,EAAE,YAAY,CAAC;IACpC,CAAC,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD;QACE,QAAQ;QACR,MAAM,CAAC,OAAO,EAAE;YACd,CAAC,OAAO,EAAE,CAAC,CAAC,mBAAmB,CAAC,CAAC;YACjC,CAAC,eAAe,EAAE,CAAC,CAAC,yBAAyB,CAAC,CAAC;YAC/C,CAAC,cAAc,EAAE,8BAA8B,CAAC;SACjD,CAAC;KACH;IACD;QACE,iBAAiB;QACjB,MAAM,CAAC,iBAAiB,EAAE;YACxB,CAAC,aAAa,EAAE,IAAI,CAAC,0BAA0B,CAAC,CAAC;YACjD,CAAC,aAAa,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;SAC3C,CAAC;KACH;IACD;QACE,QAAQ;QACR,MAAM,CAAC,QAAQ,EAAE;YACf,CAAC,cAAc,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,aAAa,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YACrE,CAAC,QAAQ,EAAE,MAAM,CAAC;SACnB,CAAC;KACH;IACD,CAAC,cAAc,EAAE,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,aAAa,EAAE,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7E,CAAC,cAAc,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CAAC;IACpE,CAAC,SAAS,EAAE,cAAc,CAAC;IAC3B;QACE,UAAU;QACV,MAAM,CAAC,OAAO,EAAE;YACd,CAAC,MAAM,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC;YACzB,CAAC,SAAS,EAAE,cAAc,CAAC;SAC5B,CAAC;KACH;IACD,CAAC,aAAa,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC,CAAC,CAAC;IAC/D;QACE,KAAK;QACL,MAAM,CAAC,gBAAgB,EAAE;YACvB,CAAC,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;YAC9B,CAAC,WAAW,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;SACjC,CAAC;KACH;IACD;QACE,2BAA2B;QAC3B,KAAK,MAAM,CAAC,2BAA2B,EAAE;YACvC,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAC;YAC9C,CAAC,OAAO,EAAE,CAAC,CAAC,0BAA0B,CAAC,CAAC;YACxC,CAAC,QAAQ,EAAE,CAAC,CAAC,0BAA0B,CAAC,CAAC;SAC1C,CAAC,IAAI;KACP;IACD;QACE,iBAAiB;QACjB,KAAK,MAAM,CAAC,UAAU,EAAE;YACtB,CAAC,UAAU,EAAE,GAAG,CAAC;YACjB,CAAC,MAAM,EAAE,CAAC,CAAC,iBAAiB,CAAC,CAAC;YAC9B,CAAC,MAAM,EAAE,CAAC,CAAC,gBAAgB,CAAC,CAAC;SAC9B,CAAC,KAAK,MAAM,CAAC,UAAU,EAAE;YACxB,CAAC,UAAU,EAAE,GAAG,CAAC;YACjB,CAAC,MAAM,EAAE,CAAC,CAAC,kBAAkB,CAAC,CAAC;YAC/B,CAAC,MAAM,EAAE,CAAC,CAAC,iBAAiB,CAAC,CAAC;SAC/B,CAAC,IAAI;KACP;IACD;QACE,YAAY;QACZ,KAAK,MAAM,CAAC,UAAU,EAAE;YACtB,CAAC,MAAM,EAAE,CAAC,CAAC,8BAA8B,CAAC,CAAC;YAC3C;gBACE,gBAAgB;gBAChB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,CAAC;aAC/D;SACF,CAAC,IAAI;KACP;IACD;QACE,gBAAgB;QAChB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,CAAC;KAC/D;IACD;QACE,iBAAiB;QACjB,MAAM,CAAC,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,CAAC;KAC/D;IACD,CAAC,MAAM,EAAE,KAAK,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACnE;QACE,oBAAoB;QACpB,KAAK,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,IAAI;KAC1D;IACD,CAAC,kBAAkB,EAAE,KAAK,CAAC,CAAC,kCAAkC,CAAC,IAAI,CAAC;IACpE;QACE,YAAY;QACZ,MAAM,CAAC,gBAAgB,EAAE;YACvB,CAAC,UAAU,EAAE,CAAC,CAAC,yBAAyB,CAAC,CAAC;YAC1C;gBACE,OAAO;gBACP,MAAM,CAAC,mBAAmB,EAAE;oBAC1B,CAAC,OAAO,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;oBACzB,CAAC,UAAU,EAAE,CAAC,CAAC,qBAAqB,CAAC,CAAC;iBACvC,CAAC;aACH;SACF,CAAC;KACH;IACD;QACE,YAAY;QACZ,MAAM,CAAC,eAAe,EAAE;YACtB,CAAC,MAAM,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC;YAC5B,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC;SACvB,CAAC;KACH;IACD;QACE,cAAc;QACd,MAAM,CAAC,cAAc,EAAE;YACrB,CAAC,gBAAgB,EAAE,CAAC,CAAC,qBAAqB,CAAC,CAAC;YAC5C,CAAC,YAAY,EAAE,CAAC,CAAC,cAAc,CAAC,CAAC;SAClC,CAAC;KACH;IACD;QACE,QAAQ;QACR,KAAK,CAAC,CAAC,gEAAgE,CAAC,IAAI;KAC7E;IACD,CAAC,aAAa,EAAE,qCAAqC,CAAC;IACtD,CAAC,qBAAqB,EAAE,iDAAiD,CAAC;IAC1E,CAAC,cAAc,EAAE,8BAA8B,CAAC;IAChD,CAAC,eAAe,EAAE,aAAa,CAAC;IAChC,CAAC,cAAc,EAAE,aAAa,CAAC;IAC/B,CAAC,YAAY,EAAE,aAAa,CAAC;IAC7B,CAAC,cAAc,EAAE,cAAc,CAAC;IAChC,CAAC,iBAAiB,EAAE,aAAa,CAAC;IAClC,CAAC,WAAW,EAAE,cAAc,CAAC;IAC7B,CAAC,SAAS,EAAE,cAAc,CAAC;IAC3B,CAAC,YAAY,EAAE,cAAc,CAAC;IAC9B,CAAC,UAAU,EAAE,aAAa,CAAC;IAC3B,CAAC,UAAU,EAAE,aAAa,CAAC;IAC3B,CAAC,UAAU,EAAE,aAAa,CAAC;IAC3B,CAAC,WAAW,EAAE,aAAa,CAAC;IAC5B,CAAC,OAAO,EAAE,CAAC,CAAC,mBAAmB,CAAC,CAAC;IACjC,CAAC,UAAU,EAAE,CAAC,CAAC,yBAAyB,CAAC,CAAC;IAC1C,CAAC,WAAW,EAAE,CAAC,CAAC,2BAA2B,CAAC,CAAC;IAC7C,CAAC,eAAe,EAAE,CAAC,CAAC,yBAAyB,CAAC,CAAC;IAC/C,CAAC,aAAa,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACzC,CAAC,YAAY,EAAE,IAAI,CAAC,qCAAqC,CAAC,CAAC;IAC3D,CAAC,aAAa,EAAE,IAAI,CAAC,oCAAoC,CAAC,CAAC;IAC3D,CAAC,aAAa,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC1C,CAAC,aAAa,EAAE,IAAI,CAAC,mBAAmB,CAAC,CAAC;IAC1C,CAAC,YAAY,EAAE,IAAI,CAAC,kBAAkB,CAAC,CAAC;IACxC,CAAC,gBAAgB,EAAE,CAAC,CAAC,uCAAuC,CAAC,CAAC;IAC9D,CAAC,OAAO,EAAE,CAAC,CAAC,0BAA0B,CAAC,CAAC;IACxC,CAAC,MAAM,EAAE,CAAC,CAAC,0BAA0B,CAAC,CAAC;IACvC,CAAC,cAAc,EAAE,CAAC,CAAC,+BAA+B,CAAC,CAAC;IACpD,CAAC,YAAY,EAAE,CAAC,CAAC,0BAA0B,CAAC,CAAC;IAC7C,CAAC,UAAU,EAAE,CAAC,CAAC,4BAA4B,CAAC,CAAC;IAC7C,CAAC,SAAS,EAAE,CAAC,CAAC,oBAAoB,CAAC,CAAC;CACrC,CAAC,CAAC;AAEH,2GAA2G;AAC3G,MAAM,cAAc,GAAG,IAAI,GAAG,CAAC;IAC7B,SAAS;IACT,aAAa;IACb,aAAa;IACb,aAAa;IACb,SAAS;IACT,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,qBAAqB;IACrB,SAAS;IACT,OAAO;IACP,YAAY;IACZ,aAAa;IACb,eAAe;CAChB,CAAC,CAAC;AASH,mFAAmF;AACnF,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,GAAoB,EAAiB,EAAE;IACxE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC;IAC3B,8FAA8F;IAC9F,MAAM,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC;IAC3B,MAAM,KAAK,GAAG,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;IAErC,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACjD,OAAO,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACpE,CAAC;IAED,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;QAC3B,OAAO,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAClE,CAAC;IAED,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC;IAC1C,CAAC;IAED,OAAO,IAAI,KAAK,OAAO,IAAI,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/E,CAAC,CAAC;AAEF,+FAA+F;AAC/F,MAAM,QAAQ,GAAG,CAAC,IAAY,EAAE,GAAoB,EAAU,EAAE;IAC9D,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC;IAEzC,IAAI,IAAI,KAAK,KAAK,IAAI,CAAC,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,cAAc,CAAC,EAAE,CAAC;QACtE,MAAM,MAAM,GAAG,gBAAgB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAE9C,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,MAAM,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,GAAG,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,IAAI,GAAG,IAAI,KAAK,EAAE,IAAI,IAAI,KAAK,QAAQ,CAAC;IAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IAEpD,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QACpB,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,wEAAwE;IACxE,MAAM,KAAK,GAAG,iBAAiB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAEtD,IAAI,IAAI,KAAK,UAAU,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QAC/C,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC,CAAC;AAEF,gGAAgG;AAChG,MAAM,YAAY,GAAG,CAAC,OAAe,EAAU,EAAE,CAC/C,OAAO,CAAC,UAAU,CAAC,UAAU,CAAC;IAC5B,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC;IAC/D,CAAC,CAAC,OAAO,CAAC;AAEd,qFAAqF;AACrF,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAC/B,IAAwB,EACxB,OAAiB,EACjB,GAAoB,EACX,EAAE;IACX,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;IACxC,MAAM,YAAY,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;IAErE,MAAM,MAAM,GACV,YAAY,CAAC,MAAM,GAAG,CAAC;QACrB,CAAC,CAAC,SAAS,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,gDAAgD;QACpF,CAAC,CAAC,EAAE,CAAC;IAET,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QAChC,OAAO,OAAO,CACZ,eAAe,GAAG,CAAC,IAAI,IAAI,EAC3B,KAAK;aACF,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,mBAAmB,CAAC,cAAc,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;aACzD,IAAI,CAAC,IAAI,CAAC,EACb,GAAG,sBAAsB,kIAAkI,MAAM,EAAE,CACpK,CAAC;IACJ,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9D,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAE/B,OAAO,OAAO,CACZ,QAAQ,CAAC,GAAG,CAAC,IAAI,EAAE,GAAG,CAAC,IAAI,CAAC,EAC5B,IAAI,EACJ,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;QACjB,CAAC,CAAC,uCAAuC,sBAAsB,GAAG,MAAM,EAAE;QAC1E,CAAC,CAAC,sCAAsC,MAAM,EAAE,CACnD,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,MAAM,GAAG;IACb,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;IACL,KAAK;CACN,CAAC;AAEF,MAAM,GAAG,GAAG,CAAC,CAAS,EAAU,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;AAE9D,MAAM,KAAK,GAAG,CAAC,IAAY,EAAE,KAAa,EAAE,GAAW,EAAiB,EAAE,CACxE,KAAK,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,IAAI,GAAG,IAAI,CAAC,IAAI,GAAG,IAAI,EAAE;IAChD,CAAC,CAAC,GAAG,IAAI,IAAI,GAAG,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,EAAE;IACrC,CAAC,CAAC,IAAI,CAAC;AAEX,MAAM,OAAO,GAAG,CAAC,IAAY,EAAU,EAAE,CACvC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,CAAC;AAErD;;;GAGG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,KAAa,EAAiB,EAAE;IACtD,MAAM,CAAC,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAEvB,MAAM,OAAO,GAAG,oDAAoD,CAAC,IAAI,CACvE,CAAC,CACF,EAAE,MAAM,CAAC;IAEV,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC;QAE/B,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC;YACX,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;QACxB,CAAC;QAED,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;IACxC,CAAC;IAED,MAAM,SAAS,GAAG,oDAAoD,CAAC,IAAI,CACzE,CAAC,CACF,EAAE,MAAM,CAAC;IAEV,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,KAAK,CACV,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EACtB,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,EACtB,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CACvB,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GACd,uEAAuE,CAAC,IAAI,CAC1E,CAAC,CACF,EAAE,MAAM,CAAC;IAEZ,MAAM,QAAQ,GACZ,0EAA0E,CAAC,IAAI,CAC7E,CAAC,CACF,EAAE,MAAM,CAAC;IAEZ,MAAM,KAAK,GAAG,UAAU,IAAI,QAAQ,CAAC;IAErC,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAExC,OAAO,KAAK,GAAG,CAAC;YACd,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;YACtD,CAAC,CAAC,IAAI,CAAC;IACX,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,UAAU,GAAG,CAAC,KAAa,EAAiB,EAAE;IACzD,4FAA4F;IAC5F,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC;IACjD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IAE9D,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;QACxB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,OAAO,GAAG,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;IAExC,IAAI,SAAS,KAAK,CAAC,CAAC,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC;QACvC,MAAM,OAAO,GAAG,SAAS,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAChD,MAAM,SAAS,GAAG,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAErE,+DAA+D;QAC/D,OAAO,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC;IACvD,CAAC;IAED,IAAI,SAAS,KAAK,CAAC,CAAC,EAAE,CAAC;QACrB,IAAI,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAClC,OAAO,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAClC,CAAC;QAED,OAAO,uBAAuB,CAAC,IAAI,CAAC,MAAM,CAAC;YACzC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC;YAC5B,CAAC,CAAC,IAAI,CAAC;IACX,CAAC;IAED,iGAAiG;IACjG,OAAO,kBAAkB,CAAC,IAAI,CAAC,MAAM,CAAC;QACpC,CAAC,wBAAwB,CAAC,IAAI,CAAC,MAAM,CAAC;QACtC,CAAC,CAAC,MAAM;QACR,CAAC,CAAC,IAAI,CAAC;AACX,CAAC,CAAC;AAEF,0EAA0E;AAC1E,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC;IACzB,CAAC,GAAG,EAAE,KAAK,CAAC;IACZ,CAAC,MAAM,EAAE,KAAK,CAAC;IACf,CAAC,OAAO,EAAE,KAAK,CAAC;IAChB,CAAC,GAAG,EAAE,KAAK,CAAC;IACZ,CAAC,KAAK,EAAE,KAAK,CAAC;IACd,CAAC,MAAM,EAAE,KAAK,CAAC;IACf,CAAC,GAAG,EAAE,KAAK,CAAC;IACZ,CAAC,GAAG,EAAE,KAAK,CAAC;IACZ,CAAC,GAAG,EAAE,KAAK,CAAC;IACZ,CAAC,IAAI,EAAE,KAAK,CAAC;IACb,CAAC,IAAI,EAAE,KAAK,CAAC;IACb,CAAC,KAAK,EAAE,KAAK,CAAC;CACf,CAAC,CAAC;AAEH,6FAA6F;AAC7F,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,KAAa,EAAiB,EAAE,CAC3D,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,IAAI,IAAI,CAAC;AAErD,mFAAmF;AACnF,MAAM,cAAc,GAAG,CAAC,IAAY,EAAY,EAAE;IAChD,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,OAAO,GAAG,CAAC,CAAC,CAAC;IAEjB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QACxC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QAEnB,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;gBAChB,CAAC,IAAI,CAAC,CAAC;YACT,CAAC;iBAAM,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;gBACtB,QAAQ,GAAG,KAAK,CAAC;YACnB,CAAC;YAED,SAAS;QACX,CAAC;QAED,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,QAAQ,GAAG,IAAI,CAAC;YAChB,OAAO,GAAG,CAAC,CAAC,CAAC;QACf,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACtB,OAAO,GAAG,CAAC,CAAC;QACd,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACpC,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC;gBACnB,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC;YAED,OAAO,GAAG,CAAC,CAAC,CAAC;QACf,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YACnE,OAAO,GAAG,CAAC,CAAC,CAAC;QACf,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC;AAEF,wFAAwF;AACxF,MAAM,aAAa,GAAG,EAAE,CAAC;AASzB;;;;GAIG;AACH,MAAM,UAAU,GAAG,CAAC,IAAY,EAAE,MAAgB,EAAe,EAAE;IACjE,MAAM,KAAK,GAAgB,EAAE,CAAC;IAE9B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;QAChD,MAAM,KAAK,GAAG,CAAC,GAAG,SAAS,IAAI,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,aAAa,CAAC;QAClE,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACvD,MAAM,IAAI,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;QAE1B,IAAI,IAAI,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YAC7B,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACnC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACtB,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1C,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAC9B,IAAY,EACZ,GAAuB,EACvB,OAAe,EACJ,EAAE;IACb,MAAM,EAAE,GAAG,oCAAoC,CAAC;IAChD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAEzB,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO;YACL;gBACE,EAAE,EAAE,MAAM;gBACV,MAAM,EAAE,QAAQ;gBAChB,EAAE;gBACF,OAAO,EAAE,GAAG,GAAG,IAAI,qCAAqC,GAAG,IAAI,WAAW;aAC3E;SACF,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,QAAQ,GAAG,IAAI,CAAC;IAEpB,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;QACpC,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1D,CAAC;IAED,IAAI,MAAM,GAAG,KAAK,CAAC;IAEnB,IAAI,CAAC;QACH,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QACrB,MAAM,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,GAAG,KAAK,CAAC;IACjB,CAAC;IAED,0FAA0F;IAC1F,IAAI,MAAM,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG,EAAE,CAAC;QACjC,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE;YACrE,IAAI,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;YAElC,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,UAAU,EAAE,EAAE,CAAC;gBACpC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC;YAC9D,CAAC;YAED,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;QAC3D,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,WAAW,CACT,IAAI,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EACnD,IAAI,CAAC,6BAA6B,CAAC,EACnC;YACE,EAAE;YACF,KAAK,EAAE,GAAG,OAAO,8JAA8J;SAChL,CACF;KACF,CAAC;AACJ,CAAC,CAAC"}
|