From a8f4e81053ecfd85bae2a8e19f1dca86def4dcda Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Emre=20Kabakc=C4=B1?= Date: Wed, 20 May 2026 18:13:40 +0100 Subject: [PATCH 1/8] feat(connector-worker): connector native-dep declaration + lean bundles MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Foundation for user-declared connector dependencies: - SDK: add `runtime.nix.packages` to ConnectorRuntimeInfo so a connector declares its native (nixpkgs) tools; rides the existing `runtime` JSONB, no migration. npm deps are bundled at compile time and don't go here. - Compile: externalize `@lobu/connector-sdk` (+ `lobu` alias) instead of bundling it. The SDK pulls a large infra graph (Sentry/OTel/grpc/git) transitively, inflating every connector to multiple MB; the runtime provides the SDK (it's a connector-worker dep), so the bundle leaves it as a runtime-resolved import — the standard externalize-the-framework pattern. Bundles drop from ~MB to the connector's own code + deps. Also emit an inline source map (sourcesContent:false) for stack traces. - Executor: when a connector declares nix packages, wrap the child in `nix-shell -p --run "exec node ..."` so the tools are on PATH; `exec` preserves the IPC channel and kill semantics. Plain fork() stays the path when no packages are declared. Fail with a clear actionable error when nix-shell is absent but packages are required. --- packages/connector-sdk/src/connector-types.ts | 9 +++ .../connector-worker/src/compile/index.ts | 63 +++++++++-------- .../src/executor/interface.ts | 13 +++- .../src/executor/subprocess.ts | 68 ++++++++++++++++--- 4 files changed, 116 insertions(+), 37 deletions(-) diff --git a/packages/connector-sdk/src/connector-types.ts b/packages/connector-sdk/src/connector-types.ts index 69441559d..b222d1aec 100644 --- a/packages/connector-sdk/src/connector-types.ts +++ b/packages/connector-sdk/src/connector-types.ts @@ -65,6 +65,15 @@ export interface ConnectorRuntimeInfo { * Optional — omit when the platform adapter needs no fine-grained scope list. */ scopes?: string[]; + /** + * Native system dependencies this connector needs on PATH at execution time, + * as nixpkgs attribute references (e.g. `["ffmpeg", "imagemagick"]`). npm + * dependencies are bundled into the connector at compile time and do NOT go + * here — only native tools the runtime must provision. Backends that can run + * native deps (embedded, container, machine) satisfy these via nix; backends + * that can't (e.g. edge workers) reject a connector that declares them. + */ + nix?: { packages: string[] }; } // ============================================================================= diff --git a/packages/connector-worker/src/compile/index.ts b/packages/connector-worker/src/compile/index.ts index f0a9b4b0e..b54662b73 100644 --- a/packages/connector-worker/src/compile/index.ts +++ b/packages/connector-worker/src/compile/index.ts @@ -22,7 +22,6 @@ import { existsSync } from 'node:fs'; import { mkdtemp, readFile, rm, stat } from 'node:fs/promises'; -import { createRequire } from 'node:module'; import { tmpdir } from 'node:os'; import { join, resolve } from 'node:path'; import { build, type Plugin } from 'esbuild'; @@ -75,15 +74,28 @@ export function findBundledConnectorFile( } /** - * Resolve the `@lobu/connector-sdk` module entry from this module's - * perspective. Used as the esbuild `alias` target so connector code that - * imports `from 'lobu'` or `from '@lobu/connector-sdk'` resolves to the - * same physical file the runtime will import — avoiding the - * `instanceof ConnectorRuntime` cross-realm trap. + * esbuild plugin that marks the connector SDK as **external** (runtime-provided) + * rather than bundling it in. The SDK pulls a large infra graph transitively + * (Sentry, OpenTelemetry, grpc, isomorphic-git, …); bundling it inflated every + * connector to multiple MB. The runtime that executes the connector already has + * `@lobu/connector-sdk` installed (it's a dependency of `@lobu/connector-worker`), + * so the bundle leaves it as a bare import and Node resolves it from the runtime's + * node_modules at load time — the standard "externalize the framework, bundle the + * user code" pattern (cf. AWS Lambda not bundling `@aws-sdk`). + * + * The `lobu` alias specifier is normalized to `@lobu/connector-sdk` so the emitted + * import resolves to a real package the runtime provides. */ -function resolveSdkEntry(): string { - const require_ = createRequire(import.meta.url); - return require_.resolve('@lobu/connector-sdk'); +function createSdkExternalPlugin(): Plugin { + return { + name: 'sdk-external', + setup(b) { + b.onResolve({ filter: /^(lobu|@lobu\/connector-sdk)(\/.*)?$/ }, (args) => ({ + path: args.path.replace(/^lobu(?=$|\/)/, '@lobu/connector-sdk'), + external: true, + })); + }, + }; } interface NpmSpecifierPluginOptions { @@ -128,21 +140,14 @@ export function createNpmSpecifierPlugin(options?: NpmSpecifierPluginOptions): P interface CompileOptions { /** - * Max entries kept in the mtime-keyed LRU. Each entry is the full - * compiled bundle (~13 MB today, smaller as transitive deps are - * externalised). Cap default 8 keeps memory bounded; pass a smaller - * value in memory-constrained environments. + * Max entries kept in the mtime-keyed LRU. Each entry is the compiled + * bundle — now just the connector's own code + its bundled npm deps, + * since the SDK and its infra graph are externalised. Cap default 8 + * keeps memory bounded; pass a smaller value in memory-constrained + * environments. * @default 8 */ cacheMax?: number; - /** - * Override the `@lobu/connector-sdk` entry esbuild aliases against. - * Defaults to the SDK resolved from this module's `require.resolve`. - * Overriding is only useful when the caller knows of a more - * appropriate physical file (e.g. a server bundle that wants to point - * back at a sibling dist file). - */ - sdkEntry?: string; /** * Hook fired when `npm:` specifiers fail to resolve and the import is * externalised. Forwarded to `createNpmSpecifierPlugin`. @@ -158,19 +163,21 @@ const DEFAULT_CACHE_MAX = 8; * * The returned bundle: * - is ESM (`format: 'esm'`, `target: 'node20'`); - * - aliases `lobu` and `@lobu/connector-sdk` to the SDK entry so - * connectors targeting either specifier resolve to the same module; + * - externalises the connector SDK (`lobu` / `@lobu/connector-sdk`) — the + * runtime provides it, keeping bundles to the connector's own code + deps; * - has a banner injecting a CJS-compatible `require` shim; * - externalises `EXTERNAL_RUNTIME_DEPS` (native deps + Playwright); + * - emits an inline source map (`sourcesContent: false`) so connector stack + * traces map to source lines without embedding the source in the artifact; * - is mtime-cached: a repeat call with the same `filePath` whose * mtime hasn't changed returns the cached bundle without hitting * esbuild. */ export function createConnectorCompiler(options?: CompileOptions) { const cacheMax = options?.cacheMax ?? DEFAULT_CACHE_MAX; - const sdkEntry = options?.sdkEntry ?? resolveSdkEntry(); const compiledFileCache = new Map(); - const plugin = createNpmSpecifierPlugin({ onUnresolved: options?.onUnresolvedNpm }); + const npmPlugin = createNpmSpecifierPlugin({ onUnresolved: options?.onUnresolvedNpm }); + const sdkExternalPlugin = createSdkExternalPlugin(); function touchCacheEntry(filePath: string, entry: { mtimeMs: number; code: string }): void { compiledFileCache.delete(filePath); @@ -206,15 +213,15 @@ export function createConnectorCompiler(options?: CompileOptions) { format: 'esm', platform: 'node', target: 'node20', - alias: { lobu: sdkEntry, '@lobu/connector-sdk': sdkEntry }, banner: { js: `import { createRequire as __createRequire } from 'module'; const require = __createRequire(import.meta.url);`, }, - plugins: [plugin], + plugins: [sdkExternalPlugin, npmPlugin], external: [...EXTERNAL_RUNTIME_DEPS], write: true, minify: false, - sourcemap: false, + sourcemap: 'inline', + sourcesContent: false, }); const code = await readFile(outPath, 'utf-8'); diff --git a/packages/connector-worker/src/executor/interface.ts b/packages/connector-worker/src/executor/interface.ts index 771155bb5..bec4f1303 100644 --- a/packages/connector-worker/src/executor/interface.ts +++ b/packages/connector-worker/src/executor/interface.ts @@ -69,6 +69,16 @@ export interface ExecutionHooks { ) => Promise>; } +/** Per-run execution options independent of the job payload. */ +export interface ExecutionOptions { + /** + * Native system packages (nixpkgs attribute refs) the connector declared in + * its `runtime.nix.packages`. When non-empty, the embedded executor wraps the + * child process in `nix-shell -p ` so the tools are on PATH. + */ + nixPackages?: string[]; +} + /** * Pluggable executor interface. The only implementation today is * `SubprocessExecutor`; the seam stays around so tests can stub it. @@ -77,6 +87,7 @@ export interface SyncExecutor { execute( compiledCode: string, job: ExecutorJob, - hooks?: ExecutionHooks + hooks?: ExecutionHooks, + options?: ExecutionOptions ): Promise; } diff --git a/packages/connector-worker/src/executor/subprocess.ts b/packages/connector-worker/src/executor/subprocess.ts index cb6ec225a..2eb411f90 100644 --- a/packages/connector-worker/src/executor/subprocess.ts +++ b/packages/connector-worker/src/executor/subprocess.ts @@ -6,15 +6,39 @@ * This is not a hardened security sandbox. */ -import { fork } from 'node:child_process'; +import { type ChildProcess, fork, spawn, spawnSync } from 'node:child_process'; import { existsSync } from 'node:fs'; import { createRequire } from 'node:module'; import { dirname, join } from 'node:path'; import { fileURLToPath } from 'node:url'; import type { EventEnvelope } from '@lobu/connector-sdk'; -import type { ExecutionHooks, ExecutorJob, ExecutorResult, SyncExecutor } from './interface.js'; +import type { + ExecutionHooks, + ExecutionOptions, + ExecutorJob, + ExecutorResult, + SyncExecutor, +} from './interface.js'; import { StreamRedactor, redactOutput } from './redact.js'; +/** Memoized nix-shell availability check. */ +let nixShellAvailable: boolean | null = null; +function hasNixShell(): boolean { + if (nixShellAvailable === null) { + try { + nixShellAvailable = spawnSync('nix-shell', ['--version'], { stdio: 'ignore' }).status === 0; + } catch { + nixShellAvailable = false; + } + } + return nixShellAvailable; +} + +/** Single-quote a string for safe embedding in a `nix-shell --run "..."` bash command. */ +function shellQuote(value: string): string { + return `'${value.replace(/'/g, `'\\''`)}'`; +} + /** * exit_reason values surfaced to the runs table: * - ok: successful 'result' IPC. @@ -130,8 +154,17 @@ export class SubprocessExecutor implements SyncExecutor { async execute( compiledCode: string, job: ExecutorJob, - hooks?: ExecutionHooks + hooks?: ExecutionHooks, + options?: ExecutionOptions ): Promise { + const nixPackages = options?.nixPackages ?? []; + if (nixPackages.length > 0 && !hasNixShell()) { + throw new Error( + `This connector requires native packages [${nixPackages.join(', ')}] but \`nix-shell\` ` + + `is not installed on this host. Install nix (https://nixos.org/download) or run the ` + + `connector on a backend that provisions native dependencies.` + ); + } return new Promise((resolve, reject) => { let childRunnerPath = join(__dirname, 'child-runner.js'); const childRunnerTsPath = join(__dirname, 'child-runner.ts'); @@ -165,11 +198,30 @@ export class SubprocessExecutor implements SyncExecutor { // Node subprocess execution is process isolation, not a security sandbox. // Node --experimental-permission flags intentionally NOT enabled — the // connector runtime isn't compatible. Revisit if that changes. - const child = fork(childRunnerPath, [], { - stdio: ['pipe', 'pipe', 'pipe', 'ipc'], - execArgv, - env: { ...pickSystemEnv(), ...jobEnv(job) } as NodeJS.ProcessEnv, - }); + const env = { ...pickSystemEnv(), ...jobEnv(job) } as NodeJS.ProcessEnv; + let child: ChildProcess; + if (nixPackages.length > 0) { + // Wrap in nix-shell so the connector's declared native tools are on + // PATH. `exec node` replaces the shell with node so the IPC channel + // (fd 3 / NODE_CHANNEL_FD created by the 'ipc' stdio slot) and kill() + // reach the real process — without `exec`, kill() would hit the shell + // and orphan node. execArgv is rebuilt as inline flags. nix-shell's + // impure shell keeps the ambient PATH, so `node` still resolves. + const nodeCmd = ['exec', 'node', ...execArgv, shellQuote(childRunnerPath)].join(' '); + const nixArgs: string[] = []; + for (const pkg of nixPackages) nixArgs.push('-p', pkg); + nixArgs.push('--run', nodeCmd); + child = spawn('nix-shell', nixArgs, { + stdio: ['pipe', 'pipe', 'pipe', 'ipc'], + env, + }); + } else { + child = fork(childRunnerPath, [], { + stdio: ['pipe', 'pipe', 'pipe', 'ipc'], + execArgv, + env, + }); + } let resolved = false; let terminalMessageReceived = false; From ac575276c0dbbff9d7eded8e3dbdc5e7ac276d6d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Emre=20Kabakc=C4=B1?= Date: Wed, 20 May 2026 18:19:15 +0100 Subject: [PATCH 2/8] feat(server): provision connector native deps via nix at run time MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Threads a connector's declared native packages from storage to the executor so they're on PATH during a run: - worker-api poll: join connector_definitions and surface its `runtime`, emitting `nix_packages` in the poll response (the `runtime.nix.packages` the SDK extraction already persists in the existing runtime JSONB — no storage change needed). - daemon: carry `nix_packages` on PollResponse and pass it through the three executeCompiledConnector call sites (sync/action/auth). - executeCompiledConnector: forward `nixPackages` to executor.execute, which wraps the child in nix-shell when non-empty. Connectors that declare no native deps are unaffected (plain fork path). --- packages/connector-worker/src/daemon/client.ts | 6 ++++++ packages/connector-worker/src/daemon/executor.ts | 3 +++ packages/connector-worker/src/executor/runtime.ts | 13 +++++++++++-- packages/server/src/worker-api.ts | 11 +++++++++++ 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/packages/connector-worker/src/daemon/client.ts b/packages/connector-worker/src/daemon/client.ts index 21081387b..3a01810f7 100644 --- a/packages/connector-worker/src/daemon/client.ts +++ b/packages/connector-worker/src/daemon/client.ts @@ -96,6 +96,12 @@ export interface PollResponse { * sources). */ compiled_code?: string; + /** + * Native (nixpkgs) packages the connector declared in `runtime.nix.packages`. + * The executor wraps the child in `nix-shell -p ` so the tools are + * on PATH. Absent/empty = plain subprocess (the common case). + */ + nix_packages?: string[]; /** Connection session state (browser cookies, etc.) */ session_state?: Record; /** Connector version */ diff --git a/packages/connector-worker/src/daemon/executor.ts b/packages/connector-worker/src/daemon/executor.ts index 0ce3cc420..ca476250d 100644 --- a/packages/connector-worker/src/daemon/executor.ts +++ b/packages/connector-worker/src/daemon/executor.ts @@ -204,6 +204,7 @@ async function executeSyncRun( const result = await executeCompiledConnector({ compiledCode: compiled_code, + nixPackages: job.nix_packages, executor: subprocessExecutor, job: { mode: 'sync', @@ -367,6 +368,7 @@ async function executeActionRun( try { const result = await executeCompiledConnector({ compiledCode: compiled_code, + nixPackages: job.nix_packages, executor: subprocessExecutor, job: { mode: 'action', @@ -460,6 +462,7 @@ async function executeAuthRun( try { const result = await executeCompiledConnector({ compiledCode: compiled_code, + nixPackages: job.nix_packages, executor: subprocessExecutor, job: { mode: 'authenticate', diff --git a/packages/connector-worker/src/executor/runtime.ts b/packages/connector-worker/src/executor/runtime.ts index 27f2c9d3b..4a2941ccb 100644 --- a/packages/connector-worker/src/executor/runtime.ts +++ b/packages/connector-worker/src/executor/runtime.ts @@ -1,4 +1,9 @@ -import type { ExecutionHooks, ExecutorJob, ExecutorResult, SyncExecutor } from './interface.js'; +import type { + ExecutionHooks, + ExecutorJob, + ExecutorResult, + SyncExecutor, +} from './interface.js'; import { SubprocessExecutor } from './subprocess.js'; /** @@ -11,7 +16,11 @@ export async function executeCompiledConnector(params: { job: ExecutorJob; executor?: SyncExecutor; hooks?: ExecutionHooks; + /** Native (nixpkgs) packages the connector declared in `runtime.nix.packages`. */ + nixPackages?: string[]; }): Promise { const executor = params.executor ?? new SubprocessExecutor(); - return executor.execute(params.compiledCode, params.job, params.hooks); + return executor.execute(params.compiledCode, params.job, params.hooks, { + nixPackages: params.nixPackages, + }); } diff --git a/packages/server/src/worker-api.ts b/packages/server/src/worker-api.ts index 0aa86deb3..b170eafc3 100644 --- a/packages/server/src/worker-api.ts +++ b/packages/server/src/worker-api.ts @@ -489,6 +489,7 @@ export async function pollWorkerJob(c: Context<{ Bindings: Env }>) { conn.config AS connection_config, conn.device_worker_id AS connection_device_worker_id, cv.compiled_code, + cd.runtime AS connector_runtime, ap.auth_data AS auth_profile_auth_data, w.name AS watcher_name, w.slug AS watcher_slug, @@ -500,6 +501,8 @@ export async function pollWorkerJob(c: Context<{ Bindings: Env }>) { LEFT JOIN connections conn ON conn.id = r.connection_id LEFT JOIN connector_versions cv ON cv.connector_key = r.connector_key AND cv.version = r.connector_version + LEFT JOIN connector_definitions cd ON cd.key = r.connector_key + AND cd.organization_id = r.organization_id LEFT JOIN auth_profiles ap ON ap.id = r.auth_profile_id LEFT JOIN watchers w ON w.id = r.watcher_id WHERE r.id = ${runId} @@ -555,6 +558,7 @@ export async function pollWorkerJob(c: Context<{ Bindings: Env }>) { connection_config: Record | null; connection_device_worker_id: string | null; compiled_code: string | null; + connector_runtime: { nix?: { packages?: string[] } | null } | null; run_created_at: string | Date | null; // Watcher run fields (populated via LEFT JOINs) watcher_id: number | null; @@ -691,11 +695,18 @@ export async function pollWorkerJob(c: Context<{ Bindings: Env }>) { sessionState: null, }; + // Native (nixpkgs) packages the connector declared in `runtime.nix.packages`. + // The worker provisions these on PATH via nix-shell before executing. + const nixPackages = (row.connector_runtime?.nix?.packages ?? []).filter( + (p): p is string => typeof p === 'string' + ); + return c.json({ run_id: row.run_id, run_type: row.run_type, connector_key: row.connector_key, connector_version: row.connector_version ?? undefined, + nix_packages: nixPackages.length > 0 ? nixPackages : undefined, feed_key: row.feed_key ?? undefined, feed_id: row.feed_id ?? undefined, connection_id: row.connection_id ?? undefined, From d685d723e913f9577f77ede72cf1f6f80d1273ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Emre=20Kabakc=C4=B1?= Date: Wed, 20 May 2026 18:34:58 +0100 Subject: [PATCH 3/8] feat(cli): compile connectors on apply with project deps; scaffold packaging MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Connector npm deps now work in the apply→cloud path: - apply: project-supplied connectors are compiled on the CLI (the only place the project's node_modules exists, so esbuild can bundle the connector's declared deps) and uploaded as a pre-compiled bundle (`compiled: true`); the server stores the artifact instead of recompiling source it can't resolve deps for. - ensure-deps-installed: runs `bun install --ignore-scripts` in the connector's project (resolved via the nearest `lobu.toml`, so a connector inside a monorepo never installs the wrong root); no-ops when the project declares no package.json. - client.installConnector gains a `compiled` flag. - lobu init scaffolds package.json (with @lobu/connector-sdk devDependency for editor types) + tsconfig.json + connectors/. - AGENTS.md documents the convention: npm = bundled at compile, native = nix at run time; SDK is runtime-provided/externalized. --- AGENTS.md | 5 ++ .../cli/src/commands/_lib/apply/apply-cmd.ts | 18 +++- .../cli/src/commands/_lib/apply/client.ts | 4 +- .../commands/_lib/ensure-deps-installed.ts | 85 +++++++++++++++++++ packages/cli/src/commands/init.ts | 40 +++++++++ 5 files changed, 147 insertions(+), 5 deletions(-) create mode 100644 packages/cli/src/commands/_lib/ensure-deps-installed.ts diff --git a/AGENTS.md b/AGENTS.md index 826467355..c18350d89 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -57,6 +57,11 @@ All chat platforms (Telegram, Slack, Discord, WhatsApp, Teams) run through Chat - **Integration auth lives in Lobu** — OAuth, token refresh, and API proxying for third-party services (GitHub, Google, etc.) are handled by Lobu MCP servers. Workers never see OAuth tokens. - **`events` is append-only.** Never `DELETE FROM events`. To hide a row, write a tombstone via `client.knowledge.delete()` or `save_knowledge({ supersedes_event_id, ... })`; the `current_event_records` view masks superseded rows, `include_superseded` recovers history. +#### Connectors +- A connector is a `*.connector.ts` extending `ConnectorRuntime`. **npm deps** go in the project's `package.json` (next to `lobu.toml`) and are **bundled** into the connector by esbuild at compile time. **Native deps** (ffmpeg, imagemagick, …) are declared as nixpkgs refs in `runtime.nix.packages` on the connector `definition`; the runtime provisions them on PATH via `nix-shell` at execution. npm = bundled (compile-time); native = nix (run-time). +- **Compile happens on the CLI**, not the server: `lobu apply` runs `bun install` in the project, compiles each connector with the project's `node_modules`, and uploads the bundle (`compiled: true`). esbuild resolves a connector's imports relative to the connector file's dir, so the project's deps are used regardless of where the `lobu` binary is installed. `@lobu/connector-sdk` is **externalized** (runtime-provided, à la Lambda's `aws-sdk`) — the bundle stays the connector's own code + deps, not multiple MB of SDK infra. +- `lobu init` scaffolds `package.json` (with `@lobu/connector-sdk` devDependency for editor types) + `tsconfig.json` + `connectors/`. + #### Guardrails - Primitive lives in `packages/core/src/guardrails/`: `Guardrail`, `GuardrailRegistry`, `runGuardrails()`. Stages: `input` (user message → worker), `output` (worker text → user), `pre-tool` (tool call authorization). - Each guardrail's `run(ctx)` returns `{ tripped, reason?, metadata? }`. The runner races all enabled guardrails at a stage; the first trip short-circuits (later results are discarded) and a thrown guardrail is logged and treated as a pass. diff --git a/packages/cli/src/commands/_lib/apply/apply-cmd.ts b/packages/cli/src/commands/_lib/apply/apply-cmd.ts index 4b4e6ce9f..ac915bb6e 100644 --- a/packages/cli/src/commands/_lib/apply/apply-cmd.ts +++ b/packages/cli/src/commands/_lib/apply/apply-cmd.ts @@ -7,6 +7,8 @@ import { loadProjectLink } from "../../../internal/project-link.js"; import { CONFIG_FILENAME } from "../../../config/loader.js"; import { ApiError, ValidationError } from "../../memory/_lib/errors.js"; import { printError, printText } from "../../memory/_lib/output.js"; +import { compileConnectorFromFile } from "../connector-loader.js"; +import { ensureProjectDepsInstalled } from "../ensure-deps-installed.js"; import { type ApplyClient, type RemoteAgent, @@ -376,10 +378,18 @@ async function installConnectorDefinitions( if (row.verb === "noop" || row.verb === "drift") continue; const def = row.desired; if (!def) continue; - const result = - def.sourceCode !== undefined - ? await client.installConnector({ sourceCode: def.sourceCode }) - : await client.installConnector({ sourceUrl: def.sourceUrl }); + let result: Awaited>; + if (def.sourceCode !== undefined) { + // Compile project connectors on the CLI: only here is the project's + // node_modules available, so esbuild can bundle the connector's declared + // npm deps. The server can't (it only receives the artifact). Native deps + // ride `runtime.nix.packages` and are provisioned at run time. + ensureProjectDepsInstalled(def.sourceFile, printText); + const compiledCode = await compileConnectorFromFile(def.sourceFile); + result = await client.installConnector({ sourceCode: compiledCode, compiled: true }); + } else { + result = await client.installConnector({ sourceUrl: def.sourceUrl }); + } if (result.connectorKey) { locallySuppliedKeys.add(result.connectorKey); installedKeys.add(result.connectorKey); diff --git a/packages/cli/src/commands/_lib/apply/client.ts b/packages/cli/src/commands/_lib/apply/client.ts index 76e801f5c..ff0592125 100644 --- a/packages/cli/src/commands/_lib/apply/client.ts +++ b/packages/cli/src/commands/_lib/apply/client.ts @@ -851,6 +851,8 @@ export class ApplyClient { sourceUrl?: string; /** `file://` URI of a bundled connector source on the server host. */ sourceUri?: string; + /** `sourceCode` is already a compiled bundle (CLI-side compile) — skip server compile. */ + compiled?: boolean; }): Promise { const body = await this.connectionsTool<{ installed?: boolean; @@ -860,7 +862,7 @@ export class ApplyClient { }>({ action: "install_connector", ...(payload.sourceCode !== undefined - ? { source_code: payload.sourceCode, compiled: false } + ? { source_code: payload.sourceCode, compiled: payload.compiled ?? false } : {}), ...(payload.sourceUrl ? { source_url: payload.sourceUrl } : {}), ...(payload.sourceUri ? { source_uri: payload.sourceUri } : {}), diff --git a/packages/cli/src/commands/_lib/ensure-deps-installed.ts b/packages/cli/src/commands/_lib/ensure-deps-installed.ts new file mode 100644 index 000000000..bf78e021a --- /dev/null +++ b/packages/cli/src/commands/_lib/ensure-deps-installed.ts @@ -0,0 +1,85 @@ +/** + * Ensure a connector project's npm dependencies are installed before the CLI + * compiles its connectors. esbuild bundles a connector's imports relative to + * the connector file's directory, so the project's own `node_modules` (next to + * `package.json`) must exist. We run `bun install --ignore-scripts` when stale: + * `--ignore-scripts` keeps install-time supply-chain surface off the user's + * machine — packages that need build scripts (native bindings) belong in + * `runtime.nix.packages`, not bundled npm. + */ + +import { execFileSync } from "node:child_process"; +import { existsSync, statSync } from "node:fs"; +import { dirname, join } from "node:path"; + +// Per-process memo so `lobu apply` installs each project root at most once. +const ensuredRoots = new Set(); + +/** + * Find the connector's project root — the nearest ancestor with `lobu.toml`. + * Anchoring on `lobu.toml` (not any ancestor `package.json`) is what stops a + * connector inside a monorepo from resolving to the monorepo's root + * package.json and triggering a wrong-directory install. + */ +export function findProjectRoot(fromFile: string): string | null { + let dir = dirname(fromFile); + for (let i = 0; i < 40; i++) { + if (existsSync(join(dir, "lobu.toml"))) return dir; + const parent = dirname(dir); + if (parent === dir) break; + dir = parent; + } + return null; +} + +function installIsStale(root: string): boolean { + const nodeModules = join(root, "node_modules"); + if (!existsSync(nodeModules)) return true; + const lock = join(root, "bun.lock"); + if (!existsSync(lock)) return false; // deps present, no lockfile to compare against + try { + return statSync(lock).mtimeMs > statSync(nodeModules).mtimeMs; + } catch { + return false; + } +} + +function hasBun(): boolean { + try { + execFileSync("bun", ["--version"], { stdio: "ignore" }); + return true; + } catch { + return false; + } +} + +/** + * Install the connector project's deps if missing/stale. No-op when the + * connector has no `package.json` (no declared npm deps to bundle). + */ +export function ensureProjectDepsInstalled( + connectorFilePath: string, + log: (message: string) => void +): void { + const root = findProjectRoot(connectorFilePath); + if (!root || ensuredRoots.has(root)) return; + // No package.json at the project root → the connector declares no npm deps + // (the SDK is runtime-provided/externalized), so there's nothing to install. + if (!existsSync(join(root, "package.json"))) { + ensuredRoots.add(root); + return; + } + if (!installIsStale(root)) { + ensuredRoots.add(root); + return; + } + if (!hasBun()) { + throw new Error( + `Connector dependencies in ${root} need installing, but \`bun\` is not on PATH. ` + + `Run \`bun install\` in ${root}, or install bun (https://bun.sh).` + ); + } + log(`Installing connector dependencies in ${root}...`); + execFileSync("bun", ["install", "--ignore-scripts"], { cwd: root, stdio: "inherit" }); + ensuredRoots.add(root); +} diff --git a/packages/cli/src/commands/init.ts b/packages/cli/src/commands/init.ts index 6d8e28a14..bf328c6bf 100644 --- a/packages/cli/src/commands/init.ts +++ b/packages/cli/src/commands/init.ts @@ -705,6 +705,46 @@ export async function initCommand( await mkdir(join(projectDir, "skills"), { recursive: true }); await writeFile(join(projectDir, "skills", ".gitkeep"), ""); + // Connector authoring surface: package.json declares the connector SDK + // (provided by the runtime — externalized at compile, here for editor + // types) plus any npm deps the user adds; tsconfig gives the editor + // resolution; the connectors/ dir holds `*.connector.ts`. `lobu apply` + // runs `bun install` here and bundles each connector's own deps. + await writeFile( + join(projectDir, "package.json"), + `${JSON.stringify( + { + name: projectName, + version: "0.0.0", + private: true, + type: "module", + devDependencies: { "@lobu/connector-sdk": `^${cliVersion}` }, + }, + null, + 2 + )}\n` + ); + await writeFile( + join(projectDir, "tsconfig.json"), + `${JSON.stringify( + { + compilerOptions: { + target: "ES2022", + module: "Preserve", + moduleResolution: "bundler", + strict: true, + skipLibCheck: true, + noEmit: true, + }, + include: ["connectors/**/*.ts"], + }, + null, + 2 + )}\n` + ); + await mkdir(join(projectDir, "connectors"), { recursive: true }); + await writeFile(join(projectDir, "connectors", ".gitkeep"), ""); + await renderTemplate( "AGENTS.md.tmpl", variables, From cafe28afd4f4e18dd77c60e97781004d0686f30d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Emre=20Kabakc=C4=B1?= Date: Wed, 20 May 2026 18:35:46 +0100 Subject: [PATCH 4/8] style(cli): apply biome formatting --- packages/cli/src/commands/_lib/apply/apply-cmd.ts | 5 ++++- packages/cli/src/commands/_lib/apply/client.ts | 5 ++++- packages/cli/src/commands/_lib/ensure-deps-installed.ts | 5 ++++- 3 files changed, 12 insertions(+), 3 deletions(-) diff --git a/packages/cli/src/commands/_lib/apply/apply-cmd.ts b/packages/cli/src/commands/_lib/apply/apply-cmd.ts index ac915bb6e..b5461771a 100644 --- a/packages/cli/src/commands/_lib/apply/apply-cmd.ts +++ b/packages/cli/src/commands/_lib/apply/apply-cmd.ts @@ -386,7 +386,10 @@ async function installConnectorDefinitions( // ride `runtime.nix.packages` and are provisioned at run time. ensureProjectDepsInstalled(def.sourceFile, printText); const compiledCode = await compileConnectorFromFile(def.sourceFile); - result = await client.installConnector({ sourceCode: compiledCode, compiled: true }); + result = await client.installConnector({ + sourceCode: compiledCode, + compiled: true, + }); } else { result = await client.installConnector({ sourceUrl: def.sourceUrl }); } diff --git a/packages/cli/src/commands/_lib/apply/client.ts b/packages/cli/src/commands/_lib/apply/client.ts index ff0592125..13dd8c2ab 100644 --- a/packages/cli/src/commands/_lib/apply/client.ts +++ b/packages/cli/src/commands/_lib/apply/client.ts @@ -862,7 +862,10 @@ export class ApplyClient { }>({ action: "install_connector", ...(payload.sourceCode !== undefined - ? { source_code: payload.sourceCode, compiled: payload.compiled ?? false } + ? { + source_code: payload.sourceCode, + compiled: payload.compiled ?? false, + } : {}), ...(payload.sourceUrl ? { source_url: payload.sourceUrl } : {}), ...(payload.sourceUri ? { source_uri: payload.sourceUri } : {}), diff --git a/packages/cli/src/commands/_lib/ensure-deps-installed.ts b/packages/cli/src/commands/_lib/ensure-deps-installed.ts index bf78e021a..3bb877b59 100644 --- a/packages/cli/src/commands/_lib/ensure-deps-installed.ts +++ b/packages/cli/src/commands/_lib/ensure-deps-installed.ts @@ -80,6 +80,9 @@ export function ensureProjectDepsInstalled( ); } log(`Installing connector dependencies in ${root}...`); - execFileSync("bun", ["install", "--ignore-scripts"], { cwd: root, stdio: "inherit" }); + execFileSync("bun", ["install", "--ignore-scripts"], { + cwd: root, + stdio: "inherit", + }); ensuredRoots.add(root); } From 8acdd5efb657012d913a44db43586877832469ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Emre=20Kabakc=C4=B1?= Date: Wed, 20 May 2026 18:47:43 +0100 Subject: [PATCH 5/8] refactor(cli): lazy-load connector-compile graph in apply Keep esbuild + connector-worker + SDK out of apply-cmd's module-load path (only `lobu apply` with local *.connector.ts needs it). Documented in the AGENTS.md dynamic-import allow-list. Matches connector-run-cmd's pattern. --- AGENTS.md | 1 + packages/cli/src/commands/_lib/apply/apply-cmd.ts | 12 ++++++++++-- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index c18350d89..358b55531 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -109,6 +109,7 @@ Rules for agents: - **No new dynamic imports outside the allow-list below.** Use static `import` by default; new `await import(...)` sites need a measured cost justification (boot time, install footprint, Keychain prompt) added to this list in the same PR. Rationale for each entry lives as a code comment at the call site: - `packages/cli/src/index.ts` — lazy subcommand handlers (keeps `lobu --help` ~60ms). - `packages/cli/src/commands/_lib/connector-run-cmd.ts` — `browser-mirror`, `devtools-active-port`, `executeCompiledConnector`. + - `packages/cli/src/commands/_lib/apply/apply-cmd.ts` — `connector-loader` + `ensure-deps-installed` (the connector-compile graph: esbuild + connector-worker + SDK). Loaded only when an apply has local `*.connector.ts` to compile; keeps that graph out of apply-cmd's module-load path (and out of every CLI test that imports it). - `packages/cli/src/commands/_lib/apply/desired-state.ts` — `yaml` (loaded only on YAML inputs). - `packages/cli/src/commands/memory/_lib/browser-auth-cmd.ts` — `decryptChromeCookiesMacOS`, `playwright/chromium`. - `packages/server/src/server.ts` — `./embedded-runtime` is statically imported, but `./server-lifecycle` is lazy: its transitive imports read env at module-eval, and the embedded branch only finalises DATABASE_URL during `main()`. Loading the lifecycle eagerly would snapshot a stale env. diff --git a/packages/cli/src/commands/_lib/apply/apply-cmd.ts b/packages/cli/src/commands/_lib/apply/apply-cmd.ts index b5461771a..2192b042e 100644 --- a/packages/cli/src/commands/_lib/apply/apply-cmd.ts +++ b/packages/cli/src/commands/_lib/apply/apply-cmd.ts @@ -7,8 +7,6 @@ import { loadProjectLink } from "../../../internal/project-link.js"; import { CONFIG_FILENAME } from "../../../config/loader.js"; import { ApiError, ValidationError } from "../../memory/_lib/errors.js"; import { printError, printText } from "../../memory/_lib/output.js"; -import { compileConnectorFromFile } from "../connector-loader.js"; -import { ensureProjectDepsInstalled } from "../ensure-deps-installed.js"; import { type ApplyClient, type RemoteAgent, @@ -384,6 +382,16 @@ async function installConnectorDefinitions( // node_modules available, so esbuild can bundle the connector's declared // npm deps. The server can't (it only receives the artifact). Native deps // ride `runtime.nix.packages` and are provisioned at run time. + // + // Lazy-imported (cached by the loader) so the heavy connector-compile + // graph (esbuild + connector-worker + SDK) stays out of apply-cmd's + // module-load path — see the dynamic-import allow-list in AGENTS.md. + const { ensureProjectDepsInstalled } = await import( + "../ensure-deps-installed.js" + ); + const { compileConnectorFromFile } = await import( + "../connector-loader.js" + ); ensureProjectDepsInstalled(def.sourceFile, printText); const compiledCode = await compileConnectorFromFile(def.sourceFile); result = await client.installConnector({ From 3168feaccf7d52e8574c0cc2ce0cbc9e39bb8f27 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Emre=20Kabakc=C4=B1?= Date: Wed, 20 May 2026 19:24:57 +0100 Subject: [PATCH 6/8] =?UTF-8?q?fix(connectors):=20address=20review=20?= =?UTF-8?q?=E2=80=94=20source=5Furl=20compile,=20deterministic=20join,=20i?= =?UTF-8?q?nit=20merge?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - apply: compile `def.sourcePath` (the actual `.ts`) for local connectors, not `def.sourceFile` (an error-message label that may point at a `type: connector` YAML). `source_url` connectors (source fetched into `sourceCode`, no local deps) upload raw for gateway compile instead of being compiled locally. - worker-api: filter the connector_definitions join to `status = 'active'` so it matches the partial unique index `idx_connector_defs_org_key` — archived/draft rows share `(key, org)` and made the runtime lookup nondeterministic. - init: merge into an existing `package.json` (preserve the user's fields, add the SDK devDependency) and never overwrite an existing `tsconfig.json`, so `--here` into an existing project is non-destructive. - docs: note `bun install --ignore-scripts` (the actual command). --- AGENTS.md | 2 +- .../cli/src/commands/_lib/apply/apply-cmd.ts | 21 ++++-- packages/cli/src/commands/init.ts | 73 +++++++++++-------- packages/server/src/worker-api.ts | 1 + 4 files changed, 57 insertions(+), 40 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 358b55531..efdb6f5a0 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -59,7 +59,7 @@ All chat platforms (Telegram, Slack, Discord, WhatsApp, Teams) run through Chat #### Connectors - A connector is a `*.connector.ts` extending `ConnectorRuntime`. **npm deps** go in the project's `package.json` (next to `lobu.toml`) and are **bundled** into the connector by esbuild at compile time. **Native deps** (ffmpeg, imagemagick, …) are declared as nixpkgs refs in `runtime.nix.packages` on the connector `definition`; the runtime provisions them on PATH via `nix-shell` at execution. npm = bundled (compile-time); native = nix (run-time). -- **Compile happens on the CLI**, not the server: `lobu apply` runs `bun install` in the project, compiles each connector with the project's `node_modules`, and uploads the bundle (`compiled: true`). esbuild resolves a connector's imports relative to the connector file's dir, so the project's deps are used regardless of where the `lobu` binary is installed. `@lobu/connector-sdk` is **externalized** (runtime-provided, à la Lambda's `aws-sdk`) — the bundle stays the connector's own code + deps, not multiple MB of SDK infra. +- **Compile happens on the CLI**, not the server: `lobu apply` runs `bun install --ignore-scripts` in the project (install scripts off for supply-chain safety — native bits go through `runtime.nix.packages`, not bundled npm), compiles each connector with the project's `node_modules`, and uploads the bundle (`compiled: true`). esbuild resolves a connector's imports relative to the connector file's dir, so the project's deps are used regardless of where the `lobu` binary is installed. `@lobu/connector-sdk` is **externalized** (runtime-provided, à la Lambda's `aws-sdk`) — the bundle stays the connector's own code + deps, not multiple MB of SDK infra. - `lobu init` scaffolds `package.json` (with `@lobu/connector-sdk` devDependency for editor types) + `tsconfig.json` + `connectors/`. #### Guardrails diff --git a/packages/cli/src/commands/_lib/apply/apply-cmd.ts b/packages/cli/src/commands/_lib/apply/apply-cmd.ts index 2192b042e..e965b22a7 100644 --- a/packages/cli/src/commands/_lib/apply/apply-cmd.ts +++ b/packages/cli/src/commands/_lib/apply/apply-cmd.ts @@ -377,11 +377,13 @@ async function installConnectorDefinitions( const def = row.desired; if (!def) continue; let result: Awaited>; - if (def.sourceCode !== undefined) { - // Compile project connectors on the CLI: only here is the project's - // node_modules available, so esbuild can bundle the connector's declared - // npm deps. The server can't (it only receives the artifact). Native deps - // ride `runtime.nix.packages` and are provisioned at run time. + if (def.sourcePath) { + // Local `*.connector.ts`: compile on the CLI, where the project's + // node_modules is available, so esbuild can bundle the connector's + // declared npm deps (the server only receives the artifact). Native deps + // ride `runtime.nix.packages` and are provisioned at run time. Compile + // `sourcePath` (the actual `.ts`), not `sourceFile` (an error-message + // label that may point at a `type: connector` YAML doc). // // Lazy-imported (cached by the loader) so the heavy connector-compile // graph (esbuild + connector-worker + SDK) stays out of apply-cmd's @@ -392,12 +394,17 @@ async function installConnectorDefinitions( const { compileConnectorFromFile } = await import( "../connector-loader.js" ); - ensureProjectDepsInstalled(def.sourceFile, printText); - const compiledCode = await compileConnectorFromFile(def.sourceFile); + ensureProjectDepsInstalled(def.sourcePath, printText); + const compiledCode = await compileConnectorFromFile(def.sourcePath); result = await client.installConnector({ sourceCode: compiledCode, compiled: true, }); + } else if (def.sourceCode !== undefined) { + // `source_url` connector: source was fetched into `sourceCode` and has no + // local project/node_modules to bundle against — upload it raw and let + // the gateway compile it (the pre-existing path). + result = await client.installConnector({ sourceCode: def.sourceCode }); } else { result = await client.installConnector({ sourceUrl: def.sourceUrl }); } diff --git a/packages/cli/src/commands/init.ts b/packages/cli/src/commands/init.ts index bf328c6bf..6064c5169 100644 --- a/packages/cli/src/commands/init.ts +++ b/packages/cli/src/commands/init.ts @@ -709,39 +709,48 @@ export async function initCommand( // (provided by the runtime — externalized at compile, here for editor // types) plus any npm deps the user adds; tsconfig gives the editor // resolution; the connectors/ dir holds `*.connector.ts`. `lobu apply` - // runs `bun install` here and bundles each connector's own deps. - await writeFile( - join(projectDir, "package.json"), - `${JSON.stringify( - { - name: projectName, - version: "0.0.0", - private: true, - type: "module", - devDependencies: { "@lobu/connector-sdk": `^${cliVersion}` }, - }, - null, - 2 - )}\n` - ); - await writeFile( - join(projectDir, "tsconfig.json"), - `${JSON.stringify( - { - compilerOptions: { - target: "ES2022", - module: "Preserve", - moduleResolution: "bundler", - strict: true, - skipLibCheck: true, - noEmit: true, + // runs `bun install --ignore-scripts` here and bundles each connector's + // own deps. + // + // `--here` can target a directory that already has a package.json / + // tsconfig.json — merge into package.json (preserve the user's fields, just + // add the SDK devDependency) and never overwrite an existing tsconfig. + const pkgJsonPath = join(projectDir, "package.json"); + let pkgJson: Record; + try { + pkgJson = JSON.parse(await readFile(pkgJsonPath, "utf-8")) as Record; + } catch { + pkgJson = { name: projectName, version: "0.0.0", private: true, type: "module" }; + } + pkgJson.devDependencies = { + ...((pkgJson.devDependencies as Record | undefined) ?? {}), + "@lobu/connector-sdk": `^${cliVersion}`, + }; + await writeFile(pkgJsonPath, `${JSON.stringify(pkgJson, null, 2)}\n`); + + const tsconfigPath = join(projectDir, "tsconfig.json"); + try { + await readFile(tsconfigPath, "utf-8"); // exists — leave the user's config untouched + } catch { + await writeFile( + tsconfigPath, + `${JSON.stringify( + { + compilerOptions: { + target: "ES2022", + module: "Preserve", + moduleResolution: "bundler", + strict: true, + skipLibCheck: true, + noEmit: true, + }, + include: ["connectors/**/*.ts"], }, - include: ["connectors/**/*.ts"], - }, - null, - 2 - )}\n` - ); + null, + 2 + )}\n` + ); + } await mkdir(join(projectDir, "connectors"), { recursive: true }); await writeFile(join(projectDir, "connectors", ".gitkeep"), ""); diff --git a/packages/server/src/worker-api.ts b/packages/server/src/worker-api.ts index b170eafc3..824ed83bb 100644 --- a/packages/server/src/worker-api.ts +++ b/packages/server/src/worker-api.ts @@ -503,6 +503,7 @@ export async function pollWorkerJob(c: Context<{ Bindings: Env }>) { AND cv.version = r.connector_version LEFT JOIN connector_definitions cd ON cd.key = r.connector_key AND cd.organization_id = r.organization_id + AND cd.status = 'active' LEFT JOIN auth_profiles ap ON ap.id = r.auth_profile_id LEFT JOIN watchers w ON w.id = r.watcher_id WHERE r.id = ${runId} From 203b82fd70c24bc424715c7b1a6605faf1aff775 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Burak=20Emre=20Kabakc=C4=B1?= Date: Wed, 20 May 2026 19:25:13 +0100 Subject: [PATCH 7/8] style: apply biome formatting --- packages/cli/src/commands/init.ts | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/packages/cli/src/commands/init.ts b/packages/cli/src/commands/init.ts index 6064c5169..bed4ae2ce 100644 --- a/packages/cli/src/commands/init.ts +++ b/packages/cli/src/commands/init.ts @@ -718,12 +718,21 @@ export async function initCommand( const pkgJsonPath = join(projectDir, "package.json"); let pkgJson: Record; try { - pkgJson = JSON.parse(await readFile(pkgJsonPath, "utf-8")) as Record; + pkgJson = JSON.parse(await readFile(pkgJsonPath, "utf-8")) as Record< + string, + unknown + >; } catch { - pkgJson = { name: projectName, version: "0.0.0", private: true, type: "module" }; + pkgJson = { + name: projectName, + version: "0.0.0", + private: true, + type: "module", + }; } pkgJson.devDependencies = { - ...((pkgJson.devDependencies as Record | undefined) ?? {}), + ...((pkgJson.devDependencies as Record | undefined) ?? + {}), "@lobu/connector-sdk": `^${cliVersion}`, }; await writeFile(pkgJsonPath, `${JSON.stringify(pkgJson, null, 2)}\n`); From 06e8fed324bed53b0476c59c05a6d007aa76f9ce Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 20 May 2026 18:40:28 +0000 Subject: [PATCH 8/8] chore(pgvector-embedded): rebuild prebuilt artifacts (v0.8.1) --- .../prebuilt/darwin-arm64/vector.dylib | Bin 181760 -> 182016 bytes .../prebuilt/darwin-x64/vector.dylib | Bin .../prebuilt/linux-arm64/vector.so | Bin 1239280 -> 1239280 bytes .../prebuilt/linux-x64/vector.so | Bin 1303600 -> 1303600 bytes 4 files changed, 0 insertions(+), 0 deletions(-) mode change 100755 => 100644 packages/pgvector-embedded/prebuilt/darwin-arm64/vector.dylib mode change 100755 => 100644 packages/pgvector-embedded/prebuilt/darwin-x64/vector.dylib mode change 100755 => 100644 packages/pgvector-embedded/prebuilt/linux-arm64/vector.so mode change 100755 => 100644 packages/pgvector-embedded/prebuilt/linux-x64/vector.so diff --git a/packages/pgvector-embedded/prebuilt/darwin-arm64/vector.dylib b/packages/pgvector-embedded/prebuilt/darwin-arm64/vector.dylib old mode 100755 new mode 100644 index 13d77fa68b2064962323f9ac1f7e961acaef6d94..7c7d67ca8b01cdded295b1fbb3a642e7fdc09476 GIT binary patch delta 56729 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
D6jAVLGP<{(#vvT(F09G@FFmKaCY z+|lCE@mbQi(PHoTj6h?Q#&+>&@iTJ!jTXrzHosHoU@^L6P?!+b5saEi#5`=FnWdJS?Lq7Yhq#@X zN>flavwhq8r4m%mVR!ciO>y7XF`~x=OGE?`v?!-RLNYUr7BeOk1*dk=vj0I`)=h}_ zBjYO?C&UDHL&**#*j?i133-91usou%5<6PtmYTZl0y&x;7*zR9#Bp@uz6f89KrX>r zoI&_SRF)3pKa1U^DN@5I@pWmj#72vZiCY4@Kon$C9v>x6PRx#20osXJPRz!-qNx`q z>yg4VX_oO$WDkGWUYW@B^Q~d5lrW}@5}PMw7~g^aPYw!+rH9Iy$+cvZ_;gZU#2D~R zT8=XaaAkMqdKf>C1mygqqqVK{iQzHhHw_wy>u zEOF{6xlRib9m}R_K0%zmaX_8!Zr@E__*LYcqU}J8sP{&Rk#}ZU0A@Hk1fX5)?zcVP z?Vj&xd`06(V}B0$=v?PQwDFn)D(hh)0<88*HaBfg8O)ChdGu{nYmHJpuV+Sz@9#88 zPmL7*Q;PkMgfPR-kz(qU^2jRdE-n|cnvx+1cOdj0DUMBnm{nwhYvV|{D z4zjmTjo7(tdLFkeL4HrP9_y3(ihp&^A)l%*@={46ur-w<#HV-VNpFr2#u?e!1B12J z5)>)miwJpu-X1BPcu^;v_+taAX|45a2R zWVK^dB4?2{BA?PlB4B0?pDqe!&Nt6RUPCDBTRzpU!X_Y1&I+~a>*3z{S@%iFBgBSTX331T?5wQb_XC(XA+E5!&oO782Z?scIKKg24Uza4(pt|3xL!q^cuWN$f+_RBBn=aR6(f0}m{>7NYAX^i zR?L&?i$v($qKGf^2_?q0+w=V}U)(!4*S4M(U{*=KjMK_9@KCSlBog{b@1+0lq2l1& zNn!2R+m&1$seF{{Zd5K7{Ut`&=k=Fzi^TGICTVq%cxGOf8=Br6=zw zVus6;--Bn5bAuI9?TvLzrja=m1ZdDQY%KgzBu36pH?9F2R*UYIzwrpn!h=J_hWRf@ z=ZA{)`)tzlMWXn=3`s5$tMB_latswy7fh1+6^XYN?3W%HDwZrPk_v~4y$j9h!647e z*ay&xM>NDyuZZ! zvi=NDV1IY@|)L*c>JHe2o<+18G1mEKlYO*2T?slfz z-LKt2=myuOp(1c`mbCQ_k+*mmUoN(<>Mj1Yc(VUDgIV?0gGI(_qoKcAQ{=7VlfFZl zLG)f7>xVtk9b(MtapLnOi9Aibx4QSvvj5dQzG_M9g?_tz;Z5 z&OSKOs6#=+&CWU7B3S)Cbq+ANz8|!+a9JpqzAF@;K9n!yhlWTWQuHn9*}|P09^NcT ze8^7o3Nx49FBEwz3wg1~d@R*8u9MuH!fNviq2jayS>0J)i*Mm0dhw4Ztx{T{xca0` z=vP^!ngTR$n)t)2IPMVR*FWYTJdjlf4Mg+I(mMsBc=bZ5f5FcEs~7UHLj}yRAr}rM z!a3-ms9M`sEONFlpH;6y5M`^UOV8$M zymifI20b!6BizPYb&kqgWsb_*wjA;3rnjZaJdL$nQ~=gK9(+4%d(jcMv36Z!?WMtB zZK1S#u$cFhNqTdzc=V|(37LDJG8_L$ou@8J462bXga#{v#g9*!rN;(|&?=L(d63wD z)h0$)1&6i`(&j%hes2#F_f};{O@qXYYew;ERex#IVDVj5y5E|?P^KDxlgN-Wq=kdU z418t{7Ej7krBQ>$_wo{B2I`~;ZjbbOHbLge~e2QkCn`Uz9@tk9o; zPNazE*9M9W)mae^WRV^BPU8;`6vwLPg;gP2vx3pC$%t>RHb}<@iWyI5OZN>D&pe$h z^&BYnKW&l>19yJ$^gKy=Zs5+MXCIZM=X1reEiZ)jhJJaOzA!*6-#SC89U#8gnk^m3 z6%o%BO5wR;(sLUk<_z%6|1cgnYb$v?SN#0kq^Npi(|D#fFGoBQZC)=JVgJ-;-j zFNpU=2`%Rh_>zOL15jX6guSpJp~jzl`;&11yAC3ZG?aB#^NhJ-%L`^HI#=v{VO>C( zmf12u6m83vz8kP}^|ovtx(TGpXOq_-<$8R8I9RhcbT+a`N|bfifSnt*mvFN`)byIV zc#2ae-m{T*_XXsYVF?h_f9KT~C2rh{^mARAyrMI^U~hpR3;cKci-?z=ksizuu9q^T zr}~R8Ub2NQ2jCejTnONy{vz%qW4j;be?6(p8PB%hoBiZ%I(EUz z*KZ*+`D~8J+Ob+%k|W;QaaHP@EnctPFZpGQg|6k&zxs*qU7Mwbeq!}2c~Wh**#Am~ z^nAAX5veD#cV@i$43Eg@=h@EbqxIsrZ1L%9W+^Fq=jGS@x#XWMZoY1oPV^JzH(b)o z{dOLCqnJBJ0LcQzsQ0L!XCVwj9!BjhbYID+zM2Xm-N-DlvhVqJnVJ`;?xd>aPVM+s z&F`({t8u$eyv7F}2b9X23DS}b@%Ec9OGo>P8E=`TLw&{Sw{j&@Ke6{MTlUpHm_r^z zgRqzh1z$}YnOmUV2XgK1GC1btG?$(Zy)~E8+FkS!5j*F{zK2sR9G_JXmj@8X@tGR` zP&~6UebR0s3>Tp<8i<3HOiLVYn4rOvs1lDKd=_4Z4td`~A0hxpCZYi8Min>G^%}nF zUM%R4^Y(HdVceC%b41=Qn`L+$lbaKndpI<&`Afgr;gR^x!S1o(GW=w>Sh=f5XxmTi z$^h(n=IabC_6YIzu5*05*s}W{JW(upyO#sX{2CA1_$m+HxQ&Ojtiyrkyepk^(y_xf zoa;CKfQ8IPl>eX$bj|8C__cDL|5{l<-fOcuF~lXr`D^pJPTsUeyF--E16#^3wU@q) zIdOPbd*!706?>Ye+3OE8tfQjs?sHkN1IO*PZ8`S(G{A&-6K)iC6_39Y7a@6?PP%ax zVMHJC_B(lgKLS(K?Xi>`Zlmog9X2_lU9}vdR4sXwEBs2ka#kI?TG@Z73}PiZFCy4f zx>}m(o&rHC*Ig0w_Ly;>?(sc|{D!FAlft)%6MF_`{{nz#v6^l=j=eI(>GYADX0*q> z-jn|x^53V+K;c^7M)Vbh^~s?}kWF^P3Y7I(Vp;vY(uY~%>-yY??U#vrZ4pFUF|THc z^u5^u6M#V3>%`o>DG8gAY6I#mK*S3@5KF{sdpFtwK*m=ux&opK0w6DzR^OjxiK*|} z9Kk^PWdiw`+SsFZmmn{mIU}+W$F{XWZ?RVzD=Jh^yfKs5h;@wx45@5cq}Hs(klim6 z;9=k5+@rR`?Cu_bC02e^aU)%a@zs`Au>q>i9zceO-xV(``!<=~NDwqB`8$LGVG_d< z(obcIBl|v*u4jtP?@e;tfzoDSug}-%=VOeQ5?}8jkHr0n^t7o7{1hNfb-4lOr7{3{ zkC97;a_W0fK6wuP?1y+K1mzOMw9f91`VYR?IFA85ZJZaQ9n{tHDLu#T=WajbFOL7& zDmLv;3SNUuI&mWbh^i$P@zwtL(0h^ToxPGWh5!4T`M2Va@8|m!p@1f-*7s{LRON;g zN8~l?n`kKGBPG313OjI;6!_Ukc&c06L)gffr%+&W@;GgF*BkUV`Kib(oR>Jf|4)eUK4jOm;u6A`C9mY8o@ z?HZpWmo3PrJvH(}b|bz<=Xi_AQ~wL3X?vI05O*K!5pYf8-gQP9Z|0GrtU)h5nJL~r zm?v2?#pQ!$X>TuKJY+WgQ3nqI-MwB{Q2TgiXT7v4U@NIZYj06}D6iKX&_(CDn{bFj zE0#49m&YNm;!%5Tz;?Sk4F@<^*Rfh`Zr6<*KTy1TsAu|2ls~hCsTuA0_u}Le^4jqCA*^l_gF#^n;lkeSvoJqFr6U zJnfUvOiVg4frtd`1O^Pr;!$G3U+0+TquQo_cfP+tVmBVQ71Ua-aa&WFcJ980i`Sdd z#ot=vdlHFV1d7@@zKJZlPc!#3L)%(9d`lY)IRa6-zo69lQ-%F%6ydx>L*&C*A`#E*wfj;$!67R;b7 zAz|Vy4(eEE{U8d*LNTr($fs_N?aacrp-tPt(sJZ|ihy$=_!rE8AyuVMC{P`m=4jds z(z}{LS3RhMKYk6c>QKf>o8EI!N8ODRy4kS$v92EgOinhP_mof70Ni*@XOMIG!RS{8NV5doxMS@6rreMq1|2K z$9B=xmaj9!&7-*yy^&272Sd*E&B_oX|7H$NLUsdqbwbD+dx~X$E0RpT#Qwka99DPb z>n`%c&_L~k&wbko-&vef&+iOZ z9-tnsR;+i0i}DdM5)AN)zo+H?1pH+%1!c2fuptMlrNF%wz@+I9OWN;#;W5zc9`xiwnnk@wM1rHH)sEqaxu{9;Ms#+LcT~G8iTtjed$=C6>)OXooE0V zDL<_d6VV8}-|sgfMQel^jc81kHuMxT8co?DKp@vU3LI{eqFTyeXf`43Mys~tTQQFYRW-D~=C1T$sp^3IoE(d?vHQvx6JEGsCYn;l5ztCpKwo50UYSG0FmZEYO#p!F51P`DC{AmmXsOCnl-3hxp=? zd!;NW|EJkfQV+5G({#s7P;5WMPI&jLUq+=c|E+8at1qWfU1ub}r>gLC@>Uh!IN z)L?kD_lg%hNn8noYR|ur<9o%cPS101yW-WTm&1klY(d6Eh|>3p*S$#7gm=bs#p^{q zlm&K&Lu?bei;U0nq`}?A!q1OL$I?aa7nL)rtfi*gl=s~ z>Fn;Fs6lloQhpt)=~!{WJKVMYYgiqwt=MQGis#O#vhQT`S^62xcrs5@Ie(U#&yvHPUiYk#Jyw`PySMTeaS39n#k-+ z6O;aFc2s%5NRl7^(5?`hD%(h(R?FykJkn)D`c9#yq9;2MLk#)7tPDngoAXwyZCU;Y^t{y5SWOdDR8*D7Ma&JSIM8Xi)6 z%IKP#Chq+@!|_#DjDR7XPqcK8T5!Iral!Tbqj6U(26x6{VU0|%N^!7G@%W`gXZhS% z=KcjI32ivpB73tG`dbad?}P%VBQhrLHU+6m#Yjh)6II6Pob^iso%NS=hV)W5QLRj0+Z9=xOaEh#XLCjBat5YpH-U&IaZ5mhhgjTE2~e9 zaRhDMgz(BbL)*x?L0dOs&g`Dkee0{b=(bH#u$c3W)vMXtn(!W7VDQsjOhBjh}>nE_?-uFun$qq=D(?qlgDw^>oqmsGfp5aV4Z5hpi#78*xgOKZKM{^-tuAcT#Y zSjOu0kQTeN`V@8dMKpkyH#aHAPK&8swJS>}fNxA#(&j8KIF;2`w1VrO=I^u^NV>)5^x`w>FOjFYuyiVxi&9 zc>brC=its;vOUeziG_cGeUzEHfcdaCrC;La*BPVZDUfFNS!U-jwvXMtifVFAf>23EG)Z+m8OM5Tk%7oGjx*$++Tu5(+*<+ggFAj zgq_^wqG+7{606j_<6!e*a|L`<%3(rTfGM80T_fsyNna zoZ&`CpVjHpujeo~l%To-62p%`!z-v`aG~=keC0xnGn`%|z#BQC7Z&#~fD~+!0>n7}}OM&XJIWKUi zPq~i0$Mt3A2FLQsee`oyi>1u`=Ns*%78EutAE4%8VvY_5b5!|A{0xLDrOI*tL#9@2 zgM_c;+ubCkGBAhfUmZ;+fU}LHLpLbcv-*$ct=xRrpPgt<@vGgj zZcZfFn8+%@N40<&>d&$wc*29KL_?0EhM`NZ5M#5&tnX}&@9)Rp#d*Tp>q^^Za$^gos?tEn>-+neo6^@XxOcCc z*tTcL#67<}fJp!yNHUuT(=`b)tDo>d?cQ}IZPy{o^*77Z{2|Dvp++|!$@^`G&rDU5 zW>80wak0R-*l}s`y{Wp$jnz`X#^-Qa$1zq42YWgvV6gq6NMbj#TCnRnW7TgQ3?uDwprkuZoPT zg?goaoVt-!YGtp%nvwNV2WGZU1&^WvwGTkpxuWkrh`EG_h2U3(ROznD+&#oVLuIbG z)|}uVd8)>J0&OWd>#ynp(n;@jd5k)#R~z=Oj-tXoFgKH6rs&4u735uqZj*t3zliO5 z4qXhDyTHIS4fOdC5zW7}o#_vYL3Ljy6Fme!LI-WC6Z=dlhGtlMvT>Im7*X2-WYs=b z?%Y$0*&%gR>ed5+`i<)&#j*1?2ko^50i+p@M!-<#p7a%S_rUyzr>{ucgKp9$G4vmi z+lYe{BlJZNo-qzjTm-K!2sv$h;MTMN)5cK`tlstBV*1LcgHBm*Cx~Lc&0UwQD5bp@_^XI<2gT?Zb?Dp#TCr z2Z51%YBBhN!bD(8V_#DX5u`nW_Y2r!;`scRm`r#;dMZ?oDzu>zvWD;)TAIL+bGeB4 zp{r?m>b_qye?kM{2|S89`R;ffGeMyTI{Vb;47BxTLVK2 zxEYohi`fZ$FIBR!m7sO`A0uk1FG=1c-&Z`{w;f$qv6^pPi>^Biw}))6y<6l~@=Iu1 z-SO+RT1xr=yX0uAhY~kGP*l4YBV|2#AR9;2(vkpMa@7}MAE@)MK}o$j;+?zacBN53 zb2vG7CfBlVz5}4oKB{n=6xp%{qM%uZj0yDt8HynMW|u^Ee%f7dKOQTneH~i*21Z9K zEXsw+I2}sSdY@W864pHpA(6+mFzrc##iJkzMCVz!L2 zm}`czefT--1(NpPRYeGOo!517eUHuXAZWjHg-HL&RDKmQnT|nz6!R4sHM0Gwe)a(Y zv566hBiQ1R*o7I%pWBijz!v+(7AzkQ?_J^>wvhZRnAR;Y7-ZuduyHl$z!8wA75QFY zwMK0JDY0Y+CVtZNi@5aoNT7W=4QDbVI=ARfOQN2JS{Y7Ie!+H0ca-tP*QhV z8ueB#lLdVo16w?Mp||u>H*w@bmg8>VIMd1L&>Yn5|87^D8Mrs2SQdJI)wIW?bL+LR=&UP?D@00OC81^M$atUfvn4TeUqND_IM zjne8QG3j!V^l#u?&Xzt;5}#f+ORgkw`SJ|oOrSQSUb=WW7^Az~jJwTdG4D#ARF@=N zSLR7ex(Z{PEp$8>@m~1q(p40-Et5X$D)zUPgg$S>W;LcKVtrhaFuRXs#X@6`CIG?b zwF}Zy_4=j}vo&gUVlTfQsI=&LwyQ8-&6S*8#nh|G(#o!4EmCMV#MFBC8f_sAuXC<;h9C$9cOng9+>NAU$pcAjGyszH@OgZx?`iQVA^#bx z*m7f%VL7t>phA(H)e~4H(sX6-0yw;xVJikDi_cZ77lAn%c}~w&t8rE_@8%Fcyj4^y z-n^N=xxL4ra?JTO5qlrG7)3803}%ZThy4z~69j>n7P_;*je!Uw@eA;ooVVE4jJmoG z{)A|4zeD|ncZjHO&k3_br}2uEx+hwO_|sK9({CkPoc8pGe5{hh`JMeayjEJ*->MD2 zA*c5h9!ITITe@DqG00E9aXxBts5One`X?+8ltB_-uT`aVlDMa?uwUzX$D-r^;Ji+0 z^W%vrb+_IZ(#5t#GrMX6f?(^Lx~q4)b~F57*lbnuI`NXU(a5LWG#X|hh{tNftj>Gy zG7WAx-MiF_@t2~MW1V=mG}5B@`}2>a7>jbupU;@$fK{dm|0cdy$>YPGWrJS3I+LjO zDBb+P0Vo^-^=3zRyZcMPQnk;kxY4eM@TE;WI{u*^UxYM%r?IQ6vZFJv4t!b#i*pT1 zREqRGFLW)=^b|<438bPEmCbryen$GCGjQE0#bW7CRFAu=qpJ{uFBxKNhBf;Jo@`STx|qeb1T_3{ z3wd*c-rTZ9sR`u0xuPOF62Pqbq?3n$&Ij2N0gnhjz&8K}6KQ=So^CpT-3dKUHtQ={ z1e~AwezErDcEB-fs@b2eVd1%_a?f*5W$=piSZ*``XFYZ*YLE5bn2NEJ+KIgvgX3~A zsmu@JnSlpzXN{zF)TF!|#IvNqCgqDDo-TcmsQ3r-6$wt0I;oOnnN7SnRtZA^&g(FB z3`!70rM%|ZM(Cxv*a@)>u*`{&_41w)|!>&C^t5G%6-cgLw`bfdVB-QzByv) zUjd6vYZQ!e$jso{g?we4nHz9HC%Ci9mOVjzU+OO?*^c+6G7^-LU3hk6HrSqsQ0QfU zTms&$N>J*$@G!@l04DZHhHIc_uOUq)(3`GBntmw#1O`^B{f{NXANb1>urc3;bU%Gt z4m}3)KGJ7lQ{I;h^AFSe6m*9TY;MDkI?9o*>CF1=SiS00H2RKgH%)Ui12iu)J0|GI zu{6BMQ$G<~=h2v>uj-=GKf{T2?5KWt^G;)GJrLN69BdS8zrs0-_K#?9SFqN^3Mabd z0NnbCxB&A$mIu2&+GdKvAR*j`fQMbI_ZYnCdto{`whmv!)}h5>Gn1REw?tu4gUA4E zlc|eG5JJb`_vo?NiO>WSM7B8wZ(kt1fiMK=OavPObs$X?3i59PR_%f^#T3qMwq#VS zPPtGD(xxFuKZwm_ij$OIPEclq^JM8c^&1z0N3y&{n-i4R!+D;xHbME3zR_kSBLc6B z>CH+}1W%L}C8&>YeUhN8jo|4)y->SavonESD9UWW92bcPY#ivb5Nv_0&r+9WnSS9D zmT!lf<-^T?U>Qw;mF@6irgo zLu!$(N{8hT)&5 z?Qtr9H1fDY=kkh`dP|d;ws(T{xCqIE=g)^)#G?Tn&x{}TX;6u`K{ccT<{}zYEDWwq zJjCXQPQcR3)ti-)T0D(T!IM$-Xi#6$(@}t_>CO7#c;L3j(jJRfrbcsHMls4ScCpvf zK>T~p+Xvz-q@nko0T(r&_f%Zb+~hdW1A8Pvuo>v^R2XV>+ewVC5*Ttr;-$dF*pn+w zlue7*bZ4csSx;r9SUpsKSKuZ*sq#UbooM$W@4~!<$>PElf5k)_`ORHuBVXMTFTIEk z-3gj%U04MdqU%wYStU5YTL31=GI*J|TX{Z)zn>P(lFfKkuB9dv3K>Pf_ISbBAMDp@$AlKlUX*fl-9W`{;)i&&k`T}1`glu7 zubX{z`k!bRS-ZpZWDyJzHYDqf(C5=fa+LY;yeIJg7|&C}+ogc{8=!@UzsT9M0pW^r zBA$0g>5X{a%US_zkoYiL(f~Etf%A%X*ux_jYo7tqsX~uQ;L(7-CxLg3QfWaJc5X8h zJwWWcqCB5~u@bG+C-Cn11aSoZ*R4{ltIwnRFTnGlZfZjJJP6Lcbrk@%9j5OUh`w1D zt#mc>5yJ|NxRerw1vvDw2H_)wJqTA3;2l&SLm+3COjteQN0I+1!nX*YAXsPvzAk~@ zWik&#WvZ)>wcj0xSHP47kWS+u$QrDet^8mg?7@|e!JHSwLykHIvkMh4GT&p5E*>gy z-+xwa-hdqr@5`H#pWnis0U=7FjgRT#;K3~xaIWWpN7DiVm2DP2IB27ng9eR*QxLJ2 zgGR)CIpF_4a9|dl661nmyj(P@T!fbSaB-JO$?M9G1!2zCWYv_QIA(BDh!0ExV3Gjy ztQV$LYfTeuiMKWXMBKME<>5+kH*S_j1t<%<@r_|v6_DMd4J8T31F=d%GM}k@kj#5W z(ODa<8mK%F<@Agy%2TL3g+Cm072T?KBQvYrSm;x2eurv#h_X7BAM5k|f9Xch`JcKm zLD`YU?a|bicJw9s5!+;JV;bfT^s6#0o%b_4yzGRTZ@<9-EBSGZ@_ITy;n&D4X3-@x z)<&jt6XrG&Q&giptr|1X`kz;w^3FypW8T@{otJPaB}R$p$(KZ)#(OygOcP895MftE z`}0xySG7KDRO-w;K7@Hl(vHOqMef5>6u%7qCF-@SG78xZaBtVV^$q}nxf0cz$4KMU z^3Yj6rK%Rf|(_u@m9aea8K zC)pf4QFb@-m?g6n$tuECRA z5Wj)r(&;LEG4nRE25lkdeJg40+gRJY)2@s^)UME@j4z*8MrK11PejoJvx&MIGhQ=$ zAxWvr=AF|UZ@n*@Pw&g7o)`{_x7L5_Vt@0#EIh0Z@5@T|5G6Z@XU(X<66Y#<&-aB{ zvQW*~5~NuM?=7gykqdzFzAVds=VjU9fvg`bM;?XS<1J@_%11f8C}4Yp_OR@B^_Y7Kks!1DxbN zQw5hJZ#`k#LeUiEu0cF9eht8Af195D+y<4REqg*)f_&{^Td-coTFt6&Z8xY7+xAA~ zYBp1j4a5t}y>s+Zx#;U6jYC(P#f(vny4_!)85dQ=6a5-12IxJB&mA+efWEnSm z`j~cfXtQ)}q_QEOk4(7&S$S7;4+4gi()X8rYI7`!v{I1fMJgsc`eJ;fGS$vYB5kO1 zEb7lgP~mzf(yTEw*Hagn%pAlkAnpLXcdAbQi8-b4c zxOcjeS->Aq+6s7SP>8o}c8&gz;Mr>yTM+l9&;KvJ^nQ3SJ-hf`u{b1B zX&T1;CMMwx^VA>e%R{x6}VWy`heG)#>f-8buz$qmv48G}aZN0FS5BBkE;% zOr6%M1sKb86NDa7SDI6xVF$W+G}x(i%!|-CuZC?y+*iZOv6k?PtD^>!c+}p*kLDtXr)TNYRAtP$^`k|wJY8%m^w*Oc9oUObuiVvniV^zvW^Ik<3 zZ@X$VtKglv$s*`b6Z3gaSslT3zlC#$DW8t!f0Y^%m2G2qtf>L2MY2&JOvddOOnca) zF}U6gd*|dBp236YjUEuIVmPgX*$BDYgFxn>T;bz+WIv9zj{3GQcCDjS{3us3z;@88 ziv7;3$56>;WzASV4KEEVUytRvI%uA7bh9aA#__JV-W%S7_F{TbA3shF^{~;Tv7z^2 zqtkz9<7bfgU)e}emX7CrJMdyvVoLb0Zy!(h;pJ~39$s2iUM9VYGOvEsB2E_A_f_ay zZy)=}=b8V)7!G^YA-kiKQaqj~EA|P{HA^SunF*M6;=0fq$hU-*PzqsrA4C2b0`dxL zmX|?hL7zn_`%1ZfaG{5@GIU%%;_Cw&V8;59da0r)xicHd32@{GKmk-2g35qf04<`eUo^Sk^b^RD;B#S1heW3K^|d; zDc?=v84;hMoy492+f(#Xb4uMi$&>j6KOU|upT^Hg77Nx7*3eZD!TLg4qGBIRd&~G4 zQ0fOC!TXkRPfRY}w~WuiJ}wS@InPm+&g4U- zaa!?vKE->LGc)nBB3Y_wcT(t?~h^%)Uatg;`E}?e=|G zZ7oGm@$T*_f8oVrT{XP^ig_Nl-8~I36$oe?9i_LjeOCGKZ(zI1YfR3PeI4o;4ZKos z9sRq@dpqL!b(d$OTxqzU8}9q?m3Cz)QnXf3Yr5E7c6G#9)I%n!)ROjf^dl4P4=Q9J z&yJvn9lB+Z|R8N*j?@qIHhR`k8#8!mWJTlw#U5~!@J3=yzyHy=_+rx;N24B zcjO=dbm9;?a`52q&?t|^1(E=!i2Hc#-IuZS)pcNE_U|AS;5p&Ro{GJl_;29;grJJ+ z*>rhgM?46afwn5(!DSHe7l4M^xH-%p>FD2p(c~3aU6NeTkwX8j@_~3~Nk2utkH_^q z2=wC!z7p&8dnj?vlCCO>qYmKjbwEk*qTFYb!@Y4IA)hfiOG1(FtFSMC#$E)qt%tkG z!5#4|$#OwDUibFkdDO$9{=to>fcOf+ZM~C}B45LBQwe%22az@1@iR)~`&RA%?pAN* z70L2{eh2RiDnH}F!`c-;fTKsdl+X=4(6JD>%MfnK?Xwj5%Z@beOqI`M;1|&y>YfR_ zIo`T4Qvco&4?4X7<-YuuAWc?+Ict{e*0Xr6kuhoV{*K6}Q39US2R5b2YrQz$ z-T-qBoDX&N2TGsBJ9R4PsI#dIb|q+2I;2|WCV|LV9zK?zOKzy zjZ9OH#zH7ZjR)74X(#ejrst+lzK!djyac>5_Hf;Vd|w$a0)b5kD%0N%kiYig;n`Ho zbd7~}C3Fe5Ic5T;23GnI$}3>%=qlVTDP8X`fBYM~{_>iM&XV^!)Heon=6dT}*ZG%c^c1+-#%8>ji<$Nb6|KAJzo0$-TQueV2Y6IUAP`743%vkUdGbTv_^)*+ zuROr5nQgm%pQ$+=5$f{g?Kb?ljhKq={&vIfqfOM%TG_LbW<|b|l>DVUA@imGf-vN_ z2yy{73j1pHZ2m83nZHF-j-wuj^S>bA?v7>{eq~H9NO6{gA>UU4YakDFMk_94$q`%G(ce zTT${sZFijhoYWF8&gnq;+m1N>gXD;ln%y|7GrIy1zlk66(eUHtig_98oZ-bsosAvw zUk#EkpHPl1@tk9DZS=7k>=K({Egj(je_qhSHEH5sQ8$nR)F4Zx$3@UTBq<~+nh zjY~shM@RfeLY0jV@jN3&;sS5k=q?)VsxHbm4`GzF?EHOopXx=xYYl2gt~AOAlJNMM zB0t3AW_|Ww(1vwHdn8IO&v%yeN4~Ez9tQrm2&zH`N66W?Id{b5+ccK}1}j6-<` zYuL(S!e#4k@cPRK;K@XFsPE69b3m)Fk--{9{tliMc%5&@%a9d9f;GI>$y+$mZ^TiFi@^3jes zRc4tFb>3aFuLII(FVY8Qd4ETwafx!d9dktooO~~i-6Fr)5$9Wra(p?Da%6dd)+fp@ zbp!(810ei#2g2RFI5F|E(h+Azyu2NMie`NWoER@ovrXRM#aUzD*wwrt)%2_f-Rgb&B0JVQ3+;UOZr^v&+D25abr8Gr8gB8<20Q+ zUh;t3@fr)^`Min;CTM|ZR4-9F_5%DMf@fW-dTJ>h(cr071C6Tkb$VU_-g^jo&+WBa z0=U>)Hg==|KmG|14X?%B`c`{4@{7NR6Yx7o%RT(Y4A=$l^no!6CwLHh|({maVttD#VR)8uDw z2W%~bc5KJE-=wuW7BrJP@bu_!P?UuZZtK|@aE1=BOMe3k<%2_1p^?AzX1gMFK$-O$ z6y+w7KL^-Wgj*i==~Q`~2HVIqQ8p6y2h8|GODg%S69E6(7X`y1&x>MDm9xC@Tjf`9=+{d zpRT;WhR4o%5I{0Qhr#&&)O9v+QB>dmzjt;8#8p>8c@Pr}pHb0JG11V-&`?RSuazl} zB8G^tnx;8usHkL6*rJ(|l46okl2Y+2EK^i6DlAe;GE^!{QYtgb|G9HNi^JG|Ud+sS zpL@=IJ~O*B!)!I%K8S8R+~JhFI)q-}U??n}{4-=>)vR`4?iY9Z+3#D!{pQRdqsM8* zK$bB2#$RDHo)w^-6-o_-gppr_qmaCS+_&%WvwyILcUMP}O}N9ZC@8nkXqOq3d&D(k zdOq^kADQ}*-)LHmqyOT6Ba_Elw^VyCN8#o7$JOmKrY|=*ws-i@ znQ4X5Cwp-2_YoP>lMOyCC75>PlhW#=YKQvj33Y>W$I}b=<{F%?l9S^a$aLvc!srsn zIbQtRb6?t#V_di_|#D%t`EIv^q@~2B3IEAeQbM>ZUC)qV!LKkF8v3O zJTl5wl}w;d9DZb{T@4@Ij-;-%>f4qkJxUl|4X20L_1@JJ+^L=P%_7d8yPmrZyY}WS zyZJu~o%0`V;sW?|G2A`k&y(8~TJ@zy{D+GleV7X+y?)rL$*-1Hc}5D!9oN=R>(R@U zuJz~xlc-0v;{pBrqd!^F1Z%wvevp_>0ph+vHOmOjrGI6BnE=uE=3e*@w;1~Mqpu9b%_HA6vbbtiG&;BDKm3kR zag}zzY|J)6lpBqga$H9UM;GPMJmm2CA5{rdpj zAd=;2$EKvVKGhR4#^kQ1pTT^>P|sh;@Am_aYtq!KkKgHN?~zRx#uBK87s=XiOnjcDA7Wc&dSO$mOfL~=mFb_M zT4lNy-73@d+g7=^PNvuNwdx1zHEXT_-=H zlONN`bLfQxt%b$v66WdT1v)uJC#UJ;r8@a(oxDmXuhGftT4lAwy0H~XtS{)~mvr(r zoxDRQ@6yS8bn@#u`E8wiNGHE1WEErofiB^gPCluVPwV6_bn;g^`K(UCoA+*sjU-PC%fw8POWl|wX2j>n)x}_?z#kTojgz{57EiP zb@E7^e6LO(r;{h>cXo7khPU;dS>KrEPTR zWR+UKzyTzu=;Sn=yi_MYt&>;j+f59s8#b@Cyd{N8O@wSI6LtRLy*V>jYiGM4dcYCr{PMkLcvbbn+aX9IKP(>Es1EIb}lY@ju6!rc1b> zlP~GypLFt4o&2;;UZs=Q=;U=ed1I>_lVjc73OUvnbn;6&d7Dn&p_6y%6Td_W4|MyMqV_M67?LA9)Kef_@ae7{a(X%8SDmyS%(}6h`(Mz#QElig)Dy!Q z4%sDTbnd4)q_hOi-E|#?mQWL2=6PYPzKI4t^nYosJL&4`s*3Nw) z?H4jrbP6+{SdXQq`ls;rHfGnX=UbSZ0ByNn84!CcL&m?=PIX7g&s!dA0( zv*`W6v!7+I^Vc$#zn1Z+b;RqKlD&?GVLemA)-x8po;j=0S=4hI7>nFMClQWwq=TY8d@6DAE`dA*W_Tc8!o}8`h z$@%uXI4in~^G14Twz(JQ^}bYqFXy#>R53p);BG45Zq8Hv$)4UUQrd^JraoM;^yNIP zFSVvGcdDoVHMr8BJC_aMJa8aqAp^ORNBe?-+?-F}BMJv`Q)&SD2XJ0Nd$lTnn*xS% z7Ce;mqqMIc%1v2;^o1di^Ri)_9UaDb!*D8SIOi?*aOM)kx#tMZ{6|nlM^Z&cavmB? zJx2XW|0uNT39LG)ZpzLNG)^cZt=1a&d( zTWFs>g|qxA+$DP&?Wghf0n@2r(|P;w8T5qo3~q9d;>;(CDjLO=LfT)6qVe~g$$9il zt`yL|nfAetaGvo9S4wGL_&=`9n#Fm+EUvge$}LroawX(3&NCn5N;B<49_LEN<+N|1 zePkL{B#rYr+FR2(cd>D$+{U?i30E4I(41IG4P8nVr9JD+%q}L{SQ#@PK60F2@;dBP z!M|uXVA^w>4#0Gf#WDjdv|@?TIFube7V5I?9XuT9=dC#t6B@SJ+!wex*jw3r>Fwt)mLWP*3#C*>IMk)4xuP*pvIc!$0W~Nnh?i)(^F&8(i4Q(hc>oFX>5?0HEnK3 zmf61x*MfN>+xuzLMCTq;T-=g{?D6<`7QHl)C74(hoxxaUf=b)E2-;+fVoXVii?Ojx zo}QGFFgHFa-4>G)m%!*Ekg_n9sf*ZVZelsnWLzCfo5ncuNMMJ!jlE9^EkUGf_TecB zX>(K47R4`#v$2z;ZyZhf8^eXeINIcl;W5ccPbaV|!snjZRJGQUF7uQ{X$$E!rs<29 z#H1y}->$>IWPD`~xz{{FgFftb!UaBjE_;@$@w#GTZz?8MI*F`WM$o1t#$M1>>8_q3 zZFz4}Wb~m;UO(Ct2GgeLG1?rR$kBZpP0W;#63;SBsq+)klHy{LZ?biE^O6_E*n-#xrrYE3u?abzAcyV#^hrcnG?#s5TAsRaQT*Jb6n2&L zjrTIvDTXbGO-hMLTRxZCn_?5a@^l>A%M%u}w|F9};AH$6PiCdc!X?S9T1iP@XO%@u zZ0rvuEg^0x`&&t8ub6DC86{GM7pAjyW)t1(;B(m~67sr;^5vYlXkNH5DJAiCvwk(3 zSuwr9n(jtw+oQB)rr0Fg-1H@>sf*HVY;!wIxK>SGyVjPr>bA9`9$rG_%w+}SkP@Gq zkjB1h$CMa$-K?ghKgG_qqZ!>Kx~-gEv`tf*?sPImU(!E!l=Q5VnQh-A?B=o!PL6E% zJJB@N&#^z-EuA+nnda?VPBgGxDf805ML{j}Z~SJ~a7(3OQd+0jB_}b(Fas$o-BhY~ zqN#L^GN~3pSE&VEQJbLK>D=0OR_KgTe%+Z$(c&&ci@Q7#caSiOk7N<-{5 zx=@F0XrI7J+S}MWWK|?$uSvvSVGK`ry zU2W_p%9LT4-GPocA`Ej$P_yV~fe?njbTEYBA05oBKnuVuZCiFn7`|jNhT(QgYg=2x za2MU)ERkVYL=G|xzoYMaF--ltg9yVPEOdI&!mvaO!^%6taBW9pNt-&FSq{Q5mr`Z6 z2RjUPcDx;i&6Jfc3>!Prthz~s)_y4hxb~26 zr1Q_-PK(+G#~bvtMfFKxQ*l~sv*{TfaYFjMlZ|~%X|-<)ZA+$^PD$$RbJAtu_P$6e z-!Ha>M>P3EGtNuTb*8M|q^xeAm)3XIV&lcmcf`i4WSm(kGN`4eg4&#!R(Ga$?CqSu zPItDkjx}UhTPh4ItIYDe^arUjHVaizuGp5*%Md9v7Lr&(56m&eajxHQ#au3-=T9nf zL@Vipa>&{`mrq%lYaBb+i6-o+PKoT>PBdYE>6FaQcBZM?(pgN^tyXQS?zEB1&|&RZ z7dos}kx?x@!AGY1#I|aa$ZjD8Rs#FEi*|7Pt&28}7rQKCf0Fgcntw#A8+How!d+rp zzFRmYu$^6P?6t0RZu(kS6#Oc-6+47Q(JS^)`XOZR_q!&rBV=`)tP1I2Kg#Etu*!VZ zzL?V0You?X{6%gzx{41KTimGY>x50qd9ls7Ahy-?2pOF))`}L1jydRd=W*v@X$UvhJd)D<@wl`3@|`;A=ksVr@@{&Z^{t$cUZF@}B7C5~lv z)lS$icBO&a+BK2w?@9yrPS<4iX;*QixzaU-z3e7NZ?Bs+dT+R;vrpV?Y==8__77s@ zO59odn6$K*<#TN`B}yCzGPU*d#OKa&hOqhCc|N;tNn$5DE{KVXi%HXc%KD*WGJCO8 zIxFgep}$52HE3bj;0VLB-3hWkjBt%YG}uBhlyEe!KS7?!sQ!|y!MD?gA&l_Ly)^k^N} ze?3GPUg}1p`ER#GmeZX^v!Hu2d(MM`;7t!PkX0VqKz`w&g<&n#NX_)5x@%$h5=o71 z!|;@6YZ#uP)Qml1s#j}aSa3TGuX|D${^dzwc#Di0v@pzgU6|JD!f=O|7KVjhS{UYg zEutS;q%f@4!mvpT!xAkFD-niYc-dGjnUsAk`lVP4!zwKdOA&^@dL^)CvbsrDC0ZCZ zXmqM!4@czf?9qBYWQ9HGpx_9+*L$>%|F@YZ_8vG={Sz&qweLsjLK z$iDNUp=$I>W*Och@OFBqu+!d)deVTM_0|Tg-aDP$@V2qfDeDF;@_w+V_EPRqJ4GhW zT^N&?6gPL?l9V{+J~#3~`iP%oW8SyJa+vYs#WZ6~&YaJFZkNQ4INcGF=bVz+Cg;?| zx$}}z=23{ZxTmvoo|uTQ`SfUX_0LlZO<|TyZpq^AVNJY_Hz`d#*ivr4-&YyvQDw5! zn=K8B_}gx>G;mA4#Zs%-$M#md?63GLLA=KPg|G6ATIvx}tYn%hlp=FTxo2p-sYy9% z%2F)Nl%J2kONmRSUzt*3_RQpUPFd|jT;e@_!&Cb=@Iv0qqbzy6lv^y8Y66SJw@iu5 zb_ofyd(M<_jRCc1Rf_-P;>jrM`FI#{NSTC?eX2?bu_#v=6 z(qq~%jsH`m5R=dc2HD_Z@Jnzg(XQ#y{TXofSgi%@9dHr&1h@+PHMnw|w7*6y%9|gm zwV&Q<0E1$oprw5uX%IS5vKO(Kr1W-sZ5aR#36~rSjs{Ny)4d#RNd)^(lbjBYh!Xuz zOBN|ajjS`J!ESKnqmthP`y@y{Ml34S0QVPiZ+kh{j*^ zK;BDIQAq}34C}z(!oiX+(|-e3ft>@Sf8|!0?nx~Ci(ZvH99#jO0q-Tighpu z-7Pb)BR#rE@>}52V#y!DUfyD2>}znccFT#eYv3}l+hAEi%K_=H_J_h9im~7T@N{C) zLqTAAeYD1n@5&68z~28o$c5k~@H`pH>1P&t><+BH%$cDija0@uyk-;A_!*yVnKPB$~7lYpd z7u=BPpAd^7kT)h7I|HU0lv?@hM=0c-O1l3DmUk!_>kue2kasHSMlV?2uw-mFSl*~) z>^`u(VM))5fa%7iw#*?GL)!F@ET1igqJ@)|mi6FZdc;C3TOAqDBNbxV2QCA@1NIpt z(@%o^!RNsN;AU`;3Pt;2vV|ewUf?kB2x3uV8+bg}m!5zS%T#d4RLODhU-_uy<={;4 z3t-iu*bhYw3_bu`9+Me-4vqp}GVm<}cO5Pplm+{K1|B6@We$T#gTVp=uQ%{Ea3uE|1F|dJ;Svyb4?Z&ILDu_Xrl}e~02j zgTa>uz6AD}EepH}P6c-gk_{*W_Xb<&zYN3@0uBQ|LacrN&w?Tq1{L77V3#>EgPjI` z*TB^V{>i}q8o0*@iht4NjsgNl$QFd4z)9eh;8+8%Fz^-wzir@C;CkfOFoMQkR3K=s zY~epJNCtb1l<9@wF$R9rz!?TEF!09)KCc=S*A47UUz!AHSgfm^`8fFon2y*XG`I1AhZd=xwcY>m_GRW=@q z*;2ux!1>@ra07TPI3QjYxEpK(9|4zx&x6eg(!LoStTBy$`_Zz-$uRIW@CXA>HgF7h zJN(yyuYmU(xJJ+7{PT}qLEJ~&y`{=JGMHlEG_Yl!Y|(QD-eceo4SW_HLjIzBW}+(_ zqQFdK*werx3_QiaiQrQBKM!sJ?*|7a$_gI`FH5Ay>BMpYiYgfV4)&Zc9b7_W1>?cJ zz}vwi!A;;P;QsV~S7M2G_=BGYmnEsvAO{NH1(NrGqrm0hEbtfLa&RNK3ETqqe^Tb> zPS=7&56=PzfU{L7#zRp9js{zkWd=(e8GyybCoMzpUIUkdvyuL#fiHqphXEfaGj#A> z1|DtTso)wEkYM1|27U?bxllIffMk_96ekS^mkn&XPgc-j?+K1ThJ(Qc;0fSH@c+Oe zDY62|8mlzxp?DSs4&GtlQg9jUPlDYS$qehkv%!CW3&EC9*?=qH-h##a3rdw41j8T; zJQZ98jscq&OM4qQ1iT(>1MdbGgFgf}gU=Cb=l_5-nc+1@2H^JNWsQr$zTgJ%C~*ID z=|2@54PF4w1Fr{Hf_IH~od0byga3m;2)GuU3ce051b3PsD_9F20JbcV`8@y*1IK_@ zf}fe7$_z@O*bM^*e{A3@2JUo!TmJw9PX@Oj|0FOy)yl-OLWN>J6wiT6z^@wkT?1Dc z_&aa|{I409hsg>%(p4{m;vNG}Ht;+HF9Z8OC0mqj;6ej`(3VwJ(^kPQ8Tc;)cY8p# zz)@g7a6Bq78e9f`2;2gG0vxtXRG7wpaT^6=8w|YNzz4v~v9c&?BY90ZO8Pc?A7fj8b}t$eoYwnCK8jvBbuz&{)KUjugumlbqWs1GXg3TJUVJ=^~n4V4KD?|FWRi3WIF$ zVQ>!k3^)&b9h?vDGDTKkJ9sF#06Ya;2u>EP(j+N@;yD-;gNwl>;2Ll#_&T@}++(V& zKo$5ta5eZba3eUASQWFh|9UwI_rM?&{5d!bd;=T~_M9dQi~x@YM}nilQQ$S;S>VEH z;`~n)m<`1d7({~`!SP^gq%3egcqBL(JQth_&H>xN?}L|tuSU}NiwdlS!slVh8Q=%N zncxNBEN~t;8(a#`0oQ=@z|G)%u)8{47PuXXAaDUV3S0M29JU3!Rx^d z;630*@F(Ca;0ACL*gR7f*bMFszM(OVe<&0!Fqi{oSu!eAuo=7y>;nD}OphsPC$BoN z75o?29o+p9Ss_os;{10H6h1JB1p9&)g8jjp!2QAd!2#e;!GYkP!9n1z|Dy^xGkUTY z-~Wd~;dxB9AQT)9eheH9UJhOc-UiMAzXz@Wp9bFm{|xp$j_>~+XUQ6cAD0yv1WpBq z6W`?`dRNi9cs7{+i$LR4uob)kO#h*)rSAayg5Lu7r+??v3{F822!nIrAaD~n80_?@ ztWXHp2OJ6>2@VHO1xJ8m!I6#{rjdf)p3kCSkZFH7oF4bBp|9y;@uIae^-WE=hU^}2 z#30#W6Tq{;bZXM<>)fUN9B`D#gqAdL&~VAmf>R%qoF`dj+4oAtYcR-0h6ljDq9(Nb zAFWyi{WN4J!Kou8e+`c4C%FlnIb8BT;Msj8ccfxFi`kLULn``e3c8IKC|Oio6c{;7 z@;GoKcrw`5Nv1ynUg<4aTon-hjXsjsfR~A`ro}E;d^*hODHTO9kpJw**azSiIGh6~ z50&nmZ3jd zv=|(Aw@hCJP8}>+yd+KJU+W>c5F9P~o|g9%)=x7C9w8N$%Se6q94r!6;%fL}LCFg>DzLfl`Wc%KSlrC!N zSeZ!$j9MI(2h0EAWb7Qc8WWm+bx^BxxTrZT^o+a4{ShI9!SRTY2f-N#kQm7-%Rq+d zFc7zu#Igxo=_mPBa6BU9FgO$u@(p+yBIGJK5)tCkPFB!{0HNQgqzY5Sm@%R5gFzS~ zA_`mwP6E$IgscLmVgk|w(OM7GVLs8jlQmApgg*<;M1V9477;VMmuw-uZd!9_g2QNV zG$LdwxDpW(2Nn<5iDfys5DnT4ZbAhQgXwn{wdGS{En;k#pbap{LWKMc_C$+(=_DwI zJNRyy!ANjCB4j$a3K2qY;MeS<5FyWj12D(-IWrH9&OI2imWxC9Zh2u%O8uGMrsI1mx?8aNygavW?$gw#v6U!F=4QiKShA92wt(S+Lf z1J~Xs3mFH_>>zo%BYlA61>jjdByR>s_L2M=IJBQ+`lTUJ9-UMAOU0KkSgA<<2|UY7 zvc*+au)3$@0C0IX$q^3jC3!x$&{y&XaJGl!w=@5>(TtWel^$sXXm|49x2&w~AUVl6_Nqol!OFsOP!avHcsoK9)U0yj*PydCWSu;dbO zIhcNcO`B82_#9FT_8led|FO{ci{WHO}h@uz4^_Y|e;HGJ0Pvx`yPy`}u4uLDdN5EwWqbhI!!l)4( zAu^=pI=B>3^e;FNQRGTzNHK|XD2hb+tQ!=m2%{jd3y%Hc!BGgKDUS3&S>R(}3!*3y zJR4E823&zCqTguNDo_x_hl=u90Te3{MhC(52$M>1;n2g|W-5m|bQwmU&xX@_53ND8 zj36%^tX(atq8-`W+@|9=9KVk$7vC@|XQq7A5c9pgd_Gw?XN4xZg&_rL%qe%ZjW0 z?`?{=eZe+my?y9bWwibEt<;(Gw`|PLgT)$rlY}F03pWjda%yn$P zGUxD-V&y)!N!r|TY;JyMsbI`We7cmglD=|~j=q&R(JLD0YW3dEU>Fc|;3}#A2 zy|2P7_F;#3AC*5yPrp9~UXGvXTjrAKJ6uRt-x9591 zeRFhW_Ltv(KV!-(-zIz?_)%IhJM!0u--Zr-b;992LA@@#l9hEn=<0K87e60e|Jv4V z3-;Xl&FjIaa`nD%Ue7-4`^Dw&`z2Ps{`>Zi&wp$lJgdDLadTmD?Ts1B<4oRhB{MAU zqXNDj{cY*YPtrYC#Eu`Z%dd99#!Y*Fo%wb~YP)}rPd`_1x~ zhZat&`#tEF+4B~xf5_rFX7j$ieFj|eaaw)tXk>tOa>Bw@N4$LhDmzoN;z#Zo@Nn8^ zk2v*r896)Sxotc9x%&CeS)ndYZMpoo^OjxT-dg|if*l6j^EeP{ja z-qQ&M?RPz&Y6*Jh$MYM#m!5jfbbP?_u=-z=f6njtXjny2?xikMj_$m$?M?6BPyExT z(+5^_)l|3A`d1g!FIhQg_uU^JJhsed$uGxdjd*MA%XdFCWpB@y-+8ckpOSQ8jNh4W zBj#LDUz+N9q37Bm+0WaL{`qI-uAiiW@1yd&V+A?fXL}KSJJ1ngBn&qZG-Y;avA@z80$1B&%{GvwG zT^#E^XJhsTvuordOZ_{ne{!F49ZR3vR5k6v83#YSes9_9kDOT_)a8YtzdUf`x%BV; zD81BYTkKPyP9Tmut5b5A0O^LVu3Ev}Mxj-M{{@Yu!EJ>Ah#Zl=1$) zZioLK_->9JuAm_zEtaeGUmadZ>1g@?)BXh5&zrqd;X3IWeqhx566Cz93J~_ zMR>p8z8Ns}n{V#xqpmr(>quHryS^t?)7DeVT81WG?it*)zu;h?`eXiQHzMEMH_CI) zr*#+4W~e{=(ZBT0xS#+0ciN>+hh}tZ31zdkO#ETVhsWZk|DN}RrRDi!ry7GN4*Bc+ z@psO=bJBXFyrBNi;*0i!eb3~Mc;M8BRW~C?_Z@TZ>H$5cJ{>XjpNKO1kuTq{dmmML z`95xYKKJD7+|vj<~+znbeDZ9ewRxXHS25%kTwPCU&3Q@6|WL zM*el`#p7k^+xz70>U8z5$kUzITN@)Ty^*iZ>3=08Y5bsbqYI+44m)MepP9ccJTJU* z^jC++-t|N3Z}YeAsXqFQzyGMz$jx2;uVC-cai8Rz{dDmz`|)kjTNkH4`s?qfCKjkA zOM+hLA98V>`F|rTH@yGA$#+WKqYwPG_{W3i29KVY7<+5P@h%_xWS)BIv&+SU&mMnq z)87X^`PjGrg~_(Z)z{{1dbv~1n!m0oDLc| z(ySHf-h{4|SM-`8&Yrt{PcN%r2%F35UfpA^X;($Lf)TG%;s#gX-0i>jUM!dz%30mo zdyLc66ItS=<++V#ChytWswzF)%2*SVbo>!@RM1nX^Q(%v90tk#L^*#=J;%TQ3|6O9 znc}H(Z;vW>m-Bp0xxV`bY9+YNpk=-2C>EIGJ31w;)t=u4>g5c-3pvGZ7C8yFc&=(!d|v?cbAwCS@AzKEXe zka+?7JawgTctFwE!)Zkghb%>wLzV>=jvOiZil z%ETyrQ~#KpUU&}h^Rq7)^Dkzq%sX2a%v66+rx!x(2Nq?v1W?IwsK0_#!=V9QL}D*@ z-U_k}#OxPh<_99EG5d1|NcUZbFjqQiydS~F{7hwj^Hio)YCn^@7du5jS*z7(LCB-0 zx*YK`Ba19E{%`r057JKKe-9k}zvb5j0!V)~zuqM7u<@cGlW30O3xfs^Zi7?_ek0G# z#GJ$3Ch1`Jn2dvak*9tq&#e|D_tw>sU17nJTPH~^ck}my2K$A%PEY3-f~_vmz7CChQ+4;og&%*Twa8h*HMo@Ux~R+n?Pu&9h%g5#~n{n*gWy;+(KtNa^L zSGgO!vUizjn$E&P+EqH&U>m+4zF0fcr{ zm`e-5^h{Qs%y|UJ7JBn;!ZQouJEgA9bws6i{fzh>7#yTtElZ7(CnpO7#7m`oPKaLY zES1+M3wr)gNU-==Dc=;5B-WJjeIaq`Ptk(Nz?&Y9?4vZ5qU6mfLb&#Qlr)5~gHz_n zyHbSouoUz+31K9HQgKQYe^le^bqQvgBT@zbD5*Kt(3nJnk_zDDz8jMx4~h- z;%lYc8kQgbEU=t{FbYrxB2eE)K$scG3->{`0diPB<86RSV!b_Z6w386|&{CPayYO63b_LXx%@kWhx^;D>c_Vt6V4U1v4e0g;8Xp^hM_<;Zg8Ji3%Q zzg@zdf1e|-PZzA>syTd4c&7Nn9Qk;nx)wUj0 zKSWhSk@h=4ROs8rjWN-IJu19-6W?Sg^8bggLc0e>ZI3DsQ+LJwPy4Ez^i)~cqsr|! z@h#Dd{g?TwFoS}0evc|+ZsPedGetgIUNBn7^dIl58tkbW-lJ+LAsxXj{e}%m^i?w( z6z;jS{H?}I5FkXq^RvMon1)Nscl!(ztUm*<>1WA3hBCEUs?v;RVL83nqWusHCOmid zFamD(D!s*|@T#vi5K6Xx+HZ_7)&Wgp3bdb=pnf~a6c}pvngZ$tT0j4qLJM?H zD>XZWcq5qt?B22<;R9PyrG~w%s9qjonj%UDKG&2e&X~>DoAhJH13ksIf;BTmVP%rhqRC7oI?8jcvqW_)F1?~fSMP* zRv77avrYT}&CZ(;F&Hp^P?2>M`2UGx@5xWHDhTezrFU9YMg^#YcLW76)??PDCHC-!1a7t+#Hq;njjAO8Nn4NCfY zq(?eNyPz4ip}h4*q=z|1EAg8UAL5OdA)exm--7r+Z~QjIj8-IBFwuDbqFxpoQ`cYMHaPr_~k@Cff zf;wm!HgRk7q!yFF7JcZ?pB$V#cI#wTHx&9mLI|JGEwV)?V2vfT{iV1Yl3)ws_gI;; zqldvYoj`acK?Ed0cPLx*HV;f*8r;3gv*gv-s9}SuPTL>K?4b!NXuPN?|)wO_Xo30y?uq9x6Z%)q8ZD)GK7T`dY8IMi0G8i_5fJoW}y02 z5v$vefC+A6O&%Q+1eAQt?>~dDPs!wiQbvfap3)9wSL)fzet!c>tNhwno2Trp9%VbJ zOwS8aOHtnLDVKYc*Lli2l=73F@`XLhZ>RE1zBO$a+OudyQI79Xp6@A_(nq2^*i&xp zQEu{;$MWv27p%FnkkvM9%FiOcwKpaby6*@S%hph-ML@g; z@kXuGGCq_IZG?H1b5^_PNC;mx#3%|O{K+BK&=1iPQvA|4z1bpJWEm5B@sEZii}iv0 z_aXW;I5>2jP>SDRR>xpxqz=&6JlI=bV`7@lRp|v6o`y*O2J?IrGN0zTkbj>sF3bX$ zGy!BCZAKi{5}zCv#fN8Xom&sN@C_KieBQ$Vd(*)H0UicecUh0AFYmYos9C7mB8yP{ z0vJJ2wI)H|X@gwZ3MS}=RrKy8R<|8NVS?0XUOChvPM*%!4_zbnpU(A}GfjCD2@AEW z7PVeQIE?f=2ucfy2s=RRHJ!hfnJxZwJwKOOF1|UD&m3m8%c!&lflTNf6VSlx$GGEq zrjvpl#mrW}_hy zNoh7E`f5Aanr(ahmFTd*Vm>c9jqvT}EdQ+rX> zsD44?$4l{^PSP!9wL^@7L&^%f%S2In0a!ki*RLX(b` zUX+Wrzj2HS!Et0C-NKLdzo1<*TXm+o$gLY!~j_NO#mGDiYvc%*P z{^h7wQ)|WRrIvr7?0#FMb2S)ZEI__Bjp?@1xbDbwn$+x+TG;$#BaM4RCVy-6*mUX( zt_as&Liv_lFgkPJjdnJKJe1K+&H^+AcIGtDExxscXJ*I6Ek@CKG;=_x(nj&0n6xgW zEq%xU4s%h}k`lfu+bZs!#-GhLir1I$ceAs^b;VrFNgGs~n3nGBSkBzXehg_myP3Jm zR*7gB;YtPIjxCZ~{jlW5{M07yPUodL`QckLoe-u?b2~B>1G~K3QG8(VHvmo1x^`y)=2I*@w~MBM(pBeU>AQwV^`_)#tXMz-*_yxgqKQ*;{DV3 zI%$F7K{USy(&C(z?WpK2xmyb{=i{Z82dDAS+~UkBC?+pOn8)sJV;?ZjqUgY;9%Ju< z-9|*++=nf~f+$Hvy@!hVleq@#W;CT~Vme3hE6Bcpc)L+@7ucCoIJSJli^cqKuGRhw zirS6L-ENiKxtM}_N?V!x%Ir$+c7g3!3~(K2uJL0b!&gXL127hVAsxVbz`)EGKjMWU zLNpFXnr4Y1uOkk#6vTG4Crj=lDuZk4G{%?a4Gy-aCpO%wCWQ;72w15gHtHi*Xr{ zp8yxyUX0AsWuz+k3s%D>zLctTWZ{+mE3QKO78xk(hI+L%LKL; z%5|U|@M|%Jvqci-wSuvswB&!IF`^D+l#ZU4rZPVHy6~V=$ZrK3O~P}=RKEDS0r5@e zU75~iNdCxQ1?S#XzcphAs`nqIMJCz5GjTW(f z29BL7zC4w$9IFrdn-{czX8=Y#HapIN=(og9SjMylXz9`j0)e@0ndB})xoss6Dlu?# zzFNF)Do@H!5?`Idr{@<(t%^cnC>Rb6dxs#N%vva};k)xo1ueIX%gKBn8;l0%R-09H zzUzx)xxej;iz;U;;&&}z?z@s5Ee^5V`1Dl%*tij+nk>>trzqAJs}TGUYEaL%jJX{k z50*%ixjt6PC!Tg9C7@VsF>&nj3iMDX_u zO7$hET<~_T#{hu!Cao5nv!?Lu@k!!!Q~3Pxamj%g64{Url^^6oq-#&GX9Y_t!I^{B zM^dn!Fbl+CAp0(~jGw}fk2mQ1q13j8IpgVBj@1Q*k2s-{ zpkl)$uMPD&HHBc4{H053<`G;93r-p3bfHX%SB!RU^2H;woejRYPq4KkFV|80IP%-E zRAL0yN9p{x$$VE~wzU&`1VWQ=_=@5{mEvD`^S_PY<|mx?QzKf0{?%8?QKD+ zREJ6xVW3|ktm?inppd_DGS8lva#>tEJnG=+AV=}uDSXw$IiU*xgcfG~9zh{W`DA{2 zVwQFcA&#t@CiBcm>Ed;h`TR-A+VF4>+If@t7UU*Q=7%R){kB8@@{5y31&0R%V{~c& zB1&dKQH(7F2_kP_Jh9k|3s!eDtARDxrPcznK#kPSjT{9vVsMG$v4YVvkyr>`U}Onp zM#-OD5$?&9NHTRavabiA({nE=0TJ51LFI7 zvR@}GZIfeo!IU7rZgP;eKMJ;@b9M*cGC5oO9=2t)R01dSZtBEEh~k$9$ve?8?%Z4f9yB4tGpUo|x|bRl4y zur-q?B@rc_#5W(`M!c z11HN{Qq}6yE1+1Sl|^!rwjnB(N#Nf{oSuErbhf+uRkFQ*M&2jbwzOkGy9YxW^!yG_ z5_L3V>n8ChOAPAO$hsQ_Kc8|_BtKM=+WY-Lrh9G@*Ir*1)?~>Loq4RjcnrdI2>mDV zmDfM1RViR}F8d^Ion9>1`Q6h^!o&R0=|hCy`1{lC!pD644U>gO`4cyo#2+T|H*PQl zoySIr7=~!nJdq#0Aw6^*vS=UT6TGV@ZjYOhEm-Fve=z8P{Ygv3_kD(uO_hMW1fmUu z&K(o^nj5plzfI)t-k6!072p{+)uM52K}bjKhA{Eq7L|DL*D=ILVXpK*R@eNt+{|E9 zUYy9&XQm6E^IK*PvCKl{4m9fMOX53H0df>+E%GTnmbc6tCd}feW>y++LSAbS%P5;E zDRo1TCaZ-;_3;G0Y*u>sGuR1|HAu>d)X86w?#;32+wVgrO*z3I zgZM~P>>5MzG{W^J($h|MXN)}AC-WbIrw$G5Dddwpwjh2J;^9KqFf6GybvSGhL2@^) zl(>4Rrbexi4&s&qS-x%R7d>UiR6~>0H{RBD2F7?qn&c1U!(C4U$l6T)aY3?Bz=iSA z{JWcGh|v>y_8g-aHj&SnlOA_7st}Gen0&-(k+Y^kDVRX%`>;Ij%X&Vf+z5-(hcJE zh5Vz^!q6Ylnh0D!#?VY1KUc_;Y(?Umg?yPUU2H1k+idB^HdLbhen&j0@Z0KQlc4F0 zg-#=In+y5xwk&Z(AX^w|ULP|P)goLkjOUBXi;^->n}xE>`qejfRqv9jj^dc<+hLMB8TrRz zF|U3MY#iyDKZYMKpDFe!0;_u`6{JF-=uK}}L)K|8`JR+E1BJE)gjjI81!n7X% zQ5~DNPE;Y^HMdY0!!kfSpY!mo52UsF`oZEFG;T`oqE+}8|8jT zkog5X`_@h3*9H9RTdm@T@m#D(7T1jD=@nm!cNOrU+op?2izs|(KMPu_0O!kvMdI#+c8-*tPs zSUZk?eeWzj>5gb|;W$43jy38-62vtEH!skI4p!iXT|V$jEa1ikM)9xXc=mz?qH)~z zZ41^2+NZ}cT^^d`N<90{kHs1JJao}2(O=?^Eh^M^)T+CTIJ( zML~l2&#`>nk{mvE$r$ksioPN~Ja&8bT^mI4+}Q0O-(wWS9btC5Y=N81m!#hLAX^t2(AT}0>L&ff^B)j zJqRw&yNuv5{$KYl75CM06#OGdJ~#Rz=Lg3$_64{u+zY@wiu%wxJsS*-5j_G8P3 z2*QKB--=3M0e^5siddJ$v(~;QF39yDlai|-vrD=fnU^p(S0Qts2bm`%AhSSpN!(at z5TBKJR!zEy%mp>Z;`M0Ls%%JfifGP*lzIqxv}I(l&TYM!yXP@5^OM~7I+-2qu-HcKs!Xe_fLtbOPK!>xzWl^Euq`P_p=G4*%$^p4%Q8E>=tY$%m5s?vda+ zukUT(M^QXi;-L>Gi#JF-@8OxEB=JoTFV@Eb6VgTs4+P}7GmvHyk6Z5&f6d_^ug?xj zL`Sr6Nv#~u=E<@lK=0KcYsrec?vVoVA31#eBU!!mKzsLa{?Q}lLEnKns1>2NC7Wm0 zrib2zEE3f|b$&-SUsXFl_yJ^lq*;V(qQX*l>coF!^H67|SeC;JopDAhvKhN|liF-E z4u;&`4G(oaR^?Hw08RGx^*HPko!Q$j@HL{iVKiU$*ruQX;5#4IKa2v_bHq)f_+9Js0|2P;mE}{{mt#E3jlIK5~7d>ed14i=&Pp;O~dNSKb@e5C8 zivJw7J$+-Q5LAuM%I4B$Al$Wb6u;-GH-cs$i)ckz#iO=o|Fu{!{szwdP1#dLEBf|m znB@KeTyDe8fQ{U~ZIdYIUqbq+Sms>bhnYR`HgRT-%TtRDuc~fg0wDAIXavri1tiS7UF%`WuQBj~&i6fQGx(C|zPwxsj>ao3zDy zcR2spSka}b4gQOjxY*&SPeTcqs7uN4{svf#LQ97p6k>`LaE;4 zYE{Y|QHtAD$#3%HEAiGIadV7PN2!l%6cb+TC*GRI=fC)D|JGq74x~5P=VdD`OuA&j z({}}IcM)u2l=I;0t$g}6z1Vj+U$D)Z`Aa5L&|g3ZY>QMtyS;|FIZ$1aCAn=d@yoD2 zEhT*~D_C*@z@U3~TV>RTIOD_NVg(K29mH|CsKnprg)b!;Tm%>au_^XEWS`I%OrT|e!@LYmGdFArK@+)Q=JZ+2j$?rS;A@6z_Tki+%BkVCJFxg3-H{B zu?$t;q}_NNNKnRc`<<_7H6Z!})uZSVK?8tvr~+I$f`8}k)7>RVM^HV^Uw%b532SuE zP>7fVQezkPnqesP#oZ_iMEcjclDh-`)Q)MMjR-N`QG_FC=i9VUIw6yXZqN4n5ZOFn zhuQE-7kSZC@V!L18U@rQb%{8ypSbsg+E%)TESkzc{o1#bs8-2%Sh^7Dm43UoaFXLUF!8irEQq&IXpdEwofSA*ImZXkxkWTIXp&HK`=r}M0!C6k86Hc{AULLxp{h4EJ`~#j#5?XO2~#1Lg*>v z5lKH4A2qZC5i`=%i5vBNP$Dz<$`+%w8dPXsExEgY!V?^Geh4~)2YxWo3bR(2!FRP3 ziM9+L^hSQrSOD_rFjWRGe`5n~gP(mPM;wp=t!3a-{{9rs^-ugg-hSx3fe=``}=*-TofKPwtFKC;E^`UrYOwYYt&5 zQAQJoxxRb|Q=7rF-;A5R5k-VsyK)GlcljYrcrlfuI0JF=$3%X|8moI8%2Xkr+;3!| zK-bq*tL(23c$&z?NRua+(BQ3a4idi{!he3#D&CR7Lw9B8G89vHv{8>{Y=oLQLe+k_ z;N%DQH(cLOq83W2mkS+E3?fr2!HF>UGW?zIbrB^L1a`N0`0gP9f7#yp8fPV`bX>#<@X~ z+uaN4bXcm#yXCv4k4@}~CP@?Na>I2+i+k2-5Nr%XTyP$pEAX5>nxFt82kgAtfU>!P zPu~+KMhEhhdki5z13GzF2m-Yp&C~WoXnqb*1jwR+{QW(*jwwW)_8fQ-w$&=&(gr1u z#7pj1fvVzH0bpW+G9a)uohSdpC_bCci~eD-FZT{H8^9F8;}}q3?(6h8k&1N1BA@sn zst*gaGh${Ia*Y2>i2Ozsv+pF?_om|X1~;2c zmo~38#j+Mtx7cXIY7vNa;3u;KY0m*)jBA#607v6InrPkSvS?Qc;xt7x5FwB@QPHkn zsQ0T56eC@eylonKD+h@;xW@Z3MEfg8L8Y-sLsit)&C7*-07_jxVKlf#qKqVIHS+0n z@-uG-4MCoR#Y}>QA)ZX-&%T?SzXrvR0@SNt=DK?xFe)5?1IBw%uEc%IZL8iXEOr#% zj{JLYGDbrEKpHo^mt=SqPAh^OhoXuFlDoo>?V!svyVCfa_p(BRkxj(`pff!~)41zB zV~`)RTY;+$M6OKbhu_N=FQjqf-ofMA&d&*U-U|`nIb3vKb+~vGMLe#jJmPz}2W zq3W(KTBvk_3~e9!9hl^MtaQ$&?n{9;xO!iN)~y98(XJ+iZ`qeG_D$u-_Zc%)fY6Sm zPN&}9*2R9n;y3h!`!E@FsL_Ujk+tu@07#B~m#Pe6C8}y$gI$2kvxWhTSPV=mUMy2~?rv zcsxrG=q$km5m<)VJEI6`or{+7!4zKff!;6&J=w5eiaNSw8|br=((@(v#uUEtgQO9S zi5N6my@6-9%J1Nr$w6>__HDfMwn}k+`k@D0bAvI(oJ=vU!dy24`j7m`2gCG6kjxeY zQDFtUde4h9v^@F4>6YKo&;}_&mQ^kqa?_YFS95ntBAZx1el1n=JQ-UA6ICMo6v<1YPpr9L~j6k++pA z`O84FN(4GxEx~gvLIo670b`l;XOLsDEq7d8DBwzoh^r+k{>w*EeoM*m6mTGN@TcgU zG@=cHPQnb+xeJ*BuW2wLy`jgUgME3u`P2i$#C6Gh-GRkHa|j!-2bp>ysa)HZ8PJr> zbiR&xZDtIwXzMR7PvPs^^x?Ask7;|t)45*YEp2nfzoc;EL4){U3eP$?PYlIcIG8E= zrSLBgCfRcUvHNXy(B}tVgHE9jPO=+W3#i&;NsS=0swuA^!nqn3)%s(uda+vN!rHy4 z+w-Cr#9tG8A%c`)lcmGkZVK))0p47QNNTHGL_>SJh_-Doi@1CfO=-L%k{Z`q9_LSf zY&AUv8~YFNgQGm~XGigWe%vp;7Il=S{S9z^;Qu*qGiT>urbAvWGxz($EwlZ}Jn54h zdvzGOergk^_VV2_t1WCu^xO=~4O4EJsfk$@#d_-Pw)VVbR;#W~@ZB=2Ri8@m)TvJN z-7;%ahx8&?ZIx+3J#U${sdIy`+%iK4ZR&&Z{MS$JNFEAO_Pk}5k2Gn(Bi>tPU#r0^ z5JLjUHYAy^Ka?%@OXeRP+9z%s%%A+UYEF~okl`v`-Z;p^c1s~aY-Ff|iw*+{ontW- zw)N;iu`uGVEZy)E-7-we9c#aq+);wZ{3DCz7+-WaS{TM3J{&6)^Op}th%XN2`wnNt zrGxtRJ}m7FlzVG$lIQeavS?Qb@_qZdj|cIj&o+oF2Ju~=Ws0*0^K+l2Cw~O&sCN<= zk04GBZ^u&^GkT=$%q>Whg5EKRPygJQcfC?A(sjsNouv0`i2J}S_2!r0*%QnpqzTMZ zgZOKo8|`;`s}Uueut_B}6||Awp_I{CeVEIN^l+rfBBKpfVIRUW%=Pm?&&I4GR;sd9 zCg21u$~91F7wLM=3wto09uzzqvpA#)g)Uqap7up}$ZbfQp+$T~@=d(zi=3bq^srQ! zDZOj_ApY(b$pJg#SY7A9<~xqX3U~1KQ!(~#Rqun}E@bX5mFRNA>rT3N2^h79JFUs` zc=T1APz#JJyj(Cy&Aj_G8Y( zQ!6%9;y_l5bRp7(CsqvFaNo+6yw0xM_){r!KY4cLC$sGS8y`b>ezmTv@HYRAHPDxp z3kGg{NYwN9zO>jA?!Tht%R$lx484AJI5c;Js~YKJv>nS~?hde=8Z5VUOgKoYbL~UD z_FIWHV_ff1d@{uiu76N_l^*S*70cmWDqHF)ds8XXp)AJr2I6q8+c9@~rQ%L1TulvQ zT-&M980N;Y6@YsFDz~b)XO6-cYe@i=7zWp<0F3BTgECuJhjwKm-)FMWU=}Da!@4db zuL^61;Ax}X-zz9fP$ft$8uea7LbW zekbfhY^guqyey$v-3wb74S>?Icnu*!BMgz;S`btk5WbN{N~0v8)VKztIEK9A*jJea zxU9`);}3Vhoz`kL?iS;X%xp1ANGFDXukjD(Be-bu4F*TEOEPH~C=aQ*!-u>-&Qui4 z!+;S@cQ|-e6Pw#;wS;Z-NWE}ZM-uj+UDD~+`K)9KMx@4w?D$*oegLl^VGq;em`ZBY z2y}6~H-9VGA`TeHvpe;3Xy%Wq)JbRHPWcM!mHNd$uS3)-)&f_c^2fhD=T?4_i?wc% z`Z?=WH*|fDdRtc)chPu%8^_$8`1f%H(A(RaO*Meos4NDPaAqk#{B^25V&mVh0bGaw zkSTaQ>{)vW`13J!HUa5$Ps|I-$Zy_V995OwBi9RHuYlYQ)~%YKhuN zbcnS?Y^+~Bt*b#bt(k)kbQUIneackqO+jrlZnXnrR#ml={zq=cA=v|%Au}p$Rq{tD z`9ER?PM|R%p~XM#34!w|$e-1gel&@(|z(06jY9DPcuxD;Oz7+0w zjk@NT5L{CV#yy%=aG@i9v!P=lYk7bEeH-@nUb&&;xn7O$FJ6f_JBY(>{0Dt{mp|%v z;@*Zo=BLw+Czy2YY8*|Zs2V$~nX>?)BSmaHHV|@CrP+^LKW=sK?Z)=cR0~;G{epUx zJZqE&v^zVCxyjeuqzdioInf10Y^WVHKJy-H@yFjEY50k(_2b6XVO_^?hR~?O6I-oD z$hgwye z-WYRz^LABnS0SdGs68JGb~+^B>(iDrwqROG^sN2ersR)7J{|UX_GNn4moT%bYvLuE zRuV_;`D~|I#l$y9@To_mtY~_STa*xxzY*UqV{j}V}B`=}dGw<;=M~m$peKs2) zz?+Ft@OR6S7!3HW)nUzNFhj)MPl2qf(^6Y&*Ka%q7zvo=tsvSH5Wry8W`ap9Lu>*D&TxJsMs&7=qZjj!@VF2 zjgx>AX|%M80Jl*!tt+W2VduW8QJ3KcU{!3by02Lc*o}al@P0xKtMc^uB1GDirF#Xw z4e%9`OXYT>W7)8sV2@%#GSJ;!LY=-|HL95qXhlbjtEV+5LQsKqn!PKjn0SKztGX3s z^w+zN2=M$%tc50soL>omN9hU(^fM58w?Wvo;A&qE1liX3A&vWiSQrG?W9RHEKRG*D zg0-W8r4!>KRe`I7&F96i8t~#NhS6=tG*yC{B)Q3}`W3JzB+mhXv$OD02LL86A>=x+ zT21KW9JB|?3lipAtF|{cY8@>JD-t$V`>SjA!jnOwKpGIXk@1l4BkZ*1JAs8iT6Cxa zU7E3u=J{2(HA8QN%&$sphFDaTBZjNU;t3I~#I5po=>c7hVQ50wK^nRX^OLwpyD?Ft ztEs_~Pf!uFsXMJh#w%iB>*|o^wGay(OR&!-(J+CzXP#YY|Kxcr!w!}I{*FrKK94Ot zop?bdJD*Y+YR-#>8tNGTWbSm}yeMJ$Jqpe5povF^G~DOGT)2_5C=Ya{rLKY2^$)HO z4G3-uoeEgLg0wIQT|~+WSf@VG8cuRt3NJU>u;`$oPvwHnM?u#PRSY-%@Y!%(CxNO) zSHycc_yaA8H;4vY*wrQ_;0T4f8-XrJ@NNc*tw6=GoG1Mlo3uP(=dXa3lY8Z#(-Ekd z;IFS??@N=|=a!<5C8RJT_^m%C+9_@lbe;9TK>I8CYS-}zk~;}n+PwUpom8Ls`4uIA z;>RoDH4!v5)s-EiEEmlSsw=mSQs=^=_5RDU5rPMT6X&5g$~^%+g!a|Tv9v$8%rQrr zjSk@E!`Ol`W3}2ND!g_KP30Ld(DPmfDgzf+tQ0n`0`siJUY;bJ!aOiX$O@?FVFeIF z(&~5}%Ngz*cMF#ERwl&0<(*HE7)djY%xcpg13M{D-?ht=Wcq*pRp68j? zK&0^sCtW9W#ZM|f*9n!tJ3FS@bC|xf9si9-+SQ35Vj5q-)D6V>c>w+s{~`;lu?elC zt9$Jp#SS$T2_5xCET*i;*2{CGP1DkeE5mlcq5oW(t15R2%PM!W;TEWSv(Y>Wp=#hx z{Mi=5*I&{2e^*#H$aPHB*WYz~Bvv$5GF!&iA2S4WLW$$b%*W*W{s9gl_Vakd67UcWPcLx>>mpUVhe*yF}?@2B6zom|s=-(%64J3$2QdX?*GYmjN zHhW*l(vbw(_G$O1=SYqYNj;EQLB7rDv*cH<+Cg!TG z-OzZx@3>)FCzP)N$j`#&Yc_=Ijc}~p2IFj)#o$$_v=6|o%pbdD+Rv)Jhb;oe)AO(; zLG_e!$WlIp4p;_9-3%0I|Fkup)y;&8tPma8H>f*1d3EPNHIHYyyMQP^*$~6qI{TzG zsdELV4uPUt`_T}vcG42y{FCww z%$*0zIWNGfI3AzA;ff3KZs6)LNJBjpQmudRJl^4{;CAP*Ds_pYxcg}_v3oKb0fVZE zn@{w&-$j_~@dpEg*Q-d5NNR*Xa$U}YuRMhEtjui&R^Jg;aFQ}|Q?&)+JTT04oXX*) z`~rLKPqED=O8iWD+04Cp6>HflM%9ov^BCpj(ubm-?~w)gFGZX#Z!1J-`XyRu;vf7XiId`a(8-x%YCNBR zGRcq(M2X!hpn}zrtR*5C0|qyn;`z3ddeIus-#wWx)}YO)OmPK9aLOna#q)Wm=IB*u z+JS!QQtN0etX>wJGno08r?SP8cy2g7U)0C(HK(mXX9rxlM7Mnaf9>==;(c*E`Pbs0 zT$D%=9@Njo@%6ucl>TNM(=9Zk!Q@@=@#6CD7|+FDU5w;*=wa{DtU&+Ygr>Bq8--?P zvc&#zeBYTk(HzH5BXzVtPd=M2W)HwkMl)Y^HZJbd{_sJ9m<<>wxs5(Tn%LigJi4zS zVp+yg^*r6HC?b!8@0M1|0Oj^$Bp-FIe^MWG>${!)4l34zjfwCC^RGxN?mDEe@6Xqr zGl(bp^JmW)t!q(YL(hH+(h;t8N=tUR#jFvXwrerADD^EiLYVoEFf500Ac>V+v@a%%nnO8mW!qbcem5_-7{iI-J z(MQ}fP~%_;iF2SI-thiFW@SQ zunJ3%4R4tss#JTsZH40fpa)fIuA$0mFI5Jr)inWr>Y9fzoXrYFCJ;qRaH&munIc2D z`?q2I_TSddrqK{e4B&kf(E=TX8bGb*n+C6?NUj$(2lg1PK8n;{p~!aW;%9Z*7uK- zMC{ml{^JA!t(JfHyCgno<#FBbiWOG=bN8GZ4?zBqSF8viE?~=Qg44SdW)K6|g|Spd zSCep?3pSQ=^$7OUKyTM4l(rGB_wXbyFxhOhhFX!n$Ul53_R+mUo%VaBR61&mO*LvU&>zjZK)|e1|~jjo_viWhVKn$8AlYgu6N}@w%vn)c0gIs9)#)Py<<_G zn${-46w z3>do!LoS00K(6%@`pL)q1b@v#F;_?u5!7>JVOH7NOIY47*z>P-66CJ{VYPh)*X81H z7@GPqi~L3}Va=SkqlpW`Ty+3O&mix!0M9SI@y*_66`t@x)a~`QiA4M?;@>K1&+GU; zqBw{`3SfGSys5V^UH1;PM>vR}h>Rx8^u)iL<4D`EU>HR}j)Z)K8ha9)o;CvEjyQER zgXbmLA{X@$lEpNOyt0p=7Y~}{$B@>W(B?2+n)iBHEE+@ujr(Vgldr>s6SveMeK)QXQk=+p-Xy!U zLbUu>t>7=7P!e(Cx60EX|D+ZA_xc2?ze9deD@4eH{DuC83P2!tdjc?P7DwhPSUYBqe%$sbU;1XdwcFalS97(@6=&< zNvgx>SENyEm6t0O;^j&f7yy>f>x(Qi@KVGUKF4DU!51u%A6e znlK!Ce=Q`V9&FNzmD~bKQ1384iud7_Px$j>q7Iy*m6&tF`x!N4=+Iu+4yw>>)-S8r zNi$2nyZ|-aS3*E#A@U2pNNlc`ErEh5dN-yr83dv~#gK`w_7N-CL#!vzm5G~ZpfqjLDfmxu;v}duQ zxKwe~yEgxZ{4&{@E=0*6^%Z*CZ%6t}U(aSeaQM}tX3H>$mdhd~yfPQ*3cxd+(k{9k z^J}_^EoudoDJ`I^!ym#CTzwRWTV%Mx?^g_iSZBh^s2~+eOish1-9uRk9ePn2j0SmH zun=xvPU?uUQ-^y$W}qe4(bu!&=)4GiQCBYj@d3|6$3EbtprCl#NQSp&|B>(6!ZDiNFU$qo5bNYU-d;2pp*(U`5m*XqaLa;9uo4}v5i9v%n{`?|fNvaGLc9;1YG5A=BAnjfxNB|Krh%i2a z1i;v-4pbNYkBA}<4iln>`1&Tnv=>52(OnQqjo=Z|kI-F;>cZP7Td-Ylp4pcvFAoz2 z3wpUROo$KpM$}ZUgShSZGP8Ld!eRMHm@p8ffjS|@k^!}0x|c0(#Y}9~N-f_&gW{4@ zNf&B5l-f7xgb38WTPMVZE3lwPCBbSWc&M@Su>7J9YgaG7uM-C5P>p>c$mLS_wvJ&r zor1wi4AqV$kqgXyedVGqwDh9q!I>Q@y*wmb7(Xs35;`t|)h)w9za3!%!u<&EBD{e7 zClP2*<%<-`+sGdN~gq=46O57zk0zvzWY zx0VV4og`vQvGa3)6^ig*oDcC|9;!@lR(}LLz)p>SO$u#Hg}ybFP%aM%LHljcO};m( zH(-wOMs?*K-K9cMXBj%CcgQ>pIBFqqf1)N(o)967_Rq#B&G1_>$ur6|m`2|yS0mnY zl$QTLjxst*7~%g4_&^!u6lIh_7oZq?qdXriuZa>q@?Y$$WAoH`qeq?BQOAHf>ApI5 zdZ@LmN1dgJUq!75`LSrhC=LveUyBxM`ok4K1_(_*raXl_*kFmP@}lLbF+ypM%{%#K zO#aXKPt`=cR$qn5rD1nl2}Ngwlpwdf-VA)55^L$UI6F~W$% z{a9TlZ=dwfFbET+Pm{M#UtY9)*4L-vYCxa#r!lR!PZjzcsKI`pm`!0ct-@$3?<@1E zPaFE2&`+pV&%+WTGRw6ILX2@6ED;}(pGUkWadLy@Afxb6P7)-nM4jSultnMZNxmStu67 zswg?jDlFE;0TdCA%#>2BPqP2{oyj`?-+k=YnQ#N&uY9Z5>(a+`18U6JRzKEb9fcCKiH1rhaKJWOS`*edfRnm z2Tn|`amA|dGAb{-r>%7?@L218_iC7$@mWEEYH)BHGn<_Jr%MA;^EMYxK|hz@>7PUI z^iMcgfV|5tqSaAeZJ*={;E95 zQ4sF>0`dI_cPn`wM}i&kAHx;?Z)2$@&wKrs>XrBU-=e4Y`dh^iz5Gft97}!l@|Sq3 zrvf2Ty|h1-%_%~^@;m#}f5nS0>O8Dt#t9SBAAbeFHaK|COlFOW46hsEJml%@B(n{3 zTItkf#|URb0{(`Jd>Vky=wn5#DT*fGOR zh7HaiKOLY9<4%)j8~s?g=hFdefQeGzkdx`70FH3E7*E4-5WGJ4j~@?+3-^3H;Dkk0GK8~RD zU29U-YtJ=FvarKD>1yxC0zOBYx5nw@&ohLKcx=-ZpA$jdk2v{1j%{OyFWXktx@6uPn2+bbQRJ&bq-=0SsZwv$O$ zhNb6w(foesZPKNC@T46N=~B{A^t=vFpHB6andO&<3q$0!nSwNd6cZ^{vgF8P?X%+O zE$!=I$xX1(TiQLx0zO}UIh1PF$6)4OGnj_|WH4Z> z(f`i}lj=XfH;$9aIPAT9j6-$JICjHzpPb_#6eaEPUTVnvHRgxl4JsdB@aq z8TsmEq6~EwY7#xWqWN2xtQsj;u6#C09z0Tr(1-^z@WrH|Mc2ubMhek(3qGDS4j)fi z;`?|KPR!^O?0@s|Bpbb{pG-+G4Xs!|phX`|A``q90zRCid^ZUzxaeOl;W8}YSnr3E z`g=c|l#6Bj?>?MVFIQ&^5ou#!TJ}dM$ET6X{8T0fzLi7{MQW~m8i}r)Qc&abNccoj zuKYkhVVwU%!Ctw*%w&Sycn9Q!Z%NHZ{Hi4d_k?fut`%-HBg&G(bKEstNM*{Bnk5I1 z7Sz{WyRK*k%^=Ue5^lMm3JEvKOA%UEa=>W8Cf*m~`PxZ8-zb7Tqxc;>=^Mpwi1!@D z{|C}d%KqPp=*ypkD!U@0ljMeMAtk@LuXjGo=BrFpQg<6M64v8`EQ(S}{bN06h^)^M z-V-IW{7sG!WticmMmXAT#a&@oc{qN+$wA2Lp^}g+_&555>cKPe?PG-j za#fxX>-lB}=|9|{y8IOj^fpn^d)IuO1gt>|hgPt|dkc#Q+wR^x0b6B8iN!P z*D{-Dv=8u=SM@f<)tiYmm$HW+Oi5MQfph0)ep z1)V(bL%d>^j_=6%xC(J%ecBCywL{1tUm*|97a}s?%uwt&;^e1cpJ|zHf2kmx8bh`k zSb2+=mFcG5F>J!)h^1}$!l0pMuOZP22)_FVJ}YkBHCCMOCPst&K)x_!@OE%V`+Q+cOsRKSk*_8gIB209E4PrhkJZSj z1rU+pW&*;33A)Os;txoD%Ue!!1dGsx)Xtw_M+f%+xY0-fK^qB?VrPYJLE(F zJ_LdQK~&3X<@w`;`B?9Vjh((`yDR|*^*EnICpJ0)HpCEjzs>ifk{tn8sn5?yV zH(pF>epRNw{B%_n2e%TuQc!{lcs3uDDL zPw~MX#UIHbQ-piPc27xTkCJEQm#O5Wr=+?^$w~rwr^qadV`Wy4k{O=P%*DcJG1ya_ z(W5x+a&fHuO)(rzX4L8N`I8_mDwE@%R#Kk;UNmGu=r9&i#arhdo%4&K=4PEMQX@a1f}W}3-o2U{J{+288JmIFTPQ* z&j0dNXI(H#}P;_haBpYRQ?)^jESZB4tQM~h-K4zeu z&DTfsK<69Rw!43zb0Ny*`cgqR=uM1lDpKTAQF^*-kkfT-i<5(#1XXS=7b5M$5gUup z6SpUPE%pv@KJ1HM9#gEd!HoAOBcEu|y_)_2?zs;+0C0vOs3EC4d}DR=cRuhZFv_AF z#Z?+6Z=Wqh-5iQWrfZN`@+XaQ@vVwx2u?G_5drJyVl9z&Z6=2+gt1-7)y4hWzquA$suFXx@p?lVUl4)+8GL zw^o|i$$R<5HBAQln*4-|#lCnCA|KH^ijBzc$#8D~#$g0ytOaq-m}}eB$2oJ89L2%j zcHYUcE4NjjN5l6Ju9}@^;+?c)6o9_Y0i=2$E-PaR_3V5j+P?1Vyd%ze$+yIMv^#>% zPkGzHM~62>&}(w#Z|{FqH~uo?i+YX zqP%d9Fd}^l8WbXoK^Tj0d8A;fXMBw^276?~U4xw^+vP9k2yvxDQ8yVO^_n)1{7IV} z)af}gGtvnN%D@7WoU43odLUO?Dul;|qLSfq#YE>_e^OB{75drldA3{DqT*W7QFR-_ zWy!d8u(RyiMv#nsP`4*Wr(fxoFCYM;HU?5dT@Zh@F%L#ZN!s6Y_hu`wne> zdZjz&a>M*THk2pZfMEeJ{0g<#W=s4wgk!OawEI7Goex}3*Z;@Qxt~uYp9rA{Wg#IU z78+@xS)=)8YyPJqBq5f~_6Z@x`dEA#jcm=@WHN2q)-2PuW>{!jvt}V%Hh~p-sj%Wy|;VI7|nJ=^iDL}T_jskl6I~-PCD8lmf0Wj zwqUL*W5GU_-g^IBAIq^0^wKxf_P&8z|Cr4OnBSoc4$-P^8coct^^P>}6r*7AgdVX+ zdV_cut*_IH!9nNMds!N2&!y%g2S-^D4URncYAc;aIzlR=Y;BBMSCL-Z z#;YiUOj^~#qDNRR*!<|_2(+gw3o5qWh~z!Z3&|#%X8Gfk9!pcD_^*q`R$4XO@^v#m zf6MAA$&)|TmG>Owv)oo*gTLjIhxlEje~dWT)X&HAq;N`2p8TfG!QbDKXOkN%>u>QO z=WMGbigz6}oLpkNQ(fs_UK{J0H`+q~peY;I<`z5JvX}O>TU57xz5gG#jm_PxlcIRX zKAp%xv`xItz-hGQd7J#84D047?lH*t|KvWesY7j$FSG3JnLIf{RH}2oW1l{JTc$|2 zTIM32D^5oy(+$=h(Y)KBga41i@A4hsxApFK7oCu0YTT{9=^%oyIO z=Qf*Bo`a>n1u8>N{Z?CvwYK#A*198x_Z&CqGkF0~TwZwD<`dr9QmywXY;EcGt(-S5 z8M?pgO!7T?a)t;$zQlS@l)1p>Pi2g6K!Q#<7dGb2a>*r8+@)MDe)Ph;Z&*N=6)j3+sdVgbE>%w__R40nWMYgn);-S4X zdYzoCpUtBvxt0I$;Xc*oKo3S!9U3}Wj(O69daX<5@vd{K{~x#UdN*SyOXO&JCJX7c zgRz|aYiXs~u$HCK6S;#EX{_;$wq8vS4!8-hP5oSoyDV>pTFf89SL>Rm3N5p zIVH<0V>BCfc!-||`L%57=VN(OIMHnQpB*~K*v?{nh;w9LdM2jz(0saUH*FqW%1EBi zJ9eao|I6kVAs+8S(|ncn-TAa(tFU3^lpcF8{G7N&wXe94{NosLA^9VRV8WjJNAD9%S>$ zbhB9XK3?4{d+9xssX8A|n@{W`mQ6OF+MWTjsl4ci#DL_qaVSZ7CN&hgEhxf8fRF)T*&*l74@=Awcg+i-8o7dE-ED63CAokf^NKCwE# zqGq;zEFLro<9l$=D%xQsMAN;T#CIcgKcu7yY+FsjpC93p*JSWm?do7QA z3T%EULo98Y`B{CI@J`cqlg&PxUD;p@Yi39J(_}?w*PG;@PClXxs#iXv(+Pi3x>`ru z_S*Ne?peZJ=dC8A*J;&-U>S4kPnW5hIayW*Bu_5a6_!B$X|k{~7SYc_@9k?=SdXRL zW9BR}nnx=-GM~|Tf?~aKMSpc)P@pR$jQk>Og*Xqeyx+{vx_c?_WDX*maGRaiP)m;9 z&N$R^%z@sWhy1nk(Gc<*ORK*3Uwud(9+bxh(MSAKD+isP{4XST2UrBV%!3v5!F)ku7W@#ii?it61iGxxXnY=h zh|d`E@zVK}XnedM_=vYh(xDJ-!`_*6Y^QTNVsmQnv2=Uj1Rv|YM2hQo$>x1&m(S?j zi>a9%wQnSyK+@%%MLszizk7-<6!NX{%Xz21Tghfeqg`K1Z8JL`OXM^3L;!2#3f`H{ zv){L_C-c;%r?ksh{ZPx#Oy&5`clQ`{GO17 zl(CWk%bQL8^3?+lN|)!r_fa#9Ai}XmzBnsHPwJABjjUCE5FKlXT-9^n!#zmyp;cSA zHPR!W(K+xHO})#4GN_*PdtjOM(DS^*pf=>{PHU41A>7{*{}4BE+Ix=ZuCCGl<&lf7 z)aeg#@t{MnFw$$A{Tlh!(JJ>Sk69)*^;28KKzXYzGWKa|5%okSy^-CIENOr=p8OX5 zMN_yq`CUd2_P6*q%}L$Xy>#-szgp=5Ur?cEY1KAW?}xZtq?6xWR2TDMGB4J-I7^p& zMkl}RALdRczwJn`-R8ZN$EUPXP1U`XLGM>R+~Ps!t#5JZhdJANa3!~!zl|KTTjkYzKtaljI? zUr8(4O5Ks2)%&H7v>Y3lJo!uO-jy^ZMw0n5TANgphSIU7ZuvoUoV$qZwCyvQcq*;x z=1?RSJj7?F&SxyK?G$$wXJ*kB>Qw($Q)l`qJkqk)pB^hodTpUYDTBvkq3RT9eTd&h zIvSu0;7$Dckk7zIzrL1@s$T~hgSL*K0y!1o=&3oty5!vfbO4DK2W0n<7%T(t! zH?q~%vn6p`S)Mvg&2Q>c7Q_N9tLY{8Gj#R5z5l+I=h;q5Q>#vE?r8n*MLIJ!gKGFE zS?f+ptJ6 zy3;m|yh9`J)X2Lv@*5g?pGJOHBfqbaKh(${3)zgmKdMRiQX`+x$fq^(S&jU?Mn12R zFKFaT8u?d^Z2nyXH#G8J8u?$1d`BbS)5yvgwVUX+oLZ+A8reZ3x6#P$rEFFmI%yKR zXk>4V?4ywfYvf@Xd4xtDrICX)^3k9N75zNO`~Xg962@s9CTQe|8hNrtenumo*5or) zqo1jf=h$R3HP-?gkQ}d(muln{8u~8Ow5HEfeUG;;Y&) zrJTO2+Aw>1%rK)j+8e57UIfykt<`Ru1u+>?^;*Z*4>S<{%*{v zwmV}D-I<}tozmTzA+;x?djXjt&6BZAPi9!vi?P&RtW9=5#`5|xW5fW)q6aWuOWzIj zo#De+wh!Ze0~re(NEM*(D*BG|Wh}{;ar;3u@SF!Ro->G!oCh)cP(Q{Z{8+1mq0|CH znSJ6g#*B|Lo;jScoZ(E#9Kl*A1~66>z*^=%#vH>&vvwJySqrbRjK_{;22Z**KV&?! zJNXpjriskX?|;lt|3B6uKZ4n@Xx6eSni=zB7%Prp2CsR{F4?@0@q&fSP#H(HT*Qo? ziy4bu%?GtG$mota#=b522iSha*W-NPwF{c-qo##u81t&9yuryhxrO?D z3pLLcW-Qpsl*+BlXi8^>%yh<1zDoVIohilJnO*G;X2`cPV_qg}k(SL^c{Xe5`3AGg z+|T&6{q!J?Jf?)v+kIRPuoj*lF+TevW=#8-*(H6(l!DJ#i)-I7-v1;sm`<}6tG;FS zfoEvq522?#ho5Ci$T{X%Sk4&xjI|Ivl(%rRr~h8GH*;kb390tnuBa7frLDN)>A;z<18z+*oho%;?B@h$G!t z>BtRUZOO4MH>9?s!|Hb280^Yfm@DT=beNsemGj(g^sbj~^xd7lyVEz_d|S|i^9uS$ zoa&yO_wU7-e=n{$_vXyq+?yLiyeMNY&J*cBnUni+UhK`;NpH>z>A1h7AJw`)XGQ%v zZy3Oty$@A{9x)I;kn=QOs<1Cts(m?k8^oE{Al@Q(2o*Mjw@miqyxxy0K9nodhjJD> zlpALc<1B6%H~2rwS@5Hrr_#4M<56mo;nXA}D8mt)Wscy6F#5$ZeI(~K0i4wZaK363 zwa_Taa5QBYNLxCFwsZ{Vm5*~q_t*2xv7F_Mr7aszTQ;66;q*P5zJ2MJQ$PqeWIe%I z?i1V)`y^+HPjZ9bQ=A1pMHQLE%`A8lHzYkx89vS1)IP&m!!z8N6Tz9=bJTRt(bmv+ zD808JVk+m?=)0c2)22~Hr*ZB%ow{l|wHSS$r0?nU12A?5x6h*oi_pVGT7}Lbzd5{B zY!nq7MFmGwg`&wnnkyyrZHl4(4~*fwJccVS^z^mabGed1-zoFB;vdU-ax7Q;=5y1v z`P7UHIL}$Y>CsbE&_b?cFXSfwIC^<`9Ow3nXdEr#+&P{rVey<7E#^v20(D;kwZc;B zo@LZ3%V>k>+bxmCLLyg!S5QUFE4Wfhg46S)c%BsWZA{`kU?o=)R&pNrBK7YoYTB2$ z5|_+*K{8j|S92b_nk!lK?Yo96iEF4p`mUw#nzf`);k-J9URu7M^RV??DW-4x4fIdo zZJE(PE6w8cL?gKz>AR1gZgr$ZF+Xe9ck$~q4wyTV7+VGwTCuEFIglx@j-eBl<-3HQ zW>NZV%#Y++RUfG8>F03cQr1$6In?{Y&$eXK-bE}K9^&(Xo}Jh^QfN{s3}~`rS%(BU zG1RiXAa#+|qyp7yourc=53ANzwen8PvQK80gYR9~$fnhEVk!4T=1wdf-wF2xyR)X% zbz+(7hB~nv`Q4utb6Ej)M>srKyu`#q8HV6H*~qO6zoLhI49S)WZy(@CJofP`u19?L z@$c2o9mWrgN?<$lA=)8QBj==00J8cu1|ic$O(V;vPXo&tKw`rIp=h{GePM`=jGMb6 zCW?71ONd;$EJldE=_7IRQr6$dt{t!=%WGTg$Tc&bKB`0LqnMr(YlwLHR4pWz7*@y=>4gvmR^m^(lkPk|X6dYirHiANM^E3&`#Dk=s`j? zA3Te#qiWTNm1%WAC=zpacv}hWXz$D{7{be zOEWM-Onfw3V@QaNSvo%|GVVbs8w|_oMPUX5%N{}vob`_AkmO`Ls{7oy#gU1Atl03N zL%uK|$8X4?x(^+RD2r#YGlrE3ixx-Enjg>pBz^uUdJbtMTR3NaeB{!VvuJzc6Gf}M z7{zjV%o28(&tso+GCsrO*oVrZ<#Ft+5+B1VmBq^wS-r9}CTaz{t1M%C42kStlt>j` zw2Y-14XnIBpT)M2kkM`ul`jX)Z^lK7=Eu)_uvxW68g!Qw+L$W!GyO7M8!*h7pEzsT z@`QxNOA}eT9Y$QEW`~tKD;>;Pb_SOAGG#rBy+Jnd(Qz?LS%n=_BH2I2_+`(tpY4pS zc7qs?S#;^y$kJBR_*Jxd-*1-px)w%ObdX*sK)G&iVaxSE3mTc)QFYsHg?aAWI2x;m zTTqO&7rE~cC6%lepE zU-z{{zvi_xnpu?^YgKBjrHNRp5V2O!7;C?@q+qLVNzrz-B@F`+ZnYxX>gdRk6*WfN zX8WemmTs>`+j{%OY`Z;;=6S+eL|eIxwxe{=c--D#W`!c$ikpVpS@Osc;Z`8REmefu zNn5zpQCeY>XuD~zM%!)sX3@636>W})HaeVb5^cZRQ-f`86~mn0Z`47XH==Ha%*fx^w|K%-ZLTe=!m zhj9DS;X${2OlcNynI?U}?KU-TYhw`R&^66u8GY}PgN(i^lZZa^-PR)fu9%FhS`EK+ zHT;sBh2I88eMws!X}^Q;dzDgUw)B62O~Y@s;|dvlpEy$Fi0DgJqpwhnK67T%@T+xv z5PttsR+{kp-H}F9gDCW>m?6^X;VSCjf2Ymjra^I#Zn4O%5;mFD;>7wtZ1ZCl!ociP6VvbKrL^gS7-mkPt|OV&VFrL(!7G}XI=CT)*e zgEz#!y<#~j%Fc+n%C=WO;Dn+4KHYPYvs-K=?Kuja8i(>JC*}~vK4?SZ^;DaA?3Xq) zUT?OEW0h@bq~2>QM(Qpnb)@cfS|)a8Z#yM2^Et|`D#u6z^a@E8g`&vD!-t*imd`<{ zIqhf){X$HkDZ9mI!M9{-P>&owZ%4CPX*-(DPLok?iAc^kAwIL;5!o%GxQb!d+o?wo zf45V+@wax1*=@2OmhqaJ+h^jl?wI&YJ1(4J*xvSu?Cthc-gVI~Who*po$fHC-BOWt zRClFw*H7EWu;XO)HCbi7B~q$3iO=$4JGpnSql6+VKxB8Py*PZZcA!lD5*e2KBR)%S zsq!}AR<>7cl4zL^Iy9emKIuU7&M|VYyeE37(2qRw-x31^^G;0%TUXuaAfwVuZO8s5 zm#R8+*X<6C-L=!1IYzSbc2R6odv({my*>5ZuJ-fTf%epMN7~1+Z`+HR=0^K?_Id}= zeeZNoyYFC!W$ddCiS!0=YT?_W>)v-}ts<8$ja)e^k;cUPwu#K#c;s-dWt1*#ery@b z{xQvG-#9LajEag}syUvz;uy!aw^_#CZHK}-~ ztferd3oJ2geWyg0)`>bujl&u>4j+VJ7Nwk2!>~{d!_*%{7TJwq_&KFtYZ`_{ozyTa z?bIv`zbE4wH4KZ?F!a>SCm(jAIIQdx!`60AWE(qEebg|_Lm2KSO|2S+nQ9njt6^9z z!mzSQ7*=&gqg)}6d|Md)(Ydi-lU+m@)^w!KOzt#~ZR*WvgLWtcGFo=fX7;VOZ{($j*~Vx*CR+ zDIzUP4a1aAWf<1F#;||Ms)4L>)iAuKhGCU04BzfTfrc{C}Y3`KZoTrB26>EGCWr(?L*t}VbBInJInl*QMd=%?AD{MR++0Rd8T_42gVEwU1m_9(C ziDlRA=Ck81n#JeOE#lagmI?D_&7B`Vm*V}N^D_3c3x?&}ZXWX2XN`krhLU3lHl=V= zDt8X9R7#XoW2NG6%CnAiSG))28%-s4recHmt2dacxhd0R$}^bKNZ_Un^^fFq^)JiL zn&GYt`5NwMvO0RWa4^TE)%NKHt8+XMuI0htege zil-|klPOCnqc8VDB`nQ8AlQ^;?-F7vP)yTJ4T`B)F$J5-4W@FVDZi~L*J#QyQbyu0 zr-iB1X#I-bo5+)`*F6;1foTR)s=-uCB`Kx~vRBc~RK`tJl#y*)3XG;}4yIf~oOPAE z;@Ty{&P0_c=JsL!A%213!6AO(A>sbP{vmR0W5umxLngY@ zuQ6gHoiG>6c6Z6MTdT+pfph2$?qWIPF4ObqM7mi1aA!>9XYZsU`;S=USE-)pppye0 zO}Uo`O`KYT5julOI*!)yN*!<2@ta_J^1gC)O%^ak(;NKc<2)4xD^ z8TdPJS}3Jc`Rp1L`9eX@;V&6z3Wch426zR`P zgTr9wB+19Y2`eR6fc;*Od=s1mcI+cJ$j06}4hE;0;V=b?T5uHDo-Tli<$16#{oEDH zMjdB?XCwVRuz#{@&ORp=Es_MTM!Gp|jWoCmMLO8YOKyRUJ;C;CrG0>or+`C{9;@S3 z;LsH5pCQ@IY>ERgFs_pZU+MS~I0Whc>bP}ZS>ZgScLNu0kooz7t5PM8QJMO`aFbMo zlR`96J$N}BOmz8BEL*@%;N4)iS7drF*bn>}I22r=;~Rp_RA43y?!&-7U1r$MTW*n! z-N8;s9|#TvkI``$I0@-9!NuU^#OnUP9*SfbI9p@|=zYg(SUPW$oCB@|7l4hg%JkFV z0Ptn7TZT;k7aRdXc?dWpQ}PpFzt<#3fva{(P9zpx=(S7o zMx;k%Nq!yd^19^1{iy#%1)O(FMF}#fdrR^KuxX#<+h9+yTYu>v03J*%Dv#@2!hVXzx)d|zhp88`x54xSCZ3QhvwBNiK&3~ocW4hT*= zD)TdYkV4eB6pDf1y3eo$;KI)(&q4-OC6X5*-R%p>E0G?4Msga`Gr(Ek#B*x8neB(7 zx?DPZf(&xMmt2bU{0hlGgWbNcX)%K;^SM82AeXEuVt3 zz^B0l;3{xA_)oCgf70J!Ao>{G16%+e49;x8{(k}#0e58vGr+$0BrhQrO)9S$(uGp6 zymm;x6TtEsB4hi&^4cL|N5JwLBHeTWrb~%p`x(0cg}jDHKP15NS|Z)-0;X$mZgPU>CaQK`dj5)eUfzJO!NPDCS>UBB7|GdkMs{0^9)J3^vj|24cwu zo4_A{ox$IL-M|-##UKm?UkBHi#k~o%+=0S0Q*zruvc_5SCHDg7fJf>0S#TZF7l8XO zkp3@$6T#cSW}9Na&fq9G7Y^rid|Ag0I_@-BZh*~yh>pieHnSQO@Ei;R7RnmOfs?^z za49%L#|LzLOvmNm2KfJ`GL645diRZ3{)0g#xa|$ns= z9R*$lXMykNxC7mGCd#v=4;V`GpH?wJXAlLZSCFV(ME9(z_Tk{|;56_-a0&RFj{nrL z%P{JHQ30ESKiv?gc9ZBkTV71$L_ciN~9 z1Htx7BtH($20sg~2FHWlmP-3|-~_Na3yNGQ4%;#Se+l+oCNuaEyb62`TnN4oHYQ5@ zZvJwELct@!8IsNHIVdV&@I2Uaxy&F990A@7P6N{wV70|;d`iccbbK3Jr213;cONb@ zFs+aUKCa_99dFn1r#il(V}}tk|Nh9omzKr;Z2Rc5b<10G8 z4=yKvQ9kQ4Qr6Jzd9(mH3_J^*34Q^54ZH>HpCtXW!71P);3Dv8u+vKH|F1w1vQlQy zV9Nm9K0sEm0xZssi6{wtLE4W3CxXMlx!?uhN^mmR=|$}SGoT25QD&G2P6C&J^T0oX z>%jG3-&NAz@iAG!B(SHBN88v8gK#MFzzcQ!l8#@~@rOD-qvKz}b;$oN*lbg{j*>OD zu@Bh)CAmf8bUa7LW*zU+v3jQuWfh0~zL4o=Rt&{?IM}}|3%m)Q4mOUK70dy5)$uSL zhk`3$KL_lGE>BX~Oj9isTVYTF&Hu9p6$K*`g= zJp_xgGN2dtOP$*+$4GX|M zz;xFo6Uzv&7u}~PmMP%r-~@0wcr&;JyboLtJ~jsX|NiT^n&Hndhz8#VXMsD?DOnNs z<=~Mzo~Gjz9q-d|Nszf|hL>RAwq90<(>Y&JAl+xGRz{X9|-Ul2C9;f5kO_=(BMH2bS!=xdEy@mCt%<6~z8J4%cxkxEKW{gV|=;0-0cca6UKzd``on ze0Ei%5ZrdWtf9@JkB*xE6dG?3E_B@Ukrfa6LF5 z+%`mRfQ@^DYmq)&uz@Z}ZpU0d0}AKuvVhg#kR6iufJ4DY!C~Ob;Bc_v30Xh{_!01Q z@F?(XGZb^6hz4%}$Aa^~ao}^{1h6te7MKX`2TlUd0Ive4g3ZZLdQa$W|j@bX&B^yZ-aBe-9u#s^1uP$eDG9o0XPX<2;KoM z0vD)E?5%Rp zwVEgk3<388&jvpOjt0L3js?FCjsqVBCxEXIn?)ETLeX-PEHDY&7rY8Q4x9{L1Wo~O z2d9ER0jGhh!Rg?RVPgMJ707@hFich;6PyUn0`CQ9gHM2Sz&F9UVArQ*etF>G;C%3N zPgDPk3KT%G5(b6f*T6;KkHE#?AHgNyJK$1q=gBhvli;D?GVpU|D9WKo0#|^o;7afz za22>5Tn(-V*MPhIPgdX>H~?G=HZOpp4vNj-dT)mf+vH+1dIJ&0ue#)0{9ehcYBeOB0ktf zFx|wj@;_iFaGMBe??O*zPz@e|!W{;~z+T`murGKv*blrM><``y4gl{32ZBEVhtNN0 zsuef~MJNn@1BZcc5w~eY|H%n%^_=7gu*jt?HI`?PnjLcmCmoYK#Fjoxwx}=@_P%B) zXkVi$aym(enc#*_(qXBM10=5nUwcM!hKruPPmlhk4vY)c<1d6Z=O4-zOQz#!B~ z8i)-O83wya7H81~=XaMZe&h-c>?&EzPl6+QNX`Xkct}19E`j||D%1Fj7M(-OZ!kDH zSn}WChCY%-SBnC2u|+0u2`bnhZ0sQIhl4|$C65PB?yle=w!R6rj z;6Oyt%V2*DQo5B|%|8cGWTuB4s|r7a#d&Zj21y+_)k9X09t*A77s7rxI06-%2rfnx zMS*J(MJvHsGK$P>D-?yO;Sq3sds*NqZ~(%Ho`tSfAPiyjAGiuF=1zM~F{nLzOaEbD zdqmM>aE2O1)c^FTeAOWxVYCHYH(Cz5cfb`0qc6aoXrasCR7BA|aGWiQNG~cB4)zD9 z2&VGcb5O9+vc`+S)d-^vU?+spTi|4b(O2MnL{Syk1yS@Lm?4VVkzQ1&kfKPG&-y@- z`IOw^QQ+C_B~J$D`$=8^cIqX0E7;3d@>^gRG3nD%1dbje`5bt9E1duT9SWyMq=Csn z)-cdZa({4McgdmP3~$M?;8p!3Zv4Akr6666 zaLO>r72vQS$#=m{$giEFx&daEG*cS%k_whJS@H;QI0~Eyo;_BkuK*XJ!f9Y9+)+U< zB2-6t$p~qG1Y9~&@+p;R{0BcF6@S8@EKG8XHZp_hm4L@hb3+*Ihk+l$=p(Qv!ssh-0>bD!aBM4C;mcq*L{S4c6j9Wnt=ynO zM3FbKI{vZ|MvuWjK9YdW?}M))j1s{$2qSvgq1wbn17ro#!Tk|MyTNXVqGE6@qUhVU z*#BoDjDCTEJHqHDxEf((M|(A4T8S{~0``UfKyWmoXaqP9Q4|C&LsW!0QU42Hr%7@P zro*5ZVH6AYgF_j{G%6`LK1nesmDmpVk4i`p`PiIyPE) z#2Oc^gjtKD6*sHj9L3367p+8CBVrUc$Ct?FWm=PIU2VNPSLtl6n4_5NHWQ~=Uyo51 z4}F)!{j}!MdVp5(-@f^@9-@_=%B>!E($l-y2ef`j>k(Q%vW}grjI^fARs45EE503@ zRf}wVk5JVH@^-69rl(l2wX~+ty3YFD9HoynFGh**c$+wv)^}(XWxq#jlk%;-<|<}u zU6c}REtsP?cUw;e`)Jix`YiD|TFZ|Nnx_Q0TkmgDypL3FP@d-2xQ$9jYu`=uLDE_4 zQ6Y`aqz`ZLF>15YNnj`IJ0f8eeH=NrNwIHhUB6QqZvE*s#lc#+Qwik$R)<~6SgUoH z($>0kml9>Y|C+KvquI zVnzJkVllMRZ*O(!&y-^3t}v689wXAr%r}%Gfyw^}^NC&=H-8S}B_BUk=i>Nb=!LQO zN>(Smb>`J6|7~};{Dw#S1-rx7eHC-)kKa;)-S)a}a@`)d=Sion9jpFKbLbttsbS^7 z#nXDsd2QW4Qw$6CjKBWO`SUl{WX&C3(qW zK3@O+d^GbXmyAf zomU4H-16T4`PDW5vtOH;d1$Wr%D_*C?>_ZW?^2hP9yO+67r0}O+OlbHKK{S4$3v%P zzI*3%*Z-bgvAiKZJmbK|lV@(Vn?3gD3HxqVzZEr)4WIe*%Mp&NXB{6E_S5MLbCAMv<7Am_uCo{yco{Cn-!*Dt3} zG#Ce)6NgsZzwvdiAy=*k-*|HCZ`B*Tp1OB-toP7XIcJ|s>hR%O{}(Tx`sBlw|Fd4& z9bh-;MApuT;Tw+T_gk~$7yDlynN!(4amkG*IzO8o;nPs4T>LzG+L0xlzdsT5`&S2! z`22b2x4G%9o_T*%x6rMRObEYTkyHI-@X9;yFUwZU^{G3e`xhkKG-s9_4m=)kFvIox zVO>7^v-Sh$p0Nw!&W-5$$?~|LuE+Peo_C;^Ph8ICh~tZk|9EjmbzK)1-&c12P&ILQ z<@h_}6N(e}{M@cv)F+SmJpTIkdt(PbGU)DGbCQFe%>AwMeEJiUL&vUfRdVl`$C$QH z-b}8a5!bPI$JK8Rw61?YV(Z;BYw=G(KIXfhZkqDX^4I$Ld7moJuHCSC&GxM?RIKe; z=9rvyGxYGj>vxTIKgGpNY!fx@vF+a+9r~zu9e=ERM){?;|DM?E>iOB;>5Ep~?Xv8< zk@vU%kv8w@8&{k+P0GK%=7)lU{pY@0`DnMDYkpXM>}tMK^lJ0M3oj@C`785&-1_yL z$5wfNy^lNeK0kWv>TNXxYBwJ%?e^;Z!#wXJlhJ-l*xcxyGhS^l6kJH{vF4@aUq*kN z)P33ynT|t`7fn6!AwT}@x!6fVHhlH2Yx)7}?Gh!~JTBHZyRYF`mgnVR!!vGPp13>o zv-!&o9;kmL${d;3p zNBq4uwcO|I;BJT8ykd4edq4ZxtEYbKd-@w=dh9b5?;WZsu{XzidVMuM{O11Ccc%O~ z?#$5amgm+Lj-R})=D%a+w_j20*G?O>J@4G<-Mwn;KPf-qyz|!``z)XQGii3r^zsE! z&t6}&=90(E;NJ&&|By2~^A|(S^`wJ2ZoettZ*yH$`gip5`bp7t`M$4weClG~{lh-H zw)xq}&F9MY9yzrC%7vIEM~e>R1T1hn^8Kc9f4%p5*x=9iT)H-@_fLCra|ce?;eD_5 z{ID}8-#K$};!nSJvs-Rx`_<-)kGN0!*Kg759a^_9+GaS@qvW#T?Ta6eYsg2#yOS|T{vXxmnkWDO diff --git a/packages/pgvector-embedded/prebuilt/darwin-x64/vector.dylib b/packages/pgvector-embedded/prebuilt/darwin-x64/vector.dylib old mode 100755 new mode 100644 diff --git a/packages/pgvector-embedded/prebuilt/linux-arm64/vector.so b/packages/pgvector-embedded/prebuilt/linux-arm64/vector.so old mode 100755 new mode 100644 index b4413fad5ebceb517385d5b4a063259cff894aa3..e3573176ea1c46497b0cffdfb0911ea59b9e7657 GIT binary patch delta 3853 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 delta 3787 zcmaJ?Yj6|S72dUENq*?cTEAo?99za1V=|ChU;`79a zozdRC=ezei-#Pc(qk9*c?p_Czv=kABNFUKP8>tM7Z+{Gz0eU6hhP`7y7L9Ue};orL4A(c}g#j$>z&kJ0&? z=aY|D^7298jJ-;cv;xtZ= zEY;%_?k?4v_^mNrv;MO)XuX?9Ec|p3@<}7kTJy_t?F!bAZv@%zB^7^&m$z!Q&==)$vf*)TE) z*YQg@hY|4ONX`EWxibHP!i-nwW`Uw7aGFI>sQPJ~rv45A^>PXv1EEmP*p4ca39Bu{ z%-@6^6~wGv>ci#Sbl7dd#O{ZSg~XCiRVP!`da7DaRqOZBuPBfrVoBPo1xFEiKaEn8 ze%!A|ehYaVQ~E#rjjv4NAGVN|X;b)rhMsg5d=Vs`Q%v6Bm&519WNreTDdla9nH~d^ zz3hNOJ2*p@{Rpl0x|59FhUf67mQB7~Co$^Atao&|)UK zcv@OU75*1y%KX2IOR_-B{xw0{ZcY_YC##}1vROd3bkH6 z-Vi*1?XzT0zn?|wo|MamX2eJf!$?cX5XEF07Equ6rqd$)Qh$s~)Ut#MtUyCQ7KiX2 zeyM2%8ai=FimZ~JrC}82m66i4R)mtSBBZ+m17)NohnB2<5L0W|NrRzvX~4Stdl@ND zqt$1i)n~j8#@VEF2CX%tTw%1LqUN-`f^9jzqQ-!0#)ZCtEmfd-LH8;XuL6g_PygdRHzkJv~BHibPl zVtRCQl=vPdOOLg8$wqeN(Ck_f|CUo3O%@#_*+`(%EBZQ$=x!_Bnj%U&#U*!pq_t^_cRu8;hjT76 zYnn_X|2xS46EYF|pNJW2$nb|{-xEWTfIr|3h`}Flm65Jq`m=U)F78?sU9;$krpn%q z0m&Qb3B|rO8ZN7hQYh5jW9{UE;k99}=ct8zn95UqiT)P=*EU{6P&J1m7F zv1jrOEBV;Fo(c5DkaCmEm476qbfI7F8}OHbKVvLt7FvBORYV16)(d6X z9GAzn8S&T?o^iOpUdR~Yc- zX17hTdth)-$j$4IySc{PFxEHW5W@Do3?BPjfo;s=TWF^$p1OrMC*k=k6j9cX7<^$I z8%@IV06s-n%*DWIY>}{nU1Ce>&`x7m&9ufNT!wb)?Idjn36GcYjP)tT^9USr{xC90_qVovC^nk|xsd)W{Nq-FvA#6W{Fwfne z82f@{lrjHNwhP>LW}n6E=b;F<2@NVT9R>OiDSlPAP|K=-Y%U zRv}DdIMh2ivE8zra9`>s$2JHTa2x+B?4i5&%H;Pa>L(`0aFjW%ol+GSfZr_SuKEXq z3#Vv$fOeX(8)Zstr&$acd5YaPL$M!anp|k7;x7-yMZ&7hLP6eQwqAW%A&8fB8|*;$ zb!!+r7F6JRW#E3!=x+8+zHo<`{i7sx?966iw>!hr9|-!aUaQ;hlRS2B4cr?Mva-0q zfWJQy2!<(A?eW{~QZ>AELa52?4oBkv8moK`zYhj~P4YoCBy`l_wm6|n^wmf{x1Z}2 zgMPX5S)E>Qt<51iD7(@xDZSg{lssN11crom0TJx8-DtP_>^{-$5#i56!ZxEP5K%aM zwbiu_o744bEt%ffiE0K!Z-0LmZa`*Fl~eR{3C-5(_ef5=X!mjL?Y?kNd#Bj#3rd{Q z;&G2x@=LZ_j~o7WQdj^l4GCJ9KP=ScD#XEnPmD;`V5FzLHxwAK+Ti%GU@k+APj^XT zH%*Sm=WOfYvyFha`+@}C$HatxFjH%e}wt;$nX1MiOr zKdGZe7B>p6^17-WsCZ%X%J%t-+83;7SUSIb(YzHjZx6$Dc>Fe(=(mCAlu!(>pAyz( zVv^z#ydIm!Bh^+x?x^si5`R#PpwH@>nkrGWJ2~p^;Q>^M-dcy-Z;L%UD)d?Y3(d$U AegFUf diff --git a/packages/pgvector-embedded/prebuilt/linux-x64/vector.so b/packages/pgvector-embedded/prebuilt/linux-x64/vector.so old mode 100755 new mode 100644 index 9e846540ed06eec7a152b86393653aabfe70c709..5560f41029daf675ecdd91cc106667deb1a1d117 GIT binary patch delta 7077 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 F`X6*U^TPlD delta 7058 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 QJi2Q@9vwS2ATJ*CKaA(?NdN!<