From 80670b2b3fb025416d0123e237435518ba744dfe Mon Sep 17 00:00:00 2001 From: Prateek Shourya Date: Thu, 13 Nov 2025 18:32:15 +0530 Subject: [PATCH] [WEB-5128] refactor: remove local database dependencies and unused code (#8109) --- apps/web/.eslintignore | 1 - .../components/issues/peek-overview/view.tsx | 8 +- apps/web/core/constants/fetch-keys.ts | 2 - .../layouts/auth-layout/project-wrapper.tsx | 19 +- .../layouts/auth-layout/workspace-wrapper.tsx | 20 +- apps/web/core/local-db/storage.sqlite.ts | 492 ------- apps/web/core/local-db/utils/constants.ts | 23 - apps/web/core/local-db/utils/data.utils.ts | 30 - apps/web/core/local-db/utils/indexes.ts | 67 - apps/web/core/local-db/utils/load-issues.ts | 133 -- .../web/core/local-db/utils/load-workspace.ts | 303 ---- .../core/local-db/utils/query-constructor.ts | 169 --- .../web/core/local-db/utils/query-executor.ts | 11 - .../core/local-db/utils/query-sanitizer.ts.ts | 38 - apps/web/core/local-db/utils/query.utils.ts | 357 ----- apps/web/core/local-db/utils/schemas.ts | 136 -- apps/web/core/local-db/utils/tables.ts | 41 - apps/web/core/local-db/utils/utils.ts | 206 --- apps/web/core/local-db/worker/db.ts | 136 -- .../worker/wa-sqlite/src/FacadeVFS.js | 508 ------- .../worker/wa-sqlite/src/OPFSCoopSyncVFS.js | 592 -------- .../core/local-db/worker/wa-sqlite/src/VFS.js | 222 --- .../worker/wa-sqlite/src/sqlite-api.js | 899 ------------ .../worker/wa-sqlite/src/sqlite-constants.js | 275 ---- .../worker/wa-sqlite/src/types/globals.d.ts | 62 - .../worker/wa-sqlite/src/types/index.d.ts | 1294 ----------------- .../worker/wa-sqlite/src/wa-sqlite.mjs | 16 - .../worker/wa-sqlite/src/wa-sqlite.wasm | Bin 594230 -> 0 bytes apps/web/core/services/issue/issue.service.ts | 54 +- apps/web/core/store/cycle.store.ts | 2 - .../web/core/store/inbox/inbox-issue.store.ts | 3 - .../core/store/issue/cycle/filter.store.ts | 2 +- .../web/core/store/issue/cycle/issue.store.ts | 5 +- .../store/issue/helpers/base-issues.store.ts | 45 +- .../store/issue/issue-details/issue.store.ts | 27 +- .../issue/issue-details/sub_issues.store.ts | 14 - apps/web/core/store/issue/issue.store.ts | 10 +- .../core/store/issue/module/filter.store.ts | 2 +- .../core/store/issue/module/issue.store.ts | 3 +- .../store/issue/project-views/filter.store.ts | 2 +- .../store/issue/project-views/issue.store.ts | 3 +- .../core/store/issue/project/filter.store.ts | 2 +- .../core/store/issue/project/issue.store.ts | 3 +- .../issue/workspace-draft/issue.store.ts | 5 - apps/web/core/store/label.store.ts | 2 - apps/web/core/store/module.store.ts | 2 - apps/web/core/store/state.store.ts | 2 - apps/web/core/store/user/index.ts | 10 - apps/web/core/store/user/settings.store.ts | 3 - packages/utils/src/work-item/base.ts | 17 +- 50 files changed, 36 insertions(+), 6242 deletions(-) delete mode 100644 apps/web/core/local-db/storage.sqlite.ts delete mode 100644 apps/web/core/local-db/utils/constants.ts delete mode 100644 apps/web/core/local-db/utils/data.utils.ts delete mode 100644 apps/web/core/local-db/utils/indexes.ts delete mode 100644 apps/web/core/local-db/utils/load-issues.ts delete mode 100644 apps/web/core/local-db/utils/load-workspace.ts delete mode 100644 apps/web/core/local-db/utils/query-constructor.ts delete mode 100644 apps/web/core/local-db/utils/query-executor.ts delete mode 100644 apps/web/core/local-db/utils/query-sanitizer.ts.ts delete mode 100644 apps/web/core/local-db/utils/query.utils.ts delete mode 100644 apps/web/core/local-db/utils/schemas.ts delete mode 100644 apps/web/core/local-db/utils/tables.ts delete mode 100644 apps/web/core/local-db/utils/utils.ts delete mode 100644 apps/web/core/local-db/worker/db.ts delete mode 100644 apps/web/core/local-db/worker/wa-sqlite/src/FacadeVFS.js delete mode 100644 apps/web/core/local-db/worker/wa-sqlite/src/OPFSCoopSyncVFS.js delete mode 100644 apps/web/core/local-db/worker/wa-sqlite/src/VFS.js delete mode 100644 apps/web/core/local-db/worker/wa-sqlite/src/sqlite-api.js delete mode 100644 apps/web/core/local-db/worker/wa-sqlite/src/sqlite-constants.js delete mode 100644 apps/web/core/local-db/worker/wa-sqlite/src/types/globals.d.ts delete mode 100644 apps/web/core/local-db/worker/wa-sqlite/src/types/index.d.ts delete mode 100644 apps/web/core/local-db/worker/wa-sqlite/src/wa-sqlite.mjs delete mode 100755 apps/web/core/local-db/worker/wa-sqlite/src/wa-sqlite.wasm diff --git a/apps/web/.eslintignore b/apps/web/.eslintignore index 99b52a07f6..321e1ec56f 100644 --- a/apps/web/.eslintignore +++ b/apps/web/.eslintignore @@ -4,7 +4,6 @@ build/* out/* public/* -core/local-db/worker/wa-sqlite/src/* dist/* node_modules/* .turbo/* diff --git a/apps/web/core/components/issues/peek-overview/view.tsx b/apps/web/core/components/issues/peek-overview/view.tsx index fa4f514312..d9febc7a14 100644 --- a/apps/web/core/components/issues/peek-overview/view.tsx +++ b/apps/web/core/components/issues/peek-overview/view.tsx @@ -62,7 +62,7 @@ export const IssueView: FC = observer((props) => { const { setPeekIssue, isAnyModalOpen, - issue: { getIssueById, getIsLocalDBIssueDescription }, + issue: { getIssueById }, } = useIssueDetail(); const { isAnyModalOpen: isAnyEpicModalOpen } = useIssueDetail(EIssueServiceType.EPICS); const issue = getIssueById(issueId); @@ -72,8 +72,6 @@ export const IssueView: FC = observer((props) => { if (embedIssue && embedRemoveCurrentNotification) embedRemoveCurrentNotification(); }; - const isLocalDBIssueDescription = getIsLocalDBIssueDescription(issueId); - const toggleDeleteIssueModal = (value: boolean) => setIsDeleteIssueModalOpen(value); const toggleArchiveIssueModal = (value: boolean) => setIsArchiveIssueModalOpen(value); const toggleDuplicateIssueModal = (value: boolean) => setIsDuplicateIssueModalOpen(value); @@ -177,7 +175,7 @@ export const IssueView: FC = observer((props) => { projectId={projectId} issueId={issueId} issueOperations={issueOperations} - disabled={disabled || isLocalDBIssueDescription} + disabled={disabled} isArchived={is_archived} isSubmitting={isSubmitting} setIsSubmitting={(value) => setIsSubmitting(value)} @@ -218,7 +216,7 @@ export const IssueView: FC = observer((props) => { projectId={projectId} issueId={issueId} issueOperations={issueOperations} - disabled={disabled || isLocalDBIssueDescription} + disabled={disabled} isArchived={is_archived} isSubmitting={isSubmitting} setIsSubmitting={(value) => setIsSubmitting(value)} diff --git a/apps/web/core/constants/fetch-keys.ts b/apps/web/core/constants/fetch-keys.ts index f29b58a1d5..61b718d922 100644 --- a/apps/web/core/constants/fetch-keys.ts +++ b/apps/web/core/constants/fetch-keys.ts @@ -77,8 +77,6 @@ export const WORKSPACE_STATES = (workspaceSlug: string) => `WORKSPACE_STATES_${w export const WORKSPACE_SIDEBAR_PREFERENCES = (workspaceSlug: string) => `WORKSPACE_SIDEBAR_PREFERENCES_${workspaceSlug.toUpperCase()}`; -export const WORKSPACE_DB = (workspaceSlug: string) => `WORKSPACE_DB_${workspaceSlug.toUpperCase()}`; - export const PROJECT_GITHUB_REPOSITORY = (projectId: string) => `PROJECT_GITHUB_REPOSITORY_${projectId.toUpperCase()}`; // cycles diff --git a/apps/web/core/layouts/auth-layout/project-wrapper.tsx b/apps/web/core/layouts/auth-layout/project-wrapper.tsx index e0a25c961f..ce166a6a59 100644 --- a/apps/web/core/layouts/auth-layout/project-wrapper.tsx +++ b/apps/web/core/layouts/auth-layout/project-wrapper.tsx @@ -36,9 +36,7 @@ import { useProjectState } from "@/hooks/store/use-project-state"; import { useProjectView } from "@/hooks/store/use-project-view"; import { useUserPermissions } from "@/hooks/store/user"; import { useTimeLineChart } from "@/hooks/use-timeline-chart"; -// local -import { persistence } from "@/local-db/storage.sqlite"; -// plane web constants + interface IProjectAuthWrapper { workspaceSlug: string; projectId?: string; @@ -86,21 +84,6 @@ export const ProjectAuthWrapper: FC = observer((props) => { // eslint-disable-next-line react-hooks/exhaustive-deps }, []); - useSWR( - workspaceSlug && projectId ? `PROJECT_SYNC_ISSUES_${workspaceSlug.toString()}_${projectId.toString()}` : null, - workspaceSlug && projectId - ? () => { - persistence.syncIssues(projectId.toString()); - } - : null, - { - revalidateIfStale: true, - revalidateOnFocus: true, - revalidateOnReconnect: true, - refreshInterval: 5 * 60 * 1000, - } - ); - // fetching project details useSWR( workspaceSlug && projectId ? PROJECT_DETAILS(workspaceSlug.toString(), projectId.toString()) : null, diff --git a/apps/web/core/layouts/auth-layout/workspace-wrapper.tsx b/apps/web/core/layouts/auth-layout/workspace-wrapper.tsx index 050aefdd8c..924c997560 100644 --- a/apps/web/core/layouts/auth-layout/workspace-wrapper.tsx +++ b/apps/web/core/layouts/auth-layout/workspace-wrapper.tsx @@ -6,7 +6,6 @@ import Image from "next/image"; import Link from "next/link"; import { useParams } from "next/navigation"; import useSWR from "swr"; -import useSWRImmutable from "swr/immutable"; // ui import { LogOut } from "lucide-react"; import { EUserPermissions, EUserPermissionsLevel } from "@plane/constants"; @@ -29,7 +28,6 @@ import { WORKSPACE_FAVORITE, WORKSPACE_STATES, WORKSPACE_SIDEBAR_PREFERENCES, - WORKSPACE_DB, } from "@/constants/fetch-keys"; import { useFavorite } from "@/hooks/store/use-favorite"; import { useMember } from "@/hooks/store/use-member"; @@ -38,8 +36,6 @@ import { useProjectState } from "@/hooks/store/use-project-state"; import { useWorkspace } from "@/hooks/store/use-workspace"; import { useUser, useUserPermissions } from "@/hooks/store/user"; import { usePlatformOS } from "@/hooks/use-platform-os"; -// local -import { persistence } from "@/local-db/storage.sqlite"; interface IWorkspaceAuthWrapper { children: ReactNode; @@ -120,20 +116,6 @@ export const WorkspaceAuthWrapper: FC = observer((props) { revalidateIfStale: false, revalidateOnFocus: false } ); - // initialize the local database - const { isLoading: isDBInitializing } = useSWRImmutable( - workspaceSlug ? WORKSPACE_DB(workspaceSlug.toString()) : null, - workspaceSlug - ? async () => { - // persistence.reset(); - await persistence.initialize(workspaceSlug.toString()); - // Load common data - persistence.syncWorkspace(); - return true; - } - : null - ); - const handleSignOut = async () => { await signOut().catch(() => setToast({ @@ -145,7 +127,7 @@ export const WorkspaceAuthWrapper: FC = observer((props) }; // if list of workspaces are not there then we have to render the spinner - if (isParentLoading || allWorkspaces === undefined || loader || isDBInitializing) { + if (isParentLoading || allWorkspaces === undefined || loader) { return (
diff --git a/apps/web/core/local-db/storage.sqlite.ts b/apps/web/core/local-db/storage.sqlite.ts deleted file mode 100644 index 3e926bdbeb..0000000000 --- a/apps/web/core/local-db/storage.sqlite.ts +++ /dev/null @@ -1,492 +0,0 @@ -import * as Comlink from "comlink"; -import { set } from "lodash-es"; -// plane -import { EIssueGroupBYServerToProperty } from "@plane/constants"; -import type { TIssue, TIssueParams } from "@plane/types"; -// lib -import { rootStore } from "@/lib/store-context"; -// services -import { IssueService } from "@/services/issue/issue.service"; -// -import { ARRAY_FIELDS, BOOLEAN_FIELDS } from "./utils/constants"; -import { getSubIssuesWithDistribution } from "./utils/data.utils"; -import createIndexes from "./utils/indexes"; -import { addIssuesBulk, syncDeletesToLocal } from "./utils/load-issues"; -import { loadWorkSpaceData } from "./utils/load-workspace"; -import { issueFilterCountQueryConstructor, issueFilterQueryConstructor } from "./utils/query-constructor"; -import { runQuery } from "./utils/query-executor"; -import { sanitizeWorkItemQueries } from "./utils/query-sanitizer.ts"; -import { createTables } from "./utils/tables"; -import { clearOPFS, getGroupedIssueResults, getSubGroupedIssueResults, log, logError } from "./utils/utils"; - -const DB_VERSION = 1.3; -const PAGE_SIZE = 500; -const BATCH_SIZE = 50; - -type TProjectStatus = { - issues: { status: undefined | "loading" | "ready" | "error" | "syncing"; sync: Promise | undefined }; -}; - -type TDBStatus = "initializing" | "ready" | "error" | undefined; -export class Storage { - db: any; - status: TDBStatus = undefined; - dbName = "plane"; - projectStatus: Record = {}; - workspaceSlug: string = ""; - - constructor() { - this.db = null; - - if (typeof window !== "undefined") { - window.addEventListener("beforeunload", this.closeDBConnection); - } - } - - closeDBConnection = async () => { - if (this.db) { - await this.db.close(); - } - }; - - reset = () => { - if (this.db) { - this.db.close(); - } - this.db = null; - this.status = undefined; - this.projectStatus = {}; - this.workspaceSlug = ""; - }; - - clearStorage = async (force = false) => { - try { - await this.db?.close(); - await clearOPFS(force); - this.reset(); - } catch (e) { - console.error("Error clearing sqlite sync storage", e); - } - }; - - private initializeWorker = async (workspaceSlug: string) => { - const { DBClass } = await import("./worker/db"); - const worker = new Worker(new URL("./worker/db.ts", import.meta.url)); - const MyWorker = Comlink.wrap(worker); - - // Add cleanup on window unload - window.addEventListener("unload", () => worker.terminate()); - - this.workspaceSlug = workspaceSlug; - this.dbName = workspaceSlug; - const instance = await new MyWorker(); - await instance.init(workspaceSlug); - - this.db = { - exec: instance.exec, - close: instance.close, - }; - }; - - initialize = async (workspaceSlug: string): Promise => { - if (!rootStore.user.localDBEnabled) return false; // return if the window gets hidden - - if (workspaceSlug !== this.workspaceSlug) { - this.reset(); - } - - try { - await this._initialize(workspaceSlug); - return true; - } catch (err) { - logError(err); - this.status = "error"; - return false; - } - }; - - _initialize = async (workspaceSlug: string): Promise => { - if (this.status === "initializing") { - console.warn(`Initialization already in progress for workspace ${workspaceSlug}`); - return false; - } - if (this.status === "ready") { - console.warn(`Already initialized for workspace ${workspaceSlug}`); - return true; - } - if (this.status === "error") { - console.warn(`Initialization failed for workspace ${workspaceSlug}`); - return false; - } - - try { - this.workspaceSlug = workspaceSlug; - this.dbName = workspaceSlug; - await this.initializeWorker(workspaceSlug); - - const dbVersion = await this.getOption("DB_VERSION"); - log("Stored db version", dbVersion); - log("Current db version", DB_VERSION); - // Check if the database version matches the current version - // If there's a mismatch, clear storage to avoid compatibility issues - if ( - dbVersion !== undefined && - dbVersion !== "" && - !isNaN(Number(dbVersion)) && - Number(dbVersion) !== DB_VERSION - ) { - log("Database version mismatch detected - clearing storage to ensure compatibility"); - await this.clearStorage(); - await this.initializeWorker(workspaceSlug); - } else { - log("Database version matches current version - proceeding with data load"); - } - - this.status = "ready"; - // Your SQLite code here. - await createTables(); - - await this.setOption("DB_VERSION", DB_VERSION.toString()); - return true; - } catch (error) { - this.status = "error"; - this.db = null; - throw new Error(`Failed to initialize database worker: ${error}`); - } - }; - - syncWorkspace = async () => { - if (!rootStore.user.localDBEnabled) return; - const syncInProgress = await this.getIsWriteInProgress("sync_workspace"); - if (syncInProgress) { - log("Sync in progress, skipping"); - return; - } - try { - this.setOption("sync_workspace", new Date().toUTCString()); - await loadWorkSpaceData(this.workspaceSlug); - this.deleteOption("sync_workspace"); - } catch (e) { - logError(e); - this.deleteOption("sync_workspace"); - } - }; - - syncProject = async (projectId: string) => { - if ( - // document.hidden || - !rootStore.user.localDBEnabled - ) - return false; // return if the window gets hidden - - // Load labels, members, states, modules, cycles - await this.syncIssues(projectId); - - // // Sync rest of the projects - // const projects = await getProjectIds(); - - // // Exclude the one we just synced - // const projectsToSync = projects.filter((p: string) => p !== projectId); - // for (const project of projectsToSync) { - // await delay(8000); - // await this.syncIssues(project); - // } - // this.setOption("workspace_synced_at", new Date().toISOString()); - }; - - syncIssues = async (projectId: string) => { - if (!rootStore.user.localDBEnabled || !this.db) { - return false; - } - try { - const sync = this._syncIssues(projectId); - this.setSync(projectId, sync); - await sync; - } catch (e) { - logError(e); - this.setStatus(projectId, "error"); - } - }; - - _syncIssues = async (projectId: string) => { - log("### Sync started"); - let status = this.getStatus(projectId); - if (status === "loading" || status === "syncing") { - log(`Project ${projectId} is already loading or syncing`); - return; - } - const syncPromise = this.getSync(projectId); - - if (syncPromise) { - // Redundant check? - return; - } - - const queryParams: { cursor: string; updated_at__gt?: string; description: boolean } = { - cursor: `${PAGE_SIZE}:0:0`, - description: true, - }; - - const syncedAt = await this.getLastSyncTime(projectId); - const projectSync = await this.getOption(projectId); - - if (syncedAt) { - queryParams["updated_at__gt"] = syncedAt; - } - - this.setStatus(projectId, projectSync === "ready" ? "syncing" : "loading"); - status = this.getStatus(projectId); - - log(`### ${projectSync === "ready" ? "Syncing" : "Loading"} issues to local db for project ${projectId}`); - - const start = performance.now(); - const issueService = new IssueService(); - - const response = await issueService.getIssuesForSync(this.workspaceSlug, projectId, queryParams); - - await addIssuesBulk(response.results, BATCH_SIZE); - if (response.total_pages > 1) { - const promiseArray = []; - for (let i = 1; i < response.total_pages; i++) { - queryParams.cursor = `${PAGE_SIZE}:${i}:0`; - promiseArray.push(issueService.getIssuesForSync(this.workspaceSlug, projectId, queryParams)); - } - const pages = await Promise.all(promiseArray); - for (const page of pages) { - await addIssuesBulk(page.results, BATCH_SIZE); - } - } - - if (syncedAt) { - await syncDeletesToLocal(this.workspaceSlug, projectId, { updated_at__gt: syncedAt }); - } - log("### Time taken to add work items", performance.now() - start); - - if (status === "loading") { - await createIndexes(); - } - this.setOption(projectId, "ready"); - this.setStatus(projectId, "ready"); - this.setSync(projectId, undefined); - }; - - getIssueCount = async (projectId: string) => { - const count = await runQuery(`select count(*) as count from issues where project_id='${projectId}'`); - return count[0]["count"]; - }; - - getLastUpdatedIssue = async (projectId: string) => { - const lastUpdatedIssue = await runQuery( - `select id, name, updated_at , sequence_id from issues WHERE project_id='${projectId}' AND is_local_update IS NULL order by datetime(updated_at) desc limit 1 ` - ); - - if (lastUpdatedIssue.length) { - return lastUpdatedIssue[0]; - } - return; - }; - - getLastSyncTime = async (projectId: string) => { - const issue = await this.getLastUpdatedIssue(projectId); - if (!issue) { - return false; - } - return issue.updated_at; - }; - - getIssues = async ( - workspaceSlug: string, - projectId: string, - queries: Partial> | undefined, - config: any - ) => { - log("#### Queries", queries); - - const currentProjectStatus = this.getStatus(projectId); - if ( - !currentProjectStatus || - this.status !== "ready" || - currentProjectStatus === "loading" || - currentProjectStatus === "error" || - !rootStore.user.localDBEnabled - ) { - if (rootStore.user.localDBEnabled) { - log(`Project ${projectId} is loading, falling back to server`); - } - const issueService = new IssueService(); - - // Ignore projectStatus if projectId is not provided - if (projectId) { - return await issueService.getIssuesFromServer(workspaceSlug, projectId, queries, config); - } - if (this.status !== "ready" && !rootStore.user.localDBEnabled) { - return; - } - } - - const sanitizedQueries = sanitizeWorkItemQueries(workspaceSlug, projectId, queries); - const { cursor, group_by, sub_group_by } = sanitizedQueries || {}; - - const query = issueFilterQueryConstructor(this.workspaceSlug, projectId, sanitizedQueries); - log("#### Query", query); - const countQuery = issueFilterCountQueryConstructor(this.workspaceSlug, projectId, sanitizedQueries); - const start = performance.now(); - let issuesRaw: any[] = []; - let count: any[]; - try { - [issuesRaw, count] = await Promise.all([runQuery(query), runQuery(countQuery)]); - } catch (e) { - log("Unable to get work items from local db, falling back to server"); - logError(e); - const issueService = new IssueService(); - return await issueService.getIssuesFromServer(workspaceSlug, projectId, queries, config); - } - const end = performance.now(); - - const { total_count } = count[0]; - - const [pageSize, page, offset] = cursor && typeof cursor === "string" ? cursor.split(":") : []; - - const groupByProperty: string = - EIssueGroupBYServerToProperty[group_by as keyof typeof EIssueGroupBYServerToProperty]; - const subGroupByProperty = - EIssueGroupBYServerToProperty[sub_group_by as keyof typeof EIssueGroupBYServerToProperty]; - - const parsingStart = performance.now(); - let issueResults = issuesRaw.map((issue: any) => formatLocalIssue(issue)); - - log("#### Work item Results", issueResults.length); - - const parsingEnd = performance.now(); - - const grouping = performance.now(); - if (groupByProperty && page === "0") { - if (subGroupByProperty) { - issueResults = getSubGroupedIssueResults(issueResults); - } else { - issueResults = getGroupedIssueResults(issueResults); - } - } - const groupCount = group_by ? Object.keys(issueResults).length : undefined; - // const subGroupCount = sub_group_by ? Object.keys(issueResults[Object.keys(issueResults)[0]]).length : undefined; - const groupingEnd = performance.now(); - - const times = { - IssueQuery: end - start, - Parsing: parsingEnd - parsingStart, - Grouping: groupingEnd - grouping, - }; - if ((window as any).DEBUG) { - console.table(times); - } - const total_pages = Math.ceil(total_count / Number(pageSize)); - const next_page_results = total_pages > parseInt(page) + 1; - - const out = { - results: issueResults, - next_cursor: `${pageSize}:${parseInt(page) + 1}:${Number(offset) + Number(pageSize)}`, - prev_cursor: `${pageSize}:${parseInt(page) - 1}:${Number(offset) - Number(pageSize)}`, - total_results: total_count, - total_count, - next_page_results, - total_pages, - }; - return out; - }; - - getIssue = async (issueId: string) => { - try { - if (!rootStore.user.localDBEnabled || this.status !== "ready") return; - - const issues = await runQuery(`select * from issues where id='${issueId}'`); - if (Array.isArray(issues) && issues.length) { - return formatLocalIssue(issues[0]); - } - } catch (err) { - logError(err); - console.warn("unable to fetch issue from local db"); - } - - return; - }; - - getSubIssues = async (workspaceSlug: string, projectId: string, issueId: string) => { - const workspace_synced_at = await this.getOption("workspace_synced_at"); - if (!workspace_synced_at) { - const issueService = new IssueService(); - return await issueService.subIssues(workspaceSlug, projectId, issueId); - } - return await getSubIssuesWithDistribution(issueId); - }; - - getStatus = (projectId: string) => this.projectStatus[projectId]?.issues?.status || undefined; - setStatus = (projectId: string, status: "loading" | "ready" | "error" | "syncing" | undefined = undefined) => { - set(this.projectStatus, `${projectId}.issues.status`, status); - }; - - getSync = (projectId: string) => this.projectStatus[projectId]?.issues?.sync; - setSync = (projectId: string, sync: Promise | undefined) => { - set(this.projectStatus, `${projectId}.issues.sync`, sync); - }; - - getOption = async (key: string, fallback?: string | boolean | number) => { - try { - const options = await runQuery(`select * from options where key='${key}'`); - if (options.length) { - return options[0].value; - } - - return fallback; - } catch (e) { - return fallback; - } - }; - setOption = async (key: string, value: string) => { - await runQuery(`insert or replace into options (key, value) values ('${key}', '${value}')`); - }; - - deleteOption = async (key: string) => { - await runQuery(` DELETE FROM options where key='${key}'`); - }; - getOptions = async (keys: string[]) => { - const options = await runQuery(`select * from options where key in ('${keys.join("','")}')`); - return options.reduce((acc: any, option: any) => { - acc[option.key] = option.value; - return acc; - }, {}); - }; - - getIsWriteInProgress = async (op: string) => { - const writeStartTime = await this.getOption(op, false); - if (writeStartTime) { - // Check if it has been more than 5seconds - const current = new Date(); - const start = new Date(writeStartTime); - - if (current.getTime() - start.getTime() < 5000) { - return true; - } - return false; - } - return false; - }; -} - -export const persistence = new Storage(); - -/** - * format the issue fetched from local db into an issue - * @param issue - * @returns - */ -export const formatLocalIssue = (issue: any) => { - const currIssue = issue; - ARRAY_FIELDS.forEach((field: string) => { - currIssue[field] = currIssue[field] ? JSON.parse(currIssue[field]) : []; - }); - // Convert boolean fields to actual boolean values - BOOLEAN_FIELDS.forEach((field: string) => { - currIssue[field] = currIssue[field] === 1; - }); - return currIssue as TIssue & { group_id?: string; total_issues: number; sub_group_id?: string }; -}; diff --git a/apps/web/core/local-db/utils/constants.ts b/apps/web/core/local-db/utils/constants.ts deleted file mode 100644 index 11b60bda04..0000000000 --- a/apps/web/core/local-db/utils/constants.ts +++ /dev/null @@ -1,23 +0,0 @@ -export const ARRAY_FIELDS = ["label_ids", "assignee_ids", "module_ids"]; - -export const BOOLEAN_FIELDS = ["is_draft"]; - -export const GROUP_BY_MAP = { - state_id: "state_id", - priority: "priority", - cycle_id: "cycle_id", - created_by: "created_by", - // Array Props - issue_module__module_id: "module_ids", - labels__id: "label_ids", - assignees__id: "assignee_ids", - target_date: "target_date", -}; - -export const PRIORITY_MAP = { - low: 1, - medium: 2, - high: 3, - urgent: 4, - none: 0, -}; diff --git a/apps/web/core/local-db/utils/data.utils.ts b/apps/web/core/local-db/utils/data.utils.ts deleted file mode 100644 index 532bb630c2..0000000000 --- a/apps/web/core/local-db/utils/data.utils.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { runQuery } from "./query-executor"; - -export const getProjectIds = async () => { - const q = `select project_id from states where project_id is not null group by project_id`; - return await runQuery(q); -}; - -export const getSubIssues = async (issueId: string) => { - const q = `select * from issues where parent_id = '${issueId}'`; - return await runQuery(q); -}; - -export const getSubIssueDistribution = async (issueId: string) => { - const q = `select s.'group', group_concat(i.id) as issues from issues i left join states s on s.id = i.state_id where i.parent_id = '${issueId}' group by s.'group'`; - - const result = await runQuery(q); - if (!result.length) { - return {}; - } - return result.reduce((acc: Record, item: { group: string; issues: string }) => { - acc[item.group] = item.issues.split(","); - return acc; - }, {}); -}; - -export const getSubIssuesWithDistribution = async (issueId: string) => { - const promises = [getSubIssues(issueId), getSubIssueDistribution(issueId)]; - const [sub_issues, state_distribution] = await Promise.all(promises); - return { sub_issues, state_distribution }; -}; diff --git a/apps/web/core/local-db/utils/indexes.ts b/apps/web/core/local-db/utils/indexes.ts deleted file mode 100644 index 0b2e987ed3..0000000000 --- a/apps/web/core/local-db/utils/indexes.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { persistence } from "../storage.sqlite"; -import { log } from "./utils"; - -export const createIssueIndexes = async () => { - const columns = [ - "state_id", - "sort_order", - // "priority", - "priority_proxy", - "project_id", - "created_by", - "cycle_id", - "sequence_id", - ]; - - const promises: Promise[] = []; - - promises.push(persistence.db.exec({ sql: `CREATE UNIQUE INDEX issues_issue_id_idx ON issues (id)` })); - - columns.forEach((column) => { - promises.push( - persistence.db.exec({ sql: `CREATE INDEX issues_issue_${column}_idx ON issues (project_id, ${column})` }) - ); - }); - await Promise.all(promises); -}; - -export const createIssueMetaIndexes = async () => { - // Drop indexes - await persistence.db.exec({ sql: `CREATE INDEX issue_meta_all_idx ON issue_meta (issue_id,key,value)` }); -}; - -export const createWorkSpaceIndexes = async () => { - const promises: Promise[] = []; - // Labels - promises.push(persistence.db.exec({ sql: `CREATE INDEX labels_name_idx ON labels (id,name,project_id)` })); - // Modules - promises.push(persistence.db.exec({ sql: `CREATE INDEX modules_name_idx ON modules (id,name,project_id)` })); - // States - promises.push(persistence.db.exec({ sql: `CREATE INDEX states_name_idx ON states (id,name,project_id)` })); - // Cycles - promises.push(persistence.db.exec({ sql: `CREATE INDEX cycles_name_idx ON cycles (id,name,project_id)` })); - - // Members - promises.push(persistence.db.exec({ sql: `CREATE INDEX members_name_idx ON members (id,first_name)` })); - - // Estimate Points @todo - promises.push(persistence.db.exec({ sql: `CREATE INDEX estimate_points_name_idx ON estimate_points (id,value)` })); - // Options - promises.push(persistence.db.exec({ sql: `CREATE INDEX options_key_idx ON options (key)` })); - - await Promise.all(promises); -}; - -const createIndexes = async () => { - log("### Creating indexes"); - const start = performance.now(); - const promises = [createIssueIndexes(), createIssueMetaIndexes(), createWorkSpaceIndexes()]; - try { - await Promise.all(promises); - } catch (e) { - console.log((e as Error).message); - } - log("### Indexes created in", `${performance.now() - start}ms`); -}; - -export default createIndexes; diff --git a/apps/web/core/local-db/utils/load-issues.ts b/apps/web/core/local-db/utils/load-issues.ts deleted file mode 100644 index a0c20fc0cc..0000000000 --- a/apps/web/core/local-db/utils/load-issues.ts +++ /dev/null @@ -1,133 +0,0 @@ -import type { TIssue } from "@plane/types"; -import { rootStore } from "@/lib/store-context"; -import { IssueService } from "@/services/issue"; -import { persistence } from "../storage.sqlite"; -import { ARRAY_FIELDS, PRIORITY_MAP } from "./constants"; -import { issueSchema } from "./schemas"; -import { log } from "./utils"; - -export const PROJECT_OFFLINE_STATUS: Record = {}; - -export const addIssue = async (issue: any) => { - if (document.hidden || !rootStore.user.localDBEnabled || !persistence.db) return; - await persistence.db.exec("BEGIN;"); - await stageIssueInserts(issue); - await persistence.db.exec("COMMIT;"); -}; - -export const addIssuesBulk = async (issues: any, batchSize = 50) => { - if (!rootStore.user.localDBEnabled || !persistence.db) return; - if (!issues.length) return; - const insertStart = performance.now(); - await persistence.db.exec("BEGIN;"); - - for (let i = 0; i < issues.length; i += batchSize) { - const batch = issues.slice(i, i + batchSize); - - const promises = []; - for (let j = 0; j < batch.length; j++) { - const issue = batch[j]; - if (!issue.type_id) { - issue.type_id = ""; - } - promises.push(stageIssueInserts(issue)); - } - await Promise.all(promises); - } - await persistence.db.exec("COMMIT;"); - - const insertEnd = performance.now(); - log("Inserted issues in ", `${insertEnd - insertStart}ms`, batchSize, issues.length); -}; -export const deleteIssueFromLocal = async (issue_id: any) => { - if (!rootStore.user.localDBEnabled || !persistence.db) return; - - const deleteQuery = `DELETE from issues where id='${issue_id}'`; - const deleteMetaQuery = `delete from issue_meta where issue_id='${issue_id}'`; - - await persistence.db.exec("BEGIN;"); - - await persistence.db.exec(deleteQuery); - await persistence.db.exec(deleteMetaQuery); - await persistence.db.exec("COMMIT;"); -}; -// @todo: Update deletes the issue description from local. Implement a separate update. -export const updateIssue = async (issue: TIssue & { is_local_update: number }) => { - if (document.hidden || !rootStore.user.localDBEnabled || !persistence.db) return; - - const issue_id = issue.id; - // delete the issue and its meta data - await deleteIssueFromLocal(issue_id); - await addIssue(issue); -}; - -export const syncDeletesToLocal = async (workspaceId: string, projectId: string, queries: any) => { - if (!rootStore.user.localDBEnabled || !persistence.db) return; - - const issueService = new IssueService(); - const response = await issueService.getDeletedIssues(workspaceId, projectId, queries); - if (Array.isArray(response)) { - response.map(async (issue) => deleteIssueFromLocal(issue)); - } -}; - -const stageIssueInserts = async (issue: any) => { - const issue_id = issue.id; - issue.priority_proxy = PRIORITY_MAP[issue.priority as keyof typeof PRIORITY_MAP]; - - const keys = Object.keys(issueSchema); - const sanitizedIssue = keys.reduce((acc: any, key) => { - if (issue[key] || issue[key] === 0) { - acc[key] = issue[key]; - } - return acc; - }, {}); - - const columns = "'" + Object.keys(sanitizedIssue).join("','") + "'"; - - const values = Object.values(sanitizedIssue) - .map((value) => { - if (value === null) { - return ""; - } - if (typeof value === "object") { - return `'${JSON.stringify(value).replace(/'/g, "''")}'`; - } - if (typeof value === "string") { - return `'${value.replace(/'/g, "''")}'`; - } - return value; - }) - .join(", "); - - const query = `INSERT OR REPLACE INTO issues (${columns}) VALUES (${values});`; - await persistence.db.exec(query); - - await persistence.db.exec({ - sql: `DELETE from issue_meta where issue_id='${issue_id}'`, - }); - - const metaPromises: Promise[] = []; - - ARRAY_FIELDS.forEach((field) => { - const values = issue[field]; - if (values && values.length) { - values.forEach((val: any) => { - const p = persistence.db.exec({ - sql: `INSERT OR REPLACE into issue_meta(issue_id,key,value) values (?,?,?) `, - bind: [issue_id, field, val], - }); - metaPromises.push(p); - }); - } else { - // Added for empty fields? - const p = persistence.db.exec({ - sql: `INSERT OR REPLACE into issue_meta(issue_id,key,value) values (?,?,?) `, - bind: [issue_id, field, ""], - }); - metaPromises.push(p); - } - }); - - await Promise.all(metaPromises); -}; diff --git a/apps/web/core/local-db/utils/load-workspace.ts b/apps/web/core/local-db/utils/load-workspace.ts deleted file mode 100644 index f388ea3b3e..0000000000 --- a/apps/web/core/local-db/utils/load-workspace.ts +++ /dev/null @@ -1,303 +0,0 @@ -import { difference } from "lodash-es"; -import type { IEstimate, IEstimatePoint, IWorkspaceMember, TIssue } from "@plane/types"; -import { EstimateService } from "@/plane-web/services/project/estimate.service"; -import { CycleService } from "@/services/cycle.service"; -import { IssueLabelService } from "@/services/issue/issue_label.service"; -import { ModuleService } from "@/services/module.service"; -import { ProjectStateService } from "@/services/project"; -import { WorkspaceService } from "@/services/workspace.service"; -import { persistence } from "../storage.sqlite"; -import { updateIssue } from "./load-issues"; -import type { Schema } from "./schemas"; -import { cycleSchema, estimatePointSchema, labelSchema, memberSchema, moduleSchema, stateSchema } from "./schemas"; -import { log } from "./utils"; - -const stageInserts = async (table: string, schema: Schema, data: any) => { - const keys = Object.keys(schema); - // Pick only the keys that are in the schema - const filteredData = keys.reduce((acc: any, key) => { - if (data[key] || data[key] === 0) { - acc[key] = data[key]; - } - return acc; - }, {}); - const columns = "'" + Object.keys(filteredData).join("','") + "'"; - // Add quotes to column names - - const values = Object.values(filteredData) - .map((value) => { - if (value === null) { - return ""; - } - if (typeof value === "object") { - return `'${JSON.stringify(value).replace(/'/g, "''")}'`; - } - if (typeof value === "string") { - return `'${value.replace(/'/g, "''")}'`; - } - return value; - }) - .join(", "); - const query = `INSERT OR REPLACE INTO ${table} (${columns}) VALUES (${values});`; - await persistence.db.exec(query); -}; - -const batchInserts = async (data: any[], table: string, schema: Schema, batchSize = 500) => { - for (let i = 0; i < data.length; i += batchSize) { - const batch = data.slice(i, i + batchSize); - for (let j = 0; j < batch.length; j++) { - const item = batch[j]; - await stageInserts(table, schema, item); - } - } -}; - -export const getLabels = async (workspaceSlug: string) => { - const issueLabelService = new IssueLabelService(); - const objects = await issueLabelService.getWorkspaceIssueLabels(workspaceSlug); - - return objects; -}; - -export const getModules = async (workspaceSlug: string) => { - const moduleService = new ModuleService(); - const objects = await moduleService.getWorkspaceModules(workspaceSlug); - return objects; -}; - -export const getCycles = async (workspaceSlug: string) => { - const cycleService = new CycleService(); - - const objects = await cycleService.getWorkspaceCycles(workspaceSlug); - return objects; -}; - -export const getStates = async (workspaceSlug: string) => { - const stateService = new ProjectStateService(); - const objects = await stateService.getWorkspaceStates(workspaceSlug); - return objects; -}; - -export const getEstimatePoints = async (workspaceSlug: string) => { - const estimateService = new EstimateService(); - const estimates = await estimateService.fetchWorkspaceEstimates(workspaceSlug); - let objects: IEstimatePoint[] = []; - (estimates || []).forEach((estimate: IEstimate) => { - if (estimate?.points) { - objects = objects.concat(estimate.points); - } - }); - return objects; -}; - -export const getMembers = async (workspaceSlug: string) => { - const workspaceService = new WorkspaceService(); - const members = await workspaceService.fetchWorkspaceMembers(workspaceSlug); - const objects = members.map((member: IWorkspaceMember) => member.member); - return objects; -}; - -const syncLabels = async (currentLabels: any) => { - const currentIdList = currentLabels.map((label: any) => label.id); - const existingLabels = await persistence.db.exec("SELECT id FROM labels;"); - - const existingIdList = existingLabels ? existingLabels.map((label: any) => label.id) : []; - - const deletedIds = difference(existingIdList, currentIdList); - - await syncIssuesWithDeletedLabels(deletedIds as string[]); -}; - -export const syncIssuesWithDeletedLabels = async (deletedLabelIds: string[]) => { - if (!deletedLabelIds.length) { - return; - } - - // Ideally we should use recursion to fetch all the issues, but 10000 issues is more than enough for now. - const issues = await persistence.getIssues("", "", { labels: deletedLabelIds.join(","), cursor: "10000:0:0" }, {}); - if (issues?.results && Array.isArray(issues.results)) { - const promises = issues.results.map(async (issue: TIssue) => { - const updatedIssue = { - ...issue, - label_ids: issue.label_ids.filter((id: string) => !deletedLabelIds.includes(id)), - is_local_update: 1, - }; - // We should await each update because it uses a transaction. But transaction are handled in the query executor. - updateIssue(updatedIssue); - }); - await Promise.all(promises); - } -}; - -const syncModules = async (currentModules: any) => { - const currentIdList = currentModules.map((module: any) => module.id); - const existingModules = await persistence.db.exec("SELECT id FROM modules;"); - const existingIdList = existingModules ? existingModules.map((module: any) => module.id) : []; - const deletedIds = difference(existingIdList, currentIdList); - await syncIssuesWithDeletedModules(deletedIds as string[]); -}; - -export const syncIssuesWithDeletedModules = async (deletedModuleIds: string[]) => { - if (!deletedModuleIds.length) { - return; - } - - const issues = await persistence.getIssues("", "", { module: deletedModuleIds.join(","), cursor: "10000:0:0" }, {}); - if (issues?.results && Array.isArray(issues.results)) { - const promises = issues.results.map(async (issue: TIssue) => { - const updatedIssue = { - ...issue, - module_ids: issue.module_ids?.filter((id: string) => !deletedModuleIds.includes(id)) || [], - is_local_update: 1, - }; - updateIssue(updatedIssue); - }); - await Promise.all(promises); - } -}; - -const syncCycles = async (currentCycles: any) => { - const currentIdList = currentCycles.map((cycle: any) => cycle.id); - const existingCycles = await persistence.db.exec("SELECT id FROM cycles;"); - const existingIdList = existingCycles ? existingCycles.map((cycle: any) => cycle.id) : []; - const deletedIds = difference(existingIdList, currentIdList); - await syncIssuesWithDeletedCycles(deletedIds as string[]); -}; - -export const syncIssuesWithDeletedCycles = async (deletedCycleIds: string[]) => { - if (!deletedCycleIds.length) { - return; - } - - const issues = await persistence.getIssues("", "", { cycle: deletedCycleIds.join(","), cursor: "10000:0:0" }, {}); - if (issues?.results && Array.isArray(issues.results)) { - const promises = issues.results.map(async (issue: TIssue) => { - const updatedIssue = { - ...issue, - cycle_id: null, - is_local_update: 1, - }; - updateIssue(updatedIssue); - }); - await Promise.all(promises); - } -}; - -const syncStates = async (currentStates: any) => { - const currentIdList = currentStates.map((state: any) => state.id); - const existingStates = await persistence.db.exec("SELECT id FROM states;"); - const existingIdList = existingStates ? existingStates.map((state: any) => state.id) : []; - const deletedIds = difference(existingIdList, currentIdList); - await syncIssuesWithDeletedStates(deletedIds as string[]); -}; - -export const syncIssuesWithDeletedStates = async (deletedStateIds: string[]) => { - if (!deletedStateIds.length) { - return; - } - - const issues = await persistence.getIssues("", "", { state: deletedStateIds.join(","), cursor: "10000:0:0" }, {}); - if (issues?.results && Array.isArray(issues.results)) { - const promises = issues.results.map(async (issue: TIssue) => { - const updatedIssue = { - ...issue, - state_id: null, - is_local_update: 1, - }; - updateIssue(updatedIssue); - }); - await Promise.all(promises); - } -}; - -const syncMembers = async (currentMembers: any) => { - const currentIdList = currentMembers.map((member: any) => member.id); - const existingMembers = await persistence.db.exec("SELECT id FROM members;"); - const existingIdList = existingMembers ? existingMembers.map((member: any) => member.id) : []; - const deletedIds = difference(existingIdList, currentIdList); - await syncIssuesWithDeletedMembers(deletedIds as string[]); -}; - -export const syncIssuesWithDeletedMembers = async (deletedMemberIds: string[]) => { - if (!deletedMemberIds.length) { - return; - } - - const issues = await persistence.getIssues( - "", - "", - { assignees: deletedMemberIds.join(","), cursor: "10000:0:0" }, - {} - ); - if (issues?.results && Array.isArray(issues.results)) { - const promises = issues.results.map(async (issue: TIssue) => { - const updatedIssue = { - ...issue, - assignee_ids: issue.assignee_ids.filter((id: string) => !deletedMemberIds.includes(id)), - is_local_update: 1, - }; - updateIssue(updatedIssue); - }); - await Promise.all(promises); - } -}; - -export const loadWorkSpaceData = async (workspaceSlug: string) => { - if (!persistence.db || !persistence.db.exec) { - return; - } - log("Loading workspace data"); - const promises = []; - promises.push(getLabels(workspaceSlug)); - promises.push(getModules(workspaceSlug)); - promises.push(getCycles(workspaceSlug)); - promises.push(getStates(workspaceSlug)); - promises.push(getEstimatePoints(workspaceSlug)); - promises.push(getMembers(workspaceSlug)); - const [labels, modules, cycles, states, estimates, members] = await Promise.all(promises); - - // @todo: we don't need this manual sync here, when backend adds these changes to issue activity and updates the updated_at of the issue. - await syncLabels(labels); - await syncModules(modules); - await syncCycles(cycles); - await syncStates(states); - // TODO: Not handling sync estimates yet, as we don't know the new estimate point assigned. - // Backend should update the updated_at of the issue when estimate point is updated, or we should have realtime sync on the issues table. - // await syncEstimates(estimates); - await syncMembers(members); - - const start = performance.now(); - - await persistence.db.exec("BEGIN;"); - await persistence.db.exec("DELETE FROM labels WHERE 1=1;"); - await batchInserts(labels, "labels", labelSchema); - await persistence.db.exec("COMMIT;"); - - await persistence.db.exec("BEGIN;"); - await persistence.db.exec("DELETE FROM modules WHERE 1=1;"); - await batchInserts(modules, "modules", moduleSchema); - await persistence.db.exec("COMMIT;"); - - await persistence.db.exec("BEGIN;"); - await persistence.db.exec("DELETE FROM cycles WHERE 1=1;"); - await batchInserts(cycles, "cycles", cycleSchema); - await persistence.db.exec("COMMIT;"); - - await persistence.db.exec("BEGIN;"); - await persistence.db.exec("DELETE FROM states WHERE 1=1;"); - await batchInserts(states, "states", stateSchema); - await persistence.db.exec("COMMIT;"); - - await persistence.db.exec("BEGIN;"); - await persistence.db.exec("DELETE FROM estimate_points WHERE 1=1;"); - await batchInserts(estimates, "estimate_points", estimatePointSchema); - await persistence.db.exec("COMMIT;"); - - await persistence.db.exec("BEGIN;"); - await persistence.db.exec("DELETE FROM members WHERE 1=1;"); - await batchInserts(members, "members", memberSchema); - await persistence.db.exec("COMMIT;"); - - const end = performance.now(); - log("Time taken to load workspace data", end - start); -}; diff --git a/apps/web/core/local-db/utils/query-constructor.ts b/apps/web/core/local-db/utils/query-constructor.ts deleted file mode 100644 index f2316bce55..0000000000 --- a/apps/web/core/local-db/utils/query-constructor.ts +++ /dev/null @@ -1,169 +0,0 @@ -import { - getFilteredRowsForGrouping, - getIssueFieldsFragment, - getMetaKeys, - getOrderByFragment, - singleFilterConstructor, - translateQueryParams, -} from "./query.utils"; -import { log } from "./utils"; -export const SPECIAL_ORDER_BY = { - labels__name: "labels", - "-labels__name": "labels", - assignees__first_name: "members", - "-assignees__first_name": "members", - issue_module__module__name: "modules", - "-issue_module__module__name": "modules", - issue_cycle__cycle__name: "cycles", - "-issue_cycle__cycle__name": "cycles", - state__name: "states", - "-state__name": "states", - estimate_point__key: "estimate_point", - "-estimate_point__key": "estimate_point", -}; -export const issueFilterQueryConstructor = (workspaceSlug: string, projectId: string, queries: any) => { - const { - cursor, - per_page, - group_by, - sub_group_by, - order_by = "-created_at", - ...otherProps - } = translateQueryParams(queries); - - const [pageSize, page, offset] = cursor.split(":"); - - let sql = ""; - - const fieldsFragment = getIssueFieldsFragment(); - - if (sub_group_by) { - const orderByString = getOrderByFragment(order_by); - sql = getFilteredRowsForGrouping(projectId, queries); - sql += `, ranked_issues AS ( SELECT fi.*, - ROW_NUMBER() OVER (PARTITION BY group_id, sub_group_id ${orderByString}) as rank, - COUNT(*) OVER (PARTITION by group_id, sub_group_id) as total_issues from fi) - SELECT ri.*, ${fieldsFragment} - FROM ranked_issues ri - JOIN issues i ON ri.id = i.id - WHERE rank <= ${per_page} - - `; - - return sql; - } - if (group_by) { - const orderByString = getOrderByFragment(order_by); - sql = getFilteredRowsForGrouping(projectId, queries); - sql += `, ranked_issues AS ( SELECT fi.*, - ROW_NUMBER() OVER (PARTITION BY group_id ${orderByString}) as rank, - COUNT(*) OVER (PARTITION by group_id) as total_issues FROM fi) - SELECT ri.*, ${fieldsFragment} - FROM ranked_issues ri - JOIN issues i ON ri.id = i.id - WHERE rank <= ${per_page} - `; - - return sql; - } - - if (order_by && Object.keys(SPECIAL_ORDER_BY).includes(order_by)) { - const name = order_by.replace("-", ""); - const orderByString = getOrderByFragment(order_by, "i."); - - sql = `WITH sorted_issues AS (`; - sql += getFilteredRowsForGrouping(projectId, queries); - sql += `SELECT fi.* , `; - if (order_by.includes("assignee")) { - sql += ` s.first_name as ${name} `; - } else if (order_by.includes("estimate")) { - sql += ` s.key as ${name} `; - } else { - sql += ` s.name as ${name} `; - } - sql += `FROM fi `; - if (order_by && Object.keys(SPECIAL_ORDER_BY).includes(order_by)) { - if (order_by.includes("cycle")) { - sql += ` - LEFT JOIN cycles s on fi.cycle_id = s.id`; - } - if (order_by.includes("estimate_point__key")) { - sql += ` - LEFT JOIN estimate_points s on fi.estimate_point = s.id`; - } - if (order_by.includes("state")) { - sql += ` - LEFT JOIN states s on fi.state_id = s.id`; - } - if (order_by.includes("label")) { - sql += ` - LEFT JOIN issue_meta sm ON fi.id = sm.issue_id AND sm.key = 'label_ids' - LEFT JOIN labels s ON s.id = sm.value`; - } - if (order_by.includes("module")) { - sql += ` - LEFT JOIN issue_meta sm ON fi.id = sm.issue_id AND sm.key = 'module_ids' - LEFT JOIN modules s ON s.id = sm.value`; - } - - if (order_by.includes("assignee")) { - sql += ` - LEFT JOIN issue_meta sm ON fi.id = sm.issue_id AND sm.key = 'assignee_ids' - LEFT JOIN members s ON s.id = sm.value`; - } - - sql += ` ORDER BY ${name} ASC NULLS LAST`; - } - sql += `)`; - - sql += `SELECT ${fieldsFragment}, group_concat(si.${name}) as ${name} from sorted_issues si JOIN issues i ON si.id = i.id - `; - sql += ` group by i.id ${orderByString} LIMIT ${pageSize} OFFSET ${offset * 1 + page * pageSize};`; - - return sql; - } - - const filterJoinFields = getMetaKeys(queries); - const orderByString = getOrderByFragment(order_by); - - sql = `SELECT ${fieldsFragment}`; - if (otherProps.state_group) { - sql += `, states.'group' as state_group`; - } - sql += ` from issues i - `; - - if (otherProps.state_group) { - sql += `LEFT JOIN states ON i.state_id = states.id `; - } - filterJoinFields.forEach((field: string) => { - const value = otherProps[field] || ""; - sql += ` INNER JOIN issue_meta ${field} ON i.id = ${field}.issue_id AND ${field}.key = '${field}' AND ${field}.value IN ('${value.split(",").join("','")}') - `; - }); - - sql += ` WHERE 1=1 `; - if (projectId) { - sql += ` AND i.project_id = '${projectId}' `; - } - sql += ` ${singleFilterConstructor(otherProps)} group by i.id `; - sql += orderByString; - - // Add offset and paging to query - sql += ` LIMIT ${pageSize} OFFSET ${offset * 1 + page * pageSize};`; - - return sql; -}; - -export const issueFilterCountQueryConstructor = (workspaceSlug: string, projectId: string, queries: any) => { - //@todo Very crude way to extract count from the actual query. Needs to be refactored - // Remove group by from the query to fallback to non group query - const { group_by, sub_group_by, order_by, ...otherProps } = queries; - let sql = issueFilterQueryConstructor(workspaceSlug, projectId, otherProps); - const fieldsFragment = getIssueFieldsFragment(); - - sql = sql.replace(`SELECT ${fieldsFragment}`, "SELECT COUNT(DISTINCT i.id) as total_count"); - // Remove everything after group by i.id - sql = `${sql.split("group by i.id")[0]};`; - return sql; -}; diff --git a/apps/web/core/local-db/utils/query-executor.ts b/apps/web/core/local-db/utils/query-executor.ts deleted file mode 100644 index a6844dff43..0000000000 --- a/apps/web/core/local-db/utils/query-executor.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { persistence } from "../storage.sqlite"; - -export const runQuery = async (sql: string) => { - const data = await persistence.db?.exec({ - sql, - rowMode: "object", - returnValue: "resultRows", - }); - - return data; -}; diff --git a/apps/web/core/local-db/utils/query-sanitizer.ts.ts b/apps/web/core/local-db/utils/query-sanitizer.ts.ts deleted file mode 100644 index 3488217dab..0000000000 --- a/apps/web/core/local-db/utils/query-sanitizer.ts.ts +++ /dev/null @@ -1,38 +0,0 @@ -// plane constants -import { EUserPermissions } from "@plane/constants"; -import type { TIssueParams } from "@plane/types"; -// root store -import { rootStore } from "@/lib/store-context"; - -export const sanitizeWorkItemQueries = ( - workspaceSlug: string, - projectId: string, - queries: Partial> | undefined -): Partial> | undefined => { - // Get current project details and user id and role for the project - const currentProject = rootStore.projectRoot.project.getProjectById(projectId); - const currentUserId = rootStore.user.data?.id; - const currentUserRole = rootStore.user.permission.getProjectRoleByWorkspaceSlugAndProjectId(workspaceSlug, projectId); - - // Only apply this restriction for guests when guest_view_all_features is disabled - if ( - currentUserId && - currentUserRole === EUserPermissions.GUEST && - currentProject?.guest_view_all_features === false - ) { - // Sanitize the created_by filter if it doesn't exist or if it exists and includes the current user id - const existingCreatedByFilter = queries?.created_by; - const shouldApplyFilter = - !existingCreatedByFilter || - (typeof existingCreatedByFilter === "string" && existingCreatedByFilter.includes(currentUserId)); - - if (shouldApplyFilter) { - queries = { - ...queries, - created_by: currentUserId, - }; - } - } - - return queries; -}; diff --git a/apps/web/core/local-db/utils/query.utils.ts b/apps/web/core/local-db/utils/query.utils.ts deleted file mode 100644 index 583b623c88..0000000000 --- a/apps/web/core/local-db/utils/query.utils.ts +++ /dev/null @@ -1,357 +0,0 @@ -import { ARRAY_FIELDS, GROUP_BY_MAP, PRIORITY_MAP } from "./constants"; -import { SPECIAL_ORDER_BY } from "./query-constructor"; -import { issueSchema } from "./schemas"; -import { wrapDateTime } from "./utils"; - -export const translateQueryParams = (queries: any) => { - const { - group_by, - layout, - sub_group_by, - labels, - assignees, - state, - cycle, - module, - priority, - type, - issue_type, - ...otherProps - } = queries; - - const order_by = queries.order_by; - if (state) otherProps.state_id = state; - if (cycle) otherProps.cycle_id = cycle; - if (module) otherProps.module_ids = module; - if (labels) otherProps.label_ids = labels; - if (assignees) otherProps.assignee_ids = assignees; - if (group_by) otherProps.group_by = GROUP_BY_MAP[group_by as keyof typeof GROUP_BY_MAP]; - if (sub_group_by) otherProps.sub_group_by = GROUP_BY_MAP[sub_group_by as keyof typeof GROUP_BY_MAP]; - if (priority) { - otherProps.priority_proxy = priority - .split(",") - .map((priority: string) => PRIORITY_MAP[priority as keyof typeof PRIORITY_MAP]) - .join(","); - } - if (type) { - otherProps.state_group = type === "backlog" ? "backlog" : "unstarted,started"; - } - if (issue_type) { - otherProps.type_id = issue_type; - } - - if (order_by?.includes("priority")) { - otherProps.order_by = order_by.replace("priority", "priority_proxy"); - } - - // Fix invalid orderby when switching from spreadsheet layout - if (layout !== "spreadsheet" && Object.keys(SPECIAL_ORDER_BY).includes(order_by)) { - otherProps.order_by = "sort_order"; - } - // For each property value, replace None with empty string - Object.keys(otherProps).forEach((key) => { - if (otherProps[key] === "None") { - otherProps[key] = ""; - } - }); - - return otherProps; -}; - -export const getOrderByFragment = (order_by: string, table = "") => { - let orderByString = ""; - if (!order_by) return orderByString; - - if (order_by.startsWith("-")) { - orderByString += ` ORDER BY ${wrapDateTime(order_by.slice(1))} DESC NULLS LAST, ${table}sequence_id DESC`; - } else { - orderByString += ` ORDER BY ${wrapDateTime(order_by)} ASC NULLS LAST, ${table}sequence_id DESC`; - } - return orderByString; -}; - -export const isMetaJoinRequired = (groupBy: string, subGroupBy: string) => - ARRAY_FIELDS.includes(groupBy) || ARRAY_FIELDS.includes(subGroupBy); - -export const getMetaKeysFragment = (queries: any) => { - const { group_by, sub_group_by, ...otherProps } = translateQueryParams(queries); - - const fields: Set = new Set(); - if (ARRAY_FIELDS.includes(group_by)) { - fields.add(group_by); - } - - if (ARRAY_FIELDS.includes(sub_group_by)) { - fields.add(sub_group_by); - } - - const keys = Object.keys(otherProps); - - keys.forEach((field: string) => { - if (ARRAY_FIELDS.includes(field)) { - fields.add(field); - } - }); - - const sql = ` ('${Array.from(fields).join("','")}')`; - - return sql; -}; - -export const getMetaKeys = (queries: any): string[] => { - const { group_by, sub_group_by, ...otherProps } = translateQueryParams(queries); - - const fields: Set = new Set(); - if (ARRAY_FIELDS.includes(group_by)) { - fields.add(group_by); - } - - if (ARRAY_FIELDS.includes(sub_group_by)) { - fields.add(sub_group_by); - } - - const keys = Object.keys(otherProps); - - keys.forEach((field: string) => { - if (ARRAY_FIELDS.includes(field)) { - fields.add(field); - } - }); - - return Array.from(fields); -}; - -const areJoinsRequired = (queries: any) => { - const { group_by, sub_group_by, ...otherProps } = translateQueryParams(queries); - - if (ARRAY_FIELDS.includes(group_by) || ARRAY_FIELDS.includes(sub_group_by)) { - return true; - } - if (Object.keys(otherProps).some((field) => ARRAY_FIELDS.includes(field))) { - return true; - } - return false; -}; - -// Apply filters to the query -export const getFilteredRowsForGrouping = (projectId: string, queries: any) => { - const { group_by, sub_group_by, ...otherProps } = translateQueryParams(queries); - - const filterJoinFields = getMetaKeys(otherProps); - - const temp = getSingleFilterFields(queries); - const issueTableFilterFields = temp.length ? "," + temp.join(",") : ""; - - const joinsRequired = areJoinsRequired(queries); - - let sql = ""; - if (!joinsRequired) { - sql = `WITH fi as (SELECT i.id,i.created_at, i.sequence_id ${issueTableFilterFields}`; - if (group_by) { - if (group_by === "target_date") { - sql += `, date(i.${group_by}) as group_id`; - } else { - sql += `, i.${group_by} as group_id`; - } - } - if (sub_group_by) { - sql += `, i.${sub_group_by} as sub_group_id`; - } - sql += ` FROM issues i `; - if (otherProps.state_group) { - sql += `LEFT JOIN states ON i.state_id = states.id `; - } - sql += `WHERE 1=1 `; - if (projectId) { - sql += ` AND i.project_id = '${projectId}' - `; - } - sql += `${singleFilterConstructor(otherProps)}) - `; - return sql; - } - - sql = `WITH fi AS (`; - sql += `SELECT i.id,i.created_at,i.sequence_id ${issueTableFilterFields} `; - if (group_by) { - if (ARRAY_FIELDS.includes(group_by)) { - sql += `, ${group_by}.value as group_id - `; - } else if (group_by === "target_date") { - sql += `, date(i.${group_by}) as group_id - `; - } else { - sql += `, i.${group_by} as group_id - `; - } - } - if (sub_group_by) { - if (ARRAY_FIELDS.includes(sub_group_by)) { - sql += `, ${sub_group_by}.value as sub_group_id - `; - } else { - sql += `, i.${sub_group_by} as sub_group_id - `; - } - } - - sql += ` from issues i - `; - if (otherProps.state_group) { - sql += `LEFT JOIN states ON i.state_id = states.id `; - } - filterJoinFields.forEach((field: string) => { - sql += ` INNER JOIN issue_meta ${field} ON i.id = ${field}.issue_id AND ${field}.key = '${field}' AND ${field}.value IN ('${otherProps[field].split(",").join("','")}') - `; - }); - - // If group by field is not already joined, join it - if (ARRAY_FIELDS.includes(group_by) && !filterJoinFields.includes(group_by)) { - sql += ` LEFT JOIN issue_meta ${group_by} ON i.id = ${group_by}.issue_id AND ${group_by}.key = '${group_by}' - `; - } - if (ARRAY_FIELDS.includes(sub_group_by) && !filterJoinFields.includes(sub_group_by)) { - sql += ` LEFT JOIN issue_meta ${sub_group_by} ON i.id = ${sub_group_by}.issue_id AND ${sub_group_by}.key = '${sub_group_by}' - `; - } - - sql += ` WHERE 1=1 `; - if (projectId) { - sql += ` AND i.project_id = '${projectId}' - `; - } - sql += singleFilterConstructor(otherProps); - - sql += `) - `; - return sql; -}; - -export const singleFilterConstructor = (queries: any) => { - const { - order_by, - cursor, - per_page, - group_by, - sub_group_by, - state_group, - sub_issue, - target_date, - start_date, - ...filters - } = translateQueryParams(queries); - - let sql = ""; - if (!sub_issue) { - sql += ` AND parent_id IS NULL - `; - } - if (target_date) { - sql += createDateFilter("target_date", target_date); - } - if (start_date) { - sql += createDateFilter("start_date", start_date); - } - if (state_group) { - sql += ` AND state_group in ('${state_group.split(",").join("','")}') - `; - } - const keys = Object.keys(filters); - - keys.forEach((key) => { - const value = filters[key] ? filters[key].split(",") : ""; - if (!ARRAY_FIELDS.includes(key)) { - if (!value) { - sql += ` AND ${key} IS NULL`; - return; - } - sql += ` AND ${key} in ('${value.join("','")}') - `; - } - }); - // - - return sql; -}; - -const createDateFilter = (key: string, q: string) => { - let sql = " "; - // get todays date in YYYY-MM-DD format - const queries = q.split(","); - const customRange: string[] = []; - let isAnd = true; - queries.forEach((query: string) => { - const [date, type, from] = query.split(";"); - if (from) { - // Assuming type is always after - let after = ""; - const [_length, unit] = date.split("_"); - const length = parseInt(_length); - - if (unit === "weeks") { - // get date in yyyy-mm-dd format one week from now - after = new Date(new Date().setDate(new Date().getDate() + length * 7)).toISOString().split("T")[0]; - } - if (unit === "months") { - after = new Date(new Date().setDate(new Date().getDate() + length * 30)).toISOString().split("T")[0]; - } - sql += ` ${isAnd ? "AND" : "OR"} ${key} >= date('${after}')`; - isAnd = false; - // sql += ` AND ${key} ${type === "after" ? ">=" : "<="} date('${date}', '${today}')`; - } else { - customRange.push(query); - } - }); - - if (customRange.length === 2) { - const end = customRange.find((date) => date.includes("before"))?.split(";")[0]; - const start = customRange.find((date) => date.includes("after"))?.split(";")[0]; - if (end && start) { - sql += ` ${isAnd ? "AND" : "OR"} ${key} BETWEEN date('${start}') AND date('${end}')`; - } - } - if (customRange.length === 1) { - sql += ` AND ${key}=date('${customRange[0].split(";")[0]}')`; - } - - return sql; -}; -const getSingleFilterFields = (queries: any) => { - const { order_by, cursor, per_page, group_by, sub_group_by, sub_issue, state_group, ...otherProps } = - translateQueryParams(queries); - - const fields = new Set(); - - if (order_by && !order_by.includes("created_at") && !Object.keys(SPECIAL_ORDER_BY).includes(order_by)) - fields.add(order_by.replace("-", "")); - - const keys = Object.keys(otherProps); - - keys.forEach((field: string) => { - if (!ARRAY_FIELDS.includes(field)) { - fields.add(field); - } - }); - - if (order_by?.includes("state__name")) { - fields.add("state_id"); - } - if (order_by?.includes("cycle__name")) { - fields.add("cycle_id"); - } - if (state_group) { - fields.add("states.'group' as state_group"); - } - if (order_by?.includes("estimate_point__key")) { - fields.add("estimate_point"); - } - return Array.from(fields); -}; - -export const getIssueFieldsFragment = () => { - const { description_html, ...filtered } = issueSchema; - const keys = Object.keys(filtered); - const sql = ` ${keys.map((key) => `i.${key}`).join(`, - `)}`; - return sql; -}; diff --git a/apps/web/core/local-db/utils/schemas.ts b/apps/web/core/local-db/utils/schemas.ts deleted file mode 100644 index 068ab9234f..0000000000 --- a/apps/web/core/local-db/utils/schemas.ts +++ /dev/null @@ -1,136 +0,0 @@ -export type Schema = { - [key: string]: string; -}; - -export const issueSchema: Schema = { - id: "TEXT UNIQUE", - name: "TEXT", - state_id: "TEXT", - sort_order: "REAL", - completed_at: "TEXT", - estimate_point: "REAL", - priority: "TEXT", - priority_proxy: "INTEGER", - start_date: "TEXT", - target_date: "TEXT", - sequence_id: "INTEGER", - project_id: "TEXT", - parent_id: "TEXT", - created_at: "TEXT", - updated_at: "TEXT", - created_by: "TEXT", - updated_by: "TEXT", - is_draft: "INTEGER", - archived_at: "TEXT", - state__group: "TEXT", - sub_issues_count: "INTEGER", - cycle_id: "TEXT", - link_count: "INTEGER", - attachment_count: "INTEGER", - type_id: "TEXT", - label_ids: "TEXT", - assignee_ids: "TEXT", - module_ids: "TEXT", - description_html: "TEXT", - is_local_update: "INTEGER", -}; - -export const issueMetaSchema: Schema = { - issue_id: "TEXT", - key: "TEXT", - value: "TEXT", -}; -export const moduleSchema: Schema = { - id: "TEXT UNIQUE", - workspace_id: "TEXT", - project_id: "TEXT", - name: "TEXT", - description: "TEXT", - description_text: "TEXT", - description_html: "TEXT", - start_date: "TEXT", - target_date: "TEXT", - status: "TEXT", - lead_id: "TEXT", - member_ids: "TEXT", - view_props: "TEXT", - sort_order: "INTEGER", - external_source: "TEXT", - external_id: "TEXT", - logo_props: "TEXT", - total_issues: "INTEGER", - cancelled_issues: "INTEGER", - completed_issues: "INTEGER", - started_issues: "INTEGER", - unstarted_issues: "INTEGER", - backlog_issues: "INTEGER", - created_at: "TEXT", - updated_at: "TEXT", - archived_at: "TEXT", -}; - -export const labelSchema: Schema = { - id: "TEXT UNIQUE", - name: "TEXT", - color: "TEXT", - parent: "TEXT", - project_id: "TEXT", - workspace_id: "TEXT", - sort_order: "INTEGER", -}; - -export const cycleSchema: Schema = { - id: "TEXT UNIQUE", - workspace_id: "TEXT", - project_id: "TEXT", - name: "TEXT", - description: "TEXT", - start_date: "TEXT", - end_date: "TEXT", - owned_by_id: "TEXT", - view_props: "TEXT", - sort_order: "INTEGER", - external_source: "TEXT", - external_id: "TEXT", - progress_snapshot: "TEXT", - logo_props: "TEXT", - total_issues: "INTEGER", - cancelled_issues: "INTEGER", - completed_issues: "INTEGER", - started_issues: "INTEGER", - unstarted_issues: "INTEGER", - backlog_issues: "INTEGER", -}; - -export const stateSchema: Schema = { - id: "TEXT UNIQUE", - project_id: "TEXT", - workspace_id: "TEXT", - name: "TEXT", - color: "TEXT", - group: "TEXT", - default: "BOOLEAN", - description: "TEXT", - sequence: "INTEGER", -}; - -export const estimatePointSchema: Schema = { - id: "TEXT UNIQUE", - key: "TEXT", - value: "REAL", -}; - -export const memberSchema: Schema = { - id: "TEXT UNIQUE", - first_name: "TEXT", - last_name: "TEXT", - avatar: "TEXT", - is_bot: "BOOLEAN", - display_name: "TEXT", - email: "TEXT", -}; - -export const optionsSchema: Schema = { - key: "TEXT UNIQUE", - value: "TEXT", -}; diff --git a/apps/web/core/local-db/utils/tables.ts b/apps/web/core/local-db/utils/tables.ts deleted file mode 100644 index 6319f6e9c5..0000000000 --- a/apps/web/core/local-db/utils/tables.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { persistence } from "../storage.sqlite"; -import type { Schema } from "./schemas"; -import { - labelSchema, - moduleSchema, - issueMetaSchema, - issueSchema, - stateSchema, - cycleSchema, - estimatePointSchema, - memberSchema, - optionsSchema, -} from "./schemas"; -import { log } from "./utils"; - -const createTableSQLfromSchema = (tableName: string, schema: Schema) => { - let sql = `CREATE TABLE IF NOT EXISTS ${tableName} (`; - sql += Object.keys(schema) - .map((key) => `'${key}' ${schema[key]}`) - .join(", "); - sql += `);`; - log("#####", sql); - return sql; -}; - -export const createTables = async () => { - //@todo use promise.all or send all statements in one go - await persistence.db.exec("BEGIN;"); - - await persistence.db.exec(createTableSQLfromSchema("issues", issueSchema)); - await persistence.db.exec(createTableSQLfromSchema("issue_meta", issueMetaSchema)); - await persistence.db.exec(createTableSQLfromSchema("modules", moduleSchema)); - await persistence.db.exec(createTableSQLfromSchema("labels", labelSchema)); - await persistence.db.exec(createTableSQLfromSchema("states", stateSchema)); - await persistence.db.exec(createTableSQLfromSchema("cycles", cycleSchema)); - await persistence.db.exec(createTableSQLfromSchema("estimate_points", estimatePointSchema)); - await persistence.db.exec(createTableSQLfromSchema("members", memberSchema)); - await persistence.db.exec(createTableSQLfromSchema("options", optionsSchema)); - - await persistence.db.exec("COMMIT;"); -}; diff --git a/apps/web/core/local-db/utils/utils.ts b/apps/web/core/local-db/utils/utils.ts deleted file mode 100644 index 1cb44c6724..0000000000 --- a/apps/web/core/local-db/utils/utils.ts +++ /dev/null @@ -1,206 +0,0 @@ -import { pick } from "lodash-es"; -import type { TIssue } from "@plane/types"; -import { rootStore } from "@/lib/store-context"; -import { persistence } from "../storage.sqlite"; -import { updateIssue } from "./load-issues"; - -export const log = (...args: any) => { - if ((window as any).DEBUG) { - console.log(...args); - } -}; -export const logError = (e: any) => { - if (e?.result?.errorClass === "SQLite3Error") { - e = parseSQLite3Error(e); - } - console.error(e); -}; -export const logInfo = console.info; - -export const addIssueToPersistanceLayer = async (issue: TIssue) => { - try { - const issuePartial = pick({ ...JSON.parse(JSON.stringify(issue)) }, [ - "id", - "name", - "state_id", - "sort_order", - "completed_at", - "estimate_point", - "priority", - "start_date", - "target_date", - "sequence_id", - "project_id", - "parent_id", - "created_at", - "updated_at", - "created_by", - "updated_by", - "is_draft", - "archived_at", - "state__group", - "cycle_id", - "link_count", - "attachment_count", - "sub_issues_count", - "assignee_ids", - "label_ids", - "module_ids", - "type_id", - "description_html", - ]); - await updateIssue({ ...issuePartial, is_local_update: 1 }); - } catch (e) { - logError("Error while adding issue to db"); - } -}; - -export const updatePersistentLayer = async (issueIds: string | string[]) => { - if (typeof issueIds === "string") { - issueIds = [issueIds]; - } - issueIds.forEach(async (issueId) => { - const dbIssue = await persistence.getIssue(issueId); - const issue = rootStore.issue.issues.getIssueById(issueId); - const updatedIssue = dbIssue ? { ...dbIssue, ...issue } : issue; - - if (updatedIssue) { - addIssueToPersistanceLayer(updatedIssue); - } - }); -}; - -export const wrapDateTime = (field: string) => { - const DATE_TIME_FIELDS = ["created_at", "updated_at", "completed_at", "start_date", "target_date"]; - - if (DATE_TIME_FIELDS.includes(field)) { - return `datetime(${field})`; - } - return field; -}; - -export const getGroupedIssueResults = (issueResults: (TIssue & { group_id?: string; total_issues: number })[]): any => { - const groupedResults: { - [key: string]: { - results: TIssue[]; - total_results: number; - }; - } = {}; - - for (const issue of issueResults) { - const { group_id, total_issues } = issue; - const groupId = group_id ? group_id : "None"; - if (groupedResults?.[groupId] !== undefined && Array.isArray(groupedResults?.[groupId]?.results)) { - groupedResults?.[groupId]?.results.push(issue); - } else { - groupedResults[groupId] = { results: [issue], total_results: total_issues }; - } - } - - return groupedResults; -}; - -export const getSubGroupedIssueResults = ( - issueResults: (TIssue & { group_id?: string; total_issues: number; sub_group_id?: string })[] -): any => { - const subGroupedResults: { - [key: string]: { - results: { - [key: string]: { - results: TIssue[]; - total_results: number; - }; - }; - total_results: number; - }; - } = {}; - - for (const issue of issueResults) { - const { group_id, total_issues, sub_group_id } = issue; - const groupId = group_id ? group_id : "None"; - const subGroupId = sub_group_id ? sub_group_id : "None"; - - if (subGroupedResults?.[groupId] === undefined) { - subGroupedResults[groupId] = { results: {}, total_results: 0 }; - } - - if ( - subGroupedResults[groupId].results[subGroupId] !== undefined && - Array.isArray(subGroupedResults[groupId].results[subGroupId]?.results) - ) { - subGroupedResults[groupId].results[subGroupId]?.results.push(issue); - } else { - subGroupedResults[groupId].results[subGroupId] = { results: [issue], total_results: total_issues }; - } - } - - const groupByKeys = Object.keys(subGroupedResults); - - for (const groupByKey of groupByKeys) { - let totalIssues = 0; - const groupedResults = subGroupedResults[groupByKey]?.results ?? {}; - const subGroupByKeys = Object.keys(groupedResults); - - for (const subGroupByKey of subGroupByKeys) { - const subGroupedResultsCount = groupedResults[subGroupByKey].total_results ?? 0; - totalIssues += subGroupedResultsCount; - } - - subGroupedResults[groupByKey].total_results = totalIssues; - } - - return subGroupedResults; -}; - -export const delay = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); - -const parseSQLite3Error = (error: any) => { - error.result = JSON.stringify(error.result); - return error; -}; - -export const isChrome = () => { - const userAgent = navigator.userAgent; - return userAgent.includes("Chrome") && !userAgent.includes("Edg") && !userAgent.includes("OPR"); -}; - -export const clearOPFS = async (force = false) => { - const storageManager = window.navigator.storage; - const root = await storageManager.getDirectory(); - - if (force && isChrome()) { - await (root as any).remove({ recursive: true }); - return; - } - // ts-ignore - for await (const entry of (root as any)?.values()) { - if (entry.kind === "directory" && entry.name.startsWith(".ahp-")) { - // A lock with the same name as the directory protects it from - // being deleted. - - if (force) { - // don't wait for the lock - try { - await root.removeEntry(entry.name, { recursive: true }); - } catch (e) { - console.log(e); - } - } else { - await navigator.locks.request(entry.name, { ifAvailable: true }, async (lock) => { - if (lock) { - log?.(`Deleting temporary directory ${entry.name}`); - try { - await root.removeEntry(entry.name, { recursive: true }); - } catch (e) { - console.log(e); - } - } else { - log?.(`Temporary directory ${entry.name} is in use`); - } - }); - } - } else { - root.removeEntry(entry.name); - } - } -}; diff --git a/apps/web/core/local-db/worker/db.ts b/apps/web/core/local-db/worker/db.ts deleted file mode 100644 index d8a7997c0a..0000000000 --- a/apps/web/core/local-db/worker/db.ts +++ /dev/null @@ -1,136 +0,0 @@ -import * as Comlink from "comlink"; -import { OPFSCoopSyncVFS as MyVFS } from "./wa-sqlite/src/OPFSCoopSyncVFS"; -import * as SQLite from "./wa-sqlite/src/sqlite-api"; -import SQLiteESMFactory from "./wa-sqlite/src/wa-sqlite.mjs"; - -type TQueryProps = { - sql: string; - rowMode: string; - returnValue: string; - bind: any[]; -}; -const mergeToObject = (columns: string[], row: any[]) => { - const obj: any = {}; - columns.forEach((column, index) => { - obj[column] = row[index]; - }); - return obj; -}; -interface SQLiteInstance { - db: unknown; - exec: (sql: string) => Promise; -} - -export class DBClass { - private instance: SQLiteInstance = {} as SQLiteInstance; - private sqlite3: any; - private tp: Promise[] = []; - private tpResolver: any = []; - async init(dbName: string) { - if (!dbName || typeof dbName !== "string") { - throw new Error("Invalid database name"); - } - - try { - const m = await SQLiteESMFactory(); - this.sqlite3 = SQLite.Factory(m); - const vfs = await MyVFS.create("plane", m); - this.sqlite3.vfs_register(vfs, true); - // Fallback in rare cases where the database is not initialized in time - const p = new Promise((resolve) => setTimeout(() => resolve(false), 2000)); - const dbPromise = this.sqlite3.open_v2( - `${dbName}.sqlite3`, - this.sqlite3.OPEN_READWRITE | this.sqlite3.OPEN_CREATE, - "plane" - ); - - const db = await Promise.any([dbPromise, p]); - - if (!db) { - throw new Error("Failed to initialize in time"); - } - - this.instance.db = db; - this.instance.exec = async (sql: string) => { - const rows: any[] = []; - await this.sqlite3.exec(db, sql, (row: any[], columns: string[]) => { - rows.push(mergeToObject(columns, row)); - }); - - return rows; - }; - return true; - } catch (error) { - throw new Error(`Failed to initialize database: ${(error as any)?.message}`); - } - } - - runQuery(sql: string) { - return this.instance?.exec?.(sql); - } - - async exec(props: string | TQueryProps) { - // @todo this will fail if the transaction is started any other way - // eg: BEGIN, OR BEGIN TRANSACTION - if (props === "BEGIN;") { - let promiseToAwait; - if (this.tp.length > 0) { - promiseToAwait = this.tp.shift(); - } - const p = new Promise((resolve, reject) => { - this.tpResolver.push({ resolve, reject }); - }); - this.tp.push(p); - - if (promiseToAwait) { - await promiseToAwait; - } - } - let sql: string, bind: any[]; - if (typeof props === "string") { - sql = props; - } else { - ({ sql, bind } = props); - if (bind) { - for await (const stmt of this.sqlite3.statements(this.instance.db, sql)) { - bind.forEach((b, i) => { - this.sqlite3.bind(stmt, i + 1, b); - }); - - const rows = []; - - do { - const columns = await this.sqlite3.column_names(stmt); - const row = await this.sqlite3.row(stmt); - rows.push(mergeToObject(columns, row)); - } while ((await this.sqlite3.step(stmt)) === SQLite.SQLITE_ROW); - - return rows; - } - } - } - - if (sql === "COMMIT;" && this.tp) { - await this.instance?.exec?.(sql); - if (this.tp.length > 0) { - const { resolve } = this.tpResolver.shift(); - resolve(); - } - return; - } - return await this.instance?.exec?.(sql); - } - async close() { - try { - if (!this.instance.db) { - return; - } - await this.sqlite3.close(this.instance.db); - // Clear instance to prevent usage after closing - this.instance = {} as SQLiteInstance; - } catch (error) { - throw new Error(`Failed to close database: ${(error as any)?.message}`); - } - } -} -Comlink.expose(DBClass); diff --git a/apps/web/core/local-db/worker/wa-sqlite/src/FacadeVFS.js b/apps/web/core/local-db/worker/wa-sqlite/src/FacadeVFS.js deleted file mode 100644 index c975fdc913..0000000000 --- a/apps/web/core/local-db/worker/wa-sqlite/src/FacadeVFS.js +++ /dev/null @@ -1,508 +0,0 @@ -// Copyright 2024 Roy T. Hashimoto. All Rights Reserved. -import * as VFS from './VFS.js'; - -const AsyncFunction = Object.getPrototypeOf(async function(){}).constructor; - -// Convenience base class for a JavaScript VFS. -// The raw xOpen, xRead, etc. function signatures receive only C primitives -// which aren't easy to work with. This class provides corresponding calls -// like jOpen, jRead, etc., which receive JavaScript-friendlier arguments -// such as string, Uint8Array, and DataView. -export class FacadeVFS extends VFS.Base { - /** - * @param {string} name - * @param {object} module - */ - constructor(name, module) { - super(name, module); - } - - /** - * Override to indicate which methods are asynchronous. - * @param {string} methodName - * @returns {boolean} - */ - hasAsyncMethod(methodName) { - // The input argument is a string like "xOpen", so convert to "jOpen". - // Then check if the method exists and is async. - const jMethodName = `j${methodName.slice(1)}`; - return this[jMethodName] instanceof AsyncFunction; - } - - /** - * Return the filename for a file id for use by mixins. - * @param {number} pFile - * @returns {string} - */ - getFilename(pFile) { - throw new Error('unimplemented'); - } - - /** - * @param {string?} filename - * @param {number} pFile - * @param {number} flags - * @param {DataView} pOutFlags - * @returns {number|Promise} - */ - jOpen(filename, pFile, flags, pOutFlags) { - return VFS.SQLITE_CANTOPEN; - } - - /** - * @param {string} filename - * @param {number} syncDir - * @returns {number|Promise} - */ - jDelete(filename, syncDir) { - return VFS.SQLITE_OK; - } - - /** - * @param {string} filename - * @param {number} flags - * @param {DataView} pResOut - * @returns {number|Promise} - */ - jAccess(filename, flags, pResOut) { - return VFS.SQLITE_OK; - } - - /** - * @param {string} filename - * @param {Uint8Array} zOut - * @returns {number|Promise} - */ - jFullPathname(filename, zOut) { - // Copy the filename to the output buffer. - const { read, written } = new TextEncoder().encodeInto(filename, zOut); - if (read < filename.length) return VFS.SQLITE_IOERR; - if (written >= zOut.length) return VFS.SQLITE_IOERR; - zOut[written] = 0; - return VFS.SQLITE_OK; - } - - /** - * @param {Uint8Array} zBuf - * @returns {number|Promise} - */ - jGetLastError(zBuf) { - return VFS.SQLITE_OK; - } - - /** - * @param {number} pFile - * @returns {number|Promise} - */ - jClose(pFile) { - return VFS.SQLITE_OK; - } - - /** - * @param {number} pFile - * @param {Uint8Array} pData - * @param {number} iOffset - * @returns {number|Promise} - */ - jRead(pFile, pData, iOffset) { - pData.fill(0); - return VFS.SQLITE_IOERR_SHORT_READ; - } - - /** - * @param {number} pFile - * @param {Uint8Array} pData - * @param {number} iOffset - * @returns {number|Promise} - */ - jWrite(pFile, pData, iOffset) { - return VFS.SQLITE_IOERR_WRITE; - } - - /** - * @param {number} pFile - * @param {number} size - * @returns {number|Promise} - */ - jTruncate(pFile, size) { - return VFS.SQLITE_OK; - } - - /** - * @param {number} pFile - * @param {number} flags - * @returns {number|Promise} - */ - jSync(pFile, flags) { - return VFS.SQLITE_OK; - } - - /** - * @param {number} pFile - * @param {DataView} pSize - * @returns {number|Promise} - */ - jFileSize(pFile, pSize) { - return VFS.SQLITE_OK; - } - - /** - * @param {number} pFile - * @param {number} lockType - * @returns {number|Promise} - */ - jLock(pFile, lockType) { - return VFS.SQLITE_OK; - } - - /** - * @param {number} pFile - * @param {number} lockType - * @returns {number|Promise} - */ - jUnlock(pFile, lockType) { - return VFS.SQLITE_OK; - } - - /** - * @param {number} pFile - * @param {DataView} pResOut - * @returns {number|Promise} - */ - jCheckReservedLock(pFile, pResOut) { - pResOut.setInt32(0, 0, true); - return VFS.SQLITE_OK; - } - - /** - * @param {number} pFile - * @param {number} op - * @param {DataView} pArg - * @returns {number|Promise} - */ - jFileControl(pFile, op, pArg) { - return VFS.SQLITE_NOTFOUND; - } - - /** - * @param {number} pFile - * @returns {number|Promise} - */ - jSectorSize(pFile) { - return super.xSectorSize(pFile); - } - - /** - * @param {number} pFile - * @returns {number|Promise} - */ - jDeviceCharacteristics(pFile) { - return 0; - } - - /** - * @param {number} pVfs - * @param {number} zName - * @param {number} pFile - * @param {number} flags - * @param {number} pOutFlags - * @returns {number|Promise} - */ - xOpen(pVfs, zName, pFile, flags, pOutFlags) { - const filename = this.#decodeFilename(zName, flags); - const pOutFlagsView = this.#makeTypedDataView('Int32', pOutFlags); - this['log']?.('jOpen', filename, pFile, '0x' + flags.toString(16)); - return this.jOpen(filename, pFile, flags, pOutFlagsView); - } - - /** - * @param {number} pVfs - * @param {number} zName - * @param {number} syncDir - * @returns {number|Promise} - */ - xDelete(pVfs, zName, syncDir) { - const filename = this._module.UTF8ToString(zName); - this['log']?.('jDelete', filename, syncDir); - return this.jDelete(filename, syncDir); - } - - /** - * @param {number} pVfs - * @param {number} zName - * @param {number} flags - * @param {number} pResOut - * @returns {number|Promise} - */ - xAccess(pVfs, zName, flags, pResOut) { - const filename = this._module.UTF8ToString(zName); - const pResOutView = this.#makeTypedDataView('Int32', pResOut); - this['log']?.('jAccess', filename, flags); - return this.jAccess(filename, flags, pResOutView); - } - - /** - * @param {number} pVfs - * @param {number} zName - * @param {number} nOut - * @param {number} zOut - * @returns {number|Promise} - */ - xFullPathname(pVfs, zName, nOut, zOut) { - const filename = this._module.UTF8ToString(zName); - const zOutArray = this._module.HEAPU8.subarray(zOut, zOut + nOut); - this['log']?.('jFullPathname', filename, nOut); - return this.jFullPathname(filename, zOutArray); - } - - /** - * @param {number} pVfs - * @param {number} nBuf - * @param {number} zBuf - * @returns {number|Promise} - */ - xGetLastError(pVfs, nBuf, zBuf) { - const zBufArray = this._module.HEAPU8.subarray(zBuf, zBuf + nBuf); - this['log']?.('jGetLastError', nBuf); - return this.jGetLastError(zBufArray); - } - - /** - * @param {number} pFile - * @returns {number|Promise} - */ - xClose(pFile) { - this['log']?.('jClose', pFile); - return this.jClose(pFile); - } - - /** - * @param {number} pFile - * @param {number} pData - * @param {number} iAmt - * @param {number} iOffsetLo - * @param {number} iOffsetHi - * @returns {number|Promise} - */ - xRead(pFile, pData, iAmt, iOffsetLo, iOffsetHi) { - const pDataArray = this.#makeDataArray(pData, iAmt); - const iOffset = delegalize(iOffsetLo, iOffsetHi); - this['log']?.('jRead', pFile, iAmt, iOffset); - return this.jRead(pFile, pDataArray, iOffset); - } - - /** - * @param {number} pFile - * @param {number} pData - * @param {number} iAmt - * @param {number} iOffsetLo - * @param {number} iOffsetHi - * @returns {number|Promise} - */ - xWrite(pFile, pData, iAmt, iOffsetLo, iOffsetHi) { - const pDataArray = this.#makeDataArray(pData, iAmt); - const iOffset = delegalize(iOffsetLo, iOffsetHi); - this['log']?.('jWrite', pFile, pDataArray, iOffset); - return this.jWrite(pFile, pDataArray, iOffset); - } - - /** - * @param {number} pFile - * @param {number} sizeLo - * @param {number} sizeHi - * @returns {number|Promise} - */ - xTruncate(pFile, sizeLo, sizeHi) { - const size = delegalize(sizeLo, sizeHi); - this['log']?.('jTruncate', pFile, size); - return this.jTruncate(pFile, size); - } - - /** - * @param {number} pFile - * @param {number} flags - * @returns {number|Promise} - */ - xSync(pFile, flags) { - this['log']?.('jSync', pFile, flags); - return this.jSync(pFile, flags); - } - - /** - * - * @param {number} pFile - * @param {number} pSize - * @returns {number|Promise} - */ - xFileSize(pFile, pSize) { - const pSizeView = this.#makeTypedDataView('BigInt64', pSize); - this['log']?.('jFileSize', pFile); - return this.jFileSize(pFile, pSizeView); - } - - /** - * @param {number} pFile - * @param {number} lockType - * @returns {number|Promise} - */ - xLock(pFile, lockType) { - this['log']?.('jLock', pFile, lockType); - return this.jLock(pFile, lockType); - } - - /** - * @param {number} pFile - * @param {number} lockType - * @returns {number|Promise} - */ - xUnlock(pFile, lockType) { - this['log']?.('jUnlock', pFile, lockType); - return this.jUnlock(pFile, lockType); - } - - /** - * @param {number} pFile - * @param {number} pResOut - * @returns {number|Promise} - */ - xCheckReservedLock(pFile, pResOut) { - const pResOutView = this.#makeTypedDataView('Int32', pResOut); - this['log']?.('jCheckReservedLock', pFile); - return this.jCheckReservedLock(pFile, pResOutView); - } - - /** - * @param {number} pFile - * @param {number} op - * @param {number} pArg - * @returns {number|Promise} - */ - xFileControl(pFile, op, pArg) { - const pArgView = new DataView( - this._module.HEAPU8.buffer, - this._module.HEAPU8.byteOffset + pArg); - this['log']?.('jFileControl', pFile, op, pArgView); - return this.jFileControl(pFile, op, pArgView); - } - - /** - * @param {number} pFile - * @returns {number|Promise} - */ - xSectorSize(pFile) { - this['log']?.('jSectorSize', pFile); - return this.jSectorSize(pFile); - } - - /** - * @param {number} pFile - * @returns {number|Promise} - */ - xDeviceCharacteristics(pFile) { - this['log']?.('jDeviceCharacteristics', pFile); - return this.jDeviceCharacteristics(pFile); - } - - /** - * Wrapped DataView for pointer arguments. - * Pointers to a single value are passed using DataView. A Proxy - * wrapper prevents use of incorrect type or endianness. - * @param {'Int32'|'BigInt64'} type - * @param {number} byteOffset - * @returns {DataView} - */ - #makeTypedDataView(type, byteOffset) { - const byteLength = type === 'Int32' ? 4 : 8; - const getter = `get${type}`; - const setter = `set${type}`; - const makeDataView = () => new DataView( - this._module.HEAPU8.buffer, - this._module.HEAPU8.byteOffset + byteOffset, - byteLength); - let dataView = makeDataView(); - return new Proxy(dataView, { - get(_, prop) { - if (dataView.buffer.byteLength === 0) { - // WebAssembly memory resize detached the buffer. - dataView = makeDataView(); - } - if (prop === getter) { - return function(byteOffset, littleEndian) { - if (!littleEndian) throw new Error('must be little endian'); - return dataView[prop](byteOffset, littleEndian); - } - } - if (prop === setter) { - return function(byteOffset, value, littleEndian) { - if (!littleEndian) throw new Error('must be little endian'); - return dataView[prop](byteOffset, value, littleEndian); - } - } - if (typeof prop === 'string' && (prop.match(/^(get)|(set)/))) { - throw new Error('invalid type'); - } - const result = dataView[prop]; - return typeof result === 'function' ? result.bind(dataView) : result; - } - }); - } - - /** - * @param {number} byteOffset - * @param {number} byteLength - */ - #makeDataArray(byteOffset, byteLength) { - let target = this._module.HEAPU8.subarray(byteOffset, byteOffset + byteLength); - return new Proxy(target, { - get: (_, prop, receiver) => { - if (target.buffer.byteLength === 0) { - // WebAssembly memory resize detached the buffer. - target = this._module.HEAPU8.subarray(byteOffset, byteOffset + byteLength); - } - const result = target[prop]; - return typeof result === 'function' ? result.bind(target) : result; - } - }); - } - - #decodeFilename(zName, flags) { - if (flags & VFS.SQLITE_OPEN_URI) { - // The first null-terminated string is the URI path. Subsequent - // strings are query parameter keys and values. - // https://www.sqlite.org/c3ref/open.html#urifilenamesinsqlite3open - let pName = zName; - let state = 1; - const charCodes = []; - while (state) { - const charCode = this._module.HEAPU8[pName++]; - if (charCode) { - charCodes.push(charCode); - } else { - if (!this._module.HEAPU8[pName]) state = null; - switch (state) { - case 1: // path - charCodes.push('?'.charCodeAt(0)); - state = 2; - break; - case 2: // key - charCodes.push('='.charCodeAt(0)); - state = 3; - break; - case 3: // value - charCodes.push('&'.charCodeAt(0)); - state = 2; - break; - } - } - } - return new TextDecoder().decode(new Uint8Array(charCodes)); - } - return zName ? this._module.UTF8ToString(zName) : null; - } -} - -// Emscripten "legalizes" 64-bit integer arguments by passing them as -// two 32-bit signed integers. -function delegalize(lo32, hi32) { - return (hi32 * 0x100000000) + lo32 + (lo32 < 0 ? 2**32 : 0); -} diff --git a/apps/web/core/local-db/worker/wa-sqlite/src/OPFSCoopSyncVFS.js b/apps/web/core/local-db/worker/wa-sqlite/src/OPFSCoopSyncVFS.js deleted file mode 100644 index 2757ca9db9..0000000000 --- a/apps/web/core/local-db/worker/wa-sqlite/src/OPFSCoopSyncVFS.js +++ /dev/null @@ -1,592 +0,0 @@ -// Copyright 2024 Roy T. Hashimoto. All Rights Reserved. -import { FacadeVFS } from "./FacadeVFS.js"; -import * as VFS from "./VFS.js"; - -const DEFAULT_TEMPORARY_FILES = 10; -const LOCK_NOTIFY_INTERVAL = 1000; - -const DB_RELATED_FILE_SUFFIXES = ["", "-journal", "-wal"]; - -const finalizationRegistry = new FinalizationRegistry((releaser) => releaser()); - -class File { - /** @type {string} */ path; - /** @type {number} */ flags; - /** @type {FileSystemSyncAccessHandle} */ accessHandle; - - /** @type {PersistentFile?} */ persistentFile; - - constructor(path, flags) { - this.path = path; - this.flags = flags; - } -} - -class PersistentFile { - /** @type {FileSystemFileHandle} */ fileHandle; - /** @type {FileSystemSyncAccessHandle} */ accessHandle = null; - - // The following properties are for main database files. - - /** @type {boolean} */ isLockBusy = false; - /** @type {boolean} */ isFileLocked = false; - /** @type {boolean} */ isRequestInProgress = false; - /** @type {function} */ handleLockReleaser = null; - - /** @type {BroadcastChannel} */ handleRequestChannel; - /** @type {boolean} */ isHandleRequested = false; - - constructor(fileHandle) { - this.fileHandle = fileHandle; - } -} - -export class OPFSCoopSyncVFS extends FacadeVFS { - /** @type {Map} */ mapIdToFile = new Map(); - - lastError = null; - log = null; //function(...args) { console.log(`[${contextName}]`, ...args) }; - - /** @type {Map} */ persistentFiles = new Map(); - /** @type {Map} */ boundAccessHandles = new Map(); - /** @type {Set} */ unboundAccessHandles = new Set(); - /** @type {Set} */ accessiblePaths = new Set(); - releaser = null; - - static async create(name, module) { - const vfs = new OPFSCoopSyncVFS(name, module); - await Promise.all([vfs.isReady(), vfs.#initialize(DEFAULT_TEMPORARY_FILES)]); - return vfs; - } - - constructor(name, module) { - super(name, module); - } - - async #initialize(nTemporaryFiles) { - // Delete temporary directories no longer in use. - const root = await navigator.storage.getDirectory(); - // @ts-ignore - for await (const entry of root.values()) { - if (entry.kind === "directory" && entry.name.startsWith(".ahp-")) { - // A lock with the same name as the directory protects it from - // being deleted. - await navigator.locks.request(entry.name, { ifAvailable: true }, async (lock) => { - if (lock) { - this.log?.(`Deleting temporary directory ${entry.name}`); - await root.removeEntry(entry.name, { recursive: true }); - } else { - this.log?.(`Temporary directory ${entry.name} is in use`); - } - }); - } - } - - // Create our temporary directory. - const tmpDirName = `.ahp-${Math.random().toString(36).slice(2)}`; - this.releaser = await new Promise((resolve) => { - navigator.locks.request(tmpDirName, () => { - return new Promise((release) => { - resolve(release); - }); - }); - }); - finalizationRegistry.register(this, this.releaser); - const tmpDir = await root.getDirectoryHandle(tmpDirName, { create: true }); - - // Populate temporary directory. - for (let i = 0; i < nTemporaryFiles; i++) { - const tmpFile = await tmpDir.getFileHandle(`${i}.tmp`, { create: true }); - const tmpAccessHandle = await tmpFile.createSyncAccessHandle(); - this.unboundAccessHandles.add(tmpAccessHandle); - } - } - - /** - * @param {string?} zName - * @param {number} fileId - * @param {number} flags - * @param {DataView} pOutFlags - * @returns {number} - */ - jOpen(zName, fileId, flags, pOutFlags) { - try { - const url = new URL(zName || Math.random().toString(36).slice(2), "file://"); - const path = url.pathname; - - if (flags & VFS.SQLITE_OPEN_MAIN_DB) { - const persistentFile = this.persistentFiles.get(path); - if (persistentFile?.isRequestInProgress) { - // Should not reach here unless SQLite itself retries an open. - // Otherwise, asynchronous operations started on a previous - // open try should have completed. - return VFS.SQLITE_BUSY; - } else if (!persistentFile) { - // This is the usual starting point for opening a database. - // Register a Promise that resolves when the database and related - // files are ready to be used. - this.log?.(`creating persistent file for ${path}`); - const create = !!(flags & VFS.SQLITE_OPEN_CREATE); - this._module.retryOps.push( - (async () => { - try { - // Get the path directory handle. - let dirHandle = await navigator.storage.getDirectory(); - const directories = path.split("/").filter((d) => d); - const filename = directories.pop(); - for (const directory of directories) { - dirHandle = await dirHandle.getDirectoryHandle(directory, { create }); - } - - // Get file handles for the database and related files, - // and create persistent file instances. - for (const suffix of DB_RELATED_FILE_SUFFIXES) { - const fileHandle = await dirHandle.getFileHandle(filename + suffix, { create }); - await this.#createPersistentFile(fileHandle); - } - - // Get access handles for the files. - const file = new File(path, flags); - file.persistentFile = this.persistentFiles.get(path); - await this.#requestAccessHandle(file); - } catch (e) { - // Use an invalid persistent file to signal this error - // for the retried open. - const persistentFile = new PersistentFile(null); - this.persistentFiles.set(path, persistentFile); - console.error(e); - } - })() - ); - return VFS.SQLITE_BUSY; - } else if (!persistentFile.fileHandle) { - // The asynchronous open operation failed. - this.persistentFiles.delete(path); - return VFS.SQLITE_CANTOPEN; - } else if (!persistentFile.accessHandle) { - // This branch is reached if the database was previously opened - // and closed. - this._module.retryOps.push( - (async () => { - const file = new File(path, flags); - file.persistentFile = this.persistentFiles.get(path); - await this.#requestAccessHandle(file); - })() - ); - return VFS.SQLITE_BUSY; - } - } - - if (!this.accessiblePaths.has(path) && !(flags & VFS.SQLITE_OPEN_CREATE)) { - throw new Error(`File ${path} not found`); - } - - const file = new File(path, flags); - this.mapIdToFile.set(fileId, file); - - if (this.persistentFiles.has(path)) { - file.persistentFile = this.persistentFiles.get(path); - } else if (this.boundAccessHandles.has(path)) { - // This temporary file was previously created and closed. Reopen - // the same access handle. - file.accessHandle = this.boundAccessHandles.get(path); - } else if (this.unboundAccessHandles.size) { - // Associate an unbound access handle to this file. - file.accessHandle = this.unboundAccessHandles.values().next().value; - file.accessHandle.truncate(0); - this.unboundAccessHandles.delete(file.accessHandle); - this.boundAccessHandles.set(path, file.accessHandle); - } - this.accessiblePaths.add(path); - - pOutFlags.setInt32(0, flags, true); - return VFS.SQLITE_OK; - } catch (e) { - this.lastError = e; - return VFS.SQLITE_CANTOPEN; - } - } - - /** - * @param {string} zName - * @param {number} syncDir - * @returns {number} - */ - jDelete(zName, syncDir) { - try { - const url = new URL(zName, "file://"); - const path = url.pathname; - if (this.persistentFiles.has(path)) { - const persistentFile = this.persistentFiles.get(path); - persistentFile.accessHandle.truncate(0); - } else { - this.boundAccessHandles.get(path)?.truncate(0); - } - this.accessiblePaths.delete(path); - return VFS.SQLITE_OK; - } catch (e) { - this.lastError = e; - return VFS.SQLITE_IOERR_DELETE; - } - } - - /** - * @param {string} zName - * @param {number} flags - * @param {DataView} pResOut - * @returns {number} - */ - jAccess(zName, flags, pResOut) { - try { - const url = new URL(zName, "file://"); - const path = url.pathname; - pResOut.setInt32(0, this.accessiblePaths.has(path) ? 1 : 0, true); - return VFS.SQLITE_OK; - } catch (e) { - this.lastError = e; - return VFS.SQLITE_IOERR_ACCESS; - } - } - - /** - * @param {number} fileId - * @returns {number} - */ - jClose(fileId) { - try { - const file = this.mapIdToFile.get(fileId); - this.mapIdToFile.delete(fileId); - - if (file?.flags & VFS.SQLITE_OPEN_MAIN_DB) { - if (file.persistentFile?.handleLockReleaser) { - this.#releaseAccessHandle(file); - } - } else if (file?.flags & VFS.SQLITE_OPEN_DELETEONCLOSE) { - file.accessHandle.truncate(0); - this.accessiblePaths.delete(file.path); - if (!this.persistentFiles.has(file.path)) { - this.boundAccessHandles.delete(file.path); - this.unboundAccessHandles.add(file.accessHandle); - } - } - return VFS.SQLITE_OK; - } catch (e) { - this.lastError = e; - return VFS.SQLITE_IOERR_CLOSE; - } - } - - /** - * @param {number} fileId - * @param {Uint8Array} pData - * @param {number} iOffset - * @returns {number} - */ - jRead(fileId, pData, iOffset) { - try { - const file = this.mapIdToFile.get(fileId); - - // On Chrome (at least), passing pData to accessHandle.read() is - // an error because pData is a Proxy of a Uint8Array. Calling - // subarray() produces a real Uint8Array and that works. - const accessHandle = file.accessHandle || file.persistentFile.accessHandle; - const bytesRead = accessHandle.read(pData.subarray(), { at: iOffset }); - - // Opening a database file performs one read without a xLock call. - if (file.flags & VFS.SQLITE_OPEN_MAIN_DB && !file.persistentFile.isFileLocked) { - this.#releaseAccessHandle(file); - } - - if (bytesRead < pData.byteLength) { - pData.fill(0, bytesRead); - return VFS.SQLITE_IOERR_SHORT_READ; - } - return VFS.SQLITE_OK; - } catch (e) { - this.lastError = e; - return VFS.SQLITE_IOERR_READ; - } - } - - /** - * @param {number} fileId - * @param {Uint8Array} pData - * @param {number} iOffset - * @returns {number} - */ - jWrite(fileId, pData, iOffset) { - try { - const file = this.mapIdToFile.get(fileId); - - // On Chrome (at least), passing pData to accessHandle.write() is - // an error because pData is a Proxy of a Uint8Array. Calling - // subarray() produces a real Uint8Array and that works. - const accessHandle = file.accessHandle || file.persistentFile.accessHandle; - const nBytes = accessHandle.write(pData.subarray(), { at: iOffset }); - if (nBytes !== pData.byteLength) throw new Error("short write"); - return VFS.SQLITE_OK; - } catch (e) { - this.lastError = e; - return VFS.SQLITE_IOERR_WRITE; - } - } - - /** - * @param {number} fileId - * @param {number} iSize - * @returns {number} - */ - jTruncate(fileId, iSize) { - try { - const file = this.mapIdToFile.get(fileId); - const accessHandle = file.accessHandle || file.persistentFile.accessHandle; - accessHandle.truncate(iSize); - return VFS.SQLITE_OK; - } catch (e) { - this.lastError = e; - return VFS.SQLITE_IOERR_TRUNCATE; - } - } - - /** - * @param {number} fileId - * @param {number} flags - * @returns {number} - */ - jSync(fileId, flags) { - try { - const file = this.mapIdToFile.get(fileId); - const accessHandle = file.accessHandle || file.persistentFile.accessHandle; - accessHandle.flush(); - return VFS.SQLITE_OK; - } catch (e) { - this.lastError = e; - return VFS.SQLITE_IOERR_FSYNC; - } - } - - /** - * @param {number} fileId - * @param {DataView} pSize64 - * @returns {number} - */ - jFileSize(fileId, pSize64) { - try { - const file = this.mapIdToFile.get(fileId); - const accessHandle = file.accessHandle || file.persistentFile.accessHandle; - const size = accessHandle.getSize(); - pSize64.setBigInt64(0, BigInt(size), true); - return VFS.SQLITE_OK; - } catch (e) { - this.lastError = e; - return VFS.SQLITE_IOERR_FSTAT; - } - } - - /** - * @param {number} fileId - * @param {number} lockType - * @returns {number} - */ - jLock(fileId, lockType) { - const file = this.mapIdToFile.get(fileId); - if (file.persistentFile.isRequestInProgress) { - file.persistentFile.isLockBusy = true; - return VFS.SQLITE_BUSY; - } - - file.persistentFile.isFileLocked = true; - if (!file.persistentFile.handleLockReleaser) { - // Start listening for notifications from other connections. - // This is before we actually get access handles, but waiting to - // listen until then allows a race condition where notifications - // are missed. - file.persistentFile.handleRequestChannel.onmessage = () => { - this.log?.(`received notification for ${file.path}`); - if (file.persistentFile.isFileLocked) { - // We're still using the access handle, so mark it to be - // released when we're done. - file.persistentFile.isHandleRequested = true; - } else { - // Release the access handles immediately. - this.#releaseAccessHandle(file); - } - file.persistentFile.handleRequestChannel.onmessage = null; - }; - - this.#requestAccessHandle(file); - this.log?.("returning SQLITE_BUSY"); - file.persistentFile.isLockBusy = true; - return VFS.SQLITE_BUSY; - } - file.persistentFile.isLockBusy = false; - return VFS.SQLITE_OK; - } - - /** - * @param {number} fileId - * @param {number} lockType - * @returns {number} - */ - jUnlock(fileId, lockType) { - const file = this.mapIdToFile.get(fileId); - if (lockType === VFS.SQLITE_LOCK_NONE) { - // Don't change any state if this unlock is because xLock returned - // SQLITE_BUSY. - if (!file.persistentFile.isLockBusy) { - if (file.persistentFile.isHandleRequested) { - // Another connection wants the access handle. - this.#releaseAccessHandle(file); - this.isHandleRequested = false; - } - file.persistentFile.isFileLocked = false; - } - } - return VFS.SQLITE_OK; - } - - /** - * @param {number} fileId - * @param {number} op - * @param {DataView} pArg - * @returns {number|Promise} - */ - jFileControl(fileId, op, pArg) { - try { - const file = this.mapIdToFile.get(fileId); - switch (op) { - case VFS.SQLITE_FCNTL_PRAGMA: - const key = extractString(pArg, 4); - const value = extractString(pArg, 8); - this.log?.("xFileControl", file.path, "PRAGMA", key, value); - switch (key.toLowerCase()) { - case "journal_mode": - if (value && !["off", "memory", "delete", "wal"].includes(value.toLowerCase())) { - throw new Error('journal_mode must be "off", "memory", "delete", or "wal"'); - } - break; - } - break; - } - } catch (e) { - this.lastError = e; - return VFS.SQLITE_IOERR; - } - return VFS.SQLITE_NOTFOUND; - } - - /** - * @param {Uint8Array} zBuf - * @returns - */ - jGetLastError(zBuf) { - if (this.lastError) { - console.error(this.lastError); - const outputArray = zBuf.subarray(0, zBuf.byteLength - 1); - const { written } = new TextEncoder().encodeInto(this.lastError.message, outputArray); - zBuf[written] = 0; - } - return VFS.SQLITE_OK; - } - - /** - * @param {FileSystemFileHandle} fileHandle - * @returns {Promise} - */ - async #createPersistentFile(fileHandle) { - const persistentFile = new PersistentFile(fileHandle); - const root = await navigator.storage.getDirectory(); - const relativePath = await root.resolve(fileHandle); - const path = `/${relativePath.join("/")}`; - persistentFile.handleRequestChannel = new BroadcastChannel(`ahp:${path}`); - this.persistentFiles.set(path, persistentFile); - - const f = await fileHandle.getFile(); - if (f.size) { - this.accessiblePaths.add(path); - } - return persistentFile; - } - - /** - * @param {File} file - */ - #requestAccessHandle(file) { - console.assert(!file.persistentFile.handleLockReleaser); - if (!file.persistentFile.isRequestInProgress) { - file.persistentFile.isRequestInProgress = true; - this._module.retryOps.push( - (async () => { - // Acquire the Web Lock. - file.persistentFile.handleLockReleaser = await this.#acquireLock(file.persistentFile); - - // Get access handles for the database and releated files in parallel. - this.log?.(`creating access handles for ${file.path}`); - await Promise.all( - DB_RELATED_FILE_SUFFIXES.map(async (suffix) => { - const persistentFile = this.persistentFiles.get(file.path + suffix); - if (persistentFile) { - persistentFile.accessHandle = await persistentFile.fileHandle.createSyncAccessHandle(); - } - }) - ); - file.persistentFile.isRequestInProgress = false; - })() - ); - return this._module.retryOps.at(-1); - } - return Promise.resolve(); - } - - /** - * @param {File} file - */ - async #releaseAccessHandle(file) { - DB_RELATED_FILE_SUFFIXES.forEach(async (suffix) => { - const persistentFile = this.persistentFiles.get(file.path + suffix); - if (persistentFile) { - persistentFile.accessHandle?.close(); - persistentFile.accessHandle = null; - } - }); - this.log?.(`access handles closed for ${file.path}`); - - file.persistentFile.handleLockReleaser?.(); - file.persistentFile.handleLockReleaser = null; - this.log?.(`lock released for ${file.path}`); - } - - /** - * @param {PersistentFile} persistentFile - * @returns {Promise} lock releaser - */ - #acquireLock(persistentFile) { - return new Promise((resolve) => { - // Tell other connections we want the access handle. - const lockName = persistentFile.handleRequestChannel.name; - const notify = () => { - this.log?.(`notifying for ${lockName}`); - persistentFile.handleRequestChannel.postMessage(null); - }; - const notifyId = setInterval(notify, LOCK_NOTIFY_INTERVAL); - setTimeout(notify); - - this.log?.(`lock requested: ${lockName}`); - navigator.locks.request(lockName, (lock) => { - // We have the lock. Stop asking other connections for it. - this.log?.(`lock acquired: ${lockName}`, lock); - clearInterval(notifyId); - return new Promise(resolve); - }); - }); - } -} - -function extractString(dataView, offset) { - const p = dataView.getUint32(offset, true); - if (p) { - const chars = new Uint8Array(dataView.buffer, p); - return new TextDecoder().decode(chars.subarray(0, chars.indexOf(0))); - } - return null; -} diff --git a/apps/web/core/local-db/worker/wa-sqlite/src/VFS.js b/apps/web/core/local-db/worker/wa-sqlite/src/VFS.js deleted file mode 100644 index 12966b9cfb..0000000000 --- a/apps/web/core/local-db/worker/wa-sqlite/src/VFS.js +++ /dev/null @@ -1,222 +0,0 @@ -// Copyright 2024 Roy T. Hashimoto. All Rights Reserved. -import * as VFS from './sqlite-constants.js'; -export * from './sqlite-constants.js'; - -const DEFAULT_SECTOR_SIZE = 512; - -// Base class for a VFS. -export class Base { - name; - mxPathname = 64; - _module; - - /** - * @param {string} name - * @param {object} module - */ - constructor(name, module) { - this.name = name; - this._module = module; - } - - /** - * @returns {void|Promise} - */ - close() { - } - - /** - * @returns {boolean|Promise} - */ - isReady() { - return true; - } - - /** - * Overload in subclasses to indicate which methods are asynchronous. - * @param {string} methodName - * @returns {boolean} - */ - hasAsyncMethod(methodName) { - return false; - } - - /** - * @param {number} pVfs - * @param {number} zName - * @param {number} pFile - * @param {number} flags - * @param {number} pOutFlags - * @returns {number|Promise} - */ - xOpen(pVfs, zName, pFile, flags, pOutFlags) { - return VFS.SQLITE_CANTOPEN; - } - - /** - * @param {number} pVfs - * @param {number} zName - * @param {number} syncDir - * @returns {number|Promise} - */ - xDelete(pVfs, zName, syncDir) { - return VFS.SQLITE_OK; - } - - /** - * @param {number} pVfs - * @param {number} zName - * @param {number} flags - * @param {number} pResOut - * @returns {number|Promise} - */ - xAccess(pVfs, zName, flags, pResOut) { - return VFS.SQLITE_OK; - } - - /** - * @param {number} pVfs - * @param {number} zName - * @param {number} nOut - * @param {number} zOut - * @returns {number|Promise} - */ - xFullPathname(pVfs, zName, nOut, zOut) { - return VFS.SQLITE_OK; - } - - /** - * @param {number} pVfs - * @param {number} nBuf - * @param {number} zBuf - * @returns {number|Promise} - */ - xGetLastError(pVfs, nBuf, zBuf) { - return VFS.SQLITE_OK; - } - - /** - * @param {number} pFile - * @returns {number|Promise} - */ - xClose(pFile) { - return VFS.SQLITE_OK; - } - - /** - * @param {number} pFile - * @param {number} pData - * @param {number} iAmt - * @param {number} iOffsetLo - * @param {number} iOffsetHi - * @returns {number|Promise} - */ - xRead(pFile, pData, iAmt, iOffsetLo, iOffsetHi) { - return VFS.SQLITE_OK; - } - - /** - * @param {number} pFile - * @param {number} pData - * @param {number} iAmt - * @param {number} iOffsetLo - * @param {number} iOffsetHi - * @returns {number|Promise} - */ - xWrite(pFile, pData, iAmt, iOffsetLo, iOffsetHi) { - return VFS.SQLITE_OK; - } - - /** - * @param {number} pFile - * @param {number} sizeLo - * @param {number} sizeHi - * @returns {number|Promise} - */ - xTruncate(pFile, sizeLo, sizeHi) { - return VFS.SQLITE_OK; - } - - /** - * @param {number} pFile - * @param {number} flags - * @returns {number|Promise} - */ - xSync(pFile, flags) { - return VFS.SQLITE_OK; - } - - /** - * - * @param {number} pFile - * @param {number} pSize - * @returns {number|Promise} - */ - xFileSize(pFile, pSize) { - return VFS.SQLITE_OK; - } - - /** - * @param {number} pFile - * @param {number} lockType - * @returns {number|Promise} - */ - xLock(pFile, lockType) { - return VFS.SQLITE_OK; - } - - /** - * @param {number} pFile - * @param {number} lockType - * @returns {number|Promise} - */ - xUnlock(pFile, lockType) { - return VFS.SQLITE_OK; - } - - /** - * @param {number} pFile - * @param {number} pResOut - * @returns {number|Promise} - */ - xCheckReservedLock(pFile, pResOut) { - return VFS.SQLITE_OK; - } - - /** - * @param {number} pFile - * @param {number} op - * @param {number} pArg - * @returns {number|Promise} - */ - xFileControl(pFile, op, pArg) { - return VFS.SQLITE_NOTFOUND; - } - - /** - * @param {number} pFile - * @returns {number|Promise} - */ - xSectorSize(pFile) { - return DEFAULT_SECTOR_SIZE; - } - - /** - * @param {number} pFile - * @returns {number|Promise} - */ - xDeviceCharacteristics(pFile) { - return 0; - } -} - -export const FILE_TYPE_MASK = [ - VFS.SQLITE_OPEN_MAIN_DB, - VFS.SQLITE_OPEN_MAIN_JOURNAL, - VFS.SQLITE_OPEN_TEMP_DB, - VFS.SQLITE_OPEN_TEMP_JOURNAL, - VFS.SQLITE_OPEN_TRANSIENT_DB, - VFS.SQLITE_OPEN_SUBJOURNAL, - VFS.SQLITE_OPEN_SUPER_JOURNAL, - VFS.SQLITE_OPEN_WAL -].reduce((mask, element) => mask | element); \ No newline at end of file diff --git a/apps/web/core/local-db/worker/wa-sqlite/src/sqlite-api.js b/apps/web/core/local-db/worker/wa-sqlite/src/sqlite-api.js deleted file mode 100644 index 500980b4ec..0000000000 --- a/apps/web/core/local-db/worker/wa-sqlite/src/sqlite-api.js +++ /dev/null @@ -1,899 +0,0 @@ -// Copyright 2021 Roy T. Hashimoto. All Rights Reserved. - -import * as SQLite from "./sqlite-constants.js"; -export * from "./sqlite-constants.js"; - -const MAX_INT64 = 0x7fffffffffffffffn; -const MIN_INT64 = -0x8000000000000000n; - -const AsyncFunction = Object.getPrototypeOf(async function () {}).constructor; - -export class SQLiteError extends Error { - constructor(message, code) { - super(message); - this.code = code; - } -} - -const async = true; - -/** - * Builds a Javascript API from the Emscripten module. This API is still - * low-level and closely corresponds to the C API exported by the module, - * but differs in some specifics like throwing exceptions on errors. - * @param {*} Module SQLite Emscripten module - * @returns {SQLiteAPI} - */ -export function Factory(Module) { - /** @type {SQLiteAPI} */ const sqlite3 = {}; - - Module.retryOps = []; - const sqliteFreeAddress = Module._getSqliteFree(); - - // Allocate some space for 32-bit returned values. - const tmp = Module._malloc(8); - const tmpPtr = [tmp, tmp + 4]; - - // Convert a JS string to a C string. sqlite3_malloc is used to allocate - // memory (use sqlite3_free to deallocate). - function createUTF8(s) { - if (typeof s !== "string") return 0; - const utf8 = new TextEncoder().encode(s); - const zts = Module._sqlite3_malloc(utf8.byteLength + 1); - Module.HEAPU8.set(utf8, zts); - Module.HEAPU8[zts + utf8.byteLength] = 0; - return zts; - } - - /** - * Concatenate 32-bit numbers into a 64-bit (signed) BigInt. - * @param {number} lo32 - * @param {number} hi32 - * @returns {bigint} - */ - function cvt32x2ToBigInt(lo32, hi32) { - return (BigInt(hi32) << 32n) | (BigInt(lo32) & 0xffffffffn); - } - - /** - * Concatenate 32-bit numbers and return as number or BigInt, depending - * on the value. - * @param {number} lo32 - * @param {number} hi32 - * @returns {number|bigint} - */ - const cvt32x2AsSafe = (function () { - const hiMax = BigInt(Number.MAX_SAFE_INTEGER) >> 32n; - const hiMin = BigInt(Number.MIN_SAFE_INTEGER) >> 32n; - - return function (lo32, hi32) { - if (hi32 > hiMax || hi32 < hiMin) { - // Can't be expressed as a Number so use BigInt. - return cvt32x2ToBigInt(lo32, hi32); - } else { - // Combine the upper and lower 32-bit numbers. The complication is - // that lo32 is a signed integer which makes manipulating its bits - // a little tricky - the sign bit gets handled separately. - return hi32 * 0x100000000 + (lo32 & 0x7fffffff) - (lo32 & 0x80000000); - } - }; - })(); - - const databases = new Set(); - function verifyDatabase(db) { - if (!databases.has(db)) { - throw new SQLiteError("not a database", SQLite.SQLITE_MISUSE); - } - } - - const mapStmtToDB = new Map(); - function verifyStatement(stmt) { - if (!mapStmtToDB.has(stmt)) { - throw new SQLiteError("not a statement", SQLite.SQLITE_MISUSE); - } - } - - sqlite3.bind_collection = function (stmt, bindings) { - verifyStatement(stmt); - const isArray = Array.isArray(bindings); - const nBindings = sqlite3.bind_parameter_count(stmt); - for (let i = 1; i <= nBindings; ++i) { - const key = isArray ? i - 1 : sqlite3.bind_parameter_name(stmt, i); - const value = bindings[key]; - if (value !== undefined) { - sqlite3.bind(stmt, i, value); - } - } - return SQLite.SQLITE_OK; - }; - - sqlite3.bind = function (stmt, i, value) { - verifyStatement(stmt); - switch (typeof value) { - case "number": - if (value === (value | 0)) { - return sqlite3.bind_int(stmt, i, value); - } else { - return sqlite3.bind_double(stmt, i, value); - } - case "string": - return sqlite3.bind_text(stmt, i, value); - default: - if (value instanceof Uint8Array || Array.isArray(value)) { - return sqlite3.bind_blob(stmt, i, value); - } else if (value === null) { - return sqlite3.bind_null(stmt, i); - } else if (typeof value === "bigint") { - return sqlite3.bind_int64(stmt, i, value); - } else if (value === undefined) { - // Existing binding (or NULL) will be used. - return SQLite.SQLITE_NOTICE; - } else { - console.warn("unknown binding converted to null", value); - return sqlite3.bind_null(stmt, i); - } - } - }; - - sqlite3.bind_blob = (function () { - const fname = "sqlite3_bind_blob"; - const f = Module.cwrap(fname, ...decl("nnnnn:n")); - return function (stmt, i, value) { - verifyStatement(stmt); - // @ts-ignore - const byteLength = value.byteLength ?? value.length; - const ptr = Module._sqlite3_malloc(byteLength); - Module.HEAPU8.subarray(ptr).set(value); - const result = f(stmt, i, ptr, byteLength, sqliteFreeAddress); - return check(fname, result, mapStmtToDB.get(stmt)); - }; - })(); - - sqlite3.bind_parameter_count = (function () { - const fname = "sqlite3_bind_parameter_count"; - const f = Module.cwrap(fname, ...decl("n:n")); - return function (stmt) { - verifyStatement(stmt); - const result = f(stmt); - return result; - }; - })(); - - sqlite3.bind_double = (function () { - const fname = "sqlite3_bind_double"; - const f = Module.cwrap(fname, ...decl("nnn:n")); - return function (stmt, i, value) { - verifyStatement(stmt); - const result = f(stmt, i, value); - return check(fname, result, mapStmtToDB.get(stmt)); - }; - })(); - - sqlite3.bind_int = (function () { - const fname = "sqlite3_bind_int"; - const f = Module.cwrap(fname, ...decl("nnn:n")); - return function (stmt, i, value) { - verifyStatement(stmt); - if (value > 0x7fffffff || value < -0x80000000) return SQLite.SQLITE_RANGE; - - const result = f(stmt, i, value); - return check(fname, result, mapStmtToDB.get(stmt)); - }; - })(); - - sqlite3.bind_int64 = (function () { - const fname = "sqlite3_bind_int64"; - const f = Module.cwrap(fname, ...decl("nnnn:n")); - return function (stmt, i, value) { - verifyStatement(stmt); - if (value > MAX_INT64 || value < MIN_INT64) return SQLite.SQLITE_RANGE; - - const lo32 = value & 0xffffffffn; - const hi32 = value >> 32n; - const result = f(stmt, i, Number(lo32), Number(hi32)); - return check(fname, result, mapStmtToDB.get(stmt)); - }; - })(); - - sqlite3.bind_null = (function () { - const fname = "sqlite3_bind_null"; - const f = Module.cwrap(fname, ...decl("nn:n")); - return function (stmt, i) { - verifyStatement(stmt); - const result = f(stmt, i); - return check(fname, result, mapStmtToDB.get(stmt)); - }; - })(); - - sqlite3.bind_parameter_name = (function () { - const fname = "sqlite3_bind_parameter_name"; - const f = Module.cwrap(fname, ...decl("n:s")); - return function (stmt, i) { - verifyStatement(stmt); - const result = f(stmt, i); - return result; - }; - })(); - - sqlite3.bind_text = (function () { - const fname = "sqlite3_bind_text"; - const f = Module.cwrap(fname, ...decl("nnnnn:n")); - return function (stmt, i, value) { - verifyStatement(stmt); - const ptr = createUTF8(value); - const result = f(stmt, i, ptr, -1, sqliteFreeAddress); - return check(fname, result, mapStmtToDB.get(stmt)); - }; - })(); - - sqlite3.changes = (function () { - const fname = "sqlite3_changes"; - const f = Module.cwrap(fname, ...decl("n:n")); - return function (db) { - verifyDatabase(db); - const result = f(db); - return result; - }; - })(); - - sqlite3.clear_bindings = (function () { - const fname = "sqlite3_clear_bindings"; - const f = Module.cwrap(fname, ...decl("n:n")); - return function (stmt) { - verifyStatement(stmt); - const result = f(stmt); - return check(fname, result, mapStmtToDB.get(stmt)); - }; - })(); - - sqlite3.close = (function () { - const fname = "sqlite3_close"; - const f = Module.cwrap(fname, ...decl("n:n"), { async }); - return async function (db) { - verifyDatabase(db); - const result = await f(db); - databases.delete(db); - return check(fname, result, db); - }; - })(); - - sqlite3.column = function (stmt, iCol) { - verifyStatement(stmt); - const type = sqlite3.column_type(stmt, iCol); - switch (type) { - case SQLite.SQLITE_BLOB: - return sqlite3.column_blob(stmt, iCol); - case SQLite.SQLITE_FLOAT: - return sqlite3.column_double(stmt, iCol); - case SQLite.SQLITE_INTEGER: - const lo32 = sqlite3.column_int(stmt, iCol); - const hi32 = Module.getTempRet0(); - return cvt32x2AsSafe(lo32, hi32); - case SQLite.SQLITE_NULL: - return null; - case SQLite.SQLITE_TEXT: - return sqlite3.column_text(stmt, iCol); - default: - throw new SQLiteError("unknown type", type); - } - }; - - sqlite3.column_blob = (function () { - const fname = "sqlite3_column_blob"; - const f = Module.cwrap(fname, ...decl("nn:n")); - return function (stmt, iCol) { - verifyStatement(stmt); - const nBytes = sqlite3.column_bytes(stmt, iCol); - const address = f(stmt, iCol); - const result = Module.HEAPU8.subarray(address, address + nBytes); - return result; - }; - })(); - - sqlite3.column_bytes = (function () { - const fname = "sqlite3_column_bytes"; - const f = Module.cwrap(fname, ...decl("nn:n")); - return function (stmt, iCol) { - verifyStatement(stmt); - const result = f(stmt, iCol); - return result; - }; - })(); - - sqlite3.column_count = (function () { - const fname = "sqlite3_column_count"; - const f = Module.cwrap(fname, ...decl("n:n")); - return function (stmt) { - verifyStatement(stmt); - const result = f(stmt); - return result; - }; - })(); - - sqlite3.column_double = (function () { - const fname = "sqlite3_column_double"; - const f = Module.cwrap(fname, ...decl("nn:n")); - return function (stmt, iCol) { - verifyStatement(stmt); - const result = f(stmt, iCol); - return result; - }; - })(); - - sqlite3.column_int = (function () { - // Retrieve int64 but use only the lower 32 bits. The upper 32-bits are - // accessible with Module.getTempRet0(). - const fname = "sqlite3_column_int64"; - const f = Module.cwrap(fname, ...decl("nn:n")); - return function (stmt, iCol) { - verifyStatement(stmt); - const result = f(stmt, iCol); - return result; - }; - })(); - - sqlite3.column_int64 = (function () { - const fname = "sqlite3_column_int64"; - const f = Module.cwrap(fname, ...decl("nn:n")); - return function (stmt, iCol) { - verifyStatement(stmt); - const lo32 = f(stmt, iCol); - const hi32 = Module.getTempRet0(); - const result = cvt32x2ToBigInt(lo32, hi32); - return result; - }; - })(); - - sqlite3.column_name = (function () { - const fname = "sqlite3_column_name"; - const f = Module.cwrap(fname, ...decl("nn:s")); - return function (stmt, iCol) { - verifyStatement(stmt); - const result = f(stmt, iCol); - return result; - }; - })(); - - sqlite3.column_names = function (stmt) { - const columns = []; - const nColumns = sqlite3.column_count(stmt); - for (let i = 0; i < nColumns; ++i) { - columns.push(sqlite3.column_name(stmt, i)); - } - return columns; - }; - - sqlite3.column_text = (function () { - const fname = "sqlite3_column_text"; - const f = Module.cwrap(fname, ...decl("nn:s")); - return function (stmt, iCol) { - verifyStatement(stmt); - const result = f(stmt, iCol); - return result; - }; - })(); - - sqlite3.column_type = (function () { - const fname = "sqlite3_column_type"; - const f = Module.cwrap(fname, ...decl("nn:n")); - return function (stmt, iCol) { - verifyStatement(stmt); - const result = f(stmt, iCol); - return result; - }; - })(); - - sqlite3.create_function = function (db, zFunctionName, nArg, eTextRep, pApp, xFunc, xStep, xFinal) { - verifyDatabase(db); - - // Convert SQLite callback arguments to JavaScript-friendly arguments. - function adapt(f) { - return f instanceof AsyncFunction - ? async (ctx, n, values) => f(ctx, Module.HEAP32.subarray(values / 4, values / 4 + n)) - : (ctx, n, values) => f(ctx, Module.HEAP32.subarray(values / 4, values / 4 + n)); - } - - const result = Module.create_function( - db, - zFunctionName, - nArg, - eTextRep, - pApp, - xFunc && adapt(xFunc), - xStep && adapt(xStep), - xFinal - ); - return check("sqlite3_create_function", result, db); - }; - - sqlite3.data_count = (function () { - const fname = "sqlite3_data_count"; - const f = Module.cwrap(fname, ...decl("n:n")); - return function (stmt) { - verifyStatement(stmt); - const result = f(stmt); - return result; - }; - })(); - - sqlite3.exec = async function (db, sql, callback) { - for await (const stmt of sqlite3.statements(db, sql)) { - let columns; - while ((await sqlite3.step(stmt)) === SQLite.SQLITE_ROW) { - if (callback) { - columns = columns ?? sqlite3.column_names(stmt); - const row = sqlite3.row(stmt); - await callback(row, columns); - } - } - } - return SQLite.SQLITE_OK; - }; - - sqlite3.finalize = (function () { - const fname = "sqlite3_finalize"; - const f = Module.cwrap(fname, ...decl("n:n"), { async }); - return async function (stmt) { - const result = await f(stmt); - mapStmtToDB.delete(stmt); - - // Don't throw on error here. Typically the error has already been - // thrown and finalize() is part of the cleanup. - return result; - }; - })(); - - sqlite3.get_autocommit = (function () { - const fname = "sqlite3_get_autocommit"; - const f = Module.cwrap(fname, ...decl("n:n")); - return function (db) { - const result = f(db); - return result; - }; - })(); - - sqlite3.libversion = (function () { - const fname = "sqlite3_libversion"; - const f = Module.cwrap(fname, ...decl(":s")); - return function () { - const result = f(); - return result; - }; - })(); - - sqlite3.libversion_number = (function () { - const fname = "sqlite3_libversion_number"; - const f = Module.cwrap(fname, ...decl(":n")); - return function () { - const result = f(); - return result; - }; - })(); - - sqlite3.limit = (function () { - const fname = "sqlite3_limit"; - const f = Module.cwrap(fname, ...decl("nnn:n")); - return function (db, id, newVal) { - const result = f(db, id, newVal); - return result; - }; - })(); - - sqlite3.open_v2 = (function () { - const fname = "sqlite3_open_v2"; - const f = Module.cwrap(fname, ...decl("snnn:n"), { async }); - return async function (zFilename, flags, zVfs) { - flags = flags || SQLite.SQLITE_OPEN_CREATE | SQLite.SQLITE_OPEN_READWRITE; - zVfs = createUTF8(zVfs); - try { - // Allow retry operations. - const rc = await retry(() => f(zFilename, tmpPtr[0], flags, zVfs)); - - const db = Module.getValue(tmpPtr[0], "*"); - databases.add(db); - - Module.ccall("RegisterExtensionFunctions", "void", ["number"], [db]); - check(fname, rc); - return db; - } finally { - Module._sqlite3_free(zVfs); - } - }; - })(); - - sqlite3.progress_handler = function (db, nProgressOps, handler, userData) { - verifyDatabase(db); - Module.progress_handler(db, nProgressOps, handler, userData); - }; - - sqlite3.reset = (function () { - const fname = "sqlite3_reset"; - const f = Module.cwrap(fname, ...decl("n:n"), { async }); - return async function (stmt) { - verifyStatement(stmt); - const result = await f(stmt); - return check(fname, result, mapStmtToDB.get(stmt)); - }; - })(); - - sqlite3.result = function (context, value) { - switch (typeof value) { - case "number": - if (value === (value | 0)) { - sqlite3.result_int(context, value); - } else { - sqlite3.result_double(context, value); - } - break; - case "string": - sqlite3.result_text(context, value); - break; - default: - if (value instanceof Uint8Array || Array.isArray(value)) { - sqlite3.result_blob(context, value); - } else if (value === null) { - sqlite3.result_null(context); - } else if (typeof value === "bigint") { - return sqlite3.result_int64(context, value); - } else { - console.warn("unknown result converted to null", value); - sqlite3.result_null(context); - } - break; - } - }; - - sqlite3.result_blob = (function () { - const fname = "sqlite3_result_blob"; - const f = Module.cwrap(fname, ...decl("nnnn:n")); - return function (context, value) { - // @ts-ignore - const byteLength = value.byteLength ?? value.length; - const ptr = Module._sqlite3_malloc(byteLength); - Module.HEAPU8.subarray(ptr).set(value); - f(context, ptr, byteLength, sqliteFreeAddress); // void return - }; - })(); - - sqlite3.result_double = (function () { - const fname = "sqlite3_result_double"; - const f = Module.cwrap(fname, ...decl("nn:n")); - return function (context, value) { - f(context, value); // void return - }; - })(); - - sqlite3.result_int = (function () { - const fname = "sqlite3_result_int"; - const f = Module.cwrap(fname, ...decl("nn:n")); - return function (context, value) { - f(context, value); // void return - }; - })(); - - sqlite3.result_int64 = (function () { - const fname = "sqlite3_result_int64"; - const f = Module.cwrap(fname, ...decl("nnn:n")); - return function (context, value) { - if (value > MAX_INT64 || value < MIN_INT64) return SQLite.SQLITE_RANGE; - - const lo32 = value & 0xffffffffn; - const hi32 = value >> 32n; - f(context, Number(lo32), Number(hi32)); // void return - }; - })(); - - sqlite3.result_null = (function () { - const fname = "sqlite3_result_null"; - const f = Module.cwrap(fname, ...decl("n:n")); - return function (context) { - f(context); // void return - }; - })(); - - sqlite3.result_text = (function () { - const fname = "sqlite3_result_text"; - const f = Module.cwrap(fname, ...decl("nnnn:n")); - return function (context, value) { - const ptr = createUTF8(value); - f(context, ptr, -1, sqliteFreeAddress); // void return - }; - })(); - - sqlite3.row = function (stmt) { - const row = []; - const nColumns = sqlite3.data_count(stmt); - for (let i = 0; i < nColumns; ++i) { - const value = sqlite3.column(stmt, i); - - // Copy blob if aliasing volatile WebAssembly memory. This avoids an - // unnecessary copy if users monkey patch column_blob to copy. - // @ts-ignore - row.push(value?.buffer === Module.HEAPU8.buffer ? value.slice() : value); - } - return row; - }; - - sqlite3.set_authorizer = function (db, xAuth, pApp) { - verifyDatabase(db); - - // Convert SQLite callback arguments to JavaScript-friendly arguments. - function cvtArgs(_, iAction, p3, p4, p5, p6) { - return [ - _, - iAction, - Module.UTF8ToString(p3), - Module.UTF8ToString(p4), - Module.UTF8ToString(p5), - Module.UTF8ToString(p6), - ]; - } - function adapt(f) { - return f instanceof AsyncFunction - ? async (_, iAction, p3, p4, p5, p6) => f(...cvtArgs(_, iAction, p3, p4, p5, p6)) - : (_, iAction, p3, p4, p5, p6) => f(...cvtArgs(_, iAction, p3, p4, p5, p6)); - } - - const result = Module.set_authorizer(db, adapt(xAuth), pApp); - return check("sqlite3_set_authorizer", result, db); - }; - - sqlite3.sql = (function () { - const fname = "sqlite3_sql"; - const f = Module.cwrap(fname, ...decl("n:s")); - return function (stmt) { - verifyStatement(stmt); - const result = f(stmt); - return result; - }; - })(); - - sqlite3.statements = function (db, sql, options = {}) { - const prepare = Module.cwrap( - "sqlite3_prepare_v3", - "number", - ["number", "number", "number", "number", "number", "number"], - { async: true } - ); - - return (async function* () { - const onFinally = []; - try { - // Encode SQL string to UTF-8. - const utf8 = new TextEncoder().encode(sql); - - // Copy encoded string to WebAssembly memory. The SQLite docs say - // zero-termination is a minor optimization so add room for that. - // Also add space for the statement handle and SQL tail pointer. - const allocSize = utf8.byteLength - (utf8.byteLength % 4) + 12; - const pzHead = Module._sqlite3_malloc(allocSize); - const pzEnd = pzHead + utf8.byteLength + 1; - onFinally.push(() => Module._sqlite3_free(pzHead)); - Module.HEAPU8.set(utf8, pzHead); - Module.HEAPU8[pzEnd - 1] = 0; - - // Use extra space for the statement handle and SQL tail pointer. - const pStmt = pzHead + allocSize - 8; - const pzTail = pzHead + allocSize - 4; - - // Ensure that statement handles are not leaked. - let stmt; - function maybeFinalize() { - if (stmt && !options.unscoped) { - sqlite3.finalize(stmt); - } - stmt = 0; - } - onFinally.push(maybeFinalize); - - // Loop over statements. - Module.setValue(pzTail, pzHead, "*"); - do { - // Reclaim resources for the previous iteration. - maybeFinalize(); - - // Call sqlite3_prepare_v3() for the next statement. - // Allow retry operations. - const zTail = Module.getValue(pzTail, "*"); - const rc = await retry(() => { - return prepare(db, zTail, pzEnd - pzTail, options.flags || 0, pStmt, pzTail); - }); - - if (rc !== SQLite.SQLITE_OK) { - check("sqlite3_prepare_v3", rc, db); - } - - stmt = Module.getValue(pStmt, "*"); - if (stmt) { - mapStmtToDB.set(stmt, db); - yield stmt; - } - } while (stmt); - } finally { - while (onFinally.length) { - onFinally.pop()(); - } - } - })(); - }; - - sqlite3.step = (function () { - const fname = "sqlite3_step"; - const f = Module.cwrap(fname, ...decl("n:n"), { async }); - return async function (stmt) { - verifyStatement(stmt); - - // Allow retry operations. - const rc = await retry(() => f(stmt)); - - return check(fname, rc, mapStmtToDB.get(stmt), [SQLite.SQLITE_ROW, SQLite.SQLITE_DONE]); - }; - })(); - - sqlite3.update_hook = function (db, xUpdateHook) { - verifyDatabase(db); - - // Convert SQLite callback arguments to JavaScript-friendly arguments. - function cvtArgs(iUpdateType, dbName, tblName, lo32, hi32) { - return [iUpdateType, Module.UTF8ToString(dbName), Module.UTF8ToString(tblName), cvt32x2ToBigInt(lo32, hi32)]; - } - function adapt(f) { - return f instanceof AsyncFunction - ? async (iUpdateType, dbName, tblName, lo32, hi32) => f(...cvtArgs(iUpdateType, dbName, tblName, lo32, hi32)) - : (iUpdateType, dbName, tblName, lo32, hi32) => f(...cvtArgs(iUpdateType, dbName, tblName, lo32, hi32)); - } - - Module.update_hook(db, adapt(xUpdateHook)); - }; - - sqlite3.value = function (pValue) { - const type = sqlite3.value_type(pValue); - switch (type) { - case SQLite.SQLITE_BLOB: - return sqlite3.value_blob(pValue); - case SQLite.SQLITE_FLOAT: - return sqlite3.value_double(pValue); - case SQLite.SQLITE_INTEGER: - const lo32 = sqlite3.value_int(pValue); - const hi32 = Module.getTempRet0(); - return cvt32x2AsSafe(lo32, hi32); - case SQLite.SQLITE_NULL: - return null; - case SQLite.SQLITE_TEXT: - return sqlite3.value_text(pValue); - default: - throw new SQLiteError("unknown type", type); - } - }; - - sqlite3.value_blob = (function () { - const fname = "sqlite3_value_blob"; - const f = Module.cwrap(fname, ...decl("n:n")); - return function (pValue) { - const nBytes = sqlite3.value_bytes(pValue); - const address = f(pValue); - const result = Module.HEAPU8.subarray(address, address + nBytes); - return result; - }; - })(); - - sqlite3.value_bytes = (function () { - const fname = "sqlite3_value_bytes"; - const f = Module.cwrap(fname, ...decl("n:n")); - return function (pValue) { - const result = f(pValue); - return result; - }; - })(); - - sqlite3.value_double = (function () { - const fname = "sqlite3_value_double"; - const f = Module.cwrap(fname, ...decl("n:n")); - return function (pValue) { - const result = f(pValue); - return result; - }; - })(); - - sqlite3.value_int = (function () { - const fname = "sqlite3_value_int64"; - const f = Module.cwrap(fname, ...decl("n:n")); - return function (pValue) { - const result = f(pValue); - return result; - }; - })(); - - sqlite3.value_int64 = (function () { - const fname = "sqlite3_value_int64"; - const f = Module.cwrap(fname, ...decl("n:n")); - return function (pValue) { - const lo32 = f(pValue); - const hi32 = Module.getTempRet0(); - const result = cvt32x2ToBigInt(lo32, hi32); - return result; - }; - })(); - - sqlite3.value_text = (function () { - const fname = "sqlite3_value_text"; - const f = Module.cwrap(fname, ...decl("n:s")); - return function (pValue) { - const result = f(pValue); - return result; - }; - })(); - - sqlite3.value_type = (function () { - const fname = "sqlite3_value_type"; - const f = Module.cwrap(fname, ...decl("n:n")); - return function (pValue) { - const result = f(pValue); - return result; - }; - })(); - - sqlite3.vfs_register = function (vfs, makeDefault) { - const result = Module.vfs_register(vfs, makeDefault); - return check("sqlite3_vfs_register", result); - }; - - function check(fname, result, db = null, allowed = [SQLite.SQLITE_OK]) { - if (allowed.includes(result)) return result; - const message = db ? Module.ccall("sqlite3_errmsg", "string", ["number"], [db]) : fname; - throw new SQLiteError(message, result); - } - - // This function is used to automatically retry failed calls that - // have pending retry operations that should allow the retry to - // succeed. - async function retry(f) { - let rc; - do { - // Wait for all pending retry operations to complete. This is - // normally empty on the first loop iteration. - if (Module.retryOps.length) { - await Promise.all(Module.retryOps); - Module.retryOps = []; - } - - rc = await f(); - - // Retry on failure with new pending retry operations. - } while (rc && Module.retryOps.length); - return rc; - } - - return sqlite3; -} - -// Helper function to use a more compact signature specification. -function decl(s) { - const result = []; - const m = s.match(/([ns@]*):([nsv@])/); - switch (m[2]) { - case "n": - result.push("number"); - break; - case "s": - result.push("string"); - break; - case "v": - result.push(null); - break; - } - - const args = []; - for (let c of m[1]) { - switch (c) { - case "n": - args.push("number"); - break; - case "s": - args.push("string"); - break; - } - } - result.push(args); - return result; -} diff --git a/apps/web/core/local-db/worker/wa-sqlite/src/sqlite-constants.js b/apps/web/core/local-db/worker/wa-sqlite/src/sqlite-constants.js deleted file mode 100644 index 3878b16963..0000000000 --- a/apps/web/core/local-db/worker/wa-sqlite/src/sqlite-constants.js +++ /dev/null @@ -1,275 +0,0 @@ -// Primary result codes. -// https://www.sqlite.org/rescode.html -export const SQLITE_OK = 0; -export const SQLITE_ERROR = 1; -export const SQLITE_INTERNAL = 2; -export const SQLITE_PERM = 3; -export const SQLITE_ABORT = 4; -export const SQLITE_BUSY = 5; -export const SQLITE_LOCKED = 6; -export const SQLITE_NOMEM = 7; -export const SQLITE_READONLY = 8; -export const SQLITE_INTERRUPT = 9; -export const SQLITE_IOERR = 10; -export const SQLITE_CORRUPT = 11; -export const SQLITE_NOTFOUND = 12; -export const SQLITE_FULL = 13; -export const SQLITE_CANTOPEN = 14; -export const SQLITE_PROTOCOL = 15; -export const SQLITE_EMPTY = 16; -export const SQLITE_SCHEMA = 17; -export const SQLITE_TOOBIG = 18; -export const SQLITE_CONSTRAINT = 19; -export const SQLITE_MISMATCH = 20; -export const SQLITE_MISUSE = 21; -export const SQLITE_NOLFS = 22; -export const SQLITE_AUTH = 23; -export const SQLITE_FORMAT = 24; -export const SQLITE_RANGE = 25; -export const SQLITE_NOTADB = 26; -export const SQLITE_NOTICE = 27; -export const SQLITE_WARNING = 28; -export const SQLITE_ROW = 100; -export const SQLITE_DONE = 101; - -// Extended error codes. -export const SQLITE_IOERR_ACCESS = 3338; -export const SQLITE_IOERR_CHECKRESERVEDLOCK = 3594; -export const SQLITE_IOERR_CLOSE = 4106; -export const SQLITE_IOERR_DATA = 8202; -export const SQLITE_IOERR_DELETE = 2570; -export const SQLITE_IOERR_DELETE_NOENT = 5898; -export const SQLITE_IOERR_DIR_FSYNC = 1290; -export const SQLITE_IOERR_FSTAT = 1802; -export const SQLITE_IOERR_FSYNC = 1034; -export const SQLITE_IOERR_GETTEMPPATH = 6410; -export const SQLITE_IOERR_LOCK = 3850; -export const SQLITE_IOERR_NOMEM = 3082; -export const SQLITE_IOERR_READ = 266; -export const SQLITE_IOERR_RDLOCK = 2314; -export const SQLITE_IOERR_SEEK = 5642; -export const SQLITE_IOERR_SHORT_READ = 522; -export const SQLITE_IOERR_TRUNCATE = 1546; -export const SQLITE_IOERR_UNLOCK = 2058; -export const SQLITE_IOERR_VNODE = 6922; -export const SQLITE_IOERR_WRITE = 778; -export const SQLITE_IOERR_BEGIN_ATOMIC = 7434; -export const SQLITE_IOERR_COMMIT_ATOMIC = 7690; -export const SQLITE_IOERR_ROLLBACK_ATOMIC = 7946; - -// Other extended result codes. -export const SQLITE_CONSTRAINT_CHECK = 275; -export const SQLITE_CONSTRAINT_COMMITHOOK = 531; -export const SQLITE_CONSTRAINT_FOREIGNKEY = 787; -export const SQLITE_CONSTRAINT_FUNCTION = 1043; -export const SQLITE_CONSTRAINT_NOTNULL = 1299; -export const SQLITE_CONSTRAINT_PINNED = 2835; -export const SQLITE_CONSTRAINT_PRIMARYKEY = 1555; -export const SQLITE_CONSTRAINT_ROWID = 2579; -export const SQLITE_CONSTRAINT_TRIGGER = 1811; -export const SQLITE_CONSTRAINT_UNIQUE = 2067; -export const SQLITE_CONSTRAINT_VTAB = 2323; - -// Open flags. -// https://www.sqlite.org/c3ref/c_open_autoproxy.html -export const SQLITE_OPEN_READONLY = 0x00000001; -export const SQLITE_OPEN_READWRITE = 0x00000002; -export const SQLITE_OPEN_CREATE = 0x00000004; -export const SQLITE_OPEN_DELETEONCLOSE = 0x00000008; -export const SQLITE_OPEN_EXCLUSIVE = 0x00000010; -export const SQLITE_OPEN_AUTOPROXY = 0x00000020; -export const SQLITE_OPEN_URI = 0x00000040; -export const SQLITE_OPEN_MEMORY = 0x00000080; -export const SQLITE_OPEN_MAIN_DB = 0x00000100; -export const SQLITE_OPEN_TEMP_DB = 0x00000200; -export const SQLITE_OPEN_TRANSIENT_DB = 0x00000400; -export const SQLITE_OPEN_MAIN_JOURNAL = 0x00000800; -export const SQLITE_OPEN_TEMP_JOURNAL = 0x00001000; -export const SQLITE_OPEN_SUBJOURNAL = 0x00002000; -export const SQLITE_OPEN_SUPER_JOURNAL = 0x00004000; -export const SQLITE_OPEN_NOMUTEX = 0x00008000; -export const SQLITE_OPEN_FULLMUTEX = 0x00010000; -export const SQLITE_OPEN_SHAREDCACHE = 0x00020000; -export const SQLITE_OPEN_PRIVATECACHE = 0x00040000; -export const SQLITE_OPEN_WAL = 0x00080000; -export const SQLITE_OPEN_NOFOLLOW = 0x01000000; - -// Locking levels. -// https://www.sqlite.org/c3ref/c_lock_exclusive.html -export const SQLITE_LOCK_NONE = 0; -export const SQLITE_LOCK_SHARED = 1; -export const SQLITE_LOCK_RESERVED = 2; -export const SQLITE_LOCK_PENDING = 3; -export const SQLITE_LOCK_EXCLUSIVE = 4; - -// Device characteristics. -// https://www.sqlite.org/c3ref/c_iocap_atomic.html -export const SQLITE_IOCAP_ATOMIC = 0x00000001; -export const SQLITE_IOCAP_ATOMIC512 = 0x00000002; -export const SQLITE_IOCAP_ATOMIC1K = 0x00000004; -export const SQLITE_IOCAP_ATOMIC2K = 0x00000008; -export const SQLITE_IOCAP_ATOMIC4K = 0x00000010; -export const SQLITE_IOCAP_ATOMIC8K = 0x00000020; -export const SQLITE_IOCAP_ATOMIC16K = 0x00000040; -export const SQLITE_IOCAP_ATOMIC32K = 0x00000080; -export const SQLITE_IOCAP_ATOMIC64K = 0x00000100; -export const SQLITE_IOCAP_SAFE_APPEND = 0x00000200; -export const SQLITE_IOCAP_SEQUENTIAL = 0x00000400; -export const SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN = 0x00000800; -export const SQLITE_IOCAP_POWERSAFE_OVERWRITE = 0x00001000; -export const SQLITE_IOCAP_IMMUTABLE = 0x00002000; -export const SQLITE_IOCAP_BATCH_ATOMIC = 0x00004000; - -// xAccess flags. -// https://www.sqlite.org/c3ref/c_access_exists.html -export const SQLITE_ACCESS_EXISTS = 0; -export const SQLITE_ACCESS_READWRITE = 1; -export const SQLITE_ACCESS_READ = 2; - -// File control opcodes -// https://www.sqlite.org/c3ref/c_fcntl_begin_atomic_write.html#sqlitefcntlbeginatomicwrite -export const SQLITE_FCNTL_LOCKSTATE = 1; -export const SQLITE_FCNTL_GET_LOCKPROXYFILE = 2; -export const SQLITE_FCNTL_SET_LOCKPROXYFILE = 3; -export const SQLITE_FCNTL_LAST_ERRNO = 4; -export const SQLITE_FCNTL_SIZE_HINT = 5; -export const SQLITE_FCNTL_CHUNK_SIZE = 6; -export const SQLITE_FCNTL_FILE_POINTER = 7; -export const SQLITE_FCNTL_SYNC_OMITTED = 8; -export const SQLITE_FCNTL_WIN32_AV_RETRY = 9; -export const SQLITE_FCNTL_PERSIST_WAL = 10; -export const SQLITE_FCNTL_OVERWRITE = 11; -export const SQLITE_FCNTL_VFSNAME = 12; -export const SQLITE_FCNTL_POWERSAFE_OVERWRITE = 13; -export const SQLITE_FCNTL_PRAGMA = 14; -export const SQLITE_FCNTL_BUSYHANDLER = 15; -export const SQLITE_FCNTL_TEMPFILENAME = 16; -export const SQLITE_FCNTL_MMAP_SIZE = 18; -export const SQLITE_FCNTL_TRACE = 19; -export const SQLITE_FCNTL_HAS_MOVED = 20; -export const SQLITE_FCNTL_SYNC = 21; -export const SQLITE_FCNTL_COMMIT_PHASETWO = 22; -export const SQLITE_FCNTL_WIN32_SET_HANDLE = 23; -export const SQLITE_FCNTL_WAL_BLOCK = 24; -export const SQLITE_FCNTL_ZIPVFS = 25; -export const SQLITE_FCNTL_RBU = 26; -export const SQLITE_FCNTL_VFS_POINTER = 27; -export const SQLITE_FCNTL_JOURNAL_POINTER = 28; -export const SQLITE_FCNTL_WIN32_GET_HANDLE = 29; -export const SQLITE_FCNTL_PDB = 30; -export const SQLITE_FCNTL_BEGIN_ATOMIC_WRITE = 31; -export const SQLITE_FCNTL_COMMIT_ATOMIC_WRITE = 32; -export const SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE = 33; -export const SQLITE_FCNTL_LOCK_TIMEOUT = 34; -export const SQLITE_FCNTL_DATA_VERSION = 35; -export const SQLITE_FCNTL_SIZE_LIMIT = 36; -export const SQLITE_FCNTL_CKPT_DONE = 37; -export const SQLITE_FCNTL_RESERVE_BYTES = 38; -export const SQLITE_FCNTL_CKPT_START = 39; - -// Fundamental datatypes. -// https://www.sqlite.org/c3ref/c_blob.html -export const SQLITE_INTEGER = 1; -export const SQLITE_FLOAT = 2; -export const SQLITE_TEXT = 3; -export const SQLITE_BLOB = 4; -export const SQLITE_NULL = 5; - -// Special destructor behavior. -// https://www.sqlite.org/c3ref/c_static.html -export const SQLITE_STATIC = 0; -export const SQLITE_TRANSIENT = -1; - -// Text encodings. -// https://sqlite.org/c3ref/c_any.html -export const SQLITE_UTF8 = 1; /* IMP: R-37514-35566 */ -export const SQLITE_UTF16LE = 2; /* IMP: R-03371-37637 */ -export const SQLITE_UTF16BE = 3; /* IMP: R-51971-34154 */ -export const SQLITE_UTF16 = 4; /* Use native byte order */ - -// Module constraint ops. -export const SQLITE_INDEX_CONSTRAINT_EQ = 2; -export const SQLITE_INDEX_CONSTRAINT_GT = 4; -export const SQLITE_INDEX_CONSTRAINT_LE = 8; -export const SQLITE_INDEX_CONSTRAINT_LT = 16; -export const SQLITE_INDEX_CONSTRAINT_GE = 32; -export const SQLITE_INDEX_CONSTRAINT_MATCH = 64; -export const SQLITE_INDEX_CONSTRAINT_LIKE = 65; -export const SQLITE_INDEX_CONSTRAINT_GLOB = 66; -export const SQLITE_INDEX_CONSTRAINT_REGEXP = 67; -export const SQLITE_INDEX_CONSTRAINT_NE = 68; -export const SQLITE_INDEX_CONSTRAINT_ISNOT = 69; -export const SQLITE_INDEX_CONSTRAINT_ISNOTNULL = 70; -export const SQLITE_INDEX_CONSTRAINT_ISNULL = 71; -export const SQLITE_INDEX_CONSTRAINT_IS = 72; -export const SQLITE_INDEX_CONSTRAINT_FUNCTION = 150; -export const SQLITE_INDEX_SCAN_UNIQUE = 1; /* Scan visits at most = 1 row */ - -// Function flags -export const SQLITE_DETERMINISTIC = 0x000000800; -export const SQLITE_DIRECTONLY = 0x000080000; -export const SQLITE_SUBTYPE = 0x000100000; -export const SQLITE_INNOCUOUS = 0x000200000; - -// Sync flags -export const SQLITE_SYNC_NORMAL = 0x00002; -export const SQLITE_SYNC_FULL = 0x00003; -export const SQLITE_SYNC_DATAONLY = 0x00010; - -// Authorizer action codes -export const SQLITE_CREATE_INDEX = 1; -export const SQLITE_CREATE_TABLE = 2; -export const SQLITE_CREATE_TEMP_INDEX = 3; -export const SQLITE_CREATE_TEMP_TABLE = 4; -export const SQLITE_CREATE_TEMP_TRIGGER = 5; -export const SQLITE_CREATE_TEMP_VIEW = 6; -export const SQLITE_CREATE_TRIGGER = 7; -export const SQLITE_CREATE_VIEW = 8; -export const SQLITE_DELETE = 9; -export const SQLITE_DROP_INDEX = 10; -export const SQLITE_DROP_TABLE = 11; -export const SQLITE_DROP_TEMP_INDEX = 12; -export const SQLITE_DROP_TEMP_TABLE = 13; -export const SQLITE_DROP_TEMP_TRIGGER = 14; -export const SQLITE_DROP_TEMP_VIEW = 15; -export const SQLITE_DROP_TRIGGER = 16; -export const SQLITE_DROP_VIEW = 17; -export const SQLITE_INSERT = 18; -export const SQLITE_PRAGMA = 19; -export const SQLITE_READ = 20; -export const SQLITE_SELECT = 21; -export const SQLITE_TRANSACTION = 22; -export const SQLITE_UPDATE = 23; -export const SQLITE_ATTACH = 24; -export const SQLITE_DETACH = 25; -export const SQLITE_ALTER_TABLE = 26; -export const SQLITE_REINDEX = 27; -export const SQLITE_ANALYZE = 28; -export const SQLITE_CREATE_VTABLE = 29; -export const SQLITE_DROP_VTABLE = 30; -export const SQLITE_FUNCTION = 31; -export const SQLITE_SAVEPOINT = 32; -export const SQLITE_COPY = 0; -export const SQLITE_RECURSIVE = 33; - -// Authorizer return codes -export const SQLITE_DENY = 1; -export const SQLITE_IGNORE = 2; - -// Limit categories -export const SQLITE_LIMIT_LENGTH = 0; -export const SQLITE_LIMIT_SQL_LENGTH = 1; -export const SQLITE_LIMIT_COLUMN = 2; -export const SQLITE_LIMIT_EXPR_DEPTH = 3; -export const SQLITE_LIMIT_COMPOUND_SELECT = 4; -export const SQLITE_LIMIT_VDBE_OP = 5; -export const SQLITE_LIMIT_FUNCTION_ARG = 6; -export const SQLITE_LIMIT_ATTACHED = 7; -export const SQLITE_LIMIT_LIKE_PATTERN_LENGTH = 8; -export const SQLITE_LIMIT_VARIABLE_NUMBER = 9; -export const SQLITE_LIMIT_TRIGGER_DEPTH = 10; -export const SQLITE_LIMIT_WORKER_THREADS = 11; - -export const SQLITE_PREPARE_PERSISTENT = 0x01; -export const SQLITE_PREPARE_NORMALIZED = 0x02; -export const SQLITE_PREPARE_NO_VTAB = 0x04; \ No newline at end of file diff --git a/apps/web/core/local-db/worker/wa-sqlite/src/types/globals.d.ts b/apps/web/core/local-db/worker/wa-sqlite/src/types/globals.d.ts deleted file mode 100644 index e32bd32c80..0000000000 --- a/apps/web/core/local-db/worker/wa-sqlite/src/types/globals.d.ts +++ /dev/null @@ -1,62 +0,0 @@ -/* eslint-disable no-var */ - -declare namespace Asyncify { - function handleAsync(f: () => Promise); -} - -declare function UTF8ToString(ptr: number): string; -declare function lengthBytesUTF8(s: string): number; -declare function stringToUTF8(s: string, p: number, n: number); -declare function ccall(name: string, returns: string, args: Array, options?: object): any; -declare function getValue(ptr: number, type: string): number; -declare function setValue(ptr: number, value: number, type: string): number; -declare function mergeInto(library: object, methods: object): void; - -declare var HEAPU8: Uint8Array; -declare var HEAPU32: Uint32Array; -declare var LibraryManager; -declare var Module; -declare var _vfsAccess; -declare var _vfsCheckReservedLock; -declare var _vfsClose; -declare var _vfsDelete; -declare var _vfsDeviceCharacteristics; -declare var _vfsFileControl; -declare var _vfsFileSize; -declare var _vfsLock; -declare var _vfsOpen; -declare var _vfsRead; -declare var _vfsSectorSize; -declare var _vfsSync; -declare var _vfsTruncate; -declare var _vfsUnlock; -declare var _vfsWrite; - -declare var _jsFunc; -declare var _jsStep; -declare var _jsFinal; - -declare var _modStruct; -declare var _modCreate; -declare var _modConnect; -declare var _modBestIndex; -declare var _modDisconnect; -declare var _modDestroy; -declare var _modOpen; -declare var _modClose; -declare var _modFilter; -declare var _modNext; -declare var _modEof; -declare var _modColumn; -declare var _modRowid; -declare var _modUpdate; -declare var _modBegin; -declare var _modSync; -declare var _modCommit; -declare var _modRollback; -declare var _modFindFunction; -declare var _modRename; - -declare var _jsAuth; - -declare var _jsProgress; diff --git a/apps/web/core/local-db/worker/wa-sqlite/src/types/index.d.ts b/apps/web/core/local-db/worker/wa-sqlite/src/types/index.d.ts deleted file mode 100644 index 54da72fdd1..0000000000 --- a/apps/web/core/local-db/worker/wa-sqlite/src/types/index.d.ts +++ /dev/null @@ -1,1294 +0,0 @@ -/** - * This is a WebAssembly build of SQLite with experimental support for - * writing SQLite virtual file systems and modules (for virtual tables) - * in Javascript. Also see the - * [GitHub repository](https://github.com/rhashimoto/wa-sqlite) and the - * [online demo](https://rhashimoto.github.io/wa-sqlite/demo/). - * @module - */ - -/** - * Javascript types that SQLite can use - * - * C integer and floating-point types both map to/from Javascript `number`. - * Blob data can be provided to SQLite as `Uint8Array` or `number[]` (with - * each element converted to a byte); SQLite always returns blob data as - * `Uint8Array` - */ -type SQLiteCompatibleType = number | string | Uint8Array | Array | bigint | null; - -/** - * SQLite Virtual File System object - * - * Objects with this interface can be passed to {@link SQLiteAPI.vfs_register} - * to define a new filesystem. - * - * There are examples of a synchronous - * [MemoryVFS.js](https://github.com/rhashimoto/wa-sqlite/blob/master/src/examples/MemoryVFS.js), - * and asynchronous - * [MemoryAsyncVFS.js](https://github.com/rhashimoto/wa-sqlite/blob/master/src/examples/MemoryAsyncVFS.js) - * and - * [IndexedDbVFS.js](https://github.com/rhashimoto/wa-sqlite/blob/master/src/examples/IndexedDbVFS.js). - * - * @see https://sqlite.org/vfs.html - * @see https://sqlite.org/c3ref/io_methods.html - */ -declare interface SQLiteVFS { - /** Maximum length of a file path in UTF-8 bytes (default 64) */ - mxPathName?: number; - - close(): void | Promise; - isReady(): boolean | Promise; - - /** @see https://sqlite.org/c3ref/io_methods.html */ - xClose(fileId: number): number | Promise; - - /** @see https://sqlite.org/c3ref/io_methods.html */ - xRead(fileId: number, pData: number, iAmt: number, iOffsetLo: number, iOffsetHi: number): number | Promise; - - /** @see https://sqlite.org/c3ref/io_methods.html */ - xWrite(fileId: number, pData: number, iAmt: number, iOffsetLo: number, iOffsetHi: number): number | Promise; - - /** @see https://sqlite.org/c3ref/io_methods.html */ - xTruncate(fileId: number, iSizeLo: number, iSizeHi): number | Promise; - - /** @see https://sqlite.org/c3ref/io_methods.html */ - xSync(fileId: number, flags: number): number | Promise; - - /** @see https://sqlite.org/c3ref/io_methods.html */ - xFileSize(fileId: number, pSize64: number): number | Promise; - - /** @see https://sqlite.org/c3ref/io_methods.html */ - xLock(fileId: number, flags: number): number | Promise; - - /** @see https://sqlite.org/c3ref/io_methods.html */ - xUnlock(fileId: number, flags: number): number | Promise; - - /** @see https://sqlite.org/c3ref/io_methods.html */ - xCheckReservedLock(fileId: number, pResOut: number): number | Promise; - - /** @see https://sqlite.org/c3ref/io_methods.html */ - xFileControl(fileId: number, flags: number, pOut: number): number | Promise; - - /** @see https://sqlite.org/c3ref/io_methods.html */ - xDeviceCharacteristics(fileId: number): number | Promise; - - /** @see https://sqlite.org/c3ref/vfs.html */ - xOpen(pVfs: number, zName: number, pFile: number, flags: number, pOutFlags: number): number | Promise; - - /** @see https://sqlite.org/c3ref/vfs.html */ - xDelete(pVfs: number, zName: number, syncDir: number): number | Promise; - - /** @see https://sqlite.org/c3ref/vfs.html */ - xAccess(pVfs: number, zName: number, flags: number, pResOut: number): number | Promise; -} - -/** - * Options object argument for {@link SQLiteAPI.statements} - */ -declare interface SQLitePrepareOptions { - /** - * Statement handles prepared and yielded by {@link SQLiteAPI.statements} - * are normally valid only within the scope of an iteration. - * Set `unscoped` to `true` to give iterated statements an arbitrary - * lifetime. - */ - unscoped?: boolean; - - /** - * SQLITE_PREPARE_* flags - * @see https://www.sqlite.org/c3ref/c_prepare_normalize.html#sqlitepreparepersistent - */ - flags?: number; -} - -/** - * Javascript wrappers for the SQLite C API (plus a few convenience functions) - * - * Function signatures have been slightly modified to be more - * Javascript-friendly. For the C functions that return an error code, - * the corresponding Javascript wrapper will throw an exception with a - * `code` property on an error. - * - * Note that a few functions return a Promise in order to accommodate - * either a synchronous or asynchronous SQLite build, generally those - * involved with opening/closing a database or executing a statement. - * - * To create an instance of the API, follow these steps: - * - * ```javascript - * // Import an ES6 module factory function from one of the - * // package builds, either 'wa-sqlite.mjs' (synchronous) or - * // 'wa-sqlite-async.mjs' (asynchronous). You should only - * // use the asynchronous build if you plan to use an - * // asynchronous VFS or module. - * import SQLiteESMFactory from 'wa-sqlite/dist/wa-sqlite.mjs'; - * - * // Import the Javascript API wrappers. - * import * as SQLite from 'wa-sqlite'; - * - * // Use an async function to simplify Promise handling. - * (async function() { - * // Invoke the ES6 module factory to create the SQLite - * // Emscripten module. This will fetch and compile the - * // .wasm file. - * const module = await SQLiteESMFactory(); - * - * // Use the module to build the API instance. - * const sqlite3 = SQLite.Factory(module); - * - * // Use the API to open and access a database. - * const db = await sqlite3.open_v2('myDB'); - * ... - * })(); - * ``` - * - * @see https://sqlite.org/c3ref/funclist.html - */ -declare interface SQLiteAPI { - /** - * Bind a collection of values to a statement - * - * This convenience function binds values from either an array or object - * to a prepared statement with placeholder parameters. - * - * Array example using numbered parameters (numbering is implicit in - * this example): - * ``` - * const sql = 'INSERT INTO tbl VALUES (?, ?, ?)'; - * for await (const stmt of sqlite3.statements(db, sql) { - * sqlite3.bind_collection(stmt, [42, 'hello', null]); - * ... - * } - * ``` - * - * Object example using named parameters (':', '@', or '$' prefixes - * are allowed): - * ``` - * const sql = 'INSERT INTO tbl VALUES (?, ?, ?)'; - * for await (const stmt of sqlite3.statements(db, sql) { - * sqlite3.bind_collection(stmt, { - * '@foo': 42, - * '@bar': 'hello', - * '@baz': null, - * }); - * ... - * } - * ``` - * - * Note that SQLite bindings are indexed beginning with 1, but when - * binding values from an array `a` the values begin with `a[0]`. - * @param stmt prepared statement pointer - * @param bindings - * @returns `SQLITE_OK` (throws exception on error) - */ - bind_collection( - stmt: number, - bindings: { [index: string]: SQLiteCompatibleType | null } | Array - ): number; - - /** - * Bind value to prepared statement - * - * This convenience function calls the appropriate `bind_*` function - * based on the type of `value`. Note that binding indices begin with 1. - * @param stmt prepared statement pointer - * @param i binding index - * @param value - * @returns `SQLITE_OK` (throws exception on error) - */ - bind(stmt: number, i: number, value: SQLiteCompatibleType | null): number; - - /** - * Bind blob to prepared statement parameter - * - * Note that binding indices begin with 1. - * @see https://www.sqlite.org/c3ref/bind_blob.html - * @param stmt prepared statement pointer - * @param i binding index - * @param value - * @returns `SQLITE_OK` (throws exception on error) - */ - bind_blob(stmt: number, i: number, value: Uint8Array | Array): number; - - /** - * Bind number to prepared statement parameter - * - * Note that binding indices begin with 1. - * @see https://www.sqlite.org/c3ref/bind_blob.html - * @param stmt prepared statement pointer - * @param i binding index - * @param value - * @returns `SQLITE_OK` (throws exception on error) - */ - bind_double(stmt: number, i: number, value: number): number; - - /** - * Bind number to prepared statement parameter - * - * Note that binding indices begin with 1. - * @see https://www.sqlite.org/c3ref/bind_blob.html - * @param stmt prepared statement pointer - * @param i binding index - * @param value - * @returns `SQLITE_OK` (throws exception on error) - */ - bind_int(stmt: number, i: number, value: number): number; - - /** - * Bind number to prepared statement parameter - * - * Note that binding indices begin with 1. - * @see https://www.sqlite.org/c3ref/bind_blob.html - * @param stmt prepared statement pointer - * @param i binding index - * @param value - * @returns `SQLITE_OK` (throws exception on error) - */ - bind_int64(stmt: number, i: number, value: bigint): number; - - /** - * Bind null to prepared statement - * - * Note that binding indices begin with 1. - * @see https://www.sqlite.org/c3ref/bind_blob.html - * @param stmt prepared statement pointer - * @param i binding index - * @returns `SQLITE_OK` (throws exception on error) - */ - bind_null(stmt: number, i: number): number; - - /** - * Get number of bound parameters - * @see https://www.sqlite.org/c3ref/bind_parameter_count.html - * @param stmt prepared statement pointer - * @returns number of statement binding locations - */ - bind_parameter_count(stmt: number): number; - - /** - * Get name of bound parameter - * - * Note that binding indices begin with 1. - * @see https://www.sqlite.org/c3ref/bind_parameter_name.html - * @param stmt prepared statement pointer - * @param i binding index - * @returns binding name - */ - bind_parameter_name(stmt: number, i: number): string; - - /** - * Bind string to prepared statement - * - * Note that binding indices begin with 1. - * @see https://www.sqlite.org/c3ref/bind_blob.html - * @param stmt prepared statement pointer - * @param i binding index - * @param value - * @returns `SQLITE_OK` (throws exception on error) - */ - bind_text(stmt: number, i: number, value: string): number; - - /** - * Get count of rows modified by last insert/update - * @see https://www.sqlite.org/c3ref/changes.html - * @param db database pointer - * @returns number of rows modified - */ - changes(db): number; - - /** - * Reset all bindings on a prepared statement. - * @see https://www.sqlite.org/c3ref/clear_bindings.html - * @param stmt prepared statement pointer - * @returns `SQLITE_OK` (throws exception on error) - */ - clear_bindings(stmt: number): number; - - /** - * Close database connection - * @see https://www.sqlite.org/c3ref/close.html - * @param db database pointer - * @returns `SQLITE_OK` (throws exception on error) - */ - close(db): Promise; - - /** - * Call the appropriate `column_*` function based on the column type - * - * The type is determined by calling {@link column_type}, which may - * not match the type declared in `CREATE TABLE`. Note that if the column - * value is a blob then as with `column_blob` the result may be invalid - * after the next SQLite call; copy if it needs to be retained. - * - * Integer values are returned as Number if within the min/max safe - * integer bounds, otherwise they are returned as BigInt. - * @param stmt prepared statement pointer - * @param i column index - * @returns column value - */ - column(stmt: number, i: number): SQLiteCompatibleType; - - /** - * Extract a column value from a row after a prepared statement {@link step} - * - * The contents of the returned buffer may be invalid after the - * next SQLite call. Make a copy of the data (e.g. with `.slice()`) - * if longer retention is required. - * @see https://www.sqlite.org/c3ref/column_blob.html - * @param stmt prepared statement pointer - * @param i column index - * @returns column value - */ - column_blob(stmt: number, i: number): Uint8Array; - - /** - * Get storage size for column text or blob - * @see https://www.sqlite.org/c3ref/column_blob.html - * @param stmt prepared statement pointer - * @param i column index - * @returns number of bytes in column text or blob - */ - column_bytes(stmt: number, i: number): number; - - /** - * Get number of columns for a prepared statement - * @see https://www.sqlite.org/c3ref/column_blob.html - * @param stmt prepared statement pointer - * @returns number of columns - */ - column_count(stmt: number): number; - - /** - * Extract a column value from a row after a prepared statement {@link step} - * @see https://www.sqlite.org/c3ref/column_blob.html - * @param stmt prepared statement pointer - * @param i column index - * @returns column value - */ - column_double(stmt: number, i: number): number; - - /** - * Extract a column value from a row after a prepared statement {@link step} - * @see https://www.sqlite.org/c3ref/column_blob.html - * @param stmt prepared statement pointer - * @param i column index - * @returns column value - */ - column_int(stmt: number, i: number): number; - - /** - * Extract a column value from a row after a prepared statement {@link step} - * @see https://www.sqlite.org/c3ref/column_blob.html - * @param stmt prepared statement pointer - * @param i column index - * @returns column value - */ - column_int64(stmt: number, i: number): bigint; - - /** - * Get a column name for a prepared statement - * @see https://www.sqlite.org/c3ref/column_blob.html - * @param stmt prepared statement pointer - * @param i column index - * @returns column name - */ - column_name(stmt: number, i: number): string; - - /** - * Get names for all columns of a prepared statement - * - * This is a convenience function that calls {@link column_count} and - * {@link column_name}. - * @param stmt - * @returns array of column names - */ - column_names(stmt: number): Array; - - /** - * Extract a column value from a row after a prepared statement {@link step} - * @see https://www.sqlite.org/c3ref/column_blob.html - * @param stmt prepared statement pointer - * @param i column index - * @returns column value - */ - column_text(stmt: number, i: number): string; - - /** - * Get column type for a prepared statement - * - * Note that this type may not match the type declared in `CREATE TABLE`. - * @see https://www.sqlite.org/c3ref/column_blob.html - * @param stmt prepared statement pointer - * @param i column index - * @returns enumeration value for type - */ - column_type(stmt: number, i: number): number; - - /** - * Create or redefine SQL functions - * - * The application data passed is ignored. Use closures instead. - * - * If any callback function returns a Promise, that function must - * be declared `async`, i.e. it must allow use of `await`. - * @see https://sqlite.org/c3ref/create_function.html - * @param db database pointer - * @param zFunctionName - * @param nArg number of function arguments - * @param eTextRep text encoding (and other flags) - * @param pApp application data (ignored) - * @param xFunc - * @param xStep - * @param xFinal - * @returns `SQLITE_OK` (throws exception on error) - */ - create_function( - db: number, - zFunctionName: string, - nArg: number, - eTextRep: number, - pApp: number, - xFunc?: (context: number, values: Uint32Array) => void | Promise, - xStep?: (context: number, values: Uint32Array) => void | Promise, - xFinal?: (context: number) => void | Promise - ): number; - - /** - * Get number of columns in current row of a prepared statement - * @see https://www.sqlite.org/c3ref/data_count.html - * @param stmt prepared statement pointer - * @returns number of columns - */ - data_count(stmt: number): number; - - /** - * One-step query execution interface - * - * The implementation of this function uses {@link row}, which makes a - * copy of blobs and returns BigInt for integers outside the safe integer - * bounds for Number. - * @see https://www.sqlite.org/c3ref/exec.html - * @param db database pointer - * @param zSQL queries - * @param callback called for each output row - * @returns Promise resolving to `SQLITE_OK` (rejects on error) - */ - exec( - db: number, - zSQL: string, - callback?: (row: Array, columns: string[]) => void - ): Promise; - - /** - * Destroy a prepared statement object compiled by {@link statements} - * with the `unscoped` option set to `true` - * - * This function does *not* throw on error. - * @see https://www.sqlite.org/c3ref/finalize.html - * @param stmt prepared statement pointer - * @returns Promise resolving to `SQLITE_OK` or error status - */ - finalize(stmt: number): Promise; - - /** - * Test for autocommit mode - * @see https://sqlite.org/c3ref/get_autocommit.html - * @param db database pointer - * @returns Non-zero if autocommit mode is on, zero otherwise - */ - get_autocommit(db: number): number; - - /** - * Get SQLite library version - * @see https://www.sqlite.org/c3ref/libversion.html - * @returns version string, e.g. '3.35.5' - */ - libversion(): string; - - /** - * Get SQLite library version - * @see https://www.sqlite.org/c3ref/libversion.html - * @returns version number, e.g. 3035005 - */ - libversion_number(): number; - - /** - * Set a usage limit on a connection. - * @see https://www.sqlite.org/c3ref/limit.html - * @param db database pointer - * @param id limit category - * @param newVal - * @returns previous setting - */ - limit(db: number, id: number, newVal: number): number; - - /** - * Opening a new database connection. - * - * Note that this function differs from the C API in that it - * returns the Promise-wrapped database pointer (instead of a - * result code). - * @see https://sqlite.org/c3ref/open.html - * @param zFilename - * @param iFlags `SQLite.SQLITE_OPEN_CREATE | SQLite.SQLITE_OPEN_READWRITE` (0x6) if omitted - * @param zVfs VFS name - * @returns Promise-wrapped database pointer. - */ - open_v2(zFilename: string, iFlags?: number, zVfs?: string): Promise; - - /** - * Specify callback to be invoked between long-running queries - * - * The application data passed is ignored. Use closures instead. - * - * If any callback function returns a Promise, that function must - * be declared `async`, i.e. it must allow use of `await`. - * @param db database pointer - * @param nProgressOps target number of database operations between handler invocations - * @param handler - * @param userData - */ - progress_handler(db: number, nProgressOps: number, handler: (userData: any) => number | Promise, userData); - - /** - * Reset a prepared statement object - * @see https://www.sqlite.org/c3ref/reset.html - * @param stmt prepared statement pointer - * @returns Promise-wrapped `SQLITE_OK` (rejects on error) - */ - reset(stmt: number): Promise; - - /** - * Convenience function to call `result_*` based of the type of `value` - * @param context context pointer - * @param value - */ - result(context: number, value: (SQLiteCompatibleType | number[]) | null): void; - - /** - * Set the result of a function or vtable column - * @see https://sqlite.org/c3ref/result_blob.html - * @param context context pointer - * @param value - */ - result_blob(context: number, value: Uint8Array | number[]): void; - - /** - * Set the result of a function or vtable column - * @see https://sqlite.org/c3ref/result_blob.html - * @param context context pointer - * @param value - */ - result_double(context: number, value: number): void; - - /** - * Set the result of a function or vtable column - * @see https://sqlite.org/c3ref/result_blob.html - * @param context context pointer - * @param value - */ - result_int(context: number, value: number): void; - - /** - * Set the result of a function or vtable column - * @see https://sqlite.org/c3ref/result_blob.html - * @param context context pointer - * @param value - */ - result_int64(context: number, value: bigint): void; - - /** - * Set the result of a function or vtable column - * @see https://sqlite.org/c3ref/result_blob.html - * @param context context pointer - */ - result_null(context: number): void; - - /** - * Set the result of a function or vtable column - * @see https://sqlite.org/c3ref/result_blob.html - * @param context context pointer - * @param value - */ - result_text(context: number, value: string): void; - - /** - * Get all column data for a row from a prepared statement step - * - * This convenience function will return a copy of any blob, unlike - * {@link column_blob} which returns a value referencing volatile WASM - * memory with short validity. Like {@link column}, it will return a - * BigInt for integers outside the safe integer bounds for Number. - * @param stmt prepared statement pointer - * @returns row data - */ - row(stmt: number): Array; - - /** - * Register a callback function that is invoked to authorize certain SQL statement actions. - * @see https://www.sqlite.org/c3ref/set_authorizer.html - * @param db database pointer - * @param authFunction - * @param userData - */ - set_authorizer( - db: number, - authFunction: ( - userData: any, - iActionCode: number, - param3: string | null, - param4: string | null, - param5: string | null, - param6: string | null - ) => number | Promise, - userData: any - ): number; - - /** - * Get statement SQL - * @see https://www.sqlite.org/c3ref/expanded_sql.html - * @param stmt prepared statement pointer - * @returns SQL - */ - sql(stmt: number): string; - - /** - * SQL statement iterator - * - * This function manages statement compilation by creating an async - * iterator that yields a prepared statement handle on each iteration. - * It is typically used with a `for await` loop (in an async function), - * like this: - * ```javascript - * // Compile one statement on each iteration of this loop. - * for await (const stmt of sqlite3.statements(db, sql)) { - * // Bind parameters here if using SQLite placeholders. - * - * // Execute the statement with this loop. - * while (await sqlite3.step(stmt) === SQLite.SQLITE_ROW) { - * // Collect row data here. - * } - * - * // Change bindings, reset, and execute again if desired. - * } - * ``` - * - * By default, the lifetime of a yielded prepared statement is managed - * automatically by the iterator, ending at the end of each iteration. - * {@link finalize} should *not* be called on a statement provided by - * the iterator unless the `unscoped` option is set to `true` (that - * option is provided for applications that wish to manage statement - * lifetimes manually). - * - * If using the iterator manually, i.e. by calling its `next` - * method, be sure to call the `return` method if iteration - * is abandoned before completion (`for await` and other implicit - * traversals provided by Javascript do this automatically) - * to ensure that all allocated resources are released. - * @see https://www.sqlite.org/c3ref/prepare.html - * @param db database pointer - * @param sql - * @param options - */ - statements(db: number, sql: string, options?: SQLitePrepareOptions): AsyncIterable; - - /** - * Evaluate an SQL statement - * @see https://www.sqlite.org/c3ref/step.html - * @param stmt prepared statement pointer - * @returns Promise resolving to `SQLITE_ROW` or `SQLITE_DONE` - * (rejects on error) - */ - step(stmt: number): Promise; - - /** - * Register an update hook - * - * The callback is invoked whenever a row is updated, inserted, or deleted - * in a rowid table on this connection. - * @see https://www.sqlite.org/c3ref/update_hook.html - * - * updateType is one of: - * - SQLITE_DELETE: 9 - * - SQLITE_INSERT: 18 - * - SQLITE_UPDATE: 23 - * @see https://www.sqlite.org/c3ref/c_alter_table.html - * - * @param db database pointer - * @param callback - */ - update_hook( - db: number, - callback: (updateType: number, dbName: string | null, tblName: string | null, rowid: bigint) => void - ): void; - - /** - * Extract a value from `sqlite3_value` - * - * This is a convenience function that calls the appropriate `value_*` - * function based on its type. Note that if the value is a blob then as - * with `value_blob` the result may be invalid after the next SQLite call. - * - * Integer values are returned as Number if within the min/max safe - * integer bounds, otherwise they are returned as BigInt. - * @param pValue `sqlite3_value` pointer - * @returns value - */ - value(pValue: number): SQLiteCompatibleType; - - /** - * Extract a value from `sqlite3_value` - * - * The contents of the returned buffer may be invalid after the - * next SQLite call. Make a copy of the data (e.g. with `.slice()`) - * if longer retention is required. - * @see https://sqlite.org/c3ref/value_blob.html - * @param pValue `sqlite3_value` pointer - * @returns value - */ - value_blob(pValue: number): Uint8Array; - - /** - * Get blob or text size for value - * @see https://sqlite.org/c3ref/value_blob.html - * @param pValue `sqlite3_value` pointer - * @returns size - */ - value_bytes(pValue: number): number; - - /** - * Extract a value from `sqlite3_value` - * @see https://sqlite.org/c3ref/value_blob.html - * @param pValue `sqlite3_value` pointer - * @returns value - */ - value_double(pValue: number): number; - - /** - * Extract a value from `sqlite3_value` - * @see https://sqlite.org/c3ref/value_blob.html - * @param pValue `sqlite3_value` pointer - * @returns value - */ - value_int(pValue: number): number; - - /** - * Extract a value from `sqlite3_value` - * @see https://sqlite.org/c3ref/value_blob.html - * @param pValue `sqlite3_value` pointer - * @returns value - */ - value_int64(pValue: number): bigint; - - /** - * Extract a value from `sqlite3_value` - * @see https://sqlite.org/c3ref/value_blob.html - * @param pValue `sqlite3_value` pointer - * @returns value - */ - value_text(pValue: number): string; - - /** - * Get type of `sqlite3_value` - * @see https://sqlite.org/c3ref/value_blob.html - * @param pValue `sqlite3_value` pointer - * @returns enumeration value for type - */ - value_type(pValue: number): number; - - /** - * Register a new Virtual File System. - * - * @see https://www.sqlite.org/c3ref/vfs_find.html - * @param vfs VFS object - * @param makeDefault - * @returns `SQLITE_OK` (throws exception on error) - */ - vfs_register(vfs: SQLiteVFS, makeDefault?: boolean): number; -} - -/** @ignore */ -declare module "wa-sqlite/src/sqlite-constants.js" { - export const SQLITE_OK: 0; - export const SQLITE_ERROR: 1; - export const SQLITE_INTERNAL: 2; - export const SQLITE_PERM: 3; - export const SQLITE_ABORT: 4; - export const SQLITE_BUSY: 5; - export const SQLITE_LOCKED: 6; - export const SQLITE_NOMEM: 7; - export const SQLITE_READONLY: 8; - export const SQLITE_INTERRUPT: 9; - export const SQLITE_IOERR: 10; - export const SQLITE_CORRUPT: 11; - export const SQLITE_NOTFOUND: 12; - export const SQLITE_FULL: 13; - export const SQLITE_CANTOPEN: 14; - export const SQLITE_PROTOCOL: 15; - export const SQLITE_EMPTY: 16; - export const SQLITE_SCHEMA: 17; - export const SQLITE_TOOBIG: 18; - export const SQLITE_CONSTRAINT: 19; - export const SQLITE_MISMATCH: 20; - export const SQLITE_MISUSE: 21; - export const SQLITE_NOLFS: 22; - export const SQLITE_AUTH: 23; - export const SQLITE_FORMAT: 24; - export const SQLITE_RANGE: 25; - export const SQLITE_NOTADB: 26; - export const SQLITE_NOTICE: 27; - export const SQLITE_WARNING: 28; - export const SQLITE_ROW: 100; - export const SQLITE_DONE: 101; - export const SQLITE_IOERR_ACCESS: 3338; - export const SQLITE_IOERR_CHECKRESERVEDLOCK: 3594; - export const SQLITE_IOERR_CLOSE: 4106; - export const SQLITE_IOERR_DATA: 8202; - export const SQLITE_IOERR_DELETE: 2570; - export const SQLITE_IOERR_DELETE_NOENT: 5898; - export const SQLITE_IOERR_DIR_FSYNC: 1290; - export const SQLITE_IOERR_FSTAT: 1802; - export const SQLITE_IOERR_FSYNC: 1034; - export const SQLITE_IOERR_GETTEMPPATH: 6410; - export const SQLITE_IOERR_LOCK: 3850; - export const SQLITE_IOERR_NOMEM: 3082; - export const SQLITE_IOERR_READ: 266; - export const SQLITE_IOERR_RDLOCK: 2314; - export const SQLITE_IOERR_SEEK: 5642; - export const SQLITE_IOERR_SHORT_READ: 522; - export const SQLITE_IOERR_TRUNCATE: 1546; - export const SQLITE_IOERR_UNLOCK: 2058; - export const SQLITE_IOERR_VNODE: 6922; - export const SQLITE_IOERR_WRITE: 778; - export const SQLITE_IOERR_BEGIN_ATOMIC: 7434; - export const SQLITE_IOERR_COMMIT_ATOMIC: 7690; - export const SQLITE_IOERR_ROLLBACK_ATOMIC: 7946; - export const SQLITE_CONSTRAINT_CHECK: 275; - export const SQLITE_CONSTRAINT_COMMITHOOK: 531; - export const SQLITE_CONSTRAINT_FOREIGNKEY: 787; - export const SQLITE_CONSTRAINT_FUNCTION: 1043; - export const SQLITE_CONSTRAINT_NOTNULL: 1299; - export const SQLITE_CONSTRAINT_PINNED: 2835; - export const SQLITE_CONSTRAINT_PRIMARYKEY: 1555; - export const SQLITE_CONSTRAINT_ROWID: 2579; - export const SQLITE_CONSTRAINT_TRIGGER: 1811; - export const SQLITE_CONSTRAINT_UNIQUE: 2067; - export const SQLITE_CONSTRAINT_VTAB: 2323; - export const SQLITE_OPEN_READONLY: 1; - export const SQLITE_OPEN_READWRITE: 2; - export const SQLITE_OPEN_CREATE: 4; - export const SQLITE_OPEN_DELETEONCLOSE: 8; - export const SQLITE_OPEN_EXCLUSIVE: 16; - export const SQLITE_OPEN_AUTOPROXY: 32; - export const SQLITE_OPEN_URI: 64; - export const SQLITE_OPEN_MEMORY: 128; - export const SQLITE_OPEN_MAIN_DB: 256; - export const SQLITE_OPEN_TEMP_DB: 512; - export const SQLITE_OPEN_TRANSIENT_DB: 1024; - export const SQLITE_OPEN_MAIN_JOURNAL: 2048; - export const SQLITE_OPEN_TEMP_JOURNAL: 4096; - export const SQLITE_OPEN_SUBJOURNAL: 8192; - export const SQLITE_OPEN_SUPER_JOURNAL: 16384; - export const SQLITE_OPEN_NOMUTEX: 32768; - export const SQLITE_OPEN_FULLMUTEX: 65536; - export const SQLITE_OPEN_SHAREDCACHE: 131072; - export const SQLITE_OPEN_PRIVATECACHE: 262144; - export const SQLITE_OPEN_WAL: 524288; - export const SQLITE_OPEN_NOFOLLOW: 16777216; - export const SQLITE_LOCK_NONE: 0; - export const SQLITE_LOCK_SHARED: 1; - export const SQLITE_LOCK_RESERVED: 2; - export const SQLITE_LOCK_PENDING: 3; - export const SQLITE_LOCK_EXCLUSIVE: 4; - export const SQLITE_IOCAP_ATOMIC: 1; - export const SQLITE_IOCAP_ATOMIC512: 2; - export const SQLITE_IOCAP_ATOMIC1K: 4; - export const SQLITE_IOCAP_ATOMIC2K: 8; - export const SQLITE_IOCAP_ATOMIC4K: 16; - export const SQLITE_IOCAP_ATOMIC8K: 32; - export const SQLITE_IOCAP_ATOMIC16K: 64; - export const SQLITE_IOCAP_ATOMIC32K: 128; - export const SQLITE_IOCAP_ATOMIC64K: 256; - export const SQLITE_IOCAP_SAFE_APPEND: 512; - export const SQLITE_IOCAP_SEQUENTIAL: 1024; - export const SQLITE_IOCAP_UNDELETABLE_WHEN_OPEN: 2048; - export const SQLITE_IOCAP_POWERSAFE_OVERWRITE: 4096; - export const SQLITE_IOCAP_IMMUTABLE: 8192; - export const SQLITE_IOCAP_BATCH_ATOMIC: 16384; - export const SQLITE_ACCESS_EXISTS: 0; - export const SQLITE_ACCESS_READWRITE: 1; - export const SQLITE_ACCESS_READ: 2; - export const SQLITE_FCNTL_LOCKSTATE: 1; - export const SQLITE_FCNTL_GET_LOCKPROXYFILE: 2; - export const SQLITE_FCNTL_SET_LOCKPROXYFILE: 3; - export const SQLITE_FCNTL_LAST_ERRNO: 4; - export const SQLITE_FCNTL_SIZE_HINT: 5; - export const SQLITE_FCNTL_CHUNK_SIZE: 6; - export const SQLITE_FCNTL_FILE_POINTER: 7; - export const SQLITE_FCNTL_SYNC_OMITTED: 8; - export const SQLITE_FCNTL_WIN32_AV_RETRY: 9; - export const SQLITE_FCNTL_PERSIST_WAL: 10; - export const SQLITE_FCNTL_OVERWRITE: 11; - export const SQLITE_FCNTL_VFSNAME: 12; - export const SQLITE_FCNTL_POWERSAFE_OVERWRITE: 13; - export const SQLITE_FCNTL_PRAGMA: 14; - export const SQLITE_FCNTL_BUSYHANDLER: 15; - export const SQLITE_FCNTL_TEMPFILENAME: 16; - export const SQLITE_FCNTL_MMAP_SIZE: 18; - export const SQLITE_FCNTL_TRACE: 19; - export const SQLITE_FCNTL_HAS_MOVED: 20; - export const SQLITE_FCNTL_SYNC: 21; - export const SQLITE_FCNTL_COMMIT_PHASETWO: 22; - export const SQLITE_FCNTL_WIN32_SET_HANDLE: 23; - export const SQLITE_FCNTL_WAL_BLOCK: 24; - export const SQLITE_FCNTL_ZIPVFS: 25; - export const SQLITE_FCNTL_RBU: 26; - export const SQLITE_FCNTL_VFS_POINTER: 27; - export const SQLITE_FCNTL_JOURNAL_POINTER: 28; - export const SQLITE_FCNTL_WIN32_GET_HANDLE: 29; - export const SQLITE_FCNTL_PDB: 30; - export const SQLITE_FCNTL_BEGIN_ATOMIC_WRITE: 31; - export const SQLITE_FCNTL_COMMIT_ATOMIC_WRITE: 32; - export const SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE: 33; - export const SQLITE_FCNTL_LOCK_TIMEOUT: 34; - export const SQLITE_FCNTL_DATA_VERSION: 35; - export const SQLITE_FCNTL_SIZE_LIMIT: 36; - export const SQLITE_FCNTL_CKPT_DONE: 37; - export const SQLITE_FCNTL_RESERVE_BYTES: 38; - export const SQLITE_FCNTL_CKPT_START: 39; - export const SQLITE_INTEGER: 1; - export const SQLITE_FLOAT: 2; - export const SQLITE_TEXT: 3; - export const SQLITE_BLOB: 4; - export const SQLITE_NULL: 5; - export const SQLITE_STATIC: 0; - export const SQLITE_TRANSIENT: -1; - export const SQLITE_UTF8: 1; - export const SQLITE_UTF16LE: 2; - export const SQLITE_UTF16BE: 3; - export const SQLITE_UTF16: 4; - export const SQLITE_INDEX_CONSTRAINT_EQ: 2; - export const SQLITE_INDEX_CONSTRAINT_GT: 4; - export const SQLITE_INDEX_CONSTRAINT_LE: 8; - export const SQLITE_INDEX_CONSTRAINT_LT: 16; - export const SQLITE_INDEX_CONSTRAINT_GE: 32; - export const SQLITE_INDEX_CONSTRAINT_MATCH: 64; - export const SQLITE_INDEX_CONSTRAINT_LIKE: 65; - export const SQLITE_INDEX_CONSTRAINT_GLOB: 66; - export const SQLITE_INDEX_CONSTRAINT_REGEXP: 67; - export const SQLITE_INDEX_CONSTRAINT_NE: 68; - export const SQLITE_INDEX_CONSTRAINT_ISNOT: 69; - export const SQLITE_INDEX_CONSTRAINT_ISNOTNULL: 70; - export const SQLITE_INDEX_CONSTRAINT_ISNULL: 71; - export const SQLITE_INDEX_CONSTRAINT_IS: 72; - export const SQLITE_INDEX_CONSTRAINT_FUNCTION: 150; - export const SQLITE_INDEX_SCAN_UNIQUE: 1; - export const SQLITE_DETERMINISTIC: 0x000000800; - export const SQLITE_DIRECTONLY: 0x000080000; - export const SQLITE_SUBTYPE: 0x000100000; - export const SQLITE_INNOCUOUS: 0x000200000; - export const SQLITE_SYNC_NORMAL: 0x00002; - export const SQLITE_SYNC_FULL: 0x00003; - export const SQLITE_SYNC_DATAONLY: 0x00010; - export const SQLITE_CREATE_INDEX: 1; - export const SQLITE_CREATE_TABLE: 2; - export const SQLITE_CREATE_TEMP_INDEX: 3; - export const SQLITE_CREATE_TEMP_TABLE: 4; - export const SQLITE_CREATE_TEMP_TRIGGER: 5; - export const SQLITE_CREATE_TEMP_VIEW: 6; - export const SQLITE_CREATE_TRIGGER: 7; - export const SQLITE_CREATE_VIEW: 8; - export const SQLITE_DELETE: 9; - export const SQLITE_DROP_INDEX: 10; - export const SQLITE_DROP_TABLE: 11; - export const SQLITE_DROP_TEMP_INDEX: 12; - export const SQLITE_DROP_TEMP_TABLE: 13; - export const SQLITE_DROP_TEMP_TRIGGER: 14; - export const SQLITE_DROP_TEMP_VIEW: 15; - export const SQLITE_DROP_TRIGGER: 16; - export const SQLITE_DROP_VIEW: 17; - export const SQLITE_INSERT: 18; - export const SQLITE_PRAGMA: 19; - export const SQLITE_READ: 20; - export const SQLITE_SELECT: 21; - export const SQLITE_TRANSACTION: 22; - export const SQLITE_UPDATE: 23; - export const SQLITE_ATTACH: 24; - export const SQLITE_DETACH: 25; - export const SQLITE_ALTER_TABLE: 26; - export const SQLITE_REINDEX: 27; - export const SQLITE_ANALYZE: 28; - export const SQLITE_CREATE_VTABLE: 29; - export const SQLITE_DROP_VTABLE: 30; - export const SQLITE_FUNCTION: 31; - export const SQLITE_SAVEPOINT: 32; - export const SQLITE_COPY: 0; - export const SQLITE_RECURSIVE: 33; - export const SQLITE_DENY: 1; - export const SQLITE_IGNORE: 2; - export const SQLITE_LIMIT_LENGTH: 0; - export const SQLITE_LIMIT_SQL_LENGTH: 1; - export const SQLITE_LIMIT_COLUMN: 2; - export const SQLITE_LIMIT_EXPR_DEPTH: 3; - export const SQLITE_LIMIT_COMPOUND_SELECT: 4; - export const SQLITE_LIMIT_VDBE_OP: 5; - export const SQLITE_LIMIT_FUNCTION_ARG: 6; - export const SQLITE_LIMIT_ATTACHED: 7; - export const SQLITE_LIMIT_LIKE_PATTERN_LENGTH: 8; - export const SQLITE_LIMIT_VARIABLE_NUMBER: 9; - export const SQLITE_LIMIT_TRIGGER_DEPTH: 10; - export const SQLITE_LIMIT_WORKER_THREADS: 11; - export const SQLITE_PREPARE_PERSISTENT: 0x01; - export const SQLITE_PREPARE_NORMALIZED: 0x02; - export const SQLITE_PREPARE_NO_VTAB: 0x04; -} - -declare module "wa-sqlite" { - export * from "wa-sqlite/src/sqlite-constants.js"; - - /** - * @ignore - * Builds a Javascript API from the Emscripten module. This API is still - * low-level and closely corresponds to the C API exported by the module, - * but differs in some specifics like throwing exceptions on errors. - * @param {*} Module SQLite module - * @returns {SQLiteAPI} - */ - export function Factory(Module: any): SQLiteAPI; - - export class SQLiteError extends Error { - constructor(message: any, code: any); - code: any; - } -} - -/** @ignore */ -declare module "wa-sqlite/dist/wa-sqlite.mjs" { - function ModuleFactory(config?: object): Promise; - export = ModuleFactory; -} - -/** @ignore */ -declare module "wa-sqlite/dist/wa-sqlite-async.mjs" { - function ModuleFactory(config?: object): Promise; - export = ModuleFactory; -} - -/** @ignore */ -declare module "wa-sqlite/src/VFS.js" { - export * from "wa-sqlite/src/sqlite-constants.js"; - - export class Base { - mxPathName: number; - /** - * @param {number} fileId - * @returns {number|Promise} - */ - xClose(fileId: number): number; - /** - * @param {number} fileId - * @param {Uint8Array} pData - * @param {number} iOffset - * @returns {number} - */ - xRead( - fileId: number, - pData: { - size: number; - value: Uint8Array; - }, - iOffset: number - ): number; - /** - * @param {number} fileId - * @param {Uint8Array} pData - * @param {number} iOffset - * @returns {number} - */ - xWrite( - fileId: number, - pData: { - size: number; - value: Uint8Array; - }, - iOffset: number - ): number; - /** - * @param {number} fileId - * @param {number} iSize - * @returns {number} - */ - xTruncate(fileId: number, iSize: number): number; - /** - * @param {number} fileId - * @param {*} flags - * @returns {number} - */ - xSync(fileId: number, flags: any): number; - /** - * @param {number} fileId - * @param {DataView} pSize64 - * @returns {number|Promise} - */ - xFileSize(fileId: number, pSize64: DataView): number; - /** - * @param {number} fileId - * @param {number} flags - * @returns {number} - */ - xLock(fileId: number, flags: number): number; - /** - * @param {number} fileId - * @param {number} flags - * @returns {number} - */ - xUnlock(fileId: number, flags: number): number; - /** - * @param {number} fileId - * @param {DataView} pResOut - * @returns {number} - */ - xCheckReservedLock(fileId: number, pResOut: DataView): number; - /** - * @param {number} fileId - * @param {number} flags - * @param {DataView} pArg - * @returns {number} - */ - xFileControl(fileId: number, flags: number, pArg: DataView): number; - /** - * @param {number} fileId - * @returns {number} - */ - xSectorSize(fileId: number): number; - /** - * @param {number} fileId - * @returns {number} - */ - xDeviceCharacteristics(fileId: number): number; - /** - * @param {string?} name - * @param {number} fileId - * @param {number} flags - * @param {DataView} pOutFlags - * @returns {number} - */ - xOpen(name: string | null, fileId: number, flags: number, pOutFlags: DataView): number; - /** - * - * @param {string} name - * @param {number} syncDir - * @returns {number} - */ - xDelete(name: string, syncDir: number): number; - /** - * @param {string} name - * @param {number} flags - * @param {DataView} pResOut - * @returns {number} - */ - xAccess(name: string, flags: number, pResOut: DataView): number; - /** - * Handle asynchronous operation. This implementation will be overridden on - * registration by an Asyncify build. - * @param {function(): Promise} f - * @returns {number} - */ - handleAsync(f: () => Promise): number; - } -} - -/** @ignore */ -declare module "wa-sqlite/src/examples/IndexedDbVFS.js" { - import * as VFS from "wa-sqlite/src/VFS.js"; - export class IndexedDbVFS extends VFS.Base { - /** - * @param {string} idbName Name of IndexedDB database. - */ - constructor(idbName?: string); - name: string; - mapIdToFile: Map; - cacheSize: number; - db: any; - close(): Promise; - /** - * Delete a file from IndexedDB. - * @param {string} name - */ - deleteFile(name: string): Promise; - /** - * Forcibly clear an orphaned file lock. - * @param {string} name - */ - forceClearLock(name: string): Promise; - _getStore(mode?: string): any; - /** - * Returns the key for file metadata. - * @param {string} name - * @returns - */ - _metaKey(name: string): string; - /** - * Returns the key for file block data. - * @param {string} name - * @param {number} index - * @returns - */ - _blockKey(name: string, index: number): string; - _getBlock(store: any, file: any, index: any): Promise; - _putBlock(store: any, file: any, index: any, blockData: any): void; - _purgeCache(store: any, file: any, size?: number): void; - _flushCache(store: any, file: any): Promise; - _sync(file: any): Promise; - /** - * Helper function that deletes all keys greater or equal to `key` - * provided they start with `prefix`. - * @param {string} key - * @param {string} [prefix] - * @returns - */ - _delete(key: string, prefix?: string): Promise; - } -} - -/** @ignore */ -declare module "wa-sqlite/src/examples/MemoryVFS.js" { - import * as VFS from "wa-sqlite/src/VFS.js"; - /** @ignore */ - export class MemoryVFS extends VFS.Base { - name: string; - mapNameToFile: Map; - mapIdToFile: Map; - } -} - -/** @ignore */ -declare module "wa-sqlite/src/examples/MemoryAsyncVFS.js" { - import { MemoryVFS } from "wa-sqlite/src/examples/MemoryVFS.js"; - export class MemoryAsyncVFS extends MemoryVFS {} -} - -/** @ignore */ -declare module "wa-sqlite/src/examples/tag.js" { - /** - * @ignore - * Template tag builder. This function creates a tag with an API and - * database from the same module, then the tag can be used like this: - * ``` - * const sql = tag(sqlite3, db); - * const results = await sql` - * SELECT 1 + 1; - * SELECT 6 * 7; - * `; - * ``` - * The returned Promise value contains an array of results for each - * SQL statement that produces output. Each result is an object with - * properties `columns` (array of names) and `rows` (array of array - * of values). - * @param {SQLiteAPI} sqlite3 - * @param {number} db - * @returns {function(TemplateStringsArray, ...any): Promise} - */ - export function tag(sqlite3: any, db: number): (arg0: TemplateStringsArray, ...args: any[]) => Promise; -} diff --git a/apps/web/core/local-db/worker/wa-sqlite/src/wa-sqlite.mjs b/apps/web/core/local-db/worker/wa-sqlite/src/wa-sqlite.mjs deleted file mode 100644 index 7ba5e77d46..0000000000 --- a/apps/web/core/local-db/worker/wa-sqlite/src/wa-sqlite.mjs +++ /dev/null @@ -1,16 +0,0 @@ - -var Module = (() => { - var _scriptName = import.meta.url; - - return ( -function(moduleArg = {}) { - var moduleRtn; - -var Module=moduleArg;var readyPromiseResolve,readyPromiseReject;var readyPromise=new Promise((resolve,reject)=>{readyPromiseResolve=resolve;readyPromiseReject=reject});var ENVIRONMENT_IS_WEB=typeof window=="object";var ENVIRONMENT_IS_WORKER=typeof importScripts=="function";var ENVIRONMENT_IS_NODE=typeof process=="object"&&typeof process.versions=="object"&&typeof process.versions.node=="string";var moduleOverrides=Object.assign({},Module);var arguments_=[];var thisProgram="./this.program";var quit_=(status,toThrow)=>{throw toThrow};var scriptDirectory="";function locateFile(path){if(Module["locateFile"]){return Module["locateFile"](path,scriptDirectory)}return scriptDirectory+path}var readAsync,readBinary;if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){if(ENVIRONMENT_IS_WORKER){scriptDirectory=self.location.href}else if(typeof document!="undefined"&&document.currentScript){scriptDirectory=document.currentScript.src}if(_scriptName){scriptDirectory=_scriptName}if(scriptDirectory.startsWith("blob:")){scriptDirectory=""}else{scriptDirectory=scriptDirectory.substr(0,scriptDirectory.replace(/[?#].*/,"").lastIndexOf("/")+1)}{if(ENVIRONMENT_IS_WORKER){readBinary=url=>{var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.responseType="arraybuffer";xhr.send(null);return new Uint8Array(xhr.response)}}readAsync=url=>fetch(url,{credentials:"same-origin"}).then(response=>{if(response.ok){return response.arrayBuffer()}return Promise.reject(new Error(response.status+" : "+response.url))})}}else{}var out=Module["print"]||console.log.bind(console);var err=Module["printErr"]||console.error.bind(console);Object.assign(Module,moduleOverrides);moduleOverrides=null;if(Module["arguments"])arguments_=Module["arguments"];if(Module["thisProgram"])thisProgram=Module["thisProgram"];var wasmBinary=Module["wasmBinary"];var wasmMemory;var ABORT=false;var EXITSTATUS;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;function updateMemoryViews(){var b=wasmMemory.buffer;Module["HEAP8"]=HEAP8=new Int8Array(b);Module["HEAP16"]=HEAP16=new Int16Array(b);Module["HEAPU8"]=HEAPU8=new Uint8Array(b);Module["HEAPU16"]=HEAPU16=new Uint16Array(b);Module["HEAP32"]=HEAP32=new Int32Array(b);Module["HEAPU32"]=HEAPU32=new Uint32Array(b);Module["HEAPF32"]=HEAPF32=new Float32Array(b);Module["HEAPF64"]=HEAPF64=new Float64Array(b)}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function initRuntime(){runtimeInitialized=true;if(!Module["noFSInit"]&&!FS.initialized)FS.init();FS.ignorePermissions=false;TTY.init();callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}function addOnInit(cb){__ATINIT__.unshift(cb)}function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;Module["monitorRunDependencies"]?.(runDependencies)}function removeRunDependency(id){runDependencies--;Module["monitorRunDependencies"]?.(runDependencies);if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}function abort(what){Module["onAbort"]?.(what);what="Aborted("+what+")";err(what);ABORT=true;what+=". Build with -sASSERTIONS for more info.";var e=new WebAssembly.RuntimeError(what);readyPromiseReject(e);throw e}var dataURIPrefix="data:application/octet-stream;base64,";var isDataURI=filename=>filename.startsWith(dataURIPrefix);function findWasmBinary(){if(Module["locateFile"]){var f="wa-sqlite.wasm";if(!isDataURI(f)){return locateFile(f)}return f}return new URL("wa-sqlite.wasm",import.meta.url).href}var wasmBinaryFile;function getBinarySync(file){if(file==wasmBinaryFile&&wasmBinary){return new Uint8Array(wasmBinary)}if(readBinary){return readBinary(file)}throw"both async and sync fetching of the wasm failed"}function getBinaryPromise(binaryFile){if(!wasmBinary){return readAsync(binaryFile).then(response=>new Uint8Array(response),()=>getBinarySync(binaryFile))}return Promise.resolve().then(()=>getBinarySync(binaryFile))}function instantiateArrayBuffer(binaryFile,imports,receiver){return getBinaryPromise(binaryFile).then(binary=>WebAssembly.instantiate(binary,imports)).then(receiver,reason=>{err(`failed to asynchronously prepare wasm: ${reason}`);abort(reason)})}function instantiateAsync(binary,binaryFile,imports,callback){if(!binary&&typeof WebAssembly.instantiateStreaming=="function"&&!isDataURI(binaryFile)&&typeof fetch=="function"){return fetch(binaryFile,{credentials:"same-origin"}).then(response=>{var result=WebAssembly.instantiateStreaming(response,imports);return result.then(callback,function(reason){err(`wasm streaming compile failed: ${reason}`);err("falling back to ArrayBuffer instantiation");return instantiateArrayBuffer(binaryFile,imports,callback)})})}return instantiateArrayBuffer(binaryFile,imports,callback)}function getWasmImports(){return{a:wasmImports}}function createWasm(){var info=getWasmImports();function receiveInstance(instance,module){wasmExports=instance.exports;wasmMemory=wasmExports["pa"];updateMemoryViews();wasmTable=wasmExports["hf"];addOnInit(wasmExports["qa"]);removeRunDependency("wasm-instantiate");return wasmExports}addRunDependency("wasm-instantiate");function receiveInstantiationResult(result){receiveInstance(result["instance"])}if(Module["instantiateWasm"]){try{return Module["instantiateWasm"](info,receiveInstance)}catch(e){err(`Module.instantiateWasm callback failed with error: ${e}`);readyPromiseReject(e)}}if(!wasmBinaryFile)wasmBinaryFile=findWasmBinary();instantiateAsync(wasmBinary,wasmBinaryFile,info,receiveInstantiationResult).catch(readyPromiseReject);return{}}var tempDouble;var tempI64;function ExitStatus(status){this.name="ExitStatus";this.message=`Program terminated with exit(${status})`;this.status=status}var callRuntimeCallbacks=callbacks=>{while(callbacks.length>0){callbacks.shift()(Module)}};function getValue(ptr,type="i8"){if(type.endsWith("*"))type="*";switch(type){case"i1":return HEAP8[ptr];case"i8":return HEAP8[ptr];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":abort("to do getValue(i64) use WASM_BIGINT");case"float":return HEAPF32[ptr>>2];case"double":return HEAPF64[ptr>>3];case"*":return HEAPU32[ptr>>2];default:abort(`invalid type for getValue: ${type}`)}}var noExitRuntime=Module["noExitRuntime"]||true;function setValue(ptr,value,type="i8"){if(type.endsWith("*"))type="*";switch(type){case"i1":HEAP8[ptr]=value;break;case"i8":HEAP8[ptr]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":abort("to do setValue(i64) use WASM_BIGINT");case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;case"*":HEAPU32[ptr>>2]=value;break;default:abort(`invalid type for setValue: ${type}`)}}var stackRestore=val=>__emscripten_stack_restore(val);var stackSave=()=>_emscripten_stack_get_current();var UTF8Decoder=typeof TextDecoder!="undefined"?new TextDecoder:undefined;var UTF8ArrayToString=(heapOrArray,idx,maxBytesToRead)=>{var endIdx=idx+maxBytesToRead;var endPtr=idx;while(heapOrArray[endPtr]&&!(endPtr>=endIdx))++endPtr;if(endPtr-idx>16&&heapOrArray.buffer&&UTF8Decoder){return UTF8Decoder.decode(heapOrArray.subarray(idx,endPtr))}var str="";while(idx>10,56320|ch&1023)}}return str};var UTF8ToString=(ptr,maxBytesToRead)=>ptr?UTF8ArrayToString(HEAPU8,ptr,maxBytesToRead):"";var ___assert_fail=(condition,filename,line,func)=>{abort(`Assertion failed: ${UTF8ToString(condition)}, at: `+[filename?UTF8ToString(filename):"unknown filename",line,func?UTF8ToString(func):"unknown function"])};var PATH={isAbs:path=>path.charAt(0)==="/",splitPath:filename=>{var splitPathRe=/^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/;return splitPathRe.exec(filename).slice(1)},normalizeArray:(parts,allowAboveRoot)=>{var up=0;for(var i=parts.length-1;i>=0;i--){var last=parts[i];if(last==="."){parts.splice(i,1)}else if(last===".."){parts.splice(i,1);up++}else if(up){parts.splice(i,1);up--}}if(allowAboveRoot){for(;up;up--){parts.unshift("..")}}return parts},normalize:path=>{var isAbsolute=PATH.isAbs(path),trailingSlash=path.substr(-1)==="/";path=PATH.normalizeArray(path.split("/").filter(p=>!!p),!isAbsolute).join("/");if(!path&&!isAbsolute){path="."}if(path&&trailingSlash){path+="/"}return(isAbsolute?"/":"")+path},dirname:path=>{var result=PATH.splitPath(path),root=result[0],dir=result[1];if(!root&&!dir){return"."}if(dir){dir=dir.substr(0,dir.length-1)}return root+dir},basename:path=>{if(path==="/")return"/";path=PATH.normalize(path);path=path.replace(/\/$/,"");var lastSlash=path.lastIndexOf("/");if(lastSlash===-1)return path;return path.substr(lastSlash+1)},join:(...paths)=>PATH.normalize(paths.join("/")),join2:(l,r)=>PATH.normalize(l+"/"+r)};var initRandomFill=()=>{if(typeof crypto=="object"&&typeof crypto["getRandomValues"]=="function"){return view=>crypto.getRandomValues(view)}else abort("initRandomDevice")};var randomFill=view=>(randomFill=initRandomFill())(view);var PATH_FS={resolve:(...args)=>{var resolvedPath="",resolvedAbsolute=false;for(var i=args.length-1;i>=-1&&!resolvedAbsolute;i--){var path=i>=0?args[i]:FS.cwd();if(typeof path!="string"){throw new TypeError("Arguments to path.resolve must be strings")}else if(!path){return""}resolvedPath=path+"/"+resolvedPath;resolvedAbsolute=PATH.isAbs(path)}resolvedPath=PATH.normalizeArray(resolvedPath.split("/").filter(p=>!!p),!resolvedAbsolute).join("/");return(resolvedAbsolute?"/":"")+resolvedPath||"."},relative:(from,to)=>{from=PATH_FS.resolve(from).substr(1);to=PATH_FS.resolve(to).substr(1);function trim(arr){var start=0;for(;start=0;end--){if(arr[end]!=="")break}if(start>end)return[];return arr.slice(start,end-start+1)}var fromParts=trim(from.split("/"));var toParts=trim(to.split("/"));var length=Math.min(fromParts.length,toParts.length);var samePartsLength=length;for(var i=0;i{var len=0;for(var i=0;i=55296&&c<=57343){len+=4;++i}else{len+=3}}return len};var stringToUTF8Array=(str,heap,outIdx,maxBytesToWrite)=>{if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343){var u1=str.charCodeAt(++i);u=65536+((u&1023)<<10)|u1&1023}if(u<=127){if(outIdx>=endIdx)break;heap[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;heap[outIdx++]=192|u>>6;heap[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;heap[outIdx++]=224|u>>12;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}else{if(outIdx+3>=endIdx)break;heap[outIdx++]=240|u>>18;heap[outIdx++]=128|u>>12&63;heap[outIdx++]=128|u>>6&63;heap[outIdx++]=128|u&63}}heap[outIdx]=0;return outIdx-startIdx};function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}var FS_stdin_getChar=()=>{if(!FS_stdin_getChar_buffer.length){var result=null;if(typeof window!="undefined"&&typeof window.prompt=="function"){result=window.prompt("Input: ");if(result!==null){result+="\n"}}else{}if(!result){return null}FS_stdin_getChar_buffer=intArrayFromString(result,true)}return FS_stdin_getChar_buffer.shift()};var TTY={ttys:[],init(){},shutdown(){},register(dev,ops){TTY.ttys[dev]={input:[],output:[],ops};FS.registerDevice(dev,TTY.stream_ops)},stream_ops:{open(stream){var tty=TTY.ttys[stream.node.rdev];if(!tty){throw new FS.ErrnoError(43)}stream.tty=tty;stream.seekable=false},close(stream){stream.tty.ops.fsync(stream.tty)},fsync(stream){stream.tty.ops.fsync(stream.tty)},read(stream,buffer,offset,length,pos){if(!stream.tty||!stream.tty.ops.get_char){throw new FS.ErrnoError(60)}var bytesRead=0;for(var i=0;i0){out(UTF8ArrayToString(tty.output,0));tty.output=[]}},ioctl_tcgets(tty){return{c_iflag:25856,c_oflag:5,c_cflag:191,c_lflag:35387,c_cc:[3,28,127,21,4,0,1,0,17,19,26,0,18,15,23,22,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]}},ioctl_tcsets(tty,optional_actions,data){return 0},ioctl_tiocgwinsz(tty){return[24,80]}},default_tty1_ops:{put_char(tty,val){if(val===null||val===10){err(UTF8ArrayToString(tty.output,0));tty.output=[]}else{if(val!=0)tty.output.push(val)}},fsync(tty){if(tty.output&&tty.output.length>0){err(UTF8ArrayToString(tty.output,0));tty.output=[]}}}};var zeroMemory=(address,size)=>{HEAPU8.fill(0,address,address+size);return address};var alignMemory=(size,alignment)=>Math.ceil(size/alignment)*alignment;var mmapAlloc=size=>{size=alignMemory(size,65536);var ptr=_emscripten_builtin_memalign(65536,size);if(!ptr)return 0;return zeroMemory(ptr,size)};var MEMFS={ops_table:null,mount(mount){return MEMFS.createNode(null,"/",16384|511,0)},createNode(parent,name,mode,dev){if(FS.isBlkdev(mode)||FS.isFIFO(mode)){throw new FS.ErrnoError(63)}MEMFS.ops_table||={dir:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,lookup:MEMFS.node_ops.lookup,mknod:MEMFS.node_ops.mknod,rename:MEMFS.node_ops.rename,unlink:MEMFS.node_ops.unlink,rmdir:MEMFS.node_ops.rmdir,readdir:MEMFS.node_ops.readdir,symlink:MEMFS.node_ops.symlink},stream:{llseek:MEMFS.stream_ops.llseek}},file:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:{llseek:MEMFS.stream_ops.llseek,read:MEMFS.stream_ops.read,write:MEMFS.stream_ops.write,allocate:MEMFS.stream_ops.allocate,mmap:MEMFS.stream_ops.mmap,msync:MEMFS.stream_ops.msync}},link:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr,readlink:MEMFS.node_ops.readlink},stream:{}},chrdev:{node:{getattr:MEMFS.node_ops.getattr,setattr:MEMFS.node_ops.setattr},stream:FS.chrdev_stream_ops}};var node=FS.createNode(parent,name,mode,dev);if(FS.isDir(node.mode)){node.node_ops=MEMFS.ops_table.dir.node;node.stream_ops=MEMFS.ops_table.dir.stream;node.contents={}}else if(FS.isFile(node.mode)){node.node_ops=MEMFS.ops_table.file.node;node.stream_ops=MEMFS.ops_table.file.stream;node.usedBytes=0;node.contents=null}else if(FS.isLink(node.mode)){node.node_ops=MEMFS.ops_table.link.node;node.stream_ops=MEMFS.ops_table.link.stream}else if(FS.isChrdev(node.mode)){node.node_ops=MEMFS.ops_table.chrdev.node;node.stream_ops=MEMFS.ops_table.chrdev.stream}node.timestamp=Date.now();if(parent){parent.contents[name]=node;parent.timestamp=node.timestamp}return node},getFileDataAsTypedArray(node){if(!node.contents)return new Uint8Array(0);if(node.contents.subarray)return node.contents.subarray(0,node.usedBytes);return new Uint8Array(node.contents)},expandFileStorage(node,newCapacity){var prevCapacity=node.contents?node.contents.length:0;if(prevCapacity>=newCapacity)return;var CAPACITY_DOUBLING_MAX=1024*1024;newCapacity=Math.max(newCapacity,prevCapacity*(prevCapacity>>0);if(prevCapacity!=0)newCapacity=Math.max(newCapacity,256);var oldContents=node.contents;node.contents=new Uint8Array(newCapacity);if(node.usedBytes>0)node.contents.set(oldContents.subarray(0,node.usedBytes),0)},resizeFileStorage(node,newSize){if(node.usedBytes==newSize)return;if(newSize==0){node.contents=null;node.usedBytes=0}else{var oldContents=node.contents;node.contents=new Uint8Array(newSize);if(oldContents){node.contents.set(oldContents.subarray(0,Math.min(newSize,node.usedBytes)))}node.usedBytes=newSize}},node_ops:{getattr(node){var attr={};attr.dev=FS.isChrdev(node.mode)?node.id:1;attr.ino=node.id;attr.mode=node.mode;attr.nlink=1;attr.uid=0;attr.gid=0;attr.rdev=node.rdev;if(FS.isDir(node.mode)){attr.size=4096}else if(FS.isFile(node.mode)){attr.size=node.usedBytes}else if(FS.isLink(node.mode)){attr.size=node.link.length}else{attr.size=0}attr.atime=new Date(node.timestamp);attr.mtime=new Date(node.timestamp);attr.ctime=new Date(node.timestamp);attr.blksize=4096;attr.blocks=Math.ceil(attr.size/attr.blksize);return attr},setattr(node,attr){if(attr.mode!==undefined){node.mode=attr.mode}if(attr.timestamp!==undefined){node.timestamp=attr.timestamp}if(attr.size!==undefined){MEMFS.resizeFileStorage(node,attr.size)}},lookup(parent,name){throw FS.genericErrors[44]},mknod(parent,name,mode,dev){return MEMFS.createNode(parent,name,mode,dev)},rename(old_node,new_dir,new_name){if(FS.isDir(old_node.mode)){var new_node;try{new_node=FS.lookupNode(new_dir,new_name)}catch(e){}if(new_node){for(var i in new_node.contents){throw new FS.ErrnoError(55)}}}delete old_node.parent.contents[old_node.name];old_node.parent.timestamp=Date.now();old_node.name=new_name;new_dir.contents[new_name]=old_node;new_dir.timestamp=old_node.parent.timestamp},unlink(parent,name){delete parent.contents[name];parent.timestamp=Date.now()},rmdir(parent,name){var node=FS.lookupNode(parent,name);for(var i in node.contents){throw new FS.ErrnoError(55)}delete parent.contents[name];parent.timestamp=Date.now()},readdir(node){var entries=[".",".."];for(var key of Object.keys(node.contents)){entries.push(key)}return entries},symlink(parent,newname,oldpath){var node=MEMFS.createNode(parent,newname,511|40960,0);node.link=oldpath;return node},readlink(node){if(!FS.isLink(node.mode)){throw new FS.ErrnoError(28)}return node.link}},stream_ops:{read(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=stream.node.usedBytes)return 0;var size=Math.min(stream.node.usedBytes-position,length);if(size>8&&contents.subarray){buffer.set(contents.subarray(position,position+size),offset)}else{for(var i=0;i0||position+length{var dep=!noRunDep?getUniqueRunDependency(`al ${url}`):"";readAsync(url).then(arrayBuffer=>{onload(new Uint8Array(arrayBuffer));if(dep)removeRunDependency(dep)},err=>{if(onerror){onerror()}else{throw`Loading data file "${url}" failed.`}});if(dep)addRunDependency(dep)};var FS_createDataFile=(parent,name,fileData,canRead,canWrite,canOwn)=>{FS.createDataFile(parent,name,fileData,canRead,canWrite,canOwn)};var preloadPlugins=Module["preloadPlugins"]||[];var FS_handledByPreloadPlugin=(byteArray,fullname,finish,onerror)=>{if(typeof Browser!="undefined")Browser.init();var handled=false;preloadPlugins.forEach(plugin=>{if(handled)return;if(plugin["canHandle"](fullname)){plugin["handle"](byteArray,fullname,finish,onerror);handled=true}});return handled};var FS_createPreloadedFile=(parent,name,url,canRead,canWrite,onload,onerror,dontCreateFile,canOwn,preFinish)=>{var fullname=name?PATH_FS.resolve(PATH.join2(parent,name)):parent;var dep=getUniqueRunDependency(`cp ${fullname}`);function processData(byteArray){function finish(byteArray){preFinish?.();if(!dontCreateFile){FS_createDataFile(parent,name,byteArray,canRead,canWrite,canOwn)}onload?.();removeRunDependency(dep)}if(FS_handledByPreloadPlugin(byteArray,fullname,finish,()=>{onerror?.();removeRunDependency(dep)})){return}finish(byteArray)}addRunDependency(dep);if(typeof url=="string"){asyncLoad(url,processData,onerror)}else{processData(url)}};var FS_modeStringToFlags=str=>{var flagModes={r:0,"r+":2,w:512|64|1,"w+":512|64|2,a:1024|64|1,"a+":1024|64|2};var flags=flagModes[str];if(typeof flags=="undefined"){throw new Error(`Unknown file open mode: ${str}`)}return flags};var FS_getMode=(canRead,canWrite)=>{var mode=0;if(canRead)mode|=292|73;if(canWrite)mode|=146;return mode};var FS={root:null,mounts:[],devices:{},streams:[],nextInode:1,nameTable:null,currentPath:"/",initialized:false,ignorePermissions:true,ErrnoError:class{constructor(errno){this.name="ErrnoError";this.errno=errno}},genericErrors:{},filesystems:null,syncFSRequests:0,FSStream:class{constructor(){this.shared={}}get object(){return this.node}set object(val){this.node=val}get isRead(){return(this.flags&2097155)!==1}get isWrite(){return(this.flags&2097155)!==0}get isAppend(){return this.flags&1024}get flags(){return this.shared.flags}set flags(val){this.shared.flags=val}get position(){return this.shared.position}set position(val){this.shared.position=val}},FSNode:class{constructor(parent,name,mode,rdev){if(!parent){parent=this}this.parent=parent;this.mount=parent.mount;this.mounted=null;this.id=FS.nextInode++;this.name=name;this.mode=mode;this.node_ops={};this.stream_ops={};this.rdev=rdev;this.readMode=292|73;this.writeMode=146}get read(){return(this.mode&this.readMode)===this.readMode}set read(val){val?this.mode|=this.readMode:this.mode&=~this.readMode}get write(){return(this.mode&this.writeMode)===this.writeMode}set write(val){val?this.mode|=this.writeMode:this.mode&=~this.writeMode}get isFolder(){return FS.isDir(this.mode)}get isDevice(){return FS.isChrdev(this.mode)}},lookupPath(path,opts={}){path=PATH_FS.resolve(path);if(!path)return{path:"",node:null};var defaults={follow_mount:true,recurse_count:0};opts=Object.assign(defaults,opts);if(opts.recurse_count>8){throw new FS.ErrnoError(32)}var parts=path.split("/").filter(p=>!!p);var current=FS.root;var current_path="/";for(var i=0;i40){throw new FS.ErrnoError(32)}}}}return{path:current_path,node:current}},getPath(node){var path;while(true){if(FS.isRoot(node)){var mount=node.mount.mountpoint;if(!path)return mount;return mount[mount.length-1]!=="/"?`${mount}/${path}`:mount+path}path=path?`${node.name}/${path}`:node.name;node=node.parent}},hashName(parentid,name){var hash=0;for(var i=0;i>>0)%FS.nameTable.length},hashAddNode(node){var hash=FS.hashName(node.parent.id,node.name);node.name_next=FS.nameTable[hash];FS.nameTable[hash]=node},hashRemoveNode(node){var hash=FS.hashName(node.parent.id,node.name);if(FS.nameTable[hash]===node){FS.nameTable[hash]=node.name_next}else{var current=FS.nameTable[hash];while(current){if(current.name_next===node){current.name_next=node.name_next;break}current=current.name_next}}},lookupNode(parent,name){var errCode=FS.mayLookup(parent);if(errCode){throw new FS.ErrnoError(errCode)}var hash=FS.hashName(parent.id,name);for(var node=FS.nameTable[hash];node;node=node.name_next){var nodeName=node.name;if(node.parent.id===parent.id&&nodeName===name){return node}}return FS.lookup(parent,name)},createNode(parent,name,mode,rdev){var node=new FS.FSNode(parent,name,mode,rdev);FS.hashAddNode(node);return node},destroyNode(node){FS.hashRemoveNode(node)},isRoot(node){return node===node.parent},isMountpoint(node){return!!node.mounted},isFile(mode){return(mode&61440)===32768},isDir(mode){return(mode&61440)===16384},isLink(mode){return(mode&61440)===40960},isChrdev(mode){return(mode&61440)===8192},isBlkdev(mode){return(mode&61440)===24576},isFIFO(mode){return(mode&61440)===4096},isSocket(mode){return(mode&49152)===49152},flagsToPermissionString(flag){var perms=["r","w","rw"][flag&3];if(flag&512){perms+="w"}return perms},nodePermissions(node,perms){if(FS.ignorePermissions){return 0}if(perms.includes("r")&&!(node.mode&292)){return 2}else if(perms.includes("w")&&!(node.mode&146)){return 2}else if(perms.includes("x")&&!(node.mode&73)){return 2}return 0},mayLookup(dir){if(!FS.isDir(dir.mode))return 54;var errCode=FS.nodePermissions(dir,"x");if(errCode)return errCode;if(!dir.node_ops.lookup)return 2;return 0},mayCreate(dir,name){try{var node=FS.lookupNode(dir,name);return 20}catch(e){}return FS.nodePermissions(dir,"wx")},mayDelete(dir,name,isdir){var node;try{node=FS.lookupNode(dir,name)}catch(e){return e.errno}var errCode=FS.nodePermissions(dir,"wx");if(errCode){return errCode}if(isdir){if(!FS.isDir(node.mode)){return 54}if(FS.isRoot(node)||FS.getPath(node)===FS.cwd()){return 10}}else{if(FS.isDir(node.mode)){return 31}}return 0},mayOpen(node,flags){if(!node){return 44}if(FS.isLink(node.mode)){return 32}else if(FS.isDir(node.mode)){if(FS.flagsToPermissionString(flags)!=="r"||flags&512){return 31}}return FS.nodePermissions(node,FS.flagsToPermissionString(flags))},MAX_OPEN_FDS:4096,nextfd(){for(var fd=0;fd<=FS.MAX_OPEN_FDS;fd++){if(!FS.streams[fd]){return fd}}throw new FS.ErrnoError(33)},getStreamChecked(fd){var stream=FS.getStream(fd);if(!stream){throw new FS.ErrnoError(8)}return stream},getStream:fd=>FS.streams[fd],createStream(stream,fd=-1){stream=Object.assign(new FS.FSStream,stream);if(fd==-1){fd=FS.nextfd()}stream.fd=fd;FS.streams[fd]=stream;return stream},closeStream(fd){FS.streams[fd]=null},dupStream(origStream,fd=-1){var stream=FS.createStream(origStream,fd);stream.stream_ops?.dup?.(stream);return stream},chrdev_stream_ops:{open(stream){var device=FS.getDevice(stream.node.rdev);stream.stream_ops=device.stream_ops;stream.stream_ops.open?.(stream)},llseek(){throw new FS.ErrnoError(70)}},major:dev=>dev>>8,minor:dev=>dev&255,makedev:(ma,mi)=>ma<<8|mi,registerDevice(dev,ops){FS.devices[dev]={stream_ops:ops}},getDevice:dev=>FS.devices[dev],getMounts(mount){var mounts=[];var check=[mount];while(check.length){var m=check.pop();mounts.push(m);check.push(...m.mounts)}return mounts},syncfs(populate,callback){if(typeof populate=="function"){callback=populate;populate=false}FS.syncFSRequests++;if(FS.syncFSRequests>1){err(`warning: ${FS.syncFSRequests} FS.syncfs operations in flight at once, probably just doing extra work`)}var mounts=FS.getMounts(FS.root.mount);var completed=0;function doCallback(errCode){FS.syncFSRequests--;return callback(errCode)}function done(errCode){if(errCode){if(!done.errored){done.errored=true;return doCallback(errCode)}return}if(++completed>=mounts.length){doCallback(null)}}mounts.forEach(mount=>{if(!mount.type.syncfs){return done(null)}mount.type.syncfs(mount,populate,done)})},mount(type,opts,mountpoint){var root=mountpoint==="/";var pseudo=!mountpoint;var node;if(root&&FS.root){throw new FS.ErrnoError(10)}else if(!root&&!pseudo){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});mountpoint=lookup.path;node=lookup.node;if(FS.isMountpoint(node)){throw new FS.ErrnoError(10)}if(!FS.isDir(node.mode)){throw new FS.ErrnoError(54)}}var mount={type,opts,mountpoint,mounts:[]};var mountRoot=type.mount(mount);mountRoot.mount=mount;mount.root=mountRoot;if(root){FS.root=mountRoot}else if(node){node.mounted=mount;if(node.mount){node.mount.mounts.push(mount)}}return mountRoot},unmount(mountpoint){var lookup=FS.lookupPath(mountpoint,{follow_mount:false});if(!FS.isMountpoint(lookup.node)){throw new FS.ErrnoError(28)}var node=lookup.node;var mount=node.mounted;var mounts=FS.getMounts(mount);Object.keys(FS.nameTable).forEach(hash=>{var current=FS.nameTable[hash];while(current){var next=current.name_next;if(mounts.includes(current.mount)){FS.destroyNode(current)}current=next}});node.mounted=null;var idx=node.mount.mounts.indexOf(mount);node.mount.mounts.splice(idx,1)},lookup(parent,name){return parent.node_ops.lookup(parent,name)},mknod(path,mode,dev){var lookup=FS.lookupPath(path,{parent:true});var parent=lookup.node;var name=PATH.basename(path);if(!name||name==="."||name===".."){throw new FS.ErrnoError(28)}var errCode=FS.mayCreate(parent,name);if(errCode){throw new FS.ErrnoError(errCode)}if(!parent.node_ops.mknod){throw new FS.ErrnoError(63)}return parent.node_ops.mknod(parent,name,mode,dev)},create(path,mode){mode=mode!==undefined?mode:438;mode&=4095;mode|=32768;return FS.mknod(path,mode,0)},mkdir(path,mode){mode=mode!==undefined?mode:511;mode&=511|512;mode|=16384;return FS.mknod(path,mode,0)},mkdirTree(path,mode){var dirs=path.split("/");var d="";for(var i=0;iFS.currentPath,chdir(path){var lookup=FS.lookupPath(path,{follow:true});if(lookup.node===null){throw new FS.ErrnoError(44)}if(!FS.isDir(lookup.node.mode)){throw new FS.ErrnoError(54)}var errCode=FS.nodePermissions(lookup.node,"x");if(errCode){throw new FS.ErrnoError(errCode)}FS.currentPath=lookup.path},createDefaultDirectories(){FS.mkdir("/tmp");FS.mkdir("/home");FS.mkdir("/home/web_user")},createDefaultDevices(){FS.mkdir("/dev");FS.registerDevice(FS.makedev(1,3),{read:()=>0,write:(stream,buffer,offset,length,pos)=>length});FS.mkdev("/dev/null",FS.makedev(1,3));TTY.register(FS.makedev(5,0),TTY.default_tty_ops);TTY.register(FS.makedev(6,0),TTY.default_tty1_ops);FS.mkdev("/dev/tty",FS.makedev(5,0));FS.mkdev("/dev/tty1",FS.makedev(6,0));var randomBuffer=new Uint8Array(1024),randomLeft=0;var randomByte=()=>{if(randomLeft===0){randomLeft=randomFill(randomBuffer).byteLength}return randomBuffer[--randomLeft]};FS.createDevice("/dev","random",randomByte);FS.createDevice("/dev","urandom",randomByte);FS.mkdir("/dev/shm");FS.mkdir("/dev/shm/tmp")},createSpecialDirectories(){FS.mkdir("/proc");var proc_self=FS.mkdir("/proc/self");FS.mkdir("/proc/self/fd");FS.mount({mount(){var node=FS.createNode(proc_self,"fd",16384|511,73);node.node_ops={lookup(parent,name){var fd=+name;var stream=FS.getStreamChecked(fd);var ret={parent:null,mount:{mountpoint:"fake"},node_ops:{readlink:()=>stream.path}};ret.parent=ret;return ret}};return node}},{},"/proc/self/fd")},createStandardStreams(input,output,error){if(input){FS.createDevice("/dev","stdin",input)}else{FS.symlink("/dev/tty","/dev/stdin")}if(output){FS.createDevice("/dev","stdout",null,output)}else{FS.symlink("/dev/tty","/dev/stdout")}if(error){FS.createDevice("/dev","stderr",null,error)}else{FS.symlink("/dev/tty1","/dev/stderr")}var stdin=FS.open("/dev/stdin",0);var stdout=FS.open("/dev/stdout",1);var stderr=FS.open("/dev/stderr",1)},staticInit(){[44].forEach(code=>{FS.genericErrors[code]=new FS.ErrnoError(code);FS.genericErrors[code].stack=""});FS.nameTable=new Array(4096);FS.mount(MEMFS,{},"/");FS.createDefaultDirectories();FS.createDefaultDevices();FS.createSpecialDirectories();FS.filesystems={MEMFS}},init(input,output,error){FS.initialized=true;input??=Module["stdin"];output??=Module["stdout"];error??=Module["stderr"];FS.createStandardStreams(input,output,error)},quit(){FS.initialized=false;for(var i=0;ithis.length-1||idx<0){return undefined}var chunkOffset=idx%this.chunkSize;var chunkNum=idx/this.chunkSize|0;return this.getter(chunkNum)[chunkOffset]}setDataGetter(getter){this.getter=getter}cacheLength(){var xhr=new XMLHttpRequest;xhr.open("HEAD",url,false);xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);var datalength=Number(xhr.getResponseHeader("Content-length"));var header;var hasByteServing=(header=xhr.getResponseHeader("Accept-Ranges"))&&header==="bytes";var usesGzip=(header=xhr.getResponseHeader("Content-Encoding"))&&header==="gzip";var chunkSize=1024*1024;if(!hasByteServing)chunkSize=datalength;var doXHR=(from,to)=>{if(from>to)throw new Error("invalid range ("+from+", "+to+") or no bytes requested!");if(to>datalength-1)throw new Error("only "+datalength+" bytes available! programmer error!");var xhr=new XMLHttpRequest;xhr.open("GET",url,false);if(datalength!==chunkSize)xhr.setRequestHeader("Range","bytes="+from+"-"+to);xhr.responseType="arraybuffer";if(xhr.overrideMimeType){xhr.overrideMimeType("text/plain; charset=x-user-defined")}xhr.send(null);if(!(xhr.status>=200&&xhr.status<300||xhr.status===304))throw new Error("Couldn't load "+url+". Status: "+xhr.status);if(xhr.response!==undefined){return new Uint8Array(xhr.response||[])}return intArrayFromString(xhr.responseText||"",true)};var lazyArray=this;lazyArray.setDataGetter(chunkNum=>{var start=chunkNum*chunkSize;var end=(chunkNum+1)*chunkSize-1;end=Math.min(end,datalength-1);if(typeof lazyArray.chunks[chunkNum]=="undefined"){lazyArray.chunks[chunkNum]=doXHR(start,end)}if(typeof lazyArray.chunks[chunkNum]=="undefined")throw new Error("doXHR failed!");return lazyArray.chunks[chunkNum]});if(usesGzip||!datalength){chunkSize=datalength=1;datalength=this.getter(0).length;chunkSize=datalength;out("LazyFiles on gzip forces download of the whole file when length is accessed")}this._length=datalength;this._chunkSize=chunkSize;this.lengthKnown=true}get length(){if(!this.lengthKnown){this.cacheLength()}return this._length}get chunkSize(){if(!this.lengthKnown){this.cacheLength()}return this._chunkSize}}if(typeof XMLHttpRequest!="undefined"){if(!ENVIRONMENT_IS_WORKER)throw"Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc";var lazyArray=new LazyUint8Array;var properties={isDevice:false,contents:lazyArray}}else{var properties={isDevice:false,url}}var node=FS.createFile(parent,name,properties,canRead,canWrite);if(properties.contents){node.contents=properties.contents}else if(properties.url){node.contents=null;node.url=properties.url}Object.defineProperties(node,{usedBytes:{get:function(){return this.contents.length}}});var stream_ops={};var keys=Object.keys(node.stream_ops);keys.forEach(key=>{var fn=node.stream_ops[key];stream_ops[key]=(...args)=>{FS.forceLoadFile(node);return fn(...args)}});function writeChunks(stream,buffer,offset,length,position){var contents=stream.node.contents;if(position>=contents.length)return 0;var size=Math.min(contents.length-position,length);if(contents.slice){for(var i=0;i{FS.forceLoadFile(node);return writeChunks(stream,buffer,offset,length,position)};stream_ops.mmap=(stream,length,position,prot,flags)=>{FS.forceLoadFile(node);var ptr=mmapAlloc(length);if(!ptr){throw new FS.ErrnoError(48)}writeChunks(stream,HEAP8,ptr,length,position);return{ptr,allocated:true}};node.stream_ops=stream_ops;return node}};var SYSCALLS={DEFAULT_POLLMASK:5,calculateAt(dirfd,path,allowEmpty){if(PATH.isAbs(path)){return path}var dir;if(dirfd===-100){dir=FS.cwd()}else{var dirstream=SYSCALLS.getStreamFromFD(dirfd);dir=dirstream.path}if(path.length==0){if(!allowEmpty){throw new FS.ErrnoError(44)}return dir}return PATH.join2(dir,path)},doStat(func,path,buf){var stat=func(path);HEAP32[buf>>2]=stat.dev;HEAP32[buf+4>>2]=stat.mode;HEAPU32[buf+8>>2]=stat.nlink;HEAP32[buf+12>>2]=stat.uid;HEAP32[buf+16>>2]=stat.gid;HEAP32[buf+20>>2]=stat.rdev;tempI64=[stat.size>>>0,(tempDouble=stat.size,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+24>>2]=tempI64[0],HEAP32[buf+28>>2]=tempI64[1];HEAP32[buf+32>>2]=4096;HEAP32[buf+36>>2]=stat.blocks;var atime=stat.atime.getTime();var mtime=stat.mtime.getTime();var ctime=stat.ctime.getTime();tempI64=[Math.floor(atime/1e3)>>>0,(tempDouble=Math.floor(atime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+40>>2]=tempI64[0],HEAP32[buf+44>>2]=tempI64[1];HEAPU32[buf+48>>2]=atime%1e3*1e3*1e3;tempI64=[Math.floor(mtime/1e3)>>>0,(tempDouble=Math.floor(mtime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+56>>2]=tempI64[0],HEAP32[buf+60>>2]=tempI64[1];HEAPU32[buf+64>>2]=mtime%1e3*1e3*1e3;tempI64=[Math.floor(ctime/1e3)>>>0,(tempDouble=Math.floor(ctime/1e3),+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+72>>2]=tempI64[0],HEAP32[buf+76>>2]=tempI64[1];HEAPU32[buf+80>>2]=ctime%1e3*1e3*1e3;tempI64=[stat.ino>>>0,(tempDouble=stat.ino,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[buf+88>>2]=tempI64[0],HEAP32[buf+92>>2]=tempI64[1];return 0},doMsync(addr,stream,len,flags,offset){if(!FS.isFile(stream.node.mode)){throw new FS.ErrnoError(43)}if(flags&2){return 0}var buffer=HEAPU8.slice(addr,addr+len);FS.msync(stream,buffer,offset,len,flags)},getStreamFromFD(fd){var stream=FS.getStreamChecked(fd);return stream},varargs:undefined,getStr(ptr){var ret=UTF8ToString(ptr);return ret}};function ___syscall_chmod(path,mode){try{path=SYSCALLS.getStr(path);FS.chmod(path,mode);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_faccessat(dirfd,path,amode,flags){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path);if(amode&~7){return-28}var lookup=FS.lookupPath(path,{follow:true});var node=lookup.node;if(!node){return-44}var perms="";if(amode&4)perms+="r";if(amode&2)perms+="w";if(amode&1)perms+="x";if(perms&&FS.nodePermissions(node,perms)){return-2}return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_fchmod(fd,mode){try{FS.fchmod(fd,mode);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_fchown32(fd,owner,group){try{FS.fchown(fd,owner,group);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function syscallGetVarargI(){var ret=HEAP32[+SYSCALLS.varargs>>2];SYSCALLS.varargs+=4;return ret}var syscallGetVarargP=syscallGetVarargI;function ___syscall_fcntl64(fd,cmd,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(fd);switch(cmd){case 0:{var arg=syscallGetVarargI();if(arg<0){return-28}while(FS.streams[arg]){arg++}var newStream;newStream=FS.dupStream(stream,arg);return newStream.fd}case 1:case 2:return 0;case 3:return stream.flags;case 4:{var arg=syscallGetVarargI();stream.flags|=arg;return 0}case 12:{var arg=syscallGetVarargP();var offset=0;HEAP16[arg+offset>>1]=2;return 0}case 13:case 14:return 0}return-28}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function ___syscall_fstat64(fd,buf){try{var stream=SYSCALLS.getStreamFromFD(fd);return SYSCALLS.doStat(FS.stat,stream.path,buf)}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var convertI32PairToI53Checked=(lo,hi)=>hi+2097152>>>0<4194305-!!lo?(lo>>>0)+hi*4294967296:NaN;function ___syscall_ftruncate64(fd,length_low,length_high){var length=convertI32PairToI53Checked(length_low,length_high);try{if(isNaN(length))return 61;FS.ftruncate(fd,length);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var stringToUTF8=(str,outPtr,maxBytesToWrite)=>stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite);function ___syscall_getcwd(buf,size){try{if(size===0)return-28;var cwd=FS.cwd();var cwdLengthInBytes=lengthBytesUTF8(cwd)+1;if(sizeHEAPU32[ptr>>2]+HEAP32[ptr+4>>2]*4294967296;function ___syscall_utimensat(dirfd,path,times,flags){try{path=SYSCALLS.getStr(path);path=SYSCALLS.calculateAt(dirfd,path,true);var now=Date.now(),atime,mtime;if(!times){atime=now;mtime=now}else{var seconds=readI53FromI64(times);var nanoseconds=HEAP32[times+8>>2];if(nanoseconds==1073741823){atime=now}else if(nanoseconds==1073741822){atime=-1}else{atime=seconds*1e3+nanoseconds/(1e3*1e3)}times+=16;seconds=readI53FromI64(times);nanoseconds=HEAP32[times+8>>2];if(nanoseconds==1073741823){mtime=now}else if(nanoseconds==1073741822){mtime=-1}else{mtime=seconds*1e3+nanoseconds/(1e3*1e3)}}if(mtime!=-1||atime!=-1){FS.utime(path,atime,mtime)}return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var __abort_js=()=>{abort("")};var __emscripten_runtime_keepalive_clear=()=>{noExitRuntime=false;runtimeKeepaliveCounter=0};var isLeapYear=year=>year%4===0&&(year%100!==0||year%400===0);var MONTH_DAYS_LEAP_CUMULATIVE=[0,31,60,91,121,152,182,213,244,274,305,335];var MONTH_DAYS_REGULAR_CUMULATIVE=[0,31,59,90,120,151,181,212,243,273,304,334];var ydayFromDate=date=>{var leap=isLeapYear(date.getFullYear());var monthDaysCumulative=leap?MONTH_DAYS_LEAP_CUMULATIVE:MONTH_DAYS_REGULAR_CUMULATIVE;var yday=monthDaysCumulative[date.getMonth()]+date.getDate()-1;return yday};function __localtime_js(time_low,time_high,tmPtr){var time=convertI32PairToI53Checked(time_low,time_high);var date=new Date(time*1e3);HEAP32[tmPtr>>2]=date.getSeconds();HEAP32[tmPtr+4>>2]=date.getMinutes();HEAP32[tmPtr+8>>2]=date.getHours();HEAP32[tmPtr+12>>2]=date.getDate();HEAP32[tmPtr+16>>2]=date.getMonth();HEAP32[tmPtr+20>>2]=date.getFullYear()-1900;HEAP32[tmPtr+24>>2]=date.getDay();var yday=ydayFromDate(date)|0;HEAP32[tmPtr+28>>2]=yday;HEAP32[tmPtr+36>>2]=-(date.getTimezoneOffset()*60);var start=new Date(date.getFullYear(),0,1);var summerOffset=new Date(date.getFullYear(),6,1).getTimezoneOffset();var winterOffset=start.getTimezoneOffset();var dst=(summerOffset!=winterOffset&&date.getTimezoneOffset()==Math.min(winterOffset,summerOffset))|0;HEAP32[tmPtr+32>>2]=dst}function __mmap_js(len,prot,flags,fd,offset_low,offset_high,allocated,addr){var offset=convertI32PairToI53Checked(offset_low,offset_high);try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);var res=FS.mmap(stream,len,offset,prot,flags);var ptr=res.ptr;HEAP32[allocated>>2]=res.allocated;HEAPU32[addr>>2]=ptr;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}function __munmap_js(addr,len,prot,flags,fd,offset_low,offset_high){var offset=convertI32PairToI53Checked(offset_low,offset_high);try{var stream=SYSCALLS.getStreamFromFD(fd);if(prot&2){SYSCALLS.doMsync(addr,stream,len,flags,offset)}}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return-e.errno}}var timers={};var handleException=e=>{if(e instanceof ExitStatus||e=="unwind"){return EXITSTATUS}quit_(1,e)};var runtimeKeepaliveCounter=0;var keepRuntimeAlive=()=>noExitRuntime||runtimeKeepaliveCounter>0;var _proc_exit=code=>{EXITSTATUS=code;if(!keepRuntimeAlive()){Module["onExit"]?.(code);ABORT=true}quit_(code,new ExitStatus(code))};var exitJS=(status,implicit)=>{EXITSTATUS=status;_proc_exit(status)};var _exit=exitJS;var maybeExit=()=>{if(!keepRuntimeAlive()){try{_exit(EXITSTATUS)}catch(e){handleException(e)}}};var callUserCallback=func=>{if(ABORT){return}try{func();maybeExit()}catch(e){handleException(e)}};var _emscripten_get_now;_emscripten_get_now=()=>performance.now();var __setitimer_js=(which,timeout_ms)=>{if(timers[which]){clearTimeout(timers[which].id);delete timers[which]}if(!timeout_ms)return 0;var id=setTimeout(()=>{delete timers[which];callUserCallback(()=>__emscripten_timeout(which,_emscripten_get_now()))},timeout_ms);timers[which]={id,timeout_ms};return 0};var __tzset_js=(timezone,daylight,std_name,dst_name)=>{var currentYear=(new Date).getFullYear();var winter=new Date(currentYear,0,1);var summer=new Date(currentYear,6,1);var winterOffset=winter.getTimezoneOffset();var summerOffset=summer.getTimezoneOffset();var stdTimezoneOffset=Math.max(winterOffset,summerOffset);HEAPU32[timezone>>2]=stdTimezoneOffset*60;HEAP32[daylight>>2]=Number(winterOffset!=summerOffset);var extractZone=timezoneOffset=>{var sign=timezoneOffset>=0?"-":"+";var absOffset=Math.abs(timezoneOffset);var hours=String(Math.floor(absOffset/60)).padStart(2,"0");var minutes=String(absOffset%60).padStart(2,"0");return`UTC${sign}${hours}${minutes}`};var winterName=extractZone(winterOffset);var summerName=extractZone(summerOffset);if(summerOffsetDate.now();var getHeapMax=()=>2147483648;var growMemory=size=>{var b=wasmMemory.buffer;var pages=(size-b.byteLength+65535)/65536;try{wasmMemory.grow(pages);updateMemoryViews();return 1}catch(e){}};var _emscripten_resize_heap=requestedSize=>{var oldSize=HEAPU8.length;requestedSize>>>=0;var maxHeapSize=getHeapMax();if(requestedSize>maxHeapSize){return false}for(var cutDown=1;cutDown<=4;cutDown*=2){var overGrownHeapSize=oldSize*(1+.2/cutDown);overGrownHeapSize=Math.min(overGrownHeapSize,requestedSize+100663296);var newSize=Math.min(maxHeapSize,alignMemory(Math.max(requestedSize,overGrownHeapSize),65536));var replacement=growMemory(newSize);if(replacement){return true}}return false};var ENV={};var getExecutableName=()=>thisProgram||"./this.program";var getEnvStrings=()=>{if(!getEnvStrings.strings){var lang=(typeof navigator=="object"&&navigator.languages&&navigator.languages[0]||"C").replace("-","_")+".UTF-8";var env={USER:"web_user",LOGNAME:"web_user",PATH:"/",PWD:"/",HOME:"/home/web_user",LANG:lang,_:getExecutableName()};for(var x in ENV){if(ENV[x]===undefined)delete env[x];else env[x]=ENV[x]}var strings=[];for(var x in env){strings.push(`${x}=${env[x]}`)}getEnvStrings.strings=strings}return getEnvStrings.strings};var stringToAscii=(str,buffer)=>{for(var i=0;i{var bufSize=0;getEnvStrings().forEach((string,i)=>{var ptr=environ_buf+bufSize;HEAPU32[__environ+i*4>>2]=ptr;stringToAscii(string,ptr);bufSize+=string.length+1});return 0};var _environ_sizes_get=(penviron_count,penviron_buf_size)=>{var strings=getEnvStrings();HEAPU32[penviron_count>>2]=strings.length;var bufSize=0;strings.forEach(string=>bufSize+=string.length+1);HEAPU32[penviron_buf_size>>2]=bufSize;return 0};function _fd_close(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);FS.close(stream);return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function _fd_fdstat_get(fd,pbuf){try{var rightsBase=0;var rightsInheriting=0;var flags=0;{var stream=SYSCALLS.getStreamFromFD(fd);var type=stream.tty?2:FS.isDir(stream.mode)?3:FS.isLink(stream.mode)?7:4}HEAP8[pbuf]=type;HEAP16[pbuf+2>>1]=flags;tempI64=[rightsBase>>>0,(tempDouble=rightsBase,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[pbuf+8>>2]=tempI64[0],HEAP32[pbuf+12>>2]=tempI64[1];tempI64=[rightsInheriting>>>0,(tempDouble=rightsInheriting,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[pbuf+16>>2]=tempI64[0],HEAP32[pbuf+20>>2]=tempI64[1];return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doReadv=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.read(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function _fd_seek(fd,offset_low,offset_high,whence,newOffset){var offset=convertI32PairToI53Checked(offset_low,offset_high);try{if(isNaN(offset))return 61;var stream=SYSCALLS.getStreamFromFD(fd);FS.llseek(stream,offset,whence);tempI64=[stream.position>>>0,(tempDouble=stream.position,+Math.abs(tempDouble)>=1?tempDouble>0?+Math.floor(tempDouble/4294967296)>>>0:~~+Math.ceil((tempDouble-+(~~tempDouble>>>0))/4294967296)>>>0:0)],HEAP32[newOffset>>2]=tempI64[0],HEAP32[newOffset+4>>2]=tempI64[1];if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}function _fd_sync(fd){try{var stream=SYSCALLS.getStreamFromFD(fd);if(stream.stream_ops?.fsync){return stream.stream_ops.fsync(stream)}return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var doWritev=(stream,iov,iovcnt,offset)=>{var ret=0;for(var i=0;i>2];var len=HEAPU32[iov+4>>2];iov+=8;var curr=FS.write(stream,HEAP8,ptr,len,offset);if(curr<0)return-1;ret+=curr;if(curr>2]=num;return 0}catch(e){if(typeof FS=="undefined"||!(e.name==="ErrnoError"))throw e;return e.errno}}var adapters_support=function(){const handleAsync=typeof Asyncify==="object"?Asyncify.handleAsync.bind(Asyncify):null;Module["handleAsync"]=handleAsync;const targets=new Map;Module["setCallback"]=(key,target)=>targets.set(key,target);Module["getCallback"]=key=>targets.get(key);Module["deleteCallback"]=key=>targets.delete(key);adapters_support=function(isAsync,key,...args){const receiver=targets.get(key);let methodName=null;const f=typeof receiver==="function"?receiver:receiver[methodName=UTF8ToString(args.shift())];if(isAsync){if(handleAsync){return handleAsync(()=>f.apply(receiver,args))}throw new Error("Synchronous WebAssembly cannot call async function")}const result=f.apply(receiver,args);if(typeof result?.then=="function"){console.error("unexpected Promise",f);throw new Error(`${methodName} unexpectedly returned a Promise`)}return result}};function _ipp(...args){return adapters_support(false,...args)}function _ipp_async(...args){return adapters_support(true,...args)}function _ippipppp(...args){return adapters_support(false,...args)}function _ippipppp_async(...args){return adapters_support(true,...args)}function _ippp(...args){return adapters_support(false,...args)}function _ippp_async(...args){return adapters_support(true,...args)}function _ipppi(...args){return adapters_support(false,...args)}function _ipppi_async(...args){return adapters_support(true,...args)}function _ipppiii(...args){return adapters_support(false,...args)}function _ipppiii_async(...args){return adapters_support(true,...args)}function _ipppiiip(...args){return adapters_support(false,...args)}function _ipppiiip_async(...args){return adapters_support(true,...args)}function _ipppip(...args){return adapters_support(false,...args)}function _ipppip_async(...args){return adapters_support(true,...args)}function _ipppj(...args){return adapters_support(false,...args)}function _ipppj_async(...args){return adapters_support(true,...args)}function _ipppp(...args){return adapters_support(false,...args)}function _ipppp_async(...args){return adapters_support(true,...args)}function _ippppi(...args){return adapters_support(false,...args)}function _ippppi_async(...args){return adapters_support(true,...args)}function _ippppij(...args){return adapters_support(false,...args)}function _ippppij_async(...args){return adapters_support(true,...args)}function _ippppip(...args){return adapters_support(false,...args)}function _ippppip_async(...args){return adapters_support(true,...args)}function _ipppppip(...args){return adapters_support(false,...args)}function _ipppppip_async(...args){return adapters_support(true,...args)}function _vppippii(...args){return adapters_support(false,...args)}function _vppippii_async(...args){return adapters_support(true,...args)}function _vppp(...args){return adapters_support(false,...args)}function _vppp_async(...args){return adapters_support(true,...args)}function _vpppip(...args){return adapters_support(false,...args)}function _vpppip_async(...args){return adapters_support(true,...args)}var uleb128Encode=(n,target)=>{if(n<128){target.push(n)}else{target.push(n%128|128,n>>7)}};var sigToWasmTypes=sig=>{var typeNames={i:"i32",j:"i64",f:"f32",d:"f64",e:"externref",p:"i32"};var type={parameters:[],results:sig[0]=="v"?[]:[typeNames[sig[0]]]};for(var i=1;i{var sigRet=sig.slice(0,1);var sigParam=sig.slice(1);var typeCodes={i:127,p:127,j:126,f:125,d:124,e:111};target.push(96);uleb128Encode(sigParam.length,target);for(var i=0;i{if(typeof WebAssembly.Function=="function"){return new WebAssembly.Function(sigToWasmTypes(sig),func)}var typeSectionBody=[1];generateFuncType(sig,typeSectionBody);var bytes=[0,97,115,109,1,0,0,0,1];uleb128Encode(typeSectionBody.length,bytes);bytes.push(...typeSectionBody);bytes.push(2,7,1,1,101,1,102,0,0,7,5,1,1,102,0,0);var module=new WebAssembly.Module(new Uint8Array(bytes));var instance=new WebAssembly.Instance(module,{e:{f:func}});var wrappedFunc=instance.exports["f"];return wrappedFunc};var wasmTable;var getWasmTableEntry=funcPtr=>wasmTable.get(funcPtr);var updateTableMap=(offset,count)=>{if(functionsInTableMap){for(var i=offset;i{if(!functionsInTableMap){functionsInTableMap=new WeakMap;updateTableMap(0,wasmTable.length)}return functionsInTableMap.get(func)||0};var freeTableIndexes=[];var getEmptyTableSlot=()=>{if(freeTableIndexes.length){return freeTableIndexes.pop()}try{wasmTable.grow(1)}catch(err){if(!(err instanceof RangeError)){throw err}throw"Unable to grow wasm table. Set ALLOW_TABLE_GROWTH."}return wasmTable.length-1};var setWasmTableEntry=(idx,func)=>wasmTable.set(idx,func);var addFunction=(func,sig)=>{var rtn=getFunctionAddress(func);if(rtn){return rtn}var ret=getEmptyTableSlot();try{setWasmTableEntry(ret,func)}catch(err){if(!(err instanceof TypeError)){throw err}var wrapped=convertJsFunctionToWasm(func,sig);setWasmTableEntry(ret,wrapped)}functionsInTableMap.set(func,ret);return ret};var getCFunc=ident=>{var func=Module["_"+ident];return func};var writeArrayToMemory=(array,buffer)=>{HEAP8.set(array,buffer)};var stackAlloc=sz=>__emscripten_stack_alloc(sz);var stringToUTF8OnStack=str=>{var size=lengthBytesUTF8(str)+1;var ret=stackAlloc(size);stringToUTF8(str,ret,size);return ret};var ccall=(ident,returnType,argTypes,args,opts)=>{var toC={string:str=>{var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=stringToUTF8OnStack(str)}return ret},array:arr=>{var ret=stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}};function convertReturnValue(ret){if(returnType==="string"){return UTF8ToString(ret)}if(returnType==="boolean")return Boolean(ret);return ret}var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i{var numericArgs=!argTypes||argTypes.every(type=>type==="number"||type==="boolean");var numericRet=returnType!=="string";if(numericRet&&numericArgs&&!opts){return getCFunc(ident)}return(...args)=>ccall(ident,returnType,argTypes,args,opts)};var getTempRet0=val=>__emscripten_tempret_get();var stringToUTF16=(str,outPtr,maxBytesToWrite)=>{maxBytesToWrite??=2147483647;if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr};var stringToUTF32=(str,outPtr,maxBytesToWrite)=>{maxBytesToWrite??=2147483647;if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++i);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr>>2]=codeUnit;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr};var AsciiToString=ptr=>{var str="";while(1){var ch=HEAPU8[ptr++];if(!ch)return str;str+=String.fromCharCode(ch)}};var UTF16Decoder=typeof TextDecoder!="undefined"?new TextDecoder("utf-16le"):undefined;var UTF16ToString=(ptr,maxBytesToRead)=>{var endPtr=ptr;var idx=endPtr>>1;var maxIdx=idx+maxBytesToRead/2;while(!(idx>=maxIdx)&&HEAPU16[idx])++idx;endPtr=idx<<1;if(endPtr-ptr>32&&UTF16Decoder)return UTF16Decoder.decode(HEAPU8.subarray(ptr,endPtr));var str="";for(var i=0;!(i>=maxBytesToRead/2);++i){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0)break;str+=String.fromCharCode(codeUnit)}return str};var UTF32ToString=(ptr,maxBytesToRead)=>{var i=0;var str="";while(!(i>=maxBytesToRead/4)){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)break;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}return str};function intArrayToString(array){var ret=[];for(var i=0;i255){chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}FS.createPreloadedFile=FS_createPreloadedFile;FS.staticInit();adapters_support();var wasmImports={a:___assert_fail,aa:___syscall_chmod,da:___syscall_faccessat,ba:___syscall_fchmod,$:___syscall_fchown32,b:___syscall_fcntl64,_:___syscall_fstat64,y:___syscall_ftruncate64,U:___syscall_getcwd,Y:___syscall_lstat64,R:___syscall_mkdirat,W:___syscall_newfstatat,P:___syscall_openat,N:___syscall_readlinkat,M:___syscall_rmdir,Z:___syscall_stat64,K:___syscall_unlinkat,J:___syscall_utimensat,F:__abort_js,E:__emscripten_runtime_keepalive_clear,w:__localtime_js,u:__mmap_js,v:__munmap_js,G:__setitimer_js,Q:__tzset_js,n:_emscripten_date_now,g:_emscripten_get_now,H:_emscripten_resize_heap,S:_environ_get,T:_environ_sizes_get,o:_fd_close,I:_fd_fdstat_get,O:_fd_read,x:_fd_seek,V:_fd_sync,L:_fd_write,na:_ipp,r:_ipp_async,ka:_ippipppp,oa:_ippipppp_async,j:_ippp,k:_ippp_async,c:_ipppi,d:_ipppi_async,ga:_ipppiii,ha:_ipppiii_async,ia:_ipppiiip,ja:_ipppiiip_async,h:_ipppip,i:_ipppip_async,z:_ipppj,A:_ipppj_async,e:_ipppp,f:_ipppp_async,ea:_ippppi,fa:_ippppi_async,B:_ippppij,C:_ippppij_async,p:_ippppip,q:_ippppip_async,la:_ipppppip,ma:_ipppppip_async,D:_proc_exit,s:_vppippii,t:_vppippii_async,l:_vppp,m:_vppp_async,X:_vpppip,ca:_vpppip_async};var wasmExports=createWasm();var ___wasm_call_ctors=()=>(___wasm_call_ctors=wasmExports["qa"])();var _sqlite3_status64=Module["_sqlite3_status64"]=(a0,a1,a2,a3)=>(_sqlite3_status64=Module["_sqlite3_status64"]=wasmExports["ra"])(a0,a1,a2,a3);var _sqlite3_status=Module["_sqlite3_status"]=(a0,a1,a2,a3)=>(_sqlite3_status=Module["_sqlite3_status"]=wasmExports["sa"])(a0,a1,a2,a3);var _sqlite3_db_status=Module["_sqlite3_db_status"]=(a0,a1,a2,a3,a4)=>(_sqlite3_db_status=Module["_sqlite3_db_status"]=wasmExports["ta"])(a0,a1,a2,a3,a4);var _sqlite3_msize=Module["_sqlite3_msize"]=a0=>(_sqlite3_msize=Module["_sqlite3_msize"]=wasmExports["ua"])(a0);var _sqlite3_vfs_find=Module["_sqlite3_vfs_find"]=a0=>(_sqlite3_vfs_find=Module["_sqlite3_vfs_find"]=wasmExports["va"])(a0);var _sqlite3_vfs_register=Module["_sqlite3_vfs_register"]=(a0,a1)=>(_sqlite3_vfs_register=Module["_sqlite3_vfs_register"]=wasmExports["wa"])(a0,a1);var _sqlite3_vfs_unregister=Module["_sqlite3_vfs_unregister"]=a0=>(_sqlite3_vfs_unregister=Module["_sqlite3_vfs_unregister"]=wasmExports["xa"])(a0);var _sqlite3_release_memory=Module["_sqlite3_release_memory"]=a0=>(_sqlite3_release_memory=Module["_sqlite3_release_memory"]=wasmExports["ya"])(a0);var _sqlite3_soft_heap_limit64=Module["_sqlite3_soft_heap_limit64"]=(a0,a1)=>(_sqlite3_soft_heap_limit64=Module["_sqlite3_soft_heap_limit64"]=wasmExports["za"])(a0,a1);var _sqlite3_memory_used=Module["_sqlite3_memory_used"]=()=>(_sqlite3_memory_used=Module["_sqlite3_memory_used"]=wasmExports["Aa"])();var _sqlite3_hard_heap_limit64=Module["_sqlite3_hard_heap_limit64"]=(a0,a1)=>(_sqlite3_hard_heap_limit64=Module["_sqlite3_hard_heap_limit64"]=wasmExports["Ba"])(a0,a1);var _sqlite3_memory_highwater=Module["_sqlite3_memory_highwater"]=a0=>(_sqlite3_memory_highwater=Module["_sqlite3_memory_highwater"]=wasmExports["Ca"])(a0);var _sqlite3_malloc=Module["_sqlite3_malloc"]=a0=>(_sqlite3_malloc=Module["_sqlite3_malloc"]=wasmExports["Da"])(a0);var _sqlite3_malloc64=Module["_sqlite3_malloc64"]=(a0,a1)=>(_sqlite3_malloc64=Module["_sqlite3_malloc64"]=wasmExports["Ea"])(a0,a1);var _sqlite3_free=Module["_sqlite3_free"]=a0=>(_sqlite3_free=Module["_sqlite3_free"]=wasmExports["Fa"])(a0);var _sqlite3_realloc=Module["_sqlite3_realloc"]=(a0,a1)=>(_sqlite3_realloc=Module["_sqlite3_realloc"]=wasmExports["Ga"])(a0,a1);var _sqlite3_realloc64=Module["_sqlite3_realloc64"]=(a0,a1,a2)=>(_sqlite3_realloc64=Module["_sqlite3_realloc64"]=wasmExports["Ha"])(a0,a1,a2);var _sqlite3_str_vappendf=Module["_sqlite3_str_vappendf"]=(a0,a1,a2)=>(_sqlite3_str_vappendf=Module["_sqlite3_str_vappendf"]=wasmExports["Ia"])(a0,a1,a2);var _sqlite3_str_append=Module["_sqlite3_str_append"]=(a0,a1,a2)=>(_sqlite3_str_append=Module["_sqlite3_str_append"]=wasmExports["Ja"])(a0,a1,a2);var _sqlite3_str_appendchar=Module["_sqlite3_str_appendchar"]=(a0,a1,a2)=>(_sqlite3_str_appendchar=Module["_sqlite3_str_appendchar"]=wasmExports["Ka"])(a0,a1,a2);var _sqlite3_str_appendall=Module["_sqlite3_str_appendall"]=(a0,a1)=>(_sqlite3_str_appendall=Module["_sqlite3_str_appendall"]=wasmExports["La"])(a0,a1);var _sqlite3_str_appendf=Module["_sqlite3_str_appendf"]=(a0,a1,a2)=>(_sqlite3_str_appendf=Module["_sqlite3_str_appendf"]=wasmExports["Ma"])(a0,a1,a2);var _sqlite3_str_finish=Module["_sqlite3_str_finish"]=a0=>(_sqlite3_str_finish=Module["_sqlite3_str_finish"]=wasmExports["Na"])(a0);var _sqlite3_str_errcode=Module["_sqlite3_str_errcode"]=a0=>(_sqlite3_str_errcode=Module["_sqlite3_str_errcode"]=wasmExports["Oa"])(a0);var _sqlite3_str_length=Module["_sqlite3_str_length"]=a0=>(_sqlite3_str_length=Module["_sqlite3_str_length"]=wasmExports["Pa"])(a0);var _sqlite3_str_value=Module["_sqlite3_str_value"]=a0=>(_sqlite3_str_value=Module["_sqlite3_str_value"]=wasmExports["Qa"])(a0);var _sqlite3_str_reset=Module["_sqlite3_str_reset"]=a0=>(_sqlite3_str_reset=Module["_sqlite3_str_reset"]=wasmExports["Ra"])(a0);var _sqlite3_str_new=Module["_sqlite3_str_new"]=a0=>(_sqlite3_str_new=Module["_sqlite3_str_new"]=wasmExports["Sa"])(a0);var _sqlite3_vmprintf=Module["_sqlite3_vmprintf"]=(a0,a1)=>(_sqlite3_vmprintf=Module["_sqlite3_vmprintf"]=wasmExports["Ta"])(a0,a1);var _sqlite3_mprintf=Module["_sqlite3_mprintf"]=(a0,a1)=>(_sqlite3_mprintf=Module["_sqlite3_mprintf"]=wasmExports["Ua"])(a0,a1);var _sqlite3_vsnprintf=Module["_sqlite3_vsnprintf"]=(a0,a1,a2,a3)=>(_sqlite3_vsnprintf=Module["_sqlite3_vsnprintf"]=wasmExports["Va"])(a0,a1,a2,a3);var _sqlite3_snprintf=Module["_sqlite3_snprintf"]=(a0,a1,a2,a3)=>(_sqlite3_snprintf=Module["_sqlite3_snprintf"]=wasmExports["Wa"])(a0,a1,a2,a3);var _sqlite3_log=Module["_sqlite3_log"]=(a0,a1,a2)=>(_sqlite3_log=Module["_sqlite3_log"]=wasmExports["Xa"])(a0,a1,a2);var _sqlite3_randomness=Module["_sqlite3_randomness"]=(a0,a1)=>(_sqlite3_randomness=Module["_sqlite3_randomness"]=wasmExports["Ya"])(a0,a1);var _sqlite3_stricmp=Module["_sqlite3_stricmp"]=(a0,a1)=>(_sqlite3_stricmp=Module["_sqlite3_stricmp"]=wasmExports["Za"])(a0,a1);var _sqlite3_strnicmp=Module["_sqlite3_strnicmp"]=(a0,a1,a2)=>(_sqlite3_strnicmp=Module["_sqlite3_strnicmp"]=wasmExports["_a"])(a0,a1,a2);var _sqlite3_os_init=Module["_sqlite3_os_init"]=()=>(_sqlite3_os_init=Module["_sqlite3_os_init"]=wasmExports["$a"])();var _sqlite3_os_end=Module["_sqlite3_os_end"]=()=>(_sqlite3_os_end=Module["_sqlite3_os_end"]=wasmExports["ab"])();var _sqlite3_serialize=Module["_sqlite3_serialize"]=(a0,a1,a2,a3)=>(_sqlite3_serialize=Module["_sqlite3_serialize"]=wasmExports["bb"])(a0,a1,a2,a3);var _sqlite3_prepare_v2=Module["_sqlite3_prepare_v2"]=(a0,a1,a2,a3,a4)=>(_sqlite3_prepare_v2=Module["_sqlite3_prepare_v2"]=wasmExports["cb"])(a0,a1,a2,a3,a4);var _sqlite3_step=Module["_sqlite3_step"]=a0=>(_sqlite3_step=Module["_sqlite3_step"]=wasmExports["db"])(a0);var _sqlite3_column_int64=Module["_sqlite3_column_int64"]=(a0,a1)=>(_sqlite3_column_int64=Module["_sqlite3_column_int64"]=wasmExports["eb"])(a0,a1);var _sqlite3_reset=Module["_sqlite3_reset"]=a0=>(_sqlite3_reset=Module["_sqlite3_reset"]=wasmExports["fb"])(a0);var _sqlite3_exec=Module["_sqlite3_exec"]=(a0,a1,a2,a3,a4)=>(_sqlite3_exec=Module["_sqlite3_exec"]=wasmExports["gb"])(a0,a1,a2,a3,a4);var _sqlite3_column_int=Module["_sqlite3_column_int"]=(a0,a1)=>(_sqlite3_column_int=Module["_sqlite3_column_int"]=wasmExports["hb"])(a0,a1);var _sqlite3_finalize=Module["_sqlite3_finalize"]=a0=>(_sqlite3_finalize=Module["_sqlite3_finalize"]=wasmExports["ib"])(a0);var _sqlite3_deserialize=Module["_sqlite3_deserialize"]=(a0,a1,a2,a3,a4,a5,a6,a7)=>(_sqlite3_deserialize=Module["_sqlite3_deserialize"]=wasmExports["jb"])(a0,a1,a2,a3,a4,a5,a6,a7);var _sqlite3_database_file_object=Module["_sqlite3_database_file_object"]=a0=>(_sqlite3_database_file_object=Module["_sqlite3_database_file_object"]=wasmExports["kb"])(a0);var _sqlite3_backup_init=Module["_sqlite3_backup_init"]=(a0,a1,a2,a3)=>(_sqlite3_backup_init=Module["_sqlite3_backup_init"]=wasmExports["lb"])(a0,a1,a2,a3);var _sqlite3_backup_step=Module["_sqlite3_backup_step"]=(a0,a1)=>(_sqlite3_backup_step=Module["_sqlite3_backup_step"]=wasmExports["mb"])(a0,a1);var _sqlite3_backup_finish=Module["_sqlite3_backup_finish"]=a0=>(_sqlite3_backup_finish=Module["_sqlite3_backup_finish"]=wasmExports["nb"])(a0);var _sqlite3_backup_remaining=Module["_sqlite3_backup_remaining"]=a0=>(_sqlite3_backup_remaining=Module["_sqlite3_backup_remaining"]=wasmExports["ob"])(a0);var _sqlite3_backup_pagecount=Module["_sqlite3_backup_pagecount"]=a0=>(_sqlite3_backup_pagecount=Module["_sqlite3_backup_pagecount"]=wasmExports["pb"])(a0);var _sqlite3_clear_bindings=Module["_sqlite3_clear_bindings"]=a0=>(_sqlite3_clear_bindings=Module["_sqlite3_clear_bindings"]=wasmExports["qb"])(a0);var _sqlite3_value_blob=Module["_sqlite3_value_blob"]=a0=>(_sqlite3_value_blob=Module["_sqlite3_value_blob"]=wasmExports["rb"])(a0);var _sqlite3_value_text=Module["_sqlite3_value_text"]=a0=>(_sqlite3_value_text=Module["_sqlite3_value_text"]=wasmExports["sb"])(a0);var _sqlite3_value_bytes=Module["_sqlite3_value_bytes"]=a0=>(_sqlite3_value_bytes=Module["_sqlite3_value_bytes"]=wasmExports["tb"])(a0);var _sqlite3_value_bytes16=Module["_sqlite3_value_bytes16"]=a0=>(_sqlite3_value_bytes16=Module["_sqlite3_value_bytes16"]=wasmExports["ub"])(a0);var _sqlite3_value_double=Module["_sqlite3_value_double"]=a0=>(_sqlite3_value_double=Module["_sqlite3_value_double"]=wasmExports["vb"])(a0);var _sqlite3_value_int=Module["_sqlite3_value_int"]=a0=>(_sqlite3_value_int=Module["_sqlite3_value_int"]=wasmExports["wb"])(a0);var _sqlite3_value_int64=Module["_sqlite3_value_int64"]=a0=>(_sqlite3_value_int64=Module["_sqlite3_value_int64"]=wasmExports["xb"])(a0);var _sqlite3_value_subtype=Module["_sqlite3_value_subtype"]=a0=>(_sqlite3_value_subtype=Module["_sqlite3_value_subtype"]=wasmExports["yb"])(a0);var _sqlite3_value_pointer=Module["_sqlite3_value_pointer"]=(a0,a1)=>(_sqlite3_value_pointer=Module["_sqlite3_value_pointer"]=wasmExports["zb"])(a0,a1);var _sqlite3_value_text16=Module["_sqlite3_value_text16"]=a0=>(_sqlite3_value_text16=Module["_sqlite3_value_text16"]=wasmExports["Ab"])(a0);var _sqlite3_value_text16be=Module["_sqlite3_value_text16be"]=a0=>(_sqlite3_value_text16be=Module["_sqlite3_value_text16be"]=wasmExports["Bb"])(a0);var _sqlite3_value_text16le=Module["_sqlite3_value_text16le"]=a0=>(_sqlite3_value_text16le=Module["_sqlite3_value_text16le"]=wasmExports["Cb"])(a0);var _sqlite3_value_type=Module["_sqlite3_value_type"]=a0=>(_sqlite3_value_type=Module["_sqlite3_value_type"]=wasmExports["Db"])(a0);var _sqlite3_value_encoding=Module["_sqlite3_value_encoding"]=a0=>(_sqlite3_value_encoding=Module["_sqlite3_value_encoding"]=wasmExports["Eb"])(a0);var _sqlite3_value_nochange=Module["_sqlite3_value_nochange"]=a0=>(_sqlite3_value_nochange=Module["_sqlite3_value_nochange"]=wasmExports["Fb"])(a0);var _sqlite3_value_frombind=Module["_sqlite3_value_frombind"]=a0=>(_sqlite3_value_frombind=Module["_sqlite3_value_frombind"]=wasmExports["Gb"])(a0);var _sqlite3_value_dup=Module["_sqlite3_value_dup"]=a0=>(_sqlite3_value_dup=Module["_sqlite3_value_dup"]=wasmExports["Hb"])(a0);var _sqlite3_value_free=Module["_sqlite3_value_free"]=a0=>(_sqlite3_value_free=Module["_sqlite3_value_free"]=wasmExports["Ib"])(a0);var _sqlite3_result_blob=Module["_sqlite3_result_blob"]=(a0,a1,a2,a3)=>(_sqlite3_result_blob=Module["_sqlite3_result_blob"]=wasmExports["Jb"])(a0,a1,a2,a3);var _sqlite3_result_blob64=Module["_sqlite3_result_blob64"]=(a0,a1,a2,a3,a4)=>(_sqlite3_result_blob64=Module["_sqlite3_result_blob64"]=wasmExports["Kb"])(a0,a1,a2,a3,a4);var _sqlite3_result_double=Module["_sqlite3_result_double"]=(a0,a1)=>(_sqlite3_result_double=Module["_sqlite3_result_double"]=wasmExports["Lb"])(a0,a1);var _sqlite3_result_error=Module["_sqlite3_result_error"]=(a0,a1,a2)=>(_sqlite3_result_error=Module["_sqlite3_result_error"]=wasmExports["Mb"])(a0,a1,a2);var _sqlite3_result_error16=Module["_sqlite3_result_error16"]=(a0,a1,a2)=>(_sqlite3_result_error16=Module["_sqlite3_result_error16"]=wasmExports["Nb"])(a0,a1,a2);var _sqlite3_result_int=Module["_sqlite3_result_int"]=(a0,a1)=>(_sqlite3_result_int=Module["_sqlite3_result_int"]=wasmExports["Ob"])(a0,a1);var _sqlite3_result_int64=Module["_sqlite3_result_int64"]=(a0,a1,a2)=>(_sqlite3_result_int64=Module["_sqlite3_result_int64"]=wasmExports["Pb"])(a0,a1,a2);var _sqlite3_result_null=Module["_sqlite3_result_null"]=a0=>(_sqlite3_result_null=Module["_sqlite3_result_null"]=wasmExports["Qb"])(a0);var _sqlite3_result_pointer=Module["_sqlite3_result_pointer"]=(a0,a1,a2,a3)=>(_sqlite3_result_pointer=Module["_sqlite3_result_pointer"]=wasmExports["Rb"])(a0,a1,a2,a3);var _sqlite3_result_subtype=Module["_sqlite3_result_subtype"]=(a0,a1)=>(_sqlite3_result_subtype=Module["_sqlite3_result_subtype"]=wasmExports["Sb"])(a0,a1);var _sqlite3_result_text=Module["_sqlite3_result_text"]=(a0,a1,a2,a3)=>(_sqlite3_result_text=Module["_sqlite3_result_text"]=wasmExports["Tb"])(a0,a1,a2,a3);var _sqlite3_result_text64=Module["_sqlite3_result_text64"]=(a0,a1,a2,a3,a4,a5)=>(_sqlite3_result_text64=Module["_sqlite3_result_text64"]=wasmExports["Ub"])(a0,a1,a2,a3,a4,a5);var _sqlite3_result_text16=Module["_sqlite3_result_text16"]=(a0,a1,a2,a3)=>(_sqlite3_result_text16=Module["_sqlite3_result_text16"]=wasmExports["Vb"])(a0,a1,a2,a3);var _sqlite3_result_text16be=Module["_sqlite3_result_text16be"]=(a0,a1,a2,a3)=>(_sqlite3_result_text16be=Module["_sqlite3_result_text16be"]=wasmExports["Wb"])(a0,a1,a2,a3);var _sqlite3_result_text16le=Module["_sqlite3_result_text16le"]=(a0,a1,a2,a3)=>(_sqlite3_result_text16le=Module["_sqlite3_result_text16le"]=wasmExports["Xb"])(a0,a1,a2,a3);var _sqlite3_result_value=Module["_sqlite3_result_value"]=(a0,a1)=>(_sqlite3_result_value=Module["_sqlite3_result_value"]=wasmExports["Yb"])(a0,a1);var _sqlite3_result_error_toobig=Module["_sqlite3_result_error_toobig"]=a0=>(_sqlite3_result_error_toobig=Module["_sqlite3_result_error_toobig"]=wasmExports["Zb"])(a0);var _sqlite3_result_zeroblob=Module["_sqlite3_result_zeroblob"]=(a0,a1)=>(_sqlite3_result_zeroblob=Module["_sqlite3_result_zeroblob"]=wasmExports["_b"])(a0,a1);var _sqlite3_result_zeroblob64=Module["_sqlite3_result_zeroblob64"]=(a0,a1,a2)=>(_sqlite3_result_zeroblob64=Module["_sqlite3_result_zeroblob64"]=wasmExports["$b"])(a0,a1,a2);var _sqlite3_result_error_code=Module["_sqlite3_result_error_code"]=(a0,a1)=>(_sqlite3_result_error_code=Module["_sqlite3_result_error_code"]=wasmExports["ac"])(a0,a1);var _sqlite3_result_error_nomem=Module["_sqlite3_result_error_nomem"]=a0=>(_sqlite3_result_error_nomem=Module["_sqlite3_result_error_nomem"]=wasmExports["bc"])(a0);var _sqlite3_user_data=Module["_sqlite3_user_data"]=a0=>(_sqlite3_user_data=Module["_sqlite3_user_data"]=wasmExports["cc"])(a0);var _sqlite3_context_db_handle=Module["_sqlite3_context_db_handle"]=a0=>(_sqlite3_context_db_handle=Module["_sqlite3_context_db_handle"]=wasmExports["dc"])(a0);var _sqlite3_vtab_nochange=Module["_sqlite3_vtab_nochange"]=a0=>(_sqlite3_vtab_nochange=Module["_sqlite3_vtab_nochange"]=wasmExports["ec"])(a0);var _sqlite3_vtab_in_first=Module["_sqlite3_vtab_in_first"]=(a0,a1)=>(_sqlite3_vtab_in_first=Module["_sqlite3_vtab_in_first"]=wasmExports["fc"])(a0,a1);var _sqlite3_vtab_in_next=Module["_sqlite3_vtab_in_next"]=(a0,a1)=>(_sqlite3_vtab_in_next=Module["_sqlite3_vtab_in_next"]=wasmExports["gc"])(a0,a1);var _sqlite3_aggregate_context=Module["_sqlite3_aggregate_context"]=(a0,a1)=>(_sqlite3_aggregate_context=Module["_sqlite3_aggregate_context"]=wasmExports["hc"])(a0,a1);var _sqlite3_get_auxdata=Module["_sqlite3_get_auxdata"]=(a0,a1)=>(_sqlite3_get_auxdata=Module["_sqlite3_get_auxdata"]=wasmExports["ic"])(a0,a1);var _sqlite3_set_auxdata=Module["_sqlite3_set_auxdata"]=(a0,a1,a2,a3)=>(_sqlite3_set_auxdata=Module["_sqlite3_set_auxdata"]=wasmExports["jc"])(a0,a1,a2,a3);var _sqlite3_column_count=Module["_sqlite3_column_count"]=a0=>(_sqlite3_column_count=Module["_sqlite3_column_count"]=wasmExports["kc"])(a0);var _sqlite3_data_count=Module["_sqlite3_data_count"]=a0=>(_sqlite3_data_count=Module["_sqlite3_data_count"]=wasmExports["lc"])(a0);var _sqlite3_column_blob=Module["_sqlite3_column_blob"]=(a0,a1)=>(_sqlite3_column_blob=Module["_sqlite3_column_blob"]=wasmExports["mc"])(a0,a1);var _sqlite3_column_bytes=Module["_sqlite3_column_bytes"]=(a0,a1)=>(_sqlite3_column_bytes=Module["_sqlite3_column_bytes"]=wasmExports["nc"])(a0,a1);var _sqlite3_column_bytes16=Module["_sqlite3_column_bytes16"]=(a0,a1)=>(_sqlite3_column_bytes16=Module["_sqlite3_column_bytes16"]=wasmExports["oc"])(a0,a1);var _sqlite3_column_double=Module["_sqlite3_column_double"]=(a0,a1)=>(_sqlite3_column_double=Module["_sqlite3_column_double"]=wasmExports["pc"])(a0,a1);var _sqlite3_column_text=Module["_sqlite3_column_text"]=(a0,a1)=>(_sqlite3_column_text=Module["_sqlite3_column_text"]=wasmExports["qc"])(a0,a1);var _sqlite3_column_value=Module["_sqlite3_column_value"]=(a0,a1)=>(_sqlite3_column_value=Module["_sqlite3_column_value"]=wasmExports["rc"])(a0,a1);var _sqlite3_column_text16=Module["_sqlite3_column_text16"]=(a0,a1)=>(_sqlite3_column_text16=Module["_sqlite3_column_text16"]=wasmExports["sc"])(a0,a1);var _sqlite3_column_type=Module["_sqlite3_column_type"]=(a0,a1)=>(_sqlite3_column_type=Module["_sqlite3_column_type"]=wasmExports["tc"])(a0,a1);var _sqlite3_column_name=Module["_sqlite3_column_name"]=(a0,a1)=>(_sqlite3_column_name=Module["_sqlite3_column_name"]=wasmExports["uc"])(a0,a1);var _sqlite3_column_name16=Module["_sqlite3_column_name16"]=(a0,a1)=>(_sqlite3_column_name16=Module["_sqlite3_column_name16"]=wasmExports["vc"])(a0,a1);var _sqlite3_bind_blob=Module["_sqlite3_bind_blob"]=(a0,a1,a2,a3,a4)=>(_sqlite3_bind_blob=Module["_sqlite3_bind_blob"]=wasmExports["wc"])(a0,a1,a2,a3,a4);var _sqlite3_bind_blob64=Module["_sqlite3_bind_blob64"]=(a0,a1,a2,a3,a4,a5)=>(_sqlite3_bind_blob64=Module["_sqlite3_bind_blob64"]=wasmExports["xc"])(a0,a1,a2,a3,a4,a5);var _sqlite3_bind_double=Module["_sqlite3_bind_double"]=(a0,a1,a2)=>(_sqlite3_bind_double=Module["_sqlite3_bind_double"]=wasmExports["yc"])(a0,a1,a2);var _sqlite3_bind_int=Module["_sqlite3_bind_int"]=(a0,a1,a2)=>(_sqlite3_bind_int=Module["_sqlite3_bind_int"]=wasmExports["zc"])(a0,a1,a2);var _sqlite3_bind_int64=Module["_sqlite3_bind_int64"]=(a0,a1,a2,a3)=>(_sqlite3_bind_int64=Module["_sqlite3_bind_int64"]=wasmExports["Ac"])(a0,a1,a2,a3);var _sqlite3_bind_null=Module["_sqlite3_bind_null"]=(a0,a1)=>(_sqlite3_bind_null=Module["_sqlite3_bind_null"]=wasmExports["Bc"])(a0,a1);var _sqlite3_bind_pointer=Module["_sqlite3_bind_pointer"]=(a0,a1,a2,a3,a4)=>(_sqlite3_bind_pointer=Module["_sqlite3_bind_pointer"]=wasmExports["Cc"])(a0,a1,a2,a3,a4);var _sqlite3_bind_text=Module["_sqlite3_bind_text"]=(a0,a1,a2,a3,a4)=>(_sqlite3_bind_text=Module["_sqlite3_bind_text"]=wasmExports["Dc"])(a0,a1,a2,a3,a4);var _sqlite3_bind_text64=Module["_sqlite3_bind_text64"]=(a0,a1,a2,a3,a4,a5,a6)=>(_sqlite3_bind_text64=Module["_sqlite3_bind_text64"]=wasmExports["Ec"])(a0,a1,a2,a3,a4,a5,a6);var _sqlite3_bind_text16=Module["_sqlite3_bind_text16"]=(a0,a1,a2,a3,a4)=>(_sqlite3_bind_text16=Module["_sqlite3_bind_text16"]=wasmExports["Fc"])(a0,a1,a2,a3,a4);var _sqlite3_bind_value=Module["_sqlite3_bind_value"]=(a0,a1,a2)=>(_sqlite3_bind_value=Module["_sqlite3_bind_value"]=wasmExports["Gc"])(a0,a1,a2);var _sqlite3_bind_zeroblob=Module["_sqlite3_bind_zeroblob"]=(a0,a1,a2)=>(_sqlite3_bind_zeroblob=Module["_sqlite3_bind_zeroblob"]=wasmExports["Hc"])(a0,a1,a2);var _sqlite3_bind_zeroblob64=Module["_sqlite3_bind_zeroblob64"]=(a0,a1,a2,a3)=>(_sqlite3_bind_zeroblob64=Module["_sqlite3_bind_zeroblob64"]=wasmExports["Ic"])(a0,a1,a2,a3);var _sqlite3_bind_parameter_count=Module["_sqlite3_bind_parameter_count"]=a0=>(_sqlite3_bind_parameter_count=Module["_sqlite3_bind_parameter_count"]=wasmExports["Jc"])(a0);var _sqlite3_bind_parameter_name=Module["_sqlite3_bind_parameter_name"]=(a0,a1)=>(_sqlite3_bind_parameter_name=Module["_sqlite3_bind_parameter_name"]=wasmExports["Kc"])(a0,a1);var _sqlite3_bind_parameter_index=Module["_sqlite3_bind_parameter_index"]=(a0,a1)=>(_sqlite3_bind_parameter_index=Module["_sqlite3_bind_parameter_index"]=wasmExports["Lc"])(a0,a1);var _sqlite3_db_handle=Module["_sqlite3_db_handle"]=a0=>(_sqlite3_db_handle=Module["_sqlite3_db_handle"]=wasmExports["Mc"])(a0);var _sqlite3_stmt_readonly=Module["_sqlite3_stmt_readonly"]=a0=>(_sqlite3_stmt_readonly=Module["_sqlite3_stmt_readonly"]=wasmExports["Nc"])(a0);var _sqlite3_stmt_isexplain=Module["_sqlite3_stmt_isexplain"]=a0=>(_sqlite3_stmt_isexplain=Module["_sqlite3_stmt_isexplain"]=wasmExports["Oc"])(a0);var _sqlite3_stmt_explain=Module["_sqlite3_stmt_explain"]=(a0,a1)=>(_sqlite3_stmt_explain=Module["_sqlite3_stmt_explain"]=wasmExports["Pc"])(a0,a1);var _sqlite3_stmt_busy=Module["_sqlite3_stmt_busy"]=a0=>(_sqlite3_stmt_busy=Module["_sqlite3_stmt_busy"]=wasmExports["Qc"])(a0);var _sqlite3_next_stmt=Module["_sqlite3_next_stmt"]=(a0,a1)=>(_sqlite3_next_stmt=Module["_sqlite3_next_stmt"]=wasmExports["Rc"])(a0,a1);var _sqlite3_stmt_status=Module["_sqlite3_stmt_status"]=(a0,a1,a2)=>(_sqlite3_stmt_status=Module["_sqlite3_stmt_status"]=wasmExports["Sc"])(a0,a1,a2);var _sqlite3_sql=Module["_sqlite3_sql"]=a0=>(_sqlite3_sql=Module["_sqlite3_sql"]=wasmExports["Tc"])(a0);var _sqlite3_expanded_sql=Module["_sqlite3_expanded_sql"]=a0=>(_sqlite3_expanded_sql=Module["_sqlite3_expanded_sql"]=wasmExports["Uc"])(a0);var _sqlite3_value_numeric_type=Module["_sqlite3_value_numeric_type"]=a0=>(_sqlite3_value_numeric_type=Module["_sqlite3_value_numeric_type"]=wasmExports["Vc"])(a0);var _sqlite3_blob_open=Module["_sqlite3_blob_open"]=(a0,a1,a2,a3,a4,a5,a6,a7)=>(_sqlite3_blob_open=Module["_sqlite3_blob_open"]=wasmExports["Wc"])(a0,a1,a2,a3,a4,a5,a6,a7);var _sqlite3_blob_close=Module["_sqlite3_blob_close"]=a0=>(_sqlite3_blob_close=Module["_sqlite3_blob_close"]=wasmExports["Xc"])(a0);var _sqlite3_blob_read=Module["_sqlite3_blob_read"]=(a0,a1,a2,a3)=>(_sqlite3_blob_read=Module["_sqlite3_blob_read"]=wasmExports["Yc"])(a0,a1,a2,a3);var _sqlite3_blob_write=Module["_sqlite3_blob_write"]=(a0,a1,a2,a3)=>(_sqlite3_blob_write=Module["_sqlite3_blob_write"]=wasmExports["Zc"])(a0,a1,a2,a3);var _sqlite3_blob_bytes=Module["_sqlite3_blob_bytes"]=a0=>(_sqlite3_blob_bytes=Module["_sqlite3_blob_bytes"]=wasmExports["_c"])(a0);var _sqlite3_blob_reopen=Module["_sqlite3_blob_reopen"]=(a0,a1,a2)=>(_sqlite3_blob_reopen=Module["_sqlite3_blob_reopen"]=wasmExports["$c"])(a0,a1,a2);var _sqlite3_set_authorizer=Module["_sqlite3_set_authorizer"]=(a0,a1,a2)=>(_sqlite3_set_authorizer=Module["_sqlite3_set_authorizer"]=wasmExports["ad"])(a0,a1,a2);var _sqlite3_strglob=Module["_sqlite3_strglob"]=(a0,a1)=>(_sqlite3_strglob=Module["_sqlite3_strglob"]=wasmExports["bd"])(a0,a1);var _sqlite3_strlike=Module["_sqlite3_strlike"]=(a0,a1,a2)=>(_sqlite3_strlike=Module["_sqlite3_strlike"]=wasmExports["cd"])(a0,a1,a2);var _sqlite3_errmsg=Module["_sqlite3_errmsg"]=a0=>(_sqlite3_errmsg=Module["_sqlite3_errmsg"]=wasmExports["dd"])(a0);var _sqlite3_auto_extension=Module["_sqlite3_auto_extension"]=a0=>(_sqlite3_auto_extension=Module["_sqlite3_auto_extension"]=wasmExports["ed"])(a0);var _sqlite3_cancel_auto_extension=Module["_sqlite3_cancel_auto_extension"]=a0=>(_sqlite3_cancel_auto_extension=Module["_sqlite3_cancel_auto_extension"]=wasmExports["fd"])(a0);var _sqlite3_reset_auto_extension=Module["_sqlite3_reset_auto_extension"]=()=>(_sqlite3_reset_auto_extension=Module["_sqlite3_reset_auto_extension"]=wasmExports["gd"])();var _sqlite3_prepare=Module["_sqlite3_prepare"]=(a0,a1,a2,a3,a4)=>(_sqlite3_prepare=Module["_sqlite3_prepare"]=wasmExports["hd"])(a0,a1,a2,a3,a4);var _sqlite3_prepare_v3=Module["_sqlite3_prepare_v3"]=(a0,a1,a2,a3,a4,a5)=>(_sqlite3_prepare_v3=Module["_sqlite3_prepare_v3"]=wasmExports["id"])(a0,a1,a2,a3,a4,a5);var _sqlite3_prepare16=Module["_sqlite3_prepare16"]=(a0,a1,a2,a3,a4)=>(_sqlite3_prepare16=Module["_sqlite3_prepare16"]=wasmExports["jd"])(a0,a1,a2,a3,a4);var _sqlite3_prepare16_v2=Module["_sqlite3_prepare16_v2"]=(a0,a1,a2,a3,a4)=>(_sqlite3_prepare16_v2=Module["_sqlite3_prepare16_v2"]=wasmExports["kd"])(a0,a1,a2,a3,a4);var _sqlite3_prepare16_v3=Module["_sqlite3_prepare16_v3"]=(a0,a1,a2,a3,a4,a5)=>(_sqlite3_prepare16_v3=Module["_sqlite3_prepare16_v3"]=wasmExports["ld"])(a0,a1,a2,a3,a4,a5);var _sqlite3_get_table=Module["_sqlite3_get_table"]=(a0,a1,a2,a3,a4,a5)=>(_sqlite3_get_table=Module["_sqlite3_get_table"]=wasmExports["md"])(a0,a1,a2,a3,a4,a5);var _sqlite3_free_table=Module["_sqlite3_free_table"]=a0=>(_sqlite3_free_table=Module["_sqlite3_free_table"]=wasmExports["nd"])(a0);var _sqlite3_create_module=Module["_sqlite3_create_module"]=(a0,a1,a2,a3)=>(_sqlite3_create_module=Module["_sqlite3_create_module"]=wasmExports["od"])(a0,a1,a2,a3);var _sqlite3_create_module_v2=Module["_sqlite3_create_module_v2"]=(a0,a1,a2,a3,a4)=>(_sqlite3_create_module_v2=Module["_sqlite3_create_module_v2"]=wasmExports["pd"])(a0,a1,a2,a3,a4);var _sqlite3_drop_modules=Module["_sqlite3_drop_modules"]=(a0,a1)=>(_sqlite3_drop_modules=Module["_sqlite3_drop_modules"]=wasmExports["qd"])(a0,a1);var _sqlite3_declare_vtab=Module["_sqlite3_declare_vtab"]=(a0,a1)=>(_sqlite3_declare_vtab=Module["_sqlite3_declare_vtab"]=wasmExports["rd"])(a0,a1);var _sqlite3_vtab_on_conflict=Module["_sqlite3_vtab_on_conflict"]=a0=>(_sqlite3_vtab_on_conflict=Module["_sqlite3_vtab_on_conflict"]=wasmExports["sd"])(a0);var _sqlite3_vtab_config=Module["_sqlite3_vtab_config"]=(a0,a1,a2)=>(_sqlite3_vtab_config=Module["_sqlite3_vtab_config"]=wasmExports["td"])(a0,a1,a2);var _sqlite3_vtab_collation=Module["_sqlite3_vtab_collation"]=(a0,a1)=>(_sqlite3_vtab_collation=Module["_sqlite3_vtab_collation"]=wasmExports["ud"])(a0,a1);var _sqlite3_vtab_in=Module["_sqlite3_vtab_in"]=(a0,a1,a2)=>(_sqlite3_vtab_in=Module["_sqlite3_vtab_in"]=wasmExports["vd"])(a0,a1,a2);var _sqlite3_vtab_rhs_value=Module["_sqlite3_vtab_rhs_value"]=(a0,a1,a2)=>(_sqlite3_vtab_rhs_value=Module["_sqlite3_vtab_rhs_value"]=wasmExports["wd"])(a0,a1,a2);var _sqlite3_vtab_distinct=Module["_sqlite3_vtab_distinct"]=a0=>(_sqlite3_vtab_distinct=Module["_sqlite3_vtab_distinct"]=wasmExports["xd"])(a0);var _sqlite3_keyword_name=Module["_sqlite3_keyword_name"]=(a0,a1,a2)=>(_sqlite3_keyword_name=Module["_sqlite3_keyword_name"]=wasmExports["yd"])(a0,a1,a2);var _sqlite3_keyword_count=Module["_sqlite3_keyword_count"]=()=>(_sqlite3_keyword_count=Module["_sqlite3_keyword_count"]=wasmExports["zd"])();var _sqlite3_keyword_check=Module["_sqlite3_keyword_check"]=(a0,a1)=>(_sqlite3_keyword_check=Module["_sqlite3_keyword_check"]=wasmExports["Ad"])(a0,a1);var _sqlite3_complete=Module["_sqlite3_complete"]=a0=>(_sqlite3_complete=Module["_sqlite3_complete"]=wasmExports["Bd"])(a0);var _sqlite3_complete16=Module["_sqlite3_complete16"]=a0=>(_sqlite3_complete16=Module["_sqlite3_complete16"]=wasmExports["Cd"])(a0);var _sqlite3_libversion=Module["_sqlite3_libversion"]=()=>(_sqlite3_libversion=Module["_sqlite3_libversion"]=wasmExports["Dd"])();var _sqlite3_libversion_number=Module["_sqlite3_libversion_number"]=()=>(_sqlite3_libversion_number=Module["_sqlite3_libversion_number"]=wasmExports["Ed"])();var _sqlite3_threadsafe=Module["_sqlite3_threadsafe"]=()=>(_sqlite3_threadsafe=Module["_sqlite3_threadsafe"]=wasmExports["Fd"])();var _sqlite3_initialize=Module["_sqlite3_initialize"]=()=>(_sqlite3_initialize=Module["_sqlite3_initialize"]=wasmExports["Gd"])();var _sqlite3_shutdown=Module["_sqlite3_shutdown"]=()=>(_sqlite3_shutdown=Module["_sqlite3_shutdown"]=wasmExports["Hd"])();var _sqlite3_config=Module["_sqlite3_config"]=(a0,a1)=>(_sqlite3_config=Module["_sqlite3_config"]=wasmExports["Id"])(a0,a1);var _sqlite3_db_mutex=Module["_sqlite3_db_mutex"]=a0=>(_sqlite3_db_mutex=Module["_sqlite3_db_mutex"]=wasmExports["Jd"])(a0);var _sqlite3_db_release_memory=Module["_sqlite3_db_release_memory"]=a0=>(_sqlite3_db_release_memory=Module["_sqlite3_db_release_memory"]=wasmExports["Kd"])(a0);var _sqlite3_db_cacheflush=Module["_sqlite3_db_cacheflush"]=a0=>(_sqlite3_db_cacheflush=Module["_sqlite3_db_cacheflush"]=wasmExports["Ld"])(a0);var _sqlite3_db_config=Module["_sqlite3_db_config"]=(a0,a1,a2)=>(_sqlite3_db_config=Module["_sqlite3_db_config"]=wasmExports["Md"])(a0,a1,a2);var _sqlite3_last_insert_rowid=Module["_sqlite3_last_insert_rowid"]=a0=>(_sqlite3_last_insert_rowid=Module["_sqlite3_last_insert_rowid"]=wasmExports["Nd"])(a0);var _sqlite3_set_last_insert_rowid=Module["_sqlite3_set_last_insert_rowid"]=(a0,a1,a2)=>(_sqlite3_set_last_insert_rowid=Module["_sqlite3_set_last_insert_rowid"]=wasmExports["Od"])(a0,a1,a2);var _sqlite3_changes64=Module["_sqlite3_changes64"]=a0=>(_sqlite3_changes64=Module["_sqlite3_changes64"]=wasmExports["Pd"])(a0);var _sqlite3_changes=Module["_sqlite3_changes"]=a0=>(_sqlite3_changes=Module["_sqlite3_changes"]=wasmExports["Qd"])(a0);var _sqlite3_total_changes64=Module["_sqlite3_total_changes64"]=a0=>(_sqlite3_total_changes64=Module["_sqlite3_total_changes64"]=wasmExports["Rd"])(a0);var _sqlite3_total_changes=Module["_sqlite3_total_changes"]=a0=>(_sqlite3_total_changes=Module["_sqlite3_total_changes"]=wasmExports["Sd"])(a0);var _sqlite3_txn_state=Module["_sqlite3_txn_state"]=(a0,a1)=>(_sqlite3_txn_state=Module["_sqlite3_txn_state"]=wasmExports["Td"])(a0,a1);var _sqlite3_close=Module["_sqlite3_close"]=a0=>(_sqlite3_close=Module["_sqlite3_close"]=wasmExports["Ud"])(a0);var _sqlite3_close_v2=Module["_sqlite3_close_v2"]=a0=>(_sqlite3_close_v2=Module["_sqlite3_close_v2"]=wasmExports["Vd"])(a0);var _sqlite3_busy_handler=Module["_sqlite3_busy_handler"]=(a0,a1,a2)=>(_sqlite3_busy_handler=Module["_sqlite3_busy_handler"]=wasmExports["Wd"])(a0,a1,a2);var _sqlite3_progress_handler=Module["_sqlite3_progress_handler"]=(a0,a1,a2,a3)=>(_sqlite3_progress_handler=Module["_sqlite3_progress_handler"]=wasmExports["Xd"])(a0,a1,a2,a3);var _sqlite3_busy_timeout=Module["_sqlite3_busy_timeout"]=(a0,a1)=>(_sqlite3_busy_timeout=Module["_sqlite3_busy_timeout"]=wasmExports["Yd"])(a0,a1);var _sqlite3_interrupt=Module["_sqlite3_interrupt"]=a0=>(_sqlite3_interrupt=Module["_sqlite3_interrupt"]=wasmExports["Zd"])(a0);var _sqlite3_is_interrupted=Module["_sqlite3_is_interrupted"]=a0=>(_sqlite3_is_interrupted=Module["_sqlite3_is_interrupted"]=wasmExports["_d"])(a0);var _sqlite3_create_function=Module["_sqlite3_create_function"]=(a0,a1,a2,a3,a4,a5,a6,a7)=>(_sqlite3_create_function=Module["_sqlite3_create_function"]=wasmExports["$d"])(a0,a1,a2,a3,a4,a5,a6,a7);var _sqlite3_create_function_v2=Module["_sqlite3_create_function_v2"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8)=>(_sqlite3_create_function_v2=Module["_sqlite3_create_function_v2"]=wasmExports["ae"])(a0,a1,a2,a3,a4,a5,a6,a7,a8);var _sqlite3_create_window_function=Module["_sqlite3_create_window_function"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9)=>(_sqlite3_create_window_function=Module["_sqlite3_create_window_function"]=wasmExports["be"])(a0,a1,a2,a3,a4,a5,a6,a7,a8,a9);var _sqlite3_create_function16=Module["_sqlite3_create_function16"]=(a0,a1,a2,a3,a4,a5,a6,a7)=>(_sqlite3_create_function16=Module["_sqlite3_create_function16"]=wasmExports["ce"])(a0,a1,a2,a3,a4,a5,a6,a7);var _sqlite3_overload_function=Module["_sqlite3_overload_function"]=(a0,a1,a2)=>(_sqlite3_overload_function=Module["_sqlite3_overload_function"]=wasmExports["de"])(a0,a1,a2);var _sqlite3_trace_v2=Module["_sqlite3_trace_v2"]=(a0,a1,a2,a3)=>(_sqlite3_trace_v2=Module["_sqlite3_trace_v2"]=wasmExports["ee"])(a0,a1,a2,a3);var _sqlite3_commit_hook=Module["_sqlite3_commit_hook"]=(a0,a1,a2)=>(_sqlite3_commit_hook=Module["_sqlite3_commit_hook"]=wasmExports["fe"])(a0,a1,a2);var _sqlite3_update_hook=Module["_sqlite3_update_hook"]=(a0,a1,a2)=>(_sqlite3_update_hook=Module["_sqlite3_update_hook"]=wasmExports["ge"])(a0,a1,a2);var _sqlite3_rollback_hook=Module["_sqlite3_rollback_hook"]=(a0,a1,a2)=>(_sqlite3_rollback_hook=Module["_sqlite3_rollback_hook"]=wasmExports["he"])(a0,a1,a2);var _sqlite3_autovacuum_pages=Module["_sqlite3_autovacuum_pages"]=(a0,a1,a2,a3)=>(_sqlite3_autovacuum_pages=Module["_sqlite3_autovacuum_pages"]=wasmExports["ie"])(a0,a1,a2,a3);var _sqlite3_wal_autocheckpoint=Module["_sqlite3_wal_autocheckpoint"]=(a0,a1)=>(_sqlite3_wal_autocheckpoint=Module["_sqlite3_wal_autocheckpoint"]=wasmExports["je"])(a0,a1);var _sqlite3_wal_hook=Module["_sqlite3_wal_hook"]=(a0,a1,a2)=>(_sqlite3_wal_hook=Module["_sqlite3_wal_hook"]=wasmExports["ke"])(a0,a1,a2);var _sqlite3_wal_checkpoint_v2=Module["_sqlite3_wal_checkpoint_v2"]=(a0,a1,a2,a3,a4)=>(_sqlite3_wal_checkpoint_v2=Module["_sqlite3_wal_checkpoint_v2"]=wasmExports["le"])(a0,a1,a2,a3,a4);var _sqlite3_wal_checkpoint=Module["_sqlite3_wal_checkpoint"]=(a0,a1)=>(_sqlite3_wal_checkpoint=Module["_sqlite3_wal_checkpoint"]=wasmExports["me"])(a0,a1);var _sqlite3_error_offset=Module["_sqlite3_error_offset"]=a0=>(_sqlite3_error_offset=Module["_sqlite3_error_offset"]=wasmExports["ne"])(a0);var _sqlite3_errmsg16=Module["_sqlite3_errmsg16"]=a0=>(_sqlite3_errmsg16=Module["_sqlite3_errmsg16"]=wasmExports["oe"])(a0);var _sqlite3_errcode=Module["_sqlite3_errcode"]=a0=>(_sqlite3_errcode=Module["_sqlite3_errcode"]=wasmExports["pe"])(a0);var _sqlite3_extended_errcode=Module["_sqlite3_extended_errcode"]=a0=>(_sqlite3_extended_errcode=Module["_sqlite3_extended_errcode"]=wasmExports["qe"])(a0);var _sqlite3_system_errno=Module["_sqlite3_system_errno"]=a0=>(_sqlite3_system_errno=Module["_sqlite3_system_errno"]=wasmExports["re"])(a0);var _sqlite3_errstr=Module["_sqlite3_errstr"]=a0=>(_sqlite3_errstr=Module["_sqlite3_errstr"]=wasmExports["se"])(a0);var _sqlite3_limit=Module["_sqlite3_limit"]=(a0,a1,a2)=>(_sqlite3_limit=Module["_sqlite3_limit"]=wasmExports["te"])(a0,a1,a2);var _sqlite3_open=Module["_sqlite3_open"]=(a0,a1)=>(_sqlite3_open=Module["_sqlite3_open"]=wasmExports["ue"])(a0,a1);var _sqlite3_open_v2=Module["_sqlite3_open_v2"]=(a0,a1,a2,a3)=>(_sqlite3_open_v2=Module["_sqlite3_open_v2"]=wasmExports["ve"])(a0,a1,a2,a3);var _sqlite3_open16=Module["_sqlite3_open16"]=(a0,a1)=>(_sqlite3_open16=Module["_sqlite3_open16"]=wasmExports["we"])(a0,a1);var _sqlite3_create_collation=Module["_sqlite3_create_collation"]=(a0,a1,a2,a3,a4)=>(_sqlite3_create_collation=Module["_sqlite3_create_collation"]=wasmExports["xe"])(a0,a1,a2,a3,a4);var _sqlite3_create_collation_v2=Module["_sqlite3_create_collation_v2"]=(a0,a1,a2,a3,a4,a5)=>(_sqlite3_create_collation_v2=Module["_sqlite3_create_collation_v2"]=wasmExports["ye"])(a0,a1,a2,a3,a4,a5);var _sqlite3_create_collation16=Module["_sqlite3_create_collation16"]=(a0,a1,a2,a3,a4)=>(_sqlite3_create_collation16=Module["_sqlite3_create_collation16"]=wasmExports["ze"])(a0,a1,a2,a3,a4);var _sqlite3_collation_needed=Module["_sqlite3_collation_needed"]=(a0,a1,a2)=>(_sqlite3_collation_needed=Module["_sqlite3_collation_needed"]=wasmExports["Ae"])(a0,a1,a2);var _sqlite3_collation_needed16=Module["_sqlite3_collation_needed16"]=(a0,a1,a2)=>(_sqlite3_collation_needed16=Module["_sqlite3_collation_needed16"]=wasmExports["Be"])(a0,a1,a2);var _sqlite3_get_clientdata=Module["_sqlite3_get_clientdata"]=(a0,a1)=>(_sqlite3_get_clientdata=Module["_sqlite3_get_clientdata"]=wasmExports["Ce"])(a0,a1);var _sqlite3_set_clientdata=Module["_sqlite3_set_clientdata"]=(a0,a1,a2,a3)=>(_sqlite3_set_clientdata=Module["_sqlite3_set_clientdata"]=wasmExports["De"])(a0,a1,a2,a3);var _sqlite3_get_autocommit=Module["_sqlite3_get_autocommit"]=a0=>(_sqlite3_get_autocommit=Module["_sqlite3_get_autocommit"]=wasmExports["Ee"])(a0);var _sqlite3_table_column_metadata=Module["_sqlite3_table_column_metadata"]=(a0,a1,a2,a3,a4,a5,a6,a7,a8)=>(_sqlite3_table_column_metadata=Module["_sqlite3_table_column_metadata"]=wasmExports["Fe"])(a0,a1,a2,a3,a4,a5,a6,a7,a8);var _sqlite3_sleep=Module["_sqlite3_sleep"]=a0=>(_sqlite3_sleep=Module["_sqlite3_sleep"]=wasmExports["Ge"])(a0);var _sqlite3_extended_result_codes=Module["_sqlite3_extended_result_codes"]=(a0,a1)=>(_sqlite3_extended_result_codes=Module["_sqlite3_extended_result_codes"]=wasmExports["He"])(a0,a1);var _sqlite3_file_control=Module["_sqlite3_file_control"]=(a0,a1,a2,a3)=>(_sqlite3_file_control=Module["_sqlite3_file_control"]=wasmExports["Ie"])(a0,a1,a2,a3);var _sqlite3_test_control=Module["_sqlite3_test_control"]=(a0,a1)=>(_sqlite3_test_control=Module["_sqlite3_test_control"]=wasmExports["Je"])(a0,a1);var _sqlite3_create_filename=Module["_sqlite3_create_filename"]=(a0,a1,a2,a3,a4)=>(_sqlite3_create_filename=Module["_sqlite3_create_filename"]=wasmExports["Ke"])(a0,a1,a2,a3,a4);var _sqlite3_free_filename=Module["_sqlite3_free_filename"]=a0=>(_sqlite3_free_filename=Module["_sqlite3_free_filename"]=wasmExports["Le"])(a0);var _sqlite3_uri_parameter=Module["_sqlite3_uri_parameter"]=(a0,a1)=>(_sqlite3_uri_parameter=Module["_sqlite3_uri_parameter"]=wasmExports["Me"])(a0,a1);var _sqlite3_uri_key=Module["_sqlite3_uri_key"]=(a0,a1)=>(_sqlite3_uri_key=Module["_sqlite3_uri_key"]=wasmExports["Ne"])(a0,a1);var _sqlite3_uri_boolean=Module["_sqlite3_uri_boolean"]=(a0,a1,a2)=>(_sqlite3_uri_boolean=Module["_sqlite3_uri_boolean"]=wasmExports["Oe"])(a0,a1,a2);var _sqlite3_uri_int64=Module["_sqlite3_uri_int64"]=(a0,a1,a2,a3)=>(_sqlite3_uri_int64=Module["_sqlite3_uri_int64"]=wasmExports["Pe"])(a0,a1,a2,a3);var _sqlite3_filename_database=Module["_sqlite3_filename_database"]=a0=>(_sqlite3_filename_database=Module["_sqlite3_filename_database"]=wasmExports["Qe"])(a0);var _sqlite3_filename_journal=Module["_sqlite3_filename_journal"]=a0=>(_sqlite3_filename_journal=Module["_sqlite3_filename_journal"]=wasmExports["Re"])(a0);var _sqlite3_filename_wal=Module["_sqlite3_filename_wal"]=a0=>(_sqlite3_filename_wal=Module["_sqlite3_filename_wal"]=wasmExports["Se"])(a0);var _sqlite3_db_name=Module["_sqlite3_db_name"]=(a0,a1)=>(_sqlite3_db_name=Module["_sqlite3_db_name"]=wasmExports["Te"])(a0,a1);var _sqlite3_db_filename=Module["_sqlite3_db_filename"]=(a0,a1)=>(_sqlite3_db_filename=Module["_sqlite3_db_filename"]=wasmExports["Ue"])(a0,a1);var _sqlite3_db_readonly=Module["_sqlite3_db_readonly"]=(a0,a1)=>(_sqlite3_db_readonly=Module["_sqlite3_db_readonly"]=wasmExports["Ve"])(a0,a1);var _sqlite3_compileoption_used=Module["_sqlite3_compileoption_used"]=a0=>(_sqlite3_compileoption_used=Module["_sqlite3_compileoption_used"]=wasmExports["We"])(a0);var _sqlite3_compileoption_get=Module["_sqlite3_compileoption_get"]=a0=>(_sqlite3_compileoption_get=Module["_sqlite3_compileoption_get"]=wasmExports["Xe"])(a0);var _sqlite3_sourceid=Module["_sqlite3_sourceid"]=()=>(_sqlite3_sourceid=Module["_sqlite3_sourceid"]=wasmExports["Ye"])();var _malloc=Module["_malloc"]=a0=>(_malloc=Module["_malloc"]=wasmExports["Ze"])(a0);var _free=Module["_free"]=a0=>(_free=Module["_free"]=wasmExports["_e"])(a0);var _RegisterExtensionFunctions=Module["_RegisterExtensionFunctions"]=a0=>(_RegisterExtensionFunctions=Module["_RegisterExtensionFunctions"]=wasmExports["$e"])(a0);var _getSqliteFree=Module["_getSqliteFree"]=()=>(_getSqliteFree=Module["_getSqliteFree"]=wasmExports["af"])();var _main=Module["_main"]=(a0,a1)=>(_main=Module["_main"]=wasmExports["bf"])(a0,a1);var _libauthorizer_set_authorizer=Module["_libauthorizer_set_authorizer"]=(a0,a1,a2)=>(_libauthorizer_set_authorizer=Module["_libauthorizer_set_authorizer"]=wasmExports["cf"])(a0,a1,a2);var _libfunction_create_function=Module["_libfunction_create_function"]=(a0,a1,a2,a3,a4,a5,a6,a7)=>(_libfunction_create_function=Module["_libfunction_create_function"]=wasmExports["df"])(a0,a1,a2,a3,a4,a5,a6,a7);var _libhook_update_hook=Module["_libhook_update_hook"]=(a0,a1,a2)=>(_libhook_update_hook=Module["_libhook_update_hook"]=wasmExports["ef"])(a0,a1,a2);var _libprogress_progress_handler=Module["_libprogress_progress_handler"]=(a0,a1,a2,a3)=>(_libprogress_progress_handler=Module["_libprogress_progress_handler"]=wasmExports["ff"])(a0,a1,a2,a3);var _libvfs_vfs_register=Module["_libvfs_vfs_register"]=(a0,a1,a2,a3,a4,a5)=>(_libvfs_vfs_register=Module["_libvfs_vfs_register"]=wasmExports["gf"])(a0,a1,a2,a3,a4,a5);var _emscripten_builtin_memalign=(a0,a1)=>(_emscripten_builtin_memalign=wasmExports["jf"])(a0,a1);var __emscripten_timeout=(a0,a1)=>(__emscripten_timeout=wasmExports["kf"])(a0,a1);var __emscripten_tempret_get=()=>(__emscripten_tempret_get=wasmExports["lf"])();var __emscripten_stack_restore=a0=>(__emscripten_stack_restore=wasmExports["mf"])(a0);var __emscripten_stack_alloc=a0=>(__emscripten_stack_alloc=wasmExports["nf"])(a0);var _emscripten_stack_get_current=()=>(_emscripten_stack_get_current=wasmExports["of"])();var _sqlite3_version=Module["_sqlite3_version"]=5472;Module["getTempRet0"]=getTempRet0;Module["ccall"]=ccall;Module["cwrap"]=cwrap;Module["addFunction"]=addFunction;Module["setValue"]=setValue;Module["getValue"]=getValue;Module["UTF8ToString"]=UTF8ToString;Module["stringToUTF8"]=stringToUTF8;Module["lengthBytesUTF8"]=lengthBytesUTF8;Module["intArrayFromString"]=intArrayFromString;Module["intArrayToString"]=intArrayToString;Module["AsciiToString"]=AsciiToString;Module["UTF16ToString"]=UTF16ToString;Module["stringToUTF16"]=stringToUTF16;Module["UTF32ToString"]=UTF32ToString;Module["stringToUTF32"]=stringToUTF32;Module["writeArrayToMemory"]=writeArrayToMemory;var calledRun;dependenciesFulfilled=function runCaller(){if(!calledRun)run();if(!calledRun)dependenciesFulfilled=runCaller};function callMain(){var entryFunction=_main;var argc=0;var argv=0;try{var ret=entryFunction(argc,argv);exitJS(ret,true);return ret}catch(e){return handleException(e)}}function run(){if(runDependencies>0){return}preRun();if(runDependencies>0){return}function doRun(){if(calledRun)return;calledRun=true;Module["calledRun"]=true;if(ABORT)return;initRuntime();preMain();readyPromiseResolve(Module);Module["onRuntimeInitialized"]?.();if(shouldRunNow)callMain();postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout(()=>{setTimeout(()=>Module["setStatus"](""),1);doRun()},1)}else{doRun()}}if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"])shouldRunNow=false;run();(function(){const AsyncFunction=Object.getPrototypeOf(async function(){}).constructor;let pAsyncFlags=0;Module["set_authorizer"]=function(db,xAuthorizer,pApp){if(pAsyncFlags){Module["deleteCallback"](pAsyncFlags);Module["_sqlite3_free"](pAsyncFlags);pAsyncFlags=0}pAsyncFlags=Module["_sqlite3_malloc"](4);setValue(pAsyncFlags,xAuthorizer instanceof AsyncFunction?1:0,"i32");const result=ccall("libauthorizer_set_authorizer","number",["number","number","number"],[db,xAuthorizer?1:0,pAsyncFlags]);if(!result&&xAuthorizer){Module["setCallback"](pAsyncFlags,(_,iAction,p3,p4,p5,p6)=>xAuthorizer(pApp,iAction,p3,p4,p5,p6))}return result}})();(function(){const AsyncFunction=Object.getPrototypeOf(async function(){}).constructor;const FUNC_METHODS=["xFunc","xStep","xFinal"];const mapFunctionNameToKey=new Map;Module["create_function"]=function(db,zFunctionName,nArg,eTextRep,pApp,xFunc,xStep,xFinal){const pAsyncFlags=Module["_sqlite3_malloc"](4);const target={xFunc,xStep,xFinal};setValue(pAsyncFlags,FUNC_METHODS.reduce((mask,method,i)=>{if(target[method]instanceof AsyncFunction){return mask|1<xUpdateHook(iUpdateType,dbName,tblName,lo32,hi32))}}})();(function(){const AsyncFunction=Object.getPrototypeOf(async function(){}).constructor;let pAsyncFlags=0;Module["progress_handler"]=function(db,nOps,xProgress,pApp){if(pAsyncFlags){Module["deleteCallback"](pAsyncFlags);Module["_sqlite3_free"](pAsyncFlags);pAsyncFlags=0}pAsyncFlags=Module["_sqlite3_malloc"](4);setValue(pAsyncFlags,xProgress instanceof AsyncFunction?1:0,"i32");ccall("libprogress_progress_handler","number",["number","number","number","number"],[db,nOps,xProgress?1:0,pAsyncFlags]);if(xProgress){Module["setCallback"](pAsyncFlags,_=>xProgress(pApp))}}})();(function(){const VFS_METHODS=["xOpen","xDelete","xAccess","xFullPathname","xRandomness","xSleep","xCurrentTime","xGetLastError","xCurrentTimeInt64","xClose","xRead","xWrite","xTruncate","xSync","xFileSize","xLock","xUnlock","xCheckReservedLock","xFileControl","xSectorSize","xDeviceCharacteristics","xShmMap","xShmLock","xShmBarrier","xShmUnmap"];const mapVFSNameToKey=new Map;Module["vfs_register"]=function(vfs,makeDefault){let methodMask=0;let asyncMask=0;VFS_METHODS.forEach((method,i)=>{if(vfs[method]){methodMask|=1<nEt#K$-s;w=xaZ6C&Zhm1Q4-b zOah`JPB^q;i%P2q3QpC1A#6Y1pP_-o zXPluXyK~ie4#Lzyw2kr6x2iBKe&g+DFuDe}wgGm4Pk;cA{!_VaD(9_H{cb-#pKF@4 znq1ogb<{Ggg{lGh>OjO$&(^1?M`sLLwfz|Z8i4likJm@z(YR~#JK1r76J3kn=h*LzmEUZ?Tb$?qbM5zeR`U5S;?7Af<#((7o(%VmN2jSz%VRBrB{nWT>`sr~E!k-Wh&mI>#{E6Z4oN*1x&xFI~aM%(K&kcv?g*Knh zRs8ARCwtA7kCQlQ!~oZ5^rE!ch<%(l_FmG6B8Kw_AG^fG&gCxID@qdIXe6x|{JLhl z=^BfpIP%WLagsD$l(ZKov3J~{y}04yDB+oJ_?%9nhqp`T{62ffZZUl{@@6}VsFm&Q zT$VH&u9@xAa8WysN20jha1GCM|1XbqNuv?9+AeM;F`Y$Ga}Ub)=q+(c=KUUfG^2&h zD2tka5$8#(;oQ~Ub`yLznhYcY`AHJ( z-`oG6T-02&=+P@c*?~z5Ov5ORMx#lCuI)Holw|FNEf0W=hARMLw6PGP(j0}7eH!fs zaDl|OcM%*E#kp%I`H}=`0`d~tP27?eW1_#kzz=AF1E|4ReA_jX#ay%;gxLc&i5qDO z8eOZIwwGzN;Byb2MeSyfu3WQ`!6>p3zPYUE!8IVX*^InzH{!xKV7R#524}wT1uR3$ zu9xk}V8FSmH9HPEw%UwLH;OEAT@cxH{A*?q9pJsOxk22HVh`$oJ9fptxuPAl7dA6^1-dvfX9K7qFub3@ zi{PE10Rp(m+Mul+Q_#n7rij(>Eiq)=*wfRVhpXv{0q3GiltewZgmR8?K`))OA(W&9 z5(CA-5E^boJd>#7v&R9lcQ7g(1hb0`V7meY(?9oU#Ve-MIdr{^#8<*79q4AS^=Zz&}hTqZZ8DI`y_^hkQa7rHvrQu zjuvFJ3cEFw-TpL^t|R6ikw(%K;XJ*y+GBj1=~5HpK$`?_HcX@W zFF=dT{nwd0eb8CdhY9)`BmCo|1(1?X&;>d?+_Yy4%?{hqn?av)0)Ietitz+lY5Iln zO6c1byy*U@xqxS|4;sx7AYx+!)P>GC=wJO`k}S~e+3UIcaJfp)6&*g>?O4~0qoBrf+_w%+tW!(L;>rWkbcXj;>#@**qf7-aax#?dx?(R+e>74ici^koL zI{rV$-Dgu@jl1hpzi!-Jm-;7+yU(Qlka73j$gdxF*Q9>KxI5Hu9Cz0?{ibpE>C_*} zx%Y>SyA%B3^x^#xL(}M#j&57aMyW1J>fo;`V%JHEs1~jg!_#5Cr-HExBYV_+#e!8GvPj& z`ppyWJ3YT;!hO5vpF81x-to_ya6jw#=TEqA_54W_?xvpKI^n+A^C#10iLZm?u$LYX~Mlf_J>ZmFZBFj6Yeta51(+KNc|BLZmU0X!o9#B zHQ{amdlT-xkw0d_eLVF~oNy=kCr!A|_xzJ5+~+{vgq!qFop2vZ{nIAgt>A9LeYWS1 zv-77U(%sYcr%k#KgS|<2bH|^~Q?NJbz60w`x+}pR zPhq`D_w9~2a$oQG6Q|sNwfu9Y-1$8}Gv(gY^P9N?4yW83!Qqs912~*=ze)V_ zr`(Mlf6|nD9XOnF=fQtd?oUmB%9ML8IGl1{?f4f=x!3gkX;bdi;Bd;l3J#oduS9&O z+_`YzlzRm@oO0*%{JJUk6>vD^UJeeY+{?h>lzS;0I3>y1IOV?F@te4x`$MPPCz}4S zDR*}64+qYcKVr(gB=<*7xwCSA)RenC^+!*+52XH>DffPOkWuIUNmFiT>YqI2cI5sk zQ*Kx0pE~8<(eY24at~zw*eUnd%pW)9{*w8pPq{y5{uzuV^Us=cf6V;IlzUIpk59XI zBg50~{>)EKyFX-pYT8}U@zc}p-prpc?S7Z}XHUD|X8y!!_nXW=XWHG9`I%{Vcjh-w zyI*I1%e4DI*FSgKUEcN2n|8m<{PU;XFEW49w7Wg=Tc_R6Gk@~5`&s5snRa(&{?uvr zmX?3PwEJo1Pn&k%&io6f-M2D-`n3CI=3g}J&W8`D-8V8{O}npWe%-XYG4oHDc3;c< zA=B=wnO{HczLNP3)9%Ze-#G2Ql=)55?hBbel)B(>+TD=(!>8TnGk?UiJFDT3r1!)h zHSIo^`J<=ZuGk+l?Jfg{)9$mGf6}yjbH_h<+FhUdr%b!+z~Qv}Oy-|9?XCfb-0Aq^ zrroE(;k5e{I0Q41e-_w?{K&NXWah_Da4*mN#0l>6=)n`*%fR6Y?j@O@KEdrm51!!u zn)+v-;QpNY6HmZu&Ya*r+VYzz*zsFVa6g0rPjH`t0Z(v$%>DCEa98G?AK{f%QF?iN z=zZNkbl=eaOmcqumh_G38`9UOuS?HMUz@%ry*0U|cX#im`1`%@^=|9k+WT(rquqOY zyIObp-*@lr{;qpl_cz^py1(uIp!@yq_qxx#y?aUg>+Y|*zv%wF`?Ky5Kkfdc`{VAN z-Iqi^>i)2MNB8dTy}eI$Z>7+8ySH?2?%vt^QSW!X*LQ!>yQBAp=oPK+bbs9Yb?;Zb zU-q8#tLWR^Z*_0#exv)%?(cg)jep+zS?{jiPkKM?-QN2_@9n*}^BSCr{7NBp8l!*w)7+ErRn?93)1(3u1nI3)Aytor9Vh- zPj61YmVP(ACA~HMM*5ZXd+Arxcc{bu^E^y}$&(*H>>i7$ySOh1r) zIekOt+VrgS%ydV(3nV?z{cHCx-9LB#)cs@k{_d^qH>Yn(A81?>|5y6z^i}CA({s~T zr01kBPhXb4G(9_gNqXjj9Se5#9_anG_m|$6x_|EdsrSd;Z+gG&{h@bX@BZGO^854q z@;~Ii&+pBDm;W~ZO@2>)cmC`ASNSjVU*tc}f0o~s|1|$e{^R`4{73l@^E>j}^B?5j z&%c-7mfxCxH@_vnIsZ=n?fhH$P5C$TZ{%OkZ_K}ze>MMd{-ykj`4{pV@;Bvg$j{4P zlfOEDU;f_wlKkTQJ^4lXMV)u&@9tdGc^AL$%>O69Fn>q>_WW)61^HX^x8%1b=jU(E zugEXYFY8>|d2iiiS=$McWn zSLGkgKazhq|4{zQ{M`H%`8oN^^B;9?P0sGUq<2>D%-)XPuKa=gulZl{&vpKs|0w%m zc1L!5_Ji!Lo$qD0X5Y$BHo=Vh*Q_jhkAKiTWK(v?x^%eZpIhV;}Z+FrU*zh%(S;iRLI zvC%*t3D7vJ;!sEkMb zA=S1cfGe)HQzZ4At#toOH_E6uLKnxb&m)>|1qf(w#NZssA^|;jO${y*DjC$T0<oW}$Y}O+OJ4Wu)juRS-kNb2_&enqhCuS*LTETdO}6G4;-N7*ppsQ!us2z>&(Y#MiN2?d+G75u-EB5SK`)*J`_ ztXow)Z;;S)0-0A8hYb=iA3rYI7jX)bC$2-Z%DDJZt4sp!kkR5vf&nUXlB8D<7j6ge z?Wgn+j8UHrqEUZP$7EO3-RYiplLPK^t9#nND|IzJRoj)BhZ z#bx}|lXJ3ssTF_*E>#m?@0?-R1CP>_M&jnIo~kv}jELx}+iG=nC>?PgK-*1kg@TM> z$1W+dBXh4aD=0nUE}rX8v=#gN^b2HFn8=FGDBS^30Xjyu3b%}Qf%qh<+FY;OG5l}4 zxbe}TB0fa=WY?}ATsN6V>%uv|=&W+~(G#X}OvYOdarWQsPne|T`0@qmyynD7)uOGY zI7WS&V_=mCR*BZR17pk=_XWp{&N8XWMa4(_K4r9j+@`lEFc3po1)~XMYiy-kJn&WP zaMMU089&%97OjkrLFfgjqt&${X%9@+8dRo>(}P&h&oK;M7Zq~57YHoA)=JZVw@PY0 z2$ia=p#1@aT~V5{1tx3}mDFQY?TWUl*HQJkb+$|Yn5d{6Cf=LP4?}S>t-d%NIBBk3 zNvoqNqT=j$AMTOyd0bR*gFdnF3i8i@CI z)8~85Cl2W@IvZ(?B(q%bu_1+$v6_zLsnY)|B7HW3NRNhsHHoIMcY?e?YW&Q=v`qVG z^@<1;*Co))9i~eLXXR!Dcd=<73aA>D(BC#Ns{{scbyPSWmQ2%^$ejs>Z@X}^Oz=x9 z!R~$x|A9_Ga!^t$Wo~I}*02JZZ1B*|4w8+zr$)5d7|r|)xM65*=NIiK$aI{_u5C^a z5)9Vsjvd_t_ zBI%h6CDd~2E`uTT^b$3^hJ!A4co>w*QT6jj<8EvW_W}g9b2jR)MwOborl&(cjhUx3 zT|~`!%DniaPd_Q(?5;{fwBjP^5G;Z8Actg@n?VJ%(=F_IbgJA>-EdXo)T({*&f+8L zSBQsc--pHs)^FBBbm$?Cgi!%MIN}<4SYj$c=#mjZGngTQdZ8=~Ze_uV$~x4C^hGEe z)!vtUFY~_Sj8&aV9mpB`Zoqu77>^Z7qo;_=gjGRGY0woAe6{&yq7k@5wfZpt+YvoY zq#DIt8kn~#@dJ<>eTFZ~{V#LhR8#%n%N~=U2RH0q;fCS;>vz9@eYme0*917OfdQi8 zKWJ6}7SE9bC~i}ct3r{hVBd5F>?jyR?-9PB)YVQI(pdM5G{vUAoK15e0lYXp&8#61 zRNU4{e;r31linr$h_)E~@+vXC4V9Ox$ED^Q;%?2dP4N|ZH#}bfM)2VqI={g9;*tmx z8?;C>L>)^8JXq=WsFITpc6(TZxK7b#QRrW-*8cG&(e{gRZ?;Mr=@qU^4y9q7sm%>B z(PrF9Up8jS`0!D9W!V zIM}Kn~L)U;D8UWKb%zolfmW}l%oBP2KfPufmXxE0+2=HkzYTo=K zY4+ua+v6hW12D7ANx%Wbu>I#~tI*vvD;m5}hLWc8wTumr5<)q|iK|h+1TK?B38Jw{ zt(sRaeH6;ju)nOraV^Z zB|0`&x+@}SftBtij+EfxT`((52d}F9U!ttrCGwR$|Q>RdQNC_9P5w=F`!Ux!Xro ztXf=Un|rZ~Jf0{bf#RbU9DQ^y;b|$v?8lX~O#K)mZI2}c_PC@EJh4+xrW|wA!*WSo zE}mb`SH-EJ{8FMgD#og)nkETy=tAp}m14YBe~qQ-B72KeC|<~eoM<v<^p}>=pt}E8>lcp~=4ipb!8{?pe zsZ;A-bb?VgJTg&tco;yYCjr^b>#)_(F_1QWwYx zLRn%nGm|W7zv^1u%4UkM-~hL!U7LnU`Mrta(c2gX|D9ej$j3y>&1AqK)x!^4cJdmY zs-?R?Td|`xXb{OD7mtmKm#sT{$9byfUvi9qY7|HB6VyHV2*mMC@O|-Ll;y`vyj=pX z{t0CXy<-ECLF42>v)WNeMWCNSUI8u4W*BPQP*7%GBSbhq?>5Rr=_1*%)q1Xe<2J~F zS96*4L;*(~N)sxD2&7g3LKlI4W-n zfL0Z4HN=Q2?X3)X>1i8z)L2h*HpWqvAH@Xhf|5RKro$GtV46Mld-d9g!wEzKN~6Nst=gLrX(&EKf)$={~19s{0>kjIyc3zlq$wgQa+LKx`va& z%Sv}Z)hT@G;Qu5hAefAAMis3pHze<%76AYy^J*S_dk|MwqZ*X?GKb}Mld9@JizgFk z1qDOR+d*QTI(;Q;UCe2NPglC4-&LdXQ#iSdECy0H2#gqMJF z+e_oQvRmB(r^4p+--n~;75=t8aMgio7y|21mhIx2*nHpW-@*;MKN{}K^{v+E{;E*E zzHh)kj$3V5WCOV!^pB9z81)tk0k|q92t~VGV8no|(^fIwZ`!Y? zXj1)~!m|K>QoTG1&^6JkJPVfqrAxV9db(WpcoaH#Ggi%5^oL(DQiW4XQ5n*BN@M#%S;@6IGZ}H7HzJ`JSY`L z3$gT8QauVHF~G{h8DDlA2Jx~Pp)5ww6AP@`0^eE>MZG=eS+S+x36+AA4KtVI>o5@j zA2j?vT;Mz5T|w7<$|muoFnn&54$$7xIx1R5Wme|JWpFa5aq&KSOAR;$b}9WcHu&w> zwCtqUvi5B*3_=cQIR+op1SjoOX?8VXhQNCGuF0>_9u5bAC44%^vH=Y@!GjM9S~B8{`;;;}GTR4S}eIh&jy8gU2WsUUVp zq^p)t5bj`%=@WuCEfE$$Rzitj*ai(L9MGZ(9>NByNDyrL1Hlk+8w`M~OZsMSzE)iy zPYoCp_3r+Uw#df8;AX_4mSuOjd4=SZHNjFhBO7EWs&i30O%pkIfMI1V6IZ0SmcLPj z^O)!BanDL8-@}oZ&uzZ#G11^C&OkW2w#v5PTQ_hF+tvgwPVxDe%g|y5(dfdOQ2s)F z1=X-br{aPGT%)?M9fAU!p;TmdDip~_6h$ydjOub=2Bp-%Pq!TJHRrmkx(QmvmS>5sjxhmhQ6#H`Ab$(~VB^ zfP-0!>9L^b9y5|u{91=jY!=}tOHkF3RWYvQgJ4}g@XD)NB_{VkweFT!Y$cA$I%&(T z74@wZ#%$@o%=Q@5BOaNOPRdmsQ+JI3waEq)uSNL;2wv++lX!Sm=1Bjd;w>aMpBLO# z!ha##Qnz-_8Jtcd;J&FtOoWk?og?rFn~KUzCCXI$;y9UUN81)^w%3;}1f}|5v=Lv0 zyEw;%%{yV#W$BZ?+@eU& zQ*eJ~^6+u4LqTa?A)uk42OxEb%Z|jeV*@mQrw)P0SCGu9UiPv`^Py`+Ah>0DRhmkY zzKT?5hfL)f4uHtzc@VcKxmd%g5&^~6lJt)?Co@ysfF1;JK*7kRH#kJqTg_8I=z`fG z-fJjyc&AO4N)`p8`M}_zS~atCmM-w9rs~{qstzDD!D~)MB6C-pCcpxT6|uwF#2x&? zhRZ;hNhuFj5r$I)m4^V);efe&p&XEKKVWU$1aP<-zOgxEF-jszo_B9Fvw|aTJB(9Y zk9H7-8EG>`@6FG~syUKkN%4(n;0khlE?rKY>dfPhCLX=!PjST+=ycU~)(xcT+gb8W zs$b~?VSiNk;-8UXf2rsj7xaA<_2bIi0VJV~0H60&x4C-xtG6GTLkP=Y>yV{=E?2r0 z3bmw?piV$v)&3qML#oYn>oiBi7_)J)y}v1 zE!AH>{JL+rnTmNx>Rij+^Wx`T%V~AN_UBf9=GvK$h8c)&y!o07?d+ttys>)cpt1V| zQ{!@oF>i(`9W)P&LB~q>Pqj=+3*CNGyhWo~QtkNOtSn;m^K`g7T_Rp8Kj7dU*Y=6NvQYRx-DEC-K=380lc$XoMR$ zm>Lx!sr+bEAD2nhJq^Y$&Ou`%Ckk+8OV{n;qQ0ZST{)!+BN&##9bHwQ#gG*DLQ|P< z%{|#|ioG1QV0M2NZNzehHXGE-)nIHWLgEC+pjDlz3!o!VGXESuG~ff7*vvBfgxqYF`$w-29soF^#Bu}xlHKkuyvw|NMMJ5P2}fY zr+ZLdBP-qwm60*dSp9Nw98y->(K~Xq^#nGitIG1&ek>l7brESTQpB7Ap3RWC;wU8$ z&`+2eMi+85zIyY0JR$W#Tg7k&ZnjbeG2!F4lW)rzrdX)D_tL0p70)&guO+XNCc&H^ zVi;HeN@ZMH>(SXi^LxWB&^hrtFwO^h{)~WHVy#@BLchg zfFjf|?_HQEW6kTSrFxXsv?d4VDrmNe%>oY^ilVTVX2=52v|^CX2d5sJQZQi<80YFY zKY`|OBgRBsI1r@_MUrmAlg44(;aNvA;;NfIt0DqU4iNb#O*xXrjy1n_uQ2!x%;G&d zK~a%w!_k9p*7#rQ)?La>n;cy0>!$iqb+ff;Z1yd5%|dCTm>%Wlofe`2w9O_NLZOii zPdH^mNern-pGpxT?((ev?@fI*`8`h70lDSTE2yQIKq@7uhA7ZB+$guy}Kc)pO}eAf=~Kt-+f=X)q@$ z^Q0tQ?}qckR14FH`=nuxt~%GIq3XMEUGW*Y)UDz|sBCTq0c9C&#moOTDxN$BpoSc^ zFa!K$B2F^zBj}g7cwwEv+x?oEDhk2@_WS_%$N|~^t(J?V_CYMn^V~%1q`L)>&y*^o zKv8@GLP&^*&AbFma$^M(5CE{!?KiAP4$B-1n{8BwECz!}7J~+-OfoGD0!n(>TOr?5h3H zXjf}Nf|zs_6c4(bl|e5y1*x!vU`|>BFlg!a$dAztJ*x*(xNT`ti>0|N$@?NU&EjJ% zut;)3m&~kDlT|?kp+oV%Lou_%>ZD}SoWm%jh^zZ{eR{j-aE%ikgm>^p#Daybh#W`< zN)zgAkk)vCvN|J6g~*nQi3d$BX+x7}7Dw*Qc9Og{ya2&7XQ_{Aql}^-P&6u^eHA?> zOpB}mAVo?R$t;%8X(DjM{!9itSeMxv(Vp&4*saf&>QJ3JY`t6sZ;+68o=mb!Z z*o#1`b%0=!jG^aFxv(tCUWupz;pNf@5;6N%hzbPsCb+f)Q>?I@TFC)!rDnq2N*aM1 z%iG5|>8@G19e(&x$qP#A{^`D~S_|5n-yLep8azv17E5YzS5j$b8ie(!6EH~@7<1u09q5i4(>Yxrt zYJ>ly@E4@xm`rU~%~J;pX9k4+1v-brl783YaISPC_;5EkGte|JqGzLqrme+Q%=)-; z(MtD3Y_DR@VR@ypASN0OjuKMuBPo|0>}-v=u0O9;3E1ahgOK`qTtj-ZNfd}KLZ}st z9(-<7$$&gav@(_?1@PL8_{boo7tt<-k~~W|x!YQ2Z?#>`?+Xdg)YSEw+$Jug@g!tc zJDd=yCe|*zp>fAdup5}TI|2m@)?J_T18W#8WlkP&5X+&>xzT6pUrUPHB8_;e6*QHr ze)TRMVI1%g7~_5riz*;;EordzIoTPSWX6#ZuPjM7>v(@zoFNCq7| zLE6nap(hxQ2o#e_GDrr<@9&EP<8$iM_JQ$^`V`T+KQgn3u3PEuj|NN~%d)1`AF#l- z_ySl(9OvF}tS-Mhs(x~1g!DukNDp0!KY@vsj(XEK=j_o}-JkZ-ZVBq9f(%#R8QmY=8!XAymSZ4I~Z7P;9G%dJO|RgnO>K z=teq#&7d??X$M!JMA_9y>7(?ajjQ^Cgrf4M_*aMV9mS(jbqzB?1QKObc8cpPBwj1W zLrla=4zrWlbe~5$g;D&~kF;p3E&l3CVv#`; zkpX@)PlIO}Gka-CMR6z$!x|yu6Lb?GK_K!8u+|5!QjHym3ivfgu6P@4Ev0l26mM4} z45m}8M{3*EIZ@eTW)PS)|aBq&=5u}c|eUWwW@8u$Ou7)UmESvz~I1~W>sX4$UW|&L>*CYa3bv4Boko}O4 zrU^f|gKkhd1#Vwigl!CvW0e?z&Jho6stO?Hij0lVF&Bg!ti%FS5|PZ>ft5QnM_NcM zHdp|fH?Xz>%>Xe_smHQ{%1p3S%V9Ze4uR$~e8(6**j{n^Mm)79UP+W`fpOd@$;3A_ zQ@u!jki!cycd}{$CF&m)AhTf$UeNA^c_bnqW(gk*!CX~#*4tEDN95?xIe8N)jwPHT zN#rl&n+4B8s{`QLSU1A#AN*m=*dhPs$8?Tamv%`cQY#EHneiRydsNgg1~BAQ-*E`q z1s+tG=U;n0A!vYflCcomqWb52cG*=|K{`^&5^iLlr4ocp3O+2jFx@gzeAw10T&R?h z$?9!-PEc~Qjt8vKwj~4TMqSh2ow`ON+@V=AxgQQtb7LQj9jTOm<17Ha9Rmuk056*E?gAcfWylS0$ z(ky+1TPB|Y6eFz>B*lxgNg7`=3Wdj>W>-3l~x&<9MoQKL>Kt4f>zD~RbviHL69qe3(sVC#bGD zdu|?5cKhT|w4w}<8Cm~P016PR26&#%)DA8mzFCE_s$^_?7(&q0MLOfMr^+Vp1T73l?pMI9nz7EzvrSYGkLoSZfTIT&&CEVXHoI`^Z{XImA(cs{W&?{HVv1S$$$&r@d zet!h+gzzBRC96}yzNW4e ziCQKt0b>gwNr4kA!)H#5a$ah{!hxGv#3JVaQ!Eg~!>WJ}C{H4mC()?3qZscLz?R&? zYPe7deU^mwacI$7jaqLJw@SsUp+PQ`Qs!3zM3b4RNro;Xci7d=l`zj9oZxKXVCO6l) zR!z0FYKms!gWVq?-@JcJgV@#V8WkLuLi2k_v3cYQ<49;*Aj2e$ExXPIHJmxH^~9W& zKxF@$<6az(n++>TBM{ud5{>G2;Sze|ul>zEOFBHLTwIr<6$~0gK=Y`1OO~w&9ycz> zAs`J`#=P$pbY#gLLT_6RXZSSl8B2`!EQ9#-9jL|fY$@DnG(&(v zt0LHf3k)Xs4+0bi&Y~2d4?1C>A>6Rt>L=$|lfU3#0sBKXv3o^Ri%P7STC52s$`3%y zaX^6%s0n5ydFBu>l@SK*?%FU?Iq}9CHflh7X1EL-wRQ+BZU#2boT-pwCLf0RWi_@h zUg>3+$TdGE`j-J*%{?V(P#46Il4;{^(FBqo5Ii81qJ+hshQum0h|X5Hl`ye}fa+1m zca!9kdaLl0(6wDA=XANEy4h_JUpA}D*$RYHaARW`9yX7aB(`}eEH4eQSSq-T%3#h{ zD`kd<@&j%nW>G-VL4##gym_#V0ppKdRgNe`DHX=tb)EM$5?H5S6%1Ck>**nFbh zfXMwd>;W^8Ledtppp=P!*X#A79>WStV>jf4(ZU3@U0QsIbwxcz8(bYnzGt3ef;8EP zDtK`NnibC6!0rn%y)I#Tt(aaQ`5b0-T*{Lk;RAV(V2v$Z z!EgnY6OW17M@UU1@=ALghM|iVE^5*UXiYg$Z_u?g%|EOnHmt7G-dpU=XY^JKEz({b z?5~(GvR37%(l}g#N}eCjDMN{Q?Fc-qpTG-F)gYh23(RL$I%X|!F_0#>WC$p=G$Da5 z?=P0-pjo_7q}N(O-kZI$Ui4`w&VPH zn-Udmj6~=-kCEC)icm&$sw@bpU9Getj#N@-7;HI{1Kh*0U)A~b#i;%nZ;lK zynFnm6vACPXpt}RaN z*K8Y-aAHPL$P`^#d`dz?u1#zGaATlAqj+gFn`y=Pt_-0s9xG{yI7Dy4M#M0&`Ui&S zH-1dCis_cdW1>;5ivt#oU(DDn+dPAMFazyEIF=MQYs(k7Toa=dF5Y8n?g((R>K>U{ zO&>+YQ(0F|J6T081_OTw4cV0Gia{*hj@)F_79S!D9F`8!8MzVE_@P?C=-G<)tojp| zmhT#F;%LHwZLu8~A;4CwNph86*ool{u`*XeZ1&)?WqWSLH1Z!bU9G5a=8kjXO<&r21|;t5vT+I zf^(Z#<(G7K$sPj0Gha%Hz;2<9?g$^&2rmw<7dk#HBtoU1toR5zE;r^fk5}jr;T5H;5xFe&=}J3R_cvw`7apw;n<_StNQB8J z@}M&QO*u9;2e*keoS_9Fwy;IwaaEdsLkbjG0D*wqDc;YzILnIRnz?e1vZx9c=y3`K zh3w^Z)Ekg&Ds#odB9xSn91|sBqZv6D zoDL1gtcp>=Sx!{aNN6=?6w{hJ++W5iHb$5$gZ~Rdh$--Y`x^!i*Ptx2y`Oa_)tBEN zRbOHHsg7!wHFSrx!AZ2zG|h1Jt_rU zn9VAO+yLDmH;$b*=SFH9`FRbKSQc8vu(Ne)=6DW&gB}iW*%LE?%bDT~QVgIH z_i;W-!|L1e2_yxl z8URATV8Y`w=F^K7Y@RD)H(|LHdhH8KXktv(&Jub^7E&Nshb4jzL4{=%vu)aq7E=b@ zM+YJgWMInztw}73Ysvkf65yDiHXc_#3~go_WL8laO31{MDMGVS>%o~K90xK*a)iaZ zd#O9@eYp%ZPwS??m9dz^$0GxSEas+0B5Os&xZDU}N@h2p0Ek&BgF+67wO4Do>tIp& z4cf$ZEYBVXR&2~|RACs#ut-qmz_$k!141^E&MI>87DjYvN;PeU5zPp3hRyFy^J)Pb zR~u-{!B~+!1;LW_O(jNzKm6@&{X%F^XelBgkUHd9nwW!-6JMm{siPV2RW> z6LBke%;8E8PvJY;q;hBXKs0s{LPhN*uwqyv)a=W@^<#<_7g@AATSy`@EQDSaKlJyc z@tD8G{ApbaSW!&-WlJIF_%d2>VYa^zryPO(P#HPBi_w~k#jtyDOJix41$IZBEMCJa zUbs_~53BF&yT)HXdq)y8c-R`=W4_`6}KYkb^59Y@*om`V1Z#+= zz{paHxuQ^;Y1dKzl!~-6oeeDi0kD0bG=)-+V1;Rz1ngLr5Vl&a#yD=0$My(F@(4&` z>yOLkrv4+u2w}(XK8mFt8S-n7oXfBE=5ldrY2GEkawjeKnU_S=oXtLRw0hO+qjDc{ z{6o}WP~{_*K}6sh<}qpx$FLZ+VQt#CNlJ^(1ts1C<_htu81-znV_ETGd_e6+<({0| z)C#edw!*or6EIdtV-44u|KM~XR3lM|<88YYSzmxmC|T90{*67>+8w+BDWx+k7C}56 zz!F!o&Y>E?$6;{6-PlP~pz+$RhV9AS%V;PQ(lm_-d+e?exg6%sZ3Yg#XaEJ_G=S7S z62>~rxq%pPzW@j5=8iZ+wQT9I-hLJ~lN)$_z?0Kj1FDmyg1A^;=3#q_@gbh7iE!XU z%EOyQx%eUO?fVe-9yafuIuokqMxOkgkq?3`K!1^qH`?X$nyG!6&5UbUWctH~cf&HK z39^I#Gg*lsLWR-lRNK$P!d|SFC3k4|AYpt96mGIDexaGNgpKlC%2Nu>pi^d>4A6(f zJwkSDu>4wl8^cJ1IMy+8J*+L0WN_T9&S9>ExIthDqQDtcWyNf$YFp&RYO@V+KHI%E zuGlc=D%3aB{Vb64YODLdgBW;q4l#y_q*8V*2+9yon3sd*At(kxbFI#GJ0EApjsaOg zQ4s_k3ox^-H!!bU5%{AOhpi!uvx7+Hp}-ay8+buZ@Jb&-PHN9Vi!)#|nB>@D=t}w& zTLaSTIRh5G;(68Ml`Hblg13B*{RAP&Y7Dt#1S8#NdO)Jc5}^NY^qr;9-_Ud(G7QvN zAj2x9K-Qv~#7?T-AO(oD&DiRp3d6Ch>d%E!Dy7i0kE6wd~j!Yn4$>BKLAyH4w)i&PZah_?$rzY0l)0%nc0_`T$U8gnP zXn7=$<$H!ni`cWWL_mzIe;JkTA(BALlrV^i@8!NqeuESHa2be<+brv1!sw4IXbv1h zxNGax;gS&BvQwO_7o}|CNY005z>yqo+@)2hP633e;yt8dF!Y4Py!tpAG?`GaysCv5 z2&<;nS<2{FI(#xXTp>tIGRod!)T(~WUP&z>X|lkR%>#h2Yp0^TRhD-X3}S>ad-C@8 z>&e*WA#AtP9kAv2UUYsNjmRwLVf`AbT}S=xkqvg#-yHQj^-S>?K4ynmoXB~vtO8lx zOg>G$t{!-8{T*oU33z*#7=bNUOL*n+R$B_o!>+<+aU@ZtUZ_EeEb3$4g<4IKD_3i1 zGS3nOuLzf;#2jIg(BPAgT`efKn3LV)ob{3HEy2U>YUzS}02`yYxG?4V@SU;SRLf7HjE0~%8FAz^(Jaa@g7@)fCy@=7kRc?+pF1r{(J~l71v9Mi8 z+d|hYE{Ju0BCvq5;o<@r=)AgvM4n=ssCxKmylIbV&u-~ATYki=b*d}lRX0olZibrY zswZx+l=Z3hvYEWP$r{Vxju7AGRc69qo?9=hm24Ex5(`<+WUGi?=zj@SSoNB-(u+oW zG}={?ohlJ5q$|Ck1t(m4OYy6a@4R|s^{83S!>JA0+oXcsR08=r$Z1_mK90qwG;#z= ztOwDe&5Uj8BRI@hEkdY^{|=D}unLPnark-`Ek)}9Xl z*~+ceg1$xCawJ#FZ{V&}Mp*LY(Fw!FizYCbhbOaxjzY~+ijbIGOVZdpbZLv5w$m!s zVtS$pEvBca)(*3#N$V=Lx3g^Y6*9BdVtCiVjleLXmG{8F8%F>HmX+C90TWhZpny&Q znBg0$8Q)r4c*gLM*{~`FRYNhd(_%16u<1!RvH_X@G1M%R`oIz-rsNHl1&K?!nvA3Z zbVe{-3bJ${zeZ^n>JzA1ozMWy>gK5WfRbtQHQ_3Ui+ZBbyzH%Y<=;sXDLZ4D%2FrPS6s(vExi+L@Ix<0Y6msP z5J@u0u_H^aZ06$GRe@}JP>e^LaGefJkAfwgEmti&W6&7J8sb zRpJv=n9!@0IRWqNQ>vTQ%y7l*CJWvl5`%?d@D{^h@sBVVNXM#m2uDW<@w?eETq2Yj zLvdDY`2D;1sqwoziqbIM%JKoN@A(UZo%3EgwiBO%b_c304Vzx??O1gKUX(5O!Wl=Ak0`&KMd^ipoo7XSktcF49 zEc6+%l0kE$zW6@xC1tsX0j!NR=pdw_XvA$ySt^f=!uld5HER`7h_6<$Oq+JTQCPd2B0!5p>-!=B_cP(BG&=wc5A5T*>+Fyba!~+FA zPAZsp$Z91N&X)u}wKlY9oq#jEbvub^R9+MDtxi}TjDBYtSj%F(8H3z5Za-MP*vE{( zij=8swMDn1MNpVP5Y}pxEZfkXx_`}|!R1%krXJQ3tY#3p$9Nej(FBW{CGCm5^l49^ z+*3MKNn2Ye4MMGW%@wGxBJ+xmJ@{v@JJ+^1MMU5X}}9B!I;qloHjnzJ+E3Xo)lj zscM5vjKzD!ae1JuoSJy1e!Y~&6PAOjW~trP3#td$Zo3$c#osXhnA84Zb*|l^w%@@v zJaPxay*ika1O-V=6)h`x#tlmMF%qAXTbcYGM0Zb+hfnl7Gy15JupGEQNMDW`yZ z89SL~TYC}6ARWuL=74=N%RFZ@1j8bdS-4C(7kwo`%#?T5?leV`>}RZ%c+ggLTV1VY zV3h;&Uh@su?el$6t^3u!_y@aNnlm=k3`j@ZRQqB#1_ii~N3#l$_vXoBarhgHbzx)* z@QYuSk-E?nAj4k>?3$Ev<{;8NS8sFnx{ z>0QJ&kcdpXm8J-h{5I5mUke^mT1O>#?O(a~+=GQuqgN3l4?2BcF2?qU$fir7h3I6> zh|<1@iGC)e)wFDFt676kyHG)9Ut!*i$1>>&nZ1aEX7MqRif3>^6#zBS>gy?_hL_ZH z&;X$oICGCR>8r=KmOLX#{M>zPJDlwzWGKzPwYQ)OopNamsNie1qJX!WC^;=tG^Zco zr@A__0a~XTpoMs$cqsVy;*zEF;*!vvSsEDvci0uvo{~#l34Pf z3!B}yP6x=L-a`YVC!!+ij0H|AdRkNanHn9_Pz>=8>e&Q!fW zpl+~-o&!Uo)Q$!4fL=gvoO*1JZSbNF+pM@xxm8+qsQID#99`4oiXyVbX|;pxEXqr7 zJ(d^1i;}o|dQ-;jZtFlhAQ09)#87)!KZ0lJO802<46BGqYrXg-w53iJ&y$a! zGqM8p#z{3Q1ct^ePbSy{Y^9bxEEzTs2S7F0MP)(AbDZ=k?|@#6ie}@=#nx3lkvo+ND?7QtE28NS_YS6tvbQ1BXo| zbs-$F?H{xS!0UzJcu!%OHSLxi@e>=9X@ZrQ+$mnJRoje@_H7)Z0VnmYG9HuD1IPyE z8Dij+$WqfJZiEJB+oABEwp91VkhtWH22UdOCJ?YctNrLY|FU(-8LY&%XwBGdR3$$DyE%O@)CP`ydhO7Pv}u%zIgRrsYl-B4#=&aI3)1 z@LCxKy<1eBGt}hsjG$B;5o6t4)QG*+9Z|3scV#*43k?Ay_11L}_sZum}t= zk}D6eTtXwHX#PTD(P6k#R-UkkO{dXjrnRqV@H!QkiF^TR zkd(EFTl))W1k_gYJS8G~p-vHzWq6+)I-+~ImkbvkbIHqP^&S&?*^l*L+yoC~d3c)^ z8ij>A;dLZ?(lGC&;TCzqasgZ1m@gzh#*kPhqldf=X3kHiWnR(2dP!})9uZI{hf3fO z;aN3Ups}M}!nY{U0RU_p30Z7|T@}=eajgJ%PXl*x?IiR1B;H=ko(A$g!m33D3?9~7 z1u?-l@7-_gHQ%KQXF)S3>M(*xM~Ft7Zgt;%7BqZU<1f6)z>O< zm-O}=F_;*x#Q&0SHM=ogTAfF?00kxoYYfZVMXvzzr!OqmbWoJ z=?3j@m!QdatoGl1|Ajm%d=kBq3lq!hgHkvf*GqN@y^eo>EQ%c6QPP25>G%THp%B~l z#jXl(a$@a{a)!{a9U>@1LM$NvH!1Y;Hw!yiN2<5=@p8Bxio+DnwP^o#dYHZ9w~UAh zbRT2BiR`a@j6@jJ2#uG|dFiSaFv=EXruk z53Yi%Z-j5rR*_!f%14I62ZwkK;LbsEhQ0z5;P_xCR7MNv8$*K3)==>YqB7A3h|*`< z`=j|Li@m|lt#o^>CwX^r5Qp$R7J(EO@3NipUOa6#m}`2cUKB`@iVQ%cGC+Gb-*(Zu zdO`lI%8_$`U4^nE=?5Q>Ck&fO8@RENpu;0w(TKdB6kH}eK~@w%_STdI$d>Z_%?DPM25=8R8- zI6j;>{3?nu1w14goPm=xB)qO2q|@u^*Z4DrG?@upYI$y6r7cAx4MW)gtMQ7H;g%{f zt{_2A>r#f0Tv4hCbEF$m#+H(H3&^tCn_Uq+XZfV`0Jv)s(ko_rPLTaqhS>9 zvF>19z4w++pz($y2(jD85EN_h3h`^Sr^em}%7owSJJGSNCg@VoztILn0|L|U`i=*} z)L$cB{)znPwf?CDh==QVeg5+XIMrI+*S3j~Q0eu0G{zp?|TmBqwd!T zQ-WO~3K-r3nU`8wk$(gSYe$I?0Ozuk^-33fZhb_;X);QhzkRXZl)9_MCp(Z)KL$wt zP-x>1l~EP|nxGd?b5P{DE85882lyxg1~t|Rm)zu4iB(KxR=Y6v*LsPR>Ss#rtL?fm z>fk}~{%$-d8=uP5xzydS)j$obW4fFjNPK9Km2MEeMDz6HCch8eCOQ(+XbSWBwM=DCeE!dD)pV4XRe zS4ZHj7BN)(^M*!I_5S8lk9aN7GYIb`4Jr`6PS4mM8@-<$?BrVHxJaF#VL|#_89Ti_ zeD_}6ggxJimT87GEFULD#UDU3TJD|}n@XT9jtD*Z;!^xNv0w2V)RMgAv@g+0_cqJG z2U%rf(6)SX+dfYorGJQLzlYa=hCoGM_Hl}9yLwRoY)lo?QDi1ER0KEqATmhg9mAeT zPY8rhsi(H3F7e2LmJbSXLnLP%GO?m)AsJ>6Rs@lys@W#QJ}C~RYpTh)QhSV9l3ZMB zi#@m!KhPR%BQX_38YAcH3I=BR0$y6KXQ31at21oX?7r#Xsw)LV;{qM+bt)gD1e067#`UHm{TCR-bpdEuF;YkcBZ-xZiW;Nx6E8nzn zoJ3#phmc)eX9IKq2h|X{p%c|KH)h}Mi23jabhnx;1PJdr3=+>&kGOO0pG9McTnGgS z&E|&!`dSey$0EMt&;T`&zEK3;2@Ev17FA!-$J#i`R}g5)O7|4tVMyd@5{7|l3ao}ZHI?vxkwMu5} zgY&%4wi2I`emSMM2ggs*(f1saj7ZKS$`MU1ZH$#cMu8iB zA=YyYu2zCtPzo65Bvg+Hr{o@3LrbfrGsZ9w;40{E>@-fupBL~3N3@+ zd98{)`w=%dA*KQqK~g2U)LB~{q!<|VF9S3Mr}(faP#`V*-BtlN}g|3wDjS1;}NbffBgPOx*>d!L2uiZvrEqd zbP~QDAJ-wQ)e7Q;O?0e0Q*1p%6!D7RYl3^|zhb0b=IajS5zq=RLYt{NGa*qE?&!LB zz#0+*2$R=F_9bQwmkEF9j)C@7%G9nbfP_<{fo?`8e69Kk+h)aa)ivR<&2f1p5oVtQ zDh;$x8;7rdR zzm*zIzKaa21glZ~byqz61Cz9O64ft{*|^1dbf^y7wpI`9;*OF&>7mB1@;VBjSQJ)a zQ18nglv(r4Z3=wN1 zI7lloG)qifc_3T*doWPxV#Y_fASKodFC35**IovvOIeu`%Yvfc#A{m=5GGosi$1eY z-mykP6MOn1T%Yf^QD>9Q#)II0tv+E{Ew;FO(8${qDx5*nHGrnG&Pum`Q0`$HD$4#q z@MUjHV5R21@|P)ZUExTu{oYk0$~-X;Ew9iEAB<*juXIdOv4R^A6sh2H*<$VBZJUzG z7=&tS$-2VQgfB_(UI;fhDSi1h|BtV5ekpaBp! z`?5Q0uU;?{$YGuvb%9N|3c!JGLv47iDNn~LTL%ctXnE0;Nk09Ikt+f?!=Yu3#Jt63 zvd93fk4D!0&uv992v~JOev)>2a2d_^FBdJ3pTdHk5)U* zDYnY~bI%C2w;5<=`iKs96dQ(MC1d^HLfI%R%D`iD`3 zpi;=?MpE%PT^63AI5gQK{Y4&irCV)tOQ^3$R+e~5!rok@xFmP52aDg0PpUQLOC(4 z1Bi;RT9MFATiwvIL<;1|BjnRtYRQCaIh2ycF;p+NB^LpML-OrL{8~N?VIV1pK5pJj zpVb65KP}Z*b`Q7o2`dOz@n%%lUs@;Fl#Jx&CUynsnO;0-ScaaU6^|RNXcI#~sm8=( zGY+_ocktGYSPN}PV(AZOmwia4oAugsoL-c6t+EzKW$CWH=>>+|#B>I4&9@HNEEhUx z>g7pBv-+)z%ovRh7Bi#AN&Py=S+X@mHd+$dY*V5w-w$_ zT>6smGFZT5YI~(i_#Q0H^D5vVflZv=xAUqCyr0Y7 z=eEz~$*oD7w0-t&ASd*s34BT$+G6vZm!#?ks&o$vRzp1sdW8`PP9UrNq?F6&wA zw|?ulez)~ozeUo21Es4a{D7z9pitz{71^bH4;8yP{|fbfieNLtw&TB*nmS41GXqGB zod@590k8l+MucM|F32{vMf@8c)@o3-DXXOBE(_+QK{Xbv$?WsS zPpL6NNl!D3Fc>~z0T#yFN+>=VTdF=LCk-S=r@C|^5=lT71Xdtm__jIUM=Z0ZN9?zk zEs&IkhijNVx2+I?IVBE6V1!bRKkfn}80n+T4(2dUG#7h}mKoxSb5&uW$(QOJ+PH>x zN9-W7iqwHKXQ^m>YXpXJQ?Wi4$KG(Nqoh|fr_-@WIDf3LaNrTyMse+1)^BZYWfBQ! z{*icLDE%*KWdI5OBTE?Xpr*a}GNBm6)!sG#y(P5mrUBWk?fr3+(8kE}Pit?2=pd1hS!_^Zw7c}cL2#!*S-@p<@5_$%CJ%LjO z<7ylZvxG~;z{H66m6L*dcW6#~vHi;YP442#s<#ntRx?6qbP`VQq4nkD@y@aQD9mvM zEfI%SgteDqOYMxGvRx7D<7et~6He*|!LW=4QK0ztL4(EX4oBTKIZj!u3oy;-a@=Q6 z+3Nw98b*A67{jB{?S!k33quQH3S}-Oi%{yh5xVF&R#S13DpzSMBc{VJ6aiU5Z8G7D z(e0)@8WLkONiZs*HkNV#Hn7Wd<2ae-isj~Z7kE(o2+t54KB+sWK2pyvP8~bCxaW?+ z?Bbh$?h7A(3;)i&X(n$g(yJy6et#`D5oa>dejm_FXd3@di z;0dg=i$6SU#l^uE9;#I}TMG{xtYZ$)54*&-J^Ex+7!3wY^%2A{^xQsfn+J*ZZjgb= zgp*X7!$ixx$UuGSJP`#!ap|r%>~9P3blYQ`$G?SAei}-fLMz;}%mq(g$YGqrdIU;H z&#Yn1=sDF>D^af4SA&K_oue97rZn1N4-R> z6z#W7-FGK)^9!nkfdp!rPZiev8BuHo5yb20llwk%`gQjWKbaD5e6l5d!Z}cMFMSkW zJoNC-efGp}zw40~F8<=1KmUWL{@t(r)WdCKpUc`$C(@^+=1ZUITb=#DVBPb|?*wy4 z!QHxcNdNl(_`gQiS@!>^P^^0&A1!hYIN%x7K_J~79}vUb-|>OB_MTV11_}W!SXqIL zv!lfXZ=^tL+u6QvL_^i*hlm-XqAgZ`%l*aTQ;Laem;O$wFZ$m0HlTX@@gaP-4=*@rOU&EcTi@dUe(CD=;+sC$Le;XoVX7>)X?P!{;t}^5TnM@X-V3zvkv={rrPNs756j zgNsG~#pP@6AB@m{9M-??+f1bRPXPUiEYZtbTjunZ7)|MSoM!(aSm`>Fl$(}U^LeM7nt4SQ0%|L|LX z_}L%$qj!Dij>Z3c`X|2p?kC>!>2FBQeh&E-AMZ^c?-_m^1he>OPyB-`i%-64F@BzW z=*eHnsy{3H%~3y@+7}|P&twB{7Samd~Hr|*4$#}BypQp z-FpJweu$mCH9pVf^a0@PiH4;O3xwt3G)bE#wgCQ^6?)~h-7OZLk>2W z3yjQw2lf-N4r`nhf3PF6mmEH|+A)xGg2HEDXT}p9iW__}7x{_$@!g%kU)5QeA zPfAyEq@;)~&zoQG+ObdBXhPT+8g{tJXuu`x!vjQqEE1SwC|$J+*=T`ib|`JrXjV)8 zj47MBhRKI6G~>++Eml7(3ZY?kxk^+rgNas+rq!)5D_k=;rgjlaFcdtN*52#vcdhwzRXzn z!BTk-94|uy6r2 z&TzGIh41xR>!;&UW7 zXyQv5LI?3yp>^J6A?Yh9m9Lim?L^p+2I{CoFK( z4bEl5X1{_L`VpcUGDdJfxX6ow6d@YaW3a(R$=-sibyWw<%Csq#T34>((FzXojxmLGNhLpWqZ7GFZqB^EeT? z?Pgv2(oK8g?qA~F84VD?EZzcL(j>#Uri7+88wPG~l9QjiD8B~6rd(p}JvE{((i@^L zPk3vw_|HI}$9Tj??vNg~;G_Rvp$~lw4nZ8-wCrHbv;;M2TDBn-n#5;JOem;bFo}uz zPftz8`5&2-l7VYQ8p&L)nTBazw$t!wvo1}>HM0}?WZskzic8sNn}{wN%O>b>YRc6t zH~}B!__96T+j%;ipr8nbC5k8zG0T>VRnv6aWsydPXf#w}uKW;FSEnDm#engl>M*fe zv5JE-Bkvqf!BLHKi2x#8@4em|ixlLCaWQV#2w0^}cNsvLm*lnkH>vEkU<>&h4p9OK zI5C*mCmCW|R*nq(b_YMh0O+Qm@L{OoG?3y~504!N10ELLmRa)=lwnUKm3gJ@C(hxO z0*I$-#35aFiw10-?sTfR(5JMYgWl)_eDZ7MVTwvcz|p3F$7_ONpW`5@OPv+=G(GbE z&88xv8rOEMlO-gp2ldqtM;7Z?cz)>-l!sCZ*xCCnLb}0@@gJF*o+^>t91T!yW9#DkL);|shi6MhElOrlS+>8^?a0J;@;2LuL7BUWhPGt&S zHY*eg_7$aPZ{ws5i$kGNoPnI++(T|jqF$nK4Z083-B4?)Z{FHRVF6M{QCBGnN6~w( zcwngc_;7%e-GMa&XDv&=&H&zg_Cr&C=|&xjxm z<`0p$D9zi7Tw2nUQF9VhTAS`dvuNX~G&sQnJnexF__VQ~o8Nv)b@Tv5YN_eof=D-Y zQS-^Cl;B$i8E*v@pq){@463@xXd;kGTh);^U@FuR4q&2un$4odW#^IyASqUry^2-k z*rGCBeVj_zd1ox!G}y8J>J6}pZ-e}jiO>PJ0Ef2h2w$0#%*L?SjkFE=T@&R8*NpSR zm24It2(8jL9n0zpH!!*dG{Ir?YZ*8P-s|BieR#ie4lfwkJfbYpxb}KI+Eu((AMW-( za30E8+7U-BYJ2pAC64>(AsRl{MO;tU>a*!C9GKw4$OJr-tX;=a^>w4Z z!d2J$-G$1vo{b{wl6*Tk6sQZf;A6e-5bXl(Bqrg)(X**4dLP4GU_aRZRu?5mb>JQ; zMtq3xGRBqa^6C&f2lfdGDhP}JP1&g47#PZHa68|0UkP!2r-~newJW~{V4w&m=__5% zUkYBm;z$4hkBRI~SmC-#?fE#8wL!0&hPl0Y7S)(A?3Ai=&NxSlkPx5pxZR=>AE711 zM$xQ6R>+toDG;L3K%?wlDb|oCit|^6)6jp6kGBv#EbCg?EaxJu0R9b)!pTiyS412r zbtQ^ro=UM1-;gzTvt|bmW?+Lvdp8HF(B>juk>=?&3k`hDpCirPm{x_#COG3DQ z+x1>Xhr#&&a61db$FB#TemM?)w;#;{2q@h0RrGpyb@H*cM_r}{9g(edhliM_Fr_R- zy$^S23Ivg_ku`uk$07-@HV_YJ#B$KVP{}c zA(q^gj4F^+eLxFwNNj+gsy?K6`Y6cOOK=kpBaWVj&G1~qJmttrknXE~*#m`3yZVCE z2qfXsBOJ|#zJrzP+(RW9EBAr?*o-s=@*JlRjHk%Qlmn>Q?mk=i44dwd9;!HUPJ{Fr zmzPC)BC3A@gckyfUo;1359*L5M4J^qwR5-I^kcC}$}nMcz#|~cN%x$kDs7~#B2{YG zVd~Oedg-b5VQM;}@;t_!bv=icuP*JQc;L~-Yzq_VP@W&7i)F)tQp}E$jAy4#_KU?V zNv{}qm;`&hPBLpx)4=j6JTbvvPpX$uZ?LqwU;#1WtFYh|e-a!aroAU~_ensU(=rG; zKj_9zPPj8@muTZW6n?=a^#k{#*)6B4FN_%iM7W46N<~_3P``PJZGvOgN@;?zj=EVP zZD(^#?c0J2YH+hWl!xY1GU3gj4&$V0Y8*NTcoy4_SYu5i7VO0xn(ZmIm$HifpI9L( z2tx?rcV*7vj~m&79jmm(A*hr?VsZymD1txtCopzcpOmRYY-2e3(G%hMT9BbhhFh;;&H(0FWKkbW; zrQ%UCDi=Ggk^Fq)B!XEYrrMZMXeW!KB^)4whf_$QR)Of#<>tMw3k3L3@l1hdN5OpcLHaUG`?e6p)_zH450g5g z71je5tYarDQhl_PJ3tfUE2yJ-6T{@}LQWDmV}MZa{p}dxoFp8f08BcZ)>F~2@ry*> zg0i{N844LY%Dgw#O>h&ok~E|;(`t!m|Ja1hn=5k&xEa`1**t$(U;w$KDGlogi7H$E zzHwXizHGiBeZfXlt6bY^`>9jj>D~MLd?XneeLxP7zDpks+>C19J+Zj-_hdZ6srC18euix|K_Q?3>j&N#Z%ZoP{tS@`{qP`LhBmA{>;)gi<7MWC-v zRsWfhWca^|6E3eA0=j0Ej1nP`F1-;x@EthbN~5oUs|(mS$Rqn}K( zvYmKY4!>ixIo`)*cMQlr-H`UHdrDlBnYU=$>7ypvi*4a?1puHT&D01$Y@YmE%{L-{ z^E6v>B5;Bw8l70EztHbyK1KXQxSr~1UOiF@eDkZ>^%Tge-Jm1LxawbKd)3^ zGYB8j{P9_rXEo2z6d!nA31v%S7nk(|{^fwO2kw6!UTB;O7yI(!vf|$95^wpF3R0qd zKk?)DQ$m))6Pou=@c>P7HSs`t$6IcqK$LCoEekZ@eDv*vt@R$7D!Rw#-2D1zmX^;u zt&g9ThG}T1bI)2QH9pp2^qy6O`d$_^IxI%GHwqJTyx3RlqsZ{VVAAKy&0Q9}a$*C&V*P>vs>@w8@=Di{_>6|B8W z6?E2AP?rd8D#_1i=$;eqf@LQ9+m?P5aQah=5UxImsWm_XM?4l5`oh5TKO0ZgP&Eq- zeK*#gQPo+hX(5SLZHO9&K(x2LA>v(d^bi7L=E)T2dc&c?*w*jHMjX5C)X@iVsm!?; z!j3%>Nwdbtde?BQxIUyFG8#qK@4E!X06)Bwf733&d^a%ysji7s7oL!bWh82KfWlltBhR7)+crgTmWrjKzv z$V}8R%h{Fny@C0O6N1LKPPh)gyg7Mvu=!{o6|bHowZ;;($=dLk^h=4s7H}aToq7vE zh6z&7c>mH}Wh(S8w9=x_Tpz+m~SR7(9Z0QJg_ckQMO1-MgQ)&8kYoB%8?V2`fOF*^Ka2o!$Y zYdV~5!)br@-SwEE3MZJCOvbu*h)!kS#Gf=5`FlJ~eK}WtbdVo9bu@yE1ZzzpCTwWV zOg->HVT<2Q`MO}747^3mCe?k)*gw^76^g^5{_$yZ94|ts3*-l2(+x7|I1wgEiRXrV zB>k-1Cwb{#i;`4X9gAj_kz8B46}JBf&XX_s)20QD;}ujNA4Y+dzj29_d<)Hc zDSq$puGrU{hz|y_^X~mt)hwW-``zPdAIlh(eK20k^P-`QA%LNE7R^H3V~y`!R}vEW zNK~eU@i~fVV+luioO~B>qEN3$K(xWX+g`N z!yRlpIB;Q+al;b9Ut}si+evVQf z--Kmx2pWfg)pNHt)vE`bzQx7#tKsgPg1oVwy|tNmH7t2nQ^iYMVZa4fbeuYYUVGknxVd1Z(vQKULOxg z<+e1KiQ-$>YQgjAC?3zxEXRi&>vN^5C=YbL&S!K59;EY>C={C&%? zuV2!VE8$A;CDi-aPPuXdojOYo(6E_U&_nfS!5AsC5pG<%o3edzcf7F3E3_3nr&V(S z7R02fzGk?m-i&0Zz;>FSjevnDnsTXQfR2avppeVj6yLPZq7hAHI3!h8udWMNw4Iou zjp`>bbFb@tp};xE%R@#*Hg9Hdrnvi2R-Ytvsu%1P-16VV zK@u9k*>E88pQciWPK?9fXl7SNvPZiNmu*;#2<%yy1!=j&m;0%ZZ7x@otx$#QZPQ zb=zrvhIouFFDBAO zZ^`SKs0k?fbXf&Ze1ivRwF6_l=DE$K^p-$TqKQ|COKxY$c=e^6b!NNdvQ_m!^2S*; z4_IsC!3ZJoRK^hfw|xQxZfE{g_cAI7sW`=9*z>l&0SP4}c;IEKv6mo=g;npG-^4tu z9%CSts4>20;4iuW0=HJLwT4JqI>eh(R{k;G+=qwhfWq}v3KdvaTq zq?nLE%O<6uK%9p|%F+h!geJakTg0!kJ9eZ4xh^7|c8a+|6(a=qnKDCV3_yM%Tb@01&gg&nI+g!a=U(GYkk3Bqm?@RR(%HAAU;B z;l}f(w+ADdM|eeL6lPYFWFjgP%C$gmrmzm{R+*u&qyJa#6ZvS?mtOr89uXT^@F2Lu zh)07LO8&w@#)n&$7BW_{p+2Cq{zsu+Hrr(Y$toua&YM3!$r8hHmls5nY^Ot&poM;4 zI=qgiCew4WAKjX86-}aY5R+1OJQpmY4JIRihUK~`zJ4^8qmUzQ=nS7gtv26=&NM8a zOh1#B;X}mD3^)e|1<4!FXRFZ@xGRmEu|^m+dH)_yK{JdN7+OX1@6b0;#ICMYl+&ja z#XsFgY;eM@sYdHST`Y)j*9VmV4hiUfg_nW5aKt)4aZ#oD$pHYqVY?+K@CufUAdQFh zPOM_K+pJ?(p{buI!6LHmme|L|Ma;x>Djteb*1YSkPUPCP(9Nh!ZdZ-GUuY3=mi#mm zb7uQAiZjh&w1sjBxHO1|1!$>pefX^rE6r>F0V*UIX^<4fn5CrDXo}I!lrh8%mNEnE zNKd3yB?yiBUPH@lmtpan<#V1i|BfTT$v0J(r`xiW{=H(FcYL~W5Lwpzgl|IJtMiw1DviTyU+SLNQ%Sk^H|TNCYJ0? z$~gj;dljz^VzoUXnh(*X;GpQ;vR9WVUq+=^>aF%|o5{2ws=Af4ej&qOGj$m>dx)Fq zL*_o`l#ywcB^j#CkuMX(z=IT0XD}e9*ab^sMGoZKRfZGH$oIB6WIom@QBoZXsDN=m zg+!mlX8I-eqchA2p9C4gcUmHB#X-Ag+1xJN1n>nZ0S3t`o8I<<~id>@#3~h|< z%C0Q)5{P&RJW&VNJgvSwHjNvQuQYM#fkUQ4sFa|blqMIrDHg@0L+iDYl%JKWNX(i_ z^XbM=4^?$=E(%w`79HlK78=Z|Kc~yqfxE$8vBOjpP6`WFuhEdC7A$ljcbV?SrwV`FN}bjVh(F~fMm zlqs6jU%&M`ylg>69p@rs$$(#oxfpx~Dj)J0nAf-R^haQRH;5TNSJGN`1WP=)KzTAe z_A_)cl44iH_yEB4w)ArN34QS8Jz5#Og|2-Pp?J-MVSiXv>MGse!Z^Nvwd^p@fS(dG z0G&liRn81OGu*WJ$C}6Q33nLE7>86=50b(AT)|jbxxeLAiqCt;r8eyBCi5SA>v1xP zO=P;q+Q>w~W+4S$7$Haqpx~zvLG|0gk65p*yM)&(l#*hypNLBpDCEX!;a`H~%8Q5A zJ#|j#@1-3^0&RRczM#Vk_?xD1<1IvKnJB=eqc-_SdTLJNXq|!1xOczzfXvnzxI>_2 zdBz89Zi}f17O4c=qM8ndBdwnnt`u92pyq zdGI%5oUBPY@|F8KmlucV)7x4G6AWnBN4wK}X$`Db=}U3OV*o}t{u!OH_z+AFDnFw% zOBgxl$c9HlKTbFNIBu%yGk=q05&i>+K5~oFhnQr4Z^tXJhsq3+q?wV=kB+RF#r9*&ZY$N&agIe#Wk_`I8=~|o z4$n=Cn@-`-%t^0}Gh$3Qb8A?&_93WRe3J{D3`^5v^r!aYL{sZ>{nxPNct0nG3~I8@Zq9iXa=^jwb#-?SYVy?c0uT zRT5(7MW^?dJshS2slX(rKH`{~&ayD)q$M2?P2UwHdP@n$&+sj%O%fk4qGj{Rh~hQ_ z1n-ynblLx!N8&N2y)y|i!UO9rQ8(a0c?{72Tfb;N`c=FtQM4g-HEB^_O`hOPa-hr> zyZ{t#t8fo#M59rYl7@azW+O`+W>VhB-aKx}O&1BC=pcUL5;YaiZH}{Mqr0s^HRb6@ zVc1IC^8pD*7(l%vI^;0;&3w+TO574<^YO1jQDR&b_ZYxA*Rm!LG{cK{#p(!ErNz{c zf$(NL&JZkE1$lsFI#X1}#~x=Hiebvw1p*@CD}Z5<|385T{_#pYBqUfvQ(YAA`Q5M+rQCtuN(UL>d$aSjGg8Vysjnuw0 zM6aYsqx}GTEh*6p2&r~|%|Aj)XO52aKcuZ#mWfINJutgOTZs-5ZQ-?rwkQ;|W$v5* zJ=$V8&qhO|enNa_kPR(9jcg)W`u`Hybk9yUsXI?68=ikXvKbQn2w-O2aL}{SJaI|3 zo#*Ta!pr$p9K5V2x3gUJj{@cGw+$lIn~z}}@+H`Z3{j@vW2E6S%1T;`bsEP7N0t;p zF3ILX_zCThdR>l^HP7VV#O?nEmgHI&Q#HSBx%mcGN+fs)pM@W{JK$#;&O_o7W5J`H zc1%!6;I=_ziSro%1XRrynqtpG6KM;xhU|Y$e*1DG6S?r3t+)9W3Qo+%Z9knLRudl= z&H1;>WdKI@hljviA=tUde?46n3KIbyFG+NnC^IS zZk6g_iw5@dLaHAqFCXI~Iw7M9?kB-_VDd#`@=$z8k!dKMv2z()_ki>tb@3-e4Y#1h z*})9*3Gv&Ahr~Vy6K0pfv?%s9%nSF+Lm$gWs3g1X@XbQXd`nO{Z-!8T$frPs=+V0u z(ORKu$PyD=Xl*SlTp30ZwPGZCdP|arK)n>3DC-G^Vq$gvw~T`ArdYpBw29yVrSaLp z0YJ%9Ie-HV-Ki}H`2}Yd8rgzOMl4yc!A*((Nc*5=IHNfj4xRqy;e>Y>q*bRUF|bst ztyAn1rxiQ#fS9X|?#W|NKuuc`tP4wd?I4fPJ!QmJ=5yA1xTw=}@0jkWIfG1Xg)6lc z$lqa=nAN9wnk0(a2*_6ZKIZfGkWq{KW21j;){)mGyEOl@V-l~UZR%|pk- zbp)9*)UP2~=@13xx`0=zMMswz`j%ym!7`yVSZ0=3CafZ{%!#4Njpm+ImLOn9@{P@$(~vQ zuE8yuWS;QeV{0n>lCTvzFw#=SmRr?n3+8+11nqz$HlI4+&}b5-RC=Zg;bN&OL;-B> z_r+il?mE>^geDp;cSKs|q9VdSmf~qGK8=~iM5Koe)4%uA-CG6Vy-$=$3tbsq)V+Zl*cxb$;0W@@)MGc!Of-*w&8A#{XdX+K$Q~C2 zCvF6*lN{wT$&_fQXII7=o=mG~{~LDEZ%;f?_OlY?TN&h`Vqz>L_noC{XQX+lBDq_9}j!r*PS9Ln)Koay%LR@*f@ zrm@j{CB~*Umz>vO8#pe>Sn+_8(GaBWF}`+i(4~vSCk&8s0zQ3;}uac2Z!e8mi+zTB*k;L^^d=%G=F#Tz29M_x{ zMU#Z@siM6G1dzQ!o7!^rs%Bh56`}^F>QKZMOP;RSX&wcPcLjziuQkj7-AKvudUFQR zbF|09UNQ7ty#1Z1lfy>pGFn1giJ7{_t^?JS2b_SK{-idk_^fS)!II&=6=SPttqW2+ ziQf{t;3-%vik+geof9q$FhO=@0u49s4ac&GB5Hw=m|vs>)egEQj*QPk zD1AL-hH~&!WU^QnN)=;&wvIvQ-DXGK6-`UcZtwvTOL#WQU*4ce!?T<3d!h^-nT!I$ z8rKs(<=)NfXCt8@tx$wS7Fm!C05W;_gg@X3rfddO$1yTqB&IxcJn)ol1TFNC2hE^S zk%}fcRz?aJPlpO@*fpVUCEH&8lP^Qv3N_CW==DKsXjV3?;enMM77yA3SQ=Sc1!@B? z&Z0H|bIi$+rIiiU2h6{H#lE3R0wJrRuG(2Ch)o*TtWhu(=oZjk7+I(<8d56Xkk%YAhO&@zwEx**0VkD3=wL7I&Z zBpntu6GbvCI^)m3l|2{3pc7^G{hzW3Uw6Z@{=LQ7_vIdBvxVQ4zA8L4C7yqTa5oNbBi=*bk8uy z9ER}ExU)0)XU5?gMDw48Yy2br8E{>UxJK)p>4wFayfcQrX5eASHO9~8nqhFWG~@%t z23@YlN3IzLELj-v4b2Y|{?sd zwvaMimga|6);ji}H<-Q?CWe+SC4Vp&3s>;KQF8@-BAmg5GO*+$^+=q_$N>ukQn05b z;CJdd5J)D=Kt0J2k$U2V&fs_fFl7@dLg}wYJu|Qsj2Hxz7G)tSo!*A^q}N=@Z^~8> zp~R43LufqUP|eXJ&64ZyDUzuC=g}6Lm;N7qjLr{)#xh4sThUNUTP3t*x}>KYvS}vh z`|Idq(vQ*TKS0V*F8Tl2E*$ko*iJFr{(&mx2 z@c9j`cl#B&ZDMdRfm1i_w2eU!GPZaMuM-uWL|ftcZ84&KnP@Axo)HWTC*Q86Ee0M& zA#EWcgIrqLBKBa-GQ(t07SR*<=T?$Je1Op11zuuSZ#$4QEgmI_*;_D-H(? z!sE)_P^*-MO2ewS54wu6 zCKf|^7n-*guT83l=wmW;C6>#wp7Hd%vWqbQV`|V3SqQdVtd730)O+jAL&-#pEsNIk?$<;Wm780p$bR!?^!U#BplNTP(1`2#bx=n9Fysh zPVeXQI1b9Voo$KPXr|u?#if%t=kAY`ow3$ zJ7BlcDDO9GUNQnW!>RtK!+#kn@F*wg)+lT>_odf|aoG&BC2o!7)82cg@|od2gzomN zxg+HP5cp^YFX|tJuWXDI^I&0YrW@~oc1L1VV05ASe8g*t=dSTP)%VEDj@m8uyo^4u z?`4*kjy2?lCb<=App2#tPqt#UVs)N~zs#`3`2;b!_86ARM4 zA+CTR!m2@7FWT&BJevpDO_VgxSDZ)CTW*eCJ41hY9G?#6s_!v~if|VLo=NARX34?@ zyE@R^J%?i+)QU*>u`Xv~LovUJJzL+Yf8iKV5w zH+(sU8iU8;D-48apP%U%NfciTmqBJR{KoGlr~;-Dx~!=b50d+iro0wRcz!8+kFsX3 zG0kCgvgLIfY=4S5J41vuH1Tjw^?Y-Y@#ecpVRli$53%V>=@GMG=!Rn&m3!)%8tCEfkv8eWhz{`oCZf|4m*~dQAqeuZM054n zX|RzFLLi{S_}{VSzh(z`UA#!9>YUA+i&_G!J~-KjLBLXZY(m;yp}y?O%_l)$wZ zbWX*S!-{p1+aBlojiC505UX)EiHFP|9P_Ddn$ik}?$UUpM21>v|bmVQi;7xT2Xzz zD?Y2=!3p!5d1MQ9anyN1q^>cRT;&bta(snA7}TibyM`4iKY%0+C^jrU3+#`0&3Vj^ zC9>p*K!yx;=yWrFdoy_$GKW;j@UYl9c|zMAJ_l8#^9&R9LAxYYXjoLi=h#$)HX3Fe zCD;e3aHG>%^Z04vfx6lmB;^_KBr$7>Ko!+5(49Brc=Zdq;ylz=gCiEpLbFu;Y~iL9 zxn8uxZeN)OMj_ETfJ8vE1AtiU=a3$XLbykLXTA&2O?!GctN##&pUgoktK5}M#8M?{ z17Bmh7z~}ct+(6zqhhpOc2aeM&-)X_zVshekL^DKM4Uy>3pS6v_Lo?Y;2O41XZS8=6;|ZuQ14}|4Pph3Z&|5G8GOq zSTb+aImcA0eeKRK4a`dx4j#~hBc=CPhY)T?MI$bxz{n%Rv;xYQpQq44eYb{_2&BSrNmadIf6wmW|zaavdA zFJ$H>;z%1VD7vM2WjZLm`V^wP{WPoIIM(Z(3$;*Bq8Z<9M@3|TJ)IKly9B^%l(L{g zEZmp7V8xVg=5JYY)<_-aR`=`cAz<6gvDM?qit48)dvDEIoh^<9s*;1{R9&3914W9j z@S>Aj2FyRVm{4hD6dvRtRwgB)Q=5k(ZnLlf7&gnm$h??F&TE8kv7FAVug4$M$4v2X zYDI5IO~K7PVqiZT-=%-6u@Wpx#Gr8tq?;*hmy|F5sR+p~NU3<##7B0vsD5@bbr4qn zAPzg8C|IL#-8p)BNye@pEa+n7YXt0b(}A=BF|)YCtc9YjuKGFov|Zc6E$HEG)YD*W zRPR)a1WQ@<3uA%v6tBl=bYh(uCieYgfLZFIMu$u)q?s{MOmeP9UGO~y|B7ro54+z0 zWyzTT<0Q(I*(d`6QAuGXh{n}QKpzNb*fAz7&Rnon-73fhKg9O1J1N~d?A07o)SUszv+B&fB*&8Ra@)q`usHci`jEktcb zOSvlQL$JD{_duH-mF#F^+cP;_Kso@^q>Kx#BC9@|!+>}r4=$@8%HhZ&HI-(Nu$_UM zPa->Ar+FM|;^^X3jv4#-&*Y?={Wmj=cQa1f>2X;)7?nTmiC{(N_{tBeGG*1rr{Xn? z7_eExMR3P92xf31Vv-uT+k=1>Mjow~;Y6V_l>Bs-5-=z(LWk{CuNq(*!-#1QjhZu^ zL6k>~E2yu?);TozA0s%^2N$dSXiV!0&?$;Uksn=|*VM_ItN4NSl8u}VnQE%3t;yFmN^97f9YT)^?&!Z5T&3${CuYG?msj`s+@&zquUG@Ss*sd|j^=4$v-;!w4efUW% zMIl|%yv+oFO}t}-tHQ2f6Rt7BuDiVla*W$zUpX4^45Raurfim#d7|year=^J3i z=D7~q$$o;&sEjGq`^E1pE<8SNKD_%e#MS{f^-f@fIqx``a-BqURlQCp)1?VRR@;6J%)NBYU%T zP!WU8skP0MtO(=AB>VCW9ExLf{i*7e(DIhF$#V;v0OCw?WVe1LOg248xYJxjfO*;u z8E&q~7U~Jt)Ac3Olf7YOy7ho?5JP{^j_>JPLP1Zl+S)mz+j1x1ho z%V@uKiCj=oe}WT=g5$8?n2&U%P?C%f9`#rE7>P-@K^fKOoF;2Tl2Op{A;bfy#caJI z+l`{9)g4L=<|dotVh1ajc*lFd2PfBR0G(U?=@_*H>w~9V#ej%@AJHKyB0lrfbCDmGXT zHtfoz1KBiG#d3pJ?V!x6!UPiA(-eWZ)j}u5E_E>%?8#N?sb%x)S@lCx-bd>9keS5! zgU@q)$Q+N7EM_#nX33UwL5iw6OgZM!MfJI??Lz>-OL01VT_A^RfD7a>Xc9D^6eRIW zC+y-kMi9h&ly8;?gME^_Gnnbi`PpkSjd&+}{1vAA3;0F(zKNfG%ZRU~^XhfG^P9q8 z0CrpzDn0qGYyoZ>-C)!uo;vL`56zol@{Ewsk+ja%nc;1?&HSk}D7UC5cIWf$c_H&q zshmABpD~6Kbi2R8K`apP@sV!R!pd5_~2_ z+Yt^B#%QKq_Fla(25?P(Fczu@nI6y~Uym%ZfIO7ru+dvJGx3PvD6|kVk0DEg#t~CU zFfxkD)M5Yaf9M;4jQkWP2xnepAu!b$2%=lIVFp@+^lKOE*l zP1G223{H%RaF<-^Nw$eQB#;oQdwmE_V8QBV%XZWvo5E<+@Rb4+EH?%Xmf#GV@&xCy zDRGfmX|UwWu~D}6H!wIb5gL#Z!udg{r3{yu0Tevmz`jv|NCc;*6L4sXo(TxUaB1BO z>4s3wxCH0;UTM4qHC@sYJLCZ6&h4fz==k!aIltu;bdcnnQ|Fu&uzLNAP|n#Gd__ifKMP&ed~qBBe-#hW0BErK2NHTt z;6gxXA^#Za&t`{@;5W!YYaw4zB+S>(I?=~!_3W?wu*3&jt7o_JjA?U?bEntuEoS|l zLz1iGG?^+9R)>KDaXb4vYSL^oWUP1rT2}8cDKKBj0=~T&pkJVX&bjz@Gl11QPV{#w zJ?Q-W58MOGgJTQE4&G5QU8?Mqw{tO#gtQE0}5?43C3~GFq#C8-)3h=1V0hd5ZOy$HH=@;2r zZ9+Y2*uAh z4|4dXPj9crFDdJLR(h*O4ubR5sH8tBB~UjH2Qm&|`Cn;s&|6yHvcPTtms2b=aE=~DxfWDx7V zQ}vun>|5&XHLA^}X_{+OL5WvYH0b3aa!p^+?zFj%uD;GIPv3epb|KI1W@?^p`6xzie}{Be?n8Vk?tnmkw_}k5 z_I3mf&zOF&xug1H0GMH)H@z~UqSrU`!lZobm+Nyp#)PJ^qIM=L%5K-gL^=rqTHRlR zUmNP|&Mrqe6hksZJ40{5Yht+L5v>{=pxh6C?GPBCJ3~!Jh9s|-?<044KomH&{<*8t}J% z7h3mw)T`ozTqUZ(XH%x6)!@&1am!dQvP}|ugrf_yYgFx27xBkF>4HI+FBOpr zz=}_{S5vnYGA`y%%1leOvHGC15cDkdtDu-k92eUen!k2vz}GqQpr%9$`&ww;#{~6=fb6_MHC)%RW^66sBQum z)PxsC1%s>IX%c>2(rw7yhc1Cppf6F|>cinCZNZg&0@C6}4}?PN+LJhHOK46P`3gc- zyu{N5p6Q`mNKZRV`QOao^Wd7y4`(ey|C-;(z=$P^U?jo4oG3F5PEBYz!-wSOamC28 z{;HA$e}+C-0CDQ*4l*f6oFynj8GQ_&xd$5=Mx9_NJXH^^T;4Qfjs$|C86tv`%E&4g zyT&yy7+Ff8WAuU*^$WZ9nf%`}{V?8{Z_n1*%O*2eHp4Lae_3O!}LmvpT|LY37H$gIW#RMaSY z8TL{UW@D#bkGest@SxU(1O383FiN6^tooxk#|{3RW*r=)dU^FJlHSNlT`8Hb{@5bn z0@e+@a(t0>59MTe>LlH{8VU9+MhL}1T46L5T$L9s6XJ=}9JK`kZQfoq-^;YAv`CP_ zQ}vGeS$8L=Qq21#?v0l!VYkdlQsjqm%iP4m(h%CAnogL4x>5?a!cskfH95~bVJ>Y+ zKMRV2i(u^50A?$ozYCt z8lJ+L02;u5a*6%ZC)qDr;^@$9fo16su0ru*W}HxPltq%4A{qsiaE2Yv&x148+~Wpn zR!+h$>Fr2Pzs}q;uqFBirgVq&1QPhFUOS1~#*A zqTJQVIE$eQcl;_Ga!}!VO3w>>j*=V*NLJb^@M-PtY@Y=aoyYP@tQ7-60nlw8%Rt)Z z#J)|K-w|1gpz`hZx@O`jks#!pq#*YbioBMu?8mZ6pZsV>=go4WY z;x?c*HE*mJ>_>8T8_|-v_P9mqLjW0H-Ux4k@_Y?b10B_k>`M(=9A%4(g(0S%*#UJ< zN7l}ecJuHe^Ua`QXVtgCKEOp<$G`!S{;Pfv7nIKy7+&nM<`;9Q!g4)S0Fr-cU%xI^ zKR8=K%wPxHf}$Vi)^dGw9Y?I8pfy!UIpH!V+RJ1xt9?dHhh7E!tYN27!TL5cm1E!l z*iZ3Ldo@wL74r~Oka)C>WciE-d}YrFNWxeE#2x7?M|1>anY74gW2i;Cc$Lwovw*>N zlSq)2z?dc35~Xf&oX%2sV=64&ggFiBNo>mTX{aU2lMQ0kuyfdTvSeVXH!x@5I+qnU z$Y2llIXB6>gRMyx3gQHjONxihenrSexeqRF{~W6X;ka}#t9=2LVUtz&O<_0hh%(>2H7@z&DIGL z)sONkb4YHRaml-_n1e!6#a{e0HIE~+UPhmH1Y%Kb6DdK6w}54SB;3L5P!r(6%@hin zVfJAn3L7gC8n>-w5Z}B+jg%QheR?Id)ftI;`Z@wcmirZ$L~GWw=YWG`6kv;zyal(G z#%gFXe1;WaMG_U+*cCCvoU~pKZfyL-3eFm4{R+E^A#+x@uouv(&V+jN8mKuOCFrr< z1R?g4(q)`b&73D7;KxmRm=v9ujt3!O#W?giiF@jz06KIHxTy=Yu-`p{O?X4~ZCuWR zk!~o;^3h(6ra0LFL&U{zECEKRSRV8x=gFEM*Q8K*E`WE0Tj2sV`V_}@Ha3eYx|#y9 zSMR*{L6+fJ|JmpS6tl2^@FbQ-Pz<==|YFX+PsOrsVf_ z1Y(XAN(il<)A&!$v35M5WkYBbed4!u>cnUXGr2BhFcx;=Qy|@rvFh#qIEvKG_uv+Y znh9+&YxrEcBRBgM*|vJKVgv-pLHTA<0)~j1Up|hqr?I~^4MQT{s~kN3wFq__&>84$ zH!EQ0v6$l+T~L><9f))?{#Ab$hZi8u#Jdllj(8pl6M9T08Q>aNRWq?H($JOC6r{ok zH}ATu)1O8$076+ySYk32K79eY0GtJe;E$PQ@vmgi_G@EPcGZ~hj@b>0Il6?aE-i2u zUIKr83Xjp@0P93&z-GhEO@%?I=2IlzAheH{@>0NUUoMxviL6Q6pdkc(xFNMMpLx%U&X>6_Q2kT5m}t)6G7d zrNY7L*zi9*`S7;={IJO|)G!ASSdg@<6dtOV=0D<>DS^=n84n^w9q@P*NlMg4x~``(zn%hCNoZ zcph5b5Il_AJ}h_|F(ADYB~&4ZrL4Y`^H3$u z&iX7sWEPglCT3y=GMRyF_!Ba_AB%_&Xn-a9bvbPxpGV=#mWdpDee8arOL*Xu!=p?x zcBZMD?LfjSy#>x2l{q8-I8C?@Q)S#}M%n&!?9;gLF}&6Hb|OsCdwRg<)KUs;qyjB6 zR)Q{Xo<~cr3GHnz6A|U=waZc@P-gNuzuSq-RhsGb#%9N@&hZkU4#f5tXm?c+no+CR zlr)(bWC_!LT9NGg2EO6?<}}yTV1Ji&WAi02Sh%qrt=;)~F|ukLj_$0FFpc|`84WWa zBreVS0*sfEHe*iNZOlK$yp92u21FwG6n~++)l=7+>h(;zKw{5iqTC5fZOJXjWYmGg z!9 z+lt1m9kKdlso3iRCs2;K8xqY2F>17k`bDd)* z%Y^^}n+@HbRny|&Oja^W>*<3rU4d91JnLv+VVi3W)IHUlbWt#_r_p$0O+>Z?zcRR! zk>w>ihS*0sgvTiYcV7`%(i28hOvlr7aKlZFuX?2e(;ly0%GMjeGHNw%e&IhVU{?4O zF)vy~=P(26ZVF`DA(MT8WJx_GxC#Z;m$7eRdvD2f1?rT9;1Q8CHr zJa@+UwhU^0Qhj#U%n#xi=c;c^MlG6=4%M2WB%2R54r_IgW5}`@c*mx?UdtUEvZd-{ z=z=5ch5|d6FdTauW}5S(6$H1fs61&OKn{Pb-G(nJ_@f5@`G69|(7V)kf@xBIv@SEJ zX0mGb$M<1J=|bIDZ?#uO2=L)ri$54{SmQJcBMt+a#nnCiX|P#F}U?krW;=nd(RL14hR|Jt?6-}s!_4=6XwANw5v1d?Gzw;1iM)!V}jLFe&?#%)C z#?S@yBf)YZ!O$^&Y^qP7pX%<^e)4#SYQ|a=Cm2+(>dzvF8fHU1zEvxxzYVrp^Y6k4 zFvSHh%_;DP8b89XzZ74B!o z!eyv~@@p)$=$1O_U_DKS#=5@VMlI#4y1Ff?t2Dp9z7W-+=`c5ntw-vO93s`cDN#j# z1I=NvhxMlCU`279hWc@=a$sX2vYA|JroICYkQUZ-jBL?gZ;sS=?;RzpJRoP|(k`Pc=FS*Rq9izj@~GAPna6)xr>t<;HDrq866^Qoa_ zML`Wu8TYIY0)uEEG|6%^L;h<0GG5MlnOK2V6zBgX=SLd(b;zhrQ;H37Rx`Ep+m1AE zZ>M*{ApHEidVR~NpT=)nHvNV8l7R~~RloVl3dRhUYxA{? zp%m+wZgL0A7cWN(Q^tp8JeYb;K3FVHE_RMCK8`bP?r!!4!5S!1Pq7B%3I&0I7}ZQD zb=O!F%5MyBoRc=W2s~>54tJ&kKFc9bFiHHIC`V~LOMEBzH&OrNKJ-cZ>hhJDzm5>q z;DoUQo9eC1Xq$jki_vN+qCHlE6!cID$=N_G+i^Gz!fvT~Bm4#I=Lu~WZ6V)5T(Z{z!&>0sJ)^h7qPDL zB%f*apw0s%JcB+IB~|Mk^_4KL&5pTc;kUOGLzRA z`Ld2s&%09uZKzlX0_`dc07t7=z18woZ$<&}jr}guKiEkevF&N;(xRJYZ(>{G`bAW3Op zv7$Yoi}RlCxatBF&bqE!KjCZWLOP!j@WVbsO#f(~!SEjU{?RC%CdQ++wSaSgcW!7q zA*8z)51}^0H1!0ev4KcYrjrGgAx}}TBZ^zCPlv3+DWrJf0$u&`GYrWlw}GtAL>bRo zWjl;JwQKs!YLkWI5djzd<9Yo!;Q%)f?2?3p3dOi1uSS_LP<n*r+i+N9ebkP1Y!h^I<3#Vl z+|7+}>7b{qAyp6SFR^=-p$<)!{xdMuA@XKCe|W?Wcj_vVpqxKg!aYlt~l`Yb2H4W2h<8sEpcpRosccsUyO)vZx#A5EckRG7YSz~9Mk?Hi5SY1|)44V#UXC=Rok61T@;+*{_z$BreCQXZiW8{3Oy%PiWu z%|0R;%4{UH5H5oF4Wa_cHw*-a|Z80_Z(!i>$gl)~)tSX$mdK@1F{)+_mY|0kIVqWefea*8$UgENw>$?&6Q z9N@C*zvWIb@aGnG(deH#6#lIG()b`xBy0^hSPIUvA@-^dS?9f@P(unS>OjVP#$qUa zS5=@cR%73nTW9mhdu7|#kjNzRDnWwkK3#D7p>Y|EAr=su53}aC-^Wc`m{zFey}Fmm zcrVY6{0&9#!EQd~oXK}(7qdf0TO~H=Hb^3Z^ni=)vb0M0{S+&doWV*o8ZNdSKQj}a~ah+9s1+0p)9unu69g@{51L}Q>be~07UIwO4EnrXxr)6O0rw@{a zh}ZtwTUnHj0Nd%5yEF(!A@K9Ki77nhS&6ws+3~gn|3QE>)w`OBsQ3V739nv2dFBo* ztDCLY_Ov#1H;PTl5*JIk>U)dc&-L=@mQn1=Cg}xKL;Q#R$@j}BuR-bL`(XrO#1fmR zkQFVeNRiL!BXk`$-0OkKP(}?=rRS8S#*5mO*-qN|8X|T}^MpY(Ik_kK1P0CNn<{Xc z_{~H=Gywo^{wkFc;yuCIc~*gV&narQFL}%`qn!nwDKi~q?A=|Y+lPQa7YaP7-?Qp; zo}TbF_7a4z4Iue& z+m6uWohxkVSh?%ywX~Tp*MyV-CK7O0wsA0vYR|PA9*eqw1!3O^FyJ7%&PK(>JBjYd z?_SJbjHLVRhdb5vO^@-yd);jwC9Rq)o8{Mee%M^Ueb{Yhi@8t7noB`5t}0@!6Sx{8F8bJiT%Kvr;azWb(>pGuZ~O%xjCgq20Hvt*nf#eXD`` zWCpdw-p9DeUc`$0CLNhwMz=_Sks5Wq8bq$F2Hj@s09gfhf)Z=9_&dN?WNZm!uP+)b zEWkh01EAjW45;(P%%Zr#Qy0_1;hpbT)1Xi6S zjei>A`Qoq3>eGRPVH&D76A^l-R#C({;5uAWi;LBvjmtyr8UK%3dT%T8G1Q;MC$l!S z(N!5kONBfdJ$n$XnN_hXGKQ3qBC8sEABmiA3R~`XLVXK?laE4`^P7_TP$IZ-agQ}) zBw)-RY`?5aIkbuZ>C`n-Tow zsIFzS!!WIoC(RaL_97MVdzN>DMGy~=un0tfqdiF+q z$r~a|WAm3ouo<99Ph{W+@Wug;oGT1l_4@({>*qgrUg33^c5lPp!JO*aO@rix=ShMV z0!~@O1857*XW3<0T_bmy4%W}VZtY&-z!NB(Z;IQSV!57XjyJFWeGnT;2SC;M z_3m}4$FE7z&TRv!LSZUlMF0X@*@RwP~|8a5s75GhYqKUuAwl#9#aq5Y6pZ9jzm zIbyh8e{e8PB~(W`PjW2{Aqd7pObwF^C^3X$+`BLG{q^jG@1f#!%{QB9^csk> zd*cylw0q!4sH}9|X{;KA0inS-qEq-HUR(!Wkv2|Stp5^HnRPD9nD=uG?mtZss9=Zy z6X&u26o!Iz6^EF+4-_v`R*zllHc-^K>a!&WX!n9dW0V3Y3>Ur$I!$92yU=`!atI5; zF(uOr9hSbhSBw#2-zTq86Z;czct;y1x?z=7X&D7egyrG6LU(Icel0X3o^F3-I`u&L zQ>3@O{o$>pl69fbV2NRxB4c$$+dTDobaJQVLMinP6#_W4RRWCsv2B!orfLx;Yn!z? z1+CzmzgV)qNEkD0i2=!91Xz~HBVHpx~w=FMXGC2KEMWkxBXefuVrE@M*Y!( zEt^Q>boWW_*hCy}9x0#zEz@@^;`8QBA9Wzs zg>KpA60<2SRRPs2S((ajQOpK94X%b62|W%yh(E7>5~V;@T?Zc$JKSktjcn`WaF=m0 z)X+Xp#t+}7{viz^x|#e*7*K{r3YPJ{6F-&HLfixcVIILra&6nw6<{@d7SmHWkgJ{LLB3toa+nl(miqZvTfJS_S0T)*YsrC`M_$uZNAs0C(d)Ayt>*E#mH^++nO6K0H~Oq-xjAu{1-bT0 z10ZYey{qHDCi>`d*6s7-*$EU0tqU@55TMKg*8-vIw3^xpaFh&S|A2D zZPJ7G*L4)M@eFp5V_@>aT2M?P5A6ZEEH~^scQ)NNg;$zMts%Dzu z0ZLi684`Lyo{NZSD@o4`_+@i(_|xK@#LpM`C||R8#hPr)iEN5QHpL)ngbC0{O5n^a zfeiZ{e$n!2pF3M&1eS!PyQVHDNQyXwfg_Q%L{a6fYc>5dYK2Rc$k0&=Xi@~ukq8qKP|aZ}0c>e4=FyksQ--JABtUK zTIUNHE#KCB_=n1+-MN}PMapnSmBHGhr2XYfwtS?->$o_B{kJ%(r%uzeGcvp5xjB6h zb~$++Zamzf*n=AGdSvOjN+>osb0zvBjmH|3?%ci(YH)$w8v}s2cEWXfPxOj$66+?$ zH?bYDW`|HMz{B^jcb+zY%e0~{jdQveQ;8a&ROmZgl+yWAuG15`Ck*NWB53X~k;{2e zcFOM9*!awJFSdKW?yLWkvv&cst11t5=VR@)*WPRG?3o7;NP=^%6R%Mc2}%)z)y!=k zAgI`?#h%_%Z^hP=aJ(f_%Do1%ArUwh73&kVHMX{3n^X`_rGhm+tJd3tRqL~Y7OZd4 zYKza@@B7DGd+&ff_Fh7==3~q;{_&50{IBtke*kdxrW{;TE5UXgoWP>;;v?8b(Y%EP zi;0C&gpQ$F4fKZ^BabJJ7~ASa_=*-^Of|(YOQ1yo!v?eF6i%DSiwrs`noZTE{iYl` zZ&CjEdoHo|C7^R{k~et6Mfaxepm z>gga?Np|*`Xnh29ILW(9=2JJNRG*HN>fofEAt9N@-9!f*s)0?BfuDY052n2Rc0xB) zj*_3-70i5Q%_G_3(Zpe`MKhuV(=LsKm`ZhmE+FQmPD&r?@rc53_^K;aY_REMRKUtHZfeuT_tzce2KjS3Pn=m%eNl36Zb&TJPefKsVti7-ow!> zLaHLvXhcDBh>fKU^QvfW`EX0m=pO36{1g4h(uQZj+KT2@@~}i*(Sg`ELS1&p$)*oa zIWWCrl$q&1VXo~JZFkfHqQra%S1!wj%}~uv^Z*(9Ah4i+A+f3iM2t&<%gzW`DiQgG z9kLRTg;a_$UQ$kF8F)&Y3?=UmyD-K`NLb*&Bw8m7QJyimcFZt>TyRk31OpCHCJJ#q zF_T~+uPDcWPln4r3j0#-sK%(o=(g+l5NyKSkE|+@bd4hdR|x>cEXJY?4>`OG^dKtg zqWY5}gu=#Vi#=fT*rooC*KK^XoxXP4gEN+lq*FPTUu1<;7c^PT<(HeC9JKrdFcLtY z`~L+HU(1haTU&G~4gI{9|IwBql$H;+v-@jm{7u$(Rxj;F;E1CRnDa@todar!aiURJ z#GrDm(1pqM{urkaKk!xFwkA?I+cFKLu!WMV4rAtq$zpmzl1w8>w$9~s{^-2AdNeb~ z;lAn5zWovC0Xk>q4$NP#Q=r&yOmSX4)eM+kTsU<4z4VLEt-ed*SD#_Ccklr~M~!)t z*d?llhwc_5%?7vR+Q6P?%2GGx_JZc`BA?k0!yycY`!2vh4zMH82H*5Nk;HAK`DE#! z=dzDL9X5&07#+hHc!C7oU3Uz^ab1}Yu>Q$A^MhibO#6#i$rFtnC~CQ%AD>ZSrb5l@|G!U7fiz z31o~lW+#YB5Q;8G=b(_VhHt*c*ny`F#HA2)M)_fL_wbw^YFEZ%k&iPA+e3>gemeXh zIv=_vdni2MFLH={%t;+XM=p6~EndAZVg|gr(0E5G4Fy6%NfstzC`OrYTcrSe?%Dg@}-J_-9phww@QrDDLo1j?HWeG#m{8gbPOlP>+x??SP>@OQ4o-vz!QE zti(8Y33w+va56>O^8gg9jtxF0A6GAsmXJ}clcU>zBDI3GEA~sxJJyVfSX$`)Ds_e& zuKqDjVBn^>v5^*7QNqPnR{xeXhw6V$#~~Kr`>*nmHcyV!Wh`L|eGcxx#ENJk#({_J z0)u`rG9U1ha`HoHMl%=i9qfRT$Upx>SK^d1n;q^k2N5BbaFJZsd$^PDz?&KO@m2AVHA#&;zNafJfVwIj0|oiu#P{S1 z1`$5Vc;JxbU>icV2r_bc`NteG?VQYrISMq@Pg=vTZ+CzoYQWBoj(|5-S0J@NEm0J> zgXRIqWm`N8EF%jbe-_qYQ7ZZmjdFk$n}+!WC#ENuKz+JL%j#`}0`)zBg-;nJJy#PK zp%Se!7k)${f|IlI;67*N$ZT;Wlchu~3~kDuKIB6k88PvVuLDgoGW;&gGKqJ$KB8Dr zBap7>&*wClOq@c&q})I$Rjo59HF7`YF}U)nq%DSRM!vjQF@iPFmqF+yl5jNc6Ru%d zw-)jih)Aj!=y!4L$a$LFKV|=#K{`~AY)>9TU^o_BDtC90@iIfW1gZ{EbX3}dA`0r? zHHuRZHtr(pEJWsc7y|};W5lKS8Jw4OlwF2``B>34%?QADaRf6G4f9+~(#P0)iWE>1 zKy|Yvu-CI{&AooUOJPoUXV9L$iFoteM(Pv<qOgbxW@KsD0i5o%un zAPJ9A5xAhT=*0@YMaLi&?T{V@Pa|vH4(1L;*f=_FY%pSN+NQ0qW`i3c6uaA$WwXs- z&v4cOpb~cx&Th#D{DABjM^-IZr9q?+QJbBYI!6?$hmfzQ&4oh`$#Gm=8NuMz16Hau z_aq_u1;{S)$C({=da9boRSzLme~G#SW|tC;WA?NEfMuwCHp?fbie9gn>~@ODqSQQW zzK9A&-!k&B6b@t0jet%+p1QvTjIcqRMH9|Z_l1wy3h%)lYX9@FUpHVYbhi)8c2N7=yBx;AyO~Xwf2R7yTrq_HTM$hsPA#X_W#iVI_1rF&nDksQ~#3LLR8MF)m z5=O&DFpjK`q`qCzt--6m{Y#DwA*vLe>6LRQtla4a?)0*(U41ty6S$R!7jcw3FdG zR-I~K*@m1I91g3S78q&KLDcWFDa*J*AJ_N~<)of?62=T};ulC(4hfD>te-xZrCt2q z%3OM@r>&z?7v2T)UU032KIVvqmxyUz(Bcw*U3vu)lJh(YqHrvF?6md6q=-`wSpaTf zS&6hJ)7?>xS7KO!QTh;(|VA5hv$yw`}fXmzPx4S#_+WNWeb5h^Q7Wf zGeXgxL-t+HwO7Bq28W=~LuwN{W$Ng6u_DiwUB|d^kqT6>c`@N~2@<3vgcIH4s7+$6 zT)tD6kNV1HC8`q7_?T+Iqrxb>{TZYIVw>ejyNfC=+J&QqXW#x%?$vI5$$YlNo=t8! z25UtW_1Hngd*)gIB%IfMJ)5Yc%ptml9s*D7_8&o81+9f7Y&|tlGbo5}&CLAm?<@q$@}<#Y#M5 z*i`X~fh#5WwDAoJO!ij4{}7r;?%AkTeE<-d4U~p!#ll>4XD0JUYp-msB31QOM4&=Q!BfuJ;P*I6mv7kfh)+V4Y2$)7 zKhR>{1`;XEiPq>kTe9uYB`ru5-23LYx1(tGo16bW!oK{>rYr_w<{~a^u*4ZQ9LhblH3+jL)hk9(I$8i1GRR!gObdh72zyL z?P5?nJ6lrTlJOWuDK-BAD>CI8kcACtojly0(2vDF2eDn7vU$eazF1?b8j%JT++7);1sW^l|OeGvg_8 z#m=zDaY<*6?L+Ct1=*z7|TI6e4 zNX$Ky=!Yh@92Q9q=f(GxTQ+gxX&uga6oXMt`(E$8XhIvxcUQkzEBvOJ$9&hPiJ$q$ z0(dBy>g35H2{cmFWiaU!YiW1_e`oo-n!mdJjC8~BFn$Hhc8&~-25n5z3imCTvjZL|EBVZ!Su3DZ~Pxbmp9))9V4-d@D$t--Avv3*I2SdCN4*-=?qt~ zF2dv0m_hu^V*K!P0`HrRoc_*P@9x{7jzS#+)v3>Rp8_x`0l?A690anajPH+WJKPRk z^9a`kQ_mP3)p^GS%#S}&9%h~^6TCG)*xQp5wKc=z&SmnQAKL7AuvVY82!J5(9>L*0KZ=WGs z6JM>pk&)Y_VzLq*vZ9%_^D7$|T(@2~H$6Xk$lRq@)a&++*4}6YMpi#$Zu+XZ{FlrZ zv39P!z!0_1ydq9FS9lXmxtl@z?7|b0yLjl!o%ab_ef((|ihsU;cyhgNxRzmOxyY8t zBg3DQX{|o_ipy`@1uL^Q9{pLVBFz=e_+}7rm}-eo4Zrl@u!QGHL*9=8pqGxx6r`&$znC* zCoK>wE+tH~xvzzzL&%mvR0+XiO*yPLh!k433mkhk6TE#VC?oi5uiV`-|I!JmOSN%B#S$ilGN;{!keG*pqgJCc!y?$edv z13YGWbwitwp<7+vilkWFNE%v)@s90qE1G3HhIuiT-uF)=??(u4a`U#rd(=Ek=nd_9 z(>wF#n}44JBC#UHniNsrJ2X6bjs#o$T~}_Uwv%18?ZQgsATiN-$QVNV@6OL%BPUsF z(uB3pCi8%j+`&*S-cAS17J9X=h7IjFyceMXhA$tUEK6IU3u%H;+dEh89j%-Do9tQb zc)`xun22Y8X1OQe2^)C{fj--L@o0)dxoKcBs9_xy%*nU2XRH}M1W*`$k76JR9S6mC z8O`VcGYL8fh^dDRx>wX|(YNhjauBSWEA}Fx1afZ+B(WkCi;AMP_owMf@ujFsd`eIA|yRpa%8k5wP%N>(&k-5WDC!bM_BZm`lQ1&X0Yiz(3% z1Q`2f=8UWPqGh@pif@p)!1wMkgL6({00HY%bveFf!hGo^cQ^vJjcHX!?*gzhEdev4 zLBjkqpqAM+0L!&2m|KCGOKt90i3{kPYd^|t20#mG6!6rF-LK0dmQ~^lbHq>qyd;?J z_4K=W*GFZz*W*%oR(z2%8c>GsI1hH-GOxPbGV|jy~^RZg!*$F z|7O#cj9}~fb%UGH_b-0>*3Ue?`m!T-k6ts|xBwx; z&-sbTlrpTfE!a2Rd&1mzKl@idx%;2)eCv^=wQt=WrC$EE?;iQe=Rf<`f4*<-bN}}J zZ`}2RZ+`0usrKo%^0QOrTaT$co4fPIH{X2EEiZawTj|+QU`einsPuKWe)*#}_;=r2 z{M`EGpR|<*wFByzsnX3{=8pMbI!8E#CW>RzfE4$o+hYfjGdJOAXm-vi!- zDp?zeTI22YcO7~0^}LPRrrXL^r^>1aR`$w&eeb8f^6A&NmBraGB;r`C44S$A%5h~( z*???As;q81tpG~V0Tb&p$Wo&S(p@{ZnFD{0qRpTpu!9#SOz=K3uX*=8ddyat@5oax2KXm@Dqhel4)n^<&HHnf=4U>98$Tbk`Fv z4BD)>?S0=XAA0zlKe~W>2KD-4*S5_QFTLlHM^8Cr+xvH{yX<+7c>9gjy-O(Y6e^3^ zD7vG%hy41%?`~iG{PuT!>N9uk{oF5Z+xU{Zp8NFaJ?~7PClY(`*T4fXGSt-i>u&JB zzk0&9bn&b^(&veo+Rs}us<&OY>+$Q}{oF4jOSd zM6m?;x;%xk84VZ8JqJs8%=_+p;&T?Rv+Oq&g!L^9>0E|_!Oc3#4qvzMvBeiFisHkz z_~r6I3b)PtFG`|A_2FYDk(Y5LG3w0;kz{&poB>4wvR!CdYc+k>&i!kC#oim6&FGKl z4$3-L%Vf=Dqs4ALBe*HrgC^t|#X(d{$PRfyuDBW-ovn~6f7Ur-4@2Jkg4~3C4%COJ zbCD4zu>6}v$F?#a9Q1+JEw*W;NHo@q>fU+GlI~OVG_%UeHHj=ZTPl5TQ`RO(t_sm$ zR&0fMd7vN!P(FaOTPW-;)*rU8KE-qjQ@X3I4GeFl@mSQFo{Yu+A8fqJ&%F> zzD&)cm*S$&y#>^0UEZ=Sh1;C$5P_Q_OterdY9Kcq0CfY-fMCrr2t65MH0i z#$2xX%MoaG=TJR3ym#;1EE+u8KItIXfTedPoEGS?7Cdjyn$Yimnf@lwL0rmXuXz^g zK54w*B9H^VTm4RUOIM7{)r7U(WK4rwQpa%E4BANcq&@Y@J=COAiDr<+-1JI3CMdH! zfHqHRHj{EJh7qE&{h)-Nb53j$=EX)6GN5Hd>+Q@5 zU&%}&Galh6wSBstq79X8+?2+z%C^J?5w6+Cd`&GSi5wL~2mXzt&Cq{uy%_)f_ z4YWBA@3C0Li#GPC1+_Dk>xtcT7;4K+B6kldMOcpj`RK_&eoyv%C}T4@1m!(%*mqH) zTNV`wR!OW_YPTp`HF%@N!& z0jl#EpTN5i(9wuU3a80TUQ47pNU(uqoz-uG{_*9Kmy!HhW3x|~X`MXm(a=jL^2za5 zwe?gHLA1rzI;&n00pj1jsaL%uZ;nf56GU4b%xQA$0Fm_uY(c2fL}aC9DI20;6`F&mz7kT;g2$@l>7AKsKHey8I*;-h2!PR1@ZnlB(}0Gp`ZSGY{Wtd#So z#vuVc^OMcJ*-qkQOeW*;=q$X)ZX4{;0Eo(Q(om4(W7p>xLjW{I1TBeCBf6bkwi664 zrg91)qN6NbBY*PhK2jiwYi3JgrrWQMa zZ1W+qDzCoXV{w%S)kRZSYprcq)h*#~H0LLIDWC(Ev4~eNg-qLCCf_Umx=f%tp^x2A* zC5$89c zomsknU< z{1+C2VGGLw?vRzG`dHR1H+~Y{RTJ>=YG&9|+{abDrpx?;gw=*RG;B|t>`lV%RbV)0LZAR8C)F8qJVe7h#dMH zeH<<&L@Uu`a4gS|s%OlG#sMqfh6H2Pk3oi;7A9RUnSnIvgo~2q$55&naBPLmS74sf zL2RlX@V$>OVx?HskfPH%53pCfG>VE7{6sqOay=hFeNAyG?wH`JOavDAz|=To1fRdh znzceCSYsgM{RtsxLRs}MJw|TfDPAs~YGdPq4{k_`ES#MsJDWW+TMq3>!PKm^9%x(- zauKNL@-3Vi_{)Hi(9IUSlt6D*?Xt8|JXH0pOg-S#7dKqNAjIZ< z!-F~IVziP4%jU;!yR$;YxPJ*{)IWR3xv^$DP(?Fqbo#14OU3@Y@p^XLG6{y=j*X|_RmL*IOtj(?=JjCw z{?{j|S1eJK zj5k9>xu-(Qx+Xa+D^x`*L62OZ1BS`ro=`B7sj0c|4mC~=x27CHa|IkN>I39}asOvQ86qBqH+p~)Z=4PEK-*$kD~H&h>#r`1 z{Sn!z#y|X|b(2QwSvpA5x6X?A7Bk92via7Oed&X1?i3rF{Q!jdfu3BNS^CYk^v%{| zz99?Xvs@BMNXC_6PPtU+JISA%>l~v5vNx4Dqj+}v`a6H>Yn*YshM}a_Eap8H)jL)2 z)p<)KuP^kU`jNI7fGTfn)Tj-muMe{^HKnk)7kkm-pGOdPAgHlq>!3PerGfp z*GOIuKA4^y_ENfJm|$aWg%O)7fB84X@xky`QzU?cVi4#JTsA0a@?6P?nieSMjNU**GqRq`uT3a9lf+g&UiVrq$CVM;yaj# z&+R)*a<=bKQ~PaOFF3NMwqAlw$MsV3wX8*V9-SAd-XomcaT)7~>O8pL3E_@v^QboS zIGxL2Czy6huU{E;K;QbhV|X8mlpcY5AnmPUDX}8X4}cu>dk) z9QEJ(>4Adx^2xZnR{15dz-~IryU@(S0(|15o~s5v??uUC^GHawv8Ix>no4LGo-ah} zJVSP)jy01A8d2o;ZtZOq9Q^&NB!pzvgm)Fqa;3`h=27&&Sxy7m6CpOOuljCU0U`+Y zwMF$*nEb%E<~-swlwaXXR%+P<5qXciEK~$h`_?N_v(QdD$v2*{&3sGtDu{;!nPeLa zU?bSstV4hokft%&E1}*Q3D((_XA~QR7fGquLkFBMuA4VpOWW{XVMPRjwCW!~*lnvj zGy96Ya<%|}r@Cn>sVez!nob+-HX>bU!;uBxhr1B1rRWG~ z-jY26rqIlD&N&G@nHtd5O>Cjr4Q<&jbA)ZkKD|VejH};P4tA_47|x?AljJQ7^$$M4=~~NsZix9F)~CIT>qUIMeuqG;V;dyb7^MslIC9BWQ3+svo;Zpz^tvF z-c9Zru>&r{%L(eX5Wt4=bj%2dQKn85pKK-~beH}~1TpgDIc=`H%0Wh!GREkAMBs)a zXR#2YM|LF(Av{wdvOCBF#4lunDv_{zUL@@kB$^ea5xx%OJ-{8r?uTqLo76l38kw1p zd_x-KTstm3!iOR{A~T=XLVf?=P(~1qE)015qc2S zZ-d|dldzw-z6dm*>~*KwuO9~5ge0{$p+NQj_~H^=Y@Y79j~+yp5@xdAXL!~{H5o8H zTL61ww_J}~b$2K^_8|tjF;8|kgXi;_2@a3-W_N$YG1_!nQtvgFT!h{h)E+brZ8y$U zAUZ31xKxN#s3#B2&EIyz!>`!OE(U3ajgH&d@(pr9(xN%cvp@uEcxrKC3R@KItw~0; zdC;1-z5<+zmtyCPZdWMDLEGYxI8`CFm^olEn389K=`Ej3seN#dFzaZj3#cv#UB4a*@jBh3J&>raU5OO<};Wp27&39PutZZ69}YMsHgd|K0uW@x>GBt+r5OA~>t+3$GMaJdgbX@{kq7C~EIw)Kzf?BMo4s#hEw zE!O?S=RiKoZ>HtBFp&IbAKyd04l)8T5%nT<=tqKiFz&5Qy5u@FEB|FfIDB5s=;)9B zcK?+h`fB#f$aO$?tsIMY9HA)P)BCDfceYpd;o*>#6azqsA20ovN%KYaGO&-in3*YO zW@b7w6G-T?`4^r}Ob#XnU2KtVbHg{Y>M8K=oLmhuE+vApFFY&UY=G%@PATh=*g5$2 zr(JjUdw&xG*p|(|yZ+(6C(k_>GMGy6Jc1t%jf2N%NHRl?#p$+e>xCbg{J}rZ9UPOz z6MjB+!7CUB>^LlZqn1gx`SW=N*>pQ{X#$Mf44xw1yUoYHOxFZ12DoK5Eoh17bT((F zv}5_2S4>QU5XmGxC92_1hb{rD!q|rru#@M6@pT_3y zQz!Eae>mq9Z8^k)#%2NbrNfln{T~~WaLYCK|Ec{|kyo7vGTms16>}Sm&t(zk&kdA4 zI&QeK#JqvsZg8(Z#@v?dAe;;?x$5%K%Ey$KjX84QN3|h19lW4xB?Dtg6GaBLlO%e%pfR0i<`MbngOC^qUAt8z zPSneP9+!E?Z&2zOLEBQ=&mz9^(1;_20xxs(ul({a?hUE2Z*CI7F*m8`04>j0lZ43? z^>HCXLYuqmYk4zO{Z>a(d7x&8kV)j0G&!tiR4lY zQ@5w~2{9An9t;ug72%th*;okE{a2j8fkr8`gN#Hqb_KriMXt7}c`iOP(&@o}YDkNv zVMP6?Sa#Nl$F=`;IxALm#y5+dWlFf1^nx*=S#iPSpya-3+5QDZZyl8coyi$_fOk^+p7Z;GG! z1`~yKGQUP9qkb~DW%K#4nbCugF-y@vJq%8}1CtiM1=sHvt5&TlRuy??6TQ?;>{(MyNjdK((NZFZkBijRExabTMnY{f#Tzhd7eGaF`N206-u3d5T$0a=D2VW5 z^V^Y>doJ=9!8{Q^#+r}o18EJXJOTG;#~POQYNGibVB!Z<%%9wpP&7^ci}z^IL94~! zcx@sUs;*&8fFyf8Sw8|1+8mZajHNff^JLxDV2C|QoQqaAUu7+?Y(C7=GtsoY=FpW?4ui%jkUD-*~gA``cfb|I+@lS>`{`-|#=-YhD}UwkgX~e`f|wsmna|2XDu)pmqZm zAiF)09FNI3Qr@Hh&(TzTcrF9s)-7f;1uw42Ooqu0R-Kq|9a0#v1)L&k;~z*qt>#qM ztGg!7lM3M{L{OZ=HF7DLCM3=CJ^>@$McQMRM4i@@!`m&9fO9}HF=m!$pc-qmWTaUu zgQ*L5r%~^SF?Hen`)Cd>K&qge>T*f|;S`ps2?WV` zI>zv#A+OAT)R8BW83KgRUHZq$sSeBV)AOs4SO%w4j;_Idg)cf;o}?E?MV zje?dkrE*9h=Cvs#!YzVNh0Xbn#s}lP(>|?*^LfyU1-3FRRMf5rO_N8Q@y>Un0lWw7 z1hjoKTDgMxpWx+m1^SL^XD@CrLtpsh8T=H9L|CKVqG{-)fJHN3RD$<8g5b&VFBBd) z4qqQ^8xGY%9y~6d(TVmg%!p1?p*Svf!8wA~GyHoX8&A!yWfOUpWh*JiL#tOvfOeY4 zhO`tmIYSa1fOYSf!Kax@E+^I+=t2?D=BK`mJ7~$|kIJwGD8Rh4>jCVXVOsczVT+IA zM0H@LUFeY+$S%|b&kzA44$Wn?tSn~PG`{cxfS}7DkloeItVw4rNs`;B4&s6vx_Ln| zlpV$80tGLQOkRCGhCb3a~ziOUM)oxdf^vSdoe_4;efaZn&gEH1YgTM zQzS537djKeg^dcuz+n97=jgHzcGN-U!es#=a*Qw#OX^O3VI)BEHZB#rfJMJE`t5IM ztgs^alBAB~G8V~Gzk_xcKd4KENt=zZ=sy~ABa=lqo*@--jO0hT>DwG%Ouumj#Dwuig*inT=Vs9~T@`DZQ^| zxfD325v_cF=7?b>y916fW8qj!yu@|3?jFQiuy|$Lrff1avuN;i&zI{20rCPtrXt`; zZfWOaT}GB0=C2-Z&^=}F-k07nPE!F5<9M>IqHU|(Gh(qoB`dc^@gLL6 z{$?-_J~tEK0I9~Ry2axGs3T)m3=Zc8GWJ`tW&KB_52^-qGp26;Ay=`h)>Jbfa5>#n zcNYDxKD;=A#01GITM;oqe3FfDMr9)tvy3WNq4Y8G>7RQjf?r3Fmnu3&Ii0b{*$PnTs$dg)^>AlBK^OghMs?UX6+^cJg{^%sl)syPA z2c+4O0(@6d@rYDDb&RlaEyx~1EFg{RRePiEkd73u?hnOx4OR4qC)LLTE)Agwd1Uo` z&8Y;Qt?nl*EP8-A-$yGR89pR17ylR^tO1BM2Sz8&<=2udyk6s;x^-GEgXWWGG524utBS7%vin8qNwx3by9q8f=< z8^qfs%`J~l2R;h$pn3;3X2J+po=BRp1I)Gfx?a2ge6ka|JhRr2&sZ%|Sz>FVG`HJf z3vGD?{C8#b-=_mBD|l=!PV(u2kjR9~%WH{>9O1V!cG+AO_67XCyul4MC&y7D;psxP5a5)k!n@^heBJ<+w3Z}(dt9eVoRhOS3MWUSkJ|_Bn z#X?K~IN%xx2T5A`)hKlCTT-wOAcWXx()~bj!9-0BfH7OSvoO|>LFCTa{eqw;ZXaF@ z=IZ~BZ)V)#Gdxlg-L*MmcT>EeIRo|p&x)arL3hZ3eoTt)5Ix}Z!{kVmAmSv3nO%t< zYEJEy?pHRCQd5jMWb6jlBoi!rq||n8sMq`%f{Cfg2;wrDFF1rneNsAy>X9iMnBh|V zga0H3!pM^s9{WQ#@dQ>0)lW2s5Tnq{rmWX&+=-O{46BR>NMkItk1@# zAS?_GC;Undy|b)exllw|@m(N)_+f)^tZ0H0NYaH>B9AtNM&Eotvt8=#B@LgWuent& zbnBTNduo=?Sj1F`fK?9J<3UNL>uA*`Xz#@44S?OLS8vKj(jh{NhkNm@>f4M#bs^F111~y`lIi;FM3n1g- zSG)D{BzBHdxDbOnEl&B6-Vc|t@oO!A*C5H)o?kD6=Nc9ZOr2Bn0jv)jP<3Sa+`*DG zw&q@)%Z6(t+m1nV?q}F1G|nA~k(pyJLNX9Sw%ChcMre0DjLtB1>FC6?m30PAH(H*Bug*q59F`OI(D^l3rs#7w=txm}RKu4`) zcrs`n%ZAt?j%XVoa6-R?l|$QzvihV0L)>H~%j0xm>2M=m_s53v=r~P>3ADhau{8+Ui+BxAciCZIGHd{_+AIh zgNC(ke@BfBT9LL{)P)2@05WW7J4OMRU4AuI%CFUi}3k{xe*xF>cg|%Fu1)-~zO-+PCC6(=MJ@>3PhN zc#uAHCdSdwO|OBCHmfftb2q3y^0DGQv7OoxlQ9LU5^+M6R(Nb{R3y0Z zwPygJL{lrIGD(opvWfacGms3}(IdhU{Jdlygg~Bkh!P0M=X!Rho9Elwk7S{d2-q0p zwzmN}h}i`*##s=z5y+pA)1nHPIxQN-l{hRhL{#6nWF0x$Wo--9WulfFg0zW>jX-0N zY5Ta_wX6702cLJUUxRUg z?s_HEqAe@`PYT102o%@Y2^{yj8M- zwG*@wCPX(a5D~#ZJHlmc^o~;$WR6He*;@e7>SS@9?2mR3lFr4*KfK(aT#qOjRIsn) z^(tx`O;+=hqvcG(Ibsbwg<|f&(&HwU6IX<G1)xiNo!Cb zJ|7NzR~!$BYT) zVT7CqvCiUWh?Lr1L&`maMJj%|>R|DehVYduZxRSjjIlUgWFqezXu5+OP2@;X@- z+QcpK&j}*bqoj$A9S$6ZuQ5QZ4C*EV$dp>=pQqYCHbyi zqi`^E(v<|9x7xOI&aq+%%0s1aP$+n~t8SctjN)FWc-+T(-~``GaAjx3*Ol`k%w8`Y zxRh<}v{1*8AEY2ld>g@%Vb}>ET^B%cBfaTxIh~;nXx;b(xIEg%>!nan3ALS^Ixl#A zuemA!fHehTN#@7#4yt;dA+R>afGZNg`CdX0P>vPRm0M52fC64c%xj=VM$%u;U>pelkN<~ zP^5m3A-3Y)HGO0f?_Zo36mJTPb;LWIum;jhD>YEgnU2T(3t3+NF4-_?zbZF$Gww9a&hg)hUc!jbI#B=FZzHTmf;!X74W#r9QgXOaD(&@-2tD3d0V}X-Zu^j}%B@A%#Gm(Mo2{h2W2e(nC z6DjjjJmEv~|M$=a^7veLeEUN<0buZqVr%I9p8i(8mn($j#WlzKkezrd5V^sNyh*+a zNaEedoww9bP>vO{{;WBx2}E4f6v&lo z2TwkjRTrJq-;vQ~a-5?H!-4;~5Za>Bxk2>s9h<5|d7K)3i`bT?}d*IGT@`dfs zo@GfF6S3yvIauyg{_ofjGTQU!SagL@O z`tXD5mtX@yI-vHMfxYV4C_W#wnxZMp^$ks2=88vMtkHxepD#T@pFntYJU0Sc@ggW8 ze6d_V4-~Ucv01UZo^S=EKcKFLw8UBUhk5@a#O|;UV^elAvkVZ^nhFJ8Sly6^io+rv z_-M5PE~#%(y&0m7md#y(f~@%>FwlMfK_5ZBkzU;h77Do1@W_09&_G+ebmpiGMjeOf zQTd4EY}Nnn&Q?Z;(xbXW2QJ0F?xWB*!B=>@c@SzzAp&G|A-gJbNAuxL23$72pFcT|NsuB8F*5 z`*lIKnM!nPVteVFD zQ<^Ycqt2Iw84t>=$$dl@Ve9mt&$zKHc3(yyO^Q~$EUI?z4|&DJ$?8-$4mX%Wv?z+0 zZak=|$3|J|V^Bc%d(^c*2{@awwQ1uw#4X9QZDf7c|A(CR+(G7<04wo4H?RNLcy%%p z^hYroP*2|cASKL~bXZGNY1naAj?i(l5Muym@@ecq;tNY*2W;a#mF!3ZCha~T+rL!d zM0(G;c|8DRKg$ZBBl+&C`Tqcf|Ig%*gnk_g~&AI#)Os zAN;4z31BbE&O~=|ve(P<2rlBg0We>QW7Zvj+I1~;_O3o~pw=e=^oQr_t67wZZl0E<`YdaOQJjms zeUSM8g5y!NSVT=$aKL9>Z-*s8O@SnQlq{0h<@hv}$^Cf#SpUQ=f8;1P@xuc)Ozl{6 z489jJ-1K%IPQbx8C4PiUGuYkam&QPHLzo)5pYMK2VW0rD^l!^KqmZe^A>FXGM3J(W zPID?cd9z_xbyqo>2uVNDym<9aX6a-)8$ohVBPHO9@C5WRIkZvAWGZHsCBAnZhdx&~ zg`bEiw<$Yy)ZGzE`v~9Tj#%;2V_)-yVT1gH#)-iyQ;%wF<8MAHMC{zU2|~xNa+3aK zkxzus*A*yFW705|0OHy`C+q17Bnan{=F`l@Njz^KV#2R+RmXS;2WCU@Y-h)av>VKq zUiF2L>Cc9P1+B}ii5t|4im(B$>TpE?LTb*&d}^*478Jeh9%_#db%!L}lCC+O5zpYM zk#Nv;xMZHte1HO?#a0A|w?DXSQou+2g#JWdWdEOV3)WUp1M53odh~X-=U4EGY(Llt*(jeYepQ(2JkAe}Syr9X-xB&mxm67!r|&=!p#l^I#2Ow=nl_bg zbfz|Th$&?bSX4zB`KkG%f~5w#A#zhm1ok;P#c$56^HbTp%@s|o= zAYdk=8NCdTCP3p&BK91ur2v$nUU=H5zTRtInOY9@FIq-5W`wfpjkHnC+eNAVeg?wd zc_~~Y6yAE*(O=&mp)10`-t|yQQ!G2X;lqgAP}~DuEblPRYOc-KP8sF}^`kUOOq;U* zqxvV!f#$}S_ajqJi)!|VH?+ejP!f|aZ6en)jE8*=R86MgTU9UMxmzK##B)#0NlpiA z*3ql5=Udz*o3eF$Tg?3w!Ma%_$W4l7KDLHqCnDiCSQHt}W0jn&A&Fb_m9%%<3Dsx; z)TQ>&IxvcY$_P<#b-%V zYs1bhNmGKZKki544eJTLzSr`~WEzq`<=%8Y_w~vi^$-sTuAXXzY1T zhKKxOU2-h!-X}98Z~gr=&|#Tn$OPxXbp^YnnM1f*A^?hkxJ`;QH1MnMl^Snhrm7Dm z!X)HOzV&bU#kw4`=B5&cf~gsKv{(|*0q6RL`uG$jqqsgUPRp)F<~8Gjy}lBrZX-lG zzBlpPZh1_A#76E4&=wchTg^SL1qTf9i%_~ujEAmA9JFR1%b5i zb$(bCcJJKuUNBQWlWid5Ky4;E4dhOS6Wzm5c+PVWdOX4nwIw@I(u4%16b@cyV*U*~ zcEpEBh$U#;2dtLp3_z-bs$ zK`i#uY+WG2lscz}JSk{1xag|WNv@HbqcN*KmgpI4+wht8z-ahM(SJOms@ONjLzc`& z`O-x*dpP%m{Wr#(0-c|R@1%qZoW7MZD)e7A0g)v=Ya-@+3=wmkkAOrHAEB&-51N}g zuq2_-Aj7UNZ#)H^VP$h`_{0jNG1CMeCtHNAB~&qvT!_!q&P9h#1J?ao{}>0A;$CyI z7S($_1V^@j$21{CTIMR`AJvK#+E2&ydF2@&G!u(ZC^aUU0GdBI%F)DFV&hOHrmqIq ztqh^lm`!S7Ln?h-jBp(%^uh6A$OGD8{z(}`CxsU?^XSYK_C632Ht+pLrheFxP=yb?vU z@MRq?AwDIB>S}Vp-yccS=ns)|6k3A)#bHCwqdDIVs_z9>+S@8_85*EqVnG6F5kiF1 zkG#4$@(Bv?_rV%(nd^{8AYw!EbK(4sT95+bu1CpqHQ-8LG}1h%0?*qEliSTOjo|4` zQW}y|M%P~%A{ubQ^#^f?8MS0p2XfN|M+Pt@u`Z$hOO*=c)&kJ+l|#K9^?6ZCAFM}q zC&)?&)}rMs=WEqS)y+Hs{Io$h>>4ggn6AEdzpJP!f)u%?>2ahh9f_#guy2ls`I63K&R;*2150vNv^{E@`q#j2ns2X!mc}LTW!0=#k2@vb(*g0MzisD%i8baYqq zyPL8zR2*>7uIC3BkWDF>L)~|Nk}g&Ncpnh}m+X3EZfqeChr)QtXqoTo09OJ^z_Xb0 zl43--=hZ}SuAvvu1)vWJ-%E#9c|d{T2QVC{o<&}k8Y7vDD!N7=<{hn15Ru>#Fw&Pk zw$ir<7b*9U)D7}=QR+Nk7^l33ed|SUZQ?&cy_~`qn7GgczCXP0-BYv2!0TMPLuP}> z1;G057l{p;xRP1`6951ku!Vz`Y?{H7yA3|I6kikEID-hnkKV8bq~ajO))RecrTM6Y zbVt6u|B5^&4@xdZmf2r;5jJ!lY|`^BuGOkYgJ(w<4ahf#c~5^=GgxqOuIlP{6~D>M z)z=j}PB&ngx(&`%w@9e(H)1P&avm7L;n0?0LcgV#j)uP*pVqW=%k*I+0SimX964bR(A&g>m?{2RJXBThEvxzP*?S9Q8xj! z%qW7FtV2?s<*!!etQiioHhz??IGZ+<|VO4s-nqrpE8hH zbNj~_LkN{hr>K-=Al4o@VA=2C2%}2i*(*azvT0Ytz))>O{#g;WM~Dr9S=_Tk!YjhZ zGQc2L&1eS2x*o*Gb>&1gp%%e4Lr?(ZSulL#etLymR3raI-@x9eM$9G zsro9_O7PCOR_mW)lI@A=2^J#V663D^1qRmxr2WbmFX>X!xRX78haa88C? z3u*%|Sk@;bjC~AD@U@H`ew_h7&^;Q82JIBzFv@%Rnc70a)o6g!#NUF`kE3dZd^oV` zjg+6(VEqsU{k_u7(Xv`TG4i zxb;0G4&H5P7v`fY4D^BCjAqX$E_9R`JQtf~*8^q}#5EHGKL|aLTEJ~Ml!;F^CTg^* zx}D7cMmMGHw=0@YW#of>GEKF^r_sKm`C+!SGxXW#)f=kz)|7v2-4wViMkJrem- zq@-`?(dsk^OLRFXi)aCE*(!-Ufa=kJ68eY?C+&3zSG=3M+7;>I2#Q0&67+eT;ljoH zvZs(H9HNs@GYK^y_Jdegq{hgHXgX!ovHq2I3NTf_U|u>4_&7jP|1Egx>^5W{j3(0{ zg7q^#O7hS}U)Kj?khK>J^lk0|AS?;C47KwSWQ||bM3vwp%t;T4jozK3;6&^f{p6kq z5$GINFb)Xg_Ibz{tX(ER4@&~Bcz5oh)SPhy_|TBw4Ms8gM9S=Z{dmS;^2GFoBfoto?y8oCADw1OW|>T<>(Rh*)?Rk5FY<((i;f#tmq>yZs5l7Z@$-`P*l`E~!O+*zFDcgTrf!VI@s?t>#+vDR=*|dvxd}W-cACE}Pm)H5B zF+x|3byPYqQ5`}Zg{DLaCIJsH+K9p>>B z&iZheM@_|cXGQYHRhK#BqAh-U$#q~ge(ou8ZhR=(wv!*vHWGFQ)!D)A!~}g+i-s@( z(tpZ}JFOeJtcAUM0LV7a$+CtkZQ!pBWr9WZVfaPXNn9#IfACTyj4I-#uN z${x1KfF6o^G3nu=-51r}%W;LSN`Z+GPF=F*?%^ao4=1U+3&)f2@ad8x({48;l5B72 zkh6E%r?_P#y_ zi64Q=vCy)=ijI*ew*S~trwm@ff18Ibm@hcI$n3if2GkDo0E|HQD@34lcU8w&{*NQY zHJ)OrN_w}NQbc0ol9VO9FR5E-t`;@Gl>Jx0X0uCA{=s`)R=(C4oEzeNF=ILv)1}z<8HX zggp!-;^Pp;SYn0kOLeyTUsMTRL8LZHSg_sMX%fgr|*YHC6(y~K%zat-s zPZ1C4uBU$G`g*(@c!$f!a_fy=Sf8%ZLpG!t>Wk`qZ6qul? zc-x}gx6zSRH1KH}hz&R!Sz0u8aK{?c)<%7u5xbt&P_F@N%71Vqv~m)b0~?KuPI2euGFIOkp?of7MM1O zW4t^S+De`4R!QY?WL!u1U_+K)Kau&eSY_#`zRsVPyd8HC&e2q=c9dzL&fUWS6amFv zV$Sf@DC$^VD22bnnklOORszR)e$tRZAslwNj4D~O*_0IqW%CER*`r_9RtrjHvmL{C0vw*8%<7!AT1eKmpBZ&5XU=_iqu&2 zK$LvbFptVW$uvyu%3(q>Mtg%22dsYVK&HANh4Iixye!h`HmBVgcQ6v=f=#;1ZaiJ$ z_6z_>Mn@au;DRH+Iach&6o`~L^`sCojMW#+q|C?xb^z!12_Qf8 zPxF-z=%bEynl~U;NQ`WghyW@PK)5DpfieC+6$E2u4IcHtJ%nPf%7tEyL-}ImcVRR{ zFFe(=5u5{?vTbr;cn1y81${Jl_US)pOUSZXjvS4K_!9oXw9_|Lm`O%Fg?s=y`S!zF z3&qOk=JSy7Vt)uK<|eNlEBO5{OcgWmie^P*XHLAGyaLV4x%L-qjo2T_E@x;8lxVM~ z17z^-u;?W!Qe-MOJb^+dYcyY%V+dh!J%nW~SqQQ*7W#Y5$_P;A`C~QVsnkdgUZX9^ z;Nxll&qQ}2uScN#gfuMe@KZcdPnrp7{un%kzycbjG;bj&d40CT$f*C`kp#02=8vJ?1$y~Jcp z3wMB|1W(WcTKeRe4|vD?Ykt&*bvY-Tm@`H5gHMhlz!C-=VHhYLU{ms-4+IWe@=iVU z*B+b2tLC6me()FJ5oP$;PbvZ-g+!HfV?-bli0j5vP`}M`*c5PG3SDtAb_Q_BAow*R zVT5`eLF{s~NlLN0h#DaO=sR~kH-`=`M;BEQq`(xMb~Ke->t#bi==r1B#q|{0nr$tU zzR)&t3@rUlrfZ$kdTfBk_y_757_L!qjC51T)~4+IDuWL;JYNdhOooqsbLT%K<{i7M ztGN|>BerRFKdWnTWXdFvIjve2$A}Q%k3Dm@X|_0JXcwNh>?|y*WjI5!Uix8#ju|6W za!d~^;%gMmPsG=Rjfi4!7e{l3SdPpVM3x%Mg)|7us_Qv^Mjr>3WKD3Fkh){IBqe5d zbKgR5T!E4wZXFk4{1eYFM%s6nsk*>RHS1~M0*nVKV9o-}q)_92%KpBdVa`mGXRQ*}N zNp4@}56RL#(=Yq`iYtn}$*5;>RArb1V+>y_V`Oz85i^)rRJzXEzLsaz6u~fJfMuod z8bZWA?4@ORiTGvbNN{LsoQk#0 z!T%n|ckCHS^aM+79%oyrk;e^LiyxSZJC3j~niIlvCIzN$xHaE!pY@6LM$#{;ohFPGd&fP6Qr|68M z%AiXXBA&nxWpAn(s$CIX8Ou2vU=5vSHP4&*pRx?WH(d5EjXSPZUrHQi5H|sob%%&X zgBMx=gz#ko}Huq{c{_xKH%m2k0as?=B^&88)A@<&a8_Q^0@G`~6OOKiiy+?NW0*v{pQ(Nt=|lq$ zZvIk-)woviUv~DI>S`QursLov9_$WXOa#!F>=m2CSrCn2F&;^1z`{5N4d~%%Y}iuG zBt3_09(1&wu899$bQoc{e5}tfDxK=3tew$>0A;(A8Nl;^G9C^_)4ZK-p#;f{XdE+C zPw#esKf4rT93syCOE3(Dko*KKuFL2gGyaJtv`&^jKB+;rH3&AQY!C?KL#BRg^2mBt z&M1m3Bc;*^3r97v-mA3N{#Tp{n;aISqy}+^tCt|;@uws1o0q(6$w&iaVs*44>xDlP zqq8wP95(_H zE*bs3RHh4 zf0;FI4B}@*v%w!TcpEg8`!n?%UZZzi$m>>AnT6GMiT)tqZd@NTLFZ-r-?eC?%)v|9!XW`8oq9FZ}h;+K48Q!d0xgr9PxrXJzY4f z>hej!;2>MRtut~QQ@xJ5T*UO(33yihmlQ#b;nJQvhqI4G@G0IkMfJ|2zrk|M%UHZM z`YEekO+`5|Dv46rJXqb0ev~LDqALSn(;ray9LNP!@WGiE?W+EQ5rm5jwg33!1Y6kAtQ5k;7-Lqkl7@E^D) zM)!E})ENTAZbJ^(M|>_g3Pb7UH`fg6k@LQucoNYAtk(rT=?T80(4 zLkiGPc`jO4+u^yR`Tn}YPqu$<^6CQ=ir}IMrxM+<*NZh;h3~RU_B2N|7DITaY8k`U zg4|;Z>HJA{e9^8S6-z#XPTE$fYmz-Qls7;{PznA{4Im;Wj<}X4&@Q4{kXI`%4JDFK zQaIekY$EAUsR>9xwn1TFL!t6(^`n4IkRMPKYoep_ek-VhkIsM}xbKvK}oXaAm=il}F>sxt_I8HB_Nq7Kh zJS=r633LBhp>1d!7l{s%AEspX7f0&c6(!huYo8`-)@H*2haEeV{;4VS6irdI~~r}q`C zGZk%W(e8Sn2k!QWQP909n-#HU$IztO?&UqG3>7Mh(O^MfH$_s!$WYWP;-lpur*Tom zN|Et@3W7NG8dGMq0gyg}4~J*pxXJ3DU=b*8K0^UcC$Az%^zdYi0ydB1$pW@FwPNgKJk$dQA{S4kA+hQLj^L7iIG>GUE93s&5jA@*}mw9^cXl6+F`aS z5%-1mk#skTx^8@D0tNpm{U!o9#s1RZD$@eih31a5gbkwhHi8g3^hCZ07X@?E^zP+Z7Ruz`_4eUM(nc3Y@3W(K$q?rN4M zCK93!N6GwUOUdZOWd`%6|AP+OHr&5y1Cey&kO?7;(rItmjGW zv3(`)zb1!;2?6|JZiD+RWF7@d6Q>rjEQPOuDlnJAesb=n4TxcHI8m5_DvILg=v{0Q zK(bWSS2QaWfbp2X4zOeA!FBbr=vPi+sn(o~9YRs^n}2HxK6Wrdb!>=@%~^19HfISD zz8V2VuVPzJ8t_h{^(4rOh2<&N~SRkoINh{ZCBi%i7SWWjsJ46V##+j6RP2;-;d? zCw`I|cz}9X^Q`Zed@N!_~FN-&v$Y=2$EM~f18Icy`s$D&F$q{{G z0_;SRo?hgZ>AQjr{`aRP={|`bNw)~VlX9FsqK2SE^az;OPdqWhT9C6iC`}&%V<%2_ zS1d{CQdmwrHYrS5jTg8x31m6ZW%kb8U;OnSzVd6Iyz?(VL7e1<^tR?P=Vz}XQO+!Z z41_g;aS#@tUcl6+Ut5!#yEKTKyoo6@5$oEqH}1@k7H87S$ZiUz2FNhft8k5zMHflW zd;t!+jFc>!m2p%i3aEt9tNyDaMucuJ7C7*gm2CPmMrx*cS{n~|(n zy=$RhM(lOKSe*koiEa?9K#!z|^oVcDsL%~(r}Oo4lqLh*ri@9g(+^=o(u8ckq?&2k zgEruYRAg#dqv$zG8%m2Mx5DSWdbw+J#`_V9A6q;ICb}LVKcX%BvYRjP#*9qvXkj8L zr4f?fFleFgxmma>Ab z#yfo}eiOi)O^G@U63)r=QsehND?b@uzGV85NZ7|avqZRScr7fn?wvh!s?z-n_+a`H z5H#J?=d6+KP!>Hn)q@9BYM`b8ZP{$lAw=r8XR@XzJ+t})Y|uV6S8R4oEsrP2PmPw3 zQNls1zY8=oVy-x1b6wJoeZ9&h7w7{q47Wv#0~CH%!&+khIGd0rqaCYK2k1M~jGi6O zG$1dzIV<0Yo5YAu^C0n(iy^c@vvgd_aB#-WN*=aMvrET^NbWQ~?cjg})^(v{t=ATt z+B_Z6n!5|J4NO~`$`L43+pOQzsVC@rRHF5;f-+<#S!dBx$_>?vr_ah)c|-h7^&y;v z$8!T<8=9lPP7@+}fR$BWOgz|z8ZxV{g_ETrO`}5L8bmDu7UR4uIWc?v-%?KDgFtrW zxH2*RaqdzPR^6^}3xW_gzo_B0j-%6~q?6`sG&WUqbd#L*qEHv$2?RgFAkWG-^Mg*y z9P9UA-i3R^)Yr-a)6(&jtiII`%nS}cs$%6_g-8DB(wmcoF<>;|+j=#OM;@3Dc7{=d zY)BsMbQl(;b5KWrJ*hE-mzT83MtpL`obf7lizoN*z~%^{$xde9g)kI41Ey58{E+R${@0W-o zsGvbn@zw@KK}C#;h)OjoAS%_URPoC1`+e4)IVa%d*Wc&&=WFE5%--wrtY$EC%?jz>C4$%7Tjkm_LV z=|YC8p2=x~leGrf1ffr637(HEjI}@w_H5!2M^k{S$`nxB%WoUFw|5*=QspAcy;?=Y zkF(71E+g#Su9fE{KnAsvjusWrD>>;DD3bmVVR9~pG|JH@l;?zs7~Gj@71VQ;;%M`^ ziK2ESaSv9=0$`02m*E97UHtuy6TuFKWy=w+hz}0zHQ50|Uxj>81*8c#I>U<}^Wkyq zbUrvXA0THER5zlb`ZTjr>i&F?bg4%D+AipK^*I5M5D{_V#$_%D{)zQbp$dAOINy&^ zv$bc)v=8M8`)C$Ka#r0kOOqxPv;`F3}Nsf8V6R`}Ld_WYEHJ45Ws^8jeETZMXV__H`c${$Fa@@OFQiSw* zZJNu1Hvbn_uEj1PXrRt0XYAOWRzysaZ8Rbd=$n~<8W^QzCwjREPXDMD6cEvRSuY3J z7Q`91yJvA{6?Dz^w)9C4wk#Da@RbJb0$5H( z)7%_XlF{b~j*KMikPQs~vOT7{J9(;vH zyV*t#UebtGJUFKHe)d4>1_k8F67gYij?`%^Wyb0^9_oh+4l*LrXrnwW_$ApJSJ90@ z)ajT3;!pt?89O0@MKgFSvPHPZ2#H4*x=b5fW*mM#M-hB`#f*XNVMZzez~O7nuL0_n z@2mwK0`Y;0;}HjTdVCn}LH2xQ)uYvQX8t7Qvhcy1+tnry9$?y?vSJ_(1S z=LIb`jI*3&qU295MTQ7-C6)(<6-QlBkjBdo7X1mubD*GuY4cm(R|L{Y_C!cX`ypKF zIt7z`Pwp)cDEml5q%H~^KN{Uhn2+BW{V*NMJ3f|CVYhTBQa(Who1r(CL(D~$+vqTN z2~RPm%6l+)n3QpCR_PM-sy;_b>1-4N|*IaOgvqBGcGvkD69iw;FvL16O`@G<_1z3nPa2j93$UpD=k6D+NdBw>%sh4 zkRVHaOUHXu-Z-&;)>te36G#YVVCHWLJ2b{!UfPU=nZjMZub9}@Oqp5}6A_P!nY{dR zgEo+vD_AC~+SQe38sFgiaKG2<4mNb6yl9YU9Z(u;smZ!D-)LlvhBk1*mU!TSlrcgb zDZbPVdo)3m70=F@)nSws3tm_^^vWkv7pBL+LfRsbpgeW)5Vd?)eX-SUg9CVdmY+)y z$3-(x*;L7&>!3es7p-b%G#z&n>8&GBscu!Lh8qqnq!BL2b$0PadVBgtKXc1pwG zvqc~6>w05$g-YZlrQ9xjWcVbaQzDG;3lKQWb~ek-unV+t)|s8U9^IWHK6*yZKnzv+ zw!ECtsIy9S|F7es4pS5?i`w*-Ha3D&Qm1uY`D*B5rhE;%nsp_j>1e#lA$H^WMkx@}ekLpQ{fNNDI@o&w*x6VoIz2gue|1FHOc;`@297fFnw2V}jP zLL|QZCm}rv$4P|x!5U#W<*ib%Aq!Bkcf(Z36wn6UKm zbTlFxWPZWi#M`;wHc~^|I_ACOvQ6k2k)qZJH=ufAERm2QYO{RZ)^CPDh-F^%+Q@3` zv*C%H$exxO>gJqN{`Yp+Lqo*&2{i+1JO%_E05`+qCR%2^mw`NlH?9Q48B@g_GF)Ke zOfylqTh94#US0TMRyc%%_JYq18IBQ;4yOm#yat`rOqwm31xjhnNC`o#lNX?XuW_b21#qV8nmWrcxCKU^_=Gm2YyWsu^)=siDh$GSOM zCWS(0Gh`Jh6sVCBA`CkX8OR9Ltz$;u-BJtuBe?P)Lo*m?EuWb9rgRyTgKftIk#8?Z zi=By!^72=(ns|zY^mAw4%fVt4(dew{jX7?XuWkFYd{Ssk>bbz0ax_r!nca-t6x-v+ zY#yChIyHL}51gv{NfbKKk|)_JpEu60LDO)GbDLD)6$+l*Rf7=O9rNu|6btv$746@a z8ZCvrQa&U3Xo8SYOUl263Hg_Eb&}*NIHiHatI|(B$$ch<&>R{YEniG;V3I48n$;oI zp^ zI?4i2x<6t$?bxO#rO`jKYTFM9XI9PPkckff`3Pvjp+ONN3|vCwVO0BmR(%gtcv%zL zuh{|urXpZU&Y1_o)JQN9wyK1fYmOi7a5!@fV0AjFyQ3-BsES?;XOIP)l^JRtIq=KB zq}FKpbpDQ&PoF3uhU#;!c3C1Y?#cJm0(skgjON1QiIgF^*`QzgNq+Ro%cM_FbLKOj|JVKsnckhT_2Cwx2i?5`j{|vg0v5pOVV{FYDKzL zs|KP|pwn7PZNxGCR<%_=kET>lpyt8ES7P;prz2}S8{Z9M%ov!92o<3PumuDiXQ$%m zww7(dt(>T&&?`d09}{+)E`&ZnO{^k=0gW`xdPdeL8lgRuK%EZ4dH?sxoou-VX% zrr0VC+bEoGk>E-lXI`3v>+M)g#>O6;=785cH_d^H&L^}_m}htATNqHm<)_ISjHa?8 zeQ?M>=`F2lC80QVQW%*V!e7r5lcR&GWxU%{A$}h6PM6xDkXeIyD>nz>*s*;h-H;rt zVpbZXVlgJJ!e1*u@@<$9Rd^_kgXzA$$~FL0n3SM zR}}5Q9G!LXt3FuU*}%_s3oPwhU%&d|xb&=1{rF>Ve%**ZkB`O7p%36MiV{5L%e}iU zc}p9AzzF04zDBrUyODttIj0>}E5T8-x{lhZS;8-nbujM&TBv8L!&GzY1G;WRqBNP+ zVxoYegcQXH<+VC&V|9v=$l%%acq#FsNcT?Fd^V+<82t`L5(~w*QQh;gOD=9hj@386 ze)W4tHW&f-t?zyGEq)Uv8{+bbPXLxN=?MP&?{9Ca?!EmottR1P$k+Q8>kT;LySmwL zB$})ays20Uiac&0X$>%BQ(lAIFITf;PeRBz2B}c1&ps9vOsRak z$?*|)9i<)1R}uMkGHvp3;%~8SyV<$}xnnX#itz4flp@!iW#cTEZbB ztB7;vwVrOYaY#=HUF+Mk7TE@)UPmTAwJbR|cOnKmEF#IAy=bJvn#L7*`h08NSnG>v zASA_*%br;#KZX~4G3({G@_@ZrzL(Jj(WSFOiCK55D^SL_G&JnFR))4FMM)ZNd0xSl zT45I~Fl3_2K^czv$7s>ktIa+H%PU_2>q@|~2H^zq4zptM^p^T5qWvbn@@SjzbIko3 zKlfRKCCukT)-*oiC-1k%=i&MFe9~5a#9`SEAN~9hYZ|xtjIi`8^8OO6nyM?)%%HTVMh7$a-~WIElFLrJ%O$9}eemJJX+WB`$@(3%PD zn6qHvlVZ?hQ;DT88SRuO_Q2r;p#-*0Uk)AT+`aG2t9JRUF1OIwbB*1O%0WhNFM1Wd z#g2Dk2=<14Ixs>>refSxfI{hS*FPY@z_0tP{_8Gb-X}>jv?cFzcw9YcA*c!%%J((7 zrnn}GqbCbW51^RzJP=@(uMFLd+(T(p?!JX#8ez$Vsie`xfzv)I>V-dezqHCJ)5I`qUaXQ?X zixlJLLQGg!1aB{cwa~C8Ba49$K70fycGVdh%vzKfS=_=zVP>oRdT86zx^cZ|(t3Rf zkpJ)xpoKupJ+#$`Ga*zUVjS4)O;S3Gt9wn$NuM|mN4bG*fs)F*3g?ADEG&=fEn-Fp zp6D({axEsWAQG1?@0sh^q+VndhVxb?|GIWh^gu3=g_N!Ol|%~m@hFK7AfRY}5r zAmsN#ZlybN?=Bqpuxt$=!q4W@%?jlw9dVFbciBec{`cH_*L7zX) z2^}quUDz zhQ0X2`uM$~OAH(KxT|6+5_y?>5yk-iW{kax-UNCv!k=klI@>|798=(_*kE$G)4hC$ z3oU-HhIx|rUohv5-kZZABBq4}9kVhA4)40WOHl%n_5d_qtl+YM1JY%d2`C6q;Od0Z zb3J%oWA}DN2dx1{xjh#4u1I`2QQiRGnka8EP^V&0inJPjLXA}Z zgAa@a7V3+Z<84T_$o#vl5zy^zcl z+YQToO+SLC+ttJoaDxeNLg==+-B4xVIM&_0Z%`uaP|idx5?QbhM|1`pHR{81jMs@} z3N6cXOq7VBVGEeYZ*=9YZ4M4*)dZZ6Yh@*+WrW=N$*h#&@1Haq9li0IgpL+4n{(uw zkHlWA>d-ere{+_?8fH1JLaaVR{~hA6LKib+&B^_6Ub1t8)1WaxQ_&@cYY|>0TFuuO7=0-&;=X0YOFf^2t3G-L&Ck`3$T15 ze##SI-xIjz=Cf_hG)KtNRj@|;XtM_@Bm}IZdu^o+yWfBUY`|Yu{TTQ=IB3grk)deG z$3%c#P;dDmR2G_2Ht>fni}Hi2nD(NY%=sjMy5MUzU`zqXKgXS_w=oU48g#DUPdW*e z?8-B_h|wR+>M*q)KTou+RmmyBgpNv$#`h)OCGJD>2Y&J$nUHkUm6S+>T_?Z$^xiO` zO}OivQVFlF^Ey#p5cv(sI7&M%umM}-zcpyNG<8UcAnYa4Y`?U1O{crr`0%raeCF%(}8wf>*itLZCKcTU2I^D3Vh^^Pa zZe+!frc&^c*yEpml&pexL2sbh<2v^gb4EfYGE1gf9ZMcxUe*#_5!G@}p$bZxTU9W0 zo-x=th|Q`c-DPYb$)&^k+2&-u{c4;|)i&BbL3Z5+@GbcSf=Iar^(u;`HVm}q(;&MK zX!``JNK|ByAL$YYcS{^|9my^HQN9XeEWRA&RL9qFmDUzo77?oKE(}UZ0uXkG59VeXxll(mE-T;A?#Gn} zC@C!|ur_LV_T7oRn z?GV+OYe+_lgl}-wGIW4CQ2wAu(Hc@hFj=-uwNNt`i3B)hB2EdB#T8B}Qd5_2#p-J) zo>TsH*GxRUO7Qk$N^v+9H^Mz@BSjd4xk~K7v+RJ39YDm&j!>do)qCWpy8eKR8ObP< zV1~SIguH&4OPBl6W`COGg9PgT2EWC^?sRuLeLG?K<-JUg#CxM97K;wt7Izd0s12|5 z=NHb(t55$j+<#8?05Lo!!#0|qFHJ07Woqg@U=lAV#)+%c2noc@A%r3W=?xND1vNKuK^wiGtT zD4)e*E1U`U$8}Oh)^2)xD5(vY&=h%RXmo-k(1Fj6#^nS$7;PTn(F+~(3}5FGqVA4XOsSjIsSR=H(E=V+kRD)&_nO0X{%HPSd(7gx(}Omc-*Lt>m|s}o zx-$k-%&caAvAjQhNU@Dx;&vRE^)!(1sO(^uJYbQ4%08TYQS}d6tUoh8j(7myHMysvPyuZ@YN@1;{t2k=;gi(Sgq?OhvFKqz| zRK@0d#jydrtxCWG^1_{YK~dh`=u?k`%wld$yB;Du)$m>zKK(C7M12bjzgCLLLD z-y5-z8UymIadas@fncXBf(G-2EYNv(f4irQtRz6>e0b`COX1S0{)~smg7h>Y$;*DL zQ*%aof4H+4Uqgrs54anOZ+@~tH7C0}4~1(azQhD{RyU4w!TS(yL^nQEiXIp9lju9{ zFv9cE?DU6~q0cUc6s*m8oGS-Ix}1V~WtJbx=F|P}Id~>VQgOb-}!jA${532pB?D+IV8T zyKyYYAFa-NsT2ec&Eb8)LtnLu2k7a}Lg@PN^8>QukC@ySh+fy`114}-c6?{wK{wSk zvoZ{q`@Xeq4s`=95Bn0P(i*PUMThAw8Zll`Nq8fnwodf>_6JQHYz{OYUwL#ZdfIzp z(C|?KyS0?yr}0+8u-`B}%Uk9z%wnU-fZx4toDZA8JtoLna*O*_TUc#$`3 z@nv?l`y?7@E0<>Vm8Z61O5gMtI6l~q+qzolX54k0z~+zzTxxk2w^4ah!IWYnf}56l<_A_u3%B4n;G0#~|C%9BV5e{YiZs9R$Y}{+^b~ovHMeXvxw`Q)$V1W#gWr=0}MU&#CAvTxcYFd_NT?T^Ql9Qu*jo(UqIpl?UZOMeWuW6A1KDoWx-zJxe4 z0@0FV1S$`%Lpz8woZebI{XMMjoedhM;jBR(#H|t#k$yJRZ$gfArQ*~`n*)+b=aKmz z^$O^gYgLBkqBY&;#!zu%;1FE$n>+%=X1=!LaEmQGvp5Z~C>8~g(>k$|#dWxY;--(K z46?tps(qNk`%&l@3l`GWdtZJ&XE;%w?pjrkH>wZa$r+D3>D@A4PH!V!caQb{x86+o zln9b&Rnv2Yk=ZN@?l5pkEDTiOpLBI1A!E#V6*b+M^Q}(v#dj!GwrT@XWGXt3popye z+dk-^r$~DpDl>CQ2X5tZJ4nfG2!q#kAbY(K)i{R?6SV=hlRs}WJ0f>-#r@Ms0eHofl1j_x(8EAbJai~wfs=~lsz=~%$CY-x zJ{%_lHqBz#f?fq)1Q&}<(02Li_THT(KsU%ymn0k%b9SSeh8sqZ_CV9K)mR~G8t3Xa zn`XSOkF(wVCQWBZdg`8w89+x@!i;NEY_XuHT`ho5S|&vH+w{w?YJB;M-4R6E%`ZZc zFl7&`Gh!JCvxY_(g+8TPfi9SZ&LV|AV_YR}L`C&TPu;N+xjvT(m3Gk|KwFig2wYBR z**yK*7Ke74)GB_(aA@$g-U&&DxuwaR!r=(AtIoY}PM2K)>VaXXx`x6>cb*7en%;Ho zYQrQxqhx)o=PNh2pd3tfxO9i{Ra@q@*xkKFxI>zEP+#T8ND6r`bK~A}$}ja$-yzg2 zc_PW*rGmHVTGjH2o+dhO!i3i1j_d-)3iE;7p3F{2wf&`mE;TQT0q3#`aXLBa3pb|4 zuIP*nFnwVracKmXV9u!l$5F+FMHrC4+%4}DgL*7HH7mEaY&2A^Eh-B?<~YwtwS^V8 z!L)ALywQ5^A-u#hw+fo??M0D05R5l6`7nToEblE3!x$;ss3!%5!iF@1FO^4GA?bte zutT5A`+M1dN`%~gw99s!)~wL-J*;--73aZuSpKPMZ?B2!^Mw3KD>r0aE-&1eY=(CA zE7FVg^#TwGSgZ{@BzP^JfUNrvI@qJToRC5$q`L>)7^-w`K*OHhJ!H(pn9VWf{&=EU zu`2L1D-yU;l*1Y};>Izom_e?nIN{Ka)3D5OUa+*Sg{sBkmk;lz0I=}1P4!Qbw1lP5 zobl{q1T#-E_@+)O__pJQk^e3*@ZSX(sO)L)85oVnfr}UJRH%dF3=9?pph6X%MLI_; zJfPqz{f9*B50n%+G;3S)k9{7ngcn3Jn?g)~%vK#h?0vT_ZVapfAppPG5VhcgAlN!m zyltN};}ryZ=#+P(iCPEYhCY@#Aim5AACn=ly{tVdgJ;D*KfE9-A)8%@{q?c*pkCtpvfk3h+V0*^7cc4v0G4?585TRZnn2C&FJOD5JU{O* z?Jn*59l5tLTs*u-tZI$W%Sd%SX46QuongMYnP{6=Z7p2y5b786W>BO;`&4sY+PTUlO#L2!hB|DrCi_J7hQe`aA@+luhsO0#91@^2NzJW7U>n?=IFFZ z2WK;{-b#d2>TZL<)9 zCWtagWFmGX4HYJqCSRT27`oH-#9$W-fEc&{A_bmubb*=DMgT; z80|J(0fAk%;51^`u-!9|3I2ev%WGC}vp-htdvrgpBJyYK;j`yWrmpI`?C}$Qj*PO! z%SjK0ktTq7D^NS#@dY-}c>_1)qP(8rVK$J@fd<)3IAv6qDc2+xU)k|w+aOG?`Uuo^ zG1La3e56R_F`>BI!~`FY-88s(6_bvMVx-)zs3J-eJ+x`RNiN(a0WI(_T|~+(sxH_0 zBo9^b-e^F?p_GLYu>k~Gpj^A^YPBHpUt^EQD=H+$&n9nHUTiFldZ;=w?4>OK3vt^m z2`^;zS8>`#R}!e1 z4De9E)(~MF-37W8Su0X3G#i)%{API(7Bn(u3;R28_+nq0DGi z7h-nMdbr&VrX$cCKqgKV>#(RkFdv-V0KIbXhHwN}+p~lFKZpzO4gscDkB(yc!N)<} zhT#`bL>Cf3c!7C0$Hj8G$!ItMNF{D631%X>BoR=pMg=wYt~nE|HL=4WoJe|Ijg=uC zaD4nFb$=h)e^pC|*8gNQuBSCY5d%6A%mKGtdBWy1DJy*+>5wC|Zj-+oXiJ`(5lAS|;$#PxH-jkd&4qLbet zO_wB}YDiNEU&c|sfml}W1*wBFLXW6VGYRcfci$kc-|eW~H?)JPjfwvv5I7b)lmzd{ z2{5Z##LdkUTOeB*(`^{hAVUX79vqrrRZMwCC@tCk5}6Ns%7=EB$aQ+oLBg_(tW}Y8 z53G=FniaW^I6SGhgl?KC;AS6cdGS_|^ojgPN=&uTIF5bnmiI#)XZU)u)^8AaO~@$G zs1Wk?Rb~!+G~_x~k|+3~a@CAQivuZ`*ex2tge>lO05iLh?I89m=a|`wfWO-tQh;C& zmVT0VG_#w$Lx}9-2yB0}yQ2HhG?o665za|gS}H;CZrBMFoYV&~!|^t2bR>*6PpMvp zk#az0@C*|vmUjzy?u8Pe_ael3v%6=~_pWfr$cMN3iTvHFA^XM{?^eevn!89cg(1qs z$Lfu@c{5kTrsg8p^YzVYML-i+R?$prEp>cN-QhMnygfSHHs~-X-q>>izYPb!wIA;2 zV$`4~bR8ypAe3FpJJn^WR(dShYNd_>K~V1jWa9M=Q0GYZ$|7w2?B(?ztQ>84QF+=h2ysDaSO(B}^<2-G zXdV<{9t<`72MLw1DiXVbh|{q*M?!m}n3(G98I+CDI}~?g6((9(oa)X!)?vC$SvxLF zHf)~3HNr;#a-mV=0Y|FoerE&EpR&6#8<3sz(Eyu{lM#ccBDukNFzwG)bujIC-!&S- z5okbeJ6gJSd4v!j$g+V3`=G&&rR6G*a>debc=#YJ2jrAOfaF}Qw!SoZKj=BD-v2t5 z)X97?59dGddDkz|l@6^R?8j%`-3!k(4cap7vX>3{$UGH-$u?jKKfxY$xJN=Zz8BIU zF&dO+Hm-2h;{DilVNqRhZ;p$hmsR!tGg;pzIZ$5R{j#tc==Nc1PU#5eRQ47y zO-L8B7I-dH-7W2l^oq2X!BzvOOWkq6_$Kw3)LLlt@ev0i(RsC1iA3=T=!yM>wXzB! zU@Pk5C5H_w=66`l1i+e{5oaotj_;=?f-3K6KOcyWIFFRVf!vl-1oD-63K$8E{zm*X zUEDbc1>7s3>=zAOMu=m!SR(-ui-5jr$E_^X11mfuC~FmPvg|SfA8zIa>NfNXnwZw4 zY%_JZz2&9U!10ZT3w<3gF8y#y4jd+jH3c}_HGrw34VZcnAbX5&sg)tLO~m&%r{#|=p@`@UGwoRs&tF0ufZGf zzQM^kw-8S4i7HO6*{+A`V$?)#jX80HP}pEiXj}BbjdS4?5GcCg<3YTnK7OdRJ6y<~ zu&n6}%MoKnvgZS`*9!7A-=TSkg@|_-9ax6qi?w>R#2fSE-eJQhU@lD+mDI6Vpq%z_ zVX5g>cU_yq9sG;`@Bp04?X+LrsS3A+NvLpgb;YIO^z^j1TYx<)vt>Z>y?$SD*q{O+ z=<((cGsX)w=qJPgltb;HNiy>@|A zCZypq(XBqn{AORxdT)<$k7KVN0kUWa&QR^Ts7{l#Gqtt#PTL~l&bHWeFiB%DZuqbm zZC7W*$3$Q)O(xkK3=TjqsD<-e*%7Uz>M$id+{rl`*-GHUSudlVtlBe-RS|matV?~^ zxFqj@km9d|;GMoSGJwHX9fL%iJOChf!DUGm%z=6X@Lj8bPpn?ALD%`P7nS+J5M&P` zm$7b7Lz%rvglta;sd-S15H}ZUYC^+-o}R!dmEgYNA?U-TNFl`__>%Q#CZ>Y#<&Oz1 z<+xBx`Ze`r5|86#?ug0U7X9s}54n$^o1|U>P_)08+yTYY=78cMb!GniVX}{b1VD3e zbzlub)&Z8!B@WuMfdIcri+(sU2zGbtTm{ln%ALp9^y9!LSUKD9{gTS__)vv}$8*eLkO~3bn8=PfyyfzloU!FCJs#P7SIz z+|;EKU*Uvm5V=o5Ks?TV z4;s$>=1!aHQH0rMG1%%y2ln#DTK~?ne@ z{uOS0Lsb(Jiouq4DA#Qg%vLY?jsa{qG_QOo;y`6(VRheKhBIc>Ykb5)MWurE2On91 z+E=>UVuTt`($2QfU34@g7do>xDJbwr5z?R6~10vX+cLt2l^p>x4I|#`h)Pq)#5RshDUVGcLo!u%l#@etgYcO6 z+DN07uCpaa4aqaqpyMX0B9KhGtXM9csjeapx0yGa?&OScJ37a^L%wyA0%I`~N~O7( z|CiG5itxvgY8nY(;7f08U5>zED;RQ9Wxt^?-GaZ8F3H|Z--Ynmf>R}oCQFh(j}ctX zO$9#d7TX!m9eKJV%(^Lc)=2dlU@fu+hl#86Z?d;DSf>D3Z_V1NDF?IaKo4c`Esrh3 z+mM)fi~yLUjl799%~H`x{omxSuWpQ8f?A@-BDjY92wp}uUKfPIEue8hI#c(%I3~<7hEbLt{834VNUB=po8pqG zLfKAt0_i836{jwwQmk*6s0wuU@{BrK^V6>8*b4 zSsc=5%R}8MK*pLB++zby5WLR4_Z2ftji+i>fP~F3-d6c}S61CxjSOy6%U(+!_UO{+ zo$+;soW=jnFq*72_`U1ngq3A{2!LtC<;`U4@88g z{ZUxL-Qa-)Q(?+SEoYfp&I;wEl6T)jISMIRBF*H{8Pkx~JtaAi zoHiU|4~FIAvWd0RJh;&;zd$SaVNDR=i-sq`V_~r+L0W)selTzBlg?sn8Q<8SWK6#9 zle+n|-tsOV*M^K=Cd=3gv4MC3r0B*6Boo90xIUZdb9kCPOf}y_*?4v%a5wjPv6nU_8c)O};Qzol>$7ae8HT!#S>|@0o2?=qO)~*7wX}GB8 z8lVr%OVYA08L+9X^vcq|T+)2Uss0HtOz;qCd_js5sZp$?9A$PC1a?-}GI_aNzK)a$b$_=3EXh z(R`Ha7v%?=)!{H#8m|t=4bIPH(qk;_>23^-EP^k&6zbyCvho=T8-!H1AWSJ>A z5@kK+1z_r)c)BMngP4y&k9M%s9IyhxqNsRdjisCz!nu?=o||$$8PAP?PuyU3W8Uu` zQrtHtnpdl!aU(VxQ>II0&e|yktEfKN)PyQf#>fk{;<4HwzT)wWCH30ZQ}nNS@eql8E8UV#U4S>j`EZOk}g`uiE*SQqIThXdo# zQw`f#_1!TtLNLi=)eWx;&5r7h#y?(H4mMY_+g+X=VLe58R^-}dHuq!PhZK-}-0@rR zi2&_h!J z|5g6W{1^Gp^ZW9j(qEeq(+^{z;yHBELTWc>b~cx_o>7ANjxMAI(3Ke>ne8 z{z2Yen|~nxV*dX8efc%{d-M0?SLfUEck|b0@5-;@zbo^1=I_YgUjMo(zaqape_MW8 z{?`00`K9@r^R4-t@;Byh$X}noE`M$Q8sNW^n^9iH^*@*7ugEVZFWJlUE&O{~eqsL7 z{DS-?`T6;I`MLQy`HS-xHqt0p7uG${MRS^)l>iS z_~W1QeY`v=urng@(~BD+W(LDTlw%mdf4$9F~1C@4RC8@M0fwNP>qK`;g;1lNa#}acy|HTZtI|aN}{qBWR;)!yFS` z`pWB>(6l1w2h}`i$#42WUdrmCu+64SZPYlIQ@X=#lrLt6{2O1(v!~&lMU7qAcxF%b z*hVB+GG(eyJLVL^vcUp$pB#aK^&>p;ZT63N9vih4JIt0eB}6>Xk%-2}pfoV&?FvvN z@|dCWxPef8GQsmZ%Oe&jnSg7ot%w>y`iO_8MQ(yRyt7;2?|;3Dm|hLuKDC>o>)4^f z^`4CIxFQgkF}d79ODIH@rEdgUTv5;W6Olvprfteh=9v3!_qwLokh|2hT%XQ)TM59EnC*oB`{dKIRqC%m+fsS+8|1Y#dqd3jmy&GdoiZ&0dX*ZL`a={hZj>;ruW=sT#FM@&P{AreCYm z2hknAJ1u=Ym*}zb@chrxFWiUm61S4>OBD6cRihPrQa)3YQ`Z$%K|$~d$}Oib9x zX{3*fk%~P>WCUgGhB?~U5~$OIaa6|fMNUYkszche8hJXdY-@MY1}D!*S>9UJPtiCe z!xRF6{jOIXngO`!*pp|y{ED-%cj{N_bS`53HLB5#Vm)XIXHw}gmOaov-Gzc6^d@C?dwM2-vzA)-yO`xilUu<<=8ozBL{k|Z6(^vibCI05u=*D=&pH;g20a$^ifQ zR_8^&sn?fJc@|ZpNO@M?IXl{pZqACYQ?3Pzitr4aW}P#A!4va;##-Wdd~io8wtC%00c-OO3`wD5|#F^}I1)W`{%)w^$XsQ9=xM5C-PQ+;U= z;8bkQl)u1G-gjO1+{;1UzL%%;P&^3dK;y}9FM{i4s*#P=w#UX8^4O&cY;iR;t5BAP zBc!(nx0p@N>X&Hgp{=&uo5yFIWTza3L$t(P+yiT`#?{{}9Pb+~vSlk>)X8l@C41qLu6{;)FkJuHh z8AS}v_$?_{3Y+w2769!qj^ZNL(dhY z%xvrc(w`vB6&Xn+h{gl;EEV%yW9izS*P(g9a%4|x54w8E5rE|=O?&cf<1yUJXa=`0#m>knLdOk9iohUePm0wfqd{I8FhoX^*ZV-y`Oue zhjS!Gz^)FoTK(W|J=ohB-Uj*s8nX^3oB#?w#$;2D0{Iwzx*DJ{3WnE?=0pcgIG2|; z0zYX&Q6AVzF^njG#~tT zJm6i~AtwpFH)&t=$X5d^wH(SiKdIj*ZfYS)hA0x4AIIB6<;#gF^Rnwm_*_wc#>n{H zOuqr4+!5UKM^QPL`mpkDg{v=RN}#zKyQ~3OWz|=C6R(jawpL;XI1tC6ypb-fT$G=S zDKt^1L^1Del#V&B%lucAVVVc^2PNnuwQ^6CsE2DGlnC)SC^_u!`*nYHTMsNZZ1H<@ za0T!ZohLs6u7t;x8xL0g?naV9oUM=;S?9a7kwA`aViL=rw-Y_58J!-|WQM6JDt1FV zBPs7gAZ4BJ_)-ilrq3 znsU|7tn;n-1(eOsH~E?{QvQrXbUS^+7?E?e9X9LnXI5S~k!M*wa2erAS_HAS8&M?B zZgjq3L*-9VZ8>#~ZQuENY8fIA97E~Nsa;ejLYgjbFHSsvi<2K4GrcK8rPP* z{2Dmsbyk0&U)0L1d`|kEC<~BgY;L=eA=lHI;TNzg8g3GVVujFy0&Oa#(Fl9g$&Nrl z+`IFiHMr<~|K0ASW5}6bzvc^C=q(DpB__N&)Vb@o+0ix)=3=-lbkHPH<=Q5CZTb$( z_mWTF)bD$D7uhW#vnc?I=&vx2`U`zRT{H1e%UCSPt!1_!O%@NS5PdM-U5wJw2Mb~% zB`braV(lo%XaS~BZx|EdYYG>F=>`Tf%wOpk8pST|AF9sBvC9@61Kki@H$tAs>$o7Y zWoPBhvW11DnEOeXW2YvL#rg8XvOR!sT;NPjfaH#SN6bP@Tn&ej7)>80^AVLXqD8Lt z6T;o*=jc$~;k>Ph@UHPGlITi5sda^)#Fo6Z{@kiyyaNMlq}qy9V|zhtL7VB=ou9OQ zfuFQ;uAj7Wwx6^zYwdU5YVFxn+cUs<`2mpN_^MC81SOB*5(ursx(H1m>^0a0y)44C z$D-!Q0D(h`SdYhazA7=G*r!D@R?D?M2ZK2GO?NEHnkI-4%~U!lf|Km7QXvX_qoP?rAI;%g0RA8sB+pa*4Fe-)5;z2U~Esvf;xB`n7wm{?MbCSZq{!jT;*pElhhfWhAqs`Tf`U1cv zcp?tTKpZLJ(9IS`Lc|>b28O7QF$bNmfS+1k_7)7VzSkVq7t~lU)qBVkStC+4+(pQd z$5=`D$RS?6aGuI40DE@U?W@jXy|e~hAoJ_JlPyj{Wgodj@$^SC^Y~ZN=NFH!zg2TZr9_?{#A0cC7G{aZ<@Q8qwmBXD0B0Q#ufh>R=mbsFRBRtX#ZUtoFppq> zQZi?b9QusQI*l8+JwuP-;?W8CF{j<*o15rDa3prZIGr*-<44A6zJgy9A<*fi+l_mA zmw3n#&!wIR2%6?wm?NKv{qYI*yyG(BB@m`#7&iKl2pF!)XKF6Yfq+Gj)8-cXvj;&U|+#_v}qT<#N=$5HT$6+hS=qH{xIfcy{mj zd!veiHVDmaWX^*pPEUS0nIC-&cWzp?;I6#?0Fg>O^Wr2Dm6^ep2nE$4#6iCBB_fQe z9CDY-+eyu9lrZKIQ^O*oj|l?0y&))*bY1Pu>Ng&sgk=jXHMPQ;)f<00dh7>vmWQ|G(9nVFF{@;>Qu%`F7i1=TKlT}?S5+7}y~z8> zJdxgiudb7mYyEw;nEVPaHRhAi#Abg8o9N>`huH+;K*;UHr-&goQY$?D>z$!i^=%{-4@_ne zX*pX$9WKPqFijawor1eJ;*1`<)0QAsKY8apRZqNZI%kBW<<1SYg92{IEHN`Bqnn!s zkU(ff<`iqWV|H_CGsu%30_c0|!R>;5Rabvq;0c0)$#%X>k%8zM7{dJpbE36%7(7v2(@y+fY=#+L)PSs*9$omV4+)(E;b0*y7Bd*Mtog}#Q2eS5(ytdXQyy| zWoHO`;2LOt135VwVQ8Z!HIJ@UvLMy{t4M7U;$x@A&ONVjWII7(YC+A`d9J0?LQb~W zKqx$Fo!p+y1^|=9RIqFq$jS!U9^he4rkP$H?WsB&NRygW%s5HjA!pgm_@ICuCC7A> z`q@c7j)?UKLn230yu8s*=*Ad&Kes#7pA#yaPKG1rqS!UQMhtHAlj>L2pI6kMkw1m% zTdjT-XA)34V+L6pcfK4o5H`Vx25!Sw*VSI(C)KuC?UwgjZA(;xO0=7zue0kyvwkuj zt_+Ij_xZ{1d;O#l&T2QScR}D#4>&edMz6<^t*fFDFpQKLt#>%Cb}_()pmcXxz^iyl zGJO%^T^(07fj}QQ?*i-tR9X^cpv>M%^V;R%sDQF|wL4$(k?r~8mIu85VViB#!Fzsu zA%5(|8IU*GkK!C#?T^g3XYPt z$>k-W;*AI1GC7q<6yEV{|i4cnZFflpL1a5 zdTDmjff1D5X6Li<^w5p5#!bcHFqyBH0fAx;wvGfGqU^9N@7xqsx>Sku1x(HH!?K@I z@5E1)cRmxPupM1v;Aeoo+EP*U$X5DeakEBbZRK#n(6@j`gUhl?l>a|h4ba2xqQiN+e z!Pi(d!2sxz-lpOWId?H_bz*#KUZ0}#`YdQ75)ahWVdugU+5`K?cF8qj6b`@U4sXht z4;9C2c87|iX+Sk5R16%bZo{eKG~(Cj@&Q;Y_+WZQ`QQq86aYyvB(gBOaj%n8Nh z9rc)QU`*VI^htTehR!GB*KMCjzdjM;odR;*_mBjGG4%!oua8$Te)$3Htn=}@bj*_{ zt!n&80`fxr~T)rgL<7i~Yx-7-TctG)$4jJ?omX zE0*DPI&?c9@#nDIhvOx)5a;BW!Z;|$d^k%iuH@8YOQTV(jAvtfOP;+B-@;Es+Mk%z zC5h9GD!Bc}`+J$#kar7MAB}3QqMmQCn+xRI8;oQPV{Rwwh25hma#^AMO|6IgOum=4 zr?_Ya%ZVghyjmjr%xRqc9Ss_Ov%lyUZ?EW}cTcG`64>7CPI(oLdl^wEm~KFjjDNg! zY*%59s?}qNcncH>i&F<_M2a(Tj0%cIr|M!#ptN(1MDz#?Pgw%z`jvw0XpMM1%`QK= zp5|UZxt``eWSHuqkp0SMoQIyZj)OQXyMV9N4R`bM6+T3>-AVfAHH}xtFLho8L;<5#v=njZ7ppR90)V_-S+ae*df4{RqL|=jWLDAzWxM@}L9lt-y%mcs?0!T zqv8>~zb@SjHLT8gZk!S!<2=uuWZc{~s3Yr-g9{*3EhXkSxhL9e7jo4!|IkWQ&|1s8 z3y9~0TP)BHq8=WM3G_p`tYznJlW}(*w)uSTu~@Qh8n+hin+E1D%RS>GD7M6##N^`B z*&V$yE`fn;aPsi4kwzV3JA!1S81dbXIZ30vWy6^YcBvzUrol9V+ zNC~=upTZOFi;!e2{_=|~-Fp2y?bxULHSnWn9T^Z8z|_AyYcUWXa-SsoAR*Zir~7SE z>5s0BC<(<%y_A)6pFDy0(?ieR#706{5l4zgyfuscGR3JT48SDxT7=HW(Tz3`F}=6#i0}#f=Wp+1io}EJa08qJlMm+xussO{vkIA z4nd^>$EZ2TfTQqcXNx5;#}0xSkYB&$@#fh774WPNmt|Jk+QDF`JTqtV;`>xNGx)l! z{5QUaB^}D945fkg*+u&-FavD|)rNZd3@EH=?(Qm0)L%#AY23Pkb>_=XIRpQIn|qX#}zZiP^3@lKgPDgs^ zlUFv(Z;RE3XIW$%o^4iNzAJ2&So9E~c3H$;K{Xg}AI0a+S{}d3Z8i2G|;wyoe$wYL~ho^k02G zOgN8_o`5Jkhb0$CkU`G}BN%N5E&f_`Xy#=x#~YAp>T^K13@t;t))+;ng;fU3q4E<2 zu8Kzig8f~t7)Y!F)*>J6@~T$ngEXRr6slx*V=O&XrOyy78 z=l#E}PP}Y~#-;7=_wYNGc{?p{XmfY_iRGW{ClqY4 z&7V%mfyW8h3{_%pj}V)XA=}Yvs~sUPJX~5EI#B~-yUFEac0Mq8a9`~pQjE3xTZ&qW&E5x|_CJs+}eM1V+a(!^TXdqFFOqY30K2&bP!uKXA2F)03Ye#Vp+9Zp^B$S>_wOddVMvHvQV+fQZWYbn ztyJTpZh=-7eAm#XU zo0@*wfr>t~iQy824af~jLZ~F441WsTLX{#Uq>sw0n;qNd!5kb<8~h9dru<)>x79Q!b57vgzmgQ!NoWTn14OEfqD+-{VVTK=#7y<5 zz|HP`jnd0t`0FR%s+HE{au|_lL1*Kw17!WKHfp_Mx0c@W+gf@{w8SXbOGYKy9g?|L zI+sQ{-1u-1yu_i-reU}W$~z6J7QJRCyq&8$-pR=Zgi(?imE78@LS~lwKd<}CdVargIkq4 z8y=5Ef`P&Q_hr5@oxlbdDV>6;)qeN|kJ4xgQj3*0QNBZVJXXFNCum@b@2n_9_3*t$ zvH=f+eX%T(`UH}OOIjSWq{Vyii1m|ime>+kW~B_K&z16KrYBska|<7c6Q2s#8nvX6 z1A|6}#gX649Xd0TKP-ZeQ`hZeLO3CA@n?UdMo&8&iNZ!P~R5 zrvhHqxj4$zv^=1id6Z$9i{_V^d-vra?w9jYdW!|iXA-&_m63ymd-Xv6B-RPBBg$R$ zt}jk3BvMQWB8&`4A^y%io0R^6!stR`9W9^M;g&QtoKTt2=F=MEd_jPb9y_mTx@yJc z(`-D3zoK(tDh6!f^y5>ntr}tSTC-xAkXRH{QvVoeH+LuqW0}2l*v3GiW06=eP+$uW z>h=PG<~?r&5dx}N!%K#3g*%c$;S1+8;Hw*}kqQX)FwT$m(o&{u;2iJ4Ail2w>$1-*@$q~D?XV_-wGx9oLaO8*9uAZP{k47BC7gd;woZZ za(O9ICWVEgmpfhfRYuU!BQ6}X6DhHNQYD{h?V&FyG)DX52WEMHUvFGtMLv>)fQEv! z4(AIDv9Xq7Ar>D?r;XFG(cSk9`+VPZ2fjd_iMe8~X?%^m&E2zkf1}Da;7s76vb$Ro z{e9PQB|>|1cVEqf*E3UBK4mj!toObAI@jSN=!vA5&byro-5q8s(Bk&1$E(;l`eqyY z@>U4M>u&*cShiK}B(zXxLi5?Mo`M`w4g$6xz8Z)eJde%v!`{P5z^w*Y@tiWcvO9X^ zy8Okb0dC{P<@*6saqgLhZlRtQkpb=vOj7wu%ltFjv#Z|*B>usH4ket^M z;_31X2WP(MxOH9q+}VgyvVKf&hj^sdCmR^x;%4p*RKbKbW@;i^P_w%0&Wzt%RWP8r5UfFd5DP9l8x64pQ0pg& zK-%|m=eFQNQ3B`p?m&vkaNNQ)RiE4{d6`CNJ|Hiqj08sPJw1f!FY!yUNz(E19-~pg zdL7CBBC0&#T!Z>9NYL?pZqTn>{p{#Ii4eVh#jIc)P8l=({3O?X7Aq-Uo?5@VkJLB3 z(;=T0$8&k{QrKVp-kd%^$wR%ZEkKTx^G?pE_d$t6ac-PTI>}iz6iSik=)}6AyC2xm zGX`}BT@h;-UCH0iOwGh8j;F?Ibs)Dz2?zT^-pdvE6P(66vpx&ZBHrOsaK>imj8txS z?os+K>zw}JHeTQ(Ccf;P7BWQXcU80VZ$8$Jj=6&nqI3Cw-9M!9DGj*J|FI-)pFzQ- z5!WxD?@PFQqRcslU$Z-#wZqiXsTS58x2aSweMw@0Cj(xecp%aa&jFs;x6!do52Kou#|9T}Qc{cqNM>0#cC7`M(&7VrHBnab-6 zUjG_KjXRa@qIWiW+qG6EceD4j<_D6VDxYk1{yAWFNLLAGcVhrcVae;+yT7dGxN}k( zr&2PFb97@G=bUQviB@N$h@-ux_w`5=gO=0MB_sd5*MoT$kgzuX$=7P~gW7-_FHWpq z*rG5#%ilp}|CrvSlZ*dQ|A=us(;sKJ&i>wS;S%~gzwx%&`CGpwk?(LE#L)TU^v)yr z+uNOISh`j`>f!I^{dsVWr>FJ<2SWV6{XM!d&gGSEp8U*VD*0XbhFPp=cdSz>zaF?gm63y~;;L5o^$o{Fm9jG{b4MQ!x`b%HcwgfZ<&eQYb zeI96gN?kc9Fzhk>L$MZ+QcoUmj|c$Mo)3hg>2{uMy<~4dwMnbgwKS;u7r(peU({XJ zsw3^t{EpDQ;{;Y>0-*}~wAnETk51C6i{eC7(-)Uw4g89Av?417jY4OlvIUhq>l`;j6uC%#ZLsvG-*#zos->0xTa}VghA%#H>N0kjPl_&d~h6lj(PyD zRqX7!jKeerijMo z-^5*-#%nzz#rS(<_ONPpd&Z6I52ODBvIDsO*nX_O)$^7go(Bj~EoFnaz5swOL&=)Hq|d4#>EB!ccm~Ov~bV zpeW8$>yD!$>R8hIc7(d5W;XCX4KdqFp7X~=SCW;z={p@zN!=N2;Q^h^F)AmzZs*S( z!tVGRuwcc%jYQ}(Vo##4Wj+lkAaPNwOLCSQ%E?hkWLhlEbzn1bK6{!Ym_U8`F{s-q zgowwgUqPAdq92}(b=D2>TKO$@Le}~%7|~<>77g_L2FSWZT_66F8Ii?2XgKYgvL+|W zuNiO3Th?Ef(iZUhivD=Ka+e2>>R6!@0WWBzV=&MGW=z~Yi*bgBZglCd9aC!au%#_-x0d@uegw~618dyJlPnC zVVSQ6isWaVbAopxWGY!_s3)Awh+G*%w#6zPwC-{??*f4?LdBM#j2Yl1`))su5Gg%` z&r>;kJ0On4GI{6g-sKbi;Bg(8vH@`&SxJ|m)5|7=4#9)0?LdjMiOcn6;sF5Y zmgsjHa)C`xshQblYz7+k?hJpW9rS>)N0Dw|-Ha2gmWq%;DsUlF%~B`y2ctF0f&NU& zabZFtoj;Y3;Z|yMLD}=Bakd%rXr0Gc?Cva;gUbraK=I_u!1pxp`3$&ow8;Ck6_`5R zHc%2IHQvQiCqs&T0K4s`)qnd)=Wx3XlZVft7L7d6@0Nk8=57_ljx(fz0vGK^Y9=Hc-mw{>)Eulsrz%{ogJlU!z#N`)H^NOqmvCjgrw$_xg)o&4p(7g7 z!LlZZTA`EjEOm%nt zBLeGo);~060)~W>ApJD2&I8Aa9}VnLfKb1BvdS;FI|m6!Ol?FsrpcQZqe=uT4d`o- zCEQLg&QypX-CR}NC_>1`W0`|Gh9Fq9ep|FJ7%Aae7-4gVfFqp)t+>cy7l^dWO&qi< zfR7*(I=Y>6EnB#=4z3XqXt0auRW2}yKxF-LrY{1HRFCTjM82X-{ox42G@9L_4+)DM zL?8a>z`5YV+gZH7E!GG|KtvIoGI4So;c*88>?9;bm3v05h>f~9IIEj2!i`}xq!pBF zg`d&8!9)^AC->(Cy_KF7ixZ~%aW<;I@8uv7*PWU7Z;D zQCg*{qUwz2xhaxyNj3!lw&b#FzR`A*%c^A+G#I6|6F=YPPU?6Vb0ej+xk}n)xhqbu z6HJi;NRQ@nU@!KAW4LD7I}M9zOYSu~Q!WpP=tlS?64oUFi|`aCF{Hrf{SZ62h);ps zF6yoC2vCzvKO#qIaif4A-6)S$RlXF3BU8WNvX?s7K8F~}Cv`Yq5a7kgrJp4{fZ7x0 z5|O2MUut(2&l}y`(CJjdS`-xrq{YMCNeXv(YPXhv6c{uiNiF2{Ao~Hww!lrl(D2~9 zCF3wZNQg;_&5&Je(K=h+XQ(nperB`^?9yP8#Pr5-K@CEh*bP;nmE(a_6;<{Geq(1v zjr$Oj7iUN+621*lHSi!G$q@cqd3s~m9|$t=9HXK&W+&)}vukG+-f$BU8q8#(s@-36 zA1*p!^{%vTp_JnX$l$ZaP%;*xHLcGW?e8r$5v7LJgEG%fD#{Aj<%GQC4EHhvJN<{}tz5i~d2aEi{MkJN2MEx{fe)#`X1P_xZZOV4;6 zAqTpboLHOib+DRvT~OO)Y5r@}2O10I^bU^CT-9yyfA*NJI_$gCq9^Y6VGWyR9(h5AhXa||SA0`4iB!RiXWr>#3JE=_LWd0?dSB+ILViLja_xQ{u1XJ1&57=Zo%!*dT{;+ga5)|VGE zEI5E8Cl+ab>k{7fvvtIL+XN*u2zk_en)Aiyx&FGga~?H&@?Tza^X3e3Xmiy0@9%*IE1(V93LtG*M-KnA_pg3l+Z zT+EsPnoko!n;_X(lJ4cG3kkfG8M;fyZm&&7A~x$5)lVMHlHOn|z zl($0DDOq)w!=LQUI&23U?3^!aS(xpk=%h`I1%&z8Tm?fAVi<@Tn}7~C);KG=D>S@{ z@+j}5;->9%hboN=Po{M3RPBkLISA=e72FL>92B%-axW9BOrn2&6gg3Lv+lC$O)(^L z-JKx*n*nJLE->l0dz64_bTm@kM8Nc9`6_mh%{a}wdvZ&i+bE9$V|+vW#fcjX?pxFc zmv!@!F#h!NzWFav3G4U9|5KHXV9`xp@$z4}M7&Gn`z)NO+A{8i3NOjY(cVRO_P#ty zmt6cbxT&k3d$Gq8A{+e^WHc*wf09{YS@j&e3(IOy4mIaYFE7?IKfH|GjkY@1X5)a2 z7WE}I%I~nW-8Ju}Yak}xx-eg8!uVZy`o^d6ddNGvIc0Nb22PY$U*DdW?@eKO>w6a>={7fWJ!NCpf{7p!*3BJIZ<5*{<vqUQPK9|iP2Kd2g z03!zYJ~F?$1#sXhk)rV9>TlRippEAY#WL6Cw4(=8K{84x0!k&P#+c!SK4gRlgDIX* zMe30ed`T15`v@@r!y5gObywZ;(RW^c^VhcBlO0mGPpk#y-~@B!s;hqRqHm7?Ks}xy zZwQM*NOc=^fD_n~jz@}vc1CNeg8{-B5cNbcWzZ+DPwX-juQBlNT8QEP-@JKr6YtoP z7a7YIwX+^$=s98>awkGVkpj4nwA%6 zc8p$I<(VKSf>|Og^dzMbOJzHN(G;IgB&74Cm?q(>Uj8eFP~ML#WfA}b@&LHHFwU^u zU&wHnS71a2ASfxw#|uXf&lWKrVUvOa{^}m2=NaYOivEbbnqDM;xdZlB9a=uV4^bxV zBdeBm7X!$uO6?{xOYaAOi>v&U^@n9ENl5lWmd)(MAw`$(cks0&C%(fjzcdQHtCR#r zz+sl|#_DpFMiY#1;a{+VD6lgx-@uI>ki3*xogTp^Ox$6aJ2iX|Z|#SxWyxWg$Ed~* z%Q$Ke`|yewfMEpHL(5yBL&yM2NSJH7lN`ld&juFC@3ft*cr`Gj+N;*iFtlxxm8Wp3gwzF)Yrj?5d5N55U z#%knt+bXxXa1O{k;fgcukvYkK(Zw(=+g|#$s4BT>^MH)2zfa!mRpHaHUoKT^0(=8K zqK&>x7L-Qy!dZ4???3CbC+fj=r7+bl8W<`}eG*J?YBU|ir@1NK*S$6D&Cbv{xC?jL z$w(&bX?Xw1oB29=O8ny6vQsv1M&0H-e=5DU4`~71TxqWGt4s4{P#QZ?N84zk)jC>o zx;u(;wGs^m=Mz#&HADb_T|oFhguLy!5RqK0JnKJ z|2vlBk3X(`*<8zOLN6L>rrqqg=IQG)D5{%vvvrR>r{8)}xAlU4YaL|s{LA4gkD4ht z&IQ4Z##Z|*oZv;(zt7?z+IZEv17Ca^wOn!WzcbD{8?~9T84Hjt;cm;t*B}pU^p%%i z#RTAfp*}tDS1iM^#Rqih$7sJ@-c$65FaQ#{d%OG|Lwr2dvm=-HymzmgKQ4>^?fm%P zGn_MeXhef2fBuhb_nh9%Uo(90_h3KYMzwkHP0(fb6zYN(yYVYZRyX@#fAsJ99DOD| zspiH#IgJSxOU7eBD7O?7Z*AmbYC#~c<$x5_+`gh7(QH7$tFo-m3?oNrKlBzasqV~_ zpHd5AHFac#=&A*fp$0R^i6^>;ZsqO>7q!{~S^rWC;|`f~QOGk};2Z1MjS3bvJBx>9 zi>0nk&w~Y!f?N*z!xQ5#tXKBsU@b)Rc-U@S;n(z(Ak>TE^+e9aVBH|-Phm^C+Id0T zH3D_v8o*nSPoamPLX3rWZ$PF7g~5vJ1wEj)xsBzinj>R}Q^9M2P+U*QlPb<3hWhFi zQFLUvIri|ItUUq;K`E=PF}KvTBWK5mzWQ7&&!4bP` zobKPpp%d}HZ%DoC(s%v>-r&WbKQq!m&ZA)!g2sc0c(nZNxV)vy_`=p>9lK@-Q&o&) zT%CmtoH902|4#xP@pP0~aG1$vDQ_N+!VXw^9^SFlOjCJg&RiyD!tfb_?tnBSLnIux z2$n~bt*aTqFh#~`NRJtLOh11j--xTqkCn))>)zWekER#2pa2?duBHHW_nyJ$Qa-t2 z7%V1?Ju{p%V-Zdq7gI^OqTHUt2^n{YBuXCHr<-ny^vcT%W1Z4=b=imLsG7j>2G2y7 zt}?zhk^spjevvmuxLB^?s-uxDVPiKS_E?vk^Jlg2{JsXcHC6Bj#ZVa`T-mYfFcJ&8 zB15$jFID46hK{&rP0|{6sa-@jxtG4>GM1H%<9e_~1?-fn1rIoZ?n39=lbHvR?4;8Q zc_xktWM}&o-Tqim%;{&T*|@liMVY1m*x@aa95Ueith0HIh$`Pj+p4&*p^OtUjsuKN zye(%1)j&bH5c7hfk!J&YwV4z}@VhE`0NJQZo4u%hK!zcQb>y1l8|ii86V)!Bq_d** zOC{e=;c&mBDDNz!uAH)kY6tK#GW?Q>Q=t{Yu*y5(YFT*)tS_y-zk%53PXm+U2+945 zSvUt*92KXngMo)N#=zGShaD8}{t22@R$Yu{KF#MnuVeDcD=}hu)Xi39ujKa=mM;Vq z6Q5|vM_B)GEbU#W=s0DG6oN^W-uy7%r1L0fEn1 zSf$mBtGBX-gT`R%H#|KRgRsVj!>hOo@tx{NpVN?MDl1`u*PO8j>SG6bv>!b$59;Sp~YS0z`!z~jQo%4G&vI=~Z(NH+0bBl&m@`G|bYe=@=&93Xd;z|C+= zRo}T8KJx!C_wM0(Rpp`YynNrf&9#!55G1%F%4FNx2kQGptaIsD{Z~C-q51;j<#MXRXD%jJLb36 z3Q(Wtoag*;2+21uV~)!^-tpeYJ6xMQT{RFxzZM;u8{%Pux9!vkG3SRHhEqFn__aUk zzJLQFn``GXRb;-CpS&q>Z=5-+!%mwW=?Zv*QtCCVn+mtrACAlve2V$2DF>*6)j(w6 zPpGzSIipDRZlOhw!YBb=w5cwm1#@ zihbYCTnJK=XU-00Y>~EwBlV*2TmZnRbu*8phFsq5vPqX;$A$$4jJc`^p<$NC6bApJ zk7qmTQ5T;UL$O%z91?8f@ek8;&~*%I)XESzt5CI|dXl+3ScW$v;_@w!K%t|vWKl>M zU=pV+2E@2&h>w<8G_AaxH5IvZ7{5U1r;p%6a9+1+%rKf9^s`C|)E{U5BftTJB&ve5 zOd(JfZB@3y3^QP;Ov22febt@JK*c%>)EOTzD$f%^Xv(WENGK9w6~K+f8?=W}m?tub zSL{b+S%AzzOD#PIDU1~qR$91XOgiF0g#0ifWCulwpj^=ZV>!*UJIBKmRz-Yu)FV%n7(ZBGUb&sPUD^A z3Qt#G&YrpSj>e$-S$hqy^Y#bv=~+Iw_kJlulezS`4trMBzW@Hxzr3N7LqJK1_O5tv zHlh?)QBX){T03)8kR>!|Q2ZD5{sr~&*A_7kT5o&zk`8d4I?&{-WTn2c`oLJxONR#| zxl7_ZwZUUvSnbT=%C_Jn58UHf{e_7Fc+M4DlJt|JDckq#jdYm3`g5M@8+@OhyYNSU ztcIkk0I3tA6vfUt2X&sb_zH0KiWz)GB#NORsar}`6kT1PO-VL+YLgJw06iQ=fv$}G z&28VHBT6a@FpYc`mUW(B!rhj{#Aqytq4Famr0!#|GY!Yj!R)QucS$z{dar%ul|;X% zzD+|vDmAiEry^}tbSYY%YHJK8zyXh*JsP6DPU6l&t}t!FYeCkt3u|#8}oOdXE$rSP`|k!+vwtmDmzLN8Sfv{1O;XM2Z~aB7nB9d31dXZpC40bWr1%}dJh^Qsv{s#o z1zle`mZr8y#jF4(U`3)6^;-SQr`jpB$%%jy(R& zLJkLT6uWt#`71Dxppitbt0!dvsXTU(PjR$%mggu4lpeD*-3&4smdQNKk}!d4h0ZEk zrq&u>e8)uf!%la+1=g0!23kUqdf0Ml|Cj=+?2Ql=FVSK5OJ82kRskmNm;%ct#l4z4 zp(KH@*rJ%_k5kIly+0|+%|fCBjF%In@`>5VX~q)i0|X_%)6aDyrzg%+ z?|1E{?iU=|uAueQVF48mykU%p!)SM5cqrN*1v)&H>Phg9^ zqxRnliK5D|8ON`gR)c^K1kH*O(pgAru`? zRw~)?|Ksx4;~{Es5z3*!^5C(QUK`TuB9adA8niR`R@;0)Z<;au^nV-4uK5Zb7`aJT zM?*G$vgpl}9tYXP{meEVj&IwAK^b=fa++3G4YVw!Yhl9BP#aD}hN_dKvA0)$8=8qp|H*p0v_gq=8AKY zfHfVqh39KqK!Quf?1#o&(dv~YV*n!p=pmHlsn48Y%^Q{icAl=-2zh!lsy7S=S2L9) z3n?rBj4?}`0bSS_AbcgvF&PzL@ya9-jKI#83AgAl7EAOmY&XV63it)z5PN|RdzxX} zj2JU={lN*l(P87rnu~u+kNBd~p`q);ZK4H=EF5m<}SH6BjJntKRM_f_9$A zsA+E8=CtTSa}njcC2u$o!wB18PVfX;lbRTI)pn+R>z6XBAZp@uA+Qi}pyPr}GHnJx z@CM1w>7cft_^9EdZ+yj%8b2a2KbM@kUVlR!3%>^P7DiviL?S(9HxSiUAK`WHphW$* z1a742$Bjx;N@}zsB>W4qV=bVdESS8K!r3oq=HvJiU%Lm~tp5Uo%1k+*4N#CsM{WjG zfImXayl}wI8(oi-Iheql^WFkdcGIckVF)9F9h%ToeGVN!J40{*mlUR$9-gAp_YmEP zh2s6q7Y_(;TbMNMa{D7*IDm)9y##n5Zl{|O`7){x( z2zy+3X~QNd2Q24e@dFWvSN8x6AiFVEYDpf1i|c?#B7X&k*yIR_kbp&!2aLz2Cpk2M zA5Io!)IvRA>bMg^%P}4V)5yX#@i3Tt2vEd#mq;K~hx6oA!p_G0+EDw-q?v?4ZpBm< zhOk&f4{bBbKnXuzBK#~)LVInhBG5Od4)Io)O2lZYqxP{vLu(5P7DHQtByk1@!2Eo9 z=+aCJ6FOZV#L_3+?}bhHy9dQGh%dA@D6O|h2JNLr>DX!?^d-G2lgA}u&xqpBFi)tu z^{08JTDw-Fyf}?c5ES4CP>QC4y@jB_bp9YTLh%W962J>G$2}SgG?O=y53JhT22%`| z^@S-`IC5o_PPZNip#ZC<P177v`SxZO-G*;nH zQVo8^AkhhdFL0%V@}M({yN=D5$;k4Ld6DlfF2ySv9*gY zSp+34-aXy@b08_H*bn()Y)P4Cu~X|oU+~Rdh}PKNy`)+R9}DF7iuvrhF#*Lh8*YEz zf2f~9H^r6ST)CHqG-x!%v%EjIE5Rt2mPr1J>r^73g5Wn(dKxnAYsOAX9#b%O95WP; z0WT`IJ*lt6i!9JET`8T?~uQ5g#m?*Cu#1_ZkkjDHr)AFfn_`y{jR z!TF6>-%u^%s)ZoeKZen7tDe-UH()o$F5sJiI!Mokq{mgcaMep!tkde3k{fYD=S591 zjfgXPB4L9!MYK*+@T(JBGrjZOGc)+gv;dF`dhOT$8p@O*YqYyr3&e?%mQCdESFgzF z=Hj0%lRy6H%$J{1oO)o()$huG{jPgXKXw0sEhqindGDRO{Eu$s^4u*~FFW_PzxL@R zzxJ(i<)=RxPtWzgkMeX>)t1X&ee63w`u=xQ(R1@x%$`5?HOt-p^5?$ktB=n%b9v_a zm#=x;iRD2qv-t0Or|y4C_0@jayEyNhj1atw#gGpYOU51^oahl5*KhB;^A(r(l(7Ky zqBr=8Zkg@5mt~6Cl?{?V-`hN@{Z?mn%RNuN@BaB?_icV*P{8ipUAqtPvfqB>^PjyR zOR~blJ3sp22TG$(sf1Mta`(4fbn
    7FNl^C<(cnlJC7A_gV@*}eGogG=9@x*w{e z1#Qdymp|cuZ9DwOKqC$Iu2Y-rZTp9dK^N^WGo1YGl*ge?ZZP64-Zv~3+B{&jxVuNq z9@t+EGoIwv53}p}H_{MoYpBa<(B-%nrup#xi< z{EV;d`%*t2fg!Pu_9>E*W9zcC|dv6xUxLYYW54^#}ON14SVJ0P}pu$l2?-y1MRK z1lg_oV+vCb?z}Yswq$_&N1tQ|oz4WCCfnatM3-Zd36;8ee&fDdaV7QJCkGNOw&u9# z>*yO0gL;Ysl-x71b#_#f9T{Dp+CG5FKtK;w0)c3DzyCJnLWii88V);~y=Mmoh=p18 z>O3zmUZ{fN8FSO!Gh!-Q0PpusZF<)?)ZES7mRBBr2lH~@DF?Rv#?x9%V{|) z7T{Z%EXz?rfE$GQklv^(T)F+;I;y-=$DF?QE>rGF1`PaVsJihVemP_t`=d=Ii zQ6HlhpL)S<^yl&R;%)beD3_hOf4@=^RUnKNN)<}%{R3N0Ph^6kz<7iSi^HZ^|3E^F z-l*)U2liiIJ%U~ZbApW=ybno6OZM*SY)ESIqULKmL-i`ovv(oM_oku0H==7G$>0d) z87`#XYS4!;D@{k_s&ABVBl>2ZMl4^y4Y39DOZ_o^k?sAb8A(D-NG`ZKLJ=SUePj@{ zz3Rq1D{Oqv1aU}b!+lFzLVuDlN}A+0_{(a0BLYd9PzZ-_WtD-K}vzk zz7(IsLeXCWrq=cT7rRR`Z~vO8qa@mNbwz>pd*?-6-#hQ@+4j}TDH7{}mJ{wDARb7v zq#Tw3_3tl>25EOzANOA?E{v1^updmeQO z4BFrO3R!u)h#A6+EcFlm{_LmP>o_|K8F5u);C?zAgWk|Lyz5gB^+d zE4Fb)gZm<1?_V<4Qsi!ytBFuVd4Vz(T36)T0j;X3&EfhSKhGiHB zXY5Rk+wJ1#0A%o@{(eM?fyk*V5EJAvu!P7w@bLD@M^Y+1G+wiR!;boro0>k_PwaLK zQuB;h59*3wP{!EqPO<6uJlzU)H`p@krj@23>LI_`O<_SsSpz3#kJdQ}&eL~=cvk~9 zuA{(oWX*37KPxf-?`&KBUF7b#s$QStGh}Gw(UDeeo@XRKm)H9U`reDUaWK2$9M?$w z5nJN-g`jG777iCzl_x9?2}w~Nl8PowbDU5;0F>gP!FOX;^7drNEVWplfH-+bB|9{% zWT!a;XA)i~VcWbD0ko{HGNdT=jI~#6Ui_oisBTZ))!y>&IZj;$zjIli(!C57Hfvvg zU)J{O>pd<4$mjL{B3Mt*W$itC=u-XDGTdamc^ZFTSYJt48SU0jLnz@sl#kr7tdt;# z%fs5g$)cZdt6o>0E^__NaBk)Go*uw0ShXV%*ziYUCcJu~C{f_s0}kZyB1@ucb$xcE zgJ-7OTRz@V0FNU(k}@BoOGSX9I&FcQ0S8Cq#O_BamU1X28Q=p%V|rN>5R#lIdt0a@ zA6=l<)lM|fbt2rihz2;w%gszue``lqc!RIP7}I80uoK4U+a2u@zcz$f*FPBxk6FPq z5BSIG%fw8Xx(nO)@6i?1uGOXrV8D5X74*;bV51|aMzwWeJj6ID0RS8a5zFKY1r}u) zK?+aiL)Om6#v~V9JY5CF;WR~cKt(n!%D(s^AU8C*th5O2w*A5fB4{xM0}5sa!f+XZ zT^t2+Xw*s{Fea+OI2duZSUHmh237#c9};8ItKV2AgEwDqUkr~F7%6fBplbU{eJrc< zK;hIgEc4bImQcGwvKeQ9L19AmA1vwG>UhQTDjggHbh!6G@_x(FymX@}5nEU_rhNhL ziC>6d#A*XDwV^-+2oE`uMk|fhm_O6?@+Hd-uGCc375#jy>lzVpLj0?AT^JHU5jv2n zV#ZTxim=l|#s5iw3%krJTIA`;2_#fK*X~I%aIBfy*iQ=RRcIpUn5$#D$PtAM7uzeQ z06sH(Y`#je<_~>sdfVA?i5dUc{1H6n?IWNv`Ofr4V2c#5z;v8H+{b4;+{Y5(-Wjvi zNjbajf$}Eh0o{f%V21DLp)2cR?9z6CMSr3b^=qcW7&8V5qu19=0U|$1L5c}Hi4J1~ zx;-Q3YltH7gAi!g&z$Dd*-e?>qY|u%j852gPw5Ots-S&?Z?B(NmJHt;yEy@CqY$F&8h;z4nNV6No zjE$Pv*ambV2bFt22d!tnTuc!&x~9F~0M0cL2-=5@3q_7LF0dD~!eBl@*99o71 zG!BiT?v*ch;ZgH(6lNBxYjXKrio>A7qP`ep%j<8YC(La;0f}h63oNCt6By_kW~Y9+ zxKe@`tcH#rNs}OMOeG>I^fpKwi#>ursIW7^(iSwTzL@(kt!iVg{;ii!NKmk;lp}(& z*3Q!;=6q{}xbf2)7V6>==o*A1^3G+z_PuWdGgD6DGen^-XMm>|~q09g-b^u0- z6(y`V+mo5rAY9tlhR)m(J!K!y)=a^kVwisp5O|hkF+kQ)~mvVi+4&!!fDkG^7)J~n?_v=e~J**#rv@;SG$PW_#~v=KG$z=x*YFhc;byB z*zG;WB$a{jbVfIjKztly6pJ&DyCi5eZLgt!G)2;kGFjP*um#rd05ixd(>tv?-6>OA zA|ZE#dbYRY#LsZPrNB=L?x9yi>;R=i_~3BC>OCHfs4c{QFIZwlqn_-* zTU@^w#vshxUcXQZNy1zTqR7q2BS* z-+k0acYPci%a-1Kue;6e|OH@IvTb^;smsWoN!<74CdB<$k{EEn4>WH+{@6gRl$j&AWKdY{+cw54F1`-_5lB#1;|cVXfi|ufJUc z@8^bB)9s`i6rizwKB4 z8uTIdgD9!?rw6^3@;|cuK6LB*ANL-Ow^H_i4JC^7g-=V+h!bJDOHOxZ%_Ru~@#?GE z-a=gc-Lbsth_P)2*Wx@iUpJUp8F|Ss(V;KS$ZV|t(o4c zAEZ%0CEo=-!QQciyAV1|XaG?fY{l&j$EbCRm^*kPE`OqxE&mSu9#*wJW0KoftgFjoi|7*X<3z@4h*WS+tw_CaZM6 zRYXkVp<@ege;P_gb#=HI!{f?O7(waGLn}fUbnqJxzFFjB^+(2O2>{o>W_^*A3=U-i zvA6A4UNsp+HSmfW)|K5*cjX}^%wgR`USn|X&kjX@V z5dxq%5<64bNlo@0l9DibfB;fi58LuM$*!4F(3q%yRd*f=i+Ma?^ph%jW5PW-3J7XPC6PJf-f!$D#F9XKYfswNRH4Z19)jt@(bO! z0`^6H1o7AdKjY`-id$kPKqwlz~)y*=mTvemR4bVN-jI)Ok{ z|7}^lHP2Xphx}nN);pF}V_BZ({oZ&{=HbzVsrKqO^!dD~e}if;axC63X;%|$!K?Rc zcCpMG`d;|l1yR($ujNM0%pLEMo9nYuNoz|L03G(AE!@Twn-`@zlU{a0G@O299(MoF zJj1zZern$(L9P6!*>ThE8#=2m0tt23e}`qL$!V4orm9C-Ef|W-7y1Bi+q=@1mVV~j zurjpJ+WH29iL&;SikLa#ZMCpVRapx~;?)H2IUKhC0CPeZdCGMf7$)0SMw=&5&LIQX zIVkmu3`W1O$pQ|Hn5u8BsJ5TI zPbI6P#ZF5*fo`R6n3NfiNW0p|XHV&6HAxGz9^g zu=>RdwqT|gX^!X>#L2m25+OsMkESCjo!7~ub0>Y`uibUunoV=n4SivLXU2q4kTs_~ zE|412?57&JPBmJPzyC#zv=X3pQIcLIP|9vD#T{}ui zoh=o&M{k?GP+A5KC;H-g?ghFkik9u8E|Rdg)z3N$By*LdI`&%^L27J(^(?J$p?d2; z9lfMP42P`x5LzQhG8dKhfX>|_NUG|;WhLY3Jh50L=_-pp8GgW|#+c(EiSdq?)!QbD zWeYBqiIK4-8&>PHL6|rA0CD6ALERzfD;fI+(=8yglFU`vz+==GPEuwN>$B_f!3yXs zG%6d8v$&92?0WpLABi3Yw5xJ5-;cmN5t_Ka| zpz+ss@nTury{xEWLt@qt3rkB_mQDLq-v=H8g%yecjOp3@Ofx6rEty#+;km!08gRaC zuNvYuVT7i{8ngG!G{N1(x<1jjh&fQ+GDM*I^_={?gVbr5l8}3ZhTjjSlbw)+mJ`Dn z#R;Nyk<8=@B=eH!1#gIwV-Q;x%u z0Q%i7*h#);q!uwDOPo;8LEs2+N@<9GWGRhof0kHY@8z(ot!{5jy#?ZdW15MRF)OrK zGDeZo5a`W-qMUeN|8Yq4nk&Vrx#FcmAl6LIV*1EafH`6y=QKOYHFk3xKT10R&d2sr zWE^FG9zN2C;^LAfSPrQPrc;QKCyNqO?VFi;^Skd>l3|{Jn<%29lzB)Q2nSrmx=$0Q z>pUrOJP5;-qroAhU2y1Ikr|00pl__EL!iM>={i=zOZ{O#e_#m}^UYG^p&C#JO%>Fk zNVu!o%s-y`q0M|Mp*gzxYOV!{D>-sMuMX(CNCDp5P{l{fA*I~D6(SiobRJBwU7!G! z*j?Wka1R0uW+6}?3943XZ5Uv3CUZWd1S0Gf!JDY*jB2rGcj%P=fz$QyQ2Ap>H!m}KPKWRFOR zd74t=0A$vmWX&w0lalS#4DfbZg?+L3b`S(lHkN@zG?LQThuG!YeR2S+F!$R#uPN)#7ioh8$Z>qJMI2F^gV&stpTZrO9A5A3=^AIY z24mV7#nLy8sbUrCCkzX z&~sT40Dz`Nzz>!e2o@Hr2q_1hsNb%#lh!nU)IGr@2&Rqo+Z$jz05(uyaH1=?i9>X8JaX;0hveKpZoI zK>S>!5UBI9+_g$ z^woCd&Q^Pr;`7v27sd8C`X?Hhit`TQ!*a=oW%nUVtk??4jnC;M9gHE=Zy9eAP3_=- zGPD2(d$z28b~WDx_?$m1zyx?RBcKklks#aLgoT?W!hn`oxVb%#M(8wnAj7|{$orV3 zgj0Mz-d^`og{ZOg8?G|z5Hhf7xrWPz9j1|$!n-+xVj+}%h5*E_BfvF6MgY~PSN-)F zG6W!{NYI~xEVqu!Kh#w7_6rmkM+aU$HEesowakB8#%IUht~7~3H; zujYejY7$H*!4o*loNKqo67Y9e{+vTR5etTg>Csd~jC@Q4Q8;emANR-IH|TjOX5Zm9 z6R6|VM%!}?q58h&9Jzyu5S)VAVS*W|cIDy~l?Trk!kFrjyo=r4moG5y>bB z$7Ol@;~u*BjT=iLpvqEeM&T@MmC=xge;b-GWRb_N3 zZ;Sdv{pu(fM+x*9ZVF6DO(?oDhKRT*c!dch*)XCXZ$*0t9Yr0mgqQ3&qE#)fRLm5{ z?v9E218gn_y4Bb61sA(+M4ZbTJpx=75^yO1x# zam&(2BBAMmZc|Vr8!eJyBxI8&gnEKe_p$$jJ)hF!J~`nl@Iq#;k1p^AwVWAMD39c1 zrhkD9z~Ex!^lhybYo=n_Pk=<|&=*P+BLytU&Y6VEShiTg$rG*Kh)X@WokM~af9)fT zAz&kN$tmmisevY2hYgk~Zs8>ar4&@Z_-%X_xQ~uZ=mT&0elA(IfwVG>6hoN?K*Uez z%T@s*Yddovv|z?~QxHRw)S!hnKQ8%7fg|HxmUlU#wuuk^Qyz`#Q zuaUsIT7FI5A4qtu69<6O>lG7p0<1Mug$7vdj+Jz(LV6~n$&%@y%| zZ+-SmIAnZ66|{;`P+TjD&9=PQsgz71`lM7rY8Xo8fZXl1^oXFbH^E`?tqEs(sE`Kb zNkdY|0#X_T#*Qh_OF}D zF(nJ)uVF=k3;3uJVA&0vrE?4c$!41dGGEiRc-@S#;oe6LkI+9Dj^8(YpYBMMPFZc~ zq1`*6K%7%qz)f~+UPGg>bat{$R{!ldG@Ix!%*VJ98&?;#qqu_ED|!qY62caVYBs*7 zPenS!*K$ZO7+uTi$9W2gTg*`Bil>HqRRgp3=C5bKa$84^UY9era{iTh{R?0O1;Bic z^pILf2(K0~;I5#ADs;y8kE7AQa3?183Y-nqnz&-Hf=smSPruD0c4`Vq$=ynRUd!>m z8r1YJOP|>iyJkT3Rt$xu1m1bB4HJ1S-w-Fl)jHP5TCQleNk2NE=O7035FbhGD=qbr zbh+tH$($ybQAqC4rwsR;{1eLhNv7dUFJp?j^X=&ge&ZsrrmDV#NxWNEy|qyl^b=fb z@jx}uL=ah`Te1=u2th1?Ds4KA-D`-g5iv2fl_3OQsI6?B}>r1<7F%fXOHo5I$5WXF|4a|ap^2@ zVk}s3)_%j&jxE~3=cEOm9T6a}1iunQCh&$OI-Rv|2mXMG(P>$NQpvdT>bFLOuF2%{ zkf$DGEY-lxsxD53J`c+_1OHPPOC~)9{RdgOnM%u``|{A>HT0VCU!Z#8TJP8w5V(5p zo?;idzv)0#ZA!RK;YI(GCJ4D7715eOgCXot=1ojA-=UgSzq>f0L>?BK!^t3KOI+za zh#K8=J=0CuQ%*O5Z=yp85mY7(A`vIj+@whYq&-FZrFZ1*SJ{)yQ*2BSu2~r$b!ecg}!?5U?!AIq7lMB@9=a|T9_ zQD%v24NWzFI@R z^hMwe$O3ryjs>$)T0n}QKZ#KG5Y&40)q&u^tG)v=9%fmVEyHTR!Cr8@;_ki2C7Yb! zY@gi7+@*1_q(pWp0N+bcpt9-P@BE7>4W;Su^uP0woq+IlSV{LaoJpEK0J2CCL2Y1l z6^|k(Ks=N`#Y1AA7XTPjPjxZr<>G(MA}Q6zxgj3YTTFH{;J3w>mf!U>an3zxG6skkeImw#DgO{88@3 z1zer9HS%Jf#6&T!3)@=`#NiR1@1(}T=tS6^&9QOKS6U&y@E7#0E^2phWWfT4^bOt-AKJuVb zrX06@N1k?W*Jog5dx}nkqFoOcZHth*x{uWL_Fv<3&QZ$SdloNAO`dsPQr>)! z8RcIQgIHD(M+e`{`SBwP$(uH8BMV7<&|J{oi+B)s#R9e(G(W|R7t!m$WN5_b#5CU0 zrC$3bKEyuMzR#*927#fOIXKWJ%FXRb(7-Pk7@!WGkfqO;i^Bud5nqw8;!V~=iwGA1 z06t2Kh*4ccE~v`$jPf>$wIS{==^jKGpcd9X>gQi&ijHBKhzS3(o!iDOJ0IwO`V?3I z`!qm^c}a(l37_6VCFa>tq4Y&~WTav#8`+85^bNyWj&LovXTK)yF7L?ST;!}tSO+=_Q6{7gDWQYVMKr&-;Wh(XkZoi7TeVqNv z+cyZ-g{lMiR-NW!>8z%zwcGW;x?MA9rKz_8t5hDzGUsKOxfbV9ri4Xp$Ef8$k02*H zQM9+lWw-p>G|_>yVPP6Aw!Xyk!Q(z;l))@wm_6Vh)Zja@xWetJf(6DEPCw)c0J;+N z?FE{~@3Grv$e{v%U@qTiuiDIc?C=*XPMd1Qy@U~I3APBTCA~AgzJWUm=^o-73Xc42MK}QI=rsH)k|q|_yNeJ+ zkpmy8TMgMYs7rF#0-^RF?uh*w25F(#ZqV~Ww?oW%F_ZBClJ%A({4h7l^CZ^@zoZ~? zbs9SyN6%*VQIRh!JYH^2cFvA)S+LhO{Ire68Z)4E;xp?<0iODil5`!Qlp}Nj+0guL zM13CwHvg)nwm?0IUG{Qq{V$~vEL*}Enx0JWBJ_XnLDl`mxMqQu(>;g)luT8j) z;81Ln&}0@N^*o^a+7lw7F{e_f+2t4PB9CwVMSLhT^rrrbp?`^!#$bK8KHFk-^=DI% zSQZn{c$@(mVL&HQag2t(n>sGcRQ#IX8Ba(rsdiGX#p0-29d-|cvej>fHlddG(Aw5# zRT{uNjn$t<(2pVr#h)6hNa^4 zBsmiHq_EeuEV5QDmv{#~XA>ou0YG}Tqf0XMJQg?&G^Nrz#eR@$o*$`z8aJn!ii3NG z8us~n`fP+<37b+P)KN}`imb-5dKvA}XY!I^>zos}cso5ZU=m*%wzc?%y)Y~eU~Sqb zrV5jPw8;zovtJ?D5XctGCSHe>Z1my?43 zr2HmK`M*+FjZJ*oq86U!K4rfn9oWYQKG#)*w zrYR9=)G=>VN5t18rKiWi$O67~b#zpNW7E}To5Lu`)yd9XwLWYHBS;^m`Os?C#TRJ+E*-w#C}Gj23ze{>uDB8FQfFvC%gn{T z32Z#6)}-N1gwfPmkL6SHGoaQvOvM&rQ>7a{EyBOxW{Fwm1dBao0}wp@CCaN2#GwW)VUgGO^%;53l8jXn4x@8v#)ASOt><1n zzQr1ZXOQy8^Xm&~F%Po=eNX*sn-q*bYKfOFM*1H_I=%r!MKr27AI(KQ3_=r8R{dOT z{ud{Z~#6T(>iy>FS0|Wsy zo$g7o7Y@gn*$wBj(~b|D$X(ABcDwp3Wu!kZ=%MCwL&UnWLTXJXYTN(L&VzB=2xEI=$^j)=RO&l%+NuNaJxn@vJ8%Z#$&BPr zQVct$yfL5eU3@74S!Ml}k}tp~Ta*%VaUALM zqdIi~?wrUGKA!nK*M95sp zl9BI|Sf-|&4VN!g0e33LSqpE3VAGLFBqYiMcV7v5!^6N*L2rTdLMTwCWCcQSI3syD zrKE^Bk5olzvc6F^2ZGAhbF)-@Am4K)j+O2m|0#R7c~` zlxS|E{tSDDSW8Ncp;1}U8|--)&c{=>Q+7kTAsh$aYg6!O1FT;=(n%tsT+_?8I8wFpcqCvQ^*@qb2_Y-UgMpM z)$~j1UQ7zmov1(UnH}_BiPgO3438EM4>p2Hl`@`q(dJea2T@S6D?-?vA_9<%P`dg~ zBu`pq%v8siohDhz2tVrWgH+PGKAR&3*x{rn=f`BLPsm^1nXZK&X(MpT-WBfjSo%iktC+YwDKpj?mRP~*qml| z7_6m!S%m2_ekjK1<>m;wNMt+@85a)BN$zP8>eK7*(xZ`B{FVooPRCM0Q0SY>JR^a- zfN@$|ywP^JA7`WSj_m9)L+cQbLviu|UAp=$P}8@EA+L1pu*6PtyIW+E{Jg)kuuk}; zN(@RoCw)aYrFYM%Hu1K7`Rc9w`=8jwrwEy}dO?uc?=6@w!nY2=Hb6R2S3tw2x;7aWF85fASi|9kC!wSSKjP<^cwh&OFZQ&%itCSFupr z{UsV1&B>*cv<#sMRt+Syo_rg>6eug$>a$`Dz}IPdec9!YzlAD#RH2??sFxQ+WP;*3 zPw^zm@n8Uk{@C?yOA3XsG8h1`q^Gdti2t>L8%GW7rGcm_CL!j7F0tjOex=wUT@3>b$yCCe*tBMD!{1E@`{721qxT_u&FCq`**42`s|kO-Df!k zo9^&Wbz-cNAX_pJx-+2iW6Gm z={dDvy-W|K;K9ZQaAg+)>9^+r>J7hwIf_g6X8#I58YSvy&JM@Z!I$kd_d;lP-b^i? zY7wvZ>^YcSNuxaQoJ&AQ@4}ejKfAA>HyiftZF-!==APb&4QBnG&N@IP$&1bY0rF#! z2q@3f+Ag;8Xm;xb{CljIf6dwDsxw)8DhpkMa{Kb5k_~4CP1ctnhSdMe`}&?DJg-fb zW^AJVK2Jvo!SQ5JL2eNUoriQwk*Zo{&mrYe)iC2E3Xs+12D|O636%pHpMl0j#oksokemXoeC9Fs&5*+&8d;qnD$PgnH zKTY}}4%&x0f`d28PN+2*VAA#K`n=A%!d3@&lp?+OtolZ?? zYFN?$!fXBG9)|_eX41N-orjV>f}9rr)VJg@LB2uXxqgyTIb@GU;!zflv|~+bYK~2+ zZos6BW)nz?B#`Sy(2y#jgYzP8oUP3lrJVFnPa#3az72Fmk|~K%E0>CnDhP zxa#i)=(%iwF5w{niVCo0g9Ys#jM-}wi(UoX{0hqlvzYN+G!b_b-CeX3Po`~$DGY?^ zrnj`y2r=<0GS=(sV-YFPP7^6g zZW#}I$;&c_@09IV6lHz;;6J?kZnkq-)tjE4?oW^9e4nc%_*;u;gmU0_Im_9uu z&Gp$>R09mmG4R9WWg@i4FS727_oo~_v^d47AorfS3)pci{RJ2(bYZanhb6$Cqtubs z1!1>Zqpo$rk~_>R5}X(9lvm^?DB2mX*h*cPej=NOtrh7|(+J@N%Q}Bsh}{doW)pjF zkUKr=Gc*9400%v?eUhCVJ4j9E;7IcYY9v1};Sg!7_#&P)kg+f+`m8q#HzVHPbo3@>;$*YTPM1J$8X;prU3 zw_-OmgQ}K$f%rq?&K9{7VQBYU7X-qC=$J9rt?ZrG5sIFGE3|`haJD8IAa=9&p^d)*6 zJHbd@6!bGTN+G(8mWs`@i^+T&j>wLV8DgW~mTveA(EYNMHDvHr^q%8@>RVA#BKV3@ zgK<`E#@}4QteH?SWF9cAbzG|tKaUY(0?T)%;e4$(n4}O5tVSw&AX8?7DlqcEE`btw z!n@_8cSy{o`DZ!cK4L()8@s4I=pE=L3mAR!KnN_>cgQ!63eo$b_OA4echs<0CEDpi zC2(j2$LQ1{m6TD*%8T0XJ!~ZlZ7i)7QV|qs5)&e_LM#9Wi^@x^$U8^}a&9(Re9Q!Az5u5Y2S> zoAhozT+5A^j4>y)ba`CM7=9)!}UwT+_7Y}@_wq`8=B3Xx`nEn^2kSn zVv5ni9{d$i10(nLqhpp9LIp!Gg&EjLk}9!;-1){J`i9M=(^cTfP~`ew0RDkzzy3_}a|LYrior zXAc!ga~7~eh@56-SS%{yzs12^hZJCTRme3lP2sWIk;FDB#?Pc?H0ET$hZEl-U-Tpt zElV`5-(NO0X>KwQk1>&v3ADsV+E;;yV4tps+yb3olR>gr`wE#M>OmxAcR=^_*+Ev) zp!*LvG)%m<#E_$(fM*24MJOm#lL#0Wb634&G*yqIjs|w~-o!4W_cWgxOG&@b?@2g^ zjJ{zB6c*}0)Q!McJ`d%fA5>bRfJkdM&nA}hA)OmVWtt(Nl8iINB|Vg`FYO@_GHrqU zcSygqEcBye$A;YRayBs=N8j?IgI@{FG~*Cr7agfdf{ z2}rv-P^rS6_Eqd@j3sM7il!JupV2u&4)$J{2s3INIuXdU2mzqlNaS(Ea18dhZVS>K zFoJ`EJbs%r4)#q26jzLq{jJ&t?UX7RKOW~%o3!iWdQ}|eie2~fRijt*oM;rQtBv`btHfbcS&4_a8Mn^?yZPKCM4uEAS z)51GINaeP|794=M(jJi1-QRjb0$7Ezzi0o>sJT7mHJk#eOCc z7<`s!bo67PkKvu`T3}#ZADI;T7)iPp-`TqIb79^P5!Ow6LN4K>G~D#b99-cB7cdV zevVlB3dG1ygq?xE&cam4>I6Qyvr{e=9he+{*w@Z^SC&nbK7Cll&E+4 zabZyMW|&|^<|w;SL+mvp4rLuW+S80UgPpZ})_QcY48gwSXAut5<{hm_u?jp+p%lqK z6y6ZWtU$#=(J}I@s1I)B3Af2cOMHSD5#l#)76RM?0ujdM)GLf@`lIOp0b1?~ z8qtSgo`|B8^3`1_TaMM7D|KS{2CXv3+jWObTPJ1$r@KEfvyJX1+V-ER9Xs0zuy0jJ zRdTwndZd0vQUkKC6-ys^Vuo7n)#?*7rBkX~#W#FkRogX)U~p&N!CTA({$!CrnTuXZ zn+!gUo^*+nwZorf;ri*FEB5PozGQc-Z4ixNWz+SqsV*kzQE?V=k}N;Qec6H%G?--e zms&@I9>pfsNfoqwAbtLy(T@?IkBE zl8c(n%KfL)#Sy!!Fh)h1De;H@*JtNA!0^Pe-F~>LJr&O0UQxD}V|Q$?sLAX@*hu@m za>sxj=awDJa?cT$0}=%>w*!u=N0Hq%c!a<8uEC=$2FJ*@4VKOCZdTnqZ1&CXzH;#B zrg!t;v27ltHVCD}(mzZ+%<#14=;qPSyPz2~k9}55^dQ{I6PkF|?j5X^gH8BW6A#p9 zbu+l3qxC$0l-6OG?J-8k=FKB0gBWyD&fdedwmx*l1Us&iXKlk^`Fu7w3LqZUG*1VD z#pe0EIcneVG0o9eaC9WxZbfs{4H3dXCLPl&hqICH#N_w5V*uqcP{aHO6@Y!r-U0hDkHR=NI4Zad4VVYR z4deztj6?UiGq{r(I)W#Y{Drzwn2X#FHD*skiZ$;DK<0|9BZJlcY#bcn=X{S(bA5Ka zf$ZeW2B3p|gCP~H}AFm&Dd^n}!B(9G=ovXtG1jA`KW5>^X z0#V7U%^DU`yQc&<-R|OybZcq~b}-;vN`^ncpV%34W-uAjHo&$Z;$v5(K!T$qDjKnc zcoZ~rk`_3kKx|>DMw$u0ocm;YICEUyY@NLgfN;A84(0$ANdUbn3af74R$QdRKmGffkKeIL`OMCv-D*Ob5AG* z4OIjSNV8Nk4@xH6V_b2O{LVRq{w)5>m7k-*{_LiBW|l1LSmKzcVb z3EnpI#m~=7Led(8Kbw72Grt=;Q8mpCn8MIN`HsI(p-0U^1osd~wkO{@Yi0O2sZ3wx zDt;hU;0Qfl&5?Zkg2$%US{a^2%0?7>5WdIl9X>9|SBDPLDr4DV97{+QY0)}jB_8DP zjp1Az0Sxv3gan~#9y6aomgcTFXEw%v$mp^1FyjNs!yrHa28*%>t0Tjq(^gMKw99U) zZ_nGoPG#TQ2v4Q!oVf23DyMz21p{|nuA>qRwS-5`Zws@5L7Xl`V;ZSVeQVDlrgupGs&4Ki|A9|!!Ao_ zeMNWF2uavjZ$&VZ?WPV5-T`ru)J3Xt!XG)vgyosBrpW#Yi2yJ-8W}l%k>|(D%~U{& zBuRVOR34pULjsjZ+LPr$w|ci|yLNYM_@NCjt5 z;JSh;Gs{C~j-}2BITS!@PHApd(Q&>p7?x?Ik+!Ee#wXb3_VowG+S_l|NIHgwZ&pW9 z(PzeVa`khdVU(m8w8KO*#7rh%i7U8mzRE09F?(c<7KLiD+cte?-GIk<~jPLc_y$43Dto)lNpnnqFP+B<&!~ z3dt-^i00{Jb69hD%0tRq?&9qsaGPmXA#Dp+a{SeA=iqR9Yj#VvJT7ZiqKz`wLP)hxn22F>oCfR^*h5#9 zP^e?cS!OjW0>L0*VVVw? zYzWX(4_TXH@>sKs6u6D@QSDGykSd62Clh5_LT0;Urec%7)0`GI#1#80GcHWO$n4RF znR+WKZjT2~xD%2u%UbQ2Bn1vLctOls2-dT1~eA~;4ld>aYj{AyO z1A;}AfXb1Og&6}B9U|v7E|KCk1T{q_t6d^0;cBv7$~JtP;N5{JZ!gtk6EBHe>?9Y# zct~kl&OAoqqA8IcgQx4OfGd^P?{Yt6N&A=56IT+BCCc(#@Ap_}_2p(D!i3kD(WSzHU z;T4=+5?cRi>_=p>&$16{b8v}+aaI(9@`>5m6s%rbU=(7o^b}+$Ng7Gnf>D~>ix61o zojqClCp08nAzvfjYzB1UzoIDe{x}gnsT`)t4Lg@j75Vsh8UMks`|Zu>RFe}Ey)plr zz@W)`2De#F^pTuK=qk!i9EQQePQ+L>WNy<|w!Gfkk5?ijPcaIKT|7LteqRq zKx!bzbR_mc;)}8G9mr&s^je8v2=!jdmXJndOI69_0jNyIV2V8nN(lX!fG_}IW5kD! zx`$^i0*03Is{&O}A%Pm`%i7c!N6aHTzS8#c(OAG}4X%P^)lo7!$(DPscPfhW*BF%XH zcg3J$!`49JvK(@sW`+J~S=I=ENJ92w`%0f+j7gisP=erfkU}5M&Tu;GPZaHKWV=F@ zX-Ra2tk$VJ%8}8uHH3_UelvaZzL4q=Zj&T4LC@@#{S{Pd>>Gz;XVBg$XI{Xk$UDp< zuWI2N@1Ll-kZklGA&EwGd~jw&n)xsSP;|0c!L(Xs6Ig->#&{X#WH(H*>fg!u=>%Y5 z0{Mn^7Pazbj9qoE8kAijMWE;y$PfmYj3)oD3i8Sgn2m3suE^V zMF`vo1?~c4=!~BR3vr7!M?^G%8v+V{k~wmZlGrd^+yT!-F0!^bLlU$b@h5sahkyr} zK`GEtq4oXRd{9t-9hd<$4*go2maY!WjhAN2UhL9Z&+I9hqqR=YubZ0VO>$|s4l zMm$c)PTC7*7*?jE*tuU3OBFd(+DRRr!-WXhnH?*EMV@#*As;%uS*T~6UW&F|RdTul zO^F}?riq$5K_5|;{kH0OlUB-`n3oUa$@?7Rx=tCOsxswnBZ=fi%GhMHwcCaG3XH7uX~_UGCs z$=5K$!0x!3XfLgQ9{0^cMs7&X`V`97Z=cA)p`*eEEIp)f9);Wb0?(DBj`LWuP<67g zH)97QjrWo%2+6L`Ie5=jey4W2UaCjoUa9}LKfDrhk!C-@hz)-@CLddbG>Yk_W)itG zKvu;|$t{*UnFRU83!uX%HUM?h;pZU~iyc9CK}2x=`t4DI3|j#cH10I_+sXQTmvg_p z%b612mV+&T$byVApxSTO01gcp6Xf$x!+8{IEk3Ewtp+o|A4Vb)^4)aWmjm<}auMB0 z)x^NT0s8{If41$ewdVRX6t!ZIQ%R9z{t>1jyl#>V_tN+ygDKdAa_oYM;e&N3dn#Il z*-&kaYhwZimfB`znsZoO{rn|xaqx^Frle~YFA`JIZy!fZ%UDb?TTv>FLbMs=L5~SD zNGqN6A<*YY!*m{i4koWs0sRdYM?c5w=R@#B?ONNG7t7VUrqWilU(bLZPvxP+4#o7V zcikBdCNaL?x`J(cbrsZFNb!MDBzV*qX@{vk8}g6Y`B4M|i#o|e9EAafjZsXk-k?X( zhCzRdKOu<+qb$93{j&ZbPyL$aI_=}^wU=QsLWSIi1dsaW(Cfd1x3vK&PZCs)1Q_7+W z0sCd-Uy__uAJ-|L#O5-EvBnPqxOafhA1VqEgoHyi+$E(f`45JrRF&~is6n%%gXnxa zm%AVxV|h`#hNF>)Gh|*{hH)Xrk*E{)25c%@jCux}r&5T=&BNjb)LJvI6z;FomzT%h z8!{i|^$+qck1%Q`qve>;kX2YDrX6!)o^0?0a)WUQxv|#ma)|>VN2%;d%+OPc)Y{_)t0%YlVu1}B52e%EfVzUEX1GP#r zjVKU@26?(?dN{uuAvS+vJ{%T$9vSJW=aSoVK5tK@f9&3T>g>(?s%LlMD5?j@aGal+ z$A(}OsX4edh6$4~(6snlV;E>*_J~eSlICU2kKH^GeUhUt75YIf%9c4at<;e77UBcXR{;fn*w`IUsCjx2 zVKmMtL!y>Gy@LwI@z6lvEKJ;3;*$J6K_RFU61ieBD@Hi-1FRG}OXML2{~Cyl?4)Ok zj?L{qy%&7)o>>6Wsx!>YUzI!*iPRu4($mi=f^~WM~FywcPVw7$_f&4?e(SDSp?T>(w zy*$fc^v+I;cBJLJXutQeaA-YfxfiGr?JGZC2AuJIDG;KB2HGJAbFeYr@-Ny!fu?g4 z_C^UdLXR`{pZ{6z;v{8h0>DEAh5jp*@Z;{Ft`x_Aki5Fd@K1ao4?;)-!kTy`%u9U` z28x3Ve+N52RAFG9C*^Y*C|tkQ&3W*ECFD8-Fd4X$NEsLuF@0FTX^CPK0C zz-sZu9<87d#JvD8OIQg#(Hb58_z^21mQiL>$V_^{OnNet6Ut3dPwpP$O~F_UmkGv# zQ+kt}@;8l!Bi;?dTW*%P*wHfp5K>%_Ue-j7W4o+B(N~!bdkF(Vd|txQ3J&Uau@VL? za1nazKgDpF?CmUnSx#fx-6Us(W%4We0yinvW;X1n65c_O%vGAAlFDD3ssA0xif7&LPc;jYa2KJYJT?5LhQ7~XyKAw9RLqdid73>_-TK^%a zz@Lo>q6AzxgBe{gBJV-zlDk2oL-L#{ zhOyID5H=-7e#>ftGjQUh>~IH1o?<@N)kZ0VC&gic3Tc^pg&-3&j-2b#yrTYWh$C?g z#>6zfij61rHRcpwbE|EA)l!bPw1_hUk&WDYu@NO#MXDsMHEUNzj%_wMNeRgg~5si(dHQaF}YY5^o zliSUdHj&lkf^YKwmf;~Z>D#6&_TEr`7Z)I-rfakk=}8rps#9zf13UTs|WLVm2D%x6N^2PVbM39D1q?Jv_GaP3s%XvpTK7_W+_7Mlz}Cw?#;dWAIi{{vi4nn%PUnjoxkCqwg&n7w5hCd2h%Bm`a%{lF~UVV z4j@3RUzM-1KcGl>S5~j?`jgJ%1Q>E}h*WX{(*@QI)w*sV-qsol0#97{oe4c_UjwRu z_^d3{Z;?*#Q^}Cxw-&ULWV?S2i#3ZnbOBBdfpKV@FdE^~pk@dfs<^tUVGYy#2nR^ZM5v8QA;4r6qu1aN1mII+}iQ#M}4axciAkzaseIwEor5@d-}pfoZD@jO9b zur_Kd4hw5K2bUPYwP1*61(SZyHOFQpO^3^jJn{Ut8Z-gxD1=+a@pp%P66-d__yJ|L zBkZ%oX?+)*E*vIQ1pNzS}P?RQ;a-L%}mWP8ydf&xvVqLGE)f27qkO%;gJ3ik!ym?P6Xd^ zReLot>+%iL*mpY#3S-42Br$<=Vf?h0*Hux0p88q70O zNQ=Qnpo?dNA~{3S5g1v9^&h~hjT0fOnT9Ov5+e`MWUM{0yxh$w^zQXLN|UvhK}6}z zLL?hwap#ocBs7kqAR`f);dtPK;k5 z&l<1b$-u8cjg^}6U=Fyq|CrV1yG!?zu7g}_ETE}huYk-dV`aRvs9r1CaE@L|dIKtE zLd{1wEGfcYRO?=`xs(z{YH(E@35h^(QV^m!ysMxya22N~*4@>Z7bu92<|cA52MMM@ z&SO(_P4&|gINxVQODHN%C)Rl=7t{oCt9}v6L9?<_M%HO1t45}~)g#m0M14h0ofKJ9 zf1$f->K`dN@T?{yQo35JufjF`y5i!Fs%3ftAw%H0e!dP6hO&q9nhC89@PYd6_Jw2 zBcr@b``8upoRYgGOI?9tWwz=D`ce z;pi)!u79wBenGI~#4DI#nQT10>e{3jI7ZkQDZtieXNORLb{HG#c<@wu8o~w`B6qwg7)xZ@b4T2`~Vy>wTEcUU|Cw<=SfH(GNMqHiM4@0>8ptwjcX@SV z5t=mtMl>_X=upIBAFhR`}jwKyu&@0-1j@_YU3asY+CMk85%R7KrJfpCUl$;0Wx2cF7^(s{mc)d1krd4%c zA~hU^ShgRFN^o-bsily3lrD{u9pTo_iymD4mV1yD^sScdlW9N*{NI$l3!Gh7UFg3b zXU;s%OtL4hPBLk`&uL1hG@+r?Qrkjj$2M&(y%YpR{#-3rK3>dJC85*`p-E|lqJTw^ zw=fNbR%oOs-WDx12q;hG;tRPbK??$k2Col$iUE z_gcS&%mssP(P1G~kX7AhE&pT0cGY~o;>@ezSJAaVp`6iG4F>h8Un*V51poMoVN=p! zR2<1o6%syZ#nGkf26@eNoj2-lBklZthAl*wXHdA(i9Jd|k`Xzzi%2(rfaF z1mYeCBnL2K9kE!17> zs?%NU_B6T*D}%ko7$=@!;c_CP9PE0xxlkCouuydsn2Ts4zS@PSi@3;0zCa5ujvzDe z@hohy|Ij)H5Rj*79?qaq1N^X<4G5@$|1OB3WzHFsnAiyf zDaUfKQUVFs5>UR14}3HQ_La>xxG0hCc7+H7u%S?Cv0ls!bXf*=(k4)M!oQIro;yar zHXLY1tk(PMlJZq-Mmjc_j-0@i1y-W%G65 zr8XB9z)qbAb|A_|(>t+EruS?E6{0=Q$1E?Kf%u_!Q^lgv+&R%eUj1|uB(6ppE}NU| zM^FjaRej4E1d{4sP`Twby?`IT`NO~;?XpDx_*-6momt>eAX=_s1&VRaF9fpSBd|RH zITta->0LH2ReZQ2`udCV;6SJix}{Y0`KKo9Rpwj`GYr2Iy&oMh8Tl0z{E0E;g)@1@s@|NJ7#62cLLAOgmZt{i z)t@-TL%v0C+b6*yE@XKhu`fEs8I|%G4x^;osSX+nZZoPv9z&V<{_QyjucTurGE}P) z!JahGzkA@uT}Lv!95rKW&yT|C>oM*jE4oM!O9_2B*ON>MhdV+ZNxqxf5R9-A#@=tp@^_UTd$-7^YyJX&27b1R z$UJC0Z5iP@gt6Gb&NcO+cPl)?f0Anyt;{cZP?O`cT8b>FnrNiULTwuM&m63obW4ZLNw1o@v$l!P$=L9*Z?ivg!YFko2-ZYWilg+2X1z~z)g9M41iesZfc zB2p-@MbOFUm^`<9+GI&->SY08$wwegxsiq`fKn-%LGmW~TJQH1TtSV?R&;{8+04(i z!Y8#wWoj~1)eXT~2bDth=Q6`U25h<5##oH)3qi8DyzU0HcFe=V^=(jhxkw`=6QqE3 zH968I9JsAEgzFvIwkVl=dqwJm1q?(09N!iUzMzBIw5neK>iF7~zFtFZ=?bV}QE?%t-}4Tbdg zHhuDl`)2Px8VLAfC3F&WnpYwh{>ncx+MHiKow|h|WAwP-vGe_x-p!N<8_Xu!8Nn^{Uuwu$9JIPZ)EJI z>$woPTrqh0z7k=iZ+0Y-%g(_p`opJbJsn4>0m+ zJ4f{}HDsaV6^-n6rx0*NL<8sNxd6qV_dbvZEXuCfL9ZtY?3mP4Do_l#wSZT4ZF zq}m5^HV6Y2-=4!wo%KDAcSWv%yuwrnBReyH9hQ68`0Joh)@!)_`|?p$E+d5W-#*Ub z4Rj#VA6z$qP(%b-^VamUA^i}$o>mh~uMX9u{IrOS*MKl9VW$vmfe;UzJ><`h?6vt2 zE!#y3i~shz)h5_uwuK&00cTb1V*u)Dti1ZA9Hw?tL~D{w%O}DD-N)~VHIhze-Lq} zs$VJw>tzk=PsidjU$5u5EfQdabswOv!`eZ)B>1s2U`Mu-?f`Px{IXj<6jQLQbNgom z{D*O}SI-+%*GD;c_&+t_^`Z(+z|3v5O=_hFmiIL>uGX~`QS znge#VGSDrMUx39zTD*Zs8LS6cN|S2*i*DFgcppOm1zl4Z*7&K|L~P<3E_oHad~Hhd zg+be0ov~YIZ8R8SCYI9^0u78FU8az9fCDr(A+P0kEGB)pTHrrlXF&vUZu8x~hkq9K zRJS7Bv%Mj@xQsa0l>_nFM6z1pT250jpb{FthM*DALEMfk3j!gq38s$Eg#Or*wTxV` zC@}!^Hnxde0c1HuJF1Q67);hdB|WEJbO*~3Xkk>-xUZ$mqul*$5jXshnU}r;WU2++ zJM!Zge*u`eUERr#bS=e9C7~QBr1+TbNWW5bl;HuhXIK|rv7HU&eHCq^@L4jd{5)~hkVgzkJ%hZW-C6o6HqIS|5Tk6W%>y&3po zYBR4t{<^$+C-fV~ifxiHZmKzN{eeJku62GEPXFZa_sr6rpL3lE9r^Cli$|q(`BT}_ zU>ysyl-@tp2186{7-A`Q+jzXw(8rcEQt2pu+yJ+N1fW9J<`a`19kKBm7yBIEiO_LI z{}GlQuF2%VY1d@yTfptcnu74KVAXhFY zJ%Ley#cigpNS`rTpC%VN4Ya`bA=j26jq$~p+WNdd3zTC*$C8QM<@$bVeHwoz2=^m? z44Jzd%t#VwXM=OneFv1Vz~GUzTd1j9O)@SXgG^t7%y2p793E{S$^Z zSVJ61eUh`2^a2?h*P?27`%yuiHji6#e*x~Xxt{57F|}aqQ(uFwijWH7dIh2)ERX{hpVyhhN;q7uL9sjELvsSyge)OLH zqwIs!hJFm*=r1D_c_YUAGl4RDPlgO|(~i`@?ip5;ukQUxqlj)E*C(}+TWjmh)vpng zgoxI><>l`4qEn;Ilp=SAY?~aPH|(S`366*ZyTDpv))BtE9rRgAS}=>(s`S9&#gdTB+JiG9w^YuY28kBikkw zT;%8L>XSW5B_@8X-ORP^^&@Le*p!A6l24`yUc%uc`o5K5r|PMPNU$f?r-XpG2{{&I z&+vCEfBVs6bh?mfVo>{SiwZh>2D6D0DPNyhKYAav3^vX)?R~d~ewPnP=wv+n9&21`i2|KL_eZ3>RyM|0Mnn8cA4*Yl{md3<{Bb9C(yR z<*1f1F;JcLH;N+11vjyhc-A9_NX(>?X+)86@>o$xut56PAF%B8N%qx^J+4FV=Y*`t zv0}fb>mcTH0z+X_l3=Wg!6p%-LV%o9fOMV1)wLNZa{UNd_2xZ;Ee?=q>rZQH@Q>AH zjZ7J_cF1C#^b5h+DzLMF`t-D+0F#Ai%ab2gns%QR0xfRJ&ZF`StTXZg%i5~%U=18) zs6s_0eBu;+Q^(C`b_@I1+wvIcZm>Ul#nGO?)lRJMQCn!R)Yqjx$Tr}OeVvS>hsU?m zhZ3Z@B9%&eMrc-V5j#PwS&hb;$Vc=`_ zRQpBEWOG+u&+{N2VJ1Y5XoU{+TUY*((2*h?RyZ2XtR9I;rQvzxOQm5zXVe)Sy0w6K zxnDACOX#>+)wDy?4$K%|3qte15!wMU>Y+5^6)FQ0p0T(NiI2BQTcGF{SOMXOocM#e zHhuk|v^6dqlPKNN8Fxvq@=XPz!Dsb$b%3qaGr%9G2L^!!InN@(rqyFJbC18QdS++d z26wn3602b^#d^`i2~v~Fj|?Jzh`>(`sohDqf$YIhcX& zOhBW*jtYZh?;V}sm!V^zlb>5G)~Bvgu18umEBZc`Ga7h^etm{>cq)18&Tt6RJYM~8 zJ#e)jl2BT}_#|}FK5&4`0AgVB={?K?R3mHGfE3DkCj0#s;~eHZ{-Ibq>uV;uV{D ze-ns_t@s%m4&P4vkX?crv{O!j)$4HN_3D8rLQpqqyQMs&_5c7`k8yJ`JM#nmn(ojm zk}>f>mGk68@i3vGe#~oMJO(Db!Tio-+=#&{S*5G$Rq9@$uCk#N&`zvRc6efK3E`WC z#|Lfx6unXAo@u5Hv0BAtAm(|w%;~^kjrHkCDW~1j(cuSYhxWa`KKu6mPTxJsrEj;r ze25>XA+G>4BGRCC12X!(es_KLuIz^dWINcL4*l(7^zeQ!G6S|Oe@Gd@F}vVrP&4%W zWj>xzE&?Oz4at+o;x$>z+nst5G|MYa1^I)KE*~>-O8!JH1Sd$(r6ZsXi6ESCC#1dX z5&t$r_Yq9lKVAi{QOE9`dTy zNf}|Qb^O$}d;OCcQzu}*&xnly*qVMscM^biNj=aIa=ILemr^WYqWVWAv@P|{w191| zcZ$WZD#!(5Rcle39{PpVoyOY(&uvbA9)+L400`mQ>grhM&`(gzWvAPb0HE=8910kU zd4#i1v4W|Yg84*IIck+bBR2rnv>(LJjk({YF?aE(}n<~{c=NN(53um6_i0zqwcP%6VO*ziUc3a z^Z+njAh)H(xP^EN_le)kaE1Acp>L(eBTPI-&fF8j-iB6=V*C!4r+tGh zv4{b4y3Z^@{E%ui=(v%QcWY{2<9;tK>D-Vx>PxYJ~XB%%l_M2?uRQUa4tI zYhCA|B2yp}{J3Lc9ZGoMLt{mtD%f#iNst|=VO~EbQAr>|v4qLbnuJ6?5*0$e4n;1; z)pU9HmZ_z6JF;ODRy$Muxvt(5n;UY5T)bfmL2UYVk>*7Xiqg`R2t3Wn1i%VW%Wc#% zlQJ)UhuBSQ6rEUQ_CH4=D3n@aROJ7wd;Yz;=`tDFTkL1c*LX02UN(skxs6^Wz0u8W z=#Na*bJL=e^N24A@0zTlk98yS{2AhfLmePOHI?_!*VJ?;!~Iz`KW-5TUJUd-7c8|#zQ98DNIR5wtv&mwvr zg$#{+W${J5ig{%krKD%YigT^NP!Ka$nopVnv@i_W0?oEUSXz@uN<4N3Ob_+R^+ppO zk6|7o!*W-#MIzo>pEO+fTAe@PJ54 z$gt%Nk-#QRzN{fJjQZck`cyq`n?{bdKzAv++poe1ruRqXJhgYKxhD_@!gzTq#>;1L zQ)0qgXIgLeJpA|MN{?NG*cv-=OJSKOk%&7Dh zjA`d0XVHP&xOJM?cYbziuXpcR#UPnQj})u?l^9aPzXrp%hW?zSz-+Se{(46#ULOQD z=vyn5Ay|chh-94xdw^h$F@Cn9;1~Kpw?bS6;nj#Xd|&iJpn{#Tn4Z5(H!JB+7lk1iu3|3^+B)VaAF|{mn&$N*(^II=#7TZv zyW<%OwWvr*wGo}+%bn?GA^n(&jfbLdJ)4SHI?{u!u~{Tlfme!VvgSQeVGL1)>5sax zi&n1+)ju4-8^qWKi2`r%1%cAo?7$s)0s@_b>F1&W+XxEu8T^n>Y=DhsmY?X^nR)F^ zeF^nXvuCEmiLCK64?`#sML$rl4f`Qx(gEqlAX1`wSsR>6`0Z$m)rY+m?IQy7OfyAo zvo+6R3n;8FUBPD$=p~bu+>kwH>7sf$yR-SHy52jnvR0Xw_g?8%D=@PJ;kAv}k71pI z;^LL2-2HNihb@I|m9dCaxf7gCX|rpcnwWy zW^?8-P^DzQ?dRaP8cf^Q%6)CIHMrC-=!Y3HW zJ7Ew?WUF5=EeRM%UJo*05p>+GGi0~-!v&oF3%DX9m=J7C^N6(Y)ve<&&~8%53DeV3 zhe}Sop0PDkV3P#KltXJETVDZSLzuZvbB6d7X+|er?JOe(#0+EJc9HEdhoVD6G3G`> z_5*uYWA(rDMIFXTT(9y%aru;2^90XW(eR+fXgLy4$F|&Qc?>aTj~30#CF} z5&FCWORxEL4YVypK~n_inY)&Q^yD(^0pUJC4?X6fcbkP5uW7=1>W914UQm6(`nBT~ zO$76;;11_uJs!b)T_ggM89St1EkJ><_BzI8OV9bQ$08YF6}d9^=kOTQyEo(Q6iDfD zrD5ti=2-B0JJb~>9I`8_i4#*fBY)gpZ%ogNcrKXhR)M+BA=bw^G&c^1a^0|};Ab5B zewbs|0?gWaD|6m$s5VYFyF8_K(#ah1z3Viq> zk1S*mb5NiZ^W)IVX8zs805Es7!JlC6RD~&e{rhlkDG|*6XH{=X#BJ4SNYXGQH&ROv zyhxNljX@jQ5GLHy)m2BG!d#g$wsqY#2#pL|9;{u3M&9e(XFgwW)U;hj2$b0jNXEfTyRx?TrF4TUh#pf?Xc4j!8j& zB}{}(Wth|a$~i}<8;&9jOj&=8O-2nKbx|-sU}>z3u@rYA#5(rRu-ne)B$vy218j1Y zgAEriHJwvDhc*4^7nQ}1A>~}+sRnjBv{Wtw5Opgzq3ds*hb7ZknLiUGyuyPf zT(hk!=75eP(U3%+2z&}jg`rU23CH3OS4*ETXDOkOe< zW8h>s5lzO{&-lHGU-bmqnrvpy%l31tZWs;Y$G_S4Hcc*!oF>dv`T(%~TF&W;(C{{X zu%zFd(<$1jIK;=s`qS;aY4dLkciC|JY$z%gFAQN5;x1u<(;<*1SdRyg#nr(+aG~wU zQ2dna6#rO^@Tjdp!(;HF5e{RkLSCUYwkeg1K_L~k(6n^oJmjl3fS1c>g9}<_9bwQI zrHrNia9HQ2pgnQRuuRt*y_zPRN}Z)0$PoGKx4o-QZl~f8(SX zkq)J_rz-@WKhfg*L+$Uq?Js#;aTuOc+@*a4QyS#pu_f~@W#E+Bg9Z8@a?Riea7p58 z(O4SzS#P5;>I*0k$upo-G9I#trpJGkV7FBQc_ZR~-M2C{jbL1=H1!H(9TLBDgL!N@`^V z@G0)WsM|SJLZvPA2KHa@8of(H3`>WRJ|V(61x?9SM0Pm7K(I9r0>i%qi->6{dCCUC zI+>iDck&AU!ndIQQKSZSVwRB=MV;~@%2T03+47vIa1&DP6i3f$$eFA+ol{)O4~*<0 zeiAEzAe(Q70=c*pyASQ9Epy;R5J~!!Z_Z9NVB%|T`MA7ir%Wz%_E;kMaBh`DDVZXm z_J@zwG-Q#{i@jflEB5MsgDJc~lVo~?*}73%oowC&;Y_kJYPd!nU}Nz_gusl$7{v(- zy`!-TRcJLX3_<9mKMpxcGE_cxwSvM15uHj(U?mHOn>X>!%*YXFz$+-`saw1&mXCgy48;J=R|XVXdi86@P1L$}I3RYdi$m!Dt2m3<+Tf!HWJ; z=H$I(<1%dLJ?-zE?eA^;`q8q#lzWp}(KPj=u)sMSe^eu3ep8`p&~^Tr+{!phV{+JE zU{JuxQMOOpw9b>cLARCUA*7mWk{-;}M4UEbQa;`gim}!038CZaw#MwkTynSRq#+*P zu;trX+KzHjpF%%;@O5JA@Nm}-@go?XRs;x^Mo1+PtVP3Geux6;i_j?<25k_D=lHwr zh@YCz*VeNU!{g*{{R~q>OE?TV`5Ai6Cs18b#%NnC09tUiET|LGu7{wae6Ogm-tn%*OM7k{=(l+ zj!{2ZqN}ML!A&9~*@aX93@NW0yz%%d;V|kc^~1d&EO4n$+PD_&_|7&;Scp!6bH19b z5eSHK>hbG1fnDoGz&j+twD>WGBQdd;j5KO{zAs`5aB)0B z%#t5t8RpFuq$K9UAtTz^K}uV1j2J*EaX8X{AV;|&Q}}w#Sv2Q-NBfJ(E4HaU#i&zafB+SpzeL{*6WNgr|C*CM)$tH0 z?3t+EN=3`4SF1-RMlTIc+jqtXBein3_@6LbhYV&8kONWd!T3_7pdGlSK#a8R5m9v;k>5MA ze#=;>fzo_|h%oeR;ot*Iq%9^Kb>C(379c#DU(8Or9&V{#eS$!{t>T2%&vX(GM&yVj z%AB{yO9-MZIWj!@kA|dm8eF0R=P_LUvuJRUuO>%C)j!-M^|4M^ho6X zFV-RfLQ3oS8mqx*NcEl2eD$>{qI@oSVCK*$p24t=ne%0ixU3s>>X+t%8ISQE zPch|33Vky-=k9f+Vm3b|Nkzul*;TQ@5_YY9wNvNHFKiFJhPCdnNj6G=;W2eOzA5LU zJ6Tb~iMm0GhEr2Ougw5aYJx6=_lJI%jOsG`LajyhPcEDsj?`q46wY!q&l^R!Xx1Zp z4<5WZWw}BQR9t5Zd#KIDj;w0l?qMv*ji335R1v2h0W5WYyVL7kL+%Osmy@Fq?puTs ziPfBK@U#K<8X&@zJCI2}FIxbV9-GFUYV6f4Bc?<^srNNbk&iUVb`yr;PtodL4y z>yhuW(|bH9WuL53`fkCMAl*|-M>1AJCAsJa!MbkiD#=@EAQxqlyX;zFX3SN;W6aS? zwJ3I)M}z(UZ{TV4HRm0%BP=?~o9a@+wC*vT6@m>f6|JWE!8}By#NVT+&{&%YEJz>0 zdU}ZdF=H#by{l-JJzc=-p4p6aCS?f}Ajkc$4C@mk3I^V}XOQ<9|K>>k#4wZQ10VJo z1TlFek7Fv8ZbUIyheo)J2EY=L>;&~O+r)=RW}U}0Kri}PxmbYPTETH>>Y^-B>mwsU z-k!peY6gQO7u6eQ1Mkb(>{>(>&7Wqwf$%etG1oeo{ffICUW^ji2HEer-@U}dS!;G6 z0Wjg{CeCG}3t0FIurcphYO&ABS+Y=E*_>pk1&KcQia3g0d|tMmU(VOS^izZW>g8aZ zFjub2xMn9L1eGE;Mz$+pYDL?>MT6gtL1dyc#1 zheknCX)>6Y#CTSHe2i;?fRJLFIH+{1PM3Fsf7~iNvUfB85PTPkJKep57>@rNdZE|o z(Cl_~#fxIJ(SGLKPbo&!$GBlTkQ@P%dF*FZ_fxH&jx^$s;j_hQ5~t&$WF$8?ARtMJJKnm!(-$dJ*GA$Iq!?!yS`aAO?b zA6mRQA5753o%p6OmICD}A%@%G4ygv*#yOP?YCQ}vk8ZU?%a;SF;bRXixF!0-~F=M{`G~A83INZGtUj5@x zdDLKgOPZOF1wYxQRxup12Th%|RVpWCTps5cwO0+0@K@6m`|u3*NH|qiam(O4IueR+ z&St?lKlkK2iM1X`N?J-p=};AhS{!{|kxz-uMR3H}T?EZXdDP=5pVVYrRMY_x;Yn$U z$zh@C^YgR(oiJdv#lXzVQl2I7RFNtErXp5(SRt0}uunyv@3X`PgFx&gJ4%@kttn4Dku3Zy?4fa%5>Plc zOd+#?^Keh~(Q#N_l)-hAY>(6|+l!}d#q>^EW524li_{I;2s4J`!#j0P2ij3jV-8*v zbsTF(nnAXb)E^RZ#;~Z#+2I!6=r9p)NU6O5tpKL6Ai7|TEzwCQ^gqxjD}4wKuW)kW=*$H#9*pSnU$KN~?x@1La(_QYEp17TtP5^B+#B zhL}Vw2vGv5GS-SJK4}#Tu_yeIt3ZMnVcMsIvDVBG?jz}XZpw>Q40cO^`+3Z*>1I~Mz3KE?V$Jm@>oSDJ!H7IIF z)@7$TgJW{?kRQ-KwR6_Z+G{aLb0V&ZMHYk)q*+JI1;@Gi1G9?M4;hQ#PZumDM z!{8KxKY+0L)s;4~CCEjBzxms+hE3B+*dIDHQu8*=Cvm^PbZ?FQzTVDhjAd(?<#w2o zG7MNyCEjK@<3jPQh~1CyVP~jXT5#)8{?3%zW~xc%h=FR9gsJu}5OKmoht;sUkCS=K z2F=4YFaK&psOq2p;&+)reI01l zfgq_&(lw@()ZwBm1zRH%a6Q8vXn?b*ngt~ILmBOdE`4q5kxXaxaBxA!OIdCaK3W<2x9pjHv|&MEd6N>2!d^2ksF6oJ#dShLaff6)qfwXk+`O- zpJEa>H-0v6Ui4WvN}YA-pq$5N^s-On%`5(qC$WDAlfs(jTVF$h$0`W|SbD+zOv1dd zF~xA5iKW|E>-RJZEC7*6?w3;?0_BRd(hs8#+^R>o8`AL-zCglO6y^kL5>L~534-RT zD`AGmwHN(e)m{k`HA_AYiF`q~a%41OI=vdTKcukf<}-goMW(!tTxh`*Ljofl3nm)aLgu-=}ryJn-0@c||F+_L^KlP{18ECB%`cl(4FEz27RD08r zT-(N7;~dYE5>|yi6(Wr&9l-uoh~R-LL`k0^U&EKO=BB^p;SPK$u*iJ(eD$-TzQVg~ zZ_=G2w-hE1BliWPM|Ty_8^t@7@y`he$9y(+EZA*wsI)eEt(Qy=$h6N zqVeFLct(FhO$7Y*FTj6GwH zX7i4m9MSD+Y!HtoqH|bb#Z(HvxGJt$mZ^6;U;GV%7%vN#kzA^L6NFGtcy8O9xW`{q zgc&|>?x$pfF^JdW#5e9LZoG0nzDjQpTz6zoi3cu-DLWn(255HGV#MvUnRyXrLGqJ{ zVv&_~%sfze@*R5uVK77O4i(Qa~Y|Bcy;8ti+XFLWHyct0m#p z+-yb|qttzRc?asX>Gme}@5*0Tj~%#OR>PZxVmZG;cH#tC7A-NK5M8X18M}=)y?crg zY(p4_zjXYQY{+;n-5LFtBh2*3T;2Xxq{|W&iN|GLjC)T3 z?t8t7-efPI@Ew1L|Ba20kCVBrH#Ied#FR!IYQe;F!=j*=M>jK9@Q)I z-kXbJjLi@QtiW>5_S6C@ADRxI-7lK)q2c9OjNZ~aNeF?BH!)Go*LBqeXvADFBo8) zlxaZ{N$R1vtzq|39k!Po%%&zq!^ODn;Z}jP#7x2te)0U%Je* zVsRLAk6h&{lF#Oum@b+Nu4W3~S>2rvQ)SY{4p@pc(>_&u20WVPk@!0IYGik0m_A%P z>;2AnI`r!pUW^WWfJO2=geHe;4$-$GzMjR;J3h&HUB$)G4|DMhE{0+h-9R8AU(eH2 z{1mV|O1(#rRT|25* z7ka-GEZAW#o=eESWLH)c;R@ms2{>V7^K4i_XKPgyi0c$gwbW&H{GhAoTX}B!;ovER zbR;!;9ebpKeG!zVr}kv0LXBJAfh?C!=`Rs=1Xpk~)^O4m03>}6bIo4g-vj+UK?hCK zWfH+>kRvXciS2)5)pDvlIvj7J65VDj0?ik1&Z|!r4g0U0%{*Z$zOUd>tSeFeyzC0+ zR_wzlo4c4}XnNo#{-^c(a~@W&L9L=^ZqY)@_ld&+o%4#pdxt}TfC0pLLzVpEOMk!N;Qua*Rn#?n4v zuaXE-9gK!5RR8f2rcaT*KqBKf66o7%kf%L1;5c$jR;-qGL2dQtV|qtrPi6CqbC+08 zL;}Eveo9u8SN~g|!@HNC3-&ST)J=(eB+V+?Z~7&fWWLL4N|`5#?qhxX;VS@XVs;G#Cvj{0v3^Zt=! z&_^tlIS}%->^pV!I}o$&j1?%|&q)iQ{U$W79a+{VmrnA#PE>C!2V>46E4h-=M{ctc zwedT`?>td`v{)&@=rphXN4m72#4MgSYYvRDD-8F!|`_TY}@!$@4Ov*)~$rc=*!1FJ|mqGBAv#_jL!9O#9 z{+`Q1I$-})^O;-tXk|Fm{X3^ai6+B3y?nNNJ^@NyvaC-+LP$L4q#qL7L9{!m)T&maq40)aaQ=q^R1Auv~9RLFU z5jPUvo7gQ|y@vf(j=E!h!f~UuGDx<#YM`Pw4A!7aO1mKHqsH$FD#;xkJS=G~0QnNt zRM+gQK8oXbEx{&?APLx)`jeEC^+siiMZu}+dINAcg7EfO41_JM2SajTS;FpUCThJ^ zo1{b5Jpv;fUH2L0``|O2s>K*RVK#%Y?V&;VUjifOcH|R4)paJYxEU%DCNrx@gyK~6 zoI|}@Hc+$;l>4H_v0;scpJS$vHOGS`v;KsGOofp+Stiaj!0Zrx$gOx zxdgc)a%g#nKI|3Un7o|MYkOzK9TxTHa;`Yc8XP z2xSKo^;ERS^L7AcVn)*tqjc?H3@Q%2-XJxswGcgFjt*4FEeI?!ri!sTb{6D`eSL3LF-VtwISqt7 zYmGO(mBY0-SJ35euK7GnRFQXgGjq$S=DyrtM9$P2!#y(FRp}PM;5zru{bQPDYHDI zjl3>)+ehoudkxfk8QQVESP%^q;G3|{p`#46*~Bqld<4ZKlxs~%9Gr6NS~s_)D9TP| zEm66+x|d>gF7h{IJ79A?qt-+4EZ@1N%;TMWeQ!ni|39j zr&+A}Sp(OzVsY12m7Q=uBOy^pA6FaF;}pY=i z3OAb2orh4Ua-|#z25@`wTv$a%1Cw<=@F=>WQ#2+n(1g=8V5y_YcinH3hyo4-4gE&! zMhpYx*&+b`$DSCc7=JNu)j4jWx=cqX2Sla&2$@Mti9Kyt&tRgulDvw{zhF{ijAKGe zBh42%f(36adR)`3{wKYNHHg*0HK|5~WPlOd21qCSNR012D@Ck6oSeo-*xC^P$Aagv zx_UU`;>RIG^rT%f`Q0~Y33`{Y{$1bA#mb8wryaKvN=t|3<`kRD<@!F3F4C#c)bAw(GT{v+vIJ~ zUvmp~Sr@IC7+EqKQXZbe-ye)-=CM+gi?za9bedPAV*+1QtUCPx2DsGEDM~vKn&pw> z`1>=1@@n2h4`WH5W<6233y`vA`D8=BsJAJv#R!3{AK%QAGbTRoeCoi^X&9&?y=c( z0GO-#vDtO;<+i#|)&dvI1fE#iryPKD`0?f{NI^=h-i?4RI@;kt=u8^#)5Fr5FdeAd z5c`dvk_K^(EHll)@05Ghc(|OnHtx8ZyOwjl^K-ILg&~M@vS-*HdpJJ#Yf1ejKYwy{6TeP_cp5i;I(yVD`{O4>8K6}unn?s}iFw?QlEe)okt9&(O@2+(TW#wJcXXaJG z6`f2sr8ku~YDIj`(Kp9c|IShM61FwRQod@#)PEI+U;%M_I3Qwlk`B@3VWrL8qqe~B zf2G<9nR3K=V-107(7+@M7#KVWVj0p;ltDCNf$#Rdk`s9VFwEDiLu=x{h_x!rY8HZ#?mSzoMeF60*_HkFI>h%RNVJ1;xOpYte7*R>uECqAFx-EKK#r%x}MbeawzkSHW<>bf$5>D$Mm z`W#|I#5ojf=1Nt}rQ@H{62DWv`ZY}Jf}J$M>PsvFW$$wn#dtDua%kXa&E0NwLyrhC zcgPOO0&4qbhm%_y;) zHySa6pHVdU8D|=X2;>)>h0w0_Fwg3LO#r+vt4}ccOc_48Kd)XA{GaQ^$d(^czp{nC zIE^{1|0>PR8 zuUEA%HKJunn2zXp)8{245K<-fCP@V-E<%XWN3olK@%1!Qmn6v~2($Gdv}OcI1|`;y zRvSg!DJ?xE@<+HBzGnG@@47z1SV2N~mxkD67Fp5OBrYeEz?g$-Zp(KsRlm@6WZ_dz z9hmoxc*kHKF0Op{1I6JvRaMRiM?Ji?AA66; z#OKB%i_*sX^&FG*E&BMO`1eRSWpUWHZsS)w2nvJI)=bSuz^r)k&KORFytU~pNeiougWC1#aGE^&g5W)ODK zDLI|X4^sEp{J_|u8C=MWF#LTtW=FF1l)WdmHPsAHpYAx@fx3C!hwkPRHbroKwp!W( zA7-5Kx2L+#h0P6W%}(PwiE9Od_OAC=E{=rd!M1Tti2w@s@s?bRoWNO)ABD>X)g#(5 zJHxFa^xPm{O9@_uZYGt~DCjWBJ#nOkd>OS*5e4%_j9K+9q>iF_ka#M3%m;mVpNKDQ z8FIZa+^On{XXc^#X^AV$PDCe)drOjmk<3|`W zE=}Ps3*7ZFZV?CG-k{?F;usaNUBL9e@Re2A4MY&zw?uB8gGZe8AZD7_<-pIHdMd&^ zIJzpZ!*>5RsYAqLvEg>lV6vW2Q=E)OHL4TET2J#q>R1i=X!?+6M7988$3-PBX0*`g zL-WtCX>rHg*Q%_;n+|GXOZa7yYJM3ef*B$B$B5^GemI@592&OOfMWFt6`i9Yj0pN>VuV`adeC^b$M{pirz>$IC* zG9*O$DnWfFb%|Rk7v3MTIc_LwFgU+s0Pt6pCMJ(w?gFU!M)VC|snsg8ZISm)7@uFbG|X`s==el}WCYiFaz*6`hVDy(>H zf8Ujc8X>bJ_J%g8`LTL%NDZQb0b8JV`D1Ah1cXIZ`&12c?ro-5;?!;mb5>o}GT$G7 z9C!m_2zZK^bSDDzMlh47#v%o~ql_!MQN00E=RP}F#te_CT{z}g)&L3KL+uJE>Bja6 zLrQbM^lqV!pE~`J5SH?Y;y%oFQj&I==q!h!nA(ggb+A{0oTSQWJBjRjLj;=zes|?~ zlx@dDapQ*i8A-O}9_$QPiRr}f7n3Wigss4*hGJsP2?t_e5sdb#KM6|&%@~2&`*AuK zgXjD9YX!HWL1h@O<}lQ0*Pfigf&{2ci4#P#d#j~>zvinL0Ps4SQ4B4$_x1u?Z~%jYS7(P{gBmj$awWaiV<4g>U8CaumxQ! zV~26D#&_cse`-3bM}QN^ccon3$N&ewkAmv8&> zyMN@#QIYzRpVZwK3JX}`|5aZBvFx#s{%|)1b#Rp{=sN3HW^ur-LdXkO>*xhs=e z*y%lxon$3K{AFQ`sZ|4(1Motr#jAX%tEALj#tQ!`BbG zx{QY!B^@DZq3%A(H58&I9zp+J8hTf;=$#U(^B-Tu{<@3f-2z92eEjx7kxZ2;oiKQOB?1{ zAwVE-w&=eo^&C`M8{-aNsBY?7z*qozfgKT9cnv_16la%f%vf}gm#HB?kWNA+l2cqs zk1+YGpvPVyC`OdQ1sa0doEX(-CW2KK%@;E~!jS;W=y8Xa2{s@cM`K2?1vt%NXw$Bt zyBxS(4>`vvqJfa$r&y%!NkhPk!zt>ZI6SB<{j~k{TB*FPW9@fW!MCJ|O*4U3t3gMx zxky{W+KtG|$YPqJGnv|Qq8oHN`rc(yKw^T~VIzcVHkX7F6`_qHk1^JWu78Zfmlvt0 zaKGjkQ6$IgajPYY_b_&)?RYUG=OAp_7*8>rtWYcyAP&v@K=pPOf9{wu)A~(#=>WE) zi5xkg>_Y~W635N2@Ie6EjdmBv2@PPtNg2np`%9kX#bP{iNZX+WoDkxiD;Vx@LlzXW zB_&S$NY_NfWf(*WlA-@M9CTXoGR*v9hi@b&%NsgGj~0k92w;OYSCxTY7Az=s1~Yf= z-__mEhAKai zh6mGtFr?8gA1vL;!p{JAg7CM+E*=RVAU_Qet!bU?C;3%Bv z!or*k2YR5H0b^(tF|P09M{*Lh&QRe;tE16 z8QV>X8PC9eNI7ydrm&9mq-8#Lw2be_&S)aL67+nQVl&@R2_zQsPk|JP&4l|pw2aH* zvZg)J&D;Z{_6|^^rZBfsx-*bPal!wKFv%^w-VJMujR#7XEJF#W=@FS15n-B0O~8>z zu^7eQiLsF3M)VXK{ z+r4vMPP@u~j5CVK%VX_I$B zcs!z4T|v&$%%kP*he5CL)usKdfYED+<^!8kXz-!!tR=27c7I1|+(GvWo3{r%Wd{(^ ze=FUnyZyDJu0YZi`BY4kmS3VU zy4us<+zeE?gMX{sZo0e;xg`qHl?g4}k4w(SR25@n{YO&Qnb zq6%6gW6^-Ugq=vv%0q)Nr<<4Y@8;^G*b7Iab=(KSc5^TSjszrDgv%IZ5656+?VO01 zYNlOlpd_2s9(G*2WUuW+HrwxN*Gj-(WMIYI*fs%rJ*UJCoWz1@G9`29XeEtroJke* zz`?$bSDJHWORO!K^*6DPmgI;B^Ozu5POde!d?o}KmK@}7aw!BiP}Ywin|kBn{>j!z zCf&n>lk2TIpljz3`d@QeGhBN{vLcV^6*|DG^^MK?(EPMoKJFW*NqTQ4W9T&&>kWF6ngq{^2L*Y)+g&PA$^kqaT9<(asU zqtwYXN4e|UB4GgMa1m)O29o9p52Pb`b7~sVgk4ZcP5e9JrSx#^!tv6+GNR#6sjKPEFdjsMpRRL*s#2YVzdykFP zvrR!lp(g9~;dW`+Mvj0Ws;_{RSZ1&&27eB<(xWgUDJcsIYh(41kohqs?qb~=!JGi` z!+!xh>J<<*;{aEiTztkhB*cy+iHWv4D!3}1QoCvPwTr@?c7`1%i2!5|j~6bLNdaP+ zG}#<&)IB!%lB0cI8lG+=Ij4GW&cmRHoWh5tA2J6OZ+*52#{~xLqxw zsY<({j>g&Zm6~&0KIHym$r7t$TT@)kJ(fi`uBykvf8xs89T@y>l4+~nkv$U=PZ}r-4>{8}qvPd-oNMs6K zoKsvEgBoS`_MXY;C0Z(4GXOZl&HtLN$@OrkLjrCyc;T)iH$9FODigpTi&&Z_M(;C> zE+uL3PYg$a$Y27oMW#sf@sb?tXTE>bNU@lD#3Z{k4a21=vJxy3VK&Knx8_&@ zt#DgEM0&8DAlc8i^kPT$G^pl0{=MZz8e$SX&rVTCAU#cZ3RVwdu7X*f0M&5 z-cmNNPTz&nk-lqdC4}HHD`n&h_Jf#LI`h0? z!*nLz^X5bBM~S2mPCL39udi)qh zJ(Lo&@5j>YyQfo@`!%8#`yJitYdEIX?j4M^lyb`jJQ;MB+S`MR+!Epu!bT{^@RhOf z2)8AUUAP>;c7_$i7h{*tWbK2DZoO|XKBT+ro9a5U zvwTSGG)L2;&$N#Uz`Y&b*&Guw%^h3zP_)jMmzPC-bJvzVnj^<|?RfEiywS4ZVn4S| ztBD)+T1*T(d-H`aypMKsnpqygf8damJ}PqT!u|IN`XPWUmIvhs4?odqc>-?cVSN+E zV0MO+Jj<%=(D%19KI6Z7;i@km_po0+ZrLvn@FhCTcQrkEWTk?m58E_PtpNX$6|6Kpxwz`fhi&?3 zYWjMff#LzcCc>hZ~ak7~-dgDhv`qMjq{Qe6MwbXj<4-BdJ+z&1fHt{qO z&mqRW-ZZ3?#~m7+aO+_1qPZOx0sU9*`-#4%Yi=5?ijAw{rgtzO5y%c6ysp>oe34-F zAyZQp{~d!WSJm1-0fJoJXn&(~deqQ`&r-9c4n6y$I-t+*U56yaCc;|>8AM-Ty=^vJ z3v0;Ux9jYiZ}go_~nfbGI_pZ?*T<-VSe;J(Ew&ywdN$*X}~C z7(?0<|IKSA@BlUCQZx6{nEx6MiI z5&%d4;JX8gvF1pDL&vs-_0rD%QTwdpDE7^fcSfqRyL&Nc(hvQyUPO1)UliAFGe?|) zSj8rg`4`(3Hk~GWLLVy-RD(fgRBaL!3D3e7FLGAB0G<^*w4hDb#ZrqISFFA$rSYPk zNsa435cn8h#Dd-2OXE;`uQ{{sF7?+nJN+?t>gG!^!Scg?VZuBdh4yps&PY2{rS5Ec z&{_0tbF>sM#3kTFh5%Y%pY!-bgN?@%!^Y!@VOa130zLR1goAJf5FnI*pthg&#^wH~ zn+eCZO}Onh%E8L&c;v!EZ)%&VkHBQUM;-* z;0rLzU#yb<0d_S@L+BB%v4K(C0bSUwh;~_d z?pW{&O^-H)<(adg&O<>`QauG)R#6c{9Hc~7>yAtZzYtn2b?cVlly}O;TwL&g2gTjPYW_>q3RKK5LHV8>5e&q^^{b$Y zK$4*}2Xedg0ZK0uYXWB?t0oR2&FIzB51ieNTp80Mq7H^2KVB}&;4rcVLA8&wtewt8 z%tATIlnIZ7OW}Z`8M$q9%LmF3qiIuDTjIY%E>n+R613IFi3pP$YnCyGcN1g+(t%0D zyd}bi0;?K6zC(70g`4HBtz$UNms`MNU3depd-K*ic1F3JC%S`Rtt;`O;pfA3!q0hq z9FQz9!-~w2d{;*=94R^W>eQpQl8y_GJUopHj#1nf5sxQ z`QS3b6OfRgOkb|N;}tkgF3GZYLyq~R4GAjoBVEFL;)picA?5_Ef{a8_osCRfIMv>C z;1b@H7spF*cjj(mjrg#*gwa2ftxlN=ih7jqIvL3fp82uy%W%V`dOr1;cYTF=X7W){!Anij>c2gh{jfggAtOV99-wjN zDo@Q{zyDM`Z^|7HjxULvVSAMFwyhF*^j7A_gAd+!uyZ-K+_#RJN>AU=VI!gN*v+*! z#zXY4H-F#_50-ll@2X#X(|s#7^|QN)rs4kRcXmDMOBXUH{WGj_arv!!ct;P8UU=xx zfR(&15AmFTQt7w+{&k<4e8UG3(BF04D^C3I-cMY(eCVRiH(&eu*T4QRxTJh4chQp{ z|M_)a|2@k6Rr&GPJZtwKSnfw(HF)*5%RcSptDfqAU*vL`uZoMVz2N7+?;pSatB*TW zcb1pyG1OPp(yVtbhM;n>ScGa0Xq&|9mSKQWI(EuI3eCYg$~`=-vpqg>A!8JJk7naR+w3~VvUDZo3k~kf3w79f{_ke%KHc>bD%^lIxbQE2ahaw zB9VNnX8bz~+1r)3EfW7_BQf_IjQu>Bzw~x;1kHp0_?;5<80W3^9Q>#9iP%PhmR}FU zvB1Y4v_M?GHeJ%6<(07;4NJy2$%f=b|&O-n0Fp_Z+(K&_!?f_Fp}D$6p=3k0Jf(H(c|sf4b|p zyxhC#l<)lh-g~|L(BHid+W07!a2su6!#ZX^JNTRP4&MS0e>ZdOw##4e>lae`Nss%~ z@=wmZ+smJ+pYY*NUVOKg58jyl%C^gX&&!#hn?L2UkDYCVTA_sY^5sLfVx=mtVZe^Q zBP~Sjb5W1f4ZFLQ*?sFEn0gnsH;=>tp}jbd;M8JKa;W}Cih;)vc)^p+FS6O+f3Rc*Fe_L%2*`uT zJOaJ>T6*kGGG#grJ9j%bq3aL+++Nma9!%`x=dL(n9mm*M^S3uV4TBD0v&G`BTRJ8` zh`APV_f(@&gO*l&AagdD&C>p?A0C%`G1`5)jd`Xm0rgHsSX;&w2GMYR5LV(?*PI zJ$l2h9GtjGe{q4ay|@Dk^Y^ay_W_D|e-rnnvv0s2$E+~E#|q5)@u>XnM>Ms%)NlSS ztcFKlTKVwL-kTo%?dXyDyWrcVE4ZLoEEXHPJ-+vv=Jz>bl&SwmukBSY&zp^rYND1) zc8t+d?IQ-Nql@vLDfiaKce+4}>Zb_4!1UG8?pqHWcgl~MrlEn{=ZQXgcaCNEG8aNd zj4H9|iy9nA#BWhZgEWiizUtE`InW@6Z(7dWS2JIwLkLrGEbG;cV=yDXO(DgFiOBp$ zo_hr;-*h1m+UC|dOAVmH^W5j$yyowLjjtM#m!cFkul=`x6@oX|ufXvWp0 z^&%DGh#<>)^Uy%e7(j={-QvTib%fgLZQb4rl;j}bI0S<#cTE!wWZ({z_EQv}n#Dex zvr`b@p-rPjh(a)Ojq#(kU}>wXHX_(m<0UCMhzUR>r+56Ms(2GQMkcE_=Kld)5Daj= zypy)TA0r~Xvn?w@L(KSFaHulRN zM;<-HrpVAPRRm1te6Fn&6#y8-8S{Wek)L5YfogMCj6IJ}&Xh zX3X~H$Tx$Ywi5{4eD3o__2s--(|r2zV9C2b8}591b=@31%GQsAN9ZrJ-4=+ggR{b`BDI81rr?$>Q&(ZdZT@!H&arQSy14x_>9XF6|MxF>UOk;TcA$EmpMw$n z++*-)-25Nx6l>G^Oxw6cX!S}AUWle3x!{~lA&9E;&UWu~JK^KIafFJjwqiIZ$G3_FfkbIU*HF)dsL zq1{lo%sYnVdP6yJp@Wpos2<%I+{mIcdPBf>P zCZ5cL>=QfeL0ukOVMd^+3@EW=%L&Y)Cjf&rG65qN$M@{vcf4N1@hGMgShG~UCFg|3 zw%`&$&x0wJ04AQr%z>9CDpW;^q?BGw{>Rzt(9TaVaJ}kD&@;>0jBIW)NT?p`-J7@m zZO~WkF^|_)bQ#7X#>TLAXd2i!$xk-G-8_6~G4;c*G3u^(LJVXIB4G_I`?4 zNUhFZxWI`R7aD4lp0EVH;|yd_ctFGz7tP7L<8xoT*Aj-4)95Yb&te8>?$3U9p9k3& z&DNzCH*(6HFc}vZ; zm+^vcCRe^Wc42=41h=nUJ5#hqmTg-+1ksMSb#qsDj@&)e^DaHI3{|?`pwpKQfp!;3 zZQ`x6PBs?v2>4lNw~xT<@eQKJdD#L#tox6wbD1B)iK*iac?KQi-cVMLD{|dNVlAI; zzk3<)39up`MuVYXkEU(T2qH$<;8p`1;c4+FO40o@$YhsiF8ZD3^9UrLHN=Njy3Lok zGmG_h{h%FoK*-8+#aRd7+_bcCbpclrP1)S-IJ9F1LIc!uh4BLNP801($ORh{8%|j& zae#=XtS@r+aO};rWQZB8W+b6U`2}-@4~PnX zzH=!S30@{RqWHp|>Mr8L-RI!G!Xn~nG<~tBju9&s6IRORNY4IMR0h;SaM$^7^J>mb z{sc`mWpnVRLY~(La;7{XWB6BQa$E8-I#@dI@)A}>*zZ_#;a)!KUb7Ei)3lT(+p8WNk!VRPh`V#R6B z#XLpv|JB_By5UEg6S}kNxuPu(1g8n^=Gw8rZ7KqoR2YVqQ_*8VlG%zQ+fKD9%SRjK8EoLmEa9d}{;& zdU!zaM1(9tZii0aS50qWtpS@_0Tk9VK~p05%_)SaOP4`MNdO$y%JA@+_41{Y+$dSN zb$loo@CIhLlgL9=r=7OJ>Jltd5Laxt^1G)KM&L}*Ob>-GRb-MgGJB}zK~OzqxBT6A{8xLt;*5*CrcJST?LQ--1d6bZWO zam>PYBk(q0i}w()^(|l;ZybU-0o!o#3`~^COCU#CZ`d<9k+1~ouoQ_GnhloP)Rx*X zIEjaw0E}(Ems4g-J;6}#mkud9021-zSxE^AE@ z>*_f$JtQdF0F^;aoPrwEI>tH?I~^d1?2Wor&s}oo#JV{hH~tbBATUDaG>AnH#py+Y}k(k5zmLRBc>>Z&s(2+QUWG= zr^a#tDq&@Cu84EBX1AK>FJ$*VZ1>{cr*euhj}K~T*p?NG^6gU`lM%1(D4%*burJ~5 z0z#ojBzWvDPuX`3Cx?+UNU^Inp0=+J@X86x>4oam$FcSdzP>pbvz4@U+)H54ebzqPNl1pti7o~5xSE$G@(s$ zyuJFP(;*}f5P_?H8o$f+lL`qTga|==;K4^9&Vir=1$l@F*F>Jm!>Ay5 zM2rHOBR)XEgM#G#|CnpW557CW z2FXTPNe_Gb`SvYJV#INZ4|{v^y|Ztd|CX-t1VK9597WGxm!5j0;%MRF-$xgk*M-}T z#lnYG{-G9WtQ;b4$PWC`88&|B>tmzglT@1BI1j50*Kag81#b}G;R*JsK##tDo#Q-u zlZt=hR3Dp*KOZ=lJkERhAS+l0KP4ikz%uwp$o~EFN zUu9Z~JFl!OgP#*!?zW)%s&GfAezFdXV_2~OT!A#ta?Sy zZCB0j|M4JJh>$0W6PtD6I<0==NcQ9{46fwtRw?6POBJfxYrMqKCu#XNEM6jX_~hmd*KKt-n!yq&uN$nGtjKU4 zPHd}<_JBwu?W-7RpCA_)%ZfM;5hzr_iy~fplB7-KrKQ8v(C)a8K2RsKKFA+hIyMoN zE&u?YR2;5_im+w2Q&jhmxX%tV6rRhoHM{{u^%pQ*`R^(C6B1;&Be;TIf%7X@Jfm#* z*j5kWz($cAa6iy9Ll68Oxv)dlQfQF(2qW%;&41d-QVl!Sk^n6Z`55^Eb!A3tvW`+Q5$iGZT*wQdX98B z_&e*ltJ(M2-0^9)#xkB9&_pQ_IND`qUeB8`%?z+@#@Qd_Jo1ciSIIi*IP+(dc6N<_A>cjr!c0`9F{o@wNH3aoU0@t`>AoSn|<$j`^{LKGAC*Ki!9pkF}q0(o9$!TbRtI#+=LG6|%b#&4m%p{l+@2XbLv(pH>>dpJ25=agBl{MgjY9 zyoFjLzM5kTm$McJbzo6652=W+P91jyY>a>d`?BR`gk8#as0#(GpBQPwK!C6G-0))~ ze>?>t5htZR{^azb6b7UP-7bt3)IGrTF0n=MZC+sW`9R$CHQ{w84wmufEE{eo$Z-ki z;U_-OWZhDq;|GulXFx2m&y^^W;qd3nE$NkdIy_KFj$**4FsWhbfQqJnx5A7naJbz= z;;mTe3b)tVq`YS`xOp;nO)^-QndkHADj!i9uHYY?%$wVM{+n0$Sd*0zn$k;!HND1q z6_cjBCyZc#cW}k?)tG$Pq%fUo707ZMUiynkibPHjhqSxY~BAR^U=1wm`%eH7-e)G2uiq&(N-dC zf!J9qwVH&U>FX67paa#ARPV#!n;4FFwK@Hi={H54;pXIcn+ssZyba;fv<8+0m8QKnYdQ z^?&0rcwn#k$J~?HlFd@Ej$+&|#1EKb3n0!RiA}94!Ls^54<}3%39(F*BHL& zYEaJCo_;BomI1gtfM0~`rAZHAU@D~jH{3wD#g8#wl*I>%>V{{-L%C(lwNOw2!(|i#2*YO*QgsPKPtBLS<7v*I zuTe*q618hu|EZCM0>|iT&z0a!O6xDk)QcQ*hqgV4;po^~jT`L5+We4?2|DZ{10iBP zxG-e)L6v^YLx2S53#s2t-p+SANo&&EGp`79kKZ0g6lmYP`>l?K-h$z)L}yvE_K$b0 zT`|LJ-j_;D-&{%LbF#Xero`Y#(-qY*QyXXB|W)%~g#;uN$>_+y7oAbi3A0e3J5)TX$0 z7`=*<6trvg`)bh8NBcsZ@d-|+r4~Ce$MH{z@h4xhiuLay93hnsP(`U2fXTr-RvnKb z%mCg?t4i24wB3?rT}RwpSixFAIR}C%w^`>^GQ`x#5@d#ftcV*27NOtvT zehKOv!+@NcXtJhe=lb|Dj`o7=Ng$DVEFdg!x@MYbhQv;@r-d|15FD6e7A=nj-sP_R z`m3}K_GP47)Who!mbIp>6rlBfIhoEEf4KkXV-^+K#(i~ zqZQ4n5B=lAB0Y>7Wx;}C{2-lfI4|0B8EELBZ}ExSG>RPglAk&@MAJR)#7f8)8H8@I zdR#A%AS0+EU>+E5Y{8T2zyK9rfyM|6rTP0A8X2IEu8VuMSAx+=PCQ-&g{#z$%^;14 z{R?bD7cOB8x2O(1cGWDgqFZUf+th7*w)FzJiQ#;HIO8=wV+2TFlB6%!i$04C5&!s^ zDLH`y2oD4i5}C-!hFeD(*$x!s{i-VLTCW*M+rw#VVQQu7#EU2nGfWi0#=eT!F`_PzUuJ z@&s}YqIl^cE`3Ss2nABZN1VuqHAr>L)ewJJV9bE)4qfZ*<$I3=)xp$|`LSO=Mw2?e zRud&mqRJ>ZVa=V-c#6g-(#X#t1siAlJ~5(tk(s#!95vhco*{)KgxK`B`bf{fA3A@~ zT$zb`pNqO0~tPitK>H5_0#3}T)xRKAG0pSHG3Lq7M2o^%Y(OYx^wZO2+N0z9`)W`ul`x@SW)KP!?arzR|l(iC$iy=w` zD;1KI)*(~!lSi}vXP zLQo??@bwQx9hid@gpp>bge%p#kHF?58)8{;OG9pp$N+n1@@gogb~=&+l7pOJ#JF+S z{(OC|PSCy*yGI7I_Pq`Qm>Nd6-y4j&vbmFxk1x?%^86L8e>7%OH((u5_bQsVTyMV0 z<|4Kr5ukT$ox##P?|7U7Mj1!0ld*Y44!24s;w09J&0?}$*)%W8SrD76x3fk#Igirg zJzf`MWN!?EA{b>`y`mYhP1Kq97+wi^O&G+%I7YkP&K2xOspeG=B55f!lz*&77eBT* zBF(5les^<(G}feT!xB8;w0S*Q%*;_`j3TcmXF1d2<(|nd48l;by%LXS9qA#vD7x`3 zs!z|(5&{@j-`1(VB1b{U({i$O$_hxjpJ&0JdMifD9V{C<;&1XCId!r++Fo zlW~v@@in~p5#2=0?g^rk=+aZN%dme4ZgCzcs5$@U1EKTvilK1OqGp#o6E)t1RkbT< zhO~%)-Qe{pvKeQrfGXL~(z-kuyzbbG3APjW7(h_nA~T2UVx+{+Eom5hi z3Sj=IlPn*^Xdoqm4W|Q%VRE*^dx_n=wycE_f-#2pClK^jmSp94?K`!g?X0z1rJ!)+|S6NNbXJ3a(voQLQGKENeICkXf>%$B!| zec$T4Jd^ke5JSaS`%fP4j!N_TY+YX4!jF-%1CyAPPb-!&`oUOzGDK5Ty*^=VRv%#Q zq^r<+>$9(9ZrgsF7>cpZi73#`<|{4O*+;J9&w0iihPCU_Z93_?D*(GCL#nBH<^Op2 zP+=W!PPM|9b>&ZgjF8oB1ytv>U@IrdCK&LIg@O$pEfBlwbEcp>OUdgoVX{+TdcoB5 zbuCN|1ePFd!;rlata%o&%u;i*LfyM!p=f^n5diA@H$^aO8G^A}Ct+B^fGyGHB+5C! zo9HpAC4{SFa~5YphX7xnjD3o$gI@6`am3`YJOtHp8=c!toFd`b_3oo9*0-J=gNy5f~31z1M)cm{I=#y9#k92xcb>-Cu%&O7VJCRY?6Z-AizkI})Z zpeDZ(bTh>p=Qujm6%0%N!5}@9^bSk4f^H0+Vmv292P=s2>?2rC`^In11dc!r*;T@q zZRfQf9#DIMAvCVg+3iqcm|cmaZ#tSe(U}O-O0)ckJ z2F+;!5Q!O4fT)jERal@@c_%76XTiJfFR+e%YT!db2BuOv+6pvefd;Sv8bAV7+5J=B z*ec2lgz^uBlEOD4rx$Agx2l3DW`^fLW0mSVP8T2r08!~g^_J9tK&ldm^-AqLS&D9H zh*e3WY^UE%)yG7C7bW$gq;K`vnM7R*P3BNe<1<1RkGD6QzfJcu0=N)Cyj5|X6Q^4m zO!d9M=^>TAAwcYm^kUvesj9jy8%J3JP6X1#&Z!uwlNL5Chqh1hP3PY+X+vQU{exk# zlJ-9F*+C3KIwTF`L0(p+diD{0fVECsaguUMIpY7*@vYap#!Gq%eR5t<)@ z3G)kD)U(YRrZ4b!687exlNl7rQp=Le#;3fX9T_`F4(h~?tIM2x)aNNcc4C=56TWUg zOnl8)QBVz#JKC(3O3xU;sgdRcD_B2`Dpa~&5tNZ(UGWNesS%wJ6LXA&v)EiRhe?Ro zAwduw1Rc>^J1TdllaRL8>;Pd}5M1o5@qC~~ROV3>FIJp$7v!B^%gEIqX_=OQ)l9vL zJL+pO81jLlaV#gn-w*^hF|JFkak>^HjzzP1+*t5Cr-a1x8kNyn)??)(4#6>kznv`3 zV_sl~y4-)(4Bv((AhEg);UcN^N&YmxoCor&BbezUpL>`D8#o6*#svy7iZKupzM&@5 zKV2fm`!Z|3lYRO#DWh421&zeRH;jE*&m%J?GAzN8*vo`i@^f!K-mO$F4#Bna^#nNr zD(A65&i#Q&{{2ieg9KkhI8DyM9$ZMCD0n`k%M^_v$WJ0IWyr*zA;j1)qlYG9PFV~D zH-kFj4dHe4&9JUiHAx|qVZ_ad0*S*helIM|BF2FviDA-i_Gig_v5Nu(<+07=(&ulybSj=lJG7Gsk*c&hzHh&!G7X)wD9= zS&3+s|A3_RL1I{LxJLuhtV5#74yeL{wI4GYw7hnJzG<~ll+aV;@e39k z-qVBej9(DuIUFwIabnd#OtM`E^*H*sjyGzZiH2=JX`8t!wu;)m6LY3XM))q;SMorw ziygLrwWwi`gG<2MrR4%DT4=VL3%_2h00nbIeinWHhLiDB!DuF-TdRfknfM2N_!KiJ zrmqw)boi=}T-7ENz^*Lo?M3Oi;(_sm-|mzjFPzreL;W#GL;!eJw3;k2a}!U@`qfYq7h0f^`557c~f8nlU&ijyJqWW{E~ z*4mdGyvORfvjEKzBdgPd9@Co#a11f|2(O1zXH+Ho=I%!|YQZ2E!tO|3RE9+L(JWL~chsj}z7!4vu%B(-udk}7Uq^O?~M_DoxF&O3O$fPG3e2kK)y10Bnb*2iP zAu5?dKdwa;M2>pU7?g|ou*1vnlL+Xkos(zvI09Y*7Z}OfH6>xx(<2$@V@lHj0mJ6A zk1)qUHJ$})Au5Y0WVF{#wnJqH=k@~L*n9K8nDMgA0N{FWYCARM(Ivb{ZcdQ!-bfjC!7^Fl|XCLHBXlq_;3ogoX^ND->v9Z04RToz;6#QGUv3M-9Od zSRSF(*q;ll}LU&RnP08YrjJNIp$)LCO*n?D$L}-^OxAcqD^SXT^-% z)PHD?W@^C~G(`15lG7N7^FOxozh>`gJ~WiVX+=o(Fbr0|t1v&50osp>*yVG_kHR^d zM)v}rWU+>!lEG2>q8j(0!)gQl6kX{*&Z;}i+I zJ|q-CYbYBzfn1zJEfz_}x3pq#L90Gmwt3?e9U{b`OAfMavW=dc3Ar!xt9a;~@+w0t zK-9yP3=Al4Fk;hMR17??s{1XQpSZ6Ql27dH-bHGIEYdios zFd7HYIq!-6mf81?Gtj1$Ag?J1N;UW>{b1FpIE*HQAqbF>2;)n3Y$zr05gA?#Z!&d0z5fQt$DiKe!ELvC(LG$<=5Ocla(a-r z4>BJhw|EC{ah`!++-h32TPGz^eyWHDu-UsoV%%HO&(rI2ni7mh?B|$dE9`%%v*EJ{ zI4%!~K3%!6GKEk*p-8-xY(r$5iZOxk0DL5Q{wkHc1`uEqV44`x0^Bv zwIW85>ZzA4Ei&ax|1l6Zj)@+XGw@uMbn&OF#EIy@U>i7_oI!5bhoot7x5@1vZYU`5 zlUpn5I0te0EQd`vf_B;Yg;QoeJ?H~s?lr3U8mk{66p)87a_P|p@pNK)OvT}k>SI0N zfzJ#~D=uOe^kz$bf~tvta{H+i)W+4LQyb z^bA0M=s-e{qfeG}H%i@o15_+;F_;s+3INC>x{eJh+S)H@#O3U+Xq&be-93TN4FoY4 zh$1hg-X1nITD&{_u82EVP{u+fQiAm`F^RnQ3^_0-XiXI><WI5Qeou-6z@c>eXQ=?YSCAHHcp9b99Sk^xaFp|* zUlJWMrVV;cKCI-)?lxyeIdA|%t8eks7o<4PFsC0*`k1mjAqarT4w~dZ zv}SFCjv_~gZQ0Yy%vmNC2=fovLqbRIU@K<2sdv5w-4&a!K?g{n4{J#ojC?m=eV0Ah zLIZ58EcMufeZX~f`Pd`Hvg$kG%h>h+ey@ez)BdwAk+?v%o2%}~5eu_tH3kGi>ZPGB zji$latq1VNwo=~M1`nK$4K1@%c)-U3&;!TerwGmEQ+KZmlKvmsmB`EEJ^g+ljo|EbH>>P6G1 zd*iaWHO)MO9TmQ4kQA*h5eZexslz1(65?njEmePvKZcJ`71?~)0b<$;E9pMREe|XK38Nzf?3$5Ro#v0ofq~AEk2=ja zYAnJlauJ-P$BcDgh0s6Yn@b8^25J@VPwXgGQVjS51TOBF+DNkA#4ro!#m^|5`RJ7XR4#K*B?w)?eJqy}U z@?y+@SWvl$=|DY%2}nfcYm7}|^(!b`U7GLZXW8X4PK>xz+p!)7MeAM0vv97v2-xp@ z0|eH)t2dQeZNN9K6Si; z9;TKYWsxM=dLIS+M%l|O<|nhWBf&mPC=+5D^xKc53OmJd=uz!@xO z<5>_MWVQN*&*$qi5F}tK0Tv&w%3$m=;3gv+vE2wQDHtarijnY3Ia*O(7;O z01Yn?4{0?l8iJKrUr6682U6MQ=309Q7)jEnM!*Wjiw^mPKvpKuvNC4LCqN|>cmAAB&5@4&%U)iE&W1W8t~i4E6R5O z75f%_&guXbhi$Pevxq*eez$1eLkDf+0v4K?Zs{Rsm;%TfJjRt z*&9~66Nk|D>i!}u?J%_cx~})M4#$XT0crB7F2~-O-~u@W4NjPG!uTi+$$m3Ah4mWe zHbfigy@hEIhsLY>%q3sQ4p*xOMVOWTOY{p{V;rHzhH13&nZnUs8K?a~$B zTzc7Wc5G?8ucbyNZAV}<$Utuf8z9ig7C`UP4baBH7oaBiW~7C2LB5Nylb6i%|2P@0 ze+2XEgh;#~2fMge0BmUkF*}L}C@(yUPF?yO#Y;Z14L4sC|5|tNL*93r`Ky%sc!;iC zN#FvFahQ6hnUB_8sv(3ayONrN8>Ztck&@E8_zc}CCERI$PD z26O34`9=vICIbdV!+V7FW9Uj$qNyBe3hPyef-^cO(*k^Zx^@hx8N!gTmo!;cJ)B7hJw}YPD?th z0-~7Imq2?QhsQ24z~qX~il=6pxwR40+_#>QG6ND7Rb3#dJT$jx4m6QhB_ z1J2}NL)`Gl#9#>gDbp3%sjkEkATM|)m;o-78Q2hNPZFN+Y_F3XFtEjk=ueT-s?q3i zLc_4$(L4}~34`IA%c7U8BDOBMxz&AS{>g4dO(F-8qsz&sx)if=hWu4AE7w7?hJ>7J zEra-Q{+4S%K&e$>N^&O%dy`uOnriYo*!8y3UnOp&x(05wDMGt)q_o*}@zFH<+2qgh zGa8yO10V2z7z3t?)`UQ#g!V>c$a4ai3Slzo$-=DF9Q^<$tr{Y9gi588v?0LlVvVkB zN2pPI>Yc8v9x5e(6~EB{I#R`rXOTwCQwzOD{NT}iGi!3qe8U#%2y zvE^t>dnC&+o6yFW=B%itFaUx^nM!J5DDSY-+b_alj<||&gc@6q@oj2=)ol2E_HO3p6CYbFvTzu+1mhL^kdqin#psr*gltx1_RqT2r+cyAefWe~ zdmW~Y$pD z-j!DyIt&{54tHk8U;`RzM3ffz51clYa0zrz9?Yl%RA?p+|3izmM3TeR4b}Hf+&b6j zzT@E`KEwN+axq2jM_|7gb|_$u;kyb}IlaNOKuzt{SdZ3aS=Dj3`pXbr>>i|ukt)6B z2}k*}@2CS7vBu^}-Xwbln0bOxRQ)b1l5iOv_#n}R)N08@3aZdJDH1C&%470LF3B)R zFj{^qGv=c!D6r$CIJ{i_W*$49v>jH(16@M0IPIsP#)pe%tU?<^qpK#Gh=+z-A4d^8 zbBK2%YrQJo4Lnpj9>%WJi;JsR49KAXuDh)HP_|yZGv5swi{_h*JxNa9!Sm1_GIWb;?5p{}EElKL!Wp|o)uthD^ks^Gqr8RsrFj;efH~;||LBD6;}Lp@9wm7~WQ- zJ>4gj@ALw8SK-qNjuq|>vDX{a?vI@;bbG?m#q^F?4W`ZQZFoYNJ5+;GQ_AtElZ8FUcG%a~Btz%wG)^x*?4!xN?91ih?AfYM!Xzivrj1!`o$pc(lSb z-7!Y~p;x_k9z2J*F7l0AfcP#dbLXcib(&vU`7S+NM}8c?dlo4JQ)}1`TJRiJ-u@wmVD;VN#s^!;2hpiUHj6s` z_LFkj|C#EjK9)0jSw|l=uOP8uJ7X$HifkP}LXM}8!A0RW96mo;2%x!x7GB7LiE=02 zNjlp~g_d!F%#UE8l&%EM<(ukFk{tWD`t}(0w|5lGqHW?&IKnBH9$s7=7!Ds8 z=4X0R6mzeL(Aeve0uv2*J8HiVs@W)7FRl>&-=jbE$dC8dXS(Qvzoz<# zi|OwVygpdsm1J!%?%6;xySCYSCEfnHRm{7=^_pgA66mOiCbrj0O{aO?T_s}T*L16` z)+1IQfs*Qd&-dU4*9j~74&r0uY9{p#3jdCaS$1DwidbC#1{44(UxjV1ItEBloX=5u z&J~2Hy}}=-UDsjpGZ&InfAj~n=hZ@-9O9fvl@>q{@ZsV+^{X^@k2;r?2H&7 zXgJ<-2U4w#5q*j&@V_Re7z9tah5FwhUJH}`p$EEdr?coYbc2Rm>@^HKR$o%%+qt+J zS>0Hjv!d^_XgwD1le2gm_!EZjeWLyLq#jdN=0(^Qx-1pw zk-gXDcZ4NIio5RsxQxV$-Db=P!&?=xu#Re9apvk>B$0#dvPnp(too@ua$?s#Bmu;A z{UPO@kQH!ns&&XI=g`cWzyB~AwYpu~14y3hzTtjT5mO?Ybg|}X1gDK#6A9V~#R_*v zwTSX`$QOoW#MW4~o1!DsV2($kkJOa!bASI~3vo!oiFCcLNES3D$ zd*;Xp%BN>kC-de#ao5BN^c3;%3Y*6vnN@dUSQ!R{RUN+%@YTNTO+;1DcgQNgyeZyY znxD*RjdlI%euG=M#;v7I5*_$z9y{U!cdBiy7GB^ko9Jg=<(i)fKYThjewdP~gh3u5UT$eBhN5r2L zV!BH19nqT3!^`o2$9Z`1wz{gxt+lY{V1qA~l5eQ`FNM=DpL{j1enX@{!{0E3pdUy= zU_>g?qB&_O_wa|9DyGR%wwlo=a|iQ>xUzl7rw`l$mq9Q%3WKToBKVV=lFNiH#S>&J zUVtL=R( z{1)^jI3_v`&pUItOd?;JA50I!OQAH0hpZJhYt8{O+_(x67LvVN{ zEZ*g&)=mC{vVp#VwEz%u9H3+T7@5MOQGh0+t*uutQ)9i%h{Wdp@R#?7Z_2?bT-BjD zjPGJ62J8x3o>Y~-fsS*!I{mOj;hl7X=b@8xeCc%a&9zE|fiaym z8&UmjXkOa9B>OgsFoZatgCPnw*az`#GBl8O?I%MkrtI_!@Z8PBOFgF<3ehhVoRS%h z;fxUursGYHUk@kx?2yCnC(4#8AxhR<8hCf~lzhj(a1J<#$AQ=ZPW-I(^%!C((f|bg zYxwFMqXEEBPs~=U8v{l_FyS4AxJuE+IKKa|$Ol^#dtn2}XBtKW(;wX1%vnO2Krl2L zh6HVC$g!yZD|xKc@}Lyx_h%{&My;Z@U%jC3rkxQTWJQs&?=&hFAS?u1;9J|=NKo6| zv|tL-mesE!zgr#uksM;qxDW)1Qk~Ur%Ap46dl367KI7W_CE?y-9&Ev{hDG+7V*8L) zr{r7;R+U2mx^7mWyVdKm9G zupU>0o54L~x8w*u#t*Zfw7BG?KUPe_k9S2VhUzQo)0R&Ew|&W)FTS4aQPqF6L;4ha z2=92^eEBajBZ~n(YfipCR2S_=cvL{Xk(x(&eR`D7#N*M4a@M40(ElLlFLybL& z-w?S;KvIDNjYBQK?r`{2L@bPn>l6=}{S;l(C^)u1;f09K(*1o|-QdcQqXK_o=TAO* zx*zoI7nZwk%5RACpEof-mASOI9LFyr`*M9hU;n?5bW9EQZ7iPKotx|Ri=r3*o9oP- z{y!$%K-$NXy0O^l&&{#?5%;g>zUU4xUYUtq&OVKP^Rsvjm^=yrr=`LLP9L)79q$EO z7#??ZMohkV-BFIRaD;~Cg%B$Z;%dJW0}2xqgR??!A+{`5S!_g32dS2*)25%!`XxOv zLaWe3l1XFpV4-jbo*ixVv3bN{gK_SZ;G+oQrvM#PBRrRpsA@O?(*q}W zfq+Qb3y+X#(Rml`u3@QionSHk&|z^e1^jH00yjyVw8qHvnGO6pxCxzJZhFT_l|zyp zg4TeIf2ho?Je0;+O^^x0Er?+umI-Tx?qpXe3u;PM5l8;G&`01 z6vDsa$MnK>`JuEMXiEuxDqOZwHKy?jT5u%&5|L#Cv^r|JG2c7&RWHVuV|pKGomqg< z4IR1h)V93&6=_WOO4GDU8hl9jp`{3`4&wnG1NDBpKP+E+E_Pj#U|~K^#$|_v(wD6n z>&(zIztc!Ec-pwu|M^M<&Cx{oy!vc15Yh^_Vhyra5mg)XFBnfj|DyTN_Xn&FC#vU~ z#yy8Kh8DT>wF6q7jCj7#)_^C*LKsEJ2qxbE2!p#2LCB}DcCBnOqy|BDRo~9bU(Xz4 z`6lUZ{R;O2QiH#$d2LPgVme^K^IQb;b4pnAIb7YVZtwe|Y%wLSlQ?HnEjK;nZt~^9 zinQ``pSONC8qzs6a*QRTd6my$=}Cyr@yTfA$O#@4N8rs(^zMljiw8Mfbo#3co0q(h z*Y)TGbOM&NW{JM?VrXvI=kY2jH`i1^!Fv$pQrL6$trw^P?SHq&^E0;8} zXdl@?#PV;E6d;Irfg8X7I7kQrDS(C?BP>nan4DxJ8;%a~g3-6cyF{zBM5BI%2=y4r zGS$Pxo)JcXz`4Rmfi`m38IPeKNyNxK%rf%orTsDd={xR@EOc3G_Bq3xk#Z-4&sExx zG2*0s#!PtjY?)_7kD$k9kMKtMh$*$0+HPz}TIM_{vgy6{Rt-KRDI6ASVg;>b0RMGa8c;o!mpq@AEllx zu(i_U(Ds+7WR#|l%nLNZ2!)9=3y{;V%9{t?n-e|)+R`kx)snAEme7o4GYPTA|6>l( z8dMNTSX_+J15kbdZua;7_V?cQ_si|?=lN|ug5_bs=6AXHkQeuJ@g6R?d{9yPi55K$ zQvAn%?JJ5rXjyDRgg&syeK9yDnc__i7z{Zb5j;$)VJqA?dA^*-2f;^K^+Sx53-gci z>_`pe;>a~*5vmXCbYB*6GRj0L+!~7n>@&FHZIojZIPZfdAx@jklgQ!Y&0U-Pd_Q7y z*>T!!UZm7D(gBmr=ma5PznSU&8Ba9O9@%YE>F{o@L^o5CqIwZSf2PwnL(RhqvqyDB zJU!s6>Zy;qR}oAssD}uqb@IcFP1&@z9yzIu?PABtzzF#CU&*gYc{>x+79x5gq<(ie zF1+L4S(Zuv)w_YdKC4~+sK$gna?T*)Umc^O*NL#*kF_L8NY^I)Czd{|OF!#qfkIMk zJl!kCsJkC7c%Zrik)8t(1bfg)B9}nG8UPp3Qf#iGp}hpj8*_u5$?C1;@6B;lNA35< zS_8$&9UDeJv;B4&HY;h@ww7kn92PzNPC#4ra(pHEc%>bT>Pf&LK_r5=X1ftdK9ugi}s=<}%D=%vc(TEm)xl!Tn`5-bQi?Bdo$=I^R34av=w6ME+4B zb0AD_gynS7z_`OOID?6TJ)N(qDJJ5q??Fad z&=FJEmOfk~T%?NH2F5!&HcLVjjr+@O<<9-AK7(*rI&vt?AK~3Y8Sj{~{{*z&%I#Sh#plLW_@rIAVqs)S>-_ow_4jQ0pav}B|W$jDOI_HfuOR$q(RB72qG z<9)U}5+dHU-Y(yTTNtnzzA^J?2ZEaq&JYI(fto!WxGRudf@LwQgiAl4eH%D|AL@ej?x@Ovm&((5CfgDE-MUGzoAGYfz3X{# z?o)!r!WNZp?#yc^dUwXijm_Y9r6+fVwLRB-*f}7IC@z}zu$0WP0V5_2;jJgd%~i2_J3yi3ro;<{diC@>Zw zX>!cZi;FiZ);{uatO>f0C9I>sQ#4&bGG=|i_Ahz}WPr93IEe2~`rRFb4R@N8TfZxq z?jsB7^=zg;t+GoHPYL~&s~6&xpNdr-^stg*^zW9n8(+f=kWQFmOYfhq?`2 z0`{Q;em#e(dJ2j<7gk__kOKZ-!#8S6rr3r+{iR~qyzEO^^M#k7NpUgIKW7#JDa=et z$BT>G{lx;j)nCNQrWE<`A4ri+DdJ!OU+JUgr*E!LMW08>fB2{+32%&&G!QOpEaNFo z(}&Nc5RhD4T+25Py;JAARRBp2}t`{dKvjK+_5<>&CXLcohhs6Yg01F zq@qC&*=Iu3!m=5al6L?{!iTe?lUOo?!#k*e4AbE{{fO@3Aiz8rO4ecE(o&3nW?kBi zMd|n_Pq$;A{o<5&u)vx~6Dlf5w}icfCE-YRliM!+T50*RtGsIEd%G_Ic^`4(@Fm6~ z@kH+oQAs(i!W43fNUv_id#HKRI$Vb3p~e9bz5tCoUA#&RBp+%(7jH)3228OT`QFOm zKjmq?5xmW@UI;ECSfq0Ve3VB~wZJPjz`{7AlNb(!PKvee5g6%$l)D!ly&h5;gE7o; z0$jmI#$rm&CvhUYRmE~yIjf3!V(;Im3agKzIt8FbTUD{n2UJBjUGu`$h@lPGECOUX zcBTP3@cC1ZxEO*)P$6(>cLX5E~Xi#3plmT}vA*y%_B1bvvZ%?AjfED*vV z6$=)^ts5INu`}ie}SQ$W!v6DeUZQSUe>mB9N4gSMRWFj`q zPO~Z{`Kvbf@w>2- z|0J-}muw6g%G8&<4PmF|wz(8&+o|3q;eddpGh%6376IFu;Ybv#q^;(~7gk^H2`%)Y zn@n#+z28*-GX+aTS>bB#_)69mrlm&|cI1*heV*uL^n?9oN&!>Hdg#cZCQ2R-Q8Zl! zR=ynTv9L)3g7sp-@Q}LzHH1FMfv(X!4ypvA4d*ue^Lg5agg|(lDuc(4>yipIDSLQ^ZUVU{xz`xLk^`ZaOxCpr_?y5~W&idG+!(!q5`RCk2zNF??yxhJoTx z8}<_nWL(~0-FRGjEUl%UuI0E!8JW{HP@@t6Lp^q+P$?%qv%iK>Ur@t@f!(Klmbl1V zM+MdQSpkbJh!RIbAq>H#piod^L1OsBvzR4TC2hG1+3M9n0$2cbD?Q~wxF-0Wb@b^R zr*x_=kJ1vzZSGHO&y`xQ2{{VK61Rho4{Su#(oRas$1;KF&SIj9pJXgK&mVHaA5cp}ZLqLnHk_jE6YHxo*^fB7~qSZ;;d6e{U#VW%p{|(9$gi|x9dC+VMHFKbY?F<15KUoKKSf|sxMuTJfrBV4 z(;^7KTA)?CVE9}%&fpvJTY&{T5yR#8I2ViW0S}$)o6rAv)KcA;_<(vgD1bPm^val` zQ8k;1lh>hfe6*kOkUYvM3}UVL_UKQJyoiu4KV(+;?SiCHlU1+j?j8=$n`t}sGzd!L z`U|XkpqimUu+~`s*+h5=yfbKiAs1#Nc86bUO&pNEN1ux|gE38yWi-B%6*`NbX~v1z ze^;~-BW)xo-!QXpH3OTXCrrV$CbH%w5#1D3u7XKIG{W4Vh36B($Y(1cjil}EWa#i#qIj^_hA=aEVgta}B4!qtA-(zMXHLyVd ztOG1;2k8z!@A!{Cl9urzBN{FW?3!hSn*(vfwhB4yVs7Lc3l`=^EKD8%lK^ZaZwkc< zINo^NaK~g$%%U1b8-!+XFa#~WhIooV6yoi?G#V?mHsW=HnXuyQUwat`7sH_FZ5m|g zS)H9kN`~%?X47_#8_~qfQkd=edevH1Bh*V1jr69Bm{-gfOE;A_BJ&7UkK;{ST#jLG z8KAitX^!4USmOzkZ4v&bI( zx@vt6y3r8@d(+Qa4LlSbG<#VtH{SD~3;N=^8#Nteg?JIr<^@=fZoCLr*vd$3JSk1zgCWvKwJ+}fdL|^Q}=Nu6#C?VNw301GV zl!6#LtcKynnr?%eupN-e2kTMS$cF=VjEs&^r;{C7$nLQt%t^^Mi!9Nld6@MH{QEKV zO>-$7BVqkgSi0>!o9MR1ef6yNNktqomT>i~>f<@RS8w3FqmF&2>e*7o?CUL!aKM{Y zM1|A$sXjJ|jG{ukEJ~^vIy)ANJY#PBuhihtq%BC!pi_rE`~Y=?BV?XAx*~3_-iE?O zvrgs|LuAS4qvxQk0ppZ?&x~XzXoyaJg4)3Ibe9Mbhnm+{LCq;rv&r`A8eEY#)eAs9 zKW2?LDom_<9ica|BkQkU<-%F4heBZDnCwgZSKUw2p-@qjOv>!kK&k|q%L~$j3@y8 zddSHNB%iYIGG0K)ERd9W%o=yP;cPr=<6C;u;hlT<85f;q+wn=|P+*Iv&Ty`FI7VW? zaMIpnOfW>ajUem#c&Ef09;wd?zo&V?(%ecbPdhaI*A#Vy)Elxt7Fpykj{G>OatD=R z4><^t-;n?DbzU#%822cUifvYB)gWd%O4+#f*0QcB*dl3{#Jd#j?l?)YR4&j6-b&_8rv~ja-tQfxl{d81fm) z;xWdWp#wTxMO5ML2>g9a^{oK4h|S%+f}~$8gRwPj5z_pKSv>_snQ0o30C8Kp4atoP zAs!Z+i&!<7i!DtIpY`zqs3p%1ON2O;MLK?yJk-VleRnZa`(TfPEG#G%*7E9|X?6;g zk+$RQiN4ijrzLi?;VI?RaiVY&lbQn%rX>il?{se0GR-MIG2>uNX-ydAN-HOPaM&p| z8w<7r?bok40Fk}1$oFycS2)P z(6gPg`e3Z1>TxmbTM-+3fiN&*F_oNcE|o1!2*bfm=U5`mTVnDs#O$;YTP#_twPPVn z$d{V=V+u*e4vRE0#xgul_ycIlz`K!ws~$b`2bI^Dq%Q518urBXsB7l$ALjdc57cf z;qd0Y7*}D2F4HIozp3_NhM7eJ@Gb&PRaX7Kxt7B)dZ;b?@iS&uw-Gb8x}3WC}X8Y<1n#~ zp3r+AWIXWV>(}WN1m{fki_AZ5JOfFZE@kz4^k5p)5Mww#Pw~he=n)C@Kx1f-gvdvU z^0O1^&h|PzesqY@@wQL^3*J0J@}C`I)eYRxmi)~()sZP&7SqB=L$Phb%UzTKP(Da5)ZhD;R^Y)rJ#Ci|(0pZMdXG{Pqqn-z{$ zT?Jw=dl9?y&u79`1+c}h@V z;a%km1;xVDln6n=Y)8`4Pqvi?fwdE#MiYw-tB>ah$c(rb8L ze-LE0=V?5CecAEoGz@VcVZ@&obl^0_`YeVP*gP`^$X3D4@oF={-Pt0zStUs62Tl{* z>~OPmrkYVKE7dTPz6W3IB5gcdtuSQ**eaNQZ;cJUIu$W3_lG#JgiG(*6d1>GK)5=}G`u ztoLhI|LX(cQK@~q$XH;EhdvHKYSYsR>H!yatF)Oc96m zSbU&$b-$x|)98Fm@)Z9Kk-eJdQ50kFZ?>;I$bJ0D)`+Qr zrgqZn!U#^bKKwvjMdWEHBkZY`*yBP$EOhqXyZ>vyGYj~m> zYav!-;Ck16Mmm`OxllOZG-=mhNNavkL}V8M0Rael`i;Bl%3U-UNvggc4B;El^E^!; z<`ODyfpYl4GUX9teH#SXWp}uUB|LeEp6ZU0*$Staarqp)IRjV)|E?|?yi=s;j89-i zXC>jlj0iitbfA#$V_CMFa%wqX^lxXe@T2_`09QZTsW!%8D{?fY_-YoLZ3cxt4(|#} za1M0uCSC&6`DvmFiWi?>?eR5fHT!5@3}K8569~sb|r$-DOGbH91){ zi$f_G$IM*J=%yWTWz!vFHh?z{;KMkvhUaXBJ}_+|4k5OF{@dKV{Z{4a8%Z1o1|l&9 zK^X>Nr)b$AJ|f?kCjxYnyC0X5%daf5;(|3L8S`pF#zsIu@R^AmevV}Wf)K+Kl~(_L z+tm*|;SiJ6zeL4Ymt?t_K0}6}Vh`IjftKkHoUSdw=s?nf3@KYLAiN%yNOA;v2fMN3 zYpWyB>KGIc|D2`X2)oB1ihcMa@WS#kE1eCS0fG^@Y`X$H!OVTIl(TL512@DEw?Tl!*^IQu6_qLo2he>}n;Uh~J z62#4*?Q4B*88_C@79SHH7b#=hKh8|KL!*q9c6moF#9i&w#5nN-6i8yoM0^O2F#HXZ z7!E(zX-|q9xMB7fA~pyWHaRZ8gLM};85*AXH)uHE6-U*g-6L$#pV1gsd$R}$V`tld z6M<^n|9Y33=U3nCSP9Q2+J!#RjadPppa63?6SCl!)n*6~<{AZdxSO}mdU$so3NsW& za`m$xB0!)y0brVSWYa6neWZjUd7|vJF^_-B9e;?`RE!ds*geAr>;R5nl*foDwO4S5&SKkS) zyVZ9(=}gU?-VkUZ07>(`ryd@7I8xh$h>t#-_$O7O>7zQ2S5Zu0tNY@hLoewLk4ado z+++4a(|52R(J>rBHRO}VwZ63$+UI*3rUYHX4w9S$yyB^qXu!lopmZ?FWa#EUP;p<> zgXwwH`Jj2XvJ4YyVK{t!4zm@9EYBv{v}Fc$mpN{d9s`oPM7hzAapr(aJ4G`B+bD(# z=CNmM!rtgY)qcm})MvQa-A{lkcu!^Pohri2g(lTYYe9;IIO6} zO5U+p`>w79Z#l)OiS2p-gzQ8ZeKiM=uFNdRL2}pyj`m=qX3@cVOn3nc;=b`PHtRqkge+ih^M>+sRS6%2hp@vjWrMYnP0-RsbFr_#ol<>@&?V4JTA_w?)R2UIfRSFI zV8S$y*su&NhL($3N0V)a_TUF?F}@I=LytJNfk__fmp1qqJo0f0({?RNdD*igg(Tuo z3HmOG%+!KJ1tbz)Nu(E(^S6Sz*@{3_BS})nI$3mTp}7Z%l>5b2iNx)72)d9+cn_IN z!4hzMCgGN}{9+IWR3+BPK^_G-XBheGvPMIea_nMHjo|GODcND|zzw;9= zZQfl5>mJ57{FETZ^ynN^JH^rs4aBO{H3@`7v$FY%+oKDg<0m`}_8`Xo z70|(PEAt~1LaS}*j=;t?U9^xfHm7$lh@mGTHHo5{whEDCa>kc56$fq)!%dv0TA1LK z`WSJh0@~%~v$QhDq)}?8s-&YKIz&bDIT$aMhhZ_x67o}VF5D!yA2|q~-^KvF=1A$!OrcFW5^E{ml z6eOs9#xMgj6=Xd@6#MXuBkS1ZL;6@Y%;otSV?l*sQs88xuv!-CM;urHh&e768#cT$ zSi@M}pbD_}WxJpV%6C1KV+WxC?xN);$2g<8;Spm1ktvU;6(vlqBCu@U=ExvaARQ)X z3t`mPN?vePax^0h7TO_BY(osK2Q;A-JL#-C^xrY(UV3D>zRm#|t`B-QJ*%!{m`9)B zgJ{f;2-Q?}Kp2p;W%Vv9iENWda&1sS7{ur;o7d#h=M*%=?%!lG!A$hZa$7+wJjK$@ z=-6lxZ8^NZ&!N}wBV=4f$_9T12s4lxX{9Hn_$LPw=in+7Tm*QRzW zAMQCqyrwRGzTg$MaV*FUC26!1ixo@@2>uzU?+6)*p&l<|^dTn?ih2ZbRlUOH5-Xdr znV`U@z=HLI;O17D4`;deBQsBQ=ztZHE2hg`D{csyENaYjP!w#BMjula85Umx+o1Vc zz%0Aln@x!MH%G?_D5>Y48o;DJ(zuC=t6yh(9^6R)aByduCqU$2%bp|{!coCpF-wmP zcaP*IGERXRaNTRql^mpji;8!s@P}21G;m|8)DB#1?_<(3LXI4`z3IT^)Ux)F$@xgm zN>3M6qnZym`SDXS$QfF!TS+sQW&>C-O_w`HE;CG#Zvnc~H{xdC_p3eof@d57)1oFO zN_%2yIdBpnlXrBzx}inPlr2K?xksH5qH&9PSDhqh(yPkZX@uR?43tg912HKP6%I0| zLwz!sDd`d6bJ)`ikeC@InIE)L+~Yr>CLqOPAyPG6Q_)iL3qT>G(H#@bpC82JJ&Fjy z(-OIGRd5hPGuS2u%|8YSsR;^|PVAglAf`i5;Iu{m@b2CBYaQc)-=tdJwc|c?hZV{0 z2o^K`gs2Y*6zZiUUX)LgR!~+^l%Dx8a7vz4TNa>>J<$mmOe9)R{uky>dN0kfey70V zG)R^3VMmZL(oX@*#{m3l0Zz~+G22d^L$!93Z{SCXaYWKd65J>QoG3==Ns+pc?Q*Yc zkhdJ^+KozIs_qVrKnl7jV25~wHkygvnCmHgt6w9k1L2L356#%N^w2{;#4fSr;kVd2 z4ZNqQ{#z$$^bf=(Q@pj}LtfT}3WB@);{~ich3YNr=*3lrnZR3bKq)bk8^f!MVivFy zp|7VLf@ra4I;mqXPzuY2YNMF_Wz~0}tA8@To8cDJntJs}4?8_fvmfjmJPX3`JKak_ z4%&z znu^k{u{{d#@KIf+uUb~jn!QJpfQ~st94=G61^uLS5q&LbK|g57t4}4ctvWn&@)X^& z{gN6Z8C(e{Y0fVxaQh+UaK2XWQR3shCE7*n)=)|A2)cAr0xa(jCXRIzRbXUSUcD|w zb%7Ry{TGWELD4PXU>v9e=vwtJv3*;7bx5j5<9UK`a6EGAT4YD?t4Jtlx znZ{@#DEMb{CO~DP<236l5k2%(M#w=Ij+4E*lbPB%bLSNpD(E;8W5N)b9v}$Q()nt7 z+>VlnZCC7A4V5I3X?_74 zXIACauNH~u;9mTr{@uNbFAghR{!%A`e7XVP`mT*AvJ%e{V#QV^D)6Ys2%cxS0zM$s z#CVUC*soz%f?Ol+$3*@p9Z5hK!*%K!jQv&c9hME#EkgT4b;u}FkKgc39(Io~8;~7{ zu78nefA%l1kEb|bv1$FK%H;I1h5=uj2$_bu-O5?m!%I}4ML2{q{ZQwX;6es$?R|*Y^3mFWGlREwHGmnV!Qg*rYisp4PO|EllGx- zr-wzx2wH^Wx!1h*q*(q|8)YV0ecv!XM~XRI+SziMRQk(Yxlr6NT4lW$-&89K5d!kD z$d40p0!PUEP+zdBjxFdz79sxVpyDQ+wWEst18E$)F-LSL3EFKT7O$&ck9B|+BCNqC zc7K+`7Z!90JjZ9*;m>3Q;I(;0sRlUHHaE}}2=xvFBi*g39b8Wc18c9LWbGTwwKiW= z`@rC@I}zXE5{BbsB)%ebnaPskDpEtml}Vsdod=!NMePR+%ZaONE-tP~SBQ!IUhT`S zy(GJqtAKGiK@~fcVO;MZKJ>b{xWY1N11lfxyd>LMmm1Zb;cN3p?iyS^hMX}VaqF(Z zkc(~{W3X`SmF{IYqAst3tR1`q4Aq8X*l z1TeZU?*MdgE1Wgd?kU+fWg2N&1SV|Qf7Q4TJhL1rix_5cNgku=CFzT%m&>Ov_i#`W zh>J-TpX$@031H8TDww0GWtyToDy;6xCmxv<*H?L9ABT-)E+q$m2gd~f74BUQ&_Wl% zLq)+bL7tcwVwq_m4P7?rt9NQwAeb4Q)BIH0g%()A+H}Fn++qr2 z2Dtu>IsoquFLPu%ARI{nk7I0#B}jz=4J{b%VZ4+U-U~2{gyB!;?h%6&M&{%c?mlg0 zOm_ty>{9E5Gix8sko|L$V54(CO|1W;`5Wq!b*edC3U^N_i&ClX2V6-VRuo7NKo>#r_)F}cQZ+W0VlKe5HvP$4+_(<6vJ$-Mj=-$> z#oK+l3atyOO?hF_9MX+U7B0tkFybV)j?px69q zW_U-hx$BE@)&p5nHJLSgwOK%Ml5^I3$wu=7PmvEXD*tH?)rOBE?M_0OU5aIelO8&* zHxsR%GKL~-f_zpr+OCUCqzecnGqd5`zP2271>{GO2VDm@#A$0O))~ZG;AuaezIME~ z&Bi<(og(Vp(I4FvBXHovUKR_oK(P)s<)v}poZq1CROftm3{yfAv1cR^SdNK_+C_Re z!xr_yOdk8CJ42@|eNb)g%i`qG)BwF^Qk*7=AP#PP0|%yGn(rTeZ=BXBgJYIQLuoG2 zgllBlz((SCTPg4gP{TJp#UslR5De@HZ?sK!NwDUYABG3ta9iEEwe{Muyk0Z2>Ss6`R?~>9RNi|4_R z$6KckG&=lX&aT|>*fb9^r^>*eXvkA;jnL64jz{Y>G%l}V3oZjA#kT}LyaQLG)Sh-e z_6`%-Sim3tr*LA~k4|-sN&mxYaQk2+CV?N;EAslV6T6jvhyzmzLzp+z5d z0~|X9mD?aQcNoq$WX9zr=i%^A3lsz-CkC#oGbly)i>%KRkrcd~lA?y~+`R91Vw8!| z5JDv}R*E2`;D}?O3w24y!`@XCVa@PJtTeqy%Tf%Rce5rhiJG37To_tL_5b)+DDOkk z?uS`UJPo(-GXwg?e}SSkbCClG_GUm_n6HLLUTtdQh&bShs3!f2U-fn@LOo#uH;X#{;B zK#O;po=mpxGC>TzRQ(!@+At+^flIRU`RQMp*ZhcKY?1Q%;DT5rfZj2e`u&^=^6Jf< zbgDH#XU%WCL6RR8Hu&8CYKO1C9sU;8@01!e%5%wV%1*L4n#AW*t>{eSC|>KhE2uSw zQu5ukLy2zSV`c`uFXI^Gh!y0XyJgsvmpvfE&x99;>cUY-CC?N>%umI$F0W5G79ap%fsP^d&OdMQ{yL@UyUN!*j1W@f{5TqH_lP${R0K8DCM{a4 z)>2I^QtXRwskLffZHo#Ot*xMF@%O5{-|w?#?|p)__VfNxBWGsMtXY?5J@@BXYvJ~@ zuW$g+D0~3*t6rPtmZ8az2t1IMTOYD@U;kjbGAeF2XiuCcMN8W8s5B7R&Kz73yK5#a z`0c)(Bq1-2La<^9Ln2YPN8;i^iL?fBu_iubex8fv;)K~q8e~S7?)aoLfCeT!#MEZi`7JO+K4c(*wFx>r^?9t9W=nPER)#$=w5Da81V1(C4W3i|Kcgl|- zT;+h>@`Y6gE-1I)C%i5ZQp(&TX$pP9X_PI4vvfPjvyXj?;0CHH-?E6AZl1>9;3as( z&IXlZTdn0^q42K{i*AeKw5-M+_R2d@@5>KF<`qtLz#h5DaK^*o1~dT! zEMJcyCx4!<@BinlzT#_mLU}o8u{hZ%%Q*XZ(D8U+osWq0gGiTct!7q-b=8kWVKt=t zS6VInpLwiVwiUIl#_B}#!)43R>WHGKul3jdUhLk`a6{fAJkwkIejAbdiBwBgZjndAXFG ziQr%zv@yq1ex2Zz<6;BT(W(d=x170{V0Qx@ipNScI^;nRv?dGR~6L_ z!qXZ)9Gi$d35*6Zoa-mjp_G$G*N(|h7X`k|`<2W|`AO(Z66N`@o&fd}oe)hpOjD9_ zShtNBI?Eotm~!F#i?K-Cl7XYQcK4^dH>Ho*pQIAI%QkGT-U~J*g^AKk z7jb;PyU4H++w3@@EDE2g*~aw|iV0kco3Q#P9A>bDn!{Q4R3deo17}HK$rzqp3QNb2 zjO86JzMJe*l;2YyM#(&|63y?Y);|ox{HaIh48itcQI)G5sN9ub0U~~`Eia2{!Sx5`_ltV(W$sCBXP0ER@$+2S zYZb{hE>c$a>vk6+tP(P!rmMv!07`fHSV@5x@wCDs31=oAdy`khZuS3yUGS>zsS2i~ z1=>021fMBj1MA4RJaM&WIWVevSLk5CKFjM0M^9eSKzar^c2KC>{Z)NbVm052l~8~A z{tiZ{=*Lfh!%R6DEnTzJN`yShP3SQmmN`RIUY`+GS)ZMU?XaEN`9Vym+x-QaNHfR2 zg7ka{+khx-EapO&NlPV2QqaWdT?x_rmC@YpuYN!5o>m65e`&%Bhme|)2v{zf6PU>r<2r7q1C}o zNN)QGO2iyG8N|lh+aQK^=xK5yo1(v5mU?-OB`VBwdY*b5+X&?7WMQ35(Qzb^M`g;C z((DVHd)SJHdHILLp`;!{1E#>FIV07QSWCema%Q#AOBGRfMY$@TbBW|l0oXQaPsG@= z?wJC1R0Gj@IT^sD!Kgt#XJ~|mKiZ<#=$~8ZHFvUD>f}O4jn;IAbsm>d0dS14lrxo% zY;Ljh)5wZR+8Zx%tlt{TuPSTHyU!Lf!2~tz9rx4iIZwi+gPkVCY0^)xx?-{LLj`E^$$2bV z&b(>}iUW7lNn7>np+mS)8e&ez=?b|WLp?Q(G;*ZcT?a({>~G!hKsd-}q0L9whxQv# z(vty+qZ5*>2Ep?bwTs6GZ{r?HhaEuaLeP;>_u1X&j_40(6aArotdDcJt<50mE;m7o z(#@9Pu%E+@LlNuz_bZr-n83!L zvik4YdlTN=WoHY%2kXqPq;D5R+_95{Q#7y0kpIc>BJK@|Dk8aHS?VEVvWHyax_7Cs zAe_NJR{ZVv7>?2!C1xh7kYq;FO;pTP2yl3xria*g2)>-dSjSMJnvfG)x<%2+sJ zuA@g)TTje&qI1Ft_RdQ1dLF1zPxgf(uX=S$PsGdIYnaL%N62O7DQaCYMZPa8aX5B9s zR!f3pIJw}EB#XUL&=9xGD6Z}DO+-TlD+^4;DGZf~W=FwrPQa7Ls5WR}P%xS$rp<&_ zO*{rzYmket)O<VJK4@E}-2Ko$`*mch8 zHi|&3pzDWSKKI_7NnLe9>_&@ZgrRHM`FDc9lNc|M%6l6yKq|qhP%>Mk;@akaw^y6ym2QFs>>-L6jFR7)A`WRc- zBGj~$NiPUlrZS*ZNw6C;7=cIv!khEqme;iP`e76F$nWy<>Y{INY%Pdi*ohUyJx9Ax zyFJfGW5G~XU-#z3LL0W*ecgWwCjd6oN?P1HxpPLXUi%Mf6q;nL&~p6b5WGH;dZ1NoHohGGMOZ) z7=WN~&(`3om$lh=S|ckf|79}PA}}97>B^QF0MwT%kC8#mv3&CY#amb=3Ce|$)mMKR z+>lu{tIgl@73ALlU)bMM?o;EgwbZ@_h4_T&x`O; z4CiEy;Y@pfVhJh};%B>2CK`#_NCU>|L0{Vl4BpD%fPTH-h1eVD{tX|Xf4Xg+1A>QC zfWrk98X-!WNO%~sJ_W64i(Z6?u^MUxlxF#G!7XUckFJA1zrjkA>j0GHOTOd(jgdW} zILH$Q+n8~ms1TNt*14kz(6^W2s3=JA%gUESO_0ZF43TO==mU&(P!tqP1?3+09mwn7 z_dEB7lBS|!_99>~U>9e)f$aPkB6~zeh<0S@Y{d{sf$`j(Ee%G!r_(iSU@%E-YCeFO zgJXj>m_Si3Kh04(-uWI~jSId6sg5ml(}5KY)q&e2So5A{ASPQve&X7}A!oEGWW6S) z+bDd*iR`3Ma?JmI&RDrFF@NUP~ zRm-T`NZG$NU&;|2EhIM5Ws{6R0CPBJOhbW(wtmIS6S5HO7DjTu2 z9cYnsg?aYeq2gq5!3hg}$ao$4OOvXL3lCd5Pq<&TW!dmBqz0hutG$NW+LVuNv4LQ# zfitiqKyJ(3!)Zb$O{5VweI#xmWtv@hqj@&Fb#`tly5H{m=wV}ZZT z2jNAapLpAP+tCtwFFiKrFe&Ssu4hhLO_fviOG%O6LHw*+|Deg$apGVW%P3aUWeS?XM2dzE$o2rR32b0K=XGJ+#F=+&=DRxj4Yh65ON3qtKgJr8-t$og@AWPaT zh;G%RQ~MSscP>20`BIO&e9*pl(21|wXAWkl{Or*;oodE!+|q1NF8!o)aeUA@bCC1F z7BHNDRcnDQtya5R44vBP#wvWjv+8ioS93^Tvk4|lgftd}#2vW@%sn$a4ou6l26=1_ z>aZrx0v(kHjJ((bk^yP?(6eZUqUQ{zqNrh~*03m}w`i=rcj&3;*-L6|pV`#PkeAka zb}G7MNzu-*s6!n!zeWAnKEsOWk(i4#i*Q&daMeNazzsy%bBH_#98%?oMt;$= zKmhc}c!(5bwo6iYsH?o+tyjYgIxKj4eeWj~AR2J>Er?^pL^N9Ed&)nbNWA!8^VqUQ zS6gl_NWJ_1luFqG$N7y0JA6`H@X{)ODO;7iq`vPuGk0pFuLue*n#T1{`F8z>^62=G z5yqs#P3rr87`3WYxrt1ELB0R~&aLle!n<2^EPQSW}IeFK1oLM(te53_; z)s9O(p8c&sD<&>4Qzg`;;DsTiv`R*RufHxMVT2#}^YwzkxY-lij)JrMs`g>6YT@Y1uh>(5 zw$tstXrwT&&w3Q5)V<(62=J~chqEjV=lF2Ahm`<5&^ptvas%I!>y+1XQt>R1)+Mo= z3;C?@Bff4zs*}VJJspKmd#&Mm}nAT`E+_sFB`C4ulK-T*^)Y~2wLZ7blQ&TUo zK^d!++vnp&&5o)9a&*49g`P=^`1zMl0CVP>PNUbTGT3RP>wK{Zu2yiofQ*@+Yh!vW zxW>d%Dqvw{`FHjJOsqPz%RA34-+fuARO&(b@|m#IK)3Q^1x09c4U@dIBl+@HmdpW- zIfwO)f~1BwHnkWIwHh;sVhBZjDSH>Yf+2pX^99#=j9Qm#6oOtShjUu%{30+6QGw3zKb8dYjH1sN0HEWa%F$`Tk~Z*!T38mJs>l+>#w z^QJNh8UfGpo)#en)?enFvl!o641I#xrc0&0zl0^DeyyPjQ7za2)ljWr> z)k1{$$cAuIhAHdF!^bghuMG-oAX3%6xw?69o*<;Wd<7Wc^S-zz>a-YR^h7EwKZr>Z zK`)iRpe}XI7+yi=8orZgzRg6?DzI21>7@uxJD5i^SAQ1?5fD*mY+l%N(gHPKQ`!HfOS5P5~3(1H%Ci`M|x|t&_7{9B( zaX5%`BHn3+U!yf`l0*Q9juxUY$7B`HQA9WoB0xM=p{cudOxCw6ZwxnZ`FYnY4*!We zI(M2tQKLd6O!J$aoY@_KDfVGFMmWe0VS(S-a)k7KzIXurK$iknOxWZ=^p)#T9tfi* zzRCS2<%Y8ZgrCXqicMl;oX^TL+(+VRs#J?ZfpQFII#;dzNwU-7BMXlg8zxRy?Y(sE z$l`WqatJesiNh%b)tu@Y^|8&=W^nEvPHh$=i8nr4)JSbJD_~Why3@WiQVfp57M6^XNm~hVEf-_TX&gnP&dF3j09x{>cg~Lw3u&ha%VcvL({#CvK z&3(SOP6V~;Uda2ftk!2w9nLPtf6O`BcKJ8RstKUeDnH)=kSJl}b-h-E{9^VO7Wv=# zEV>Y7ox^LwDL^CTMZzMhSJd}BWS`&9eAO$;w?S16kQk|hDBp#s44_d171J?6CYjIx zIP=bXn4|bUUYDmO&9^A8kCnoFa#bD-%a4Fr97zj(fg6#CCq9&aO5M$=9wI1 zeYT0F==GfX9Yo2zP(gh(R(fQFP#7j0?P20!IkG|)_)$(K*xg>_m#84F&$9NW1(YGC zkarvf#e^~O3%e3~%hqMb4_a^u{v!nu$yYzf(OBT`&*iJa$OZ92*2jQ}8`A)(*dIi51)J;NeAG#O6$lb{nAw*Gu}Y=IpiD#{x}o zo9o#?!yR^mm-=$dEoFw3Zd}?pF^V)^0_JHNQF%P>0pCv%5J0bv+$=;#Q%}3!95)qF zMsSEd2P65hQePr72@LQL+ZccY%ex>m77V!E^nuxOtW0iH84|QypZ%0YJk2OD?y9`e z!be6HovQEVqsAG>yitc;Di-z=yTPGmoxz|WthkpXiwBo4Xld62Lz)yO5d2Oqn?2`I6G1^|keQpcS|C#{>^72a^O?U=a1BKP93?{ct zgGw-w)2g=23;;*sp)oJ%gnUubJHIuJ<^hzGz60V(bN@C?72F>NK6Ge>u7DU6>wpXD z8b}k?ANh`4d&Ul%0bi%+D03SW#%O1ZhBuq^w!42@#7Z!mq+?4WKK#Cqz z-hz+G5HtEM0wx0A>`22KHe(T6)PR0UMt5uu!vloDzv`9squ5yxetSHqrl%c*I{}Zw zJUy_{@|3iix4jD-74TA%WEab^-EdAk+#2)9jfz(UY4wwvChS6CZF6DP5 zC4|0{48I%Jd z4+F&!4R$tE9(#uu4giKDVa7f45=6@RRMH-=D*s>~dB>j-?V*E(3W0l~YCmOoPP0pJ z;UExVG)bSf)knW5z{zu*5D8NBujx3Srw%KMnw~W8f_}{aN)^JZW01oN4L>ibGK~|W zt@8^T@<+T5q2^nMW=~)qL$1&ubJ6|NgNuU_EfR$>@=CvARTe<+FALBhTXL2=%ECJC zX&wUv%gc9=uHZtm_AKg(uN5-kKCLgmuU(#6cVk^-2&cMbUJKnSZyA17zl0@}jl4Ra z*edUrtgQxClJ6j0 z9xK$2&DU_D2pG#_l*Xw3wGBP+*(0_7z;t)iyv%+>*D;mtu&Sbl0a7n)j5t=mr>-=B$j zFKSLAbJA>*S@vkoZXJ6F%sBWKCpM+87&Z>V<#4$QiasJ=_7v{i)i}UFPflOX;6s$L zZTc$JjKCuVv-xu6Sv6!KVs+|`P&lJ>R}TaCPTd5{@M2FMZgTnqB+5Q}vnBSoW)M?S znfd)t<|Z$!SHX}ciKI>;lK8o|d=u+;N%MADwCVbQl}G$aI2zzBt&$gmgZIE~meh9e zaR=0P@U2T~0~gpsl6u`Jk0bvW{(#ga7iGa9wkD8yKZ~hkuYejySg-~pEs%h9lO?eY z3rfZb7&f}#Vjh) ziQoQ*K&FqTWZ9~V5^V|6auI0L5q7;xfS9E}?QqZ1d-rUKQV7j$I5OJ?2Hc2b)}c;Y zV4BH{9&!dCpx}&_<%pxjPr)+N&Ugn^ZI;KmQnLIkc7@JDHh+ub9bU{25fP#}&MRjg z#j20`IM^tZ|CT_{DMn(oo0Ign6md!FB*_w|d&nU~eL@@9rf5isqst3i{M$}DVjb7# zkiivrn^#@HpGDUqPhGHs+o=oVmv1iIvE#@rG{hV69z?9@7K#+>lhDeARN-pquU=az!)`X8NRZ2RcjO{?X2MY^KVz zp=JWE_2A0X1)9qFj_shSgrG_L%g;=G;HfPn=e=!;u z5T_%@(O`G$$-KF3=^Iy)bwNM+*mfm0c|ClSkRm_q4y18okQ@7pg25LRU!R2H73G|Q_KCEiDXg1MxgZGX`sAosVojq zAqicFlMo$i4Yr;nLew#`xoXxA;2KX|UEWD0_zN9_f2jBZ4kO%_Ha#GWz-hBpS2vV6 z*-+4h6vwK)cLEB$eDtCmJp`A%>juMp^HKjD&A z#%m_c)$Z(OExw^+p%*)o1Ngfcq0BxZ7iRf@65MQgs}^VGiz_PL5a81gpIJjmf;H^+j~2$pnp~8`u}NA%E4K@E4%vog8!U zheXY0od=XEUPfM(DiVv@S7E%$vIo=h=Rf#Pn({)mLuFQ@6tsoAP6xer_`DBML6{^b z@%>}^h2+cq@AyOK=@fx~8j5E+A$Z3T<`<0Y-q$w{UP*XVZ6 zg$%Dd7;lQpwC8Rl@S_xU&9mtHyrv$ob(#-9NEHj2o#~{i^-HY5F z7$i!JGRR)HM>5E5dr%)_rft3Ouz&Q+HL03L%w-H^lqWbGj3t`6C|`+?!y^6d;FfQ2*l4?ujZ0?n3uTQzfv=WdIz;HOoy zv4$zN+zD*Z2T&hx8vHGJxJAlh{%Kt@X&l)<~bdWa>AFOBw zCOW#-dEU;Yxs2U8U@tKX@GE;5s(chaspQx=$PgC+-5#(2|M*1G;m4b)iv5F$C>>Dn zE!ucvfTG*@-Ox|8&;NNe+7QJbpPQ zjJ!U!fFHmCc`GLa66ltBT@oME0b9Rkg!p;4{=o1Dc$ny0^;x>W#xOO zx{u{C%;K%K!TYNSjWZ7JGI&zfy>`6aYHMvaQ(ScbCdAe7GR?gQftdU5nnzE5Z12nMq+-xO=<+v z12>b-4sZsuCr}3rhp1Q8aSRk29g{WwC|Y+oNfSs z^68$9TEj`k{J3Kk*&b{fe4_kWZtKs_#82wF*(E1fM#pd$b4m=M-bihq~YC|7v?qini&|mImhYdiP>$&@&P@#nna8sI;Lv6Vpmv~S z&Ax1KYxV9s@G;Rj$f#F-FMo_2M5iU8rfOnGTCm>y279TUxwSJ`o=s-1+2q3& zV)eJ5Fr0;E9)RCE!52NpFEnVST))7-RpfRA81nMt%vXC1&EzW`K~zRIhNz#2RRYk* z&OErDyz8y*TZ$24HEPKyDV`0ID3x>~cvSe3K-DSq006KCHyC6SicbNW4qC}iX-T7$ zz#&SyW7k8Nt?bzqWx?7AtBN3_ruc*zp^qRE9PVFkWsY5u5NQfiY z=L{MhG@K=lY&lR?Z!A9%43-+s=(Zr<1Nu(N#!>o*-~&au-&B6t`($hxP`*$e9$|;P z+XH!2h^7_Z|NKN+W`Xxjc#hCFn0v)JyAB1C<`iXZ`PT9*OuCe;G?-Q<5I|$# z1!KMoeUO1_?I?)X)~j1(GG5q2E=SQUK(ZIVooN!C4^fh4&EVYD_C03m{-1JRrQ zFdHOuyp5@n{W@um55CAqly6{T2*9ayIv>(9rZ=kZ-qP5K*Q+fuiUO8@JsBL){b&Ft z1B&Nq8mAZ(Jr$qz2b1$gA3*E!pE`X}D4>S|NRu&$U`1IoBH2V=p_#V;N701mhU zjt=|FJN726%Tp^o#hRFN~?L$tqY29ClYJtrfi%&~$&VAgPd#dYrNq z)6;>PCWEfC%}0yl|IbSI3=RJm*B^j6Isb6Hq{pcZ!_`3b^zXy^m!)F_6>^caZ1foPHU;^!Hb03?}S5Q-6hPwNC{F*$fr3k$g;@`kejFrQ=iiDstCxt!q*2K!rLN2Hipk!<31TFBt`c~_Tgd9 zfa@$MR_6gx?|6n@x2@C2z4bD?+vH=XfSV2gVYeX`O60cGun2CI=bhV-q!9p7iF`k;m zsn8M~DA4LYbHwElCQY?EQ;udYMdL8aS$QA_wGD>sMl$;nYWbRe>V{lc8JZ( z*g=&~?&OI-wf4)unF+n6d`q0KnUyzRFeT5PXcvF33}{n0}G7yll00Pki!Dsb)9 zm!JR>ov|yoY3$OS@~>wcF>STGKMgwa_49?DO&nI~|u)jc$2ieg#= zc{;>kGO}52`Win;Q8$S~p+2fDgkevn&yT8;TqM;V(J~@6skl|e7l?!& zEQ7imYw1P^lyr<@lU#uV&Z^ckWlwuKDeKJ0<8b+<~=#%D31oVg+}gFL%C;`8ZeY z5Vi8K;;f@GuwZ>wZ-({5#leU>kjgnI^>H#{Q}5Q&llaXi_-f(NM0xXZl-Jf$l-D+l z@*2aY=;;I2L*n)v7iH3$qP&Tsb5M%sWz&zil-*Mjq7#8=d`M6n9RYUb2V^K@Qlo0! zOiGZ$5KJ_Mt7~D^PM%6Eo#c;db>BYCQ70{rI@y%cZ^Dy?>K~#tD^SGi4ygq7L124} zt^Bb?txca2iVEb;6t>T+AAg=dp29*jg0D=j>&nOfm}EP$K6_Hrq4KW?dkJEb@u%6U zHlR^a@8;QQz)_SpKsiyE`>z*0xbe#ry~uYCY;X671x9tTNTF_796nK-G+Cq~a)sXH zNE)hk(Qj-eD0*>`zatHb#~WR2!t9=4>Suk`%!x`NazXsWUez1qkNiM6JIgw%r#pzzCu?y- z4vM{lUirM3OA^xC&A0$JhvV_(lZ)f6-J<(0S*UjQqcQi&pbc$Q-}uSf`rpdq!Z!KVVdGl$SMDLg_9tdNBdQ z{rRwW(8TDi>ctj6I$oCm&UvO!3@C3?pu|>LdYqeDVUcVV+h)R;%NHF{_p+_=Y`5uu01Oq>VJ2{LFenb2Qj2v({)SzYF(Q zz+=DSB}#48IKhWt&1q;CXc*8CgBTs{S^tEnj@}2VH__*W?x~1bl|i}Z1T>2@;IO25 zqjPMAEB_w@wej3e48fY30;E9BB#D4E!II#;1mKLi#?s2ukhw@o-Lt%G31p{iRUEYF zkRcVPP*5j{TA@HI9tG79yw2Y-8F?!%ut~HddujsAH?(7A3hXH{I|fADPzx>dc6~OP zZkY143w%lg)M_=+C+VbE8_A83jM@NmEyIUbg+W9%0cW2j`J3tq9=Y)MzyFroU-#~N z-~UXLb^{+b!1mzRB#jOec*yc?_%(0j*F_mn_v}igMfn+hhPqpoj>%3tEL%0M`{{|H z(r$g#%L@91hcV_TJ{{7n;JaAl2aSASnx2+?10FM_Jq>ZG{LtwsM%{W6H%i z@`TEv05zcglyE;HpQoz|Oy6yhqzsLruzejwCDE)cQ<+G-aRLbQ7L+P)M<~8WToxt2V#jOGho)_!iRtK*46e(SRved^<+fsB>Z;?g)x9gZW5Ex1tGM$RLk4-i%frYr7*hwrq@fPp1a*+3>ZI83 z&yoZ3b=v1!^{iIa^iUduy~gm-vB)`8?*8Pe*`CUxy}`7-m>&0HdejTvL@(9>6Ee}( za$(1q)3~r!{B-&RFRHnqLmuIXjC@Rlz-C&Q(NJ*%{_C?1n(i#qcMVwzaKs1fE#(fR z6b=dr2#1(mi<`cF=-Lz;O(>}wh_l^khfNYD?a^smSjf&=5k0({__fU3%M}aNmC3W+ z+PP4@e6X^bNy7eMh=I))5@H7iX@&=5&^ZuJHi8+kyeQDY5sU7D3g7QAo8Tgv`ILK6 zpe?gu11@Ys?eIs=#fYv?4SIg%3HPXd+xAr}FIhNxXB>|_f{Fe&viR22A5Ro)fE`8; zkaYQ^j^LZ~EaJ4WcGHmw_D}yKP!i3nsUXg1S;N-rE8S~-Mo~e=R3DX(K9p(M%#gU* z-5dyn@o(4dcG88=nf`Y^&`d&Un!r}Z47UV$6g1o0+n-xlg}|+Pdk17H*2Oj;x?yJ* z(xsde&snHsY^I5qd((Ha?aH$f!l-Qw4)PaxL&dNT(8rTRrqs-&JJiBz=F~8oqDtMK zy~@Ubp}N|DRK7r!5Dto`)IvqQl}=j@AX~0Z-+aCt#eVonh=&7@MV&&-PM{HEG|wia zWb{C%*4HnaS)V;ofHVM`1jJTces*f#V8zab{9*txSFN~|Yg*1WRUO=4!9Z42b7#`G zm^pAeHj9U2vg3QqTr7WZpMe!l*$TBLs-8PT#XtzVUp<+e4M~Ut^yCQ1hh_TZV8ue_ z#t-dkCGeR^S}cj@EBJTtnXAixl2<^NM+7RG64jtP;VNOvZ~(OHr1xj~*humOWd@)O zcwYXyai}GT6Vn1jPK#-oVkYSK=o1E)K8Z0H`{UJ-#qnIa!B4o9Bpv1pu^A}RP+CQ6 zb)zDK^CX^@-_z9OtDZ^|8hT>rG^{r+ekO^70BM)+$7z#9O(@i?Xw8f|OvC~`K%6{k zD(g@h$%=lz(a2!rUn3eVv5XXKv|yZ<7DG;w+O`e+JT_m^y{Q;^R5$8DTuJUnvdoaN zGiHgSF~-&j0(oZq%ENt&Lcd{FC#|oBNuI_p{M4B#q}(!0)WKTL^8#A`or)% z@qpi{A*A@Yp@N38qR6A6ratnTn)+adHUJm2<=loJUU1mX`)sFMyRj(@=ZO5V$L1d7 z&Yhu@l)e)^N)I11dc7uIci+_F1gWHI5(5ii%-81K6rq1Lc{$F&+7~n1KIESDgGaL? zQhAoRcuxj@vV%-TyM7$9A7((d%%GFD_9(#5_1WVPaU7mpWDL5#<+dae;yhuOiGXzK zCGC0+Gc#rKba3#2VE=~^-vOP9`a37DMrW`}z8;_kdE>DOEfaXqqD)&i@B|3( zU1DWN4t@hJb{NU&m9TVB_=kkv7`!p6P#VR?gXtNjC4|uFzCirtJ4)v<8Q}I-Yn`t< zFZK+w){D0iRs@?5XwV$pQ~9cO@^%`d=>ikfc8B$l$qmrlMg-4UcYhwPTi~EmFg&3I z^2|(4uKxAe|ELNQtNFUa0Pf82_M>N)Rp zR9FA(352173j=q;HkKcQ zFM1E>IXB&LwyCi)p1~ckHN4~GQ)bCKqNZEY9Ve{P32R}haj6{D0&?D+(vb)7tsmO>^vqv}ldFWMuD$pL3 zZmJIKXkb?&4FX-#fSI^W132W$KhRw@!UGV=O+bD5ApZHqVifv!Ng|34c$3%?@dO$e zB??w~ETe}sRd1HAbTQSJem2R1G4G@pW`%f+g2%pF{K3o!4n-SS)HU07aHkwGjW<{t z6YmbwUic5qE&SQQEEX#kG9B^+wVs$A*bq#{axg0{^nsZoMFfd~dky=a=JD16LK5~u zLm>Z7)iRvWSVd?^_hcuo?jAu&%8EQ~vRyeYgKonLaK_08bAEYmBa&P9x8tZdEiuT6 zmsxpho5c0R`uX*>V&9;}gQ~T#d?!A&Q8*Bo3npl*{7wgxm9MFs2e{vKz0!^ZnWBSP z&>p5$)JxQ}Dq^4O`VEij^A!$zH4*A4=)?LftBc4=vVs_FOt8|^n!Ha8%}2U>Rjn2V zBx~ZK-%&6AV3IiDS{*WMVFN+7+<`oCEPEZ21%R9n1#*la^+T`6bJ5N{%LZlq&*IXO zMv-#Q^bxk{G1)K0oq>pF#GQeNvzR(m$--*3q{||>?@vZ$9yH_ea(=p8(EX+{Dy2?_ zk_;Qlngp?l)0j)l%cmx!EHDrmE)P-?rBuu!B)1kT!ZAu0W>EGIcor+Knv#7|MdVsx z#5N^)#uqGQSCCIp*I=rtt&i=PmM>In*N5xSV$)#71VK!+2w?DI9q65qYL{W?PG`E~ zXf1^p-+TH)cW<{iIE60s`?S>9ggMX!9dF0cFNXQ8DWx>@a%I1BFqy>Qkos6X1fb%SNWdyw_v2xeUZ&uw>I z%7<9m!^nJq=g?*_Ok_dQ@2F@!4mi-{pc)aeZBXj}Nl_HgmdZDb*3=l1XwJuA%9ZQk zm;)RD#62q(`kGg~NhK?m6g)fzK`)Io{tW&q5_P@pi}hS9d?`D;8Mq#6M}66Ae(3K_&+|8rIci=Z<0`hI!`FrVNn+);Gcb<&8#f)P%t>uEFW&40+ z-DN%0KwG;2EgC)PA#SCl^P zzf_unYk#5_s=nsd51U$0f8xq^+N~?r@)Y$oiv@W>&x7@AatG(J;qlsv zGXNzS*g0j@#Q=?G2k#p^YS$jtn)bKWJ=TnG?a#ry+We;=MpUZW7P7;+Fh{sCfgSt@ zG3oJ|!K|3;l0$d^;Hg;27X(%JE*Q+z|M<8a16&|Db~p-XU;n4Do%`ErI4M6?M$Id$ zpZcY63pNOZzouG=ub_IA9t=6EFT%MUQ)^s`K45U*sW5(&FgxM(%00A3w=}YK;(I?A zlo~j35|fK53Dc~WYhzQh+W>PpO|_I}clK90W@>|~7!9i*^_S_0%j&D__kbq^UA7wJ zBfV8d9(mZ{T3Tw2{83~_mbY-EBIVTST*4P9*R_qPpV5IF!GS|O9Uohv#*=e^>fM+J zu)^eiOCcYXmvJ1ZNDuLo2RWjhHHdfoAWlaNzILv_!G|Hkl%a=}1ve#5q@SC9r>$Zb z@JYdk@YHH!*~9ZpB*S&aSM}S9`UcJdYmw~Wpbo0as3FNUe9hI6HF-V`94xgUyR)W^ z33ua{ky;#bB*NjrLGQb1_Yj+d+r^p*Ss-a)T;Qoq zO)g4#x}3JWi@5#Um*(NY!R>}gmMtN!s;i0uhT%w0650YRb}@b7`)*knINnQ31e$W8 zeOnII!Q?}Hn*=M;`*s8{V^vq+c}{y03EV`raJ!uOjfn(ET6 zPrgIar*ZuAMOYaP@&hPpbMHa&52KrDs#VpBg<4BXoN)5tpwdRj%>FG;`6#B1sgav|^9M=!T z+2E2v`w0#uCUf+l7x=XwYZm}cCbJU=5uXgRvjgdKYo^9Y9&UZZ_@zPL>Dvl~O7FGF>M4LABlW3bd8Bj90*zqBfEVVy+fC?sv zeWQz8(+{^3P?q7shhl&wVCSxkp?b#(Sc=G=j^ly}im_lcbR!qoN90j99*Z}&NiQ|+ zOMi30u=y|TdBx^qm}-G=!Z|E!6A1`|-5#JDNO!AUHi zz}Jxt#CzsEs#MA`6x5N3;(!^>|4&YR!S!L$>c3Dl@J*Qg7s|Q`KGi~`Ke-Epmq0!@ z++=dFBuE^F%dc?{jH4B2Fo1-(E-2s4at}I<68@9r^l6S1voAqgBJF#7G2IPmvZH{1nm%emH{w~M zIv>I8;6{-$Ke5o>iRc<*)~FEQMg2&t(YJoI0q)>X^QL(_v~yu9p&?^Ptz8RdrMtz6 z9pNxT1!)d}e*s>?LV;b~YNnlx^DCK*26VX+&$devoR@ z3)$1d0Ak*wLA=F3$>Pae(Q2c2fZH^+lk?M+c%zdMHtHW2q(R~m?PA3dEQ<_p5!kWo zGR8P_=+CFE=31S!8mD^WxNuJVdM*AH8T)+wr8F%q{HF~Ea6-%f)voVKZ#q;atJf{p zsvk@bRXS)ZR>5iBZNw?ZCbcC(tLv?~`Hbm@v->hiG`>cu0E88I4K|%fmE-$LT%+b?Hr5I-SNX%D#Tt)L2@Q z$`d_4p6LD5PPo$B2)8&mseN*xw-ewaEf0LkDOMbr6$J$pL_26U?GI%EiIcRNrjogx zm@iR0fM>m{c%*}^c?!C^kd?^^27^EZl;m+aZ076Ip(TzAfaG}y4{&RH&<=t#UcPe? zGaY^&@ABu6t=2jh_9^L;X!u@kp@CQ}--vpzdqJW{Gb_2Gu8 zvM1#8SV?$OMn&Q^Zj!@O$x#t9S~A@yhu3-R<1UiA<3Y{2pa3lF0${U=*}*mns^jO~ z`9PEn-HM+{A9Rb6KHVCtQGwx+ioS2*?(7m0opU>3>8L$9-+YH(|gl| zfQG)mb599cVeX%1EL%*KnNW!)i( z0VI^#A+S-A^9NuD`0eY59v5jW)J(qss@C-td2CEc1r^0+F60mp_AM|(!_S8v$2nIQ zY-Qmsf{i@s3f(;M+USasv0eTjQ@unmOa0G;VZ~%Mfw&{Qhf2;A1|Xnv zb}o*HyP+SCYOYagMva@Q1nWr^bgJ~wFfuJoFSfDK-7xBVm#795mEJ)L zURPL7b*>6-SsB>Y`hlUg(Dl&UIAap!4lmE}WQlOlb0mapoX_xLRIDL5AhjMBAwA$Z zlv3p$Slko@b!Z%rE}!N7=$MIEQ(%=5U&Iy*2br|}s(;EF$5?W&bZ-(yf_(`3<;x~p zdB*<$>#&P@Z{qL^)Q8thEIG^qhD$TSyO=aNGvLX}yIT>MWFkpG9(wxdD3Zy(tm{X? zI5gGusn9jqyvN32A~`2A7;_>}LGq}Y)HRj(#sZv`yt}^`O#vygR+pG;j6Sy5pkBkr!34Np!>4Ag*scPcdX>WTiRq2e zB6VO4Y%nmH z%rEgzev8hdt5GCzVBs;&t>}OwS{Rja_D7gJzu`mncXC3l=sXa&h$Bmu%ql|*Z_EP z^r?qR&e8+DJJC=POYyBo#ODGiRhtl|wiT(J44lJXigEH5%2RG->uOini(gQVeZ&L? zd|siS@_|lwdFrBUjK@b7o0{E>3>us@h#VN~IvNLB__{W5ID{Dx#pbj}252Kn&?_i4 zsW&m!Ve&Gqwv1k<6`+z)0_UKHqAey-i!Bfi_wyKuM-F=E7Ve6gEA zvSJ8~U~)=YIytTQNbq9mAuXw1n!k$q+Gh!G`hn_#Cjv)rFqnIRyfZ`7VY#=;uS`M6 z0+&~w0Fq|zAZZAC4&4b-1#Uj!*_Wp{WJP^Vr}zjR#nd4-rd0_{&n8v9A=($Vk=osq zw8H0S^ z&U}d{1EhQ?EGeyr2~!Q}&REs0B&AJtpOko3Xy<{MaF4)DDiJfGp-+-BCblIiD zj09oD_#~0=stEf!yr-~&yai0i*-{~L%9^va@v;CIbh^@DtHP&oxz#9eYVxZBPeQ!2 zAoT4&52t<$#k$=!srAcTw+%EdE$Uy~Uf=wkIC-nvjhB@D{i*J;+zaisTwsH&CRNn7 z=J|Qqk66?HMju?d7=AAlVBc*@Uu@`py2<0YPn$LIUTFp_N(&=z&vkeaK>>;0Og-X0 zeuwg3S~1}saRJS>%NL@4M|@Z*iN32YFd*3>H^$}Ecqh*Q1aTW2a;opV3Gn3cW)OH1 z`E>Xk*CI|QJ&NH~yFDMixSe^uJ&?P(^3|7k_9dSc_B9R)$?JFHD=GY2ueB>N-yd-r zjx4xj{j3Ens^STGI&m^%nJ=TKOXq|zI0qkT`99d86Bib|Q%#Kl?;;(J(W>u@?Ktx8 zTfURG*6y0Pq}YiuwwoP*!@lPzJ5*_~;#|V1T*yD*z-5xT2|0YTXkX&>fdZ)Uj-8+K z^SABmEbQv`=a(u0x|%EZ5KS(a&)G z0@t+w?`I8s{;b6D-}dj4|F)L?`^NPD)KbW>LB8xy^0(#J=5NhUIr*gj@8>tT>K`d| z=;P;qcJ2CC<>}wc^OxmU#=pz*OY`3(UE-xL+IHRxUhsm!;04cm<}aOj*t*BY{~mY7 z)1G?bu}?hm$l{33#N<@B*PC5-P`P}?!E-BDJ!Z{Me>AUt=J1c^Pq;C^A%9nXJiWgCdddA3dz%RMHw@Z3lK`IXoh@ z^2fuEdiL19cxKuMQ`;y|74BC3nUVAlD}w#S8m>%s@C7?@Bp2*Q6wvv>A*P2;Rfkkl zhqcbft#v+egO3wn7_yh;!iM!99$(L3?SsGbZJ4CphN!6*hSakQz$~S^_|-8Pq5?5p zpmlI6S8#Y7`bgXQx>v`>2r1$H^KaAjh@+(38}06-d1ogyC@guDJR=Cyyoog%Q}y@1 zh?2~*N%m9YSvY7SdO%+62H1`V2un6+G*DaX*R|KV=G zt+tw0z$#Vsl&`m3iuMNp4!5FptX<8b;6HS*j61+nUQ36`L! z*m+Rh02YqjYf3;_FUCqEG(R=g|37?gu`4A>-9U#Y?hAlE%CxyNOx&@V9<8BNCS@GdFZpcW- zdt5FpYU0hS2b036XfoSzgfkhuoj3RQqEtEp)5qpGHo#1(Yd1>KQaWq^v7aSd9AF|{ z?|sDX&}|V`{0kQzeJ}snl>e`y;pH*$03P>gSc4yMN2oN)-tVXS&WV9Yob^0;M4B3dy#59EktVqp8Li@7I#FuQ68~8KmN{Qd%ZtRV()!46dWe%13|{@ zrhz5L)`%a4x(53E@;a>-%023SA72YTzAL{D`}0VJ>304Lc>MU!0UfFAl*Y)^xcvw8OSMm=fzWryI+nd|Py16?xAruE*Q z1Nyt906;9?nD^crZXHM!BKZearfi;lPafdQq+X7j+`+ES$&WjR;gQ8fZo>S`+4sUG z*JsaaO76>W28y)(J5JEmBgJoiLa!U)BPaJPY;` zTNo8m6(?Rh0?680;!iIr?aERxZ}^Z^I^Nof?mb@5T}E1N0mzH6qA?J7hDYF-|4G&u(XqXWwcJb=EnUMIyD!-=lZ@ z@!jTGSv(d#jODG=FRL<`{4Qw^q&;sdJ{<7vT?e*(0NID(^{~DynQ%WX%IEhFq2=fI z4|Vbb0c;i1=bzbBs>pI|yhEx(FYh0sKaRUAxZ}e^PsbN@222uWeJEa~0Sa5Oupi^B zI`m?mYQFNVAJ0R!edKu@(L(z8iPa%|uzlafsixs$LoJ6?kH0cKqc5pD(iQ?o>6vh^NfK)a-SrBm@ni7OE`LW>u+Gwm?0gJ~gGaOeDNGcMq+%|JeJq zZ&h%5Tzoe~l|Y}hp5-1A8+yOpRM=~%IFM2Wp5wN@xGzkZRJ)q0f*o z>U+N(CN~Jxdjm}{hpsox>o1L-vkk?{=w4obrFr<)y!Uzvt48&whh`je-P-|!37)|k zaIbaVUs;7p2s9Rp?M*_!N^3H08vzLnIKGu8z#!6cw*!&hn*;pQ^_uloyaDVx| zSFiI>s;Wqqz6>sh!NCe-MElR#PVqlm&B^zCzJswYs}4GWSmi zt-NR|&m*iwfnnu#J}S?na>qfqDdc_m<`%$9R9=yL`&4@8vRhl<=AFK5)=_olZEs` zG5vr~GfSx);|`zVL3GUg#wB$&0()g+W>9@Ov^X48Xl3b2)$As-l98h;>D@?UPk}6< z=>iN#fYDGb-&)U+>lCbXrSifNE`4D}C(n9IpIyVVG5ch%q&Kw~|Cp7>lk_`GqtI_! zXkja9=AAj*Z}3>pTAfe>!Nm$X8g`43r{*~a4*mvkq3OOL#k zFWsvwfTos|9jX9{2jWr+B8?s}<$Sq$-|!>F|C{(&XdN&@Sm#AlS;TZURm^H*HHM?| zV`10JQ?*}5|)31AacU{W`4sKs_@ z)cH0S7xOEc4{Q+&#tu^u&&BHYB?F7h}#h@y+;U=dQ zemA?GDG}sGIId-2gRy{_sv zxv9UgEU}0A0Af^jdmj0OxJ2CqIK`;Kx3C2##dpJ#a2HOE=fDc{q47XRM#ckvmpqO) ze&pBSpY2Hm4}6lF?5Sqx0+0G5^yQUQ8Wq!#^O#Viis#fi*;V1pI$FSr!)DO-ql1*- zOl+9+i9v-IDjN1fq7NKg7KNL;3D0bk#=t70h~(xb)Z? zbMIyF*Va{gB)jU6J+K6BwA)uy5PEKnB)( z`4Ar(;~PRBGSvpR6XgOOIZ0!e#%KOsjEz}&r7Cw^c5px=Nbtvv?*X{GJneqVr%%id zmZJ+jIr__n{Yb6SRawrkxhuvTCXgG>9JmI1j=jvNne&g-urTC~$y}#^_X+{rY=BNo z6YauM1N@I-fg}vEa)WUnqCSxYNEa%Ap0i8?yHTFPgbNW!rPz?vsBkdU z)&=wx@o`omKD6>_M;15JjmGbGGiQ(E0I;~>?5S$tJsu^hV(od5Yaz<9H;lE#e1j7s zZ<6$pil_4@=m3}pPoV}>B&P|O_-6z2EoB#&iZ}wVABreyyB^vA>_+l>mvQ%#8hCQC z!J?N^G!8Ysvq&C*%kp}H(K;2u(KgS%EI1z<>cuVA>&DHqi|RUw?~+wO03G10hN+D? zH5f-1&PK0;v7Fss<^)xcV^Giq6&2x@3F^d?28TW-JDX`@J*a+COmLfB zK9SM0scM-oGv?tMwlZjRDPx2zTs^FHXF=eO;fJ%A$O^xDXJ~14;=quD&D(HrkN`fK zx(KZ;sn+4L#ni&=ygbjr6JA;qp27yJ52#i2p3;k4LHYy-t1H;$Y6v*SG!}QLxw)GU zcV@4E2*eIhk||~78+jOvDSdyrD?(C@3lBZ?&@W$3ebK%HrRmtC_XlB4pm3iZbG*d{ z$8r3yU>&>$}dlxU2Hw=P49@qo~ z7Z?eBUjl^qylKGNA8m$GnJ!c5f_GW+y^~0on$t(P3aqK4iqEo0IL$6Rx5W%O@5xe7 z>!W`OK`zx}EFS=N2WqaVed_o~YpZZzA3w4r$oq(a27Zvkc1LSSxoj{D(Tpkg`b4== zM$%30WHJK!Rh2r$Lmfx%hrp^#8Fk(IlZ zS7SseKTnQ1BZm~llC0Rok3PN49}x=lYlE~?aK6uY+ZE}Fbblel-5gprZ7~gLwdN9r2W2p^XyBQSrH`}d7~Y>;7K2yQbnxV zr}Ag=X{zJ(2mf-oAs2BdK=BgrPmGOYDV_h^^ZQgI3!eQ+!U<}pS`MfKWzzl8sl}hX z8gY%Hq>cJPkmRMNH{X+;F#D3;Z>2#A2mD-#J`(Q-CvsBfm}yqM_j{zlETYbKBDDxr z>KRsMO!$@GCXXHdoct6(hisfk8uaA@Bx)V-@;DKe$P*B_`CI9m1qS(Z_#YRpSlo?7 zUMxcY@axaNDj$9g;ZK%N6A{I!S&l9sW>#>?7qAMOTq5!yf`Q0(;b%@`-c4&Du7mTz)sqdr@n zN2G+MLe=W>-`sg}u71;>u+_+f%RmuMlbhK`g^%Az4gwEY>5;Ru1OLHmmPG^oQhWeV z4&97q_G*WL$??zWnu``Kq~4-blsB_oK*dte^cYZ_qpsm&WrMN9+(}uNk)jZ%YlFOD zIJ5`Lf=aU*WUaVgv05P7e}-}co0Lvf2YDnQ6U(~o4KbMS-{!=U(QpOM02+>0RlK_P zfBTArh2~Wt;P7jXy$2Lu`J_eID5gORdb_IrUH11u&KH7;Agh*bEY@CfRO=)-lB~j$lc5CjsR3%F7U#2w?m*Fyvu+gQ_Yw;g zxxOesbq-~qk}dqgXg-VjFeo0HEWa^L24DI0>4YXCC-~$6w?7QCViogJexAJ-Hd7z$ zVTap9SjuzkTx_C`im`HLvm{i$f5tt;omUF1AZKjD>%qy&kU0pfcIL?4@?5Qq> zzE<~*9Mp6H<;bJ#M^&7(8bj%3)I8;ooM`v{As>_M4mDe6s(O5r!K1k~RXry7ja&#M zn5rHnH?lFeev8^bFta+JQO$zAa)R=Db{P=SIk4P|DSqXmBZJk(<_xMD+j|#=OdFZ$ zh!QzK$gajv4=(0RqNsJkWaoxO*)B~AA=lFkV?SoLd3W%~Q&u@l#sfSBl0ji5`dq*7 zwMA$}e0>m9=!Dic-9ajB+1@=&biHe8Gt=8)t3z|BX%?SsP1vZdwD#Mfu{tEXFEebkL7^5t{i^(Rz2d1E;rYrS?&I=vy_06yVMlBn| z+Z36%<>{1}6wg+qXJivZauVmSZJs?}{fK?J$wR}E(f)M_y)Ku)rqGJ2pQ+ZC?*J4| zuCw=>d_m=R(#y~fQiumQG~O=I<4k&;3?_BPt)72QaHL2%F4`MVQZ`B{2{#;A8j*(N zSPE5^wPOPJn|2NR9gRJ%U(&#%F5IaF_IPO6beVN#M<&~y&N-Y4I-VmP_n7QneueqQ z^si#4lBNB|++tl_gQ7NDetMDv;FS7}+1-1(YJAw}_vIt+8i~Pp*HoQ=6~SOkQgYXG z`SCuE>B9(k32>+TsKL}UsRg}80~!+GDb|Zt$Oe94$*vR9$Z(2|Qs4|{G7?wd!9(2k zoX?y+d{D6+y1vI~VUCY*|HA?58^20gc&u$2PYs+59e*mq#v|V))kN3yR?@_ec`K2D zKgnAehT70}CiF^Ya8%M1n_AR~9jz7}^;z;Xe3s{l(?Y=QI%6G9rtjmfF8g2i9=4GJ-4^*5xzNncB|+>u0PkKaP&Iuq(L_(Y`%TtM|f3=#srT*WQ@M(Yx4UFX*Q9 zQ`R@2JYcsoFG$zK!g_2Go;n<46nP+HTNtt;FU0IO5++OzX@0`pVJw>F+28S7Ds+|)fcf-&ix;C;x0+xRx zpXbmOR*lyfg?UO;*W^6vTgADzz_3RhH2Vd>ssOt_C;D0Nk6D~d5H*sKj+Q-!pWI~4%%aiA#_I8 z9MlQbxqnEohUk5d-Y?-H8~DL@DAWP6#6RfxoXa-j*%tXm+_7YPUAj9rF)hlm&(}tt z2^O`P$><=A9B7DC6&txIo?v8i616Tl{DdR!?r2rm7^LYqn`CepYbkmX@B^yTiYtV0 zcznp}i_YAcIG>0xuR6uUxH~Dm=Eu33M^W}}%Fa^*khwFjVigQOWwID0JdRG!q)jkq z$Ycq@p$;l5HigBZWkPa}3h9v3V;CdGv}E?wX#>jHV7VG?+@r>xS1nIT6u-tm>Ic6= z+lq#h8axYyiyTalLj;fZXUF(4TfTj27Mvc&@0LMu(1L`3QW#4Q*Hmp~e891Z5u?RM z6t5_+BWo9Zp(a0tjFIry$OBd4Q7Oc?NxtROp`Im(H~M?Gu8W5 z70e~zMs*8vOnNIYrFR3O69GcCP4a+tRc$0w02!DDl~Jl&d#Iy>a4urWs^Lc_h|hc! zVl?f9R=$O8s>X7ct`MI26*b9=dcPdVV1o6MZed^yxkN4&fIl`vkwPq?9S5`J0EVCB zo0eWu`r%xS(l3K&7Xg3*uF2XG&-aL46;_Om6ICjC)5BZAh13LsL=5H8SS0Qd-nd4u zFfpHHn8rjZY6MYkA>so!g@Dohj>&##wB&BZ=Kc?S`q-mdc=jedGvs!!P|mGh1L08L z457eAQNh6g4$92aQMDA`@2h3$71ggTzuFo=hDe8=5A)$xIlgo6`++$nWSYztIWu;{w}j;-rk({W){(bFEHy&M)8WjVS&O^x+rw@XC9CT`&=|y)NEakwn)V$lUoHZb0 z04NHj&w2%a;99ApKfJ>`7IAr!J6v)29gd{40!lRjrTQjpB+ee?{R}x|bedveFS|=0 z*7POD=bBDJ*SC{Wwi#@leQK;jiJ;sAZqh z@?Axo!6Mg*?tiI)Gh?5qZ!fmmhxEU!{6|b5f}dBl@n?0l0njRkaIxDas#bLlUdgUt z4bfG4eQWDf498*Ww55v)CjdQ=(+iOZbhS4pJd zH^p{k65!DY2WDk5`Gvwm--d>e80ao)LNqK#LNaIw73JS*JJK`(9Nmz;=RZP6+^Ut% zrH&xykXkTb*(th_JT+!hJ`Y@IJ$f7J7dAxGENif~GSpB^qG?X~##}g{?dLVWm%2uJ z)cSv!JM#d$syff#?JZUJy~<4pp_&SC-|Y$%P=U0D#RR2JnT;Kk)oG`3L7ggSNsKh( zgrq_OA}BJ7Hacnta5|`o;xa8Lv`GUtDk>w;B8!F=1#Q$cV#|n<`Fwxp-d8UH+MfSL zOuf6DdzRn%o!@?bXS((5tKsgS{JB1%b4hkB%6;o-BbNx_VyyO==FA{l?gDOQPspEP zBYwL{65@VnWYFd8Q562_rGX<4db|ndL}2309VG=;w1~x3&k?rF2`wU~`{@QX4-A_B zFTmZYMPx;Mq=1g{Z39TZL`mRn(953Y!5t ziT^@j0f1?Ka4ySdQE;wrOO^(i>*=JFaJZvjuj2$(3eKtx6Ta^q-(&BISs^44wAU&O zqkfXL<{g%>F}RGnO{Wd?P*=u<2(DrpSLqY5eoR_Fn!DN|>g7ICf( zT0*B-2n%2scp$L^J|PpG&c52DEF_)f#*p=AjEVVsAhoo8mOyJ%y{C2d30kP1Rb7JQ z?-M|xe#j2|a!}EtQc&?ES}PufS;t%Wa@a~}LMmicG)HP!(0aM`wL9K|V0Vf84EHvh zJ#!;Vs}Gd*{923F0Z?6dC{*9~$tzwQWXym{oV!JW0CWU424?38XTrEY{9EM^1E0`A z$^k>AKy1i`r_KH_8VD|kM&nG>EwMkZ2H^_k4HZ^V*i!bv*puG7Blew`1{SSTly>kUqTx3{h82CO=S z955SKn*zVvRL9b&s=G5%AV-6&2K?!tbbn__zH;P{rfGmi%%@4(%l{k|$^o#74JQ#=vH5~c%JP$0mM$P-S@ z`Jm8Phy(#qHZP_SMX#KyE^V{jQ>`OQwW}#whz57Wi%galr_fS}4x&PYL|^?xEed|B zH?_r~IIBlctIL=>k2H{Sd{+zE&V&X6^;;~F8j48vej&oyTFaGv3Uf$4z8U~YSmr257%fD@JLpvCZn7n3 zo7@`G&`HX{kh!2Zh=*j{%nwpAdAQuBUCdQbx_Yi=IfDD32s@VrJ!RImFY^Oof28s? zzAIb@dB7PBSM8cbnu`(B8o5vw@;+_WmOM4@qxbp1md-o~BWC8y;k*ZO zMuxC`o_dwgNxJ>oA-&-0K=P2!%RUpzk|W$eGM^-03tIxM!88;S275(sA;w}zjwJn8}}q^EE8cd(`vF^U{Z&Vg9QRzR17^To?(SWMOa&y zw2z7_j}8JKsJJ`9w*{t^y*Pxb)9c}Kbv4|T94rC{lX-{db3x%WdtZ052V0{rTqBY} zhO^s|mV`Zfj>ErwZ^>j|^sT(EW6ZlzYdTBAv&#kZUM=ZTo&@#e4YcA%!3 z;xI^01kiE@s-bQXH#?G_7Y>{`HNW3&bV783unk2KltvhNm-b@V^w|;4VZCJop@D!e z_Oh6Pz0g6ktHk*L>|WW`0>;VyT}RQasDzL+w$H_55&!uBC2DVg@`bWXMSb*U7YeuQGDKb;`hyhNLtp+1{u$^DCe+bDiSPCc%_iSv%&!d z4_KI!19h@TYQ+GNa15)345z&vb9vjxD)w#X?Gw=+aQj-{V2X3_eqnD>YzvK@Jk)JR zEb>YQZ9rl{%u$1U;F;We=z$|aKmU|PtdY-Es*eE^x>&uZNJWvdY>G1LH@v`QZ+Axn zgCT@w)+`{h-dg>oiZ=(5W=H`m@9~(YqFPpT>;h&~Qlkmth=kY{u{}E0TVM#7ZN=V+G&(`}qQ1pUjEL{8UJ9{jOLA;`3(3BmE_;PQyjMQMi-|n= zDCl2e2rHqQ@PW<@RX<>_*&#O3$$TAqQTR4M_^{OK68-sE6i`i#NubxaMXAoXikKi% z-O(LSY%e3a=GCobFGOk3xGNw(tl-Pz$Ja^3kOlxW5!2qyY1bgvJnasaYwfk|5r37P z)!wHCv3&snV4)79quQ_x+ul=JGjOtF$45k5+Fpv~f)WyB9@1E>L1u$)OGe>`F+mtK z5=M61ZlhVkXy&xwlHI1gL&?N)^%|0lIua`)7)6i4YnjW;N98)={JKjaG{ayhRF|W& ziGXDCyWq4oc@wl>ZR8T#$Og3JjihEi+sH++ebM&4$Nyqo-arlBB zs|PhH2&S@Md_sF6D+Q2y33^!t@>biaHA~yERM+I~;8!Dr;V5KuPf$>CIk%TLL4;{# z+GZKeVq+}OO7fIHFYIm|D7QCB(18AviNX3%RbR=rp8k(n^K!00?=Tc#Xnb!M~Rq?QqJrL6&LsF($mhcD?$i2Cy z_*jT0O;I!j^Q!Htg~jca`stA?O8zL~A+r19_A#wvWww#+;YCs(c`sfI8&Wm?YA*>5 z2=H_zipHb_gzh;z`wFiIIKuNp3hYkvIG8a89jG+cRgMwKB4ALtrJCtAzYcT3+<`%; z4lD@Gqe>x$i`uj@Kfsgu9W=oqQTSIX^j_edAhRBu+*$2_K7T4O{11?&^+$_1xgRM7Wm5?*dGn9h6%; zQ5{{cW9p`_=UqG(`)k~tt;%6x<|VN&9zu~B0uo&eOAS`f7u zt>?3xu|Pvobs^B^bDINq_l5>!1f@TmsgN~qz`ke;Q zw3dK;(dSjTEQ9fFv{=i`++evixQJUrg$JUkGI zi0GM1^UUWqqegw`5{2bf^y6EMkE5gY3JX~#xJx?%sQMoBl3)cssK?ABJC&Fnn@PSv zqpY!(_0-OPE-S*ecTd>*lb56lyXghkE=5@$jG#>b*r!&l2u9lytX70#U#%~>==UTT ziX81nDvBUAmG&Zk*ltT6a~E_VfSS=9G67a8C{$_7=MpvPsfZp(w3QNuHUci8jhJ56 zRedN)ndx<50c|@$q%KF{Tj?_`ufcR#wn+=MHi9AbdMdMzo8{&IWaSXZ1Oo_=TWq*c zoV282t^H}O6pJhDgWgUvdW)|x(@I5%ETXh@oYP^kIvHpllJqnNl$g6)#PjRpp`>j? za)Cp1RkOi*pV#9cJdL6#KoUeE2_n8c+A&Hu0fqn!Y1C++#%B5Ss(_}NtpMrIT={?| zA6ublCf63tHVo)(4H)^hR&s@)r)`3;Dzl~>r2%IiDC_}rRSYdP;1qpwtcLE#!Er{8JA{5KmO)|62(9vi zN*3>x1fdOn18LA&Oi9;PF5;RPXzy&jfK?*eVEf3}1uAf6-mLYCQgSc{v$vW;M_~P$ zS>@#sfzbeAN30x6t=dicQ$IZ1!7>Ni7y2$~zDfxPV8f1H*a@Mpjm$7?8}n~K*#-!& zLW>3lHq@@k4pXd%C$QRv0Ba&E^8*ev`O$6_4td#lX=Tj?9{50xXf3i~WiM#{@Q?#v zU&IiG7}0A(5Op<|o9IA+Nc6atJbTay529JdFhW-uL1oo5g4we&72KI!U0MZd-8EfP zO0T0#ni!Gbh3t5w)u!>?52=+<#2>j%A3)?+18AmNSOB4_6Uq{itQhG-HcbyMuOoyi zOBM+iESIhTbz@Vl+fUj!P1RfbfJ%ynW-y7{mkq>WFsM~!@V#FSH>MQFTM{!!MQF1V z0b~FVOJR=Sg{~|Yq{>@latW4}dTY)L>98~oVpn?+#LjG& z09r50BI0mvN&C-e#Gd}ybPI!BO#|RaJz0>)_<*6=Oj#oKX>hH)1;f>JnU??~?6j94 z7q8)ogMjjoMS%i-%Ll7mq;%R}Qf6Z7rj|+&2ow>c+-HQLA%U5M(}!LM7BxJDz#wSh7j$wZ zs4|COjhBH|X7${SCoEE;VyYpfW_BN=@L&LK`A{welU0~*UM#03^al;dMC9R;Qi#78 zrGRwEst+VWJo65-s&STr2t)v8SW0bd>Th|v|-abkI)N?7%!EzDYK00Bo5*Xq!ft5f_$&hm2 z9_BIP5RVa1ajlPO6M-h5qS+69N)sr67AIiWn$sE+)&yo3wJ-IDc&pNyFkdh=N(0T3 zklVE;ltu=rwR2mCz6d%p=eseZQ`-l%)X8ou1gNPMruR@}K_kSF{}Jl|P1&Yc$Oe6c z#BEU&*?$s$7*=rEs7Y=TK80G>p|4>4o{QuIZIw-x!{JSzF4+yy5waf`l_5JF-vMA7 z4uhLk&Lsjb4jko>=Aeu+eVxuCAZFoAXNMSaUWz4z$;teJRfTycEJty1(fHKGxL7ge zOQZyZ3)$g%AnEYSm?Xjb6V@phKt&O1cGB_0TlI`UK2czDw&a(Y8L ziA*(zhnv`Sbwb-H-WH-`ggI)bxm>%jplCNifibnLR1uvkxI~0o6Dik$=up=xp!@jOnGcWwcIh<>)~ll;>~za4MiLRIj5vhD!iA(Z(Inc0p_P|-GAdxHa44xxeFJ%6 zW2D(7{6;a0wN>sD&Fp)Sg!bX;GPBRu>x3`G^Xd zvKQEooGE8aX7*Lt?^zxpiv^sutrotOM2oH}BD6;{W{s5{eoiNmtAowu4BdJ!f@4jv zK}(djV!@J}vGjJ^_7NHF!&E|xq=i^lqIU(*W(7|2(l6{n>)`T(st@6+fIpH%q)9c5y^@C;0u?}x?Kh~S|AlT($+yQ zvT~twfwgM0UdD+H%P^>^x9lHiiZXLLHa6C@`i1l!;rbNyQQ$1{jE_Yo)G-w}VQNG7 zuP`*KhoQJ+6_X{u(){2=2v?wVPp9yb`C7!K#A4H(x>5F)zfx)wXzwA7-9suK^zIL( zRfyT*yJtB98(+6!6$_{-)CdrR^nfd&EyFyBl1AR(+DgN0zAc=8C8P}-v|M>pA`pEN zRT$w%?W!HaCcW1a{ONc%iJnCmqmva}2-Q%Gxe*?dU@U;CWx*TKnEo>`!63_2qZGC6 z4g3K)F`;NRQCk^jw|m8umFYc-Svo*RBV!1FT^rL61)y3(JpmfRZx$AkWcEI-7D&Nd z{~+%^$a#*+?)PmWiF7-(C^*q*3qjPHNYQ}5fvM~f=!WRBv|ST=?FIrv3k}WdR3D5* zdb;{&US9~aR`d}lZKBw{Q3)B1iN>lVH`}K24NAP4qMprzv~CMFaH3i2y$ZXvXpT1X z+G=`zvrwHBqL^AH9(K6Z=sv4vn4j);th{vqI5t1HE;Mc5Fo)dn0B(<09239w~qym1I9a;Sp*x&}U<9z_rUM zOq8b*x!Oid6FTVBbOeG@u95H$KO^ATFe_WuhPtt-7);1cwB4)U{Y03(-B74pre;bi zw|b-gsVZ4@!HMjD(?&I!PoWK2P(MJJ33M5%EoP=$>y8FlwStFz%p-B8CPX2_{vm}k zVt6)hD0iS4sVUg}SaY}E8OReFAOMgWI&JSy0yH+p@{Wf-?K>6qP6oAxxWg&b+K<6y zPXb~jD*?@t!tW=-UvrzuCiMKJO!Sa@a%Z3&RA47tGls3>2)59GDBsUabk=>J{K5Cm z2eaLO2b_y<)X~;~vJ#%kCz>@sk^FrI0hQUSwPE(mWydxEGEREPqRGuKkH{rkJBWZF z0vIZ+5xIH2s?$)QaE35Dg)m2wFGGZ!1|DY%ka8D5XdaLC$YTQ!bSZ359wJsdxD$v| z8(9zNtF#M5QJLk{c1H#o%|f+UyYm3>-+gD#Nau+>_C;g*Pt^`;wapI*4L}G*@W!&J zI%LY|nKowSkItKo6vLCIO2Qsv@T2#%L1V{Ch880{X7EtBmBj$r7wAxfG4hCgI+`4; zxT|?6Nt&TG^d=*QG6CVRkv$G2fZ#t|4^tLpzr?boYDTEWazW5r z5jcx&?IppiN0npFY&@@L7=1P;`F@&}hF?%PN7!h^EXoaX;`DSw(Rapva{Tnz=ne8^ zamCm68KGvJf|7kgE2c?;3wB!kv#MEw_EF%4Y(>%Xyw8&RdashqN9y>I&4E-ba|L6*{6Im;8D$EZ84B|Pz;i{FCOtT+GCS_8w4X~Z_u?A@9J_n9vG#;KQ3SoIW zljE$H2W_?tC3Ce>Ofa8ordOsGcEYE-LcZk<>``wbO?vreSL|QulxAMVy{~pP{5!NT zy-Rj`w`v^EffN1A4*ItxZrK4|#sjtsMWsZ^M0G0M+^FnfgFbGX;bn zvVTl}QC8CnoKR^tg^8_#n32`1w9yT6%7>QhpW2Nm@QT1K=;^#ujrYr32>0WidEwO5 zfyBS9>A-nH1$5E-ytP%G?%S%UI5~i9uFY12GnOf)87waDc^#N;6I9Fb_PtNRzzNLA zqUplpxlXw$4#HwhkXvzZ-d-3Davmy97i92UTEo1}oc%x_4$hkkql?dIlbC{MMMFO9 zAq(&TGCTurEi&J02yJ(boutyv4}6t2g-}%!%Ak(yQY0?JKv7}*AdadA+La>`8;Xs` z@DSUtw`?}#zGNxrBSU7c#WiHz@67WY%KwGHSJ9;~yUBriEs3Kbq!WpH%~nT%UAna{ zTD3Tk%|E+Bi}l6d^K|n%@?jj>ZScfi;Wn(d;}e9QUvGh}a<5uySQh6C;yB0E388 zq#k0QHcO<@M6VliDg->-2vjHnpZ6UW7ALp&(Hw(nSU&Jou$#Ca%C|#%xBvy~7x0OW z>NXPPGuIP98%2-Sfdzc5V;}ekXM8Y?HlmD>(2H26(d0lah~p^4$daIGlAJ$cuQGIs zipdZ*>Q%9fDvJ1U z@4d&4LS*uQ3hqJiWiF14IDTCTFO>fRu@E;a-}Pk8=F_L%SDx&2Ax!)?_lb$`Bo7dx z><0(oT8LmCP(mB1dYO?U1pS_X_O1}P7NC#A0Oj^)pCPX>7Fecft_Si4NphUPO)v;^ z4Z^R$igltSySW{aOBu1)F|SFGTY@Nblnxg%&xwy(`&O120U0za$J}RcAl3LECzKBEYe3DJh~2T*I&hC)(>_ zO$sc}k+f2NWR+VY=vhDs;v~?^EZu@cAjH6LwQ2^XuY?kKIlW8XAlp1;>p;i%@U7US z307vQ$z@G83JT822dnqEN2DpS;-+utgzpz*O{vws!}f~9LuF#naLbNa#}%Ni|Gaf` z8_3s3pLAG>!iN*r5;qccT*||3+Wu>_XjgE8zbIKNh~chzM!d>KKcE8w8iw0`-4p+U zg4Rh1KuAi2q;8Lp5NyBuBPBi_t2?kDl?@Xyt24uQj_&oj>klwV5n3Zc?d`}_%*3f^ zC&p^h@f`a|#cfkzHa{C3Q&CYFqHJI;XS9Z`hi$43U z^^28$8ZhBonrdW^0|*7W#whmRuXocR(5C3byv8Djze>4b_@?$aR?Ngnix!5@ny)@Ux+)p z9XXN!dmEeCtYv~F#FK5Fv$WI#ciR-yT8w5Ed}d~v&yNq(^l)Ox|0LPR3VWAmJWj*Si63PODh`OJ1AX8Ec!U(z}<6rr|b*BM4^qX^_ zLkD(aGr}XwS$xO+H1q85g-$!J+j;#1e@EaBR@Hlr&;3?(DqIp`h-0olzFdnra0C2PkRa z!J2rmj^>A6FR&e&kKUk~4qXzI|9b=d;q8qkxtPnC`O5yYpRO17<<`!jDoH(?(&Etk z&^Ky{MfsspxJpE`^!Hxp!eXxE8Nd%JSBAjsR?HtT1$;0hVz32ugg6L-yPaV}gL^!} zNMp8#1POB_Kjcgn2oIh@>5ytMk~fdw+}<@EF0i#g*U4fFAxQ}j9}yU0N8~~5qtct% zf1&lCA8HuS!Z3q?@+Twol1>sPbXs&M$udCox<9s{b#~i%PFsgn&t%Z&;<>sP3AL!&fsh#WGr6_^Fuac4&|5Z$%zsnrZYq< zyu`X+kel$axBKQRm;I@f}*eX~6!pTAfak?R-M%AEYvuM&? zB$+A5ZX~`&AP6uSCmL*1qV-e|R26t2FYrKKq)jm@ zrEurm8^+WR$wEw>=IK*^7iEOFl4~8@P*7c@xy{q>qS6U8xq*fe8S)cZd@_Jll^Q5U zzKD6#Tkpw=#-GRKLXvq^B0QNg7$MWKb6Ra;95zinaNB+-=)vCIm9si^5y(jPD~gQc zzETx@%f7?u?|=+bxG2EV3MR6<+o%KXCMufE>XH06n}AMEl_l25dz$S>9tNx0w~w_D zs7!Z&TH)by-IZAf{SdD_F=VV2NsY-;&_?xRQRhr}$t1SbG|2u>6JE|F(g_N>fFTHN zr)#z9G^kv2QBThW)u@`xtt&hAXe<`gn1k&7eMC5bK^`7BVAdHX@lI;Xb>A#;te}%8 zx1+KcqQemDg6SfJ8lch3^v;mkR;3=T%IE|1N{}dY+rDKL&A_wiW?UrbPLZM&)bfT6 z)6Zs~0=1t%J^DYIQgHiUQK%3$uF*WXCbyJobhJ|BeI@s!d9-v@-_f zJ_-H`OLJ{>jevVDAzhFRWuZO<0Cshs>M`2Rrm9Bn5}j}F6f#1I(s zUBDk8D7iQ9GL^I#f^`y;X{nIYeTGU>}o0tt@1(VMR%aTaWbr$*ZPoprpKk*Fk6znW>f zkKS<0xWS9fWW>&|*qjZ$#Phl7a{B5=&&d2nU1AeB@pvU3E6|Fedvup)n#VYUwjt2Y z60;~DVXK;z)`IMSApLKujf1#WyL&e#6Iy>1>IywszHc<@=%2~~FrKew+5^A5u+iMR-OM`{!UH~$n>0<+5yo9MwQb!EG<(&f z`|kag{KMNeWgo5IF#RU|8;n(J!nLf$;P#^Cg-K;z3O0-rPJ-w*25S9$i zUvm0$ou3_>2Oqh9N#oCFzx=?zU9b3}@S{pKeooOCx_(nw=)WcJc8-alr+;JnEn78=raehjsa`=d+nJXKp`slT}&Ob^p7*w)(!{R4~p>*X!>`IX4k(h>|rWjCX!54{zj?e_uz4^Jtckf`<+HyX^iR;lYeJm~@G8c3$$qM-OEr!+pXv6Foti+l< ztzCKu@mP`W%|tuRw5+ zV8oQcK((n}oYwc5kaP0%*7?dphnuU?G~w zR@S=nLmz(98Y#=Md@70o3zTb8O6&KL8?i2e0Uc@5^rD8DCjis=x zl?h{Gh_@SNhqt2AxO_w%hb!p3mH*74+nvf!mt2qjY(L0){9Lctxhi) z&}dYN1o_Iu&P=5x=gEqaKH$j&&wB!mma*JF=qH;>aLhF0}T#fB+Ov7BN8hl*YCJ!a352J{bTX^MkH zIz0uvQcqjsJ3@@g#&a5e`L)2KNDFc-k0b>WC^G&yzY7er{~Ij+(3Bp2&$zUx6+%?Rg6KC%UEtieb3tKtX)K930|HuK2^~+CL`bu%f zkTjygD;88(NDmS~^_7qE;z2Hh5+6w#CfJAp=%B3h^O0%LLht#(8?qnUFh6xU`A|Z) zw?<1QJ_~DbCR>n-nGOgn_iO*@zMh$IJNsl-50l9yF}@09HKjl#-cax)d8JURa9nd1`h5waY)S zkkGB8l&*w1w8WH9p~WFb;MwmMZ8?W0P?TU)dc{9BW<#?4wB|LV{m9S4NUMUXSQAV; z7Q>`q{xv?DQT1%bv*zxJtU{oT+wzZ9cu%)Ns&hoFRW*u2-Bfm*Osz4tK0{5#+fJDwz>+25vLT0|i3+6pd&nb-;hL$$LbU(K4 zv+$AsI$B$#u?}L;MMO^+4k^P2jJ9!j(C2iVW={U>0PnWJ$d*icI=f#ZzVVBV8nE%w zfF%cn6P-*&3IvFK8Z@>;WoyN888Alqtv;NM(!wHxPM|aS-m+(ssNCmZWJww-^{JvCsM(csw>_L8RtQfzd1 z+Qzqi?|pau_quZMx+^w9*uasM1@&r~yJt5f?)Ut=W@F-RChqwVx6xmT+D~!G3tjT1 zmhPBF;s-Lie+) zF}!5&bfLHH?vQl|d*8eGG7l-GDparb4UJBV@WERUog{weSFJnUy~(E?0P>pCK$&Jt zG{5j8*SZ_*DhPHQyQv62Qr*1zO&~;gGkq{629cf%#5+cNox+kzeY2OWd zxZtv-6k+*9B$1_$8)sPqmfwq+O#%ZgQ@wDO*zqvC3-t^RWk@_<+k#@p4`}Q1MPl=A z(V}3$WA-R&LH`A)Fa2*fp5?k4e$!OS88`?Gi$P#3z|v zCrLn6rXLVKA(}b;fRI(yG*aj|sRQ0wgzq3KU!C|%b>c#|fN@g-h&&$rW%WQ3Ug(}| zbRPgq->h^1eFB#->Ddo%rpoh$jjY=_WDhje-8J6{E>M-TJqJ}k{+$*zK=BknyeQC_KHb*$vewJ4%mUJ8-!wD`z!fHm zHT5PfFm6~nBDPeV=8e|j(3*GsVVVk)h-UE>}NW-(;5!q0S9(0jHn6w+lf=P$Q z3vf~xVjR)lTGB1V1pX{x_8VrWG~Aa@rrw6=Cb42fJGF-8F#YSEH}yeQc6x|A1uv?hHg@d(MGTmfr(Lk(3_F0vVG6 z0m$d>F%u<8$zOz|{BhbreS>I+(H^9NN&SBz6^X68E~$w2Tn;YXeL1-P-C%NAY5Un( zdNlxwoHJ8CF4UL+5Y8sty_I7F#(w1wkYlx$ANU~`(HNjae;C9k8bZZ?^q7B(;xMHI z9`06^5|e;|(`V;n3e>{TlZAZguSRj? z8~cFK$fpmeDd-Mc=I;G?EJv=2%?}P*6dct30QOl{!eL`h3soiqFo1%8Dy!h1LTUdr zy)S|^fPv9cw&5LR4LZ5BGo-pQW^b&W1j)LT2c6Lk*HBfZ` zS9v5@=Fu>`GyMh0rrW{)r^CspCn4VOc zrDa5ywQD!Cv?<-*F~NJjT1NHBabA@zoeOb1HtmSW<9ED-ty+$Sjdm0Y#$+T^nlR0uK$^KPV3!yb?I7?E(x%aLth0xJE1EHSL7NH)(S&4QK$vH_I8qOAFKQB{pY?WK3S9lzdD+v-C&Mai zpmEa{|DRnXaZf2j=chSLQ+(k*? ziaH@nF7Ch&OvpVDh>P;kMNy0r9H&3^{nh9oK6rlBjQc~7;k1{{ zj2ZRk`$Z7KAiF&BMmMyorr%%_WnZl4GMG?qkVrH2mv~Ic(R?VEi3D;qM)Wb6zqGFJMZL}qSrtRsn}k*zooGQT{+*twHb3;LHWR1Z6NfnZCP_*V22|e!EB2yR zoXDA*vYd@+`oxQkvmBs%)Q0>2`8XdTTJt|J&@1avvn$ipU>wIB66Zk|J7F|ti@YBPMl?1qK+_!74((+qntMho==?y8O4%ue?FJ08cM!4m*^n4b zg`x#+csVn#5N*p{gT_vVI@twar5tNotp(6CqP5=tpwB&fBnW9@gHRaAPLWN?pTS0{ z><&X^UAy4px6zXlw(jkHYBogVz=3DY0Qb%EJ#57Ms?E< zS4*aP_h#$VDKaBRzDt|{=jJPzkE5aK5SAHzg?-BXa$BhHSfO+`w6}EEzpcAp__xp- z|45b}6^B}A)Vi}~$_f?otoIbh$SZFq)8)U-{uT?H<_!R|gHn<}&23ZmSxcYJRF*q5gBEtdl zEP7_4gM1K;;Y(0^mMzaZ#x2t&ADwY0qu;rYiwoUnKOF+QZ)3z{nNxE=d8PEL7FZj- zeS&_AvOp3dhAt~oEqw!q%;_1SFT9g4jD;u1y9UZO%vuaQFel};Q%ZS8)vN2h#mmA~ z9HDt^MJp>)W7!`*wXkvLUNFtj6Z^39UBpg>RVxmQ(B_un-InugtFG z(01Vlf*Zq8Ey8cfRK)7tZPv?f_@4DU5MEFa49LFX54*tO=Qkj}Qh|WxnE`B7TmupG zOg59Fd6HOh94k+taEbX80#5im-);K3VrQ3T&m`zADr#O^VX3?8e}&oCpvHlFhP!*Z zcR~78NStWn-~rZ-w7LM9sTfd3nDc zu&vRBfQInxYKr85czFy1~Sq&--9%LqxoJLLMODk z)d zZpwfGOwbh}c^L1algKtG3}nJ9kE3N_3C-om-qzJyvoAwRDWfi{Sm}Z6DOOXDd23!F zwaP%yp38s^gQi9o0bi5yVOI1R=x8L#g@U$8d!qgLmjGu;-~=ikE&|>#63@mV=bTcK zD!5f7JvWvqkZBK5BKI802;_|;NLqq+riao&z&;5Yq`#UF%(Cs!5wX8PBm#4|BoI`% zMVLO=ANRBN%|b~CM9RaIcZQi?E@mwG=tuOwTaUe=Bz;8oWe+8kLF=4RK6{1i$#+BnTB zP0ATb=PzT2JuEb948pMWAgRbRFdze;((gQhfFd3+fYm0VUnrl;#D zRs=(xXguJ1E_~y=wMG$047IC9DyeOh(xADHHvnxa+yH*5&%8R-$SaRw#$svukbh^2 zuG*i|hU|zBeU=Xl0X@Zm?b>zh2F&;@e?99TUx0s(>=Y|IP~7efY@GJls2eEXII=1K z>gxS}1&`{hx00hga5E;eA8>le!SUOukDqhl5A5cdlv1spaJ)#E_fIzp_K@ivIjbe> zebrszMoPVDS#Rp=rKS`uOZ7sV^>cPQ9$yYGf8`Y$E1)JDk#OpIT+?F%IA%-?AUuOi zfcgl>GWeye1me7)qvMEh<0cWe+}Nag;ikZ2KNfr*)~_`C6s|qy*YF1B}I3!#M-Py z#sRgj`9^}=4K8dpEmFZ-W9bCy%LondlbgJ+3fC~?Ki4l!0=xFL_m zj}-{RD>iPVBY|j?7HoKhWU6XC30F6;$PxN?g)*U3W7Q&L-Dq@P5Hr!p6R*JUU{!`T z>pdT{D_{7bTSsG)B}}dFnR-6xf$680yqhqe@mH#U@fDibh~F;ugw zaLW{Y3Tq^m3b*6&*wr$8{Wt$Kb~AKw&A*`Y=wj0^V^`>6>f6*FaK%vW?zVov_0MQe z_RT)$Z=ojcUVD)T>{qnNM;CSw!pp|T`z53bgpH23uxH0*+xqr(8|^4GMOr~{kwp;k zZX;i^P1=@wVkgXGYx_xLcK~uc2qa~@9VVzz-4&N6U4WJVhXQ(7AlDhUmsnR#0io(F zrXlS?3S2*}Jxd|DH}W}!bizgd1pt%ZhY-p29Pv-=9Z|HpU}?o;CThUT%Quz94M9(M z9uP)p15MrU%Lb$r+5FgSXunJB>-96p%FD_$p;u`(p%??fhQ->EXqr(8FWeLw7=Bb8r&~lOhssk)OiCbzv z^lDk$0f0Fh9JSOD_?j+)&hV6-*jCIPvb>EjDtk%btC%l)Igg=uZ1L-sJA9dTDq91A zg)6!F)TEX$M75<3l^z9s=lYkm(JgqXGU}A+Yvtf6Ydr)d5q0gY?-tfnDZ1p+1hwgQ zH-;4Lf~b47LD#5_N(p`TIlFo_5GIlFMPt+dQOOjGIB$q_0%1UNA|A3{o|7;Pduu*I*$x6AASnL%cDfL zH?r-Fy1wkKn9R6Ucc?B_3YsKILd;A^;T)qIQ$A+Fn!PS?AN#GZmH2EPfv$o=2|jil z*E)zdXnim~D%DGs5u!5aYHomWyqe%LP}O`DC@)gOZVJ79stQ{bvJgNSV>be&zHoOR zfufS0z$YZ^Y4}kNwGLZqfN_Lzn%lTlFjUi4q+Y2ar0>jZj-r&@%#w7bmpU(amMXRz zZ1XeevATV?HK|_jooymURq!^>QO4IwjyBVqR|g`kQNoqRzb4!s8`UJhJZ>V>}Y;mbzAM^SaO|8Ox&B_hf9*XsVTu+=^ z$u0VmKhiDn8_N07!t^S)_(l$WACykp4U`>)r88>cOz4T{QI%THK}aw4R&>?^gk1^5Kn);PV} zFf;@MOYFjV{y4;w>C}HvQ(?blBm~(&Jmx#+Xl#3IaDlzBa2ce53gbED$7kb$lq14Q zP;(+wOeA;<_*m>oY08rfgk+i@4-JGcKP=|>N(3s}f`UjM;R@!Xjgfqaz<_G6Mc2fH zRJv?!)8s8>pbI#SZJm*8twz8>({}kcYqt7q8kihoe>2&Rs|JA7u+#p2T{S!UNCpgU z0izym7)Ba}8BvD4kZhxf3{z`|4Y{S%R7a4RafE18r^Qe9#V zF*ugqXb@tq(Vk+cv>kyH!@+1TQJN<%&3_LV^%+QyjY-Qt(6Pu?+3fkj>CjLivK>@M zMdlOctU7fMz-lqkX-yS_z`)0ar1c)OaBEjO_3^h+I+t3ri}@~mgCOB7p&vlS44kHa zBIwG>@3%aKHZ@W9zoYa($f2oHP3;duhM<;5`(*3mCfe+1O|^3x#af9==nsModLS|o z_qjxHiBG(cN$)Ib3tq#f4?VM&Y5E#{>x<}1PVUiNSz8fWOSJadp*%R1e`rVnr|4S6 z7!DcAm!6MFR&0Jv40@S{-{jIp~pV#-pvk!)>(Mws}@l&KWvaF}iqQv_f}PYzVlo^lnDsZ`>g!~vTR z-atQi30eq6(gXxae-wx9%0(sCU?j&zo=4cmA(pgK7)4yDs814!vh#U<(4X^6Z7YLn zb$n|H$CejJQSm_l{!vdD8-NvuLf0VN@MF=wl07Idt0B3qx=EDlcx84Miem)cu^=U^ z2*k=WQu352pMje#A2?-|#9b7B`-m)46hnK#7OJdRY_?*!y*=qSKt?&jXowzbeSu4= zF9oMIm|rH7BR7x)=i7&l*Cz@Qy1dVvE_OJK$y>hiepWKMDrkoTT#b7BiuGqn2Zk#}OoEVJv>@hK<`g5QDXFID9$N;gE zc-;m~Lif4u;~6~bpEQ_>OAqKgy8g+67?joclKnY&N*EgC$k7wve+~1P`(NGf#o-3B zzd|4)HJi)^lAR`8DGlU19R?4Z2%dZc^7ztT^-%3OL!nbA3*yXU5y*WZa_p%(RgCv|u zs4zNO$uh_d2niE9y(N-(qghnCc6eA>sd_xj9yJX?1AvkYcffi&4n}sAERiqy+j8=s z>0AC`o}C}Gd=4D0GG(dJV!&1*{ZQ1FJGqRV8AYjef#?YJkT3N_q3OxmH%qICS*%)e zB_K}dyP(YGQ}u}c{3VMtkLA#W212TcmVq%;$8Y+$L%o3UFa+@6J{q-K4yCk_X88C~ zx=}OX8QmqXX@UXhnD#)h%OT^^%=qy=3n%THoKDwd53>HT8m(vvF~co1E5*G~!;#Us z9?T<52-Vm8D1|FROWc-BIm$@(iyES3x9RSDfM!&zI2n!{@snmPBtR~kV&0es$@&z6 zW@nF43s6Qa1m47O(R1?GUx0m$b(M!)0BfHf$v)w$5}?Z_HH%<3;ZppJb?BX6Zh*4y z1T&8EfFZ;$Q2`@Esr2)~Wp_S!uBpgY^-e-8s0&Hqep_H^HTGPRF;N;3EDVbBE97_1 z11Q@9DVh^o3KCxD17{48P?cz=i7j^4D@VuX**Ufd69E*bJ5Oe;+e`~pXLd&p(~yK3 z011;h@ML|>>|=DWWcBo(P&KUKNObit0+;y&G%L#v&cv*yrzB@26ofoVyeI3fRg}$C z(hMnEj3e7%37U*CT#(n!SDcxK$8Po-3%kSxZXb!khMxo+e4$R*@gl+}-fUBpgui@* z)NddYPFb*&q;qDMB`=kN6YF! zk2PrvB*%R0kqTxsDx!qZ1ZO!NQVr@-OP>3qrH-Cn7!4nBkpe0rg8UnMiu(ng7W?YAY%3S(nyL-Fc6KVAsTfd${Rb07_m=AYw*ki)?*ek4MxiN+u{M1 zsJTe6mSsRP?A!E=1@kZH6;2Vna|I^AG3K>%gG}~GboC>7&SXoQmbFRjD%Zi(&@lf1 zZ24&9x#GV+pCD8rFWgK;ULIzF(8)Q(JIWo$vNL3mQY0(^rtn!4X;hk`=>A> zrb40(F&i=TLmSGp3O$HP{{Xro-4WarW*?6`Fd{3GhYH=7j6y+^bw-M4%le`&m#oT@ z>d5t(r4-zk4)hYAm;5DgEF(q#eVv0wSv%6TLHdYY6RT|Lk3wxNTTjH=6%R2xtmJ=H zysyLyQ@Sl$Bq3P_8{D-|)IDi#xS|FcTp4u|_YK%KWDJ;Sszw=}ao|yI{T@+Z1U)b6 z@}6=nMvEDM;AB6}R>7nUE+kKel5FZV|97#5>MJtfT4(%X47L>Y^_^H9RExtV6eB>t zo>2hK^1L`i3|InG-K?tdspJt-jWkstg61)YrvpRln0_$WUb30Fs7)4H9l;h7%%3sD z6`i9)O))ayk)#)Q1Ft0a^9pg)kVit63A^l}RcxER%ms6qt7&sm6ODnMs#%4?7%DZ< znqKP-HgIi;@U{BjCaxKUENbc5QMeYfC@|4IA_vDSCjNLtEQ_M1M5$37N`OHj=SP-8 zexTENvYrtt6(+X?Wr%Tw0#=KiSbmcn3&YZOSJWg+;Bg; zttmo*O2?R^(&NYQ3QZ&WKuImY4tcwtG(^7gPP$LLbd=^Vo6~C&5!vtHkUiuI& z%Pz}ejAUe~*`-QJfT*MhuvZAAX&ITB(og)`VkCei521lNE<`whlqkKFO{#D;kv67B zW%w8?t8Y;U_NcrB3R@NwH5$lJt;>FwlhK5c=)$6=1CC{Ub}~ZHk<9`%YMtpQ5aHQI zKUgg|3XEI-eyedF&v%(24p25qav`X}m#0ac6ZY`tsyO}Ui1@Z>Ok=|!!ZvjqB|I3- zbOFdLdnAgZNGoBDvnEjeQ}=~mRk}ax8mpZCV9PT@wrU2OsQuSTwZYA-UX=56cdjB< ze1jOOrKK2xkJx8wmM=}-f}JQAgY|?C0eyI7hsbzo*2si9x` ze5vxl6$HoU_+umdd19p2ySYdcj<1_MQjjB2i^IbKR31LUlqaLMzErM}dOB)~f5zdx zbZ7PvQkcx%c|?@3-Dj=tm#si5z?F6LZDhhHe>oycQ4TaErkjJn$;Z zaO69)n#F~lZ@kEYKUu)mYLxdyJtpq~mPN~^r1p8mMrfDbgPkk%oXn z`6eO#%h-aLo^P29cqBPRsV$&oXh8Vn>Ojor01Z242C#l@)$_~8S&&0(v%d??e8av6 zqZQ@StC0x+Y?4F6?A>rxv|IWrCt_b2Y~O@f(bd5M!Xe_Jv@ZaFd_+cTW*3N0(U{RI z%!RT9(m~J!-w_@3kmhsjEfUr6&?2wtCK77(xi2DSKo>-FfG=htRvJieR9>`>J(rBR zDJVbJC&E5kVbyHU6vl-B7P1Ha8f6?&=k02+=r_MGZFTICJXB1>VoVET8V<~C>2w!J z!Wh7CSvrC(<~f<@7^oyEsBscA5XI1i8faNa3ud!zs6eD0%=K6o;J%(p1;FzC7FSL^`| z2g-$RyWb}v^O8(?)&#H-`$a9W{-{gc`nP6V;7HO`y-(Emnk|2Ijt*dHMqBah(Z1q7 znKV|IrgzuFep{YFVMj@ziq8)q&z#z_bV9a;iB7*dp2)OeVes|IY8_*DRjl?XSQ2vT zit=$rZitFV3_?byXbtU0cnoF7D@Tvlri4s!7Eq3mh`871j7 zINeKaEBJ0;B3p_kNL>AidA+h4GPS&#K~QS89h($1m4CHJyTL4k+6Vw8`m^7WZ=Gf| z5b;uFXj9@gLzHgUV?EhE%v;2i0g z{ay$`Nsc5M;UI1fwU9C{+=MPp!xc;rT=^+&7DjGi>@ul|zf(oO$S3gRk{lU=aCXwZ zdD}of)0=e$4cuy}llg(#U)zzWA)z`kd~Ed^a!cb)HJ7G1YrY^{g3@;T;Cxm}38vk? zo8i9`W)px(^XiJqx?|{t8fUHge&)a@@RuXHq=~)>3`c#F*%`tiUK%^F!izIxyfYH00&GWI5*tnr-ewugdf8F<=i6NEq zLz3J)p5yVSbf+OQ88IsGz050b^Mrbc1&$d3Td^B37*A&H(4t8U$VP4Zp?TmY^bR;s zzC&mmqv{iDVQ|KGv^=$_Sfbv88f3R}u&CPfCd|59h%5&E21!hYaz}74iD?<20YMn;BpN#w%0+Dv=%z@z+=Z zwzu@dQB*SW9=HUiVjGY`QGVPrNAePBqeKw!Q~bax9`?3sYC^%cqm-yq6(`w==?bp+ z#vD>*N2oY^FV$KRuFv+DcwW1Y@eNduvutC3_Ki6GQ3GNNx7vvpzI2FOEU^;Vq=0M! z>PqFQX-GAjX;D7}EFCq<{ z{gU6#es3#(zr?S2%XK1U0F&?_3yC2ST_R{P6W7@#KAT0s7mVN?9$pKQ-E7z9B0PdI z)v|N#@FqXIfWoSk&w)fT?!JfBCxsokcY(h~ZcxdEy~2^~>`p`-_)~NO3BkvbyR$Ea zy3yi1T`UOM=yV$xc-il=?1NOp*O{espR3~vC@JlTpW%*#vvj$c&AYP`vpn&%!WScQ zL!mQpqBAFW@E&_b)n%B5V;{8kTEG>--#TeL>4$awwK|cc`cG9TQeJVIQNTnS)G;6f zjNf7zQ^m4tgL!s6+fXc-Pn%qQy+%VD!tDHgeK3YabM$^H?0m5NbZ+)R6gPe8tICC< zcTd+KZP~|z^wwYvW_L{&Gl-M`bcB$AIs(O!nC0uBQ2C+Eg8ox0WgG8Iv%@YG zja6ULW~_=y8yUU~lZSsJS>DIIxaW6q$}@zYC&}uFH)nVaW>Sel& zah*#hAsP>s1opq3$DU^!knHxnZ$IkJW0Yw5)$3Qkse2s+Zy`y39(iT2$sip^hDt>LIH+4ds4QGenQJ$)oZ zk&f5KW5Cj8TCOav!2oQA{3(^wnYx+DjemEr+vblWMSnR=V3gTseX^2&`oP;*WeN^9 zNut+w*MUvN06i9JE1%H%+o159XnO)w@(ajugn0X5vL#il0^5tYW<|ALu z^hjkdG`*kIrd%Z!ECNV;d9&44<+%|vj~Kf~FEvn6WOC>Lid=)rH5%U782JI40UH+* zH1tCT`cPLW5(xHsHHu~tP12Vby!C>O_yaXAEt!MX%(6AgWvu-4~mbGs1wNjYnn!SaV%XYLb%7@nEOE=^G@pfymr-c{P zpQi7^Y9FoZ+0fbnH{4^%iR^G>^N&&q0`SOPbbd~lc(nD7A{>t{(bl_5#syRn=^`R~ z4_nrTbX>PS-(R*hM(N_ot(O~Qu})2Hy`t9BPMZEW^7izb!JZf<#H==<)hy$MfRa1N zHFZo8iM2(Q!5MGjcl_}w{^$1(Y!WE3q#?3lD`un+bda@)ih|n3Hw(D>m_EJ^owMdH zdq~$fSkEy$gZQnG;q+iT3`T^Oc%;L^T%<_0De6RyW^9~kOn1a*Ywot&RR{9hIWo*^ zVU+ANtEKVX2!u64{;nVmyJ;6fEZsV=+i%wdq7BMD9; z2wjC3AsZurb=}>@AA|?NYX@aP-FIcL#X{t6R@M#nNJwVUWa!_DA+p64hJn!4p>$^$ zDQ&hE15&sQ4ZyA-Ym2}GYSnCh>3t#sjntuu)wz#(xFHWulSB_AtsWB3$>YA$*vrIJ zDCS()%dUQ7MtFGTj#k_Y4G3?k6CF_OSb7b~HOvqg&|Ne`Udk+`8Y<~ZO|cutR)Fk` zXj^>c&4-Y(#UVSQn61SjT-5K0qzQ}{qM+sb^jjr)<&-KmbO9XZRhXs@#gHA2ZJ;lL zkXf8t*|q(OYJ#zoxJu)2stZhkycN#45;7TfH(i2JMW9emWintXBI2P)X#kOGmt!RRq6Lm1 zIJXK!XEC$7`yU`)b`?%&feI;80xK7+9i`wxsL-6%!N_hgffr$QQ1*?(0BMw+>0|R4 zJA0}g7H-p%Qq%-vk`&^tcgN)70-w z%5Fr+2dsaUzO!`Gv=r?n!$b*Kfz|jbA~hc)MROjY%^fSSUp||a(#WiM_8KkAeoXbL zTVMi}k*Dkj4<%+ zA{cXBe=FoeMXkk@DvjI*U<_)1#RQ|wg93itYEaCKvcH?%ot-FRI`hyr(qDm=`d9&oLYk=PsPXc??|v zI2}0;SQHr61C3`?`^j=%3>N7GyA5QjH3yJ4rpmwvnju`q=)}9C?ClDQH8UsDlEuF= zd(93?F9T}0Z)xOU4ag$9Tf^mUnD_{`uVdqFuo?4wf(2!E+}jbRz;jd5hk2|(MuOSm8?`5Sn64i&&UC^wSxK3(U z2sm4x@_tUPQl0&NF6h}*q%FuQBUGvb%0Aq>q_z_g&aO1V+;A_merR2^%o0xFVLnre zWqHfl7Ql|C9wZRg6Mc^T^z%2}R-r`stgAE%dGQB`l{C{U%FJfOWi(hxY!k<(+Xti~ z@CRiB@;a(uR2`8(1}NK;F)C^b#aU4hWpEhRH3<{R24x4~g&FRIB3+p*5HTT~PHaZ# z5oB)wz$JlmZ3blS00!BFIjHJU%`HOn8D=)7nL(8!?(v;eY{9`^78{njM-S+=sVWG?cZ@ zp(A2aoc@9M0m$=}t9Sv0KocA%I4-pKsgmPA$#1W`yn}n$O0lIOAsrdLneq>QC3JsxD_vkG|G7NICZuC? z9#It!B7*+I7j?A*VvNwNF7*2@hz@wqBktTmu~OJ3eG3l{j#9VqAH%tRM6y124SIm--=e9E~R~e1|Sk4$dXK`eYh#ByD(82^1&u0TOUCO zwjuW%guCdcllcq;uyD1TG2t#;>33V#@)@qC4PB(_HOat!h+xnidWC*i$>{HdqvOe3 z&D?VkGbj~d6Vcj?y=NF)5Sxyq0AZxhQHK=449(Bm6ax<}pjp0D*u-j!76#h+;9_hz?S`^F?pYEURXp_%BkfLY^0q~fKjs)2L<2(Bax#&v*hi>Gv z#jj{6QQ!0r;b8xqEhwuyf5MMc_s#)%e@BLdIeaxI-`_N`xn7|Ka7D{x2vXbx%8(Tl z`S`laj93TCd($jBd0yR$WV4QGDLpLASh#4L(5#k>Ww^zOFPqq&{V>$q+5E!Fc{WFe z*PN4h=a@DD_(;#^(@h$IX5J1DNAd%5kzF|S?-I{N>*`LEf>J=^3F?qC0zGe^Y%X>T z;xe!n`$(~^c3iV#a4v&#iznRv7i_^U$;32~x7&Ghk}Xx|=WTmRjYAU?$VM0^T%rI4>$I+Z*y& zkZ`fzbe0bkeJ+~p5IU0QosFG*duMNEL^MuoNwc;OI0h#$otzGdbmeBMJdG=O$DF+R zj%|uckwPxS11Mek1aOFg%V!XE&3yE2&u4Bwo^6yJ|sCg2`7#eNV8me;#`Y;7x zH9rH3F?iA?4*BJ0Z=rsa=fVZ}=3q{Y$6)>^+TCWi|ChEm0kf;B^1jb>r#e-YQ%MCv zD(bnX3*JH!NNZj}Nt@bb20&;g2k2H>TlBS4u_bAwc^*Sj8Kg0ypwPA;4V6RYAD@0q=kC5DZ&)MVJYpuPez4k#X<)Q;V%u72X zi4xmfy+L4Mdq6}00B2Q%na}Xr44DX?hK+*h12shIMbv0<95QOp5{G*nFru8BJ;+`_ zotZZl{l^u}AsTJ5etelJ9$t}n$7<6nQ?Abpn(A$uAE0$OK$H*3@s)&l0KNuM_ISex z%Y(zsfiplnH+B%CQxrijSRn)nI#DH%qG27w{*zz} zR}3|xs<^ARc5`?vlmbRydhiak%vAM%Hk#D?T#&^h$ zY7%fon^qPI)6xgZ8*&8ntCooWbdTr?lZA99!j@Xin;cQ}fP(O-1$r(TLw+$Sf<+E| z0K0EU3q)}v`eR^r<|+sj|F=LsVfJ%Dpd4W-m&5u;;PVstYIeZQ(BtNaI5EV`ip7XZ zCh!?}OlHIOET$YGBk;B$O#tnS(K7_0?UC^@o-ui{AYThRb7L6|g)7z=@YqbPg0`^< zZV2bCp4+T~`2qQMXsLS`ilq1>po^&Gp=(gJdyA$IN_b5e!qb!nSoi@67qA}T@l09V zX2MNuSMrN*dd?j8?Vkh6Y=uNzv#2aF4IIH+oQ?gZFlmYLXD9O;F18T9h7D$s7KM8= z6vcsPHlmNC!};mXdNjMt!^^b-rEymqk=9=RIIywkVZ{){`RJ7dCb1I{UrEA21`Jn7 z7$C4o#eI?_GU+))0LW~@=G&*!gxozOfq5n$qi|3@9twQCi6Ue&J4lSGNrMO@edQSw zEumr%iL^g7o{W7~ISt0#ty}{Gyn;g`mKn#sea()HKU#iece)x(ICF3pC~$Y){o)fe@fNY+Eqm?Jdib1=s*1qWa?A$N3N6UiZZZq}n8ecrCm`OgY& zQ@?0jx9Ag7_ijDkt*A9B3ff2c=R37zzywMBuqrD8S9`KfQT8q@C1O|hJ9}qOifAMj z=pRtv9q=Lw91$Kx@SMG&;j^6iujIZ!$>%rfFq<|;TDY(r^)q=uowJHTduF>9y0iv$ z7Hq180Kz^q8^&rk=V6O&AK)~5=34vf@VA_^C=eG@+HK3H0#0~)_N=RK~XYt z`;R${9M+jPz#S?uML!z07M;h`CWRV}J?3a!czk1!+RglE#2>N?P*2UhsxD>V#9q_z z{??|xH~sh6?Mb}v{XPBB%#vD2nN%O95pg7q6ha9U-smZ(5JxwHQ0{lMJvf|5NaSR) zZ|#U+0b)udbVI0K?2Rm-ex;m&^~3-O8|nlA!<9)tr(}2h+%#d^M%{6X(ckhrJ~}v& z2@)v=b^{!~&E%VoG6LD-d4QdFIBy;i9?~|Y*aHMaVH?MsAr2=hqttv!y$rIKXM{eD zxJe(UO5dxsv1^tKg0@)yGU~>wjfqm%hD{~x9K)XeXE0+4Gc;xdND#!~;UOeGek8#^ zArZ?RG~VXkGlDMK+Aw3*6NZ=fmb^gnrp|9le5zzuq>iy5`<_M7v5*S6846y~ax$ghU=0XUzNA6MrY{ZSh+1Umz; zstx{>1i`n%k%eGEBPdOIDytK861)3umRVIJ=&-kwSXU7zB(J51%B-@RvC8Vd3QL6F zUFhW`fmX&v>1d*|l9RCj*5Zp4ElSI;1k{Kj1^d22X=~XPMwlf@^s#Lg{qP^`;HzXo z;Jhu-#;b?Op#qpn6lNsIh45_Yr0}G)gOwHAwIyd1`UGEL4gzGwt;$C^bY|Pi9!qo+ zX21|FC@X%KP8 zXzxe8(X92g(i+ranQ;QhIioGGAP}q<4T6y|X^Z;;E(Lo+i4Q|n>Q6N``8Q-OhT9VX-{1X&q;27dG*+b<+0L$gg`-ORd>WYkkpGqPwCuL4{ zesfBPlJ?%r_SJi>UR{iu6D^k8KsvbgdP$%Xvt(OR)I|11t{id`=fk0fxPw@8*38Vg zl*e{rHJ=3#nd6L(`lrbPvqQAA@-=a-bC4%oWb}&;t6v^rfCPIkm1hdBv+T$SpqztQ z4>a6G(69-*Gu=-Q0|8gqL2cp|3|*UWGd55t(9BdXtMIp`RCnD?B`68E_Ln4!FHP0`0>(tJP)x0z|=3DHJ| zaMfTEt3hK1Or31)eWhn;0HwrCArU9D)D?38=GZ|H<`pxLKu?8W# z>9baIqDd6ZElX81y89N{w?~UT<+Gf^YJk`y^UV}GH$6Jf0BBHeDYi8QIHpSSE5l~- zIkJa;!A?0yPvDReZWc_6gf2?ngv9|a3=J}N&^Kdn6R#k?U3-Z_UA5=f&zbDW zu!l}OfFTrX?K^y*`~&u=mi>EAg+>8kP>PWx{M-<}Q2cK1N^*3ypv>&r7(#}7H>o>S z6s-?b)H`kYF+ipWc`(%0>xu(qBnvhbb4i;oDClH|XN`hO4zcSm)QndI5WF zjxFwaWG(52ZZsz0!bXjeu9$N&#SS=G1{Y?}pJ=nes{Z&vhI0O~UIq#{8*Nw;7HdnV zYpj7TNKb2`t0JrI&(Zq|`v;84h4W~Y#hpXWr>TXNCMo*|NmZT}*p`Ap12Zx*i~>3A z#3+j;7DvAARVx+GGecp5+!eMw{rALs0g;uoF-fUmnS$&k26(#@xX=Byta6HkU)ClA zbb@r#?q@YD?sw2aceIfc1?g7)rci$v0RFn5S)p*+`y z7_LS~{{-b^FUYLqg16L0m7GG6JZN^$m*!+Cyc1I#p+Q&TqF^EWl zF2<1zOEF;Rgy;8zp-fLKoa8>C5TsiD$=(pP<*K<7Ol1Yx#5slL({g0D&^yeIh#mYT z$aTHhB#ftJa%g&aJ#6AY01fC&joTqYjMqo$$B5R#yyPWnP?^X8Y=K~n#Zn-^wG{<} z#RI9MNDWC^?rFAm%)UqK&H`ivLH1)6*SI|21t?nVCX?|H&0Z>w-tWhzwW_-~i2I)yuvJ zVY{aQJH}yk8RV;c6Kz?osE=6qLU_jqH$qu(a<_A%?PO}%Opt0jAGddmh?pUr+M^_b zA8r1FEq|V7TSBZME&8N$_OAKZCK;=W;J*coT?{k?q=G_whSu3O=$1k=I5@g5NU>4c zS-vT#8gLlMj1}f>Vyyv(1b8A){A$srOav_u)Wdq;MrVk)VJ7-VdxEF#BD=9%NA#p4 z!hHEq2iT}%@>>|NvkKV$#97zCI8_2{g?xLE$ZWo1L_lCKc{ddq+TyGmD5{q_>t?00 z_ecSafC#8vgeH%v+Jd0);U)YyS2RHeJAJrIh~|Vc){`&&t3(LO%4Mjaax55VGo(Dt z9deddei2FIEqZALSw-{lwlZ0uv7%;|b2OMa$B629RLnkKvOkIa zb@wK^gm7PqbqSiPyC-Xw)GJY{#5&rYukfnub)jOUo>usi#TK_J;k*W-fl`KH3Y?=& z%&DG7`n@H4OdC~d@kd?Zt~!*c4#ioXFHyjKGH{%c0q$S9K(|w}mC#zx9pv( z*g&Bl04d?WD-4RCQW%YPBna8)zytVi4%u%(CSj~N`HH+IRGVVtib=ZFWXd|BajG!P z0ZxBtRaoyMe1Q$EfuQ(eb<)ee_wxNThZ@T%FOt&`NiSAd2kx}PvL@N<(5(Z*))TaLKF^+?O`$$qluQ8 zxf%DmpWUK%NGnWpo*iG}OP&!eZjXi)f2nsP)w}uClZDlj#XOIxm>(Ncd1KfBxKMo2)6#3Z9A`&aR4K%)&fq8bhyv*8LRKtdi@g=0z-SUo zjJx$)baqWoni<5*g%M;wBbV|sK{&V2Ogug=WI+J)K&y0bn+OqK1v~%4T{yw`*kLUf zUzENI*2K~=;_UrBZtqi8vsLj^lwbjO6m5FjqFBj!$S2ZyZ4Y4Vge3Csf$8X&E^@vg+E0349W!}iFE_#_`@*aT+MeE5K) z6aZQ!0$IsI#B{wvbMpBN)L~OaSRNMEw@2rKs+Ok7mZ}=*cR8JhKO!FW6J{hV>KF{0GbWl3mBYWNyCe3Lb)bt5wM16jjZ01x!3dBRi}Cg5R^Y*INC zn98?mk2Nugvql|~fdd^cG6Im_l-Uy3!E+rA6aU86#f;MQWj+%OORiqA#HsPnJ!{;Z zqby0`uAA~0hzgWNY_{7>337sVfW4W{A!-@#B6Ur+EXRT_(>ku;9w|j|0n_y3hEX&R z>(q!A1hYL0!ZZy4Ak}$7WTP|6e1+j+)4=7DmkD*HTIptB(zRp`1`iK2h z6W9|4b*eATex@9xkswhvZEuwEp7V|B1w#4|et$*e(MsteHy3=}NWr1nXhs!u7%%qS#T`R{DiZ zvy=F4i&ckdE$b6}6;PR-glUP$QNB08z8()dVIT##2?*y{n24*e>YP~tx9~#2?BdjI zyf|z(^)GJ>>)4zp=Aazx-TVLAy>9X%89)(uz_|bU&YR!MEk)>V9IjYRk%!h%;=Q*b ztGeA6#c5lL3*wTQc*VG6@>1@5mQL1Q1nHBIE%+4S(AWet7D=m3$ zbHkpmejn^1P{|_@VUlP=ZtuF)K5m=Ri+t&YE(X`W^aGV9BGk~0(qWD#Yc*5>sVPvs zUb(r=!tXJx!Ah|nhZv60X;XMQ6MPhd=#fKD4-H9+9v)9&foLuq=Mj}5z^*mbNpYG4 zZ1{n|Q@^&>j&~r4_?yBe;W)R-FUKBlc%oWsV0-e}A*L#qS&za6L@#;0LXdW^pNO#v z7=WyBG-ia)o}sv|2BQ}M8U#aV_7ytyxEt25HcLJm)Hmw3-`W^Mrho+i-fED)@!NtW zLCgkAh#!8TQDe#z15dM!VvDwKVs%Cq%Ej2FPw94Z(uo}!u=ogzrjWr^5CowKTEZnvS`JOxg~C602R|Yx6?~GD(?uviV%3sT!|d7w z<}LD(_(Ayu_0tBKFf~px=ngndQX8WT@pL{%Gnu1TrR@ajfTluaKMCE#+H9y)b?8V% z3l2ypORsBis0xh>LvgLb`^1C7gB76qWnRRGfv-F)FoPpdNa32CJu%xUq>1kwKP#fy z>)!?CiK|SAvKA--x~@4g-VE{!w99VpQA!;h?9*KRNcc|985@FOTp!RenHI9vp+$1Qlm#v2 z3E-1MVI=c+zDV4MOFQp}PAQLMCAW~BkmBuf#sASEmMn(Q1Yn=n{(!dT<7MtJh8zP# zyrpI{$E4ZmiBn2QFxf|anrrcV?Ca#AL2;X+6}p#=PslJ& zAI}PA$>^Z4lJwQu(YQWRNFIrb0yhi>od5|14(lHLf#<3&jvavj0+XmIDos+(=Oy!- zfT2(q-C4=fMyHXb8$z=Ts2s-xX$#Jm-NzcS3}@jYmN;0c_<=+djRRF)s{|R^>e+6E zsZ9bzJQ~pk3+b+46VjewP1ES#3Vt5g*1EmqZTeJZ)nPdXCP@Rd44i&hw?K~v-^RQN zApZA|>?HzZFa97X9cI(1=_%T}14JP9&g_Ozm)C(BteN2E$t4~Idwfy=7#wr~Vlx*| zYh~pR(|H#!i-4wIh@fJqnIa+=S(apOAX%iCFnln55isnP*-afs%+rN3Lwg$>aLR5%I5l>@i24d|V^_;5Eat+K1p%GQ8gZ?%f9i>m1Hz%G zAzff-M7P?>0NrVAIB18%2pm4Emsb0flwHDH-XPry!CT9x;qcg9_$!U?gK;{WKFB;~ z!*Fj6sfdL=eMPw-i?kNPXepM9u)F|egcxc0UXeE4O6L-ycI*r)tPlb={!*I{eQu13&|5Gi8vqi`W$z6{-%m`0gt{m*XtsgcmHjo)0DHZY;K}UOtS|f@$gltCXmYE+36lx0Zc0EX)Q{p2W!hNl?#D zwhr{|VrY?%w-7*GOBV+myko#igYv(Za{kUS$?Nm*W7nU8lV7qB|E)b0ZIzQk)$iog zG`%8>!?jAH9*s&C;V=zS2y=|q>A_(fzY3Si%(!>&cW-_f7CHZ&f9bz^@tiXyvWJ(I z1K9JNmkGbaYk^bM71AoVkaX2vJ9gd+m}>N~fAr3J?h%J-#0z%c9j~@?=UJL=E1_;9 z3*E+B6p~}2DK={FD`ds|$&N^P6*>Y8J@XqzbT#=ua+g+jcN^Q$bIS~_swmqMv-mp9 zYNT$cl)HG)TL4tBkNh7R=}NW}BW)lHpd8YrFe}|0%Ao{8yXaLkyes=>BL}FK{M)dZ zNJyV2rJtS0=V*;1I4GJw=DjH+Ma|3>JcdBK9>-?85JA&L6+ovSv{Vf#{khgrw-F%Y zq1zBR$&ktgU7!RHajg`6ZPvVFg5nr6vs;13b3H>sxP^~*z56h|$dahr3M}yb{|CGf zwWIKSt_Q){+xYSXY;ee~2I$>qu3p16E)OaY4iBYQX_y_nl&i;$g@pP6%2EVl~J%G_2txe8GY>B&D}5^#NiFh_Oe` z2Hq^Oy_I}JQR4l??rb$l4*}AlNd)P^p>pVGz+z@aWZ|1El&a=j9L&82q*=W(jF_v4 zTaPV=hKklS?rl8 zVp)Ve)Q13rGWBc^rbh?Agm{N6&P20ZPMtJMxb z36-}jH@W09=Gn*tJ6J(b=RChEiL^iqdRO*nn#kBb(l%UvBziPdOb?HWexY5Ch2~K< zA~qHvaiMY=5tH|*hejU)w|FpV9yy)i9>hyzt>x))2yZw97JyK~H0`-EYglOw+263s z_5%CT*ntGWFG@>-i3sqx4HIluc?T-M=m*bKkw7Ua!+M1Zu#=M5J zW45Ovp|4XkC2xMtx3mr3(l?Aif+SnEQnu5F$1|1$tw_bQ0Z24s>&JH9J=9^pfW8PrFtI4_UL5J8wm87lFAWQ_fCXVLzK@Y;R1;Q4%Wm)y zn~gIgI#!$#BMbrz>#f!VPN}d>;y8`1s60-Z?@4mhm zF@J@LBt?_+M6}jcG#2o0M|=vgq-l$#tE)Vbt{2OBK3}}a8Vm(2(+_}BNJ;7V^OZ+S zWkpOHT;8vtGB7Sgl$;8Zuu>e~ldgMFtrv-ujN#eFMs;Hi@kK%|^ajD(FiGpAGgJB} zmyq3P(^N?f0>SYLap^A8q6{Xn9txiV1g%V;uAB3-f@`;E0 z>|S})CSu>_Ss=NaQ?nq#rMEx`2#7M5(-hR{^^O-90NXQq8=CN*QO|_Ob1v|T>LY$rM9Pgq5*(NQc1gwz0cav8Q))VU7DeY)vfsHKP zTSQOs!k_ZN==Kfu;x7eN{vsQfE&>+=X6P*zu-|K+)%D<^-9{^sYfxAsJXu8#x|eE| zroxtQ7P3(Q06ArY)K<7z+RA=3P@&lM>-XkKAdWv5-t5(e9g+yd z{Oh(+k{-8 z@yY5J0`fVl5FdcN;dI`c_xTe%xEYC;;T)kRtmQy*Wv4$&OMp#`^U-i4qUm*@g?+=$ ztIQA+_R!K!Qp?`Z0Em%?DjSKlrn^#rAAODu0&Gc)5#Z!e><&lV|G0Svaj9h|_fmtS zNyPbaW4$CA2B5neY*9#_!URd@1@E=rBjTQ95EtIl$djutd359XxH=QnkvQ zGZLz^&H_3dWMU#09q3Hj!BDFmT{ZcfJZ~>yd>7mU7#ycLm^+NZba!&q06vSRIGE9D za|f7o@78lLybjYTFt_J*yH6leia&RLxT2U@39x#e_LQyb?2@Z2?R5F<)%uW=4ba1f6{uMKw zq%cUNH@B|_142CIcr|(-DRf!_`B&?qvvEeNV2mv|M-^%^4uB(?E~v*G78N{(YD#ml z`;Q;6ks&9FlG`E)PP1GXF%PP!HeK~<6-LDl0*GrP{#?m0qqGb9^QNXwF0IaZ_$Ix-FFW$gazCLs#0j}^Juc{0tw?-^n! zpxt3uDGa<7mGB5cXP%%tbAZgUH%EOvB3H)aYnV$Xl86M4{;P5~q1VOQvXxOr0#Y@O zoN??V4!bFrI_VV93^YOs$KQa02F1K!90#iz;SKK=$+--m(f-w9uCR%4^$A^#67A?d z^kX%O=bc803ocCmGB#Fd@A2MV@l_p-WZe=yf!`cWOsY=yi*;dB5uSUYSlTUoyl$s! zB~%HJ=oxwHMYX~FKrI>~hQthnrzAg6Tc-T&h61_n3IZw|^(b8yw%fz~-dN^{{Gi;& zy)ya(C=kW^EMaRnfR0?9g z=w>*6fUZ$-4+E1;lh_UdSj&`(Wtc5T5i~d=muE#2mh~P``b1N8X37ZyK zwg@rOzyT_=(o96iytni)0yD>&>A0<9WHXo)=Y;vm5mTT8!yw+FjD*JcUBhl=M^nmq zfhYGOI5yoq{ENzYu_cyFzt zz1tD~dqc53TsZ2 zIm7qB_DA5VCUg0}X)==rbVOE*dj<*6*YjD~1pP8KYe(ooQ)&qnsT-%b5mz{sN$}Lp z%m>jY>MbpMGcK!>jj?;r_q7qYVY6)^Tls9s zZ*w_~CpF9@SEiVdT8y2AzXN%XF79QAg`PbNh#+}0zd^V5&L|yF=~R9X7SIMQG9gpA z8p`RHj2rn&U@*x)bdSm`5=aLi`@_*e2v=j)GCS(iGy#SIJvZ9}P@RO`p`05|7?Cg# z70j4KU@~YCX(wi9%Onm+nwqH zgGa1{kJ8x;w~Hv!ezmnYd!=K_WiTog)i839#C7TQJn=s`Zk2i$`VsO3#VhH@8XGC|% zJBCtQpi+(J{q8bS1A+#i-QNl3t-N(a0L*n0_C}mC0c#ZrgGyUq!d@`|z?%7h-K#_L z@$ajFJ%+ci@Yr2>C885ZWk4Z~bEZ=RaQP>}W0|DP9$IMD*J<~7ay|gXEYoVPP|`Uh zwSQ^n5D5@Ci1icSelk0$meUr}+EeZ;Ktn{Y63GNuGTp?M*z|BVr4nr9aph2x76d_~ zI(4>=(U&vQ?xK}wd-cp0wBu=p-KKt-e1DK%z``_9AVa5-&v(EaARPvmZBZyFyOj)& zxU@i19qMIdtB1tG1B=1W2c&4v;(;*fDdqO=**qhG>$CivODnk@z}JGeSmibqs3JW| zjq1Q5h%;=Q7Wk=$oUCHtwl_XF;(^#w05n{{j5_1IggG0oF$i{boX{G9PGE?;g0280 zu8d@&QpndvFjIKO-k7~W_b%3#ynNGm%6^Ds>%$cYzQT?rd`OI z3R$5>!GSewh;dKx2G<;KM+O7HNAosJ^N7f?te; z@uA4WwjAPU6WsU%8n}-xHd1F!gYJR}r6IMrF7_$uZ$81hm;$qDNZ(dywDj#+V!D0q zi{AzicQGt0kI(?;>IIFYTVQKK#xX5L@r^Pwn0%~0v=`R0OBoWrK+Ghv2Guk*9nfR+ zN@}HE%X%ot$`_iq(yv7LyuI(OHXN|9jC7IEiO+@JxF34vLDPn8P)tDh?Rb9@grRXm zYQPQE0T=fuqRg~Gf(^BYMDeKj8j(IoGZ9j=wls4kNwLz{0VlpE6B%WrLe}@+IhdIg32Z(=%hOA*SP)F%wSV}sOaFMX1QUC@4kZBIPlaBA!>+0ZSaf;Z%Ck0c z`u6IUKr9?cI#96g&%@VWcasX%R6v4<^}I5MPs}|Ls7&7Qb~W(Z1PfVFEFqBATbn-f zW;4eGA>IN^tIfzanS0ZlrM;4{64NZ$0Vr&9RYee0x;fx!(uTltpN$SM*L zD0QEN0hPXF24Zutr$#Mn~W@n0;-e&a4 zQKrK=4EP!^w}fn4B3jMAnVqP3T>R>inss9E^RNo3z=8YmkJ*B$#0tyPklhp(W-PYI z3;Txl1~m%E2z%)1y#P&?6BG4fIlD2(#IkRpSPG!$lqMA(@=^!*wYE`P>nT8;$PUGq zgi%Gy5Ph{tvLc`d4G_Sxj2Wv%3zIzx(D63L;q5NosP!oV4Sb*{0O{C*uI-uYE-hae z(dZ2;akfNvQ2Aa?Gx9BTQfT>@oQzjO7K?a{a8E@5Z)1{Bg_P8QbRQ^iGS{&qBC_Er!k zqaMU>ly$}G+5Kt|Dw>3zgi5Ru*-i}vkkfHz>g7mwag97-3pL9U->!o*D)2__QH86R zL0;N5uN))N{TXvsW*bpdDWWi7!O%a)Lcw#|ng{_Iq#%gX&2V|DO+&oeSX+7mdHR)HlF9iGi-G}U-F>19L>-ce1nPJrP`mIXV$PVe-)v(L9hktL|Or5q>Lt|L#_0g`DP3P%VmQl7Z&W>9_ zh{>afFsmlkq%FOfec4N1vgUTZmqb_=xGwajj!-+Y#d{ji44*DQ4-!=Occ9eAS&Ia<&NnbIsNpjm#)?+cbomT7Nr_7f0z+_fo)Fg=t}Sa*6N@uEwKb; znAZ#dYHuuFB})gUegj$fR(d>}l^4w6^FEnAJ^+csDk`B&ygB?7E=b2ZjS*qD&nV&Z;+KM%?VVZ;_sEwSu36Bn3C444Xs2d$X9XTzvkt=u zhLKM+H+DHT1~uX>1xW`Gj15T!FQrrfz7Zx;G8><>nv!to)5Hdavtjl~G_9b;no9hj z?ywg%_?FWOsmpAk1?#R>1RiUJ`E&{z|IrTqR6kYtq)H+DvS1uV@=}1FA(cq3wxSiJ zc2?`DxIE35iLzB|fBiQx;Dw0^hQr1H;ru_5nzCR5P_P+K!JJm$FoM zMN!&`f>c^t^`ITxS~BnO2zdg`0z-2-+|LK}LI^r8p}SBD%kLJWISVWnV1ZCMOhHD( zj#N6GI5K{)>1*f#5pDX*#?=);fhYpx($NORsnWbp@r)b3A^lV4E30rakcV%BdpdlM z;XYYYL}q5CiM)*u4Ln!)a&RzT#YQ-O04AEkF{NLaduo2RQtE#!O%*S+IF$VBB0)n% zIoJ4}FeesRu+zq>z}7^LVc4`)VZo8TK?b>W04@zg+U85zj5yU7m$YO7rUEVI5|gp-2neCEhVe)a_rj>LIUn;AzH<;|1K zY0JrWs`HHZP+%P8(cdQhDqLmseI6r-B7$HrUQMM>s)+Q4*3EK^$=(t`c){7!zGS!^6 zObY5#>Ngx+bBx?WU*IvvF!{wg0Vdr6TOdv7BRL)5)NBQHfar8#`Jr(pvkUOCbfy*| zD}rIoO?Nr7R6)oOk$V-5xyr1?U`p*N(j^I)qX4vlM%M{Z-7J3HkF^>U8nHsSfPofR ztj@MdYNttnWc|o-ESQ%4&;fH3G-ZwoTvN)q|D#b@>fKOMqeei20;yrXBj7zELs4vb zMmhyV0rYJH^#zXuWv!5as8?OX<6uNh{2!!XOa^hS+c1dZQZLe1tADz7AiJ*7!Gy_# zaz_}&#K~GsG2UT{$ZMxkqz_4jP*J9AdlVR_QCeAo zAfE4^a`T#;CqB3{A)513V7x2^z{`$vTM#=8-SYT_3gBnj zz9Co=ebCev&JKET`WL?aG`%@Q==XS#h!|z)qTj&1V}ohU2|e%^8+^@OZI8_6!H5-$ z5=bh6Cd6_W31@nZ8)+83-bx__~>b($70bb04swBCV2y+Z-wH;@vp4nn99pG5PJ|(4qKfdHq`zg6- zfP<~GyZW&<7pmmrp3WbD!SB=4hfMHXyB?J@-zFK)~%8(QlMn8V0II6 zl&}xxk!)`w7J%6FE-UuWlZuA3XjO4%Aa+-CrDlS-2vZl?VC2g_VCtGpnuUb2Ee{IbY3{($X&KCs(cH4hvNM`u_uVCmu-vKe za@T;I!GLNwglN$e7{q2|!R7o=BR(pNf$9ipN(Vf4l#LIXq<78U8pXWj4W7PP8WD%Ity|$tP>Z%{#-rWp zo=slUOw&cOa3t*@9*st63uLE~OHssgmT_eswS)NqeZZBm`1)IoB~_u9@iP0*Sj3@& z!-~cC##`!hzzl;J3Dnb_Ax6JEoFB*)!?QNxpf^7H6iBfnk*ht7ST&dfLnxA!^a+@F z#jqP^uYnLF*Q49H;o?A|^wsc_1Clo6Bf|cIIi5&oY%Sy1scKB0FW6VIBBW(|tku`1 zk&K^(^2`*uo0)?voSIRNBBh4WAwBh8juxmeJ-M4gztvR(MrN5BFe+i9N(9hN8**Jk zt}*0#HDnWE3{ow8LG7H4VrNlXg-U{-asc zaDUi_>cQ@%EiYLWsHt^TYEGL4vYckoXe*;-33%9{)KorpNkP&4v}_V1H7~6LaLdU{ z30g>)8yEj%YD`Za8m0ZW?L@o5N1Ew}<(K%qaF@;t9@vNt<^o~?%%jJ{yc{iZNeAWt zJ95}9Db1#WSx$jDvHjN4`rpFl`9a+IU9;Z;ntxxn-(X((yJ5ds*7CPbU(83fsDAf2 z!hYumg4hr@l90gOuQ)&fHr0wJhJ@9M8=U?Ze2u2z>+fQJOSNGv5Q4sHV63LW0^k!7 z&<5ddmfDKL zLyhxaN4z`lEKUzl{{C0kow{mq_-@07P?cc~W$Q?#v|ih{Tv>{>u`&2k_1{y973(V1 z_&udq$F5R@wsg}W6kq7Gw{d{yR}kcVN)|HE5w#qtjSSA;z%?z z4(0(^c$cReZqO0g*m6KhCE3(G+0;DQ7*7Dpe?Qsu!-q}imf{wqSBZ*PewZ8+!3&os zyWlLygr{4ibC7+WtRT>`s)2|q$p5_qEiCv#8!R0OAJ*i_RxZvStC?Gfcc*Aipm=!* zNQ))%<;EM3jJ&!e(SCdWuhWt(Jh>WV{RrS5^_f&rp0mnN}#dMENT zY7r76YvF}uAWto9J<+Hj;LoQit8)wh%4sD`%S((BgkhQT4Pggf6eVkQn26KSslkAq z#mmEbwPA;7jz$>+>Z%5Af)zjTobZ%O@i+=DTe~(YHXIS1ccU^fSq%^)7(G2gowon- zTIarS#f|Zmd@8vMYD_0hK?NER@PPIF^qNG+J#{kL?f6NYJ=c-bgQ4*5ZV1{$pghsN zghX@P<=?&&e-DVa-kr}^bk1NY7x^hRp5%VA!~q0 zCCD~i)6o(d(C-$&lWYUb0vKt$%n5F`+HU@1;66K$CVm@AAVS=2m5=cqRK;=VKIP%) za}lwT5wz+dItmpnDxyGr!#^AB}=- zH_1LDB|ZDBdD?|D_4MJ`4xD-+zBa6tWri3D%30yT3uLc_b!5Nckga{eLWNO@fktEN zrR4z+zjgThn9{jHOT8DB$(Cu#bLDFDpwt@#S~Cb5kWeh?OoUMqm16lyhlRWVGI%lP zVfwC_rs3XxB;gRR4?Ctd$I%G*5r)PcFwu+yZ;T8CfpwLK=izbe-Z{{rq}5ljD7lS0H@BUz1sq<>Bvf zL#zk#z8^mVqziG+NMdVQ1}NzPMj0xN$kbScQ=O5Ejfv1`1^dEX;XvJNz;Zyt=&|0j zW0!0=rc6V(R_T>ec-1qOUwGi10eYm=0XoU#ZB}*6Qf~9cDE(?P>hU(C`?+hY2RGU7 z&&n1yFe4~~uUM90b4JiOJc-pA%b2NblaQdrE5Vnf$k_*qm{zi>15aG+3|#n?n@y81 zy@aZe0q>4aTOUC{8(aEm1RQH+=MjJW8Qfd-Dsh3e&np1Ll#atfQI~^C*G`awTA@S4 zB0IMHemC*37T|LsfUfJnS+5@ic22QQteli}_gYFsFq7+nFwqgSMSz|$I*rji@Q_x1 zujK|;R{onN>^44bhK*Ne?}-b{AH5o>JSS$z@M4dOPVA?sQ3Vrx;EpJ}Cv;5H^}F{y zNJNf3`kG~AM1;0WYcCZgpw`$utLp3ZvqP!mb+f*w-IDS%Rh z{U~Pyvtvyr@tdgK6jL7b%~>94iguJFmwl3hZ?Ysds4O~J5FAKfZ~(O|aRHz|D>x9| zfs!5Oshe>Q{~-LZ^AbVf^{D2n$?eZkm2l9u1(}pNNu%aOc0f~m8w>NeHCI|fw$q+N z z^T+l+WwRwf3hA(y6lhJ^YB(39Q{83cF@=d+Lrc$YteZ~-3B)s`nt1yhDLeX$X+e8P zb5#-VBqO?J*oF@2Jsu^vGBCxFSi@?nFhFE)>ax2yNR%sRA$y4nNS1r!O?kG?UEx>o z$r8cW>!{6^rvln7Pjx@J7qCMz?#eGk8E64w&Va(q0LQ+p-?WcS_BayZ2kn3%1RQG> zZrFTev|4Fnv@dj;N2|;tVXD2XxRRta33<62bI}T9Z-xpR)$UIvg({>!OH6rUY`LB5X9XD<7amc}t2P~^x5}{89YzIbJ1Ks+By%2eWDe26Y{U}dE zae|FSMKG5=g%5$kuEL)7fW{N9$Yk%3B_y(bkY$xPI2O1_aNupUarSfeCJnFz3%lQ4 zSVAQ@fw+PNi;8cE6Ghf0vv;wLP#+{UR79^$&=2@HA{W4FdK!ByhKKpoZ<=S!14-RB z02TmshxLMb=v&gOP}TX!7*#i zg)I%LVKVrv#zIEIY@+2w1R|Ehg%UxUA(_{S3hy2$b|MY5>I_ocFSx{VI^cpQ0sVa! z&qO1?ysWaNQ_uumE;5LeBS!gGv?~MVY?nAkko~r42JNO?6A|bKPZAo#`ioF|J?t47 zO+rqt@;-!7ds+zr!9nGQ!7~N44d<9OY5rkq$;uoebh|4yU|1N^gZTxzCUB(>fP_(z z>bmA7$R_L12bNi+6cLsWqw-JdBw9o~;A3JUNk34M^JIB@Es#-#3E3Cf&Sme7*?fyA zJFgv>RzPbCmIVk%`^+L7Zv)H)fh@UD3l33vWAuwskvrV7*F=y9suaj$LX^_V01%VM z*nSzh4HZ*^+k2beQ{Cqeqkw*WO*^bfnv-^oXppYy_`~H318u19C0#iP$vwinb!3OQ zL$y0Gp(~N~F9T$g6-6dcE6&dUi~Ur}_7$w9m5jI}FgrARvqop$_tMjq2#DRL?(=0@ zjBIgBFFFen6fp?ml^}EfqSi<$qD%7gF^8I#%`>g+SdRk3OaLYa>qG$-MkFT8nnJ*H z;$5`W@~!E<@)>c%fzTucqypfX-V-wpw*^JD8jPLrV*5a+Lb`ULAWdY&*+|jk>Bf3d zS00FZ1cp|B0Eh+5Aw$>&aQf&~@>s2yP@z8FUyBH%3hQQA@UAvlwY78jcq#aY4U`>C zt`JBVX4vHPgKm``ize_|-GXKqk(%)PTyGxm z1E8SyXcy)$J382JKt~x9)^XNcS#6+d!5)o3o&ucFh#%920cg61A<0P-&zq#X>5WHe zoRbl1z@}+e1@P5mZ&PJUa1qi=z7k)^UqhG3xCHQOj1n-&hz--6n!j+ZYyK9pBS34e z7@p|9hXyr%0LdCi$>Youg#9~s8=Ro~$Ncm}W#x&m4ec7s&)?imrf7kVvY+68^aP8} zLHbycpruyI0}eYv4j$2yvHXG^!)&QL(m~7eb7*{45ta|bsfVxZerSO&;VwE?&qu~1 zow_64#V!r;Uo*x|$!d(DL2twIvLTgz7`7*i2fQbA#~#71R6qjJvuiqj}LZzNh>7q;6Rtxz$wHPUF_&wELRke zRnA`sDzHgGd?F_*fSTojBOs|j^jcfy0nLdUtto>|RGXSC#&_NmG75rjIf2CpfH!=I zji^0?;%pRcv7DsF`)RwN=?Ne7%O>`WtIF%sm85);+!p z@|^nKloNr8bL5=+QJMckWT~?g%r<{pADsm+hJChQ(M@G5*ZeRt+I~P7zIhU0L02R=x zUl+N7cE7a6a#aJ4?PxFJCPXDwFh5AY;Y;}hEVC2Ic9A=}HusGz1I2=DtBh^Xr0Cx+ zV!b``u6+_Am0ThiLcNAdAk7%LvP#!!VftYfjOUI>+Qr`(2XiyEnOB@vp&7!eXi;?T zX)t-Qq1uk@2Kij{g593J#c~!JN98q~Xcr7e+_JzsJ+^KWoFxRu5dC5KhzneVwJSEC zyoy&{WxMO?n-Uz2b|dTrvI3%y>(#Em|35G}VqXRUTNopgrAb<^rD=n2P4ojeA&L=v zP09j4SbY7!EDMKX`%<5kI&)(QF zKA93AgY8)ZbSy`}iOx&=6=~`#~wj`oJe5Rm*uKi-^EAOJ!9Y^G9}F z3xA^7A%%b1GA3k>5+5VF5DC(%M}AkJmtkRAXzPvsgRXWI9|XxP6^dRtiI!b{>=pwO? zN9}C3*-dpNCbY5@K7rn~?CNOWlAA+|5$VP}5coT-be17-c1HKEzB{rse^VHZY+2it z*Zp4FVz_lLiA>p_*{qP&*v|#8(gq#z1GxV<*c!yC*Cof7<@U0()q+|)j9 ziKL%(PMRH1vIWf6MO2Df(T;r=<-MWYLBTG>C-IH!#p#gN5(u()yPcKAbs1RVg7h%j zbay=_)uv4$pvDjP!N;UJPy#HTlIaL$hKiu96YNO$sk3KVondP* zq0y;`_?<)(rrmhc46@r>7>Uq9v)8rk<2LwvUywbSdSG|-A zP1zxOv7A|YQW018$|z0EAO-_F2Wr1Ij>v^43}ycZS@9{aK?~AgbL|%Bs-=?p#}9hs z4-EPn@~T!TT@xhXM7*xoooUXCa2ayzEt}!3fHxUMgc2=j&)^WbuF!x&u;Ym@Mi$G< z+JpO0v@~A}x04`>sE$;ph9sn`IJl|LPA*`Z9}i%hdQO{%#>7VY(_sb@Ms*&(oNmF?g@W3(W6~giW=vy;mWwOsw4`@31UUPIoH1^-?MQSptQ0 z=s6iS?Kx9EGY@3Xtc^{)WRpK`1k~;71k5PZo3YZJ#XVk%KmQ2932YN5Y5&l|p_L*Q z_;I_D>{lFq1%KcUgV>8LvIDLqBapF-U!cPL?9)=!%FbLB(1YxNpKf|I@c~M zQ!3l6#7fjqxd8B{*b>2+4956Ms0^GSLkQ0+v{HW6_!Xd-7!{?Zf-jFNPGvKpCHIj4nrqqBU0DTpv$RvsngaE2~N9X1In zg+h}B0ahs}KDA1U`_`t8q$edO^7>_zUD#?9z8mC0I+K40#r6y{npcXVg{4b18gElE2C%PvOw-EWF$g0Nfj6sc)5_5vci%@DFg;*NPr~F`3j%`3H;z}Y8rxIBKhg0s)&-g*!cbIeGF9AkE`U&s=RQ2l=6(7QwY`@ zt!NKHWS9KUn4|3fQas%h`Qyqs2ViQlIxzDiVMFKI6nu*?VedTPt(_JwU~=n)FCsSj z(a9m+$O+CmM2kN!Z!f!VV>8@0BJvjexOWyDd%k)*Yc}J$F}s+Wc2Egd{c7VnFCy%vn|# zx2M{1CE3XkLz5UU?5q1Qb?v;QBIagVT3|(zQqwqdWV%k)&%UPV46PVqZ{mK-iZ=w= zGc|)l8Mu1H;jtiiF@f*u$!)uU0cJhMx&8N6dSs_0y5fs1pq}af*Hx4hHozM;wFH}K zk2XH8o?Xk7xH~pKu3q;e>K)zb4-WHUpNKYcUw@s|tGLHpdVJi&gF2TZ5KXJPmZ>gs zTLpHOP9n+FuLvEyf`OIZ9S8`K``SidT-L^^U&+43$;4*GKlCVY?zCS0il&d{3~vyQ z+}oy=u6{kPw5>0R5+aH>R)m8UB*2 z(0xWzE!W$BZ|z&s5&?(qf4)fDWl8_NWp|`{9KyGGhKF{|{Te52i5ciROBl(%&z_w= zqceVR>I@mM0A=Dn>8EQ*^*2!_6*pP$J(v;Xl%Vy2%Y~vbxnq0!ar2d z|E?cfi3!!ODE&KcPqlrRe?}zf9*5Wse(x$`)4xN0#2d~-k4m#Qw8X5$5vEajult;^ zR0RH2BXGB+H$8;02^akddiTMbDFL=QZ=oBq(HV`N8pF+5+J58EtDbsCYN_;Q}|8uv)RkypR@HtoTqdO#*;(6D6> zey0bRBY4nb4<6HlMfM=I2LueuY^f5x_5c)B3N}6Hvj-dW02>Am`t89+J&@Ci>#pp< zCOydQL1qs&>jBwiDKTIVUZ)2f=HbCidvLxUDC2nIX4wNSgp~BE2ZQ$D0zHt%mAKjV z;PrZd;J||e?76t1vfFNq?Gg0q!hIdB(BX76#;*jDs!dSF z7dEz0xud$*K#OSzApcL>-V9D{=~t79Yvn)2`>&G;G7X?&nV z9Ft>u6V{=5WWP$Ju0JIJ-Mm>9@S1rQhz$tW`Fu{Q>w(~C_V>6VB>B;=SRD+^Jc@?& zoJaTa2v+ZZ+#liLM-(&PlcHjG$S?W0K62Z(8A&ah<$LRTGBcf{ei`|_a24d!s_l@& zF#d)aqy{uaA5I7(#%O5AfJ67+k7(qc5&Q3HX?y`jyY3CRHSw|L)RSv=Ajs>ajNDey-2@kh@Qx4T6NSchu9T?+<3>=w*UiI&D6BGMb(VNMcEoB6+5c*|SKF z$1a*+i?y&+6n_E$DUm2Bnn7@vuWaIMU7pVaL<)13K`dj?Jsszg9V!GskjtR!O9y%7 zn4uPeF1}<2nIu5Gy(Z$=2@NRf0x#9*7#*?R1&Jic>hqqjmVegoo7boNjTD?9JB!JM zWWzxuW(oKL{c?dg1|EwN?~@xTVWvo%ym%13*c%k|wXux#ZrD|-g2jS>QJAdkc9Z0I zLhdq2yhuC%qG9z|+K^GpKigGE0<@q=Kt*;jcMIbZPH7Q2MCuITZkQyyid&n&&V*|u zf%PO0dKt@dEGNTu-omBs?+M*|8}2td!i-~bO!8ki?Gh#BbteY0-w!a++!R=dwG~*- zkbZcCc6Noz*q_uhHv z7VaNzA#l?X1n{DQTO_zaOTcX{CS^Hl?~4j>6aWZ>2884fgYSQXz{l$DBBHu0%=vZr zr$L}rVa|RbP%AN~gg|Zo5U6G6Y5x1*O=teokmi4zHS}>`8Pr}9%=CrdggvTj+IN<* zGtep==8q&7LXe;Uf?KGCncs5`_yUXxo@bHkhQ?BQcOx?8%OUU9@-_J7Lfj(UUQQZR z>kwY^CQDUFp*5^{>~0Lk-P~h`QoCBO3>#5=rua*;e_rr$F0c|W_)5)f?wZ=SWy2B^ zdIA%JC(6WY#B1s6VJhOBvL>*diconCrxymo#U5nBeC@EiqCSn`0gKRZm3^FhSDywO}O59w{aTYbPrOaOi+(8jx&hA@T7N?v~Kq!#$`- zA6{(CpM$|&%>T}&`=n?7KUM4;OY@i7CM!_vC}1P7XiW)ZwsjX&IFy3H-vj_{T;6{4 z2R246e^k!TLf`%TV(o@(g|N2BTbWq+{WI+M;r;e=JwFax2nG5>*>zlq2ZB$@2JxRH z8^k2YBkZFi9xyVeq<)T(A+Tj<>|l(b{_zM?B*P@&0rZ7Sv#JsomT8yczGikifkTo+ zXIG!TrwhH^wsQA=Q`7D6lY%R#QcL1T8)-mo_JuqVwA&3f06u#3yMl5-%xRafP%Td9 zHH+2#x@Vb!_=S#&RV6?{mR~k)qu>3HRXmF5Ji|{UaBWWV`a+sY8kl}cJ4R_KCNwB0 zndiRX_lIA8uXrKw2HBYfvi*)#C5FIhtZ$Rebg__R8#A0MbwMu1>%|}x1FL=_JiinT z{Qe-7Dc(Uwu}Hf??u84R$Ta-o^|2|&|2$YaXTj3vJ<@KCW~+6fVYpU{ZFpsPre2Cr z5#LKzyK5gXlPZYNUkl(uA(m;H&CbX+n;qVS%|M}_*~_me;;w5U#SHen71AoXiif|h z=DzPS;x9Rhw?DyA+?%-T{7&+Qh?q`r3w=ys5k__u@gdKn7H1c=NYNq+lz>mDI+E(I zs>pdnALWzQ776sVfhn-oyJw1~E}JA;S!YBBApkp}ll0X^3kcJYl(L&Cl2>uqRV|Ak zirji`wosGorwRg-Zb2=#4Di5e7tTNdI&jyPO>dq4M(q*e`DhQ({FF5 zP2u1lCzZUsjqZS>P@Z*Q8ecW7;Rhr4A&*yAhkw#6#=^1nV}|9Dbx#?Brnv5L+LV?C z_TT+WsxLQ`Ujo%*ww<3Z8_K7CoH;aYq@PdRyFKpRoW-rR$vWZRK0N+U)&GEz7gt|S zxc?NeqP5kCmsG*XdF}e57w>M-zoX!6mSuG-2r%4H46Kp4A-=xo+fmF~miMU;2Z$zi z?~PBEuNO&RGUqH2{(oN!j~p)>&t(?&Wx3DPz6NacFG$fou&nyEVvP>9&NV_C_2dSs z_E{FBxlTq5TD>g6Glw0dtQ2z$Q30BR=WvIGTAkRE9INP{e87Ex4Bg{Jc1|%f&(6*V z;L~b_yJJ_6r^L7ouw|9wfY8bz#^cHxue(cZgf!2jI*XV0GMFK|*+7KnF0md4)WZOo zBk7^)piQC>-*}lHS2g<@b34$^RLgb3o2tX0i`;kC<4z~DY5n9&x@_KvJS3baK~ zzigya?fx4$H5si1NE;?5E=ufRE?;+FrLWZp*H44|sdA8WcjMmp1R%AaGH}x4hHRWm zuXs&x!Q#7*T(@oN8?&e{J^g`)ZhFc;zcbu6^^FKX0|AXc<{PiEZ6YUFb3A2KT>sO@ z(~5HMzhSb7moEM8iyun=>v_-KW~*3^XU`J-Du3K@!?vZ*xBtGnWOCcqZA%~9c-YHV z%zp5OZIcBI(3g7&50-2zlF9204bIwh10zkgZna&bY-sd3+w_pZur$H3g<{4bM8#m_ zAmR|0H|^cKWHpM4E!`UAoXicr#@+s}Zo|2}C#I9FC17LBlZ2(>1qTCWo(+2HM&pTz$%$yCTEC%aZQIIALb7RxQ6W zTX4Bh2Pb&SfY_WFfOh8wK%jYe^$uHDv1}xDA;9Lu5|#L`<9V>gn3%`C|5!Y!ac(^m zNzy`N+{8o5+vz6WcJpRfrx0V}o{v8g*dA(ss{ST}0#O_!tMzec&N^OtDd_?`@2~CJ$E| z7Qi(ouLlZg2Ml$?vgaKBBasZX5O#t1eb4;uV`F*-i9d7I)x9r$QT_?wREJC}9N7lc z%0El*c*iH!{L_)Ic=ooXzZn10t?v5kJ^?n&|IWeJtbD4yVj}@GEOoM7MK6-UqZir6WsxN4{|ui0HK^@;CuFvMNaot zSp|vEgc8C!D>S=naDIHXu=fC3tBcC;fZ01)$2YHk}vS6%pKNoKhRvP=h|(RvKsd9PdzW?~!FJjZ3V!xqsZ#ZK(sQkzW<4XIs5^Ffp}2W z(%>amoiuCdm%$TmRjObu83Kg7^2W>e#>QwiSCX1|y5UFJ+ny!cwiWfQQw*%Zi+uKL zKl?3X*2a!uUt1@IRn-VbVS64cV08kGvH4`_Ri8Zfj@IQj!=J7>_f1c_b@lDSvgEh_ zaoJ^;-N{#Bk^U@QddjoEJM$MeQSLkOXWx3}@=vMU>6a9j4j=m^eZ9o6@rQh!q!u2f zt$BT`_M*-R`Erh4??;G7_(}0 z3OHd0I2|-)IBZ-7CGfg@90Uy3&=I&$Li=XpL}|qmH2_bT2Lcbj1fHY=9<03G;6W%< zLrj`)9vp&=e|)(SNcmi=A+Sv2XYYvJH$5^A2RSQ(Aomd*7Y~%foOs3Pl$~*J(?WZ# z(4$v}?w4`rou3q?GYUNx;sf{S6VqyC3Yju^hx=Mw_qpU|KhAJX1aG*vg`9|Y+Jr$fadjK)Mal%@`TAvNX4&E;}U5jd<+1yzCzc2Q zat1?SkL*4Q)&8zUF7MH8G^bk6Y2>7{qQ)f+tRmGE7UI%w(Q~|7l~e z|AI|+#sZ;)gS^ixEtfJUR0T)@S#9)`IL!j7STVno3)7_yM_!8<$3t1vy~{4!YQTxy zlg}Z18KVMXQf+L>1v}Q57H#!9ESP$#C6);$McmCCgmKzoRxr!z`)+t;`Tb$2K*^_Ncx0P8+fBYFmXT$uMc+zQ%&Jc0}jRt+5dSlW2e;L{Iz*Vd0uZWa6Q z`dt;;J*ln02D;l1)DYjJNTqoGcj9jUOX(3?rwjX!M(+I{`#9T?{P_ap^+jX49HMox z^t#nf^e`$|VE>(U)MVa}8gFGVigqicBCf65As#~z7W}b}G&3r5)Q4U+YOrsz8(Z_9AU6_^Ep>w17$#UJ^taS^k1^o$aPU)<0 zuu1Gj)SzBfUf0=+wdqA-3ae}vTgy&!wadq|&T#Nv4%#(*D124Wg- zPChekYA=bD%W1K>GRZuart>WZpK<=90)-d=*J5R3@w$(d;J9PSwr468S+=d7mS+j} zDg4As0^+GQF8~^NFpU{jQz^j^pX_tup?Yu`g3SyvjFd%-Y3r(poDWiQDRjTP4pX-} zK*L1q$JI%Ih8(QjfJ|RTV5zYS1BQSfjzmWl1ik@6_EGm!o@8%D5altyv+tnU@Rfs< zf*R{_it3chVc&w%8EJ|TZhX%4x+^wmc+pzIXP6V?V<(b=RKzb+6fhI|#~~G1=L?Wo zKn3&>pIR0;Wr({?Zc0?Ov_CQqlgS*kF{{s^4wh1v(woD55W^b%1$pfM9 zK2c!6J%x%A*PWo8jw^9M*k$?Hx_{gB6h0yB5)973;L)@O?fMg8U8n`pA-kXWR#hi6 zWL1)WRg$Z-tWuNPoUaWQ}tdO##K-U;F^>DW19{Hpa)3xrgL{7a0hl3=n_3O zd=V!SD^r<|ZO2LqEO`mb%4=J#CapTn+j5b61M2wZTSA?o=P;W)`~)QpVKv>JNo$I@iZp$arWj`bQzs1p zPBI-!hP`q*?;QNc=~EWYS=5U+Q-2X`KkMRP$Na)PXK7k}DX<5CQ3pWXu@ z3vH)V7`5WG?9T%!;iu-qHGsYvErYLBBl`}=Dlr@_;xB7nshCu;u?Cm9XR&{7%j(;muFq zx{vuzIE}TfFLm#)H0x!}!ezMIBrvmPNimZ&)Y&{isD#<(Ww%dCvPAXuM606h%U9{i z`*z-wsxF#H*BzSGWIR(;m*0lm zNr6n+&i>%10Z&13T?C6+9neW3cjzBHrbJ6Js|@Mf6v2OmMM8IWtR#Zx?x_VlJ3?lRyxT<7Z4N-H(TBKj2=X&E~p2gsJNPJsMsA=Y6md+VU_h0Ah`;=@^;rqKPqoI zS)EP7fvhaU$E(|Az&mBY#Jm7i!WKufm3c!4qhdx7roSdNHsSGHT~Q~a#!YJqSS`_$ z(Zd?q{G$f*MLB#R@01}*qn683@5qXQh(&(?r_Xbjisx;}3IlY(XJq72LrMW`xmCcn z^7w6lT}T?;p~m9wfJ0j8=KIv~p%89p1*Cx@fp!LtdH>*gzi!BmCDXr2z|f9RNp9Z? zvTSJSpWz3+6*s`nJG^~8d#k$274Oh85QZWnRAQc_lhcAOyOv4BtW5e!)_az^HB}sS zKiui7?ltk2O3kI87F(#mubp((Us0V>X*!Wz>7`o>popNUoz&n3anyktMW#r`Syt-7 zC9^Ee4Uh{=psliKL*WVGYs$nOd&q%=HX3u zf+B&#%$~6enzOsYZ1Cn{7^nK~%xKY0Z%~bE&jk!3gU~OQvDn}|n{Ni%**Rk2QNCn~ zs73kK3YnwvO6u$Ax$({U;!up409e2j>nWe)RT$Pv^a!~TL4L!q^r_qYhFz#+$t`^a zNomYGq+wK+LO-M_8uKmrp-aXn19WbYe1FV4OULLpz~^v_?ex7Yh;KTX(0cbI~?9%`Dbd7*!PDdx~z%698im7iM7mLf)|n-$})9-|;=7B9zt*2H`sdZa@bj{er-z6svMxlxXN8DMie<%l! zb2f-$)Y%<&n8>(|6{-qng;dS1j8pRxr*^*_mSkgakt7Hhgf%b1@d}?f=?WT@h8edA zBXB?qSU1hf7WfX}=AzLQ7KYX`qlC#dnptW(ps9f`^-wQW$X+&i0nNh{E8@F3&S*xy z3rpuAvyv;W%w+K5SAzynz<`etxRy21WtY`ZWi`Z?*F@`tZ@7k5X;;k&dQEvjWUH9V z-6}@OspwWqAps*CIHSSSSr8H@4z7s&s>q7a$qMP3jAqhdwr&9uzUSmzKq8w3%BsTQ z)P*0MC5C{ZK|dgG_i=4_Y4=M0j!FZbToVF#fUS5};8sEfGh`A*p0Z?!uVvYXh+v44 zJD4%fPS%aLM=`_Xe@TM_*_a6RaU{GG|A$W(ATr`5uZ1s~QO-DCd?MhAPuh$Am}B8n zzC$*rJ@K9WOM;;_vOseAszQy@L88l8UO9GE{Ou6tP<%y=7Ue)zM4mCXl91DBdO+p? zmXl*WFa5PAStOi7JF;CdWX@W}w{tKAR^=K~97j^HDxtx7X;Bq?9+2uLNW(Ury;2Dr zU9Pr%qjYJ$KDDH?tPyCQZjl1C{c=vPX+e2u0$nhjR=43+QcsAvtaSYMQ0^ux59Ac4 z5%rI3i>8uz($MauKg9&t6@1DvO1opTgg^+*)573tEa1Dp;amwYCr~OgrR!%<^W1pI zO3;8VLm)Lxlb_(U6Hua>sUU=t5S4N6rcYk?4`@Ui>G)Js46VGHRoL;WBV@-{ar9;}%U)qgDu=-Cix1Q zLI1(F>I(o(UK-<9`-D7cA+-nTC^uhRf9gP{uT-a$(g;JmBu$;QUcQR444>3YNb8K% zu$5$x<_UK}W@uO48YA{ac{k)*s1x7700^{SuE1`fm4 zOIa7dB?g$$NKnd|!5m^*GOyz=67wiXZFz5-QJS6+2NDdQF6n|O;$UP(Qd7=e^OvIg ztekY03F*+8c|r6_9zp7iEO|J*__a{-DnqH}5G!qNUlsey(@G(FMlZ9h! zvFi$B0wZ9RmSi0x3uLRXUV)w(F~mL zL=?j*Fqf4~JU4Ww58OZmSQXt_tx`0-{{>0(bIi6hurtO_gfWbAu_-zWqklAvhNzL)*E5}n z&O|@629ax%C$pBamkv~_jAIZL+Vr0qkl( z$S}8fvgxEK9AQ_B8oN#;7u|qYlI=|A(euRb!SZ-WF*wB2f6bRP6Z`T{jx-jf=cz|p z)FjvPQepX>*@hprzf}w>wbPm4Ke$ma0DJctq=iA}3G8aEa5hMUd8)s(rF-i`e_8d$ zIBm9pWd#c%+lTWVc2)&sYdnodq@#sy@l`d>Mv?;6)i}FB#!MA}a4UIN;1@DgkVAs1 zX9^c-S48E!GcGADO1-cdlojN94Vu-JE(ok9mt%@bkPNBrVs1k&ySZ6`4w=B$B1Pw7 zozYP(Uz;sIF@-6kNr5sESzvk#y0KZPv6JSSLCE=_?y}@5G^eLxv?NM*r6N(P@_Ydp zB;=LMQO)1#VqiXS%$rJdNJ-mxG|B!Zqz-ZW1;UG*c{Hf8P?1aQvWo1DTOnXmAq+ef z3L%g@K2ei!bmgOd{3eF9Wi^oW=gPK|iYk~$M`!B+K#3o=Jl4{yP$+5!&=9(({t=0v zt&ao}bAF54dtj7X-8U*fg3nBavu%&Wk3NV;UL#IfwTm1;kp2zkX1R_KiK6)cAkRCL zgJNY-BN+pdOrx+^G*sf9=drAXN^x5RBc@&Pu)jE{;1s_Vr!UDIRtA^Wk~%j#nX1(X z{LVYQ52uWZPb<<31}O%&F(2b{c6C$$f$`nJ;N6DCV47ujL(TaB&U%efW4#&i3x?0_ zUy1Bi3T?tD^E@vbgJxL?esr=>vaLJVX~pid?d)r%&gDUTd1wnD5TZ7UK2zrI0Ay>K z*%(*>Ge6=VAsT$!xR%FtN2oFw4A92l5C_Yfgt)Cxe98b3!pOI*K4?A{o!JCV!gR|& zTIN9wc{iB#>F9<)jf;81bo*s5KNB9I#W`(@u4|}@ ztBPDA9cmr~Ms)EL`4W`_Q@eMSqY0eMV2ZegJkOhvYmSv6UxhRyv7csZFpx1m7du^S z$3)@4pcl~xv5Oovn8^=y#GfQ+BO#=YURs2#@A5w}p;jZn8-w#@{4gQT528I83`ns5 zA8rY$^fDczCoI}l2QaR3M5!9;&lFQ*@HeKVt;&%S`}5p2$5U$UAG}3-l^$O*%DtEs zd9fdqSM9|s*^5{DUu?4%&txy2@hvx=`gzhG8DyHykL#yE4@MnG=0J}`QjW4d%7J$X zNyw&YPddGi!$}wTMavxoi%+GZP(vLWQ8RAw?WT_;VS*W|fAO86>`v@ z^rGjL4wNY!53xnJVqnoogaedAT>d3>2TQ{$V%F*dJYY{h3P3=JIv=&aSIr7vqNmIv zPD42aFdjpJPWZ*&Cg=kkakneuJS?geKB4luAeyMJh|evkI->;Ca7^@yp773?sD~fv zp4pGhA(Z+UF9%mp8Z;nu6?RO3CS|XF)M}+aI6w`H;jGOX74qY6)I{^y)Ru<_Pmk^;?7ZSc2mzg%reP#W+&>z4sbKMnS~S=q1`xGA!U!-BP#-X^ttke- zHq{RV6p(zNCGCV!&G8ltAFpHS%19YjkPerX>bup6WDk#|u+m4iBS4rQ;72lKMf2(fwGz&%}3{ca$Uu$sK|0U5hEQVk;zoJ#%xcZ zmn?$}G-{Ps5lq5xwSY2t6-4(bxI6@13Au%nK<8ROO#Kx3zawx3D7r2?7-ddU5bN;9 z=8LwUEejYuKs#sY2ySU)yng!_{Q0roFks;KiyCYEAnPFG1M*_&N>N$CaYL1H3js-q zOBRBO65mmaZZ-#*h5#g!k(v#lRT|bViwcF}(8@@iV!p7WF443OZ@3w*;^C_kTQUR} z@hJwmT%QQJwTW1Fte4#mhhr>BH&^a2fSTXjmfimLaiDV^Fmngcp0sDA#G;8XUDlL)4jGJuxE8Yb2OI?P<>9-dG8uk1$DV%HIL0|sOAiZ+RCNf z3jO6%7ouBWKVltS-j-fxcTV7VIa2pd+JuK22$+DQDWIjM$`zRyYC*GHJB1x-!2Ly- zw#t9SJWWIU$ssQQNPYXkHV zVl0?5qMrnG`T)b?|4apj6;{Snmy(kpA=o5_QAWY1R$jt^ak5$;A>irUIFfN|9ZwnJ zS=^u`(hVWXS?gX5NrxG;I}%3yB#Z`=(9wA(oE>tzmg8(Mp-#pdj=gyYdn2GAe-cI# zI-0&t$J_MPrmWJBFg2H^XYe0*t^&OMi%uTvNs&OolV z(6$Q`&pHUQ4(J(#)8y-WBeY$MnTh%_QPwoVe=CWJz9Lb$Fo*959Q(rs#qmZC7XZj> zp*xqQOZt4w4;4`oB9s^32BsP%iUs`_=t?4S(~FSrP%ff#hbj<>OGDsMYPBZY-szqUOH3eNCcw*%=}c8K&R6ToB*9_>U4+2a}z zgqrfTI*wzu6DZRoV+$~@9z-p}DkDdbu)`&82qbYFA>V?hZT^E`=9d!Bk|&^u)rP?q zrM*`b;v>??xt|P|H7TRjUSz=lvWUTrzI@P(DxejtbCyQTS%(6Zvt-!kUuOVG?7}#P*k#$CZxia#$d1mA>5_67FS^US`-&!`}vRF+q zdG|IVh`PIj!(}Og#NEi*@#JXlSS0!a){VdCOH_oq0*C|tf zs*HY&ATg<&nj=j{2toyf*iC`Z6b^Muv>>g*wTeB!?WS}jVQYObp|xaGADSj*UnY}) zyJEygmuvC+!$MHwOy*a2;5K8jic+bAsW_=C;hS-n*vy2E*sP9gUx}nqzDHv%x`yeP z#2M3>q(8yP%ndiDXr{nj=pX`w7@1&FQJ@nipnbGAavaZp%hL&bzQ8BCiEj^hD4av= z>oXo)O2&TBujKfI$&fD1^ck40g0Lj%k)J<-XUYybzW8w2JX^^;*VTf0ev^9cU)_S0$xAtwyA#Os_TukCe4x ze>L%#N+kL6VBpC|-~dyNLAG=7IM_to$=srU$k!MgN5Ggm7-6%00PLZIJ#VU%j+|cA zTo7dFR8TQ`04fk1QcyHSNTigII#GDN|E@-n*{1cy1zFXp2EaA**Clo0DxWXiEX%xq;8nYyQ? zQ#4EM@+_X44o7QgRPpuh3^5bK=^s5qIg!m6(@2&@mF`q{(e&13 zl0z^yl1O4b{TYTOics>*|Cm48grL}k@=FaUdxEAkD^rqjKv_^-5oH>HfEXmjjG~B< z56gvsGb$lrsS{)T%ropk!Y2B0O;EQYly2M6gf)>XX=D9M+L-*6v@s!5kB}KA&_?iN zh`x;G2_Xo`NxtmDz=s@~M28}WIy9-shR7^q%S^XCAc}@EO}K+t;fT5yUY4(!jED&l zpnShGGR{QR1B?Vg6mH2rH}lE46V`RAmrTZg&MW-LnI;$`BNFC9b?#!?Qc9ke{R++u zXAI`_c^*sCVWMoMRi11P5NHWswH?erSOu1a)mjr)_Dceblo~mYl@WaY9@aD>G99C! zqke;Wd{W2^YROrGk(@z|CaYCLUc4Ne(K-j7Dwsvabdr~Lv9=6AmF!28$pv^}ZJ>Qz zYm{GG0(rfqhk+og#TIXWVW*Kz09j?Jvwp#6{Q(|=$87OX3uU+a<)@e9Ir-;BA$k9@ zK)5p+mxt}f@ZQS;PvP_cc6nJC;+)@MX>d9GmdQUGW<`X_(itSYSpJBVl3iv12`OSp znVDRHo>WOX@;WhXB=HOz2txVguVo|1DhPC*%if0LdGoCr8n9m@vT~u5QQA`k_NxOa zF;Uqh#yU<84k8H65X`D(tS~J_2wqM5!DbuM2e73XXsk-oE z4du;V7CrcQF0ALlh4twlxV(i7F3**3rVH>LO0Z!Kv!Lt0la5DXLc8TIy|6aDYQ03x zTUL+X4cb_=66rfU(@k}mr{0S;`MRG$Cs6yxCsAbLh~bf~$3j?HgSi9^8Z$Rj*ras_ zpmXHl%~ygiJ~a~x;!U(rFy@k|AhKA@C~}yc`#qiY4gm&G(8~h1P>OHDiTj~o zD-F9H4q9;wV>CNuG@Gnh->lfkg)0aSZBH_QL6?Q0B*6~%D9*^aKhCb*92B1m|dgjd%(6G4A z*q+NtbZ<2DJYFbIFZ+Wd5bp;BzX6gR1T7ywh=El)(CRs^l=MlNUve|GthkyrHBY3k}I8VR0g z&sbMCNYfrU5DejZmA#<6y`oWrBhoAJ?uMGE^8JPZ-*2jkuFtd4W}(mPG!e#lHdY`* z4sf4oF^umEj7mJxHik?#t{bt3+!l#zmOo5q#JRPbQ-LG zpm#b$#*CRlB~JS4t**4^W14PbV5?Rq`RF>pR2Y>-sb|%2-AuF2ttPzL=594mhceuc zchsjT%v+uLn}(?JmD>}?lhrj~?A4SgwN-DMI-+H(fr@5wO1@RYJAZ!XvFT$%P=S-{|?QD0C3ce@{vxaFmyCE63O15L8K)MF0 zLEwE0S*PK?Zmv4JlFfd<%5OpalDPX)U}fB>VEx|@o7E|)`Nw*Q()2@O0&^-Qfo_ut z)0ePAFyNRe3dWhOiER%ViyZ-a&vNX|;)V%m|6l(nI}W|T4zB~}ey?pP`Y6m*)z??o z*Vok7)(sgJ?@~X!zVhF0yLmxC zbi6iRK=y&&^Flsuw#|eo=(9U)>3-&+dLk@0U$NJU^=YBKE!Ed~8{k7$TKV`b>vRkE zKVSs@-p*36oKIi$+U>qZgYsqTn@gTu-}3xs#7Q5pS4`9sbz0QgTFU^YXHZi!eU&0P zTuGC)U!<#+PtOXPS@!V3Klc!YI(Bl`JCSRCU z_?dyD$#tU6pi)XWaCuc0Ua>a4_LE_^@F?8>!M=5Kmgz*DJT-tW0`@iK0&duAtN_N3 z6}X%N>joEKLeT0K^(*IIqsVg=FWMEaHaw_;ePGAyeHMfGkgS9b{8X4N?$QyC0F zYX4$W1i?AfJ?aQ)O|e3A4|(ZWdhLH5G=QaHoAGS2r3b(}D3=`9UQQmhC4MQ;VOD_1 z7-i>`+jIoGFn|A`Tk=bM;YQINh^oYryQ!9Q&HO)1wVX{gJOZ$6L1+8z0NcPW*I1YM zzuyh>j&nGJdEH=`*+2niIo8CB5+s|-1>8K{WCi5aNI%3$HVuvu$6pO}I>Rchp_12+ zh-~t{XtR&DwQ?{d`RRv1u=EKoJQvEtn@yoMZ|9lChGH3C)+?wH#CT@?gwg^K(n7Ds zdiyvoW+v>6i{nM=Q!fW_tV}z48?Vlq+|tf z2&IU$gwe7aU{N402gi3&pl*=ZFSe#(A#qH3b$NSDl=JrV+)qxO)kGKi&Is=I-I7H5 zN1E9#T%!x~yr=#oA3ZO>7n;B2MLtb|rz5p2;l^EC*rnzs*RmowPK!3s7BA6+a@@w#f5^`_RwI%%ZS zV)kQ}yds?Lg2_`)oE-ltC#qS@3k;>`DlJK@G%9L+AU+XnW4%3rpGC7~Ais(RN?^fQ z{QM9cDVTT{f7b{uuL}*8xBa~Ii61EyH z+)P1OFdZX4%Q?^)fld#F=`xa+QU~DYvJGGhK06OZXU2|lg@HHOaXNDIu49v8K;T>{ zNeJ*!)X2}&0x`jmjS#c=Qa`@4MqZD^#{v%G%`EojFxk^?x408F|EFn8wSg1$Y)w$j zL{6v6d@kZ4vj`)sKsNm9wk`DQ&xhd zk*8sLAcAEKpFpgOx@AgQ_>s9=7>I3Ql+jNkoS8B|QF=ii3{;=GII?&dJ0hGxlHbdV zZzW}w8Y+*PI3XX#&8cducivpdke#Po6Z&Bo=(<{t;T{4$Jtu@-Dgj3mse z70;4%h6YGydy$J_23l33^?S+e&lc4n>zD-TQfX%|U6; z{z*7$AR}}3M^D7f->>qA?1;HQJ2?ZH%QkVc_Sq^j785%f?~5I^ni+)0B1|G?4<;Au zOb??0q`0cn+C}UrDfW_GA_aDmpTcjb37Z`g4EziJYs8ZQ;VZ(vW;7=k*>S94)iRw$ zHnB^H2gz8rzF9zIhYLX|Ce*M)IRX7oKoykGS1lV|A6fUqmHAcEamT0FCa?hB=*ilz z=G-mRLdCH$W0lV?89WQ7T9oDC1DF_0gs)9OV$es8&9wr=_x&P%JMfvrEw zGxey66sG4tb<_Fhz zdetVDyyQS%$FX)dAJYrp^wONrz;0Yckk}9SX{F|&D_Mb?d?li}F7VYWK(CUxVK{F3 zU5e&$@f>J=e0?BDyI2gC)51zVAV~3%NMM>O?pD;5zS%M1ibrM? z$+l?S=|{I^MpxLt!al1%-Fki)Y3H<81x4hH*0v?1i@!q|OBY+V3p|h_Yh2Dc1pe)~ zOUzqq@Bx$4@o71B$#{sqVJgN$xSQ$r^lgqm3j_;0L*03oPpwz)+zxt0PBg6+iH5+yRkfIi-=m2;6|J#|em1Z|(`>!es2{r~V z8t7E19|A7<#oX${^gyOQL|YU35+jD#9jEwv&+Q7!-R5%|(hy*WNDYzd+CNN)R^Ud; z%ynWkg9Ho@fWQPO6JH_;%L-N)>tSn2{h{-*6m;(DBbl(%!+yC+4EVCC2#Mv2q=7Bc zWiI`Z&Y@TAu22fw$f7x=X(I*A8qESAEE{J?N(BpNXOrKUxV0D_;${EM!gW^uK68{^ zMEhHjCNM<|4tLDIp6wN+W3+`Mx>}P*leWet6Fd#631uiUvNmQS$m3^Xrbw8g>zGTF zMBMSkc{#Bbi9FWI1H>^aY&_Z$mPb+htR}te45*c!!yGO0Rm2A zX25-dfkzAkdyE4r_Pzm_c&7QO#2L{C+yZI9HV~dvVIa{}x#xvC^YyQwTC8SUnbH#) z4gZrf7|{jvFr-a6fCugAK61sF^1+fEU52y4b9`#qm=um;5a;4qV&E)Gr_B^~fSHc- z7wwc#jE~XGF=3yaQ)(GgRZmCA($856BQbUA9u__DT)x^FTzMfCB?FO)yurAz7PT&? zoYt`xoj|Wj;4s>$h^+OE@lC!KC*WF7iV#r28)`*(&$VeshS@>W*x?##m=@wIER@lj zklQCy2ib_}r2#k$p}^%c(CG16zfN}97EZ(D(JZK(cS?&IYV8cTmV?+;67W7oNOz1h z&%SmmXt?}6vF~2gFf==^C{`&St*j)yglW)N6LjtpdO-c4S&iD-Ra)onnqq+w7Bop@ zi*wems-=!(lm*PB0y#d&^28%Hd>Mp7Ds%{=SRH?#dSKXcE)c#0B4NTv_M@yn;iVc| z(6NAZius{{GyDU%t+HTxyutcOqz+Jlgf+>c;xM48#sI7e#rOpT5wjTB*?hr!&{nj~ zgmkPH(I^O{eY%e0J?uFl@Ntt937O3gWmVlo^af66{Xx6kRbx3z((Vus>ku;o70kQE zV~OlzuU>SvAO9hzoe}mdc3N9GPV7LyrfMZT(`dPY0sB}dmN{)eaiKnyj*yW4_+?ny9dkvCr9*ieAIg|Nh(LDZ*KrI^1F_8r z)gtgjP%czUBJzB}iq%Suc6RL|>sC$p&_TV+6IgR7HnYOHSg=&nG#_;hHR+lMVOwvP zVIFT3^I1q&yC)fq1YKBA0arUG(Ws)#&Mwukh` zZqqn_c&ct{gEW z?36xI2}7r`j3`S{FI_!gWM|BNRiR6)m$tR(~}%oYfcdQ7>EHIgU4e>OXu z`JbH4P?LSqPlwe{rDr}QLii${uEoT~Z1r5ayEQiu-rgbAev z571F=Z4V;Mq_Q9XhL$Pah5wjt zR_|=a6VP6cH(4sHK7m9o!M#4Ji@9|WFZW(I#vC_F+h2=!|6J&)o`xGH8DCKuPRv6knJJO~uc0gAsbO96pbfQHODE-(9 zowLr~#qkensE*N|s3+mEl@ZD&f_`*p`wHkb_wMBQ9@~bn(IO*aGoDnv!S%J1_D%+u z&X6%GWWAK1!ac5XrEhx10$?q8aXzTBAgUml+Hze$BZ=fv<)yws@~{y`1r&>1vk3EL3>O9f>jwaVSwLTOeaxnQ_7MycvuN+p%%jDB#tat;GoT zjFxGCmj9|(O(!}ARHiIw%Qo|b;Eaed)o#VO!^$#KfMDVLhNZqcZbyNV&UJ-RK!LC73tti0P12a!OCoY4$AIm3iGwV_zc$OrUZL$}e= zr1tnxOs3~*bY+Ocyu~$QQztdk-BBs)24t{z?#u7QO+h=-peVTHrVtg3IRT2r8N&w_ z=dlqeK-;zLjipVS{MvWfU(7z-Z>I&qs)M9w{KI6b@3d&@6yfLexKuO_qLots35@faa|7vdvBcUoGz?D}URbuzal&PH-6VLNszkbB27=Z^veNQqLP+>)1v*Tt zL2!Pm;;j_iW$98aeX7vw zZ1ZI0tn~mG0Gg$5Ap4q0OrJ&e(QOe5R$(Ha6pvbj%KL&-Z*EeD>yyG*eCBp)pe5|` z2==0|*4&=F;>rM4rUMai5}tz}o&N4eje7Ktus^y^Q|j}`MIU#Fh1 zJf;IAh8aO-GH&2JnHh%!&HevGH|B?Ym0Yd7>95Z3OE7NE_d;7=Bj#I+)r#zqD~!p~ z*A4P4v`6df>2h|_D|wXU7|5{0GBJIU<1NC_eRv7j1KvA4f%~Od?|v0(Bs3^SxkpJV z*nSrd>F8u-1W`As0ycaX6(oxaIcGy_ZsYqb@-eme=N4;Pa!ccTxw0C)#^tx-B)CBw zA&-@<{tq!3D950f*odHmZqP?dC-^JPElJniWE*M+dKgd`mv!XM*8zVthOf)YBN zn2%@LNVH7}FD`^d$_Ge^4nptj%RG15)r0IJTzs+$*>uGsU7ud_JJ^Ba;R!leHHPw2 z*QFpSNJgq`Myh2s#5P3TpRP}i_LJ$=&cDZB)fyvfU2)6%n{aU|jQ*f;*y8JGwM}m! z6@);;KhUWm!Y8X~6dhiH6&6h)zm}nt!B!xHg7dV(jWp)$3;uemY_D7?5>bV#g*O|- zKJp>iXlH2}If`^o7(Y@eCToV$jwC7!!n9MpBM+4_Cd;=or!Zf7`!&n8FBSt*Dd z3}QZYi@Wmdew_UO>lV3IRiWpKPGVF#?0yk($GbrwzJqfaGS?HNdbYbPcYvGgBuUz- z!J6*DWIuU*(Pt=o95o7GZUr0IONPmv*R;{2No0X%i@7TSJ(uA?0|%I`0WtVkdI+j6oMCcD*Qj=?(g=M+y^ZyJctLu?z#8RR?;I zoL^N-Fi}ki07$v4y9j(>VJUf{DVC($vcj(FfVNPX>S#2ey*K zy0WEodHV^3Xe1J51SM6bx?#98I>@UmP5 zUXAHgb_?CO!lFHVmXrujx5p;5uwNkuF6Ov|9)xntpZ#6Ig5>cVe?cSvapM!LOUa$! z=7kJ3*Ad@DUSXIgHT{cN?QFqHY>Z?DkB;O~H(t-)jr@Qt=QG6Ko0?mQMTZ}7I zE!H}Apl#$Ls4Fn4iemlgS9V-OH3Ay5e2Nt)CyeGrQf-bs)KwJ=iXpnXH`5tZ&=df) zP^%VYg%GgR8MrW$5wGQfU`DPPhvao4Ojij+(HFf8P46u$a=won-%a;f)E9SxDb{7! zvJ8Tm7|+@OBxJQrh#_W&_GwKP=rGOI+nd#keV@xo}Wj|=9X_wISVmkFw@cj#e8 zO5&U5WuFfFLPRy?0XDYyWX1wLdXwQo`>YwZTrs!00eGIb^#es3Q7B`)${35ZunU_c zG783eyRs1yQB;v?)Z_gQf)!!+%-0574N#7X{81Jk>BW581Uj7>mys4UBW2}za{ezG zY`|zuf*lo_bEd#9QU_-D!uMt@C6s<|3zB#TP7xbxW~mBHcy?*&AQa^qMVTYPc0z{HbL9^J?QME`Q&LYdDGsFu`&}xFQ1#C8cE#qa|$ao*yE-y9B z#+zk3V$-VZ3bFBLRxUXKhiD6rz;8QqjjpI-r!{jX<*{t&yoRm2LlK+uN@?5{x*U{y z4k?lKT%*iO{XJV-;ao6eFLnk2s6;yuZNvU!14V)i%D`Rb zsUfG^*4dyX8nUJ92qzmPq`-m%;Jr1H8lQk&#ZK!s{%O2v0oiT|~m7wth!HiQy62Ca+xa6t=xY3wNK)JlN@6P;+7P|Phf z{xQs15G4weJbW~6C-dc!qBq^N#1mU?`mR3H%c|OCS_)RBib`4UpmhcXJ?88uKVIMe>AJNaM0>sa9 z2aka@!Hp&-{)870Iz*$%Z;Ww;079I=&J54R`0!|iUgqLgwMF5QSq&riWx_0W!kz}) zULdepN+Y@-Z!o}-GGFS%t9d<1^v#R6n#)m8CV7;NsYI(W!6*{{xF)kgRHt4>8m)|1 zocT~^gV_xv;~ApdtFApTPZ_PGAvwr`b6#a_Lw%7fR!hVgFv@sy72s?1de(#qVh9`0 zZuv{Lujtex@3^YVvTbtx@|u-~C+UuGms(Q0yB$c^n*~rzu#7SO#^q)!@T;M^1%BAj zQhV;Qs93{<;Od&u%ZtibRfE%({ZKr0x&Y3&m4Lnxfw1|c!oUX1=0y&> zSH^*{uX$%Mi!=JwYfrzvjS+F$%@NItIo7fHh&^ow2gKvFM9&i?+f2XF1t(UtRV;N4 zhVXPEBr07q-&rLJ4pYHnjud0aLTA&Mzza z56cgsMEZuIGSi^CcbIU*bA<$DVfIYQL}%dSw6yLr*}^ zl2$^2bi6)z#2S)SMfyY8VwdGGNSH71K4RMmgj_0W=Q>73$C|!Lkq})>RKx@a>@bbQJeZ)#6L`rb9{UF;DAk-H0wmf}ID1W&;S-=~bdpnH3{dg+Zh&l0>MlbkwcZnO zNom_#qQ7aN|G^;3$RX&l*n?;ou#ENoJ-q~EkM+E0NjCjfBY?u@07(VB5*uz|ju(_? zS`?t6C;&7vH_XZ*c2>Wz*KC0e9^K7#vgqM{69_Ps7xz>tsi$52tt^vT3JMIhB_#4b z+7M#fJ2yiC$C^=?jv0nsPpmJ>=wmZ#Q5Oal59;Sm729FE!67;ppt;9$Bn=>1cplmq zZgSI6O>nR|as**M#Ij-`3V@_#-=y59R4E9qY@Fgj?GhB^4I|!5lUcnNbv8}2+q!hO zzTkLP?=oStO;E9tS#y-ik^AzOj|d|d_zjR%lM)7$?4XWT)W~^Y83a`b(g6lzB7iUs zD#y>|cu%QGbID=oZ$ukHEheUMti`!y5+3b65MUhfL_10>lmT`N7NNbuo0maZqO<$$iNAHivY8)W!)=PgiQxWVVBx>BF5#QscO+K_?AGI@eow5 z9Jf_1k9Yu2cV%ZM#0yt@$3ar{7{9* zx(tpF>@!*ho{azU{2WjTLdk59XA7*;paIFL0Hp(BP!`XRg#pv>OgJwXpMaERh3Cn$ z3XoX#d}#8>yRWD?*f#z_mD>^3ob0A8CKiwScX!H9jzGF_rIh#t#n*km#lvVK;a|(A z-D|m#C29~(*%U>+ivqB)G#e&|ez7$rDhd*dgBl14lS#0=97d-wq0>#>vdJ34bc1~< z<{JE<8HT2vX$TL~A8g5r6^*A8PunjlEv6*zs}P0dD}`f1huEq8@LmQIQizR7p!C?J_>(#;FM47Q0pVF10#OUXQa z_bi4Q25{a_s3xA3I56Yc?)=H<#0j3qYNF3O!Hxjdv6b*>VLiT?a0+mthZ0X>Wq`FP zCZvp-ql5Sx9G;;F@Y{*cYI#Spw*7cp=xnOVv~LY%GR{UwN;*iKqQuk?y|~q7)-mvA z&8VDfM%#xfn~jDGH?waHJ=?7YDrhNdF79vP85`st284La6Oa;s{9z#RG4bF1=vxJM zG2=SO>)Remxt|AoOCl-e;PwVE0wRmm^7@L7aHDN-^Ny?x@SMx0qO#}nTO8T#12q-4 zLUox2dDB=r;GpvmLDvq4K9^ySGkl8_K1 zljiuv7?*F02DMA8Ok7wM7FTqw^++$~2BgWWNm_7MPBt?+;`CF|`-WxfjxMTbA1x)? z@Pk<(0+kfJf&Q^U05C0GPD|g?J*Fhe^HHKq0W!%Lo(lXFDGcOX{6vj*D=(LV+ zlv%;9Ib&*S4-&-A;$`DJ9Z?$5hV50Ps7^^5RORh<=i+UYOE*Zz*lRmKe}Hny3R_vo zfy?6|?Ijl_jU>8d>613iRqC~FpYoO$#0mu}#5PeIbl_RIeMavU zRlo;v7V&j<#7@m>zB1#jA8j~7eB==l1-x`NQOnAG@t-K6Qf(?w=QpKs6_$J-ytVRz_Sk>JhX7SLPhd#W54eDox zTf9 zJs_1~E(EzIG;9Iurh!(X13@qF8{RR%^t_*u-8NdtCF;f!pwKqUtoA)0WZ?DMBBk=K zIwU`;GFI4Ly}-b>uu8c=Zk2aVvgoyF8OYGRrIx4QbrwIZxay zsV~QY7-WV6*h+@2t>GGjXPnC)&=3PAS#-Vyn}CiqKz#PuXA<402@DSHTniXYZ$Ahf z`=8KgSky8;zC+>C@H8vIc%41O!lyK}dY+8@TEA+L&(}1dzhsrw>%H_BqF(N*oFsUo zCKLKHK=W(06d+99bqMGri?vqIe>{&4=$cuiYa*CU=E95_n{;h1Iv7yVm>x?8tq#z2 zpcX-=bM^KutbEJ4Z&GV^O%-Oe5itH!4M@;5iN9v<0;#8I(I*TE7^_%u=qE`=p^4qY z(dbXsY4H=bT47*PxWrM#kB8BV+LEleEzF!Gh%F}_T#MaB$QdpJS@cqlST<~{Cjp~j zVN0OIPjpEDn`bIjqf$lu2l%vIIS{6DgtbvlhwiEsGMmBFP$LJT3%6zWjJI_~meTyI zK75p}Di7wf*;OR>HoI9#?I;`<(pE{05{2vTELIb4)-bkw{CmYo^O~~641)zmFsicL zze@3dl+(D_{1Z{^o7rbY86e$ z{39e+Tb)r7DL&6nYI)STMao#}`Gbpz+i9?qgY2QT=>~W3Q#gWc08n!@N3>F(eLFmB zG+p2YBTZ^X6>%J}m%vkUgVQb;Wv5r_rPlq@F}JE>HST&;xOtOAX+w^!$_C*^(~}hx z;I?V=!Er?yNw4{M&>Rco$7s>ui=4Qov4%9xoO5QuwP6}5ZD#1k2HGYhTtlL4LQlaNYK3FKfTms9a>ZHeC1E9&MWYnhe;?>U;}NyS*C+*V?Bh5N>_Ke zcQMB!^->iY8Ge|K;0@eXsIB+icyc+Msrl0(MLc#m}lqE03cUQPwx3(>M6lDv|W z3f+={J0X@H_tPpuD6Ntx5_68g&&OsqGXvDN2 zHMcPw7{w7#OG0Zl!>U9K@re*s30AIZvvrb%V03q zf9~A0uNoD!2xAd3egzw)>^J6douXBEGuC5`ty8=#fI$y5mmQ(#LP}$b03{TcrH1~j zFKQ0hPe#Od+?+h+lMYr0ECoqwFAsFFde9n*>*l3XLe0c-%2Vy!rSm zoRl@)h<`Ms@@&%&a$i7jLyoR0>7Nj}qE7WoSx8gBY6=*F)e50uDIw6GM#X3aaAw!K za3hJIAZevZVM7O@=8ria+zf|0n$%UK#|c9ZQ~?)JOAH@oay+bV+UU{yGm4W`SBllm5C1@+*kl{QU!9=1VvDlf<+?4%_c%IBw2V}2iR~!+MRRP_=!*8 z7lE%E-_4YfKH=00#-Z=%4LVqkBN;MtT1I#xK)BscGn${NP7FHM^o%ROpWRxckO*!T zNdq7f=@EkFgx54hr=!i#Osp&Fkt)%j{A?%DcnkrRaez3{m;m}42dE`RlN0-(+9p76 zfMjDZBOsh?-h1}+LjEyReP86Ey zWjfLJt3Ty@=-KEcV{G=6=OCjuPG-Ya|&3|Rs|)sb58m;R7T#!Y2ZxtLnp+$KR?s6yhbzDBXmo`wLEMGvt7(VH`2>o049p4Q->t`MFlq{gvQw!Fo^`y zAgv6(kv~|J5D|Zh0*-X&8Z3c~Ku~Bp;wZGu1>JcifvJ8q<+`)Wd<}ec!$GwS`s}JW zkZ#;9_>GN?!>JCF+x?ZbWxoDez}T_xA7P>5T%Q;p4*%L|wQm-yDLexM9~{{8?H!$p zwcP@mZ%*Q9<)*T^?4Ggs9OnVGXRiLGLBwQtH8MvHPG@3*h1jU$Y(tK)E7D#Z)$Um&i?kqTI4B<1* zpE${H98^h@4tGE2)4XVJ#}n$mD8?}2W(NtRKH{swkx_Jcjk62Mjs^||8~>|s zpc6RodchU34 z_;z27aJHNQ2`X!h)SyC|+a0zK1w+wGlien0ROcQfBLjc9e=g*rSN=?#8*i>P83!H> z%y^C#OAu!wf`pU{u=vzEy0f*(1Sr@c@t$00Ny;iX}u$ zCVMX<9H`yZqzbl&=q&jK#i%S^fX?8r8szDmm59qvc@Tuvlmm}Smo`m2&*zci!sFOb zR2hvp{oVO+NBmh)0VP4hbYTDURP@C7+PvKcXdDuY$+8#)V$H~0CBMC-b9`M^tXx&| zY9fx(j<{E};QSFT72AYN@xXvz3^y^PK)B@_JAh!taq7e?k)iT$83S(uOTyELv>meo zC7;bF);VG)cFbN)A*f7?3had;C}?4>Gj*-lrq}Z1|!7V2O=!~ih06p zeSs`ayM1sNYa7ESE02%{aZ>I&06n(`ikSo$Mg%EI+ky2CFd>U_xevf#*X}9GSAJ>QiG&%*(fc93*1oKKB=dy{c_ihg*d+%fe#I)U!%ow!qK!^M~Ci<#R4t7`_ z07N9&GJLaiH+<0@UXVw}!>g1dY&_wqCuN&W*>zQjC8QfPw>k=XP?7=Nj${Y3>)d0g zH{KSyHo?bGAa`((@PV7bmK6uXFQ6tJpFYMNMnQC|Pp+QKEE#YdO=)=G4N}KU&v7yi zfdC7l)$IH_?1@h`XT0x{Tnb}wa;R7yWuEdZSq<=-3Nv<8TRe>{!@EPe_5#FE?9_;L z#uS5%E!+K7lv;iQ&wZ^w))IG(I(0CO&V(VNHrL6)$D?UP#I=a^A0g_e}ux`$ zC1{}%Ln5VnEyq?X;|IthVQou`g_dafXGTHOs-;PxTWDzsju}M?DcA7XG(323-@ULz zjL?t?NIn8z*?TODmlrixj4oJlH_Upwj+hd#51Q+zwdH&FKo=9AeE_Z4Vvcs`2ni~s z8cw9_p*rMmerwsaLY{b1>#g{WD#IMo0))sqVZt!_2Fn8%%L9m6?_9lx4|mQ1GP%Ve zhMNo~V>a%O+4{S%cPU&hjdeD4|RWt`$g-b z;6#2+#Gp*C>h%A3a{TUW`13DY0muJWR^ zE6;|kB8SlNl06~Y2`myZFyi$xFG8XMU3I;V{{(=PbVIeULff|R;s3NE+dy@}!wlZAS;1-B8g@a{FMCyR9|DhL@4k>R*@Xu~^|cz8ur~@AVQn z-GqKeoz>rYjTg;T=L7zYL> z-Q{6>b2_+ESKX-@KneE}9b$2W=@w6WJg&@oD}#HFPT5hhhqSWlY3dP#7Q*Z!gJv-c z?=bt`WPc2ZEL1d0IA{#5m50!UcyMfFAClnaTVhzaMft@b6eC}SYZR!n-oCUMnJLb>mn$y0( zn>ue^>uEFQC8wU*)tYp+E?V5WU}md#Nc;R5a~8Pb-m$Hni|2JE3);Jqj@E@8t(~n4 zx@Md@uhlz>Co__+t~0&qtsV2{bav8UGOKmLoYq<1(F3wF#yv40aS9^OhZ$`&y ztqJfavu1SB`I!p^N7A`)#?01aUhC|x#9&x5hfy58m|wG#`K|NSKEr5V+(D^R7k8fN zOel) zT3g$^Pj$3+c8;CZs_v3`a~8Bwf5xn_?F*=6BXmuBhm=QY*q~)__Nn#-3mCd^CY*Lb zf@EQ9YsUc8baxD!lHY47Yx=5!{r+P|=%@?-IWj@B77Pd7-@S+i)k z6LKe1@LD?B+gcYS3+I5bspF2$h+C#dHU{uI!&UQI=C#jkgPbgp3P<+$EiUL(RiSTS4;B8K1&bJNztFyz#@lDk zT-@P(x@!g#(9N-#?Ms+EnqkvBK!5w<&IB5_YO)NPSuHnHKG1j$;fytaW?IAYM_ z&czFn214nl4FuPSD)hfOYS6Dr_1QD#ONI z{^j2Tr~l66%K}$#pg5Uvsv8%CK6UZz*|39?rTqlYMvSPL=|omP76euQ!%xjvV54kZ zz%-eSd`%pNlg`r@cbS;#*9tS{!Cte@6p1n~^o3^>52xl>d;ws_Fyb+T3>U$Kk$VRMq2OLSWWUb9;MFSKaKjghz$X_(OBM zdEcxW;;+RWGO=n_&=YJAJ{SI;lb=5i9?bXUf1Q6m*rV#u;2dvdFfVM+{n`6#I3oX) z_jEX|>bT%6|Lfu1InO)B+b#IM_q}kwx7|M{H!lB1Zlc%fPxi0z?x?!n?+iZed+7rs zqPhmky8p&uF1$1%s`>=mNT11h={qB$U>%>A?#>V<=TFHm$j_+qyr28!3O}j(L)9Bq zdlWudm|8fwpr`Mw+`IL#-A-$EB_@8#^WJ=?F&BiEg_%Pwb^T)hWc`aY?8|5X~Zb>;TE?|Ha%+u!PbRo%9s z^w9LlkKT04s?zEMkGg8xuZ}Ny>FpzRnG+)H9>|3kP5MN?++0v(Jmac=DQ_b5<;PX}1^pO1u93v`-xS=tWIk=j`^_rl4B>jk2v(leWfcN`}j#OUc07g)nD)b z>A^qfE6qP^)#tu*<=2{qUGT=d6K?A(z18>jr6X^cIJoIs zzj$oFSFY_VMGMwkFd>}VGwQK-Zk~NrUuo#w<34)qXa1w-n3IM-;$PNRI{uGGUDVe- zz2~8Q=WV(B!oJe`{`SP3d;a7rJ=@0K@ZBp{_LXiv{@?%b!eiY{$6WmF2QL3&Uunu^ z-~Qunqq=*}I%ZkZ=8nG7LHj*-{Hq_lr00)czG&hbbNfp7e0tZ?MHhUjY4L;YFP}8C zuk_)UcUf}vQ(x_Q{NHn{x1H2iI%V8}2fy~pl}$I^dHTNR9oJX-`owb|T>1M;dOq;f zTgB-|_LaVT?{^MK+b?YTYP5Cc&H+}V)WnYMO0i{`wc*zWA$6 z6Hi^d;ENM^Kc(w0BThcAsq~#&j(&LGzS3WQ|G~@mKCHXx*`>d2J#_EB(#h3}N@s2U zYR}m-|NHshjOi=wdsEH)=U-dd^!#%l{O_;t0sil4A9+>7K|O1pdis$SBl=3W*4A~b zJm5=BQTXC_&KcfUy5zx!FSxXRLDOf(9el&hb$zAVZ`yR^;v-iz?RLk$weM8*m8NxV z_^sb^ZqvR`PJ3&i-&Z>P^~XN<$!9NV+Wx*-w^YB?Tgshu@uco+&+Ym1HJ5(=zQ6aD zPM?0nLw`E_(w+xzIPie=f9@?^JocDTuNSW9nf+vb{&!#LEj_yb+Jj&E#iE|quKC@B zU;nbu`d#lG`$BJN{YG(Hsb=<9oBqxFz@O5e_Lj~Jzxnj@4=reVr0IvZee3?-()i)S zN*8axtm(POe)Z}{@9iyZy7`OWe|XK3rjLAd|0kZlr?>QlZO6TQ_XjR(8uIMhSKQLW zc&=UKO;~$L&-#77zT}oWdrMQVz3iEXo;$CnW%kd%_4Mt%rO!_scK7|yozb)M=&yff z?^}CIfB*NhUYR`n+@4{Ve(tB&{U`N*_4bJTCoXGx`XjgPf7s2vrTkSFj=SUXvzp%i z@z)+7zOlDdbKL0PK0k9!(_Y6-dA4v_yUA5UnyWAcd?e)xvo(kHge+WWuu zTiZ0HVdHM?>w8PrEV*LF;V)j)Q}fJ{JD>k{Z|V9Y`zGD@@r!!SIsU*+%dhJ#efJN0 zUvS2!SNA0MJ~UzSwY{YiPWa3j&pv!v&xeY~ublX;-qNhymv`S7|65b%4bvV!{+qp} z#^TBM^nLHLo}W!xG5Z_qdP^(soN(U8;d6WLc{*A=oZr1S%-`I1+RUDDBU_tpxu&;t z%=z1nJLsA2p4DrQd1D#Be}3?1m(Tj(89iN}f90jc{NA+eOIr@_J-4Up>~BxGlHV8p z*YSJoxBIz0KRK=CGcWV|vBzspe(>rwO{LF0ck~?E|G>A8yz`m;&gwbOf4Q?Bc-pp{ zcHG;qtZmxwhvWS}@%#9Bzr5-Bms^`oJ?iKC{}uRKe*V32_kHvHp5Y@8KJFuocftXa z{(SqK%X)Twc-j>gfR8=4?|$Iwle>F1{&>&HBf-~#f9rU1`r~VR{&eXfS3PxoZ^^rG z=t-w-T+?*L>yXd?^~63ccJI1gZ5be!J5l@?%)2E=p^X9*BpKUte zj^5IVcdl9b#-8(fh8_FBgNNMJTe|U$zZF0AsY`pNANAZdEAQ?t9dYsOU(NgJIX!n3 ze!B3_TY5_$dH5@PzjgDXrZul#yYeerdrRN%tbP6ykIrw}bI%ucpZP#w!C@O@@>W>>Zh*tmkR zS=-2xjbux5FTz?$D_fvqtGHlbQMHBDtYXWQ&|7FWB@iG42uUCbB?$>hE(u^Dfdmpd zDTGi$3jx!Mo8I4Z&dlygwoLB*?)!cJd^?(%)9Z7d^RzR1|NSMuy6dHte|fm({#~Oh zesSx^?=Q*!?0b0!-?sJsg=^lptn*98|EfFZfAYfm`!VG5!0XpnZ+PwfZTBA= zye0b{cgK<^{~jCqVqf>-XC69k>qPL)kFL9N=dNFGyMM^U7uRkFAN_RL-Pw1wbuGTJ z^8CNwa2WV-&$my=ef{#qr#{se`(c>$Ylb|1#VhA6KJMvNGd@h;v1Hxh<@4`;vVQT; z-U?pbI&;U8^@m;AlDT2s;^wV8UJB3KvE-SbJ#p^1ub*}Q&WBH|Nd>>Q@9bN0;+zVa1Lm-w)+|@BHs{FTU`$T`!GWy<^EClk>wj zZ9C`w>&|_A%i7oVT|x4@gtJC+=`!TQmfh373k`CjYeNnJaZ9C^&W zp-Io5bARlH(`H?J`i>=!AGCDQFQ;F8|Fl~^9aVh6jwR1twD4r-=iQ4xTXM-;Gq&zn zva$19EB^iHxr@&&{oSq=*Y8;J!M10wIP~)??*Hr7+it!4Ht>J$3YlTz7fa zvb%RINeTZTa{t4ZFHS$c_Wkj{+OZ_}-8&w>`sni(U;C>K^NxOW$CCHYe>&%mhOaNq zkG8Gd#D4qU>x=&Rt9h5-Kk7F(-nr**>_<;-D_eB&=EZ;Bdehkty|rV>#ZR0ZdC09= z{Nctcj^6(94%zspryl-+M=*Thy_E_+^{2vj_mm#PKarcB`urnSe&83cEtxfA_S_lS z>a;UdTGx!UQ`IS5?QJo{86v+xBGTN}jH9;6bHK;9M0}5CUWHJMb-^|^#u5y!CdUq5&_$kB$sGHvLH-Zdl>mcd%duMX+2sV1KSsuUM!2O zEGb_au5YP@mlqjFEgVH#R_!`S=XH_?$qhmdUuvNR9EI&2TU3>Pt`wH3vwe%wly67N z7Nyh2L{g!8+FF`7G~zIwn4H!%S<}0SP2jE}x~Z=bGQGLAwsVWn#|j?4v3XsacI$Cm z*V*3F5v%R&tlgpqwk|d>q+g_$u&1RNik>VzZOy%^Yhz1ucVn!xQMmfpMriuRCW1># zj*E(ve)X1xAeXYEZ3&4$3;wot> zC!e_58YQcdlx=Fp1FJ8f*4p0C+_WW}CQNm`hJPDQS!f7onJu0m}tw$BdVN$rXa7Q;Hn+}=nJR;L(Oh0uY?~0}- z5nBPQ9zb{2wjpRp>zOfw*k(^o)*-@&ww~5HMu6Z1w67ztjwCb}j*wpD-kO?B8k+#Z$Z1N>Al7T^A->3x=EIO7p z9C9~;FhmDP5IW1nxl%uy+YAh|e4E=k5T*#CiTRQhK?W`Bk@ESo-vEgE(<+N}At)f+ zPFhIULV0v; z?DWS>MovvWVP;)Z8xD)Nny2*?;F|yQH=mqR9mn_H=f&cP^7MJ8D^2h|Nl>s!Pf#HNI zfKF|FH-aj`^>J}5@M*-d%S*I;9BAI$+%4k!Hl*OE;$;Vw;ypRteiN71l$P!<9XNIQ zx_TPc(AZQfDh4F$i1}H59`0J3)^(z+Kk2z1qFNG{(c*%}5?uR3ce-`5Gy3U~dg{W} zvf3743QPjDGy?(hkZq!nF5;}ELt9ui0J3l1Is9ex%9T|IC|?ci-%WxxVamFQS-X>!1?;-rtV7ZTp#zBqR;TqtOAG| zJ<#_Zbun>?oKs7^&7f)gLt+_EiB9VbS5y{7E5ikA!eF0P^acCCk~iFO#1+r1hYLjQ zuVO)0P%G^nqPB?X2%}SB8yE3%Tq>)<3Pjle3INN=z;`zDDrdOcnh@lBT`^Qbd!5M4 z`VkIEL9rxvU9u+zChY`hy^OxEs;ABbw@C9i5wZKf?_n%)T! zoYF&7iknadc;o;J-A6QDmb5OCw;{#VY1^S=_LnrV^){gX=x&_pkwt98omu|A7H-fQ z!!YpC40e-&*IJP-=tY0$?w>ur2eNLA9(3?BpqiNR##j&I*&vDymSPJq%ygm$m7n76 zZ`?vlhP!;MAI=I_ttd@ukpN0u2<}mOofO9g{NKza=o*R;@NesqjzbmwCzY*?6xP&~ z9XM%kC3D^0+9rbf+Ip>_?TwgsVhMnyP-b;8;4u#zyOhvECFMoY)zKosK^{8vu)4og zXlTvyBB83;%Zj3LL&OG6|hUtl!xL?hR6DrcBb3|+#cacy-hZ0C>S3d)7-V5 zme$qQZ|Lce8ENl=s9Da_!_hH=q`MNkzBlAasE@J?FA}F;QM;FvR#b10MCf(W)dWYCkQM!2q9%(jVql_STq~8pzb4 zC2g;5hK1Rta%o_`>z=D3S|=LDnP`g%}3T z2pmAbLZ%2C1I@ux7#+QHbvH9qnkfjcS{AK@e$?^>HmLPb-0ToCE-}3jRFm+u{X!Cm zR3kX7G3cb&Ol;9QV__iT+bgTN9sV5cYdnn}?KqCChtq@)@|U=9YKB4frqaiy`$^Y- z&Y_^gmC@>&%5o8y_;|)w>q@x;(tBfg3KTgoE^Rcu6yVG9-LkLCh6o)k=(-NJ%Wqhu zrn&;Mx-wc8EwAoJ08rPelImp@HPzwDid7{=ehvyw0?bVaE(GC#)_hV<_J>4pS5KWt zYmhDYgCOucaOFy~;^=9h^iIBf-w@XC_P>Y7NY zCkgVJ*050GyQmE@qx>mt8UP_u*r;3AT(y-h_sAtf!2nN_I zI@?>N9sBknv1t2E3ku0*lV%(O5j_{sSO_sKJs^P z5TI`w!zL~qjMU}j)_6P4b!*s6L~6z<+)!t5IN|-e+azp{*WXpF0d1f`qU2fi0iUTc zfJJ;9K#ce_0U_}eY@sxgcKZyDFQX01M#L7#EbC>RR;4#;VAoqJiTHhr@EQikYqM23~P}CH568?WW{Jehjf)XlbJ>j6lAGYNnA}8;^1i6@^C>`b!9XfF0QDQ z;H<20b!Ev?Sts~#EvwGbbA#`gCE-YUk%Xt6Dl1J!*O1Q4moEtg%&^2V=wDD9bb-G@ zg?H-_%Sj)d$Md(Cl>U;|+q=%|hnSs12l;RS6n8c^2x!Q%+fM@FV1$|NS5Ta#=@$y= zqW!HCZkrGbwy?RH@dWV4bmluxCnSa8(>pB~X;okY}_8Y-&*1pbna=i_&qT z-)O@|XJBOVj3RhOw%)c*=ki8HOM=1z+(JI-n6hI%grPq=CA>fl{45;3dVQRrNeIw%ee+CWlv z2ALZj@>Nv3~_i3{kMj>hY!N9_qi5^E(75nhnzs}zx|(Ilwi4O-AonusR~ zH|vEt_7@wwP~4(hi}$6#?oPm5ie6c4-cbn7@M-B3FhygNEU>-7W zY6}3a3K8CQims^w5NOiQ<$DIAxp4JXEv!|iRo#spDza{!ehX^T4$U*7Le-w$s+L9)wf3~3yw%WC zqg}1yZN=!@3oYaA0Y26cs5O|2SXzfBH5T#~grt^Yw#{PK4_I)mlWhTl>U%J=MPm=k z=nIF~0(-%N?cG8V%e|Nh zcv7%-R*X9oLF2mSHWUDz-E9DZbVkdfg>29U4_G9(^yq^xxHW3r?F-4dd?97QQeJDOIgUti^dFm7dm>9v6Egf{Q&doR2#6 zvLJi1tXQ@%4~fJD$bNbw0boDC%DF{vriRzqZ=QsZM>tyn18u*S5@28*u4d*;ig7f^MBs2rqXZ?XDb0o+8K-t!Y)V^brR1D@>8&us{1KhT)#Cm9$FAhf|E zzMdFHNmLVZ&`Q)@ZCL~5s6NEV=2R3dj?|P^3v*r@-Y20Ls+a}SUzeNAL+&p=u5l9a zq+gw}da0_es6^4={Oa3=+~@uZCK=guW`rvY7~B(<1Mv_ZDHS0#e#kuizkq+_cM(3);ETi>hKZ7jW=`V=!uca|7pYXhJP@ zaYlicsEVrqd9_kh(j`QKZ#~QkJ{*W_RS7{WHQt5nYDHY!*vn3&I$BlI^y$^5W@6Se zvj>2Oo|2O!C9SQh6X0r9E&3_4IFathy4JUXld|Mh87ZlXdbnmE$$v71k)>5uwXJfb zXC2D}YYKTbq0nzp&F$C{s9tEE#zL%LI@?AXn0!YDewE$+_Vl1VaoAgV! zSi9or82$t;vOen~B4{}YBxX`r(=-`JNtgD^E>h8{oucZ;!b4I~2MkPYlQPho}@i(?J{Jlx28?M z3$;Cm=V1dek)@KvL}{lGiP}*uTe1l%6w?zSW`)z#L7My$aj8)St0cv?7s6qx`VF3& zLuQ_#1H(vl(8Bs%jV#l+R+^V4&7|1E4Wj;R?rP>G&yHrryQ^9J5`b5H%}h`CdesVq ztT#GiZ5SA9X>40Z2rz`y+V_C&#Cpyg4DgUds}*dhX0 zzRyVFOgH2VrmEevPPIWo`w3uMbXzs?1Pv}n1Ua>s%>A;v8qB5T0b*9lit)HBaaFNw zB@3`CZ(nFZv0AsnQmJccuhV5??dAo?kURo^TAy6mxK2d5b9qk6o{=+0-ui`gXIpoZ zl0j*2Vn!O|W$gNZR1pYxEt3t3wa}!pN_e!f#+vbSvj-}DU=_8d%FfB1HG9t7dGi<4 z*40D!fFZ@QFne}G7FLwz5f;}%?=g4AEKG70f!!Be1Tv9a}|j6@o# z4GH{&U^K14gEJm9sUQ;+N|cVMu2GeARm%%70>D&56M8_+f%V_}Dx<|H;>rurDte$G zG!m7xWogO2XU=3q`GRv+iqVt-J8d(oIs|U$`6~UAO~|;g*fGL*;Rk!fj9FVxD6Hm+ zj0+&x#0pRVjIk38IJut$KrIX~eAu_7feqaWWdrL>J-|Ff)iu zL<EY$Io<6obRC;uoxthZpsOFeC5%*bYAwmaR$fRAPR43^QIc0knuhjn zsoFlgOTH9Qza^&CqehwRZ*8WpUYL(cHOlZ6 z`oaNt-&rt)^;5z#N~k%|W0|;w(U%z+y)^o<(*1211#v zDDCuxSgJxI;MaM2n>SpT=aJpp`1H8fdE;*0j606kdTXN7ZS zEzF&>Fn3;f!QA=T4Tn z>*mg#KdW)poVvQY1rRfJO*sps(E5eB+48Q_Z=t8e55ZEuxj~iHZfLAT?AqCY47{tm ztpSHVWy7)a_68AGF?49d<$QX1dv~#RfaHv*7N`&%90VR89Dp$ZMTs;q!V62E_-X+t zwW5;+_Q$4^C!&>;Nls^VQj6Yi#AFdvV(}@o93V?j8)LSNue1kb@Anm zn~g)7XX#n(o+$pWE7M3Qnzwl$-wBeS1E;~x=n?I%vQSM(!>M8s@N zB@|9^g2^|V2}=j!;v?m86yB#67;V95@MBVn@M7MVXpkWL#|MZoR+h5Cr=2QP1dOw1 zg_{&5eMO(biLIn)U4fzQ8WLu1VtdgQHuRewVK#jM!Ofmoh#|e=lOg*s`-W%htvrjR|M5Tsat@sV%j9QO7lW?KX$9Tc>`y8Jl5i41(brvk(bQp<43iQO;zC=Q=0 z@?;dPGD2h#kuFjI641+pp|z*LQ`iSYOO}@F!yEg?#>*rxWwBq$2PWd7`w21~NksTd z$LKRzGVgq6{`#ZX%4wDbp6fvj5ga> z_Vl#H$&~$$F{n=)+OjX0!vHX|LPifb_R@vuT?<^PPnay(W|PB`N5m(weF8TzTt*A3 zEk!)hGjt}5nS3cE4$z*yj(O`yA{e}rN=VM+<1{Q&aiO=XZBV_kZ+r3DDSVc82$RcE z!CCT1@VB|*P3C@88bR>6S-Cm2+zrC_X60t%&i2ARw~rfV}E%ODUI>h*xJ zT8v=5c`{BuJ>*YGoe@BWm*i-3i{my{W% z4TO4?fxns?{=*tH1buZS*@IRQH#+mdEYALjsi^3^=xHL6_bn@t{j;YaRE?)WplrSp zleFAG7-6lvk#)C@{e!Zo$LI1i;jS?~9GOt`EMNaiR+5xMFO3|FYVH=GrY@t)<4BluTaIxWoZRA6yKykPp%%%N%it7o61eEYWBC9a1Ib88c?gm=;E; zAbLXInp#+S>h7O5t*ew%Y2m7x0*-+aINV#PBhBe!N}^jh&8oCln*8Z5vO*D zJWxACkZnTXWlS0>_go?tHDMwe)hBTz}fZK zf+3@nY3b;i8MlIoAMNRyK{6s>c{hUeT3UM3>QPWridu*GQ=vR<7dfahnh)*dYj$-; z?1$c^wV_T$s;eV~%fjH1NEKV0=&@r2SGI31LNww@AGFg$d9n~=W;5}Tujdnao9s<~ zEV8dIC_CQ^6CfWN^vrQYP14m^1*O+o>zBixqR-HZbxTQgG^S$OTs$VkgQ(k(QUI;O zxvgbjvb#=Hb%3Bzs>zXIXupAnFpVXnS}XPuC#tplsnTe1byitL(rUxXv1~cqUr|^u zJ{2inlOPx4WI%#$5{-tmLfGmgB1`qRfQJmxQYg>lNjFmt&Fo_^oJt?N^ZJ{3CM6gUk=1%iTK3%4 z3)s$A8*}kwV{p`V(N%`WG3*GamoG&&wm<}mWDRmtth6~-Q(0B5q{%9}x-h!DTFH=z z@U^sB^LX-NJM}cCs-moLPQ0B&1nlSgS?&~)g_TA@0@$>1bI<_*l?VPju{1k;*(i)&D(lZI47C!xSDUhdZYu%k01ZL(O zZ8Vk{{qvX{)24aV%TlAXKEmaD4r z+H$o*9&t`oXIAAE;Ygt0Nmc=31J|5h(cei>(eel% zZ;2J?)eGF0l@!KSRkHVb;O5Q0O6y_mtn!cf6_!RIO&RObXoPopMWMV3qQcIb@hplK zmR7G>E^*~ijohP3Bx9vf{!bJ&s+_qzG;Xh27Qs>_RtOcMQ!X_rd9fzUDoi?3ps1=a zQX~Zw&;mJ4rYhu?ZK5bDmPai6A`m~W>X@8fD8>Q_^c5*mRcio>GH?|}Nrg&~l`1GG zkUce~gCZ)QN*5YAQk)II7EHb~gJQ{3FZ(!_9RpetOVuo`aO_$_=DZ~$NrDqwq83B3 zb{?a$j*(j}HZT+}DJ#P?iZ(7{0!@yH+^+_SpNh|8Q#^jGOSDU@+Pvz()Ym$vaB=H8jjAHKP?*^XAS?XeM;xxpU^snk%*E=qIv$ z)iEbQ#KcJleFngM7DpIy$u>t7mqwOWCFz>k>a{9Ci=)NL$s^JF^Se27e9ByGOJ=K% z+3`+rJUSX5knM+cwd>4m^iFlhu7ptl$u8wJ%EiVUkL~{AFR0n^# z@cM1?sO9M+)T%Y*h07`{$}4KB@`!_H%FCMtFd0{_9w|Rc``VkNUk zWYzdus0?46l$kT_m~4NfD8UR+KWahqX@is}EnR$!zubL_Bwer2LF)1+t1Mc^anfq0 zHCq*}kf$t%RTY)TMJr>~%LHrdC~srkCqhz3S1+#=)L*^K%U)I%VM=7(QK*+QIm|0J zQY;A;Ioa822?)fCEUhUkrxg5tqfGg_rHDI|A_Vk==g~(qmqUP5Q;}DYM}B)f z*1;N0nQ8=Uqt2{`;4F`oM$4BnDzwAPyRxVt8mm~Im#c&PP%oJjWq!KBkg$FMNijw* zhY5-KPQCC9a1u!vL_WBNs(~*Qv1e*y&v5pPY%Off;j@D>Mxc($JS;@o*3s)3Txupt zoBEl^)tY8DHOy2jO;tXFe;Ser_t3SWxuXl-d%7qa%tuD1tFBY?)@EldIB~klfV$Lb zrL44`X(~flHSLlws`I@zL|h%Hd%MjC`}k~ITtb(Zk=Bz*9uYD6Zm7g0lYJ6Q6MaUl zKHY6BocRb(fTT5orz-o&)a-@i<_zuw?AyM;#9p##dH@8+zL zwtv-M>?66>fotI@r;rr#2|10FMAOE(OOGnm(VTV0Fk3tOH8lzId1_~kY%*E7(|n2| zdGYT<@Owx`R79TPG{SK$EY3s@;ZyNubBaWOA&ml`Sq)jD`R& z5!gx!;gT|CulE?2OaVgA&3X}Lg2Ap|GOZsOI@pGiv=>1o^BK6o_8WNVjPy+~^XZxC zaqc_-eSs`me70kXITctADY+*53C9ULtPUs=wDq9JxDfBLm8Gm z&9E(S8k!S{FTNyhBt8%ZvXM|2=~R0E)ssN5-gNj(oS)odeh zzyJS9qx|ughRL^(r1nYdCf1 z3M%+^mx(bXoBr;mXPJ?%*M2!>Jn`cXUQvP%r+bz%&29TFQwBT?F4rdtMD5|xyA-Nd zR=)=LqOJY5L6)9jMm)_>QhQ|Fk%4$TNm9gsKC_SR8!6i!ZQpO)z#je&0K@-ivyXhH zCDvK^tL9S!s36WnLQhie*%LuM_)Yq6VE%ZM(j^o4jw=4wn`My839&SFln0h^JG+7Y z8M4lN*iD8AnNy9d^g`6BBJj{_km4sok~JuCNXya*(94_8hKMnZ&fd`8gXY8t=^6$I z@kH21J7^7`Lz*lfq>P`%_YAc?(X1xryi{rRB41G%`st|!p-cGFAp_6%VY$Qyi&+QB z={@crPM|%!PX?XP7%U)U+<&xJuSWyyKMgG+zb?(gf7%nLbhMC0=!)b|jG6S_=ds0p zFX=yN>GL@K?AlD~{&dxT5_qlkAi37i?{U6HmYk;OHAXc>`U)VO$jD^-DbqBT5nB-~ zJAI+8uUgV40O`D$J1?_eV81~5Pf_*l>)JRY!xkg|8O}?6!sNK-Dv_ajGELZD1|num zRvc~Iz-QdU2dsCLQw9|Z3h3K#tyiYkGSOc8f&~9<1PV&mgutW{J&Wix!hBOoe{>vM@J1BDJ;-yl9cow( zCTe@sfiVlis+hF$DRP_xvuPV0&Y|;FI%4?*ipmTtL5E?LALjpe@>7{Zd5jp&TTP!n zT|hN1YG8d4G*m?%++n5OXEhA9hAY*j99OAz$_h+Wrz(g4khM`cL*yTDIYX7&tek_D zs#hvSsdjE<_Y76!>g678t>&qmCS~zIwHlRWPgGH!2dkx&cCc#J<+qVSsWhed4_h6> z)j`UtRw`AgDy4=g)j8BU#QfJRm2~tjQcws5k`U{ANAa?Hv(@Ts6*=oeD|KrCWsOjo zvvRZa=kGUAbHH(fp_Cy*Q->XN@FBxT96EB;=rLo*9d`KmBPL8dGCXPWl%vw7re{o> zespHmjG2kz7cN?ycg&J}Q_H&b&8KW=X~j%-V`o=)&!)}2TTWej!iguvP98k|wA0V{ z+L>paea^Y(oqxfF7hU}IOD?_a@+-D(yYi~5uldHc*M0N)8*cp8P2axxmRrAb+jqbB z{oC*O!4H3Q=UsQ-^W&fV^xmKS{JvlO@>lFxo_O+) ze|qZaXP$lT`4?XN^I!h@x0n9@@;_dA^|jak`No@Xz5UL=-u?G`@9+5F!;e1xXCswL!$xlV@!Tkn~v(V7-@P5PMKQCaY{@MHaNuK<(fLDH# z_w&;QscsS*h2%SVo(#1siRfs7DL=$i30BVl<7ebt$6n(g>7<*g^2s z;79?=JyCavE~!|QaKL@EvQoS#*H#yn))=-8Yp2Rc<(iTz!J$==l~FBYHg+*3*mG1= zO9Y~1ZK1;l9;%G8+#LS{Z^_|!DNYPRR%5tWrA>hdMu%Bk4C`4e9Rcp7bVzXvdsm0{gITbospHC5~< z<$6!?3=K3Rr7b*Ark6$8@%Zdx#5+3K&mxSbR?}3}07mocn|T*jR#a8_&8{vf!&E6! z7XOAuaim17rHm{fO4|#g+J-9rX$>Kki)Fe{CYPX+<0JQ;u@ghaoQe+I{|>CSlkyD% z(4JS-loyEMTeL`euRF^;`8v^{o1{`kQ)Ly{7)HcBoIdzEHbW zz#3v5VvXh+ZyjNUt#s>XE7zKD6rU&()_vA5t^2J0OXThCZ8ST9+xS^u(j=&R34;a^W4Vvn-N^KZPT*;#hB zJ;$DBFR}~m61&u{v5&XwxSH&CyW8GkpJ|_CpKo7ef8D;qzKVY$`QaWb^(reAa-ASJ zFc=C1gP~9$#SXfT6Bz1*fD)os)bAIyX!Dmthq>fttF#iD* z&)WeNIqw`h^%`5+cRlwF+&6N6i~A<-Z*$+weGB)k+~488jr+UY-{by1_wC%WW&VKs zhul)ucJBR^MaAk7?nk+k%fh?gvS>J~YyV~aj_}90ALss0%93{dp8F5nPjElU{YUOU zaX-cVG`IYoF)vnhE8_w?^@8B|uU!k8@LvP3ClXsp{TWIHTlymX~(vauDTBVMnk5S@Q z5T4C_QjJn~E+uV*evP4g?h5W79HZ11W0iV|d?!=><)fkC=~EYDJBD&!C4D~m$1x5y z^!X>Gzmhb6q<#01?sLj~kNYyp2-DAJDCc0(?xiia(ccpK(nLMaGe^sa+lv1I!dEd* zP2~TGuoCiK#r*z=dVWhCpE5?XX#12R>L{gsggr@lpHjxpsiTT~>qvV#W&8y9aN2o! zjZznIKTN#CJdERANL(5B7ScJi`%c2XB;QH2=Lzb)QpS-oKV~f7ChuoyluuvIq&+W_ zu3|Rjk?(5S`w(Mu6X|at?jhPTgtlP^qyk^WP{7Lh*8UBSI|5eSC36RGcM z-1ie^Q4Y3d>K)qLMcY0)LaD{LbGWB+-$Y$w8QbNApTr#Qq@A~s{<>la(o5~s+)*bo zaNKjbKVGTy&w>Q7Sv%0^Y#YNhu`a&h!-q>m)N{W|-?IjRkPjY1+Oi39s zWa!Y;)M3L8I_Tho4>@G`@DU>pJ#^&AQKLqW9y4a_*m2_yJM8eo$B#eahzS!WPCW9+ zaCp+B$&;r{IqImiw5e0m(=#%rO`AUb=%X_;v$AH)m^m{$J10jBI%dzFGiUDHdGqGa zU$9_!zMZckA6#aq&iQB+9j5(%<=uReQj>6N6c9A6dy0WLcOm`bo}|KRqB=qy4yw5v z4Asei9tVItm=6%*9?Rffo=0{opj;JXXN$Z|I+&Em*;m-9=UMKsLk=B1Zv2#~Sq!CO zqv7l#n~ZEwe9Dj~=bG_#s2u&w)lX)c5ayq!WRrBQdW&jfQ=`@7k~rDAI0>)A_yiYk zvo%Sql*>PIA}t?d+Pc+FecJj3W&H|>`&u05wIc_$jwes0tZ}d z%5oEAg9s;v^QH9RDt~JHm#+@Z&mS(~`3i?57Uy!6?>H)ddA^jO!*~XVD~CyWZ=0Pu zG=KQ=e2TIUJyb<5x{^)#EmFPB{fO4uq-QEK@coZ8&+oN*Rz65`6hLwfEjyi-9kTIg z$IGj#C~SDGP;BP+9lx-A<39r|LgkUCB=gNvP04=lOTBLSx!Wmh#PIP!uPk*F<9;aJ z+WHN~y&>#1%j@-M#(gAY(>+AaoiIKJBcn~` z;LXcesN0y{Yw_Ggo#VDrC!R647W+dZv?Dm0l!p^}kEFbmu8k+#gLvG@5q4X;DY>qv z@(II-_;slWaT6y|ndJJum+P$S@XRCTNFZPnZ7G>d0_d zHsX0BL#b)haSxuf-`AL?pXIe?g4cAv++Q<-(^)m7z0iIN4~$%V;(z63rcMo2g0ucS z2NcQjDhFb|JC_}czSna1E&&CwnzM_Q!q8lOM*NP5Qm?Zv-&h27L0Nv>hs50q_I-IG zlp1CD`A!FfSCal-CQH(uKt3t!AJtG5l%FzHsjm}%@mQs1;~zr)0AbQ5N&hzWT}+;* zNh59iKJ5`4`%m6}nu|$y!)V$=eh1upALIDOkx-T79m1Fg;Lai++-Rp>ZC9UgL1ps< zHfL3{OwF0H@(?w>cJ7)BM=Eux$~aq%*#IZ5PFt?ZgP5{jr7r5C73%nLYJ?hJJoa#R z@#Sr&s*<%!x8?O7%Z`&e4Z$qb=+O4=GY-x@ojv2wEnDZGbIIzew25C+s%6%>XDQ(B zJXJR}U5(1>IT608`D(@rm(blx#bX4;YOOda?2;hVmldhX3@&l)}Y=-kSKENC$@^|eECj#@l4ZBs)-&FbmZ-z%wFdHJTR58Za` ziQoOkreUSW9e=^r@`~H?Cg)#xs)}6mZ98?gqmEYUlur6%D|H30g9N@VL*6`_DHx`Z zL3~}E4|ubX%Oq-%nyDhsl2s@lepd$6LS+F@h$H29ChT8+0dvA{h8oV+e(ueX04w;+ z+UQWBsyKO*Qp{9+rkbZpRV+Md!C^3)Y87Bkx*ysTj_`h=&=LIY^9vo4;yPo-rHnXq z^r*3^hYx4Z^nUKhVFw=+G-6LfP9;CtL5EP7ost}wW|mQf}#vuE#Kvh3N5NA>Of za@VfU;Jp-KyZ5TkclYh#uWxVP=b!EF+qJ8&4+@L|C~L3UweyReJ4r~byGXKU_uk#) zq(XdBv@S+b8Hw=j{(RS$dv<;Kh1&bc=exe3QniPiQ?fybZx8#pl#$?yd-7;2q7%tk*&07Y6_UQp)aOf2Q(q6)(UJ8%_ zmjwDPZk!SdO75dsv{nYq{6e#XFSrF(fprC9zI1ny`wjP~kX%Lf6@-~flD?p#j)@uU zd5Uw2(`vO^^VAsYUh8q23sHw$84%UB)oeYFcxL&SAo%s*U@iFH3%?j~Y4UY4g3>G0-|1DW^NAyUt56l{aoDdaD0{iW)~yJf zPD(i`B4Xg~D>fWKRYaDYO=N^aTG|#=p z`lAy-277n#?qFIdjrY%j_XQV*riF^U>+WD_=n2B^3qGO4p9oIFFQHEdXOX@%6w^=R z8WNIgNvMS@hRfAH341lz8=A@`sf$C!p(?IJLt{f%<39w~gwT8*xz*z5B|VCD)_E@ zwY%G$A3QPmfqPPLUGPl=$zKaz5X(8r;NL!X2`4Sg2+BJ@b;h0y1r+e2T5c82~G zdMmU$v@3LGNTnd7PuYu9-A(y*=n9c4q}&zi3muelO=wt(lM+k`r3_7ZHuO^H#ZYR> zKSF;F9h@>Y<*<~)Q^uu?PZ^Q&gV2vcN2Ux*nVfP|N?J;K%G8u;DH$n8r(~tfN|})| zGbKAECuMfZoRqmKe+)esdMNZ%XkJQgN?uAdWjU1Sb~Oss!x-z&xV9s(l&4&;=%AF9QcJh#WwjbV?7$i4&S+(URDcgV7>fOX*VOe-f?d}tQZr&*n%HXuA` zMZh4!ij8dLzd{XjKZ=;&s0Y+sYlq6Sj@>OO}s_emt~ zgOzvS)<~a3ps@)Bk+@GqNpw0Yr0JIFleF$U`ga-q^G9SMV>)cm_P?OcLd7&#Yc4=> zbrI^POzXP{+`q|O-4HK#usq45bKu^XvE9f_j8tP#lWj*GHg3?iyrgzA+PgI@9Jt)U zS~hU*_EO%H5WtsE|0rr714KwW-lEsbJlHj(-3WzTI%vz*=(#unZHPd338gKHL&P4G zdwtjkJVKejRZG3un}-t4K>1>8#aBS|!MaTiIAOe>G;7R;+yJvX8A^xFe|)L&(^iPLMgAQh1McV6q=dV zBF5`qz*-~y`!^z_!zuqh?&}!4F>0Io##i)9R<_(DSv!kZJ7alD?;cSXGE#4=@z&cg zaEsKDjMPZ0o1U0H9(eAz4?0T*AIMYsV9GL2vv&4SS0Al0VPolowC-}&j?_OGOdYs2 zBN-1Fsj>amtJJ?;kJ)zCvaDBukteDDz@-GAuh}4qDV4XemO|afb zTC-P=^f*SjhmgTaJ8)}80$(k_+gJ}41*Xl|Ee7Iptu<;ky*z<&ly;2yioR`EG2PZ7 zgO2pul(SK<0@JI_sux%{81M{wwT)V~)0%VXm1)P6{|9~Bt_sL)$}!Jl)kkV7J=)HG zCAjJ^ZnFm*_7!~_M@rM?!AAN++Pq!w4Ifd9%-Kik9IUqtWR6rrtZV3fF162QRm`#G z>fLg%(hfXt(iWMK9gLauVy~KMWwWNm{Wa>ywPthWVmL6{>QNJQO+Ms(`v5!dV69n1 zP5wwa)?VCZCB6g1i|a|^We++SV+GS+sm-{qP~!%LhfS!5C8d>}Gg~jH(NH1>E>E!e zMA8m6et$w0zDV6non^GYV$gKb_cyrT0wXUc^C4Tgl_m z&6I^7U<*86DTRz!z~K}||cY0SiQ%2d`-+Ak~RFm|Nvy7jlPBS|TTu#<16h9x@9 zV)85k?_^ms^oZ8zP$}(r(#de@!l0wW_C3+dfBde=#~KSQ7Dbhi;AH66uUs9Hsv5<9uXe8Z!tFW2cLB%M~vJCW`h zQn}Q)RFBJ0FwihWh6n4~MzBU-XXa|~$xM!=cZZR#9%W#y3ezfqlLl@nGXpw6T0K_# zWY-x*tH*e)wrJg!cssTuf}BIk$8w3ORI$eFc~G&k9=Bj1B_*yP_H|;#eJ(9ev|3a? zHX(JieW{l!(e^4;ji}czTjo>f6yHA)Us$)ULAPJplA&APqW4JCn@(D1##?GP^CBbA zLwn?H+I=hTV(x9UWi0JG3Jujk>ka2yG@C0=b2*q>%VG)oby5FM+>bQipTPn0>+=?gVajl5#P!s{4qQ>v87g zXjb&mxTZple}j3M!0KP2GOP^n^SkO$6rhi*L#^S~`?%i6zXOxCm3dE$RqM%36yQD&NYtD%I60)!N3*&O?nisl%*Y7zADkZ2W=VeyMh0 z@OKdHdzdSjv^E}652+mMAxw;Nz)mlKeP6)+53U!`p}olU0wz;q2>T9LZ7h3$tc^<; zqjM;G6!h;n!nU%)E+^z1m4}J>9Af9_>m1r_p$@r>86HEwZ&AmQs|f!zd`09P#k`!W z&VaKkR40>0t~6>Gqw&}xLdP=7N8mpUmt14WJsFH5?#YxthMoB^T*qnUc^rIg!6=x?o4+kaGlS3yuiDr1#h&DZq8x%{F>Ts z-Rr#NusN$@+g9&7Q-ZfyGlHkF!oT5sQ+>n9rZuM$a-^N-9&5F$g|=L2)C?T=&zyUmKHa~))-G$Ob+P&#J$p{&*bi90vA)E;JeXtqBXXwNYJKdre&6;VZoO!& zu?B0+G4>7W_Q36d-&(J$A@+05jn;FHU+!Rel1Jyjy)k3E9f-IQL*-YUd*Lom9JHlp zSm)CBGm)>X_=-6jtYrh|F4Ml(nPDxl=Gj}+eESs(?W%o-vn6;!a7!=?%2;66jP`5J zB757QbGFTqdD-Ud3gp}0vvvh;v>vt!f(9b;>`dk*2G(x_i_f7(nZ2R*P#{8j5(3X1 zc$CtuGn`X{!@2KuPIIKSn~^@O!hHKUYZdh#Y4xg1`(Z1>z0KL?I6BSGfr4kKd6D}= zcd|W_)^Br;3Cisqqi8?Etfx3ws^&U#h-mbrLXWxILy zX-qaZesJ!d+QKIxN-?}I8O?8L$u637n zci>*@9&DAkl39;3Wv(Dgb^ z&(srMAMSO=*fPQoT5{#lw;cOTb+7duXRIwFy}`Q2y3e`cf84ic)z1RkoDt4SuJ^4e z_7o4gLu$M|8CdJ3t=k+ID0&mq!2^#}K4z8D)*lYqw;X!)V<7Kd=WL|#BcU88TV0s! zw^>;4bHw3rJIp?#oKviydHug2Fg!RIG#t1!H(EEiwr#n|P;y})TdlOh%v_(dmgg0$ zcC!bxeMR4fFb;pvZ62&O5%&pp#6MWSw{p>gNbhpgPplP=*{N={euQN1F=tZn&|ojp z%c=HMTVP?Z(hl6WS7^<>tW%f0=?3@lz#{9k;N{S$A6kzG&In8jPNI%pYf|t@o{u?y zu$CizklH@9HbK=6zVi;&ntPpBfpasGE8WG`o7Q1mA6j=?S$5b8b3kRWD|^s%4yfco zC*{2GC^%dFF#?606i(u0LoP@Tl_lMB)5 z3_fn(ttjM^@EN_zFmZrFW=6!UUQzeZW^?_KLJTij%dYS zunLf{+-M2a&>0wMSD-($AZFG%PkXp_sr9ULO5oeT=5Y0jmFEn1o^jSY2cnl;AWNXd zA?@|7kUv?^5%Qe#nDd#nLEYfq5C~G*_10hA&VcK@VvRS6q+se9I>q{q^>cK0Q8mFXhCf}(bp!{fmZ3lSr!^0K=3lHEoeXQZ zGat=nhV`B`LGR?(TWP_G_5%A>TH32#a?DQtH0c~hZgeoie#w#@{}4L>A35Lt06wo* z*C;!FKDG;z?nXlRyr)`3yCy=_UT-b;#zl5=F%Oi>pgY0 zQ*2Fz9|KNk%P6?SC`Z$z)wiKhC{mzk(;IcrcbtjV2GNicwuqL`G@aV^=jZj#LR!4%jJC9mL&ik}|j{O}q z!EIBCw*NKox4_!Ks~nC?fd)%)-k~?QIiFkkjz|*TqxNDwu8g-@Yn|+V%Zloj-y4uU zGG>({TR>{cSj%{eWr^d|Sq+r3o;use|Hr^xffVaB^|;kU+w<)Z>3$ek?wqEUJ9pww zagIiIxGAEdCuY?zFwbn3Nn}N;>=gvR{<;b|U zy7|Z;ZgZ}8Wn5*RD^;bM#k&`2glXNktV#~sZH2$rl$3pvn`?h$jb*g>Ou70tko!IK zzWMeLcRKkL?a8-?;m2ymx)SNb$IM=$b(bQ=`PBJ7N2yAJHzTpGaKC}1GJz(n{_qTBj0fUW?gOl*?p9if3W(O^(9jI_uUVy6RmMbZXQ>) z*2mUv^$qJYXOD92neGhtr&g9b)m^8~2n+|NURT#LX2%C*Ue*Lh=sCR4YPZtdL)_KD zgBi15P@_QD!r&anY_8Q~4Yg7^rkNQ$I{07K*Hx#RVQ+L()gRomtS&4OirrQ<&YrFc z?XMvRin`}ncRA-*==-?r{kd)+>FkNZPp@w2SmZh7Dz*lw&= zk616NA0e&$mnwIz1Hww366=>7O8uSlt-ybwjagxRqE2ugRClX;)a}*}tXkxHb&CJi zp?<7lSlN7roaz=NH(#g|tQVXVtJ>MAc38hd>wAbgG4P4C5y|}*)*egQk0JLzO#M_f zTZgL_YrQ%xFx$EnD~yXcCVGmx#mREcbw(g%8?VlB##P{?+47=f366MRo$6Ext?|3bXIYj>sePW-zV=L zw+CCHP`|L`_-EoV(}UB4iJ0-h!#&^ENO68V)tk<9?(?3HGqb^ex|h0_xLJ^ad%ydr`(N%a+#kF5 zxIb}!>h5JMb~!mot+>|>xwpIDcfUv2cK2uQL+*p_A;F4ZdGL*-RBt-Tqw>}5-Qb#W z4C!}^+rsx20&crICRpy8YZdPUmoqFlG-)OdoVI^#)gUD=qr4B@C2o~>)wucYF>aZg z;=bo>4qoA&=T>uf2hVY@;F4!GzH!)^jRbz=+TdO7^yO({%cyB{aC7iP_e6J7a1-x0 z+@|1l?re9Vcb({d;haNQ6QxS{Ir^5+Pu-2A|HAnjdB1RsE7z4PUAO;lxW;Lpge|7+ z|8W1|O6u9c*}-17*FA$)ynz2r=M48WcMD}tcaIAm7hI~Z(}Sl6#{^da_2ya?Jls8; zzNX+`)o)}g@r}Tmu6B@dON{Oj{qiNkzeUb>oRRy)Uf^En)(t528qdFVK=_+ZSHJw9 zxF72jv3=4d>K$`{xJ0Ui>(m3LUl8nw$Da~!%d&V_q8xG61q8i@FGOsVArdt zH2%&d3We9a>vhz0=6Z$g;-C8ZgL)Iiw152z;_`100PkW1^KV)r3K!F!Cou;Qvw)BF z^&y+d9&RyrmTww-f~N0N6tly7mzXE-;KJ%rUyfxiqXZg?qCaTu zL|yVW*Gu|JWy?&pzF;f*QY%q*p-9<9TSV0($|t!VKpku@Y2yehaUIIWAX~$57_A}J zUm+9Z`is7NU*aulu7TI6c&>pl^3{gFVthTOUkYJ`59b=kR)>W+%Am2dPYjD+M#1zB z*AcMhW-KSLAsUxF#q8k$*xpI{nv5`HvUL=fu+&pgs-;_L-X$%0PhTeYG;3N?ITAMA z^Jk(`n#q-I4da@nFEJkxBNj1InHRt2qvW2CD*hO*C0u!2qS%V)Yc~c~axLOoX#GW- zREklhT%y2wNQqkO0buj@T%yzz$b6RTDJ}z>f57N{`k= z%fFt3?4P3htd)N-9$8#7tQ>s}v*yrh6?yQ&Kfz(4EQ*A)5URlm? zOTGnVLrI5J9$masKnsvMa@>d!BROSw^JRh5<5!YsG0b2O#a0JUHBpebhv@2*y7^=l z2Vvj!-cK<`HvVNCa+d}@=K1qI|53FB@|#%8QR2%3sU^~y1_C4#ty0wpf#lcT#=j7+ zZRu*%Y?}|XG^`VMf&3pV0mq-mvF!vOFRLxfB$_&H7MII!@gx$=K6#PpjSX$Q2DMeXU zavc3Ej-Zpq)fKDA7gF*^^k!=yHSL#P$s6ie+DCG9y_QV;-uK=>CFMqbL0a@;k;ix+ z)Hp#W(e)7bio|`wTuIyluRO1=i?$K>sft|3`=!v;6HUfn_H9QcQy3`itLQ5Z9Mf0S zx3sUMuM*|^1AXVSza4K~i*UER?>P0|-raq3!JY3|OYCaIV|UpP+t1s>0>?V5149E- zoC4<&dvjnVLi^_eo9x@|JM16XM+7DXZ&7u)ta3oatQXeABtb zxy|{W^8@Ej=cmp;oPRqXI3GKoI$t_dApPdK3*1t-5;kO;dnY9SFCpgt?!M=K z=^Hc9nMS6Q}!#)9w*Z+gc-XQ zlKW=DbARgw|4(t(9#>P=_rG;IyK)dIk(2qENtkozshP>9@PTtWyL?{}TO&vB+_p67X==l$bdK0oWX*Z2GTt;^nf z?X}k4XQl4MWrmCDtLj{}T6K?0%th+b>b{(ALpsV0AilNGNM)r8QYF4Ps4cBhuTdXX zKTtnbKU2RT|1ghks-30Q(i!y|wS!bka+C_ybvgMfE!CHtBv0;Sa7I!INeE>cIyPpT%>;AA0^Q_P0aOv!`8^ls8vX^a#qg-PS3pQU(doYYI| zErs*-W`s0>6WfVWlC)0xf)lb0QmT|7ZIaTYt%cR%ROQ}$LCB2o3rKi#}>7Ddm`oMiL#7(te3QW&Z@oW{(*i!5S4S(8RemL;6 zwX$4baON`Rx1#HYB>#C1_WZx~Wq05sg^mehr;QxXTYNHyx3?P2zbsE)TC0Md?0!3{ zxLc{P8&JHa8}!MY)uH40=%MB4MqSXnMmMYPMg|E!?vCuFPbm1@wp1BDM-mfMn$27j z7h@0kKcW05!C?8H82mqQ$8=Sxty%R{Uv{!Xx${O>PUCnS=_ntEbyu-d=B6-wu8Z?B zp{JGMxR-MLb#M9DUq066EEhd9&n$b=0_s$?Su0c;OHFBZ+f<}slfp1+B4;zdsx(V1 zgwN|*{&?O`z7CAzDlxVa*Mqq{X6Nt9PF;*U%w-s}8%`NP8A%yM38svuh@eDVc;fG; zDIt_`lu$|-WjrOEGJ!IY@-@qxxKgEAXyN3^4FM=31a)UgIfSgq*pu>zE!2diE@GM& zIXn3vo5AbTPP7sq(|K)WyB^$frmZh|#K-Y*@`vF;$B`I)h+xCfRSNyoV%(BqVW}=< z=iubzV%ojo+(v-MIYWV2jDPOW$2IlR#EN-5ld%KiP8{RCB{y_1 z$F}5Lq5UeR|3=wKX-=Ly}N>diwOD z|8SP=59$M{Z=t_ow4X@59@8H2&JHBE52ZSfRg9g7u=cA}ngdqt>WH&y!HrvZ*7*}_ zq0gfJSka@XThOBz+{~sfndu$aa)LjH>0K3lF7+OY{yp_SSqotsO?`WPnIA(vrLL_1 zK;2s@!;jQQD*4W%{zTE|Qy*4U=Kn<9Px1dV^=^tDOZ`hlUqJnpx6EHi{b>tXUqtatGoD+^n0Cc*!bDYhI;8jn+`?BMwk#~b+HM#^(T-R0v{9=G8A zXT&#A@iRN#%zNnYdX=V?VKX#K7J%FSsd?LRCqf!o@}C_3Ij+^Es5E*m)c@bYzw7Sh zS<u1XGTc6t_o79@oaB5rYK@Ohv z*3E3Y|8&9BXzOt0ctP7wy9CRd5{r^qDI!MkQEyknuX`AZ8#v-ZUsvQde}!S!^k|#F zompZ#V0h0zvG>MC>im%=Vyjq**Nq11pM5$YU@ z^V7Xxd)gJ9dhEilqkQ20C=h#Gzrnpfj-y?~bG&I~jfK5_!26I#aNZgSo5AzZltc80 z;!Y^o7=oJn&cmy48SbQ1$B>`}u&H_*2EW*^ZzNqB*0Q#_F5Nny zT<~w$keiLof$cFi=p0JbPr`2r>5$gFz@RBJu;y?Sg4#yohp)fImU#m({>py1uN#iS zgQqcn<}=hg6pVmV9dRnh3-yyP;&9M>*q`Kf-t`<{-)T8A`)A_BQ9t-^TfnL4OI+%( z2@Sg5!-wCwNzs8~)QCHS@N-X5!TS{+Ki6UVgCjUzR3D4faX2)=8;xzZL(}mkqV0dd z#+ngmykjLgFXV4=Jer_%Kqw}zk44A>XEZy#1m9Kc2JLsZQFt>3`Eg5e`~GYsG+T=3 zCm{$7^upc`Wzl6>I)anNVZy}rm_OJ9D;+bi@18B@H>-;`lUnf$y=o{^+5(^3j7FoU z{m^+sEG9j$#Qw{5@MhXNgmsySl@*`ir?_=UU+@|idiTWnQZG<5-V?7rpN?(AM8#W(0a;SxH26$Xv%A-KI71BX$+!_|5P23viJ z^fuS5*IwI)wUL23vjdH&Gaq)!}x_;w|KX$&x zwOV^o%3%Xy>NUZLsL8Nx^AOrB0j<)lQM#rhvX2bJtA$*S-}E`UpIVFcEzjb9iWfF6j6-hw(Qq1m1C!@H z!{{G-q4-)$Y+khyHyxYtxw;Ca-(STD|513N-h~Duo1$-@gXsLRHO9W(jc*RTMEylK zv5~$0sClnpb=nc{YDvhsTOIATC!ufEpW$`Z7Tw!FM1=!M@T|Q91skfM$H-({JhT=X zA3F^E_AF|@os5Vdt+=PtL>yb!n`=F{@$3%{ExPf2@YP+|FlrAbpXX}>%j($r+#T~0 zxM;g+3g&jXiZ_E3aZFc;)Pg3+eY^}lgZ3foMkr#BJHzeTPOPchnxna8*wlLwcJ{SG z1NU@%uA7dl*6T5OLs>-hUxkYHZn(b79q;aaK+Ls25p&=J?oJ*DDWw?Rx^T=1bHs=5 zKcc?3HG+aY;Z}Jr{P#cN{j>!?hlXKsa4R%BI1sb1bV1Xb6>;3X1L_8~z{&7)XnHyW z2giNjw9jo){{^LZvJgau-7 z)4Q0{I0eJ< zNPpWN<*%N`v;$dKe(ex8R@#qKt7pPy>>xA_sKkZk0L*YGz%A>!aL|mv6776^f8YkL zesDub-JOVtX%6+vKe7AZuNXbH2fDc>qetcdxEJlil>zZ6JiZuZ{O6-)>vc%#8wdxV zt9U2Zz3b|H$&Nunxhzv{Y=#jEEZ2Zf;Cbb=zUv2 zx*mbNj%U!l!8=?&bprV>wTK*XgG0+~$d1rxf24u z3B<+yuMoEI7*ZP#Mp?fnsOH@sL7Cs9!H0)zkZ>7(Lc(V!w$PMyrXfDWKf$7jglv-@#Q1^l>YH!_zNqgk>mo`)Sl+)*!N zC-*^m@(!FoQx^6y?ik;Gix6$F08m&@<{7vc1b8cS0AqSIfng%B$egs1y3Xyn>vm@%Z&CJ$lT2$KO^I zLFkiP-5>V1Y&50;~6nIt55Zbix!{$UAq7mVCifEm&25&gwd zyuIKBmxbFAF{>Nm&%3~PC10X-4#2HRtr5&Q>YpoaV#uXHLcPwG?zyk3ol(Y2xF z26g?zY~bQH7p*!+A?D6~-23$sy1w_t$3A>zWp@fk`~QHrcMb8|p`)-ndLGvXY)0p! zb1|pGFu2TZgGS%Qp&4>RwlPS~yo-C+B9PhoFzOXP!kb`T z0}Bsgpm1!?NiGAq$w#?p!?zFV zB7O($9TEFNTgcc(Sa5C}`LA+@xHf$B1SK^a=Cb zsh~%QW-)QtL)Lqjl6cM${IX6Cft6InqWZ}D zAB+8vbNGVOxF@ouVr`g{QXdl_CtO$3a~a>D+@$1DZc%Pi?ojShM7T$}&qd6$e922{c=vMO=kt?6jhW8CqJ;SATM#@7VLir&g4Y z4Q2Z)o+0qtyf#EIAtda6MVu5XA3ye z`BUBo>jD8=(OP$z@F6Y+ieR#iXR4)|aI%08w~%2`FN3vSz!Kps0rOK*LomVl0=6bx zB;Z2jIyY4;_KE^0QZd0M>kI+g(E5ac9Sl!J=4;G5Pr$Z>3j`d(eo_Pz9Gy+L6ybO( zc5Tegx}oH00@e`L3%Hee_hLBNMmXObHZ_Ybht^yT(8dZS#u?gQsHhB{GpN}y$q-By zS%O%G7I{LsMvKQLi|DJgV3Hx2Dv)NLDz}-QZNXH2;ib)HZ22eq?7LKW_IV)`h@`U2 zLU)b+`YU&(!JmNRnQCcAI9b5Gm5y3Cb`dq!3%DHNETQc1h4wlXm4)aG^QnnUiv;A> znm6oqBNR)`vOLWasn`|ssU(8w6lVz7p703)U-gk;QyudJT!Cgewt_rDE6A zyzdpwkSyTJgfj%(&8(FS)>#5}BAh4SeagKkdOQPMWQ3z{n!%>lNMx$PI!(Y;eC5_K zS)VY%+2*k61QsyWxe5=(s8dKaiswI^<~)T}ov0AOTE>UI2vjNJY?Ea#eAQ4yurB!U zq!Z|EVezTcbtX_#5f{d(RSlkuu1uZtzu~b#Z?Ryt=%F^H4y7(7O1bI{O(Y7I_rGFA z-&ScFl=RixS1y_GRfgx%W~zK#m(?ZTNqqYxg22_pOMk-i1unjc5<#4g5_s$#o-ZTL zV#{YcgQ=GMqDz}eMZWp-1W|nCC4z}qB#8BR)kNPVEZ#1OAomS=-a1Sbw^tftC!?`^ zRp_~agdD^@FRb_Z%Ez{hENo`;)?uopE1m1^5gy%IhOLcoJX0;}6HXTJ4i4KzFu{5O zHz1rP;44*RSk9cz^9AfixJbYOigWpbCLDX8a6`h0Lb2fUHk}IZ(V1*>YW9uT2JVUs zq;GzQr@d~Xhgo&CV*C6=0fQ^L&@5fndCQcaW$LGd8$sYr9i{D4n; z$wbMc=G=nGUW)KbM#DFKqPkQmEOB%`S>o?Av{IxsWAUY*2qspVV71|4TS_~MH>L2j z%#yET`pOn8A0oaKEk%_3%cC-jhjNa(hh(+qVFxqTfRe0a!4meukI~mCrCg>Qv;Gy! za6&~Li~beMRIbEFf0JWK$sAAoE0!t80ZA=)fKNcbm&t|Sx* zLaahCoCLF4bR!}032%u^UtXzHREFnhhDiFH*a@Mm?#N5jgyo5(FNhTgrK%Sng(fWe zDUmBXY(?utWC-0!&L~l>U@C(kB)%ZQ%bZ}=#9xtcLJ%C4LK-}nHL)NR2!e}3FxEoO zke?ir5dV^d03SKYSPSDx5(GU7c0(0{siCu(YT1WyzJS9W|7x$*6)JEnl`2NqU~N`| zzO>H}1g=&af}sXxCrVsqd4e!h`xk<#kpv<76$#`1Lip6o{YXd?gzC!hOwJ_bUoz3rXaVh5;;UaU` zWF7m4)&pprNX0J4d^{|yGmP*FDyuDwxWU}4jR!Je5M?lB2qnY(b~C$JO7c!BJi{en z<}Z*whEjqQe+5dVjXdL}Q<7)Nc}h`{O5-+}hEpitQbhQU@l;9#C6Y3YGMzGmHNXD$ MZwy2?_4fw<1J(#bBLDyZ diff --git a/apps/web/core/services/issue/issue.service.ts b/apps/web/core/services/issue/issue.service.ts index 886e62c338..cae879ff64 100644 --- a/apps/web/core/services/issue/issue.service.ts +++ b/apps/web/core/services/issue/issue.service.ts @@ -12,7 +12,6 @@ import type { TIssuesResponse, TIssueSubIssues, } from "@plane/types"; -import { getIssuesShouldFallbackToServer } from "@plane/utils"; // services import { APIService } from "@/services/api.service"; @@ -78,12 +77,7 @@ export class IssueService extends APIService { queries?: Partial>, config = {} ): Promise { - if (getIssuesShouldFallbackToServer(queries) || this.serviceType !== EIssueServiceType.ISSUES) { - return await this.getIssuesFromServer(workspaceSlug, projectId, queries, config); - } - const { persistence } = await import("@/local-db/storage.sqlite"); - const response = await persistence.getIssues(workspaceSlug, projectId, queries, config); - return response as TIssuesResponse; + return this.getIssuesFromServer(workspaceSlug, projectId, queries, config); } async getDeletedIssues(workspaceSlug: string, projectId: string, queries?: any): Promise { @@ -115,11 +109,6 @@ export class IssueService extends APIService { params: queries, }) .then(async (response) => { - // skip issue update when the service type is epic - if (response.data && this.serviceType === EIssueServiceType.ISSUES) { - const { updateIssue } = await import("@/local-db/utils/load-issues"); - updateIssue({ ...response.data, is_local_update: 1 }); - } // add is_epic flag when the service type is epic if (response.data && this.serviceType === EIssueServiceType.EPICS) { response.data.is_epic = true; @@ -135,13 +124,7 @@ export class IssueService extends APIService { return this.get(`/api/workspaces/${workspaceSlug}/projects/${projectId}/${this.serviceType}/list/`, { params: { issues: issueIds.join(",") }, }) - .then(async (response) => { - if (response?.data && Array.isArray(response?.data) && this.serviceType === EIssueServiceType.ISSUES) { - const { addIssuesBulk } = await import("@/local-db/utils/load-issues"); - addIssuesBulk(response.data); - } - return response?.data; - }) + .then(async (response) => response?.data) .catch((error) => { throw error?.response?.data; }); @@ -243,10 +226,6 @@ export class IssueService extends APIService { } async deleteIssue(workspaceSlug: string, projectId: string, issuesId: string): Promise { - if (this.serviceType === EIssueServiceType.ISSUES) { - const { deleteIssueFromLocal } = await import("@/local-db/utils/load-issues"); - deleteIssueFromLocal(issuesId); - } return this.delete(`/api/workspaces/${workspaceSlug}/projects/${projectId}/${this.serviceType}/${issuesId}/`) .then((response) => response?.data) .catch((error) => { @@ -353,13 +332,7 @@ export class IssueService extends APIService { async bulkOperations(workspaceSlug: string, projectId: string, data: TBulkOperationsPayload): Promise { return this.post(`/api/workspaces/${workspaceSlug}/projects/${projectId}/bulk-operation-issues/`, data) - .then(async (response) => { - if (this.serviceType === EIssueServiceType.ISSUES) { - const { persistence } = await import("@/local-db/storage.sqlite"); - persistence.syncIssues(projectId); - } - return response?.data; - }) + .then(async (response) => response?.data) .catch((error) => { throw error?.response?.data; }); @@ -373,13 +346,7 @@ export class IssueService extends APIService { } ): Promise { return this.delete(`/api/workspaces/${workspaceSlug}/projects/${projectId}/bulk-delete-issues/`, data) - .then(async (response) => { - if (this.serviceType === EIssueServiceType.ISSUES) { - const { persistence } = await import("@/local-db/storage.sqlite"); - persistence.syncIssues(projectId); - } - return response?.data; - }) + .then(async (response) => response?.data) .catch((error) => { throw error?.response?.data; }); @@ -395,13 +362,7 @@ export class IssueService extends APIService { archived_at: string; }> { return this.post(`/api/workspaces/${workspaceSlug}/projects/${projectId}/bulk-archive-issues/`, data) - .then(async (response) => { - if (this.serviceType === EIssueServiceType.ISSUES) { - const { persistence } = await import("@/local-db/storage.sqlite"); - persistence.syncIssues(projectId); - } - return response?.data; - }) + .then(async (response) => response?.data) .catch((error) => { throw error?.response?.data; }); @@ -479,11 +440,6 @@ export class IssueService extends APIService { params: queries, }) .then(async (response) => { - // skip issue update when the service type is epic - if (response.data && this.serviceType === EIssueServiceType.ISSUES) { - const { updateIssue } = await import("@/local-db/utils/load-issues"); - updateIssue({ ...response.data, is_local_update: 1 }); - } // add is_epic flag when the service type is epic if (response.data && this.serviceType === EIssueServiceType.EPICS) { response.data.is_epic = true; diff --git a/apps/web/core/store/cycle.store.ts b/apps/web/core/store/cycle.store.ts index 3495834caa..e39ad44125 100644 --- a/apps/web/core/store/cycle.store.ts +++ b/apps/web/core/store/cycle.store.ts @@ -15,7 +15,6 @@ import type { DistributionUpdates } from "@plane/utils"; import { orderCycles, shouldFilterCycle, getDate, updateDistribution } from "@plane/utils"; // helpers // services -import { syncIssuesWithDeletedCycles } from "@/local-db/utils/load-workspace"; import { CycleService } from "@/services/cycle.service"; import { CycleArchiveService } from "@/services/cycle_archive.service"; import { IssueService } from "@/services/issue"; @@ -618,7 +617,6 @@ export class CycleStore implements ICycleStore { delete this.cycleMap[cycleId]; delete this.activeCycleIdMap[cycleId]; if (this.rootStore.favorite.entityMap[cycleId]) this.rootStore.favorite.removeFavoriteFromStore(cycleId); - syncIssuesWithDeletedCycles([cycleId]); }); }); diff --git a/apps/web/core/store/inbox/inbox-issue.store.ts b/apps/web/core/store/inbox/inbox-issue.store.ts index c555a09024..5c099a6688 100644 --- a/apps/web/core/store/inbox/inbox-issue.store.ts +++ b/apps/web/core/store/inbox/inbox-issue.store.ts @@ -9,8 +9,6 @@ import type { } from "@plane/types"; import { EInboxIssueStatus } from "@plane/types"; // helpers -// local db -import { addIssueToPersistanceLayer } from "@/local-db/utils/utils"; // services import { InboxIssueService } from "@/services/inbox"; import { IssueService } from "@/services/issue"; @@ -109,7 +107,6 @@ export class InboxIssueStore implements IInboxIssueStore { if (status === EInboxIssueStatus.ACCEPTED) { const updatedIssue = { ...this.issue, ...inboxIssue.issue }; this.store.issue.issues.addIssue([updatedIssue]); - await addIssueToPersistanceLayer(updatedIssue); } } catch { runInAction(() => set(this, "status", previousData.status)); diff --git a/apps/web/core/store/issue/cycle/filter.store.ts b/apps/web/core/store/issue/cycle/filter.store.ts index 27b8d176e6..c5234b9826 100644 --- a/apps/web/core/store/issue/cycle/filter.store.ts +++ b/apps/web/core/store/issue/cycle/filter.store.ts @@ -243,7 +243,7 @@ export class CycleIssuesFilter extends IssueFilterHelperStore implements ICycleI }); if (this.getShouldClearIssues(updatedDisplayFilters)) { - this.rootIssueStore.cycleIssues.clear(true, true); // clear issues for local store when some filters like layout changes + this.rootIssueStore.cycleIssues.clear(true); // clear issues for local store when some filters like layout changes } if (this.getShouldReFetchIssues(updatedDisplayFilters)) { diff --git a/apps/web/core/store/issue/cycle/issue.store.ts b/apps/web/core/store/issue/cycle/issue.store.ts index 0b739b4891..00f7309e4e 100644 --- a/apps/web/core/store/issue/cycle/issue.store.ts +++ b/apps/web/core/store/issue/cycle/issue.store.ts @@ -15,7 +15,6 @@ import type { import { getDistributionPathsPostUpdate } from "@plane/utils"; //local import { storage } from "@/lib/local-storage"; -import { persistence } from "@/local-db/storage.sqlite"; import type { IBaseIssuesStore } from "../helpers/base-issues.store"; import { BaseIssuesStore } from "../helpers/base-issues.store"; // @@ -190,8 +189,7 @@ export class CycleIssues extends BaseIssuesStore implements ICycleIssues { // set loader and clear store runInAction(() => { this.setLoader(loadType); - this.clear(!isExistingPaginationOptions, false); // clear while fetching from server. - if (!this.groupBy) this.clear(!isExistingPaginationOptions, true); // clear while using local to have the no load effect. + this.clear(!isExistingPaginationOptions); // clear while fetching from server. }); // get params from pagination options @@ -315,7 +313,6 @@ export class CycleIssues extends BaseIssuesStore implements ICycleIssues { ); // call fetch issues if (this.paginationOptions) { - await persistence.syncIssues(projectId.toString()); await this.fetchIssues(workspaceSlug, projectId, "mutation", this.paginationOptions, cycleId); } diff --git a/apps/web/core/store/issue/helpers/base-issues.store.ts b/apps/web/core/store/issue/helpers/base-issues.store.ts index f9e0f7207c..b0d6b3bf79 100644 --- a/apps/web/core/store/issue/helpers/base-issues.store.ts +++ b/apps/web/core/store/issue/helpers/base-issues.store.ts @@ -23,9 +23,7 @@ import type { import { EIssueServiceType, EIssueLayoutTypes } from "@plane/types"; // helpers import { convertToISODateString } from "@plane/utils"; -// local-db -import { SPECIAL_ORDER_BY } from "@/local-db/utils/query-constructor"; -import { updatePersistentLayer } from "@/local-db/utils/utils"; +// plane web imports import { workItemSortWithOrderByExtended } from "@/plane-web/store/issue/helpers/base-issue.store"; // services import { CycleService } from "@/services/cycle.service"; @@ -60,7 +58,7 @@ export interface IBaseIssuesStore { //actions removeIssue: (workspaceSlug: string, projectId: string, issueId: string) => Promise; - clear(shouldClearPaginationOptions?: boolean, clearForLocal?: boolean): void; + clear(shouldClearPaginationOptions?: boolean): void; // helper methods getIssueIds: (groupId?: string, subGroupId?: string) => string[] | undefined; issuesSortWithOrderBy(issueIds: string[], key: Partial): string[]; @@ -281,13 +279,7 @@ export abstract class BaseIssuesStore implements IBaseIssuesStore { const orderBy = displayFilters.order_by; // Temporary code to fix no load order by - if ( - this.rootIssueStore.rootStore.user.localDBEnabled && - this.rootIssueStore.rootStore.router.projectId && - layout !== EIssueLayoutTypes.SPREADSHEET && - orderBy && - Object.keys(SPECIAL_ORDER_BY).includes(orderBy) - ) { + if (this.rootIssueStore.rootStore.router.projectId && layout !== EIssueLayoutTypes.SPREADSHEET && orderBy) { return "sort_order"; } @@ -483,7 +475,7 @@ export abstract class BaseIssuesStore implements IBaseIssuesStore { // Update all the GroupIds to this Store's groupedIssueIds and update Individual group issue counts runInAction(() => { - this.clear(shouldClearPaginationOptions, true); + this.clear(shouldClearPaginationOptions); this.updateGroupedIssueIds(groupedIssues, groupedIssueCount); this.loader[getGroupKey()] = undefined; }); @@ -549,8 +541,6 @@ export abstract class BaseIssuesStore implements IBaseIssuesStore { // If shouldUpdateList is true, call fetchParentStats shouldUpdateList && (await this.fetchParentStats(workspaceSlug, projectId)); - updatePersistentLayer(response.id); - return response; } @@ -1162,22 +1152,17 @@ export abstract class BaseIssuesStore implements IBaseIssuesStore { /** * Method called to clear out the current store */ - clear(shouldClearPaginationOptions = true, clearForLocal = false) { - if ( - (this.rootIssueStore.rootStore.user?.localDBEnabled && clearForLocal) || - (!this.rootIssueStore.rootStore.user?.localDBEnabled && !clearForLocal) - ) { - runInAction(() => { - this.groupedIssueIds = undefined; - this.issuePaginationData = {}; - this.groupedIssueCount = {}; - if (shouldClearPaginationOptions) { - this.paginationOptions = undefined; - } - }); - this.controller.abort(); - this.controller = new AbortController(); - } + clear(shouldClearPaginationOptions = true) { + runInAction(() => { + this.groupedIssueIds = undefined; + this.issuePaginationData = {}; + this.groupedIssueCount = {}; + if (shouldClearPaginationOptions) { + this.paginationOptions = undefined; + } + }); + this.controller.abort(); + this.controller = new AbortController(); } /** diff --git a/apps/web/core/store/issue/issue-details/issue.store.ts b/apps/web/core/store/issue/issue-details/issue.store.ts index a5c7eb5174..3533038bac 100644 --- a/apps/web/core/store/issue/issue-details/issue.store.ts +++ b/apps/web/core/store/issue/issue-details/issue.store.ts @@ -3,8 +3,6 @@ import { computedFn } from "mobx-utils"; // types import type { TIssue, TIssueServiceType } from "@plane/types"; import { EIssueServiceType } from "@plane/types"; -// local -import { persistence } from "@/local-db/storage.sqlite"; // services import { IssueArchiveService, WorkspaceDraftService, IssueService } from "@/services/issue"; // types @@ -32,7 +30,6 @@ export interface IIssueStoreActions { export interface IIssueStore extends IIssueStoreActions { getIsFetchingIssueDetails: (issueId: string | undefined) => boolean; - getIsLocalDBIssueDescription: (issueId: string | undefined) => boolean; // helper methods getIssueById: (issueId: string) => TIssue | undefined; getIssueIdByIdentifier: (issueIdentifier: string) => string | undefined; @@ -40,7 +37,6 @@ export interface IIssueStore extends IIssueStoreActions { export class IssueStore implements IIssueStore { fetchingIssueDetails: string | undefined = undefined; - localDBIssueDescription: string | undefined = undefined; // root store rootIssueDetailStore: IIssueDetail; // services @@ -53,7 +49,6 @@ export class IssueStore implements IIssueStore { constructor(rootStore: IIssueDetail, serviceType: TIssueServiceType) { makeObservable(this, { fetchingIssueDetails: observable.ref, - localDBIssueDescription: observable.ref, }); // root store this.rootIssueDetailStore = rootStore; @@ -71,12 +66,6 @@ export class IssueStore implements IIssueStore { return this.fetchingIssueDetails === issueId; }); - getIsLocalDBIssueDescription = computedFn((issueId: string | undefined) => { - if (!issueId) return false; - - return this.localDBIssueDescription === issueId; - }); - // helper methods getIssueById = computedFn((issueId: string) => { if (!issueId) return undefined; @@ -94,26 +83,12 @@ export class IssueStore implements IIssueStore { expand: "issue_reactions,issue_attachments,issue_link,parent", }; - let issue: TIssue | undefined; - - // fetch issue from local db - if (this.serviceType === EIssueServiceType.ISSUES) { - issue = await persistence.getIssue(issueId); - } - this.fetchingIssueDetails = issueId; - - if (issue) { - this.addIssueToStore(issue); - this.localDBIssueDescription = issueId; - } - - issue = await this.issueService.retrieve(workspaceSlug, projectId, issueId, query); + const issue = await this.issueService.retrieve(workspaceSlug, projectId, issueId, query); if (!issue) throw new Error("Work item not found"); const issuePayload = this.addIssueToStore(issue); - this.localDBIssueDescription = undefined; this.rootIssueDetailStore.rootIssueStore.issues.addIssue([issuePayload]); diff --git a/apps/web/core/store/issue/issue-details/sub_issues.store.ts b/apps/web/core/store/issue/issue-details/sub_issues.store.ts index dd3aeaebff..18a833d19c 100644 --- a/apps/web/core/store/issue/issue-details/sub_issues.store.ts +++ b/apps/web/core/store/issue/issue-details/sub_issues.store.ts @@ -11,9 +11,7 @@ import type { TIssueServiceType, TLoader, } from "@plane/types"; -import { EIssueServiceType } from "@plane/types"; // services -import { updatePersistentLayer } from "@/local-db/utils/utils"; import { IssueService } from "@/services/issue"; // store import type { IIssueDetail } from "./root.store"; @@ -198,10 +196,6 @@ export class IssueSubIssuesStore implements IIssueSubIssuesStore { this.subIssues[parentIssueId].length ); - if (this.serviceType === EIssueServiceType.ISSUES) { - updatePersistentLayer([parentIssueId, ...issueIds]); - } - return; }; @@ -298,10 +292,6 @@ export class IssueSubIssuesStore implements IIssueSubIssuesStore { ); }); - if (this.serviceType === EIssueServiceType.ISSUES) { - updatePersistentLayer([parentIssueId]); - } - return; }; @@ -335,10 +325,6 @@ export class IssueSubIssuesStore implements IIssueSubIssuesStore { ); }); - if (this.serviceType === EIssueServiceType.ISSUES) { - updatePersistentLayer([parentIssueId]); - } - return; }; diff --git a/apps/web/core/store/issue/issue.store.ts b/apps/web/core/store/issue/issue.store.ts index d7cd0e6e71..8d6e9b7ab0 100644 --- a/apps/web/core/store/issue/issue.store.ts +++ b/apps/web/core/store/issue/issue.store.ts @@ -1,4 +1,4 @@ -import { clone, set, update } from "lodash-es"; +import { set, update } from "lodash-es"; import { action, makeObservable, observable, runInAction } from "mobx"; import { computedFn } from "mobx-utils"; // types @@ -7,8 +7,6 @@ import type { TIssue } from "@plane/types"; import { getCurrentDateTimeInISO } from "@plane/utils"; import { rootStore } from "@/lib/store-context"; // services -import { deleteIssueFromLocal } from "@/local-db/utils/load-issues"; -import { updatePersistentLayer } from "@/local-db/utils/utils"; import { IssueService } from "@/services/issue"; export type IIssueStore = { @@ -103,17 +101,12 @@ export class IssueStore implements IIssueStore { */ updateIssue = (issueId: string, issue: Partial) => { if (!issue || !issueId || !this.issuesMap[issueId]) return; - const issueBeforeUpdate = clone(this.issuesMap[issueId]); runInAction(() => { set(this.issuesMap, [issueId, "updated_at"], getCurrentDateTimeInISO()); Object.keys(issue).forEach((key) => { set(this.issuesMap, [issueId, key], issue[key as keyof TIssue]); }); }); - - if (!issueBeforeUpdate.is_epic) { - updatePersistentLayer(issueId); - } }; /** @@ -126,7 +119,6 @@ export class IssueStore implements IIssueStore { runInAction(() => { delete this.issuesMap[issueId]; }); - deleteIssueFromLocal(issueId); }; // helper methods diff --git a/apps/web/core/store/issue/module/filter.store.ts b/apps/web/core/store/issue/module/filter.store.ts index b82186fa11..42d18c8f51 100644 --- a/apps/web/core/store/issue/module/filter.store.ts +++ b/apps/web/core/store/issue/module/filter.store.ts @@ -248,7 +248,7 @@ export class ModuleIssuesFilter extends IssueFilterHelperStore implements IModul }); if (this.getShouldClearIssues(updatedDisplayFilters)) { - this.rootIssueStore.moduleIssues.clear(true, true); // clear issues for local store when some filters like layout changes + this.rootIssueStore.moduleIssues.clear(true); // clear issues for local store when some filters like layout changes } if (this.getShouldReFetchIssues(updatedDisplayFilters)) { diff --git a/apps/web/core/store/issue/module/issue.store.ts b/apps/web/core/store/issue/module/issue.store.ts index 8caf6b9af5..540d0aa940 100644 --- a/apps/web/core/store/issue/module/issue.store.ts +++ b/apps/web/core/store/issue/module/issue.store.ts @@ -137,8 +137,7 @@ export class ModuleIssues extends BaseIssuesStore implements IModuleIssues { // set loader and clear store runInAction(() => { this.setLoader(loadType); - this.clear(!isExistingPaginationOptions, false); // clear while fetching from server. - if (!this.groupBy) this.clear(!isExistingPaginationOptions, true); // clear while using local to have the no load effect. + this.clear(!isExistingPaginationOptions); // clear while fetching from server. }); // get params from pagination options diff --git a/apps/web/core/store/issue/project-views/filter.store.ts b/apps/web/core/store/issue/project-views/filter.store.ts index 08a1ea2194..ca7f9e6099 100644 --- a/apps/web/core/store/issue/project-views/filter.store.ts +++ b/apps/web/core/store/issue/project-views/filter.store.ts @@ -257,7 +257,7 @@ export class ProjectViewIssuesFilter extends IssueFilterHelperStore implements I }); if (this.getShouldClearIssues(updatedDisplayFilters)) { - this.rootIssueStore.projectIssues.clear(true, true); // clear issues for local store when some filters like layout changes + this.rootIssueStore.projectIssues.clear(true); // clear issues for local store when some filters like layout changes } if (this.getShouldReFetchIssues(updatedDisplayFilters)) { diff --git a/apps/web/core/store/issue/project-views/issue.store.ts b/apps/web/core/store/issue/project-views/issue.store.ts index d4e52df99c..2d80462645 100644 --- a/apps/web/core/store/issue/project-views/issue.store.ts +++ b/apps/web/core/store/issue/project-views/issue.store.ts @@ -94,8 +94,7 @@ export class ProjectViewIssues extends BaseIssuesStore implements IProjectViewIs // set loader and clear store runInAction(() => { this.setLoader(loadType); - this.clear(!isExistingPaginationOptions, false); // clear while fetching from server. - if (!this.groupBy) this.clear(!isExistingPaginationOptions, true); // clear while using local to have the no load effect. + this.clear(!isExistingPaginationOptions); // clear while fetching from server. }); // get params from pagination options diff --git a/apps/web/core/store/issue/project/filter.store.ts b/apps/web/core/store/issue/project/filter.store.ts index 9c1a662302..28af59adfd 100644 --- a/apps/web/core/store/issue/project/filter.store.ts +++ b/apps/web/core/store/issue/project/filter.store.ts @@ -231,7 +231,7 @@ export class ProjectIssuesFilter extends IssueFilterHelperStore implements IProj }); if (this.getShouldClearIssues(updatedDisplayFilters)) { - this.rootIssueStore.projectIssues.clear(true, true); // clear issues for local store when some filters like layout changes + this.rootIssueStore.projectIssues.clear(true); // clear issues for local store when some filters like layout changes } if (this.getShouldReFetchIssues(updatedDisplayFilters)) { diff --git a/apps/web/core/store/issue/project/issue.store.ts b/apps/web/core/store/issue/project/issue.store.ts index 78a4d6b1f1..a36a583915 100644 --- a/apps/web/core/store/issue/project/issue.store.ts +++ b/apps/web/core/store/issue/project/issue.store.ts @@ -102,8 +102,7 @@ export class ProjectIssues extends BaseIssuesStore implements IProjectIssues { // set loader and clear store runInAction(() => { this.setLoader(loadType); - this.clear(!isExistingPaginationOptions, false); // clear while fetching from server. - if (!this.groupBy) this.clear(!isExistingPaginationOptions, true); // clear while using local to have the no load effect. + this.clear(!isExistingPaginationOptions); // clear while fetching from server. }); // get params from pagination options diff --git a/apps/web/core/store/issue/workspace-draft/issue.store.ts b/apps/web/core/store/issue/workspace-draft/issue.store.ts index 38dfe6a5bc..4c8033f646 100644 --- a/apps/web/core/store/issue/workspace-draft/issue.store.ts +++ b/apps/web/core/store/issue/workspace-draft/issue.store.ts @@ -17,8 +17,6 @@ import type { TBulkOperationsPayload, } from "@plane/types"; import { getCurrentDateTimeInISO, convertToISODateString } from "@plane/utils"; -// local-db -import { addIssueToPersistanceLayer } from "@/local-db/utils/utils"; // services import workspaceDraftService from "@/services/issue/workspace_draft.service"; // types @@ -350,9 +348,6 @@ export class WorkspaceDraftIssues implements IWorkspaceDraftIssues { }); } - // sync issue to local db - addIssueToPersistanceLayer({ ...payload, ...response }); - // Update draft issue count in workspaceUserInfo this.updateWorkspaceUserDraftIssueCount(workspaceSlug, -1); }); diff --git a/apps/web/core/store/label.store.ts b/apps/web/core/store/label.store.ts index a6500442f9..635143d895 100644 --- a/apps/web/core/store/label.store.ts +++ b/apps/web/core/store/label.store.ts @@ -6,7 +6,6 @@ import type { IIssueLabel, IIssueLabelTree } from "@plane/types"; // helpers import { buildTree } from "@plane/utils"; // services -import { syncIssuesWithDeletedLabels } from "@/local-db/utils/load-workspace"; import { IssueLabelService } from "@/services/issue"; // store import type { CoreRootStore } from "./root.store"; @@ -299,7 +298,6 @@ export class LabelStore implements ILabelStore { runInAction(() => { delete this.labelMap[labelId]; }); - syncIssuesWithDeletedLabels([labelId]); }); }; } diff --git a/apps/web/core/store/module.store.ts b/apps/web/core/store/module.store.ts index 415cf4d5f5..568ad261b5 100644 --- a/apps/web/core/store/module.store.ts +++ b/apps/web/core/store/module.store.ts @@ -7,7 +7,6 @@ import type { DistributionUpdates } from "@plane/utils"; import { updateDistribution, orderModules, shouldFilterModule } from "@plane/utils"; // helpers // services -import { syncIssuesWithDeletedModules } from "@/local-db/utils/load-workspace"; import { ModuleService } from "@/services/module.service"; import { ModuleArchiveService } from "@/services/module_archive.service"; import { ProjectService } from "@/services/project"; @@ -453,7 +452,6 @@ export class ModulesStore implements IModuleStore { runInAction(() => { delete this.moduleMap[moduleId]; if (this.rootStore.favorite.entityMap[moduleId]) this.rootStore.favorite.removeFavoriteFromStore(moduleId); - syncIssuesWithDeletedModules([moduleId]); }); }); }; diff --git a/apps/web/core/store/state.store.ts b/apps/web/core/store/state.store.ts index d44e20e862..9085ab0d9a 100644 --- a/apps/web/core/store/state.store.ts +++ b/apps/web/core/store/state.store.ts @@ -7,7 +7,6 @@ import type { IState } from "@plane/types"; // helpers import { sortStates } from "@plane/utils"; // plane web -import { syncIssuesWithDeletedStates } from "@/local-db/utils/load-workspace"; import { ProjectStateService } from "@/plane-web/services/project/project-state.service"; import type { RootStore } from "@/plane-web/store/root.store"; @@ -248,7 +247,6 @@ export class StateStore implements IStateStore { await this.stateService.deleteState(workspaceSlug, projectId, stateId).then(() => { runInAction(() => { delete this.stateMap[stateId]; - syncIssuesWithDeletedStates([stateId]); }); }); }; diff --git a/apps/web/core/store/user/index.ts b/apps/web/core/store/user/index.ts index cb62582881..1656b0d4ab 100644 --- a/apps/web/core/store/user/index.ts +++ b/apps/web/core/store/user/index.ts @@ -3,8 +3,6 @@ import { action, makeObservable, observable, runInAction, computed } from "mobx" // plane imports import { EUserPermissions, API_BASE_URL } from "@plane/constants"; import type { IUser, TUserPermissions } from "@plane/types"; -// local -import { persistence } from "@/local-db/storage.sqlite"; // plane web imports import type { RootStore } from "@/plane-web/store/root.store"; import type { IUserPermissionStore } from "@/plane-web/store/user/permission.store"; @@ -48,7 +46,6 @@ export interface IUserStore { reset: () => void; signOut: () => Promise; // computed - localDBEnabled: boolean; canPerformAnyCreateAction: boolean; projectsWithCreatePermissions: { [projectId: string]: number } | null; } @@ -99,8 +96,6 @@ export class UserStore implements IUserStore { // computed canPerformAnyCreateAction: computed, projectsWithCreatePermissions: computed, - - localDBEnabled: computed, }); } @@ -253,7 +248,6 @@ export class UserStore implements IUserStore { */ signOut = async (): Promise => { await this.authService.signOut(API_BASE_URL); - await persistence.clearStorage(true); this.store.resetOnSignOut(); }; @@ -296,8 +290,4 @@ export class UserStore implements IUserStore { const filteredProjects = this.fetchProjectsWithCreatePermissions(); return filteredProjects ? Object.keys(filteredProjects).length > 0 : false; } - - get localDBEnabled() { - return this.userSettings.canUseLocalDB; - } } diff --git a/apps/web/core/store/user/settings.store.ts b/apps/web/core/store/user/settings.store.ts index 1dceea1b10..ae89f03299 100644 --- a/apps/web/core/store/user/settings.store.ts +++ b/apps/web/core/store/user/settings.store.ts @@ -14,7 +14,6 @@ export interface IUserSettingsStore { isLoading: boolean; error: TError | undefined; data: IUserSettings; - canUseLocalDB: boolean; sidebarCollapsed: boolean; isScrolled: boolean; // actions @@ -42,7 +41,6 @@ export class UserSettingsStore implements IUserSettingsStore { invites: undefined, }, }; - canUseLocalDB: boolean = false; // services userService: UserService; @@ -52,7 +50,6 @@ export class UserSettingsStore implements IUserSettingsStore { isLoading: observable.ref, error: observable, data: observable, - canUseLocalDB: observable.ref, sidebarCollapsed: observable.ref, isScrolled: observable.ref, // actions diff --git a/packages/utils/src/work-item/base.ts b/packages/utils/src/work-item/base.ts index 8a746ec90b..d2ded2dfa8 100644 --- a/packages/utils/src/work-item/base.ts +++ b/packages/utils/src/work-item/base.ts @@ -266,7 +266,6 @@ export const getComputedDisplayFilters = ( defaultValues?: IIssueDisplayFilterOptions ): IIssueDisplayFilterOptions => { const filters = !isEmpty(displayFilters) ? displayFilters : defaultValues; - return { calendar: { show_weekends: filters?.calendar?.show_weekends || false, @@ -307,20 +306,6 @@ export const getComputedDisplayProperties = ( issue_type: displayProperties?.issue_type ?? true, }); -/** - * This is to check if the issues list api should fall back to server or use local db - * @param queries - * @returns - */ -export const getIssuesShouldFallbackToServer = (queries: any) => { - // If there is expand query and is not grouped then fallback to server - if (!isEmpty(queries.expand as string) && !queries.group_by) return true; - // If query has mentions then fallback to server - if (!isEmpty(queries.mentions)) return true; - - return false; -}; - export const generateWorkItemLink = ({ workspaceSlug, projectId, @@ -339,8 +324,8 @@ export const generateWorkItemLink = ({ isEpic?: boolean; }): string => { const archiveIssueLink = `/${workspaceSlug}/projects/${projectId}/archives/issues/${issueId}`; - const epicLink = `/${workspaceSlug}/projects/${projectId}/epics/${issueId}`; const workItemLink = `/${workspaceSlug}/browse/${projectIdentifier}-${sequenceId}/`; + const epicLink = workItemLink; return isArchived ? archiveIssueLink : isEpic ? epicLink : workItemLink; };