@brandlab-digital/site-core 0.1.0-alpha.19 → 0.1.0-alpha.2

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.
@@ -1,169 +0,0 @@
1
- /**
2
- * Location-page gate primitives and geography-registry contracts
3
- * (Brandlab Location Pages Standard §5, §7).
4
- *
5
- * The programmatic-quality gate is lifted from the accepted benchmark
6
- * implementation (sydney-tree-services `src/data/services/quality.ts`) so
7
- * every project derives draft/noindex/indexable the same way. The registry
8
- * types describe `standards/registry/sydney-geography.json` and the committed
9
- * snapshots client repos validate against.
10
- */
11
- export type ProgrammaticIndexationStatus = 'draft' | 'noindex' | 'indexable';
12
- export type ProgrammaticQualityTier = 'core' | 'supporting' | 'experimental';
13
- export type ProgrammaticContentDepth = 'thin' | 'standard' | 'strong';
14
- export type ProgrammaticProofLevel = 'none' | 'council' | 'review' | 'project';
15
- export type ProgrammaticSearchDemand = 'unknown' | 'low' | 'medium' | 'high';
16
- /** Suburb publication tier (standard §7.2). */
17
- export type SuburbTier = 'core' | 'secondary' | 'edge';
18
- export interface ProgrammaticQualitySignals {
19
- indexationStatus: ProgrammaticIndexationStatus;
20
- qualityTier: ProgrammaticQualityTier;
21
- contentDepth: ProgrammaticContentDepth;
22
- proofLevel: ProgrammaticProofLevel;
23
- searchDemand: ProgrammaticSearchDemand;
24
- uniqueLocalSignals: string[];
25
- qualityNotes: string[];
26
- }
27
- export interface IndexableProgrammaticRecord {
28
- indexationStatus: ProgrammaticIndexationStatus;
29
- }
30
- export declare function isIndexableProgrammaticRecord<T extends IndexableProgrammaticRecord>(record: T): record is T & {
31
- indexationStatus: 'indexable';
32
- };
33
- export declare function getProofLevelFromAssetIds(proofAssetIds: readonly string[]): ProgrammaticProofLevel;
34
- /**
35
- * The portfolio indexation gate: thin content or missing proof can never be
36
- * invited into the index; fewer than three unique local signals keeps a page
37
- * in draft (standard §7.1).
38
- */
39
- export declare function resolveIndexationStatus({ contentDepth, proofLevel, uniqueLocalSignals, }: Pick<ProgrammaticQualitySignals, 'contentDepth' | 'proofLevel' | 'uniqueLocalSignals'>): ProgrammaticIndexationStatus;
40
- export interface RegistryRegion {
41
- slug: string;
42
- name: string;
43
- /** Preferred query-facing region label for titles and primary headings. */
44
- seoName: string;
45
- /** Recognised search/display variants; these never create additional URLs. */
46
- alternateNames?: readonly string[];
47
- /** 'the' → copy reads "the Eastern Suburbs"; 'none' → "Western Sydney". */
48
- articleForm: 'the' | 'none';
49
- councilSlugs: readonly string[];
50
- }
51
- export interface RegistrySubRegion {
52
- slug: string;
53
- name: string;
54
- parentRegionSlug: string;
55
- /** Council-combo sub-region membership. */
56
- councilSlugs?: readonly string[];
57
- /** Explicit suburb membership for district-style sub-regions. */
58
- suburbSlugs?: readonly string[];
59
- /** Provenance for promoted project districts or audited groupings. */
60
- source?: string;
61
- }
62
- /**
63
- * Internal service-coverage partition. Coverage groups have no public name,
64
- * route, metadata, schema, sitemap, breadcrumb, navigation, or page model.
65
- */
66
- export interface RegistryCoverageGroup {
67
- slug: string;
68
- /** Maintainer-facing label; never render this value as customer copy. */
69
- adminLabel: string;
70
- regionSlug: string;
71
- visibility: 'internal';
72
- }
73
- export interface RegistryCouncil {
74
- slug: string;
75
- name: string;
76
- }
77
- export interface RegistrySuburb {
78
- name: string;
79
- slug: string;
80
- regionSlug: string;
81
- /** Internal service-coverage partition; never a page parent or URL segment. */
82
- coverageGroupSlug?: string;
83
- councilSlug: string;
84
- /** Secondary council memberships for split localities. */
85
- sharedCouncilSlugs?: readonly string[];
86
- /** Australia Post-matched postcode. */
87
- postcode: string;
88
- /** Stewardship notes for boundary bindings and corrections. */
89
- notes?: string;
90
- }
91
- export type RegistryNonSuburbEntityType = 'rural-locality' | 'natural-area' | 'protected-area' | 'waterbody';
92
- /**
93
- * Official NSW geography retained for spatial and council completeness but
94
- * excluded from the normal website suburb catalog.
95
- */
96
- export interface RegistryNonSuburbLocality {
97
- name: string;
98
- slug: string;
99
- regionSlug: string;
100
- councilSlug: string;
101
- sharedCouncilSlugs?: readonly string[];
102
- postcode: null;
103
- entityType: RegistryNonSuburbEntityType;
104
- officialUrbanity: 'R';
105
- defaultWebsiteEligibility: false;
106
- eligibilityReason: string;
107
- notes?: string;
108
- }
109
- export type RegistryOfficialLocality = RegistrySuburb | RegistryNonSuburbLocality;
110
- export interface GeographyRegistry {
111
- version: string;
112
- generated: string;
113
- /** Provenance: where the registry data was derived from. */
114
- sources?: readonly string[];
115
- /** Stewardship notes for maintainers. */
116
- notes?: string;
117
- regions: readonly RegistryRegion[];
118
- subRegions: readonly RegistrySubRegion[];
119
- /** Backend-only groupings used to select served suburbs. */
120
- coverageGroups: readonly RegistryCoverageGroup[];
121
- /** Legacy slug → canonical slug. */
122
- aliases: Readonly<Record<string, string>>;
123
- councils: readonly RegistryCouncil[];
124
- /** Postcode-backed candidates only; this does not itself approve pages. */
125
- suburbs: readonly RegistrySuburb[];
126
- /** Official non-suburb geography excluded from default website locations. */
127
- nonSuburbLocalities: readonly RegistryNonSuburbLocality[];
128
- }
129
- export type RegistryEntityKind = 'region' | 'subRegion' | 'council' | 'suburb';
130
- /** Canonical Brandlab slugify — identical to the benchmark implementation. */
131
- export declare function toLocationSlug(name: string): string;
132
- /**
133
- * Resolve a possibly-legacy slug within an explicit registry entity kind.
134
- *
135
- * Entity context is required because canonical suburb slugs such as
136
- * `blacktown`, `hornsby`, `randwick`, and `willoughby` are also legacy council
137
- * aliases. A canonical slug for the requested kind always wins over an alias.
138
- */
139
- export declare function resolveRegistryAlias(slug: string, registry: GeographyRegistry, kind: RegistryEntityKind | readonly RegistryEntityKind[]): string;
140
- export interface CatalogRegistryIssue {
141
- kind: 'unknown-region' | 'unknown-coverage-group' | 'unknown-council' | 'unknown-suburb' | 'excluded-website-locality' | 'suburb-region-mismatch' | 'suburb-coverage-group-mismatch' | 'suburb-council-mismatch';
142
- slug: string;
143
- detail: string;
144
- }
145
- export interface CatalogForValidation {
146
- regionSlugs: readonly string[];
147
- /** Backend coverage selectors; these are never treated as region/page slugs. */
148
- coverageGroupSlugs?: readonly string[];
149
- suburbs: readonly {
150
- slug: string;
151
- regionSlug: string;
152
- coverageGroupSlug?: string;
153
- councilSlug?: string;
154
- }[];
155
- }
156
- /**
157
- * Expand internal coverage selectors to canonical suburb slugs.
158
- *
159
- * This helper only answers where a business serves. It does not approve pages,
160
- * static params, sitemap entries, schema nodes, or internal links.
161
- */
162
- export declare function getCoverageGroupSuburbSlugs(coverageGroupSlugs: readonly string[], registry: GeographyRegistry): string[];
163
- /**
164
- * Validate a project catalog subset against the shared registry. Alias slugs
165
- * are resolved before comparison so migrated repos that kept live URLs can
166
- * still pass. Returns an empty array when the subset is clean.
167
- */
168
- export declare function validateCatalogAgainstRegistry(catalog: CatalogForValidation, registry: GeographyRegistry): CatalogRegistryIssue[];
169
- //# sourceMappingURL=locations.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"locations.d.ts","sourceRoot":"","sources":["../src/locations.ts"],"names":[],"mappings":"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"}
package/dist/locations.js DELETED
@@ -1,198 +0,0 @@
1
- /**
2
- * Location-page gate primitives and geography-registry contracts
3
- * (Brandlab Location Pages Standard §5, §7).
4
- *
5
- * The programmatic-quality gate is lifted from the accepted benchmark
6
- * implementation (sydney-tree-services `src/data/services/quality.ts`) so
7
- * every project derives draft/noindex/indexable the same way. The registry
8
- * types describe `standards/registry/sydney-geography.json` and the committed
9
- * snapshots client repos validate against.
10
- */
11
- export function isIndexableProgrammaticRecord(record) {
12
- return record.indexationStatus === 'indexable';
13
- }
14
- export function getProofLevelFromAssetIds(proofAssetIds) {
15
- if (proofAssetIds.some((proofAssetId) => proofAssetId.startsWith('project:'))) {
16
- return 'project';
17
- }
18
- if (proofAssetIds.some((proofAssetId) => proofAssetId.startsWith('region-review:'))) {
19
- return 'review';
20
- }
21
- if (proofAssetIds.some((proofAssetId) => proofAssetId.startsWith('council-source:'))) {
22
- return 'council';
23
- }
24
- return 'none';
25
- }
26
- /**
27
- * The portfolio indexation gate: thin content or missing proof can never be
28
- * invited into the index; fewer than three unique local signals keeps a page
29
- * in draft (standard §7.1).
30
- */
31
- export function resolveIndexationStatus({ contentDepth, proofLevel, uniqueLocalSignals, }) {
32
- if (contentDepth === 'thin' || proofLevel === 'none') {
33
- return 'noindex';
34
- }
35
- if (uniqueLocalSignals.length < 3) {
36
- return 'draft';
37
- }
38
- return 'indexable';
39
- }
40
- /** Canonical Brandlab slugify — identical to the benchmark implementation. */
41
- export function toLocationSlug(name) {
42
- return name
43
- .toLowerCase()
44
- .replace(/[^a-z0-9]+/g, '-')
45
- .replace(/(^-|-$)/g, '');
46
- }
47
- /**
48
- * Resolve a possibly-legacy slug within an explicit registry entity kind.
49
- *
50
- * Entity context is required because canonical suburb slugs such as
51
- * `blacktown`, `hornsby`, `randwick`, and `willoughby` are also legacy council
52
- * aliases. A canonical slug for the requested kind always wins over an alias.
53
- */
54
- export function resolveRegistryAlias(slug, registry, kind) {
55
- const kinds = Array.isArray(kind) ? kind : [kind];
56
- const canonicalSets = kinds.map((entityKind) => getRegistrySlugSet(registry, entityKind));
57
- if (canonicalSets.some((slugSet) => slugSet.has(slug)))
58
- return slug;
59
- const target = registry.aliases[slug];
60
- if (!target)
61
- return slug;
62
- return canonicalSets.some((slugSet) => slugSet.has(target)) ? target : slug;
63
- }
64
- /**
65
- * Expand internal coverage selectors to canonical suburb slugs.
66
- *
67
- * This helper only answers where a business serves. It does not approve pages,
68
- * static params, sitemap entries, schema nodes, or internal links.
69
- */
70
- export function getCoverageGroupSuburbSlugs(coverageGroupSlugs, registry) {
71
- const knownCoverageGroupSlugs = new Set(registry.coverageGroups.map((group) => group.slug));
72
- const unknownCoverageGroupSlug = coverageGroupSlugs.find((slug) => !knownCoverageGroupSlugs.has(slug));
73
- if (unknownCoverageGroupSlug) {
74
- throw new Error(`Unknown registry coverage group "${unknownCoverageGroupSlug}".`);
75
- }
76
- const selected = new Set(coverageGroupSlugs);
77
- return registry.suburbs
78
- .filter((suburb) => suburb.coverageGroupSlug && selected.has(suburb.coverageGroupSlug))
79
- .map((suburb) => suburb.slug);
80
- }
81
- /**
82
- * Validate a project catalog subset against the shared registry. Alias slugs
83
- * are resolved before comparison so migrated repos that kept live URLs can
84
- * still pass. Returns an empty array when the subset is clean.
85
- */
86
- export function validateCatalogAgainstRegistry(catalog, registry) {
87
- const issues = [];
88
- const regionSlugSet = new Set(registry.regions.map((region) => region.slug));
89
- const subRegionSlugSet = new Set(registry.subRegions.map((subRegion) => subRegion.slug));
90
- const coverageGroupSlugSet = new Set(registry.coverageGroups.map((group) => group.slug));
91
- const councilSlugSet = new Set(registry.councils.map((council) => council.slug));
92
- const suburbBySlug = new Map(registry.suburbs.map((suburb) => [suburb.slug, suburb]));
93
- const nonSuburbLocalityBySlug = new Map(registry.nonSuburbLocalities.map((locality) => [locality.slug, locality]));
94
- for (const rawRegionSlug of catalog.regionSlugs) {
95
- const regionSlug = resolveRegistryAlias(rawRegionSlug, registry, ['region', 'subRegion']);
96
- if (!regionSlugSet.has(regionSlug) && !subRegionSlugSet.has(regionSlug)) {
97
- issues.push({
98
- kind: 'unknown-region',
99
- slug: rawRegionSlug,
100
- detail: `Region slug "${rawRegionSlug}" is not a registry region, sub-region, or alias.`,
101
- });
102
- }
103
- }
104
- for (const coverageGroupSlug of catalog.coverageGroupSlugs ?? []) {
105
- if (!coverageGroupSlugSet.has(coverageGroupSlug)) {
106
- issues.push({
107
- kind: 'unknown-coverage-group',
108
- slug: coverageGroupSlug,
109
- detail: `Coverage group slug "${coverageGroupSlug}" is not an internal registry coverage group.`,
110
- });
111
- }
112
- }
113
- for (const suburb of catalog.suburbs) {
114
- const resolvedSuburbSlug = suburbBySlug.has(suburb.slug)
115
- ? suburb.slug
116
- : resolveRegistryAlias(suburb.slug, registry, 'suburb');
117
- const registrySuburb = suburbBySlug.get(resolvedSuburbSlug);
118
- if (!registrySuburb) {
119
- const excludedLocality = nonSuburbLocalityBySlug.get(suburb.slug);
120
- if (excludedLocality) {
121
- issues.push({
122
- kind: 'excluded-website-locality',
123
- slug: suburb.slug,
124
- detail: `Official locality "${suburb.slug}" is classified as ${excludedLocality.entityType} and excluded from the normal website suburb catalog: ${excludedLocality.eligibilityReason}`,
125
- });
126
- continue;
127
- }
128
- issues.push({
129
- kind: 'unknown-suburb',
130
- slug: suburb.slug,
131
- detail: `Suburb slug "${suburb.slug}" is not in the registry (not gazetted, or needs adding to the registry first).`,
132
- });
133
- continue;
134
- }
135
- const regionSlug = resolveRegistryAlias(suburb.regionSlug, registry, ['region', 'subRegion']);
136
- const regionMatches = registrySuburb.regionSlug === regionSlug ||
137
- registry.subRegions.some((subRegion) => subRegion.slug === regionSlug &&
138
- subRegion.parentRegionSlug === registrySuburb.regionSlug &&
139
- (subRegion.suburbSlugs?.includes(registrySuburb.slug) ||
140
- subRegion.councilSlugs?.some((councilSlug) => councilSlug === registrySuburb.councilSlug ||
141
- registrySuburb.sharedCouncilSlugs?.includes(councilSlug))));
142
- if (!regionMatches) {
143
- issues.push({
144
- kind: 'suburb-region-mismatch',
145
- slug: suburb.slug,
146
- detail: `Suburb "${suburb.slug}" is assigned to "${suburb.regionSlug}" but the registry places it in "${registrySuburb.regionSlug}".`,
147
- });
148
- }
149
- if (suburb.coverageGroupSlug) {
150
- if (!coverageGroupSlugSet.has(suburb.coverageGroupSlug)) {
151
- issues.push({
152
- kind: 'unknown-coverage-group',
153
- slug: suburb.coverageGroupSlug,
154
- detail: `Coverage group slug "${suburb.coverageGroupSlug}" is not an internal registry coverage group.`,
155
- });
156
- }
157
- else if (registrySuburb.coverageGroupSlug !== suburb.coverageGroupSlug) {
158
- issues.push({
159
- kind: 'suburb-coverage-group-mismatch',
160
- slug: suburb.slug,
161
- detail: `Suburb "${suburb.slug}" is assigned to coverage group "${suburb.coverageGroupSlug}" but the registry places it under "${registrySuburb.coverageGroupSlug ?? 'none'}".`,
162
- });
163
- }
164
- }
165
- if (suburb.councilSlug) {
166
- const councilSlug = resolveRegistryAlias(suburb.councilSlug, registry, 'council');
167
- if (!councilSlugSet.has(councilSlug)) {
168
- issues.push({
169
- kind: 'unknown-council',
170
- slug: suburb.councilSlug,
171
- detail: `Council slug "${suburb.councilSlug}" is not a registry council or alias.`,
172
- });
173
- }
174
- else if (registrySuburb.councilSlug !== councilSlug &&
175
- !registrySuburb.sharedCouncilSlugs?.includes(councilSlug)) {
176
- issues.push({
177
- kind: 'suburb-council-mismatch',
178
- slug: suburb.slug,
179
- detail: `Suburb "${suburb.slug}" is assigned to council "${suburb.councilSlug}" but the registry places it under "${registrySuburb.councilSlug}".`,
180
- });
181
- }
182
- }
183
- }
184
- return issues;
185
- }
186
- function getRegistrySlugSet(registry, kind) {
187
- switch (kind) {
188
- case 'region':
189
- return new Set(registry.regions.map((region) => region.slug));
190
- case 'subRegion':
191
- return new Set(registry.subRegions.map((subRegion) => subRegion.slug));
192
- case 'council':
193
- return new Set(registry.councils.map((council) => council.slug));
194
- case 'suburb':
195
- return new Set(registry.suburbs.map((suburb) => suburb.slug));
196
- }
197
- }
198
- //# sourceMappingURL=locations.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"locations.js","sourceRoot":"","sources":["../src/locations.ts"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- export interface RichTextHrefPolicy {
2
- allowedProtocols?: readonly string[];
3
- allowInternalPaths?: boolean;
4
- allowHashLinks?: boolean;
5
- }
6
- export declare function sanitizeRichTextHref(href: string, { allowedProtocols, allowInternalPaths, allowHashLinks, }?: RichTextHrefPolicy): string | null;
7
- export declare function assertSafeRichTextHref(href: string, policy?: RichTextHrefPolicy): string;
8
- //# sourceMappingURL=rich-text.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rich-text.d.ts","sourceRoot":"","sources":["../src/rich-text.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,kBAAkB;IACjC,gBAAgB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAA;IACpC,kBAAkB,CAAC,EAAE,OAAO,CAAA;IAC5B,cAAc,CAAC,EAAE,OAAO,CAAA;CACzB;AASD,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,MAAM,EACZ,EACE,gBAA4C,EAC5C,kBAAyB,EACzB,cAAqB,GACtB,GAAE,kBAAuB,GACzB,MAAM,GAAG,IAAI,CAuBf;AAED,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,kBAAkB,UAQ/E"}
package/dist/rich-text.js DELETED
@@ -1,34 +0,0 @@
1
- const DEFAULT_ALLOWED_PROTOCOLS = ['https:', 'mailto:', 'tel:'];
2
- const CONTROL_CHARACTER_PATTERN = /[\u0000-\u001f\u007f]/;
3
- function normalizeAllowedProtocols(protocols) {
4
- return new Set(protocols.map((protocol) => protocol.toLowerCase()));
5
- }
6
- export function sanitizeRichTextHref(href, { allowedProtocols = DEFAULT_ALLOWED_PROTOCOLS, allowInternalPaths = true, allowHashLinks = true, } = {}) {
7
- const value = href.trim();
8
- if (!value || CONTROL_CHARACTER_PATTERN.test(value)) {
9
- return null;
10
- }
11
- if (allowHashLinks && value.startsWith('#')) {
12
- return value;
13
- }
14
- if (allowInternalPaths && value.startsWith('/')) {
15
- return value.startsWith('//') ? null : value;
16
- }
17
- try {
18
- const url = new URL(value);
19
- return normalizeAllowedProtocols(allowedProtocols).has(url.protocol.toLowerCase())
20
- ? value
21
- : null;
22
- }
23
- catch {
24
- return null;
25
- }
26
- }
27
- export function assertSafeRichTextHref(href, policy) {
28
- const sanitizedHref = sanitizeRichTextHref(href, policy);
29
- if (!sanitizedHref) {
30
- throw new Error('Unsafe rich text link href.');
31
- }
32
- return sanitizedHref;
33
- }
34
- //# sourceMappingURL=rich-text.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"rich-text.js","sourceRoot":"","sources":["../src/rich-text.ts"],"names":[],"mappings":"AAMA,MAAM,yBAAyB,GAAG,CAAC,QAAQ,EAAE,SAAS,EAAE,MAAM,CAAU,CAAA;AACxE,MAAM,yBAAyB,GAAG,uBAAuB,CAAA;AAEzD,SAAS,yBAAyB,CAAC,SAA4B;IAC7D,OAAO,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC,CAAA;AACrE,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,IAAY,EACZ,EACE,gBAAgB,GAAG,yBAAyB,EAC5C,kBAAkB,GAAG,IAAI,EACzB,cAAc,GAAG,IAAI,MACC,EAAE;IAE1B,MAAM,KAAK,GAAG,IAAI,CAAC,IAAI,EAAE,CAAA;IAEzB,IAAI,CAAC,KAAK,IAAI,yBAAyB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;QACpD,OAAO,IAAI,CAAA;IACb,CAAC;IAED,IAAI,cAAc,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAA;IACd,CAAC;IAED,IAAI,kBAAkB,IAAI,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAChD,OAAO,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAA;IAC9C,CAAC;IAED,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAA;QAC1B,OAAO,yBAAyB,CAAC,gBAAgB,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC;YAChF,CAAC,CAAC,KAAK;YACP,CAAC,CAAC,IAAI,CAAA;IACV,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAA;IACb,CAAC;AACH,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,IAAY,EAAE,MAA2B;IAC9E,MAAM,aAAa,GAAG,oBAAoB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAA;IAExD,IAAI,CAAC,aAAa,EAAE,CAAC;QACnB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAA;IAChD,CAAC;IAED,OAAO,aAAa,CAAA;AACtB,CAAC"}