From c2c65385def1b98f1566034a96806cfb74ac2894 Mon Sep 17 00:00:00 2001 From: ryzrr Date: Mon, 7 Sep 2026 23:22:33 +0530 Subject: [PATCH 1/9] trim: remove distributed tracing (spans, flame graph, service map) Drops the whole tracing feature: the /traces dashboard page and its three components, the /v1/spans ingest route, the /v1/traces query route, the spans table and its RLS policy, and the span buffer/wire types in the JS SDK. Request events keep their trace_id as a plain correlation id that the SDKs still propagate via the x-trace-id header. --- app/(dashboard)/traces/page.tsx | 228 ------------------ app/layout.tsx | 2 +- apps/api/api/routes/query.py | 102 -------- apps/api/api/routes/spans.py | 64 ----- apps/api/api/schemas.py | 52 ---- apps/api/main.py | 3 +- apps/api/migrations/versions/001_initial.py | 21 +- .../migrations/versions/003_multitenancy.py | 2 +- apps/api/migrations/versions/005_rls.py | 2 +- components/landing/feature-grid.tsx | 10 +- components/landing/footer.tsx | 2 +- components/landing/hero.tsx | 2 +- components/landing/incident-section.tsx | 2 +- components/layout/sidebar.tsx | 2 - components/settings/project-settings-card.tsx | 2 +- components/traces/flame-graph.tsx | 146 ----------- components/traces/service-map.tsx | 216 ----------------- components/traces/span-detail.tsx | 88 ------- hooks/use-data.ts | 60 ----- lib/types.ts | 23 -- packages/sdk-js/src/buffer.ts | 49 +--- packages/sdk-js/src/client.ts | 7 +- packages/sdk-js/src/config.ts | 4 - packages/sdk-js/src/express.ts | 33 +-- packages/sdk-js/src/types.ts | 32 +-- public/shots/traces.png | Bin 211140 -> 0 bytes 26 files changed, 21 insertions(+), 1133 deletions(-) delete mode 100644 app/(dashboard)/traces/page.tsx delete mode 100644 apps/api/api/routes/spans.py delete mode 100644 components/traces/flame-graph.tsx delete mode 100644 components/traces/service-map.tsx delete mode 100644 components/traces/span-detail.tsx delete mode 100644 public/shots/traces.png diff --git a/app/(dashboard)/traces/page.tsx b/app/(dashboard)/traces/page.tsx deleted file mode 100644 index 82155ae..0000000 --- a/app/(dashboard)/traces/page.tsx +++ /dev/null @@ -1,228 +0,0 @@ -"use client"; - -import { useState, useEffect, useMemo } from "react"; -import { Search, GitBranch, Map } from "lucide-react"; -import { Topbar } from "@/components/layout/topbar"; -import { TimeRangePicker } from "@/components/layout/time-range-picker"; -import { FlameGraph } from "@/components/traces/flame-graph"; -import { SpanDetail } from "@/components/traces/span-detail"; -import { ServiceMap } from "@/components/traces/service-map"; -import { Badge } from "@/components/ui/badge"; -import { cn, formatMs, timeAgo } from "@/lib/utils"; -import { useTraces } from "@/hooks/use-data"; -import { useTimeRange } from "@/hooks/use-time-range"; -import { useProjects } from "@/components/providers/project-provider"; -import type { Trace, TraceSpan } from "@/lib/types"; - -type DurationFilter = "any" | "<100" | "100-500" | "500-1000" | ">1000"; - -const DURATION_OPTIONS: { label: string; value: DurationFilter }[] = [ - { label: "Any", value: "any" }, - { label: "< 100ms", value: "<100" }, - { label: "100–500ms", value: "100-500" }, - { label: "500ms–1s", value: "500-1000" }, - { label: "> 1s", value: ">1000" }, -]; - -function matchesDuration(ms: number, filter: DurationFilter): boolean { - switch (filter) { - case "<100": return ms < 100; - case "100-500": return ms >= 100 && ms < 500; - case "500-1000": return ms >= 500 && ms < 1000; - case ">1000": return ms >= 1000; - default: return true; - } -} - -type ViewMode = "flamegraph" | "servicemap"; - -export default function TracesPage() { - const { activeProject } = useProjects(); - const { range, setRange, hours } = useTimeRange("24h"); - const { data: traces } = useTraces(hours); - const [selectedTrace, setSelectedTrace] = useState(null); - - // Keep the selection in sync with the current trace list: clear it when the - // list is empty (e.g. a real project with no spans, or after switching - // projects), and pick the first trace when the current one is gone. - useEffect(() => { - if (traces.length === 0) { - setSelectedTrace(null); - } else if (!selectedTrace || !traces.some((t) => t.id === selectedTrace.id)) { - setSelectedTrace(traces[0]); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [traces]); - const [selectedSpan, setSelectedSpan] = useState(null); - const [search, setSearch] = useState(""); - const [durationFilter, setDurationFilter] = useState("any"); - const [criticalPath, setCriticalPath] = useState(false); - const [viewMode, setViewMode] = useState("flamegraph"); - - const filtered = useMemo(() => traces.filter((t) => { - const matchSearch = t.id.includes(search) || t.endpoint.includes(search) || t.service.includes(search); - const matchDuration = matchesDuration(t.totalDuration, durationFilter); - return matchSearch && matchDuration; - }), [traces, search, durationFilter]); - - return ( -
- } - /> - -
- {/* Trace list */} -
- {/* Search */} -
-
- - setSearch(e.target.value)} - className="bg-transparent text-[10px] text-[#F5F5F5] placeholder-[#808080] outline-none flex-1" - /> -
- {/* Duration filter */} -
- {DURATION_OPTIONS.map((opt) => ( - - ))} -
-
- -
- {filtered.map((trace) => ( - - ))} - {filtered.length === 0 && ( -
No traces match
- )} -
-
- - {/* Flame graph + detail */} -
- {selectedTrace ? ( - <> - {/* Trace header + toolbar */} -
-
- Trace - {selectedTrace.id} -
-
- {selectedTrace.spans.length} spans - {timeAgo(selectedTrace.timestamp)} - - {selectedTrace.status} - - - {/* View toggles */} -
- {/* Critical path toggle (only for flame graph) */} - {viewMode === "flamegraph" && ( - - )} - - {/* Flame / Map toggle */} -
- - -
-
-
- - {viewMode === "flamegraph" ? ( - - ) : ( - - )} - - {viewMode === "flamegraph" && ( - setSelectedSpan(null)} /> - )} - - ) : ( -
- Select a trace to view the flame graph -
- )} -
-
-
- ); -} diff --git a/app/layout.tsx b/app/layout.tsx index 6c8e28a..8f934ce 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -14,7 +14,7 @@ import { ProjectProvider } from "@/components/providers/project-provider"; export const metadata: Metadata = { title: "Liveboard — API Observability", - description: "Real-time API observability, distributed traces, and intelligent alerts", + description: "Real-time API observability, live error tracking, and intelligent alerts", }; export default function RootLayout({ children }: { children: React.ReactNode }) { diff --git a/apps/api/api/routes/query.py b/apps/api/api/routes/query.py index a725664..4366ee0 100644 --- a/apps/api/api/routes/query.py +++ b/apps/api/api/routes/query.py @@ -5,7 +5,6 @@ from __future__ import annotations import datetime -import json import logging import asyncpg @@ -16,9 +15,7 @@ EndpointStat, IncidentOut, ServiceStatusOut, - SpanOut, TimeseriesPoint, - TraceOut, ) router = APIRouter(prefix="/v1", tags=["query"]) @@ -205,105 +202,6 @@ async def get_incidents( return await fetch_incidents(conn, project_id) -# ─── Traces ────────────────────────────────────────────────────────────────── - -@router.get("/traces", response_model=list[TraceOut]) -async def get_traces( - hours: int = Query(24, ge=1, le=168), - project_id: str = Depends(resolve_project_id), - conn: asyncpg.Connection = Depends(scoped_conn), -) -> list[TraceOut]: - """ - Recent distributed traces assembled from the spans table, within the - last `hours` (default 24, matching Endpoints/Overview's picker). This - used to hardcode 24h with no way to widen it and no indication to the - viewer that a window even existed — a project with real spans older than - a day would just show an empty page with no explanation. - """ - rows = await conn.fetch( - """ - WITH recent_traces AS ( - SELECT DISTINCT trace_id - FROM spans - WHERE project_id = $1 - AND start_time >= now() - ($2 * INTERVAL '1 hour') - LIMIT 20 - ) - SELECT - s.span_id, - s.trace_id, - s.parent_id, - s.service_name, - s.operation, - s.start_time, - s.duration_ms, - s.status_code, - s.tags, - MIN(s.start_time) OVER (PARTITION BY s.trace_id) AS trace_start, - SUM(s.duration_ms) OVER (PARTITION BY s.trace_id) AS total_duration, - BOOL_OR(s.status_code >= 500) OVER (PARTITION BY s.trace_id) AS has_error - FROM spans s - JOIN recent_traces rt ON rt.trace_id = s.trace_id - WHERE s.project_id = $1 - ORDER BY trace_start DESC, s.start_time - """, - project_id, - hours, - ) - - # Group spans into traces - traces: dict[str, dict] = {} - for row in rows: - tid = str(row["trace_id"]) - if tid not in traces: - traces[tid] = { - "id": tid, - "trace_start": row["trace_start"], - "total_duration": int(row["total_duration"] or 0), - "has_error": bool(row["has_error"]), - "spans": [], - } - trace_start_ms = int(row["trace_start"].timestamp() * 1000) - span_start_ms = ( - int(row["start_time"].timestamp() * 1000) if row["start_time"] else trace_start_ms - ) - traces[tid]["spans"].append( - SpanOut( - id=str(row["span_id"]), - trace_id=tid, - parent_id=str(row["parent_id"]) if row["parent_id"] else None, - service=row["service_name"] or "unknown", - name=row["operation"] or "unknown", - start_time=max(0, span_start_ms - trace_start_ms), - duration=int(row["duration_ms"] or 0), - status="error" if (row["status_code"] and row["status_code"] >= 500) else "ok", - # asyncpg returns JSONB as a string — parse it back to a dict. - tags=(json.loads(row["tags"]) if isinstance(row["tags"], str) else (row["tags"] or {})), - ) - ) - - result: list[TraceOut] = [] - for t in traces.values(): - spans = t["spans"] - root = next((s for s in spans if s.parent_id is None), spans[0] if spans else None) - if not root: - continue - result.append( - TraceOut( - id=t["id"], - root_span=root.id, - service=root.service, - endpoint=root.name, - total_duration=t["total_duration"], - timestamp=t["trace_start"].isoformat(), - status="error" if t["has_error"] else "ok", - spans=spans, - ) - ) - return result - - -# ─── Services ──────────────────────────────────────────────────────────────── def _service_name(prefix: str) -> str: """Map a route prefix to a human-readable service name.""" diff --git a/apps/api/api/routes/spans.py b/apps/api/api/routes/spans.py deleted file mode 100644 index e0ef40f..0000000 --- a/apps/api/api/routes/spans.py +++ /dev/null @@ -1,64 +0,0 @@ -""" -Span ingest endpoint — POST /v1/spans - -Accepts a batch of OpenTelemetry-style spans and bulk-inserts them into -the spans table. Auth is the same x-api-key header as the event ingest route. -""" -from __future__ import annotations - -import json -import logging -import uuid - -import asyncpg -from fastapi import APIRouter, Depends - -from api.deps import authenticate_project, get_db -from api.schemas import SpanBatchRequest, SpanBatchResponse - -router = APIRouter(prefix="/v1", tags=["spans"]) -logger = logging.getLogger(__name__) - - -@router.post("/spans", response_model=SpanBatchResponse, status_code=202) -async def ingest_spans( - body: SpanBatchRequest, - project_id: str = Depends(authenticate_project), - conn: asyncpg.Connection = Depends(get_db), -) -> SpanBatchResponse: - """Bulk-insert a batch of spans. Duplicate span_ids are silently ignored.""" - records = [] - for s in body.spans: - try: - records.append(( - uuid.UUID(s.span_id), - uuid.UUID(s.trace_id), - uuid.UUID(s.parent_id) if s.parent_id else None, - uuid.UUID(project_id), - s.service_name, - s.operation, - s.start_time, - s.duration_ms, - s.status_code, - json.dumps(s.tags), - )) - except (ValueError, AttributeError) as exc: - logger.debug("Skipping malformed span %s: %s", s.span_id, exc) - continue - - if not records: - return SpanBatchResponse(accepted=0) - - await conn.executemany( - """ - INSERT INTO spans - (span_id, trace_id, parent_id, project_id, - service_name, operation, start_time, duration_ms, status_code, tags) - VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10::jsonb) - ON CONFLICT (span_id) DO NOTHING - """, - records, - ) - - logger.info("Accepted %d spans for project=%s", len(records), project_id) - return SpanBatchResponse(accepted=len(records)) diff --git a/apps/api/api/schemas.py b/apps/api/api/schemas.py index dd66ecc..4ed99ee 100644 --- a/apps/api/api/schemas.py +++ b/apps/api/api/schemas.py @@ -82,29 +82,6 @@ class IncidentOut(BaseModel): resolved: bool -class SpanOut(BaseModel): - id: str - trace_id: str - parent_id: Optional[str] - service: str - name: str - start_time: int - duration: int - status: str - tags: dict - - -class TraceOut(BaseModel): - id: str - root_span: str - service: str - endpoint: str - total_duration: int - timestamp: str - status: str - spans: list[SpanOut] - - class ServiceStatusOut(BaseModel): id: str name: str @@ -114,35 +91,6 @@ class ServiceStatusOut(BaseModel): uptime_bars: list[str] -# ─── Span ingest ───────────────────────────────────────────────────────────── - -class SpanIn(BaseModel): - span_id: str - trace_id: str - parent_id: Optional[str] = None - service_name: str = Field(default="unknown", max_length=100) - operation: str = Field(..., min_length=1, max_length=200) - start_time: datetime - duration_ms: int = Field(..., ge=0) - status_code: int = Field(default=200, ge=100, le=599) - tags: dict = Field(default_factory=dict) - - @field_validator("start_time", mode="before") - @classmethod - def ensure_utc(cls, v: datetime) -> datetime: - if isinstance(v, datetime) and v.tzinfo is None: - return v.replace(tzinfo=timezone.utc) - return v - - -class SpanBatchRequest(BaseModel): - spans: list[SpanIn] = Field(..., min_length=1, max_length=500) - - -class SpanBatchResponse(BaseModel): - accepted: int - - # ─── Alert rules ───────────────────────────────────────────────────────────── class AlertRuleOut(BaseModel): diff --git a/apps/api/main.py b/apps/api/main.py index e87f954..dab7c2f 100644 --- a/apps/api/main.py +++ b/apps/api/main.py @@ -8,7 +8,7 @@ from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware -from api.routes import alerts, ingest, internal, projects, public_status, query, spans +from api.routes import alerts, ingest, internal, projects, public_status, query from core.config import settings from core.database import close_pool, get_pool from core.redis_client import close_redis @@ -69,7 +69,6 @@ async def lifespan(app: FastAPI): _fastapi.include_router(internal.router) _fastapi.include_router(query.router) _fastapi.include_router(alerts.router) -_fastapi.include_router(spans.router) _fastapi.include_router(public_status.router) _fastapi.include_router(sse_router) diff --git a/apps/api/migrations/versions/001_initial.py b/apps/api/migrations/versions/001_initial.py index 47bade0..ca1a75a 100644 --- a/apps/api/migrations/versions/001_initial.py +++ b/apps/api/migrations/versions/001_initial.py @@ -1,4 +1,4 @@ -"""Initial schema — users, projects, events hypertable, spans, incidents +"""Initial schema — users, projects, events hypertable, incidents Revision ID: 001 Revises: @@ -63,24 +63,6 @@ def upgrade() -> None: op.execute("CREATE INDEX IF NOT EXISTS idx_events_project_time ON events(project_id, time DESC);") op.execute("CREATE INDEX IF NOT EXISTS idx_events_route ON events(project_id, route, time DESC);") - # ── Spans (distributed tracing — populated from Phase 6) ───────────────── - op.execute(""" - CREATE TABLE IF NOT EXISTS spans ( - span_id UUID PRIMARY KEY, - trace_id UUID NOT NULL, - parent_id UUID, - project_id UUID NOT NULL, - service_name TEXT, - operation TEXT, - start_time TIMESTAMPTZ, - duration_ms INTEGER, - status_code SMALLINT, - tags JSONB - ); - """) - op.execute("CREATE INDEX IF NOT EXISTS idx_spans_trace ON spans(trace_id);") - op.execute("CREATE INDEX IF NOT EXISTS idx_spans_project ON spans(project_id, start_time DESC);") - # ── 1-minute continuous aggregate ──────────────────────────────────────── op.execute(""" CREATE MATERIALIZED VIEW IF NOT EXISTS events_1min @@ -129,7 +111,6 @@ def upgrade() -> None: def downgrade() -> None: op.execute("DROP TABLE IF EXISTS incidents;") op.execute("DROP MATERIALIZED VIEW IF EXISTS events_1min;") - op.execute("DROP TABLE IF EXISTS spans;") op.execute("DROP TABLE IF EXISTS events;") op.execute("DROP TABLE IF EXISTS projects;") op.execute("DROP TABLE IF EXISTS users;") diff --git a/apps/api/migrations/versions/003_multitenancy.py b/apps/api/migrations/versions/003_multitenancy.py index 601a2f2..32e47b2 100644 --- a/apps/api/migrations/versions/003_multitenancy.py +++ b/apps/api/migrations/versions/003_multitenancy.py @@ -10,7 +10,7 @@ projects.org_id — every project now belongs to exactly one org Telemetry tables already carry project_id, so an org owns its data -transitively (org -> projects -> events/spans/incidents). This migration +transitively (org -> projects -> events/incidents). This migration only adds the *ownership* layer; read-time authorization is enforced in the app (Phase 8.2) and, later, Postgres RLS (Phase 8.4). """ diff --git a/apps/api/migrations/versions/005_rls.py b/apps/api/migrations/versions/005_rls.py index b153919..fc48f0e 100644 --- a/apps/api/migrations/versions/005_rls.py +++ b/apps/api/migrations/versions/005_rls.py @@ -25,7 +25,7 @@ branch_labels = None depends_on = None -_TABLES = ["events", "spans", "incidents", "alert_rules", "alert_history"] +_TABLES = ["events", "incidents", "alert_rules", "alert_history"] def upgrade() -> None: diff --git a/components/landing/feature-grid.tsx b/components/landing/feature-grid.tsx index 65cc6aa..4deed52 100644 --- a/components/landing/feature-grid.tsx +++ b/components/landing/feature-grid.tsx @@ -11,7 +11,7 @@ export function FeatureGrid() { Every request, instrumented.

- Distributed traces, per-endpoint health scores, and alerts routed to the tools your team already uses. + Live request metrics, per-endpoint health scores, and alerts routed to the tools your team already uses.

@@ -22,14 +22,14 @@ export function FeatureGrid() {
-

Distributed tracing

+

Live request stream

- Flame graphs and service maps for every request, down to the individual span. Trace IDs propagate across all five SDK adapters automatically. + Request volume, response codes, and a tailing log of every call — pushed to the browser over Socket.io and SSE as the traffic happens, not on a refresh timer.

diff --git a/components/landing/footer.tsx b/components/landing/footer.tsx index 63e1c5a..7fa5eff 100644 --- a/components/landing/footer.tsx +++ b/components/landing/footer.tsx @@ -37,7 +37,7 @@ export function Footer() { Liveboard

- Open source API observability. Traces, alerts, and AI incident summaries from one line of middleware. + Open source API observability. Live metrics, alerts, and AI incident summaries from one line of middleware.

diff --git a/components/landing/hero.tsx b/components/landing/hero.tsx index bd9bc5d..469996d 100644 --- a/components/landing/hero.tsx +++ b/components/landing/hero.tsx @@ -43,7 +43,7 @@ export function Hero() { - Real-time traces, live error tracking, and AI-written incident summaries, wired up with one line of middleware. + Live request metrics, error tracking, and AI-written incident summaries, wired up with one line of middleware. diff --git a/components/landing/incident-section.tsx b/components/landing/incident-section.tsx index 11f5870..66bd57f 100644 --- a/components/landing/incident-section.tsx +++ b/components/landing/incident-section.tsx @@ -18,7 +18,7 @@ export function IncidentSection() {

- It writes the postmortem before you open the trace. + It writes the postmortem before you open the dashboard.

A rolling z-score model flags anomalies in error rate and p99 latency, then writes a plain-English summary automatically. diff --git a/components/layout/sidebar.tsx b/components/layout/sidebar.tsx index fbd4ee3..39124d6 100644 --- a/components/layout/sidebar.tsx +++ b/components/layout/sidebar.tsx @@ -5,7 +5,6 @@ import { usePathname } from "next/navigation"; import { LayoutDashboard, Zap, - GitBranch, Bell, Globe, Settings, @@ -18,7 +17,6 @@ import { UserMenu } from "@/components/auth/user-menu"; const NAV_ITEMS = [ { href: "/overview", label: "Overview", icon: LayoutDashboard }, { href: "/endpoints", label: "Endpoints", icon: Zap }, - { href: "/traces", label: "Traces", icon: GitBranch }, { href: "/alerts", label: "Alerts", icon: Bell }, { href: "/status", label: "Status Page", icon: Globe }, ]; diff --git a/components/settings/project-settings-card.tsx b/components/settings/project-settings-card.tsx index cc2ba81..155356d 100644 --- a/components/settings/project-settings-card.tsx +++ b/components/settings/project-settings-card.tsx @@ -208,7 +208,7 @@ export function ProjectSettingsCard({ project }: Props) {

This permanently deletes {project.name} and - all its events, traces, alert rules, and API keys. Type the project name to confirm. + all its events, alert rules, and API keys. Type the project name to confirm.

void; - selectedSpan?: string; - highlightCriticalPath?: boolean; -} - -function computeCriticalPath(spans: TraceSpan[]): Set { - const childMap = new Map(); - for (const span of spans) { - const key = span.parentId; - if (!childMap.has(key)) childMap.set(key, []); - childMap.get(key)!.push(span); - } - - const criticalIds = new Set(); - - function walk(spanId: string | undefined): number { - const children = childMap.get(spanId) ?? []; - if (children.length === 0) { - if (spanId) criticalIds.add(spanId); - return 0; - } - let maxChildDuration = -1; - let bestChild: TraceSpan | null = null; - for (const child of children) { - const subtreeDuration = child.duration + walk(child.id); - if (subtreeDuration > maxChildDuration) { - maxChildDuration = subtreeDuration; - bestChild = child; - } - } - if (bestChild) criticalIds.add(bestChild.id); - if (spanId) criticalIds.add(spanId); - return maxChildDuration; - } - - const roots = spans.filter((s) => !s.parentId); - for (const root of roots) walk(root.id); - return criticalIds; -} - -const SERVICE_COLORS: Record = { - "api-gateway": "#378ADD", - "auth-service": "#A855F7", - "product-service": "#22C55E", - "payment-service": "#F59E0B", - "db-postgres": "#6366F1", - "cache-redis": "#EF4444", -}; - -export function FlameGraph({ trace, onSpanClick, selectedSpan, highlightCriticalPath }: FlameGraphProps) { - const totalDuration = trace.totalDuration; - const criticalPath = useMemo( - () => (highlightCriticalPath ? computeCriticalPath(trace.spans) : null), - [highlightCriticalPath, trace.spans] - ); - - return ( -
- {/* Header */} -
-
- trace_id: - {trace.id} -
-
- {trace.spans.length} spans - - {trace.totalDuration}ms - -
-
- - {/* Time ruler */} -
-
- {[0, 0.25, 0.5, 0.75, 1].map((pct) => ( - - {Math.round(pct * totalDuration)}ms - - ))} -
-
- - {/* Spans */} -
- {trace.spans.map((span) => { - const left = (span.startTime / totalDuration) * 100; - const width = Math.max((span.duration / totalDuration) * 100, 0.5); - const color = SERVICE_COLORS[span.service] || "#888"; - const isSelected = selectedSpan === span.id; - const isError = span.status === "error"; - const isCritical = criticalPath ? criticalPath.has(span.id) : true; - - return ( -
-
- {span.service} -
-
- -
-
- {span.duration}ms -
-
- ); - })} -
-
- ); -} diff --git a/components/traces/service-map.tsx b/components/traces/service-map.tsx deleted file mode 100644 index cf9ee60..0000000 --- a/components/traces/service-map.tsx +++ /dev/null @@ -1,216 +0,0 @@ -"use client"; - -import { useMemo } from "react"; -import type { Trace } from "@/lib/types"; - -interface ServiceMapProps { - trace: Trace; -} - -interface Node { - service: string; - x: number; - y: number; - callCount: number; - hasError: boolean; -} - -interface Edge { - from: string; - to: string; - count: number; -} - -const SERVICE_COLORS: Record = { - "api-gateway": "#378ADD", - "auth-service": "#A855F7", - "product-service": "#22C55E", - "payment-service": "#F59E0B", - "db-postgres": "#6366F1", - "cache-redis": "#EF4444", -}; - -const W = 480; -const H = 240; -const CX = W / 2; -const CY = H / 2; -const R = 88; -const NODE_R = 28; - -function buildGraph(trace: Trace): { nodes: Node[]; edges: Edge[] } { - const spanById = new Map(trace.spans.map((s) => [s.id, s])); - - // Collect service→service edges from parent-child relationships - const edgeMap = new Map(); - for (const span of trace.spans) { - if (!span.parentId) continue; - const parent = spanById.get(span.parentId); - if (!parent || parent.service === span.service) continue; - const key = `${parent.service}→${span.service}`; - edgeMap.set(key, (edgeMap.get(key) ?? 0) + 1); - } - - // Build unique services - const serviceSet = new Set(trace.spans.map((s) => s.service)); - const services = Array.from(serviceSet); - - // Find root service (span with no parentId) - const rootSpan = trace.spans.find((s) => !s.parentId); - const rootService = rootSpan?.service ?? services[0]!; - - // Layout: root at center, others in a circle - const others = services.filter((s) => s !== rootService); - const angleStep = others.length > 0 ? (2 * Math.PI) / others.length : 0; - - const posMap = new Map(); - posMap.set(rootService, { x: CX, y: CY }); - others.forEach((svc, i) => { - const angle = i * angleStep - Math.PI / 2; - posMap.set(svc, { - x: CX + R * Math.cos(angle), - y: CY + R * Math.sin(angle), - }); - }); - - const nodes: Node[] = services.map((svc) => ({ - service: svc, - x: posMap.get(svc)!.x, - y: posMap.get(svc)!.y, - callCount: trace.spans.filter((s) => s.service === svc).length, - hasError: trace.spans.some((s) => s.service === svc && s.status === "error"), - })); - - const edges: Edge[] = Array.from(edgeMap.entries()).map(([key, count]) => { - const [from, to] = key.split("→") as [string, string]; - return { from, to, count }; - }); - - return { nodes, edges }; -} - -function arrowPath(x1: number, y1: number, x2: number, y2: number): string { - const dx = x2 - x1; - const dy = y2 - y1; - const dist = Math.hypot(dx, dy); - if (dist === 0) return ""; - const ux = dx / dist; - const uy = dy / dist; - const sx = x1 + ux * NODE_R; - const sy = y1 + uy * NODE_R; - const ex = x2 - ux * NODE_R; - const ey = y2 - uy * NODE_R; - return `M ${sx} ${sy} L ${ex} ${ey}`; -} - -export function ServiceMap({ trace }: ServiceMapProps) { - const { nodes, edges } = useMemo(() => buildGraph(trace), [trace]); - - return ( -
-

Service Map

-
- - - - - - - - {/* Edges */} - {edges.map((edge) => { - const fromNode = nodes.find((n) => n.service === edge.from); - const toNode = nodes.find((n) => n.service === edge.to); - if (!fromNode || !toNode) return null; - return ( - - - {edge.count > 1 && ( - - ×{edge.count} - - )} - - ); - })} - - {/* Nodes */} - {nodes.map((node) => { - const color = SERVICE_COLORS[node.service] ?? "#888"; - const isRoot = !trace.spans.find((s) => s.service === node.service && s.parentId); - return ( - - {/* Outer ring for root */} - {isRoot && ( - - )} - - {/* Service name — shortened */} - - {node.service.split("-").map((part, i) => ( - - {part} - - ))} - - {/* Call count badge */} - {node.callCount > 1 && ( - - {node.callCount} - - )} - - ); - })} - -
- - {/* Legend */} -
- {nodes.map((node) => { - const color = SERVICE_COLORS[node.service] ?? "#888"; - return ( -
-
- {node.service} - {node.hasError && !} -
- ); - })} -
-
- ); -} diff --git a/components/traces/span-detail.tsx b/components/traces/span-detail.tsx deleted file mode 100644 index 9586965..0000000 --- a/components/traces/span-detail.tsx +++ /dev/null @@ -1,88 +0,0 @@ -"use client"; - -import { motion, AnimatePresence } from "framer-motion"; -import { X } from "lucide-react"; -import { cn } from "@/lib/utils"; -import type { TraceSpan } from "@/lib/types"; - -interface SpanDetailProps { - span: TraceSpan | null; - onClose: () => void; -} - -const SERVICE_COLORS: Record = { - "api-gateway": "#378ADD", - "auth-service": "#A855F7", - "product-service": "#22C55E", - "payment-service": "#F59E0B", - "db-postgres": "#6366F1", - "cache-redis": "#EF4444", -}; - -export function SpanDetail({ span, onClose }: SpanDetailProps) { - return ( - - {span && ( - -
-
-
- {span.name} -
- -
- -
- {[ - { label: "Span ID", value: span.id, mono: true }, - { label: "Service", value: span.service, mono: true }, - { label: "Start Time", value: `+${span.startTime}ms`, mono: true }, - { label: "Duration", value: `${span.duration}ms`, mono: true }, - { label: "Status", value: span.status, color: span.status === "error" ? "#EF4444" : "#22C55E" }, - { label: "Parent", value: span.parentId || "root", mono: true }, - ].map((field) => ( -
-

{field.label}

-

- {field.value} -

-
- ))} -
- - {Object.keys(span.tags).length > 0 && ( -
-

Tags

-
- {Object.entries(span.tags).map(([k, v]) => ( -
- {k} - = - {v} -
- ))} -
-
- )} - - )} - - ); -} diff --git a/hooks/use-data.ts b/hooks/use-data.ts index c7dedad..939cd9d 100644 --- a/hooks/use-data.ts +++ b/hooks/use-data.ts @@ -18,8 +18,6 @@ import type { Endpoint, Incident, ServiceStatus, - Trace, - TraceSpan, } from "@/lib/types"; // ─── Raw API shapes (snake_case) ───────────────────────────────────────────── @@ -47,29 +45,6 @@ interface ApiIncident { resolved: boolean; } -interface ApiSpan { - id: string; - trace_id: string; - parent_id?: string; - service: string; - name: string; - start_time: number; - duration: number; - status: string; - tags: Record; -} - -interface ApiTrace { - id: string; - root_span: string; - service: string; - endpoint: string; - total_duration: number; - timestamp: string; - status: string; - spans: ApiSpan[]; -} - interface ApiService { id: string; name: string; @@ -108,31 +83,6 @@ function toIncidents(raw: unknown): Incident[] { })); } -function toTraces(raw: unknown): Trace[] { - return (raw as ApiTrace[]).map((t) => ({ - id: t.id, - rootSpan: t.root_span, - service: t.service, - endpoint: t.endpoint, - totalDuration: t.total_duration, - timestamp: new Date(t.timestamp), - status: t.status as Trace["status"], - spans: t.spans.map( - (s): TraceSpan => ({ - id: s.id, - traceId: s.trace_id, - parentId: s.parent_id, - service: s.service, - name: s.name, - startTime: s.start_time, - duration: s.duration, - status: s.status as TraceSpan["status"], - tags: s.tags, - }) - ), - })); -} - function toServices(raw: unknown): ServiceStatus[] { return (raw as ApiService[]).map((s) => ({ id: s.id, @@ -172,16 +122,6 @@ export function useEndpoints(hours = 24) { ); } -/** Distributed traces from the spans table. */ -export function useTraces(hours = 24) { - return useApiQuery( - "/v1/traces", - { hours: String(hours) }, - EMPTY_LIST as unknown as Trace[], - toTraces, - ); -} - /** Service health derived from route-prefix groups — used by the status page. */ export function useServices() { return useApiQuery("/v1/services", {}, EMPTY_LIST as unknown as ServiceStatus[], toServices, 30_000); diff --git a/lib/types.ts b/lib/types.ts index 31c287a..d917a08 100644 --- a/lib/types.ts +++ b/lib/types.ts @@ -42,29 +42,6 @@ export interface Endpoint { healthScore: number; } -export interface TraceSpan { - id: string; - traceId: string; - parentId?: string; - service: string; - name: string; - startTime: number; - duration: number; - status: "ok" | "error"; - tags: Record; -} - -export interface Trace { - id: string; - rootSpan: string; - service: string; - endpoint: string; - totalDuration: number; - timestamp: Date; - status: "ok" | "error"; - spans: TraceSpan[]; -} - export interface AlertRule { id: string; name: string; diff --git a/packages/sdk-js/src/buffer.ts b/packages/sdk-js/src/buffer.ts index 6277baa..d2c0b2b 100644 --- a/packages/sdk-js/src/buffer.ts +++ b/packages/sdk-js/src/buffer.ts @@ -1,5 +1,5 @@ -import type { EventPayload, IngestBatch, SpanPayload, SpanBatch } from "./types"; -import { sendBatch, sendSpans } from "./client"; +import type { EventPayload, IngestBatch } from "./types"; +import { sendBatch } from "./client"; export class EventBuffer { private queue: EventPayload[] = []; @@ -51,48 +51,3 @@ export class EventBuffer { this.flush(); } } - -/** Batches spans and flushes them to /v1/spans on an interval or when full. */ -export class SpanBuffer { - private queue: SpanPayload[] = []; - private timer: ReturnType | null = null; - private flushing = false; - - constructor( - private readonly ingestUrl: string, - private readonly apiKey: string, - private readonly batchSize: number, - flushIntervalMs: number - ) { - this.timer = setInterval(() => this.flush(), flushIntervalMs); - if (this.timer.unref) this.timer.unref(); - - const shutdown = () => this.flush(); - process.once("SIGTERM", shutdown); - process.once("SIGINT", shutdown); - } - - add(span: SpanPayload): void { - this.queue.push(span); - // Backend accepts up to 500 spans per batch. - if (this.queue.length >= Math.min(this.batchSize, 500)) { - this.flush(); - } - } - - flush(): void { - if (this.flushing || this.queue.length === 0) return; - this.flushing = true; - const batch: SpanBatch = { spans: this.queue.splice(0) }; - sendSpans(this.ingestUrl, this.apiKey, batch); - this.flushing = false; - } - - destroy(): void { - if (this.timer) { - clearInterval(this.timer); - this.timer = null; - } - this.flush(); - } -} diff --git a/packages/sdk-js/src/client.ts b/packages/sdk-js/src/client.ts index 3afc6b7..6cd9342 100644 --- a/packages/sdk-js/src/client.ts +++ b/packages/sdk-js/src/client.ts @@ -1,4 +1,4 @@ -import type { IngestBatch, SpanBatch } from "./types"; +import type { IngestBatch } from "./types"; import * as https from "https"; import * as http from "http"; @@ -48,8 +48,3 @@ function post(ingestUrl: string, path: string, apiKey: string, payload: unknown) export function sendBatch(ingestUrl: string, apiKey: string, batch: IngestBatch): void { post(ingestUrl, "/v1/ingest", apiKey, batch); } - -/** POST a batch of spans to /v1/spans. */ -export function sendSpans(ingestUrl: string, apiKey: string, batch: SpanBatch): void { - post(ingestUrl, "/v1/spans", apiKey, batch); -} diff --git a/packages/sdk-js/src/config.ts b/packages/sdk-js/src/config.ts index 5f45374..33cc653 100644 --- a/packages/sdk-js/src/config.ts +++ b/packages/sdk-js/src/config.ts @@ -9,8 +9,6 @@ const DEFAULTS = { redactHeaders: ["authorization", "cookie"], flushInterval: 500, batchSize: 100, - service: "api", - tracing: true, } as const; export function resolveConfig(config: LiveBoardConfig): ResolvedConfig { @@ -29,8 +27,6 @@ export function resolveConfig(config: LiveBoardConfig): ResolvedConfig { getUserId: config.getUserId ?? extractUserId, flushInterval: config.flushInterval ?? DEFAULTS.flushInterval, batchSize: config.batchSize ?? DEFAULTS.batchSize, - service: config.service ?? DEFAULTS.service, - tracing: config.tracing ?? DEFAULTS.tracing, }; } diff --git a/packages/sdk-js/src/express.ts b/packages/sdk-js/src/express.ts index 5a0378b..1632091 100644 --- a/packages/sdk-js/src/express.ts +++ b/packages/sdk-js/src/express.ts @@ -3,7 +3,7 @@ import type { IncomingMessage, ServerResponse } from "http"; import type { LiveBoardConfig } from "./types"; import { resolveConfig, shouldIgnore, shouldSample } from "./config"; import { getRoute } from "./normalise"; -import { EventBuffer, SpanBuffer } from "./buffer"; +import { EventBuffer } from "./buffer"; import { SDK_VERSION } from "./version"; // Minimal Express-compatible types — avoids a hard @types/express dependency @@ -25,9 +25,6 @@ export function createExpressMiddleware(config: LiveBoardConfig): Middleware { resolved.batchSize, resolved.flushInterval ); - const spanBuffer = resolved.tracing - ? new SpanBuffer(resolved.ingestUrl, resolved.apiKey, resolved.batchSize, resolved.flushInterval) - : null; return function liveboardMiddleware( req: IncomingMessage, @@ -35,20 +32,11 @@ export function createExpressMiddleware(config: LiveBoardConfig): Middleware { next: NextFunction ): void { const startMs = Date.now(); - // Propagate incoming trace ID from upstream service, or start a new trace + // Reuse an upstream request's correlation id when present, else mint one. + // Echoed back on the response so a caller can correlate its own logs. const incoming = req.headers["x-trace-id"]; const traceId = (typeof incoming === "string" && incoming) ? incoming : randomUUID(); - - // If an upstream instrumented service passed its span id, parent to it. - const incomingParent = req.headers["x-parent-span-id"]; - const parentId = typeof incomingParent === "string" && incomingParent ? incomingParent : undefined; - - // This request's root span id — propagated to downstream services so they - // can attach their spans under it (enables cross-service traces). - const spanId = randomUUID(); - res.setHeader("x-trace-id", traceId); - res.setHeader("x-parent-span-id", spanId); res.on("finish", () => { const route = getRoute(req); @@ -74,21 +62,6 @@ export function createExpressMiddleware(config: LiveBoardConfig): Middleware { : undefined, sdk_version: SDK_VERSION, }); - - // Emit a root span for this request → powers the trace / flame-graph view. - if (spanBuffer) { - spanBuffer.add({ - span_id: spanId, - trace_id: traceId, - parent_id: parentId, - service_name: resolved.service, - operation: `${method} ${route}`, - start_time: new Date(startMs).toISOString(), - duration_ms: durationMs, - status_code: statusCode, - tags: { method, route }, - }); - } }); next(); diff --git a/packages/sdk-js/src/types.ts b/packages/sdk-js/src/types.ts index 8b20925..632cb02 100644 --- a/packages/sdk-js/src/types.ts +++ b/packages/sdk-js/src/types.ts @@ -27,16 +27,6 @@ export interface LiveBoardConfig { flushInterval?: number; /** Flush early when the buffer reaches this many events. Default: 100 */ batchSize?: number; - /** - * Service name attached to emitted spans (shown in the trace/flame view). - * Default: 'api' - */ - service?: string; - /** - * Emit a distributed-tracing span per request. Default: true. - * Set false to send only request events (no spans). - */ - tracing?: boolean; } // ─── Internal resolved config (all fields required + defaults applied) ──────── @@ -49,8 +39,6 @@ export interface ResolvedConfig { getUserId: (req: IncomingMessage) => string | undefined; flushInterval: number; batchSize: number; - service: string; - tracing: boolean; } // ─── Wire format — must match apps/api/api/schemas.py EventPayload exactly ─── @@ -60,7 +48,7 @@ export interface EventPayload { route: string; status_code: number; duration_ms: number; - trace_id: string; + trace_id: string; // request correlation id user_id?: string; timestamp: string; // ISO 8601 UTC error_msg?: string; // max 500 chars, only when status ≥ 500 @@ -70,21 +58,3 @@ export interface EventPayload { export interface IngestBatch { events: EventPayload[]; } - -// ─── Span wire format — must match apps/api/api/schemas.py SpanIn exactly ───── - -export interface SpanPayload { - span_id: string; - trace_id: string; - parent_id?: string; - service_name: string; - operation: string; - start_time: string; // ISO 8601 UTC - duration_ms: number; - status_code: number; - tags: Record; -} - -export interface SpanBatch { - spans: SpanPayload[]; -} diff --git a/public/shots/traces.png b/public/shots/traces.png deleted file mode 100644 index ca7eb4fd47f4d4a1f4c40d9bb08723a684ea4c5b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211140 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�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℞bu(Um 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 From d49feddef3e6277761afa4428a14b782c672ef78 Mon Sep 17 00:00:00 2001 From: ryzrr Date: Mon, 7 Sep 2026 23:23:34 +0530 Subject: [PATCH 2/9] trim: keep only the Express and FastAPI/ASGI SDK adapters Removes the Fastify plugin, the Django middleware and the Flask extension, along with the machinery only they used: the SDK's sync (threaded) event buffer, the sync HTTP sender, and the Django/Flask route-pattern normalisers. Package manifests drop the corresponding extras and peer deps. --- packages/sdk-js/package.json | 10 +- packages/sdk-js/src/fastify.ts | 83 ------------ packages/sdk-js/src/index.ts | 4 +- packages/sdk-js/src/normalise.ts | 8 +- packages/sdk-python/liveboard/__init__.py | 17 +-- packages/sdk-python/liveboard/_buffer.py | 50 +------- packages/sdk-python/liveboard/_client.py | 19 --- packages/sdk-python/liveboard/_normalise.py | 24 ---- packages/sdk-python/liveboard/django.py | 134 -------------------- packages/sdk-python/liveboard/flask.py | 125 ------------------ packages/sdk-python/pyproject.toml | 8 +- 11 files changed, 13 insertions(+), 469 deletions(-) delete mode 100644 packages/sdk-js/src/fastify.ts delete mode 100644 packages/sdk-python/liveboard/django.py delete mode 100644 packages/sdk-python/liveboard/flask.py diff --git a/packages/sdk-js/package.json b/packages/sdk-js/package.json index 7891065..8ff1a6d 100644 --- a/packages/sdk-js/package.json +++ b/packages/sdk-js/package.json @@ -1,7 +1,7 @@ { "name": "liveboard-sdk", "version": "0.1.0", - "description": "LiveBoard SDK — zero-config API observability for Express, Fastify, and more", + "description": "LiveBoard SDK — zero-config API observability for Express", "main": "./dist/index.cjs", "module": "./dist/index.mjs", "types": "./dist/index.d.ts", @@ -22,7 +22,7 @@ "typecheck": "tsc --noEmit", "lint": "eslint src" }, - "keywords": ["api", "observability", "monitoring", "express", "fastify", "liveboard"], + "keywords": ["api", "observability", "monitoring", "express", "liveboard"], "license": "MIT", "devDependencies": { "@rollup/plugin-typescript": "^12.0.0", @@ -32,11 +32,9 @@ "typescript": "^5.0.0" }, "peerDependencies": { - "express": ">=4.0.0", - "fastify": ">=4.0.0" + "express": ">=4.0.0" }, "peerDependenciesMeta": { - "express": { "optional": true }, - "fastify": { "optional": true } + "express": { "optional": true } } } diff --git a/packages/sdk-js/src/fastify.ts b/packages/sdk-js/src/fastify.ts deleted file mode 100644 index ca5b7a9..0000000 --- a/packages/sdk-js/src/fastify.ts +++ /dev/null @@ -1,83 +0,0 @@ -import { randomUUID } from "crypto"; -import type { LiveBoardConfig } from "./types"; -import { resolveConfig, shouldIgnore, shouldSample } from "./config"; -import { EventBuffer } from "./buffer"; -import { SDK_VERSION } from "./version"; - -// Minimal Fastify types to avoid a hard peer-dep import at runtime -type FastifyInstance = { - addHook: (event: string, fn: (...args: any[]) => any) => void; -}; -type FastifyRequest = { - method: string; - url: string; - routerPath?: string; - headers: Record; - raw: import("http").IncomingMessage; -}; -type FastifyReply = { - statusCode: number; - header: (name: string, value: string) => void; -}; - -/** Symbol used to stash per-request timing data on the request object. */ -const kStart = Symbol("liveboard.start"); -const kTraceId = Symbol("liveboard.traceId"); - -/** - * Fastify plugin for LiveBoard observability. - * - * Usage: - * await fastify.register(liveboardPlugin, { apiKey: 'lb_live_...' }); - */ -export function createFastifyPlugin(config: LiveBoardConfig) { - const resolved = resolveConfig(config); - const buffer = new EventBuffer( - resolved.ingestUrl, - resolved.apiKey, - resolved.batchSize, - resolved.flushInterval - ); - - return async function liveboardPlugin( - fastify: FastifyInstance, - _opts: unknown - ): Promise { - fastify.addHook("onRequest", (request: any, reply: any, done: () => void) => { - request[kStart] = Date.now(); - // Propagate incoming trace ID from upstream service, or start a new trace - const incoming = request.headers["x-trace-id"]; - request[kTraceId] = (typeof incoming === "string" && incoming) ? incoming : randomUUID(); - reply.header("x-trace-id", request[kTraceId]); - done(); - }); - - fastify.addHook( - "onResponse", - (request: any, reply: any, done: () => void) => { - const route: string = request.routerPath ?? request.url ?? "/"; - - if (!shouldIgnore(route, resolved.ignoreRoutes) && shouldSample(resolved.sampleRate)) { - const durationMs = Date.now() - (request[kStart] as number ?? Date.now()); - - buffer.add({ - method: (request.method as string).toUpperCase(), - route, - status_code: reply.statusCode as number, - duration_ms: durationMs, - trace_id: request[kTraceId] as string, - user_id: resolved.getUserId(request.raw), - timestamp: new Date().toISOString(), - error_msg: - reply.statusCode >= 500 - ? String(request.__liveboardError ?? "").slice(0, 500) || undefined - : undefined, - sdk_version: SDK_VERSION, - }); - } - - done(); - } - ); - }; -} diff --git a/packages/sdk-js/src/index.ts b/packages/sdk-js/src/index.ts index c6fc427..6ef92f6 100644 --- a/packages/sdk-js/src/index.ts +++ b/packages/sdk-js/src/index.ts @@ -1,9 +1,7 @@ import { createExpressMiddleware } from "./express"; -import { createFastifyPlugin } from "./fastify"; export { createExpressMiddleware as middleware }; -export { createFastifyPlugin as fastifyPlugin }; export type { LiveBoardConfig, EventPayload, ResolvedConfig } from "./types"; export { SDK_VERSION } from "./version"; -export default { middleware: createExpressMiddleware, fastifyPlugin: createFastifyPlugin }; +export default { middleware: createExpressMiddleware }; diff --git a/packages/sdk-js/src/normalise.ts b/packages/sdk-js/src/normalise.ts index 8b3c214..0d1966b 100644 --- a/packages/sdk-js/src/normalise.ts +++ b/packages/sdk-js/src/normalise.ts @@ -29,8 +29,8 @@ export function normaliseUrl(rawUrl: string): string { /** * Get the route pattern from a request. - * Prefers the framework's own route pattern (Express: req.route.path, - * Fastify: req.routerPath) — falls back to regex normalisation. + * Prefers the framework's own route pattern (Express: req.route.path) and + * falls back to regex normalisation. */ export function getRoute(req: IncomingMessage): string { // Express attaches matched route pattern to req.route @@ -38,10 +38,6 @@ export function getRoute(req: IncomingMessage): string { const expressRoute: string = (req as any).route?.path ?? ""; if (expressRoute) return expressBase + expressRoute; - // Fastify attaches routerPath - const fastifyPath: string = (req as any).routerPath ?? ""; - if (fastifyPath) return fastifyPath; - // Fallback: normalise the raw URL return normaliseUrl(req.url ?? "/"); } diff --git a/packages/sdk-python/liveboard/__init__.py b/packages/sdk-python/liveboard/__init__.py index b2029ed..763a553 100644 --- a/packages/sdk-python/liveboard/__init__.py +++ b/packages/sdk-python/liveboard/__init__.py @@ -6,15 +6,6 @@ FastAPI / Starlette (ASGI): from liveboard.asgi import LiveBoardMiddleware app.add_middleware(LiveBoardMiddleware, api_key="lb_live_...") - -Django: - # settings.py - MIDDLEWARE = [..., "liveboard.django.LiveBoardMiddleware"] - LIVEBOARD = {"API_KEY": "lb_live_..."} - -Flask: - from liveboard.flask import init_liveboard - init_liveboard(app, api_key="lb_live_...") """ from ._version import SDK_VERSION @@ -25,9 +16,7 @@ __all__ = [ "SDK_VERSION", "LiveBoardConfig", - # Framework adapters are imported from their own submodules to avoid - # pulling in framework-specific code when only one framework is installed: - # from liveboard.asgi import LiveBoardMiddleware - # from liveboard.django import LiveBoardMiddleware - # from liveboard.flask import init_liveboard + # The ASGI adapter lives in its own submodule so importing this package + # never pulls in framework-specific code: + # from liveboard.asgi import LiveBoardMiddleware ] diff --git a/packages/sdk-python/liveboard/_buffer.py b/packages/sdk-python/liveboard/_buffer.py index 0353393..080ec62 100644 --- a/packages/sdk-python/liveboard/_buffer.py +++ b/packages/sdk-python/liveboard/_buffer.py @@ -1,10 +1,9 @@ from __future__ import annotations import asyncio -import threading from typing import Any, Optional -from ._client import send_batch_async, send_batch_sync +from ._client import send_batch_async class AsyncEventBuffer: @@ -63,50 +62,3 @@ async def flush_and_close(self) -> None: if self._queue: batch, self._queue = self._queue, [] await send_batch_async(self._ingest_url, self._api_key, batch) - - -class SyncEventBuffer: - """ - Non-blocking event buffer for sync frameworks (Django / Flask). - - Uses a daemon threading.Timer chain for periodic flushing and a - threading.Lock to protect the queue across concurrent requests. - """ - - def __init__( - self, - ingest_url: str, - api_key: str, - batch_size: int = 100, - flush_interval: float = 0.5, - ) -> None: - self._ingest_url = ingest_url - self._api_key = api_key - self._batch_size = batch_size - self._flush_interval = flush_interval - self._queue: list[dict[str, Any]] = [] - self._lock = threading.Lock() - self._schedule_next() - - def _schedule_next(self) -> None: - t = threading.Timer(self._flush_interval, self._tick) - t.daemon = True - t.start() - - def _tick(self) -> None: - self._flush() - self._schedule_next() - - def add(self, event: dict[str, Any]) -> None: - with self._lock: - self._queue.append(event) - ready = len(self._queue) >= self._batch_size - if ready: - self._flush() - - def _flush(self) -> None: - with self._lock: - if not self._queue: - return - batch, self._queue = self._queue, [] - send_batch_sync(self._ingest_url, self._api_key, batch) diff --git a/packages/sdk-python/liveboard/_client.py b/packages/sdk-python/liveboard/_client.py index 77aff0e..fc869a6 100644 --- a/packages/sdk-python/liveboard/_client.py +++ b/packages/sdk-python/liveboard/_client.py @@ -1,6 +1,5 @@ from __future__ import annotations -import threading from typing import Any import httpx @@ -19,21 +18,3 @@ async def send_batch_async(ingest_url: str, api_key: str, events: list[dict[str, ) except Exception: pass - - -def send_batch_sync(ingest_url: str, api_key: str, events: list[dict[str, Any]]) -> None: - """Fire-and-forget sync POST in a daemon thread. Silently drops all errors.""" - - def _worker() -> None: - try: - with httpx.Client(timeout=_TIMEOUT) as client: - client.post( - f"{ingest_url}/v1/ingest", - json={"events": events}, - headers={"x-api-key": api_key}, - ) - except Exception: - pass - - t = threading.Thread(target=_worker, daemon=True) - t.start() diff --git a/packages/sdk-python/liveboard/_normalise.py b/packages/sdk-python/liveboard/_normalise.py index 120c1f0..c3a0d85 100644 --- a/packages/sdk-python/liveboard/_normalise.py +++ b/packages/sdk-python/liveboard/_normalise.py @@ -12,10 +12,6 @@ _INTEGER = re.compile(r"^\d+$") _MIXED_ID = re.compile(r"^[a-zA-Z0-9_-]{6,}$") -# Django: or → :pk / :slug -_DJANGO_PARAM = re.compile(r"<(?:[^:>]+:)?([^>]+)>") -# Flask: or → :user_id -_FLASK_PARAM = re.compile(r"<(?:[^:>]+:)?([^>]+)>") def _is_id_segment(segment: str) -> bool: @@ -52,26 +48,6 @@ def route_from_path_params(path: str, path_params: dict[str, str]) -> str: return route -def normalise_django_pattern(pattern: str) -> str: - """ - Convert a Django URL pattern to a normalised route. - users//posts// → /users/:user_id/posts/:post_slug - """ - route = pattern.rstrip("/") - route = _DJANGO_PARAM.sub(lambda m: f":{m.group(1)}", route) - # Catch any remaining raw regex groups - route = re.sub(r"\([^)]+\)", ":id", route) - return route if route.startswith("/") else f"/{route}" - - -def normalise_flask_rule(rule: str) -> str: - """ - Convert a Flask URL rule to a normalised route. - /users/ → /users/:user_id - """ - return _FLASK_PARAM.sub(lambda m: f":{m.group(1)}", rule) - - def extract_user_id(authorization: Optional[str]) -> Optional[str]: """ Extract the `sub` claim from a Bearer JWT without verifying the signature. diff --git a/packages/sdk-python/liveboard/django.py b/packages/sdk-python/liveboard/django.py deleted file mode 100644 index 85fc71c..0000000 --- a/packages/sdk-python/liveboard/django.py +++ /dev/null @@ -1,134 +0,0 @@ -""" -Django middleware for LiveBoard observability. - -Usage — settings.py: - - MIDDLEWARE = [ - ... - "liveboard.django.LiveBoardMiddleware", - ] - - LIVEBOARD = { - "API_KEY": "lb_live_...", # required - "INGEST_URL": "http://localhost:8000", - "SAMPLE_RATE": 1.0, - "IGNORE_ROUTES": ["/health", "/healthz", "/ping", "/favicon.ico"], - "FLUSH_INTERVAL": 0.5, - "BATCH_SIZE": 100, - } -""" -from __future__ import annotations - -import random -import time -import uuid -from datetime import datetime, timezone -from typing import Any, Callable, Optional - -from ._buffer import SyncEventBuffer -from ._config import LiveBoardConfig -from ._normalise import extract_user_id, normalise_django_pattern, normalise_url -from ._version import SDK_VERSION - - -def _load_config() -> LiveBoardConfig: - """Read LIVEBOARD dict from Django settings at first request.""" - from django.conf import settings # type: ignore[import-untyped] - - cfg: dict[str, Any] = getattr(settings, "LIVEBOARD", {}) - api_key: str = cfg.get("API_KEY", "") - return LiveBoardConfig( - api_key=api_key, - ingest_url=cfg.get("INGEST_URL", "http://localhost:8000"), - sample_rate=float(cfg.get("SAMPLE_RATE", 1.0)), - ignore_routes=cfg.get( - "IGNORE_ROUTES", ["/health", "/healthz", "/ping", "/favicon.ico"] - ), - flush_interval=float(cfg.get("FLUSH_INTERVAL", 0.5)), - batch_size=int(cfg.get("BATCH_SIZE", 100)), - ) - - -class LiveBoardMiddleware: - """ - Sync Django middleware. Add to MIDDLEWARE in settings.py. - Config is read from the LIVEBOARD dict in settings. - """ - - def __init__(self, get_response: Callable) -> None: - self._get_response = get_response - self._config: Optional[LiveBoardConfig] = None - self._buffer: Optional[SyncEventBuffer] = None - - def _ensure_init(self) -> None: - if self._config is None: - self._config = _load_config() - self._buffer = SyncEventBuffer( - self._config.ingest_url, - self._config.api_key, - self._config.batch_size, - self._config.flush_interval, - ) - - def __call__(self, request: Any) -> Any: - self._ensure_init() - assert self._config is not None - assert self._buffer is not None - - if self._config.sample_rate < 1.0 and random.random() >= self._config.sample_rate: - return self._get_response(request) - - start_ns = time.perf_counter_ns() - # Propagate incoming trace ID from upstream service, or start a new trace - # Django exposes headers as HTTP_X_TRACE_ID in request.META - trace_id = request.META.get("HTTP_X_TRACE_ID") or str(uuid.uuid4()) - - response = self._get_response(request) - - duration_ms = int((time.perf_counter_ns() - start_ns) / 1_000_000) - - # Django sets resolver_match after URL resolution (inside get_response) - route = self._get_route(request) - - if self._should_ignore(route, request.path): - return response - - user_id: Optional[str] = ( - self._config.get_user_id(request) - if self._config.get_user_id - else extract_user_id(request.META.get("HTTP_AUTHORIZATION")) - ) - - # Inject trace ID header - response["X-Trace-Id"] = trace_id - - self._buffer.add({ - "method": request.method.upper(), - "route": route, - "status_code": response.status_code, - "duration_ms": duration_ms, - "trace_id": trace_id, - "user_id": user_id, - "timestamp": datetime.now(timezone.utc).isoformat(), - "error_msg": None, - "sdk_version": SDK_VERSION, - }) - - return response - - def _get_route(self, request: Any) -> str: - resolver_match = getattr(request, "resolver_match", None) - if resolver_match and hasattr(resolver_match, "route") and resolver_match.route: - return normalise_django_pattern(resolver_match.route) - return normalise_url(request.path) - - def _should_ignore(self, route: str, path: str) -> bool: - assert self._config is not None - for pattern in self._config.ignore_routes: - if isinstance(pattern, str): - if pattern == route or pattern == path: - return True - else: - if pattern.search(route) or pattern.search(path): - return True - return False diff --git a/packages/sdk-python/liveboard/flask.py b/packages/sdk-python/liveboard/flask.py deleted file mode 100644 index 3369056..0000000 --- a/packages/sdk-python/liveboard/flask.py +++ /dev/null @@ -1,125 +0,0 @@ -""" -Flask extension for LiveBoard observability. - -Usage: - from liveboard.flask import init_liveboard - - app = Flask(__name__) - init_liveboard(app, api_key="lb_live_...") -""" -from __future__ import annotations - -import random -import time -import uuid -from datetime import datetime, timezone -from typing import Any, Optional - -from ._buffer import SyncEventBuffer -from ._config import LiveBoardConfig -from ._normalise import extract_user_id, normalise_flask_rule, normalise_url -from ._version import SDK_VERSION - -# Flask request context globals — imported lazily to avoid a hard dep at module load -_flask_g: Any = None -_flask_request: Any = None - - -def _get_flask_globals() -> tuple[Any, Any]: - global _flask_g, _flask_request - if _flask_g is None: - from flask import g, request # type: ignore[import-untyped] - _flask_g = g - _flask_request = request - return _flask_g, _flask_request - - -def init_liveboard(app: Any, *, api_key: str, **kwargs: Any) -> None: - """ - Register LiveBoard hooks on a Flask application. - - All keyword arguments map 1-to-1 to LiveBoardConfig fields: - ingest_url default: http://localhost:8000 - sample_rate default: 1.0 - ignore_routes default: ['/health', '/healthz', '/ping', '/favicon.ico'] - get_user_id default: JWT sub-claim extraction - flush_interval default: 0.5s - batch_size default: 100 - """ - config = LiveBoardConfig(api_key=api_key, **kwargs) - buffer = SyncEventBuffer( - config.ingest_url, - config.api_key, - config.batch_size, - config.flush_interval, - ) - - @app.before_request - def _before() -> None: - g, _ = _get_flask_globals() - g._lb_skip = ( - config.sample_rate < 1.0 and random.random() >= config.sample_rate - ) - if not g._lb_skip: - g._lb_start_ns = time.perf_counter_ns() - _, req = _get_flask_globals() - # Propagate incoming trace ID from upstream service, or start a new trace - g._lb_trace_id = req.headers.get("X-Trace-Id") or str(uuid.uuid4()) - - @app.after_request - def _after(response: Any) -> Any: - g, request = _get_flask_globals() - - if getattr(g, "_lb_skip", True): - return response - - duration_ms = int( - (time.perf_counter_ns() - g._lb_start_ns) / 1_000_000 - ) - trace_id: str = g._lb_trace_id - - route = _get_flask_route(request) - - if _should_ignore(route, request.path, config): - return response - - user_id: Optional[str] = ( - config.get_user_id(request) - if config.get_user_id - else extract_user_id(request.headers.get("Authorization")) - ) - - response.headers["X-Trace-Id"] = trace_id - - buffer.add({ - "method": request.method.upper(), - "route": route, - "status_code": response.status_code, - "duration_ms": duration_ms, - "trace_id": trace_id, - "user_id": user_id, - "timestamp": datetime.now(timezone.utc).isoformat(), - "error_msg": None, - "sdk_version": SDK_VERSION, - }) - - return response - - -def _get_flask_route(request: Any) -> str: - """Prefer Flask's matched URL rule; fall back to regex normalisation.""" - rule = getattr(request, "url_rule", None) - if rule is not None: - return normalise_flask_rule(str(rule)) - return normalise_url(request.path) - - -def _should_ignore(route: str, path: str, config: LiveBoardConfig) -> bool: - for pattern in config.ignore_routes: - if isinstance(pattern, str): - if pattern == route or pattern == path: - return True - else: - if pattern.search(route) or pattern.search(path): - return True - return False diff --git a/packages/sdk-python/pyproject.toml b/packages/sdk-python/pyproject.toml index fa01814..d1cf723 100644 --- a/packages/sdk-python/pyproject.toml +++ b/packages/sdk-python/pyproject.toml @@ -5,25 +5,21 @@ build-backend = "setuptools.backends.legacy:build" [project] name = "liveboard-sdk" version = "0.1.0" -description = "LiveBoard SDK — zero-config API observability for FastAPI, Django, and Flask" +description = "LiveBoard SDK — zero-config API observability for FastAPI" license = { text = "MIT" } requires-python = ">=3.9" -keywords = ["api", "observability", "monitoring", "fastapi", "django", "flask"] +keywords = ["api", "observability", "monitoring", "fastapi"] dependencies = [ "httpx>=0.27.0", ] [project.optional-dependencies] fastapi = ["fastapi>=0.100.0", "starlette>=0.27.0"] -django = ["django>=3.2"] -flask = ["flask>=2.0"] dev = [ "pytest>=7.0", "pytest-asyncio>=0.23", "fastapi>=0.100.0", "httpx>=0.27.0", - "django>=3.2", - "flask>=2.0", "ruff", ] From 15d0686d59854af542fbdf011b8cde0d9797e56e Mon Sep 17 00:00:00 2001 From: ryzrr Date: Tue, 8 Sep 2026 00:36:27 +0530 Subject: [PATCH 3/9] trim: remove alert rules and delivery channels Drops the /alerts dashboard page and rule list, the /v1/alert-rules, /v1/alert-history and /v1/channels routes, the alert-evaluator worker loop and its Slack/Discord/PagerDuty/webhook delivery module, and the alert_rules, alert_history and alert_channels tables. Incidents are untouched: the z-score anomaly detector still writes them and the overview panel still renders them. The worker now runs three loops instead of four. --- app/(dashboard)/alerts/page.tsx | 506 ------------------ app/layout.tsx | 2 +- apps/api/api/routes/alerts.py | 306 ----------- apps/api/api/schemas.py | 78 --- apps/api/core/notify.py | 62 --- apps/api/main.py | 3 +- .../migrations/versions/002_alert_rules.py | 58 -- .../migrations/versions/003_multitenancy.py | 2 +- apps/api/migrations/versions/005_rls.py | 6 +- .../migrations/versions/006_alert_channels.py | 50 -- .../versions/007_public_status_page.py | 2 +- apps/api/worker/alerts.py | 150 ------ apps/api/worker/main.py | 8 +- components/alerts/rule-list.tsx | 137 ----- components/landing/channel-marks.tsx | 35 -- components/landing/feature-grid.tsx | 24 +- components/landing/footer.tsx | 2 +- components/landing/stats-section.tsx | 7 +- components/layout/sidebar.tsx | 7 - components/projects/create-project-dialog.tsx | 2 +- components/settings/project-settings-card.tsx | 2 +- hooks/use-data.ts | 188 ------- lib/types.ts | 14 - proxy.ts | 2 - public/shots/alerts.png | Bin 211594 -> 0 bytes 25 files changed, 30 insertions(+), 1623 deletions(-) delete mode 100644 app/(dashboard)/alerts/page.tsx delete mode 100644 apps/api/api/routes/alerts.py delete mode 100644 apps/api/core/notify.py delete mode 100644 apps/api/migrations/versions/002_alert_rules.py delete mode 100644 apps/api/migrations/versions/006_alert_channels.py delete mode 100644 apps/api/worker/alerts.py delete mode 100644 components/alerts/rule-list.tsx delete mode 100644 components/landing/channel-marks.tsx delete mode 100644 public/shots/alerts.png diff --git a/app/(dashboard)/alerts/page.tsx b/app/(dashboard)/alerts/page.tsx deleted file mode 100644 index c7f7ea1..0000000 --- a/app/(dashboard)/alerts/page.tsx +++ /dev/null @@ -1,506 +0,0 @@ -"use client"; - -import { useState, useEffect } from "react"; -import { Plus, ArrowRight, Send, CheckCircle2, XCircle, Loader2 } from "lucide-react"; -import { Topbar } from "@/components/layout/topbar"; -import { RuleList } from "@/components/alerts/rule-list"; -import { Badge } from "@/components/ui/badge"; -import { Button } from "@/components/ui/button"; -import { cn } from "@/lib/utils"; -import { useAlertRules, useAlertHistory, useChannels } from "@/hooks/use-data"; -import type { CreateAlertRulePayload, AlertChannel, CreateChannelPayload } from "@/hooks/use-data"; -import { useProjects } from "@/components/providers/project-provider"; -import { timeAgo } from "@/lib/utils"; - -// ─── Types ──────────────────────────────────────────────────────────────────── - -type ChannelType = "slack" | "discord" | "pagerduty" | "webhook"; - -const CHANNEL_ICON: Record = { - slack: "💬", - discord: "🎮", - pagerduty: "📟", - webhook: "🔗", -}; - -const CHANNEL_TYPES: { value: ChannelType; label: string }[] = [ - { value: "slack", label: "Slack" }, - { value: "discord", label: "Discord" }, - { value: "pagerduty", label: "PagerDuty" }, - { value: "webhook", label: "Webhook" }, -]; - - -const SEVERITIES = [ - { value: "critical", label: "Critical", color: "#EF4444" }, - { value: "warning", label: "Warning", color: "#F59E0B" }, - { value: "info", label: "Info", color: "#378ADD" }, -] as const; - -type Severity = "critical" | "warning" | "info"; - -// ─── Channel config form ────────────────────────────────────────────────────── - -const CHANNEL_PLACEHOLDER: Record = { - slack: "https://hooks.slack.com/services/T.../B.../...", - discord: "https://discord.com/api/webhooks/...", - pagerduty: "PagerDuty Events v2 routing key", - webhook: "https://your-server.com/webhook", -}; - -function ChannelConfigForm({ channel, onSave, onTest, onDelete, onClose }: { - channel: AlertChannel; - onSave: (id: string, patch: { webhook_url: string; enabled: boolean }) => Promise; - onTest: (id: string) => Promise<{ ok: boolean; detail: string }>; - onDelete: (id: string) => Promise; - onClose: () => void; -}) { - const [url, setUrl] = useState(channel.webhookUrl ?? ""); - const [testing, setTesting] = useState(false); - const [saving, setSaving] = useState(false); - const [testResult, setTestResult] = useState<{ ok: boolean; detail: string } | null>(null); - - async function handleTest() { - setSaving(true); - // Persist the URL first so the backend test uses the latest value. - try { await onSave(channel.id, { webhook_url: url, enabled: true }); } finally { setSaving(false); } - setTesting(true); - setTestResult(null); - try { setTestResult(await onTest(channel.id)); } - catch { setTestResult({ ok: false, detail: "request failed" }); } - finally { setTesting(false); } - } - - async function handleSave() { - setSaving(true); - try { await onSave(channel.id, { webhook_url: url, enabled: true }); onClose(); } - finally { setSaving(false); } - } - - return ( -
-
-
- {CHANNEL_ICON[channel.type]} - {channel.name} -
- -
- -
- - { setUrl(e.target.value); setTestResult(null); }} - placeholder={CHANNEL_PLACEHOLDER[channel.type]} - className="mt-1 w-full bg-[#111] border border-[#2A2A2A] rounded px-3 py-1.5 text-xs text-[#F5F5F5] placeholder-[#333] outline-none focus:border-blue transition-colors font-mono" - /> -
- - {testResult && ( -
- {testResult.ok ? : } - {testResult.ok ? `Test message delivered (${testResult.detail})` : `Delivery failed — ${testResult.detail}`} -
- )} - - {channel.lastDeliveryAt && ( -

- Last delivery: {timeAgo(channel.lastDeliveryAt)} ·{" "} - - {channel.lastDeliveryOk ? "OK" : "Failed"} - -

- )} - -
- - - -
-
- ); -} - -function AddChannelForm({ onCreate, onClose }: { - onCreate: (input: CreateChannelPayload) => Promise; - onClose: () => void; -}) { - const [type, setType] = useState("slack"); - const [name, setName] = useState(""); - const [url, setUrl] = useState(""); - const [saving, setSaving] = useState(false); - - async function handleCreate() { - if (!name.trim() || !url.trim()) return; - setSaving(true); - try { await onCreate({ type, name: name.trim(), webhook_url: url.trim(), enabled: true }); onClose(); } - finally { setSaving(false); } - } - - return ( -
-
- New channel - -
-
- - setName(e.target.value)} - placeholder="Name (e.g. Slack #alerts)" - className="bg-[#111] border border-[#2A2A2A] rounded px-3 py-1.5 text-xs text-[#F5F5F5] placeholder-[#333] outline-none focus:border-blue flex-1 min-w-[160px]" - /> -
- setUrl(e.target.value)} - placeholder={CHANNEL_PLACEHOLDER[type]} - className="w-full bg-[#111] border border-[#2A2A2A] rounded px-3 py-1.5 text-xs text-[#F5F5F5] placeholder-[#333] outline-none focus:border-blue font-mono" - /> - -
- ); -} - -// ─── Page ───────────────────────────────────────────────────────────────────── - -const METRIC_TO_KEY: Record = { - "Error Rate": "error_rate", - "p99 Latency": "p99_latency", - "Requests/min": "requests_per_min", - "Apdex Score": "apdex_score", -}; - -const OPERATOR_TO_SYM: Record" | "<" | "=" | "!="> = { - exceeds: ">", - "drops below": "<", - equals: "=", -}; - -export default function AlertsPage() { - const { activeProject } = useProjects(); - const { data: fetchedRules, createRule, toggleRule } = useAlertRules(); - const { data: historyEntries } = useAlertHistory(); - const { data: channels, createChannel, updateChannel, deleteChannel, testChannel } = useChannels(); - - // Local rules state — seeded from API, updated optimistically on create - const [localRules, setLocalRules] = useState(fetchedRules); - // Sync when real data arrives (replaces mock fallback) - useEffect(() => { setLocalRules(fetchedRules); }, [fetchedRules]); - - const [activeTab, setActiveTab] = useState<"rules" | "channels" | "history">("rules"); - const [configuringId, setConfiguringId] = useState(null); - const [addingChannel, setAddingChannel] = useState(false); - const [creating, setCreating] = useState(false); - - // Rule builder state - const [metric, setMetric] = useState("Error Rate"); - const [operator, setOperator] = useState("exceeds"); - const [threshold, setThreshold] = useState("5"); - const [window, setWindow] = useState("5"); - const [severity, setSeverity] = useState("warning"); - // Rule "send to" holds the channel NAME (matched by the evaluation worker). - const [channelName, setChannelName] = useState(""); - - // Default the rule-builder channel to the first enabled channel once loaded. - useEffect(() => { - if (!channelName && channels.length > 0) { - setChannelName(channels.find((c) => c.enabled)?.name ?? channels[0].name); - } - }, [channels, channelName]); - - const firing = localRules.filter((r) => r.status === "firing").length; - const triggeredToday = historyEntries.filter((h) => { - const d = h.firedAt; - const now = new Date(); - return d.getFullYear() === now.getFullYear() && - d.getMonth() === now.getMonth() && - d.getDate() === now.getDate(); - }).length; - - const preview = `Alert when ${metric} ${operator} ${threshold}${metric === "Error Rate" ? "%" : "ms"} for ${window} min → ${channelName || "no channel"} [${severity}]`; - - async function handleCreateRule() { - const payload: CreateAlertRulePayload = { - name: `${metric} ${operator} ${threshold}`, - metric: METRIC_TO_KEY[metric] ?? metric.toLowerCase().replace(/\s+/g, "_"), - operator: OPERATOR_TO_SYM[operator] ?? ">", - threshold: parseFloat(threshold) || 0, - window: parseInt(window, 10) || 5, - severity, - channel: channelName, - }; - setCreating(true); - try { - const newRule = await createRule(payload); - setLocalRules((prev) => [...prev, newRule]); - } finally { - setCreating(false); - } - } - - async function handleToggle(id: string, enabled: boolean) { - try { - await toggleRule(id, enabled); - } catch { - // Optimistic update already applied in RuleList; silently ignore API errors - } - } - - return ( -
- - - New Rule - - } - /> - -
- {/* Stats */} -
- {[ - { label: "Active Rules", value: localRules.filter((r) => r.enabled).length, color: "#F5F5F5" }, - { label: "Firing Now", value: firing, color: firing > 0 ? "#EF4444" : "#22C55E" }, - { label: "Triggered Today", value: triggeredToday, color: "#F59E0B" }, - ].map((stat) => ( -
-

{stat.label}

-

- {stat.value} -

-
- ))} -
- - {/* Tabs */} -
- {(["rules", "channels", "history"] as const).map((tab) => ( - - ))} -
- - {/* ── Rules tab ── */} - {activeTab === "rules" && ( - <> - - - {/* Enhanced rule builder */} -
-

Rule Builder

- - {/* Main condition row */} -
- Alert when - - - setThreshold(e.target.value)} - className="bg-[#111] border border-[#2A2A2A] rounded px-2 py-1 text-xs text-[#F5F5F5] outline-none w-16 focus:border-blue transition-colors" - /> - {metric === "Error Rate" ? "%" : "ms"} for - setWindow(e.target.value)} - className="bg-[#111] border border-[#2A2A2A] rounded px-2 py-1 text-xs text-[#F5F5F5] outline-none w-14 focus:border-blue transition-colors" - /> - min -
- - {/* Severity + channel row */} -
- Severity -
- {SEVERITIES.map((s) => ( - - ))} -
- - Send to - - - -
- - {/* Preview */} -

- {preview} -

-
- - )} - - {/* ── Channels tab ── */} - {activeTab === "channels" && ( -
-
- {channels.map((ch) => { - const connected = Boolean(ch.webhookUrl) && ch.enabled; - return ( -
-
-
- {CHANNEL_ICON[ch.type]} -
-

{ch.name}

-
- - {connected ? "connected" : "not configured"} - - {ch.lastDeliveryAt && ( - - {timeAgo(ch.lastDeliveryAt)} · {ch.lastDeliveryOk ? "OK" : "failed"} - - )} -
-
-
- -
- {configuringId === ch.id && ( - { await deleteChannel(id); setConfiguringId(null); }} - onClose={() => setConfiguringId(null)} - /> - )} -
- ); - })} - {channels.length === 0 && !addingChannel && ( -

- No channels yet. Add one to receive alert notifications. -

- )} -
- {addingChannel ? ( - { await createChannel(i); }} onClose={() => setAddingChannel(false)} /> - ) : ( - - )} -
- )} - - {/* ── History tab ── */} - {activeTab === "history" && ( -
- {historyEntries.length === 0 && ( -

No alert history yet.

- )} - {historyEntries.map((h) => ( -
-
-
-

{h.ruleName}

-

- {timeAgo(h.firedAt)} · {h.duration} · via {h.channel} -

-
- - {h.resolved ? "Resolved" : "Active"} - -
- ))} -
- )} -
-
- ); -} diff --git a/app/layout.tsx b/app/layout.tsx index 8f934ce..cb8b0ba 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -14,7 +14,7 @@ import { ProjectProvider } from "@/components/providers/project-provider"; export const metadata: Metadata = { title: "Liveboard — API Observability", - description: "Real-time API observability, live error tracking, and intelligent alerts", + description: "Real-time API observability, live error tracking, and AI incident summaries", }; export default function RootLayout({ children }: { children: React.ReactNode }) { diff --git a/apps/api/api/routes/alerts.py b/apps/api/api/routes/alerts.py deleted file mode 100644 index 77cd875..0000000 --- a/apps/api/api/routes/alerts.py +++ /dev/null @@ -1,306 +0,0 @@ -""" -Alert rules CRUD + alert history endpoints. -All routes require x-api-key auth via resolve_project_id dependency. -""" -from __future__ import annotations - -import logging -from datetime import datetime - -import asyncpg -from fastapi import APIRouter, Depends, HTTPException, Response - -from api.deps import resolve_project_id, get_db, scoped_conn -from api.schemas import ( - AlertHistoryOut, - AlertRuleOut, - ChannelIn, - ChannelOut, - ChannelTestResponse, - ChannelUpdate, - CreateAlertRuleRequest, - UpdateAlertRuleRequest, -) -from core.notify import deliver - -router = APIRouter(prefix="/v1", tags=["alerts"]) -logger = logging.getLogger(__name__) - - -def _rule_row_to_out(row: asyncpg.Record) -> AlertRuleOut: - return AlertRuleOut( - id=str(row["id"]), - name=row["name"], - metric=row["metric"], - operator=row["operator"], - threshold=row["threshold"], - window=row["window_min"], - severity=row["severity"], - channel=row["channel"], - status=row["status"], - enabled=row["enabled"], - last_triggered=row["last_triggered"].isoformat() if row["last_triggered"] else None, - ) - - -# ─── List ──────────────────────────────────────────────────────────────────── - -@router.get("/alert-rules", response_model=list[AlertRuleOut]) -async def list_alert_rules( - project_id: str = Depends(resolve_project_id), - conn: asyncpg.Connection = Depends(scoped_conn), -) -> list[AlertRuleOut]: - rows = await conn.fetch( - """ - SELECT id, name, metric, operator, threshold, window_min, - severity, channel, status, enabled, last_triggered - FROM alert_rules - WHERE project_id = $1 - ORDER BY created_at ASC - """, - project_id, - ) - return [_rule_row_to_out(r) for r in rows] - - -# ─── Create ────────────────────────────────────────────────────────────────── - -@router.post("/alert-rules", response_model=AlertRuleOut, status_code=201) -async def create_alert_rule( - body: CreateAlertRuleRequest, - project_id: str = Depends(resolve_project_id), - conn: asyncpg.Connection = Depends(get_db), -) -> AlertRuleOut: - row = await conn.fetchrow( - """ - INSERT INTO alert_rules - (project_id, name, metric, operator, threshold, window_min, severity, channel) - VALUES ($1, $2, $3, $4, $5, $6, $7, $8) - RETURNING id, name, metric, operator, threshold, window_min, - severity, channel, status, enabled, last_triggered - """, - project_id, - body.name, - body.metric, - body.operator, - body.threshold, - body.window, - body.severity, - body.channel, - ) - return _rule_row_to_out(row) - - -# ─── Update ────────────────────────────────────────────────────────────────── - -@router.patch("/alert-rules/{rule_id}", response_model=AlertRuleOut) -async def update_alert_rule( - rule_id: str, - body: UpdateAlertRuleRequest, - project_id: str = Depends(resolve_project_id), - conn: asyncpg.Connection = Depends(get_db), -) -> AlertRuleOut: - existing = await conn.fetchrow( - "SELECT id FROM alert_rules WHERE id = $1 AND project_id = $2", - rule_id, - project_id, - ) - if not existing: - raise HTTPException(status_code=404, detail="Alert rule not found") - - updates = body.model_dump(exclude_none=True) - if not updates: - row = await conn.fetchrow( - """ - SELECT id, name, metric, operator, threshold, window_min, - severity, channel, status, enabled, last_triggered - FROM alert_rules WHERE id = $1 - """, - rule_id, - ) - return _rule_row_to_out(row) - - # Rename window → window_min for DB column - if "window" in updates: - updates["window_min"] = updates.pop("window") - - set_clauses = ", ".join(f"{col} = ${i + 2}" for i, col in enumerate(updates)) - values = list(updates.values()) - - row = await conn.fetchrow( - f""" - UPDATE alert_rules - SET {set_clauses}, updated_at = now() - WHERE id = $1 - RETURNING id, name, metric, operator, threshold, window_min, - severity, channel, status, enabled, last_triggered - """, - rule_id, - *values, - ) - return _rule_row_to_out(row) - - -# ─── Delete ────────────────────────────────────────────────────────────────── - -@router.delete("/alert-rules/{rule_id}", status_code=204, response_model=None, response_class=Response) -async def delete_alert_rule( - rule_id: str, - project_id: str = Depends(resolve_project_id), - conn: asyncpg.Connection = Depends(get_db), -) -> Response: - result = await conn.execute( - "DELETE FROM alert_rules WHERE id = $1 AND project_id = $2", - rule_id, - project_id, - ) - if result == "DELETE 0": - raise HTTPException(status_code=404, detail="Alert rule not found") - return Response(status_code=204) - - -# ─── History ───────────────────────────────────────────────────────────────── - -def _duration_str(fired_at: datetime, resolved_at: datetime | None) -> str: - if resolved_at is None: - return "ongoing" - delta = int((resolved_at - fired_at).total_seconds()) - if delta < 60: - return f"{delta}s" - return f"{delta // 60} min" - - -@router.get("/alert-history", response_model=list[AlertHistoryOut]) -async def get_alert_history( - project_id: str = Depends(resolve_project_id), - conn: asyncpg.Connection = Depends(scoped_conn), -) -> list[AlertHistoryOut]: - rows = await conn.fetch( - """ - SELECT id, rule_name, fired_at, resolved_at, channel - FROM alert_history - WHERE project_id = $1 - ORDER BY fired_at DESC - LIMIT 50 - """, - project_id, - ) - return [ - AlertHistoryOut( - id=str(row["id"]), - rule_name=row["rule_name"], - fired_at=row["fired_at"].isoformat(), - resolved_at=row["resolved_at"].isoformat() if row["resolved_at"] else None, - channel=row["channel"], - resolved=row["resolved_at"] is not None, - duration=_duration_str(row["fired_at"], row["resolved_at"]), - ) - for row in rows - ] - - -# ─── Alert channels (real delivery targets) ────────────────────────────────── - -def _channel_row_to_out(row: asyncpg.Record) -> ChannelOut: - return ChannelOut( - id=str(row["id"]), - type=row["type"], - name=row["name"], - webhook_url=row["webhook_url"], - enabled=row["enabled"], - last_delivery_at=row["last_delivery_at"].isoformat() if row["last_delivery_at"] else None, - last_delivery_ok=row["last_delivery_ok"], - created_at=row["created_at"].isoformat() if row["created_at"] else "", - ) - - -@router.get("/channels", response_model=list[ChannelOut]) -async def list_channels( - project_id: str = Depends(resolve_project_id), - conn: asyncpg.Connection = Depends(scoped_conn), -) -> list[ChannelOut]: - rows = await conn.fetch( - "SELECT * FROM alert_channels WHERE project_id = $1 ORDER BY created_at", - project_id, - ) - return [_channel_row_to_out(r) for r in rows] - - -@router.post("/channels", response_model=ChannelOut, status_code=201) -async def create_channel( - body: ChannelIn, - project_id: str = Depends(resolve_project_id), - conn: asyncpg.Connection = Depends(get_db), -) -> ChannelOut: - row = await conn.fetchrow( - """ - INSERT INTO alert_channels (project_id, type, name, webhook_url, enabled) - VALUES ($1::uuid, $2, $3, $4, $5) - RETURNING * - """, - project_id, body.type, body.name, body.webhook_url, body.enabled, - ) - return _channel_row_to_out(row) - - -@router.patch("/channels/{channel_id}", response_model=ChannelOut) -async def update_channel( - channel_id: str, - body: ChannelUpdate, - project_id: str = Depends(resolve_project_id), - conn: asyncpg.Connection = Depends(get_db), -) -> ChannelOut: - row = await conn.fetchrow( - """ - UPDATE alert_channels - SET name = COALESCE($3, name), - webhook_url = COALESCE($4, webhook_url), - enabled = COALESCE($5, enabled) - WHERE id = $1::uuid AND project_id = $2::uuid - RETURNING * - """, - channel_id, project_id, body.name, body.webhook_url, body.enabled, - ) - if row is None: - raise HTTPException(status_code=404, detail="Channel not found") - return _channel_row_to_out(row) - - -@router.delete("/channels/{channel_id}", status_code=204, response_model=None, response_class=Response) -async def delete_channel( - channel_id: str, - project_id: str = Depends(resolve_project_id), - conn: asyncpg.Connection = Depends(get_db), -) -> Response: - result = await conn.execute( - "DELETE FROM alert_channels WHERE id = $1::uuid AND project_id = $2::uuid", - channel_id, project_id, - ) - if result == "DELETE 0": - raise HTTPException(status_code=404, detail="Channel not found") - return Response(status_code=204) - - -@router.post("/channels/{channel_id}/test", response_model=ChannelTestResponse) -async def test_channel( - channel_id: str, - project_id: str = Depends(resolve_project_id), - conn: asyncpg.Connection = Depends(get_db), -) -> ChannelTestResponse: - row = await conn.fetchrow( - "SELECT type, webhook_url FROM alert_channels WHERE id = $1::uuid AND project_id = $2::uuid", - channel_id, project_id, - ) - if row is None: - raise HTTPException(status_code=404, detail="Channel not found") - ok, detail = await deliver( - row["type"], row["webhook_url"], - title="Liveboard test alert", - summary="This is a test message from Liveboard. If you can see this, delivery works.", - severity="info", - ) - await conn.execute( - "UPDATE alert_channels SET last_delivery_at = now(), last_delivery_ok = $2 WHERE id = $1::uuid", - channel_id, ok, - ) - return ChannelTestResponse(ok=ok, detail=detail) diff --git a/apps/api/api/schemas.py b/apps/api/api/schemas.py index 4ed99ee..6f17dba 100644 --- a/apps/api/api/schemas.py +++ b/apps/api/api/schemas.py @@ -91,84 +91,6 @@ class ServiceStatusOut(BaseModel): uptime_bars: list[str] -# ─── Alert rules ───────────────────────────────────────────────────────────── - -class AlertRuleOut(BaseModel): - id: str - name: str - metric: str - operator: str - threshold: float - window: int - severity: str - channel: str - status: str - enabled: bool - last_triggered: Optional[str] - - -class CreateAlertRuleRequest(BaseModel): - name: str = Field(..., min_length=1, max_length=100) - metric: str = Field(..., min_length=1, max_length=100) - operator: Literal[">", "<", "=", "!="] - threshold: float - window: int = Field(..., ge=1, le=60) - severity: Literal["critical", "warning", "info"] = "warning" - channel: str = Field(default="", max_length=200) - - -class UpdateAlertRuleRequest(BaseModel): - name: Optional[str] = None - metric: Optional[str] = None - operator: Optional[Literal[">", "<", "=", "!="]] = None - threshold: Optional[float] = None - window: Optional[int] = Field(default=None, ge=1, le=60) - severity: Optional[Literal["critical", "warning", "info"]] = None - channel: Optional[str] = None - enabled: Optional[bool] = None - - -class AlertHistoryOut(BaseModel): - id: str - rule_name: str - fired_at: str - resolved_at: Optional[str] - channel: str - resolved: bool - duration: str - - -# ─── Alert channels (Phase: real alerting) ──────────────────────────────────── - -class ChannelIn(BaseModel): - type: str = Field(..., pattern="^(slack|discord|pagerduty|webhook)$") - name: str = Field(..., min_length=1, max_length=100) - webhook_url: Optional[str] = Field(default=None, max_length=1000) - enabled: bool = True - - -class ChannelUpdate(BaseModel): - name: Optional[str] = Field(default=None, max_length=100) - webhook_url: Optional[str] = Field(default=None, max_length=1000) - enabled: Optional[bool] = None - - -class ChannelOut(BaseModel): - id: str - type: str - name: str - webhook_url: Optional[str] - enabled: bool - last_delivery_at: Optional[str] - last_delivery_ok: Optional[bool] - created_at: str - - -class ChannelTestResponse(BaseModel): - ok: bool - detail: str - - # ─── Public status page ─────────────────────────────────────────────────────── class PublicStatusOut(BaseModel): diff --git a/apps/api/core/notify.py b/apps/api/core/notify.py deleted file mode 100644 index e60fbdc..0000000 --- a/apps/api/core/notify.py +++ /dev/null @@ -1,62 +0,0 @@ -""" -Alert notification delivery — real HTTP POST to the configured channel. - -Slack / Discord / generic webhooks are just JSON POSTs to an incoming-webhook -URL. PagerDuty uses its Events API v2 (webhook_url holds the routing key). -Returns (ok, detail) and never raises — a delivery failure must not crash the -evaluation loop. -""" -from __future__ import annotations - -import logging - -import httpx - -logger = logging.getLogger(__name__) - -_TIMEOUT = 8.0 - - -async def deliver( - channel_type: str, - webhook_url: str | None, - *, - title: str, - summary: str, - severity: str, -) -> tuple[bool, str]: - if not webhook_url: - return False, "no webhook url configured" - - try: - async with httpx.AsyncClient(timeout=_TIMEOUT) as client: - if channel_type == "slack": - r = await client.post(webhook_url, json={"text": f":rotating_light: *{title}*\n{summary}"}) - elif channel_type == "discord": - r = await client.post(webhook_url, json={"content": f"🚨 **{title}**\n{summary}"}) - elif channel_type == "pagerduty": - r = await client.post( - "https://events.pagerduty.com/v2/enqueue", - json={ - "routing_key": webhook_url, - "event_action": "trigger", - "payload": { - "summary": f"{title} — {summary}"[:1024], - "severity": "critical" if severity == "critical" else "warning", - "source": "liveboard", - }, - }, - ) - else: # generic webhook - r = await client.post( - webhook_url, - json={"title": title, "summary": summary, "severity": severity, "source": "liveboard"}, - ) - - ok = 200 <= r.status_code < 300 - if not ok: - logger.warning("Delivery to %s failed: HTTP %s", channel_type, r.status_code) - return ok, f"HTTP {r.status_code}" - except Exception as exc: # network / timeout / bad url - logger.warning("Delivery to %s errored: %s", channel_type, exc) - return False, str(exc)[:160] diff --git a/apps/api/main.py b/apps/api/main.py index dab7c2f..f8aa252 100644 --- a/apps/api/main.py +++ b/apps/api/main.py @@ -8,7 +8,7 @@ from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware -from api.routes import alerts, ingest, internal, projects, public_status, query +from api.routes import ingest, internal, projects, public_status, query from core.config import settings from core.database import close_pool, get_pool from core.redis_client import close_redis @@ -68,7 +68,6 @@ async def lifespan(app: FastAPI): _fastapi.include_router(projects.router) _fastapi.include_router(internal.router) _fastapi.include_router(query.router) -_fastapi.include_router(alerts.router) _fastapi.include_router(public_status.router) _fastapi.include_router(sse_router) diff --git a/apps/api/migrations/versions/002_alert_rules.py b/apps/api/migrations/versions/002_alert_rules.py deleted file mode 100644 index 82d9ba2..0000000 --- a/apps/api/migrations/versions/002_alert_rules.py +++ /dev/null @@ -1,58 +0,0 @@ -"""Add alert_rules and alert_history tables - -Revision ID: 002 -Revises: 001 -Create Date: 2026-06-13 -""" - -from alembic import op - -revision = "002" -down_revision = "001" -branch_labels = None -depends_on = None - - -def upgrade() -> None: - op.execute(""" - CREATE TABLE IF NOT EXISTS alert_rules ( - id UUID PRIMARY KEY DEFAULT gen_random_uuid(), - project_id UUID NOT NULL REFERENCES projects(id) ON DELETE CASCADE, - name TEXT NOT NULL, - metric TEXT NOT NULL, - operator TEXT NOT NULL CHECK (operator IN ('>', '<', '=', '!=')), - threshold FLOAT NOT NULL, - window_min INTEGER NOT NULL DEFAULT 5, - severity TEXT NOT NULL DEFAULT 'warning' - CHECK (severity IN ('critical', 'warning', 'info')), - channel TEXT NOT NULL DEFAULT '', - status TEXT NOT NULL DEFAULT 'ok' - CHECK (status IN ('firing', 'ok', 'pending')), - enabled BOOLEAN NOT NULL DEFAULT TRUE, - last_triggered TIMESTAMPTZ, - created_at TIMESTAMPTZ DEFAULT now(), - updated_at TIMESTAMPTZ DEFAULT now() - ); - """) - op.execute("CREATE INDEX IF NOT EXISTS idx_alert_rules_project ON alert_rules(project_id);") - - op.execute(""" - CREATE TABLE IF NOT EXISTS alert_history ( - id UUID PRIMARY KEY DEFAULT gen_random_uuid(), - project_id UUID NOT NULL, - rule_id UUID REFERENCES alert_rules(id) ON DELETE SET NULL, - rule_name TEXT NOT NULL, - fired_at TIMESTAMPTZ NOT NULL DEFAULT now(), - resolved_at TIMESTAMPTZ, - channel TEXT NOT NULL DEFAULT '' - ); - """) - op.execute( - "CREATE INDEX IF NOT EXISTS idx_alert_history_project " - "ON alert_history(project_id, fired_at DESC);" - ) - - -def downgrade() -> None: - op.execute("DROP TABLE IF EXISTS alert_history;") - op.execute("DROP TABLE IF EXISTS alert_rules;") diff --git a/apps/api/migrations/versions/003_multitenancy.py b/apps/api/migrations/versions/003_multitenancy.py index 32e47b2..bc3c1ea 100644 --- a/apps/api/migrations/versions/003_multitenancy.py +++ b/apps/api/migrations/versions/003_multitenancy.py @@ -18,7 +18,7 @@ from alembic import op revision = "003" -down_revision = "002" +down_revision = "001" branch_labels = None depends_on = None diff --git a/apps/api/migrations/versions/005_rls.py b/apps/api/migrations/versions/005_rls.py index fc48f0e..f9749aa 100644 --- a/apps/api/migrations/versions/005_rls.py +++ b/apps/api/migrations/versions/005_rls.py @@ -12,7 +12,7 @@ • Dashboard READ connections `SET ROLE dashboard_reader` + set the `app.project_id` GUC (see api.deps.scoped_conn). Non-owner ⇒ RLS is enforced ⇒ only rows for the active project are visible. - • The owner (ingest worker, alert writes) is NOT forced under RLS, so + • The owner (ingest worker, incident writes) is NOT forced under RLS, so cross-project writes/aggregation keep working. A read that forgets to set `app.project_id` sees ZERO rows (fail closed). @@ -25,7 +25,7 @@ branch_labels = None depends_on = None -_TABLES = ["events", "incidents", "alert_rules", "alert_history"] +_TABLES = ["events", "incidents"] def upgrade() -> None: @@ -46,7 +46,7 @@ def upgrade() -> None: op.execute(f"GRANT SELECT ON {t} TO dashboard_reader;") op.execute(f"ALTER TABLE {t} ENABLE ROW LEVEL SECURITY;") # Scoped SELECT policy — applies only to dashboard_reader; the owner - # (worker/ingest/alert writes) is unaffected. + # (worker/ingest/incident writes) is unaffected. op.execute(f""" CREATE POLICY {t}_tenant_isolation ON {t} FOR SELECT diff --git a/apps/api/migrations/versions/006_alert_channels.py b/apps/api/migrations/versions/006_alert_channels.py deleted file mode 100644 index 9534c41..0000000 --- a/apps/api/migrations/versions/006_alert_channels.py +++ /dev/null @@ -1,50 +0,0 @@ -"""Alert delivery channels (real Slack/Discord/PagerDuty/webhook targets) - -Revision ID: 006 -Revises: 005 -Create Date: 2026-07-19 - -Backs the alerts "Channels" tab with real, per-project destinations. Alert -rules reference a channel by name (alert_rules.channel); the evaluation worker -looks the channel up here to get its webhook URL and delivers the notification. -""" - -from alembic import op - -revision = "006" -down_revision = "005" -branch_labels = None -depends_on = None - - -def upgrade() -> None: - op.execute(""" - CREATE TABLE IF NOT EXISTS alert_channels ( - id UUID PRIMARY KEY DEFAULT gen_random_uuid(), - project_id UUID NOT NULL REFERENCES projects(id) ON DELETE CASCADE, - type TEXT NOT NULL CHECK (type IN ('slack', 'discord', 'pagerduty', 'webhook')), - name TEXT NOT NULL, - webhook_url TEXT, - enabled BOOLEAN NOT NULL DEFAULT TRUE, - last_delivery_at TIMESTAMPTZ, - last_delivery_ok BOOLEAN, - created_at TIMESTAMPTZ DEFAULT now() - ); - """) - op.execute("CREATE INDEX IF NOT EXISTS idx_alert_channels_project ON alert_channels(project_id);") - - # RLS backstop — dashboard reads (dashboard_reader role) are scoped to the - # active project via app.project_id, same as the other tenant tables. - op.execute("GRANT SELECT ON alert_channels TO dashboard_reader;") - op.execute("ALTER TABLE alert_channels ENABLE ROW LEVEL SECURITY;") - op.execute(""" - CREATE POLICY alert_channels_tenant_isolation ON alert_channels - FOR SELECT - TO dashboard_reader - USING (project_id = NULLIF(current_setting('app.project_id', true), '')::uuid); - """) - - -def downgrade() -> None: - op.execute("DROP POLICY IF EXISTS alert_channels_tenant_isolation ON alert_channels;") - op.execute("DROP TABLE IF EXISTS alert_channels;") diff --git a/apps/api/migrations/versions/007_public_status_page.py b/apps/api/migrations/versions/007_public_status_page.py index 3204d55..57223e9 100644 --- a/apps/api/migrations/versions/007_public_status_page.py +++ b/apps/api/migrations/versions/007_public_status_page.py @@ -13,7 +13,7 @@ from alembic import op revision = "007" -down_revision = "006" +down_revision = "005" branch_labels = None depends_on = None diff --git a/apps/api/worker/alerts.py b/apps/api/worker/alerts.py deleted file mode 100644 index a685361..0000000 --- a/apps/api/worker/alerts.py +++ /dev/null @@ -1,150 +0,0 @@ -""" -Alert-rule evaluation worker. - -Every 30 s, for each ENABLED rule: - 1. Compute its metric over the rule's window from the events table. - 2. Compare against the threshold using the rule's operator. - 3. State machine: - - breach + not already firing -> status='firing', last_triggered=now, - insert alert_history row, deliver to the rule's channel - - no breach + currently firing -> status='ok', resolve the open history row - Owner DB connection (bypasses RLS); the worker sees every project's rules. -""" -from __future__ import annotations - -import asyncio -import logging - -from core.database import get_pool -from core.notify import deliver - -logger = logging.getLogger(__name__) - -_INTERVAL = 30 # seconds - -_METRIC = { - "error_rate": ("Error rate", "%"), - "p99_latency": ("p99 latency", "ms"), - "requests_per_min": ("Requests/min", ""), -} -_OP_WORD = {">": "exceeds", "<": "drops below", "=": "equals", "!=": "differs from"} - - -def _compare(value: float, operator: str, threshold: float) -> bool: - if operator == ">": - return value > threshold - if operator == "<": - return value < threshold - if operator == "=": - return abs(value - threshold) < 1e-6 - if operator == "!=": - return abs(value - threshold) >= 1e-6 - return False - - -async def _metric_value(conn, project_id, metric: str, window_min: int) -> float | None: - """Return the current metric value over the window, or None if not evaluable.""" - row = await conn.fetchrow( - """ - SELECT - COUNT(*)::int AS total, - COALESCE(100.0 * SUM((status_code >= 400)::int) / NULLIF(COUNT(*), 0), 0)::float AS error_rate, - COALESCE(percentile_cont(0.99) WITHIN GROUP (ORDER BY duration_ms), 0)::float AS p99 - FROM events - WHERE project_id = $1 AND time > now() - ($2 * interval '1 minute') - """, - project_id, - window_min, - ) - total = row["total"] or 0 - if metric == "requests_per_min": - return total / max(window_min, 1) - if total == 0: - return None # can't judge error rate / latency with no traffic - if metric == "error_rate": - return float(row["error_rate"]) - if metric == "p99_latency": - return float(row["p99"]) - return None # unsupported metric (e.g. apdex) — skip - - -async def _deliver_for_rule(conn, project_id, rule, title: str, summary: str) -> None: - ch = await conn.fetchrow( - """ - SELECT id, type, webhook_url FROM alert_channels - WHERE project_id = $1 AND name = $2 AND enabled = TRUE - LIMIT 1 - """, - project_id, - rule["channel"], - ) - if ch is None: - return - ok, _detail = await deliver(ch["type"], ch["webhook_url"], title=title, summary=summary, severity=rule["severity"]) - await conn.execute( - "UPDATE alert_channels SET last_delivery_at = now(), last_delivery_ok = $2 WHERE id = $1", - ch["id"], - ok, - ) - - -async def _evaluate_all() -> None: - pool = await get_pool() - async with pool.acquire() as conn: - rules = await conn.fetch( - """ - SELECT id, project_id, name, metric, operator, threshold, window_min, - severity, channel, status - FROM alert_rules - WHERE enabled = TRUE - """ - ) - for rule in rules: - value = await _metric_value(conn, rule["project_id"], rule["metric"], rule["window_min"]) - if value is None: - continue - - breach = _compare(value, rule["operator"], rule["threshold"]) - label, unit = _METRIC.get(rule["metric"], (rule["metric"], "")) - op_word = _OP_WORD.get(rule["operator"], rule["operator"]) - - if breach and rule["status"] != "firing": - title = f"{label} {op_word} {rule['threshold']:g}{unit}" - summary = ( - f"{label} hit {value:.1f}{unit} over the last {rule['window_min']}m " - f"(threshold {rule['operator']} {rule['threshold']:g}{unit})." - ) - await conn.execute( - "UPDATE alert_rules SET status='firing', last_triggered=now(), updated_at=now() WHERE id=$1", - rule["id"], - ) - await conn.execute( - """ - INSERT INTO alert_history (project_id, rule_id, rule_name, fired_at, channel) - VALUES ($1, $2, $3, now(), $4) - """, - rule["project_id"], rule["id"], rule["name"], rule["channel"], - ) - await _deliver_for_rule(conn, rule["project_id"], rule, title, summary) - logger.info("Alert FIRING rule=%s project=%s value=%.1f", rule["name"], rule["project_id"], value) - - elif not breach and rule["status"] == "firing": - await conn.execute( - "UPDATE alert_rules SET status='ok', updated_at=now() WHERE id=$1", - rule["id"], - ) - await conn.execute( - "UPDATE alert_history SET resolved_at=now() WHERE rule_id=$1 AND resolved_at IS NULL", - rule["id"], - ) - logger.info("Alert RESOLVED rule=%s project=%s", rule["name"], rule["project_id"]) - - -async def run() -> None: - logger.info("Alert evaluator started — checking every %d s", _INTERVAL) - while True: - try: - await _evaluate_all() - except Exception: - logger.exception("Alert evaluation cycle failed") - await asyncio.sleep(_INTERVAL) diff --git a/apps/api/worker/main.py b/apps/api/worker/main.py index 19ed504..164571b 100644 --- a/apps/api/worker/main.py +++ b/apps/api/worker/main.py @@ -4,9 +4,10 @@ Run as: python -m worker.main Docker: CMD ["python", "-m", "worker.main"] -Two concurrent tasks: +Three concurrent tasks: aggregator — XREADGROUP → TimescaleDB COPY (at-least-once delivery) metrics — query last-minute stats per project → Redis pub/sub every 1 s + anomaly — rolling z-score check every 60 s → AI incident summary """ import asyncio @@ -14,7 +15,6 @@ import signal from worker.aggregator import run as run_aggregator -from worker.alerts import run as run_alerts from worker.anomaly import run as run_anomaly from worker.metrics import run as run_metrics @@ -30,20 +30,18 @@ async def main() -> None: agg_task = asyncio.create_task(run_aggregator(), name="aggregator") metrics_task = asyncio.create_task(run_metrics(), name="metrics-publisher") anomaly_task = asyncio.create_task(run_anomaly(), name="anomaly-detector") - alerts_task = asyncio.create_task(run_alerts(), name="alert-evaluator") def _shutdown(sig: signal.Signals) -> None: logger.info("Received %s, stopping worker", sig.name) agg_task.cancel() metrics_task.cancel() anomaly_task.cancel() - alerts_task.cancel() for sig in (signal.SIGINT, signal.SIGTERM): loop.add_signal_handler(sig, _shutdown, sig) try: - await asyncio.gather(agg_task, metrics_task, anomaly_task, alerts_task, return_exceptions=True) + await asyncio.gather(agg_task, metrics_task, anomaly_task, return_exceptions=True) except asyncio.CancelledError: pass diff --git a/components/alerts/rule-list.tsx b/components/alerts/rule-list.tsx deleted file mode 100644 index 2d52696..0000000 --- a/components/alerts/rule-list.tsx +++ /dev/null @@ -1,137 +0,0 @@ -"use client"; - -import { useEffect, useState } from "react"; -import { Zap, Bell, Info } from "lucide-react"; -import { Badge } from "@/components/ui/badge"; -import { timeAgo, cn } from "@/lib/utils"; -import type { AlertRule } from "@/lib/types"; - -interface RuleListProps { - rules: AlertRule[]; - onToggle?: (id: string, enabled: boolean) => void; -} - -const METRIC_LABELS: Record = { - error_rate: "Error Rate", - p99_latency: "p99 Latency", - requests_per_min: "Requests/min", - auth_4xx_rate: "Auth 4xx Rate", - payment_error_rate: "Payment Errors", -}; - -const OPERATOR_LABELS: Record = { - ">": "exceeds", - "<": "drops below", - "=": "equals", - "!=": "differs from", -}; - -const SEVERITY_ICONS = { - critical: Zap, - warning: Bell, - info: Info, -}; - -export function RuleList({ rules, onToggle }: RuleListProps) { - // Optimistic copy for instant toggle feedback — re-synced whenever the real - // rules prop changes (e.g. project switch, or empty when there are none). - const [localRules, setLocalRules] = useState(rules); - useEffect(() => { setLocalRules(rules); }, [rules]); - - const toggle = (id: string) => { - const rule = localRules.find((r) => r.id === id); - if (!rule) return; - const newEnabled = !rule.enabled; - setLocalRules((prev) => prev.map((r) => (r.id === id ? { ...r, enabled: newEnabled } : r))); - onToggle?.(id, newEnabled); - }; - - return ( -
-
- {["Rule", "Condition", "Channel", "Last Triggered", "Status", ""].map((h) => ( - - {h} - - ))} -
- -
- {localRules.map((rule) => { - const Icon = SEVERITY_ICONS[rule.severity]; - const thresholdUnit = rule.metric.includes("latency") ? "ms" : rule.metric.includes("rate") ? "%" : ""; - - return ( -
-
-
- -
- {rule.name} -
- - - {METRIC_LABELS[rule.metric]} {OPERATOR_LABELS[rule.operator]} {rule.threshold}{thresholdUnit} / {rule.window}min - - - {rule.channel} - - - {rule.lastTriggered ? timeAgo(rule.lastTriggered) : "—"} - - -
- {rule.status === "firing" ? ( - Firing - ) : rule.status === "pending" ? ( - Pending - ) : ( - OK - )} -
- -
- -
-
- ); - })} - {localRules.length === 0 && ( -
- No alert rules yet — create one below. -
- )} -
-
- ); -} diff --git a/components/landing/channel-marks.tsx b/components/landing/channel-marks.tsx deleted file mode 100644 index d39004d..0000000 --- a/components/landing/channel-marks.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import { Hash, Webhook } from "lucide-react"; - -interface ChannelMark { - key: string; - label: string; - slug?: string; -} - -// Discord and PagerDuty are real brand marks (Simple Icons CDN). Slack's mark -// was removed from Simple Icons, so it falls back to a generic glyph like -// "Webhook" — a delivery method, not a brand. -export const ALERT_CHANNELS: ChannelMark[] = [ - { key: "slack", label: "Slack" }, - { key: "discord", label: "Discord", slug: "discord" }, - { key: "pagerduty", label: "PagerDuty", slug: "pagerduty" }, - { key: "webhook", label: "Webhook" }, -]; - -export function ChannelMarkIcon({ channel, className }: { channel: ChannelMark; className?: string }) { - if (!channel.slug) { - const Icon = channel.key === "slack" ? Hash : Webhook; - return ; - } - return ( - // eslint-disable-next-line @next/next/no-img-element -- external brand mark, next/image needs SVG allow-listing for no benefit here - {channel.label} - ); -} diff --git a/components/landing/feature-grid.tsx b/components/landing/feature-grid.tsx index 4deed52..cc7a854 100644 --- a/components/landing/feature-grid.tsx +++ b/components/landing/feature-grid.tsx @@ -1,6 +1,5 @@ import { RevealOnScroll } from "@/components/landing/reveal-on-scroll"; import { ScreenshotFrame } from "@/components/landing/screenshot-frame"; -import { ALERT_CHANNELS, ChannelMarkIcon } from "@/components/landing/channel-marks"; import { InstallSnippet } from "@/components/landing/install-snippet"; export function FeatureGrid() { @@ -11,7 +10,7 @@ export function FeatureGrid() { Every request, instrumented.

- Live request metrics, per-endpoint health scores, and alerts routed to the tools your team already uses. + Live request metrics, per-endpoint health scores, and AI incident summaries — from one line of middleware.

@@ -52,19 +51,24 @@ export function FeatureGrid() {
-

Alerts that reach your team

+

Anomalies, not thresholds

- Threshold rules on error rate or latency, routed to the channel your on-call rotation actually watches. + A rolling z-score over the last 24 hours of error rate and p99 latency decides what is actually unusual for your API — no thresholds to tune, no alert fatigue.

-
- {ALERT_CHANNELS.map((channel) => ( -
- - {channel.label} +
+ {[ + { term: "Window", detail: "24 h rolling" }, + { term: "Trigger", detail: "|z| > 3" }, + { term: "Rate limit", detail: "10 / project / h" }, + { term: "Summary", detail: "llama-3.3-70b" }, + ].map((stat) => ( +
+
{stat.term}
+
{stat.detail}
))} -
+
diff --git a/components/landing/footer.tsx b/components/landing/footer.tsx index 7fa5eff..d109461 100644 --- a/components/landing/footer.tsx +++ b/components/landing/footer.tsx @@ -37,7 +37,7 @@ export function Footer() { Liveboard

- Open source API observability. Live metrics, alerts, and AI incident summaries from one line of middleware. + Open source API observability. Live metrics, error tracking, and AI incident summaries from one line of middleware.

diff --git a/components/landing/stats-section.tsx b/components/landing/stats-section.tsx index fc10266..c056e5a 100644 --- a/components/landing/stats-section.tsx +++ b/components/landing/stats-section.tsx @@ -3,8 +3,7 @@ import { AnimatedCounter } from "@/components/landing/animated-counter"; const STATS = [ { target: 2, label: "official SDKs" }, - { target: 5, label: "framework adapters" }, - { target: 4, label: "alert channels" }, + { target: 3, label: "worker loops" }, ]; export function StatsSection() { @@ -15,11 +14,11 @@ export function StatsSection() { Built to be adopted in an afternoon.

- No agents, no sidecars, no new infrastructure to run. Two SDKs, five adapters, and a status page for free. + No agents, no sidecars, no new infrastructure to run. Two SDKs, one line of middleware, and a status page for free.

- + {STATS.map((stat) => (
diff --git a/components/layout/sidebar.tsx b/components/layout/sidebar.tsx index 39124d6..a25afa6 100644 --- a/components/layout/sidebar.tsx +++ b/components/layout/sidebar.tsx @@ -5,7 +5,6 @@ import { usePathname } from "next/navigation"; import { LayoutDashboard, Zap, - Bell, Globe, Settings, } from "lucide-react"; @@ -17,7 +16,6 @@ import { UserMenu } from "@/components/auth/user-menu"; const NAV_ITEMS = [ { href: "/overview", label: "Overview", icon: LayoutDashboard }, { href: "/endpoints", label: "Endpoints", icon: Zap }, - { href: "/alerts", label: "Alerts", icon: Bell }, { href: "/status", label: "Status Page", icon: Globe }, ]; @@ -56,11 +54,6 @@ export function Sidebar() { > {label} - {href === "/alerts" && ( - - 2 - - )} ); })} diff --git a/components/projects/create-project-dialog.tsx b/components/projects/create-project-dialog.tsx index 5f90911..b052d26 100644 --- a/components/projects/create-project-dialog.tsx +++ b/components/projects/create-project-dialog.tsx @@ -95,7 +95,7 @@ export function CreateProjectDialog({ open, onOpenChange }: Props) { Create project - A project groups API keys, events, and alert rules. + A project groups API keys, events, and incidents.
diff --git a/components/settings/project-settings-card.tsx b/components/settings/project-settings-card.tsx index 155356d..6b03f86 100644 --- a/components/settings/project-settings-card.tsx +++ b/components/settings/project-settings-card.tsx @@ -208,7 +208,7 @@ export function ProjectSettingsCard({ project }: Props) {

This permanently deletes {project.name} and - all its events, alert rules, and API keys. Type the project name to confirm. + all its events, incidents, and API keys. Type the project name to confirm.

("/v1/services", {}, EMPTY_LIST as unknown as ServiceStatus[], toServices, 30_000); } - -// ─── Alert rules ───────────────────────────────────────────────────────────── - -interface ApiAlertRule { - id: string; - name: string; - metric: string; - operator: string; - threshold: number; - window: number; - severity: string; - channel: string; - status: string; - enabled: boolean; - last_triggered: string | null; -} - -interface ApiAlertHistory { - id: string; - rule_name: string; - fired_at: string; - resolved_at: string | null; - channel: string; - resolved: boolean; - duration: string; -} - -export interface AlertHistoryEntry { - id: string; - ruleName: string; - firedAt: Date; - resolvedAt: Date | null; - channel: string; - resolved: boolean; - duration: string; -} - -export interface CreateAlertRulePayload { - name: string; - metric: string; - operator: ">" | "<" | "=" | "!="; - threshold: number; - window: number; - severity: "critical" | "warning" | "info"; - channel: string; -} - -function toAlertRule(r: ApiAlertRule): AlertRule { - return { - id: r.id, - name: r.name, - metric: r.metric, - operator: r.operator as AlertRule["operator"], - threshold: r.threshold, - window: r.window, - severity: r.severity as AlertRule["severity"], - channel: r.channel, - status: r.status as AlertRule["status"], - enabled: r.enabled, - lastTriggered: r.last_triggered ? new Date(r.last_triggered) : undefined, - }; -} - -function toAlertRules(raw: unknown): AlertRule[] { - return (raw as ApiAlertRule[]).map(toAlertRule); -} - -function toAlertHistory(raw: unknown): AlertHistoryEntry[] { - return (raw as ApiAlertHistory[]).map((h) => ({ - id: h.id, - ruleName: h.rule_name, - firedAt: new Date(h.fired_at), - resolvedAt: h.resolved_at ? new Date(h.resolved_at) : null, - channel: h.channel, - resolved: h.resolved, - duration: h.duration, - })); -} - -/** Alert rules for the current project — with create/toggle helpers. */ -export function useAlertRules() { - const { activeProject } = useProjects(); - const project = activeProject?.id; - // Poll so a rule flipping to "firing" (by the evaluation worker) shows up live. - const query = useApiQuery( - "/v1/alert-rules", {}, EMPTY_LIST as unknown as AlertRule[], toAlertRules, 15_000, - ); - - async function createRule(payload: CreateAlertRulePayload): Promise { - const raw = await apiMutate("POST", "/v1/alert-rules", payload, project); - return toAlertRule(raw); - } - - async function toggleRule(id: string, enabled: boolean): Promise { - await apiMutate("PATCH", `/v1/alert-rules/${id}`, { enabled }, project); - } - - async function deleteRule(id: string): Promise { - await apiMutate("DELETE", `/v1/alert-rules/${id}`, undefined, project); - } - - return { ...query, createRule, toggleRule, deleteRule }; -} - -/** Alert firing history for the current project. */ -export function useAlertHistory() { - return useApiQuery( - "/v1/alert-history", {}, EMPTY_LIST as unknown as AlertHistoryEntry[], toAlertHistory, 15_000, - ); -} - -// ─── Alert channels (real delivery targets) ────────────────────────────────── - -export interface AlertChannel { - id: string; - type: "slack" | "discord" | "pagerduty" | "webhook"; - name: string; - webhookUrl: string | null; - enabled: boolean; - lastDeliveryAt: Date | null; - lastDeliveryOk: boolean | null; -} - -interface ApiChannel { - id: string; - type: string; - name: string; - webhook_url: string | null; - enabled: boolean; - last_delivery_at: string | null; - last_delivery_ok: boolean | null; -} - -function toChannel(r: ApiChannel): AlertChannel { - return { - id: r.id, - type: r.type as AlertChannel["type"], - name: r.name, - webhookUrl: r.webhook_url, - enabled: r.enabled, - lastDeliveryAt: r.last_delivery_at ? new Date(r.last_delivery_at) : null, - lastDeliveryOk: r.last_delivery_ok, - }; -} - -export interface CreateChannelPayload { - type: AlertChannel["type"]; - name: string; - webhook_url: string; - enabled?: boolean; -} - -/** Real alert delivery channels for the current project. */ -export function useChannels() { - const { activeProject } = useProjects(); - const project = activeProject?.id; - const query = useApiQuery( - "/v1/channels", - {}, - EMPTY_LIST as unknown as AlertChannel[], - (raw) => (raw as ApiChannel[]).map(toChannel), - 15_000, - ); - - async function createChannel(input: CreateChannelPayload): Promise { - const raw = await apiMutate("POST", "/v1/channels", input, project); - query.refetch(); - return toChannel(raw); - } - async function updateChannel(id: string, patch: Partial): Promise { - await apiMutate("PATCH", `/v1/channels/${id}`, patch, project); - query.refetch(); - } - async function deleteChannel(id: string): Promise { - await apiMutate("DELETE", `/v1/channels/${id}`, undefined, project); - query.refetch(); - } - async function testChannel(id: string): Promise<{ ok: boolean; detail: string }> { - const res = await apiMutate<{ ok: boolean; detail: string }>("POST", `/v1/channels/${id}/test`, {}, project); - query.refetch(); - return res; - } - - return { ...query, createChannel, updateChannel, deleteChannel, testChannel }; -} diff --git a/lib/types.ts b/lib/types.ts index d917a08..784fa5e 100644 --- a/lib/types.ts +++ b/lib/types.ts @@ -42,20 +42,6 @@ export interface Endpoint { healthScore: number; } -export interface AlertRule { - id: string; - name: string; - metric: string; - operator: ">" | "<" | "=" | "!="; - threshold: number; - window: number; - severity: "critical" | "warning" | "info"; - channel: string; - status: "firing" | "ok" | "pending"; - lastTriggered?: Date; - enabled: boolean; -} - export interface ServiceStatus { id: string; name: string; diff --git a/proxy.ts b/proxy.ts index c30de4a..88c3cfe 100644 --- a/proxy.ts +++ b/proxy.ts @@ -13,8 +13,6 @@ export const config = { matcher: [ "/overview/:path*", "/endpoints/:path*", - "/traces/:path*", - "/alerts/:path*", "/settings/:path*", // Exact match only — the authenticated status *preview*. Must NOT be a // wildcard: /status/[slug], /status/confirm/[token], and diff --git a/public/shots/alerts.png b/public/shots/alerts.png deleted file mode 100644 index bfa3456b6d4273270e226065e5195b2480a37c07..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211594 zcmeFY=U0=<7dDI)MF9l_=?X|MN-qWkr1useG?m_aZwC=jN{}vHgwTuh8loV**8l+` zQbQorP!a-9&N;vHu4lbp-hbeoFS*yfvhLZlXZD_Ju6@lXU2PR|G6pgd5)yJX)z|tY zB=>%kkdV6ExlVk;(Eb@oLh^t_?X|pNK+ew6-4JVA=nn#y)Hu`ao`x_gtknubwG_W-`w&e-$AFL(qt!ob-KA=y1d;4v)t+Z{r zUoqOpeX>X^t3mB3FQp+@TnpjD={S{%JT;I;NsXCOd1+rtja^-^rU5G+k^E)i<>gg` zTv}TC+p7PyzY5bh|9k%DmxKJS^#A?h6;;yL8~^tUj)(vMAO7~o|F<8K)c+s972S_g zNFuhpylVZjRCUO43CUk&Q3?fbo9|wlb&>}f+S=gb_V#wO z|8=S=3(?Qa%q*L5xJkk!kUu8z{P~0Xx0QG&O!x#!LVH67du$%(cqnv({quJNkFG*; z8?PU%1jyG7pB|{bry$Y%bd&ktFTEMv@@X3$9`3g;vk!G}aFFCri+f9=dW$TIO@JQ& zuqZQB=A^iPKj3AVepAu!MKdq)i|ikts)F%X4bYJMADWVu&q+7X0fy?VhJTyM5jBCv z{v9cQH#K(OQpN=3Mvwr2g@NJlJR~wQvS@?kW4=$@XKjYbyBrVhaMO^XD%r3Rb~ZMu z1{tJ=pOr^Y$Rm>)Ad@9jyI#j@c)X1nX(aHSo?(TQ8Tk61!(367u^%f*=QKqf)d}F6g z9TIC!)L%ZX-tu;_1glW_ki1dn*!tIe617KVxrMsiMJ&e=5!dv+NjN_E2-7n#=tq~$ zZ2$cEvsDi2P?=_%AF7(^Nb^I|5yj9wS&w(JDgloMFbRF3^A3MmeD{B!BKhn5b6T2M zdM-Q3lY$~@4VzzlC`0xQ^NF4-rKW4|l9wM(A{5^+f$4@bq-0sjh(T%ajW|#Lw9hZ4 zbG560!~xb3ZBTpiKsSnqCbpp9=?i1BQD{%g1^e|c3PHeXVMTbjM>|R1y$yspOCk?Q zo=e57<5!0s?$d=-$2;tPCf$D%L*iks%bP}AKa)3LNFkCZj%-}?s1NM9e!p_YP58Wt zQ%q9)460Vt9IN^kj&KRLXe?i8m?~mLMI4u?UI)_^y_b?vq zX%9;w#O6g56TlKhr~;iZ&ocunru4A<^A~z;l0`%MqD&7+KHC_MU;B4d$*)VM$_&d3 zo?jzTqb7@*oSY;^jzYm>CMKGJ4F6GMk$dTP-*A%I1|cuuueW(79P&&$FH(TcmdepS zYpQaSks@{Va_@v)y<5#A{!%4+uIOW{6pI1my*9Y%41vy136rfoL#%QsH`gyjkF|N6 z^&)P_h5H5cIQ`E65)xX5vTXCh302CC;(DeZcLlx5leA?f2UIvrLD8ec5W4;`@)(%3 z{G1JY@$TS{Q4nDbHTl{x{h!Xj#LhP5{&sQ5h?*Q>*>n#~?jRNhT$AsYF0)LZ5f6b2 zMZ-eczjH!TY5!XUs>$*3_fh`OA2YGA&=Q?7S*9$#@^KFc4%c5Tkl&0O)KXG?b5FvUgj9LF_oEFz zo!9^BI3RkAy072q-s1UDL;g}O@Cf{$(Ih-NkmPnQ?))2XMqg`7CK0W*-4J^8YHzOy?7@j z?k!JIF;VG|r%9Sg)Y@xnDTegL3fF$QVvx`6>H`Tlte!y;(z521aEkPoWO_&8+3^H2 z{FBiuEV^ZIg0|08W>XbBddwyz9q)UKgsZMWG)+CN*93C+m&U(gk*rvts|r&rSUc&v z@kJ=>eUFA$4Cu6@-We{_o*gnDM@MI)?eOM%P37>3*lzj;ti8s}s3YW)*nqW;(!Xxu z5i`C15y1p|I~$|KBEtkuPfx!=N})>GVOayLNV78n0x{(9iOk-3@;`kCULBwgRoGK2 zeo5jaNcro9Fr}FUkIk{EhPThlq&m-vWC|ixj zzLW_JC8(T-pK)7G-c|4PfV-mE4vbgjU_N7owF@q|LukImTdJ<}Ro{E))u7i=g4n<$>owwBZhuA+lFr5fi(|_XR%K6pALiFsq;m zYwq?AF{geVtN(?JOt_6gR3>H(c0E*}Q9wgyP@-{0MunlYvdLVhJ6OQ&T;HJ|ZsD)$ z?-dwPP(L65z7cyXV92`cAbow?1LpGveh>V`h*nT~sg2XQ?Y8%3|FSmCeM5L)p7a)- zit}!n6zf>hOvtk1 zEMa5AXsUWsXK9H|kM_?2TU|BmN&Ty^=j&#+Vapn|3A?VTD>y|PSa!LQl>em1N(Sa7iyylY}9ORmClmdR|5iMf9MSkTlozp^CSxs zmRLI)>z8xq_?fGoS#gDm^17Z&?KL&W+31x|^FnB7D7Cd&)g-I5r5{lS;4EgR0KXMoSH$*+mr%*moQBkI*)Pl8T-9@AQot>TCF_ghCSv-fQ zrEJrB?64-}6j1FuaWg<#5AmIfy@Qf~bnWP}(&6HVU`254>$^|xPBT<>EiHuGD7@(x z5*A~4s$4CmuCntgyt`%SYhLJ^1%mNwT=1 z8S>QNoULZs+C(Wnh`8%n4fQP&6*iyQ#c>?&jnsr|edkV&%aEdz{H}i6N$?BNt z+dYs;$p|c4{>}!_=uBKX1x>wIdzlxL+7Oo!B6Hb$_`tZe{&9;s%a&7hnhiSfqF^G$ z=KAlgz~HQGGw?-&Oo#lr%+=wPgy9yong7((_sy^M$e9lGtHU~Pj#i`WXN*G)Y$(x8 z5bD|X(fyBwZ+UsdGy!m3kQ0@fZ7p4eQa?Ja6SR@GFf-Le-hwdeh3RzN@=C=`HrnSU z=Z|+Ftb^5h=<_Y82S)FbDjA{OxgUD(WVMH1jw{NAZ}lNNUj4Hv{Iv@5^E*j?rcqZ{ zM+DE5tg;tBNm)CnIRT$9Q#sY^i*Dvn1Ip!&oe3sS-UH&Xzli&8U=yD)F{`if@V7p;jaowT0?YQR_$-LBC*ttu=F?%w5 zg(yD8=-u1L6yy}(%lMN~`^O?R9sOZuWv^1Z6wU#w*dQ+Z&G@paDr|I24eqVvLwm0q zj(@PE6d!LrE9=ux245D}Z`coiGmZ1@_^64s-K1M=Qsqe9ECbvCOagCT2tiY(+Z>{^ z1-~!*MquS;(Z9N0z}+*LTo0Ny`jlG0qoN~iP%Za{mz_162}B4r33|Oix_6(5o=_?# zC0es67p>r3p?B2)>};n7UxxBGw^K|83k``!LlC3i9$5X$!~#6GbI{48uJ{{)wUNN~ z_BsIH#Hw?H%+>)*?`0E6Gr&P0ga(BI9UVt6mulmLK|9YtPjj?m25e~6k_=2ZLZA50 z>|zD24Bpi}DrYR_*%TRXx+1jQb&onVDt^Q$k-F{5Wz^`)<uyQ3@CI=9;3-r%Rkpw34{lJ zf?mCf^X{EM(vT(C>b3U3K>#JW>PbU$m-M(zQAuhuhp-h;UJb2U(c*VmcSYYmzocy( zh>7)_kn~Qj>D{Wal*7lPJ4y$~lp5CD(4aZhi^fVbQB(oZqr(?l zU}hrf&F>#Dr4@wK!_fo-|5Js^+?2IdrP_crEbbH(o`j1+1>xl`Jm5)kN96vY(;=4H zS=YqyE&p)=J{{&hc92t6l-d_=RP+|={e{)I8!tMW zJ{SwH4<|)&)%caCPdLYF>Li8?+mz01zp89h^0Ndn6$tjYs?r7Gw&>7FPap;*{nu6yU-t6g?kwdMw-!!u#HTgn+YO?XLmjxYSC5K z+P$8=T;rSh7eer>5_g8Aot)m@xk&REg@S(mGIxEakl&^51UO^;I-hKA3>SR=v4hNF zig9M)G`jBfSP{pKD1AsO+Bzos#?KW;iKJpfNEDxA%=;I;@rjl8HnaWeToQ(*Y;d%~ z&o|FSL!Exjfp2ZT`4E(265@(KAx}%IGPjVeHW`f-qsDZz;zdNq4Xg|{nPOWxA&|<& z%41P@<9R>^r&Wb@znwOn@{$0ZLvzRPgm8JY+G<`6*?dg~XXQq}PrYmw*C=mRoKiN7 zz6`Y)W>{eiLVdLwcG}D~Z@zp%@Hb|pE%|i6;v{GSALnQ+**4aV6=_xd$kndEt{!Y_3I&st{@SsIb8i$d^FAmImZgv*bBx4PXW={aGq0j zH|O|z&zAP1w9{YrWqg)fHu@IA1J~wz>K#cQURLK_+H!^h(~sw=v=_!Ra{YRfD~ZSg zy28KIQf(*{j>I6Y62rm8KBbzEDs-y*XTaohjK_YnyUP}EkxNCvI;x2_w9uaRnWj-D zuZ~n;61Kl9;_?K#*9l+COSKm+gEVADu8j0srFd0{Cx*^XW>g`~X&X}(E{vRYn(UeB z4JGH`7t5ndyY+X@`qZYj8x`(jgGqbzw%h@Wuz*j?cFntv?g;y{9w14gX>Y;&y%KCWq=_|hf;)G zMO}D7-l*VPp$E57u9JBm)iwG~l4JPFM;xan4zb9Ca%fYqo+tI=Zk)|!I^)Kc}|8ZatHc zkrA#lGBB7r7J%Ho9Vzd`FEEJ+Hne@j_DQI_;0v@4(|hWt)hS&w{U|l<(c>BGZg|Y? zoCI<#V0r8H4I`kudi%hpx?h3=@qP=E3Y1oUV9ng`5y{+8< zp$J;9HJ&8Zeu`zF)yN*w1=IeLSoDz(Py}~oQ1~Ud2XEjOvtuD58{^($%fY{10Q#m& z$c=v{Niu;^X3Ehm3g)<_aEdQA4ZL-+TFq6yOOI9VG9ZM9TuT^d84^Plkz$YMS`nUO zvzJLeG3y)c<&%(bv(skRKsWwub?kZKT2x}8E*6Z-Rgnh8ON0*B0hwjNcG+Lq(TI8L z`L7x&_%7PJPxoM$qs=Jet*weC?(jA}=X<1#)qSD2lSrTH^Ex)8-j=nYPRwP@ z<-+-NOK06gq;tR~aBMWUJ`iWnOw-*>9?aYf`%NJ?GO;SnKV;XTfk}>EHh0RJx|w_5 z+H;^UY!cp31#`rItq2@{W<2$G_%BOdye|3*J`Nt-$@%D^41PJAHtl=1U^RKUUvVHJ zM|fIWt6y87Z+`fyv`l3<)A`bUGnetGi_)1@Kn6dX2xuUb(9N+QFaj2Q)A^ zbcL}{LXo!^%wshg%~t4@8#1CO*XlZ?-~FKpyil^&j%l;f%6;U$Y%#VdQgEez(Pe=j z2Eap6D+5D@p$7%5$N>2?*New3lxo=l>!+tn(w#8xhI28wtAi2NsyZ+$+wo=>bPpBW z>9y2N?d6OKZ44`7ZCFi^f$d|8V=hCzA*RdfyQ{5?Zm|vXA#iH{@Qrx&?j-+3#l!N; zUFmCYl)GzTbk0NC7W&`luEDI@IDS*cF9sJ5%B}Oa#(%tXdl4+2VddHYx(`ApPmK;gBc^O|JCTOhM- zXASj-vU4ZOq2UezgUsXB<+idD|%la|)6@9OF*)EP$|1$;2g$V;(zs`2mjB-e1{H8XVs4z!BrEr(g@re(U0+hwU| z(BF?KNB1Sn6b_V`gWlb-zdAFg(0NtlSXbxkROou}uGZh(%&_)G)N<#XlWx>|MX#Cc zTHHw1ds{viuPf(%E_W@5<4ImoDO6#?J16bVE|3#puhAkH)@VG!@w6816ETHY3f_Wc7cs zJz&r@=wCX?L~Z68=-O>xEFz(k(?}MUw*DMJ3s)hFaw_sduCWvmbrp$LFINtcSALeB z%0>Krm&!4!R|k`KhvspIMSAEep)~JL2?Sl5XsA`>eBzUMmOZDy5w5@@L3Lr|h&s*m?>I5-t^j z{D}h6k4>?;5l^>GPednXQPw6OdCPNVXa#5Ejc7$C`swbUYD|YyuAhnP1F=v8oGM3H%Ni3{m z`V1oYT>u=t|je5NGdW&E|}*=TP@*Sr*Q^<6}nNtlVH09~sWy~gf2%ld3W z;Id4Gf?(X5JgSvs|P$5I3(3Rr@i+Cfe@RLsnaS&IH;=->DMwSJ?*%+=S zWXKgd(Y(>;km7Flq`>KAYx(v9xmB>EOO|pFE~z*$t~zKfr#!i|+31`+QO+A-m(AH* zo;Ms|yJGa$jg72Ho8)>x$mJ)`&&!rnTb0W=?G*n-V`^Vin};8`9fRG)tHdpHH}+KM z)YO51m1SEvm8EG#mkJG?G;g=tGXAgwzoY(MKR$8|ahLMvGUKPmJvabGITJ z?Sb@mmW!*-hSAE}JpUnr#LIwz$W^-MhE-x`Sxo?3TulDe5BrgWT`C02Fd^%~srz2? zk;;<$V&~Q$_Ioa^_}+b$l9~e{|FD&#q>$MWe*(5Zs7lO%R}gy6XcfFp`oDBSLoBY~ zcD-8vIP#0}@$*lkv46I1wk-s?JfelPhNO+oEHBKWj&Bxg-_tkcBeD%|+`E?*0qkNf z439vFN!wc>Z#B=Fie>uN74^4ukA~)@mcgNRMQP0*kuc5Jv#eV86`)9me;p#YMB06C*3JTGvVsMpD zYAqa1nnV2ft1!b&pou3kw{dqZVI;S5IDXc3lrDqD+=iAO*bTLBm2LLj&g)Q`H3NPS zF}_d~a%JS~dmY2`*B3h*(NoAhDz?*4?t{KQxU3-ALwt+EPs7ig8@kc8 zlG{3=2fgpLkd~g^GLt&%Y2mR>&(q$;oekL2SjZV&pekbXLx2aUDNdWse)8dWmH@(9 zdoDYrQ5xDUSMq4qH?8oTFPDF;)cZd!U}kJ6>egt>)xp8M)V2H?xe&#xJ6Z!=n2`P1 z;nX9BgYRXJD5#=p?$<)#VZkRjKp7-Z|Q~un^jq zYi%)`HCW*WmFT5V^XBEW-Tau02orxHV}C)--|6AqO7ff;Qt-`OHtYs7v)(PE3vzcT z;HiuXSq5*qYDtvtCWaZ`N3QnhSR8tE`IaYoR*1J*6Z*{YZHf=`*UPHfot*tH3}J8f zWN7ty+WZVPD0XWkAPaf^b!KmShhCqzNAwuyQI#@!a?t2?eYf2zJQN)#G{e;M`!hX} z7+kHa*?TP9O3)(DeR{5-yz)VsKPXu5EVEa;(NjWnFxXk3K`WrMm#y9B1;=;@cish) zRxQA|pWUGm48)+M7CE7U<=?uP9?JQ?g;>Z=NVm69dGQU@LW_`RXAAp7TZp4()+jE~ zOI+3V{*{aKOqB6R!*Q{@MZKEkqA{WWRz^H+fO7~Ae9tXN_G0ckD#c$(XzKWaZr0oj zU6Y4A>E+WI6P;d-p;MB5klh>_R=Kdq=O1$38FO{K53s^@H4lvb!(hFUAL#$wuGMFy zpRZhGYLiq*LX{izMf~kOhK?$1 zl|Jj2$(#(4pcjC(m&eO_p)n^jP4TR6dAD5lQvHofa;HnS-6WsCkWneE6t58OXuJyv zy^cxm6|WhaLMOIa$jo^=gmix`ff#9D*WcCqzim~aChL(CntEk7AbDjs! zy`DctvuG`YCj3R2bau$eJvZdSOYym>2!Cm}5QGFbKp*06&aC~>#e?;Zf3CgBv@w{! z+=@}KaN_spvDdWqv*OYgqZ*%&DP*77xq7CZ$7I+EP~?9mm4V*n;ilU2)(n)A^2$)m zdF08RBf^&m-KkDTl6Teh`|N$=$*x**NR0tg72Mck?)3C|T`~&=SY0@;d1#omvrR@x z>>C!H^6Q)Px)jx=TC2L14b43dGR%|Fx3P0T2LIun(;flvCA<7)T{NW@6EP&zr0c-O z@smFza`E`)=6iZh&`QY=pL5c%12j14T2&5#@@3dr?Wo6B>shO2OQxeKI%lEy2AWVU zu)vt|?FO>ukb;`GCM;TA$@R}E+RBDKZ{>b-+}MtjplGvu%r5?|OeF*-nlzYqIfS`- z>F(WfL$`jdf$@W+*XkvCi2(hG5o(dZ)f)Q)?%vwqWs_WUv`1;_j{qPj2Eq+PR}Z*4 zY1I}dD)Bo|a{6_(4RF#EHD2gZxRGoX>AKpikS%%~1E2euT9}?8a=R2Y(T2pv`;FqPc@3G}d!1e;!#1xdcI!Sg zwiqI2JUF_!fBUjps0pNrYe=V@b#z*{wsMVowiuWkH9(%F6J`o)J{OGViCL5x=#Lz3d$XTri^2>JupgVw{sgFCMt{?k96N{FLr_)ulQ`+ zN_9ulrAC*hT(d`x2aKv^_@=6#gRFwue4aWe=%8M~xVGOJWlcN~ z{JAs*DASlhv^Coul86Z!PcvT@T$2jqF(}KLvSepM(k$fE3Ad|>2!^`$Fd)uot;3^l z2W?Y|Ys%hHAPD$Ynew@;$AxlX&YX!=iypNnzX8T zWlTR-P2Ti2UCZ;1*=s&nyr|ZOq2Jf$T#I_9Q_rhHKWa)LwzC(?UtWuB_C@?6n12H^ zce&u==t(=%`A}g{W8Q@^zaq z*%RdfJG3vxSgtlBt`=O#S*fB2Dcv7Z$^wL~hhq3t;zU{~FAPSbTX)&{R16HWEYG(~ z_UQTMfP_fC>WanlVaQ6@;1@tvL~jYq=On41n8LMvbBazfKNO2eSkWpimklX=AQ7jP zZy^HQEk4k(G6~)_;j+UPHd}lb*xznqWCN7VY8i)FycF~;mJMHu@!FdYm@%^IuuC~D zS&gm>T6cDrurku456dy8nvr3cxH?Ic_4)~j0c*~A4e_Frs;rtjwl<~lu-@K9MBAR}E_dxsv(r5*8;f`S7M`<#8qm?|S@6avMGS&kvTZ@gQ5s6a zK@rpu`N!m@8Dmz(;SO)G=Ve~r$-Y5-YO1>PiMY6Crqimk)0Ty>PEnkmX`xIu5BTd|1`7)&+02lJvAxE)p+$>OSxb z6&Znw+tA$qy@zb`EX;Xrc32y1<=Q^AG~W^Kj>RzR$l_Lw%WwS?`6h3O#l{(@M&&~K zkJi84%S>$^db%hm=H+dK0!9=HrtM7Ys-(_)HKRC7LLg0zc2?O!Av|iiPp$L}wvIHo zG761jDk5wKgGB^aUlmL{V1pv%OSIuzb)rsb>QDdBv}W^dojiZ=KtH>+#_OXYhv<|##F_rFNIP~AKdS&yuVkOt7B$O+j8dT!v5~+c~NcLJ7EZp}E2hTP5u`p!LiZmeUL;f`q^%=tG^4UU4b? z0}bJ|p&vICWtzzsWK%QK()AkEKDz!H>{9(y|Ejz5%xzQ4K(qRj_!dLJ_MR)H=*QPz zdb~Al)6$YK786s{I%81|Zf=6Syu#TdlkXcF8?TEvE^PA8;7IK%(%psUre{D8SpaG+{V&q z^j#gRnBijlBwp97OZJaG^v?MzvZX%!+_&c_FI=Ra)T+AE)__B=7j%9g@@wkqj*jf= zYFZ(R7qgwQevvLzZ6*x-pl0QJibm|Qz_Q|N>pX9_o6p$2BVFr+nV;%U`!TYH_!J@a zl8ptqCd`{`_%CXf{B(RiMf4)_7XyuqI8>Ak!nSFjvbDZWaDN$;ShAXRPbg$-bCcQ8 z!j5Lj3wE_hg!;*p873w3Z2|kFR~>#+QJx7dw{sqJ07d}Rvha)07)lB3G3ly$6g|Cc z@DDol5f4XKkM3mZlu%{kTw}WRoMs4ayXmUC{oM#}aJs(pXwB!abhW4c;YWGR&J@A+ zcxDYgq>JbdN^WC_a*3SWGB|3MSb1=hV@fq}b@3|Ka;^y8wtdg+n#(rkG}v55IWr`r zYFTRmDy=#HE&~=&<~>%u0_JoED$IB9FX@pvzs;+|?iaz?f4jN+CtQ7FIQDB6_m>R4 zi}wrC6hbX!!y`(Er;RhmW>8$Ao`&-D?-L}VL8KlY6g zLu8d#?y>i1y0e=vac7c%?N^o9C+++zHQq1_4~K!O#2FF}IJQ(rijXXcDjcfZTfYA4 za#ds&mP$%V^3E0CTThryz#G@^`lc)8iX8=|;@%%BiFco|WUu@M7b%@}TxFP7DWtGx zxdj$Gx}!=HRrd8sA^KIlH#fMq;B!qo<}+sP@VcV?)Ec_{XC6*5I&FO;Ioa~Gfcm)- zmt9n%s=()|&Tv(ZBy_JtW4H{Th(=KrK@-Cs_Ax* z(13WDe90BhishoSxeG9rR@EX+u_Auuy@ueG0XZ8>B*orrlPYt7l4+}3ZH}f$2R^rn zlp^+K+@@49ZxygT;NaaumX^U4k6-m4r!}3JO!xO!y6-vssyLUiyp5S(fNdvN>Zg74 zX+1A)rtsI9d9G-hC9-NCj2vYdx^0owukZTcoqbW=^zYw!{=d9u3;3!~^qg2*1<|?5 z?x)JXe_%2dpUitWcqnX`m9~5TUI##7rLrfL89&`%AJLCLp;4@xM83^FdRua%T&K|; z-}z;rL{?NWQbPYp%HGcmKV;pDJAVh5`D zkRDb?sa-oen&Sq{r9IjWqVD{BbAA3EnU@v_N?5Cp-wy8xa{$`D5yqN&l}%lqbtO8s zGBV^o8q%D7*N*duluLG6b#eG2KEpW|R2m4GapP@5Z=+wTnFw^P*%KS|v$4O`l1?*TN&(KmE@;lly* z4}_W`73*anB?qnhOirX|gba5>X0I#i&=h#@Qwm^1yA~rWG3TPKA2jb7<2h6`TFd8_9dIFj-EJIP}H3OX#|1^%7T3JoLlaZ*3Z~S2hXazw+m;G*rmkJv zNCXucwV0K(ew1PYy!G%4lE+`erpeBkBfEV)uxu-P204` zkb>Vu@RENmca05m*SLAe`Sn8+gYG9a{;lil2W zyY9V5L8;}HP!SS;+pJ>JH528mVHC%%C?9ycS^Q(m@k#jEieM5Ay_Bcj_ny<^M0fA3 zuT#k5-eYopBV)<(a5-z1v1Y+91=Xu3hLRdD&&CMI1)4H8T~lAhPc25P$ z^N(33tgO{LbHHh|v790LaNRI_w6~Z(`LhBbhLUvW8BQU)vwB&Vn@iPCT%sqX)uuLs zSbE6~Zo;_br%FHs0IrHr%P#ef4BMM$b%V7XMe7ndZK4-nVJB%YpvqOasG)_2CB&z< zMw+nP-}jDRD849xA-E=uKDnOwPydr?T~A4 z4N=qd5kKxnk&13GRZXK-oaPMR-l;wEw{I6Yhbcn@MJ!rYc}%WzWFt4pO|d~MOd}I| zkcysHdr5q`EQwrGr3SIJb-(H9Q9plAtNeI{{s~+q%XW3-VYe88{IC{kAH$jZ8AWqj zymNA3rQK-o^j2}Qvnibla>ChbmYpjVUa4m*<5-~quEkn{z9J2KfI!@6WF$btFr9xU z`q9(#Zyk3qHGnKeL$hY-X5)=~$JEj21@xG{D^eQux=L3S%_>KwTPE&W+&GGnDt=N0 zbQT}NJ_Uh5fB5sMpEiyS51TVJeUIH5F5DIJfdM&Sck5#lDx4tHGiMTCN@lDdI+ghg zjOb3u9er^?gy7*0<-#=L6`oaUmO6?ml5|x+r+!b&`|z4&{-hdJ+(I39aBOs0L*=C` zbc*KJZUnsRTmTu_xPWC(4WZTta-qh~Rz0{WSPBrcZ`)+j-Of-%7)_ukW~$&oCu2?9 zb)sitDV5&IAb!L$j}CBuW{$I=_u}!rMGusLC*0U$f;Y1g#u) z>2qJ{);o9T+S>cq)2M3?HZa?%dug>92rh^fD0bKD#L3xgGxeT-|2^lOlL2;f$HSpP zf!mGhQk_Hppia}@K2f1;tk&3YLua^{yv+=;ex_YG8*AD>juQE> ze-a#{#C8)zIkYM7+&NL0!V|8b?{?~~cQ!?IfGV9P0sw6EVcG1& z*))D-jDgT5AcuVEIlFL5gMVPL!U+3LUa+P9mm*kOOX#coNf1-45tDj%g z-l3>n*yZ%6O{J9c7%T1zl#*1wm1s5Vn{1eT=T;@ZML{yPr+K81%JM_88`#M}5rNQM zB0ACh81AvD2P`^R#*Mzpzj#&K!h1T%K1EncGQVz(OIr;F(wV}u?9Dg%^R2ge`1#{s zZlO>-S&-UVc0NA7TYvsQePbkY%D*n?Qa$3oX^FYx&ur^33VpKO4GKm)I_k5dn%g;4m7^LwJO>y3%5@UdGd(Heqrr~T}x+y&Tsn9Tj{ch!yATnde-!yQg0rA-yVoT^EPnl@_6$;F&w# zy>ESB=p84}B|FtB{A_UZ17Ry+JE>pZs1*Zz>b7JkHaW6gaoGo8PY7#l_iSKoUQ2cU z*2dODe+t`gj;WTCI>Cu?xp(^OlWrPiR5J`Uqa1?dafGqn2~2>|Oy4&d8Kr?LRx6pT zr>oB8VW5u!C8_bs+Zb0lIegny&>4y=AAF%XUnAGJ-HoZO3SW!Rny4RZ_tt79`TTqd ze=1Y-d#cTeK-JyCMDIG$*4U%ZJr0BUZC`63ZWB(B8$hGBpj-%gcxq7sdL21>o5EvB*Ib(KT0MH$@V zi{lJq#;;KzFjKBC3+5wq@3Q~YC{%A{vG@hckVYG-iBhS{hp13}H`{qWk&mPd=PoT5 z4|kq2be=zfmLMrM4^qu9$M2n*i&5F7xwoRn5G8O#$72?ZRX%zbI7}){*R*)7rSQ59x$@8uRw{^>CNj{iR>Kn2GnI)w|5ylj^i)>zL@D)e)I-ahkUF zd$Xzuk9{|6>A=1kE&eATbcP+bhpN9X)q$FuOoEpkXSrmHn|nM5v(~*erL5J&xtP=X z>r%%uqqa{}x-%V85;Jn$kBx^0+`5{&a24Klv?|3}#}XDv!FqZ@My9iAeABCZF99=D zms{dxbQ24Icn68f<(Xn#**w7$Qe{pPJdZ_VKfm~~Jg1>X+=RS+=I!ZR5 zHLOaL4LgE*V4R${%{6RftU2}dq*mvCTUMS$P_MW@{6zL#CCj98Hgr<|5S5eM*nWlk z1yh)!^u!WioB{g-@g0+o*!*zWbp~E_FVPEP>a{>F@$nh^Cn3TN z0>kX=(}xbOu9lX1S#s7Da~TAefQ9r;#dLWO)&#BvXH@gSEAfb15*_DTiLznnLOryx zkp*^mmHEoACviFM!oqjNowfBSr}iSJcUx`{@I~j!_B1@NSxVRlv$J!#LEbFKj9RF~ z^{(oK1THy9gKKb)q+Cm&+yE*JH@HOzJ?azw!nx<62T6a}tVQ=jkmD+J`JPyQGqS=apKo z&;Hdkm;W^e)4I~>D->d%Vq|M_+Jma*WR zyW!2?u3e`mlsj~b_~R|87O1%*)#9RlL=?j(a%hpFRJtsN&{k|Eo*F zKetXyqu%O~<8U}>X=xYnY+yxIX=!Oi1tUXNsNi4CjnzFZ9jX;gsZ|ZBw_`3k!(a+E zLxyE+QNb4$F6uhIx2-a0BmXU9B7#IYJlVJ#L(iYe=`7trKmJ{0d zNtz2;nM?~`GmRH;+jQZ&F0Zp$kmZQEpt!Z@>KnXpQ-ApfzzlC}k!&R0YJC2tFLdT4 zxMEVokVwpPOCBAM|NhQq-7x>PaIbT-uf+Bi3;J=}FoRmseQ~Cj!sy!WNI0GIn$r`u z2H5$Q@>8azndT10F*v9QbD>m>*17?^lb;lZ2VR|@uMpslf-)-J^Zl6nyDmo6xi8f0 z{l;FbH#9WN?fNAsvxi=MDrBoFXcD&_wC2B=2tX}*5XsDqB6?!6KxP^y4VX$!2R2Hd z`d4_9k}9ek2Hd_KcJSweL^xU|lDuLDveHL9aThu<{sHNP9Z$r3!@ zdSb9aZW?<(1(QCOjuZ|nMqW+Nj_ywJGha>lw_yTBj*J-_Y16uZnMdvJ8}U|JR`y6C z@clQN3-hifE=G46H*jO=RzeChGTX2gt)iAz?QxWQkoEYCs8K>rlk1g$SW8b+h$681 zSfusm4O_HZ(26T+=cN%?+d$_}Ov|L9%d-B%;B>^vvd>-VKY7iJotL?x1{m<)Hbq_e=J~ zoVZ3VSfX7<1}7G1=NRFMKS_+K!K<82tTtaB8`LaAU({jQ2}ueNdgOBRUgGJ+tFZ5` z?j?KFNo>+t<>;oFocg0GC#z+iigNX;EcQLR?qZqtHcVxxsDC&7R|Ct{JhHO^RSsFf zmQ^NIY2f*W18)Pw#3DHEG{Ep<5_oNpQBsB2+5)>u*f_$pIoRJKF?=HmiO2hm@o)*% zIVAw`s;HK)%@uB^cs&i$1!VZH)>ygGs+oGW)Z^vhmKr=jtY%NYTBcRCW|lju_=$=I za*vMCh-eNnt~7Im+nesPO9-hMKg;spD|f_xH0_^8Lv(KVhbydF`70LIzsppUWMo)8 z5L|V4!kF9DsT(^oWUrpn=x;n4JpWZN+vMoPi_gw(2Y&IIIe9lkI^!)CvihQ<=guXrrRFc)OuK(8Q3Bh%$9h~DPPAsIxyI(s zjxg1OM^whs+jghQ@YrWpsq=HQ4TVPL zprYg{TS-0+hy8aXHTB$DK6|OPRgbp92GiM?C6?9h7k&6JY0! z>*2gidX1F(x247MZ0|5iEqC!)I^`CVa4^p@Go}c(A}8!mkG`>_n6?y)#?VpMmXtL< zX0$qRPjPpSAM@N#*Ut6Sf(UTzp8S`&t-i>weBE|2Q>QdcBpL$t=UVN!Z7J-v#4cTh5O+HcTFHX?dRaw_0KSY0L-;rKSPA2 zX5(%-p@k=(GZ;&!ixs1rfoz|cM(u+J0+)AHyD+vRE$$uBg_fMB`y~n%!;U-G9A#G> zMxGn@^Npo}!T4)MMTew?T`xDSx0@9($ zF|&&}GD6XlS&9WptH*i#&mLDc$f<4u5!1?vC8`c@1{wj`Na_8|6CY#5AlE!!wvb+t za0gMcNjPIrwy0zKWF`C4@u+If9vY^5$*sCZr>+OtiOls5R#K+tqv>OQl2WK#pjbv6 zW2W1LuW9kBpq1l6R2gVk>1xL( zCWzSBwaOfimYUb{bI6p8iBeE9R(Y*%B*@0Q==8I#Nikmg8JI9>X0ehg62(D(YuDNN z{$;&(E8xw3R<@qTo?-Q7BKg zt+h4n42gnS4SWRmIFAY`?*KtLI?p4^Bi%WN?V)k#gx=#A>#l3J5N=?xP2`ZH71=M7 zYj_;Dc)C48AA=DCbO(IurMPrm3zdE~+@J5#C@Y0{CcK!kyk~AuI!B~tYkUwb@UjkZ z4|%*9DnVa97B99(bl`LbUoN|B+|DRsW}??`Z*hE_hH~08&C`~>KgCyBLRCio1MOSa#!am!^_pfYZv-lB;r9zh#Q3e51@|C8acImQ(<8`5hUCzz!hv`_;pny6wC>ol_Hpo<`D&$jBv=d53=T(#L7isS0-f;sB(Q}q@C0|Nz} zUQ&P^_4PN~+ITnUw!Cdus(rZ#vprp<+zM#vzU5q{c_hOudb@CKXLyGacdBYQZ&vED zv41PgO@vXAKxF>1$=!GsjEUarw9Hd;X)lK8u$Y4}FlM~_-tQ>Gj>UtO&Fx_uzD*8(7gfXk{W zsSJ)CO8SefBHwoCr7xirlr`L2m1X!jpubxye){P zC!soT%Z*dJ`E!68_dLQa-fjCT%unygyLD?1B)gw=pp^1`P~Wf;9u-1Z8GG}`R>OnC zR&m5Ys@cyKXrtO5nr8!@DfPXYt76Y$9bd65GkCsT*3T+7Acj{gPQwYserg_utD& zKa-1!i#3{@j(?>geAnv<#nBzMZUPw!!_-FlU=?z3-)E{&lG<8v4y$v|r56>L&tK*& zM?{nm*Zzv_iAo{rc%jK9TO;jLv<1Y8h~7v!AVB>zheSQNCJ(vRKBnv^>t)i%({Fly zd*(P$S~B1J$9WIRUxk*FP+kp-W#~mb5darKd)-<7mL2g8zQyUe9}vaMWwqkfxoTu= z?EH9tx&47d#HtD8`0BeKpmMsq3(PwL>(^+7?a$;U0wvuC){=%#bssT_f1&Z>X*C4yt7hV`Zq>wZ> zVc)B{OZ_>6F>nBK@|oZJ(`;tRL5k40^+5$07OoFyKiF7tx7paZB2$Q*)6EXdVw1v0 z1%O`vz25YWj)tFc0JaRMwq*ZgD?*aA>=VW&DzCbf6-$i2XdAiW=e;Bi*uXsKT5jn( zia>k+?{%FFOb`(9N)aP2T>qRFCR-uIuH$_cP>0RYJUM^obAJ&dRgcc(Hdd{0{;drs z$&{BV-9eZ4dQU8qYkA$=i6=U=X8d2MHuAEhC;+a{_%{I81i*1YW1AAq!vSv)MVdK{ zt~*_RdiImgrAX8g!}>V@XS5riv@Vx1Wg@goro0zOU)5!D;74g1rR{+Vv~;NOCju0x z5r_;1J32bn{%vr$EP&thgulWt^n*OU zay_D4^B>kq8|QB)&ab=xh>7^(_H(F6UiM~D08U4dD8=e0$i(%!m z>i`B)%i!^Ge5QcLGhT8Xe~Ld{!7s=TJ>|tu2T(@Db0)*MIXNk%-a}cL5$4nr&azq5 zseSv8f4d$5U_!+s{lov_t$2%w zh=_n7-i#`*(s0H>MHRw`10^EG{yl%n1lY%My?*)pG$sX^Zo_1+$X!!iH6}HN!t1vv zdx(r%%zkn_(9xc)&8Lp$3jTvKqJ`nl2p`#2AVrZ+^OY|c?Ck|6$he(xAe2{v=ysqe zDs_l3azXD0DG&yRKYS+1mQvfg)xL{(LdL|L3>s^>z2#$CF3$pG^M{wYZO7hh4B95fO+u!PqQV0y|^cg{!%_!8ki`oy~eNLWNfMD#l`^1vt~c!B>Xu$O{! za8nh03ViQJ>(70$?EgKE8sw=} zRsR1wAb8@{&*=Wy0{)}<|DOfrix3}#1!fn5g0Gk-98`P=u(-TF{SNv2zb`cJY?7UP zMe-DBARL7ZY6Sz(M9zNnUVqWiXS!*k z()3SAVSm=vr_z6ZM7aWFM(MCZBKARPBP3Axec1|9#3CZ>*ME-k{}hs!@kX|Tel5L-2A&VS^Tu7Wt3rv;8NLT^uEdx=U2%X zIrUC$SuP@U}U@Xq=-QS?^HJikNrL zR9rKG^Q-Z~=b^&-?SZ}h&sOS)-6dv>7%?$1$7>ydc6b$teT||wqqK@_=>!(+8@Cp{ zg4aoAPjy)nE&)z=tSwZdPBetRNOpwZ)O}yw3h{?z-x51)P(q2mH8wU*_^hY!{3|al zB_pI^I?=j{8>UU-IpT-_+R}^91rD8Wk8z=(+KS&D0bc_xqiHm;Xpw&a1gwDoHkvbt zY~|xU1mZ4!P8IR{r%pi=e8~6Xsn)oFcCOEN1YTx_r!zFmES+?Q zTtxH?SuVIO#D-qg=qs70a63}iV@$330-oCKT`w(8)IRjD4`ABXWUT2y);y~(Ycx&0I()nAUg~T%7gb3_gONfZ zqozzIMCMX zPv4lsj+f5lt^JFt`pd8bgClyr-5#FR;3VXbHjk;sBHPCHUVCR05+_?t9xOggwEHNN z+u(7MqEXTN3+=VGXt^=Dkmk#1Rnex5` z7QP)$DB4WdoNRX2uDmW666%mWAEODS8DT)c}lTK5SIksq5w~?b4-o-z)ziPzd@PURA)$-NJ$a?J6~r{k>MFh+oGGKF%{* zP3*~O6S4}}8dXLM!CUs)ck@F_Ji_dK@&{>yj{llMId^{)tQ4z^*BO`qwk0vdHhf32G< zu)&DO)>~f9p{2xtfA#!XgybK31plQ+&#@M#ypw-X_??8@4^9C(b|LqckA{WQ+eSdp zv;c0|8As)Yo3Ci`t_sgU@lFH3d*|uP%UHF0EnqCr7ij`IV&#@J;6#Hwz{}h zs{^~R56MxFD{0F86asvfC&;`u6pE&VvyQW)qyrPOh@>h3Tq0+i0vq>8LnWYU%BSsBC{qjkHS zM6_o;BlLD0nz-losFfz=h!JaOq)3-ijhUD(Bx`qkR2UKS7vEaQb_-O-u-Zw!~g`?zZW^jUD#>0yg~p#CAA| z{;v_SGh1wm@0B-$9Kz$e-6r!Ox7!vRI&_yU6%MQpL^Mm*$PC--YYG4)>H$&fJ|Vs@ zS0)VJkBJ&)2azUta`cn+O^Cvm9Sm}ht987v2hOW23d`mzygjMa5L~BY62vz;2%?4! z@oem0wg<%xay9VGjEqPzzQhAcnwK-a@8<~qx`;N))hC&|h5odt9aGI7Yu(AS@`;!# zP95UBhRyh4EM673CWJXI=$T?^;}L2eql~L>((8C7L@?(jwYq?+CzLBkJdKCDgi7Yf zkch^hHvdufw0k6v+^2HAr53UOu~69zLu&7O13Ka^x%5D0I61BIVIofu&2)*&0=|SK z4X1DPQ`JMP6kXharhA_dddNev=UnE(Z(faunvzS+%LAO}@kCL!cD=(1sJ{Gk7tmUO zWYS3ucK;gJ!4M()G>r@Xiq+UACrf2{XMYL;e$NX~tafhj0%B2#jkLrM=a~%*=H_C4 z++}h2oVdjV_vw`GOnB#TiqC@@RpP|cHOtNO?>v4O4Ta>0n9N@--|ykPRiK`{J7qC> ze)0`9PYYYRy8dEqYV|HTRSWV=b^;$W8L=Ct{3ZbV<6n~VG42Vh0I z!gCzppn15PkF%(|nR)v>UPA5<9kTaj@!zdnU_od=46P?G`cb&E^5v6WA`1Oiwr+H} zR%RlR4RQSXg+i{DU6mS3mPhB@9O8+-rhq)3Tvnd*9nXjXPJ+IBsF##Y&DMQtd8B=dw_+Y%bW%&mGgP@IFH~CI@3UVueMOxf_zyu8a zsWe=lB6$o->RWht|DS(UiT8h7P7Jg>at)T9f3o$6%RE9_g)q+RY|?rDBNM4+5n^5m zeA6wL%0w@t&?fpx>^7XHZw>ERb-+uL7E{+DL*-)GfWWC*H)R~$e7(xg(0>LsM~Fvfj(d4ojyVv11Q*p@1M9|9_BCiV;(P= z<+yo=URBnD*Bj{Bd~n#C^laFYgClk8Yozn7SH3lOW{eduxx&P58^D#+Y$UhTv<3+_ zY?mE*Sah*hyNn5Ke}|dgox9)1Gtk%}@pRvwo7#JuseA5eNeVYJ!uEqAG$U6SrV|OK zcIj@)QpTk9p(l^iAwqL_w0q%G1 z{-?EdtT)e!Ba>O~$ZE3E^lUCZ8k})<#SZpfDW|x)XIM|%)7-dhc*gjejthC;@An;O zj`O@~)Fio|Xj-ow=_(&BOLG^|5^cUh#@>j=e&nE88sl8&*T%$zmjErCPxxV+I^G%e zwEzCLV4rqV0a)WBxN!xYcm*LEHp)BLK|($?{{Kyby5QK`Yg-m>rt4bgTV{?u*S8;+ zu02~FLpeR>&aWm)G4_nGulCTpyWc7V`na5QaV>N16-SISa~#g2&G36VIn9I^rdrNq zcMcN&vjr4v9+z-3l?^kJ$8HSdmC1@QpA5_B8J;rU+0C@eP^%I9{8|5l^irVE-nFzn zjT^fez^S2@f7#MmX7m#js-64@o=3GF@#oyF^R!`&*Ce|0M@!}y&cDttjy#!9pVuZg zyAksk&Wz;EiJr=6m%;MLmi=-|(u86y&Ccn|+mR&&+5{E;obc->Vo{0LPr^U??;xKhMgALQjMx5QowW*P@d$9gn6a1(4znR^yIuGxT>x6pZR zSFzWM8eiztoVhfgH8wYE67&B9wjYEE>dFMnpr_=^tH6-Ue?>_W8_PvWIzKz}7kt`9 zh?4#7oKKHyWlW%e22Psz(cBN#yY$t?<%pCQ_z2@9J}U^=0KKB$|KHJzkdI_`+VgOk z!nLu2+hrn8xtFG{w?25+i!j=^Q*V=6o0Xob`}?!b?N{VAtP*uWf#whBxHx$^0hkw ztP0-$G7vy&0BjGc^irfKSQr@LxY>Dm5K}-zRG1xMq_oI?m;$__BYI6(fN(LN+g>6e zN+_LS(YzEFtPGsGPlXM`zV07Lw^@%Q$U|0rG{_90To%IXJzn{LFIo0liCxGnG*kkQYf zkO-)#sJJ9uC{wgFsL^Nt_?A4q=@lIl{SxPWX%;{ znrJ@qzNO{ivD93}w3_ZzDB|m$gm)Kp8pDUuWcvYo>>a%f=NyUi3!QWZX!?dujaa%r z4abg4DvLV7L0aFY<#mUUqFywK+F?7wcMXhYbDx5K%P{Q^xOD^txv^PmyWzixyiCrryQN6f+Ryd29h*rOt>0tBcv9-aS z%&L(J25A5E%r*JGK40WdHYQ2n-Z2Juw9z3I8r@T*HVxyXKc- z3ctqZ;iSMZ25#8*4mQ}lp>lQG>@YvG)t$4mE{m*5^k|w2%x-SpaVf0kJ~bW3+R15q zmoPWms2f%r%0y#k<`ql4y)d~wN;ZRK9oLOFp1tVf8>)8fp0$-!-7H;eB7r;iN3V@)fr0R>q^s$M2fh zv-OOO#={k}Va4Ui0rQ7gjjxpNh%8csb+HuE0tHD%*s6+{7446hoc(z)F)`oDyYeD z?KZUpk`M^7-V_&8_Ol}$hqic8RafII1z-o+gXJGkcP)!Je(k327UoGe^qOKe_i_-B zUo>(CM%om8u>Ij_DKhD+;#-qHXd!pYalvF&{~pSVSPZaUzm6NXuGavL@NjbBfMc`g zPzFROaL^rhpHbGt;e7dqhpjJI;n9Mo7JhB}ACnuRQEHh@1bQ_#7t~X^>(Y0d#%68 ztYEyk(w2&5(F>eoSzCeTl#WnD^cEtG#qABGKMO_lseJ-_dTJYTVxF?Q)=!o5q~?k% zfGgyq=r{I^^DQ0xEWaw}zrFsTUqflSDXyex-%OD@Rw=-rpl;#V0+2~$eb75cA}`c3 zhRHSTr3pdYJW()v7T?qs_NAHKC%;}Hgsdg})*72%1ed zbqG5*B&~S+ioj2Uy3`k{I3xyDga((zFG8g+vSG-+`pu?GczJ^Oavw!K5Md@#6z=95V^RrO_0 z+%*o2)I+8iO?r6N$P4*1GNGm#`XUD5@p07w-Zng|DqO3x4Mj={x;Pc5rL<(2GTL}4 z@l^+=Mt-!QSu=T7mybVxwjcT#42U^oHUFG+H8P_aFUj#eNoA_B%7Dyuabzecp9C99 z@m1@~SFVfH8MJ;q4T+=_JTwXqiPN;#)4}PLN;kXtw24Cj1rcaAXRQ4E=5!)q%fA6z6;cG8q-QyXk@%4u?~7hRrw_NTYRGo(fB?j|5TKs%dY6zm zn2_YhS@Io+?=vMi-4N|=bw7EJbIbHiAIn>qln^OuGS@lE4iQch8vOOXF0dc~`nIID}4xxD(?KYW6~ z-FYG*s}&Dha#sBPJ~&iUK^S-3WTv#?@Fi+8ESsx~Hz8L~B-7`LezR%VRq&zsje9Q{ zBSu!wdPLA5T6|`!)OQ$s+UdTJx0t@Ud@Ym|MTS;R&WujFH4=Znah zk!Uu98$SU0p!@`BJlT$E6)+%o4X$ z+8a2r)F=Hy6I9@+*bDo~+S}~cO~sr47C}9~s3)WcyPPZJAz|&yNwEd#DbsTVlz5>bPb@5GgJ@6we_~JRxo6 zppg3b%`Gmthi0p7;~qHK`8u4d4A6?2$N2mNE@>)VDOdIa*o3jZ*H4s^Pv1H2mg}RT zk_t7zQfrdeQBh`>3JhfzpsGGQBS{Yuj`+xb82d^@HiIgWTF5Z>ih1K){GJXBUJoK~ zxXtGMlrs}zAicL~!j4-@fwF7gm}5cOX|yd>R}pGeuL+O~|J+z|^=gzS_3}mgbZ{5*XgEJ57IT@?>8H{dhW6rQZUXSsPSrJ8teRLAfK^; z?M1It{0UBY^J-8N8y%spwtBM$4(W_m`WV`;q5kmN9J;TwfM*|mjSni~ODM`Og&IND z8fy~0t5(taNmOX&^Q+~Ncf0V{1D~y&hWnE*&h2hWpg&e-^a&QtQvS0A9E2_yMOj1~ z6*<`3cimLv_o=(cYfUotWN4mC(^Xmp2H)WmO{DitetJ{Pp7Xn=s&PA$J>;WhpCkwO zXpLiSUV2qsn-S#?2_7IFz=cB%o`vI0K^kB%So=b)t(VHGpI*K7t%em2nS4T6_d||a z-h@%*=^IHKgL($Rsy^}8V zP(KZ+5NW;og8a!jhOU%ZhVI%2KJe6-36p$S_pbrsyoLCXS6P{rA}+XUS)a(=o^jk;8*n(q4QlBz+#OLofFdSNM0??fwc?`GGCnNa@@6Ava!--G8D=k zi)Qm6RcM`Gg)RGFP@FT0A*rTRyrowGr20v%`@9NKXAsoaJ>jfNt>8RbWvGXv{2Leb zTD*{JP>F7m6KNLMrG}ZX)U(J%aG4x7J`ReC^&(}>>Q2{G3x_pg4Fl;O%!bq}R14s? z_lTQyfjt*wlZ(Ic6TQ+ycTK`lMrPD3qNNGv!lldY_=5c&`Wj8b;TuPCaVEX*scmv- z{Ic$g;n=OEjDU%|N@@)lMB4E09*-B=2)p zPNg%=_Dd-{o_?JhhIlT}R?5=8i^mY|;!w^lKg*8#SlT~hn_t?_lq9+Ob^4omE-Li& zT1P4ul{HMfi|MD?t75_eimoX%%V0D+W@h%cHi4lzd8OMsh35mcK*G3nf$Gn3joKJ* zUwzxLh7B1@M-t#F{Y`y+d;6Tk5Y$})pOR2cpEknuXg^uhZEuZ@@ z-G3g!!NJ#oLbGl^vQY~On^V_d#-!HVFpp@wtp{OP^)#<%q}P@S+!!m7GR6u?NCaO9 z)jV*OoW=*X+3Qk`(~71hdUYA8y$vUu zHWFw-EV5~kXQP#;q5FL=hMbz|r&Q@d>CxF=YxH6S3IPR|qZ`}YdT!WDDdEdJ89~G= zho`X31QH|~FW5D6Upv%`c+-W=zaOl`f-hv&_S5)8GJ22;nSj~Z*2gIXt&@?M`zDEO zEvMHT1Tj?!SgV{!8&|ICyY~@r?BH1;q1-d;A-$h!9(j|T<8(RwHS*T;plT)}lgO$7Bn zq(d{h)>Eqj!v{8z&??LF<|Se*fU_z=!orhhP-x60Q{L;O$$J*N35&oK3m%N+lvI>+GR2ML9 zednSsH%%FoAgbOM$TFD_ms}s_(v8FYkfg?^_rhqKhktmCMmNAHpA( zbbpC-m^=vG?f-o)=33Z4UgSHbgVHg@!o0kA6iF!N9?PFIQy@6HdI4x7UW$y=Ev81X zgp4`Ww3b`90BK0puVM+VW9$9D5)||p8};H%x$zgHp45ji#;sMhjTTR|gn`Khl@t5E zg!ioO%7|+IRHa#A#Zssd#+74giCmf6H#6qCPbDg;o?eIuY7!|uRvUD2HWiPWO$U}T zoh3+iRT56~nom@MmiHWunfnJANa8_Vj5nK9ql;iTSk14CC`7O##$-R#ZO#IDb@zr} zx`1#qXblbD#I)zXZ`b;+POJhbeh=c7<>-?8EP-dQFhl5&9HVb2OD1n8j=1LDz)djx zl2NlCuXqkIEyX($II1U2mZVdV(&G%FdejGc$QlI&+I-XwwQ2;}peV=VQQWdlBo?7} zOt9R3Mt`0XLbVh=ZbmaHHMb64SC5jCCJv-)G4X7zidN2>0%sp$jnr|!ADiEf%w%ci zmY_kzpHJKGMFoW8vzxh%`KgU?queX%6|3N?U`)W8IPkD_a#p zIDwu=6az5;FdnsIVm2ZEWa?|_uoj)>Sppe!G=d1{`?7J}0fitPne7Nwr6hCtpzxxH z#XfZB7bikXW`IoGg1G5eWlkj8PRU>L9c^?lYKeqtlMbSt?y$^%7LiC&$sgPd3W8s^ zJd*|Dxq~D^PB31k1mK#HjhpH+s&2rQ2rQ-?FY?()-l!$zgvLm!%MD+Z^`HDwvx$>) zp8Yx32v<_QK+WaoX($tUQL?-)S5W1Ay%oSRLt0gHXXYFXEi4U;tS#B-)Z{9Kf_q`9##W#}*p)_wsr6QFl3A z53?(HCc0}k<$D5Zb8-yj<3YPILAyJZCG0U6R`oBCx14hM{#xP)i|OZA>Ql+BD`zxZZc&pp9R4X6!G{V_ShLZf59_Hj*1f;2Yl zSxGi8op3Zg2nG!pnCu`-6hLzY1EneosO_QT$!o8(0!2fyLPCKTB#<)S_=3jm81gWR%m7={D8hQ4rAGcVcQL8$SG=Xj-g4(6CP zFN~|Ynr7uwj?Z9_)Rq1Yx1bGg_OgV@Hrz!gT3sBtnk`% z9n)g>iOuL}VMlIf4(x^|IgZj$YEDMLv$kQ~rd2L=%z#|oKC-%YV0I5135;bc-6EG2 z-cXRJhRFtS&tO6Ll&|7pu!ZiVFISDZ}h%tVTb1rVCXT_o`N$MDv$5 zI`XPHCkm&P#GTqV;Z#eNW`X1;XFe?(e3A>t)JvjUQ_m5$oGc(ZKKL4{T0i<^elVyM z-+f~vW%SOf@s$siIvf<&;Sw7Nf=RHV>Lk3@xVCWNKGEa&!W?FoiDF>TIY_4BhO_y; zWwp1fU6M@eO#>F95VXv?9@S&r)~abhsh>c(E|sRVabLE^;m)3Mr8A(+{1#;(dpNx%~zjbWWEwVvUYC!4T3Q86)mdy*PBcn<7F@ zhGml-)YP%+?;KG(vr0qS%bYX;;;N(;1swR1ASr-Z%fUml@;tso!uOzrnK1@g9fmEn z30HPM!YJ=yzeU#tKn>7H8KbAaypL>Ajnz+z=~xCQAG+4bn^s6- zz3ONA#eMq{$GH4LSwyRT)`VuK&=}`d4di_I0rdk~$e6rNm7v4Ok%_s9k!{bC|6F)h zXzG@g)ZGJ~YtKE7h{M86jbqq|mU4U%1L}?>5%T6+79cYWiGw8IBI}jln{1Br!XRl$ z*=(0>BiWu2=}Fz8Q?UEV+q1Oz!ny0B!>okPkXR7zy5m@RnJ(M=yIaY*dG023VtgaR z?G-b`f-o6^WG9H&zhYbeqGoWXAL6=MAQgJ#W{^Z3dPTicyv(&iPF}vbYyVLyJ6D%< z2W)I&WcRc83nscLSjyyH)Yj5*A|sbfm#Vs*9&9t0{g*&iZh+RdVsCF>Q^n?nuNb|Bc|l?l>OU#RNW+peIO6~j!3%CLxk;?t z-T)e^X~w5lW?BTI-Kz`5 zs(mxKLW}B!+D*kyy0Va`2;qRH>S);RA@`1--cz?(P?RqpJ;0*}c_S9_ z@||;SGBj_kEg=q<@(>-+Utrd;)z#Qn4e~9%iM!>s6Ct`vTYkPrS^PWX;O6}4i?@yK z)WFm5@xZuOt<9eU$HZR1wTi6zLSOFwvjrgjOf~*Rd)BCcISs5Z_yGp46CkLSmx_0b z+HM{nz>rhIHw&*M#$Fv{7jX9ky&d8?eQDC2ORDI&8RuTnmY%9gFOp)~STy8*9uAb{ zErfG_9ADWOaC$JE#;h49}W2oW=iB>v>$OoNQ zUA1=`rxcIJ60l&vpdt<#*ia(`KfM( z7uZ8%$cvV_o@*YPst%!FWb)RQJ!3pBFT{xA4d5;7y?~QpV6gcipHR~W05^(eBqc|V zj|z+-{HUs`xP{t~FV=E!Zr+-j`DUy7A@=d$Ohif%J9q{TD3F~yYLAzQGS5_G;U-^B zqP(XK}K|JB$fxhSyU!6)2rm1C*I(NG}k2U zX7O#FjN}L`v}fu98?v!yrJVRAKd z6^@1VCbLKT6)-k|F5r^^lhW(g@WbZJaA?C&1GwvG;fjS|7#&iZss{H=`{CDPg$4I$ zA%F>4Eqtg|K`E;1r3##Mo$`S_rsLGqn7BM*nv8DcvfPlkf^Z#(xlWhk7X8uwtNU8^ z7J7^AebLi27_}{(-qz4{Py~;$e1>@eh&{k=jzUiDpO~3nA~#s~3;R2YycY|>?f{}W z($hJ;myaG0YsO27cMbMT(dM+4pDDV0;{-=as)Ct}M;lhWLTnhA;6 zg5FG1uxF9@?tg%M7FGl@SQR0ci#KCy0ovfjGM=mYWnf8xN+v~_E87r3A2oKk?4B3^ zHpgD|u^%So6gUIfWk7G>guWA*h?COD07davG1lOq-j!U19%)s4Sz~dz#J*gjrSKY4Z@wi@V$WQ zrg)eRD^t%(qV0Pewrsr)`uNm@PPmeT2YOq(bCAgT<6dSOa1e$sB7x2D5>C?D^ zApA=Q%nTayWLDMc*2A#J>oj-^;F*=~4?_S=Y7i|Y1^L8+=U2yyGVo%784#TTw0CVB z==SF{j}5<&Em(y+n6&y^bxR0yCqn^_zC!g;m9`g$_k&)*9bWQV^E^VANHsG+zCei* zKscy_`(z-AJCftGcsjW3(SG2Gg?d`afP5q{dx+sF0JVPLgZU}eOwj4`vq;VzNFhUy z6ap+0UK{&qOCEg3KgFbIJhr=AA=40anL9i@d-|T_+Xvu(lrIr{c}xP;z68}_*pDf^ z`VQ$Sk~Hv$q^Z*LP8&T=DtYpJ_r;6?7clfISB4{$SEuwzUm;6`7j%it)n;6PnQ^qsBN?X78+XPv{t z9dhj*h~%RhePmvy~q6xkUuS-IYTzTwDj=)av36T zfHy3jDg~t>WFLUvl=flqkX0S8cN#u29!&ju<8yc`h|gl8##X~qUX|ohT z`?PDxrKi$%O(@N*VcmC5?L!2pD4(Ih>`_@&cmMFLEz^?+%$uaO<60EcVOXhnWwa}B z4tV=fZj7T^ATs$(GS8vk)M~4?8wQb}82N(zc7<;dWdI8tN%h-D=e7?Nyr4;GiaM;VUG9(kp%vXmHe3Z-?& z>oHjG^KVZP@m%AGaiAESSC&Vdb(G)u<26m66a>O5%sqN+vDHGRRQ3;GUidUNU#PgR zp~UP)J53|OaihaS7(Y9eL`%`*;jFDc7#8_0wx1Rwh3Bov=B4ma0mU%9`yRvBpg3u` z-RH(5oMle~5b7*38W3#8L`(a7Qb8sp&7&LBFn9>Z_1%=P&8&W0h-EA(`MhzQ=gES2 z=Pw^nl#+j-{vPw~+~fK8<+~CBd^GR1K>CoovO+g7{qbSr6SG-$OrUeA8Y}hOV43%7 zyI8jP$E}aro=ZQi0F22OX(Obbmjx?7=Vm&7Fgi_mzO=+ry!!4Vio84c>v~#>rpN+v z^bAETme@vmUpQdd;KImZ$hvZRvymn$E}i(%^M2c+#U@3I^5tz!%iQSE=|!!XXUda8 z2jxY{r8#sk3cTLa$g(8=aCt%2(Gnc4hMq{y(W9MrGrasnJHsXNoovuOSVgN!l7@s5 zdd`vi@{Gc@ySs{>>Tzciy>wvaHIUx4)yiXDM$7DdLFw(#^8Ifqpa*|0Y0B0+Js0cg z(d{AwI?4jiv|Vh(yk=l$1?cz%sepG@FRGbE-KrmOx(f!69|0k3NCK4>1K{h`{p8p< zyt|h7z5DSmF-yrGj(-03s+?gl_Ei{}ikF=G z{i1Aw&AC3JUcf!{!K(>PLD}!!H}_!=x}>3y2QnIr_=@8l<Iq_dOc3=hLc9ngeG z+5m6a1PgG;^XF=7x*fKh*c-;YIlLw~4_+sQr$~IrxVhX$b%hAiNQxM(|UD|B5 zqHtR3S`Vw1OJ~w%+SX%nr5Xhhv93psJZ_}~^iuj92PXr=rGwlji7+mv+U~o3Eb3vz zeJCmS2}LuBK1Nr2p3Q}=H~kalSk5M$+D8wX=Vr`~{ju0QYU~v&^CF2k39%`jeLX7Z z#@&P`pS1@#Jb~DW=3!Bnkn^(FRScDeO(fF(2=rsQ@* zr6b9B*=3nVJ8TY+`hPB38IRk`v*i}t8*ttW!?M?yx);#UD4I1+_8Kg^2U>e zBFhS%%K;L{OPPhlevdH{6#!6DxR$4As4HCgY>Y;;c^Kru3Hp8QBV2@JoS0c1w=8>h zbL7!nt*`1IyW6m2zgOX#TUQ}E8G^8>Ur5O;gu6*oh-4Y8e^*RN1@}1LaA{s)>xDeT zGE8~n2k9LDS~1PC5)JUD)f$H4!WBn7`-8Bp(fXRKb$0}q1JPdvC-6z%sE^u(WsjVr zjgVyf=zg_)xFw*#f>mk?Mu}lAu=gmi`)sSxFFh7$pNLZyCXw*Tx&OqfLvnkm*0lrq zY>(U7f|Vn$^e$RT)UZJII$&O&egV?-B^u8Pr2&cZ#9};eK5PT|xVz8@)J&4x_9~bN=e2TC zsUkGRi+*eem*m*xIJstz>UXVG{GQLd9mRzNjQzO^cHVwp3t>Tp$f#43?lBPs{zGCm zHa0?QxWR~*DGwe!j3sU@?Y~=%!9>PVovwv@9a##qh0{qrOd9pY^b47r_c#%&72+e@ z&7z6)3->pVoZQUmO6lk4%be9BrO8op^$&~+lifFtJQtlkOJ-JQw{Fsgo;u1&L42-r z^&|sHulHRK<7k2rjF|QpZug1Q)i=NAPVK4q0@8a2DFH$#BE6T;3DOCWL~4Lg&J%rK^gZ{# z?pk-<59iC-9|XgbnR#aR%wJSD_Cc&-zMrADMwblfzlPp<&?$@xW|B|hWfLR$lv0B*zAH*;>)eMBBVo}lRKCkr zeA9jPg_lX$VPPWq?npdT+(KS{U%IED1UH!9xw)9-DOb6Gmyb?K)<}qH<#1J_p|hhy zi9Wqe5Vg8W29(9=t-+z88526r<0gOr)7RN~JE(uj?&|B?kNF$uBQtNSc**njNxTJ0 z=OKqTcM)i(HAnv}!^*|QICp=|S8Dg8)Kkzsea@e%9N-e9P*W zxRVhWdf}&!$`KHDA^mxSVsEQN&*lScbM{Qm2bsgfk2Twg4X%eMhO4OSJK;hHsr5(i z20bEFYGljdDo;o{k%iOLEQ>{g>$+xx6J3liM(0Fpise&}3HI@phEp0!=sQmVoz_!V z=dO7tZ)Ig=ZC&(P#vM^CTv{6qOx};sVjKVqSq6{{lH>i1kNN~9w1RdWyk9|H`ZNOL#hSRoxT0s4c3bMV*ip6 zGwH6~*9i&w@+~;{IkfILd&2HmaoRV#u`?^-a4wxAv4Z;+Zv{_r-NVx{0+UHRR!6g< zs;UZPj*3y~@!V)3nQ>cVdFnz|bzE>1?YJ3`zmlPGaony0?R$?94v<%YUvDbRF_^ghovw>m8xbkg`0F;yG)Y&%3aK z139mJYO-iIh$Xm4UK&~&!lM24iOg43WvP6%N`zU2F-sPlQLW>^Q`iAHptAgGm0^EH zHOV{4Q5&O>Y#XXjJ?V}*2eDNyhBx9$s1hrz*MF3aOxIf~>A3H!!Gv7r=uRYU!xfsq zoR#m%s>a3ltF#&Qy}b_aXiZEc3N=hm4GeE1f<_dTyE_U4yO#Dk!n6xKwYIXuxyBOd z&VO3x$JBO_9Q@dG2P!>lx-HxcH9O>qao<^t)>5*JHp<&0h8$MF_TkV%;E?Y zM6Vu9V-E*-s1B+X!j?171$x1RW$rD(u<{*=ZfoS73x-L6Ak8y-JQ7Fb)HP0m-Gve9 zEI$h`Aq#HUt3x4 z)&+-nx@o*R5Z!1TFm*+jrSGi42CI77T9?Y)O7hegm$caw3S-c`t~#f00{miN>Pr4x zGH2+D33q}1@n+oo=uB$=THNt>(Lk^IzT-y3T4#@_RSBX-`yj#28)Ub#d}8gbT_raZ z8W`qnd33LQl1AZhcw;uLV@oqY&wCS6A84a%%Y9(u_9KxeE2^xTJyDX<=&RES8zP~v zTcezkHF0U#%f1~e;wM=RncC@(g+`WrW>46e7zo_$TGnohL-Qjz>?%iT=&B>F=@Qu< z9Qehe1>uXG4%j^ETmLyA;uo#YCy7R*d4HZ9{wSMyU`g?rcTyF!Bz!z)G=rOMzsWz& zNo7SA&%@}tngl67Zz>v?a?mu-maL2|gokH3M*5CGlD&*){P}X03`d$xBG6+e^Hf5f z)nZ9)(n9AJJHmH3Q73^^@>eLGzF3lvTern;Y-x6s>*vWFKMUQGy8HKN3KfBg%u%F) z&P+A{$<)4?yG-8L3QtIlXK)?zG&LL&?XxmCUcVH|wH*lLY7sSMN^W zwF*u}2DByW-87AxOwV+@ohCw`>`BtoaEx&APBQWQu}I~OHTk6M1ZtZRmb0<^Ozx-oW+R$^$_+)!L$>BDgtc6dL4$p3=63WwBE6+C9AY zvFKH~sdBt5?aDpW1!FOr@ z?+3^LNfyzRu9DitQgXM|114Q$Hn_!5G{})d1&ACKp_B@J zx$fmizm) z&;Ik;QAB}rcL z@hyv{H{5u87&BkxeOj)L%=hu_XMVN0FaCQjV%K&NQ^4B$h|(QZzI<|9t0?x@gviKR z`bhP#=RM8d&0DzqYx+FWelL}F!Y<+g{wpRA9}r$Md8m^yKo4|L`Xnk%FkB=-OR_%(^6P566#2h_b9eMDw+q7IFL+Z)x z{iL{rU(=QT&xT;i1=2_Z4Aoe1^;s%4kV+T`3>$o>8dyM88DRt8`K2m7ati)@$I?&Q z5(gxcspBd5#Wc+K{$ZMLZ!jiVO3;)u1S&w1BjgAM`%yFtZpji{#4iQ zv+$F<(C==4FPO~aS946>uW`r9h?s={De3f@*Y0WsY)=5&7Dz6$%_vy(k`Y+zF00$W zS@GFFZ>&9n5`+O~3gd810UTKX^kRqnhvj}hab*aLgTsbZA`0u;5Q4}fu>$#I-96Z3+*Ed5l{6C!=)G+ij6t@oYX`VNQ zO#Vmx`$Q7J`>uBwERW8q-W<`>T}#UIY1lU?*JmbkT->!@qQtMQsBNHp$ zgB%+{U1|d^KUi(I7Rkx3YGo#h%G7VDk$>Q--yJuAt|HIG4ETyLv;5sKyMDmk{`)Dt zuDj!A@Wqi4^)lnZ4o&8GRG7Icvy9v&J)0d}ecHo7FX0n#m~oe`K2Ejr!4tQ`Kpg*n zuDGQFpR=H-K|acK#?4X$ z-FMfktS9{=dpnK})whhCYgn`%%{7UUE?yS9td8Tld>ub!*^Ek1NbsAc<8Q6y5 z)|K;yhPzt;&he`MoC=z9y06-O$2q*2-KNhCI{EsGgU#xD^&Ot?1`G~RLD9?%Uti6U zp?bULe-DFQ{`q;Z4(n($k#Hfa@WyxI)lYnQL$yu#1HQ*sKVq_Rl;(C<25L{Beg3;1 z$5rngw%P@enrpsoSlDbzg|FvOvhW_*uMc$KScu#4c3U4FK0+J@Tyn03cVr5U{rrKj z>g=8vU;z;do_su#OOw)G=_;;YPEH(!wh0D0beQe(geq``b}P|n>F=TIn^*HuE}l-| z6^wR!8&s59o|uN|@_O?MyTOy=XSihHTVxGs2M<><$6By$&maBs;UTh4Sta#07}Tg5 zw3VtJ*KeDQ@D_OZpI2l&Ig?a~{8F}GlwVNL7TZRy$c$Xqh^nzY_?G;B(4MJcX*FE< z?aWVV9HIV)!7&#E_GeB$osNm)xRX2P8IJ-~9~X;5Prl;zA}%kPO)iOD_Xf|T+4C2l z_+7$G7^hSe>1=l0EfL-y^972|qYm7UA!{S#ZAAm_keQ>bg?cJ-5zUPq~JTS#ptxFR!vwMXmDT*-ZU^+^HYF%Dhqwa9k zU8n*2dJBwm8byHv6ZAbc<1RtxMM;5maL1svpzP{14jRpuaD;hVGVv}5Cul-1()$FN zB3yDkK7$Q40%4qr9opwp76%b0wa0B+EEnu1k&L^N=jH-qPn}bM>TOXtWX12O&zarqr*Z~gp8 z^CjBY-3F(M`C4rc(YIEXExs=P^aTa#5`94w-dl>sh68>WC!O-ioV)c2ppB7``{Yt> zxDtiW!JXbqI_s;3<^5!)xXP8Q*Mn9cKk}HgW%NF2)Rf3U9gX6>5vN4kt}SBr2K)us zSNB7*94}tHsOPz(R#tsLrtbl9T($J>idI7|WZo^Cm7*Tms}t|U`tHWIFBCx!&nThp zy*lp(r7H=pbh+TKz-Ya7;J+l9b#!edm-ObsIWU z*ivlSo_y8-P7j>ROf4(rCIBT%5peyw@xqFp;dEHQFYNL{lKr=&+n2)l(d};d8%-Y= zSzhB_%={2vxWMKIO>on$-zB0Tlfq^;UG}(ku9Gg|WBV0^yKotT<>=yl6k^p4xwbm} zn6JOWdu9kjgqKcEDR=W;KcCz7$_<{WRC)WD7%;F$;d^&__rSg2a{Z#WLbm83KE@M% zg`=MoFj%46(V{l1z6NS*Vn-{@1wOsosN2-wp3V24`{&^%X}?lnV_trK0&7M_tILzs zhxlt`E8#Aa0_aez(}24;n5%oa0w(BX12f-XB zO*84)_O*#xVmEA{?6&pUvn@+v^Xb9}a`ODjO;JgiC{5XmFy|?Smda7xN?7*SOl%7k zM)+AR2L&%U-Cdzl;UMel=l?L4s+Q6xz#VllP1cX5HOuh{pThD=k4-rLWSr+2rR+wg z60VlT3)o&9Wi`S~owaJ*W%`^u`P8#FOO|7}mNgH{R&mCo7TAqWQn8LD2x3)3rh;pB_DQ`M}ZYbSD;_b2=QH$LEd*L!`~wM0u>J1d|J+)Jz=5V2L}=)vQOD&R4J zW;mU=U@2~IMcYiBK)b8}6UfM_Cy&t29&*XiHf?OfTY=%j>vkJN&V3v5E~@E%V2dI6H-A5wc1mimml0S;^oDzClQ zPOc1te0(=Shr{9CuDM22%&Lz^jt-)5t$i|Fu2Dv~-J^PbZr0btYrNar892fK+Gxwe z7V2==TgFdcN`Z@yE}X)g_#^G~-nO@JKghXi_8DzZ(sufgUQl%>fw-E4#|N)DI^{Z4m67F0?Cw84iW@tLoYx0 zC2aZkCrq<`tPr{d$UDzaL0br^Q#fR)AHwMc@yx*{1FgoYU7Xy7+CNk2@JOCsw|3k4w@2;(c z^w?(Aat{8-#H(3$l{NJlJ3D)oEa*RGgf88t3t*sVI&kE`S65dx^juBEvm7JKW;LJC zez#-(&p~C^(XUygeukjEb!|r);?3yE*1+io7&a2+ zbC?(z2hBN^XPlqhetr2WLDvUW6REp#s-99YpH*X|?k4)=gEuZ})by_3Ot>5Stvget%)l_!v3l9K0yW*=p)s^kN}x!Px!Pq| zwzA`vCrVCA3J4Yd5L1XmQsV^z_L$MN7@H%nhIXpN9@-tt0x?BdjaF6VHOuPJn#HQS zaqaQ1Xa(P{@B4}=+`t0sa6!bD41$gKECbdDf)CrPelrqAiU?^mK}bryM1obumHyDjP_H_)F)_9k);K4 z_Bw%*Br<~9=1-Z(pyiiQq0?4Ga$upd|j- z2dno8HtCY&$wMVzdQ_njr@Ol`IPETATY9qdS_T5-fM4xP2FK-PRvngm7nJi}Sdy*P z85ECVO(OUttQj2?*aP@GdaM$jgM#l zYDtsh_b}oq{`ZCeBdX7$SjJsV=Kr)4fR+O69A5@kL){YoSpJ#rQv+v0=fd7*4s$_y zp#tO!VZ)wMg$ncVVsb<7r;}=MCH8RPT-jHP9YT%$d=4mliJkBgb@RY6+ELJNV>{Zx z*)~tN*1W@@MEJ|?xc4%f&#xr)XwQA3Qp;_lk~U*{4UTquqxI-^Q*wQ&@;7zYMK$u^ zipOs^iy)KV{>%&0Ex-t<8Q;yLXIj$h)@LHFPbq)6W~DpB7kTGeY3puB*Y!c{$aXN{ zig}SqVwE*3M30oaW%hP@ouMu*!h7|I+PZ0DmQV(Ha8Swp=v&UrHsr`tH89BR7Ygj7Cv83scXTm$omEixO1Z?)Pw=WJ#)U-kfu!qH=&V~y@(rKs@%s5$VQXIbCB@Twwf zZImwtEUz%1*j76~kCBlCg~Q^fHp^JD+-8e(m)8%?+1G?PwP4TV$La4XWM>OU4&)x+ zRiK;i*p7xexn;<^&-TXe@_`}-S9Ga`70Txs=-5xLe3no!9TC$ZlVDTjpiJ4+luXWM z&=B<`yiSec^cygjHJxc@Znzjl+d;*BdUd8PV~AY)js{f!rs@(U?BgR-|&(5p2*(M5IwMGqSaq$4Th$7Jg~%QxfFXz)=dKa5aQg*NR>m|P0$2JBBy^nq)XkE6RLz}b zK07ajs4B($Fqh8lb!buk>p1Y80nc?8y7y+|IW9vx+MWKFQ(V`ISSOcI8BvZ>%6=@E z25&b5Wf5sBhRKSe;;C$M-3X~bXc!gW07Vj4SDI7w=%_7YnMIq|Esl-j*w)tAcmTkpO&W}WMW+62b$-5pmB-!DTt|ReL~5m(}CCV=ytc^zqWvuH@LdS^0L=m0pPF~ z%Y`*_!DP5Sj)TE2A!ln?!nFtm5z096jLMi%efJ%SzHWtxR`nq}_>wYUMG0=pic(;3 z&8P(O`*;b(vAWAO$0XuAWYxdA&p{@*=B%S4oWqoceKWyzz#KB56+DWnc9RSc?7G;> zwZlIQ?)?B(2-iO@-iVEnx48l89MN3B_@Pjlcv$Oix_1dUbqQ$g*Hz8ZZX-YGGoOWQ zX=`XN=+deLhHvMIEdi`~($ba`r_I^2HZ?QBw+D|Ha0zbkh<{GF{K81#xFlIJVd0^| zewA7{!kB5)%Ee}5-6LnYl-`_MJ7Uw*&d%UK)WY>$TA_9vF7n6>0h}J;IY3?|hsmlN zlo|bTMJ1p~M=dF7QqM%5I~{%U6$Klx?1)=dAz3@4Zy1KG1j#K0lIRZT&_ht?q|dG? zMzS$$jC0eWf#EKandz;AH*RQq+)J}B)Yfp`HHUzB!|K6XOYqhpy41?TaR;>|4cnrz zuVt7@qNAZ38PrLKpulZGpoS!FjBjUZr*}t#Q8j81;)O@57&Ez3uHW zV|L7KhUqGI5I|I*HZ>*8&=c*Y4Ix+Wou;ubB5ht!2KV>+#fr*LH3sN{34H zwH_oK+l%eczqzZ%?dp?Ej5^mWS|Zb>4Td<`Y{#wzKni6i;e6;fT* zYX7bTLDyN}=4rgJ7}Lv!_)*`QeR%W3(N{H{x};IiBC_no(n5rzz92itD`hj4nTGJS zl$tJe)(U<$rh9?7==4^&G$;KSx%v>FLkIP;_Y!lFLK{MWoZ%-p?7N|I&QdU8Tg%xO zef2m*d_=UgTP_MFfeYpD-1#=QqbYxBalc@W0#pBVfq`KJn}noH>|;bY9vbV9FBzt} z@L8vO8*+%H@M3qnadnESJa&gktu{N~a^?l;2$R4%4NVOGqieUOr8T>hD)sLFF!_-o zMiticBPJ}Ff3tXJq9C970M2D4zn??S-@d3SNwVpZOrCg+iEnJ`?Gr;XG{sf6mEgsX z)~I5I!n@ZN9crU7M@iI3AXGLeii+~e{lKGg{VS3^ZYGqK#xC>F9Gs+SPGoX`(WS~8 zqqg9yxZ0h9K1yT)Y4j@p@e(d+)sb9-r(@g2g|5rfO{vZ_v~25J`4WS65hu|R1x42? zJ_hwS(VOE17r@G@j|uk&uW@@SEEHGmTNTJlZlz0S3|AlNICq@olBo$@>l0M_-;Hn@Z5Xy z$9EK`Thh|wUA}Bcx#KsLJ4DyNXPHTwOPGDHsD*V7OCI++Mx~QC6{GFcLgjd;SqBi* zUsI%?F#F40wyo)#!;to@7=JrRQ?mZ@8n)oMXX?@F?XDT+_e&O-z|5XWIO$EaOs+V{|gIRrK_@ zY^=kJ?J;r%Pswr$Luik8uz;-d_?}<+R2nO(&7pEjC^6<)LX0h~XXSxo>PZacBtkiq zJ$~1#)&Wz5lt1~|kvz+j_&(W6CV25-l2U_JfW(K8&n4TLFJ3UlAH7~7W&}Iq=N?!L({8~5_z69iya9H3i|qZKm4rYEcNNG$opZS`4%P0`+$3v>V(sH#n=B6TE<3n zk+Q@x^39t3A1Rpm9$wk}8enuX0lGa#&k8|-yPk)Sn4Y+VF*`qO%`MnnHD!wSSP0sh zb3{Nr-CUWeU{!V9k3FZWTXsU5+UNV6P71Z}RNK+hFFf_pVGUflfBU0?5kt|Wy1q>! z`+*#YOiq(oqD-}d8|fn6J!6MU;|b)kEnmtGOW-h+o807^P@-WTlC(=j&{=* zbL@&4pH)`gxTd76#|pVIpR{~%swNTKBf^Wi{P_cyWFR`4VFH_d*5TDGJT?{6S|$^UhRl%m_(vH-2aA&$NgnHmiRr20 ze&?iS`>z>E<;^cBvb#SrYgyvjB&BcKoku-?%9b3eVXbub4pLD;#vOoq(vvB)Mj;0e z6y7ip%g~IwZucxTtz)xPo@L9V3$_u}dx+ZFSIg8DXvEY$;LcEAd2?5roCB!5%|Q~8 zElQ&s1aXsJDI$y;)z;HmW%!D$1Rz0UBcEJxJyA{jL=Bmx<4X~}5iNa5QD!Z-d({d; ztgSn~!aGZpwsl6O-SB~ZzbTdgf9mEE9roGg?HSfckoG{P7xp@y8O=s?a}qCnfKrqb z1{0&NlU$3sNoze2m`2w!bw0i1L3DleBFAWki@URyzg+^RUbb#Ojo$odT6ZJ(YDVdv zrL=bVj`97#m-_Y2My_QQ?0ZV(pXqG($rg!RW;R9y;qxbw*Fc%Q{wiaYua$5wLlOY;T2`Syf_~W zP2wp|-od=wY}t~I{BDjoVp#hQEu5)^%;mVmdANSe(%E-ijzLgOX>W9EFde76>Exk( zdEDX5A6m_CU9c_962Gr4p;#mUZ&R=F6f65WJn3bFcy`|+K;X-#%S43oFPF^) zEQ=p6KR!;*J)G8lWi%vPSCDJC)tcZCE+&k!^&hCoHl2@sPhmwdKicZXxiXLT@+(V*q!E#p_xQp%hG7AZ6{&h&G$X z%WH$-gVJXRGtKr4RM~UgwJKo`+YXda^CDLmEG`}dkK`WW5)!Lvu^XaOpB4nY9(qqv zfM(S=*2*HLBl`G_#8%j?PQT`TSVDo#RHcb^{1AWwV(E?S481XmnfMVsM6!W4qH^x@ zzMNpLDrGw6!IjlI;G`wF=qzPBLW zc|IM!#weYXoX|rqkYQE=XbD!*F)d9^XUas4gGUOB=$%|gLZP?6t&FqpNIxO&^cK*z zh>zSM>p-6GOIB_*9gKtPm)U@cw7L>lG;HlUKc>a1Y#l7FqEz1-ZH^S`)0|N5RJmNo z<1~H~bFs-!3#TM`YtEXoZ{IIgJ5}4Rds*}Aoz;2_%Y>R?dI+D4iHthe9 zY9R2DnTTS$XnU0I=%+{ODeeuk`JtfD#YEKb^lf#mX0n-dNyA3%Ah~2`HW7rzMV-ua z+$i;g-!|UMEh$U00OldtQBOg$@wV0cL67~54B>s0IpwU#kD5xLOtyK5%_PsU9jbXF zq~9`x+B=VM~@{L}sXcPMK=F7l*r znpKMjg9~;XEER51dWk?iM=&VK@X8Z@^6;9H@vjrPY~yun**(a&0(sBKBqKo`Xd*Ib z&QbXTTVea!!+a;g&divL3ka??iW`Qrs-VScO7om z5QRN^yYv<}7IS$!|5^5Ueo1YO)`!_Dh`#XsXjX9Fh7m;=h0w>UT+_B4E@BtNiPAjM zPNG{ZyWvQuuCCL(to=2Ww?f}HGqzK6S0iWabCKm>reeTMsUWn!pebSo6#pHRMi#pu zTqSi16Reyu#mO>FBX@v9GOk`^MnQhkt5oUWTw24DQOjZuZeiB?te^gLiTC!rIDb+` zQ^M?bra-sj;a6^Ugit^aSev=@vB7D&eTf?R1)N<%cPQ*NwAIz9+0^dsmCaKz=?GD< z9S*jCl>D6uvwMit?lRL1m#sd6jUHxkky{nijoACav(o*Na>x~&BuNr{K0q39Ri<6B zS|#EI@WkjcmANCj8R6RnwXR)}=fMkh?ST#68MZ@JAlLI0MFY8nKOzZtI8%5L-0Vi{ z^urD-MJw4XiCw6PvK!(c(Ae(4z!0FNa?o_?>~*K{JYMB`;7J+7WWT#GFa(=_Cmnwr zPDsJCKBj7_WjK2GWUA};EP4&i2Gu<(jBCJe8sjtvT*WU7?nbSm;ClAp7VkB`Xx zf#w=);GGQZOmSU1KbwhUt^wY^_Qu8lBukaew3e=}u9{kwyeE8S=42%!JZu^YR9>E# zm>?3``=QZr5L2zWgY}qKAr|to;Y^HKQ0BNN6NbsM^qh5X0HQ(Fua{_0>ULrJ6gU(F zfjVLjw999`*?jINPsNgVIX%W3N*+-+<|Z<28D?ncHxaRr#omw}`nrB$TfhlfR6-f&i@S%|r|DYxMVtE{b-H_t~w!0`Ews}Aaw zWvO>8U$3Z)!bjf!ruNWpS68Nhz%Vs6wZU(A*RN~KxRAngAC8^!+;SVO zzLrQ>Sr0pjk4q4Z+Fi(>bR4z5A+#01)zO$2m*RC`;Nmb684)JNc4&FB5!9?`K0RsM zfQ@x4dFB3EH+R2<&fB$=|70F;tN47I%Y9Rw-^sfvM*H^Q1wZOkGW2;c5d6-*`36re z@{0!GNeZG%1`dcwRmPnH{UgSkpPK27jFw*tOEYCbU({=sOz}td)-={{A%wjQurEP$ z_dkjoc2s~vQE({Qbp?HJMV!gj?PnKOwted5HhKq2bvO^Z0l-AC9;kv0nk>(JT{Ct4 z=4pM`pQbZ=es~`-#9C>P519!zugruwWBv3I^GvDB_Z!9A+382-W(^Iq%3Y_WKhi{n z5mr#SZ=qs8{X72zB4Ky>FN0RQ)k_#@r{Mzw8}qleG<;b{+)NHfD?ZUFJ$Is_OQP;3|?l#uN0 z(STcX&lmstU4w;8dofZ2g@cGg{&935XQGAOwOYlVi1u#oF?K~S zbM$+>eUe1I(XcU9qI@@KWF(AokgqZ8;nRL85wo(F|8+&s7y9(pd*Z%33~U^)shGZd z`Cf}$-zup>*>+e?OGP6?UJmZL5EFLAe8 zL(OBz(}m}4me&@z+k39volf3sn2(g=^7l?)*ZE$AR9_anM0L`VX19yG-Bi}1ICR{W zxSKc)uiSA;T(ul^n>K~@CwM~9?hiNp+7Oqo5OnE)C@BSY1^iZY1pXh6rgk%tw&g9) zrDrMjP|2@MfE-68xZPjkwNnrlMp$+|hHJPB`QVo2VGfnR5Ma#@vuU`=iY!QPWdzao zI%Gj6#pyXg6LNvxA`BLgMBF(?7=4+D)%@CETpeU}vVJoFWm7~Ct!p}J_4Oer{bI~< zKU7qURGZIkh2boSM4>k1tVr@pc!FX+@99BYYPevXd?!hsC$<-f!3cXF*Ht_`qA!X@ z-|qV4wV-t{Ntf+d=foBDzR$u^shQhk(q>z(T1?x!ui5*sNEkQ5Bix`XC+}$|&0sMN zK8o25!jWsl0Uyh+QWUuAYMuG&X6UY z>Tolx#~0$wYIh582kJ_kd8jaKX?>q4;nefO?hV8v=-9X1wFE79(4}|)Q4c4xRL9S? zZc0l?*2*x89s7W^rFY;d#gycq+hM3=T=Awn<9&Br3-(g9yUV)gkAtrf-->GmPtdzN zZu@)|79PTU%A1uEe6KUGsN+H19YjQ=mdi9sf1*6A)@#%nf?-s-R?EF!Si<610yDvk z5e5KIl<7E<4w(-0t_dIGtS${hAS&0tBYS=}ah**IMfp+?AxaHs14^9ZP0juI4?SH*AWa$HjrG7}-|CZ*M3( zM=lZ`&G8hi8qQy1Luo>DCUWCk_MYyqxFLU7LcHpBvPj4-_$&gV#pfPVzov&QvbAf6 zCx_Q&8jda{wJ@+#<*lTGk>`EtBJ;V@RP9f#UIs1glb1npso?n`Vb^*Kk$v83#G9&4 zlf7dq z;o1gjK`mym`OFw$Ohy+V=yLSC8O#vvQd|YLjl2LQNvFS$%B6w(XlwLg+(~pW;nnVV zAVc=Y)&+GDF90?GiqHFxSC*zgnnJqLnQ7h~r7aZl-+2tW`626q&xI|w zMTS)XlhRHMod!-m;-DAIu~}a1F~h|NJTp&AiitnV6&4`zlQ+mGg2+4PC*`C?|H9)` zD=vHp@GD?02&8mtM>$_JabQY256+wvdH55!V|inwuK>`Hx=Y~9eB~lK>WFsmU89a3 zeHZ-bHD^dMm2HXlWGfSsMyH8ixD?}dxf z!?+p_;3XF?#aCPqd9KJGi3e^F=j9Ir_zUqOxFs<95srvhzqD|@k(KL9YUFs70&Ns< zLQU<@9Hxj-)juS-Ly!ljgPQ{Q3w*ucf2r^ZKD;bz2w7Y`7mVlNuI1h&cR()K=jHPG z7J?@A!Y^dmap^gxEkri}`E@t89F zS@rKkC%{zr;6p^1Wt1VE9MgsDBwGg8eVT_crya(m;gz`c(EM=Fh7WlD8yqi}f%kvA@NA%-o(trAG+|0S3)d~g>K+j*7kEaKVQYz*E@fUbWj6{bO56cA< zK=IkZNx>yeZ+eDUJxZb*sim5CSHFUM62YfxG6BI4WlnBUUPwhtJ2wai`7~!D>emO+0g<8!y%t*h6fw8dTL2)ZZJ^+Nj279yzqFPgeDq-FrM@ zzwlD>jTF#Ls+70E8}3AqjW$rOlH^q8ARtixkSUt9Ep1q-l{IO{tK%a^4v5G(`T3S_ zTmf}ihQCX#hYRYWVFojUyd>mA&0x22=Q6BO1{FKD0^P0};87ecU`Yc4$13%v4e z5n*98f}B3zOgQ2n5C&F!lFuB1ti{OnxsJTqWVXR8SWAD4IEn*LqeH%Bd>H*XY&d|?DO0*jIVXR(lJTlk8c?9aX-(Z}7GMDi?OwmC zxOxbtKY%LKL}Lc#;!>nbT3}mKFze?T810&E*we7Tf%T%^d<69J$$K#6CV;JD0m?IOjAPgqS^BPwFOL?P%`magd&O$SL_qbY8u_3k}MV}Myi$*V&SMp z0f-nm%JM0eS(1{!`4!bQpD8jNvFP7e&unU^oct|qDT+d6o&x&o0UYnbKxt}LRt0WM zM=M~E`17As!sNBJW2_bOwly~?2FYgRu!8+RZX4pGR@UP*LiD#*F0E0Gx$Ewm`_NLX zy~XV7*Y)2?sL&{aqDT6ss+wIM?W9Ko6(SSQBJaza9*9BEC+KHsf+-C}ucy+qi3I8~ zH%=Bjt5t^z>A3!-XDa+^az(`L0mOuS>*J2HNd0{mp8b1!U#fus8^IgI zM7l>CmoSrjv+d~)eWUemeZOoJd9cGjR)2pcB<(EM8!LW8v#n;+etN8?EBdQIq)JB)kuzP^M{Tbi!IT*of^{1XnX23ZIM2wEVJ1gt=to379hB%~)xxR$ z0WkZ!Y*XbeMQl*?Gbn)Khfo;Sd+@ttL5T#nx@AI-Ge>lA8@OWwjd(rK<_?b4y)%lSIW5KX5eb6K)P2S3w#qJ@ndXA*xSZf zkqSUX2<+LXAmF9A{Bz+AcZmsNgW;B3q}P#P(7pKvAb#~<>JA!i${#{z_NwP~aovvR z+KSM2CBN3f)jLw8-Llfim*3R%99dOc>o#I7UaW?$sa1YOYR(52cDFxC#3d^a@c>5XHYF*azNw#vrllB&k zaO6juX+vd8ag;#5ZijojtF>Pv9xoL*+s3hJens+x>wfOHOhv}G5rLT=rJ+Vc9*k?e z%6qx=bJ=3B;Ouv-oeeiT(Rxz|SRFlxa+@PF9#k zgvS2;=gUCYhN2kXJnUe#z^DswjdcP!*o2*enJjujc@Vr_M}R>w#dG&nndXDL8u~@# zM@>KU0OO)nj79Q`&0(ucrc@)e({3wwPyD$&ZDFIX(>5tLv$!fJ&IJyNzR6X}{t%q> zw#0s}HElH9X-XAMd=Q)dBwIeCiFc-okXrWe^!T-?1=FuC3!y}M?$y5PC$$1Bc)#EEG9H3PQp;<>OKUyO1 zm!hMidi!?p3a)dQ+N!H~+}*bMJC0erGveb^!J^}xxu5)UJh;`6Z?OI35^L$!i-#;` z2|(n3Lc&p51wpAXQ1e<-MDpL!13#B6m{S2spCdk`J?ij07>MwJmt85M4RC5zPZo4n zr(j#gn>|O_I{V;7dtrrz1 zq1utHIaG3}eZNUE57RVwqM(V>;An56jZ7N|aokcLr$ut)K+xU^)Z&437)Q?j!AcPr zocXl@)JjHWrb_@(c0tPPEXa^>JYi&HBtM@qXNa##B58aTf8UU+m~B+Twqc%u-<5w- zc^u}6MXY0KL>~vb5eglD6dSre8GSj7<$c1gFrs2+y|}ojWKvZFIM@gHIu;k~DGP#_gd^cBa%H%c+KTJwC^-pdUZ*DgfDp z4ZI;Ha0vUO{s2MS!DS&~?NQ%utX#i-J@?fEuGDhtNp9rs%0NbXX${^;;+B$7`V?2} zZeZ)j;U&L0+ys$$|0M{Yv!u7?G-nC8xd-Bj964BJ(U{pq>YCI@S+yW2`M%m>Yv0OY*KxfCUqbZ_+Tpzmlz0(Q+^xEe>fD7k;4u!At-yzdy zoGv?Q6ZSZ;la#&BV8)EQy=F0SLL@vjL+g-heL_U#d7v2R@LuZ(xO6GDsAf*)C9y6c zp;N@53JhIFOXgNNquFQqi&{kMxTefY=N@WQXw_J@8*}`{aCWzb!!#<1x!E|?3)JqE z;xG;R6#SC(QF?-#?bPWv_jd&jMf_wa{g*Z*ce{p!vW>N ziaN{`MdPTi^fJ$qGl3}VaM{LtfHlp1{Fh_@aQ5RAY5C&7S+VmRgX zix>Vp^J9+p0bxYL|6=Pcz@q%R^joe9w8$>-o;NuZs&VCZ1>Sy`HsK-0NP~#_<3A5BTdFcd%#|A)5sgQTs+1V~!ac~Q+VOOWuf*zcj`C8BL)3+%amG{}s>LX}J$7ab>dPX?Y zr6%tH2GYx(>UG-k9`#kQUgSaV&z~xgRtQsK2C}Z(KtpfGRUnK^IpF zs!NJ2#H_A0*Pe-YZID;A*66*jzF)UqlsZ`$%=SF?yF#SFhC{zgnp6c1-`R=G%Vd zlvyqlc;h)cYo1pof6s6BGDm%n4VGx%{W0pHU#9bU%q(xoK_PTaR zpkW%<`Zi3~3ltvC{*HT`1=t#0vM@JRO}m08o;B6rV8%UDId||E&-Kk2{0vIL+3LsI zP`Lk9_XOX-v`@nTpO>wVN8NU=I&^8gOGF%}Z#I29B*lnK{>&$QfWTNT+MM06s(6}? zv;I9~XeOJj@QvOS;hfr1!JupajKL3Kz}?-*xf9T`CT%xW+MVf{cy<@3)ceTs#zxqZ zu#3ZT6WX+vIpac zSfg{Rx?0^p6M|$X9H5mcgRYz`pv|)hoQ2$ekPS$o4#N{Q-OR(9kPi4QXxI{K! zn2W|U$6XsB5%91(*jsFCi(kYXCo*@H@K5BC>)(d4NsrW*ut4vy2f6zxI~ho*npf5@ z&?|+bbX#DH-~t5i_MUXGub$rhp1{h)$E=#^)AU%>gEE+CD7LiE%1ys-2?Mi}lP9)iVz6#N>mS$_mW6 ztYxa83iYLo)6;HNc~Oi7TwKktllp5Jmc$v{A)K%BuHq$BQRPnuLZnfgx)5{ZtRC2b=>AF8Yco zQxWT4Ozgy&_2-m(wwRQ|y*(G30<-)2Ff8%FQi*<&@aTL}!!#vXKSynkCAV(al#vz2 z#ttNA`47KIexK?ZpLsJ`e?!%QV#|!to1yOwR?X>ys7JUBgC1x1SK4h(;>gqJ|3E`+hJ}c;*=y^CB_n z);8jt&q2@fq!j*``l`rU4dTT1f^XU}!_F9uIL)qaV&u=xo<>hilzB~!m!E8gm$2aC zTKVd8KHJ-G9rpOT-KS6d`}(*|k8&u*oot1v3df&Q?l>rG!Z{HM@p?mZ<0K_qq5?_PZRf>&Aa>;qk4i+ zZp66=1=Y^B>ReAo%|y^XbT1S9eQ8*sFr!%qa&!JM%#mEqW3W=q-B^2P*~_~{J+~#V z;=)b~pK5bk@C9G7W6n@op z$Ly06T$3WNX$kjiF!AWIsw5@o=%VoaoG6nQr$$+dPs61x{T+73A^EE%&`|LxMc|gq zHuK3=9_|?0(|6Rs(5!ABtl#P{(v+XU>|A1iy>nM()2fI%_TwqXd4BbPzS{_Aety(r z`nx=IG20r2eejgBQmcwWYaJV)D50yNe#ft6?bgeUWBM*7%$$jf2@?}O#>B0$0GWRb z${)oGVN{Ba-4b$N1?=a@4I%LI`lh4939^pT;F>T0XgD(loE(W07t->Y@tHjH+ zkEI$KQEz6xRcZkM@c)btC{;SIm!GeibwxRoNI`QbUJ504KZq|pA*=r7qqp`>S2?m*Tz+KoDx92HUXHsn3>SK)2td{M z^doTp$;ukg5u@`{Mop}tGQy#iGfT``YT^>6&mJ;mT4ZF;X}+R`Zmh0mRptB;3F#g1 z@4F*jMj9sKiP87AdHL%8{nfW73iMQSt7@qDQP?&IYpqfQTY6d7`ze><}9$2E)ctSv>VzqkkdXi1+ zU)*R8JOyU8qdMW;iDsRukxGS`3Wa}a{&ZNhO0cF47EI{@c^CyXpI44Ml#p;W;b(Z3 zoT8PPJJj`&9yNWL$=u~-%>10CsHCqfnOw*jx6{)cT_1ni7b)viVQpX2#h*`>b|@PC zk&^FLFzWHZ5EvyhLz;ClZ68>$gEm?oz%TtcBJI3?$8E7kcNr?0nEa&L>r1|ove(2s zE&mal*a@!?=j<&u+Gc&9S6t(0PF@=BJ3($t2K($86e}{PNKdKN7+bBW-DyNUvZ=ba zn6tB?cU2YC#vL=QU^}3jijEr?#b#(FdKqrGjPTegX>^*6bj@V5JWoK|PR_6~-1_;+ z09c_?ZFlpcqf)NTQtREx-IKIpEk6eay{PZW6jApd$1@f_Dpu6jR@9qojZ!aBK7;NSDUiCz&VQfWblVpdyvpFtq-DdJ0o5UZhfEUA3+)X1Jbx6gmU%t-6 zQjq@hsGNg)M!4%D<7n)ppTSR0D2($+cR`bI@RlV}Ov*rElh1^dQT3f(O7~FhJ?SU7 z7YQsJ1SBM-u7Vy^%Bq*c!@swf3ARBa0tUMJyS(;ngA;_KN#lDF_XcZfPoB^p@zDh> zs_~q*6u0dhL^YMqx{JQPWL9(tv>#AP@_6Uq=3NBw|72};q~Gw5Q(xzD+qH{X`>k|M z{aP(WomV+fYO4Lz@prs4Jyv6*$rSYYU3@;RK?@@4dX?_;rdp`Zieq9`o9g57I|OWj zYkV8Ny!>h(6T9OOsWoeozHtNkMl0+|gQf!Gb3VvivF_i3I+#B-j4$rjmUoMoDl$yE zU*twr=-|O*UOt76HxkrO-)aMleU+loAV2wX7R| zgnx3caQq%9yw4E|3XJSlXFH26xPKw>%APhL08!~yHK1=MDi%O&v*T}{3pD{!%8v0*%qN08^Rj!9i?U(hQwrtgZP3Fu!e&Trk`5D>e(6Msn z7oK`6PEm@Thl<4&aWODmWqr&lg)P^#>lPS2&I;lKd*;?dED8*_v69A#G9bi&@` z*CaN;-`yP=Tndl5r#^)P7PnGG`${>$eyk*f(vD$eN_L}2iG%AcQrWOEFP^T!rELuOMesT zq7gr|h$Y8ES&Jafp;3=dqrb9JS44M7%{9)XqEj|)4#W*e7+z#@3VPdr2 zG^v!Cs=tmOf2gjf%7<7Y))bvLaq%f=8Ywzs+UANOF(&|mF>LZF*Hk`t{h+lu^IU66 z`ZIQgM$R%_-3$V#yBG1xU4(1v%=;rL+S=W;ca>i= zJD`ejcFo*}mvLm)FfTR+vlGYqcWT@0KW$^B7PTi52D8tJe<`D}eB~^09jUPF;Y}TG zZvIyJzHzMY@8ysJ*)uOD^8#52@qGAfu#J&n%`BbBw>GMqbnDLBTA#bh=GRrr2S;Rn z4`B`!oY?Kcgnu*~9EeBOY6S}G`)l2L`4GS*d|)2^=(!dkc4TLK@cX`YX)Qn9D*og| znXx6gJ)50EMyjG{eF*K^{zJBj>92oIe2cayrFw)lKo_RHHyn*T~f0!X4Zd~erO+SGqmQi|v*-f&yHAEEJBnI3S(#umafcC7saOXlF;#7D86K{;p zzFzFj)8iawJfnMF7}QV417=K!kmuc3n@|2PyN@Nhh_7whpLac&u@>N9~!+ zfC1E6@q8IvZm)n`F7D%F^$Snm-c){wv%==K#+T{qQFi;9YVAeIHp_y!GtoZ*BU>jw zUN@$=l;5-qTHOzFJBu~dOeo)cXNqaQZ9Kse1U?&nnrmZfX}+q4BTj@`L>}dPlqd{_ z@k#~|uk$OO@?;`VBD9h%ib6o<9~LoQIvO2ePl6F1$=K!1vfd@kKy6gC0ustpX9x!tZiVHx%QJba!lHGPdf7s@2oj!X=fL;llT$=hD1LA#39 ziXNIu&5ajaUN!yz-_RX}#~F@xnPZJ%Reu63sufr78-3IzRVOd9Th~_4@3qGBzGz(Y zR~pT6Z_Djl`Ik)UH5e+TFSPr0crkJOdvuTQ@#ygD>S(v|m#;m?@p%w=R z?^@=&9SP-+kV=K0K~b~VLC>qgCVnAVtD>WM6WfF_4Lx1o>-WlLG(!DaY_FR01Y9#( zAAGk6*R3C@GJ>+gPUdV|OXuxabQ>p1cmjD>^jixVG+u-r!J$;J3Xh2kcs|TRtqiw^ zrB+7UkNRIb4#ZZ)`BG%GYq?r&WzUNb)V~(oX73@>$08!04~&q(vJ-2sf$o*g{(qjm9%3JlWOx3<8yY&h@!>)%m z>e2$dJwbm?;33Bh4cHj1@U#aKvx!Lj9@~`5zvC==VJfd|BaqvaStR_u-=*krsprDK zV*!P09k~P7fvwa$c*pPqvZ4PO76c z?E6gA+c#eSQh@E6r4dK3NqRwhIu%2lXTN8g7DtMzjt4DP9@HGbTDY0DTT>L+hFxB>z5De0{FpA)Zkm#L5YS|F6YfYFrBL}4>%zrVU=04&NKo4+${l4p9a!i_ z%v~NpC34Wef;TJ3o&R1mBR2NrA%iLfO20{vv$Vn9CW*edg_F1_v%uO(uW>bsy_YUL=75P7-`zGl+niAF?nEH z?VCGH?xB?gtD9xu>Ikql-$+wO(ER-&QyqX}dBUr{9^BlJuGIOwZ4m$;%64+W>Hr#@ zkz@9`Y+HA4&L{!`(W@ot>1|fbb_9pF;}8PWZ<(K zpr~rvW1Pki*`417BL{7cHApDv*GEt8`^grayawfbNU$F<S+ za5xfC7SGSOZzjTmV|xa58|6#*8FD3JPG8x6f#Il-aKXH*kGyH8Sv6JEclb@ z!0LL7_ZT&+D{gc)L;);gbSWCbi)ao_6*s9u-@^agG0sZ}5y>#(f@4b85c3`YO@3&P zm+cDiOU<{FD=y7rk^k$h-xwc0*xc-w1m-^auJkMd=fk`FK@WO%8BHPr!@suT(30jB z#`STZ7h@FwW}4HK$3UZ)%$*?d&6%mQF!fp;}6WmsXfitF;W z{=RC(D)6>9Ank|QroSn0`non>g2?hO{+g=^Y(OY0*UKBAL}mqm%vpcGwi;^GAGf&t zyx;kriLPwdC$s9mUo{E+^T{{B@+;6X;FyRWlPyhP3_wtcLWB(uC{ju<<%dO1io)vz zQki@#OoQu{+go_$_}0V!tjPy@zWonTfKWSe|Bm zS$+SEB*@e-K3@VWxq<9X{z@}_f1c(gF8xm=&IiE~UQ(9FuQV0azP4Gg#G>f9Xk$<$ z@o&M8$V?|}O7-B9CCvPrdF9CWl|BMAL_;=|i{963*_8FUghrbTw_ z1U>a;%gD|CuZYus%~MAX;9W*sAT{Q%j2X&e;y|I7Mz)$hQF*4~%x-B#MapD-GGMK*5Jx_ms0>V_T`za!7*K_U*o{tvQ zGcwVG_rj_0hz%#{2^Ngs@=mnb)$Q-zX~e06s`OkbEgG{$BRcW2l}{x9)tm3%JKm@D z_Aa=)oj)cjcefS0p65p(u`whZXgss$EWnSZB_s!3$5uY1z)>tQC}4lK475j| zq=o!(DgHe^tjV(CiI1%7e}3MXk~&B_=Jktu!axb}d<~U9w>#kmVuXgt*RH4Pdzgg= zAa~>;>X-SgusY;hoW4lK5*SY}scz|c{I9f z!a^x)T}h+^=e{wv593enzRjPqV=X8*9f>fXF{e?|WUVlymtH`#|+_S3ZnsQD&x(6F;n;InBvZHL@Yrvjf?`^Et5SZ!| zR)JQ7E%aH0J?@u=#_8CyR!5m(dcYNmE8ixg`^)lqOD6?uANX9w^#9&zxACF*glQWi zz4ZdGS*nz;*Iemw{@9GX%>cUmPz%AL(mb zJK!2)5YxH`(Ej~BY%vg%N)qsicq1|^r=$rW@ky522r zEaxr300&A87g@wRa~Rt>Kg2d*Lz>e0+SARa4{iz6F$)eaZk>0Cu`rV@_!!tkNb2~|8A%@f4-g-)O}bF~JM`!Ho147_-ipBSCFS= ziY`ew-y-BXm(glQ&(Hn<{)gIn;c^s0Ny=4dQ+~F086F;igr4~gVm&QhrmL=>%=LFH zG;`iKWYy>J-uncZogXDP7gT$u4B3|amIp4_x=T^1~&(YlV;`(Vo}c8 z6F%S;eUSvQliCL_TPY54Kw|(5q|?~T3wzRebMIZr8zyuRY89+6$(6D^@;9opVyEBr zS0aTPFprgE&3Y)%E2p)}KzCE{c^J#Xt5(XLq*nV9q`q~dM(S?n3Cpe2k2fdM#0=GB zzN0rot&a=x4ZXv>_MlCQ4UO(-pyHlV2EVotH`>CA;!cl&QGvfRIfd+oOsW~D$jJ31 z0sGBLT0ow=3Jx2YphR46zt5e>rG0ry23s0RAAX))tF0#!|NG`%yc4%B0SkF!yXs$P zS=V#DNC=}Cc350jDU<#+?w%|A(d!et+&gLQjpEv&ruqqOW=J>{HI|8IDe9MU(2s94 zvz4HgJjVv~gD+ha^tZR1SfPzh4d2vdZukyQ;||)!+?C(s)aQ~v*zDguQ_Z~^EFNWD z^;TNnIsa}v#3!2;1q5CGXPEf>IC`Por44y&_>~2fru&!@G6E=y66ca?Q$W{;cWIcS zv*;W~9otrR&F$5DqNK{|P%NL#kFHY9#ZpDRT;gCl=Vfs4!a=U=neDDCO+@?Nn}42B zL!?0*>ulH8*}azhx;0WgnvgA<-z(k_uU|VcGJVdulzHwIk8B^^SSn&T!lk|{7&{N~ zzvI3l8sa_p>+lhO`va)$Q>p&pcS4P4xm?^ke;cIs23FCqG<=XmhcN3}aTYd>@VAqFl#cFM`Nf{>6T9)n3eR3X5 z3_56aT|eI_NGV|yn4=J_I=I=yu83_R7A*AqpaCl&Y1@<$CTK%X)#VU(%;goF=GLkv zPn>J-Ey|c=8u?t_>!9*uE)T1cy)x&!V}@0`lf|Sn_5ZVzI5;MxKntWltF<-9!v2T~ zVjI=5QIvP+3xLEWDc^6%g@ASdiQYf)`of6T$22&lX|k5q)NU^d$Np#uk?4?k_u_$R z73O|4-TNn&?YL&tGREzkJF||Es?%;gXhq|;^I5GZ^M@w90{;s7=R_Vfz;PtlAS{g< zQBgXWfC!Y2cok@Rrl~^{i;vE(&mf?+Jv_w04I=Tu63pGZQyemB_?ed7v0a;)Elp%@ z3lz;0*;q1oiV{P|QXD+k&Z((Uj5iI@{my z(j0I1)_&9|p3idM^0?MGUCP<>Ak>VEP|nvitlU!WQDz|C@q-CnQn>L!wHE%*vRboQ zQL2Y-|^>@MTZcpAaMriVrK5mUH%yYct#?;wf zB~X<=T|4ugo5L2yry%p7=)*T5m5O;s-*65GGGnFdV~Pn&v z4VVq|v$`MMssXICglbB*O@hu-Tl@fA2nSKy?x|fPR%AhVn&gL3-hs@oZoLpKlHzjS z@C`HFzB~x#CNoX-u(aymu>eOeWBW;yv5HJaN39d=MuTR*@ur~vO&?G z$HwAi#dwE(8_nUW(|kg9yNGpLH(@ARZZU81}i_h9@Fjhv{&{eZ$C?R%8l# zr+y+sCY~Hj1h-PXKN90fyDPWwH)74iXH*A1>Erlw#x)5{4sus9xj%~s&(#T?x;qwB zNKB%p;uY&4AI$hf&}_Cq-Fmel8G1)h-JVN>>{ym&b{X~FYN<8*eq_OD(Ukn9EL~a% zCtsGiv0n{%?q-quX!gf{Q(~_M`5pruiT_#^;+`d!uh^5Db@#ha%pc1*p0qS?Zn>oO z8wIGGgOd?+dTi2ICo{Hd@mt1D2j^aikHFHTEv24gzAEH`_7iW(38RNNLnNUy$Nmc1_4#g$(TjUu& z`0KV3x#3K}vvG7Cbi)*H69sq{US#np+ruZ95}lC%M-5G{SvVf=zo2@KexyE^i1 zF7u=<6eK7>qEHwe_g8%cj=^)hH(9UZBa||6Dw=}FQY2!Q^y0Edv%G-QE$?X%N`o#= z*5W;F+#8$K7>|GZfR^Aa=zlqYf6b|mj_qYu+%q$(stFvOrPL4t!%&Ohwu;%TIJ6O{S_1u$3%$1SUlU}j`EygSP8YPUZQJJQ z0~{uAJ4<>^1GN+Szuu+ecJyRZ#%v=kU%xs3>sv6+3jtVaEDP(K|4+Dr==rd0*B2me zly}b^r58EKgp>7BmM~sJQT8ElZB2u}CB@yZttyNr* z_d~9@@^2H|r}Fy;px=nE05n1#ik=K}1RUF}tX}ht(#6u+7qS!a8oGbW@S*k6EvSYA z6L_7SH`kmQUCK)g%nOGMs#+W`H7aPmXy(THpUH^_V!9+{zFd4_G_KO#AJ;XUJRAr$ zDL+mq;G_`GumMZu7PkLnib+(D`KYoD6pIndzWS_NlF*XZO5__URWj1AA^=6v<#W=Q zVXBW4{)$cE%t+n?f98rB{27`AZ|NJz-_BQZ#jrxZ(tm1(>Aa5nYN-YUdjxX_%M0Hm zdsu}GE|2R=eK`y}Ne=`2zjS%_h%C~uu*z=Z&2Xw#?i)GdcSZV=qZk#Igx;s)|1n`I zMhzXrrRhCB<6jP?YEPtwl~muaLaEc>yu|)+hvVR zikh^ka;|Gr^9hE5gW5F9xP?Aj#RO{p|CLd@xc^gi)<7L^FeqcD2Y zVVfr3tDHjj?mTW%2p3A=Kh?k7!#c;anp%#bl5EPDMVkwMIs!$!)mT{GAfZ7)Ws~(|zM1~H^^KObYZyh*A&Jwh zNn_5a+6u34=^^grtPOyyZGvT$%&yc{#>wOE1*IKOV z&|P{{{d*;7BxXa^{`K4x`l;a6dL_AZ$g@9fGU1<}fqCA=lSi7_dUUT4FH~c({5RL; z38QCaXvj(V4YU47Rx0dX60%n@9*Mr`*@w|nVSCP61JpyGN;qS?)`zY%`lo7)uS@*4 z4cV} zNScY1O5>%B`Yf@qK>6`k9tt;NkSkh}PD12br3^$zwDwf5v39&H`hEj$h_rS}x}{U! zC(n`^!X(fmv-U+`#a@eCSw(kSeH#;8IDhbX^{a4H)Kuvk4ENIe!{3$ZPheRZfd|wB zCEJ~5jppGi%AQF!8^3e`^*M-cn!emYJPb%elocQ|ud;Qt4uw8N0sEl!x=M?cD6iiJ zn>bWEYw~-Dl5#(!<7ie3WOHnWJ2G<)8(P$54G^PDW5_z%`$C@4><+CSrT|=Cf4hx> z=WAs-ea_c8zcE9d!iJtlhF(VMbe$@)E1zzI(nJHNtjpO`v%jmL5T71zDnJgsfS!9p zbLihQwPI&UoT29>t>;xWqfRS^`^~?s(*8&UhpyiKdbA_!6s~g1mFFDRNIY8{1Kma% zssgx^)L9Hbzi%Z0nm$}?EX0j9-!>!!aDcS_>+BFFZRM*Rigu*0dw^!n+RtE_NCa5o zO3L~Sfj*Zo%V5jj-kzF~JVWfYQ6Z9nOpH;(I?6je+V~DYHyDC!=O}cKg~_u)U!my6 z+NlXj*hcTfQ&}|xEV9c-FxQ`N*UN19AJ|PLl^^vZDzsi*pD8ES!5cCuDO9Fp3hAIa ze@HK0^FQ24x`$&xMg(ZqF~K=UKHF@E>pQ>L1PH;dM&8Sr=*`FY_-Fj0N56;OQ_+Wn zbj-Be4@qi!QM#fWc&wRM{W9Zb&X-p80w#aUA_SlzdyB=yz(ns^2c7XbW6{F)_Wi)W8>$ z=MkSYdpA)m(t3sWF%V{@+!J)i_Ga@N`5g_%6pV?)R3Fn#?O>-rK_ri)w=3jZbC!PA zeU4sWxI%vExHl29yZ~;tkS4r|{*zae$e1rya9XgqFk4oOmo4Dl$Q}K3{5l_(wc_P} zx4Q`6jbe|g2h_Jrnhbf=6%#ZW?0eh2;|3to93eWj7FXN=_pDe-t@wuwJv+agJL*0Y ztG&9U-T$(9o;Cpam8_G&0QFzv#lN0GV^M{63hf$~DL3d2wD;9B;9*MSv>zz5pH##g zKFSO{f+wyWJrkXqHEf(T@_vf(9!C2vd(WA;1vb9%-9|biJ(~TJvz6SKx62IxQQ-Y? z$BBd$xnHERKR(NXbl41#qKQl89O+8}Z&RF&T-6*tT zxi))!N)-s>xYZrzK`2GDywJ1gutN$n&bjW*x-syxz3Ks2T>JRO(|1LnbIc{gDFaT# zw9lUyCujEARLOIqua@L@)#rg-43=z^yC!)LO7HDlzkX+#62lGZkd2h(6q(l8{`MVP zPqs%G4j*;=9k)Pl_BQV^+Bv%B-t(>KQ4AEa#CdQ10}xLtwecOGD2PwrjH$7&opZRU z&t1_MMPG|&35o8T8WXt;ORD+|6nd5>q9t|%_JjHL7|{BVKIox^yjjt?v5`}Ji*vK? zxuBmZ02IrdRWF_|&>K~+D z?;gNfCHp(3ZS$8=FsKR{eDURih}+w0sazxW6jdY_)4rAcW8Yli^!<1dwoNWT_Euw* za@i5R53?;_w_kVl{x(nL^~AIl%m&f&mao6c(?Sf?ukj(KuWRiWW`j?sWXa{yARGLz z_S0nwr!E_*^H%&{T6+E=BbOW-GnGv^Jm)4MQ` zixYXY3SZgHGN5q=gzUmOu)z>;-Bo1f)yd5bXQpG?3e9@q+7Q`LAR-X@l+PM7{UcTA z2J75%-o?tQxT2g}>v{tT_*HT_KK6UL_U8J?{1p|^?r;3)y{BzCGMK4Z-?0cf& z(`f8=>*badeL{g-wh&W2_C18oJ86kAuqW4?2Km~KsM+vbvxG_PupxF zx?{e0jeG%RZVGz(e>|WtJw9(T`(<&7mFCs${VG@&PkQ`=75biKZhzTjE*m{?J#rgf z<1m&uuy*RoZJOT>AZG;^37`fV`=#|wEd|qDT0E2|wLFy0n9Tf#()%;s6F`oSVJ2Yb zZ0zPXd2>xoz7(vwgMN3$sKuws>zJcT-!~cLHDLwoVVXc+sMZ46yGb>q?cDkV@}cvZ z_2^Pr_bWw_5#3AO0?|a3p-_Bsp`evYp2XrW_LDPz`e6ufHoEBtYjUvOIO0thwB|eH zMbuO-UC6yza!y>VN4B)g3N3Nf@bP7k8khtFVpc&{&2hdqm@ncVwblL-#G!ui9NN$7 zwL|XoZE^W&crlE3?fl%4q#CNU!^yPi6ZH}Sv_)UQr{-E@> z{@mI49J67kxT2lHQhs%a-V=H)u)r|bcylUdz-KxvHrAkgbw1RB_Uzy{A__m8i62ma;2+F>lYSEupy!aGF90? zK_iP|t=#FR_+&%f+nyRE9qhPh5G5IN8Rx>EW->V&)BDkeGKDgf*lqrD{grB&h1F4| z24#x0;To}R*}?qp7Z<6TPtsHy)G%PVhR4c*F93TYL5LmXQ-^o{NC_-WY~3IB`@6VC z9g8RMNMVy5sGn~0Y3p4?wKflXN4aQd2n64BM0H^e?0^;%NC72k;lx?+#QmhN8A7L% zuw!3AwU?g?7XvR#-Rc>XVtIM*Fz%acp2gfLJTX_6E~+}PNld?wC*|$(l6lA1Su!&B z66|u_dZahhZRiG;dJ^;K;?7c@24{lLF7l9F+ji~sK%KE$fbA8p{*QVsr^}(E*a3qKzGXZ)QbeogrrDG$I?Z&?aoW~47YQFg`hU8HEF2z zilz`tyevu1oojJAW(B}nWuJp7ixeVyazyRc5YzJf#vaX#eFa2lq{ryTQ6LQY>I;Ew zj9h2P%DY^CIbJm>BX+{rDOT-qznLB+e6nvM(D>|Uh04&6M&uIS!Q@<@s0WZ4op_LUvo6t^3Y_| zEP74^HXWm4Bbe`5c6nVZrZ2>GZ>-gSzvSk?`Y=y5^YZ$v_2@j!In`-#Am^g*iys;b z7!}5lQ)Ow^@~duRk&A>hd4=}sJ?@)>ZM66Ke&;fCFRTEWqq0R43H>ck_cY zEhB`)qk!XWpnpt?S7SdtpP-NXE;`VU4mx(ZCx*>5R{zouyIEGIzC031U{FU5;NK+S zLJsSD)?L5W!_G@CSS)FTi%xX{uIG#a+i(;Uupixeaf9$;{H2)gb^V(<(t93CNh3S8cKs<)a*BW)(-l5^-0~QP*iJXXrdsdA;Y{H>a`%2ieqc zK6=~OcemT-liu7%OSM?&CbIQaK9SG8>F*6;Gp=MeeUy3D$Ely{W3}!hHR{bXf?0F;yks+?9>If#TlaO$>&Sn~a)%{Zqb@UCb8QH_ zdLpN|DX+<}i9ZNV4*Iyb@G2uh>?s31Ti4cX?@^h%?2#Y~{W6q#$qi)POcQ-xezlpG zi!v6EsVNmOuPDjL`AswMZ7V!!;|K2g!&TJ1hX$uImL`=`8O8COy|Uj_s>cirCv(^g zSZXvg98$ns5x>WILTlI3-y8-l7Hzy>jo)dGh3%j=h2>TP$-)7G%p0h;|u9i_4Nn4LNhE03=b5jo?*^4x3d?w2gH5BSYqXrJi1 z&umge*Dr6v60b=r@pQXK^L1%7sSC>4CG-_h+~Fzk&BOI%&=1A7OO?d*ZioEp(tPWm z-1_y-5PIT~f>%)&D#f`*h{-nIt66l=l6s!E;+l+vi-C{c`tjgL70-ea}UKuYcY0ZIj~uQF4k~ zk`}qzXpsh&C5KUj(qv*m0lP&d-@*yhVNcBTGD+F!C>;7RbZy_Ub@93O#k%hmlYG5$ z6Y^kkqt1Zm%bg+T1(Gu#jN!fhdg;MYp?`eBBN)q8LkkKRzbNj3ex)@H(3sou?zQ-x zBSmtxR@Sy#ZwyrA(s8L4zekd;!Dr6DcNbnPYyUtuGqc+ONzSR+WH8q&^1mL!# zJL~ZH#IU~t#MpkGW?$}zWvnpl`5%g^`K(;f9@N$@o@p7s?O<&624BUVO%^_j)vAd6 zhQJ;5{b{{@yaSp$!>*@ZUX1O=w;~+nv1QHp9M3~5TivG^DsTRUmr;E=U=ZkNHGH%; z8`K8P`rKKFk&Q-RHG&Z#Ru>~N@kh2A-idhv~ifu3T zHdMN}ryePSRs0G|C$1fr$J<#n*_^ z_SkXi)j2YEPg2=~|u zJb!Vkb7~MZ_Q1zT-f*V=;k+Cjo?$`i6F-6#qHorO7M;(dVapc5BYXJ|=v6ETiHGp) z0O*ROlCWZ-TuFbwf4jBaw>RO+4077u?Btwlg(6CRbHPU^?58bkqJh#Ys5_AXbEBMw z95tG|Htk#rdc7uKH zn;Tb${9<+DG2loTWYYg8V>Y8*)wH;5x_I0r&uyUxFP&Ue{P}#sT)_7;n@%!0XFS6O z5&cG`Z4sMeL1Lm5_vJ^@wA|C-DTbO@Cw|=M2Wv&;{FX#^^lpNg(|5924oG$7)+4RU z1gO#rLp=GCpxW?sLUYVo)eQWdHfJA`Q7nyh6n?_nw>-Hy%~be)buYNlZER4!q3?eB z4Dl6braB@SS&OvmFV8(1^)UP?LE7_%#^{VLO(<DL~z^pI$2t{3Y?H5tC_IJFQfLJ_SeF(f5!4Z zZ@I)~aW*5=mbm-q@!t7HMp<_>^3x0}jC8j08y%R%qv%Gtc%StyzG#ZI(KxL9j02QG zlSsb=ZRB;lc?y-N!+|cT3fv^7HmHz&O!p=Zznq7bcrg{e*hZ^g( zUP3&2Tb_H0wK_twb?Hj$74$I}wUsnh_8?q5Yy3);TMFbE@3UjyXWdL}RL`czg_YgI zNv82O_z)r1lx!wPPVVP?OH9Pc1n(&MJXAM!`Y6P0_JtLg+uE|>coKXnvy1fku{F== z+shVdgJLsnlKH017Vy*Ltj|1C0q-t8an*=m=N@+7&6)B6westj{j={&;cIlG|Bt=5 z42rAUx<(0sBzS-jNC*;W+}$05y9IZ5cMb0DPJrOjxVu9Gjk`BaaEIG@&UfB7=TzN4 z_up4_*AJ>|)78D#>bb{Sb4(eV2E@O!IbBI6e{CBfyn;p_=#v5!C@u^xU7uwY6?MOt z!Wf55GHu`A@_zw|;BA(8-+0kQasS-8f2*UF&2Zg4XMxe!p=G6f^%aP$Y^4RDvfkbi zbSJ%bk^Yt6snr4jDr)tRx+G39#v z{$v~II3J=u^v#V6`jo+4GH0PlFLtS5xIjiBasF}2;?TJ}+~z^E#Lo`z1Cp9hU$I_NMO2|c4rMLY@CF_g=ZNmHpOb{8-*)}>3cwz$A%2?=ZjaxwhWymHT)A z_w27fbkpJdY*f1g?@yK_xxjqu48aZNS&O5;i(PsT^N*d@&#r3kHpq}aUK}lSfg|xj zxTIhc6^nHtnBu#=&Y5uFp%^gm#7p z{(0d63#D_|Rk6%k1FQ3o)5!vXj3=&F(P%blJdPgP4NGJgfdmCTAz%~HyzxJV_4-y^ zxN?faToP@Ti^9xa?`*j?PbACFlN;HuKIf+#8&gG4NP(A27E-Szwfw}&7Q-X?njJYt zfWzjlDfgLExDuDeEOjO=2au4138d|H`#Vtls_LQDS<%SN>+xL5OzQUtu|#@ysqHj@ zrThoY_=c_}hafw?Tja=i|VP4E<8HOZmBxP9zfDFFKWFGgIAg4}Xh8ye}A^U_sy zpYIdwYGKerS#9(L>@6qWre1S$9w#W!e#!tO_Sg7ioY=lz3qV-x)M8Q6?=O3!_;mXz zCE(!5()p90=8%#=QbuyoNj8ZJgN?n8=eMj7QeH`+0)`2zo_JFTExA|{YO#Ct*tjB` zs#i*Tz1U{_040l?Hh5tQlgG^gJQMe<^vx~6*?BsfOT#AB^MnQ_g&Ruj_I&YE0%v7~ z3U9;0XwC}Hfj%>ElKH0geR$_mR+?mCB(kGAS*+f@ zvU(CS+9!DF*-AHdz~f9xdtERPMQ~SNQoS2bHhYy}qeo~R{M^SkeU5Sk1a!8ePy(u?P)X3AGv{Xegje@2m!DD!4=f} zfs0hKOTh&#bt~PF($p`R!2IgO5h~2&7JH_JGwt7HSm9t}_46d4l~%wQdwkLb{Z}E; zrs2V3+~<-y2LECYGy--zdTrf0=Kp54vt&TDxtOa&~{ zP;%Oeryg0a?46xUNAxqXSHIp2pS2UTtY)-Dr;yH92;@OMS3(MF8V30Md#}!2rQcc?o zit&RXhGQ`BO(AwGyW|N=QYKrfX)}wNfWqpRc%vNPiWvh}s3wn#*{iVx-8lh%pc5t2QM zf~7u?#FT;^&K2N#!ShoDuEZ0&JEZI=qULzsL`Gy2mND2a6eEX79-wdqFmtcU4EvSF z-M2D;X6Uw=o0(L0KwGtb?+w-%X&xRig0f(Z%%EokiYS`O!a&$%-th{49AUz+VL$+u z&aNqWWrN4yLVn%Uj+(vJ29c=ka~1k;s0kgH>PI<4lW5$%w}ynSo{rHAXf@L)*s_;Y zC&y=h(m4ke$;e<-Df2m3nd|E%dRc|Whj3@@t*S_R93>g=7PTw>f zIf>kl;{Buwc1LSW5y&n<#~#%~0Lr@6NFiE#%x)QL+1w}D|QaG5w0 zTFO|`^0>aeE3T_KI-FEARCTLUgO+`I)$TyUsR$Aa#y7*za(3zTG1j;oIgnbrvCJC4 zU_o_9bMvjFQ=q)!FG)JhH2l^?diuj4jcKRfRbQ(R zJdTSwub|vfh3>xYHBuqeA6w~lh36i_j!=`xtk6xYAgoHxh?I`1oz4k&;m#$Zsbr_I z5nJNah|ufMXj~SV`WkQQF%!y9j@5vDUfYI^`gRkBv&B-lNTZ5$LenOnV%d}Zyp}m| zO>>od=w_ZhF{AhMJ)i#TQ}PtIW#P1pGD2;A%QBp2nTVMK!%>3h0haSA41^nw8mFLd zklxZ6A+mX{(N(n}e?u?(x&ouYv7v-|T_bJFxxlm<_mQdz%#QqLsYGYD3e7BK?xpLi zyGcH3@5PZ7SK{|f%8W}~JXz0DOpITd`t%yyf|kpP(QlM_0Gz>WWd}WQi$qcqQI!Z! zx9{rQGv~~Y>|I;qk@Itf!)}G^dR4f7Mh_Vu|2pgcLCl9j6i+suG-d9x^oUkSsOwJ`Cs{5`jor=TGXoZsxyUu9J|T zO>&`Z_dZ3dY`>o>J$*dhK1>ISU;20Sg{E7tGIxW5u-qB3=sGSrut$gnSI^HY2H4)H zsMro17JxJdP;6(M*2}SpGNX5|l3nKP(Kc0<&khhzV!Qe?qx)#?Crfc3aG78Hph|yw zUGL<(Sg~D72vmQ!z1_u(lb7psN@#n0@WFwldYT!>ySYA1x^p>lg=Db+kyI=j4MzIk zLF}Qtop1Qhmgl{$^L`lhuyBPmk&Kklp>mGMk?4cM2IO zGx_VzRigbg9*^9r>EZt2M4^Xeq)}ZVJsbMBSIupYrh!9UV+AeJ$^&Ss>OtBCR+XIS zwc)UpyX{+%@kjxB+DIA(cU?B9xXrII$*+#MX;xe-3h5StimF??2iqJ>i<%Bxol?#? zT5oHWLL2&YBYI)jdMFW8DP=7f&J(l}5U}5KA(fQ2B1>-|wUJNa-Xp32G||hFedrYru}I*J#qT*|`o_AUWUlAu zy!^maVE+ls12!OdOnFzp_zE`%6JvG?%p*ACCTQiYcixCwt@+D5Ch3huc&C;C5iD#@>#hj{y7 z6$@tidf)44VR}gX8jSSfmsr=|uecAoCI0f>sOtLpX*r>NnK7J+3R>e=v>+jfLz{@q zDN#`K^XJcBze4hYdXWq4KhkMSfiFWb$s{BtxwyEX$(F()bEnwnu9#X9WFJ2BWcf%+ zXKJ2&IVHi&5gLpdL)+)`*^h#C&M7^@!i5br4ry_QXjmPdQiKkZtJ;a&w5l^tMO3_& z^>){#6p}l>>oc$!bGwRqWY1G`1om0@~Xa^XG@%FI%Woi)UZ8??l(i``N?9HdL7qm8!VV}lQq|P<=jLC+CzG2+;459 z(J*h$uz{?+vV+M>_#UT+b8IHz!uMCvZ4J*l(8k(g)7eB>Zcg|uXv8{DnoC$f_NlA# zAYa2bl9)jSpGieV55>S?8t;*E`*GTY^5wp?Yum%SsCcugn5Z#ezZ6~2v6WS5LGSga z)B(o+(W;2*ApD*UpMdeRwBhz=O2f~`%qsYJUOG`aLuZKW>cgn0p9I<;OV>GXi<+^& zxmLfK+yx409J$md5SXUweiV@?lKsejnBFbjz_gr_Xt>HX%1c3@ZC^XERZhGtqT4*# z4>UT66U?ONEj3k60&UqjI!$31l?jt?(^|SyCz_z-e+&Gcc5r0YWN+0qY+?aYSW zTQZG^V8oz-F)ehed&QhZsYs98`iWTL-&{bP33VIk*!ahf!!u|0&Q!H+&6W{mTH1UQiw2==fIo`$sB+D3K_=$@ru~cMo+`Rj0PT>Eo}k#gu-< z%?p9|vkh;u|*8G%IL?$-(^t2;{6Gg?Y^^tUR zZvwZ-kWoE^>KHhxk{wxrGaEb3#c?Qb=bx#}$$X&b3&r1nOMJ7fqJc;)-+(?z&CyQ; zxwTWVm?%lT3V!-M_uF1YsLmZn>npUOEu4NGIsA?1RS*qW>{lKwVhcLNS;CMG)bEw) z#QCJl;)BXVAX?tv3B~w|;;?#+0LDFPwVLhrhZBufS35#ZG639wwMoxYikj4`LL9{u z=(#t*btnM7zX7p#Ps-Y`RNRs|tljhI{&eN$++@H)y=57-VM(9;d0_-?rJ84yX+d%{ zYoOiZ(12jp5oM+Cr2lp0(@1~0Pl^Ke)UQ>KBU!RWN1-VZK2Lq53l~TxpPO}M*Vv2z z0IPbE!@4I6;&UF2enP;)?R2WxV)3>HEA;X%9X9%!+i|R)jJFs;Qw-};6yn-qe%zteYUCQ0a#z8s%Ww2G?)P6S}z(qT##-%ZV)!b`?E)1rB%Z%}mS0Q7#k?+eFfLi6O+ zF*7rRN@C%;EO&9Y*>3m?=0ek}N4FYQ-KnUkN`L+g0GXh@8;HVNYV%+VeIt>P)?hBK z=P#C{fKWa=K7L=5KTtB7ynxN&bW(E^Yi+*Inv`v`*WaMx`^wz4?6+hpz)2r?X(9zfpr+pd{m&|@(?PEhSNwcOwka0aB#5&=6)^{aG>?7)_-F ze)7GJ*KybGt(dnJBiQfmj`C_jTX-%X>iv$TY>DN&^5Gc#7F~I=LRF1zv!!zxj#i0R zwdszdFVp_;`?Pr}o5H&dr-G{NffQDjM{V#u7kjs#o86z~WYXQmQg#muItH=m$rN91 z>me(-JUyw4^P-3b`XM)a-UFu(C*=kB-)VISNrD)cUMvtPb}PA7uWAzmBKgA0J)vEl z+`=y%!DVi8b(aHxsgv)8tv4mN2sG!xPe~1^D21BU_|MtbJaloXLbS>8`-d-?yD*u4 zdl^vWR}kMzD-h_g)gO5Q0h!>pKAw+A6xc)MJw{K#MY5-hb>VKdPgir0-QBpo-o0Pv z*0*QUNXk9&h*!)4?fSH z=CGm)z9aLA?{j*H0czwKdkTJ+9ELUO+*y()5ma77^}!83MHe^e1P_d^=V7Wh9Ssye z+~j~vS82z8*D4Ukk$%X*By9Fp8I2RBOpK)eS9qj*Jd;W6_dLs#)T^&2t2VNiM~*T4 zmZ0J7`K5Dx;ebn44sW;BC4%2fg1)HWmf8aTcBp%!4T3ymoCYr~MZ#oKOs$=*ZT@Tm zOtF3(CQvIyFe#&21nrJ5D6`JH?3?qLxE_)jeoI}2!Sj}qLQW->Orln+Gsn7E?+wKy z@Vbm0*-@ZO#AT~7D8l3QyzLG|8vRiHJtHft0=zGi&AYO&pr)-oepCtF^|!YTi@*!Z z%Th$b^{$6rxDbh^hD>NKAU$(~%biHgcV{UGj!}PJ_k1%k%j<#uKn?u%;}*%}ZA1%y zQklW&IeK`Ci^_35CQNjj=n?SYl|5eooi3kKf-sZEB=x`$m?r+z{cWQqoFI;edp9a) zRQD`T)-N9%cy4WE8+~Fa=ZF5bCL1LlW-o*S&_es+Iuc(-cAiev?nCOhL5r+CS@J~# z_tWr8Q?=Z%@yC*<&Ekf3Q@}s=|9}3(_R7XGbU^FVZ^LiREwgOWR(#4$yi?weDl*z# zRjG13t)_IE}rEYya zCW}c4|EPwc6Bvq0clWx$km&`ihh~fTRddW_+o3XFzZZ~4xx}rLc^Vb}8^~g?GWBxf zuoC@LaBTa-K{pI!X7Oa(QaK=K{2?~Pi$F&8<+L}5C6us0p~?AJy?bZ;?h-8f8WRG_ z20fk}9X;-*+rTP9?^d|*H&gz$7*X*%Y5dOaF7%i-!WbwHH>%}g#o0nD_~lX6<2UDKmi9100`i;~v-8Cd~Z1V^Rxvv48yb z?=~>}0e5Z8viuBu&*9v>Cegr~Nw4edZHXjOBz+2e>`H#qqK5j}yR=wTs%8IcUZ2H_ z7Ljfot)ooRhpj?8QJHnS{MdU2jQtOdOBU+9p5%AC*tbx2@fT9ks*aDjd;WAYr)skp z-H;s8mciYqqhxgD>Jf*v?Mb;ky^%lm8HbgWQ3@q`N{AWK1O){}F8MH2GxYfm@){HB zADQpo?1PJbNHWT%?nANS<mqfj!7qXd|%2iN2pQ)m=>e@ zVj)&G*}%e}y_L(?M*MOIN-hm0^s>h1aJQ_%J*c#@X{cMmtksR4;S>x3cba<~Ct1_I z@(nMaJ3YO=GxX#Q-5n(9t=bC4mG1Dq?@CuS8~~E#cujJw()NU|aCrlt%EAAE zEa%I-L^&b8qJ_EP3572Yty>+Sc)%;!J~GG3m&d`jj?0m^&}0O#fz#?mVthb2+3tPr za`KecGE)rjObOg_1Mohbo5VRh@GrP27s?z3HIitRL!i0GxWW*r?n}76cY)n`c|^Mc zW@h{Rh+hg6KDkazOuW}jar^vk`BNu#H?`}GvMK}B-9c$35&g4dt5pA!(^610^X}pc zUu6PtYxJ_lpcre_@#X&VS*^xj-O;FBx%KQt=X~gdSKPn$VCoFKC^si z)0#`}RP|h2y5FnA_xzZFl^YL(ojeA?Ja_FThfJPL)E>u4WP=BO582dvpX2Tdbfu*O zx8CiS+!>;6+W&VzzccM5 z?&I*Xaz+`x-n`48G`xYs_=H_jF`-SfZyoZT*n%;GcMU z_d8yeSNLzW6d2*mwejoI8fecUn5+=o&0*f1Y1~febTec(+-=3@iAIdstgCk|mK1X{! zLfV<>{V!4YmehX|Z8nuw$S0mwN3{hZkbig4;(Rz)8+m?&`lON^`Pz1K^`}1(6Z$NY zPrSBrEEr2?%wQ*(d6NxbBlSbWZJKE_aVae6!=vT2TFnld6Gx_d>f@WA`!{cMOAC}7 zI$pL2K9s;Ums)FTJPkwQm*`;V#oN3)`XJ$u3kv*b;m>2`j~KYi(6qz<8M=!Tnby2t zxnE_I?LKHFU(Cx&y-qd8fSL_a?}|3K{-OA~^0|`w#yr$JRxBMiUurjeCjdLw5XXBF zQgh>6-zcpt({pxGVq+TpqjOqH);CIh?2YBTC2Qn2CVGb7^E>wNvdFrmZxG=?`X6Ow zWbn0J6`G@;L0mO0-j2#ODRPWj8wUhf6{NKdOPW3>gU@Y6X_^~>nTbB<_AV#gP3niM zJdpc*gI1JmZxvpMD15bWW}5V%JjT~zcf6ZTHH#<|)OSX_zmucA%-T>;qzlDGAaccr z5>rj0v-c(Z^V0K?VLIBQ@W|-kXP4(2xivXG{ENvOmk^(Oy3+VyYjWp>MR-fXn43o( z=Of-Zw%GcthwZU8^ZKe1Q@1XNPnP{U7K~Ixdf}LNM;s{n=({R@+R1-f96x<_wzZ4G zX9QV_b6k(Xop3Y4i*z$;upunEh{qSLot9JrSf(y0hyloeXP+H7z5Cs?OsGDjqb zwF@$G8_VJ7^x#=9>1Fs=St^XL8Gpl7)hkY-E~59_g+4e1`LMlfOggw3=g3&i&dSMk zHy`U@p#VV)r96Fm13GKw9J_LYn46DhHXU1U|C?EjQX3*xTD18SOxIy99?Tq2PIav@ojB;(Yu$#dVBj zZZwlCIaQ1($~m=E#=Gm$lSmHR^CdVPQ7M7Y>lg)|>{*HT`l~!EG$9-}EWS^O)Ln~~ z=%c8oEO^Jqd#2%J7B@_>F90KC%gG@%yRXzHM@u?*%?C0PWQ%IEimz(RU}7>>?Dc@E zk{V2n+xIPWCY8e+7A84QyJPL(%9)WsDNNscURMM^dh@LRd%*QW+bG&s+B9SD_bGq% zLV=-YZLUs_LvowKi6cK_;~LxvEc$o>=h=~;Y)1O3aZ_5>SH{D`!`;1EFjp5JPF6}r z1}co(h50%q)DN}`n9`TJX6$fF%qi_Zr};dY9p}iWQ$gzgGh({>t(HRN^BG!L-4Su} z{&KM*q@*OxibtiC%4y}b3l^35wo~@QQKUn5sPg^-yaQx(Y+R|d7gjJ-G1;cA6!LPy zPJhBsu`vQ!rUfk=jG{QNH4hMB#U40Q#HHwXx&~I zQX_xTNzKbsNA`5g&>l!rD6pNDvrd0HP;)lu{Am>JLN3O;2jtxh82Ev80XEP`zqBs&@5w;D=+t??3UkXxOL*B%vQUhv zjq?^yLsEl$2MiL+lP`2*%qTxJUcpHbE{Ve_D=SZG@&*MWVMDj|kPdmuV1V%_*Tsnm zdU}Q`LLi2*vf=PzOXlYHYIbMqGkdi?Zc3*sBCQ<%-HFNCAmi|Tv=Rn36cj`8!4Vu5 zFB!4+Px%b*7ci2OlIee<_BDO|O1n7?Z((ykS^wap`Gxy3p<%;Ni0~{zj+!L)y?6fb zxRS$w@>SkdUzdlxiszwn^Tdpb5=(VuhwJ$8W(*Ilh9`Jd+5&sGqz`CGPi7YtEEt3()~JrG@puPgTS)e)LaHH^RFX`41dvAxPuzxy`G|_(ypXn+Gv~34D>iLN8bQ3JMOYwNd z6Ib}fI9&O8G9DPcIL;~WQ>K0|o5Cu4*q;r|9rDl|Uhacm;8fmq;!`g;jLt*fQz_3J zNWA=vOB|m<`uJ^f=Rww%!XscGT05IuepspA-+1zt@8z!9aT5h4^oXOjG9wazu{XEU zRLsB9VXVB0;-ak+quqEEgfilUBmb9Z7t}H;kiCoMH1y6s;f)$dd=?^+DE>epOR*h# z$K6$szT_J@sOOy`K^d4pnKl|`l9xx%26a5&AG(|@ ze@b!P=!P#);P82VgfbUsfaxZvK4j|JXo8qmAW@#dDOdKPx3^bR3dY{Y zvZqP^x?K2X(9=$SeuZBV7Nmr2G?NNY091V#47-4T3BP z)FUK$9}eGZ!0J*w^A(*Hx}fjpHt3>0I(!w_oSxA*)xjf|(umHg!lIKw(-ycpp$li6 zD?oxTp0j*tNTf{;uEIt7lFEakb3#jo&Jg>J#p`)j)NaW-jhHxr+6&tDWlA*_#A~MG zY+)ycn3LAg>cf0hvFVye*}4x2WOIYU>QN;hcopq=k^euRt_ng&gNC)EJPZR06fWTp zvR!0|jKGOwndb7hxg0P(X9oKEgO0X#P?W&Lz}U8T)BQD zva%-lk2`cedZdhKtd{d~a&n#Aw-0MC+8P>?M7>}I@5cUe8R1JaT~ue!?7R3-gZWGlJFbKni_9 zPK$Pq6~^n&AswZ=WfZJ5R3sH0pS4gt)_g7qp50U-2^L&%OR*T^)DPUhl7?!6*e#&tgSdk zsIcMvy^ot8>iT}ozu8bI&BpukcriXc9*N5~p3Rr-_IsS`lpajry8f!$Xx8oFxFJzu z2f7Vsr>BodaX25%pRBZqGru#URP&j@IIeYW?x&Bh&##)gL}X=r%d&bQ0dfC&;i zQ1WE#5%t4Ti_7W3OsS-V#4XhAHg`nr0bA7tXw9=Iz>H1L@z0O)sEjmLb6~D5{|p3T zNn|t|KDB1i@lqY4W>L#XB1YI4S(|;f<4`SPX)XM#f5|^fKgtcx5FpbXiX*X@t0*9+ z{5@^m@HQ_gh_ArxKAf(d-G2L>pQOw^%1ez?ZiHKGb7{x@8Xp0py_qxIf&ZcPqFfm! z#-`QnQJ+hcjBFvfuejiwKe|urmUZu#t|67z1`pLF#(A+G-T)C9=^wPP* zRBN+LnE@$=&ymN+$Ix9Gx})Jo2X~UlaJU@bRBDx}BD~owGqrIUNo~vaajxl;gfag7 zC!yl+p@|Ruj^wX?QY6?Io7EaE=*h2{aA5zp6~#aAr9}hd<`5IY$gdyQtN-1t<)8n) z5BvKA|9QV`maG4_TSTizTv&dJE(TXe~l2L|GrJ=8-&sS`?jDL^WOc*LHe&D z|4-`qe_r$@hmy1Zc?lX9`tbGtj@v|lGI*NZ`uh5RGkMV2j2aI9mxVwtz8Cp((N-Mu z-t#|?4KT)xhX4O!|F04J-)$5BUrd+qeAiWofQYdmI2s} z&l`>|y0*&voca$C@um6)!*Zfy2Ewu5kwclCgqXZ(?ySDUE5g5ZU1123Ve#n%2<6_v zF@|9%ez;)nequ|eFXS6KylF9QPA|05wh5jKf9MqL!IU83C=DF!A3;dj+_AN+!rZ%BFQpl9v<=E`W0{V_4h-2hv9^(mm7Ph|7#yC!o%Lz!E?|riV}1j zhgm#j+j{&PM|GtX!X(f`9T^x@WrWA)Q`$)kY;1r_$2n%OPx{OYQzGdFfo#ImL?)Kr zi}Kg11830AgcgHR-^2_4oCVOKk2`${6(zqY&3oaVrC+=M<^pUDOVQm-7mu#~Ze<38 zBVPDDgY?52{2Pp^ohweW=DE|3JZry?wm0zuzg;oH!V1X6ecr0%4=6(H(FujC@3Cu0 z8e;b+ytcKLR+9%KSlV83KBlDLKsQukgaG>M%gdPk_w&si4avefU$W^oF2obgnvTM) z0h53KCO8rj@)!CBESfiM@rCK!_(<59TUQU2wXF=yH$BW5X5Pu5fk%2TDWWii-**VG zuP$nD5Kk<_CJjq{e&-ope`b^ppa_gRD&?jz*~3Rl^>fvPS$4d7A^L#|)A_3+2ALBU zU)BTt2a9xD8_wQ;5O}_VgoDXq`mU|of{WbvWc~J^gZ4oZSfMGX<=P!DWni-wqPJG> z3u(j}&l(bh1@d%NJVy^S_lep7LNpQ4Mm9$cm$wIFSzB))tCR!qBQY7Uwcy#avr1@b z!=TiUuNBbHtGue1Z!ayV{nfByFakemCbB0SUqtdIS@yW@8or}^laOjNwP6&N!vkl}vv3usWv zCPDp2kE3bP*ke)lRsCGdC-^^mU-B=iul&KHVhS&Eh1k-i157j&j_1}-Gkhzpq;%SV z2on6#V*MAgm#d@kFnPox+774=_8gt8$~%L=tgP$)sTG^nyZhXrvxb_ZtRioERdF$s zyWr@KrtHq|hz*bD71E{Wb(`NsG6rU6CS8Az%&oeX*M>?>)tKBI-RjkcG#)-XJ~WF; zEQmKe9|U6XTr?D4KCiXO{%f{{QE?=_lJGsG9xGa`!C)?j=6B@c{>A~$mz-tw)_qFoykpdxJ=M1q)taSA2qK;Wm7twH%LaCj*hpL$S|1UG;tY_e zqYOI~0BA|S3CcTXp9)`|+IRdkwecbQ#uhBR*e`fTY{Bxu<}t1|oBKfos?+_@nV`Mp z242z_itvYmp0DKepEz+w*DpB#P&!eJ!0zLrp-=_}P(y8kbXA;+^{A4)e7W}~Sk;;; z0x5IZ>3YSd1v1nTV5l*)4Ev5;197G>j; z69&Sa>RJK~SufcAoKXTf-e)Ol4!_BJUdFhVz-KEKH~T3}s+%}lWledoyv81Kbck<=fy+00nyn1dFfi*FfVAm#6=>vN zusFdjC*2hmAKfYTA#xQ~N)k0^&#@)H)nw zW|XIa0i%gj*p-?I0XLYPSm9(cDLlcE<7X{L~Py% z&qZ%uTy*-=N(r8B13f+ti7(e!$*!C)9uvGz@lVHp+CT4s*7Yi1b6o?j9n(ue(+wzN74+7AcDDOp z#8!%lQDhj+1ZOhf)vC))WSM33NNmM(0HMHLe*^6BSWP0IH44?yJ{0>GTN^Rx9sx94mUFZm z-wDIW!hFDlj9N>&4zd_5wIN;`*r$fT=%w9kBr#AOKD_GK?rh4H0t#gHkx%;eD@`L~ zV^P%x+D|dQQ?a1xYqqw9gUFAz)0ecB-P)zhPYe4J)iPu@7FB4Epq(KWGs<1Q)Y2=> z9}F=_T^1IcHZE|8hst=$v)ZsQws+#_)lb-3ylWx^Zo0-7_fMnv@p2!4uS+wMU)XT= z^Tq&EmnA8pv*v?8>5;N59Y5W_urbXXK0bbe)#HaAemb$FJCO{;hH|~rv$V+*+b5>Z zol#k1oSxVntHLGZz(P_p7+Xo@0FswfXbr_YZYtxa4uLqvJ4hdypIV6Kg1!+bTKd*fk84=mKU{6v3AhB!<{wB!1ihk@npHlu~wCHM9tTm1E$+!XSMj` zCWO?eE`QT@V{;AkqC4R?cu2>j-i~AldX6KWcF>&_vw@x?eW}u@+p5?V7kwy25sVfe zcc$ihjIN?=ku(7e)pj*Fj41n}gf+Kmk0KWsZ?(lF@+PpTlU2MlR;OR^0?4G*zA*En z>EsQ6Z=}B-Jp&%Mi(xhH{St0dS+}%K6XO>y^S1Uj_ld#?BPg9hh8oJ`U`z{-4soGFQ*59in7(bks5;GuKtkHd>?jfL|iO!RDlL{zP$ zl0LT$f9?03U*wdwvGkLHOr!!M&M|W)$MzUqY9{%_*bp;bnFDf#?4U_-`T4CUvDL52 zI6ss=INlBhLA{8Ejv24M6fD<$`6b5H=U2X;1Sw7Es$56EJxmb4v8r<}qS|t`4-J@q zKuhFKROxg4-Xz`6IyccBX&k9Ql~{t&JKNrg*S&>Aj(_$5`&Qgrs!U1n%9+c*rQR)p zoRu}{^w6$xxjj^5Rl$?DFLUzVtDONGMd=5Hs7I4MH*Yow*NP&G@HbzlEEAC7Hv!D0 zL9-4OI(1m0HivA}0B z&H#_yCQrM*4{iN9!FOUsrs6mu;*lMAI)*0aUd7ZU@Vd9|CQ%#n+_y%$*JNuMx~UU>pO-r` zHxt`u>!5sr?2ync(B_)|Df}v7+4ffh)OtzX>-*Ki2;S zPk7N;VQ-P%FP6cwJnpFY)rY3|}Ju}sk6>Y=UavjAy1cs^fhA@KB| zZzbJ}JR5UnEV*o1^M;%mS=${(D|WohGes}AQ(NiY#9)635_)-963t$m z5r*z){3*;_io?+UJ_MEKPF4BYz0mdqWAX(ir6@&BN(5UUVN!6i!IR(>{gN`KC2r>E zxI#MG(U>8yLV>hbHEi4^Y+J-_nNuRxoAmT3`2xtc2_**PKx6SW0$-u_dLAZeA>h4+ zlf_Ly(m96)XpR-<_=uh`K`b+!k4`NsgWTNQ5wme`IjI7lC_1qpN)4Vm6#_y(UF@10 z2{he!p@N%g)WKD!(-_jTt&d%CwLMDmDodH{Hfn`GJ-$0v$8-lcyL>(vIV|hSRYL$` zgCqe~CaBu)cW4GtmS6OEfkn-k5d#(+I%YGwrGVn*+h%piHKm=SL?C7;@cDOf%=$=Y z&^={pOp|?9vrQ0lv8fTp1sgpTso8bd7Y@C43p`X5T_S+@IHmDUds4jUII$U8=T6Q; z_s|7)H_exj-LnPiiV0Me%DQ|>sz^-AE&Yg!POtl#S~m*HDP^CUNSVyUV)Qo^Ecb0% zC|J-kF^NLSA+b1A&AIbMX_mT=kXyV4&s19R%J|SXbXxZ-TE;>`qAq())WFc~^*C)0 z4==A^LK-q5k+LfYF6R%VfnS$q_i!7XlZ&S}-)WgyWi0x6VHynq@8Gz9f>O);0Gy-N zmWOQ_;4*Q06^6AdG2wk>hP6ztf?T)MzL!JaI=WEQXno2BhifL-ErEZ0WD979a|~~A zDr4wbIgw;a{YBu;-TAus*#d6XLV1*y&x3{EI+`B)%OSJb8c9I7+dkEi9ZQ7z_lmKv zipkzLO9Z^_Wqd9f@jiS`dq6Xw+8_E!I~p;zERM_LYim? z<%H4#v~fR(2W%9MRmu|jl2$>WEo@v?9&T*hjBRx74|urNJbnt} zxxRK?u_k!1e_!mqumb8x&Ry}GI}CxkoxUU5p3i9up;n0=hl3ez3(K~AjxLf{sTWE7 zHdS)zIl7$EpbVRRuGc?3)W=mzl0cGDVuZ$uIPgS(Z&?{>@r9xB_OCJAzTjaWfY=rn zmXU@3IeOQ2=ok{NW+oP&zt%xAhZ?xQ$BK#ti;@MaF3`7*9( zNzI6unTU*>P-R1c6nw57fa}iVMp9vae}=jiq7ndlvGqp z%Nsh*C)VVAQ!n$fTnAL@@yP&jKwkUUAV$2Qyq3|wxqyP+B^AY4-L1uC3oCXV3N3Cr z`F!OWARCrclP{^y9e3)67)Pc?Mg`y`iK)nZPc0mBs2`fYYns}Ho@)FizJQb>q%O}* zKRF3ns}DjsA$Re}ZzAL9J3K8FWG@eq)~TWf^1TJUtH##zrX?fiSHp(29VF|vy>BC8s}6+Q&=4C00Tva zFFB~DgYrewg!Efew)*{*0%NY57FtDRK`>t|;dN(=@3zbRX!%Jm{2J9)Sx^kLgA z*mL8vCJPf9MYSwU#}doNkdh9iSp?6I1FtQH4i%(R}!q%RF5_mA}YH(pYkSQQabi66N*xv+aC zu&Yo+qSIqv7+)o^%@1(jBVg8muk2}wQ%jc)extX`6~=^YGB0raJogm+&5^*!!zI+0 z=*VTYf={V}Pi7K!7g>R>Qkov0+RHL`ym#V^9xFwPg@8E)Ee`A-CViVX|Ej_jv8!N7 ztumiHGn;oO+Hff3a0AxyL$Zf&6n%M!@M7A6!k^|ytDMu=NyADQuQ)eCY=2@wDdGzM ze20`G&aWOzD^3zS(RGXK1ck^=AqvUK?=&RW8f|tg+q|z!9@g0B$5+07Za8{|oE%Zv z*N^l+MS_isf@!^N+|}3pxZCM=`z?`{^-HANxN3jbbWgX75hgyfGAcK4+u0Cu4rn(W z4x!w4H*o}VP!Zh!3R-F92VPeUG%BD~8Y~v9sSWT{6L^MM6}GQC(b+OuvvKEHpq}6Ppu>n@L#o#mi{0)I8@^^gwV~l9okfe?MM|iUu1NBLhPps*ZME($T99@86zZckswal_TowpQhy;H3m=y#iOPS^jA{{A!?72djC zO5>(Cd4SL3w8?|*GLo7#=`zk}>RPCB?FG-7tju%oYKs49XT;}hbOoTfkE`Q)p=S+h zIpkgRzPWCD0-t*Cded?aj9C%IyK!8uHQ5Y^*Jlx3)nP6`+4Rm)Qb`(ZUM}%|lq5lN zweus9yOPd#B(T>dUyt$JyGAy2n<)W)Or3T}!a<~Mu2C`+DAO_fY_aAJh=_^?-8!$h zeomfe_^~1yoh=|?@0tZ6hxCPyeE+Nzw19@h_+zPaZX26sWR8NwPjli(R~tU{%+D=} zwXh*GJLT8A@y`_C5)!FON5#fT4g=LGn{vLHb-+|YtCYAd6|D627nC)yii0;jr%9Pa z9Q}3AE&K;}W4Z!LfY;3rMWwx8`cpsqEMLj%a+1W5?tn5`cG!M2G*m`nC})J+E~-;M zSrzJIGS$p~KF2~77e=&IY6_o9l)|Nuui<6$$)!#5q8^iohKRJMhD|HQHWbuZA>NFi zlY~WRYL(3`n<76mN6m%NN8B{|@_Ghlw4uy^m*ym?q%(WIL2gGOvYrlAt&g6^O&5@8 zPp^{p^t-(h;FZ9GTw(UWo8>B!n`0_2ulD-K+fbY9L|n~-BWCeIm3d#>`l=q=$3eDW zQ1%w$=|g?Zn4~MzopU#Jvnm+}e?L2(6Gip(IO=S;!UIS-r$<`EO9_+y%+Fex;5bRo z&fkY?nKUR$Ydp2BZHioJ6)Qz?dy)H`8RjO$sj&!+Ow#Ibw`(RR6&T5^YSN5p{dhTp zeZ@(86Vk)f3>(Xhk?T5WsFpV+?^Rge+&-gg%IVUaJJy%c2{0~r*MeMU1W7{rOmp_QPgrb6Lf)n$^|JIdL<$4$avW)#PWO8T+cLN=b87=oLiL5^46sX8o^p z`{U)0_OJTz*CaB24+BIuwcv}Xll{Zeei`Kb>?3b#oOJ?o;t>OevcPD zuf6J}OD6d4>Qk|r($U<_1o^`Z_T3ZFjD);@?tZ=ahZ!8O7$6lJ@3rMvR%f%niD)UVVyH!Y)t=A zKL=3WPSI{q`nmOdXdiZE>4s zbT152Fg_!IoqLE_vD~V=%&8GC8QbVNz?htw2)&#>_49E%x*9pe=k`PTqTb@T4g=xb zUQQ`%%SVqmFQ<>R%nsOkhqpYk;Vkc&FL`>4e7MU=y%Kb}^7DJCPVcdEY5IjEl~~Tl z&0PjGFSw+U$m0tH%AO56DHRV|l?W<({hpU0oBzH>_thxpGOaeALO!SyG-=_so1pyq z9q$r~{?D-y`OO^sE^FafU|D$$wX*tIX2IsdJ*QYBO7n0ZAk}YDn^!yqDR|)07^x#Q zg(&gkaC~@A$&?q}Xfw0Bu)CE1@^2pW`c9JR%k-6TepYIqnmfC0$^F&QP36gbWF zj|$%^AZe-CoyPAbaU0?#G4{g!A7}AOisy<`^HocR7j7l|qxWLOx~4}l4vWOr)vKDz ztMtIcAHAI27mD3o?$a7iUYPHXRVVn$;;*YX+{=Y)3#B9{l9GU7+au|$JS}Y5aHoS} zuWqxChoL21DK_MPHso-67Jdp$hqaY&Mvu^XR`V1`0`OkzdU zksv5hI$3kL7;A+P60dib>?Kzv_Krp6C!EAtbZ*^byc>ii#2>Gn>if_JB?URcV&Jcr zje(;ZrMpCmecPY;y^69wQZWuRl)fW2F_vMe{n4%kdGh`u?%YlrW&A}8_`f(wh z_OAL8-@kLXH2CRhnu~zRjrCeY88%~E&k<5I2hBs}cAe_Tsb0p;=sEuURLP>tY{JS+ zoy@ZZo&WM^9bxl}wfCqpP0(CEsW4&p>(9XK&KgZCkjg@fNzP|G0~~KS5564^KWffT zv{KW3`}ls9TyZ?izBk5pwkcaG;Abe9YyRAh>@Rg)YX+tj%xjQ{LdK3VM+HAwSuL!r zD0?SD4rFEHk6Y4vB7dj(w8~e{VHTpx+(NAZI{FXZHp+W045Z-5WPf?0x$iGf8YV2a1nvjm8?V{!XM zK6FU{atW{ZBi?G>+DoLUBo?n+;Kj>s&mmDyyFYE*NJ;e{uPN_Z&#tZ>oqnn6*PQem z>BrN%G(#7K#Qied?^5MPbju8t%UT@x?ozK@9>FOarSmnb9$`viw)N^{p_4wtf#b*- z^oS8gQZxQ{nK#3jbBh_aJospDjjy5Ry>_%T(dcs1H2gPxC~PJB8|H0@goVYsv?3Gf zH`aT&pPr~E1Mh_>QVYBokr9z;yw0)qm*{zUQFzYisxh4ftxh?u$%tTU1-nODDMUq` z#aA+r*;e=ap6}`P{CC$;ZQA25MD;>sAnlsVOsq2SdaK=|{YYKna3I6@*Lz0LE6yM` z{@Ug>iJN!%t6i+jYJw*>wDtC5+?ReJn^v2?AF7;#t4%TZn|Fb>-#sq|ivzzF?;6?y zvDOuqmD;#OwUieR@bbzLB%0~PO2v{^@F(@0>`o=DCQ|Rz0(HKeyb^cBsTVSFV#6mI zyccRNvw=mD;Y7W?IyAOu5tp`}+O~XQoL6o2x!iV~PD;H;<~`K!gbzS{V)~MJdqQEb zNQ~q-a7pSr(X1MXLeghorbLN|$W7%pG+KaSU{L3l$64dc~H8J=jg~^TrB2mN-14Bl#Uqk_)KSO$3zRc zqEe%bDk{$$Vpef023IupkIKm`9)4zHr65=BP8A}aDY_od>mX;|3VSh+!x}a!)<>~m(hNipg8c5} zh_P*TKJ9l81uE4Sca!7uXj;=VwjAiS@>vSfA?!Q69`#cKCp&4MPqc?9DmXNY&ii1$zXyb3a>`s!@jJ!=iSTCJlWFTN}U#>Yl zz4MX#^yXldhayn!rc(e*a?{!t!90k&roh`HajH-OUTjCZ;IzcFaJ_xpc3fI$)uJaoJ&(~Qq;AZ&6Q6-R@nkia z6DZHx{yfz8-ma54eF@P8f(*4!_mlIjyN3lJ7ml*E(^8H3HnQmGCeHz6jxxO;nYpGs zTx(*a7PFe2XSKep1l{+Ag73;ANRN4_V_NavDB@y_v)3(uaG+itcA~$kFWKGr^(HlI z2Y*_o8MFirp2OR_;e-l1SAG)SbzvObG*dlzfO?|^Rv!seZ9*lIIOp~}?3SupOinuJ z5b>VKrt}|1J?xsNmmlXxHIkh>e_bc3TSl~LC3Q#Wi}yr3JkZv6e}VYox;(U{28nK? zIJj8qGv;{15+Q_SN^4H3;Wc({5?0TcM}O+Yx4iS> zx`m?sX~Ep{5{yENL*kB+IwcVmpX-^_HB}*6(KAjA_ljX1rFp#?&fCf-cX)@b;&i>`3U+M0!7woe#3SW6@uGP+y6N2P9Ou7BSnq(MJj#IBqWmqWZ& zZ4=v41l0qZBj1$;qDit>n{Si?L*BQ^ z_h)I8&JRxPd9$vrT>M>2*lbknk!d`7lKK4L#it z=F|_8M#di#o9Irh<>U@GoD_|6a{6&4aWHdbOxiY5Qs)aQ^x>c7K&HMtlHrx~t@n1( zOx?1HeHYLru`B=l3pr#A^_`fPFVlp-L`YIKaiagJ@4^W&45LGPsMxcWw;Ul2G1`-RR%>f4UDhoI;DL*;>ND_W ztjTZ{`*A}Y?hKw!`UD(k3CA+xdc<`IA76L8|C3&RhAo5Vv5g>w@pc)4<6zM`w0=WW zeFKEU1E4`bg`_D`Zv`%HUw+|k?SeXf%R|7^S^HEqyTg`t&5TW(!tM4l|6}RJn9pM8 z2YX&wzx*~}M?vf*ycuHjR)~SBH-NWN1+9H{hAwzVzPxguPw9)xUw-V^Z<}Z0we1tF zSb)8g+GRy@)4F8qCTn|~S-)b?E+a|#URxi7yhK@i1warSGVf1MLSUIyU>^fOSi4K^ z^0?sG)}l8OsZ|Rr*4Ar&c!|cG)9|R9?))IgU;e~KrY!$WC6-(Jk8Z#~MXz~PR`b|L zQO^6rL^=<49FXod#O z+kvFprRP%j~hX;?-u5qP9;m&^fD8GDh$@sS{z3Lc8P)a=$?XaFm}blV)CFv z5>f2%%g|l3k8NcB&UG2Q>T}bAWIvL?vap@K5J}%-(SqcYVxEv0l{tbl{UF&#^mB5=K4nOUZn*zeTrW%tf) z`FMa_Clp5lFroP&Wl81bxDYii@N`+nSHQ|><;HW9Cxn+hDV4Eo+foL=l8|PIST_$WAs=8dVs3SLz5D7q8b_EO)C&Yqf%Ta!0DBcDCeY`K3 zQm`ScRWq>roFe&4+%?|B*-o#ZroODIiqk_+%Uf^zPg2sJmiv&RhjzuOa@` z>GAegt`XwM?5d;2-UurICX7{N1Er>y*$CL2M%yE>bIWWM8#f_JM6m^J=p9wgwTKFb zUu-WdzWgn95`z2uWUdJcoQhhhIbs#|CQVwaNtAqb1Q=frG*C6ASdK(sz3c|{X|jRn z$(%qQvDw8F2lj6KI`!og=0h!6&j{doiNnGrXAct$gBXfcST?w?5HPv5K?HV$Ho=vB zPDbzIPYz}bJj}c7LJnheu!Z^d86kyG?1Jsy6T$UA&^{Vlooh^5|zd}rNg4Wr`& z?umM-bp22uSeO82MbE-f$Tn55o&8M`AUEf_yT#YiuODat;} zw)FS47+o*}M@k|h7$*Tsf{M_+=JHqL?X@sRp82GJqu?6abAuPcIgYQH(33TLNtG>qhk+72^}o)H}T9KP7K8!;>edBh}XBVgIh zPQy4nYA;f~I-ISJhE-eKuN^M<%%JF~JavV7URKm^nfS;;0?h>SnxEr3?02txg+gD)6%xsT1-zE5nI85} zxrEo0uo6&MoN5C~DkwbKsNbbjJ;9U__mw6>nhc%T_&jQl z7YOjqMdQ2%&UmdpSnn?1E~m~DQCc^z#}UEYV}TW4XUxd|#m`GPV!Ar=huZMjWu!kjFD%2LwoF41~h?3u+iH4{_fP<-g3Z0uJ9mGl#uKa+~y zpxOnkmW7pnOl4tD z{!z5S+_k;C=YaT5>*7wB!Yv(XYeS4onaYh|`iGydMz#?$vo3TDuL)Enjl!zi!69O! z+nWThRv*MYf`J|)E8HafIC0ihxkiGnV=Yu2PDC3@5;;o8!-t?gyV=$5{S2iXIOm|| zI=%piNxo8%U)fPlSQO=qH;+^ zmrqftp`qSs%xxWHLcz|4=nF71H`FxWY|O2E@$8{Tq0j`9mdU@-(=LKQQ@pc=K|Ekl z3OVXl3R8onH{iya+D>sajGuEdiNlAfCO`&0Wx&y}gxg$gL>Vxp<=SW&FywM-;2va- zXxbm1D#0@8o4k>k^iy7-p$&|4sHx*IH!U!y4&DuSdy%Zt@smuSl~aQ9IC*&T3o7^Y zPsa}ho}U!2RzH^U8>;?wPiZ%1so9MW*}IRoWY|f+PVdJVqx(9GOJNkmA<@Tuc@@LL33*!=pR+3}Tv0L6zNQ zAgtmEWm6lGCEpivmePG+9p^1KBORn5%w=*UUahBjPKuz^+J)WJm1xR1I(A0Ecn}b6 zC}%Iao1N>#kI0YVdL@Sc+iNz|6*CzH6gHMdt4>K#gy)Vn+wzIR_?n3CSrV$z2KDX< zGf*?W^_`mSLQa1tyU=BYc&kdw1N|%W+jK1>8{|jMesv16U;LU-UDS~+c1bFe5ko%y zNWkpGTW4|9kpDq9T~{i!0lQXyNzD#fU|ia1@5kipnh0)_{ye34H6sf`cQce+#i{_^ zO9tRFFVs+ufH+T>-QM-WscXLZtkwlN88Ae%p7_yh;+BnI!#7<}*woUqYK5m)mCKEi z-Z^V!)uxxLL5x-;>Xkfht3b1!OwI=*g3EDyld2Dk-nwivv*^G9-AJ!n@R6jqMT<^m zNcRGjps~eC^I1vcM5X*X+CwW;_J4*12Q z;NkK}m-l(Dc@TZF+XOAIPjx_vO(Lj((Be-J3v9_DpEyp8llE{@UX`eIuh zzJSo(a7OA7Q;J{_Zsr&{qs>(6vSUj7u*D5E#}Nn!z7@H1x9+KiAJ~_8Q<2S27*t$- zIyys1Q}*%lDH7P152hq&wVNBq43o;ZO0kC16n6O;+I=RU;ce0K@ zj4WO5eWb*bg@ToflB*wQL#pL2Gg`Y?Y9`F+D&EPdjZcjCoRglk6ikP}bA{_dW^3-h zi?-H-w>+Pc)O>sSG~GWn`D5vk_d=1^F|&ruN7AfZ92|EKF9TyG_UT3LmIkLVKUKVd z?bc1E@j0`wB^gLJNaOOP`SM8(Qpl40HKAvKefF<{Pc=Vow9F4%j)rz+!sa-xRm+n`CBn@X3sC5DL1h#4EX3iK?QVzB` zN=&Y$YY2Hw2XSy5FMbW+$61V7uvNlie-Uo~#%`ryx zQ{w%#lFbK?w1Tp-4_MEiy;1I=qEubQN_rp7WU~VomBHU`dB)(R(Y69gEq^o?Zqd4 zD|I_C44Va)i;R@EJ=Ff5q*H&|s>V7TOpN-KGaBPRRC;#lv7lZe(U-eZ?%}i01oMC- z9eP%z;gMUiu@mjg@JaX4+u{3cX~`|S6D+dJP*+2o9h=3=41;`bufF>}PdbnKD=qn& zW<%gcY50S)Y&oziHm)bkJxoAtIrYiV!WE_-X}%J;|6IA8@uNLkG!LXtmX(44Gc~{Z&ZY??iT&c8OFnf%Q?5qL2Il z%hP27qO3aIx_{-nXht${IYSSm48hiuKd*o=SUh{6SuC-z?pXhO^1I+mS5MjcFd^*D zE8LP4jK*D(c$GoD_(W0zhUqK!mb~qbx!4Giy>?|&-CBhK_8Gkk8@CCvSjp$@`C*i5 zrrQ+#4M4RDUf)4C`Wq^SH$7AC<-fVu1Oh5#hX;a3sa`ti3bym+1({riYbHKQJm z;M2zLJ7pC>IZ6q|M{l^Cnu|v>|bSd5@j@)iD{YLwkghks%lb> z$)zpmmaX!_4sma5Nkh($p_MyhzLW|WEpbCj+~ubnm_xpF~|>c z^jp~gfkFw6B!XvVStX4vTvO#I>lcp+iImt0`4mYrM^AcUuMi}3_Le6wx=h`{bq{`H z{lRQRW>%)3xW9TQr}%)sJEdCM+PZ*pO!~SMrzzYyXgz$B*f=sCEU*xik+Am9PNhM&J#J&%p>R%IEWG#huEH8{;2;)pV^Qj zM=DFf)T)}JFuQf~2Uz-Msc+X}@pLrR9QNC)X43Qa^XI`K&NjXJi9Vt3wO6KsgP#)0Wj-ZCv&0#_mYp{qD^elRzhIVYz$PV*1rM)(^|vCVZeI#0%>s_HaEhey-Y08hAu~!=LQY8GQb|cM z-xf&{*(LTv)~ypLq>1GurzyyLX~n<^dsVFTAM-R%dBZ8&_?_=Pt07xX9_}921-Gn} zNHcR1E$Vg6*$1OI%A5;9bTceg)4#^J1%h@De*fM{lUhAxs?;2fOvfcm?>xo^5tQ0~ zWm4au&SnxP+wkCdPbs}m{}H2Bm7vT-`jo0bBV4-V4NiHx9ebVqC+WsvYr zti84N%k~>$lR&s;K0uy$x8vfR@^i#re4EKLogPz_qGSM+^b%e>srT&4885XT$Rvoq zf=(%^+BvcWaYT#8XGu!_kSbcboDZCimf!TetaB{f+tV)ND6E*--{0M1N~YwrtKq}||o(C;d2>}jWD^G#u!N%P^wYR#qDMdDPYX9rF@<2CM z$_MhNz0|7BLC&S=SU|lNUa7Np`t==Pq160Ers}P_UEh|&D&YEfJEe(+xJzyo)_|(Y z4=WU)w|QH5EEx}Jb~ZLM*f_MG$1HCJ_m@t2u2qX5=EgPc!d^0#n=O?dqE}$p-qI&$ z`KtS~pL!pTWGOd0UhV}!gp51qjAL1kbAFUJMO_BE^a4@3_RVKFPNX@E6|Z||oVTv$ zoX=aHJqu$DUahW|9v6tR%jtdPHoUf0lN4RO^1eJ7#jax82nj(5&_JQdJGx>_3v0)6CBIVV%BgIqvD{Gz-w??^ z9)^O^BZo=Qy~Mc2EUbSZfT@7_^Xy|bKa#eis*NA!827W$-fbAcRj`oMnrdAB$8+&? zY*n52XT7}r8e^-a+%%u{lhj||=f=lbI1R>ssVM&QNTOid2(Pbk{PK2~!P~=-HzgS_ z8g&+pkC5oG2QDtha=Ykn!Fp*pFWOZ+4LJ1Cu@XN@7^1vPAQBctoW8 zSt~xl>Kw-cfLb&1~J z(3t?i2+pvB^T_WVGQ^e~u6<;pQb0t44%9v=$5iCB)TN+rBSK$Z)hbjCHfp}z@`al0 zktd={r$i@qI5BajhJSeRjLBG1xyqr2xyz=k#Bv|^{l~SEab>h?|7&YCUf^_vH=&Cr zt{|Feo{~Z+Cr3b-s|<5usqPyTc4?g_^B|QYQ7%~Oy|OSjqH>1s4$QB;?&i2ZsM zyGQhx5kn;@3Ztpcv~+-~=G-3Y%wcywdY9itDDA%*Sh+%*w=n)GY5+vh0lj|y{^bn? zZWe3z5Ngtm_f2l^AwAlK;66{y`U&#CWdE`Wg)m_#omic0G}y!SrRv3+r8?8^5%s+SMD-oB*QQC}BIZwXXqe!*F6kiTGS)`P8f!2+ybglP?(309pyHnN=8%{Y19m-yrP;GJNn|G#rV z;exhM7r;U5dp}tn9yod2%5~BdWhd!r#tI}@2h~gZ)ZPo{P^s)x9$kkeYMr{zT@PR z|1&{=si)6;YVwd~U8}=nkB11`J!DgvVb}6tOqGWhlUGzs3GUSyJpu~->KYwW0xO>b zeoT7dN{LBnROpBW;Nxb3^fD}2HBN`1m+k%-Quz)7ZIE?u%zB zjbNRMMvfU18ECoI<+Ab>$<(pC z_w@S`7R3uh{;lGi22`8|!2rh20KiCEZqbr6-jB&s243FrGB*Il#eZ7+_2n zcFfb3*#irH#>CE1!AVU)Ay3?J`of8f7CoLtppjR-b$)SdhrDXm|Ar>y2MWmi4&LzS zJpw0>KP;3Fcj2;iQu&b+(8P^*;JsmNa#^`LnTV`v}xETHCVTqhf`SDno$=qDd}Gi$*cLMH@p^$!B!J=T)Z$(#|hD@vnBz zTz2GsPagO$RkzkRq}Ab9@t)o$y-la1PK6^b!pdlaxuz5Q0P^p2Fdt=0QoAiZN^Kzu*gJu+>178~yxQd-(X~S+cu_ zM}aeGAKh>%9I$%-qkVK3b^4gdOQ}eOaqJ4$(SAT>=E97eq`Td4nv-H6F7k&|gY66O zY|q^*b(QM>9SgAeoAL1C&?yM_Z1TtDU2=Yle}l!m*aY_2f0EQ&1G=!7k;Jo`Vp2uF z0Wkx5P4NbR&7ET=DWm@5bFHiuIq_`EHEAqvID0%a zAh??V%KhGmH`Du9th^D=2HCLJ{`p?O(+2KbpKnVi=Jv08QDSJ&q^O+Mq5!tUD`%wY z+$3ng?=l054s*PJyv?6y=4V@$CXj-l+s4LD{vDzWp!d%szx5hBO9o0}V9$llDGnZz zK4V1*Yyhrg|7=O}NGSrV_9mg-7Q%-3nIre-|DYuFfYFX!2am7`LBfia80;t|lRGDq zjXH1!J^zg^(|%s!*f`IZfe|f+9!WJ-^hLCRWe>69Ni=`$*Z3 zI>k?DZaa{_fqUyKB(7)_igw&k%A)>SkOZI+a(anrX)HMM3z+q+mF2D`e#2|2%J2LIeI(bnSdZ`vI4n8S2!E zm;LSY#$%*y#sUx|{h!Ui(~~eC<77ivuk>5+HQ#eF232oHxkUk=s2RH}03W?}hTfn- zm93KCQ7hUenKu-nNO9Kf&=EGO-3_|axm+6lP+#0{!L_7&fe8D8l7y=VumXWCG`eWY za;tvMnqq?F*VksKJVPk90G_yrm<=1vJZK))m;0Z!4=g~)pV%5rk@jx!~6dfjEM z6}E$BQ5D}UsDiPCQW>09d1IkHr_USp2!ZN}n6WhK$QM*RVf~@V>9Pz-za&vhkfwTKNzpAwPp(!+4^YI5t} zaW?EJ%$QGmf9)No&(42|z#^G~E&MY#56 zgq2j@z_8Yx&uM+hY(AY1F&>k@MSE4fW~{a?jkQaTV`=C~mziv|doq>E--|d5R*eMi zK`R{sg=L$aL23Vm8ze2A*Aa%5wSIhDiu7Vk*&bSOz_nFT_|SFu^5PTgR>f}Wn7ffn zF^Pin(2&+dkViiRlg_yN)>G+m_xa0zbXU@AzL0N%65W9K2wd~U9nC`&pZ7doNmR;s z7CZe+t!+Zaz!K<~$pyVIai`(Z>!fCBmF09=yxhU%k*{rvmWW6bfIoxW(bBqY1qtih zKQjpc8v$!c_eV%SM0A^s`k^d67Qggoek|vvPPjIqw?%%&&B86r>!~$X$Kkewv%GKm zsi{!VXEpNs^!8!SB*R62%Y#C;5KU^0)^|8?Q%fU%Ft!K>Fz5-lKq(wu zYS8W^Owi+G%iL>-#bk@o3V%A5!RvdAYX;kv zL+CJq!P!nxH(zx7(awe1VBhKw2I^bhN9{DW#D61)RIt;%2NTl)+oI+FX6y1Cn9a0F zTxK27EP}e5ce_7ZOSH?;0hk`x=#_ju`}Ga8?zlbp7f=MxZh|1-nv zrEGQ<&o4j$G<9i)2RYx9-)QjeW;Tda^ck2Y3D``4;Z5HI!of`SBVHx3m0Di|+7 zN2yqi^0HnuKs>Ik-3^pgBKioJg24PW1Xr_$w zA6Pio=MRL^6g-9wA2y6UZp%h2n-?P)IuoDnSpEzp>|{QV?%HL|tW*sJ9+5H`v!)T0HTnnUkeY~q)8kyA z%tU0sT#>+rex7nDM7xFBSX#G$G;ir~AsI9`(+L%nqCL)5tNmgWI{N zSAxrz-reZrU;Ld2uCH2#Dq@TJq~81gp2TlFign+r_^m*c6urQ?F1+j2JWGWu;zgXW z)$Ul&;29~}_XuT&?O)&uk2}~662tGoZ||sIh^_oub5LKBb@s%rS(!d)*D%nXTJ{!Z zXidM;^+GT+07h04;rQU@?-RtDURzr(eZyZv?IddfdyVhT^2&On#7IBEGYZhFuGw&# zpGPCG;A!(Une>l;7Jf_{AS4e3rStP@)8+$1Ha<0QC}C#{V|Wbm3WG$T@TQ|N)IF?M zF!}{L%N!?6MH@9?V8f9_c0d~7zcMGpC#2p+#>hKH4J|Gf(Q9ZHq3<}bGStk7yY%h7 zi3RL;&$;mZDvA|oj9a%-30ThKaGuR~M}*%7a_TTHxAwnbNQUG~faZhj{{$ZZbU<*DUe2vp>| zjCiu%U%QR19MK^)rLqck>3P?`V*$Um%$!X#rqP>a5XpeuhBU%{_5Qu0nZ2^%`>CJ0ZJONBab`!`zh~3pH_b;o&qxZ~)ZIRnjxn*z z4j9%w-mio&Y}=!9U9hv`%*~1BGLFR}!`Ii*3!-GMmkY2s8I&q6;PKVlF&GBwb-HzjYJ66Hd*}SYZfSwh&!;{BZIfkuo7G9>aPnej6MAL2v zqa{ab{>zGy&ZOhBV|Qx>%^Ok0Ki-fHv0Jm@o8+1%JPMWb;d9*8Xk@wGSZh+Op^4^* zi`spOMXX`cMgy$`!TZ?t?V=@YC!98LTBzj%>%f;jNs}a4cl*;2c9rsT-?~XBfJ~3N zwAQ0X8=V~G?F$d+{>i9ed>)w4u0dk+F`z>ukTJ@%bu1~6Y&0YubsT2zUv8_Rdh>$B z$A8zWJIJo3;-2c_E!{LHtrJ0<0+m6=1q(l)$-(7CS@H_l6LSW9(HrFi^%^Y#TJ|AK?UjI=i8#rYuy1opl@zKi8q4413 z|C`hUYrgDIsdy-PlJT(j8^8W5-YoX+N#Aaa?$Y0)3kBb74Wtg7qk{0VM05`hxL>)n zobPqwRj5$-S+_^doFR0e>Dj|3jq z4kP?NQ7#br?1o@|@dwgS_`b(sycw<*@2X+tE?R)_A~E~*PJdv>id-(VjL5p2j3SEaNguD z)v!=9-K$+xK0AvGpDh8y|mfH+qV(^9qvHU1hfBiZbr$ z59>DH74z1CRf(F;q+r9K)gyLn&l8U3vB zS2f5{O}S3xcv05S(e`8A~a#hN9h@$QZC)Qox;5Co;&!9=C{d#8}oS34e92Q|pUMV6}U$m5`QLc$i79 z#yqr9Vz$Z5FD@V>k{_K%PXmcTbL?JH{{4it=BV}||7~#nN!QG8J9xwX@2b`DgQ;JZ z6-D$_lU?MO7T>Z?2jhi9OJ2iGqna6uEuKwF}xKOINMolj(UZ zVd+ouQG$#=vX7--^n#}51Iv08U5*WOvtkWi47|R~B(2UO_WD&tC=O5;;7zdwBvAm|U$|10dIjUrIrnovDW^EnTNZ*rT6dF1byh6Pf5CNV zKPtD=J?g`kdPzCCVkkq(PoZ!iFBX9+2utSD(udNb2f>P<*Qd3MdQ2r1*FUmiQ`NU#J2a~h2G61> zzTdsdXe}Ym%dyhCzP%Wl^Ex5dt6z{4RYFDWGOcLczG#b{TK2HK-)}`{y*+fdQ2#XE zGvtHqiXVUhk9hxfnN8Cu_U>Fcr5hk+!Zhn3Al_z+T-95aQiW1)SEu zOwBa#z~tnEVx_a9!BQEmsc~X56ys_iPwF!`b--T8I5YhOZF;fvZ&Qdz>6)<_Ek| zVQ>$1SAyFwzI^X8wY$BDY*+`5QvkVc0?Am+D~5sb6RFW72~xNn8e0z{U`c&((_{GY zVgtj3oR-YfnVhh&T7AVvz=O?J89>tJ+jbt_5Gwm-)w4_MEc>2`#?yS>fB zW>tbdZ;}$Z6MAkbNgN-&+^0eF)Yr|w=Q#STkmGN*=!R6$%pK=`Tk@DgzSn3NRR9); zFJ=%2O&xKHBowafM|sd93NNSMzSf$DDtWv6d*4*rm-R`;$plzCBh2^SBh9~6hv%Kx zlmDu=dY~zd(A`oXXWCmb=*O#!U6C0ZTZ|O0u~F&r9%nqQ=7t; zP;lxVCJ__OEd1O}IyBBT0<&EkpW9 zx7gaRukInTS@Huv@T_3yBk{uBBYMMu!@qp-|Cr^HcW|X^QOGgqNC)JRqkVoS{r0Qy z;YTy}IjC?Wj~;`fIcC`;(!oOXo4CfX+Z;#f-a$uq z>KP`+7RYRRJh^f&<&T8l#~6)Tow|k}$bPQV(7#;AJf1?3-iqq9KJ;LfRt^o_?x_~@ zLUK$U5`j~S*ZN&!I!5YnZSUpMC!jRMARUG^uE&`gUf}ZCMK!#@z#=kouQHj3AWjyK zsMqPt1cNaLnXuR;+{N>ao#rQlB9<*ws4*+NbdNbEwnaM!nm}%Yi70g$dm8IZz z{6BU?s{w!BD6Mq+TEr{o^qilXTZ;X^aZ4R zR<4DUR9S5&4jXR8sXxRnLo$Xj_?mU|gY0lhUfCt;uRIoPF3tKVw)yDe{Cw;m+@e8C zY(Cw3B(F1rf8D^6c9#_4hEM_)xzzj=oiTKH)>SuDZwo$JO$1B^I6a2;8ZO7{>wKat z#2{N(S2fLz7bei_FnCDAT0$wc{fy`7xtTMgr`_FfweP^-7g}2n*KVQgW}iC)sbwx5 z>j33DPSLm1aa}-w?Arhw|152P@GOC^d#P zOe-A*V8W_dYgQ%7&M>MIU)8E4=xDHUc`9&)nbR9<{}$W+MVlo)KOn4nI9~F>gsQO= ziBCGE&cIvisawC`%1u+TysqMf{|KUmno<@4;19}Y3<>R6k^X>H1kcHKG4owl3a~s3 zc%Vgqc3mF@orF)xM&&NZhzdiF^Sgx2IJtEV0~%aY2IMCr2w5>oltO}MW{q&MO(@kk zDN~`XLd8DF9`l5J`uQc#9_Jf%!m0jOnvn!{g!Hz-_c1yw<+- zQeuDxyATP+tzm9{S;SzjrVtxo@vZ?N(>|d?xr@?-Git&FNz_DXzVy#WdFU9cxFY21=4d(q?s=x-j1#o+@%it- zi&=6qj(GA13uo-g;Df0Zos|!u4H2bQ<`v8@l1T@^%^vV-p#0dqp)*$$T*+*X++0)`to@A zwvq0Wmt0^7iiM+89%jB&U)-yTzo;{-f1;G@GD;4+j@G#!xZHf}KV#~$4fw2$OXr`p zcjC>Sgay}|ZNJ3JoF_`sc$|ikmve#ye9{BE${N)s(+tNw|oRGN04eoN%Ry>(4DB2gx*HN?nS z-ubthuy?2I*fLk*f;x=7`3n7IF^l!^G`ig7SK7WHYsb1x_)8Oyp+ueiJ<6q}9;gfB zGKUrqzRR2yo}E{ujEgbX@%?nfm(0W^)%GnBEq8blyXZ=U_su?EhP-?e*UyJx%jEO1 zBNc|_vt}5JeJ#2Tkf>!eZ0$ka$Kjr#HiW#XRSr>Sm?Wd*C6Io2+>ZHjk z^<;E$Qmg%UWf=8RNG2>zYcFllklfThi68vXE$gFU$iUR1%iwNw=mb;#?mAjz0*`k{#(C3MK4UN2$lR*mk@P?3+W#o12!esfv*tx`UjZ0PZ0?dm4!QOYpHPtTfqI}8+h$sq3 zM~X-jrFTSnS6b*rI-z$65DSP%limcR_s}~D0@8c0A@oitp(Q|a;@)TP{om*ET%C(E zH_7jpWUZB1@2q#`nVDzO;B-$Kl~`i=p$De-DQ>+dMisb$8s8qn+_Nzf`}zA)~$qL+F@#WNU1ts3tc5$8E~Pb*1SM@=m^^+r8<=pASq7;mJ~ zke(r1k&p{pN-!+KmmmbbC;$DX%g&mU_&A+AnrLe$8&AlxrN?d8We|XNx?MgxHNgKZ z*}B)?Ol@OKhj;B6a}Jb|95hNT00`&J5FUB`BPlY<%yYJkQR}U1EOcl)HJ{pX@&uLi ztMKK6L@O63wx*`tOFv6IO^;+|#K>`qdJvQTyzcqgErm~`4kU~heLzQhuWkN3cX#dg z^q8u8UHXdZ$T&>Tf;JVs-}*sWnNR`cu5#-eP4zW;h7JRLaUhkkzfzFD-jV40;Ut}n ze&DybFf%;O&Ya~f`e#<7VN-`s+!1{L!UBq(|lB+`7O}QhV2~(h!EAsG>P0Tpuemx$he_PHm2xJta*P!e|}fIvk4yM zbn-apeEM~JnCI;b^|~H22uG|gcy)(Qt}qddKC!xRVT{yYd90lK=;{>)Ie*++K4YGk zmgqZlKGJQ}{&6kpqoe@l`n7Eiuh`;H=pV?b<9ZIv^U^r0>PvcygUx+v#Olk0i!iu) zE%XbkR*bZP-b@vIu_-syOQ7L9GT<5@dT)|vRGu(fqN!h#O>uADxwyj7>p{4`Uq>ElnFA@0-5rcGH8isK%)I z&qM=JQcg7UE`mM+)cSMSz>b-n6dhCJsj(WTSrX#?-HENCU|Vw{yI)6X{V*GDm71rw zc&GO5#U1s)n~}wBRBKKwkr$n_-N1s0J|_*f$2BzxT$|0+M(Mrvq3?a;I;Z4VUO(tO z-Dm;bX>Q#ZEc_M)JQg$RC$HIg?YF4ccYp}L5^+55>5|(=<}cqLdKh{eJLi%Q+93aCxEUJj z6xM%Ei(7t)t?uv>qVu!@I?~n?@^(*;8o9>?%a^D{P~SD@cNc$|ROTn%@vB_cwXApjR#20+0hbuCkTc(F2X2P{zX)zBkGuQ&|gE70K7d-oC#)%YSSb@nZL6!`%cwmb4Ea&Jjgg!2CP!SiQSr4 z>pH%X4a8pxt8%n;B#i-Ya|S%;Bg>EpMTI}@_ z7_qR#Fi8zxv#5W*ab~WTfdRf6e%9e96Y0EY>mxxg&+)#k{degq!)Ejo@7A>1l)NhK zajBhTjywod9kpslUGqvQI3`rA0@C1jO>x7s$(f9{UcCM2<#f7mbNRA5YU{nxr9)UT zY*1IrFM&<7R82)~nv;#fdwMl-yxMg@W2q{+AjHF_Rh5$OQTV!Jsys8vLGgFxSz}VC zdQFPVCkoT!UgbY}x)150FJq->L_ehO%MSFupZm_Rb@U+dT-epITG{0xl3m>a2 z|6VfwrNy+;EFch@I(4)DkfOjKah(I-J{eeF*MU`!ka-XvG`k##SZ)r=zTW){`{{k( zMVk-Srgr1bCypewGbhOgR8(iCt4hlCSBtxUi1i5~_dubiIfhsnWNvrw&(6X3B-dV) zHxqg=8D#oHG;vti+x_c$Ot?^*Xk4DTT<^yNF{i-jT+Ah%wO#O#6nZY_RKfRwHuQOv zaqn9!@)ku9kP&paBLUc!W6`B|VSx$~y$wJbbP`6K5RYvGY#&fOVdb&ssoaVN$h_74 z70v2H{nTOZMlKX8Re7xr#BZv-Y!y)Qp3qBbAO0<{tjN|VimPOZ z;()otI@%4TejS+5gUFg%(XvZbGs>ii(P@=WbWQsF_k>hIapF z{$I-Zi>9NRzKtJUJN|NJHhi9#@~X65R|Y$3frk%;TOwaWtV@{Hh6i*mMkq>C2D)LF zk&+KJ0+YU|T7kJ3)WTBpwjVnRP0hY3)pcY%HY(d+_?bH-!5u|5`^xZn{wJtmrxRK9 z$iwFXB&0-PN>*q|pLFA#@8(8;qOLdf(NHLBP=X}V(*3rXj{gp^5*}o%lV{dawhFG^ z#FtY;WB~76Q{6^ce%W*`SRK4nvRJ;S6_bp2Ta>(R%Kp{k?$*=XEN1$o^S;IuD(hxU z?B?1v3qQ`DeTp)C?rA$*TXpS5%iJ{ZJFf8HE=X>`+^Cp`{hocZNd?3iwQI^}tn3l;pMG>L^f5$u z%(}$9_DI$$xtEUT#&=)`?2vAHykq|pV#F6MTo038KrBjkyc@El+?Fq^Dl}(mvu1;q z=P$T|p{wJABPTv$bc6C=g%4V+^D`H^qV$-^Bk!DR`VYbH%(1<2hGFkJGfVfpJyQXf zq|wZpQL)<^QLK2W;<%l)_1QqJ%v+(H0vW5ZxCzm#qBpJ zUQJL=%slOjcNCJHGx)Nm@@Vz5oJRM;Z-Oj*^0EE;Ez7}=uFyU)u|ADLqc`FmU2n#o zEHK)UCA{D@TrP9{VM6iUo^;=_%KmnX_+KL8i7ZcL4Yr=_OHma)nvHdI%8j0)snD;1 zPRQxZgrJN3RsSh-m^|iy?^BMcc4a^?T5TJ6{4l58s-@UgkBaO))|yOYAoOu%@du9Zds2N*&QHH27}sS1o*3}ARtF`^dhZhtf1hKET z<{k}&iU34ONlx@YTk_6jcZ^*Y^;h4*VOprx{}VH*$BOy^w1{&*CzUANo>3Fwtb7)yMjcj+3^Lr zH7=avg-hRTtb_d4^~&;53~{arb32wB#rSh#l=8V72S6sEKlHcDfFhnH8K1xWrR!7v z3S(a37kQ%BSIajv=Bu~eX2x<$yinq$WM@WUMdyV%s8+Wg);Ar~~yrza_{$_lz8 zF#&l~+;JwdNtWTdLr*Wv7#(sKL?l;gGM2zUgCQGwcQB4;-Nz0reU(PBiw^XYCT;}| zXx|(s`xnhX_;ynE-)garj;+jn&wvJRHD^B}gTgASMNuX7t~{d&g}JQK4}Kvl4I>F{ z+}F$Js%;WA(6kE`jEQ-f5j$P_mIFLAE#KIN!37}t6ydvgHp47dEakA}z*<32{m|LoPQ zw#dq@n7=+-m99POHP>7HUQ>ZSYDeiz{}p-f{vBOdXGZK(t&ggo8g_KoEM8|w2aZ8~ zoo)N-;Y$wHKONw9=KdS4t>*emjinv)C!5*brB`b_3;v$owil^@-R4MM;;uHn5D5v8 zo@}tJ3#2o3OFsZ)Ztm6WqASeZ$JguWHy(BQ1G$t56lhY@w^Nmo)q;N%so*)Y{IN~< z*?3@hSQk#LRVgHpMr%)D>Ce>4f}ZqYzM;2`|9vt+(FX1~5i^YVw&K>9v zJ0GHVowWjAyx1Con)?AYP8Ct9=D&wt8f6z(Zr)HTx~cFq4e*(l;;vdqYPinf8zSOs zcZb_ftP%sF$MO_-&#ZFwkU;~OguM9FRkxrWV{>TDTXc)rbyx-%dzwH>LuRW@nZ86@ z&MfSPJ-ak0xM>qxILkbFV}~|wknj0^ch@{Zs&({A0w8nUb*zP83G1q7D;~sG8~>9p zVB;nRd|gZ~?d_e*EsdRs+4sSBj3h~c2j(`vrOzZ(@B;UpUv=Ap_V(sU8xnP0TAKJ_ zrnOv255GTbTwH_+7v@X1hME<59TMnpmXyqnsG+i#_N+SHtV;#@z^gasCwqUP zo2M_KK7d6xC56SC_Age{R-IESQq&V^j+7Ib$vUC^J zqgZF~t$xucUD|D@BfNXbeTAvH;dmXL1Kkr4m|1FUN4eT@kR!)fvp?V`VUAnJHxpeE zek_$4>~njvV|7>Rg(zV=H##WLQ-~F>F0?XB=P*#~Kc5 zmo?Xii$PqQ3OaV^dmhS2Uu{cm{^n)!$NWl0Fb+-eSK`9V7ns^w?aX9st^sv65&KF5 z#deUp#gb3yr8(;3D*-Z;y0f^W4``zOv$10hTvst|n?0wab4DBzTvc zI!A`0cm5(YdFdK16NEBGU^aDR{L#MVvsW_mq!EjD{tCoDSi zkp7-}oYAXs|J|b|7xUAxUbl;`Tq4@Ao@cR7TK!IcQ&!9|zx3Of#C|Sp?!JfBY#^EP zmc|^}i~QutLtT#nqHEbAnTd>+B>E|2S*9*wM;D{24mQ+zE&Jq^Nba+dPg{+eBVA zhir3c?t`U*|FQhjTtvcJ$EMCMyp#YBx9u;U*tN_^#IWv;K^td1o#`NK^nDI=>cCr? z^G&YnXKZdwUA^2^#&tFTy-Zf@Lp4kZgGiYWZ10}1X=a|u57$bBUlUbA!tasY=ih9< z)0SRzD4^r=C?}C-=`=Ipdq#ET^}j6#Jc?sgy5+y5$NWgRaJAuHsL!{b=i5OJ-a~r` zOZpvLyEh6rDSjAc8>u{2eaGcl7yGzp0?t4qAytuM68-wx>(xt(-xZA!s;j=gi_UqR=BOrAOsrS>T-g{anO(LO9{i|xvcQ;=ks)K^2Fj2rBq`?#| z>pa)w;ZuBvHNjxA^4>B%-JssPa5$ucth{^5=^S&~whAaAwcEZPP|e!t#^EjU9e&CJ> zQDkonH9lyNS-dQdaT?YRZDG1R|40O5nCV5Ft;z&ri(e&%>!QdtO)qDu1e%6Z=GC>B zigAm)wnmR}O*gnAst#<$&G}>t)9k9Q;T0psbfPdSg}iXWA)f4z_BoHbf_AFI{h14_ zaO!VaE$BPk5e%-0YHhZrB91^!$xMSCFQ`ysZ*Q2|0uEwB5s0RMGfyx!F~?2@49M0I zBW+kbE6lZ2@W4O~u0v%EO9==J%v#Ba%33SR}+mhcZriL)a zU9t+#9qc5Lfi<ZD0(uD3>cVqV_s(1j%oB5H@&YUsLDDDLVBU{Vrih|WS=+o1S0Ae1A5Y6!?JDF z`CC-hEj&;-6n)1E+)isR=EGvFpJ3>XV%YesXr*K;YgSN|)N64Q-re^|KU7?c!Nu*c ze3)mhdEpAP7p3FX3Uu*p)|QfUr~46``P7wlNoBz5PC!eTuFsbR-a`thk0Coi0eV$` zaq%Acy*m)WdceW+zM^LIIfa&1mPj5wje@_SFj%WW1iZsOM&l@XQn0p}u>ol5B3~Ccl~-bE?IHR;|HTO*t z092;@78rR5y6V0+5UGUDNzbFJ=|T2y_WkkX|FPEZunJ(8;dP2QCY;!5gjOi*CQHsE zSJ18-?PgmwF6MXaia@uw-5{v%c4Kp95!E;lZX;6$hirskyUl+v9eigJ1vA5hCmw;F zXrX%Gb>h00v`kl*VDt)SjoiqlS96qo;>R_a>-`IDK(FVQFyI^W@|Y+G!7OxFqkpED z_s;H6$WeyEETYK~i_AI<#38Vkzlt~UjdOcU_AQmTEZq5Lra(t|Jp5_X|4v{3rz9^g zCwAlMOR%T|wOkQu5_qLm=NI@ezwEw}zU;f`g|EY7tV`U5=WRZcO3OL|Yrt6sXTB=a!>26~eka4H&t{K2;x0$-8Oyx%{RyxJWozo4bT zQ(iajM~`q45a_?~JzIiKIhOG77?gagZ*?{fPu{wp65X{~X?kEa|0J%xkr}l?WVX&!$!mX0Z?uRQ}u-p&CFO<$tuM zHU2g}AyZ`&$e7_a@$1M}OF=vydr}YWxY;=qrX<0x)U7Z@MR7u2sDk~{;gC0B=4Zin zf}8Uv0FZ!hqaKQQ1P4zYRd*HTKk^OYa+ntC?j|DVNZlv0dc1Tt(2*df4>^9K0oI*v=`I;3l|7NN=ZW{+> z7_d?Lldc<7#jB=hjyUXgAN7aK&VZzZjcTUoR+gF9g&a@sL?^|^^Ws83J<98DGRu65 zS4xP2cvu+h^b5)qxGzF!+#mV(XXQPMqp0XS&n*-0);Yvm=hFH)M6(Fo-|Mo+%%=N% zv6<_pv(BeQyImhAfGtiM9o+#H!_T8B$^%;VK37}@tNNY1*$z0SgM5QKT6>aVsI=9)%OYS# zSNRyal}?n2nILI$AJ778U;Ac(_YGO|ir*u8m;&}6wdCTN{)VwDVI%|}D2Eo@jzaH- zZs0AOl}%|2w>ZkYs?SL@Ag#cF7$ z5UZNp`jw~uCY;-{p=7lzlr(kc$>^s(oZ1zaFW0D2!;`QThS0b!j{@QBZJH6mXV(5T;{=TU>u*lzUXeD; zPJ=6FB;VB@Q{&MpdE4=Y)^*%Ae#gQ)8__(FoL#cLeo~X^Qk~PUBcAB@ra@OPDe<5F zYOR{ubZ`OXb(Y5PEb*nQIU7Or6h2|*Ce5}C`1g%qY8Q9qyrCqX%RFVASYPuW7e)X9 z{&AmzwHe$H!dsSC4j+;KqNww@?Ir)N0IBRg*ZEr6`#wd+=RMsi-orV)?YAExxovY= zCV#5T2~3#Egu|wCbe}(9e(}dGlmXf#<&RPxM{eKT@`g^3m{2uHjc<^OkUbwXTrmY_ zfKXuVi0s2NT*F?MYmrR^9_=#7(bxSD4KE=P@K)nvjRSpYLCmZEgzni zTj{l_XkIeZZxKotT3il4jeI^xWM`={9EE!YS^y>5z9W4dZ1ss+Q^rOcZCv?MXtWAOksN&YAMZL5cphd_L3K6XQSS;}A= zpQrgJ7J!LiQxp2rCzgBtl(kR81tU4rOcJ7tc=qgJ+*Cr^JfLhRr=>4RtvZ%l~!p1l{3YPu#`Q zCJOQmr@Z@>v(^NIX57wkKnEYV!^}Pv+*U7%^RqKcGfAl4 z%N+D)jPl!v?|FFe;?cXh$-xJ){K6qO}Y-^14Th8uhF@7uB80pQ>`CcIATrE-knS_8H z@~_k2Uk!K^vr9=Cr5=wt>6g#uTT*Nhto^x3|CV2IKd;`b6nu0W_{rW=Y$IOlmF{7r z^k|AlMbU=|Y`}DX=krJ9HuF&LI~FW|5VLZ~p5J6A*C9|H;?>NB;j8{;7-qH}oKUhu{|*Pnv4Y-u)Ka zhHc?ecVCi+rlB2NPsVP`2C)_Onf~X_ePDS_MDX%yx}HrQXG3RXwF=jCcMfNmhFAj9 z=Shtp;r!^=ht>b%vA|9L=h-Q5_(DnmKks6}QhxVdbkVJ>g8v-R;tnhRkZw^!B_0#r zJ=Z~^)&-n}8i#b#%K85}jz!l$&f9M}g%XHT)kC!!q;m~Ug6`@ut8?KS`Tr>&cIE_m z5w-*MbNoC>f)NTx$d7karp4bOG4d>Ov0phJ?-GZuLptOI!xrk0ywNA7(W_+B``T(o z1>-!9X4|p7y%w_*RNJD|_F}uGUcHUwSxa}yiBGWSF5cl=Jj z#mi#n81Ngk3Rq&5A@(tSJCNFSpdTTERl{3}x}(CK?Z>vmb~dHNcit#QM&nD#{wcrY zOD4wq8SbNe-WGp++e;n(mv@jt{`V?{nmcnsLpD`;#ylr8Kb9!|7L1I1{yZ^gt5CoN zQ)zTh&h@$%H7+t$UDtR^T)zd5-;Ex{-)P_BFQesA#3CjNpWJ& zI~Xf2$h@ktT92fxuLjYy1a0Zi(_8LUYv@l{T5+@TT~@9+%ttM$L9IMU$)J zJ=A$c{+yfLG1PjrPZe;#)aYeeK@^X?J~Iz&z5%Y2?vB(B`?t#DUwLlL3Jp<*3truD zm!#>Pu&9zL=TrYjk7`6Z;O3w1!K%`!8A~#s7IV?AD`I_9cRL!pVH>a{(=O zNnIuLn7ZC;Gkk$-J0AinJ=8b_-UZ8GJ_Gc=?fWlR;VL=p%x1KYSCpjNN?!)lIOFV? za8*WlW_89!oRw=^zNE2@jo970cO|siE=v!=8+II%WkIK@tYFW={n=mHJ@tzhwXfLk zD3SlsIMqjXR+$lJIuWtuJ(M5eBkbs05}?ISE}V7N=XyIebK_EHd(4z^XYc&4#{`3s zLK>L#NCeRrB}qa6;+c?=zGj-O6(f?X{CdY z^>~J)*OXJQTu9-*3-+-kJ~8Ll!~+5q!}}BR`r`B{Hf|#!(#PR#m|q&2sPoLl2^l}{ zVapc_$kvu;Y5{vVvcbG=-$4_<;sl+7$PsP+UK4y6D)!ff`v}|t zpzZQFBXp+VaYD&1S^CBGRSeF&?W*MpCo@u8V(51PiQ1&75k|OY1z>0rKjr>05Q}F# zP3h;(Jaztj^wMLk)d5vo88wx*riq}{o{pvA8V*{CK&xE0YE(oN!hRlwf|uC6<(0{8 zS#+;nn8+t!_OBo8r~{%VhBAM}LIenlMG3U2w};{=JGe<(ObkDHdoqwZrW${= z%wYRft#;PFJ;@jRdT1_722OoOL@d63wEhCqGct!e78l#tTh zO?ICzv(+<*KvahB0TdO@u;*!&_>uQcx@+?u?;eTmT4jPzwjE@+CYZvPp4tU}QpqVulOl|xqah~YK zD2ZwO^l0h%RUJ;7frVCAxhkik2K4A&GIga(BVM}-pq)?!I-Oa-5sCbMo<8>|y#UYO#{-4|PA@-~eX zAU7+%k4p?=X%J2{4oEt(_Qat*96Xsa?oWkanSFg8xDGvBzQO=xAs!R!XaymhEgg=o z`|_yl(r2>1NnfACyQhHL9oZE^b~i-@>NW>~Tc3A#I36uT>6dGNrp^pP%U=^xf{;sw z%is49q$5zbfLcS0ePwLTc4iBrLigw1tS8a4qEp?bLxvWTe21S0LkK1(eE|>LBXE;Q zvs4B4^7I^ZVa+aWc2y55i3$(5sZW>>yt)EL_O5U17ef!1EU!s?PHwab$z;IAE^$#s z<&j^u?$KZRn0Q4OU9}U&EMCqF_yT%891r!mXn*PmH$zI(z0SUCHeQ8CaroA4Och$> zgxPwA;B%7u>r`6{twB=fi`N~u_Y#L`6f>UNXpQt&mL_c7t)g-%;;b+BC%evMh+t){ zu)RP=u7S(;QdR7BZ!;884zF_Y7@O;)9j2X9W|<`Z3kx7hOaq;fi2$rkpg`{p{e#8S z;FI1RNTtU*wGB5I2yaI*8XF#z?+MhvOJ>rc!NBnRy~QR7O`GVT1{dUcHTp%vIlD|m zof`^S-ZgV_(O9ikzwey|KG5A$2b(H5xDZ9=N_ zPRDn#Zp@O%$yZGLw)gLJ=(NTdIQcBtw^-QsU(l5fF`BN1lpm zxKY|fZcNA%&f72Ps3HntPK73Y?}a4vr$Xv%s|=$C#HHx(k1St=j8PhvCv8)%c%dBi zjccnk)a4++>t3LMydSUoW!EpaICpi*<7$tnHllcccsLWxB1xyJ{l+9E-ABqH4I} zB?><60x^MC=J(yBz##i?A&Rb`)t$pdp!M;w2o9?Trjnqj!(S0F3sxvDUG@GjbPI-F zwgbBv;WIqC{V%wx?+ckbR@$v6Z&4bFFC?#5mX%iq$W?h4t(>@>?XuK8ffO8!;qgU{ zbYW@eBZ#N~Po7z>Q*8y0msl%Pe2NZPl%&FD_cl zIfjdgB2K0Ky*zxL4Z@=rO@g5254GynQ6ZR|C&u* z$bxPvh&P01_0XY21}>Q5_Gzvf;0oc5AQg(Z3@{qWY+4j~p**11=(D$(6A66f5Sz_S zt(AFr-UUr<;i^X#`;ZCIOYCwsS%OrW$3%lWDH^y&XT0|P+HQZKAvrUb7DAFavz#w} zI}t)hmoj|8yajp6rSpXkZ~+xn928U(O*CZTGNbUtNr42>8unaky}*G{3xJhXOnIQG z9%L6NxiFd4C`E~mo;5Cp5C!nn)kZ#>CH#O+bggm78%ZrUpkNS-WN6=OO3MMljq`A_ zL#5wLt|UZkip0Lp;kK}_F*fmWscIx|XCb)sCy~z^+!9B*y}_*GPR2f9i{Vk7KiV_q#_>Xj$zab5*?c%ae!UJmR6zB#9`y0G4tyPc zXUZ3JVGj6*WZ8*e4JtWb=BKZQ>h8wWnf>ebkSU#{|nn5oZqm*^oGOZ$F4OW|h zPF1sSG)P|eW*lCf%!+0f5VpCd`PG*-+#CtGx2tp`lMk!vZSKW&$twXUZl zhu;x~!7z5@*orZFu?Fy27e{Wp%H1}EtGD=u;c#iwRohKo^GW*!o-_dO7ir56@IJ4; zQ{i=W_dqK9BrfNT8c3-u=A|pjlweQ$0~Huha2{BwEdC`u=~dfju9s1Hqt~#{|J;tbl(H*an?I407xw7<{R`-Dt&gRRVtZwq&|gEw~w)? zu~}`5%jk?ufPpIQJ+TT?*sH|E+j8(NEwjjqGQk7IXA?gQ>dT%_*xdW1z+#Es(^!m1 zoBuZMR2aL;x_%()i!=$7nTy_gtpx&@nFE7#%t!SMg=IfSuIjl^?l!vR^zpo-+6Rh* zhJ!k%S37bRyJ0Zd7_E(jsU^!{TE{~GWqN;xlwFMPFu$adO+un=DXe)wU{8$EQT(iX zY9ZkFg27DvZh?04fCFP$#}KH&RS(>zI%zgpY*14I`(UVGF4~|NrVrVY}XaP-8=Il z$83P~Y~R7S+X4n&c<;N#^PQ_!Q9>4Krj%p2_&&lkU4QKik9fD7aQh$!Vx+nXBKw_1 z@K`@<39zzoq;PQ#JvSVww|Bm7%P6y$@N~)uu-rT zG@b2znbpFRU)$5}6-AMBTf?vy*C=IfHynAdVItPNNw^d40hv-06#jrtayD-Me8x_t7S1SEFk(00FG5c?+6P-A z^rGKrnG9?Jel{LT|_>0XU2yiJgl5$6=taVj=LyUugn1?b{HREq`V zHX#jJ>(`nP8N1O-70`_;ej)Cx7NDF$*O#m`6|1}VrSvTq;U0&xr(%Y6b%t=FEdO;E z|I_I!7+Sjlk+N%Y1=9)^57#pxt3IBQLN!%rysO{ISAtzf+_ma61W99Oi6S|#VAn@2 z{gDG_kYuK|L%ZCeH1N@p2>BUpLq8TSM-HGBk;ZIjDFJQKd)S?iJ?YQPKL?yE@tGc_ zgHC@5fERHQ989pob7x0!!#WV~_EzT2IDG80=SA*F2HneN5|*N4VnFJLK*?z~ ztMO7`sp)3Y0trx<%7~DGdRXzZW`XldP{8{9hMVO^6rGyKqU{hZ4X+1v`9gL1VCHp4 zWV0G*Ceb!U?W_LSd{a%m+ub`=1!iwNdSttId=KVK;@0?eEc)MktN)!Z`oo8{(Dl2i zJ8H?>W)3ozRb7ds?h0uCz>>r@DKa_@MnzSmzZIugTcA#`2z<@kj-?Vs*ho+fLDIGm2@yI9Z9#V zA`$~n6!Un(JFG{!Cvq6MDPPq%qrb_HqnNHPaft@OY_apdpJd)z1L7xV!i5Y;eI4o^ z60JE0-kgacr#EwZz;bOBB6;rPW)V`nF00N?HvP{l>!;H(@L!ezO;tS0J=-!PBSBj za0h2IW>;(2nO&n?xw+|8Z{r-}sq4+{H_>g!-P}Zc=hn$d?&1W>;gPLn*#+@iyTj%# zE-q5OIWX9O^8HON-u{de0rde+9+4bRMe&g=nc#xDrl#_yV{LffK#(PVDi}{x`dnN~ z3BSnv$(x(-W;Kl=XEM7HrV1dP+vCK|=!LXuRaS8hNjL9!JTZTUgm?Q_18*wG3$6D2 zS05<(I^Uas`MiQkYp-#3XS?CJjr>#%)kStK*TvJzf|It?7irAsq+$zOMt<@&@4^5Dhqpl+UZN%=P->ps!~16f0oFC&D9Fpmb0BJ-jp+MIg~SOyXjOCp?k_D0xz5t z&>0Tcnt{2+JhWbGJ1XVVid}fN8ybdPnYqdg0Ecq5qT+FD!*b5#P~XpEXz|NkUm5H~ zqpgOP%t=NA_9Qkab$Eyg+r0%o9WlnP*4z6HHWl9+-i1DbxtejCoP}$dkiEf-n`S|q)4gTis3k6KX66#pu82lJF$L+|x}8-bY0p%kD?WCLt;tK0 z6SLHl{9HbWTJhYMGP&*P)?Hcl^x?abh6rI5lKAW|o>6xsO1MOHedvLwTh5CKcBncA z=^$Ru-?e16zgK(BYMS`XsTStI&S9*wT6)S-^c%SQLB0v`hJOh+$B1saO-C&<#a_)cxs>U5zdu-gO5_|0=QO2LK;gJy_-` zSAp{~1Y&xi-43a-8?FV(J+!H^(LY?$e%L^_6WT??<%hmZKa;ZD@v3X)kC-V->w%OB zCZ9?X-5z6+jb5CpOXog;C@M6<&K zU_8~j=|$myUvpH5TvBSAa4fTv;#-IKWIs(Uk?}qdNPJa$d3$LyzT)Dqpl3I0HT?42ncA2cw1TRiSo-s`-=V^u`m zUS;oFAi#WO*CY`+{1zHtxIA{nmsR9xGk5#O{VZU0p}zVvYXjX!|QXS&BVj)crdxX#9j%X^(_!wh){&3q(C zVDOj2SZ~}I(Vy*LOUAFZ-Y zE}6yM=xs%XlU*ogT(~J4|>{U zC>dm{otLhPNfNmTU9sof$5le*e1b7cbsCBZ8Oh>ZV1%!rha@5Wy!!Pe95k#6+^!Iv06QYlbAY0E6vcP&RY~dc}1YjB2qD1 z5CGA~Tk2lC)>6(JAw+9bn3l=DKuK{(SaY+r_56YQIlx$$HJXiIqn^%ut*SeCqhwxN zudcYDchgyNOi;Auu8JFAzX^C~iiacDrsqpcfIlm$UPuoY6z=q*HDg8wiys|dct2?o z>k@#Qymh*3If21)yFZRLGZ9=#L$aekB>jg zEhdIU5X}=`hlxRW6n|`%RV$hH%BxAOq0AG6XE(Y#>7*dXBK^sbH3!*Rsky*j;foa8RyF7skL&At#mf0fzjbdO@1jmQYQ5H} zpODhDda%E8d$~9@kxRf#`Qans#jUlB7hko5#1@pO3b8N{8X26Ev_a5x@W2niqDM2SCOXCOP_3^M#()pXNzQ@n~ zf%>`#G+#$+F@{b&jDq`LB1f}=K#Xr(;%g2&TLuljZ(7MnJxIsY*l7iA4oi?Gl)!dS zpvliF@!jBhoLDgK2K)sV&uM4Jes6-;%2q2+k7R4lUy5xJXP!r^9SnDObiAPefM8oY8 zOacDtsE@;*;i=yDGwc~!3-Mg1)oO_1$q5|@FA(*a+{RWx=N3cIF80-!*n7`dL!qZ2 z6gBRw>$lhtH?$Sa^bF7E_GPi-P5N#`RQs2ft1CU1;Nbe{jnolHN7W9CZHG~_zg+CD zw7*NUlgP*OM;tX5&b-AQrP&ya;^83OU`RzB^2mQ=R-<|=2{2RE*XQ>8&IVf>l|V&z zGab?>`RMhm^5trJ8@swUy@^XxBg#huW3AEhZHLytRC6a`m*&TA<6n4Cmv6Bd<_BL| zt&`UB1p%)%?jP>6T6c%*hxePcE&Q!AN|;$Np?LBHuGg%HEV-;%GOMo|mzq2cNOwL! zrgK;Ga;>%mUjHxl-YTrkcIz6Y<*iVxg#x8eXmNM<;ts_^&|<;ey+$cg+yVrOmj(|~ zEEJazDDF@!I5fBw{)cz1cYW*Ihx^(G`{2KiL&9_0Gv}CNjJa}#gy!cAvY5h38?=1; z3kHomQvrUs!-@96_e`xhP#M|$=GKlbg7;#A31YLp9~P5P+F4cw6E1n+e=!}{&~V-; zIsYTgHDf?vnf>@nH~-wQiM^tLe$R+>YvL11>ciq7kdMzt2iX3Kn>+={lk|1`GS|sZ zQ#v>m)pq1XCLY!eb3_>pK$^ccg5-mt;tjz@eHmulEbvpC-*T*mh+&4>twCAbi)aMk-20Qm?FWN$zU2U^G z%9>BguV?Dat}GGh(h#p0cdLnJ^V44-K>ii+)J9*=7NF-=#6_PQsIHFBSJnxIc)WVK z3)U((dQf$+zv|jLUiUZ}>coI3*8X;}5_MGRU}Eo5L^6K=;(~cmrhv_PXG~6EfN6Iy!DI4kyLynPqBBOxqxOBqDLSr!+2rL z=Qu?7aIJ8?GP^oeo(s4WvLEoNT7KiTwhbe$rIZG ziSzAjyEfHL;vGIa?BwGAw8n3fv5;J9WHivU`|VN&sb+s=MZqPpot?Y7VOujs3rn1(BYpmJq|_m0Gvs`|`J3f6=(CCZ zDpiq2B){AheoLsz+*R4rBDSVKEmx;`uCo{K3*9v~LoUs;r=_vmZ@GX_0ApT_9Q(`Z zEUcb_S-mHx-qQm{%FTg3{o~FDHPeyxEH5kdxhFmV!yk9zTrimlT{)agFdPw5PN2b> ziu%7e87J%(e?E;SQPrdr#5bFx$zvNo)swSubzKIZ*}9V( z>`WW!>FRo&`K>u+Rk(kY%!>0UKJG$1yE1gsF>}w+2$PfpEmJ!wP)*ndWW)&iBODL( zzrwG6_PXdB1a6(rHkpiNS&z}Gy_{l$mlp?*SGvTsc?&ypRuBu)hP+?Tv}w&sbtK3* zJR#Jiyr#H8)+$uM&b!;WneW=#hJ#YsTP)YI4oS<$e3cZ*p_F0G`Q&hB z`&=!mD3LK)6H3YlI4LpJxsmC^0vcST4FS^^cf*xr7c1iBUXf6IAUkR@KUjSE#tZmY3P z36@}eY8=Hswrx8GD!gV*opz~WGMrm`NctQ-m=YNQ53EYUM=o&EgzfP5|A7t5^IvPHS zbv>J$dBA@Xa*iUF2wgZS>byP}KarFuvzf7zUFhFlswB2f-kB{L zO(T#D^htqsDo8pH!tDu~&Prn?PBo68=2wfPjhSq&3$|GyOZ_vn4Mx!=NKYAkTUJ|$ z&&go6hJF|yAOJC|MkbeIkF2aVscrP;J#_8eEspD@2FK2s!ffhcN5L-xcQ?_->>gbw zY-#Pij0JFRVlzrYEhu+$k-3ClKz~vb+Si#Sh6zzGl;YGoSKUZQZ>`t1897>)>clan zH#Y@ZAX9BR05pKCRQ2uTAC5b>L~W zZ*42g$yW40jwlb5WaYA2wc}Ctu)5Q7!1YSI zcT=Cr$4@KU4*M~g5fNmy!v^0sMM^wPf^bgjLH8WRXMc_8du`Dz{^+nP9uE5j$X_b{L=%)7CnE^x;yZiZ>Rl*>mJ#eZ~gqM3je_d zI^)*Ogs3?X9oy2;T|FedWV@v4n}OfIn-O5uBV;Q(aS3*%S_zx9DA562iU@ zt7PN8#&ci66!qROD>}238%)aX9vZc@?@M0P!Nmg+8yN*mr{U3eHNO5RIA;%<@2GP{ zlQ~N)WvG>^;-n=KKYpzK1ZI^Gp5MyhXo{9M`*#W3T)Z8_IY-!(BO zjzC?hfotiTf0>qLEkO6WYcHia1?G*y8@QxqMJ+ir)B>9Vc8H4F{NBcR9w&TuFni{V zozoMYzLH=PhInXU-D}6z6jQnKmLZ``z4w#{bwagCu5cE1^SKp! z!Y5Y0{=7(DGz(sS2Dfr%y04eMDdW$Txsg(8gz%n8KLwM>#uxJKkQ7Q2$r0K<#rM&( zdF+H_Eh{wau5Yjg@tVGuvGr6^&~$Ib7~>0NDD_T+_6Iy=#oi9)6A1uHr zOppp+4(%$SKxTNL;H@2e6UIC(#^GagZGiJ# zy@dzzmUb*_dmqf(sTPF=IhQ?8Z?x_nC!t@}a8yIBXf<@kLqVAtLO-2?2%A)i4}JXg zULhkPmGS&@Gc(W13~e||SsH#$h%!b0OsMlW*Es*RiqFh_LV3$6IJnDL6|*V0n-Z{> zc0#R$Wy_QLQV#cRc(p2{RaeAjn;SN1Kt{%jV<<*VwEXS`&$h;=fl7$Y=hB>F;zQyj zi0u@&DJZF&7-W!g|@>)6_?{%Zvhb!M>-Jp12{Ya z2UeYXAxtqR4M|w@Ei!JQk$$PBZb!QA80_?XR4T-N+4$H*D9^J)Evw9z46^4o?Ey=V z91jn1)zr*_te~!;lrZ|k_;7CDKMu|od}DE-bQ#pEljFeArT}c_2_P#gu8;r6S0w-n z5D7FcGB5xQ?$ook@oFBr(sI2|-nL2)0BS4PLl>;_ zPO9YZ4)a|>F7%(Z5bUWH`r8J3_Ql#r7tzYj1*&^5+X0n*wfYJnj=Y@HLS99cO9n0M z%&ZJxW~9&0n6Hn7LrF~wADEuj(MGeArqt~5mj~_T1%8$T)t+22oBP{oRhM4R(ju=t zlS>MV_AX`-rHT{?#QA$Ise>Quq}aJVyrOleBS@v~48|q_{BP`M~#VXtr0!UK>Blluqn>5+f zbdv#>qhVaGuX*>ci&9Wrhe(v^eu@Jc zY-+5Vwp?W-h=!=4O25u)=bn+~I?FbL8dgll%&J}VU1novN_TT>;HHWk*2a6EZolc& zNlp>!zKdA&N{WR&yst2w=p+hZ=~eF|i=UJDd14TDY_(!RgY z!@=UDvV+$XR}In&CR=(?;ovI@bT&ZxUYI*Xmczry*j>f~f6c^7IBQ-^bt5n4trW+h zRiW3D6IqQ%2<{HDx_$H0vE{t5Tq9b*OT*P4gG-e;Le_AO?WUbSn%SE*-bvb>oAbRc zxD0f1djGcJ`e+h>Y&#LbkzeS?DiOsTpy;U}!W52h|yp9A8skm)g|B#N!E9(PO7Y(7g z0l#H)5vz`7<>eFKsu`6s%b0R>GF?g{>&q|Y8&KUQ z+R{@Ak+b6%K5diS!DVzrm@p>Kcm!wV$jF0DMR&a%d-xyr&}7If(QXvCyq?ic-0JTy zpH2()_UIV#suT`19h+2TlPlG5rW`9ME9onR7R=}5#D7A=l9M6UVfT+}Y7Pe-&kS%3 zo#?9>s$7AsQ5V$k)5eUnvmGJWOU+Z zJ>{F$%&!&j6(N_cjlmi#TeL)12j+LLF2dh?J zfhIDGf+pZ3Tk3o^f-95-`zRC@Pb;~f1yE=Tu>6EgzvIhWes0r_oc=hG_6N=0Wl+mX zDyOC9aarBD=qJwl9_+PbdJ=-28Zx(?DN|hgaQCTMz~&7S3%=1Dpu+O}ypj9Wwdf7s z2t%f}TjtlvK%uDxd5x~ku@9Ypx>+i&H!-;!YnUk-rceNnjI4sCd}=Am+5J3Xm7vnO zF9CMiz0_AIICBYST-ve^IrtIrAzwsJqlgH$OU?JOm_I5yg$o`@U|KBg^##eEpFp}R z7QABjp82(PbdO*i+vtSXq1RqeVcG3BqEQ4Uq6_QTjlLzXRgCT0n(cRv*0LxKXHr7K zj{tB%?P%w;b#U6&s_p0ZrRZ$CvkQrbOM$zy#wB$07oDnS1OLGR0x=>$Nw#C(;P=fw z&e{)$Tz|QzhnkAxWlYE9!@#?D%9s`<_elj8(l6e{UWcUE#M*Q@Zg}b-{3qBsB_#nF z29u7q_Vdt2TRns)a)Jh1DD+EUE@!R5R$?N!E^N0EeX4qXiMO>ph!(-s$_5eMBj*?Q z*_qib9(ZbZdZy+*Qo}KGvHPqbrWJn>86<1EC$w;NmEJ!z^L96{MRGK0aw$(*l&mxm z*awxICz7Rlt4QB%zP{GN-=|KE2fOKZK6x?|m1{)RY&Y73?*oPXsPeab8kv*;?i zEfE=n^f>?l6z4e{?V?e(`quUL&c6`D4 z(?Ovlt>0gr57GYQYIonP%w^ely_sNsWPAVsxEE1HeRii_O5KAA)PsF&fk=tKbONz~ zzj3!5i5BrWhZKra^(l<64LoN6KXiIETLJYUVvp1CqIgMwGU_xH|Cw~txsdS^TS!BL z%-v^3Mw-{1Z&ZgH>}pCbw2%%SHRf=@#XTg!6pYFIjfoDM?KG2SEbOM!ynY7O1E;5Je?sU zee7|*nmxz^4jp;BAY42uh8^~t2(<$^<2Y}UIY@~9N>J^4h<68jR-Jb;q!3S{2N>cDQ zpM!%8;m|-i|4z4VD0pncNc6pCaLbua$J(od9YC&sjlJL;%!U>UAq3(eSU_vbTcz@V z|0U2b-EiZhVp8BOAl*(eC)2yxalk;u)iooyUA?pTeRsw)fA;iz5q_;Q=vD-F?usRD zZ$_H}5`6Mk$`d>3kP(4;UgzannP0kugtROy-|5-mY(^8s?$#>{ckiZvb~Dr3aZ9s{ zX)pCuT8&aQV&s*4yJG|1?|tLS8j@Z4S-ftc$1Yc~B|FG1m3@sYH#C`YFf-jG48hh9 z+;|FjHV68K!N2{8Pjwk>+IdDK>~k+h;KEF7FIfnSkPo7ndNRcj2K_laGD3#)n(oe> zI}TWfhv|;7e$9W&y8flgclc4)b5zRXNPBhVNW7OEwHza-HG7VwW%<|BzV02_7G>;& zNAhP*G%$L%)V1vB*k)&|FW`_*aMg*AI5-pj74&E`>cQHwprCl>x7Fc|7G9z8c_>LY62Vwr@-h%Y4#|U8dhxtAaRLY}FxW-SpZ<vtNtyrd4+rhG%hmJ5mD zojiwKu@cRYMUJcF{4@rpe%JtFuflLizF{u%Ez zMviSDeUrVaB_1~Jl4h?e+n=Rs$xnoz8zIM}PIWx|2TaJ-pzSZ5i3x~48o0R#pcj2g z1EcbSQuF-Y3pS1>{9D$~$M@v8`i|JZ9iy1@P4gk#2|3ovPEL1)zmJ`=&u$I zdX~avdU{}_4*-k5e~*q5-+I*@A9IG`r}w`m7j;-pS$pofeZ{B0N^x76RBv#_4@G}SSH~E#WZRkzt@Gq%nRO=(bU-a((QT@u~qC!H8 z=XL=B$3mo9Zk}Es!!XV7W`ToAhJ#PV>$miN>{mV?>j6$)-y5y1CqJ9siryIqY_}f% zm)8N)%4d0_+K@sI4k zoPfT87sQi$=iQC!zhu@U`=5u#QL%qQ*;{GEUpmfLgs``kw-96WX*4Zvb^HFdJ#6*k zjgx6UUBgo%yLQF(F6&7cOGaVutzr)`bf1C8mlZeG*Oa-yy#LRL>ZOXHJ_>-} z$V6i};QCj0lAqoW3yN3Po&f31u>*f?-dI@Ak>VA_NDd$Umr(Te)Qz(CKjTg31P|Zv zqx&U3Vrtuf^~;&i-NWQEy+9tnslB2SvJ`Q%!T)>~a7)FTS6*ov1pXw!6=5^uL`kle z-f20K3$`)1`~MK$8tC1AVbcA-{RQywHUgA*Sgs$x*$Pwm_fh=Uw<}ZLl%f7-ym|b; z{!760>c#*4z|Hjhe=!dkw{bWuq=4etKO>F3&Pe^HpTK_&oliG1xO@e=NB{Lf!-4>Hh|{D)Mv}z`md|);mzyi z_3acpyO`kgv`pUoV*Qblp&3mL{LKKCr{({3tNq&!fGDc74AV#Rc@K|`?9;>l*7+;^ z%M3t)wR?<1sI*VVOdM5|{m+X`T}?N= z{o6`5LG|RyKojw=ep=HBxrPT@Y!AnAEjrzP-cE>@gpWB?8m_oLP&|uX6QU+kqI+}( z=N}ffy|JwzATQ8)1hX2>#ixA{`=4L_kpvj7)H@kXOOQ(_^HRR9a#Yk06Mz%oZO~h+ z;%~gT8>WM@teni%W9#*#GFD(=BUyyPByaAhyWuI*KOH$6A|J^*{^vw7<=9LLPK><_ zqSVLRP|R182dVjd=%hBUvP(zj8Ye+&p5!R(4^j+=zk5(@5vzlbioW+ik+uK9jr+-J zg(3NKf|+mjL>l-HLHPe{Ii8ew5$5)?DNYY#Vx>`Kzm2=A9sI(4B~&vUCjuIxB~=uP zY4O`b+Hrbf2f)870@HNHs%A~?_++3lCl@LO{P@7r|4?P72*4+|U}t~8+Sx7m&v(m2 zV=5fLKJ-+d%cvN0+fY6n3KPlF`S%1k=OBMkt%{7wXcK=R!@TdbR8dn?OG|@7!3G8f zhK6Y{*p8Q&P2|GfiJye2scC6x>HGKZ9gz0vOc}gNne-9p-Fd+(4{+QV$FReKEpWZI4<3EdH8eCdHFd6GBF7{|y*WNUE-YjUV@(D|YN}TJ z_0PSNZ0S%bvQ)>LC$5;C$|GUw!;$BCLJ*dMwu=m6^b(<7ZUKk4TTDF?n*vsmT(9eh z3@FjHevvV(V?jG4?dtpq39IKtEO+SX>+j4r2TmJ-$jHd}7`#?`;=8&Oliz9Vp9MWo zx!K+Z)!?E*cQA)I;9A9*VrAy)%OjHKZ&Q#{-?#Q`%n?L-KZdDs{Bnrl%iXRt90?;;21xx;jkhr+Gq+~FU zss+*T@NiXC6;lw);|E74Cl`NEueV=n;!WX)xAQLMwZ5(>FXt9%-@Cx;cZCHc0j>u> z7^(>xUp-Lef|eDnQzveZDjOC!b`e1)k8(s!&C1+-8YQL3ZAS_UqRc#BBy&f9-)Aa9CJu!?1`vriUA_KAGi4?r%Yi$5F4B`UeZcUWCy1K4~=ja04 z^}L<->I?9&Nqs1kXT3>f<8bBD!P$xfTga#nnCCs4^_%+ga#!*>Iim2qFJGR&cvmzD)?Q|K^zIuy!UPE=nC(S)Q@ zr1xh8c@2D6%XgA-buCZF^B3(20Bp0&0yNjcnwWbo)Gr_Vhj@B;tgxmeek&@nt*5pv zpU8OVOx{Aj&&tz?xJg!2c=J5pJt9Mfln<|}d5c&+Zb*PVTgfX=B1+sg;!`UVI( ze%0%)rdU`nX2>>y0k{EQDwMCCATwnG|GL8X6Cj}E+F%Zb|nIWQ{d_8>HLg~ z6l0h8dCv_MZVnFh?>#(GGR5n}e{q{5sWZ4>qY4TN!*^H#te(UJ%P7Gnd5SUJ=-6Ig zk5fXSP^$s!s(Makk&zF;Ft6RZ+S&k#tlnDDS{2MNQ;>i`jq16gr>CbCT+ zXl!T@v!JzQuHC~tMH9wt3=?vSCs+8xLFGPTu;mHyDGMzKnF<$hn)=1hyi$l4s;dPk zt<21zk%Af-C6@ScGGz+DG+9=14;QdZ~o-|_>kd7n%@k2i;As$^PvLc<-@uC zt6JleL0*^k_JCikA_Dt?lhj8Z8LvX+|G7t$Tb#t$+i8YG2yz)|Y5od5gOS5SGtIbL z0%_9^)f`q%&VVtmxwT|UJoY*T9|PJ1e9JJ(_^6dr9N6@Ls2kepQ9gVgItW&oBV{w^fWo0=zFDTXdLMI(GlaNC@Gj$*ksGAvw zAWW8%lQW!{HYMur2K#J-H{46SuR|DcakxA?z@kiALjDwLWLUq2!C+`KdUbVGc-}A1 z#JRezj)H>1b@uy^$@WJ=Dqzjcf{(_ks`$V#N)0;e-l|;SbMzM0jt3YtU%A&@SD~`+ z^%OwR&6awWK>|1OK3pFHR+vAoGe}u%+-BJ((GuOiQDrex>zqhM6KlKsmZNHNasaqG z4fOSUD-+6w8yXsxyJNeB_Evfm9Vg0?anma1u@@}&a&mHBVm?3nTnu_aXzjbg>Lv!$ z<+xews8b1Eh|#07`zi2rGLc+q9v&I4u4EZ5o7E4gMaEaE!UbSiwE_R^L5hXSC-|{( zAo+lRh9){lDp-}A4uNWbxIdejnGtV{G%|ec;nH)kp& z=&OOO8b8pGaP-}~+h8YIgDh-RGIuiGT2at5U@IpkDj`|btPsZ1&=C~_PS^Jy11OFv z@k$0U2n2?8O~6F19Hx9u(rvD&;PLru|KLDhU@=a@db~NIk+hJJpJMkYAc6siw%9*l zcz`SX;83&>uHt2#>V55P)X#3S)MC<;YCy@UE~`*rRE=MwLh zSZ8OaWW`3>KUe^HltP2ZGU>`!yS*R|v2Hyb9ghRFFlyn{j-;LijDUPTl%SCc5)pD= zKnC*-Mc2k_B`WxaU!f!eeOvrWGY6Wz{NPI|*r-<;C$%hLAHKbNV1`R)~TwxZ@rX zwKmY*P;e#Dh>PF)iN2KoD()OLNy?yky+M2np?va5BCpid9b2`6@_2b18^e&wokTS zs0!xs!qyDbQ`>2t*inWv)^t}m?dYR*fyZ0sRO_ncD*vkZ$|SZCA?+cxr&D_Vc9-$$ z9(WLm2I_nKlppIqP_AaCEooYU_ronTqsxgI@#CF85sRdqPpMbE z-7YK6!19O0Tn7th$9swB*vDNe;_kPLNM_zM!u1wbTLjOFqE zm*5=gW_xomo9bxumL@_P*Vv8q={lv?#ke$-e-a309Cn$*#s;7nSikr?ZeX+Exu5s~ z2#ey9PS>gHGiY{f;Ggj2c#l5FMp4z!H)js#l;ldjfw=CUA8nx*)>N3kn7E~#*$X*M zRs>)8*mDG@I*ymrdu`}AI&OW_hg(M;W~y=rm9!ht2!{LTiw~=VNa;sxE`N=I%$*$_ zXBxb>Zf>aKF*pb%cXV{*iaaYMVAuxiqw@3R&(&95ohrA+OB3O=^@b4(`I97UY;4wl zZ7p?1Rg$S>7arF8dU<7vxXT9g3cJp8%y0*%@{#N4>w9lcR!Uzk5)W^ex(36cgP7lo z?SzDc4raX#D}H?;y>AmfN7MT8*U1ZQ&(?eL8CV=&OpJ~KwvXPe)>hW^Hpi1veb1Gg zolBw5Z6o!2zQ2QND;1*Niuv#73na3N`|c*$g30N$z_O!{0Tz-k&v6+>-A47yxw%<6GI zk$p|@?j?KYZ}E^ejn3IJ!-6R;ZfN~ZSvZ{>3c|@iCixgRQjj1OKEnP0mCD0WOng#v zO0#lLAnz2(%JUx2NB9qfx8i&AdarR@Hsv_)>ALhN_Q~^Gg;Ty_fdBTBs9cj3GJe`| z{;OZeBf@dFvw9E$d{vuHC0a<1dg;V6rrScca#Px)+6Hbdyt@12#~X099oM2@70Xl; zpl1HHj6#eX#1yxh7Y_lmvFu$P)C= zfs$H9z`Dviog|*vWF>llvIIr%S(eWl28yz;m^L&w2N(8cTXTs5igdxm7o4lcrBDtf zNYdws*v@!4i@WO`p<-!N_8}L`zIA}L)16Ai_H~M4WHO`wudse}RPGVlg>ufOU;dIf1AVJp zG$E`%@Xdg=^l!!6H!0zW+NXg>oFOgh01YfGLYO*2IYS|OsJOH=nM;%G54z6lcHifN zwLvw|YvAtn;+hy6gQ9_$nR$X1*y-_Ex*Ow7z;@TwP3(6(hNPsXb{mmXP-HaE@HHOt zbd{@#5ysL=&ySBY)oEo(um*p@+y(-v%PuO{uXdHpP_E`ONO+-FcZS>@ApP+GL1Gow z($wN2sDzy2T7ZLzy(Kn`W?MGnZn>Oi^MaTA_0{JsG@|$}~f*#%qbGjN3_yN-@mnecF?g z2um;pBsCe0tlg?Up|4**hw7*KGp$slE%H^N%G^O1-Hc;xl)3*X!SgsO$nzNL50mRi z2^&n}6XQ?n@m-a_lI=mf&bZ)o2}EVZU4EU`rfFgH9}xx~IXBC}yvv;^ouQw%M9Ww3 z(!F&k!Br9{EOT#k8t4i_M=NTHRrp>QY}1PsD9=Qb+PAH0Vfz3ZX?_o0avM6Wx}ek~ zdT!mN>;O^H6~^aU+8n<-gT#~Tmk=^g??P*zwaM)6o?;iI81NE@Sow3NX_;IaS2hIj z4dx2WNI(K3;|UYz1n5PU7iQ2CdnM-dKroMrheRpDNU9K&nhT^FPdYN0d>)S_`x@*8h<*Vna&lws#zPbtw0*Nhw*5Z-%gmbZF_ z`}--mn#1unJoTzUmG$+aKElWJEvGKp8X2NkSqRtqv-6==XCLW@e}YdpLqgvghQvTvwjT+$}<* zUewR>!E-yziJ+@*`_=A%t4ugMilpO@A(@{=8JzCYiR3LIxYKz5ViWV=z!y++DGno} zt)ib1m9n#{y30qy-ALa^sn$Ukn{KsVFmLI$LvIoggvFr(p0x zD`m>;X?M4SvKqKiJ^BtA^vpZKL?MCDde2ft$+9;Svn3KO%>haIg2nUe54R@sWKDvQ z52jlc3;M^Ww|aUcEqR`)WBXL+b^L5Nxgo_%lg^@+`*&HC<~dTyX|4IC22>i^eB#hW z94YVFx=P+rTz}{@ft*@#yx~*C2)4-e`jcFv^~}uGm^V91dKni0aaHHMo8?jICp_FT z;{DvL)a)VD%u{d;j>%d-%@spl?ub+Ew1isW^7Jf}sGf?|BWyEZtcPHphqKc~O+N)v z!&0xgy&u*XZ1i!?D6_17d;Faj*(<>LxC)#&;94^&yh=GFx~P1bYa28SD}LC;D~vcT zOU(^??en(+px}oKcg564`gq~+k0$Og1X8&}xYn1Oyc-d>;c3DJ0z%g|d493Ao_KmJ zDFT6DXJb2!GQ(IbFYoKTX#Lisi$l1}+d>kAZw%#=l*%TtO<~O|b5mv9- zu(9bc#37$aC^dLpdyW)?GEVO>MYpBP%~_6p)5oJC4PC9}X|JoA(oI!~)Gv4iimGRr z`Vn23V){v%1M^E)_Vnm6JkGXT-BnjlkAa^^i7}gs{!DIeVS$^Xi!X+YD)ZrmB{>#a zVl+~HL%jFz!_*6B^|>tavtf+*@d+HamYbi?V3C_yiK)x_umN$)I_qL7O7zd_E_%sV z)Nzl#t4EYFv55eejW4 zt>3CtJt0wiIsgGsezMMHQ_&&(|AVZ0U5+YYUb_4W0g9nD`BSZdkFv2NIA{Y`K13vl@T{B(d zIMJKPOiDrz+##X~@Z#OwU7$Oyezl95rslw7yvu$!LeC$DT>LBPeI=!Nan&ohQXfBl z>?aZ3Z%VsUUr5N7eg|Js*9=}mR*GvT1>scptX~<`%CW2Kf|?xOMaiHWxVjT|Mw4mm zpQXR_BEm!jwGI4{l>d8S=p>`Arx(m$*A>O?gf9H@NEU}d-V6}cHMVV-0O^p1{?eSCZZBxueWoo8x+sbvyyadc$o;u3}{lf~HMI&2BOwxtyD1m#WtFm^xxYcSx zKCLBv4EJp9>{x0u_{OQbF*)x&i zKX_nml|b;5*Ier0Nx6^$!#(l@iJbi!mrWtaX(~8OV}OpIHA%vk&lKs}b$iY_HxmMB zuEnDuxz2(hgRIT`&(x3A68uFa`x{Ih5}KquEk36AHbz3heI>nu=Iv)VDeq(e5V)U~ z9**`ROaT0TeAqNLITzoCWd#?X9|g#kWgcGej5cvFHMy8cl)eRx_7-j ztHIk;Z=>DNk~Gt$l>cA>GRy|q0W?@LL6yH3dlB#u?mCKhcB}uG*XvErE5@t>KnMV2 zT4~h{#J9rU%j}@C67v=*c6K$f1yHGxO^oc(;bDhP-yn=Y7uu5i7^oo}T(Pee$ehCp zC=`9PxkyoceM`W?m&4Cc%9Pp4S0vgEE`tia&KsS`jlzr-yo9VJ0As$1x(%NgB}FQd zsAWe{a*Ipt8Z_(&Ntr7ueiTSNP8^d?kLzboeduuuU`4T}k|GAiUlW;%!!)Pb3^|5| zUnnV--L*NeY-9y#)YsSZ;c$aKs<=2CCH1>}%t@2GsLEtOOfz_XUEN5m^sM*W+S^NA z)8lFeGQUZG4u;N>;bc;cYI~;UIMcWyv*WgYPthZ`1pC)r>^)h1`&OdLOTamf*i-r6BoC3@6{t4OrqOblI5YvCYj)4_5)i>1$V%#tP8KHKDG5+mRnDGUgv)DkXeqI01|JftK6YNBfPobTdv zMGgo6KMl)o)%Rj{B@#(cB5kP-=_6{O%p!}B50O$Y9r!|=YJvQD{P zHkj4b&#oNpcpjz+$;ph*;u#qkhhMRzK0XL67#CcYo=-IF>tVz{% z4ANk+cOs8Vx2lM0I`1zx#l)&x0!9)({sJ%J>JZ^NhBX+uf4jJ4?Ku`ik6qb~zqcf+p*qZCASPqJQj116yhBNB`@%(Qp zG}OVtA)%e+UPV*WO&%+dTI;YWNJ+}yiV@zQD~rALlee;iM#bPd!gicEJ#d-|{H}W$TqQl9uskw0W&`>1 z3dE1!_oqo)wCa0};IHVn{!=tyCntKeTKV?&wxQnJOx)n$;L7;GgME$= zcwvZ8k@K&EGi%)bc1xz`Doa=mQ=NDuiKyC@v%{Y(y^0$x{yWfh3JQMa8;OFNL z5#4tNnKkjDJ`_|XFdX#Bu22;OStRjuE;^=CO0Ri|Ew_KPe!uF{rkH-#KRTA{gtzjF zUrHS#7`4hsYXmTSDsFGg-}F0-Pl1d$kq7g938za(xfJ*D4R61G*>U39Ba9U#GV0wf z{<ae<7cKP2kwEY zOu<)GQviH0JW6H$L@=a*I`hxPiCRlbdg=Ljz*P6QZ){UpN3SZw^J!~KOLq=8MtV8& ztE=^VRI`c!^mo>+osexB>?Fl@!A^Jsi!nDhH|q-XB>FJ?wHh7U7N28TKOVUXj)=#P zMx}CR)ZNSLS}+(Qf+1OwXBC?_jm^mQn+27xv8qO&4l=+RHWKlz3lI|PY$9Vl_N z>00kEs~Wq_TrVDceh8Fh(DN$Bz`Jy(x~4`$NKHveY1_A)hx0>+o^~84;_ibK9aLNhl*8=<0>p}68u0O#q1Fzd z@xqW7ug_8hq<(ig&5n!!N11V_eX$}_2p1O@s2`IeVd?eX`#TCC8e;rld!Y2naWb~u z^9^W#094AE`;{1Vt(Tk4$|=*W$Uml_vv`V-9af13p#)oB}1+pq&W^0gz1%Hz5&1de-+9`Svx$z=vz3v5Sk6vkjVxdN3A1Q za_4kRrbV>#+c_jRzo!U^zeR53-QM3@0d}pp_B%d-04_LX&I*grRr)bHKJGHtp#Kzw zxV}6XgzF_dD%sw4B5Mw^cXZ51jk&nNxvw-EGw=()f1lj(fv@k;Tea-M;wMLhQ^SD0 zlhoJW-{05A=Zfla2@REQf!%)d1Yw;V$$pt65#Ij7^sjwq_ckLxPw+l9wBEDOw3uAb zLhS(2zILFI(MgDd^Q*y{RbcpXORiVHLIW}7aL~0j6hUxT*1Oq(Vd_4f8WPpO3PRW| zrsTLSr@j1(bH;uqp?r!X-p6%)*6vt)t4qSsy+P{XedLsX=@cdi?GkbL`Ge-+lPT|n zJewy}v>U2yQ^X{bd6vGy&ePR4C~`qkz{XF^6BC{8+R9QB)HCt0#&5ahubNwcd~5g! zdUxIH-g_XY*vkN%N9=e%I;<=`Kl_$>6KJvwnm9->7Bj1&;RWO^d?)Q9c|}0~0}i_S zcYJC@k6^es*aSRSr6I@gqLfr>bo=5@0gc%7xddH?UVW|F)v6Y*R5hA(H9`?!+Q@*; zgksb7|3=Opef<}5R#op=7I_$Lc=xuEOL_r^9GFuvTGOy>OF%6LWt3Pt#S!qF+6DG4 zsbUwaR7L=1^?ax1_Z5Op7aZP$W@nq5n3UwUTr%kbtRR_$yLmuI zAA@{&^Or9_EGrqBVE>1`w+xD_iP`{(kq{Cj2^KWCy96hAaCZyt1b0b7a0%`ZAh--} zg9LZiL4!L4mqGRpG2ZX1+TE(Ht^Kq81FGQO?!MipkM(oT>8ey<;*INH1^4OVGchs( z_|C(Xhj%+K^OX%Vo8kHdaD^KL5TdCnpC;)^-Do`l6dE)3JGEC}d!0D8^Px1v1}UxIs*bwyX!k)1nP6FuVJ2uoOWps`5W25`BAFT za+QXatp?6cyd6to-8~j9x-BPuul)kd(S8Qzk@ZT|hnM@HUAWJ-*bg$Y5 z4-3mbbTF)YeO%kK4!HXUbP-y>OH`U9l@;Le3AoN+>=>P#jIWuK?`(U|z$>o?T>ajK zlV}MVRmp$py)uchqTB()w4w9M7Ib zkuQ0Qs`=D6Qf!_j%dnC%OA%T4(4!D;wdEI(>yD=@Z?YSA7}c4<%cO|7xEyq=ix_}V zVn@0V22f4n4JG%CoK?m}{DN-a%Q_rGtF*W~Lv!v)QRM*ahmVV9I5k5RD2xUb*r-`8 z!x|JNdguP-an`|iybN>!dNCSxpcb8gKNXzUtFN0TIYAYp>3P7ND$sN|hywuSLIw5i zyC_3NR>=adM8>-&qb^UI=gCpK58wo!@Pt-%uw!&PYOqrA(t zl2EvrI`Ei0%%QG`91gB9Jg)&&Go`&Ita0rw;NZCVD&U9c5)(fab6#r)gKb@j8nf-L zTT7Tu1`NLSg&f8IlrZea^!`XEP!}4`p8W4iq-nl{HCX8phKdx~(q*U2y%Q`Dd2LY# zr8`vEB(RzWU&O!hl`%(24pR@lm+H3rOl2QO6;Ca4^_iUihCpDW)8hhGm^pf{<=~J- zjU!$l4)xQ)??l{~3=Yp#_HMkL%WBzA8QA{J6z;&1Jlh6GxCEiu(D=NJE zE?sF{uJ`C3H3!TM@VBXm*=0bR#jYp_wY)Z4O5Xb30yYCeK?G*i-f9%E8fMh8HI~HG zBhfZ*W&iz41*zwQvMq{(ENm^r6^Nh7-hTCaV%$B@3c*$y0YE#^3IXHXq_V(oPYU8&3wj#IgkUs7eJ@qU`2BksO920> zdwb%K8M7$`@@xcrR1Jz0Y3=|!_nI{108u#Zd4PSO8&%MAXN&~K_*A5ph=`y00|3u1UjTH7i-m>Y+k6W|t;CAO zD=98ssuH9o2Y_V7$s9xcVXql3eImv|0xT%-OmcEEUJ#+gzi^H3UHau}+p;$5@X~c! zR^%__#9>7si!M6a{o5DchBES+=m)qBQ8$JH9=ShF6g8ojG(BT~yp|Iu4I0 z!@^LNBWc8h^c@{lS;5@@ z3w?tE(Wc}z)m-PM|XGNQ8i;S za4liPJFY{&w6Y>RrEwNtKDBMj>sT|jb#V6ba`IM=-xw(mn z*C)2n^Yi%l_$F>P9v&V}PS*`vU#kO+zNB7OU#r6LO$$rQYmDRp%^VzkqwyPH?ez?=K z;^62AAZYtMEal|nTwGl8`?ohXOwG)OcgV=dvNAG+uBQR?IneFy(8U2i-C=)J>C)XvcXn}Fl#uG@yjIjZgBpENugLC6gXsjM;I)7U=-kfs z$9K9h>fO#nrl$QX+0jpoYiyU*zqzH4>~vR(o(W@J+Aa%))Q%vWXgDJq=#1T_un}aX`Jql@{H`{?d4}tzUm~sexCsR1KHus2->qEY?_e8qkP3qcb%Pb zK0OcRjImwz72Qw&_P##~pP>^ue#N8k!b{ep2h+kf3oNp~D022{X=_!hM$wi@*<-E1 z9??g?@Iq9>gP!Na)}Y;cD>-&Y0|Fw>>gEo2^q#aP)qRM-0f%yM=u&r4%Xh^<1RC<; zNf}zV`&&5>5V(jChFp@J4o?2d5KCY!rKP2fjIyFjp7+}6p)13|Jz|N{%BJ{9sMg7b zmp96Bn3StSKQTDSa5zfxkJ4kM?Koy+<`d^XtIg!5#&gU1JqE_jTXGF;)ES^0b^r`4 z2M6H;C}4;GX+1+f-xcVSnRt47iirh4%qy~ixCmciy&zWNH8{Sl!KaV!-=&So1EBxs zR2Bc^KcBI)BK)UUEG(k{ktEC4Y2hpQlM8%Af@_H-j_O_>^4Q+qz7=a&By)Co1zeod zuoz_zy(wE>TYCUU;P5RobJDz`rKRQc)ahT>a57Kv?TN|AL>vkNjQJnn!uetC(-70p zNY0v=n5=JZKL0ayfWL(;EG$S+Iya=J3kW`>1SV`QDke5mVhel&H(uz!2jMi*8XB~_ zyTfqvOA-_XA3n2#BLFOaj=WLI-6{=Q&^XntXBXdtXG+WzXNw``dwY9?k1>Hk?!)O& z1BZ9NA}dQoFkTC^3tYcW^lj|`zUQ?T6&_AFl4}M8M*JBA z_?;;Y8sD_zD1fr)P7%Pt4N@{N$j$;crME=+_n@j7ONNQdmlQBkh-7>jOd3If`Q-TM z=&$hs*r-8=Cnwz@%8*M+&UZrIUjPkNRxE26xQDZIbOdbEKkYlU6BnMd8DpHFw;(ms zBRG17l>Swl>VKaFr{lndC#|citD%wThXVUNvGt=D?0+pjI4=~yvIZy^wr-DL=P6^! z^^;WAZE}DN%Gnaeeid+rhx3y|kNPt<@Vn*pO^>PtVwR)x1%G$=qsum_YqP0!sEIsaxatx!IzpTO3a9T}^h) zy?XU#7U0f-q6Gh~$b694Yxq1&d|>d_)&MWQgB{&l4MiB3?(OzY{{@^^_L3dPFHP*% z1X{Rm78ST+zeP2CAhRSq)u`4R1SC_K;>B=ft0KBeu5jqrpW^Im#JpAsa@(*z zbD89zqGfFBfmo|nY@Md3P^}sSd^i}F4xDi*DR6Ew( zm5d!TC6Q-$KO~HoY2K33Wg{e|>U8OOxkXXKVpCjcOxeGW_rf9qmOD*BNhvyZk-E>T z!82Ppunz?z3q#BRUA?obCH^_u(+GoTZ)@;5^sF9q-<`HB z!Yu*;uUP7|J{)97hk@7A+Q32iH09$V!*)#Q4Gw< z+SX)>*QG?qG4#(e+|@ENum`)av6Bc1R_lD zM7}R_xsT;!Ud5I$hX3Ol^x6{&g#54*B=NPOPBRar8<2AFk>?%8PpFUtf(vcp#Wzi? zu&ys*5olyh%`=6|G_AeO0{>`T5FR+ZUY{u`7*sDIqoWkMpXb&`;OoWSmha>Jd#dFT z#|hw$@hes9-N3a^Ot=$rGj8yPlG8{tP)TCRU%L`qFy!vN$ z5w-)Wpls*5T|mcB!Z5B7QbC7=dLR`6VN0Uta@Iaw(zLweMazTG*j$FOXFnZSMwP~@ zYEh@k<1lez#c@C6x*kqjzw8E{Ieqa`96u(}UDdz$>+}gLxaOZ(8({e|5TG75QfR0z)kcZR1mz+ z>}FRozd&?IYBp=|nY9$6g4oJ@nNV>p|SHNe`XXmAsSbsGY<8NEIVE%-1Re`ul6rV&CDUpa2V|IMT zB>(JA0L15&7`o&F-_$~IjUS@3~Dj_BL`GtEBidha9r{I zo^*T@(FXId=*9&LM-eBtd;~0bCW~{ZkCkEBj%K3$U_hE(MpbY_c_z=3>Ng%ny$|f2 zsP+2NG)n)@A8rLTK}^sOa8J-@@@;;Gmlm#9#ag8VrItH535zzA*3g0#ur4VnuDkMR zFmlb3EUozbPFsSugdVV##t$r7vGZEK^lwDLU=wzZ_iC8KuhLgtjO`Ao`&s3~ojw~G znHU>s+Fe1Cr^kN8%r0WSntx(hD@iZqo+a6dg(aY9eu$8xS`nllao*DCF;13JcHa68 z%+5amT+-AQb3L`Eb$#peCiVaa>uHvzyp`6!X)nUqFFmcayS-lD5KcNh*Z|=4CkxSjrMvoaX!F^ZNB}d@~AWU1;`5aCU zjl5IF2aDY4KkXHiHA|u)+cQ-O?^`1s)rhA81KU+98q#;RAc#p-u&6?E?d+8$gR##VNoiSo``e&Ay{k>0~fB@d@11x+v; z3JwGJk8RU@uJid$VQCq`Vy^}exO``8kSOb=Yg;U?rYpwUi5x9&n|mc zu}8wd66~MZ_x@=F-?!GEJ%9cH&{qL_bH4(x!UXx{HaManR?10`$E zZr#7Rp?d=%X3nlx7tW{%PXLFYETyoVE%O~uPl8%|O+pio-GBCS5y4*p|8M1WlFckF z(ZhfPb-OkB!0e9QJc&z*ht*B0B#`Z#cNr-_imsL<|#K|C*O`pJAzg z2MNq-xYfLhV5jU>dqf22Be$9tJtLroD*(6a|CR?11qxG&$w#NAsBS%)`s2vum+J8E zk6zA&)zzwkA-4z&_~#>Rn4J;X)z$SZtPijY{x8>Li&G~(}{0KJW$pZ{a+_RbD^ z7~g+YtQB^^u|^p4^?xnd|CMV3=2(D9lYeRlV5j}kI{@x~d+d+nn`mMGL$h0{URg0j zWp}x?8G!%8JR7FBQvyIbL5{#%8a2J^joQi>CvkfPA0r?j>{o!n>VkLwtNO;SnzJVO zX?*-&OZGqah46oFTsj<_AW7EnEw?UQ@h{C50BQVZY`|+Phy)w9g*Zvdh&2K5UMwsw zK863J)n63#D29&!aKi%L4;NQgZaisv%onzwU$+OLRu+?dY&V-HV0;kvDFC?>yF8!=*T7vpAsgQ!XnH~>dEY!ziYOv}4?ShwqsFRdVXO9y9nKX}14 z34q42gM}dtd83*Gq+NKu06Y~HuZ7((v?`d!*0UBJiO}{n;cxr=BTTjD50f0Apr($j zEH5v=E7RHc4FK&rQ|+GI7+Br2EO&ZnAfUL&$Zwi_U9?&;-Ds0d_gdJSJ^=mA^JpPH z3}a{b-Ji}KF;P(zQv(B31o-V?4!G|bW&N85o<4r}0W;VNxP654rjL_gO^`e$?kr3P zCWaLqsm~|a@%_N14gfG&Q#vO{o(M#lNF@?U_)Seb8(S=Yj}jL_IP_~3&%|vw&j@+uBmzo2|eWe0j52-)mPD{U5>D zmlt`)@OpT7_)^l&j^!Oe1{y(ws;;kS!-9!Ka=;=pCfqD?smQlq2e!wm_qY5<$>=dG zm1*eNJ~+FN(yH%gn(?yiYZCebP8dJ1o{(Sb$^D0v=3#6=Fo!zo``u_jCm(6-yN_~I z#y9%WLCw!r5XBl>-Ovq2d`!fC%)hqN+aD1BY2lsv&r~LW1Ga48>Dd66mW-aQHXwy) z9rB3KQm;EGbiC<}zR&&NXNo@5WUf141al9jpP*zsf&V1qtA@fiGJIDNanj^fAL^SH z3-h?Wo5S;k;5XTz|T&lpgDA3i@J*l5Cx#8V}5k(Cdn%>=-XJwg&nt~IKsHStMFsB3QV1s`y6 zJOK^W>X$ zj5d@xC;|&rOR4pAyyc`v8!P*2gv?(trh73!yRem)<7+XHuGhVp;6bIowuc@S#_5PK zZKCtFQb!yjG{t8Y?Pydn3N%bGG^2K3bAkoQv4Tj`-<-O;^LWa5i}N3cN0D@<&5H`S z0%Aia#Nup!2D^(|uiqA*OX{T{CRV9(bU{fw)V+=;Oi7`}LAEXIUVFUo>RK$0*_hV5 zsB!jP32t8gnBuK?1FSv%Q|@i4NDT?G}MtnB!)_y_f4O;K` zKqSe7n&8)C{DaFjpEidWa<-=m%N_@7EBH636!19&RL1~u0G+Fr9QJ)R8;{Mjq}tw& zCmOC1Y!%koH*dE-?*SbOS$yo<@3+K+CR}3gOr9HCoE5gS@*MfZ)(;(3VyFwI95j!2 z^&=1%8iNcfw_hW0Fc?`^2%Qn-8(zZ;uLPoc62$|HJUQ!{k{ua*O{(nU94?=mV5XEB^7S4ot zu5D$Ng0nLSJ~%#;Z8DNoA__*>RzYE}p6rpPTfRr3vQRa6n>rgfJR7~RAW1q`Wrl*` z+q8dv5mR_Ew0^>{|>fa`Nng;B%D5kEnUp zQ1%43yr|WAQX7Jm_{OgZ`u>z&%lN{?yT#F>`^z`|mylG5u$1kgRq13Nz)~L&s};xp}I8#$$`g)%4Y0YC+RB3mu55x*d|;vug81v8GMm$4Sp9yry^G znkVV8p=s?*%UB2&uy0mMwm!=Osp`L|k4L`xxmVQ0n|Z;)MpGJaEdOwplh;kzZe?p| zRC$F2+1zSi&SU43fYGFT=_JT;Ltac7)Pb*&^RrUX{r#!AYngjW{c1~LzvVQAuH1IY zSOIj*k0NBsVavl(pg8BW`?|<}3cDXsV%WBy+wt;fd=&ugb3UggjX4XwJ`G(}xa(Jj z88Q`ao`J3+EfVn^=YV`J_$>ojthY=(ae8QA#O@U#Ju`2{S{Gs9`xFi>_M^svvO)HT zBxqWW@~JjPrz}B(YIdVt-Hg7PB2I}Z3JMC3WW{lZszmh1DwS>IhCdnpF{Cw~(~O^t?;y)g|HEvVbN5NhyL?UkUo1n% z4Pdap6kglJR+G*?7OFG$UNM_MAkBfeN`wWws?WI(h5j05sdAyZ0UKqVlm$&;vWL8w zR1FEc>)B+&P$aa~A_pTx0Cl=$btj_cs>j6E!bi z)&z)$16VVAdkn-26?68Dsd$EN!?Ot%1-;fUaXD^8wZjlb-2r;Nz5qtB=BkOA&Cwc7 zg`Ie9qYK1-9DbJlb(*@R3luG;yu{pJb9{JqWGq8Dn)&5WKx9tx#2 zaoXCq_F&xea(oh`N1JKD-oc5?bNb_cpis&l^4vm+Ita-95VY|wbTG|2h=`}G;%&Pi zwo|9Xt8ZB~`s=-F1k&$bS2SuSKoBWOTkNKzO^k434(y!|cjpeHo}J;1daP8^@m{xG za5f5JdkWN*G7l@2)Mn=mne@=nNTAfmb7Zl~$7t9X_=hLkZe7^f=$0X3zB&|^uYGer zN*vQ*e}E;ZHsth>aye+>qRE^V$>gKS3f&|Ua>bDvLrA@YpHKIAE*rLKXldlLqgOF zHzYJ9EE+40?phz7GCYuvma?9kXGW)G+N&06WtyFA&MX|E7aZO?w3_d9@;*rg-=IbI4mQ&4o}a-iF4i#9-uaj^r1M!WIR z4eBnokC0gKs7|(~KnkF0gH5K;DAnm@=|hiq%^|&1<NZ!X`Vl1djSrVWvb~*_w4|nJ6%|{LjJ?(af6F~N{KGBh~CvAu)a|ahBn$z-{L)IrDGgCf7CH~I}ro9-v+M7R^8CJ`Xuk%6`h@r<1%68UM zD^u(3vsT8vIDj+~Qo!3bDjIZKU@2=TF1@sGWNLdbl=zBKpxZ&!;V5N}3zE5PlTxPP zaXHzY-#w<{UKmihB$N>?#{^_6&`xyB%`sfa+di`oL%7i12`ISLd^2 zqlxe-p;Bj;P@|tYDD;2kRRy6 z5!;i!oLV!b2F0=Xv+gIF1tosM-S(I~LK@-A1S9bzgDFW&pPMT^yY--^`u!%21=82X zm#q&yu0Jqls41KwH&4QIWtM^!qWmgr` zb`X*4&c}|AbVNIdgL{-d@<_p=moxUwisle2npa633#Qvi_POI8IU$%@(t6J-y7kule-9w`r z1985lq~dRrql3D|hP)qfP|fmknm;0H$U0v0hj%`HtECakuz^}y&lk^5$kg((56N)# z(egrZjZ$^~nDb`e6T?-}`b^65fN+*xj`j1Ec_Gpp>fs~)bNP@xwB2MW$P%$B@$9Ak!rbc5LX+!_*T(v>J{z)?~0&w2=jfy&w2JQoq3 z8tP@=M6bZh^YaJP8QnB24X#Vk{02&cM~=I4q?VJHJ(;=@Ty4w!(@J)&N1J2r4%=u# zm0bIrkX4hCnTzkpJ6K2e^$PVTS)()y?WC&{`kqKk)Y$9gBrb5DOcJr76`Ti62ico} zG@wgwoTnvPfuiS125};mvJM;LQC;qiXS|^kaP5nn4W&wNhhJYb&73J0Mj>lE_M(|x zTWe=*y%eW&{Q*^Paf4}@2sXHFJvL4!Gmb)b2^;gSi&r9AisA2ZwB5|1!5fjT9zVU# zzwfU$)E!J`mpfBwS9@-w<-w01M>H3RF}piYr3;uCC3swIWfDeg>3D9>mkW&>%PQM- zAKQ>@1+a1-o5#f-hpT&D@OA@49i)x00QLd4p3WSReSPeA9+_>-L7@A9|dlaB9VHjJO+mfkQ-wIj)2pJnF;S<>t69N&x-s80rnTZS_j-qm7B?MW@j1NxS|+)aE^|dgr=u2aSWtN>(0E>$Q{s z%@a51xZ=ih&m)ueZ&W}va-Vi>_bt+8)fqHT9Gs+$vtY;B%N}uXz2`}^CWdc%F61of zvMZSwB4(B7l!To;D?=IT(QCEau)Q9rhd&Bak+$XcovFt?40tj)gJL#O(jn}_9B$Bt zvyN^>t&H6>RLDuK$;q`$-YU+;e5H0aRypggFK;z80i)eG&-o~4%0p?#fzwRAb@bja z-b{W=>dDUr%gGYxf_UbFFScj4zK{RH(TQd3N_YsFl_rfeV||x4Z|(AeirVTi_fZCZ zwDwS|tM~_wCiR(Ai)P`pFwWBsUaP6oYW3u22a;QD7OmLeWaqUjiz#2^GqTXDnUlOd z6Sb?)zLqay1>mOw6ayFBCEG)uW)5QZK!my@E1?EL5W`Qg?4>TagR`tkeUe!mqp{K9 zP1i(?EQ?$BD&TG%EJR8ZP8zPH!)R~x|$G(Yog4och79GGFvC^tF5a z#hHVdVP@+2M_z%>{=MqSNULX@3GSbf)Lm+fZLsoz@&zHoED;xp9b4lX3?#uUHmWvF zYZN<7zOyKcIowAh**!_VN-^ZTxkx;2sJDD~`N#r{TD2`(I zURpB7m37A{8AzlB4g<0BR})v_csL-B-s$)n1;5JHD$Ck(6-lP^pV0JinX3YUDD1$% z;E*9#ZztIvY}b>WsLFoslf>iASUvbwQHMS|1&r>#DsvDxwB86c@(8j@5}YB zl~*HQt}>^w9K6@sDGAn@;L%hP30d!YRGY z$>!qPRbMra$OclC-4K=Rp%i5cPKvh6SM$vU%>CV+;pk&s>_2$GTEpr_p&78(zqyQ+dtSB~u-EP{k%vA^E) zdECR$L`$|&b@fb(!QIqQDuABKN^RCU8sYR4;Rfn&Cdg-e14_uPbR>0u!=&3qC-Yd) z$&|+ll)D*Ty{??E9%s>0YLtirdJ^1FIz?rksbAW;X&+dNln zPOK>7(cl0_(FYn@5?eB&=8@=ZV!ZMyHNz1oTFzzs^Eye;))X244!XL}etNonzJ1Cj zuBcIbuhXlIDxv--(W}L?hXcddI3jAfB`6Sk_N*0=MK8Y~E8V0dYFbyB(OEFO zz{#IRP@Gm;QqkkkJ|>jmAaYEPr>8mzyJ4(yvD%ll1GjP_0HjHGZBcV=akRDv&XKrRw^zb^hOgs{LC!5 z&p#%kE60eIQi59IG$PMtlC;81#H8Nh5xr>-k1pgAa&!#!LlXR@vcRF=2f%KGzQE0b z%Fkz8$INHV^4hB}H)(QGGcBDRJ}~g|f}2>RknOXE*Qt7>JNmm{v()rR@jJW=0hOnw zPi-a){zQ4cA?4PZiBfeb|8BpMo`O!b1}vKMDOtLDbB^YS954Z0H|xVT-IoH^^* zWnpe@tYFg3&DqM`s77tA&hw`8_Act^640*3^+I%@fw1LtJ#_DBD`^I)%vs7Th3BG- z&@xYXNXPL#`-A{8_YfbXGdX&DporPee&pcN4)egLLV4o0xVi=KollUoA;&4Rs-}?` z%T4+XN2&M)b0@u*>EqF{@ie4+vUwa$3fpE=6%DLX${v8X&xD439?{g~81qb|-C^b$ zqInWHbfn#IG?vgcMomLgkw7iZ%5`Z~aZ1Iu^Ws2BqP4)_s26a^rcqm8_f?9F2&-Ku z<>Bu8?r!-j-(T@!Flv1a9#rdGzTGoz=Zpxu%Pj*5~M}*awIQ(%=m@B13~0 zOH`1w;9y&2I_qbDH^O^m1uGbgN(h+7-}#NYI%Nacoi-BMa-J=knjfMqVcYI+qe<#z z)!f%y&6_?Grw&vq+;Q7A*6jbm4=>(1nirstZ*yME#*^4JUdXKlQBC@y15`^>m-tXw zoa(L`&(gr>kX2q;b}Awzt(|Y@@ic`;^3@dRb9(L2I@$wL^_`c#6KpP#c@`ua6HLA3 zrC4*OWl3|h2T^Rh6f9_N$EoeO&=gE3sdnXYN(lRmZ_0J|R5Cl;W%*Tg&f7xb&gjuv ztGOxNRIKDp6junl?xe5PW$E>1x3~nOn#Xbja86F0s~k-9mSPY zE%fCjlDtdBVw8Ko-xq3Ct-R#ucDFYc6dft!P1@T<{WJ?|h$=7RMGSvnNGYkN=tp=>Ol462W2mi#}}=mp#|KhB&C*U z)`#+kMNO>3AbbWnf)lDZfsq%9g@{iVLl%}ytA0G^H|p-iax_jWwB5xw`RVVZzMeJi zX}P^IgqD$EHs)b@sYVi*(XVLj62M|U-Dh|v(FXVx=gM|66ACFLlDFy>q!7&DV{A1HwqtWT%zT z^8KtFyG7)RCsGL7_>m%96@s6YzWq>$ONeM|h%5L#X#w5K;k^&QjW2I%2nE=2}WKk8r6|La~aPJwWm z8d7a|mY$cIYIgBi1H&|m7(@L{<0lq~?ezWUnZr`YMa|-Y#gwbNCP<|tVS`EBd z5r}{S^BP|z42k2-PN(9Ch?_S4RPc}S+!xN!$l6|M*K&7jZp8{@+nTW7EihvE@zKoeYN6W!*~xU30fvxRQ@=)4CbPU#A1=GS ziKUIzQEK|r+1KjplL?k;>ZXAQ3ixN)CajREeU7w?Po*>)_JW2U9$FQn)O19NM!cuP zjkcPExqptX3fwaQ5NHQrweP~wNB8tdI8O}?5fY{r70CcOF2@2e_2}b+)G}}z`Zp6) zQ=$n-5+;1n+V_8Cj(75bylua zZk?SLGj^k#8#)QzQC!SErz*CQSIdmk)eCJxZ$viP&S=R%%L8*I1E$7=-byYc{ zPqW72)r?X^dnk+4CH9@``o^!EN24*a>b@=3bAx#0GP&aVH}ea(f3_N-u~Q2>o>7r0 zO=}rq9Y4mc_y*3*t(Nw4QZFXboZ0v!J!{k6C$rkt`y4e`T?B#ws)&pHbTx0)&CVwe z)H-0XfKP9woU5uy+TQt6w}`AMa^HQn{=KF!N?au0<1m<8 z9UZw~I|S8CzSMR)>x6qhY97KqbY+oJEt1FkPRx;99G#qbqv z8;!hnn5$Pl-X`KCn>=;5R2KNujoamTk-F(uzt#{$!1(I|+N}99QMD_5RqlAjd_V@KgTX@Vj zJ@`u%+9VC;dQs?{k{d)f46^ad`ZsHRF)V&)r z9)o_{5j+5)7zkP%TiolI0zz4Ax>thCO(8#Yi}n~u32l%6A}V0s9{>%fa2FAC?vu!q zIO{q99)ileSOuV$fXpNNQUFfxd*VR68Y|e`?SnN+++WxSf!hse%|H%;S_c@kSeNx? z&@SpteLDw-uBnz5K?{;cRFIC6oK~Guy}N=d=6_%<2gyPtgx)YvS=tL=)cjaU*r;KQ z-5gk#mzQc79`~=K)nAthM?a-a(A43-{iar~*iEDboFHBO!_YN0s0)BBTG0~S&<7Iq zcWYf#RaF7i4n7ox^-^K0vX+~_|3E>&Xyo$;8dC*>#_%03xc>C>C3 zC;+Ze;ltxskl2#9<%tN8jwkHQG=eK5e*ht|Oz>xrG5~EZgnf|)3)lI$h4)1o29rVO z0&Jgj1}PZ!&ufid!HRDa9=%imKoNPfT9N>iMl`0+*f|izU`~&@6!|6JxefaP1#(V;Q z=Lr$?3k)ok{0)fy1rSAYRrDu8!s%NJqqGD7giVuH*;wQrfW$$X51D$!XeTcxw`7aZ z6XLe*=-|LOA(M>~xA^K0o-0$-T_6@9983%Z4nKY%;{3SSHrp6`k%no)El%`em=GH z6c7yb=QDuc#X&Gk;QtKwY1A$5m;%sozp%Ui9`|ylRs4PU|NZg*MzHJ6A_EYie=otc z@chBu+{T@f+u7Oq-C*`_J$jHhwf%nr1zxhSwJp8%cnjlA&v6o@w=k)X9st=ptbh#_ zB&PpQ(L%VDYK7nY_g^1g^#5yDfIe@v{~&?AeQzieU_k)U!hd=LTFpa@E%;x+(O<70 zgz@lD7Z z&|lK=`S_tC9aK?wEoXJ0ii!YK$e67tFZaKp-8P|*NKGPH!<~4#>0+SqZtYh7o8Wmb zX%bh4W?3r&2r*9sVO51neh0<_tVV^>0lMj9JY@oM4z9GZ3{F`xB&C44lmUBZp^jFW zrT#bigoOD@Wj>D3PWb*Wqs#IRjH%TCeow=3OZ(w&Z9n==t zP{Xqlj=%9}XD5@Fi;S>k_vBZc+0EqM;HgH4=}>DaX43{mF9$SS+x_g@{HVVq0ZhVU zFL@`+b0{ev;}z;=82)63pdf&>HPF}ZPu-5>gpRB=75wA z1TXkbJD>Zt>iP!;BHq8dA3n7CRKSGsW{17##qIJbs}_CXZFAxHdw18fXP|u2y{HV8 zFtMKf9CAOYsfphiU}04BbRCvg0Q9(k{#nNBHm2H+0P_?e)-=Y;_E%39mtCMgmOUGDuBE{ba4lAn0@m> zZ{r729|GV{lt=f0IJunkUtn2Xaek%FG_a?b15#5vFtORo6I&&bb{Inub(b+8Fs;1@ zN1KsBe|&i8Ct9Rdus^o#fY`#5J{Su`l|p^W3*ABE;4k7U5`3(ITh)hWZY8Z{T_pSU zTZ4&XVm$V7r>(sAA2YSKW7y42rb9!K54XddQQKJ|##SkVb?PM1OKV~WpDHzRx$LAI z-^GvT9gyw|Jd5-D3gdlS9er=UbxZ`x$4O)s7SjG=4=9{Cj#s;9L7y++J8WWe7;>@>-yNSwg^s?PS?JL*sjph@`f(Le6Wy1?<8UQ(Wls1U zm3U6N*RYgJ3n)-`*YC^htk#)P!^Nh0-qP=I2HiKut9WJ9&_uYVo><-Cb}|Rg{lZ5L zBMKQf3V;kdgfRp_^oB>L4*(IS^adr>`stmS5l>$qiCnG~evM8#*seQ=tA3tJkRZ#N zX)XsTDsj%b`hNEEj0qq-u^UzrKroLc%ZJF1^~LS&FGzcfw|9Pc(B>}s_rx!aqykbs zj(}?s4n^3o6rw|Kya;_H5n;{@u`9V_z$9gG)^3HUrHXQK`f-Qzx)Dvvuah+DDOG|p z>%KyC%3K)lOo!lo6A1esKr=a(x0+n`#n=5H+|6d3l_-t0$8yOP5T76l`l`&v7B_ZenmHc#0a7RDdD_%n@*Cr%XM*YwQ${ z>AcQeXwf8UrUe=4TqMh&PV7h#(~=vfJwB*@d77=*Fc5Dik)n+{ve^QTs<911#E>d+HUJhT`YF#W zBO=*;7H|mi0b{}$Na;Z5m7V(F8+zg|X(8L4SgHVYKl|`kzzJYaFmxL;KejhU`=B}; zFKaf$P(Y((Imb?gVyQ-C_LL{{0oqxFFezcT4*eq*O$j(z0Yp)n-_bZ}N{KAWzdD;i z0F09|23-_z8INn%s<-!8(DQF^@;j6*rAH9F6UI8!K82dR5xV*o=HD^28D&Lu|Lz?C zj!#2S{^K{CQw@-fcY3PXA94K^-UCT+aG2kih_f&zY$GHym-Mxjm8F%NKdUJ_QXiIV zh9iO+JOCW6be-!@w-`SpwK;4Aj#sHHi}z>Z9$YCCriHt-R$ntZ59aVIt}jP~%hYT8xUqAT#f6(@xVNJAM+qM-8A}UR!35tMJ zsnV4yz4t1;BfS$9MLNU9qu{m&B3R+ivS0t*E^$euS%7!v$-3UsbQJM@{v7d5btnTAbKU7MVSK7cA>Bn?c&-0nxEH*8(nPw| z;>V;xiP|e-+YG1gV9flflXZ3pN^D1yYB^a@ulk88e-#D0(3#m4plHq~M_uA*`HV=mwC*J4hbU{qtO*$L^KX&z_NZ4- zhB%qczH?`Ej$1xfHV>X8b7CBjki00~y*BQ-ZZYxeS*%9&j!&JqQ}+puO?uiW)U8z} z6VWh7(%>MCk5)8irQkeB{w5Wa^*l_Q;#gf8}TG zTa{2u*EsZK{Nha(XX(uSRwPYN*UoM+lRcf!rm`Bf+1l(*4$*AF540x1&N5#T!=~Tb zrGX}IM29TCzg+%u<=h=O6xCMhcz3gSp#h=${s=d=4yK8?bviYxzGYSRjRTU}udLP1 zyH88@!+h;0@hd4g=C<**7FynG5CONFjlrua@1~0>x3icqm~`w z?lP|#(H!K-c8Q4|noQ0?XbLTYY&UYswAbpSM?zc=sJsFO}vive;i(plb-qgKYcc{bP`A$t7K4<+>6 zN&*zWypn>`N5}5jrh%QM=q7oK@i-vp9I`Nltcj*@@zsLc>>f6p%xq{h`HTpIhCSN$A#WGFk0J{fwOnCY#V!#eD+U0@_k*Es^@X?mw;P z<^F~{+Ni|{{i#?!v)w`^`rxJvrzg=7h@CB#EFENrm1+Pgt z4PVy(4$@nvn;U-mFn04nlA}Wkg_|-(Ksg@K#-r+qKuuGrEjj#v9~bI9cjz0IXvo3<$`r}a*g(s0q?wJKO6?lmRb)q_yKD-syS)r9 zu8F$H(w_*_e{qIs+ zK&{X$z1ND7?~0~)v$%Q^g4`G| zk9AJHZ^M4fmULas*0@2!?XIlDaN^i6{mt`@R|-DQ5AddqW28OCbfow0kO(`rFFT7N z2taZRYQmGIk(uJ3;{bYofG|BA9%2Y}w#2Jsk|zDD%%@ZMbZ7^-2gg1d3L-Y52I3!0 zX6e8JG8HXhF1vj>}VSF`efkg$CHL7%-_Dv~a_YSLw<(140Xv)SWNR z&#S1-s<$dsx7&7oguxOXa5w)2C94@9k<|Ns*&*10)r%;LMs_8mn$j(>-@^ul>kdLM zEUZmJht#$n+FNE(Srbb#ll$)Y4?i;+vqOe#bVNCD)+U%96<4=W@0Lvujm$1D#jEso zR%MWh>9qf>&f!ORZTy_1ZSh(7m4G<1@pDB!iK{|qcr70C~2Y@^$~d`P#n zmyfRwdRBH)vhZ4vY_?@(mQs^Vab9-21+%{dA}F^!xr1VxS^rL)IzfV*Lo|bnf?l-P zV0&d0Qq3gu>mL#~o`N-6^XekiyBn=@lG#MrO8L{K?`wE&xg2O&43?BC^Q+4C2xkSK z7=rD0#9|%gIic`gVQ;HFm^uUTtGud})uf4f7L^??XSKG8ZTfm~T=}PVzvRH$azsAv{PV>zy z=xFx9lukMM(}*b{ubCaFikjF(S>)v8@UE+VO*dVTCeBG`>-?!EKGXXOQ*67m3|`AN zyI0{wq9=4x!Q)XX%Nw)F>2_n5!FCLWbM2-aJjpz)>uplE$Sm26wpo%=~wE3{Q{$fkIElaP%a*#t!~E12FAnS_=i~E-xhmaY_t>GQ7Z(gQLJ_-T|&s4OQ@?iTVY^sY}`+|C4$6FNJFkD{X-AX=Zs+_9GUO{H+ zNcYQ|)~;58d>Wiml$tylsob~nj5BYV7PGD$w03QzJ*)fifH9bL#V2rq^pkLnn}JD? z3s4Jew(2UCU{%Ep>;38P`;ZOOHPH1vpVHh!H*t8~*Zjq$DqZQy#+|^ylfs*YCZB}U zQ*TQM&~b}8(yBn4mXB=Ct{e0>d$6cyzea97KJLD5Dxp_M2{ALV8YC;zzi&VKWg+<} zMa0gKJSE3l9{+Uwg>x}~Rm!%8G<|nJZ53#|DH*hf-mSUckum<(-?l=?@w~87QXE>a z>T`qVG#!mo_91Rul2S;LaR}HQJ|whHFvk zgh(hHBN5k8Lv!}%qq$iPsDz5!9FNF$`+urtqO)B^1!iOW--Df#P<+|2!&k)x@})r5 z&caI`pCC5SynTnusqZ!+3KPrSkrBSHQ8>@L?4^IST1=rS{qN_tj)E)EgOfzhv~RypzWx%lhd>xpB-lFXE4xo2)$W{-`-*jRrUW z(w99h9iLc(`&5%JtRwj!{78@H$d2r;MLiL5@q>4e|_857>i-aq0}xXh9c&Yms|B2Bz82| zU$t_y({!LIFq<7ddwgT}tOXI&UCBP?4LYb^YiY?|XG1U^Y+2dP?qR(fQu?kko^WFFw}|S;U8UzTM=mFs zD=|BXmW>mgC!JqKH+T=gek}}K(241u=zlmFe*&%Bj{InPp(dG6^ow^dv z$%`u7sVuvngSUbqrOvMf!5rWu-U^zOy3*@wOv)XCSSSx?b=$bg)zXacRKZaL^L!g@ z-2k8uj8WnIuJfD^3+3YUQQg9Z6)uE{I4AEJEH4V?-1fLSV$0Q_(AB>wL?1x#A9~`$ z1m>9ALZY~8xQwgeyL}04M@32b*GE|;rpnttPI&E?NLp#}}jPUT;7 z%P;?e*jFsQRKPSG4l_PkoGKKt!10k?T&SGN*!Pq4?9d^|vzvjAca44HG~Yq*@G9D~ ziz{yb3M22fpvC>kHr$;Uxu(0aheE}jur{}6Pm9Efey?LO;E3H`U-#4VUgn=o7W&dC zq|?(+tIyxDgCs+nsKjhO7)q0J71zY*lJ?!MoqBItMD|i|E;RJxuUN-z1wx2&HRBN0 zT{)C!U^cruhBK#`O?|yjQZk&?bYhiqXU+_iP+*6>W+H36HDV&L-i_=iyic6OYFiw} z)9M8)^_V*8t?%Gvb->cxyEC|9AX$I%Ln}?6pUuyxogzog?D>c-Wxgc5V2&tzj$()u z0FiWSM~V*mtPNb!;4u3do_v&#ns~8|btg`YA$y`KtG~n~s76Q8ba9f|w|&jF>>AhI z)C$v}buM|LqP-`QWuTDu2#bwd>=776%BAluXS|Y2Kh?7&&nNBk+F{w_eGLFLG6%29 zO7ynsJ&|UUkogyrF^V#@V_byJzHY6da2_}Po!j)#!quaCm0HMZ@3{NJxZ(J^SwV4q zv$r^7L}dO$5`Y?`cO#`OJ08J39HsO|Khl`Fx2kJM0~6 z>tZ2kG!^|}la_K#72hKx#6I4t=Ib4vaj`2l#+CK{-jOxQbv_^i>MPn`Z%Xy$!)OD zNGg%#%K|7GRz>@4?R~s-6Q@SEr+5-FX^UF~YSC~Ql?S}j=t#0z414TtY*;yF!-lXa z@GP5B9|ugqYx!=D^6iz)p|a>O8@!}Xhq_>IUVCiuM;k48;5Vl3{)E@&sHGN)&{s-w z)nF>8ytme?BM{EEYkwtIKvzH+=@|vU0L_&WBPZf`aB`rGseG|-oE-iFnm9PS4RgjM z3c1meE5%g=`N9vQx#Ko-td8$NuiIeZTabn(p{H@(WX@&WJm%V_aKjLhs>jKM^CvFd z&!1Hk?^kk#o(b_kjOxu|?scj7W zg;rt8I83nzIw%x1zUsQZMlod`&>{YKFVE8=v#e%uPa5IBZpYtnBT`Eb^uiXJ?p)5?k#m4Q^t{smq((?8SrA+=0a6@1_BBNTD$4w{1FK4r@a zO*TOjndFU5%H)oR>l?5g(oA=LbQ5|)c6pJUIWFz?52mV3GZ%x1`)a(wqaj7z#|PQD zGez)*y*iDe9825JAJ_uczU@FCes_sP*zHToIy>M3iPM?nMNED9j}vR792d#*Sj+j6b03EN(~JE&_Q4NDrC)?L3gw%UHp zIq`)L=LZBC8RF=iPH1R*ar~v8i`~=7ukWwM#-2BGP3@(}>ks?n_DhN-<(49*%qm)~ z)GDJgW~>FOYx>KQb4tqx4c@yy?Cg2G%2;FMG^S}CW*|qa<5?nX9^WH0QiBgMKgplO zj9ha@y^V@`Sg6SJDA3M850BFe%U1|5iH>1@K6t14P55H5)E4nWfq4@%$4QAs%GfNh z8=)5B(DPM|F4KHhvN_BU3jM}Wt6|Rr-xE+7dV>Lw%k|dkH?4VeBS=B{_v_}VF1F>Q z0LFL2E@}NFn-*XgZ`uWU^A|}!Bsp6}NCf<)v`VEVj`Bb9leotF<1ZfXk0raLpB%@( zqN|kauAYrNxfM?y6s6j*C{Y@OCo@YiUERR;lP!!ahaRc0PGY?*$b!qBl-)ll&U};p zwZCtc#bZU_iO!#zK zB}~ft@PjQ;c2NHA@jJBdD~w2KSdn@@A`C&tyVhYo-mr($v?cV`o?iw@oVSMQ1J=Eh zL@d8@!4AjrX%$que0s)CHp*4xj_MI=|HJ~AFrR}z3X7J0{oI-G!HU1t#N|33+Pdx$ z>Um^{)a2_k zRgcPs1@%}WX@4s%Yeuw>+T7iaM~K)K>(fbv6)$>Y9A($$r~t<3e#*!t%^m6@qQw@R@Ys#vJkM@Z6$8>&S`)sx=2)73 zJ(6V4cHTVA4JZ<3u1D2M*MtCCA9r$-32oztIhb;8lTcw@Q+tEK?=liWAKk3WU!;Lf zqGHA0Q6ube5EUDN`koww?HuX7TBlWM2~R>lcT${?Faw|=qWWI45L5C=z|Ob7VIA?8 zwsp640Fmk^-#khZkV%TXiNfK;6t1UZf@WOS zSL+ujpR=3VP%;(gbPMmTB%UZh_!UKv>Il{XQ;gzGx2Yt_w zkcEk#+T)8I9jtf^orucb9(I+`~9)%IE5^}}n1Nt0#X1HuNVz3UR~F8VxL z*BsyGbMm0G-#o_X8(HY2U1l&)t7dEJ%qnzC-IMcefV*85D|P+^wHS5CYB8yX?tS-@ z%5d#}>KXbZfkG1BIBg7bSgm z%kmv*WzwvaZuPs}v<~#n5xlfr@uri)kFsH| zFrlgq+fERo58rubTzBuw{qD4MeFh>P+ycIh;>uArV%*81!si!FArfo4Fx{oK< z_&inB?IuV)Z=d5WByV5Je%@b?!LdX;${^nkL(SDaP@d6Olc)hvk@B?s^;rV!wUzu~ zI3;j=yyGz|z{2G~O9(t4sX-!z+i54)ef_SOR3M#hBDKKd`?KxhiN5Pc?Sb#Qw1bBh zI_9OJ4GY7OVNHatG6n+YgMf`~y7e!kha$M3lih^p)-uSIqkdwayZeh%DI}$gie5nQ zb|B`(2z(EcyFy=Vg#zd$+aqhcn?i0qPR!Tif%fX&|k@rXg1ivW}+t8CggA)dk;-AB*Esidc?F!nksLB<)7 zBi2=^%?=s`7o>odY+u8`y7U7XH#j}mZ#pDx<LBf1AehfiRArK4?k)^p{z_E@qo1sqy_S-4oMfYn z+S^BHuVlBaa8j}`TeHNZl;=Wk0i~ryFRhx;vj z=i84g&$KJXE=`XQ3%WRPgXYRb6v+mc_bH9c- zOE4YQ<(HaL9y?!-atWW=>iD(hsjg~K!BrVT`b{9?k_XMCjV!E26JEAo*^SZ+=;1D# zqqIyk58Fl^Pt-TJelVSR^|3)GLhwvv_)++TX>)Gm)LmJy(uXC@#gAj%rs(` zMQj!FJ@Gh5vN6dndNGk}Ifrbj{bu>Z@cgYkms}MMm78i>A~loGT3V8}Ito@;Q4r7c zRRf3%@%wX3vJk{;OZS6Xw}sB}u{HSCrS8>UIqf{pZ|kc#24}k`A!iq@ERQCmn5G){ zkQLk~Uw6w)Mkot2-*n9y8a+61JycM`H%V4(E*(=y9*h#P@n#iIJmAKdkqnsk-KW@G z)|}iKB&Nd6ni6J< zSULCBM}^x9N~J-jFbb0NavRP9H;L~(LB~>$+lpL%B=NMcW_F3gJ=FD` zfw_sHelTW}3@ZId_fe4@igY0QE3JT{{ji~d4fan8Jci#+o*v@c?<0L6*E{y1>}6*% z6VDw_44dA1gr<^GtjY)P+`Jfuoa!%13?C9GF7I72I}(&y8@B!2(N_S?{80E~-L0{A+iSgA#8S{~L zGo8uM4=^Ku_w<@N$h-n(q{eb}*W0HQJku2!7B-;z^zH@B6B5rt8>SG;*ZIBZeCM)W z4VXX2!hR3W@ofbEc!=_TtaHkk0RHW4dvG;_vkz}+Wt@I=N{`$^o~8NVlenJx%JcEv zJy(f6(7!bz_k8MS)>?D)=a){={$ zSYx0`&|?_o=%(-vKWJ2AViL`%uHkDDexaQ`B^nSVF=ftt>sInaw2Jcj{X$jZrKM~7 z;&<84u~27mPUGJnv9-=tsL`z-ZS~nYN4XT-S44;KGCpgtpR9e*J9sm$g4gZfTc5Lj zvY0kS<<*~R1)sIr+!*2nZKJl6{0h>GtR9XYE&DNa(-tjbpp&AzEA-56Ts2*39sd)u zyk#^HQ(b4h3ZZkW_fadJ*g5!e0#1B&FmXRi=T-P zJ;u<8P#Gz&qdhj(){$9aS{`-5(>Q{8W_z8rfQMsT|3>{kU8%RxqGrdPGnq+bDV2S9 zxPx(!W4}EM8$E}USV~0l>gtvRaqP*vCu?c}ywFE&q{kVhl_*9h zF?N}fN-Vy%p&gyqEc#06bOs~^w=oBey;&?OE}|`s9|P(>8b-oHSJx6r(Y;D`IVhpG zfdW%wVp#1`ZZ-gpH4IM6`J!6vVYXti-yq(|GGy~86Fw!n!o2S4;9%mUR*AJ?aNe@P zcCX>5U>P?k!B@g8gPb!vQz!F{(6nNO&bm&onS(H~2A@d>EkN^Nfm~Wy?;lUrl7GbK z{DSlt`W}}Y`TM-6^1|YbP1nk#+!dC%OIKKY!Bp5_t70viv9=0&TNxFIx(Ya;L4Cir z=k>P-HI&z581)LN3I{KpO@OtO1I1nX`S~727@jrsHJa$R!U%m2B$X}Jk z=V0FZ(cDDT?GfCrs_s@BN@VpYg|Cw9q1kOPR=w}I)O@~@?O@x*CFy308r!w|c42YwCX(%lo9y8y(wd-EPz}02M z<|iz)iO7t(G);eaBX|P(EL6z$C)C^z|#&}Tpz zC(30|(_{vA|I=Nxn}L`blF<#Iq&v|FmvT!F=o$!AywkJqEcfo7p2u^HyDJ4NG7W$9#H9EiI#V!XY=vN^BwIs? zxC#2p;h_WM<4mJwp-Tzh0xxHAzY*aElySnTUY^%a(iej(BX&Xd_2s8n_%#SA(XYeaCr z>cQk>TkQi0&{9K5@JT%)VkqrY6F5QScT#izqxRg|}s+^JH2kb#7 zy|#vHK9&~)dR!#Tp*;UEIq1MT7LOOTDmdy-^-T~Rae7<)@rfwCSsyp!&CIw)`093C z;*f~}o2atLwHRHYvDk4xX+*AJcI9LW1{4Umf67v&5cZgo1ZtRy#&v@|>f^=4-h7Q1 z-XXi!5qc+Qz=-&L9TkcPxjw8&4hh=dEAbhhNA}*CzKh-%gvi5WHBhOW&foO6=L`qmardm z(kB-Q^%lY_PV`bJf0ThMu4=uqCcymAp(2H0D~neE8bMS4cBJ8_1aGxjR#K2`zgM&m z7AM(+FFO7h9M!V^7}cO)hyB9GoBc7k|Es$KDraj18qq@qqf)6HK@3U2$NI)hJZlRs z#-V&p{N%B@!jBjvr>#KV3;)Cdj(=>ot1VFGHUz(2Efb+5*>;@Ro%|rP7xiHl_2mXH zklc{q_5p|doT&>wnVctR!?ar2j@lrRyzmhL7ya4qes)}I>yp6*IFSxXflh5>&EKM& zQ#HxLn|+yTuMbGOUW@8>uX%rD8;nFu)|04*q5@!fYs;{fBP#b*HnKK@aY&Co@2XU= zlY=9egU~IM@B68b?m>N73pEdMWi}X=zE@IjXgzhx1iA?p+shwx2H*cQDLH*#r^dX4d-ln%A1T`IARx?DCv zd9+jtvp_CwrILt%guj_kF|Wa3W#6n=Qw_M?j(<&9a$!r;TKaa$msbbouF3_=zv4<~Ka1N&ibV0{>WGvcN2cVI z_Vzd-M@u^x$mBTmOxOEHdfq2rufx==4n0&6_{xh$$Av&8?tLpNII11!0c~Z^)iCg$ zID~!Ih3~m{w~k|2vcj>8?*TL7)8mFw6J8HDMsUH|7$l>Er>7~Wv{7EaTn0p;p&p^L zV=UVkrDe8E1aTUUmUt^Bv??uaAK(_LmEOBQnaxcc-_?%&dBqctM4tq!S(Rx~F0=-e zj-}XSP=gA^?mT^79^%#iL|=2Qq8EhVcr^F3IBL$<#&214|SF`N*xioK$4i9U^3(ZWhnuJWwJ`3fvobb%1L-}o$ zCWZs2d60OBMYpb#1N1m+E+@$tq_ZABpnAAm&7ngZi_;81MY5D8)>cX2)Yjdm7ZN0hF!bOc^Iycp5m`r^-K2lYWU`iLpBgK`o@}U;w5)l+ zmLB8uR6GYazqw5#u6EqlF;%Jx%N^DB?^C-dxytQob{sx`EfdK_b3L$xQ;K$yVq)ya zV$Z-p1;_VLVPVrmt|1@d@x5Z8Qg7hlaqnUNT8%=jLAti*Pwws{f+9%;WG&l!o$_8HQ&Dlb3eV7E)a$5=-dRA^Z%j_eKv z2}|D0uqcMzPdrnCwaf0giN}!rmWgSomwJZ$K}dP1&*m7%q;!bbV?IjV>VwTTQJ6Kd z#d(NiZ#_vTEZ}N2Oau0sGf94`?-jZJ@^VPaMAl|S_JSs4jcq;B6?IV_UbhDgLtSM( z6rUafH>j&g7+b|dSm^I=qYGw#)= znVwh8n?`AF^v6$saY!AX6T`QltEyS42_=~o607P4Y11}+<*b~U%dU?%wRCnEVs1K7 zXs1z*%WXn5#Iivvi4rM6QVlX)Kev4aV~!Vhjr1{!b7(C9@xrDOt;mDl8mu&d@=*1l zq&+J~`SYmN(R;PNAW_KD56?`FBu5%5uF8^ASXfh&`p=U340p7~c}*Ts6(X3K z%eEJNN&9qu?nVB5;X2V5wuqbD{d7q4X8kS7SY^G}FzLRwCpS5$Z)+n0dzC)0HXtqi z?7;riI!A+i7ezO>aszMQ_G{xXtY$z*?zb2rJM_?VQ$Onwu}247LI|O_IwgJd$l*al z0Z^V{zqrd;R;#51jMZu*=1OO7og)>@V;lYvy9J$vbI}!0_6#F*$cc$WNg#)At{7!!sp&E!Fw? z#vP_5rCS5;3_91Ve$c7{xzgbNN+x*77o{NOee^!(o#CQKg|=9G%LGDQ5ykJ-6D;IZk%RhtFum-tdY#d_)o;|$dZzm(9a z;M6ZJzCWgYW=2iiLo_Evtu~jyNrmt$mx#go#hupAY8-Jp_3Divc(J=v{5nKx2eI`+ z7A|o<)06*F6VFehU2JVU(x=;1$i!>@ibYqymdLKgU?5+30EP|Y6s5E@4ToVj$>O2~ z=xz5`B@QO}S)~hie}G(>2!jpk#Y*?1N7m|AXJr{`S4WRU@;{}132;G$Vsw}5cF~e1 z2Ii)|+oaM5o(WyaZdAK-^I&-0CQ&j)IiVVp=_lP_t~v|Qn-ZOj0zBx8$XJcGY9{f7 z1XAJ`nd8@*n`2C59LkbU zramml%asi%R9E%6*7L};X>&?V1Y!swSVNE)#O57RK>&uwZr;1HU&3^#9T$WmaQYuA)$-+Mh@zF(#T!*j+-1pi`!8m zTlI%xjZL6WYs7u~!-s z37WoZef#ji5;{c^sxV2J1|F$=XBR?aAhvLr80A)1eqVI-#e7q|(A($pIe^4FV0?sn z7MJi!;i?uXhckta)Q>rd;u zzfUPqWj`a~M@h+k@28NUV1#D%aqoIqVMu*5yskawbvF1 z5{HNQAeEr*9Jtk7(L^eD)4@SG9rD~$h){LE)N|E7W1Gs`&Q5peuM;{$j(})d@m^T~+9MQk zWzXR%xqo1AH;4^eBsy?}u9`8WS~W;Su<;~{^xz5M`L{GL#s zeGW#MI{@ERp#v@Bp+}3(P>d;Pj|iudOzlYyl1r2(47nA*zD28dm0!`|;szMUS zZkym+kaaW24h#jYzxE#&&nJp1D1y%}Js*&8Da6x>-Mp zcXCI3ePD{Pv*66o%~MG3(o1A=b0luzu0NthJM8O`qO}Qn$x%L{u0ilXKkL6|x4bhMMbGOr913_?nH?<*$zn0ZnB{ zf;_hP^p$ZVMu-;aBWLxab=BzP`%81SvOra)h+^+jKILnOL&&dLf97*}mGY>c%-Sn0 zs;=-!yU97}kz?cD_b%8^8YDL2Sg9LfRNmiS8UzZGhFkt&5wjL|)AjbjBaFccnOys(Y$s9am^5j1gm zT)q3|x39um|30tCzwViL56w0^-^tK)GfGxsM_-e)X0bppfYkEdW5 zRPA0hW|SDxAy@U-fH)@l$SZd=t=xpS#Q0A!x1~9t@4nMpd@kLDf1?$y0H{DLpOzOG zA#+0GwK?)kPs!c*&o180PI5*&PYDxMFQ333p)=Ji*88TJh^&{@cRYv$?&#dw(?hAisp&LS8NMH?Xl-yvSW0wv~ocP z06>MgJDo7tW1Jz;);C7>4M?5 z)avsZto%2P0FmaFFb|LV{}L!-m(H_1BeU#P#H`D-ZA*5ky8mY45A0&I2s0y@m>X5@&vEEEa(nED6z?_a*_mUIg;tg9FEl4G3nhB|8bn4~>D-k9HQ{0xLnYw~m*q(AzgpJU zEtY<@TOrYaLj0`US#C;OL+yY+?tpSlQwx=4fak8IdZ%R)GuwjrAFKkP4($iPG{m5= zmM8lg*E$uF)Y#}=M5T~q`|J6^_5I|{Hwd7z=WWLf{k2Ad11EZx31+&Mq&$dE=sR3U9If-n{@mJdbsrAK>D@$#F`f;g`E` zGJ8(Y_(u23r=#8dI;bTB= z-jmYuGk9~UN8Yy5Vdbud{X&`Ng_9idw%s;m-~I)fT}9`D%~3oJzA{o(P80A}3zm)7 zaSVf=_2T8`?z7?F-QTaRs=EB=DUZ(J+;)c7k~$1X?lP0t}fsNwvv?8NC4mydjm_mfuizzo1`)K$2$Ns?X+wcmZoXxO8N*= zSF01HNo2H~W9UXtseGX4*D^H};|G+-H4_(#lLK_~CyQIc(T~kb2@NNHfoRc;017-a z@KfKTaIA`#ZYKX$``^`g32guFFa1`=y-XjP9vn3@a_cvFu3CQOu6H1v`pD{Wj@Jk9 zJr?lCPeZVrvuDz}Pxp)ohk0JlpXb5>i91!gq775iO5V^KAs7Kj>6@IG*>He)c9=3} zb)H(XrEv4E=<=;V@G~{aX#UrnTWw^lvxl>a#K(fpNGt5YL3K!pyB^FMu|^~=hDWV*-k2x^?+$|9&Z4UWt3+aGS`VxHALZGT7?sY4N)3BuRi$ne zVvT3)?%s9~KXe)=@a_udQ2jQ8lPf+20`mtJM|^cPrNe;HmW1)!O4m?^ zM15DKDd0C491IsOudEc%-u3*mOZ+Csl#^UxV>X*7w2+nWF=8q!a}_Uk+ko%a`s#{1 zbYC!gxmapA;PA;usEJ%$n^i)stE=nZyLmdLHy=^Z(4+wu)hjvw4S;k2@RFo&e-l+t zsv>n8gFl@Hgyn4pNp__iaKBbW61r1=HJW_% zr`V2DZ^(auFuBy%NB}I)pC^6h<;HK-e==Y|_V<(1OK5%tNIo?Xh??BFw-bN<-Jfsy z2J%bfe%p`#+xpCZTXUcOo&PxAB>Xlx8(O0L_rsT?zs)I&0j$G+T;THCxVYYY4nOp93t@`)4p`dW~OoTF!z5DmGGgeH$Z#H0x_*XZ1`rTbhF)=Z@ z-+tNuHU+#kSAC;9|H~iz;%Q3I$Ow4(20StUZGOgz_V<}jiA?_M;qhC>;7{KLj*N&#>hCGn3zVUu$*tx5Fz5H%EuV zyz9R=tNEHE>zQyE12AAyzuco{3^YG`R~c|%zsU^1-(=Slh)=g%wR`>!-P0?-EdH_N zZR~g^RtvL@2R18h=l&Sv0T2BVcD}(H7(=NY52q;s+|{%0f4c#nKt-(<=cT*DHVkN* zVk%O;+t(_1J>yiC{)dCaX94{QsH|7mCsFwssu00FDZe=ZEz1GCv&%3mp<3^PmJ z2FML(zW#8;cpV-d{sBV#Zr95U$<)SGWKEw=&KK2sng54a7wl8^WPJ(p!a znck13^>vz=;eT=fFE3v>_islzvoMk6qYs;O`#qGKUl$B5y%DSUJ$?N-3&5ZB(RTt| zmTv#=>FJ-V{D1MP{%@8SAN2p1c`3bir%P1+qGO=OQ2jO} zvD}tlZUJBL2?RfbFbK%sSmavOPz z)YL43jcQ)#gT2%Wp=O05g_s4q2W@m!n}$J|CH;L3{fDi?f*9?ItPJ|;J7MC5;7gZ4 zq&+t?wr?|jr(anxRq8j>e=oLUGK>g&i}!i7b;rg$`=2R8wfS^*IW@k#alO4to>eqb zW~Vl*)LY>*wWiEr9$eLZ=tDa`Q%0a7(?c^RpDcDF60kw8ZN$H>9HPk@F{b`D6GvkG zc0%*S*Q%c-C@RplI9{V1YuwOZi=QuUb{bIM5Y|(xB%R38(@kg0?HNwELVNyOqVnj_ z;6ml+$g+_#cC{OP=|dHj0y@14jlmuy65#&S)V(sq%LpNk`X0|?tcFOyeDODZ_~S~p zs}!=aU1g^=>~9}<`Qel|_U{y5&d$Rsqy>-|^FJGE-^#kDh+Bre*qXnH z=^w?j=31#fixD}vU==lWBPTtR`lg|a2l?0Lz?hwM*94oc14)%$q(BBP;w zh!HO~lS`>w-PD7eQvLT2#g3Lktb?-_SHb;g+c;kxrW^<1s11<&J(7p*Z-7VQO?GS5 zCFAe^a=Okw>PgRXx(;*3iMJ)fRRp|mD3^;WjIxL6fp*$kci`tttYnOxWJ;5Y zB9(O(r$z3NEo(Hgvayxd)|c4Amd+?xX9cqucwMOUqCPs~>$G$a3@u%fkqwIH{di5x zPSA*d$cJUGwWoF{v?-&R1_+5#p3mqo`pZB&^D@$qOL_O@Z;IV%0iH~My49oTvXSg3 z@#Tu2d+*9B{_crm+OsJhdWV5y8Fa>C?{mK<0Fh3spaU2 zDeAH2F!U`~7@#D*lwO%eS>R{!*bK{vd{|Y|$IJh4ctMC2mpXqabqy-5?Snu0%=9aon&@Uq%_D1%fMOMPM-6mkkH^NY(@t;9=s zAqZf&OLW!1S9U)8hw%Lv56m4yQ>8D|ISL4FWYpbViLRuOx4^yi>VFCOdUx`^L?5=l z;V@j-(}5DAqM_DR&tEp~JW%ItR9|1*olO!rzKpx`u5ss^8dMOv=;)54z3t9(dtgkj>E5h*sb0X!Meb$pfjj)Fj&!>}{|_X`tAh`Or8WG8LK}^CCf0cQ3ta=c~|P zGpkt*Hb!f|yn`aI4dvSXANJlmtjVnF8)bAx<`Dr$1e7{b6$BKdm#82pRch!FsnUCp zP;?X!5Ewu}x|D#FfRqqAD7{Mw2m~U%1_&i20g~@V#dn_fJLm6nUFVwn59-b?tL=TS z_1kM@cB^VvW#X?Xt95U#cuGlD!bICAU*41zXDN?Nv?yK?=h1MUFZeR73&CP8Xa6d- zcaA_UgHoG3u>0v>K^zQWErWljWnGQE_#nQ#Sgu<(HoaBrwE3tH>gMXZClinKo&UOP zG9QMKa(I0&_$o`=4CUDdkBrRis!ks-C*C!#xO@6;8!5LUBWK8-K63$Ht3}dfw)%fu z)8)Cx&^72T!@;mAA#w3uAV2@Mh~D>CX< zdK5lv;z><=-)HHcibczB*E-;qFUxrUY1Wi3<<}v&acoDPX#j5+Ia74Yd^|K?OuC%G z0z%9h$oHnESJeuf1$;CHbZls&UlSzte%H0e#2hKB0qA5fi|hSLC?l7w_~&$2?@w(O zNk?IfcG>A4>M!o=R`HiceUK{jHz-{52zBgu&a1|N9+vG>TxORYNv?+H++PS26Z7h0 z^KH))T(zTXotoiQ3nkc#a^B-XmfA0O&SZ=rTxO-5m!aAVXTlC@*;mr`0x#h=FY+27MeJ;kJ>v{@h1Zla1RNxrja4U+xZP+$uI$+>XlEc)MdQ_QS zSUGChU)Zn_QXG`MF_iRRq*Pyr@;NIugFyD~cz${uf%OqdZfsEt-F8w-xxW;)A^&%@ zt6Kd`Z0u=H6k%Gg2+e!hq5;3-+T@_^`*rKK;`=iEV|s`O|0-(lNO{ke&Fn#??|hi6 zyM7g49YfT}u7JQKK*|{}6rs!C z8V&apan!J|cZ=KmOF6+&LJSFKLUviXQcD_1Y_kU|l=jK_DdUxI2VOr~;LYI~XJW6f zefH4!;|7gVy)@zdJs*303A2*yKlV%MeFckl>~+%9OGg}|I9j$ImTW$cBUkZdHy|$ibm6$_)%MGq;*Hg$UBZvA28N;^JT8BOG_=;5`-K zq{RU(EoSvSrpueku8(Zq31?19*IaUYM3)4MgpO!AH-=7p8V@J+x{qa1NYee+`Cw<} zxaLA6@})3)1sNY3qg6(#F|2b5e5?OS4e;zq{SxrJgz~Z925~Ep+#53FDWa4dUZTv% zwTf})NZzQk&5X18h?Hx9nTo`gNUj1;bTYxi}s81e@FSgk%&X z^U3uuSK&S{5^`5di}2y&ZKfKv(D|+B-e4(7!^Wt;RFIA$XpldjBB>{Q94;bYRv6-C zFF$;G{3wUfH^DBi-@^DR*iG@G{%@#wOP~az8!P1)A8vp2G$R}85RBB;|ja4r>@W2>5)GA zJ1>7K7#@yNc9@Qz3OulvnvRoh6dcoix7O)^UX%T>yg-zgoQ=;#CmJ;UAXLR9Ypz! zr$I^)a{CsS`CrvF>11SFldOFWW?5ue#Ya1+8LaYq$35R~`-iP|;XA`fskFl+(dH6oA z)#J{T@X|>AqB-WCquyP|rJyHv_K*FN3=zxdQwDYen!Ojtv~B7cLu&k&t=HJUta2h7 zBu66fPYVTV8R^$I*%jVKm#!z*(0hb>LzOtui|y=5bxKV}+>chxv&zw0&Q-U|g|U|r zqG_^{(+ zQDvw*8a(3}E3)3iiNCI<8q0v2!oh3u57U#=N=6D3%(O?}45Z5`4qv)fVC2f7%q!-x z=BQDTuM?dvoPWT`eR+M_Q?5x*CUAS67@`M92AzqfbiW8Y5My?qD4ZQB@CxxnCc8w4 zjhgSMo7Y-hNUteTF;EI#-6g|%J!{;3$tkJjTtv1FZF4T(btArsxnUy{*O&M8aJWH7 zQnyA~m$qwOZ2C2=45i?e^RuvRj5B{m(`I)OG96Za)6$}_0tTswGe($Zq^5nT`8X$} z5%o-aZgjb`)$Llkg%i4YwnN=kB)9^}gdG27P`lWMIPv{S_Vy7`PJe99jTjt?CXYj5 z@b7tyebazY6l`Q<#K2qHao$U47_OlhwlI4afy#G+OlsO{pnumZ0PZ2*0Br*RACbMz z-UZNKO){t}Eq^c%v|11c``?ei+=ln8p2a0QJ6dIZsS(>a5L4S**0i-AaDCEfJUOk4 z@uN4Bg8GZpx$~xGyk{5vyBK`%RyeWb)zdeTZN$Gy(57Ej1*%Gn6b?pJtVj_Rarb?= zmO*dV?(@3}{)JqScbs%GRtR6l=-H1__yQId>%C~VxTubj()$em>z-~7jZWdgSNCB1TDNyFN(A|0@{2vc z{uQr<{*Syz76mGZa`%m0l`Ky>W(U`IH+#*W&df4{5mmUgi3UEk93)7E!{fngwSGaa5{RE8yd49#ll`k(smU<>*@sWax0Do8!C%Dy%(P9 zG8K>hG+vR;d%7lzx5gBH3nVWgk9ues?yG5A#^Hk;-A7qN?4Md)(bb{!F|TzcZLgCb zV7mdka>MPQWO|5AD8ZALAvrlyNK$y2Z)QuF?4P{dc)b%m*Bd>>$Gdw&KV!BB2{sN>RW(wSA1mPs&P+)PTr{et1Ig0L))3C zl5OP7{WGexg@S^jf;4)Hy!-oblxg2%Ffw-{6=aO8vSj90uUyAC+!`CZN~$yo3q;&{ zy3IPg(jVZ~Xb*7iy&%dhJ|#>f3HE*|&}jPOI9kow^7O?_Ge2xX8tUM#Y=Z z$R$UlrSp@+*^vI{yvkEGjYk!22#anN->v(BD&_2sPae45H=KG1zhUu!9*P5vNPwg& zhTT4Tzagt82B)$)r z8Ch9D{$b;4&OKk71Unde9O-o5=76@=v}Z}X&v#n-hRl#YSE@-VpDv<35R>dJz{%W$ zLWXOxzP~Plro&gdVlqqC8ZNE9nA40J(7G4yJ+O5jE7B@blA}Ag7;)2eh?Zf2X=g5; zuFKp_NJyu_$I-v0VUseL;Vd9&IPIG9?&fEmJTHi+U5oI|*e+j{!P&>vW2WT@%4x5+ zzkW{t+hKrldMq<4BHm4>S9EH_qj;1>wAZMXF?XVhxTak06bu$G1U3>MyT&07)@x`l z;(hD_ztL)Gq<0?gO|KnwZQ-_X{iO+p{k^DjMpAkEQp3fIhNU^fK^yav5($fhBq<}# z$pArVeFSTmu+CvXKoIT5-@=xk#@-u7NZ8K>huaXocDhr(ek>X19CsWEIK2`9+RJwK zwDQD1UJK}X1n$t}r+hAw!UEW*?2VT;Kw8&qQQ(*9+T7HKuPm8M(R<^r8v(7tVyj z^mUOppfGEKbD_ArtXb4S;DM)$lNVc?gJS|*T`?v0er~zq3)+e?C4BogrfWFe$8qb* zdR#g21zg_HP8`tbeRI}6zgxG~?M7xT##~6WxV`5bqohzyrv?3{gAWMz*`d` zpG9E6lC9eb8TJ)3y%Cr46N(Gs_+_zo{Y^a1r6RPWad~fQRb<-+&4$} z7k!|@&zBqqE`>{=3{bFAEsT#~E3r5K1m8W5)GNE_Gs+|va(8caTX3qSqjn9_(|3y2 zgZ9x(Zw)545z{<_X>Lc}QoR#VRRZKlnaWgmyR`Z^kSVng`aod2fz-V_nXp*sc(6l4 zzgK7)zjSxa=}T757Yv-~(qkt04%1G0i-pB$wOT2THqV)LgLeVi7ZIWvpr*e;BTwJu z=eUtC~|Lc(B-q{~)LMONr91VG4NXJ{Eq5aoVWN;SdO1zCv(P^|lY z0>7B+HK?ZxE*tG=b?9yN)Mc*$Z({sb27T#Hfu3dYJyIiWv?L0gG962!S)8*w+)>B(iwSR&I7#$;*w6#PxFdtmOZrPjncW&Vh50sT%JXS{vmRXRM zJ_H6If~8`ec%ZK@&ceGQ=lyldV%3%1=Pis}#*oEAFXIfkKvDKmK50Kb=+lkEm5M~D97b~`k3qKn1>mT5>Yl?dbTcUd5J}*R8u$S^H`m5f#pycSljpnnO1vvg4TAa zIhIzep;a2gSkOzEZaFCR!>Pf?Nt{JCqxUm?2?SL-ru;Eqfx*le2rk5NCjl8!RO2!k zWMQz@;^DIw%{ArD?}+SfE0D0aW7(X(V0>&rniW-k<9w!A*l?vbm9IQKUAOYX!`j-c zV_%7`K@5UA9nm)Oh^4`LnJ?8x_a12MKN&;L2 zirN5dM~SJ&ETXKdrVTkOh*V$sMC?NKvnX@vyKEfRc)nR*>5*QwG*}X7?-wbyXgBro zAgoU|)la|Dl&--{HnB)UlzHR0k6|ZMS-nL+w%ooq&7z{ z@3#}(vxoCGS>;GAXWQr1M@hqd66YcBlkq4W){8wuw(I#;Z=E(NXu>^^jqheg>+0Se7|dzFny^g zWY`)n-|7ST$~rKbDr)Fn1c~e_%cPcnc+qB+n8fB*1b>yFmGwkhIR(^gmK^*Mtk-jg!VbU;t6LNB^InpQr zGbX2|S%C`$yN#OVO1+b_(e$+6GU~e@#Qg!xbHCmj8*3dHRX`dp)xqeacM20cCDrp` zs$9!8g;q1`y9-U#UBD^0(Y&FG|h2k80<%wu339|bv1(9-rhcE>d~toiCSoAHaw;P2L17U4+pw?_UzZ6MOFU% z^B2x%(8}W%?lL%>|3`qWdM+hBp)a}zW-NZ{kxoiVO2oz+6`r#4@(bU{0#L-n!`^n6 z;m>!cKd2@2EL^QmNJy{|AD@^II#~whDbQkMx%%~~)YQ~S-xz>C@}>x*NYTK>lRm8a z`n&BqY#;9I>N5kCoptZ$lU7jk~mOU0!fDV57 zMQF!9mDTjF(?5DqNs_xd*WX>;BYw8D?#cu|Kv;^&|-<~^d>2V%oHkdm=@(R_>bH{Daj>x^&+CZ{s7ni6X zt$YnIe_V#DmE?PE^nNvh-T6u9VmnpA1a4P zLHTem9)NL*MdqSvQ1in-F1bll9s;p@7kc5OR;^FRLJK_2qsYoiz6;@_8YvP*=+*6Q zPw$StzP@{PYPV^h6}54P2@4D3X>G)lF~kQyBK7W*g=oi$TemCO7nhcDj-|5MXM`;= zDG8`)lA1jFKGyAI1yy;ns%jE%m_VwVkAOwOMn1lvo$J_H8c?e%lx;+pym@>2`z)%Z zf%k%ST^tT~tc1spd{$ABa8O!$dX%p+&q+-88O#)_T&eNjqWQf&paJ)9|BR`hQdgx} zf1t0gf6^TkbWDmufD}KPufIHb9r^JG_n2=dSDl}O(fp-*=UATnwjLe&Q4UEzRP9+^ z^09Bh09Y)bRT>%^CyGT_$2K+9)yYrr14!O=U4U-kFE8`!J2WiA^YHG^!W2IGA02UE}aAEDZ@jnXx zl?z;8kUbUuisnm^BhnP$cT;dM&kT<3`-i>~+NMeeHwNeEKIG#jQDX63-caZXEiu{E z708?%Yv{0S?D6!aK_G4rP>H0fs_JBUB9V0_b+xqsCo<@aNS|0?P}^C<){ zEqVnPe<IkOzaKQI6CVF^$`p!|~sH_MNazLtEzJiK~wwtv)t5%2(1 z%NI)l<>p$43k)1%0wR8pY5fksLi>RX1ln}k#oe3!Cw&Lv%pvy=i-}`KqH*s=Wdw!aBVqyZY=x0Md zt*$y&CRMh>SblL=1kfTu*AvtSEz9fcIX3kQvjAKd~NYkTn``(duCl_r8l54I8+r1#jW7yUWx>; z7pG|%oEwnlK#g=Qoa-7=t#WU);i(FqetdGWZf~@$tqnL4$YV`~5=70b&(}%@S#4mO zAZs|JWxbz=ot@nQ;(&l#TUn`@G@HZTw6nKQ9Uga<${g4{8Vv~v*=quS86RzMR{>~V zW4__)78UH2o|@{U4fXNyfkJ^s)z>WF$#P1!(YVx(Jr z1D366Ym8|NPX`JjZ6ZfgH+QD|R8SLa!7AVOHF4W!Ehns*n~PHnqLRU1xs!)nHjXuXHE&*HR`VBy)z0_#RW91 z*2mp_t8jG>R^by65O6f$9Tpmz0_WXG9-Wz)Syq>JQw${Uk}F4H)sl_&v+_WeH@qSf zR(4;{=`iDblfKbgNC2>v}n6d~`7wCWXB`3cE}Y2Xq*AXNPu|xKq$@g+i}D zLC-EOcu7%4U}&A@)T(lQ^N@zGi%Y)pi1mx$UudeOiCtcsUd+Cc*y#Pg5LoKwOQ%YF zFuLT3y9!t78V2sR{2*QW$#p8euI&Il#oxH*>RISEeO7*U(JfFlyIP`ZXEDIV2_sxP z^svByg_U(oA{`o%SVUPr{miHD@ujs8=^s-6RSF2Q{&@bp^b6<7&;PYQ0IEPk)1gcU z;KIM(5%|{Xf1i5(-#_|q^Y66zzlr)UW&WkicMANgP5*r+{bqCiRgZtw<6rgoPJw^b zHl2va?Mr|Q?#FZcb{F7S z`2E?MuJyU^e|m<~2N3-~o>Two)&F1g>gr{jBH;TW;^%U5a`4_+5B>0MtaBYdT#!JF z<1S3}U3||%hW~28o|_t5Mj*lD@`*_?HoFVd@BZNn*iePJzAEbAf)&di2UNk3KuJdx z-%Sgk+)gqg%H=nwslnp(&iMbA7Ha>wQzZp*MT_Ng5%+W_dt}ckE(8wh0svLPkE%Rzr z!&YyFnASZMZ$h8_(x`?3z#`ntc?k9gW>T}BsB#bi&YTpuGD|S-#%?Ki|IM{Q*wxt26 z`oy|UBZ0e75&)1GmQyp+iR-0|{7fXZOd^uCk?bjZw&-vX)p)qsbP@rgaWDOXeAbVj z>quo9P}u3kV9cRVsA$rpvAn&7L=KbK4d8mDloX5Dc`?$6zD`?Aj3VJnq*&u67i=Ko zx%^d#eehu){Ysj#&-P{pYz0i2$1Cf4FK?ACFJzkUjChM;2QM+Nt==h4d0}RoVqcBO z5zgEU&z_id&YHM{5o#Fyd$o6eUJRs|K44#BK8b!|W5LE=RDQ#(czWxVsG?Jij9IaY z^d(&P15^X`Z{5?#{mMt8HbaZhEq#j^FGBTHRbTl;&m(@T*w~EC+ zr*U1r91bp*_$58VxeD*|#Fd;aB+)&8%|A4@$&MrFEP^72U2!2sR%3? zv45+T36H|}7G+EVIeZ?z@@*9pO#PTf*$-YfCZvpRudiz!x>+}*tmkA><^~kYfYR-W z-DuMQ(RdPV1`)#@xSi#E@$NQQiByBFP3tchkR^5sf)3_Cw>!NJ+-(K^?rw^HYlic5T-NDdcu(pyrw|xFnj7)JsE?xUH~qB zZ|~hD5cO$|Ik#y661mqJ&O{1O)Y@K5b?fi#-QC>?h? zQgGOQAk;RAlHrU}@V}MxYKWE+#@I;xm@#i|W!Gq2F!cz(UP}3xAB+_I<6fI|(?MqA zc4pJj&_0A*w@D4y+rkf)sH`>*p57@voU_^MEfQ-NjaKlzHTFJuXOl9AvJAj;Pp8GC z(8H0T+(CQTqkEXG7u8n^JFJz6omtUWg)&K96KTtz@$G-P&@${LV96U}lvz;l8Z`)i zP@3S64cxsg6fyLIHjy$TIM=uSkUSVnqK(-orS(mbCjwy{zvRN*}?c}nAfR}}y1 zT3}AibeIyQRB41&%*+qR4k7Kh1#KQ+slgC`e5RvXH1~$O?>T~{<+b{FTk*Z$%?b=o z;w@i&ai+he-_6?E9oA8cYVPX*Q2=ggvsJ374KcxFui(Rc>P{vF-$WUS-(**Z1jeayQ@O)d;a>esyX#&_ zXDTBK^=RBq!(jjYv;8Zb|F-99hMAg+=ee%{){rxtUm+P zS0(Coe^F^8o8*~V$NtM49Ix4sUXS}^*M|G@jJ@28h~e@{{ZHOUHEpp56X2x{TV#^P z;2RZj*w%7R)6qDHgn|&~Ti8Qit%9T`F10#tb5n!J-9GiCIqB8^q`%+aIz1T8P94{1 zi^4+uoXSl`c$3XjcbaFW+sDed8{HS8nIYtrFX$q9iNG?vB(*s#dO>s`gR&_`oo9`& znEi3N9|*bfUB>;=7a;@txNasEI5z-^xUe!!8{M!u6{AGlpacYj#*wU>cESYXbU+6! zs(0;{Z}TGb`;>^VOtu=w-$;x9nHrP7cyDeny3kVbtI^Z43-^+Hu#9^fPF$@c^O8Cl zX(>^vJM2p%mZXot)XvX!ak?8{1T)Ey!iDh_)O5fRLfVoFT>OK3ofrn+e%CYJs;a8d z+#oK=?wMOlnwpyRONyIM-({J|b1{qzYPZVzyPnsn4sO9W8EhOP=+%pyZ*NYzlEw( zQ+itIGG#n?fDQ9-jyon_+17j1ARls2)Woq&Jq+{DnQxxST1G-jq!X}25EZrgdg|*_ z__)JZB|l2e-2}haL|R?LK3Lj>ea(V$%llGirp@JoT>Y2Fw9||aXCdaY**|j(plpGe zF@g@=y&fy3Gntu~kQSwzNU)}T7%8Cfa$oqdow37=99BKNs&KGgp`*BGAewZr2choS zXFL^{s8S1}>L__a4)<_WLYv#+{Az4&_Tz#HVv06Yvay7oHDP1jI4yl#x#dn&W^#0P zz(w0I?)9i3*@m)fisETagTsys<7H!(5!ANfg29-hHKv&P?B&leF5J_VkmQp?*E5$1 zM??ZAz@pg>eR}q#n3$MgQV)dE4{h9up~tHnx+r+fiHC$Ps#G%NMMSP>%B9N^mcz=y zDE?5c;NW1diedYdIwILPr%IE00222`lVD%*I!BR$pu^7&Qa)%?S7UUZ3vFrh00keV z`sV%q5qF^XoQDm-T*iF}(wW?-mO-4-3EYU$R!AAYff6Ugqf&glOo#txinvMSSvkysBU@V#NTBy%o zA<~I{A0(c_#$5zt9z&W&R>27q8la%V<z;mVob~tF#*zhT`j$36E<(`R=<6< z2LCvzj*Hj~i)r^#+7<%^ke$S|j7Aw|!o%1GGgjwU@IUzk5aC&Wfqwqkkh_4C5IaDP zN;_p8Tu#xCkY%^Dy^>>NV~a*VpIcLrpZ!EP5CmA*CZAjB_X(iG)_m@u+11}7N~vQ_ z{v2ZYY0%z!`BIs6YRg17w)t|c+8>`v4aM+Yvgi6x1OkabF%@RJ?U@a)4D zLCWsTRiOp~riof4y+&W!Kv~@6fPu?1wn?ZM6?@&Ez%Dhw$D490E+2=l=KhjcsaU~M1WkxQn`WFWi7C_P}y zOJ-Q}T54lJB~u4}VyuaHY~Clnc$WdHXeSs<_*4;0Sr=|wyH4sJqqIl|$yk=OLGP3+ zeF8h;&RhBs21;aprdO!S;*alAsmqsjH&no{7L}?->6WDY=9BSsF?r9URI0zmk@TnD zctDklOKp{m*;Q-+-bM;LeqBL7CB31md?f%t=CayHCI~MH4w1~&3{2jN80EN!W*mO9 zUt{*R3nrq)j`|E=fcYyF)17Doc9fq%Gp47fi5~v`az9>po=qa1l+7iX*+!cJ_t0SO zAR=(FGL~3&`SWE?&M2wZc0TCsI|dOI5~vS;NE!LMgoSSD&c>1M3JH1EhzGf0L3=ry z*8=w^L3P=`YWw@WGs(0k_Yx%s3Rvu`ynn6}6KcV*Z0_Xj?3@c&`6b|W4sR`y-eRW; zBDiTQ#6@LKIEe0Gq%AX?N9G?8ly+lv6r>C?i=!Jzkw2wb{z+0;b*+(T5^S{~za)hO z94TnU(!AWNH@n2r{BC6$AC#CD2EUKY$vgh5t0U)J*Jm>#@_A}qh zuRlLeL-WgjmQR}8zWx76^Ea~=hSe2}C|MUut0ey-yDkOlW=0L!K& z5Z~v}@5AbF##>6;&Aj~baDh?L3HFSJ=A}F8j5h#M(JL?zPuAocRb2tzZ!DrrThQwCCiLd1x+oY9E*yO2?+oS(b4CrZOsKxl}b^cV0#gOMFX&N0Eop2cS4iq z=<0)0a(xO~;x$!Eh%TFKq{vj6SnPeic!adSk%q>|#L!U6dysH~V`R3bf-a(D#1XkY z+cwedd8k#Gb$QrYYz9cE^W7Jq`|!k7^o-L(`ZsSWRWAU%V`>^-K+qIIS1G+RgzH^P zN)qZx0I*$-NF{f)BVx4pm40cizRuQ2SW84^s-p&c7>A#jMds<%_$8|!R>Fr?)g>)u zEbnXnqi^W1$Ap-eoIHNHQ1ur`UcHaZpPX2gZ>p^|z0M+*_&5^DzVu|a%?NBHgl~fP zNH8G~$(kLFns(U6Kpd`sh~4%?`V^QWu1iT**4NhqfV0m(@tv-d7Uw@d5Qty#t_2{R z8TTuZsC;?7s9fzD^9+dbRnd!X^0)QPOu{p{sFC0dT(7T>Z#%oAQ;$*NWKwq|asj?L zI!A9umPi{_J0Z@^2J9PM_Xic?} zI{Emn+=+?AL?Mkx)+FJD@2Ex3n(z2ofN9Ml6Lr6&1JFg_KL8{SfQ{J{=J3XcFI@+6 zul4pPiY8{?V9|)gH}y7Z>L_8Sr!&-%3F`2K_E+F=mB$_)gYG|4h5?|{xKX>nl!iPc zQZl{^fHhVb2&Lm(89aQf>=qA61ptq(e(+=3*`X^MbZmH|ErgD9HbWSK!QeSBWO+GH z&go4KeCq9y_Y)_cgJ#@BEF-!@J;F!4X&#Dn5fcD%l-s8erarA{`@4`nOP@yDB0N_%oF=IIk~}o=5A$C zO5n}`!FECqCyX?e$gwUK_7eo)Y~R)3(E;J%?R+>KE?aI0Qv*(jI+~Db0Q8ov_|9B( z%*g3LJlUX7F~hh(R4~2^pv&*o`9H17hrn=$f#v08hbK>fHOq^S+sWCN++f9B#`m|@ zUEDOThvBtH1=*B6excc-RzUMVdZg{AcVuR)By;tK95g=o`~2qVY`)Z_OG4Xs_?g?( z(WZKEp)Oa1R6#K~6%ln6QSZy~z`Hy=UCTzUju|Y)!VDgdg>v>pU+hj)(M!Cio9h?; z=bclh&(qR&Jla@E-dMq9T)Fc%4PRU{&AZ(r_mTA=vVTTCNxO**I#GHW;`vDUU(r1a zakk?#-nAH|Fl8=wI+3^u+4zEMhV!Gfan9wj=yNR}#+_60{zJokd?DrMXK8vfuCx3i zoDx5`O-yG{snG@a4qx4K zlNoz}nso7<{C{Zv{Ir~J-PDYGXL<3(r+g3CIN3Ge24%|y*U;;Q%zf9k=f{@BX@4GV zj%W7l8jH-kId3_Hw#>zQ9)*Q+Tx_hU|5Oy&h4s0nrn7?2{MgLDuif1K%JB#m{T?+D zy)6%~^0^9I*Dwf|WFKC=n*C$H`o7)*7V&rSrEnE1+YXt&vNg|?vjW{u*b!de!q-gkCiN^ZGH`vV#KeHzam zuv`avm*yQu*k}kPsPo0mO1;tK>+7FfCy+f&9;%!e%5Tl}uN&W1OY{n7X*1;zx)2pH zY1FurlA~vS`5&3xfP7U}R;Ty@;@MSn0p;rC&b7R{XFXeG>)TkK%@eDhRJSnr(s!(% za}UnX!x^xt7Itb3QfIfM>=LxI*<(M3**EJslu(lK+&DPUnJ1)3gFfpnr8$`FBx5UG zBhz3j%xhPvfA2QOa;L_amoGez7Ro36#S2pMyYqcT-@iWkD57~=5b{K|T%PYiMB8kr z)hn|h3$ zSzA>{2-@>_uzEB@w1{bVii1;0HJgWcfu!>V5T&uh9Ob)*8{o`foAK9-N~q0)1MUG_ zAf+i_rzrKvs3+D|5*xhTD3FAnKyJdpl=$;a`-0eVt_!le3nL|1@+8(|4wWb6xzz(w zs{Uz6kLM4}zV`wcAR(qULSa!V<5gtM&Z-W?)zy{U+2d`&7}n7T;k#gDXxOW*5PJi4 zxr?n|jNwqzxF9_*3W5okvaN%bbn!d=6=r#uSIykN5L^MX&k;X*Fi?skK}p{KB{D3r zznRSnHFYP{WNPxYVV=0U`tQbuLB8zIhK&uDosx^a9|THJ40Ii?gZDghS4IudsC8Jab?vjfmgh76Hz5n@uLyAH;K`57+9T!FeXe%pR6+<7S^s zd*{DOd%8kuqI{hB1)Q*-!d!W{CQZ_R{sKF702PDgt*Yy(ogB=*agpW4Z@(|k_bgqy z8)plXOCR;I=q-TC=##8}mrXB2J$1oHE42$fQZ_dcq5*(IrR9izLeRr2aoX9#M}zHax#3rrvN6 zm7WAeOJgIuPhIy&U|jAj*EgPdJ1#0FY313K2F$0yWipYm#(220 zli6!1>`>VTxF`=Hb`{lh>Y!5~!CT#=#f}Y=_{~Ka)z5*fc76N^0h*XaW%#&axfSc( zQiORn8x{2B)Lzl4HQxPxYwx=d(>%hPJbR`cWGg&wWot5&T=|xly7j5CRB;E>Izy!p zrWY6Ul12N)JS4doQYYWYO`esT?Y_OvAnao!zeR|}Y?~Oaar?^z`*&HVZgk?(0&q3b z`GL)WSic#N^LC1S>|f)3n8ZS|3hV|@(HL9-iDEjLuwTPdYFUYq?*6R3mX z8YH5Yph);?`9J=(n+RR~#&m_pDsFXSl7X5kpJ6=jaZ|CFb2Twn# zR~plSn42XAHb^)%?&Qvedh&3RpjaUPHnTTR>|vuEE3^0Z>8>TOZT`Pb1@A3(g-sas z^vQE~{`RbvF>nnwHdVR9j-6_#>7Af!BppIuuyY4EO=d`!eH6;VHKTJm?Vuxx5WK<*(f|7;)5$Q$-xs?B#5~|{q#yW( zSuv-TSt`~%>cyP>)t|aMuE=EQl@a8)udkzY(?be!N06Edj7WMuzxIpPo8KmOCc1jY zxpDJO!9jsa|Fv;t{<>pvC%<@(u4_N|o#4=@=fhCoI8s{@`H8qecaW08mKo#-rF_Ob zwZcY{I-{9C|0j&TXLt^vg1yF3ZBbti z9!*YP)={FYba(u?)bxEZEJdV}cluR!Nr?9<#=;WgeTeI-;ho<*ac=CnW-whT>Z zee*wfiume2+7I>}YrP8wv=b2Jmo;cf7X^-f>SFG(Ad?)Tbqx>TVO)plprfU!Ng+hb z*N?1Jz3+4U{`G786U)<7-Z2oE17Py z-oU93mN;*jdo#bCYB)Az-_!!Io-8->w@(jB7>(NF3KvN2onO1SmGDK3INbkarUZH= z=Ek)tcp6rz-_;YE>P1shEMI6=?JDn^KujpM%G_*Xv` zM{=XCB~SgAA%DAcR*nGzuQ7BqdONvmT$;zOoj>e~ihPO(n6pi1aW8wYtgNhIfa;^A zg?vjVRX4@)DsLt3Mz6BPN&d(0i~L)n^cT*$+1PVd&}s{0k+%ivno>nsrv=|)&r#;2 z&tYr$=eK(u3!W}ha?*4bHD1b{b`}27|0EDi$y

9t%sZ<2GE5aV;2s4A)Hva5!nA zg0P&N5+S|RpuNWQMIE5z3Qh`DU}OI9zXf{?po#d%%f1Ckr~+dD_0jAmQl;|>J6DWZ z9AC?g);_vl{Wk%78h*rHvtS0JO5IYTG%ta;!(X<yP^72k#qTgerEpVmj7? zjRxL^9Us#F@q9g7*D`Z{2Oe-#+La;hrA8Q2(V<4lDSh1qkB1}dBVVVH*YOlSr3*j&S zIgnA`+68byEZ2kIuYrBqQ@d>zPJ98V*`SKHzax7Q*d?Z&wN&bko4^05tcMQQFY2Ma z?>()lHYD}u8?I5Y`u~eM$zx~b)bCZ4?zzU&Eq6{w;B!Eo0v))B$(6qiB@?=OA+`Jo z>h$LrSeTjH=J211!1S~V90k&Ax;kF*Ky{xyDHz{*opOUaPE+8wXEA^L54Z)Gx1F1% z@N#P%Hevha!)~*H9;l7@<$}&aOMP>5p2e}xpW*!#_G%s1f$LcXBZ%u-hI;1Cu7;9N z7*vLDwcPlxbIy&fdZW(|!f1u%8XtibK1D45K5oG#OJY*i7+){XmKlB`8DF!)CRK4$ ziAy_Q0UA&Ny%3s{tIbLN^YXf0x7oV?(E0dpB=jDN ztWBh|8dh0pmc>`BuR36W4{PRDe+$Tu$zI6P6xfYw7UCdR4C%=HId7V zQIV6+#|`i48c3$2i(A7BMTaoqL-j!}QQ0A|e%~+^DOpFuo@;K{kwqZ9(eF!Nc$Yp! z5sXo4Q_!84LP_5`-!`Y8n_6>+Fm~&fKm05H_B>fXZpv(`HW%4g^+kA647K8DvpY*- ztUdEM#rQgg^0)#fg?j9Yu&mKwXIsk-r?dYH<+AwCZMrv%#IT$TRJ+HLEcd1$y<$c4 zuEyZn8EIuTNVgnDRlwZRC{bNNzo3oF@1c3bxM9l;z3}&WPm(nkS&TYUxZ(WpyRH7y zAhe=xTBp9LRS@ALV{{sO?NBa(Gl>5xok(Dg$0g+cmT;0yR#8RoK&Pz>)YVxG{E~~2 zem{-t^`cV4l!d82w%VqJz%Q&eQ13;&Yoq(-{bhM16;d}}oF|&md;TBlSIyZAz1?w( zxZ`G63~SEwdud}hRPcqo$(s&}Ven2I!CDQx6c!Q^wOnV7G_$=I(uwfTu^kGvx<0Wj z%d}g7&ssC})@rD^*sF!TkzigiGacol?!Qc2>mZj{2s*w)t-YDDKrL?23s(hAP}-k+ z-Sp_;tDDMO8}l6%o%F%w9hByye~UibCM0e&Vy{sFushv90O*S~cMAymb4P5Z%-lK(dC$@(2O97jLYGE&- z<5ey_^)J*Q+{LwC7U^T63#s|#b!%Xs;^G~71Uzfk+ve+Tto~8BxoJxPiQo&Nh`Sv$ z)J^m?b+oIPj4zn2$@`*HgWKdF!8yXNjUESth3V(KVvxY7+&3tMMO|)p`hj$I#|sO= zXlRsWIM36GDy$RXu(PKlRDi4p?I06EhkC{!!^tb1QS4Hq*UBx1>D!368>8Z8yzqisMqwd?jOIx)*A<$qBsx6)`ldzS&c*;W$?y4*wTyUNN8!yyz{_W#kkR#C z(ze9ms?;^N87Gs5N=+^$Xf`O3xx6%Q)P7iUio7yvbice$pt7u)G=o`Av+WaM)~=~8 zEHDU#`XFv@ft897rD*@IzPE(urAQ`T3mATlLq<96(w!}-gx?61FFV$Y;cuWOY zYiQI+$oaWm%~Xu7N2H?M-tUjceWZLf=F9Ge8~SMVNs=GBT}|J78acib&d%pHxd;P; zSxv_Fe8U~+M#NrPX}TDZn;X||yQi+YO=@+}d34>{VisXy zxg?zir#IA-`8>wmRU4sEm=X{=Sm_ZWHX57-yLzoIkP^3g#x2+Wsw?L6`Iji)r|Dvf zY`?#T=gX!!hBD4G(2BN+snrG`%up`x_b0Zk!*dsg)SXh08Vz$v+$pfgnd=f^;#|v| zm7#j3=y_Jv;ZWvAKPo9BD_2qajj3BT^lIaMuxVXX&6I1baMC~hOx1>T5AO(yZ4E%Y zSilLzU!E{0#^z28C}o`)Xg{M(THXAtZ*6M}H{oUHVvKCdtJezxYHpvKRqhp)8yIe$^1=VYSXONR-+CyL>i^da>`iiKZ6az?S9#_ zwZV|L#4J;@YF`)B2U;}n@T9wOtVb-&amArrdI$uv4=zwSUlsi|dG1b8qNa6?yrkcv zUt{I#wqYaFx&2W8=qAvumYk5GdSBZzi#5>pL|InPCdjbDN=~ zwS7O9;;0~^=um_)6zNSuF%$=pIsqvOHALwk1R(*G5Of>`r3wh4#n5{(giu0LF&c`7 z03l%LYNQ4Q0vH6|=v#*GU-;H{f4FPiz0MEk?0wpO_OqTXvO4N+Vj|WH8)h_ny%~|` z3;WgSc`o*Youiy-y=UFs78g`fJtfGQ=VD57jIVZAHF2($bInTmv!e?pslWQ3t}+xu z_UnF^Le8vqKNL$xl9Ezvq_-(FyJVPjZ!fyJNj)?bhxXnZ8-J{U;<^-9->5N^klK&w zT_X@4JwS3Em`IuIjeT?8iM+ zJn@n>FqhX-R#W-=i3Q3eA&`TuW=>6T&b;^#icb}1K9%5br1BKvE{tRRUZYZ;F-c8S z0G%7lWR#0*t!bY7m^E^-EnDc0&5cUUd*^M1VVEvm)c0ip!Hq6GO&E5aFeJFkg?k$4 ze&fx&us`RKfPSy{B-7anaOxNvaK1G^!T6@no(dn)kKLNyy<;$7U?5T~ocj7c6N_ih z#+f${MBCYxAZw2DKr}ld*)h04PbbV?P6q)L+JNKgzGO2#a-%~-4$EARJC53V?p`l5 z*L$3n&(=Ptj?<4_*1@;s^X3 zAMGteZtvdQ!mU`PL(JbmCI`19X-BM%zzu8Lde_8pgM$u)!`Tzma-t$ojF zt?qnq0&`-VzBT={6T7QF9#z$Hz4VEcl8Q>E@9kT+TvYRWd#$^s$`_*nr*W2_v*S&Z z4)TUykHj6?8#@j#bpisZfMKz0w|)vM($1n*%3zyKu*uDqL{Q|-bd2QhrGx$Ne{sD6 zNBBa@4CS3K_{EJ59Q!!vD>=bM3fyoMbzAH}S=?0^os$jkoi!ajW^IaU2ApIJYQYWaB zVnTXPfGaQ^S}QDCqCMM|Iw%(5}>+0?bOm#2z@v({hW(?Qq8;*ltX)nk_MT? z-%j)(Q*_^2LnHG<+@hgjVrtmP)|^@ENqIbPJ-kbL1%zqv|1EdGNhQL880-8dxy0Rp z-KcDxCNgupO<9!Wr;$M*EA+9S*Y}VVp;8L+e%GOwvtK94%q@tu5=Kju&daf0{imM5 zj{$zsdiLDL15ABoj^3TZOKm68gxkMGSx2Dz&fu{VrS#q74Z^7iq;i4-91eGI1F+M+ zk>hyLYm7iOm35SAp+p=%4XiL|kQMNoh-f$roZ|t3E17BD{7Q~V@#u&Qsm+&;Sy^7w zy4;U*;o~gj?W<(%3w6EWsUm4xHAR<#bb^Hm4OQRCOAluw?PTU0l&f~w({^VKCyhky z88P5rDG)ioB~1TPflW`8v9wSg5jKlQO~RqZ^HlPeaJHpTa^6V~h$ALsl>)an=&Kk5 zAD=1i|MI5~MGekD$L6Xi_tv)&+lx#Ot4ZNj^#85C@iVlFk13)9JvPaQqT$~Xi{VrB zwFNzxO_RQjr1uNX*4$l=s_wDk_L`c)!pRS)~yktsER$;X}v-o!l7$`D^JybhXV^})x=-jJ%lEOc`3 zSj{5KZ##9C9j{3d!W8h?^IQFx8!F)z#TcV+fg9l1Kvu80t6VhCd_Tsub<5=xe@=)k z8++~c^QmUNeJ$|o4wfyk+t zN>Dh$hYZXf?!5F2gF)Kh2GrfslB$<7ZgJ+X zBmnmYEx`$N?euM{Uwm159}&e=53K%rm{d+g=RPP|zosdtTs?vq`whRCT#?Y$*c6fj z&z{Iv(mUCyQ$cDPW+)j=R1FBGoUNRs)0?=&+NvOGf~t9&`u+D=ItVfolxux)EM87IfF7VK zaUp4}?yS63I`cDkJLa3=)r%SS89g;+x%Exbp5yJPzz@@OjLBV@PRc><8=+|}g zmT6P?JWpq<5RBEX8kS~uazamXfbNxczhX6ju=NTPG^H`sUo+9z+3D*Wn8>&`M@X~~ zmXXQ*iS)EO~%%b!6{8P^woypw@Cw;~>dqhoilpsFw$m0~kQ`yku zkx8bOH<_Y5IMjgp*1IrSj71d+o!uFu31SQ4DXc5%Ug=*%P)Z30~4cZcen4bY0i5 zR-A1-b5ZM#U)$~9l}pPm1gd4wbznn{d{{P>X{nI+_Q)nRGQN8Tr4Li5%%f}#;gF#q zW%Y(=g^ZpKQ%4A+eWw_7-dS&?2Y^z)I*LjOB!7v2w$Ko;u<+Y?M0c2 z$N2qFg6cDtY(WP0tskF$GJ)t4tsy{*(tTYUKu-Xv6Mjhc_?7?=%p|%3#c2!Tu%SAg zpm`L}JmKr;4udpVl-~3yqCt0HLQn9h4Q9}+O}PEEYsBX3EV0eu@xtmymWro{v-YM+ zb&6{(KFcrv+>tS>>#(SVO+pnF-tFZKnxD+Ti7s99pDKF_;~E|@bg(DS~U!q zDQCs6-Ie8=_ckk(z*>$YMd;@zfFnocdV&c@KD*dB|I#hu+D%;`w=zgcS*KTG~-JaE0e~YciKz%%H#PwjdX)f>C`-oWTVinYZxX>r;55gwP=io}fmG z#h@b_63+awoL=0(2WYLkOm{Tf2{H`eGe_~aRKxb|r`a7WV8MkKenbN)VRTB%?P$I# zS!*GqrcQRux7?=$i1VO+C-x;QZ9w(4WoPv92M%8TTX>6~c1Jf4i8>GU`Vp(5Z$~J# zO(2M4tM2pGU-Q4~!q2>+YK78kNwp1n4JnLxEmU$u?db%A&1kdbeU+vT97r4wkr~Jd zE|U7+F!gD{ynRkQaNw%ue_1j=?RWnN@E?-hzuKJ=`7aCSr=j33UuSIpbC9o^wf|f3 zx4-FhKkS$O@wY_Q&vr*1{!PjIVYqtf|GV&i#S80u{0!>e-YK0sO8m$k`f Date: Tue, 8 Sep 2026 00:37:08 +0530 Subject: [PATCH 4/9] trim: remove public status pages and email subscriptions Drops /status/[slug] and its preview page, the five status components, the /v1/public/status/* routes, the /v1/services uptime query, the Resend email module and the double opt-in subscriber table, plus the status-page toggle in project settings and the slug-minting internal route. The anomaly detector still creates and publishes incidents; it just no longer emails status-page subscribers about them. --- app/api/projects/[id]/status-page/route.ts | 30 ---- app/page.tsx | 2 - app/status/[slug]/page.tsx | 134 ----------------- app/status/confirm/[token]/page.tsx | 31 ---- app/status/page.tsx | 114 -------------- app/status/unsubscribe/[token]/page.tsx | 31 ---- apps/api/api/routes/internal.py | 69 --------- apps/api/api/routes/public_status.py | 140 ------------------ apps/api/api/routes/query.py | 116 +-------------- apps/api/api/schemas.py | 38 ----- apps/api/core/config.py | 10 +- apps/api/core/email.py | 67 --------- apps/api/main.py | 3 +- .../versions/007_public_status_page.py | 36 ----- .../versions/008_status_subscribers.py | 42 ------ apps/api/worker/anomaly.py | 32 ---- components/landing/footer.tsx | 2 +- components/landing/navbar.tsx | 1 - components/landing/stats-section.tsx | 2 +- components/landing/status-section.tsx | 28 ---- components/layout/sidebar.tsx | 2 - components/providers/project-provider.tsx | 25 ---- components/settings/project-settings-card.tsx | 96 +----------- components/status/auto-refresh.tsx | 16 -- components/status/incident-card.tsx | 123 --------------- components/status/overall-banner.tsx | 42 ------ components/status/subscribe-form.tsx | 67 --------- components/status/uptime-bar.tsx | 75 ---------- hooks/use-data.ts | 26 ---- lib/types.ts | 9 -- proxy.ts | 4 - public/shots/status.png | Bin 139630 -> 0 bytes 32 files changed, 12 insertions(+), 1401 deletions(-) delete mode 100644 app/api/projects/[id]/status-page/route.ts delete mode 100644 app/status/[slug]/page.tsx delete mode 100644 app/status/confirm/[token]/page.tsx delete mode 100644 app/status/page.tsx delete mode 100644 app/status/unsubscribe/[token]/page.tsx delete mode 100644 apps/api/api/routes/public_status.py delete mode 100644 apps/api/core/email.py delete mode 100644 apps/api/migrations/versions/007_public_status_page.py delete mode 100644 apps/api/migrations/versions/008_status_subscribers.py delete mode 100644 components/landing/status-section.tsx delete mode 100644 components/status/auto-refresh.tsx delete mode 100644 components/status/incident-card.tsx delete mode 100644 components/status/overall-banner.tsx delete mode 100644 components/status/subscribe-form.tsx delete mode 100644 components/status/uptime-bar.tsx delete mode 100644 public/shots/status.png diff --git a/app/api/projects/[id]/status-page/route.ts b/app/api/projects/[id]/status-page/route.ts deleted file mode 100644 index ac43f58..0000000 --- a/app/api/projects/[id]/status-page/route.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { NextResponse } from "next/server"; -import { auth } from "@/auth"; - -const API_URL = process.env.NEXT_PUBLIC_API_URL ?? "http://localhost:8000"; -function internalToken(): string { - return process.env.INTERNAL_SERVICE_TOKEN ?? process.env.API_SECRET_KEY ?? ""; -} - -export async function PATCH( - req: Request, - ctx: { params: Promise<{ id: string }> } -) { - const session = await auth(); - const email = session?.user?.email; - if (!email) return NextResponse.json({ error: "unauthenticated" }, { status: 401 }); - - const { enabled } = (await req.json()) as { enabled: boolean }; - const { id } = await ctx.params; - const res = await fetch( - `${API_URL}/v1/internal/projects/${encodeURIComponent(id)}/status-page`, - { - method: "PATCH", - headers: { "content-type": "application/json", "x-internal-token": internalToken() }, - body: JSON.stringify({ email, enabled }), - cache: "no-store", - } - ); - const data = await res.json().catch(() => ({})); - return NextResponse.json(data, { status: res.status }); -} diff --git a/app/page.tsx b/app/page.tsx index 5f0f532..e84bb87 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -6,7 +6,6 @@ import { Hero } from "@/components/landing/hero"; import { MarqueeStrip } from "@/components/landing/marquee-strip"; import { FeatureGrid } from "@/components/landing/feature-grid"; import { IncidentSection } from "@/components/landing/incident-section"; -import { StatusSection } from "@/components/landing/status-section"; import { StatsSection } from "@/components/landing/stats-section"; import { CtaSection } from "@/components/landing/cta-section"; import { Footer } from "@/components/landing/footer"; @@ -23,7 +22,6 @@ export default async function Home() { -

diff --git a/app/status/[slug]/page.tsx b/app/status/[slug]/page.tsx deleted file mode 100644 index de00649..0000000 --- a/app/status/[slug]/page.tsx +++ /dev/null @@ -1,134 +0,0 @@ -import { notFound } from "next/navigation"; -import { LiveboardIcon } from "@/components/logo"; -import { UptimeBar } from "@/components/status/uptime-bar"; -import { OverallBanner } from "@/components/status/overall-banner"; -import { IncidentCard } from "@/components/status/incident-card"; -import { SubscribeForm } from "@/components/status/subscribe-form"; -import { AutoRefresh } from "@/components/status/auto-refresh"; -import type { ServiceStatus, Incident } from "@/lib/types"; - -const API_URL = process.env.NEXT_PUBLIC_API_URL ?? "http://localhost:8000"; - -interface ApiService { - id: string; - name: string; - uptime90d: number; - current_status: ServiceStatus["currentStatus"]; - response_time: number; - uptime_bars: ServiceStatus["uptimeBars"]; -} - -interface ApiIncident { - id: string; - severity: Incident["severity"]; - title: string; - summary: string; - endpoint: string; - timestamp: string; - resolved: boolean; -} - -interface PublicStatus { - project_name: string; - services: ApiService[]; - incidents: ApiIncident[]; -} - -function toServices(raw: ApiService[]): ServiceStatus[] { - return raw.map((s) => ({ - id: s.id, - name: s.name, - uptime90d: s.uptime90d, - currentStatus: s.current_status, - responseTime: s.response_time, - uptimeBars: s.uptime_bars, - })); -} - -function toIncidents(raw: ApiIncident[]): Incident[] { - return raw.map((i) => ({ - id: i.id, - severity: i.severity, - title: i.title, - summary: i.summary, - endpoint: i.endpoint, - timestamp: new Date(i.timestamp), - resolved: i.resolved, - })); -} - -/** - * The actual public status page — no session, no ProjectProvider, no - * localStorage. Server-rendered per request straight from the FastAPI - * public-status endpoint, scoped by `slug` alone, exactly like a real - * status page a logged-out visitor (or your customer's customer) can open. - */ -export default async function PublicStatusPage({ params }: { params: Promise<{ slug: string }> }) { - const { slug } = await params; - - const res = await fetch(`${API_URL}/v1/public/status/${encodeURIComponent(slug)}`, { - cache: "no-store", - }); - if (res.status === 404) notFound(); - if (!res.ok) throw new Error(`status API ${res.status}`); - - const data = (await res.json()) as PublicStatus; - const services = toServices(data.services); - const incidents = toIncidents(data.incidents); - const hasDegraded = services.some((s) => s.currentStatus !== "operational"); - - return ( -
- - -
-
- - - {data.project_name} Status - -
-
- -
- - -
-

- Components -

-
- {services.map((service) => ( - - ))} - {services.length === 0 && ( -

No components to report yet.

- )} -
-
- -
-
-

- Incident History -

- - {incidents.filter((i) => !i.resolved).length} active - -
-
- {incidents.map((incident) => ( - - ))} -
-
- - - -
- Powered by LiveBoard · status.liveboard.dev -
-
-
- ); -} diff --git a/app/status/confirm/[token]/page.tsx b/app/status/confirm/[token]/page.tsx deleted file mode 100644 index 8f1472a..0000000 --- a/app/status/confirm/[token]/page.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { CheckCircle2, XCircle } from "lucide-react"; -import { LiveboardIcon } from "@/components/logo"; - -const API_URL = process.env.NEXT_PUBLIC_API_URL ?? "http://localhost:8000"; - -export default async function ConfirmSubscriptionPage({ - params, -}: { - params: Promise<{ token: string }>; -}) { - const { token } = await params; - const res = await fetch( - `${API_URL}/v1/public/status/subscriptions/${encodeURIComponent(token)}/confirm`, - { cache: "no-store" }, - ); - const data = (await res.json()) as { ok: boolean; detail: string }; - - return ( -
-
- - {data.ok ? ( - - ) : ( - - )} -

{data.detail}

-
-
- ); -} diff --git a/app/status/page.tsx b/app/status/page.tsx deleted file mode 100644 index 40442e8..0000000 --- a/app/status/page.tsx +++ /dev/null @@ -1,114 +0,0 @@ -"use client"; - -import { useEffect, useState } from "react"; -import { ExternalLink } from "lucide-react"; -import { LiveboardIcon } from "@/components/logo"; -import { UptimeBar } from "@/components/status/uptime-bar"; -import { OverallBanner } from "@/components/status/overall-banner"; -import { IncidentCard } from "@/components/status/incident-card"; -import { SubscribeForm } from "@/components/status/subscribe-form"; -import { useIncidents, useServices } from "@/hooks/use-data"; -import { useProjects } from "@/components/providers/project-provider"; - -/** - * Authenticated preview of *your* project's status page — this is what you, - * signed in, see for whichever project is active. It is NOT what a visitor - * sees; that's the public, session-free /status/[slug] route. This page just - * lets you check the page before/after sharing its public link. - */ -export default function StatusPage() { - const { activeProject } = useProjects(); - const { data: services } = useServices(); - const { data: incidents } = useIncidents(); - // null until mounted — computing this during the initial render would - // differ between the server-rendered pass and the client hydration pass - // (a few ms apart) and trip a hydration mismatch. - const [lastChecked, setLastChecked] = useState(null); - - useEffect(() => { - setLastChecked(new Date().toLocaleTimeString()); - const id = setInterval(() => setLastChecked(new Date().toLocaleTimeString()), 30_000); - return () => clearInterval(id); - }, []); - - const hasDegraded = services.some((s) => s.currentStatus !== "operational"); - - return ( -
- {/* Top bar */} -
-
- - - Status preview — {activeProject?.name ?? "—"} - -
-
- Back to Dashboard → - -
- -
- {activeProject?.statusPageEnabled && activeProject.publicSlug ? ( - - View your public status page - - ) : ( -

- This page isn't public yet — enable it from the project switcher to get a shareable link. -

- )} - - {/* Overall status */} - - - {/* Services */} -
-

- Components -

-
- {services.map((service) => ( - - ))} - {services.length === 0 && ( -

No traffic recorded yet — components appear here once your API receives requests.

- )} -
-
- - {/* Incident history with timelines */} -
-
-

- Incident History -

- - {incidents.filter((i) => !i.resolved).length} active - -
-
- {incidents.map((incident) => ( - - ))} -
-
- - {/* Subscribe */} - {activeProject?.statusPageEnabled && activeProject.publicSlug ? ( - - ) : null} - -
- Powered by{" "} - LiveBoard · status.liveboard.dev -
-
-
- ); -} diff --git a/app/status/unsubscribe/[token]/page.tsx b/app/status/unsubscribe/[token]/page.tsx deleted file mode 100644 index 651419f..0000000 --- a/app/status/unsubscribe/[token]/page.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import { CheckCircle2, XCircle } from "lucide-react"; -import { LiveboardIcon } from "@/components/logo"; - -const API_URL = process.env.NEXT_PUBLIC_API_URL ?? "http://localhost:8000"; - -export default async function UnsubscribePage({ - params, -}: { - params: Promise<{ token: string }>; -}) { - const { token } = await params; - const res = await fetch( - `${API_URL}/v1/public/status/subscriptions/${encodeURIComponent(token)}/unsubscribe`, - { cache: "no-store" }, - ); - const data = (await res.json()) as { ok: boolean; detail: string }; - - return ( -
-
- - {data.ok ? ( - - ) : ( - - )} -

{data.detail}

-
-
- ); -} diff --git a/apps/api/api/routes/internal.py b/apps/api/api/routes/internal.py index 861e630..6afcaaa 100644 --- a/apps/api/api/routes/internal.py +++ b/apps/api/api/routes/internal.py @@ -54,8 +54,6 @@ class ProjectDetail(BaseModel): org_id: str api_key_masked: str created_at: str - status_page_enabled: bool - public_slug: str | None class ProvisionResponse(BaseModel): @@ -80,16 +78,6 @@ class RotatedKeyResponse(BaseModel): new_api_key: str -class StatusPageToggleRequest(BaseModel): - email: str - enabled: bool - - -class StatusPageSettingsResponse(BaseModel): - enabled: bool - public_slug: str | None - - # ─── Helpers ───────────────────────────────────────────────────────────────── def _slugify(text: str) -> str: @@ -260,7 +248,6 @@ async def list_projects( rows = await db.fetch( """ SELECT p.id, p.name, p.org_id, p.created_at, - p.status_page_enabled, p.public_slug, (SELECT k.prefix FROM api_keys k WHERE k.project_id = p.id AND k.revoked_at IS NULL ORDER BY k.created_at DESC LIMIT 1) AS prefix @@ -279,8 +266,6 @@ async def list_projects( org_id=str(r["org_id"]), api_key_masked=_mask(r["prefix"]), created_at=r["created_at"].isoformat() if r["created_at"] else "", - status_page_enabled=r["status_page_enabled"], - public_slug=r["public_slug"], ) for r in rows ] @@ -331,60 +316,6 @@ async def rotate_key( return RotatedKeyResponse(project_id=project_id, new_api_key=raw) -async def _generate_public_slug(db: asyncpg.Connection, name: str) -> str: - """A `_slugify(name)` base is not unique enough on its own — every new - signup defaults to a project named 'My API' (see _create_project below), - so append a short random suffix and retry on the rare collision.""" - base = _slugify(name) - for _ in range(5): - candidate = f"{base}-{secrets.token_urlsafe(4).lower().rstrip('=-_')}" - exists = await db.fetchval("SELECT 1 FROM projects WHERE public_slug = $1", candidate) - if not exists: - return candidate - raise HTTPException(status_code=500, detail="Could not generate a unique status page slug") - - -@router.patch("/projects/{project_id}/status-page", response_model=StatusPageSettingsResponse) -async def set_status_page( - project_id: str, - body: StatusPageToggleRequest, - db: asyncpg.Connection = Depends(get_db), - _: None = Depends(authenticate_internal), -) -> StatusPageSettingsResponse: - """ - Enable/disable the public status page for a project. Enabling mints a - public_slug the first time only — disabling keeps it, so re-enabling - restores the same /status/{slug} link. - """ - await _require_member(db, body.email, project_id) - - if body.enabled: - row = await db.fetchrow( - "SELECT name, public_slug FROM projects WHERE id = $1::uuid", project_id - ) - if row is None: - raise HTTPException(status_code=404, detail="Project not found") - slug = row["public_slug"] or await _generate_public_slug(db, row["name"]) - await db.execute( - "UPDATE projects SET status_page_enabled = TRUE, public_slug = $2 WHERE id = $1::uuid", - project_id, - slug, - ) - return StatusPageSettingsResponse(enabled=True, public_slug=slug) - - row = await db.fetchrow( - """ - UPDATE projects SET status_page_enabled = FALSE - WHERE id = $1::uuid - RETURNING public_slug - """, - project_id, - ) - if row is None: - raise HTTPException(status_code=404, detail="Project not found") - return StatusPageSettingsResponse(enabled=False, public_slug=row["public_slug"]) - - class RealtimeTokenRequest(BaseModel): project_id: str diff --git a/apps/api/api/routes/public_status.py b/apps/api/api/routes/public_status.py deleted file mode 100644 index 99187d2..0000000 --- a/apps/api/api/routes/public_status.py +++ /dev/null @@ -1,140 +0,0 @@ -""" -Public, unauthenticated status-page surface. - -Deliberately outside the resolve_project_id / scoped_conn read plane used by -the rest of api/routes/*.py — there is no signed-in caller here, only a -project's own public_slug. A project only becomes reachable through this -router once its owner flips status_page_enabled on (see -api.routes.internal.set_status_page). -""" -from __future__ import annotations - -import logging -import secrets -from datetime import datetime, timedelta, timezone - -import asyncpg -from fastapi import APIRouter, Depends, HTTPException - -from api.deps import get_db -from api.schemas import ( - PublicStatusOut, - SubscribeRequest, - SubscribeResponse, - SubscriptionStatusOut, -) -from api.routes.query import fetch_incidents, fetch_services -from core.config import settings -from core.email import confirmation_email, send - -router = APIRouter(prefix="/v1/public", tags=["public-status"]) -logger = logging.getLogger(__name__) - -_RESEND_COOLDOWN = timedelta(seconds=60) - - -async def _resolve_public_project(conn: asyncpg.Connection, slug: str) -> asyncpg.Record: - row = await conn.fetchrow( - "SELECT id, name FROM projects WHERE public_slug = $1 AND status_page_enabled = TRUE", - slug, - ) - if row is None: - raise HTTPException(status_code=404, detail="Status page not found") - return row - - -@router.get("/status/{slug}", response_model=PublicStatusOut) -async def public_status( - slug: str, - conn: asyncpg.Connection = Depends(get_db), -) -> PublicStatusOut: - project = await _resolve_public_project(conn, slug) - project_id = str(project["id"]) - services = await fetch_services(conn, project_id) - incidents = await fetch_incidents(conn, project_id) - return PublicStatusOut(project_name=project["name"], services=services, incidents=incidents) - - -@router.post("/status/{slug}/subscribe", response_model=SubscribeResponse) -async def subscribe( - slug: str, - body: SubscribeRequest, - conn: asyncpg.Connection = Depends(get_db), -) -> SubscribeResponse: - """ - Double opt-in: creates/refreshes an unconfirmed row and emails a confirm - link. Never reveals whether the address was already subscribed — always - returns {ok: true} — so this can't be used to enumerate subscribers. - """ - project = await _resolve_public_project(conn, slug) - - existing = await conn.fetchrow( - "SELECT confirmed_at, unsubscribed_at, created_at " - "FROM status_subscribers WHERE project_id = $1 AND email = $2", - project["id"], - body.email, - ) - already_active = bool(existing and existing["confirmed_at"] and not existing["unsubscribed_at"]) - recently_issued = bool( - existing - and existing["confirmed_at"] is None - and (datetime.now(timezone.utc) - existing["created_at"]) < _RESEND_COOLDOWN - ) - if already_active or recently_issued: - return SubscribeResponse(ok=True) - - token = secrets.token_urlsafe(24) - await conn.execute( - """ - INSERT INTO status_subscribers (project_id, email, confirm_token) - VALUES ($1, $2, $3) - ON CONFLICT (project_id, email) DO UPDATE - SET confirm_token = $3, confirmed_at = NULL, unsubscribed_at = NULL, created_at = now() - """, - project["id"], - body.email, - token, - ) - - confirm_url = f"{settings.public_app_url}/status/confirm/{token}" - subject, html = confirmation_email(confirm_url) - ok, detail = await send(body.email, subject, html) - if not ok: - logger.warning("Confirmation email to subscriber failed: %s", detail) - return SubscribeResponse(ok=True) - - -@router.get("/status/subscriptions/{token}/confirm", response_model=SubscriptionStatusOut) -async def confirm_subscription( - token: str, - conn: asyncpg.Connection = Depends(get_db), -) -> SubscriptionStatusOut: - row = await conn.fetchrow( - """ - UPDATE status_subscribers SET confirmed_at = now() - WHERE confirm_token = $1 AND unsubscribed_at IS NULL - RETURNING email - """, - token, - ) - if row is None: - return SubscriptionStatusOut(ok=False, detail="This confirmation link is invalid or expired.") - return SubscriptionStatusOut(ok=True, detail=f"Subscribed — you'll get incident alerts at {row['email']}.") - - -@router.get("/status/subscriptions/{token}/unsubscribe", response_model=SubscriptionStatusOut) -async def unsubscribe( - token: str, - conn: asyncpg.Connection = Depends(get_db), -) -> SubscriptionStatusOut: - row = await conn.fetchrow( - """ - UPDATE status_subscribers SET unsubscribed_at = now() - WHERE confirm_token = $1 - RETURNING email - """, - token, - ) - if row is None: - return SubscriptionStatusOut(ok=False, detail="This unsubscribe link is invalid.") - return SubscriptionStatusOut(ok=True, detail=f"Unsubscribed {row['email']}.") diff --git a/apps/api/api/routes/query.py b/apps/api/api/routes/query.py index 4366ee0..dfea1b2 100644 --- a/apps/api/api/routes/query.py +++ b/apps/api/api/routes/query.py @@ -14,7 +14,6 @@ from api.schemas import ( EndpointStat, IncidentOut, - ServiceStatusOut, TimeseriesPoint, ) @@ -168,8 +167,7 @@ async def get_endpoints( # ─── Incidents ─────────────────────────────────────────────────────────────── async def fetch_incidents(conn: asyncpg.Connection, project_id: str) -> list[IncidentOut]: - """Recent incidents from the AI anomaly detection worker (Phase 5). Shared by the - authenticated dashboard route and the public status-page route.""" + """Recent incidents written by the AI anomaly detection worker (Phase 5).""" rows = await conn.fetch( """ SELECT id, severity, title, summary, endpoint, resolved, created_at @@ -200,115 +198,3 @@ async def get_incidents( conn: asyncpg.Connection = Depends(scoped_conn), ) -> list[IncidentOut]: return await fetch_incidents(conn, project_id) - - - -def _service_name(prefix: str) -> str: - """Map a route prefix to a human-readable service name.""" - segment = prefix.strip("/").split("/")[-1].lower() - _map = { - "auth": "Authentication", - "users": "User Service", - "user": "User Service", - "products": "Product Catalog", - "product": "Product Catalog", - "orders": "Order Management", - "order": "Order Management", - "payments": "Payments", - "payment": "Payments", - "search": "Search", - "webhooks": "Webhooks", - "analytics": "Analytics", - } - return _map.get(segment, prefix or "API") - - -async def fetch_services(conn: asyncpg.Connection, project_id: str) -> list[ServiceStatusOut]: - """ - Service health derived from route-prefix groups in event data. - Uptime bars represent up to 90 days; missing days default to 'up'. - Shared by the authenticated dashboard route and the public status-page route. - """ - rows = await conn.fetch( - """ - SELECT - '/' || split_part(route, '/', 2) AS prefix, - time_bucket('1 day', time) AS day, - AVG(duration_ms)::float AS avg_latency, - (SUM(CASE WHEN status_code >= 500 THEN 1 ELSE 0 END)::float / COUNT(*)) AS error_rate - FROM events - WHERE project_id = $1 - AND time >= now() - INTERVAL '90 days' - AND route IS NOT NULL - AND route != '' - GROUP BY prefix, day - ORDER BY prefix, day - """, - project_id, - ) - - if not rows: - return [] - - by_prefix: dict[str, list[dict]] = {} - for row in rows: - p = row["prefix"] or "/unknown" - if p not in by_prefix: - by_prefix[p] = [] - by_prefix[p].append( - { - "day": row["day"].date(), - "latency": row["avg_latency"] or 0.0, - "error_rate": row["error_rate"] or 0.0, - } - ) - - today = datetime.date.today() - result: list[ServiceStatusOut] = [] - - for i, (prefix, days) in enumerate(by_prefix.items()): - bar_map: dict[datetime.date, str] = { - d["day"]: ( - "down" if d["error_rate"] > 0.1 - else "degraded" if d["error_rate"] > 0.02 - else "up" - ) - for d in days - } - - uptime_bars: list[str] = [ - bar_map.get(today - datetime.timedelta(days=89 - j), "up") - for j in range(90) - ] - - up_count = sum(1 for b in uptime_bars if b == "up") - uptime_pct = round(up_count / 90 * 100, 2) - - latest_bar = bar_map.get(today) or bar_map.get(today - datetime.timedelta(days=1), "up") - current_status = {"up": "operational", "degraded": "degraded", "down": "major_outage"}[ - latest_bar - ] - - recent = sorted(days, key=lambda d: d["day"], reverse=True) - response_time = round(recent[0]["latency"], 1) if recent else 0.0 - - result.append( - ServiceStatusOut( - id=f"svc_{i:02d}", - name=_service_name(prefix), - uptime90d=uptime_pct, - current_status=current_status, - response_time=response_time, - uptime_bars=uptime_bars, - ) - ) - - return result[:10] - - -@router.get("/services", response_model=list[ServiceStatusOut]) -async def get_services( - project_id: str = Depends(resolve_project_id), - conn: asyncpg.Connection = Depends(scoped_conn), -) -> list[ServiceStatusOut]: - return await fetch_services(conn, project_id) diff --git a/apps/api/api/schemas.py b/apps/api/api/schemas.py index 6f17dba..5000be0 100644 --- a/apps/api/api/schemas.py +++ b/apps/api/api/schemas.py @@ -80,41 +80,3 @@ class IncidentOut(BaseModel): endpoint: str timestamp: str resolved: bool - - -class ServiceStatusOut(BaseModel): - id: str - name: str - uptime90d: float - current_status: str - response_time: float - uptime_bars: list[str] - - -# ─── Public status page ─────────────────────────────────────────────────────── - -class PublicStatusOut(BaseModel): - project_name: str - services: list[ServiceStatusOut] - incidents: list[IncidentOut] - - -class SubscribeRequest(BaseModel): - email: str = Field(..., min_length=3, max_length=254) - - @field_validator("email", mode="after") - @classmethod - def _basic_shape(cls, v: str) -> str: - v = v.strip().lower() - if "@" not in v or " " in v or v.startswith("@") or v.endswith("@"): - raise ValueError("not a valid email address") - return v - - -class SubscribeResponse(BaseModel): - ok: bool - - -class SubscriptionStatusOut(BaseModel): - ok: bool - detail: str diff --git a/apps/api/core/config.py b/apps/api/core/config.py index 503e66d..dfb8172 100644 --- a/apps/api/core/config.py +++ b/apps/api/core/config.py @@ -29,7 +29,7 @@ class Settings(BaseSettings): cerebras_model: str = "gpt-oss-120b" # ── CORS / realtime origins (Phase 8.5) ────────────────────────────────── - # Comma-separated list of allowed browser origins (dashboard + status page). + # Comma-separated list of allowed browser origins. # Only realtime (Socket.io / SSE) hits the API cross-origin — REST goes # through the same-origin BFF. cors_origins: str = "http://localhost:3000" @@ -38,14 +38,6 @@ class Settings(BaseSettings): # Max events accepted per project per minute (fixed window). 0 = unlimited. ingest_rate_limit_per_min: int = 120_000 - # ── Email (public status page subscriptions) ───────────────────────────── - # Resend API key for confirmation + incident-alert emails. Empty in dev — - # core.email.send() logs and no-ops instead of raising when unset. - resend_api_key: SecretStr = SecretStr("") - email_from: str = "Liveboard Status " - # Public origin used to build confirm/unsubscribe links in emails. - public_app_url: str = "http://localhost:3000" - # ── Environment ─────────────────────────────────────────────────────────── environment: str = "development" diff --git a/apps/api/core/email.py b/apps/api/core/email.py deleted file mode 100644 index 7c78ae6..0000000 --- a/apps/api/core/email.py +++ /dev/null @@ -1,67 +0,0 @@ -""" -Status-page subscriber email — confirmation + incident-alert messages, sent -via the Resend HTTP API (no SDK, same style as core/notify.deliver). - -Returns (ok, detail) and never raises — a delivery failure must not crash the -subscribe endpoint or the anomaly evaluation loop. -""" -from __future__ import annotations - -import logging - -import httpx - -from core.config import settings - -logger = logging.getLogger(__name__) - -_TIMEOUT = 8.0 -_RESEND_URL = "https://api.resend.com/emails" - - -async def send(to: str, subject: str, html: str) -> tuple[bool, str]: - api_key = settings.resend_api_key.get_secret_value() - if not api_key: - logger.warning("RESEND_API_KEY not set — skipping email to %s (%s)", to, subject) - return False, "email not configured" - - try: - async with httpx.AsyncClient(timeout=_TIMEOUT) as client: - r = await client.post( - _RESEND_URL, - headers={"Authorization": f"Bearer {api_key}"}, - json={ - "from": settings.email_from, - "to": [to], - "subject": subject, - "html": html, - }, - ) - ok = 200 <= r.status_code < 300 - if not ok: - logger.warning("Email to %s failed: HTTP %s", to, r.status_code) - return ok, f"HTTP {r.status_code}" - except Exception as exc: # network / timeout - logger.warning("Email to %s errored: %s", to, exc) - return False, str(exc)[:160] - - -def confirmation_email(confirm_url: str) -> tuple[str, str]: - subject = "Confirm your Liveboard status alerts" - html = ( - "

Click below to confirm you'd like incident alerts for this status page.

" - f'

Confirm subscription

' - "

If you didn't request this, ignore this email.

" - ) - return subject, html - - -def incident_email(title: str, summary: str, status_url: str, unsubscribe_url: str) -> tuple[str, str]: - subject = f"Incident: {title}" - html = ( - f"

{title}

" - f"

{summary}

" - f'

View status page

' - f'

Unsubscribe

' - ) - return subject, html diff --git a/apps/api/main.py b/apps/api/main.py index f8aa252..ac497b8 100644 --- a/apps/api/main.py +++ b/apps/api/main.py @@ -8,7 +8,7 @@ from fastapi import FastAPI from fastapi.middleware.cors import CORSMiddleware -from api.routes import ingest, internal, projects, public_status, query +from api.routes import ingest, internal, projects, query from core.config import settings from core.database import close_pool, get_pool from core.redis_client import close_redis @@ -68,7 +68,6 @@ async def lifespan(app: FastAPI): _fastapi.include_router(projects.router) _fastapi.include_router(internal.router) _fastapi.include_router(query.router) -_fastapi.include_router(public_status.router) _fastapi.include_router(sse_router) diff --git a/apps/api/migrations/versions/007_public_status_page.py b/apps/api/migrations/versions/007_public_status_page.py deleted file mode 100644 index 57223e9..0000000 --- a/apps/api/migrations/versions/007_public_status_page.py +++ /dev/null @@ -1,36 +0,0 @@ -"""Public per-project status page (opt-in) - -Revision ID: 007 -Revises: 006 -Create Date: 2026-07-20 - -Lets a project owner publish a logged-out-visitable status page at -/status/{public_slug}, scoped to exactly that project. Off by default — -`status_page_enabled` must be flipped on (see /v1/internal/projects/{id}/status-page) -before the public route will serve anything for a project. -""" - -from alembic import op - -revision = "007" -down_revision = "005" -branch_labels = None -depends_on = None - - -def upgrade() -> None: - op.execute("ALTER TABLE projects ADD COLUMN IF NOT EXISTS public_slug TEXT;") - op.execute( - "ALTER TABLE projects ADD COLUMN IF NOT EXISTS status_page_enabled " - "BOOLEAN NOT NULL DEFAULT FALSE;" - ) - op.execute( - "CREATE UNIQUE INDEX IF NOT EXISTS idx_projects_public_slug " - "ON projects(public_slug) WHERE public_slug IS NOT NULL;" - ) - - -def downgrade() -> None: - op.execute("DROP INDEX IF EXISTS idx_projects_public_slug;") - op.execute("ALTER TABLE projects DROP COLUMN IF EXISTS status_page_enabled;") - op.execute("ALTER TABLE projects DROP COLUMN IF EXISTS public_slug;") diff --git a/apps/api/migrations/versions/008_status_subscribers.py b/apps/api/migrations/versions/008_status_subscribers.py deleted file mode 100644 index 1f2a092..0000000 --- a/apps/api/migrations/versions/008_status_subscribers.py +++ /dev/null @@ -1,42 +0,0 @@ -"""Status page incident-alert subscribers (double opt-in by email) - -Revision ID: 008 -Revises: 007 -Create Date: 2026-07-20 - -Backs the public status page's "Get Incident Alerts" form. A row is created -on subscribe with `confirmed_at = NULL`; the anomaly worker only emails rows -where `confirmed_at IS NOT NULL AND unsubscribed_at IS NULL`, so an address is -never emailed until it's clicked its confirmation link. -""" - -from alembic import op - -revision = "008" -down_revision = "007" -branch_labels = None -depends_on = None - - -def upgrade() -> None: - op.execute(""" - CREATE TABLE IF NOT EXISTS status_subscribers ( - id UUID PRIMARY KEY DEFAULT gen_random_uuid(), - project_id UUID NOT NULL REFERENCES projects(id) ON DELETE CASCADE, - email TEXT NOT NULL, - confirm_token TEXT UNIQUE NOT NULL, - confirmed_at TIMESTAMPTZ, - unsubscribed_at TIMESTAMPTZ, - created_at TIMESTAMPTZ DEFAULT now(), - UNIQUE (project_id, email) - ); - """) - op.execute( - "CREATE INDEX IF NOT EXISTS idx_status_subscribers_active " - "ON status_subscribers(project_id) " - "WHERE confirmed_at IS NOT NULL AND unsubscribed_at IS NULL;" - ) - - -def downgrade() -> None: - op.execute("DROP TABLE IF EXISTS status_subscribers;") diff --git a/apps/api/worker/anomaly.py b/apps/api/worker/anomaly.py index dda0b85..e8ff03c 100644 --- a/apps/api/worker/anomaly.py +++ b/apps/api/worker/anomaly.py @@ -21,7 +21,6 @@ from core.config import settings from core.database import get_pool -from core.email import incident_email, send as send_email from core.redis_client import get_redis logger = logging.getLogger(__name__) @@ -241,37 +240,6 @@ async def _handle_anomaly( await redis.publish(f"incidents:{project_id}", json.dumps(payload)) logger.info("Incident created id=%s project=%s", row["id"], project_id) - await _notify_subscribers(conn, project_id, title, summary) - - -async def _notify_subscribers(conn, project_id: str, title: str, summary: str) -> None: - """ - Email confirmed, active status-page subscribers about a new incident. - Best-effort — a delivery failure must not break the anomaly loop, same as - the alert-channel worker's notify.deliver. - """ - rows = await conn.fetch( - """ - SELECT s.email, s.confirm_token, p.public_slug - FROM status_subscribers s - JOIN projects p ON p.id = s.project_id - WHERE s.project_id = $1 AND s.confirmed_at IS NOT NULL AND s.unsubscribed_at IS NULL - """, - project_id, - ) - if not rows or not rows[0]["public_slug"]: - return - - status_url = f"{settings.public_app_url}/status/{rows[0]['public_slug']}" - for row in rows: - unsubscribe_url = f"{settings.public_app_url}/status/unsubscribe/{row['confirm_token']}" - subject, html = incident_email(title, summary, status_url, unsubscribe_url) - ok, detail = await send_email(row["email"], subject, html) - if not ok: - logger.warning("Incident email to %s failed: %s", row["email"], detail) - - -# ─── Cerebras summariser ───────────────────────────────────────────────────── async def _generate_summary( metric: str, diff --git a/components/landing/footer.tsx b/components/landing/footer.tsx index d109461..c2e8c3a 100644 --- a/components/landing/footer.tsx +++ b/components/landing/footer.tsx @@ -13,7 +13,7 @@ const COLUMNS: { title: string; links: FooterLink[] }[] = [ links: [ { label: "Features", href: "#features" }, { label: "Anomaly detection", href: "#detection" }, - { label: "Status page", href: "#status" }, + { label: "Self-hosting", href: "https://github.com/ryzrr/liveboard#quick-start", external: true }, ], }, { diff --git a/components/landing/navbar.tsx b/components/landing/navbar.tsx index 4df9363..2086ea9 100644 --- a/components/landing/navbar.tsx +++ b/components/landing/navbar.tsx @@ -10,7 +10,6 @@ import { primaryButtonClass } from "@/components/landing/button-styles"; const NAV_LINKS = [ { label: "Features", href: "#features" }, { label: "Detection", href: "#detection" }, - { label: "Status page", href: "#status" }, ]; const GITHUB_URL = "https://github.com/ryzrr/liveboard"; diff --git a/components/landing/stats-section.tsx b/components/landing/stats-section.tsx index c056e5a..a7e9d06 100644 --- a/components/landing/stats-section.tsx +++ b/components/landing/stats-section.tsx @@ -14,7 +14,7 @@ export function StatsSection() { Built to be adopted in an afternoon.

- No agents, no sidecars, no new infrastructure to run. Two SDKs, one line of middleware, and a status page for free. + No agents, no sidecars, no new infrastructure to run. Two SDKs, one line of middleware, and Docker Compose.

diff --git a/components/landing/status-section.tsx b/components/landing/status-section.tsx deleted file mode 100644 index 07f1f8c..0000000 --- a/components/landing/status-section.tsx +++ /dev/null @@ -1,28 +0,0 @@ -import { RevealOnScroll } from "@/components/landing/reveal-on-scroll"; -import { ScreenshotFrame } from "@/components/landing/screenshot-frame"; - -export function StatusSection() { - return ( -
-
- -

- A status page your users actually trust. -

-

- Generated from the same data you already collect: uptime, incident timelines, and component health, published automatically. -

-
- - - - -
-
- ); -} diff --git a/components/layout/sidebar.tsx b/components/layout/sidebar.tsx index a25afa6..9c36274 100644 --- a/components/layout/sidebar.tsx +++ b/components/layout/sidebar.tsx @@ -5,7 +5,6 @@ import { usePathname } from "next/navigation"; import { LayoutDashboard, Zap, - Globe, Settings, } from "lucide-react"; import { cn } from "@/lib/utils"; @@ -16,7 +15,6 @@ import { UserMenu } from "@/components/auth/user-menu"; const NAV_ITEMS = [ { href: "/overview", label: "Overview", icon: LayoutDashboard }, { href: "/endpoints", label: "Endpoints", icon: Zap }, - { href: "/status", label: "Status Page", icon: Globe }, ]; export function Sidebar() { diff --git a/components/providers/project-provider.tsx b/components/providers/project-provider.tsx index eee3a0b..145763a 100644 --- a/components/providers/project-provider.tsx +++ b/components/providers/project-provider.tsx @@ -17,8 +17,6 @@ export interface Project { /** Masked display-only key hint: lb_live_abcd•••• */ apiKeyMasked: string; createdAt: string; - statusPageEnabled: boolean; - publicSlug: string | null; } export interface CreateProjectResult { @@ -35,7 +33,6 @@ interface ProjectContextValue { createProject: (name: string) => Promise; deleteProject: (id: string) => Promise; rotateKey: (id: string) => Promise; - setStatusPageEnabled: (id: string, enabled: boolean) => Promise<{ enabled: boolean; publicSlug: string | null }>; refresh: () => Promise; } @@ -46,8 +43,6 @@ interface ProjectDetailDTO { org_id: string; api_key_masked: string; created_at: string; - status_page_enabled: boolean; - public_slug: string | null; } function fromDTO(d: ProjectDetailDTO): Project { @@ -56,8 +51,6 @@ function fromDTO(d: ProjectDetailDTO): Project { name: d.name, apiKeyMasked: d.api_key_masked, createdAt: d.created_at, - statusPageEnabled: d.status_page_enabled, - publicSlug: d.public_slug, }; } @@ -143,8 +136,6 @@ export function ProjectProvider({ children }: { children: React.ReactNode }) { name: data.project.name, apiKeyMasked: maskRaw(data.new_api_key), createdAt: new Date().toISOString(), - statusPageEnabled: false, - publicSlug: null, }; return { project, rawApiKey: data.new_api_key }; }, @@ -169,21 +160,6 @@ export function ProjectProvider({ children }: { children: React.ReactNode }) { return data.new_api_key; }, [refresh]); - const setStatusPageEnabled = useCallback( - async (id: string, enabled: boolean): Promise<{ enabled: boolean; publicSlug: string | null }> => { - const res = await fetch(`/api/projects/${id}/status-page`, { - method: "PATCH", - headers: { "content-type": "application/json" }, - body: JSON.stringify({ enabled }), - }); - if (!res.ok) throw new Error("Failed to update status page setting"); - const data = (await res.json()) as { enabled: boolean; public_slug: string | null }; - await refresh(); - return { enabled: data.enabled, publicSlug: data.public_slug }; - }, - [refresh] - ); - const activeProject = projects.find((p) => p.id === activeProjectId) ?? projects[0] ?? null; @@ -197,7 +173,6 @@ export function ProjectProvider({ children }: { children: React.ReactNode }) { createProject, deleteProject, rotateKey, - setStatusPageEnabled, refresh, }} > diff --git a/components/settings/project-settings-card.tsx b/components/settings/project-settings-card.tsx index 6b03f86..aac9ed0 100644 --- a/components/settings/project-settings-card.tsx +++ b/components/settings/project-settings-card.tsx @@ -1,33 +1,29 @@ "use client"; import { useState } from "react"; -import { Check, Copy, ExternalLink, RefreshCw, Trash2 } from "lucide-react"; +import { Check, Copy, RefreshCw, Trash2 } from "lucide-react"; import { useProjects, type Project } from "@/components/providers/project-provider"; import { Button } from "@/components/ui/button"; -import { cn, timeAgo } from "@/lib/utils"; +import { timeAgo } from "@/lib/utils"; interface Props { project: Project; } /** - * One project's real settings: API key + rotate, public status page toggle, - * and a destructive delete — all backed by the existing ProjectProvider - * actions (rotateKey/setStatusPageEnabled/deleteProject), which were already - * fully wired to the backend but had no UI caller anywhere in the app. + * One project's real settings: API key + rotate and a destructive delete — + * both backed by the existing ProjectProvider actions (rotateKey / + * deleteProject), which were already fully wired to the backend but had no + * UI caller anywhere in the app. */ export function ProjectSettingsCard({ project }: Props) { - const { rotateKey, deleteProject, setStatusPageEnabled } = useProjects(); + const { rotateKey, deleteProject } = useProjects(); const [rotateConfirm, setRotateConfirm] = useState(false); const [rotating, setRotating] = useState(false); const [newKey, setNewKey] = useState(null); const [copiedKey, setCopiedKey] = useState(false); - const [statusSaving, setStatusSaving] = useState(false); - const [statusError, setStatusError] = useState(""); - const [copiedLink, setCopiedLink] = useState(false); - const [deleteOpen, setDeleteOpen] = useState(false); const [deleteConfirmText, setDeleteConfirmText] = useState(""); const [deleting, setDeleting] = useState(false); @@ -54,30 +50,6 @@ export function ProjectSettingsCard({ project }: Props) { }); } - async function handleToggleStatusPage() { - setStatusSaving(true); - setStatusError(""); - try { - await setStatusPageEnabled(project.id, !project.statusPageEnabled); - } catch { - setStatusError("Couldn't update the status page. Please try again."); - } finally { - setStatusSaving(false); - } - } - - const publicUrl = project.publicSlug - ? `${typeof window !== "undefined" ? window.location.origin : ""}/status/${project.publicSlug}` - : null; - - function copyLink() { - if (!publicUrl) return; - navigator.clipboard.writeText(publicUrl).then(() => { - setCopiedLink(true); - setTimeout(() => setCopiedLink(false), 2000); - }); - } - async function handleDelete() { setDeleting(true); setDeleteError(""); @@ -143,60 +115,6 @@ export function ProjectSettingsCard({ project }: Props) { )}
- {/* Public status page */} -
-
-
-

Public status page

-

- Anyone with the link can view it — no account needed. -

-
- -
- - {project.statusPageEnabled && publicUrl && ( -
- - - - - -
- )} - {statusError &&

{statusError}

} -
- {/* Danger zone */}

Danger zone

diff --git a/components/status/auto-refresh.tsx b/components/status/auto-refresh.tsx deleted file mode 100644 index 9dd7088..0000000 --- a/components/status/auto-refresh.tsx +++ /dev/null @@ -1,16 +0,0 @@ -"use client"; - -import { useEffect } from "react"; -import { useRouter } from "next/navigation"; - -/** Periodically re-runs the current route's Server Component with fresh data - * (no client-side fetch, no session) — backs the "updates in real time" claim - * on the public status page. */ -export function AutoRefresh({ intervalMs = 30_000 }: { intervalMs?: number }) { - const router = useRouter(); - useEffect(() => { - const id = setInterval(() => router.refresh(), intervalMs); - return () => clearInterval(id); - }, [router, intervalMs]); - return null; -} diff --git a/components/status/incident-card.tsx b/components/status/incident-card.tsx deleted file mode 100644 index 2622928..0000000 --- a/components/status/incident-card.tsx +++ /dev/null @@ -1,123 +0,0 @@ -"use client"; - -import { useState, useMemo } from "react"; -import { ChevronDown } from "lucide-react"; -import { Badge } from "@/components/ui/badge"; -import { cn, timeAgo } from "@/lib/utils"; -import type { Incident } from "@/lib/types"; - -type TimelineStep = "investigating" | "identified" | "monitoring" | "resolved"; - -const STEP_COLORS: Record = { - investigating: "#EF4444", - identified: "#F59E0B", - monitoring: "#378ADD", - resolved: "#22C55E", -}; - -const STEP_ORDER: TimelineStep[] = ["investigating", "identified", "monitoring", "resolved"]; - -function buildTimeline(incident: Incident): { step: TimelineStep; time: Date; note: string; done: boolean }[] { - const base = incident.timestamp.getTime(); - const steps: TimelineStep[] = incident.resolved - ? ["investigating", "identified", "monitoring", "resolved"] - : ["investigating", "identified"]; - - const offsets = [0, 8 * 60000, 22 * 60000, 35 * 60000]; - const notes: Record = { - investigating: "Incident detected and engineers paged.", - identified: `Root cause identified: elevated error rate on ${incident.endpoint}.`, - monitoring: "Fix deployed, monitoring for stability.", - resolved: "All systems back to normal. Post-mortem scheduled.", - }; - - return STEP_ORDER.map((step, i) => ({ - step, - time: new Date(base + offsets[i]!), - note: notes[step], - done: steps.includes(step), - })); -} - -/** Incident card with an expandable status timeline. Shared by the authed - * status preview and the public /status/[slug] page — no hooks beyond local - * expand/collapse state, so it renders the same either side of auth. */ -export function IncidentCard({ incident }: { incident: Incident }) { - const [expanded, setExpanded] = useState(!incident.resolved); - const timeline = useMemo(() => buildTimeline(incident), [incident]); - const currentStep = incident.resolved ? "resolved" : timeline.filter((t) => t.done).slice(-1)[0]?.step ?? "investigating"; - - return ( -
- {/* Header */} - - - {/* Timeline */} - {expanded && ( -
-

Timeline

-
- {/* Vertical connector */} -
- -
- {timeline.map(({ step, time, note, done }) => ( -
- {/* Step dot */} -
-
-
- - {step} - - {done && ( - {timeAgo(time)} - )} -
-

{note}

-
-
- ))} -
-
-
- )} -
- ); -} diff --git a/components/status/overall-banner.tsx b/components/status/overall-banner.tsx deleted file mode 100644 index 6e1299c..0000000 --- a/components/status/overall-banner.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import { CheckCircle2, AlertTriangle, XCircle } from "lucide-react"; - -const OVERALL_STATUS = { - operational: { - label: "All Systems Operational", - color: "text-green", - bg: "bg-green/10 border-green/20", - icon: CheckCircle2, - }, - degraded: { - label: "Degraded Performance", - color: "text-yellow", - bg: "bg-yellow/10 border-yellow/20", - icon: AlertTriangle, - }, - partial_outage: { - label: "Partial Outage", - color: "text-red", - bg: "bg-red/10 border-red/20", - icon: XCircle, - }, -}; - -/** Top status banner — shared by the authed status preview and the public - * /status/[slug] page. Server-renderable: no hooks, no client state. */ -export function OverallBanner({ hasDegraded, lastChecked }: { hasDegraded: boolean; lastChecked: string | null }) { - const key: keyof typeof OVERALL_STATUS = hasDegraded ? "degraded" : "operational"; - const overall = OVERALL_STATUS[key]; - const StatusIcon = overall.icon; - - return ( -
- -
-

{overall.label}

-

- {lastChecked ? `Last checked: ${lastChecked} · ` : ""}Updates in real time -

-
-
- ); -} diff --git a/components/status/subscribe-form.tsx b/components/status/subscribe-form.tsx deleted file mode 100644 index df547d7..0000000 --- a/components/status/subscribe-form.tsx +++ /dev/null @@ -1,67 +0,0 @@ -"use client"; - -import { useState } from "react"; -import { Mail } from "lucide-react"; -import { Button } from "@/components/ui/button"; - -const API_URL = process.env.NEXT_PUBLIC_API_URL ?? "http://localhost:8000"; - -/** - * Public, unauthenticated subscribe form — posts straight to the FastAPI - * public-status endpoint (CORS-allowed for this origin) rather than the - * session-gated BFF, since a status-page visitor never has a session. - * Shared by the public /status/[slug] page and the owner's authed preview. - */ -export function SubscribeForm({ slug }: { slug: string }) { - const [email, setEmail] = useState(""); - const [state, setState] = useState<"idle" | "sending" | "sent" | "error">("idle"); - - async function handleSubscribe() { - if (!email.trim()) return; - setState("sending"); - try { - const res = await fetch(`${API_URL}/v1/public/status/${encodeURIComponent(slug)}/subscribe`, { - method: "POST", - headers: { "content-type": "application/json" }, - body: JSON.stringify({ email: email.trim() }), - }); - if (!res.ok) throw new Error(String(res.status)); - setState("sent"); - } catch { - setState("error"); - } - } - - return ( -
-
- -

Get Incident Alerts

-
-

- Subscribe to receive email notifications for incidents and status updates. -

- - {state === "sent" ? ( -

Check your email to confirm the subscription.

- ) : ( -
- setEmail(e.target.value)} - disabled={state === "sending"} - className="flex-1 bg-[#0D0D0D] border border-[#2A2A2A] rounded px-3 py-1.5 text-sm text-[#F5F5F5] placeholder-[#333] outline-none focus:border-blue transition-colors" - /> - -
- )} - {state === "error" && ( -

Something went wrong — try again.

- )} -
- ); -} diff --git a/components/status/uptime-bar.tsx b/components/status/uptime-bar.tsx deleted file mode 100644 index 42781a0..0000000 --- a/components/status/uptime-bar.tsx +++ /dev/null @@ -1,75 +0,0 @@ -"use client"; - -import { cn } from "@/lib/utils"; -import type { ServiceStatus } from "@/lib/types"; - -interface UptimeBarProps { - service: ServiceStatus; -} - -const STATUS_LABELS = { - operational: "Operational", - degraded: "Degraded", - partial_outage: "Partial Outage", - major_outage: "Major Outage", -}; - -const STATUS_COLORS = { - operational: "text-green", - degraded: "text-yellow", - partial_outage: "text-red", - major_outage: "text-red", -}; - -const BAR_COLORS = { - up: "bg-green/70", - degraded: "bg-yellow/70", - down: "bg-red/70", -}; - -export function UptimeBar({ service }: UptimeBarProps) { - return ( -
-
-
-

{service.name}

-
-
- - {STATUS_LABELS[service.currentStatus]} - -
-
-
-

{service.uptime90d.toFixed(2)}%

-

uptime (90d)

-
-
- - {/* Uptime bars */} -
- {service.uptimeBars.map((status, i) => ( -
- ))} -
-
- 90 days ago - Today -
-
- ); -} diff --git a/hooks/use-data.ts b/hooks/use-data.ts index fda564a..e52e96f 100644 --- a/hooks/use-data.ts +++ b/hooks/use-data.ts @@ -14,7 +14,6 @@ import type { ChartData, Endpoint, Incident, - ServiceStatus, } from "@/lib/types"; // ─── Raw API shapes (snake_case) ───────────────────────────────────────────── @@ -42,15 +41,6 @@ interface ApiIncident { resolved: boolean; } -interface ApiService { - id: string; - name: string; - uptime90d: number; - current_status: string; - response_time: number; - uptime_bars: string[]; -} - // ─── Transforms ────────────────────────────────────────────────────────────── function toEndpoints(raw: unknown): Endpoint[] { @@ -80,17 +70,6 @@ function toIncidents(raw: unknown): Incident[] { })); } -function toServices(raw: unknown): ServiceStatus[] { - return (raw as ApiService[]).map((s) => ({ - id: s.id, - name: s.name, - uptime90d: s.uptime90d, - currentStatus: s.current_status as ServiceStatus["currentStatus"], - responseTime: s.response_time, - uptimeBars: s.uptime_bars as ServiceStatus["uptimeBars"], - })); -} - // ─── Hooks ─────────────────────────────────────────────────────────────────── /** Request-volume and status-code breakdown for the overview charts. Polls every 30 s. */ @@ -118,8 +97,3 @@ export function useEndpoints(hours = 24) { toEndpoints, ); } - -/** Service health derived from route-prefix groups — used by the status page. */ -export function useServices() { - return useApiQuery("/v1/services", {}, EMPTY_LIST as unknown as ServiceStatus[], toServices, 30_000); -} diff --git a/lib/types.ts b/lib/types.ts index 784fa5e..815a5d8 100644 --- a/lib/types.ts +++ b/lib/types.ts @@ -42,15 +42,6 @@ export interface Endpoint { healthScore: number; } -export interface ServiceStatus { - id: string; - name: string; - uptime90d: number; - currentStatus: "operational" | "degraded" | "partial_outage" | "major_outage"; - responseTime: number; - uptimeBars: ("up" | "degraded" | "down")[]; -} - export interface MetricPoint { time: string; value: number; diff --git a/proxy.ts b/proxy.ts index 88c3cfe..a24413e 100644 --- a/proxy.ts +++ b/proxy.ts @@ -14,9 +14,5 @@ export const config = { "/overview/:path*", "/endpoints/:path*", "/settings/:path*", - // Exact match only — the authenticated status *preview*. Must NOT be a - // wildcard: /status/[slug], /status/confirm/[token], and - // /status/unsubscribe/[token] are intentionally public (no session). - "/status", ], }; diff --git a/public/shots/status.png b/public/shots/status.png deleted file mode 100644 index ea37b7d16215b3e9ce4bd012c3c295a742b2ee4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 139630 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�?t3FU$WkR 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 Q$+C*_a`&ZNbq)RPKRIxx)Bpeg From 7981480d242ded6b3574bb4f8d1d5084dd51afdc Mon Sep 17 00:00:00 2001 From: ryzrr Date: Tue, 8 Sep 2026 00:37:37 +0530 Subject: [PATCH 5/9] trim: reduce endpoint explorer to the core table Keeps the sortable per-route table with p50/p95/p99, error rate and health score, plus route search and the method filter. Drops the detail drawer, the two-endpoint comparison mode, the latency histogram, and the approximate status-range/latency-threshold filters that went with them. The /v1/endpoints query is unchanged. --- app/(dashboard)/endpoints/page.tsx | 177 ++----------------- components/charts/latency-histogram.tsx | 61 ------- components/endpoints/endpoint-comparison.tsx | 137 -------------- components/endpoints/endpoint-drawer.tsx | 137 -------------- components/endpoints/endpoint-table.tsx | 22 +-- 5 files changed, 22 insertions(+), 512 deletions(-) delete mode 100644 components/charts/latency-histogram.tsx delete mode 100644 components/endpoints/endpoint-comparison.tsx delete mode 100644 components/endpoints/endpoint-drawer.tsx diff --git a/app/(dashboard)/endpoints/page.tsx b/app/(dashboard)/endpoints/page.tsx index 8ebef61..df65858 100644 --- a/app/(dashboard)/endpoints/page.tsx +++ b/app/(dashboard)/endpoints/page.tsx @@ -1,100 +1,43 @@ "use client"; import { useState, useMemo } from "react"; -import { Search, GitCompare, X } from "lucide-react"; +import { Search } from "lucide-react"; import { Topbar } from "@/components/layout/topbar"; import { TimeRangePicker } from "@/components/layout/time-range-picker"; import { EndpointTable } from "@/components/endpoints/endpoint-table"; -import { EndpointDrawer } from "@/components/endpoints/endpoint-drawer"; -import { EndpointComparison } from "@/components/endpoints/endpoint-comparison"; import { Badge } from "@/components/ui/badge"; -import { Button } from "@/components/ui/button"; import { useTimeRange } from "@/hooks/use-time-range"; import { useEndpoints } from "@/hooks/use-data"; import { useProjects } from "@/components/providers/project-provider"; -import type { Endpoint } from "@/lib/types"; const METHODS = ["ALL", "GET", "POST", "PUT", "DELETE", "PATCH"] as const; -const STATUS_RANGES = [ - { label: "2xx", min: 200, max: 299 }, - { label: "4xx", min: 400, max: 499 }, - { label: "5xx", min: 500, max: 599 }, -] as const; - export default function EndpointsPage() { const { activeProject } = useProjects(); const { range, setRange } = useTimeRange("24h"); - const [selected, setSelected] = useState(null); const [search, setSearch] = useState(""); const [methodFilter, setMethodFilter] = useState("ALL"); - const [statusFilter, setStatusFilter] = useState>(new Set()); - const [maxLatency, setMaxLatency] = useState(""); - - // Comparison mode - const [compareMode, setCompareMode] = useState(false); - const [compareSelection, setCompareSelection] = useState([]); - const { data: endpoints } = useEndpoints(range === "7d" ? 168 : range === "24h" ? 24 : range === "6h" ? 6 : 1); + const { data: endpoints } = useEndpoints( + range === "7d" ? 168 : range === "24h" ? 24 : range === "6h" ? 6 : 1 + ); const filtered = useMemo(() => { return endpoints.filter((ep) => { if (!ep.route.toLowerCase().includes(search.toLowerCase())) return false; if (methodFilter !== "ALL" && ep.method !== methodFilter) return false; - if (statusFilter.size > 0) { - const matched = [...statusFilter].some((label) => { - const range = STATUS_RANGES.find((r) => r.label === label); - return range && ep.errorRate >= 0; // status filter is approximate via errorRate - }); - // For mock data we don't have exact status, use errorRate as proxy - // 5xx → errorRate > 5, 4xx → 1–5%, 2xx → < 1% - if (statusFilter.has("2xx") && !statusFilter.has("4xx") && !statusFilter.has("5xx")) { - if (ep.errorRate >= 1) return false; - } - if (statusFilter.has("4xx") && !statusFilter.has("2xx") && !statusFilter.has("5xx")) { - if (ep.errorRate < 1 || ep.errorRate >= 5) return false; - } - if (statusFilter.has("5xx") && !statusFilter.has("2xx") && !statusFilter.has("4xx")) { - if (ep.errorRate < 5) return false; - } - void matched; - } - if (maxLatency !== "") { - const threshold = parseInt(maxLatency, 10); - if (!isNaN(threshold) && ep.p99 > threshold) return false; - } return true; }); - }, [endpoints, search, methodFilter, statusFilter, maxLatency]); - - const summary = useMemo(() => ({ - healthy: endpoints.filter((e) => e.healthScore >= 80).length, - warning: endpoints.filter((e) => e.healthScore >= 50 && e.healthScore < 80).length, - critical: endpoints.filter((e) => e.healthScore < 50).length, - }), [endpoints]); - - function toggleStatusFilter(label: string) { - setStatusFilter((prev) => { - const next = new Set(prev); - if (next.has(label)) { next.delete(label); } else { next.add(label); } - return next; - }); - } - - function handleCompareSelect(ep: Endpoint) { - setCompareSelection((prev) => { - if (prev.some((e) => e.id === ep.id)) return prev.filter((e) => e.id !== ep.id); - if (prev.length >= 2) return [prev[1]!, ep]; - return [...prev, ep]; - }); - } - - function exitCompare() { - setCompareMode(false); - setCompareSelection([]); - } - - const showingComparison = compareMode && compareSelection.length === 2; + }, [endpoints, search, methodFilter]); + + const summary = useMemo( + () => ({ + healthy: endpoints.filter((e) => e.healthScore >= 80).length, + warning: endpoints.filter((e) => e.healthScore >= 50 && e.healthScore < 80).length, + critical: endpoints.filter((e) => e.healthScore < 50).length, + }), + [endpoints] + ); return (
@@ -111,42 +54,9 @@ export default function EndpointsPage() { {summary.warning} Warning {summary.critical} Critical
-
- {filtered.length} endpoints - -
+ {filtered.length} endpoints
- {/* Compare mode hint */} - {compareMode && !showingComparison && ( -
- - {compareSelection.length === 0 - ? "Select 2 endpoints to compare" - : `${compareSelection.length}/2 selected — pick one more`} - {compareSelection.length > 0 && ( - - )} -
- )} - - {/* Comparison panel */} - {showingComparison && ( - - )} - {/* Filter bar */}
{/* Route search */} @@ -175,65 +85,10 @@ export default function EndpointsPage() { ))}
- - {/* Status range filter */} -
- {STATUS_RANGES.map(({ label }) => ( - - ))} -
- - {/* Latency threshold */} -
- p99 < - setMaxLatency(e.target.value)} - className="bg-transparent text-xs text-[#F5F5F5] placeholder-[#808080] outline-none w-14 text-right tabular-nums" - /> - ms - {maxLatency && ( - - )} -
- {/* Table + drawer */} -
- e.id) : []} - onSelect={(ep) => { - if (compareMode) { - handleCompareSelect(ep); - } else { - setSelected(ep.id === selected?.id ? null : ep); - } - }} - /> -
+
- - {!compareMode && setSelected(null)} />}
); } diff --git a/components/charts/latency-histogram.tsx b/components/charts/latency-histogram.tsx deleted file mode 100644 index a710400..0000000 --- a/components/charts/latency-histogram.tsx +++ /dev/null @@ -1,61 +0,0 @@ -"use client"; - -import { ResponsiveContainer, BarChart, Bar, XAxis, YAxis, Tooltip, Cell } from "recharts"; - -interface LatencyHistogramProps { - p50: number; - p95: number; - p99: number; -} - -interface TooltipPayload { - value: number; - payload: { label: string }; -} - -interface CustomTooltipProps { - active?: boolean; - payload?: TooltipPayload[]; -} - -function CustomTooltip({ active, payload }: CustomTooltipProps) { - if (!active || !payload?.length) return null; - return ( -
-

{payload[0].payload.label}

-

{payload[0].value}ms

-
- ); -} - -export function LatencyHistogram({ p50, p95, p99 }: LatencyHistogramProps) { - const data = [ - { label: "p50", value: p50, color: "#22C55E" }, - { label: "p95", value: p95, color: "#F59E0B" }, - { label: "p99", value: p99, color: "#EF4444" }, - ]; - - return ( - - - - - } cursor={{ fill: "rgba(255,255,255,0.03)" }} /> - - {data.map((entry, index) => ( - - ))} - - - - ); -} diff --git a/components/endpoints/endpoint-comparison.tsx b/components/endpoints/endpoint-comparison.tsx deleted file mode 100644 index 823c882..0000000 --- a/components/endpoints/endpoint-comparison.tsx +++ /dev/null @@ -1,137 +0,0 @@ -"use client"; - -import { useMemo } from "react"; -import { X } from "lucide-react"; -import { - LineChart, Line, XAxis, YAxis, Tooltip, ResponsiveContainer, Legend, -} from "recharts"; -import { formatMs, getMethodColor } from "@/lib/utils"; -import type { Endpoint } from "@/lib/types"; - -interface EndpointComparisonProps { - endpoints: [Endpoint, Endpoint]; - onClose: () => void; -} - -function generateLatencyHistory(p99: number) { - return Array.from({ length: 24 }, (_, i) => ({ - hour: `${i}:00`, - value: Math.max(10, p99 + Math.round((Math.random() - 0.5) * p99 * 0.4)), - })); -} - -const COLORS = ["#378ADD", "#A855F7"] as const; - -export function EndpointComparison({ endpoints, onClose }: EndpointComparisonProps) { - const [a, b] = endpoints; - - const chartData = useMemo(() => { - const aHistory = generateLatencyHistory(a.p99); - const bHistory = generateLatencyHistory(b.p99); - return aHistory.map((pt, i) => ({ - hour: pt.hour, - [a.route]: pt.value, - [b.route]: bHistory[i]!.value, - })); - }, [a, b]); - - const metrics: { label: string; aVal: string; bVal: string; winner: "a" | "b" | "tie" }[] = [ - { - label: "p50", - aVal: formatMs(a.p50), - bVal: formatMs(b.p50), - winner: a.p50 < b.p50 ? "a" : b.p50 < a.p50 ? "b" : "tie", - }, - { - label: "p99", - aVal: formatMs(a.p99), - bVal: formatMs(b.p99), - winner: a.p99 < b.p99 ? "a" : b.p99 < a.p99 ? "b" : "tie", - }, - { - label: "Error Rate", - aVal: `${a.errorRate.toFixed(1)}%`, - bVal: `${b.errorRate.toFixed(1)}%`, - winner: a.errorRate < b.errorRate ? "a" : b.errorRate < a.errorRate ? "b" : "tie", - }, - { - label: "Health", - aVal: String(a.healthScore), - bVal: String(b.healthScore), - winner: a.healthScore > b.healthScore ? "a" : b.healthScore > a.healthScore ? "b" : "tie", - }, - ]; - - return ( -
- {/* Header */} -
-
- {endpoints.map((ep, i) => ( -
-
- - {ep.method} - - {ep.route} -
- ))} -
- -
- - {/* Metric comparison grid */} -
- {metrics.map((m) => ( -
-

{m.label}

-
-
- A - - {m.aVal} - -
-
- B - - {m.bVal} - -
-
-
- ))} -
- - {/* p99 Latency chart */} -
-

p99 Latency — 24h

-
- - - - `${v}ms`} width={45} /> - `${String(v)}ms`} - /> - - - - - -
-
-
- ); -} diff --git a/components/endpoints/endpoint-drawer.tsx b/components/endpoints/endpoint-drawer.tsx deleted file mode 100644 index d303293..0000000 --- a/components/endpoints/endpoint-drawer.tsx +++ /dev/null @@ -1,137 +0,0 @@ -"use client"; - -import { motion, AnimatePresence } from "framer-motion"; -import { X } from "lucide-react"; -import { LatencyHistogram } from "@/components/charts/latency-histogram"; -import { getMethodColor, getHealthColor, getErrorRateColor, formatMs, formatNumber } from "@/lib/utils"; -import type { Endpoint } from "@/lib/types"; - -interface EndpointDrawerProps { - endpoint: Endpoint | null; - onClose: () => void; -} - -export function EndpointDrawer({ endpoint, onClose }: EndpointDrawerProps) { - return ( - - {endpoint && ( - - {/* Header */} -
-
-
- - {endpoint.method} - -
-
-

{endpoint.route}

-
- -
- -
- {/* Health Score */} -
-
- Health Score - - {endpoint.healthScore} - -
-
-
-
-
- - {/* Stats grid */} -
- {[ - { label: "Requests 24h", value: formatNumber(endpoint.requests24h) }, - { - label: "Error Rate", - value: `${endpoint.errorRate.toFixed(1)}%`, - color: getErrorRateColor(endpoint.errorRate), - }, - ].map((stat) => ( -
-

{stat.label}

-

- {stat.value} -

-
- ))} -
- - {/* Latency */} -
-

Latency Distribution

- -
- {[ - { label: "p50", value: formatMs(endpoint.p50), color: "#22C55E" }, - { label: "p95", value: formatMs(endpoint.p95), color: "#F59E0B" }, - { label: "p99", value: formatMs(endpoint.p99), color: "#EF4444" }, - ].map((p) => ( -
-

{p.label}

-

- {p.value} -

-
- ))} -
-
- - {/* Top errors */} -
-

Top Errors

- {endpoint.errorRate > 0 ? ( -
- {[ - { code: 422, msg: "Validation failed: required field missing", count: Math.floor(endpoint.requests24h * 0.008) }, - { code: 500, msg: "Internal server error: database timeout", count: Math.floor(endpoint.requests24h * 0.004) }, - ].map((err, i) => ( -
- {err.code} - {err.msg} - {err.count}x -
- ))} -
- ) : ( -

No errors in selected window

- )} -
-
- - )} - - ); -} diff --git a/components/endpoints/endpoint-table.tsx b/components/endpoints/endpoint-table.tsx index b37551e..b6f5787 100644 --- a/components/endpoints/endpoint-table.tsx +++ b/components/endpoints/endpoint-table.tsx @@ -1,21 +1,18 @@ "use client"; import { useState } from "react"; -import { ArrowUpDown, ChevronRight } from "lucide-react"; +import { ArrowUpDown } from "lucide-react"; import { getMethodColor, getErrorRateColor, getHealthColor, formatMs, formatNumber } from "@/lib/utils"; import { cn } from "@/lib/utils"; import type { Endpoint } from "@/lib/types"; interface EndpointTableProps { endpoints: Endpoint[]; - onSelect: (endpoint: Endpoint) => void; - selected?: string; - compareSelected?: string[]; } type SortKey = keyof Pick; -export function EndpointTable({ endpoints, onSelect, selected, compareSelected = [] }: EndpointTableProps) { +export function EndpointTable({ endpoints }: EndpointTableProps) { const [sortKey, setSortKey] = useState("requests24h"); const [sortDir, setSortDir] = useState<"asc" | "desc">("desc"); @@ -41,7 +38,7 @@ export function EndpointTable({ endpoints, onSelect, selected, compareSelected = return (
{/* Header */} -
+
Endpoint @@ -49,20 +46,14 @@ export function EndpointTable({ endpoints, onSelect, selected, compareSelected = Health -
{/* Rows */}
{sorted.map((ep) => ( - +
))} {sorted.length === 0 && (
From 370d7a7c8ae0695bf6065d456e18e9ad822d8444 Mon Sep 17 00:00:00 2001 From: ryzrr Date: Tue, 8 Sep 2026 00:37:47 +0530 Subject: [PATCH 6/9] trim: renumber migrations into a gapless 001-004 chain The alert-rules, alert-channels and status-page migrations are gone, so multitenancy/api_keys/rls move down to 002/003/004 and their revision pointers follow. Single head, no gaps: 001 -> 002 -> 003 -> 004. --- .../versions/{003_multitenancy.py => 002_multitenancy.py} | 6 +++--- .../versions/{004_api_keys.py => 003_api_keys.py} | 8 ++++---- apps/api/migrations/versions/{005_rls.py => 004_rls.py} | 8 ++++---- 3 files changed, 11 insertions(+), 11 deletions(-) rename apps/api/migrations/versions/{003_multitenancy.py => 002_multitenancy.py} (98%) rename apps/api/migrations/versions/{004_api_keys.py => 003_api_keys.py} (96%) rename apps/api/migrations/versions/{005_rls.py => 004_rls.py} (97%) diff --git a/apps/api/migrations/versions/003_multitenancy.py b/apps/api/migrations/versions/002_multitenancy.py similarity index 98% rename from apps/api/migrations/versions/003_multitenancy.py rename to apps/api/migrations/versions/002_multitenancy.py index bc3c1ea..e1e5ed1 100644 --- a/apps/api/migrations/versions/003_multitenancy.py +++ b/apps/api/migrations/versions/002_multitenancy.py @@ -1,7 +1,7 @@ """Multi-tenancy: organizations, memberships, projects.org_id -Revision ID: 003 -Revises: 002 +Revision ID: 002 +Revises: 001 Create Date: 2026-07-18 Introduces the tenancy identity layer: @@ -17,7 +17,7 @@ from alembic import op -revision = "003" +revision = "002" down_revision = "001" branch_labels = None depends_on = None diff --git a/apps/api/migrations/versions/004_api_keys.py b/apps/api/migrations/versions/003_api_keys.py similarity index 96% rename from apps/api/migrations/versions/004_api_keys.py rename to apps/api/migrations/versions/003_api_keys.py index 6defb75..c211cf8 100644 --- a/apps/api/migrations/versions/004_api_keys.py +++ b/apps/api/migrations/versions/003_api_keys.py @@ -1,7 +1,7 @@ """API keys table — multiple keys per project, rotation + revocation -Revision ID: 004 -Revises: 003 +Revision ID: 003 +Revises: 002 Create Date: 2026-07-18 Moves API-key auth from the single `projects.api_key` column to a dedicated @@ -11,8 +11,8 @@ from alembic import op -revision = "004" -down_revision = "003" +revision = "003" +down_revision = "002" branch_labels = None depends_on = None diff --git a/apps/api/migrations/versions/005_rls.py b/apps/api/migrations/versions/004_rls.py similarity index 97% rename from apps/api/migrations/versions/005_rls.py rename to apps/api/migrations/versions/004_rls.py index f9749aa..bad79a8 100644 --- a/apps/api/migrations/versions/005_rls.py +++ b/apps/api/migrations/versions/004_rls.py @@ -1,7 +1,7 @@ """Row-Level Security backstop for tenant isolation -Revision ID: 005 -Revises: 004 +Revision ID: 004 +Revises: 003 Create Date: 2026-07-18 Defense-in-depth: even if an app query forgets its `WHERE project_id = …`, @@ -20,8 +20,8 @@ from alembic import op -revision = "005" -down_revision = "004" +revision = "004" +down_revision = "003" branch_labels = None depends_on = None From 54d44e90b9b83778505b5d1615936dd619339348 Mon Sep 17 00:00:00 2001 From: ryzrr Date: Tue, 8 Sep 2026 00:38:00 +0530 Subject: [PATCH 7/9] trim: drop unused API dependencies MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit python-jose and passlib were never imported — API-key auth uses hashlib + hmac.compare_digest, and browser sessions are NextAuth's job — so they only inflated the image. --- apps/api/requirements.txt | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/apps/api/requirements.txt b/apps/api/requirements.txt index eea978a..360640a 100644 --- a/apps/api/requirements.txt +++ b/apps/api/requirements.txt @@ -18,9 +18,5 @@ python-socketio[asyncio_client]==5.11.4 # AI (Phase 5) cerebras-cloud-sdk==1.19.0 -# Auth -python-jose[cryptography]==3.3.0 -passlib[bcrypt]==1.7.4 - -# HTTP client (smoke test + SDK calls) +# HTTP client (smoke test) httpx==0.27.2 From ab0006b72ef5cafd669d9c42d6fd8680be981d6d Mon Sep 17 00:00:00 2001 From: ryzrr Date: Tue, 8 Sep 2026 00:38:07 +0530 Subject: [PATCH 8/9] docs: rewrite README for the trimmed feature set Features table, screenshots, SDK section, architecture diagram and project tree now describe what actually ships: live dashboard, endpoint explorer, z-score anomaly detection with AI summaries, realtime over Socket.io/SSE, and multi-tenancy with RLS. Tracing, alert rules and public status pages move to the roadmap. Also drops a stale reference to the status-page BFF route from the verifyProjectAccess doc comment. --- README.md | 82 +++++++++++++++---------------------------- lib/project-access.ts | 2 +- 2 files changed, 30 insertions(+), 54 deletions(-) diff --git a/README.md b/README.md index 83ed9c6..81d7c39 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ **Know the moment your API breaks.** -Real-time traces, live error tracking, and AI-written incident summaries — wired up with one line of middleware. +Live request metrics, error tracking, and AI-written incident summaries — wired up with one line of middleware. Open source. Self-hostable. No agents, no sidecars. @@ -36,13 +36,13 @@ Open source. Self-hostable. No agents, no sidecars. ## What is Liveboard? -Liveboard is a self-hostable API observability platform — the open-source pieces you'd otherwise assemble from Datadog, Sentry, and a status page tool. Drop one line of middleware into an Express, Fastify, FastAPI, Django, or Flask app and get live request metrics, distributed traces, error tracking, AI-generated incident summaries, alert rules, and a public status page — all streaming in real time over WebSockets/SSE. +Liveboard is a self-hostable API observability platform — the open-source pieces you'd otherwise assemble from Datadog and Sentry. Drop one line of middleware into an Express or FastAPI app and get live request metrics, per-endpoint latency percentiles, error tracking, and AI-generated incident summaries — all streaming in real time over WebSockets/SSE. - **60-second onboarding** — `npm install liveboard-sdk` or `pip install liveboard-sdk`, one line of middleware, data on the dashboard in under 90 seconds. - **User-centric observability** — every event is tagged with `user_id`, so you can see exactly *which* users are hitting errors, not just aggregate rates. - **AI incident summaries** — a rolling z-score detector flags anomalies in error rate and p99 latency, then an LLM (Cerebras `llama-3.3-70b`) writes a plain-English summary of what happened. -- **OpenTelemetry-flavored tracing** — trace IDs propagate across all five SDK adapters into a flame graph and service map, no collector required. -- **Auto-generated public status page** — 90-day uptime bars, incident timelines, and email subscriptions, derived from the same live data. +- **Built for throughput** — events land in a Redis Stream and a consumer-group worker bulk-writes them into TimescaleDB with the `COPY` protocol, sized for 120K events/min on one box. +- **Multi-tenant from day one** — organizations, per-project API keys, and Postgres Row-Level Security as a database-level isolation backstop. @@ -50,16 +50,13 @@ Liveboard is a self-hostable API observability platform — the open-source piec | | | |---|---| -| 📊 **Live dashboard** | Request volume, stacked 2xx/4xx/5xx error rate, animated stat cards with sparklines — all pushed over WebSockets as traffic happens. | -| 🔎 **Endpoint explorer** | Sortable table with p50/p95/p99, health scores, latency histograms, top errors and top affected users per route. Side-by-side endpoint comparison mode. | -| 🔥 **Distributed traces** | Flame graphs, span detail panels, critical-path highlighting, and a pure-SVG service dependency map. | -| 🚨 **Alert rules** | Metric + operator + threshold + window rule builder with a live plain-English preview, per-channel delivery, and alert history. | -| 🤖 **AI anomaly detection** | Rolling 24h z-score on error rate & p99 latency; anomalies trigger a rate-limited, deduplicated LLM incident summary. | -| 🟢 **Public status page** | Auto-generated per project — overall status badge, 90-day uptime bars, incident timelines, email subscribe/unsubscribe. | +| 📊 **Live dashboard** | Request volume, stacked 2xx/4xx/5xx response codes, animated stat cards with sparklines, and a tailing request log — all pushed over WebSockets/SSE as traffic happens. | +| 🔎 **Endpoint explorer** | Sortable per-route table with p50/p95/p99 latency, error rate and a derived health score, filterable by route and HTTP method. | +| 🤖 **AI anomaly detection** | Rolling 24h z-score on error rate & p99 latency; anomalies trigger a rate-limited, deduplicated LLM incident summary (Cerebras `llama-3.3-70b`). | | ⚡ **Real-time everything** | Socket.io for live metrics + incidents, SSE with `Last-Event-ID` resume for the live log tail — zero missed events on reconnect. | | 🏢 **Multi-tenant by default** | Organizations, memberships, and per-project API keys with Postgres Row-Level Security as a DB-level tenant-isolation backstop. | | 🔐 **Google OAuth + sessions** | NextAuth/Auth.js sign-in; the browser never sees a raw ingest key — reads go through a session-scoped BFF proxy. | -| 📦 **Two official SDKs** | JavaScript/TypeScript (Express, Fastify) and Python (FastAPI, Django, Flask), both with automatic route normalisation and trace propagation. | +| 📦 **Two official SDKs** | JavaScript/TypeScript (Express) and Python (FastAPI/ASGI), both with automatic route normalisation and background batching that never blocks your app. | @@ -78,28 +75,6 @@ Liveboard is a self-hostable API observability platform — the open-source piec **Endpoint Explorer** Endpoint explorer - - - - - -**Distributed Traces** -Distributed trace flame graph - - - - -**Alert Rules** -Alert rules - - - - - - -**Public Status Page** -Public status page - @@ -154,7 +129,7 @@ import liveboard from "liveboard-sdk"; app.use(liveboard.middleware({ apiKey })); ``` -Works with your existing **Express** or **Fastify** app. +Works with your existing **Express** app. @@ -169,13 +144,13 @@ from liveboard.asgi import LiveBoardMiddleware app.add_middleware(LiveBoardMiddleware, api_key=key) ``` -Works with **FastAPI**, **Django**, or **Flask**. +Works with **FastAPI** and any other ASGI framework (Starlette). -Every adapter normalises dynamic route segments (`/users/507f191e...` → `/users/:id`), propagates an `x-trace-id` header across services, and tags events with the authenticated `user_id` when it can find one — powering the endpoint explorer, trace viewer, and per-user error breakdowns out of the box. +Both adapters normalise dynamic route segments (`/users/507f191e...` → `/users/:id`), echo an `x-trace-id` correlation header, and tag events with the authenticated `user_id` when they can find one — powering the endpoint explorer and per-user error breakdowns out of the box. @@ -184,16 +159,16 @@ Every adapter normalises dynamic route segments (`/users/507f191e...` → `/user ```mermaid flowchart LR subgraph SDKs["Client SDKs"] - JS["liveboard-sdk JS
Express · Fastify"] - PY["liveboard-sdk Python
FastAPI · Django · Flask"] + JS["liveboard-sdk JS
Express"] + PY["liveboard-sdk Python
FastAPI / ASGI"] end JS -->|"x-api-key, batched events"| INGEST PY -->|"x-api-key, batched events"| INGEST - INGEST["FastAPI Ingest
POST /v1/ingest, /v1/spans"] --> STREAM[["Redis Streams
events:project_id"]] + INGEST["FastAPI Ingest
POST /v1/ingest"] --> STREAM[["Redis Streams
events:project_id"]] STREAM --> WORKER["Aggregation Worker
asyncpg COPY, at-least-once"] - WORKER --> DB[("TimescaleDB
events · events_1min · spans")] + WORKER --> DB[("TimescaleDB
events · events_1min · incidents")] METRICS["Metrics Worker
1s tick"] --> DB METRICS -->|pub/sub| RT["Socket.io + SSE"] @@ -270,22 +245,21 @@ cd packages/sdk-python && ruff check liveboard/ ``` liveboard/ -├── app/ # Next.js App Router — dashboard, auth, status page, BFF routes -│ ├── (dashboard)/ # overview · endpoints · traces · alerts · settings -│ ├── api/ # lb/[...path] BFF proxy, auth, projects, realtime-token -│ └── status/[slug]/ # public status page + subscribe/unsubscribe -├── components/ # React components (charts, dashboard, traces, status, landing…) -├── hooks/ # useMetrics, useLiveLog, useTraces, useWebSocket, … +├── app/ # Next.js App Router — dashboard, auth, BFF routes +│ ├── (dashboard)/ # overview · endpoints · settings +│ └── api/ # lb/[...path] BFF proxy, auth, projects, realtime-token +├── components/ # React components (charts, dashboard, endpoints, landing…) +├── hooks/ # useMetrics, useLiveLog, useWebSocket, useApiQuery, … ├── lib/ # api-client, socket, realtime helpers ├── apps/api/ # FastAPI backend -│ ├── api/routes/ # ingest · query · alerts · spans · projects · internal · public_status -│ ├── worker/ # aggregator · metrics · anomaly (AI) · alerts +│ ├── api/routes/ # ingest · query · projects · internal +│ ├── worker/ # aggregator · metrics · anomaly (AI) │ ├── realtime/ # socket_server · sse · pubsub · tokens │ ├── streams/ # Redis Streams producer -│ └── migrations/ # Alembic migrations +│ └── migrations/ # Alembic migrations (001 → 004) ├── packages/ -│ ├── sdk-js/ # liveboard-sdk (npm) — Express, Fastify -│ └── sdk-python/ # liveboard-sdk (PyPI) — FastAPI, Django, Flask +│ ├── sdk-js/ # liveboard-sdk (npm) — Express +│ └── sdk-python/ # liveboard-sdk (PyPI) — FastAPI / ASGI ├── infra/ │ └── docker-compose.yml # postgres · redis · api · worker · frontend └── .env.example # every config variable, documented @@ -299,13 +273,15 @@ Liveboard is shipped through self-hosted, multi-tenant SaaS foundations (organiz - [ ] CLI (`liveboard-cli`) for local onboarding and key management - [ ] Hosted Mintlify docs site — quick start, SDK reference, self-hosting guide, architecture -- [ ] Custom domains for public status pages +- [ ] Alerting: threshold rules with Slack/webhook delivery +- [ ] Public status pages with 90-day uptime history +- [ ] Distributed tracing: flame graphs and a service dependency map - [ ] Per-tenant retention policies and plan-gated quotas - [ ] Billing (Stripe) — free/pro tiers - [ ] Production deploy guide (Railway for API/worker, Vercel for the dashboard) - [ ] npm / PyPI publish of `liveboard-sdk` for outside consumers -Check [open issues](https://github.com/ryzrr/liveboard/issues) or open one — good-first-issue-sized SDK adapters (Ruby, Go) and alert channels (webhook, PagerDuty) are great starting points. +Check [open issues](https://github.com/ryzrr/liveboard/issues) or open one — good-first-issue-sized SDK adapters (Fastify, Django, Flask, Go) are great starting points. diff --git a/lib/project-access.ts b/lib/project-access.ts index b903ae8..15bfce4 100644 --- a/lib/project-access.ts +++ b/lib/project-access.ts @@ -13,7 +13,7 @@ function internalToken(): string { * session (as `session.projectIds` used to) meant any project created after * login was invisible to every dashboard read and realtime connection until * the user signed out and back in. This mirrors the same "ask the backend, - * not a stale cache" pattern already used by rotate/delete/status-page BFF + * not a stale cache" pattern already used by the rotate/delete BFF * routes (`_require_member` on the backend side). */ export async function verifyProjectAccess(email: string, projectId: string): Promise { From d06c40208bbbbddcc2a6815c5170922a6f51ca92 Mon Sep 17 00:00:00 2001 From: ryzrr Date: Tue, 8 Sep 2026 01:03:20 +0530 Subject: [PATCH 9/9] chore(infra): stop baking an ingest key into the frontend image MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit NEXT_PUBLIC_LIVEBOARD_API_KEY and NEXT_PUBLIC_WS_URL are read by no code — the socket client derives its URL from NEXT_PUBLIC_API_URL, and dashboard reads go through the BFF with a session, never an API key. Compose was still passing both as build args, so Dockerfile.frontend baked them in as NEXT_PUBLIC_* env, i.e. a raw project ingest key shipped in the client bundle. Dropping the plumbing removes that exposure. --- Dockerfile.frontend | 4 ---- infra/docker-compose.yml | 4 ---- 2 files changed, 8 deletions(-) diff --git a/Dockerfile.frontend b/Dockerfile.frontend index 01ecbbe..76bd885 100644 --- a/Dockerfile.frontend +++ b/Dockerfile.frontend @@ -13,11 +13,7 @@ WORKDIR /app COPY --from=deps /app/node_modules ./node_modules COPY . . ARG NEXT_PUBLIC_API_URL -ARG NEXT_PUBLIC_WS_URL -ARG NEXT_PUBLIC_LIVEBOARD_API_KEY ENV NEXT_PUBLIC_API_URL=$NEXT_PUBLIC_API_URL -ENV NEXT_PUBLIC_WS_URL=$NEXT_PUBLIC_WS_URL -ENV NEXT_PUBLIC_LIVEBOARD_API_KEY=$NEXT_PUBLIC_LIVEBOARD_API_KEY RUN npm run build # Production runtime diff --git a/infra/docker-compose.yml b/infra/docker-compose.yml index f630941..043790c 100644 --- a/infra/docker-compose.yml +++ b/infra/docker-compose.yml @@ -81,14 +81,10 @@ services: dockerfile: Dockerfile.frontend args: NEXT_PUBLIC_API_URL: ${NEXT_PUBLIC_API_URL} - NEXT_PUBLIC_WS_URL: ${NEXT_PUBLIC_WS_URL} - NEXT_PUBLIC_LIVEBOARD_API_KEY: ${NEXT_PUBLIC_LIVEBOARD_API_KEY} ports: - "3000:3000" environment: NEXT_PUBLIC_API_URL: ${NEXT_PUBLIC_API_URL} - NEXT_PUBLIC_WS_URL: ${NEXT_PUBLIC_WS_URL} - NEXT_PUBLIC_LIVEBOARD_API_KEY: ${NEXT_PUBLIC_LIVEBOARD_API_KEY} NEXTAUTH_URL: ${NEXTAUTH_URL} AUTH_SECRET: ${AUTH_SECRET} NEXTAUTH_SECRET: ${NEXTAUTH_SECRET}