@chrtco/sdk 0.5.0 → 0.7.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/CHANGELOG.md +12 -0
- package/dist/atlas/browser.cjs +3245 -0
- package/dist/atlas/browser.cjs.map +1 -0
- package/dist/atlas/browser.d.cts +33 -0
- package/dist/atlas/browser.d.ts +33 -0
- package/dist/atlas/browser.js +3215 -0
- package/dist/atlas/browser.js.map +1 -0
- package/dist/index.cjs +9347 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +825 -5
- package/dist/index.d.ts +825 -5
- package/dist/index.js +9273 -2
- package/dist/index.js.map +1 -1
- package/dist/s52-colors-CdVzqt2K.d.cts +17 -0
- package/dist/s52-colors-CdVzqt2K.d.ts +17 -0
- package/package.json +18 -1
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/client.ts","../src/endpoints/tiles.ts","../src/endpoints/cells.ts","../src/endpoints/coverage.ts","../src/endpoints/features.ts","../src/endpoints/query.ts","../src/endpoints/offline-errors.ts","../src/endpoints/offline-token-manager.ts","../src/endpoints/offline-style.ts","../src/endpoints/offline-manifest.ts","../src/endpoints/offline.ts","../src/pagination.ts","../src/webhooks.ts"],"sourcesContent":["import { HttpClient, ChrtError } from \"./client.js\";\nimport { TilesEndpoint } from \"./endpoints/tiles.js\";\nimport { CellsEndpoint } from \"./endpoints/cells.js\";\nimport { CoverageEndpoint } from \"./endpoints/coverage.js\";\nimport { FeaturesEndpoint } from \"./endpoints/features.js\";\nimport { QueryEndpoint } from \"./endpoints/query.js\";\nimport { OfflineEndpoint } from \"./endpoints/offline.js\";\nimport { paginate } from \"./pagination.js\";\nimport type {\n ChrtConfig,\n FeaturesOptions,\n QueryOptions,\n CellsOptions,\n CoverageOptions,\n FeatureCollection,\n GeoJsonFeature,\n CellsResponse,\n CellDetail,\n CoverageResponse,\n TransformRequest,\n} from \"./types.js\";\n\nexport class Chrt {\n /** Tile endpoints — styleUrl, tileUrl, groups */\n readonly tiles: TilesEndpoint;\n /** Cell catalogue endpoints — list, get */\n readonly cells: CellsEndpoint;\n /** Coverage data — list available chart sources */\n readonly coverage: CoverageEndpoint;\n /**\n * CHRToffline — download MBTiles bundles for offline use.\n * Requires `deviceId` in config. Manifest-based budget enforcement\n * requires `manifestPath`.\n */\n readonly offline: OfflineEndpoint;\n\n private featuresEp: FeaturesEndpoint;\n private queryEp: QueryEndpoint;\n private http: HttpClient;\n\n constructor(apiKeyOrConfig: string | ChrtConfig) {\n const config =\n typeof apiKeyOrConfig === \"string\"\n ? { apiKey: apiKeyOrConfig }\n : apiKeyOrConfig;\n\n this.http = new HttpClient(config.apiKey, config.baseUrl, config.retries);\n this.tiles = new TilesEndpoint(this.http);\n this.cells = new CellsEndpoint(this.http);\n this.coverage = new CoverageEndpoint(this.http);\n this.featuresEp = new FeaturesEndpoint(this.http);\n this.queryEp = new QueryEndpoint(this.http);\n this.offline = new OfflineEndpoint(this.http, config.deviceId, config.manifestPath);\n }\n\n /* ── Convenience shortcuts ───────────────────────── */\n\n /** Query GeoJSON features by bounding box */\n async features(options: FeaturesOptions): Promise<FeatureCollection> {\n return this.featuresEp.list(options);\n }\n\n /** Spatial proximity query around a point */\n async query(options: QueryOptions): Promise<FeatureCollection> {\n return this.queryEp.nearby(options);\n }\n\n // ── [CHRTquery] Staged — uncomment when serve-query/route is live ──\n //\n // /** Discover ENC cells along a route */\n // async routeQuery(options: RouteQueryOptions): Promise<RouteQueryResponse> {\n // return this.queryEp.alongRoute(options);\n // }\n\n // ── [CHRTquery] Staged — uncomment when serve-query/route/features is live ──\n //\n // /** Find individual features along a route */\n // async routeFeatures(options: RouteFeatureQueryOptions): Promise<RouteFeatureQueryResponse> {\n // return this.queryEp.featuresAlongRoute(options);\n // }\n //\n // /** Iterate all features along a route, auto-paginating */\n // routeFeaturesIter(\n // options: Omit<RouteFeatureQueryOptions, \"offset\">,\n // ): AsyncIterable<GeoJsonFeature> {\n // const pageSize = options.limit ?? 100;\n // return paginate<RouteFeatureQueryResponse, GeoJsonFeature>(\n // (offset, signal) =>\n // this.routeFeatures({ ...options, limit: pageSize, offset, signal }),\n // (r) => r.features,\n // (r) => r.total_count ?? 0,\n // { pageSize, signal: options.signal },\n // );\n // }\n\n /* ── Auto-pagination iterators ───────────────────── */\n\n /**\n * Iterate all features matching a bounding-box query, auto-paginating.\n *\n * @example\n * ```ts\n * for await (const feature of chrt.featuresIter({ bbox: [-74, 40, -73, 41] })) {\n * console.log(feature.properties);\n * }\n * ```\n */\n featuresIter(\n options: Omit<FeaturesOptions, \"offset\">,\n ): AsyncIterable<GeoJsonFeature> {\n const pageSize = options.limit ?? 100;\n return paginate<FeatureCollection, GeoJsonFeature>(\n (offset, signal) =>\n this.features({ ...options, limit: pageSize, offset, signal }),\n (r) => r.features,\n (r) => r.total_count ?? 0,\n { pageSize, signal: options.signal },\n );\n }\n\n /**\n * Iterate all cells matching a query, auto-paginating.\n *\n * @example\n * ```ts\n * for await (const cell of chrt.cellsIter({ source: \"NOAA\" })) {\n * console.log(cell.cell_id, cell.title);\n * }\n * ```\n */\n cellsIter(\n options?: Omit<CellsOptions, \"offset\">,\n ): AsyncIterable<CellDetail> {\n const pageSize = options?.limit ?? 100;\n return paginate<CellsResponse, CellDetail>(\n (offset, signal) =>\n this.cells.list({ ...options, limit: pageSize, offset, signal }),\n (r) => r.cells,\n (r) => r.total_count,\n { pageSize, signal: options?.signal },\n );\n }\n\n /* ── Map integration helpers ─────────────────────── */\n\n /** Returns a style.json URL ready for Mapbox GL / MapLibre */\n styleUrl(): string {\n return this.tiles.styleUrl();\n }\n\n /**\n * Returns a `transformRequest` function for Mapbox GL JS / MapLibre GL JS.\n * Injects the API key header for requests to api.chrt.co.\n *\n * @example\n * const map = new mapboxgl.Map({\n * style: chrt.styleUrl(),\n * transformRequest: chrt.transformRequest(),\n * });\n */\n transformRequest(): (url: string) => TransformRequest | undefined {\n const apiKey = this.http.getApiKey();\n return (url: string) => {\n if (url.includes(\"api.chrt.co\")) {\n return { url, headers: { \"x-api-key\": apiKey } };\n }\n return undefined;\n };\n }\n}\n\n/* ── Re-exports ────────────────────────────────────── */\n\nexport { ChrtError } from \"./client.js\";\nexport { paginate } from \"./pagination.js\";\nexport { parseWebhook } from \"./webhooks.js\";\nexport { OfflineError } from \"./endpoints/offline-errors.js\";\nexport type { OfflineErrorCode } from \"./endpoints/offline-errors.js\";\nexport type { FileSystemAdapter } from \"./fs-adapter.js\";\n\n/* ── Offline style helper (Phase 8c) ───────────────── */\nexport {\n buildOfflineStyle,\n OfflineStyleError,\n} from \"./endpoints/offline-style.js\";\nexport type {\n MapLibreStyle,\n BuildOfflineStyleOptions,\n OfflineStylePlatform,\n} from \"./endpoints/offline-style.js\";\n\nexport type {\n ChrtConfig,\n FeaturesOptions,\n QueryOptions,\n CellsOptions,\n CoverageOptions,\n FeatureCollection,\n GeoJsonFeature,\n GeoJsonGeometry,\n CellsResponse,\n CellDetail,\n CoverageSource,\n CoverageResponse,\n TileGroup,\n TileGroupsResponse,\n TransformRequest,\n RouteQueryOptions,\n RouteQueryResponse,\n RouteFeatureQueryOptions,\n RouteFeatureQueryResponse,\n OfflineRegionSummary,\n OfflineBundleResponse,\n OfflineDownloadOptions,\n OfflineDownloadResult,\n OfflineDownloadProgress,\n OfflineRemoveOptions,\n OfflineHeartbeatOptions,\n OfflineFetchStyleOptions,\n OfflineStyleResponse,\n} from \"./types.js\";\nexport type {\n WebhookPayload,\n WebhookEvent,\n WebhookEventType,\n CellUpdatedEvent,\n CellNewEvent,\n CellDeletedEvent,\n CellEventData,\n CellUpdatedData,\n} from \"./webhooks.js\";\n","import type { ChrtErrorBody } from \"./types.js\";\n\nconst DEFAULT_BASE_URL = \"https://api.chrt.co/v1\";\n\nexport class ChrtError extends Error {\n status: number;\n code?: string;\n body?: ChrtErrorBody;\n\n constructor(status: number, body?: ChrtErrorBody) {\n super(body?.message ?? body?.error ?? `CHRT API error ${status}`);\n this.name = \"ChrtError\";\n this.status = status;\n this.code = body?.code;\n this.body = body;\n }\n}\n\nexport class HttpClient {\n private apiKey: string;\n private baseUrl: string;\n private retries: number;\n\n constructor(apiKey: string, baseUrl?: string, retries = 2) {\n this.apiKey = apiKey;\n this.baseUrl = (baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n this.retries = retries;\n }\n\n getBaseUrl(): string {\n return this.baseUrl;\n }\n\n getApiKey(): string {\n return this.apiKey;\n }\n\n async request<T>(\n path: string,\n params?: Record<string, string | number | undefined>,\n signal?: AbortSignal,\n ): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`);\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n if (v !== undefined) url.searchParams.set(k, String(v));\n }\n }\n\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= this.retries; attempt++) {\n if (signal?.aborted) {\n throw signal.reason ?? new DOMException(\"The operation was aborted.\", \"AbortError\");\n }\n\n try {\n const res = await fetch(url.toString(), {\n headers: { \"x-api-key\": this.apiKey },\n signal,\n });\n\n if (!res.ok) {\n let body: ChrtErrorBody | undefined;\n try {\n body = await res.json() as ChrtErrorBody;\n } catch {\n /* empty */\n }\n const err = new ChrtError(res.status, body);\n\n // Only retry on 5xx\n if (res.status >= 500 && attempt < this.retries) {\n lastError = err;\n await sleep(100 * 2 ** attempt);\n continue;\n }\n throw err;\n }\n\n return (await res.json()) as T;\n } catch (e) {\n if (e instanceof ChrtError) throw e;\n // Don't retry aborted requests\n if (signal?.aborted) throw e;\n lastError = e as Error;\n if (attempt < this.retries) {\n await sleep(100 * 2 ** attempt);\n continue;\n }\n }\n }\n\n throw lastError ?? new Error(\"CHRT API request failed\");\n }\n\n /**\n * Typed wrapper for non-GET JSON requests. Returns the parsed body and HTTP\n * status together so callers (e.g. offline endpoints) can map error bodies\n * to typed errors without throwing at the HTTP layer. Auth defaults to\n * `x-api-key` header; pass `bearerToken` to swap to `Authorization: Bearer`.\n * No retry — the offline flow owns its own retry logic.\n */\n async postJson<T>(\n path: string,\n body: unknown,\n opts?: { bearerToken?: string; signal?: AbortSignal },\n ): Promise<{ ok: boolean; status: number; body: T | null }> {\n const url = new URL(`${this.baseUrl}${path}`);\n const headers: Record<string, string> = { \"content-type\": \"application/json\" };\n if (opts?.bearerToken) {\n headers[\"authorization\"] = `Bearer ${opts.bearerToken}`;\n } else {\n headers[\"x-api-key\"] = this.apiKey;\n }\n\n const res = await fetch(url.toString(), {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal: opts?.signal,\n });\n\n let parsed: T | null = null;\n try {\n parsed = (await res.json()) as T;\n } catch {\n parsed = null;\n }\n return { ok: res.ok, status: res.status, body: parsed };\n }\n\n /** GET with Bearer auth (for offline-worker endpoints that require a JWT). */\n async getJsonWithBearer<T>(\n path: string,\n bearerToken: string,\n signal?: AbortSignal,\n ): Promise<{ ok: boolean; status: number; body: T | null }> {\n const url = new URL(`${this.baseUrl}${path}`);\n const res = await fetch(url.toString(), {\n method: \"GET\",\n headers: { authorization: `Bearer ${bearerToken}` },\n signal,\n });\n let parsed: T | null = null;\n try {\n parsed = (await res.json()) as T;\n } catch {\n parsed = null;\n }\n return { ok: res.ok, status: res.status, body: parsed };\n }\n}\n\nfunction sleep(ms: number) {\n return new Promise((r) => setTimeout(r, ms));\n}\n","import type { HttpClient } from \"../client.js\";\nimport type { TileGroupsResponse } from \"../types.js\";\n\nexport class TilesEndpoint {\n constructor(private http: HttpClient) {}\n\n /** Full style.json URL with API key as query param */\n styleUrl(): string {\n return `${this.http.getBaseUrl()}/tiles/style.json?key=${this.http.getApiKey()}`;\n }\n\n /** Individual tile URL template */\n tileUrl(z: number, x: number, y: number, format: \"pbf\" | \"mvt\" = \"mvt\"): string {\n return `${this.http.getBaseUrl()}/tiles/${z}/${x}/${y}.${format}?key=${this.http.getApiKey()}`;\n }\n\n /** List available tileset groups */\n async groups(): Promise<TileGroupsResponse> {\n return this.http.request<TileGroupsResponse>(\"/tiles/groups\");\n }\n}\n","import type { HttpClient } from \"../client.js\";\nimport type { CellsOptions, CellsResponse, CellDetail } from \"../types.js\";\n\nexport class CellsEndpoint {\n constructor(private http: HttpClient) {}\n\n /** List ENC cells with optional filters */\n async list(options?: CellsOptions): Promise<CellsResponse> {\n const { signal, ...params } = options ?? {};\n return this.http.request<CellsResponse>(\n \"/cells\",\n params as Record<string, string | number | undefined>,\n signal,\n );\n }\n\n /** Get a single cell by ID */\n async get(cellId: string, signal?: AbortSignal): Promise<CellDetail> {\n return this.http.request<CellDetail>(\n `/cells/${encodeURIComponent(cellId)}`,\n undefined,\n signal,\n );\n }\n}\n","import type { HttpClient } from \"../client.js\";\nimport type { CoverageOptions, CoverageResponse } from \"../types.js\";\n\nexport class CoverageEndpoint {\n constructor(private http: HttpClient) {}\n\n /** List available chart sources with cell counts */\n async list(options?: CoverageOptions): Promise<CoverageResponse> {\n const { signal, ...params } = options ?? {};\n return this.http.request<CoverageResponse>(\n \"/coverage\",\n params as Record<string, string | number | undefined>,\n signal,\n );\n }\n}\n","import type { HttpClient } from \"../client.js\";\nimport type { FeaturesOptions, FeatureCollection } from \"../types.js\";\n\nexport class FeaturesEndpoint {\n constructor(private http: HttpClient) {}\n\n /** Query features within a bounding box */\n async list(options: FeaturesOptions): Promise<FeatureCollection> {\n return this.http.request<FeatureCollection>(\n \"/features\",\n {\n bbox: options.bbox.join(\",\"),\n layer: options.layer,\n limit: options.limit,\n offset: options.offset,\n },\n options.signal,\n );\n }\n}\n","import type { HttpClient } from \"../client.js\";\nimport type { QueryOptions, FeatureCollection } from \"../types.js\";\n// import type { RouteQueryOptions, RouteQueryResponse } from \"../types.js\";\n\nexport class QueryEndpoint {\n constructor(private http: HttpClient) {}\n\n /** Spatial proximity search around a point */\n async nearby(options: QueryOptions): Promise<FeatureCollection> {\n return this.http.request<FeatureCollection>(\n \"/query\",\n {\n point: options.point.join(\",\"),\n radius: options.radius,\n layer: options.layer,\n limit: options.limit,\n },\n options.signal,\n );\n }\n\n // ── [CHRTquery] Staged — uncomment when serve-query/route is live ──\n //\n // /** Discover ENC cells along a route LineString */\n // async alongRoute(options: RouteQueryOptions): Promise<RouteQueryResponse> {\n // const route = {\n // type: \"LineString\" as const,\n // coordinates: options.route,\n // };\n // return this.http.request<RouteQueryResponse>(\n // \"/query/route\",\n // {\n // route: JSON.stringify(route),\n // buffer: options.buffer,\n // source: options.source,\n // scale_band: options.scaleBand,\n // limit: options.limit,\n // },\n // options.signal,\n // );\n // }\n\n // ── [CHRTquery] Staged — uncomment when serve-query/route/features is live ──\n //\n // /** Find individual features along a route LineString */\n // async featuresAlongRoute(options: RouteFeatureQueryOptions): Promise<RouteFeatureQueryResponse> {\n // const route = {\n // type: \"LineString\" as const,\n // coordinates: options.route,\n // };\n // return this.http.request<RouteFeatureQueryResponse>(\n // \"/query/route/features\",\n // {\n // route: JSON.stringify(route),\n // buffer: options.buffer,\n // layer: options.layer,\n // limit: options.limit,\n // offset: options.offset,\n // },\n // options.signal,\n // );\n // }\n}\n","/**\n * Typed errors surfaced by `chrt.offline.*`.\n *\n * Callers switch on `.code` — never parse `.message`. `.status` is set only\n * when the error originated from an HTTP response. `.detail` carries\n * machine-readable context for programmatic handling (byte math for budget\n * violations, `resumable: true` for interrupts, etc.).\n */\n\nexport type OfflineErrorCode =\n | \"budget_exceeded\"\n | \"coverage_denied\"\n | \"quota_exceeded\"\n | \"download_corrupt\"\n | \"network_interrupted\"\n | \"partial_file_invalid\"\n | \"invalid_api_key\"\n | \"region_not_available\"\n | \"offline_not_enabled\"\n | \"missing_device_id\"\n | \"missing_manifest_path\"\n | \"sha_missing\"\n | \"unexpected_response\";\n\nexport class OfflineError extends Error {\n readonly code: OfflineErrorCode;\n readonly status?: number;\n readonly detail?: Record<string, unknown>;\n\n constructor(\n code: OfflineErrorCode,\n message: string,\n status?: number,\n detail?: Record<string, unknown>,\n ) {\n super(message);\n this.name = \"OfflineError\";\n this.code = code;\n this.status = status;\n this.detail = detail;\n }\n}\n\n/**\n * Map a server-side error body (mint-offline-token, offline-worker) to an\n * OfflineErrorCode. The server uses both `code` and `error` keys depending on\n * route; we try both.\n */\nexport function mapServerError(\n body: unknown,\n status: number,\n): { code: OfflineErrorCode; detail?: Record<string, unknown> } {\n const b = (body ?? {}) as Record<string, unknown>;\n const raw = typeof b.code === \"string\" ? b.code : typeof b.error === \"string\" ? b.error : \"\";\n\n // Server-side strings that have a direct typed analogue.\n switch (raw) {\n case \"offline_budget_exceeded\":\n return {\n code: \"budget_exceeded\",\n detail: {\n budget_bytes: b.budget_bytes,\n required_bytes: b.required_bytes,\n over_by_bytes: b.over_by_bytes,\n remaining_bytes: b.remaining_bytes,\n },\n };\n case \"offline_not_enabled\":\n return { code: \"offline_not_enabled\" };\n case \"region_not_licensed\":\n return {\n code: \"coverage_denied\",\n detail: { requested: b.requested, allowed: b.allowed },\n };\n case \"no_offline_builds\":\n case \"no_offline_build\":\n return { code: \"region_not_available\", detail: { detail: b.detail, region: b.region } };\n case \"invalid_api_key\":\n case \"missing_auth\":\n return { code: \"invalid_api_key\" };\n case \"tile_quota_exceeded\":\n return { code: \"quota_exceeded\" };\n case \"rate_limited\":\n return {\n code: \"quota_exceeded\",\n detail: { limit: b.limit, period_seconds: b.period_seconds },\n };\n case \"revoked\":\n return { code: \"invalid_api_key\", detail: { reason: \"revoked\" } };\n }\n\n // Status-based fallbacks for error strings we don't recognize.\n if (status === 401) return { code: \"invalid_api_key\" };\n if (status === 403) return { code: \"coverage_denied\" };\n if (status === 429) return { code: \"quota_exceeded\" };\n if (status === 503) return { code: \"region_not_available\" };\n\n return { code: \"unexpected_response\", detail: { raw_error: raw } };\n}\n","import type { HttpClient } from \"../client.js\";\nimport { OfflineError, mapServerError } from \"./offline-errors.js\";\n\n/**\n * Fresh-token shape from POST `/v1/mint/offline-token` (proxied to Supabase\n * `mint-offline-token`). Mirrors docs/api/tile-jwt-claims.md §4.\n */\nexport interface MintedOfflineToken {\n token: string;\n expiresAt: number;\n kid: string;\n offlineUntil: number;\n /** Per-region build_tag map returned by the mint function. */\n buildTags: Record<string, string>;\n gracePeriodDays: number;\n}\n\ninterface MintResponseBody {\n token?: unknown;\n expires_at?: unknown;\n kid?: unknown;\n offline_until?: unknown;\n regions?: unknown;\n grace_period_days?: unknown;\n}\n\n/** Refresh this many seconds before `exp`. */\nconst REFRESH_MARGIN_SECONDS = 30;\n\nfunction now(): number {\n return Math.floor(Date.now() / 1000);\n}\n\n/**\n * Cache + single-flight mint for offline JWTs.\n *\n * - Keyed by `(deviceId, sorted-regions)` so a token scoped to one region\n * doesn't accidentally get reused for a broader request.\n * - Refreshes 30s before `exp`.\n * - While a mint is in flight, concurrent callers share the same promise.\n */\nexport class OfflineTokenManager {\n private readonly cache = new Map<string, MintedOfflineToken>();\n private readonly pending = new Map<string, Promise<MintedOfflineToken>>();\n\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Get a fresh-enough token for the caller's device + requested regions.\n * If `regions` is omitted, the mint function defaults to the key's full\n * `allowed_sources`.\n */\n async getToken(deviceId: string, regions?: string[]): Promise<MintedOfflineToken> {\n if (!deviceId) {\n throw new OfflineError(\"missing_device_id\", \"deviceId is required for offline operations\");\n }\n const key = this.cacheKey(deviceId, regions);\n\n const cached = this.cache.get(key);\n if (cached && cached.expiresAt - now() > REFRESH_MARGIN_SECONDS) {\n return cached;\n }\n\n const inflight = this.pending.get(key);\n if (inflight) return inflight;\n\n const promise = this.mintFresh(deviceId, regions).finally(() => {\n this.pending.delete(key);\n });\n this.pending.set(key, promise);\n const token = await promise;\n this.cache.set(key, token);\n return token;\n }\n\n /** Force-evict the cached token for a (deviceId, regions) pair. Used after a 401. */\n invalidate(deviceId: string, regions?: string[]): void {\n this.cache.delete(this.cacheKey(deviceId, regions));\n }\n\n private cacheKey(deviceId: string, regions?: string[]): string {\n const tail = regions && regions.length > 0 ? [...regions].sort().join(\",\") : \"*\";\n return `${deviceId}::${tail}`;\n }\n\n private async mintFresh(deviceId: string, regions?: string[]): Promise<MintedOfflineToken> {\n const body: { device_id: string; regions?: string[] } = { device_id: deviceId };\n if (regions && regions.length > 0) body.regions = regions;\n\n const res = await this.http.postJson<MintResponseBody>(\"/mint/offline-token\", body);\n\n if (!res.ok) {\n const mapped = mapServerError(res.body, res.status);\n throw new OfflineError(\n mapped.code,\n `mint-offline-token failed: HTTP ${res.status}`,\n res.status,\n mapped.detail,\n );\n }\n\n const body2 = res.body ?? {};\n const regionsArr = Array.isArray(body2.regions) ? (body2.regions as unknown[]) : [];\n const buildTags: Record<string, string> = {};\n for (const r of regionsArr) {\n if (r && typeof r === \"object\") {\n const row = r as { region?: unknown; build_tag?: unknown };\n if (typeof row.region === \"string\" && typeof row.build_tag === \"string\") {\n buildTags[row.region] = row.build_tag;\n }\n }\n }\n\n if (\n typeof body2.token !== \"string\" ||\n typeof body2.expires_at !== \"number\" ||\n typeof body2.kid !== \"string\" ||\n typeof body2.offline_until !== \"number\" ||\n typeof body2.grace_period_days !== \"number\"\n ) {\n throw new OfflineError(\n \"unexpected_response\",\n \"mint-offline-token returned malformed body\",\n res.status,\n );\n }\n\n return {\n token: body2.token,\n expiresAt: body2.expires_at,\n kid: body2.kid,\n offlineUntil: body2.offline_until,\n buildTags,\n gracePeriodDays: body2.grace_period_days,\n };\n }\n}\n","/**\n * Pure helper: take an online MapLibre style and rewrite the named region's\n * vector source to point at a local MBTiles file. Layers, paint, layout,\n * glyphs, and sprite are untouched.\n *\n * This is the JS counterpart of the offline-worker's server-side rewriter\n * (see `cloudflare/offline-worker/src/common.ts:rewriteStyleSources`).\n * Customers can either:\n *\n * 1. Fetch a pre-baked offline style from the worker via\n * `chrt.offline.fetchStyle(region, opts)` — recommended for native\n * MapLibre clients (iOS/Android/desktop) that don't have the JS atlas\n * available.\n *\n * 2. Generate the online style themselves (e.g. via the React app's\n * `src/lib/atlas/style-generator.ts`) and call `buildOfflineStyle()`\n * locally — recommended for JS/web SDK consumers who already use the\n * atlas at runtime.\n *\n * Both paths produce equivalent output.\n */\n\n/**\n * MapLibre style specification (subset). Matches the JSON shape MapLibre GL\n * JS, MapLibre Native iOS/Android, and the MapLibre style spec all consume.\n * Customers who want full TypeScript style typing should reference\n * `@maplibre/maplibre-gl-style-spec.StyleSpecification` directly.\n */\nexport interface MapLibreStyle {\n version: number;\n name?: string;\n metadata?: Record<string, unknown>;\n sources: Record<string, MapLibreSource | unknown>;\n sprite?: string;\n glyphs?: string;\n layers: unknown[];\n}\n\ninterface MapLibreSource {\n type: string;\n tiles?: string[];\n url?: string;\n minzoom?: number;\n maxzoom?: number;\n [key: string]: unknown;\n}\n\n/** Target platform — drives the URL scheme used in the rewritten source. */\nexport type OfflineStylePlatform = \"ios\" | \"android\" | \"desktop\";\n\nexport interface BuildOfflineStyleOptions {\n /**\n * Target platform. iOS + Android use the `mbtiles://` scheme MapLibre Native\n * understands; desktop uses `file://`. Default: `\"ios\"`.\n */\n platform?: OfflineStylePlatform;\n /**\n * Name of the source to rewrite. If omitted, defaults to the only vector\n * source in the input style. Throws `OfflineStyleError` if there are zero\n * or more than one vector sources and `sourceName` isn't provided.\n */\n sourceName?: string;\n}\n\n/**\n * Thrown when `buildOfflineStyle` can't determine which source to swap or\n * the named source isn't present in the input style.\n */\nexport class OfflineStyleError extends Error {\n readonly code: string;\n constructor(message: string, code: string) {\n super(message);\n this.name = \"OfflineStyleError\";\n this.code = code;\n }\n}\n\n/**\n * Returns a deep-copy of `onlineStyle` with the named (or auto-detected)\n * vector source rewritten to point at `mbtilesPath`. Other sources, layers,\n * paint, layout, glyphs, and sprite pass through unmodified.\n *\n * URL scheme:\n *\n * platform=\"ios\" → `mbtiles://<mbtilesPath>` MLN Native iOS\n * platform=\"android\" → `mbtiles://<mbtilesPath>` MLN Native Android\n * platform=\"desktop\" → `file://<mbtilesPath>` MLN GL native (Win/Mac/Linux)\n *\n * The `mbtilesPath` is intentionally treated as opaque text. Most native MLN\n * bindings accept the bare scheme + filename and resolve against an\n * app-defined root (typically the app's Documents directory). Pass an\n * absolute path on desktop, or a relative filename on iOS/Android.\n *\n * @param onlineStyle The base MapLibre style. Not mutated.\n * @param mbtilesPath Local-file path component (e.g. `\"NOAA_ENC.mbtiles\"`).\n * @param opts Platform + optional explicit `sourceName`.\n *\n * @example\n * import { buildOfflineStyle } from \"@chrtco/sdk\";\n *\n * // Online style obtained however you like — generated client-side or\n * // fetched from a server.\n * const onlineStyle = generateStyle(\"DAY\", { region: \"NOAA_ENC\" });\n *\n * const offlineStyle = buildOfflineStyle(\n * onlineStyle,\n * \"NOAA_ENC.mbtiles\",\n * { platform: \"ios\" },\n * );\n * // → hand `offlineStyle` to MapLibre.\n */\nexport function buildOfflineStyle(\n onlineStyle: MapLibreStyle,\n mbtilesPath: string,\n opts: BuildOfflineStyleOptions = {},\n): MapLibreStyle {\n if (!onlineStyle || typeof onlineStyle !== \"object\") {\n throw new OfflineStyleError(\"onlineStyle is required\", \"invalid_style\");\n }\n if (!onlineStyle.sources || typeof onlineStyle.sources !== \"object\") {\n throw new OfflineStyleError(\"style has no sources\", \"no_sources\");\n }\n if (!mbtilesPath || typeof mbtilesPath !== \"string\") {\n throw new OfflineStyleError(\"mbtilesPath is required\", \"invalid_path\");\n }\n\n const platform = opts.platform ?? \"ios\";\n const scheme = platform === \"desktop\" ? \"file\" : \"mbtiles\";\n const url = `${scheme}://${mbtilesPath}`;\n\n let sourceName: string;\n if (opts.sourceName) {\n if (!(opts.sourceName in onlineStyle.sources)) {\n throw new OfflineStyleError(\n `source \"${opts.sourceName}\" not found in style`,\n \"source_not_found\",\n );\n }\n sourceName = opts.sourceName;\n } else {\n const vectorSources = Object.entries(onlineStyle.sources).filter(\n ([, src]) =>\n src &&\n typeof src === \"object\" &&\n (src as MapLibreSource).type === \"vector\",\n );\n if (vectorSources.length === 0) {\n throw new OfflineStyleError(\n \"no vector sources in style — pass `opts.sourceName` to override\",\n \"no_vector_source\",\n );\n }\n if (vectorSources.length > 1) {\n throw new OfflineStyleError(\n `${vectorSources.length} vector sources in style — pass \\`opts.sourceName\\``,\n \"ambiguous_source\",\n );\n }\n sourceName = vectorSources[0][0];\n }\n\n // Deep-clone via JSON round-trip — style is plain JSON-shaped, no cycles.\n const cloned = JSON.parse(JSON.stringify(onlineStyle)) as MapLibreStyle;\n const src = cloned.sources[sourceName] as MapLibreSource;\n src.tiles = [url];\n // Collapse legacy `mapbox://...` shape if present so MLN doesn't see both.\n delete src.url;\n return cloned;\n}\n","import type { FileSystemAdapter } from \"../fs-adapter.js\";\nimport { OfflineError } from \"./offline-errors.js\";\n\n/**\n * On-disk shape. Bump `version` if we ever change it; old readers refuse.\n */\nexport interface OfflineManifest {\n version: 1;\n budget_bytes: number | null;\n regions: Record<string, ManifestRegionEntry>;\n}\n\nexport interface ManifestRegionEntry {\n path: string;\n bytes: number;\n sha256: string;\n build_id: string;\n build_tag: string;\n downloaded_at: number;\n last_accessed_at: number;\n}\n\nconst CURRENT_VERSION = 1;\n\nfunction emptyManifest(): OfflineManifest {\n return { version: CURRENT_VERSION, budget_bytes: null, regions: {} };\n}\n\nexport async function readManifest(\n manifestPath: string | undefined,\n fs: FileSystemAdapter,\n): Promise<OfflineManifest> {\n if (!manifestPath) return emptyManifest();\n if (!(await fs.exists(manifestPath))) return emptyManifest();\n\n const raw = await fs.readFile(manifestPath);\n const text = new TextDecoder().decode(raw);\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n throw new OfflineError(\n \"unexpected_response\",\n `offline manifest at ${manifestPath} is not valid JSON`,\n );\n }\n\n if (!parsed || typeof parsed !== \"object\") {\n throw new OfflineError(\"unexpected_response\", `offline manifest shape invalid`);\n }\n const m = parsed as Partial<OfflineManifest>;\n if (m.version !== CURRENT_VERSION) {\n throw new OfflineError(\n \"unexpected_response\",\n `offline manifest version mismatch: got ${String(m.version)}, expected ${CURRENT_VERSION}`,\n );\n }\n return {\n version: CURRENT_VERSION,\n budget_bytes: typeof m.budget_bytes === \"number\" ? m.budget_bytes : null,\n regions: m.regions && typeof m.regions === \"object\" ? m.regions : {},\n };\n}\n\nexport async function writeManifest(\n manifestPath: string,\n fs: FileSystemAdapter,\n manifest: OfflineManifest,\n): Promise<void> {\n const text = JSON.stringify(manifest, null, 2);\n const bytes = new TextEncoder().encode(text);\n await fs.writeFile(manifestPath, bytes);\n}\n\nexport function usedBytes(manifest: OfflineManifest, excludeRegion?: string): number {\n let total = 0;\n for (const [region, entry] of Object.entries(manifest.regions)) {\n if (region === excludeRegion) continue;\n total += entry.bytes;\n }\n return total;\n}\n\nexport function requireManifestPath(manifestPath: string | undefined): string {\n if (!manifestPath) {\n throw new OfflineError(\n \"missing_manifest_path\",\n \"ChrtConfig.manifestPath is required for this operation\",\n );\n }\n return manifestPath;\n}\n","import type { HttpClient } from \"../client.js\";\nimport type {\n OfflineBundleResponse,\n OfflineDownloadOptions,\n OfflineDownloadResult,\n OfflineDownloadProgress,\n OfflineFetchStyleOptions,\n OfflineHeartbeatOptions,\n OfflineRegionSummary,\n OfflineRemoveOptions,\n OfflineStyleResponse,\n} from \"../types.js\";\nimport { OfflineError, mapServerError } from \"./offline-errors.js\";\nimport { OfflineTokenManager } from \"./offline-token-manager.js\";\nimport {\n buildOfflineStyle,\n type BuildOfflineStyleOptions,\n type MapLibreStyle,\n} from \"./offline-style.js\";\nimport {\n readManifest,\n requireManifestPath,\n usedBytes,\n writeManifest,\n type OfflineManifest,\n} from \"./offline-manifest.js\";\n\n/** Progress is throttled to whichever of these two thresholds is larger. */\nconst PROGRESS_MIN_BYTES = 1024 * 1024; // 1 MB\nconst PROGRESS_MIN_FRACTION = 0.01; // 1%\n\ninterface RegionsListResponse {\n regions?: unknown;\n unavailable?: unknown;\n}\n\nexport class OfflineEndpoint {\n readonly tokenManager: OfflineTokenManager;\n\n constructor(\n private readonly http: HttpClient,\n private readonly deviceId: string | undefined,\n private readonly manifestPath: string | undefined,\n ) {\n this.tokenManager = new OfflineTokenManager(http);\n }\n\n /** List regions downloadable under the caller's API key. */\n async list(): Promise<OfflineRegionSummary[]> {\n const token = await this.requireToken();\n const res = await this.http.getJsonWithBearer<RegionsListResponse>(\n \"/offline/regions\",\n token.token,\n );\n if (!res.ok) {\n const mapped = mapServerError(res.body, res.status);\n throw new OfflineError(\n mapped.code,\n `offline.list failed: HTTP ${res.status}`,\n res.status,\n mapped.detail,\n );\n }\n const arr = Array.isArray(res.body?.regions) ? (res.body.regions as unknown[]) : [];\n const out: OfflineRegionSummary[] = [];\n for (const r of arr) {\n if (!r || typeof r !== \"object\") continue;\n const row = r as {\n region?: unknown;\n build_id?: unknown;\n build_tag?: unknown;\n total_bytes?: unknown;\n issued_at?: unknown;\n };\n if (\n typeof row.region === \"string\" &&\n typeof row.build_id === \"string\" &&\n typeof row.build_tag === \"string\" &&\n typeof row.total_bytes === \"number\"\n ) {\n out.push({\n region: row.region,\n build_id: row.build_id,\n build_tag: row.build_tag,\n total_bytes: row.total_bytes,\n issued_at: typeof row.issued_at === \"number\" ? row.issued_at : null,\n });\n }\n }\n return out;\n }\n\n /**\n * Download an MBTiles bundle for `region` to `opts.path`. Resumable via a\n * `<path>.partial` sidecar on interrupt. SHA-256 verified before rename.\n */\n async download(region: string, opts: OfflineDownloadOptions): Promise<OfflineDownloadResult> {\n return this.downloadInternal(region, opts, 0);\n }\n\n /** Delete local file and, if manifest is configured, drop its row + heartbeat. */\n async remove(region: string, opts: OfflineRemoveOptions): Promise<void> {\n if (await opts.fs.exists(opts.path)) {\n await opts.fs.unlink(opts.path);\n }\n const partial = `${opts.path}.partial`;\n if (await opts.fs.exists(partial)) {\n await opts.fs.unlink(partial);\n }\n\n if (this.manifestPath) {\n const manifest = await readManifest(this.manifestPath, opts.fs);\n if (manifest.regions[region]) {\n delete manifest.regions[region];\n await writeManifest(this.manifestPath, opts.fs, manifest);\n }\n // Best-effort heartbeat with the new totals; failure doesn't block removal.\n const regions = Object.keys(manifest.regions);\n const total = usedBytes(manifest);\n try {\n await this.heartbeat({ regions, total_bytes: total, fs: opts.fs });\n } catch {\n // swallow — the file is already gone locally.\n }\n }\n }\n\n /**\n * Pure helper — rewrites the named (or auto-detected) vector source in\n * `onlineStyle` to point at a local MBTiles file. Layers/paint/glyphs\n * untouched. Use when you already have an online style (e.g. generated\n * client-side via the React app's atlas) and want the offline variant.\n *\n * Equivalent to importing `buildOfflineStyle` directly — exposed on the\n * endpoint for discoverability.\n */\n style(\n onlineStyle: MapLibreStyle,\n mbtilesPath: string,\n opts?: BuildOfflineStyleOptions,\n ): MapLibreStyle {\n return buildOfflineStyle(onlineStyle, mbtilesPath, opts);\n }\n\n /**\n * Fetch a pre-baked offline style for `region` from\n * `GET /v1/offline/styles/{region}`. The worker's response already has the\n * source rewritten to `mbtiles://` (default) or `file://`, so the returned\n * `style` is ready to hand directly to MapLibre.\n *\n * Recommended for native MLN clients (iOS/Android/desktop) that don't have\n * the JS atlas available. JS/web SDK consumers can equivalently generate\n * the online style themselves and call `chrt.offline.style(...)`.\n */\n async fetchStyle(\n region: string,\n opts: OfflineFetchStyleOptions = {},\n ): Promise<OfflineStyleResponse> {\n const token = await this.requireToken([region]);\n const palette = opts.palette ?? \"DAY\";\n const protocol = opts.protocol ?? \"mbtiles\";\n const path = `/offline/styles/${encodeURIComponent(region)}?palette=${palette}&protocol=${protocol}`;\n const res = await this.http.getJsonWithBearer<OfflineStyleResponse>(\n path,\n token.token,\n );\n if (!res.ok) {\n const mapped = mapServerError(res.body, res.status);\n throw new OfflineError(\n mapped.code,\n `offline.fetchStyle failed: HTTP ${res.status}`,\n res.status,\n mapped.detail,\n );\n }\n if (!res.body || typeof res.body !== \"object\" || !res.body.style) {\n throw new OfflineError(\n \"unexpected_response\",\n \"offline.fetchStyle: malformed response (missing `style`)\",\n res.status,\n );\n }\n return res.body;\n }\n\n /**\n * Set the local storage budget in bytes. Requires `manifestPath`. Enforced\n * at the start of each `download()`. A budget smaller than current usage\n * does not auto-prune; it only refuses new downloads until the customer\n * calls `remove()`.\n */\n async setStorageBudget(bytes: number, fs: import(\"../fs-adapter.js\").FileSystemAdapter): Promise<void> {\n if (!Number.isFinite(bytes) || bytes < 0) {\n throw new OfflineError(\"unexpected_response\", `invalid budget: ${bytes}`);\n }\n const path = requireManifestPath(this.manifestPath);\n const manifest = await readManifest(path, fs);\n manifest.budget_bytes = bytes;\n await writeManifest(path, fs, manifest);\n }\n\n /**\n * Send a heartbeat. If `opts.regions` / `opts.total_bytes` are omitted and\n * a manifest is configured, values are derived from it. v1 is manual-call\n * only; auto-scheduling is a follow-up phase.\n */\n async heartbeat(opts?: OfflineHeartbeatOptions): Promise<void> {\n const deviceId = this.requireDeviceId();\n\n let regions = opts?.regions;\n let totalBytes = opts?.total_bytes;\n\n // Auto-derive from manifest when caller omitted values AND gave us an fs.\n if ((regions === undefined || totalBytes === undefined) && this.manifestPath && opts?.fs) {\n const manifest = await readManifest(this.manifestPath, opts.fs);\n if (regions === undefined) regions = Object.keys(manifest.regions);\n if (totalBytes === undefined) totalBytes = usedBytes(manifest);\n }\n if (regions === undefined) regions = [];\n if (totalBytes === undefined) totalBytes = 0;\n\n const token = await this.tokenManager.getToken(deviceId);\n const body = {\n device_id: deviceId,\n regions,\n total_bytes: totalBytes,\n ...(opts?.sdk_version ? { sdk_version: opts.sdk_version } : {}),\n ...(opts?.platform ? { platform: opts.platform } : {}),\n };\n const res = await this.http.postJson<unknown>(\"/offline/heartbeat\", body, {\n bearerToken: token.token,\n });\n if (!res.ok) {\n const mapped = mapServerError(res.body, res.status);\n throw new OfflineError(\n mapped.code,\n `offline.heartbeat failed: HTTP ${res.status}`,\n res.status,\n mapped.detail,\n );\n }\n }\n\n // ── Internals ────────────────────────────────────────────────────────────\n\n private requireDeviceId(): string {\n if (!this.deviceId) {\n throw new OfflineError(\n \"missing_device_id\",\n \"ChrtConfig.deviceId is required for offline operations\",\n );\n }\n return this.deviceId;\n }\n\n private async requireToken(regions?: string[]) {\n const deviceId = this.requireDeviceId();\n return this.tokenManager.getToken(deviceId, regions);\n }\n\n private async fetchBundle(region: string, bearerToken: string): Promise<OfflineBundleResponse> {\n const res = await this.http.getJsonWithBearer<Record<string, unknown>>(\n `/offline/bundles/${encodeURIComponent(region)}`,\n bearerToken,\n );\n if (!res.ok) {\n const mapped = mapServerError(res.body, res.status);\n throw new OfflineError(\n mapped.code,\n `offline.download bundle fetch failed: HTTP ${res.status}`,\n res.status,\n mapped.detail,\n );\n }\n const b = res.body ?? {};\n const missingFields: string[] = [];\n const field = <K extends string>(k: K): unknown => (b as Record<string, unknown>)[k];\n\n for (const k of [\"signed_url\", \"bytes\", \"build_id\", \"build_tag\", \"expires_at\"] as const) {\n if (field(k) === undefined) missingFields.push(k);\n }\n if (missingFields.length > 0) {\n throw new OfflineError(\n \"unexpected_response\",\n `bundle response missing fields: ${missingFields.join(\",\")}`,\n res.status,\n );\n }\n if (typeof field(\"sha256\") !== \"string\" || (field(\"sha256\") as string).length === 0) {\n throw new OfflineError(\n \"sha_missing\",\n \"bundle response did not include sha256; cannot verify integrity\",\n res.status,\n );\n }\n return {\n region: typeof field(\"region\") === \"string\" ? (field(\"region\") as string) : region,\n build_id: field(\"build_id\") as string,\n build_tag: field(\"build_tag\") as string,\n signed_url: field(\"signed_url\") as string,\n expires_at: field(\"expires_at\") as number,\n bytes: field(\"bytes\") as number,\n sha256: (field(\"sha256\") as string).toLowerCase(),\n offline_until: typeof field(\"offline_until\") === \"number\" ? (field(\"offline_until\") as number) : 0,\n heartbeat_after:\n typeof field(\"heartbeat_after\") === \"number\" ? (field(\"heartbeat_after\") as number) : 0,\n server_time: typeof field(\"server_time\") === \"number\" ? (field(\"server_time\") as number) : 0,\n };\n }\n\n private async downloadInternal(\n region: string,\n opts: OfflineDownloadOptions,\n retryDepth: number,\n ): Promise<OfflineDownloadResult> {\n const { path, fs, onProgress, signal } = opts;\n const partialPath = `${path}.partial`;\n\n const token = await this.requireToken([region]);\n const bundle = await this.fetchBundle(region, token.token);\n\n // Budget check against manifest (if present).\n if (this.manifestPath) {\n const manifest = await readManifest(this.manifestPath, fs);\n if (manifest.budget_bytes !== null) {\n const currentUsed = usedBytes(manifest, region);\n const projected = currentUsed + bundle.bytes;\n if (projected > manifest.budget_bytes) {\n throw new OfflineError(\n \"budget_exceeded\",\n `offline storage budget would be exceeded`,\n undefined,\n {\n budget_bytes: manifest.budget_bytes,\n used_bytes: currentUsed,\n required_bytes: bundle.bytes,\n over_by_bytes: projected - manifest.budget_bytes,\n },\n );\n }\n }\n }\n\n // Examine existing partial.\n let startByte = 0;\n let resumed = false;\n if (await fs.exists(partialPath)) {\n const partialStat = await fs.stat(partialPath);\n if (partialStat.size > bundle.bytes) {\n await fs.unlink(partialPath);\n } else if (partialStat.size === bundle.bytes) {\n const computed = await fs.sha256(partialPath);\n if (computed.toLowerCase() === bundle.sha256) {\n await fs.rename(partialPath, path);\n await this.persistManifestEntry(region, bundle, path, fs);\n return {\n path,\n bytes: bundle.bytes,\n sha256: bundle.sha256,\n build_id: bundle.build_id,\n build_tag: bundle.build_tag,\n resumed: true,\n };\n }\n // Complete but corrupt — drop and restart.\n await fs.unlink(partialPath);\n } else {\n startByte = partialStat.size;\n resumed = true;\n }\n }\n\n // Fetch (with Range if resuming).\n const fetchInit: RequestInit = { method: \"GET\", signal };\n if (startByte > 0) {\n fetchInit.headers = { Range: `bytes=${startByte}-` };\n }\n\n let response: Response;\n try {\n response = await fetch(bundle.signed_url, fetchInit);\n } catch (err) {\n if (signal?.aborted) {\n throw new OfflineError(\n \"network_interrupted\",\n \"download aborted before response\",\n undefined,\n { resumable: startByte > 0, bytes_written: startByte },\n );\n }\n throw new OfflineError(\n \"network_interrupted\",\n err instanceof Error ? err.message : \"fetch failed\",\n undefined,\n { resumable: startByte > 0, bytes_written: startByte },\n );\n }\n\n // Expired signed URL or build flipped mid-resume → re-mint once.\n if (startByte > 0 && (response.status === 403 || response.status === 404)) {\n await fs.unlink(partialPath);\n if (retryDepth > 0) {\n throw new OfflineError(\n \"unexpected_response\",\n `signed URL still rejected after re-mint (HTTP ${response.status})`,\n response.status,\n );\n }\n this.tokenManager.invalidate(this.requireDeviceId(), [region]);\n return this.downloadInternal(region, opts, retryDepth + 1);\n }\n\n if (startByte > 0 && response.status !== 206) {\n throw new OfflineError(\n \"unexpected_response\",\n `expected 206 Partial Content on Range request, got ${response.status}`,\n response.status,\n );\n }\n if (startByte === 0 && response.status !== 200) {\n throw new OfflineError(\n \"unexpected_response\",\n `expected 200 on initial GET, got ${response.status}`,\n response.status,\n );\n }\n if (!response.body) {\n throw new OfflineError(\n \"unexpected_response\",\n \"response had no body\",\n response.status,\n );\n }\n\n // Stream with progress + abort + persist-on-interrupt.\n await fs.mkdir(dirname(path), { recursive: true });\n const writer = (await fs.writeStream(partialPath, { append: startByte > 0 })).getWriter();\n let bytesDownloaded = startByte;\n let lastProgressBytes = startByte;\n const progressThreshold = Math.max(\n PROGRESS_MIN_BYTES,\n Math.floor(bundle.bytes * PROGRESS_MIN_FRACTION),\n );\n\n const emit = (final: boolean): void => {\n if (!onProgress) return;\n if (!final && bytesDownloaded - lastProgressBytes < progressThreshold) return;\n const progress: OfflineDownloadProgress = {\n bytesDownloaded,\n bytesTotal: bundle.bytes,\n fraction: bundle.bytes === 0 ? 1 : bytesDownloaded / bundle.bytes,\n };\n try {\n onProgress(progress);\n } catch {\n // customer callback failures must not break download\n }\n lastProgressBytes = bytesDownloaded;\n };\n\n emit(true); // always fire at start\n\n try {\n const reader = response.body.getReader();\n while (true) {\n if (signal?.aborted) {\n throw new OfflineError(\n \"network_interrupted\",\n \"download aborted by caller\",\n undefined,\n { resumable: true, bytes_written: bytesDownloaded },\n );\n }\n const { done, value } = await reader.read();\n if (done) break;\n if (value) {\n await writer.write(value);\n bytesDownloaded += value.byteLength;\n emit(false);\n }\n }\n await writer.close();\n } catch (err) {\n try {\n await writer.abort();\n } catch {\n // best-effort\n }\n if (err instanceof OfflineError) throw err;\n throw new OfflineError(\n \"network_interrupted\",\n err instanceof Error ? err.message : \"stream error\",\n undefined,\n { resumable: true, bytes_written: bytesDownloaded },\n );\n }\n\n emit(true); // always fire at completion\n\n // Verify SHA.\n const computedSha = await fs.sha256(partialPath);\n if (computedSha.toLowerCase() !== bundle.sha256) {\n await fs.unlink(partialPath);\n throw new OfflineError(\n \"download_corrupt\",\n `SHA-256 mismatch for ${region}: expected ${bundle.sha256}, got ${computedSha}`,\n undefined,\n { expected: bundle.sha256, actual: computedSha },\n );\n }\n\n await fs.rename(partialPath, path);\n await this.persistManifestEntry(region, bundle, path, fs);\n\n return {\n path,\n bytes: bundle.bytes,\n sha256: bundle.sha256,\n build_id: bundle.build_id,\n build_tag: bundle.build_tag,\n resumed,\n };\n }\n\n private async persistManifestEntry(\n region: string,\n bundle: OfflineBundleResponse,\n path: string,\n fs: import(\"../fs-adapter.js\").FileSystemAdapter,\n ): Promise<void> {\n if (!this.manifestPath) return;\n const manifest: OfflineManifest = await readManifest(this.manifestPath, fs);\n const nowSec = Math.floor(Date.now() / 1000);\n manifest.regions[region] = {\n path,\n bytes: bundle.bytes,\n sha256: bundle.sha256,\n build_id: bundle.build_id,\n build_tag: bundle.build_tag,\n downloaded_at: nowSec,\n last_accessed_at: nowSec,\n };\n await writeManifest(this.manifestPath, fs, manifest);\n }\n}\n\n/** Tiny helper so we don't import `node:path`. */\nfunction dirname(p: string): string {\n const i = p.lastIndexOf(\"/\");\n const j = p.lastIndexOf(\"\\\\\");\n const k = Math.max(i, j);\n if (k <= 0) return \".\";\n return p.slice(0, k);\n}\n","/**\n * Generic async auto-pagination generator.\n *\n * Fetches pages from a callback that returns `{ items, total_count }` and\n * yields individual items until all pages are consumed or the signal is aborted.\n *\n * @example\n * ```ts\n * for await (const feature of paginate(\n * (offset, signal) => chrt.features({ bbox, limit: 100, offset, signal }),\n * f => f.features,\n * f => f.total_count ?? 0,\n * )) {\n * console.log(feature);\n * }\n * ```\n */\nexport async function* paginate<TResponse, TItem>(\n fetchPage: (offset: number, signal?: AbortSignal) => Promise<TResponse>,\n getItems: (response: TResponse) => TItem[],\n getTotalCount: (response: TResponse) => number,\n options?: { pageSize?: number; signal?: AbortSignal },\n): AsyncGenerator<TItem, void, undefined> {\n const pageSize = options?.pageSize ?? 100;\n const signal = options?.signal;\n let offset = 0;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n if (signal?.aborted) return;\n\n const response = await fetchPage(offset, signal);\n const items = getItems(response);\n\n for (const item of items) {\n yield item;\n }\n\n if (items.length === 0) return;\n\n offset += items.length;\n const total = getTotalCount(response);\n if (total > 0 && offset >= total) return;\n }\n}\n","/* ── Webhook event types ───────────────────────────── */\n\n/** Base envelope for all webhook payloads */\nexport interface WebhookPayload<T extends string, D> {\n /** Unique event ID */\n id: string;\n /** ISO 8601 timestamp */\n timestamp: string;\n /** Event type discriminator */\n type: T;\n /** Event-specific data */\n data: D;\n}\n\n/* ── Event data shapes ─────────────────────────────── */\n\nexport interface CellEventData {\n cell_id: string;\n chart_source: string;\n title: string | null;\n edition: number | null;\n update_number: number | null;\n scale_band: string | null;\n}\n\nexport interface CellUpdatedData extends CellEventData {\n previous_edition: number | null;\n previous_update_number: number | null;\n}\n\n/* ── Concrete event types ──────────────────────────── */\n\nexport type CellUpdatedEvent = WebhookPayload<\"cell.updated\", CellUpdatedData>;\nexport type CellNewEvent = WebhookPayload<\"cell.new\", CellEventData>;\nexport type CellDeletedEvent = WebhookPayload<\"cell.deleted\", CellEventData>;\n\n/** Discriminated union of all webhook events */\nexport type WebhookEvent = CellUpdatedEvent | CellNewEvent | CellDeletedEvent;\n\n/** All recognised webhook event type strings */\nexport type WebhookEventType = WebhookEvent[\"type\"];\n\n/* ── Runtime parser ────────────────────────────────── */\n\nconst VALID_TYPES = new Set<string>([\"cell.updated\", \"cell.new\", \"cell.deleted\"]);\n\n/**\n * Parse and validate a raw webhook payload.\n *\n * @param body - The raw request body (parsed JSON object)\n * @returns A typed `WebhookEvent`\n * @throws Error if the payload is malformed or has an unknown event type\n *\n * @example\n * ```ts\n * import { parseWebhook } from \"@chrtco/sdk\";\n *\n * app.post(\"/webhooks/chrt\", (req, res) => {\n * const event = parseWebhook(req.body);\n * switch (event.type) {\n * case \"cell.updated\":\n * console.log(\"Cell updated:\", event.data.cell_id);\n * break;\n * case \"cell.new\":\n * console.log(\"New cell:\", event.data.cell_id);\n * break;\n * }\n * res.sendStatus(200);\n * });\n * ```\n */\nexport function parseWebhook(body: unknown): WebhookEvent {\n if (typeof body !== \"object\" || body === null) {\n throw new Error(\"Invalid webhook payload: expected an object\");\n }\n\n const obj = body as Record<string, unknown>;\n\n if (typeof obj.id !== \"string\") {\n throw new Error(\"Invalid webhook payload: missing 'id'\");\n }\n if (typeof obj.timestamp !== \"string\") {\n throw new Error(\"Invalid webhook payload: missing 'timestamp'\");\n }\n if (typeof obj.type !== \"string\" || !VALID_TYPES.has(obj.type)) {\n throw new Error(`Invalid webhook payload: unknown type '${String(obj.type)}'`);\n }\n if (typeof obj.data !== \"object\" || obj.data === null) {\n throw new Error(\"Invalid webhook payload: missing 'data'\");\n }\n\n return obj as unknown as WebhookEvent;\n}\n"],"mappings":"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","names":["src"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/client.ts","../src/endpoints/tiles.ts","../src/endpoints/cells.ts","../src/endpoints/coverage.ts","../src/endpoints/features.ts","../src/endpoints/query.ts","../src/endpoints/offline-errors.ts","../src/endpoints/offline-token-manager.ts","../src/endpoints/offline-style.ts","../src/endpoints/offline-manifest.ts","../src/endpoints/offline.ts","../src/pagination.ts","../src/webhooks.ts","../src/atlas/s52-colors.ts","../src/atlas/s52-lookup.ts","../src/atlas/draw-order.ts","../src/atlas/s52-conditional.ts","../src/atlas/symbols.ts","../src/atlas/style-resolver.ts","../src/atlas/labels.ts","../src/atlas/feature-decimation.ts","../src/atlas/s101-catalogue.ts","../src/atlas/s101-symbols.ts","../src/atlas/s52-svgs-generated.ts","../src/atlas/s52-svg-loader.ts","../src/atlas/tile-zoom.ts","../src/atlas/source-registry.ts","../src/atlas/layer-builder.ts","../src/atlas/band-priority.ts","../src/atlas/style-generator.ts"],"sourcesContent":["import { HttpClient, ChrtError } from \"./client.js\";\nimport { TilesEndpoint } from \"./endpoints/tiles.js\";\nimport { CellsEndpoint } from \"./endpoints/cells.js\";\nimport { CoverageEndpoint } from \"./endpoints/coverage.js\";\nimport { FeaturesEndpoint } from \"./endpoints/features.js\";\nimport { QueryEndpoint } from \"./endpoints/query.js\";\nimport { OfflineEndpoint } from \"./endpoints/offline.js\";\nimport { paginate } from \"./pagination.js\";\nimport type {\n ChrtConfig,\n FeaturesOptions,\n QueryOptions,\n CellsOptions,\n CoverageOptions,\n FeatureCollection,\n GeoJsonFeature,\n CellsResponse,\n CellDetail,\n CoverageResponse,\n TransformRequest,\n} from \"./types.js\";\n\nexport class Chrt {\n /** Tile endpoints — styleUrl, tileUrl, groups */\n readonly tiles: TilesEndpoint;\n /** Cell catalogue endpoints — list, get */\n readonly cells: CellsEndpoint;\n /** Coverage data — list available chart sources */\n readonly coverage: CoverageEndpoint;\n /**\n * CHRToffline — download MBTiles bundles for offline use.\n * Requires `deviceId` in config. Manifest-based budget enforcement\n * requires `manifestPath`.\n */\n readonly offline: OfflineEndpoint;\n\n private featuresEp: FeaturesEndpoint;\n private queryEp: QueryEndpoint;\n private http: HttpClient;\n\n constructor(apiKeyOrConfig: string | ChrtConfig) {\n const config =\n typeof apiKeyOrConfig === \"string\"\n ? { apiKey: apiKeyOrConfig }\n : apiKeyOrConfig;\n\n this.http = new HttpClient(config.apiKey, config.baseUrl, config.retries);\n this.tiles = new TilesEndpoint(this.http);\n this.cells = new CellsEndpoint(this.http);\n this.coverage = new CoverageEndpoint(this.http);\n this.featuresEp = new FeaturesEndpoint(this.http);\n this.queryEp = new QueryEndpoint(this.http);\n this.offline = new OfflineEndpoint(this.http, config.deviceId, config.manifestPath);\n }\n\n /* ── Convenience shortcuts ───────────────────────── */\n\n /** Query GeoJSON features by bounding box */\n async features(options: FeaturesOptions): Promise<FeatureCollection> {\n return this.featuresEp.list(options);\n }\n\n /** Spatial proximity query around a point */\n async query(options: QueryOptions): Promise<FeatureCollection> {\n return this.queryEp.nearby(options);\n }\n\n // ── [CHRTquery] Staged — uncomment when serve-query/route is live ──\n //\n // /** Discover ENC cells along a route */\n // async routeQuery(options: RouteQueryOptions): Promise<RouteQueryResponse> {\n // return this.queryEp.alongRoute(options);\n // }\n\n // ── [CHRTquery] Staged — uncomment when serve-query/route/features is live ──\n //\n // /** Find individual features along a route */\n // async routeFeatures(options: RouteFeatureQueryOptions): Promise<RouteFeatureQueryResponse> {\n // return this.queryEp.featuresAlongRoute(options);\n // }\n //\n // /** Iterate all features along a route, auto-paginating */\n // routeFeaturesIter(\n // options: Omit<RouteFeatureQueryOptions, \"offset\">,\n // ): AsyncIterable<GeoJsonFeature> {\n // const pageSize = options.limit ?? 100;\n // return paginate<RouteFeatureQueryResponse, GeoJsonFeature>(\n // (offset, signal) =>\n // this.routeFeatures({ ...options, limit: pageSize, offset, signal }),\n // (r) => r.features,\n // (r) => r.total_count ?? 0,\n // { pageSize, signal: options.signal },\n // );\n // }\n\n /* ── Auto-pagination iterators ───────────────────── */\n\n /**\n * Iterate all features matching a bounding-box query, auto-paginating.\n *\n * @example\n * ```ts\n * for await (const feature of chrt.featuresIter({ bbox: [-74, 40, -73, 41] })) {\n * console.log(feature.properties);\n * }\n * ```\n */\n featuresIter(\n options: Omit<FeaturesOptions, \"offset\">,\n ): AsyncIterable<GeoJsonFeature> {\n const pageSize = options.limit ?? 100;\n return paginate<FeatureCollection, GeoJsonFeature>(\n (offset, signal) =>\n this.features({ ...options, limit: pageSize, offset, signal }),\n (r) => r.features,\n (r) => r.total_count ?? 0,\n { pageSize, signal: options.signal },\n );\n }\n\n /**\n * Iterate all cells matching a query, auto-paginating.\n *\n * @example\n * ```ts\n * for await (const cell of chrt.cellsIter({ source: \"NOAA\" })) {\n * console.log(cell.cell_id, cell.title);\n * }\n * ```\n */\n cellsIter(\n options?: Omit<CellsOptions, \"offset\">,\n ): AsyncIterable<CellDetail> {\n const pageSize = options?.limit ?? 100;\n return paginate<CellsResponse, CellDetail>(\n (offset, signal) =>\n this.cells.list({ ...options, limit: pageSize, offset, signal }),\n (r) => r.cells,\n (r) => r.total_count,\n { pageSize, signal: options?.signal },\n );\n }\n\n /* ── Map integration helpers ─────────────────────── */\n\n /** Returns a style.json URL ready for Mapbox GL / MapLibre */\n styleUrl(): string {\n return this.tiles.styleUrl();\n }\n\n /**\n * Returns a `transformRequest` function for Mapbox GL JS / MapLibre GL JS.\n * Injects the API key header for requests to api.chrt.co.\n *\n * @example\n * const map = new mapboxgl.Map({\n * style: chrt.styleUrl(),\n * transformRequest: chrt.transformRequest(),\n * });\n */\n transformRequest(): (url: string) => TransformRequest | undefined {\n const apiKey = this.http.getApiKey();\n return (url: string) => {\n if (url.includes(\"api.chrt.co\")) {\n return { url, headers: { \"x-api-key\": apiKey } };\n }\n return undefined;\n };\n }\n}\n\n/* ── Re-exports ────────────────────────────────────── */\n\nexport { ChrtError } from \"./client.js\";\nexport { paginate } from \"./pagination.js\";\nexport { parseWebhook } from \"./webhooks.js\";\nexport { OfflineError } from \"./endpoints/offline-errors.js\";\nexport type { OfflineErrorCode } from \"./endpoints/offline-errors.js\";\nexport type { FileSystemAdapter } from \"./fs-adapter.js\";\n\n/* ── Offline style helper (Phase 8c) ───────────────── */\nexport {\n buildOfflineStyle,\n OfflineStyleError,\n} from \"./endpoints/offline-style.js\";\nexport type {\n MapLibreStyle,\n BuildOfflineStyleOptions,\n OfflineStylePlatform,\n} from \"./endpoints/offline-style.js\";\n\n/* ── S-52 portrayal / Atlas (DOM-free; browser image loaders at\n * `@chrtco/sdk/atlas/browser`) ─────────────────────── */\nexport * from \"./atlas/index.js\";\n\nexport type {\n ChrtConfig,\n FeaturesOptions,\n QueryOptions,\n CellsOptions,\n CoverageOptions,\n FeatureCollection,\n GeoJsonFeature,\n GeoJsonGeometry,\n CellsResponse,\n CellDetail,\n CoverageSource,\n CoverageResponse,\n TileGroup,\n TileGroupsResponse,\n TransformRequest,\n RouteQueryOptions,\n RouteQueryResponse,\n RouteFeatureQueryOptions,\n RouteFeatureQueryResponse,\n OfflineRegionSummary,\n OfflineBundleResponse,\n OfflineDownloadOptions,\n OfflineDownloadResult,\n OfflineDownloadProgress,\n OfflineRemoveOptions,\n OfflineHeartbeatOptions,\n OfflineFetchStyleOptions,\n OfflineStyleResponse,\n} from \"./types.js\";\nexport type {\n WebhookPayload,\n WebhookEvent,\n WebhookEventType,\n CellUpdatedEvent,\n CellNewEvent,\n CellDeletedEvent,\n CellEventData,\n CellUpdatedData,\n} from \"./webhooks.js\";\n","import type { ChrtErrorBody } from \"./types.js\";\n\nconst DEFAULT_BASE_URL = \"https://api.chrt.co/v1\";\n\nexport class ChrtError extends Error {\n status: number;\n code?: string;\n body?: ChrtErrorBody;\n\n constructor(status: number, body?: ChrtErrorBody) {\n super(body?.message ?? body?.error ?? `CHRT API error ${status}`);\n this.name = \"ChrtError\";\n this.status = status;\n this.code = body?.code;\n this.body = body;\n }\n}\n\nexport class HttpClient {\n private apiKey: string;\n private baseUrl: string;\n private retries: number;\n\n constructor(apiKey: string, baseUrl?: string, retries = 2) {\n this.apiKey = apiKey;\n this.baseUrl = (baseUrl ?? DEFAULT_BASE_URL).replace(/\\/+$/, \"\");\n this.retries = retries;\n }\n\n getBaseUrl(): string {\n return this.baseUrl;\n }\n\n getApiKey(): string {\n return this.apiKey;\n }\n\n async request<T>(\n path: string,\n params?: Record<string, string | number | undefined>,\n signal?: AbortSignal,\n ): Promise<T> {\n const url = new URL(`${this.baseUrl}${path}`);\n if (params) {\n for (const [k, v] of Object.entries(params)) {\n if (v !== undefined) url.searchParams.set(k, String(v));\n }\n }\n\n let lastError: Error | null = null;\n\n for (let attempt = 0; attempt <= this.retries; attempt++) {\n if (signal?.aborted) {\n throw signal.reason ?? new DOMException(\"The operation was aborted.\", \"AbortError\");\n }\n\n try {\n const res = await fetch(url.toString(), {\n headers: { \"x-api-key\": this.apiKey },\n signal,\n });\n\n if (!res.ok) {\n let body: ChrtErrorBody | undefined;\n try {\n body = await res.json() as ChrtErrorBody;\n } catch {\n /* empty */\n }\n const err = new ChrtError(res.status, body);\n\n // Only retry on 5xx\n if (res.status >= 500 && attempt < this.retries) {\n lastError = err;\n await sleep(100 * 2 ** attempt);\n continue;\n }\n throw err;\n }\n\n return (await res.json()) as T;\n } catch (e) {\n if (e instanceof ChrtError) throw e;\n // Don't retry aborted requests\n if (signal?.aborted) throw e;\n lastError = e as Error;\n if (attempt < this.retries) {\n await sleep(100 * 2 ** attempt);\n continue;\n }\n }\n }\n\n throw lastError ?? new Error(\"CHRT API request failed\");\n }\n\n /**\n * Typed wrapper for non-GET JSON requests. Returns the parsed body and HTTP\n * status together so callers (e.g. offline endpoints) can map error bodies\n * to typed errors without throwing at the HTTP layer. Auth defaults to\n * `x-api-key` header; pass `bearerToken` to swap to `Authorization: Bearer`.\n * No retry — the offline flow owns its own retry logic.\n */\n async postJson<T>(\n path: string,\n body: unknown,\n opts?: { bearerToken?: string; signal?: AbortSignal },\n ): Promise<{ ok: boolean; status: number; body: T | null }> {\n const url = new URL(`${this.baseUrl}${path}`);\n const headers: Record<string, string> = { \"content-type\": \"application/json\" };\n if (opts?.bearerToken) {\n headers[\"authorization\"] = `Bearer ${opts.bearerToken}`;\n } else {\n headers[\"x-api-key\"] = this.apiKey;\n }\n\n const res = await fetch(url.toString(), {\n method: \"POST\",\n headers,\n body: JSON.stringify(body),\n signal: opts?.signal,\n });\n\n let parsed: T | null = null;\n try {\n parsed = (await res.json()) as T;\n } catch {\n parsed = null;\n }\n return { ok: res.ok, status: res.status, body: parsed };\n }\n\n /** GET with Bearer auth (for offline-worker endpoints that require a JWT). */\n async getJsonWithBearer<T>(\n path: string,\n bearerToken: string,\n signal?: AbortSignal,\n ): Promise<{ ok: boolean; status: number; body: T | null }> {\n const url = new URL(`${this.baseUrl}${path}`);\n const res = await fetch(url.toString(), {\n method: \"GET\",\n headers: { authorization: `Bearer ${bearerToken}` },\n signal,\n });\n let parsed: T | null = null;\n try {\n parsed = (await res.json()) as T;\n } catch {\n parsed = null;\n }\n return { ok: res.ok, status: res.status, body: parsed };\n }\n}\n\nfunction sleep(ms: number) {\n return new Promise((r) => setTimeout(r, ms));\n}\n","import type { HttpClient } from \"../client.js\";\nimport type { TileGroupsResponse } from \"../types.js\";\n\nexport class TilesEndpoint {\n constructor(private http: HttpClient) {}\n\n /** Full style.json URL with API key as query param */\n styleUrl(): string {\n return `${this.http.getBaseUrl()}/tiles/style.json?key=${this.http.getApiKey()}`;\n }\n\n /** Individual tile URL template */\n tileUrl(z: number, x: number, y: number, format: \"pbf\" | \"mvt\" = \"mvt\"): string {\n return `${this.http.getBaseUrl()}/tiles/${z}/${x}/${y}.${format}?key=${this.http.getApiKey()}`;\n }\n\n /** List available tileset groups */\n async groups(): Promise<TileGroupsResponse> {\n return this.http.request<TileGroupsResponse>(\"/tiles/groups\");\n }\n}\n","import type { HttpClient } from \"../client.js\";\nimport type { CellsOptions, CellsResponse, CellDetail } from \"../types.js\";\n\nexport class CellsEndpoint {\n constructor(private http: HttpClient) {}\n\n /** List ENC cells with optional filters */\n async list(options?: CellsOptions): Promise<CellsResponse> {\n const { signal, ...params } = options ?? {};\n return this.http.request<CellsResponse>(\n \"/cells\",\n params as Record<string, string | number | undefined>,\n signal,\n );\n }\n\n /** Get a single cell by ID */\n async get(cellId: string, signal?: AbortSignal): Promise<CellDetail> {\n return this.http.request<CellDetail>(\n `/cells/${encodeURIComponent(cellId)}`,\n undefined,\n signal,\n );\n }\n}\n","import type { HttpClient } from \"../client.js\";\nimport type { CoverageOptions, CoverageResponse } from \"../types.js\";\n\nexport class CoverageEndpoint {\n constructor(private http: HttpClient) {}\n\n /** List available chart sources with cell counts */\n async list(options?: CoverageOptions): Promise<CoverageResponse> {\n const { signal, ...params } = options ?? {};\n return this.http.request<CoverageResponse>(\n \"/coverage\",\n params as Record<string, string | number | undefined>,\n signal,\n );\n }\n}\n","import type { HttpClient } from \"../client.js\";\nimport type { FeaturesOptions, FeatureCollection } from \"../types.js\";\n\nexport class FeaturesEndpoint {\n constructor(private http: HttpClient) {}\n\n /** Query features within a bounding box */\n async list(options: FeaturesOptions): Promise<FeatureCollection> {\n return this.http.request<FeatureCollection>(\n \"/features\",\n {\n bbox: options.bbox.join(\",\"),\n layer: options.layer,\n limit: options.limit,\n offset: options.offset,\n },\n options.signal,\n );\n }\n}\n","import type { HttpClient } from \"../client.js\";\nimport type { QueryOptions, FeatureCollection } from \"../types.js\";\n// import type { RouteQueryOptions, RouteQueryResponse } from \"../types.js\";\n\nexport class QueryEndpoint {\n constructor(private http: HttpClient) {}\n\n /** Spatial proximity search around a point */\n async nearby(options: QueryOptions): Promise<FeatureCollection> {\n return this.http.request<FeatureCollection>(\n \"/query\",\n {\n point: options.point.join(\",\"),\n radius: options.radius,\n layer: options.layer,\n limit: options.limit,\n },\n options.signal,\n );\n }\n\n // ── [CHRTquery] Staged — uncomment when serve-query/route is live ──\n //\n // /** Discover ENC cells along a route LineString */\n // async alongRoute(options: RouteQueryOptions): Promise<RouteQueryResponse> {\n // const route = {\n // type: \"LineString\" as const,\n // coordinates: options.route,\n // };\n // return this.http.request<RouteQueryResponse>(\n // \"/query/route\",\n // {\n // route: JSON.stringify(route),\n // buffer: options.buffer,\n // source: options.source,\n // scale_band: options.scaleBand,\n // limit: options.limit,\n // },\n // options.signal,\n // );\n // }\n\n // ── [CHRTquery] Staged — uncomment when serve-query/route/features is live ──\n //\n // /** Find individual features along a route LineString */\n // async featuresAlongRoute(options: RouteFeatureQueryOptions): Promise<RouteFeatureQueryResponse> {\n // const route = {\n // type: \"LineString\" as const,\n // coordinates: options.route,\n // };\n // return this.http.request<RouteFeatureQueryResponse>(\n // \"/query/route/features\",\n // {\n // route: JSON.stringify(route),\n // buffer: options.buffer,\n // layer: options.layer,\n // limit: options.limit,\n // offset: options.offset,\n // },\n // options.signal,\n // );\n // }\n}\n","/**\n * Typed errors surfaced by `chrt.offline.*`.\n *\n * Callers switch on `.code` — never parse `.message`. `.status` is set only\n * when the error originated from an HTTP response. `.detail` carries\n * machine-readable context for programmatic handling (byte math for budget\n * violations, `resumable: true` for interrupts, etc.).\n */\n\nexport type OfflineErrorCode =\n | \"budget_exceeded\"\n | \"coverage_denied\"\n | \"quota_exceeded\"\n | \"download_corrupt\"\n | \"network_interrupted\"\n | \"partial_file_invalid\"\n | \"invalid_api_key\"\n | \"region_not_available\"\n | \"offline_not_enabled\"\n | \"missing_device_id\"\n | \"missing_manifest_path\"\n | \"sha_missing\"\n | \"unexpected_response\";\n\nexport class OfflineError extends Error {\n readonly code: OfflineErrorCode;\n readonly status?: number;\n readonly detail?: Record<string, unknown>;\n\n constructor(\n code: OfflineErrorCode,\n message: string,\n status?: number,\n detail?: Record<string, unknown>,\n ) {\n super(message);\n this.name = \"OfflineError\";\n this.code = code;\n this.status = status;\n this.detail = detail;\n }\n}\n\n/**\n * Map a server-side error body (mint-offline-token, offline-worker) to an\n * OfflineErrorCode. The server uses both `code` and `error` keys depending on\n * route; we try both.\n */\nexport function mapServerError(\n body: unknown,\n status: number,\n): { code: OfflineErrorCode; detail?: Record<string, unknown> } {\n const b = (body ?? {}) as Record<string, unknown>;\n const raw = typeof b.code === \"string\" ? b.code : typeof b.error === \"string\" ? b.error : \"\";\n\n // Server-side strings that have a direct typed analogue.\n switch (raw) {\n case \"offline_budget_exceeded\":\n return {\n code: \"budget_exceeded\",\n detail: {\n // Phase 8d: `level` is \"team\" | \"key\" — surfaced by mint-offline-token\n // when MIN(team, key) enforcement rejects. Bundle-route refusals from\n // offline-worker omit it. Application code should branch on this to\n // show the right message (\"upgrade your team plan\" vs \"raise this\n // key's storage cap\"). `team_used_bytes` is included on team-level\n // refusals so the dashboard can show \"X of Y GB used\".\n level: typeof b.level === \"string\" ? b.level : undefined,\n budget_bytes: b.budget_bytes,\n required_bytes: b.required_bytes,\n over_by_bytes: b.over_by_bytes,\n remaining_bytes: b.remaining_bytes,\n team_used_bytes: b.team_used_bytes,\n },\n };\n case \"offline_not_enabled\":\n return { code: \"offline_not_enabled\" };\n case \"region_not_licensed\":\n return {\n code: \"coverage_denied\",\n detail: { requested: b.requested, allowed: b.allowed },\n };\n case \"no_offline_builds\":\n case \"no_offline_build\":\n return { code: \"region_not_available\", detail: { detail: b.detail, region: b.region } };\n case \"invalid_api_key\":\n case \"missing_auth\":\n return { code: \"invalid_api_key\" };\n case \"tile_quota_exceeded\":\n return { code: \"quota_exceeded\" };\n case \"rate_limited\":\n return {\n code: \"quota_exceeded\",\n detail: { limit: b.limit, period_seconds: b.period_seconds },\n };\n case \"revoked\":\n return { code: \"invalid_api_key\", detail: { reason: \"revoked\" } };\n }\n\n // Status-based fallbacks for error strings we don't recognize.\n if (status === 401) return { code: \"invalid_api_key\" };\n if (status === 403) return { code: \"coverage_denied\" };\n if (status === 429) return { code: \"quota_exceeded\" };\n if (status === 503) return { code: \"region_not_available\" };\n\n return { code: \"unexpected_response\", detail: { raw_error: raw } };\n}\n","import type { HttpClient } from \"../client.js\";\nimport { OfflineError, mapServerError } from \"./offline-errors.js\";\n\n/**\n * Fresh-token shape from POST `/v1/mint/offline-token` (proxied to Supabase\n * `mint-offline-token`). Mirrors docs/api/tile-jwt-claims.md §4.\n */\nexport interface MintedOfflineToken {\n token: string;\n expiresAt: number;\n kid: string;\n offlineUntil: number;\n /** Per-region build_tag map returned by the mint function. */\n buildTags: Record<string, string>;\n gracePeriodDays: number;\n}\n\ninterface MintResponseBody {\n token?: unknown;\n expires_at?: unknown;\n kid?: unknown;\n offline_until?: unknown;\n regions?: unknown;\n grace_period_days?: unknown;\n}\n\n/** Refresh this many seconds before `exp`. */\nconst REFRESH_MARGIN_SECONDS = 30;\n\nfunction now(): number {\n return Math.floor(Date.now() / 1000);\n}\n\n/**\n * Cache + single-flight mint for offline JWTs.\n *\n * - Keyed by `(deviceId, sorted-regions)` so a token scoped to one region\n * doesn't accidentally get reused for a broader request.\n * - Refreshes 30s before `exp`.\n * - While a mint is in flight, concurrent callers share the same promise.\n */\nexport class OfflineTokenManager {\n private readonly cache = new Map<string, MintedOfflineToken>();\n private readonly pending = new Map<string, Promise<MintedOfflineToken>>();\n\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Get a fresh-enough token for the caller's device + requested regions.\n * If `regions` is omitted, the mint function defaults to the key's full\n * `allowed_sources`.\n */\n async getToken(deviceId: string, regions?: string[]): Promise<MintedOfflineToken> {\n if (!deviceId) {\n throw new OfflineError(\"missing_device_id\", \"deviceId is required for offline operations\");\n }\n const key = this.cacheKey(deviceId, regions);\n\n const cached = this.cache.get(key);\n if (cached && cached.expiresAt - now() > REFRESH_MARGIN_SECONDS) {\n return cached;\n }\n\n const inflight = this.pending.get(key);\n if (inflight) return inflight;\n\n const promise = this.mintFresh(deviceId, regions).finally(() => {\n this.pending.delete(key);\n });\n this.pending.set(key, promise);\n const token = await promise;\n this.cache.set(key, token);\n return token;\n }\n\n /** Force-evict the cached token for a (deviceId, regions) pair. Used after a 401. */\n invalidate(deviceId: string, regions?: string[]): void {\n this.cache.delete(this.cacheKey(deviceId, regions));\n }\n\n private cacheKey(deviceId: string, regions?: string[]): string {\n const tail = regions && regions.length > 0 ? [...regions].sort().join(\",\") : \"*\";\n return `${deviceId}::${tail}`;\n }\n\n private async mintFresh(deviceId: string, regions?: string[]): Promise<MintedOfflineToken> {\n const body: { device_id: string; regions?: string[] } = { device_id: deviceId };\n if (regions && regions.length > 0) body.regions = regions;\n\n const res = await this.http.postJson<MintResponseBody>(\"/mint/offline-token\", body);\n\n if (!res.ok) {\n const mapped = mapServerError(res.body, res.status);\n throw new OfflineError(\n mapped.code,\n `mint-offline-token failed: HTTP ${res.status}`,\n res.status,\n mapped.detail,\n );\n }\n\n const body2 = res.body ?? {};\n const regionsArr = Array.isArray(body2.regions) ? (body2.regions as unknown[]) : [];\n const buildTags: Record<string, string> = {};\n for (const r of regionsArr) {\n if (r && typeof r === \"object\") {\n const row = r as { region?: unknown; build_tag?: unknown };\n if (typeof row.region === \"string\" && typeof row.build_tag === \"string\") {\n buildTags[row.region] = row.build_tag;\n }\n }\n }\n\n if (\n typeof body2.token !== \"string\" ||\n typeof body2.expires_at !== \"number\" ||\n typeof body2.kid !== \"string\" ||\n typeof body2.offline_until !== \"number\" ||\n typeof body2.grace_period_days !== \"number\"\n ) {\n throw new OfflineError(\n \"unexpected_response\",\n \"mint-offline-token returned malformed body\",\n res.status,\n );\n }\n\n return {\n token: body2.token,\n expiresAt: body2.expires_at,\n kid: body2.kid,\n offlineUntil: body2.offline_until,\n buildTags,\n gracePeriodDays: body2.grace_period_days,\n };\n }\n}\n","/**\n * Pure helper: take an online MapLibre style and rewrite the named region's\n * vector source to point at a local MBTiles file. Layers, paint, layout,\n * glyphs, and sprite are untouched.\n *\n * This is the JS counterpart of the offline-worker's server-side rewriter\n * (see `cloudflare/offline-worker/src/common.ts:rewriteStyleSources`).\n * Customers can either:\n *\n * 1. Fetch a pre-baked offline style from the worker via\n * `chrt.offline.fetchStyle(region, opts)` — recommended for native\n * MapLibre clients (iOS/Android/desktop) that don't have the JS atlas\n * available.\n *\n * 2. Generate the online style themselves (e.g. via this SDK's\n * `generateStyle()` export from `@chrtco/sdk`) and call\n * `buildOfflineStyle()` locally — recommended for JS/web SDK\n * consumers who already use the atlas at runtime.\n *\n * Both paths produce equivalent output.\n */\n\n/**\n * MapLibre style specification (subset). Matches the JSON shape MapLibre GL\n * JS, MapLibre Native iOS/Android, and the MapLibre style spec all consume.\n * Customers who want full TypeScript style typing should reference\n * `@maplibre/maplibre-gl-style-spec.StyleSpecification` directly.\n */\nexport interface MapLibreStyle {\n version: number;\n name?: string;\n metadata?: Record<string, unknown>;\n sources: Record<string, MapLibreSource | unknown>;\n sprite?: string;\n glyphs?: string;\n layers: unknown[];\n}\n\ninterface MapLibreSource {\n type: string;\n tiles?: string[];\n url?: string;\n minzoom?: number;\n maxzoom?: number;\n [key: string]: unknown;\n}\n\n/** Target platform — drives the URL scheme used in the rewritten source. */\nexport type OfflineStylePlatform = \"ios\" | \"android\" | \"desktop\";\n\nexport interface BuildOfflineStyleOptions {\n /**\n * Target platform. iOS + Android use the `mbtiles://` scheme MapLibre Native\n * understands; desktop uses `file://`. Default: `\"ios\"`.\n */\n platform?: OfflineStylePlatform;\n /**\n * Name of the source to rewrite. If omitted, defaults to the only vector\n * source in the input style. Throws `OfflineStyleError` if there are zero\n * or more than one vector sources and `sourceName` isn't provided.\n */\n sourceName?: string;\n}\n\n/**\n * Thrown when `buildOfflineStyle` can't determine which source to swap or\n * the named source isn't present in the input style.\n */\nexport class OfflineStyleError extends Error {\n readonly code: string;\n constructor(message: string, code: string) {\n super(message);\n this.name = \"OfflineStyleError\";\n this.code = code;\n }\n}\n\n/**\n * Returns a deep-copy of `onlineStyle` with the named (or auto-detected)\n * vector source rewritten to point at `mbtilesPath`. Other sources, layers,\n * paint, layout, glyphs, and sprite pass through unmodified.\n *\n * URL scheme:\n *\n * platform=\"ios\" → `mbtiles://<mbtilesPath>` MLN Native iOS\n * platform=\"android\" → `mbtiles://<mbtilesPath>` MLN Native Android\n * platform=\"desktop\" → `file://<mbtilesPath>` MLN GL native (Win/Mac/Linux)\n *\n * The `mbtilesPath` is intentionally treated as opaque text. Most native MLN\n * bindings accept the bare scheme + filename and resolve against an\n * app-defined root (typically the app's Documents directory). Pass an\n * absolute path on desktop, or a relative filename on iOS/Android.\n *\n * @param onlineStyle The base MapLibre style. Not mutated.\n * @param mbtilesPath Local-file path component (e.g. `\"NOAA_ENC.mbtiles\"`).\n * @param opts Platform + optional explicit `sourceName`.\n *\n * @example\n * import { buildOfflineStyle } from \"@chrtco/sdk\";\n *\n * // Online style obtained however you like — generated client-side or\n * // fetched from a server.\n * const onlineStyle = generateStyle(\"DAY\", { region: \"NOAA_ENC\" });\n *\n * const offlineStyle = buildOfflineStyle(\n * onlineStyle,\n * \"NOAA_ENC.mbtiles\",\n * { platform: \"ios\" },\n * );\n * // → hand `offlineStyle` to MapLibre.\n */\nexport function buildOfflineStyle(\n onlineStyle: MapLibreStyle,\n mbtilesPath: string,\n opts: BuildOfflineStyleOptions = {},\n): MapLibreStyle {\n if (!onlineStyle || typeof onlineStyle !== \"object\") {\n throw new OfflineStyleError(\"onlineStyle is required\", \"invalid_style\");\n }\n if (!onlineStyle.sources || typeof onlineStyle.sources !== \"object\") {\n throw new OfflineStyleError(\"style has no sources\", \"no_sources\");\n }\n if (!mbtilesPath || typeof mbtilesPath !== \"string\") {\n throw new OfflineStyleError(\"mbtilesPath is required\", \"invalid_path\");\n }\n\n const platform = opts.platform ?? \"ios\";\n const scheme = platform === \"desktop\" ? \"file\" : \"mbtiles\";\n const url = `${scheme}://${mbtilesPath}`;\n\n let sourceName: string;\n if (opts.sourceName) {\n if (!(opts.sourceName in onlineStyle.sources)) {\n throw new OfflineStyleError(\n `source \"${opts.sourceName}\" not found in style`,\n \"source_not_found\",\n );\n }\n sourceName = opts.sourceName;\n } else {\n const vectorSources = Object.entries(onlineStyle.sources).filter(\n ([, src]) =>\n src &&\n typeof src === \"object\" &&\n (src as MapLibreSource).type === \"vector\",\n );\n if (vectorSources.length === 0) {\n throw new OfflineStyleError(\n \"no vector sources in style — pass `opts.sourceName` to override\",\n \"no_vector_source\",\n );\n }\n if (vectorSources.length > 1) {\n throw new OfflineStyleError(\n `${vectorSources.length} vector sources in style — pass \\`opts.sourceName\\``,\n \"ambiguous_source\",\n );\n }\n sourceName = vectorSources[0][0];\n }\n\n // Deep-clone via JSON round-trip — style is plain JSON-shaped, no cycles.\n const cloned = JSON.parse(JSON.stringify(onlineStyle)) as MapLibreStyle;\n const src = cloned.sources[sourceName] as MapLibreSource;\n src.tiles = [url];\n // Collapse legacy `mapbox://...` shape if present so MLN doesn't see both.\n delete src.url;\n return cloned;\n}\n","import type { FileSystemAdapter } from \"../fs-adapter.js\";\nimport { OfflineError } from \"./offline-errors.js\";\n\n/**\n * On-disk shape. Bump `version` if we ever change it; old readers refuse.\n */\nexport interface OfflineManifest {\n version: 1;\n budget_bytes: number | null;\n regions: Record<string, ManifestRegionEntry>;\n}\n\nexport interface ManifestRegionEntry {\n path: string;\n bytes: number;\n sha256: string;\n build_id: string;\n build_tag: string;\n downloaded_at: number;\n last_accessed_at: number;\n}\n\nconst CURRENT_VERSION = 1;\n\nfunction emptyManifest(): OfflineManifest {\n return { version: CURRENT_VERSION, budget_bytes: null, regions: {} };\n}\n\nexport async function readManifest(\n manifestPath: string | undefined,\n fs: FileSystemAdapter,\n): Promise<OfflineManifest> {\n if (!manifestPath) return emptyManifest();\n if (!(await fs.exists(manifestPath))) return emptyManifest();\n\n const raw = await fs.readFile(manifestPath);\n const text = new TextDecoder().decode(raw);\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n throw new OfflineError(\n \"unexpected_response\",\n `offline manifest at ${manifestPath} is not valid JSON`,\n );\n }\n\n if (!parsed || typeof parsed !== \"object\") {\n throw new OfflineError(\"unexpected_response\", `offline manifest shape invalid`);\n }\n const m = parsed as Partial<OfflineManifest>;\n if (m.version !== CURRENT_VERSION) {\n throw new OfflineError(\n \"unexpected_response\",\n `offline manifest version mismatch: got ${String(m.version)}, expected ${CURRENT_VERSION}`,\n );\n }\n return {\n version: CURRENT_VERSION,\n budget_bytes: typeof m.budget_bytes === \"number\" ? m.budget_bytes : null,\n regions: m.regions && typeof m.regions === \"object\" ? m.regions : {},\n };\n}\n\nexport async function writeManifest(\n manifestPath: string,\n fs: FileSystemAdapter,\n manifest: OfflineManifest,\n): Promise<void> {\n const text = JSON.stringify(manifest, null, 2);\n const bytes = new TextEncoder().encode(text);\n await fs.writeFile(manifestPath, bytes);\n}\n\nexport function usedBytes(manifest: OfflineManifest, excludeRegion?: string): number {\n let total = 0;\n for (const [region, entry] of Object.entries(manifest.regions)) {\n if (region === excludeRegion) continue;\n total += entry.bytes;\n }\n return total;\n}\n\nexport function requireManifestPath(manifestPath: string | undefined): string {\n if (!manifestPath) {\n throw new OfflineError(\n \"missing_manifest_path\",\n \"ChrtConfig.manifestPath is required for this operation\",\n );\n }\n return manifestPath;\n}\n","import type { HttpClient } from \"../client.js\";\nimport type {\n OfflineBundleResponse,\n OfflineDownloadOptions,\n OfflineDownloadResult,\n OfflineDownloadProgress,\n OfflineFetchStyleOptions,\n OfflineHeartbeatOptions,\n OfflineRegionSummary,\n OfflineRemoveOptions,\n OfflineStyleResponse,\n} from \"../types.js\";\nimport { OfflineError, mapServerError } from \"./offline-errors.js\";\nimport { OfflineTokenManager } from \"./offline-token-manager.js\";\nimport {\n buildOfflineStyle,\n type BuildOfflineStyleOptions,\n type MapLibreStyle,\n} from \"./offline-style.js\";\nimport {\n readManifest,\n requireManifestPath,\n usedBytes,\n writeManifest,\n type OfflineManifest,\n} from \"./offline-manifest.js\";\n\n/** Progress is throttled to whichever of these two thresholds is larger. */\nconst PROGRESS_MIN_BYTES = 1024 * 1024; // 1 MB\nconst PROGRESS_MIN_FRACTION = 0.01; // 1%\n\ninterface RegionsListResponse {\n regions?: unknown;\n unavailable?: unknown;\n}\n\nexport class OfflineEndpoint {\n readonly tokenManager: OfflineTokenManager;\n\n constructor(\n private readonly http: HttpClient,\n private readonly deviceId: string | undefined,\n private readonly manifestPath: string | undefined,\n ) {\n this.tokenManager = new OfflineTokenManager(http);\n }\n\n /** List regions downloadable under the caller's API key. */\n async list(): Promise<OfflineRegionSummary[]> {\n const token = await this.requireToken();\n const res = await this.http.getJsonWithBearer<RegionsListResponse>(\n \"/offline/regions\",\n token.token,\n );\n if (!res.ok) {\n const mapped = mapServerError(res.body, res.status);\n throw new OfflineError(\n mapped.code,\n `offline.list failed: HTTP ${res.status}`,\n res.status,\n mapped.detail,\n );\n }\n const arr = Array.isArray(res.body?.regions) ? (res.body.regions as unknown[]) : [];\n const out: OfflineRegionSummary[] = [];\n for (const r of arr) {\n if (!r || typeof r !== \"object\") continue;\n const row = r as {\n region?: unknown;\n build_id?: unknown;\n build_tag?: unknown;\n total_bytes?: unknown;\n issued_at?: unknown;\n };\n if (\n typeof row.region === \"string\" &&\n typeof row.build_id === \"string\" &&\n typeof row.build_tag === \"string\" &&\n typeof row.total_bytes === \"number\"\n ) {\n out.push({\n region: row.region,\n build_id: row.build_id,\n build_tag: row.build_tag,\n total_bytes: row.total_bytes,\n issued_at: typeof row.issued_at === \"number\" ? row.issued_at : null,\n });\n }\n }\n return out;\n }\n\n /**\n * Download an MBTiles bundle for `region` to `opts.path`. Resumable via a\n * `<path>.partial` sidecar on interrupt. SHA-256 verified before rename.\n */\n async download(region: string, opts: OfflineDownloadOptions): Promise<OfflineDownloadResult> {\n return this.downloadInternal(region, opts, 0);\n }\n\n /** Delete local file and, if manifest is configured, drop its row + heartbeat. */\n async remove(region: string, opts: OfflineRemoveOptions): Promise<void> {\n if (await opts.fs.exists(opts.path)) {\n await opts.fs.unlink(opts.path);\n }\n const partial = `${opts.path}.partial`;\n if (await opts.fs.exists(partial)) {\n await opts.fs.unlink(partial);\n }\n\n if (this.manifestPath) {\n const manifest = await readManifest(this.manifestPath, opts.fs);\n if (manifest.regions[region]) {\n delete manifest.regions[region];\n await writeManifest(this.manifestPath, opts.fs, manifest);\n }\n // Best-effort heartbeat with the new totals; failure doesn't block removal.\n const regions = Object.keys(manifest.regions);\n const total = usedBytes(manifest);\n try {\n await this.heartbeat({ regions, total_bytes: total, fs: opts.fs });\n } catch {\n // swallow — the file is already gone locally.\n }\n }\n }\n\n /**\n * Pure helper — rewrites the named (or auto-detected) vector source in\n * `onlineStyle` to point at a local MBTiles file. Layers/paint/glyphs\n * untouched. Use when you already have an online style (e.g. generated\n * client-side via the React app's atlas) and want the offline variant.\n *\n * Equivalent to importing `buildOfflineStyle` directly — exposed on the\n * endpoint for discoverability.\n */\n style(\n onlineStyle: MapLibreStyle,\n mbtilesPath: string,\n opts?: BuildOfflineStyleOptions,\n ): MapLibreStyle {\n return buildOfflineStyle(onlineStyle, mbtilesPath, opts);\n }\n\n /**\n * Fetch a pre-baked offline style for `region` from\n * `GET /v1/offline/styles/{region}`. The worker's response already has the\n * source rewritten to `mbtiles://` (default) or `file://`, so the returned\n * `style` is ready to hand directly to MapLibre.\n *\n * Recommended for native MLN clients (iOS/Android/desktop) that don't have\n * the JS atlas available. JS/web SDK consumers can equivalently generate\n * the online style themselves and call `chrt.offline.style(...)`.\n */\n async fetchStyle(\n region: string,\n opts: OfflineFetchStyleOptions = {},\n ): Promise<OfflineStyleResponse> {\n const token = await this.requireToken([region]);\n const palette = opts.palette ?? \"DAY\";\n const protocol = opts.protocol ?? \"mbtiles\";\n const path = `/offline/styles/${encodeURIComponent(region)}?palette=${palette}&protocol=${protocol}`;\n const res = await this.http.getJsonWithBearer<OfflineStyleResponse>(\n path,\n token.token,\n );\n if (!res.ok) {\n const mapped = mapServerError(res.body, res.status);\n throw new OfflineError(\n mapped.code,\n `offline.fetchStyle failed: HTTP ${res.status}`,\n res.status,\n mapped.detail,\n );\n }\n if (!res.body || typeof res.body !== \"object\" || !res.body.style) {\n throw new OfflineError(\n \"unexpected_response\",\n \"offline.fetchStyle: malformed response (missing `style`)\",\n res.status,\n );\n }\n return res.body;\n }\n\n /**\n * Set the local storage budget in bytes. Requires `manifestPath`. Enforced\n * at the start of each `download()`. A budget smaller than current usage\n * does not auto-prune; it only refuses new downloads until the customer\n * calls `remove()`.\n */\n async setStorageBudget(bytes: number, fs: import(\"../fs-adapter.js\").FileSystemAdapter): Promise<void> {\n if (!Number.isFinite(bytes) || bytes < 0) {\n throw new OfflineError(\"unexpected_response\", `invalid budget: ${bytes}`);\n }\n const path = requireManifestPath(this.manifestPath);\n const manifest = await readManifest(path, fs);\n manifest.budget_bytes = bytes;\n await writeManifest(path, fs, manifest);\n }\n\n /**\n * Send a heartbeat. If `opts.regions` / `opts.total_bytes` are omitted and\n * a manifest is configured, values are derived from it. v1 is manual-call\n * only; auto-scheduling is a follow-up phase.\n */\n async heartbeat(opts?: OfflineHeartbeatOptions): Promise<void> {\n const deviceId = this.requireDeviceId();\n\n let regions = opts?.regions;\n let totalBytes = opts?.total_bytes;\n\n // Auto-derive from manifest when caller omitted values AND gave us an fs.\n if ((regions === undefined || totalBytes === undefined) && this.manifestPath && opts?.fs) {\n const manifest = await readManifest(this.manifestPath, opts.fs);\n if (regions === undefined) regions = Object.keys(manifest.regions);\n if (totalBytes === undefined) totalBytes = usedBytes(manifest);\n }\n if (regions === undefined) regions = [];\n if (totalBytes === undefined) totalBytes = 0;\n\n const token = await this.tokenManager.getToken(deviceId);\n const body = {\n device_id: deviceId,\n regions,\n total_bytes: totalBytes,\n ...(opts?.sdk_version ? { sdk_version: opts.sdk_version } : {}),\n ...(opts?.platform ? { platform: opts.platform } : {}),\n };\n const res = await this.http.postJson<unknown>(\"/offline/heartbeat\", body, {\n bearerToken: token.token,\n });\n if (!res.ok) {\n const mapped = mapServerError(res.body, res.status);\n throw new OfflineError(\n mapped.code,\n `offline.heartbeat failed: HTTP ${res.status}`,\n res.status,\n mapped.detail,\n );\n }\n }\n\n // ── Internals ────────────────────────────────────────────────────────────\n\n private requireDeviceId(): string {\n if (!this.deviceId) {\n throw new OfflineError(\n \"missing_device_id\",\n \"ChrtConfig.deviceId is required for offline operations\",\n );\n }\n return this.deviceId;\n }\n\n private async requireToken(regions?: string[]) {\n const deviceId = this.requireDeviceId();\n return this.tokenManager.getToken(deviceId, regions);\n }\n\n private async fetchBundle(region: string, bearerToken: string): Promise<OfflineBundleResponse> {\n const res = await this.http.getJsonWithBearer<Record<string, unknown>>(\n `/offline/bundles/${encodeURIComponent(region)}`,\n bearerToken,\n );\n if (!res.ok) {\n const mapped = mapServerError(res.body, res.status);\n throw new OfflineError(\n mapped.code,\n `offline.download bundle fetch failed: HTTP ${res.status}`,\n res.status,\n mapped.detail,\n );\n }\n const b = res.body ?? {};\n const missingFields: string[] = [];\n const field = <K extends string>(k: K): unknown => (b as Record<string, unknown>)[k];\n\n for (const k of [\"signed_url\", \"bytes\", \"build_id\", \"build_tag\", \"expires_at\"] as const) {\n if (field(k) === undefined) missingFields.push(k);\n }\n if (missingFields.length > 0) {\n throw new OfflineError(\n \"unexpected_response\",\n `bundle response missing fields: ${missingFields.join(\",\")}`,\n res.status,\n );\n }\n if (typeof field(\"sha256\") !== \"string\" || (field(\"sha256\") as string).length === 0) {\n throw new OfflineError(\n \"sha_missing\",\n \"bundle response did not include sha256; cannot verify integrity\",\n res.status,\n );\n }\n return {\n region: typeof field(\"region\") === \"string\" ? (field(\"region\") as string) : region,\n build_id: field(\"build_id\") as string,\n build_tag: field(\"build_tag\") as string,\n signed_url: field(\"signed_url\") as string,\n expires_at: field(\"expires_at\") as number,\n bytes: field(\"bytes\") as number,\n sha256: (field(\"sha256\") as string).toLowerCase(),\n offline_until: typeof field(\"offline_until\") === \"number\" ? (field(\"offline_until\") as number) : 0,\n heartbeat_after:\n typeof field(\"heartbeat_after\") === \"number\" ? (field(\"heartbeat_after\") as number) : 0,\n server_time: typeof field(\"server_time\") === \"number\" ? (field(\"server_time\") as number) : 0,\n };\n }\n\n private async downloadInternal(\n region: string,\n opts: OfflineDownloadOptions,\n retryDepth: number,\n ): Promise<OfflineDownloadResult> {\n const { path, fs, onProgress, signal } = opts;\n const partialPath = `${path}.partial`;\n\n const token = await this.requireToken([region]);\n const bundle = await this.fetchBundle(region, token.token);\n\n // Budget check against manifest (if present).\n if (this.manifestPath) {\n const manifest = await readManifest(this.manifestPath, fs);\n if (manifest.budget_bytes !== null) {\n const currentUsed = usedBytes(manifest, region);\n const projected = currentUsed + bundle.bytes;\n if (projected > manifest.budget_bytes) {\n throw new OfflineError(\n \"budget_exceeded\",\n `offline storage budget would be exceeded`,\n undefined,\n {\n budget_bytes: manifest.budget_bytes,\n used_bytes: currentUsed,\n required_bytes: bundle.bytes,\n over_by_bytes: projected - manifest.budget_bytes,\n },\n );\n }\n }\n }\n\n // Examine existing partial.\n let startByte = 0;\n let resumed = false;\n if (await fs.exists(partialPath)) {\n const partialStat = await fs.stat(partialPath);\n if (partialStat.size > bundle.bytes) {\n await fs.unlink(partialPath);\n } else if (partialStat.size === bundle.bytes) {\n const computed = await fs.sha256(partialPath);\n if (computed.toLowerCase() === bundle.sha256) {\n await fs.rename(partialPath, path);\n await this.persistManifestEntry(region, bundle, path, fs);\n return {\n path,\n bytes: bundle.bytes,\n sha256: bundle.sha256,\n build_id: bundle.build_id,\n build_tag: bundle.build_tag,\n resumed: true,\n };\n }\n // Complete but corrupt — drop and restart.\n await fs.unlink(partialPath);\n } else {\n startByte = partialStat.size;\n resumed = true;\n }\n }\n\n // Fetch (with Range if resuming).\n const fetchInit: RequestInit = { method: \"GET\", signal };\n if (startByte > 0) {\n fetchInit.headers = { Range: `bytes=${startByte}-` };\n }\n\n let response: Response;\n try {\n response = await fetch(bundle.signed_url, fetchInit);\n } catch (err) {\n if (signal?.aborted) {\n throw new OfflineError(\n \"network_interrupted\",\n \"download aborted before response\",\n undefined,\n { resumable: startByte > 0, bytes_written: startByte },\n );\n }\n throw new OfflineError(\n \"network_interrupted\",\n err instanceof Error ? err.message : \"fetch failed\",\n undefined,\n { resumable: startByte > 0, bytes_written: startByte },\n );\n }\n\n // Expired signed URL or build flipped mid-resume → re-mint once.\n if (startByte > 0 && (response.status === 403 || response.status === 404)) {\n await fs.unlink(partialPath);\n if (retryDepth > 0) {\n throw new OfflineError(\n \"unexpected_response\",\n `signed URL still rejected after re-mint (HTTP ${response.status})`,\n response.status,\n );\n }\n this.tokenManager.invalidate(this.requireDeviceId(), [region]);\n return this.downloadInternal(region, opts, retryDepth + 1);\n }\n\n if (startByte > 0 && response.status !== 206) {\n throw new OfflineError(\n \"unexpected_response\",\n `expected 206 Partial Content on Range request, got ${response.status}`,\n response.status,\n );\n }\n if (startByte === 0 && response.status !== 200) {\n throw new OfflineError(\n \"unexpected_response\",\n `expected 200 on initial GET, got ${response.status}`,\n response.status,\n );\n }\n if (!response.body) {\n throw new OfflineError(\n \"unexpected_response\",\n \"response had no body\",\n response.status,\n );\n }\n\n // Stream with progress + abort + persist-on-interrupt.\n await fs.mkdir(dirname(path), { recursive: true });\n const writer = (await fs.writeStream(partialPath, { append: startByte > 0 })).getWriter();\n let bytesDownloaded = startByte;\n let lastProgressBytes = startByte;\n const progressThreshold = Math.max(\n PROGRESS_MIN_BYTES,\n Math.floor(bundle.bytes * PROGRESS_MIN_FRACTION),\n );\n\n const emit = (final: boolean): void => {\n if (!onProgress) return;\n if (!final && bytesDownloaded - lastProgressBytes < progressThreshold) return;\n const progress: OfflineDownloadProgress = {\n bytesDownloaded,\n bytesTotal: bundle.bytes,\n fraction: bundle.bytes === 0 ? 1 : bytesDownloaded / bundle.bytes,\n };\n try {\n onProgress(progress);\n } catch {\n // customer callback failures must not break download\n }\n lastProgressBytes = bytesDownloaded;\n };\n\n emit(true); // always fire at start\n\n try {\n const reader = response.body.getReader();\n while (true) {\n if (signal?.aborted) {\n throw new OfflineError(\n \"network_interrupted\",\n \"download aborted by caller\",\n undefined,\n { resumable: true, bytes_written: bytesDownloaded },\n );\n }\n const { done, value } = await reader.read();\n if (done) break;\n if (value) {\n await writer.write(value);\n bytesDownloaded += value.byteLength;\n emit(false);\n }\n }\n await writer.close();\n } catch (err) {\n try {\n await writer.abort();\n } catch {\n // best-effort\n }\n if (err instanceof OfflineError) throw err;\n throw new OfflineError(\n \"network_interrupted\",\n err instanceof Error ? err.message : \"stream error\",\n undefined,\n { resumable: true, bytes_written: bytesDownloaded },\n );\n }\n\n emit(true); // always fire at completion\n\n // Verify SHA.\n const computedSha = await fs.sha256(partialPath);\n if (computedSha.toLowerCase() !== bundle.sha256) {\n await fs.unlink(partialPath);\n throw new OfflineError(\n \"download_corrupt\",\n `SHA-256 mismatch for ${region}: expected ${bundle.sha256}, got ${computedSha}`,\n undefined,\n { expected: bundle.sha256, actual: computedSha },\n );\n }\n\n await fs.rename(partialPath, path);\n await this.persistManifestEntry(region, bundle, path, fs);\n\n return {\n path,\n bytes: bundle.bytes,\n sha256: bundle.sha256,\n build_id: bundle.build_id,\n build_tag: bundle.build_tag,\n resumed,\n };\n }\n\n private async persistManifestEntry(\n region: string,\n bundle: OfflineBundleResponse,\n path: string,\n fs: import(\"../fs-adapter.js\").FileSystemAdapter,\n ): Promise<void> {\n if (!this.manifestPath) return;\n const manifest: OfflineManifest = await readManifest(this.manifestPath, fs);\n const nowSec = Math.floor(Date.now() / 1000);\n manifest.regions[region] = {\n path,\n bytes: bundle.bytes,\n sha256: bundle.sha256,\n build_id: bundle.build_id,\n build_tag: bundle.build_tag,\n downloaded_at: nowSec,\n last_accessed_at: nowSec,\n };\n await writeManifest(this.manifestPath, fs, manifest);\n }\n}\n\n/** Tiny helper so we don't import `node:path`. */\nfunction dirname(p: string): string {\n const i = p.lastIndexOf(\"/\");\n const j = p.lastIndexOf(\"\\\\\");\n const k = Math.max(i, j);\n if (k <= 0) return \".\";\n return p.slice(0, k);\n}\n","/**\n * Generic async auto-pagination generator.\n *\n * Fetches pages from a callback that returns `{ items, total_count }` and\n * yields individual items until all pages are consumed or the signal is aborted.\n *\n * @example\n * ```ts\n * for await (const feature of paginate(\n * (offset, signal) => chrt.features({ bbox, limit: 100, offset, signal }),\n * f => f.features,\n * f => f.total_count ?? 0,\n * )) {\n * console.log(feature);\n * }\n * ```\n */\nexport async function* paginate<TResponse, TItem>(\n fetchPage: (offset: number, signal?: AbortSignal) => Promise<TResponse>,\n getItems: (response: TResponse) => TItem[],\n getTotalCount: (response: TResponse) => number,\n options?: { pageSize?: number; signal?: AbortSignal },\n): AsyncGenerator<TItem, void, undefined> {\n const pageSize = options?.pageSize ?? 100;\n const signal = options?.signal;\n let offset = 0;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n if (signal?.aborted) return;\n\n const response = await fetchPage(offset, signal);\n const items = getItems(response);\n\n for (const item of items) {\n yield item;\n }\n\n if (items.length === 0) return;\n\n offset += items.length;\n const total = getTotalCount(response);\n if (total > 0 && offset >= total) return;\n }\n}\n","/* ── Webhook event types ───────────────────────────── */\n\n/** Base envelope for all webhook payloads */\nexport interface WebhookPayload<T extends string, D> {\n /** Unique event ID */\n id: string;\n /** ISO 8601 timestamp */\n timestamp: string;\n /** Event type discriminator */\n type: T;\n /** Event-specific data */\n data: D;\n}\n\n/* ── Event data shapes ─────────────────────────────── */\n\nexport interface CellEventData {\n cell_id: string;\n chart_source: string;\n title: string | null;\n edition: number | null;\n update_number: number | null;\n scale_band: string | null;\n}\n\nexport interface CellUpdatedData extends CellEventData {\n previous_edition: number | null;\n previous_update_number: number | null;\n}\n\n/* ── Concrete event types ──────────────────────────── */\n\nexport type CellUpdatedEvent = WebhookPayload<\"cell.updated\", CellUpdatedData>;\nexport type CellNewEvent = WebhookPayload<\"cell.new\", CellEventData>;\nexport type CellDeletedEvent = WebhookPayload<\"cell.deleted\", CellEventData>;\n\n/** Discriminated union of all webhook events */\nexport type WebhookEvent = CellUpdatedEvent | CellNewEvent | CellDeletedEvent;\n\n/** All recognised webhook event type strings */\nexport type WebhookEventType = WebhookEvent[\"type\"];\n\n/* ── Runtime parser ────────────────────────────────── */\n\nconst VALID_TYPES = new Set<string>([\"cell.updated\", \"cell.new\", \"cell.deleted\"]);\n\n/**\n * Parse and validate a raw webhook payload.\n *\n * @param body - The raw request body (parsed JSON object)\n * @returns A typed `WebhookEvent`\n * @throws Error if the payload is malformed or has an unknown event type\n *\n * @example\n * ```ts\n * import { parseWebhook } from \"@chrtco/sdk\";\n *\n * app.post(\"/webhooks/chrt\", (req, res) => {\n * const event = parseWebhook(req.body);\n * switch (event.type) {\n * case \"cell.updated\":\n * console.log(\"Cell updated:\", event.data.cell_id);\n * break;\n * case \"cell.new\":\n * console.log(\"New cell:\", event.data.cell_id);\n * break;\n * }\n * res.sendStatus(200);\n * });\n * ```\n */\nexport function parseWebhook(body: unknown): WebhookEvent {\n if (typeof body !== \"object\" || body === null) {\n throw new Error(\"Invalid webhook payload: expected an object\");\n }\n\n const obj = body as Record<string, unknown>;\n\n if (typeof obj.id !== \"string\") {\n throw new Error(\"Invalid webhook payload: missing 'id'\");\n }\n if (typeof obj.timestamp !== \"string\") {\n throw new Error(\"Invalid webhook payload: missing 'timestamp'\");\n }\n if (typeof obj.type !== \"string\" || !VALID_TYPES.has(obj.type)) {\n throw new Error(`Invalid webhook payload: unknown type '${String(obj.type)}'`);\n }\n if (typeof obj.data !== \"object\" || obj.data === null) {\n throw new Error(\"Invalid webhook payload: missing 'data'\");\n }\n\n return obj as unknown as WebhookEvent;\n}\n","/**\n * IHO S-52 Colour Tables: DAY_BRIGHT, DUSK, and NIGHT.\n * Each token maps to a hex colour string.\n * Source: IHO S-52 Presentation Library, Edition 4.0 – Annex A\n */\n\nexport type ColorTableName = \"DAY\" | \"DUSK\" | \"NIGHT\";\n\n// ── DAY_BRIGHT ────────────────────────────────────────────\nexport const S52_DAY: Record<string, string> = {\n // Depth\n NODTA: \"#a4a4a4\",\n DEPIT: \"#009678\",\n DEPVS: \"#99d6ea\",\n DEPMS: \"#b8e2f1\",\n DEPMD: \"#c4eaf8\",\n DEPDW: \"#dbf3fc\",\n\n // Land / topography\n LANDA: \"#e6d1a1\",\n LANDF: \"#c8b078\",\n CHBRN: \"#ab7948\",\n CHGRF: \"#878787\",\n CHGRD: \"#555555\",\n\n // Chart symbology\n CHBLK: \"#000000\",\n CSTLN: \"#000000\",\n OUTLW: \"#000000\",\n BKAJ1: \"#4d4d4d\",\n\n // Navigation / traffic\n TRFCD: \"#d200d2\",\n TRFCF: \"#e680e6\",\n RESBL: \"#0064b4\",\n APTS1: \"#d200d2\",\n\n // Danger / hazard\n DNGHL: \"#ff0000\",\n ISHDG: \"#cc0000\",\n\n // Lights\n LITRD: \"#ee0000\",\n LITGN: \"#00c800\",\n LITYW: \"#fddc00\",\n LITWT: \"#ffffff\",\n LITBL: \"#0064ff\",\n LITOR: \"#ff8c00\",\n\n // Buoys / marks\n RADHI: \"#68e456\",\n RADLO: \"#3f8a34\",\n PLRTE: \"#dc4025\",\n ARPAT: \"#3fa56f\",\n ISDNG: \"#c545c3\",\n\n // Chart colours\n CHRED: \"#f15469\",\n CHGRN: \"#68e456\",\n CHYLW: \"#f4da48\",\n CHMGD: \"#c545c3\",\n CHMGF: \"#d3a6e9\",\n CHWHT: \"#d4eaee\",\n CHCOR: \"#eb7d36\",\n\n // Soundings\n SNDG1: \"#7d898c\",\n SNDG2: \"#070707\",\n DEPSC: \"#525a5c\",\n DEPCN: \"#7d898c\",\n\n // Utility / infrastructure\n UINFD: \"#070707\",\n UINFF: \"#7d898c\",\n UINFR: \"#f15469\",\n UINFG: \"#68e456\",\n UINFO: \"#eb7d36\",\n UINFB: \"#3a78f0\",\n UINFM: \"#c545c3\",\n UIBCK: \"#d4eaee\",\n UIBDR: \"#7d898c\",\n UIAFD: \"#73b6ef\",\n UIAFF: \"#c9b97a\",\n PIPLN: \"#55aa00\",\n\n // Outlines\n OUTLL: \"#c9b97a\",\n\n // Miscellaneous\n SCLBR: \"#eb7d36\",\n NINFO: \"#eb7d36\",\n ADINF: \"#b29f34\",\n RESGR: \"#7d898c\",\n SHIPS: \"#070707\",\n PSTRK: \"#070707\",\n SYTRK: \"#7d898c\",\n APLRT: \"#eb7d36\",\n CURSR: \"#eb7d36\",\n BKAJ2: \"#232728\",\n RES01: \"#a3b4b7\",\n RES02: \"#a3b4b7\",\n RES03: \"#a3b4b7\",\n};\n\n// ── DUSK ──────────────────────────────────────────────────\n// Reduced brightness (~40-50%) per IHO S-52 Annex A principles.\nexport const S52_DUSK: Record<string, string> = {\n NODTA: \"#6b6b6b\",\n DEPIT: \"#006650\",\n DEPVS: \"#5a8fa0\",\n DEPMS: \"#6a9aad\",\n DEPMD: \"#7ab0c0\",\n DEPDW: \"#7fb5cc\",\n\n LANDA: \"#8a7d5e\",\n LANDF: \"#7a6a48\",\n CHBRN: \"#6e4e30\",\n CHGRF: \"#585858\",\n CHGRD: \"#3a3a3a\",\n\n CHBLK: \"#b0b0b0\",\n CSTLN: \"#b0b0b0\",\n OUTLW: \"#b0b0b0\",\n BKAJ1: \"#707070\",\n\n TRFCD: \"#a000a0\",\n TRFCF: \"#b060b0\",\n RESBL: \"#004a88\",\n APTS1: \"#a000a0\",\n\n DNGHL: \"#cc0000\",\n ISHDG: \"#990000\",\n\n LITRD: \"#bb0000\",\n LITGN: \"#009900\",\n LITYW: \"#c8b000\",\n LITWT: \"#d0d0d0\",\n LITBL: \"#004abb\",\n LITOR: \"#cc7000\",\n\n RADHI: \"#009940\",\n RADLO: \"#2d6330\",\n PLRTE: \"#a03020\",\n ARPAT: \"#306040\",\n ISDNG: \"#903090\",\n\n CHRED: \"#b05060\",\n CHGRN: \"#509040\",\n CHYLW: \"#b0a030\",\n CHMGD: \"#903090\",\n CHMGF: \"#905090\",\n CHWHT: \"#90a0a0\",\n CHCOR: \"#a06030\",\n\n SNDG1: \"#606060\",\n SNDG2: \"#b0b0b0\",\n DEPSC: \"#606060\",\n DEPCN: \"#606060\",\n\n UINFD: \"#b0b0b0\",\n UINFF: \"#606060\",\n UINFR: \"#b05060\",\n UINFG: \"#509040\",\n UINFO: \"#a06030\",\n UINFB: \"#304090\",\n UINFM: \"#903090\",\n UIBCK: \"#1a1a1a\",\n UIBDR: \"#606060\",\n UIAFD: \"#405060\",\n UIAFF: \"#605840\",\n PIPLN: \"#3d7a00\",\n\n OUTLL: \"#605840\",\n\n SCLBR: \"#a06030\",\n NINFO: \"#a06030\",\n ADINF: \"#807020\",\n RESGR: \"#606060\",\n SHIPS: \"#b0b0b0\",\n PSTRK: \"#b0b0b0\",\n SYTRK: \"#606060\",\n APLRT: \"#a06030\",\n CURSR: \"#cc0000\",\n BKAJ2: \"#252525\",\n RES01: \"#606060\",\n RES02: \"#606060\",\n RES03: \"#606060\",\n};\n\n// ── NIGHT ─────────────────────────────────────────────────\n// Dark-adapted palette: dark background, amber/red text,\n// heavily muted fills to preserve scotopic (night) vision.\nexport const S52_NIGHT: Record<string, string> = {\n NODTA: \"#3a3a32\",\n DEPIT: \"#003828\",\n DEPVS: \"#1a3a45\",\n DEPMS: \"#1e4050\",\n DEPMD: \"#1a3848\",\n DEPDW: \"#1a3545\",\n\n LANDA: \"#3a3020\",\n LANDF: \"#302818\",\n CHBRN: \"#382410\",\n CHGRF: \"#2a2a22\",\n CHGRD: \"#1e1e18\",\n\n CHBLK: \"#c8aa78\",\n CSTLN: \"#c8aa78\",\n OUTLW: \"#c8aa78\",\n BKAJ1: \"#504830\",\n\n TRFCD: \"#6e006e\",\n TRFCF: \"#803880\",\n RESBL: \"#002a50\",\n APTS1: \"#6e006e\",\n\n DNGHL: \"#a00000\",\n ISHDG: \"#700000\",\n\n LITRD: \"#880000\",\n LITGN: \"#006600\",\n LITYW: \"#887800\",\n LITWT: \"#a09878\",\n LITBL: \"#003088\",\n LITOR: \"#884800\",\n\n RADHI: \"#005528\",\n RADLO: \"#1a3a20\",\n PLRTE: \"#6e2018\",\n ARPAT: \"#1a3028\",\n ISDNG: \"#481848\",\n\n CHRED: \"#682030\",\n CHGRN: \"#285020\",\n CHYLW: \"#685828\",\n CHMGD: \"#481848\",\n CHMGF: \"#482848\",\n CHWHT: \"#484840\",\n CHCOR: \"#683818\",\n\n SNDG1: \"#383028\",\n SNDG2: \"#c8aa78\",\n DEPSC: \"#383028\",\n DEPCN: \"#383028\",\n\n UINFD: \"#c8aa78\",\n UINFF: \"#383028\",\n UINFR: \"#682030\",\n UINFG: \"#285020\",\n UINFO: \"#683818\",\n UINFB: \"#182848\",\n UINFM: \"#481848\",\n UIBCK: \"#0a0a08\",\n UIBDR: \"#383028\",\n UIAFD: \"#182838\",\n UIAFF: \"#302818\",\n PIPLN: \"#284800\",\n\n OUTLL: \"#302818\",\n\n SCLBR: \"#683818\",\n NINFO: \"#683818\",\n ADINF: \"#483818\",\n RESGR: \"#383028\",\n SHIPS: \"#c8aa78\",\n PSTRK: \"#c8aa78\",\n SYTRK: \"#484030\",\n APLRT: \"#683818\",\n CURSR: \"#a00000\",\n BKAJ2: \"#0a0a08\",\n RES01: \"#383028\",\n RES02: \"#383028\",\n RES03: \"#383028\",\n};\n\n/** Backward-compatible alias – the DAY_BRIGHT table */\nexport const S52_COLORS = S52_DAY;\n\nconst COLOR_TABLES: Record<ColorTableName, Record<string, string>> = {\n DAY: S52_DAY,\n DUSK: S52_DUSK,\n NIGHT: S52_NIGHT,\n};\n\n/** Get a full colour table by name */\nexport function getColorTable(name: ColorTableName): Record<string, string> {\n return COLOR_TABLES[name];\n}\n\n/** Resolve an S-52 colour token to a hex string. Falls back to black/amber. */\nexport function resolveColor(token: string, table: ColorTableName = \"DAY\"): string {\n const t = COLOR_TABLES[table];\n return t[token] ?? (table === \"NIGHT\" ? \"#c8aa78\" : \"#000000\");\n}\n","import type { LookupEntry } from \"./types\";\n\n/**\n * S-52 lookup table covering all S-57 object classes found in NOAA ENCs.\n * Colours reference S-52 tokens (resolved at render time).\n * INT1 references per NOAA Chart No. 1 (Ed 13).\n */\nexport const S52_LOOKUP: Record<string, LookupEntry> = {\n // ── Depths (INT1 Section I) ─────────────────────────────\n DEPARE: {\n objectClass: \"DEPARE\", name: \"Depth Area\", category: \"Depths\",\n displayCategory: \"BASE\", int1Ref: \"I12\",\n style: { type: \"fill\", paint: { \"fill-color\": \"DEPMD\", \"fill-opacity\": 0.7 } },\n hasConditional: true, conditionalAttributes: [\"DRVAL1\", \"DRVAL2\"],\n viewingGroup: 13010, scamin: 0,\n },\n DEPCNT: {\n objectClass: \"DEPCNT\", name: \"Depth Contour\", category: \"Depths\",\n displayCategory: \"STANDARD\", int1Ref: \"I30\",\n style: { type: \"line\", paint: { \"line-color\": \"CHGRD\", \"line-width\": 0.5 } },\n viewingGroup: 13030, scamin: 45000,\n },\n SOUNDG: {\n objectClass: \"SOUNDG\", name: \"Sounding\", category: \"Depths\",\n displayCategory: \"BASE\", int1Ref: \"I10\",\n // Rendered as depth-number text via labels.ts, not as a visible dot.\n style: { type: \"circle\", paint: { \"circle-color\": \"CHBLK\", \"circle-radius\": 0, \"circle-opacity\": 0, \"circle-stroke-width\": 0 } },\n viewingGroup: 13010, scamin: 0,\n auditIgnore: true,\n },\n DRGARE: {\n objectClass: \"DRGARE\", name: \"Dredged Area\", category: \"Depths\",\n displayCategory: \"STANDARD\", int1Ref: \"I20\",\n style: { type: \"fill\", paint: { \"fill-color\": \"DEPMD\", \"fill-opacity\": 0.5 } },\n viewingGroup: 13030, scamin: 45000,\n },\n SWPARE: {\n objectClass: \"SWPARE\", name: \"Swept Area\", category: \"Depths\",\n displayCategory: \"OTHER\", int1Ref: \"I24\",\n style: { type: \"fill\", paint: { \"fill-color\": \"DEPMS\", \"fill-opacity\": 0.35 } },\n viewingGroup: 13050, scamin: 45000,\n },\n\n // ── Land & Shoreline (INT1 Section C) ───────────────────\n LNDARE: {\n objectClass: \"LNDARE\", name: \"Land Area\", category: \"Land\",\n displayCategory: \"BASE\", int1Ref: \"C1\",\n style: { type: \"fill\", paint: { \"fill-color\": \"LANDA\", \"fill-opacity\": 0.9 } },\n viewingGroup: 12010, scamin: 0,\n },\n COALNE: {\n objectClass: \"COALNE\", name: \"Coastline\", category: \"Land\",\n displayCategory: \"BASE\", int1Ref: \"C1\",\n style: { type: \"line\", paint: { \"line-color\": \"CSTLN\", \"line-width\": 0.8 } },\n viewingGroup: 12010, scamin: 0,\n },\n SLCONS: {\n objectClass: \"SLCONS\", name: \"Shoreline Construction\", category: \"Land\",\n displayCategory: \"STANDARD\", int1Ref: \"F1\",\n style: { type: \"line\", paint: { \"line-color\": \"CHBLK\", \"line-width\": 1 } },\n hasConditional: true, conditionalAttributes: [\"WATLEV\"],\n viewingGroup: 12410, scamin: 22000,\n },\n LNDRGN: {\n objectClass: \"LNDRGN\", name: \"Land Region\", category: \"Land\",\n displayCategory: \"OTHER\", int1Ref: \"C20\",\n // Rendered as region NAME label only via labels.ts — no visible shape.\n // scamin raised from 45_000 → 90_000 so place-name labels (Provincetown,\n // Plymouth, Marblehead, …) surface at coastal scale (z10) instead of\n // waiting for z11. NOAA paper charts show major place names at this\n // scale; one-step-down was masking landfall context for mariners.\n style: { type: \"circle\", paint: { \"circle-color\": \"CHBRN\", \"circle-radius\": 0, \"circle-opacity\": 0 } },\n viewingGroup: 12070, scamin: 90000,\n auditIgnore: true,\n },\n SLOGRD: {\n // Sloping ground — beach gradient / sloping terrain at landfall. Subtle\n // LANDA tint so it reads as a beach-context cue without competing with\n // safety-critical layers. Polygon main + Point variant (NOAA encodes 7\n // Point and 8 Polygon SLOGRD features).\n objectClass: \"SLOGRD\", name: \"Sloping Ground\", category: \"Land\",\n displayCategory: \"OTHER\", int1Ref: \"C8\",\n style: { type: \"fill\", paint: { \"fill-color\": \"LANDA\", \"fill-opacity\": 0.3 } },\n viewingGroup: 12070, scamin: 45000,\n },\n BUAARE: {\n objectClass: \"BUAARE\", name: \"Built-up Area\", category: \"Land\",\n displayCategory: \"STANDARD\", int1Ref: \"D1\",\n // scamin dropped (was 45_000 → z11): built-up areas are infrequent at\n // low zooms and the label config's text-size interpolation already keeps\n // them readable. Without this drop, town labels were hidden until z11,\n // one step too aggressive for coastal-scale orientation.\n style: { type: \"fill\", paint: { \"fill-color\": \"CHGRF\", \"fill-opacity\": 0.25 } },\n viewingGroup: 12210, scamin: 0,\n },\n BUISGL: {\n objectClass: \"BUISGL\", name: \"Building\", category: \"Land\",\n displayCategory: \"OTHER\", int1Ref: \"D5\",\n style: { type: \"circle\", paint: { \"circle-color\": \"CHBLK\", \"circle-radius\": 3, \"circle-stroke-width\": 0 } },\n viewingGroup: 12210, scamin: 22000,\n },\n FORSTC: {\n // Fortified structure — coastal fortifications and historic forts. Useful\n // for visual orientation at landfall. Treated like a building footprint\n // (CHBRN fill + darker outline) per S-52 F13 portrayal. NOAA encodes 2\n // Line and 2 Polygon FORSTC features; the Line variant is added in\n // layer-builder.ts following the LNDARE Line pattern.\n objectClass: \"FORSTC\", name: \"Fortified Structure\", category: \"Land\",\n displayCategory: \"OTHER\", int1Ref: \"F13\",\n style: { type: \"fill\", paint: { \"fill-color\": \"CHBRN\", \"fill-opacity\": 0.4 } },\n viewingGroup: 12410, scamin: 22000,\n },\n LAKARE: {\n objectClass: \"LAKARE\", name: \"Lake\", category: \"Land\",\n displayCategory: \"STANDARD\", int1Ref: \"C22\",\n style: { type: \"fill\", paint: { \"fill-color\": \"DEPMD\", \"fill-opacity\": 0.6 } },\n viewingGroup: 12050, scamin: 90000,\n },\n RIVERS: {\n objectClass: \"RIVERS\", name: \"River\", category: \"Land\",\n displayCategory: \"STANDARD\", int1Ref: \"C20\",\n style: { type: \"fill\", paint: { \"fill-color\": \"DEPMD\", \"fill-opacity\": 0.5 } },\n viewingGroup: 12050, scamin: 90000,\n },\n ROADWY: {\n objectClass: \"ROADWY\", name: \"Road\", category: \"Land\",\n displayCategory: \"OTHER\", int1Ref: \"D10\",\n style: { type: \"line\", paint: { \"line-color\": \"CHGRF\", \"line-width\": 1 } },\n viewingGroup: 12250, scamin: 22000,\n },\n RAILWY: {\n objectClass: \"RAILWY\", name: \"Railway\", category: \"Land\",\n displayCategory: \"OTHER\", int1Ref: \"D13\",\n style: { type: \"line\", paint: { \"line-color\": \"CHBLK\", \"line-width\": 0.8, \"line-dasharray\": [4, 2] } },\n viewingGroup: 12250, scamin: 22000,\n },\n CANALS: {\n objectClass: \"CANALS\", name: \"Canal\", category: \"Land\",\n displayCategory: \"OTHER\", int1Ref: \"C21\",\n style: { type: \"line\", paint: { \"line-color\": \"DEPMS\", \"line-width\": 1 } },\n viewingGroup: 12050, scamin: 45000,\n },\n TUNNEL: {\n objectClass: \"TUNNEL\", name: \"Tunnel\", category: \"Infrastructure\",\n displayCategory: \"OTHER\", int1Ref: \"D15\",\n style: { type: \"line\", paint: { \"line-color\": \"CHGRD\", \"line-width\": 1, \"line-dasharray\": [2, 2] } },\n viewingGroup: 12250, scamin: 22000,\n },\n\n // ── Navigation Aids — Buoys (INT1 Section Q) ────────────\n BOYLAT: {\n objectClass: \"BOYLAT\", name: \"Buoy, Lateral (Can/Nun)\", category: \"Navigation Aids\",\n displayCategory: \"STANDARD\", int1Ref: \"Q130.1\",\n style: { type: \"symbol\", paint: {}, layout: { \"icon-size\": 0.7, \"icon-allow-overlap\": true }, iconImage: \"BOYCAN01\" },\n hasConditional: true, conditionalAttributes: [\"CATLAM\", \"COLOUR\"],\n viewingGroup: 27010, scamin: 22000,\n },\n BOYSPP: {\n objectClass: \"BOYSPP\", name: \"Buoy, Special Purpose\", category: \"Navigation Aids\",\n displayCategory: \"STANDARD\", int1Ref: \"Q130.6\",\n style: { type: \"symbol\", paint: {}, layout: { \"icon-size\": 0.7, \"icon-allow-overlap\": true }, iconImage: \"BOYSPP11\" },\n viewingGroup: 27010, scamin: 22000,\n },\n BOYCAR: {\n objectClass: \"BOYCAR\", name: \"Buoy, Cardinal\", category: \"Navigation Aids\",\n displayCategory: \"STANDARD\", int1Ref: \"Q130.3\",\n style: { type: \"symbol\", paint: {}, layout: { \"icon-size\": 0.7, \"icon-allow-overlap\": true }, iconImage: \"BOYCAR01\" },\n hasConditional: true, conditionalAttributes: [\"CATCAM\"],\n viewingGroup: 27010, scamin: 22000,\n },\n BOYISD: {\n objectClass: \"BOYISD\", name: \"Buoy, Isolated Danger\", category: \"Navigation Aids\",\n displayCategory: \"STANDARD\", int1Ref: \"Q130.4\",\n style: { type: \"symbol\", paint: {}, layout: { \"icon-size\": 0.7, \"icon-allow-overlap\": true }, iconImage: \"BOYISD12\" },\n viewingGroup: 27010, scamin: 22000,\n },\n BOYSAW: {\n objectClass: \"BOYSAW\", name: \"Buoy, Safe Water\", category: \"Navigation Aids\",\n displayCategory: \"STANDARD\", int1Ref: \"Q130.5\",\n style: { type: \"symbol\", paint: {}, layout: { \"icon-size\": 0.7, \"icon-allow-overlap\": true }, iconImage: \"BOYSAW12\" },\n viewingGroup: 27010, scamin: 22000,\n },\n BOYINB: {\n objectClass: \"BOYINB\", name: \"Buoy, Installation\", category: \"Navigation Aids\",\n displayCategory: \"OTHER\", int1Ref: \"Q130.6\",\n style: { type: \"symbol\", paint: {}, layout: { \"icon-size\": 0.7, \"icon-allow-overlap\": true }, iconImage: \"BOYSPP11\" },\n viewingGroup: 27010, scamin: 22000,\n },\n\n // ── Navigation Aids — Beacons (INT1 Section Q) ──────────\n BCNLAT: {\n objectClass: \"BCNLAT\", name: \"Beacon, Lateral\", category: \"Navigation Aids\",\n displayCategory: \"STANDARD\", int1Ref: \"Q100\",\n style: { type: \"symbol\", paint: {}, layout: { \"icon-size\": 0.6, \"icon-allow-overlap\": true }, iconImage: \"BCNLAT15\" },\n hasConditional: true, conditionalAttributes: [\"CATLAM\", \"COLOUR\"],\n viewingGroup: 27010, scamin: 22000,\n },\n BCNSPP: {\n objectClass: \"BCNSPP\", name: \"Beacon, Special Purpose\", category: \"Navigation Aids\",\n displayCategory: \"STANDARD\", int1Ref: \"Q110\",\n style: { type: \"symbol\", paint: {}, layout: { \"icon-size\": 0.6, \"icon-allow-overlap\": true }, iconImage: \"BCNSPP13\" },\n viewingGroup: 27010, scamin: 22000,\n },\n BCNCAR: {\n objectClass: \"BCNCAR\", name: \"Beacon, Cardinal\", category: \"Navigation Aids\",\n displayCategory: \"STANDARD\", int1Ref: \"Q110\",\n style: { type: \"symbol\", paint: {}, layout: { \"icon-size\": 0.6, \"icon-allow-overlap\": true }, iconImage: \"BCNCAR01\" },\n hasConditional: true, conditionalAttributes: [\"CATCAM\"],\n viewingGroup: 27010, scamin: 22000,\n },\n BCNISD: {\n objectClass: \"BCNISD\", name: \"Beacon, Isolated Danger\", category: \"Navigation Aids\",\n displayCategory: \"STANDARD\", int1Ref: \"Q110\",\n style: { type: \"symbol\", paint: {}, layout: { \"icon-size\": 0.6, \"icon-allow-overlap\": true }, iconImage: \"BCNISD21\" },\n viewingGroup: 27010, scamin: 22000,\n },\n BCNSAW: {\n objectClass: \"BCNSAW\", name: \"Beacon, Safe Water\", category: \"Navigation Aids\",\n displayCategory: \"STANDARD\", int1Ref: \"Q110\",\n style: { type: \"symbol\", paint: {}, layout: { \"icon-size\": 0.6, \"icon-allow-overlap\": true }, iconImage: \"BCNSAW13\" },\n viewingGroup: 27010, scamin: 22000,\n },\n\n // ── Navigation Aids — Lights (INT1 Section P) ───────────\n LIGHTS: {\n objectClass: \"LIGHTS\", name: \"Light\", category: \"Navigation Aids\",\n displayCategory: \"STANDARD\", int1Ref: \"P1\",\n style: { type: \"symbol\", paint: {}, layout: { \"icon-size\": 0.7, \"icon-allow-overlap\": true }, iconImage: \"LIGHTS11\" },\n hasConditional: true, conditionalAttributes: [\"COLOUR\"],\n viewingGroup: 27070, scamin: 22000,\n },\n\n // ── Navigation Aids — Other (INT1 Sections Q, R, S) ─────\n DAYMAR: {\n objectClass: \"DAYMAR\", name: \"Daymark\", category: \"Navigation Aids\",\n displayCategory: \"OTHER\", int1Ref: \"Q100\",\n style: { type: \"symbol\", paint: {}, layout: { \"icon-size\": 0.6, \"icon-allow-overlap\": true }, iconImage: \"DAYTRI01\" },\n hasConditional: true, conditionalAttributes: [\"TOPSHP\", \"COLOUR\"],\n viewingGroup: 27010, scamin: 22000,\n },\n FOGSIG: {\n objectClass: \"FOGSIG\", name: \"Fog Signal\", category: \"Navigation Aids\",\n displayCategory: \"OTHER\", int1Ref: \"R1\",\n style: { type: \"symbol\", paint: {}, layout: { \"icon-size\": 0.6, \"icon-allow-overlap\": true }, iconImage: \"FOGSIG01\" },\n viewingGroup: 27080, scamin: 22000,\n },\n PILPNT: {\n objectClass: \"PILPNT\", name: \"Pile / Post\", category: \"Navigation Aids\",\n displayCategory: \"OTHER\", int1Ref: \"Q80\",\n style: { type: \"symbol\", paint: {}, layout: { \"icon-size\": 0.5, \"icon-allow-overlap\": true }, iconImage: \"PILPNT02\" },\n viewingGroup: 27010, scamin: 22000,\n },\n RTPBCN: {\n objectClass: \"RTPBCN\", name: \"Radar Transponder Beacon\", category: \"Navigation Aids\",\n displayCategory: \"OTHER\", int1Ref: \"S1\",\n style: { type: \"symbol\", paint: {}, layout: { \"icon-size\": 0.6, \"icon-allow-overlap\": true }, iconImage: \"RTPBCN02\" },\n viewingGroup: 27080, scamin: 22000,\n },\n NAVLNE: {\n objectClass: \"NAVLNE\", name: \"Navigation Line\", category: \"Navigation Aids\",\n displayCategory: \"STANDARD\", int1Ref: \"M1\",\n style: { type: \"line\", paint: { \"line-color\": \"TRFCD\", \"line-width\": 1, \"line-dasharray\": [6, 3] } },\n viewingGroup: 25020, scamin: 90000,\n },\n LNDELV: {\n objectClass: \"LNDELV\", name: \"Land Elevation\", category: \"Land\",\n displayCategory: \"OTHER\", int1Ref: \"C10\",\n style: { type: \"line\", paint: { \"line-color\": \"CHBRN\", \"line-width\": 0.5 } },\n viewingGroup: 12070, scamin: 22000,\n },\n\n // ── Hazards (INT1 Section K) ────────────────────────────\n OBSTRN: {\n objectClass: \"OBSTRN\", name: \"Obstruction\", category: \"Hazards\",\n displayCategory: \"STANDARD\", int1Ref: \"K40\",\n // Step expression hides rocks below zoom 12 (where dense coastal fields render\n // as solid black masses), then scales linearly through harbor-approach zooms.\n // Aligns with typical NOAA ENC SCAMIN of 22000 (≈ zoom 12) for these features.\n style: { type: \"symbol\", paint: {}, layout: { \"icon-size\": [\"interpolate\", [\"linear\"], [\"zoom\"], 11.99, 0, 12, 0.3, 14, 0.5, 16, 0.7], \"icon-allow-overlap\": true }, iconImage: \"OBSTRN01\" },\n hasConditional: true, conditionalAttributes: [\"WATLEV\", \"VALSOU\"],\n viewingGroup: 24020, scamin: 0,\n },\n UWTROC: {\n objectClass: \"UWTROC\", name: \"Underwater Rock\", category: \"Hazards\",\n displayCategory: \"STANDARD\", int1Ref: \"K12\",\n style: { type: \"symbol\", paint: {}, layout: { \"icon-size\": [\"interpolate\", [\"linear\"], [\"zoom\"], 11.99, 0, 12, 0.3, 14, 0.5, 16, 0.7], \"icon-allow-overlap\": true }, iconImage: \"UWTROC03\" },\n hasConditional: true, conditionalAttributes: [\"WATLEV\", \"VALSOU\"],\n viewingGroup: 24020, scamin: 0,\n },\n WRECKS: {\n objectClass: \"WRECKS\", name: \"Wreck\", category: \"Hazards\",\n displayCategory: \"STANDARD\", int1Ref: \"K24\",\n style: { type: \"symbol\", paint: {}, layout: { \"icon-size\": 0.7, \"icon-allow-overlap\": true }, iconImage: \"WRECKS04\" },\n hasConditional: true, conditionalAttributes: [\"CATWRK\", \"WATLEV\", \"VALSOU\"],\n viewingGroup: 24020, scamin: 0,\n },\n WATTUR: {\n // Water turbulence (tide rips, eddies, overfalls, breakers, bombora) per\n // S-52 PresLib H44. Safety-relevant for small craft — these features can\n // swamp a boat that didn't expect them. NOAA paper-chart convention is a\n // small wavy-line cluster with the abbreviation noted in the label\n // (`Br` for breakers, `Eddies`, `Overfalls`, `Tide rips`).\n //\n // Symbol layer drives the dominant Point geometry; the Polygon variant is\n // emitted from layer-builder via the same multi-geom pattern as PR #388.\n objectClass: \"WATTUR\", name: \"Water Turbulence\", category: \"Hazards\",\n displayCategory: \"STANDARD\", int1Ref: \"H44\",\n style: { type: \"symbol\", paint: {}, layout: { \"icon-size\": 0.7, \"icon-allow-overlap\": true }, iconImage: \"WATTUR01\" },\n hasConditional: true, conditionalAttributes: [\"CATWAT\"],\n viewingGroup: 24020, scamin: 22000,\n },\n FSHFAC: {\n // Fishing facility — weirs, stake fences, fish traps. Small-craft hazard,\n // so safety-critical viewing group 24020 (matches OBSTRN/UWTROC/WRECKS).\n // Subtle water-feature tint (DEPVS @0.25) + Point variant for stake-fence\n // markers. NOAA encodes 1 Point and 3 Polygon FSHFAC features.\n objectClass: \"FSHFAC\", name: \"Fishing Facility\", category: \"Hazards\",\n displayCategory: \"STANDARD\", int1Ref: \"K44\",\n style: { type: \"fill\", paint: { \"fill-color\": \"DEPVS\", \"fill-opacity\": 0.25 } },\n hasConditional: true, conditionalAttributes: [\"CATFIF\"],\n viewingGroup: 24020, scamin: 22000,\n },\n SBDARE: {\n objectClass: \"SBDARE\", name: \"Seabed Area\", category: \"Depths\",\n displayCategory: \"OTHER\", int1Ref: \"J1\",\n style: { type: \"fill\", paint: { \"fill-color\": \"CHGRF\", \"fill-opacity\": 0.15 } },\n viewingGroup: 14010, scamin: 22000,\n },\n WEDKLP: {\n // Translucent green fill suggests kelp/vegetation; Point variant (the\n // dominant geometry — 85 of 88 features) is emitted by layer-builder as\n // a circle, mirroring the LNDARE Point precedent from PR #388.\n objectClass: \"WEDKLP\", name: \"Weed / Kelp\", category: \"Land\",\n displayCategory: \"STANDARD\", int1Ref: \"K43\",\n style: { type: \"fill\", paint: { \"fill-color\": \"CHGRN\", \"fill-opacity\": 0.35 } },\n hasConditional: true, conditionalAttributes: [\"CATWED\", \"WATLEV\"],\n viewingGroup: 14010, scamin: 22000,\n },\n\n // ── Regulated Areas (INT1 Section N) ────────────────────\n ACHARE: {\n // Anchorages are conventionally rendered as a subtle filled region in\n // S-52 with an anchor symbol at centroid and a dashed magenta boundary\n // (PresLib N12, NOAA Chart No. 1 §N). The fill stays low-opacity so\n // multiple overlapping anchorages can't compound into a flood — see\n // comments on CTNARE / RESARE below — but 0.04 left the area effectively\n // invisible. 0.10 produces a faint NOAA-style tint that still reads\n // against a busy harbor without stacking into purple wash; the dashed\n // magenta boundary and centroid anchor icon are emitted as companion\n // layers in layer-builder.ts so the \"anchorage here\" cue is unambiguous.\n objectClass: \"ACHARE\", name: \"Anchorage Area\", category: \"Regulated Areas\",\n displayCategory: \"STANDARD\", int1Ref: \"N12\",\n style: { type: \"fill\", paint: { \"fill-color\": \"TRFCD\", \"fill-opacity\": 0.10 } },\n viewingGroup: 26010, scamin: 90000,\n },\n RESARE: {\n // S-52 spec: restricted areas render as a solid magenta boundary line\n // (often with T-marks pointing inward). The previous flood-fill at\n // opacity 0.12 was a major source of the Boston Harbor purple wash —\n // Logan Airport's aircraft-vicinity restricted zones are RESARE\n // polygons that overlap the security-zone CTNARE polygons; with both\n // as flood fills, the harbor inner waters disappeared under stacked\n // magenta. Same boundary-only treatment as CTNARE.\n objectClass: \"RESARE\", name: \"Restricted Area\", category: \"Regulated Areas\",\n displayCategory: \"STANDARD\", int1Ref: \"N2\",\n style: {\n type: \"line\",\n paint: {\n \"line-color\": \"TRFCD\",\n \"line-width\": 1.2,\n \"line-opacity\": 0.7,\n },\n },\n viewingGroup: 26040, scamin: 90000,\n },\n CTNARE: {\n // S-52 IHO INT1 N30 spec: caution areas render as a magenta dashed\n // boundary + centroid \"!\" symbol — NOT a flood fill. Our previous\n // `type: \"fill\"` with `fill-opacity: 0.08` looked harmless in\n // isolation but Boston-area Harbor cells have many overlapping CTNARE\n // features (Logan Airport security zones, harbor traffic regulated\n // areas, etc.). Each at 8% stacks: 5+ overlapping features → a 35%+\n // magenta wash that obliterates the underlying depth shading.\n //\n // Boundary-only (line) is the correct S-52 portrayal and removes the\n // stacking-flood-fill problem entirely. Hit-testing for the polygon\n // interior is lost — if we want it back, add a separate invisible\n // fill layer with `fill-opacity: 0`. Not worth the cost yet.\n objectClass: \"CTNARE\", name: \"Caution Area\", category: \"Regulated Areas\",\n displayCategory: \"STANDARD\", int1Ref: \"N30\",\n style: {\n type: \"line\",\n paint: {\n \"line-color\": \"TRFCD\",\n \"line-width\": 1.2,\n \"line-dasharray\": [4, 3],\n \"line-opacity\": 0.7,\n },\n },\n viewingGroup: 26050, scamin: 90000,\n },\n FAIRWY: {\n // Fairways stay as a subtle fill (S-52 convention: very low-opacity\n // tint so ships can see the bounds of the navigable channel without\n // obscuring soundings). Reduced from 0.06 → 0.03 to limit stacking.\n // Long-term: fairway color should arguably be a neutral grey rather\n // than TRFCD magenta — separate followup.\n objectClass: \"FAIRWY\", name: \"Fairway\", category: \"Regulated Areas\",\n displayCategory: \"STANDARD\", int1Ref: \"M18\",\n style: { type: \"fill\", paint: { \"fill-color\": \"TRFCD\", \"fill-opacity\": 0.03 } },\n viewingGroup: 25020, scamin: 90000,\n },\n DMPGRD: {\n objectClass: \"DMPGRD\", name: \"Dumping Ground\", category: \"Regulated Areas\",\n displayCategory: \"OTHER\", int1Ref: \"N23\",\n style: { type: \"fill\", paint: { \"fill-color\": \"LITYW\", \"fill-opacity\": 0.15 } },\n viewingGroup: 26230, scamin: 22000,\n },\n TSSLPT: {\n // Traffic separation lane. Light fill so the directional arrows (rendered\n // separately) read against it; reduced from 0.08 → 0.04 to avoid stacking\n // with adjacent TSSLPT/TSSRON polygons.\n objectClass: \"TSSLPT\", name: \"TSS Lane Part\", category: \"Regulated Areas\",\n displayCategory: \"STANDARD\", int1Ref: \"M25\",\n style: { type: \"fill\", paint: { \"fill-color\": \"TRFCD\", \"fill-opacity\": 0.04 } },\n viewingGroup: 25010, scamin: 90000,\n },\n TSSRON: {\n objectClass: \"TSSRON\", name: \"TSS Roundabout\", category: \"Regulated Areas\",\n displayCategory: \"STANDARD\", int1Ref: \"M26\",\n style: { type: \"fill\", paint: { \"fill-color\": \"TRFCD\", \"fill-opacity\": 0.04 } },\n viewingGroup: 25010, scamin: 90000,\n },\n TSSBND: {\n objectClass: \"TSSBND\", name: \"TSS Boundary\", category: \"Regulated Areas\",\n displayCategory: \"STANDARD\", int1Ref: \"M25\",\n style: { type: \"line\", paint: { \"line-color\": \"TRFCD\", \"line-width\": 1, \"line-dasharray\": [8, 4] } },\n viewingGroup: 25010, scamin: 90000,\n },\n TESARE: {\n // S-52 spec: territorial sea boundaries render as a magenta dashed\n // line (not a fill). Same reasoning as CTNARE/RESARE — even at 0.04\n // opacity, multiple territorial-sea lobes can stack.\n objectClass: \"TESARE\", name: \"Territorial Sea Area\", category: \"Regulated Areas\",\n displayCategory: \"OTHER\", int1Ref: \"N40\",\n style: {\n type: \"line\",\n paint: {\n \"line-color\": \"TRFCD\",\n \"line-width\": 1,\n \"line-dasharray\": [6, 4],\n \"line-opacity\": 0.6,\n },\n },\n viewingGroup: 26050, scamin: 90000,\n },\n MIPARE: {\n // S-52 spec: military practice area renders as a magenta dashed\n // boundary + centroid symbol — boundary-only here, matches CTNARE.\n objectClass: \"MIPARE\", name: \"Military Practice Area\", category: \"Regulated Areas\",\n displayCategory: \"OTHER\", int1Ref: \"N30\",\n style: {\n type: \"line\",\n paint: {\n \"line-color\": \"TRFCD\",\n \"line-width\": 1.2,\n \"line-dasharray\": [4, 3],\n \"line-opacity\": 0.7,\n },\n },\n viewingGroup: 26050, scamin: 90000,\n },\n\n // ── Infrastructure (INT1 Sections D, F, L) ──────────────\n BRIDGE: {\n objectClass: \"BRIDGE\", name: \"Bridge\", category: \"Infrastructure\",\n displayCategory: \"STANDARD\", int1Ref: \"D20\",\n style: { type: \"line\", paint: { \"line-color\": \"CHGRD\", \"line-width\": 2 } },\n viewingGroup: 12210, scamin: 22000,\n hasConditional: true, conditionalAttributes: [\"CATBRG\", \"VERCLR\"],\n },\n PYLONS: {\n objectClass: \"PYLONS\", name: \"Pylon / Bridge Support\", category: \"Infrastructure\",\n displayCategory: \"STANDARD\", int1Ref: \"D27\",\n // Default fill style — layer-builder emits the Point variant via the\n // same multi-geom pattern from PR #388 (LNDARE Point fix).\n style: { type: \"fill\", paint: { \"fill-color\": \"CHBRN\", \"fill-opacity\": 0.5 } },\n hasConditional: true, conditionalAttributes: [\"CATPYL\", \"VERLEN\"],\n viewingGroup: 12410, scamin: 22000,\n },\n // Submarine cable — S-52 INT1 L30 portrayal: thin dashed CHMGD line.\n // Matches NOAA ENC Online's portrayal — a clean continuous dashed line,\n // no periodic pictogram overlays (those proved visually noisy at z14+ when\n // many parallel cables run in a corridor). Previous TRFCD colour was wrong:\n // submarine cables are charted in CHMGD per S-52.\n // scamin 90_000 (→ z10) matches the regulated-area family (CTNARE, FAIRWY,\n // RESARE, PRDARE) so cables appear at Approach scale alongside the other\n // navigation hazards mariners route around. Previous 22_000 (→ z12) hid\n // them at Approach band even though the data is in tiles from z7.\n CBLSUB: {\n objectClass: \"CBLSUB\", name: \"Submarine Cable\", category: \"Infrastructure\",\n displayCategory: \"STANDARD\", int1Ref: \"L30\",\n style: { type: \"line\", paint: { \"line-color\": \"CHMGD\", \"line-width\": 0.8, \"line-dasharray\": [6, 3] } },\n hasConditional: true, conditionalAttributes: [\"CATCBL\", \"STATUS\"],\n viewingGroup: 24090, scamin: 90000,\n },\n CBLARE: {\n objectClass: \"CBLARE\", name: \"Cable Area\", category: \"Regulated Areas\",\n displayCategory: \"STANDARD\", int1Ref: \"L32\",\n // S-52 PresLib L32: dashed magenta boundary + diagonal hatching pattern.\n // The CHMGD fill is a low-opacity wash under the pattern; layer-builder\n // emits a dashed CHMGD boundary line for the polygon edge (see\n // REGULATED_AREA_BOUNDARY_LAYERS).\n style: { type: \"fill\", paint: { \"fill-color\": \"CHMGD\", \"fill-opacity\": 0.08, \"fill-pattern\": \"CBLARE01\" } },\n hasConditional: true, conditionalAttributes: [\"CATCBL\", \"STATUS\"],\n viewingGroup: 26010, scamin: 90000,\n },\n // Submarine pipeline — S-52 INT1 L40 portrayal: thin dashed PIPLN line.\n // Same family as CBLSUB but PIPLN-coloured. Clean continuous dashed line\n // without periodic pictograms — matches NOAA portrayal.\n PIPSOL: {\n objectClass: \"PIPSOL\", name: \"Submarine Pipeline\", category: \"Infrastructure\",\n displayCategory: \"STANDARD\", int1Ref: \"L40\",\n style: { type: \"line\", paint: { \"line-color\": \"PIPLN\", \"line-width\": 0.8, \"line-dasharray\": [6, 3] } },\n hasConditional: true, conditionalAttributes: [\"CATPIP\", \"STATUS\"],\n viewingGroup: 24090, scamin: 90000,\n },\n // Overhead pipeline — S-52 INT1 L41 portrayal: solid thin PIPLN line.\n // VERCLR clearance label rendered along the line via labels.ts.\n // Previously absent from the lookup entirely — the 2 NOAA LineString\n // features were silently dropped.\n PIPOHD: {\n objectClass: \"PIPOHD\", name: \"Overhead Pipeline\", category: \"Infrastructure\",\n displayCategory: \"STANDARD\", int1Ref: \"L41\",\n style: { type: \"line\", paint: { \"line-color\": \"PIPLN\", \"line-width\": 1.0 } },\n hasConditional: true, conditionalAttributes: [\"CATPIP\", \"VERCLR\", \"STATUS\"],\n viewingGroup: 24070, scamin: 90000,\n },\n PIPARE: {\n objectClass: \"PIPARE\", name: \"Pipeline Area\", category: \"Regulated Areas\",\n displayCategory: \"STANDARD\", int1Ref: \"L42\",\n // S-52 PresLib L42: dashed pipeline-colour boundary + diagonal hatching.\n // PIPLN wash under the pattern; layer-builder emits the dashed boundary.\n style: { type: \"fill\", paint: { \"fill-color\": \"PIPLN\", \"fill-opacity\": 0.08, \"fill-pattern\": \"PIPARE01\" } },\n hasConditional: true, conditionalAttributes: [\"CATPIP\", \"STATUS\"],\n viewingGroup: 26010, scamin: 90000,\n },\n MORFAC: {\n objectClass: \"MORFAC\", name: \"Mooring Facility\", category: \"Infrastructure\",\n displayCategory: \"STANDARD\", int1Ref: \"Q40\",\n style: { type: \"symbol\", paint: {}, layout: { \"icon-size\": 0.6, \"icon-allow-overlap\": true }, iconImage: \"MORFAC04\" },\n viewingGroup: 12410, scamin: 22000,\n },\n PONTON: {\n objectClass: \"PONTON\", name: \"Pontoon\", category: \"Infrastructure\",\n displayCategory: \"STANDARD\", int1Ref: \"F16\",\n style: { type: \"fill\", paint: { \"fill-color\": \"CHGRF\", \"fill-opacity\": 0.5 } },\n viewingGroup: 12410, scamin: 22000,\n },\n HRBFAC: {\n objectClass: \"HRBFAC\", name: \"Harbour Facility\", category: \"Infrastructure\",\n displayCategory: \"OTHER\", int1Ref: \"F10\",\n style: { type: \"circle\", paint: { \"circle-color\": \"TRFCD\", \"circle-radius\": 4, \"circle-stroke-color\": \"CHBLK\", \"circle-stroke-width\": 0.5 } },\n viewingGroup: 12410, scamin: 22000,\n },\n OFSPLF: {\n objectClass: \"OFSPLF\", name: \"Offshore Platform\", category: \"Infrastructure\",\n displayCategory: \"STANDARD\", int1Ref: \"L10\",\n style: { type: \"symbol\", paint: {}, layout: { \"icon-size\": 0.6, \"icon-allow-overlap\": true }, iconImage: \"OFSPLF01\" },\n viewingGroup: 12410, scamin: 22000,\n },\n HULKES: {\n objectClass: \"HULKES\", name: \"Hulk\", category: \"Infrastructure\",\n displayCategory: \"OTHER\", int1Ref: \"F34\",\n style: { type: \"fill\", paint: { \"fill-color\": \"CHGRD\", \"fill-opacity\": 0.4 } },\n viewingGroup: 12410, scamin: 22000,\n },\n DRYDOC: {\n objectClass: \"DRYDOC\", name: \"Dry Dock\", category: \"Infrastructure\",\n displayCategory: \"OTHER\", int1Ref: \"F25\",\n style: { type: \"fill\", paint: { \"fill-color\": \"CHGRF\", \"fill-opacity\": 0.4 } },\n viewingGroup: 12410, scamin: 22000,\n },\n FLODOC: {\n objectClass: \"FLODOC\", name: \"Floating Dock\", category: \"Infrastructure\",\n displayCategory: \"OTHER\", int1Ref: \"F26\",\n style: { type: \"fill\", paint: { \"fill-color\": \"CHGRF\", \"fill-opacity\": 0.35 } },\n viewingGroup: 12410, scamin: 22000,\n },\n GATCON: {\n objectClass: \"GATCON\", name: \"Gate\", category: \"Infrastructure\",\n displayCategory: \"OTHER\", int1Ref: \"F44\",\n style: { type: \"line\", paint: { \"line-color\": \"CHBLK\", \"line-width\": 1.5 } },\n viewingGroup: 12410, scamin: 22000,\n },\n SILTNK: {\n objectClass: \"SILTNK\", name: \"Silo / Tank\", category: \"Land\",\n displayCategory: \"OTHER\", int1Ref: \"E33\",\n style: { type: \"symbol\", paint: {}, layout: { \"icon-size\": 0.6, \"icon-allow-overlap\": true }, iconImage: \"TNKCON02\" },\n hasConditional: true, conditionalAttributes: [\"CATSIL\", \"CONVIS\"],\n viewingGroup: 12210, scamin: 22000,\n },\n LNDMRK: {\n objectClass: \"LNDMRK\", name: \"Landmark\", category: \"Land\",\n displayCategory: \"OTHER\", int1Ref: \"E20\",\n style: { type: \"symbol\", paint: {}, layout: { \"icon-size\": 0.6, \"icon-allow-overlap\": true }, iconImage: \"BCNTOW01\" },\n hasConditional: true, conditionalAttributes: [\"CATLMK\"],\n viewingGroup: 12210, scamin: 22000,\n },\n\n // ── Topmarks (INT1 Section Q) ───────────────────────────\n TOPMAR: {\n objectClass: \"TOPMAR\", name: \"Topmark\", category: \"Navigation Aids\",\n displayCategory: \"OTHER\", int1Ref: \"Q130\",\n style: { type: \"symbol\", paint: {}, layout: { \"icon-size\": 0.5, \"icon-allow-overlap\": true }, iconImage: \"TOPMAR02\" },\n hasConditional: true, conditionalAttributes: [\"TOPSHP\"],\n viewingGroup: 27010, scamin: 22000,\n },\n\n // ── Light Vessels and Floats ────────────────────────────\n LITVES: {\n objectClass: \"LITVES\", name: \"Light Vessel\", category: \"Navigation Aids\",\n displayCategory: \"STANDARD\", int1Ref: \"P6\",\n style: { type: \"symbol\", paint: {}, layout: { \"icon-size\": 0.7, \"icon-allow-overlap\": true }, iconImage: \"LIGHTS82\" },\n viewingGroup: 27070, scamin: 22000,\n },\n LITFLT: {\n objectClass: \"LITFLT\", name: \"Light Float\", category: \"Navigation Aids\",\n displayCategory: \"STANDARD\", int1Ref: \"P5\",\n style: { type: \"symbol\", paint: {}, layout: { \"icon-size\": 0.7, \"icon-allow-overlap\": true }, iconImage: \"LIGHTS82\" },\n viewingGroup: 27070, scamin: 22000,\n },\n\n // ── Services (INT1 Section T) ───────────────────────────\n SISTAT: {\n objectClass: \"SISTAT\", name: \"Signal Station\", category: \"Infrastructure\",\n displayCategory: \"OTHER\", int1Ref: \"T20\",\n style: { type: \"symbol\", paint: {}, layout: { \"icon-size\": 0.6, \"icon-allow-overlap\": true }, iconImage: \"SISTAT02\" },\n viewingGroup: 27080, scamin: 22000,\n },\n PILBOP: {\n objectClass: \"PILBOP\", name: \"Pilot Boarding Place\", category: \"Infrastructure\",\n displayCategory: \"STANDARD\", int1Ref: \"T1.1\",\n style: { type: \"symbol\", paint: {}, layout: { \"icon-size\": 0.6, \"icon-allow-overlap\": true }, iconImage: \"PILBOP02\" },\n viewingGroup: 27080, scamin: 22000,\n },\n CRANES: {\n objectClass: \"CRANES\", name: \"Crane\", category: \"Infrastructure\",\n displayCategory: \"OTHER\", int1Ref: \"F53\",\n style: { type: \"symbol\", paint: {}, layout: { \"icon-size\": 0.6, \"icon-allow-overlap\": true }, iconImage: \"CRANES01\" },\n viewingGroup: 12410, scamin: 22000,\n },\n RDOSTA: {\n objectClass: \"RDOSTA\", name: \"Radio Station\", category: \"Navigation Aids\",\n displayCategory: \"OTHER\", int1Ref: \"S10\",\n style: { type: \"symbol\", paint: {}, layout: { \"icon-size\": 0.6, \"icon-allow-overlap\": true }, iconImage: \"RTPBCN02\" },\n viewingGroup: 27080, scamin: 22000,\n },\n DISMAR: {\n objectClass: \"DISMAR\", name: \"Distance Mark\", category: \"Navigation Aids\",\n displayCategory: \"OTHER\", int1Ref: \"B25\",\n style: { type: \"circle\", paint: { \"circle-color\": \"CHBLK\", \"circle-radius\": 3, \"circle-stroke-width\": 0 } },\n viewingGroup: 27010, scamin: 22000,\n },\n SMCFAC: {\n objectClass: \"SMCFAC\", name: \"Small Craft Facility\", category: \"Infrastructure\",\n displayCategory: \"OTHER\", int1Ref: \"U1\",\n style: { type: \"circle\", paint: { \"circle-color\": \"TRFCD\", \"circle-radius\": 4, \"circle-stroke-color\": \"CHBLK\", \"circle-stroke-width\": 0.5 } },\n viewingGroup: 12410, scamin: 22000,\n },\n\n // ── Overhead & Underground (INT1 Section L) ─────────────\n // Overhead cable — S-52 INT1 L31 portrayal: solid thin magenta line\n // (not dashed) because overhead cables are an in-air navigation hazard\n // (mast clearance), not a submerged one. The VERCLR clearance label is\n // emitted along the line via labels.ts. Previous CHBLK + dash pattern\n // was wrong.\n CBLOHD: {\n objectClass: \"CBLOHD\", name: \"Overhead Cable\", category: \"Infrastructure\",\n displayCategory: \"STANDARD\", int1Ref: \"L31\",\n style: { type: \"line\", paint: { \"line-color\": \"CHMGD\", \"line-width\": 1.0 } },\n hasConditional: true, conditionalAttributes: [\"CATCBL\", \"VERCLR\", \"STATUS\"],\n viewingGroup: 24070, scamin: 90000,\n },\n\n // ── Routes (INT1 Section M) ─────────────────────────────\n FERYRT: {\n objectClass: \"FERYRT\", name: \"Ferry Route\", category: \"Regulated Areas\",\n displayCategory: \"STANDARD\", int1Ref: \"M50\",\n style: { type: \"line\", paint: { \"line-color\": \"TRFCD\", \"line-width\": 1, \"line-dasharray\": [6, 3] } },\n viewingGroup: 25020, scamin: 90000,\n },\n RECTRC: {\n objectClass: \"RECTRC\", name: \"Recommended Track\", category: \"Regulated Areas\",\n displayCategory: \"STANDARD\", int1Ref: \"M5\",\n style: { type: \"line\", paint: { \"line-color\": \"TRFCD\", \"line-width\": 1.5, \"line-dasharray\": [8, 4] } },\n viewingGroup: 25020, scamin: 90000,\n },\n\n // ── Natural Features ────────────────────────────────────\n VEGATN: {\n objectClass: \"VEGATN\", name: \"Vegetation\", category: \"Land\",\n displayCategory: \"OTHER\", int1Ref: \"C31\",\n // Pattern fill driven by CATVEG (resolved in `style-resolver.ts` via\n // `vegatnPatternExpression`). `fill-color` is the MapLibre fallback for\n // when the sprite image is missing; `fill-pattern` here is the default\n // used if the conditional expression isn't applied for some reason\n // (e.g. a consumer that bypasses `resolvePaint`).\n style: {\n type: \"fill\",\n paint: { \"fill-color\": \"LANDF\", \"fill-opacity\": 0.6, \"fill-pattern\": \"VEGATN03\" },\n },\n hasConditional: true, conditionalAttributes: [\"CATVEG\"],\n viewingGroup: 12050, scamin: 22000,\n },\n SEAARE: {\n // Cross-band water base. SEAARE polygons tile the sea below the\n // detailed DEPARE depth-area features, so where DEPARE has coverage\n // the depth bins win on top; where it doesn't (the coverage hole\n // between Coastal and Approach cells, etc.), SEAARE paints the\n // \"deep water\" colour instead of leaving the basemap to bleed\n // through. Drawn before DEPARE — see `draw-order.ts`. Opaque,\n // forced via `OPAQUE_FILL_LAYERS` in `style-resolver.ts`.\n //\n // `scamin: 0` so the base fill renders at every continuous zoom,\n // gated only by the band-priority window. The label config in\n // `labels.ts` keeps its own `minzoom: 5` so the OBJNAM doesn't\n // splash at low zooms.\n objectClass: \"SEAARE\", name: \"Sea Area\", category: \"Depths\",\n displayCategory: \"OTHER\", int1Ref: \"O1\",\n style: { type: \"fill\", paint: { \"fill-color\": \"DEPDW\", \"fill-opacity\": 1.0 } },\n viewingGroup: 12070, scamin: 0,\n },\n MARCUL: {\n objectClass: \"MARCUL\", name: \"Marine Farm/Culture\", category: \"Regulated Areas\",\n displayCategory: \"STANDARD\", int1Ref: \"K48\",\n style: { type: \"fill\", paint: { \"fill-color\": \"CHBRN\", \"fill-opacity\": 0.15 } },\n viewingGroup: 26230, scamin: 22000,\n },\n ACHBRT: {\n objectClass: \"ACHBRT\", name: \"Anchor Berth\", category: \"Regulated Areas\",\n displayCategory: \"STANDARD\", int1Ref: \"N11\",\n style: { type: \"symbol\", paint: {}, layout: { \"icon-size\": 0.5, \"icon-allow-overlap\": true }, iconImage: \"ACHARE02\" },\n viewingGroup: 26010, scamin: 90000,\n },\n BERTHS: {\n objectClass: \"BERTHS\", name: \"Berth\", category: \"Infrastructure\",\n displayCategory: \"OTHER\", int1Ref: \"F19\",\n style: { type: \"line\", paint: { \"line-color\": \"CHBLK\", \"line-width\": 1.5 } },\n viewingGroup: 12410, scamin: 22000,\n },\n FNCLNE: {\n objectClass: \"FNCLNE\", name: \"Fence/Wall\", category: \"Land\",\n displayCategory: \"OTHER\", int1Ref: \"D20\",\n style: { type: \"line\", paint: { \"line-color\": \"CHBLK\", \"line-width\": 0.5 } },\n viewingGroup: 12210, scamin: 22000,\n },\n ISTZNE: {\n objectClass: \"ISTZNE\", name: \"Inshore Traffic Zone\", category: \"Regulated Areas\",\n displayCategory: \"STANDARD\", int1Ref: \"M25.2\",\n style: { type: \"fill\", paint: { \"fill-color\": \"TRFCD\", \"fill-opacity\": 0.06 } },\n viewingGroup: 25010, scamin: 90000,\n },\n PRCARE: {\n objectClass: \"PRCARE\", name: \"Precautionary Area\", category: \"Regulated Areas\",\n displayCategory: \"STANDARD\", int1Ref: \"M14\",\n style: { type: \"fill\", paint: { \"fill-color\": \"TRFCD\", \"fill-opacity\": 0.08 } },\n viewingGroup: 25010, scamin: 90000,\n },\n PRDARE: {\n // Production Area — offshore oil/gas platforms, offshore wind farms (or\n // their exclusion zones), aquaculture, and other industrial production\n // areas mariners must not enter. Safety-critical: a vessel transiting\n // Boston-NYC should see Block Island / Vineyard Wind exclusion zones.\n //\n // Boundary-only dashed magenta — matches RESARE/CTNARE/MIPARE/TESARE\n // convention via LINE_FROM_POLYGON_LAYERS (see layer-builder.ts). Avoids\n // the flood-fill stacking problem where multiple regulated areas overlap\n // and obliterate underlying depth shading.\n objectClass: \"PRDARE\", name: \"Production Area\", category: \"Regulated Areas\",\n displayCategory: \"STANDARD\", int1Ref: \"L5\",\n style: { type: \"line\", paint: { \"line-color\": \"CHMGD\", \"line-width\": 1.4, \"line-dasharray\": [4, 2] } },\n hasConditional: true, conditionalAttributes: [\"CATPRA\", \"STATUS\"],\n viewingGroup: 26010, scamin: 90000,\n },\n OSPARE: {\n objectClass: \"OSPARE\", name: \"Offshore Production Area\", category: \"Regulated Areas\",\n displayCategory: \"OTHER\", int1Ref: \"L1.2\",\n style: { type: \"fill\", paint: { \"fill-color\": \"CHBRN\", \"fill-opacity\": 0.1 } },\n viewingGroup: 26230, scamin: 22000,\n },\n LOGPON: {\n objectClass: \"LOGPON\", name: \"Log Pond\", category: \"Regulated Areas\",\n displayCategory: \"OTHER\", int1Ref: \"N65\",\n style: { type: \"fill\", paint: { \"fill-color\": \"CHBRN\", \"fill-opacity\": 0.12 } },\n viewingGroup: 26230, scamin: 22000,\n },\n AIRARE: {\n objectClass: \"AIRARE\", name: \"Airport\", category: \"Land\",\n displayCategory: \"OTHER\", int1Ref: \"D17\",\n style: { type: \"fill\", paint: { \"fill-color\": \"CHGRF\", \"fill-opacity\": 0.15 } },\n viewingGroup: 12210, scamin: 22000,\n },\n RUNWAY: {\n // Airport runway near coast — navigation reference, not a navigable\n // feature. Distinct from ROADWY (which is `type: \"line\"`) — runways are\n // typically polygon-encoded showing the actual paved extent. NOAA encodes\n // 1 Line and 5 Polygon RUNWAY features; the Line variant is added in\n // layer-builder.ts so neither geometry type is silently dropped.\n objectClass: \"RUNWAY\", name: \"Runway\", category: \"Infrastructure\",\n displayCategory: \"OTHER\", int1Ref: \"D20\",\n style: { type: \"fill\", paint: { \"fill-color\": \"CHGRF\", \"fill-opacity\": 0.3 } },\n viewingGroup: 12250, scamin: 22000,\n },\n DAMCON: {\n objectClass: \"DAMCON\", name: \"Dam\", category: \"Infrastructure\",\n displayCategory: \"STANDARD\", int1Ref: \"F44\",\n style: { type: \"line\", paint: { \"line-color\": \"CHBLK\", \"line-width\": 2 } },\n viewingGroup: 12410, scamin: 22000,\n },\n\n // ── Magnetic Variation (INT1 Section B) ─────────────────\n // Polygon features (~136 in NOAA corpus) are isogonic zones — areas of\n // constant magnetic variation. The line style here is drawn as the\n // polygon BOUNDARY (LINE_FROM_POLYGON_LAYERS in layer-builder.ts), giving\n // the faint dashed magenta isogonic lines mariners read for compass\n // correction. Point features (~58) get their own circle layer in\n // layer-builder.ts. The VALMAG label is rendered via labels.ts.\n MAGVAR: {\n objectClass: \"MAGVAR\", name: \"Magnetic Variation\", category: \"Meta\",\n displayCategory: \"OTHER\", int1Ref: \"B68\",\n style: { type: \"line\", paint: { \"line-color\": \"CHMGD\", \"line-width\": 0.5, \"line-opacity\": 0.5, \"line-dasharray\": [4, 2] } },\n hasConditional: true, conditionalAttributes: [\"VALMAG\", \"VALACM\", \"RYRMGV\"],\n viewingGroup: 23010, scamin: 0,\n },\n\n // ── Meta (hidden by default) ────────────────────────────\n // M_* and DSID are S-57 metadata classes — they describe the dataset\n // (coverage extent, survey reliability, source publication, etc.) and\n // carry attributes for click-query lookups, but never draw a visible\n // shape. `auditIgnore` keeps the layer-coverage audit from flagging\n // their geometry-type rows as gaps.\n M_COVR: {\n objectClass: \"M_COVR\", name: \"Coverage\", category: \"Meta\",\n displayCategory: \"META\",\n style: { type: \"line\", paint: { \"line-color\": \"CHGRF\", \"line-width\": 0.5, \"line-opacity\": 0.3 } },\n auditIgnore: true,\n },\n M_NPUB: {\n objectClass: \"M_NPUB\", name: \"Nautical Publication\", category: \"Meta\",\n displayCategory: \"META\",\n style: { type: \"fill\", paint: { \"fill-color\": \"CHGRF\", \"fill-opacity\": 0 } },\n auditIgnore: true,\n },\n M_NSYS: {\n objectClass: \"M_NSYS\", name: \"Nav System of Marks\", category: \"Meta\",\n displayCategory: \"META\",\n style: { type: \"fill\", paint: { \"fill-color\": \"CHGRF\", \"fill-opacity\": 0 } },\n auditIgnore: true,\n },\n M_QUAL: {\n objectClass: \"M_QUAL\", name: \"Quality of Data\", category: \"Meta\",\n displayCategory: \"META\",\n style: { type: \"fill\", paint: { \"fill-color\": \"CHGRF\", \"fill-opacity\": 0 } },\n auditIgnore: true,\n },\n M_SREL: {\n objectClass: \"M_SREL\", name: \"Survey Reliability\", category: \"Meta\",\n displayCategory: \"META\",\n style: { type: \"fill\", paint: { \"fill-color\": \"CHGRF\", \"fill-opacity\": 0 } },\n auditIgnore: true,\n },\n DSID: {\n objectClass: \"DSID\", name: \"Dataset ID\", category: \"Meta\",\n displayCategory: \"META\",\n style: { type: \"fill\", paint: { \"fill-color\": \"CHGRF\", \"fill-opacity\": 0 } },\n auditIgnore: true,\n },\n};\n","/**\n * S-52 draw order: layers listed bottom → top.\n * Layers not in this list are inserted before point features.\n */\nexport const S52_DRAW_ORDER: string[] = [\n // 1. Meta (hidden, but at very bottom)\n \"DSID\", \"M_COVR\", \"M_NPUB\", \"M_NSYS\", \"M_QUAL\", \"M_SREL\",\n // 2. Depth areas – broadest first (fill).\n //\n // SEAARE goes BEFORE DEPARE so its uniform \"deep water\" base fill paints\n // under DEPARE's depth-tier bins. Where DEPARE has coverage, the bin\n // colour wins on top; where DEPARE doesn't (cross-band coverage gaps —\n // e.g. between Coastal and Approach cell extents), SEAARE provides a\n // chart-coloured base instead of the basemap bleeding through. This is\n // the visual-coherence fix for hard charcoal-vs-vector-blue seams at\n // scale-band boundaries — see `s52-lookup.ts`'s SEAARE entry for the\n // paired paint-spec change (fill-opacity 0 → 1, color → DEPDW).\n \"SEAARE\", \"DEPARE\",\n // 3. Dredged / swept areas (fill)\n \"DRGARE\", \"SWPARE\", \"SBDARE\", \"WEDKLP\",\n // 4. Land (fill)\n \"LNDARE\", \"SLOGRD\", \"BUAARE\", \"LAKARE\", \"RIVERS\", \"CANALS\", \"VEGATN\", \"AIRARE\", \"RUNWAY\",\n // 5. Area hazards (fill)\n \"OBSTRN\", \"UWTROC\", \"MARCUL\", \"FSHFAC\",\n // 6. Regulated areas (fill)\n \"TESARE\", \"MIPARE\", \"FAIRWY\", \"TSSLPT\", \"TSSRON\", \"ISTZNE\", \"PRCARE\", \"DMPGRD\",\n \"ACHARE\", \"RESARE\", \"CTNARE\", \"PRDARE\", \"OSPARE\", \"LOGPON\",\n \"CBLARE\", \"PIPARE\",\n // 7. Infrastructure areas (fill)\n \"PONTON\", \"HULKES\", \"DRYDOC\", \"FLODOC\", \"BRIDGE\", \"PYLONS\", \"FORSTC\",\n // 8. Coastline / shore (line)\n \"COALNE\", \"SLCONS\", \"FNCLNE\",\n // 9. Depth contours (line)\n \"DEPCNT\", \"LNDELV\",\n // 9a. Magnetic-variation isogonic lines (background reference annotations,\n // drawn above depth contours so the magenta dashes read against the\n // depth-fill ladder, but below nav lines / nav aids so safety-critical\n // routing and aids-to-nav win the visual hierarchy).\n \"MAGVAR\",\n // 10. Navigation lines (line)\n \"NAVLNE\", \"TSSBND\", \"ROADWY\", \"RAILWY\", \"TUNNEL\", \"FERYRT\", \"RECTRC\",\n \"PIPSOL\", \"PIPOHD\", \"CBLSUB\", \"CBLOHD\", \"GATCON\", \"DAMCON\", \"BERTHS\",\n // 11. Point features\n \"SOUNDG\", \"MORFAC\", \"PILPNT\", \"BUISGL\", \"SILTNK\", \"LNDMRK\", \"LNDRGN\",\n \"HRBFAC\", \"OFSPLF\", \"SMCFAC\", \"CRANES\", \"DISMAR\", \"ACHBRT\",\n // 12. Nav aids (on top)\n \"FOGSIG\", \"RTPBCN\", \"RDOSTA\", \"SISTAT\", \"PILBOP\", \"DAYMAR\", \"TOPMAR\",\n \"BCNSPP\", \"BCNCAR\", \"BCNISD\", \"BCNSAW\", \"BCNLAT\",\n \"BOYSPP\", \"BOYCAR\", \"BOYISD\", \"BOYSAW\", \"BOYINB\", \"BOYLAT\",\n \"LITVES\", \"LITFLT\", \"LIGHTS\",\n // 13. Hazard points (very top)\n \"WRECKS\", \"WATTUR\",\n];\n\n/** Get numeric draw priority for a layer (lower = drawn first / below) */\nexport function getDrawPriority(layerName: string): number {\n const idx = S52_DRAW_ORDER.indexOf(layerName);\n // Unknown layers go just before point features\n return idx >= 0 ? idx : S52_DRAW_ORDER.length - 15;\n}\n","import { resolveColor } from \"./s52-colors\";\nimport type { ColorTableName } from \"./s52-colors\";\n\n/**\n * S-52 Conditional Symbology Procedures.\n * Each function takes feature properties and returns paint overrides (hex colours).\n * All expression builders accept an optional colorTable parameter.\n */\n\n// ── DEPARE03: Depth Area shading ──────────────────────────\nexport function depareColor(props: Record<string, unknown>, ct: ColorTableName = \"DAY\"): string {\n const drval1 = Number(props.DRVAL1 ?? props.drval1 ?? -1);\n const drval2 = Number(props.DRVAL2 ?? props.drval2 ?? drval1);\n\n if (drval1 < 0 && drval2 <= 0) return resolveColor(\"DEPIT\", ct);\n if (drval1 < 2) return resolveColor(\"DEPVS\", ct);\n if (drval1 < 5) return resolveColor(\"DEPMS\", ct);\n if (drval1 < 10) return resolveColor(\"DEPMD\", ct);\n return resolveColor(\"DEPDW\", ct);\n}\n\nexport function depareFillExpression(ct: ColorTableName = \"DAY\"): unknown[] {\n return [\n \"case\",\n [\"all\", [\"<\", [\"coalesce\", [\"get\", \"DRVAL1\"], [\"get\", \"drval1\"], -1], 0],\n [\"<=\", [\"coalesce\", [\"get\", \"DRVAL2\"], [\"get\", \"drval2\"], 0], 0]],\n resolveColor(\"DEPIT\", ct),\n [\"<\", [\"coalesce\", [\"get\", \"DRVAL1\"], [\"get\", \"drval1\"], -1], 2],\n resolveColor(\"DEPVS\", ct),\n [\"<\", [\"coalesce\", [\"get\", \"DRVAL1\"], [\"get\", \"drval1\"], -1], 5],\n resolveColor(\"DEPMS\", ct),\n [\"<\", [\"coalesce\", [\"get\", \"DRVAL1\"], [\"get\", \"drval1\"], -1], 10],\n resolveColor(\"DEPMD\", ct),\n resolveColor(\"DEPDW\", ct),\n ];\n}\n\n// ── COLOUR list-attr handling ─────────────────────────────\n//\n// S-57 defines COLOUR as a list type — features can have multiple colours\n// (e.g. red-and-white horizontal bands). The cloud + baremetal pipelines\n// store it faithfully as a JSONB array of strings: `[\"3\"]`, `[\"3\",\"1\"]`.\n// After tippecanoe encodes into MVT, the property may also appear as a\n// JSON-stringified array `\"[\\\"3\\\"]\"` because MVT only supports primitive\n// values. This helper builds a paint expression that handles all four\n// observed shapes:\n// - native array of strings (GeoJSON path) [\"3\"]\n// - native array of numbers (future-proofing) [3]\n// - JSON-stringified array (post-tippecanoe) \"[\\\"3\\\"]\"\n// - bare string / number (legacy / sanitized) \"3\" or 3\n//\n// `cases` is an array of [code, value] pairs ordered by precedence — for\n// multi-colour buoys (e.g. red-and-white), the FIRST matching code wins.\n// Use an array (not an object) because JS coerces integer-like object keys\n// into numeric order, which would silently reorder safety-critical colours.\n// `fallback` is returned if no case matches.\nexport function colourCodeCase(\n cases: ReadonlyArray<readonly [string, unknown]>,\n fallback: unknown,\n): unknown[] {\n // Stringify the raw COLOUR value so we can substring-match against\n // both `[\"3\"]` (which to-string formats as `\"[\\\"3\\\"]\"`) and bare values.\n const colourStr = [\"to-string\", [\"coalesce\", [\"get\", \"COLOUR\"], [\"get\", \"colour\"], \"\"]];\n const expr: unknown[] = [\"case\"];\n // First pass: substring match for the quoted form, e.g. `\"3\"` inside\n // `[\\\"3\\\"]`. Skipping unknown codes silently is intentional.\n for (const [code, value] of cases) {\n expr.push([\">=\", [\"index-of\", `\"${code}\"`, colourStr], 0], value);\n }\n // Second pass: bare-string equality for legacy/normalized data.\n for (const [code, value] of cases) {\n expr.push([\"==\", colourStr, code], value);\n }\n expr.push(fallback);\n return expr;\n}\n\n// ── LIGHTS06: Light colour ────────────────────────────────\nexport function lightColor(props: Record<string, unknown>, ct: ColorTableName = \"DAY\"): string {\n // Runtime path: COLOUR can be array, JSON string, or scalar.\n const raw = props.COLOUR ?? props.colour;\n const code = Array.isArray(raw)\n ? Number(raw[0])\n : typeof raw === \"string\" && raw.startsWith(\"[\")\n ? Number(JSON.parse(raw)[0])\n : Number(raw ?? 0);\n switch (code) {\n case 1: return resolveColor(\"LITWT\", ct);\n case 3: return resolveColor(\"LITRD\", ct);\n case 4: return resolveColor(\"LITGN\", ct);\n case 5: return resolveColor(\"LITBL\", ct);\n case 6: return resolveColor(\"LITYW\", ct);\n case 11: return resolveColor(\"LITOR\", ct);\n default: return resolveColor(\"LITYW\", ct);\n }\n}\n\nexport function lightFillExpression(ct: ColorTableName = \"DAY\"): unknown[] {\n // Order by safety priority — for multi-colour features (e.g. red-and-white\n // buoys with COLOUR=[\"3\",\"1\"]), the first match wins. Red and green are\n // most safety-critical, so they're checked before white.\n return colourCodeCase(\n [\n [\"3\", resolveColor(\"LITRD\", ct)],\n [\"4\", resolveColor(\"LITGN\", ct)],\n [\"6\", resolveColor(\"LITYW\", ct)],\n [\"11\", resolveColor(\"LITOR\", ct)],\n [\"5\", resolveColor(\"LITBL\", ct)],\n [\"1\", resolveColor(\"LITWT\", ct)],\n ],\n resolveColor(\"LITYW\", ct),\n );\n}\n\n// ── Lateral marks (IALA-B, US waters) ─────────────────────\nexport function lateralColor(props: Record<string, unknown>, ct: ColorTableName = \"DAY\"): string {\n const catlam = Number(props.CATLAM ?? props.catlam ?? 0);\n if (catlam === 1) return resolveColor(\"LITRD\", ct);\n if (catlam === 2) return resolveColor(\"LITGN\", ct);\n return resolveColor(\"LITYW\", ct);\n}\n\nexport function lateralFillExpression(ct: ColorTableName = \"DAY\"): unknown[] {\n return [\n \"match\",\n [\"coalesce\", [\"get\", \"CATLAM\"], [\"get\", \"catlam\"], 0],\n 1, resolveColor(\"LITRD\", ct),\n 2, resolveColor(\"LITGN\", ct),\n resolveColor(\"LITYW\", ct),\n ];\n}\n\n// ── Hazard colour based on WATLEV / VALSOU ────────────────\nexport function hazardColor(props: Record<string, unknown>, ct: ColorTableName = \"DAY\"): string {\n const watlev = Number(props.WATLEV ?? props.watlev ?? 0);\n const valsou = props.VALSOU ?? props.valsou;\n\n if (watlev === 1 || watlev === 2) return resolveColor(\"DNGHL\", ct);\n if (valsou != null && Number(valsou) < 2) return resolveColor(\"DNGHL\", ct);\n return resolveColor(\"RESBL\", ct);\n}\n\nexport function hazardFillExpression(ct: ColorTableName = \"DAY\"): unknown[] {\n return [\n \"case\",\n [\"any\",\n [\"==\", [\"coalesce\", [\"get\", \"WATLEV\"], [\"get\", \"watlev\"], 0], 1],\n [\"==\", [\"coalesce\", [\"get\", \"WATLEV\"], [\"get\", \"watlev\"], 0], 2],\n ],\n resolveColor(\"DNGHL\", ct),\n [\"all\",\n [\"has\", \"VALSOU\"],\n [\"<\", [\"get\", \"VALSOU\"], 2],\n ],\n resolveColor(\"DNGHL\", ct),\n resolveColor(\"RESBL\", ct),\n ];\n}\n\n// ── VEGATN: pattern fill driven by CATVEG ─────────────────\n//\n// NOAA paper charts portray vegetated land with tiled S-52 pattern fills —\n// grass strokes, tree-circles, marsh tufts — that tell the mariner WHAT\n// kind of vegetation is on the bank, not just THAT there is vegetation.\n// The OpenCPN chartsymbols.xml lookup table maps each CATVEG code to either\n// VEGATN03 (horizontal-stripe grass/scrub/bush) or VEGATN04 (tree-circle\n// for woods / orchards / trees / savannah).\n//\n// We extend that mapping with MARSHES1 for swamp / marsh / mangrove\n// (CATVEG 7, 16, 17) — the OpenCPN reference only attaches MARSHES1 to\n// LNDRGN swamp/marsh CATLND codes, not to VEGATN, but the marsh-tuft\n// pattern is the right cue for tidal-marsh vegetation and is the only\n// pattern in the catalogue that visually distinguishes wet vegetation\n// from dry. Using it here keeps tidal-estuary cells (Plum Island, NJ\n// Pine Barrens, the Carolinas) qualitatively distinguishable from\n// upland forest.\nexport function vegatnPatternExpression(): unknown[] {\n return [\n \"match\",\n [\"coalesce\", [\"get\", \"CATVEG\"], [\"get\", \"catveg\"], 0],\n 1, \"VEGATN03\", // grass\n 3, \"VEGATN03\", // bush\n 4, \"VEGATN04\", // deciduous wood\n 5, \"VEGATN04\", // coniferous wood\n 6, \"VEGATN04\", // wood (mixed)\n 7, \"MARSHES1\", // mangroves\n 10, \"VEGATN03\", // scrub\n 11, \"VEGATN04\", // tree\n 12, \"VEGATN04\", // evergreen\n 16, \"MARSHES1\", // swamp\n 17, \"MARSHES1\", // marsh\n 21, \"VEGATN04\", // savannah\n \"VEGATN03\", // default: grass pattern\n ];\n}\n\n// ── DAYMAR colour from COLOUR attribute ───────────────────\nexport function daymarkColor(props: Record<string, unknown>, ct: ColorTableName = \"DAY\"): string {\n const raw = props.COLOUR ?? props.colour;\n const code = Array.isArray(raw)\n ? Number(raw[0])\n : typeof raw === \"string\" && raw.startsWith(\"[\")\n ? Number(JSON.parse(raw)[0])\n : Number(raw ?? 0);\n switch (code) {\n case 1: return resolveColor(\"LITWT\", ct);\n case 3: return resolveColor(\"LITRD\", ct);\n case 4: return resolveColor(\"LITGN\", ct);\n case 6: return resolveColor(\"LITYW\", ct);\n case 11: return resolveColor(\"LITOR\", ct);\n default: return resolveColor(\"LITGN\", ct);\n }\n}\n","/**\n * IHO S-52 / NOAA Chart No. 1 / INT1 nautical symbol SVGs.\n *\n * Complete symbology suite following:\n * - IHO S-52 Presentation Library (Ed 4.0)\n * - IALA Maritime Buoyage System R1001 (Region B for US waters)\n * - NOAA Chart No. 1 (Ed 13) / INT1\n *\n * Buoy shape terminology (US / Chart No. 1):\n * - CAN (Q20): Flat-top cylindrical buoy — Port mark in IALA-B (red)\n * - NUN (Q21): Conical/pointed-top buoy — Starboard mark in IALA-B (green)\n * - PILLAR: Tall narrow buoy — used for cardinal, isolated danger, etc.\n * - SPAR: Tall thin pole buoy\n * - SPHERICAL: Round buoy — safe water marks\n * - BARREL: Barrel/tun shaped buoy\n * - SUPER: Large navigation buoy / LANBY\n *\n * Cardinal mark topmark orientations (IALA):\n * - North: both cones point UP ▲▲\n * - South: both cones point DOWN ▼▼\n * - East: cones base-to-base (diamond) ◆\n * - West: cones point-to-point (hourglass) ⊗\n *\n * Each symbol is a compact SVG at 32×32 for Mapbox GL `map.addImage()`.\n */\n\nconst SIZE = 32;\n\nfunction svg(inner: string): string {\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${SIZE}\" height=\"${SIZE}\" viewBox=\"0 0 32 32\">${inner}</svg>`;\n}\n\n// ═══════════════════════════════════════════════════════════\n// SECTION Q: BUOYS AND BEACONS\n// ═══════════════════════════════════════════════════════════\n\n// ── Q20: Can Buoy (flat-top cylinder) — IALA-B Port (red) ── S-52 BOYCAN01\nfunction buoyCan(): string {\n return svg(`\n <circle cx=\"16\" cy=\"29\" r=\"1.5\" fill=\"#000\"/>\n <line x1=\"16\" y1=\"27.5\" x2=\"16\" y2=\"16\" stroke=\"#000\" stroke-width=\"1\"/>\n <rect x=\"9\" y=\"6\" width=\"14\" height=\"10\" fill=\"#d42e12\" stroke=\"#000\" stroke-width=\"1.2\"/>\n `);\n}\n\n// ── Q21: Nun Buoy (conical/pointed top) — IALA-B Starboard (green) ── S-52 BOYLAT15\nfunction buoyNun(): string {\n return svg(`\n <circle cx=\"16\" cy=\"29\" r=\"1.5\" fill=\"#000\"/>\n <line x1=\"16\" y1=\"27.5\" x2=\"16\" y2=\"16\" stroke=\"#000\" stroke-width=\"1\"/>\n <polygon points=\"9,16 23,16 16,5\" fill=\"#00843d\" stroke=\"#000\" stroke-width=\"1.2\"/>\n `);\n}\n\n// ── Q22: Spar Buoy — tall thin vertical pole ── S-52 BOYSPR01\nfunction buoySpar(): string {\n return svg(`\n <circle cx=\"16\" cy=\"29\" r=\"1.5\" fill=\"#000\"/>\n <line x1=\"16\" y1=\"27.5\" x2=\"16\" y2=\"4\" stroke=\"#000\" stroke-width=\"2.5\"/>\n <circle cx=\"16\" cy=\"4\" r=\"2\" fill=\"#d42e12\" stroke=\"#000\" stroke-width=\"0.8\"/>\n `);\n}\n\n// ── Q23: Pillar Buoy — tall narrow cylinder ── S-52 BOYPIL01\nfunction buoyPillar(): string {\n return svg(`\n <circle cx=\"16\" cy=\"29\" r=\"1.5\" fill=\"#000\"/>\n <line x1=\"16\" y1=\"27.5\" x2=\"16\" y2=\"18\" stroke=\"#000\" stroke-width=\"1\"/>\n <rect x=\"13\" y=\"5\" width=\"6\" height=\"13\" rx=\"1\" fill=\"#ffd700\" stroke=\"#000\" stroke-width=\"1\"/>\n `);\n}\n\n// ── Q24: Spherical Buoy — round shape ── S-52 BOYSPH01\nfunction buoySpherical(): string {\n return svg(`\n <circle cx=\"16\" cy=\"29\" r=\"1.5\" fill=\"#000\"/>\n <line x1=\"16\" y1=\"27.5\" x2=\"16\" y2=\"22\" stroke=\"#000\" stroke-width=\"1\"/>\n <circle cx=\"16\" cy=\"14\" r=\"8\" fill=\"#d42e12\" stroke=\"#000\" stroke-width=\"1\"/>\n <line x1=\"8\" y1=\"14\" x2=\"24\" y2=\"14\" stroke=\"#fff\" stroke-width=\"1.5\"/>\n `);\n}\n\n// ── Q25: Barrel/Tun Buoy ── S-52 BOYBAR01\nfunction buoyBarrel(): string {\n return svg(`\n <circle cx=\"16\" cy=\"29\" r=\"1.5\" fill=\"#000\"/>\n <line x1=\"16\" y1=\"27.5\" x2=\"16\" y2=\"20\" stroke=\"#000\" stroke-width=\"1\"/>\n <ellipse cx=\"16\" cy=\"13\" rx=\"9\" ry=\"7\" fill=\"#ffd700\" stroke=\"#000\" stroke-width=\"1\"/>\n <line x1=\"7\" y1=\"13\" x2=\"25\" y2=\"13\" stroke=\"#000\" stroke-width=\"0.6\"/>\n `);\n}\n\n// ── Q26: Super Buoy / LANBY ── S-52 BOYSUP01\nfunction buoySuper(): string {\n return svg(`\n <circle cx=\"16\" cy=\"29\" r=\"1.5\" fill=\"#000\"/>\n <line x1=\"16\" y1=\"27.5\" x2=\"16\" y2=\"20\" stroke=\"#000\" stroke-width=\"1.5\"/>\n <rect x=\"6\" y=\"10\" width=\"20\" height=\"10\" rx=\"2\" fill=\"#d42e12\" stroke=\"#000\" stroke-width=\"1.2\"/>\n <line x1=\"16\" y1=\"10\" x2=\"16\" y2=\"4\" stroke=\"#000\" stroke-width=\"1.5\"/>\n <circle cx=\"16\" cy=\"4\" r=\"2\" fill=\"#ffd700\" stroke=\"#000\" stroke-width=\"0.6\"/>\n `);\n}\n\n// ── Q130.3: Cardinal North — pillar, both cones up ▲▲ ── S-52 BOYCAR01\nfunction buoyCardinalNorth(): string {\n return svg(`\n <circle cx=\"16\" cy=\"29\" r=\"1.5\" fill=\"#000\"/>\n <line x1=\"16\" y1=\"27.5\" x2=\"16\" y2=\"6\" stroke=\"#000\" stroke-width=\"0.8\"/>\n <rect x=\"12\" y=\"14\" width=\"8\" height=\"14\" fill=\"#ffd700\" stroke=\"#000\" stroke-width=\"0.8\"/>\n <rect x=\"12\" y=\"14\" width=\"8\" height=\"5\" fill=\"#000\"/>\n <polygon points=\"16,3 13,8 19,8\" fill=\"#000\"/>\n <polygon points=\"16,8 13,13 19,13\" fill=\"#000\"/>\n `);\n}\n\n// ── Q130.3: Cardinal South — pillar, both cones down ▼▼ ── S-52 BOYCAR01\nfunction buoyCardinalSouth(): string {\n return svg(`\n <circle cx=\"16\" cy=\"29\" r=\"1.5\" fill=\"#000\"/>\n <line x1=\"16\" y1=\"27.5\" x2=\"16\" y2=\"6\" stroke=\"#000\" stroke-width=\"0.8\"/>\n <rect x=\"12\" y=\"14\" width=\"8\" height=\"14\" fill=\"#ffd700\" stroke=\"#000\" stroke-width=\"0.8\"/>\n <rect x=\"12\" y=\"23\" width=\"8\" height=\"5\" fill=\"#000\"/>\n <polygon points=\"16,13 13,8 19,8\" fill=\"#000\"/>\n <polygon points=\"16,8 13,3 19,3\" fill=\"#000\"/>\n `);\n}\n\n// ── Q130.3: Cardinal East — cones base-to-base ◆ ── S-52 BOYCAR01\nfunction buoyCardinalEast(): string {\n return svg(`\n <circle cx=\"16\" cy=\"29\" r=\"1.5\" fill=\"#000\"/>\n <line x1=\"16\" y1=\"27.5\" x2=\"16\" y2=\"6\" stroke=\"#000\" stroke-width=\"0.8\"/>\n <rect x=\"12\" y=\"14\" width=\"8\" height=\"14\" fill=\"#ffd700\" stroke=\"#000\" stroke-width=\"0.8\"/>\n <rect x=\"12\" y=\"14\" width=\"8\" height=\"3\" fill=\"#000\"/>\n <rect x=\"12\" y=\"25\" width=\"8\" height=\"3\" fill=\"#000\"/>\n <polygon points=\"16,3 13,7 19,7\" fill=\"#000\"/>\n <polygon points=\"16,13 13,9 19,9\" fill=\"#000\"/>\n `);\n}\n\n// ── Q130.3: Cardinal West — cones point-to-point (hourglass) ── S-52 BOYCAR01\nfunction buoyCardinalWest(): string {\n return svg(`\n <circle cx=\"16\" cy=\"29\" r=\"1.5\" fill=\"#000\"/>\n <line x1=\"16\" y1=\"27.5\" x2=\"16\" y2=\"6\" stroke=\"#000\" stroke-width=\"0.8\"/>\n <rect x=\"12\" y=\"14\" width=\"8\" height=\"14\" fill=\"#ffd700\" stroke=\"#000\" stroke-width=\"0.8\"/>\n <rect x=\"12\" y=\"17\" width=\"8\" height=\"8\" fill=\"#000\"/>\n <polygon points=\"16,8 13,3 19,3\" fill=\"#000\"/>\n <polygon points=\"16,8 13,13 19,13\" fill=\"#000\"/>\n `);\n}\n\n// ── Q130.4: Isolated Danger — black pillar, red band, 2 sphere topmarks ── S-52 BOYISD02\nfunction buoyIsolatedDanger(): string {\n return svg(`\n <circle cx=\"16\" cy=\"29\" r=\"1.5\" fill=\"#000\"/>\n <line x1=\"16\" y1=\"27.5\" x2=\"16\" y2=\"8\" stroke=\"#000\" stroke-width=\"0.8\"/>\n <rect x=\"12\" y=\"14\" width=\"8\" height=\"14\" fill=\"#000\" stroke=\"#000\" stroke-width=\"0.8\"/>\n <rect x=\"12\" y=\"19\" width=\"8\" height=\"4\" fill=\"#d42e12\"/>\n <circle cx=\"16\" cy=\"6\" r=\"2.2\" fill=\"#000\"/>\n <circle cx=\"16\" cy=\"11\" r=\"2.2\" fill=\"#000\"/>\n `);\n}\n\n// ── Q130.5: Safe Water — red/white vertical stripes, sphere topmark ── S-52 BOYSAW12\nfunction buoySafeWater(): string {\n return svg(`\n <circle cx=\"16\" cy=\"29\" r=\"1.5\" fill=\"#000\"/>\n <line x1=\"16\" y1=\"27.5\" x2=\"16\" y2=\"6\" stroke=\"#000\" stroke-width=\"0.8\"/>\n <circle cx=\"16\" cy=\"20\" r=\"7\" fill=\"#fff\" stroke=\"#000\" stroke-width=\"0.8\"/>\n <rect x=\"14\" y=\"13\" width=\"2\" height=\"14\" fill=\"#d42e12\"/>\n <rect x=\"18\" y=\"13\" width=\"2\" height=\"14\" fill=\"#d42e12\"/>\n <circle cx=\"16\" cy=\"4\" r=\"2.2\" fill=\"#d42e12\" stroke=\"#000\" stroke-width=\"0.6\"/>\n `);\n}\n\n// ── Q130.6: Special Purpose — yellow, X topmark ── S-52 BOYSPP21\nfunction buoySpecial(): string {\n return svg(`\n <circle cx=\"16\" cy=\"29\" r=\"1.5\" fill=\"#000\"/>\n <line x1=\"16\" y1=\"27.5\" x2=\"16\" y2=\"6\" stroke=\"#000\" stroke-width=\"0.8\"/>\n <rect x=\"10\" y=\"12\" width=\"12\" height=\"16\" rx=\"1\" fill=\"#ffd700\" stroke=\"#000\" stroke-width=\"0.8\"/>\n <line x1=\"12\" y1=\"3\" x2=\"20\" y2=\"11\" stroke=\"#000\" stroke-width=\"1.5\"/>\n <line x1=\"20\" y1=\"3\" x2=\"12\" y2=\"11\" stroke=\"#000\" stroke-width=\"1.5\"/>\n `);\n}\n\n// ── Q130.8: Emergency Wreck Marking Buoy — blue/yellow vertical stripes ── S-52 BOYEWM01\nfunction buoyEmergencyWreck(): string {\n return svg(`\n <circle cx=\"16\" cy=\"29\" r=\"1.5\" fill=\"#000\"/>\n <line x1=\"16\" y1=\"27.5\" x2=\"16\" y2=\"6\" stroke=\"#000\" stroke-width=\"0.8\"/>\n <rect x=\"10\" y=\"12\" width=\"12\" height=\"16\" rx=\"1\" fill=\"#0047ab\" stroke=\"#000\" stroke-width=\"0.8\"/>\n <rect x=\"14\" y=\"12\" width=\"2\" height=\"16\" fill=\"#ffd700\"/>\n <rect x=\"18\" y=\"12\" width=\"2\" height=\"16\" fill=\"#ffd700\"/>\n <line x1=\"16\" y1=\"11\" x2=\"16\" y2=\"3\" stroke=\"#ffd700\" stroke-width=\"2\"/>\n <line x1=\"12\" y1=\"7\" x2=\"20\" y2=\"7\" stroke=\"#ffd700\" stroke-width=\"2\"/>\n <line x1=\"16\" y1=\"11\" x2=\"16\" y2=\"3\" stroke=\"#000\" stroke-width=\"0.8\"/>\n <line x1=\"12\" y1=\"7\" x2=\"20\" y2=\"7\" stroke=\"#000\" stroke-width=\"0.8\"/>\n `);\n}\n\n// ── Q40: Mooring Buoy ── S-52 MORFAC03\nfunction mooringBuoy(): string {\n return svg(`\n <circle cx=\"16\" cy=\"29\" r=\"1.5\" fill=\"#000\"/>\n <line x1=\"16\" y1=\"27.5\" x2=\"16\" y2=\"23\" stroke=\"#000\" stroke-width=\"1\"/>\n <circle cx=\"16\" cy=\"16\" r=\"7\" fill=\"#fff\" stroke=\"#000\" stroke-width=\"1.5\"/>\n <circle cx=\"16\" cy=\"16\" r=\"3\" fill=\"#000\"/>\n `);\n}\n\n// ── Q80: Pile / Post ── S-52 PILPNT01\nfunction pilePost(): string {\n return svg(`\n <circle cx=\"16\" cy=\"29\" r=\"1.5\" fill=\"#000\"/>\n <line x1=\"16\" y1=\"27.5\" x2=\"16\" y2=\"6\" stroke=\"#000\" stroke-width=\"2.5\"/>\n <circle cx=\"16\" cy=\"6\" r=\"2.5\" fill=\"#000\"/>\n `);\n}\n\n// ── Q100: Beacon, Lateral (Port) — post with red triangle topmark ── S-52 BCNLAT15\nfunction beaconLateralPort(): string {\n return svg(`\n <circle cx=\"16\" cy=\"29\" r=\"1.5\" fill=\"#000\"/>\n <line x1=\"16\" y1=\"27.5\" x2=\"16\" y2=\"13\" stroke=\"#000\" stroke-width=\"2\"/>\n <polygon points=\"16,3 9,13 23,13\" fill=\"#d42e12\" stroke=\"#000\" stroke-width=\"1\"/>\n `);\n}\n\n// ── Q100: Beacon, Lateral (Starboard) — post with green square topmark ── S-52 BCNLAT16\nfunction beaconLateralStbd(): string {\n return svg(`\n <circle cx=\"16\" cy=\"29\" r=\"1.5\" fill=\"#000\"/>\n <line x1=\"16\" y1=\"27.5\" x2=\"16\" y2=\"13\" stroke=\"#000\" stroke-width=\"2\"/>\n <rect x=\"9\" y=\"3\" width=\"14\" height=\"10\" fill=\"#00843d\" stroke=\"#000\" stroke-width=\"1\"/>\n `);\n}\n\n// ── Q110: Beacon, Cardinal — post with double cone topmarks ── S-52 BCNCAR01\nfunction beaconCardinal(): string {\n return svg(`\n <circle cx=\"16\" cy=\"29\" r=\"1.5\" fill=\"#000\"/>\n <line x1=\"16\" y1=\"27.5\" x2=\"16\" y2=\"12\" stroke=\"#000\" stroke-width=\"2\"/>\n <polygon points=\"16,2 12,7 20,7\" fill=\"#000\"/>\n <polygon points=\"16,7 12,12 20,12\" fill=\"#000\"/>\n `);\n}\n\n// ── Q110: Beacon, Isolated Danger — post with 2 sphere topmarks ── S-52 BCNISD01\nfunction beaconIsolatedDanger(): string {\n return svg(`\n <circle cx=\"16\" cy=\"29\" r=\"1.5\" fill=\"#000\"/>\n <line x1=\"16\" y1=\"27.5\" x2=\"16\" y2=\"13\" stroke=\"#000\" stroke-width=\"2\"/>\n <circle cx=\"16\" cy=\"5\" r=\"2.5\" fill=\"#000\"/>\n <circle cx=\"16\" cy=\"11\" r=\"2.5\" fill=\"#000\"/>\n `);\n}\n\n// ── Q110: Beacon, Safe Water — post with sphere topmark ── S-52 BCNSAW01\nfunction beaconSafeWater(): string {\n return svg(`\n <circle cx=\"16\" cy=\"29\" r=\"1.5\" fill=\"#000\"/>\n <line x1=\"16\" y1=\"27.5\" x2=\"16\" y2=\"10\" stroke=\"#000\" stroke-width=\"2\"/>\n <circle cx=\"16\" cy=\"6\" r=\"4\" fill=\"#d42e12\" stroke=\"#000\" stroke-width=\"0.8\"/>\n `);\n}\n\n// ── Q110: Beacon, Special Purpose — post with X topmark ── S-52 BCNSPP01\nfunction beaconSpecial(): string {\n return svg(`\n <circle cx=\"16\" cy=\"29\" r=\"1.5\" fill=\"#000\"/>\n <line x1=\"16\" y1=\"27.5\" x2=\"16\" y2=\"12\" stroke=\"#000\" stroke-width=\"2\"/>\n <line x1=\"10\" y1=\"2\" x2=\"22\" y2=\"12\" stroke=\"#ffd700\" stroke-width=\"3\"/>\n <line x1=\"22\" y1=\"2\" x2=\"10\" y2=\"12\" stroke=\"#ffd700\" stroke-width=\"3\"/>\n <line x1=\"10\" y1=\"2\" x2=\"22\" y2=\"12\" stroke=\"#000\" stroke-width=\"1.2\"/>\n <line x1=\"22\" y1=\"2\" x2=\"10\" y2=\"12\" stroke=\"#000\" stroke-width=\"1.2\"/>\n `);\n}\n\n// ── Q100: Daymark, Triangle (port) ──\nfunction daymarkTriangle(): string {\n return svg(`\n <polygon points=\"16,4 6,24 26,24\" fill=\"#d42e12\" stroke=\"#000\" stroke-width=\"1.5\"/>\n `);\n}\n\n// ── Q100: Daymark, Square (starboard) ──\nfunction daymarkSquare(): string {\n return svg(`\n <rect x=\"6\" y=\"6\" width=\"20\" height=\"20\" fill=\"#00843d\" stroke=\"#000\" stroke-width=\"1.5\"/>\n `);\n}\n\n// ═══════════════════════════════════════════════════════════\n// SECTION Q: TOPMARKS (TOPMAR) — S-52 PL shapes\n// ═══════════════════════════════════════════════════════════\n\n// ── TOPMAR02: Single cone point up (TOPSHP=1) ──\nfunction topmarkConeUp(): string {\n return svg(`\n <polygon points=\"16,4 8,24 24,24\" fill=\"#000\" stroke=\"#000\" stroke-width=\"1\"/>\n `);\n}\n\n// ── TOPMAR04: Single cone point down (TOPSHP=2) ──\nfunction topmarkConeDown(): string {\n return svg(`\n <polygon points=\"16,28 8,8 24,8\" fill=\"#000\" stroke=\"#000\" stroke-width=\"1\"/>\n `);\n}\n\n// ── TOPMAR10: Single sphere (TOPSHP=3) ──\nfunction topmarkSphere(): string {\n return svg(`\n <circle cx=\"16\" cy=\"16\" r=\"9\" fill=\"#000\" stroke=\"#000\" stroke-width=\"1\"/>\n `);\n}\n\n// ── TOPMAR12: 2 cones up — North cardinal (TOPSHP=4) ──\nfunction topmark2ConesUp(): string {\n return svg(`\n <polygon points=\"16,2 10,13 22,13\" fill=\"#000\" stroke=\"#000\" stroke-width=\"0.8\"/>\n <polygon points=\"16,15 10,26 22,26\" fill=\"#000\" stroke=\"#000\" stroke-width=\"0.8\"/>\n `);\n}\n\n// ── TOPMAR14: 2 cones down — South cardinal (TOPSHP=5) ──\nfunction topmark2ConesDown(): string {\n return svg(`\n <polygon points=\"16,14 10,3 22,3\" fill=\"#000\" stroke=\"#000\" stroke-width=\"0.8\"/>\n <polygon points=\"16,27 10,16 22,16\" fill=\"#000\" stroke=\"#000\" stroke-width=\"0.8\"/>\n `);\n}\n\n// ── TOPMAR22: 2 cones base-to-base — East cardinal (TOPSHP=6) ──\nfunction topmark2ConesBase(): string {\n return svg(`\n <polygon points=\"16,2 10,14 22,14\" fill=\"#000\" stroke=\"#000\" stroke-width=\"0.8\"/>\n <polygon points=\"16,30 10,18 22,18\" fill=\"#000\" stroke=\"#000\" stroke-width=\"0.8\"/>\n `);\n}\n\n// ── TOPMAR24: 2 cones point-to-point — West cardinal (TOPSHP=7) ──\nfunction topmark2ConesPoint(): string {\n return svg(`\n <polygon points=\"16,14 10,2 22,2\" fill=\"#000\" stroke=\"#000\" stroke-width=\"0.8\"/>\n <polygon points=\"16,18 10,30 22,30\" fill=\"#000\" stroke=\"#000\" stroke-width=\"0.8\"/>\n `);\n}\n\n// ── TOPMAR30: 2 spheres — Isolated Danger (TOPSHP=8) ──\nfunction topmark2Spheres(): string {\n return svg(`\n <circle cx=\"16\" cy=\"9\" r=\"6\" fill=\"#000\" stroke=\"#000\" stroke-width=\"0.8\"/>\n <circle cx=\"16\" cy=\"23\" r=\"6\" fill=\"#000\" stroke=\"#000\" stroke-width=\"0.8\"/>\n `);\n}\n\n// ── TOPMAR28: Diamond (TOPSHP=9) ──\nfunction topmarkDiamond(): string {\n return svg(`\n <polygon points=\"16,3 26,16 16,29 6,16\" fill=\"#000\" stroke=\"#000\" stroke-width=\"1\"/>\n `);\n}\n\n// ── TOPMAR32: X shape — Special purpose (TOPSHP=10) ──\nfunction topmarkXShape(): string {\n return svg(`\n <line x1=\"6\" y1=\"6\" x2=\"26\" y2=\"26\" stroke=\"#000\" stroke-width=\"3\"/>\n <line x1=\"26\" y1=\"6\" x2=\"6\" y2=\"26\" stroke=\"#000\" stroke-width=\"3\"/>\n `);\n}\n\n// ═══════════════════════════════════════════════════════════\n// SECTION P: LIGHTS AND FOG SIGNALS\n// ═══════════════════════════════════════════════════════════\n\n// ── P1: Major Light ── S-52 LIGHTS11: filled circle + bottom-right teardrop flare.\n// The flare points into the bottom-right quadrant so it doesn't collide with\n// the topmark drawn above the parent buoy/beacon.\nfunction lightMajor(): string {\n return svg(`\n <circle cx=\"16\" cy=\"16\" r=\"2.5\" fill=\"#d200d2\"/>\n <path d=\"M16,16 L20.6,25.5 Q30,30 25.5,20.6 Z\" fill=\"#d200d2\"/>\n `);\n}\n\n// ── P4: Minor Light ── S-52 LIGHTS13: smaller filled circle + shorter bottom-right teardrop flare\nfunction lightMinor(): string {\n return svg(`\n <circle cx=\"16\" cy=\"16\" r=\"2\" fill=\"#d200d2\"/>\n <path d=\"M16,16 L20.3,23.1 Q26.6,26.6 23.1,20.3 Z\" fill=\"#d200d2\"/>\n `);\n}\n\n// ── P40: Sector Light ── S-52 LIGHTS12: radial sector lines from position + connecting arc\nfunction lightSector(): string {\n return svg(`\n <circle cx=\"16\" cy=\"24\" r=\"2.5\" fill=\"#d200d2\"/>\n <line x1=\"16\" y1=\"24\" x2=\"6\" y2=\"6\" stroke=\"#d200d2\" stroke-width=\"0.8\"/>\n <line x1=\"16\" y1=\"24\" x2=\"26\" y2=\"6\" stroke=\"#d200d2\" stroke-width=\"0.8\"/>\n <path d=\"M6,6 A20,20 0 0,1 26,6\" fill=\"none\" stroke=\"#d200d2\" stroke-width=\"1\"/>\n `);\n}\n\n// ── P30: Directional Light ── S-52: narrow sector with two close radial lines + arc\nfunction lightDirectional(): string {\n return svg(`\n <circle cx=\"16\" cy=\"24\" r=\"2.5\" fill=\"#d200d2\"/>\n <line x1=\"16\" y1=\"24\" x2=\"14\" y2=\"4\" stroke=\"#d200d2\" stroke-width=\"0.8\"/>\n <line x1=\"16\" y1=\"24\" x2=\"18\" y2=\"4\" stroke=\"#d200d2\" stroke-width=\"0.8\"/>\n <path d=\"M14,4 A2,2 0 0,1 18,4\" fill=\"none\" stroke=\"#d200d2\" stroke-width=\"0.8\"/>\n `);\n}\n\n// ── P60: Aeronautical Light ── S-52 LIGHTS82: circle + flare + alternating dash ring\nfunction lightAero(): string {\n return svg(`\n <circle cx=\"16\" cy=\"20\" r=\"2.5\" fill=\"#d200d2\"/>\n <path d=\"M16,20 L14.5,10 Q16,4 17.5,10 Z\" fill=\"#d200d2\"/>\n <circle cx=\"16\" cy=\"20\" r=\"9\" fill=\"none\" stroke=\"#d200d2\" stroke-width=\"0.7\" stroke-dasharray=\"4,2,1.5,2\"/>\n `);\n}\n\n// ── P6: Light Vessel / Lightship ── S-52 LITVES01\nfunction lightVessel(): string {\n return svg(`\n <circle cx=\"16\" cy=\"29\" r=\"1.5\" fill=\"#000\"/>\n <path d=\"M6,22 Q16,28 26,22\" fill=\"none\" stroke=\"#000\" stroke-width=\"1.5\"/>\n <path d=\"M6,22 L8,18 L24,18 L26,22\" fill=\"#d42e12\" stroke=\"#000\" stroke-width=\"1\"/>\n <line x1=\"16\" y1=\"18\" x2=\"16\" y2=\"8\" stroke=\"#000\" stroke-width=\"1.5\"/>\n <circle cx=\"16\" cy=\"6\" r=\"2.5\" fill=\"#d200d2\" stroke=\"#000\" stroke-width=\"0.6\"/>\n <path d=\"M16,6 L15,2 Q16,0 17,2 Z\" fill=\"#d200d2\" opacity=\"0.7\"/>\n `);\n}\n\n// ── P5: Light Float ── S-52 LITFLT01\nfunction lightFloat(): string {\n return svg(`\n <circle cx=\"16\" cy=\"29\" r=\"1.5\" fill=\"#000\"/>\n <ellipse cx=\"16\" cy=\"22\" rx=\"10\" ry=\"4\" fill=\"#ffd700\" stroke=\"#000\" stroke-width=\"1\"/>\n <line x1=\"16\" y1=\"18\" x2=\"16\" y2=\"8\" stroke=\"#000\" stroke-width=\"1.5\"/>\n <circle cx=\"16\" cy=\"6\" r=\"2.5\" fill=\"#d200d2\" stroke=\"#000\" stroke-width=\"0.6\"/>\n `);\n}\n\n// ── R1: Fog Signal ── S-52 FOGSIG01: megaphone horn with 3 concentric quarter-circle arcs\nfunction fogSignal(): string {\n return svg(`\n <circle cx=\"4\" cy=\"20\" r=\"1.5\" fill=\"#d200d2\"/>\n <polygon points=\"4,17 14,13 14,27 4,23\" fill=\"#d200d2\" stroke=\"#d200d2\" stroke-width=\"0.6\"/>\n <path d=\"M15,14 A6,6 0 0,1 15,26\" fill=\"none\" stroke=\"#d200d2\" stroke-width=\"1.2\"/>\n <path d=\"M18,10 A10,10 0 0,1 18,30\" fill=\"none\" stroke=\"#d200d2\" stroke-width=\"1.2\"/>\n <path d=\"M21,6 A14,14 0 0,1 21,34\" fill=\"none\" stroke=\"#d200d2\" stroke-width=\"1.2\"/>\n `);\n}\n\n// ── S1: Radar Transponder / RACON ── S-52 RTPBCN01: circle with 3 upward dashed arcs\nfunction radarTransponder(): string {\n return svg(`\n <circle cx=\"16\" cy=\"22\" r=\"2.5\" fill=\"#d200d2\"/>\n <path d=\"M10,22 A6,6 0 0,1 22,22\" fill=\"none\" stroke=\"#d200d2\" stroke-width=\"1.2\" stroke-dasharray=\"3,2\"/>\n <path d=\"M6,22 A10,10 0 0,1 26,22\" fill=\"none\" stroke=\"#d200d2\" stroke-width=\"1.2\" stroke-dasharray=\"3,2\"/>\n <path d=\"M2,22 A14,14 0 0,1 30,22\" fill=\"none\" stroke=\"#d200d2\" stroke-width=\"1.2\" stroke-dasharray=\"3,2\"/>\n `);\n}\n\n// ═══════════════════════════════════════════════════════════\n// SECTION K: DANGERS (WRECKS, ROCKS, OBSTRUCTIONS)\n// ═══════════════════════════════════════════════════════════\n\n// ── K24: Wreck showing hull/mast above water ── S-52 WRECKS01\nfunction wreckVisible(): string {\n return svg(`\n <circle cx=\"16\" cy=\"29\" r=\"1.5\" fill=\"#000\"/>\n <path d=\"M5,22 L8,18 L24,18 L27,22\" fill=\"none\" stroke=\"#000\" stroke-width=\"1.2\"/>\n <path d=\"M5,22 Q16,26 27,22\" fill=\"none\" stroke=\"#000\" stroke-width=\"1.2\"/>\n <line x1=\"12\" y1=\"18\" x2=\"12\" y2=\"10\" stroke=\"#000\" stroke-width=\"1.5\"/>\n <line x1=\"20\" y1=\"18\" x2=\"20\" y2=\"12\" stroke=\"#000\" stroke-width=\"1.5\"/>\n <line x1=\"12\" y1=\"13\" x2=\"20\" y2=\"13\" stroke=\"#000\" stroke-width=\"0.8\"/>\n `);\n}\n\n// ── K26/K29: Submerged wreck ── S-52 WRECKS04: hull outline + dotted danger circle\nfunction wreckSubmerged(): string {\n return svg(`\n <circle cx=\"16\" cy=\"16\" r=\"11\" fill=\"none\" stroke=\"#000\" stroke-width=\"0.8\" stroke-dasharray=\"1.5,2\"/>\n <path d=\"M8,18 L10,14 L22,14 L24,18\" fill=\"none\" stroke=\"#000\" stroke-width=\"1\"/>\n <path d=\"M8,18 Q16,21 24,18\" fill=\"none\" stroke=\"#000\" stroke-width=\"1\"/>\n <line x1=\"12\" y1=\"14\" x2=\"12\" y2=\"10\" stroke=\"#000\" stroke-width=\"1\"/>\n <line x1=\"20\" y1=\"14\" x2=\"20\" y2=\"11\" stroke=\"#000\" stroke-width=\"1\"/>\n `);\n}\n\n// ── K28: Dangerous wreck ── S-52 WRECKS05: cross in danger circle\nfunction wreckDangerous(): string {\n return svg(`\n <circle cx=\"16\" cy=\"16\" r=\"10\" fill=\"none\" stroke=\"#000\" stroke-width=\"1.5\"/>\n <line x1=\"9\" y1=\"16\" x2=\"23\" y2=\"16\" stroke=\"#000\" stroke-width=\"1.5\"/>\n <line x1=\"16\" y1=\"9\" x2=\"16\" y2=\"23\" stroke=\"#000\" stroke-width=\"1.5\"/>\n `);\n}\n\n// ── K12: Rock awash at chart datum ── S-52 UWTROC03: simple cross (+)\nfunction rockAwash(): string {\n return svg(`\n <line x1=\"16\" y1=\"7\" x2=\"16\" y2=\"25\" stroke=\"#000\" stroke-width=\"2\"/>\n <line x1=\"7\" y1=\"16\" x2=\"25\" y2=\"16\" stroke=\"#000\" stroke-width=\"2\"/>\n `);\n}\n\n// ── K13: Underwater rock (with depth) ── S-52 UWTROC04: asterisk\nfunction rockUnderwater(): string {\n return svg(`\n <line x1=\"16\" y1=\"6\" x2=\"16\" y2=\"26\" stroke=\"#000\" stroke-width=\"1.5\"/>\n <line x1=\"6\" y1=\"16\" x2=\"26\" y2=\"16\" stroke=\"#000\" stroke-width=\"1.5\"/>\n <line x1=\"9\" y1=\"9\" x2=\"23\" y2=\"23\" stroke=\"#000\" stroke-width=\"1.2\"/>\n <line x1=\"23\" y1=\"9\" x2=\"9\" y2=\"23\" stroke=\"#000\" stroke-width=\"1.2\"/>\n `);\n}\n\n// ── K11: Rock covers and uncovers ── S-52 UWTROC01: cross + dotted circle\nfunction rockCoversUncovers(): string {\n return svg(`\n <line x1=\"16\" y1=\"7\" x2=\"16\" y2=\"25\" stroke=\"#000\" stroke-width=\"1.8\"/>\n <line x1=\"7\" y1=\"16\" x2=\"25\" y2=\"16\" stroke=\"#000\" stroke-width=\"1.8\"/>\n <circle cx=\"16\" cy=\"16\" r=\"10\" fill=\"none\" stroke=\"#000\" stroke-width=\"0.8\" stroke-dasharray=\"2,2\"/>\n `);\n}\n\n// ── K40: Obstruction ── S-52 OBSTRN01: cross with surrounding danger circle\nfunction obstruction(): string {\n return svg(`\n <line x1=\"16\" y1=\"8\" x2=\"16\" y2=\"24\" stroke=\"#000\" stroke-width=\"1.8\"/>\n <line x1=\"8\" y1=\"16\" x2=\"24\" y2=\"16\" stroke=\"#000\" stroke-width=\"1.8\"/>\n <circle cx=\"16\" cy=\"16\" r=\"10\" fill=\"none\" stroke=\"#000\" stroke-width=\"0.8\" stroke-dasharray=\"2,2\"/>\n `);\n}\n\n// ═══════════════════════════════════════════════════════════\n// SECTION E: LANDMARKS\n// ═══════════════════════════════════════════════════════════\n\n// ── E10.3: Church with spire ── S-52 LNDMRK02\nfunction landmarkSpire(): string {\n return svg(`\n <circle cx=\"16\" cy=\"16\" r=\"9\" fill=\"none\" stroke=\"#000\" stroke-width=\"0.6\" stroke-dasharray=\"2,2\"/>\n <polygon points=\"16,2 13,12 19,12\" fill=\"#000\" stroke=\"#000\" stroke-width=\"0.8\"/>\n <rect x=\"12\" y=\"12\" width=\"8\" height=\"16\" fill=\"#000\" stroke=\"#000\" stroke-width=\"0.8\"/>\n `);\n}\n\n// ── E20: Tower ── S-52 LNDMRK01\nfunction landmarkTower(): string {\n return svg(`\n <circle cx=\"16\" cy=\"16\" r=\"9\" fill=\"none\" stroke=\"#000\" stroke-width=\"0.6\" stroke-dasharray=\"2,2\"/>\n <path d=\"M13,4 L11,28 L21,28 L19,4 Z\" fill=\"#000\" stroke=\"#000\" stroke-width=\"0.8\"/>\n <line x1=\"11\" y1=\"4\" x2=\"21\" y2=\"4\" stroke=\"#000\" stroke-width=\"1\"/>\n `);\n}\n\n// ── E22: Chimney ── S-52 LNDMRK03\nfunction landmarkChimney(): string {\n return svg(`\n <circle cx=\"16\" cy=\"16\" r=\"9\" fill=\"none\" stroke=\"#000\" stroke-width=\"0.6\" stroke-dasharray=\"2,2\"/>\n <rect x=\"14\" y=\"8\" width=\"4\" height=\"20\" fill=\"#000\" stroke=\"#000\" stroke-width=\"0.8\"/>\n <path d=\"M13,8 Q16,2 19,8\" fill=\"none\" stroke=\"#000\" stroke-width=\"1\"/>\n `);\n}\n\n// ── E27: Flagstaff ── S-52 LNDMRK07\nfunction landmarkFlagstaff(): string {\n return svg(`\n <line x1=\"16\" y1=\"28\" x2=\"16\" y2=\"4\" stroke=\"#000\" stroke-width=\"1.5\"/>\n <polygon points=\"16,4 26,4 26,11 16,11\" fill=\"#d42e12\" stroke=\"#000\" stroke-width=\"0.8\"/>\n <circle cx=\"16\" cy=\"16\" r=\"7\" fill=\"none\" stroke=\"#000\" stroke-width=\"0.6\" stroke-dasharray=\"2,2\"/>\n `);\n}\n\n// ── E24: Monument ── S-52 LNDMRK08\nfunction landmarkMonument(): string {\n return svg(`\n <polygon points=\"16,3 10,26 22,26\" fill=\"#000\" stroke=\"#000\" stroke-width=\"0.8\"/>\n <rect x=\"8\" y=\"26\" width=\"16\" height=\"3\" fill=\"#000\"/>\n <circle cx=\"16\" cy=\"16\" r=\"7\" fill=\"none\" stroke=\"#000\" stroke-width=\"0.6\" stroke-dasharray=\"2,2\"/>\n `);\n}\n\n// ── E25: Traditional Windmill ── S-52 LNDMRK21: 4 vanes in X-pattern\nfunction landmarkWindmill(): string {\n return svg(`\n <line x1=\"16\" y1=\"28\" x2=\"16\" y2=\"10\" stroke=\"#000\" stroke-width=\"1.5\"/>\n <circle cx=\"16\" cy=\"10\" r=\"2\" fill=\"#000\"/>\n <line x1=\"16\" y1=\"10\" x2=\"6\" y2=\"2\" stroke=\"#000\" stroke-width=\"1.2\"/>\n <line x1=\"16\" y1=\"10\" x2=\"26\" y2=\"2\" stroke=\"#000\" stroke-width=\"1.2\"/>\n <line x1=\"16\" y1=\"10\" x2=\"6\" y2=\"18\" stroke=\"#000\" stroke-width=\"1.2\"/>\n <line x1=\"16\" y1=\"10\" x2=\"26\" y2=\"18\" stroke=\"#000\" stroke-width=\"1.2\"/>\n <circle cx=\"16\" cy=\"16\" r=\"7\" fill=\"none\" stroke=\"#000\" stroke-width=\"0.6\" stroke-dasharray=\"2,2\"/>\n `);\n}\n\n// ── E26.2: Wind Turbine ── S-52 LNDMRK22: 3-blade modern rotor\nfunction landmarkWindTurbine(): string {\n return svg(`\n <line x1=\"16\" y1=\"28\" x2=\"16\" y2=\"10\" stroke=\"#000\" stroke-width=\"1.5\"/>\n <circle cx=\"16\" cy=\"10\" r=\"1.5\" fill=\"#000\"/>\n <line x1=\"16\" y1=\"10\" x2=\"16\" y2=\"2\" stroke=\"#000\" stroke-width=\"1.2\"/>\n <line x1=\"16\" y1=\"10\" x2=\"9\" y2=\"17\" stroke=\"#000\" stroke-width=\"1.2\"/>\n <line x1=\"16\" y1=\"10\" x2=\"23\" y2=\"17\" stroke=\"#000\" stroke-width=\"1.2\"/>\n <circle cx=\"16\" cy=\"16\" r=\"7\" fill=\"none\" stroke=\"#000\" stroke-width=\"0.6\" stroke-dasharray=\"2,2\"/>\n `);\n}\n\n// ── E21: Dome / Cupola ── S-52 LNDMRK06\nfunction landmarkDome(): string {\n return svg(`\n <rect x=\"10\" y=\"18\" width=\"12\" height=\"10\" fill=\"#000\" stroke=\"#000\" stroke-width=\"0.8\"/>\n <path d=\"M10,18 Q16,4 22,18\" fill=\"#000\" stroke=\"#000\" stroke-width=\"0.8\"/>\n <circle cx=\"16\" cy=\"16\" r=\"7\" fill=\"none\" stroke=\"#000\" stroke-width=\"0.6\" stroke-dasharray=\"2,2\"/>\n `);\n}\n\n// ── E30: Radar Scanner ── S-52 LNDMRK12\nfunction landmarkRadarScanner(): string {\n return svg(`\n <line x1=\"16\" y1=\"28\" x2=\"16\" y2=\"14\" stroke=\"#000\" stroke-width=\"1.5\"/>\n <path d=\"M8,14 L16,6 L24,14\" fill=\"none\" stroke=\"#000\" stroke-width=\"1.5\"/>\n <line x1=\"16\" y1=\"6\" x2=\"16\" y2=\"14\" stroke=\"#000\" stroke-width=\"1\"/>\n <circle cx=\"16\" cy=\"16\" r=\"7\" fill=\"none\" stroke=\"#000\" stroke-width=\"0.6\" stroke-dasharray=\"2,2\"/>\n `);\n}\n\n// ── E31: Dish Aerial / Satellite Dish ── S-52 LNDMRK13\nfunction landmarkDishAerial(): string {\n return svg(`\n <line x1=\"16\" y1=\"28\" x2=\"16\" y2=\"14\" stroke=\"#000\" stroke-width=\"1.5\"/>\n <path d=\"M8,8 Q16,18 24,8\" fill=\"none\" stroke=\"#000\" stroke-width=\"1.5\"/>\n <line x1=\"16\" y1=\"14\" x2=\"16\" y2=\"8\" stroke=\"#000\" stroke-width=\"1\"/>\n <circle cx=\"16\" cy=\"16\" r=\"7\" fill=\"none\" stroke=\"#000\" stroke-width=\"0.6\" stroke-dasharray=\"2,2\"/>\n `);\n}\n\n// ── E21: Water Tower ── S-52 LNDMRK19\nfunction landmarkWaterTower(): string {\n return svg(`\n <rect x=\"12\" y=\"14\" width=\"8\" height=\"14\" fill=\"none\" stroke=\"#000\" stroke-width=\"1.2\"/>\n <rect x=\"9\" y=\"4\" width=\"14\" height=\"10\" rx=\"1\" fill=\"#000\" stroke=\"#000\" stroke-width=\"0.8\"/>\n <circle cx=\"16\" cy=\"16\" r=\"7\" fill=\"none\" stroke=\"#000\" stroke-width=\"0.6\" stroke-dasharray=\"2,2\"/>\n `);\n}\n\n// ── E28: Radio/TV Mast ── S-52 LNDMRK10\nfunction landmarkRadioTvMast(): string {\n return svg(`\n <line x1=\"16\" y1=\"28\" x2=\"16\" y2=\"4\" stroke=\"#000\" stroke-width=\"1.5\"/>\n <line x1=\"12\" y1=\"22\" x2=\"20\" y2=\"22\" stroke=\"#000\" stroke-width=\"0.8\"/>\n <line x1=\"13\" y1=\"18\" x2=\"19\" y2=\"18\" stroke=\"#000\" stroke-width=\"0.8\"/>\n <line x1=\"14\" y1=\"14\" x2=\"18\" y2=\"14\" stroke=\"#000\" stroke-width=\"0.8\"/>\n <circle cx=\"16\" cy=\"4\" r=\"1.5\" fill=\"#000\"/>\n <circle cx=\"16\" cy=\"16\" r=\"7\" fill=\"none\" stroke=\"#000\" stroke-width=\"0.6\" stroke-dasharray=\"2,2\"/>\n `);\n}\n\n// ── E12: Cross (religious) ── S-52 LNDMRK05\nfunction landmarkCross(): string {\n return svg(`\n <line x1=\"16\" y1=\"28\" x2=\"16\" y2=\"4\" stroke=\"#000\" stroke-width=\"2\"/>\n <line x1=\"10\" y1=\"10\" x2=\"22\" y2=\"10\" stroke=\"#000\" stroke-width=\"2\"/>\n <circle cx=\"16\" cy=\"16\" r=\"7\" fill=\"none\" stroke=\"#000\" stroke-width=\"0.6\" stroke-dasharray=\"2,2\"/>\n `);\n}\n\n// ── E28: Mast (general) ── S-52 LNDMRK11\nfunction landmarkMast(): string {\n return svg(`\n <line x1=\"16\" y1=\"28\" x2=\"16\" y2=\"4\" stroke=\"#000\" stroke-width=\"2\"/>\n <circle cx=\"16\" cy=\"4\" r=\"2\" fill=\"#000\"/>\n <circle cx=\"16\" cy=\"16\" r=\"7\" fill=\"none\" stroke=\"#000\" stroke-width=\"0.6\" stroke-dasharray=\"2,2\"/>\n `);\n}\n\n// ── E33: Silo ── S-52 LNDMRK17\nfunction landmarkSilo(): string {\n return svg(`\n <rect x=\"10\" y=\"10\" width=\"12\" height=\"18\" rx=\"0\" fill=\"#000\" stroke=\"#000\" stroke-width=\"0.8\"/>\n <path d=\"M10,10 Q16,2 22,10\" fill=\"#000\" stroke=\"#000\" stroke-width=\"0.8\"/>\n <circle cx=\"16\" cy=\"16\" r=\"7\" fill=\"none\" stroke=\"#000\" stroke-width=\"0.6\" stroke-dasharray=\"2,2\"/>\n `);\n}\n\n// ═══════════════════════════════════════════════════════════\n// SECTION N/L/F: FACILITIES AND INFRASTRUCTURE\n// ═══════════════════════════════════════════════════════════\n\n// ── L10: Offshore Platform ── S-52 OFSPLF01\nfunction offshorePlatform(): string {\n return svg(`\n <circle cx=\"16\" cy=\"29\" r=\"1.5\" fill=\"#000\"/>\n <rect x=\"8\" y=\"6\" width=\"16\" height=\"16\" fill=\"none\" stroke=\"#000\" stroke-width=\"1.5\"/>\n <line x1=\"8\" y1=\"6\" x2=\"24\" y2=\"22\" stroke=\"#000\" stroke-width=\"1\"/>\n <line x1=\"24\" y1=\"6\" x2=\"8\" y2=\"22\" stroke=\"#000\" stroke-width=\"1\"/>\n <circle cx=\"16\" cy=\"14\" r=\"3\" fill=\"#000\"/>\n `);\n}\n\n// ── N12: Anchorage ── S-52 ACHARE01: anchor symbol\nfunction anchor(): string {\n return svg(`\n <circle cx=\"16\" cy=\"6\" r=\"3\" fill=\"none\" stroke=\"#d200d2\" stroke-width=\"1.5\"/>\n <line x1=\"16\" y1=\"9\" x2=\"16\" y2=\"26\" stroke=\"#d200d2\" stroke-width=\"1.8\"/>\n <path d=\"M9,22 Q12,28 16,26 Q20,28 23,22\" fill=\"none\" stroke=\"#d200d2\" stroke-width=\"1.8\"/>\n <line x1=\"11\" y1=\"12\" x2=\"21\" y2=\"12\" stroke=\"#d200d2\" stroke-width=\"1.5\"/>\n `);\n}\n\n// ── F53: Crane ── S-52 CRANES01: port crane\nfunction crane(): string {\n return svg(`\n <circle cx=\"16\" cy=\"29\" r=\"1.5\" fill=\"#000\"/>\n <line x1=\"16\" y1=\"27.5\" x2=\"16\" y2=\"8\" stroke=\"#000\" stroke-width=\"2\"/>\n <line x1=\"16\" y1=\"8\" x2=\"26\" y2=\"4\" stroke=\"#000\" stroke-width=\"1.5\"/>\n <line x1=\"16\" y1=\"12\" x2=\"26\" y2=\"4\" stroke=\"#000\" stroke-width=\"0.8\" stroke-dasharray=\"2,1\"/>\n <rect x=\"12\" y=\"26\" width=\"8\" height=\"2\" fill=\"#000\"/>\n `);\n}\n\n// ── D20: Bridge — fixed bridge, solid arch ── S-52 BRIDGE01 (INT1 D20)\nfunction bridgeFixed(chblk = \"#000\", movable = \"#d200d2\"): string {\n return svg(`\n <line x1=\"4\" y1=\"14\" x2=\"28\" y2=\"14\" stroke=\"${chblk}\" stroke-width=\"2\"/>\n <line x1=\"8\" y1=\"14\" x2=\"8\" y2=\"24\" stroke=\"${chblk}\" stroke-width=\"1.8\"/>\n <line x1=\"24\" y1=\"14\" x2=\"24\" y2=\"24\" stroke=\"${chblk}\" stroke-width=\"1.8\"/>\n <path d=\"M8,14 Q16,6 24,14\" fill=\"none\" stroke=\"${chblk}\" stroke-width=\"1.5\"/>\n `);\n}\n\n// ── D21: Opening Bridge — dashed arch indicates movable span ── S-52 BRIDGE01\nfunction bridgeOpening(chblk = \"#000\", movable = \"#d200d2\"): string {\n return svg(`\n <line x1=\"4\" y1=\"14\" x2=\"28\" y2=\"14\" stroke=\"${chblk}\" stroke-width=\"2\"/>\n <line x1=\"8\" y1=\"14\" x2=\"8\" y2=\"24\" stroke=\"${chblk}\" stroke-width=\"1.8\"/>\n <line x1=\"24\" y1=\"14\" x2=\"24\" y2=\"24\" stroke=\"${chblk}\" stroke-width=\"1.8\"/>\n <path d=\"M8,14 Q16,6 24,14\" fill=\"none\" stroke=\"${movable}\" stroke-width=\"1.5\" stroke-dasharray=\"3,2\"/>\n `);\n}\n\n// ── D23.2: Bascule Bridge — tilting leaf indicated by angled line ── S-52 BRIDGE01\nfunction bridgeBascule(chblk = \"#000\", movable = \"#d200d2\"): string {\n return svg(`\n <line x1=\"4\" y1=\"14\" x2=\"28\" y2=\"14\" stroke=\"${chblk}\" stroke-width=\"2\"/>\n <line x1=\"8\" y1=\"14\" x2=\"8\" y2=\"24\" stroke=\"${chblk}\" stroke-width=\"1.8\"/>\n <line x1=\"24\" y1=\"14\" x2=\"24\" y2=\"24\" stroke=\"${chblk}\" stroke-width=\"1.8\"/>\n <line x1=\"14\" y1=\"14\" x2=\"20\" y2=\"6\" stroke=\"${movable}\" stroke-width=\"2\"/>\n <circle cx=\"14\" cy=\"14\" r=\"1.5\" fill=\"${movable}\"/>\n `);\n}\n\n// ── D23.3: Swing Bridge — pivot indicated by rotation arc ── S-52 BRIDGE01\nfunction bridgeSwing(chblk = \"#000\", movable = \"#d200d2\"): string {\n return svg(`\n <line x1=\"4\" y1=\"14\" x2=\"28\" y2=\"14\" stroke=\"${chblk}\" stroke-width=\"2\"/>\n <line x1=\"8\" y1=\"14\" x2=\"8\" y2=\"24\" stroke=\"${chblk}\" stroke-width=\"1.8\"/>\n <line x1=\"24\" y1=\"14\" x2=\"24\" y2=\"24\" stroke=\"${chblk}\" stroke-width=\"1.8\"/>\n <circle cx=\"16\" cy=\"14\" r=\"3\" fill=\"none\" stroke=\"${movable}\" stroke-width=\"1.5\"/>\n <circle cx=\"16\" cy=\"14\" r=\"1\" fill=\"${movable}\"/>\n `);\n}\n\n// ── D23.1: Lifting Bridge — upward arrows indicate vertical lift ── S-52 BRIDGE01\nfunction bridgeLifting(chblk = \"#000\", movable = \"#d200d2\"): string {\n return svg(`\n <line x1=\"4\" y1=\"16\" x2=\"28\" y2=\"16\" stroke=\"${chblk}\" stroke-width=\"2\"/>\n <line x1=\"8\" y1=\"16\" x2=\"8\" y2=\"24\" stroke=\"${chblk}\" stroke-width=\"1.8\"/>\n <line x1=\"24\" y1=\"16\" x2=\"24\" y2=\"24\" stroke=\"${chblk}\" stroke-width=\"1.8\"/>\n <line x1=\"12\" y1=\"16\" x2=\"12\" y2=\"6\" stroke=\"${movable}\" stroke-width=\"1.5\"/>\n <polygon points=\"12,4 9,8 15,8\" fill=\"${movable}\"/>\n <line x1=\"20\" y1=\"16\" x2=\"20\" y2=\"6\" stroke=\"${movable}\" stroke-width=\"1.5\"/>\n <polygon points=\"20,4 17,8 23,8\" fill=\"${movable}\"/>\n `);\n}\n\n// ── Q31: Single Point Mooring ── S-52 MORFAC04\nfunction spm(): string {\n return svg(`\n <circle cx=\"16\" cy=\"29\" r=\"1.5\" fill=\"#000\"/>\n <line x1=\"16\" y1=\"27.5\" x2=\"16\" y2=\"24\" stroke=\"#000\" stroke-width=\"1\"/>\n <circle cx=\"16\" cy=\"16\" r=\"8\" fill=\"none\" stroke=\"#000\" stroke-width=\"1.5\"/>\n <line x1=\"16\" y1=\"8\" x2=\"16\" y2=\"24\" stroke=\"#000\" stroke-width=\"1.2\"/>\n <line x1=\"8\" y1=\"16\" x2=\"24\" y2=\"16\" stroke=\"#000\" stroke-width=\"1.2\"/>\n <circle cx=\"16\" cy=\"16\" r=\"2.5\" fill=\"#ffd700\" stroke=\"#000\" stroke-width=\"0.8\"/>\n `);\n}\n\n// ═══════════════════════════════════════════════════════════\n// SECTION T: SERVICES\n// ═══════════════════════════════════════════════════════════\n\n// ── T1.1: Pilot Station / Boarding Place ── S-52 PILBOP01: circle with P (path outline)\nfunction pilotStation(): string {\n return svg(`\n <circle cx=\"16\" cy=\"16\" r=\"10\" fill=\"none\" stroke=\"#d200d2\" stroke-width=\"1.5\"/>\n <path d=\"M12,22 L12,9 L18,9 Q22,9 22,13 Q22,17 18,17 L12,17\" fill=\"none\" stroke=\"#d200d2\" stroke-width=\"1.8\"/>\n `);\n}\n\n// ── T20: Signal Station ── S-52 SISTAT01\nfunction signalStation(): string {\n return svg(`\n <line x1=\"16\" y1=\"28\" x2=\"16\" y2=\"6\" stroke=\"#000\" stroke-width=\"1.5\"/>\n <polygon points=\"16,6 26,6 26,14 16,14\" fill=\"#d200d2\" stroke=\"#000\" stroke-width=\"0.8\"/>\n <polygon points=\"16,14 26,14 26,18 16,18\" fill=\"#ffd700\" stroke=\"#000\" stroke-width=\"0.8\"/>\n `);\n}\n\n// ── T10: Coast Guard Station ── S-52 CGUSTA01: circle with CG (path outlines)\nfunction coastguardStation(): string {\n return svg(`\n <circle cx=\"16\" cy=\"16\" r=\"10\" fill=\"none\" stroke=\"#d200d2\" stroke-width=\"1.5\"/>\n <path d=\"M13,12 Q10,12 10,16 Q10,20 13,20\" fill=\"none\" stroke=\"#d200d2\" stroke-width=\"1.5\"/>\n <path d=\"M17,12 L22,12 L22,16 L19,16 L19,15 L22,20 L17,20\" fill=\"none\" stroke=\"#d200d2\" stroke-width=\"1.2\"/>\n `);\n}\n\n// ═══════════════════════════════════════════════════════════\n// SECTION M: TRACKS AND ROUTES\n// ═══════════════════════════════════════════════════════════\n\n// ── M5: Recommended Track ── S-52 RECTRC01\nfunction recommendedTrack(): string {\n return svg(`\n <line x1=\"4\" y1=\"16\" x2=\"24\" y2=\"16\" stroke=\"#d200d2\" stroke-width=\"1.5\"/>\n <polygon points=\"24,16 18,12 18,20\" fill=\"#d200d2\"/>\n `);\n}\n\n// ── M50: Ferry Route ── S-52 FERYRT01\nfunction ferryRoute(): string {\n return svg(`\n <line x1=\"4\" y1=\"16\" x2=\"28\" y2=\"16\" stroke=\"#d200d2\" stroke-width=\"1.2\" stroke-dasharray=\"4,3\"/>\n <polygon points=\"28,16 22,12 22,20\" fill=\"#d200d2\"/>\n `);\n}\n\n// ═══════════════════════════════════════════════════════════\n// SYMBOL REGISTRY\n// ═══════════════════════════════════════════════════════════\n\n/** Color used in the SVG with its S-52 token name, hex, and usage */\nexport interface SymbolColor {\n token: string;\n hex: string;\n usage: string;\n}\n\n/** Line style used in the SVG */\nexport interface SymbolLineStyle {\n element: string;\n width: number;\n pattern?: string;\n color: string;\n}\n\n/** Fill element used in the SVG */\nexport interface SymbolFillElement {\n element: string;\n color: string;\n opacity?: number;\n}\n\nexport interface NauticalSymbol {\n id: string;\n label: string;\n /** INT1 / Chart No. 1 reference */\n int1Ref: string;\n /** Chart No. 1 section letter */\n section: string;\n getSvg: () => string;\n /** Generate SVG with theme-specific colors (for bridge icons etc.) */\n getThemedSvg?: (chblk: string, movable: string) => string;\n /** What this symbol represents on a chart */\n description?: string;\n /** S-52 Presentation Library symbol name */\n s52PlRef?: string;\n /** Grouping key for family clustering */\n group?: string;\n /** IDs of related variant symbols */\n variants?: string[];\n /** S-57 attribute that selects this variant */\n attributeKey?: string;\n /** Value of that attribute for this variant */\n attributeValue?: number;\n /** Example label strings seen on charts */\n labelExamples?: string[];\n /** What the color represents */\n colorMeaning?: string;\n /** Colors used in the SVG */\n colors?: SymbolColor[];\n /** Line/stroke styles used in the SVG */\n lineStyles?: SymbolLineStyle[];\n /** Fill regions in the SVG */\n fillElements?: SymbolFillElement[];\n /** Expanded navigational usage context (2-4 sentences) */\n usageContext?: string;\n /** Render size for documentation */\n renderSize?: string;\n}\n\n/** A logical grouping of related symbols */\nexport interface SymbolGroup {\n id: string;\n label: string;\n section: string;\n description: string;\n symbolIds: string[];\n}\n\n/** Chart No. 1 section metadata */\nexport interface ChartSection {\n id: string;\n label: string;\n description: string;\n}\n\nexport const NAUTICAL_SYMBOLS: NauticalSymbol[] = [\n // ── Section Q: Lateral Buoys ──\n { id: \"buoy-can\", label: \"Can Buoy (Port, IALA-B)\", int1Ref: \"Q20\", section: \"Q\", getSvg: buoyCan,\n group: \"lateral-buoys\", description: \"Flat-top cylindrical buoy marking the port side of a channel (IALA Region B). Painted red in US waters.\",\n s52PlRef: \"BOYCAN01\", attributeKey: \"CATLAM\", attributeValue: 1,\n variants: [\"buoy-can\", \"buoy-nun\"], labelExamples: ['\"2\"', '\"4\"', '\"6A\"'],\n colorMeaning: \"Red = port side (IALA-B)\",\n renderSize: \"32x32\",\n colors: [\n { token: \"IALA-B Port Red\", hex: \"#d42e12\", usage: \"Hull fill\" },\n { token: \"CHBLK\", hex: \"#000000\", usage: \"Outline and mooring staff\" },\n ],\n lineStyles: [\n { element: \"Mooring staff\", width: 1.2, color: \"#000000\" },\n { element: \"Hull outline\", width: 1.2, color: \"#000000\" },\n ],\n fillElements: [\n { element: \"Cylindrical hull\", color: \"#d42e12\" },\n ],\n usageContext: \"A lateral buoy marks the port or starboard side of the route to be followed. In IALA Region B (Americas, Japan, Korea), red can buoys mark the port (left) side when returning from sea. Mariners should keep this buoy to port when proceeding upstream or into harbour. They are numbered with even numbers ascending from seaward.\" },\n\n { id: \"buoy-nun\", label: \"Nun Buoy (Starboard, IALA-B)\", int1Ref: \"Q21\", section: \"Q\", getSvg: buoyNun,\n group: \"lateral-buoys\", description: \"Conical/pointed-top buoy marking the starboard side of a channel (IALA Region B). Painted green in US waters.\",\n s52PlRef: \"BOYLAT15\", attributeKey: \"CATLAM\", attributeValue: 2,\n variants: [\"buoy-can\", \"buoy-nun\"], labelExamples: ['\"1\"', '\"3\"', '\"5\"'],\n colorMeaning: \"Green = starboard side (IALA-B)\",\n renderSize: \"32x32\",\n colors: [\n { token: \"IALA-B Stbd Green\", hex: \"#00843d\", usage: \"Hull fill\" },\n { token: \"CHBLK\", hex: \"#000000\", usage: \"Outline and mooring staff\" },\n ],\n lineStyles: [\n { element: \"Mooring staff\", width: 1.2, color: \"#000000\" },\n { element: \"Hull outline\", width: 1.2, color: \"#000000\" },\n ],\n fillElements: [\n { element: \"Conical hull\", color: \"#00843d\" },\n ],\n usageContext: \"A nun buoy marks the starboard (right) side of a channel when returning from sea in IALA Region B. Green conical buoys are numbered with odd numbers. Mariners should keep this buoy to starboard when proceeding upstream. The pointed top distinguishes it from the flat-topped can buoy.\" },\n\n // ── Section Q: Buoy Hull Shapes ──\n { id: \"buoy-spar\", label: \"Spar Buoy\", int1Ref: \"Q22\", section: \"Q\", getSvg: buoySpar,\n group: \"buoy-shapes\", description: \"Tall, thin vertical pole buoy. Used for lateral marks in shallow or confined waters.\",\n s52PlRef: \"BOYSPR01\", labelExamples: ['\"Fl G 4s\"'],\n renderSize: \"32x32\",\n colors: [\n { token: \"CHBLK\", hex: \"#000000\", usage: \"Pole body\" },\n { token: \"IALA-B Port Red\", hex: \"#d42e12\", usage: \"Top ball\" },\n ],\n lineStyles: [\n { element: \"Pole shaft\", width: 2.5, color: \"#000000\" },\n { element: \"Top ball outline\", width: 0.8, color: \"#000000\" },\n ],\n fillElements: [\n { element: \"Top ball\", color: \"#d42e12\" },\n ],\n usageContext: \"Spar buoys are tall, thin pole-like buoys used in shallow or confined waters where larger buoys cannot be deployed. Their slim profile makes them suitable for narrow channels. They carry the same color coding and meaning as other lateral buoys in the IALA system.\" },\n\n { id: \"buoy-pillar\", label: \"Pillar Buoy\", int1Ref: \"Q23\", section: \"Q\", getSvg: buoyPillar,\n group: \"buoy-shapes\", description: \"Tall narrow cylinder buoy. Used for cardinal, isolated danger, and special purpose marks.\",\n s52PlRef: \"BOYPIL01\",\n renderSize: \"32x32\",\n colors: [\n { token: \"Cardinal Yellow\", hex: \"#ffd700\", usage: \"Hull fill\" },\n { token: \"CHBLK\", hex: \"#000000\", usage: \"Outline and staff\" },\n ],\n lineStyles: [\n { element: \"Mooring staff\", width: 1.2, color: \"#000000\" },\n { element: \"Hull outline\", width: 1.0, color: \"#000000\" },\n ],\n fillElements: [\n { element: \"Tall cylindrical hull\", color: \"#ffd700\" },\n ],\n usageContext: \"Pillar buoys have a tall, narrow cylindrical shape and are commonly used for cardinal marks, isolated danger marks, and other special purpose buoys. Their height makes them more visible and provides room for topmarks, lights, and radar reflectors.\" },\n\n { id: \"buoy-spherical\", label: \"Spherical Buoy\", int1Ref: \"Q24\", section: \"Q\", getSvg: buoySpherical,\n group: \"buoy-shapes\", description: \"Round-shaped buoy typically used for safe water marks. Red and white vertical stripes.\",\n s52PlRef: \"BOYSPH01\", colorMeaning: \"Red/white = safe water\",\n renderSize: \"32x32\",\n colors: [\n { token: \"IALA-B Port Red\", hex: \"#d42e12\", usage: \"Hull fill\" },\n { token: \"CHBLK\", hex: \"#000000\", usage: \"Hull outline\" },\n { token: \"White\", hex: \"#ffffff\", usage: \"Equator band\" },\n ],\n lineStyles: [\n { element: \"Mooring staff\", width: 1.2, color: \"#000000\" },\n { element: \"Hull outline\", width: 1.0, color: \"#000000\" },\n { element: \"Equator band\", width: 1.5, color: \"#ffffff\" },\n ],\n fillElements: [\n { element: \"Spherical hull\", color: \"#d42e12\" },\n ],\n usageContext: \"Spherical buoys are round in shape and typically used as safe water marks, indicating navigable water all around. The red and white colour scheme indicates that the mark is a mid-channel or fairway buoy. Vessels may pass on either side.\" },\n\n { id: \"buoy-barrel\", label: \"Barrel/Tun Buoy\", int1Ref: \"Q25\", section: \"Q\", getSvg: buoyBarrel,\n group: \"buoy-shapes\", description: \"Barrel or tun-shaped buoy, typically used for mooring or special marks.\",\n s52PlRef: \"BOYBAR01\",\n renderSize: \"32x32\",\n colors: [\n { token: \"Special Yellow\", hex: \"#ffd700\", usage: \"Hull fill\" },\n { token: \"CHBLK\", hex: \"#000000\", usage: \"Outline and centre band\" },\n ],\n lineStyles: [\n { element: \"Mooring staff\", width: 1.2, color: \"#000000\" },\n { element: \"Hull outline\", width: 1.0, color: \"#000000\" },\n { element: \"Centre band\", width: 0.6, color: \"#000000\" },\n ],\n fillElements: [\n { element: \"Barrel hull\", color: \"#ffd700\" },\n ],\n usageContext: \"Barrel or tun buoys have a distinctive rounded barrel shape. They are commonly used for mooring buoys and some special purpose marks. Their squat, stable shape makes them suitable for sheltered waters.\" },\n\n { id: \"buoy-super\", label: \"Super Buoy / LANBY\", int1Ref: \"Q26\", section: \"Q\", getSvg: buoySuper,\n group: \"buoy-shapes\", description: \"Large navigation buoy (LANBY). Replaces lightships at major approaches.\",\n s52PlRef: \"BOYSUP01\", labelExamples: ['\"LANBY\"', '\"Fl(4) W 15s\"'],\n renderSize: \"32x32\",\n colors: [\n { token: \"IALA-B Port Red\", hex: \"#d42e12\", usage: \"Hull body\" },\n { token: \"CHBLK\", hex: \"#000000\", usage: \"Outline and mast\" },\n { token: \"Cardinal Yellow\", hex: \"#ffd700\", usage: \"Light housing\" },\n ],\n lineStyles: [\n { element: \"Mooring staff\", width: 1.5, color: \"#000000\" },\n { element: \"Hull outline\", width: 1.2, color: \"#000000\" },\n { element: \"Mast\", width: 1.5, color: \"#000000\" },\n { element: \"Light housing outline\", width: 0.6, color: \"#000000\" },\n ],\n fillElements: [\n { element: \"Hull body\", color: \"#d42e12\" },\n { element: \"Light housing\", color: \"#ffd700\" },\n ],\n usageContext: \"Super buoys (LANBY — Large Automatic Navigation Buoy) are very large buoys that have replaced lightships at major harbour approaches. They carry powerful lights, fog signals, and radar equipment. They are critical aids for ocean-going vessels making landfall.\" },\n\n // ── Section Q: Cardinal Buoys ──\n { id: \"buoy-cardinal-north\", label: \"Cardinal Buoy, North\", int1Ref: \"Q130.3\", section: \"Q\", getSvg: buoyCardinalNorth,\n group: \"cardinal-buoys\", description: \"Pass to the NORTH of this mark. Topmark: two cones pointing up ▲▲. Black over yellow.\",\n s52PlRef: \"BOYCAR01\", attributeKey: \"CATCAM\", attributeValue: 1,\n variants: [\"buoy-cardinal-north\", \"buoy-cardinal-south\", \"buoy-cardinal-east\", \"buoy-cardinal-west\"],\n labelExamples: ['\"Q\"', '\"VQ\"'], colorMeaning: \"Black/yellow = cardinal\",\n renderSize: \"32x32\",\n colors: [\n { token: \"Cardinal Yellow\", hex: \"#ffd700\", usage: \"Hull body (lower)\" },\n { token: \"CHBLK\", hex: \"#000000\", usage: \"Upper band, topmark cones, outline\" },\n ],\n lineStyles: [\n { element: \"Staff\", width: 1.0, color: \"#000000\" },\n { element: \"Hull outline\", width: 0.8, color: \"#000000\" },\n ],\n fillElements: [\n { element: \"Hull body (lower)\", color: \"#ffd700\" },\n { element: \"Upper band\", color: \"#000000\" },\n { element: \"Topmark cone 1 (up)\", color: \"#000000\" },\n { element: \"Topmark cone 2 (up)\", color: \"#000000\" },\n ],\n usageContext: \"A North cardinal buoy indicates that the deepest or safest water lies to the NORTH of the mark. The topmark of two upward-pointing cones is the key identifier. The light character is continuous quick (Q) or very quick (VQ) flashing. Mariners must pass to the north of this buoy to avoid the hazard it marks.\" },\n\n { id: \"buoy-cardinal-south\", label: \"Cardinal Buoy, South\", int1Ref: \"Q130.3\", section: \"Q\", getSvg: buoyCardinalSouth,\n group: \"cardinal-buoys\", description: \"Pass to the SOUTH of this mark. Topmark: two cones pointing down ▼▼. Yellow over black.\",\n s52PlRef: \"BOYCAR01\", attributeKey: \"CATCAM\", attributeValue: 3,\n variants: [\"buoy-cardinal-north\", \"buoy-cardinal-south\", \"buoy-cardinal-east\", \"buoy-cardinal-west\"],\n labelExamples: ['\"Q(6)+LFl\"', '\"VQ(6)+LFl\"'], colorMeaning: \"Yellow/black = cardinal\",\n renderSize: \"32x32\",\n colors: [\n { token: \"Cardinal Yellow\", hex: \"#ffd700\", usage: \"Hull body (upper)\" },\n { token: \"CHBLK\", hex: \"#000000\", usage: \"Lower band, topmark cones, outline\" },\n ],\n lineStyles: [\n { element: \"Staff\", width: 1.0, color: \"#000000\" },\n { element: \"Hull outline\", width: 0.8, color: \"#000000\" },\n ],\n fillElements: [\n { element: \"Hull body (upper)\", color: \"#ffd700\" },\n { element: \"Lower band\", color: \"#000000\" },\n { element: \"Topmark cone 1 (down)\", color: \"#000000\" },\n { element: \"Topmark cone 2 (down)\", color: \"#000000\" },\n ],\n usageContext: \"A South cardinal buoy indicates the safest water lies to the SOUTH. The topmark of two downward-pointing cones distinguishes it. Light character is Q(6)+LFl or VQ(6)+LFl — six flashes followed by a long flash. This unique rhythm helps identify it at night.\" },\n\n { id: \"buoy-cardinal-east\", label: \"Cardinal Buoy, East\", int1Ref: \"Q130.3\", section: \"Q\", getSvg: buoyCardinalEast,\n group: \"cardinal-buoys\", description: \"Pass to the EAST of this mark. Topmark: cones base-to-base ◆. Black-yellow-black.\",\n s52PlRef: \"BOYCAR01\", attributeKey: \"CATCAM\", attributeValue: 2,\n variants: [\"buoy-cardinal-north\", \"buoy-cardinal-south\", \"buoy-cardinal-east\", \"buoy-cardinal-west\"],\n labelExamples: ['\"Q(3)\"', '\"VQ(3)\"'],\n renderSize: \"32x32\",\n colors: [\n { token: \"Cardinal Yellow\", hex: \"#ffd700\", usage: \"Hull body (middle band)\" },\n { token: \"CHBLK\", hex: \"#000000\", usage: \"Upper/lower bands, topmark cones\" },\n ],\n lineStyles: [\n { element: \"Staff\", width: 1.0, color: \"#000000\" },\n { element: \"Hull outline\", width: 0.8, color: \"#000000\" },\n ],\n fillElements: [\n { element: \"Hull upper band\", color: \"#000000\" },\n { element: \"Hull middle band\", color: \"#ffd700\" },\n { element: \"Hull lower band\", color: \"#000000\" },\n { element: \"Topmark (base-to-base diamond)\", color: \"#000000\" },\n ],\n usageContext: \"An East cardinal buoy indicates the safest water lies to the EAST. The topmark of two cones base-to-base forms a diamond shape. Light character is Q(3) or VQ(3) — three flashes in a group. The body is painted black-yellow-black in horizontal bands.\" },\n\n { id: \"buoy-cardinal-west\", label: \"Cardinal Buoy, West\", int1Ref: \"Q130.3\", section: \"Q\", getSvg: buoyCardinalWest,\n group: \"cardinal-buoys\", description: \"Pass to the WEST of this mark. Topmark: cones point-to-point (hourglass). Yellow-black-yellow.\",\n s52PlRef: \"BOYCAR01\", attributeKey: \"CATCAM\", attributeValue: 4,\n variants: [\"buoy-cardinal-north\", \"buoy-cardinal-south\", \"buoy-cardinal-east\", \"buoy-cardinal-west\"],\n labelExamples: ['\"Q(9)\"', '\"VQ(9)\"'],\n renderSize: \"32x32\",\n colors: [\n { token: \"Cardinal Yellow\", hex: \"#ffd700\", usage: \"Hull upper/lower bands\" },\n { token: \"CHBLK\", hex: \"#000000\", usage: \"Hull middle band, topmark cones\" },\n ],\n lineStyles: [\n { element: \"Staff\", width: 1.0, color: \"#000000\" },\n { element: \"Hull outline\", width: 0.8, color: \"#000000\" },\n ],\n fillElements: [\n { element: \"Hull upper band\", color: \"#ffd700\" },\n { element: \"Hull middle band\", color: \"#000000\" },\n { element: \"Hull lower band\", color: \"#ffd700\" },\n { element: \"Topmark (point-to-point hourglass)\", color: \"#000000\" },\n ],\n usageContext: \"A West cardinal buoy indicates the safest water lies to the WEST. The topmark of two cones point-to-point forms an hourglass shape. Light character is Q(9) or VQ(9) — nine flashes. The body is painted yellow-black-yellow.\" },\n\n // ── Section Q: Special Purpose Buoys ──\n { id: \"buoy-isolated-danger\", label: \"Isolated Danger Buoy\", int1Ref: \"Q130.4\", section: \"Q\", getSvg: buoyIsolatedDanger,\n group: \"special-buoys\", description: \"Marks an isolated danger with navigable water all around. Black with red horizontal band(s). Topmark: two spheres.\",\n s52PlRef: \"BOYISD01\", labelExamples: ['\"Fl(2)\"'], colorMeaning: \"Black/red band = isolated danger\",\n renderSize: \"32x32\",\n colors: [\n { token: \"CHBLK\", hex: \"#000000\", usage: \"Hull body and topmark spheres\" },\n { token: \"IALA-B Port Red\", hex: \"#d42e12\", usage: \"Horizontal danger band\" },\n ],\n lineStyles: [\n { element: \"Staff\", width: 1.0, color: \"#000000\" },\n { element: \"Hull outline\", width: 0.8, color: \"#000000\" },\n ],\n fillElements: [\n { element: \"Hull body\", color: \"#000000\" },\n { element: \"Red danger band\", color: \"#d42e12\" },\n { element: \"Topmark sphere 1\", color: \"#000000\" },\n { element: \"Topmark sphere 2\", color: \"#000000\" },\n ],\n usageContext: \"An isolated danger buoy is placed over an isolated danger with navigable water all around it. The hazard is of limited extent. Vessels may pass on any side but should not approach too closely. The distinctive two-sphere topmark and Fl(2) light character distinguish it from all other marks.\" },\n\n { id: \"buoy-safe-water\", label: \"Safe Water Buoy\", int1Ref: \"Q130.5\", section: \"Q\", getSvg: buoySafeWater,\n group: \"special-buoys\", description: \"Indicates navigable water around the mark (fairway/mid-channel). Red and white vertical stripes. Topmark: single sphere.\",\n s52PlRef: \"BOYSAW01\", labelExamples: ['\"Mo(A)\"', '\"LFl 10s\"'], colorMeaning: \"Red/white stripes = safe water\",\n renderSize: \"32x32\",\n colors: [\n { token: \"IALA-B Port Red\", hex: \"#d42e12\", usage: \"Vertical stripes and topmark\" },\n { token: \"White\", hex: \"#ffffff\", usage: \"Hull background between stripes\" },\n { token: \"CHBLK\", hex: \"#000000\", usage: \"Outline and staff\" },\n ],\n lineStyles: [\n { element: \"Staff\", width: 1.0, color: \"#000000\" },\n { element: \"Hull outline\", width: 0.8, color: \"#000000\" },\n { element: \"Topmark outline\", width: 0.6, color: \"#000000\" },\n ],\n fillElements: [\n { element: \"Hull background\", color: \"#ffffff\" },\n { element: \"Vertical stripe 1\", color: \"#d42e12\" },\n { element: \"Vertical stripe 2\", color: \"#d42e12\" },\n { element: \"Topmark sphere\", color: \"#d42e12\" },\n ],\n usageContext: \"A safe water mark indicates there is navigable water all around the mark. It is used as a centreline, mid-channel, or landfall buoy. Light character is isophase, occulting, single long flash every 10 seconds, or Morse code 'A'. Vessels may pass on either side.\" },\n\n { id: \"buoy-special\", label: \"Special Purpose Buoy\", int1Ref: \"Q130.6\", section: \"Q\", getSvg: buoySpecial,\n group: \"special-buoys\", description: \"Marks special areas (pipelines, cables, ODAS, recreation zones). Painted yellow. Topmark: X shape.\",\n s52PlRef: \"BOYSPP01\", labelExamples: ['\"SPM\"', '\"ODAS\"', '\"Fl Y 5s\"'], colorMeaning: \"Yellow = special purpose\",\n renderSize: \"32x32\",\n colors: [\n { token: \"Special Yellow\", hex: \"#ffd700\", usage: \"Hull fill\" },\n { token: \"CHBLK\", hex: \"#000000\", usage: \"Outline, staff, and X topmark\" },\n ],\n lineStyles: [\n { element: \"Staff\", width: 1.0, color: \"#000000\" },\n { element: \"Hull outline\", width: 0.8, color: \"#000000\" },\n { element: \"X topmark arms\", width: 1.5, color: \"#000000\" },\n ],\n fillElements: [\n { element: \"Hull body\", color: \"#ffd700\" },\n ],\n usageContext: \"Special purpose buoys mark areas for specific activities — pipelines, cables, ocean data acquisition systems (ODAS), recreation zones, military exercise areas, or other administrative boundaries. They are always yellow with an X-shaped topmark. Their light, if fitted, is also yellow.\" },\n\n { id: \"buoy-emergency-wreck\", label: \"Emergency Wreck Marking Buoy\", int1Ref: \"Q130.8\", section: \"Q\", getSvg: buoyEmergencyWreck,\n group: \"special-buoys\", description: \"Temporary mark placed over a new wreck. Blue and yellow vertical stripes. Topmark: yellow X.\",\n s52PlRef: \"BOYEWM01\", labelExamples: ['\"Al.Bl.Y 3s\"'], colorMeaning: \"Blue/yellow = emergency wreck\",\n renderSize: \"32x32\",\n colors: [\n { token: \"Emergency Blue\", hex: \"#0047ab\", usage: \"Hull body\" },\n { token: \"Cardinal Yellow\", hex: \"#ffd700\", usage: \"Vertical stripes and X topmark\" },\n { token: \"CHBLK\", hex: \"#000000\", usage: \"Outline and X topmark outline\" },\n ],\n lineStyles: [\n { element: \"Staff\", width: 1.0, color: \"#000000\" },\n { element: \"Hull outline\", width: 0.8, color: \"#000000\" },\n { element: \"X topmark (yellow fill)\", width: 2.0, color: \"#ffd700\" },\n { element: \"X topmark (outline)\", width: 0.8, color: \"#000000\" },\n ],\n fillElements: [\n { element: \"Hull body\", color: \"#0047ab\" },\n { element: \"Yellow vertical stripe 1\", color: \"#ffd700\" },\n { element: \"Yellow vertical stripe 2\", color: \"#ffd700\" },\n ],\n usageContext: \"An emergency wreck marking buoy (EWMB) is deployed rapidly to mark a newly discovered wreck that poses a danger to navigation. It is a temporary measure until the wreck is surveyed and permanent marks are established. The alternating blue and yellow light flashes distinguish it from all other marks. Introduced by IALA in 2005.\" },\n\n // ── Section Q: Mooring ──\n { id: \"mooring-buoy\", label: \"Mooring Buoy\", int1Ref: \"Q40\", section: \"Q\", getSvg: mooringBuoy,\n group: \"mooring\", description: \"Buoy providing a permanent mooring point. White with blue band (varies).\",\n s52PlRef: \"MORFAC04\", attributeKey: \"CATMOR\", attributeValue: 1,\n renderSize: \"32x32\",\n colors: [\n { token: \"White\", hex: \"#ffffff\", usage: \"Outer ring\" },\n { token: \"CHBLK\", hex: \"#000000\", usage: \"Centre eye and outline\" },\n ],\n lineStyles: [\n { element: \"Outer ring\", width: 1.5, color: \"#000000\" },\n { element: \"Mooring chain\", width: 1.2, color: \"#000000\" },\n ],\n fillElements: [\n { element: \"Outer ring\", color: \"#ffffff\" },\n { element: \"Centre mooring eye\", color: \"#000000\" },\n ],\n usageContext: \"Mooring buoys provide a permanent point for vessels to secure to without anchoring. They reduce anchor damage to the seabed and are common in harbours, marinas, and environmentally sensitive areas. Vessels should approach slowly and attach bow lines to the buoy ring or hawsepipe.\" },\n\n { id: \"spm\", label: \"Single Point Mooring\", int1Ref: \"Q31\", section: \"Q\", getSvg: spm,\n group: \"mooring\", description: \"Single point mooring (SPM) for tankers. Large buoy with hawsepipe arrangement.\",\n s52PlRef: \"MORFAC04\", attributeKey: \"CATMOR\", attributeValue: 3,\n renderSize: \"32x32\",\n colors: [\n { token: \"Cardinal Yellow\", hex: \"#ffd700\", usage: \"Centre hub\" },\n { token: \"CHBLK\", hex: \"#000000\", usage: \"Cross and circle outline\" },\n ],\n lineStyles: [\n { element: \"Outer circle\", width: 1.5, color: \"#000000\" },\n { element: \"Vertical cross\", width: 1.2, color: \"#000000\" },\n { element: \"Horizontal cross\", width: 1.2, color: \"#000000\" },\n { element: \"Centre hub outline\", width: 0.8, color: \"#000000\" },\n ],\n fillElements: [\n { element: \"Centre hub\", color: \"#ffd700\" },\n ],\n usageContext: \"A single point mooring (SPM) is a large, permanently anchored structure used primarily by tankers for loading and unloading petroleum products. The vessel is moored to the SPM by a hawser and can weathervane around it with wind and current. They are typically located well offshore and have exclusion zones.\" },\n\n // ── Section Q: Beacons ──\n { id: \"beacon-lateral-port\", label: \"Beacon, Lateral (Port)\", int1Ref: \"Q100\", section: \"Q\", getSvg: beaconLateralPort,\n group: \"beacons\", description: \"Fixed beacon marking the port side of a channel. Red triangle topmark (IALA-B).\",\n s52PlRef: \"BCNLAT01\", attributeKey: \"CATLAM\", attributeValue: 1,\n variants: [\"beacon-lateral-port\", \"beacon-lateral-stbd\"], colorMeaning: \"Red = port\",\n renderSize: \"32x32\",\n colors: [\n { token: \"IALA-B Port Red\", hex: \"#d42e12\", usage: \"Topmark triangle fill\" },\n { token: \"CHBLK\", hex: \"#000000\", usage: \"Post and topmark outline\" },\n ],\n lineStyles: [\n { element: \"Post shaft\", width: 2.0, color: \"#000000\" },\n { element: \"Topmark outline\", width: 1.0, color: \"#000000\" },\n ],\n fillElements: [\n { element: \"Triangle topmark\", color: \"#d42e12\" },\n ],\n usageContext: \"A lateral beacon marks the port side of a navigable channel. Unlike buoys, beacons are fixed structures (posts driven into the seabed or mounted on rocks). The red triangular topmark identifies it as a port-hand mark in IALA Region B. They are common in shallow coastal areas and intracoastal waterways.\" },\n\n { id: \"beacon-lateral-stbd\", label: \"Beacon, Lateral (Starboard)\", int1Ref: \"Q100\", section: \"Q\", getSvg: beaconLateralStbd,\n group: \"beacons\", description: \"Fixed beacon marking the starboard side of a channel. Green square topmark (IALA-B).\",\n s52PlRef: \"BCNLAT01\", attributeKey: \"CATLAM\", attributeValue: 2,\n variants: [\"beacon-lateral-port\", \"beacon-lateral-stbd\"], colorMeaning: \"Green = starboard\",\n renderSize: \"32x32\",\n colors: [\n { token: \"IALA-B Stbd Green\", hex: \"#00843d\", usage: \"Topmark square fill\" },\n { token: \"CHBLK\", hex: \"#000000\", usage: \"Post and topmark outline\" },\n ],\n lineStyles: [\n { element: \"Post shaft\", width: 2.0, color: \"#000000\" },\n { element: \"Topmark outline\", width: 1.0, color: \"#000000\" },\n ],\n fillElements: [\n { element: \"Square topmark\", color: \"#00843d\" },\n ],\n usageContext: \"A starboard lateral beacon marks the right side of a channel when returning from sea in IALA Region B. The green square topmark identifies it. Beacons are fixed structures and are more reliable than buoys as they cannot drift off station.\" },\n\n { id: \"beacon-cardinal\", label: \"Beacon, Cardinal\", int1Ref: \"Q110\", section: \"Q\", getSvg: beaconCardinal,\n group: \"beacons\", description: \"Fixed beacon with cardinal topmarks indicating the safe side to pass.\",\n s52PlRef: \"BCNCAR01\",\n renderSize: \"32x32\",\n colors: [\n { token: \"CHBLK\", hex: \"#000000\", usage: \"Post, topmark cones\" },\n ],\n lineStyles: [\n { element: \"Post shaft\", width: 2.0, color: \"#000000\" },\n ],\n fillElements: [\n { element: \"Topmark cone 1\", color: \"#000000\" },\n { element: \"Topmark cone 2\", color: \"#000000\" },\n ],\n usageContext: \"Cardinal beacons are fixed structures with the same topmark system as cardinal buoys — indicating the safe side to pass relative to a danger. They are used in rocky or shallow areas where fixed structures are more practical than floating buoys.\" },\n\n { id: \"beacon-isolated-danger\", label: \"Beacon, Isolated Danger\", int1Ref: \"Q110\", section: \"Q\", getSvg: beaconIsolatedDanger,\n group: \"beacons\", description: \"Fixed beacon marking isolated danger. Two sphere topmarks.\",\n s52PlRef: \"BCNISD01\",\n renderSize: \"32x32\",\n colors: [\n { token: \"CHBLK\", hex: \"#000000\", usage: \"Post and topmark spheres\" },\n ],\n lineStyles: [\n { element: \"Post shaft\", width: 2.0, color: \"#000000\" },\n ],\n fillElements: [\n { element: \"Topmark sphere 1\", color: \"#000000\" },\n { element: \"Topmark sphere 2\", color: \"#000000\" },\n ],\n usageContext: \"An isolated danger beacon is placed directly on or over a small hazard with navigable water all around. The two black spheres are the defining feature. Vessels may pass on any side at a safe distance.\" },\n\n { id: \"beacon-safe-water\", label: \"Beacon, Safe Water\", int1Ref: \"Q110\", section: \"Q\", getSvg: beaconSafeWater,\n group: \"beacons\", description: \"Fixed beacon indicating safe water. Single red sphere topmark.\",\n s52PlRef: \"BCNSAW01\",\n renderSize: \"32x32\",\n colors: [\n { token: \"IALA-B Port Red\", hex: \"#d42e12\", usage: \"Topmark sphere\" },\n { token: \"CHBLK\", hex: \"#000000\", usage: \"Post and sphere outline\" },\n ],\n lineStyles: [\n { element: \"Post shaft\", width: 2.0, color: \"#000000\" },\n { element: \"Sphere outline\", width: 0.8, color: \"#000000\" },\n ],\n fillElements: [\n { element: \"Topmark sphere\", color: \"#d42e12\" },\n ],\n usageContext: \"A safe water beacon indicates navigable water all around, similar to a safe water buoy. The single red sphere topmark is the key identifier. These are often used as fairway or mid-channel markers.\" },\n\n { id: \"beacon-special\", label: \"Beacon, Special Purpose\", int1Ref: \"Q110\", section: \"Q\", getSvg: beaconSpecial,\n group: \"beacons\", description: \"Fixed beacon for special purpose areas. Yellow X topmark.\",\n s52PlRef: \"BCNSPP01\",\n renderSize: \"32x32\",\n colors: [\n { token: \"Cardinal Yellow\", hex: \"#ffd700\", usage: \"X topmark fill\" },\n { token: \"CHBLK\", hex: \"#000000\", usage: \"Post and X outline\" },\n ],\n lineStyles: [\n { element: \"Post shaft\", width: 2.0, color: \"#000000\" },\n { element: \"X topmark (yellow)\", width: 3.0, color: \"#ffd700\" },\n { element: \"X topmark (outline)\", width: 1.2, color: \"#000000\" },\n ],\n fillElements: [],\n usageContext: \"Special purpose beacons mark areas with specific regulations or uses — pipeline corridors, cable areas, ODAS stations, or military exercise zones. The yellow X topmark is the distinguishing feature.\" },\n\n { id: \"pile-post\", label: \"Pile / Post\", int1Ref: \"Q80\", section: \"Q\", getSvg: pilePost,\n group: \"beacons\", description: \"Simple pile or post used as a daybeacon or channel marker.\",\n s52PlRef: \"PILPNT01\",\n renderSize: \"32x32\",\n colors: [\n { token: \"CHBLK\", hex: \"#000000\", usage: \"Pile shaft and top ball\" },\n ],\n lineStyles: [\n { element: \"Pile shaft\", width: 2.5, color: \"#000000\" },\n ],\n fillElements: [\n { element: \"Top ball\", color: \"#000000\" },\n ],\n usageContext: \"A pile or post is a simple vertical structure driven into the seabed, often used as a channel marker or daybeacon in shallow coastal and intracoastal waters. They are the simplest form of fixed navigation aid.\" },\n\n // ── Section Q: Daymarks ──\n { id: \"daymark-triangle\", label: \"Daymark, Triangle (Port)\", int1Ref: \"Q100\", section: \"Q\", getSvg: daymarkTriangle,\n group: \"daymarks\", description: \"Triangular daymark board mounted on a beacon. Red for port (IALA-B).\",\n s52PlRef: \"DAYMAR01\", attributeKey: \"TOPSHP\", attributeValue: 1,\n variants: [\"daymark-triangle\", \"daymark-square\"], colorMeaning: \"Red triangle = port\",\n renderSize: \"32x32\",\n colors: [\n { token: \"IALA-B Port Red\", hex: \"#d42e12\", usage: \"Daymark board fill\" },\n { token: \"CHBLK\", hex: \"#000000\", usage: \"Outline\" },\n ],\n lineStyles: [\n { element: \"Board outline\", width: 1.5, color: \"#000000\" },\n ],\n fillElements: [\n { element: \"Triangle board\", color: \"#d42e12\" },\n ],\n usageContext: \"Triangular daymarks are boards mounted on beacons to aid daytime identification. The red triangle indicates a port-hand mark in IALA Region B. They are essential in the US Intracoastal Waterway (ICW) system where they guide vessels through shallow coastal passages.\" },\n\n { id: \"daymark-square\", label: \"Daymark, Square (Starboard)\", int1Ref: \"Q100\", section: \"Q\", getSvg: daymarkSquare,\n group: \"daymarks\", description: \"Square daymark board mounted on a beacon. Green for starboard (IALA-B).\",\n s52PlRef: \"DAYMAR01\", attributeKey: \"TOPSHP\", attributeValue: 6,\n variants: [\"daymark-triangle\", \"daymark-square\"], colorMeaning: \"Green square = starboard\",\n renderSize: \"32x32\",\n colors: [\n { token: \"IALA-B Stbd Green\", hex: \"#00843d\", usage: \"Daymark board fill\" },\n { token: \"CHBLK\", hex: \"#000000\", usage: \"Outline\" },\n ],\n lineStyles: [\n { element: \"Board outline\", width: 1.5, color: \"#000000\" },\n ],\n fillElements: [\n { element: \"Square board\", color: \"#00843d\" },\n ],\n usageContext: \"Square daymarks are boards mounted on beacons indicating a starboard-hand mark in IALA Region B. The green square shape provides positive daytime identification even when paint condition is poor. Numbered with odd numbers ascending from seaward.\" },\n\n // ── Section Q: Topmarks ──\n { id: \"topmark-cone-up\", label: \"Topmark, Cone Up\", int1Ref: \"Q130\", section: \"Q\", getSvg: topmarkConeUp,\n group: \"topmarks\", description: \"Single cone point up. Used on starboard-hand lateral marks (IALA-B: green buoys).\",\n s52PlRef: \"TOPMAR02\", attributeKey: \"TOPSHP\", attributeValue: 1, // S-57: cone, point up\n renderSize: \"32x32\",\n colors: [{ token: \"CHBLK\", hex: \"#000000\", usage: \"Cone fill and outline\" }],\n lineStyles: [{ element: \"Cone outline\", width: 1.0, color: \"#000000\" }],\n fillElements: [{ element: \"Cone body\", color: \"#000000\" }],\n usageContext: \"A single upward-pointing cone is the topmark for starboard-hand lateral marks in IALA-B. It helps identify buoys and beacons at a distance when colour may not be visible.\" },\n\n { id: \"topmark-cone-down\", label: \"Topmark, Cone Down\", int1Ref: \"Q130\", section: \"Q\", getSvg: topmarkConeDown,\n group: \"topmarks\", description: \"Single cone point down. Used on port-hand lateral marks (IALA-B: red buoys).\",\n s52PlRef: \"TOPMAR04\", attributeKey: \"TOPSHP\", attributeValue: 2, // S-57: cone, point down\n renderSize: \"32x32\",\n colors: [{ token: \"CHBLK\", hex: \"#000000\", usage: \"Cone fill and outline\" }],\n lineStyles: [{ element: \"Cone outline\", width: 1.0, color: \"#000000\" }],\n fillElements: [{ element: \"Cone body\", color: \"#000000\" }],\n usageContext: \"A single downward-pointing cone is the topmark for port-hand lateral marks in IALA-B. It provides shape-based identification when color is not distinguishable.\" },\n\n { id: \"topmark-sphere\", label: \"Topmark, Sphere\", int1Ref: \"Q130\", section: \"Q\", getSvg: topmarkSphere,\n group: \"topmarks\", description: \"Single sphere. Used on safe water marks.\",\n s52PlRef: \"TOPMAR10\", attributeKey: \"TOPSHP\", attributeValue: 3, // S-57: sphere\n renderSize: \"32x32\",\n colors: [{ token: \"CHBLK\", hex: \"#000000\", usage: \"Sphere fill and outline\" }],\n lineStyles: [{ element: \"Sphere outline\", width: 1.0, color: \"#000000\" }],\n fillElements: [{ element: \"Sphere body\", color: \"#000000\" }],\n usageContext: \"A single sphere topmark identifies safe water marks. These indicate navigable water all around — mid-channel or fairway marks. The sphere shape is easily distinguished from cones at a distance.\" },\n\n { id: \"topmark-2-cones-up\", label: \"Topmark, 2 Cones Up (N)\", int1Ref: \"Q130\", section: \"Q\", getSvg: topmark2ConesUp,\n group: \"topmarks\", description: \"Two cones pointing up. North cardinal topmark — pass to the north.\",\n s52PlRef: \"TOPMAR12\", attributeKey: \"TOPSHP\", attributeValue: 10, // S-57: 2 cones points upward (N cardinal)\n renderSize: \"32x32\",\n colors: [{ token: \"CHBLK\", hex: \"#000000\", usage: \"Both cones\" }],\n lineStyles: [{ element: \"Cone outlines\", width: 0.8, color: \"#000000\" }],\n fillElements: [{ element: \"Upper cone\", color: \"#000000\" }, { element: \"Lower cone\", color: \"#000000\" }],\n usageContext: \"Two upward-pointing cones identify a North cardinal mark. Both cone points up = north. This topmark shape is the primary identifier — even when body colours may not be clearly visible.\" },\n\n { id: \"topmark-2-cones-down\", label: \"Topmark, 2 Cones Down (S)\", int1Ref: \"Q130\", section: \"Q\", getSvg: topmark2ConesDown,\n group: \"topmarks\", description: \"Two cones pointing down. South cardinal topmark — pass to the south.\",\n s52PlRef: \"TOPMAR14\", attributeKey: \"TOPSHP\", attributeValue: 11, // S-57: 2 cones points downward (S cardinal)\n renderSize: \"32x32\",\n colors: [{ token: \"CHBLK\", hex: \"#000000\", usage: \"Both cones\" }],\n lineStyles: [{ element: \"Cone outlines\", width: 0.8, color: \"#000000\" }],\n fillElements: [{ element: \"Upper cone\", color: \"#000000\" }, { element: \"Lower cone\", color: \"#000000\" }],\n usageContext: \"Two downward-pointing cones identify a South cardinal mark. Both cone points down = south. Light character: Q(6)+LFl or VQ(6)+LFl.\" },\n\n { id: \"topmark-2-cones-base\", label: \"Topmark, Base-to-Base (E)\", int1Ref: \"Q130\", section: \"Q\", getSvg: topmark2ConesBase,\n group: \"topmarks\", description: \"Two cones base-to-base (diamond shape). East cardinal topmark — pass to the east.\",\n s52PlRef: \"TOPMAR22\", attributeKey: \"TOPSHP\", attributeValue: 12, // S-57: 2 cones base to base (E cardinal)\n renderSize: \"32x32\",\n colors: [{ token: \"CHBLK\", hex: \"#000000\", usage: \"Both cones\" }],\n lineStyles: [{ element: \"Cone outlines\", width: 0.8, color: \"#000000\" }],\n fillElements: [{ element: \"Upper cone\", color: \"#000000\" }, { element: \"Lower cone\", color: \"#000000\" }],\n usageContext: \"Two cones base-to-base forming a diamond shape identify an East cardinal mark. Light character: Q(3) or VQ(3) — three quick flashes.\" },\n\n { id: \"topmark-2-cones-point\", label: \"Topmark, Point-to-Point (W)\", int1Ref: \"Q130\", section: \"Q\", getSvg: topmark2ConesPoint,\n group: \"topmarks\", description: \"Two cones point-to-point (hourglass). West cardinal topmark — pass to the west.\",\n s52PlRef: \"TOPMAR24\", attributeKey: \"TOPSHP\", attributeValue: 13, // S-57: 2 cones point to point (W cardinal)\n renderSize: \"32x32\",\n colors: [{ token: \"CHBLK\", hex: \"#000000\", usage: \"Both cones\" }],\n lineStyles: [{ element: \"Cone outlines\", width: 0.8, color: \"#000000\" }],\n fillElements: [{ element: \"Upper cone\", color: \"#000000\" }, { element: \"Lower cone\", color: \"#000000\" }],\n usageContext: \"Two cones point-to-point forming an hourglass shape identify a West cardinal mark. Light character: Q(9) or VQ(9) — nine quick flashes.\" },\n\n { id: \"topmark-2-spheres\", label: \"Topmark, 2 Spheres (ISD)\", int1Ref: \"Q130\", section: \"Q\", getSvg: topmark2Spheres,\n group: \"topmarks\", description: \"Two spheres vertically. Isolated danger topmark — danger with navigable water around.\",\n s52PlRef: \"TOPMAR30\", attributeKey: \"TOPSHP\", attributeValue: 4, // S-57: 2 spheres (vertically disposed)\n renderSize: \"32x32\",\n colors: [{ token: \"CHBLK\", hex: \"#000000\", usage: \"Both spheres\" }],\n lineStyles: [{ element: \"Sphere outlines\", width: 0.8, color: \"#000000\" }],\n fillElements: [{ element: \"Upper sphere\", color: \"#000000\" }, { element: \"Lower sphere\", color: \"#000000\" }],\n usageContext: \"Two vertically-stacked spheres identify an isolated danger mark. The hazard is small enough to pass on any side. Light character: Fl(2) — groups of two flashes.\" },\n\n { id: \"topmark-diamond\", label: \"Topmark, Diamond\", int1Ref: \"Q130\", section: \"Q\", getSvg: topmarkDiamond,\n group: \"topmarks\", description: \"Diamond shape topmark. Used on some special purpose marks.\",\n s52PlRef: \"TOPMAR28\", attributeKey: \"TOPSHP\", attributeValue: 14, // S-57: rhombus (diamond)\n renderSize: \"32x32\",\n colors: [{ token: \"CHBLK\", hex: \"#000000\", usage: \"Diamond fill and outline\" }],\n lineStyles: [{ element: \"Diamond outline\", width: 1.0, color: \"#000000\" }],\n fillElements: [{ element: \"Diamond body\", color: \"#000000\" }],\n usageContext: \"A diamond-shaped topmark is occasionally used on special purpose marks. It is less common than other topmark shapes but may be encountered on certain regulatory or administrative boundary marks.\" },\n\n { id: \"topmark-x-shape\", label: \"Topmark, X Shape\", int1Ref: \"Q130\", section: \"Q\", getSvg: topmarkXShape,\n group: \"topmarks\", description: \"X-shape (saltire) topmark. Used on special purpose marks (yellow buoys).\",\n s52PlRef: \"TOPMAR32\", attributeKey: \"TOPSHP\", attributeValue: 7, // S-57: x-shape (saltire)\n renderSize: \"32x32\",\n colors: [{ token: \"CHBLK\", hex: \"#000000\", usage: \"X arms\" }],\n lineStyles: [{ element: \"X arm (diagonal 1)\", width: 3.0, color: \"#000000\" }, { element: \"X arm (diagonal 2)\", width: 3.0, color: \"#000000\" }],\n fillElements: [],\n usageContext: \"The X-shaped (saltire) topmark identifies special purpose buoys and beacons. These marks are yellow and indicate non-navigational areas such as pipeline routes, cable areas, or ODAS stations.\" },\n\n // ── Section P: Lights ──\n { id: \"light-major\", label: \"Light, Major\", int1Ref: \"P1\", section: \"P\", getSvg: lightMajor,\n group: \"lights\", description: \"Major navigational light visible at long range (typically >15 NM). Shown as magenta tear/petal flare.\",\n s52PlRef: \"LIGHTS11\", labelExamples: ['\"Fl W 5s 40m 18M\"', '\"Iso R 4s\"'],\n renderSize: \"32x32\",\n colors: [\n { token: \"TRFCD\", hex: \"#d200d2\", usage: \"Central dot, flare petals, range ring\" },\n ],\n lineStyles: [\n { element: \"Range ring\", width: 0.5, color: \"#d200d2\" },\n ],\n fillElements: [\n { element: \"Central dot\", color: \"#d200d2\" },\n { element: \"Primary flare (north)\", color: \"#d200d2\", opacity: 0.85 },\n { element: \"Secondary flares\", color: \"#d200d2\", opacity: 0.5 },\n { element: \"Tertiary flares\", color: \"#d200d2\", opacity: 0.35 },\n ],\n usageContext: \"Major lights are powerful coastal lights designed for long-range visibility, typically exceeding 15 nautical miles. They are mounted on lighthouses, towers, or prominent headlands. The magenta tear-drop flare symbol indicates the light's position. The label gives the light character (e.g., 'Fl W 5s'), height, and nominal range.\" },\n\n { id: \"light-minor\", label: \"Light, Minor\", int1Ref: \"P4\", section: \"P\", getSvg: lightMinor,\n group: \"lights\", description: \"Minor light, typically on buoys or small beacons. Shorter range than major lights.\",\n s52PlRef: \"LIGHTS13\", labelExamples: ['\"Fl G 4s\"', '\"Q R\"'],\n renderSize: \"32x32\",\n colors: [\n { token: \"TRFCD\", hex: \"#d200d2\", usage: \"Light dot and flare\" },\n ],\n lineStyles: [\n { element: \"Range ring\", width: 0.4, color: \"#d200d2\" },\n ],\n fillElements: [\n { element: \"Light dot\", color: \"#d200d2\" },\n { element: \"Upward flare\", color: \"#d200d2\", opacity: 0.7 },\n ],\n usageContext: \"Minor lights are smaller, lower-power lights typically mounted on buoys, beacons, or small structures. Their range is usually less than 15 nautical miles. They are essential for marking channels, harbours, and coastal hazards at night.\" },\n\n { id: \"light-sector\", label: \"Light, Sector\", int1Ref: \"P40\", section: \"P\", getSvg: lightSector,\n group: \"lights\", description: \"Light showing different colors or characteristics in defined sectors. Arc indicates coverage.\",\n s52PlRef: \"LIGHTS12\", labelExamples: ['\"F.WRG\"', '\"Oc.WRG 6s\"'],\n renderSize: \"32x32\",\n colors: [\n { token: \"TRFCD\", hex: \"#d200d2\", usage: \"Light dot, sector arcs, sector fills\" },\n ],\n lineStyles: [\n { element: \"Sector boundary rays\", width: 0.5, color: \"#d200d2\" },\n { element: \"Sector arc\", width: 1.0, pattern: \"2, 1\", color: \"#d200d2\" },\n ],\n fillElements: [\n { element: \"Light dot\", color: \"#d200d2\" },\n { element: \"Sector fill (left)\", color: \"#d200d2\", opacity: 0.2 },\n { element: \"Sector fill (right)\", color: \"#d200d2\", opacity: 0.2 },\n ],\n usageContext: \"Sector lights show different colors (typically white, red, green) in defined arcs. The white sector usually indicates the safe approach bearing. Crossing from white to red or green warns the mariner they are leaving the safe channel. Essential for harbour approaches and narrow passages.\" },\n\n { id: \"light-directional\", label: \"Light, Directional\", int1Ref: \"P30\", section: \"P\", getSvg: lightDirectional,\n group: \"lights\", description: \"Light showing a narrow beam along a specific bearing to guide vessels on a leading line.\",\n s52PlRef: \"LIGHTS13\", labelExamples: ['\"Dir Oc WRG 6s\"'],\n renderSize: \"32x32\",\n colors: [\n { token: \"TRFCD\", hex: \"#d200d2\", usage: \"Light dot, beam line, arrowhead\" },\n ],\n lineStyles: [\n { element: \"Beam line\", width: 1.5, color: \"#d200d2\" },\n ],\n fillElements: [\n { element: \"Light dot\", color: \"#d200d2\" },\n { element: \"Arrowhead\", color: \"#d200d2\", opacity: 0.6 },\n ],\n usageContext: \"A directional light emits a narrow beam along a specific bearing to guide vessels along a leading line or into a harbour entrance. The light may show different colours on either side of the intended track. Mariners should steer to keep in the white (or brightest) sector.\" },\n\n { id: \"light-aero\", label: \"Light, Aeronautical\", int1Ref: \"P60\", section: \"P\", getSvg: lightAero,\n group: \"lights\", description: \"Aeronautical light also visible from the sea. Shown with dashed range rings.\",\n s52PlRef: \"LIGHTS82\", labelExamples: ['\"Aero Al Fl WG 7.5s\"'],\n renderSize: \"32x32\",\n colors: [\n { token: \"TRFCD\", hex: \"#d200d2\", usage: \"Light dot, flare, range rings\" },\n ],\n lineStyles: [\n { element: \"Inner range ring\", width: 0.6, pattern: \"2, 2\", color: \"#d200d2\" },\n { element: \"Outer range ring\", width: 0.4, pattern: \"2, 2\", color: \"#d200d2\" },\n ],\n fillElements: [\n { element: \"Light dot\", color: \"#d200d2\" },\n { element: \"Upward flare\", color: \"#d200d2\", opacity: 0.6 },\n ],\n usageContext: \"Aeronautical lights are primarily intended for aircraft but are also conspicuous from the sea. They are charted because they can serve as useful navigational references for mariners. The dashed range rings distinguish them from marine lights. Typically found at airports near the coast.\" },\n\n { id: \"light-vessel\", label: \"Light Vessel\", int1Ref: \"P6\", section: \"P\", getSvg: lightVessel,\n group: \"light-vessels\", description: \"Manned or unmanned vessel anchored as a navigational light. Being replaced by LANBY buoys.\",\n s52PlRef: \"LITVES01\", labelExamples: ['\"NANTUCKET\"', '\"AMBROSE\"'],\n renderSize: \"32x32\",\n colors: [\n { token: \"IALA-B Port Red\", hex: \"#d42e12\", usage: \"Hull body\" },\n { token: \"CHBLK\", hex: \"#000000\", usage: \"Outline, mast, waterline\" },\n { token: \"TRFCD\", hex: \"#d200d2\", usage: \"Light housing and flare\" },\n ],\n lineStyles: [\n { element: \"Waterline curve\", width: 1.5, color: \"#000000\" },\n { element: \"Hull outline\", width: 1.0, color: \"#000000\" },\n { element: \"Mast\", width: 1.5, color: \"#000000\" },\n { element: \"Light housing outline\", width: 0.6, color: \"#000000\" },\n ],\n fillElements: [\n { element: \"Hull body\", color: \"#d42e12\" },\n { element: \"Light housing\", color: \"#d200d2\" },\n ],\n usageContext: \"Light vessels (lightships) are ships moored at a fixed station to serve as floating lighthouses. Historically important at major harbour approaches and offshore shoals. Most have been replaced by large automatic navigation buoys (LANBY). The remaining few carry the station name prominently on the hull.\" },\n\n { id: \"light-float\", label: \"Light Float\", int1Ref: \"P5\", section: \"P\", getSvg: lightFloat,\n group: \"light-vessels\", description: \"Unmanned floating light platform. Similar function to light vessel but smaller.\",\n s52PlRef: \"LITFLT01\",\n renderSize: \"32x32\",\n colors: [\n { token: \"Cardinal Yellow\", hex: \"#ffd700\", usage: \"Float hull\" },\n { token: \"CHBLK\", hex: \"#000000\", usage: \"Outline and mast\" },\n { token: \"TRFCD\", hex: \"#d200d2\", usage: \"Light housing\" },\n ],\n lineStyles: [\n { element: \"Hull outline\", width: 1.0, color: \"#000000\" },\n { element: \"Mast\", width: 1.5, color: \"#000000\" },\n { element: \"Light housing outline\", width: 0.6, color: \"#000000\" },\n ],\n fillElements: [\n { element: \"Float hull\", color: \"#ffd700\" },\n { element: \"Light housing\", color: \"#d200d2\" },\n ],\n usageContext: \"Light floats are unmanned floating platforms that carry lights and other aids to navigation. They are smaller and less expensive than light vessels, providing a cost-effective alternative for marking offshore positions.\" },\n\n // ── Section R/S: Fog Signals & Radar ──\n { id: \"fog-signal\", label: \"Fog Signal\", int1Ref: \"R1\", section: \"R\", getSvg: fogSignal,\n group: \"fog-radar\", description: \"Audible fog signal device (horn, siren, bell, whistle). Shown as concentric arcs from source.\",\n s52PlRef: \"FOGSIG01\", labelExamples: ['\"Horn Mo(N) 30s\"', '\"BELL\"', '\"Dia\"'],\n renderSize: \"32x32\",\n colors: [\n { token: \"TRFCD\", hex: \"#d200d2\", usage: \"Horn and sound arcs\" },\n { token: \"CHBLK\", hex: \"#000000\", usage: \"Horn outline\" },\n ],\n lineStyles: [\n { element: \"Inner arc\", width: 1.2, color: \"#d200d2\" },\n { element: \"Middle arc\", width: 1.0, color: \"#d200d2\" },\n { element: \"Outer arc\", width: 0.8, color: \"#d200d2\" },\n ],\n fillElements: [\n { element: \"Horn body\", color: \"#d200d2\" },\n ],\n usageContext: \"Fog signals are audible devices that operate during periods of reduced visibility (fog, rain, snow). Types include horns, diaphones, sirens, bells, whistles, and gongs. The label describes the signal type and timing. Mariners should be aware that fog signals may be unreliable for position fixing due to sound propagation effects.\" },\n\n { id: \"radar-transponder\", label: \"Radar Transponder / RACON\", int1Ref: \"S1\", section: \"S\", getSvg: radarTransponder,\n group: \"fog-radar\", description: \"Radar beacon (RACON) that returns a coded signal on a vessel's radar display.\",\n s52PlRef: \"RTPBCN01\", labelExamples: ['\"Racon(M)\"', '\"Racon(T)\"'],\n renderSize: \"32x32\",\n colors: [\n { token: \"TRFCD\", hex: \"#d200d2\", usage: \"Centre dot and range rings\" },\n ],\n lineStyles: [\n { element: \"Inner range ring\", width: 1.0, pattern: \"3, 2\", color: \"#d200d2\" },\n { element: \"Outer range ring\", width: 0.7, pattern: \"3, 2\", color: \"#d200d2\" },\n ],\n fillElements: [\n { element: \"Centre dot\", color: \"#d200d2\" },\n ],\n usageContext: \"A RACON (RAdar beaCON) is a transponder that, when triggered by a vessel's radar, returns a coded signal visible on the radar display. This appears as a distinctive dash pattern extending radially outward from the mark's position. The letter code (e.g., 'M' or 'T') identifies the specific RACON.\" },\n\n // ── Section K: Wrecks ──\n { id: \"wreck-visible\", label: \"Wreck, Visible\", int1Ref: \"K24\", section: \"K\", getSvg: wreckVisible,\n group: \"wrecks\", description: \"Wreck with hull or superstructure visible above chart datum. Always dangerous.\",\n s52PlRef: \"WRECKS01\", attributeKey: \"WATLEV\", attributeValue: 1, labelExamples: ['\"Wk\"', '\"Masts\"'],\n renderSize: \"32x32\",\n colors: [\n { token: \"CHBLK\", hex: \"#000000\", usage: \"Hull, masts, rigging, waterline\" },\n ],\n lineStyles: [\n { element: \"Waterline wave\", width: 1.5, color: \"#000000\" },\n { element: \"Mast lines\", width: 1.5, color: \"#000000\" },\n { element: \"Cross-beam\", width: 1.0, color: \"#000000\" },\n ],\n fillElements: [],\n usageContext: \"A visible wreck has parts of its hull or superstructure above the water surface at chart datum. It is always considered a danger to navigation and must be given a wide berth. Visible wrecks may also be surrounded by debris or underwater structure extending beyond the visible portion.\" },\n\n { id: \"wreck-submerged\", label: \"Wreck, Submerged\", int1Ref: \"K26\", section: \"K\", getSvg: wreckSubmerged,\n group: \"wrecks\", description: \"Wreck submerged at chart datum. Depth may be known or unknown. Dotted circle indicates danger zone.\",\n s52PlRef: \"WRECKS04\", attributeKey: \"WATLEV\", attributeValue: 3, labelExamples: ['\"Wk 8m\"', '\"Wk\"'],\n renderSize: \"32x32\",\n colors: [\n { token: \"RESBL (SVG: #4a6fa5)\", hex: \"#4a6fa5\", usage: \"Hull outline, masts, danger circle (S-52 standard: #0064b4)\" },\n ],\n lineStyles: [\n { element: \"Hull waterline\", width: 1.2, color: \"#4a6fa5\" },\n { element: \"Mast lines\", width: 1.0, color: \"#4a6fa5\" },\n { element: \"Danger perimeter\", width: 0.8, pattern: \"1.5, 2\", color: \"#4a6fa5\" },\n ],\n fillElements: [],\n usageContext: \"A submerged wreck lies below the water surface at chart datum. The depth over the wreck may be known (shown as a sounding) or unknown. The dotted circle indicates the approximate danger zone. Vessels should avoid passing over submerged wrecks as actual clearance may be less than charted due to tidal conditions or wreck deterioration.\" },\n\n { id: \"wreck-dangerous\", label: \"Wreck, Dangerous\", int1Ref: \"K28\", section: \"K\", getSvg: wreckDangerous,\n group: \"wrecks\", description: \"Dangerous wreck with depth ≤ safety contour. Shown with red danger symbol.\",\n s52PlRef: \"WRECKS05\", labelExamples: ['\"Wk 2.1m\"'],\n renderSize: \"32x32\",\n colors: [\n { token: \"DNGHL (SVG: #d42e12)\", hex: \"#d42e12\", usage: \"Danger circle and cross (S-52 standard: #ff0000)\" },\n ],\n lineStyles: [\n { element: \"Danger circle\", width: 1.5, color: \"#d42e12\" },\n { element: \"Horizontal cross\", width: 1.5, color: \"#d42e12\" },\n { element: \"Vertical cross\", width: 1.5, color: \"#d42e12\" },\n ],\n fillElements: [],\n usageContext: \"A dangerous wreck has a depth equal to or less than the vessel's safety contour, meaning it poses a direct grounding hazard. The red circle-with-cross danger symbol demands immediate attention. Vessels must give these wrecks a wide berth. The S-52 system triggers this symbol automatically when the wreck depth is shallower than the user's safety contour setting.\" },\n\n // ── Section K: Rocks ──\n { id: \"rock-awash\", label: \"Rock Awash\", int1Ref: \"K12\", section: \"K\", getSvg: rockAwash,\n group: \"rocks\", description: \"Rock awash at the level of chart datum. Shown as a simple cross (+).\",\n s52PlRef: \"UWTROC03\", attributeKey: \"WATLEV\", attributeValue: 5, // S-57: awash\n renderSize: \"32x32\",\n colors: [\n { token: \"CHBLK\", hex: \"#000000\", usage: \"Cross arms\" },\n ],\n lineStyles: [\n { element: \"Vertical arm\", width: 2.0, color: \"#000000\" },\n { element: \"Horizontal arm\", width: 2.0, color: \"#000000\" },\n ],\n fillElements: [],\n usageContext: \"A rock awash is level with the sea surface at chart datum. It may be exposed at low water and submerged at high water. The simple cross (+) symbol is one of the most important danger symbols on a chart. Mariners must always avoid crossing over this symbol.\" },\n\n { id: \"rock-underwater\", label: \"Rock, Underwater\", int1Ref: \"K13\", section: \"K\", getSvg: rockUnderwater,\n group: \"rocks\", description: \"Submerged rock with known or estimated depth. Shown as asterisk.\",\n s52PlRef: \"UWTROC04\", attributeKey: \"WATLEV\", attributeValue: 3, labelExamples: ['\"2.4m\"'],\n renderSize: \"32x32\",\n colors: [\n { token: \"RESBL (SVG: #4a6fa5)\", hex: \"#4a6fa5\", usage: \"All asterisk lines (S-52 standard: #0064b4)\" },\n ],\n lineStyles: [\n { element: \"Vertical line\", width: 1.5, color: \"#4a6fa5\" },\n { element: \"Horizontal line\", width: 1.5, color: \"#4a6fa5\" },\n { element: \"Diagonal line 1\", width: 1.2, color: \"#4a6fa5\" },\n { element: \"Diagonal line 2\", width: 1.2, color: \"#4a6fa5\" },\n ],\n fillElements: [],\n usageContext: \"An underwater rock is permanently submerged. The depth may be shown as a sounding alongside the symbol. The blue asterisk symbol distinguishes it from rocks awash. Mariners should check the sounding and compare it to their vessel's draft before navigating near underwater rocks.\" },\n\n { id: \"rock-covers-uncovers\", label: \"Rock, Covers & Uncovers\", int1Ref: \"K11\", section: \"K\", getSvg: rockCoversUncovers,\n group: \"rocks\", description: \"Rock that alternately covers and uncovers with tide. Cross with dashed circle.\",\n s52PlRef: \"UWTROC04\", attributeKey: \"WATLEV\", attributeValue: 4, // S-57: covers and uncovers\n renderSize: \"32x32\",\n colors: [\n { token: \"CHBLK\", hex: \"#000000\", usage: \"Cross arms and dashed perimeter\" },\n ],\n lineStyles: [\n { element: \"Vertical arm\", width: 1.8, color: \"#000000\" },\n { element: \"Horizontal arm\", width: 1.8, color: \"#000000\" },\n { element: \"Danger perimeter\", width: 0.8, pattern: \"2, 2\", color: \"#000000\" },\n ],\n fillElements: [],\n usageContext: \"A rock that covers and uncovers is alternately exposed and submerged with the tide. The height above chart datum is sometimes shown. The dashed circle indicates the approximate extent of the danger area. These rocks can be particularly hazardous as they may not be visible at all states of the tide.\" },\n\n // ── Section K: Obstructions ──\n { id: \"obstruction\", label: \"Obstruction\", int1Ref: \"K40\", section: \"K\", getSvg: obstruction,\n group: \"obstructions\", description: \"Underwater obstruction (stumps, wellheads, fish havens, etc.). Cross with danger circle.\",\n s52PlRef: \"OBSTRN01\", labelExamples: ['\"Obstn\"', '\"Foul\"'],\n renderSize: \"32x32\",\n colors: [\n { token: \"RESBL (SVG: #4a6fa5)\", hex: \"#4a6fa5\", usage: \"Cross and danger circle (S-52 standard: #0064b4)\" },\n ],\n lineStyles: [\n { element: \"Vertical arm\", width: 1.8, color: \"#4a6fa5\" },\n { element: \"Horizontal arm\", width: 1.8, color: \"#4a6fa5\" },\n { element: \"Danger perimeter\", width: 0.8, pattern: \"2, 2\", color: \"#4a6fa5\" },\n ],\n fillElements: [],\n usageContext: \"Obstructions include any underwater hazard that is not a wreck or natural rock — fish havens, submerged piles, wellheads, disused cables, or foul ground. The blue cross with dashed circle symbol warns mariners. The label may specify the type of obstruction and its depth.\" },\n\n // ── Section E: Landmarks ──\n { id: \"landmark-spire\", label: \"Landmark, Spire\", int1Ref: \"E10.3\", section: \"E\", getSvg: landmarkSpire,\n group: \"landmarks\", description: \"Church spire or steeple, conspicuous from seaward. Useful for visual fixing.\",\n s52PlRef: \"LNDMRK17\", attributeKey: \"CATLMK\", attributeValue: 17,\n renderSize: \"32x32\",\n colors: [{ token: \"CHBLK\", hex: \"#000000\", usage: \"Spire, building, position circle\" }],\n lineStyles: [{ element: \"Building outline\", width: 0.8, color: \"#000000\" }, { element: \"Position circle\", width: 0.6, pattern: \"2, 2\", color: \"#000000\" }],\n fillElements: [{ element: \"Spire\", color: \"#000000\" }, { element: \"Building body\", color: \"#000000\" }],\n usageContext: \"A church spire or steeple is charted when it is conspicuous from seaward and useful for visual position fixing. Mariners can take compass bearings on spires to establish a fix. The dashed circle indicates the landmark's approximate position.\" },\n\n { id: \"landmark-tower\", label: \"Landmark, Tower\", int1Ref: \"E20\", section: \"E\", getSvg: landmarkTower,\n group: \"landmarks\", description: \"Tower conspicuous from seaward. General-purpose landmark symbol.\",\n s52PlRef: \"LNDMRK20\", attributeKey: \"CATLMK\", attributeValue: 20,\n renderSize: \"32x32\",\n colors: [{ token: \"CHBLK\", hex: \"#000000\", usage: \"Tower body, cap, position circle\" }],\n lineStyles: [{ element: \"Tower outline\", width: 0.8, color: \"#000000\" }, { element: \"Position circle\", width: 0.6, pattern: \"2, 2\", color: \"#000000\" }],\n fillElements: [{ element: \"Tower body\", color: \"#000000\" }, { element: \"Tower cap\", color: \"#000000\" }],\n usageContext: \"A general tower landmark is charted when conspicuous from seaward. This includes water towers, observation towers, and other tall structures. Towers are valuable for radar and visual position fixing due to their height and solid construction.\" },\n\n { id: \"landmark-chimney\", label: \"Landmark, Chimney\", int1Ref: \"E22\", section: \"E\", getSvg: landmarkChimney,\n group: \"landmarks\", description: \"Industrial chimney or smokestack visible from the sea.\",\n s52PlRef: \"LNDMRK01\", attributeKey: \"CATLMK\", attributeValue: 1,\n renderSize: \"32x32\",\n colors: [{ token: \"CHBLK\", hex: \"#000000\", usage: \"Chimney body, smoke, position circle\" }],\n lineStyles: [{ element: \"Body outline\", width: 0.8, color: \"#000000\" }, { element: \"Smoke plume\", width: 1.0, color: \"#000000\" }, { element: \"Position circle\", width: 0.6, pattern: \"2, 2\", color: \"#000000\" }],\n fillElements: [{ element: \"Chimney body\", color: \"#000000\" }],\n usageContext: \"Industrial chimneys and smokestacks are charted when conspicuous from seaward. They are often associated with power stations, factories, or refineries. Active chimneys may have visible emissions that aid identification.\" },\n\n { id: \"landmark-flagstaff\", label: \"Landmark, Flagstaff\", int1Ref: \"E27\", section: \"E\", getSvg: landmarkFlagstaff,\n group: \"landmarks\", description: \"Flagstaff or flagpole conspicuous from seaward.\",\n s52PlRef: \"LNDMRK03\", attributeKey: \"CATLMK\", attributeValue: 3,\n renderSize: \"32x32\",\n colors: [\n { token: \"CHBLK\", hex: \"#000000\", usage: \"Pole and position circle\" },\n { token: \"IALA-B Port Red\", hex: \"#d42e12\", usage: \"Flag\" },\n ],\n lineStyles: [{ element: \"Pole\", width: 1.5, color: \"#000000\" }, { element: \"Flag outline\", width: 0.8, color: \"#000000\" }, { element: \"Position circle\", width: 0.6, pattern: \"2, 2\", color: \"#000000\" }],\n fillElements: [{ element: \"Flag\", color: \"#d42e12\" }],\n usageContext: \"A flagstaff or flagpole is charted when conspicuous from seaward. Flags flying from these may aid identification. They are often found at government buildings, military installations, or yacht clubs near the coast.\" },\n\n { id: \"landmark-monument\", label: \"Landmark, Monument\", int1Ref: \"E24\", section: \"E\", getSvg: landmarkMonument,\n group: \"landmarks\", description: \"Monument or memorial conspicuous from the sea.\",\n s52PlRef: \"LNDMRK05\", attributeKey: \"CATLMK\", attributeValue: 5,\n renderSize: \"32x32\",\n colors: [{ token: \"CHBLK\", hex: \"#000000\", usage: \"Monument body, base, position circle\" }],\n lineStyles: [{ element: \"Body outline\", width: 0.8, color: \"#000000\" }, { element: \"Position circle\", width: 0.6, pattern: \"2, 2\", color: \"#000000\" }],\n fillElements: [{ element: \"Monument body\", color: \"#000000\" }, { element: \"Base\", color: \"#000000\" }],\n usageContext: \"Monuments and memorials are charted when conspicuous from seaward. Large monuments on prominent headlands or coastal hills can be excellent visual landmarks for position fixing. Examples include obelisks, statues, and war memorials.\" },\n\n { id: \"landmark-windmill\", label: \"Landmark, Windmill\", int1Ref: \"E25\", section: \"E\", getSvg: landmarkWindmill,\n group: \"landmarks\", description: \"Traditional windmill with rotating vanes. Conspicuous landmark.\",\n s52PlRef: \"LNDMRK21\", attributeKey: \"CATLMK\", attributeValue: 7,\n renderSize: \"32x32\",\n colors: [{ token: \"CHBLK\", hex: \"#000000\", usage: \"Tower, vanes, hub, position circle\" }],\n lineStyles: [{ element: \"Tower\", width: 1.5, color: \"#000000\" }, { element: \"Vane arms\", width: 1.2, color: \"#000000\" }, { element: \"Position circle\", width: 0.6, pattern: \"2, 2\", color: \"#000000\" }],\n fillElements: [{ element: \"Hub\", color: \"#000000\" }],\n usageContext: \"Traditional windmills with rotating vanes are conspicuous landmarks, especially common along the coasts of the Netherlands, UK, and New England. Their distinctive shape makes them excellent visual references for coastal navigation.\" },\n\n { id: \"landmark-wind-turbine\", label: \"Landmark, Wind Turbine\", int1Ref: \"E26.2\", section: \"E\", getSvg: landmarkWindTurbine,\n group: \"landmarks\", description: \"Modern 3-blade wind turbine. Increasingly common offshore landmark.\",\n s52PlRef: \"LNDMRK22\", attributeKey: \"CATLMK\", attributeValue: 26,\n renderSize: \"32x32\",\n colors: [{ token: \"CHBLK\", hex: \"#000000\", usage: \"Tower, blades, hub, position circle\" }],\n lineStyles: [{ element: \"Tower\", width: 1.5, color: \"#000000\" }, { element: \"Blades\", width: 1.2, color: \"#000000\" }, { element: \"Position circle\", width: 0.6, pattern: \"2, 2\", color: \"#000000\" }],\n fillElements: [{ element: \"Hub\", color: \"#000000\" }],\n usageContext: \"Modern wind turbines are increasingly common both onshore and offshore. Offshore wind farms can present significant navigational hazards and restricted areas. Individual turbines are charted as landmarks; farms are shown as areas with individual turbine positions. They typically have aviation lights that are visible from sea.\" },\n\n { id: \"landmark-dome\", label: \"Landmark, Dome\", int1Ref: \"E21\", section: \"E\", getSvg: landmarkDome,\n group: \"landmarks\", description: \"Dome or cupola (e.g., observatory, mosque) visible from the sea.\",\n s52PlRef: \"LNDMRK03\", attributeKey: \"CATLMK\", attributeValue: 6,\n renderSize: \"32x32\",\n colors: [{ token: \"CHBLK\", hex: \"#000000\", usage: \"Dome, base, position circle\" }],\n lineStyles: [{ element: \"Base outline\", width: 0.8, color: \"#000000\" }, { element: \"Dome curve\", width: 0.8, color: \"#000000\" }, { element: \"Position circle\", width: 0.6, pattern: \"2, 2\", color: \"#000000\" }],\n fillElements: [{ element: \"Base\", color: \"#000000\" }, { element: \"Dome\", color: \"#000000\" }],\n usageContext: \"Domes and cupolas (observatories, mosques, churches, government buildings) are charted when conspicuous from seaward. Their distinctive rounded profile makes them easily identifiable among other coastal structures.\" },\n\n { id: \"landmark-radar-scanner\", label: \"Landmark, Radar Scanner\", int1Ref: \"E30\", section: \"E\", getSvg: landmarkRadarScanner,\n group: \"landmarks\", description: \"Radar scanner antenna conspicuous from seaward.\",\n s52PlRef: \"LNDMRK12\", attributeKey: \"CATLMK\", attributeValue: 9,\n renderSize: \"32x32\",\n colors: [{ token: \"CHBLK\", hex: \"#000000\", usage: \"Tower, scanner dish, position circle\" }],\n lineStyles: [{ element: \"Tower\", width: 1.5, color: \"#000000\" }, { element: \"Scanner frame\", width: 1.5, color: \"#000000\" }, { element: \"Position circle\", width: 0.6, pattern: \"2, 2\", color: \"#000000\" }],\n fillElements: [],\n usageContext: \"Radar scanner antennae are charted when they form conspicuous landmarks. They are often found at coast guard stations, vessel traffic services (VTS), or military installations. Their rotating dish is a distinctive visual feature.\" },\n\n { id: \"landmark-dish-aerial\", label: \"Landmark, Dish Aerial\", int1Ref: \"E31\", section: \"E\", getSvg: landmarkDishAerial,\n group: \"landmarks\", description: \"Satellite dish or parabolic antenna visible from the sea.\",\n s52PlRef: \"LNDMRK12\", attributeKey: \"CATLMK\", attributeValue: 12,\n renderSize: \"32x32\",\n colors: [{ token: \"CHBLK\", hex: \"#000000\", usage: \"Tower, dish, position circle\" }],\n lineStyles: [{ element: \"Tower\", width: 1.5, color: \"#000000\" }, { element: \"Dish curve\", width: 1.5, color: \"#000000\" }, { element: \"Position circle\", width: 0.6, pattern: \"2, 2\", color: \"#000000\" }],\n fillElements: [],\n usageContext: \"Satellite dishes and large parabolic antennae are charted when conspicuous from seaward. Large earth stations with multiple dishes can be distinctive landmarks visible at considerable range.\" },\n\n { id: \"landmark-water-tower\", label: \"Landmark, Water Tower\", int1Ref: \"E21\", section: \"E\", getSvg: landmarkWaterTower,\n group: \"landmarks\", description: \"Water tower. Elevated tank on supporting structure, conspicuous landmark.\",\n s52PlRef: \"LNDMRK19\", attributeKey: \"CATLMK\", attributeValue: 15,\n renderSize: \"32x32\",\n colors: [{ token: \"CHBLK\", hex: \"#000000\", usage: \"Tank, legs, position circle\" }],\n lineStyles: [{ element: \"Leg outlines\", width: 1.2, color: \"#000000\" }, { element: \"Tank outline\", width: 0.8, color: \"#000000\" }, { element: \"Position circle\", width: 0.6, pattern: \"2, 2\", color: \"#000000\" }],\n fillElements: [{ element: \"Tank body\", color: \"#000000\" }],\n usageContext: \"Water towers are among the most conspicuous coastal landmarks due to their height and distinctive shape. They are excellent for visual and radar position fixing. Often painted with town names or distinctive colours, making visual identification straightforward.\" },\n\n { id: \"landmark-radio-tv-mast\", label: \"Landmark, Radio/TV Mast\", int1Ref: \"E28\", section: \"E\", getSvg: landmarkRadioTvMast,\n group: \"landmarks\", description: \"Radio or television transmission mast with horizontal cross-arms.\",\n s52PlRef: \"LNDMRK10\", attributeKey: \"CATLMK\", attributeValue: 8,\n renderSize: \"32x32\",\n colors: [{ token: \"CHBLK\", hex: \"#000000\", usage: \"Mast, cross-arms, top, position circle\" }],\n lineStyles: [{ element: \"Main mast\", width: 1.5, color: \"#000000\" }, { element: \"Cross-arms\", width: 0.8, color: \"#000000\" }, { element: \"Position circle\", width: 0.6, pattern: \"2, 2\", color: \"#000000\" }],\n fillElements: [{ element: \"Top ball\", color: \"#000000\" }],\n usageContext: \"Radio and television transmission masts are often the tallest structures in a coastal area. Their height makes them excellent radar targets visible at long range. The horizontal cross-arms holding antennae and guy wires give them a distinctive profile.\" },\n\n { id: \"landmark-cross\", label: \"Landmark, Cross\", int1Ref: \"E12\", section: \"E\", getSvg: landmarkCross,\n group: \"landmarks\", description: \"Religious cross or calvary conspicuous from seaward.\",\n s52PlRef: \"LNDMRK05\", attributeKey: \"CATLMK\", attributeValue: 10,\n renderSize: \"32x32\",\n colors: [{ token: \"CHBLK\", hex: \"#000000\", usage: \"Cross arms and position circle\" }],\n lineStyles: [{ element: \"Vertical arm\", width: 2.0, color: \"#000000\" }, { element: \"Horizontal arm\", width: 2.0, color: \"#000000\" }, { element: \"Position circle\", width: 0.6, pattern: \"2, 2\", color: \"#000000\" }],\n fillElements: [],\n usageContext: \"Religious crosses and calvaries on prominent coastal positions are charted when conspicuous from seaward. They are particularly common along Mediterranean and Atlantic European coasts. Their simple, distinctive shape aids visual identification.\" },\n\n { id: \"landmark-mast\", label: \"Landmark, Mast\", int1Ref: \"E28\", section: \"E\", getSvg: landmarkMast,\n group: \"landmarks\", description: \"General mast (not radio/TV). Pole with spherical top.\",\n s52PlRef: \"LNDMRK10\", attributeKey: \"CATLMK\", attributeValue: 14,\n renderSize: \"32x32\",\n colors: [{ token: \"CHBLK\", hex: \"#000000\", usage: \"Mast pole, top ball, position circle\" }],\n lineStyles: [{ element: \"Mast pole\", width: 2.0, color: \"#000000\" }, { element: \"Position circle\", width: 0.6, pattern: \"2, 2\", color: \"#000000\" }],\n fillElements: [{ element: \"Top ball\", color: \"#000000\" }],\n usageContext: \"General masts include flagpoles, signal masts, and other tall vertical structures not specifically classified as radio/TV masts. The spherical top provides a distinctive profile when silhouetted against the sky.\" },\n\n { id: \"landmark-silo\", label: \"Landmark, Silo/Tank\", int1Ref: \"E33\", section: \"E\", getSvg: landmarkSilo,\n group: \"landmarks\", description: \"Silo, grain elevator, or storage tank conspicuous from the sea.\",\n s52PlRef: \"LNDMRK17\", attributeKey: \"CATLMK\", attributeValue: 33,\n renderSize: \"32x32\",\n colors: [{ token: \"CHBLK\", hex: \"#000000\", usage: \"Body, dome top, position circle\" }],\n lineStyles: [{ element: \"Body outline\", width: 0.8, color: \"#000000\" }, { element: \"Dome curve\", width: 0.8, color: \"#000000\" }, { element: \"Position circle\", width: 0.6, pattern: \"2, 2\", color: \"#000000\" }],\n fillElements: [{ element: \"Silo body\", color: \"#000000\" }, { element: \"Dome top\", color: \"#000000\" }],\n usageContext: \"Silos, grain elevators, and large storage tanks are conspicuous industrial landmarks. Groups of silos at port facilities are particularly useful as they indicate harbour approaches. Their cylindrical shape gives a strong radar echo.\" },\n\n // ── Section L/N: Infrastructure ──\n { id: \"offshore-platform\", label: \"Offshore Platform\", int1Ref: \"L10\", section: \"L\", getSvg: offshorePlatform,\n group: \"infrastructure\", description: \"Fixed offshore platform (oil, gas, wind). Shows as crossed square.\",\n s52PlRef: \"OFSPLF01\",\n renderSize: \"32x32\",\n colors: [{ token: \"CHBLK\", hex: \"#000000\", usage: \"Square outline, diagonal crosses, centre dot\" }],\n lineStyles: [{ element: \"Square outline\", width: 1.5, color: \"#000000\" }, { element: \"Diagonal cross 1\", width: 1.0, color: \"#000000\" }, { element: \"Diagonal cross 2\", width: 1.0, color: \"#000000\" }],\n fillElements: [{ element: \"Centre dot\", color: \"#000000\" }],\n usageContext: \"Offshore platforms include oil and gas production platforms, wind farm substations, and other permanent offshore structures. They have safety zones (typically 500m) that vessels must not enter without authorisation. They are lit, have fog signals, and appear on radar.\" },\n\n { id: \"crane\", label: \"Crane\", int1Ref: \"F53\", section: \"L\", getSvg: crane,\n group: \"infrastructure\", description: \"Port crane or dockside loading crane. May have restricted clearance.\",\n s52PlRef: \"CRANES01\",\n renderSize: \"32x32\",\n colors: [{ token: \"CHBLK\", hex: \"#000000\", usage: \"Tower, jib, foundation\" }],\n lineStyles: [{ element: \"Tower\", width: 2.0, color: \"#000000\" }, { element: \"Jib arm\", width: 1.5, color: \"#000000\" }, { element: \"Stay wire\", width: 0.8, pattern: \"2, 1\", color: \"#000000\" }],\n fillElements: [{ element: \"Foundation\", color: \"#000000\" }],\n usageContext: \"Port cranes and dockside loading cranes are charted primarily to indicate restricted clearances for vessels passing underneath. Container cranes, gantry cranes, and heavy-lift cranes are common at commercial ports. Their position may affect vessel routing within harbour limits.\" },\n\n { id: \"bridge-fixed\", label: \"Bridge (Fixed)\", int1Ref: \"D20\", section: \"D\", getSvg: () => bridgeFixed(),\n getThemedSvg: (chblk, movable) => bridgeFixed(chblk, movable),\n group: \"bridges\", description: \"Fixed bridge — solid arch. Permanent vertical clearance.\",\n s52PlRef: \"BRIDGE01\", attributeKey: \"CATBRG\", attributeValue: 1,\n renderSize: \"32x32\",\n colors: [{ token: \"CHBLK\", hex: \"#000000\", usage: \"Deck, abutments, arch\" }],\n lineStyles: [{ element: \"Deck\", width: 2.0, color: \"#000000\" }, { element: \"Arch\", width: 1.5, color: \"#000000\" }],\n fillElements: [],\n usageContext: \"Fixed bridges have a permanent vertical clearance that cannot change. Mariners must verify their vessel's air draft against the charted VERCLR value. The solid arch indicates the span is immovable.\" },\n\n { id: \"bridge-opening\", label: \"Bridge (Opening)\", int1Ref: \"D21\", section: \"D\", getSvg: () => bridgeOpening(),\n getThemedSvg: (chblk, movable) => bridgeOpening(chblk, movable),\n group: \"bridges\", description: \"Opening bridge — dashed magenta arch indicates movable span. Covers draw and pontoon types.\",\n s52PlRef: \"BRIDGE01\", attributeKey: \"CATBRG\", attributeValue: 2,\n renderSize: \"32x32\",\n colors: [{ token: \"CHBLK\", hex: \"#000000\", usage: \"Deck, abutments\" }, { token: \"TRFCD\", hex: \"#d200d2\", usage: \"Dashed arch (movable span)\" }],\n lineStyles: [{ element: \"Deck\", width: 2.0, color: \"#000000\" }, { element: \"Dashed arch\", width: 1.5, pattern: \"3, 2\", color: \"#d200d2\" }],\n fillElements: [],\n usageContext: \"Opening bridges have variable clearance — check both VERCCL (closed) and VERCOP (open). Vessels requiring the bridge to open must signal or contact the bridge tender. Includes draw and pontoon bridges.\" },\n\n { id: \"bridge-bascule\", label: \"Bridge (Bascule)\", int1Ref: \"D23.2\", section: \"D\", getSvg: () => bridgeBascule(),\n getThemedSvg: (chblk, movable) => bridgeBascule(chblk, movable),\n group: \"bridges\", description: \"Bascule bridge — tilting leaf with pivot point. One or two leaves rotate upward.\",\n s52PlRef: \"BRIDGE01\", attributeKey: \"CATBRG\", attributeValue: 5,\n renderSize: \"32x32\",\n colors: [{ token: \"CHBLK\", hex: \"#000000\", usage: \"Deck, abutments\" }, { token: \"TRFCD\", hex: \"#d200d2\", usage: \"Tilting leaf and pivot\" }],\n lineStyles: [{ element: \"Deck\", width: 2.0, color: \"#000000\" }, { element: \"Tilting leaf\", width: 2.0, color: \"#d200d2\" }],\n fillElements: [{ element: \"Pivot point\", color: \"#d200d2\" }],\n usageContext: \"Bascule bridges rotate upward around a horizontal pivot. Single-leaf bascules tilt from one side; double-leaf from both. VERCCL gives clearance when closed, VERCOP when open. Common in ports and harbours with regular vessel traffic.\" },\n\n { id: \"bridge-swing\", label: \"Bridge (Swing)\", int1Ref: \"D23.3\", section: \"D\", getSvg: () => bridgeSwing(),\n getThemedSvg: (chblk, movable) => bridgeSwing(chblk, movable),\n group: \"bridges\", description: \"Swing bridge — rotates horizontally around a central pivot point.\",\n s52PlRef: \"BRIDGE01\", attributeKey: \"CATBRG\", attributeValue: 3,\n renderSize: \"32x32\",\n colors: [{ token: \"CHBLK\", hex: \"#000000\", usage: \"Deck, abutments\" }, { token: \"TRFCD\", hex: \"#d200d2\", usage: \"Pivot circle\" }],\n lineStyles: [{ element: \"Deck\", width: 2.0, color: \"#000000\" }, { element: \"Pivot circle\", width: 1.5, color: \"#d200d2\" }],\n fillElements: [{ element: \"Pivot point\", color: \"#d200d2\" }],\n usageContext: \"Swing bridges rotate horizontally about a central pier. When open, the bridge swings parallel to the channel. HORCLR may be reduced when partially open. Vessels must coordinate passage with the bridge tender.\" },\n\n { id: \"bridge-lifting\", label: \"Bridge (Lifting)\", int1Ref: \"D23.1\", section: \"D\", getSvg: () => bridgeLifting(),\n getThemedSvg: (chblk, movable) => bridgeLifting(chblk, movable),\n group: \"bridges\", description: \"Lifting/vertical-lift bridge — entire deck rises vertically between towers.\",\n s52PlRef: \"BRIDGE01\", attributeKey: \"CATBRG\", attributeValue: 4,\n renderSize: \"32x32\",\n colors: [{ token: \"CHBLK\", hex: \"#000000\", usage: \"Deck, towers\" }, { token: \"TRFCD\", hex: \"#d200d2\", usage: \"Lift arrows\" }],\n lineStyles: [{ element: \"Deck\", width: 2.0, color: \"#000000\" }, { element: \"Lift lines\", width: 1.5, color: \"#d200d2\" }],\n fillElements: [{ element: \"Arrow heads\", color: \"#d200d2\" }],\n usageContext: \"Lifting bridges raise the entire deck span vertically between two towers. VERCCL gives clearance in lowered position, VERCOP in raised. The lift mechanism allows precise height control. Common on major waterways with rail crossings.\" },\n\n { id: \"anchor\", label: \"Anchorage\", int1Ref: \"N12\", section: \"N\", getSvg: anchor,\n group: \"anchorage\", description: \"Designated anchorage area. May have specific regulations or restrictions.\",\n s52PlRef: \"ACHARE01\", labelExamples: ['\"Anch\"', '\"Prohibited\"'],\n renderSize: \"32x32\",\n colors: [{ token: \"TRFCD\", hex: \"#d200d2\", usage: \"Anchor symbol\" }],\n lineStyles: [{ element: \"Ring\", width: 1.5, color: \"#d200d2\" }, { element: \"Shank\", width: 1.8, color: \"#d200d2\" }, { element: \"Arms\", width: 1.8, color: \"#d200d2\" }, { element: \"Cross-bar\", width: 1.5, color: \"#d200d2\" }],\n fillElements: [],\n usageContext: \"Anchorage areas are designated zones where vessels may anchor. They may have specific regulations regarding vessel size, duration, and type. Some anchorages are restricted to specific categories of vessel. Mariners should check local notices for current regulations.\" },\n\n // ── Section T: Services ──\n { id: \"pilot-station\", label: \"Pilot Station\", int1Ref: \"T1.1\", section: \"T\", getSvg: pilotStation,\n group: \"services\", description: \"Pilot boarding place or station. Circle with 'P' indicates where pilots embark.\",\n s52PlRef: \"PILBOP01\",\n renderSize: \"32x32\",\n colors: [{ token: \"TRFCD\", hex: \"#d200d2\", usage: \"Circle and letter P\" }],\n lineStyles: [{ element: \"Circle outline\", width: 1.5, color: \"#d200d2\" }],\n fillElements: [],\n usageContext: \"Pilot stations mark the location where maritime pilots board incoming vessels to guide them through harbour approaches and restricted waters. Pilotage is compulsory in many ports. The pilot boarding ground is the area where the pilot vessel meets incoming traffic.\" },\n\n { id: \"signal-station\", label: \"Signal Station\", int1Ref: \"T20\", section: \"T\", getSvg: signalStation,\n group: \"services\", description: \"Visual signal station for maritime communications (flags, lights).\",\n s52PlRef: \"SISTAT01\",\n renderSize: \"32x32\",\n colors: [\n { token: \"TRFCD\", hex: \"#d200d2\", usage: \"Upper flag\" },\n { token: \"Cardinal Yellow\", hex: \"#ffd700\", usage: \"Lower flag\" },\n { token: \"CHBLK\", hex: \"#000000\", usage: \"Mast and flag outlines\" },\n ],\n lineStyles: [{ element: \"Mast\", width: 1.5, color: \"#000000\" }, { element: \"Flag outlines\", width: 0.8, color: \"#000000\" }],\n fillElements: [{ element: \"Upper flag\", color: \"#d200d2\" }, { element: \"Lower flag\", color: \"#ffd700\" }],\n usageContext: \"Signal stations communicate with vessels using visual signals — flags, lights, or semaphore. They relay information about weather, port conditions, tidal state, or vessel traffic. Many traditional signal stations have been replaced by VHF radio, but some remain operational.\" },\n\n { id: \"coastguard-station\", label: \"Coast Guard Station\", int1Ref: \"T10\", section: \"T\", getSvg: coastguardStation,\n group: \"services\", description: \"Coast Guard station providing rescue and enforcement services.\",\n s52PlRef: \"CGUSTA01\",\n renderSize: \"32x32\",\n colors: [{ token: \"TRFCD\", hex: \"#d200d2\", usage: \"Circle and letters CG\" }],\n lineStyles: [{ element: \"Circle outline\", width: 1.5, color: \"#d200d2\" }],\n fillElements: [],\n usageContext: \"Coast Guard stations provide search and rescue services, maritime law enforcement, and safety patrols. In the US, the USCG operates stations at strategic coastal locations. Vessels in distress should contact the nearest Coast Guard station on VHF Channel 16.\" },\n\n // ── Section M: Tracks & Routes ──\n { id: \"recommended-track\", label: \"Recommended Track\", int1Ref: \"M5\", section: \"M\", getSvg: recommendedTrack,\n group: \"routes\", description: \"Track recommended for navigation but not mandatory. Arrow indicates preferred direction.\",\n s52PlRef: \"RECTRC01\",\n renderSize: \"32x32\",\n colors: [{ token: \"TRFCD\", hex: \"#d200d2\", usage: \"Track line and arrowhead\" }],\n lineStyles: [{ element: \"Track line\", width: 1.5, color: \"#d200d2\" }],\n fillElements: [{ element: \"Arrowhead\", color: \"#d200d2\" }],\n usageContext: \"Recommended tracks are suggested routes for navigation through an area. They are not mandatory but indicate the safest or most efficient route. The arrow shows the preferred direction of travel. Mariners should follow recommended tracks where possible, especially in unfamiliar waters.\" },\n\n { id: \"ferry-route\", label: \"Ferry Route\", int1Ref: \"M50\", section: \"M\", getSvg: ferryRoute,\n group: \"routes\", description: \"Regular ferry route. Dashed line with arrow indicates route and direction.\",\n s52PlRef: \"FERYRT01\",\n renderSize: \"32x32\",\n colors: [{ token: \"TRFCD\", hex: \"#d200d2\", usage: \"Route line and arrowhead\" }],\n lineStyles: [{ element: \"Route line\", width: 1.2, pattern: \"4, 3\", color: \"#d200d2\" }],\n fillElements: [{ element: \"Arrowhead\", color: \"#d200d2\" }],\n usageContext: \"Ferry routes mark the regular paths of ferry services. They cross navigable channels and shipping lanes, creating potential conflict points with other traffic. Mariners should exercise caution when crossing ferry routes and be aware of ferry schedules in busy ports.\" },\n];\n\n// ═══════════════════════════════════════════════════════════\n// OBJECT CLASS → DEFAULT SYMBOL MAPPING\n// ═══════════════════════════════════════════════════════════\n\n/** S-57 object class → default symbol ID mapping.\n * Values are S-52 PL symbol names (matching SVG filenames in s52/point/).\n * Conditional expressions in getIconExpression() override these for classes\n * with attribute-dependent variants.\n */\nexport const SYMBOL_MAP: Record<string, string> = {\n // Lateral buoys — overridden by getIconExpression via CATLAM\n BOYLAT: \"BOYCAN01\",\n BOYSPP: \"BOYSPP11\",\n BOYCAR: \"BOYCAR01\",\n BOYISD: \"BOYISD12\",\n BOYSAW: \"BOYSAW12\",\n BOYINB: \"BOYINB01\",\n // Beacons — overridden by getIconExpression via CATLAM/CATCAM\n BCNLAT: \"BCNLAT15\",\n BCNSPP: \"BCNSPP13\",\n BCNCAR: \"BCNCAR01\",\n BCNISD: \"BCNISD21\",\n BCNSAW: \"BCNSAW13\",\n // Lights & signals\n LIGHTS: \"LIGHTS11\",\n LITVES: \"LIGHTS82\",\n LITFLT: \"LIGHTS82\",\n FOGSIG: \"FOGSIG01\",\n RTPBCN: \"RTPBCN02\",\n RDOSTA: \"RTPBCN02\",\n // Nav aids\n DAYMAR: \"DAYTRI01\",\n PILPNT: \"PILPNT02\",\n TOPMAR: \"TOPMAR02\",\n // Hazards\n WRECKS: \"WRECKS04\",\n OBSTRN: \"OBSTRN01\",\n UWTROC: \"UWTROC03\",\n WATTUR: \"WATTUR01\",\n // Landmarks\n LNDMRK: \"BCNTOW01\",\n // Infrastructure\n MORFAC: \"MORFAC04\",\n OFSPLF: \"OFSPLF01\",\n CRANES: \"CRANES01\",\n BRIDGE: \"BRIDGE01\",\n // Services\n PILBOP: \"PILBOP02\",\n SISTAT: \"SISTAT02\",\n SMCFAC: \"ACHARE02\",\n // Land infrastructure\n SILTNK: \"TNKCON02\",\n BUISGL: \"BCNTOW01\",\n HRBFAC: \"ACHARE02\",\n // Areas\n ACHARE: \"ACHARE02\",\n // Airport\n AIRARE: \"AIRARE02\",\n};\n\n// ═══════════════════════════════════════════════════════════\n// DATA-DRIVEN ICON EXPRESSIONS (Mapbox GL)\n// ═══════════════════════════════════════════════════════════\n\n/** Get the Mapbox icon-image expression for data-driven symbol selection.\n * Returns S-52 PL symbol names that correspond to SVG files in s52/point/.\n */\nexport function getIconExpression(layerName: string): string | unknown[] {\n // BOYLAT: Can (port) vs Nun (starboard) per IALA-B\n if (layerName === \"BOYLAT\") {\n return [\n \"match\",\n [\"coalesce\", [\"get\", \"CATLAM\"], [\"get\", \"catlam\"], 0],\n 1, \"BOYCAN01\", // IALA-B: 1 = port-hand = red can\n 2, \"BOYCON01\", // IALA-B: 2 = starboard = green nun/conical\n \"BOYSPP11\", // Default: special purpose\n ];\n }\n\n // BOYCAR: Cardinal direction by CATCAM\n if (layerName === \"BOYCAR\") {\n return [\n \"match\",\n [\"coalesce\", [\"get\", \"CATCAM\"], [\"get\", \"catcam\"], 0],\n 1, \"BOYCAR01\", // North cardinal\n 2, \"BOYCAR02\", // East cardinal\n 3, \"BOYCAR03\", // South cardinal\n 4, \"BOYCAR04\", // West cardinal\n \"BOYCAR01\",\n ];\n }\n\n // BCNLAT: Lateral beacon port vs starboard\n if (layerName === \"BCNLAT\") {\n return [\n \"match\",\n [\"coalesce\", [\"get\", \"CATLAM\"], [\"get\", \"catlam\"], 0],\n 1, \"BCNLAT15\", // Port\n 2, \"BCNLAT16\", // Starboard\n \"BCNLAT15\",\n ];\n }\n\n // BCNCAR: Cardinal beacon direction\n if (layerName === \"BCNCAR\") {\n return [\n \"match\",\n [\"coalesce\", [\"get\", \"CATCAM\"], [\"get\", \"catcam\"], 0],\n 1, \"BCNCAR01\", // North cardinal\n 2, \"BCNCAR02\", // East cardinal\n 3, \"BCNCAR03\", // South cardinal\n 4, \"BCNCAR04\", // West cardinal\n \"BCNCAR01\",\n ];\n }\n\n // WRECKS: Visible vs submerged by WATLEV\n if (layerName === \"WRECKS\") {\n return [\n \"match\",\n [\"coalesce\", [\"get\", \"WATLEV\"], [\"get\", \"watlev\"], 0],\n 1, \"WRECKS01\", // Visible (always dry)\n 2, \"WRECKS01\", // Visible (partly submerged)\n \"WRECKS04\", // Default: submerged/dangerous\n ];\n }\n\n // SILTNK: Silo/tank/grain elevator/water tower by CATSIL, with the\n // conspicuous variant (CONVIS=1) selected when the source HO marked the\n // structure as conspicuous from seaward. Mirrors S-52 PL chartsymbols.xml\n // SILTNK Simplified lookups (RCID 31293–31302).\n if (layerName === \"SILTNK\") {\n const catsil: unknown[] = [\"coalesce\", [\"get\", \"CATSIL\"], [\"get\", \"catsil\"], 0];\n const convis: unknown[] = [\"coalesce\", [\"get\", \"CONVIS\"], [\"get\", \"convis\"], 0];\n return [\n \"case\",\n [\"==\", convis, 1], [\n \"match\", catsil,\n 1, \"SILBUI11\", // Silo, conspicuous\n 2, \"TNKCON12\", // Tank, conspicuous\n 3, \"TOWERS03\", // Grain elevator, conspicuous\n 4, \"TOWERS12\", // Water tower, conspicuous\n \"TNKCON12\", // CONVIS=1 but no CATSIL → conspicuous tank\n ],\n [\n \"match\", catsil,\n 1, \"SILBUI01\", // Silo\n 2, \"TNKCON02\", // Tank\n 3, \"TOWERS01\", // Grain elevator\n 4, \"TOWERS02\", // Water tower\n \"TNKCON02\", // Default: non-conspicuous tank\n ],\n ];\n }\n\n // LNDMRK: Landmark type by CATLMK — maps to S-52 PL or generic tower.\n // Wind farms (CATLMK=18 windmill, 19 wind motor) get dedicated sprites\n // because they're routed through the LNDMRK-wind layer that bypasses\n // the default scamin gate; rendering them as generic towers at low\n // zoom would have misled mariners into thinking offshore wind farms\n // are masonry structures.\n if (layerName === \"LNDMRK\") {\n return [\n \"match\",\n [\"coalesce\", [\"get\", \"CATLMK\"], [\"get\", \"catlmk\"], 0],\n 1, \"CAIRNS11\", // Cairn\n 17, \"BCNTOW01\", // Tower\n 18, \"LNDMRK18\", // Windmill (4-vane)\n 19, \"LNDMRK19\", // Wind motor / turbine (3-blade)\n 20, \"BCNTOW01\", // Spire → tower\n \"BCNTOW01\", // Default: tower\n ];\n }\n\n // DAYMAR: Daymark shape by TOPSHP\n if (layerName === \"DAYMAR\") {\n return [\n \"match\",\n [\"coalesce\", [\"get\", \"TOPSHP\"], [\"get\", \"topshp\"], 0],\n 1, \"DAYTRI01\", // Triangle point up\n 2, \"DAYTRI05\", // Triangle point down\n 3, \"DAYSQR01\", // Square\n 5, \"DAYTRI21\", // Triangle point up (variant)\n \"DAYTRI01\",\n ];\n }\n\n // TOPMAR: Topmark shape by TOPSHP — S-52 PL TOPMAR variants\n if (layerName === \"TOPMAR\") {\n return [\n \"match\",\n [\"coalesce\", [\"get\", \"TOPSHP\"], [\"get\", \"topshp\"], 0],\n 1, \"TOPMAR02\", // Cone, point up\n 2, \"TOPMAR04\", // Cone, point down\n 3, \"TOPMAR10\", // Sphere\n 4, \"TOPMAR12\", // 2 cones, points up\n 5, \"TOPMAR14\", // 2 cones, points down\n 6, \"TOPMAR16\", // 2 cones, base to base (diamond)\n 7, \"TOPMAR18\", // 2 cones, point to point\n 8, \"TOPMAR24\", // 2 spheres\n 9, \"TOPMAR22\", // Diamond\n 10, \"TOPMAR28\", // X-shape\n 11, \"TOPMAR30\", // Upright cross\n 12, \"TOPMAR32\", // Cube, point up\n 13, \"TOPMAR34\", // 2 cones, horizontal\n \"TOPMAR02\",\n ];\n }\n\n // UWTROC: Rock type by WATLEV (S-57 attr B-422.6 → S-52 lookups K11/K12/K13)\n if (layerName === \"UWTROC\") {\n return [\n \"match\",\n [\"coalesce\", [\"get\", \"WATLEV\"], [\"get\", \"watlev\"], 0],\n 4, \"UWTROC01\", // Covers and uncovers — dotted-circle + cross (K11)\n 5, \"UWTROC03\", // Awash at chart datum — solid-circle + cross (K12)\n \"UWTROC04\", // Default / always submerged — asterisk (K13)\n ];\n }\n\n // OBSTRN: Obstruction type by WATLEV\n if (layerName === \"OBSTRN\") {\n return [\n \"match\",\n [\"coalesce\", [\"get\", \"WATLEV\"], [\"get\", \"watlev\"], 0],\n 1, \"OBSTRN01\", // Always dry\n 2, \"OBSTRN01\", // Partly submerged\n 3, \"OBSTRN03\", // Always underwater/submerged\n \"OBSTRN03\",\n ];\n }\n\n // MORFAC: Mooring facility type by CATMOR\n if (layerName === \"MORFAC\") {\n return [\n \"match\",\n [\"coalesce\", [\"get\", \"CATMOR\"], [\"get\", \"catmor\"], 0],\n 1, \"MORFAC04\", // Dolphin\n 2, \"MORFAC04\", // Deviation dolphin\n 3, \"BOYMOR11\", // Mooring buoy\n 7, \"MORFAC03\", // Mooring post\n \"MORFAC04\",\n ];\n }\n\n // BRIDGE: Bridge type by CATBRG (S-57 B-100 → S-52 PresLib D20–D23)\n if (layerName === \"BRIDGE\") {\n return [\n \"match\",\n [\"coalesce\", [\"get\", \"CATBRG\"], [\"get\", \"catbrg\"], 1],\n 1, \"BRIDGE01\", // Fixed bridge (D20)\n 2, \"BRIDGE02\", // Opening bridge — generic movable (D21)\n 3, \"BRIDGE03\", // Swing bridge (D23.3)\n 4, \"BRIDGE04\", // Lifting bridge (D23.1)\n 5, \"BRIDGE05\", // Bascule bridge (D23.2)\n \"BRIDGE01\", // Default: fixed\n ];\n }\n\n // LIGHTS: Light type by COLOUR\n if (layerName === \"LIGHTS\") {\n return [\n \"match\",\n [\"coalesce\", [\"get\", \"CATLIT\"], [\"get\", \"catlit\"], 0],\n 8, \"LIGHTS82\", // Aero light\n 9, \"LIGHTS82\", // Air obstruction light\n \"LIGHTS11\", // Default: major light\n ];\n }\n\n return SYMBOL_MAP[layerName] ?? \"\";\n}\n\n/**\n * Browser-only image loaders (`loadSymbolImages`, `loadThemedBridgeImages`)\n * live in `./symbols-browser.ts` (sub-export `@chrtco/sdk/atlas/browser`) —\n * they require a DOM (use `new Image()` + `map.addImage()`).\n */\n\n/** Get inline SVG string for a symbol by ID (for the Atlas legend) */\nexport function getSymbolSvgString(symbolId: string): string | null {\n const sym = NAUTICAL_SYMBOLS.find((s) => s.id === symbolId);\n return sym ? sym.getSvg() : null;\n}\n\n// ═══════════════════════════════════════════════════════════\n// CHART SECTIONS\n// ═══════════════════════════════════════════════════════════\n\nexport const CHART_SECTIONS: ChartSection[] = [\n { id: \"Q\", label: \"Buoys, Beacons & Topmarks\", description: \"All floating and fixed aids to navigation including lateral, cardinal, special purpose marks, and their topmarks.\" },\n { id: \"P\", label: \"Lights\", description: \"Navigational lights including major, minor, sector, directional, and aeronautical lights.\" },\n { id: \"R\", label: \"Fog Signals\", description: \"Audible fog signal devices for navigation in restricted visibility.\" },\n { id: \"S\", label: \"Radar & Radio\", description: \"Radar beacons (RACON), radar transponders, and radio stations.\" },\n { id: \"K\", label: \"Dangers\", description: \"Wrecks, rocks, obstructions, and other underwater hazards.\" },\n { id: \"E\", label: \"Landmarks\", description: \"Conspicuous objects ashore useful for visual navigation and position fixing.\" },\n { id: \"D\", label: \"Bridges\", description: \"Bridges spanning navigable waterways with clearance information.\" },\n { id: \"L\", label: \"Offshore Installations\", description: \"Platforms, wind farms, and other offshore structures.\" },\n { id: \"N\", label: \"Regulated Areas\", description: \"Anchorages, restricted areas, and special-purpose zones.\" },\n { id: \"T\", label: \"Services\", description: \"Pilot stations, signal stations, and coast guard facilities.\" },\n { id: \"M\", label: \"Tracks & Routes\", description: \"Recommended tracks, ferry routes, and traffic separation schemes.\" },\n];\n\n// ═══════════════════════════════════════════════════════════\n// SYMBOL GROUPS\n// ═══════════════════════════════════════════════════════════\n\nexport const SYMBOL_GROUPS: SymbolGroup[] = [\n { id: \"lateral-buoys\", label: \"Lateral Buoys\", section: \"Q\", description: \"Channel marking buoys — Can (port/red) and Nun (starboard/green) per IALA Region B.\", symbolIds: [\"buoy-can\", \"buoy-nun\"] },\n { id: \"buoy-shapes\", label: \"Buoy Hull Shapes\", section: \"Q\", description: \"The physical shape of a buoy hull: spar, pillar, spherical, barrel, or super buoy.\", symbolIds: [\"buoy-spar\", \"buoy-pillar\", \"buoy-spherical\", \"buoy-barrel\", \"buoy-super\"] },\n { id: \"cardinal-buoys\", label: \"Cardinal Buoys\", section: \"Q\", description: \"Indicate the safe side to pass relative to a danger. Four variants: N, S, E, W with distinctive topmarks and color bands.\", symbolIds: [\"buoy-cardinal-north\", \"buoy-cardinal-south\", \"buoy-cardinal-east\", \"buoy-cardinal-west\"] },\n { id: \"special-buoys\", label: \"Special Purpose Buoys\", section: \"Q\", description: \"Isolated danger, safe water, special purpose, and emergency wreck marking buoys.\", symbolIds: [\"buoy-isolated-danger\", \"buoy-safe-water\", \"buoy-special\", \"buoy-emergency-wreck\"] },\n { id: \"mooring\", label: \"Mooring\", section: \"Q\", description: \"Permanent mooring buoys and single-point moorings for vessel berthing.\", symbolIds: [\"mooring-buoy\", \"spm\"] },\n { id: \"beacons\", label: \"Beacons\", section: \"Q\", description: \"Fixed structures (not floating) with topmarks indicating lateral, cardinal, or special purpose information.\", symbolIds: [\"beacon-lateral-port\", \"beacon-lateral-stbd\", \"beacon-cardinal\", \"beacon-isolated-danger\", \"beacon-safe-water\", \"beacon-special\", \"pile-post\"] },\n { id: \"daymarks\", label: \"Daymarks\", section: \"Q\", description: \"Painted boards on beacons providing daytime identification. Triangle (port) and square (starboard).\", symbolIds: [\"daymark-triangle\", \"daymark-square\"] },\n { id: \"topmarks\", label: \"Topmarks\", section: \"Q\", description: \"Shapes mounted atop buoys/beacons to identify their purpose (TOPMAR). 10 standard shapes defined by TOPSHP attribute.\", symbolIds: [\"topmark-cone-up\", \"topmark-cone-down\", \"topmark-sphere\", \"topmark-2-cones-up\", \"topmark-2-cones-down\", \"topmark-2-cones-base\", \"topmark-2-cones-point\", \"topmark-2-spheres\", \"topmark-diamond\", \"topmark-x-shape\"] },\n { id: \"lights\", label: \"Lights\", section: \"P\", description: \"Navigational lights ranging from major coastal lights to minor buoy lights, sector and directional lights.\", symbolIds: [\"light-major\", \"light-minor\", \"light-sector\", \"light-directional\", \"light-aero\"] },\n { id: \"light-vessels\", label: \"Light Vessels & Floats\", section: \"P\", description: \"Manned or unmanned vessels and floats serving as floating lighthouses.\", symbolIds: [\"light-vessel\", \"light-float\"] },\n { id: \"fog-radar\", label: \"Fog Signals & Radar\", section: \"R\", description: \"Audible signals for fog conditions and radar transponders (RACON) for electronic identification.\", symbolIds: [\"fog-signal\", \"radar-transponder\"] },\n { id: \"wrecks\", label: \"Wrecks\", section: \"K\", description: \"Sunken or stranded vessels — visible, submerged, or dangerous to navigation.\", symbolIds: [\"wreck-visible\", \"wreck-submerged\", \"wreck-dangerous\"] },\n { id: \"rocks\", label: \"Rocks\", section: \"K\", description: \"Natural rock hazards — awash, underwater, or covering/uncovering with tide.\", symbolIds: [\"rock-awash\", \"rock-underwater\", \"rock-covers-uncovers\"] },\n { id: \"obstructions\", label: \"Obstructions\", section: \"K\", description: \"Underwater obstructions that are not wrecks or rocks (e.g., stumps, wellheads, fish havens).\", symbolIds: [\"obstruction\"] },\n { id: \"landmarks\", label: \"Landmarks\", section: \"E\", description: \"Conspicuous objects ashore identified by their type (CATLMK attribute). 15 distinct shapes.\", symbolIds: [\"landmark-spire\", \"landmark-tower\", \"landmark-chimney\", \"landmark-flagstaff\", \"landmark-monument\", \"landmark-windmill\", \"landmark-wind-turbine\", \"landmark-dome\", \"landmark-radar-scanner\", \"landmark-dish-aerial\", \"landmark-water-tower\", \"landmark-radio-tv-mast\", \"landmark-cross\", \"landmark-mast\", \"landmark-silo\"] },\n { id: \"bridges\", label: \"Bridges\", section: \"D\", description: \"Bridges spanning navigable waterways. Fixed, opening, bascule, swing, and lifting types.\", symbolIds: [\"bridge-fixed\", \"bridge-opening\", \"bridge-bascule\", \"bridge-swing\", \"bridge-lifting\"] },\n { id: \"infrastructure\", label: \"Infrastructure\", section: \"L\", description: \"Fixed offshore structures and port facilities.\", symbolIds: [\"offshore-platform\", \"crane\"] },\n { id: \"anchorage\", label: \"Anchorage\", section: \"N\", description: \"Designated anchorage areas and berths.\", symbolIds: [\"anchor\"] },\n { id: \"services\", label: \"Services\", section: \"T\", description: \"Maritime service facilities including pilot stations, signal stations, and coast guard.\", symbolIds: [\"pilot-station\", \"signal-station\", \"coastguard-station\"] },\n { id: \"routes\", label: \"Tracks & Routes\", section: \"M\", description: \"Recommended navigation tracks and regular ferry routes.\", symbolIds: [\"recommended-track\", \"ferry-route\"] },\n];\n\n// ═══════════════════════════════════════════════════════════\n// SPRITE SHEET GENERATION\n// ═══════════════════════════════════════════════════════════\n\n/** Generate a single SVG sprite sheet containing all symbols as <symbol> elements */\nexport function generateSpriteSheet(): string {\n const symbols = NAUTICAL_SYMBOLS.map((sym) => {\n const raw = sym.getSvg();\n // Extract inner content from <svg>...</svg>\n const inner = raw.replace(/<svg[^>]*>/, \"\").replace(/<\\/svg>/, \"\");\n return ` <symbol id=\"${sym.id}\" viewBox=\"0 0 32 32\">${inner}</symbol>`;\n });\n\n return `<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<svg xmlns=\"http://www.w3.org/2000/svg\" style=\"display:none\">\n <!-- CHRT Nautical Symbol Sprite Sheet -->\n <!-- ${NAUTICAL_SYMBOLS.length} symbols | IHO S-52 Ed 4.0 | Generated ${new Date().toISOString()} -->\n${symbols.join(\"\\n\")}\n</svg>`;\n}\n\n/** Generate a JSON manifest mapping symbol IDs to metadata */\nexport function generateSpriteManifest(): Record<string, {\n label: string;\n int1Ref: string;\n section: string;\n group?: string;\n s52PlRef?: string;\n description?: string;\n attributeKey?: string;\n attributeValue?: number;\n}> {\n const manifest: Record<string, any> = {};\n for (const sym of NAUTICAL_SYMBOLS) {\n manifest[sym.id] = {\n label: sym.label,\n int1Ref: sym.int1Ref,\n section: sym.section,\n ...(sym.group && { group: sym.group }),\n ...(sym.s52PlRef && { s52PlRef: sym.s52PlRef }),\n ...(sym.description && { description: sym.description }),\n ...(sym.attributeKey && { attributeKey: sym.attributeKey }),\n ...(sym.attributeValue !== undefined && { attributeValue: sym.attributeValue }),\n };\n }\n return manifest;\n}\n","import { resolveColor } from \"./s52-colors\";\nimport type { ColorTableName } from \"./s52-colors\";\nimport { S52_LOOKUP } from \"./s52-lookup\";\nimport {\n depareFillExpression,\n lightFillExpression,\n lateralFillExpression,\n hazardFillExpression,\n vegatnPatternExpression,\n} from \"./s52-conditional\";\nimport { getIconExpression, SYMBOL_MAP } from \"./symbols\";\nimport type { ResolvedStyle, GeomType, DisplayCategory } from \"./types\";\n\n/** S-52 display modes */\nexport type DisplayMode = \"BASE\" | \"STANDARD\" | \"ALL\";\n\n/** Check if a layer's display category is visible in the given mode */\nexport function isVisibleInMode(displayCategory: DisplayCategory, mode: DisplayMode): boolean {\n if (displayCategory === \"META\") return false;\n if (mode === \"ALL\") return true;\n if (mode === \"STANDARD\") return displayCategory === \"BASE\" || displayCategory === \"STANDARD\";\n return displayCategory === \"BASE\";\n}\n\n/**\n * Convert S-52 SCAMIN (scale minimum) to Mapbox GL minzoom.\n */\nexport function scaminToMinZoom(scamin?: number): number | undefined {\n if (scamin === undefined || scamin === null || scamin === 0) return undefined;\n if (scamin >= 1_500_000) return 6;\n if (scamin >= 350_000) return 8;\n if (scamin >= 90_000) return 10;\n if (scamin >= 45_000) return 11;\n if (scamin >= 22_000) return 12;\n if (scamin >= 12_000) return 14;\n return undefined;\n}\n\nconst SAFETY_CRITICAL_GROUPS = new Set([24020, 27010, 27070, 27080]);\n\n/** Base cartographic fill layers that must be fully opaque to prevent patchwork from cell overlaps.\n * SEAARE is included so its cross-band water base (see `draw-order.ts` and the\n * `s52-lookup.ts` SEAARE entry) doesn't blend additively where multiple bands' SEAARE polygons\n * overlap — band-draw-order makes the higher-band's copy win, opaquely. */\nconst OPAQUE_FILL_LAYERS = new Set([\"DEPARE\", \"LNDARE\", \"UNSARE\", \"LAKARE\", \"DRGARE\", \"SEAARE\"]);\n\n/** Nav-aid layers that should always render regardless of SCAMIN.\n *\n * LNDMRK is intentionally NOT in this set: instead, the layer-builder splits\n * it into a `wind` variant (CATLMK ∈ {18, 19} — windmills + wind motors,\n * including offshore wind farms) that overrides scamin and an `other`\n * variant that keeps the default scamin (z≥12). Keeps low-zoom views from\n * being cluttered with towers, silos, and spires while still surfacing\n * Block Island / South Fork / Revolution wind farms at sound-scale views. */\nconst SCAMIN_OVERRIDE_LAYERS = new Set([\n \"BOYLAT\", \"BOYCAR\", \"BOYSPP\", \"BOYISD\", \"BOYSAW\",\n \"BCNLAT\", \"BCNCAR\", \"BCNSPP\",\n \"LIGHTS\",\n \"FOGSIG\", \"RTPBCN\",\n]);\n\nexport function getCollisionSettings(viewingGroup?: number): {\n iconAllowOverlap: boolean;\n iconOptional: boolean;\n symbolSortKey?: number;\n} {\n if (!viewingGroup) return { iconAllowOverlap: false, iconOptional: true };\n const isSafety = SAFETY_CRITICAL_GROUPS.has(viewingGroup);\n return {\n iconAllowOverlap: isSafety,\n iconOptional: !isSafety,\n symbolSortKey: 99999 - viewingGroup,\n };\n}\n\nconst ZOOM_SCALED_LINES: Record<string, [number, number, number, number]> = {\n DEPCNT: [8, 0.3, 14, 0.8],\n COALNE: [8, 0.5, 14, 1.5],\n SLCONS: [8, 0.6, 14, 1.5],\n TSSBND: [8, 0.5, 14, 1.0],\n BRIDGE: [8, 1.0, 14, 2.0],\n DAMCON: [8, 1.0, 14, 2.0],\n};\n\n/**\n * Resolve S-52 colour tokens in a paint object to hex values.\n */\nfunction resolvePaint(\n layerName: string,\n paint: Record<string, unknown>,\n geomType: GeomType,\n ct: ColorTableName = \"DAY\"\n): Record<string, unknown> {\n const resolved: Record<string, unknown> = {};\n\n for (const [key, value] of Object.entries(paint)) {\n // S-52 colour tokens are 4–5 uppercase letters with an optional single\n // digit (CHBLK, DEPDW, LANDF, etc.). `fill-pattern` values like\n // \"VEGATN03\" / \"MARSHES1\" are 6+ letters and won't match this regex,\n // so they pass through unchanged — which is what we want for sprite-\n // image references.\n if (typeof value === \"string\" && /^[A-Z]{4,5}[0-9]?$/.test(value)) {\n resolved[key] = resolveColor(value, ct);\n } else {\n resolved[key] = value;\n }\n }\n\n // Inject data-driven expressions for conditional layers\n if (layerName === \"DEPARE\" && geomType === \"fill\") {\n resolved[\"fill-color\"] = depareFillExpression(ct);\n } else if (layerName === \"LIGHTS\" && geomType === \"circle\") {\n resolved[\"circle-color\"] = lightFillExpression(ct);\n } else if ((layerName === \"BOYLAT\" || layerName === \"BCNLAT\") && geomType === \"circle\") {\n resolved[\"circle-color\"] = lateralFillExpression(ct);\n } else if (\n (layerName === \"OBSTRN\" || layerName === \"UWTROC\" || layerName === \"WRECKS\") &&\n geomType === \"circle\"\n ) {\n resolved[\"circle-color\"] = hazardFillExpression(ct);\n } else if (layerName === \"VEGATN\" && geomType === \"fill\") {\n // CATVEG → pattern-image name, picking marsh tufts for wet vegetation\n // and tree-circles for woods. `fill-color` stays as the LANDF fallback\n // (rendered only if the pattern image fails to load).\n resolved[\"fill-pattern\"] = vegatnPatternExpression();\n }\n\n return resolved;\n}\n\n/**\n * Get the resolved Mapbox GL style for a given S-57 layer.\n */\nexport function resolveStyle(\n layerName: string,\n geomKind?: GeomType,\n ct: ColorTableName = \"DAY\"\n): ResolvedStyle {\n const entry = S52_LOOKUP[layerName];\n\n if (!entry) {\n const type = geomKind ?? \"circle\";\n return {\n type,\n paint: type === \"fill\"\n ? { \"fill-color\": \"#888888\", \"fill-opacity\": 0.2 }\n : type === \"line\"\n ? { \"line-color\": \"#888888\", \"line-width\": 1 }\n : { \"circle-color\": \"#888888\", \"circle-radius\": 3, \"circle-stroke-width\": 0 },\n };\n }\n\n const effectiveType = geomKind ?? entry.style.type;\n\n if (effectiveType === \"symbol\" && entry.style.iconImage) {\n const iconExpr = getIconExpression(layerName);\n return {\n type: \"symbol\",\n paint: {},\n layout: {\n \"icon-image\": iconExpr,\n \"icon-size\": [\"interpolate\", [\"linear\"], [\"zoom\"], 6, 0.32, 13, 0.32, 14, 0.36, 18, 1.04],\n \"icon-allow-overlap\": true,\n \"icon-ignore-placement\": false,\n ...(entry.style.layout ?? {}),\n },\n };\n }\n\n if (effectiveType === \"circle\" && entry.style.type === \"symbol\") {\n return {\n type: \"circle\",\n paint: { \"circle-color\": \"#888888\", \"circle-radius\": 4, \"circle-stroke-width\": 1, \"circle-stroke-color\": resolveColor(\"CHBLK\", ct) },\n };\n }\n\n if (effectiveType !== entry.style.type) {\n const mainColorToken = findMainColorToken(entry.style.paint);\n const hexColor = resolveColor(mainColorToken, ct);\n const paint =\n effectiveType === \"fill\"\n ? { \"fill-color\": hexColor, \"fill-opacity\": 0.3 }\n : effectiveType === \"line\"\n ? { \"line-color\": hexColor, \"line-width\": 1 }\n : { \"circle-color\": hexColor, \"circle-radius\": 3, \"circle-stroke-width\": 0 };\n return { type: effectiveType, paint };\n }\n\n const paint = resolvePaint(layerName, { ...entry.style.paint }, effectiveType, ct);\n\n // Force opaque fills for base cartographic layers to prevent patchwork from overlapping cells\n if (effectiveType === \"fill\" && OPAQUE_FILL_LAYERS.has(layerName)) {\n paint[\"fill-opacity\"] = 1.0;\n }\n\n if (effectiveType === \"line\" && ZOOM_SCALED_LINES[layerName]) {\n const [z1, w1, z2, w2] = ZOOM_SCALED_LINES[layerName];\n paint[\"line-width\"] = [\"interpolate\", [\"linear\"], [\"zoom\"], z1, w1, z2, w2];\n }\n\n const minzoom = SCAMIN_OVERRIDE_LAYERS.has(layerName) ? undefined : scaminToMinZoom(entry.scamin);\n const layout = entry.style.layout ? { ...entry.style.layout } : undefined;\n if (effectiveType === \"symbol\" && layout) {\n const collision = getCollisionSettings(entry.viewingGroup);\n layout[\"icon-allow-overlap\"] = collision.iconAllowOverlap;\n if (collision.iconOptional) layout[\"icon-optional\"] = true;\n if (collision.symbolSortKey !== undefined) layout[\"symbol-sort-key\"] = collision.symbolSortKey;\n }\n\n return { type: effectiveType, paint, layout, minzoom };\n}\n\nfunction findMainColorToken(paint: Record<string, unknown>): string {\n for (const key of [\"fill-color\", \"line-color\", \"circle-color\", \"circle-stroke-color\"]) {\n const v = paint[key];\n if (typeof v === \"string\" && /^[A-Z]/.test(v)) return v;\n }\n return \"CHGRF\";\n}\n\nexport function getLookupEntry(layerName: string) {\n return S52_LOOKUP[layerName] ?? null;\n}\n","/**\n * Label configurations for S-57 layers.\n * Defines which layers get text labels and how to extract label text.\n */\n\nimport type maplibregl from \"maplibre-gl\";\nimport type { ExpressionSpecification } from \"@maplibre/maplibre-gl-style-spec\";\nimport type { GeomType } from \"./types\";\nimport { resolveColor, type ColorTableName } from \"./s52-colors\";\n\n/** LITCHR code → abbreviation */\nconst LITCHR_ABBR: Record<number, string> = {\n 1: \"F\",\n 2: \"Fl\",\n 3: \"LFl\",\n 4: \"Oc\",\n 5: \"Iso\",\n 6: \"S.Fl\",\n 7: \"S.LFl\",\n 8: \"Al.Oc\",\n 9: \"Al.LFl\",\n 10: \"Al.Fl\",\n 11: \"Al.Gp\",\n 12: \"Mo\",\n 13: \"Q\",\n 14: \"VQ\",\n 15: \"UQ\",\n 16: \"Al\",\n 17: \"Al.F.Fl\",\n 25: \"Q+LFl\",\n 26: \"VQ+LFl\",\n 27: \"UQ+LFl\",\n 28: \"Al\",\n 29: \"F.LFl\",\n};\n\n/** COLOUR code → letter */\nconst COLOUR_ABBR: Record<number, string> = {\n 1: \"W\",\n 3: \"R\",\n 4: \"G\",\n 5: \"Bu\",\n 6: \"Y\",\n 11: \"Or\",\n};\n\n/**\n * S-57 NATSUR (nature of surface) code → chart abbreviation.\n * Source: NOAA Chart No. 1 / IHO INT1 §J, \"Nature of the Seabed\".\n * Order here is the order codes appear in the rendered label when a feature\n * carries multiple values (e.g. NATSUR=[\"4\",\"1\"] → \"S.M\").\n */\nconst NATSUR_ABBR: Array<[number, string]> = [\n [1, \"M\"], // mud\n [2, \"Cy\"], // clay\n [3, \"Si\"], // silt\n [4, \"S\"], // sand\n [5, \"St\"], // stones\n [6, \"G\"], // gravel\n [7, \"P\"], // pebbles\n [8, \"Cb\"], // cobbles\n [9, \"R\"], // rock\n [11, \"La\"], // lava\n [14, \"Co\"], // coral\n [17, \"Sh\"], // shells\n [18, \"Bo\"], // boulder\n];\n\n/**\n * S-57 NATQUA (quality of surface) code → lowercase qualifier.\n * Prepended to the first NATSUR abbreviation (e.g. NATQUA=1 + NATSUR=4 → \"fS\").\n */\nconst NATQUA_ABBR: Array<[number, string]> = [\n [1, \"f\"], // fine\n [2, \"m\"], // medium\n [3, \"c\"], // coarse\n [4, \"bk\"], // broken\n [5, \"sy\"], // sticky\n [6, \"so\"], // soft\n [7, \"sf\"], // stiff\n [8, \"v\"], // volcanic\n [9, \"ca\"], // calcareous\n [10, \"h\"], // hard\n];\n\nconst DARK_BG = \"#1a1d23\";\n\n/**\n * Shared text-size curve for buoy / beacon / light / fog-signal labels.\n * Grows from 8 px at coastal scale to 13 px at deep zoom so the labels\n * stay legible as the user zooms in, without feeling heavy at low zoom.\n */\nconst NAV_AID_LABEL_TEXT_SIZE: ExpressionSpecification = [\n \"interpolate\", [\"linear\"], [\"zoom\"],\n 10, 8,\n 14, 10,\n 18, 13,\n] as unknown as ExpressionSpecification;\n\n/**\n * Semibold font stack used by buoy / beacon / light / fog-signal labels.\n * One step heavier than the default Open Sans Regular — gives the dark\n * text fill a thicker stroke so chart names read cleanly against the\n * pale water fills underneath.\n */\nconst NAV_AID_LABEL_FONT: string[] = [\"Open Sans Semibold\"];\n\n/**\n * Build a `code in list-typed S-57 attribute` expression that is robust to\n * the four observed property shapes after the GeoJSON / tippecanoe path\n * (same set handled by `colourCodeCase` in s52-conditional.ts):\n * - native array of strings/numbers → to-string yields `[\\\"4\\\"]` / `[4]`\n * - JSON-stringified array → `\"[\\\"4\\\"]\"`\n * - bare scalar (string or number) → `\"4\"` or `4`\n * - comma-separated string → `\"4,1\"` (some processing paths)\n *\n * Matches `\"<code>\"` (JSON array form) or `,<code>,` after padding the\n * stringified value with commas (covers bare scalar and comma-list forms).\n * The padded form does NOT mismatch e.g. `1` against `11` because `,1,`\n * does not appear inside `,11,`.\n */\nfunction listAttrHasCode(stringified: unknown, code: number): unknown {\n return [\n \"any\",\n [\">=\", [\"index-of\", `\"${code}\"`, stringified], 0],\n [\n \">=\",\n [\"index-of\", `,${code},`, [\"concat\", \",\", stringified, \",\"]],\n 0,\n ],\n ];\n}\n\n/**\n * Build a Mapbox GL text expression that renders S-57 seabed classification\n * abbreviations from NATSUR + NATQUA (e.g. `S`, `M`, `S.M`, `fS.M`, `Co`).\n *\n * NATSUR is list-typed; multiple values render joined by `.`. The first\n * NATQUA value is prepended as a lowercase qualifier (e.g. `f` for fine).\n * The implementation always concatenates `.<abbr>` for each present code\n * then slices off the leading `.` — clean even when zero or multiple codes\n * are present (empty string and `\"S.M\"` respectively).\n */\nfunction buildSeabedLabelExpression(): ExpressionSpecification {\n const natsurStr: unknown = [\n \"to-string\",\n [\"coalesce\", [\"get\", \"NATSUR\"], [\"get\", \"natsur\"], \"\"],\n ];\n const natquaStr: unknown = [\n \"to-string\",\n [\"coalesce\", [\"get\", \"NATQUA\"], [\"get\", \"natqua\"], \"\"],\n ];\n\n const natquaPrefix: unknown[] = [\"case\"];\n for (const [code, abbr] of NATQUA_ABBR) {\n natquaPrefix.push(listAttrHasCode(natquaStr, code), abbr);\n }\n natquaPrefix.push(\"\");\n\n const natsurParts: unknown[] = [\"concat\"];\n for (const [code, abbr] of NATSUR_ABBR) {\n natsurParts.push([\n \"case\",\n listAttrHasCode(natsurStr, code),\n `.${abbr}`,\n \"\",\n ]);\n }\n const natsurJoined: unknown = [\"slice\", natsurParts, 1];\n\n return [\"concat\", natquaPrefix, natsurJoined] as unknown as ExpressionSpecification;\n}\n\n/**\n * Cartographic palette tuned for the Carto dark-matter basemap.\n * Italic blue-grey for water; warm cream regular for land; muted regions\n * for hazards / dangers. Halo always uses DARK_BG so labels stay legible\n * over the chart fills underneath.\n */\nconst COLOR = {\n WATER: \"#9ec1d8\",\n WATER_DEEP: \"#8fb8d0\",\n LAND_REGION: \"#e8d8b8\",\n LAND_NATURAL: \"#e0d8c8\",\n CITY: \"#f1e7d2\",\n AIRPORT: \"#d4c9b0\",\n STRUCTURE: \"#bfa88a\",\n STRUCTURE_LIGHT: \"#c8c0b0\",\n SOUNDING: \"#c8c8c8\",\n NAV_NUMBER: \"#ffffff\",\n NAV_CARDINAL: \"#fdf0b0\",\n NAV_SPECIAL: \"#eab308\",\n LIGHT: \"#fdf0b0\",\n} as const;\n\n/**\n * Sort-key that prioritises broader-scope band cells when the same OBJNAM\n * appears in multiple bands. NOAA encodes the source band as the third\n * character of `_cell_id` (`US3...`/`US4...`/`US5...`). Lower band code →\n * lower sort key → drawn first → wins MapLibre's collision arbitration.\n *\n * Used only for `orientation-cross-band` labels (sea-area names, land\n * regions, cities, etc.) where deduplication is desired across bands.\n * Falls back to `9` for features without `_cell_id` so they sort last.\n */\nconst ORIENTATION_BAND_SORT_KEY = [\n \"to-number\",\n [\"slice\", [\"coalesce\", [\"get\", \"_cell_id\"], \"??9???\"], 2, 3],\n 9,\n] as unknown as ExpressionSpecification;\n\nexport interface LabelLayerConfig {\n /** Mapbox source layer type */\n type: \"symbol\";\n /** Text field expression or string */\n textField: ExpressionSpecification | string;\n /** Text size in pixels */\n textSize: number | ExpressionSpecification;\n /** Text color (hex) or data-driven expression */\n textColor: string | ExpressionSpecification;\n /** Halo color for contrast */\n textHaloColor: string;\n /** Halo width — pixels or zoom-interpolation expression */\n textHaloWidth: number | ExpressionSpecification;\n /** Text offset [x, y] in ems */\n textOffset: [number, number];\n /** Font stack */\n textFont?: string[];\n /** Additional layout properties */\n layout?: Record<string, unknown>;\n /** Minimum zoom level for this label */\n minzoom?: number;\n}\n\n/**\n * Optional palette-and-data-driven options for label config.\n *\n * Currently used by SOUNDG to pick palette-aware text/halo colors and to\n * drive the S-52 safety-contour two-shade rule. Other classes ignore\n * these options.\n */\nexport interface LabelConfigOptions {\n /** S-52 colour table — drives palette-aware text and halo colors. */\n colorTable?: ColorTableName;\n /**\n * Safety contour depth in metres. Soundings shoaler than this render in\n * `SNDG2` (high-contrast); deeper soundings render in `SNDG1` (muted).\n * S-52 §SOUNDG02 conditional symbology.\n */\n safetyContour?: number;\n /**\n * When false, all soundings render in `SNDG2` (single-shade). Default\n * true — emit the safety-contour case expression.\n */\n twoShadeSoundings?: boolean;\n /**\n * When \"semibold\", SOUNDG labels use Open Sans Semibold for crisper\n * numerals at small sizes. Default \"semibold\".\n */\n soundingFontWeight?: \"regular\" | \"semibold\";\n}\n\n/**\n * Two-tier label rendering strategy for the band-priority style.\n *\n * `feature-band-gated` — emit one variant per source band, each gated to\n * its band's zoom window (the existing `makeBandVariants` behaviour). Right\n * for dense feature labels where seeing the same buoy designation or\n * sounding twice across overlapping bands is visual noise.\n *\n * `orientation-cross-band` — emit a SINGLE label layer with no band\n * filter. The per-class `minzoom` is honoured. Right for orientation\n * \"where am I\" labels (sea-area names, land regions, cities) — these\n * must persist as the user zooms in, even if the broader-scope cell\n * carrying the OBJNAM is from a coarser band than the one rendering\n * features at the current zoom. Collision arbitration via\n * `ORIENTATION_BAND_SORT_KEY` gives the broader-scope (lower-band) copy\n * priority where the same OBJNAM exists in multiple bands.\n */\nexport type LabelBehavior = \"feature-band-gated\" | \"orientation-cross-band\";\n\nexport const LABEL_BEHAVIOR: Record<string, LabelBehavior> = {\n // Orientation labels — render once across all bands.\n SEAARE: \"orientation-cross-band\",\n LNDRGN: \"orientation-cross-band\",\n LAKARE: \"orientation-cross-band\",\n RIVERS: \"orientation-cross-band\",\n CANALS: \"orientation-cross-band\",\n BUAARE: \"orientation-cross-band\",\n AIRARE: \"orientation-cross-band\",\n LNDARE: \"orientation-cross-band\",\n\n // Production areas (offshore wind farms, oil/gas platforms) — rare but\n // named. Use polygon-centroid placement across bands so \"Block Island\n // Wind Farm\" / \"Vineyard Wind\" labels show when the area renders.\n PRDARE: \"orientation-cross-band\",\n\n // Feature-specific labels — fan by band so only the dominant band shows.\n SOUNDG: \"feature-band-gated\",\n DEPCNT: \"feature-band-gated\",\n LIGHTS: \"feature-band-gated\",\n BOYLAT: \"feature-band-gated\",\n BCNLAT: \"feature-band-gated\",\n BOYCAR: \"feature-band-gated\",\n BCNCAR: \"feature-band-gated\",\n BOYSPP: \"feature-band-gated\",\n BCNSPP: \"feature-band-gated\",\n BOYISD: \"feature-band-gated\",\n BOYSAW: \"feature-band-gated\",\n BRIDGE: \"feature-band-gated\",\n PILPNT: \"feature-band-gated\",\n MORFAC: \"feature-band-gated\",\n SLCONS: \"feature-band-gated\",\n BUISGL: \"feature-band-gated\",\n LNDMRK: \"feature-band-gated\",\n};\n\n/** Returns the rendering strategy for an S-57 class. Unknown classes default to band-gated. */\nexport function getLabelBehavior(layerName: string): LabelBehavior {\n return LABEL_BEHAVIOR[layerName] ?? \"feature-band-gated\";\n}\n\n/** Get label config for a given S-57 layer, or null if no labels */\nexport function getLabelConfig(\n layerName: string,\n opts: LabelConfigOptions = {},\n): LabelLayerConfig | null {\n switch (layerName) {\n case \"SOUNDG\": {\n const ct: ColorTableName = opts.colorTable ?? \"DAY\";\n const safetyContour = opts.safetyContour ?? 10;\n const twoShade = opts.twoShadeSoundings ?? true;\n const weight = opts.soundingFontWeight ?? \"semibold\";\n\n // S-52 §SOUNDG02 — soundings shoaler than the safety contour render\n // in the high-contrast color so they visually pop; deeper soundings\n // render in the muted color so the eye walks the chart to shoals\n // first. When `twoShade` is false, all soundings render in the\n // high-contrast color.\n //\n // Screen-first palette choice (.chrt/standards/s-52.md §8a):\n // DAY mode follows strict S-52 print spec — dark text on a white\n // halo over light blue water. DUSK/NIGHT keep the \"light text +\n // dark halo cut-out\" pattern via their SNDG2/UIBCK palette tokens.\n const screenColors =\n ct === \"DAY\"\n ? { shoaler: DARK_BG, deeper: \"#4a5560\", halo: \"#ffffff\" }\n : { shoaler: resolveColor(\"SNDG2\", ct), deeper: resolveColor(\"SNDG1\", ct), halo: resolveColor(\"UIBCK\", ct) };\n\n const depthExpr = [\n \"to-number\",\n [\"coalesce\", [\"get\", \"depth\"], [\"get\", \"DEPTH\"], [\"get\", \"VALSOU\"]],\n 9999,\n ];\n const textColor: ExpressionSpecification = twoShade\n ? ([\n \"case\",\n [\"<\", depthExpr, safetyContour],\n screenColors.shoaler,\n screenColors.deeper,\n ] as unknown as ExpressionSpecification)\n : (screenColors.shoaler as unknown as ExpressionSpecification);\n\n const haloColor = screenColors.halo;\n\n const fontStack =\n weight === \"semibold\"\n ? [\"Open Sans Semibold\", \"Open Sans Regular\"]\n : [\"Open Sans Regular\"];\n\n return {\n type: \"symbol\",\n // Property name varies by source path:\n // GeoJSON path → preprocessSoundings adds lowercase `depth` (string)\n // PMTiles path → baremetal ingest writes uppercase `DEPTH` (number)\n // raw S-57 → `VALSOU` last-resort fallback\n textField: [\n \"coalesce\",\n [\"get\", \"depth\"],\n [\"get\", \"DEPTH\"],\n [\"get\", \"VALSOU\"],\n ] as unknown as ExpressionSpecification,\n // Compact ladder tuned for screen DPI — small but legible against\n // dense depth-contour fields. 0.5 px halo proved too thin (text\n // disappeared into contours); 2.0+ px proved too thick (fuzzy\n // blob). Settled here: 7/8/10/12 across z8/z11/z14/z16 with a\n // flat 1.0 px halo — enough cut-out for separation without bulk.\n textSize: [\n \"interpolate\", [\"linear\"], [\"zoom\"],\n 8, 7,\n 11, 8,\n 14, 10,\n 16, 12,\n ] as unknown as ExpressionSpecification,\n textColor,\n textHaloColor: haloColor,\n textHaloWidth: 1.0,\n textOffset: [0, 0],\n textFont: fontStack,\n minzoom: 8,\n layout: {\n \"text-anchor\": \"center\",\n \"text-allow-overlap\": false,\n // Slightly more breathing room around the (now larger) glyphs.\n \"text-padding\": 6,\n \"text-optional\": true,\n // Small positive tracking opens up dense numerals at small\n // sizes — established cartographic typography practice.\n \"text-letter-spacing\": 0.02,\n // Shallowest-wins: Mapbox GL renders lower sort keys first and\n // gives them collision priority. Using depth directly ensures\n // the shallowest sounding in a cluster is always the one shown,\n // even when labels are hidden due to overlap.\n \"symbol-sort-key\": [\n \"to-number\",\n [\"coalesce\", [\"get\", \"depth\"], [\"get\", \"DEPTH\"], [\"get\", \"VALSOU\"]],\n 999,\n ],\n },\n };\n }\n\n case \"LNDRGN\":\n return {\n type: \"symbol\",\n textField: [\"get\", \"OBJNAM\"],\n textSize: [\n \"interpolate\", [\"linear\"], [\"zoom\"],\n 8, 10,\n 12, 12,\n 15, 14,\n ] as unknown as ExpressionSpecification,\n textColor: COLOR.LAND_REGION,\n textHaloColor: DARK_BG,\n textHaloWidth: 1.4,\n textOffset: [0, 0],\n textFont: [\"Open Sans Regular\"],\n minzoom: 8,\n layout: {\n \"text-anchor\": \"center\",\n \"text-allow-overlap\": false,\n \"text-padding\": 6,\n \"text-optional\": true,\n \"symbol-sort-key\": ORIENTATION_BAND_SORT_KEY,\n },\n };\n\n case \"LNDMRK\":\n return {\n type: \"symbol\",\n textField: [\"get\", \"OBJNAM\"],\n textSize: 9,\n textColor: \"#d4c9b0\",\n textHaloColor: DARK_BG,\n textHaloWidth: 1.5,\n textOffset: [0, 1.2],\n minzoom: 9,\n };\n\n case \"BOYLAT\":\n return {\n type: \"symbol\",\n textField: [\"coalesce\", [\"get\", \"_navAidLabel\"], [\"get\", \"OBJNAM\"]] as unknown as ExpressionSpecification,\n textSize: NAV_AID_LABEL_TEXT_SIZE,\n textFont: NAV_AID_LABEL_FONT,\n textColor: DARK_BG,\n textHaloColor: \"#ffffff\",\n textHaloWidth: 1.5,\n textOffset: [0, 1.5],\n minzoom: 10,\n };\n\n case \"BCNLAT\":\n return {\n type: \"symbol\",\n textField: [\"coalesce\", [\"get\", \"_navAidLabel\"], [\"get\", \"OBJNAM\"]] as unknown as ExpressionSpecification,\n textSize: NAV_AID_LABEL_TEXT_SIZE,\n textFont: NAV_AID_LABEL_FONT,\n textColor: DARK_BG,\n textHaloColor: \"#ffffff\",\n textHaloWidth: 1.5,\n textOffset: [0, 1.5],\n minzoom: 10,\n };\n\n case \"BOYCAR\":\n case \"BCNCAR\":\n // Cardinal mark labels keep their cream/yellow colour cue — moved\n // to the halo so the text reads dark-on-cream rather than the\n // previous cream-on-dark.\n return {\n type: \"symbol\",\n textField: [\"coalesce\", [\"get\", \"_navAidLabel\"], [\"get\", \"OBJNAM\"]] as unknown as ExpressionSpecification,\n textSize: NAV_AID_LABEL_TEXT_SIZE,\n textFont: NAV_AID_LABEL_FONT,\n textColor: DARK_BG,\n textHaloColor: \"#fdf0b0\",\n textHaloWidth: 1.5,\n textOffset: [0, 1.5],\n minzoom: 10,\n };\n\n case \"BOYSPP\":\n case \"BCNSPP\":\n // Special-purpose mark labels keep their yellow colour cue —\n // moved to the halo so the text reads dark-on-yellow.\n return {\n type: \"symbol\",\n textField: [\"coalesce\", [\"get\", \"_navAidLabel\"], [\"get\", \"OBJNAM\"]] as unknown as ExpressionSpecification,\n textSize: NAV_AID_LABEL_TEXT_SIZE,\n textFont: NAV_AID_LABEL_FONT,\n textColor: DARK_BG,\n textHaloColor: \"#eab308\",\n textHaloWidth: 1.5,\n textOffset: [0, 1.5],\n minzoom: 10,\n };\n\n case \"BOYISD\":\n case \"BOYSAW\":\n return {\n type: \"symbol\",\n textField: [\"coalesce\", [\"get\", \"_navAidLabel\"], [\"get\", \"OBJNAM\"]] as unknown as ExpressionSpecification,\n textSize: NAV_AID_LABEL_TEXT_SIZE,\n textFont: NAV_AID_LABEL_FONT,\n textColor: DARK_BG,\n textHaloColor: \"#ffffff\",\n textHaloWidth: 1.5,\n textOffset: [0, 1.5],\n minzoom: 10,\n };\n\n case \"LIGHTS\":\n // Anchor the label's LEFT edge to the offset point so the light\n // characteristic (Fl R 4s, Mo(A) W 8s, …) reads cleanly to the right\n // of the parent buoy / beacon icon at every zoom. Previously the\n // default top-anchor pulled the text down over the icon body.\n return {\n type: \"symbol\",\n textField: [\"get\", \"_lightLabel\"],\n textSize: NAV_AID_LABEL_TEXT_SIZE,\n textFont: NAV_AID_LABEL_FONT,\n textColor: DARK_BG,\n textHaloColor: \"#fdf0b0\",\n textHaloWidth: 1.5,\n textOffset: [2.0, 0],\n minzoom: 9,\n layout: {\n \"text-anchor\": \"left\",\n },\n };\n\n case \"FOGSIG\": {\n // Show the fog signal type abbreviation (WHIS / BELL / GONG / HORN / SIREN / DIA)\n // next to the fog signal symbol, which is offset to the lower-left of the parent buoy.\n // CATFOG is a numeric code; map to the standard IALA abbreviation.\n const catfogExpr = [\n \"match\", [\"to-number\", [\"coalesce\", [\"get\", \"CATFOG\"], 0], 0],\n 2, \"DIA\",\n 3, \"SIREN\",\n 4, \"NAUTO\",\n 5, \"BELL\",\n 6, \"WHIS\",\n 7, \"REED\",\n 8, \"GONG\",\n 9, \"HORN\",\n \"\",\n ];\n // Mirror the LIGHTS placement: anchor left so the sound label sits\n // to the right of the parent buoy. Push it one line below the LIGHTS\n // label (1.2 em) so the two stack cleanly when a buoy has both.\n return {\n type: \"symbol\",\n textField: catfogExpr as unknown as ExpressionSpecification,\n textSize: NAV_AID_LABEL_TEXT_SIZE,\n textFont: NAV_AID_LABEL_FONT,\n textColor: DARK_BG,\n textHaloColor: \"#b0c8e8\",\n textHaloWidth: 1.5,\n textOffset: [2.0, 1.2],\n minzoom: 11,\n layout: {\n \"text-anchor\": \"left\",\n \"text-allow-overlap\": false,\n \"text-optional\": true,\n },\n };\n }\n\n case \"SEAARE\":\n // Marquee orientation label — italic, spaced caps, blue-grey on dark\n // basemap. Zoom-interpolated text-size grows the label as the user\n // zooms in but caps so it never dominates harbor-detail features.\n // Cross-band emission (no band filter) means \"Boston Harbor\" stays\n // visible at every zoom even though its source polygon may live\n // only in a Coastal/Approach cell.\n return {\n type: \"symbol\",\n textField: [\"get\", \"OBJNAM\"],\n textSize: [\n \"interpolate\", [\"linear\"], [\"zoom\"],\n 5, 11,\n 8, 13,\n 11, 15,\n 14, 17,\n ] as unknown as ExpressionSpecification,\n textColor: COLOR.WATER_DEEP,\n textHaloColor: DARK_BG,\n textHaloWidth: 1.8,\n textOffset: [0, 0],\n textFont: [\"Open Sans Italic\"],\n minzoom: 5,\n layout: {\n \"text-anchor\": \"center\",\n \"text-allow-overlap\": false,\n \"text-padding\": 10,\n \"text-optional\": true,\n \"text-letter-spacing\": 0.15,\n \"text-max-width\": 9,\n \"symbol-sort-key\": ORIENTATION_BAND_SORT_KEY,\n },\n };\n\n case \"LAKARE\":\n return {\n type: \"symbol\",\n textField: [\"get\", \"OBJNAM\"],\n textSize: [\n \"interpolate\", [\"linear\"], [\"zoom\"],\n 8, 10,\n 12, 12,\n 15, 14,\n ] as unknown as ExpressionSpecification,\n textColor: COLOR.WATER,\n textHaloColor: DARK_BG,\n textHaloWidth: 1.5,\n textOffset: [0, 0],\n textFont: [\"Open Sans Italic\"],\n minzoom: 8,\n layout: {\n \"text-anchor\": \"center\",\n \"text-allow-overlap\": false,\n \"text-padding\": 6,\n \"text-optional\": true,\n \"symbol-sort-key\": ORIENTATION_BAND_SORT_KEY,\n },\n };\n\n case \"RIVERS\":\n return {\n type: \"symbol\",\n textField: [\"get\", \"OBJNAM\"],\n textSize: [\n \"interpolate\", [\"linear\"], [\"zoom\"],\n 9, 9,\n 12, 11,\n 15, 13,\n ] as unknown as ExpressionSpecification,\n textColor: COLOR.WATER,\n textHaloColor: DARK_BG,\n textHaloWidth: 1.4,\n textOffset: [0, 0],\n textFont: [\"Open Sans Italic\"],\n minzoom: 9,\n layout: {\n \"text-anchor\": \"center\",\n \"text-allow-overlap\": false,\n \"text-padding\": 4,\n \"text-optional\": true,\n \"symbol-sort-key\": ORIENTATION_BAND_SORT_KEY,\n },\n };\n\n case \"CANALS\":\n return {\n type: \"symbol\",\n textField: [\"get\", \"OBJNAM\"],\n textSize: [\n \"interpolate\", [\"linear\"], [\"zoom\"],\n 11, 9,\n 14, 11,\n ] as unknown as ExpressionSpecification,\n textColor: COLOR.WATER,\n textHaloColor: DARK_BG,\n textHaloWidth: 1.3,\n textOffset: [0, 0],\n textFont: [\"Open Sans Italic\"],\n minzoom: 11,\n layout: {\n \"text-anchor\": \"center\",\n \"text-allow-overlap\": false,\n \"text-padding\": 4,\n \"text-optional\": true,\n \"symbol-sort-key\": ORIENTATION_BAND_SORT_KEY,\n },\n };\n\n case \"LNDARE\":\n return {\n type: \"symbol\",\n textField: [\"get\", \"OBJNAM\"],\n textSize: [\n \"interpolate\", [\"linear\"], [\"zoom\"],\n 8, 9,\n 12, 11,\n 15, 13,\n ] as unknown as ExpressionSpecification,\n textColor: COLOR.LAND_NATURAL,\n textHaloColor: DARK_BG,\n textHaloWidth: 1.4,\n textOffset: [0, 0],\n textFont: [\"Open Sans Regular\"],\n minzoom: 8,\n layout: {\n \"text-anchor\": \"center\",\n \"text-allow-overlap\": false,\n \"text-padding\": 6,\n \"text-optional\": true,\n \"symbol-sort-key\": ORIENTATION_BAND_SORT_KEY,\n },\n };\n\n case \"BUAARE\":\n // City / built-up area names. Brighter than land-region labels so\n // urban orientation reads first; regular weight, no italics.\n return {\n type: \"symbol\",\n textField: [\"get\", \"OBJNAM\"],\n textSize: [\n \"interpolate\", [\"linear\"], [\"zoom\"],\n 7, 11,\n 10, 13,\n 13, 15,\n ] as unknown as ExpressionSpecification,\n textColor: COLOR.CITY,\n textHaloColor: DARK_BG,\n textHaloWidth: 1.6,\n textOffset: [0, 0],\n textFont: [\"Open Sans Regular\"],\n minzoom: 7,\n layout: {\n \"text-anchor\": \"center\",\n \"text-allow-overlap\": false,\n \"text-padding\": 8,\n \"text-optional\": true,\n \"text-letter-spacing\": 0.05,\n \"symbol-sort-key\": ORIENTATION_BAND_SORT_KEY,\n },\n };\n\n case \"BRIDGE\":\n return {\n type: \"symbol\",\n textField: [\"get\", \"OBJNAM\"],\n textSize: 9,\n textColor: \"#bfa88a\",\n textHaloColor: DARK_BG,\n textHaloWidth: 1.5,\n textOffset: [0, 1.0],\n minzoom: 12,\n layout: {\n \"text-allow-overlap\": false,\n \"text-optional\": true,\n },\n };\n\n case \"PILPNT\":\n return {\n type: \"symbol\",\n textField: [\"get\", \"OBJNAM\"],\n textSize: 8,\n textColor: \"#c8c0b0\",\n textHaloColor: DARK_BG,\n textHaloWidth: 1.2,\n textOffset: [0, 1.2],\n minzoom: 13,\n };\n\n case \"MORFAC\":\n return {\n type: \"symbol\",\n textField: [\"get\", \"OBJNAM\"],\n textSize: 8,\n textColor: \"#c8c0b0\",\n textHaloColor: DARK_BG,\n textHaloWidth: 1.2,\n textOffset: [0, 1.2],\n minzoom: 13,\n };\n\n case \"SLCONS\":\n return {\n type: \"symbol\",\n textField: [\"get\", \"OBJNAM\"],\n textSize: 8,\n textColor: \"#bfa88a\",\n textHaloColor: DARK_BG,\n textHaloWidth: 1.2,\n textOffset: [0, 1.0],\n minzoom: 13,\n layout: {\n \"text-allow-overlap\": false,\n \"text-optional\": true,\n },\n };\n\n case \"BUISGL\":\n return {\n type: \"symbol\",\n textField: [\"get\", \"OBJNAM\"],\n textSize: 8,\n textColor: \"#c8c0b0\",\n textHaloColor: DARK_BG,\n textHaloWidth: 1.2,\n textOffset: [0, 1.2],\n minzoom: 14,\n layout: {\n \"text-allow-overlap\": false,\n \"text-optional\": true,\n },\n };\n\n case \"AIRARE\":\n return {\n type: \"symbol\",\n textField: [\"get\", \"OBJNAM\"],\n textSize: [\n \"interpolate\", [\"linear\"], [\"zoom\"],\n 9, 9,\n 13, 11,\n ] as unknown as ExpressionSpecification,\n textColor: COLOR.AIRPORT,\n textHaloColor: DARK_BG,\n textHaloWidth: 1.4,\n textOffset: [0, 0],\n textFont: [\"Open Sans Regular\"],\n minzoom: 9,\n layout: {\n \"text-anchor\": \"center\",\n \"text-allow-overlap\": false,\n \"text-padding\": 5,\n \"text-optional\": true,\n \"symbol-sort-key\": ORIENTATION_BAND_SORT_KEY,\n },\n };\n\n case \"SBDARE\":\n // Seabed classification abbreviation (NATSUR + optional NATQUA prefix).\n // Renders for BOTH Polygon (placed at centroid via symbol-placement\n // \"point\") and Point geometries through the same layer — no\n // geometry-type filter. Harbor-zoom only (z12+, matches scamin 22000).\n // Muted depth/water tone so the label reads as part of the seabed\n // surface, not foreground; halo matches SOUNDG cut-out pattern for\n // legibility over depth fills.\n return {\n type: \"symbol\",\n textField: buildSeabedLabelExpression(),\n textSize: [\n \"interpolate\", [\"linear\"], [\"zoom\"],\n 12, 9,\n 16, 11,\n ] as unknown as ExpressionSpecification,\n textColor: COLOR.SOUNDING,\n textHaloColor: DARK_BG,\n textHaloWidth: 1.0,\n textOffset: [0, 0],\n textFont: [\"Open Sans Italic\"],\n minzoom: 12,\n layout: {\n \"symbol-placement\": \"point\",\n \"text-anchor\": \"center\",\n \"text-allow-overlap\": false,\n \"text-padding\": 4,\n \"text-optional\": true,\n \"text-letter-spacing\": 0.02,\n },\n };\n\n case \"MAGVAR\": {\n // Magnetic-variation label: variation in degrees, sign-aware (positive\n // VALMAG = East, negative = West per S-57 spec). Renders as the\n // standard `\"X°W\"` / `\"X°E\"` notation. If VALACM (annual change in\n // minutes per year) is present and non-zero, append it. Centroid\n // placement on polygons (no geometry-type filter — polygons handled\n // via the orientation-cross-band drop pattern below). Coastal/harbor\n // zooms only — at lower zooms the value is irrelevant for orientation.\n const valmag: unknown = [\"coalesce\", [\"get\", \"VALMAG\"], 0];\n const variationText: unknown = [\n \"case\",\n [\">=\", valmag, 0],\n [\"concat\", [\"to-string\", [\"floor\", valmag]], \"°E\"],\n [\"concat\", [\"to-string\", [\"floor\", [\"abs\", valmag]]], \"°W\"],\n ];\n return {\n type: \"symbol\",\n textField: variationText as unknown as ExpressionSpecification,\n textSize: [\n \"interpolate\", [\"linear\"], [\"zoom\"],\n 10, 9,\n 14, 11,\n ] as unknown as ExpressionSpecification,\n textColor: COLOR.SOUNDING,\n textHaloColor: DARK_BG,\n textHaloWidth: 1.0,\n textOffset: [0, 0],\n textFont: [\"Open Sans Italic\"],\n minzoom: 10,\n layout: {\n \"symbol-placement\": \"point\",\n \"text-anchor\": \"center\",\n \"text-allow-overlap\": false,\n \"text-padding\": 6,\n \"text-optional\": true,\n \"text-letter-spacing\": 0.02,\n },\n };\n }\n\n case \"PRDARE\":\n // Production area name (offshore wind farm / oil-gas platform / aquaculture).\n // Italic on dark basemap, magenta tint to match the regulated-area\n // boundary colour, so the label visually reads as part of the same\n // \"human-imposed restriction\" idiom as the dashed boundary it sits in.\n return {\n type: \"symbol\",\n textField: [\"get\", \"OBJNAM\"],\n textSize: [\n \"interpolate\", [\"linear\"], [\"zoom\"],\n 8, 10,\n 12, 12,\n 15, 14,\n ] as unknown as ExpressionSpecification,\n textColor: \"#c545c3\",\n textHaloColor: DARK_BG,\n textHaloWidth: 1.4,\n textOffset: [0, 0],\n textFont: [\"Open Sans Italic\"],\n minzoom: 8,\n layout: {\n \"text-anchor\": \"center\",\n \"text-allow-overlap\": false,\n \"text-padding\": 6,\n \"text-optional\": true,\n \"symbol-sort-key\": ORIENTATION_BAND_SORT_KEY,\n },\n };\n\n case \"WEDKLP\":\n // Marine vegetation abbreviation per NOAA Chart No. 1 §K43 (\"Wd\").\n // Renders for both Polygon (centroid) and Point geometries through the\n // same layer — no geometry-type filter — at harbor-approach zooms only\n // (z12+, matches scamin 22000). Muted green tone with dark halo so the\n // label reads against both light-water and dark-water bands.\n return {\n type: \"symbol\",\n textField: \"Wd\",\n textSize: [\n \"interpolate\", [\"linear\"], [\"zoom\"],\n 12, 9,\n 16, 11,\n ] as unknown as ExpressionSpecification,\n textColor: \"#3f8a34\",\n textHaloColor: DARK_BG,\n textHaloWidth: 1.0,\n textOffset: [0, 0],\n textFont: [\"Open Sans Italic\"],\n minzoom: 12,\n layout: {\n \"symbol-placement\": \"point\",\n \"text-anchor\": \"center\",\n \"text-allow-overlap\": false,\n \"text-padding\": 4,\n \"text-optional\": true,\n \"text-letter-spacing\": 0.02,\n },\n };\n\n case \"UWTROC\":\n case \"OBSTRN\":\n case \"WRECKS\": {\n // S-52 hazard depth label — VALSOU is the measured depth at the\n // rock / obstruction / wreck (metres). NOAA paper-chart convention\n // renders this small text next to the hazard symbol, e.g. `5.1m`.\n // Suppress when VALSOU is null or 0 — those rocks aren't sounded\n // (covers-and-uncovers / awash cases), and `0m` is misleading.\n // Round to 1 decimal at expression time (S-57 storage is float\n // metres, often with decimetre precision).\n const ct: ColorTableName = opts.colorTable ?? \"DAY\";\n const valsou: unknown = [\n \"to-number\",\n [\"coalesce\", [\"get\", \"VALSOU\"], [\"get\", \"valsou\"], 0],\n 0,\n ];\n return {\n type: \"symbol\",\n textField: [\n \"case\",\n [\">\", valsou, 0],\n [\"concat\",\n [\"to-string\", [\"/\", [\"round\", [\"*\", valsou, 10]], 10]],\n \"m\",\n ],\n \"\",\n ] as unknown as ExpressionSpecification,\n textSize: [\n \"interpolate\", [\"linear\"], [\"zoom\"],\n 12, 9,\n 16, 11,\n ] as unknown as ExpressionSpecification,\n textColor: resolveColor(\"CHBLK\", ct),\n textHaloColor: resolveColor(\"CHWHT\", ct),\n textHaloWidth: 1.2,\n // Place to the upper-right of the symbol so it doesn't sit on top\n // of the asterisk / cross. Anchor top-left so the offset grows\n // away from the symbol as text-size grows.\n textOffset: [0.8, -0.4],\n textFont: [\"Open Sans Regular\"],\n minzoom: 12,\n layout: {\n \"text-anchor\": \"top-left\",\n \"text-allow-overlap\": false,\n \"text-optional\": true,\n \"text-padding\": 2,\n },\n };\n }\n\n case \"CBLOHD\":\n case \"PIPOHD\": {\n // Overhead cable / pipeline vertical-clearance label per S-52 INT1\n // L31 / L41. Mast-clearance is the safety-critical attribute for\n // these features — a tall vessel transiting under a charted overhead\n // cable needs to see \"120m\" or whatever the VERCLR value is. Falls\n // through to empty string when VERCLR is absent so we don't render\n // bare-OBJNAM noise. Label rides the line via symbol-placement:line.\n // CBLOHD uses CHMGD-aligned magenta (matches the line colour);\n // PIPOHD uses a PIPLN-aligned green-brown.\n const isCBL = layerName === \"CBLOHD\";\n return {\n type: \"symbol\",\n textField: [\n \"case\",\n [\"has\", \"VERCLR\"],\n [\"concat\", [\"to-string\", [\"get\", \"VERCLR\"]], \"m\"],\n \"\",\n ] as unknown as ExpressionSpecification,\n textSize: [\n \"interpolate\", [\"linear\"], [\"zoom\"],\n 11, 8,\n 14, 10,\n 17, 11,\n ] as unknown as ExpressionSpecification,\n textColor: isCBL ? \"#c545c3\" : \"#7fbf3f\",\n textHaloColor: DARK_BG,\n textHaloWidth: 1.4,\n textOffset: [0, 0],\n textFont: [\"Open Sans Regular\"],\n minzoom: 11,\n layout: {\n \"symbol-placement\": \"line\",\n \"text-anchor\": \"center\",\n \"symbol-spacing\": 250,\n \"text-rotation-alignment\": \"map\",\n \"text-allow-overlap\": false,\n \"text-optional\": true,\n \"text-letter-spacing\": 0.02,\n },\n };\n }\n\n case \"DEPCNT\":\n return {\n type: \"symbol\",\n textField: [\"concat\", [\"get\", \"VALDCO\"], \"m\"] as unknown as ExpressionSpecification,\n textSize: [\n \"interpolate\", [\"linear\"], [\"zoom\"],\n 10, 8,\n 14, 10\n ] as unknown as ExpressionSpecification,\n textColor: DARK_BG,\n textHaloColor: \"#c8c8c8\",\n textHaloWidth: 1.2,\n textOffset: [0, 0],\n textFont: [\"Open Sans Regular\"],\n minzoom: 9,\n layout: {\n \"symbol-placement\": \"line\",\n \"text-anchor\": \"center\",\n \"symbol-spacing\": 250,\n \"text-rotation-alignment\": \"map\",\n \"text-allow-overlap\": false,\n \"text-optional\": true,\n },\n };\n\n default:\n return null;\n }\n}\n\n/**\n * Build a Mapbox symbol layer spec from a label config.\n */\nexport function buildLabelLayer(\n layerId: string,\n sourceId: string,\n config: LabelLayerConfig,\n visible: boolean,\n overrides?: { textScale?: number; minzoom?: number | null; allowOverlap?: boolean }\n): maplibregl.LayerSpecification {\n // Apply text scale to textSize\n let textSize = config.textSize;\n if (overrides?.textScale && overrides.textScale !== 1) {\n if (typeof textSize === \"number\") {\n textSize = textSize * overrides.textScale;\n } else {\n // For interpolation expressions, wrap in a multiply\n textSize = [\"*\", overrides.textScale, textSize] as unknown as ExpressionSpecification;\n }\n }\n\n const spec: any = {\n id: layerId,\n type: \"symbol\",\n source: sourceId,\n layout: {\n visibility: visible ? \"visible\" : \"none\",\n \"text-field\": config.textField as any,\n \"text-size\": textSize,\n \"text-font\": config.textFont ?? [\"Open Sans Regular\"],\n \"text-offset\": config.textOffset,\n \"text-anchor\": \"top\",\n \"text-allow-overlap\": overrides?.allowOverlap ?? false,\n \"text-optional\": !(overrides?.allowOverlap),\n \"text-padding\": overrides?.allowOverlap ? 0 : 4,\n ...(config.layout ?? {}),\n },\n paint: {\n \"text-color\": config.textColor,\n \"text-halo-color\": config.textHaloColor,\n \"text-halo-width\": config.textHaloWidth,\n },\n };\n\n // Minzoom: override > config default\n if (overrides?.minzoom !== undefined && overrides.minzoom !== null) {\n spec.minzoom = overrides.minzoom;\n } else if (overrides?.minzoom === null) {\n // null = use config default\n if (config.minzoom !== undefined) spec.minzoom = config.minzoom;\n } else if (config.minzoom !== undefined) {\n spec.minzoom = config.minzoom;\n }\n\n return spec;\n}\n\n/**\n * Pre-process SOUNDG GeoJSON to extract Z coordinates as `depth` properties.\n * Soundings are MultiPoint with Z values in geometry.coordinates[][2].\n * This explodes MultiPoints into individual Points with a `depth` property.\n */\nexport function preprocessSoundings(\n fc: GeoJSON.FeatureCollection\n): GeoJSON.FeatureCollection {\n const features: GeoJSON.Feature[] = [];\n\n for (const f of fc.features) {\n if (!f.geometry) continue;\n\n if (f.geometry.type === \"Point\") {\n const coords = f.geometry.coordinates;\n const depth = coords.length >= 3 ? coords[2] : null;\n if (depth != null) {\n features.push({\n type: \"Feature\",\n geometry: { type: \"Point\", coordinates: [coords[0], coords[1]] },\n properties: {\n ...f.properties,\n depth: Math.round(depth * 10) / 10 + \"\",\n },\n });\n }\n } else if (f.geometry.type === \"MultiPoint\") {\n for (const coords of f.geometry.coordinates) {\n const depth = coords.length >= 3 ? coords[2] : null;\n if (depth != null) {\n features.push({\n type: \"Feature\",\n geometry: { type: \"Point\", coordinates: [coords[0], coords[1]] },\n properties: {\n ...f.properties,\n depth: Math.round(depth * 10) / 10 + \"\",\n },\n });\n }\n }\n }\n }\n\n return { type: \"FeatureCollection\", features };\n}\n\n/**\n * Pre-process LIGHTS GeoJSON to derive compact light characteristic labels.\n * Adds `_lightLabel` property (e.g., \"Fl R 4s\").\n */\nexport function preprocessLights(\n fc: GeoJSON.FeatureCollection\n): GeoJSON.FeatureCollection {\n return {\n type: \"FeatureCollection\",\n features: fc.features.map((f) => {\n const props = f.properties ?? {};\n const parts: string[] = [];\n\n // Light character\n const litchr = Number(props.LITCHR);\n if (litchr && LITCHR_ABBR[litchr]) parts.push(LITCHR_ABBR[litchr]);\n\n // Color\n const colour = Number(props.COLOUR);\n if (colour && COLOUR_ABBR[colour]) parts.push(COLOUR_ABBR[colour]);\n\n // Period\n const sigper = Number(props.SIGPER);\n if (sigper && sigper > 0) parts.push(sigper + \"s\");\n\n const label = parts.length > 0 ? parts.join(\" \") : \"\";\n\n return {\n ...f,\n properties: { ...props, _lightLabel: label },\n };\n }),\n };\n}\n\n/** List of layers that have labels */\nexport const LABELED_LAYERS = new Set([\n \"SOUNDG\",\n \"LNDRGN\",\n \"LNDMRK\",\n \"LNDARE\",\n \"BUAARE\",\n \"BOYLAT\",\n \"BCNLAT\",\n \"BOYCAR\",\n \"BOYSPP\",\n \"BOYISD\",\n \"BOYSAW\",\n \"BCNCAR\",\n \"BCNSPP\",\n \"LIGHTS\",\n \"FOGSIG\",\n \"SEAARE\",\n \"LAKARE\",\n \"RIVERS\",\n \"CANALS\",\n \"BRIDGE\",\n \"PILPNT\",\n \"MORFAC\",\n \"SLCONS\",\n \"BUISGL\",\n \"AIRARE\",\n \"DEPCNT\",\n \"SBDARE\",\n \"MAGVAR\",\n \"PRDARE\",\n \"WEDKLP\",\n \"UWTROC\",\n \"OBSTRN\",\n \"WRECKS\",\n \"CBLOHD\",\n \"PIPOHD\",\n]);\n\n/** Nav aid layer names that need preprocessNavAids */\nconst NAV_AID_LABEL_LAYERS = new Set([\n \"BOYLAT\", \"BCNLAT\", \"BOYCAR\", \"BOYSPP\", \"BOYISD\", \"BOYSAW\", \"BCNCAR\", \"BCNSPP\",\n]);\n\n/** Colour code → short prefix for mariner labels */\nconst NAV_COLOUR_PREFIX: Record<number, string> = {\n 3: \"R\",\n 4: \"G\",\n 6: \"Y\",\n};\n\n/**\n * Pre-process buoy/beacon GeoJSON to derive concise mariner-style labels.\n * Adds `_navAidLabel` property (e.g., 'R \"8\"', 'G \"5\"').\n */\nexport function preprocessNavAids(\n fc: GeoJSON.FeatureCollection\n): GeoJSON.FeatureCollection {\n return {\n type: \"FeatureCollection\",\n features: fc.features.map((f) => {\n const props = f.properties ?? {};\n const objnam = props.OBJNAM as string | undefined;\n if (!objnam) return f;\n\n // Extract trailing number/designation (e.g., \"8\", \"18A\", \"2\")\n const match = objnam.match(/(\\d+[A-Z]?)\\s*$/);\n if (!match) return f;\n\n const designation = match[1];\n const colourCode = Number(props.COLOUR);\n const prefix = NAV_COLOUR_PREFIX[colourCode];\n\n const label = prefix\n ? `${prefix} \"${designation}\"`\n : `\"${designation}\"`;\n\n return {\n ...f,\n properties: { ...props, _navAidLabel: label },\n };\n }),\n };\n}\n\n/** Check if a layer name needs nav aid preprocessing */\nexport function isNavAidLayer(layerName: string): boolean {\n return NAV_AID_LABEL_LAYERS.has(layerName);\n}\n\n/**\n * Pre-process water body polygon GeoJSON into centroid points for label placement.\n * Computes a simple average-coordinate centroid for each polygon feature that has OBJNAM.\n */\nexport function preprocessWaterBodies(\n fc: GeoJSON.FeatureCollection\n): GeoJSON.FeatureCollection {\n const features: GeoJSON.Feature[] = [];\n\n for (const f of fc.features) {\n if (!f.geometry || !f.properties?.OBJNAM) continue;\n\n const centroid = computePolygonCentroid(f.geometry);\n if (!centroid) continue;\n\n features.push({\n type: \"Feature\",\n geometry: { type: \"Point\", coordinates: centroid },\n properties: { ...f.properties },\n });\n }\n\n return { type: \"FeatureCollection\", features };\n}\n\n/**\n * Compute the centroid of a geometry as a simple average of all coordinates.\n */\nfunction computePolygonCentroid(geom: GeoJSON.Geometry): [number, number] | null {\n const coords: number[][] = [];\n\n function collect(c: any) {\n if (typeof c[0] === \"number\") {\n coords.push(c);\n } else {\n for (const sub of c) collect(sub);\n }\n }\n\n if (geom.type === \"Polygon\" || geom.type === \"MultiPolygon\" ||\n geom.type === \"LineString\" || geom.type === \"MultiLineString\" ||\n geom.type === \"Point\" || geom.type === \"MultiPoint\") {\n collect((geom as any).coordinates);\n }\n\n if (coords.length === 0) return null;\n\n let sumX = 0, sumY = 0;\n for (const c of coords) {\n sumX += c[0];\n sumY += c[1];\n }\n return [sumX / coords.length, sumY / coords.length];\n}\n","/**\n * Spatial grid-based feature decimation for performance at low zoom levels.\n * Thins dense GeoJSON feature sets by keeping only one representative\n * feature per grid cell per layer.\n */\n\nexport interface DecimationOptions {\n /** Grid resolution (cells per axis). Default 80. */\n gridSize?: number;\n /** Zoom level below which decimation kicks in. Default 12. */\n zoomThreshold?: number;\n}\n\nconst DEFAULT_GRID = 80;\n\n/**\n * Zoom-adaptive grid resolution for decimation.\n */\nexport function getGridSizeForZoom(zoom: number): number {\n if (zoom < 7) return 50;\n if (zoom < 8) return 70;\n if (zoom < 10) return 100;\n if (zoom < 12) return 140;\n return 0; // decimation disabled at threshold\n}\n\n/**\n * Extract a single representative coordinate from a feature.\n */\nfunction featureCoord(f: GeoJSON.Feature): [number, number] | null {\n if (!f.geometry) return null;\n const g = f.geometry as any;\n switch (g.type) {\n case \"Point\":\n return [g.coordinates[0], g.coordinates[1]];\n case \"MultiPoint\":\n return g.coordinates.length > 0\n ? [g.coordinates[0][0], g.coordinates[0][1]]\n : null;\n case \"LineString\":\n return g.coordinates.length > 0\n ? [g.coordinates[0][0], g.coordinates[0][1]]\n : null;\n case \"MultiLineString\":\n return g.coordinates.length > 0 && g.coordinates[0].length > 0\n ? [g.coordinates[0][0][0], g.coordinates[0][0][1]]\n : null;\n case \"Polygon\":\n return g.coordinates.length > 0 && g.coordinates[0].length > 0\n ? [g.coordinates[0][0][0], g.coordinates[0][0][1]]\n : null;\n case \"MultiPolygon\":\n return g.coordinates.length > 0 &&\n g.coordinates[0].length > 0 &&\n g.coordinates[0][0].length > 0\n ? [g.coordinates[0][0][0][0], g.coordinates[0][0][0][1]]\n : null;\n default:\n return null;\n }\n}\n\n/**\n * Priority score for a feature — lower = more important = kept first.\n * For soundings: shallowest depth wins (navigational safety).\n * For other features: first-encountered wins.\n */\nfunction featurePriority(f: GeoJSON.Feature, layerName: string): number {\n if (layerName === \"SOUNDG\") {\n const d = parseFloat(f.properties?.depth ?? \"999\");\n return d; // shallowest (lowest depth) wins\n }\n // For nav aids, hazards etc., lower viewing group = more important\n const vg = f.properties?.SCAMIN ?? f.properties?.viewing_group ?? 99999;\n return typeof vg === \"number\" ? vg : 99999;\n}\n\n/**\n * Decimate a GeoJSON FeatureCollection using spatial grid thinning.\n * Only runs when zoom < zoomThreshold. Returns the original FC otherwise.\n *\n * @param fc - Input FeatureCollection\n * @param layerName - S-57 layer name (affects priority logic)\n * @param currentZoom - Current map zoom level\n * @param bounds - Current viewport bounds\n * @param opts - Decimation options\n */\nexport function decimateFeatures(\n fc: GeoJSON.FeatureCollection,\n layerName: string,\n currentZoom: number,\n bounds: { west: number; south: number; east: number; north: number },\n opts?: DecimationOptions\n): GeoJSON.FeatureCollection {\n const threshold = opts?.zoomThreshold ?? 12;\n\n // No decimation at high zoom or for small sets\n if (currentZoom >= threshold || fc.features.length < 500) {\n return fc;\n }\n\n // Skip decimation for polygons — they're typically large and few\n const firstGeom = fc.features[0]?.geometry?.type;\n if (\n firstGeom === \"Polygon\" ||\n firstGeom === \"MultiPolygon\"\n ) {\n return fc;\n }\n\n const gridSize = opts?.gridSize ?? getGridSizeForZoom(currentZoom);\n const { west, south, east, north } = bounds;\n const lngSpan = east - west || 0.001;\n const latSpan = north - south || 0.001;\n\n // Grid cell size\n const cellW = lngSpan / gridSize;\n const cellH = latSpan / gridSize;\n\n // Map from grid key → best feature\n const grid = new Map<number, { feature: GeoJSON.Feature; priority: number }>();\n\n for (const f of fc.features) {\n const coord = featureCoord(f);\n if (!coord) continue;\n\n const col = Math.floor((coord[0] - west) / cellW);\n const row = Math.floor((coord[1] - south) / cellH);\n const key = row * gridSize + col;\n\n const pri = featurePriority(f, layerName);\n const existing = grid.get(key);\n\n if (!existing || pri < existing.priority) {\n grid.set(key, { feature: f, priority: pri });\n }\n }\n\n return {\n type: \"FeatureCollection\",\n features: Array.from(grid.values()).map((v) => v.feature),\n };\n}\n\n/**\n * Get the max number of cells to load based on zoom level.\n */\nexport function getMaxCellsForZoom(zoom: number): number {\n if (zoom < 7) return 40;\n if (zoom < 8) return 50;\n if (zoom < 10) return 80;\n if (zoom <= 12) return 100;\n return 120;\n}\n","/**\n * IHO S-101 ENC Product Specification — Feature Catalogue\n *\n * S-101 replaces S-57 as the data model for Electronic Navigational Charts.\n * This catalogue maps S-101 feature classes to:\n * - S-57 equivalents (where they exist)\n * - Chart No. 1 sections (same organizational structure)\n * - Portrayal catalogue references (S-100 Portrayal Model)\n *\n * Key S-101 changes from S-57:\n * - CamelCase feature class names (DepthArea vs DEPARE)\n * - Complex/structured attributes (nested objects vs flat)\n * - New feature types for AIS, quality, under-keel clearance\n * - Removed/merged features for simplification\n *\n * Reference: IHO S-101 Product Specification (Ed 1.1.0)\n * IHO S-100 Universal Hydrographic Data Model\n */\n\nexport interface S101Feature {\n /** S-101 camelCase feature class name */\n featureClass: string;\n /** Human-readable name */\n name: string;\n /** S-57 6-char equivalent acronym, if any */\n s57Equivalent?: string;\n /** Chart No. 1 section letter */\n section: string;\n /** Group key for clustering */\n group: string;\n /** Feature category */\n category: \"geo\" | \"meta\" | \"info\";\n /** Description of the feature */\n description: string;\n /** S-100 Portrayal Catalogue reference */\n portrayalRef?: string;\n /** True if this feature has no S-57 equivalent */\n isNewInS101: boolean;\n /** Key attributes specific to this feature */\n attributes?: string[];\n}\n\n// ═══════════════════════════════════════════════════════════\n// S-101 FEATURE CATALOGUE\n// ═══════════════════════════════════════════════════════════\n\nexport const S101_FEATURES: S101Feature[] = [\n // ── Section Q: Buoys, Beacons & Topmarks ──\n\n { featureClass: \"BuoyLateral\", name: \"Buoy, Lateral\", s57Equivalent: \"BOYLAT\", section: \"Q\", group: \"lateral-buoys\",\n category: \"geo\", description: \"A buoy used to indicate the port or starboard hand side of a route, following IALA Maritime Buoyage System.\",\n portrayalRef: \"BOYLAT_S101\", isNewInS101: false, attributes: [\"categoryOfLateralMark\", \"colour\", \"colourPattern\", \"buoyShape\"] },\n\n { featureClass: \"BuoyCardinal\", name: \"Buoy, Cardinal\", s57Equivalent: \"BOYCAR\", section: \"Q\", group: \"cardinal-buoys\",\n category: \"geo\", description: \"A buoy used in conjunction with the compass to indicate the direction of safe water (N, E, S, W).\",\n portrayalRef: \"BOYCAR_S101\", isNewInS101: false, attributes: [\"categoryOfCardinalMark\", \"colour\", \"buoyShape\"] },\n\n { featureClass: \"BuoyIsolatedDanger\", name: \"Buoy, Isolated Danger\", s57Equivalent: \"BOYISD\", section: \"Q\", group: \"special-buoys\",\n category: \"geo\", description: \"A buoy moored on or above an isolated danger with navigable water all around.\",\n portrayalRef: \"BOYISD_S101\", isNewInS101: false, attributes: [\"colour\", \"buoyShape\"] },\n\n { featureClass: \"BuoySafeWater\", name: \"Buoy, Safe Water\", s57Equivalent: \"BOYSAW\", section: \"Q\", group: \"special-buoys\",\n category: \"geo\", description: \"A buoy indicating navigable water all around (mid-channel or fairway). Red and white vertical stripes.\",\n portrayalRef: \"BOYSAW_S101\", isNewInS101: false, attributes: [\"colour\", \"colourPattern\", \"buoyShape\"] },\n\n { featureClass: \"BuoySpecialPurpose\", name: \"Buoy, Special Purpose\", s57Equivalent: \"BOYSPP\", section: \"Q\", group: \"special-buoys\",\n category: \"geo\", description: \"A buoy used to indicate a special area or feature (cables, pipelines, military exercise zones, etc.).\",\n portrayalRef: \"BOYSPP_S101\", isNewInS101: false, attributes: [\"categoryOfSpecialPurposeMark\", \"colour\", \"buoyShape\"] },\n\n { featureClass: \"BuoyInstallation\", name: \"Buoy, Installation\", s57Equivalent: \"BOYINB\", section: \"Q\", group: \"special-buoys\",\n category: \"geo\", description: \"A buoy marking an installation such as an ODAS or LANBY.\",\n portrayalRef: \"BOYINB_S101\", isNewInS101: false, attributes: [\"categoryOfInstallationBuoy\", \"buoyShape\"] },\n\n { featureClass: \"BuoyEmergencyWreck\", name: \"Buoy, Emergency Wreck Marking\", s57Equivalent: \"BOYEMW\", section: \"Q\", group: \"special-buoys\",\n category: \"geo\", description: \"A buoy placed to mark a newly discovered wreck. Blue and yellow vertical stripes with yellow cross topmark.\",\n portrayalRef: \"BOYEMW_S101\", isNewInS101: false, attributes: [\"colour\", \"colourPattern\"] },\n\n { featureClass: \"BeaconLateral\", name: \"Beacon, Lateral\", s57Equivalent: \"BCNLAT\", section: \"Q\", group: \"beacons\",\n category: \"geo\", description: \"A fixed beacon used to indicate the port or starboard side of a route.\",\n portrayalRef: \"BCNLAT_S101\", isNewInS101: false, attributes: [\"categoryOfLateralMark\", \"colour\", \"beaconShape\"] },\n\n { featureClass: \"BeaconCardinal\", name: \"Beacon, Cardinal\", s57Equivalent: \"BCNCAR\", section: \"Q\", group: \"beacons\",\n category: \"geo\", description: \"A fixed beacon used to indicate the direction of safe water by reference to the compass.\",\n portrayalRef: \"BCNCAR_S101\", isNewInS101: false, attributes: [\"categoryOfCardinalMark\", \"colour\"] },\n\n { featureClass: \"BeaconIsolatedDanger\", name: \"Beacon, Isolated Danger\", s57Equivalent: \"BCNISD\", section: \"Q\", group: \"beacons\",\n category: \"geo\", description: \"A fixed beacon erected on or near an isolated danger with navigable water around.\",\n portrayalRef: \"BCNISD_S101\", isNewInS101: false, attributes: [\"colour\"] },\n\n { featureClass: \"BeaconSafeWater\", name: \"Beacon, Safe Water\", s57Equivalent: \"BCNSAW\", section: \"Q\", group: \"beacons\",\n category: \"geo\", description: \"A fixed beacon indicating safe water all around (mid-channel or fairway).\",\n portrayalRef: \"BCNSAW_S101\", isNewInS101: false, attributes: [\"colour\"] },\n\n { featureClass: \"BeaconSpecialPurpose\", name: \"Beacon, Special Purpose\", s57Equivalent: \"BCNSPP\", section: \"Q\", group: \"beacons\",\n category: \"geo\", description: \"A fixed beacon marking a special area or feature.\",\n portrayalRef: \"BCNSPP_S101\", isNewInS101: false, attributes: [\"categoryOfSpecialPurposeMark\", \"colour\"] },\n\n { featureClass: \"Topmark\", name: \"Topmark\", s57Equivalent: \"TOPMAR\", section: \"Q\", group: \"topmarks\",\n category: \"geo\", description: \"A characteristic shape fitted to the top of a buoy or beacon as an identification mark.\",\n portrayalRef: \"TOPMAR_S101\", isNewInS101: false, attributes: [\"topmarkDaymarkShape\", \"colour\"] },\n\n { featureClass: \"Daymark\", name: \"Daymark\", s57Equivalent: \"DAYMAR\", section: \"Q\", group: \"daymarks\",\n category: \"geo\", description: \"A painted board on a beacon providing daytime identification.\",\n portrayalRef: \"DAYMAR_S101\", isNewInS101: false, attributes: [\"topmarkDaymarkShape\", \"colour\", \"colourPattern\"] },\n\n { featureClass: \"MooringWarpingFacility\", name: \"Mooring/Warping Facility\", s57Equivalent: \"MORFAC\", section: \"Q\", group: \"mooring\",\n category: \"geo\", description: \"Equipment or structure used for mooring or warping vessels.\",\n portrayalRef: \"MORFAC_S101\", isNewInS101: false, attributes: [\"categoryOfMooringFacility\"] },\n\n // ── New S-101 features in Section Q ──\n\n { featureClass: \"VirtualAISAidToNavigation\", name: \"Virtual AIS Aid to Navigation\", section: \"Q\", group: \"virtual-aids\",\n category: \"geo\", description: \"An AIS target that does not physically exist but is broadcast to indicate a point of interest, hazard, or channel edge. Shown as a dashed circle with 'V' on the chart.\",\n portrayalRef: \"VAISATN_S101\", isNewInS101: true, attributes: [\"categoryOfVirtualAISAidToNavigation\", \"virtualAISAidToNavigationType\", \"mmsiCode\"] },\n\n { featureClass: \"PhysicalAISAidToNavigation\", name: \"Physical AIS Aid to Navigation\", section: \"Q\", group: \"virtual-aids\",\n category: \"geo\", description: \"A physical aid to navigation equipped with an AIS transponder that broadcasts its position and identification.\",\n portrayalRef: \"PAISATN_S101\", isNewInS101: true, attributes: [\"mmsiCode\", \"categoryOfPhysicalAISAidToNavigation\"] },\n\n { featureClass: \"SyntheticAISAidToNavigation\", name: \"Synthetic AIS Aid to Navigation\", section: \"Q\", group: \"virtual-aids\",\n category: \"geo\", description: \"An AIS target transmitted by a shore station to represent a physical aid to navigation that is not itself equipped with AIS.\",\n portrayalRef: \"SAISATN_S101\", isNewInS101: true, attributes: [\"mmsiCode\"] },\n\n { featureClass: \"LocalDirectionOfBuoyage\", name: \"Local Direction of Buoyage\", section: \"Q\", group: \"buoyage-direction\",\n category: \"geo\", description: \"Indicates the local conventional direction of buoyage where it differs from the general direction. Shown as an arrow on the chart.\",\n portrayalRef: \"LDBG_S101\", isNewInS101: true, attributes: [\"orientation\"] },\n\n { featureClass: \"NavigationalSystemOfMarks\", name: \"Navigational System of Marks\", section: \"Q\", group: \"buoyage-direction\",\n category: \"geo\", description: \"The IALA buoyage region (A or B) in effect for a particular area, controlling the colour conventions for lateral marks.\",\n portrayalRef: \"NSMARKS_S101\", isNewInS101: true, attributes: [\"iALABuoyageRegion\"] },\n\n // ── Section P: Lights ──\n\n { featureClass: \"Light\", name: \"Light\", s57Equivalent: \"LIGHTS\", section: \"P\", group: \"lights\",\n category: \"geo\", description: \"A luminous or lighted aid to navigation. S-101 unifies the light feature with structured complex attributes for sectors.\",\n portrayalRef: \"LIGHTS_S101\", isNewInS101: false, attributes: [\"categoryOfLight\", \"lightCharacteristic\", \"signalSequence\", \"colour\", \"sectorLimit\"] },\n\n { featureClass: \"LightAllAround\", name: \"Light All Around\", s57Equivalent: \"LIGHTS\", section: \"P\", group: \"lights\",\n category: \"geo\", description: \"A light visible from all directions (360° coverage). Replaces LIGHTS when no sector geometry is used.\",\n portrayalRef: \"LITALL_S101\", isNewInS101: true, attributes: [\"lightCharacteristic\", \"signalSequence\", \"colour\", \"height\", \"valueOfNominalRange\"] },\n\n { featureClass: \"LightSectored\", name: \"Light Sectored\", s57Equivalent: \"LIGHTS\", section: \"P\", group: \"lights\",\n category: \"geo\", description: \"A light showing different characteristics (colour or visibility) over defined sectors. Uses complex attribute sectorLimit.\",\n portrayalRef: \"LITSEC_S101\", isNewInS101: true, attributes: [\"sectorLimit\", \"lightCharacteristic\", \"colour\"] },\n\n { featureClass: \"LightVessel\", name: \"Light Vessel\", s57Equivalent: \"LITVES\", section: \"P\", group: \"light-vessels\",\n category: \"geo\", description: \"A distinctively marked vessel anchored or moored at a charted point and used as an aid to navigation.\",\n portrayalRef: \"LITVES_S101\", isNewInS101: false, attributes: [\"colour\"] },\n\n { featureClass: \"LightFloat\", name: \"Light Float\", s57Equivalent: \"LITFLT\", section: \"P\", group: \"light-vessels\",\n category: \"geo\", description: \"A small unmanned vessel carrying a light, anchored at a charted point.\",\n portrayalRef: \"LITFLT_S101\", isNewInS101: false, attributes: [\"colour\"] },\n\n // ── Section R: Fog Signals ──\n\n { featureClass: \"FogSignal\", name: \"Fog Signal\", s57Equivalent: \"FOGSIG\", section: \"R\", group: \"fog-radar\",\n category: \"geo\", description: \"An audible aid to navigation used in fog or restricted visibility conditions.\",\n portrayalRef: \"FOGSIG_S101\", isNewInS101: false, attributes: [\"categoryOfFogSignal\", \"signalSequence\"] },\n\n // ── Section S: Radar & Radio ──\n\n { featureClass: \"RadarStation\", name: \"Radar Station\", s57Equivalent: \"RADSTA\", section: \"S\", group: \"fog-radar\",\n category: \"geo\", description: \"A station equipped with radar for surveillance or navigation assistance.\",\n portrayalRef: \"RADSTA_S101\", isNewInS101: false, attributes: [\"categoryOfRadarStation\"] },\n\n { featureClass: \"RadarTransponderBeacon\", name: \"Radar Transponder Beacon\", s57Equivalent: \"RTPBCN\", section: \"S\", group: \"fog-radar\",\n category: \"geo\", description: \"A transponder beacon that returns a distinctive signal when triggered by a radar pulse (RACON).\",\n portrayalRef: \"RTPBCN_S101\", isNewInS101: false, attributes: [\"radarConspicuous\", \"signalSequence\"] },\n\n { featureClass: \"RadarLine\", name: \"Radar Line\", section: \"S\", group: \"radar-features\",\n category: \"geo\", description: \"A line along which a radar-conspicuous feature provides a bearing reference. New in S-101 to better encode radar-detectable linear features.\",\n portrayalRef: \"RADLIN_S101\", isNewInS101: true, attributes: [\"orientation\", \"scaleMinimum\"] },\n\n { featureClass: \"RadarRange\", name: \"Radar Range\", section: \"S\", group: \"radar-features\",\n category: \"geo\", description: \"A distance reference determined by radar from a conspicuous feature. Used for radar-based position fixing.\",\n portrayalRef: \"RADRNG_S101\", isNewInS101: true, attributes: [\"orientation\", \"valueOfRange\"] },\n\n { featureClass: \"RadioStation\", name: \"Radio Station\", s57Equivalent: \"RDOSTA\", section: \"S\", group: \"fog-radar\",\n category: \"geo\", description: \"A station transmitting radio signals for navigational or communication purposes.\",\n portrayalRef: \"RDOSTA_S101\", isNewInS101: false, attributes: [\"categoryOfRadioStation\"] },\n\n // ── Section K: Dangers ──\n\n { featureClass: \"Wreck\", name: \"Wreck\", s57Equivalent: \"WRECKS\", section: \"K\", group: \"wrecks\",\n category: \"geo\", description: \"The remains of a stranded or sunken vessel. S-101 adds structured attributes for wreck condition assessment.\",\n portrayalRef: \"WRECKS_S101\", isNewInS101: false, attributes: [\"categoryOfWreck\", \"valueOfSounding\", \"waterLevelEffect\"] },\n\n { featureClass: \"UnderwaterAwashRock\", name: \"Underwater/Awash Rock\", s57Equivalent: \"UWTROC\", section: \"K\", group: \"rocks\",\n category: \"geo\", description: \"A rock hazard that is either permanently submerged or covers and uncovers with the tide.\",\n portrayalRef: \"UWTROC_S101\", isNewInS101: false, attributes: [\"valueOfSounding\", \"waterLevelEffect\"] },\n\n { featureClass: \"Obstruction\", name: \"Obstruction\", s57Equivalent: \"OBSTRN\", section: \"K\", group: \"obstructions\",\n category: \"geo\", description: \"An object (not a wreck or rock) that may constitute a danger to navigation.\",\n portrayalRef: \"OBSTRN_S101\", isNewInS101: false, attributes: [\"categoryOfObstruction\", \"valueOfSounding\", \"waterLevelEffect\"] },\n\n { featureClass: \"WaterTurbulence\", name: \"Water Turbulence\", section: \"K\", group: \"water-turbulence\",\n category: \"geo\", description: \"An area of disturbed water surface caused by currents, shoals, or wind against tide. Includes overfalls, tide rips, and eddies.\",\n portrayalRef: \"WATTUR_S101\", isNewInS101: true, attributes: [\"categoryOfWaterTurbulence\"] },\n\n { featureClass: \"NewDangerMarking\", name: \"New Danger Marking\", section: \"K\", group: \"obstructions\",\n category: \"geo\", description: \"Indicates a newly discovered danger that has not yet been sufficiently surveyed or charted. Displayed prominently to warn mariners.\",\n portrayalRef: \"NEWDNG_S101\", isNewInS101: true, attributes: [\"dateOfDiscovery\"] },\n\n // ── Section E: Landmarks ──\n\n { featureClass: \"Landmark\", name: \"Landmark\", s57Equivalent: \"LNDMRK\", section: \"E\", group: \"landmarks\",\n category: \"geo\", description: \"A conspicuous object, natural or artificial, on or near the coast that can be used for position fixing.\",\n portrayalRef: \"LNDMRK_S101\", isNewInS101: false, attributes: [\"categoryOfLandmark\", \"function\", \"visuallyConspicuous\"] },\n\n // ── Section D: Bridges ──\n\n { featureClass: \"Bridge\", name: \"Bridge\", s57Equivalent: \"BRIDGE\", section: \"D\", group: \"bridges\",\n category: \"geo\", description: \"A structure spanning a body of water or other obstacle. S-101 adds complex attributes for clearance values.\",\n portrayalRef: \"BRIDGE_S101\", isNewInS101: false, attributes: [\"categoryOfBridge\", \"verticalClearanceFixed\", \"verticalClearanceOpened\", \"horizontalClearanceValue\"] },\n\n // ── Section L: Offshore Installations ──\n\n { featureClass: \"OffshorePlatform\", name: \"Offshore Platform\", s57Equivalent: \"OFSPLF\", section: \"L\", group: \"infrastructure\",\n category: \"geo\", description: \"A permanent offshore structure such as an oil/gas platform or wind turbine foundation.\",\n portrayalRef: \"OFSPLF_S101\", isNewInS101: false, attributes: [\"categoryOfOffshorePlatform\", \"product\"] },\n\n // ── Section N: Regulated Areas ──\n\n { featureClass: \"AnchorageArea\", name: \"Anchorage Area\", s57Equivalent: \"ACHARE\", section: \"N\", group: \"anchorage\",\n category: \"geo\", description: \"An area designated for vessels to anchor. S-101 adds structured temporal attributes for seasonal restrictions.\",\n portrayalRef: \"ACHARE_S101\", isNewInS101: false, attributes: [\"categoryOfAnchorage\", \"restriction\"] },\n\n { featureClass: \"RestrictedArea\", name: \"Restricted Area\", s57Equivalent: \"RESARE\", section: \"N\", group: \"restricted-areas\",\n category: \"geo\", description: \"An area in which navigation and/or anchoring may be restricted.\",\n portrayalRef: \"RESARE_S101\", isNewInS101: false, attributes: [\"categoryOfRestrictedArea\", \"restriction\"] },\n\n { featureClass: \"UnderkeelClearanceManagementArea\", name: \"Under-keel Clearance Management Area\", section: \"N\", group: \"ukc-areas\",\n category: \"geo\", description: \"An area where under-keel clearance is actively managed and vessels must maintain minimum clearance above the seabed. New in S-101.\",\n portrayalRef: \"UKCMGT_S101\", isNewInS101: true, attributes: [\"minimumUnderKeelClearance\", \"waterLevelTrend\"] },\n\n { featureClass: \"ArchipelagicSeaLane\", name: \"Archipelagic Sea Lane\", section: \"N\", group: \"restricted-areas\",\n category: \"geo\", description: \"A sea lane designated for the continuous and expeditious passage of ships through archipelagic waters (UNCLOS Part IV).\",\n portrayalRef: \"ARCSLN_S101\", isNewInS101: true, attributes: [\"categoryOfArchipelagicSeaLane\"] },\n\n // ── Section M: Tracks & Routes ──\n\n { featureClass: \"RecommendedTrack\", name: \"Recommended Track\", s57Equivalent: \"RECTRC\", section: \"M\", group: \"routes\",\n category: \"geo\", description: \"A route recommended for navigation but not requiring mandatory compliance.\",\n portrayalRef: \"RECTRC_S101\", isNewInS101: false, attributes: [\"orientationValue\", \"trafficFlow\"] },\n\n { featureClass: \"TrafficSeparationScheme\", name: \"Traffic Separation Scheme\", s57Equivalent: \"TSSLPT\", section: \"M\", group: \"routes\",\n category: \"geo\", description: \"A routing measure aimed at separating opposing streams of traffic by establishing lanes.\",\n portrayalRef: \"TSS_S101\", isNewInS101: false, attributes: [\"categoryOfTrafficSeparationScheme\"] },\n\n { featureClass: \"FerryRoute\", name: \"Ferry Route\", s57Equivalent: \"FERYRT\", section: \"M\", group: \"routes\",\n category: \"geo\", description: \"A route over which a ferry regularly operates.\",\n portrayalRef: \"FERYRT_S101\", isNewInS101: false, attributes: [\"categoryOfFerryRoute\"] },\n\n // ── Section T: Services ──\n\n { featureClass: \"PilotService\", name: \"Pilot Service\", s57Equivalent: \"PILPNT\", section: \"T\", group: \"services\",\n category: \"geo\", description: \"A place where pilots embark or disembark, or where pilotage services are provided.\",\n portrayalRef: \"PILPNT_S101\", isNewInS101: false, attributes: [\"categoryOfPilot\"] },\n\n { featureClass: \"SignalStation\", name: \"Signal Station\", s57Equivalent: \"SISTAT\", section: \"T\", group: \"services\",\n category: \"geo\", description: \"A station from which visual, audio, or electronic signals are made to regulate or assist navigation.\",\n portrayalRef: \"SISTAT_S101\", isNewInS101: false, attributes: [\"categoryOfSignalStation\"] },\n\n { featureClass: \"CoastGuardStation\", name: \"Coast Guard Station\", s57Equivalent: \"CGUSTA\", section: \"T\", group: \"services\",\n category: \"geo\", description: \"A station from which the coast guard operates to ensure maritime safety.\",\n portrayalRef: \"CGUSTA_S101\", isNewInS101: false, attributes: [] },\n\n // ── Depths & Hydrography (Section D context but main chart area) ──\n\n { featureClass: \"DepthArea\", name: \"Depth Area\", s57Equivalent: \"DEPARE\", section: \"D\", group: \"depths\",\n category: \"geo\", description: \"An area of the sea floor within a defined depth range. Fundamental to safe navigation planning.\",\n portrayalRef: \"DEPARE_S101\", isNewInS101: false, attributes: [\"depthRangeMinimumValue\", \"depthRangeMaximumValue\"] },\n\n { featureClass: \"DepthContour\", name: \"Depth Contour\", s57Equivalent: \"DEPCNT\", section: \"D\", group: \"depths\",\n category: \"geo\", description: \"A line connecting points of equal depth below the sounding datum.\",\n portrayalRef: \"DEPCNT_S101\", isNewInS101: false, attributes: [\"valueOfContour\"] },\n\n { featureClass: \"Sounding\", name: \"Sounding\", s57Equivalent: \"SOUNDG\", section: \"D\", group: \"depths\",\n category: \"geo\", description: \"A measured depth of water at a specific location, reduced to sounding datum.\",\n portrayalRef: \"SOUNDG_S101\", isNewInS101: false, attributes: [\"valueOfSounding\", \"qualityOfSounding\"] },\n\n { featureClass: \"QualityOfBathymetricData\", name: \"Quality of Bathymetric Data\", section: \"D\", group: \"quality-indicators\",\n category: \"meta\", description: \"Indicates the quality and reliability of bathymetric data in an area. Encodes survey date, technique, and positional accuracy. Replaces M_QUAL from S-57.\",\n portrayalRef: \"QOBDAT_S101\", isNewInS101: true, attributes: [\"categoryOfTemporalVariation\", \"dataAssessment\", \"featuresDetected\", \"fullSeafloorCoverageAchieved\", \"horizontalPositionUncertainty\"] },\n\n { featureClass: \"SpatialQuality\", name: \"Spatial Quality\", section: \"D\", group: \"quality-indicators\",\n category: \"meta\", description: \"Provides information about the spatial accuracy and quality of features in a defined area. New meta-feature in S-101.\",\n portrayalRef: \"SPATQL_S101\", isNewInS101: true, attributes: [\"qualityOfHorizontalMeasurement\", \"qualityOfVerticalMeasurement\"] },\n\n // ── Meta features ──\n\n { featureClass: \"DataCoverage\", name: \"Data Coverage\", section: \"M\", group: \"meta-features\",\n category: \"meta\", description: \"Defines the extent of data coverage in a dataset. Indicates which areas contain chart data and at what navigational purpose.\",\n portrayalRef: \"DATCOV_S101\", isNewInS101: true, attributes: [\"maximumDisplayScale\", \"minimumDisplayScale\"] },\n\n { featureClass: \"UpdateInformation\", name: \"Update Information\", section: \"M\", group: \"meta-features\",\n category: \"meta\", description: \"Carries information about updates applied to the dataset. Tracks insertions, modifications, and deletions for incremental updating.\",\n portrayalRef: \"UPDTIF_S101\", isNewInS101: true, attributes: [\"dateOfIssue\", \"updateNumber\"] },\n\n { featureClass: \"TextPlacement\", name: \"Text Placement\", section: \"M\", group: \"meta-features\",\n category: \"meta\", description: \"Controls the position and orientation of text labels on the chart. Allows producers to specify label placement for optimal readability.\",\n portrayalRef: \"TXTPLC_S101\", isNewInS101: true, attributes: [\"textContent\", \"textJustification\", \"textRotation\"] },\n];\n\n// ═══════════════════════════════════════════════════════════\n// S-101 CHART SECTIONS (same structure as S-52 but with S-101 context)\n// ═══════════════════════════════════════════════════════════\n\nexport const S101_CHART_SECTIONS = [\n { id: \"Q\", label: \"Buoys, Beacons & AIS Aids\", description: \"All floating, fixed, and virtual aids to navigation including AIS-based marks new to S-101.\" },\n { id: \"P\", label: \"Lights\", description: \"Navigational lights with structured sector definitions and complex light characteristics.\" },\n { id: \"R\", label: \"Fog Signals\", description: \"Audible fog signal devices with structured signal sequence attributes.\" },\n { id: \"S\", label: \"Radar & Radio\", description: \"Radar beacons, transponders, radar lines/ranges, and radio stations.\" },\n { id: \"K\", label: \"Dangers\", description: \"Wrecks, rocks, obstructions, water turbulence, and new danger markings.\" },\n { id: \"E\", label: \"Landmarks\", description: \"Conspicuous objects ashore with enhanced visual conspicuity encoding.\" },\n { id: \"D\", label: \"Depths & Bridges\", description: \"Bathymetric data, depth areas, soundings, quality indicators, and bridges.\" },\n { id: \"L\", label: \"Offshore Installations\", description: \"Platforms, wind farms, and other offshore structures.\" },\n { id: \"N\", label: \"Regulated Areas\", description: \"Anchorages, restricted areas, under-keel clearance zones, and archipelagic sea lanes.\" },\n { id: \"T\", label: \"Services\", description: \"Pilot stations, signal stations, and coast guard facilities.\" },\n { id: \"M\", label: \"Tracks, Routes & Meta\", description: \"Recommended tracks, traffic separation, data coverage, and update information.\" },\n];\n\n// ═══════════════════════════════════════════════════════════\n// S-101 SYMBOL GROUPS\n// ═══════════════════════════════════════════════════════════\n\nexport const S101_SYMBOL_GROUPS = [\n { id: \"lateral-buoys\", label: \"Lateral Buoys\", section: \"Q\", description: \"Channel marking buoys per IALA buoyage system.\" },\n { id: \"cardinal-buoys\", label: \"Cardinal Buoys\", section: \"Q\", description: \"Compass-referenced danger marking buoys.\" },\n { id: \"special-buoys\", label: \"Special Purpose Buoys\", section: \"Q\", description: \"Isolated danger, safe water, special, and emergency wreck marking buoys.\" },\n { id: \"beacons\", label: \"Beacons\", section: \"Q\", description: \"Fixed aids to navigation with topmarks.\" },\n { id: \"topmarks\", label: \"Topmarks\", section: \"Q\", description: \"Identification shapes on buoys and beacons.\" },\n { id: \"daymarks\", label: \"Daymarks\", section: \"Q\", description: \"Painted boards for daytime identification.\" },\n { id: \"mooring\", label: \"Mooring Facilities\", section: \"Q\", description: \"Mooring buoys and warping facilities.\" },\n { id: \"virtual-aids\", label: \"AIS Aids to Navigation\", section: \"Q\", description: \"Virtual, physical, and synthetic AIS-based navigation aids — new in S-101.\" },\n { id: \"buoyage-direction\", label: \"Buoyage Direction & System\", section: \"Q\", description: \"Local direction of buoyage and IALA region encoding — new in S-101.\" },\n { id: \"lights\", label: \"Lights\", section: \"P\", description: \"All-around, sectored, and directional navigational lights.\" },\n { id: \"light-vessels\", label: \"Light Vessels & Floats\", section: \"P\", description: \"Floating lighthouses.\" },\n { id: \"fog-radar\", label: \"Fog Signals & Radar\", section: \"R\", description: \"Audible signals and radar beacons.\" },\n { id: \"radar-features\", label: \"Radar Lines & Ranges\", section: \"S\", description: \"Radar-detectable linear features and ranges — new in S-101.\" },\n { id: \"wrecks\", label: \"Wrecks\", section: \"K\", description: \"Sunken or stranded vessels.\" },\n { id: \"rocks\", label: \"Rocks\", section: \"K\", description: \"Natural rock hazards.\" },\n { id: \"obstructions\", label: \"Obstructions\", section: \"K\", description: \"Underwater obstructions and new danger markings.\" },\n { id: \"water-turbulence\", label: \"Water Turbulence\", section: \"K\", description: \"Areas of disturbed water — overfalls, tide rips, eddies. New in S-101.\" },\n { id: \"landmarks\", label: \"Landmarks\", section: \"E\", description: \"Conspicuous objects ashore.\" },\n { id: \"bridges\", label: \"Bridges\", section: \"D\", description: \"Structures spanning waterways.\" },\n { id: \"depths\", label: \"Depths & Hydrography\", section: \"D\", description: \"Depth areas, contours, and soundings.\" },\n { id: \"quality-indicators\", label: \"Quality Indicators\", section: \"D\", description: \"Bathymetric data quality and spatial accuracy — new meta-features in S-101.\" },\n { id: \"infrastructure\", label: \"Infrastructure\", section: \"L\", description: \"Offshore platforms and structures.\" },\n { id: \"anchorage\", label: \"Anchorage\", section: \"N\", description: \"Designated anchorage areas.\" },\n { id: \"restricted-areas\", label: \"Restricted & Special Areas\", section: \"N\", description: \"Restricted areas and archipelagic sea lanes.\" },\n { id: \"ukc-areas\", label: \"Under-keel Clearance\", section: \"N\", description: \"Areas with managed under-keel clearance — new in S-101.\" },\n { id: \"services\", label: \"Services\", section: \"T\", description: \"Pilot, signal, and coast guard stations.\" },\n { id: \"routes\", label: \"Tracks & Routes\", section: \"M\", description: \"Recommended tracks and traffic separation.\" },\n { id: \"meta-features\", label: \"Meta Features\", section: \"M\", description: \"Data coverage, update information, and text placement — new in S-101.\" },\n];\n","/**\n * S-101 Portrayal Catalogue — New Symbol SVGs\n *\n * These symbols represent features introduced in S-101 that have no\n * direct S-57/S-52 equivalent. The existing S-52 symbols are reused\n * where S-101 retains visual continuity with the S-57 portrayal.\n *\n * Reference: IHO S-101 Portrayal Catalogue (Ed 1.1.0)\n */\n\nimport type { NauticalSymbol } from \"./symbols\";\n\nconst SIZE = 32;\n\nfunction svg(inner: string): string {\n return `<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"${SIZE}\" height=\"${SIZE}\" viewBox=\"0 0 32 32\">${inner}</svg>`;\n}\n\n// ── Virtual AIS Aid to Navigation — dashed circle with \"V\" ──\nfunction virtualAIS(): string {\n return svg(`\n <circle cx=\"16\" cy=\"16\" r=\"11\" fill=\"none\" stroke=\"#a3238e\" stroke-width=\"1.5\" stroke-dasharray=\"4,3\"/>\n <text x=\"16\" y=\"20\" text-anchor=\"middle\" font-size=\"12\" font-weight=\"bold\" fill=\"#a3238e\" font-family=\"sans-serif\">V</text>\n `);\n}\n\n// ── Physical AIS Aid to Navigation — solid circle with \"A\" ──\nfunction physicalAIS(): string {\n return svg(`\n <circle cx=\"16\" cy=\"16\" r=\"11\" fill=\"none\" stroke=\"#a3238e\" stroke-width=\"1.5\"/>\n <text x=\"16\" y=\"20\" text-anchor=\"middle\" font-size=\"12\" font-weight=\"bold\" fill=\"#a3238e\" font-family=\"sans-serif\">A</text>\n `);\n}\n\n// ── Synthetic AIS Aid to Navigation — dashed circle with \"S\" ──\nfunction syntheticAIS(): string {\n return svg(`\n <circle cx=\"16\" cy=\"16\" r=\"11\" fill=\"none\" stroke=\"#a3238e\" stroke-width=\"1.5\" stroke-dasharray=\"2,2\"/>\n <text x=\"16\" y=\"20\" text-anchor=\"middle\" font-size=\"12\" font-weight=\"bold\" fill=\"#a3238e\" font-family=\"sans-serif\">S</text>\n `);\n}\n\n// ── Local Direction of Buoyage — arrow ──\nfunction localBuoyageDirection(): string {\n return svg(`\n <line x1=\"6\" y1=\"16\" x2=\"26\" y2=\"16\" stroke=\"#a3238e\" stroke-width=\"1.5\"/>\n <polygon points=\"26,16 20,12 20,20\" fill=\"#a3238e\"/>\n `);\n}\n\n// ── Navigational System of Marks — IALA region indicator ──\nfunction navSystemOfMarks(): string {\n return svg(`\n <rect x=\"4\" y=\"8\" width=\"24\" height=\"16\" rx=\"2\" fill=\"none\" stroke=\"#a3238e\" stroke-width=\"1.2\"/>\n <text x=\"16\" y=\"20\" text-anchor=\"middle\" font-size=\"10\" font-weight=\"bold\" fill=\"#a3238e\" font-family=\"sans-serif\">IALA</text>\n `);\n}\n\n// ── Radar Line — dashed bearing line ──\nfunction radarLine(): string {\n return svg(`\n <line x1=\"4\" y1=\"28\" x2=\"28\" y2=\"4\" stroke=\"#a3238e\" stroke-width=\"1.5\" stroke-dasharray=\"5,3\"/>\n <circle cx=\"4\" cy=\"28\" r=\"2\" fill=\"#a3238e\"/>\n `);\n}\n\n// ── Radar Range — arc with distance indicator ──\nfunction radarRange(): string {\n return svg(`\n <circle cx=\"4\" cy=\"28\" r=\"2\" fill=\"#a3238e\"/>\n <path d=\"M4,10 A18,18 0 0,1 22,28\" fill=\"none\" stroke=\"#a3238e\" stroke-width=\"1.5\" stroke-dasharray=\"5,3\"/>\n `);\n}\n\n// ── Water Turbulence — wavy pattern ──\nfunction waterTurbulence(): string {\n return svg(`\n <path d=\"M4,12 Q8,8 12,12 Q16,16 20,12 Q24,8 28,12\" fill=\"none\" stroke=\"#4a6fa5\" stroke-width=\"1.5\"/>\n <path d=\"M4,18 Q8,14 12,18 Q16,22 20,18 Q24,14 28,18\" fill=\"none\" stroke=\"#4a6fa5\" stroke-width=\"1.5\"/>\n <path d=\"M4,24 Q8,20 12,24 Q16,28 20,24 Q24,20 28,24\" fill=\"none\" stroke=\"#4a6fa5\" stroke-width=\"1.2\"/>\n `);\n}\n\n// ── Quality of Bathymetric Data — hatched zone ──\nfunction qualityOfBathymetry(): string {\n return svg(`\n <rect x=\"4\" y=\"4\" width=\"24\" height=\"24\" rx=\"1\" fill=\"none\" stroke=\"#4a6fa5\" stroke-width=\"1\"/>\n <line x1=\"4\" y1=\"10\" x2=\"10\" y2=\"4\" stroke=\"#4a6fa5\" stroke-width=\"0.6\"/>\n <line x1=\"4\" y1=\"16\" x2=\"16\" y2=\"4\" stroke=\"#4a6fa5\" stroke-width=\"0.6\"/>\n <line x1=\"4\" y1=\"22\" x2=\"22\" y2=\"4\" stroke=\"#4a6fa5\" stroke-width=\"0.6\"/>\n <line x1=\"4\" y1=\"28\" x2=\"28\" y2=\"4\" stroke=\"#4a6fa5\" stroke-width=\"0.6\"/>\n <line x1=\"10\" y1=\"28\" x2=\"28\" y2=\"10\" stroke=\"#4a6fa5\" stroke-width=\"0.6\"/>\n <line x1=\"16\" y1=\"28\" x2=\"28\" y2=\"16\" stroke=\"#4a6fa5\" stroke-width=\"0.6\"/>\n <line x1=\"22\" y1=\"28\" x2=\"28\" y2=\"22\" stroke=\"#4a6fa5\" stroke-width=\"0.6\"/>\n <text x=\"16\" y=\"18\" text-anchor=\"middle\" font-size=\"7\" fill=\"#4a6fa5\" font-family=\"sans-serif\">ZOC</text>\n `);\n}\n\n// ── Spatial Quality — grid indicator ──\nfunction spatialQuality(): string {\n return svg(`\n <rect x=\"4\" y=\"4\" width=\"24\" height=\"24\" rx=\"1\" fill=\"none\" stroke=\"#4a6fa5\" stroke-width=\"1\"/>\n <line x1=\"4\" y1=\"16\" x2=\"28\" y2=\"16\" stroke=\"#4a6fa5\" stroke-width=\"0.6\"/>\n <line x1=\"16\" y1=\"4\" x2=\"16\" y2=\"28\" stroke=\"#4a6fa5\" stroke-width=\"0.6\"/>\n <text x=\"16\" y=\"14\" text-anchor=\"middle\" font-size=\"6\" fill=\"#4a6fa5\" font-family=\"sans-serif\">SQ</text>\n `);\n}\n\n// ── Under-keel Clearance Management Area — UKC diamond ──\nfunction ukcArea(): string {\n return svg(`\n <polygon points=\"16,2 30,16 16,30 2,16\" fill=\"none\" stroke=\"#d42e12\" stroke-width=\"1.5\"/>\n <text x=\"16\" y=\"18\" text-anchor=\"middle\" font-size=\"7\" font-weight=\"bold\" fill=\"#d42e12\" font-family=\"sans-serif\">UKC</text>\n `);\n}\n\n// ── Archipelagic Sea Lane — ASL arrow ──\nfunction archipelagicSeaLane(): string {\n return svg(`\n <line x1=\"6\" y1=\"26\" x2=\"26\" y2=\"6\" stroke=\"#a3238e\" stroke-width=\"2\"/>\n <polygon points=\"26,6 20,6 26,12\" fill=\"#a3238e\"/>\n <line x1=\"3\" y1=\"23\" x2=\"23\" y2=\"3\" stroke=\"#a3238e\" stroke-width=\"0.6\" stroke-dasharray=\"3,2\"/>\n <line x1=\"9\" y1=\"29\" x2=\"29\" y2=\"9\" stroke=\"#a3238e\" stroke-width=\"0.6\" stroke-dasharray=\"3,2\"/>\n `);\n}\n\n// ── New Danger Marking — flashing diamond ──\nfunction newDangerMarking(): string {\n return svg(`\n <polygon points=\"16,3 27,16 16,29 5,16\" fill=\"none\" stroke=\"#d42e12\" stroke-width=\"2\"/>\n <line x1=\"11\" y1=\"11\" x2=\"21\" y2=\"21\" stroke=\"#d42e12\" stroke-width=\"1.5\"/>\n <line x1=\"21\" y1=\"11\" x2=\"11\" y2=\"21\" stroke=\"#d42e12\" stroke-width=\"1.5\"/>\n <text x=\"16\" y=\"10\" text-anchor=\"middle\" font-size=\"5\" fill=\"#d42e12\" font-family=\"sans-serif\">NEW</text>\n `);\n}\n\n// ── Data Coverage — grid pattern ──\nfunction dataCoverage(): string {\n return svg(`\n <rect x=\"4\" y=\"4\" width=\"24\" height=\"24\" rx=\"1\" fill=\"none\" stroke=\"#00843d\" stroke-width=\"1.2\"/>\n <line x1=\"4\" y1=\"12\" x2=\"28\" y2=\"12\" stroke=\"#00843d\" stroke-width=\"0.5\"/>\n <line x1=\"4\" y1=\"20\" x2=\"28\" y2=\"20\" stroke=\"#00843d\" stroke-width=\"0.5\"/>\n <line x1=\"12\" y1=\"4\" x2=\"12\" y2=\"28\" stroke=\"#00843d\" stroke-width=\"0.5\"/>\n <line x1=\"20\" y1=\"4\" x2=\"20\" y2=\"28\" stroke=\"#00843d\" stroke-width=\"0.5\"/>\n <text x=\"16\" y=\"18\" text-anchor=\"middle\" font-size=\"6\" fill=\"#00843d\" font-family=\"sans-serif\">COV</text>\n `);\n}\n\n// ── Update Information — delta symbol ──\nfunction updateInformation(): string {\n return svg(`\n <polygon points=\"16,4 6,28 26,28\" fill=\"none\" stroke=\"#00843d\" stroke-width=\"1.5\"/>\n <text x=\"16\" y=\"24\" text-anchor=\"middle\" font-size=\"8\" fill=\"#00843d\" font-family=\"sans-serif\">Δ</text>\n `);\n}\n\n// ── Text Placement — text indicator ──\nfunction textPlacement(): string {\n return svg(`\n <rect x=\"4\" y=\"8\" width=\"24\" height=\"16\" rx=\"1\" fill=\"none\" stroke=\"#666\" stroke-width=\"1\"/>\n <text x=\"16\" y=\"20\" text-anchor=\"middle\" font-size=\"9\" fill=\"#666\" font-family=\"sans-serif\">Txt</text>\n `);\n}\n\n// ── Light All Around — 360° radial symbol ──\nfunction lightAllAround(): string {\n return svg(`\n <circle cx=\"16\" cy=\"16\" r=\"3\" fill=\"#a3238e\"/>\n <circle cx=\"16\" cy=\"16\" r=\"9\" fill=\"none\" stroke=\"#a3238e\" stroke-width=\"0.8\"/>\n <line x1=\"16\" y1=\"3\" x2=\"16\" y2=\"7\" stroke=\"#a3238e\" stroke-width=\"1\"/>\n <line x1=\"16\" y1=\"25\" x2=\"16\" y2=\"29\" stroke=\"#a3238e\" stroke-width=\"1\"/>\n <line x1=\"3\" y1=\"16\" x2=\"7\" y2=\"16\" stroke=\"#a3238e\" stroke-width=\"1\"/>\n <line x1=\"25\" y1=\"16\" x2=\"29\" y2=\"16\" stroke=\"#a3238e\" stroke-width=\"1\"/>\n `);\n}\n\n// ── Light Sectored — sector arcs from center ──\nfunction lightSectored(): string {\n return svg(`\n <circle cx=\"16\" cy=\"22\" r=\"2.5\" fill=\"#a3238e\"/>\n <path d=\"M16,22 L6,6\" stroke=\"#a3238e\" stroke-width=\"0.8\"/>\n <path d=\"M16,22 L16,4\" stroke=\"#a3238e\" stroke-width=\"0.8\"/>\n <path d=\"M16,22 L26,6\" stroke=\"#a3238e\" stroke-width=\"0.8\"/>\n <path d=\"M6,6 A12,12 0 0,1 16,4\" fill=\"none\" stroke=\"#d42e12\" stroke-width=\"2\"/>\n <path d=\"M16,4 A12,12 0 0,1 26,6\" fill=\"none\" stroke=\"#00843d\" stroke-width=\"2\"/>\n `);\n}\n\n// ═══════════════════════════════════════════════════════════\n// S-101 NAUTICAL SYMBOLS ARRAY (new-in-S-101 features only)\n// ═══════════════════════════════════════════════════════════\n\nexport const S101_NEW_SYMBOLS: NauticalSymbol[] = [\n // ── AIS Aids ──\n { id: \"s101-virtual-ais\", label: \"Virtual AIS Aid to Navigation\", int1Ref: \"Q170\", section: \"Q\", getSvg: virtualAIS,\n group: \"virtual-aids\", description: \"An AIS target broadcast to indicate a hazard, channel edge, or point of interest that has no physical structure. Displayed as a dashed position circle with 'V'.\",\n s52PlRef: \"VAISATN_S101\", renderSize: \"32×32\",\n colors: [{ token: \"PLRTE\", hex: \"#a3238e\", usage: \"AIS symbol outline and text\" }],\n usageContext: \"Virtual AIS aids are increasingly deployed to mark temporary hazards, new dangers, or channel modifications without the delay and cost of placing physical buoys. They appear on ECDIS as a distinctive symbol and require AIS-capable equipment to receive.\" },\n\n { id: \"s101-physical-ais\", label: \"Physical AIS Aid to Navigation\", int1Ref: \"Q170.1\", section: \"Q\", getSvg: physicalAIS,\n group: \"virtual-aids\", description: \"A physical aid to navigation equipped with an AIS transponder broadcasting its identity and position.\",\n s52PlRef: \"PAISATN_S101\", renderSize: \"32×32\",\n colors: [{ token: \"PLRTE\", hex: \"#a3238e\", usage: \"AIS symbol outline and text\" }],\n usageContext: \"Physical AIS aids combine traditional visual marks with AIS broadcasting. The AIS signal provides positive identification and position data even in poor visibility.\" },\n\n { id: \"s101-synthetic-ais\", label: \"Synthetic AIS Aid to Navigation\", int1Ref: \"Q170.2\", section: \"Q\", getSvg: syntheticAIS,\n group: \"virtual-aids\", description: \"An AIS target transmitted by a shore station representing a physical aid that is not itself AIS-equipped.\",\n s52PlRef: \"SAISATN_S101\", renderSize: \"32×32\",\n colors: [{ token: \"PLRTE\", hex: \"#a3238e\", usage: \"AIS symbol outline and text\" }],\n usageContext: \"Synthetic AIS aids allow shore stations to broadcast AIS targets for existing physical aids that lack their own transponders. This extends AIS coverage without retrofitting every buoy.\" },\n\n { id: \"s101-local-buoyage-dir\", label: \"Local Direction of Buoyage\", int1Ref: \"Q130.7\", section: \"Q\", getSvg: localBuoyageDirection,\n group: \"buoyage-direction\", description: \"Arrow indicating the local conventional direction of buoyage where it differs from the general direction.\",\n s52PlRef: \"LDBG_S101\", renderSize: \"32×32\",\n colors: [{ token: \"PLRTE\", hex: \"#a3238e\", usage: \"Arrow fill and stroke\" }],\n usageContext: \"In areas where the general direction of buoyage is ambiguous (e.g., interconnected waterways), the local direction arrow tells mariners which way is 'returning from sea' for lateral mark interpretation.\" },\n\n { id: \"s101-nav-system\", label: \"Navigational System of Marks\", int1Ref: \"Q130.0\", section: \"Q\", getSvg: navSystemOfMarks,\n group: \"buoyage-direction\", description: \"Indicates the IALA buoyage region (A or B) in effect, controlling the colour conventions for lateral marks.\",\n s52PlRef: \"NSMARKS_S101\", renderSize: \"32×32\",\n colors: [{ token: \"PLRTE\", hex: \"#a3238e\", usage: \"Border and text\" }],\n usageContext: \"This feature explicitly encodes which IALA region applies, removing ambiguity at boundaries between Region A (most of the world) and Region B (Americas, Japan, Korea, Philippines).\" },\n\n // ── Radar Features ──\n { id: \"s101-radar-line\", label: \"Radar Line\", int1Ref: \"S4\", section: \"S\", getSvg: radarLine,\n group: \"radar-features\", description: \"A line along which a radar-conspicuous feature provides a bearing reference for radar navigation.\",\n s52PlRef: \"RADLIN_S101\", renderSize: \"32×32\",\n colors: [{ token: \"PLRTE\", hex: \"#a3238e\", usage: \"Dashed bearing line\" }],\n usageContext: \"Radar lines help navigators verify their radar bearings against charted reference features. Particularly useful in coastal navigation and pilotage.\" },\n\n { id: \"s101-radar-range\", label: \"Radar Range\", int1Ref: \"S5\", section: \"S\", getSvg: radarRange,\n group: \"radar-features\", description: \"A distance reference determined by radar from a conspicuous feature.\",\n s52PlRef: \"RADRNG_S101\", renderSize: \"32×32\",\n colors: [{ token: \"PLRTE\", hex: \"#a3238e\", usage: \"Dashed arc\" }],\n usageContext: \"Radar ranges provide distance references from radar-conspicuous points, enabling position fixing by range and bearing in restricted visibility.\" },\n\n // ── Lights (new structured types) ──\n { id: \"s101-light-all-around\", label: \"Light All Around\", int1Ref: \"P1.1\", section: \"P\", getSvg: lightAllAround,\n group: \"lights\", description: \"A light visible from all directions (360° coverage). S-101 separates this from sectored lights for clearer data modeling.\",\n s52PlRef: \"LITALL_S101\", renderSize: \"32×32\",\n colors: [{ token: \"PLRTE\", hex: \"#a3238e\", usage: \"Light symbol\" }],\n usageContext: \"In S-101, lights are split into distinct feature types (all-around vs sectored) rather than using a single LIGHTS feature with complex attribute logic. This simplifies portrayal rules.\" },\n\n { id: \"s101-light-sectored\", label: \"Light Sectored\", int1Ref: \"P40.1\", section: \"P\", getSvg: lightSectored,\n group: \"lights\", description: \"A light showing different characteristics over defined sectors. Uses structured sectorLimit complex attribute.\",\n s52PlRef: \"LITSEC_S101\", renderSize: \"32×32\",\n colors: [\n { token: \"PLRTE\", hex: \"#a3238e\", usage: \"Light position\" },\n { token: \"DNGHL\", hex: \"#d42e12\", usage: \"Red sector\" },\n { token: \"CHGRN\", hex: \"#00843d\", usage: \"Green sector\" },\n ],\n usageContext: \"S-101 models each sector as a structured sub-attribute within the light feature, replacing S-57's approach of multiple LIGHTS features for a single physical light.\" },\n\n // ── Dangers ──\n { id: \"s101-water-turbulence\", label: \"Water Turbulence\", int1Ref: \"K44\", section: \"K\", getSvg: waterTurbulence,\n group: \"water-turbulence\", description: \"An area of disturbed water surface caused by currents, shoals, or wind-against-tide. Includes overfalls, tide rips, and eddies.\",\n s52PlRef: \"WATTUR_S101\", renderSize: \"32×32\",\n colors: [{ token: \"DEPVS\", hex: \"#4a6fa5\", usage: \"Wave pattern\" }],\n usageContext: \"Water turbulence areas warn mariners of potentially dangerous sea states. Small craft are particularly vulnerable. In S-101 this is a dedicated feature rather than encoded as a note.\" },\n\n { id: \"s101-new-danger\", label: \"New Danger Marking\", int1Ref: \"K50\", section: \"K\", getSvg: newDangerMarking,\n group: \"obstructions\", description: \"Indicates a newly discovered danger not yet fully surveyed. Displayed prominently with 'NEW' label.\",\n s52PlRef: \"NEWDNG_S101\", renderSize: \"32×32\",\n colors: [{ token: \"DNGHL\", hex: \"#d42e12\", usage: \"Danger diamond and cross\" }],\n usageContext: \"New danger markings alert mariners to recently reported hazards. They are typically displayed with maximum prominence until the area is surveyed and the chart is formally updated.\" },\n\n // ── Regulated Areas ──\n { id: \"s101-ukc-area\", label: \"Under-keel Clearance Management Area\", int1Ref: \"N65\", section: \"N\", getSvg: ukcArea,\n group: \"ukc-areas\", description: \"An area where under-keel clearance is actively managed. Vessels must maintain minimum clearance above the seabed.\",\n s52PlRef: \"UKCMGT_S101\", renderSize: \"32×32\",\n colors: [{ token: \"DNGHL\", hex: \"#d42e12\", usage: \"UKC diamond outline\" }],\n usageContext: \"UKC management areas are critical for deep-draught vessels. Port authorities typically require vessels to calculate their UKC considering tidal predictions, vessel squat, and sea state.\" },\n\n { id: \"s101-archipelagic-sea-lane\", label: \"Archipelagic Sea Lane\", int1Ref: \"N70\", section: \"N\", getSvg: archipelagicSeaLane,\n group: \"restricted-areas\", description: \"A sea lane designated for continuous and expeditious passage through archipelagic waters (UNCLOS Part IV).\",\n s52PlRef: \"ARCSLN_S101\", renderSize: \"32×32\",\n colors: [{ token: \"PLRTE\", hex: \"#a3238e\", usage: \"Lane centerline and boundaries\" }],\n usageContext: \"Archipelagic sea lanes provide rights of passage through archipelagic states similar to transit passage through straits. Vessels must remain within the lane and proceed without delay.\" },\n\n // ── Quality Indicators ──\n { id: \"s101-quality-bathymetry\", label: \"Quality of Bathymetric Data\", int1Ref: \"M12.1\", section: \"D\", getSvg: qualityOfBathymetry,\n group: \"quality-indicators\", description: \"Indicates survey quality, technique, and positional accuracy for an area. Replaces S-57's M_QUAL with richer attributes.\",\n s52PlRef: \"QOBDAT_S101\", renderSize: \"32×32\",\n colors: [{ token: \"DEPVS\", hex: \"#4a6fa5\", usage: \"Hatching and text\" }],\n usageContext: \"Quality of bathymetric data helps mariners assess how much trust to place in charted depths. Categories range from ZOC A1 (full seafloor coverage, high accuracy) to ZOC D (insufficient data).\" },\n\n { id: \"s101-spatial-quality\", label: \"Spatial Quality\", int1Ref: \"M12.2\", section: \"D\", getSvg: spatialQuality,\n group: \"quality-indicators\", description: \"Meta-feature providing spatial accuracy information for features in a defined area.\",\n s52PlRef: \"SPATQL_S101\", renderSize: \"32×32\",\n colors: [{ token: \"DEPVS\", hex: \"#4a6fa5\", usage: \"Grid and text\" }],\n usageContext: \"Spatial quality allows ECDIS to communicate positional uncertainty to the mariner. This is important for passage planning near dangers where position accuracy is critical.\" },\n\n // ── Meta Features ──\n { id: \"s101-data-coverage\", label: \"Data Coverage\", int1Ref: \"M1.1\", section: \"M\", getSvg: dataCoverage,\n group: \"meta-features\", description: \"Defines the extent of data coverage and navigational purpose. Tells the system which areas contain chart data.\",\n s52PlRef: \"DATCOV_S101\", renderSize: \"32×32\",\n colors: [{ token: \"CHGRN\", hex: \"#00843d\", usage: \"Coverage grid\" }],\n usageContext: \"Data coverage boundaries are essential for ECDIS to determine when a vessel is leaving charted waters. The feature also carries scale information for automatic chart loading.\" },\n\n { id: \"s101-update-info\", label: \"Update Information\", int1Ref: \"M1.2\", section: \"M\", getSvg: updateInformation,\n group: \"meta-features\", description: \"Tracks changes applied to the dataset: insertions, modifications, and deletions for incremental updating.\",\n s52PlRef: \"UPDTIF_S101\", renderSize: \"32×32\",\n colors: [{ token: \"CHGRN\", hex: \"#00843d\", usage: \"Delta symbol\" }],\n usageContext: \"Update information features enable incremental chart updates (patches) rather than full dataset replacements. This is fundamental to S-101's efficient update mechanism.\" },\n\n { id: \"s101-text-placement\", label: \"Text Placement\", int1Ref: \"M1.3\", section: \"M\", getSvg: textPlacement,\n group: \"meta-features\", description: \"Controls label position and orientation for optimal readability, replacing S-57's limited text placement approach.\",\n s52PlRef: \"TXTPLC_S101\", renderSize: \"32×32\",\n colors: [{ token: \"CHBLK\", hex: \"#666666\", usage: \"Text indicator\" }],\n usageContext: \"Text placement features allow chart producers to specify exact label positions, preventing overlap and improving chart readability in dense areas.\" },\n];\n","// AUTO-GENERATED by scripts/gen-s52-svgs.ts — do not edit.\n// Source: packages/sdk/assets/s52/{point,pattern,line}/*.svg\n// Regenerate via: bun run gen:svgs\n\nexport const S52_POINT_SVGS: Record<string, string> = {\n \"ACHARE02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 16.1 1.0 L 16.1 30.9\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 6.8 9.9 L 24.9 9.9\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 4.0 24.8 L 10.3 31.0 L 22.1 31.0 L 28.0 25.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"ACHARE51\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 15.0 1.0 L 15.0 8.6 L 7.7 8.6 L 7.7 11.1 L 15.0 11.1 L 15.0 26.9 L 10.3 25.8 L 6.0 22.6 L 1.9 22.6 L 7.7 26.9 L 16.3 31.0 L 24.3 26.9 L 30.1 22.6 L 26.7 22.6 L 21.5 25.8 L 16.7 26.9 L 16.7 11.1 L 24.3 11.1 L 24.3 8.6 L 16.7 8.6 L 16.7 1.0 L 15.0 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"ACHBRT07\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 15.9 1.0 L 15.9 14.1\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 15.9 31.0 L 15.9 26.1\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 31.0 21.9 L 22.0 30.9 L 10.3 30.9 L 1.0 21.7\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"15.88\\\" cy=\\\"19.85\\\" r=\\\"5.99\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 6.8 10.1 L 25.5 10.1\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"ACHPNT01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 16.0 1.0 L 16.0 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 9.8 8.3 L 21.5 8.3\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 3.5 22.8 L 5.3 25.8\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 8.2 28.5 L 11.7 30.3\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 31.0 L 19.9 30.6 L 23.8 28.7 L 26.4 26.2 L 28.5 22.8\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 11.7 30.3 L 16.0 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 8.2 28.5 L 5.3 25.8\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"ACHRES51\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 15.0 1.0 L 15.0 8.6 L 7.7 8.6 L 7.7 11.1 L 15.0 11.1 L 15.0 26.9 L 10.3 25.8 L 6.0 22.6 L 1.9 22.6 L 7.7 26.9 L 16.3 31.0 L 24.3 26.9 L 30.1 22.6 L 26.7 22.6 L 21.5 25.8 L 16.7 26.9 L 16.7 11.1 L 24.3 11.1 L 24.3 8.6 L 16.7 8.6 L 16.7 1.0 L 15.0 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 26.8 5.6 L 3.7 28.8\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"ACHRES61\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 13.0 2.4 L 13.0 9.2 L 6.3 9.2 L 6.3 11.6 L 13.0 11.6 L 13.0 25.9 L 8.7 24.9 L 4.7 22.0 L 1.0 22.0 L 6.3 25.9 L 14.1 29.6 L 21.4 25.9 L 26.7 22.0 L 23.6 22.0 L 18.9 24.9 L 14.5 25.9 L 14.5 11.6 L 21.4 11.6 L 21.4 9.2 L 14.5 9.2 L 14.5 2.4 L 13.0 2.4\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 23.6 6.6 L 2.7 27.6\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 29.9 29.6 L 31.0 29.6\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 30.2 20.2 L 30.2 27.5\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"ACHRES71\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 17.4 2.5 L 17.4 9.3 L 10.8 9.3 L 10.8 11.6 L 17.4 11.6 L 17.4 25.8 L 13.1 24.9 L 9.2 21.9 L 5.5 21.9 L 10.8 25.8 L 18.6 29.5 L 25.7 25.8 L 31.0 21.9 L 27.9 21.9 L 23.2 24.9 L 18.9 25.8 L 18.9 11.6 L 25.7 11.6 L 25.7 9.3 L 18.9 9.3 L 18.9 2.5 L 17.4 2.5\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 28.0 6.6 L 7.2 27.5\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 2.9 29.2 L 2.9 24.4 L 1.0 24.4\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 29.2 L 4.9 29.2\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 2.0 21.9 L 2.0 22.7\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"AIRARE02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 11.3 24.7 L 20.1 24.7 L 17.5 21.7 L 17.5 17.9 L 27.5 17.9 L 18.3 11.8 L 18.3 7.2 L 16.1 4.8 L 13.4 7.2 L 13.4 11.8 L 4.2 17.7 L 13.6 17.8 L 13.6 21.9 L 11.3 24.7\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"AISDEF01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"9.85\\\" cy=\\\"27.40\\\" r=\\\"1.24\\\" fill=\\\"none\\\" stroke=\\\"ARPAT\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 9.8 27.4 Z\\\" fill=\\\"ARPAT\\\" />\\n <path d=\\\"M 5.0 31.0 L 14.9 31.0 L 9.7 1.0 L 4.8 30.9\\\" fill=\\\"none\\\" stroke=\\\"ARPAT\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 18.4 10.9 L 19.0 9.7 L 19.5 8.7 L 20.2 8.1 L 20.8 7.4 L 21.9 7.0 L 22.8 7.1 L 24.0 7.5 L 25.1 7.7 L 26.0 9.1 L 26.7 9.8 L 27.2 10.7 L 27.2 11.7 L 26.7 12.7 L 26.2 13.5 L 25.4 14.5 L 24.5 15.5 L 23.7 16.5 L 23.2 17.3 L 22.7 17.9 L 22.6 18.8 L 22.6 19.7 L 22.6 20.4 L 22.7 21.3 L 22.7 21.4\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 22.0 22.5 L 23.4 22.5\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"AISONE01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 22.3 L 31.0 22.3 L 15.7 9.7 L 1.0 22.3\\\" fill=\\\"none\\\" stroke=\\\"ARPAT\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"AISSIX01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 20.8 L 31.0 20.7 L 15.7 8.1 L 1.0 20.8\\\" fill=\\\"none\\\" stroke=\\\"ARPAT\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 23.9 L 31.0 23.9\\\" fill=\\\"none\\\" stroke=\\\"ARPAT\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"AISSLP01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.02\\\" cy=\\\"27.40\\\" r=\\\"1.24\\\" fill=\\\"none\\\" stroke=\\\"ARPAT\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 16.0 27.4 Z\\\" fill=\\\"ARPAT\\\" />\\n <path d=\\\"M 11.1 31.0 L 21.1 31.0 L 15.9 1.0 L 10.9 30.9\\\" fill=\\\"none\\\" stroke=\\\"ARPAT\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"AISVES01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 10.0 31.0 L 22.0 31.0 L 16.0 1.0 L 10.0 31.0\\\" fill=\\\"none\\\" stroke=\\\"ARPAT\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"16.01\\\" cy=\\\"25.01\\\" r=\\\"0.75\\\" fill=\\\"none\\\" stroke=\\\"ARPAT\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 16.0 25.0 Z\\\" fill=\\\"ARPAT\\\" />\\n</svg>\\n\",\n \"ARPATG01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"ARPAT\\\" stroke-width=\\\"1.2\\\" />\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"3.72\\\" fill=\\\"none\\\" stroke=\\\"ARPAT\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 16.0 16.0 Z\\\" fill=\\\"ARPAT\\\" />\\n</svg>\\n\",\n \"ARPONE01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 16.0 L 31.0 16.0\\\" fill=\\\"none\\\" stroke=\\\"ARPAT\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"ARPSIX01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 16.0 L 31.0 16.0\\\" fill=\\\"none\\\" stroke=\\\"ARPAT\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"BCNCAR01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 16.0 17.4 L 6.2 30.8 L 25.8 31.0 L 16.0 17.4 Z\\\" fill=\\\"CHYLW\\\" />\\n <path d=\\\"M 16.0 17.4 L 6.2 30.8 L 25.8 31.0 L 16.0 17.4\\\" fill=\\\"none\\\" stroke=\\\"CHYLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 1.0 L 25.9 14.5 L 6.4 14.5 L 16.0 1.0 Z\\\" fill=\\\"CHYLW\\\" />\\n <path d=\\\"M 16.0 1.0 L 25.9 14.5 L 6.4 14.5 L 16.0 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHYLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 1.0 L 6.1 14.5 L 25.8 14.5 L 16.0 1.0\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 6.1 30.9 L 25.8 30.9 L 16.0 17.4 L 6.1 30.9\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"BCNCAR02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 16.0 1.0 L 25.0 13.5 L 7.0 13.4 L 16.0 1.0 Z\\\" fill=\\\"CHYLW\\\" />\\n <path d=\\\"M 16.0 1.0 L 25.0 13.5 L 7.0 13.4 L 16.0 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHYLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 8.5 18.5 L 25.0 18.5 L 16.0 31.0 L 7.0 18.5 Z\\\" fill=\\\"CHYLW\\\" />\\n <path d=\\\"M 8.5 18.5 L 25.0 18.5 L 16.0 31.0 L 7.0 18.5\\\" fill=\\\"none\\\" stroke=\\\"CHYLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 1.0 L 6.9 13.5 L 25.1 13.5 L 16.0 1.0\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 6.9 18.5 L 25.1 18.5 L 16.0 31.0 L 6.9 18.5\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"BCNCAR03\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 7.9 1.0 L 25.7 1.1 L 16.0 14.5 L 6.4 1.0 Z\\\" fill=\\\"CHYLW\\\" />\\n <path d=\\\"M 7.9 1.0 L 25.7 1.1 L 16.0 14.5 L 6.4 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHYLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 7.9 17.5 L 25.7 17.5 L 16.0 31.0 L 6.3 17.5 Z\\\" fill=\\\"CHYLW\\\" />\\n <path d=\\\"M 7.9 17.5 L 25.7 17.5 L 16.0 31.0 L 6.3 17.5\\\" fill=\\\"none\\\" stroke=\\\"CHYLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 14.5 L 6.2 1.0 L 25.8 1.0 L 16.0 14.5\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 6.2 17.5 L 25.8 17.5 L 16.0 31.0 L 6.2 17.5\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"BCNCAR04\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 16.0 17.5 L 6.3 31.0 L 25.7 31.0 L 16.0 17.5 Z\\\" fill=\\\"CHYLW\\\" />\\n <path d=\\\"M 16.0 17.5 L 6.3 31.0 L 25.7 31.0 L 16.0 17.5\\\" fill=\\\"none\\\" stroke=\\\"CHYLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 7.9 1.0 L 25.7 1.0 L 16.0 14.5 L 6.2 1.0 Z\\\" fill=\\\"CHYLW\\\" />\\n <path d=\\\"M 7.9 1.0 L 25.7 1.0 L 16.0 14.5 L 6.2 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHYLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 6.2 31.0 L 25.8 31.0 L 16.0 17.5 L 6.2 31.0\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 14.5 L 6.2 1.0 L 25.8 1.0 L 16.0 14.5\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"BCNDEF13\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 18.5 8.7 L 19.2 7.1 L 20.0 5.7 L 21.0 4.8 L 21.9 3.8 L 23.4 3.3 L 24.7 3.5 L 26.4 4.0 L 28.0 4.4 L 29.3 6.3 L 30.3 7.4 L 31.0 8.7 L 30.9 10.1 L 30.3 11.4 L 29.5 12.6 L 28.3 14.0 L 27.0 15.4 L 25.8 16.9 L 25.0 17.9 L 24.4 18.9 L 24.2 20.1 L 24.2 21.4 L 24.2 22.3 L 24.2 23.6 L 24.2 23.6\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 22.8 28.7 L 25.8 28.7\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 4.2 L 1.0 26.9 L 12.4 26.9 L 12.4 4.3 L 1.0 4.2 Z\\\" fill=\\\"CHGRD\\\" />\\n <path d=\\\"M 1.0 4.2 L 1.0 26.9 L 12.4 26.9 L 12.4 4.3 L 1.0 4.2\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 4.2 L 1.0 26.9 L 12.4 26.9 L 12.4 4.3 L 1.0 4.2\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"6.86\\\" cy=\\\"15.72\\\" r=\\\"0.85\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 6.9 15.7 Z\\\" fill=\\\"OUTLW\\\" />\\n</svg>\\n\",\n \"BCNGEN01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 11.6 26.8 L 11.6 1.0 L 20.0 1.0 L 20.0 27.2 L 19.4 25.8 L 19.3 24.7 L 18.9 24.3 L 17.6 23.7 L 16.5 23.4 L 16.2 23.2 L 15.1 23.4 L 14.5 23.4 L 13.8 23.7 L 13.3 24.5 L 12.7 25.3 L 12.0 25.8 L 11.6 26.6 L 11.6 27.2 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 11.6 26.8 L 11.6 1.0 L 20.0 1.0 L 20.0 27.2 L 19.4 25.8 L 19.3 24.7 L 18.9 24.3 L 17.6 23.7 L 16.5 23.4 L 16.2 23.2 L 15.1 23.4 L 14.5 23.4 L 13.8 23.7 L 13.3 24.5 L 12.7 25.3 L 12.0 25.8 L 11.6 26.6 L 11.6 27.2\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"16.00\\\" cy=\\\"27.21\\\" r=\\\"3.79\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 7.3 27.2 L 12.2 27.2\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 19.8 27.2 L 24.7 27.2\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"BCNGEN03\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 19.9 9.1 L 20.5 7.7 L 21.2 6.4 L 22.0 5.6 L 22.9 4.7 L 24.2 4.3 L 25.4 4.4 L 26.9 4.8 L 28.3 5.1 L 29.5 6.8 L 30.4 7.8 L 31.0 8.9 L 31.0 10.2 L 30.4 11.4 L 29.7 12.5 L 28.7 13.7 L 27.6 14.9 L 26.5 16.3 L 25.8 17.2 L 25.3 18.1 L 25.2 19.2 L 25.2 20.4 L 25.2 21.2 L 25.3 22.3 L 25.3 22.4\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 24.2 26.8 L 26.9 26.8\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 23.0 L 17.1 23.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"8.59\\\" cy=\\\"25.92\\\" r=\\\"2.73\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 8.5 22.9 L 8.4 3.4\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"BCNISD21\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.06\\\" cy=\\\"7.07\\\" r=\\\"6.07\\\" fill=\\\"none\\\" stroke=\\\"CHRED\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 16.1 7.1 Z\\\" fill=\\\"CHRED\\\" />\\n <circle cx=\\\"15.94\\\" cy=\\\"24.93\\\" r=\\\"6.07\\\" fill=\\\"none\\\" stroke=\\\"CHRED\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 15.9 24.9 Z\\\" fill=\\\"CHRED\\\" />\\n <circle cx=\\\"16.06\\\" cy=\\\"7.07\\\" r=\\\"6.07\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" />\\n <circle cx=\\\"15.94\\\" cy=\\\"24.93\\\" r=\\\"6.07\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" />\\n</svg>\\n\",\n \"BCNLAT15\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 8.5 31.0 L 23.5 31.0 L 23.5 1.0 L 8.5 1.0 L 8.5 31.0 Z\\\" fill=\\\"CHRED\\\" />\\n <path d=\\\"M 8.5 31.0 L 23.5 31.0 L 23.5 1.0 L 8.5 1.0 L 8.5 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHRED\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 8.5 31.0 L 23.5 31.0 L 23.5 1.0 L 8.5 1.0 L 8.5 31.0\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"1.13\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 16.0 16.0 Z\\\" fill=\\\"OUTLW\\\" />\\n</svg>\\n\",\n \"BCNLAT16\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 8.5 31.0 L 23.5 31.0 L 23.5 1.0 L 8.5 1.0 L 8.5 31.0 Z\\\" fill=\\\"CHGRN\\\" />\\n <path d=\\\"M 8.5 31.0 L 23.5 31.0 L 23.5 1.0 L 8.5 1.0 L 8.5 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRN\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 8.5 31.0 L 23.5 31.0 L 23.5 1.0 L 8.5 1.0 L 8.5 31.0\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"1.13\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 16.0 16.0 Z\\\" fill=\\\"OUTLW\\\" />\\n</svg>\\n\",\n \"BCNLAT21\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 12.0 31.0 L 12.0 1.0 L 20.0 1.0 L 20.0 31.0 L 12.0 31.0 Z\\\" fill=\\\"CHRED\\\" />\\n <path d=\\\"M 12.0 31.0 L 12.0 1.0 L 20.0 1.0 L 20.0 31.0 L 12.0 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHRED\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 12.0 31.0 L 12.0 1.0 L 20.0 1.0 L 20.0 31.0 L 12.0 31.0\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"15.97\\\" cy=\\\"16.06\\\" r=\\\"0.90\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 16.0 16.1 Z\\\" fill=\\\"OUTLW\\\" />\\n</svg>\\n\",\n \"BCNLAT22\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 12.0 31.0 L 12.0 1.0 L 20.0 1.0 L 20.0 31.0 L 12.0 31.0 Z\\\" fill=\\\"CHGRN\\\" />\\n <path d=\\\"M 12.0 31.0 L 12.0 1.0 L 20.0 1.0 L 20.0 31.0 L 12.0 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRN\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 12.0 31.0 L 12.0 1.0 L 20.0 1.0 L 20.0 31.0 L 12.0 31.0\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"15.97\\\" cy=\\\"16.06\\\" r=\\\"0.90\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 16.0 16.1 Z\\\" fill=\\\"OUTLW\\\" />\\n</svg>\\n\",\n \"BCNLTC01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"27.06\\\" r=\\\"3.94\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 1.5 27.1 L 11.8 27.1\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 19.6 27.1 L 30.5 27.1\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 4.4 27.1 L 10.2 1.0 L 21.8 1.0 L 27.6 27.1\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 5.1 22.7 L 24.9 15.1\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 7.1 15.1 L 26.5 22.5\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 9.6 3.5 L 23.8 10.6\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 21.8 3.9 L 7.8 10.7\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"BCNSAW13\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 8.5 31.0 L 23.5 31.0 L 23.5 1.0 L 8.5 1.0 L 8.5 31.0 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 8.5 31.0 L 23.5 31.0 L 23.5 1.0 L 8.5 1.0 L 8.5 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 8.5 31.0 L 23.5 31.0 L 23.5 1.0 L 8.5 1.0 L 8.5 31.0\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"1.13\\\" fill=\\\"none\\\" stroke=\\\"DEPVS\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 16.0 16.0 Z\\\" fill=\\\"DEPVS\\\" />\\n</svg>\\n\",\n \"BCNSAW21\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 12.0 31.0 L 12.0 1.0 L 20.0 1.0 L 20.0 31.0 L 12.0 31.0 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 12.0 31.0 L 12.0 1.0 L 20.0 1.0 L 20.0 31.0 L 12.0 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 12.0 31.0 L 12.0 1.0 L 20.0 1.0 L 20.0 31.0 L 12.0 31.0\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"15.97\\\" cy=\\\"16.06\\\" r=\\\"0.90\\\" fill=\\\"none\\\" stroke=\\\"DEPVS\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 16.0 16.1 Z\\\" fill=\\\"DEPVS\\\" />\\n</svg>\\n\",\n \"BCNSPP13\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 8.5 31.0 L 23.5 31.0 L 23.5 1.0 L 8.5 1.0 L 8.5 31.0 Z\\\" fill=\\\"CHYLW\\\" />\\n <path d=\\\"M 8.5 31.0 L 23.5 31.0 L 23.5 1.0 L 8.5 1.0 L 8.5 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHYLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 8.5 31.0 L 23.5 31.0 L 23.5 1.0 L 8.5 1.0 L 8.5 31.0\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"1.13\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 16.0 16.0 Z\\\" fill=\\\"OUTLW\\\" />\\n</svg>\\n\",\n \"BCNSPP21\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 12.0 31.0 L 12.0 1.0 L 20.0 1.0 L 20.0 31.0 L 12.0 31.0 Z\\\" fill=\\\"CHYLW\\\" />\\n <path d=\\\"M 12.0 31.0 L 12.0 1.0 L 20.0 1.0 L 20.0 31.0 L 12.0 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHYLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 12.0 31.0 L 12.0 1.0 L 20.0 1.0 L 20.0 31.0 L 12.0 31.0\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"15.97\\\" cy=\\\"16.06\\\" r=\\\"0.90\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 16.0 16.1 Z\\\" fill=\\\"OUTLW\\\" />\\n</svg>\\n\",\n \"BCNSTK02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 7.7 31.0 L 24.3 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.3 1.0 L 16.3 30.9\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"BCNTOW01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"26.96\\\" r=\\\"4.04\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 1.6 27.0 L 12.0 27.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 19.8 27.0 L 30.4 27.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 4.5 27.0 L 10.2 1.0 L 21.8 1.0 L 27.5 27.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"BLKADJ01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 1.0 L 31.0 1.0 L 31.0 31.0 L 1.0 31.0 L 1.0 1.0 Z\\\" fill=\\\"BKAJ1\\\" />\\n <path d=\\\"M 1.0 1.0 L 31.0 1.0 L 31.0 31.0 L 1.0 31.0 L 1.0 1.0\\\" fill=\\\"none\\\" stroke=\\\"BKAJ1\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 7.2 6.9 L 25.2 6.9 L 25.2 24.9 L 7.2 24.9 L 7.2 6.9 Z\\\" fill=\\\"BKAJ2\\\" />\\n <path d=\\\"M 7.2 6.9 L 25.2 6.9 L 25.2 24.9 L 7.2 24.9 L 7.2 6.9\\\" fill=\\\"none\\\" stroke=\\\"BKAJ2\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"BOYBAR01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"18.32\\\" cy=\\\"24.29\\\" r=\\\"2.44\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 3.7 24.3 L 3.7 16.7 L 4.2 13.6 L 5.9 10.1\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 8.1 8.0 L 10.3 6.7 L 13.0 5.8 L 15.1 5.3 L 17.3 5.3 L 19.8 5.8 L 22.7 7.5 L 24.9 8.9 L 26.1 10.4 L 27.3 12.8 L 28.1 15.0 L 28.3 16.7 L 28.3 24.3\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 7.3 8.4 L 9.0 11.1 L 10.8 13.6 L 11.7 16.2 L 12.5 19.9 L 13.0 22.1 L 13.0 24.3\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 20.5 24.3 L 31.0 24.3\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 5.9 10.1 L 8.1 8.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 15.6 24.3 L 1.0 24.3\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"BOYCAN01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"15.03\\\" cy=\\\"22.72\\\" r=\\\"2.87\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 1.0 22.7 L 12.1 22.7\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 17.6 22.7 L 28.7 22.7\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 3.3 22.7 L 7.9 6.4 L 31.0 6.4 L 26.4 22.7\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"BOYCAR01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 20.2 18.2 L 20.2 30.9 L 5.9 31.0 L 20.2 18.2 Z\\\" fill=\\\"CHYLW\\\" />\\n <path d=\\\"M 20.2 18.2 L 20.2 30.9 L 5.9 31.0 L 20.2 18.2\\\" fill=\\\"none\\\" stroke=\\\"CHYLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 11.2 14.7 L 26.1 14.7 L 26.1 1.0 L 11.2 14.7 Z\\\" fill=\\\"CHYLW\\\" />\\n <path d=\\\"M 11.2 14.7 L 26.1 14.7 L 26.1 1.0 L 11.2 14.7\\\" fill=\\\"none\\\" stroke=\\\"CHYLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 11.2 14.7 L 26.1 14.7 L 26.1 1.1 L 11.2 14.7\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 20.2 18.0 L 20.2 31.0 L 5.9 31.0 L 20.2 18.0\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"BOYCAR02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 10.2 13.5 L 24.3 13.4 L 24.2 1.0 L 10.2 13.5 Z\\\" fill=\\\"CHYLW\\\" />\\n <path d=\\\"M 10.2 13.5 L 24.3 13.4 L 24.2 1.0 L 10.2 13.5\\\" fill=\\\"none\\\" stroke=\\\"CHYLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 7.7 18.5 L 21.6 18.5 L 7.7 31.0 L 7.7 18.5 Z\\\" fill=\\\"CHYLW\\\" />\\n <path d=\\\"M 7.7 18.5 L 21.6 18.5 L 7.7 31.0 L 7.7 18.5\\\" fill=\\\"none\\\" stroke=\\\"CHYLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 7.7 18.5 L 21.7 18.5 L 7.7 31.0 L 7.7 18.5\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 10.2 13.5 L 24.3 13.5 L 24.3 1.0 L 10.2 13.5\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"BOYCAR03\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 12.7 1.0 L 26.2 1.0 L 11.0 14.3 L 11.0 1.0 Z\\\" fill=\\\"CHYLW\\\" />\\n <path d=\\\"M 12.7 1.0 L 26.2 1.0 L 11.0 14.3 L 11.0 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHYLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 7.3 17.5 L 20.8 17.5 L 5.8 30.9 L 5.8 17.5 Z\\\" fill=\\\"CHYLW\\\" />\\n <path d=\\\"M 7.3 17.5 L 20.8 17.5 L 5.8 30.9 L 5.8 17.5\\\" fill=\\\"none\\\" stroke=\\\"CHYLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 5.8 17.5 L 20.8 17.5 L 5.8 31.0 L 5.8 17.5\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 11.0 1.0 L 26.2 1.0 L 11.0 14.3\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 11.0 1.0 L 11.0 14.3\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"BOYCAR04\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 16.1 14.5 L 16.1 1.0 L 30.8 1.0 L 16.1 14.5 Z\\\" fill=\\\"CHYLW\\\" />\\n <path d=\\\"M 16.1 14.5 L 16.1 1.0 L 30.8 1.0 L 16.1 14.5\\\" fill=\\\"none\\\" stroke=\\\"CHYLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.1 17.5 L 16.1 31.0 L 1.4 31.0 L 16.1 17.5 Z\\\" fill=\\\"CHYLW\\\" />\\n <path d=\\\"M 16.1 17.5 L 16.1 31.0 L 1.4 31.0 L 16.1 17.5\\\" fill=\\\"none\\\" stroke=\\\"CHYLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.1 17.5 L 16.1 31.0 L 1.1 31.0 L 16.1 17.5\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.1 1.0 L 16.1 14.5 L 30.9 1.0 L 16.1 1.0\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"BOYCON01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.03\\\" cy=\\\"25.97\\\" r=\\\"2.92\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 4.3 26.0 L 4.9 21.2 L 5.9 17.3 L 7.4 14.4 L 9.5 11.3 L 11.3 9.0 L 13.9 6.7 L 17.3 4.7 L 19.9 3.1 L 20.9 4.7 L 23.0 8.5 L 25.2 13.4 L 25.9 16.8\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 26.0 L 13.2 26.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 25.9 16.8 L 26.6 21.2 L 26.9 26.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 18.6 26.0 L 31.0 26.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"BOYDEF03\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 21.8 10.8 L 22.4 9.6 L 22.9 8.6 L 23.6 7.9 L 24.3 7.2 L 25.4 6.8 L 26.4 6.9 L 27.6 7.2 L 28.8 7.5 L 29.8 8.9 L 30.5 9.7 L 31.0 10.6 L 31.0 11.7 L 30.5 12.7 L 30.0 13.5 L 29.1 14.5 L 28.2 15.6 L 27.3 16.6 L 26.8 17.4 L 26.3 18.1 L 26.2 19.1 L 26.2 20.0 L 26.2 20.7 L 26.3 21.6 L 26.3 21.7\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 25.4 25.2 L 27.6 25.2\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"9.45\\\" cy=\\\"16.19\\\" r=\\\"8.45\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 9.4 16.2 Z\\\" fill=\\\"CHGRD\\\" />\\n <circle cx=\\\"9.45\\\" cy=\\\"16.19\\\" r=\\\"8.45\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" />\\n <circle cx=\\\"9.45\\\" cy=\\\"16.19\\\" r=\\\"0.62\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 9.4 16.2 Z\\\" fill=\\\"OUTLW\\\" />\\n</svg>\\n\",\n \"BOYGEN03\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 22.4 10.5 L 22.9 9.4 L 23.4 8.4 L 24.1 7.7 L 24.7 7.1 L 25.7 6.7 L 26.6 6.8 L 27.8 7.1 L 28.9 7.4 L 29.8 8.7 L 30.5 9.5 L 31.0 10.3 L 31.0 11.3 L 30.5 12.2 L 30.0 13.1 L 29.2 14.0 L 28.3 15.0 L 27.5 16.0 L 27.0 16.7 L 26.6 17.4 L 26.5 18.3 L 26.5 19.2 L 26.5 19.8 L 26.6 20.7 L 26.6 20.8\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 25.7 24.1 L 27.8 24.1\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"11.24\\\" cy=\\\"14.16\\\" r=\\\"6.78\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" />\\n <circle cx=\\\"11.31\\\" cy=\\\"23.14\\\" r=\\\"2.16\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 13.5 23.1 L 21.6 23.1\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 23.1 L 9.1 23.1\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"BOYINB01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.02\\\" cy=\\\"22.46\\\" r=\\\"2.28\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" />\\n <circle cx=\\\"16.02\\\" cy=\\\"9.75\\\" r=\\\"2.49\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 1.0 22.5 L 13.6 22.5\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 18.1 22.5 L 31.0 22.5\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 2.6 22.5 L 6.0 12.5 L 26.0 12.5 L 29.4 22.5\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"BOYISD12\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 27.0 L 12.5 27.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" />\\n <path d=\\\"M 19.5 27.0 L 31.0 27.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" />\\n <path d=\\\"M 10.5 27.0 L 12.5 15.0 L 19.5 15.0 L 21.5 27.0 Z\\\" fill=\\\"CHBLK\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linejoin=\\\"round\\\" />\\n <rect x=\\\"11.4\\\" y=\\\"19.0\\\" width=\\\"9.2\\\" height=\\\"3.5\\\" fill=\\\"LITRD\\\" />\\n <line x1=\\\"16\\\" y1=\\\"15.0\\\" x2=\\\"16\\\" y2=\\\"11.0\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" />\\n <circle cx=\\\"16\\\" cy=\\\"8.5\\\" r=\\\"2.0\\\" fill=\\\"CHBLK\\\" />\\n <circle cx=\\\"16\\\" cy=\\\"3.5\\\" r=\\\"2.0\\\" fill=\\\"CHBLK\\\" />\\n</svg>\\n\",\n \"BOYLAT13\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 30.8 31.0 L 30.8 1.0 L 1.2 31.0 L 30.8 31.0 Z\\\" fill=\\\"CHGRN\\\" />\\n <path d=\\\"M 30.8 31.0 L 30.8 1.0 L 1.2 31.0 L 30.8 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRN\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 30.8 31.0 L 30.8 1.0 L 1.2 31.0 L 30.8 31.0\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"22.32\\\" cy=\\\"21.30\\\" r=\\\"1.03\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 22.3 21.3 Z\\\" fill=\\\"OUTLW\\\" />\\n</svg>\\n\",\n \"BOYLAT14\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 30.8 31.0 L 30.8 1.0 L 1.2 31.0 L 30.8 31.0 Z\\\" fill=\\\"CHRED\\\" />\\n <path d=\\\"M 30.8 31.0 L 30.8 1.0 L 1.2 31.0 L 30.8 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHRED\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 30.8 31.0 L 30.8 1.0 L 1.2 31.0 L 30.8 31.0\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"22.32\\\" cy=\\\"21.30\\\" r=\\\"1.03\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 22.3 21.3 Z\\\" fill=\\\"OUTLW\\\" />\\n</svg>\\n\",\n \"BOYLAT23\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 27.3 L 9.6 4.7 L 31.0 4.7 L 23.8 27.3 L 1.0 27.3 Z\\\" fill=\\\"CHGRN\\\" />\\n <path d=\\\"M 1.0 27.3 L 9.6 4.7 L 31.0 4.7 L 23.8 27.3 L 1.0 27.3\\\" fill=\\\"none\\\" stroke=\\\"CHGRN\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 27.3 L 9.6 4.7 L 31.0 4.7 L 23.8 27.3 L 1.0 27.3\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"16.63\\\" cy=\\\"15.52\\\" r=\\\"0.85\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 16.6 15.5 Z\\\" fill=\\\"OUTLW\\\" />\\n</svg>\\n\",\n \"BOYLAT24\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 27.4 L 9.6 4.7 L 31.0 4.6 L 23.8 27.3 L 1.0 27.4 Z\\\" fill=\\\"CHRED\\\" />\\n <path d=\\\"M 1.0 27.4 L 9.6 4.7 L 31.0 4.6 L 23.8 27.3 L 1.0 27.4\\\" fill=\\\"none\\\" stroke=\\\"CHRED\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 27.4 L 9.6 4.7 L 31.0 4.6 L 23.8 27.3 L 1.0 27.4\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"16.63\\\" cy=\\\"15.49\\\" r=\\\"0.85\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 16.6 15.5 Z\\\" fill=\\\"OUTLW\\\" />\\n</svg>\\n\",\n \"BOYLAT50\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 27.4 L 9.6 4.7 L 31.0 4.6 L 23.8 27.3 L 1.0 27.4 Z\\\" fill=\\\"CHRED\\\" />\\n <path d=\\\"M 1.0 27.4 L 9.6 4.7 L 31.0 4.6 L 23.8 27.3 L 1.0 27.4\\\" fill=\\\"none\\\" stroke=\\\"CHRED\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 27.4 L 9.6 4.7 L 31.0 4.6 L 23.8 27.3 L 1.0 27.4\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"16.63\\\" cy=\\\"15.49\\\" r=\\\"0.85\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 16.6 15.5 Z\\\" fill=\\\"OUTLW\\\" />\\n</svg>\\n\",\n \"BOYLAT51\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 30.8 31.0 L 30.8 1.0 L 1.2 31.0 L 30.8 31.0 Z\\\" fill=\\\"CHGRN\\\" />\\n <path d=\\\"M 30.8 31.0 L 30.8 1.0 L 1.2 31.0 L 30.8 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRN\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 30.8 31.0 L 30.8 1.0 L 1.2 31.0 L 30.8 31.0\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"22.32\\\" cy=\\\"21.30\\\" r=\\\"1.03\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 22.3 21.3 Z\\\" fill=\\\"OUTLW\\\" />\\n</svg>\\n\",\n \"BOYMOR01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"17.97\\\" cy=\\\"27.31\\\" r=\\\"2.95\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" />\\n <circle cx=\\\"15.75\\\" cy=\\\"4.93\\\" r=\\\"3.20\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 20.4 27.3 L 31.0 27.3\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 14.8 27.3 L 1.0 27.3\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 28.3 27.3 L 28.3 20.9\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 3.2 27.3 L 3.2 20.9 L 3.5 18.5 L 4.4 15.5 L 5.9 13.0 L 7.1 11.8 L 9.0 10.2 L 11.1 9.2 L 13.1 8.6 L 15.8 8.2 L 18.1 8.5 L 20.7 9.4 L 23.2 10.7 L 25.1 12.4 L 26.8 14.9 L 27.8 17.3 L 28.3 19.7 L 28.3 20.9\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 7.1 11.8 L 9.0 14.5\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 11.2 19.0 L 12.2 23.0 L 12.4 25.4 L 12.6 27.3\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 9.0 14.5 L 11.2 19.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"BOYMOR03\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"14.88\\\" cy=\\\"26.37\\\" r=\\\"3.17\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" />\\n <circle cx=\\\"19.41\\\" cy=\\\"6.11\\\" r=\\\"3.65\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 1.0 26.4 L 11.5 26.4\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 17.8 26.4 L 28.7 26.4\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 3.3 26.4 L 7.9 10.2 L 31.0 10.2 L 26.6 26.4\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"BOYMOR11\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.30\\\" cy=\\\"11.89\\\" r=\\\"2.81\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 16.3 11.9 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 1.0 22.9 L 3.6 15.1 L 28.4 15.1 L 31.0 22.9 L 1.0 22.9 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 1.0 22.9 L 3.6 15.1 L 28.4 15.1 L 31.0 22.9 L 1.0 22.9\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"BOYPIL01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.43\\\" cy=\\\"25.37\\\" r=\\\"2.96\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 1.0 25.4 L 13.6 25.4\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 19.1 25.4 L 31.0 25.4\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 4.3 25.4 L 15.3 13.6 L 18.6 3.7 L 23.5 3.7 L 23.5 15.6 L 28.2 25.4\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"BOYSAW12\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 27.0 L 12.5 27.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" />\\n <path d=\\\"M 19.5 27.0 L 31.0 27.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" />\\n <path d=\\\"M 10.5 27.0 L 12.5 14.0 L 19.5 14.0 L 21.5 27.0 Z\\\" fill=\\\"LITWT\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linejoin=\\\"round\\\" />\\n <rect x=\\\"13.2\\\" y=\\\"14.0\\\" width=\\\"2.0\\\" height=\\\"13.0\\\" fill=\\\"LITRD\\\" />\\n <rect x=\\\"16.8\\\" y=\\\"14.0\\\" width=\\\"2.0\\\" height=\\\"13.0\\\" fill=\\\"LITRD\\\" />\\n <line x1=\\\"16\\\" y1=\\\"14.0\\\" x2=\\\"16\\\" y2=\\\"8.0\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" />\\n <circle cx=\\\"16\\\" cy=\\\"5.5\\\" r=\\\"2.5\\\" fill=\\\"LITRD\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.6\\\" />\\n</svg>\\n\",\n \"BOYSPH01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"15.76\\\" cy=\\\"26.22\\\" r=\\\"2.81\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 18.7 26.2 L 31.0 26.2\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 4.1 26.2 L 2.6 22.6 L 2.2 19.6 L 1.8 16.4 L 2.5 12.9 L 3.5 10.5 L 5.3 8.1 L 7.3 6.1 L 9.8 4.5 L 12.1 3.7 L 14.9 3.0 L 17.9 3.0 L 20.9 3.7 L 24.2 5.1 L 26.4 6.8 L 27.9 9.0 L 29.7 11.8 L 30.7 14.6 L 30.8 17.7 L 30.5 21.5 L 29.4 24.2 L 28.3 26.2\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 26.2 L 12.9 26.2\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"BOYSPP11\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"CHYLW\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 16.0 16.0 Z\\\" fill=\\\"CHYLW\\\" />\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" />\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"1.13\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 16.0 16.0 Z\\\" fill=\\\"OUTLW\\\" />\\n</svg>\\n\",\n \"BOYSPP15\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 30.8 31.0 L 30.8 1.0 L 1.2 31.0 L 30.8 31.0 Z\\\" fill=\\\"CHYLW\\\" />\\n <path d=\\\"M 30.8 31.0 L 30.8 1.0 L 1.2 31.0 L 30.8 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHYLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 30.8 31.0 L 30.8 1.0 L 1.2 31.0 L 30.8 31.0\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"20.95\\\" cy=\\\"21.30\\\" r=\\\"1.03\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 21.0 21.3 Z\\\" fill=\\\"OUTLW\\\" />\\n</svg>\\n\",\n \"BOYSPP25\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 27.4 L 9.6 4.7 L 31.0 4.6 L 23.8 27.3 L 1.0 27.4 Z\\\" fill=\\\"CHYLW\\\" />\\n <path d=\\\"M 1.0 27.4 L 9.6 4.7 L 31.0 4.6 L 23.8 27.3 L 1.0 27.4\\\" fill=\\\"none\\\" stroke=\\\"CHYLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 27.4 L 9.6 4.7 L 31.0 4.6 L 23.8 27.3 L 1.0 27.4\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"16.63\\\" cy=\\\"15.49\\\" r=\\\"0.85\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 16.6 15.5 Z\\\" fill=\\\"OUTLW\\\" />\\n</svg>\\n\",\n \"BOYSPR01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 12.5 27.4 L 18.8 1.0 L 24.8 1.0 L 19.3 24.9 L 18.1 24.5 L 17.5 24.1 L 16.4 23.9 L 15.1 24.3 L 12.4 27.4 L 14.1 24.7 L 13.5 25.1 L 12.5 27.4 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 12.5 27.4 L 18.8 1.0 L 24.8 1.0 L 19.3 24.9 L 18.1 24.5 L 17.5 24.1 L 16.4 23.9 L 15.1 24.3 L 12.4 27.4 L 14.1 24.7 L 13.5 25.1 L 12.5 27.4\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"16.21\\\" cy=\\\"27.40\\\" r=\\\"3.60\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 7.2 27.4 L 12.5 27.4\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 19.5 27.4 L 24.8 27.4\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"BOYSUP01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.02\\\" cy=\\\"23.18\\\" r=\\\"2.28\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 1.0 23.2 L 13.6 23.2\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 18.1 23.2 L 31.0 23.2\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 2.6 23.2 L 6.0 13.2 L 26.0 13.2 L 29.4 23.2\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 13.2 L 16.0 6.5\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"BOYSUP02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.1 25.3 L 4.9 14.1 L 27.2 14.1 L 31.0 25.3\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.1 14.1 L 16.1 6.7\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 25.2 L 4.9 14.0 L 27.2 14.1 L 31.0 25.2 L 1.0 25.2 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 1.0 25.2 L 4.9 14.0 L 27.2 14.1 L 31.0 25.2 L 1.0 25.2\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"BOYSUP03\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.12\\\" cy=\\\"24.98\\\" r=\\\"2.07\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 16.1 9.9 L 16.1 5.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 12.7 6.6 L 19.3 9.9\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 12.7 9.9 L 19.3 6.6\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 25.0 L 14.0 25.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 18.0 25.0 L 31.0 25.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 2.6 25.0 L 6.0 14.9 L 26.0 14.9 L 29.4 25.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.1 14.9 L 16.1 8.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"BRIDGE01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <line x1=\\\"4\\\" y1=\\\"14\\\" x2=\\\"28\\\" y2=\\\"14\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"2\\\" />\\n <line x1=\\\"8\\\" y1=\\\"14\\\" x2=\\\"8\\\" y2=\\\"24\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.8\\\" />\\n <line x1=\\\"24\\\" y1=\\\"14\\\" x2=\\\"24\\\" y2=\\\"24\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.8\\\" />\\n <path d=\\\"M8,14 Q16,6 24,14\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.5\\\" />\\n</svg>\\n\",\n \"BRIDGE02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <line x1=\\\"4\\\" y1=\\\"14\\\" x2=\\\"28\\\" y2=\\\"14\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"2\\\" />\\n <line x1=\\\"8\\\" y1=\\\"14\\\" x2=\\\"8\\\" y2=\\\"24\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.8\\\" />\\n <line x1=\\\"24\\\" y1=\\\"14\\\" x2=\\\"24\\\" y2=\\\"24\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.8\\\" />\\n <path d=\\\"M8,14 Q16,6 24,14\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.5\\\" stroke-dasharray=\\\"3,2\\\" />\\n</svg>\\n\",\n \"BRIDGE03\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <line x1=\\\"4\\\" y1=\\\"14\\\" x2=\\\"28\\\" y2=\\\"14\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"2\\\" />\\n <line x1=\\\"8\\\" y1=\\\"14\\\" x2=\\\"8\\\" y2=\\\"24\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.8\\\" />\\n <line x1=\\\"24\\\" y1=\\\"14\\\" x2=\\\"24\\\" y2=\\\"24\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.8\\\" />\\n <circle cx=\\\"16\\\" cy=\\\"14\\\" r=\\\"3\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.5\\\" />\\n <circle cx=\\\"16\\\" cy=\\\"14\\\" r=\\\"1\\\" fill=\\\"TRFCD\\\" />\\n</svg>\\n\",\n \"BRIDGE04\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <line x1=\\\"4\\\" y1=\\\"16\\\" x2=\\\"28\\\" y2=\\\"16\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"2\\\" />\\n <line x1=\\\"8\\\" y1=\\\"16\\\" x2=\\\"8\\\" y2=\\\"24\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.8\\\" />\\n <line x1=\\\"24\\\" y1=\\\"16\\\" x2=\\\"24\\\" y2=\\\"24\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.8\\\" />\\n <line x1=\\\"12\\\" y1=\\\"16\\\" x2=\\\"12\\\" y2=\\\"6\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.5\\\" />\\n <polygon points=\\\"12,4 9,8 15,8\\\" fill=\\\"TRFCD\\\" />\\n <line x1=\\\"20\\\" y1=\\\"16\\\" x2=\\\"20\\\" y2=\\\"6\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.5\\\" />\\n <polygon points=\\\"20,4 17,8 23,8\\\" fill=\\\"TRFCD\\\" />\\n</svg>\\n\",\n \"BRIDGE05\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <line x1=\\\"4\\\" y1=\\\"14\\\" x2=\\\"28\\\" y2=\\\"14\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"2\\\" />\\n <line x1=\\\"8\\\" y1=\\\"14\\\" x2=\\\"8\\\" y2=\\\"24\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.8\\\" />\\n <line x1=\\\"24\\\" y1=\\\"14\\\" x2=\\\"24\\\" y2=\\\"24\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.8\\\" />\\n <line x1=\\\"14\\\" y1=\\\"14\\\" x2=\\\"20\\\" y2=\\\"6\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"2\\\" />\\n <circle cx=\\\"14\\\" cy=\\\"14\\\" r=\\\"1.5\\\" fill=\\\"TRFCD\\\" />\\n</svg>\\n\",\n \"BRTHNO01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" />\\n</svg>\\n\",\n \"BUAARE02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 16.0 16.0 Z\\\" fill=\\\"LANDF\\\" />\\n</svg>\\n\",\n \"BUIREL01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 8.5 1.0 L 23.5 1.0 L 16.0 8.5 L 8.5 1.0 Z\\\" fill=\\\"LANDF\\\" />\\n <path d=\\\"M 8.5 1.0 L 23.5 1.0 L 16.0 8.5 L 8.5 1.0\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 31.0 8.5 L 31.0 23.5 L 23.5 16.0 L 31.0 8.5 Z\\\" fill=\\\"LANDF\\\" />\\n <path d=\\\"M 31.0 8.5 L 31.0 23.5 L 23.5 16.0 L 31.0 8.5\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 8.5 31.0 L 23.5 31.0 L 16.0 23.5 L 8.5 31.0 Z\\\" fill=\\\"LANDF\\\" />\\n <path d=\\\"M 8.5 31.0 L 23.5 31.0 L 16.0 23.5 L 8.5 31.0\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 8.5 L 1.0 23.5 L 8.5 16.0 L 1.0 8.5 Z\\\" fill=\\\"LANDF\\\" />\\n <path d=\\\"M 1.0 8.5 L 1.0 23.5 L 8.5 16.0 L 1.0 8.5\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 8.5 16.0 L 23.5 16.0\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 8.5 L 16.0 23.5\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 8.5 1.0 L 23.5 1.0 L 16.0 8.5 L 8.5 1.0\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 31.0 8.5 L 31.0 23.5 L 23.5 16.0 L 31.0 8.5\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 23.5 31.0 L 8.5 31.0 L 16.0 23.5 L 23.5 31.0\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 8.5 L 1.0 23.5 L 8.5 16.0 L 1.0 8.5\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"BUIREL04\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 8.6 L 31.0 23.4\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 23.4 L 31.0 8.6\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 4.8 10.3 L 27.1 10.3 L 27.1 21.7 L 4.8 21.7 L 4.8 10.3\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"BUIREL05\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 4.8 1.0 L 6.5 3.2 L 8.4 4.9 L 10.6 6.0 L 12.8 6.9 L 15.2 7.2 L 17.1 7.1 L 19.1 6.9 L 21.3 6.2 L 23.0 5.1 L 24.5 4.2 L 25.8 2.8 L 26.7 1.7 L 27.2 1.0\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"16.48\\\" cy=\\\"24.63\\\" r=\\\"6.37\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 16.5 17.9 L 16.5 7.1\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"16.61\\\" cy=\\\"24.56\\\" r=\\\"1.29\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 16.6 24.6 Z\\\" fill=\\\"LANDF\\\" />\\n</svg>\\n\",\n \"BUIREL13\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 8.5 1.0 L 23.5 1.0 L 16.0 8.5 L 8.5 1.0 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 8.5 1.0 L 23.5 1.0 L 16.0 8.5 L 8.5 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 31.0 8.5 L 31.0 23.5 L 23.5 16.0 L 31.0 8.5 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 31.0 8.5 L 31.0 23.5 L 23.5 16.0 L 31.0 8.5\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 8.5 31.0 L 23.5 31.0 L 16.0 23.5 L 8.5 31.0 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 8.5 31.0 L 23.5 31.0 L 16.0 23.5 L 8.5 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 8.5 L 1.0 23.5 L 8.5 16.0 L 1.0 8.5 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 1.0 8.5 L 1.0 23.5 L 8.5 16.0 L 1.0 8.5\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 8.5 16.0 L 23.5 16.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 8.5 L 16.0 23.5\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 8.5 1.0 L 23.5 1.0 L 16.0 8.5 L 8.5 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 31.0 8.5 L 31.0 23.5 L 23.5 16.0 L 31.0 8.5\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 23.5 31.0 L 8.5 31.0 L 16.0 23.5 L 23.5 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 8.5 L 1.0 23.5 L 8.5 16.0 L 1.0 8.5\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"BUIREL14\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 8.6 L 31.0 23.4\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 23.4 L 31.0 8.6\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 4.8 10.3 L 27.1 10.3 L 27.1 21.7 L 4.8 21.7 L 4.8 10.3\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"BUIREL15\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 4.8 1.0 L 6.5 3.2 L 8.4 4.9 L 10.6 6.0 L 12.8 6.9 L 15.2 7.2 L 17.1 7.1 L 19.1 6.9 L 21.3 6.2 L 23.0 5.1 L 24.5 4.2 L 25.8 2.8 L 26.7 1.7 L 27.2 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"16.48\\\" cy=\\\"24.63\\\" r=\\\"6.37\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 16.5 17.9 L 16.5 7.1\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"16.61\\\" cy=\\\"24.56\\\" r=\\\"1.29\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 16.6 24.6 Z\\\" fill=\\\"CHBLK\\\" />\\n</svg>\\n\",\n \"BUISGL01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 1.0 L 31.0 1.0 L 31.0 31.0 L 1.0 31.0 L 1.0 1.0 Z\\\" fill=\\\"CHBRN\\\" />\\n <path d=\\\"M 1.0 1.0 L 31.0 1.0 L 31.0 31.0 L 1.0 31.0 L 1.0 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHBRN\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 1.0 L 31.0 1.0 L 31.0 31.0 L 1.0 31.0 L 1.0 1.0\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"BUISGL11\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 1.0 L 31.0 1.0 L 31.0 31.0 L 1.0 31.0 L 1.0 1.0 Z\\\" fill=\\\"LANDF\\\" />\\n <path d=\\\"M 1.0 1.0 L 31.0 1.0 L 31.0 31.0 L 1.0 31.0 L 1.0 1.0\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 1.0 L 31.0 1.0 L 31.0 31.0 L 1.0 31.0 L 1.0 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"CABLE01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"16\\\" height=\\\"16\\\" viewBox=\\\"0 0 16 16\\\">\\n <path d=\\\"M 10 2 L 5 8 L 9 8 L 6 14 L 11 6 L 7 6 Z\\\" fill=\\\"CHMGD\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.4\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"CABOHD01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"16\\\" height=\\\"16\\\" viewBox=\\\"0 0 16 16\\\">\\n <path d=\\\"M 3 5 L 8 11 L 13 5\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"CAIRNS01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 17.5 1.1 L 20.1 1.9 L 21.7 2.7 L 23.2 4.6 L 23.8 6.2 L 24.2 7.4 L 24.2 9.4 L 23.4 10.9 L 22.9 12.1 L 21.8 13.5 L 21.3 14.1 L 21.8 12.5 L 22.7 10.9 L 22.9 9.8 L 22.9 7.8 L 22.2 5.8 L 21.7 4.6 L 20.7 3.5 L 19.1 2.1 L 17.5 1.1 Z\\\" fill=\\\"LANDF\\\" />\\n <path d=\\\"M 17.5 1.1 L 20.1 1.9 L 21.7 2.7 L 23.2 4.6 L 23.8 6.2 L 24.2 7.4 L 24.2 9.4 L 23.4 10.9 L 22.9 12.1 L 21.8 13.5 L 21.3 14.1 L 21.8 12.5 L 22.7 10.9 L 22.9 9.8 L 22.9 7.8 L 22.2 5.8 L 21.7 4.6 L 20.7 3.5 L 19.1 2.1 L 17.5 1.1\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 11.7 13.7 L 13.2 15.1 L 14.8 16.3 L 15.4 17.2 L 15.9 18.8 L 16.4 20.4 L 16.4 21.6 L 15.6 23.5 L 15.0 25.1 L 14.0 26.3 L 12.2 27.7 L 13.2 26.1 L 14.0 24.5 L 14.8 21.4 L 14.8 19.8 L 14.0 17.9 L 13.4 16.7 L 12.2 14.7 L 11.7 13.7 Z\\\" fill=\\\"LANDF\\\" />\\n <path d=\\\"M 11.7 13.7 L 13.2 15.1 L 14.8 16.3 L 15.4 17.2 L 15.9 18.8 L 16.4 20.4 L 16.4 21.6 L 15.6 23.5 L 15.0 25.1 L 14.0 26.3 L 12.2 27.7 L 13.2 26.1 L 14.0 24.5 L 14.8 21.4 L 14.8 19.8 L 14.0 17.9 L 13.4 16.7 L 12.2 14.7 L 11.7 13.7\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 24.4 14.5 L 26.0 14.7 L 27.6 15.3 L 29.1 16.8 L 29.7 17.9 L 30.5 19.4 L 30.7 21.0 L 30.5 22.6 L 30.1 24.0 L 29.5 25.1 L 28.5 26.1 L 27.4 27.7 L 28.5 25.5 L 29.1 23.5 L 29.5 21.4 L 29.0 18.8 L 27.9 17.2 L 26.6 15.7 L 25.4 15.1 L 24.4 14.5 Z\\\" fill=\\\"LANDF\\\" />\\n <path d=\\\"M 24.4 14.5 L 26.0 14.7 L 27.6 15.3 L 29.1 16.8 L 29.7 17.9 L 30.5 19.4 L 30.7 21.0 L 30.5 22.6 L 30.1 24.0 L 29.5 25.1 L 28.5 26.1 L 27.4 27.7 L 28.5 25.5 L 29.1 23.5 L 29.5 21.4 L 29.0 18.8 L 27.9 17.2 L 26.6 15.7 L 25.4 15.1 L 24.4 14.5\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"16.38\\\" cy=\\\"28.67\\\" r=\\\"2.33\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" />\\n <circle cx=\\\"8.70\\\" cy=\\\"21.00\\\" r=\\\"7.42\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" />\\n <circle cx=\\\"16.75\\\" cy=\\\"8.23\\\" r=\\\"7.23\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" />\\n <circle cx=\\\"23.80\\\" cy=\\\"21.38\\\" r=\\\"6.86\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 2.4 28.7 L 13.8 28.7\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 18.7 28.7 L 29.7 28.7\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"CAIRNS11\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 17.5 1.1 L 20.1 1.9 L 21.7 2.7 L 23.2 4.6 L 23.8 6.2 L 24.2 7.4 L 24.2 9.4 L 23.4 10.9 L 22.9 12.1 L 21.8 13.5 L 21.3 14.1 L 21.8 12.5 L 22.7 10.9 L 22.9 9.8 L 22.9 7.8 L 22.2 5.8 L 21.7 4.6 L 20.7 3.5 L 19.1 2.1 L 17.5 1.1 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 17.5 1.1 L 20.1 1.9 L 21.7 2.7 L 23.2 4.6 L 23.8 6.2 L 24.2 7.4 L 24.2 9.4 L 23.4 10.9 L 22.9 12.1 L 21.8 13.5 L 21.3 14.1 L 21.8 12.5 L 22.7 10.9 L 22.9 9.8 L 22.9 7.8 L 22.2 5.8 L 21.7 4.6 L 20.7 3.5 L 19.1 2.1 L 17.5 1.1\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 11.7 13.7 L 13.2 15.1 L 14.8 16.3 L 15.4 17.2 L 15.9 18.8 L 16.4 20.4 L 16.4 21.6 L 15.6 23.5 L 15.0 25.1 L 14.0 26.3 L 12.2 27.7 L 13.2 26.1 L 14.0 24.5 L 14.8 21.4 L 14.8 19.8 L 14.0 17.9 L 13.4 16.7 L 12.2 14.7 L 11.7 13.7 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 11.7 13.7 L 13.2 15.1 L 14.8 16.3 L 15.4 17.2 L 15.9 18.8 L 16.4 20.4 L 16.4 21.6 L 15.6 23.5 L 15.0 25.1 L 14.0 26.3 L 12.2 27.7 L 13.2 26.1 L 14.0 24.5 L 14.8 21.4 L 14.8 19.8 L 14.0 17.9 L 13.4 16.7 L 12.2 14.7 L 11.7 13.7\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 24.4 14.5 L 26.0 14.7 L 27.6 15.3 L 29.1 16.8 L 29.7 17.9 L 30.5 19.4 L 30.7 21.0 L 30.5 22.6 L 30.1 24.0 L 29.5 25.1 L 28.5 26.1 L 27.4 27.7 L 28.5 25.5 L 29.1 23.5 L 29.5 21.4 L 29.0 18.8 L 27.9 17.2 L 26.6 15.7 L 25.4 15.1 L 24.4 14.5 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 24.4 14.5 L 26.0 14.7 L 27.6 15.3 L 29.1 16.8 L 29.7 17.9 L 30.5 19.4 L 30.7 21.0 L 30.5 22.6 L 30.1 24.0 L 29.5 25.1 L 28.5 26.1 L 27.4 27.7 L 28.5 25.5 L 29.1 23.5 L 29.5 21.4 L 29.0 18.8 L 27.9 17.2 L 26.6 15.7 L 25.4 15.1 L 24.4 14.5\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"16.38\\\" cy=\\\"28.67\\\" r=\\\"2.33\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" />\\n <circle cx=\\\"8.70\\\" cy=\\\"21.00\\\" r=\\\"7.42\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" />\\n <circle cx=\\\"16.75\\\" cy=\\\"8.23\\\" r=\\\"7.23\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" />\\n <circle cx=\\\"23.80\\\" cy=\\\"21.38\\\" r=\\\"6.86\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 2.4 28.7 L 13.8 28.7\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 18.7 28.7 L 29.7 28.7\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"CBLARE51\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 19.5 1.0 L 11.0 14.5 L 21.0 18.1 L 13.0 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"CGUSTA02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"2.32\\\" cy=\\\"24.70\\\" r=\\\"1.32\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 2.3 24.7 Z\\\" fill=\\\"LANDF\\\" />\\n <path d=\\\"M 5.4 6.0 L 31.0 6.0 L 31.0 22.0 L 5.4 22.0 L 5.4 6.0 Z\\\" fill=\\\"CHWHT\\\" />\\n <path d=\\\"M 5.4 6.0 L 31.0 6.0 L 31.0 22.0 L 5.4 22.0 L 5.4 6.0\\\" fill=\\\"none\\\" stroke=\\\"CHWHT\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 5.4 6.0 L 31.0 6.0 L 31.0 22.0 L 5.4 22.0 L 5.4 6.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 15.0 11.3 L 12.8 10.3 L 10.8 10.3 L 8.6 11.4\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 8.6 16.7 L 10.7 18.8 L 12.8 18.8 L 15.0 17.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 25.7 11.3 L 23.5 10.3 L 21.5 10.3 L 19.2 11.4 L 19.2 16.7 L 21.6 18.8 L 23.5 18.8 L 25.7 17.7 L 25.7 14.7 L 23.5 14.7\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 8.6 11.4 L 8.6 16.7\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"CHCRDEL1\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 31.0 L 31.0 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHCOR\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"CHCRID01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"28.56\\\" r=\\\"2.44\\\" fill=\\\"none\\\" stroke=\\\"CHCOR\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 16.0 1.0 L 16.0 26.0\\\" fill=\\\"none\\\" stroke=\\\"CHCOR\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"CHIMNY01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"13.14\\\" cy=\\\"28.50\\\" r=\\\"2.50\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 16.0 28.5 L 21.0 28.5\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 9.3 28.5 L 11.4 8.0 L 14.6 8.0 L 17.1 28.5\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 5.3 28.5 L 10.4 28.5\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 11.4 8.0 L 10.6 5.6 L 10.8 3.6 L 11.9 2.5 L 13.6 1.8 L 16.2 1.8 L 17.5 2.4 L 18.9 1.5 L 21.3 1.0 L 23.5 1.1 L 25.6 1.3 L 26.5 2.3 L 26.7 4.2 L 24.3 5.6 L 21.5 5.7 L 21.4 7.0 L 18.7 8.1 L 14.6 8.1\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"CHIMNY11\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"13.14\\\" cy=\\\"28.50\\\" r=\\\"2.50\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 16.0 28.5 L 21.0 28.5\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 9.3 28.5 L 11.4 8.0 L 14.6 8.0 L 17.1 28.5\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 5.3 28.5 L 10.4 28.5\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 11.4 8.0 L 10.6 5.6 L 10.8 3.6 L 11.9 2.5 L 13.6 1.8 L 16.2 1.8 L 17.5 2.4 L 18.9 1.5 L 21.3 1.0 L 23.5 1.1 L 25.6 1.3 L 26.5 2.3 L 26.7 4.2 L 24.3 5.6 L 21.5 5.7 L 21.4 7.0 L 18.7 8.1 L 14.6 8.1\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"CHINFO06\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 15.8 5.9 L 15.8 19.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 13.9 24.3 L 17.1 24.3\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"CHINFO07\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 31.0 L 31.0 31.0 L 31.0 1.0 L 1.0 1.0 L 1.0 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 15.0 5.1 L 15.0 7.6\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 15.2 25.5 L 15.2 11.3 L 9.7 11.2\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 9.7 25.5 L 19.8 25.5\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"CHINFO08\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 31.0 L 31.0 31.0 L 31.0 1.0 L 1.0 1.0 L 1.0 31.0\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 15.0 5.1 L 15.0 7.6\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 15.2 25.5 L 15.2 11.3 L 9.7 11.2\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 9.7 25.5 L 19.8 25.5\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"CHINFO09\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 15.8 5.9 L 15.8 19.0\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 13.9 24.3 L 17.1 24.3\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"CHINFO10\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 31.0 L 31.0 31.0 L 31.0 1.0 L 1.0 1.0 L 1.0 31.0\\\" fill=\\\"none\\\" stroke=\\\"ADINF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 15.0 5.1 L 15.0 7.6\\\" fill=\\\"none\\\" stroke=\\\"ADINF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 15.2 25.5 L 15.2 11.3 L 9.7 11.2\\\" fill=\\\"none\\\" stroke=\\\"ADINF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 9.7 25.5 L 19.8 25.5\\\" fill=\\\"none\\\" stroke=\\\"ADINF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"CHINFO11\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"ADINF\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 15.8 5.9 L 15.8 19.0\\\" fill=\\\"none\\\" stroke=\\\"ADINF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 13.9 24.3 L 17.1 24.3\\\" fill=\\\"none\\\" stroke=\\\"ADINF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"CHKSYM01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 1.0 L 1.0 31.0 L 31.0 31.0 L 31.0 1.0 L 1.0 1.0 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 1.0 1.0 L 1.0 31.0 L 31.0 31.0 L 31.0 1.0 L 1.0 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 1.0 L 1.0 31.0 L 31.0 31.0 L 31.0 1.0 L 1.0 1.0\\\" fill=\\\"none\\\" stroke=\\\"OUTLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"CLRLIN01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 8.0 31.0 L 16.0 1.0 L 24.0 31.0 L 8.0 31.0 Z\\\" fill=\\\"NINFO\\\" />\\n <path d=\\\"M 8.0 31.0 L 16.0 1.0 L 24.0 31.0 L 8.0 31.0\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"CRANES01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"13.50\\\" cy=\\\"26.00\\\" r=\\\"2.50\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 3.5 26.0 L 11.0 26.0\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 26.0 L 23.5 26.0\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 11.0 26.0 L 11.0 6.0\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 26.0 L 16.0 6.0\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 3.5 L 31.0 3.5\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 3.5 L 1.0 11.0 L 6.0 11.0 L 6.0 6.0\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"CTNARE51\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 16.1 19.9 L 16.1 5.8\\\" fill=\\\"none\\\" stroke=\\\"TRFCF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 14.0 25.3 L 18.4 25.3\\\" fill=\\\"none\\\" stroke=\\\"TRFCF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"TRFCF\\\" stroke-width=\\\"1.2\\\" />\\n</svg>\\n\",\n \"CTYARE51\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 16.1 19.9 L 16.1 5.8\\\" fill=\\\"none\\\" stroke=\\\"TRFCF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 14.0 25.3 L 18.4 25.3\\\" fill=\\\"none\\\" stroke=\\\"TRFCF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"TRFCF\\\" stroke-width=\\\"1.2\\\" />\\n</svg>\\n\",\n \"CTYARE71\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 19.0 19.1 L 19.0 7.8\\\" fill=\\\"none\\\" stroke=\\\"TRFCF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 17.3 23.5 L 20.8 23.5\\\" fill=\\\"none\\\" stroke=\\\"TRFCF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"18.93\\\" cy=\\\"16.00\\\" r=\\\"12.07\\\" fill=\\\"none\\\" stroke=\\\"TRFCF\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 3.2 27.8 L 3.2 22.1 L 1.0 22.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 27.8 L 5.6 27.8\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 2.1 19.2 L 2.2 20.2\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"CURDEF01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 12.5 29.1 L 15.5 23.2 L 18.5 29.1\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 12.5 23.6 L 15.5 17.7 L 18.5 23.6\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 15.5 2.5 L 15.5 29.5\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 12.5 9.9 L 15.5 2.6 L 18.5 9.9\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 12.8 L 1.4 12.0 L 1.8 11.3 L 2.3 10.8 L 2.8 10.3 L 3.6 10.0 L 4.2 10.1 L 5.1 10.3 L 6.0 10.5 L 6.6 11.5 L 7.2 12.1 L 7.5 12.7 L 7.5 13.5 L 7.2 14.2 L 6.8 14.8 L 6.2 15.5 L 5.5 16.3 L 4.9 17.0 L 4.5 17.6 L 4.2 18.1 L 4.1 18.8 L 4.1 19.4 L 4.1 20.0 L 4.2 20.6 L 4.2 20.7\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 3.6 23.2 L 5.1 23.2\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 24.5 12.7 L 24.8 11.8 L 25.2 11.1 L 25.7 10.6 L 26.2 10.1 L 27.0 9.8 L 27.7 9.9 L 28.6 10.1 L 29.4 10.3 L 30.1 11.3 L 30.6 11.9 L 31.0 12.6 L 31.0 13.3 L 30.6 14.0 L 30.3 14.6 L 29.7 15.3 L 29.0 16.1 L 28.4 16.9 L 28.0 17.4 L 27.6 17.9 L 27.6 18.6 L 27.6 19.3 L 27.6 19.8 L 27.6 20.4 L 27.6 20.5\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 27.0 23.0 L 28.6 23.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"CURENT01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 12.7 30.6 L 16.0 24.0 L 19.3 30.6\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 12.7 24.5 L 16.0 17.9 L 19.3 24.5\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 1.0 L 16.0 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 12.7 9.2 L 16.0 1.1 L 19.3 9.2\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"CURSRA01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 16.1 1.0 L 16.1 31.0\\\" fill=\\\"none\\\" stroke=\\\"CURSR\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 15.8 L 31.0 15.8\\\" fill=\\\"none\\\" stroke=\\\"CURSR\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"CURSRB01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 16.0 L 13.0 16.0\\\" fill=\\\"none\\\" stroke=\\\"CURSR\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 19.0 16.0 L 31.0 16.0\\\" fill=\\\"none\\\" stroke=\\\"CURSR\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 15.9 1.0 L 15.9 13.0\\\" fill=\\\"none\\\" stroke=\\\"CURSR\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 15.9 19.0 L 15.9 31.0\\\" fill=\\\"none\\\" stroke=\\\"CURSR\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"DANGER01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.3 13.0 L 3.8 9.4 L 7.1 6.4 L 9.8 5.2 L 13.3 4.2 L 19.0 4.2 L 22.8 5.2 L 26.6 7.5 L 29.1 10.4 L 31.0 14.1 L 31.0 18.6 L 28.5 22.1 L 25.6 24.9 L 22.0 26.8 L 18.1 27.9 L 12.8 27.7 L 9.1 26.3 L 5.7 24.1 L 2.9 21.2 L 1.0 17.4 L 1.3 13.0 Z\\\" fill=\\\"DEPVS\\\" />\\n <path d=\\\"M 1.3 13.0 L 3.8 9.4 L 7.1 6.4 L 9.8 5.2 L 13.3 4.2 L 19.0 4.2 L 22.8 5.2 L 26.6 7.5 L 29.1 10.4 L 31.0 14.1 L 31.0 18.6 L 28.5 22.1 L 25.6 24.9 L 22.0 26.8 L 18.1 27.9 L 12.8 27.7 L 9.1 26.3 L 5.7 24.1 L 2.9 21.2 L 1.0 17.4 L 1.3 13.0\\\" fill=\\\"none\\\" stroke=\\\"DEPVS\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"DANGER02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\"></svg>\\n\",\n \"DANGER03\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.3 13.0 L 3.8 9.4 L 7.1 6.4 L 9.8 5.2 L 13.3 4.2 L 19.0 4.2 L 22.8 5.2 L 26.6 7.5 L 29.1 10.4 L 31.0 14.1 L 31.0 18.6 L 28.5 22.1 L 25.6 24.9 L 22.0 26.8 L 18.1 27.9 L 12.8 27.7 L 9.1 26.3 L 5.7 24.1 L 2.9 21.2 L 1.0 17.4 L 1.3 13.0 Z\\\" fill=\\\"DEPIT\\\" />\\n <path d=\\\"M 1.3 13.0 L 3.8 9.4 L 7.1 6.4 L 9.8 5.2 L 13.3 4.2 L 19.0 4.2 L 22.8 5.2 L 26.6 7.5 L 29.1 10.4 L 31.0 14.1 L 31.0 18.6 L 28.5 22.1 L 25.6 24.9 L 22.0 26.8 L 18.1 27.9 L 12.8 27.7 L 9.1 26.3 L 5.7 24.1 L 2.9 21.2 L 1.0 17.4 L 1.3 13.0\\\" fill=\\\"none\\\" stroke=\\\"DEPIT\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"DAYSQR01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 5.7 1.0 L 5.7 21.6 L 26.3 21.6 L 26.3 1.0 L 5.7 1.0\\\" fill=\\\"none\\\" stroke=\\\"LITGN\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.1 23.1 L 16.1 31.0\\\" fill=\\\"none\\\" stroke=\\\"LITGN\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"16.08\\\" cy=\\\"21.48\\\" r=\\\"2.57\\\" fill=\\\"none\\\" stroke=\\\"LITGN\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 16.1 21.5 Z\\\" fill=\\\"LITGN\\\" />\\n <circle cx=\\\"16.08\\\" cy=\\\"21.48\\\" r=\\\"2.57\\\" fill=\\\"none\\\" stroke=\\\"LITGN\\\" stroke-width=\\\"0.8\\\" />\\n</svg>\\n\",\n \"DAYSQR21\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 7.2 1.0 L 7.2 18.6 L 24.8 18.6 L 24.8 1.0 L 7.2 1.0\\\" fill=\\\"none\\\" stroke=\\\"LITGN\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 18.6 L 16.0 25.3\\\" fill=\\\"none\\\" stroke=\\\"LITGN\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"16.07\\\" cy=\\\"28.14\\\" r=\\\"2.86\\\" fill=\\\"none\\\" stroke=\\\"LITGN\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 9.6 28.1 L 13.3 28.1\\\" fill=\\\"none\\\" stroke=\\\"LITGN\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 18.9 28.1 L 22.7 28.1\\\" fill=\\\"none\\\" stroke=\\\"LITGN\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"DAYTRI01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 3.5 21.1 L 28.5 21.1 L 16.0 1.0 L 3.5 21.1\\\" fill=\\\"none\\\" stroke=\\\"LITRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 21.1 L 16.0 31.0\\\" fill=\\\"none\\\" stroke=\\\"LITRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"15.95\\\" cy=\\\"21.07\\\" r=\\\"2.50\\\" fill=\\\"none\\\" stroke=\\\"LITRD\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 16.0 21.1 Z\\\" fill=\\\"LITRD\\\" />\\n <circle cx=\\\"15.95\\\" cy=\\\"21.07\\\" r=\\\"2.50\\\" fill=\\\"none\\\" stroke=\\\"LITRD\\\" stroke-width=\\\"0.8\\\" />\\n</svg>\\n\",\n \"DAYTRI05\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 3.6 1.0 L 28.4 1.0 L 16.0 20.9 L 3.6 1.2\\\" fill=\\\"none\\\" stroke=\\\"LITRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"15.93\\\" cy=\\\"20.42\\\" r=\\\"2.47\\\" fill=\\\"none\\\" stroke=\\\"LITRD\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 15.9 20.4 Z\\\" fill=\\\"LITRD\\\" />\\n <circle cx=\\\"15.93\\\" cy=\\\"20.42\\\" r=\\\"2.47\\\" fill=\\\"none\\\" stroke=\\\"LITRD\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 16.0 21.7 L 16.0 31.0\\\" fill=\\\"none\\\" stroke=\\\"LITRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"DAYTRI21\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 5.7 17.6 L 26.3 17.6 L 16.0 1.0 L 5.7 17.6\\\" fill=\\\"none\\\" stroke=\\\"LITRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 17.6 L 16.0 25.8\\\" fill=\\\"none\\\" stroke=\\\"LITRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"15.96\\\" cy=\\\"28.32\\\" r=\\\"2.68\\\" fill=\\\"none\\\" stroke=\\\"LITRD\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 9.9 28.2 L 13.3 28.2\\\" fill=\\\"none\\\" stroke=\\\"LITRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 18.6 28.2 L 22.1 28.2\\\" fill=\\\"none\\\" stroke=\\\"LITRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"DAYTRI25\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 4.4 1.0 L 27.6 1.0 L 16.0 19.6 L 4.4 1.2\\\" fill=\\\"none\\\" stroke=\\\"LITRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 19.5 L 16.0 25.2\\\" fill=\\\"none\\\" stroke=\\\"LITRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"15.93\\\" cy=\\\"28.00\\\" r=\\\"3.00\\\" fill=\\\"none\\\" stroke=\\\"LITRD\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 9.1 28.0 L 13.0 28.0\\\" fill=\\\"none\\\" stroke=\\\"LITRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 18.9 28.0 L 22.9 28.0\\\" fill=\\\"none\\\" stroke=\\\"LITRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"DIRBOY01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 9.0 20.9 L 2.2 20.9 L 16.0 7.1 L 29.7 20.9 L 22.7 20.9 L 22.7 25.5 L 9.0 25.5 L 9.0 20.9\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"4.48\\\" cy=\\\"10.02\\\" r=\\\"3.48\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"1.8\\\" />\\n <circle cx=\\\"27.59\\\" cy=\\\"10.02\\\" r=\\\"3.41\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"1.8\\\" />\\n</svg>\\n\",\n \"DIRBOYA1\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 9.0 20.9 L 2.2 20.9 L 16.0 7.1 L 29.7 20.9 L 22.7 20.9 L 22.7 25.5 L 9.0 25.5 L 9.0 20.9\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"4.48\\\" cy=\\\"10.02\\\" r=\\\"3.48\\\" fill=\\\"none\\\" stroke=\\\"CHRED\\\" stroke-width=\\\"1.8\\\" />\\n <circle cx=\\\"27.59\\\" cy=\\\"10.02\\\" r=\\\"3.41\\\" fill=\\\"none\\\" stroke=\\\"CHGRN\\\" stroke-width=\\\"1.8\\\" />\\n</svg>\\n\",\n \"DIRBOYB1\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 9.0 20.9 L 2.2 20.9 L 16.0 7.1 L 29.7 20.9 L 22.7 20.9 L 22.7 25.5 L 9.0 25.5 L 9.0 20.9\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"4.48\\\" cy=\\\"10.02\\\" r=\\\"3.48\\\" fill=\\\"none\\\" stroke=\\\"CHGRN\\\" stroke-width=\\\"1.8\\\" />\\n <circle cx=\\\"27.59\\\" cy=\\\"10.02\\\" r=\\\"3.41\\\" fill=\\\"none\\\" stroke=\\\"CHRED\\\" stroke-width=\\\"1.8\\\" />\\n</svg>\\n\",\n \"DISMAR03\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"1.2\\\" />\\n</svg>\\n\",\n \"DISMAR04\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 5.1 L 1.0 26.9\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 8.4 13.3 L 1.0 21.5\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 3.5 18.7 L 9.2 26.9\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 14.6 13.3 L 14.6 26.9\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 14.6 15.5 L 16.5 13.5 L 18.2 13.0 L 19.3 13.0 L 21.6 14.1 L 22.8 15.7 L 22.8 26.9\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 22.8 16.0 L 23.9 13.8 L 26.1 12.8 L 27.5 12.8 L 29.7 13.8 L 31.0 16.0 L 31.0 26.9\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"DNGCIR01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <!-- S-52 PresLib §CSYM02 isolated-danger ring. Per IHO S-52 spec, hazards\\n (UWTROC / OBSTRN / WRECKS) whose VALSOU is shallower than the\\n mariner's safety contour, OR that cover-and-uncover with the tide\\n (always dangerous regardless of sounded depth), get a thin DASHED\\n MAGENTA RING overlaid on top of the base hazard icon.\\n Thin 1.0-px stroke (no fill) at r=14 surrounds the 18-unit base\\n hazard asterisks/crosses with ~3 px of breathing room at z16,\\n reading as the standard NOAA / ECDIS isolated-danger marker. -->\\n <circle cx=\\\"16\\\" cy=\\\"16\\\" r=\\\"14\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"1.0\\\" stroke-dasharray=\\\"2,2\\\" />\\n</svg>\\n\",\n \"DNGHILIT\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 1.0 L 31.0 1.0 L 31.0 31.0 L 1.0 31.0 L 1.0 1.0 Z\\\" fill=\\\"DNGHL\\\" />\\n <path d=\\\"M 1.0 1.0 L 31.0 1.0 L 31.0 31.0 L 1.0 31.0 L 1.0 1.0\\\" fill=\\\"none\\\" stroke=\\\"DNGHL\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 31.0 L 31.0 31.0 L 31.0 1.0 L 1.0 1.0 L 1.0 31.0\\\" fill=\\\"none\\\" stroke=\\\"DNGHL\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"DOMES001\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"15.73\\\" cy=\\\"25.99\\\" r=\\\"2.56\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 13.2 25.8 L 3.4 25.8\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 3.4 25.8 L 2.8 24.9 L 2.0 22.8 L 1.2 20.7 L 1.0 19.0 L 1.0 16.6 L 1.6 14.1 L 2.7 11.2 L 3.6 9.4 L 5.3 7.6 L 7.1 6.1 L 8.8 5.2 L 11.6 4.2 L 14.0 3.7 L 16.6 3.4 L 19.5 3.9 L 22.3 4.8 L 25.0 6.5 L 27.5 8.9 L 28.9 10.8 L 30.2 13.3 L 30.9 16.4 L 31.0 20.1 L 30.4 22.6 L 29.6 24.6 L 28.7 25.6\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 18.2 25.8 L 28.6 25.8 L 28.8 25.3\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"DOMES011\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"15.73\\\" cy=\\\"25.99\\\" r=\\\"2.56\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 13.2 25.8 L 3.4 25.8\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 3.4 25.8 L 2.8 24.9 L 2.0 22.8 L 1.2 20.7 L 1.0 19.0 L 1.0 16.6 L 1.6 14.1 L 2.7 11.2 L 3.6 9.4 L 5.3 7.6 L 7.1 6.1 L 8.8 5.2 L 11.6 4.2 L 14.0 3.7 L 16.6 3.4 L 19.5 3.9 L 22.3 4.8 L 25.0 6.5 L 27.5 8.9 L 28.9 10.8 L 30.2 13.3 L 30.9 16.4 L 31.0 20.1 L 30.4 22.6 L 29.6 24.6 L 28.7 25.6\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 18.2 25.8 L 28.6 25.8 L 28.8 25.3\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"DSHAER01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"15.49\\\" cy=\\\"28.74\\\" r=\\\"2.26\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 6.1 28.7 L 12.7 28.7\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 17.8 28.7 L 24.0 28.7\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 10.4 1.3 L 25.9 10.9\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 18.3 6.1 L 19.7 3.8\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 14.1 14.1 L 10.7 28.7\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 17.2 15.0 L 19.7 28.7\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 10.4 1.0 L 9.3 3.3 L 8.9 7.0 L 9.6 10.0 L 11.8 12.8 L 14.1 14.1 L 17.2 15.0 L 19.3 15.0 L 22.0 14.6 L 24.5 13.2 L 25.9 10.9\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"DSHAER11\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"15.49\\\" cy=\\\"28.74\\\" r=\\\"2.26\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 6.1 28.7 L 12.7 28.7\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 17.8 28.7 L 24.0 28.7\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 10.4 1.3 L 25.9 10.9\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 18.3 6.1 L 19.7 3.8\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 14.1 14.1 L 10.7 28.7\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 17.2 15.0 L 19.7 28.7\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 10.4 1.0 L 9.3 3.3 L 8.9 7.0 L 9.6 10.0 L 11.8 12.8 L 14.1 14.1 L 17.2 15.0 L 19.3 15.0 L 22.0 14.6 L 24.5 13.2 L 25.9 10.9\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"DWRTPT51\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 7.3 L 1.0 24.6 L 6.6 24.6 L 8.6 23.6 L 10.6 20.8 L 10.6 11.2 L 8.6 8.3 L 6.7 7.3 L 1.0 7.3\\\" fill=\\\"none\\\" stroke=\\\"TRFCF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 15.6 7.3 L 19.4 24.7 L 23.3 7.5 L 27.1 24.7 L 31.0 7.3\\\" fill=\\\"none\\\" stroke=\\\"TRFCF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"DWRUTE51\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 12.8 10.0 L 9.8 10.0 L 15.8 1.0 L 22.0 10.0 L 19.0 10.0 L 19.0 21.9 L 22.2 21.9 L 16.0 31.0 L 9.9 21.9 L 12.8 21.9 L 12.8 10.0 Z\\\" fill=\\\"TRFCD\\\" />\\n <path d=\\\"M 12.8 10.0 L 9.8 10.0 L 15.8 1.0 L 22.0 10.0 L 19.0 10.0 L 19.0 21.9 L 22.2 21.9 L 16.0 31.0 L 9.9 21.9 L 12.8 21.9 L 12.8 10.0\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 12.8 10.0 L 9.8 10.0 L 15.8 1.0 L 22.0 10.0 L 19.0 10.0 L 19.0 21.9 L 22.2 21.9 L 16.0 31.0 L 9.9 21.9 L 12.8 21.9 L 12.8 10.0\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"EBBSTR01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 12.6 9.4 L 16.0 1.0 L 19.4 9.4\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 1.1 L 16.0 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"EBLVRM11\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 16.0 16.0 Z\\\" fill=\\\"NINFO\\\" />\\n</svg>\\n\",\n \"ENTRES51\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 23.5 16.0 L 9.5 16.0\\\" fill=\\\"none\\\" stroke=\\\"TRFCF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"TRFCF\\\" stroke-width=\\\"1.2\\\" />\\n</svg>\\n\",\n \"ENTRES61\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 20.1 15.7 L 8.2 15.7\\\" fill=\\\"none\\\" stroke=\\\"TRFCF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"13.73\\\" cy=\\\"15.68\\\" r=\\\"12.73\\\" fill=\\\"none\\\" stroke=\\\"TRFCF\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 29.6 29.1 L 31.0 29.1\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 29.9 19.2 L 29.9 27.7\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"ENTRES71\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 24.9 16.0 L 13.7 16.0\\\" fill=\\\"none\\\" stroke=\\\"TRFCF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"18.93\\\" cy=\\\"16.00\\\" r=\\\"12.07\\\" fill=\\\"none\\\" stroke=\\\"TRFCF\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 3.2 27.8 L 3.2 22.1 L 1.0 22.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 27.8 L 5.6 27.8\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 2.1 19.2 L 2.2 20.2\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"ERBLTIK1\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 13.9 14.4 L 17.6 14.4\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 7.1 15.3 L 10.7 14.6\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 21.1 14.7 L 24.7 15.4\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 17.4 L 4.4 16.0\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 27.5 16.4 L 31.0 17.6\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"EVENTS02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 4.8 L 31.0 4.8 L 31.0 27.3 L 1.0 27.3 L 1.0 4.8\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 27.3 L 31.0 4.8\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"FAIRWY51\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 12.7 31.0 L 12.7 11.0 L 9.3 11.0 L 16.0 1.0 L 22.7 11.0 L 19.3 11.0 L 19.3 31.0 L 12.7 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"FAIRWY52\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 19.4 20.9 L 22.7 20.9 L 16.1 31.0 L 9.4 20.9 L 12.7 20.9\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 12.6 20.9 L 12.6 11.0 L 9.3 11.0 L 16.0 1.0 L 22.6 11.0 L 19.3 11.0 L 19.3 20.9\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"FLASTK01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 13.5 28.5 L 13.5 12.5 L 18.5 12.5 L 18.5 28.5 L 17.8 26.7 L 16.0 26.1 L 14.4 26.7 L 13.5 28.5 Z\\\" fill=\\\"LANDF\\\" />\\n <path d=\\\"M 13.5 28.5 L 13.5 12.5 L 18.5 12.5 L 18.5 28.5 L 17.8 26.7 L 16.0 26.1 L 14.4 26.7 L 13.5 28.5\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"16.00\\\" cy=\\\"28.53\\\" r=\\\"2.47\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 18.5 28.5 L 23.4 28.5\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 13.5 28.5 L 8.6 28.5\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 18.8 1.0 L 17.2 1.9 L 15.7 2.9 L 14.4 4.4 L 13.5 6.3 L 13.5 8.1 L 13.8 9.1 L 15.1 9.6 L 16.6 9.6 L 17.5 9.1 L 18.1 7.8 L 17.8 6.3 L 17.2 5.6 L 17.2 4.4 L 17.2 3.2 L 18.1 2.2 L 18.8 1.0\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"FLASTK11\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 13.5 28.5 L 13.5 12.5 L 18.5 12.5 L 18.5 28.5 L 17.8 26.7 L 16.0 26.1 L 14.4 26.7 L 13.5 28.5 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 13.5 28.5 L 13.5 12.5 L 18.5 12.5 L 18.5 28.5 L 17.8 26.7 L 16.0 26.1 L 14.4 26.7 L 13.5 28.5\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"16.00\\\" cy=\\\"28.53\\\" r=\\\"2.47\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 18.5 28.5 L 23.4 28.5\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 13.5 28.5 L 8.6 28.5\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 18.8 1.0 L 17.2 1.9 L 15.7 2.9 L 14.4 4.4 L 13.5 6.3 L 13.5 8.1 L 13.8 9.1 L 15.1 9.6 L 16.6 9.6 L 17.5 9.1 L 18.1 7.8 L 17.8 6.3 L 17.2 5.6 L 17.2 4.4 L 17.2 3.2 L 18.1 2.2 L 18.8 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"FLDSTR01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 16.0 1.0 L 16.0 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 12.7 9.2 L 16.0 1.1 L 19.3 9.2\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.1 18.4 L 19.3 25.2\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.1 24.5 L 19.3 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 25.3 L 16.0 27.2\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"FLGSTF01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"28.00\\\" r=\\\"3.00\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 16.0 25.0 L 16.0 1.0 L 25.0 1.0 L 25.0 11.5 L 16.0 11.5\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 7.0 28.0 L 13.0 28.0\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 19.0 28.0 L 25.0 28.0\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"FOGSIG01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 2.4 2.2 L 3.8 9.9 L 7.1 17.4 L 10.9 22.8 L 16.0 27.6 L 20.9 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 11.5 1.8 L 13.0 7.6 L 16.0 13.2 L 19.0 18.2 L 22.8 21.4 L 25.3 22.6\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 20.7 1.0 L 21.9 6.9 L 25.1 11.6 L 28.2 14.1 L 29.6 15.3\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"FORSTC01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 1.0 L 31.0 1.0 L 31.0 31.0 L 1.0 31.0 L 1.0 1.0\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"FORSTC11\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 1.0 L 31.0 1.0 L 31.0 31.0 L 1.0 31.0 L 1.0 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"FOULGND1\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 14.5 4.5 L 6.7 27.5\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 26.2 4.5 L 18.2 27.5\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 4.2 12.2 L 31.0 12.2\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 19.9 L 28.4 19.9\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"FRYARE51\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 4.6 15.8 L 1.0 15.8\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 21.7 15.8 L 25.1 15.8\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 17.1 14.3 L 7.7 14.3 L 7.7 17.7 L 17.0 17.7 L 19.4 16.5 L 19.4 15.4 L 17.1 14.3\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 27.5 15.9 L 31.0 15.9\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"FRYARE52\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 4.6 15.8 L 1.0 15.8\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 21.7 15.8 L 25.1 15.8\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 17.1 14.3 L 7.7 14.3 L 7.7 17.7 L 17.0 17.7 L 19.4 16.5 L 19.4 15.4 L 17.1 14.3\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 27.5 15.9 L 31.0 15.9\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"FSHFAC02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 28.9 L 31.0 28.9 L 31.0 15.8 L 1.1 15.8 L 1.1 28.8\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 4.9 3.1 L 17.7 15.9\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"FSHFAC03\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 12.3 L 1.0 19.7 L 31.0 19.7 L 31.0 12.6\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 8.7 12.4 L 8.7 19.8\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 12.5 L 16.0 19.6\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 23.6 12.5 L 23.6 19.6\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"FSHGRD01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 5.7 16.1 L 1.5 11.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 5.7 16.2 L 1.0 20.9\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 5.8 16.1 L 7.9 13.9 L 10.5 12.0 L 13.9 10.4 L 17.7 9.9 L 21.1 10.1 L 24.9 10.8 L 28.1 12.3 L 30.4 14.0 L 30.9 15.2\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 5.6 16.1 L 8.9 18.7 L 12.8 21.0 L 17.0 21.9 L 20.0 22.1 L 23.2 21.6 L 26.2 20.4 L 28.7 18.2 L 30.6 15.5\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 22.9 10.4 L 21.7 13.7 L 21.7 18.2 L 23.9 21.5\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 31.0 15.2 L 30.5 15.6\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"FSHHAV01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 20.6 L 6.3 16.1 L 8.6 13.6 L 11.2 12.0 L 13.9 10.9 L 16.5 10.2 L 19.4 10.2 L 21.7 10.4 L 24.6 11.4 L 27.2 12.6 L 29.6 14.4 L 31.0 16.1 L 29.2 17.8 L 27.5 19.2 L 25.4 20.3 L 22.7 21.3 L 20.0 21.8 L 16.9 21.8 L 13.9 21.3 L 11.1 20.3 L 8.6 18.6 L 6.9 17.2\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 5.4 15.4 L 1.6 10.6\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 25.0 11.5 L 24.4 12.8 L 23.9 14.6 L 23.8 15.8 L 23.8 16.7 L 24.1 18.4 L 24.8 20.5\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 6.9 17.2 L 5.4 15.4\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"FSHRES51\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 20.8 L 6.3 16.3 L 8.6 13.8 L 11.2 12.1 L 13.9 11.1 L 16.5 10.3 L 19.4 10.3 L 21.7 10.6 L 24.6 11.6 L 27.2 12.7 L 29.6 14.5 L 31.0 16.3 L 29.2 17.9 L 27.6 19.4 L 25.4 20.4 L 22.7 21.5 L 20.0 22.0 L 16.9 22.0 L 13.9 21.5 L 11.1 20.4 L 8.6 18.8 L 6.9 17.4\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 5.9 16.1 L 2.1 11.3\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 7.1 17.4 L 5.9 16.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 28.4 7.2 L 10.7 24.8\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"FSHRES61\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 20.2 L 5.7 16.2 L 7.7 14.0 L 10.0 12.5 L 12.4 11.6 L 14.7 10.9 L 17.3 10.9 L 19.4 11.1 L 21.9 12.0 L 24.2 13.0 L 26.3 14.6 L 27.6 16.2 L 26.0 17.6 L 24.5 18.9 L 22.6 19.9 L 20.2 20.8 L 17.8 21.2 L 15.1 21.2 L 12.4 20.8 L 9.9 19.9 L 7.7 18.4 L 6.2 17.1\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 5.4 16.1 L 2.0 11.7\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 6.4 17.2 L 5.3 15.9\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 25.2 8.1 L 9.6 23.8\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 30.2 15.6 L 30.2 21.5\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 29.6 23.9 L 31.0 23.9\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"FSHRES71\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 7.2 19.8 L 11.4 16.2 L 13.2 14.3 L 15.3 12.9 L 17.5 12.1 L 19.5 11.5 L 21.8 11.5 L 23.7 11.7 L 25.9 12.5 L 28.0 13.4 L 29.9 14.8 L 31.0 16.2 L 29.6 17.5 L 28.3 18.7 L 26.6 19.5 L 24.4 20.4 L 22.3 20.8 L 19.8 20.8 L 17.5 20.4 L 15.2 19.5 L 13.2 18.2 L 11.9 17.1\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 11.1 16.1 L 8.1 12.2\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 12.0 17.1 L 11.1 16.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 28.9 9.0 L 14.9 23.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 3.1 22.9 L 3.1 17.4 L 1.0 17.4\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 22.9 L 5.4 22.9\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 2.1 14.6 L 2.1 15.6\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"GATCON03\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 2.3 9.6 L 29.4 9.6\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 2.3 22.4 L 29.6 22.4\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 5.3 16.0 L 16.0 5.3\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 5.3 16.0 L 16.0 26.7\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 22.4 5.3 L 11.7 16.0 L 22.4 26.7\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"GATCON04\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 2.3 9.6 L 29.4 9.6\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 2.3 22.4 L 29.6 22.4\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 5.3 L 16.0 26.7\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"HILTOP01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 24.0 14.3 L 24.7 16.9 L 31.0 13.6 L 24.0 14.3 Z\\\" fill=\\\"LANDF\\\" />\\n <path d=\\\"M 24.0 14.3 L 24.7 16.9 L 31.0 13.6 L 24.0 14.3\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 24.0 18.2 L 22.4 20.2 L 28.9 23.7 L 24.0 18.2 Z\\\" fill=\\\"LANDF\\\" />\\n <path d=\\\"M 24.0 18.2 L 22.4 20.2 L 28.9 23.7 L 24.0 18.2\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 10.3 20.6 L 8.6 18.5 L 3.8 24.1 L 10.3 20.6 Z\\\" fill=\\\"LANDF\\\" />\\n <path d=\\\"M 10.3 20.6 L 8.6 18.5 L 3.8 24.1 L 10.3 20.6\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 15.3 22.1 L 12.8 21.2 L 11.3 28.5 L 15.3 22.1 Z\\\" fill=\\\"LANDF\\\" />\\n <path d=\\\"M 15.3 22.1 L 12.8 21.2 L 11.3 28.5 L 15.3 22.1\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 20.2 20.6 L 17.7 21.8 L 22.2 27.8 L 20.2 20.6 Z\\\" fill=\\\"LANDF\\\" />\\n <path d=\\\"M 20.2 20.6 L 17.7 21.8 L 22.2 27.8 L 20.2 20.6\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 20.3 11.3 L 22.4 12.9 L 25.8 6.4 L 20.4 11.3 L 20.3 11.3 Z\\\" fill=\\\"LANDF\\\" />\\n <path d=\\\"M 20.3 11.3 L 22.4 12.9 L 25.8 6.4 L 20.4 11.3 L 20.3 11.3\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 7.7 16.7 L 8.4 14.0 L 1.0 13.3 L 7.7 16.7 Z\\\" fill=\\\"LANDF\\\" />\\n <path d=\\\"M 7.7 16.7 L 8.4 14.0 L 1.0 13.3 L 7.7 16.7\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 15.0 11.2 L 17.7 10.7 L 15.1 3.5 L 14.9 11.2 L 15.0 11.2 Z\\\" fill=\\\"LANDF\\\" />\\n <path d=\\\"M 15.0 11.2 L 17.7 10.7 L 15.1 3.5 L 14.9 11.2 L 15.0 11.2\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 10.3 13.3 L 12.4 11.8 L 7.0 6.4 L 10.2 13.3 L 10.3 13.3 Z\\\" fill=\\\"LANDF\\\" />\\n <path d=\\\"M 10.3 13.3 L 12.4 11.8 L 7.0 6.4 L 10.2 13.3 L 10.3 13.3\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"HILTOP11\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 24.0 14.3 L 24.7 16.9 L 31.0 13.6 L 24.0 14.3 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 24.0 14.3 L 24.7 16.9 L 31.0 13.6 L 24.0 14.3\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 24.0 18.2 L 22.4 20.2 L 28.9 23.7 L 24.0 18.2 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 24.0 18.2 L 22.4 20.2 L 28.9 23.7 L 24.0 18.2\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 10.3 20.6 L 8.6 18.5 L 3.8 24.1 L 10.3 20.6 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 10.3 20.6 L 8.6 18.5 L 3.8 24.1 L 10.3 20.6\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 15.3 22.1 L 12.8 21.2 L 11.3 28.5 L 15.3 22.1 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 15.3 22.1 L 12.8 21.2 L 11.3 28.5 L 15.3 22.1\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 20.2 20.6 L 17.7 21.8 L 22.2 27.8 L 20.2 20.6 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 20.2 20.6 L 17.7 21.8 L 22.2 27.8 L 20.2 20.6\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 20.3 11.3 L 22.4 12.9 L 25.8 6.4 L 20.4 11.3 L 20.3 11.3 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 20.3 11.3 L 22.4 12.9 L 25.8 6.4 L 20.4 11.3 L 20.3 11.3\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 7.7 16.7 L 8.4 14.0 L 1.0 13.3 L 7.7 16.7 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 7.7 16.7 L 8.4 14.0 L 1.0 13.3 L 7.7 16.7\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 15.0 11.2 L 17.7 10.7 L 15.1 3.5 L 14.9 11.2 L 15.0 11.2 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 15.0 11.2 L 17.7 10.7 L 15.1 3.5 L 14.9 11.2 L 15.0 11.2\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 10.3 13.3 L 12.4 11.8 L 7.0 6.4 L 10.2 13.3 L 10.3 13.3 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 10.3 13.3 L 12.4 11.8 L 7.0 6.4 L 10.2 13.3 L 10.3 13.3\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"HRBFAC09\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 6.1 15.9 L 7.4 14.7 L 9.2 13.0 L 10.8 12.1 L 12.4 11.3 L 14.3 10.5 L 15.6 10.1 L 17.5 10.0 L 19.0 10.0 L 20.7 10.0 L 22.8 10.5 L 24.4 11.0 L 26.2 11.7 L 28.0 12.7 L 29.3 13.8 L 30.4 14.8 L 31.0 15.9 L 29.6 17.2 L 27.8 19.0 L 25.7 20.0 L 24.1 20.7 L 22.0 21.2 L 20.3 21.5 L 19.0 21.5 L 17.2 21.5 L 15.6 21.2 L 14.3 21.1 L 13.3 20.7 L 11.6 20.0 L 10.0 19.0 L 8.7 17.8 L 7.4 17.2 L 6.9 16.6 L 6.1 15.9\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 6.1 15.9 L 1.5 20.4 L 1.3 19.0 L 1.0 17.2 L 1.0 15.6 L 1.0 13.5 L 1.5 11.4 L 2.1 10.5 L 6.1 15.9\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 5.5 5.7 L 7.7 3.7 L 9.2 2.7 L 11.4 1.8 L 14.5 1.2 L 17.5 1.0 L 20.4 1.5 L 22.7 2.3 L 24.7 3.6 L 27.0 5.7 L 28.7 7.7 L 29.3 8.4\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 5.2 26.0 L 7.6 28.3 L 10.1 29.6 L 12.0 30.4 L 14.0 30.8 L 16.6 31.0 L 18.2 31.0 L 20.3 30.5 L 22.5 29.7 L 24.6 28.4 L 26.2 27.1 L 27.6 25.9 L 29.4 23.7\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"HULKES01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.2 22.0 L 4.3 23.0 L 7.8 23.6 L 10.8 24.2 L 13.5 24.2 L 16.6 23.2 L 18.7 23.0 L 21.2 22.0 L 23.3 21.1 L 24.9 20.1 L 27.4 19.0 L 28.9 18.0 L 29.8 16.9 L 31.0 16.5 L 29.8 15.0 L 28.3 13.4 L 26.4 12.4 L 24.7 11.3 L 22.8 10.3 L 20.6 9.4 L 19.1 8.8 L 16.8 8.4 L 14.5 7.8 L 12.4 7.8 L 10.8 7.8 L 8.9 8.2 L 7.4 8.2 L 5.2 8.8 L 3.7 9.2 L 2.8 9.7 L 1.2 10.3 L 1.2 22.0 L 1.2 22.0 Z\\\" fill=\\\"CHBRN\\\" />\\n <path d=\\\"M 1.2 22.0 L 4.3 23.0 L 7.8 23.6 L 10.8 24.2 L 13.5 24.2 L 16.6 23.2 L 18.7 23.0 L 21.2 22.0 L 23.3 21.1 L 24.9 20.1 L 27.4 19.0 L 28.9 18.0 L 29.8 16.9 L 31.0 16.5 L 29.8 15.0 L 28.3 13.4 L 26.4 12.4 L 24.7 11.3 L 22.8 10.3 L 20.6 9.4 L 19.1 8.8 L 16.8 8.4 L 14.5 7.8 L 12.4 7.8 L 10.8 7.8 L 8.9 8.2 L 7.4 8.2 L 5.2 8.8 L 3.7 9.2 L 2.8 9.7 L 1.2 10.3 L 1.2 22.0 L 1.2 22.0\\\" fill=\\\"none\\\" stroke=\\\"CHBRN\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.2 22.0 L 1.2 10.3\\\" fill=\\\"none\\\" stroke=\\\"CSTLN\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 10.5 L 4.9 8.6 L 10.0 7.8 L 14.6 7.8 L 19.7 8.8 L 24.5 11.3 L 29.1 14.0 L 31.0 16.2 L 26.2 19.8 L 21.6 22.0 L 17.9 23.4 L 12.9 24.2 L 11.0 24.2 L 7.9 23.7 L 1.2 22.2\\\" fill=\\\"none\\\" stroke=\\\"CSTLN\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"INFARE51\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 9.6 26.4 L 26.0 26.4\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 13.9 3.1 L 14.2 6.6\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 31.0 L 31.0 31.0 L 30.9 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.1 30.8 L 1.1 1.0 L 30.7 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 17.6 26.4 L 17.6 11.0 L 10.9 11.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"INFORM01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 21.7 10.3 L 31.0 10.3 L 31.0 1.0 L 21.7 1.0 L 21.7 10.3\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 26.1 2.3 L 26.1 3.1\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 26.3 8.6 L 26.3 4.2 L 24.6 4.2\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 24.4 8.6 L 27.6 8.6\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"3.02\\\" cy=\\\"28.95\\\" r=\\\"2.02\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 21.6 10.3 L 4.4 27.5\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"ISODGR01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 16.0 1.0 L 26.7 5.3 L 31.0 16.0 L 26.7 26.7 L 16.0 31.0 L 5.3 26.7 L 1.0 16.0 L 5.3 5.3 L 16.0 1.0 L 16.0 12.8 L 21.9 6.9 L 25.1 10.1 L 19.2 16.0 L 25.1 21.9 L 21.9 25.1 L 16.0 19.2 L 10.1 25.1 L 6.9 21.9 L 12.8 16.0 L 6.9 10.1 L 10.1 6.9 L 16.0 12.8 L 16.0 1.0 Z\\\" fill=\\\"ISDNG\\\" />\\n <path d=\\\"M 16.0 1.0 L 26.7 5.3 L 31.0 16.0 L 26.7 26.7 L 16.0 31.0 L 5.3 26.7 L 1.0 16.0 L 5.3 5.3 L 16.0 1.0 L 16.0 12.8 L 21.9 6.9 L 25.1 10.1 L 19.2 16.0 L 25.1 21.9 L 21.9 25.1 L 16.0 19.2 L 10.1 25.1 L 6.9 21.9 L 12.8 16.0 L 6.9 10.1 L 10.1 6.9 L 16.0 12.8 L 16.0 1.0\\\" fill=\\\"none\\\" stroke=\\\"ISDNG\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 16.0 L 5.3 5.3 L 16.0 1.0 L 26.7 5.3 L 31.0 16.0 L 26.7 26.7 L 16.0 31.0 L 5.3 26.7 L 1.0 16.0\\\" fill=\\\"none\\\" stroke=\\\"ISDNG\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"ITZARE51\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 4.7 27.8 L 4.7 4.2\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 23.1 4.3 L 23.1 27.8\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 4.3 L 8.7 4.3\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.3 27.7 L 8.7 27.7\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 15.1 4.3 L 31.0 4.3\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"LIGHTDEF\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 16.3 31.0 L 10.9 6.9 L 10.9 5.8 L 11.2 4.2 L 12.0 2.8 L 12.8 2.1 L 14.1 1.0 L 16.0 1.0 L 17.6 1.0 L 18.7 1.3 L 20.3 2.3 L 20.8 3.9 L 21.1 5.3 L 21.1 6.6 L 16.3 31.0 Z\\\" fill=\\\"CHMGD\\\" />\\n <path d=\\\"M 16.3 31.0 L 10.9 6.9 L 10.9 5.8 L 11.2 4.2 L 12.0 2.8 L 12.8 2.1 L 14.1 1.0 L 16.0 1.0 L 17.6 1.0 L 18.7 1.3 L 20.3 2.3 L 20.8 3.9 L 21.1 5.3 L 21.1 6.6 L 16.3 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.3 31.0 L 10.9 6.4 L 10.9 4.7 L 11.4 3.1 L 12.3 2.3 L 13.6 1.3 L 15.2 1.0 L 16.3 1.0 L 17.6 1.0 L 18.9 1.5 L 20.0 2.6 L 20.8 4.2 L 21.1 5.3 L 20.8 7.7 L 16.3 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"LIGHTHOUSE01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <rect x=\\\"6\\\" y=\\\"26\\\" width=\\\"20\\\" height=\\\"4\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 9 26 L 12 8 L 20 8 L 23 26 Z\\\" fill=\\\"CHBLK\\\" />\\n <rect x=\\\"13\\\" y=\\\"4\\\" width=\\\"6\\\" height=\\\"4\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 12 4 L 16 1 L 20 4 Z\\\" fill=\\\"CHBLK\\\" />\\n</svg>\\n\",\n \"LIGHTS11\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <g transform=\\\"translate(10 10) rotate(135) scale(0.9) translate(-16.3 -28)\\\" fill=\\\"LITRD\\\">\\n <path d=\\\"M 16.3 28 L 11.8 7.1 L 11.8 6.3 L 11.8 4.9 L 12.4 3.5 L 13.2 3 L 14.3 2.1 L 16 1.9 L 17.4 2.1 L 18.5 2.4 L 19.6 3.2 L 20.2 4.6 L 20.4 5.7 L 20.4 6.9 L 16.3 28 Z\\\" />\\n </g>\\n</svg>\\n\",\n \"LIGHTS12\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 16.3 28.0 L 11.8 7.1 L 11.8 6.3 L 11.8 4.9 L 12.4 3.5 L 13.2 3.0 L 14.3 2.1 L 16.0 1.9 L 17.4 2.1 L 18.5 2.4 L 19.6 3.2 L 20.2 4.6 L 20.4 5.7 L 20.4 6.9 L 16.3 28.0 Z\\\" fill=\\\"LITGN\\\" />\\n <path d=\\\"M 16.3 28.0 L 11.8 7.1 L 11.8 6.3 L 11.8 4.9 L 12.4 3.5 L 13.2 3.0 L 14.3 2.1 L 16.0 1.9 L 17.4 2.1 L 18.5 2.4 L 19.6 3.2 L 20.2 4.6 L 20.4 5.7 L 20.4 6.9 L 16.3 28.0\\\" fill=\\\"none\\\" stroke=\\\"LITGN\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 21.3 5.2 L 21.0 6.6 L 16.3 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.3 28.0 L 11.5 6.6 L 11.8 5.2 L 12.1 4.1 L 12.9 3.2 L 14.1 2.1 L 15.4 1.9 L 16.3 1.9 L 17.4 2.1 L 18.8 2.7 L 19.6 3.5 L 20.2 4.6 L 20.4 5.7 L 20.2 7.7 L 16.3 28.0\\\" fill=\\\"none\\\" stroke=\\\"LITGN\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.3 31.0 L 10.7 6.0 L 11.5 3.5 L 13.8 1.6 L 16.3 1.0 L 18.5 1.9 L 19.9 2.7 L 21.0 4.9\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"LIGHTS13\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <g transform=\\\"translate(10 10) rotate(135) scale(0.9) translate(-16.3 -28)\\\" fill=\\\"LITYW\\\">\\n <path d=\\\"M 16.3 28 L 11.8 7.1 L 11.8 6.3 L 11.8 4.9 L 12.4 3.5 L 13.2 3 L 14.3 2.1 L 16 1.9 L 17.4 2.1 L 18.5 2.4 L 19.6 3.2 L 20.2 4.6 L 20.4 5.7 L 20.4 6.9 L 16.3 28 Z\\\" />\\n </g>\\n</svg>\\n\",\n \"LIGHTS14\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 16.3 28.0 L 11.8 7.1 L 11.8 6.3 L 11.8 4.9 L 12.4 3.5 L 13.2 3.0 L 14.3 2.1 L 16.0 1.9 L 17.4 2.1 L 18.5 2.4 L 19.6 3.2 L 20.2 4.6 L 20.4 5.7 L 20.4 6.9 L 16.3 28.0 Z\\\" fill=\\\"CHMGD\\\" />\\n <path d=\\\"M 16.3 28.0 L 11.8 7.1 L 11.8 6.3 L 11.8 4.9 L 12.4 3.5 L 13.2 3.0 L 14.3 2.1 L 16.0 1.9 L 17.4 2.1 L 18.5 2.4 L 19.6 3.2 L 20.2 4.6 L 20.4 5.7 L 20.4 6.9 L 16.3 28.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 21.3 5.2 L 21.0 6.6 L 16.3 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.3 28.0 L 11.5 6.6 L 11.8 5.2 L 12.1 4.1 L 12.9 3.2 L 14.1 2.1 L 15.4 1.9 L 16.3 1.9 L 17.4 2.1 L 18.8 2.7 L 19.6 3.5 L 20.2 4.6 L 20.4 5.7 L 20.2 7.7 L 16.3 28.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.3 31.0 L 10.7 6.0 L 11.5 3.5 L 13.8 1.6 L 16.3 1.0 L 18.5 1.9 L 19.9 2.7 L 21.0 4.9\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"LIGHTS81\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 25.9 L 6.9 5.9 L 12.9 26.0 L 19.0 5.9 L 25.0 26.1 L 31.0 5.9\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"LIGHTS82\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"6.96\\\" cy=\\\"17.80\\\" r=\\\"5.96\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 14.9 23.1 L 25.9 23.5\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 13.3 12.1 L 28.0 8.2\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 15.8 17.5 L 31.0 16.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"LITDEF11\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 16.3 31.0 L 10.9 6.9 L 10.9 5.8 L 11.2 4.2 L 12.0 2.8 L 12.8 2.1 L 14.1 1.0 L 16.0 1.0 L 17.6 1.0 L 18.7 1.3 L 20.3 2.3 L 20.8 3.9 L 21.1 5.3 L 21.1 6.6 L 16.3 31.0 Z\\\" fill=\\\"CHMGD\\\" />\\n <path d=\\\"M 16.3 31.0 L 10.9 6.9 L 10.9 5.8 L 11.2 4.2 L 12.0 2.8 L 12.8 2.1 L 14.1 1.0 L 16.0 1.0 L 17.6 1.0 L 18.7 1.3 L 20.3 2.3 L 20.8 3.9 L 21.1 5.3 L 21.1 6.6 L 16.3 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.3 31.0 L 10.9 6.4 L 10.9 4.7 L 11.4 3.1 L 12.3 2.3 L 13.6 1.3 L 15.2 1.0 L 16.3 1.0 L 17.6 1.0 L 18.9 1.5 L 20.0 2.6 L 20.8 4.2 L 21.1 5.3 L 20.8 7.7 L 16.3 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"LITFLT01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"18.97\\\" r=\\\"2.40\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 1.0 19.0 L 12.7 19.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 6.0 19.0 L 2.7 12.3\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 26.0 19.0 L 29.3 12.3\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 11.0 14.0 L 12.7 10.6 L 19.3 10.6 L 21.0 14.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 2.7 12.3 L 9.3 14.0 L 22.7 14.0 L 29.3 12.3\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 19.3 19.0 L 31.0 19.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"LITFLT02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 13.0 L 5.6 21.5 L 26.9 21.5 L 31.0 12.9 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 1.0 13.0 L 5.6 21.5 L 26.9 21.5 L 31.0 12.9\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 12.9 L 5.6 21.5 L 26.9 21.5 L 30.9 12.9 L 1.0 12.9 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 1.0 12.9 L 5.6 21.5 L 26.9 21.5 L 30.9 12.9 L 1.0 12.9\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 10.9 12.9 L 10.9 10.5 L 21.2 10.5 L 21.2 12.9\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"LITVES01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"24.83\\\" r=\\\"2.33\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 1.0 24.8 L 12.7 24.8\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 6.0 24.8 L 2.7 16.5\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 26.0 24.8 L 29.3 16.5\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 19.0 L 16.0 9.8\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 9.3 19.0 L 9.3 13.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 22.7 19.0 L 22.7 13.2\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 9.8 L 16.0 4.8\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 12.7 6.5 L 19.3 9.8\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 12.7 9.8 L 19.3 6.5\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 4.7 21.5 L 10.2 21.5\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 21.8 21.5 L 27.3 21.5\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 2.7 16.5 L 9.2 19.0 L 16.0 19.0 L 22.7 19.0 L 29.3 16.5\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 19.3 24.8 L 31.0 24.8\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"LITVES02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 5.9 23.3 L 1.0 15.1 L 31.0 15.1 L 25.6 23.3 L 5.9 23.3 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 5.9 23.3 L 1.0 15.1 L 31.0 15.1 L 25.6 23.3 L 5.9 23.3\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 15.1 L 16.0 8.7\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"LNDARE01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"13.54\\\" fill=\\\"none\\\" stroke=\\\"LANDA\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 16.0 16.0 Z\\\" fill=\\\"LANDA\\\" />\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"CSTLN\\\" stroke-width=\\\"1.2\\\" />\\n</svg>\\n\",\n \"LNDMRK18\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <line x1=\\\"16\\\" y1=\\\"28\\\" x2=\\\"16\\\" y2=\\\"10\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.5\\\"/>\\n <circle cx=\\\"16\\\" cy=\\\"10\\\" r=\\\"2\\\" fill=\\\"CHBLK\\\"/>\\n <line x1=\\\"16\\\" y1=\\\"10\\\" x2=\\\"6\\\" y2=\\\"2\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\"/>\\n <line x1=\\\"16\\\" y1=\\\"10\\\" x2=\\\"26\\\" y2=\\\"2\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\"/>\\n <line x1=\\\"16\\\" y1=\\\"10\\\" x2=\\\"6\\\" y2=\\\"18\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\"/>\\n <line x1=\\\"16\\\" y1=\\\"10\\\" x2=\\\"26\\\" y2=\\\"18\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\"/>\\n <circle cx=\\\"16\\\" cy=\\\"16\\\" r=\\\"7\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.6\\\" stroke-dasharray=\\\"2,2\\\"/>\\n</svg>\\n\",\n \"LNDMRK19\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <line x1=\\\"16\\\" y1=\\\"28\\\" x2=\\\"16\\\" y2=\\\"10\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.5\\\"/>\\n <circle cx=\\\"16\\\" cy=\\\"10\\\" r=\\\"1.5\\\" fill=\\\"CHBLK\\\"/>\\n <line x1=\\\"16\\\" y1=\\\"10\\\" x2=\\\"16\\\" y2=\\\"2\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\"/>\\n <line x1=\\\"16\\\" y1=\\\"10\\\" x2=\\\"9\\\" y2=\\\"17\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\"/>\\n <line x1=\\\"16\\\" y1=\\\"10\\\" x2=\\\"23\\\" y2=\\\"17\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\"/>\\n <circle cx=\\\"16\\\" cy=\\\"16\\\" r=\\\"7\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.6\\\" stroke-dasharray=\\\"2,2\\\"/>\\n</svg>\\n\",\n \"LOCMAG01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 18.9 22.5 L 18.9 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 18.9 23.4 L 18.9 1.0 L 13.1 17.9 L 14.2 18.3 L 15.1 18.7 L 15.9 19.4 L 16.4 20.0 L 17.0 20.6 L 17.8 21.6 L 18.3 22.4 L 18.8 23.3\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"LOCMAG51\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 18.9 23.6 L 18.9 1.0 L 13.0 18.1 L 14.1 18.5 L 15.0 18.9 L 15.8 19.6 L 16.4 20.2 L 17.0 20.8 L 17.7 21.8 L 18.3 22.6 L 18.8 23.5\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 19.0 23.5 L 19.0 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"LOWACC01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 4.5 10.2 L 5.8 10.2\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 5.0 8.0 L 5.0 6.6 L 5.0 6.1 L 5.4 5.6 L 5.7 5.2 L 6.3 4.5 L 6.6 3.9 L 6.8 3.2 L 6.6 2.5 L 6.3 2.0 L 5.8 1.5 L 5.3 1.1 L 4.8 1.1 L 4.2 1.0 L 3.7 1.1 L 3.2 1.4 L 2.7 1.9 L 2.4 2.4 L 2.3 2.8 L 2.3 3.3 L 2.4 3.7 L 2.5 3.8\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 6.8 8.1 L 29.7 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"MAGVAR01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 19.0 23.8 L 19.0 1.0 L 13.0 18.2 L 14.2 18.6 L 15.1 19.1 L 15.9 19.7 L 16.4 20.4 L 17.1 21.0 L 17.8 22.0 L 18.3 22.8 L 18.9 23.7 L 19.0 23.8 Z\\\" fill=\\\"CHMGD\\\" />\\n <path d=\\\"M 19.0 23.8 L 19.0 1.0 L 13.0 18.2 L 14.2 18.6 L 15.1 19.1 L 15.9 19.7 L 16.4 20.4 L 17.1 21.0 L 17.8 22.0 L 18.3 22.8 L 18.9 23.7 L 19.0 23.8\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 18.8 1.0 L 18.8 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"MAGVAR51\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 19.0 23.7 L 19.0 1.0 L 13.0 18.2 L 14.2 18.5 L 15.1 19.0 L 15.9 19.6 L 16.4 20.3 L 17.1 20.9 L 17.8 21.9 L 18.3 22.7 L 18.9 23.6 L 19.0 23.7 Z\\\" fill=\\\"CHMGF\\\" />\\n <path d=\\\"M 19.0 23.7 L 19.0 1.0 L 13.0 18.2 L 14.2 18.5 L 15.1 19.0 L 15.9 19.6 L 16.4 20.3 L 17.1 20.9 L 17.8 21.9 L 18.3 22.7 L 18.9 23.6 L 19.0 23.7\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 18.9 23.5 L 18.9 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"MARCUL02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 4.8 19.3 L 10.6 14.1 L 13.7 12.4 L 16.1 11.7 L 18.3 11.4 L 20.8 11.9 L 23.5 12.7 L 25.2 13.8 L 26.6 14.9 L 27.5 16.2 L 26.0 17.4 L 24.5 18.6 L 22.2 19.6 L 20.4 20.2 L 18.1 20.3 L 15.8 20.2 L 13.5 19.7 L 11.8 18.8 L 4.8 13.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 11.7 L 1.0 7.5 L 30.8 7.5 L 30.8 11.6\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 20.3 L 1.0 24.6 L 31.0 24.6 L 31.0 20.3\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 7.3 20.3 L 7.3 24.6\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 24.4 20.3 L 24.4 24.6\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 15.9 20.3 L 15.9 24.4\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 7.3 7.6 L 7.3 11.9\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 24.4 7.5 L 24.4 11.8\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 15.8 7.4 L 15.8 11.7\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"MONUMT02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"27.31\\\" r=\\\"3.69\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 1.2 27.3 L 11.3 27.3\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 19.7 27.3 L 30.8 27.3\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 20.4 1.5 L 8.8 13.6\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 21.5 9.3 L 8.6 23.6\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 22.4 18.5 L 17.8 23.6\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 7.0 27.2 L 10.3 1.0 L 20.5 1.2 L 23.4 27.1\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"MONUMT12\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"27.31\\\" r=\\\"3.69\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 1.2 27.3 L 11.3 27.3\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 19.7 27.3 L 30.8 27.3\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 20.4 1.5 L 8.8 13.6\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 21.5 9.3 L 8.6 23.6\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 22.4 18.5 L 17.8 23.6\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 7.0 27.2 L 10.3 1.0 L 20.5 1.2 L 23.4 27.1\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"MORFAC03\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 1.0 L 31.0 1.0 L 31.0 31.0 L 1.2 31.0 L 1.0 1.0 Z\\\" fill=\\\"LANDA\\\" />\\n <path d=\\\"M 1.0 1.0 L 31.0 1.0 L 31.0 31.0 L 1.2 31.0 L 1.0 1.0\\\" fill=\\\"none\\\" stroke=\\\"LANDA\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 1.0 L 31.0 1.0 L 31.0 31.0 L 1.2 31.0 L 1.0 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"MORFAC04\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 5.6 31.0 L 26.4 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 7.9 31.0 L 10.6 9.5 L 21.4 9.5 L 23.8 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.1 30.9 L 16.1 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"MSTCON04\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"28.69\\\" r=\\\"2.31\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 9.1 28.7 L 13.7 28.7\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 18.3 28.7 L 22.9 28.7\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 13.7 28.7 L 16.0 1.0 L 18.3 28.7\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"MSTCON14\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"28.69\\\" r=\\\"2.31\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 9.1 28.7 L 13.7 28.7\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 18.3 28.7 L 22.9 28.7\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 13.7 28.7 L 16.0 1.0 L 18.3 28.7\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"NMKINF01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 6.0 L 11.5 6.0 L 11.5 26.0 L 1.0 25.5 L 1.0 6.0 Z\\\" fill=\\\"CHGRN\\\" />\\n <path d=\\\"M 1.0 6.0 L 11.5 6.0 L 11.5 26.0 L 1.0 25.5 L 1.0 6.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRN\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 20.5 6.0 L 31.0 6.0 L 31.0 26.0 L 20.5 26.0 L 20.5 6.0 Z\\\" fill=\\\"CHGRN\\\" />\\n <path d=\\\"M 20.5 6.0 L 31.0 6.0 L 31.0 26.0 L 20.5 26.0 L 20.5 6.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRN\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 11.5 6.0 L 20.5 6.0 L 20.5 26.0 L 11.5 26.0 L 11.5 6.0 Z\\\" fill=\\\"CHWHT\\\" />\\n <path d=\\\"M 11.5 6.0 L 20.5 6.0 L 20.5 26.0 L 11.5 26.0 L 11.5 6.0\\\" fill=\\\"none\\\" stroke=\\\"CHWHT\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 6.0 L 31.0 6.0 L 31.0 26.0 L 1.0 26.0 L 1.0 6.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"NMKPRH02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 6.0 L 31.0 6.0 L 31.0 13.0 L 1.0 13.0 L 1.0 6.0 Z\\\" fill=\\\"CHRED\\\" />\\n <path d=\\\"M 1.0 6.0 L 31.0 6.0 L 31.0 13.0 L 1.0 13.0 L 1.0 6.0\\\" fill=\\\"none\\\" stroke=\\\"CHRED\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 19.0 L 31.0 19.0 L 31.0 26.0 L 1.0 26.0 L 1.0 19.0 Z\\\" fill=\\\"CHRED\\\" />\\n <path d=\\\"M 1.0 19.0 L 31.0 19.0 L 31.0 26.0 L 1.0 26.0 L 1.0 19.0\\\" fill=\\\"none\\\" stroke=\\\"CHRED\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 13.0 L 31.0 13.0 L 31.0 19.0 L 1.0 19.0 L 1.0 13.0 Z\\\" fill=\\\"CHWHT\\\" />\\n <path d=\\\"M 1.0 13.0 L 31.0 13.0 L 31.0 19.0 L 1.0 19.0 L 1.0 13.0\\\" fill=\\\"none\\\" stroke=\\\"CHWHT\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 6.0 L 31.0 6.0 L 31.0 26.0 L 1.0 26.0 L 1.0 6.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"NMKPRH12\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 16.0 L 16.0 1.0 L 16.0 31.0 L 1.0 16.0 Z\\\" fill=\\\"CHRED\\\" />\\n <path d=\\\"M 1.0 16.0 L 16.0 1.0 L 16.0 31.0 L 1.0 16.0\\\" fill=\\\"none\\\" stroke=\\\"CHRED\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 31.0 16.0 L 16.0 31.0 L 16.0 1.0 L 31.0 16.0 Z\\\" fill=\\\"CHWHT\\\" />\\n <path d=\\\"M 31.0 16.0 L 16.0 31.0 L 16.0 1.0 L 31.0 16.0\\\" fill=\\\"none\\\" stroke=\\\"CHWHT\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 16.0 L 16.0 1.0 L 31.0 16.0 L 16.0 31.0 L 1.0 16.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"NMKPRH13\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 16.0 L 16.0 1.0 L 16.0 31.0 L 1.0 16.0 Z\\\" fill=\\\"CHWHT\\\" />\\n <path d=\\\"M 1.0 16.0 L 16.0 1.0 L 16.0 31.0 L 1.0 16.0\\\" fill=\\\"none\\\" stroke=\\\"CHWHT\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 31.0 16.0 L 16.0 31.0 L 16.0 1.0 L 31.0 16.0 Z\\\" fill=\\\"CHRED\\\" />\\n <path d=\\\"M 31.0 16.0 L 16.0 31.0 L 16.0 1.0 L 31.0 16.0\\\" fill=\\\"none\\\" stroke=\\\"CHRED\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 16.0 L 16.0 1.0 L 31.0 16.0 L 16.0 31.0 L 1.0 16.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"NMKRCD01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 16.0 L 16.0 1.0 L 31.0 16.0 L 16.0 31.0 L 1.0 16.0 Z\\\" fill=\\\"CHYLW\\\" />\\n <path d=\\\"M 1.0 16.0 L 16.0 1.0 L 31.0 16.0 L 16.0 31.0 L 1.0 16.0\\\" fill=\\\"none\\\" stroke=\\\"CHYLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 16.0 L 16.0 1.0 L 31.0 16.0 L 16.0 31.0 L 1.0 16.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"NMKRCD02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 16.0 L 7.7 9.3 L 14.3 16.0 L 7.7 22.7 L 1.0 16.0 Z\\\" fill=\\\"CHYLW\\\" />\\n <path d=\\\"M 1.0 16.0 L 7.7 9.3 L 14.3 16.0 L 7.7 22.7 L 1.0 16.0\\\" fill=\\\"none\\\" stroke=\\\"CHYLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 17.7 16.0 L 24.3 9.3 L 31.0 16.0 L 24.3 22.7 L 17.7 16.0 Z\\\" fill=\\\"CHYLW\\\" />\\n <path d=\\\"M 17.7 16.0 L 24.3 9.3 L 31.0 16.0 L 24.3 22.7 L 17.7 16.0\\\" fill=\\\"none\\\" stroke=\\\"CHYLW\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 16.0 L 7.7 9.3 L 14.3 16.0 L 7.7 22.7 L 1.0 16.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 17.7 16.0 L 24.3 9.3 L 31.0 16.0 L 24.3 22.7 L 17.7 16.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"NMKRCD03\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 16.0 L 16.0 1.0 L 16.0 31.0 L 1.0 16.0 Z\\\" fill=\\\"CHWHT\\\" />\\n <path d=\\\"M 1.0 16.0 L 16.0 1.0 L 16.0 31.0 L 1.0 16.0\\\" fill=\\\"none\\\" stroke=\\\"CHWHT\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 31.0 16.0 L 16.0 31.0 L 16.0 1.0 L 31.0 16.0 Z\\\" fill=\\\"CHGRN\\\" />\\n <path d=\\\"M 31.0 16.0 L 16.0 31.0 L 16.0 1.0 L 31.0 16.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRN\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 16.0 L 16.0 1.0 L 31.0 16.0 L 16.0 31.0 L 1.0 16.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"NMKRCD04\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 16.0 L 16.0 1.0 L 16.0 31.0 L 1.0 16.0 Z\\\" fill=\\\"CHGRN\\\" />\\n <path d=\\\"M 1.0 16.0 L 16.0 1.0 L 16.0 31.0 L 1.0 16.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRN\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 31.0 16.0 L 16.0 31.0 L 16.0 1.0 L 31.0 16.0 Z\\\" fill=\\\"CHWHT\\\" />\\n <path d=\\\"M 31.0 16.0 L 16.0 31.0 L 16.0 1.0 L 31.0 16.0\\\" fill=\\\"none\\\" stroke=\\\"CHWHT\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 16.0 L 16.0 1.0 L 31.0 16.0 L 16.0 31.0 L 1.0 16.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"NORTHAR1\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 16.3 31.0 L 16.3 1.0\\\" fill=\\\"none\\\" stroke=\\\"SCLBR\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 12.8 20.7 L 12.8 14.1 L 19.6 20.7 L 19.6 14.2\\\" fill=\\\"none\\\" stroke=\\\"SCLBR\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 12.4 8.9 L 19.6 8.9 L 16.2 1.1 L 12.4 8.9 Z\\\" fill=\\\"SCLBR\\\" />\\n <path d=\\\"M 12.4 8.9 L 19.6 8.9 L 16.2 1.1 L 12.4 8.9\\\" fill=\\\"none\\\" stroke=\\\"SCLBR\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"NOTBRD11\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 8.5 31.0 L 23.5 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 31.0 L 16.0 16.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 4.8 16.0 L 27.3 16.0 L 27.3 1.0 L 4.8 1.0 L 4.8 16.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"OBSTRN01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <!-- S-52 PresLib OBSTRN01 / INT1 K40: obstruction, position-fixed (fish weir,\\n snag, sunken object, foul ground point). NOAA portrayal: bold \\\"+\\\" cross\\n inside a dashed oval. The dashed boundary (longer dashes than the dotted\\n K41 variant) signals \\\"area of obstruction\\\" — mariners should give the\\n feature a wide berth even when its precise extent is unclear. 18-unit\\n cross with 1.6 stroke for harbor-zoom visibility. -->\\n <ellipse cx=\\\"16\\\" cy=\\\"16\\\" rx=\\\"13\\\" ry=\\\"10\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.0\\\" stroke-dasharray=\\\"1.8,1.4\\\" />\\n <path d=\\\"M 16 7 L 16 25\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.6\\\" stroke-linecap=\\\"round\\\" />\\n <path d=\\\"M 7 16 L 25 16\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.6\\\" stroke-linecap=\\\"round\\\" />\\n</svg>\\n\",\n \"OBSTRN02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\"></svg>\\n\",\n \"OBSTRN03\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <!-- S-52 PresLib OBSTRN03 / INT1 K41: obstruction always submerged with\\n sounded depth (WATLEV=3). NOAA portrayal: bold \\\"+\\\" cross inside a\\n DOTTED oval (shorter, tighter dashes than OBSTRN01's dashed style).\\n Depth rendered separately via VALSOU label. 18-unit cross matching\\n UWTROC bold weight for visual hazard consistency. -->\\n <ellipse cx=\\\"16\\\" cy=\\\"16\\\" rx=\\\"13\\\" ry=\\\"10\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.9\\\" stroke-dasharray=\\\"1.0,1.2\\\" />\\n <path d=\\\"M 16 7 L 16 25\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.6\\\" stroke-linecap=\\\"round\\\" />\\n <path d=\\\"M 7 16 L 25 16\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.6\\\" stroke-linecap=\\\"round\\\" />\\n</svg>\\n\",\n \"OBSTRN18\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 1.0 L 1.0 31.0 L 31.0 31.0 L 30.8 1.0 L 1.0 1.0 Z\\\" fill=\\\"LANDA\\\" />\\n <path d=\\\"M 1.0 1.0 L 1.0 31.0 L 31.0 31.0 L 30.8 1.0 L 1.0 1.0\\\" fill=\\\"none\\\" stroke=\\\"LANDA\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 1.0 L 1.0 31.0 L 31.0 31.0 L 30.8 1.0 L 1.0 1.0\\\" fill=\\\"none\\\" stroke=\\\"CSTLN\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"OFSPLF01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"3.75\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 16.0 16.0 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 1.0 1.0 L 31.0 1.0 L 31.0 31.0 L 1.0 31.0 L 1.0 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"OSPONE02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 16.0 L 31.0 16.0\\\" fill=\\\"none\\\" stroke=\\\"SHIPS\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"OSPSIX02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 16.0 L 31.0 16.0\\\" fill=\\\"none\\\" stroke=\\\"SHIPS\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"OWNSHP01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"SHIPS\\\" stroke-width=\\\"1.2\\\" />\\n <circle cx=\\\"16.00\\\" cy=\\\"15.88\\\" r=\\\"7.89\\\" fill=\\\"none\\\" stroke=\\\"SHIPS\\\" stroke-width=\\\"1.2\\\" />\\n</svg>\\n\",\n \"OWNSHP05\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 17.8 1.0 L 19.5 5.5 L 19.6 31.0 L 12.5 31.0 L 12.4 5.6 L 14.1 1.1 L 17.8 1.0\\\" fill=\\\"none\\\" stroke=\\\"SHIPS\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"PASTRK01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 16.0 L 31.0 16.0\\\" fill=\\\"none\\\" stroke=\\\"PSTRK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"PASTRK02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 16.0 L 31.0 16.0\\\" fill=\\\"none\\\" stroke=\\\"SYTRK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"PILBOP02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 16.0 1.0 L 10.2 16.2 L 16.0 31.0 L 22.1 16.2 L 16.0 1.0 Z\\\" fill=\\\"CHMGD\\\" />\\n <path d=\\\"M 16.0 1.0 L 10.2 16.2 L 16.0 31.0 L 22.1 16.2 L 16.0 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"16.00\\\" cy=\\\"16.17\\\" r=\\\"14.77\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" />\\n</svg>\\n\",\n \"PILPNT02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 16.0 16.0 Z\\\" fill=\\\"CHBLK\\\" />\\n</svg>\\n\",\n \"PIPLIN01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"16\\\" height=\\\"16\\\" viewBox=\\\"0 0 16 16\\\">\\n <circle cx=\\\"8\\\" cy=\\\"8\\\" r=\\\"3.5\\\" fill=\\\"none\\\" stroke=\\\"PIPLN\\\" stroke-width=\\\"1.6\\\" />\\n</svg>\\n\",\n \"PIPOHD01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"16\\\" height=\\\"16\\\" viewBox=\\\"0 0 16 16\\\">\\n <path d=\\\"M 3 12 L 8 5 L 13 12\\\" fill=\\\"none\\\" stroke=\\\"PIPLN\\\" stroke-width=\\\"1.6\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <line x1=\\\"3\\\" y1=\\\"13\\\" x2=\\\"5\\\" y2=\\\"13\\\" stroke=\\\"PIPLN\\\" stroke-width=\\\"1.4\\\" stroke-linecap=\\\"round\\\" />\\n <line x1=\\\"11\\\" y1=\\\"13\\\" x2=\\\"13\\\" y2=\\\"13\\\" stroke=\\\"PIPLN\\\" stroke-width=\\\"1.4\\\" stroke-linecap=\\\"round\\\" />\\n</svg>\\n\",\n \"PLNPOS01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 15.9 L 1.4 14.3 L 3.4 12.5 L 6.7 11.2 L 10.2 10.6 L 15.6 10.2 L 21.2 10.6 L 25.0 11.2 L 28.2 12.5 L 30.3 14.3 L 31.0 15.9 L 30.8 18.0 L 28.2 19.7 L 25.0 20.8 L 21.2 21.8 L 15.6 21.8 L 10.2 21.8 L 6.7 21.0 L 2.9 19.7 L 1.1 18.1 L 1.0 15.9\\\" fill=\\\"none\\\" stroke=\\\"PLRTE\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"PLNPOS02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 16.0 L 31.0 16.0\\\" fill=\\\"none\\\" stroke=\\\"PLRTE\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"PLNSPD03\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 26.1 L 1.1 5.8 L 31.0 5.8 L 31.0 26.2 L 1.0 26.1\\\" fill=\\\"none\\\" stroke=\\\"PLRTE\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"PLNSPD04\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 26.1 L 1.1 5.8 L 31.0 5.8 L 31.0 26.2 L 1.0 26.1\\\" fill=\\\"none\\\" stroke=\\\"APLRT\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"POSGEN01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" />\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"3.75\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 16.0 16.0 Z\\\" fill=\\\"LANDF\\\" />\\n</svg>\\n\",\n \"POSGEN03\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" />\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"3.75\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 16.0 16.0 Z\\\" fill=\\\"CHBLK\\\" />\\n</svg>\\n\",\n \"POSGEN04\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" />\\n</svg>\\n\",\n \"POSITN02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.25\\\" cy=\\\"16.25\\\" r=\\\"14.75\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 16.3 1.0 L 16.3 31.0\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 16.3 L 31.0 16.3\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"PRCARE12\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 5.1 31.0 L 26.9 31.0 L 15.5 1.0 L 5.3 31.0\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 14.2 26.8 L 17.5 26.8\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 15.6 23.4 L 15.6 11.6\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"PRCARE51\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 4.0 31.0 L 16.0 1.0 L 28.0 31.0 L 4.0 31.0\\\" fill=\\\"none\\\" stroke=\\\"TRFCF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 23.2 L 16.0 12.4\\\" fill=\\\"none\\\" stroke=\\\"TRFCF\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 14.4 27.3 L 17.7 27.3\\\" fill=\\\"none\\\" stroke=\\\"TRFCF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"PRDINS02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 11.1 8.3 L 2.5 16.9 L 1.0 15.4 L 1.0 8.9 L 6.3 3.5 L 11.1 8.3 Z\\\" fill=\\\"CHBRN\\\" />\\n <path d=\\\"M 11.1 8.3 L 2.5 16.9 L 1.0 15.4 L 1.0 8.9 L 6.3 3.5 L 11.1 8.3\\\" fill=\\\"none\\\" stroke=\\\"CHBRN\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 20.9 8.6 L 25.7 3.5 L 31.0 8.9 L 31.0 15.1 L 29.2 16.9 L 20.9 8.6 Z\\\" fill=\\\"CHBRN\\\" />\\n <path d=\\\"M 20.9 8.6 L 25.7 3.5 L 31.0 8.9 L 31.0 15.1 L 29.2 16.9 L 20.9 8.6\\\" fill=\\\"none\\\" stroke=\\\"CHBRN\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 8.1 11.8 L 24.8 28.5\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 24.2 11.8 L 7.5 28.5\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 6.3 3.5 L 11.1 8.3 L 2.5 16.9 L 1.0 15.4 L 1.0 8.9 L 6.3 3.5\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 25.7 3.5 L 31.0 8.9 L 31.0 15.1 L 29.2 16.9 L 20.9 8.6 L 25.7 3.5\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"PRICKE03\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 7.6 31.0 L 22.0 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 14.5 31.0 L 14.5 17.2\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 5.9 15.7 L 10.2 20.7 L 14.5 21.9 L 19.7 21.5 L 24.2 19.3 L 26.1 17.2\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 9.6 6.4 L 12.8 9.0 L 14.9 9.4 L 18.6 9.2 L 22.0 6.2\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 17.3 1.0 L 16.4 3.4 L 14.9 9.4 L 14.5 17.2\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"PRICKE04\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 10.2 31.0 L 24.3 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 17.0 31.0 L 17.0 17.5\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 7.5 22.8 L 11.9 18.1 L 17.0 16.8 L 21.0 17.5 L 24.5 21.3\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 11.4 9.9 L 15.5 6.5 L 18.2 6.3 L 21.6 7.8 L 24.1 11.3\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 20.4 1.0 L 18.2 6.1 L 17.2 10.7 L 17.0 17.5\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"QUAPOS01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.1 3.4 L 1.1 29.1\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 3.3 L 9.5 3.3\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.1 16.3 L 9.5 16.3\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 12.4 5.4 L 12.4 13.8\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 9.5 3.2 L 12.5 5.4\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 9.5 16.1 L 12.5 13.8\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.5 28.6 L 23.5 2.9 L 31.0 28.8\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 19.4 17.7 L 27.8 17.7\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"QUARRY01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 12.9 10.5 L 6.4 17.0 L 5.3 15.9 L 5.3 11.0 L 9.3 6.9 L 12.9 10.5 Z\\\" fill=\\\"LANDF\\\" />\\n <path d=\\\"M 12.9 10.5 L 6.4 17.0 L 5.3 15.9 L 5.3 11.0 L 9.3 6.9 L 12.9 10.5\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 20.3 10.7 L 23.9 6.9 L 27.9 11.0 L 27.9 15.6 L 26.5 17.0 L 20.3 10.7 Z\\\" fill=\\\"LANDF\\\" />\\n <path d=\\\"M 20.3 10.7 L 23.9 6.9 L 27.9 11.0 L 27.9 15.6 L 26.5 17.0 L 20.3 10.7\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 10.7 13.2 L 23.2 25.7\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 22.7 13.2 L 10.2 25.7\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 9.3 6.9 L 12.9 10.5 L 6.4 17.0 L 5.3 15.9 L 5.3 11.0 L 9.3 6.9\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 23.9 6.9 L 27.9 11.0 L 27.9 15.6 L 26.5 17.0 L 20.3 10.7 L 23.9 6.9\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" />\\n</svg>\\n\",\n \"QUESMRK1\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 8.6 7.5 L 9.4 5.6 L 10.3 3.9 L 11.5 2.8 L 12.6 1.6 L 14.4 1.0 L 15.9 1.1 L 18.0 1.7 L 19.9 2.2 L 21.4 4.5 L 22.6 5.7 L 23.4 7.2 L 23.4 8.9 L 22.6 10.5 L 21.8 12.0 L 20.4 13.6 L 18.8 15.3 L 17.4 17.0 L 16.5 18.3 L 15.8 19.5 L 15.7 21.0 L 15.7 22.5 L 15.7 23.7 L 15.8 25.2 L 15.8 25.3\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 14.4 31.0 L 18.8 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"RACNSP01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.15\\\" cy=\\\"16.10\\\" r=\\\"7.33\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 16.2 8.8 L 16.2 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.1 23.5 L 16.1 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 23.5 16.0 L 30.9 16.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 8.8 16.0 L 1.1 16.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 21.3 21.2 L 26.7 26.6\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 26.6 5.7 L 21.2 11.1\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 10.8 21.3 L 5.4 26.7\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 5.6 5.7 L 11.0 11.1\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"RADRFL03\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.15\\\" cy=\\\"16.10\\\" r=\\\"7.33\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 16.2 8.8 L 16.2 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.1 23.5 L 16.1 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 23.5 16.0 L 30.9 16.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 8.8 16.0 L 1.1 16.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 21.3 21.2 L 26.7 26.6\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 26.6 5.7 L 21.2 11.1\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 10.8 21.3 L 5.4 26.7\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 5.6 5.7 L 11.0 11.1\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"RASCAN01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.28\\\" cy=\\\"28.24\\\" r=\\\"2.76\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 9.9 28.1 L 9.9 8.7\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 21.8 28.0 L 21.8 8.7 L 12.3 8.7\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 13.7 28.1 L 6.2 28.1\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 19.0 28.0 L 26.5 28.0\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 12.5 8.7 L 9.9 8.7\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 15.8 8.4 L 15.8 1.1\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 5.0 1.0 L 27.0 1.0\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"RASCAN11\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.28\\\" cy=\\\"28.24\\\" r=\\\"2.76\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 9.9 28.1 L 9.9 8.7\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 21.8 28.0 L 21.8 8.7 L 12.3 8.7\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 13.7 28.1 L 6.2 28.1\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 19.0 28.0 L 26.5 28.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 12.5 8.7 L 9.9 8.7\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 15.8 8.4 L 15.8 1.1\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 5.0 1.0 L 27.0 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"RCLDEF01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 13.6 L 1.3 12.9 L 1.6 12.2 L 2.1 11.8 L 2.5 11.4 L 3.1 11.2 L 3.7 11.2 L 4.4 11.4 L 5.1 11.6 L 5.7 12.4 L 6.2 12.9 L 6.5 13.5 L 6.5 14.1 L 6.2 14.7 L 5.8 15.2 L 5.3 15.8 L 4.8 16.4 L 4.3 17.1 L 3.9 17.5 L 3.7 17.9 L 3.6 18.5 L 3.6 19.1 L 3.6 19.5 L 3.7 20.0 L 3.7 20.1\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 3.1 22.2 L 4.4 22.2\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 25.5 13.6 L 25.9 12.9 L 26.2 12.2 L 26.6 11.8 L 27.0 11.4 L 27.7 11.2 L 28.2 11.2 L 29.0 11.4 L 29.7 11.6 L 30.3 12.4 L 30.7 12.9 L 31.0 13.5 L 31.0 14.1 L 30.7 14.7 L 30.4 15.2 L 29.9 15.8 L 29.3 16.4 L 28.8 17.1 L 28.5 17.5 L 28.2 17.9 L 28.1 18.5 L 28.1 19.1 L 28.1 19.5 L 28.2 20.0 L 28.2 20.1\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 27.7 22.2 L 29.0 22.2\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"16.04\\\" cy=\\\"16.01\\\" r=\\\"5.41\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 11.8 12.0 L 16.1 3.1 L 20.3 12.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 20.3 20.1 L 15.8 28.9 L 11.8 20.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"RCTLPT52\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 13.3 4.5 L 16.0 1.0 L 18.6 4.5\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 11.3 7.0 L 9.6 9.5 L 12.8 9.5\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 18.9 9.4 L 22.4 9.4 L 20.4 6.8\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 12.7 26.9 L 12.7 31.0 L 19.2 31.0 L 19.2 27.0\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 12.7 23.7 L 12.7 20.3\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 12.7 13.0 L 12.7 16.2\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 19.6 12.8 L 19.6 15.9\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 19.5 20.1 L 19.5 23.4\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"RDOCAL02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"22.13\\\" r=\\\"8.87\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 9.1 15.6 L 16.1 1.0 L 23.0 15.6\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"RDOCAL03\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"16.01\\\" r=\\\"6.31\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 11.1 11.4 L 16.1 1.0 L 21.0 11.4\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 20.9 20.8 L 15.8 31.0 L 11.1 20.7\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"RDOSTA02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" />\\n</svg>\\n\",\n \"RECDEF51\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 16.3 L 6.6 16.3\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 25.4 16.3 L 31.0 16.3\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 14.2 13.8 L 14.4 13.3 L 14.7 12.9 L 15.0 12.6 L 15.2 12.3 L 15.7 12.2 L 16.1 12.2 L 16.6 12.4 L 17.1 12.5 L 17.5 13.0 L 17.8 13.4 L 18.0 13.8 L 18.0 14.2 L 17.8 14.6 L 17.6 15.0 L 17.2 15.4 L 16.8 15.8 L 16.5 16.3 L 16.3 16.6 L 16.1 16.9 L 16.0 17.3 L 16.0 17.7 L 16.0 18.0 L 16.1 18.3 L 16.1 18.4\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 15.7 19.8 L 16.6 19.8\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 12.4 18.9 L 8.9 16.3 L 12.4 13.6\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 19.4 18.9 L 23.0 16.2 L 19.4 13.5\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"RECTRC55\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 16.0 31.0 L 16.0 25.4\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 18.8 L 16.0 13.2\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 6.6 L 16.0 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 18.6 18.8 L 16.0 22.4 L 13.3 18.8\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 18.7 13.2 L 16.0 9.6 L 13.3 13.2\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"RECTRC56\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 19.1 19.3 L 16.0 23.4 L 12.9 19.3\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 19.1 12.7 L 16.0 8.6 L 12.9 12.7\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 1.0 L 16.0 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"RECTRC57\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 16.0 31.0 L 16.0 21.5\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 10.5 L 16.0 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 20.5 21.5 L 16.0 15.6 L 11.5 21.5\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"RECTRC58\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 19.8 18.5 L 16.0 13.4 L 12.2 18.5\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 1.0 L 16.0 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"REFPNT02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 13.0 L 13.0 13.0 L 13.0 1.0\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 19.0 L 13.0 19.0 L 13.0 31.0\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 19.0 1.0 L 19.0 13.0 L 31.0 13.0\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 31.0 19.0 L 19.0 19.0 L 19.0 31.0\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"RETRFL01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 7.3 6.2 L 24.8 6.2\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 7.2 25.5 L 24.7 25.5\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 7.3 15.6 L 24.8 15.6\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 7.2 1.0 L 7.2 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"RETRFL02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 7.2 6.2 L 24.6 6.2\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 7.4 25.8 L 24.8 25.8\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 7.4 16.1 L 24.8 16.1\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 7.3 1.0 L 7.3 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"RFNERY01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 13.4 26.9 L 13.4 12.6 L 17.8 12.6 L 17.8 26.9 L 17.2 25.3 L 15.6 24.7 L 14.2 25.3 L 13.4 26.9 Z\\\" fill=\\\"LANDF\\\" />\\n <path d=\\\"M 13.4 26.9 L 13.4 12.6 L 17.8 12.6 L 17.8 26.9 L 17.2 25.3 L 15.6 24.7 L 14.2 25.3 L 13.4 26.9\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 18.1 2.4 L 16.7 3.2 L 15.3 4.0 L 14.2 5.4 L 13.4 7.1 L 13.4 8.7 L 13.7 9.6 L 14.8 10.1 L 16.1 10.1 L 17.0 9.6 L 17.5 8.5 L 17.2 7.1 L 16.7 6.5 L 16.7 5.4 L 16.7 4.3 L 17.5 3.5 L 18.1 2.4\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 8.9 26.8 L 22.0 26.8\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"RFNERY11\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 13.4 26.9 L 13.4 12.6 L 17.8 12.6 L 17.8 26.9 L 17.2 25.3 L 15.6 24.7 L 14.2 25.3 L 13.4 26.9 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 13.4 26.9 L 13.4 12.6 L 17.8 12.6 L 17.8 26.9 L 17.2 25.3 L 15.6 24.7 L 14.2 25.3 L 13.4 26.9\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 18.1 2.4 L 16.7 3.2 L 15.3 4.0 L 14.2 5.4 L 13.4 7.1 L 13.4 8.7 L 13.7 9.6 L 14.8 10.1 L 16.1 10.1 L 17.0 9.6 L 17.5 8.5 L 17.2 7.1 L 16.7 6.5 L 16.7 5.4 L 16.7 4.3 L 17.5 3.5 L 18.1 2.4\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 8.9 26.8 L 22.0 26.8\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"ROLROL01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 9.8 L 1.0 22.3\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 17.6 9.8 L 17.6 22.3\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 9.7 L 5.2 9.7\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 16.0 L 5.2 16.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 17.6 9.8 L 21.7 9.8\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 17.6 16.1 L 21.7 16.1\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 5.2 16.0 L 6.7 22.2\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 21.7 16.0 L 23.2 22.3\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 23.2 14.9 L 23.2 10.8\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 6.6 14.8 L 6.6 10.7\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 5.2 9.7 L 6.6 10.7\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 5.2 16.0 L 6.6 14.8\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 21.7 16.0 L 23.2 15.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 21.7 9.8 L 23.2 10.8\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"11.88\\\" cy=\\\"19.04\\\" r=\\\"3.08\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" />\\n <circle cx=\\\"27.96\\\" cy=\\\"19.04\\\" r=\\\"3.04\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" />\\n</svg>\\n\",\n \"RSCSTA02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 16.0 4.0 L 10.0 16.0 L 16.0 28.0 L 22.0 16.0 L 16.0 4.0 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 16.0 4.0 L 10.0 16.0 L 16.0 28.0 L 22.0 16.0 L 16.0 4.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 16.0 L 1.0 16.0 L 10.0 16.0 L 16.0 16.0 L 19.0 16.0 L 28.0 16.0 L 31.0 16.0 L 31.0 16.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"RSRDEF51\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 16.1 19.9 L 16.1 5.8\\\" fill=\\\"none\\\" stroke=\\\"TRFCF\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 14.0 25.3 L 18.4 25.3\\\" fill=\\\"none\\\" stroke=\\\"TRFCF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"TRFCF\\\" stroke-width=\\\"1.2\\\" />\\n</svg>\\n\",\n \"RTLDEF51\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 14.0 4.5 L 16.6 1.0 L 19.3 4.5\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 12.0 7.0 L 10.2 9.5 L 13.4 9.5\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 19.6 9.4 L 23.1 9.4 L 21.1 6.8\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 13.3 26.9 L 13.3 31.0 L 19.9 31.0 L 19.9 27.0\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 13.3 23.7 L 13.3 20.3\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 13.3 13.0 L 13.3 16.2\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 20.2 12.8 L 20.2 15.9\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 20.1 20.1 L 20.1 23.4\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 3.3 16.6 L 3.6 16.0 L 3.9 15.4 L 4.2 15.1 L 4.6 14.7 L 5.2 14.5 L 5.7 14.5 L 6.3 14.7 L 6.9 14.9 L 7.4 15.6 L 7.8 16.0 L 8.0 16.5 L 8.0 17.0 L 7.8 17.5 L 7.5 18.0 L 7.1 18.5 L 6.6 19.0 L 6.1 19.6 L 5.8 20.0 L 5.6 20.4 L 5.6 20.9 L 5.6 21.4 L 5.6 21.7 L 5.6 22.2 L 5.6 22.2\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 5.2 24.1 L 6.3 24.1\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 24.0 16.5 L 24.2 15.9 L 24.5 15.4 L 24.9 15.0 L 25.2 14.6 L 25.8 14.4 L 26.3 14.5 L 27.0 14.7 L 27.6 14.8 L 28.1 15.5 L 28.4 16.0 L 28.7 16.4 L 28.7 17.0 L 28.4 17.5 L 28.2 17.9 L 27.7 18.5 L 27.2 19.0 L 26.8 19.6 L 26.5 20.0 L 26.3 20.3 L 26.2 20.8 L 26.2 21.3 L 26.2 21.7 L 26.3 22.2 L 26.3 22.2\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 25.8 24.0 L 27.0 24.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"RTPBCN02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 29.9 11.3 L 31.0 16.1 L 30.0 21.1\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 2.0 11.4 L 1.0 16.1 L 2.0 21.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 13.0 30.2 L 8.3 27.9 L 5.5 24.6\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 19.8 29.9 L 24.0 27.8 L 27.1 24.5\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 13.0 1.8 L 8.3 4.2 L 5.3 7.2\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 19.9 2.0 L 24.3 4.4 L 27.1 7.4\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"SCALEB10\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 16.0 4.0 L 16.0 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 7.0 L 16.0 4.0\\\" fill=\\\"none\\\" stroke=\\\"SCLBR\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 10.0 L 16.0 7.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 13.0 L 16.0 10.0\\\" fill=\\\"none\\\" stroke=\\\"SCLBR\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 16.0 L 16.0 13.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 19.0 L 16.0 16.0\\\" fill=\\\"none\\\" stroke=\\\"SCLBR\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 22.0 L 16.0 19.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 25.0 L 16.0 22.0\\\" fill=\\\"none\\\" stroke=\\\"SCLBR\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 28.0 L 16.0 25.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 31.0 L 16.0 28.0\\\" fill=\\\"none\\\" stroke=\\\"SCLBR\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"SCALEB11\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 16.0 1.0 L 16.0 7.0\\\" fill=\\\"none\\\" stroke=\\\"SNDG2\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 7.0 L 16.0 13.0\\\" fill=\\\"none\\\" stroke=\\\"SNDG1\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 13.0 L 16.0 19.0\\\" fill=\\\"none\\\" stroke=\\\"SNDG2\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 19.0 L 16.0 25.0\\\" fill=\\\"none\\\" stroke=\\\"SNDG1\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 25.0 L 16.0 31.0\\\" fill=\\\"none\\\" stroke=\\\"SNDG2\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"SILBUI01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"CHBRN\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 16.0 16.0 Z\\\" fill=\\\"CHBRN\\\" />\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" />\\n</svg>\\n\",\n \"SILBUI11\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 16.0 16.0 Z\\\" fill=\\\"LANDF\\\" />\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" />\\n</svg>\\n\",\n \"SISTAT02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 2.9 8.5 L 31.0 8.5 L 31.0 26.0 L 2.9 26.0 L 2.9 8.5 Z\\\" fill=\\\"CHWHT\\\" />\\n <path d=\\\"M 2.9 8.5 L 31.0 8.5 L 31.0 26.0 L 2.9 26.0 L 2.9 8.5\\\" fill=\\\"none\\\" stroke=\\\"CHWHT\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 31.0 8.5 L 31.0 26.0 L 2.9 26.0 L 2.9 8.5\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 13.4 12.6 L 12.3 11.5 L 9.9 11.5 L 8.7 12.6 L 8.7 15.0 L 9.9 16.2 L 11.8 16.2 L 13.4 17.3 L 13.4 19.7 L 12.3 21.3 L 9.2 21.3 L 7.8 19.8\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 25.1 12.6 L 24.0 11.5 L 21.6 11.5 L 20.5 12.6 L 20.5 15.0 L 21.8 16.2 L 23.5 16.2 L 25.1 17.3 L 25.1 19.8 L 24.0 21.0 L 20.9 21.0 L 19.6 19.7\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 2.9 8.5 L 31.0 8.5\\\" fill=\\\"none\\\" stroke=\\\"CHMGF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"2.17\\\" cy=\\\"7.21\\\" r=\\\"1.17\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 2.2 7.2 Z\\\" fill=\\\"LANDF\\\" />\\n</svg>\\n\",\n \"SMCFAC02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 19.5 1.7 L 16.0 7.1 L 16.0 24.0 L 29.1 21.1 L 27.8 20.1 L 26.5 19.0 L 25.2 17.6 L 23.9 15.9 L 22.8 14.1 L 21.7 12.4 L 20.8 10.4 L 20.2 8.2 L 19.7 6.3 L 19.5 4.3 L 19.5 3.0 L 19.5 1.9 L 19.5 1.7\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 5.4 L 14.7 5.8 L 13.4 6.9 L 12.3 7.6 L 11.2 8.7 L 10.3 9.8 L 9.4 11.1 L 8.6 12.2 L 7.9 13.7 L 7.2 15.2 L 6.8 16.5 L 6.6 18.3 L 6.4 20.1 L 6.4 22.5 L 6.6 23.8 L 6.6 25.5 L 7.0 24.9 L 8.1 23.8 L 9.0 22.9 L 10.3 22.2 L 11.8 21.8 L 12.7 21.6 L 14.0 21.6 L 13.4 20.7 L 12.7 19.4 L 12.1 17.4 L 11.8 16.1 L 11.8 15.0 L 11.8 13.9 L 11.8 12.6 L 12.3 11.1 L 12.7 9.5 L 13.6 8.2 L 14.2 7.1 L 15.1 6.0 L 15.8 5.4 L 16.0 5.4\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"16.00\\\" cy=\\\"16.11\\\" r=\\\"14.89\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 16.0 1.0 L 16.0 26.6\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 5.4 26.6 L 26.5 26.6\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"SNDWAV02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 18.3 L 3.1 18.3 L 4.2 17.7 L 5.9 14.0 L 6.8 14.0 L 8.2 17.7 L 8.9 18.3 L 13.4 18.3 L 14.2 17.6 L 15.3 14.1 L 16.0 14.1 L 17.3 17.6 L 18.1 18.3 L 21.8 18.3 L 23.1 18.3 L 23.9 17.8 L 25.5 13.7 L 26.4 13.7 L 27.9 17.7 L 28.9 18.3 L 31.0 18.3\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"SOUNDGB1\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 12.9 L 1.0 19.1 L 31.0 19.1 L 31.0 12.9\\\" fill=\\\"none\\\" stroke=\\\"SNDG1\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"SOUNDGC2\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"SNDG1\\\" stroke-width=\\\"0.8\\\" />\\n</svg>\\n\",\n \"SOUNDSA1\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 15.9 L 31.0 15.9\\\" fill=\\\"none\\\" stroke=\\\"SNDG2\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"SOUNDSB1\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 12.9 L 1.0 19.1 L 31.0 19.1 L 31.0 12.9\\\" fill=\\\"none\\\" stroke=\\\"SNDG2\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"SOUNDSC2\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"SNDG1\\\" stroke-width=\\\"0.8\\\" />\\n</svg>\\n\",\n \"SPRING02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\"></svg>\\n\",\n \"SWPARE51\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 11.9 L 1.0 20.1 L 31.0 20.1 L 31.0 11.9\\\" fill=\\\"none\\\" stroke=\\\"CHGRF\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TIDCUR01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 12.0 11.2 L 16.0 7.2 L 20.1 11.3\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 11.9 17.3 L 16.0 13.3 L 20.1 17.3\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 1.3 L 16.0 5.3\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 7.2 L 16.0 11.1\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 13.3 L 16.0 17.4\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 11.9 5.0 L 16.0 1.0 L 20.1 5.2\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 27.0 L 16.0 31.0\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 20.2 L 16.0 24.3\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TIDCUR02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 18.5 1.0 L 18.5 1.0\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.1 1.0 L 16.1 31.0\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.1 1.0 L 11.0 5.9\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.1 1.0 L 21.0 5.9\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.1 13.4 L 11.0 18.3\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.1 13.4 L 21.0 18.3\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.1 6.9 L 11.0 12.0\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.1 7.1 L 21.0 12.3\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TIDCUR03\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 7.4 L 31.0 7.4\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 24.6 L 31.0 24.6\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 31.0 7.4 L 31.0 24.6\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 7.4 L 1.0 24.6\\\" fill=\\\"none\\\" stroke=\\\"NINFO\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TIDEHT01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 16.0 L 31.0 16.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 3.4 16.0 L 3.4 15.2 L 3.7 14.1 L 4.2 13.0 L 4.9 12.0 L 5.9 11.3 L 7.1 10.7 L 8.2 10.4 L 9.2 10.3 L 10.4 10.5 L 11.4 10.9 L 12.3 11.5 L 13.1 12.1 L 13.9 13.2 L 14.4 14.5 L 14.4 15.5 L 14.4 16.0 L 14.4 16.8 L 14.6 17.8 L 14.8 18.6 L 15.4 19.6 L 16.4 20.4 L 16.8 20.8 L 17.4 21.1 L 18.0 21.4 L 19.1 21.6 L 20.3 21.7 L 21.6 21.4 L 22.6 21.0 L 23.7 20.3 L 24.5 19.5 L 25.2 18.3 L 25.5 17.2 L 25.7 16.6 L 25.7 16.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TIDSTR01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 16.2 L 16.0 1.2 L 31.0 16.2 L 15.9 30.8 L 1.0 16.2\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TMARDEF1\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 16.0 31.0 L 16.0 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TMARDEF2\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 10.4 31.0 L 21.6 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TMBYRD01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 8.5 L 31.0 8.5\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 23.5 L 31.0 23.5\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 8.5 1.0 L 8.5 31.0\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 23.5 1.0 L 23.5 31.0\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TNKCON02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" />\\n</svg>\\n\",\n \"TNKCON12\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" />\\n</svg>\\n\",\n \"TNKFRM01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"11.93\\\" cy=\\\"12.32\\\" r=\\\"3.80\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 11.9 12.3 Z\\\" fill=\\\"LANDF\\\" />\\n <circle cx=\\\"12.01\\\" cy=\\\"21.17\\\" r=\\\"3.80\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 12.0 21.2 Z\\\" fill=\\\"LANDF\\\" />\\n <circle cx=\\\"20.39\\\" cy=\\\"20.93\\\" r=\\\"3.52\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 20.4 20.9 Z\\\" fill=\\\"LANDF\\\" />\\n <circle cx=\\\"20.58\\\" cy=\\\"12.40\\\" r=\\\"3.80\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 20.6 12.4 Z\\\" fill=\\\"LANDF\\\" />\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" />\\n</svg>\\n\",\n \"TNKFRM11\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"11.93\\\" cy=\\\"12.32\\\" r=\\\"3.80\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 11.9 12.3 Z\\\" fill=\\\"CHBLK\\\" />\\n <circle cx=\\\"12.01\\\" cy=\\\"21.17\\\" r=\\\"3.80\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 12.0 21.2 Z\\\" fill=\\\"CHBLK\\\" />\\n <circle cx=\\\"20.39\\\" cy=\\\"20.93\\\" r=\\\"3.52\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 20.4 20.9 Z\\\" fill=\\\"CHBLK\\\" />\\n <circle cx=\\\"20.58\\\" cy=\\\"12.40\\\" r=\\\"3.80\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 20.6 12.4 Z\\\" fill=\\\"CHBLK\\\" />\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" />\\n</svg>\\n\",\n \"TOPMAR02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 21.7 4.2 L 1.0 27.8 L 31.0 27.8 L 21.7 4.2 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 21.7 4.2 L 1.0 27.8 L 31.0 27.8 L 21.7 4.2\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TOPMAR04\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 5.4 L 31.0 5.4 L 9.2 26.6 L 1.0 5.4 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 1.0 5.4 L 31.0 5.4 L 9.2 26.6 L 1.0 5.4\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TOPMAR05\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 16.9 17.7 L 5.8 31.0 L 23.2 31.0 L 16.9 17.7 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 16.9 17.7 L 5.8 31.0 L 23.2 31.0 L 16.9 17.7\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 20.6 1.0 L 9.5 14.7 L 26.2 14.7 L 20.6 1.0 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 20.6 1.0 L 9.5 14.7 L 26.2 14.7 L 20.6 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TOPMAR06\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 4.6 18.0 L 23.7 18.0 L 9.5 31.0 L 4.6 18.0 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 4.6 18.0 L 23.7 18.0 L 9.5 31.0 L 4.6 18.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 8.3 1.0 L 27.4 1.0 L 13.6 14.0 L 8.3 1.0 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 8.3 1.0 L 27.4 1.0 L 13.6 14.0 L 8.3 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TOPMAR07\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 6.9 18.5 L 24.7 18.5 L 11.8 31.0 L 6.9 18.5 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 6.9 18.5 L 24.7 18.5 L 11.8 31.0 L 6.9 18.5\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 18.3 1.0 L 8.4 14.3 L 25.1 14.3 L 18.3 1.0 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 18.3 1.0 L 8.4 14.3 L 25.1 14.3 L 18.3 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TOPMAR08\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 15.2 17.0 L 3.1 31.0 L 21.8 31.0 L 15.2 17.0 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 15.2 17.0 L 3.1 31.0 L 21.8 31.0 L 15.2 17.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 9.8 1.0 L 28.9 1.0 L 15.6 13.9 L 9.8 1.0 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 9.8 1.0 L 28.9 1.0 L 15.6 13.9 L 9.8 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TOPMAR10\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 16.0 16.0 Z\\\" fill=\\\"CHBLK\\\" />\\n</svg>\\n\",\n \"TOPMAR12\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"14.50\\\" cy=\\\"24.25\\\" r=\\\"6.75\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 14.5 24.3 Z\\\" fill=\\\"CHBLK\\\" />\\n <circle cx=\\\"17.50\\\" cy=\\\"7.75\\\" r=\\\"6.75\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 17.5 7.8 Z\\\" fill=\\\"CHBLK\\\" />\\n</svg>\\n\",\n \"TOPMAR13\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.3 31.0 L 21.8 31.0 L 30.7 1.0 L 8.8 1.0 L 1.3 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TOPMAR14\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 24.8 L 27.3 24.8 L 31.0 7.3 L 4.8 7.3 L 1.0 24.8\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TOPMAR16\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 12.7 L 12.7 30.3 L 31.0 19.3 L 20.0 1.7\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 12.7 L 19.3 1.7\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TOPMAR17\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 15.0 L 31.0 15.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 18.7 6.6 L 11.8 25.4\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TOPMAR18\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 6.7 L 31.0 6.7\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.3 6.6 L 9.5 25.4\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TOPMAR22\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 16.0 4.1 L 1.0 27.9 L 31.0 27.9 L 16.0 4.1 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 16.0 4.1 L 1.0 27.9 L 31.0 27.9 L 16.0 4.1\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TOPMAR24\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 4.4 L 31.0 4.4 L 16.0 27.6 L 1.0 4.4 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 1.0 4.4 L 31.0 4.4 L 16.0 27.6 L 1.0 4.4\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TOPMAR25\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 16.0 1.0 L 7.6 14.3 L 24.4 14.3 L 16.0 1.0 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 16.0 1.0 L 7.6 14.3 L 24.4 14.3 L 16.0 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 17.7 L 7.6 31.0 L 24.4 31.0 L 16.0 17.7 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 16.0 17.7 L 7.6 31.0 L 24.4 31.0 L 16.0 17.7\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TOPMAR26\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 7.5 17.9 L 24.5 17.9 L 16.0 31.0 L 7.5 17.9 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 7.5 17.9 L 24.5 17.9 L 16.0 31.0 L 7.5 17.9\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 7.5 1.0 L 24.5 1.0 L 16.0 14.1 L 7.5 1.0 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 7.5 1.0 L 24.5 1.0 L 16.0 14.1 L 7.5 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TOPMAR27\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 16.0 1.0 L 7.6 14.3 L 24.4 14.3 L 16.0 1.0 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 16.0 1.0 L 7.6 14.3 L 24.4 14.3 L 16.0 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 7.6 18.1 L 24.4 18.1 L 16.0 31.0 L 7.6 18.1 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 7.6 18.1 L 24.4 18.1 L 16.0 31.0 L 7.6 18.1\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TOPMAR28\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 7.5 1.0 L 24.5 1.0 L 16.0 14.1 L 7.5 1.0 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 7.5 1.0 L 24.5 1.0 L 16.0 14.1 L 7.5 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 17.5 L 7.5 31.0 L 24.5 31.0 L 16.0 17.5 Z\\\" fill=\\\"CHBLK\\\" />\\n <path d=\\\"M 16.0 17.5 L 7.5 31.0 L 24.5 31.0 L 16.0 17.5\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TOPMAR30\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 16.0 16.0 Z\\\" fill=\\\"CHBLK\\\" />\\n</svg>\\n\",\n \"TOPMAR32\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"7.67\\\" r=\\\"6.67\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 16.0 7.7 Z\\\" fill=\\\"CHBLK\\\" />\\n <circle cx=\\\"16.00\\\" cy=\\\"24.33\\\" r=\\\"6.67\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 16.0 24.3 Z\\\" fill=\\\"CHBLK\\\" />\\n</svg>\\n\",\n \"TOPMAR33\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 6.8 31.0 L 25.2 31.0 L 25.2 1.0 L 6.8 1.0 L 6.8 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TOPMAR34\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 24.4 L 1.0 7.6 L 31.0 7.6 L 31.0 24.4 L 1.0 24.4\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TOPMAR36\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 16.3 1.0 L 1.0 16.3 L 16.3 31.0 L 31.0 16.3 L 16.3 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TOPMAR65\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 5.1 3.8 L 28.0 28.2\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 31.0 7.7 L 1.0 22.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TOPMAR85\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 1.0 L 31.0 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 31.0 1.0 L 1.0 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TOPMAR86\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 16.0 1.8 L 16.0 30.3\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 15.9 L 31.0 15.9\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TOPMAR87\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 15.8 1.1 L 15.7 30.9\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 3.1 31.0 L 11.3 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 28.9 30.9 L 19.8 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TOPMAR88\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 16.3 30.9 L 16.4 1.1\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 28.9 1.0 L 20.7 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 3.1 1.1 L 12.2 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TOPMAR89\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 6.0 L 31.0 6.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 15.9 6.0 L 15.9 26.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TOWERS01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.02\\\" cy=\\\"28.31\\\" r=\\\"2.69\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 11.1 28.3 L 13.3 1.0 L 18.7 1.0 L 21.0 28.3\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 18.7 28.3 L 24.1 28.3\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 13.3 28.3 L 7.9 28.3\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 13.0 6.2 L 18.7 6.2\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TOWERS02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"28.27\\\" r=\\\"2.73\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 10.5 28.3 L 12.9 6.5\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 21.5 6.5 L 21.5 1.0 L 10.5 1.0 L 10.5 6.5 L 21.5 6.5\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 7.8 28.3 L 13.3 28.3\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 18.7 28.3 L 24.2 28.3\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 21.5 28.3 L 18.9 6.2\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TOWERS03\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.09\\\" cy=\\\"28.35\\\" r=\\\"2.65\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 11.0 28.4 L 13.3 1.0 L 18.7 1.0 L 21.0 28.4\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 18.7 28.4 L 24.2 28.4\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 13.3 28.4 L 7.8 28.4\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 13.0 6.2 L 18.7 6.2\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TOWERS05\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"29.00\\\" r=\\\"2.00\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 12.0 29.0 L 14.0 9.0 L 18.0 9.0 L 19.4 29.0\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 13.4 12.6 L 18.0 12.6\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 10.0 29.0 L 14.0 29.0\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 18.0 29.0 L 22.0 29.0\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 20.0 1.0 L 22.0 3.0 L 22.0 9.0\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 12.0 1.0 L 10.0 3.0 L 10.0 9.0\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TOWERS12\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"28.27\\\" r=\\\"2.73\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 10.5 28.3 L 12.9 6.5\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 21.5 6.5 L 21.5 1.0 L 10.5 1.0 L 10.5 6.5 L 21.5 6.5\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 7.8 28.3 L 13.3 28.3\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 18.7 28.3 L 24.2 28.3\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 21.5 28.3 L 18.9 6.2\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TOWERS15\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"29.00\\\" r=\\\"2.00\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 12.0 29.0 L 14.0 9.0 L 18.0 9.0 L 19.4 29.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 13.4 12.6 L 18.0 12.6\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 10.0 29.0 L 14.0 29.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 18.0 29.0 L 22.0 29.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 20.0 1.0 L 22.0 3.0 L 22.0 9.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 12.0 1.0 L 10.0 3.0 L 10.0 9.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TREPNT04\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 15.6 31.0 L 15.6 1.2\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 2.4 8.4 L 29.6 8.4\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 7.4 15.8 L 23.7 15.8\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 10.7 1.0 L 20.4 1.0\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 11.5 31.0 L 20.5 31.0\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 7.2 4.6 L 23.7 4.6\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 5.9 12.0 L 25.6 12.0\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TREPNT05\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"11.25\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 1.0 27.3 L 31.0 27.3\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 27.1 L 16.0 15.0\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TSLDEF51\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 9.3 11.0 L 16.0 1.0 L 22.6 11.0 L 19.3 11.0 L 19.3 31.0 L 12.6 31.0 L 12.6 11.0 L 9.3 11.0 Z\\\" fill=\\\"TRFCD\\\" />\\n <path d=\\\"M 9.3 11.0 L 16.0 1.0 L 22.6 11.0 L 19.3 11.0 L 19.3 31.0 L 12.6 31.0 L 12.6 11.0 L 9.3 11.0\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 12.6 31.0 L 12.6 11.0 L 9.3 11.0 L 16.0 1.0 L 22.6 11.0 L 19.3 11.0 L 19.3 31.0 L 12.6 31.0\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 2.6 17.3 L 2.9 16.6 L 3.1 16.1 L 3.5 15.7 L 3.9 15.3 L 4.5 15.1 L 5.0 15.2 L 5.7 15.4 L 6.3 15.5 L 6.8 16.3 L 7.2 16.7 L 7.5 17.2 L 7.5 17.7 L 7.2 18.3 L 6.9 18.7 L 6.5 19.3 L 5.9 19.8 L 5.5 20.4 L 5.2 20.8 L 4.9 21.2 L 4.9 21.7 L 4.9 22.2 L 4.9 22.6 L 4.9 23.1 L 4.9 23.1\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 4.5 25.0 L 5.7 25.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 24.5 17.3 L 24.8 16.6 L 25.1 16.1 L 25.5 15.7 L 25.9 15.3 L 26.5 15.1 L 27.0 15.2 L 27.6 15.4 L 28.3 15.5 L 28.8 16.3 L 29.2 16.7 L 29.4 17.2 L 29.4 17.7 L 29.2 18.3 L 28.9 18.7 L 28.4 19.3 L 27.9 19.8 L 27.5 20.4 L 27.2 20.8 L 26.9 21.2 L 26.9 21.7 L 26.9 22.2 L 26.9 22.6 L 26.9 23.1 L 26.9 23.1\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 26.5 25.0 L 27.6 25.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TSSCRS51\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 16.1 19.9 L 16.1 5.8\\\" fill=\\\"none\\\" stroke=\\\"TRFCF\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 14.0 25.3 L 18.4 25.3\\\" fill=\\\"none\\\" stroke=\\\"TRFCF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"TRFCF\\\" stroke-width=\\\"1.2\\\" />\\n</svg>\\n\",\n \"TSSLPT51\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 9.3 11.0 L 16.0 1.0 L 22.7 11.0 L 19.3 11.0 L 19.3 31.0 L 12.7 31.0 L 12.7 11.0 L 9.3 11.0 Z\\\" fill=\\\"TRFCD\\\" />\\n <path d=\\\"M 9.3 11.0 L 16.0 1.0 L 22.7 11.0 L 19.3 11.0 L 19.3 31.0 L 12.7 31.0 L 12.7 11.0 L 9.3 11.0\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 12.7 31.0 L 12.7 11.0 L 9.3 11.0 L 16.0 1.0 L 22.7 11.0 L 19.3 11.0 L 19.3 31.0 L 12.7 31.0\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TSSRON51\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.3 17.7 L 2.2 20.7 L 3.5 23.8 L 5.3 26.3 L 8.2 28.5 L 11.6 30.4 L 15.4 31.0 L 18.4 30.8 L 21.6 29.9 L 24.9 28.1 L 27.5 25.5 L 29.6 22.0 L 30.7 18.3 L 30.7 14.2 L 29.6 10.0 L 27.5 6.5 L 24.4 3.9 L 20.7 2.0 L 16.5 1.3 L 11.8 2.0 L 8.4 3.6 L 5.5 5.6 L 11.1 11.2 L 1.3 11.2 L 1.3 1.0 L 5.7 5.6\\\" fill=\\\"none\\\" stroke=\\\"TRFCF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TWRDEF51\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 13.6 4.5 L 16.2 1.0 L 18.8 4.5\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 11.6 6.9 L 9.8 9.4 L 13.0 9.4\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 19.1 9.3 L 22.6 9.3 L 20.6 6.7\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 12.9 13.4 L 12.9 18.0\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 19.2 13.3 L 19.2 17.8\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 13.6 27.4 L 16.2 31.0 L 18.9 27.4\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 12.9 22.2 L 9.5 22.2 L 11.5 24.7\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 19.3 22.2 L 22.4 22.2 L 20.7 25.0\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.4 13.0 L 1.7 12.4 L 2.0 11.8 L 2.4 11.5 L 2.7 11.1 L 3.3 10.9 L 3.8 10.9 L 4.4 11.1 L 5.0 11.3 L 5.5 12.0 L 5.9 12.4 L 6.2 12.9 L 6.2 13.4 L 5.9 13.9 L 5.6 14.4 L 5.2 14.9 L 4.7 15.4 L 4.3 16.0 L 4.0 16.4 L 3.7 16.7 L 3.7 17.2 L 3.7 17.7 L 3.7 18.1 L 3.7 18.5 L 3.7 18.6\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 3.3 20.4 L 4.4 20.4\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 25.8 12.9 L 26.1 12.3 L 26.4 11.8 L 26.8 11.4 L 27.1 11.0 L 27.7 10.8 L 28.2 10.9 L 28.8 11.1 L 29.4 11.2 L 29.9 11.9 L 30.3 12.3 L 30.6 12.8 L 30.6 13.3 L 30.3 13.9 L 30.0 14.3 L 29.6 14.8 L 29.1 15.3 L 28.6 15.9 L 28.4 16.3 L 28.1 16.7 L 28.1 17.1 L 28.1 17.6 L 28.1 18.0 L 28.1 18.5 L 28.1 18.5\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 27.7 20.3 L 28.8 20.3\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TWRTPT52\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 13.5 4.5 L 16.1 1.0 L 18.7 4.5\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 11.5 6.9 L 9.8 9.4 L 12.9 9.4\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 19.0 9.3 L 22.5 9.3 L 20.5 6.7\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 12.9 13.4 L 12.9 18.0\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 19.1 13.3 L 19.1 17.8\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 13.6 27.4 L 16.2 31.0 L 18.8 27.4\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 12.9 22.2 L 9.5 22.2 L 11.5 24.7\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 19.2 22.2 L 22.4 22.2 L 20.6 25.0\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TWRTPT53\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 13.3 4.5 L 16.0 1.0 L 18.6 4.5\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 11.3 7.0 L 9.6 9.5 L 12.8 9.5\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 18.9 9.4 L 22.4 9.4 L 20.4 6.8\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 12.7 26.9 L 12.7 31.0 L 19.2 31.0 L 19.2 27.0\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 12.7 23.7 L 12.7 20.3\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 12.7 13.0 L 12.7 16.2\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 19.6 12.8 L 19.6 15.9\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 19.5 20.1 L 19.5 23.4\\\" fill=\\\"none\\\" stroke=\\\"TRFCD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"UNITFTH1\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 6.3 14.0 L 25.7 14.0\\\" fill=\\\"none\\\" stroke=\\\"SCLBR\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 25.8 1.0 L 6.3 1.0 L 6.2 31.0\\\" fill=\\\"none\\\" stroke=\\\"SCLBR\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"UNITMTR1\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 3.1 31.0 L 3.1 1.0 L 16.1 25.2 L 28.9 1.4 L 28.9 30.6\\\" fill=\\\"none\\\" stroke=\\\"SCLBR\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"UWTROC01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <!-- S-52 PresLib UWTROC01 / INT1 K11: rock that covers and uncovers\\n (WATLEV=4). Per IHO S-52 PresLib Edition 4.0 Annex A, the symbol is a\\n plain 4-line asterisk — geometrically identical to UWTROC04 (K13).\\n The K11/K13 distinction is conveyed by attribute context: K11 has no\\n VALSOU (depth varies with tide so no fixed sounding), K13 carries a\\n VALSOU label rendered separately. 18-unit asterisk, 1.6 stroke. -->\\n <path d=\\\"M 16 7 L 16 25\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.6\\\" stroke-linecap=\\\"round\\\" />\\n <path d=\\\"M 7 16 L 25 16\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.6\\\" stroke-linecap=\\\"round\\\" />\\n <path d=\\\"M 9.5 9.5 L 22.5 22.5\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.6\\\" stroke-linecap=\\\"round\\\" />\\n <path d=\\\"M 22.5 9.5 L 9.5 22.5\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.6\\\" stroke-linecap=\\\"round\\\" />\\n</svg>\\n\",\n \"UWTROC03\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <!-- S-52 PresLib UWTROC03 / INT1 K12: rock awash at chart datum (WATLEV=5).\\n NOAA portrayal: bold 4-line asterisk enclosed in a dotted oval — the\\n oval signals \\\"at chart datum, dangerous\\\" and visually distinguishes\\n awash rocks from sounded submerged rocks (UWTROC04). 18-unit asterisk\\n inside a 28×22 dotted oval. -->\\n <ellipse cx=\\\"16\\\" cy=\\\"16\\\" rx=\\\"14\\\" ry=\\\"11\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.0\\\" stroke-dasharray=\\\"1.0,1.2\\\" />\\n <path d=\\\"M 16 7 L 16 25\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.5\\\" stroke-linecap=\\\"round\\\" />\\n <path d=\\\"M 7 16 L 25 16\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.5\\\" stroke-linecap=\\\"round\\\" />\\n <path d=\\\"M 9.5 9.5 L 22.5 22.5\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.5\\\" stroke-linecap=\\\"round\\\" />\\n <path d=\\\"M 22.5 9.5 L 9.5 22.5\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.5\\\" stroke-linecap=\\\"round\\\" />\\n</svg>\\n\",\n \"UWTROC04\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <!-- S-52 PresLib UWTROC04 / INT1 K13: underwater rock always submerged with\\n sounded depth (WATLEV=3, dangerous to surface navigation). NOAA portrayal:\\n bold 4-line asterisk, depth value rendered separately by VALSOU label.\\n 18-unit span with 1.6 stroke for clear visibility at harbor zoom — these\\n are safety-critical hazards and need to read like NOAA paper-chart\\n asterisks (~2 mm at 1:5000 ≈ 18 px on screen at z16). -->\\n <path d=\\\"M 16 7 L 16 25\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.6\\\" stroke-linecap=\\\"round\\\" />\\n <path d=\\\"M 7 16 L 25 16\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.6\\\" stroke-linecap=\\\"round\\\" />\\n <path d=\\\"M 9.5 9.5 L 22.5 22.5\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.6\\\" stroke-linecap=\\\"round\\\" />\\n <path d=\\\"M 22.5 9.5 L 9.5 22.5\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.6\\\" stroke-linecap=\\\"round\\\" />\\n</svg>\\n\",\n \"VECGND01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 7.5 26.4 L 15.9 15.8 L 24.6 26.6\\\" fill=\\\"none\\\" stroke=\\\"SHIPS\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 23.3 L 15.8 5.4 L 31.0 23.4\\\" fill=\\\"none\\\" stroke=\\\"SHIPS\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"VECGND21\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 7.5 26.4 L 15.9 15.8 L 24.6 26.6\\\" fill=\\\"none\\\" stroke=\\\"ARPAT\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 23.3 L 15.8 5.4 L 31.0 23.4\\\" fill=\\\"none\\\" stroke=\\\"ARPAT\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"VECWTR01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 24.9 L 15.8 7.0 L 31.0 25.0\\\" fill=\\\"none\\\" stroke=\\\"SHIPS\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"VECWTR21\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 24.9 L 15.8 7.0 L 31.0 25.0\\\" fill=\\\"none\\\" stroke=\\\"ARPAT\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"WATTUR01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 8 11 Q 12 9 16 11 T 24 11\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.4\\\" stroke-linecap=\\\"round\\\" />\\n <path d=\\\"M 8 16 Q 12 14 16 16 T 24 16\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.4\\\" stroke-linecap=\\\"round\\\" />\\n <path d=\\\"M 8 21 Q 12 19 16 21 T 24 21\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.4\\\" stroke-linecap=\\\"round\\\" />\\n</svg>\\n\",\n \"WATTUR02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 18.9 L 2.8 18.3 L 5.0 16.8 L 7.0 13.9 L 9.0 12.9 L 11.2 13.1 L 9.0 15.1 L 9.0 17.0 L 11.3 19.1 L 13.2 18.3 L 15.0 17.1 L 17.1 13.9 L 19.3 13.0 L 21.1 13.1 L 19.0 15.1 L 18.9 17.2 L 21.3 19.1 L 23.3 18.2 L 25.0 17.1 L 27.0 14.1 L 29.3 13.0 L 31.0 13.2 L 29.0 15.7 L 29.1 17.2 L 30.9 19.1\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"WAYPNT01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"PLRTE\\\" stroke-width=\\\"1.8\\\" />\\n</svg>\\n\",\n \"WAYPNT03\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"APLRT\\\" stroke-width=\\\"1.2\\\" />\\n</svg>\\n\",\n \"WAYPNT11\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"PLRTE\\\" stroke-width=\\\"1.2\\\" />\\n <circle cx=\\\"15.90\\\" cy=\\\"15.95\\\" r=\\\"9.90\\\" fill=\\\"none\\\" stroke=\\\"PLRTE\\\" stroke-width=\\\"1.2\\\" />\\n</svg>\\n\",\n \"WEDKLP03\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 16.8 L 7.0 15.3 L 13.0 16.8 L 19.0 15.3 L 25.0 16.8 L 31.0 15.3\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 2.5 12.3 L 7.0 15.3\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 8.5 19.8 L 13.0 16.8\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 14.5 12.3 L 19.0 15.3\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 20.5 19.8 L 25.0 16.8\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"WIMCON01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"14.46\\\" cy=\\\"28.74\\\" r=\\\"2.26\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 14.5 8.4 L 14.5 26.5\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.7 28.7 L 21.2 28.7\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 12.2 28.7 L 7.7 28.7\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 14.5 8.4 L 24.3 8.4\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 14.5 8.4 L 8.2 1.0\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 14.5 8.4 L 8.2 15.7\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"WIMCON11\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"14.46\\\" cy=\\\"28.74\\\" r=\\\"2.26\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 14.5 8.4 L 14.5 26.5\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.7 28.7 L 21.2 28.7\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 12.2 28.7 L 7.7 28.7\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 14.5 8.4 L 24.3 8.4\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 14.5 8.4 L 8.2 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 14.5 8.4 L 8.2 15.7\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"WNDFRM51\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 16.0 9.6 L 24.4 9.6\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 9.6 L 10.7 3.3\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 9.6 L 10.7 15.8\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 10.1 26.8 L 21.8 26.8\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 9.5 L 16.0 26.7\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"WNDFRM61\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 16.0 9.6 L 24.4 9.6\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 9.6 L 10.7 3.3\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 9.6 L 10.7 15.8\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"16.00\\\" cy=\\\"16.00\\\" r=\\\"15.00\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" />\\n <path d=\\\"M 10.1 26.8 L 21.8 26.8\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 9.5 L 16.0 26.7\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"WNDMIL02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"22.95\\\" r=\\\"8.05\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 27.0 1.0 L 5.0 23.0\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 5.0 1.0 L 27.0 23.0\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"WNDMIL12\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <circle cx=\\\"16.00\\\" cy=\\\"22.95\\\" r=\\\"8.05\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 27.0 1.0 L 5.0 23.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 5.0 1.0 L 27.0 23.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"WRECKS01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 7.9 21.8 L 1.0 12.5 L 31.0 21.8 L 19.5 21.8 L 19.5 21.3 L 19.2 20.8 L 19.0 20.4 L 18.5 19.9 L 18.1 19.5 L 17.6 19.5 L 16.9 19.5 L 16.5 19.5 L 15.8 19.7 L 15.1 20.4 L 14.8 21.1 L 14.8 21.3 L 14.8 21.8 L 7.9 21.8 L 7.9 21.8 Z\\\" fill=\\\"CHGRD\\\" />\\n <path d=\\\"M 7.9 21.8 L 1.0 12.5 L 31.0 21.8 L 19.5 21.8 L 19.5 21.3 L 19.2 20.8 L 19.0 20.4 L 18.5 19.9 L 18.1 19.5 L 17.6 19.5 L 16.9 19.5 L 16.5 19.5 L 15.8 19.7 L 15.1 20.4 L 14.8 21.1 L 14.8 21.3 L 14.8 21.8 L 7.9 21.8 L 7.9 21.8\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <circle cx=\\\"17.15\\\" cy=\\\"21.77\\\" r=\\\"2.31\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"1.8\\\" />\\n <path d=\\\"M 1.0 21.8 L 14.8 21.8\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 19.5 21.8 L 31.0 21.8\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.7 17.2 L 19.5 7.9\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"1.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"WRECKS04\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 16.0 25.0 L 16.0 25.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 7.0 10.0 L 7.0 22.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 25.0 10.0 L 25.0 22.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 16.0 L 31.0 16.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.0 7.0 L 16.0 25.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"WRECKS05\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 13.7 L 4.0 9.9 L 8.5 7.3 L 13.0 6.0 L 18.7 5.5 L 23.8 7.3 L 28.0 9.9 L 31.0 13.7 L 31.0 18.8 L 28.3 21.8 L 23.8 24.7 L 18.7 26.5 L 13.6 26.5 L 8.5 24.7 L 4.7 22.1 L 1.0 18.8 L 1.0 13.7 Z\\\" fill=\\\"DEPVS\\\" />\\n <path d=\\\"M 1.0 13.7 L 4.0 9.9 L 8.5 7.3 L 13.0 6.0 L 18.7 5.5 L 23.8 7.3 L 28.0 9.9 L 31.0 13.7 L 31.0 18.8 L 28.3 21.8 L 23.8 24.7 L 18.7 26.5 L 13.6 26.5 L 8.5 24.7 L 4.7 22.1 L 1.0 18.8 L 1.0 13.7\\\" fill=\\\"none\\\" stroke=\\\"DEPVS\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 8.5 11.1 L 8.5 21.4\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 23.8 11.1 L 23.8 21.4\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 3.4 16.3 L 29.0 16.3\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.2 8.6 L 16.2 23.9\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n};\n\nexport const S52_PATTERN_SVGS: Record<string, string> = {\n \"AIRARE02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"28\\\" height=\\\"28\\\" viewBox=\\\"0 0 28 28\\\">\\n <path d=\\\"M 8.9 25.1 L 18.8 25.1 L 15.9 21.8 L 15.9 17.6 L 27.0 17.6 L 16.8 10.7 L 16.8 5.6 L 14.3 2.9 L 11.3 5.6 L 11.3 10.7 L 1.0 17.3 L 11.5 17.4 L 11.5 22.0 L 8.9 25.1\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"CBLARE01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 0 32 L 32 0\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-opacity=\\\"0.7\\\" />\\n <path d=\\\"M -16 32 L 16 0\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-opacity=\\\"0.7\\\" />\\n <path d=\\\"M 16 32 L 48 0\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-opacity=\\\"0.7\\\" />\\n</svg>\\n\",\n \"DIAMOND1\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 8.2 1.0 L 23.8 31.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 8.2 31.0 L 23.8 1.0\\\" fill=\\\"none\\\" stroke=\\\"CHBLK\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"DQUALA11\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 22.4 9.2 L 27.7 9.2\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 26.7 7.1 L 23.5 11.4\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 23.5 7.1 L 26.7 11.4\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 13.1 9.2 L 18.5 9.2\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 17.4 7.1 L 14.2 11.4\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 14.2 7.1 L 17.4 11.4\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 3.8 9.3 L 9.1 9.3\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 8.1 7.2 L 4.9 11.5\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 4.9 7.2 L 8.1 11.5\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 8.8 15.5 L 14.1 15.5\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 13.0 13.4 L 9.8 17.6\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 9.9 13.4 L 13.0 17.6\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 18.1 15.4 L 23.4 15.4\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 22.4 13.3 L 19.2 17.6\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 19.2 13.3 L 22.4 17.5\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 13.7 21.4 L 19.0 21.4\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 18.0 19.3 L 14.8 23.6\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 14.8 19.3 L 18.0 23.6\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.5 9.0 L 1.0 7.6 L 1.2 6.6 L 1.5 5.9 L 2.4 5.6 L 2.9 5.5 L 28.1 5.5 L 29.6 5.7 L 30.5 6.1 L 30.8 6.6 L 31.0 7.1 L 31.0 7.5 L 31.0 8.2 L 30.7 8.7 L 18.5 24.9 L 18.0 25.4 L 17.6 26.0 L 17.1 26.3 L 16.8 26.3 L 16.4 26.5 L 15.8 26.4 L 15.5 26.3 L 14.8 26.1 L 14.4 25.8 L 14.1 25.4 L 13.7 25.0 L 1.5 9.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"DQUALA21\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 22.4 9.2 L 27.7 9.2\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 26.7 7.1 L 23.5 11.4\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 23.5 7.1 L 26.7 11.4\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 13.1 9.2 L 18.5 9.2\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 17.4 7.1 L 14.2 11.4\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 14.2 7.1 L 17.4 11.4\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 3.8 9.3 L 9.1 9.3\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 8.1 7.2 L 4.9 11.5\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 4.9 7.2 L 8.1 11.5\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 8.8 15.5 L 14.1 15.5\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 13.0 13.4 L 9.8 17.6\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 9.9 13.4 L 13.0 17.6\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 18.1 15.4 L 23.4 15.4\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 22.4 13.3 L 19.2 17.6\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 19.2 13.3 L 22.4 17.5\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.5 9.0 L 1.0 7.6 L 1.2 6.6 L 1.5 5.9 L 2.4 5.6 L 2.9 5.5 L 28.1 5.5 L 29.6 5.7 L 30.5 6.1 L 30.8 6.6 L 31.0 7.1 L 31.0 7.5 L 31.0 8.2 L 30.7 8.7 L 18.5 24.9 L 18.0 25.4 L 17.6 26.0 L 17.1 26.3 L 16.8 26.3 L 16.4 26.5 L 15.8 26.4 L 15.5 26.3 L 14.8 26.1 L 14.4 25.8 L 14.1 25.4 L 13.7 25.0 L 1.5 9.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"DQUALB01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 22.4 9.2 L 27.7 9.2\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 26.7 7.1 L 23.5 11.4\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 23.5 7.1 L 26.7 11.4\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 13.1 9.2 L 18.5 9.2\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 17.4 7.1 L 14.2 11.4\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 14.2 7.1 L 17.4 11.4\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 3.8 9.3 L 9.1 9.3\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 8.1 7.2 L 4.9 11.5\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 4.9 7.2 L 8.1 11.5\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 13.1 16.2 L 18.4 16.2\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 17.4 14.1 L 14.2 18.3\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 14.2 14.1 L 17.4 18.3\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.5 9.0 L 1.0 7.6 L 1.2 6.6 L 1.5 5.9 L 2.4 5.6 L 2.9 5.5 L 28.1 5.5 L 29.6 5.7 L 30.5 6.1 L 30.8 6.6 L 31.0 7.1 L 31.0 7.5 L 31.0 8.2 L 30.7 8.7 L 18.5 24.9 L 18.0 25.4 L 17.6 26.0 L 17.1 26.3 L 16.8 26.3 L 16.4 26.5 L 15.8 26.4 L 15.5 26.3 L 14.8 26.1 L 14.4 25.8 L 14.1 25.4 L 13.7 25.0 L 1.5 9.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"DQUALC01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 27.7 14.0 L 24.4 18.5\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 24.4 14.0 L 27.7 18.5\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 18.0 14.0 L 14.6 18.5\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 14.6 14.0 L 18.0 18.5\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 8.1 14.1 L 4.7 18.6\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 4.7 14.1 L 8.1 18.6\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 4.6 12.0 L 3.7 12.2 L 3.1 12.5 L 2.4 13.0 L 1.9 13.6 L 1.4 14.4 L 1.2 15.1 L 1.0 16.0 L 1.1 17.0 L 1.3 17.8 L 1.7 18.7 L 2.5 19.4 L 3.5 19.8 L 4.5 20.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 4.3 12.1 L 27.8 12.1 L 28.6 12.3 L 29.6 12.8 L 30.2 13.4 L 30.7 14.1 L 30.8 14.7 L 30.9 15.4 L 31.0 16.0 L 30.9 16.9 L 30.8 17.7 L 30.5 18.5 L 30.2 18.9 L 29.4 19.6 L 28.9 19.9 L 28.5 20.0 L 27.8 20.0 L 4.4 20.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 3.6 16.3 L 9.2 16.3\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 23.2 16.3 L 28.8 16.3\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 13.3 16.2 L 18.9 16.2\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"DQUALD01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 24.8 13.8 L 21.4 18.3\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 21.4 13.8 L 24.8 18.3\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 10.4 14.0 L 7.0 18.5\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 7.1 14.0 L 10.4 18.5\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 4.6 12.0 L 3.7 12.2 L 3.1 12.5 L 2.4 13.0 L 1.9 13.6 L 1.4 14.4 L 1.2 15.1 L 1.0 16.0 L 1.1 17.0 L 1.3 17.8 L 1.7 18.7 L 2.5 19.4 L 3.5 19.8 L 4.5 20.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 4.3 12.1 L 27.8 12.1 L 28.6 12.3 L 29.6 12.8 L 30.2 13.4 L 30.7 14.1 L 30.8 14.7 L 30.9 15.4 L 31.0 16.0 L 30.9 16.9 L 30.8 17.7 L 30.5 18.5 L 30.2 18.9 L 29.4 19.6 L 28.9 19.9 L 28.5 20.0 L 27.8 20.0 L 4.4 20.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 6.0 16.2 L 11.6 16.2\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 20.2 16.1 L 26.2 16.1\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"DQUALU01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 4.6 12.0 L 3.7 12.2 L 3.1 12.5 L 2.4 13.0 L 1.9 13.6 L 1.4 14.4 L 1.2 15.1 L 1.0 16.0 L 1.1 17.0 L 1.3 17.8 L 1.7 18.7 L 2.5 19.4 L 3.5 19.8 L 4.5 20.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 4.3 12.1 L 27.8 12.1 L 28.6 12.3 L 29.6 12.8 L 30.2 13.4 L 30.7 14.1 L 30.8 14.7 L 30.9 15.4 L 31.0 16.0 L 30.9 16.9 L 30.8 17.7 L 30.5 18.5 L 30.2 18.9 L 29.4 19.6 L 28.9 19.9 L 28.5 20.0 L 27.8 20.0 L 4.4 20.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 14.4 13.9 L 14.4 17.5 L 14.6 18.1 L 15.0 18.4 L 15.6 18.7 L 16.2 18.7 L 16.7 18.6 L 17.2 18.2 L 17.5 17.9 L 17.7 17.5 L 17.7 13.9\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"DRGARE01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"16\\\" height=\\\"16\\\" viewBox=\\\"0 0 16 16\\\"></svg>\\n\",\n \"FOULAR11\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"28\\\" height=\\\"28\\\" viewBox=\\\"0 0 28 28\\\">\\n <path d=\\\"M 24.8 17.9 L 18.0 27.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 18.0 17.9 L 24.8 27.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 3.2 1.0 L 10.0 10.1\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 9.9 1.1 L 3.2 10.2\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"FSHFAC03\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"28\\\" height=\\\"28\\\" viewBox=\\\"0 0 28 28\\\">\\n <path d=\\\"M 1.0 10.8 L 1.0 17.2 L 27.0 17.2 L 27.0 11.1\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 7.7 10.9 L 7.7 17.3\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 14.0 11.0 L 14.0 17.1\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 20.6 11.0 L 20.6 17.1\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"FSHFAC04\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"24\\\" height=\\\"24\\\" viewBox=\\\"0 0 24 24\\\">\\n <path d=\\\"M 1.0 21.4 L 23.0 21.4 L 23.0 11.9 L 1.1 11.9 L 1.1 21.4\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 3.8 2.6 L 13.2 12.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"FSHHAV02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 5.7 15.8 L 1.6 10.7\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 5.7 16.2 L 1.0 20.9\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 5.7 16.2 L 7.8 13.9 L 10.5 12.0 L 13.9 10.5 L 17.7 9.9 L 21.1 10.1 L 24.9 10.9 L 28.2 12.4 L 30.4 14.1 L 31.0 15.2\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 5.9 16.0 L 9.2 18.7 L 13.2 20.9 L 17.3 21.9 L 20.4 22.1 L 23.6 21.5 L 26.6 20.4 L 29.1 18.1 L 31.0 15.4\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 25.9 11.6 L 24.9 14.1 L 24.9 17.5 L 26.6 20.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"ICEARE04\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 4.7 29.9 L 9.2 26.4\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 9.1 L 5.5 14.2\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 13.6 17.2 L 19.2 18.6\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 13.0 7.2 L 14.5 2.1\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.7 27.8 L 22.6 26.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 27.9 18.4 L 29.2 24.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 25.5 8.6 L 31.0 8.2\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"MARCUL02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 4.8 19.3 L 10.6 14.1 L 13.7 12.4 L 16.1 11.7 L 18.3 11.4 L 20.8 11.9 L 23.5 12.7 L 25.2 13.8 L 26.6 14.9 L 27.5 16.2 L 26.0 17.4 L 24.5 18.6 L 22.2 19.6 L 20.4 20.2 L 18.1 20.3 L 15.8 20.2 L 13.5 19.7 L 11.8 18.8 L 4.8 13.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 11.7 L 1.0 7.5 L 30.8 7.5 L 30.8 11.6\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 20.3 L 1.0 24.6 L 31.0 24.6 L 31.0 20.3\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 7.3 20.3 L 7.3 24.6\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 24.4 20.3 L 24.4 24.6\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 15.9 20.3 L 15.9 24.4\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 7.3 7.6 L 7.3 11.9\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 24.4 7.5 L 24.4 11.8\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 15.8 7.4 L 15.8 11.7\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"MARSHES1\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"16\\\" height=\\\"16\\\" viewBox=\\\"0 0 16 16\\\">\\n <path d=\\\"M 8.0 10.4 L 8.0 1.1\\\" fill=\\\"none\\\" stroke=\\\"CHBRN\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 3.7 14.9 L 12.4 14.9\\\" fill=\\\"none\\\" stroke=\\\"CHBRN\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.0 12.0 L 15.0 12.0\\\" fill=\\\"none\\\" stroke=\\\"CHBRN\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 5.0 11.6 L 2.5 5.8\\\" fill=\\\"none\\\" stroke=\\\"CHBRN\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 10.8 11.6 L 13.3 6.0\\\" fill=\\\"none\\\" stroke=\\\"CHBRN\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"NODATA03\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"28\\\" height=\\\"28\\\" viewBox=\\\"0 0 28 28\\\">\\n <path d=\\\"M 1.0 14.1 L 27.0 13.9\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"OVERSC01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"16\\\" height=\\\"16\\\" viewBox=\\\"0 0 16 16\\\">\\n <path d=\\\"M 8.0 1.0 L 8.0 15.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"PIPARE01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 0 32 L 32 0\\\" fill=\\\"none\\\" stroke=\\\"PIPLN\\\" stroke-width=\\\"0.8\\\" stroke-opacity=\\\"0.7\\\" />\\n <path d=\\\"M -16 32 L 16 0\\\" fill=\\\"none\\\" stroke=\\\"PIPLN\\\" stroke-width=\\\"0.8\\\" stroke-opacity=\\\"0.7\\\" />\\n <path d=\\\"M 16 32 L 48 0\\\" fill=\\\"none\\\" stroke=\\\"PIPLN\\\" stroke-width=\\\"0.8\\\" stroke-opacity=\\\"0.7\\\" />\\n</svg>\\n\",\n \"PRTSUR01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"16\\\" height=\\\"16\\\" viewBox=\\\"0 0 16 16\\\">\\n <path d=\\\"M 1.0 8.0 L 15.0 8.0\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"QUESMRK1\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 20 20\\\">\\n <path d=\\\"M 5.5 4.9 L 6.1 3.8 L 6.6 2.7 L 7.3 2.1 L 8.0 1.4 L 9.0 1.0 L 10.0 1.1 L 11.2 1.4 L 12.3 1.7 L 13.3 3.1 L 14.0 3.8 L 14.5 4.7 L 14.5 5.8 L 14.0 6.7 L 13.5 7.6 L 12.6 8.6 L 11.7 9.6 L 10.9 10.6 L 10.3 11.4 L 9.9 12.1 L 9.8 13.0 L 9.8 13.9 L 9.8 14.6 L 9.9 15.5 L 9.9 15.6\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 9.0 19.0 L 11.2 19.0\\\" fill=\\\"none\\\" stroke=\\\"CHMGD\\\" stroke-width=\\\"1.2\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"RCKLDG01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 5.6 29.0 L 9.8 25.7\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 4.2 7.2 L 6.2 13.2\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 16.1 14.7 L 13.0 19.2\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 13.2 7.8 L 14.7 3.1\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 17.9 22.2 L 18.9 27.8\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 28.8 21.5 L 31.0 16.5\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 29.1 9.8 L 24.2 8.2\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 6.2 13.1 L 1.0 10.4\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 13.2 19.1 L 12.7 13.9\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 5.5 29.0 L 6.0 24.0\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 18.0 22.2 L 22.1 25.5\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 30.9 16.5 L 25.7 18.7\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 24.3 8.3 L 28.3 5.6\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 14.7 3.0 L 16.8 7.6\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"SNDWAV01\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"32\\\" height=\\\"32\\\" viewBox=\\\"0 0 32 32\\\">\\n <path d=\\\"M 1.0 18.3 L 3.1 18.3 L 4.2 17.7 L 5.9 14.0 L 6.8 14.0 L 8.2 17.7 L 8.9 18.3 L 13.4 18.3 L 14.2 17.6 L 15.3 14.1 L 16.0 14.1 L 17.3 17.6 L 18.1 18.3 L 21.8 18.3 L 23.1 18.3 L 23.9 17.8 L 25.5 13.7 L 26.4 13.7 L 27.9 17.7 L 28.9 18.3 L 31.0 18.3\\\" fill=\\\"none\\\" stroke=\\\"CHGRD\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"TSSJCT02\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"20\\\" height=\\\"20\\\" viewBox=\\\"0 0 20 20\\\">\\n <path d=\\\"M 1.0 19.0 L 19.0 1.0\\\" fill=\\\"none\\\" stroke=\\\"TRFCF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"VEGATN03\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"16\\\" height=\\\"16\\\" viewBox=\\\"0 0 16 16\\\">\\n <path d=\\\"M 7.8 15.0 L 7.8 1.1\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 1.6 4.5 L 14.4 4.5\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 4.0 7.9 L 11.6 7.9\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 5.5 1.0 L 10.1 1.0\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 5.9 15.0 L 10.1 15.0\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 3.9 2.7 L 11.6 2.7\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 3.3 6.1 L 12.5 6.1\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n \"VEGATN04\": \"<svg xmlns=\\\"http://www.w3.org/2000/svg\\\" width=\\\"16\\\" height=\\\"16\\\" viewBox=\\\"0 0 16 16\\\">\\n <circle cx=\\\"8.00\\\" cy=\\\"8.00\\\" r=\\\"5.25\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" />\\n <path d=\\\"M 1.0 13.3 L 15.0 13.3\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n <path d=\\\"M 8.0 13.2 L 8.0 7.5\\\" fill=\\\"none\\\" stroke=\\\"LANDF\\\" stroke-width=\\\"0.8\\\" stroke-linecap=\\\"round\\\" stroke-linejoin=\\\"round\\\" />\\n</svg>\\n\",\n};\n\nexport const S52_LINE_SVGS: Record<string, string> = {\n\n};\n","/**\n * S-52 SVG Loader — pure (DOM-free) string operations over the inlined S-52\n * SVG catalogue in `s52-svgs-generated.ts`. SVG files use S-52 color token\n * names (e.g., CHBLK, LITRD) as fill/stroke values; `applyColorTheme` swaps\n * those tokens for hex from the active palette.\n *\n * Browser-only image loaders live in `./s52-svg-loader-browser.ts` (sub-export\n * `@chrtco/sdk/atlas/browser`) — they use `new Image()` and require a DOM.\n */\n\nimport { resolveColor, type ColorTableName, S52_DAY, S52_DUSK, S52_NIGHT } from \"./s52-colors\";\nimport {\n S52_POINT_SVGS,\n S52_PATTERN_SVGS,\n S52_LINE_SVGS,\n} from \"./s52-svgs-generated\";\n\n/** All S-52 SVGs by name (point + pattern + line) */\nexport const ALL_S52_SVGS: Record<string, string> = {\n ...S52_POINT_SVGS,\n ...S52_PATTERN_SVGS,\n ...S52_LINE_SVGS,\n};\n\n// ── All known color tokens across all S-52 palettes ──────────────\n\nconst ALL_COLOR_TOKENS: Set<string> = new Set([\n ...Object.keys(S52_DAY),\n ...Object.keys(S52_DUSK),\n ...Object.keys(S52_NIGHT),\n // Additional tokens from OpenCPN that may appear in SVGs\n \"CHRED\", \"CHGRN\", \"CHYLW\", \"CHMGD\", \"CHMGF\", \"CHWHT\",\n \"SCLBR\", \"CHCOR\", \"ISDNG\", \"SNDG1\", \"SNDG2\", \"DEPSC\", \"DEPCN\",\n \"RADHI\", \"RADLO\", \"ARPAT\", \"NINFO\", \"ADINF\", \"RESGR\",\n \"SHIPS\", \"PSTRK\", \"SYTRK\", \"PLRTE\", \"APLRT\",\n \"UINFD\", \"UINFF\", \"UIBCK\", \"UIAFD\", \"UINFR\", \"UINFG\",\n \"UINFO\", \"UINFB\", \"UINFM\", \"UIBDR\", \"UIAFF\",\n \"OUTLL\", \"RES01\", \"RES02\", \"RES03\", \"BKAJ2\",\n]);\n\n// ── Public API ───────────────────────────────────────────────────\n\n/**\n * Get raw SVG string for an S-52 symbol by name (e.g., \"BOYCAN01\").\n * Returns null if the symbol is not found.\n */\nexport function getS52SvgString(symbolName: string): string | null {\n return ALL_S52_SVGS[symbolName] ?? null;\n}\n\n/**\n * Get an S-52 SVG string with color tokens resolved to hex values\n * from the specified color table.\n */\nexport function getThemedS52Svg(\n symbolName: string,\n colorTable: ColorTableName = \"DAY\",\n): string | null {\n const raw = ALL_S52_SVGS[symbolName];\n if (!raw) return null;\n return applyColorTheme(raw, colorTable);\n}\n\n/**\n * Replace S-52 color token names in an SVG string with hex colors\n * from the active color table.\n *\n * Matches tokens in fill=\"TOKEN\" and stroke=\"TOKEN\" attribute values.\n */\nexport function applyColorTheme(\n svgString: string,\n colorTable: ColorTableName = \"DAY\",\n): string {\n return svgString.replace(\n /(fill|stroke)=\"([A-Z][A-Z0-9]{3,5})\"/g,\n (match, attr, token) => {\n if (token === \"none\") return match;\n if (ALL_COLOR_TOKENS.has(token)) {\n const hex = resolveColor(token, colorTable);\n return `${attr}=\"${hex}\"`;\n }\n return match;\n },\n );\n}\n\n/**\n * Multiply every `stroke-width=\"N\"` in the SVG by `multiplier`.\n * The source SVGs are translated from S-52 PresLib at native widths\n * (mostly 0.8, sometimes 1.2/1.8) — a small boost makes outlines read\n * cleaner against busy chart backgrounds without changing symbol geometry.\n */\nexport function applyStrokeBoost(svgString: string, multiplier: number): string {\n if (multiplier === 1) return svgString;\n return svgString.replace(\n /stroke-width=\"([0-9.]+)\"/g,\n (_match, w) => `stroke-width=\"${(parseFloat(w) * multiplier).toFixed(3)}\"`,\n );\n}\n\n/** Stroke-width multiplier applied to S-52 symbols at load time. */\nexport const S52_STROKE_BOOST = 1.25;\n\n/** Get a list of all available S-52 point symbol names. */\nexport function getAvailablePointSymbols(): string[] {\n return Object.keys(S52_POINT_SVGS);\n}\n\n/** Get a list of all available S-52 pattern names. */\nexport function getAvailablePatterns(): string[] {\n return Object.keys(S52_PATTERN_SVGS);\n}\n\n/** Get a list of all available S-52 line symbol names. */\nexport function getAvailableLineSymbols(): string[] {\n return Object.keys(S52_LINE_SVGS);\n}\n\n/** Stats for debugging */\nexport function getS52SymbolStats(): {\n pointCount: number;\n patternCount: number;\n lineCount: number;\n totalCount: number;\n} {\n return {\n pointCount: Object.keys(S52_POINT_SVGS).length,\n patternCount: Object.keys(S52_PATTERN_SVGS).length,\n lineCount: Object.keys(S52_LINE_SVGS).length,\n totalCount: Object.keys(ALL_S52_SVGS).length,\n };\n}\n","/**\n * Zoom range of CHRT tile builds — kept in lockstep with the baremetal\n * tippecanoe invocation (tools/chrt-baremetal/server/src/tilebuild/per-layer-zoom.ts).\n *\n * Per-S-57-class minzoom/maxzoom narrowing is handled inside the MVT at\n * tile-build time via per-feature `tippecanoe.minzoom/maxzoom`; these two\n * constants are the outer envelope the MapLibre source declares, so the\n * client doesn't request tiles outside what the pmtiles can actually serve.\n */\nexport const BUILD_MINZOOM = 3;\nexport const BUILD_MAXZOOM = 14;\n","/**\n * Post-consolidation (2026-04): one consolidated PMTiles per region, all\n * S-57 classes as distinct MVT layers inside. The MapLibre style emits one\n * vector source (id = region) and N paint layers that reference it via\n * `source-layer` = S-57 class name.\n *\n * `buildSources()` returns either the legacy Mapbox MTS shape (preserved for\n * demos / external style export — see generateStyle comments) or the PMTiles\n * shape pointing at a single tile URL per region.\n */\n\nimport {\n BUILD_MINZOOM,\n BUILD_MAXZOOM,\n} from \"./tile-zoom\";\n\n/** Vector source emitted for the legacy Mapbox MTS path. */\nexport interface MapboxVectorSource {\n type: \"vector\";\n url: string;\n}\n\n/**\n * Vector source emitted for the tiles.chrt.co PMTiles path. Uses an explicit\n * `tiles` array (not a TileJSON `url`) because the tile-worker serves raw MVT\n * bytes without a TileJSON descriptor.\n */\nexport interface PmtilesVectorSource {\n type: \"vector\";\n tiles: string[];\n minzoom: number;\n maxzoom: number;\n}\n\nexport type VectorSourceSpec = MapboxVectorSource | PmtilesVectorSource;\n\nexport type SourceMode = \"mapbox\" | \"pmtiles\";\n\n/**\n * Default tile-worker origin for PMTiles mode. Callers should pass\n * `tileBaseUrl` explicitly via `BuildSourcesOptions` to override (e.g. the\n * React app reads `import.meta.env.VITE_TILE_WORKER_BASE`; the offline-worker\n * reads `env.TILE_BASE_URL`). This constant is the prod fallback only.\n */\nexport const DEFAULT_TILE_BASE_URL = \"https://tiles.chrt.co\";\n\n/** Canonical source id used in `generateStyle()` — matches the region name\n * of the one consolidated PMTiles served by the tile-worker for this region. */\nexport const DEFAULT_REGION = \"NOAA_ENC\";\n\nexport interface BuildSourcesOptions {\n /** Which tile path to emit. Default: \"pmtiles\" (the supported path post-Mapbox). */\n mode?: SourceMode;\n /** Chart region. Default: \"NOAA_ENC\". */\n region?: string;\n /**\n * Reserved for future cache-busting on KV-pointer flips. Currently unused;\n * build pinning rides in the JWT, not the URL.\n */\n buildTag?: string;\n /** Override tile-worker origin (e.g. staging). Default: DEFAULT_TILE_BASE_URL. */\n tileBaseUrl?: string;\n}\n\n/**\n * Build the \"sources\" block for a CHRT style.\n *\n * - `mode: \"mapbox\"`: one mapbox:// url (kept for external style export only).\n * - `mode: \"pmtiles\"` (default): one vector tile endpoint for the region,\n * routed by the Worker to the one consolidated PMTiles:\n * `${tileBaseUrl}/v1/tiles/{region}/{z}/{x}/{y}.mvt`\n */\nexport function buildSources(\n opts: BuildSourcesOptions = {},\n): Record<string, VectorSourceSpec> {\n const mode: SourceMode = opts.mode ?? \"pmtiles\";\n const region = opts.region ?? DEFAULT_REGION;\n\n if (mode === \"mapbox\") {\n return {\n [region]: {\n type: \"vector\",\n url: `mapbox://chrt.${region.toLowerCase()}`,\n },\n };\n }\n\n const base = (opts.tileBaseUrl ?? DEFAULT_TILE_BASE_URL).replace(/\\/+$/, \"\");\n return {\n [region]: {\n type: \"vector\",\n tiles: [`${base}/v1/tiles/${region}/{z}/{x}/{y}.mvt`],\n minzoom: BUILD_MINZOOM,\n maxzoom: BUILD_MAXZOOM,\n },\n };\n}\n","/**\n * Builds Mapbox GL Style layer specs from S-52 lookup entries.\n * Wraps the existing atlas resolveStyle() and adds source/source-layer/filter.\n */\n\nimport { resolveStyle, scaminToMinZoom } from \"./style-resolver\";\nimport { S52_LOOKUP } from \"./s52-lookup\";\nimport { S52_DRAW_ORDER } from \"./draw-order\";\nimport { getIconExpression, SYMBOL_MAP } from \"./symbols\";\nimport { getLabelConfig, LABELED_LAYERS, getLabelBehavior } from \"./labels\";\nimport { resolveColor } from \"./s52-colors\";\nimport type { ColorTableName } from \"./s52-colors\";\nimport type { GeomType } from \"./types\";\nimport { DEFAULT_REGION } from \"./source-registry\";\nimport { colourCodeCase, lightFillExpression } from \"./s52-conditional\";\n\n// Geometry-type filters for Mapbox GL\nconst GEOM_FILTERS: Record<string, unknown[]> = {\n fill: [\"any\", [\"==\", [\"geometry-type\"], \"Polygon\"], [\"==\", [\"geometry-type\"], \"MultiPolygon\"]],\n line: [\"any\", [\"==\", [\"geometry-type\"], \"LineString\"], [\"==\", [\"geometry-type\"], \"MultiLineString\"]],\n circle: [\"any\", [\"==\", [\"geometry-type\"], \"Point\"], [\"==\", [\"geometry-type\"], \"MultiPoint\"]],\n symbol: [\"any\", [\"==\", [\"geometry-type\"], \"Point\"], [\"==\", [\"geometry-type\"], \"MultiPoint\"]],\n};\n\n// Layers that should get fill outlines\nconst FILL_OUTLINE_LAYERS = new Set([\n \"DEPARE\", \"LNDARE\", \"DRGARE\", \"LAKARE\", \"RIVERS\", \"CANALS\", \"BUAARE\",\n \"RESARE\", \"ACHARE\", \"FAIRWY\", \"TESARE\", \"MIPARE\", \"PRCARE\",\n \"PYLONS\",\n]);\n\n// Cable/pipeline regulated-area boundaries — S-52 PresLib L32/L42 portray\n// these classes with a dashed coloured boundary in addition to the hatched\n// fill pattern. The low-opacity wash + hatching alone wouldn't read clearly\n// against busy water; the dashed boundary is the strongest \"regulated zone\"\n// cue mariners look for. Colour matches each class's fill token\n// (CHMGD for cables, PIPLN for pipelines).\nconst REGULATED_AREA_BOUNDARY_LAYERS: Record<string, string> = {\n CBLARE: \"CHMGD\",\n PIPARE: \"PIPLN\",\n};\n\n// Polygon-source classes whose `style.type === \"line\"` means \"draw the\n// polygon's BOUNDARY as a line\" (S-52 boundary-only portrayal — used for\n// regulated areas where a flood fill would obscure underlying chart data\n// when many features overlap). Without this set, the default\n// `GEOM_FILTERS[\"line\"]` would reject the polygon geometries entirely and\n// the layer would render nothing.\n//\n// Members are kept in sync with s52-lookup entries that use `type: \"line\"`\n// for what is actually a polygon source-layer. Regulated-area classes\n// (CTNARE, RESARE, MIPARE, TESARE) all hit the same flood-fill failure\n// mode in dense harbors where many features overlap — boundary-only\n// rendering matches S-52 spec and removes the stacking problem.\nconst LINE_FROM_POLYGON_LAYERS = new Set([\n \"CTNARE\", \"RESARE\", \"MIPARE\", \"TESARE\", \"MAGVAR\", \"PRDARE\",\n]);\n\n// Zoom-scaled line widths (from style-resolver.ts)\nconst ZOOM_SCALED_LINES: Record<string, [number, number, number, number]> = {\n DEPCNT: [8, 0.3, 14, 0.8],\n COALNE: [8, 0.5, 14, 1.5],\n SLCONS: [8, 0.6, 14, 1.5],\n TSSBND: [8, 0.5, 14, 1.0],\n BRIDGE: [8, 1.0, 14, 2.0],\n DAMCON: [8, 1.0, 14, 2.0],\n};\n\n// Base cartographic fills that need full opacity.\n// SEAARE included so its cross-band water base (drawn under DEPARE) is opaque\n// — see `draw-order.ts` and the `s52-lookup.ts` SEAARE entry.\nconst OPAQUE_FILLS = new Set([\"DEPARE\", \"LNDARE\", \"UNSARE\", \"LAKARE\", \"DRGARE\", \"SEAARE\"]);\n\n// Safety-critical groups that allow icon overlap\nconst SAFETY_GROUPS = new Set([24020, 27010, 27070, 27080]);\n\n// Subset of SAFETY_GROUPS that represents underwater HAZARDS (UWTROC,\n// OBSTRN, WRECKS — S-52 viewing group 24020). These need different\n// treatment from nav aids: hazards cluster densely in rocky coastal\n// fields (Boston Harbor, Beverly, Salem, Marblehead) where blindly\n// allowing every icon to overlap turns the shoreline into a black mass\n// at z12–14. We let MapLibre deconflict via collision detection and use\n// a symbol-sort-key so the most dangerous rocks (covers-and-uncovers >\n// awash > shallow submerged) win collisions when density forces drops.\nconst HAZARD_GROUPS = new Set([24020]);\n\n// Per-class icon offsets (pixels) for child / auxiliary symbols so they\n// don't render directly behind the parent buoy/beacon symbol.\n// S-52 convention: fog signal → lower-left; radar → lower-right; topmark → top-center;\n// light flare → lower-right (matches the bottom-right teardrop geometry).\n// Values are [x, y] in pixels: positive x = right, positive y = down.\nconst CHILD_ICON_OFFSETS: Record<string, [number, number]> = {\n FOGSIG: [-22, 18], // lower-left quadrant of the buoy symbol\n RTPBCN: [22, 18], // lower-right quadrant\n TOPMAR: [0, -24], // directly above the buoy symbol\n DAYMAR: [0, -20], // directly above (like TOPMAR)\n LIGHTS: [14, 14], // lower-right, off the buoy hull so the flare is visible\n};\n\n// Safety-critical labels that should win collisions against basemap chrome.\n// These get `text-allow-overlap: true` so the chart info isn't dropped by\n// the (separate) Carto basemap's own road/place labels.\nconst SAFETY_CRITICAL_LABELS = new Set([\n \"LIGHTS\", \"SOUNDG\",\n \"BOYLAT\", \"BCNLAT\",\n \"BOYCAR\", \"BCNCAR\",\n \"BOYSPP\", \"BCNSPP\",\n \"BOYISD\", \"BOYSAW\",\n \"FOGSIG\", \"RTPBCN\",\n]);\n\n/**\n * Subset of the safety-critical nav-aid label classes that exist in HIGH\n * density at Harbor-band scales — many features sit feet apart along\n * channel margins / regulated-area boundaries (Logan Airport security\n * zones, Boston Main Channel buoys, etc.). At lower bands (Coastal,\n * Approach), density is low enough that allow-overlap-against-basemap is\n * worth the cost; at Harbor band it produces unreadable label pile-ups\n * because every label wins against every other.\n *\n * `style-generator.ts` consults this set when fanning labels by band: at\n * band 5/6 these classes get `text-allow-overlap: false`, denser\n * `text-padding`, and a `symbol-sort-key` for deterministic collision\n * arbitration. At lower bands the standard safety-critical behaviour\n * (allow-overlap=true) still applies.\n *\n * NOT included (genuinely irreducible at every zoom — keep allow-overlap\n * across the board): LIGHTS, LITVES, LITFLT, FOGSIG, RTPBCN. Light\n * characteristics are non-substitutable safety information.\n *\n * SOUNDG is also excluded — soundings are visually managed by the\n * tippecanoe priority drop, not collision filtering.\n */\nexport const HIGH_DENSITY_NAV_AIDS = new Set([\n \"BOYLAT\", \"BOYCAR\", \"BOYSPP\", \"BOYISD\", \"BOYSAW\", \"BOYINB\",\n \"BCNLAT\", \"BCNCAR\", \"BCNSPP\", \"BCNISD\", \"BCNSAW\",\n]);\n\nexport interface StyleLayer {\n id: string;\n type: string;\n source: string;\n \"source-layer\": string;\n filter?: unknown[];\n paint: Record<string, unknown>;\n layout?: Record<string, unknown>;\n minzoom?: number;\n maxzoom?: number;\n metadata?: Record<string, unknown>;\n}\n\n/**\n * Build a nav-aid label expression for the PMTiles path. Mirrors\n * `preprocessNavAids()` behavior at expression level: prefix the OBJNAM\n * with the colour-letter (R / G / Y) so mariners get the most important\n * cue at a glance. Falls through to `_navAidLabel` if a runtime path\n * already preprocessed the feature.\n */\nfunction buildNavAidLabelExpression(): unknown[] {\n // Order matters for multi-colour marks; red wins over green wins over yellow.\n const colourPrefix = colourCodeCase(\n [\n [\"3\", \"R \"],\n [\"4\", \"G \"],\n [\"6\", \"Y \"],\n ],\n \"\",\n );\n return [\n \"case\",\n [\"has\", \"_navAidLabel\"], [\"get\", \"_navAidLabel\"],\n [\"has\", \"OBJNAM\"], [\"concat\", colourPrefix, [\"get\", \"OBJNAM\"]],\n \"\",\n ];\n}\n\n/**\n * Build a light label text-field expression using Mapbox GL expressions.\n * Replicates preprocessLights() logic as a static GL expression.\n */\nfunction buildLightLabelExpression(): unknown[] {\n // LITCHR → abbreviation\n const litchrExpr = [\n \"match\", [\"coalesce\", [\"get\", \"LITCHR\"], 0],\n 1, \"F\", 2, \"Fl\", 3, \"LFl\", 4, \"Oc\", 5, \"Iso\",\n 6, \"S.Fl\", 7, \"S.LFl\", 12, \"Mo\", 13, \"Q\", 14, \"VQ\", 15, \"UQ\",\n \"\",\n ];\n\n // COLOUR → letter. COLOUR is a list-typed S-57 attribute stored as\n // an array (`[\"3\"]`) or JSON-string post-tippecanoe (`\"[\\\"3\\\"]\"`); the\n // helper below handles every observed shape. Order matters for\n // multi-colour marks — red wins over green wins over white.\n const colourExpr = colourCodeCase(\n [\n [\"3\", \" R\"],\n [\"4\", \" G\"],\n [\"6\", \" Y\"],\n [\"11\", \" Or\"],\n [\"5\", \" Bu\"],\n [\"1\", \" W\"],\n ],\n \"\",\n );\n\n // SIGGRP → \"(N)\" group notation, e.g. \"(2)\" for Fl(2), \"(2+1)\" for composite.\n // S-57 stores this as a string already formatted with parens, e.g. \"(2)\".\n // Only include it when the group count > 1 — a single-flash Fl has no group.\n const siggrpExpr = [\n \"case\",\n [\"all\",\n [\"has\", \"SIGGRP\"],\n [\"!=\", [\"coalesce\", [\"get\", \"SIGGRP\"], \"\"], \"\"],\n [\"!=\", [\"coalesce\", [\"get\", \"SIGGRP\"], \"(1)\"], \"(1)\"],\n ],\n [\"to-string\", [\"get\", \"SIGGRP\"]],\n \"\",\n ];\n\n // SIGPER → \"Ns\" or \"\"\n const sigperExpr = [\n \"case\",\n [\"all\", [\"has\", \"SIGPER\"], [\">\", [\"to-number\", [\"get\", \"SIGPER\"], 0], 0]],\n [\"concat\", \" \", [\"to-string\", [\"get\", \"SIGPER\"]], \"s\"],\n \"\",\n ];\n\n return [\"concat\", litchrExpr, siggrpExpr, colourExpr, sigperExpr];\n}\n\n/**\n * Build all Mapbox GL layers for a given S-57 object class.\n * Returns multiple layers (fill, outline, symbol, label, etc.).\n *\n * Post-consolidation: all S-57 classes live as MVT layers inside one\n * consolidated PMTiles per region; `source` is always the region name.\n */\nexport function buildLayersForClass(\n objectClass: string,\n ct: ColorTableName,\n sourceId: string = DEFAULT_REGION,\n): StyleLayer[] {\n // Only build layers for classes the S-52 lookup actually has styling for;\n // otherwise we'd emit orphan paint layers for classes with no `resolveStyle`\n // hit, which MapLibre would render as empty but still count against layer\n // budget.\n if (!S52_LOOKUP[objectClass]) return [];\n\n const entry = S52_LOOKUP[objectClass];\n const layers: StyleLayer[] = [];\n\n // Determine what geometry types this class should render as\n const geomTypes = getGeomTypesForClass(objectClass, entry?.style.type);\n\n for (const geomType of geomTypes) {\n const resolved = resolveStyle(objectClass, geomType, ct);\n const layerId = `s52-${objectClass}-${resolved.type}`;\n\n const layer: StyleLayer = {\n id: layerId,\n type: resolved.type,\n source: sourceId,\n \"source-layer\": objectClass,\n paint: resolved.paint as Record<string, unknown>,\n metadata: {\n \"s52:objectClass\": objectClass,\n \"s52:displayCategory\": entry?.displayCategory ?? \"OTHER\",\n \"s52:category\": entry?.category ?? \"Meta\",\n },\n };\n\n // Geometry filter. Default: match resolved.type to its geometry kind\n // (fill→Polygon, line→LineString, etc.). Override for polygon-source\n // classes that render as \"line\" (boundary-only) — those need the FILL\n // filter so MapLibre draws the polygon's boundary as a line.\n if (resolved.type === \"line\" && LINE_FROM_POLYGON_LAYERS.has(objectClass)) {\n layer.filter = GEOM_FILTERS.fill;\n } else if (GEOM_FILTERS[resolved.type]) {\n layer.filter = GEOM_FILTERS[resolved.type];\n }\n\n // Minzoom\n if (resolved.minzoom) {\n layer.minzoom = resolved.minzoom;\n }\n\n // Force opaque fills for base layers\n if (resolved.type === \"fill\" && OPAQUE_FILLS.has(objectClass)) {\n layer.paint[\"fill-opacity\"] = 1.0;\n }\n\n // Zoom-scaled line widths\n if (resolved.type === \"line\" && ZOOM_SCALED_LINES[objectClass]) {\n const [z1, w1, z2, w2] = ZOOM_SCALED_LINES[objectClass];\n layer.paint[\"line-width\"] = [\"interpolate\", [\"linear\"], [\"zoom\"], z1, w1, z2, w2];\n }\n\n // Symbol layer enhancements\n if (resolved.type === \"symbol\") {\n const iconExpr = getIconExpression(objectClass);\n const childOffset = CHILD_ICON_OFFSETS[objectClass];\n // Safety-critical nav aids (LIGHTS, BOYLAT, BCNLAT, BCNSPP, FOGSIG,\n // RTPBCN, …) need to stay readable next to their coastal-scale labels\n // (so we can't fall all the way back to the default curve at z9–z11)\n // but the prior curve (z11=0.85, z14=1.0, z17=1.2) made them feel\n // oversized and crowded at coastal/approach zooms.\n //\n // Shape: small plateau through z11 so nav-aids don't crowd lower-band\n // views, steep climb z14→z18 so they pop at deep zoom, capped at z18.\n // The plateau values stay above the default curve (~0.4 vs 0.32) so\n // safety-critical symbols still read larger than non-safety ones at\n // coastal scale, just not dominant. Safety-critical groups: §SY\n // viewing groups 24020, 27010, 27070, 27080.\n const isSafetyCritical = SAFETY_GROUPS.has(entry?.viewingGroup ?? 0);\n const safetyCriticalIconSize: unknown[] = [\n \"interpolate\", [\"linear\"], [\"zoom\"],\n 6, 0.4,\n 12, 0.45,\n 14, 0.6,\n 18, 1.1,\n ];\n // Small flat plateau z6–z13 keeps non-safety nav-aids out of the way\n // at sound-scale views; steep climb z14→z18 so they pop at deep zoom.\n const defaultIconSize: unknown[] = [\n \"interpolate\", [\"linear\"], [\"zoom\"],\n 6, 0.32,\n 13, 0.32,\n 14, 0.36,\n 18, 1.04,\n ];\n layer.layout = {\n \"icon-image\": iconExpr,\n \"icon-size\": defaultIconSize,\n \"icon-allow-overlap\": isSafetyCritical,\n \"icon-optional\": !isSafetyCritical,\n ...(childOffset ? { \"icon-offset\": childOffset } : {}),\n ...(resolved.layout ?? {}),\n // Safety-critical icon-size MUST be applied AFTER the resolved.layout\n // spread. Otherwise the static \"icon-size\" baked into safety-critical\n // lookup entries (LIGHTS 0.7, BOYLAT 0.7, BCNLAT 0.6, BCNSPP 0.6,\n // FOGSIG 0.6, RTPBCN 0.6) suppresses the coastal-scale curve and the\n // icons stay invisibly small at z9–z11 next to their large labels.\n // Non-safety classes keep the static-or-default cascade from above.\n ...(isSafetyCritical ? { \"icon-size\": safetyCriticalIconSize } : {}),\n };\n\n // Hazard density deconfliction — UWTROC / OBSTRN / WRECKS (viewing\n // group 24020). These cluster heavily in rocky coastal fields (Boston\n // Harbor, Beverly, Salem, Marblehead) where the safety-critical\n // defaults (always-overlap + amplified icon-size) collapsed entire\n // shorelines into a black mass at z12–14. Override AFTER the\n // resolved.layout spread so the lookup's smaller hazard icon-size\n // curve (`[12, 0.3, 14, 0.5, 16, 0.7]`) wins over the nav-aid-tier\n // safety-critical curve, and let MapLibre's collision system drop\n // overlapping symbols. The symbol-sort-key ranks features by danger\n // so the rocks most likely to put a hull on the bottom win the\n // collisions — covers-and-uncovers (WATLEV=4) > awash (WATLEV=5) >\n // submerged-by-VALSOU (shallower depth = lower sort key). Lower\n // sort-key wins in MapLibre's collision arbitration.\n if (HAZARD_GROUPS.has(entry?.viewingGroup ?? 0)) {\n const watlev = [\"to-number\", [\"coalesce\", [\"get\", \"WATLEV\"], [\"get\", \"watlev\"], 0], 0];\n const valsou = [\"to-number\", [\"coalesce\", [\"get\", \"VALSOU\"], [\"get\", \"valsou\"], 99], 99];\n\n // Hazard-specific icon-size curve. Distinct from the nav-aid\n // safety-critical curve because hazards have different visual\n // priorities at different zoom levels:\n //\n // z11 (approach) 0.40 → 7-8 px asterisk: SCAMIN hides most\n // rocks; the few that survive should\n // register as hazards but not dominate.\n // z13 (coastal) 0.65 → 12 px asterisk: density-deconfliction\n // kicks in; surviving rocks are clearly\n // legible.\n // z14 (harbor app) 0.90 → 16 px asterisk: every rock must\n // register at harbor-entry scale.\n // z16 (harbor) 1.20 → 22 px asterisk: bold, matching NOAA\n // paper-chart asterisk at 1:5000.\n // z18 (berthing) 1.50 → 27 px asterisk: dominant safety\n // feature, no missing a rock when\n // maneuvering.\n //\n // SVG content is drawn in an 18-unit central span of the 32-unit\n // viewBox, so the rendered asterisk size is `icon-size × 18`.\n // Stroke width 1.6 in the SVG scales to ~1.4–2.4 px across the\n // zoom range — matches NOAA paper-chart prominence.\n const hazardIconSize: unknown[] = [\n \"interpolate\", [\"linear\"], [\"zoom\"],\n 10, 0.30,\n 12, 0.50,\n 13, 0.65,\n 14, 0.90,\n 16, 1.20,\n 18, 1.50,\n ];\n\n layer.layout = {\n ...layer.layout,\n \"icon-size\": hazardIconSize,\n \"icon-allow-overlap\": false,\n \"icon-optional\": true,\n // Pad each hazard's collision box so adjacent rocks don't stack\n // visually. At z12–13 a 2 px pad roughly doubles the dedupe\n // radius relative to the rendered icon, which is the difference\n // between a black mass and individually-legible hazards.\n \"icon-padding\": 2,\n \"symbol-sort-key\": [\n \"case\",\n [\"==\", watlev, 4], 1,\n [\"==\", watlev, 5], 2,\n // Submerged rocks: sounded depth determines priority. Shallower\n // = smaller sort-key = wins collisions. Offset by 10 so any\n // submerged rock still loses to a covers-and-uncovers / awash\n // hazard at the same point, but ranks dangerously-shallow\n // submerged rocks above deeper ones.\n [\"+\", 10, valsou],\n ],\n };\n }\n\n // LIGHTS icon is loaded as SDF — tint it from the COLOUR attribute so\n // a Fl R light renders red, Fl G green, etc., instead of the magenta\n // S-52 default that ignored the actual light colour. Halo gives a\n // CHBLK outline so the flare reads cleanly against pale water fills.\n if (objectClass === \"LIGHTS\") {\n layer.paint[\"icon-color\"] = lightFillExpression(ct);\n layer.paint[\"icon-halo-color\"] = resolveColor(\"CHBLK\", ct);\n layer.paint[\"icon-halo-width\"] = 1;\n }\n } else if (resolved.layout) {\n layer.layout = resolved.layout;\n }\n\n // LNDMRK split: three variants.\n // - wind (CATLMK ∈ {18, 19} — windmills, wind motors, offshore wind\n // farms like Block Island, South Fork, Revolution): bypass scamin so\n // wind farms appear at sound-scale views (z≈10). 500 m exclusion\n // zones + aviation lights → nav-aid-tier visibility.\n // - lighthouse (CATLMK = 17 — tower): bypass scamin so major coastal\n // lighthouses (Boston Light, Highland Light, etc.) surface their\n // LNDMRK structure icon + OBJNAM at coastal zoom alongside the\n // already-coastal LIGHTS flare. CATLMK = 17 covers radio/water\n // towers too — accepted trade-off (handful of false positives ≪\n // missing every named lighthouse below z12). S-57 has no dedicated\n // \"lighthouse\" CATLMK; lighthouses are encoded via the co-located\n // LIGHTS class, so any narrower filter would require a spatial join.\n // - other (remaining subtypes: silos, spires, churches, masts, …):\n // keep the scamin floor (z ≥ 12) so low-zoom views aren't cluttered.\n //\n // Note: `resolveStyle` doesn't return a minzoom for symbol layers with\n // an iconImage (early-return path), so we apply the scamin floor here\n // ourselves on the \"other\" variant — otherwise it would render at every\n // zoom alongside wind + lighthouse.\n if (objectClass === \"LNDMRK\" && resolved.type === \"symbol\") {\n const baseFilterParts = layer.filter && layer.filter[0] === \"all\"\n ? layer.filter.slice(1)\n : layer.filter\n ? [layer.filter]\n : [];\n const catlmk: unknown[] = [\"coalesce\", [\"get\", \"CATLMK\"], [\"get\", \"catlmk\"], 0];\n const isWind: unknown[] = [\"any\", [\"==\", catlmk, 18], [\"==\", catlmk, 19]];\n const isLighthouse: unknown[] = [\"==\", catlmk, 17];\n const scaminFloor = scaminToMinZoom(entry?.scamin);\n\n const windLayer: StyleLayer = {\n ...layer,\n id: `s52-${objectClass}-wind-symbol`,\n filter: [\"all\", ...baseFilterParts, isWind],\n };\n delete windLayer.minzoom;\n\n // Lighthouse variant overrides icon-image to the dedicated solid-black\n // lighthouse silhouette (assets/s52/point/LIGHTHOUSE01.svg). The base\n // LNDMRK expression maps CATLMK=17 → BCNTOW01 (line-drawn generic\n // tower), which reads as a thin outline that's easy to miss at coastal\n // zoom next to the magenta LIGHTS flare. The lighthouse silhouette\n // gives a recognizable \"structure here\" anchor that pairs with the\n // LIGHTS class's S-52 P1 magenta flare for the standard NOAA-style\n // \"lighthouse with light\" portrayal. Same false-positive trade-off as\n // the filter (radio/water towers tagged CATLMK=17 also surface).\n const lighthouseLayer: StyleLayer = {\n ...layer,\n id: `s52-${objectClass}-lighthouse-symbol`,\n filter: [\"all\", ...baseFilterParts, isLighthouse],\n layout: {\n ...(layer.layout ?? {}),\n \"icon-image\": \"LIGHTHOUSE01\",\n },\n };\n delete lighthouseLayer.minzoom;\n\n const otherLayer: StyleLayer = {\n ...layer,\n id: `s52-${objectClass}-other-symbol`,\n filter: [\"all\", ...baseFilterParts, [\"!\", isWind], [\"!\", isLighthouse]],\n };\n if (scaminFloor !== undefined) {\n otherLayer.minzoom = scaminFloor;\n }\n\n layers.push(windLayer, lighthouseLayer, otherLayer);\n continue;\n }\n\n layers.push(layer);\n\n // S-52 §CSYM02 isolated-danger overlay — thin DASHED MAGENTA RING on\n // top of the base hazard symbol when the rock/obstruction/wreck is\n // shallower than the safety contour OR covers-and-uncovers with the\n // tide. Per IHO S-52 spec this marker is mandatory for every isolated\n // danger to surface navigation; it's what mariners read as \"this can\n // hit your hull.\" Uses DNGCIR01 — a fill-less thin dashed ring,\n // distinct from the (mis-named) ISODGR01 octagon-with-cross.\n //\n // Filter: Point/MultiPoint geometry AND (VALSOU < safety_contour OR\n // WATLEV = 4). The 999 fallback in the VALSOU coalesce is intentional\n // — features without sounded depth (other than covers-and-uncovers)\n // shouldn't get the ring because we don't know they're dangerous to a\n // hull. WATLEV=4 catches the always-dangerous intertidal case.\n //\n // Ring rendered from z13 up — at coastal/approach zooms the ring\n // would compete with the asterisk visually and SCAMIN-thinned rocks\n // already read as discrete dangers. At harbor scale (z14+) the ring\n // is critical \"by the book\" S-52 portrayal for chart-readers\n // performing precise navigation.\n //\n // icon-size mirrors the hazard's own curve so the ring tracks the\n // asterisk as it scales — the SVG's r=14 circle is just slightly\n // larger than the 18-unit hazard content, leaving ~3 px breathing\n // room around the base symbol at z16.\n if (HAZARD_GROUPS.has(entry?.viewingGroup ?? 0) && resolved.type === \"symbol\") {\n const HAZARD_SAFETY_CONTOUR_M = 9;\n const valsouNum = [\"to-number\", [\"coalesce\", [\"get\", \"VALSOU\"], [\"get\", \"valsou\"], 999], 999];\n const watlevNum = [\"to-number\", [\"coalesce\", [\"get\", \"WATLEV\"], [\"get\", \"watlev\"], 0], 0];\n layers.push({\n id: `s52-${objectClass}-danger-ring`,\n type: \"symbol\",\n source: sourceId,\n \"source-layer\": objectClass,\n filter: [\n \"all\",\n GEOM_FILTERS.symbol,\n [\"any\",\n [\"<\", valsouNum, HAZARD_SAFETY_CONTOUR_M],\n [\"==\", watlevNum, 4],\n ],\n ],\n layout: {\n \"icon-image\": \"DNGCIR01\",\n \"icon-size\": [\n \"interpolate\", [\"linear\"], [\"zoom\"],\n 12.99, 0,\n 13, 0.55,\n 14, 0.85,\n 16, 1.15,\n 18, 1.45,\n ],\n \"icon-allow-overlap\": true,\n \"icon-ignore-placement\": true,\n \"icon-optional\": true,\n },\n paint: {},\n minzoom: 13,\n metadata: { \"s52:objectClass\": objectClass, \"s52:role\": \"isolated-danger-ring\" },\n });\n }\n\n // Add fill outline\n if (resolved.type === \"fill\" && FILL_OUTLINE_LAYERS.has(objectClass)) {\n const outlineColor = objectClass === \"DEPARE\"\n ? resolveColor(\"CHGRD\", ct)\n : resolveColor(\"CHGRF\", ct);\n layers.push({\n id: `s52-${objectClass}-outline`,\n type: \"line\",\n source: sourceId,\n \"source-layer\": objectClass,\n filter: GEOM_FILTERS.fill,\n paint: {\n \"line-color\": outlineColor,\n \"line-width\": 0.3,\n \"line-opacity\": 0.4,\n },\n metadata: { \"s52:objectClass\": objectClass, \"s52:role\": \"outline\" },\n });\n }\n\n // CBLARE / PIPARE regulated-area boundary — dashed coloured edge per\n // S-52 PresLib L32 / L42. Pushed after the fill layer so the dashed\n // boundary renders above the hatching pattern; lives outside\n // FILL_OUTLINE_LAYERS because the styling differs (thicker, dashed,\n // class-coloured rather than the faint CHGRF outline used for water /\n // land / harbour fills).\n if (resolved.type === \"fill\" && REGULATED_AREA_BOUNDARY_LAYERS[objectClass]) {\n const boundaryColor = resolveColor(REGULATED_AREA_BOUNDARY_LAYERS[objectClass], ct);\n layers.push({\n id: `s52-${objectClass}-boundary`,\n type: \"line\",\n source: sourceId,\n \"source-layer\": objectClass,\n filter: GEOM_FILTERS.fill,\n paint: {\n \"line-color\": boundaryColor,\n \"line-width\": 1.0,\n \"line-dasharray\": [4, 2],\n \"line-opacity\": 0.85,\n },\n metadata: { \"s52:objectClass\": objectClass, \"s52:role\": \"boundary\" },\n });\n }\n\n // ACHARE dashed magenta boundary — NOAA renders anchorage perimeters as\n // a dashed magenta line per PresLib N12 / Chart No. 1 §N so the area is\n // identifiable even when the TRFCD fill is barely visible. The faint\n // CHGRF outline already emitted via FILL_OUTLINE_LAYERS is preserved as\n // a base hairline; this dashed magenta draws over it as the dominant\n // boundary cue. Pushed before the centroid anchor icon so the icon\n // renders on top of the boundary at the polygon centre.\n if (objectClass === \"ACHARE\" && resolved.type === \"fill\") {\n layers.push({\n id: \"s52-ACHARE-boundary\",\n type: \"line\",\n source: sourceId,\n \"source-layer\": \"ACHARE\",\n filter: GEOM_FILTERS.fill,\n paint: {\n \"line-color\": resolveColor(\"CHMGD\", ct),\n \"line-width\": 0.8,\n \"line-dasharray\": [3, 2],\n \"line-opacity\": 0.7,\n },\n metadata: { \"s52:objectClass\": \"ACHARE\", \"s52:role\": \"boundary\" },\n });\n }\n\n // ACHARE centroid anchor icon — the lookup styles ACHARE as a fill-only\n // layer, but S-52 PresLib N12 (and NOAA's portrayal) renders the iconic\n // anchor symbol at the polygon centroid. MapLibre handles polygon-centroid\n // placement automatically when a symbol layer reads a polygon source-layer\n // with `symbol-placement: \"point\"`. The ACHARE02 sprite is already wired\n // up via SYMBOL_MAP — this is the missing layer that actually emits it.\n // OBJNAM (e.g. \"Marblehead Harbor\") renders in italic magenta beneath the\n // icon for context; many NOAA anchorages are named. ACHARE02 is loaded\n // non-SDF (colours baked in via applyColorTheme at sprite load), so no\n // `icon-color` paint is set — the SVG already uses the CHMGD token.\n if (objectClass === \"ACHARE\" && resolved.type === \"fill\") {\n layers.push({\n id: \"s52-ACHARE-anchor-icon\",\n type: \"symbol\",\n source: sourceId,\n \"source-layer\": \"ACHARE\",\n filter: GEOM_FILTERS.fill,\n layout: {\n \"icon-image\": \"ACHARE02\",\n \"icon-size\": [\"interpolate\", [\"linear\"], [\"zoom\"], 10, 0.5, 14, 0.8, 17, 1.1],\n \"icon-allow-overlap\": true,\n \"icon-ignore-placement\": false,\n \"symbol-placement\": \"point\",\n \"text-field\": [\"case\", [\"has\", \"OBJNAM\"], [\"get\", \"OBJNAM\"], \"\"],\n \"text-size\": [\"interpolate\", [\"linear\"], [\"zoom\"], 11, 9, 16, 11],\n \"text-anchor\": \"top\",\n \"text-offset\": [0, 1.4],\n \"text-optional\": true,\n \"text-font\": [\"Open Sans Italic\"],\n \"text-allow-overlap\": false,\n },\n paint: {\n \"text-color\": resolveColor(\"CHMGD\", ct),\n \"text-halo-color\": resolveColor(\"CHWHT\", ct),\n \"text-halo-width\": 1.0,\n },\n metadata: { \"s52:objectClass\": \"ACHARE\", \"s52:role\": \"centroid-icon\" },\n });\n }\n\n // LNDARE Point variant — NOAA encodes small above-water structures\n // (bridge pier remnants, dolphins, isolated above-water rocks/islets) as\n // Point-typed LNDARE features rather than tiny polygons. They need their\n // own circle layer because the fill layer above only catches polygons.\n // The 16 demolished Long Island Bridge pier remnants in cell US5BOSCD\n // are encoded this way — confirmed against NOAA's official chart viewer.\n if (objectClass === \"LNDARE\" && resolved.type === \"fill\") {\n layers.push({\n id: `s52-LNDARE-point`,\n type: \"circle\",\n source: sourceId,\n \"source-layer\": \"LNDARE\",\n filter: GEOM_FILTERS.circle,\n paint: {\n \"circle-color\": resolveColor(\"LANDA\", ct),\n \"circle-radius\": [\"interpolate\", [\"linear\"], [\"zoom\"], 12, 1.8, 14, 2.4, 17, 3.6],\n \"circle-stroke-color\": resolveColor(\"CHBLK\", ct),\n \"circle-stroke-width\": 0.8,\n },\n metadata: { \"s52:objectClass\": \"LNDARE\", \"s52:role\": \"point\" },\n });\n }\n\n // LNDARE LineString variant — NOAA also encodes small linear above-water\n // features (jetty spines, breakwater centerlines, very narrow islands too\n // thin for polygon encoding) as LineString-typed LNDARE. The fill layer\n // above only catches polygons and the point layer only catches points, so\n // 93 LineString-typed LNDARE features were silently dropped. Render them\n // in the coastline colour so they visually read as part of the shoreline.\n if (objectClass === \"LNDARE\" && resolved.type === \"fill\") {\n layers.push({\n id: `s52-LNDARE-line`,\n type: \"line\",\n source: sourceId,\n \"source-layer\": \"LNDARE\",\n filter: GEOM_FILTERS.line,\n paint: {\n \"line-color\": resolveColor(\"CSTLN\", ct),\n \"line-width\": [\"interpolate\", [\"linear\"], [\"zoom\"], 8, 0.6, 14, 1.4],\n },\n metadata: { \"s52:objectClass\": \"LNDARE\", \"s52:role\": \"line\" },\n });\n }\n\n // BUAARE Point variant — NOAA encodes 245 BUAARE features as Points\n // (named place centroids for small towns and villages that aren't mapped\n // as full polygons at the source scale). The fill layer above only\n // catches polygons, so these point-typed features were silently dropped\n // from rendering. The BUAARE label config in labels.ts then has no\n // anchor at lower zooms where polygons may be tippecanoe-dropped. Same\n // bug pattern as the LNDARE Point fix in PR #388.\n if (objectClass === \"BUAARE\" && resolved.type === \"fill\") {\n layers.push({\n id: `s52-BUAARE-point`,\n type: \"circle\",\n source: sourceId,\n \"source-layer\": \"BUAARE\",\n filter: GEOM_FILTERS.circle,\n paint: {\n \"circle-color\": resolveColor(\"CHGRF\", ct),\n \"circle-radius\": [\"interpolate\", [\"linear\"], [\"zoom\"], 8, 1.5, 12, 2.5, 16, 4.0],\n \"circle-stroke-color\": resolveColor(\"CHBLK\", ct),\n \"circle-stroke-width\": 0.6,\n },\n metadata: { \"s52:objectClass\": \"BUAARE\", \"s52:role\": \"point\" },\n });\n }\n\n // RIVERS LineString variant — NOAA encodes most rivers (1,380 features)\n // as LineStrings rather than thin polygons; only 85 are polygon-typed.\n // The fill layer above only catches polygons, so without this line layer\n // the vast majority of charted rivers render as nothing.\n if (objectClass === \"RIVERS\" && resolved.type === \"fill\") {\n layers.push({\n id: `s52-RIVERS-line`,\n type: \"line\",\n source: sourceId,\n \"source-layer\": \"RIVERS\",\n filter: GEOM_FILTERS.line,\n paint: {\n \"line-color\": resolveColor(\"DEPMD\", ct),\n \"line-width\": [\"interpolate\", [\"linear\"], [\"zoom\"], 8, 0.5, 14, 1.2],\n },\n metadata: { \"s52:objectClass\": \"RIVERS\", \"s52:role\": \"line\" },\n });\n }\n\n // BUISGL Polygon variant — NOAA encodes building footprints (named piers,\n // waterfront warehouses, terminal buildings) as Polygons, but the class is\n // styled as type: \"circle\" (Point/MultiPoint) for small unmapped buildings.\n // The fill layer above only emits a circle filter, so 1,992 polygon-typed\n // BUISGL features were silently dropped from rendering. Add a fill layer +\n // thin outline (mirroring the FILL_OUTLINE_LAYERS pattern used by LNDARE\n // and BUAARE) so building footprints render as tan polygons with a darker\n // boundary, per S-52 portrayal for area-encoded buildings.\n if (objectClass === \"BUISGL\" && resolved.type === \"circle\") {\n layers.push({\n id: `s52-BUISGL-polygon`,\n type: \"fill\",\n source: sourceId,\n \"source-layer\": \"BUISGL\",\n filter: GEOM_FILTERS.fill,\n paint: {\n \"fill-color\": resolveColor(\"CHBRN\", ct),\n \"fill-opacity\": 0.55,\n },\n metadata: { \"s52:objectClass\": \"BUISGL\", \"s52:role\": \"polygon\" },\n });\n layers.push({\n id: `s52-BUISGL-polygon-outline`,\n type: \"line\",\n source: sourceId,\n \"source-layer\": \"BUISGL\",\n filter: GEOM_FILTERS.fill,\n paint: {\n \"line-color\": resolveColor(\"CHBLK\", ct),\n \"line-width\": 0.4,\n },\n metadata: { \"s52:objectClass\": \"BUISGL\", \"s52:role\": \"polygon-outline\" },\n });\n }\n\n // BRIDGE Polygon variant — NOAA encodes bridges with substantial above-water\n // footprint (highway bridges, drawbridges, swing bridges) as Polygons /\n // MultiPolygons to show the actual span/deck extent, while smaller bridges\n // stay as LineStrings. The main layer above only catches LineStrings, so\n // polygon-encoded bridges were silently dropped. Render them as a tan-brown\n // fill (man-made structure, reads against water like LNDARE) with a darker\n // outline so the deck edges remain legible. Same bug pattern as the LNDARE\n // Point fix in PR #388.\n if (objectClass === \"BRIDGE\" && resolved.type === \"line\") {\n layers.push({\n id: `s52-BRIDGE-polygon`,\n type: \"fill\",\n source: sourceId,\n \"source-layer\": \"BRIDGE\",\n filter: GEOM_FILTERS.fill,\n paint: {\n \"fill-color\": resolveColor(\"CHBRN\", ct),\n \"fill-opacity\": 0.35,\n },\n metadata: { \"s52:objectClass\": \"BRIDGE\", \"s52:role\": \"polygon\" },\n });\n layers.push({\n id: `s52-BRIDGE-polygon-outline`,\n type: \"line\",\n source: sourceId,\n \"source-layer\": \"BRIDGE\",\n filter: GEOM_FILTERS.fill,\n paint: {\n \"line-color\": resolveColor(\"CHBLK\", ct),\n \"line-width\": 1.0,\n },\n metadata: { \"s52:objectClass\": \"BRIDGE\", \"s52:role\": \"polygon-outline\" },\n });\n }\n\n // PYLONS Point variant — NOAA encodes 44 PYLONS features (bridge support\n // columns, above-water concrete pillars supporting overhead infrastructure)\n // as Points where the column has no substantial mapped footprint, and 36\n // as Polygons for broad-base columns and large bridge piers with charted\n // footprints. The default fill layer above only catches polygons, so\n // Point-typed pylons would be silently dropped. Render points as small\n // tan-brown circles with a thin black outline so single-column supports\n // remain visible at harbor zoom. Same bug pattern as the LNDARE Point fix\n // in PR #388.\n if (objectClass === \"PYLONS\" && resolved.type === \"fill\") {\n layers.push({\n id: `s52-PYLONS-point`,\n type: \"circle\",\n source: sourceId,\n \"source-layer\": \"PYLONS\",\n filter: GEOM_FILTERS.circle,\n paint: {\n \"circle-color\": resolveColor(\"CHBRN\", ct),\n \"circle-radius\": [\"interpolate\", [\"linear\"], [\"zoom\"], 12, 1.8, 14, 2.6, 17, 3.8],\n \"circle-stroke-color\": resolveColor(\"CHBLK\", ct),\n \"circle-stroke-width\": 0.8,\n },\n metadata: { \"s52:objectClass\": \"PYLONS\", \"s52:role\": \"point\" },\n });\n }\n\n // WEDKLP Point variant — NOAA encodes 85 of 88 WEDKLP (Weed/Kelp) features\n // as Points (isolated kelp-patch observations at sample locations) and only\n // 3 as Polygons. The default fill layer above only catches polygons, so\n // the dominant Point geometry would be silently dropped. Render points as\n // small green-tinted circles with a thin black outline so kelp beds remain\n // visible at harbor-approach zooms — kelp is an anchoring hazard (poor\n // holding ground) and prop-entanglement risk for small craft. Same bug\n // pattern as the LNDARE Point fix in PR #388.\n if (objectClass === \"WEDKLP\" && resolved.type === \"fill\") {\n layers.push({\n id: `s52-WEDKLP-point`,\n type: \"circle\",\n source: sourceId,\n \"source-layer\": \"WEDKLP\",\n filter: GEOM_FILTERS.circle,\n paint: {\n \"circle-color\": resolveColor(\"CHGRN\", ct),\n \"circle-radius\": [\"interpolate\", [\"linear\"], [\"zoom\"], 10, 1.5, 14, 2.5, 17, 4.0],\n \"circle-stroke-color\": resolveColor(\"CHBLK\", ct),\n \"circle-stroke-width\": 0.5,\n \"circle-opacity\": 0.7,\n },\n metadata: { \"s52:objectClass\": \"WEDKLP\", \"s52:role\": \"point\" },\n });\n }\n\n // SLOGRD Point variant — NOAA encodes 7 SLOGRD features as Points\n // (isolated beach-slope markers / small sloping-ground call-outs) and\n // 8 as Polygons. The default fill above only catches polygons, so the\n // Point features would silently drop. Render as a small CHBRN dot so\n // landfall context still reads at harbor zoom. Same bug pattern as the\n // LNDARE Point fix in PR #388.\n if (objectClass === \"SLOGRD\" && resolved.type === \"fill\") {\n layers.push({\n id: `s52-SLOGRD-point`,\n type: \"circle\",\n source: sourceId,\n \"source-layer\": \"SLOGRD\",\n filter: GEOM_FILTERS.circle,\n paint: {\n \"circle-color\": resolveColor(\"CHBRN\", ct),\n \"circle-radius\": [\"interpolate\", [\"linear\"], [\"zoom\"], 12, 1.4, 14, 2.0, 17, 3.0],\n \"circle-stroke-color\": resolveColor(\"CHBLK\", ct),\n \"circle-stroke-width\": 0.4,\n \"circle-opacity\": 0.7,\n },\n metadata: { \"s52:objectClass\": \"SLOGRD\", \"s52:role\": \"point\" },\n });\n }\n\n // RUNWAY LineString variant — NOAA encodes the bulk of RUNWAY features\n // as Polygons showing the paved extent, but at least one runway is\n // encoded as a LineString centerline. The default fill above only\n // catches polygons. Render as a thin CHGRF line so the centerline still\n // reads as a runway, distinct from ROADWY. Same bug pattern as the\n // LNDARE Point fix in PR #388.\n if (objectClass === \"RUNWAY\" && resolved.type === \"fill\") {\n layers.push({\n id: `s52-RUNWAY-line`,\n type: \"line\",\n source: sourceId,\n \"source-layer\": \"RUNWAY\",\n filter: GEOM_FILTERS.line,\n paint: {\n \"line-color\": resolveColor(\"CHGRF\", ct),\n \"line-width\": [\"interpolate\", [\"linear\"], [\"zoom\"], 10, 0.6, 14, 1.2, 17, 2.0],\n },\n metadata: { \"s52:objectClass\": \"RUNWAY\", \"s52:role\": \"line\" },\n });\n }\n\n // FORSTC LineString variant — NOAA encodes fortified structures as a\n // mix of Polygons (full fort footprints with mapped extent) and\n // LineStrings (wall remnants, linear bastions). The default fill above\n // only catches polygons, so 2 LineString-typed FORSTC features would be\n // silently dropped. Render as a dark CHBLK line so wall remnants still\n // read at harbor zoom. Same bug pattern as the LNDARE Point fix in\n // PR #388.\n if (objectClass === \"FORSTC\" && resolved.type === \"fill\") {\n layers.push({\n id: `s52-FORSTC-line`,\n type: \"line\",\n source: sourceId,\n \"source-layer\": \"FORSTC\",\n filter: GEOM_FILTERS.line,\n paint: {\n \"line-color\": resolveColor(\"CHBLK\", ct),\n \"line-width\": [\"interpolate\", [\"linear\"], [\"zoom\"], 10, 0.6, 14, 1.2, 17, 1.8],\n },\n metadata: { \"s52:objectClass\": \"FORSTC\", \"s52:role\": \"line\" },\n });\n }\n\n // FSHFAC Point variant — NOAA encodes fishing facilities (fish weirs,\n // stake fences, fish traps) mostly as Polygons covering the trap extent,\n // plus a single Point feature for an isolated stake-fence marker. The\n // default fill above only catches polygons, so the Point feature would\n // silently drop — a small-craft safety issue, since these structures\n // are net-fouling hazards. Render as a small CHBLK dot so the trap\n // location still reads at harbor zoom. Same bug pattern as the LNDARE\n // Point fix in PR #388.\n if (objectClass === \"FSHFAC\" && resolved.type === \"fill\") {\n layers.push({\n id: `s52-FSHFAC-point`,\n type: \"circle\",\n source: sourceId,\n \"source-layer\": \"FSHFAC\",\n filter: GEOM_FILTERS.circle,\n paint: {\n \"circle-color\": resolveColor(\"CHBLK\", ct),\n \"circle-radius\": [\"interpolate\", [\"linear\"], [\"zoom\"], 12, 1.4, 14, 2.0, 17, 2.8],\n \"circle-stroke-color\": resolveColor(\"CHBLK\", ct),\n \"circle-stroke-width\": 0.4,\n },\n metadata: { \"s52:objectClass\": \"FSHFAC\", \"s52:role\": \"point\" },\n });\n }\n\n // OBSTRN Polygon + LineString variants — NOAA encodes 531 OBSTRN as\n // Polygons (foul-ground areas, wreck-debris fields, area obstructions in\n // dumping grounds) and 24 as LineStrings (underwater cables of unknown\n // depth, partially-submerged structures). The default OBSTRN layer is a\n // symbol-only Point rendering with the `OBSTRN01` cross/+ icon, so\n // 555 safety-critical hazard features were silently dropped from\n // rendering. S-52 PresLib OBSTRN03/04 (Annex A) defines the dashed-line\n // \"danger area\" idiom — boundary-only dashed black for area obstructions,\n // dashed black line for line obstructions, with a low-opacity warning\n // tint on the polygon interior. Point OBSTRN keeps its symbol layer.\n if (objectClass === \"OBSTRN\" && resolved.type === \"symbol\") {\n layers.push({\n id: `s52-OBSTRN-polygon`,\n type: \"fill\",\n source: sourceId,\n \"source-layer\": \"OBSTRN\",\n filter: GEOM_FILTERS.fill,\n paint: {\n \"fill-color\": resolveColor(\"CHBLK\", ct),\n \"fill-opacity\": 0.10,\n },\n metadata: { \"s52:objectClass\": \"OBSTRN\", \"s52:role\": \"polygon\" },\n });\n layers.push({\n id: `s52-OBSTRN-polygon-outline`,\n type: \"line\",\n source: sourceId,\n \"source-layer\": \"OBSTRN\",\n filter: GEOM_FILTERS.fill,\n paint: {\n \"line-color\": resolveColor(\"CHBLK\", ct),\n \"line-width\": [\"interpolate\", [\"linear\"], [\"zoom\"], 8, 0.8, 14, 1.4],\n \"line-dasharray\": [3, 2],\n },\n metadata: { \"s52:objectClass\": \"OBSTRN\", \"s52:role\": \"polygon-outline\" },\n });\n layers.push({\n id: `s52-OBSTRN-line`,\n type: \"line\",\n source: sourceId,\n \"source-layer\": \"OBSTRN\",\n filter: GEOM_FILTERS.line,\n paint: {\n \"line-color\": resolveColor(\"CHBLK\", ct),\n \"line-width\": 1.2,\n \"line-dasharray\": [3, 2],\n },\n metadata: { \"s52:objectClass\": \"OBSTRN\", \"s52:role\": \"line\" },\n });\n }\n\n // SLCONS Polygon + Point variants — NOAA encodes shoreline construction\n // (piers, wharves, breakwaters, dolphins, riprap, sea walls) as a mix of\n // LineStrings, Polygons, and Points depending on the feature's mapped\n // extent. The atlas's default `type: \"line\"` only catches LineStrings,\n // so 341 Polygon features (area-encoded wharves and large breakwaters)\n // and 35 Point features (small isolated dolphins) were being dropped.\n // The line layer above stays as the main case; these two layers fill\n // the geometry gaps without disturbing it.\n if (objectClass === \"SLCONS\" && resolved.type === \"line\") {\n layers.push({\n id: `s52-SLCONS-polygon`,\n type: \"fill\",\n source: sourceId,\n \"source-layer\": \"SLCONS\",\n filter: GEOM_FILTERS.fill,\n paint: {\n \"fill-color\": resolveColor(\"CHBRN\", ct),\n \"fill-opacity\": 0.5,\n },\n metadata: { \"s52:objectClass\": \"SLCONS\", \"s52:role\": \"polygon\" },\n });\n layers.push({\n id: `s52-SLCONS-polygon-outline`,\n type: \"line\",\n source: sourceId,\n \"source-layer\": \"SLCONS\",\n filter: GEOM_FILTERS.fill,\n paint: {\n \"line-color\": resolveColor(\"CHBLK\", ct),\n \"line-width\": 0.6,\n },\n metadata: { \"s52:objectClass\": \"SLCONS\", \"s52:role\": \"polygon-outline\" },\n });\n layers.push({\n id: `s52-SLCONS-point`,\n type: \"circle\",\n source: sourceId,\n \"source-layer\": \"SLCONS\",\n filter: GEOM_FILTERS.circle,\n paint: {\n \"circle-color\": resolveColor(\"CHBRN\", ct),\n \"circle-radius\": [\"interpolate\", [\"linear\"], [\"zoom\"], 12, 1.6, 14, 2.2, 17, 3.2],\n \"circle-stroke-color\": resolveColor(\"CHBLK\", ct),\n \"circle-stroke-width\": 0.6,\n },\n metadata: { \"s52:objectClass\": \"SLCONS\", \"s52:role\": \"point\" },\n });\n }\n\n // PRDARE Point variant — NOAA encodes single-point production installations\n // (an isolated offshore platform pin, individual aquaculture pen marker)\n // as Point-typed PRDARE features. The main PRDARE entry is `type: \"line\"`\n // with the FILL filter (LINE_FROM_POLYGON_LAYERS special case — draws\n // polygon boundaries to avoid flood-fill noise in dense regulated-area\n // overlaps), so Point geometry is rejected and these features silently\n // drop from rendering. Render them as semi-transparent magenta circles\n // per S-52 \"regulated / restricted area\" idiom — distinct from depth /\n // hazard portrayal. Same bug pattern as the LNDARE Point fix in PR #388.\n if (objectClass === \"PRDARE\" && resolved.type === \"line\") {\n layers.push({\n id: `s52-PRDARE-point`,\n type: \"circle\",\n source: sourceId,\n \"source-layer\": \"PRDARE\",\n filter: GEOM_FILTERS.circle,\n paint: {\n \"circle-color\": resolveColor(\"CHMGD\", ct),\n \"circle-radius\": [\"interpolate\", [\"linear\"], [\"zoom\"], 8, 2.0, 14, 3.5, 17, 5.0],\n \"circle-stroke-color\": resolveColor(\"CHBLK\", ct),\n \"circle-stroke-width\": 0.8,\n \"circle-opacity\": 0.35,\n },\n metadata: { \"s52:objectClass\": \"PRDARE\", \"s52:role\": \"point\" },\n });\n }\n\n // CTNARE Point variant — NOAA encodes small notable caution markers\n // (isolated hazards, cable-crossing points, small spoil-area pins) as\n // Point-typed CTNARE features. The main CTNARE entry is `type: \"line\"`\n // with the FILL filter (LINE_FROM_POLYGON_LAYERS special case — draws\n // polygon boundaries to avoid flood-fill noise in dense harbours), so\n // Point geometry is rejected and 32 features silently drop from\n // rendering. Render them as caution-yellow circles with a magenta\n // stroke per S-52 PresLib caution-colour convention. Same bug pattern\n // as the LNDARE Point fix in PR #388.\n if (objectClass === \"CTNARE\" && resolved.type === \"line\") {\n layers.push({\n id: `s52-CTNARE-point`,\n type: \"circle\",\n source: sourceId,\n \"source-layer\": \"CTNARE\",\n filter: GEOM_FILTERS.circle,\n paint: {\n \"circle-color\": resolveColor(\"LITYW\", ct),\n \"circle-radius\": [\"interpolate\", [\"linear\"], [\"zoom\"], 10, 1.8, 14, 2.6, 17, 4.0],\n \"circle-stroke-color\": resolveColor(\"CHMGD\", ct),\n \"circle-stroke-width\": 1.2,\n },\n metadata: { \"s52:objectClass\": \"CTNARE\", \"s52:role\": \"point\" },\n });\n }\n\n // PONTON Polygon variant — NOAA encodes 231 pontoons (floating piers in\n // marinas, large pontoon platforms, floating dock systems) as Polygons,\n // but the class is styled as type: \"line\" for the 2,005 LineString-typed\n // pontoons. The main layer above only catches LineStrings, so polygon\n // pontoons were silently dropped. Render them as a tan-brown fill (man-made\n // structure, reads alongside piers and buildings) with a thin darker\n // outline so slip footprints remain legible. Same bug pattern as the\n // LNDARE Point fix in PR #388 and the BRIDGE Polygon fix.\n if (objectClass === \"PONTON\" && resolved.type === \"line\") {\n layers.push({\n id: `s52-PONTON-polygon`,\n type: \"fill\",\n source: sourceId,\n \"source-layer\": \"PONTON\",\n filter: GEOM_FILTERS.fill,\n paint: {\n \"fill-color\": resolveColor(\"CHBRN\", ct),\n \"fill-opacity\": 0.5,\n },\n metadata: { \"s52:objectClass\": \"PONTON\", \"s52:role\": \"polygon\" },\n });\n layers.push({\n id: `s52-PONTON-polygon-outline`,\n type: \"line\",\n source: sourceId,\n \"source-layer\": \"PONTON\",\n filter: GEOM_FILTERS.fill,\n paint: {\n \"line-color\": resolveColor(\"CHBLK\", ct),\n \"line-width\": 0.6,\n },\n metadata: { \"s52:objectClass\": \"PONTON\", \"s52:role\": \"polygon-outline\" },\n });\n }\n\n // WRECKS Polygon variant — NOAA encodes 38 WRECKS as Polygons (wreck-debris\n // fields where multiple objects from a sunken vessel are scattered,\n // foul-ground from sunken vessels, large wrecks with charted extent) while\n // the bulk (1,069) are Points rendered as the WRECKS01/04/05 hull/danger\n // symbols. The atlas styles WRECKS as type: \"symbol\" only, so area-encoded\n // wrecks were silently dropped — safety-critical, since mariners need to\n // see the debris-field extent, not just a centroid. Mirror the OBSTRN\n // polygon idiom: low-opacity warning fill + dashed black \"danger area\"\n // boundary, per S-52 PresLib WRECKS area portrayal. Point/symbol layer\n // is untouched. Same bug pattern as LNDARE Point fix in PR #388.\n if (objectClass === \"WRECKS\" && resolved.type === \"symbol\") {\n layers.push({\n id: `s52-WRECKS-polygon`,\n type: \"fill\",\n source: sourceId,\n \"source-layer\": \"WRECKS\",\n filter: GEOM_FILTERS.fill,\n paint: {\n \"fill-color\": resolveColor(\"CHBLK\", ct),\n \"fill-opacity\": 0.08,\n },\n metadata: { \"s52:objectClass\": \"WRECKS\", \"s52:role\": \"polygon\" },\n });\n layers.push({\n id: `s52-WRECKS-polygon-outline`,\n type: \"line\",\n source: sourceId,\n \"source-layer\": \"WRECKS\",\n filter: GEOM_FILTERS.fill,\n paint: {\n \"line-color\": resolveColor(\"CHBLK\", ct),\n \"line-width\": 1.0,\n \"line-dasharray\": [3, 2],\n },\n metadata: { \"s52:objectClass\": \"WRECKS\", \"s52:role\": \"polygon-outline\" },\n });\n }\n\n // WATTUR Polygon variant — NOAA encodes 2 WATTUR features as Polygons\n // (broader turbulence regions, e.g. an overfalls area covering a tide\n // gate or eddy field). The atlas styles WATTUR as type: \"symbol\", so\n // polygon-encoded turbulence would be silently dropped. The wavy-line\n // icon also renders at polygon centroids automatically because the\n // symbol layer's filter accepts both Point and the implicit\n // polygon-centroid case (MapLibre symbol-placement: \"point\" works on\n // polygon sources too). Add a very-low-opacity black fill so the area\n // extent is hinted at without overpowering the underlying water tints.\n // Same bug pattern as the LNDARE Point fix in PR #388.\n if (objectClass === \"WATTUR\" && resolved.type === \"symbol\") {\n layers.push({\n id: `s52-WATTUR-polygon`,\n type: \"fill\",\n source: sourceId,\n \"source-layer\": \"WATTUR\",\n filter: GEOM_FILTERS.fill,\n paint: {\n \"fill-color\": resolveColor(\"CHBLK\", ct),\n \"fill-opacity\": 0.05,\n },\n metadata: { \"s52:objectClass\": \"WATTUR\", \"s52:role\": \"polygon\" },\n });\n }\n\n // MAGVAR Point variant — NOAA encodes 58 magnetic-variation features as\n // Points (isolated VALMAG observations or station locations) and 136 as\n // Polygons (isogonic zones — areas of constant variation). The MAGVAR\n // entry is `type: \"line\"` with the FILL filter (LINE_FROM_POLYGON_LAYERS\n // special case — draws polygon boundaries as faint dashed magenta\n // isogonic lines), so Point geometry is rejected and 58 features\n // silently drop from rendering. Render them as small magenta dots that\n // anchor the VALMAG label (configured in labels.ts). Same bug pattern\n // as the LNDARE Point fix in PR #388.\n if (objectClass === \"MAGVAR\" && resolved.type === \"line\") {\n layers.push({\n id: \"s52-MAGVAR-point\",\n type: \"circle\",\n source: sourceId,\n \"source-layer\": \"MAGVAR\",\n filter: GEOM_FILTERS.circle,\n paint: {\n \"circle-color\": resolveColor(\"CHMGD\", ct),\n \"circle-radius\": [\"interpolate\", [\"linear\"], [\"zoom\"], 6, 1.0, 12, 2.0],\n \"circle-stroke-color\": resolveColor(\"CHBLK\", ct),\n \"circle-stroke-width\": 0.4,\n \"circle-opacity\": 0.4,\n },\n metadata: { \"s52:objectClass\": \"MAGVAR\", \"s52:role\": \"point\" },\n });\n }\n\n // DMPGRD Point variant — NOAA encodes 115 dumping-ground markers as\n // Points where the disposal site has no charted polygon extent. The\n // default fill layer above only catches polygons, so point-typed\n // dumping grounds were silently dropped. Render as caution-yellow\n // circles matching the polygon LITYW fill so a single point reads as\n // the same kind of hazard area as the polygon form. Same bug pattern\n // as the LNDARE Point fix in PR #388.\n if (objectClass === \"DMPGRD\" && resolved.type === \"fill\") {\n layers.push({\n id: `s52-DMPGRD-point`,\n type: \"circle\",\n source: sourceId,\n \"source-layer\": \"DMPGRD\",\n filter: GEOM_FILTERS.circle,\n paint: {\n \"circle-color\": resolveColor(\"LITYW\", ct),\n \"circle-radius\": [\"interpolate\", [\"linear\"], [\"zoom\"], 10, 1.5, 14, 2.5, 17, 3.6],\n \"circle-stroke-color\": resolveColor(\"CHBLK\", ct),\n \"circle-stroke-width\": 0.5,\n \"circle-opacity\": 0.7,\n },\n metadata: { \"s52:objectClass\": \"DMPGRD\", \"s52:role\": \"point\" },\n });\n }\n\n // DAMCON Polygon variant — NOAA encodes 9 dams as Polygons (broad\n // earthen-dam footprints, hydroelectric-dam structures with mapped\n // extent) while the bulk are LineStrings showing the dam crest. The\n // main layer above only catches LineStrings, so polygon-encoded dams\n // were silently dropped. Render as a CHBRN fill with a black outline\n // (man-made structure, reads like other infrastructure polygons).\n if (objectClass === \"DAMCON\" && resolved.type === \"line\") {\n layers.push({\n id: `s52-DAMCON-polygon`,\n type: \"fill\",\n source: sourceId,\n \"source-layer\": \"DAMCON\",\n filter: GEOM_FILTERS.fill,\n paint: {\n \"fill-color\": resolveColor(\"CHBRN\", ct),\n \"fill-opacity\": 0.4,\n },\n metadata: { \"s52:objectClass\": \"DAMCON\", \"s52:role\": \"polygon\" },\n });\n layers.push({\n id: `s52-DAMCON-polygon-outline`,\n type: \"line\",\n source: sourceId,\n \"source-layer\": \"DAMCON\",\n filter: GEOM_FILTERS.fill,\n paint: {\n \"line-color\": resolveColor(\"CHBLK\", ct),\n \"line-width\": 0.6,\n },\n metadata: { \"s52:objectClass\": \"DAMCON\", \"s52:role\": \"outline\" },\n });\n }\n\n // GATCON Polygon variant — NOAA encodes 7 gates as Polygons (lock\n // gates, large flood barriers with charted footprints) while the\n // main encoding is a LineString crossing the channel. The default\n // line layer only catches LineStrings, so polygon-encoded gates were\n // silently dropped. Mirror the DAMCON Polygon idiom — CHBRN fill +\n // black outline.\n if (objectClass === \"GATCON\" && resolved.type === \"line\") {\n layers.push({\n id: `s52-GATCON-polygon`,\n type: \"fill\",\n source: sourceId,\n \"source-layer\": \"GATCON\",\n filter: GEOM_FILTERS.fill,\n paint: {\n \"fill-color\": resolveColor(\"CHBRN\", ct),\n \"fill-opacity\": 0.4,\n },\n metadata: { \"s52:objectClass\": \"GATCON\", \"s52:role\": \"polygon\" },\n });\n layers.push({\n id: `s52-GATCON-polygon-outline`,\n type: \"line\",\n source: sourceId,\n \"source-layer\": \"GATCON\",\n filter: GEOM_FILTERS.fill,\n paint: {\n \"line-color\": resolveColor(\"CHBLK\", ct),\n \"line-width\": 0.6,\n },\n metadata: { \"s52:objectClass\": \"GATCON\", \"s52:role\": \"outline\" },\n });\n }\n\n // CANALS Polygon variant — NOAA encodes 5 canals as Polygons (broad\n // ship canals with charted water-area extent, sections wide enough\n // to render as area) while most are LineStrings tracing the canal\n // centreline. The default line layer only catches LineStrings, so\n // polygon-encoded canals were silently dropped. Canals are navigable\n // water, so render the polygon as a DEPMS water tone rather than a\n // land/infrastructure fill.\n if (objectClass === \"CANALS\" && resolved.type === \"line\") {\n layers.push({\n id: `s52-CANALS-polygon`,\n type: \"fill\",\n source: sourceId,\n \"source-layer\": \"CANALS\",\n filter: GEOM_FILTERS.fill,\n paint: {\n \"fill-color\": resolveColor(\"DEPMS\", ct),\n \"fill-opacity\": 0.5,\n },\n metadata: { \"s52:objectClass\": \"CANALS\", \"s52:role\": \"polygon\" },\n });\n }\n\n // PILBOP Polygon variant — NOAA encodes 3 pilot-boarding places as\n // Polygons (charted areas where pilots board larger vessels) while\n // the main encoding is a Point with the PILBOP02 symbol. The default\n // symbol layer only catches Points, so polygon-encoded boarding\n // places were silently dropped. Pilot-boarding areas use S-52 magenta\n // (CHMGD) — render as a low-opacity magenta fill with a dashed\n // boundary so the area extent reads without overwhelming surrounding\n // chart content.\n if (objectClass === \"PILBOP\" && resolved.type === \"symbol\") {\n layers.push({\n id: `s52-PILBOP-polygon`,\n type: \"fill\",\n source: sourceId,\n \"source-layer\": \"PILBOP\",\n filter: GEOM_FILTERS.fill,\n paint: {\n \"fill-color\": resolveColor(\"CHMGD\", ct),\n \"fill-opacity\": 0.1,\n },\n metadata: { \"s52:objectClass\": \"PILBOP\", \"s52:role\": \"polygon\" },\n });\n layers.push({\n id: `s52-PILBOP-polygon-outline`,\n type: \"line\",\n source: sourceId,\n \"source-layer\": \"PILBOP\",\n filter: GEOM_FILTERS.fill,\n paint: {\n \"line-color\": resolveColor(\"CHMGD\", ct),\n \"line-width\": 0.8,\n \"line-dasharray\": [4, 2],\n },\n metadata: { \"s52:objectClass\": \"PILBOP\", \"s52:role\": \"outline\" },\n });\n }\n\n // HRBFAC Polygon variant — NOAA encodes 2 harbour facilities as\n // Polygons (large port-area footprints, ferry-terminal complexes\n // with charted extent) while the main encoding is a Point with the\n // TRFCD harbour-symbol circle. The default circle layer only catches\n // Points, so polygon-encoded harbour facilities were silently\n // dropped. Render as a very low-opacity TRFCD fill — the polygon\n // hints at the facility's footprint without competing with the\n // primary point symbol.\n if (objectClass === \"HRBFAC\" && resolved.type === \"circle\") {\n layers.push({\n id: `s52-HRBFAC-polygon`,\n type: \"fill\",\n source: sourceId,\n \"source-layer\": \"HRBFAC\",\n filter: GEOM_FILTERS.fill,\n paint: {\n \"fill-color\": resolveColor(\"TRFCD\", ct),\n \"fill-opacity\": 0.15,\n },\n metadata: { \"s52:objectClass\": \"HRBFAC\", \"s52:role\": \"polygon\" },\n });\n }\n\n // MARCUL Point + LineString variants — NOAA encodes a handful of\n // marine-cultivation features as Points (single aquaculture pen\n // markers, isolated mussel/oyster bed pins) and LineStrings (long\n // pen lines, dragged-net boundaries) alongside the main polygon\n // encoding. The default fill layer only catches polygons, so these\n // sparse non-polygon features were silently dropped. Render the\n // point as a small faint CHBRN dot, and the line as a thin dashed\n // black line — both subtle so they read as supplementary detail\n // around the main polygon farms.\n if (objectClass === \"MARCUL\" && resolved.type === \"fill\") {\n layers.push({\n id: `s52-MARCUL-point`,\n type: \"circle\",\n source: sourceId,\n \"source-layer\": \"MARCUL\",\n filter: GEOM_FILTERS.circle,\n paint: {\n \"circle-color\": resolveColor(\"CHBRN\", ct),\n \"circle-radius\": [\"interpolate\", [\"linear\"], [\"zoom\"], 12, 1.2, 14, 1.8, 17, 2.6],\n \"circle-stroke-color\": resolveColor(\"CHBLK\", ct),\n \"circle-stroke-width\": 0.4,\n \"circle-opacity\": 0.6,\n },\n metadata: { \"s52:objectClass\": \"MARCUL\", \"s52:role\": \"point\" },\n });\n layers.push({\n id: `s52-MARCUL-line`,\n type: \"line\",\n source: sourceId,\n \"source-layer\": \"MARCUL\",\n filter: GEOM_FILTERS.line,\n paint: {\n \"line-color\": resolveColor(\"CHBLK\", ct),\n \"line-width\": 0.5,\n \"line-dasharray\": [2, 2],\n },\n metadata: { \"s52:objectClass\": \"MARCUL\", \"s52:role\": \"line\" },\n });\n }\n\n // RECTRC Polygon variant — NOAA encodes 2 recommended tracks as\n // Polygons (broad recommended-route corridors with charted area\n // extent) while the main encoding is a dashed magenta centreline\n // LineString. The default line layer only catches LineStrings, so\n // polygon-encoded recommended-track corridors were silently dropped.\n // Render as a very subtle magenta fill — the recommended-track-area\n // form is contextual; the dashed centreline carries the primary cue.\n if (objectClass === \"RECTRC\" && resolved.type === \"line\") {\n layers.push({\n id: `s52-RECTRC-polygon`,\n type: \"fill\",\n source: sourceId,\n \"source-layer\": \"RECTRC\",\n filter: GEOM_FILTERS.fill,\n paint: {\n \"fill-color\": resolveColor(\"TRFCD\", ct),\n \"fill-opacity\": 0.05,\n },\n metadata: { \"s52:objectClass\": \"RECTRC\", \"s52:role\": \"polygon\" },\n });\n }\n }\n\n return layers;\n}\n\n/**\n * Build a label layer for a given S-57 object class.\n *\n * `labelOpts` flow into `getLabelConfig` for palette- and data-driven\n * styling (currently used by SOUNDG to drive the S-52 safety-contour\n * two-shade rule).\n */\nexport function buildLabelLayer(\n objectClass: string,\n ct: ColorTableName,\n sourceId: string = DEFAULT_REGION,\n depthUnits: \"meters\" | \"feet\" = \"meters\",\n labelOpts: { safetyContour?: number; twoShadeSoundings?: boolean; soundingFontWeight?: \"regular\" | \"semibold\" } = {},\n): StyleLayer | null {\n if (!LABELED_LAYERS.has(objectClass)) return null;\n\n const config = getLabelConfig(objectClass, {\n colorTable: ct,\n safetyContour: labelOpts.safetyContour,\n twoShadeSoundings: labelOpts.twoShadeSoundings,\n soundingFontWeight: labelOpts.soundingFontWeight,\n });\n if (!config) return null;\n\n // For LIGHTS, replace the runtime _lightLabel with a GL expression\n let textField = config.textField;\n if (objectClass === \"LIGHTS\") {\n textField = buildLightLabelExpression() as unknown as typeof textField;\n }\n\n // For nav aids, `_navAidLabel` is added by `preprocessNavAids()` only\n // on the GeoJSON path. The PMTiles path doesn't have that preprocessing,\n // so the bare-OBJNAM fallback used to lose the safety-critical color\n // cue. Replace with a static expression that prefixes the colour letter\n // (R / G / Y) and keeps the runtime label when present.\n if (typeof textField !== \"string\" && Array.isArray(textField)) {\n const flat = JSON.stringify(textField);\n if (flat.includes(\"_navAidLabel\")) {\n textField = buildNavAidLabelExpression() as unknown as typeof textField;\n }\n }\n\n // Depth labels are stored in meters (S-57 native). When `depthUnits`\n // is \"feet\", wrap the source value with × 3.28084 + round so SOUNDG\n // and DEPCNT labels render in feet. SOUNDG keeps no suffix to match\n // the meters convention; DEPCNT swaps its \"m\" suffix for \"ft\".\n if (depthUnits === \"feet\") {\n if (objectClass === \"SOUNDG\") {\n textField = [\n \"concat\",\n [\n \"round\",\n [\n \"*\",\n [\n \"to-number\",\n [\"coalesce\", [\"get\", \"depth\"], [\"get\", \"DEPTH\"], [\"get\", \"VALSOU\"]],\n 0,\n ],\n 3.28084,\n ],\n ],\n \"\",\n ] as unknown as typeof textField;\n } else if (objectClass === \"DEPCNT\") {\n textField = [\n \"concat\",\n [\"round\", [\"*\", [\"to-number\", [\"get\", \"VALDCO\"]], 3.28084]],\n \"ft\",\n ] as unknown as typeof textField;\n }\n }\n\n const isSafetyCritical = SAFETY_CRITICAL_LABELS.has(objectClass);\n const layer: StyleLayer = {\n id: `s52-${objectClass}-label`,\n type: \"symbol\",\n source: sourceId,\n \"source-layer\": objectClass,\n filter: GEOM_FILTERS.symbol,\n layout: {\n \"text-field\": textField,\n \"text-size\": config.textSize,\n \"text-font\": config.textFont ?? [\"Open Sans Regular\"],\n \"text-offset\": config.textOffset,\n \"text-anchor\": \"top\",\n \"text-allow-overlap\": isSafetyCritical,\n \"text-optional\": !isSafetyCritical,\n \"text-padding\": isSafetyCritical ? 0 : 4,\n ...(config.layout ?? {}),\n },\n paint: {\n \"text-color\": config.textColor,\n \"text-halo-color\": config.textHaloColor,\n \"text-halo-width\": config.textHaloWidth,\n },\n };\n\n if (config.minzoom) {\n layer.minzoom = config.minzoom;\n }\n\n // DEPCNT labels follow the line\n if (objectClass === \"DEPCNT\") {\n layer.filter = GEOM_FILTERS.line;\n }\n\n // Overhead cable / pipeline labels follow the line (mast-clearance VERCLR\n // value rendered along the line via `symbol-placement: \"line\"`). Default\n // `GEOM_FILTERS.symbol` would reject the LineString geometries and the\n // label would never render.\n if (objectClass === \"CBLOHD\" || objectClass === \"PIPOHD\") {\n layer.filter = GEOM_FILTERS.line;\n }\n\n // SBDARE labels must render on BOTH Polygon (centroid placement via\n // `symbol-placement: \"point\"` in the label config) and Point geometries.\n // The default `GEOM_FILTERS.symbol` (Point/MultiPoint only) would drop\n // the 2,369 polygon-encoded seabed areas — clear the filter so MapLibre\n // labels both encodings through a single layer. Same rationale as the\n // orientation-cross-band filter drop, but SBDARE stays feature-band-gated\n // so polygons in different source bands don't render duplicate labels.\n if (objectClass === \"SBDARE\") {\n delete (layer as { filter?: unknown }).filter;\n }\n\n // MAGVAR labels must render on BOTH Polygon (isogonic-zone centroids,\n // 136 features) and Point (isolated VALMAG observations, 58 features).\n // Same default-filter problem as SBDARE — clear it so a single label\n // layer covers both encodings.\n if (objectClass === \"MAGVAR\") {\n delete (layer as { filter?: unknown }).filter;\n }\n\n // Orientation labels are polygon-source (sea-area names, land regions,\n // cities, lakes, airports). MapLibre symbol layers on polygon sources\n // place labels at the polygon centroid — but only if the geom-type\n // filter doesn't reject polygons. The default `GEOM_FILTERS.symbol`\n // matches Point/MultiPoint only, which would silently drop every\n // polygon orientation feature. Drop the filter for these classes so\n // MapLibre handles polygon centroids (and line midpoints, for RIVERS).\n if (getLabelBehavior(objectClass) === \"orientation-cross-band\") {\n delete (layer as { filter?: unknown }).filter;\n }\n\n return layer;\n}\n\n/** Determine appropriate geometry types for a class */\nfunction getGeomTypesForClass(\n objectClass: string,\n defaultType?: GeomType,\n): GeomType[] {\n // Symbol layers render as symbols only (not fill/line)\n if (SYMBOL_MAP[objectClass] && defaultType === \"symbol\") {\n return [\"symbol\"];\n }\n\n // SOUNDG is invisible (labels only) — render as circle with 0 opacity\n if (objectClass === \"SOUNDG\") {\n return [\"circle\"];\n }\n\n // Default: use the lookup table's type\n if (defaultType) {\n return [defaultType];\n }\n\n // Fallback\n return [\"circle\"];\n}\n\n/**\n * Get the full ordered list of object classes for style generation.\n * Uses S52_DRAW_ORDER as base, then adds any missing classes from the\n * S-52 lookup table so a newly-ingested class automatically gets styled\n * without touching this file.\n */\nexport function getOrderedClasses(): string[] {\n const ordered = [...S52_DRAW_ORDER];\n\n for (const key of Object.keys(S52_LOOKUP)) {\n if (!ordered.includes(key)) {\n // Insert before point features\n const insertIdx = ordered.indexOf(\"SOUNDG\");\n if (insertIdx >= 0) {\n ordered.splice(insertIdx, 0, key);\n } else {\n ordered.push(key);\n }\n }\n }\n\n return ordered;\n}\n","/**\n * Strict scale-band priority for continuous-mode rendering.\n *\n * Each ENC feature in the served PMTiles carries `_cell_id` (added at\n * baremetal NDJSON export time). NOAA's cell-id format encodes the source\n * scale band as the third character: `US5MA85M` is band 5 (Harbor).\n *\n * MapLibre layer filters can't read `[\"zoom\"]`, so to enforce \"only one\n * band renders at any given zoom\" we emit one layer copy per band, each\n * with a static band filter and per-band `minzoom`/`maxzoom`. The ranges\n * below are non-overlapping (`minzoom` inclusive, `maxzoom` exclusive),\n * so exactly one band is visible at any continuous zoom.\n *\n * Long-term cleanup: baremetal should emit a normalized `_band: 1..6`\n * integer in NDJSON so this works for non-NOAA chart sources too. The\n * `[\"slice\", _cell_id, 2, 3]` extraction here is NOAA-specific.\n */\n\n/**\n * UI-facing scale-band names (matches the app's `ScaleBand` type in\n * `src/lib/map/constants.ts`). Defined locally so the SDK doesn't have\n * to depend on app code.\n */\nexport type ScaleBand = \"Overview\" | \"General\" | \"Coastal\" | \"Approach\" | \"Harbor\";\n\n/** S-57 source bands. NOAA cell ids use these as the third character. */\nexport type BandCode = \"1\" | \"2\" | \"3\" | \"4\" | \"5\" | \"6\";\n\nexport interface BandPriorityRange {\n /** MapLibre `minzoom` (inclusive). */\n minzoom: number;\n /** MapLibre `maxzoom` (exclusive). `undefined` means no upper cap. */\n maxzoom?: number;\n}\n\n/**\n * Per-band minzoom thresholds for continuous mode. Bands cascade as\n * fallbacks for one another — every band whose `minzoom` is satisfied\n * may render. The deeper-numbered band's features render preferentially\n * (drawn last in the z-stack, so its opaque fills cover lower bands),\n * and lower bands fill in where the higher band has no coverage.\n *\n * Cross-band visual overlap (doubled coastlines, blended fills) is\n * suppressed by the `_dominated_by_min` per-feature tag added at NDJSON\n * export time (see `tools/chrt-baremetal/server/src/tilebuild/dominanceIndex.ts`):\n * every feature whose centroid sits inside a higher-band cell's M_COVR\n * coverage polygon is tagged with the LOWEST band code (2..6) that\n * dominates it, and `makeBandVariants()` in the style generator emits\n * per-(featureBand, dominatorBand) layer variants gated by `maxzoom =\n * BAND_PRIORITY_RANGES[D].minzoom`. The dominated feature renders until\n * exactly the zoom where its dominator becomes eligible — solving the\n * low-zoom \"black silhouettes\" bug where a band-3 LNDARE dominated by\n * a band-5 cell was dropped at z7 even though band 5 wasn't yet rendering\n * at z7. At any pixel, exactly ONE band's data renders — the\n * most-detailed band whose minzoom has been reached and whose cells\n * actually cover that pixel.\n *\n * Bands 5 and 6 both start at z11; band 6 (Berthing) is drawn AFTER\n * band 5 (Harbor) so where Berthing exists it visually wins, and\n * Harbor shows through everywhere else.\n */\nexport const BAND_PRIORITY_RANGES: Record<BandCode, BandPriorityRange> = {\n \"1\": { minzoom: 3 },\n \"2\": { minzoom: 5 },\n \"3\": { minzoom: 7 },\n \"4\": { minzoom: 9 },\n \"5\": { minzoom: 11 },\n \"6\": { minzoom: 11 },\n};\n\n/**\n * Order in which band layers are emitted (and thus drawn — earlier = lower\n * in the z-stack). Band 6 last so Berthing draws on top of Harbor.\n */\nexport const BAND_DRAW_ORDER: BandCode[] = [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\"];\n\n/**\n * UI scale-band names → cell-id band codes that should render in chart mode\n * for that selection. The UI doesn't expose Berthing separately, so picking\n * Harbor includes both `5` and `6` cells.\n *\n * `CHART_BAND_CODES` is the *requested* band set (what the user picked);\n * `CHART_CASCADE_CODES` below adds the coarser bands that fall back where\n * the requested band has no cells.\n */\nexport const CHART_BAND_CODES: Record<ScaleBand, readonly BandCode[]> = {\n Overview: [\"1\"],\n General: [\"2\"],\n Coastal: [\"3\"],\n Approach: [\"4\"],\n Harbor: [\"5\", \"6\"],\n};\n\n/**\n * UI scale-band names → ordered cascade of cell-id band codes for chart-mode\n * rendering with graceful coverage fallback. Bands are listed coarsest-first\n * so the style generator can use array order as draw order: lower bands draw\n * earlier in the z-stack, the requested band draws last on top.\n *\n * The chart-mode implementation emits one filtered layer per cascade band per\n * S-57 class. Where the requested band's cells provide data, its opaque fills\n * cover the lower bands underneath; where the requested band has no cells\n * (e.g. Chart→Harbor over Massachusetts Bay offshore), the next-coarser band\n * shows through. Different cells in the same viewport may end up rendering at\n * different effective bands.\n *\n * The per-feature `_dominated_by_min` tag baked at baremetal NDJSON-export\n * time (see `tools/chrt-baremetal/server/src/tilebuild/dominanceIndex.ts`)\n * suppresses lower-band features inside higher-band cell coverage so cell\n * boundaries don't render with doubled coastlines or contours.\n *\n * Lock scope: when chart-Harbor's viewport-lock greyout is active, the\n * `[\"within\"]` bbox filter is applied ONLY to the requested band's variants\n * — cascade fallback bands render across the full viewport. The greyout\n * overlay still cues the lock boundary visually; the user picks Harbor and\n * gets Harbor inside the lock plus dimmed Approach/Coastal context outside.\n *\n * See `.chrt/ux/chart-mode-band-fallback-2026-05-05.md` for the design\n * rationale and the geographies (Boston Harbor, Massachusetts Bay offshore)\n * that motivated this.\n */\nexport const CHART_CASCADE_CODES: Record<ScaleBand, readonly BandCode[]> = {\n Overview: [\"1\"],\n General: [\"1\", \"2\"],\n Coastal: [\"1\", \"2\", \"3\"],\n Approach: [\"1\", \"2\", \"3\", \"4\"],\n Harbor: [\"1\", \"2\", \"3\", \"4\", \"5\", \"6\"],\n};\n\n/**\n * Build a MapLibre filter expression that matches features in the given\n * band code(s) by extracting the band character from `_cell_id`.\n */\nexport function bandFilterExpression(codes: BandCode | readonly BandCode[]): unknown[] {\n const list = Array.isArray(codes) ? codes : [codes];\n if (list.length === 1) {\n return [\"==\", [\"slice\", [\"get\", \"_cell_id\"], 2, 3], list[0]];\n }\n return [\"in\", [\"slice\", [\"get\", \"_cell_id\"], 2, 3], [\"literal\", [...list]]];\n}\n\n/**\n * Combine a base filter (may be undefined) with a band filter via `[\"all\"]`.\n * If the base filter is itself an `[\"all\", ...]`, flatten so we don't end\n * up with `[\"all\", [\"all\", ...], ...]` (which is legal but ugly).\n */\nexport function combineWithBandFilter(\n baseFilter: unknown[] | undefined,\n bandFilter: unknown[],\n): unknown[] {\n if (!baseFilter) return bandFilter;\n if (baseFilter[0] === \"all\") {\n return [\"all\", ...baseFilter.slice(1), bandFilter];\n }\n return [\"all\", baseFilter, bandFilter];\n}\n\n/**\n * MapLibre filter clause that matches features with NO dominator tag at\n * all — used by the \"render forever\" variant of every per-band layer.\n *\n * Excludes both:\n * - the new `_dominated_by_min` integer tag (handled by per-D variants\n * gated with `maxzoom`)\n * - the legacy `_dominated: true` boolean from PR #298, kept around so\n * tiles served from R2 cache during the rebuild propagation window\n * still drop dominated features (under the legacy variant the boolean\n * is treated as \"dominated by the highest possible band\" — see\n * `dominatedByMinFilter(\"6\")`).\n *\n * Features lacking BOTH properties default to \"not dominated\" → render\n * everywhere their band is eligible. Non-NOAA chart sources (no cell-id\n * band parsing) and builds where the dominance index failed to build\n * fall through this path with no behavior change — same as before\n * dominance was wired up.\n */\nexport const NOT_DOMINATED_FILTER: unknown[] = [\n \"all\",\n [\"!\", [\"has\", \"_dominated_by_min\"]],\n [\"!=\", [\"get\", \"_dominated\"], true],\n];\n\n/**\n * MapLibre filter clause that matches features dominated by the given\n * minimum-dominator band D. The atlas pairs this with `maxzoom =\n * BAND_PRIORITY_RANGES[D].minzoom` on the layer variant so the feature\n * renders only at zooms below D's eligibility threshold; once the\n * dominator becomes drawable, the feature is dropped and the dominator\n * takes over rendering at that pixel.\n *\n * The highest D (band 6) also accepts the legacy `_dominated: true`\n * boolean from PR #298 so tiles served from R2 cache during the rebuild\n * propagation window get a sensible drop (at z ≥ 11) rather than\n * disappearing at all zooms. Old-tagged features render below z11 in\n * their original band — slightly wrong vs the actual dominator, but the\n * tile cache turns over fast enough that this overlap window is brief.\n */\nexport function dominatedByMinFilter(D: BandCode): unknown[] {\n const dInt = parseInt(D, 10);\n if (D === \"6\") {\n return [\n \"any\",\n [\"==\", [\"get\", \"_dominated_by_min\"], dInt],\n [\"==\", [\"get\", \"_dominated\"], true],\n ];\n }\n return [\"==\", [\"get\", \"_dominated_by_min\"], dInt];\n}\n\n/**\n * Geographic bounding box used for chart-mode viewport locking.\n * Coordinates in WGS84 lng/lat. `sw` is south-west corner, `ne` is north-east.\n */\nexport interface BBox {\n sw: [number, number];\n ne: [number, number];\n}\n\n/**\n * Build a MapLibre `[\"within\"]` filter expression that matches features\n * inside the given bbox. Used by chart mode to spatially limit which\n * features render — when locked to a Harbor area, only features inside\n * the locked bbox draw, even though the tile pyramid covers more.\n *\n * The polygon is closed (first and last vertex repeated) per the GeoJSON\n * spec; without that, MapLibre throws on style validation.\n */\nexport function withinBboxFilter(bbox: BBox): unknown[] {\n const [w, s] = bbox.sw;\n const [e, n] = bbox.ne;\n return [\n \"within\",\n {\n type: \"Polygon\",\n coordinates: [\n [\n [w, s],\n [e, s],\n [e, n],\n [w, n],\n [w, s],\n ],\n ],\n },\n ];\n}\n\n/**\n * Build a GeoJSON Polygon for the world MINUS a given bbox — i.e. an\n * outer ring covering the whole world with a single hole punched at\n * the bbox. Used by the frontend as the source for a translucent grey\n * overlay so the user sees clearly where the chart is \"locked.\"\n *\n * Outer ring uses the standard antimeridian-safe world extent\n * (lng [-180, 180], lat [-85, 85] — Web Mercator's safe range).\n */\nexport function worldMinusBboxPolygon(bbox: BBox): GeoJSON.Polygon {\n const [w, s] = bbox.sw;\n const [e, n] = bbox.ne;\n return {\n type: \"Polygon\",\n coordinates: [\n [\n [-180, -85],\n [180, -85],\n [180, 85],\n [-180, 85],\n [-180, -85],\n ],\n // Inner ring (hole) — winding opposite to outer ring per GeoJSON\n // spec. MapLibre is permissive but we follow strict winding.\n [\n [w, s],\n [w, n],\n [e, n],\n [e, s],\n [w, s],\n ],\n ],\n };\n}\n","/**\n * Generates a complete Mapbox GL Style Specification v8 JSON\n * from the S-52 atlas definitions.\n */\n\nimport type { ColorTableName } from \"./s52-colors\";\nimport {\n buildSources,\n DEFAULT_REGION,\n type BuildSourcesOptions,\n} from \"./source-registry\";\nimport { buildLayersForClass, buildLabelLayer, getOrderedClasses, HIGH_DENSITY_NAV_AIDS } from \"./layer-builder\";\nimport type { StyleLayer } from \"./layer-builder\";\nimport { getLabelBehavior } from \"./labels\";\nimport {\n BAND_PRIORITY_RANGES,\n BAND_DRAW_ORDER,\n CHART_BAND_CODES,\n CHART_CASCADE_CODES,\n bandFilterExpression,\n combineWithBandFilter,\n withinBboxFilter,\n NOT_DOMINATED_FILTER,\n dominatedByMinFilter,\n type BandCode,\n type BBox,\n type ScaleBand,\n} from \"./band-priority\";\n\nexport interface MapboxStyle {\n version: 8;\n name: string;\n metadata: Record<string, unknown>;\n sources: Record<string, unknown>;\n sprite?: string;\n glyphs: string;\n layers: StyleLayer[];\n}\n\nconst META_LAYERS = new Set([\n \"DSID\", \"C_AGGR\", \"C_ASSO\", \"CTRPNT\", \"MAGVAR\", \"M_COVR\", \"M_NPUB\",\n \"M_NSYS\", \"M_QUAL\", \"M_SREL\", \"M_SDAT\", \"M_VDAT\", \"M_CSCL\", \"TS_FEB\",\n \"TS_TIS\", \"COSARE\", \"NEWOBJ\", \"LOCMAG\",\n]);\n\nconst PALETTE_NAMES: Record<ColorTableName, string> = {\n DAY: \"DAY_BRIGHT\",\n DUSK: \"DUSK\",\n NIGHT: \"NIGHT\",\n};\n\n/**\n * Apply per-band variant transform to a single base layer, fanned out\n * across the dominance cascade.\n *\n * For a feature-band B, the dominance index can have tagged the feature\n * with `_dominated_by_min: D` where D > B (the lowest band that covers\n * the feature's centroid). MapLibre layer filters can't read `[\"zoom\"]`,\n * so we encode \"render until the dominator becomes eligible\" as separate\n * layer variants gated by `maxzoom`:\n *\n * 1. Not-dominated variant — no maxzoom, renders at every zoom from\n * `band_minzoom` upward. Catches features with no `_dominated_by_min`\n * tag at all (and excludes the legacy `_dominated: true` boolean\n * from PR #298 so old cached tiles don't bleed through).\n * 2. One variant per higher band D > B — filter `_dominated_by_min == D`,\n * `maxzoom = BAND_PRIORITY_RANGES[D].minzoom`. The variant renders\n * from `band_minzoom` up to (exclusive) D's minzoom, then disappears\n * exactly when D becomes eligible to render.\n *\n * This solves the low-zoom black-silhouette bug: at z7.17 a band-3 LNDARE\n * dominated by a band-5 cell hits the \"dominated by 5\" variant and renders\n * (since z7 < z11 = band-5 minzoom); at z11 the variant drops out and the\n * band-5 layer takes over.\n *\n * `minzoom = max(class_minzoom, band_minzoom)` is preserved so SCAMIN-\n * driven class minzooms aren't violated. If a higher band's minzoom is\n * already ≤ this layer's minzoom, the dominator is *always* eligible\n * when this layer would render — emitting a variant for it would be a\n * dead layer, so we skip.\n *\n * Returns up to (1 + (BAND_DRAW_ORDER.length - position(B))) variants per\n * band B. Sum across B=1..6 is 21 variants per fillable class. With ~30\n * classes that's ~630 variants for fills; the existing generated style is\n * ~700 layers and MapLibre handles that fine.\n *\n * Z-stack ordering is the caller's responsibility — at the style-generator\n * level we want band-then-class interleaving (all classes for band 1,\n * then all for band 2, etc.) so a band-N feature always paints over\n * band-(N-1) of any class. That kills the \"broader-scope class painted on\n * top of harbor detail\" pollution that pre-PR-#302 class-then-band\n * ordering caused: under that order a band-1 RESARE drew on top of a\n * band-6 LNDARE because each class was emitted as a contiguous block.\n */\n/**\n * Classes whose features render correctly even when multiple bands stack\n * over the same pixel — i.e., where the dominance filter is unnecessary\n * because cross-band overlap is visually a no-op.\n *\n * LNDARE: land geometry is class-uniform (every band paints the same\n * LANDA fill at full opacity). Two bands' LNDARE polygons drawn over\n * the same area give identical pixels. The new makeBandVariants cascade\n * already covers the LOW-ZOOM case (a band-3 LNDARE dominated_by_min=5\n * renders below z11 via the dom-by-5 variant with maxzoom=11). But at\n * z >= 11, dominator band 5 IS eligible, so the dom-by-5 variant drops\n * out — and if the band-5 cell has M_COVR but no actual LNDARE data\n * (Fort Warren / Hull / Fort Andrews in Boston Outer Harbor), nothing\n * renders → Carto basemap shows through as dark blobs.\n *\n * The exemption fixes that: LNDARE emits a single no-dominance-filter\n * variant per band that renders forever. All bands' LNDARE always\n * render, paint the same color, no visual artifact from stacking, and\n * Fort Warren etc. correctly fall through to the lower band's LANDA.\n *\n * COALNE is NOT in this set: coastline lines have subtle shape\n * differences between bands (more detailed at higher scales) and\n * stacking would produce visible double-line artifacts.\n *\n * DEPARE / SEAARE are NOT in this set: depth-area fills have different\n * colors per depth-tier band, so stacking blends to wrong colors.\n */\nconst DOMINANCE_EXEMPT_CLASSES = new Set([\n \"LNDARE\",\n // Safety-critical nav-aid point classes (S-52 viewing groups 24020,\n // 27010, 27070, 27080). User-reported: offshore Mass Bay BOYSAW /\n // BOYLAT etc. disappeared at z >= 12 because the dominance index\n // tagged the coastal-band feature `_dominated_by_min` for a harbor\n // cell whose M_COVR centroid-covered the buoy but whose feature data\n // didn't actually include it — no harbor-band copy ever takes over,\n // the dominated coastal variant times out at the dominator's\n // minzoom, and the buoy vanishes. Force these classes to always\n // render their not-dominated variant regardless of `_dominated_by_min`.\n // Trade-off: where both coastal AND harbor cells genuinely have the\n // same buoy, both copies render stacked — visually indistinguishable\n // from one buoy. Safety wins over the cosmetic dedupe.\n \"BOYLAT\", \"BOYCAR\", \"BOYSPP\", \"BOYISD\", \"BOYSAW\", \"BOYINB\",\n \"BCNLAT\", \"BCNCAR\", \"BCNSPP\", \"BCNISD\", \"BCNSAW\",\n \"LIGHTS\", \"LITFLT\", \"LITVES\",\n \"FOGSIG\", \"RTPBCN\", \"RDOSTA\",\n]);\n\nfunction isDominanceExempt(layer: StyleLayer): boolean {\n // Layer ids look like `s52-LNDARE-fill` / `s52-LNDARE-fill-outline` /\n // `s52-LNDARE-label`. Match by class token between dashes.\n for (const cls of DOMINANCE_EXEMPT_CLASSES) {\n if (layer.id.startsWith(`s52-${cls}-`)) return true;\n }\n return false;\n}\n\nfunction makeBandVariants(layer: StyleLayer, B: BandCode): StyleLayer[] {\n const range = BAND_PRIORITY_RANGES[B];\n const classMinzoom = layer.minzoom ?? 0;\n const minzoom = Math.max(classMinzoom, range.minzoom);\n const variants: StyleLayer[] = [];\n\n // Dominance-exempt classes (LNDARE) emit a single variant with no\n // dominance filter and no maxzoom — every band of LNDARE always\n // renders. The per-D dominator variants and the not-dominated\n // variant collapse into one because their union is \"render always\n // when this band's filter matches\", and the dominance check is moot\n // (stacking same-color land polygons is a visual no-op).\n if (isDominanceExempt(layer)) {\n const exempt: StyleLayer = {\n ...layer,\n id: `${layer.id}-band${B}`,\n filter: combineWithBandFilter(layer.filter, bandFilterExpression(B)),\n minzoom,\n };\n delete exempt.maxzoom;\n return [exempt];\n }\n\n // 1. Not-dominated variant — renders forever from `minzoom`.\n const notDom: StyleLayer = {\n ...layer,\n id: `${layer.id}-band${B}`,\n filter: combineWithBandFilter(\n layer.filter,\n [\"all\", bandFilterExpression(B), NOT_DOMINATED_FILTER],\n ),\n minzoom,\n };\n delete notDom.maxzoom;\n variants.push(notDom);\n\n // 2. One variant per higher dominator D — renders only below D's minzoom.\n const bInt = parseInt(B, 10);\n for (const D of BAND_DRAW_ORDER) {\n const dInt = parseInt(D, 10);\n if (dInt <= bInt) continue;\n const dRange = BAND_PRIORITY_RANGES[D];\n // Skip dead variants: if the dominator is already eligible at this\n // layer's minzoom, the maxzoom would be ≤ minzoom and MapLibre would\n // never draw the layer anyway. (Bands 5 and 6 share minzoom 11, so\n // a band-5-on-band-5 emit would be vacuous — only matters when class\n // minzoom raises B above its band default.)\n if (dRange.minzoom <= minzoom) continue;\n const domVariant: StyleLayer = {\n ...layer,\n id: `${layer.id}-band${B}-domBy${D}`,\n filter: combineWithBandFilter(\n layer.filter,\n [\"all\", bandFilterExpression(B), dominatedByMinFilter(D)],\n ),\n minzoom,\n maxzoom: dRange.minzoom,\n };\n variants.push(domVariant);\n }\n\n return variants;\n}\n\n/**\n * Cascade fan-out for orientation-cross-band labels (sea-area names, land\n * regions, cities). These labels aren't gated by feature band — they\n * persist across zooms regardless of which band the underlying polygon\n * lives in. But they share the same dominance bug as feature-band-gated\n * fills: a Cape Cod orientation label tagged `_dominated_by_min: 5` was\n * dropped at all zooms, even at z6 where band 5 isn't eligible.\n *\n * Same fix: emit a not-dominated variant plus per-dominator-D variants\n * with `maxzoom = BAND_PRIORITY_RANGES[D].minzoom`. Up to 1 + 5 = 6\n * variants per orientation-label class. Lowest possible dominator is\n * band 2 (band 1 never dominates anything — there's no lower band).\n */\nfunction fanOrientationLabelByDominator(label: StyleLayer): StyleLayer[] {\n const variants: StyleLayer[] = [];\n\n variants.push({\n ...label,\n id: `${label.id}-notdom`,\n filter: combineWithBandFilter(label.filter, NOT_DOMINATED_FILTER),\n });\n\n for (const D of BAND_DRAW_ORDER) {\n if (D === \"1\") continue; // band 1 is the lowest; nothing dominates anything as band 1\n variants.push({\n ...label,\n id: `${label.id}-domBy${D}`,\n filter: combineWithBandFilter(label.filter, dominatedByMinFilter(D)),\n maxzoom: BAND_PRIORITY_RANGES[D].minzoom,\n });\n }\n\n return variants;\n}\n\n/**\n * Per-band layout overrides for high-density nav-aid LABEL variants at\n * Harbor-band scales (codes 5 + 6).\n *\n * The default `buildLabelLayer` sets `text-allow-overlap: true` for every\n * safety-critical class so the labels win collisions against the\n * underlying Carto basemap's place/road labels. That's correct at lower\n * zooms where chart label density is sparse — but at Harbor zoom, where\n * many same-class siblings sit feet apart along channel margins /\n * regulated-area perimeters (Logan Airport security-zone buoys, Boston\n * Main Channel laterals), allow-overlap=true also lets sibling labels\n * stomp each other → unreadable pile-ups.\n *\n * At band 5/6 specifically, swap allow-overlap=false (let MapLibre drop\n * lower-priority labels in dense clusters) and bump text-padding so the\n * surviving labels space out. Adds a deterministic `symbol-sort-key` so\n * collision arbitration is stable across tile-load orders.\n *\n * LIGHTS / FOGSIG / RTPBCN / LITVES / LITFLT are NOT in\n * `HIGH_DENSITY_NAV_AIDS` so they keep allow-overlap=true at every band\n * — light characteristics are genuinely irreducible safety info.\n *\n * Returns the variant unchanged if the class isn't a high-density nav-aid\n * or the band isn't 5/6.\n */\nfunction applyHarborLabelCollisionDiscipline(\n variant: StyleLayer,\n objectClass: string,\n code: BandCode,\n): StyleLayer {\n if (!HIGH_DENSITY_NAV_AIDS.has(objectClass)) return variant;\n if (code !== \"5\" && code !== \"6\") return variant;\n const oldLayout = (variant.layout ?? {}) as Record<string, unknown>;\n return {\n ...variant,\n layout: {\n ...oldLayout,\n \"text-allow-overlap\": false,\n \"text-optional\": true,\n // Wider padding so even allowed labels space visually instead of\n // touching. 6 is enough to read individual buoy designations clearly\n // at z12-14 over Boston Harbor.\n \"text-padding\": 6,\n // Deterministic collision arbitration: prefer features with\n // longer-range nav-aid significance (VALNMR — visible nautical\n // miles), then shorter OBJNAM (tighter labels win), then FIDN as\n // tiebreaker. Lower sort-key wins in MapLibre.\n \"symbol-sort-key\": [\n \"case\",\n [\"has\", \"VALNMR\"],\n [\"-\", 0, [\"coalesce\", [\"to-number\", [\"get\", \"VALNMR\"]], 0]],\n [\"length\", [\"coalesce\", [\"get\", \"OBJNAM\"], \"\"]],\n ] as unknown,\n },\n };\n}\n\n/**\n * Build the per-cascade-band filter for chart mode. Combines, in order:\n * - the layer's existing filter\n * - a band filter restricting to cell-id band B\n * - a \"not dominated by any cascade-higher band\" guard (skipped for\n * dominance-exempt classes like LNDARE)\n * - optionally the within-bbox filter when B is in the requested-band\n * set, so chart-Harbor's viewport-lock greys out only the requested\n * band's data — cascade fallback bands render across the full\n * viewport (a Mass Bay user picking Harbor still sees Approach data\n * offshore; the existing greyout overlay dims it but doesn't hide it)\n *\n * The \"dominated by cascade-higher band\" check is the chart-mode analog\n * of the continuous-mode `_dominated_by_min` cascade in `makeBandVariants`.\n * Continuous mode encodes \"render until the dominator's zoom\" via\n * `maxzoom`; chart mode has no zoom windows (free zoom, post-PR-#289), so\n * here we drop dominated features unconditionally — the dominator's\n * variant always renders if it's in the cascade chain.\n *\n * Crucially, \"cascade-higher\" only includes bands actually present in the\n * cascade chain. In Chart→Coastal (cascade [\"1\",\"2\",\"3\"]), a band-2\n * feature `_dominated_by_min: 4` should render — band 4 isn't in the\n * cascade so its dominator never appears, and the band-2 feature would\n * otherwise vanish at all zooms.\n */\nfunction chartModeFilterForBand(\n layer: StyleLayer,\n B: BandCode,\n higherCascadeBands: readonly BandCode[],\n lockedBounds: BBox | undefined,\n isRequestedBand: boolean,\n): unknown[] {\n let filter = combineWithBandFilter(layer.filter, bandFilterExpression(B));\n\n if (!isDominanceExempt(layer)) {\n for (const D of higherCascadeBands) {\n filter = combineWithBandFilter(filter, [\"!\", dominatedByMinFilter(D)]);\n }\n }\n\n if (lockedBounds && isRequestedBand) {\n filter = combineWithBandFilter(filter, withinBboxFilter(lockedBounds));\n }\n\n return filter;\n}\n\nexport interface StyleGeneratorOptions extends BuildSourcesOptions {\n /**\n * When set, emit a \"paper chart\" style centered on the selected scale\n * band, with graceful coverage fallback: the requested band's layers\n * draw on top where its cells have data; coarser bands (driven by\n * `CHART_CASCADE_CODES`) fill gaps where the requested band has no\n * cells. Per-feature SCAMIN minzooms are preserved on every cascade\n * variant; `maxzoom` is dropped so the user can zoom in indefinitely.\n *\n * When omitted (default), continuous mode emits one layer copy per\n * source band with strict per-band zoom windows so exactly one band\n * renders at any given continuous zoom.\n *\n * `lockedBounds` (optional) restricts chart-mode rendering to a\n * specific bbox via a `[\"within\"]` filter — applied ONLY to the\n * requested band's variants. Cascade fallback bands render across the\n * full viewport so a chart-Harbor user panning offshore still sees\n * Approach/Coastal data. The frontend pairs this with a translucent\n * grey overlay outside the bbox so the lock boundary is still visible\n * to the user (the fallback data is dimmed by the overlay but not\n * filtered out).\n */\n chartMode?: { band: ScaleBand; lockedBounds?: BBox };\n /**\n * Display unit for depth labels (SOUNDG soundings, DEPCNT contour\n * values). Source data is always meters (S-57 / VALSOU / VALDCO);\n * \"feet\" wraps the text-field expression with a unit conversion +\n * round so the rendered numbers match. Default \"meters\".\n */\n depthUnits?: \"meters\" | \"feet\";\n /**\n * S-52 §SOUNDG02 — soundings shoaler than this depth (metres) render in\n * the high-contrast color; deeper soundings render in the muted color.\n * Default 10 m.\n */\n safetyContour?: number;\n /**\n * When false, all soundings render in a single shade. Default true.\n */\n twoShadeSoundings?: boolean;\n /**\n * Font weight for SOUNDG labels. Default \"semibold\" — crisper numerals\n * at small sizes on screen.\n */\n soundingFontWeight?: \"regular\" | \"semibold\";\n}\n\nexport function generateStyle(\n palette: ColorTableName = \"DAY\",\n opts: StyleGeneratorOptions = {},\n): MapboxStyle {\n const sources = buildSources(opts);\n const sourceId = opts.region ?? DEFAULT_REGION;\n const orderedClasses = getOrderedClasses();\n const layers: StyleLayer[] = [];\n const labelLayers: StyleLayer[] = [];\n\n const chartCascade = opts.chartMode\n ? CHART_CASCADE_CODES[opts.chartMode.band]\n : null;\n const chartRequestedCodes = opts.chartMode\n ? CHART_BAND_CODES[opts.chartMode.band]\n : null;\n\n const lockedBounds = opts.chartMode?.lockedBounds;\n\n // Build a per-class arsenal of layers up front. Each entry is the\n // class's full S-52 layer set (fill + outline + symbol etc.) in\n // its native intra-class draw order.\n type ClassBundle = { objectClass: string; featureLayers: StyleLayer[]; label: StyleLayer | null };\n const bundles: ClassBundle[] = [];\n for (const objectClass of orderedClasses) {\n if (META_LAYERS.has(objectClass)) continue;\n bundles.push({\n objectClass,\n featureLayers: buildLayersForClass(objectClass, palette, sourceId),\n label: buildLabelLayer(objectClass, palette, sourceId, opts.depthUnits ?? \"meters\", {\n safetyContour: opts.safetyContour,\n twoShadeSoundings: opts.twoShadeSoundings,\n soundingFontWeight: opts.soundingFontWeight,\n }),\n });\n }\n\n // CHART MODE: per-cell progressive band cascade. Emit one filtered\n // variant per cascade band per class, in band-then-class order so\n // the requested band's layers paint last on top. Where the requested\n // band's cells cover the viewport, its opaque fills win over the\n // coarser-band variants underneath. Where it has no cells (Mass Bay\n // offshore in Chart→Harbor), the next-coarser band shows through —\n // the customer keeps seeing chart data instead of empty basemap.\n // See `.chrt/ux/chart-mode-band-fallback-2026-05-05.md`.\n if (chartCascade && chartRequestedCodes) {\n const requestedSet = new Set<string>(chartRequestedCodes);\n\n // Feature layers: band-then-class interleaving (matches continuous\n // mode's draw order from PR #301). All classes for cascade[0] first,\n // then all for cascade[1], etc.\n for (let i = 0; i < chartCascade.length; i++) {\n const B = chartCascade[i];\n const higher = chartCascade.slice(i + 1);\n const isRequested = requestedSet.has(B);\n for (const { featureLayers } of bundles) {\n for (const base of featureLayers) {\n const filter = chartModeFilterForBand(\n base,\n B,\n higher,\n lockedBounds,\n isRequested,\n );\n const variant: StyleLayer = {\n ...base,\n id: `${base.id}-band${B}`,\n filter,\n };\n delete variant.maxzoom;\n layers.push(variant);\n }\n }\n }\n\n // Labels: same band-then-class cascade. Both orientation-cross-band\n // labels (sea-area names, region names) and feature-band-gated\n // labels (soundings, buoy designations) get the cascade — sea-area\n // names from a Coastal cell now render even when the user is in\n // Chart→Harbor, which fixes a longstanding \"no place names offshore\"\n // gap with chart mode.\n for (let i = 0; i < chartCascade.length; i++) {\n const B = chartCascade[i];\n const higher = chartCascade.slice(i + 1);\n const isRequested = requestedSet.has(B);\n for (const { label } of bundles) {\n if (!label) continue;\n const filter = chartModeFilterForBand(\n label,\n B,\n higher,\n lockedBounds,\n isRequested,\n );\n const variant: StyleLayer = {\n ...label,\n id: `${label.id}-band${B}`,\n filter,\n };\n delete variant.maxzoom;\n labelLayers.push(variant);\n }\n }\n\n layers.push(...labelLayers);\n // Fall through to return statement below.\n } else {\n // CONTINUOUS MODE: emit by BAND first, then by class. So the order is\n // SEAARE-1, DEPARE-1, ..., RESARE-1, ..., ← all band-1 fills\n // SEAARE-2, DEPARE-2, ..., RESARE-2, ..., ← all band-2 fills (paint over band-1)\n // ...\n // SEAARE-6, DEPARE-6, ..., RESARE-6, ..., ← all band-6 fills (top of stack)\n //\n // Within a band, intra-class S-52 z-order (depth → land → hazards →\n // regulated areas → infrastructure) is preserved. Across bands the\n // higher-numbered (= more detailed) band always paints last, so a\n // band-6 LNDARE wins on top of a band-1 RESARE. This kills the\n // \"broader-scope class painted on top of harbor detail\" pollution\n // the user reported on Boston Harbor at z11+: under the previous\n // class-then-band order, a band-1 RESARE drew on top of a band-6\n // LNDARE because each class was emitted as a contiguous block.\n //\n // Labels are still grouped at the end (rendered on top of fills).\n // Within labels, orientation-cross-band labels emit once with the\n // dominance filter; feature-band-gated labels fan by band, again\n // band-then-class.\n for (const code of BAND_DRAW_ORDER) {\n for (const { featureLayers } of bundles) {\n for (const base of featureLayers) {\n layers.push(...makeBandVariants(base, code));\n }\n }\n }\n\n // Labels.\n // - `orientation-cross-band` (sea-area names, land regions, cities):\n // emit ONCE without a band fan so the broader-scope label persists\n // across zooms even if the underlying polygon lives only in a\n // coarser band. The dominance filter still drops duplicates where\n // the same OBJNAM exists in multiple bands.\n // - `feature-band-gated` (soundings, depth contours, buoy designations):\n // fan by band so dense per-feature labels don't duplicate across\n // bands. Same band-then-class interleaving as above.\n //\n // Orientation labels go FIRST among label layers (drawn underneath\n // feature labels) so dense band-6 sounding/buoy labels win collision\n // arbitration over broader sea-area names. Then feature-band-gated\n // labels fan by band like fills.\n for (const { objectClass, label } of bundles) {\n if (!label) continue;\n if (getLabelBehavior(objectClass) === \"orientation-cross-band\") {\n labelLayers.push(...fanOrientationLabelByDominator(label));\n }\n }\n for (const code of BAND_DRAW_ORDER) {\n for (const { objectClass, label } of bundles) {\n if (!label) continue;\n if (getLabelBehavior(objectClass) === \"orientation-cross-band\") continue;\n // makeBandVariants returns 1..N variants per band (one not-dominated +\n // per-D dom variants). Apply the Harbor-band collision discipline to\n // each variant independently so all variants of high-density nav-aid\n // labels at band 5/6 get the same allow-overlap=false / sort-key\n // treatment.\n for (const variant of makeBandVariants(label, code)) {\n labelLayers.push(applyHarborLabelCollisionDiscipline(variant, objectClass, code));\n }\n }\n }\n\n layers.push(...labelLayers);\n }\n\n return {\n version: 8,\n name: `CHRT S-52 ${PALETTE_NAMES[palette]}${opts.chartMode ? ` — chart:${opts.chartMode.band}` : \"\"}`,\n metadata: {\n \"chrt:s52-edition\": \"4.0\",\n \"chrt:color-table\": palette,\n \"chrt:generated-at\": new Date().toISOString(),\n \"chrt:layer-count\": layers.length,\n \"chrt:render-mode\": opts.chartMode ? `chart:${opts.chartMode.band}` : \"continuous\",\n \"chrt:description\": \"IHO S-52 portrayal rules for Electronic Navigational Charts (ENCs). Generated from the CHRT atlas engine.\",\n },\n sources,\n // TODO(Phase 9): the superadmin style-generator emits a reference JSON\n // intended for external upload to Mapbox Studio. That flow is vestigial —\n // we're decommissioning Mapbox MTS. When the page is repurposed to\n // generate a MapLibre-native style for self-hosted consumers, wire the\n // `sprite` field back in against a CHRT-hosted sprite route (see\n // `.chrt/` follow-ups). Runtime maps load S-52 symbols via\n // `loadS52SymbolImages()` — no sprite fetch happens at runtime.\n glyphs: \"https://fonts.openmaptiles.org/{fontstack}/{range}.pbf\",\n layers,\n };\n}\n\nexport function generateStyleJSON(\n palette: ColorTableName = \"DAY\",\n opts: StyleGeneratorOptions = {},\n): string {\n return JSON.stringify(generateStyle(palette, opts), null, 2);\n}\n\n/** Get summary stats about the generated style */\nexport function getStyleStats(style: MapboxStyle): {\n totalLayers: number;\n fillLayers: number;\n lineLayers: number;\n symbolLayers: number;\n circleLayers: number;\n sources: number;\n objectClasses: Set<string>;\n} {\n const objectClasses = new Set<string>();\n let fillLayers = 0;\n let lineLayers = 0;\n let symbolLayers = 0;\n let circleLayers = 0;\n\n for (const layer of style.layers) {\n const oc = (layer.metadata as Record<string, unknown>)?.[\"s52:objectClass\"];\n if (typeof oc === \"string\") objectClasses.add(oc);\n\n switch (layer.type) {\n case \"fill\": fillLayers++; break;\n case \"line\": lineLayers++; break;\n case \"symbol\": symbolLayers++; break;\n case \"circle\": circleLayers++; break;\n }\n }\n\n return {\n totalLayers: style.layers.length,\n fillLayers,\n lineLayers,\n symbolLayers,\n circleLayers,\n sources: Object.keys(style.sources).length,\n objectClasses,\n };\n}\n"],"mappings":"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C9C,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EAEP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EAEP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EAEP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EAEP,OAAO;AAAA,EACP,OAAO;AAAA,EAEP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EAEP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EAEP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EAEP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EAEP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EAEP,OAAO;AAAA,EAEP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AACT;AAKO,IAAM,YAAoC;AAAA,EAC/C,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EAEP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EAEP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EAEP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EAEP,OAAO;AAAA,EACP,OAAO;AAAA,EAEP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EAEP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EAEP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EAEP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EAEP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EAEP,OAAO;AAAA,EAEP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AAAA,EACP,OAAO;AACT;AAGO,IAAM,aAAa;AAE1B,IAAM,eAA+D;AAAA,EACnE,KAAK;AAAA,EACL,MAAM;AAAA,EACN,OAAO;AACT;AAGO,SAAS,cAAc,MAA8C;AAC1E,SAAO,aAAa,IAAI;AAC1B;AAGO,SAAS,aAAa,OAAe,QAAwB,OAAe;AACjF,QAAM,IAAI,aAAa,KAAK;AAC5B,SAAO,EAAE,KAAK,MAAM,UAAU,UAAU,YAAY;AACtD;;;AC9RO,IAAM,aAA0C;AAAA;AAAA,EAErD,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAc,UAAU;AAAA,IACrD,iBAAiB;AAAA,IAAQ,SAAS;AAAA,IAClC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,gBAAgB,IAAI,EAAE;AAAA,IAC7E,gBAAgB;AAAA,IAAM,uBAAuB,CAAC,UAAU,QAAQ;AAAA,IAChE,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAiB,UAAU;AAAA,IACxD,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,cAAc,IAAI,EAAE;AAAA,IAC3E,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAY,UAAU;AAAA,IACnD,iBAAiB;AAAA,IAAQ,SAAS;AAAA;AAAA,IAElC,OAAO,EAAE,MAAM,UAAU,OAAO,EAAE,gBAAgB,SAAS,iBAAiB,GAAG,kBAAkB,GAAG,uBAAuB,EAAE,EAAE;AAAA,IAC/H,cAAc;AAAA,IAAO,QAAQ;AAAA,IAC7B,aAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAgB,UAAU;AAAA,IACvD,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,gBAAgB,IAAI,EAAE;AAAA,IAC7E,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAc,UAAU;AAAA,IACrD,iBAAiB;AAAA,IAAS,SAAS;AAAA,IACnC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,gBAAgB,KAAK,EAAE;AAAA,IAC9E,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA;AAAA,EAGA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAa,UAAU;AAAA,IACpD,iBAAiB;AAAA,IAAQ,SAAS;AAAA,IAClC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,gBAAgB,IAAI,EAAE;AAAA,IAC7E,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAa,UAAU;AAAA,IACpD,iBAAiB;AAAA,IAAQ,SAAS;AAAA,IAClC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,cAAc,IAAI,EAAE;AAAA,IAC3E,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAA0B,UAAU;AAAA,IACjE,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,cAAc,EAAE,EAAE;AAAA,IACzE,gBAAgB;AAAA,IAAM,uBAAuB,CAAC,QAAQ;AAAA,IACtD,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAe,UAAU;AAAA,IACtD,iBAAiB;AAAA,IAAS,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMnC,OAAO,EAAE,MAAM,UAAU,OAAO,EAAE,gBAAgB,SAAS,iBAAiB,GAAG,kBAAkB,EAAE,EAAE;AAAA,IACrG,cAAc;AAAA,IAAO,QAAQ;AAAA,IAC7B,aAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,IAKN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAkB,UAAU;AAAA,IACzD,iBAAiB;AAAA,IAAS,SAAS;AAAA,IACnC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,gBAAgB,IAAI,EAAE;AAAA,IAC7E,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAiB,UAAU;AAAA,IACxD,iBAAiB;AAAA,IAAY,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,IAKtC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,gBAAgB,KAAK,EAAE;AAAA,IAC9E,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAY,UAAU;AAAA,IACnD,iBAAiB;AAAA,IAAS,SAAS;AAAA,IACnC,OAAO,EAAE,MAAM,UAAU,OAAO,EAAE,gBAAgB,SAAS,iBAAiB,GAAG,uBAAuB,EAAE,EAAE;AAAA,IAC1G,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAuB,UAAU;AAAA,IAC9D,iBAAiB;AAAA,IAAS,SAAS;AAAA,IACnC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,gBAAgB,IAAI,EAAE;AAAA,IAC7E,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAQ,UAAU;AAAA,IAC/C,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,gBAAgB,IAAI,EAAE;AAAA,IAC7E,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAS,UAAU;AAAA,IAChD,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,gBAAgB,IAAI,EAAE;AAAA,IAC7E,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAQ,UAAU;AAAA,IAC/C,iBAAiB;AAAA,IAAS,SAAS;AAAA,IACnC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,cAAc,EAAE,EAAE;AAAA,IACzE,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAW,UAAU;AAAA,IAClD,iBAAiB;AAAA,IAAS,SAAS;AAAA,IACnC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,cAAc,KAAK,kBAAkB,CAAC,GAAG,CAAC,EAAE,EAAE;AAAA,IACrG,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAS,UAAU;AAAA,IAChD,iBAAiB;AAAA,IAAS,SAAS;AAAA,IACnC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,cAAc,EAAE,EAAE;AAAA,IACzE,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAU,UAAU;AAAA,IACjD,iBAAiB;AAAA,IAAS,SAAS;AAAA,IACnC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,cAAc,GAAG,kBAAkB,CAAC,GAAG,CAAC,EAAE,EAAE;AAAA,IACnG,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA;AAAA,EAGA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAA2B,UAAU;AAAA,IAClE,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,UAAU,OAAO,CAAC,GAAG,QAAQ,EAAE,aAAa,KAAK,sBAAsB,KAAK,GAAG,WAAW,WAAW;AAAA,IACpH,gBAAgB;AAAA,IAAM,uBAAuB,CAAC,UAAU,QAAQ;AAAA,IAChE,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAyB,UAAU;AAAA,IAChE,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,UAAU,OAAO,CAAC,GAAG,QAAQ,EAAE,aAAa,KAAK,sBAAsB,KAAK,GAAG,WAAW,WAAW;AAAA,IACpH,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAkB,UAAU;AAAA,IACzD,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,UAAU,OAAO,CAAC,GAAG,QAAQ,EAAE,aAAa,KAAK,sBAAsB,KAAK,GAAG,WAAW,WAAW;AAAA,IACpH,gBAAgB;AAAA,IAAM,uBAAuB,CAAC,QAAQ;AAAA,IACtD,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAyB,UAAU;AAAA,IAChE,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,UAAU,OAAO,CAAC,GAAG,QAAQ,EAAE,aAAa,KAAK,sBAAsB,KAAK,GAAG,WAAW,WAAW;AAAA,IACpH,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAoB,UAAU;AAAA,IAC3D,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,UAAU,OAAO,CAAC,GAAG,QAAQ,EAAE,aAAa,KAAK,sBAAsB,KAAK,GAAG,WAAW,WAAW;AAAA,IACpH,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAsB,UAAU;AAAA,IAC7D,iBAAiB;AAAA,IAAS,SAAS;AAAA,IACnC,OAAO,EAAE,MAAM,UAAU,OAAO,CAAC,GAAG,QAAQ,EAAE,aAAa,KAAK,sBAAsB,KAAK,GAAG,WAAW,WAAW;AAAA,IACpH,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA;AAAA,EAGA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAmB,UAAU;AAAA,IAC1D,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,UAAU,OAAO,CAAC,GAAG,QAAQ,EAAE,aAAa,KAAK,sBAAsB,KAAK,GAAG,WAAW,WAAW;AAAA,IACpH,gBAAgB;AAAA,IAAM,uBAAuB,CAAC,UAAU,QAAQ;AAAA,IAChE,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAA2B,UAAU;AAAA,IAClE,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,UAAU,OAAO,CAAC,GAAG,QAAQ,EAAE,aAAa,KAAK,sBAAsB,KAAK,GAAG,WAAW,WAAW;AAAA,IACpH,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAoB,UAAU;AAAA,IAC3D,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,UAAU,OAAO,CAAC,GAAG,QAAQ,EAAE,aAAa,KAAK,sBAAsB,KAAK,GAAG,WAAW,WAAW;AAAA,IACpH,gBAAgB;AAAA,IAAM,uBAAuB,CAAC,QAAQ;AAAA,IACtD,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAA2B,UAAU;AAAA,IAClE,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,UAAU,OAAO,CAAC,GAAG,QAAQ,EAAE,aAAa,KAAK,sBAAsB,KAAK,GAAG,WAAW,WAAW;AAAA,IACpH,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAsB,UAAU;AAAA,IAC7D,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,UAAU,OAAO,CAAC,GAAG,QAAQ,EAAE,aAAa,KAAK,sBAAsB,KAAK,GAAG,WAAW,WAAW;AAAA,IACpH,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA;AAAA,EAGA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAS,UAAU;AAAA,IAChD,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,UAAU,OAAO,CAAC,GAAG,QAAQ,EAAE,aAAa,KAAK,sBAAsB,KAAK,GAAG,WAAW,WAAW;AAAA,IACpH,gBAAgB;AAAA,IAAM,uBAAuB,CAAC,QAAQ;AAAA,IACtD,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA;AAAA,EAGA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAW,UAAU;AAAA,IAClD,iBAAiB;AAAA,IAAS,SAAS;AAAA,IACnC,OAAO,EAAE,MAAM,UAAU,OAAO,CAAC,GAAG,QAAQ,EAAE,aAAa,KAAK,sBAAsB,KAAK,GAAG,WAAW,WAAW;AAAA,IACpH,gBAAgB;AAAA,IAAM,uBAAuB,CAAC,UAAU,QAAQ;AAAA,IAChE,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAc,UAAU;AAAA,IACrD,iBAAiB;AAAA,IAAS,SAAS;AAAA,IACnC,OAAO,EAAE,MAAM,UAAU,OAAO,CAAC,GAAG,QAAQ,EAAE,aAAa,KAAK,sBAAsB,KAAK,GAAG,WAAW,WAAW;AAAA,IACpH,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAe,UAAU;AAAA,IACtD,iBAAiB;AAAA,IAAS,SAAS;AAAA,IACnC,OAAO,EAAE,MAAM,UAAU,OAAO,CAAC,GAAG,QAAQ,EAAE,aAAa,KAAK,sBAAsB,KAAK,GAAG,WAAW,WAAW;AAAA,IACpH,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAA4B,UAAU;AAAA,IACnE,iBAAiB;AAAA,IAAS,SAAS;AAAA,IACnC,OAAO,EAAE,MAAM,UAAU,OAAO,CAAC,GAAG,QAAQ,EAAE,aAAa,KAAK,sBAAsB,KAAK,GAAG,WAAW,WAAW;AAAA,IACpH,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAmB,UAAU;AAAA,IAC1D,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,cAAc,GAAG,kBAAkB,CAAC,GAAG,CAAC,EAAE,EAAE;AAAA,IACnG,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAkB,UAAU;AAAA,IACzD,iBAAiB;AAAA,IAAS,SAAS;AAAA,IACnC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,cAAc,IAAI,EAAE;AAAA,IAC3E,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA;AAAA,EAGA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAe,UAAU;AAAA,IACtD,iBAAiB;AAAA,IAAY,SAAS;AAAA;AAAA;AAAA;AAAA,IAItC,OAAO,EAAE,MAAM,UAAU,OAAO,CAAC,GAAG,QAAQ,EAAE,aAAa,CAAC,eAAe,CAAC,QAAQ,GAAG,CAAC,MAAM,GAAG,OAAO,GAAG,IAAI,KAAK,IAAI,KAAK,IAAI,GAAG,GAAG,sBAAsB,KAAK,GAAG,WAAW,WAAW;AAAA,IAC3L,gBAAgB;AAAA,IAAM,uBAAuB,CAAC,UAAU,QAAQ;AAAA,IAChE,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAmB,UAAU;AAAA,IAC1D,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,UAAU,OAAO,CAAC,GAAG,QAAQ,EAAE,aAAa,CAAC,eAAe,CAAC,QAAQ,GAAG,CAAC,MAAM,GAAG,OAAO,GAAG,IAAI,KAAK,IAAI,KAAK,IAAI,GAAG,GAAG,sBAAsB,KAAK,GAAG,WAAW,WAAW;AAAA,IAC3L,gBAAgB;AAAA,IAAM,uBAAuB,CAAC,UAAU,QAAQ;AAAA,IAChE,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAS,UAAU;AAAA,IAChD,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,UAAU,OAAO,CAAC,GAAG,QAAQ,EAAE,aAAa,KAAK,sBAAsB,KAAK,GAAG,WAAW,WAAW;AAAA,IACpH,gBAAgB;AAAA,IAAM,uBAAuB,CAAC,UAAU,UAAU,QAAQ;AAAA,IAC1E,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IASN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAoB,UAAU;AAAA,IAC3D,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,UAAU,OAAO,CAAC,GAAG,QAAQ,EAAE,aAAa,KAAK,sBAAsB,KAAK,GAAG,WAAW,WAAW;AAAA,IACpH,gBAAgB;AAAA,IAAM,uBAAuB,CAAC,QAAQ;AAAA,IACtD,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA,IAKN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAoB,UAAU;AAAA,IAC3D,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,gBAAgB,KAAK,EAAE;AAAA,IAC9E,gBAAgB;AAAA,IAAM,uBAAuB,CAAC,QAAQ;AAAA,IACtD,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAe,UAAU;AAAA,IACtD,iBAAiB;AAAA,IAAS,SAAS;AAAA,IACnC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,gBAAgB,KAAK,EAAE;AAAA,IAC9E,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA;AAAA;AAAA;AAAA,IAIN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAe,UAAU;AAAA,IACtD,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,gBAAgB,KAAK,EAAE;AAAA,IAC9E,gBAAgB;AAAA,IAAM,uBAAuB,CAAC,UAAU,QAAQ;AAAA,IAChE,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA;AAAA,EAGA,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAkB,UAAU;AAAA,IACzD,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,gBAAgB,IAAK,EAAE;AAAA,IAC9E,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAmB,UAAU;AAAA,IAC1D,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,QACL,cAAc;AAAA,QACd,cAAc;AAAA,QACd,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAaN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAgB,UAAU;AAAA,IACvD,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,QACL,cAAc;AAAA,QACd,cAAc;AAAA,QACd,kBAAkB,CAAC,GAAG,CAAC;AAAA,QACvB,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAW,UAAU;AAAA,IAClD,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,gBAAgB,KAAK,EAAE;AAAA,IAC9E,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAkB,UAAU;AAAA,IACzD,iBAAiB;AAAA,IAAS,SAAS;AAAA,IACnC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,gBAAgB,KAAK,EAAE;AAAA,IAC9E,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA;AAAA;AAAA;AAAA,IAIN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAiB,UAAU;AAAA,IACxD,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,gBAAgB,KAAK,EAAE;AAAA,IAC9E,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAkB,UAAU;AAAA,IACzD,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,gBAAgB,KAAK,EAAE;AAAA,IAC9E,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAgB,UAAU;AAAA,IACvD,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,cAAc,GAAG,kBAAkB,CAAC,GAAG,CAAC,EAAE,EAAE;AAAA,IACnG,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA;AAAA;AAAA;AAAA,IAIN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAwB,UAAU;AAAA,IAC/D,iBAAiB;AAAA,IAAS,SAAS;AAAA,IACnC,OAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,QACL,cAAc;AAAA,QACd,cAAc;AAAA,QACd,kBAAkB,CAAC,GAAG,CAAC;AAAA,QACvB,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA;AAAA;AAAA,IAGN,aAAa;AAAA,IAAU,MAAM;AAAA,IAA0B,UAAU;AAAA,IACjE,iBAAiB;AAAA,IAAS,SAAS;AAAA,IACnC,OAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO;AAAA,QACL,cAAc;AAAA,QACd,cAAc;AAAA,QACd,kBAAkB,CAAC,GAAG,CAAC;AAAA,QACvB,gBAAgB;AAAA,MAClB;AAAA,IACF;AAAA,IACA,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA;AAAA,EAGA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAU,UAAU;AAAA,IACjD,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,cAAc,EAAE,EAAE;AAAA,IACzE,cAAc;AAAA,IAAO,QAAQ;AAAA,IAC7B,gBAAgB;AAAA,IAAM,uBAAuB,CAAC,UAAU,QAAQ;AAAA,EAClE;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAA0B,UAAU;AAAA,IACjE,iBAAiB;AAAA,IAAY,SAAS;AAAA;AAAA;AAAA,IAGtC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,gBAAgB,IAAI,EAAE;AAAA,IAC7E,gBAAgB;AAAA,IAAM,uBAAuB,CAAC,UAAU,QAAQ;AAAA,IAChE,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAmB,UAAU;AAAA,IAC1D,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,cAAc,KAAK,kBAAkB,CAAC,GAAG,CAAC,EAAE,EAAE;AAAA,IACrG,gBAAgB;AAAA,IAAM,uBAAuB,CAAC,UAAU,QAAQ;AAAA,IAChE,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAc,UAAU;AAAA,IACrD,iBAAiB;AAAA,IAAY,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA,IAKtC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,gBAAgB,MAAM,gBAAgB,WAAW,EAAE;AAAA,IAC1G,gBAAgB;AAAA,IAAM,uBAAuB,CAAC,UAAU,QAAQ;AAAA,IAChE,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA,EAIA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAsB,UAAU;AAAA,IAC7D,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,cAAc,KAAK,kBAAkB,CAAC,GAAG,CAAC,EAAE,EAAE;AAAA,IACrG,gBAAgB;AAAA,IAAM,uBAAuB,CAAC,UAAU,QAAQ;AAAA,IAChE,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAqB,UAAU;AAAA,IAC5D,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,cAAc,EAAI,EAAE;AAAA,IAC3E,gBAAgB;AAAA,IAAM,uBAAuB,CAAC,UAAU,UAAU,QAAQ;AAAA,IAC1E,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAiB,UAAU;AAAA,IACxD,iBAAiB;AAAA,IAAY,SAAS;AAAA;AAAA;AAAA,IAGtC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,gBAAgB,MAAM,gBAAgB,WAAW,EAAE;AAAA,IAC1G,gBAAgB;AAAA,IAAM,uBAAuB,CAAC,UAAU,QAAQ;AAAA,IAChE,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAoB,UAAU;AAAA,IAC3D,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,UAAU,OAAO,CAAC,GAAG,QAAQ,EAAE,aAAa,KAAK,sBAAsB,KAAK,GAAG,WAAW,WAAW;AAAA,IACpH,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAW,UAAU;AAAA,IAClD,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,gBAAgB,IAAI,EAAE;AAAA,IAC7E,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAoB,UAAU;AAAA,IAC3D,iBAAiB;AAAA,IAAS,SAAS;AAAA,IACnC,OAAO,EAAE,MAAM,UAAU,OAAO,EAAE,gBAAgB,SAAS,iBAAiB,GAAG,uBAAuB,SAAS,uBAAuB,IAAI,EAAE;AAAA,IAC5I,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAqB,UAAU;AAAA,IAC5D,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,UAAU,OAAO,CAAC,GAAG,QAAQ,EAAE,aAAa,KAAK,sBAAsB,KAAK,GAAG,WAAW,WAAW;AAAA,IACpH,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAQ,UAAU;AAAA,IAC/C,iBAAiB;AAAA,IAAS,SAAS;AAAA,IACnC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,gBAAgB,IAAI,EAAE;AAAA,IAC7E,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAY,UAAU;AAAA,IACnD,iBAAiB;AAAA,IAAS,SAAS;AAAA,IACnC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,gBAAgB,IAAI,EAAE;AAAA,IAC7E,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAiB,UAAU;AAAA,IACxD,iBAAiB;AAAA,IAAS,SAAS;AAAA,IACnC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,gBAAgB,KAAK,EAAE;AAAA,IAC9E,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAQ,UAAU;AAAA,IAC/C,iBAAiB;AAAA,IAAS,SAAS;AAAA,IACnC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,cAAc,IAAI,EAAE;AAAA,IAC3E,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAe,UAAU;AAAA,IACtD,iBAAiB;AAAA,IAAS,SAAS;AAAA,IACnC,OAAO,EAAE,MAAM,UAAU,OAAO,CAAC,GAAG,QAAQ,EAAE,aAAa,KAAK,sBAAsB,KAAK,GAAG,WAAW,WAAW;AAAA,IACpH,gBAAgB;AAAA,IAAM,uBAAuB,CAAC,UAAU,QAAQ;AAAA,IAChE,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAY,UAAU;AAAA,IACnD,iBAAiB;AAAA,IAAS,SAAS;AAAA,IACnC,OAAO,EAAE,MAAM,UAAU,OAAO,CAAC,GAAG,QAAQ,EAAE,aAAa,KAAK,sBAAsB,KAAK,GAAG,WAAW,WAAW;AAAA,IACpH,gBAAgB;AAAA,IAAM,uBAAuB,CAAC,QAAQ;AAAA,IACtD,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA;AAAA,EAGA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAW,UAAU;AAAA,IAClD,iBAAiB;AAAA,IAAS,SAAS;AAAA,IACnC,OAAO,EAAE,MAAM,UAAU,OAAO,CAAC,GAAG,QAAQ,EAAE,aAAa,KAAK,sBAAsB,KAAK,GAAG,WAAW,WAAW;AAAA,IACpH,gBAAgB;AAAA,IAAM,uBAAuB,CAAC,QAAQ;AAAA,IACtD,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA;AAAA,EAGA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAgB,UAAU;AAAA,IACvD,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,UAAU,OAAO,CAAC,GAAG,QAAQ,EAAE,aAAa,KAAK,sBAAsB,KAAK,GAAG,WAAW,WAAW;AAAA,IACpH,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAe,UAAU;AAAA,IACtD,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,UAAU,OAAO,CAAC,GAAG,QAAQ,EAAE,aAAa,KAAK,sBAAsB,KAAK,GAAG,WAAW,WAAW;AAAA,IACpH,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA;AAAA,EAGA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAkB,UAAU;AAAA,IACzD,iBAAiB;AAAA,IAAS,SAAS;AAAA,IACnC,OAAO,EAAE,MAAM,UAAU,OAAO,CAAC,GAAG,QAAQ,EAAE,aAAa,KAAK,sBAAsB,KAAK,GAAG,WAAW,WAAW;AAAA,IACpH,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAwB,UAAU;AAAA,IAC/D,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,UAAU,OAAO,CAAC,GAAG,QAAQ,EAAE,aAAa,KAAK,sBAAsB,KAAK,GAAG,WAAW,WAAW;AAAA,IACpH,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAS,UAAU;AAAA,IAChD,iBAAiB;AAAA,IAAS,SAAS;AAAA,IACnC,OAAO,EAAE,MAAM,UAAU,OAAO,CAAC,GAAG,QAAQ,EAAE,aAAa,KAAK,sBAAsB,KAAK,GAAG,WAAW,WAAW;AAAA,IACpH,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAiB,UAAU;AAAA,IACxD,iBAAiB;AAAA,IAAS,SAAS;AAAA,IACnC,OAAO,EAAE,MAAM,UAAU,OAAO,CAAC,GAAG,QAAQ,EAAE,aAAa,KAAK,sBAAsB,KAAK,GAAG,WAAW,WAAW;AAAA,IACpH,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAiB,UAAU;AAAA,IACxD,iBAAiB;AAAA,IAAS,SAAS;AAAA,IACnC,OAAO,EAAE,MAAM,UAAU,OAAO,EAAE,gBAAgB,SAAS,iBAAiB,GAAG,uBAAuB,EAAE,EAAE;AAAA,IAC1G,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAwB,UAAU;AAAA,IAC/D,iBAAiB;AAAA,IAAS,SAAS;AAAA,IACnC,OAAO,EAAE,MAAM,UAAU,OAAO,EAAE,gBAAgB,SAAS,iBAAiB,GAAG,uBAAuB,SAAS,uBAAuB,IAAI,EAAE;AAAA,IAC5I,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAkB,UAAU;AAAA,IACzD,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,cAAc,EAAI,EAAE;AAAA,IAC3E,gBAAgB;AAAA,IAAM,uBAAuB,CAAC,UAAU,UAAU,QAAQ;AAAA,IAC1E,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA;AAAA,EAGA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAe,UAAU;AAAA,IACtD,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,cAAc,GAAG,kBAAkB,CAAC,GAAG,CAAC,EAAE,EAAE;AAAA,IACnG,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAqB,UAAU;AAAA,IAC5D,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,cAAc,KAAK,kBAAkB,CAAC,GAAG,CAAC,EAAE,EAAE;AAAA,IACrG,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA;AAAA,EAGA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAc,UAAU;AAAA,IACrD,iBAAiB;AAAA,IAAS,SAAS;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMnC,OAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO,EAAE,cAAc,SAAS,gBAAgB,KAAK,gBAAgB,WAAW;AAAA,IAClF;AAAA,IACA,gBAAgB;AAAA,IAAM,uBAAuB,CAAC,QAAQ;AAAA,IACtD,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAaN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAY,UAAU;AAAA,IACnD,iBAAiB;AAAA,IAAS,SAAS;AAAA,IACnC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,gBAAgB,EAAI,EAAE;AAAA,IAC7E,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAuB,UAAU;AAAA,IAC9D,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,gBAAgB,KAAK,EAAE;AAAA,IAC9E,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAgB,UAAU;AAAA,IACvD,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,UAAU,OAAO,CAAC,GAAG,QAAQ,EAAE,aAAa,KAAK,sBAAsB,KAAK,GAAG,WAAW,WAAW;AAAA,IACpH,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAS,UAAU;AAAA,IAChD,iBAAiB;AAAA,IAAS,SAAS;AAAA,IACnC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,cAAc,IAAI,EAAE;AAAA,IAC3E,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAc,UAAU;AAAA,IACrD,iBAAiB;AAAA,IAAS,SAAS;AAAA,IACnC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,cAAc,IAAI,EAAE;AAAA,IAC3E,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAwB,UAAU;AAAA,IAC/D,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,gBAAgB,KAAK,EAAE;AAAA,IAC9E,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAsB,UAAU;AAAA,IAC7D,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,gBAAgB,KAAK,EAAE;AAAA,IAC9E,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAUN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAmB,UAAU;AAAA,IAC1D,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,cAAc,KAAK,kBAAkB,CAAC,GAAG,CAAC,EAAE,EAAE;AAAA,IACrG,gBAAgB;AAAA,IAAM,uBAAuB,CAAC,UAAU,QAAQ;AAAA,IAChE,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAA4B,UAAU;AAAA,IACnE,iBAAiB;AAAA,IAAS,SAAS;AAAA,IACnC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,gBAAgB,IAAI,EAAE;AAAA,IAC7E,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAY,UAAU;AAAA,IACnD,iBAAiB;AAAA,IAAS,SAAS;AAAA,IACnC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,gBAAgB,KAAK,EAAE;AAAA,IAC9E,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAW,UAAU;AAAA,IAClD,iBAAiB;AAAA,IAAS,SAAS;AAAA,IACnC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,gBAAgB,KAAK,EAAE;AAAA,IAC9E,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAMN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAU,UAAU;AAAA,IACjD,iBAAiB;AAAA,IAAS,SAAS;AAAA,IACnC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,gBAAgB,IAAI,EAAE;AAAA,IAC7E,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAO,UAAU;AAAA,IAC9C,iBAAiB;AAAA,IAAY,SAAS;AAAA,IACtC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,cAAc,EAAE,EAAE;AAAA,IACzE,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAsB,UAAU;AAAA,IAC7D,iBAAiB;AAAA,IAAS,SAAS;AAAA,IACnC,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,cAAc,KAAK,gBAAgB,KAAK,kBAAkB,CAAC,GAAG,CAAC,EAAE,EAAE;AAAA,IAC1H,gBAAgB;AAAA,IAAM,uBAAuB,CAAC,UAAU,UAAU,QAAQ;AAAA,IAC1E,cAAc;AAAA,IAAO,QAAQ;AAAA,EAC/B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAY,UAAU;AAAA,IACnD,iBAAiB;AAAA,IACjB,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,cAAc,KAAK,gBAAgB,IAAI,EAAE;AAAA,IAChG,aAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAwB,UAAU;AAAA,IAC/D,iBAAiB;AAAA,IACjB,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,gBAAgB,EAAE,EAAE;AAAA,IAC3E,aAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAuB,UAAU;AAAA,IAC9D,iBAAiB;AAAA,IACjB,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,gBAAgB,EAAE,EAAE;AAAA,IAC3E,aAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAmB,UAAU;AAAA,IAC1D,iBAAiB;AAAA,IACjB,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,gBAAgB,EAAE,EAAE;AAAA,IAC3E,aAAa;AAAA,EACf;AAAA,EACA,QAAQ;AAAA,IACN,aAAa;AAAA,IAAU,MAAM;AAAA,IAAsB,UAAU;AAAA,IAC7D,iBAAiB;AAAA,IACjB,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,gBAAgB,EAAE,EAAE;AAAA,IAC3E,aAAa;AAAA,EACf;AAAA,EACA,MAAM;AAAA,IACJ,aAAa;AAAA,IAAQ,MAAM;AAAA,IAAc,UAAU;AAAA,IACnD,iBAAiB;AAAA,IACjB,OAAO,EAAE,MAAM,QAAQ,OAAO,EAAE,cAAc,SAAS,gBAAgB,EAAE,EAAE;AAAA,IAC3E,aAAa;AAAA,EACf;AACF;;;AC12BO,IAAM,iBAA2B;AAAA;AAAA,EAEtC;AAAA,EAAQ;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWhD;AAAA,EAAU;AAAA;AAAA,EAEV;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA;AAAA,EAE9B;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA;AAAA,EAEhF;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA;AAAA,EAE9B;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EACtE;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAClD;AAAA,EAAU;AAAA;AAAA,EAEV;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA;AAAA,EAE5D;AAAA,EAAU;AAAA,EAAU;AAAA;AAAA,EAEpB;AAAA,EAAU;AAAA;AAAA;AAAA;AAAA;AAAA,EAKV;AAAA;AAAA,EAEA;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAC5D;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA;AAAA,EAE5D;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAC5D;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA;AAAA,EAElD;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAC5D;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EACxC;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAClD;AAAA,EAAU;AAAA,EAAU;AAAA;AAAA,EAEpB;AAAA,EAAU;AACZ;AAGO,SAAS,gBAAgB,WAA2B;AACzD,QAAM,MAAM,eAAe,QAAQ,SAAS;AAE5C,SAAO,OAAO,IAAI,MAAM,eAAe,SAAS;AAClD;;;ACjDO,SAAS,YAAY,OAAgC,KAAqB,OAAe;AAC9F,QAAM,SAAS,OAAO,MAAM,UAAU,MAAM,UAAU,EAAE;AACxD,QAAM,SAAS,OAAO,MAAM,UAAU,MAAM,UAAU,MAAM;AAE5D,MAAI,SAAS,KAAK,UAAU,EAAG,QAAO,aAAa,SAAS,EAAE;AAC9D,MAAI,SAAS,EAAI,QAAO,aAAa,SAAS,EAAE;AAChD,MAAI,SAAS,EAAI,QAAO,aAAa,SAAS,EAAE;AAChD,MAAI,SAAS,GAAI,QAAO,aAAa,SAAS,EAAE;AAChD,SAAO,aAAa,SAAS,EAAE;AACjC;AAEO,SAAS,qBAAqB,KAAqB,OAAkB;AAC1E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MAAC;AAAA,MAAO,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,QAAQ,GAAG,CAAC,OAAO,QAAQ,GAAG,EAAE,GAAG,CAAC;AAAA,MAC/D,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,QAAQ,GAAG,CAAC,OAAO,QAAQ,GAAG,CAAC,GAAG,CAAC;AAAA,IAAC;AAAA,IACxE,aAAa,SAAS,EAAE;AAAA,IACxB,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,QAAQ,GAAG,CAAC,OAAO,QAAQ,GAAG,EAAE,GAAG,CAAC;AAAA,IAC/D,aAAa,SAAS,EAAE;AAAA,IACxB,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,QAAQ,GAAG,CAAC,OAAO,QAAQ,GAAG,EAAE,GAAG,CAAC;AAAA,IAC/D,aAAa,SAAS,EAAE;AAAA,IACxB,CAAC,KAAK,CAAC,YAAY,CAAC,OAAO,QAAQ,GAAG,CAAC,OAAO,QAAQ,GAAG,EAAE,GAAG,EAAE;AAAA,IAChE,aAAa,SAAS,EAAE;AAAA,IACxB,aAAa,SAAS,EAAE;AAAA,EAC1B;AACF;AAqBO,SAAS,eACd,OACA,UACW;AAGX,QAAM,YAAY,CAAC,aAAa,CAAC,YAAY,CAAC,OAAO,QAAQ,GAAG,CAAC,OAAO,QAAQ,GAAG,EAAE,CAAC;AACtF,QAAM,OAAkB,CAAC,MAAM;AAG/B,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO;AACjC,SAAK,KAAK,CAAC,MAAM,CAAC,YAAY,IAAI,IAAI,KAAK,SAAS,GAAG,CAAC,GAAG,KAAK;AAAA,EAClE;AAEA,aAAW,CAAC,MAAM,KAAK,KAAK,OAAO;AACjC,SAAK,KAAK,CAAC,MAAM,WAAW,IAAI,GAAG,KAAK;AAAA,EAC1C;AACA,OAAK,KAAK,QAAQ;AAClB,SAAO;AACT;AAGO,SAAS,WAAW,OAAgC,KAAqB,OAAe;AAE7F,QAAM,MAAM,MAAM,UAAU,MAAM;AAClC,QAAM,OAAO,MAAM,QAAQ,GAAG,IAC1B,OAAO,IAAI,CAAC,CAAC,IACb,OAAO,QAAQ,YAAY,IAAI,WAAW,GAAG,IAC3C,OAAO,KAAK,MAAM,GAAG,EAAE,CAAC,CAAC,IACzB,OAAO,OAAO,CAAC;AACrB,UAAQ,MAAM;AAAA,IACZ,KAAK;AAAI,aAAO,aAAa,SAAS,EAAE;AAAA,IACxC,KAAK;AAAI,aAAO,aAAa,SAAS,EAAE;AAAA,IACxC,KAAK;AAAI,aAAO,aAAa,SAAS,EAAE;AAAA,IACxC,KAAK;AAAI,aAAO,aAAa,SAAS,EAAE;AAAA,IACxC,KAAK;AAAI,aAAO,aAAa,SAAS,EAAE;AAAA,IACxC,KAAK;AAAI,aAAO,aAAa,SAAS,EAAE;AAAA,IACxC;AAAS,aAAO,aAAa,SAAS,EAAE;AAAA,EAC1C;AACF;AAEO,SAAS,oBAAoB,KAAqB,OAAkB;AAIzE,SAAO;AAAA,IACL;AAAA,MACE,CAAC,KAAM,aAAa,SAAS,EAAE,CAAC;AAAA,MAChC,CAAC,KAAM,aAAa,SAAS,EAAE,CAAC;AAAA,MAChC,CAAC,KAAM,aAAa,SAAS,EAAE,CAAC;AAAA,MAChC,CAAC,MAAM,aAAa,SAAS,EAAE,CAAC;AAAA,MAChC,CAAC,KAAM,aAAa,SAAS,EAAE,CAAC;AAAA,MAChC,CAAC,KAAM,aAAa,SAAS,EAAE,CAAC;AAAA,IAClC;AAAA,IACA,aAAa,SAAS,EAAE;AAAA,EAC1B;AACF;AAGO,SAAS,aAAa,OAAgC,KAAqB,OAAe;AAC/F,QAAM,SAAS,OAAO,MAAM,UAAU,MAAM,UAAU,CAAC;AACvD,MAAI,WAAW,EAAG,QAAO,aAAa,SAAS,EAAE;AACjD,MAAI,WAAW,EAAG,QAAO,aAAa,SAAS,EAAE;AACjD,SAAO,aAAa,SAAS,EAAE;AACjC;AAEO,SAAS,sBAAsB,KAAqB,OAAkB;AAC3E,SAAO;AAAA,IACL;AAAA,IACA,CAAC,YAAY,CAAC,OAAO,QAAQ,GAAG,CAAC,OAAO,QAAQ,GAAG,CAAC;AAAA,IACpD;AAAA,IAAG,aAAa,SAAS,EAAE;AAAA,IAC3B;AAAA,IAAG,aAAa,SAAS,EAAE;AAAA,IAC3B,aAAa,SAAS,EAAE;AAAA,EAC1B;AACF;AAGO,SAAS,YAAY,OAAgC,KAAqB,OAAe;AAC9F,QAAM,SAAS,OAAO,MAAM,UAAU,MAAM,UAAU,CAAC;AACvD,QAAM,SAAS,MAAM,UAAU,MAAM;AAErC,MAAI,WAAW,KAAK,WAAW,EAAG,QAAO,aAAa,SAAS,EAAE;AACjE,MAAI,UAAU,QAAQ,OAAO,MAAM,IAAI,EAAG,QAAO,aAAa,SAAS,EAAE;AACzE,SAAO,aAAa,SAAS,EAAE;AACjC;AAEO,SAAS,qBAAqB,KAAqB,OAAkB;AAC1E,SAAO;AAAA,IACL;AAAA,IACA;AAAA,MAAC;AAAA,MACC,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,QAAQ,GAAG,CAAC,OAAO,QAAQ,GAAG,CAAC,GAAG,CAAC;AAAA,MAC/D,CAAC,MAAM,CAAC,YAAY,CAAC,OAAO,QAAQ,GAAG,CAAC,OAAO,QAAQ,GAAG,CAAC,GAAG,CAAC;AAAA,IACjE;AAAA,IACA,aAAa,SAAS,EAAE;AAAA,IACxB;AAAA,MAAC;AAAA,MACC,CAAC,OAAO,QAAQ;AAAA,MAChB,CAAC,KAAK,CAAC,OAAO,QAAQ,GAAG,CAAC;AAAA,IAC5B;AAAA,IACA,aAAa,SAAS,EAAE;AAAA,IACxB,aAAa,SAAS,EAAE;AAAA,EAC1B;AACF;AAmBO,SAAS,0BAAqC;AACnD,SAAO;AAAA,IACL;AAAA,IACA,CAAC,YAAY,CAAC,OAAO,QAAQ,GAAG,CAAC,OAAO,QAAQ,GAAG,CAAC;AAAA,IACpD;AAAA,IAAI;AAAA;AAAA,IACJ;AAAA,IAAI;AAAA;AAAA,IACJ;AAAA,IAAI;AAAA;AAAA,IACJ;AAAA,IAAI;AAAA;AAAA,IACJ;AAAA,IAAI;AAAA;AAAA,IACJ;AAAA,IAAI;AAAA;AAAA,IACJ;AAAA,IAAI;AAAA;AAAA,IACJ;AAAA,IAAI;AAAA;AAAA,IACJ;AAAA,IAAI;AAAA;AAAA,IACJ;AAAA,IAAI;AAAA;AAAA,IACJ;AAAA,IAAI;AAAA;AAAA,IACJ;AAAA,IAAI;AAAA;AAAA,IACJ;AAAA;AAAA,EACF;AACF;AAGO,SAAS,aAAa,OAAgC,KAAqB,OAAe;AAC/F,QAAM,MAAM,MAAM,UAAU,MAAM;AAClC,QAAM,OAAO,MAAM,QAAQ,GAAG,IAC1B,OAAO,IAAI,CAAC,CAAC,IACb,OAAO,QAAQ,YAAY,IAAI,WAAW,GAAG,IAC3C,OAAO,KAAK,MAAM,GAAG,EAAE,CAAC,CAAC,IACzB,OAAO,OAAO,CAAC;AACrB,UAAQ,MAAM;AAAA,IACZ,KAAK;AAAI,aAAO,aAAa,SAAS,EAAE;AAAA,IACxC,KAAK;AAAI,aAAO,aAAa,SAAS,EAAE;AAAA,IACxC,KAAK;AAAI,aAAO,aAAa,SAAS,EAAE;AAAA,IACxC,KAAK;AAAI,aAAO,aAAa,SAAS,EAAE;AAAA,IACxC,KAAK;AAAI,aAAO,aAAa,SAAS,EAAE;AAAA,IACxC;AAAS,aAAO,aAAa,SAAS,EAAE;AAAA,EAC1C;AACF;;;AC1LA,IAAM,OAAO;AAEb,SAAS,IAAI,OAAuB;AAClC,SAAO,kDAAkD,IAAI,aAAa,IAAI,yBAAyB,KAAK;AAC9G;AAOA,SAAS,UAAkB;AACzB,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA,GAIV;AACH;AAGA,SAAS,UAAkB;AACzB,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA,GAIV;AACH;AAGA,SAAS,WAAmB;AAC1B,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA,GAIV;AACH;AAGA,SAAS,aAAqB;AAC5B,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA,GAIV;AACH;AAGA,SAAS,gBAAwB;AAC/B,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,GAKV;AACH;AAGA,SAAS,aAAqB;AAC5B,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,GAKV;AACH;AAGA,SAAS,YAAoB;AAC3B,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAMV;AACH;AAGA,SAAS,oBAA4B;AACnC,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAOV;AACH;AAGA,SAAS,oBAA4B;AACnC,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAOV;AACH;AAGA,SAAS,mBAA2B;AAClC,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAQV;AACH;AAGA,SAAS,mBAA2B;AAClC,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAOV;AACH;AAGA,SAAS,qBAA6B;AACpC,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAOV;AACH;AAGA,SAAS,gBAAwB;AAC/B,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAOV;AACH;AAGA,SAAS,cAAsB;AAC7B,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAMV;AACH;AAGA,SAAS,qBAA6B;AACpC,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAUV;AACH;AAGA,SAAS,cAAsB;AAC7B,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,GAKV;AACH;AAGA,SAAS,WAAmB;AAC1B,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA,GAIV;AACH;AAGA,SAAS,oBAA4B;AACnC,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA,GAIV;AACH;AAGA,SAAS,oBAA4B;AACnC,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA,GAIV;AACH;AAGA,SAAS,iBAAyB;AAChC,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,GAKV;AACH;AAGA,SAAS,uBAA+B;AACtC,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,GAKV;AACH;AAGA,SAAS,kBAA0B;AACjC,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA,GAIV;AACH;AAGA,SAAS,gBAAwB;AAC/B,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAOV;AACH;AAGA,SAAS,kBAA0B;AACjC,SAAO,IAAI;AAAA;AAAA,GAEV;AACH;AAGA,SAAS,gBAAwB;AAC/B,SAAO,IAAI;AAAA;AAAA,GAEV;AACH;AAOA,SAAS,gBAAwB;AAC/B,SAAO,IAAI;AAAA;AAAA,GAEV;AACH;AAGA,SAAS,kBAA0B;AACjC,SAAO,IAAI;AAAA;AAAA,GAEV;AACH;AAGA,SAAS,gBAAwB;AAC/B,SAAO,IAAI;AAAA;AAAA,GAEV;AACH;AAGA,SAAS,kBAA0B;AACjC,SAAO,IAAI;AAAA;AAAA;AAAA,GAGV;AACH;AAGA,SAAS,oBAA4B;AACnC,SAAO,IAAI;AAAA;AAAA;AAAA,GAGV;AACH;AAGA,SAAS,oBAA4B;AACnC,SAAO,IAAI;AAAA;AAAA;AAAA,GAGV;AACH;AAGA,SAAS,qBAA6B;AACpC,SAAO,IAAI;AAAA;AAAA;AAAA,GAGV;AACH;AAGA,SAAS,kBAA0B;AACjC,SAAO,IAAI;AAAA;AAAA;AAAA,GAGV;AACH;AAGA,SAAS,iBAAyB;AAChC,SAAO,IAAI;AAAA;AAAA,GAEV;AACH;AAGA,SAAS,gBAAwB;AAC/B,SAAO,IAAI;AAAA;AAAA;AAAA,GAGV;AACH;AASA,SAAS,aAAqB;AAC5B,SAAO,IAAI;AAAA;AAAA;AAAA,GAGV;AACH;AAGA,SAAS,aAAqB;AAC5B,SAAO,IAAI;AAAA;AAAA;AAAA,GAGV;AACH;AAGA,SAAS,cAAsB;AAC7B,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,GAKV;AACH;AAGA,SAAS,mBAA2B;AAClC,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,GAKV;AACH;AAGA,SAAS,YAAoB;AAC3B,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA,GAIV;AACH;AAGA,SAAS,cAAsB;AAC7B,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAOV;AACH;AAGA,SAAS,aAAqB;AAC5B,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,GAKV;AACH;AAGA,SAAS,YAAoB;AAC3B,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAMV;AACH;AAGA,SAAS,mBAA2B;AAClC,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,GAKV;AACH;AAOA,SAAS,eAAuB;AAC9B,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAOV;AACH;AAGA,SAAS,iBAAyB;AAChC,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAMV;AACH;AAGA,SAAS,iBAAyB;AAChC,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA,GAIV;AACH;AAGA,SAAS,YAAoB;AAC3B,SAAO,IAAI;AAAA;AAAA;AAAA,GAGV;AACH;AAGA,SAAS,iBAAyB;AAChC,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,GAKV;AACH;AAGA,SAAS,qBAA6B;AACpC,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA,GAIV;AACH;AAGA,SAAS,cAAsB;AAC7B,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA,GAIV;AACH;AAOA,SAAS,gBAAwB;AAC/B,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA,GAIV;AACH;AAGA,SAAS,gBAAwB;AAC/B,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA,GAIV;AACH;AAGA,SAAS,kBAA0B;AACjC,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA,GAIV;AACH;AAGA,SAAS,oBAA4B;AACnC,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA,GAIV;AACH;AAGA,SAAS,mBAA2B;AAClC,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA,GAIV;AACH;AAGA,SAAS,mBAA2B;AAClC,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAQV;AACH;AAGA,SAAS,sBAA8B;AACrC,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAOV;AACH;AAGA,SAAS,eAAuB;AAC9B,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA,GAIV;AACH;AAGA,SAAS,uBAA+B;AACtC,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,GAKV;AACH;AAGA,SAAS,qBAA6B;AACpC,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,GAKV;AACH;AAGA,SAAS,qBAA6B;AACpC,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA,GAIV;AACH;AAGA,SAAS,sBAA8B;AACrC,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAOV;AACH;AAGA,SAAS,gBAAwB;AAC/B,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA,GAIV;AACH;AAGA,SAAS,eAAuB;AAC9B,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA,GAIV;AACH;AAGA,SAAS,eAAuB;AAC9B,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA,GAIV;AACH;AAOA,SAAS,mBAA2B;AAClC,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAMV;AACH;AAGA,SAAS,SAAiB;AACxB,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA,GAKV;AACH;AAGA,SAAS,QAAgB;AACvB,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAMV;AACH;AAGA,SAAS,YAAY,QAAQ,QAAQ,UAAU,WAAmB;AAChE,SAAO,IAAI;AAAA,mDACsC,KAAK;AAAA,kDACN,KAAK;AAAA,oDACH,KAAK;AAAA,sDACH,KAAK;AAAA,GACxD;AACH;AAGA,SAAS,cAAc,QAAQ,QAAQ,UAAU,WAAmB;AAClE,SAAO,IAAI;AAAA,mDACsC,KAAK;AAAA,kDACN,KAAK;AAAA,oDACH,KAAK;AAAA,sDACH,OAAO;AAAA,GAC1D;AACH;AAGA,SAAS,cAAc,QAAQ,QAAQ,UAAU,WAAmB;AAClE,SAAO,IAAI;AAAA,mDACsC,KAAK;AAAA,kDACN,KAAK;AAAA,oDACH,KAAK;AAAA,mDACN,OAAO;AAAA,4CACd,OAAO;AAAA,GAChD;AACH;AAGA,SAAS,YAAY,QAAQ,QAAQ,UAAU,WAAmB;AAChE,SAAO,IAAI;AAAA,mDACsC,KAAK;AAAA,kDACN,KAAK;AAAA,oDACH,KAAK;AAAA,wDACD,OAAO;AAAA,0CACrB,OAAO;AAAA,GAC9C;AACH;AAGA,SAAS,cAAc,QAAQ,QAAQ,UAAU,WAAmB;AAClE,SAAO,IAAI;AAAA,mDACsC,KAAK;AAAA,kDACN,KAAK;AAAA,oDACH,KAAK;AAAA,mDACN,OAAO;AAAA,4CACd,OAAO;AAAA,mDACA,OAAO;AAAA,6CACb,OAAO;AAAA,GACjD;AACH;AAGA,SAAS,MAAc;AACrB,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAOV;AACH;AAOA,SAAS,eAAuB;AAC9B,SAAO,IAAI;AAAA;AAAA;AAAA,GAGV;AACH;AAGA,SAAS,gBAAwB;AAC/B,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA,GAIV;AACH;AAGA,SAAS,oBAA4B;AACnC,SAAO,IAAI;AAAA;AAAA;AAAA;AAAA,GAIV;AACH;AAOA,SAAS,mBAA2B;AAClC,SAAO,IAAI;AAAA;AAAA;AAAA,GAGV;AACH;AAGA,SAAS,aAAqB;AAC5B,SAAO,IAAI;AAAA;AAAA;AAAA,GAGV;AACH;AAkFO,IAAM,mBAAqC;AAAA;AAAA,EAEhD;AAAA,IAAE,IAAI;AAAA,IAAY,OAAO;AAAA,IAA2B,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IACxF,OAAO;AAAA,IAAiB,aAAa;AAAA,IACrC,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA,IAC9D,UAAU,CAAC,YAAY,UAAU;AAAA,IAAG,eAAe,CAAC,OAAO,OAAO,MAAM;AAAA,IACxE,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,mBAAmB,KAAK,WAAW,OAAO,YAAY;AAAA,MAC/D,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,4BAA4B;AAAA,IACvE;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,iBAAiB,OAAO,KAAK,OAAO,UAAU;AAAA,MACzD,EAAE,SAAS,gBAAgB,OAAO,KAAK,OAAO,UAAU;AAAA,IAC1D;AAAA,IACA,cAAc;AAAA,MACZ,EAAE,SAAS,oBAAoB,OAAO,UAAU;AAAA,IAClD;AAAA,IACA,cAAc;AAAA,EAAwU;AAAA,EAExV;AAAA,IAAE,IAAI;AAAA,IAAY,OAAO;AAAA,IAAgC,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IAC7F,OAAO;AAAA,IAAiB,aAAa;AAAA,IACrC,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA,IAC9D,UAAU,CAAC,YAAY,UAAU;AAAA,IAAG,eAAe,CAAC,OAAO,OAAO,KAAK;AAAA,IACvE,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,qBAAqB,KAAK,WAAW,OAAO,YAAY;AAAA,MACjE,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,4BAA4B;AAAA,IACvE;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,iBAAiB,OAAO,KAAK,OAAO,UAAU;AAAA,MACzD,EAAE,SAAS,gBAAgB,OAAO,KAAK,OAAO,UAAU;AAAA,IAC1D;AAAA,IACA,cAAc;AAAA,MACZ,EAAE,SAAS,gBAAgB,OAAO,UAAU;AAAA,IAC9C;AAAA,IACA,cAAc;AAAA,EAA8R;AAAA;AAAA,EAG9S;AAAA,IAAE,IAAI;AAAA,IAAa,OAAO;AAAA,IAAa,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IAC3E,OAAO;AAAA,IAAe,aAAa;AAAA,IACnC,UAAU;AAAA,IAAY,eAAe,CAAC,WAAW;AAAA,IACjD,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,YAAY;AAAA,MACrD,EAAE,OAAO,mBAAmB,KAAK,WAAW,OAAO,WAAW;AAAA,IAChE;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,cAAc,OAAO,KAAK,OAAO,UAAU;AAAA,MACtD,EAAE,SAAS,oBAAoB,OAAO,KAAK,OAAO,UAAU;AAAA,IAC9D;AAAA,IACA,cAAc;AAAA,MACZ,EAAE,SAAS,YAAY,OAAO,UAAU;AAAA,IAC1C;AAAA,IACA,cAAc;AAAA,EAA0Q;AAAA,EAE1R;AAAA,IAAE,IAAI;AAAA,IAAe,OAAO;AAAA,IAAe,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IAC/E,OAAO;AAAA,IAAe,aAAa;AAAA,IACnC,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,mBAAmB,KAAK,WAAW,OAAO,YAAY;AAAA,MAC/D,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,oBAAoB;AAAA,IAC/D;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,iBAAiB,OAAO,KAAK,OAAO,UAAU;AAAA,MACzD,EAAE,SAAS,gBAAgB,OAAO,GAAK,OAAO,UAAU;AAAA,IAC1D;AAAA,IACA,cAAc;AAAA,MACZ,EAAE,SAAS,yBAAyB,OAAO,UAAU;AAAA,IACvD;AAAA,IACA,cAAc;AAAA,EAA0P;AAAA,EAE1Q;AAAA,IAAE,IAAI;AAAA,IAAkB,OAAO;AAAA,IAAkB,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IACrF,OAAO;AAAA,IAAe,aAAa;AAAA,IACnC,UAAU;AAAA,IAAY,cAAc;AAAA,IACpC,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,mBAAmB,KAAK,WAAW,OAAO,YAAY;AAAA,MAC/D,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,eAAe;AAAA,MACxD,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,eAAe;AAAA,IAC1D;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,iBAAiB,OAAO,KAAK,OAAO,UAAU;AAAA,MACzD,EAAE,SAAS,gBAAgB,OAAO,GAAK,OAAO,UAAU;AAAA,MACxD,EAAE,SAAS,gBAAgB,OAAO,KAAK,OAAO,UAAU;AAAA,IAC1D;AAAA,IACA,cAAc;AAAA,MACZ,EAAE,SAAS,kBAAkB,OAAO,UAAU;AAAA,IAChD;AAAA,IACA,cAAc;AAAA,EAA+O;AAAA,EAE/P;AAAA,IAAE,IAAI;AAAA,IAAe,OAAO;AAAA,IAAmB,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IACnF,OAAO;AAAA,IAAe,aAAa;AAAA,IACnC,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,kBAAkB,KAAK,WAAW,OAAO,YAAY;AAAA,MAC9D,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,0BAA0B;AAAA,IACrE;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,iBAAiB,OAAO,KAAK,OAAO,UAAU;AAAA,MACzD,EAAE,SAAS,gBAAgB,OAAO,GAAK,OAAO,UAAU;AAAA,MACxD,EAAE,SAAS,eAAe,OAAO,KAAK,OAAO,UAAU;AAAA,IACzD;AAAA,IACA,cAAc;AAAA,MACZ,EAAE,SAAS,eAAe,OAAO,UAAU;AAAA,IAC7C;AAAA,IACA,cAAc;AAAA,EAA4M;AAAA,EAE5N;AAAA,IAAE,IAAI;AAAA,IAAc,OAAO;AAAA,IAAsB,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IACrF,OAAO;AAAA,IAAe,aAAa;AAAA,IACnC,UAAU;AAAA,IAAY,eAAe,CAAC,WAAW,eAAe;AAAA,IAChE,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,mBAAmB,KAAK,WAAW,OAAO,YAAY;AAAA,MAC/D,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,mBAAmB;AAAA,MAC5D,EAAE,OAAO,mBAAmB,KAAK,WAAW,OAAO,gBAAgB;AAAA,IACrE;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,iBAAiB,OAAO,KAAK,OAAO,UAAU;AAAA,MACzD,EAAE,SAAS,gBAAgB,OAAO,KAAK,OAAO,UAAU;AAAA,MACxD,EAAE,SAAS,QAAQ,OAAO,KAAK,OAAO,UAAU;AAAA,MAChD,EAAE,SAAS,yBAAyB,OAAO,KAAK,OAAO,UAAU;AAAA,IACnE;AAAA,IACA,cAAc;AAAA,MACZ,EAAE,SAAS,aAAa,OAAO,UAAU;AAAA,MACzC,EAAE,SAAS,iBAAiB,OAAO,UAAU;AAAA,IAC/C;AAAA,IACA,cAAc;AAAA,EAAsQ;AAAA;AAAA,EAGtR;AAAA,IAAE,IAAI;AAAA,IAAuB,OAAO;AAAA,IAAwB,SAAS;AAAA,IAAU,SAAS;AAAA,IAAK,QAAQ;AAAA,IACnG,OAAO;AAAA,IAAkB,aAAa;AAAA,IACtC,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA,IAC9D,UAAU,CAAC,uBAAuB,uBAAuB,sBAAsB,oBAAoB;AAAA,IACnG,eAAe,CAAC,OAAO,MAAM;AAAA,IAAG,cAAc;AAAA,IAC9C,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,mBAAmB,KAAK,WAAW,OAAO,oBAAoB;AAAA,MACvE,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,qCAAqC;AAAA,IAChF;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,SAAS,OAAO,GAAK,OAAO,UAAU;AAAA,MACjD,EAAE,SAAS,gBAAgB,OAAO,KAAK,OAAO,UAAU;AAAA,IAC1D;AAAA,IACA,cAAc;AAAA,MACZ,EAAE,SAAS,qBAAqB,OAAO,UAAU;AAAA,MACjD,EAAE,SAAS,cAAc,OAAO,UAAU;AAAA,MAC1C,EAAE,SAAS,uBAAuB,OAAO,UAAU;AAAA,MACnD,EAAE,SAAS,uBAAuB,OAAO,UAAU;AAAA,IACrD;AAAA,IACA,cAAc;AAAA,EAAsT;AAAA,EAEtU;AAAA,IAAE,IAAI;AAAA,IAAuB,OAAO;AAAA,IAAwB,SAAS;AAAA,IAAU,SAAS;AAAA,IAAK,QAAQ;AAAA,IACnG,OAAO;AAAA,IAAkB,aAAa;AAAA,IACtC,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA,IAC9D,UAAU,CAAC,uBAAuB,uBAAuB,sBAAsB,oBAAoB;AAAA,IACnG,eAAe,CAAC,cAAc,aAAa;AAAA,IAAG,cAAc;AAAA,IAC5D,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,mBAAmB,KAAK,WAAW,OAAO,oBAAoB;AAAA,MACvE,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,qCAAqC;AAAA,IAChF;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,SAAS,OAAO,GAAK,OAAO,UAAU;AAAA,MACjD,EAAE,SAAS,gBAAgB,OAAO,KAAK,OAAO,UAAU;AAAA,IAC1D;AAAA,IACA,cAAc;AAAA,MACZ,EAAE,SAAS,qBAAqB,OAAO,UAAU;AAAA,MACjD,EAAE,SAAS,cAAc,OAAO,UAAU;AAAA,MAC1C,EAAE,SAAS,yBAAyB,OAAO,UAAU;AAAA,MACrD,EAAE,SAAS,yBAAyB,OAAO,UAAU;AAAA,IACvD;AAAA,IACA,cAAc;AAAA,EAAmQ;AAAA,EAEnR;AAAA,IAAE,IAAI;AAAA,IAAsB,OAAO;AAAA,IAAuB,SAAS;AAAA,IAAU,SAAS;AAAA,IAAK,QAAQ;AAAA,IACjG,OAAO;AAAA,IAAkB,aAAa;AAAA,IACtC,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA,IAC9D,UAAU,CAAC,uBAAuB,uBAAuB,sBAAsB,oBAAoB;AAAA,IACnG,eAAe,CAAC,UAAU,SAAS;AAAA,IACnC,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,mBAAmB,KAAK,WAAW,OAAO,0BAA0B;AAAA,MAC7E,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,mCAAmC;AAAA,IAC9E;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,SAAS,OAAO,GAAK,OAAO,UAAU;AAAA,MACjD,EAAE,SAAS,gBAAgB,OAAO,KAAK,OAAO,UAAU;AAAA,IAC1D;AAAA,IACA,cAAc;AAAA,MACZ,EAAE,SAAS,mBAAmB,OAAO,UAAU;AAAA,MAC/C,EAAE,SAAS,oBAAoB,OAAO,UAAU;AAAA,MAChD,EAAE,SAAS,mBAAmB,OAAO,UAAU;AAAA,MAC/C,EAAE,SAAS,kCAAkC,OAAO,UAAU;AAAA,IAChE;AAAA,IACA,cAAc;AAAA,EAA2P;AAAA,EAE3Q;AAAA,IAAE,IAAI;AAAA,IAAsB,OAAO;AAAA,IAAuB,SAAS;AAAA,IAAU,SAAS;AAAA,IAAK,QAAQ;AAAA,IACjG,OAAO;AAAA,IAAkB,aAAa;AAAA,IACtC,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA,IAC9D,UAAU,CAAC,uBAAuB,uBAAuB,sBAAsB,oBAAoB;AAAA,IACnG,eAAe,CAAC,UAAU,SAAS;AAAA,IACnC,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,mBAAmB,KAAK,WAAW,OAAO,yBAAyB;AAAA,MAC5E,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,kCAAkC;AAAA,IAC7E;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,SAAS,OAAO,GAAK,OAAO,UAAU;AAAA,MACjD,EAAE,SAAS,gBAAgB,OAAO,KAAK,OAAO,UAAU;AAAA,IAC1D;AAAA,IACA,cAAc;AAAA,MACZ,EAAE,SAAS,mBAAmB,OAAO,UAAU;AAAA,MAC/C,EAAE,SAAS,oBAAoB,OAAO,UAAU;AAAA,MAChD,EAAE,SAAS,mBAAmB,OAAO,UAAU;AAAA,MAC/C,EAAE,SAAS,sCAAsC,OAAO,UAAU;AAAA,IACpE;AAAA,IACA,cAAc;AAAA,EAAgO;AAAA;AAAA,EAGhP;AAAA,IAAE,IAAI;AAAA,IAAwB,OAAO;AAAA,IAAwB,SAAS;AAAA,IAAU,SAAS;AAAA,IAAK,QAAQ;AAAA,IACpG,OAAO;AAAA,IAAiB,aAAa;AAAA,IACrC,UAAU;AAAA,IAAY,eAAe,CAAC,SAAS;AAAA,IAAG,cAAc;AAAA,IAChE,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,gCAAgC;AAAA,MACzE,EAAE,OAAO,mBAAmB,KAAK,WAAW,OAAO,yBAAyB;AAAA,IAC9E;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,SAAS,OAAO,GAAK,OAAO,UAAU;AAAA,MACjD,EAAE,SAAS,gBAAgB,OAAO,KAAK,OAAO,UAAU;AAAA,IAC1D;AAAA,IACA,cAAc;AAAA,MACZ,EAAE,SAAS,aAAa,OAAO,UAAU;AAAA,MACzC,EAAE,SAAS,mBAAmB,OAAO,UAAU;AAAA,MAC/C,EAAE,SAAS,oBAAoB,OAAO,UAAU;AAAA,MAChD,EAAE,SAAS,oBAAoB,OAAO,UAAU;AAAA,IAClD;AAAA,IACA,cAAc;AAAA,EAAqS;AAAA,EAErT;AAAA,IAAE,IAAI;AAAA,IAAmB,OAAO;AAAA,IAAmB,SAAS;AAAA,IAAU,SAAS;AAAA,IAAK,QAAQ;AAAA,IAC1F,OAAO;AAAA,IAAiB,aAAa;AAAA,IACrC,UAAU;AAAA,IAAY,eAAe,CAAC,WAAW,WAAW;AAAA,IAAG,cAAc;AAAA,IAC7E,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,mBAAmB,KAAK,WAAW,OAAO,+BAA+B;AAAA,MAClF,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,kCAAkC;AAAA,MAC3E,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,oBAAoB;AAAA,IAC/D;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,SAAS,OAAO,GAAK,OAAO,UAAU;AAAA,MACjD,EAAE,SAAS,gBAAgB,OAAO,KAAK,OAAO,UAAU;AAAA,MACxD,EAAE,SAAS,mBAAmB,OAAO,KAAK,OAAO,UAAU;AAAA,IAC7D;AAAA,IACA,cAAc;AAAA,MACZ,EAAE,SAAS,mBAAmB,OAAO,UAAU;AAAA,MAC/C,EAAE,SAAS,qBAAqB,OAAO,UAAU;AAAA,MACjD,EAAE,SAAS,qBAAqB,OAAO,UAAU;AAAA,MACjD,EAAE,SAAS,kBAAkB,OAAO,UAAU;AAAA,IAChD;AAAA,IACA,cAAc;AAAA,EAAuQ;AAAA,EAEvR;AAAA,IAAE,IAAI;AAAA,IAAgB,OAAO;AAAA,IAAwB,SAAS;AAAA,IAAU,SAAS;AAAA,IAAK,QAAQ;AAAA,IAC5F,OAAO;AAAA,IAAiB,aAAa;AAAA,IACrC,UAAU;AAAA,IAAY,eAAe,CAAC,SAAS,UAAU,WAAW;AAAA,IAAG,cAAc;AAAA,IACrF,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,kBAAkB,KAAK,WAAW,OAAO,YAAY;AAAA,MAC9D,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,gCAAgC;AAAA,IAC3E;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,SAAS,OAAO,GAAK,OAAO,UAAU;AAAA,MACjD,EAAE,SAAS,gBAAgB,OAAO,KAAK,OAAO,UAAU;AAAA,MACxD,EAAE,SAAS,kBAAkB,OAAO,KAAK,OAAO,UAAU;AAAA,IAC5D;AAAA,IACA,cAAc;AAAA,MACZ,EAAE,SAAS,aAAa,OAAO,UAAU;AAAA,IAC3C;AAAA,IACA,cAAc;AAAA,EAA+R;AAAA,EAE/S;AAAA,IAAE,IAAI;AAAA,IAAwB,OAAO;AAAA,IAAgC,SAAS;AAAA,IAAU,SAAS;AAAA,IAAK,QAAQ;AAAA,IAC5G,OAAO;AAAA,IAAiB,aAAa;AAAA,IACrC,UAAU;AAAA,IAAY,eAAe,CAAC,cAAc;AAAA,IAAG,cAAc;AAAA,IACrE,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,kBAAkB,KAAK,WAAW,OAAO,YAAY;AAAA,MAC9D,EAAE,OAAO,mBAAmB,KAAK,WAAW,OAAO,iCAAiC;AAAA,MACpF,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,gCAAgC;AAAA,IAC3E;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,SAAS,OAAO,GAAK,OAAO,UAAU;AAAA,MACjD,EAAE,SAAS,gBAAgB,OAAO,KAAK,OAAO,UAAU;AAAA,MACxD,EAAE,SAAS,2BAA2B,OAAO,GAAK,OAAO,UAAU;AAAA,MACnE,EAAE,SAAS,uBAAuB,OAAO,KAAK,OAAO,UAAU;AAAA,IACjE;AAAA,IACA,cAAc;AAAA,MACZ,EAAE,SAAS,aAAa,OAAO,UAAU;AAAA,MACzC,EAAE,SAAS,4BAA4B,OAAO,UAAU;AAAA,MACxD,EAAE,SAAS,4BAA4B,OAAO,UAAU;AAAA,IAC1D;AAAA,IACA,cAAc;AAAA,EAA2U;AAAA;AAAA,EAG3V;AAAA,IAAE,IAAI;AAAA,IAAgB,OAAO;AAAA,IAAgB,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IACjF,OAAO;AAAA,IAAW,aAAa;AAAA,IAC/B,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA,IAC9D,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,aAAa;AAAA,MACtD,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,yBAAyB;AAAA,IACpE;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,cAAc,OAAO,KAAK,OAAO,UAAU;AAAA,MACtD,EAAE,SAAS,iBAAiB,OAAO,KAAK,OAAO,UAAU;AAAA,IAC3D;AAAA,IACA,cAAc;AAAA,MACZ,EAAE,SAAS,cAAc,OAAO,UAAU;AAAA,MAC1C,EAAE,SAAS,sBAAsB,OAAO,UAAU;AAAA,IACpD;AAAA,IACA,cAAc;AAAA,EAA2R;AAAA,EAE3S;AAAA,IAAE,IAAI;AAAA,IAAO,OAAO;AAAA,IAAwB,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IAChF,OAAO;AAAA,IAAW,aAAa;AAAA,IAC/B,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA,IAC9D,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,mBAAmB,KAAK,WAAW,OAAO,aAAa;AAAA,MAChE,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,2BAA2B;AAAA,IACtE;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,gBAAgB,OAAO,KAAK,OAAO,UAAU;AAAA,MACxD,EAAE,SAAS,kBAAkB,OAAO,KAAK,OAAO,UAAU;AAAA,MAC1D,EAAE,SAAS,oBAAoB,OAAO,KAAK,OAAO,UAAU;AAAA,MAC5D,EAAE,SAAS,sBAAsB,OAAO,KAAK,OAAO,UAAU;AAAA,IAChE;AAAA,IACA,cAAc;AAAA,MACZ,EAAE,SAAS,cAAc,OAAO,UAAU;AAAA,IAC5C;AAAA,IACA,cAAc;AAAA,EAAsT;AAAA;AAAA,EAGtU;AAAA,IAAE,IAAI;AAAA,IAAuB,OAAO;AAAA,IAA0B,SAAS;AAAA,IAAQ,SAAS;AAAA,IAAK,QAAQ;AAAA,IACnG,OAAO;AAAA,IAAW,aAAa;AAAA,IAC/B,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA,IAC9D,UAAU,CAAC,uBAAuB,qBAAqB;AAAA,IAAG,cAAc;AAAA,IACxE,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,mBAAmB,KAAK,WAAW,OAAO,wBAAwB;AAAA,MAC3E,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,2BAA2B;AAAA,IACtE;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,cAAc,OAAO,GAAK,OAAO,UAAU;AAAA,MACtD,EAAE,SAAS,mBAAmB,OAAO,GAAK,OAAO,UAAU;AAAA,IAC7D;AAAA,IACA,cAAc;AAAA,MACZ,EAAE,SAAS,oBAAoB,OAAO,UAAU;AAAA,IAClD;AAAA,IACA,cAAc;AAAA,EAAkT;AAAA,EAElU;AAAA,IAAE,IAAI;AAAA,IAAuB,OAAO;AAAA,IAA+B,SAAS;AAAA,IAAQ,SAAS;AAAA,IAAK,QAAQ;AAAA,IACxG,OAAO;AAAA,IAAW,aAAa;AAAA,IAC/B,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA,IAC9D,UAAU,CAAC,uBAAuB,qBAAqB;AAAA,IAAG,cAAc;AAAA,IACxE,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,qBAAqB,KAAK,WAAW,OAAO,sBAAsB;AAAA,MAC3E,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,2BAA2B;AAAA,IACtE;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,cAAc,OAAO,GAAK,OAAO,UAAU;AAAA,MACtD,EAAE,SAAS,mBAAmB,OAAO,GAAK,OAAO,UAAU;AAAA,IAC7D;AAAA,IACA,cAAc;AAAA,MACZ,EAAE,SAAS,kBAAkB,OAAO,UAAU;AAAA,IAChD;AAAA,IACA,cAAc;AAAA,EAAiP;AAAA,EAEjQ;AAAA,IAAE,IAAI;AAAA,IAAmB,OAAO;AAAA,IAAoB,SAAS;AAAA,IAAQ,SAAS;AAAA,IAAK,QAAQ;AAAA,IACzF,OAAO;AAAA,IAAW,aAAa;AAAA,IAC/B,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,sBAAsB;AAAA,IACjE;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,cAAc,OAAO,GAAK,OAAO,UAAU;AAAA,IACxD;AAAA,IACA,cAAc;AAAA,MACZ,EAAE,SAAS,kBAAkB,OAAO,UAAU;AAAA,MAC9C,EAAE,SAAS,kBAAkB,OAAO,UAAU;AAAA,IAChD;AAAA,IACA,cAAc;AAAA,EAAuP;AAAA,EAEvQ;AAAA,IAAE,IAAI;AAAA,IAA0B,OAAO;AAAA,IAA2B,SAAS;AAAA,IAAQ,SAAS;AAAA,IAAK,QAAQ;AAAA,IACvG,OAAO;AAAA,IAAW,aAAa;AAAA,IAC/B,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,2BAA2B;AAAA,IACtE;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,cAAc,OAAO,GAAK,OAAO,UAAU;AAAA,IACxD;AAAA,IACA,cAAc;AAAA,MACZ,EAAE,SAAS,oBAAoB,OAAO,UAAU;AAAA,MAChD,EAAE,SAAS,oBAAoB,OAAO,UAAU;AAAA,IAClD;AAAA,IACA,cAAc;AAAA,EAA2M;AAAA,EAE3N;AAAA,IAAE,IAAI;AAAA,IAAqB,OAAO;AAAA,IAAsB,SAAS;AAAA,IAAQ,SAAS;AAAA,IAAK,QAAQ;AAAA,IAC7F,OAAO;AAAA,IAAW,aAAa;AAAA,IAC/B,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,mBAAmB,KAAK,WAAW,OAAO,iBAAiB;AAAA,MACpE,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,0BAA0B;AAAA,IACrE;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,cAAc,OAAO,GAAK,OAAO,UAAU;AAAA,MACtD,EAAE,SAAS,kBAAkB,OAAO,KAAK,OAAO,UAAU;AAAA,IAC5D;AAAA,IACA,cAAc;AAAA,MACZ,EAAE,SAAS,kBAAkB,OAAO,UAAU;AAAA,IAChD;AAAA,IACA,cAAc;AAAA,EAAuM;AAAA,EAEvN;AAAA,IAAE,IAAI;AAAA,IAAkB,OAAO;AAAA,IAA2B,SAAS;AAAA,IAAQ,SAAS;AAAA,IAAK,QAAQ;AAAA,IAC/F,OAAO;AAAA,IAAW,aAAa;AAAA,IAC/B,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,mBAAmB,KAAK,WAAW,OAAO,iBAAiB;AAAA,MACpE,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,qBAAqB;AAAA,IAChE;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,cAAc,OAAO,GAAK,OAAO,UAAU;AAAA,MACtD,EAAE,SAAS,sBAAsB,OAAO,GAAK,OAAO,UAAU;AAAA,MAC9D,EAAE,SAAS,uBAAuB,OAAO,KAAK,OAAO,UAAU;AAAA,IACjE;AAAA,IACA,cAAc,CAAC;AAAA,IACf,cAAc;AAAA,EAAyM;AAAA,EAEzN;AAAA,IAAE,IAAI;AAAA,IAAa,OAAO;AAAA,IAAe,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IAC7E,OAAO;AAAA,IAAW,aAAa;AAAA,IAC/B,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,0BAA0B;AAAA,IACrE;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,cAAc,OAAO,KAAK,OAAO,UAAU;AAAA,IACxD;AAAA,IACA,cAAc;AAAA,MACZ,EAAE,SAAS,YAAY,OAAO,UAAU;AAAA,IAC1C;AAAA,IACA,cAAc;AAAA,EAAoN;AAAA;AAAA,EAGpO;AAAA,IAAE,IAAI;AAAA,IAAoB,OAAO;AAAA,IAA4B,SAAS;AAAA,IAAQ,SAAS;AAAA,IAAK,QAAQ;AAAA,IAClG,OAAO;AAAA,IAAY,aAAa;AAAA,IAChC,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA,IAC9D,UAAU,CAAC,oBAAoB,gBAAgB;AAAA,IAAG,cAAc;AAAA,IAChE,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,mBAAmB,KAAK,WAAW,OAAO,qBAAqB;AAAA,MACxE,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,UAAU;AAAA,IACrD;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,iBAAiB,OAAO,KAAK,OAAO,UAAU;AAAA,IAC3D;AAAA,IACA,cAAc;AAAA,MACZ,EAAE,SAAS,kBAAkB,OAAO,UAAU;AAAA,IAChD;AAAA,IACA,cAAc;AAAA,EAA4Q;AAAA,EAE5R;AAAA,IAAE,IAAI;AAAA,IAAkB,OAAO;AAAA,IAA+B,SAAS;AAAA,IAAQ,SAAS;AAAA,IAAK,QAAQ;AAAA,IACnG,OAAO;AAAA,IAAY,aAAa;AAAA,IAChC,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA,IAC9D,UAAU,CAAC,oBAAoB,gBAAgB;AAAA,IAAG,cAAc;AAAA,IAChE,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,qBAAqB,KAAK,WAAW,OAAO,qBAAqB;AAAA,MAC1E,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,UAAU;AAAA,IACrD;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,iBAAiB,OAAO,KAAK,OAAO,UAAU;AAAA,IAC3D;AAAA,IACA,cAAc;AAAA,MACZ,EAAE,SAAS,gBAAgB,OAAO,UAAU;AAAA,IAC9C;AAAA,IACA,cAAc;AAAA,EAAwP;AAAA;AAAA,EAGxQ;AAAA,IAAE,IAAI;AAAA,IAAmB,OAAO;AAAA,IAAoB,SAAS;AAAA,IAAQ,SAAS;AAAA,IAAK,QAAQ;AAAA,IACzF,OAAO;AAAA,IAAY,aAAa;AAAA,IAChC,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA;AAAA,IAC9D,YAAY;AAAA,IACZ,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,wBAAwB,CAAC;AAAA,IAC3E,YAAY,CAAC,EAAE,SAAS,gBAAgB,OAAO,GAAK,OAAO,UAAU,CAAC;AAAA,IACtE,cAAc,CAAC,EAAE,SAAS,aAAa,OAAO,UAAU,CAAC;AAAA,IACzD,cAAc;AAAA,EAA6K;AAAA,EAE7L;AAAA,IAAE,IAAI;AAAA,IAAqB,OAAO;AAAA,IAAsB,SAAS;AAAA,IAAQ,SAAS;AAAA,IAAK,QAAQ;AAAA,IAC7F,OAAO;AAAA,IAAY,aAAa;AAAA,IAChC,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA;AAAA,IAC9D,YAAY;AAAA,IACZ,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,wBAAwB,CAAC;AAAA,IAC3E,YAAY,CAAC,EAAE,SAAS,gBAAgB,OAAO,GAAK,OAAO,UAAU,CAAC;AAAA,IACtE,cAAc,CAAC,EAAE,SAAS,aAAa,OAAO,UAAU,CAAC;AAAA,IACzD,cAAc;AAAA,EAAkK;AAAA,EAElL;AAAA,IAAE,IAAI;AAAA,IAAkB,OAAO;AAAA,IAAmB,SAAS;AAAA,IAAQ,SAAS;AAAA,IAAK,QAAQ;AAAA,IACvF,OAAO;AAAA,IAAY,aAAa;AAAA,IAChC,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA;AAAA,IAC9D,YAAY;AAAA,IACZ,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,0BAA0B,CAAC;AAAA,IAC7E,YAAY,CAAC,EAAE,SAAS,kBAAkB,OAAO,GAAK,OAAO,UAAU,CAAC;AAAA,IACxE,cAAc,CAAC,EAAE,SAAS,eAAe,OAAO,UAAU,CAAC;AAAA,IAC3D,cAAc;AAAA,EAAoM;AAAA,EAEpN;AAAA,IAAE,IAAI;AAAA,IAAsB,OAAO;AAAA,IAA2B,SAAS;AAAA,IAAQ,SAAS;AAAA,IAAK,QAAQ;AAAA,IACnG,OAAO;AAAA,IAAY,aAAa;AAAA,IAChC,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA;AAAA,IAC9D,YAAY;AAAA,IACZ,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,aAAa,CAAC;AAAA,IAChE,YAAY,CAAC,EAAE,SAAS,iBAAiB,OAAO,KAAK,OAAO,UAAU,CAAC;AAAA,IACvE,cAAc,CAAC,EAAE,SAAS,cAAc,OAAO,UAAU,GAAG,EAAE,SAAS,cAAc,OAAO,UAAU,CAAC;AAAA,IACvG,cAAc;AAAA,EAA2L;AAAA,EAE3M;AAAA,IAAE,IAAI;AAAA,IAAwB,OAAO;AAAA,IAA6B,SAAS;AAAA,IAAQ,SAAS;AAAA,IAAK,QAAQ;AAAA,IACvG,OAAO;AAAA,IAAY,aAAa;AAAA,IAChC,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA;AAAA,IAC9D,YAAY;AAAA,IACZ,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,aAAa,CAAC;AAAA,IAChE,YAAY,CAAC,EAAE,SAAS,iBAAiB,OAAO,KAAK,OAAO,UAAU,CAAC;AAAA,IACvE,cAAc,CAAC,EAAE,SAAS,cAAc,OAAO,UAAU,GAAG,EAAE,SAAS,cAAc,OAAO,UAAU,CAAC;AAAA,IACvG,cAAc;AAAA,EAAqI;AAAA,EAErJ;AAAA,IAAE,IAAI;AAAA,IAAwB,OAAO;AAAA,IAA6B,SAAS;AAAA,IAAQ,SAAS;AAAA,IAAK,QAAQ;AAAA,IACvG,OAAO;AAAA,IAAY,aAAa;AAAA,IAChC,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA;AAAA,IAC9D,YAAY;AAAA,IACZ,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,aAAa,CAAC;AAAA,IAChE,YAAY,CAAC,EAAE,SAAS,iBAAiB,OAAO,KAAK,OAAO,UAAU,CAAC;AAAA,IACvE,cAAc,CAAC,EAAE,SAAS,cAAc,OAAO,UAAU,GAAG,EAAE,SAAS,cAAc,OAAO,UAAU,CAAC;AAAA,IACvG,cAAc;AAAA,EAAuI;AAAA,EAEvJ;AAAA,IAAE,IAAI;AAAA,IAAyB,OAAO;AAAA,IAA+B,SAAS;AAAA,IAAQ,SAAS;AAAA,IAAK,QAAQ;AAAA,IAC1G,OAAO;AAAA,IAAY,aAAa;AAAA,IAChC,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA;AAAA,IAC9D,YAAY;AAAA,IACZ,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,aAAa,CAAC;AAAA,IAChE,YAAY,CAAC,EAAE,SAAS,iBAAiB,OAAO,KAAK,OAAO,UAAU,CAAC;AAAA,IACvE,cAAc,CAAC,EAAE,SAAS,cAAc,OAAO,UAAU,GAAG,EAAE,SAAS,cAAc,OAAO,UAAU,CAAC;AAAA,IACvG,cAAc;AAAA,EAA0I;AAAA,EAE1J;AAAA,IAAE,IAAI;AAAA,IAAqB,OAAO;AAAA,IAA4B,SAAS;AAAA,IAAQ,SAAS;AAAA,IAAK,QAAQ;AAAA,IACnG,OAAO;AAAA,IAAY,aAAa;AAAA,IAChC,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA;AAAA,IAC9D,YAAY;AAAA,IACZ,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,eAAe,CAAC;AAAA,IAClE,YAAY,CAAC,EAAE,SAAS,mBAAmB,OAAO,KAAK,OAAO,UAAU,CAAC;AAAA,IACzE,cAAc,CAAC,EAAE,SAAS,gBAAgB,OAAO,UAAU,GAAG,EAAE,SAAS,gBAAgB,OAAO,UAAU,CAAC;AAAA,IAC3G,cAAc;AAAA,EAAmK;AAAA,EAEnL;AAAA,IAAE,IAAI;AAAA,IAAmB,OAAO;AAAA,IAAoB,SAAS;AAAA,IAAQ,SAAS;AAAA,IAAK,QAAQ;AAAA,IACzF,OAAO;AAAA,IAAY,aAAa;AAAA,IAChC,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA;AAAA,IAC9D,YAAY;AAAA,IACZ,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,2BAA2B,CAAC;AAAA,IAC9E,YAAY,CAAC,EAAE,SAAS,mBAAmB,OAAO,GAAK,OAAO,UAAU,CAAC;AAAA,IACzE,cAAc,CAAC,EAAE,SAAS,gBAAgB,OAAO,UAAU,CAAC;AAAA,IAC5D,cAAc;AAAA,EAAqM;AAAA,EAErN;AAAA,IAAE,IAAI;AAAA,IAAmB,OAAO;AAAA,IAAoB,SAAS;AAAA,IAAQ,SAAS;AAAA,IAAK,QAAQ;AAAA,IACzF,OAAO;AAAA,IAAY,aAAa;AAAA,IAChC,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA;AAAA,IAC9D,YAAY;AAAA,IACZ,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,SAAS,CAAC;AAAA,IAC5D,YAAY,CAAC,EAAE,SAAS,sBAAsB,OAAO,GAAK,OAAO,UAAU,GAAG,EAAE,SAAS,sBAAsB,OAAO,GAAK,OAAO,UAAU,CAAC;AAAA,IAC7I,cAAc,CAAC;AAAA,IACf,cAAc;AAAA,EAAkM;AAAA;AAAA,EAGlN;AAAA,IAAE,IAAI;AAAA,IAAe,OAAO;AAAA,IAAgB,SAAS;AAAA,IAAM,SAAS;AAAA,IAAK,QAAQ;AAAA,IAC/E,OAAO;AAAA,IAAU,aAAa;AAAA,IAC9B,UAAU;AAAA,IAAY,eAAe,CAAC,qBAAqB,YAAY;AAAA,IACvE,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,wCAAwC;AAAA,IACnF;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,cAAc,OAAO,KAAK,OAAO,UAAU;AAAA,IACxD;AAAA,IACA,cAAc;AAAA,MACZ,EAAE,SAAS,eAAe,OAAO,UAAU;AAAA,MAC3C,EAAE,SAAS,yBAAyB,OAAO,WAAW,SAAS,KAAK;AAAA,MACpE,EAAE,SAAS,oBAAoB,OAAO,WAAW,SAAS,IAAI;AAAA,MAC9D,EAAE,SAAS,mBAAmB,OAAO,WAAW,SAAS,KAAK;AAAA,IAChE;AAAA,IACA,cAAc;AAAA,EAA4U;AAAA,EAE5V;AAAA,IAAE,IAAI;AAAA,IAAe,OAAO;AAAA,IAAgB,SAAS;AAAA,IAAM,SAAS;AAAA,IAAK,QAAQ;AAAA,IAC/E,OAAO;AAAA,IAAU,aAAa;AAAA,IAC9B,UAAU;AAAA,IAAY,eAAe,CAAC,aAAa,OAAO;AAAA,IAC1D,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,sBAAsB;AAAA,IACjE;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,cAAc,OAAO,KAAK,OAAO,UAAU;AAAA,IACxD;AAAA,IACA,cAAc;AAAA,MACZ,EAAE,SAAS,aAAa,OAAO,UAAU;AAAA,MACzC,EAAE,SAAS,gBAAgB,OAAO,WAAW,SAAS,IAAI;AAAA,IAC5D;AAAA,IACA,cAAc;AAAA,EAA8O;AAAA,EAE9P;AAAA,IAAE,IAAI;AAAA,IAAgB,OAAO;AAAA,IAAiB,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IAClF,OAAO;AAAA,IAAU,aAAa;AAAA,IAC9B,UAAU;AAAA,IAAY,eAAe,CAAC,WAAW,aAAa;AAAA,IAC9D,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,uCAAuC;AAAA,IAClF;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,wBAAwB,OAAO,KAAK,OAAO,UAAU;AAAA,MAChE,EAAE,SAAS,cAAc,OAAO,GAAK,SAAS,QAAQ,OAAO,UAAU;AAAA,IACzE;AAAA,IACA,cAAc;AAAA,MACZ,EAAE,SAAS,aAAa,OAAO,UAAU;AAAA,MACzC,EAAE,SAAS,sBAAsB,OAAO,WAAW,SAAS,IAAI;AAAA,MAChE,EAAE,SAAS,uBAAuB,OAAO,WAAW,SAAS,IAAI;AAAA,IACnE;AAAA,IACA,cAAc;AAAA,EAAkS;AAAA,EAElT;AAAA,IAAE,IAAI;AAAA,IAAqB,OAAO;AAAA,IAAsB,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IAC5F,OAAO;AAAA,IAAU,aAAa;AAAA,IAC9B,UAAU;AAAA,IAAY,eAAe,CAAC,iBAAiB;AAAA,IACvD,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,kCAAkC;AAAA,IAC7E;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,aAAa,OAAO,KAAK,OAAO,UAAU;AAAA,IACvD;AAAA,IACA,cAAc;AAAA,MACZ,EAAE,SAAS,aAAa,OAAO,UAAU;AAAA,MACzC,EAAE,SAAS,aAAa,OAAO,WAAW,SAAS,IAAI;AAAA,IACzD;AAAA,IACA,cAAc;AAAA,EAAkR;AAAA,EAElS;AAAA,IAAE,IAAI;AAAA,IAAc,OAAO;AAAA,IAAuB,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IACtF,OAAO;AAAA,IAAU,aAAa;AAAA,IAC9B,UAAU;AAAA,IAAY,eAAe,CAAC,sBAAsB;AAAA,IAC5D,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,gCAAgC;AAAA,IAC3E;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,oBAAoB,OAAO,KAAK,SAAS,QAAQ,OAAO,UAAU;AAAA,MAC7E,EAAE,SAAS,oBAAoB,OAAO,KAAK,SAAS,QAAQ,OAAO,UAAU;AAAA,IAC/E;AAAA,IACA,cAAc;AAAA,MACZ,EAAE,SAAS,aAAa,OAAO,UAAU;AAAA,MACzC,EAAE,SAAS,gBAAgB,OAAO,WAAW,SAAS,IAAI;AAAA,IAC5D;AAAA,IACA,cAAc;AAAA,EAAiS;AAAA,EAEjT;AAAA,IAAE,IAAI;AAAA,IAAgB,OAAO;AAAA,IAAgB,SAAS;AAAA,IAAM,SAAS;AAAA,IAAK,QAAQ;AAAA,IAChF,OAAO;AAAA,IAAiB,aAAa;AAAA,IACrC,UAAU;AAAA,IAAY,eAAe,CAAC,eAAe,WAAW;AAAA,IAChE,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,mBAAmB,KAAK,WAAW,OAAO,YAAY;AAAA,MAC/D,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,2BAA2B;AAAA,MACpE,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,0BAA0B;AAAA,IACrE;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,mBAAmB,OAAO,KAAK,OAAO,UAAU;AAAA,MAC3D,EAAE,SAAS,gBAAgB,OAAO,GAAK,OAAO,UAAU;AAAA,MACxD,EAAE,SAAS,QAAQ,OAAO,KAAK,OAAO,UAAU;AAAA,MAChD,EAAE,SAAS,yBAAyB,OAAO,KAAK,OAAO,UAAU;AAAA,IACnE;AAAA,IACA,cAAc;AAAA,MACZ,EAAE,SAAS,aAAa,OAAO,UAAU;AAAA,MACzC,EAAE,SAAS,iBAAiB,OAAO,UAAU;AAAA,IAC/C;AAAA,IACA,cAAc;AAAA,EAAkT;AAAA,EAElU;AAAA,IAAE,IAAI;AAAA,IAAe,OAAO;AAAA,IAAe,SAAS;AAAA,IAAM,SAAS;AAAA,IAAK,QAAQ;AAAA,IAC9E,OAAO;AAAA,IAAiB,aAAa;AAAA,IACrC,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,mBAAmB,KAAK,WAAW,OAAO,aAAa;AAAA,MAChE,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,mBAAmB;AAAA,MAC5D,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,gBAAgB;AAAA,IAC3D;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,gBAAgB,OAAO,GAAK,OAAO,UAAU;AAAA,MACxD,EAAE,SAAS,QAAQ,OAAO,KAAK,OAAO,UAAU;AAAA,MAChD,EAAE,SAAS,yBAAyB,OAAO,KAAK,OAAO,UAAU;AAAA,IACnE;AAAA,IACA,cAAc;AAAA,MACZ,EAAE,SAAS,cAAc,OAAO,UAAU;AAAA,MAC1C,EAAE,SAAS,iBAAiB,OAAO,UAAU;AAAA,IAC/C;AAAA,IACA,cAAc;AAAA,EAA8N;AAAA;AAAA,EAG9O;AAAA,IAAE,IAAI;AAAA,IAAc,OAAO;AAAA,IAAc,SAAS;AAAA,IAAM,SAAS;AAAA,IAAK,QAAQ;AAAA,IAC5E,OAAO;AAAA,IAAa,aAAa;AAAA,IACjC,UAAU;AAAA,IAAY,eAAe,CAAC,oBAAoB,UAAU,OAAO;AAAA,IAC3E,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,sBAAsB;AAAA,MAC/D,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,eAAe;AAAA,IAC1D;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,aAAa,OAAO,KAAK,OAAO,UAAU;AAAA,MACrD,EAAE,SAAS,cAAc,OAAO,GAAK,OAAO,UAAU;AAAA,MACtD,EAAE,SAAS,aAAa,OAAO,KAAK,OAAO,UAAU;AAAA,IACvD;AAAA,IACA,cAAc;AAAA,MACZ,EAAE,SAAS,aAAa,OAAO,UAAU;AAAA,IAC3C;AAAA,IACA,cAAc;AAAA,EAA6U;AAAA,EAE7V;AAAA,IAAE,IAAI;AAAA,IAAqB,OAAO;AAAA,IAA6B,SAAS;AAAA,IAAM,SAAS;AAAA,IAAK,QAAQ;AAAA,IAClG,OAAO;AAAA,IAAa,aAAa;AAAA,IACjC,UAAU;AAAA,IAAY,eAAe,CAAC,cAAc,YAAY;AAAA,IAChE,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,6BAA6B;AAAA,IACxE;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,oBAAoB,OAAO,GAAK,SAAS,QAAQ,OAAO,UAAU;AAAA,MAC7E,EAAE,SAAS,oBAAoB,OAAO,KAAK,SAAS,QAAQ,OAAO,UAAU;AAAA,IAC/E;AAAA,IACA,cAAc;AAAA,MACZ,EAAE,SAAS,cAAc,OAAO,UAAU;AAAA,IAC5C;AAAA,IACA,cAAc;AAAA,EAA2S;AAAA;AAAA,EAG3T;AAAA,IAAE,IAAI;AAAA,IAAiB,OAAO;AAAA,IAAkB,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IACpF,OAAO;AAAA,IAAU,aAAa;AAAA,IAC9B,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA,IAAG,eAAe,CAAC,QAAQ,SAAS;AAAA,IAClG,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,kCAAkC;AAAA,IAC7E;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,kBAAkB,OAAO,KAAK,OAAO,UAAU;AAAA,MAC1D,EAAE,SAAS,cAAc,OAAO,KAAK,OAAO,UAAU;AAAA,MACtD,EAAE,SAAS,cAAc,OAAO,GAAK,OAAO,UAAU;AAAA,IACxD;AAAA,IACA,cAAc,CAAC;AAAA,IACf,cAAc;AAAA,EAA+R;AAAA,EAE/S;AAAA,IAAE,IAAI;AAAA,IAAmB,OAAO;AAAA,IAAoB,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IACxF,OAAO;AAAA,IAAU,aAAa;AAAA,IAC9B,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA,IAAG,eAAe,CAAC,WAAW,MAAM;AAAA,IAClG,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,wBAAwB,KAAK,WAAW,OAAO,8DAA8D;AAAA,IACxH;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,kBAAkB,OAAO,KAAK,OAAO,UAAU;AAAA,MAC1D,EAAE,SAAS,cAAc,OAAO,GAAK,OAAO,UAAU;AAAA,MACtD,EAAE,SAAS,oBAAoB,OAAO,KAAK,SAAS,UAAU,OAAO,UAAU;AAAA,IACjF;AAAA,IACA,cAAc,CAAC;AAAA,IACf,cAAc;AAAA,EAAkV;AAAA,EAElW;AAAA,IAAE,IAAI;AAAA,IAAmB,OAAO;AAAA,IAAoB,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IACxF,OAAO;AAAA,IAAU,aAAa;AAAA,IAC9B,UAAU;AAAA,IAAY,eAAe,CAAC,WAAW;AAAA,IACjD,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,wBAAwB,KAAK,WAAW,OAAO,mDAAmD;AAAA,IAC7G;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,iBAAiB,OAAO,KAAK,OAAO,UAAU;AAAA,MACzD,EAAE,SAAS,oBAAoB,OAAO,KAAK,OAAO,UAAU;AAAA,MAC5D,EAAE,SAAS,kBAAkB,OAAO,KAAK,OAAO,UAAU;AAAA,IAC5D;AAAA,IACA,cAAc,CAAC;AAAA,IACf,cAAc;AAAA,EAA8W;AAAA;AAAA,EAG9X;AAAA,IAAE,IAAI;AAAA,IAAc,OAAO;AAAA,IAAc,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IAC7E,OAAO;AAAA,IAAS,aAAa;AAAA,IAC7B,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA;AAAA,IAC9D,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,aAAa;AAAA,IACxD;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,gBAAgB,OAAO,GAAK,OAAO,UAAU;AAAA,MACxD,EAAE,SAAS,kBAAkB,OAAO,GAAK,OAAO,UAAU;AAAA,IAC5D;AAAA,IACA,cAAc,CAAC;AAAA,IACf,cAAc;AAAA,EAAmQ;AAAA,EAEnR;AAAA,IAAE,IAAI;AAAA,IAAmB,OAAO;AAAA,IAAoB,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IACxF,OAAO;AAAA,IAAS,aAAa;AAAA,IAC7B,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA,IAAG,eAAe,CAAC,QAAQ;AAAA,IACzF,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,wBAAwB,KAAK,WAAW,OAAO,8CAA8C;AAAA,IACxG;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,iBAAiB,OAAO,KAAK,OAAO,UAAU;AAAA,MACzD,EAAE,SAAS,mBAAmB,OAAO,KAAK,OAAO,UAAU;AAAA,MAC3D,EAAE,SAAS,mBAAmB,OAAO,KAAK,OAAO,UAAU;AAAA,MAC3D,EAAE,SAAS,mBAAmB,OAAO,KAAK,OAAO,UAAU;AAAA,IAC7D;AAAA,IACA,cAAc,CAAC;AAAA,IACf,cAAc;AAAA,EAAyR;AAAA,EAEzS;AAAA,IAAE,IAAI;AAAA,IAAwB,OAAO;AAAA,IAA2B,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IACpG,OAAO;AAAA,IAAS,aAAa;AAAA,IAC7B,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA;AAAA,IAC9D,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,kCAAkC;AAAA,IAC7E;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,gBAAgB,OAAO,KAAK,OAAO,UAAU;AAAA,MACxD,EAAE,SAAS,kBAAkB,OAAO,KAAK,OAAO,UAAU;AAAA,MAC1D,EAAE,SAAS,oBAAoB,OAAO,KAAK,SAAS,QAAQ,OAAO,UAAU;AAAA,IAC/E;AAAA,IACA,cAAc,CAAC;AAAA,IACf,cAAc;AAAA,EAA8S;AAAA;AAAA,EAG9T;AAAA,IAAE,IAAI;AAAA,IAAe,OAAO;AAAA,IAAe,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IAC/E,OAAO;AAAA,IAAgB,aAAa;AAAA,IACpC,UAAU;AAAA,IAAY,eAAe,CAAC,WAAW,QAAQ;AAAA,IACzD,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,wBAAwB,KAAK,WAAW,OAAO,mDAAmD;AAAA,IAC7G;AAAA,IACA,YAAY;AAAA,MACV,EAAE,SAAS,gBAAgB,OAAO,KAAK,OAAO,UAAU;AAAA,MACxD,EAAE,SAAS,kBAAkB,OAAO,KAAK,OAAO,UAAU;AAAA,MAC1D,EAAE,SAAS,oBAAoB,OAAO,KAAK,SAAS,QAAQ,OAAO,UAAU;AAAA,IAC/E;AAAA,IACA,cAAc,CAAC;AAAA,IACf,cAAc;AAAA,EAAkR;AAAA;AAAA,EAGlS;AAAA,IAAE,IAAI;AAAA,IAAkB,OAAO;AAAA,IAAmB,SAAS;AAAA,IAAS,SAAS;AAAA,IAAK,QAAQ;AAAA,IACxF,OAAO;AAAA,IAAa,aAAa;AAAA,IACjC,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA,IAC9D,YAAY;AAAA,IACZ,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,mCAAmC,CAAC;AAAA,IACtF,YAAY,CAAC,EAAE,SAAS,oBAAoB,OAAO,KAAK,OAAO,UAAU,GAAG,EAAE,SAAS,mBAAmB,OAAO,KAAK,SAAS,QAAQ,OAAO,UAAU,CAAC;AAAA,IACzJ,cAAc,CAAC,EAAE,SAAS,SAAS,OAAO,UAAU,GAAG,EAAE,SAAS,iBAAiB,OAAO,UAAU,CAAC;AAAA,IACrG,cAAc;AAAA,EAAoP;AAAA,EAEpQ;AAAA,IAAE,IAAI;AAAA,IAAkB,OAAO;AAAA,IAAmB,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IACtF,OAAO;AAAA,IAAa,aAAa;AAAA,IACjC,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA,IAC9D,YAAY;AAAA,IACZ,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,mCAAmC,CAAC;AAAA,IACtF,YAAY,CAAC,EAAE,SAAS,iBAAiB,OAAO,KAAK,OAAO,UAAU,GAAG,EAAE,SAAS,mBAAmB,OAAO,KAAK,SAAS,QAAQ,OAAO,UAAU,CAAC;AAAA,IACtJ,cAAc,CAAC,EAAE,SAAS,cAAc,OAAO,UAAU,GAAG,EAAE,SAAS,aAAa,OAAO,UAAU,CAAC;AAAA,IACtG,cAAc;AAAA,EAAqP;AAAA,EAErQ;AAAA,IAAE,IAAI;AAAA,IAAoB,OAAO;AAAA,IAAqB,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IAC1F,OAAO;AAAA,IAAa,aAAa;AAAA,IACjC,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA,IAC9D,YAAY;AAAA,IACZ,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,uCAAuC,CAAC;AAAA,IAC1F,YAAY,CAAC,EAAE,SAAS,gBAAgB,OAAO,KAAK,OAAO,UAAU,GAAG,EAAE,SAAS,eAAe,OAAO,GAAK,OAAO,UAAU,GAAG,EAAE,SAAS,mBAAmB,OAAO,KAAK,SAAS,QAAQ,OAAO,UAAU,CAAC;AAAA,IAC/M,cAAc,CAAC,EAAE,SAAS,gBAAgB,OAAO,UAAU,CAAC;AAAA,IAC5D,cAAc;AAAA,EAA8N;AAAA,EAE9O;AAAA,IAAE,IAAI;AAAA,IAAsB,OAAO;AAAA,IAAuB,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IAC9F,OAAO;AAAA,IAAa,aAAa;AAAA,IACjC,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA,IAC9D,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,2BAA2B;AAAA,MACpE,EAAE,OAAO,mBAAmB,KAAK,WAAW,OAAO,OAAO;AAAA,IAC5D;AAAA,IACA,YAAY,CAAC,EAAE,SAAS,QAAQ,OAAO,KAAK,OAAO,UAAU,GAAG,EAAE,SAAS,gBAAgB,OAAO,KAAK,OAAO,UAAU,GAAG,EAAE,SAAS,mBAAmB,OAAO,KAAK,SAAS,QAAQ,OAAO,UAAU,CAAC;AAAA,IACxM,cAAc,CAAC,EAAE,SAAS,QAAQ,OAAO,UAAU,CAAC;AAAA,IACpD,cAAc;AAAA,EAAyN;AAAA,EAEzO;AAAA,IAAE,IAAI;AAAA,IAAqB,OAAO;AAAA,IAAsB,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IAC5F,OAAO;AAAA,IAAa,aAAa;AAAA,IACjC,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA,IAC9D,YAAY;AAAA,IACZ,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,uCAAuC,CAAC;AAAA,IAC1F,YAAY,CAAC,EAAE,SAAS,gBAAgB,OAAO,KAAK,OAAO,UAAU,GAAG,EAAE,SAAS,mBAAmB,OAAO,KAAK,SAAS,QAAQ,OAAO,UAAU,CAAC;AAAA,IACrJ,cAAc,CAAC,EAAE,SAAS,iBAAiB,OAAO,UAAU,GAAG,EAAE,SAAS,QAAQ,OAAO,UAAU,CAAC;AAAA,IACpG,cAAc;AAAA,EAA2O;AAAA,EAE3P;AAAA,IAAE,IAAI;AAAA,IAAqB,OAAO;AAAA,IAAsB,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IAC5F,OAAO;AAAA,IAAa,aAAa;AAAA,IACjC,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA,IAC9D,YAAY;AAAA,IACZ,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,qCAAqC,CAAC;AAAA,IACxF,YAAY,CAAC,EAAE,SAAS,SAAS,OAAO,KAAK,OAAO,UAAU,GAAG,EAAE,SAAS,aAAa,OAAO,KAAK,OAAO,UAAU,GAAG,EAAE,SAAS,mBAAmB,OAAO,KAAK,SAAS,QAAQ,OAAO,UAAU,CAAC;AAAA,IACtM,cAAc,CAAC,EAAE,SAAS,OAAO,OAAO,UAAU,CAAC;AAAA,IACnD,cAAc;AAAA,EAA0O;AAAA,EAE1P;AAAA,IAAE,IAAI;AAAA,IAAyB,OAAO;AAAA,IAA0B,SAAS;AAAA,IAAS,SAAS;AAAA,IAAK,QAAQ;AAAA,IACtG,OAAO;AAAA,IAAa,aAAa;AAAA,IACjC,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA,IAC9D,YAAY;AAAA,IACZ,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,sCAAsC,CAAC;AAAA,IACzF,YAAY,CAAC,EAAE,SAAS,SAAS,OAAO,KAAK,OAAO,UAAU,GAAG,EAAE,SAAS,UAAU,OAAO,KAAK,OAAO,UAAU,GAAG,EAAE,SAAS,mBAAmB,OAAO,KAAK,SAAS,QAAQ,OAAO,UAAU,CAAC;AAAA,IACnM,cAAc,CAAC,EAAE,SAAS,OAAO,OAAO,UAAU,CAAC;AAAA,IACnD,cAAc;AAAA,EAA0U;AAAA,EAE1V;AAAA,IAAE,IAAI;AAAA,IAAiB,OAAO;AAAA,IAAkB,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IACpF,OAAO;AAAA,IAAa,aAAa;AAAA,IACjC,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA,IAC9D,YAAY;AAAA,IACZ,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,8BAA8B,CAAC;AAAA,IACjF,YAAY,CAAC,EAAE,SAAS,gBAAgB,OAAO,KAAK,OAAO,UAAU,GAAG,EAAE,SAAS,cAAc,OAAO,KAAK,OAAO,UAAU,GAAG,EAAE,SAAS,mBAAmB,OAAO,KAAK,SAAS,QAAQ,OAAO,UAAU,CAAC;AAAA,IAC9M,cAAc,CAAC,EAAE,SAAS,QAAQ,OAAO,UAAU,GAAG,EAAE,SAAS,QAAQ,OAAO,UAAU,CAAC;AAAA,IAC3F,cAAc;AAAA,EAAyN;AAAA,EAEzO;AAAA,IAAE,IAAI;AAAA,IAA0B,OAAO;AAAA,IAA2B,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IACtG,OAAO;AAAA,IAAa,aAAa;AAAA,IACjC,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA,IAC9D,YAAY;AAAA,IACZ,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,uCAAuC,CAAC;AAAA,IAC1F,YAAY,CAAC,EAAE,SAAS,SAAS,OAAO,KAAK,OAAO,UAAU,GAAG,EAAE,SAAS,iBAAiB,OAAO,KAAK,OAAO,UAAU,GAAG,EAAE,SAAS,mBAAmB,OAAO,KAAK,SAAS,QAAQ,OAAO,UAAU,CAAC;AAAA,IAC1M,cAAc,CAAC;AAAA,IACf,cAAc;AAAA,EAAwO;AAAA,EAExP;AAAA,IAAE,IAAI;AAAA,IAAwB,OAAO;AAAA,IAAyB,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IAClG,OAAO;AAAA,IAAa,aAAa;AAAA,IACjC,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA,IAC9D,YAAY;AAAA,IACZ,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,+BAA+B,CAAC;AAAA,IAClF,YAAY,CAAC,EAAE,SAAS,SAAS,OAAO,KAAK,OAAO,UAAU,GAAG,EAAE,SAAS,cAAc,OAAO,KAAK,OAAO,UAAU,GAAG,EAAE,SAAS,mBAAmB,OAAO,KAAK,SAAS,QAAQ,OAAO,UAAU,CAAC;AAAA,IACvM,cAAc,CAAC;AAAA,IACf,cAAc;AAAA,EAAiM;AAAA,EAEjN;AAAA,IAAE,IAAI;AAAA,IAAwB,OAAO;AAAA,IAAyB,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IAClG,OAAO;AAAA,IAAa,aAAa;AAAA,IACjC,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA,IAC9D,YAAY;AAAA,IACZ,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,8BAA8B,CAAC;AAAA,IACjF,YAAY,CAAC,EAAE,SAAS,gBAAgB,OAAO,KAAK,OAAO,UAAU,GAAG,EAAE,SAAS,gBAAgB,OAAO,KAAK,OAAO,UAAU,GAAG,EAAE,SAAS,mBAAmB,OAAO,KAAK,SAAS,QAAQ,OAAO,UAAU,CAAC;AAAA,IAChN,cAAc,CAAC,EAAE,SAAS,aAAa,OAAO,UAAU,CAAC;AAAA,IACzD,cAAc;AAAA,EAAwQ;AAAA,EAExR;AAAA,IAAE,IAAI;AAAA,IAA0B,OAAO;AAAA,IAA2B,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IACtG,OAAO;AAAA,IAAa,aAAa;AAAA,IACjC,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA,IAC9D,YAAY;AAAA,IACZ,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,yCAAyC,CAAC;AAAA,IAC5F,YAAY,CAAC,EAAE,SAAS,aAAa,OAAO,KAAK,OAAO,UAAU,GAAG,EAAE,SAAS,cAAc,OAAO,KAAK,OAAO,UAAU,GAAG,EAAE,SAAS,mBAAmB,OAAO,KAAK,SAAS,QAAQ,OAAO,UAAU,CAAC;AAAA,IAC3M,cAAc,CAAC,EAAE,SAAS,YAAY,OAAO,UAAU,CAAC;AAAA,IACxD,cAAc;AAAA,EAA+P;AAAA,EAE/Q;AAAA,IAAE,IAAI;AAAA,IAAkB,OAAO;AAAA,IAAmB,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IACtF,OAAO;AAAA,IAAa,aAAa;AAAA,IACjC,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA,IAC9D,YAAY;AAAA,IACZ,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,iCAAiC,CAAC;AAAA,IACpF,YAAY,CAAC,EAAE,SAAS,gBAAgB,OAAO,GAAK,OAAO,UAAU,GAAG,EAAE,SAAS,kBAAkB,OAAO,GAAK,OAAO,UAAU,GAAG,EAAE,SAAS,mBAAmB,OAAO,KAAK,SAAS,QAAQ,OAAO,UAAU,CAAC;AAAA,IAClN,cAAc,CAAC;AAAA,IACf,cAAc;AAAA,EAAuP;AAAA,EAEvQ;AAAA,IAAE,IAAI;AAAA,IAAiB,OAAO;AAAA,IAAkB,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IACpF,OAAO;AAAA,IAAa,aAAa;AAAA,IACjC,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA,IAC9D,YAAY;AAAA,IACZ,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,uCAAuC,CAAC;AAAA,IAC1F,YAAY,CAAC,EAAE,SAAS,aAAa,OAAO,GAAK,OAAO,UAAU,GAAG,EAAE,SAAS,mBAAmB,OAAO,KAAK,SAAS,QAAQ,OAAO,UAAU,CAAC;AAAA,IAClJ,cAAc,CAAC,EAAE,SAAS,YAAY,OAAO,UAAU,CAAC;AAAA,IACxD,cAAc;AAAA,EAAsN;AAAA,EAEtO;AAAA,IAAE,IAAI;AAAA,IAAiB,OAAO;AAAA,IAAuB,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IACzF,OAAO;AAAA,IAAa,aAAa;AAAA,IACjC,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA,IAC9D,YAAY;AAAA,IACZ,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,kCAAkC,CAAC;AAAA,IACrF,YAAY,CAAC,EAAE,SAAS,gBAAgB,OAAO,KAAK,OAAO,UAAU,GAAG,EAAE,SAAS,cAAc,OAAO,KAAK,OAAO,UAAU,GAAG,EAAE,SAAS,mBAAmB,OAAO,KAAK,SAAS,QAAQ,OAAO,UAAU,CAAC;AAAA,IAC9M,cAAc,CAAC,EAAE,SAAS,aAAa,OAAO,UAAU,GAAG,EAAE,SAAS,YAAY,OAAO,UAAU,CAAC;AAAA,IACpG,cAAc;AAAA,EAA2O;AAAA;AAAA,EAG3P;AAAA,IAAE,IAAI;AAAA,IAAqB,OAAO;AAAA,IAAqB,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IAC3F,OAAO;AAAA,IAAkB,aAAa;AAAA,IACtC,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,+CAA+C,CAAC;AAAA,IAClG,YAAY,CAAC,EAAE,SAAS,kBAAkB,OAAO,KAAK,OAAO,UAAU,GAAG,EAAE,SAAS,oBAAoB,OAAO,GAAK,OAAO,UAAU,GAAG,EAAE,SAAS,oBAAoB,OAAO,GAAK,OAAO,UAAU,CAAC;AAAA,IACtM,cAAc,CAAC,EAAE,SAAS,cAAc,OAAO,UAAU,CAAC;AAAA,IAC1D,cAAc;AAAA,EAA+Q;AAAA,EAE/R;AAAA,IAAE,IAAI;AAAA,IAAS,OAAO;AAAA,IAAS,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IACnE,OAAO;AAAA,IAAkB,aAAa;AAAA,IACtC,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,yBAAyB,CAAC;AAAA,IAC5E,YAAY,CAAC,EAAE,SAAS,SAAS,OAAO,GAAK,OAAO,UAAU,GAAG,EAAE,SAAS,WAAW,OAAO,KAAK,OAAO,UAAU,GAAG,EAAE,SAAS,aAAa,OAAO,KAAK,SAAS,QAAQ,OAAO,UAAU,CAAC;AAAA,IAC9L,cAAc,CAAC,EAAE,SAAS,cAAc,OAAO,UAAU,CAAC;AAAA,IAC1D,cAAc;AAAA,EAAyR;AAAA,EAEzS;AAAA,IAAE,IAAI;AAAA,IAAgB,OAAO;AAAA,IAAkB,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ,MAAM,YAAY;AAAA,IACrG,cAAc,CAAC,OAAO,YAAY,YAAY,OAAO,OAAO;AAAA,IAC5D,OAAO;AAAA,IAAW,aAAa;AAAA,IAC/B,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA,IAC9D,YAAY;AAAA,IACZ,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,wBAAwB,CAAC;AAAA,IAC3E,YAAY,CAAC,EAAE,SAAS,QAAQ,OAAO,GAAK,OAAO,UAAU,GAAG,EAAE,SAAS,QAAQ,OAAO,KAAK,OAAO,UAAU,CAAC;AAAA,IACjH,cAAc,CAAC;AAAA,IACf,cAAc;AAAA,EAAwM;AAAA,EAExN;AAAA,IAAE,IAAI;AAAA,IAAkB,OAAO;AAAA,IAAoB,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ,MAAM,cAAc;AAAA,IAC3G,cAAc,CAAC,OAAO,YAAY,cAAc,OAAO,OAAO;AAAA,IAC9D,OAAO;AAAA,IAAW,aAAa;AAAA,IAC/B,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA,IAC9D,YAAY;AAAA,IACZ,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,kBAAkB,GAAG,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,6BAA6B,CAAC;AAAA,IAC9I,YAAY,CAAC,EAAE,SAAS,QAAQ,OAAO,GAAK,OAAO,UAAU,GAAG,EAAE,SAAS,eAAe,OAAO,KAAK,SAAS,QAAQ,OAAO,UAAU,CAAC;AAAA,IACzI,cAAc,CAAC;AAAA,IACf,cAAc;AAAA,EAA4M;AAAA,EAE5N;AAAA,IAAE,IAAI;AAAA,IAAkB,OAAO;AAAA,IAAoB,SAAS;AAAA,IAAS,SAAS;AAAA,IAAK,QAAQ,MAAM,cAAc;AAAA,IAC7G,cAAc,CAAC,OAAO,YAAY,cAAc,OAAO,OAAO;AAAA,IAC9D,OAAO;AAAA,IAAW,aAAa;AAAA,IAC/B,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA,IAC9D,YAAY;AAAA,IACZ,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,kBAAkB,GAAG,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,yBAAyB,CAAC;AAAA,IAC1I,YAAY,CAAC,EAAE,SAAS,QAAQ,OAAO,GAAK,OAAO,UAAU,GAAG,EAAE,SAAS,gBAAgB,OAAO,GAAK,OAAO,UAAU,CAAC;AAAA,IACzH,cAAc,CAAC,EAAE,SAAS,eAAe,OAAO,UAAU,CAAC;AAAA,IAC3D,cAAc;AAAA,EAA2O;AAAA,EAE3P;AAAA,IAAE,IAAI;AAAA,IAAgB,OAAO;AAAA,IAAkB,SAAS;AAAA,IAAS,SAAS;AAAA,IAAK,QAAQ,MAAM,YAAY;AAAA,IACvG,cAAc,CAAC,OAAO,YAAY,YAAY,OAAO,OAAO;AAAA,IAC5D,OAAO;AAAA,IAAW,aAAa;AAAA,IAC/B,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA,IAC9D,YAAY;AAAA,IACZ,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,kBAAkB,GAAG,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,eAAe,CAAC;AAAA,IAChI,YAAY,CAAC,EAAE,SAAS,QAAQ,OAAO,GAAK,OAAO,UAAU,GAAG,EAAE,SAAS,gBAAgB,OAAO,KAAK,OAAO,UAAU,CAAC;AAAA,IACzH,cAAc,CAAC,EAAE,SAAS,eAAe,OAAO,UAAU,CAAC;AAAA,IAC3D,cAAc;AAAA,EAAmN;AAAA,EAEnO;AAAA,IAAE,IAAI;AAAA,IAAkB,OAAO;AAAA,IAAoB,SAAS;AAAA,IAAS,SAAS;AAAA,IAAK,QAAQ,MAAM,cAAc;AAAA,IAC7G,cAAc,CAAC,OAAO,YAAY,cAAc,OAAO,OAAO;AAAA,IAC9D,OAAO;AAAA,IAAW,aAAa;AAAA,IAC/B,UAAU;AAAA,IAAY,cAAc;AAAA,IAAU,gBAAgB;AAAA,IAC9D,YAAY;AAAA,IACZ,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,eAAe,GAAG,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,cAAc,CAAC;AAAA,IAC5H,YAAY,CAAC,EAAE,SAAS,QAAQ,OAAO,GAAK,OAAO,UAAU,GAAG,EAAE,SAAS,cAAc,OAAO,KAAK,OAAO,UAAU,CAAC;AAAA,IACvH,cAAc,CAAC,EAAE,SAAS,eAAe,OAAO,UAAU,CAAC;AAAA,IAC3D,cAAc;AAAA,EAA2O;AAAA,EAE3P;AAAA,IAAE,IAAI;AAAA,IAAU,OAAO;AAAA,IAAa,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IACxE,OAAO;AAAA,IAAa,aAAa;AAAA,IACjC,UAAU;AAAA,IAAY,eAAe,CAAC,UAAU,cAAc;AAAA,IAC9D,YAAY;AAAA,IACZ,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,gBAAgB,CAAC;AAAA,IACnE,YAAY,CAAC,EAAE,SAAS,QAAQ,OAAO,KAAK,OAAO,UAAU,GAAG,EAAE,SAAS,SAAS,OAAO,KAAK,OAAO,UAAU,GAAG,EAAE,SAAS,QAAQ,OAAO,KAAK,OAAO,UAAU,GAAG,EAAE,SAAS,aAAa,OAAO,KAAK,OAAO,UAAU,CAAC;AAAA,IAC7N,cAAc,CAAC;AAAA,IACf,cAAc;AAAA,EAA6Q;AAAA;AAAA,EAG7R;AAAA,IAAE,IAAI;AAAA,IAAiB,OAAO;AAAA,IAAiB,SAAS;AAAA,IAAQ,SAAS;AAAA,IAAK,QAAQ;AAAA,IACpF,OAAO;AAAA,IAAY,aAAa;AAAA,IAChC,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,sBAAsB,CAAC;AAAA,IACzE,YAAY,CAAC,EAAE,SAAS,kBAAkB,OAAO,KAAK,OAAO,UAAU,CAAC;AAAA,IACxE,cAAc,CAAC;AAAA,IACf,cAAc;AAAA,EAA2Q;AAAA,EAE3R;AAAA,IAAE,IAAI;AAAA,IAAkB,OAAO;AAAA,IAAkB,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IACrF,OAAO;AAAA,IAAY,aAAa;AAAA,IAChC,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ;AAAA,MACN,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,aAAa;AAAA,MACtD,EAAE,OAAO,mBAAmB,KAAK,WAAW,OAAO,aAAa;AAAA,MAChE,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,yBAAyB;AAAA,IACpE;AAAA,IACA,YAAY,CAAC,EAAE,SAAS,QAAQ,OAAO,KAAK,OAAO,UAAU,GAAG,EAAE,SAAS,iBAAiB,OAAO,KAAK,OAAO,UAAU,CAAC;AAAA,IAC1H,cAAc,CAAC,EAAE,SAAS,cAAc,OAAO,UAAU,GAAG,EAAE,SAAS,cAAc,OAAO,UAAU,CAAC;AAAA,IACvG,cAAc;AAAA,EAAqR;AAAA,EAErS;AAAA,IAAE,IAAI;AAAA,IAAsB,OAAO;AAAA,IAAuB,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IAC9F,OAAO;AAAA,IAAY,aAAa;AAAA,IAChC,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,wBAAwB,CAAC;AAAA,IAC3E,YAAY,CAAC,EAAE,SAAS,kBAAkB,OAAO,KAAK,OAAO,UAAU,CAAC;AAAA,IACxE,cAAc,CAAC;AAAA,IACf,cAAc;AAAA,EAAqQ;AAAA;AAAA,EAGrR;AAAA,IAAE,IAAI;AAAA,IAAqB,OAAO;AAAA,IAAqB,SAAS;AAAA,IAAM,SAAS;AAAA,IAAK,QAAQ;AAAA,IAC1F,OAAO;AAAA,IAAU,aAAa;AAAA,IAC9B,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,2BAA2B,CAAC;AAAA,IAC9E,YAAY,CAAC,EAAE,SAAS,cAAc,OAAO,KAAK,OAAO,UAAU,CAAC;AAAA,IACpE,cAAc,CAAC,EAAE,SAAS,aAAa,OAAO,UAAU,CAAC;AAAA,IACzD,cAAc;AAAA,EAAgS;AAAA,EAEhT;AAAA,IAAE,IAAI;AAAA,IAAe,OAAO;AAAA,IAAe,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IAC/E,OAAO;AAAA,IAAU,aAAa;AAAA,IAC9B,UAAU;AAAA,IACV,YAAY;AAAA,IACZ,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,2BAA2B,CAAC;AAAA,IAC9E,YAAY,CAAC,EAAE,SAAS,cAAc,OAAO,KAAK,SAAS,QAAQ,OAAO,UAAU,CAAC;AAAA,IACrF,cAAc,CAAC,EAAE,SAAS,aAAa,OAAO,UAAU,CAAC;AAAA,IACzD,cAAc;AAAA,EAA6Q;AAC/R;AAWO,IAAM,aAAqC;AAAA;AAAA,EAEhD,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA;AAAA,EAER,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA;AAAA,EAER,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA;AAAA,EAER,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA;AAAA,EAER,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA;AAAA,EAER,QAAQ;AAAA;AAAA,EAER,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA;AAAA,EAER,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA;AAAA,EAER,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA;AAAA,EAER,QAAQ;AAAA;AAAA,EAER,QAAQ;AACV;AASO,SAAS,kBAAkB,WAAuC;AAEvE,MAAI,cAAc,UAAU;AAC1B,WAAO;AAAA,MACL;AAAA,MACA,CAAC,YAAY,CAAC,OAAO,QAAQ,GAAG,CAAC,OAAO,QAAQ,GAAG,CAAC;AAAA,MACpD;AAAA,MAAG;AAAA;AAAA,MACH;AAAA,MAAG;AAAA;AAAA,MACH;AAAA;AAAA,IACF;AAAA,EACF;AAGA,MAAI,cAAc,UAAU;AAC1B,WAAO;AAAA,MACL;AAAA,MACA,CAAC,YAAY,CAAC,OAAO,QAAQ,GAAG,CAAC,OAAO,QAAQ,GAAG,CAAC;AAAA,MACpD;AAAA,MAAG;AAAA;AAAA,MACH;AAAA,MAAG;AAAA;AAAA,MACH;AAAA,MAAG;AAAA;AAAA,MACH;AAAA,MAAG;AAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,MAAI,cAAc,UAAU;AAC1B,WAAO;AAAA,MACL;AAAA,MACA,CAAC,YAAY,CAAC,OAAO,QAAQ,GAAG,CAAC,OAAO,QAAQ,GAAG,CAAC;AAAA,MACpD;AAAA,MAAG;AAAA;AAAA,MACH;AAAA,MAAG;AAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,MAAI,cAAc,UAAU;AAC1B,WAAO;AAAA,MACL;AAAA,MACA,CAAC,YAAY,CAAC,OAAO,QAAQ,GAAG,CAAC,OAAO,QAAQ,GAAG,CAAC;AAAA,MACpD;AAAA,MAAG;AAAA;AAAA,MACH;AAAA,MAAG;AAAA;AAAA,MACH;AAAA,MAAG;AAAA;AAAA,MACH;AAAA,MAAG;AAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,MAAI,cAAc,UAAU;AAC1B,WAAO;AAAA,MACL;AAAA,MACA,CAAC,YAAY,CAAC,OAAO,QAAQ,GAAG,CAAC,OAAO,QAAQ,GAAG,CAAC;AAAA,MACpD;AAAA,MAAG;AAAA;AAAA,MACH;AAAA,MAAG;AAAA;AAAA,MACH;AAAA;AAAA,IACF;AAAA,EACF;AAMA,MAAI,cAAc,UAAU;AAC1B,UAAM,SAAoB,CAAC,YAAY,CAAC,OAAO,QAAQ,GAAG,CAAC,OAAO,QAAQ,GAAG,CAAC;AAC9E,UAAM,SAAoB,CAAC,YAAY,CAAC,OAAO,QAAQ,GAAG,CAAC,OAAO,QAAQ,GAAG,CAAC;AAC9E,WAAO;AAAA,MACL;AAAA,MACA,CAAC,MAAM,QAAQ,CAAC;AAAA,MAAG;AAAA,QACjB;AAAA,QAAS;AAAA,QACT;AAAA,QAAG;AAAA;AAAA,QACH;AAAA,QAAG;AAAA;AAAA,QACH;AAAA,QAAG;AAAA;AAAA,QACH;AAAA,QAAG;AAAA;AAAA,QACH;AAAA;AAAA,MACF;AAAA,MACA;AAAA,QACE;AAAA,QAAS;AAAA,QACT;AAAA,QAAG;AAAA;AAAA,QACH;AAAA,QAAG;AAAA;AAAA,QACH;AAAA,QAAG;AAAA;AAAA,QACH;AAAA,QAAG;AAAA;AAAA,QACH;AAAA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAQA,MAAI,cAAc,UAAU;AAC1B,WAAO;AAAA,MACL;AAAA,MACA,CAAC,YAAY,CAAC,OAAO,QAAQ,GAAG,CAAC,OAAO,QAAQ,GAAG,CAAC;AAAA,MACpD;AAAA,MAAI;AAAA;AAAA,MACJ;AAAA,MAAI;AAAA;AAAA,MACJ;AAAA,MAAI;AAAA;AAAA,MACJ;AAAA,MAAI;AAAA;AAAA,MACJ;AAAA,MAAI;AAAA;AAAA,MACJ;AAAA;AAAA,IACF;AAAA,EACF;AAGA,MAAI,cAAc,UAAU;AAC1B,WAAO;AAAA,MACL;AAAA,MACA,CAAC,YAAY,CAAC,OAAO,QAAQ,GAAG,CAAC,OAAO,QAAQ,GAAG,CAAC;AAAA,MACpD;AAAA,MAAG;AAAA;AAAA,MACH;AAAA,MAAG;AAAA;AAAA,MACH;AAAA,MAAG;AAAA;AAAA,MACH;AAAA,MAAG;AAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,MAAI,cAAc,UAAU;AAC1B,WAAO;AAAA,MACL;AAAA,MACA,CAAC,YAAY,CAAC,OAAO,QAAQ,GAAG,CAAC,OAAO,QAAQ,GAAG,CAAC;AAAA,MACpD;AAAA,MAAG;AAAA;AAAA,MACH;AAAA,MAAG;AAAA;AAAA,MACH;AAAA,MAAG;AAAA;AAAA,MACH;AAAA,MAAG;AAAA;AAAA,MACH;AAAA,MAAG;AAAA;AAAA,MACH;AAAA,MAAG;AAAA;AAAA,MACH;AAAA,MAAG;AAAA;AAAA,MACH;AAAA,MAAG;AAAA;AAAA,MACH;AAAA,MAAG;AAAA;AAAA,MACH;AAAA,MAAI;AAAA;AAAA,MACJ;AAAA,MAAI;AAAA;AAAA,MACJ;AAAA,MAAI;AAAA;AAAA,MACJ;AAAA,MAAI;AAAA;AAAA,MACJ;AAAA,IACF;AAAA,EACF;AAGA,MAAI,cAAc,UAAU;AAC1B,WAAO;AAAA,MACL;AAAA,MACA,CAAC,YAAY,CAAC,OAAO,QAAQ,GAAG,CAAC,OAAO,QAAQ,GAAG,CAAC;AAAA,MACpD;AAAA,MAAG;AAAA;AAAA,MACH;AAAA,MAAG;AAAA;AAAA,MACH;AAAA;AAAA,IACF;AAAA,EACF;AAGA,MAAI,cAAc,UAAU;AAC1B,WAAO;AAAA,MACL;AAAA,MACA,CAAC,YAAY,CAAC,OAAO,QAAQ,GAAG,CAAC,OAAO,QAAQ,GAAG,CAAC;AAAA,MACpD;AAAA,MAAG;AAAA;AAAA,MACH;AAAA,MAAG;AAAA;AAAA,MACH;AAAA,MAAG;AAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,MAAI,cAAc,UAAU;AAC1B,WAAO;AAAA,MACL;AAAA,MACA,CAAC,YAAY,CAAC,OAAO,QAAQ,GAAG,CAAC,OAAO,QAAQ,GAAG,CAAC;AAAA,MACpD;AAAA,MAAG;AAAA;AAAA,MACH;AAAA,MAAG;AAAA;AAAA,MACH;AAAA,MAAG;AAAA;AAAA,MACH;AAAA,MAAG;AAAA;AAAA,MACH;AAAA,IACF;AAAA,EACF;AAGA,MAAI,cAAc,UAAU;AAC1B,WAAO;AAAA,MACL;AAAA,MACA,CAAC,YAAY,CAAC,OAAO,QAAQ,GAAG,CAAC,OAAO,QAAQ,GAAG,CAAC;AAAA,MACpD;AAAA,MAAG;AAAA;AAAA,MACH;AAAA,MAAG;AAAA;AAAA,MACH;AAAA,MAAG;AAAA;AAAA,MACH;AAAA,MAAG;AAAA;AAAA,MACH;AAAA,MAAG;AAAA;AAAA,MACH;AAAA;AAAA,IACF;AAAA,EACF;AAGA,MAAI,cAAc,UAAU;AAC1B,WAAO;AAAA,MACL;AAAA,MACA,CAAC,YAAY,CAAC,OAAO,QAAQ,GAAG,CAAC,OAAO,QAAQ,GAAG,CAAC;AAAA,MACpD;AAAA,MAAG;AAAA;AAAA,MACH;AAAA,MAAG;AAAA;AAAA,MACH;AAAA;AAAA,IACF;AAAA,EACF;AAEA,SAAO,WAAW,SAAS,KAAK;AAClC;AASO,SAAS,mBAAmB,UAAiC;AAClE,QAAM,MAAM,iBAAiB,KAAK,CAAC,MAAM,EAAE,OAAO,QAAQ;AAC1D,SAAO,MAAM,IAAI,OAAO,IAAI;AAC9B;AAMO,IAAM,iBAAiC;AAAA,EAC5C,EAAE,IAAI,KAAK,OAAO,6BAA6B,aAAa,oHAAoH;AAAA,EAChL,EAAE,IAAI,KAAK,OAAO,UAAU,aAAa,4FAA4F;AAAA,EACrI,EAAE,IAAI,KAAK,OAAO,eAAe,aAAa,sEAAsE;AAAA,EACpH,EAAE,IAAI,KAAK,OAAO,iBAAiB,aAAa,iEAAiE;AAAA,EACjH,EAAE,IAAI,KAAK,OAAO,WAAW,aAAa,6DAA6D;AAAA,EACvG,EAAE,IAAI,KAAK,OAAO,aAAa,aAAa,+EAA+E;AAAA,EAC3H,EAAE,IAAI,KAAK,OAAO,WAAW,aAAa,mEAAmE;AAAA,EAC7G,EAAE,IAAI,KAAK,OAAO,0BAA0B,aAAa,wDAAwD;AAAA,EACjH,EAAE,IAAI,KAAK,OAAO,mBAAmB,aAAa,2DAA2D;AAAA,EAC7G,EAAE,IAAI,KAAK,OAAO,YAAY,aAAa,+DAA+D;AAAA,EAC1G,EAAE,IAAI,KAAK,OAAO,mBAAmB,aAAa,oEAAoE;AACxH;AAMO,IAAM,gBAA+B;AAAA,EAC1C,EAAE,IAAI,iBAAiB,OAAO,iBAAiB,SAAS,KAAK,aAAa,4FAAuF,WAAW,CAAC,YAAY,UAAU,EAAE;AAAA,EACrM,EAAE,IAAI,eAAe,OAAO,oBAAoB,SAAS,KAAK,aAAa,sFAAsF,WAAW,CAAC,aAAa,eAAe,kBAAkB,eAAe,YAAY,EAAE;AAAA,EACxP,EAAE,IAAI,kBAAkB,OAAO,kBAAkB,SAAS,KAAK,aAAa,6HAA6H,WAAW,CAAC,uBAAuB,uBAAuB,sBAAsB,oBAAoB,EAAE;AAAA,EAC/S,EAAE,IAAI,iBAAiB,OAAO,yBAAyB,SAAS,KAAK,aAAa,oFAAoF,WAAW,CAAC,wBAAwB,mBAAmB,gBAAgB,sBAAsB,EAAE;AAAA,EACrQ,EAAE,IAAI,WAAW,OAAO,WAAW,SAAS,KAAK,aAAa,0EAA0E,WAAW,CAAC,gBAAgB,KAAK,EAAE;AAAA,EAC3K,EAAE,IAAI,WAAW,OAAO,WAAW,SAAS,KAAK,aAAa,+GAA+G,WAAW,CAAC,uBAAuB,uBAAuB,mBAAmB,0BAA0B,qBAAqB,kBAAkB,WAAW,EAAE;AAAA,EACxU,EAAE,IAAI,YAAY,OAAO,YAAY,SAAS,KAAK,aAAa,uGAAuG,WAAW,CAAC,oBAAoB,gBAAgB,EAAE;AAAA,EACzN,EAAE,IAAI,YAAY,OAAO,YAAY,SAAS,KAAK,aAAa,yHAAyH,WAAW,CAAC,mBAAmB,qBAAqB,kBAAkB,sBAAsB,wBAAwB,wBAAwB,yBAAyB,qBAAqB,mBAAmB,iBAAiB,EAAE;AAAA,EACzZ,EAAE,IAAI,UAAU,OAAO,UAAU,SAAS,KAAK,aAAa,8GAA8G,WAAW,CAAC,eAAe,eAAe,gBAAgB,qBAAqB,YAAY,EAAE;AAAA,EACvQ,EAAE,IAAI,iBAAiB,OAAO,0BAA0B,SAAS,KAAK,aAAa,0EAA0E,WAAW,CAAC,gBAAgB,aAAa,EAAE;AAAA,EACxM,EAAE,IAAI,aAAa,OAAO,uBAAuB,SAAS,KAAK,aAAa,oGAAoG,WAAW,CAAC,cAAc,mBAAmB,EAAE;AAAA,EAC/N,EAAE,IAAI,UAAU,OAAO,UAAU,SAAS,KAAK,aAAa,qFAAgF,WAAW,CAAC,iBAAiB,mBAAmB,iBAAiB,EAAE;AAAA,EAC/M,EAAE,IAAI,SAAS,OAAO,SAAS,SAAS,KAAK,aAAa,oFAA+E,WAAW,CAAC,cAAc,mBAAmB,sBAAsB,EAAE;AAAA,EAC9M,EAAE,IAAI,gBAAgB,OAAO,gBAAgB,SAAS,KAAK,aAAa,gGAAgG,WAAW,CAAC,aAAa,EAAE;AAAA,EACnM,EAAE,IAAI,aAAa,OAAO,aAAa,SAAS,KAAK,aAAa,+FAA+F,WAAW,CAAC,kBAAkB,kBAAkB,oBAAoB,sBAAsB,qBAAqB,qBAAqB,yBAAyB,iBAAiB,0BAA0B,wBAAwB,wBAAwB,0BAA0B,kBAAkB,iBAAiB,eAAe,EAAE;AAAA,EACve,EAAE,IAAI,WAAW,OAAO,WAAW,SAAS,KAAK,aAAa,4FAA4F,WAAW,CAAC,gBAAgB,kBAAkB,kBAAkB,gBAAgB,gBAAgB,EAAE;AAAA,EAC5P,EAAE,IAAI,kBAAkB,OAAO,kBAAkB,SAAS,KAAK,aAAa,kDAAkD,WAAW,CAAC,qBAAqB,OAAO,EAAE;AAAA,EACxK,EAAE,IAAI,aAAa,OAAO,aAAa,SAAS,KAAK,aAAa,0CAA0C,WAAW,CAAC,QAAQ,EAAE;AAAA,EAClI,EAAE,IAAI,YAAY,OAAO,YAAY,SAAS,KAAK,aAAa,2FAA2F,WAAW,CAAC,iBAAiB,kBAAkB,oBAAoB,EAAE;AAAA,EAChO,EAAE,IAAI,UAAU,OAAO,mBAAmB,SAAS,KAAK,aAAa,2DAA2D,WAAW,CAAC,qBAAqB,aAAa,EAAE;AAClL;AAOO,SAAS,sBAA8B;AAC5C,QAAM,UAAU,iBAAiB,IAAI,CAAC,QAAQ;AAC5C,UAAM,MAAM,IAAI,OAAO;AAEvB,UAAM,QAAQ,IAAI,QAAQ,cAAc,EAAE,EAAE,QAAQ,WAAW,EAAE;AACjE,WAAO,iBAAiB,IAAI,EAAE,yBAAyB,KAAK;AAAA,EAC9D,CAAC;AAED,SAAO;AAAA;AAAA;AAAA,SAGA,iBAAiB,MAAM,2CAA0C,oBAAI,KAAK,GAAE,YAAY,CAAC;AAAA,EAChG,QAAQ,KAAK,IAAI,CAAC;AAAA;AAEpB;AAGO,SAAS,yBASb;AACD,QAAM,WAAgC,CAAC;AACvC,aAAW,OAAO,kBAAkB;AAClC,aAAS,IAAI,EAAE,IAAI;AAAA,MACjB,OAAO,IAAI;AAAA,MACX,SAAS,IAAI;AAAA,MACb,SAAS,IAAI;AAAA,MACb,GAAI,IAAI,SAAS,EAAE,OAAO,IAAI,MAAM;AAAA,MACpC,GAAI,IAAI,YAAY,EAAE,UAAU,IAAI,SAAS;AAAA,MAC7C,GAAI,IAAI,eAAe,EAAE,aAAa,IAAI,YAAY;AAAA,MACtD,GAAI,IAAI,gBAAgB,EAAE,cAAc,IAAI,aAAa;AAAA,MACzD,GAAI,IAAI,mBAAmB,UAAa,EAAE,gBAAgB,IAAI,eAAe;AAAA,IAC/E;AAAA,EACF;AACA,SAAO;AACT;;;ACx2EO,SAAS,gBAAgB,iBAAkC,MAA4B;AAC5F,MAAI,oBAAoB,OAAQ,QAAO;AACvC,MAAI,SAAS,MAAO,QAAO;AAC3B,MAAI,SAAS,WAAY,QAAO,oBAAoB,UAAU,oBAAoB;AAClF,SAAO,oBAAoB;AAC7B;AAKO,SAAS,gBAAgB,QAAqC;AACnE,MAAI,WAAW,UAAa,WAAW,QAAQ,WAAW,EAAG,QAAO;AACpE,MAAI,UAAU,KAAW,QAAO;AAChC,MAAI,UAAU,KAAS,QAAO;AAC9B,MAAI,UAAU,IAAQ,QAAO;AAC7B,MAAI,UAAU,KAAQ,QAAO;AAC7B,MAAI,UAAU,KAAQ,QAAO;AAC7B,MAAI,UAAU,KAAQ,QAAO;AAC7B,SAAO;AACT;AAEA,IAAM,yBAAyB,oBAAI,IAAI,CAAC,OAAO,OAAO,OAAO,KAAK,CAAC;AAMnE,IAAM,qBAAqB,oBAAI,IAAI,CAAC,UAAU,UAAU,UAAU,UAAU,UAAU,QAAQ,CAAC;AAU/F,IAAM,yBAAyB,oBAAI,IAAI;AAAA,EACrC;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EACxC;AAAA,EAAU;AAAA,EAAU;AAAA,EACpB;AAAA,EACA;AAAA,EAAU;AACZ,CAAC;AAEM,SAAS,qBAAqB,cAInC;AACA,MAAI,CAAC,aAAc,QAAO,EAAE,kBAAkB,OAAO,cAAc,KAAK;AACxE,QAAM,WAAW,uBAAuB,IAAI,YAAY;AACxD,SAAO;AAAA,IACL,kBAAkB;AAAA,IAClB,cAAc,CAAC;AAAA,IACf,eAAe,QAAQ;AAAA,EACzB;AACF;AAEA,IAAM,oBAAsE;AAAA,EAC1E,QAAQ,CAAC,GAAG,KAAK,IAAI,GAAG;AAAA,EACxB,QAAQ,CAAC,GAAG,KAAK,IAAI,GAAG;AAAA,EACxB,QAAQ,CAAC,GAAG,KAAK,IAAI,GAAG;AAAA,EACxB,QAAQ,CAAC,GAAG,KAAK,IAAI,CAAG;AAAA,EACxB,QAAQ,CAAC,GAAG,GAAK,IAAI,CAAG;AAAA,EACxB,QAAQ,CAAC,GAAG,GAAK,IAAI,CAAG;AAC1B;AAKA,SAAS,aACP,WACA,OACA,UACA,KAAqB,OACI;AACzB,QAAM,WAAoC,CAAC;AAE3C,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,KAAK,GAAG;AAMhD,QAAI,OAAO,UAAU,YAAY,qBAAqB,KAAK,KAAK,GAAG;AACjE,eAAS,GAAG,IAAI,aAAa,OAAO,EAAE;AAAA,IACxC,OAAO;AACL,eAAS,GAAG,IAAI;AAAA,IAClB;AAAA,EACF;AAGA,MAAI,cAAc,YAAY,aAAa,QAAQ;AACjD,aAAS,YAAY,IAAI,qBAAqB,EAAE;AAAA,EAClD,WAAW,cAAc,YAAY,aAAa,UAAU;AAC1D,aAAS,cAAc,IAAI,oBAAoB,EAAE;AAAA,EACnD,YAAY,cAAc,YAAY,cAAc,aAAa,aAAa,UAAU;AACtF,aAAS,cAAc,IAAI,sBAAsB,EAAE;AAAA,EACrD,YACG,cAAc,YAAY,cAAc,YAAY,cAAc,aACnE,aAAa,UACb;AACA,aAAS,cAAc,IAAI,qBAAqB,EAAE;AAAA,EACpD,WAAW,cAAc,YAAY,aAAa,QAAQ;AAIxD,aAAS,cAAc,IAAI,wBAAwB;AAAA,EACrD;AAEA,SAAO;AACT;AAKO,SAAS,aACd,WACA,UACA,KAAqB,OACN;AACf,QAAM,QAAQ,WAAW,SAAS;AAElC,MAAI,CAAC,OAAO;AACV,UAAM,OAAO,YAAY;AACzB,WAAO;AAAA,MACL;AAAA,MACA,OAAO,SAAS,SACZ,EAAE,cAAc,WAAW,gBAAgB,IAAI,IAC/C,SAAS,SACP,EAAE,cAAc,WAAW,cAAc,EAAE,IAC3C,EAAE,gBAAgB,WAAW,iBAAiB,GAAG,uBAAuB,EAAE;AAAA,IAClF;AAAA,EACF;AAEA,QAAM,gBAAgB,YAAY,MAAM,MAAM;AAE9C,MAAI,kBAAkB,YAAY,MAAM,MAAM,WAAW;AACvD,UAAM,WAAW,kBAAkB,SAAS;AAC5C,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO,CAAC;AAAA,MACR,QAAQ;AAAA,QACN,cAAc;AAAA,QACd,aAAa,CAAC,eAAe,CAAC,QAAQ,GAAG,CAAC,MAAM,GAAG,GAAG,MAAM,IAAI,MAAM,IAAI,MAAM,IAAI,IAAI;AAAA,QACxF,sBAAsB;AAAA,QACtB,yBAAyB;AAAA,QACzB,GAAI,MAAM,MAAM,UAAU,CAAC;AAAA,MAC7B;AAAA,IACF;AAAA,EACF;AAEA,MAAI,kBAAkB,YAAY,MAAM,MAAM,SAAS,UAAU;AAC/D,WAAO;AAAA,MACL,MAAM;AAAA,MACN,OAAO,EAAE,gBAAgB,WAAW,iBAAiB,GAAG,uBAAuB,GAAG,uBAAuB,aAAa,SAAS,EAAE,EAAE;AAAA,IACrI;AAAA,EACF;AAEA,MAAI,kBAAkB,MAAM,MAAM,MAAM;AACtC,UAAM,iBAAiB,mBAAmB,MAAM,MAAM,KAAK;AAC3D,UAAM,WAAW,aAAa,gBAAgB,EAAE;AAChD,UAAMC,SACJ,kBAAkB,SACd,EAAE,cAAc,UAAU,gBAAgB,IAAI,IAC9C,kBAAkB,SAChB,EAAE,cAAc,UAAU,cAAc,EAAE,IAC1C,EAAE,gBAAgB,UAAU,iBAAiB,GAAG,uBAAuB,EAAE;AACjF,WAAO,EAAE,MAAM,eAAe,OAAAA,OAAM;AAAA,EACtC;AAEA,QAAM,QAAQ,aAAa,WAAW,EAAE,GAAG,MAAM,MAAM,MAAM,GAAG,eAAe,EAAE;AAGjF,MAAI,kBAAkB,UAAU,mBAAmB,IAAI,SAAS,GAAG;AACjE,UAAM,cAAc,IAAI;AAAA,EAC1B;AAEA,MAAI,kBAAkB,UAAU,kBAAkB,SAAS,GAAG;AAC5D,UAAM,CAAC,IAAI,IAAI,IAAI,EAAE,IAAI,kBAAkB,SAAS;AACpD,UAAM,YAAY,IAAI,CAAC,eAAe,CAAC,QAAQ,GAAG,CAAC,MAAM,GAAG,IAAI,IAAI,IAAI,EAAE;AAAA,EAC5E;AAEA,QAAM,UAAU,uBAAuB,IAAI,SAAS,IAAI,SAAY,gBAAgB,MAAM,MAAM;AAChG,QAAM,SAAS,MAAM,MAAM,SAAS,EAAE,GAAG,MAAM,MAAM,OAAO,IAAI;AAChE,MAAI,kBAAkB,YAAY,QAAQ;AACxC,UAAM,YAAY,qBAAqB,MAAM,YAAY;AACzD,WAAO,oBAAoB,IAAI,UAAU;AACzC,QAAI,UAAU,aAAc,QAAO,eAAe,IAAI;AACtD,QAAI,UAAU,kBAAkB,OAAW,QAAO,iBAAiB,IAAI,UAAU;AAAA,EACnF;AAEA,SAAO,EAAE,MAAM,eAAe,OAAO,QAAQ,QAAQ;AACvD;AAEA,SAAS,mBAAmB,OAAwC;AAClE,aAAW,OAAO,CAAC,cAAc,cAAc,gBAAgB,qBAAqB,GAAG;AACrF,UAAM,IAAI,MAAM,GAAG;AACnB,QAAI,OAAO,MAAM,YAAY,SAAS,KAAK,CAAC,EAAG,QAAO;AAAA,EACxD;AACA,SAAO;AACT;AAEO,SAAS,eAAe,WAAmB;AAChD,SAAO,WAAW,SAAS,KAAK;AAClC;;;ACnNA,IAAM,cAAsC;AAAA,EAC1C,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AAAA,EACJ,IAAI;AACN;AAGA,IAAM,cAAsC;AAAA,EAC1C,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AAAA,EACH,IAAI;AACN;AAQA,IAAM,cAAuC;AAAA,EAC3C,CAAC,GAAG,GAAG;AAAA;AAAA,EACP,CAAC,GAAG,IAAI;AAAA;AAAA,EACR,CAAC,GAAG,IAAI;AAAA;AAAA,EACR,CAAC,GAAG,GAAG;AAAA;AAAA,EACP,CAAC,GAAG,IAAI;AAAA;AAAA,EACR,CAAC,GAAG,GAAG;AAAA;AAAA,EACP,CAAC,GAAG,GAAG;AAAA;AAAA,EACP,CAAC,GAAG,IAAI;AAAA;AAAA,EACR,CAAC,GAAG,GAAG;AAAA;AAAA,EACP,CAAC,IAAI,IAAI;AAAA;AAAA,EACT,CAAC,IAAI,IAAI;AAAA;AAAA,EACT,CAAC,IAAI,IAAI;AAAA;AAAA,EACT,CAAC,IAAI,IAAI;AAAA;AACX;AAMA,IAAM,cAAuC;AAAA,EAC3C,CAAC,GAAG,GAAG;AAAA;AAAA,EACP,CAAC,GAAG,GAAG;AAAA;AAAA,EACP,CAAC,GAAG,GAAG;AAAA;AAAA,EACP,CAAC,GAAG,IAAI;AAAA;AAAA,EACR,CAAC,GAAG,IAAI;AAAA;AAAA,EACR,CAAC,GAAG,IAAI;AAAA;AAAA,EACR,CAAC,GAAG,IAAI;AAAA;AAAA,EACR,CAAC,GAAG,GAAG;AAAA;AAAA,EACP,CAAC,GAAG,IAAI;AAAA;AAAA,EACR,CAAC,IAAI,GAAG;AAAA;AACV;AAEA,IAAM,UAAU;AAOhB,IAAM,0BAAmD;AAAA,EACvD;AAAA,EAAe,CAAC,QAAQ;AAAA,EAAG,CAAC,MAAM;AAAA,EAClC;AAAA,EAAI;AAAA,EACJ;AAAA,EAAI;AAAA,EACJ;AAAA,EAAI;AACN;AAQA,IAAM,qBAA+B,CAAC,oBAAoB;AAgB1D,SAAS,gBAAgB,aAAsB,MAAuB;AACpE,SAAO;AAAA,IACL;AAAA,IACA,CAAC,MAAM,CAAC,YAAY,IAAI,IAAI,KAAK,WAAW,GAAG,CAAC;AAAA,IAChD;AAAA,MACE;AAAA,MACA,CAAC,YAAY,IAAI,IAAI,KAAK,CAAC,UAAU,KAAK,aAAa,GAAG,CAAC;AAAA,MAC3D;AAAA,IACF;AAAA,EACF;AACF;AAYA,SAAS,6BAAsD;AAC7D,QAAM,YAAqB;AAAA,IACzB;AAAA,IACA,CAAC,YAAY,CAAC,OAAO,QAAQ,GAAG,CAAC,OAAO,QAAQ,GAAG,EAAE;AAAA,EACvD;AACA,QAAM,YAAqB;AAAA,IACzB;AAAA,IACA,CAAC,YAAY,CAAC,OAAO,QAAQ,GAAG,CAAC,OAAO,QAAQ,GAAG,EAAE;AAAA,EACvD;AAEA,QAAM,eAA0B,CAAC,MAAM;AACvC,aAAW,CAAC,MAAM,IAAI,KAAK,aAAa;AACtC,iBAAa,KAAK,gBAAgB,WAAW,IAAI,GAAG,IAAI;AAAA,EAC1D;AACA,eAAa,KAAK,EAAE;AAEpB,QAAM,cAAyB,CAAC,QAAQ;AACxC,aAAW,CAAC,MAAM,IAAI,KAAK,aAAa;AACtC,gBAAY,KAAK;AAAA,MACf;AAAA,MACA,gBAAgB,WAAW,IAAI;AAAA,MAC/B,IAAI,IAAI;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AACA,QAAM,eAAwB,CAAC,SAAS,aAAa,CAAC;AAEtD,SAAO,CAAC,UAAU,cAAc,YAAY;AAC9C;AAQA,IAAM,QAAQ;AAAA,EACZ,OAAO;AAAA,EACP,YAAY;AAAA,EACZ,aAAa;AAAA,EACb,cAAc;AAAA,EACd,MAAM;AAAA,EACN,SAAS;AAAA,EACT,WAAW;AAAA,EACX,iBAAiB;AAAA,EACjB,UAAU;AAAA,EACV,YAAY;AAAA,EACZ,cAAc;AAAA,EACd,aAAa;AAAA,EACb,OAAO;AACT;AAYA,IAAM,4BAA4B;AAAA,EAChC;AAAA,EACA,CAAC,SAAS,CAAC,YAAY,CAAC,OAAO,UAAU,GAAG,QAAQ,GAAG,GAAG,CAAC;AAAA,EAC3D;AACF;AAwEO,IAAM,iBAAgD;AAAA;AAAA,EAE3D,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA;AAAA;AAAA;AAAA,EAKR,QAAQ;AAAA;AAAA,EAGR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AAAA,EACR,QAAQ;AACV;AAGO,SAAS,iBAAiB,WAAkC;AACjE,SAAO,eAAe,SAAS,KAAK;AACtC;AAGO,SAAS,eACd,WACA,OAA2B,CAAC,GACH;AACzB,UAAQ,WAAW;AAAA,IACjB,KAAK,UAAU;AACb,YAAM,KAAqB,KAAK,cAAc;AAC9C,YAAM,gBAAgB,KAAK,iBAAiB;AAC5C,YAAM,WAAW,KAAK,qBAAqB;AAC3C,YAAM,SAAS,KAAK,sBAAsB;AAY1C,YAAM,eACJ,OAAO,QACH,EAAE,SAAS,SAAS,QAAQ,WAAW,MAAM,UAAU,IACvD,EAAE,SAAS,aAAa,SAAS,EAAE,GAAG,QAAQ,aAAa,SAAS,EAAE,GAAG,MAAM,aAAa,SAAS,EAAE,EAAE;AAE/G,YAAM,YAAY;AAAA,QAChB;AAAA,QACA,CAAC,YAAY,CAAC,OAAO,OAAO,GAAG,CAAC,OAAO,OAAO,GAAG,CAAC,OAAO,QAAQ,CAAC;AAAA,QAClE;AAAA,MACF;AACA,YAAM,YAAqC,WACtC;AAAA,QACC;AAAA,QACA,CAAC,KAAK,WAAW,aAAa;AAAA,QAC9B,aAAa;AAAA,QACb,aAAa;AAAA,MACf,IACC,aAAa;AAElB,YAAM,YAAY,aAAa;AAE/B,YAAM,YACJ,WAAW,aACP,CAAC,sBAAsB,mBAAmB,IAC1C,CAAC,mBAAmB;AAE1B,aAAO;AAAA,QACL,MAAM;AAAA;AAAA;AAAA;AAAA;AAAA,QAKN,WAAW;AAAA,UACT;AAAA,UACA,CAAC,OAAO,OAAO;AAAA,UACf,CAAC,OAAO,OAAO;AAAA,UACf,CAAC,OAAO,QAAQ;AAAA,QAClB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,QAMA,UAAU;AAAA,UACR;AAAA,UAAe,CAAC,QAAQ;AAAA,UAAG,CAAC,MAAM;AAAA,UAClC;AAAA,UAAG;AAAA,UACH;AAAA,UAAI;AAAA,UACJ;AAAA,UAAI;AAAA,UACJ;AAAA,UAAI;AAAA,QACN;AAAA,QACA;AAAA,QACA,eAAe;AAAA,QACf,eAAe;AAAA,QACf,YAAY,CAAC,GAAG,CAAC;AAAA,QACjB,UAAU;AAAA,QACV,SAAS;AAAA,QACT,QAAQ;AAAA,UACN,eAAe;AAAA,UACf,sBAAsB;AAAA;AAAA,UAEtB,gBAAgB;AAAA,UAChB,iBAAiB;AAAA;AAAA;AAAA,UAGjB,uBAAuB;AAAA;AAAA;AAAA;AAAA;AAAA,UAKvB,mBAAmB;AAAA,YACjB;AAAA,YACA,CAAC,YAAY,CAAC,OAAO,OAAO,GAAG,CAAC,OAAO,OAAO,GAAG,CAAC,OAAO,QAAQ,CAAC;AAAA,YAClE;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,IAEA,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW,CAAC,OAAO,QAAQ;AAAA,QAC3B,UAAU;AAAA,UACR;AAAA,UAAe,CAAC,QAAQ;AAAA,UAAG,CAAC,MAAM;AAAA,UAClC;AAAA,UAAG;AAAA,UACH;AAAA,UAAI;AAAA,UACJ;AAAA,UAAI;AAAA,QACN;AAAA,QACA,WAAW,MAAM;AAAA,QACjB,eAAe;AAAA,QACf,eAAe;AAAA,QACf,YAAY,CAAC,GAAG,CAAC;AAAA,QACjB,UAAU,CAAC,mBAAmB;AAAA,QAC9B,SAAS;AAAA,QACT,QAAQ;AAAA,UACN,eAAe;AAAA,UACf,sBAAsB;AAAA,UACtB,gBAAgB;AAAA,UAChB,iBAAiB;AAAA,UACjB,mBAAmB;AAAA,QACrB;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW,CAAC,OAAO,QAAQ;AAAA,QAC3B,UAAU;AAAA,QACV,WAAW;AAAA,QACX,eAAe;AAAA,QACf,eAAe;AAAA,QACf,YAAY,CAAC,GAAG,GAAG;AAAA,QACnB,SAAS;AAAA,MACX;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW,CAAC,YAAY,CAAC,OAAO,cAAc,GAAG,CAAC,OAAO,QAAQ,CAAC;AAAA,QAClE,UAAU;AAAA,QACV,UAAU;AAAA,QACV,WAAW;AAAA,QACX,eAAe;AAAA,QACf,eAAe;AAAA,QACf,YAAY,CAAC,GAAG,GAAG;AAAA,QACnB,SAAS;AAAA,MACX;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW,CAAC,YAAY,CAAC,OAAO,cAAc,GAAG,CAAC,OAAO,QAAQ,CAAC;AAAA,QAClE,UAAU;AAAA,QACV,UAAU;AAAA,QACV,WAAW;AAAA,QACX,eAAe;AAAA,QACf,eAAe;AAAA,QACf,YAAY,CAAC,GAAG,GAAG;AAAA,QACnB,SAAS;AAAA,MACX;AAAA,IAEF,KAAK;AAAA,IACL,KAAK;AAIH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW,CAAC,YAAY,CAAC,OAAO,cAAc,GAAG,CAAC,OAAO,QAAQ,CAAC;AAAA,QAClE,UAAU;AAAA,QACV,UAAU;AAAA,QACV,WAAW;AAAA,QACX,eAAe;AAAA,QACf,eAAe;AAAA,QACf,YAAY,CAAC,GAAG,GAAG;AAAA,QACnB,SAAS;AAAA,MACX;AAAA,IAEF,KAAK;AAAA,IACL,KAAK;AAGH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW,CAAC,YAAY,CAAC,OAAO,cAAc,GAAG,CAAC,OAAO,QAAQ,CAAC;AAAA,QAClE,UAAU;AAAA,QACV,UAAU;AAAA,QACV,WAAW;AAAA,QACX,eAAe;AAAA,QACf,eAAe;AAAA,QACf,YAAY,CAAC,GAAG,GAAG;AAAA,QACnB,SAAS;AAAA,MACX;AAAA,IAEF,KAAK;AAAA,IACL,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW,CAAC,YAAY,CAAC,OAAO,cAAc,GAAG,CAAC,OAAO,QAAQ,CAAC;AAAA,QAClE,UAAU;AAAA,QACV,UAAU;AAAA,QACV,WAAW;AAAA,QACX,eAAe;AAAA,QACf,eAAe;AAAA,QACf,YAAY,CAAC,GAAG,GAAG;AAAA,QACnB,SAAS;AAAA,MACX;AAAA,IAEF,KAAK;AAKH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW,CAAC,OAAO,aAAa;AAAA,QAChC,UAAU;AAAA,QACV,UAAU;AAAA,QACV,WAAW;AAAA,QACX,eAAe;AAAA,QACf,eAAe;AAAA,QACf,YAAY,CAAC,GAAK,CAAC;AAAA,QACnB,SAAS;AAAA,QACT,QAAQ;AAAA,UACN,eAAe;AAAA,QACjB;AAAA,MACF;AAAA,IAEF,KAAK,UAAU;AAIb,YAAM,aAAa;AAAA,QACjB;AAAA,QAAS,CAAC,aAAa,CAAC,YAAY,CAAC,OAAO,QAAQ,GAAG,CAAC,GAAG,CAAC;AAAA,QAC5D;AAAA,QAAG;AAAA,QACH;AAAA,QAAG;AAAA,QACH;AAAA,QAAG;AAAA,QACH;AAAA,QAAG;AAAA,QACH;AAAA,QAAG;AAAA,QACH;AAAA,QAAG;AAAA,QACH;AAAA,QAAG;AAAA,QACH;AAAA,QAAG;AAAA,QACH;AAAA,MACF;AAIA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW;AAAA,QACX,UAAU;AAAA,QACV,UAAU;AAAA,QACV,WAAW;AAAA,QACX,eAAe;AAAA,QACf,eAAe;AAAA,QACf,YAAY,CAAC,GAAK,GAAG;AAAA,QACrB,SAAS;AAAA,QACT,QAAQ;AAAA,UACN,eAAe;AAAA,UACf,sBAAsB;AAAA,UACtB,iBAAiB;AAAA,QACnB;AAAA,MACF;AAAA,IACF;AAAA,IAEA,KAAK;AAOH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW,CAAC,OAAO,QAAQ;AAAA,QAC3B,UAAU;AAAA,UACR;AAAA,UAAe,CAAC,QAAQ;AAAA,UAAG,CAAC,MAAM;AAAA,UAClC;AAAA,UAAG;AAAA,UACH;AAAA,UAAG;AAAA,UACH;AAAA,UAAI;AAAA,UACJ;AAAA,UAAI;AAAA,QACN;AAAA,QACA,WAAW,MAAM;AAAA,QACjB,eAAe;AAAA,QACf,eAAe;AAAA,QACf,YAAY,CAAC,GAAG,CAAC;AAAA,QACjB,UAAU,CAAC,kBAAkB;AAAA,QAC7B,SAAS;AAAA,QACT,QAAQ;AAAA,UACN,eAAe;AAAA,UACf,sBAAsB;AAAA,UACtB,gBAAgB;AAAA,UAChB,iBAAiB;AAAA,UACjB,uBAAuB;AAAA,UACvB,kBAAkB;AAAA,UAClB,mBAAmB;AAAA,QACrB;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW,CAAC,OAAO,QAAQ;AAAA,QAC3B,UAAU;AAAA,UACR;AAAA,UAAe,CAAC,QAAQ;AAAA,UAAG,CAAC,MAAM;AAAA,UAClC;AAAA,UAAG;AAAA,UACH;AAAA,UAAI;AAAA,UACJ;AAAA,UAAI;AAAA,QACN;AAAA,QACA,WAAW,MAAM;AAAA,QACjB,eAAe;AAAA,QACf,eAAe;AAAA,QACf,YAAY,CAAC,GAAG,CAAC;AAAA,QACjB,UAAU,CAAC,kBAAkB;AAAA,QAC7B,SAAS;AAAA,QACT,QAAQ;AAAA,UACN,eAAe;AAAA,UACf,sBAAsB;AAAA,UACtB,gBAAgB;AAAA,UAChB,iBAAiB;AAAA,UACjB,mBAAmB;AAAA,QACrB;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW,CAAC,OAAO,QAAQ;AAAA,QAC3B,UAAU;AAAA,UACR;AAAA,UAAe,CAAC,QAAQ;AAAA,UAAG,CAAC,MAAM;AAAA,UAClC;AAAA,UAAG;AAAA,UACH;AAAA,UAAI;AAAA,UACJ;AAAA,UAAI;AAAA,QACN;AAAA,QACA,WAAW,MAAM;AAAA,QACjB,eAAe;AAAA,QACf,eAAe;AAAA,QACf,YAAY,CAAC,GAAG,CAAC;AAAA,QACjB,UAAU,CAAC,kBAAkB;AAAA,QAC7B,SAAS;AAAA,QACT,QAAQ;AAAA,UACN,eAAe;AAAA,UACf,sBAAsB;AAAA,UACtB,gBAAgB;AAAA,UAChB,iBAAiB;AAAA,UACjB,mBAAmB;AAAA,QACrB;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW,CAAC,OAAO,QAAQ;AAAA,QAC3B,UAAU;AAAA,UACR;AAAA,UAAe,CAAC,QAAQ;AAAA,UAAG,CAAC,MAAM;AAAA,UAClC;AAAA,UAAI;AAAA,UACJ;AAAA,UAAI;AAAA,QACN;AAAA,QACA,WAAW,MAAM;AAAA,QACjB,eAAe;AAAA,QACf,eAAe;AAAA,QACf,YAAY,CAAC,GAAG,CAAC;AAAA,QACjB,UAAU,CAAC,kBAAkB;AAAA,QAC7B,SAAS;AAAA,QACT,QAAQ;AAAA,UACN,eAAe;AAAA,UACf,sBAAsB;AAAA,UACtB,gBAAgB;AAAA,UAChB,iBAAiB;AAAA,UACjB,mBAAmB;AAAA,QACrB;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW,CAAC,OAAO,QAAQ;AAAA,QAC3B,UAAU;AAAA,UACR;AAAA,UAAe,CAAC,QAAQ;AAAA,UAAG,CAAC,MAAM;AAAA,UAClC;AAAA,UAAG;AAAA,UACH;AAAA,UAAI;AAAA,UACJ;AAAA,UAAI;AAAA,QACN;AAAA,QACA,WAAW,MAAM;AAAA,QACjB,eAAe;AAAA,QACf,eAAe;AAAA,QACf,YAAY,CAAC,GAAG,CAAC;AAAA,QACjB,UAAU,CAAC,mBAAmB;AAAA,QAC9B,SAAS;AAAA,QACT,QAAQ;AAAA,UACN,eAAe;AAAA,UACf,sBAAsB;AAAA,UACtB,gBAAgB;AAAA,UAChB,iBAAiB;AAAA,UACjB,mBAAmB;AAAA,QACrB;AAAA,MACF;AAAA,IAEF,KAAK;AAGH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW,CAAC,OAAO,QAAQ;AAAA,QAC3B,UAAU;AAAA,UACR;AAAA,UAAe,CAAC,QAAQ;AAAA,UAAG,CAAC,MAAM;AAAA,UAClC;AAAA,UAAG;AAAA,UACH;AAAA,UAAI;AAAA,UACJ;AAAA,UAAI;AAAA,QACN;AAAA,QACA,WAAW,MAAM;AAAA,QACjB,eAAe;AAAA,QACf,eAAe;AAAA,QACf,YAAY,CAAC,GAAG,CAAC;AAAA,QACjB,UAAU,CAAC,mBAAmB;AAAA,QAC9B,SAAS;AAAA,QACT,QAAQ;AAAA,UACN,eAAe;AAAA,UACf,sBAAsB;AAAA,UACtB,gBAAgB;AAAA,UAChB,iBAAiB;AAAA,UACjB,uBAAuB;AAAA,UACvB,mBAAmB;AAAA,QACrB;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW,CAAC,OAAO,QAAQ;AAAA,QAC3B,UAAU;AAAA,QACV,WAAW;AAAA,QACX,eAAe;AAAA,QACf,eAAe;AAAA,QACf,YAAY,CAAC,GAAG,CAAG;AAAA,QACnB,SAAS;AAAA,QACT,QAAQ;AAAA,UACN,sBAAsB;AAAA,UACtB,iBAAiB;AAAA,QACnB;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW,CAAC,OAAO,QAAQ;AAAA,QAC3B,UAAU;AAAA,QACV,WAAW;AAAA,QACX,eAAe;AAAA,QACf,eAAe;AAAA,QACf,YAAY,CAAC,GAAG,GAAG;AAAA,QACnB,SAAS;AAAA,MACX;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW,CAAC,OAAO,QAAQ;AAAA,QAC3B,UAAU;AAAA,QACV,WAAW;AAAA,QACX,eAAe;AAAA,QACf,eAAe;AAAA,QACf,YAAY,CAAC,GAAG,GAAG;AAAA,QACnB,SAAS;AAAA,MACX;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW,CAAC,OAAO,QAAQ;AAAA,QAC3B,UAAU;AAAA,QACV,WAAW;AAAA,QACX,eAAe;AAAA,QACf,eAAe;AAAA,QACf,YAAY,CAAC,GAAG,CAAG;AAAA,QACnB,SAAS;AAAA,QACT,QAAQ;AAAA,UACN,sBAAsB;AAAA,UACtB,iBAAiB;AAAA,QACnB;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW,CAAC,OAAO,QAAQ;AAAA,QAC3B,UAAU;AAAA,QACV,WAAW;AAAA,QACX,eAAe;AAAA,QACf,eAAe;AAAA,QACf,YAAY,CAAC,GAAG,GAAG;AAAA,QACnB,SAAS;AAAA,QACT,QAAQ;AAAA,UACN,sBAAsB;AAAA,UACtB,iBAAiB;AAAA,QACnB;AAAA,MACF;AAAA,IAEF,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW,CAAC,OAAO,QAAQ;AAAA,QAC3B,UAAU;AAAA,UACR;AAAA,UAAe,CAAC,QAAQ;AAAA,UAAG,CAAC,MAAM;AAAA,UAClC;AAAA,UAAG;AAAA,UACH;AAAA,UAAI;AAAA,QACN;AAAA,QACA,WAAW,MAAM;AAAA,QACjB,eAAe;AAAA,QACf,eAAe;AAAA,QACf,YAAY,CAAC,GAAG,CAAC;AAAA,QACjB,UAAU,CAAC,mBAAmB;AAAA,QAC9B,SAAS;AAAA,QACT,QAAQ;AAAA,UACN,eAAe;AAAA,UACf,sBAAsB;AAAA,UACtB,gBAAgB;AAAA,UAChB,iBAAiB;AAAA,UACjB,mBAAmB;AAAA,QACrB;AAAA,MACF;AAAA,IAEF,KAAK;AAQH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW,2BAA2B;AAAA,QACtC,UAAU;AAAA,UACR;AAAA,UAAe,CAAC,QAAQ;AAAA,UAAG,CAAC,MAAM;AAAA,UAClC;AAAA,UAAI;AAAA,UACJ;AAAA,UAAI;AAAA,QACN;AAAA,QACA,WAAW,MAAM;AAAA,QACjB,eAAe;AAAA,QACf,eAAe;AAAA,QACf,YAAY,CAAC,GAAG,CAAC;AAAA,QACjB,UAAU,CAAC,kBAAkB;AAAA,QAC7B,SAAS;AAAA,QACT,QAAQ;AAAA,UACN,oBAAoB;AAAA,UACpB,eAAe;AAAA,UACf,sBAAsB;AAAA,UACtB,gBAAgB;AAAA,UAChB,iBAAiB;AAAA,UACjB,uBAAuB;AAAA,QACzB;AAAA,MACF;AAAA,IAEF,KAAK,UAAU;AAQb,YAAM,SAAkB,CAAC,YAAY,CAAC,OAAO,QAAQ,GAAG,CAAC;AACzD,YAAM,gBAAyB;AAAA,QAC7B;AAAA,QACA,CAAC,MAAM,QAAQ,CAAC;AAAA,QAChB,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,MAAM,CAAC,GAAG,OAAI;AAAA,QACjD,CAAC,UAAU,CAAC,aAAa,CAAC,SAAS,CAAC,OAAO,MAAM,CAAC,CAAC,GAAG,OAAI;AAAA,MAC5D;AACA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW;AAAA,QACX,UAAU;AAAA,UACR;AAAA,UAAe,CAAC,QAAQ;AAAA,UAAG,CAAC,MAAM;AAAA,UAClC;AAAA,UAAI;AAAA,UACJ;AAAA,UAAI;AAAA,QACN;AAAA,QACA,WAAW,MAAM;AAAA,QACjB,eAAe;AAAA,QACf,eAAe;AAAA,QACf,YAAY,CAAC,GAAG,CAAC;AAAA,QACjB,UAAU,CAAC,kBAAkB;AAAA,QAC7B,SAAS;AAAA,QACT,QAAQ;AAAA,UACN,oBAAoB;AAAA,UACpB,eAAe;AAAA,UACf,sBAAsB;AAAA,UACtB,gBAAgB;AAAA,UAChB,iBAAiB;AAAA,UACjB,uBAAuB;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAAA,IAEA,KAAK;AAKH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW,CAAC,OAAO,QAAQ;AAAA,QAC3B,UAAU;AAAA,UACR;AAAA,UAAe,CAAC,QAAQ;AAAA,UAAG,CAAC,MAAM;AAAA,UAClC;AAAA,UAAG;AAAA,UACH;AAAA,UAAI;AAAA,UACJ;AAAA,UAAI;AAAA,QACN;AAAA,QACA,WAAW;AAAA,QACX,eAAe;AAAA,QACf,eAAe;AAAA,QACf,YAAY,CAAC,GAAG,CAAC;AAAA,QACjB,UAAU,CAAC,kBAAkB;AAAA,QAC7B,SAAS;AAAA,QACT,QAAQ;AAAA,UACN,eAAe;AAAA,UACf,sBAAsB;AAAA,UACtB,gBAAgB;AAAA,UAChB,iBAAiB;AAAA,UACjB,mBAAmB;AAAA,QACrB;AAAA,MACF;AAAA,IAEF,KAAK;AAMH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW;AAAA,QACX,UAAU;AAAA,UACR;AAAA,UAAe,CAAC,QAAQ;AAAA,UAAG,CAAC,MAAM;AAAA,UAClC;AAAA,UAAI;AAAA,UACJ;AAAA,UAAI;AAAA,QACN;AAAA,QACA,WAAW;AAAA,QACX,eAAe;AAAA,QACf,eAAe;AAAA,QACf,YAAY,CAAC,GAAG,CAAC;AAAA,QACjB,UAAU,CAAC,kBAAkB;AAAA,QAC7B,SAAS;AAAA,QACT,QAAQ;AAAA,UACN,oBAAoB;AAAA,UACpB,eAAe;AAAA,UACf,sBAAsB;AAAA,UACtB,gBAAgB;AAAA,UAChB,iBAAiB;AAAA,UACjB,uBAAuB;AAAA,QACzB;AAAA,MACF;AAAA,IAEF,KAAK;AAAA,IACL,KAAK;AAAA,IACL,KAAK,UAAU;AAQb,YAAM,KAAqB,KAAK,cAAc;AAC9C,YAAM,SAAkB;AAAA,QACtB;AAAA,QACA,CAAC,YAAY,CAAC,OAAO,QAAQ,GAAG,CAAC,OAAO,QAAQ,GAAG,CAAC;AAAA,QACpD;AAAA,MACF;AACA,aAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW;AAAA,UACT;AAAA,UACA,CAAC,KAAK,QAAQ,CAAC;AAAA,UACf;AAAA,YAAC;AAAA,YACC,CAAC,aAAa,CAAC,KAAK,CAAC,SAAS,CAAC,KAAK,QAAQ,EAAE,CAAC,GAAG,EAAE,CAAC;AAAA,YACrD;AAAA,UACF;AAAA,UACA;AAAA,QACF;AAAA,QACA,UAAU;AAAA,UACR;AAAA,UAAe,CAAC,QAAQ;AAAA,UAAG,CAAC,MAAM;AAAA,UAClC;AAAA,UAAI;AAAA,UACJ;AAAA,UAAI;AAAA,QACN;AAAA,QACA,WAAW,aAAa,SAAS,EAAE;AAAA,QACnC,eAAe,aAAa,SAAS,EAAE;AAAA,QACvC,eAAe;AAAA;AAAA;AAAA;AAAA,QAIf,YAAY,CAAC,KAAK,IAAI;AAAA,QACtB,UAAU,CAAC,mBAAmB;AAAA,QAC9B,SAAS;AAAA,QACT,QAAQ;AAAA,UACN,eAAe;AAAA,UACf,sBAAsB;AAAA,UACtB,iBAAiB;AAAA,UACjB,gBAAgB;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,IAEA,KAAK;AAAA,IACL,KAAK,UAAU;AASb,YAAM,QAAQ,cAAc;AAC5B,aAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW;AAAA,UACT;AAAA,UACA,CAAC,OAAO,QAAQ;AAAA,UAChB,CAAC,UAAU,CAAC,aAAa,CAAC,OAAO,QAAQ,CAAC,GAAG,GAAG;AAAA,UAChD;AAAA,QACF;AAAA,QACA,UAAU;AAAA,UACR;AAAA,UAAe,CAAC,QAAQ;AAAA,UAAG,CAAC,MAAM;AAAA,UAClC;AAAA,UAAI;AAAA,UACJ;AAAA,UAAI;AAAA,UACJ;AAAA,UAAI;AAAA,QACN;AAAA,QACA,WAAW,QAAQ,YAAY;AAAA,QAC/B,eAAe;AAAA,QACf,eAAe;AAAA,QACf,YAAY,CAAC,GAAG,CAAC;AAAA,QACjB,UAAU,CAAC,mBAAmB;AAAA,QAC9B,SAAS;AAAA,QACT,QAAQ;AAAA,UACN,oBAAoB;AAAA,UACpB,eAAe;AAAA,UACf,kBAAkB;AAAA,UAClB,2BAA2B;AAAA,UAC3B,sBAAsB;AAAA,UACtB,iBAAiB;AAAA,UACjB,uBAAuB;AAAA,QACzB;AAAA,MACF;AAAA,IACF;AAAA,IAEA,KAAK;AACH,aAAO;AAAA,QACL,MAAM;AAAA,QACN,WAAW,CAAC,UAAU,CAAC,OAAO,QAAQ,GAAG,GAAG;AAAA,QAC5C,UAAU;AAAA,UACR;AAAA,UAAe,CAAC,QAAQ;AAAA,UAAG,CAAC,MAAM;AAAA,UAClC;AAAA,UAAI;AAAA,UACJ;AAAA,UAAI;AAAA,QACN;AAAA,QACA,WAAW;AAAA,QACX,eAAe;AAAA,QACf,eAAe;AAAA,QACf,YAAY,CAAC,GAAG,CAAC;AAAA,QACjB,UAAU,CAAC,mBAAmB;AAAA,QAC9B,SAAS;AAAA,QACT,QAAQ;AAAA,UACN,oBAAoB;AAAA,UACpB,eAAe;AAAA,UACf,kBAAkB;AAAA,UAClB,2BAA2B;AAAA,UAC3B,sBAAsB;AAAA,UACtB,iBAAiB;AAAA,QACnB;AAAA,MACF;AAAA,IAEF;AACE,aAAO;AAAA,EACX;AACF;AAKO,SAAS,gBACd,SACA,UACA,QACA,SACA,WAC+B;AAE/B,MAAI,WAAW,OAAO;AACtB,MAAI,WAAW,aAAa,UAAU,cAAc,GAAG;AACrD,QAAI,OAAO,aAAa,UAAU;AAChC,iBAAW,WAAW,UAAU;AAAA,IAClC,OAAO;AAEL,iBAAW,CAAC,KAAK,UAAU,WAAW,QAAQ;AAAA,IAChD;AAAA,EACF;AAEA,QAAM,OAAY;AAAA,IAChB,IAAI;AAAA,IACJ,MAAM;AAAA,IACN,QAAQ;AAAA,IACR,QAAQ;AAAA,MACN,YAAY,UAAU,YAAY;AAAA,MAClC,cAAc,OAAO;AAAA,MACrB,aAAa;AAAA,MACb,aAAa,OAAO,YAAY,CAAC,mBAAmB;AAAA,MACpD,eAAe,OAAO;AAAA,MACtB,eAAe;AAAA,MACf,sBAAsB,WAAW,gBAAgB;AAAA,MACjD,iBAAiB,CAAE,WAAW;AAAA,MAC9B,gBAAgB,WAAW,eAAe,IAAI;AAAA,MAC9C,GAAI,OAAO,UAAU,CAAC;AAAA,IACxB;AAAA,IACA,OAAO;AAAA,MACL,cAAc,OAAO;AAAA,MACrB,mBAAmB,OAAO;AAAA,MAC1B,mBAAmB,OAAO;AAAA,IAC5B;AAAA,EACF;AAGA,MAAI,WAAW,YAAY,UAAa,UAAU,YAAY,MAAM;AAClE,SAAK,UAAU,UAAU;AAAA,EAC3B,WAAW,WAAW,YAAY,MAAM;AAEtC,QAAI,OAAO,YAAY,OAAW,MAAK,UAAU,OAAO;AAAA,EAC1D,WAAW,OAAO,YAAY,QAAW;AACvC,SAAK,UAAU,OAAO;AAAA,EACxB;AAEA,SAAO;AACT;AAOO,SAAS,oBACd,IAC2B;AAC3B,QAAM,WAA8B,CAAC;AAErC,aAAW,KAAK,GAAG,UAAU;AAC3B,QAAI,CAAC,EAAE,SAAU;AAEjB,QAAI,EAAE,SAAS,SAAS,SAAS;AAC/B,YAAM,SAAS,EAAE,SAAS;AAC1B,YAAM,QAAQ,OAAO,UAAU,IAAI,OAAO,CAAC,IAAI;AAC/C,UAAI,SAAS,MAAM;AACjB,iBAAS,KAAK;AAAA,UACZ,MAAM;AAAA,UACN,UAAU,EAAE,MAAM,SAAS,aAAa,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE;AAAA,UAC/D,YAAY;AAAA,YACV,GAAG,EAAE;AAAA,YACL,OAAO,KAAK,MAAM,QAAQ,EAAE,IAAI,KAAK;AAAA,UACvC;AAAA,QACF,CAAC;AAAA,MACH;AAAA,IACF,WAAW,EAAE,SAAS,SAAS,cAAc;AAC3C,iBAAW,UAAU,EAAE,SAAS,aAAa;AAC3C,cAAM,QAAQ,OAAO,UAAU,IAAI,OAAO,CAAC,IAAI;AAC/C,YAAI,SAAS,MAAM;AACjB,mBAAS,KAAK;AAAA,YACZ,MAAM;AAAA,YACN,UAAU,EAAE,MAAM,SAAS,aAAa,CAAC,OAAO,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE;AAAA,YAC/D,YAAY;AAAA,cACV,GAAG,EAAE;AAAA,cACL,OAAO,KAAK,MAAM,QAAQ,EAAE,IAAI,KAAK;AAAA,YACvC;AAAA,UACF,CAAC;AAAA,QACH;AAAA,MACF;AAAA,IACF;AAAA,EACF;AAEA,SAAO,EAAE,MAAM,qBAAqB,SAAS;AAC/C;AAMO,SAAS,iBACd,IAC2B;AAC3B,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU,GAAG,SAAS,IAAI,CAAC,MAAM;AAC/B,YAAM,QAAQ,EAAE,cAAc,CAAC;AAC/B,YAAM,QAAkB,CAAC;AAGzB,YAAM,SAAS,OAAO,MAAM,MAAM;AAClC,UAAI,UAAU,YAAY,MAAM,EAAG,OAAM,KAAK,YAAY,MAAM,CAAC;AAGjE,YAAM,SAAS,OAAO,MAAM,MAAM;AAClC,UAAI,UAAU,YAAY,MAAM,EAAG,OAAM,KAAK,YAAY,MAAM,CAAC;AAGjE,YAAM,SAAS,OAAO,MAAM,MAAM;AAClC,UAAI,UAAU,SAAS,EAAG,OAAM,KAAK,SAAS,GAAG;AAEjD,YAAM,QAAQ,MAAM,SAAS,IAAI,MAAM,KAAK,GAAG,IAAI;AAEnD,aAAO;AAAA,QACL,GAAG;AAAA,QACH,YAAY,EAAE,GAAG,OAAO,aAAa,MAAM;AAAA,MAC7C;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAGO,IAAM,iBAAiB,oBAAI,IAAI;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,CAAC;AAGD,IAAM,uBAAuB,oBAAI,IAAI;AAAA,EACnC;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AAAA,EAAU;AACxE,CAAC;AAGD,IAAM,oBAA4C;AAAA,EAChD,GAAG;AAAA,EACH,GAAG;AAAA,EACH,GAAG;AACL;AAMO,SAAS,kBACd,IAC2B;AAC3B,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU,GAAG,SAAS,IAAI,CAAC,MAAM;AAC/B,YAAM,QAAQ,EAAE,cAAc,CAAC;AAC/B,YAAM,SAAS,MAAM;AACrB,UAAI,CAAC,OAAQ,QAAO;AAGpB,YAAM,QAAQ,OAAO,MAAM,iBAAiB;AAC5C,UAAI,CAAC,MAAO,QAAO;AAEnB,YAAM,cAAc,MAAM,CAAC;AAC3B,YAAM,aAAa,OAAO,MAAM,MAAM;AACtC,YAAM,SAAS,kBAAkB,UAAU;AAE3C,YAAM,QAAQ,SACV,GAAG,MAAM,KAAK,WAAW,MACzB,IAAI,WAAW;AAEnB,aAAO;AAAA,QACL,GAAG;AAAA,QACH,YAAY,EAAE,GAAG,OAAO,cAAc,MAAM;AAAA,MAC9C;AAAA,IACF,CAAC;AAAA,EACH;AACF;AAGO,SAAS,cAAc,WAA4B;AACxD,SAAO,qBAAqB,IAAI,SAAS;AAC3C;AAMO,SAAS,sBACd,IAC2B;AAC3B,QAAM,WAA8B,CAAC;AAErC,aAAW,KAAK,GAAG,UAAU;AAC3B,QAAI,CAAC,EAAE,YAAY,CAAC,EAAE,YAAY,OAAQ;AAE1C,UAAM,WAAW,uBAAuB,EAAE,QAAQ;AAClD,QAAI,CAAC,SAAU;AAEf,aAAS,KAAK;AAAA,MACZ,MAAM;AAAA,MACN,UAAU,EAAE,MAAM,SAAS,aAAa,SAAS;AAAA,MACjD,YAAY,EAAE,GAAG,EAAE,WAAW;AAAA,IAChC,CAAC;AAAA,EACH;AAEA,SAAO,EAAE,MAAM,qBAAqB,SAAS;AAC/C;AAKA,SAAS,uBAAuB,MAAiD;AAC/E,QAAM,SAAqB,CAAC;AAE5B,WAAS,QAAQ,GAAQ;AACvB,QAAI,OAAO,EAAE,CAAC,MAAM,UAAU;AAC5B,aAAO,KAAK,CAAC;AAAA,IACf,OAAO;AACL,iBAAW,OAAO,EAAG,SAAQ,GAAG;AAAA,IAClC;AAAA,EACF;AAEA,MAAI,KAAK,SAAS,aAAa,KAAK,SAAS,kBACzC,KAAK,SAAS,gBAAgB,KAAK,SAAS,qBAC5C,KAAK,SAAS,WAAW,KAAK,SAAS,cAAc;AACvD,YAAS,KAAa,WAAW;AAAA,EACnC;AAEA,MAAI,OAAO,WAAW,EAAG,QAAO;AAEhC,MAAI,OAAO,GAAG,OAAO;AACrB,aAAW,KAAK,QAAQ;AACtB,YAAQ,EAAE,CAAC;AACX,YAAQ,EAAE,CAAC;AAAA,EACb;AACA,SAAO,CAAC,OAAO,OAAO,QAAQ,OAAO,OAAO,MAAM;AACpD;;;ACn1CO,SAAS,mBAAmB,MAAsB;AACvD,MAAI,OAAO,EAAG,QAAO;AACrB,MAAI,OAAO,EAAG,QAAO;AACrB,MAAI,OAAO,GAAI,QAAO;AACtB,MAAI,OAAO,GAAI,QAAO;AACtB,SAAO;AACT;AAKA,SAAS,aAAa,GAA6C;AACjE,MAAI,CAAC,EAAE,SAAU,QAAO;AACxB,QAAM,IAAI,EAAE;AACZ,UAAQ,EAAE,MAAM;AAAA,IACd,KAAK;AACH,aAAO,CAAC,EAAE,YAAY,CAAC,GAAG,EAAE,YAAY,CAAC,CAAC;AAAA,IAC5C,KAAK;AACH,aAAO,EAAE,YAAY,SAAS,IAC1B,CAAC,EAAE,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC,IACzC;AAAA,IACN,KAAK;AACH,aAAO,EAAE,YAAY,SAAS,IAC1B,CAAC,EAAE,YAAY,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,CAAC,CAAC,IACzC;AAAA,IACN,KAAK;AACH,aAAO,EAAE,YAAY,SAAS,KAAK,EAAE,YAAY,CAAC,EAAE,SAAS,IACzD,CAAC,EAAE,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAC/C;AAAA,IACN,KAAK;AACH,aAAO,EAAE,YAAY,SAAS,KAAK,EAAE,YAAY,CAAC,EAAE,SAAS,IACzD,CAAC,EAAE,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IAC/C;AAAA,IACN,KAAK;AACH,aAAO,EAAE,YAAY,SAAS,KAC5B,EAAE,YAAY,CAAC,EAAE,SAAS,KAC1B,EAAE,YAAY,CAAC,EAAE,CAAC,EAAE,SAAS,IAC3B,CAAC,EAAE,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,IACrD;AAAA,IACN;AACE,aAAO;AAAA,EACX;AACF;AAOA,SAAS,gBAAgB,GAAoB,WAA2B;AACtE,MAAI,cAAc,UAAU;AAC1B,UAAM,IAAI,WAAW,EAAE,YAAY,SAAS,KAAK;AACjD,WAAO;AAAA,EACT;AAEA,QAAM,KAAK,EAAE,YAAY,UAAU,EAAE,YAAY,iBAAiB;AAClE,SAAO,OAAO,OAAO,WAAW,KAAK;AACvC;AAYO,SAAS,iBACd,IACA,WACA,aACA,QACA,MAC2B;AAC3B,QAAM,YAAY,MAAM,iBAAiB;AAGzC,MAAI,eAAe,aAAa,GAAG,SAAS,SAAS,KAAK;AACxD,WAAO;AAAA,EACT;AAGA,QAAM,YAAY,GAAG,SAAS,CAAC,GAAG,UAAU;AAC5C,MACE,cAAc,aACd,cAAc,gBACd;AACA,WAAO;AAAA,EACT;AAEA,QAAM,WAAW,MAAM,YAAY,mBAAmB,WAAW;AACjE,QAAM,EAAE,MAAM,OAAO,MAAM,MAAM,IAAI;AACrC,QAAM,UAAU,OAAO,QAAQ;AAC/B,QAAM,UAAU,QAAQ,SAAS;AAGjC,QAAM,QAAQ,UAAU;AACxB,QAAM,QAAQ,UAAU;AAGxB,QAAM,OAAO,oBAAI,IAA4D;AAE7E,aAAW,KAAK,GAAG,UAAU;AAC3B,UAAM,QAAQ,aAAa,CAAC;AAC5B,QAAI,CAAC,MAAO;AAEZ,UAAM,MAAM,KAAK,OAAO,MAAM,CAAC,IAAI,QAAQ,KAAK;AAChD,UAAM,MAAM,KAAK,OAAO,MAAM,CAAC,IAAI,SAAS,KAAK;AACjD,UAAM,MAAM,MAAM,WAAW;AAE7B,UAAM,MAAM,gBAAgB,GAAG,SAAS;AACxC,UAAM,WAAW,KAAK,IAAI,GAAG;AAE7B,QAAI,CAAC,YAAY,MAAM,SAAS,UAAU;AACxC,WAAK,IAAI,KAAK,EAAE,SAAS,GAAG,UAAU,IAAI,CAAC;AAAA,IAC7C;AAAA,EACF;AAEA,SAAO;AAAA,IACL,MAAM;AAAA,IACN,UAAU,MAAM,KAAK,KAAK,OAAO,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,OAAO;AAAA,EAC1D;AACF;AAKO,SAAS,mBAAmB,MAAsB;AACvD,MAAI,OAAO,EAAG,QAAO;AACrB,MAAI,OAAO,EAAG,QAAO;AACrB,MAAI,OAAO,GAAI,QAAO;AACtB,MAAI,QAAQ,GAAI,QAAO;AACvB,SAAO;AACT;;;AC3GO,IAAM,gBAA+B;AAAA;AAAA,EAG1C;AAAA,IAAE,cAAc;AAAA,IAAe,MAAM;AAAA,IAAiB,eAAe;AAAA,IAAU,SAAS;AAAA,IAAK,OAAO;AAAA,IAClG,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAO,YAAY,CAAC,yBAAyB,UAAU,iBAAiB,WAAW;AAAA,EAAE;AAAA,EAEjI;AAAA,IAAE,cAAc;AAAA,IAAgB,MAAM;AAAA,IAAkB,eAAe;AAAA,IAAU,SAAS;AAAA,IAAK,OAAO;AAAA,IACpG,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAO,YAAY,CAAC,0BAA0B,UAAU,WAAW;AAAA,EAAE;AAAA,EAEjH;AAAA,IAAE,cAAc;AAAA,IAAsB,MAAM;AAAA,IAAyB,eAAe;AAAA,IAAU,SAAS;AAAA,IAAK,OAAO;AAAA,IACjH,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAO,YAAY,CAAC,UAAU,WAAW;AAAA,EAAE;AAAA,EAEvF;AAAA,IAAE,cAAc;AAAA,IAAiB,MAAM;AAAA,IAAoB,eAAe;AAAA,IAAU,SAAS;AAAA,IAAK,OAAO;AAAA,IACvG,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAO,YAAY,CAAC,UAAU,iBAAiB,WAAW;AAAA,EAAE;AAAA,EAExG;AAAA,IAAE,cAAc;AAAA,IAAsB,MAAM;AAAA,IAAyB,eAAe;AAAA,IAAU,SAAS;AAAA,IAAK,OAAO;AAAA,IACjH,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAO,YAAY,CAAC,gCAAgC,UAAU,WAAW;AAAA,EAAE;AAAA,EAEvH;AAAA,IAAE,cAAc;AAAA,IAAoB,MAAM;AAAA,IAAsB,eAAe;AAAA,IAAU,SAAS;AAAA,IAAK,OAAO;AAAA,IAC5G,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAO,YAAY,CAAC,8BAA8B,WAAW;AAAA,EAAE;AAAA,EAE3G;AAAA,IAAE,cAAc;AAAA,IAAsB,MAAM;AAAA,IAAiC,eAAe;AAAA,IAAU,SAAS;AAAA,IAAK,OAAO;AAAA,IACzH,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAO,YAAY,CAAC,UAAU,eAAe;AAAA,EAAE;AAAA,EAE3F;AAAA,IAAE,cAAc;AAAA,IAAiB,MAAM;AAAA,IAAmB,eAAe;AAAA,IAAU,SAAS;AAAA,IAAK,OAAO;AAAA,IACtG,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAO,YAAY,CAAC,yBAAyB,UAAU,aAAa;AAAA,EAAE;AAAA,EAElH;AAAA,IAAE,cAAc;AAAA,IAAkB,MAAM;AAAA,IAAoB,eAAe;AAAA,IAAU,SAAS;AAAA,IAAK,OAAO;AAAA,IACxG,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAO,YAAY,CAAC,0BAA0B,QAAQ;AAAA,EAAE;AAAA,EAEpG;AAAA,IAAE,cAAc;AAAA,IAAwB,MAAM;AAAA,IAA2B,eAAe;AAAA,IAAU,SAAS;AAAA,IAAK,OAAO;AAAA,IACrH,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAO,YAAY,CAAC,QAAQ;AAAA,EAAE;AAAA,EAE1E;AAAA,IAAE,cAAc;AAAA,IAAmB,MAAM;AAAA,IAAsB,eAAe;AAAA,IAAU,SAAS;AAAA,IAAK,OAAO;AAAA,IAC3G,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAO,YAAY,CAAC,QAAQ;AAAA,EAAE;AAAA,EAE1E;AAAA,IAAE,cAAc;AAAA,IAAwB,MAAM;AAAA,IAA2B,eAAe;AAAA,IAAU,SAAS;AAAA,IAAK,OAAO;AAAA,IACrH,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAO,YAAY,CAAC,gCAAgC,QAAQ;AAAA,EAAE;AAAA,EAE1G;AAAA,IAAE,cAAc;AAAA,IAAW,MAAM;AAAA,IAAW,eAAe;AAAA,IAAU,SAAS;AAAA,IAAK,OAAO;AAAA,IACxF,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAO,YAAY,CAAC,uBAAuB,QAAQ;AAAA,EAAE;AAAA,EAEjG;AAAA,IAAE,cAAc;AAAA,IAAW,MAAM;AAAA,IAAW,eAAe;AAAA,IAAU,SAAS;AAAA,IAAK,OAAO;AAAA,IACxF,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAO,YAAY,CAAC,uBAAuB,UAAU,eAAe;AAAA,EAAE;AAAA,EAElH;AAAA,IAAE,cAAc;AAAA,IAA0B,MAAM;AAAA,IAA4B,eAAe;AAAA,IAAU,SAAS;AAAA,IAAK,OAAO;AAAA,IACxH,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAO,YAAY,CAAC,2BAA2B;AAAA,EAAE;AAAA;AAAA,EAI7F;AAAA,IAAE,cAAc;AAAA,IAA6B,MAAM;AAAA,IAAiC,SAAS;AAAA,IAAK,OAAO;AAAA,IACvG,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAgB,aAAa;AAAA,IAAM,YAAY,CAAC,uCAAuC,iCAAiC,UAAU;AAAA,EAAE;AAAA,EAEpJ;AAAA,IAAE,cAAc;AAAA,IAA8B,MAAM;AAAA,IAAkC,SAAS;AAAA,IAAK,OAAO;AAAA,IACzG,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAgB,aAAa;AAAA,IAAM,YAAY,CAAC,YAAY,sCAAsC;AAAA,EAAE;AAAA,EAEpH;AAAA,IAAE,cAAc;AAAA,IAA+B,MAAM;AAAA,IAAmC,SAAS;AAAA,IAAK,OAAO;AAAA,IAC3G,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAgB,aAAa;AAAA,IAAM,YAAY,CAAC,UAAU;AAAA,EAAE;AAAA,EAE5E;AAAA,IAAE,cAAc;AAAA,IAA2B,MAAM;AAAA,IAA8B,SAAS;AAAA,IAAK,OAAO;AAAA,IAClG,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAa,aAAa;AAAA,IAAM,YAAY,CAAC,aAAa;AAAA,EAAE;AAAA,EAE5E;AAAA,IAAE,cAAc;AAAA,IAA6B,MAAM;AAAA,IAAgC,SAAS;AAAA,IAAK,OAAO;AAAA,IACtG,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAgB,aAAa;AAAA,IAAM,YAAY,CAAC,mBAAmB;AAAA,EAAE;AAAA;AAAA,EAIrF;AAAA,IAAE,cAAc;AAAA,IAAS,MAAM;AAAA,IAAS,eAAe;AAAA,IAAU,SAAS;AAAA,IAAK,OAAO;AAAA,IACpF,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAO,YAAY,CAAC,mBAAmB,uBAAuB,kBAAkB,UAAU,aAAa;AAAA,EAAE;AAAA,EAErJ;AAAA,IAAE,cAAc;AAAA,IAAkB,MAAM;AAAA,IAAoB,eAAe;AAAA,IAAU,SAAS;AAAA,IAAK,OAAO;AAAA,IACxG,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAM,YAAY,CAAC,uBAAuB,kBAAkB,UAAU,UAAU,qBAAqB;AAAA,EAAE;AAAA,EAEnJ;AAAA,IAAE,cAAc;AAAA,IAAiB,MAAM;AAAA,IAAkB,eAAe;AAAA,IAAU,SAAS;AAAA,IAAK,OAAO;AAAA,IACrG,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAM,YAAY,CAAC,eAAe,uBAAuB,QAAQ;AAAA,EAAE;AAAA,EAE/G;AAAA,IAAE,cAAc;AAAA,IAAe,MAAM;AAAA,IAAgB,eAAe;AAAA,IAAU,SAAS;AAAA,IAAK,OAAO;AAAA,IACjG,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAO,YAAY,CAAC,QAAQ;AAAA,EAAE;AAAA,EAE1E;AAAA,IAAE,cAAc;AAAA,IAAc,MAAM;AAAA,IAAe,eAAe;AAAA,IAAU,SAAS;AAAA,IAAK,OAAO;AAAA,IAC/F,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAO,YAAY,CAAC,QAAQ;AAAA,EAAE;AAAA;AAAA,EAI1E;AAAA,IAAE,cAAc;AAAA,IAAa,MAAM;AAAA,IAAc,eAAe;AAAA,IAAU,SAAS;AAAA,IAAK,OAAO;AAAA,IAC7F,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAO,YAAY,CAAC,uBAAuB,gBAAgB;AAAA,EAAE;AAAA;AAAA,EAIzG;AAAA,IAAE,cAAc;AAAA,IAAgB,MAAM;AAAA,IAAiB,eAAe;AAAA,IAAU,SAAS;AAAA,IAAK,OAAO;AAAA,IACnG,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAO,YAAY,CAAC,wBAAwB;AAAA,EAAE;AAAA,EAE1F;AAAA,IAAE,cAAc;AAAA,IAA0B,MAAM;AAAA,IAA4B,eAAe;AAAA,IAAU,SAAS;AAAA,IAAK,OAAO;AAAA,IACxH,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAO,YAAY,CAAC,oBAAoB,gBAAgB;AAAA,EAAE;AAAA,EAEtG;AAAA,IAAE,cAAc;AAAA,IAAa,MAAM;AAAA,IAAc,SAAS;AAAA,IAAK,OAAO;AAAA,IACpE,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAM,YAAY,CAAC,eAAe,cAAc;AAAA,EAAE;AAAA,EAE9F;AAAA,IAAE,cAAc;AAAA,IAAc,MAAM;AAAA,IAAe,SAAS;AAAA,IAAK,OAAO;AAAA,IACtE,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAM,YAAY,CAAC,eAAe,cAAc;AAAA,EAAE;AAAA,EAE9F;AAAA,IAAE,cAAc;AAAA,IAAgB,MAAM;AAAA,IAAiB,eAAe;AAAA,IAAU,SAAS;AAAA,IAAK,OAAO;AAAA,IACnG,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAO,YAAY,CAAC,wBAAwB;AAAA,EAAE;AAAA;AAAA,EAI1F;AAAA,IAAE,cAAc;AAAA,IAAS,MAAM;AAAA,IAAS,eAAe;AAAA,IAAU,SAAS;AAAA,IAAK,OAAO;AAAA,IACpF,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAO,YAAY,CAAC,mBAAmB,mBAAmB,kBAAkB;AAAA,EAAE;AAAA,EAE1H;AAAA,IAAE,cAAc;AAAA,IAAuB,MAAM;AAAA,IAAyB,eAAe;AAAA,IAAU,SAAS;AAAA,IAAK,OAAO;AAAA,IAClH,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAO,YAAY,CAAC,mBAAmB,kBAAkB;AAAA,EAAE;AAAA,EAEvG;AAAA,IAAE,cAAc;AAAA,IAAe,MAAM;AAAA,IAAe,eAAe;AAAA,IAAU,SAAS;AAAA,IAAK,OAAO;AAAA,IAChG,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAO,YAAY,CAAC,yBAAyB,mBAAmB,kBAAkB;AAAA,EAAE;AAAA,EAEhI;AAAA,IAAE,cAAc;AAAA,IAAmB,MAAM;AAAA,IAAoB,SAAS;AAAA,IAAK,OAAO;AAAA,IAChF,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAM,YAAY,CAAC,2BAA2B;AAAA,EAAE;AAAA,EAE5F;AAAA,IAAE,cAAc;AAAA,IAAoB,MAAM;AAAA,IAAsB,SAAS;AAAA,IAAK,OAAO;AAAA,IACnF,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAM,YAAY,CAAC,iBAAiB;AAAA,EAAE;AAAA;AAAA,EAIlF;AAAA,IAAE,cAAc;AAAA,IAAY,MAAM;AAAA,IAAY,eAAe;AAAA,IAAU,SAAS;AAAA,IAAK,OAAO;AAAA,IAC1F,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAO,YAAY,CAAC,sBAAsB,YAAY,qBAAqB;AAAA,EAAE;AAAA;AAAA,EAIzH;AAAA,IAAE,cAAc;AAAA,IAAU,MAAM;AAAA,IAAU,eAAe;AAAA,IAAU,SAAS;AAAA,IAAK,OAAO;AAAA,IACtF,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAO,YAAY,CAAC,oBAAoB,0BAA0B,2BAA2B,0BAA0B;AAAA,EAAE;AAAA;AAAA,EAIrK;AAAA,IAAE,cAAc;AAAA,IAAoB,MAAM;AAAA,IAAqB,eAAe;AAAA,IAAU,SAAS;AAAA,IAAK,OAAO;AAAA,IAC3G,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAO,YAAY,CAAC,8BAA8B,SAAS;AAAA,EAAE;AAAA;AAAA,EAIzG;AAAA,IAAE,cAAc;AAAA,IAAiB,MAAM;AAAA,IAAkB,eAAe;AAAA,IAAU,SAAS;AAAA,IAAK,OAAO;AAAA,IACrG,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAO,YAAY,CAAC,uBAAuB,aAAa;AAAA,EAAE;AAAA,EAEtG;AAAA,IAAE,cAAc;AAAA,IAAkB,MAAM;AAAA,IAAmB,eAAe;AAAA,IAAU,SAAS;AAAA,IAAK,OAAO;AAAA,IACvG,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAO,YAAY,CAAC,4BAA4B,aAAa;AAAA,EAAE;AAAA,EAE3G;AAAA,IAAE,cAAc;AAAA,IAAoC,MAAM;AAAA,IAAwC,SAAS;AAAA,IAAK,OAAO;AAAA,IACrH,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAM,YAAY,CAAC,6BAA6B,iBAAiB;AAAA,EAAE;AAAA,EAE/G;AAAA,IAAE,cAAc;AAAA,IAAuB,MAAM;AAAA,IAAyB,SAAS;AAAA,IAAK,OAAO;AAAA,IACzF,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAM,YAAY,CAAC,+BAA+B;AAAA,EAAE;AAAA;AAAA,EAIhG;AAAA,IAAE,cAAc;AAAA,IAAoB,MAAM;AAAA,IAAqB,eAAe;AAAA,IAAU,SAAS;AAAA,IAAK,OAAO;AAAA,IAC3G,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAO,YAAY,CAAC,oBAAoB,aAAa;AAAA,EAAE;AAAA,EAEnG;AAAA,IAAE,cAAc;AAAA,IAA2B,MAAM;AAAA,IAA6B,eAAe;AAAA,IAAU,SAAS;AAAA,IAAK,OAAO;AAAA,IAC1H,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAY,aAAa;AAAA,IAAO,YAAY,CAAC,mCAAmC;AAAA,EAAE;AAAA,EAElG;AAAA,IAAE,cAAc;AAAA,IAAc,MAAM;AAAA,IAAe,eAAe;AAAA,IAAU,SAAS;AAAA,IAAK,OAAO;AAAA,IAC/F,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAO,YAAY,CAAC,sBAAsB;AAAA,EAAE;AAAA;AAAA,EAIxF;AAAA,IAAE,cAAc;AAAA,IAAgB,MAAM;AAAA,IAAiB,eAAe;AAAA,IAAU,SAAS;AAAA,IAAK,OAAO;AAAA,IACnG,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAO,YAAY,CAAC,iBAAiB;AAAA,EAAE;AAAA,EAEnF;AAAA,IAAE,cAAc;AAAA,IAAiB,MAAM;AAAA,IAAkB,eAAe;AAAA,IAAU,SAAS;AAAA,IAAK,OAAO;AAAA,IACrG,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAO,YAAY,CAAC,yBAAyB;AAAA,EAAE;AAAA,EAE3F;AAAA,IAAE,cAAc;AAAA,IAAqB,MAAM;AAAA,IAAuB,eAAe;AAAA,IAAU,SAAS;AAAA,IAAK,OAAO;AAAA,IAC9G,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAO,YAAY,CAAC;AAAA,EAAE;AAAA;AAAA,EAIlE;AAAA,IAAE,cAAc;AAAA,IAAa,MAAM;AAAA,IAAc,eAAe;AAAA,IAAU,SAAS;AAAA,IAAK,OAAO;AAAA,IAC7F,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAO,YAAY,CAAC,0BAA0B,wBAAwB;AAAA,EAAE;AAAA,EAEpH;AAAA,IAAE,cAAc;AAAA,IAAgB,MAAM;AAAA,IAAiB,eAAe;AAAA,IAAU,SAAS;AAAA,IAAK,OAAO;AAAA,IACnG,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAO,YAAY,CAAC,gBAAgB;AAAA,EAAE;AAAA,EAElF;AAAA,IAAE,cAAc;AAAA,IAAY,MAAM;AAAA,IAAY,eAAe;AAAA,IAAU,SAAS;AAAA,IAAK,OAAO;AAAA,IAC1F,UAAU;AAAA,IAAO,aAAa;AAAA,IAC9B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAO,YAAY,CAAC,mBAAmB,mBAAmB;AAAA,EAAE;AAAA,EAExG;AAAA,IAAE,cAAc;AAAA,IAA4B,MAAM;AAAA,IAA+B,SAAS;AAAA,IAAK,OAAO;AAAA,IACpG,UAAU;AAAA,IAAQ,aAAa;AAAA,IAC/B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAM,YAAY,CAAC,+BAA+B,kBAAkB,oBAAoB,gCAAgC,+BAA+B;AAAA,EAAE;AAAA,EAErM;AAAA,IAAE,cAAc;AAAA,IAAkB,MAAM;AAAA,IAAmB,SAAS;AAAA,IAAK,OAAO;AAAA,IAC9E,UAAU;AAAA,IAAQ,aAAa;AAAA,IAC/B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAM,YAAY,CAAC,kCAAkC,8BAA8B;AAAA,EAAE;AAAA;AAAA,EAIjI;AAAA,IAAE,cAAc;AAAA,IAAgB,MAAM;AAAA,IAAiB,SAAS;AAAA,IAAK,OAAO;AAAA,IAC1E,UAAU;AAAA,IAAQ,aAAa;AAAA,IAC/B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAM,YAAY,CAAC,uBAAuB,qBAAqB;AAAA,EAAE;AAAA,EAE7G;AAAA,IAAE,cAAc;AAAA,IAAqB,MAAM;AAAA,IAAsB,SAAS;AAAA,IAAK,OAAO;AAAA,IACpF,UAAU;AAAA,IAAQ,aAAa;AAAA,IAC/B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAM,YAAY,CAAC,eAAe,cAAc;AAAA,EAAE;AAAA,EAE9F;AAAA,IAAE,cAAc;AAAA,IAAiB,MAAM;AAAA,IAAkB,SAAS;AAAA,IAAK,OAAO;AAAA,IAC5E,UAAU;AAAA,IAAQ,aAAa;AAAA,IAC/B,cAAc;AAAA,IAAe,aAAa;AAAA,IAAM,YAAY,CAAC,eAAe,qBAAqB,cAAc;AAAA,EAAE;AACrH;AAMO,IAAM,sBAAsB;AAAA,EACjC,EAAE,IAAI,KAAK,OAAO,6BAA6B,aAAa,8FAA8F;AAAA,EAC1J,EAAE,IAAI,KAAK,OAAO,UAAU,aAAa,4FAA4F;AAAA,EACrI,EAAE,IAAI,KAAK,OAAO,eAAe,aAAa,yEAAyE;AAAA,EACvH,EAAE,IAAI,KAAK,OAAO,iBAAiB,aAAa,uEAAuE;AAAA,EACvH,EAAE,IAAI,KAAK,OAAO,WAAW,aAAa,0EAA0E;AAAA,EACpH,EAAE,IAAI,KAAK,OAAO,aAAa,aAAa,wEAAwE;AAAA,EACpH,EAAE,IAAI,KAAK,OAAO,oBAAoB,aAAa,6EAA6E;AAAA,EAChI,EAAE,IAAI,KAAK,OAAO,0BAA0B,aAAa,wDAAwD;AAAA,EACjH,EAAE,IAAI,KAAK,OAAO,mBAAmB,aAAa,wFAAwF;AAAA,EAC1I,EAAE,IAAI,KAAK,OAAO,YAAY,aAAa,+DAA+D;AAAA,EAC1G,EAAE,IAAI,KAAK,OAAO,yBAAyB,aAAa,iFAAiF;AAC3I;AAMO,IAAM,qBAAqB;AAAA,EAChC,EAAE,IAAI,iBAAiB,OAAO,iBAAiB,SAAS,KAAK,aAAa,iDAAiD;AAAA,EAC3H,EAAE,IAAI,kBAAkB,OAAO,kBAAkB,SAAS,KAAK,aAAa,2CAA2C;AAAA,EACvH,EAAE,IAAI,iBAAiB,OAAO,yBAAyB,SAAS,KAAK,aAAa,2EAA2E;AAAA,EAC7J,EAAE,IAAI,WAAW,OAAO,WAAW,SAAS,KAAK,aAAa,0CAA0C;AAAA,EACxG,EAAE,IAAI,YAAY,OAAO,YAAY,SAAS,KAAK,aAAa,8CAA8C;AAAA,EAC9G,EAAE,IAAI,YAAY,OAAO,YAAY,SAAS,KAAK,aAAa,6CAA6C;AAAA,EAC7G,EAAE,IAAI,WAAW,OAAO,sBAAsB,SAAS,KAAK,aAAa,wCAAwC;AAAA,EACjH,EAAE,IAAI,gBAAgB,OAAO,0BAA0B,SAAS,KAAK,aAAa,kFAA6E;AAAA,EAC/J,EAAE,IAAI,qBAAqB,OAAO,8BAA8B,SAAS,KAAK,aAAa,2EAAsE;AAAA,EACjK,EAAE,IAAI,UAAU,OAAO,UAAU,SAAS,KAAK,aAAa,6DAA6D;AAAA,EACzH,EAAE,IAAI,iBAAiB,OAAO,0BAA0B,SAAS,KAAK,aAAa,wBAAwB;AAAA,EAC3G,EAAE,IAAI,aAAa,OAAO,uBAAuB,SAAS,KAAK,aAAa,qCAAqC;AAAA,EACjH,EAAE,IAAI,kBAAkB,OAAO,wBAAwB,SAAS,KAAK,aAAa,mEAA8D;AAAA,EAChJ,EAAE,IAAI,UAAU,OAAO,UAAU,SAAS,KAAK,aAAa,8BAA8B;AAAA,EAC1F,EAAE,IAAI,SAAS,OAAO,SAAS,SAAS,KAAK,aAAa,wBAAwB;AAAA,EAClF,EAAE,IAAI,gBAAgB,OAAO,gBAAgB,SAAS,KAAK,aAAa,mDAAmD;AAAA,EAC3H,EAAE,IAAI,oBAAoB,OAAO,oBAAoB,SAAS,KAAK,aAAa,8EAAyE;AAAA,EACzJ,EAAE,IAAI,aAAa,OAAO,aAAa,SAAS,KAAK,aAAa,8BAA8B;AAAA,EAChG,EAAE,IAAI,WAAW,OAAO,WAAW,SAAS,KAAK,aAAa,iCAAiC;AAAA,EAC/F,EAAE,IAAI,UAAU,OAAO,wBAAwB,SAAS,KAAK,aAAa,wCAAwC;AAAA,EAClH,EAAE,IAAI,sBAAsB,OAAO,sBAAsB,SAAS,KAAK,aAAa,mFAA8E;AAAA,EAClK,EAAE,IAAI,kBAAkB,OAAO,kBAAkB,SAAS,KAAK,aAAa,qCAAqC;AAAA,EACjH,EAAE,IAAI,aAAa,OAAO,aAAa,SAAS,KAAK,aAAa,8BAA8B;AAAA,EAChG,EAAE,IAAI,oBAAoB,OAAO,8BAA8B,SAAS,KAAK,aAAa,+CAA+C;AAAA,EACzI,EAAE,IAAI,aAAa,OAAO,wBAAwB,SAAS,KAAK,aAAa,+DAA0D;AAAA,EACvI,EAAE,IAAI,YAAY,OAAO,YAAY,SAAS,KAAK,aAAa,2CAA2C;AAAA,EAC3G,EAAE,IAAI,UAAU,OAAO,mBAAmB,SAAS,KAAK,aAAa,6CAA6C;AAAA,EAClH,EAAE,IAAI,iBAAiB,OAAO,iBAAiB,SAAS,KAAK,aAAa,6EAAwE;AACpJ;;;ACvVA,IAAMC,QAAO;AAEb,SAASC,KAAI,OAAuB;AAClC,SAAO,kDAAkDD,KAAI,aAAaA,KAAI,yBAAyB,KAAK;AAC9G;AAGA,SAAS,aAAqB;AAC5B,SAAOC,KAAI;AAAA;AAAA;AAAA,GAGV;AACH;AAGA,SAAS,cAAsB;AAC7B,SAAOA,KAAI;AAAA;AAAA;AAAA,GAGV;AACH;AAGA,SAAS,eAAuB;AAC9B,SAAOA,KAAI;AAAA;AAAA;AAAA,GAGV;AACH;AAGA,SAAS,wBAAgC;AACvC,SAAOA,KAAI;AAAA;AAAA;AAAA,GAGV;AACH;AAGA,SAAS,mBAA2B;AAClC,SAAOA,KAAI;AAAA;AAAA;AAAA,GAGV;AACH;AAGA,SAAS,YAAoB;AAC3B,SAAOA,KAAI;AAAA;AAAA;AAAA,GAGV;AACH;AAGA,SAAS,aAAqB;AAC5B,SAAOA,KAAI;AAAA;AAAA;AAAA,GAGV;AACH;AAGA,SAAS,kBAA0B;AACjC,SAAOA,KAAI;AAAA;AAAA;AAAA;AAAA,GAIV;AACH;AAGA,SAAS,sBAA8B;AACrC,SAAOA,KAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAUV;AACH;AAGA,SAAS,iBAAyB;AAChC,SAAOA,KAAI;AAAA;AAAA;AAAA;AAAA;AAAA,GAKV;AACH;AAGA,SAAS,UAAkB;AACzB,SAAOA,KAAI;AAAA;AAAA;AAAA,GAGV;AACH;AAGA,SAAS,sBAA8B;AACrC,SAAOA,KAAI;AAAA;AAAA;AAAA;AAAA;AAAA,GAKV;AACH;AAGA,SAAS,mBAA2B;AAClC,SAAOA,KAAI;AAAA;AAAA;AAAA;AAAA;AAAA,GAKV;AACH;AAGA,SAAS,eAAuB;AAC9B,SAAOA,KAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAOV;AACH;AAGA,SAAS,oBAA4B;AACnC,SAAOA,KAAI;AAAA;AAAA;AAAA,GAGV;AACH;AAGA,SAAS,gBAAwB;AAC/B,SAAOA,KAAI;AAAA;AAAA;AAAA,GAGV;AACH;AAGA,SAAS,iBAAyB;AAChC,SAAOA,KAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAOV;AACH;AAGA,SAAS,gBAAwB;AAC/B,SAAOA,KAAI;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,GAOV;AACH;AAMO,IAAM,mBAAqC;AAAA;AAAA,EAEhD;AAAA,IAAE,IAAI;AAAA,IAAoB,OAAO;AAAA,IAAiC,SAAS;AAAA,IAAQ,SAAS;AAAA,IAAK,QAAQ;AAAA,IACvG,OAAO;AAAA,IAAgB,aAAa;AAAA,IACpC,UAAU;AAAA,IAAgB,YAAY;AAAA,IACtC,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,8BAA8B,CAAC;AAAA,IACjF,cAAc;AAAA,EAA+P;AAAA,EAE/Q;AAAA,IAAE,IAAI;AAAA,IAAqB,OAAO;AAAA,IAAkC,SAAS;AAAA,IAAU,SAAS;AAAA,IAAK,QAAQ;AAAA,IAC3G,OAAO;AAAA,IAAgB,aAAa;AAAA,IACpC,UAAU;AAAA,IAAgB,YAAY;AAAA,IACtC,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,8BAA8B,CAAC;AAAA,IACjF,cAAc;AAAA,EAAuK;AAAA,EAEvL;AAAA,IAAE,IAAI;AAAA,IAAsB,OAAO;AAAA,IAAmC,SAAS;AAAA,IAAU,SAAS;AAAA,IAAK,QAAQ;AAAA,IAC7G,OAAO;AAAA,IAAgB,aAAa;AAAA,IACpC,UAAU;AAAA,IAAgB,YAAY;AAAA,IACtC,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,8BAA8B,CAAC;AAAA,IACjF,cAAc;AAAA,EAA2L;AAAA,EAE3M;AAAA,IAAE,IAAI;AAAA,IAA0B,OAAO;AAAA,IAA8B,SAAS;AAAA,IAAU,SAAS;AAAA,IAAK,QAAQ;AAAA,IAC5G,OAAO;AAAA,IAAqB,aAAa;AAAA,IACzC,UAAU;AAAA,IAAa,YAAY;AAAA,IACnC,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,wBAAwB,CAAC;AAAA,IAC3E,cAAc;AAAA,EAA6M;AAAA,EAE7N;AAAA,IAAE,IAAI;AAAA,IAAmB,OAAO;AAAA,IAAgC,SAAS;AAAA,IAAU,SAAS;AAAA,IAAK,QAAQ;AAAA,IACvG,OAAO;AAAA,IAAqB,aAAa;AAAA,IACzC,UAAU;AAAA,IAAgB,YAAY;AAAA,IACtC,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,kBAAkB,CAAC;AAAA,IACrE,cAAc;AAAA,EAAuL;AAAA;AAAA,EAGvM;AAAA,IAAE,IAAI;AAAA,IAAmB,OAAO;AAAA,IAAc,SAAS;AAAA,IAAM,SAAS;AAAA,IAAK,QAAQ;AAAA,IACjF,OAAO;AAAA,IAAkB,aAAa;AAAA,IACtC,UAAU;AAAA,IAAe,YAAY;AAAA,IACrC,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,sBAAsB,CAAC;AAAA,IACzE,cAAc;AAAA,EAAsJ;AAAA,EAEtK;AAAA,IAAE,IAAI;AAAA,IAAoB,OAAO;AAAA,IAAe,SAAS;AAAA,IAAM,SAAS;AAAA,IAAK,QAAQ;AAAA,IACnF,OAAO;AAAA,IAAkB,aAAa;AAAA,IACtC,UAAU;AAAA,IAAe,YAAY;AAAA,IACrC,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,aAAa,CAAC;AAAA,IAChE,cAAc;AAAA,EAAkJ;AAAA;AAAA,EAGlK;AAAA,IAAE,IAAI;AAAA,IAAyB,OAAO;AAAA,IAAoB,SAAS;AAAA,IAAQ,SAAS;AAAA,IAAK,QAAQ;AAAA,IAC/F,OAAO;AAAA,IAAU,aAAa;AAAA,IAC9B,UAAU;AAAA,IAAe,YAAY;AAAA,IACrC,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,eAAe,CAAC;AAAA,IAClE,cAAc;AAAA,EAA2L;AAAA,EAE3M;AAAA,IAAE,IAAI;AAAA,IAAuB,OAAO;AAAA,IAAkB,SAAS;AAAA,IAAS,SAAS;AAAA,IAAK,QAAQ;AAAA,IAC5F,OAAO;AAAA,IAAU,aAAa;AAAA,IAC9B,UAAU;AAAA,IAAe,YAAY;AAAA,IACrC,QAAQ;AAAA,MACN,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,iBAAiB;AAAA,MAC1D,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,aAAa;AAAA,MACtD,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,eAAe;AAAA,IAC1D;AAAA,IACA,cAAc;AAAA,EAAsK;AAAA;AAAA,EAGtL;AAAA,IAAE,IAAI;AAAA,IAAyB,OAAO;AAAA,IAAoB,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IAC9F,OAAO;AAAA,IAAoB,aAAa;AAAA,IACxC,UAAU;AAAA,IAAe,YAAY;AAAA,IACrC,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,eAAe,CAAC;AAAA,IAClE,cAAc;AAAA,EAAyL;AAAA,EAEzM;AAAA,IAAE,IAAI;AAAA,IAAmB,OAAO;AAAA,IAAsB,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IAC1F,OAAO;AAAA,IAAgB,aAAa;AAAA,IACpC,UAAU;AAAA,IAAe,YAAY;AAAA,IACrC,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,2BAA2B,CAAC;AAAA,IAC9E,cAAc;AAAA,EAAsL;AAAA;AAAA,EAGtM;AAAA,IAAE,IAAI;AAAA,IAAiB,OAAO;AAAA,IAAwC,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IAC1G,OAAO;AAAA,IAAa,aAAa;AAAA,IACjC,UAAU;AAAA,IAAe,YAAY;AAAA,IACrC,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,sBAAsB,CAAC;AAAA,IACzE,cAAc;AAAA,EAA4L;AAAA,EAE5M;AAAA,IAAE,IAAI;AAAA,IAA8B,OAAO;AAAA,IAAyB,SAAS;AAAA,IAAO,SAAS;AAAA,IAAK,QAAQ;AAAA,IACxG,OAAO;AAAA,IAAoB,aAAa;AAAA,IACxC,UAAU;AAAA,IAAe,YAAY;AAAA,IACrC,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,iCAAiC,CAAC;AAAA,IACpF,cAAc;AAAA,EAA0L;AAAA;AAAA,EAG1M;AAAA,IAAE,IAAI;AAAA,IAA2B,OAAO;AAAA,IAA+B,SAAS;AAAA,IAAS,SAAS;AAAA,IAAK,QAAQ;AAAA,IAC7G,OAAO;AAAA,IAAsB,aAAa;AAAA,IAC1C,UAAU;AAAA,IAAe,YAAY;AAAA,IACrC,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,oBAAoB,CAAC;AAAA,IACvE,cAAc;AAAA,EAAkM;AAAA,EAElN;AAAA,IAAE,IAAI;AAAA,IAAwB,OAAO;AAAA,IAAmB,SAAS;AAAA,IAAS,SAAS;AAAA,IAAK,QAAQ;AAAA,IAC9F,OAAO;AAAA,IAAsB,aAAa;AAAA,IAC1C,UAAU;AAAA,IAAe,YAAY;AAAA,IACrC,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,gBAAgB,CAAC;AAAA,IACnE,cAAc;AAAA,EAA8K;AAAA;AAAA,EAG9L;AAAA,IAAE,IAAI;AAAA,IAAsB,OAAO;AAAA,IAAiB,SAAS;AAAA,IAAQ,SAAS;AAAA,IAAK,QAAQ;AAAA,IACzF,OAAO;AAAA,IAAiB,aAAa;AAAA,IACrC,UAAU;AAAA,IAAe,YAAY;AAAA,IACrC,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,gBAAgB,CAAC;AAAA,IACnE,cAAc;AAAA,EAAiL;AAAA,EAEjM;AAAA,IAAE,IAAI;AAAA,IAAoB,OAAO;AAAA,IAAsB,SAAS;AAAA,IAAQ,SAAS;AAAA,IAAK,QAAQ;AAAA,IAC5F,OAAO;AAAA,IAAiB,aAAa;AAAA,IACrC,UAAU;AAAA,IAAe,YAAY;AAAA,IACrC,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,eAAe,CAAC;AAAA,IAClE,cAAc;AAAA,EAA2K;AAAA,EAE3L;AAAA,IAAE,IAAI;AAAA,IAAuB,OAAO;AAAA,IAAkB,SAAS;AAAA,IAAQ,SAAS;AAAA,IAAK,QAAQ;AAAA,IAC3F,OAAO;AAAA,IAAiB,aAAa;AAAA,IACrC,UAAU;AAAA,IAAe,YAAY;AAAA,IACrC,QAAQ,CAAC,EAAE,OAAO,SAAS,KAAK,WAAW,OAAO,iBAAiB,CAAC;AAAA,IACpE,cAAc;AAAA,EAAqJ;AACvK;;;ACnTO,IAAM,iBAAyC;AAAA,EACpD,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,WAAW;AAAA,EACX,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,gBAAgB;AAAA,EAChB,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;AAAA,EACZ,YAAY;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","names":["src","paint","SIZE","svg","ZOOM_SCALED_LINES","buildLabelLayer","buildLabelLayer"]}
|